@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
package/dist/utils.mjs ADDED
@@ -0,0 +1,7 @@
1
+ "use client";
2
+ export { countEnabledItems, filterEnabledBlocks, filterEnabledComponents, findBlockInSection, findComponentInSection, formatBlockName, generateBlockId, generateHandle, generateId, generatePageId, generateSectionId, generateThemeId, getActiveBlocks, getActiveComponents, getBlockPath, getComponentPath, getComponentValues, getComponentsByType, getElementLabel, getFirstComponentByType, getSectionValues, getSelectionColor, groupBySlot, hasComponentType, hasEnabledItems, removeNestedBlock, sortBlocks, sortComponents, toComponentInstance, updateNestedBlock, updateNestedComponent, validateComponent, validateContent, validateSection, validateSettings, validateStyle } from './chunk-NHOIGGYU.mjs';
3
+ export { cn } from './chunk-O3XR7TW3.mjs';
4
+ import './chunk-F5TFNWFJ.mjs';
5
+ import './chunk-YOSPWY5K.mjs';
6
+ //# sourceMappingURL=utils.mjs.map
7
+ //# sourceMappingURL=utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"utils.mjs"}
@@ -0,0 +1,104 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunk2NMEKWO5_js = require('./chunk-2NMEKWO5.js');
5
+ var NextImage = require('next/image');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+ var NextLink = require('next/link');
8
+
9
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
+
11
+ var NextImage__default = /*#__PURE__*/_interopDefault(NextImage);
12
+ var NextLink__default = /*#__PURE__*/_interopDefault(NextLink);
13
+
14
+ function Image({
15
+ src,
16
+ alt,
17
+ width,
18
+ height,
19
+ fill,
20
+ priority,
21
+ className,
22
+ sizes,
23
+ quality = 75,
24
+ loading,
25
+ objectFit,
26
+ objectPosition,
27
+ onClick
28
+ }) {
29
+ if (fill) {
30
+ const fillProps = chunk2NMEKWO5_js.__spreadValues(chunk2NMEKWO5_js.__spreadValues({
31
+ src,
32
+ alt,
33
+ fill: true,
34
+ className,
35
+ quality,
36
+ priority,
37
+ loading,
38
+ onClick
39
+ }, sizes && { sizes }), objectFit || objectPosition ? {
40
+ style: chunk2NMEKWO5_js.__spreadValues(chunk2NMEKWO5_js.__spreadValues({}, objectFit ? { objectFit } : {}), objectPosition ? { objectPosition } : {})
41
+ } : {});
42
+ return /* @__PURE__ */ jsxRuntime.jsx(NextImage__default.default, chunk2NMEKWO5_js.__spreadValues({}, fillProps));
43
+ } else if (width && height) {
44
+ const dimensionProps = {
45
+ src,
46
+ alt,
47
+ width,
48
+ height,
49
+ className,
50
+ quality,
51
+ priority,
52
+ loading,
53
+ onClick
54
+ };
55
+ return /* @__PURE__ */ jsxRuntime.jsx(NextImage__default.default, chunk2NMEKWO5_js.__spreadValues({}, dimensionProps));
56
+ } else {
57
+ throw new Error("Image: Either fill or width+height must be provided");
58
+ }
59
+ }
60
+ function Link({
61
+ href,
62
+ children,
63
+ className,
64
+ target,
65
+ rel,
66
+ prefetch = true,
67
+ replace,
68
+ scroll = true,
69
+ onClick
70
+ }) {
71
+ const isExternal = href.startsWith("http") || href.startsWith("//");
72
+ if (isExternal) {
73
+ return /* @__PURE__ */ jsxRuntime.jsx(
74
+ "a",
75
+ {
76
+ href,
77
+ className,
78
+ target: target || "_blank",
79
+ rel: rel || "noopener noreferrer",
80
+ onClick,
81
+ children
82
+ }
83
+ );
84
+ }
85
+ return /* @__PURE__ */ jsxRuntime.jsx(
86
+ NextLink__default.default,
87
+ {
88
+ href,
89
+ className,
90
+ prefetch,
91
+ replace,
92
+ scroll,
93
+ onClick,
94
+ target,
95
+ rel,
96
+ children
97
+ }
98
+ );
99
+ }
100
+
101
+ exports.Image = Image;
102
+ exports.Link = Link;
103
+ //# sourceMappingURL=wrappers.js.map
104
+ //# sourceMappingURL=wrappers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/wrappers/image/index.tsx","../src/wrappers/link/index.tsx"],"names":["__spreadValues","jsx","NextImage","NextLink"],"mappings":";;;;;;;;;;;;AAuEO,SAAS,KAAA,CAAM;AAAA,EACpB,GAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAU,EAAA;AAAA,EACV,OAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EAAe;AAEb,EAAA,IAAI,IAAA,EAAM;AAER,IAAA,MAAM,SAAA,GAA4BA,+BAAA,CAAAA,+BAAA,CAAA;AAAA,MAChC,GAAA;AAAA,MACA,GAAA;AAAA,MACA,IAAA,EAAM,IAAA;AAAA,MACN,SAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KAAA,EACI,KAAA,IAAS,EAAE,KAAA,EAAM,CAAA,EACjB,aAAa,cAAA,GACb;AAAA,MACE,KAAA,EAAOA,+BAAA,CAAAA,+BAAA,CAAA,EAAA,EACD,SAAA,GAAY,EAAE,SAAA,EAAU,GAAI,EAAC,CAAA,EAC7B,cAAA,GAAiB,EAAE,cAAA,EAAe,GAAI,EAAC;AAAA,QAG/C,EAAC,CAAA;AAEP,IAAA,uBAAOC,cAAA,CAACC,gEAAc,SAAA,CAAW,CAAA;AAAA,EACnC,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAE1B,IAAA,MAAM,cAAA,GAAiC;AAAA,MACrC,GAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,uBAAOD,cAAA,CAACC,gEAAc,cAAA,CAAgB,CAAA;AAAA,EACxC,CAAA,MAAO;AACL,IAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,EACvE;AACF;ACxEO,SAAS,IAAA,CAAK;AAAA,EACnB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAA;AAAA,EACA,QAAA,GAAW,IAAA;AAAA,EACX,OAAA;AAAA,EACA,MAAA,GAAS,IAAA;AAAA,EACT;AACF,CAAA,EAAc;AAEZ,EAAA,MAAM,aAAa,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,IAAK,IAAA,CAAK,WAAW,IAAI,CAAA;AAElE,EAAA,IAAI,UAAA,EAAY;AAEd,IAAA,uBACED,cAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAQ,MAAA,IAAU,QAAA;AAAA,QAClB,KAAK,GAAA,IAAO,qBAAA;AAAA,QACZ,OAAA;AAAA,QAEC;AAAA;AAAA,KACH;AAAA,EAEJ;AAGA,EAAA,uBACEA,cAAAA;AAAA,IAACE,yBAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ","file":"wrappers.js","sourcesContent":["/**\n * Framework-agnostic Image wrapper component\n *\n * Wraps Next.js Image to provide a stable API for theme developers\n * that doesn't directly couple themes to Next.js.\n *\n * @public\n * @example\n * ```tsx\n * import { Image } from '@duongthiu/onex-core/components';\n *\n * // With explicit dimensions\n * <Image\n * src=\"/hero.jpg\"\n * alt=\"Hero image\"\n * width={1200}\n * height={600}\n * />\n *\n * // With fill mode\n * <Image\n * src=\"/banner.jpg\"\n * alt=\"Banner\"\n * fill\n * sizes=\"100vw\"\n * />\n * ```\n */\n\n\"use client\";\n\nimport NextImage from \"next/image\";\nimport type { ImageProps as NextImageProps } from \"next/image\";\n\n/**\n * Image component props\n * Subset of Next.js Image props that work across frameworks\n */\nexport interface ImageProps {\n /** Image source URL or path */\n src: string;\n /** Alt text for accessibility */\n alt: string;\n /** Width in pixels (required unless fill=true) */\n width?: number;\n /** Height in pixels (required unless fill=true) */\n height?: number;\n /** Fill parent container */\n fill?: boolean;\n /** Load image with high priority (above-the-fold) */\n priority?: boolean;\n /** CSS class name */\n className?: string;\n /** Responsive sizes attribute */\n sizes?: string;\n /** Image quality (1-100) */\n quality?: number;\n /** Loading strategy */\n loading?: \"lazy\" | \"eager\";\n /** Object fit */\n objectFit?: \"contain\" | \"cover\" | \"fill\" | \"none\" | \"scale-down\";\n /** Object position */\n objectPosition?: string;\n /** onClick handler */\n onClick?: () => void;\n}\n\n/**\n * Image component wrapping Next.js Image\n * Provides framework-agnostic API for theme developers\n */\nexport function Image({\n src,\n alt,\n width,\n height,\n fill,\n priority,\n className,\n sizes,\n quality = 75,\n loading,\n objectFit,\n objectPosition,\n onClick,\n}: ImageProps) {\n // Build Next.js props based on fill vs dimensions\n if (fill) {\n // Fill mode\n const fillProps: NextImageProps = {\n src,\n alt,\n fill: true,\n className,\n quality,\n priority,\n loading,\n onClick,\n ...(sizes && { sizes }),\n ...(objectFit || objectPosition\n ? {\n style: {\n ...(objectFit ? { objectFit } : {}),\n ...(objectPosition ? { objectPosition } : {}),\n },\n }\n : {}),\n };\n return <NextImage {...fillProps} />;\n } else if (width && height) {\n // Explicit dimensions mode\n const dimensionProps: NextImageProps = {\n src,\n alt,\n width,\n height,\n className,\n quality,\n priority,\n loading,\n onClick,\n };\n return <NextImage {...dimensionProps} />;\n } else {\n throw new Error(\"Image: Either fill or width+height must be provided\");\n }\n}\n\n// Re-export Next.js types that are framework-agnostic\nexport type { StaticImageData } from \"next/image\";\n","/**\n * Framework-agnostic Link wrapper component\n *\n * Wraps Next.js Link to provide a stable API for theme developers\n * that doesn't directly couple themes to Next.js.\n *\n * @public\n * @example\n * ```tsx\n * import { Link } from '@duongthiu/onex-core/components';\n *\n * // Internal link\n * <Link href=\"/about\">About Us</Link>\n *\n * // External link\n * <Link href=\"https://example.com\" target=\"_blank\">\n * External Site\n * </Link>\n * ```\n */\n\n\"use client\";\n\nimport NextLink from \"next/link\";\n\n/**\n * Link component props\n * Subset of Next.js Link props that work across frameworks\n */\nexport interface LinkProps {\n /** Target URL or path */\n href: string;\n /** Link children (text or elements) */\n children: React.ReactNode;\n /** CSS class name */\n className?: string;\n /** Target attribute */\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\";\n /** Rel attribute */\n rel?: string;\n /** Prefetch the page in the background */\n prefetch?: boolean;\n /** Replace the current history state instead of adding a new URL */\n replace?: boolean;\n /** Scroll to the top of the page after navigation */\n scroll?: boolean;\n /** onClick handler */\n onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n}\n\n/**\n * Link component wrapping Next.js Link\n * Provides framework-agnostic API for theme developers\n */\nexport function Link({\n href,\n children,\n className,\n target,\n rel,\n prefetch = true,\n replace,\n scroll = true,\n onClick,\n}: LinkProps) {\n // Handle external links\n const isExternal = href.startsWith(\"http\") || href.startsWith(\"//\");\n\n if (isExternal) {\n // External links use regular <a> tag\n return (\n <a\n href={href}\n className={className}\n target={target || \"_blank\"}\n rel={rel || \"noopener noreferrer\"}\n onClick={onClick}\n >\n {children}\n </a>\n );\n }\n\n // Internal links use Next.js Link\n return (\n <NextLink\n href={href}\n className={className}\n prefetch={prefetch}\n replace={replace}\n scroll={scroll}\n onClick={onClick}\n target={target}\n rel={rel}\n >\n {children}\n </NextLink>\n );\n}\n"]}
@@ -0,0 +1,96 @@
1
+ "use client";
2
+ import { __spreadValues } from './chunk-YOSPWY5K.mjs';
3
+ import NextImage from 'next/image';
4
+ import { jsx } from 'react/jsx-runtime';
5
+ import NextLink from 'next/link';
6
+
7
+ function Image({
8
+ src,
9
+ alt,
10
+ width,
11
+ height,
12
+ fill,
13
+ priority,
14
+ className,
15
+ sizes,
16
+ quality = 75,
17
+ loading,
18
+ objectFit,
19
+ objectPosition,
20
+ onClick
21
+ }) {
22
+ if (fill) {
23
+ const fillProps = __spreadValues(__spreadValues({
24
+ src,
25
+ alt,
26
+ fill: true,
27
+ className,
28
+ quality,
29
+ priority,
30
+ loading,
31
+ onClick
32
+ }, sizes && { sizes }), objectFit || objectPosition ? {
33
+ style: __spreadValues(__spreadValues({}, objectFit ? { objectFit } : {}), objectPosition ? { objectPosition } : {})
34
+ } : {});
35
+ return /* @__PURE__ */ jsx(NextImage, __spreadValues({}, fillProps));
36
+ } else if (width && height) {
37
+ const dimensionProps = {
38
+ src,
39
+ alt,
40
+ width,
41
+ height,
42
+ className,
43
+ quality,
44
+ priority,
45
+ loading,
46
+ onClick
47
+ };
48
+ return /* @__PURE__ */ jsx(NextImage, __spreadValues({}, dimensionProps));
49
+ } else {
50
+ throw new Error("Image: Either fill or width+height must be provided");
51
+ }
52
+ }
53
+ function Link({
54
+ href,
55
+ children,
56
+ className,
57
+ target,
58
+ rel,
59
+ prefetch = true,
60
+ replace,
61
+ scroll = true,
62
+ onClick
63
+ }) {
64
+ const isExternal = href.startsWith("http") || href.startsWith("//");
65
+ if (isExternal) {
66
+ return /* @__PURE__ */ jsx(
67
+ "a",
68
+ {
69
+ href,
70
+ className,
71
+ target: target || "_blank",
72
+ rel: rel || "noopener noreferrer",
73
+ onClick,
74
+ children
75
+ }
76
+ );
77
+ }
78
+ return /* @__PURE__ */ jsx(
79
+ NextLink,
80
+ {
81
+ href,
82
+ className,
83
+ prefetch,
84
+ replace,
85
+ scroll,
86
+ onClick,
87
+ target,
88
+ rel,
89
+ children
90
+ }
91
+ );
92
+ }
93
+
94
+ export { Image, Link };
95
+ //# sourceMappingURL=wrappers.mjs.map
96
+ //# sourceMappingURL=wrappers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/wrappers/image/index.tsx","../src/wrappers/link/index.tsx"],"names":["jsx"],"mappings":";;;;;AAuEO,SAAS,KAAA,CAAM;AAAA,EACpB,GAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAU,EAAA;AAAA,EACV,OAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EAAe;AAEb,EAAA,IAAI,IAAA,EAAM;AAER,IAAA,MAAM,SAAA,GAA4B,cAAA,CAAA,cAAA,CAAA;AAAA,MAChC,GAAA;AAAA,MACA,GAAA;AAAA,MACA,IAAA,EAAM,IAAA;AAAA,MACN,SAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KAAA,EACI,KAAA,IAAS,EAAE,KAAA,EAAM,CAAA,EACjB,aAAa,cAAA,GACb;AAAA,MACE,KAAA,EAAO,cAAA,CAAA,cAAA,CAAA,EAAA,EACD,SAAA,GAAY,EAAE,SAAA,EAAU,GAAI,EAAC,CAAA,EAC7B,cAAA,GAAiB,EAAE,cAAA,EAAe,GAAI,EAAC;AAAA,QAG/C,EAAC,CAAA;AAEP,IAAA,uBAAO,GAAA,CAAC,8BAAc,SAAA,CAAW,CAAA;AAAA,EACnC,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAE1B,IAAA,MAAM,cAAA,GAAiC;AAAA,MACrC,GAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,uBAAO,GAAA,CAAC,8BAAc,cAAA,CAAgB,CAAA;AAAA,EACxC,CAAA,MAAO;AACL,IAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,EACvE;AACF;ACxEO,SAAS,IAAA,CAAK;AAAA,EACnB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAA;AAAA,EACA,QAAA,GAAW,IAAA;AAAA,EACX,OAAA;AAAA,EACA,MAAA,GAAS,IAAA;AAAA,EACT;AACF,CAAA,EAAc;AAEZ,EAAA,MAAM,aAAa,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,IAAK,IAAA,CAAK,WAAW,IAAI,CAAA;AAElE,EAAA,IAAI,UAAA,EAAY;AAEd,IAAA,uBACEA,GAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAQ,MAAA,IAAU,QAAA;AAAA,QAClB,KAAK,GAAA,IAAO,qBAAA;AAAA,QACZ,OAAA;AAAA,QAEC;AAAA;AAAA,KACH;AAAA,EAEJ;AAGA,EAAA,uBACEA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ","file":"wrappers.mjs","sourcesContent":["/**\n * Framework-agnostic Image wrapper component\n *\n * Wraps Next.js Image to provide a stable API for theme developers\n * that doesn't directly couple themes to Next.js.\n *\n * @public\n * @example\n * ```tsx\n * import { Image } from '@duongthiu/onex-core/components';\n *\n * // With explicit dimensions\n * <Image\n * src=\"/hero.jpg\"\n * alt=\"Hero image\"\n * width={1200}\n * height={600}\n * />\n *\n * // With fill mode\n * <Image\n * src=\"/banner.jpg\"\n * alt=\"Banner\"\n * fill\n * sizes=\"100vw\"\n * />\n * ```\n */\n\n\"use client\";\n\nimport NextImage from \"next/image\";\nimport type { ImageProps as NextImageProps } from \"next/image\";\n\n/**\n * Image component props\n * Subset of Next.js Image props that work across frameworks\n */\nexport interface ImageProps {\n /** Image source URL or path */\n src: string;\n /** Alt text for accessibility */\n alt: string;\n /** Width in pixels (required unless fill=true) */\n width?: number;\n /** Height in pixels (required unless fill=true) */\n height?: number;\n /** Fill parent container */\n fill?: boolean;\n /** Load image with high priority (above-the-fold) */\n priority?: boolean;\n /** CSS class name */\n className?: string;\n /** Responsive sizes attribute */\n sizes?: string;\n /** Image quality (1-100) */\n quality?: number;\n /** Loading strategy */\n loading?: \"lazy\" | \"eager\";\n /** Object fit */\n objectFit?: \"contain\" | \"cover\" | \"fill\" | \"none\" | \"scale-down\";\n /** Object position */\n objectPosition?: string;\n /** onClick handler */\n onClick?: () => void;\n}\n\n/**\n * Image component wrapping Next.js Image\n * Provides framework-agnostic API for theme developers\n */\nexport function Image({\n src,\n alt,\n width,\n height,\n fill,\n priority,\n className,\n sizes,\n quality = 75,\n loading,\n objectFit,\n objectPosition,\n onClick,\n}: ImageProps) {\n // Build Next.js props based on fill vs dimensions\n if (fill) {\n // Fill mode\n const fillProps: NextImageProps = {\n src,\n alt,\n fill: true,\n className,\n quality,\n priority,\n loading,\n onClick,\n ...(sizes && { sizes }),\n ...(objectFit || objectPosition\n ? {\n style: {\n ...(objectFit ? { objectFit } : {}),\n ...(objectPosition ? { objectPosition } : {}),\n },\n }\n : {}),\n };\n return <NextImage {...fillProps} />;\n } else if (width && height) {\n // Explicit dimensions mode\n const dimensionProps: NextImageProps = {\n src,\n alt,\n width,\n height,\n className,\n quality,\n priority,\n loading,\n onClick,\n };\n return <NextImage {...dimensionProps} />;\n } else {\n throw new Error(\"Image: Either fill or width+height must be provided\");\n }\n}\n\n// Re-export Next.js types that are framework-agnostic\nexport type { StaticImageData } from \"next/image\";\n","/**\n * Framework-agnostic Link wrapper component\n *\n * Wraps Next.js Link to provide a stable API for theme developers\n * that doesn't directly couple themes to Next.js.\n *\n * @public\n * @example\n * ```tsx\n * import { Link } from '@duongthiu/onex-core/components';\n *\n * // Internal link\n * <Link href=\"/about\">About Us</Link>\n *\n * // External link\n * <Link href=\"https://example.com\" target=\"_blank\">\n * External Site\n * </Link>\n * ```\n */\n\n\"use client\";\n\nimport NextLink from \"next/link\";\n\n/**\n * Link component props\n * Subset of Next.js Link props that work across frameworks\n */\nexport interface LinkProps {\n /** Target URL or path */\n href: string;\n /** Link children (text or elements) */\n children: React.ReactNode;\n /** CSS class name */\n className?: string;\n /** Target attribute */\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\";\n /** Rel attribute */\n rel?: string;\n /** Prefetch the page in the background */\n prefetch?: boolean;\n /** Replace the current history state instead of adding a new URL */\n replace?: boolean;\n /** Scroll to the top of the page after navigation */\n scroll?: boolean;\n /** onClick handler */\n onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n}\n\n/**\n * Link component wrapping Next.js Link\n * Provides framework-agnostic API for theme developers\n */\nexport function Link({\n href,\n children,\n className,\n target,\n rel,\n prefetch = true,\n replace,\n scroll = true,\n onClick,\n}: LinkProps) {\n // Handle external links\n const isExternal = href.startsWith(\"http\") || href.startsWith(\"//\");\n\n if (isExternal) {\n // External links use regular <a> tag\n return (\n <a\n href={href}\n className={className}\n target={target || \"_blank\"}\n rel={rel || \"noopener noreferrer\"}\n onClick={onClick}\n >\n {children}\n </a>\n );\n }\n\n // Internal links use Next.js Link\n return (\n <NextLink\n href={href}\n className={className}\n prefetch={prefetch}\n replace={replace}\n scroll={scroll}\n onClick={onClick}\n target={target}\n rel={rel}\n >\n {children}\n </NextLink>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duongthiu/onex-core",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "OneX Core - Theme rendering system and registry for building multi-tenant websites with visual editing",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -21,6 +21,101 @@
21
21
  "import": "./dist/server.mjs",
22
22
  "require": "./dist/server.js"
23
23
  },
24
+ "./internal": {
25
+ "types": "./dist/internal.d.ts",
26
+ "import": "./dist/internal.mjs",
27
+ "require": "./dist/internal.js"
28
+ },
29
+ "./components": {
30
+ "types": "./dist/components.d.ts",
31
+ "import": "./dist/components.mjs",
32
+ "require": "./dist/components.js"
33
+ },
34
+ "./wrappers": {
35
+ "types": "./dist/wrappers.d.ts",
36
+ "import": "./dist/wrappers.mjs",
37
+ "require": "./dist/wrappers.js"
38
+ },
39
+ "./motion": {
40
+ "types": "./dist/motion.d.ts",
41
+ "import": "./dist/motion.mjs",
42
+ "require": "./dist/motion.js"
43
+ },
44
+ "./icons": {
45
+ "types": "./dist/icons.d.ts",
46
+ "import": "./dist/icons.mjs",
47
+ "require": "./dist/icons.js"
48
+ },
49
+ "./types": {
50
+ "types": "./dist/types.d.ts",
51
+ "import": "./dist/types.mjs",
52
+ "require": "./dist/types.js"
53
+ },
54
+ "./utils": {
55
+ "types": "./dist/utils.d.ts",
56
+ "import": "./dist/utils.mjs",
57
+ "require": "./dist/utils.js"
58
+ },
59
+ "./renderers": {
60
+ "types": "./dist/renderers.d.ts",
61
+ "import": "./dist/renderers.mjs",
62
+ "require": "./dist/renderers.js"
63
+ },
64
+ "./registry": {
65
+ "types": "./dist/registry.d.ts",
66
+ "import": "./dist/registry.mjs",
67
+ "require": "./dist/registry.js"
68
+ },
69
+ "./contexts": {
70
+ "types": "./dist/contexts.d.ts",
71
+ "import": "./dist/contexts.mjs",
72
+ "require": "./dist/contexts.js"
73
+ },
74
+ "./config": {
75
+ "types": "./dist/config.d.ts",
76
+ "import": "./dist/config.mjs",
77
+ "require": "./dist/config.js"
78
+ },
79
+ "./api": {
80
+ "types": "./dist/api.d.ts",
81
+ "import": "./dist/api.mjs",
82
+ "require": "./dist/api.js"
83
+ },
84
+ "./auth": {
85
+ "types": "./dist/auth.d.ts",
86
+ "import": "./dist/auth.mjs",
87
+ "require": "./dist/auth.js"
88
+ },
89
+ "./cart": {
90
+ "types": "./dist/cart.d.ts",
91
+ "import": "./dist/cart.mjs",
92
+ "require": "./dist/cart.js"
93
+ },
94
+ "./products": {
95
+ "types": "./dist/products.d.ts",
96
+ "import": "./dist/products.mjs",
97
+ "require": "./dist/products.js"
98
+ },
99
+ "./orders": {
100
+ "types": "./dist/orders.d.ts",
101
+ "import": "./dist/orders.mjs",
102
+ "require": "./dist/orders.js"
103
+ },
104
+ "./finance": {
105
+ "types": "./dist/finance.d.ts",
106
+ "import": "./dist/finance.mjs",
107
+ "require": "./dist/finance.js"
108
+ },
109
+ "./contact": {
110
+ "types": "./dist/contact.d.ts",
111
+ "import": "./dist/contact.mjs",
112
+ "require": "./dist/contact.js"
113
+ },
114
+ "./blog": {
115
+ "types": "./dist/blog.d.ts",
116
+ "import": "./dist/blog.mjs",
117
+ "require": "./dist/blog.js"
118
+ },
24
119
  "./package.json": "./package.json"
25
120
  },
26
121
  "files": [
@@ -75,12 +170,16 @@
75
170
  },
76
171
  "sideEffects": false,
77
172
  "peerDependencies": {
78
- "react": "^19.2.1",
79
- "react-dom": "^19.2.1",
173
+ "framer-motion": ">=11.0.0",
174
+ "lucide-react": ">=0.5.0",
80
175
  "next": ">=14.0.0",
81
- "lucide-react": ">=0.5.0"
176
+ "react": "^19.2.1",
177
+ "react-dom": "^19.2.1"
82
178
  },
83
179
  "peerDependenciesMeta": {
180
+ "framer-motion": {
181
+ "optional": true
182
+ },
84
183
  "next": {
85
184
  "optional": true
86
185
  },
@@ -89,18 +188,22 @@
89
188
  }
90
189
  },
91
190
  "dependencies": {
92
- "clsx": "^2.1.1",
93
- "tailwind-merge": "^3.4.0",
94
- "zod": "^4.1.13",
95
- "class-variance-authority": "^0.7.1",
191
+ "@hookform/resolvers": "^5.2.2",
96
192
  "@radix-ui/react-accordion": "^1.2.12",
97
193
  "@radix-ui/react-checkbox": "^1.3.3",
98
194
  "@radix-ui/react-label": "^2.1.8",
99
195
  "@radix-ui/react-progress": "^1.1.8",
100
196
  "@radix-ui/react-select": "^2.2.6",
101
197
  "@radix-ui/react-separator": "^1.1.8",
198
+ "@radix-ui/react-slot": "^1.2.4",
102
199
  "@radix-ui/react-tabs": "^1.1.13",
103
- "@radix-ui/react-slot": "^1.2.4"
200
+ "axios": "^1.13.2",
201
+ "class-variance-authority": "^0.7.1",
202
+ "clsx": "^2.1.1",
203
+ "react-hook-form": "^7.68.0",
204
+ "tailwind-merge": "^3.4.0",
205
+ "zod": "^4.1.13",
206
+ "zustand": "^5.0.10"
104
207
  },
105
208
  "devDependencies": {
106
209
  "@types/react": "^19",