@hanzo/ui 8.27.8 → 8.27.10

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 (253) hide show
  1. package/README.md +2 -1
  2. package/dist/backends/gui/3d-card.cjs +100 -0
  3. package/dist/backends/gui/3d-card.d.ts +59 -0
  4. package/dist/backends/gui/3d-card.d.ts.map +1 -0
  5. package/dist/backends/gui/3d-card.js +92 -0
  6. package/dist/backends/gui/3d-card.js.map +1 -0
  7. package/dist/backends/gui/3d-marquee.cjs +225 -0
  8. package/dist/backends/gui/3d-marquee.d.ts +114 -0
  9. package/dist/backends/gui/3d-marquee.d.ts.map +1 -0
  10. package/dist/backends/gui/3d-marquee.js +190 -0
  11. package/dist/backends/gui/3d-marquee.js.map +1 -0
  12. package/dist/backends/gui/3d-pin.cjs +51 -0
  13. package/dist/backends/gui/3d-pin.d.ts +14 -0
  14. package/dist/backends/gui/3d-pin.d.ts.map +1 -0
  15. package/dist/backends/gui/3d-pin.js +49 -0
  16. package/dist/backends/gui/3d-pin.js.map +1 -0
  17. package/dist/backends/gui/advanced-chart.cjs +61 -0
  18. package/dist/backends/gui/advanced-chart.d.ts +38 -0
  19. package/dist/backends/gui/advanced-chart.d.ts.map +1 -0
  20. package/dist/backends/gui/advanced-chart.js +59 -0
  21. package/dist/backends/gui/advanced-chart.js.map +1 -0
  22. package/dist/backends/gui/alert.cjs +106 -0
  23. package/dist/backends/gui/alert.d.ts +39 -0
  24. package/dist/backends/gui/alert.d.ts.map +1 -0
  25. package/dist/backends/gui/alert.js +102 -0
  26. package/dist/backends/gui/alert.js.map +1 -0
  27. package/dist/backends/gui/android.cjs +52 -0
  28. package/dist/backends/gui/android.d.ts +16 -0
  29. package/dist/backends/gui/android.d.ts.map +1 -0
  30. package/dist/backends/gui/android.js +50 -0
  31. package/dist/backends/gui/android.js.map +1 -0
  32. package/dist/backends/gui/animated-beam.cjs +97 -0
  33. package/dist/backends/gui/animated-beam.d.ts +57 -0
  34. package/dist/backends/gui/animated-beam.d.ts.map +1 -0
  35. package/dist/backends/gui/animated-beam.js +62 -0
  36. package/dist/backends/gui/animated-beam.js.map +1 -0
  37. package/dist/backends/gui/animated-cursor.cjs +183 -0
  38. package/dist/backends/gui/animated-cursor.d.ts +42 -0
  39. package/dist/backends/gui/animated-cursor.d.ts.map +1 -0
  40. package/dist/backends/gui/animated-cursor.js +181 -0
  41. package/dist/backends/gui/animated-cursor.js.map +1 -0
  42. package/dist/backends/gui/animated-testimonials.cjs +109 -0
  43. package/dist/backends/gui/animated-testimonials.d.ts +23 -0
  44. package/dist/backends/gui/animated-testimonials.d.ts.map +1 -0
  45. package/dist/backends/gui/animated-testimonials.js +74 -0
  46. package/dist/backends/gui/animated-testimonials.js.map +1 -0
  47. package/dist/backends/gui/animated-tooltip.cjs +100 -0
  48. package/dist/backends/gui/animated-tooltip.d.ts +15 -0
  49. package/dist/backends/gui/animated-tooltip.d.ts.map +1 -0
  50. package/dist/backends/gui/animated-tooltip.js +65 -0
  51. package/dist/backends/gui/animated-tooltip.js.map +1 -0
  52. package/dist/backends/gui/announcement.cjs +54 -0
  53. package/dist/backends/gui/announcement.d.ts +26 -0
  54. package/dist/backends/gui/announcement.d.ts.map +1 -0
  55. package/dist/backends/gui/announcement.js +52 -0
  56. package/dist/backends/gui/announcement.js.map +1 -0
  57. package/dist/backends/gui/apple-cards-carousel.cjs +198 -0
  58. package/dist/backends/gui/apple-cards-carousel.d.ts +45 -0
  59. package/dist/backends/gui/apple-cards-carousel.d.ts.map +1 -0
  60. package/dist/backends/gui/apple-cards-carousel.js +162 -0
  61. package/dist/backends/gui/apple-cards-carousel.js.map +1 -0
  62. package/dist/backends/gui/apple-hello-effect.cjs +38 -0
  63. package/dist/backends/gui/apple-hello-effect.d.ts +9 -0
  64. package/dist/backends/gui/apple-hello-effect.d.ts.map +1 -0
  65. package/dist/backends/gui/apple-hello-effect.js +36 -0
  66. package/dist/backends/gui/apple-hello-effect.js.map +1 -0
  67. package/dist/backends/gui/banner.cjs +108 -0
  68. package/dist/backends/gui/banner.d.ts +33 -0
  69. package/dist/backends/gui/banner.d.ts.map +1 -0
  70. package/dist/backends/gui/banner.js +106 -0
  71. package/dist/backends/gui/banner.js.map +1 -0
  72. package/dist/backends/gui/calendar.cjs +152 -0
  73. package/dist/backends/gui/calendar.d.ts +41 -0
  74. package/dist/backends/gui/calendar.d.ts.map +1 -0
  75. package/dist/backends/gui/calendar.js +151 -0
  76. package/dist/backends/gui/calendar.js.map +1 -0
  77. package/dist/backends/gui/choicebox.cjs +50 -0
  78. package/dist/backends/gui/choicebox.d.ts +33 -0
  79. package/dist/backends/gui/choicebox.d.ts.map +1 -0
  80. package/dist/backends/gui/choicebox.js +49 -0
  81. package/dist/backends/gui/choicebox.js.map +1 -0
  82. package/dist/backends/gui/code-block.cjs +120 -0
  83. package/dist/backends/gui/code-block.d.ts +22 -0
  84. package/dist/backends/gui/code-block.d.ts.map +1 -0
  85. package/dist/backends/gui/code-block.js +118 -0
  86. package/dist/backends/gui/code-block.js.map +1 -0
  87. package/dist/backends/gui/code-editor.cjs +195 -0
  88. package/dist/backends/gui/code-editor.d.ts +43 -0
  89. package/dist/backends/gui/code-editor.d.ts.map +1 -0
  90. package/dist/backends/gui/code-editor.js +160 -0
  91. package/dist/backends/gui/code-editor.js.map +1 -0
  92. package/dist/backends/gui/code-tabs.cjs +21 -0
  93. package/dist/backends/gui/code-tabs.d.ts +22 -0
  94. package/dist/backends/gui/code-tabs.d.ts.map +1 -0
  95. package/dist/backends/gui/code-tabs.js +19 -0
  96. package/dist/backends/gui/code-tabs.js.map +1 -0
  97. package/dist/backends/gui/color-picker.cjs +141 -0
  98. package/dist/backends/gui/color-picker.d.ts +25 -0
  99. package/dist/backends/gui/color-picker.d.ts.map +1 -0
  100. package/dist/backends/gui/color-picker.js +139 -0
  101. package/dist/backends/gui/color-picker.js.map +1 -0
  102. package/dist/backends/gui/combobox.cjs +42 -0
  103. package/dist/backends/gui/combobox.d.ts +39 -0
  104. package/dist/backends/gui/combobox.d.ts.map +1 -0
  105. package/dist/backends/gui/combobox.js +40 -0
  106. package/dist/backends/gui/combobox.js.map +1 -0
  107. package/dist/backends/gui/company-profile.cjs +43 -0
  108. package/dist/backends/gui/company-profile.d.ts +33 -0
  109. package/dist/backends/gui/company-profile.d.ts.map +1 -0
  110. package/dist/backends/gui/company-profile.js +41 -0
  111. package/dist/backends/gui/company-profile.js.map +1 -0
  112. package/dist/backends/gui/comparison.cjs +43 -0
  113. package/dist/backends/gui/comparison.d.ts +16 -0
  114. package/dist/backends/gui/comparison.d.ts.map +1 -0
  115. package/dist/backends/gui/comparison.js +41 -0
  116. package/dist/backends/gui/comparison.js.map +1 -0
  117. package/dist/backends/gui/credit-card.cjs +80 -0
  118. package/dist/backends/gui/credit-card.d.ts +21 -0
  119. package/dist/backends/gui/credit-card.d.ts.map +1 -0
  120. package/dist/backends/gui/credit-card.js +78 -0
  121. package/dist/backends/gui/credit-card.js.map +1 -0
  122. package/dist/backends/gui/crypto-market.cjs +128 -0
  123. package/dist/backends/gui/crypto-market.d.ts +52 -0
  124. package/dist/backends/gui/crypto-market.d.ts.map +1 -0
  125. package/dist/backends/gui/crypto-market.js +126 -0
  126. package/dist/backends/gui/crypto-market.js.map +1 -0
  127. package/dist/backends/gui/crypto-screener.cjs +55 -0
  128. package/dist/backends/gui/crypto-screener.d.ts +42 -0
  129. package/dist/backends/gui/crypto-screener.d.ts.map +1 -0
  130. package/dist/backends/gui/crypto-screener.js +53 -0
  131. package/dist/backends/gui/crypto-screener.js.map +1 -0
  132. package/dist/backends/gui/cursor.cjs +40 -0
  133. package/dist/backends/gui/cursor.d.ts +16 -0
  134. package/dist/backends/gui/cursor.d.ts.map +1 -0
  135. package/dist/backends/gui/cursor.js +38 -0
  136. package/dist/backends/gui/cursor.js.map +1 -0
  137. package/dist/backends/gui/data-table.cjs +211 -0
  138. package/dist/backends/gui/data-table.d.ts +71 -0
  139. package/dist/backends/gui/data-table.d.ts.map +1 -0
  140. package/dist/backends/gui/data-table.js +175 -0
  141. package/dist/backends/gui/data-table.js.map +1 -0
  142. package/dist/backends/gui/date-picker.cjs +66 -0
  143. package/dist/backends/gui/date-picker.d.ts +29 -0
  144. package/dist/backends/gui/date-picker.d.ts.map +1 -0
  145. package/dist/backends/gui/date-picker.js +64 -0
  146. package/dist/backends/gui/date-picker.js.map +1 -0
  147. package/dist/backends/gui/desktop-spotlight.cjs +46 -0
  148. package/dist/backends/gui/desktop-spotlight.d.ts +34 -0
  149. package/dist/backends/gui/desktop-spotlight.d.ts.map +1 -0
  150. package/dist/backends/gui/desktop-spotlight.js +44 -0
  151. package/dist/backends/gui/desktop-spotlight.js.map +1 -0
  152. package/dist/backends/gui/desktop-window.cjs +180 -0
  153. package/dist/backends/gui/desktop-window.d.ts +51 -0
  154. package/dist/backends/gui/desktop-window.d.ts.map +1 -0
  155. package/dist/backends/gui/desktop-window.js +177 -0
  156. package/dist/backends/gui/desktop-window.js.map +1 -0
  157. package/dist/backends/gui/desktop.cjs +238 -0
  158. package/dist/backends/gui/desktop.d.ts +109 -0
  159. package/dist/backends/gui/desktop.d.ts.map +1 -0
  160. package/dist/backends/gui/desktop.js +199 -0
  161. package/dist/backends/gui/desktop.js.map +1 -0
  162. package/dist/backends/gui/dialog-stack.cjs +26 -0
  163. package/dist/backends/gui/dialog-stack.d.ts +23 -0
  164. package/dist/backends/gui/dialog-stack.d.ts.map +1 -0
  165. package/dist/backends/gui/dialog-stack.js +24 -0
  166. package/dist/backends/gui/dialog-stack.js.map +1 -0
  167. package/dist/backends/gui/dock.cjs +99 -0
  168. package/dist/backends/gui/dock.d.ts +41 -0
  169. package/dist/backends/gui/dock.d.ts.map +1 -0
  170. package/dist/backends/gui/dock.js +96 -0
  171. package/dist/backends/gui/dock.js.map +1 -0
  172. package/dist/backends/gui/dropzone.cjs +142 -0
  173. package/dist/backends/gui/dropzone.d.ts +12 -0
  174. package/dist/backends/gui/dropzone.d.ts.map +1 -0
  175. package/dist/backends/gui/dropzone.js +140 -0
  176. package/dist/backends/gui/dropzone.js.map +1 -0
  177. package/dist/backends/gui/editor.cjs +80 -0
  178. package/dist/backends/gui/editor.d.ts +23 -0
  179. package/dist/backends/gui/editor.d.ts.map +1 -0
  180. package/dist/backends/gui/editor.js +45 -0
  181. package/dist/backends/gui/editor.js.map +1 -0
  182. package/dist/backends/gui/empty.cjs +71 -0
  183. package/dist/backends/gui/empty.d.ts +43 -0
  184. package/dist/backends/gui/empty.d.ts.map +1 -0
  185. package/dist/backends/gui/empty.js +63 -0
  186. package/dist/backends/gui/empty.js.map +1 -0
  187. package/dist/backends/gui/financials.cjs +45 -0
  188. package/dist/backends/gui/financials.d.ts +36 -0
  189. package/dist/backends/gui/financials.d.ts.map +1 -0
  190. package/dist/backends/gui/financials.js +43 -0
  191. package/dist/backends/gui/financials.js.map +1 -0
  192. package/dist/backends/gui/forex-market.cjs +21 -0
  193. package/dist/backends/gui/forex-market.d.ts +17 -0
  194. package/dist/backends/gui/forex-market.d.ts.map +1 -0
  195. package/dist/backends/gui/forex-market.js +19 -0
  196. package/dist/backends/gui/forex-market.js.map +1 -0
  197. package/dist/backends/gui/forex-screener.cjs +57 -0
  198. package/dist/backends/gui/forex-screener.d.ts +45 -0
  199. package/dist/backends/gui/forex-screener.d.ts.map +1 -0
  200. package/dist/backends/gui/forex-screener.js +55 -0
  201. package/dist/backends/gui/forex-screener.js.map +1 -0
  202. package/dist/backends/gui/gantt.cjs +50 -0
  203. package/dist/backends/gui/gantt.d.ts +19 -0
  204. package/dist/backends/gui/gantt.d.ts.map +1 -0
  205. package/dist/backends/gui/gantt.js +49 -0
  206. package/dist/backends/gui/gantt.js.map +1 -0
  207. package/dist/backends/gui/index.cjs +108 -1
  208. package/dist/backends/gui/index.d.ts +41 -0
  209. package/dist/backends/gui/index.d.ts.map +1 -1
  210. package/dist/backends/gui/index.js +41 -0
  211. package/dist/backends/gui/index.js.map +1 -1
  212. package/dist/canvas.cjs +3 -3
  213. package/dist/canvas.js +3 -3
  214. package/dist/canvas.js.map +1 -1
  215. package/dist/gallery.html +2 -2
  216. package/dist/grid.cjs +19 -43
  217. package/dist/grid.d.ts +36 -1
  218. package/dist/grid.d.ts.map +1 -1
  219. package/dist/grid.js +19 -43
  220. package/dist/grid.js.map +1 -1
  221. package/dist/index.cjs +70 -1
  222. package/dist/index.d.ts +1 -0
  223. package/dist/index.d.ts.map +1 -1
  224. package/dist/index.js +3 -0
  225. package/dist/index.js.map +1 -1
  226. package/dist/index.node.cjs +70 -1
  227. package/dist/index.node.js +3 -0
  228. package/dist/product/ChunkGuard.cjs +58 -0
  229. package/dist/product/ChunkGuard.d.ts +7 -0
  230. package/dist/product/ChunkGuard.d.ts.map +1 -0
  231. package/dist/product/ChunkGuard.js +56 -0
  232. package/dist/product/ChunkGuard.js.map +1 -0
  233. package/dist/product/DetailPane.cjs +46 -0
  234. package/dist/product/DetailPane.d.ts +47 -0
  235. package/dist/product/DetailPane.d.ts.map +1 -0
  236. package/dist/product/DetailPane.js +43 -0
  237. package/dist/product/DetailPane.js.map +1 -0
  238. package/dist/product/Fact.cjs +19 -0
  239. package/dist/product/Fact.d.ts +23 -0
  240. package/dist/product/Fact.d.ts.map +1 -0
  241. package/dist/product/Fact.js +17 -0
  242. package/dist/product/Fact.js.map +1 -0
  243. package/dist/product/chunkGuard.logic.cjs +54 -0
  244. package/dist/product/chunkGuard.logic.d.ts +26 -0
  245. package/dist/product/chunkGuard.logic.d.ts.map +1 -0
  246. package/dist/product/chunkGuard.logic.js +49 -0
  247. package/dist/product/chunkGuard.logic.js.map +1 -0
  248. package/dist/product/index.cjs +10 -0
  249. package/dist/product/index.d.ts +3 -0
  250. package/dist/product/index.d.ts.map +1 -1
  251. package/dist/product/index.js +10 -0
  252. package/dist/product/index.js.map +1 -1
  253. package/package.json +5 -3
@@ -0,0 +1,58 @@
1
+ 'use client';"use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ChunkGuard = ChunkGuard;
5
+ /**
6
+ * ChunkGuard — window-level net that recovers from a stale-deploy chunk 404.
7
+ * Renders nothing; mount it once near the shell root.
8
+ *
9
+ * Two catch surfaces, because a chunk 404 surfaces two ways:
10
+ * - CAPTURE-phase `error` on the failing `<script>`/`<link>` element — a
11
+ * resource load error does NOT bubble, so only a capture listener sees
12
+ * it. This fires on the RAW 404 during the initial deep-link load,
13
+ * before the loader even rejects — the earliest, most reliable signal.
14
+ * - `unhandledrejection` / bubbled `error` carrying a `ChunkLoadError` —
15
+ * the dynamic-import path.
16
+ *
17
+ * A render-time error boundary catches the same class at RENDER time; this
18
+ * complements it for the async/resource paths a boundary never sees. See
19
+ * `chunkGuard.logic.ts` for the pure decisions this wires up.
20
+ */
21
+ const react_1 = require("react");
22
+ const chunkGuard_logic_1 = require("./chunkGuard.logic.cjs");
23
+ function ChunkGuard({ assetPathPrefix } = {}) {
24
+ (0, react_1.useEffect)(() => {
25
+ // Reload at most once per window, so a skew that trips several
26
+ // detectors at once reloads ONCE — never a reload loop.
27
+ const recover = () => {
28
+ try {
29
+ const raw = window.sessionStorage.getItem(chunkGuard_logic_1.CHUNK_RELOAD_AT_KEY);
30
+ const last = raw ? Number(raw) : null;
31
+ if (!(0, chunkGuard_logic_1.shouldReloadForChunk)(Date.now(), last))
32
+ return;
33
+ window.sessionStorage.setItem(chunkGuard_logic_1.CHUNK_RELOAD_AT_KEY, String(Date.now()));
34
+ window.location.reload();
35
+ }
36
+ catch {
37
+ /* sessionStorage blocked (private mode) — let a render boundary show its card */
38
+ }
39
+ };
40
+ const onError = (e) => {
41
+ if ((0, chunkGuard_logic_1.isBuildAssetError)(e.target, assetPathPrefix) || (0, chunkGuard_logic_1.isChunkLoadError)(e.error ?? e.message))
42
+ recover();
43
+ };
44
+ const onRejection = (e) => {
45
+ if ((0, chunkGuard_logic_1.isChunkLoadError)(e.reason))
46
+ recover();
47
+ };
48
+ // `capture: true` so the non-bubbling resource-load error on a 404'd
49
+ // chunk element reaches us.
50
+ window.addEventListener('error', onError, true);
51
+ window.addEventListener('unhandledrejection', onRejection);
52
+ return () => {
53
+ window.removeEventListener('error', onError, true);
54
+ window.removeEventListener('unhandledrejection', onRejection);
55
+ };
56
+ }, [assetPathPrefix]);
57
+ return null;
58
+ }
@@ -0,0 +1,7 @@
1
+ export type ChunkGuardProps = {
2
+ /** Path fragment identifying a build asset URL. Default `/_next/static/`
3
+ * (Next.js); pass the bundler's own prefix on another host. */
4
+ assetPathPrefix?: string;
5
+ };
6
+ export declare function ChunkGuard({ assetPathPrefix }?: ChunkGuardProps): null;
7
+ //# sourceMappingURL=ChunkGuard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChunkGuard.d.ts","sourceRoot":"","sources":["../../src/product/ChunkGuard.tsx"],"names":[],"mappings":"AAsBA,MAAM,MAAM,eAAe,GAAG;IAC5B;oEACgE;IAChE,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAED,wBAAgB,UAAU,CAAC,EAAE,eAAe,EAAE,GAAE,eAAoB,QAkCnE"}
@@ -0,0 +1,56 @@
1
+ 'use client';
2
+ /**
3
+ * ChunkGuard — window-level net that recovers from a stale-deploy chunk 404.
4
+ * Renders nothing; mount it once near the shell root.
5
+ *
6
+ * Two catch surfaces, because a chunk 404 surfaces two ways:
7
+ * - CAPTURE-phase `error` on the failing `<script>`/`<link>` element — a
8
+ * resource load error does NOT bubble, so only a capture listener sees
9
+ * it. This fires on the RAW 404 during the initial deep-link load,
10
+ * before the loader even rejects — the earliest, most reliable signal.
11
+ * - `unhandledrejection` / bubbled `error` carrying a `ChunkLoadError` —
12
+ * the dynamic-import path.
13
+ *
14
+ * A render-time error boundary catches the same class at RENDER time; this
15
+ * complements it for the async/resource paths a boundary never sees. See
16
+ * `chunkGuard.logic.ts` for the pure decisions this wires up.
17
+ */
18
+ import { useEffect } from 'react';
19
+ import { isBuildAssetError, isChunkLoadError, shouldReloadForChunk, CHUNK_RELOAD_AT_KEY } from './chunkGuard.logic.js';
20
+ export function ChunkGuard({ assetPathPrefix } = {}) {
21
+ useEffect(() => {
22
+ // Reload at most once per window, so a skew that trips several
23
+ // detectors at once reloads ONCE — never a reload loop.
24
+ const recover = () => {
25
+ try {
26
+ const raw = window.sessionStorage.getItem(CHUNK_RELOAD_AT_KEY);
27
+ const last = raw ? Number(raw) : null;
28
+ if (!shouldReloadForChunk(Date.now(), last))
29
+ return;
30
+ window.sessionStorage.setItem(CHUNK_RELOAD_AT_KEY, String(Date.now()));
31
+ window.location.reload();
32
+ }
33
+ catch {
34
+ /* sessionStorage blocked (private mode) — let a render boundary show its card */
35
+ }
36
+ };
37
+ const onError = (e) => {
38
+ if (isBuildAssetError(e.target, assetPathPrefix) || isChunkLoadError(e.error ?? e.message))
39
+ recover();
40
+ };
41
+ const onRejection = (e) => {
42
+ if (isChunkLoadError(e.reason))
43
+ recover();
44
+ };
45
+ // `capture: true` so the non-bubbling resource-load error on a 404'd
46
+ // chunk element reaches us.
47
+ window.addEventListener('error', onError, true);
48
+ window.addEventListener('unhandledrejection', onRejection);
49
+ return () => {
50
+ window.removeEventListener('error', onError, true);
51
+ window.removeEventListener('unhandledrejection', onRejection);
52
+ };
53
+ }, [assetPathPrefix]);
54
+ return null;
55
+ }
56
+ //# sourceMappingURL=ChunkGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChunkGuard.js","sourceRoot":"","sources":["../../src/product/ChunkGuard.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAQnH,MAAM,UAAU,UAAU,CAAC,EAAE,eAAe,EAAE,GAAoB,EAAE;IAClE,SAAS,CAAC,GAAG,EAAE;QACb,+DAA+D;QAC/D,wDAAwD;QACxD,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;gBAC9D,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;gBACrC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC;oBAAE,OAAM;gBACnD,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;gBACtE,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAA;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,iFAAiF;YACnF,CAAC;QACH,CAAC,CAAA;QAED,MAAM,OAAO,GAAG,CAAC,CAAa,EAAE,EAAE;YAChC,IAAI,iBAAiB,CAAC,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC;gBAAE,OAAO,EAAE,CAAA;QACvG,CAAC,CAAA;QACD,MAAM,WAAW,GAAG,CAAC,CAAwB,EAAE,EAAE;YAC/C,IAAI,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC;gBAAE,OAAO,EAAE,CAAA;QAC3C,CAAC,CAAA;QAED,qEAAqE;QACrE,4BAA4B;QAC5B,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QAC/C,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAA;QAC1D,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;YAClD,MAAM,CAAC,mBAAmB,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAA;QAC/D,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAA;IAErB,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,46 @@
1
+ 'use client';"use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.useDetailPane = useDetailPane;
5
+ exports.DetailPane = DetailPane;
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ /**
8
+ * DetailPane — the ONE reusable right-side pane for viewing or editing the
9
+ * details of an item. A product does NOT build its own pane: it writes a
10
+ * DESCRIPTOR (`{ title, subtitle?, icon?, content, footer? }`) and calls
11
+ * `useDetailPane().open(descriptor)`. The pane slides out from the right
12
+ * (full-screen on mobile) via `SlideOver`, so every "open item detail" looks
13
+ * and behaves identically (DRY).
14
+ *
15
+ * Rendered ONCE near the shell root; any module — a row, a list item, a
16
+ * pinned form — opens the same pane. Interactive content closes itself with
17
+ * `useDetailPane().close()`.
18
+ *
19
+ * The last descriptor stays mounted through the close transition, so the exit
20
+ * animates with its content (no flash of empty pane). Opening a new
21
+ * descriptor replaces it.
22
+ */
23
+ const react_1 = require("react");
24
+ const gui_1 = require("@hanzo/gui");
25
+ const lucide_icons_2_1 = require("@hanzogui/lucide-icons-2");
26
+ const SlideOver_1 = require("./SlideOver.cjs");
27
+ const color_1 = require("./color.cjs");
28
+ const Ctx = (0, react_1.createContext)(null);
29
+ function useDetailPane() {
30
+ const ctx = (0, react_1.useContext)(Ctx);
31
+ if (!ctx)
32
+ throw new Error('useDetailPane must be used within <DetailPane>');
33
+ return ctx;
34
+ }
35
+ function DetailPane({ children, zIndex }) {
36
+ const [isOpen, setIsOpen] = (0, react_1.useState)(false);
37
+ const [desc, setDesc] = (0, react_1.useState)(null);
38
+ const open = (0, react_1.useCallback)((descriptor) => {
39
+ setDesc(descriptor);
40
+ setIsOpen(true);
41
+ }, []);
42
+ const close = (0, react_1.useCallback)(() => setIsOpen(false), []);
43
+ const api = (0, react_1.useMemo)(() => ({ open, close, isOpen }), [open, close, isOpen]);
44
+ const Icon = desc?.icon;
45
+ return ((0, jsx_runtime_1.jsxs)(Ctx.Provider, { value: api, children: [children, (0, jsx_runtime_1.jsxs)(SlideOver_1.SlideOver, { open: isOpen, onClose: close, side: "right", size: desc?.size ?? 460, ariaLabel: typeof desc?.title === 'string' ? desc?.title : 'Details', zIndex: zIndex, children: [(0, jsx_runtime_1.jsxs)(gui_1.XStack, { items: "center", gap: "$2.5", px: "$4", height: 56, borderBottomWidth: 1, borderColor: "$borderColor", children: [Icon ? (0, jsx_runtime_1.jsx)(Icon, { size: 18, color: desc?.iconColor ? (0, color_1.asColor)(desc.iconColor) : undefined }) : null, (0, jsx_runtime_1.jsxs)(gui_1.YStack, { flex: 1, minW: 0, children: [(0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$5", fontWeight: "700", color: "$color12", numberOfLines: 1, children: desc?.title }), desc?.subtitle !== undefined ? ((0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$2", color: "$color10", numberOfLines: 1, children: desc?.subtitle })) : null] }), (0, jsx_runtime_1.jsx)(gui_1.Button, { size: "$2", chromeless: true, icon: (0, jsx_runtime_1.jsx)(lucide_icons_2_1.X, { size: 18 }), onPress: close, "aria-label": "Close" })] }), (0, jsx_runtime_1.jsx)(gui_1.ScrollView, { flex: 1, minH: 0, children: (0, jsx_runtime_1.jsx)(gui_1.YStack, { p: "$4", gap: "$3", children: desc?.content }) }), desc?.footer !== undefined ? ((0, jsx_runtime_1.jsx)(gui_1.XStack, { px: "$4", py: "$3", gap: "$2", borderTopWidth: 1, borderColor: "$borderColor", bg: "$color1", children: desc?.footer })) : null] })] }));
46
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * DetailPane — the ONE reusable right-side pane for viewing or editing the
3
+ * details of an item. A product does NOT build its own pane: it writes a
4
+ * DESCRIPTOR (`{ title, subtitle?, icon?, content, footer? }`) and calls
5
+ * `useDetailPane().open(descriptor)`. The pane slides out from the right
6
+ * (full-screen on mobile) via `SlideOver`, so every "open item detail" looks
7
+ * and behaves identically (DRY).
8
+ *
9
+ * Rendered ONCE near the shell root; any module — a row, a list item, a
10
+ * pinned form — opens the same pane. Interactive content closes itself with
11
+ * `useDetailPane().close()`.
12
+ *
13
+ * The last descriptor stays mounted through the close transition, so the exit
14
+ * animates with its content (no flash of empty pane). Opening a new
15
+ * descriptor replaces it.
16
+ */
17
+ import { type ReactNode } from 'react';
18
+ import { type IconLike } from './color.js';
19
+ export type DetailDescriptor = {
20
+ /** Pane title (the item's name). */
21
+ title: ReactNode;
22
+ /** Optional secondary line under the title (type, id, status…). */
23
+ subtitle?: ReactNode;
24
+ /** Optional title icon, tinted with `iconColor`. */
25
+ icon?: IconLike;
26
+ iconColor?: string;
27
+ /** Desktop pane width (px). Mobile is always full-screen. Default 460. */
28
+ size?: number;
29
+ /** The body — the detail view or edit form for the item. */
30
+ content: ReactNode;
31
+ /** Optional sticky footer (primary actions), pinned below the scroll body. */
32
+ footer?: ReactNode;
33
+ };
34
+ export type DetailPaneApi = {
35
+ open: (descriptor: DetailDescriptor) => void;
36
+ close: () => void;
37
+ isOpen: boolean;
38
+ };
39
+ export declare function useDetailPane(): DetailPaneApi;
40
+ export type DetailPaneProps = {
41
+ children: ReactNode;
42
+ /** z-index for stacking — a pane opened over another overlay passes a
43
+ * higher value. Left to `SlideOver`'s own default otherwise. */
44
+ zIndex?: number;
45
+ };
46
+ export declare function DetailPane({ children, zIndex }: DetailPaneProps): import("react").JSX.Element;
47
+ //# sourceMappingURL=DetailPane.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DetailPane.d.ts","sourceRoot":"","sources":["../../src/product/DetailPane.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAA;AAKd,OAAO,EAAW,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEhD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,oCAAoC;IACpC,KAAK,EAAE,SAAS,CAAA;IAChB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,oDAAoD;IACpD,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,4DAA4D;IAC5D,OAAO,EAAE,SAAS,CAAA;IAClB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,SAAS,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI,CAAA;IAC5C,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AAID,wBAAgB,aAAa,IAAI,aAAa,CAI7C;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,SAAS,CAAA;IACnB;qEACiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,eAAe,+BAsD/D"}
@@ -0,0 +1,43 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * DetailPane — the ONE reusable right-side pane for viewing or editing the
5
+ * details of an item. A product does NOT build its own pane: it writes a
6
+ * DESCRIPTOR (`{ title, subtitle?, icon?, content, footer? }`) and calls
7
+ * `useDetailPane().open(descriptor)`. The pane slides out from the right
8
+ * (full-screen on mobile) via `SlideOver`, so every "open item detail" looks
9
+ * and behaves identically (DRY).
10
+ *
11
+ * Rendered ONCE near the shell root; any module — a row, a list item, a
12
+ * pinned form — opens the same pane. Interactive content closes itself with
13
+ * `useDetailPane().close()`.
14
+ *
15
+ * The last descriptor stays mounted through the close transition, so the exit
16
+ * animates with its content (no flash of empty pane). Opening a new
17
+ * descriptor replaces it.
18
+ */
19
+ import { createContext, useCallback, useContext, useMemo, useState, } from 'react';
20
+ import { Button, ScrollView, Text, XStack, YStack } from '@hanzo/gui';
21
+ import { X } from '@hanzogui/lucide-icons-2';
22
+ import { SlideOver } from './SlideOver.js';
23
+ import { asColor } from './color.js';
24
+ const Ctx = createContext(null);
25
+ export function useDetailPane() {
26
+ const ctx = useContext(Ctx);
27
+ if (!ctx)
28
+ throw new Error('useDetailPane must be used within <DetailPane>');
29
+ return ctx;
30
+ }
31
+ export function DetailPane({ children, zIndex }) {
32
+ const [isOpen, setIsOpen] = useState(false);
33
+ const [desc, setDesc] = useState(null);
34
+ const open = useCallback((descriptor) => {
35
+ setDesc(descriptor);
36
+ setIsOpen(true);
37
+ }, []);
38
+ const close = useCallback(() => setIsOpen(false), []);
39
+ const api = useMemo(() => ({ open, close, isOpen }), [open, close, isOpen]);
40
+ const Icon = desc?.icon;
41
+ return (_jsxs(Ctx.Provider, { value: api, children: [children, _jsxs(SlideOver, { open: isOpen, onClose: close, side: "right", size: desc?.size ?? 460, ariaLabel: typeof desc?.title === 'string' ? desc?.title : 'Details', zIndex: zIndex, children: [_jsxs(XStack, { items: "center", gap: "$2.5", px: "$4", height: 56, borderBottomWidth: 1, borderColor: "$borderColor", children: [Icon ? _jsx(Icon, { size: 18, color: desc?.iconColor ? asColor(desc.iconColor) : undefined }) : null, _jsxs(YStack, { flex: 1, minW: 0, children: [_jsx(Text, { fontSize: "$5", fontWeight: "700", color: "$color12", numberOfLines: 1, children: desc?.title }), desc?.subtitle !== undefined ? (_jsx(Text, { fontSize: "$2", color: "$color10", numberOfLines: 1, children: desc?.subtitle })) : null] }), _jsx(Button, { size: "$2", chromeless: true, icon: _jsx(X, { size: 18 }), onPress: close, "aria-label": "Close" })] }), _jsx(ScrollView, { flex: 1, minH: 0, children: _jsx(YStack, { p: "$4", gap: "$3", children: desc?.content }) }), desc?.footer !== undefined ? (_jsx(XStack, { px: "$4", py: "$3", gap: "$2", borderTopWidth: 1, borderColor: "$borderColor", bg: "$color1", children: desc?.footer })) : null] })] }));
42
+ }
43
+ //# sourceMappingURL=DetailPane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DetailPane.js","sourceRoot":"","sources":["../../src/product/DetailPane.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Fact = Fact;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const gui_1 = require("@hanzo/gui");
6
+ const fonts_1 = require("../core/fonts.cjs");
7
+ /**
8
+ * Fact — one row of a property list: a label on the left, a value on the
9
+ * right, a hairline separator beneath. The read-only counterpart to `Field`'s
10
+ * editable row — a detail pane is a stack of these where a settings form is a
11
+ * stack of `Field`s.
12
+ *
13
+ * Written twice, near-identically, in two console detail drawers before
14
+ * either could find the other. This is the one definition; the wider of the
15
+ * two shapes won (a non-string `value` renders as given, not stringified).
16
+ */
17
+ function Fact({ label, value, mono }) {
18
+ return ((0, jsx_runtime_1.jsxs)(gui_1.XStack, { justify: "space-between", items: "center", py: "$1.5", borderBottomWidth: 1, borderColor: "$borderColor", gap: "$3", children: [(0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$2", color: "$color11", children: label }), typeof value === 'string' ? ((0, jsx_runtime_1.jsx)(gui_1.Text, { fontSize: "$2", color: "$color12", fontWeight: "600", numberOfLines: 1, style: mono ? { fontFamily: fonts_1.fontMono } : undefined, children: value })) : (value)] }));
19
+ }
@@ -0,0 +1,23 @@
1
+ import type { ReactNode } from 'react';
2
+ export type FactProps = {
3
+ /** The row's left-hand label. */
4
+ label: string;
5
+ /** The row's right-hand value. A string renders in the value color and
6
+ * weight; anything else (a badge, a link, a stack of controls) renders as
7
+ * given. */
8
+ value: ReactNode;
9
+ /** Render a string value in the monospace face — an id, a hash, a path. */
10
+ mono?: boolean;
11
+ };
12
+ /**
13
+ * Fact — one row of a property list: a label on the left, a value on the
14
+ * right, a hairline separator beneath. The read-only counterpart to `Field`'s
15
+ * editable row — a detail pane is a stack of these where a settings form is a
16
+ * stack of `Field`s.
17
+ *
18
+ * Written twice, near-identically, in two console detail drawers before
19
+ * either could find the other. This is the one definition; the wider of the
20
+ * two shapes won (a non-string `value` renders as given, not stringified).
21
+ */
22
+ export declare function Fact({ label, value, mono }: FactProps): import("react").JSX.Element;
23
+ //# sourceMappingURL=Fact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Fact.d.ts","sourceRoot":"","sources":["../../src/product/Fact.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAKtC,MAAM,MAAM,SAAS,GAAG;IACtB,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAA;IACb;;iBAEa;IACb,KAAK,EAAE,SAAS,CAAA;IAChB,2EAA2E;IAC3E,IAAI,CAAC,EAAE,OAAO,CAAA;CACf,CAAA;AAED;;;;;;;;;GASG;AACH,wBAAgB,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,SAAS,+BA4BrD"}
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Text, XStack } from '@hanzo/gui';
3
+ import { fontMono } from '../core/fonts.js';
4
+ /**
5
+ * Fact — one row of a property list: a label on the left, a value on the
6
+ * right, a hairline separator beneath. The read-only counterpart to `Field`'s
7
+ * editable row — a detail pane is a stack of these where a settings form is a
8
+ * stack of `Field`s.
9
+ *
10
+ * Written twice, near-identically, in two console detail drawers before
11
+ * either could find the other. This is the one definition; the wider of the
12
+ * two shapes won (a non-string `value` renders as given, not stringified).
13
+ */
14
+ export function Fact({ label, value, mono }) {
15
+ return (_jsxs(XStack, { justify: "space-between", items: "center", py: "$1.5", borderBottomWidth: 1, borderColor: "$borderColor", gap: "$3", children: [_jsx(Text, { fontSize: "$2", color: "$color11", children: label }), typeof value === 'string' ? (_jsx(Text, { fontSize: "$2", color: "$color12", fontWeight: "600", numberOfLines: 1, style: mono ? { fontFamily: fontMono } : undefined, children: value })) : (value)] }));
16
+ }
17
+ //# sourceMappingURL=Fact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Fact.js","sourceRoot":"","sources":["../../src/product/Fact.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAaxC;;;;;;;;;GASG;AACH,MAAM,UAAU,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAa;IACpD,OAAO,CACL,MAAC,MAAM,IACL,OAAO,EAAC,eAAe,EACvB,KAAK,EAAC,QAAQ,EACd,EAAE,EAAC,MAAM,EACT,iBAAiB,EAAE,CAAC,EACpB,WAAW,EAAC,cAAc,EAC1B,GAAG,EAAC,IAAI,aAER,KAAC,IAAI,IAAC,QAAQ,EAAC,IAAI,EAAC,KAAK,EAAC,UAAU,YACjC,KAAK,GACD,EACN,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAC3B,KAAC,IAAI,IACH,QAAQ,EAAC,IAAI,EACb,KAAK,EAAC,UAAU,EAChB,UAAU,EAAC,KAAK,EAChB,aAAa,EAAE,CAAC,EAChB,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,YAEjD,KAAK,GACD,CACR,CAAC,CAAC,CAAC,CACF,KAAK,CACN,IACM,CACV,CAAA;AACH,CAAC"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * Pure decisions for `ChunkGuard`, kept apart from the window listeners so
4
+ * they are unit-tested without a browser.
5
+ *
6
+ * On a rolling deploy, an open tab (or a fresh deep-link landing on a new
7
+ * replica) can request a hashed chunk that no longer exists. The 404 falls
8
+ * through to the app-shell HTML, so the browser throws `ChunkLoadError` /
9
+ * "Unexpected token '<'" trying to parse HTML as JS — a blank,
10
+ * unrecoverable screen. In a PRODUCTION build, user code never throws
11
+ * "Unexpected token '<'" at runtime (that is a build-time syntax error), so
12
+ * at runtime it is a chunk skew — recover, don't crash.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.CHUNK_RELOAD_AT_KEY = void 0;
16
+ exports.isChunkLoadError = isChunkLoadError;
17
+ exports.isBuildAssetError = isBuildAssetError;
18
+ exports.shouldReloadForChunk = shouldReloadForChunk;
19
+ /** The sessionStorage key a recovery reload is bounded by, so a skew that
20
+ * trips the guard more than once in a burst reloads at most once. */
21
+ exports.CHUNK_RELOAD_AT_KEY = 'hz.chunkReloadAt';
22
+ /** True for a webpack/Next dynamic chunk (JS or CSS) load failure, including
23
+ * the stale-deploy case where a 404'd chunk URL is parsed as JS. */
24
+ function isChunkLoadError(e) {
25
+ if (!e)
26
+ return false;
27
+ const name = typeof e === 'object' && e !== null && 'name' in e ? String(e.name) : '';
28
+ const msg = e instanceof Error ? e.message : String(e);
29
+ return (name === 'ChunkLoadError' ||
30
+ /ChunkLoadError/i.test(msg) ||
31
+ /Loading (?:CSS )?chunk [\w./-]+ failed/i.test(msg) ||
32
+ /(?:Failed to fetch|error loading|Importing a module script failed).*dynamically imported module/i.test(msg) ||
33
+ /Failed to fetch dynamically imported module/i.test(msg) ||
34
+ /Importing a module script failed/i.test(msg) ||
35
+ // Stale chunk URL served the HTML shell → parsed as JS.
36
+ /Unexpected token '<'|expected expression, got '<'|Unexpected token <|<!DOCTYPE/i.test(msg));
37
+ }
38
+ /** True for a failed resource load whose element targets a build asset
39
+ * (a script or stylesheet under `pathPrefix`, default `/_next/static/`). */
40
+ function isBuildAssetError(target, pathPrefix = '/_next/static/') {
41
+ if (!target || typeof target !== 'object')
42
+ return false;
43
+ const el = target;
44
+ const url = el.src || el.href;
45
+ return typeof url === 'string' && url.includes(pathPrefix);
46
+ }
47
+ /** Reload at most once per `windowMs` to recover from a chunk skew.
48
+ * `lastReloadAt` is the epoch-ms of the last recovery reload (null when
49
+ * there has been none); true means a fresh reload is safe. */
50
+ function shouldReloadForChunk(now, lastReloadAt, windowMs = 15_000) {
51
+ if (lastReloadAt == null || !Number.isFinite(lastReloadAt))
52
+ return true;
53
+ return now - lastReloadAt >= windowMs;
54
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Pure decisions for `ChunkGuard`, kept apart from the window listeners so
3
+ * they are unit-tested without a browser.
4
+ *
5
+ * On a rolling deploy, an open tab (or a fresh deep-link landing on a new
6
+ * replica) can request a hashed chunk that no longer exists. The 404 falls
7
+ * through to the app-shell HTML, so the browser throws `ChunkLoadError` /
8
+ * "Unexpected token '<'" trying to parse HTML as JS — a blank,
9
+ * unrecoverable screen. In a PRODUCTION build, user code never throws
10
+ * "Unexpected token '<'" at runtime (that is a build-time syntax error), so
11
+ * at runtime it is a chunk skew — recover, don't crash.
12
+ */
13
+ /** The sessionStorage key a recovery reload is bounded by, so a skew that
14
+ * trips the guard more than once in a burst reloads at most once. */
15
+ export declare const CHUNK_RELOAD_AT_KEY = "hz.chunkReloadAt";
16
+ /** True for a webpack/Next dynamic chunk (JS or CSS) load failure, including
17
+ * the stale-deploy case where a 404'd chunk URL is parsed as JS. */
18
+ export declare function isChunkLoadError(e: unknown): boolean;
19
+ /** True for a failed resource load whose element targets a build asset
20
+ * (a script or stylesheet under `pathPrefix`, default `/_next/static/`). */
21
+ export declare function isBuildAssetError(target: EventTarget | null, pathPrefix?: string): boolean;
22
+ /** Reload at most once per `windowMs` to recover from a chunk skew.
23
+ * `lastReloadAt` is the epoch-ms of the last recovery reload (null when
24
+ * there has been none); true means a fresh reload is safe. */
25
+ export declare function shouldReloadForChunk(now: number, lastReloadAt: number | null, windowMs?: number): boolean;
26
+ //# sourceMappingURL=chunkGuard.logic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunkGuard.logic.d.ts","sourceRoot":"","sources":["../../src/product/chunkGuard.logic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;sEACsE;AACtE,eAAO,MAAM,mBAAmB,qBAAqB,CAAA;AAErD;qEACqE;AACrE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAcpD;AAED;6EAC6E;AAC7E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,UAAU,SAAmB,GAAG,OAAO,CAKpG;AAED;;+DAE+D;AAC/D,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,SAAS,GAAG,OAAO,CAGzG"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Pure decisions for `ChunkGuard`, kept apart from the window listeners so
3
+ * they are unit-tested without a browser.
4
+ *
5
+ * On a rolling deploy, an open tab (or a fresh deep-link landing on a new
6
+ * replica) can request a hashed chunk that no longer exists. The 404 falls
7
+ * through to the app-shell HTML, so the browser throws `ChunkLoadError` /
8
+ * "Unexpected token '<'" trying to parse HTML as JS — a blank,
9
+ * unrecoverable screen. In a PRODUCTION build, user code never throws
10
+ * "Unexpected token '<'" at runtime (that is a build-time syntax error), so
11
+ * at runtime it is a chunk skew — recover, don't crash.
12
+ */
13
+ /** The sessionStorage key a recovery reload is bounded by, so a skew that
14
+ * trips the guard more than once in a burst reloads at most once. */
15
+ export const CHUNK_RELOAD_AT_KEY = 'hz.chunkReloadAt';
16
+ /** True for a webpack/Next dynamic chunk (JS or CSS) load failure, including
17
+ * the stale-deploy case where a 404'd chunk URL is parsed as JS. */
18
+ export function isChunkLoadError(e) {
19
+ if (!e)
20
+ return false;
21
+ const name = typeof e === 'object' && e !== null && 'name' in e ? String(e.name) : '';
22
+ const msg = e instanceof Error ? e.message : String(e);
23
+ return (name === 'ChunkLoadError' ||
24
+ /ChunkLoadError/i.test(msg) ||
25
+ /Loading (?:CSS )?chunk [\w./-]+ failed/i.test(msg) ||
26
+ /(?:Failed to fetch|error loading|Importing a module script failed).*dynamically imported module/i.test(msg) ||
27
+ /Failed to fetch dynamically imported module/i.test(msg) ||
28
+ /Importing a module script failed/i.test(msg) ||
29
+ // Stale chunk URL served the HTML shell → parsed as JS.
30
+ /Unexpected token '<'|expected expression, got '<'|Unexpected token <|<!DOCTYPE/i.test(msg));
31
+ }
32
+ /** True for a failed resource load whose element targets a build asset
33
+ * (a script or stylesheet under `pathPrefix`, default `/_next/static/`). */
34
+ export function isBuildAssetError(target, pathPrefix = '/_next/static/') {
35
+ if (!target || typeof target !== 'object')
36
+ return false;
37
+ const el = target;
38
+ const url = el.src || el.href;
39
+ return typeof url === 'string' && url.includes(pathPrefix);
40
+ }
41
+ /** Reload at most once per `windowMs` to recover from a chunk skew.
42
+ * `lastReloadAt` is the epoch-ms of the last recovery reload (null when
43
+ * there has been none); true means a fresh reload is safe. */
44
+ export function shouldReloadForChunk(now, lastReloadAt, windowMs = 15_000) {
45
+ if (lastReloadAt == null || !Number.isFinite(lastReloadAt))
46
+ return true;
47
+ return now - lastReloadAt >= windowMs;
48
+ }
49
+ //# sourceMappingURL=chunkGuard.logic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunkGuard.logic.js","sourceRoot":"","sources":["../../src/product/chunkGuard.logic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;sEACsE;AACtE,MAAM,CAAC,MAAM,mBAAmB,GAAG,kBAAkB,CAAA;AAErD;qEACqE;AACrE,MAAM,UAAU,gBAAgB,CAAC,CAAU;IACzC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IACpB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAE,CAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC7G,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACtD,OAAO,CACL,IAAI,KAAK,gBAAgB;QACzB,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC;QAC3B,yCAAyC,CAAC,IAAI,CAAC,GAAG,CAAC;QACnD,kGAAkG,CAAC,IAAI,CAAC,GAAG,CAAC;QAC5G,8CAA8C,CAAC,IAAI,CAAC,GAAG,CAAC;QACxD,mCAAmC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC7C,wDAAwD;QACxD,iFAAiF,CAAC,IAAI,CAAC,GAAG,CAAC,CAC5F,CAAA;AACH,CAAC;AAED;6EAC6E;AAC7E,MAAM,UAAU,iBAAiB,CAAC,MAA0B,EAAE,UAAU,GAAG,gBAAgB;IACzF,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACvD,MAAM,EAAE,GAAG,MAAsD,CAAA;IACjE,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,CAAA;IAC7B,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;AAC5D,CAAC;AAED;;+DAE+D;AAC/D,MAAM,UAAU,oBAAoB,CAAC,GAAW,EAAE,YAA2B,EAAE,QAAQ,GAAG,MAAM;IAC9F,IAAI,YAAY,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAA;IACvE,OAAO,GAAG,GAAG,YAAY,IAAI,QAAQ,CAAA;AACvC,CAAC"}
@@ -113,6 +113,9 @@ __exportStar(require("./Workbench.cjs"), exports);
113
113
  __exportStar(require("./EmptyState.cjs"), exports);
114
114
  __exportStar(require("./FadeIn.cjs"), exports);
115
115
  __exportStar(require("./Field.cjs"), exports);
116
+ // `Fact` is `Field`'s read-only counterpart: a settings form is a stack of
117
+ // `Field`s, a detail pane is a stack of these.
118
+ __exportStar(require("./Fact.cjs"), exports);
116
119
  __exportStar(require("./HanzoMark.cjs"), exports);
117
120
  __exportStar(require("./PageHeader.cjs"), exports);
118
121
  // Palette — the ONE ⌘K bar, plus its opener. The list it renders is not written
@@ -129,6 +132,9 @@ __exportStar(require("./Reorder.cjs"), exports);
129
132
  __exportStar(require("./SelectMenu.cjs"), exports);
130
133
  __exportStar(require("./Skeleton.cjs"), exports);
131
134
  __exportStar(require("./SlideOver.cjs"), exports);
135
+ // `DetailPane` is the one mount point over `SlideOver` for a descriptor-driven
136
+ // item view: a caller writes `{ title, content, footer? }`, never a drawer.
137
+ __exportStar(require("./DetailPane.cjs"), exports);
132
138
  __exportStar(require("./StatusTag.cjs"), exports);
133
139
  __exportStar(require("./Split.cjs"), exports);
134
140
  __exportStar(require("./tone.cjs"), exports);
@@ -140,6 +146,10 @@ __exportStar(require("./ThemeToggle.cjs"), exports);
140
146
  // those shapes; reaching for them is the signal you have left the common case.
141
147
  __exportStar(require("./DialogTemplate.cjs"), exports);
142
148
  __exportStar(require("./TooltipAnchor.cjs"), exports);
149
+ // `ChunkGuard` — the window-level net for a stale-deploy chunk 404 (see
150
+ // `chunkGuard.logic.ts` for the pure decisions). Mount it once near the shell
151
+ // root; it renders nothing.
152
+ __exportStar(require("./ChunkGuard.cjs"), exports);
143
153
  // `ThemeToggleNext` is NOT re-exported here, and that is the whole reason this
144
154
  // comment exists. It is the @hanzogui/next-theme binding, and next-theme's
145
155
  // provider imports `next/script` — so a static edge from this barrel put Next in
@@ -33,6 +33,7 @@ export * from './Workbench.js';
33
33
  export * from './EmptyState.js';
34
34
  export * from './FadeIn.js';
35
35
  export * from './Field.js';
36
+ export * from './Fact.js';
36
37
  export * from './HanzoMark.js';
37
38
  export * from './PageHeader.js';
38
39
  export * from './Palette.js';
@@ -45,12 +46,14 @@ export * from './Reorder.js';
45
46
  export * from './SelectMenu.js';
46
47
  export * from './Skeleton.js';
47
48
  export * from './SlideOver.js';
49
+ export * from './DetailPane.js';
48
50
  export * from './StatusTag.js';
49
51
  export * from './Split.js';
50
52
  export * from './tone.js';
51
53
  export * from './ThemeToggle.js';
52
54
  export * from './DialogTemplate.js';
53
55
  export * from './TooltipAnchor.js';
56
+ export * from './ChunkGuard.js';
54
57
  export * from './Toast.js';
55
58
  export * from './accent.js';
56
59
  export * from './color.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/product/index.ts"],"names":[],"mappings":"AAaA,cAAc,UAAU,CAAA;AAKxB,OAAO,EACL,MAAM,EACN,aAAa,EACb,SAAS,EACT,SAAS,IAAI,eAAe,EAC5B,QAAQ,EACR,OAAO,EACP,SAAS,EACT,UAAU,EACV,UAAU,EACV,KAAK,GACN,MAAM,UAAU,CAAA;AAGjB,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAA;AAK/D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,cAAc,mBAAmB,CAAA;AASjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AAKvB,cAAc,QAAQ,CAAA;AAKtB,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAK5B,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,WAAW,CAAA;AAOzB,cAAc,cAAc,CAAA;AAK5B,cAAc,YAAY,CAAA;AAO1B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAI7B,cAAc,cAAc,CAAA;AAG5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAM5B,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;AAM7B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAc/B,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AASvB,cAAc,UAAU,CAAA;AAKxB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/product/index.ts"],"names":[],"mappings":"AAaA,cAAc,UAAU,CAAA;AAKxB,OAAO,EACL,MAAM,EACN,aAAa,EACb,SAAS,EACT,SAAS,IAAI,eAAe,EAC5B,QAAQ,EACR,OAAO,EACP,SAAS,EACT,UAAU,EACV,UAAU,EACV,KAAK,GACN,MAAM,UAAU,CAAA;AAGjB,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAA;AAK/D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,cAAc,mBAAmB,CAAA;AASjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AAKvB,cAAc,QAAQ,CAAA;AAKtB,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAK5B,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,WAAW,CAAA;AAOzB,cAAc,cAAc,CAAA;AAK5B,cAAc,YAAY,CAAA;AAO1B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAI7B,cAAc,cAAc,CAAA;AAG5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AAGvB,cAAc,QAAQ,CAAA;AACtB,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAM5B,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAG3B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;AAM7B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAK/B,cAAc,cAAc,CAAA;AAc5B,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AASvB,cAAc,UAAU,CAAA;AAKxB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAA"}
@@ -84,6 +84,9 @@ export * from './Workbench.js';
84
84
  export * from './EmptyState.js';
85
85
  export * from './FadeIn.js';
86
86
  export * from './Field.js';
87
+ // `Fact` is `Field`'s read-only counterpart: a settings form is a stack of
88
+ // `Field`s, a detail pane is a stack of these.
89
+ export * from './Fact.js';
87
90
  export * from './HanzoMark.js';
88
91
  export * from './PageHeader.js';
89
92
  // Palette — the ONE ⌘K bar, plus its opener. The list it renders is not written
@@ -100,6 +103,9 @@ export * from './Reorder.js';
100
103
  export * from './SelectMenu.js';
101
104
  export * from './Skeleton.js';
102
105
  export * from './SlideOver.js';
106
+ // `DetailPane` is the one mount point over `SlideOver` for a descriptor-driven
107
+ // item view: a caller writes `{ title, content, footer? }`, never a drawer.
108
+ export * from './DetailPane.js';
103
109
  export * from './StatusTag.js';
104
110
  export * from './Split.js';
105
111
  export * from './tone.js';
@@ -111,6 +117,10 @@ export * from './ThemeToggle.js';
111
117
  // those shapes; reaching for them is the signal you have left the common case.
112
118
  export * from './DialogTemplate.js';
113
119
  export * from './TooltipAnchor.js';
120
+ // `ChunkGuard` — the window-level net for a stale-deploy chunk 404 (see
121
+ // `chunkGuard.logic.ts` for the pure decisions). Mount it once near the shell
122
+ // root; it renders nothing.
123
+ export * from './ChunkGuard.js';
114
124
  // `ThemeToggleNext` is NOT re-exported here, and that is the whole reason this
115
125
  // comment exists. It is the @hanzogui/next-theme binding, and next-theme's
116
126
  // provider imports `next/script` — so a static edge from this barrel put Next in
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/product/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,EAAE;AACF,2EAA2E;AAC3E,gFAAgF;AAChF,iFAAiF;AACjF,gFAAgF;AAChF,wEAAwE;AACxE,EAAE;AACF,kFAAkF;AAClF,6EAA6E;AAE7E,kFAAkF;AAClF,gEAAgE;AAChE,cAAc,UAAU,CAAA;AAExB,2EAA2E;AAC3E,+EAA+E;AAC/E,4CAA4C;AAC5C,OAAO,EACL,MAAM,EACN,aAAa,EACb,SAAS,EACT,SAAS,IAAI,eAAe,EAC5B,QAAQ,EACR,OAAO,EACP,SAAS,EACT,UAAU,EACV,UAAU,EACV,KAAK,GACN,MAAM,UAAU,CAAA;AAEjB,6EAA6E;AAC7E,OAAO,EAAE,KAAK,IAAI,SAAS,EAAqB,MAAM,SAAS,CAAA;AAE/D,+EAA+E;AAC/E,8EAA8E;AAC9E,qCAAqC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,cAAc,mBAAmB,CAAA;AAEjC,gFAAgF;AAChF,6EAA6E;AAC7E,mFAAmF;AACnF,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,8DAA8D;AAC9D,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AAEvB,mFAAmF;AACnF,qFAAqF;AACrF,qFAAqF;AACrF,cAAc,QAAQ,CAAA;AAEtB,iFAAiF;AACjF,2EAA2E;AAC3E,8EAA8E;AAC9E,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAE5B,6EAA6E;AAC7E,yEAAyE;AACzE,qFAAqF;AACrF,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,WAAW,CAAA;AAEzB,8EAA8E;AAC9E,8EAA8E;AAC9E,+EAA+E;AAC/E,6EAA6E;AAC7E,mDAAmD;AACnD,cAAc,cAAc,CAAA;AAE5B,gFAAgF;AAChF,iFAAiF;AACjF,2EAA2E;AAC3E,cAAc,YAAY,CAAA;AAE1B,kFAAkF;AAClF,mFAAmF;AACnF,gFAAgF;AAChF,kFAAkF;AAClF,oBAAoB;AACpB,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAE7B,8EAA8E;AAC9E,sBAAsB;AACtB,cAAc,cAAc,CAAA;AAE5B,mEAAmE;AACnE,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAE5B,gFAAgF;AAChF,iFAAiF;AACjF,6EAA6E;AAC7E,8EAA8E;AAC9E,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;AAC7B,8EAA8E;AAC9E,yEAAyE;AACzE,yEAAyE;AACzE,6EAA6E;AAC7E,+EAA+E;AAC/E,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAE/B,+EAA+E;AAC/E,2EAA2E;AAC3E,iFAAiF;AACjF,0EAA0E;AAC1E,8EAA8E;AAC9E,iFAAiF;AACjF,0BAA0B;AAC1B,EAAE;AACF,0EAA0E;AAC1E,EAAE;AACF,+EAA+E;AAC/E,kEAAkE;AAClE,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AAEvB,mFAAmF;AACnF,qFAAqF;AACrF,uEAAuE;AAEvE,iFAAiF;AACjF,kFAAkF;AAClF,kEAAkE;AAClE,cAAc,UAAU,CAAA;AAExB,sEAAsE;AACtE,+EAA+E;AAC/E,8EAA8E;AAC9E,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAgB,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/product/index.ts"],"names":[],"mappings":"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"}