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,67 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*.*.*'
7
+ workflow_dispatch:
8
+ inputs:
9
+ bump:
10
+ description: 'Incrément de version'
11
+ required: true
12
+ type: choice
13
+ options: [patch, minor, major]
14
+ default: minor
15
+
16
+ permissions:
17
+ contents: write
18
+
19
+ jobs:
20
+ tag-from-dispatch:
21
+ if: github.event_name == 'workflow_dispatch'
22
+ runs-on: [self-hosted, linux, x64]
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+ with:
26
+ fetch-depth: 0
27
+ token: ${{ secrets.GITHUB_TOKEN }}
28
+ - env:
29
+ BUMP: ${{ inputs.bump }}
30
+ run: |
31
+ set -euo pipefail
32
+ git config user.name 'github-actions[bot]'
33
+ git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
34
+ npm version "$BUMP" -m 'chore(release): %s'
35
+ git push origin HEAD:main --follow-tags
36
+
37
+ release:
38
+ if: startsWith(github.ref, 'refs/tags/v')
39
+ runs-on: [self-hosted, linux, x64]
40
+ steps:
41
+ - uses: actions/checkout@v4
42
+ with:
43
+ fetch-depth: 0
44
+ - run: |
45
+ npm ci --no-audit --no-fund --legacy-peer-deps
46
+ npm run build
47
+ - run: |
48
+ VERSION="${GITHUB_REF_NAME#v}"
49
+ tar -czf "snapify-${VERSION}.tar.gz" dist package.json package-lock.json scripts/deploy.sh README.md CHANGELOG.md
50
+ sha256sum "snapify-${VERSION}.tar.gz" > "snapify-${VERSION}.tar.gz.sha256"
51
+ - run: |
52
+ python3 - <<'PY'
53
+ import pathlib, os, re
54
+ ver = os.environ["GITHUB_REF_NAME"].lstrip("v")
55
+ text = pathlib.Path("CHANGELOG.md").read_text(encoding="utf-8")
56
+ m = re.search(rf"## \[{re.escape(ver)}\][\s\S]*?(?=\n## |\Z)", text)
57
+ pathlib.Path("release-notes.md").write_text((m.group(0).strip() if m else f"Release Snapify v{ver}") + "\n", encoding="utf-8")
58
+ PY
59
+ - uses: softprops/action-gh-release@v2
60
+ with:
61
+ name: Snapify ${{ github.ref_name }}
62
+ body_path: release-notes.md
63
+ files: |
64
+ snapify-*.tar.gz
65
+ snapify-*.tar.gz.sha256
66
+ generate_release_notes: true
67
+ fail_on_unmatched_files: false
@@ -0,0 +1,5 @@
1
+ {
2
+ "package": "create-snapify-app",
3
+ "version": "1.1.0",
4
+ "packedAt": "2026-11-07T14:01:09.199Z"
5
+ }
@@ -0,0 +1,28 @@
1
+ # Changelog
2
+
3
+ Toutes les versions notables de Snapify sont documentées ici.
4
+ Format inspiré de [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/),
5
+ versionnement [SemVer](https://semver.org/lang/fr/).
6
+
7
+ ## [1.1.0] — 2026-10-20
8
+
9
+ ### Ajouté
10
+ - Marketplace backoffice en cartes (logo, captures, galerie)
11
+ - Achat de modules payants depuis le backoffice (Flouci + licence auto)
12
+ - Superadmin ops (newsletter, tickets, factures, Flouci, paramètres)
13
+ - Community, marketplace publique, portail développeurs
14
+ - Widgets CMS (zones sidebar/footer), menus dynamiques, aperçu articles
15
+ - Blocs group/columns et modèles de blocs sauvegardés
16
+ - CI/CD GitHub Actions (lint, build, déploiement SSH, releases)
17
+
18
+ ### Modifié
19
+ - Sidebar admin : sections **Éditorial** / **Applications** / **Messagerie**
20
+ - Catalogue modules (prix, galerie, captures)
21
+
22
+ ### Sécurité
23
+ - `.env` retiré du suivi Git ; secrets uniquement via `.env` serveur / GitHub Secrets
24
+
25
+ ## [1.0.0] — 2026-10-01
26
+
27
+ ### Ajouté
28
+ - Première version publique Snapify (CMS, thèmes, modules, marketplace locale)
@@ -0,0 +1,14 @@
1
+ Snapify — Licence propriétaire
2
+
3
+ Copyright © 2026 NOVALABS WEB DESIGN — Tunisie
4
+ Contact : contact@novalabs.tn · +216 24 734 647
5
+
6
+ Tous droits réservés.
7
+
8
+ Ce logiciel, son code source, sa documentation et ses éléments graphiques sont
9
+ la propriété exclusive de NOVALABS WEB DESIGN. Toute reproduction, modification,
10
+ distribution, publication, sous-licence ou utilisation, totale ou partielle, sans
11
+ l'autorisation écrite préalable de NOVALABS WEB DESIGN est strictement interdite.
12
+
13
+ CE LOGICIEL EST FOURNI « EN L'ÉTAT », SANS GARANTIE D'AUCUNE SORTE, EXPRESSE OU
14
+ IMPLICITE.
@@ -0,0 +1,287 @@
1
+ <div align="center">
2
+
3
+ <img src="docs/logo.svg" alt="Snapify" width="88" height="88" />
4
+
5
+ # Snapify
6
+
7
+ **CMS et plateforme e-commerce modulaire : pages par blocs, thèmes, modules signés et back-office complet.**
8
+
9
+ [![React](https://img.shields.io/badge/React-19-61DAFB?logo=react&logoColor=white)](https://react.dev)
10
+ [![TypeScript](https://img.shields.io/badge/TypeScript-strict-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org)
11
+ [![Vite](https://img.shields.io/badge/Vite-8-646CFF?logo=vite&logoColor=white)](https://vite.dev)
12
+ [![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-4-06B6D4?logo=tailwindcss&logoColor=white)](https://tailwindcss.com)
13
+ [![Express](https://img.shields.io/badge/Express-4-000000?logo=express&logoColor=white)](https://expressjs.com)
14
+ [![PostgreSQL](https://img.shields.io/badge/PostgreSQL-17-4169E1?logo=postgresql&logoColor=white)](https://www.postgresql.org)
15
+ [![Licence](https://img.shields.io/badge/licence-propri%C3%A9taire-lightgrey)](LICENSE)
16
+
17
+ [Fonctionnalités](#fonctionnalités) · [Démarrage rapide](#démarrage-rapide) · [Architecture](#architecture) · [Modules et thèmes](#modules-et-thèmes) · [Déploiement](#mise-en-production) · [Documentation](#documentation)
18
+
19
+ </div>
20
+
21
+ ---
22
+
23
+ <p align="center">
24
+ <img src="docs/screenshots/storefront-home.jpg" alt="Boutique Snapify avec le thème Mahdia" width="49%" />
25
+ <img src="docs/screenshots/admin-dashboard.jpg" alt="Tableau de bord de l'administration" width="49%" />
26
+ </p>
27
+
28
+ ## Présentation
29
+
30
+ Snapify est un système de gestion de contenu auto-hébergé, conçu pour créer et administrer des sites vitrines et des boutiques en ligne sans écrire de code. Le site public et l'administration (`/administrator`) partagent une même base React ; le serveur Express gère le rendu, le référencement, la sécurité et l'exécution des modules.
31
+
32
+ Deux plateformes complémentaires tournent sur le même serveur (routage par `Host`) :
33
+
34
+ - **Community** (`community.snapify.tn`) — forum pour la communauté Snapify
35
+ - **Marketplace** (`marketplace.snapify.tn`) — thèmes & modules, inscription développeur 100 DT (Flouci), commission configurable
36
+
37
+ Voir [docs/PLATFORM_DEPLOY.md](docs/PLATFORM_DEPLOY.md).
38
+
39
+ Le cœur reste léger : l'apparence vient des **thèmes**, les fonctionnalités métier (boutique, panier, commandes, espace client, chat IA…) viennent des **modules**. Thèmes et modules sont distribués sous forme de paquets **signés** et s'installent depuis la marketplace intégrée.
40
+
41
+ ## Fonctionnalités
42
+
43
+ ### Contenu et édition
44
+ - **Éditeur de pages par blocs** : 25 types de blocs (héros, galerie, témoignages, FAQ, tableaux, appels à l'action…), glisser-déposer, aperçu en direct sur ordinateur, tablette et mobile.
45
+ - **Blog** avec éditeur de texte riche et publication planifiée.
46
+ - **Révisions** (50 par contenu) avec restauration, brouillons et workflow de relecture.
47
+ - **Médiathèque**, menus imbriqués, formulaires personnalisables, newsletter en double opt-in, boutons flottants.
48
+
49
+ ### E-commerce
50
+ - **Catalogue** : produits avec galerie, prix barrés et promotions, stock, catégories, recherche, tri et filtres.
51
+ - **Panier** latéral et page panier, **codes promo** (pourcentage, montant fixe, livraison offerte).
52
+ - **Tunnel de commande** en une page : adresses en Tunisie (gouvernorats), modes de livraison, paiement à la livraison ou par virement, e-mails de confirmation et suivi de commande.
53
+ - **Espace client** : inscription, connexion, commandes, carnet d'adresses, favoris, profil et photo.
54
+ - **Back-office commerce** : tableau des ventes, gestion des commandes et de leurs statuts, fiches clients, export CSV.
55
+
56
+ ### Apparence
57
+ - **Thèmes interchangeables** à chaud, avec options de personnalisation (couleurs, typographie, en-tête, pied de page) et identité visuelle.
58
+ - Trois thèmes fournis : **Mahdia** (e-commerce), **SidiBou** et **Dogga** (vitrines).
59
+
60
+ ### Référencement et audience
61
+ - Métadonnées par page, `sitemap.xml`, `robots.txt`, redirections 301 et analyse SEO avec score.
62
+ - Assistant de connexion **Google Search Console**.
63
+ - **Statistiques de visite** intégrées et respectueuses de la vie privée (pages vues, visiteurs, pays, temps moyen par page), bandeau de consentement aux cookies.
64
+
65
+ ### Administration et sécurité
66
+ - **Rôles et permissions** fins (26 permissions, rôles personnalisables), invitations par e-mail.
67
+ - **Double authentification (TOTP)**, gestion des sessions actives, limitation de débit, liste d'IP autorisées.
68
+ - **Journal d'audit** de toutes les actions sensibles, rétention configurable des données.
69
+ - **Secrets chiffrés en base** (mot de passe SMTP, clés 2FA).
70
+ - **Mode maintenance** (réponse HTTP 503 avec `Retry-After`).
71
+
72
+ ## Aperçu de l'administration
73
+
74
+ <p align="center">
75
+ <img src="docs/screenshots/admin-orders.jpg" alt="Gestion des commandes" width="49%" />
76
+ <img src="docs/screenshots/admin-products.jpg" alt="Catalogue produits" width="49%" />
77
+ </p>
78
+ <p align="center">
79
+ <img src="docs/screenshots/storefront-catalog.jpg" alt="Catalogue de la boutique" width="70%" />
80
+ </p>
81
+
82
+ ## Stack technique
83
+
84
+ | Couche | Technologies |
85
+ | --- | --- |
86
+ | Interface | React 19, React Router 7, Tailwind CSS 4, Motion, Lucide, TipTap, Recharts, dnd-kit |
87
+ | Build | Vite 8, TypeScript, tsx |
88
+ | Serveur | Node.js, Express 4, Nodemailer, geoip-lite |
89
+ | Données | PostgreSQL 17, Drizzle ORM (migrations SQL versionnées) |
90
+ | IA | Google Gemini (module Chat IA, clé côté serveur uniquement) |
91
+
92
+ ## Démarrage rapide
93
+
94
+ ### Installateur npm (recommandé)
95
+
96
+ ```bash
97
+ npx create-snapify-app@latest mon-site
98
+ ```
99
+
100
+ Le wizard demande le **domaine**, les identifiants **PostgreSQL** et le compte **admin**, puis installe le code source complet, écrit `.env`, lance `npm install` et `npm run build`.
101
+
102
+ ```bash
103
+ cd mon-site
104
+ NODE_ENV=production npm start
105
+ # Admin : https://votre-domaine/administrator
106
+ ```
107
+
108
+ ### Prérequis
109
+
110
+ - **Node.js 22** ou plus récent
111
+ - **PostgreSQL 17** : via Docker (fourni) ou une installation locale
112
+
113
+ ### Installation depuis ce dépôt
114
+
115
+ ```bash
116
+ # 1. Dépendances
117
+ npm install
118
+
119
+ # 2. Configuration : copier puis compléter les valeurs
120
+ cp .env.example .env
121
+
122
+ # 3. Base de données (conteneur Docker, port local 5433)
123
+ npm run db:up
124
+
125
+ # 4. Construction du site public et de l'administration
126
+ npm run build
127
+
128
+ # 5. Lancement
129
+ npm run dev
130
+ ```
131
+
132
+ Le site est servi sur le port défini par `PORT`, l'administration sur **`/administrator`**. Les migrations sont appliquées automatiquement au démarrage, et le premier compte administrateur est créé à partir de `ADMIN_EMAIL` et `ADMIN_PASSWORD`.
133
+
134
+ > [!NOTE]
135
+ > Avec `NODE_ENV=production`, le serveur sert les fichiers compilés de `dist/` : relancez `npm run build` après chaque modification du front. Sans cette variable, Vite fonctionne en mode développement avec rechargement à chaud.
136
+
137
+ ### Restaurer la base de démonstration
138
+
139
+ Le dossier [`database/`](database) contient un dump PostgreSQL complet (pages, produits, commandes de test, réglages, modules installés) :
140
+
141
+ ```bash
142
+ pg_restore -d "$DATABASE_URL" --clean --if-exists --no-owner database/snapify-20261013-124021.dump
143
+ ```
144
+
145
+ Les fichiers des modules installés (`data/modules/`) et les fichiers déposés (`public/uploads/`) sont versionnés avec le dépôt pour que la restauration soit complète.
146
+
147
+ ## Configuration
148
+
149
+ Toute la configuration passe par le fichier `.env` (modèle commenté : [`.env.example`](.env.example)).
150
+
151
+ | Variable | Rôle |
152
+ | --- | --- |
153
+ | `PORT`, `NODE_ENV` | Port d'écoute et mode d'exécution (`production` sert `dist/`) |
154
+ | `DATABASE_URL`, `SNAPIFY_DB_PASSWORD` | Connexion PostgreSQL et mot de passe du conteneur Docker |
155
+ | `ADMIN_EMAIL`, `ADMIN_PASSWORD` | Premier compte super administrateur |
156
+ | `ADMIN_JWT_SECRET` | Signature des sessions de l'administration |
157
+ | `SNAPIFY_SECRET_KEY` | Chiffrement des secrets en base. **Ne plus la modifier une fois définie** |
158
+ | `SNAPIFY_ADMIN_URL` | Adresse de l'administration utilisée dans les e-mails |
159
+ | `SNAPIFY_ADMIN_IP_BYPASS` | Secours : ignore la liste d'IP autorisées |
160
+ | `GEMINI_API_KEY` | Clé Google Gemini du module Chat IA |
161
+ | `MARKETPLACE_URL` | Catalogue distant HTTPS (vide : catalogue local `marketplace/`) |
162
+ | `SNAPIFY_MODULES_DEV_MODE` | Autorise les paquets non signés (développement uniquement) |
163
+ | `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET`, `GOOGLE_REDIRECT_URI` | OAuth Google Search Console (également configurable dans l'admin) |
164
+ | `SMTP_HOST`, `SMTP_PORT`, `SMTP_USER`, `SMTP_PASS`, `SMTP_FROM` | Envoi d'e-mails (le réglage de l'admin est prioritaire) |
165
+
166
+ ## Architecture
167
+
168
+ ```text
169
+ .
170
+ ├── server.ts Point d'entrée Express (rendu, API, assets)
171
+ ├── server/
172
+ │ ├── cms/ Contenu, blocs, révisions, SEO, planification, permissions
173
+ │ ├── db/ Schéma Drizzle, client et dépôt PostgreSQL
174
+ │ ├── modules/ Gestionnaire de modules et thèmes, marketplace, signatures
175
+ │ ├── routes/ API publique, administration, comptes, Google OAuth
176
+ │ ├── security/ Sessions, 2FA, limitation de débit, audit, secrets, IP
177
+ │ └── media/ Traitement et validation des images
178
+ ├── src/
179
+ │ ├── admin/ Application d'administration (pages, éditeur, UI)
180
+ │ ├── themes/, modules/ Hôtes de rendu des thèmes et modules côté client
181
+ │ └── views/, components/ Rendu des pages et composants partagés
182
+ ├── sdk/ SDK des modules et thèmes (API 1.3, build, paquets, UI commerce)
183
+ ├── modules/ Sources des modules officiels
184
+ ├── themes/ Sources des thèmes officiels
185
+ ├── marketplace/ Catalogue local et paquets signés (.snapmod, .snaptheme)
186
+ ├── drizzle/ Migrations SQL
187
+ ├── database/ Dump PostgreSQL de référence
188
+ ├── scripts/ Sauvegarde, restauration, outil de build des modules
189
+ └── docs/ Documentation technique et fonctionnelle
190
+ ```
191
+
192
+ **Principes clés**
193
+
194
+ - **Rendu côté serveur des métadonnées** : titre, description et balises de partage sont injectés dans le HTML de chaque page pour le référencement, puis React prend le relais.
195
+ - **Modules isolés** : chaque module déclare ses permissions (routes HTTP, base de données, e-mails, fichiers, accès réseau…) dans son manifeste. Le serveur ne lui expose que ce qui a été accordé et vérifie l'intégrité de ses fichiers à chaque démarrage.
196
+ - **Styles cloisonnés** : la feuille de style de chaque module est limitée à son conteneur pour ne jamais altérer le thème ni l'administration.
197
+
198
+ ## Modules et thèmes
199
+
200
+ ### Modules officiels
201
+
202
+ | Module | Version | Description |
203
+ | --- | --- | --- |
204
+ | **Boutique** `novalabs.shop` | 1.0.0 | Catalogue, catégories, fiches produit, stock, widgets de mise en avant |
205
+ | **Panier** `novalabs.cart` | 1.0.0 | Panier latéral, page panier, codes promo |
206
+ | **Commande** `novalabs.checkout` | 1.0.0 | Tunnel de commande, livraison, paiement, e-mails, gestion des commandes |
207
+ | **Espace client** `novalabs.customers` | 1.1.0 | Comptes clients, tableau de bord, adresses, favoris, photo de profil |
208
+ | **Chat IA** `novalabs.ai-chat` | 1.0.1 | Assistant conversationnel Gemini avec quotas par visiteur |
209
+ | **WhatsApp** `novalabs.whatsapp` | 1.0.1 | Bouton de contact WhatsApp configurable |
210
+
211
+ ### Thèmes officiels
212
+
213
+ | Thème | Style |
214
+ | --- | --- |
215
+ | **Mahdia** `novalabs.mahdia` | Boutique en ligne : sable, bleu Méditerranée et touches dorées, en-tête e-commerce |
216
+ | **SidiBou** `novalabs.sidibou` | Vitrine lumineuse, sections animées, cartes arrondies |
217
+ | **Dogga** `novalabs.dogga` | Vitrine éditoriale, titres à empattements, palette pierre et terre cuite |
218
+
219
+ ### Créer et publier un paquet
220
+
221
+ ```bash
222
+ # Construire et signer (sortie : marketplace/packages/<id>-<version>.snapmod)
223
+ SNAPIFY_SIGNING_KEY=~/.snapify/keys/<cle>.pem npm run module -- build modules/mon-module
224
+
225
+ # Vérifier un paquet (signature, empreintes, manifeste)
226
+ npm run module -- verify marketplace/packages/editeur.mon-module-1.0.0.snapmod
227
+
228
+ # Régénérer le catalogue local
229
+ npm run module -- catalog
230
+ ```
231
+
232
+ La clé privée de signature se conserve **hors du dépôt**. Le guide complet (manifeste, API serveur, permissions, format des paquets, licences) est dans [docs/MODULES.md](docs/MODULES.md).
233
+
234
+ ## Rôles par défaut
235
+
236
+ | Rôle | Périmètre |
237
+ | --- | --- |
238
+ | Super administrateur | Accès complet, y compris rôles, sécurité et paramètres avancés |
239
+ | Éditeur | Contenu, menus, médias, contacts, apparence, données des modules |
240
+ | Contributeur | Rédaction de pages et d'articles en brouillon |
241
+ | Référenceur SEO | Référencement et statistiques |
242
+ | Lecteur | Consultation des statistiques et des messages |
243
+
244
+ Les rôles sont modifiables et de nouveaux rôles peuvent être créés depuis **Utilisateurs › Rôles**.
245
+
246
+ ## Scripts
247
+
248
+ | Commande | Rôle |
249
+ | --- | --- |
250
+ | `npm run dev` | Démarre le serveur (Vite en développement, `dist/` en production) |
251
+ | `npm run build` | Compile le site public et l'administration |
252
+ | `npm run lint` | Vérification TypeScript |
253
+ | `npm run db:up` | Démarre le conteneur PostgreSQL |
254
+ | `npm run db:generate` | Génère une migration après modification de `server/db/schema.ts` |
255
+ | `npm run db:studio` | Explorateur de base Drizzle Studio |
256
+ | `npm run db:backup` | Sauvegarde de la base dans `backups/db/` |
257
+ | `npm run db:restore -- <fichier>` | Restaure une sauvegarde |
258
+ | `npm run module -- <commande>` | Outil des paquets : `build`, `verify`, `catalog`, `license`, `keygen` |
259
+
260
+ ## Mise en production
261
+
262
+ 1. Définir `NODE_ENV=production` et des valeurs fortes et uniques pour `ADMIN_PASSWORD`, `ADMIN_JWT_SECRET` et `SNAPIFY_SECRET_KEY`.
263
+ 2. Renseigner `SNAPIFY_ADMIN_URL`, le SMTP et, si besoin, Google Search Console.
264
+ 3. `npm ci && npm run build`, puis lancer le serveur sous un gestionnaire de processus (pm2, systemd).
265
+ 4. Placer un reverse proxy HTTPS (Nginx, Caddy) devant le port de l'application.
266
+ 5. Programmer `npm run db:backup` quotidiennement (conservation de 14 jours par défaut).
267
+
268
+ > [!WARNING]
269
+ > Ce dépôt contient le fichier `.env` et un dump de la base. Il doit rester **privé**. Avant toute ouverture ou tout partage, retirez ces fichiers et renouvelez l'ensemble des secrets.
270
+
271
+ ## Documentation
272
+
273
+ | Document | Contenu |
274
+ | --- | --- |
275
+ | [docs/BACKOFFICE_SNAPIFY.md](docs/BACKOFFICE_SNAPIFY.md) | Guide complet de l'administration, paramètres, base de données, configuration |
276
+ | [docs/MODULES.md](docs/MODULES.md) | Guide développeur des modules et thèmes : SDK, manifeste, sécurité, publication |
277
+
278
+ ## Licence
279
+
280
+ Logiciel propriétaire. © 2026 **NOVALABS WEB DESIGN**, Tunisie. Tous droits réservés.
281
+ Toute reproduction, modification ou diffusion sans autorisation écrite est interdite. Voir [LICENSE](LICENSE).
282
+
283
+ <div align="center">
284
+
285
+ **NOVALABS WEB DESIGN** · [contact@novalabs.tn](mailto:contact@novalabs.tn) · +216 24 734 647
286
+
287
+ </div>
@@ -0,0 +1,23 @@
1
+ <!doctype html>
2
+ <!--
3
+ Snapify
4
+ © 2026 NOVALABS WEB DESIGN — Tunisie
5
+ Contact : contact@novalabs.tn · +216 24 734 647
6
+ Tous droits réservés. Toute reproduction, modification ou diffusion sans autorisation écrite est interdite.
7
+ -->
8
+ <html lang="fr">
9
+ <head>
10
+ <meta charset="UTF-8" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
12
+ <meta name="robots" content="noindex, nofollow" />
13
+ <title>Snapify — Backoffice</title>
14
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
15
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
16
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet" />
17
+ <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 40'%3E%3Crect width='40' height='40' rx='10' fill='%230B1528'/%3E%3Crect x='7' y='9' width='26' height='22' rx='4' fill='none' stroke='%23fff' stroke-width='2.4'/%3E%3Cpath d='M7 15.5H33' stroke='%23fff' stroke-width='2.4'/%3E%3Ccircle cx='11' cy='12.3' r='1.1' fill='%23ff7300'/%3E%3Ccircle cx='14.4' cy='12.3' r='1.1' fill='%23ff7300'/%3E%3Cpath d='M20 18.2L21.6 22L25.4 23.6L21.6 25.2L20 29L18.4 25.2L14.6 23.6L18.4 22Z' fill='%23ff7300'/%3E%3C/svg%3E" />
18
+ </head>
19
+ <body class="bg-slate-950 text-slate-100 antialiased">
20
+ <div id="root"></div>
21
+ <script type="module" src="/src/admin/main.tsx"></script>
22
+ </body>
23
+ </html>