@duongthiu/onex-core 0.1.0 → 0.1.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 (190) hide show
  1. package/README.md +44 -65
  2. package/THEME_API.md +36 -33
  3. package/dist/api.js +14 -0
  4. package/dist/api.js.map +1 -0
  5. package/dist/api.mjs +5 -0
  6. package/dist/api.mjs.map +1 -0
  7. package/dist/auth.js +23 -0
  8. package/dist/auth.js.map +1 -0
  9. package/dist/auth.mjs +6 -0
  10. package/dist/auth.mjs.map +1 -0
  11. package/dist/blog.js +22 -0
  12. package/dist/blog.js.map +1 -0
  13. package/dist/blog.mjs +5 -0
  14. package/dist/blog.mjs.map +1 -0
  15. package/dist/cart.js +27 -0
  16. package/dist/cart.js.map +1 -0
  17. package/dist/cart.mjs +6 -0
  18. package/dist/cart.mjs.map +1 -0
  19. package/dist/chunk-2CSWHI3L.js +210 -0
  20. package/dist/chunk-2CSWHI3L.js.map +1 -0
  21. package/dist/chunk-2FGHIDUV.js +99 -0
  22. package/dist/chunk-2FGHIDUV.js.map +1 -0
  23. package/dist/chunk-2NMEKWO5.js +40 -0
  24. package/dist/chunk-2NMEKWO5.js.map +1 -0
  25. package/dist/chunk-43BVHGDT.mjs +131 -0
  26. package/dist/chunk-43BVHGDT.mjs.map +1 -0
  27. package/dist/chunk-4JVQJI3I.mjs +290 -0
  28. package/dist/chunk-4JVQJI3I.mjs.map +1 -0
  29. package/dist/chunk-5N2EKK5O.js +9550 -0
  30. package/dist/chunk-5N2EKK5O.js.map +1 -0
  31. package/dist/chunk-5T6NDVSN.js +76 -0
  32. package/dist/chunk-5T6NDVSN.js.map +1 -0
  33. package/dist/chunk-73AINNCI.mjs +201 -0
  34. package/dist/chunk-73AINNCI.mjs.map +1 -0
  35. package/dist/chunk-AIXBDAVP.mjs +61 -0
  36. package/dist/chunk-AIXBDAVP.mjs.map +1 -0
  37. package/dist/chunk-ALYN5HAC.js +210 -0
  38. package/dist/chunk-ALYN5HAC.js.map +1 -0
  39. package/dist/chunk-AREMJR3Q.js +36 -0
  40. package/dist/chunk-AREMJR3Q.js.map +1 -0
  41. package/dist/chunk-DXAI6XOI.mjs +33 -0
  42. package/dist/chunk-DXAI6XOI.mjs.map +1 -0
  43. package/dist/chunk-F5TFNWFJ.mjs +257 -0
  44. package/dist/chunk-F5TFNWFJ.mjs.map +1 -0
  45. package/dist/chunk-FQ7FWUZN.js +265 -0
  46. package/dist/chunk-FQ7FWUZN.js.map +1 -0
  47. package/dist/{chunk-3SZX6LHT.js → chunk-J27VGXJH.js} +2 -24
  48. package/dist/chunk-J27VGXJH.js.map +1 -0
  49. package/dist/chunk-JZ46LLTZ.js +121 -0
  50. package/dist/chunk-JZ46LLTZ.js.map +1 -0
  51. package/dist/chunk-K24UHN6G.mjs +76 -0
  52. package/dist/chunk-K24UHN6G.mjs.map +1 -0
  53. package/dist/chunk-KCQGGU5R.mjs +344 -0
  54. package/dist/chunk-KCQGGU5R.mjs.map +1 -0
  55. package/dist/chunk-MT22NYKT.mjs +117 -0
  56. package/dist/chunk-MT22NYKT.mjs.map +1 -0
  57. package/dist/chunk-NDD472IZ.js +85 -0
  58. package/dist/chunk-NDD472IZ.js.map +1 -0
  59. package/dist/chunk-NHOIGGYU.mjs +833 -0
  60. package/dist/chunk-NHOIGGYU.mjs.map +1 -0
  61. package/dist/chunk-O3XR7TW3.mjs +12 -0
  62. package/dist/chunk-O3XR7TW3.mjs.map +1 -0
  63. package/dist/chunk-OAPYSC2X.mjs +206 -0
  64. package/dist/chunk-OAPYSC2X.mjs.map +1 -0
  65. package/dist/{chunk-XE4EOKS4.mjs → chunk-ONJREDYY.mjs} +3 -23
  66. package/dist/chunk-ONJREDYY.mjs.map +1 -0
  67. package/dist/chunk-OVT2LUAM.js +197 -0
  68. package/dist/chunk-OVT2LUAM.js.map +1 -0
  69. package/dist/chunk-OWNGNGKL.js +331 -0
  70. package/dist/chunk-OWNGNGKL.js.map +1 -0
  71. package/dist/chunk-P7SXNZSV.js +298 -0
  72. package/dist/chunk-P7SXNZSV.js.map +1 -0
  73. package/dist/chunk-PFJOL3HI.mjs +71 -0
  74. package/dist/chunk-PFJOL3HI.mjs.map +1 -0
  75. package/dist/chunk-PPULMWJ6.js +295 -0
  76. package/dist/chunk-PPULMWJ6.js.map +1 -0
  77. package/dist/chunk-RGIVKACG.js +359 -0
  78. package/dist/chunk-RGIVKACG.js.map +1 -0
  79. package/dist/chunk-RPP5K2LP.js +870 -0
  80. package/dist/chunk-RPP5K2LP.js.map +1 -0
  81. package/dist/{chunk-7EON6Q4L.mjs → chunk-RUCHWUD7.mjs} +7651 -6370
  82. package/dist/chunk-RUCHWUD7.mjs.map +1 -0
  83. package/dist/chunk-SEVUIX4H.js +137 -0
  84. package/dist/chunk-SEVUIX4H.js.map +1 -0
  85. package/dist/chunk-SK2FSHFM.mjs +208 -0
  86. package/dist/chunk-SK2FSHFM.mjs.map +1 -0
  87. package/dist/chunk-T6EJ2GAV.mjs +294 -0
  88. package/dist/chunk-T6EJ2GAV.mjs.map +1 -0
  89. package/dist/chunk-ULBDOFZI.mjs +302 -0
  90. package/dist/chunk-ULBDOFZI.mjs.map +1 -0
  91. package/dist/chunk-V3JIELNV.js +241 -0
  92. package/dist/chunk-V3JIELNV.js.map +1 -0
  93. package/dist/chunk-V5E2KWMA.mjs +238 -0
  94. package/dist/chunk-V5E2KWMA.mjs.map +1 -0
  95. package/dist/chunk-VJA3ER6A.js +14 -0
  96. package/dist/chunk-VJA3ER6A.js.map +1 -0
  97. package/dist/chunk-VLI7ULX5.js +66 -0
  98. package/dist/chunk-VLI7ULX5.js.map +1 -0
  99. package/dist/chunk-WFGS5OFH.mjs +189 -0
  100. package/dist/chunk-WFGS5OFH.mjs.map +1 -0
  101. package/dist/chunk-WVC5GP24.mjs +96 -0
  102. package/dist/chunk-WVC5GP24.mjs.map +1 -0
  103. package/dist/chunk-YOSPWY5K.mjs +36 -0
  104. package/dist/chunk-YOSPWY5K.mjs.map +1 -0
  105. package/dist/chunk-ZFFXXLX7.js +205 -0
  106. package/dist/chunk-ZFFXXLX7.js.map +1 -0
  107. package/dist/client.js +512 -249
  108. package/dist/client.mjs +21 -2
  109. package/dist/components.js +393 -0
  110. package/dist/components.js.map +1 -0
  111. package/dist/components.mjs +8 -0
  112. package/dist/components.mjs.map +1 -0
  113. package/dist/config.js +17 -0
  114. package/dist/config.js.map +1 -0
  115. package/dist/config.mjs +4 -0
  116. package/dist/config.mjs.map +1 -0
  117. package/dist/contact.js +22 -0
  118. package/dist/contact.js.map +1 -0
  119. package/dist/contact.mjs +5 -0
  120. package/dist/contact.mjs.map +1 -0
  121. package/dist/contexts.js +51 -0
  122. package/dist/contexts.js.map +1 -0
  123. package/dist/contexts.mjs +6 -0
  124. package/dist/contexts.mjs.map +1 -0
  125. package/dist/finance.js +26 -0
  126. package/dist/finance.js.map +1 -0
  127. package/dist/finance.mjs +5 -0
  128. package/dist/finance.mjs.map +1 -0
  129. package/dist/icons.js +15 -0
  130. package/dist/icons.js.map +1 -0
  131. package/dist/icons.mjs +4 -0
  132. package/dist/icons.mjs.map +1 -0
  133. package/dist/index.js +512 -249
  134. package/dist/index.js.map +1 -1
  135. package/dist/index.mjs +21 -2
  136. package/dist/index.mjs.map +1 -1
  137. package/dist/internal.js +1437 -0
  138. package/dist/internal.js.map +1 -0
  139. package/dist/internal.mjs +1404 -0
  140. package/dist/internal.mjs.map +1 -0
  141. package/dist/motion.js +51 -0
  142. package/dist/motion.js.map +1 -0
  143. package/dist/motion.mjs +38 -0
  144. package/dist/motion.mjs.map +1 -0
  145. package/dist/orders.js +22 -0
  146. package/dist/orders.js.map +1 -0
  147. package/dist/orders.mjs +5 -0
  148. package/dist/orders.mjs.map +1 -0
  149. package/dist/products.js +27 -0
  150. package/dist/products.js.map +1 -0
  151. package/dist/products.mjs +6 -0
  152. package/dist/products.mjs.map +1 -0
  153. package/dist/registry.js +44 -0
  154. package/dist/registry.js.map +1 -0
  155. package/dist/registry.mjs +7 -0
  156. package/dist/registry.mjs.map +1 -0
  157. package/dist/renderers.js +51 -0
  158. package/dist/renderers.js.map +1 -0
  159. package/dist/renderers.mjs +6 -0
  160. package/dist/renderers.mjs.map +1 -0
  161. package/dist/server.js +11 -189
  162. package/dist/server.js.map +1 -1
  163. package/dist/server.mjs +3 -186
  164. package/dist/server.mjs.map +1 -1
  165. package/dist/types.js +37 -0
  166. package/dist/types.js.map +1 -0
  167. package/dist/types.mjs +4 -0
  168. package/dist/types.mjs.map +1 -0
  169. package/dist/utils.js +160 -0
  170. package/dist/utils.js.map +1 -0
  171. package/dist/utils.mjs +7 -0
  172. package/dist/utils.mjs.map +1 -0
  173. package/dist/wrappers.js +104 -0
  174. package/dist/wrappers.js.map +1 -0
  175. package/dist/wrappers.mjs +96 -0
  176. package/dist/wrappers.mjs.map +1 -0
  177. package/package.json +112 -9
  178. package/dist/api-vuL1Eg5L.d.mts +0 -2961
  179. package/dist/api-vuL1Eg5L.d.ts +0 -2961
  180. package/dist/chunk-3SZX6LHT.js.map +0 -1
  181. package/dist/chunk-7EON6Q4L.mjs.map +0 -1
  182. package/dist/chunk-WDY773GJ.js +0 -8308
  183. package/dist/chunk-WDY773GJ.js.map +0 -1
  184. package/dist/chunk-XE4EOKS4.mjs.map +0 -1
  185. package/dist/client.d.mts +0 -1461
  186. package/dist/client.d.ts +0 -1461
  187. package/dist/index.d.mts +0 -125
  188. package/dist/index.d.ts +0 -125
  189. package/dist/server.d.mts +0 -70
  190. package/dist/server.d.ts +0 -70
@@ -0,0 +1,76 @@
1
+ "use client";
2
+ import { createContext, useState, useContext, useMemo } from 'react';
3
+ import { jsx } from 'react/jsx-runtime';
4
+
5
+ // src/contexts/theme-context.tsx
6
+ var ThemeContext = createContext({
7
+ themeId: "default",
8
+ setThemeId: () => {
9
+ }
10
+ });
11
+ function ThemeContextProvider({
12
+ children,
13
+ themeId: initialThemeId
14
+ }) {
15
+ const [themeId, setThemeId] = useState(initialThemeId);
16
+ return /* @__PURE__ */ jsx(ThemeContext.Provider, { value: { themeId, setThemeId }, children });
17
+ }
18
+ function useThemeContext() {
19
+ const context = useContext(ThemeContext);
20
+ if (!context) {
21
+ throw new Error("useThemeContext must be used within ThemeContextProvider");
22
+ }
23
+ return context;
24
+ }
25
+ var ViewportContext = createContext({
26
+ isEditing: false,
27
+ viewportMode: "desktop"
28
+ });
29
+ function ViewportProvider({
30
+ children,
31
+ isEditing,
32
+ viewportMode
33
+ }) {
34
+ return /* @__PURE__ */ jsx(ViewportContext.Provider, { value: { isEditing, viewportMode }, children });
35
+ }
36
+ function useViewport() {
37
+ return useContext(ViewportContext);
38
+ }
39
+ function useResponsiveClass(classes) {
40
+ const { isEditing, viewportMode } = useViewport();
41
+ if (!isEditing) {
42
+ return classes.desktop;
43
+ }
44
+ switch (viewportMode) {
45
+ case "mobile":
46
+ return classes.mobile;
47
+ case "tablet":
48
+ return classes.tablet;
49
+ case "desktop":
50
+ default:
51
+ return classes.desktop;
52
+ }
53
+ }
54
+ var PageDataContext = createContext(void 0);
55
+ function PageDataProvider({
56
+ data = {},
57
+ children
58
+ }) {
59
+ const value = useMemo(() => data, [data]);
60
+ return /* @__PURE__ */ jsx(PageDataContext.Provider, { value, children });
61
+ }
62
+ function usePageData() {
63
+ const context = useContext(PageDataContext);
64
+ if (context === void 0) {
65
+ throw new Error("usePageData must be used within a PageDataProvider");
66
+ }
67
+ return context;
68
+ }
69
+ function useWebsiteSettings() {
70
+ const pageData = usePageData();
71
+ return pageData.websiteSettings || {};
72
+ }
73
+
74
+ export { PageDataProvider, ThemeContextProvider, ViewportProvider, usePageData, useResponsiveClass, useThemeContext, useViewport, useWebsiteSettings };
75
+ //# sourceMappingURL=chunk-K24UHN6G.mjs.map
76
+ //# sourceMappingURL=chunk-K24UHN6G.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/contexts/theme-context.tsx","../src/contexts/viewport-context.tsx","../src/contexts/page-data-context.tsx"],"names":["createContext","jsx","useContext"],"mappings":";;;;AAcA,IAAM,eAAe,aAAA,CAAiC;AAAA,EACpD,OAAA,EAAS,SAAA;AAAA,EACT,YAAY,MAAM;AAAA,EAAC;AACrB,CAAC,CAAA;AAOM,SAAS,oBAAA,CAAqB;AAAA,EACnC,QAAA;AAAA,EACA,OAAA,EAAS;AACX,CAAA,EAA8B;AAC5B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,cAAc,CAAA;AAErD,EAAA,uBACE,GAAA,CAAC,aAAa,QAAA,EAAb,EAAsB,OAAO,EAAE,OAAA,EAAS,UAAA,EAAW,EACjD,QAAA,EACH,CAAA;AAEJ;AAEO,SAAS,eAAA,GAAkB;AAChC,EAAA,MAAM,OAAA,GAAU,WAAW,YAAY,CAAA;AAEvC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAAA,EAC5E;AAEA,EAAA,OAAO,OAAA;AACT;AC3BA,IAAM,kBAAkBA,aAAAA,CAAmC;AAAA,EACzD,SAAA,EAAW,KAAA;AAAA,EACX,YAAA,EAAc;AAChB,CAAC,CAAA;AAEM,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACEC,GAAAA,CAAC,eAAA,CAAgB,QAAA,EAAhB,EAAyB,OAAO,EAAE,SAAA,EAAW,YAAA,EAAa,EACxD,QAAA,EACH,CAAA;AAEJ;AAEO,SAAS,WAAA,GAAc;AAC5B,EAAA,OAAOC,WAAW,eAAe,CAAA;AACnC;AAMO,SAAS,mBAAmB,OAAA,EAIxB;AACT,EAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAa,GAAI,WAAA,EAAY;AAEhD,EAAA,IAAI,CAAC,SAAA,EAAW;AAEd,IAAA,OAAO,OAAA,CAAQ,OAAA;AAAA,EACjB;AAGA,EAAA,QAAQ,YAAA;AAAc,IACpB,KAAK,QAAA;AACH,MAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,IACjB,KAAK,QAAA;AACH,MAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,IACjB,KAAK,SAAA;AAAA,IACL;AACE,MAAA,OAAO,OAAA,CAAQ,OAAA;AAAA;AAErB;AC7CA,IAAM,eAAA,GAAkBF,cAAoC,MAAS,CAAA;AAuB9D,SAAS,gBAAA,CAAiB;AAAA,EAC/B,OAAO,EAAC;AAAA,EACR;AACF,CAAA,EAA0B;AAExB,EAAA,MAAM,QAAQ,OAAA,CAAQ,MAAM,IAAA,EAAM,CAAC,IAAI,CAAC,CAAA;AAExC,EAAA,uBACEC,GAAAA,CAAC,eAAA,CAAgB,QAAA,EAAhB,EAAyB,OACvB,QAAA,EACH,CAAA;AAEJ;AAcO,SAAS,WAAA,GAAwB;AACtC,EAAA,MAAM,OAAA,GAAUC,WAAW,eAAe,CAAA;AAE1C,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,EACtE;AAEA,EAAA,OAAO,OAAA;AACT;AAiBO,SAAS,kBAAA,GAAsC;AACpD,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,OAAQ,QAAA,CAAS,mBAAmB,EAAC;AACvC","file":"chunk-K24UHN6G.mjs","sourcesContent":["/**\n * Theme Context\n * Provides theme ID to component tree without prop drilling\n */\n\n\"use client\";\n\nimport React, { createContext, useContext, useState } from \"react\";\n\ninterface ThemeContextValue {\n themeId: string;\n setThemeId: (id: string) => void;\n}\n\nconst ThemeContext = createContext<ThemeContextValue>({\n themeId: \"default\",\n setThemeId: () => {},\n});\n\nexport interface ThemeContextProviderProps {\n children: React.ReactNode;\n themeId: string;\n}\n\nexport function ThemeContextProvider({\n children,\n themeId: initialThemeId,\n}: ThemeContextProviderProps) {\n const [themeId, setThemeId] = useState(initialThemeId);\n\n return (\n <ThemeContext.Provider value={{ themeId, setThemeId }}>\n {children}\n </ThemeContext.Provider>\n );\n}\n\nexport function useThemeContext() {\n const context = useContext(ThemeContext);\n\n if (!context) {\n throw new Error(\"useThemeContext must be used within ThemeContextProvider\");\n }\n\n return context;\n}\n","/**\n * Viewport Context\n * Provides viewport mode for editor preview responsiveness\n */\n\n\"use client\";\n\nimport { createContext, useContext } from \"react\";\n\nexport type ViewportMode = \"desktop\" | \"tablet\" | \"mobile\";\n\ninterface ViewportContextType {\n /** Whether in editor mode */\n isEditing: boolean;\n /** Current viewport mode */\n viewportMode: ViewportMode;\n}\n\nconst ViewportContext = createContext<ViewportContextType>({\n isEditing: false,\n viewportMode: \"desktop\",\n});\n\nexport function ViewportProvider({\n children,\n isEditing,\n viewportMode,\n}: {\n children: React.ReactNode;\n isEditing: boolean;\n viewportMode: ViewportMode;\n}) {\n return (\n <ViewportContext.Provider value={{ isEditing, viewportMode }}>\n {children}\n </ViewportContext.Provider>\n );\n}\n\nexport function useViewport() {\n return useContext(ViewportContext);\n}\n\n/**\n * Hook to get responsive class based on viewport mode\n * Returns mobile class when in mobile preview, tablet class when in tablet preview, etc.\n */\nexport function useResponsiveClass(classes: {\n mobile: string;\n tablet: string;\n desktop: string;\n}): string {\n const { isEditing, viewportMode } = useViewport();\n\n if (!isEditing) {\n // On live site, return desktop class (CSS media queries will handle responsiveness)\n return classes.desktop;\n }\n\n // In editor, return class based on viewport mode\n switch (viewportMode) {\n case \"mobile\":\n return classes.mobile;\n case \"tablet\":\n return classes.tablet;\n case \"desktop\":\n default:\n return classes.desktop;\n }\n}\n","/**\n * Page Data Context\n * Generic context provider for sharing server-fetched data throughout the component tree\n * Provides access to websiteSettings, pageData, and any other server-side data\n */\n\n\"use client\";\n\nimport React, { createContext, useContext, useMemo } from \"react\";\nimport type { WebsiteSettings } from \"../types\";\n\n/**\n * Generic page data structure\n */\nexport interface PageData {\n /** Website settings (social connections, hotlines, etc.) */\n websiteSettings?: WebsiteSettings;\n /** Any other dynamic data needed by the page */\n [key: string]: unknown;\n}\n\n/**\n * Page Data Context\n */\nconst PageDataContext = createContext<PageData | undefined>(undefined);\n\n/**\n * Page Data Provider Props\n */\nexport interface PageDataProviderProps {\n /** Server-fetched data to provide to children */\n data?: PageData;\n /** Child components */\n children: React.ReactNode;\n}\n\n/**\n * Page Data Provider Component\n * Wraps pages/components to provide server-fetched data via context\n *\n * @example\n * ```tsx\n * <PageDataProvider data={{ websiteSettings }}>\n * <YourPage />\n * </PageDataProvider>\n * ```\n */\nexport function PageDataProvider({\n data = {},\n children,\n}: PageDataProviderProps) {\n // Memoize data to prevent unnecessary re-renders\n const value = useMemo(() => data, [data]);\n\n return (\n <PageDataContext.Provider value={value}>\n {children}\n </PageDataContext.Provider>\n );\n}\n\n/**\n * Hook to access page data\n * Returns all page data provided by PageDataProvider\n *\n * @throws Error if used outside PageDataProvider\n *\n * @example\n * ```tsx\n * const pageData = usePageData();\n * const customData = pageData.myCustomField;\n * ```\n */\nexport function usePageData(): PageData {\n const context = useContext(PageDataContext);\n\n if (context === undefined) {\n throw new Error(\"usePageData must be used within a PageDataProvider\");\n }\n\n return context;\n}\n\n/**\n * Hook to access website settings from page data\n * Convenience hook that extracts websiteSettings from page data\n *\n * @returns WebsiteSettings object (empty object if not available)\n *\n * @example\n * ```tsx\n * function MyBlock() {\n * const websiteSettings = useWebsiteSettings();\n * const socials = useSocialConnections(websiteSettings);\n * // ...\n * }\n * ```\n */\nexport function useWebsiteSettings(): WebsiteSettings {\n const pageData = usePageData();\n return (pageData.websiteSettings || {}) as WebsiteSettings;\n}\n"]}
@@ -0,0 +1,344 @@
1
+ "use client";
2
+ import { componentRegistry, blockRegistry } from './chunk-4JVQJI3I.mjs';
3
+ import { __spreadValues } from './chunk-YOSPWY5K.mjs';
4
+ import React from 'react';
5
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
6
+
7
+ function ComponentRenderer({
8
+ instance,
9
+ sectionId,
10
+ isEditing = false,
11
+ className,
12
+ fallback
13
+ }) {
14
+ const registration = componentRegistry.get(instance.type);
15
+ if (!registration) {
16
+ console.warn(`Component type "${instance.type}" not found in registry`);
17
+ if (fallback) {
18
+ return /* @__PURE__ */ jsx(Fragment, { children: fallback });
19
+ }
20
+ if (isEditing) {
21
+ return /* @__PURE__ */ jsxs(
22
+ "div",
23
+ {
24
+ className: "border-2 border-dashed border-red-500 bg-red-50 p-4 rounded",
25
+ "data-component-id": instance.id,
26
+ "data-component-type": instance.type,
27
+ "data-section-id": sectionId,
28
+ children: [
29
+ /* @__PURE__ */ jsxs("p", { className: "text-sm text-red-600 font-medium", children: [
30
+ 'Component "',
31
+ instance.type,
32
+ '" not found'
33
+ ] }),
34
+ /* @__PURE__ */ jsxs("p", { className: "text-xs text-red-500 mt-1", children: [
35
+ "ID: ",
36
+ instance.id
37
+ ] })
38
+ ]
39
+ }
40
+ );
41
+ }
42
+ return null;
43
+ }
44
+ const { component: Component, definition } = registration;
45
+ return /* @__PURE__ */ jsx(
46
+ "div",
47
+ {
48
+ className,
49
+ "data-inspector-target": "component",
50
+ "data-component-id": instance.id,
51
+ "data-component-type": instance.type,
52
+ "data-section-id": sectionId,
53
+ "data-order": instance.order,
54
+ style: {
55
+ position: "relative",
56
+ pointerEvents: "auto"
57
+ },
58
+ children: /* @__PURE__ */ jsx(
59
+ Component,
60
+ {
61
+ component: instance,
62
+ definition,
63
+ sectionId,
64
+ isEditing,
65
+ className
66
+ }
67
+ )
68
+ }
69
+ );
70
+ }
71
+ function ComponentListRenderer({
72
+ instances,
73
+ sectionId,
74
+ isEditing = false,
75
+ containerClassName,
76
+ itemClassName
77
+ }) {
78
+ const sortedInstances = [...instances].sort((a, b) => a.order - b.order);
79
+ const visibleInstances = sortedInstances.filter(
80
+ (instance) => instance.enabled !== false
81
+ );
82
+ return /* @__PURE__ */ jsx("div", { className: containerClassName, "data-component-list": "true", children: visibleInstances.map((instance) => /* @__PURE__ */ jsx(
83
+ ComponentRenderer,
84
+ {
85
+ instance,
86
+ sectionId,
87
+ isEditing,
88
+ className: itemClassName
89
+ },
90
+ instance.id
91
+ )) });
92
+ }
93
+ function useComponentRegistration(componentType) {
94
+ return React.useMemo(
95
+ () => componentRegistry.get(componentType),
96
+ [componentType]
97
+ );
98
+ }
99
+ function useComponentInstance(instance) {
100
+ const registration = useComponentRegistration((instance == null ? void 0 : instance.type) || "");
101
+ return React.useMemo(() => {
102
+ if (!instance || !registration) return null;
103
+ const { component: Component, definition } = registration;
104
+ return { Component, definition, instance };
105
+ }, [instance, registration]);
106
+ }
107
+ function BlockRenderer({
108
+ block,
109
+ sectionId,
110
+ isEditing = false,
111
+ data,
112
+ className,
113
+ fallback
114
+ }) {
115
+ var _a, _b;
116
+ if (block.enabled === false) {
117
+ return null;
118
+ }
119
+ const registration = blockRegistry.get(block.type);
120
+ if (typeof window !== "undefined" && !registration) {
121
+ const allBlocks = Array.from(blockRegistry.getAll().keys());
122
+ console.warn(
123
+ `[BlockRenderer] \u26A0\uFE0F Block "${block.type}" not found in registry!`,
124
+ {
125
+ blockId: block.id,
126
+ blockType: block.type,
127
+ sectionId,
128
+ isEditing,
129
+ blockEnabled: block.enabled === void 0 || block.enabled === true,
130
+ hasNestedBlocks: ((_a = block.blocks) == null ? void 0 : _a.length) || 0,
131
+ hasComponents: ((_b = block.components) == null ? void 0 : _b.length) || 0,
132
+ availableBlocks: allBlocks,
133
+ registrySize: allBlocks.length,
134
+ suggestion: allBlocks.find(
135
+ (type) => type.includes(block.type.split("-")[0])
136
+ ) ? `Did you mean "${allBlocks.find((type) => type.includes(block.type.split("-")[0]))}"?` : "No similar blocks found"
137
+ }
138
+ );
139
+ }
140
+ if (registration) {
141
+ const Component = registration.component;
142
+ if (sectionId) {
143
+ return /* @__PURE__ */ jsx(
144
+ "div",
145
+ {
146
+ "data-section-id": sectionId,
147
+ "data-block-id": block.id,
148
+ "data-block-type": block.type,
149
+ style: {
150
+ position: "relative",
151
+ display: "block",
152
+ width: "100%",
153
+ minHeight: "1px",
154
+ backgroundColor: "transparent",
155
+ pointerEvents: "auto"
156
+ },
157
+ className: "block-wrapper",
158
+ children: /* @__PURE__ */ jsx(
159
+ Component,
160
+ {
161
+ block,
162
+ definition: registration.definition,
163
+ isEditing,
164
+ data,
165
+ className,
166
+ sectionId
167
+ }
168
+ )
169
+ }
170
+ );
171
+ }
172
+ return /* @__PURE__ */ jsx(
173
+ Component,
174
+ {
175
+ block,
176
+ definition: registration.definition,
177
+ isEditing,
178
+ data,
179
+ className,
180
+ sectionId
181
+ }
182
+ );
183
+ }
184
+ return /* @__PURE__ */ jsxs(
185
+ "div",
186
+ {
187
+ "data-section-id": sectionId,
188
+ "data-block-id": block.id,
189
+ "data-block-type": block.type,
190
+ className,
191
+ style: block.style,
192
+ children: [
193
+ block.components && block.components.length > 0 && /* @__PURE__ */ jsx(
194
+ ComponentListRenderer,
195
+ {
196
+ instances: block.components,
197
+ sectionId,
198
+ isEditing
199
+ }
200
+ ),
201
+ block.blocks && block.blocks.length > 0 && /* @__PURE__ */ jsx(
202
+ BlockListRenderer,
203
+ {
204
+ blocks: block.blocks,
205
+ sectionId,
206
+ isEditing,
207
+ data
208
+ }
209
+ ),
210
+ (!block.components || block.components.length === 0) && (!block.blocks || block.blocks.length === 0) && fallback && /* @__PURE__ */ jsx(Fragment, { children: fallback }),
211
+ (!block.components || block.components.length === 0) && (!block.blocks || block.blocks.length === 0) && /* @__PURE__ */ jsx(Fragment, { children: isEditing ? /* @__PURE__ */ jsxs("div", { className: "border-2 border-dashed border-yellow-500 bg-yellow-50 p-4 rounded text-sm", children: [
212
+ /* @__PURE__ */ jsxs("p", { className: "font-semibold text-yellow-800", children: [
213
+ "Block: ",
214
+ block.type
215
+ ] }),
216
+ /* @__PURE__ */ jsx("p", { className: "text-yellow-600 text-xs", children: "No registered component found. Add components or nested blocks to this block." })
217
+ ] }) : (
218
+ // View mode: Show subtle indicator in dev, silent in production
219
+ process.env.NODE_ENV === "development" ? /* @__PURE__ */ jsxs("div", { className: "min-h-[20px] border border-dashed border-gray-300 bg-gray-50 p-2 text-xs text-gray-500", children: [
220
+ '\u26A0\uFE0F Block "',
221
+ block.type,
222
+ '" not registered (check console)'
223
+ ] }) : null
224
+ ) })
225
+ ]
226
+ }
227
+ );
228
+ }
229
+ function BlockListRenderer({
230
+ blocks,
231
+ sectionId,
232
+ isEditing = false,
233
+ data,
234
+ containerClassName,
235
+ blockClassName
236
+ }) {
237
+ if (!blocks || blocks.length === 0) {
238
+ return null;
239
+ }
240
+ const sortedBlocks = blocks.filter((block) => block.enabled !== false).sort((a, b) => (a.order || 0) - (b.order || 0));
241
+ if (sortedBlocks.length === 0) {
242
+ return null;
243
+ }
244
+ return /* @__PURE__ */ jsx("div", { className: containerClassName, children: sortedBlocks.map((block) => /* @__PURE__ */ jsx(
245
+ BlockRenderer,
246
+ {
247
+ block,
248
+ sectionId,
249
+ isEditing,
250
+ data,
251
+ className: blockClassName
252
+ },
253
+ block.id
254
+ )) });
255
+ }
256
+ function renderBlock(block, isEditing = false, className, sectionId) {
257
+ return /* @__PURE__ */ jsx(
258
+ BlockRenderer,
259
+ {
260
+ block,
261
+ isEditing,
262
+ className,
263
+ sectionId
264
+ }
265
+ );
266
+ }
267
+ function SectionRenderer({
268
+ section,
269
+ Component,
270
+ schema,
271
+ template,
272
+ isEditing = false,
273
+ data,
274
+ fallback,
275
+ className = ""
276
+ }) {
277
+ if (!section.enabled && !isEditing) {
278
+ return null;
279
+ }
280
+ if (!Component) {
281
+ if (fallback) {
282
+ return /* @__PURE__ */ jsx(Fragment, { children: fallback });
283
+ }
284
+ return null;
285
+ }
286
+ return /* @__PURE__ */ jsx(
287
+ "div",
288
+ {
289
+ id: `section-${section.id}`,
290
+ "data-section-id": section.id,
291
+ "data-section-type": section.type,
292
+ "data-section-template": section.template || "default",
293
+ "data-section-enabled": section.enabled,
294
+ className: `section section-${section.type} ${className}`.trim(),
295
+ children: /* @__PURE__ */ jsx(
296
+ Component,
297
+ {
298
+ section,
299
+ schema,
300
+ template,
301
+ isEditing,
302
+ data
303
+ }
304
+ )
305
+ }
306
+ );
307
+ }
308
+ function SectionListRenderer({
309
+ sections,
310
+ getComponent,
311
+ isEditing = false,
312
+ data,
313
+ fallback,
314
+ className
315
+ }) {
316
+ const visibleSections = sections.filter((section) => isEditing || section.enabled).sort((a, b) => a.order - b.order);
317
+ return /* @__PURE__ */ jsx(Fragment, { children: visibleSections.map((section) => {
318
+ const template = section.template || "default";
319
+ const registration = getComponent(section.type, template);
320
+ if (!registration) {
321
+ return fallback ? /* @__PURE__ */ jsx(React.Fragment, { children: fallback(section) }, section.id) : null;
322
+ }
323
+ return /* @__PURE__ */ jsx(
324
+ SectionRenderer,
325
+ {
326
+ section,
327
+ Component: registration.Component,
328
+ schema: registration.schema,
329
+ template: registration.template,
330
+ isEditing,
331
+ data,
332
+ className
333
+ },
334
+ section.id
335
+ );
336
+ }) });
337
+ }
338
+ function renderSection(props) {
339
+ return /* @__PURE__ */ jsx(SectionRenderer, __spreadValues({}, props));
340
+ }
341
+
342
+ export { BlockListRenderer, BlockRenderer, ComponentListRenderer, ComponentRenderer, SectionListRenderer, SectionRenderer, renderBlock, renderSection, useComponentInstance, useComponentRegistration };
343
+ //# sourceMappingURL=chunk-KCQGGU5R.mjs.map
344
+ //# sourceMappingURL=chunk-KCQGGU5R.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/renderers/component-renderer.tsx","../src/renderers/block-renderer.tsx","../src/renderers/section-renderer.tsx"],"names":["jsx","jsxs","Fragment","React"],"mappings":"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","file":"chunk-KCQGGU5R.mjs","sourcesContent":["/**\n * Component Renderer Utility\n * Generic renderer for component instances\n */\n\nimport React from \"react\";\nimport { componentRegistry } from \"../registry/component-registry\";\nimport type { ComponentInstance } from \"../types\";\n\nexport interface ComponentRendererProps {\n /** Component instance to render */\n instance: ComponentInstance;\n\n /** Section ID (required for click detection) */\n sectionId?: string;\n\n /** Whether in edit mode */\n isEditing?: boolean;\n\n /** Additional wrapper classes */\n className?: string;\n\n /** Fallback when component not found */\n fallback?: React.ReactNode;\n}\n\n/**\n * Render a single component instance\n */\nexport function ComponentRenderer({\n instance,\n sectionId,\n isEditing = false,\n className,\n fallback,\n}: ComponentRendererProps): React.ReactElement | null {\n // Get component from registry\n const registration = componentRegistry.get(instance.type);\n if (!registration) {\n console.warn(`Component type \"${instance.type}\" not found in registry`);\n\n if (fallback) {\n return <>{fallback}</>;\n }\n\n // Default fallback in edit mode\n if (isEditing) {\n return (\n <div\n className=\"border-2 border-dashed border-red-500 bg-red-50 p-4 rounded\"\n data-component-id={instance.id}\n data-component-type={instance.type}\n data-section-id={sectionId}\n >\n <p className=\"text-sm text-red-600 font-medium\">\n Component &quot;{instance.type}&quot; not found\n </p>\n <p className=\"text-xs text-red-500 mt-1\">ID: {instance.id}</p>\n </div>\n );\n }\n\n return null;\n }\n\n const { component: Component, definition } = registration;\n // Render component with wrapper (layout context only)\n // Component content elements have the actual detection attributes\n return (\n <div\n className={className}\n data-inspector-target=\"component\"\n data-component-id={instance.id}\n data-component-type={instance.type}\n data-section-id={sectionId}\n data-order={instance.order}\n style={{\n position: \"relative\",\n pointerEvents: \"auto\",\n }}\n >\n <Component\n component={instance}\n definition={definition}\n sectionId={sectionId}\n isEditing={isEditing}\n className={className}\n />\n </div>\n );\n}\n\n/**\n * Render multiple component instances\n */\nexport interface ComponentListRendererProps {\n /** Component instances to render */\n instances: ComponentInstance[];\n\n /** Section ID (required for click detection) */\n sectionId?: string;\n\n /** Whether in edit mode */\n isEditing?: boolean;\n\n /** Container class */\n containerClassName?: string;\n\n /** Item wrapper class */\n itemClassName?: string;\n}\n\nexport function ComponentListRenderer({\n instances,\n sectionId,\n isEditing = false,\n containerClassName,\n itemClassName,\n}: ComponentListRendererProps): React.ReactElement {\n // Sort by order\n const sortedInstances = [...instances].sort((a, b) => a.order - b.order);\n\n // Filter enabled\n const visibleInstances = sortedInstances.filter(\n (instance) => instance.enabled !== false\n );\n\n return (\n <div className={containerClassName} data-component-list=\"true\">\n {visibleInstances.map((instance) => (\n <ComponentRenderer\n key={instance.id}\n instance={instance}\n sectionId={sectionId}\n isEditing={isEditing}\n className={itemClassName}\n />\n ))}\n </div>\n );\n}\n\n/**\n * Hook to get a component registration\n */\nexport function useComponentRegistration(componentType: string) {\n return React.useMemo(\n () => componentRegistry.get(componentType),\n [componentType]\n );\n}\n\n/**\n * Hook to render a component instance\n */\nexport function useComponentInstance(instance: ComponentInstance | undefined) {\n const registration = useComponentRegistration(instance?.type || \"\");\n\n return React.useMemo(() => {\n if (!instance || !registration) return null;\n\n const { component: Component, definition } = registration;\n\n return { Component, definition, instance };\n }, [instance, registration]);\n}\n","/**\n * Block Renderer Utility\n * Recursive renderer for block instances with support for nested blocks and components\n */\n\nimport React from \"react\";\nimport { blockRegistry } from \"../registry/block-registry\";\nimport type { BlockInstance } from \"../types\";\nimport { ComponentListRenderer } from \"./component-renderer\";\n\nexport interface BlockRendererProps {\n /** Block instance to render */\n block: BlockInstance;\n\n /** Section ID (for context) */\n sectionId?: string;\n\n /** Whether in edit mode */\n isEditing?: boolean;\n\n /** Additional data (e.g., website settings) */\n data?: Record<string, unknown>;\n\n /** Additional wrapper classes */\n className?: string;\n\n /** Fallback when block not found */\n fallback?: React.ReactNode;\n}\n\n/**\n * Render a single block instance with recursive support\n * Handles both registered block components and generic fallback\n */\nexport function BlockRenderer({\n block,\n sectionId,\n isEditing = false,\n data,\n className,\n fallback,\n}: BlockRendererProps): React.ReactElement | null {\n // Skip disabled blocks\n if (block.enabled === false) {\n return null;\n }\n\n // Try to get registered block component\n const registration = blockRegistry.get(block.type);\n\n // DEBUG: Enhanced logging when block not found\n if (typeof window !== \"undefined\" && !registration) {\n const allBlocks = Array.from(blockRegistry.getAll().keys());\n console.warn(\n `[BlockRenderer] ⚠️ Block \"${block.type}\" not found in registry!`,\n {\n blockId: block.id,\n blockType: block.type,\n sectionId,\n isEditing,\n blockEnabled: block.enabled === undefined || block.enabled === true,\n hasNestedBlocks: block.blocks?.length || 0,\n hasComponents: block.components?.length || 0,\n availableBlocks: allBlocks,\n registrySize: allBlocks.length,\n suggestion: allBlocks.find((type) =>\n type.includes(block.type.split(\"-\")[0])\n )\n ? `Did you mean \"${allBlocks.find((type) => type.includes(block.type.split(\"-\")[0]))}\"?`\n : \"No similar blocks found\",\n }\n );\n }\n\n if (registration) {\n // Use registered component\n const Component = registration.component;\n\n // Wrap with section ID and block ID for proper detection in editor\n // Block components have their own data-block-id, but we need both attributes on the same wrapper\n // for the block matcher to work correctly\n if (sectionId) {\n return (\n <div\n data-section-id={sectionId}\n data-block-id={block.id}\n data-block-type={block.type}\n style={{\n position: \"relative\",\n display: \"block\",\n width: \"100%\",\n minHeight: \"1px\",\n backgroundColor: \"transparent\",\n pointerEvents: \"auto\",\n }}\n className=\"block-wrapper\"\n >\n <Component\n block={block}\n definition={registration.definition}\n isEditing={isEditing}\n data={data}\n className={className}\n sectionId={sectionId}\n />\n </div>\n );\n }\n\n return (\n <Component\n block={block}\n definition={registration.definition}\n isEditing={isEditing}\n data={data}\n className={className}\n sectionId={sectionId}\n />\n );\n }\n\n // Fallback: Generic renderer with recursive support\n return (\n <div\n data-section-id={sectionId}\n data-block-id={block.id}\n data-block-type={block.type}\n className={className}\n style={block.style as React.CSSProperties}\n >\n {/* Render block's direct components */}\n {block.components && block.components.length > 0 && (\n <ComponentListRenderer\n instances={block.components}\n sectionId={sectionId}\n isEditing={isEditing}\n />\n )}\n\n {/* Recursively render nested blocks */}\n {block.blocks && block.blocks.length > 0 && (\n <BlockListRenderer\n blocks={block.blocks}\n sectionId={sectionId}\n isEditing={isEditing}\n data={data}\n />\n )}\n\n {/* Fallback content if no components or blocks */}\n {(!block.components || block.components.length === 0) &&\n (!block.blocks || block.blocks.length === 0) &&\n fallback && <>{fallback}</>}\n\n {/* Debug info - show in both edit and view mode if block not found */}\n {(!block.components || block.components.length === 0) &&\n (!block.blocks || block.blocks.length === 0) && (\n <>\n {isEditing ? (\n <div className=\"border-2 border-dashed border-yellow-500 bg-yellow-50 p-4 rounded text-sm\">\n <p className=\"font-semibold text-yellow-800\">\n Block: {block.type}\n </p>\n <p className=\"text-yellow-600 text-xs\">\n No registered component found. Add components or nested blocks\n to this block.\n </p>\n </div>\n ) : // View mode: Show subtle indicator in dev, silent in production\n process.env.NODE_ENV === \"development\" ? (\n <div className=\"min-h-[20px] border border-dashed border-gray-300 bg-gray-50 p-2 text-xs text-gray-500\">\n ⚠️ Block &quot;{block.type}&quot; not registered (check console)\n </div>\n ) : null}\n </>\n )}\n </div>\n );\n}\n\nexport interface BlockListRendererProps {\n /** Array of block instances to render */\n blocks: BlockInstance[];\n\n /** Section ID (for context) */\n sectionId?: string;\n\n /** Whether in edit mode */\n isEditing?: boolean;\n\n /** Additional data (e.g., website settings) */\n data?: Record<string, unknown>;\n\n /** Container class name */\n containerClassName?: string;\n\n /** Individual block class name */\n blockClassName?: string;\n}\n\n/**\n * Render a list of blocks with auto-sorting\n * Automatically sorts by order field and filters enabled blocks\n */\nexport function BlockListRenderer({\n blocks,\n sectionId,\n isEditing = false,\n data,\n containerClassName,\n blockClassName,\n}: BlockListRendererProps): React.ReactElement | null {\n if (!blocks || blocks.length === 0) {\n return null;\n }\n\n // Filter enabled blocks and sort by order\n const sortedBlocks = blocks\n .filter((block) => block.enabled !== false)\n .sort((a, b) => (a.order || 0) - (b.order || 0));\n\n if (sortedBlocks.length === 0) {\n return null;\n }\n\n return (\n <div className={containerClassName}>\n {sortedBlocks.map((block) => (\n <BlockRenderer\n key={block.id}\n block={block}\n sectionId={sectionId}\n isEditing={isEditing}\n data={data}\n className={blockClassName}\n />\n ))}\n </div>\n );\n}\n\n/**\n * Simple helper to render a block\n * Convenience wrapper around BlockRenderer\n */\nexport function renderBlock(\n block: BlockInstance,\n isEditing = false,\n className?: string,\n sectionId?: string\n): React.ReactElement | null {\n return (\n <BlockRenderer\n block={block}\n isEditing={isEditing}\n className={className}\n sectionId={sectionId}\n />\n );\n}\n","/**\n * Section Renderer\n * Universal renderer for section instances with theme components\n */\n\n\"use client\";\n\nimport React from \"react\";\nimport type {\n SectionInstance,\n SectionComponentProps,\n SectionSchema,\n TemplateDefinition,\n} from \"../types\";\n\nexport interface SectionRendererProps {\n /** The section instance to render */\n section: SectionInstance;\n /** The React component to render the section */\n Component: React.ComponentType<SectionComponentProps>;\n /** Section schema for metadata */\n schema?: SectionSchema;\n /** Template definition */\n template?: TemplateDefinition;\n /** Whether in editing mode */\n isEditing?: boolean;\n /** Additional data to pass to the component */\n data?: Record<string, unknown>;\n /** Fallback component if rendering fails */\n fallback?: React.ReactNode;\n /** Additional className for the wrapper */\n className?: string;\n}\n\n/**\n * Render a section with proper wrapping and error handling\n */\nexport function SectionRenderer({\n section,\n Component,\n schema,\n template,\n isEditing = false,\n data,\n fallback,\n className = \"\",\n}: SectionRendererProps): React.ReactElement | null {\n // Don't render disabled sections in view mode\n if (!section.enabled && !isEditing) {\n return null;\n }\n\n // Show fallback if component is missing\n if (!Component) {\n if (fallback) {\n return <>{fallback}</>;\n }\n return null;\n }\n\n // Render the section with proper wrapper\n return (\n <div\n id={`section-${section.id}`}\n data-section-id={section.id}\n data-section-type={section.type}\n data-section-template={section.template || \"default\"}\n data-section-enabled={section.enabled}\n className={`section section-${section.type} ${className}`.trim()}\n >\n <Component\n section={section}\n schema={schema as SectionSchema}\n template={template as TemplateDefinition}\n isEditing={isEditing}\n data={data}\n />\n </div>\n );\n}\n\nexport interface SectionListRendererProps {\n /** Array of sections to render */\n sections: SectionInstance[];\n /** Function to get component for a section */\n getComponent: (\n sectionType: string,\n template: string\n ) => {\n Component: React.ComponentType<SectionComponentProps>;\n schema?: SectionSchema;\n template?: TemplateDefinition;\n } | null;\n /** Whether in editing mode */\n isEditing?: boolean;\n /** Additional data to pass to components */\n data?: Record<string, unknown>;\n /** Fallback for missing sections */\n fallback?: (section: SectionInstance) => React.ReactNode;\n /** Additional className for wrappers */\n className?: string;\n}\n\n/**\n * Render a list of sections with automatic filtering and sorting\n */\nexport function SectionListRenderer({\n sections,\n getComponent,\n isEditing = false,\n data,\n fallback,\n className,\n}: SectionListRendererProps): React.ReactElement {\n // Filter enabled sections (or all in edit mode) and sort by order\n const visibleSections = sections\n .filter((section) => isEditing || section.enabled)\n .sort((a, b) => a.order - b.order);\n\n return (\n <>\n {visibleSections.map((section) => {\n const template = section.template || \"default\";\n const registration = getComponent(section.type, template);\n\n if (!registration) {\n return fallback ? (\n <React.Fragment key={section.id}>\n {fallback(section)}\n </React.Fragment>\n ) : null;\n }\n\n return (\n <SectionRenderer\n key={section.id}\n section={section}\n Component={registration.Component}\n schema={registration.schema}\n template={registration.template}\n isEditing={isEditing}\n data={data}\n className={className}\n />\n );\n })}\n </>\n );\n}\n\n/**\n * Helper function to render a single section (non-component version)\n * Useful for server components or static rendering\n */\nexport function renderSection(\n props: SectionRendererProps\n): React.ReactElement | null {\n return <SectionRenderer {...props} />;\n}\n"]}
@@ -0,0 +1,117 @@
1
+ "use client";
2
+ import { __spreadProps, __spreadValues } from './chunk-YOSPWY5K.mjs';
3
+ import { create } from 'zustand';
4
+
5
+ var contactService = null;
6
+ var useContact = create((set) => ({
7
+ // Initial state
8
+ contactInfo: null,
9
+ formFields: null,
10
+ isLoading: false,
11
+ isSubmitting: false,
12
+ error: null,
13
+ submitSuccess: false,
14
+ /**
15
+ * Submit contact form
16
+ */
17
+ submitContactForm: async (payload) => {
18
+ if (!contactService) {
19
+ throw new Error(
20
+ "Contact service not initialized. Call initializeOnex() first."
21
+ );
22
+ }
23
+ set({ isSubmitting: true, error: null, submitSuccess: false });
24
+ try {
25
+ const response = await contactService.submitContactForm(payload);
26
+ set({ isSubmitting: false, submitSuccess: true });
27
+ return response;
28
+ } catch (error) {
29
+ set({ error: error.message, isSubmitting: false });
30
+ throw error;
31
+ }
32
+ },
33
+ /**
34
+ * Fetch contact information
35
+ */
36
+ fetchContactInfo: async () => {
37
+ if (!contactService) {
38
+ throw new Error(
39
+ "Contact service not initialized. Call initializeOnex() first."
40
+ );
41
+ }
42
+ set({ isLoading: true, error: null });
43
+ try {
44
+ const contactInfo = await contactService.getContactInfo();
45
+ set({ contactInfo, isLoading: false });
46
+ } catch (error) {
47
+ set({ error: error.message, isLoading: false });
48
+ }
49
+ },
50
+ /**
51
+ * Fetch form fields configuration
52
+ */
53
+ fetchFormFields: async () => {
54
+ if (!contactService) {
55
+ throw new Error(
56
+ "Contact service not initialized. Call initializeOnex() first."
57
+ );
58
+ }
59
+ set({ isLoading: true, error: null });
60
+ try {
61
+ const formFields = await contactService.getFormFields();
62
+ set({ formFields, isLoading: false });
63
+ } catch (error) {
64
+ set({ error: error.message, isLoading: false });
65
+ }
66
+ },
67
+ /**
68
+ * Clear error
69
+ */
70
+ clearError: () => {
71
+ set({ error: null });
72
+ },
73
+ /**
74
+ * Clear submit success flag
75
+ */
76
+ clearSubmitSuccess: () => {
77
+ set({ submitSuccess: false });
78
+ }
79
+ }));
80
+ function initializeContactService(service) {
81
+ contactService = service;
82
+ }
83
+
84
+ // src/features/contact/contact-service.ts
85
+ var ContactService = class {
86
+ constructor(api, companyId) {
87
+ this.api = api;
88
+ this.companyId = companyId;
89
+ }
90
+ /**
91
+ * Submit contact form
92
+ */
93
+ async submitContactForm(payload) {
94
+ const endpoint = `/contact/public/${this.companyId}/submit`;
95
+ return await this.api.post(endpoint, __spreadProps(__spreadValues({}, payload), {
96
+ source: "website_contact_form"
97
+ }));
98
+ }
99
+ /**
100
+ * Get contact information
101
+ */
102
+ async getContactInfo() {
103
+ const endpoint = `/contact/public/${this.companyId}/info`;
104
+ return await this.api.get(endpoint);
105
+ }
106
+ /**
107
+ * Get contact form fields configuration
108
+ */
109
+ async getFormFields() {
110
+ const endpoint = `/contact/public/${this.companyId}/form-fields`;
111
+ return await this.api.get(endpoint);
112
+ }
113
+ };
114
+
115
+ export { ContactService, initializeContactService, useContact };
116
+ //# sourceMappingURL=chunk-MT22NYKT.mjs.map
117
+ //# sourceMappingURL=chunk-MT22NYKT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/features/contact/use-contact.ts","../src/features/contact/contact-service.ts"],"names":[],"mappings":"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","file":"chunk-MT22NYKT.mjs","sourcesContent":["/**\n * Contact Hook\n * Zustand store for contact operations\n */\n\nimport { create } from \"zustand\";\nimport { ContactService } from \"./contact-service\";\nimport type {\n ContactSubmitPayload,\n ContactSubmitResponse,\n ContactInfo,\n ContactFormField,\n} from \"./types\";\n\ninterface ContactState {\n // State\n contactInfo: ContactInfo | null;\n formFields: ContactFormField[] | null;\n isLoading: boolean;\n isSubmitting: boolean;\n error: string | null;\n submitSuccess: boolean;\n\n // Actions\n submitContactForm: (\n payload: ContactSubmitPayload\n ) => Promise<ContactSubmitResponse>;\n fetchContactInfo: () => Promise<void>;\n fetchFormFields: () => Promise<void>;\n clearError: () => void;\n clearSubmitSuccess: () => void;\n}\n\nlet contactService: ContactService | null = null;\n\nexport const useContact = create<ContactState>((set) => ({\n // Initial state\n contactInfo: null,\n formFields: null,\n isLoading: false,\n isSubmitting: false,\n error: null,\n submitSuccess: false,\n\n /**\n * Submit contact form\n */\n submitContactForm: async (payload) => {\n if (!contactService) {\n throw new Error(\n \"Contact service not initialized. Call initializeOnex() first.\"\n );\n }\n\n set({ isSubmitting: true, error: null, submitSuccess: false });\n try {\n const response = await contactService.submitContactForm(payload);\n set({ isSubmitting: false, submitSuccess: true });\n return response;\n } catch (error) {\n set({ error: (error as Error).message, isSubmitting: false });\n throw error;\n }\n },\n\n /**\n * Fetch contact information\n */\n fetchContactInfo: async () => {\n if (!contactService) {\n throw new Error(\n \"Contact service not initialized. Call initializeOnex() first.\"\n );\n }\n\n set({ isLoading: true, error: null });\n try {\n const contactInfo = await contactService.getContactInfo();\n set({ contactInfo, isLoading: false });\n } catch (error) {\n set({ error: (error as Error).message, isLoading: false });\n }\n },\n\n /**\n * Fetch form fields configuration\n */\n fetchFormFields: async () => {\n if (!contactService) {\n throw new Error(\n \"Contact service not initialized. Call initializeOnex() first.\"\n );\n }\n\n set({ isLoading: true, error: null });\n try {\n const formFields = await contactService.getFormFields();\n set({ formFields, isLoading: false });\n } catch (error) {\n set({ error: (error as Error).message, isLoading: false });\n }\n },\n\n /**\n * Clear error\n */\n clearError: () => {\n set({ error: null });\n },\n\n /**\n * Clear submit success flag\n */\n clearSubmitSuccess: () => {\n set({ submitSuccess: false });\n },\n}));\n\n/**\n * Initialize contact service\n * @internal Called by initializeOnex()\n */\nexport function initializeContactService(service: ContactService): void {\n contactService = service;\n}\n","/**\n * Contact Service\n * Handles contact form submissions and contact info\n */\n\nimport { ApiClient } from \"../../api/client\";\nimport type {\n ContactSubmitPayload,\n ContactSubmitResponse,\n ContactInfo,\n ContactFormField,\n} from \"./types\";\n\nexport class ContactService {\n constructor(\n private api: ApiClient,\n private companyId: string\n ) {}\n\n /**\n * Submit contact form\n */\n async submitContactForm(\n payload: ContactSubmitPayload\n ): Promise<ContactSubmitResponse> {\n const endpoint = `/contact/public/${this.companyId}/submit`;\n return await this.api.post<ContactSubmitResponse>(endpoint, {\n ...payload,\n source: \"website_contact_form\",\n });\n }\n\n /**\n * Get contact information\n */\n async getContactInfo(): Promise<ContactInfo> {\n const endpoint = `/contact/public/${this.companyId}/info`;\n return await this.api.get<ContactInfo>(endpoint);\n }\n\n /**\n * Get contact form fields configuration\n */\n async getFormFields(): Promise<ContactFormField[]> {\n const endpoint = `/contact/public/${this.companyId}/form-fields`;\n return await this.api.get<ContactFormField[]>(endpoint);\n }\n}\n"]}