diff --git a/package.json b/package.json
index 2d49ab0da..b76620577 100644
--- a/package.json
+++ b/package.json
@@ -12,6 +12,7 @@
"dependencies": {
"@hookform/resolvers": "^4.0.0",
"@mdx-js/loader": "^3.1.0",
+ "@radix-ui/react-accordion": "^1.2.3",
"@mdx-js/react": "^3.1.0",
"@next/mdx": "^15.1.7",
"@radix-ui/react-navigation-menu": "^1.2.3",
diff --git a/public/static/images/partners/aws.svg b/public/static/images/partners/aws.svg
new file mode 100644
index 000000000..f6c9b36ec
--- /dev/null
+++ b/public/static/images/partners/aws.svg
@@ -0,0 +1,120 @@
+
+image/svg+xml
\ No newline at end of file
diff --git a/public/static/images/partners/google-cloud.svg b/public/static/images/partners/google-cloud.svg
new file mode 100644
index 000000000..ae6d94748
--- /dev/null
+++ b/public/static/images/partners/google-cloud.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/static/images/partners/shopify.svg b/public/static/images/partners/shopify.svg
new file mode 100644
index 000000000..b81e58f49
--- /dev/null
+++ b/public/static/images/partners/shopify.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/static/images/services/back-end/api-restful/api-hero.webp b/public/static/images/services/back-end/api-restful/api-hero.webp
new file mode 100644
index 000000000..08607afd2
Binary files /dev/null and b/public/static/images/services/back-end/api-restful/api-hero.webp differ
diff --git a/public/static/images/services/back-end/api-restful/api-robuste.webp b/public/static/images/services/back-end/api-restful/api-robuste.webp
new file mode 100644
index 000000000..028afd7a7
Binary files /dev/null and b/public/static/images/services/back-end/api-restful/api-robuste.webp differ
diff --git a/public/static/images/services/back-end/api-restful/excellence-api.webp b/public/static/images/services/back-end/api-restful/excellence-api.webp
new file mode 100644
index 000000000..dbb682021
Binary files /dev/null and b/public/static/images/services/back-end/api-restful/excellence-api.webp differ
diff --git a/public/static/images/services/back-end/api-restful/service-complementaire.webp b/public/static/images/services/back-end/api-restful/service-complementaire.webp
new file mode 100644
index 000000000..b7c87aae0
Binary files /dev/null and b/public/static/images/services/back-end/api-restful/service-complementaire.webp differ
diff --git a/public/static/images/services/back-end/back-expert.webp b/public/static/images/services/back-end/back-expert.webp
new file mode 100644
index 000000000..d28d35fac
Binary files /dev/null and b/public/static/images/services/back-end/back-expert.webp differ
diff --git "a/public/static/images/services/back-end/bases-de-donn\303\251es/database-hero.webp" "b/public/static/images/services/back-end/bases-de-donn\303\251es/database-hero.webp"
new file mode 100644
index 000000000..e7517d26e
Binary files /dev/null and "b/public/static/images/services/back-end/bases-de-donn\303\251es/database-hero.webp" differ
diff --git "a/public/static/images/services/back-end/bases-de-donn\303\251es/excellence-database.webp" "b/public/static/images/services/back-end/bases-de-donn\303\251es/excellence-database.webp"
new file mode 100644
index 000000000..7079ae969
Binary files /dev/null and "b/public/static/images/services/back-end/bases-de-donn\303\251es/excellence-database.webp" differ
diff --git "a/public/static/images/services/back-end/bases-de-donn\303\251es/service-complementaire.webp" "b/public/static/images/services/back-end/bases-de-donn\303\251es/service-complementaire.webp"
new file mode 100644
index 000000000..4e44fa37e
Binary files /dev/null and "b/public/static/images/services/back-end/bases-de-donn\303\251es/service-complementaire.webp" differ
diff --git "a/public/static/images/services/back-end/bases-de-donn\303\251es/solution-moderne.webp" "b/public/static/images/services/back-end/bases-de-donn\303\251es/solution-moderne.webp"
new file mode 100644
index 000000000..359ca6cbd
Binary files /dev/null and "b/public/static/images/services/back-end/bases-de-donn\303\251es/solution-moderne.webp" differ
diff --git a/public/static/images/services/back-end/bots/bot-intelligent.webp b/public/static/images/services/back-end/bots/bot-intelligent.webp
new file mode 100644
index 000000000..af031cb66
Binary files /dev/null and b/public/static/images/services/back-end/bots/bot-intelligent.webp differ
diff --git a/public/static/images/services/back-end/bots/bots-hero.webp b/public/static/images/services/back-end/bots/bots-hero.webp
new file mode 100644
index 000000000..7ee6e444e
Binary files /dev/null and b/public/static/images/services/back-end/bots/bots-hero.webp differ
diff --git a/public/static/images/services/back-end/bots/excellence-developpement.webp b/public/static/images/services/back-end/bots/excellence-developpement.webp
new file mode 100644
index 000000000..dfa76df70
Binary files /dev/null and b/public/static/images/services/back-end/bots/excellence-developpement.webp differ
diff --git a/public/static/images/services/back-end/bots/service-complementaire.webp b/public/static/images/services/back-end/bots/service-complementaire.webp
new file mode 100644
index 000000000..35be17eb1
Binary files /dev/null and b/public/static/images/services/back-end/bots/service-complementaire.webp differ
diff --git a/public/static/images/services/back-end/dev-back-hero.webp b/public/static/images/services/back-end/dev-back-hero.webp
new file mode 100644
index 000000000..1da473e3c
Binary files /dev/null and b/public/static/images/services/back-end/dev-back-hero.webp differ
diff --git a/public/static/images/services/back-end/microservices/architecture-hero.webp b/public/static/images/services/back-end/microservices/architecture-hero.webp
new file mode 100644
index 000000000..df3054fa2
Binary files /dev/null and b/public/static/images/services/back-end/microservices/architecture-hero.webp differ
diff --git a/public/static/images/services/back-end/microservices/excellence-microservice.webp b/public/static/images/services/back-end/microservices/excellence-microservice.webp
new file mode 100644
index 000000000..7af05eef7
Binary files /dev/null and b/public/static/images/services/back-end/microservices/excellence-microservice.webp differ
diff --git a/public/static/images/services/back-end/microservices/moderne-flexible.webp b/public/static/images/services/back-end/microservices/moderne-flexible.webp
new file mode 100644
index 000000000..74d5098d2
Binary files /dev/null and b/public/static/images/services/back-end/microservices/moderne-flexible.webp differ
diff --git a/public/static/images/services/back-end/microservices/service-complementaire.webp b/public/static/images/services/back-end/microservices/service-complementaire.webp
new file mode 100644
index 000000000..c9709d0dc
Binary files /dev/null and b/public/static/images/services/back-end/microservices/service-complementaire.webp differ
diff --git a/public/static/images/services/back-end/solutions-cloud/cloud-hero.webp b/public/static/images/services/back-end/solutions-cloud/cloud-hero.webp
new file mode 100644
index 000000000..619ee5aac
Binary files /dev/null and b/public/static/images/services/back-end/solutions-cloud/cloud-hero.webp differ
diff --git a/public/static/images/services/back-end/solutions-cloud/infrastructure-modern.webp b/public/static/images/services/back-end/solutions-cloud/infrastructure-modern.webp
new file mode 100644
index 000000000..bb917a30c
Binary files /dev/null and b/public/static/images/services/back-end/solutions-cloud/infrastructure-modern.webp differ
diff --git a/public/static/images/services/back-end/solutions-cloud/multi-cloud.webp b/public/static/images/services/back-end/solutions-cloud/multi-cloud.webp
new file mode 100644
index 000000000..244f6ea8b
Binary files /dev/null and b/public/static/images/services/back-end/solutions-cloud/multi-cloud.webp differ
diff --git a/public/static/images/services/back-end/solutions-cloud/service-complementaire.webp b/public/static/images/services/back-end/solutions-cloud/service-complementaire.webp
new file mode 100644
index 000000000..082421179
Binary files /dev/null and b/public/static/images/services/back-end/solutions-cloud/service-complementaire.webp differ
diff --git a/public/static/images/services/design/audit-ui/analyse-ui-ux.webp b/public/static/images/services/design/audit-ui/analyse-ui-ux.webp
new file mode 100644
index 000000000..e73b653f8
Binary files /dev/null and b/public/static/images/services/design/audit-ui/analyse-ui-ux.webp differ
diff --git a/public/static/images/services/design/audit-ui/audit-hero.webp b/public/static/images/services/design/audit-ui/audit-hero.webp
new file mode 100644
index 000000000..5367ce7f4
Binary files /dev/null and b/public/static/images/services/design/audit-ui/audit-hero.webp differ
diff --git a/public/static/images/services/design/audit-ui/optimisation-donnees.webp b/public/static/images/services/design/audit-ui/optimisation-donnees.webp
new file mode 100644
index 000000000..4b9ce1a7e
Binary files /dev/null and b/public/static/images/services/design/audit-ui/optimisation-donnees.webp differ
diff --git a/public/static/images/services/design/audit-ui/service-complementaire.webp b/public/static/images/services/design/audit-ui/service-complementaire.webp
new file mode 100644
index 000000000..0523e51df
Binary files /dev/null and b/public/static/images/services/design/audit-ui/service-complementaire.webp differ
diff --git a/public/static/images/services/design/charte-graphique/charte-graphique-hero.webp b/public/static/images/services/design/charte-graphique/charte-graphique-hero.webp
new file mode 100644
index 000000000..47b7c7045
Binary files /dev/null and b/public/static/images/services/design/charte-graphique/charte-graphique-hero.webp differ
diff --git a/public/static/images/services/design/charte-graphique/excellence-branding.webp b/public/static/images/services/design/charte-graphique/excellence-branding.webp
new file mode 100644
index 000000000..9699243e3
Binary files /dev/null and b/public/static/images/services/design/charte-graphique/excellence-branding.webp differ
diff --git a/public/static/images/services/design/charte-graphique/identite-distinctive.webp b/public/static/images/services/design/charte-graphique/identite-distinctive.webp
new file mode 100644
index 000000000..7f1da469d
Binary files /dev/null and b/public/static/images/services/design/charte-graphique/identite-distinctive.webp differ
diff --git a/public/static/images/services/design/charte-graphique/service-complementaire.webp b/public/static/images/services/design/charte-graphique/service-complementaire.webp
new file mode 100644
index 000000000..8b37bb190
Binary files /dev/null and b/public/static/images/services/design/charte-graphique/service-complementaire.webp differ
diff --git a/public/static/images/services/design/hero-design.webp b/public/static/images/services/design/hero-design.webp
new file mode 100644
index 000000000..8b60f1676
Binary files /dev/null and b/public/static/images/services/design/hero-design.webp differ
diff --git a/public/static/images/services/design/maquettage-ui/design-ui-professionnel.webp b/public/static/images/services/design/maquettage-ui/design-ui-professionnel.webp
new file mode 100644
index 000000000..29890d233
Binary files /dev/null and b/public/static/images/services/design/maquettage-ui/design-ui-professionnel.webp differ
diff --git a/public/static/images/services/design/maquettage-ui/excellence-design-ui.webp b/public/static/images/services/design/maquettage-ui/excellence-design-ui.webp
new file mode 100644
index 000000000..0438efbca
Binary files /dev/null and b/public/static/images/services/design/maquettage-ui/excellence-design-ui.webp differ
diff --git a/public/static/images/services/design/maquettage-ui/hero-ui.webp b/public/static/images/services/design/maquettage-ui/hero-ui.webp
new file mode 100644
index 000000000..8ed01e519
Binary files /dev/null and b/public/static/images/services/design/maquettage-ui/hero-ui.webp differ
diff --git a/public/static/images/services/design/moodboard/direction-artistique.webp b/public/static/images/services/design/moodboard/direction-artistique.webp
new file mode 100644
index 000000000..92d3c6c12
Binary files /dev/null and b/public/static/images/services/design/moodboard/direction-artistique.webp differ
diff --git a/public/static/images/services/design/moodboard/hero-moodboard.jpg b/public/static/images/services/design/moodboard/hero-moodboard.jpg
new file mode 100644
index 000000000..72e96da8a
Binary files /dev/null and b/public/static/images/services/design/moodboard/hero-moodboard.jpg differ
diff --git a/public/static/images/services/design/moodboard/services-supplementaires.webp b/public/static/images/services/design/moodboard/services-supplementaires.webp
new file mode 100644
index 000000000..828fc797d
Binary files /dev/null and b/public/static/images/services/design/moodboard/services-supplementaires.webp differ
diff --git a/public/static/images/services/design/moodboard/vision-claire.webp b/public/static/images/services/design/moodboard/vision-claire.webp
new file mode 100644
index 000000000..cff2d4d1a
Binary files /dev/null and b/public/static/images/services/design/moodboard/vision-claire.webp differ
diff --git a/public/static/images/services/design/showcase-design.webp b/public/static/images/services/design/showcase-design.webp
new file mode 100644
index 000000000..84da80a39
Binary files /dev/null and b/public/static/images/services/design/showcase-design.webp differ
diff --git a/public/static/images/services/design/wireframes/design-structure.webp b/public/static/images/services/design/wireframes/design-structure.webp
new file mode 100644
index 000000000..1b0965b10
Binary files /dev/null and b/public/static/images/services/design/wireframes/design-structure.webp differ
diff --git a/public/static/images/services/design/wireframes/excellence-conception-ux.webp b/public/static/images/services/design/wireframes/excellence-conception-ux.webp
new file mode 100644
index 000000000..b7a505c0c
Binary files /dev/null and b/public/static/images/services/design/wireframes/excellence-conception-ux.webp differ
diff --git a/public/static/images/services/design/wireframes/hero-wireframes.webp b/public/static/images/services/design/wireframes/hero-wireframes.webp
new file mode 100644
index 000000000..bff71ee6b
Binary files /dev/null and b/public/static/images/services/design/wireframes/hero-wireframes.webp differ
diff --git a/public/static/images/services/frontend/desktop/frontend-app.webp b/public/static/images/services/frontend/desktop/frontend-app.webp
new file mode 100644
index 000000000..2d2d04f7b
Binary files /dev/null and b/public/static/images/services/frontend/desktop/frontend-app.webp differ
diff --git a/public/static/images/services/frontend/desktop/frontend-complementaire.webp b/public/static/images/services/frontend/desktop/frontend-complementaire.webp
new file mode 100644
index 000000000..7d0744b12
Binary files /dev/null and b/public/static/images/services/frontend/desktop/frontend-complementaire.webp differ
diff --git a/public/static/images/services/frontend/desktop/frontend-developpement.webp b/public/static/images/services/frontend/desktop/frontend-developpement.webp
new file mode 100644
index 000000000..88cb3bfb4
Binary files /dev/null and b/public/static/images/services/frontend/desktop/frontend-developpement.webp differ
diff --git a/public/static/images/services/frontend/desktop/frontend-systeme.webp b/public/static/images/services/frontend/desktop/frontend-systeme.webp
new file mode 100644
index 000000000..fc9ee308e
Binary files /dev/null and b/public/static/images/services/frontend/desktop/frontend-systeme.webp differ
diff --git a/public/static/images/services/frontend/frontend-avantages.webp b/public/static/images/services/frontend/frontend-avantages.webp
new file mode 100644
index 000000000..e69e531a3
Binary files /dev/null and b/public/static/images/services/frontend/frontend-avantages.webp differ
diff --git a/public/static/images/services/frontend/frontend-developpement.webp b/public/static/images/services/frontend/frontend-developpement.webp
new file mode 100644
index 000000000..bce4cff3d
Binary files /dev/null and b/public/static/images/services/frontend/frontend-developpement.webp differ
diff --git a/public/static/images/services/frontend/frontend-expertise.webp b/public/static/images/services/frontend/frontend-expertise.webp
new file mode 100644
index 000000000..2e782294d
Binary files /dev/null and b/public/static/images/services/frontend/frontend-expertise.webp differ
diff --git a/public/static/images/services/frontend/mobile/frontend-complementaire.webp b/public/static/images/services/frontend/mobile/frontend-complementaire.webp
new file mode 100644
index 000000000..690b141eb
Binary files /dev/null and b/public/static/images/services/frontend/mobile/frontend-complementaire.webp differ
diff --git a/public/static/images/services/frontend/mobile/frontend-multiplatforme.webp b/public/static/images/services/frontend/mobile/frontend-multiplatforme.webp
new file mode 100644
index 000000000..152d2cd17
Binary files /dev/null and b/public/static/images/services/frontend/mobile/frontend-multiplatforme.webp differ
diff --git a/public/static/images/services/frontend/mobile/frontend-react.webp b/public/static/images/services/frontend/mobile/frontend-react.webp
new file mode 100644
index 000000000..73bdcfcc7
Binary files /dev/null and b/public/static/images/services/frontend/mobile/frontend-react.webp differ
diff --git a/public/static/images/services/frontend/mobile/frontend-ux.webp b/public/static/images/services/frontend/mobile/frontend-ux.webp
new file mode 100644
index 000000000..203c9fd8e
Binary files /dev/null and b/public/static/images/services/frontend/mobile/frontend-ux.webp differ
diff --git a/public/static/images/services/frontend/pwa/frontend-mobile.webp b/public/static/images/services/frontend/pwa/frontend-mobile.webp
new file mode 100644
index 000000000..577f9899d
Binary files /dev/null and b/public/static/images/services/frontend/pwa/frontend-mobile.webp differ
diff --git a/public/static/images/services/frontend/pwa/frontend-nowifi.webp b/public/static/images/services/frontend/pwa/frontend-nowifi.webp
new file mode 100644
index 000000000..4e4fefc6f
Binary files /dev/null and b/public/static/images/services/frontend/pwa/frontend-nowifi.webp differ
diff --git a/public/static/images/services/frontend/pwa/frontend-pwa.webp b/public/static/images/services/frontend/pwa/frontend-pwa.webp
new file mode 100644
index 000000000..1c464456b
Binary files /dev/null and b/public/static/images/services/frontend/pwa/frontend-pwa.webp differ
diff --git a/public/static/images/services/frontend/pwa/frontend-seo.webp b/public/static/images/services/frontend/pwa/frontend-seo.webp
new file mode 100644
index 000000000..8d7a783da
Binary files /dev/null and b/public/static/images/services/frontend/pwa/frontend-seo.webp differ
diff --git a/public/static/images/services/frontend/web/frontend-design.webp b/public/static/images/services/frontend/web/frontend-design.webp
new file mode 100644
index 000000000..1b64d9640
Binary files /dev/null and b/public/static/images/services/frontend/web/frontend-design.webp differ
diff --git a/public/static/images/services/frontend/web/frontend-techniques.webp b/public/static/images/services/frontend/web/frontend-techniques.webp
new file mode 100644
index 000000000..94937ebf5
Binary files /dev/null and b/public/static/images/services/frontend/web/frontend-techniques.webp differ
diff --git a/public/static/images/services/frontend/web/frontend-technologie.webp b/public/static/images/services/frontend/web/frontend-technologie.webp
new file mode 100644
index 000000000..3196d2cbb
Binary files /dev/null and b/public/static/images/services/frontend/web/frontend-technologie.webp differ
diff --git a/public/static/images/services/frontend/web/frontend-web.webp b/public/static/images/services/frontend/web/frontend-web.webp
new file mode 100644
index 000000000..663eca629
Binary files /dev/null and b/public/static/images/services/frontend/web/frontend-web.webp differ
diff --git a/public/static/images/services/integration/integration-ecommerce.webp b/public/static/images/services/integration/integration-ecommerce.webp
new file mode 100644
index 000000000..a0d9cebda
Binary files /dev/null and b/public/static/images/services/integration/integration-ecommerce.webp differ
diff --git a/public/static/images/services/integration/integration-team.webp b/public/static/images/services/integration/integration-team.webp
new file mode 100644
index 000000000..67ad8b9bc
Binary files /dev/null and b/public/static/images/services/integration/integration-team.webp differ
diff --git a/public/static/images/services/integration/prestashop-buy.webp b/public/static/images/services/integration/prestashop-buy.webp
new file mode 100644
index 000000000..3f34cb669
Binary files /dev/null and b/public/static/images/services/integration/prestashop-buy.webp differ
diff --git a/public/static/images/services/integration/prestashop-complementaire.webp b/public/static/images/services/integration/prestashop-complementaire.webp
new file mode 100644
index 000000000..773d84e64
Binary files /dev/null and b/public/static/images/services/integration/prestashop-complementaire.webp differ
diff --git a/public/static/images/services/integration/prestashop-control.webp b/public/static/images/services/integration/prestashop-control.webp
new file mode 100644
index 000000000..11fb0aabb
Binary files /dev/null and b/public/static/images/services/integration/prestashop-control.webp differ
diff --git a/public/static/images/services/integration/prestashop-shop.webp b/public/static/images/services/integration/prestashop-shop.webp
new file mode 100644
index 000000000..f06df0af4
Binary files /dev/null and b/public/static/images/services/integration/prestashop-shop.webp differ
diff --git a/public/static/images/services/integration/shopify-buy.webp b/public/static/images/services/integration/shopify-buy.webp
new file mode 100644
index 000000000..2a8ac464a
Binary files /dev/null and b/public/static/images/services/integration/shopify-buy.webp differ
diff --git a/public/static/images/services/integration/shopify-complementaire.webp b/public/static/images/services/integration/shopify-complementaire.webp
new file mode 100644
index 000000000..bdff8700e
Binary files /dev/null and b/public/static/images/services/integration/shopify-complementaire.webp differ
diff --git a/public/static/images/services/integration/shopify-mobile.webp b/public/static/images/services/integration/shopify-mobile.webp
new file mode 100644
index 000000000..bbc246f31
Binary files /dev/null and b/public/static/images/services/integration/shopify-mobile.webp differ
diff --git a/public/static/images/services/integration/squarespace-complementaire.webp b/public/static/images/services/integration/squarespace-complementaire.webp
new file mode 100644
index 000000000..58f4df8f7
Binary files /dev/null and b/public/static/images/services/integration/squarespace-complementaire.webp differ
diff --git a/public/static/images/services/integration/squarespace-design.webp b/public/static/images/services/integration/squarespace-design.webp
new file mode 100644
index 000000000..a060c692c
Binary files /dev/null and b/public/static/images/services/integration/squarespace-design.webp differ
diff --git a/public/static/images/services/integration/squarespace-marketing.webp b/public/static/images/services/integration/squarespace-marketing.webp
new file mode 100644
index 000000000..561fc09a7
Binary files /dev/null and b/public/static/images/services/integration/squarespace-marketing.webp differ
diff --git a/public/static/images/services/integration/squarespace.webp b/public/static/images/services/integration/squarespace.webp
new file mode 100644
index 000000000..29c622915
Binary files /dev/null and b/public/static/images/services/integration/squarespace.webp differ
diff --git a/public/static/images/services/integration/strapi-cms.webp b/public/static/images/services/integration/strapi-cms.webp
new file mode 100644
index 000000000..6e2b7b1b3
Binary files /dev/null and b/public/static/images/services/integration/strapi-cms.webp differ
diff --git a/public/static/images/services/integration/strapi-complementaire.webp b/public/static/images/services/integration/strapi-complementaire.webp
new file mode 100644
index 000000000..82ef694c5
Binary files /dev/null and b/public/static/images/services/integration/strapi-complementaire.webp differ
diff --git a/public/static/images/services/integration/strapi-security.webp b/public/static/images/services/integration/strapi-security.webp
new file mode 100644
index 000000000..fb8a90de2
Binary files /dev/null and b/public/static/images/services/integration/strapi-security.webp differ
diff --git a/public/static/images/services/integration/strapi.webp b/public/static/images/services/integration/strapi.webp
new file mode 100644
index 000000000..cabf3fd76
Binary files /dev/null and b/public/static/images/services/integration/strapi.webp differ
diff --git a/public/static/images/services/integration/webflow-complementaire.webp b/public/static/images/services/integration/webflow-complementaire.webp
new file mode 100644
index 000000000..dcd3e0309
Binary files /dev/null and b/public/static/images/services/integration/webflow-complementaire.webp differ
diff --git a/public/static/images/services/integration/webflow-nocode.webp b/public/static/images/services/integration/webflow-nocode.webp
new file mode 100644
index 000000000..7775be624
Binary files /dev/null and b/public/static/images/services/integration/webflow-nocode.webp differ
diff --git a/public/static/images/services/integration/webflow-responsive.webp b/public/static/images/services/integration/webflow-responsive.webp
new file mode 100644
index 000000000..5e69a46c4
Binary files /dev/null and b/public/static/images/services/integration/webflow-responsive.webp differ
diff --git a/public/static/images/services/integration/webflow.webp b/public/static/images/services/integration/webflow.webp
new file mode 100644
index 000000000..eeaafed51
Binary files /dev/null and b/public/static/images/services/integration/webflow.webp differ
diff --git a/public/static/images/services/integration/wordpress-complementaire.webp b/public/static/images/services/integration/wordpress-complementaire.webp
new file mode 100644
index 000000000..7d5d4fc7e
Binary files /dev/null and b/public/static/images/services/integration/wordpress-complementaire.webp differ
diff --git a/public/static/images/services/integration/wordpress-seo.webp b/public/static/images/services/integration/wordpress-seo.webp
new file mode 100644
index 000000000..bc052f0f6
Binary files /dev/null and b/public/static/images/services/integration/wordpress-seo.webp differ
diff --git a/public/static/images/services/integration/wordpress-solution.webp b/public/static/images/services/integration/wordpress-solution.webp
new file mode 100644
index 000000000..0da6c82a3
Binary files /dev/null and b/public/static/images/services/integration/wordpress-solution.webp differ
diff --git a/public/static/images/services/integration/wordpress.webp b/public/static/images/services/integration/wordpress.webp
new file mode 100644
index 000000000..62640f17b
Binary files /dev/null and b/public/static/images/services/integration/wordpress.webp differ
diff --git a/public/static/images/services/shopify-hero.jpg b/public/static/images/services/shopify-hero.jpg
new file mode 100644
index 000000000..dafb62251
Binary files /dev/null and b/public/static/images/services/shopify-hero.jpg differ
diff --git a/src/app/services/backend/api/page.tsx b/src/app/services/backend/api/page.tsx
new file mode 100644
index 000000000..97cb006ad
--- /dev/null
+++ b/src/app/services/backend/api/page.tsx
@@ -0,0 +1,183 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Rocket,
+ Code,
+ Shield,
+ Zap,
+ Database,
+ LineChart,
+ Cloud,
+ GitBranch,
+ FileJson,
+ Layers,
+ BarChart,
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Développement d'APIs | onRuntime Studio",
+ description: "Créez des APIs robustes, sécurisées et performantes. Notre expertise en développement backend vous garantit des APIs fiables et évolutives pour vos applications.",
+};
+
+const APIServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages des APIs modernes */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default APIServicePage;
\ No newline at end of file
diff --git a/src/app/services/backend/bots/page.tsx b/src/app/services/backend/bots/page.tsx
new file mode 100644
index 000000000..8400c34c4
--- /dev/null
+++ b/src/app/services/backend/bots/page.tsx
@@ -0,0 +1,183 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Zap,
+ MessageSquare,
+ Settings,
+ Command,
+ Bell,
+ Users,
+ Shield,
+ LineChart,
+ Heart,
+ BarChart,
+ Clock
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Développement de Bots Discord & Slack | onRuntime Studio",
+ description: "Créez des bots intelligents et des automatisations pour Discord, Slack et autres plateformes. Notre expertise vous garantit des bots performants et fiables.",
+};
+
+const BotsServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages des bots modernes */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default BotsServicePage;
\ No newline at end of file
diff --git a/src/app/services/backend/cloud/page.tsx b/src/app/services/backend/cloud/page.tsx
new file mode 100644
index 000000000..bde8f71be
--- /dev/null
+++ b/src/app/services/backend/cloud/page.tsx
@@ -0,0 +1,183 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Cloud,
+ Shield,
+ Zap,
+ Scale,
+ LineChart,
+ Server,
+ Database,
+ Lock,
+ GitBranch,
+ Globe,
+ Timer,
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Solutions Cloud | onRuntime Studio",
+ description: "Déployez et gérez vos applications dans le cloud avec expertise. Notre savoir-faire en cloud computing vous garantit une infrastructure flexible, sécurisée et performante.",
+};
+
+const CloudServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages du cloud */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default CloudServicePage;
\ No newline at end of file
diff --git a/src/app/services/backend/database/page.tsx b/src/app/services/backend/database/page.tsx
new file mode 100644
index 000000000..c04fa2641
--- /dev/null
+++ b/src/app/services/backend/database/page.tsx
@@ -0,0 +1,183 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Database,
+ Shield,
+ Zap,
+ History,
+ Share2,
+ Search,
+ LineChart,
+ Cloud,
+ GitBranch,
+ BarChart,
+ Timer
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Architecture et Optimisation de Bases de Données | onRuntime Studio",
+ description: "Concevez et optimisez vos bases de données pour des performances maximales. Notre expertise en bases de données vous garantit une architecture robuste et évolutive.",
+};
+
+const DatabaseServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages des bases de données modernes */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default DatabaseServicePage;
\ No newline at end of file
diff --git a/src/app/services/backend/microservices/page.tsx b/src/app/services/backend/microservices/page.tsx
new file mode 100644
index 000000000..d9196b72b
--- /dev/null
+++ b/src/app/services/backend/microservices/page.tsx
@@ -0,0 +1,183 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Boxes,
+ GitBranch,
+ Zap,
+ Shield,
+ Cloud,
+ LineChart,
+ Scale,
+ CircuitBoard,
+ Gauge,
+ Timer,
+ Workflow
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Architecture Microservices | onRuntime Studio",
+ description: "Développez des applications scalables et résilientes avec une architecture microservices. Notre expertise vous garantit une infrastructure moderne et performante.",
+};
+
+const MicroservicesServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages des microservices */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default MicroservicesServicePage;
\ No newline at end of file
diff --git a/src/app/services/backend/page.tsx b/src/app/services/backend/page.tsx
new file mode 100644
index 000000000..1a31b491c
--- /dev/null
+++ b/src/app/services/backend/page.tsx
@@ -0,0 +1,87 @@
+import React from 'react';
+import Services from '@/constants/services';
+import ServiceOverviewPage from '@/components/marketing/services/service-overview';
+import { ServiceCategory } from '@/types/service';
+import type { Metadata } from "next";
+import { Database, Server, Shield, Scale } from 'lucide-react';
+
+export const metadata: Metadata = {
+ title: "Développement Backend | onRuntime Studio",
+ description: "Création d'APIs et de systèmes backend robustes, sécurisés et évolutifs. Notre expertise garantit des solutions techniques performantes pour vos applications.",
+};
+
+const BackendServicePage = () => {
+ const backendService = Services.find(service => service.id === ServiceCategory.BACKEND);
+
+ if (!backendService) {
+ return null;
+ }
+
+ const benefits = [
+ {
+ title: "Architecture scalable",
+ description: "Systèmes conçus pour évoluer avec votre croissance, utilisant des architectures modernes et distribuées.",
+ icon: Scale
+ },
+ {
+ title: "Base de données optimisée",
+ description: "Conception et optimisation des bases de données pour des performances maximales et une intégrité des données.",
+ icon: Database
+ },
+ {
+ title: "Infrastructure robuste",
+ description: "Déploiement sur des infrastructures cloud modernes avec haute disponibilité et résilience.",
+ icon: Server
+ },
+ {
+ title: "Sécurité avancée",
+ description: "Implémentation des meilleures pratiques de sécurité et de protection des données sensibles.",
+ icon: Shield
+ }
+ ];
+
+ const processList = [
+ {
+ title: "Analyse des besoins",
+ description: "Étude approfondie des besoins techniques, définition de l'architecture et des choix technologiques.",
+ services: ["Architecture", "Conseil technique"]
+ },
+ {
+ title: "Conception système",
+ description: "Design de l'architecture backend, modélisation des données et définition des APIs.",
+ services: ["Architecture", "Database Design"]
+ },
+ {
+ title: "Développement API",
+ description: "Implémentation des APIs RESTful ou GraphQL avec documentation complète.",
+ services: ["API Development", "Documentation"]
+ },
+ {
+ title: "Base de données",
+ description: "Mise en place et optimisation des bases de données avec focus sur la performance et la scalabilité.",
+ services: ["Database", "Optimisation"]
+ },
+ {
+ title: "Tests et sécurité",
+ description: "Implémentation des tests automatisés et des mesures de sécurité avancées.",
+ services: ["Tests", "Security"]
+ },
+ {
+ title: "Déploiement et monitoring",
+ description: "Mise en place de l'infrastructure cloud, du monitoring et des alertes.",
+ services: ["DevOps", "Monitoring"]
+ }
+ ];
+
+ return (
+
+ );
+};
+
+export default BackendServicePage;
\ No newline at end of file
diff --git a/src/app/services/design/audit/page.tsx b/src/app/services/design/audit/page.tsx
new file mode 100644
index 000000000..0cdb7d5da
--- /dev/null
+++ b/src/app/services/design/audit/page.tsx
@@ -0,0 +1,181 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Search,
+ LineChart,
+ Users,
+ Eye,
+ BarChart,
+ Target,
+ MousePointer,
+ Zap,
+ MessageSquare,
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Audit UX/UI | onRuntime Studio",
+ description: "Optimisez vos interfaces avec un audit UX/UI professionnel. Notre expertise vous garantit une analyse approfondie et des recommandations concrètes pour améliorer l'expérience utilisateur.",
+};
+
+const AuditServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages de l'audit */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default AuditServicePage;
\ No newline at end of file
diff --git a/src/app/services/design/branding/page.tsx b/src/app/services/design/branding/page.tsx
new file mode 100644
index 000000000..7a7612f34
--- /dev/null
+++ b/src/app/services/design/branding/page.tsx
@@ -0,0 +1,183 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Palette,
+ Heart,
+ Book,
+ PenTool,
+ Layout,
+ Target,
+ Users,
+ Globe,
+ FileImage,
+ Megaphone,
+ Share2,
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Branding & Identité Visuelle | onRuntime Studio",
+ description: "Créez une identité de marque mémorable et cohérente. Notre expertise en branding vous garantit une identité visuelle qui reflète vos valeurs et capte votre audience.",
+};
+
+const BrandingServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages du branding */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default BrandingServicePage;
\ No newline at end of file
diff --git a/src/app/services/design/moodboard/page.tsx b/src/app/services/design/moodboard/page.tsx
new file mode 100644
index 000000000..f1889ead6
--- /dev/null
+++ b/src/app/services/design/moodboard/page.tsx
@@ -0,0 +1,183 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Palette,
+ Image,
+ Lightbulb,
+ Target,
+ PenTool,
+ Compass,
+ Brush,
+ Share2,
+ Eye,
+ FileImage,
+ Layers
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Création de Moodboards | onRuntime Studio",
+ description: "Définissez l'identité visuelle de votre projet avec des moodboards professionnels. Notre expertise en design vous garantit une direction artistique claire et cohérente.",
+};
+
+const MoodboardServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages des moodboards */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default MoodboardServicePage;
\ No newline at end of file
diff --git a/src/app/services/design/page.tsx b/src/app/services/design/page.tsx
new file mode 100644
index 000000000..9a6b47198
--- /dev/null
+++ b/src/app/services/design/page.tsx
@@ -0,0 +1,87 @@
+import React from 'react';
+import Services from '@/constants/services';
+import ServiceOverviewPage from '@/components/marketing/services/service-overview';
+import { ServiceCategory } from '@/types/service';
+import type { Metadata } from "next";
+import { Lightbulb, Target, Users, Zap } from 'lucide-react';
+
+export const metadata: Metadata = {
+ title: "Design UI/UX | onRuntime Studio",
+ description: "Création d'interfaces modernes et d'expériences utilisateur optimales. Notre expertise en design vous garantit des interfaces élégantes et fonctionnelles.",
+};
+
+const DesignServicePage = () => {
+ const designService = Services.find(service => service.id === ServiceCategory.DESIGN);
+
+ if (!designService) {
+ return null;
+ }
+
+ const benefits = [
+ {
+ title: "Design UI/UX centré utilisateur",
+ description: "Une approche qui place les besoins utilisateurs au cœur de nos designs, validée par des prototypes interactifs.",
+ icon: Users
+ },
+ {
+ title: "Innovation créative",
+ description: "Des solutions UI/UX créatives et des prototypes innovants qui distinguent votre marque tout en respectant les standards.",
+ icon: Lightbulb
+ },
+ {
+ title: "Prototypage itératif",
+ description: "Une méthodologie basée sur des prototypes rapides et des itérations fréquentes pour affiner l'expérience utilisateur.",
+ icon: Zap
+ },
+ {
+ title: "Objectifs business",
+ description: "Un design UI/UX aligné sur vos objectifs commerciaux, validé par des tests utilisateurs sur prototypes.",
+ icon: Target
+ }
+ ];
+
+ const processList = [
+ {
+ title: "Analyse des besoins",
+ description: "Première étape cruciale où nous analysons vos besoins, votre marque et vos objectifs business pour définir la direction UI/UX.",
+ services: ["Design UI/UX"]
+ },
+ {
+ title: "Recherche et moodboard",
+ description: "Création de moodboards et exploration des directions créatives possibles. Définition de la direction artistique globale.",
+ services: ["Design UI/UX", "Moodboard"]
+ },
+ {
+ title: "Wireframes",
+ description: "Conception des wireframes pour valider la structure, la hiérarchie et l'architecture de l'information.",
+ services: ["Design UI/UX", "Wireframes"]
+ },
+ {
+ title: "Design d'interface",
+ description: "Création des maquettes finales en respectant votre charte graphique. Attention particulière aux composants et à leur réutilisabilité.",
+ services: ["Design UI/UX"]
+ },
+ {
+ title: "Prototypage",
+ description: "Création de prototypes pour tester les interactions et valider les parcours utilisateurs.",
+ services: ["Design UI/UX"]
+ },
+ {
+ title: "Développement",
+ description: "Transformation des maquettes en interfaces fonctionnelles, avec une attention particulière aux animations définies.",
+ services: ["Développement Frontend", "Intégration"]
+ }
+ ];
+
+ return (
+
+ );
+};
+
+export default DesignServicePage;
\ No newline at end of file
diff --git a/src/app/services/design/ui/page.tsx b/src/app/services/design/ui/page.tsx
new file mode 100644
index 000000000..3fefc68bf
--- /dev/null
+++ b/src/app/services/design/ui/page.tsx
@@ -0,0 +1,183 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Palette,
+ Layers,
+ Paintbrush,
+ Smartphone,
+ Zap,
+ Eye,
+ SlidersHorizontal,
+ MousePointer,
+ Component,
+ LayoutGrid,
+ Code
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Design UI/Maquettes | onRuntime Studio",
+ description: "Créez des interfaces utilisateur modernes et attrayantes. Notre expertise en design UI vous garantit des maquettes professionnelles et une expérience utilisateur exceptionnelle.",
+};
+
+const UIDesignServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages du design UI */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default UIDesignServicePage;
\ No newline at end of file
diff --git a/src/app/services/design/wireframes/page.tsx b/src/app/services/design/wireframes/page.tsx
new file mode 100644
index 000000000..0fdbbeb9c
--- /dev/null
+++ b/src/app/services/design/wireframes/page.tsx
@@ -0,0 +1,183 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ LayoutTemplate,
+ Users,
+ Blocks,
+ MousePointer,
+ Smartphone,
+ Monitor,
+ Share2,
+ FileCheck,
+ LayoutGrid,
+ FileText,
+ ListChecks
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Création de Wireframes | onRuntime Studio",
+ description: "Concevez l'architecture de vos interfaces avec des wireframes professionnels. Notre expertise UX vous garantit une structure claire et une navigation optimale.",
+};
+
+const WireframesServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages des wireframes */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default WireframesServicePage;
\ No newline at end of file
diff --git a/src/app/services/frontend/desktop/page.tsx b/src/app/services/frontend/desktop/page.tsx
new file mode 100644
index 000000000..1730a24e8
--- /dev/null
+++ b/src/app/services/frontend/desktop/page.tsx
@@ -0,0 +1,184 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Rocket,
+ Monitor,
+ Laptop,
+ Apple,
+ Database,
+ Upload,
+ Download,
+ Cpu,
+ Code,
+ LineChart,
+ Cloud
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Développement Applications Desktop | onRuntime Studio",
+ description: "Créez des applications de bureau performantes et multiplateformes avec Electron. Notre expertise en développement desktop vous garantit des applications robustes et intuitives.",
+};
+
+const DesktopServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages des applications desktop */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default DesktopServicePage;
\ No newline at end of file
diff --git a/src/app/services/frontend/mobile/page.tsx b/src/app/services/frontend/mobile/page.tsx
new file mode 100644
index 000000000..c864e3aed
--- /dev/null
+++ b/src/app/services/frontend/mobile/page.tsx
@@ -0,0 +1,183 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Rocket,
+ Smartphone,
+ Tablet,
+ AppWindow,
+ Layout,
+ Share2,
+ MessageSquare,
+ PenTool,
+ Gauge,
+ Code,
+ Store
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Développement Mobile Frontend | onRuntime Studio",
+ description: "Créez des applications mobiles performantes avec React Native. Notre expertise en développement mobile vous garantit des applications natives de qualité pour iOS et Android.",
+};
+
+const MobileFrontendServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages du développement mobile */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default MobileFrontendServicePage;
\ No newline at end of file
diff --git a/src/app/services/frontend/page.tsx b/src/app/services/frontend/page.tsx
new file mode 100644
index 000000000..1229e3355
--- /dev/null
+++ b/src/app/services/frontend/page.tsx
@@ -0,0 +1,87 @@
+import React from 'react';
+import Services from '@/constants/services';
+import ServiceOverviewPage from '@/components/marketing/services/service-overview';
+import { ServiceCategory } from '@/types/service';
+import type { Metadata } from "next";
+import { Cpu, Gauge, GitBranch, Shield } from 'lucide-react';
+
+export const metadata: Metadata = {
+ title: "Développement Frontend | onRuntime Studio",
+ description: "Création d'applications web modernes, performantes et évolutives. Notre expertise en développement frontend garantit des solutions techniques robustes et innovantes.",
+};
+
+const FrontendServicePage = () => {
+ const frontendService = Services.find(service => service.id === ServiceCategory.FRONTEND);
+
+ if (!frontendService) {
+ return null;
+ }
+
+ const benefits = [
+ {
+ title: "Architecture évolutive",
+ description: "Applications construites sur des architectures modernes et scalables, prêtes pour l'évolution de votre projet.",
+ icon: Cpu
+ },
+ {
+ title: "Performance optimale",
+ description: "Focus sur les performances avec des techniques avancées d'optimisation et de mise en cache.",
+ icon: Gauge
+ },
+ {
+ title: "Code maintenable",
+ description: "Architecture propre et modulaire permettant une maintenance facile et des évolutions rapides.",
+ icon: GitBranch
+ },
+ {
+ title: "Sécurité renforcée",
+ description: "Implémentation des meilleures pratiques de sécurité frontend pour protéger vos utilisateurs.",
+ icon: Shield
+ }
+ ];
+
+ const processList = [
+ {
+ title: "Architecture technique",
+ description: "Définition de l'architecture frontend, choix des technologies et mise en place de l'environnement de développement.",
+ services: ["Architecture", "Conseil technique"]
+ },
+ {
+ title: "Mise en place du projet",
+ description: "Configuration du projet avec les bonnes pratiques de développement, tests et déploiement continu.",
+ services: ["Setup technique", "CI/CD"]
+ },
+ {
+ title: "Développement des features",
+ description: "Implémentation des fonctionnalités avec un focus sur la qualité du code et les performances.",
+ services: ["Développement Frontend", "React", "Next.js"]
+ },
+ {
+ title: "Gestion de l'état",
+ description: "Mise en place d'une gestion d'état robuste et performante pour les données de l'application.",
+ services: ["State Management", "API Integration"]
+ },
+ {
+ title: "Tests et qualité",
+ description: "Mise en place des tests automatisés et des processus d'assurance qualité.",
+ services: ["Tests unitaires", "Tests E2E"]
+ },
+ {
+ title: "Optimisation et monitoring",
+ description: "Optimisation des performances et mise en place d'outils de monitoring.",
+ services: ["Performance", "Analytics"]
+ }
+ ];
+
+ return (
+
+ );
+};
+
+export default FrontendServicePage;
\ No newline at end of file
diff --git a/src/app/services/frontend/pwa/page.tsx b/src/app/services/frontend/pwa/page.tsx
new file mode 100644
index 000000000..66f07deed
--- /dev/null
+++ b/src/app/services/frontend/pwa/page.tsx
@@ -0,0 +1,184 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Rocket,
+ Wifi,
+ Smartphone,
+ Cloud,
+ Zap,
+ Bell,
+ Download,
+ ArrowDownToLine,
+ Globe,
+ LineChart,
+ Shield
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Développement Progressive Web App (PWA) | onRuntime Studio",
+ description: "Créez des applications web progressives performantes qui offrent une expérience proche du natif. Notre expertise en PWA vous garantit des applications accessibles et engageantes.",
+};
+
+const PWAServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages des PWA */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default PWAServicePage;
\ No newline at end of file
diff --git a/src/app/services/frontend/web/page.tsx b/src/app/services/frontend/web/page.tsx
new file mode 100644
index 000000000..b1e259782
--- /dev/null
+++ b/src/app/services/frontend/web/page.tsx
@@ -0,0 +1,183 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Rocket,
+ Code,
+ Monitor,
+ Smartphone,
+ Zap,
+ Layout,
+ Share2,
+ PenTool,
+ Search,
+ Globe,
+ Paintbrush
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Développement Web Frontend | onRuntime Studio",
+ description: "Créez des applications web modernes et performantes. Notre expertise en développement frontend vous garantit une expérience utilisateur exceptionnelle et des performances optimales.",
+};
+
+const WebFrontendServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages du développement frontend moderne */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default WebFrontendServicePage;
\ No newline at end of file
diff --git a/src/app/services/integration/page.tsx b/src/app/services/integration/page.tsx
new file mode 100644
index 000000000..1be9b9a10
--- /dev/null
+++ b/src/app/services/integration/page.tsx
@@ -0,0 +1,87 @@
+import React from 'react';
+import Services from '@/constants/services';
+import ServiceOverviewPage from '@/components/marketing/services/service-overview';
+import { ServiceCategory } from '@/types/service';
+import type { Metadata } from "next";
+import { Code, Zap, Layout, Sparkles } from 'lucide-react';
+
+export const metadata: Metadata = {
+ title: "Intégration | onRuntime Studio",
+ description: "Transformation de vos maquettes en sites web performants et responsive. Notre expertise en intégration garantit une expérience utilisateur optimale sur tous les appareils.",
+};
+
+const IntegrationServicePage = () => {
+ const integrationService = Services.find(service => service.id === ServiceCategory.INTEGRATION);
+
+ if (!integrationService) {
+ return null;
+ }
+
+ const benefits = [
+ {
+ title: "Code propre et maintenable",
+ description: "Intégration avec des standards de code élevés et une architecture pensée pour la maintenabilité à long terme.",
+ icon: Code
+ },
+ {
+ title: "Performance optimisée",
+ description: "Sites web rapides et fluides grâce à des techniques d'optimisation avancées et au respect des bonnes pratiques.",
+ icon: Zap
+ },
+ {
+ title: "Responsive design",
+ description: "Adaptation parfaite à tous les écrans et appareils pour une expérience utilisateur cohérente.",
+ icon: Layout
+ },
+ {
+ title: "Animations fluides",
+ description: "Intégration d'animations soignées pour enrichir l'expérience utilisateur tout en maintenant les performances.",
+ icon: Sparkles
+ }
+ ];
+
+ const processList = [
+ {
+ title: "Analyse des maquettes",
+ description: "Étude approfondie des maquettes pour identifier les composants, les interactions et les points d'attention techniques.",
+ services: ["Analyse technique", "Architecture"]
+ },
+ {
+ title: "Architecture technique",
+ description: "Définition de l'architecture frontend et choix des technologies adaptées au projet.",
+ services: ["Architecture", "Conseil technique"]
+ },
+ {
+ title: "Développement des composants",
+ description: "Création des composants réutilisables en suivant les principes du design system.",
+ services: ["Développement Frontend", "Intégration"]
+ },
+ {
+ title: "Intégration responsive",
+ description: "Adaptation du design pour tous les formats d'écran avec une attention particulière à l'expérience mobile.",
+ services: ["Intégration", "Responsive Design"]
+ },
+ {
+ title: "Optimisation",
+ description: "Optimisation des performances, de l'accessibilité et du référencement technique.",
+ services: ["Performance", "SEO technique"]
+ },
+ {
+ title: "Tests et validation",
+ description: "Tests approfondis sur différents navigateurs et appareils pour garantir une expérience utilisateur optimale.",
+ services: ["Tests", "Quality Assurance"]
+ }
+ ];
+
+ return (
+
+ );
+};
+
+export default IntegrationServicePage;
\ No newline at end of file
diff --git a/src/app/services/integration/prestashop/page.tsx b/src/app/services/integration/prestashop/page.tsx
new file mode 100644
index 000000000..6fe6370ba
--- /dev/null
+++ b/src/app/services/integration/prestashop/page.tsx
@@ -0,0 +1,183 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Rocket,
+ Palette,
+ Shield,
+ Globe,
+ LayoutDashboard,
+ ShoppingBag,
+ Code,
+ Share2,
+ MessageSquare,
+ Truck,
+ BarChart
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Développement PrestaShop | onRuntime Studio",
+ description: "Créez votre boutique en ligne performante avec PrestaShop. Notre expertise vous garantit une solution e-commerce robuste et personnalisée pour développer votre activité.",
+};
+
+const PrestaShopServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages PrestaShop */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default PrestaShopServicePage;
\ No newline at end of file
diff --git a/src/app/services/integration/shopify/page.tsx b/src/app/services/integration/shopify/page.tsx
new file mode 100644
index 000000000..577e8c318
--- /dev/null
+++ b/src/app/services/integration/shopify/page.tsx
@@ -0,0 +1,183 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Rocket,
+ Palette,
+ Settings,
+ Shield,
+ Globe,
+ CreditCard,
+ BarChart,
+ Truck,
+ Search,
+ Share2,
+ MessageSquare
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Développement Shopify | onRuntime Studio",
+ description: "Créez votre boutique en ligne performante avec notre expertise Shopify. De la personnalisation à l'optimisation, nous vous accompagnons dans votre succès e-commerce.",
+};
+
+const ShopifyServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages Shopify */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default ShopifyServicePage;
\ No newline at end of file
diff --git a/src/app/services/integration/squarespace/page.tsx b/src/app/services/integration/squarespace/page.tsx
new file mode 100644
index 000000000..23ceaab90
--- /dev/null
+++ b/src/app/services/integration/squarespace/page.tsx
@@ -0,0 +1,182 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Rocket,
+ Palette,
+ LayoutDashboard,
+ Image as ImageIcon,
+ Code,
+ Share2,
+ MessageSquare,
+ Zap,
+ ShoppingBag,
+ Shapes
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Développement Squarespace | onRuntime Studio",
+ description: "Créez un site web élégant et fonctionnel avec Squarespace. Notre expertise vous permet de tirer le meilleur parti de cette plateforme intuitive et design.",
+};
+
+const SquarespaceServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages Squarespace */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default SquarespaceServicePage;
\ No newline at end of file
diff --git a/src/app/services/integration/strapi/page.tsx b/src/app/services/integration/strapi/page.tsx
new file mode 100644
index 000000000..164a39351
--- /dev/null
+++ b/src/app/services/integration/strapi/page.tsx
@@ -0,0 +1,183 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Rocket,
+ Code,
+ Shield,
+ LayoutDashboard,
+ Database,
+ Share2,
+ MessageSquare,
+ Users,
+ Workflow,
+ Box,
+ Network
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Développement Strapi | onRuntime Studio",
+ description: "Créez des applications performantes avec Strapi, le CMS headless leader. Notre expertise vous garantit une solution évolutive et personnalisée pour gérer votre contenu.",
+};
+
+const StrapiServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages Strapi */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default StrapiServicePage;
\ No newline at end of file
diff --git a/src/app/services/integration/webflow/page.tsx b/src/app/services/integration/webflow/page.tsx
new file mode 100644
index 000000000..3e1023717
--- /dev/null
+++ b/src/app/services/integration/webflow/page.tsx
@@ -0,0 +1,184 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Rocket,
+ Palette,
+ Settings,
+ LayoutDashboard,
+ Search,
+ Code,
+ Share2,
+ MessageSquare,
+ Zap,
+ MousePointer,
+ Laptop
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Développement Webflow | onRuntime Studio",
+ description: "Créez un site web moderne et dynamique avec Webflow. De la conception visuelle à l'interaction utilisateur, nous donnons vie à votre vision avec une approche no-code professionnelle.",
+};
+
+const WebflowServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages Webflow */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default WebflowServicePage;
\ No newline at end of file
diff --git a/src/app/services/integration/wordpress/page.tsx b/src/app/services/integration/wordpress/page.tsx
new file mode 100644
index 000000000..3941d4bc3
--- /dev/null
+++ b/src/app/services/integration/wordpress/page.tsx
@@ -0,0 +1,184 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import FeatureSection from '@/components/marketing/services/feature-section';
+import TestimonialsSection from '@/components/marketing/services/testimonials-section';
+import FAQSection from '@/components/marketing/services/faq-section';
+import {
+ Rocket,
+ Palette,
+ Settings,
+ Shield,
+ LayoutDashboard,
+ Search,
+ Blocks,
+ Code,
+ Share2,
+ MessageSquare,
+ Zap
+} from 'lucide-react';
+
+export const metadata = {
+ title: "Développement WordPress | onRuntime Studio",
+ description: "Créez un site web professionnel avec WordPress. De la conception sur mesure à l'optimisation des performances, nous vous accompagnons dans la réalisation de votre projet web.",
+};
+
+const WordPressServicePage = () => {
+ return (
+
+ {/* Caractéristiques principales */}
+
+
+ {/* Avantages WordPress */}
+
+
+ {/* Témoignages */}
+
+
+ {/* FAQ */}
+
+
+ {/* Services complémentaires */}
+
+
+ );
+};
+
+export default WordPressServicePage;
\ No newline at end of file
diff --git a/src/app/services/page.tsx b/src/app/services/page.tsx
new file mode 100644
index 000000000..bd5f86590
--- /dev/null
+++ b/src/app/services/page.tsx
@@ -0,0 +1,9 @@
+import ServicesPage from "@/screens/marketing/services";
+import type { Metadata } from "next";
+
+export const metadata: Metadata = {
+ title: "Nos Services | onRuntime Studio",
+ description: "Découvrez nos services de design UI/UX, développement web et mobile, et solutions sur mesure pour vos projets digitaux.",
+};
+
+export default ServicesPage;
diff --git a/src/components/layout/footer/footer.tsx b/src/components/layout/footer/footer.tsx
index c6ecf330c..2c90a2f94 100644
--- a/src/components/layout/footer/footer.tsx
+++ b/src/components/layout/footer/footer.tsx
@@ -4,8 +4,8 @@ import Link from "next/link";
import React from "react";
const navigation = {
- ["Navigation"]: [
- { name: "Nos services", href: Routes.unknown },
+ Navigation: [
+ { name: "Nos services", href: Routes.services },
{ name: "Nos projets", href: Routes.unknown },
{ name: "Le Studio", href: Routes.unknown },
{ name: "Carrières", href: Routes.unknown },
diff --git a/src/components/marketing/navbar/navigation/services/index.tsx b/src/components/marketing/navbar/navigation/services/index.tsx
index 928c64add..fd3646192 100644
--- a/src/components/marketing/navbar/navigation/services/index.tsx
+++ b/src/components/marketing/navbar/navigation/services/index.tsx
@@ -4,74 +4,104 @@ import {
NavigationMenuLink,
NavigationMenuTrigger,
} from "@/components/ui/navigation-menu";
+import Services from "@/constants/services";
import Routes from "@/constants/routes";
import { cn } from "@/lib/utils";
-import { OnRuntimeLogo } from "@/logos/components";
-import Link from "next/link";
import React from "react";
+import { ArrowRight, LucideIcon } from "lucide-react";
+import { OnRuntimeLogo } from "@/logos/components";
const NavigationServices: React.FC = () => (
Nos services
-
-
-
-
-
-
- Nos services
+
);
-const ListItem = React.forwardRef<
- React.ElementRef<"a">,
- React.ComponentPropsWithoutRef<"a">
->(({ className, title, children, ...props }, ref) => {
+interface ListItemProps {
+ title: string;
+ icon: LucideIcon;
+ href: string;
+ className?: string;
+ children?: React.ReactNode;
+}
+
+const ListItem = ({ className, title, children, icon: Icon, href }: ListItemProps) => {
return (
-
- {title}
-
- {children}
-
+
+
+ {children}
);
-});
-ListItem.displayName = "ListItem";
+};
-export default NavigationServices;
+export default NavigationServices;
\ No newline at end of file
diff --git a/src/components/marketing/services/faq-section.tsx b/src/components/marketing/services/faq-section.tsx
new file mode 100644
index 000000000..e3308dacb
--- /dev/null
+++ b/src/components/marketing/services/faq-section.tsx
@@ -0,0 +1,53 @@
+import React from 'react';
+import {
+ Accordion,
+ AccordionContent,
+ AccordionItem,
+ AccordionTrigger,
+} from "@/components/ui/accordion";
+import { cn } from "@/lib/utils";
+
+interface FAQItem {
+ question: string;
+ answer: string;
+}
+
+interface FAQSectionProps {
+ title: string;
+ description: string;
+ items: FAQItem[];
+ className?: string;
+}
+
+const FAQSection: React.FC = ({
+ title,
+ description,
+ items,
+ className
+}) => {
+ return (
+
+
+
{title}
+
{description}
+
+
+
+
+ {items.map((item, index) => (
+
+
+ {item.question}
+
+
+ {item.answer}
+
+
+ ))}
+
+
+
+ );
+};
+
+export default FAQSection;
diff --git a/src/components/marketing/services/feature-section.tsx b/src/components/marketing/services/feature-section.tsx
new file mode 100644
index 000000000..a8e7b6bab
--- /dev/null
+++ b/src/components/marketing/services/feature-section.tsx
@@ -0,0 +1,68 @@
+import React from 'react';
+import { cn } from "@/lib/utils";
+import Image from 'next/image';
+import { LucideIcon } from 'lucide-react';
+
+interface FeatureSectionProps {
+ title: string;
+ description: string;
+ features: {
+ title: string;
+ description: string;
+ icon?: LucideIcon;
+ }[];
+ image?: string;
+ reversed?: boolean;
+ className?: string;
+}
+
+const FeatureSection: React.FC = ({
+ title,
+ description,
+ features,
+ image,
+ reversed = false,
+ className
+}) => {
+ return (
+
+ {/* Contenu */}
+
+
+
{title}
+
{description}
+
+
+
+ {features.map((feature, index) => (
+
+ {feature.icon && (
+
+
+
+ )}
+
+
{feature.title}
+
{feature.description}
+
+
+ ))}
+
+
+
+ {/* Image */}
+ {image && (
+
+
+
+ )}
+
+ );
+};
+
+export default FeatureSection;
\ No newline at end of file
diff --git a/src/components/marketing/services/process-timeline.tsx b/src/components/marketing/services/process-timeline.tsx
new file mode 100644
index 000000000..0c623ab44
--- /dev/null
+++ b/src/components/marketing/services/process-timeline.tsx
@@ -0,0 +1,131 @@
+"use client";
+
+import React, { useEffect, useRef, useState } from 'react';
+import { Badge } from "@/components/ui/badge";
+import { cn } from "@/lib/utils";
+
+interface ProcessStep {
+ title: string;
+ description: string;
+ services?: string[];
+}
+
+interface ProcessTimelineProps {
+ steps: ProcessStep[];
+}
+
+const ProcessTimeline: React.FC = ({ steps }) => {
+ const [path, setPath] = useState("");
+ const timelineRef = useRef(null);
+ const pointRefs = useRef>([]);
+
+ useEffect(() => {
+ const calculatePath = () => {
+ if (!timelineRef.current) return;
+
+ const validPointRefs = pointRefs.current.filter((ref): ref is HTMLDivElement => ref !== null);
+ if (validPointRefs.length === 0) return;
+
+ const points = validPointRefs.map(ref => {
+ const rect = ref.getBoundingClientRect();
+ const timelineRect = timelineRef.current!.getBoundingClientRect();
+ return {
+ x: rect.left - timelineRect.left + rect.width / 2,
+ y: rect.top - timelineRect.top + rect.height / 2
+ };
+ });
+
+ let svgPath = `M ${points[0].x} ${points[0].y}`;
+
+ for (let i = 0; i < points.length - 1; i++) {
+ const current = points[i];
+ const next = points[i + 1];
+ const midY = (current.y + next.y) / 2;
+
+ svgPath += ` C ${current.x} ${midY}, ${next.x} ${midY}, ${next.x} ${next.y}`;
+ }
+
+ setPath(svgPath);
+ };
+
+ calculatePath();
+ window.addEventListener('resize', calculatePath);
+ return () => window.removeEventListener('resize', calculatePath);
+ }, []);
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {steps.map((step, i) => (
+
+
{
+ pointRefs.current[i] = el;
+ }}
+ className={cn(
+ "relative flex-none w-8 h-8 mt-2",
+ i % 2 === 0 ? "ml-0" : "-ml-4",
+ "md:ml-0"
+ )}
+ >
+
+
+
+
+
+
+
+ {step.title}
+
+ {step.services && (
+
+ {step.services.map((service, j) => (
+ {service}
+ ))}
+
+ )}
+
+
+ {step.description}
+
+
+
+ ))}
+
+
+ );
+};
+
+export default ProcessTimeline;
\ No newline at end of file
diff --git a/src/components/marketing/services/sections/index.tsx b/src/components/marketing/services/sections/index.tsx
new file mode 100644
index 000000000..50507a927
--- /dev/null
+++ b/src/components/marketing/services/sections/index.tsx
@@ -0,0 +1,242 @@
+import React from "react";
+import { Button } from "@/components/ui/button";
+import { VelocityScroll } from "@/components/ui/scroll-based-velocity";
+import Link from "next/link";
+import { ArrowRight, GitPullRequestArrow, Timer, Users } from "lucide-react";
+import Image from "next/image";
+
+export const ValuePropositionSection = () => (
+
+
+
+
+
+
Approche flexible
+
+ Notre méthodologie s'adapte à vos besoins spécifiques, garantissant
+ une collaboration fluide et efficace.
+
+
+
+
+
+
+
+
+ Time-to-Market optimisé
+
+
+ Des solutions rapides et efficaces pour lancer votre projet dans les
+ meilleurs délais.
+
+
+
+
+
+
+
+
Équipe dédiée
+
+ Des experts passionnés qui s'investissent pleinement dans la
+ réussite de votre projet.
+
+
+
+);
+
+const technologies = [
+ // Core Web Technologies
+ "React",
+ "Next.js",
+ "Nuxt",
+ "TypeScript",
+ "Vue.js",
+ "TailwindCSS",
+ "Sass",
+
+ // Backend
+ "Node.js",
+ "Python",
+ "Django",
+ "PHP",
+ "Laravel",
+ "NestJS",
+ "Express",
+ "Flask",
+
+ // CMS & E-commerce
+ "WordPress",
+ "Shopify",
+ "Webflow",
+ "SquareSpace",
+ "PrestaShop",
+ "Strapi",
+ "WooCommerce",
+
+ // Infrastructure & Data
+ "AWS",
+ "Google Cloud",
+ "Azure",
+ "Docker",
+ "Kubernetes",
+ "GraphQL",
+ "MongoDB",
+ "PostgreSQL",
+ "Redis",
+ "MySQL",
+ "Firebase",
+ "Supabase",
+ "Prisma",
+ "Vercel",
+ "Netlify",
+];
+
+const TechnologyList = () => (
+ <>
+ {technologies.map((tech, index) => (
+
+ {tech}
+ ·
+
+ ))}
+ >
+);
+
+export const TechnologiesSection = () => (
+
+
+ {/* Gradient overlay left */}
+
+
+ {/* Gradient overlay right */}
+
+
+
+ {" "}
+ {/* Added gap-12 for spacing between rows */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+export const ConsultingSection = () => (
+
+
+
+ Besoin de conseils ?
+
+
+ Nous proposons également des services de consulting pour vous aider à
+ faire les bons choix technologiques et stratégiques.
+
+
+
+ Prendre rendez-vous
+
+
+
+
+
+
+
+);
+
+const techPartners = [
+ {
+ name: "Google Cloud Platform",
+ logo: "/static/images/partners/google-cloud.svg",
+ description: "Infrastructure cloud robuste et évolutive"
+ },
+ {
+ name: "Amazon Web Services",
+ logo: "/static/images/partners/aws.svg",
+ description: "Solutions cloud complètes et flexibles"
+ },
+ {
+ name: "Shopify",
+ logo: "/static/images/partners/shopify.svg",
+ description: "Solutions e-commerce personnalisées"
+ }
+]
+
+export const ExpertiseSection = () => (
+
+
+
+ Une expertise reconnue
+
+
+ Avec plus de 10 ans d'expérience cumulée, notre équipe maîtrise les
+ dernières technologies et les meilleures pratiques du développement web
+ et mobile.
+
+
+
+
10+
+
+ Années d'expérience
+
+
+
+
7+
+ Projets réalisés
+
+
+
100%
+ Satisfaction client
+
+
+
24/7
+ Support disponible
+
+
+
+
+
+
+ Nos technologies partenaires
+
+
+
+ {techPartners.map((partner) => (
+
+
+
+
+
+
{partner.name} Partner
+
{partner.description}
+
+
+ ))}
+
+
+
+);
diff --git a/src/components/marketing/services/service-layout.tsx b/src/components/marketing/services/service-layout.tsx
new file mode 100644
index 000000000..6fa3068a1
--- /dev/null
+++ b/src/components/marketing/services/service-layout.tsx
@@ -0,0 +1,132 @@
+import React from 'react';
+import { Button } from "@/components/ui/button";
+import DotPattern from "@/components/ui/dot-pattern";
+import { cn } from "@/lib/utils";
+import { ArrowRight } from "lucide-react";
+import Link from "next/link";
+import Routes from "@/constants/routes";
+import Image from 'next/image';
+
+interface ServiceLayoutProps {
+ // SEO et métadonnées
+ title: string;
+ description: string;
+
+ // Contenu de l'en-tête
+ heroTitle: string;
+ heroDescription: string;
+ heroImage?: string;
+
+ // Sections de contenu
+ children: React.ReactNode;
+
+ // Autres props
+ className?: string;
+}
+
+const ServiceLayout: React.FC = ({
+ title,
+ description,
+ heroTitle,
+ heroDescription,
+ heroImage,
+ children,
+ className
+}) => {
+ // TODO: To replace by next-seo
+ const structuredData = {
+ "@context": "https://schema.org",
+ "@type": "Service",
+ "name": title,
+ "description": description,
+ "provider": {
+ "@type": "Organization",
+ "name": "onRuntime Studio",
+ "image": "https://onruntime.com/logo.png",
+ "address": {
+ "@type": "PostalAddress",
+ "addressLocality": "Rouen & Paris",
+ "addressCountry": "FR"
+ }
+ }
+ };
+
+ return (
+ <>
+ {/* Métadonnées SEO */}
+
+
+
+
+ {/* Hero Section */}
+
+
+
+ {heroTitle}
+
+
+
+ {heroDescription}
+
+
+
+
+ Discuter de votre projet
+
+
+
+
+
+
+
+ {heroImage && (
+
+
+
+ )}
+
+
+ {/* Contenu principal */}
+
+ {children}
+
+
+ {/* CTA final */}
+
+
+
+ Prêt à concrétiser votre projet ?
+
+
+ Contactez-nous pour discuter de vos besoins et obtenir un devis personnalisé.
+
+
+
+ Commencer maintenant
+
+
+
+
+
+
+
+ >
+ );
+};
+
+export default ServiceLayout;
\ No newline at end of file
diff --git a/src/components/marketing/services/service-overview.tsx b/src/components/marketing/services/service-overview.tsx
new file mode 100644
index 000000000..cdc081899
--- /dev/null
+++ b/src/components/marketing/services/service-overview.tsx
@@ -0,0 +1,178 @@
+import React from 'react';
+import ServiceLayout from '@/components/marketing/services/service-layout';
+import { ArrowRight, LucideIcon, Timer, Users, Zap } from "lucide-react";
+import Link from "next/link";
+import Image from "next/image";
+import { Service } from '@/types/service';
+import { Badge } from '@/components/ui/badge';
+import { cn } from '@/lib/utils';
+import DotPattern from '@/components/ui/dot-pattern';
+import ProcessTimeline from './process-timeline';
+
+interface ProcessStep {
+ title: string;
+ description: string;
+ services?: string[];
+}
+
+interface ServiceOverviewPageProps {
+ service: Service;
+ heroImage: string;
+ showCaseImage: string;
+ benefits: {
+ title: string;
+ description: string;
+ icon: LucideIcon;
+ }[];
+ processList: ProcessStep[];
+}
+
+const ServiceOverviewPage: React.FC = ({
+ service,
+ heroImage,
+ showCaseImage,
+ benefits,
+ processList
+}) => {
+ return (
+
+ {/* Introduction Section */}
+
+
+
+ Une expertise pointue en {service.name.charAt(0).toLowerCase() + service.name.slice(1)}
+
+
+ Nous combinons créativité et expertise technique pour offrir des solutions {service.name.charAt(0).toLowerCase() + service.name.slice(1)} qui répondent parfaitement à vos objectifs. Notre approche méthodique et notre expérience nous permettent de créer des solutions durables et évolutives.
+
+
+
+
+ Livraison rapide
+
+
+
+ Équipe dédiée
+
+
+
+ Solutions performantes
+
+
+
+
+
+
+
+
+ {/* Nos Services Section */}
+
+
+
Nos services
+
+ Solutions {service.name.charAt(0).toLowerCase() + service.name.slice(1)} sur mesure
+
+
+ Découvrez notre gamme complète de services {service.name.charAt(0).toLowerCase() + service.name.slice(1)}, conçue pour répondre à tous vos besoins et vous accompagner dans la réalisation de vos projets.
+
+
+
+
+ {service.subServices.map((subService) => (
+
+
+
+ {subService.icon && (
+
+
+
+ )}
+
+
{subService.name}
+
{subService.description}
+
+
+
+
+
+ ))}
+
+
+
+
+
+ {/* Benefits Section */}
+
+
+
Avantages
+
+ Pourquoi choisir nos services {service.name.charAt(0).toLowerCase() + service.name.slice(1)} ?
+
+
+ {benefits.map((benefit, i) => (
+
+
+
+
+
+
{benefit.title}
+
{benefit.description}
+
+
+ ))}
+
+
+
+
+
+
+
+ {/* Process Section */}
+
+
+
Notre processus
+
+ Comment nous travaillons
+
+
+ Une approche intégrée qui combine nos différentes expertises pour un résultat optimal.
+
+
+
+
+
+
+ );
+};
+
+export default ServiceOverviewPage;
\ No newline at end of file
diff --git a/src/components/marketing/services/testimonials-section.tsx b/src/components/marketing/services/testimonials-section.tsx
new file mode 100644
index 000000000..b28af7b39
--- /dev/null
+++ b/src/components/marketing/services/testimonials-section.tsx
@@ -0,0 +1,71 @@
+import React from 'react';
+import Image from 'next/image';
+import { cn } from "@/lib/utils";
+import { Quote } from 'lucide-react';
+
+interface Testimonial {
+ content: string;
+ author: {
+ name: string;
+ role: string;
+ company: string;
+ image: string;
+ };
+}
+
+interface TestimonialsSectionProps {
+ title: string;
+ description: string;
+ testimonials: Testimonial[];
+ className?: string;
+}
+
+const TestimonialsSection: React.FC = ({
+ title,
+ description,
+ testimonials,
+ className
+}) => {
+ return (
+
+
+
{title}
+
{description}
+
+
+
+ {testimonials.map((testimonial, index) => (
+
+
+
+
+ "{testimonial.content}"
+
+
+
+
+
+
+
+
{testimonial.author.name}
+
+ {testimonial.author.role}, {testimonial.author.company}
+
+
+
+
+ ))}
+
+
+ );
+};
+
+export default TestimonialsSection;
\ No newline at end of file
diff --git a/src/components/ui/accordion.tsx b/src/components/ui/accordion.tsx
new file mode 100644
index 000000000..2f55a32f4
--- /dev/null
+++ b/src/components/ui/accordion.tsx
@@ -0,0 +1,57 @@
+"use client"
+
+import * as React from "react"
+import * as AccordionPrimitive from "@radix-ui/react-accordion"
+import { ChevronDown } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Accordion = AccordionPrimitive.Root
+
+const AccordionItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AccordionItem.displayName = "AccordionItem"
+
+const AccordionTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ svg]:rotate-180",
+ className
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+))
+AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName
+
+const AccordionContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ {children}
+
+))
+AccordionContent.displayName = AccordionPrimitive.Content.displayName
+
+export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }
diff --git a/src/constants/routes.ts b/src/constants/routes.ts
index 864c62985..623148c4d 100644
--- a/src/constants/routes.ts
+++ b/src/constants/routes.ts
@@ -1,13 +1,52 @@
const Routes = {
- unknown: "#",
+ unknown: "#",
- landing: {
- visitor: "/",
- customer: "/customer",
- },
+ landing: {
+ visitor: "/",
+ customer: "/customer",
+ },
+
+ team: "/team",
+ contact: "/contact",
+ services: "/services",
- team: "/team",
- contact: "/contact",
+ service: {
+ design: {
+ root: "/services/design",
+ moodboard: "/services/design/moodboard",
+ wireframes: "/services/design/wireframes",
+ ui: "/services/design/ui",
+ branding: "/services/design/branding",
+ audit: "/services/design/audit",
+ },
+
+ integration: {
+ root: "/services/integration",
+ shopify: "/services/integration/shopify",
+ wordpress: "/services/integration/wordpress",
+ webflow: "/services/integration/webflow",
+ squarespace: "/services/integration/squarespace",
+ prestashop: "/services/integration/prestashop",
+ strapi: "/services/integration/strapi",
+ },
+
+ frontend: {
+ root: "/services/frontend",
+ web: "/services/frontend/web",
+ mobile: "/services/frontend/mobile",
+ desktop: "/services/frontend/desktop",
+ pwa: "/services/frontend/pwa",
+ },
+
+ backend: {
+ root: "/services/backend",
+ api: "/services/backend/api",
+ database: "/services/backend/database",
+ bots: "/services/backend/bots",
+ microservices: "/services/backend/microservices",
+ cloud: "/services/backend/cloud",
+ },
+ },
legals: {
company: "/company",
@@ -26,4 +65,4 @@ const Routes = {
}
};
-export default Routes;
+export default Routes;
\ No newline at end of file
diff --git a/src/constants/services.ts b/src/constants/services.ts
new file mode 100644
index 000000000..602a4bbf1
--- /dev/null
+++ b/src/constants/services.ts
@@ -0,0 +1,195 @@
+import { Service, ServiceCategory } from "@/types/service";
+import Routes from "./routes";
+import {
+ Palette,
+ Code,
+ Layers,
+ Server,
+ Paintbrush,
+ LayoutTemplate,
+ Smartphone,
+ FileCode,
+ ShoppingBag,
+ Globe,
+ Box,
+ Cloud,
+ Bot,
+ Database
+} from "lucide-react";
+
+const Services: Service[] = [
+ {
+ id: ServiceCategory.DESIGN,
+ name: "Design UI/UX",
+ description: "Création d'interfaces modernes et d'expériences utilisateur optimales",
+ icon: Palette,
+ subServices: [
+ {
+ id: "moodboard",
+ name: "Moodboard",
+ description: "Définition de l'identité visuelle et de l'ambiance de votre projet",
+ route: Routes.service.design.moodboard,
+ icon: Paintbrush,
+ },
+ {
+ id: "wireframes",
+ name: "Wireframes",
+ description: "Conception de la structure et du parcours utilisateur",
+ route: Routes.service.design.wireframes,
+ icon: LayoutTemplate,
+ },
+ {
+ id: "ui",
+ name: "Maquettage UI",
+ description: "Design détaillé des interfaces utilisateur",
+ route: Routes.service.design.ui,
+ icon: Smartphone,
+ },
+ {
+ id: "branding",
+ name: "Charte graphique",
+ description: "Création de votre identité visuelle complète",
+ route: Routes.service.design.branding,
+ icon: Palette,
+ },
+ {
+ id: "audit",
+ name: "Audit UX/UI",
+ description: "Analyse et optimisation de vos interfaces existantes",
+ route: Routes.service.design.audit,
+ icon: FileCode,
+ },
+ ],
+ },
+ {
+ id: ServiceCategory.INTEGRATION,
+ name: "Intégration",
+ description: "Intégration sur les principales plateformes e-commerce et CMS",
+ icon: Layers,
+ subServices: [
+ {
+ id: "shopify",
+ name: "Shopify",
+ description: "Création et personnalisation de boutiques en ligne Shopify",
+ route: Routes.service.integration.shopify,
+ icon: ShoppingBag,
+ },
+ {
+ id: "wordpress",
+ name: "WordPress",
+ description: "Développement de sites WordPress sur mesure",
+ route: Routes.service.integration.wordpress,
+ icon: Globe,
+ },
+ {
+ id: "webflow",
+ name: "Webflow",
+ description: "Création de sites web modernes avec Webflow",
+ route: Routes.service.integration.webflow,
+ icon: Box,
+ },
+ {
+ id: "squarespace",
+ name: "SquareSpace",
+ description: "Intégration et personnalisation sur SquareSpace",
+ route: Routes.service.integration.squarespace,
+ icon: Layers,
+ },
+ {
+ id: "prestashop",
+ name: "PrestaShop",
+ description: "Développement de boutiques PrestaShop",
+ route: Routes.service.integration.prestashop,
+ icon: ShoppingBag,
+ },
+ {
+ id: "strapi",
+ name: "Strapi",
+ description: "Développement de CMS headless avec Strapi",
+ route: Routes.service.integration.strapi,
+ icon: Database,
+ },
+ ],
+ },
+ {
+ id: ServiceCategory.FRONTEND,
+ name: "Développement Front-end",
+ description: "Création d'applications web et mobiles performantes",
+ icon: Code,
+ subServices: [
+ {
+ id: "web",
+ name: "Applications Web",
+ description: "Développement d'applications web modernes avec React et Next.js",
+ route: Routes.service.frontend.web,
+ icon: Globe,
+ },
+ {
+ id: "mobile",
+ name: "Applications Mobiles",
+ description: "Création d'applications mobiles natives avec React Native",
+ route: Routes.service.frontend.mobile,
+ icon: Smartphone,
+ },
+ {
+ id: "desktop",
+ name: "Logiciels de Bureau",
+ description: "Développement d'applications desktop multiplateforme",
+ route: Routes.service.frontend.desktop,
+ icon: Box,
+ },
+ {
+ id: "pwa",
+ name: "Progressive Web Apps",
+ description: "Création d'applications web progressives performantes",
+ route: Routes.service.frontend.pwa,
+ icon: Globe,
+ },
+ ],
+ },
+ {
+ id: ServiceCategory.BACKEND,
+ name: "Développement Back-end",
+ description: "Architecture et développement de solutions robustes",
+ icon: Server,
+ subServices: [
+ {
+ id: "api",
+ name: "APIs RESTful",
+ description: "Conception et développement d'APIs performantes",
+ route: Routes.service.backend.api,
+ icon: Code,
+ },
+ {
+ id: "database",
+ name: "Bases de données",
+ description: "Architecture et optimisation de bases de données",
+ route: Routes.service.backend.database,
+ icon: Database,
+ },
+ {
+ id: "bots",
+ name: "Bots Discord/Slack",
+ description: "Développement de bots et d'automatisations",
+ route: Routes.service.backend.bots,
+ icon: Bot,
+ },
+ {
+ id: "microservices",
+ name: "Microservices",
+ description: "Architecture et développement de microservices",
+ route: Routes.service.backend.microservices,
+ icon: Box,
+ },
+ {
+ id: "cloud",
+ name: "Solutions Cloud",
+ description: "Déploiement et gestion d'infrastructures cloud",
+ route: Routes.service.backend.cloud,
+ icon: Cloud,
+ },
+ ],
+ },
+];
+
+export default Services;
\ No newline at end of file
diff --git a/src/screens/marketing/services/index.tsx b/src/screens/marketing/services/index.tsx
new file mode 100644
index 000000000..7bbbca094
--- /dev/null
+++ b/src/screens/marketing/services/index.tsx
@@ -0,0 +1,152 @@
+import React from 'react';
+import { Button } from "@/components/ui/button";
+import DotPattern from "@/components/ui/dot-pattern";
+import { cn } from "@/lib/utils";
+import { ArrowRight, LucideIcon } from "lucide-react";
+import Link from "next/link";
+import Routes from "@/constants/routes";
+import Services from "@/constants/services";
+import ProjectTimeline from './timeline';
+import { ConsultingSection, ExpertiseSection, TechnologiesSection, ValuePropositionSection } from '@/components/marketing/services/sections';
+
+// Service card component with expandable sub-services
+const ServiceCard = ({
+ name,
+ description,
+ icon: Icon,
+ subServices,
+ route
+}: {
+ name: string;
+ description: string;
+ icon: LucideIcon;
+ subServices: Array<{
+ name: string;
+ description: string;
+ route: string;
+ icon?: LucideIcon;
+ }>;
+ route: string;
+}) => (
+
+
+
+
+ {subServices.map((subService, index) => (
+
+ {subService.icon && (
+
+
+
+ )}
+
+
{subService.name}
+
{subService.description}
+
+
+ ))}
+
+
+);
+
+const ServicesPage = () => {
+ return (
+
+
+ {/* Hero Section */}
+
+
+ Des solutions sur mesure pour vos projets digitaux
+
+
+
+ De la conception à la réalisation, nous vous accompagnons à chaque étape de votre projet avec expertise et passion.
+
+
+
+
+ Démarrer un projet
+
+
+
+
+
+
+
+ {/* Proposition de valeur */}
+
+
+ {/* Services Grid */}
+
+ {Services.map((service) => (
+
+ ))}
+
+
+ {/* Expertise et chiffres clés */}
+
+
+ {/* Technologies */}
+
+
+
+ Notre stack technologique
+
+
+ Nous maîtrisons un large éventail de technologies modernes pour répondre à tous vos besoins.
+
+
+
+
+
+ {/* Notre processus */}
+
+
+
+ Notre processus de travail
+
+
+ Une méthodologie éprouvée et flexible pour mener votre projet vers le succès.
+
+
+
+
+
+
+ {/* Consulting */}
+
+
+
+ );
+};
+
+export default ServicesPage;
\ No newline at end of file
diff --git a/src/screens/marketing/services/timeline.tsx b/src/screens/marketing/services/timeline.tsx
new file mode 100644
index 000000000..52fb66c5f
--- /dev/null
+++ b/src/screens/marketing/services/timeline.tsx
@@ -0,0 +1,180 @@
+"use client";
+
+import React, { useEffect, useRef, useState } from 'react';
+import { Badge } from "@/components/ui/badge";
+import { cn } from "@/lib/utils";
+
+const ProjectTimeline = () => {
+ const phases = [
+ {
+ title: "Prise de contact initiale",
+ description: "Première rencontre pour comprendre vos besoins et établir une relation de confiance. Nous recueillons les informations essentielles sur votre projet, vos objectifs, et vos attentes.",
+ adaptable: true
+ },
+ {
+ title: "Kickoff & Découverte",
+ description: "Clarification approfondie des objectifs, attentes, et contraintes du projet. Discussion des choix technologiques et établissement d'un planning prévisionnel.",
+ adaptable: true,
+ optional: false
+ },
+ {
+ title: "Proposition et devis",
+ description: "Élaboration d'une proposition détaillée incluant la vision, les étapes clés, et la méthodologie. Présentation d'un devis précis et des modalités de paiement.",
+ adaptable: true
+ },
+ {
+ title: "Recherche et idéation",
+ description: "Exploration et définition de la direction créative. Création de moodboards, d'esquisses ou de wireframes pour valider les concepts initiaux.",
+ adaptable: true,
+ optional: true
+ },
+ {
+ title: "Design UI/UX",
+ description: "Conception des interfaces et de l'expérience utilisateur. Itérations régulières basées sur vos retours pour aboutir à un design final validé.",
+ adaptable: true,
+ optional: true
+ },
+ {
+ title: "Développement",
+ description: "Transformation du design en produit fonctionnel avec des points de contrôle réguliers. Tests intermédiaires pour garantir la qualité.",
+ adaptable: true
+ },
+ {
+ title: "Tests et ajustements",
+ description: "Tests approfondis sur différents supports, correction des bugs et ajustements selon les retours. Validation finale avant mise en production.",
+ adaptable: true
+ },
+ {
+ title: "Mise en production",
+ description: "Déploiement du projet, formation des utilisateurs si nécessaire, et fourniture de la documentation. Support post-livraison pour une transition en douceur.",
+ adaptable: true
+ },
+ {
+ title: "Suivi et maintenance",
+ description: "Accompagnement continu pour garantir le succès de votre projet, avec des points de suivi réguliers et des optimisations continues.",
+ adaptable: true,
+ optional: true
+ }
+ ];
+
+ const [path, setPath] = useState("");
+ const timelineRef = useRef(null);
+ const pointRefs = useRef>([]);
+
+ useEffect(() => {
+ const calculatePath = () => {
+ if (!timelineRef.current) return;
+
+ const validPointRefs = pointRefs.current.filter((ref): ref is HTMLDivElement => ref !== null);
+ if (validPointRefs.length === 0) return;
+
+ const points = validPointRefs.map(ref => {
+ const rect = ref.getBoundingClientRect();
+ const timelineRect = timelineRef.current!.getBoundingClientRect();
+ return {
+ x: rect.left - timelineRect.left + rect.width / 2,
+ y: rect.top - timelineRect.top + rect.height / 2
+ };
+ });
+
+ let svgPath = `M ${points[0].x} ${points[0].y}`;
+
+ for (let i = 0; i < points.length - 1; i++) {
+ const current = points[i];
+ const next = points[i + 1];
+ const midY = (current.y + next.y) / 2;
+
+ svgPath += ` C ${current.x} ${midY}, ${next.x} ${midY}, ${next.x} ${next.y}`;
+ }
+
+ setPath(svgPath);
+ };
+
+ calculatePath();
+ window.addEventListener('resize', calculatePath);
+ return () => window.removeEventListener('resize', calculatePath);
+ }, []);
+
+ return (
+
+
+
+ Ce processus représente notre approche idéale, mais nous l'adaptons toujours à vos besoins et contraintes spécifiques.
+ Certaines étapes peuvent être ajustées ou ignorées selon votre situation.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {phases.map((phase, index) => (
+
+
{
+ pointRefs.current[index] = el;
+ }}
+ className={cn(
+ "relative flex-none w-8 h-8 mt-2",
+ // Ajout d'un décalage sur mobile aussi
+ index % 2 === 0 ? "ml-0" : "-ml-4",
+ "md:ml-0"
+ )}
+ >
+
+
+
+
+
+
+
+ {phase.title}
+
+ {phase.optional && (
+ Optionnel
+ )}
+
+
+ {phase.description}
+
+
+
+ ))}
+
+
+
+ );
+};
+
+export default ProjectTimeline;
\ No newline at end of file
diff --git a/src/types/service.ts b/src/types/service.ts
new file mode 100644
index 000000000..e01ef2fd6
--- /dev/null
+++ b/src/types/service.ts
@@ -0,0 +1,24 @@
+import { LucideIcon } from "lucide-react";
+
+export enum ServiceCategory {
+ DESIGN = "design",
+ INTEGRATION = "integration",
+ FRONTEND = "frontend",
+ BACKEND = "backend",
+}
+
+export interface SubService {
+ id: string;
+ name: string;
+ description: string;
+ route: string;
+ icon?: LucideIcon;
+}
+
+export interface Service {
+ id: ServiceCategory;
+ name: string;
+ description: string;
+ icon: LucideIcon;
+ subServices: SubService[];
+}
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
index 15e02e046..85f0dfb8f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -445,6 +445,35 @@
resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.1.tgz#fc169732d755c7fbad33ba8d0cd7fd10c90dc8e3"
integrity sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==
+"@radix-ui/react-accordion@^1.2.3":
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-accordion/-/react-accordion-1.2.3.tgz#7768a2d2daea18e5c09809f2c4b8097448ee2ff7"
+ integrity sha512-RIQ15mrcvqIkDARJeERSuXSry2N8uYnxkdDetpfmalT/+0ntOXLkFOsh9iwlAsCv+qcmhZjbdJogIm6WBa6c4A==
+ dependencies:
+ "@radix-ui/primitive" "1.1.1"
+ "@radix-ui/react-collapsible" "1.1.3"
+ "@radix-ui/react-collection" "1.1.2"
+ "@radix-ui/react-compose-refs" "1.1.1"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-direction" "1.1.0"
+ "@radix-ui/react-id" "1.1.0"
+ "@radix-ui/react-primitive" "2.0.2"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+
+"@radix-ui/react-collapsible@1.1.3":
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@radix-ui/react-collapsible/-/react-collapsible-1.1.3.tgz#522a5749646b7a393c9e9049165a9a6dfa924e91"
+ integrity sha512-jFSerheto1X03MUC0g6R7LedNW9EEGWdg9W1+MlpkMLwGkgkbUXLPBH/KIuWKXUoeYRVY11llqbTBDzuLg7qrw==
+ dependencies:
+ "@radix-ui/primitive" "1.1.1"
+ "@radix-ui/react-compose-refs" "1.1.1"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-id" "1.1.0"
+ "@radix-ui/react-presence" "1.1.2"
+ "@radix-ui/react-primitive" "2.0.2"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+ "@radix-ui/react-use-layout-effect" "1.1.0"
+
"@radix-ui/react-collection@1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.1.2.tgz#b45eccca1cb902fd078b237316bd9fa81e621e15"