@osimart/create-storefront 0.0.0-stage → 1.0.1

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 (206) hide show
  1. package/README.md +80 -2
  2. package/THEME_DEV_API.md +80 -0
  3. package/app/app.vue +154 -0
  4. package/app/assets/css/osi-controls.css +824 -0
  5. package/app/components/SectionRenderer.vue +46 -0
  6. package/app/components/builder/BuilderOverlay.vue +582 -0
  7. package/app/components/checkout/ExtraFees.vue +329 -0
  8. package/app/components/checkout/PaymentHandoff.vue +388 -0
  9. package/app/components/common/Banner.vue +35 -0
  10. package/app/components/common/ConfirmDeleteModal.vue +117 -0
  11. package/app/components/common/DropdownSelect.vue +432 -0
  12. package/app/components/common/Loader.vue +32 -0
  13. package/app/components/common/OsiField.vue +218 -0
  14. package/app/components/common/PhoneNumInput.vue +434 -0
  15. package/app/composables/UseBodyScrollLock.js +122 -0
  16. package/app/composables/UseThemeGroup.js +575 -0
  17. package/app/composables/useAddToCart.js +87 -0
  18. package/app/composables/useAnalytics.js +15 -0
  19. package/app/composables/useAnnouncements.js +29 -0
  20. package/app/composables/useApiErrorToast.js +104 -0
  21. package/app/composables/useAuth.js +99 -0
  22. package/app/composables/useBanners.js +25 -0
  23. package/app/composables/useBuilderPreview.js +320 -0
  24. package/app/composables/useButtonStyle.js +107 -0
  25. package/app/composables/useCarousel.js +160 -0
  26. package/app/composables/useCart.js +109 -0
  27. package/app/composables/useCheckout.js +76 -0
  28. package/app/composables/useClassificationItems.js +269 -0
  29. package/app/composables/useClassificationPage.js +545 -0
  30. package/app/composables/useClassificationUrl.js +63 -0
  31. package/app/composables/useColorScheme.js +44 -0
  32. package/app/composables/useContactForm.js +53 -0
  33. package/app/composables/useContentTree.js +770 -0
  34. package/app/composables/useDragScroll.js +73 -0
  35. package/app/composables/useFooterSocials.js +107 -0
  36. package/app/composables/useInputStyle.js +45 -0
  37. package/app/composables/useLayoutShell.js +114 -0
  38. package/app/composables/useLazyVideo.js +36 -0
  39. package/app/composables/useMediaTypes.js +66 -0
  40. package/app/composables/useMediaUrl.js +71 -0
  41. package/app/composables/useMenu.js +100 -0
  42. package/app/composables/useNavStyle.js +219 -0
  43. package/app/composables/usePlaceholders.js +294 -0
  44. package/app/composables/usePolicies.js +26 -0
  45. package/app/composables/useProductCardMedia.js +135 -0
  46. package/app/composables/useProductCardStyle.js +132 -0
  47. package/app/composables/useProductDetail.js +982 -0
  48. package/app/composables/useProductGallery.js +166 -0
  49. package/app/composables/useProductItems.js +270 -0
  50. package/app/composables/useProductUrl.js +60 -0
  51. package/app/composables/useProductVariants.js +210 -0
  52. package/app/composables/useQuickShop.js +115 -0
  53. package/app/composables/useRelatedProducts.js +186 -0
  54. package/app/composables/useRenderContext.js +45 -0
  55. package/app/composables/useScopedCss.js +106 -0
  56. package/app/composables/useSearch.js +35 -0
  57. package/app/composables/useSectionData.js +462 -0
  58. package/app/composables/useSectionShell.js +113 -0
  59. package/app/composables/useSidebar.js +69 -0
  60. package/app/composables/useStoreData.js +57 -0
  61. package/app/composables/useStoreInit.js +52 -0
  62. package/app/composables/useStorefront.js +239 -0
  63. package/app/composables/useT.js +21 -0
  64. package/app/composables/useTextStyles.js +84 -0
  65. package/app/composables/useThemeControls.js +34 -0
  66. package/app/composables/useThemeSeo.js +91 -0
  67. package/app/composables/useThemeTokens.js +171 -0
  68. package/app/composables/useWishlist.js +66 -0
  69. package/app/logic/components/AnnouncementBar.js +118 -0
  70. package/app/logic/components/CardGrid.js +125 -0
  71. package/app/logic/components/CardList.js +98 -0
  72. package/app/logic/components/CartDrawer.js +273 -0
  73. package/app/logic/components/CartItem.js +31 -0
  74. package/app/logic/components/ClassificationBento.js +6 -0
  75. package/app/logic/components/ClassificationCard.js +6 -0
  76. package/app/logic/components/ClassificationCarousel.js +115 -0
  77. package/app/logic/components/ClassificationEditorial.js +41 -0
  78. package/app/logic/components/ClassificationFeatured.js +57 -0
  79. package/app/logic/components/ClassificationGrid.js +6 -0
  80. package/app/logic/components/ClassificationNav.js +61 -0
  81. package/app/logic/components/ClassificationPart.js +72 -0
  82. package/app/logic/components/FooterBlock.js +91 -0
  83. package/app/logic/components/FooterSocials.js +60 -0
  84. package/app/logic/components/HeaderDropdownList.js +29 -0
  85. package/app/logic/components/HeaderIcon.js +68 -0
  86. package/app/logic/components/HeaderLogo.js +39 -0
  87. package/app/logic/components/HeaderNav.js +268 -0
  88. package/app/logic/components/MobileMenu.js +280 -0
  89. package/app/logic/components/ProductBuyButtons.js +66 -0
  90. package/app/logic/components/ProductCard.js +160 -0
  91. package/app/logic/components/ProductFilters.js +37 -0
  92. package/app/logic/components/ProductGallery.js +19 -0
  93. package/app/logic/components/ProductInfoBlock.js +411 -0
  94. package/app/logic/components/ProductLightbox.js +12 -0
  95. package/app/logic/components/ProductQuantity.js +31 -0
  96. package/app/logic/components/ProductVariantPicker.js +125 -0
  97. package/app/logic/components/QuickBuy.js +194 -0
  98. package/app/logic/components/SearchOverlay.js +41 -0
  99. package/app/logic/components/SidebarMenuItem.js +39 -0
  100. package/app/logic/components/SiteFooter.js +476 -0
  101. package/app/logic/components/SiteHeader.js +266 -0
  102. package/app/logic/components/WhatsAppButton.js +75 -0
  103. package/app/logic/layouts/default.js +66 -0
  104. package/app/logic/sections/AnnouncementBarSection.js +6 -0
  105. package/app/logic/sections/BlockCarousel.js +103 -0
  106. package/app/logic/sections/ClassificationListSection.js +40 -0
  107. package/app/logic/sections/ContactFormSection.js +294 -0
  108. package/app/logic/sections/ContactInfoSection.js +419 -0
  109. package/app/logic/sections/ContentNode.js +189 -0
  110. package/app/logic/sections/CountdownSection.js +254 -0
  111. package/app/logic/sections/CustomHtmlSection.js +51 -0
  112. package/app/logic/sections/DividerSection.js +31 -0
  113. package/app/logic/sections/FaqSection.js +53 -0
  114. package/app/logic/sections/FeatureListSection.js +6 -0
  115. package/app/logic/sections/FeaturedProductSection.js +40 -0
  116. package/app/logic/sections/FooterSection.js +16 -0
  117. package/app/logic/sections/FooterUtilitiesSection.js +24 -0
  118. package/app/logic/sections/GallerySection.js +232 -0
  119. package/app/logic/sections/HeaderSection.js +24 -0
  120. package/app/logic/sections/HeroSection.js +24 -0
  121. package/app/logic/sections/LogoListSection.js +6 -0
  122. package/app/logic/sections/MainClassificationSection.js +473 -0
  123. package/app/logic/sections/MainProductSection.js +211 -0
  124. package/app/logic/sections/MainSearchSection.js +6 -0
  125. package/app/logic/sections/MapSection.js +92 -0
  126. package/app/logic/sections/MediaContentSection.js +38 -0
  127. package/app/logic/sections/MediaWithTextSection.js +238 -0
  128. package/app/logic/sections/NewsletterSection.js +126 -0
  129. package/app/logic/sections/ProductHighlightSection.js +201 -0
  130. package/app/logic/sections/ProductListSection.js +45 -0
  131. package/app/logic/sections/ProductRecommendationsSection.js +113 -0
  132. package/app/logic/sections/RichTextSection.js +6 -0
  133. package/app/logic/sections/ScrollingTextSection.js +69 -0
  134. package/app/logic/sections/SearchHeaderSection.js +22 -0
  135. package/app/logic/sections/SlideshowSection.js +118 -0
  136. package/app/logic/sections/SpacerSection.js +37 -0
  137. package/app/logic/sections/SplitShowcaseSection.js +6 -0
  138. package/app/logic/sections/TestimonialListSection.js +6 -0
  139. package/app/logic/sections/VideoSection.js +235 -0
  140. package/app/pages/[category]/[product].vue +196 -0
  141. package/app/pages/__builder-preview.vue +38 -0
  142. package/app/pages/categories/[slug].vue +208 -0
  143. package/app/pages/checkout.vue +1972 -0
  144. package/app/pages/forgot-password.vue +115 -0
  145. package/app/pages/index.vue +64 -0
  146. package/app/pages/login.vue +585 -0
  147. package/app/pages/order-detail.vue +442 -0
  148. package/app/pages/pages/[handle].vue +58 -0
  149. package/app/pages/privacy-policy.vue +46 -0
  150. package/app/pages/resetpassword.vue +138 -0
  151. package/app/pages/resetverificationcode.vue +163 -0
  152. package/app/pages/result.vue +203 -0
  153. package/app/pages/return-policy.vue +50 -0
  154. package/app/pages/search.vue +100 -0
  155. package/app/pages/shipping-policy.vue +46 -0
  156. package/app/pages/user-profile/components/AddAddressModal.vue +452 -0
  157. package/app/pages/user-profile/components/Whishlist.vue +137 -0
  158. package/app/pages/user-profile/components/left-bar.vue +233 -0
  159. package/app/pages/user-profile/components/orders.vue +162 -0
  160. package/app/pages/user-profile/components/profile-details.vue +566 -0
  161. package/app/pages/user-profile/components/settings.vue +194 -0
  162. package/app/pages/user-profile/index.vue +252 -0
  163. package/app/pages/verificationcode.vue +188 -0
  164. package/app/plugins/analytics.client.js +99 -0
  165. package/app/plugins/geo.js +24 -0
  166. package/app/plugins/reveal.client.js +53 -0
  167. package/app/plugins/toast.js +10 -0
  168. package/app/plugins/vue-query.js +5 -0
  169. package/app/services/ApiServices.js +74 -0
  170. package/app/services/AuthBus.js +162 -0
  171. package/app/services/Authentication/AuthenticationService.js +133 -0
  172. package/app/services/Authentication/TokenService.js +62 -0
  173. package/app/services/CartServices.js +91 -0
  174. package/app/services/CartToken.js +26 -0
  175. package/app/services/CategoryServices.js +54 -0
  176. package/app/services/CheckoutServices.js +113 -0
  177. package/app/services/HomeServices.js +133 -0
  178. package/app/services/NewsletterServices.js +29 -0
  179. package/app/services/PaymentServices.js +71 -0
  180. package/app/services/PoliciesServices.js +16 -0
  181. package/app/services/ProductServices.js +79 -0
  182. package/app/services/SearchServices.js +18 -0
  183. package/app/services/UserServices.js +105 -0
  184. package/app/services/UtilsServices.js +46 -0
  185. package/app/services/WishlistServices.js +51 -0
  186. package/app/services/storefront.service.js +57 -0
  187. package/app/stores/userStore.js +13 -0
  188. package/app/theme/categoryTree.js +68 -0
  189. package/app/theme/controls.js +88 -0
  190. package/app/theme/registry.js +56 -0
  191. package/app/utils/analytics.js +864 -0
  192. package/app/utils/device.js +50 -0
  193. package/app/utils/eventBus.js +24 -0
  194. package/app/utils/icon-presets.js +24 -0
  195. package/app/utils/productOffers.js +118 -0
  196. package/app/utils/requestCache.js +36 -0
  197. package/app/utils/scrollToError.js +59 -0
  198. package/app/utils/toPlainError.js +30 -0
  199. package/bin/osimart-theme.mjs +282 -0
  200. package/nuxt/osi-sections.ts +56 -0
  201. package/nuxt.config.ts +60 -0
  202. package/package.json +44 -4
  203. package/public/css/input.css +29 -0
  204. package/public/css/output.css +2716 -0
  205. package/public/favicon-32x32.png +0 -0
  206. package/public/robots.txt +2 -0
@@ -0,0 +1,56 @@
1
+ import { existsSync, readdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { addTemplate, defineNuxtModule, updateTemplates } from "@nuxt/kit";
4
+
5
+ /**
6
+ * Builds the section registry (#build/osi-sections.mjs) from `app/sections`
7
+ * in every layer — in practice the theme repo.
8
+ *
9
+ * nuxt.options._layers is ordered highest priority first, so it's walked in
10
+ * reverse: a higher layer's file with the same name replaces a lower one.
11
+ */
12
+ const FILENAME = "osi-sections.mjs";
13
+ const SECTION_FILE = /Section\.vue$/;
14
+
15
+ /** HeroSection.vue -> HERO ; MediaWithTextSection.vue -> MEDIA_WITH_TEXT */
16
+ function typeFromFile(file: string) {
17
+ return file
18
+ .replace(SECTION_FILE, "")
19
+ .replace(/([a-z0-9])([A-Z])/g, "$1_$2")
20
+ .toUpperCase();
21
+ }
22
+
23
+ export default defineNuxtModule({
24
+ meta: { name: "osi-sections" },
25
+ setup(_options, nuxt) {
26
+ const sectionDirs = () =>
27
+ [...nuxt.options._layers]
28
+ .reverse()
29
+ .map((layer) => join(layer.config.srcDir || join(layer.cwd, "app"), "sections"));
30
+
31
+ addTemplate({
32
+ filename: FILENAME,
33
+ write: true,
34
+ getContents() {
35
+ const map = new Map<string, string>();
36
+ for (const dir of sectionDirs()) {
37
+ if (!existsSync(dir)) continue;
38
+ for (const file of readdirSync(dir)) {
39
+ if (SECTION_FILE.test(file)) map.set(typeFromFile(file), join(dir, file));
40
+ }
41
+ }
42
+ const lines = [...map].map(
43
+ ([type, path]) => ` ${JSON.stringify(type)}: () => import(${JSON.stringify(path)}),`
44
+ );
45
+ return `export const sectionLoaders = {\n${lines.join("\n")}\n};\n`;
46
+ },
47
+ });
48
+
49
+ // A section file added or removed in dev regenerates the map.
50
+ nuxt.hook("builder:watch", async (event, path) => {
51
+ if (event !== "add" && event !== "unlink") return;
52
+ if (!/(^|[\\/])sections[\\/][^\\/]+Section\.vue$/.test(path)) return;
53
+ await updateTemplates({ filter: (t) => t.filename === FILENAME });
54
+ });
55
+ },
56
+ });
package/nuxt.config.ts ADDED
@@ -0,0 +1,60 @@
1
+ import { fileURLToPath } from "node:url";
2
+ import osiSections from "./nuxt/osi-sections";
3
+
4
+ /**
5
+ * @ositcom/create-storefront — the platform. Extended by every theme repo:
6
+ *
7
+ * extends: ["@ositcom/create-storefront"]
8
+ *
9
+ * This package holds the logic (composables, services, the script of every
10
+ * theme section/component under app/logic), the platform pages (routing,
11
+ * checkout, account, auth, builder preview) and the CLI. The theme repo holds
12
+ * the look: sections, components, layout, CSS and the theme JSON.
13
+ *
14
+ * Inside a layer `~` points at the *consuming* app (the theme), so the core
15
+ * never imports through `~`. It uses:
16
+ * #osi/... this package's app/ (composables, services, utils, theme)
17
+ * #logic/... the script behind each theme file (app/logic)
18
+ * #components components — resolves to the theme's when one exists
19
+ */
20
+ const appDir = fileURLToPath(new URL("./app", import.meta.url));
21
+
22
+ export default defineNuxtConfig({
23
+ compatibilityDate: "2025-07-15",
24
+
25
+ alias: {
26
+ "#osi": appDir,
27
+ "#logic": `${appDir}/logic`,
28
+ },
29
+
30
+ // Flat names (SiteHeader, not LayoutSiteHeader). A store overrides one by
31
+ // creating a component with the same file name anywhere in its components/.
32
+ components: [{ path: `${appDir}/components`, pathPrefix: false }],
33
+
34
+ modules: ["@nuxtjs/sitemap", "@pinia/nuxt", osiSections],
35
+
36
+ ssr: true,
37
+
38
+ // The dashboard embeds the storefront in an iframe for the builder preview.
39
+ // Only the preview route is relaxed; every other page keeps the default DENY.
40
+ routeRules: {
41
+ "/__builder-preview": {
42
+ headers: {
43
+ "X-Frame-Options": "ALLOWALL",
44
+ "Content-Security-Policy": "frame-ancestors *",
45
+ },
46
+ },
47
+ },
48
+
49
+ css: ["vue-toastification/dist/index.css"],
50
+
51
+ runtimeConfig: {
52
+ public: {
53
+ storeApiBase: "",
54
+ },
55
+ },
56
+
57
+ build: {
58
+ transpile: ["vue-toastification", "vue-spinner"],
59
+ },
60
+ });
package/package.json CHANGED
@@ -1,6 +1,46 @@
1
1
  {
2
2
  "name": "@osimart/create-storefront",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.1",
4
+ "description": "Osimart storefront platform — logic, platform pages and CLI; extended by every theme repo",
5
+ "type": "module",
6
+ "main": "./nuxt.config.ts",
7
+ "bin": {
8
+ "osimart-theme": "./bin/osimart-theme.mjs"
9
+ },
10
+ "files": [
11
+ "app",
12
+ "bin",
13
+ "nuxt",
14
+ "public",
15
+ "nuxt.config.ts",
16
+ "THEME_DEV_API.md"
17
+ ],
18
+ "publishConfig": {
19
+ "access": "public"
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://git.osinode.com/salim/create-storefront.git"
24
+ },
25
+ "peerDependencies": {
26
+ "nuxt": "^4.5.2"
27
+ },
28
+ "dependencies": {
29
+ "@floating-ui/vue": "^2.0.1",
30
+ "@nuxt/kit": "^4.5.2",
31
+ "@nuxtjs/sitemap": "^7.2.10",
32
+ "@pinia/nuxt": "^1.0.1",
33
+ "@tanstack/vue-query": "^5.91.2",
34
+ "js-cookie": "^3.0.5",
35
+ "pinia": "^4.0.2",
36
+ "swiper": "^11.2.6",
37
+ "vue-skeletor": "^1.0.6",
38
+ "vue-spinner": "^1.0.4",
39
+ "vue-toastification": "^2.0.0-rc.5"
40
+ },
41
+ "devDependencies": {
42
+ "nuxt": "^4.5.2"
43
+ },
44
+ "license": "UNLICENSED",
45
+ "homepage": "https://osimart.com"
46
+ }
@@ -0,0 +1,29 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ body {
6
+ overflow-x: hidden;
7
+ margin: 0;
8
+ padding: 0;
9
+ }
10
+ ::-webkit-scrollbar {
11
+ width: 3px;
12
+ }
13
+
14
+ ::-webkit-scrollbar-thumb {
15
+ background: #7b88948b;
16
+ }
17
+
18
+ ::-webkit-scrollbar-track {
19
+ background: #5a5a5a00;
20
+ }
21
+
22
+ input[type="checkbox"]:checked {
23
+ background-color: 000000;
24
+ border-color: transparent;
25
+ background-image: url(data:image/svg+xml;charset=UTF-8,%3Csvg%20viewBox%3D%220%200%2012%209%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M1%204.5L4.5%208L11%201%22%20stroke%3D%22%23fff%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%2F%3E%3C%2Fsvg%3E);
26
+ background-size: 60%;
27
+ background-position: center;
28
+ background-repeat: no-repeat;
29
+ }