@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.
- package/README.md +44 -65
- package/THEME_API.md +36 -33
- package/dist/api.js +14 -0
- package/dist/api.js.map +1 -0
- package/dist/api.mjs +5 -0
- package/dist/api.mjs.map +1 -0
- package/dist/auth.js +23 -0
- package/dist/auth.js.map +1 -0
- package/dist/auth.mjs +6 -0
- package/dist/auth.mjs.map +1 -0
- package/dist/blog.js +22 -0
- package/dist/blog.js.map +1 -0
- package/dist/blog.mjs +5 -0
- package/dist/blog.mjs.map +1 -0
- package/dist/cart.js +27 -0
- package/dist/cart.js.map +1 -0
- package/dist/cart.mjs +6 -0
- package/dist/cart.mjs.map +1 -0
- package/dist/chunk-2CSWHI3L.js +210 -0
- package/dist/chunk-2CSWHI3L.js.map +1 -0
- package/dist/chunk-2FGHIDUV.js +99 -0
- package/dist/chunk-2FGHIDUV.js.map +1 -0
- package/dist/chunk-2NMEKWO5.js +40 -0
- package/dist/chunk-2NMEKWO5.js.map +1 -0
- package/dist/chunk-43BVHGDT.mjs +131 -0
- package/dist/chunk-43BVHGDT.mjs.map +1 -0
- package/dist/chunk-4JVQJI3I.mjs +290 -0
- package/dist/chunk-4JVQJI3I.mjs.map +1 -0
- package/dist/chunk-5N2EKK5O.js +9550 -0
- package/dist/chunk-5N2EKK5O.js.map +1 -0
- package/dist/chunk-5T6NDVSN.js +76 -0
- package/dist/chunk-5T6NDVSN.js.map +1 -0
- package/dist/chunk-73AINNCI.mjs +201 -0
- package/dist/chunk-73AINNCI.mjs.map +1 -0
- package/dist/chunk-AIXBDAVP.mjs +61 -0
- package/dist/chunk-AIXBDAVP.mjs.map +1 -0
- package/dist/chunk-ALYN5HAC.js +210 -0
- package/dist/chunk-ALYN5HAC.js.map +1 -0
- package/dist/chunk-AREMJR3Q.js +36 -0
- package/dist/chunk-AREMJR3Q.js.map +1 -0
- package/dist/chunk-DXAI6XOI.mjs +33 -0
- package/dist/chunk-DXAI6XOI.mjs.map +1 -0
- package/dist/chunk-F5TFNWFJ.mjs +257 -0
- package/dist/chunk-F5TFNWFJ.mjs.map +1 -0
- package/dist/chunk-FQ7FWUZN.js +265 -0
- package/dist/chunk-FQ7FWUZN.js.map +1 -0
- package/dist/{chunk-3SZX6LHT.js → chunk-J27VGXJH.js} +2 -24
- package/dist/chunk-J27VGXJH.js.map +1 -0
- package/dist/chunk-JZ46LLTZ.js +121 -0
- package/dist/chunk-JZ46LLTZ.js.map +1 -0
- package/dist/chunk-K24UHN6G.mjs +76 -0
- package/dist/chunk-K24UHN6G.mjs.map +1 -0
- package/dist/chunk-KCQGGU5R.mjs +344 -0
- package/dist/chunk-KCQGGU5R.mjs.map +1 -0
- package/dist/chunk-MT22NYKT.mjs +117 -0
- package/dist/chunk-MT22NYKT.mjs.map +1 -0
- package/dist/chunk-NDD472IZ.js +85 -0
- package/dist/chunk-NDD472IZ.js.map +1 -0
- package/dist/chunk-NHOIGGYU.mjs +833 -0
- package/dist/chunk-NHOIGGYU.mjs.map +1 -0
- package/dist/chunk-O3XR7TW3.mjs +12 -0
- package/dist/chunk-O3XR7TW3.mjs.map +1 -0
- package/dist/chunk-OAPYSC2X.mjs +206 -0
- package/dist/chunk-OAPYSC2X.mjs.map +1 -0
- package/dist/{chunk-XE4EOKS4.mjs → chunk-ONJREDYY.mjs} +3 -23
- package/dist/chunk-ONJREDYY.mjs.map +1 -0
- package/dist/chunk-OVT2LUAM.js +197 -0
- package/dist/chunk-OVT2LUAM.js.map +1 -0
- package/dist/chunk-OWNGNGKL.js +331 -0
- package/dist/chunk-OWNGNGKL.js.map +1 -0
- package/dist/chunk-P7SXNZSV.js +298 -0
- package/dist/chunk-P7SXNZSV.js.map +1 -0
- package/dist/chunk-PFJOL3HI.mjs +71 -0
- package/dist/chunk-PFJOL3HI.mjs.map +1 -0
- package/dist/chunk-PPULMWJ6.js +295 -0
- package/dist/chunk-PPULMWJ6.js.map +1 -0
- package/dist/chunk-RGIVKACG.js +359 -0
- package/dist/chunk-RGIVKACG.js.map +1 -0
- package/dist/chunk-RPP5K2LP.js +870 -0
- package/dist/chunk-RPP5K2LP.js.map +1 -0
- package/dist/{chunk-7EON6Q4L.mjs → chunk-RUCHWUD7.mjs} +7651 -6370
- package/dist/chunk-RUCHWUD7.mjs.map +1 -0
- package/dist/chunk-SEVUIX4H.js +137 -0
- package/dist/chunk-SEVUIX4H.js.map +1 -0
- package/dist/chunk-SK2FSHFM.mjs +208 -0
- package/dist/chunk-SK2FSHFM.mjs.map +1 -0
- package/dist/chunk-T6EJ2GAV.mjs +294 -0
- package/dist/chunk-T6EJ2GAV.mjs.map +1 -0
- package/dist/chunk-ULBDOFZI.mjs +302 -0
- package/dist/chunk-ULBDOFZI.mjs.map +1 -0
- package/dist/chunk-V3JIELNV.js +241 -0
- package/dist/chunk-V3JIELNV.js.map +1 -0
- package/dist/chunk-V5E2KWMA.mjs +238 -0
- package/dist/chunk-V5E2KWMA.mjs.map +1 -0
- package/dist/chunk-VJA3ER6A.js +14 -0
- package/dist/chunk-VJA3ER6A.js.map +1 -0
- package/dist/chunk-VLI7ULX5.js +66 -0
- package/dist/chunk-VLI7ULX5.js.map +1 -0
- package/dist/chunk-WFGS5OFH.mjs +189 -0
- package/dist/chunk-WFGS5OFH.mjs.map +1 -0
- package/dist/chunk-WVC5GP24.mjs +96 -0
- package/dist/chunk-WVC5GP24.mjs.map +1 -0
- package/dist/chunk-YOSPWY5K.mjs +36 -0
- package/dist/chunk-YOSPWY5K.mjs.map +1 -0
- package/dist/chunk-ZFFXXLX7.js +205 -0
- package/dist/chunk-ZFFXXLX7.js.map +1 -0
- package/dist/client.js +512 -249
- package/dist/client.mjs +21 -2
- package/dist/components.js +393 -0
- package/dist/components.js.map +1 -0
- package/dist/components.mjs +8 -0
- package/dist/components.mjs.map +1 -0
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -0
- package/dist/config.mjs +4 -0
- package/dist/config.mjs.map +1 -0
- package/dist/contact.js +22 -0
- package/dist/contact.js.map +1 -0
- package/dist/contact.mjs +5 -0
- package/dist/contact.mjs.map +1 -0
- package/dist/contexts.js +51 -0
- package/dist/contexts.js.map +1 -0
- package/dist/contexts.mjs +6 -0
- package/dist/contexts.mjs.map +1 -0
- package/dist/finance.js +26 -0
- package/dist/finance.js.map +1 -0
- package/dist/finance.mjs +5 -0
- package/dist/finance.mjs.map +1 -0
- package/dist/icons.js +15 -0
- package/dist/icons.js.map +1 -0
- package/dist/icons.mjs +4 -0
- package/dist/icons.mjs.map +1 -0
- package/dist/index.js +512 -249
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +21 -2
- package/dist/index.mjs.map +1 -1
- package/dist/internal.js +1437 -0
- package/dist/internal.js.map +1 -0
- package/dist/internal.mjs +1404 -0
- package/dist/internal.mjs.map +1 -0
- package/dist/motion.js +51 -0
- package/dist/motion.js.map +1 -0
- package/dist/motion.mjs +38 -0
- package/dist/motion.mjs.map +1 -0
- package/dist/orders.js +22 -0
- package/dist/orders.js.map +1 -0
- package/dist/orders.mjs +5 -0
- package/dist/orders.mjs.map +1 -0
- package/dist/products.js +27 -0
- package/dist/products.js.map +1 -0
- package/dist/products.mjs +6 -0
- package/dist/products.mjs.map +1 -0
- package/dist/registry.js +44 -0
- package/dist/registry.js.map +1 -0
- package/dist/registry.mjs +7 -0
- package/dist/registry.mjs.map +1 -0
- package/dist/renderers.js +51 -0
- package/dist/renderers.js.map +1 -0
- package/dist/renderers.mjs +6 -0
- package/dist/renderers.mjs.map +1 -0
- package/dist/server.js +11 -189
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +3 -186
- package/dist/server.mjs.map +1 -1
- package/dist/types.js +37 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +4 -0
- package/dist/types.mjs.map +1 -0
- package/dist/utils.js +160 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.mjs +7 -0
- package/dist/utils.mjs.map +1 -0
- package/dist/wrappers.js +104 -0
- package/dist/wrappers.js.map +1 -0
- package/dist/wrappers.mjs +96 -0
- package/dist/wrappers.mjs.map +1 -0
- package/package.json +112 -9
- package/dist/api-vuL1Eg5L.d.mts +0 -2961
- package/dist/api-vuL1Eg5L.d.ts +0 -2961
- package/dist/chunk-3SZX6LHT.js.map +0 -1
- package/dist/chunk-7EON6Q4L.mjs.map +0 -1
- package/dist/chunk-WDY773GJ.js +0 -8308
- package/dist/chunk-WDY773GJ.js.map +0 -1
- package/dist/chunk-XE4EOKS4.mjs.map +0 -1
- package/dist/client.d.mts +0 -1461
- package/dist/client.d.ts +0 -1461
- package/dist/index.d.mts +0 -125
- package/dist/index.d.ts +0 -125
- package/dist/server.d.mts +0 -70
- 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 "{instance.type}" 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 "{block.type}" 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"]}
|