create-snapify-app 0.0.0-stage → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (614) hide show
  1. package/LICENSE.md +24 -0
  2. package/README.md +55 -2
  3. package/bin/create-snapify-app.mjs +174 -0
  4. package/lib/args.mjs +59 -0
  5. package/lib/copy.mjs +44 -0
  6. package/lib/env.mjs +84 -0
  7. package/lib/prompt.mjs +63 -0
  8. package/package.json +33 -4
  9. package/template/.env.example +79 -0
  10. package/template/.github/workflows/ci.yml +23 -0
  11. package/template/.github/workflows/deploy.yml +26 -0
  12. package/template/.github/workflows/ping.yml +8 -0
  13. package/template/.github/workflows/release.yml +67 -0
  14. package/template/.snapify-install.json +5 -0
  15. package/template/CHANGELOG.md +28 -0
  16. package/template/LICENSE +14 -0
  17. package/template/README.md +287 -0
  18. package/template/administrator.html +23 -0
  19. package/template/apps/client/src/App.tsx +765 -0
  20. package/template/apps/client/src/auth.css +400 -0
  21. package/template/apps/client/src/lib/api.ts +22 -0
  22. package/template/apps/client/src/main.tsx +20 -0
  23. package/template/apps/community/src/App.tsx +592 -0
  24. package/template/apps/community/src/main.tsx +20 -0
  25. package/template/apps/community/src/styles.css +24 -0
  26. package/template/apps/developers/src/App.tsx +643 -0
  27. package/template/apps/developers/src/main.tsx +17 -0
  28. package/template/apps/developers/src/pages.tsx +1587 -0
  29. package/template/apps/developers/src/styles.css +98 -0
  30. package/template/apps/developers/src/ui.tsx +179 -0
  31. package/template/apps/landing/src/App.tsx +598 -0
  32. package/template/apps/landing/src/LegalPages.tsx +158 -0
  33. package/template/apps/landing/src/OrderPage.tsx +381 -0
  34. package/template/apps/landing/src/SeoPages.tsx +923 -0
  35. package/template/apps/landing/src/copy.ts +195 -0
  36. package/template/apps/landing/src/main.tsx +20 -0
  37. package/template/apps/landing/src/styles.css +803 -0
  38. package/template/apps/landing/src/types.ts +19 -0
  39. package/template/apps/marketplace/src/App.tsx +1229 -0
  40. package/template/apps/marketplace/src/developer/DeveloperApp.tsx +1266 -0
  41. package/template/apps/marketplace/src/main.tsx +20 -0
  42. package/template/apps/marketplace/src/styles.css +1001 -0
  43. package/template/apps/shared/AuthContext.tsx +65 -0
  44. package/template/apps/shared/Logo.tsx +33 -0
  45. package/template/apps/shared/api.ts +47 -0
  46. package/template/apps/shared/ui.tsx +128 -0
  47. package/template/apps/superadmin/src/App.tsx +1264 -0
  48. package/template/apps/superadmin/src/lib/api.ts +20 -0
  49. package/template/apps/superadmin/src/lib/hooks.ts +20 -0
  50. package/template/apps/superadmin/src/main.tsx +16 -0
  51. package/template/apps/superadmin/src/pages/ClientsPage.tsx +185 -0
  52. package/template/apps/superadmin/src/pages/InvoicesPage.tsx +157 -0
  53. package/template/apps/superadmin/src/pages/NewsletterPage.tsx +212 -0
  54. package/template/apps/superadmin/src/pages/OrdersPage.tsx +195 -0
  55. package/template/apps/superadmin/src/pages/PaymentsPage.tsx +150 -0
  56. package/template/apps/superadmin/src/pages/PayoutsPage.tsx +133 -0
  57. package/template/apps/superadmin/src/pages/PublishersPage.tsx +151 -0
  58. package/template/apps/superadmin/src/pages/SeoControlPage.tsx +692 -0
  59. package/template/apps/superadmin/src/pages/SettingsPage.tsx +199 -0
  60. package/template/apps/superadmin/src/pages/SystemPage.tsx +109 -0
  61. package/template/apps/superadmin/src/pages/TicketsPage.tsx +201 -0
  62. package/template/apps/superadmin/src/pages/UsersPage.tsx +167 -0
  63. package/template/client.html +21 -0
  64. package/template/community/hamdiayari/akhbar/README.md +23 -0
  65. package/template/community/hamdiayari/akhbar/screenshot.jpg +0 -0
  66. package/template/community/hamdiayari/akhbar/snapify.theme.json +76 -0
  67. package/template/community/hamdiayari/akhbar/src/Brand.tsx +26 -0
  68. package/template/community/hamdiayari/akhbar/src/Footer.tsx +182 -0
  69. package/template/community/hamdiayari/akhbar/src/Header.tsx +191 -0
  70. package/template/community/hamdiayari/akhbar/src/Layout.tsx +49 -0
  71. package/template/community/hamdiayari/akhbar/src/Social.tsx +33 -0
  72. package/template/community/hamdiayari/akhbar/src/Ticker.tsx +86 -0
  73. package/template/community/hamdiayari/akhbar/src/Views.tsx +285 -0
  74. package/template/community/hamdiayari/akhbar/src/blocks/CollectionBlocks.tsx +672 -0
  75. package/template/community/hamdiayari/akhbar/src/blocks/ContentBlocks.tsx +305 -0
  76. package/template/community/hamdiayari/akhbar/src/blocks/ConversionBlocks.tsx +569 -0
  77. package/template/community/hamdiayari/akhbar/src/blocks/HeaderBlocks.tsx +287 -0
  78. package/template/community/hamdiayari/akhbar/src/index.tsx +51 -0
  79. package/template/community/hamdiayari/akhbar/src/kit.tsx +357 -0
  80. package/template/community/hamdiayari/akhbar/src/site.ts +96 -0
  81. package/template/community/hamdiayari/akhbar/src/styles.css +566 -0
  82. package/template/community/hamdiayari/akhbar-actualites/README.md +28 -0
  83. package/template/community/hamdiayari/akhbar-actualites/screenshot.jpg +0 -0
  84. package/template/community/hamdiayari/akhbar-actualites/snapify.module.json +107 -0
  85. package/template/community/hamdiayari/akhbar-actualites/src/admin/AudiencePage.tsx +185 -0
  86. package/template/community/hamdiayari/akhbar-actualites/src/admin/index.tsx +11 -0
  87. package/template/community/hamdiayari/akhbar-actualites/src/public/Archive.tsx +142 -0
  88. package/template/community/hamdiayari/akhbar-actualites/src/public/cards.tsx +152 -0
  89. package/template/community/hamdiayari/akhbar-actualites/src/public/index.tsx +71 -0
  90. package/template/community/hamdiayari/akhbar-actualites/src/public/posts.ts +103 -0
  91. package/template/community/hamdiayari/akhbar-actualites/src/public/styles.css +568 -0
  92. package/template/community/hamdiayari/akhbar-actualites/src/public/widgets.tsx +226 -0
  93. package/template/community/hamdiayari/akhbar-actualites/src/server.ts +119 -0
  94. package/template/community/hamdiayari/akhbar-actualites/src/types.ts +25 -0
  95. package/template/community/hamdiayari/akhbar-urgent/README.md +36 -0
  96. package/template/community/hamdiayari/akhbar-urgent/screenshot.jpg +0 -0
  97. package/template/community/hamdiayari/akhbar-urgent/snapify.module.json +64 -0
  98. package/template/community/hamdiayari/akhbar-urgent/src/admin/FlashesPage.tsx +229 -0
  99. package/template/community/hamdiayari/akhbar-urgent/src/admin/index.tsx +11 -0
  100. package/template/community/hamdiayari/akhbar-urgent/src/public/Ticker.tsx +81 -0
  101. package/template/community/hamdiayari/akhbar-urgent/src/public/index.tsx +63 -0
  102. package/template/community/hamdiayari/akhbar-urgent/src/public/styles.css +142 -0
  103. package/template/community/hamdiayari/akhbar-urgent/src/server.ts +101 -0
  104. package/template/community/hamdiayari/akhbar-urgent/src/types.ts +35 -0
  105. package/template/community.html +21 -0
  106. package/template/developers.html +24 -0
  107. package/template/docker-compose.db.yml +24 -0
  108. package/template/docs/BACKOFFICE_SNAPIFY.md +130 -0
  109. package/template/docs/CI_CD.md +66 -0
  110. package/template/docs/MODULES.md +346 -0
  111. package/template/docs/PLATFORM_DEPLOY.md +54 -0
  112. package/template/docs/logo.svg +10 -0
  113. package/template/drizzle/0000_init.sql +147 -0
  114. package/template/drizzle/0001_page_project.sql +5 -0
  115. package/template/drizzle/0002_modules.sql +23 -0
  116. package/template/drizzle/0003_themes.sql +4 -0
  117. package/template/drizzle/0004_security.sql +82 -0
  118. package/template/drizzle/0005_module_records.sql +16 -0
  119. package/template/drizzle/0006_avatars.sql +4 -0
  120. package/template/drizzle/0007_platform.sql +264 -0
  121. package/template/drizzle/0008_mp_validation.sql +3 -0
  122. package/template/drizzle/0009_saas_ops.sql +77 -0
  123. package/template/drizzle/0010_cms_chrome.sql +13 -0
  124. package/template/drizzle/0011_client_portal.sql +26 -0
  125. package/template/drizzle/meta/0000_snapshot.json +998 -0
  126. package/template/drizzle/meta/0001_snapshot.json +1004 -0
  127. package/template/drizzle/meta/_journal.json +90 -0
  128. package/template/drizzle.config.ts +16 -0
  129. package/template/ecosystem.snapify.cjs +24 -0
  130. package/template/for.html +1 -0
  131. package/template/index.html +29 -0
  132. package/template/landing.html +37 -0
  133. package/template/marketplace/catalog.json +373 -0
  134. package/template/marketplace/gallery/hamdiayari.preveris/01-home.jpg +0 -0
  135. package/template/marketplace/gallery/hamdiayari.recaptcha/01-reglages.jpg +0 -0
  136. package/template/marketplace/gallery/hamdiayari.recaptcha/02-logo.jpg +0 -0
  137. package/template/marketplace/gallery/novalabs.ai-articles/01-generer.jpg +0 -0
  138. package/template/marketplace/gallery/novalabs.ai-articles/02-fournisseur-ia.jpg +0 -0
  139. package/template/marketplace/gallery/novalabs.calendar/01-agenda-site.jpg +0 -0
  140. package/template/marketplace/gallery/novalabs.calendar/02-evenements-admin.jpg +0 -0
  141. package/template/marketplace/gallery/novalabs.calendar/03-reglages.jpg +0 -0
  142. package/template/marketplace/screenshots/hamdiayari.preveris-1.0.6.jpg +0 -0
  143. package/template/marketplace/screenshots/hamdiayari.recaptcha-1.0.0.jpg +0 -0
  144. package/template/marketplace/screenshots/hamdiayari.wp-seo-migrator-1.1.1.jpg +0 -0
  145. package/template/marketplace/screenshots/novalabs.ai-articles-1.0.1.jpg +0 -0
  146. package/template/marketplace/screenshots/novalabs.ai-chat-1.0.1.jpg +0 -0
  147. package/template/marketplace/screenshots/novalabs.calendar-1.0.1.jpg +0 -0
  148. package/template/marketplace/screenshots/novalabs.cart-1.0.0.jpg +0 -0
  149. package/template/marketplace/screenshots/novalabs.checkout-1.0.0.jpg +0 -0
  150. package/template/marketplace/screenshots/novalabs.customers-1.1.0.jpg +0 -0
  151. package/template/marketplace/screenshots/novalabs.dogga-1.0.0.jpg +0 -0
  152. package/template/marketplace/screenshots/novalabs.mahdia-1.0.0.jpg +0 -0
  153. package/template/marketplace/screenshots/novalabs.shop-1.0.0.jpg +0 -0
  154. package/template/marketplace/screenshots/novalabs.sidibou-1.0.0.jpg +0 -0
  155. package/template/marketplace/screenshots/novalabs.whatsapp-1.0.1.jpg +0 -0
  156. package/template/marketplace.html +21 -0
  157. package/template/metadata.json +7 -0
  158. package/template/modules/ai-articles/screenshot.jpg +0 -0
  159. package/template/modules/ai-articles/snapify.module.json +74 -0
  160. package/template/modules/ai-articles/src/admin/ArticlesPage.tsx +162 -0
  161. package/template/modules/ai-articles/src/admin/GeneratePage.tsx +118 -0
  162. package/template/modules/ai-articles/src/admin/index.tsx +12 -0
  163. package/template/modules/ai-articles/src/public/index.tsx +119 -0
  164. package/template/modules/ai-articles/src/server.ts +287 -0
  165. package/template/modules/ai-articles/src/types.ts +30 -0
  166. package/template/modules/ai-chat/screenshot.jpg +0 -0
  167. package/template/modules/ai-chat/snapify.module.json +217 -0
  168. package/template/modules/ai-chat/src/public.tsx +198 -0
  169. package/template/modules/ai-chat/src/server.ts +142 -0
  170. package/template/modules/ai-theme-studio/README.md +15 -0
  171. package/template/modules/ai-theme-studio/screenshot.jpg +0 -0
  172. package/template/modules/ai-theme-studio/snapify.module.json +175 -0
  173. package/template/modules/ai-theme-studio/src/admin/HistoryPage.tsx +91 -0
  174. package/template/modules/ai-theme-studio/src/admin/StudioPage.tsx +414 -0
  175. package/template/modules/ai-theme-studio/src/admin/index.tsx +11 -0
  176. package/template/modules/ai-theme-studio/src/lib/images.ts +240 -0
  177. package/template/modules/ai-theme-studio/src/lib/llm.ts +123 -0
  178. package/template/modules/ai-theme-studio/src/lib/normalize.ts +714 -0
  179. package/template/modules/ai-theme-studio/src/lib/prompts.ts +198 -0
  180. package/template/modules/ai-theme-studio/src/server.ts +137 -0
  181. package/template/modules/ai-theme-studio/src/types.ts +112 -0
  182. package/template/modules/calendar/screenshot.jpg +0 -0
  183. package/template/modules/calendar/snapify.module.json +45 -0
  184. package/template/modules/calendar/src/admin/EventsPage.tsx +217 -0
  185. package/template/modules/calendar/src/admin/index.tsx +11 -0
  186. package/template/modules/calendar/src/public/index.tsx +231 -0
  187. package/template/modules/calendar/src/server.ts +143 -0
  188. package/template/modules/calendar/src/types.ts +25 -0
  189. package/template/modules/cart/screenshot.jpg +0 -0
  190. package/template/modules/cart/snapify.module.json +90 -0
  191. package/template/modules/cart/src/admin/index.tsx +265 -0
  192. package/template/modules/cart/src/public/CartPage.tsx +198 -0
  193. package/template/modules/cart/src/public/index.tsx +261 -0
  194. package/template/modules/cart/src/public/useQuote.ts +67 -0
  195. package/template/modules/cart/src/server.ts +148 -0
  196. package/template/modules/cart/src/types.ts +31 -0
  197. package/template/modules/checkout/screenshot.jpg +0 -0
  198. package/template/modules/checkout/snapify.module.json +264 -0
  199. package/template/modules/checkout/src/admin/OrderDetailPage.tsx +304 -0
  200. package/template/modules/checkout/src/admin/badges.tsx +28 -0
  201. package/template/modules/checkout/src/admin/index.tsx +236 -0
  202. package/template/modules/checkout/src/public/CheckoutPage.tsx +461 -0
  203. package/template/modules/checkout/src/public/OrderPages.tsx +153 -0
  204. package/template/modules/checkout/src/public/index.tsx +23 -0
  205. package/template/modules/checkout/src/server.ts +383 -0
  206. package/template/modules/checkout/src/types.ts +70 -0
  207. package/template/modules/customers/screenshot.jpg +0 -0
  208. package/template/modules/customers/snapify.module.json +115 -0
  209. package/template/modules/customers/src/admin/CustomerDetailPage.tsx +274 -0
  210. package/template/modules/customers/src/admin/index.tsx +194 -0
  211. package/template/modules/customers/src/public/AccountPages.tsx +470 -0
  212. package/template/modules/customers/src/public/AddressForm.tsx +115 -0
  213. package/template/modules/customers/src/public/AuthPages.tsx +349 -0
  214. package/template/modules/customers/src/public/Avatar.tsx +29 -0
  215. package/template/modules/customers/src/public/ProfileSection.tsx +291 -0
  216. package/template/modules/customers/src/public/index.tsx +137 -0
  217. package/template/modules/customers/src/public/session.ts +51 -0
  218. package/template/modules/customers/src/server.ts +421 -0
  219. package/template/modules/customers/src/types.ts +53 -0
  220. package/template/modules/recaptcha/logo.jpg +0 -0
  221. package/template/modules/recaptcha/screenshot.jpg +0 -0
  222. package/template/modules/recaptcha/snapify.module.json +99 -0
  223. package/template/modules/recaptcha/src/public/index.tsx +94 -0
  224. package/template/modules/recaptcha/src/server.ts +65 -0
  225. package/template/modules/recaptcha/src/types.ts +18 -0
  226. package/template/modules/shop/screenshot.jpg +0 -0
  227. package/template/modules/shop/snapify.module.json +340 -0
  228. package/template/modules/shop/src/admin/CategoriesPage.tsx +224 -0
  229. package/template/modules/shop/src/admin/ProductEditor.tsx +313 -0
  230. package/template/modules/shop/src/admin/ProductsPage.tsx +307 -0
  231. package/template/modules/shop/src/admin/index.tsx +14 -0
  232. package/template/modules/shop/src/public/Catalog.tsx +244 -0
  233. package/template/modules/shop/src/public/NotFound.tsx +22 -0
  234. package/template/modules/shop/src/public/ProductPage.tsx +195 -0
  235. package/template/modules/shop/src/public/index.tsx +134 -0
  236. package/template/modules/shop/src/public/useFetch.ts +26 -0
  237. package/template/modules/shop/src/server.ts +493 -0
  238. package/template/modules/shop/src/shared.ts +41 -0
  239. package/template/modules/shop/src/types.ts +60 -0
  240. package/template/modules/whatsapp/screenshot.jpg +0 -0
  241. package/template/modules/whatsapp/snapify.module.json +121 -0
  242. package/template/modules/whatsapp/src/public.tsx +119 -0
  243. package/template/modules/wp-seo-migrator/ARCHITECTURE.md +113 -0
  244. package/template/modules/wp-seo-migrator/README.md +21 -0
  245. package/template/modules/wp-seo-migrator/fixtures/aioseo-sample.csv +3 -0
  246. package/template/modules/wp-seo-migrator/fixtures/sample-exporter.json +39 -0
  247. package/template/modules/wp-seo-migrator/fixtures/sample-page.html +12 -0
  248. package/template/modules/wp-seo-migrator/fixtures/sample.htaccess +3 -0
  249. package/template/modules/wp-seo-migrator/screenshot.jpg +0 -0
  250. package/template/modules/wp-seo-migrator/snapify.module.json +87 -0
  251. package/template/modules/wp-seo-migrator/src/admin/HistoryPage.tsx +64 -0
  252. package/template/modules/wp-seo-migrator/src/admin/WizardPage.tsx +788 -0
  253. package/template/modules/wp-seo-migrator/src/admin/i18n.ts +156 -0
  254. package/template/modules/wp-seo-migrator/src/admin/index.tsx +11 -0
  255. package/template/modules/wp-seo-migrator/src/connectors/CUSTOM_CONNECTOR.md +31 -0
  256. package/template/modules/wp-seo-migrator/src/connectors/csvSeoFactory.ts +106 -0
  257. package/template/modules/wp-seo-migrator/src/connectors/exporter.ts +96 -0
  258. package/template/modules/wp-seo-migrator/src/connectors/gscCsv.ts +53 -0
  259. package/template/modules/wp-seo-migrator/src/connectors/htaccess.ts +65 -0
  260. package/template/modules/wp-seo-migrator/src/connectors/htmlCrawler.ts +90 -0
  261. package/template/modules/wp-seo-migrator/src/connectors/index.ts +113 -0
  262. package/template/modules/wp-seo-migrator/src/connectors/pluginCsv.ts +77 -0
  263. package/template/modules/wp-seo-migrator/src/connectors/rankMathCsv.ts +77 -0
  264. package/template/modules/wp-seo-migrator/src/connectors/redirection.ts +62 -0
  265. package/template/modules/wp-seo-migrator/src/connectors/sitemap.ts +44 -0
  266. package/template/modules/wp-seo-migrator/src/connectors/utils.ts +111 -0
  267. package/template/modules/wp-seo-migrator/src/connectors/wxr.ts +103 -0
  268. package/template/modules/wp-seo-migrator/src/connectors/yoastCsv.ts +56 -0
  269. package/template/modules/wp-seo-migrator/src/pipeline/analyze.ts +158 -0
  270. package/template/modules/wp-seo-migrator/src/pipeline/htmlParse.ts +58 -0
  271. package/template/modules/wp-seo-migrator/src/pipeline/remoteAuto.ts +328 -0
  272. package/template/modules/wp-seo-migrator/src/server.ts +492 -0
  273. package/template/modules/wp-seo-migrator/src/types.ts +151 -0
  274. package/template/modules/wp-seo-migrator/tests/connectors-extra.test.ts +39 -0
  275. package/template/modules/wp-seo-migrator/tests/merge.test.ts +25 -0
  276. package/template/package-lock.json +6016 -0
  277. package/template/package.json +74 -0
  278. package/template/public/images/photos/caravane-chameaux-desert.webp +0 -0
  279. package/template/public/images/photos/hammamet-medina-plage.jpg +0 -0
  280. package/template/public/images/photos/maison-campagne-collines.webp +0 -0
  281. package/template/public/images/photos/maisons-troglodytes-desert.jpg +0 -0
  282. package/template/public/images/photos/panorama-ville.jpg +0 -0
  283. package/template/public/images/photos/preveris-accessibilite-erp.jpg +0 -0
  284. package/template/public/images/photos/preveris-collectivites.jpg +0 -0
  285. package/template/public/images/photos/preveris-etudes-plans.jpg +0 -0
  286. package/template/public/images/photos/preveris-hero-erp.jpg +0 -0
  287. package/template/public/images/photos/preveris-ssi-incendie.jpg +0 -0
  288. package/template/public/images/photos/preveris-suivi-hotel.jpg +0 -0
  289. package/template/public/images/photos/ruelle-bleue-medina.jpg +0 -0
  290. package/template/public/images/photos/sidi-bou-said-port.webp +0 -0
  291. package/template/public/images/photos/terrasse-blanche-mer-voilier.jpg +0 -0
  292. package/template/public/landing/hero-ai-cms.jpg +0 -0
  293. package/template/public/landing/shot-dogga.jpg +0 -0
  294. package/template/public/landing/shot-mahdia.jpg +0 -0
  295. package/template/public/landing/shot-sidibou.jpg +0 -0
  296. package/template/public/llms.txt +35 -0
  297. package/template/public/logo.svg +10 -0
  298. package/template/scripts/app-pack.ts +155 -0
  299. package/template/scripts/app-publish.ts +100 -0
  300. package/template/scripts/apply-ecommerce-home.ts +196 -0
  301. package/template/scripts/auto-deploy-poll.sh +13 -0
  302. package/template/scripts/db-backup.sh +16 -0
  303. package/template/scripts/db-restore.sh +11 -0
  304. package/template/scripts/deploy.sh +34 -0
  305. package/template/scripts/github-webhook-deploy.sh +7 -0
  306. package/template/scripts/install-new-modules.ts +96 -0
  307. package/template/scripts/refresh-demo-baseline.ts +9 -0
  308. package/template/scripts/reinstall-marketplace-packs.ts +51 -0
  309. package/template/scripts/restore-classic-home.ts +13 -0
  310. package/template/scripts/sdk-pack.ts +289 -0
  311. package/template/scripts/sdk-publish.ts +75 -0
  312. package/template/scripts/seed-demo-products.ts +120 -0
  313. package/template/scripts/seed-theme-content-packs.ts +42 -0
  314. package/template/scripts/snapify-module.ts +207 -0
  315. package/template/scripts/test-theme-switch.ts +24 -0
  316. package/template/sdk/admin.css +18 -0
  317. package/template/sdk/admin.ts +95 -0
  318. package/template/sdk/build.ts +249 -0
  319. package/template/sdk/commerce.ts +512 -0
  320. package/template/sdk/content.ts +76 -0
  321. package/template/sdk/icons.ts +101 -0
  322. package/template/sdk/image.ts +60 -0
  323. package/template/sdk/index.ts +500 -0
  324. package/template/sdk/package.ts +298 -0
  325. package/template/sdk/recaptcha.tsx +122 -0
  326. package/template/sdk/settings.ts +84 -0
  327. package/template/sdk/theme.css +29 -0
  328. package/template/sdk/theme.ts +100 -0
  329. package/template/sdk/ui/commerce.tsx +385 -0
  330. package/template/sdk/ui/orders.tsx +136 -0
  331. package/template/sdk-kit/CHANGELOG.md +17 -0
  332. package/template/sdk-kit/LICENSE.md +47 -0
  333. package/template/sdk-kit/README.md +81 -0
  334. package/template/sdk-kit/cli.ts +339 -0
  335. package/template/sdk-kit/create-snapify/README.md +28 -0
  336. package/template/sdk-kit/create-snapify/create-snapify.mjs +11 -0
  337. package/template/sdk-kit/create-snapify/package.template.json +16 -0
  338. package/template/sdk-kit/package.template.json +95 -0
  339. package/template/sdk-kit/templates/common/README.md.tpl +27 -0
  340. package/template/sdk-kit/templates/common/_gitignore +3 -0
  341. package/template/sdk-kit/templates/common/package.json.tpl +19 -0
  342. package/template/sdk-kit/templates/common/src/snapify-env.d.ts +2 -0
  343. package/template/sdk-kit/templates/common/tsconfig.json +15 -0
  344. package/template/sdk-kit/templates/module/snapify.module.json.tpl +33 -0
  345. package/template/sdk-kit/templates/module/src/admin.tsx +53 -0
  346. package/template/sdk-kit/templates/module/src/public.tsx +49 -0
  347. package/template/sdk-kit/templates/module/src/server.ts +30 -0
  348. package/template/sdk-kit/templates/module/src/types.ts +19 -0
  349. package/template/sdk-kit/templates/theme/snapify.theme.json.tpl +22 -0
  350. package/template/sdk-kit/templates/theme/src/Footer.tsx +40 -0
  351. package/template/sdk-kit/templates/theme/src/Header.tsx +47 -0
  352. package/template/sdk-kit/templates/theme/src/Views.tsx +36 -0
  353. package/template/sdk-kit/templates/theme/src/blocks.tsx +93 -0
  354. package/template/sdk-kit/templates/theme/src/index.tsx +30 -0
  355. package/template/sdk-kit/templates/theme/src/site.tsx +59 -0
  356. package/template/sdk-kit/templates/theme/src/styles.css +71 -0
  357. package/template/server/client/routes.ts +252 -0
  358. package/template/server/cms/analyticsStore.ts +180 -0
  359. package/template/server/cms/auth.ts +155 -0
  360. package/template/server/cms/blockCatalog.ts +342 -0
  361. package/template/server/cms/blocks.ts +521 -0
  362. package/template/server/cms/contentMigration.ts +1119 -0
  363. package/template/server/cms/defaults.ts +303 -0
  364. package/template/server/cms/permissions.ts +154 -0
  365. package/template/server/cms/restoreClassicHome.ts +183 -0
  366. package/template/server/cms/revisions.ts +99 -0
  367. package/template/server/cms/scheduler.ts +78 -0
  368. package/template/server/cms/seed.ts +72 -0
  369. package/template/server/cms/seoAnalyzer.ts +213 -0
  370. package/template/server/cms/store.ts +122 -0
  371. package/template/server/cms/themeContent.ts +1386 -0
  372. package/template/server/cms/themePacks/sidibou-branding.json +1 -0
  373. package/template/server/cms/themePacks/sidibou-home.json +1 -0
  374. package/template/server/cms/themePacks/sidibou-menus.json +1 -0
  375. package/template/server/cms/types.ts +432 -0
  376. package/template/server/community/routes.ts +410 -0
  377. package/template/server/db/client.ts +43 -0
  378. package/template/server/db/repository.ts +389 -0
  379. package/template/server/db/schema.ts +726 -0
  380. package/template/server/demo/cmsReset.ts +196 -0
  381. package/template/server/developers/sdk.ts +85 -0
  382. package/template/server/geoip.ts +15 -0
  383. package/template/server/http.ts +53 -0
  384. package/template/server/mail.ts +216 -0
  385. package/template/server/marketplace/catalog.ts +74 -0
  386. package/template/server/marketplace/packageValidate.ts +475 -0
  387. package/template/server/marketplace/payments.ts +193 -0
  388. package/template/server/marketplace/routes.ts +850 -0
  389. package/template/server/marketplace/signing.ts +116 -0
  390. package/template/server/marketplace/syncOfficial.ts +282 -0
  391. package/template/server/media/images.ts +63 -0
  392. package/template/server/middleware/adminAuth.ts +134 -0
  393. package/template/server/modules/legacy.ts +44 -0
  394. package/template/server/modules/manager.ts +1122 -0
  395. package/template/server/modules/marketplace.ts +178 -0
  396. package/template/server/modules/outbound.ts +178 -0
  397. package/template/server/modules/purchases.ts +149 -0
  398. package/template/server/modules/records.ts +168 -0
  399. package/template/server/modules/themeHtml.ts +32 -0
  400. package/template/server/modules/trust.ts +16 -0
  401. package/template/server/modules/types.ts +147 -0
  402. package/template/server/platform/auth.ts +223 -0
  403. package/template/server/platform/clientWelcome.ts +168 -0
  404. package/template/server/platform/clients.ts +139 -0
  405. package/template/server/platform/dailyImprove.ts +356 -0
  406. package/template/server/platform/flouci.ts +126 -0
  407. package/template/server/platform/host.ts +69 -0
  408. package/template/server/platform/hostingProviders.ts +143 -0
  409. package/template/server/platform/licenseOrders.ts +291 -0
  410. package/template/server/platform/money.ts +42 -0
  411. package/template/server/platform/passwords.ts +41 -0
  412. package/template/server/platform/region.ts +86 -0
  413. package/template/server/platform/routes.ts +225 -0
  414. package/template/server/platform/seed.ts +82 -0
  415. package/template/server/platform/settings.ts +72 -0
  416. package/template/server/routes/adminAccount.ts +403 -0
  417. package/template/server/routes/adminCms.ts +808 -0
  418. package/template/server/routes/adminSystem.ts +243 -0
  419. package/template/server/routes/adminUsers.ts +449 -0
  420. package/template/server/routes/googleOAuth.ts +327 -0
  421. package/template/server/routes/modules.ts +323 -0
  422. package/template/server/routes/publicCms.ts +313 -0
  423. package/template/server/routes/seoPublic.ts +158 -0
  424. package/template/server/security/accounts.ts +121 -0
  425. package/template/server/security/audit.ts +143 -0
  426. package/template/server/security/authTokens.ts +74 -0
  427. package/template/server/security/ip.ts +68 -0
  428. package/template/server/security/rateLimit.ts +85 -0
  429. package/template/server/security/retention.ts +46 -0
  430. package/template/server/security/secrets.ts +44 -0
  431. package/template/server/security/sessions.ts +140 -0
  432. package/template/server/security/totp.ts +101 -0
  433. package/template/server/superadmin/analytics.ts +109 -0
  434. package/template/server/superadmin/auth.ts +92 -0
  435. package/template/server/superadmin/backlinksCatalog.ts +210 -0
  436. package/template/server/superadmin/frSeoContent.ts +165 -0
  437. package/template/server/superadmin/landingSeo.ts +675 -0
  438. package/template/server/superadmin/ops.ts +238 -0
  439. package/template/server/superadmin/routes.ts +1095 -0
  440. package/template/server/superadmin/tnSeoContent.ts +130 -0
  441. package/template/server.ts +522 -0
  442. package/template/src/App.tsx +263 -0
  443. package/template/src/admin/AdminApp.tsx +162 -0
  444. package/template/src/admin/account/AuthLayout.tsx +57 -0
  445. package/template/src/admin/account/SecurityForms.tsx +276 -0
  446. package/template/src/admin/admin.css +127 -0
  447. package/template/src/admin/context/AuthContext.tsx +147 -0
  448. package/template/src/admin/context/SiteContext.tsx +50 -0
  449. package/template/src/admin/editor/BlockLibrary.tsx +173 -0
  450. package/template/src/admin/editor/BlocksPanel.tsx +396 -0
  451. package/template/src/admin/editor/EditorBits.tsx +106 -0
  452. package/template/src/admin/editor/PreviewFrame.tsx +145 -0
  453. package/template/src/admin/editor/RichTextEditor.tsx +276 -0
  454. package/template/src/admin/editor/SeoPanel.tsx +349 -0
  455. package/template/src/admin/editor/StyleEditor.tsx +114 -0
  456. package/template/src/admin/editor/blockSchemas.ts +699 -0
  457. package/template/src/admin/editor/fields.tsx +486 -0
  458. package/template/src/admin/layout/AdminShell.tsx +418 -0
  459. package/template/src/admin/layout/nav.ts +95 -0
  460. package/template/src/admin/lib/api.ts +408 -0
  461. package/template/src/admin/lib/audit.ts +141 -0
  462. package/template/src/admin/lib/format.ts +84 -0
  463. package/template/src/admin/lib/hooks.ts +125 -0
  464. package/template/src/admin/main.tsx +16 -0
  465. package/template/src/admin/modules/InstallDialog.tsx +160 -0
  466. package/template/src/admin/modules/SettingsForm.tsx +145 -0
  467. package/template/src/admin/modules/kit.tsx +127 -0
  468. package/template/src/admin/modules/labels.tsx +226 -0
  469. package/template/src/admin/pages/AccountSetupPage.tsx +62 -0
  470. package/template/src/admin/pages/AnalyticsPage.tsx +206 -0
  471. package/template/src/admin/pages/BrandingPage.tsx +154 -0
  472. package/template/src/admin/pages/DashboardPage.tsx +239 -0
  473. package/template/src/admin/pages/EngagementPage.tsx +168 -0
  474. package/template/src/admin/pages/FormsPage.tsx +435 -0
  475. package/template/src/admin/pages/GeneralPage.tsx +120 -0
  476. package/template/src/admin/pages/LoginPage.tsx +249 -0
  477. package/template/src/admin/pages/MaintenancePage.tsx +125 -0
  478. package/template/src/admin/pages/MarketplacePage.tsx +426 -0
  479. package/template/src/admin/pages/MediaPage.tsx +251 -0
  480. package/template/src/admin/pages/MenusPage.tsx +446 -0
  481. package/template/src/admin/pages/ModuleAdminPage.tsx +113 -0
  482. package/template/src/admin/pages/ModuleDetailPage.tsx +293 -0
  483. package/template/src/admin/pages/ModulesPage.tsx +135 -0
  484. package/template/src/admin/pages/NewsletterPage.tsx +193 -0
  485. package/template/src/admin/pages/PageEditorPage.tsx +322 -0
  486. package/template/src/admin/pages/PagesListPage.tsx +277 -0
  487. package/template/src/admin/pages/PostEditorPage.tsx +292 -0
  488. package/template/src/admin/pages/PostsListPage.tsx +187 -0
  489. package/template/src/admin/pages/ProfilePage.tsx +489 -0
  490. package/template/src/admin/pages/ResetPasswordPage.tsx +110 -0
  491. package/template/src/admin/pages/SeoPage.tsx +670 -0
  492. package/template/src/admin/pages/SettingsPage.tsx +189 -0
  493. package/template/src/admin/pages/ThemeCustomizePage.tsx +170 -0
  494. package/template/src/admin/pages/ThemesPage.tsx +292 -0
  495. package/template/src/admin/pages/UsersPage.tsx +57 -0
  496. package/template/src/admin/pages/WidgetsPage.tsx +200 -0
  497. package/template/src/admin/seo/GoogleSetup.tsx +529 -0
  498. package/template/src/admin/settings/EmailTab.tsx +293 -0
  499. package/template/src/admin/settings/OtherTabs.tsx +270 -0
  500. package/template/src/admin/settings/SecurityTab.tsx +172 -0
  501. package/template/src/admin/settings/controls.tsx +133 -0
  502. package/template/src/admin/ui/Pagination.tsx +170 -0
  503. package/template/src/admin/ui/SaveBar.tsx +77 -0
  504. package/template/src/admin/ui/TagInput.tsx +54 -0
  505. package/template/src/admin/ui/charts.tsx +108 -0
  506. package/template/src/admin/ui/media.tsx +265 -0
  507. package/template/src/admin/ui/overlays.tsx +239 -0
  508. package/template/src/admin/ui/primitives.tsx +544 -0
  509. package/template/src/admin/users/AuditTab.tsx +104 -0
  510. package/template/src/admin/users/RolesTab.tsx +368 -0
  511. package/template/src/admin/users/UsersTab.tsx +723 -0
  512. package/template/src/admin/users/shared.tsx +278 -0
  513. package/template/src/cms/icons.ts +7 -0
  514. package/template/src/components/CookieBanner.tsx +166 -0
  515. package/template/src/components/MaintenanceGate.tsx +66 -0
  516. package/template/src/components/SiteAnalytics.tsx +64 -0
  517. package/template/src/components/SnapifyLogo.tsx +44 -0
  518. package/template/src/components/cms/BlockRenderer.tsx +154 -0
  519. package/template/src/components/cms/WidgetArea.tsx +193 -0
  520. package/template/src/context/SiteConfigContext.tsx +130 -0
  521. package/template/src/demoBase.ts +23 -0
  522. package/template/src/index.css +90 -0
  523. package/template/src/main.tsx +16 -0
  524. package/template/src/modules/ModuleHost.tsx +197 -0
  525. package/template/src/preview.ts +63 -0
  526. package/template/src/runtime.ts +38 -0
  527. package/template/src/themes/ThemeHost.tsx +168 -0
  528. package/template/src/themes/fallback.tsx +71 -0
  529. package/template/src/types.ts +94 -0
  530. package/template/src/views/BlogPostView.tsx +68 -0
  531. package/template/src/views/CmsPageView.tsx +34 -0
  532. package/template/start-pm2.sh +3 -0
  533. package/template/superadmin.html +20 -0
  534. package/template/themes/ai-canvas/screenshot.jpg +0 -0
  535. package/template/themes/ai-canvas/snapify.theme.json +96 -0
  536. package/template/themes/ai-canvas/src/CeeSimulator.tsx +247 -0
  537. package/template/themes/ai-canvas/src/Footer.tsx +190 -0
  538. package/template/themes/ai-canvas/src/Header.tsx +324 -0
  539. package/template/themes/ai-canvas/src/Layout.tsx +56 -0
  540. package/template/themes/ai-canvas/src/NotFound.tsx +58 -0
  541. package/template/themes/ai-canvas/src/Post.tsx +26 -0
  542. package/template/themes/ai-canvas/src/SnapifyLogo.tsx +44 -0
  543. package/template/themes/ai-canvas/src/blocks/CollectionBlocks.tsx +711 -0
  544. package/template/themes/ai-canvas/src/blocks/ContentBlocks.tsx +318 -0
  545. package/template/themes/ai-canvas/src/blocks/ConversionBlocks.tsx +559 -0
  546. package/template/themes/ai-canvas/src/blocks/HeaderBlocks.tsx +341 -0
  547. package/template/themes/ai-canvas/src/index.tsx +54 -0
  548. package/template/themes/ai-canvas/src/kit.tsx +398 -0
  549. package/template/themes/ai-canvas/src/site.ts +29 -0
  550. package/template/themes/ai-canvas/src/styles.css +317 -0
  551. package/template/themes/dogga/screenshot.jpg +0 -0
  552. package/template/themes/dogga/snapify.theme.json +55 -0
  553. package/template/themes/dogga/src/Brand.tsx +41 -0
  554. package/template/themes/dogga/src/Footer.tsx +202 -0
  555. package/template/themes/dogga/src/Header.tsx +239 -0
  556. package/template/themes/dogga/src/Layout.tsx +43 -0
  557. package/template/themes/dogga/src/Views.tsx +71 -0
  558. package/template/themes/dogga/src/blocks/CollectionBlocks.tsx +674 -0
  559. package/template/themes/dogga/src/blocks/ContentBlocks.tsx +307 -0
  560. package/template/themes/dogga/src/blocks/ConversionBlocks.tsx +571 -0
  561. package/template/themes/dogga/src/blocks/HeaderBlocks.tsx +289 -0
  562. package/template/themes/dogga/src/index.tsx +53 -0
  563. package/template/themes/dogga/src/kit.tsx +362 -0
  564. package/template/themes/dogga/src/site.ts +56 -0
  565. package/template/themes/dogga/src/styles.css +396 -0
  566. package/template/themes/mahdia/screenshot.jpg +0 -0
  567. package/template/themes/mahdia/snapify.theme.json +65 -0
  568. package/template/themes/mahdia/src/Brand.tsx +39 -0
  569. package/template/themes/mahdia/src/Footer.tsx +210 -0
  570. package/template/themes/mahdia/src/Header.tsx +291 -0
  571. package/template/themes/mahdia/src/Layout.tsx +44 -0
  572. package/template/themes/mahdia/src/Views.tsx +79 -0
  573. package/template/themes/mahdia/src/blocks/CollectionBlocks.tsx +674 -0
  574. package/template/themes/mahdia/src/blocks/ContentBlocks.tsx +307 -0
  575. package/template/themes/mahdia/src/blocks/ConversionBlocks.tsx +571 -0
  576. package/template/themes/mahdia/src/blocks/HeaderBlocks.tsx +289 -0
  577. package/template/themes/mahdia/src/index.tsx +53 -0
  578. package/template/themes/mahdia/src/kit.tsx +362 -0
  579. package/template/themes/mahdia/src/site.ts +75 -0
  580. package/template/themes/mahdia/src/styles.css +446 -0
  581. package/template/themes/preveris/screenshot.jpg +0 -0
  582. package/template/themes/preveris/snapify.theme.json +126 -0
  583. package/template/themes/preveris/src/Brand.tsx +44 -0
  584. package/template/themes/preveris/src/Footer.tsx +202 -0
  585. package/template/themes/preveris/src/Header.tsx +239 -0
  586. package/template/themes/preveris/src/Layout.tsx +42 -0
  587. package/template/themes/preveris/src/Views.tsx +71 -0
  588. package/template/themes/preveris/src/blocks/CollectionBlocks.tsx +678 -0
  589. package/template/themes/preveris/src/blocks/ContentBlocks.tsx +307 -0
  590. package/template/themes/preveris/src/blocks/ConversionBlocks.tsx +571 -0
  591. package/template/themes/preveris/src/blocks/HeaderBlocks.tsx +299 -0
  592. package/template/themes/preveris/src/index.tsx +53 -0
  593. package/template/themes/preveris/src/kit.tsx +365 -0
  594. package/template/themes/preveris/src/site.ts +79 -0
  595. package/template/themes/preveris/src/styles.css +446 -0
  596. package/template/themes/sidibou/screenshot.jpg +0 -0
  597. package/template/themes/sidibou/snapify.theme.json +21 -0
  598. package/template/themes/sidibou/src/CeeSimulator.tsx +247 -0
  599. package/template/themes/sidibou/src/Footer.tsx +203 -0
  600. package/template/themes/sidibou/src/Header.tsx +324 -0
  601. package/template/themes/sidibou/src/Layout.tsx +53 -0
  602. package/template/themes/sidibou/src/NotFound.tsx +58 -0
  603. package/template/themes/sidibou/src/Post.tsx +26 -0
  604. package/template/themes/sidibou/src/SnapifyLogo.tsx +44 -0
  605. package/template/themes/sidibou/src/blocks/CollectionBlocks.tsx +711 -0
  606. package/template/themes/sidibou/src/blocks/ContentBlocks.tsx +318 -0
  607. package/template/themes/sidibou/src/blocks/ConversionBlocks.tsx +559 -0
  608. package/template/themes/sidibou/src/blocks/HeaderBlocks.tsx +341 -0
  609. package/template/themes/sidibou/src/index.tsx +54 -0
  610. package/template/themes/sidibou/src/kit.tsx +398 -0
  611. package/template/themes/sidibou/src/site.ts +28 -0
  612. package/template/themes/sidibou/src/styles.css +317 -0
  613. package/template/tsconfig.json +33 -0
  614. package/template/vite.config.ts +42 -0
@@ -0,0 +1,923 @@
1
+ /**
2
+ * Pages SEO longue traîne — Tunisie, France, alternative WordPress
3
+ */
4
+ import React from 'react';
5
+ import { Link } from 'react-router-dom';
6
+ import { INTL_PRICE } from './copy';
7
+
8
+ const linkStyle = { fontWeight: 600 as const, color: 'var(--color-teal-dark)' };
9
+
10
+ function Page({
11
+ title,
12
+ lead,
13
+ children,
14
+ ctaLabel,
15
+ }: {
16
+ title: string;
17
+ lead: string;
18
+ children: React.ReactNode;
19
+ ctaLabel: string;
20
+ }) {
21
+ return (
22
+ <div className="lp-section">
23
+ <article className="lp-wrap" style={{ maxWidth: 760 }}>
24
+ <h1 style={{ fontFamily: 'var(--font-display)', fontSize: 'clamp(1.8rem,3vw,2.5rem)', marginTop: 0, lineHeight: 1.15 }}>
25
+ {title}
26
+ </h1>
27
+ <p style={{ lineHeight: 1.75, color: 'rgba(11,21,40,.75)', fontSize: '1.05rem' }}>{lead}</p>
28
+ <div style={{ lineHeight: 1.75, color: 'rgba(11,21,40,.78)' }}>{children}</div>
29
+ <div className="lp-cta-row" style={{ marginTop: 28 }}>
30
+ <Link to="/commander" className="lp-btn">
31
+ {ctaLabel}
32
+ </Link>
33
+ <a href="/demo/" className="lp-btn lp-btn-ghost">
34
+ Essayer la démo
35
+ </a>
36
+ </div>
37
+ </article>
38
+ </div>
39
+ );
40
+ }
41
+
42
+ export function SeoTunisiePage() {
43
+ return (
44
+ <Page
45
+ title="CMS Tunisie — créer un site web ou une boutique avec Snapify"
46
+ lead="Snapify est le CMS made in Tunisia pour les entreprises de Tunis, Sfax, Sousse, Nabeul et partout en Tunisie. Sans PHP, avec IA, édition visuelle et paiement Flouci."
47
+ ctaLabel="Commander 699 DT / an"
48
+ >
49
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Pourquoi un CMS tunisien moderne ?</h2>
50
+ <ul>
51
+ <li>
52
+ <strong>699 DT / an</strong> — tarif clair, installation en 48 h sur votre hébergement
53
+ </li>
54
+ <li>
55
+ <strong>Sans PHP</strong> — hors de la course aux CVE des CMS historiques
56
+ </li>
57
+ <li>
58
+ <strong>IA + édition visuelle</strong> — générez, peaufinez, publiez
59
+ </li>
60
+ <li>
61
+ <strong>E-commerce & Flouci</strong> — boutique, panier, commandes adaptées au marché local
62
+ </li>
63
+ <li>
64
+ <strong>Migration</strong> — WordPress, Prestashop ou site maison
65
+ </li>
66
+ </ul>
67
+
68
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Création de site web — villes &amp; guides</h2>
69
+ <ul>
70
+ <li>
71
+ <Link to="/creation-site-web-tunisie" style={linkStyle}>
72
+ Création site web Tunisie
73
+ </Link>
74
+ </li>
75
+ <li>
76
+ <Link to="/creation-site-web-tunis" style={linkStyle}>
77
+ Création site web Tunis
78
+ </Link>
79
+ </li>
80
+ <li>
81
+ <Link to="/creation-site-web-sfax" style={linkStyle}>
82
+ Création site web Sfax
83
+ </Link>
84
+ </li>
85
+ <li>
86
+ <Link to="/creation-site-web-sousse" style={linkStyle}>
87
+ Création site web Sousse
88
+ </Link>
89
+ </li>
90
+ <li>
91
+ <Link to="/agence-web-tunisie" style={linkStyle}>
92
+ Snapify vs agences (Medianet, Novatis…)
93
+ </Link>
94
+ </li>
95
+ <li>
96
+ <Link to="/boutique-en-ligne-tunisie" style={linkStyle}>
97
+ Boutique en ligne Tunisie
98
+ </Link>
99
+ </li>
100
+ <li>
101
+ <Link to="/site-vitrine-tunisie" style={linkStyle}>
102
+ Site vitrine Tunisie
103
+ </Link>
104
+ </li>
105
+ </ul>
106
+ <p>
107
+ Installation 100 % distante : Tunis, Sfax, Sousse, Monastir, Bizerte, Gabès, Ariana, Hammamet… Vous gardez
108
+ votre domaine et votre hébergeur.
109
+ </p>
110
+
111
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Écosystème</h2>
112
+ <p>
113
+ <a href="https://marketplace.snapify.tn" rel="noreferrer">
114
+ Marketplace
115
+ </a>{' '}
116
+ (modules & thèmes signés) ·{' '}
117
+ <a href="https://community.snapify.tn" rel="noreferrer">
118
+ Communauté
119
+ </a>{' '}
120
+ · Éditeur{' '}
121
+ <a href="https://novalabs.tn" rel="noreferrer">
122
+ NOVALABS
123
+ </a>
124
+ .
125
+ </p>
126
+ <p>
127
+ Aussi disponible en France :{' '}
128
+ <Link to="/seo-france" style={{ fontWeight: 600, color: 'var(--color-teal-dark)' }}>
129
+ Snapify CMS France
130
+ </Link>
131
+ .
132
+ </p>
133
+ </Page>
134
+ );
135
+ }
136
+
137
+ export function SeoFrancePage() {
138
+ return (
139
+ <Page
140
+ title="CMS France — créer un site web ou e-commerce avec Snapify"
141
+ lead={`Snapify est un CMS Node moderne pour la France : alternative à Wix, Shopify et WordPress. Génération IA, édition visuelle. ${INTL_PRICE}/an, installation en 48 h.`}
142
+ ctaLabel={`Commander ${INTL_PRICE} / an`}
143
+ >
144
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Pour qui ?</h2>
145
+ <p>
146
+ Agences, freelances, TPE/PME à Paris, Lyon, Marseille, Toulouse, Nantes, Bordeaux… qui veulent un CMS rapide,
147
+ sécurisé et simple à éditer — sans lock-in Wix ni zoo de plugins.
148
+ </p>
149
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Pages utiles</h2>
150
+ <ul>
151
+ <li>
152
+ <Link to="/alternative-wix" style={linkStyle}>
153
+ Alternative à Wix
154
+ </Link>
155
+ </li>
156
+ <li>
157
+ <Link to="/alternative-shopify" style={linkStyle}>
158
+ Alternative à Shopify
159
+ </Link>
160
+ </li>
161
+ <li>
162
+ <Link to="/creation-site-web-france" style={linkStyle}>
163
+ Création site web France
164
+ </Link>
165
+ </li>
166
+ <li>
167
+ <Link to="/createur-site-web" style={linkStyle}>
168
+ Créateur de site web IA
169
+ </Link>
170
+ </li>
171
+ <li>
172
+ <Link to="/creation-site-web-paris" style={linkStyle}>
173
+ Site web Paris
174
+ </Link>
175
+ </li>
176
+ </ul>
177
+
178
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Ce que vous gagnez</h2>
179
+ <ul>
180
+ <li>
181
+ <strong>{INTL_PRICE} / an</strong> — licence claire, vous amenez l’hébergement
182
+ </li>
183
+ <li>
184
+ <strong>Stack Node</strong> — hors surface d’attaque PHP classique
185
+ </li>
186
+ <li>
187
+ <strong>Site web IA</strong> — brief → structure → édition fine à la souris
188
+ </li>
189
+ <li>
190
+ <strong>E-commerce intégré</strong> — boutique, panier, espace client
191
+ </li>
192
+ <li>
193
+ <strong>Migration WordPress / Prestashop</strong> — contenu et catalogue repris
194
+ </li>
195
+ </ul>
196
+
197
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Intentions de recherche ciblées</h2>
198
+ <p>
199
+ <em>alternative WordPress</em>, <em>CMS sans PHP</em>, <em>créer site web France</em>, <em>CMS IA</em>,{' '}
200
+ <em>migration WordPress</em>, <em>CMS e-commerce France</em>, <em>boutique en ligne Paris</em>.
201
+ </p>
202
+ <p>
203
+ Comparatif détaillé :{' '}
204
+ <Link to="/alternative-wordpress" style={{ fontWeight: 600, color: 'var(--color-teal-dark)' }}>
205
+ Snapify vs WordPress
206
+ </Link>
207
+ . Marché Tunisie :{' '}
208
+ <Link to="/seo-tunisie" style={{ fontWeight: 600, color: 'var(--color-teal-dark)' }}>
209
+ CMS Tunisie
210
+ </Link>
211
+ .
212
+ </p>
213
+ </Page>
214
+ );
215
+ }
216
+
217
+ export function CreationSiteWebFrancePage() {
218
+ return (
219
+ <Page
220
+ title="Création site web France — Snapify, alternative à Wix"
221
+ lead={`Créez un site vitrine ou e-commerce en France : IA, édition visuelle, migration WordPress. Licence ${INTL_PRICE}/an sur votre hébergement — sans lock-in Wix ou Shopify.`}
222
+ ctaLabel={`Créer mon site · ${INTL_PRICE}/an`}
223
+ >
224
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Wix, Shopify, agence… ou Snapify ?</h2>
225
+ <ul>
226
+ <li>
227
+ <strong>Wix / Squarespace</strong> — rapide, mais abonnements qui montent et données chez eux
228
+ </li>
229
+ <li>
230
+ <strong>Shopify</strong> — fort en boutique, commissions et apps qui s’additionnent
231
+ </li>
232
+ <li>
233
+ <strong>Agence</strong> — sur-mesure, souvent 2–10 k€
234
+ </li>
235
+ <li>
236
+ <strong>Snapify</strong> — CMS Node + IA chez vous, {INTL_PRICE}/an, install 48 h
237
+ </li>
238
+ </ul>
239
+
240
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Guides concurrents</h2>
241
+ <ul>
242
+ <li>
243
+ <Link to="/alternative-wix" style={linkStyle}>
244
+ Alternative à Wix
245
+ </Link>
246
+ </li>
247
+ <li>
248
+ <Link to="/alternative-shopify" style={linkStyle}>
249
+ Alternative à Shopify
250
+ </Link>
251
+ </li>
252
+ <li>
253
+ <Link to="/alternative-squarespace" style={linkStyle}>
254
+ Alternative à Squarespace
255
+ </Link>
256
+ </li>
257
+ <li>
258
+ <Link to="/alternative-wordpress" style={linkStyle}>
259
+ Alternative à WordPress
260
+ </Link>
261
+ </li>
262
+ <li>
263
+ <Link to="/createur-site-web" style={linkStyle}>
264
+ Créateur de site web IA
265
+ </Link>
266
+ </li>
267
+ </ul>
268
+
269
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Par ville</h2>
270
+ <ul>
271
+ <li>
272
+ <Link to="/creation-site-web-paris" style={linkStyle}>
273
+ Création site web Paris
274
+ </Link>
275
+ </li>
276
+ <li>
277
+ <Link to="/creation-site-web-lyon" style={linkStyle}>
278
+ Création site web Lyon
279
+ </Link>
280
+ </li>
281
+ <li>
282
+ <Link to="/creation-site-web-marseille" style={linkStyle}>
283
+ Création site web Marseille
284
+ </Link>
285
+ </li>
286
+ </ul>
287
+
288
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Vitrine &amp; boutique</h2>
289
+ <p>
290
+ <Link to="/site-vitrine-france" style={linkStyle}>
291
+ Site vitrine France
292
+ </Link>{' '}
293
+ ·{' '}
294
+ <Link to="/boutique-en-ligne-france" style={linkStyle}>
295
+ Boutique en ligne France
296
+ </Link>{' '}
297
+ ·{' '}
298
+ <Link to="/seo-france" style={linkStyle}>
299
+ CMS France
300
+ </Link>
301
+ </p>
302
+ </Page>
303
+ );
304
+ }
305
+
306
+ export function AlternativeWixPage() {
307
+ return (
308
+ <Page
309
+ title="Alternative à Wix — Snapify CMS"
310
+ lead={`Quittez le lock-in Wix : Snapify s’installe sur votre hébergement, avec IA et e-commerce. Licence claire ${INTL_PRICE}/an.`}
311
+ ctaLabel={`Passer à Snapify · ${INTL_PRICE}/an`}
312
+ >
313
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Wix vs Snapify</h2>
314
+ <div style={{ overflowX: 'auto' }}>
315
+ <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 14 }}>
316
+ <thead>
317
+ <tr style={{ textAlign: 'left', borderBottom: '2px solid rgba(11,21,40,.12)' }}>
318
+ <th style={{ padding: '8px 6px' }}>Critère</th>
319
+ <th style={{ padding: '8px 6px' }}>Wix</th>
320
+ <th style={{ padding: '8px 6px' }}>Snapify</th>
321
+ </tr>
322
+ </thead>
323
+ <tbody>
324
+ {[
325
+ ['Hébergement', 'Chez Wix', 'Le vôtre (OVH, o2switch…)'],
326
+ ['Prix', 'Abonnements + apps', `${INTL_PRICE} / an`],
327
+ ['IA', 'Selon plans', 'Oui + édition fine'],
328
+ ['E-commerce', 'Plans boutique', 'Boutique native'],
329
+ ['Sortie', 'Difficile', 'Données chez vous'],
330
+ ].map(([a, b, c]) => (
331
+ <tr key={a} style={{ borderBottom: '1px solid rgba(11,21,40,.08)' }}>
332
+ <td style={{ padding: '10px 6px', fontWeight: 600 }}>{a}</td>
333
+ <td style={{ padding: '10px 6px' }}>{b}</td>
334
+ <td style={{ padding: '10px 6px' }}>{c}</td>
335
+ </tr>
336
+ ))}
337
+ </tbody>
338
+ </table>
339
+ </div>
340
+ <p>
341
+ <Link to="/alternative-shopify" style={linkStyle}>
342
+ Vs Shopify
343
+ </Link>{' '}
344
+ ·{' '}
345
+ <Link to="/creation-site-web-france" style={linkStyle}>
346
+ Création site France
347
+ </Link>
348
+ </p>
349
+ </Page>
350
+ );
351
+ }
352
+
353
+ export function AlternativeShopifyPage() {
354
+ return (
355
+ <Page
356
+ title="Alternative à Shopify — Snapify"
357
+ lead={`E-commerce sans commission plateforme : boutique native Snapify, licence ${INTL_PRICE}/an sur votre serveur.`}
358
+ ctaLabel={`Créer ma boutique · ${INTL_PRICE}/an`}
359
+ >
360
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Pourquoi quitter Shopify ?</h2>
361
+ <p>
362
+ Shopify est puissant, mais l’abonnement + les apps + les frais transactionnels s’additionnent. Snapify inclut
363
+ la boutique dans la licence annuelle — seuls les frais bancaires réels s’appliquent.
364
+ </p>
365
+ <p>
366
+ <Link to="/boutique-en-ligne-france" style={linkStyle}>
367
+ Boutique en ligne France
368
+ </Link>{' '}
369
+ ·{' '}
370
+ <Link to="/alternative-wix" style={linkStyle}>
371
+ Vs Wix
372
+ </Link>
373
+ </p>
374
+ </Page>
375
+ );
376
+ }
377
+
378
+ export function AlternativeSquarespacePage() {
379
+ return (
380
+ <Page
381
+ title="Alternative à Squarespace — Snapify"
382
+ lead={`Design soigné + IA, sans rester captif de Squarespace. CMS sur votre hébergement, ${INTL_PRICE}/an.`}
383
+ ctaLabel={`Essayer Snapify · ${INTL_PRICE}/an`}
384
+ >
385
+ <p>
386
+ Squarespace soigne l’esthétique ; Snapify ajoute l’autonomie technique : vos fichiers, votre domaine, votre
387
+ hébergeur UE/France.
388
+ </p>
389
+ <p>
390
+ <Link to="/site-vitrine-france" style={linkStyle}>
391
+ Site vitrine France
392
+ </Link>{' '}
393
+ ·{' '}
394
+ <Link to="/alternative-wix" style={linkStyle}>
395
+ Vs Wix
396
+ </Link>
397
+ </p>
398
+ </Page>
399
+ );
400
+ }
401
+
402
+ export function BoutiqueEnLigneFrancePage() {
403
+ return (
404
+ <Page
405
+ title="Boutique en ligne France — Snapify"
406
+ lead={`Catalogue, panier, commandes : e-commerce France sans Shopify. Licence ${INTL_PRICE}/an.`}
407
+ ctaLabel={`Créer ma boutique · ${INTL_PRICE}/an`}
408
+ >
409
+ <ul>
410
+ <li>Boutique native (pas 15 plugins)</li>
411
+ <li>Hébergement à vous</li>
412
+ <li>Migration Prestashop / WooCommerce possible</li>
413
+ </ul>
414
+ <p>
415
+ <Link to="/alternative-shopify" style={linkStyle}>
416
+ Alternative Shopify
417
+ </Link>{' '}
418
+ ·{' '}
419
+ <Link to="/creation-site-web-france" style={linkStyle}>
420
+ Création site France
421
+ </Link>
422
+ </p>
423
+ </Page>
424
+ );
425
+ }
426
+
427
+ export function SiteVitrineFrancePage() {
428
+ return (
429
+ <Page
430
+ title="Site vitrine France — Snapify"
431
+ lead={`Pages, SEO, formulaires : site vitrine moderne. Alternative Wix / WordPress.com — ${INTL_PRICE}/an.`}
432
+ ctaLabel={`Créer mon site vitrine · ${INTL_PRICE}/an`}
433
+ >
434
+ <p>
435
+ <Link to="/boutique-en-ligne-france" style={linkStyle}>
436
+ Passer en boutique
437
+ </Link>{' '}
438
+ ·{' '}
439
+ <Link to="/createur-site-web" style={linkStyle}>
440
+ Créateur IA
441
+ </Link>
442
+ </p>
443
+ </Page>
444
+ );
445
+ }
446
+
447
+ export function CreationSiteWebParisPage() {
448
+ return (
449
+ <Page
450
+ title="Création site web Paris — Snapify"
451
+ lead={`Site vitrine ou e-commerce pour TPE/PME parisiennes. IA + CMS, ${INTL_PRICE}/an — alternative Wix.`}
452
+ ctaLabel={`Commander pour Paris · ${INTL_PRICE}/an`}
453
+ >
454
+ <p>
455
+ <Link to="/creation-site-web-lyon" style={linkStyle}>
456
+ Lyon
457
+ </Link>{' '}
458
+ ·{' '}
459
+ <Link to="/creation-site-web-marseille" style={linkStyle}>
460
+ Marseille
461
+ </Link>{' '}
462
+ ·{' '}
463
+ <Link to="/alternative-wix" style={linkStyle}>
464
+ Vs Wix
465
+ </Link>
466
+ </p>
467
+ </Page>
468
+ );
469
+ }
470
+
471
+ export function CreationSiteWebLyonPage() {
472
+ return (
473
+ <Page
474
+ title="Création site web Lyon — Snapify"
475
+ lead={`Site web à Lyon : vitrine ou boutique, IA, ${INTL_PRICE}/an.`}
476
+ ctaLabel={`Commander pour Lyon · ${INTL_PRICE}/an`}
477
+ >
478
+ <p>
479
+ <Link to="/creation-site-web-paris" style={linkStyle}>
480
+ Paris
481
+ </Link>{' '}
482
+ ·{' '}
483
+ <Link to="/creation-site-web-france" style={linkStyle}>
484
+ Toute la France
485
+ </Link>
486
+ </p>
487
+ </Page>
488
+ );
489
+ }
490
+
491
+ export function CreationSiteWebMarseillePage() {
492
+ return (
493
+ <Page
494
+ title="Création site web Marseille — Snapify"
495
+ lead={`Site web Marseille & PACA : CMS IA, ${INTL_PRICE}/an, alternative Wix.`}
496
+ ctaLabel={`Commander pour Marseille · ${INTL_PRICE}/an`}
497
+ >
498
+ <p>
499
+ <Link to="/creation-site-web-france" style={linkStyle}>
500
+ Création site France
501
+ </Link>
502
+ </p>
503
+ </Page>
504
+ );
505
+ }
506
+
507
+ export function CreateurSiteWebPage() {
508
+ return (
509
+ <Page
510
+ title="Créateur de site web — Snapify IA"
511
+ lead={`Décrivez votre activité : l’IA pose les bases, vous peaufinez. Alternative Wix / Jimdo — ${INTL_PRICE}/an.`}
512
+ ctaLabel={`Créer mon site · ${INTL_PRICE}/an`}
513
+ >
514
+ <p>
515
+ <Link to="/alternative-wix" style={linkStyle}>
516
+ Comparatif Wix
517
+ </Link>{' '}
518
+ ·{' '}
519
+ <a href="/demo/" style={linkStyle}>
520
+ Démo
521
+ </a>
522
+ </p>
523
+ </Page>
524
+ );
525
+ }
526
+
527
+ export function CreationSiteWebTunisiePage() {
528
+ return (
529
+ <Page
530
+ title="Création site web Tunisie — Snapify CMS 699 DT/an"
531
+ lead="Créez un site vitrine ou une boutique en ligne en Tunisie sans devis flou : IA, édition visuelle, Flouci. Alternative claire aux projets d’agence à plusieurs milliers de dinars."
532
+ ctaLabel="Créer mon site · 699 DT/an"
533
+ >
534
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Pourquoi Snapify plutôt qu’un devis d’agence ?</h2>
535
+ <p>
536
+ Les agences web tunisiennes (Medianet, Novatis et d’autres) restent excellentes pour du sur-mesure premium.
537
+ Beaucoup de TPE/PME ont surtout besoin d’un site professionnel, éditable, avec e-commerce Flouci — sans
538
+ recommencer un devis à chaque modification.
539
+ </p>
540
+ <ul>
541
+ <li>
542
+ <strong>699 DT / an</strong> — tarif publié, installation 48 h
543
+ </li>
544
+ <li>CMS made in Tunisia (NOVALABS), stack Node sans PHP</li>
545
+ <li>Génération IA + constructeur de pages</li>
546
+ <li>Boutique + paiement Flouci</li>
547
+ <li>Migration WordPress / Prestashop possible</li>
548
+ </ul>
549
+
550
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Par ville</h2>
551
+ <ul>
552
+ <li>
553
+ <Link to="/creation-site-web-tunis" style={linkStyle}>
554
+ Création site web Tunis
555
+ </Link>
556
+ </li>
557
+ <li>
558
+ <Link to="/creation-site-web-sfax" style={linkStyle}>
559
+ Création site web Sfax
560
+ </Link>
561
+ </li>
562
+ <li>
563
+ <Link to="/creation-site-web-sousse" style={linkStyle}>
564
+ Création site web Sousse
565
+ </Link>
566
+ </li>
567
+ </ul>
568
+
569
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Guides liés</h2>
570
+ <p>
571
+ <Link to="/agence-web-tunisie" style={linkStyle}>
572
+ Snapify vs agence web Tunisie
573
+ </Link>{' '}
574
+ ·{' '}
575
+ <Link to="/boutique-en-ligne-tunisie" style={linkStyle}>
576
+ Boutique en ligne Tunisie
577
+ </Link>{' '}
578
+ ·{' '}
579
+ <Link to="/site-vitrine-tunisie" style={linkStyle}>
580
+ Site vitrine Tunisie
581
+ </Link>{' '}
582
+ ·{' '}
583
+ <Link to="/seo-tunisie" style={linkStyle}>
584
+ CMS Tunisie
585
+ </Link>
586
+ </p>
587
+ </Page>
588
+ );
589
+ }
590
+
591
+ export function CreationSiteWebTunisPage() {
592
+ return (
593
+ <Page
594
+ title="Création site web Tunis — Snapify 699 DT/an"
595
+ lead="Site vitrine ou e-commerce pour entreprises du Grand Tunis (Lac, Centre-ville, Ariana, La Marsa). CMS IA + Flouci, installé en 48 h."
596
+ ctaLabel="Commander pour Tunis · 699 DT/an"
597
+ >
598
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Créer un site à Tunis sans projet à 5–8 k DT</h2>
599
+ <p>
600
+ Sur les recherches « création site web Tunis », les devis d’agence démarrent souvent à plusieurs milliers de
601
+ dinars. Snapify propose une licence annuelle à 699 DT : vous (ou votre freelance) éditez le site, l’IA accélère
602
+ le premier jet, Flouci gère les paiements locaux.
603
+ </p>
604
+ <ul>
605
+ <li>Présence web pour TPE/PME, cabinets, commerces du Grand Tunis</li>
606
+ <li>SEO local (titles, meta, sitemap) prêt dès la mise en ligne</li>
607
+ <li>Démo publique avant paiement</li>
608
+ </ul>
609
+ <p>
610
+ <Link to="/creation-site-web-tunisie" style={linkStyle}>
611
+ Toute la Tunisie
612
+ </Link>{' '}
613
+ ·{' '}
614
+ <Link to="/agence-web-tunisie" style={linkStyle}>
615
+ Comparatif agences
616
+ </Link>{' '}
617
+ ·{' '}
618
+ <Link to="/boutique-en-ligne-tunisie" style={linkStyle}>
619
+ E-commerce
620
+ </Link>
621
+ </p>
622
+ </Page>
623
+ );
624
+ }
625
+
626
+ export function CreationSiteWebSfaxPage() {
627
+ return (
628
+ <Page
629
+ title="Création site web Sfax — Snapify 699 DT/an"
630
+ lead="Lancez votre site vitrine ou boutique à Sfax : CMS tunisien, IA, Flouci. Installation à distance en 48 h."
631
+ ctaLabel="Commander pour Sfax · 699 DT/an"
632
+ >
633
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Site web pour entreprises sfaxiennes</h2>
634
+ <p>
635
+ Industrie, commerce, services : Snapify vous donne un outil d’édition moderne sans dépendre d’un gros devis
636
+ d’agence. Vous gardez votre domaine et votre hébergeur.
637
+ </p>
638
+ <p>
639
+ <Link to="/creation-site-web-tunis" style={linkStyle}>
640
+ Tunis
641
+ </Link>{' '}
642
+ ·{' '}
643
+ <Link to="/creation-site-web-sousse" style={linkStyle}>
644
+ Sousse
645
+ </Link>{' '}
646
+ ·{' '}
647
+ <Link to="/creation-site-web-tunisie" style={linkStyle}>
648
+ Tunisie
649
+ </Link>
650
+ </p>
651
+ </Page>
652
+ );
653
+ }
654
+
655
+ export function CreationSiteWebSoussePage() {
656
+ return (
657
+ <Page
658
+ title="Création site web Sousse — Snapify 699 DT/an"
659
+ lead="Hôtellerie, commerce, services du Sahel : site vitrine ou e-commerce avec Snapify. 699 DT/an, Flouci, IA."
660
+ ctaLabel="Commander pour Sousse · 699 DT/an"
661
+ >
662
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Visibilité locale à Sousse &amp; Sahel</h2>
663
+ <p>
664
+ Créez un site professionnel pour Sousse, Hammamet ou Monastir. Édition autonome, modules signés, paiement
665
+ Flouci pour les boutiques.
666
+ </p>
667
+ <p>
668
+ <Link to="/creation-site-web-tunisie" style={linkStyle}>
669
+ Création site web Tunisie
670
+ </Link>{' '}
671
+ ·{' '}
672
+ <Link to="/site-vitrine-tunisie" style={linkStyle}>
673
+ Site vitrine
674
+ </Link>
675
+ </p>
676
+ </Page>
677
+ );
678
+ }
679
+
680
+ export function BoutiqueEnLigneTunisiePage() {
681
+ return (
682
+ <Page
683
+ title="Boutique en ligne Tunisie — e-commerce Flouci | Snapify"
684
+ lead="Catalogue, panier, commandes, paiement Flouci : lancez votre e-commerce tunisien sans WooCommerce ni devis e-commerce d’agence à 4 000+ DT."
685
+ ctaLabel="Créer ma boutique · 699 DT/an"
686
+ >
687
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>E-commerce pensé pour la Tunisie</h2>
688
+ <ul>
689
+ <li>Boutique native dans le CMS (pas 15 plugins)</li>
690
+ <li>Paiement Flouci</li>
691
+ <li>Espace client, stock, commandes</li>
692
+ <li>Licence 699 DT/an — évoluez sans nouveau devis</li>
693
+ </ul>
694
+ <p>
695
+ <Link to="/creation-site-web-tunisie" style={linkStyle}>
696
+ Création site web Tunisie
697
+ </Link>{' '}
698
+ ·{' '}
699
+ <Link to="/agence-web-tunisie" style={linkStyle}>
700
+ Vs agence web
701
+ </Link>
702
+ </p>
703
+ </Page>
704
+ );
705
+ }
706
+
707
+ export function SiteVitrineTunisiePage() {
708
+ return (
709
+ <Page
710
+ title="Site vitrine Tunisie — création rapide | Snapify 699 DT/an"
711
+ lead="Pages, SEO, formulaires, responsive : un site vitrine moderne pour présenter votre activité en Tunisie."
712
+ ctaLabel="Créer mon site vitrine · 699 DT/an"
713
+ >
714
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Vitrine pro, tarif prévisible</h2>
715
+ <p>
716
+ Moins de latence qu’un projet d’agence classique : brief → génération IA → édition visuelle → mise en ligne
717
+ sous 48 h après paiement.
718
+ </p>
719
+ <p>
720
+ <Link to="/boutique-en-ligne-tunisie" style={linkStyle}>
721
+ Passer en boutique
722
+ </Link>{' '}
723
+ ·{' '}
724
+ <Link to="/creation-site-web-tunis" style={linkStyle}>
725
+ Site à Tunis
726
+ </Link>
727
+ </p>
728
+ </Page>
729
+ );
730
+ }
731
+
732
+ export function AgenceWebTunisiePage() {
733
+ return (
734
+ <Page
735
+ title="Agence web Tunisie : Snapify vs Medianet, Novatis &amp; co"
736
+ lead="Devis d’agence 3–8 k DT ou CMS Snapify à 699 DT/an ? Comparatif honnête pour TPE/PME qui veulent un site web en Tunisie."
737
+ ctaLabel="Choisir Snapify · 699 DT/an"
738
+ >
739
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Deux modèles, deux besoins</h2>
740
+ <p>
741
+ <strong>Medianet</strong>, <strong>Novatis</strong> et d’autres agences web en Tunisie excellent sur les
742
+ projets sur mesure, la direction artistique et l’accompagnement full-service. Les budgets vitrine cités sur le
743
+ marché tournent souvent autour de 3 000 à 8 000 DT (plus pour l’e-commerce).
744
+ </p>
745
+ <p>
746
+ <strong>Snapify</strong> cible les entreprises qui veulent un site professionnel <em>maîtrisé</em> : licence
747
+ annuelle, édition autonome, IA, Flouci, migration WordPress — sans recommencer un devis à chaque page.
748
+ </p>
749
+
750
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Tableau comparatif</h2>
751
+ <div style={{ overflowX: 'auto' }}>
752
+ <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 14 }}>
753
+ <thead>
754
+ <tr style={{ textAlign: 'left', borderBottom: '2px solid rgba(11,21,40,.12)' }}>
755
+ <th style={{ padding: '8px 6px' }}>Critère</th>
756
+ <th style={{ padding: '8px 6px' }}>Agence (ex. Medianet, Novatis)</th>
757
+ <th style={{ padding: '8px 6px' }}>Snapify</th>
758
+ </tr>
759
+ </thead>
760
+ <tbody>
761
+ {[
762
+ ['Budget typique', '3 000–8 000+ DT / projet', '699 DT / an'],
763
+ ['Délai', 'Plusieurs semaines', 'Install 48 h après paiement'],
764
+ ['Évolutions', 'Nouveaux devis / tickets', 'Édition + IA en autonomie'],
765
+ ['E-commerce', 'Sur devis', 'Boutique + Flouci inclus'],
766
+ ['Stack', 'WP / sur-mesure / CMS maison', 'CMS Node, modules signés'],
767
+ ['Idéal pour', 'Sur-mesure, marque premium', 'TPE/PME, freelances, agences qui industrialisent'],
768
+ ].map(([a, b, c]) => (
769
+ <tr key={a} style={{ borderBottom: '1px solid rgba(11,21,40,.08)' }}>
770
+ <td style={{ padding: '10px 6px', fontWeight: 600 }}>{a}</td>
771
+ <td style={{ padding: '10px 6px' }}>{b}</td>
772
+ <td style={{ padding: '10px 6px' }}>{c}</td>
773
+ </tr>
774
+ ))}
775
+ </tbody>
776
+ </table>
777
+ </div>
778
+
779
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Quand choisir Snapify ?</h2>
780
+ <ul>
781
+ <li>Vous voulez un tarif clair et un site évolutif</li>
782
+ <li>Vous vendez en Tunisie (Flouci) ou présentez une activité locale</li>
783
+ <li>Vous migrez depuis WordPress et voulez sortir des plugins fragiles</li>
784
+ <li>Vous êtes une petite agence qui veut livrer plus vite à ses clients</li>
785
+ </ul>
786
+ <p>
787
+ Pages locales :{' '}
788
+ <Link to="/creation-site-web-tunis" style={linkStyle}>
789
+ Tunis
790
+ </Link>
791
+ ,{' '}
792
+ <Link to="/creation-site-web-sfax" style={linkStyle}>
793
+ Sfax
794
+ </Link>
795
+ ,{' '}
796
+ <Link to="/creation-site-web-sousse" style={linkStyle}>
797
+ Sousse
798
+ </Link>{' '}
799
+ ·{' '}
800
+ <Link to="/creation-site-web-tunisie" style={linkStyle}>
801
+ Création site web Tunisie
802
+ </Link>
803
+ </p>
804
+ </Page>
805
+ );
806
+ }
807
+
808
+ export function PressePage({ intl }: { intl: boolean }) {
809
+ const site = intl ? 'https://snapify.fr' : 'https://snapify.tn';
810
+ const badge = `${site}/logo.svg`;
811
+ return (
812
+ <Page
813
+ title="Presse & partenaires — Snapify"
814
+ lead="Kit média et badges pour journalistes, annuaires et partenaires. Lienez-nous — on lienera en retour quand c’est pertinent."
815
+ ctaLabel={intl ? `Essayer Snapify · ${INTL_PRICE}/an` : 'Essayer Snapify · 699 DT/an'}
816
+ >
817
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>En bref</h2>
818
+ <ul>
819
+ <li>
820
+ <strong>Produit</strong> — CMS Node (sans PHP) : sites vitrine, e-commerce, IA, marketplace
821
+ </li>
822
+ <li>
823
+ <strong>Éditeur</strong> — NOVALABS WEB DESIGN · Tunisie
824
+ </li>
825
+ <li>
826
+ <strong>Contact presse</strong> — contact@novalabs.tn · +216 24 734 647
827
+ </li>
828
+ <li>
829
+ <strong>Sites</strong> —{' '}
830
+ <a href="https://snapify.tn">snapify.tn</a> · <a href="https://snapify.fr">snapify.fr</a>
831
+ </li>
832
+ </ul>
833
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Badge / hotlink</h2>
834
+ <p>Vous pouvez afficher ce badge avec un lien vers Snapify :</p>
835
+ <pre
836
+ style={{
837
+ background: 'rgba(11,21,40,.04)',
838
+ padding: 12,
839
+ borderRadius: 12,
840
+ overflow: 'auto',
841
+ fontSize: 12,
842
+ }}
843
+ >{`<a href="${site}/?utm_source=partner&utm_medium=badge" rel="noopener">
844
+ <img src="${badge}" alt="Snapify CMS" width="40" height="40" />
845
+ Snapify — CMS moderne
846
+ </a>`}</pre>
847
+ <p style={{ marginTop: 16 }}>
848
+ <img src="/logo.svg" alt="Snapify" width={48} height={48} />
849
+ </p>
850
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Pages utiles</h2>
851
+ <ul>
852
+ <li>
853
+ <Link to="/alternative-wordpress">Alternative WordPress</Link>
854
+ </li>
855
+ <li>
856
+ <Link to="/seo-france">CMS France</Link>
857
+ </li>
858
+ <li>
859
+ <Link to="/seo-tunisie">CMS Tunisie</Link>
860
+ </li>
861
+ </ul>
862
+ </Page>
863
+ );
864
+ }
865
+
866
+ export function AlternativeWordpressPage({ intl }: { intl: boolean }) {
867
+ return (
868
+ <Page
869
+ title="Alternative à WordPress : Snapify CMS (sans PHP)"
870
+ lead="WordPress reste puissant — mais CVE, plugins abandonnés et sites lents freinent beaucoup d’équipes. Snapify propose un CMS Node, modules signés, IA et migration."
871
+ ctaLabel={intl ? `Passer à Snapify · ${INTL_PRICE}/an` : 'Passer à Snapify · 699 DT/an'}
872
+ >
873
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>WordPress vs Snapify</h2>
874
+ <div style={{ overflowX: 'auto' }}>
875
+ <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 14 }}>
876
+ <thead>
877
+ <tr style={{ textAlign: 'left', borderBottom: '2px solid rgba(11,21,40,.12)' }}>
878
+ <th style={{ padding: '8px 6px' }}>Critère</th>
879
+ <th style={{ padding: '8px 6px' }}>WordPress</th>
880
+ <th style={{ padding: '8px 6px' }}>Snapify</th>
881
+ </tr>
882
+ </thead>
883
+ <tbody>
884
+ {[
885
+ ['Stack', 'PHP + plugins', 'Node, modules signés'],
886
+ ['Sécurité', 'Surface CVE large', 'Moins exposé au stack PHP'],
887
+ ['Édition', 'Gutenberg / page builders', 'Blocs + génération IA'],
888
+ ['E-commerce', 'WooCommerce (+ plugins)', 'Boutique native'],
889
+ ['Mises à jour', 'Souvent risquées', 'Plateforme maintenue'],
890
+ ['Migration', '—', 'Depuis WP / Prestashop'],
891
+ ['Prix', 'Variable (plugins)', intl ? `${INTL_PRICE}/an` : '699 DT/an'],
892
+ ].map(([a, b, c]) => (
893
+ <tr key={a} style={{ borderBottom: '1px solid rgba(11,21,40,.08)' }}>
894
+ <td style={{ padding: '10px 6px', fontWeight: 600 }}>{a}</td>
895
+ <td style={{ padding: '10px 6px' }}>{b}</td>
896
+ <td style={{ padding: '10px 6px' }}>{c}</td>
897
+ </tr>
898
+ ))}
899
+ </tbody>
900
+ </table>
901
+ </div>
902
+
903
+ <h2 style={{ fontFamily: 'var(--font-display)' }}>Quand migrer ?</h2>
904
+ <ul>
905
+ <li>Votre site WordPress est lent ou piraté régulièrement</li>
906
+ <li>Vous dépendez de 15+ plugins dont certains ne sont plus maintenus</li>
907
+ <li>Vous voulez générer du contenu avec l’IA puis peaufiner visuellement</li>
908
+ <li>Vous vendez en ligne et voulez un parcours boutique plus simple</li>
909
+ </ul>
910
+ <p>
911
+ Guides locaux :{' '}
912
+ <Link to="/seo-france" style={{ fontWeight: 600, color: 'var(--color-teal-dark)' }}>
913
+ CMS France
914
+ </Link>{' '}
915
+ ·{' '}
916
+ <Link to="/seo-tunisie" style={{ fontWeight: 600, color: 'var(--color-teal-dark)' }}>
917
+ CMS Tunisie
918
+ </Link>
919
+ .
920
+ </p>
921
+ </Page>
922
+ );
923
+ }