@mieweb/ui 0.10.0-dev.23 → 0.10.0-dev.25

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 (147) hide show
  1. package/dist/brands/bluehive.cjs +3 -3
  2. package/dist/brands/bluehive.css +3 -0
  3. package/dist/brands/bluehive.js +1 -1
  4. package/dist/brands/index.cjs +9 -9
  5. package/dist/brands/index.js +3 -3
  6. package/dist/{chunk-YQDA366U.js → chunk-33DEVA3P.js} +2 -2
  7. package/dist/{chunk-YQDA366U.js.map → chunk-33DEVA3P.js.map} +1 -1
  8. package/dist/{chunk-WNJRS7Y7.cjs → chunk-3ZWCIPFT.cjs} +4 -2
  9. package/dist/chunk-3ZWCIPFT.cjs.map +1 -0
  10. package/dist/{chunk-J5CSLNCN.cjs → chunk-6VFDHJSO.cjs} +2 -2
  11. package/dist/{chunk-J5CSLNCN.cjs.map → chunk-6VFDHJSO.cjs.map} +1 -1
  12. package/dist/{chunk-ZTW4KODY.js → chunk-6ZPTZTKN.js} +3 -3
  13. package/dist/{chunk-ZTW4KODY.js.map → chunk-6ZPTZTKN.js.map} +1 -1
  14. package/dist/{chunk-SQ2D7AON.cjs → chunk-AAYXCZMV.cjs} +6 -6
  15. package/dist/{chunk-SQ2D7AON.cjs.map → chunk-AAYXCZMV.cjs.map} +1 -1
  16. package/dist/{chunk-WCDJFMZO.cjs → chunk-ADW7ZYCY.cjs} +1235 -495
  17. package/dist/chunk-ADW7ZYCY.cjs.map +1 -0
  18. package/dist/{chunk-2G75X6TS.cjs → chunk-AHHFFXJR.cjs} +3 -3
  19. package/dist/{chunk-2G75X6TS.cjs.map → chunk-AHHFFXJR.cjs.map} +1 -1
  20. package/dist/{chunk-HQ4CGVWX.cjs → chunk-B2X732V3.cjs} +7 -7
  21. package/dist/{chunk-HQ4CGVWX.cjs.map → chunk-B2X732V3.cjs.map} +1 -1
  22. package/dist/{chunk-UAMXCMST.cjs → chunk-CFI3TQMA.cjs} +3 -3
  23. package/dist/{chunk-UAMXCMST.cjs.map → chunk-CFI3TQMA.cjs.map} +1 -1
  24. package/dist/{chunk-2ABWFQQH.js → chunk-CRS2CQWM.js} +4 -4
  25. package/dist/{chunk-2ABWFQQH.js.map → chunk-CRS2CQWM.js.map} +1 -1
  26. package/dist/{chunk-MZNCLXXU.js → chunk-D22GE27K.js} +3 -3
  27. package/dist/{chunk-MZNCLXXU.js.map → chunk-D22GE27K.js.map} +1 -1
  28. package/dist/{chunk-IH55BEB3.js → chunk-DZFGTWYF.js} +6 -6
  29. package/dist/{chunk-IH55BEB3.js.map → chunk-DZFGTWYF.js.map} +1 -1
  30. package/dist/{chunk-TF7YWJHU.js → chunk-E2PBPQGS.js} +3 -3
  31. package/dist/{chunk-TF7YWJHU.js.map → chunk-E2PBPQGS.js.map} +1 -1
  32. package/dist/chunk-FBCDYTWM.js +385 -0
  33. package/dist/chunk-FBCDYTWM.js.map +1 -0
  34. package/dist/{chunk-R2O72G6Z.cjs → chunk-HC3NAN55.cjs} +7 -7
  35. package/dist/{chunk-R2O72G6Z.cjs.map → chunk-HC3NAN55.cjs.map} +1 -1
  36. package/dist/{chunk-DSB4DKWG.js → chunk-K34DXMLZ.js} +2 -2
  37. package/dist/{chunk-DSB4DKWG.js.map → chunk-K34DXMLZ.js.map} +1 -1
  38. package/dist/{chunk-Z5V7SAZ4.js → chunk-KFEN2SRZ.js} +3 -3
  39. package/dist/{chunk-Z5V7SAZ4.js.map → chunk-KFEN2SRZ.js.map} +1 -1
  40. package/dist/{chunk-MQPG3KVK.cjs → chunk-KGKBZN3T.cjs} +2 -2
  41. package/dist/{chunk-MQPG3KVK.cjs.map → chunk-KGKBZN3T.cjs.map} +1 -1
  42. package/dist/{chunk-G45FBKKV.js → chunk-P4VGVJVI.js} +4 -4
  43. package/dist/{chunk-G45FBKKV.js.map → chunk-P4VGVJVI.js.map} +1 -1
  44. package/dist/{chunk-3T7QGLNB.js → chunk-PJEL5ZZV.js} +4 -2
  45. package/dist/chunk-PJEL5ZZV.js.map +1 -0
  46. package/dist/{chunk-LJZKEMAH.cjs → chunk-R5Z7AOVU.cjs} +10 -10
  47. package/dist/{chunk-LJZKEMAH.cjs.map → chunk-R5Z7AOVU.cjs.map} +1 -1
  48. package/dist/{chunk-RJ6NTJHC.js → chunk-SRMTRD7F.js} +3 -3
  49. package/dist/{chunk-RJ6NTJHC.js.map → chunk-SRMTRD7F.js.map} +1 -1
  50. package/dist/{chunk-KHSFJTEX.js → chunk-T4JYUICS.js} +1177 -444
  51. package/dist/chunk-T4JYUICS.js.map +1 -0
  52. package/dist/{chunk-NJ6MY6V5.js → chunk-T5BBZQ66.js} +3 -3
  53. package/dist/{chunk-NJ6MY6V5.js.map → chunk-T5BBZQ66.js.map} +1 -1
  54. package/dist/{chunk-VYPPQPSZ.cjs → chunk-TJCX4OML.cjs} +3 -3
  55. package/dist/{chunk-VYPPQPSZ.cjs.map → chunk-TJCX4OML.cjs.map} +1 -1
  56. package/dist/{chunk-TAXD5ADA.cjs → chunk-UEDTZYGI.cjs} +3 -3
  57. package/dist/{chunk-TAXD5ADA.cjs.map → chunk-UEDTZYGI.cjs.map} +1 -1
  58. package/dist/{chunk-UQ3VVR6A.cjs → chunk-UPWIJC6I.cjs} +3 -3
  59. package/dist/{chunk-UQ3VVR6A.cjs.map → chunk-UPWIJC6I.cjs.map} +1 -1
  60. package/dist/{chunk-QNDP6PE5.cjs → chunk-VCCGR4J3.cjs} +92 -3
  61. package/dist/chunk-VCCGR4J3.cjs.map +1 -0
  62. package/dist/{chunk-S7WCHDBO.js → chunk-VCI2Y7ST.js} +3 -3
  63. package/dist/{chunk-S7WCHDBO.js.map → chunk-VCI2Y7ST.js.map} +1 -1
  64. package/dist/{chunk-Z4JR23IB.cjs → chunk-VOQJHSXN.cjs} +9 -9
  65. package/dist/{chunk-Z4JR23IB.cjs.map → chunk-VOQJHSXN.cjs.map} +1 -1
  66. package/dist/{chunk-EK3BCET6.js → chunk-WFVE36PO.js} +92 -3
  67. package/dist/chunk-WFVE36PO.js.map +1 -0
  68. package/dist/chunk-XI74P5F2.cjs +424 -0
  69. package/dist/chunk-XI74P5F2.cjs.map +1 -0
  70. package/dist/components/BoardView/index.d.cts +2 -90
  71. package/dist/components/BoardView/index.d.ts +2 -90
  72. package/dist/components/CalendarView/index.d.cts +1 -1
  73. package/dist/components/CalendarView/index.d.ts +1 -1
  74. package/dist/components/CountryCodeDropdown/index.cjs +5 -5
  75. package/dist/components/CountryCodeDropdown/index.js +2 -2
  76. package/dist/components/Dropdown/index.cjs +9 -9
  77. package/dist/components/Dropdown/index.js +2 -2
  78. package/dist/components/GanttView/index.d.cts +1 -1
  79. package/dist/components/GanttView/index.d.ts +1 -1
  80. package/dist/components/GlossaryTooltip/index.cjs +3 -3
  81. package/dist/components/GlossaryTooltip/index.js +2 -2
  82. package/dist/components/Markdown/index.cjs +15 -15
  83. package/dist/components/Markdown/index.js +3 -3
  84. package/dist/components/MediaEditor/index.cjs +10 -10
  85. package/dist/components/MediaEditor/index.js +5 -5
  86. package/dist/components/RadialExplorer/index.cjs +1 -1
  87. package/dist/components/RadialExplorer/index.js +1 -1
  88. package/dist/components/RichTextEditor/index.cjs +6 -6
  89. package/dist/components/RichTextEditor/index.js +3 -3
  90. package/dist/components/Select/index.cjs +4 -4
  91. package/dist/components/Select/index.js +2 -2
  92. package/dist/components/SourceTip/index.cjs +3 -3
  93. package/dist/components/SourceTip/index.js +2 -2
  94. package/dist/components/SuperChat/index.cjs +11 -11
  95. package/dist/components/SuperChat/index.js +4 -4
  96. package/dist/components/SuperChat/plugins/index.cjs +5 -5
  97. package/dist/components/SuperChat/plugins/index.js +4 -4
  98. package/dist/components/ViewSet/index.d.cts +1 -101
  99. package/dist/components/ViewSet/index.d.ts +1 -101
  100. package/dist/components/ViewSwitcher/index.d.cts +4 -57
  101. package/dist/components/ViewSwitcher/index.d.ts +4 -57
  102. package/dist/datavis.cjs +1 -1
  103. package/dist/datavis.js +1 -1
  104. package/dist/deck.cjs +3360 -0
  105. package/dist/deck.cjs.map +1 -0
  106. package/dist/deck.d.cts +712 -0
  107. package/dist/deck.d.ts +712 -0
  108. package/dist/deck.js +3316 -0
  109. package/dist/deck.js.map +1 -0
  110. package/dist/esheet.cjs +10 -10
  111. package/dist/esheet.js +7 -7
  112. package/dist/hooks/index.cjs +15 -15
  113. package/dist/hooks/index.js +3 -3
  114. package/dist/icons-wBacj6BW.d.cts +142 -0
  115. package/dist/icons-wBacj6BW.d.ts +142 -0
  116. package/dist/index-DoYYWsNc.d.cts +127 -0
  117. package/dist/index-DoYYWsNc.d.ts +127 -0
  118. package/dist/index.cjs +604 -551
  119. package/dist/index.cjs.map +1 -1
  120. package/dist/index.d.cts +313 -4
  121. package/dist/index.d.ts +313 -4
  122. package/dist/index.js +60 -59
  123. package/dist/index.js.map +1 -1
  124. package/dist/maps.cjs +160 -0
  125. package/dist/maps.cjs.map +1 -0
  126. package/dist/maps.d.cts +42 -0
  127. package/dist/maps.d.ts +42 -0
  128. package/dist/maps.js +138 -0
  129. package/dist/maps.js.map +1 -0
  130. package/dist/styles/effects.css +100 -0
  131. package/dist/styles/init.css +3 -0
  132. package/dist/styles.css +1 -1
  133. package/dist/tailwind-preset.cjs +4 -4
  134. package/dist/tailwind-preset.js +1 -1
  135. package/dist/templates.cjs +82 -29
  136. package/dist/templates.d.cts +316 -142
  137. package/dist/templates.d.ts +316 -142
  138. package/dist/templates.js +2 -1
  139. package/dist/{types-C3HQe74F.d.cts → types-DsdZvEI1.d.cts} +7 -1
  140. package/dist/{types-C3HQe74F.d.ts → types-DsdZvEI1.d.ts} +7 -1
  141. package/package.json +27 -1
  142. package/dist/chunk-3T7QGLNB.js.map +0 -1
  143. package/dist/chunk-EK3BCET6.js.map +0 -1
  144. package/dist/chunk-KHSFJTEX.js.map +0 -1
  145. package/dist/chunk-QNDP6PE5.cjs.map +0 -1
  146. package/dist/chunk-WCDJFMZO.cjs.map +0 -1
  147. package/dist/chunk-WNJRS7Y7.cjs.map +0 -1
package/dist/deck.cjs ADDED
@@ -0,0 +1,3360 @@
1
+ 'use strict';
2
+
3
+ var chunkXI74P5F2_cjs = require('./chunk-XI74P5F2.cjs');
4
+ require('./chunk-DXEPYK3I.cjs');
5
+ var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
6
+ require('./chunk-EUAMEVVI.cjs');
7
+ var React9 = require('react');
8
+ var reactDom = require('react-dom');
9
+ var lucideReact = require('lucide-react');
10
+ var jsxRuntime = require('react/jsx-runtime');
11
+
12
+ function _interopNamespace(e) {
13
+ if (e && e.__esModule) return e;
14
+ var n = Object.create(null);
15
+ if (e) {
16
+ Object.keys(e).forEach(function (k) {
17
+ if (k !== 'default') {
18
+ var d = Object.getOwnPropertyDescriptor(e, k);
19
+ Object.defineProperty(n, k, d.get ? d : {
20
+ enumerable: true,
21
+ get: function () { return e[k]; }
22
+ });
23
+ }
24
+ });
25
+ }
26
+ n.default = e;
27
+ return Object.freeze(n);
28
+ }
29
+
30
+ var React9__namespace = /*#__PURE__*/_interopNamespace(React9);
31
+
32
+ var chrome = "mie-deck-chrome print:hidden";
33
+ var iconButton = "flex size-9 items-center justify-center rounded-lg border border-white/10 bg-white/5 text-white/70 backdrop-blur transition-colors hover:bg-white/10 hover:text-white focus-visible:ring-2 focus-visible:ring-accent focus-visible:outline-none";
34
+ var slideLabel = (s) => s.navLabel ?? ("title" in s ? s.title : void 0) ?? "";
35
+ function ProgressBar({ progress }) {
36
+ return /* @__PURE__ */ jsxRuntime.jsx(
37
+ "div",
38
+ {
39
+ className: chunkS5RVSXDV_cjs.cn(
40
+ chrome,
41
+ "pointer-events-none absolute inset-x-0 top-0 z-40 h-[3px] bg-white/5"
42
+ ),
43
+ children: /* @__PURE__ */ jsxRuntime.jsx(
44
+ "div",
45
+ {
46
+ className: "bg-accent h-full transition-[width] duration-500 ease-out",
47
+ style: { width: `${progress}%` }
48
+ }
49
+ )
50
+ }
51
+ );
52
+ }
53
+ function SlideCounter({
54
+ active,
55
+ total,
56
+ section
57
+ }) {
58
+ return /* @__PURE__ */ jsxRuntime.jsxs(
59
+ "div",
60
+ {
61
+ className: chunkS5RVSXDV_cjs.cn(
62
+ chrome,
63
+ "pointer-events-none absolute start-5 bottom-5 z-40 hidden select-none md:block"
64
+ ),
65
+ children: [
66
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-sm font-semibold text-white/80 tabular-nums", children: [
67
+ String(active + 1).padStart(2, "0"),
68
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-white/70", children: [
69
+ " ",
70
+ "/ ",
71
+ String(total).padStart(2, "0")
72
+ ] })
73
+ ] }),
74
+ section && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-accent mt-0.5 text-[0.7rem] tracking-[0.18em] uppercase", children: section })
75
+ ]
76
+ }
77
+ );
78
+ }
79
+ function DotNav({
80
+ slides,
81
+ active,
82
+ goTo,
83
+ labels
84
+ }) {
85
+ return /* @__PURE__ */ jsxRuntime.jsx(
86
+ "nav",
87
+ {
88
+ "aria-label": labels.slideNavigation,
89
+ className: chunkS5RVSXDV_cjs.cn(
90
+ chrome,
91
+ "absolute end-3 top-1/2 z-40 hidden -translate-y-1/2 flex-col items-center gap-2 md:flex"
92
+ ),
93
+ children: slides.map((s, i) => /* @__PURE__ */ jsxRuntime.jsxs(
94
+ "button",
95
+ {
96
+ type: "button",
97
+ onClick: () => goTo(i),
98
+ "aria-label": labels.goToSlide(i + 1, slideLabel(s)),
99
+ "aria-current": i === active ? "true" : void 0,
100
+ className: "group relative flex size-4 items-center justify-center",
101
+ children: [
102
+ /* @__PURE__ */ jsxRuntime.jsx(
103
+ "span",
104
+ {
105
+ className: chunkS5RVSXDV_cjs.cn(
106
+ "block rounded-full transition-all duration-300",
107
+ i === active ? "bg-accent size-2.5" : "size-1.5 bg-white/30 group-hover:bg-white/60"
108
+ )
109
+ }
110
+ ),
111
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "pointer-events-none absolute end-6 rounded-md border border-white/10 bg-neutral-900/95 px-2 py-1 text-xs whitespace-nowrap text-white opacity-0 shadow-lg transition-opacity group-hover:opacity-100 group-focus-visible:opacity-100", children: slideLabel(s) })
112
+ ]
113
+ },
114
+ i
115
+ ))
116
+ }
117
+ );
118
+ }
119
+ function Controls({
120
+ isFullscreen,
121
+ onToggleFullscreen,
122
+ onOpenOutline,
123
+ labels
124
+ }) {
125
+ return /* @__PURE__ */ jsxRuntime.jsxs(
126
+ "div",
127
+ {
128
+ className: chunkS5RVSXDV_cjs.cn(
129
+ chrome,
130
+ "absolute end-5 bottom-5 z-40 hidden items-center gap-2 md:flex"
131
+ ),
132
+ children: [
133
+ /* @__PURE__ */ jsxRuntime.jsx(
134
+ "button",
135
+ {
136
+ type: "button",
137
+ className: iconButton,
138
+ onClick: onOpenOutline,
139
+ "aria-label": labels.openOutline,
140
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.List, { "aria-hidden": "true", className: "size-4" })
141
+ }
142
+ ),
143
+ /* @__PURE__ */ jsxRuntime.jsx(
144
+ "button",
145
+ {
146
+ type: "button",
147
+ className: iconButton,
148
+ onClick: () => window.print(),
149
+ "aria-label": labels.print,
150
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Printer, { "aria-hidden": "true", className: "size-4" })
151
+ }
152
+ ),
153
+ /* @__PURE__ */ jsxRuntime.jsx(
154
+ "button",
155
+ {
156
+ type: "button",
157
+ className: iconButton,
158
+ onClick: onToggleFullscreen,
159
+ "aria-label": isFullscreen ? labels.exitFullscreen : labels.enterFullscreen,
160
+ children: isFullscreen ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Minimize2, { "aria-hidden": "true", className: "size-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Maximize2, { "aria-hidden": "true", className: "size-4" })
161
+ }
162
+ )
163
+ ]
164
+ }
165
+ );
166
+ }
167
+ function Kbd({ children }) {
168
+ return /* @__PURE__ */ jsxRuntime.jsx("kbd", { className: "inline-flex min-w-5 items-center justify-center rounded border border-white/15 bg-white/5 px-1 py-0.5 text-[0.65rem] text-white/80", children });
169
+ }
170
+ function KeyboardHints({
171
+ pulse,
172
+ labels
173
+ }) {
174
+ const [visible, setVisible] = React9__namespace.useState(true);
175
+ React9__namespace.useEffect(() => {
176
+ setVisible(true);
177
+ const t = setTimeout(() => setVisible(false), 5e3);
178
+ return () => clearTimeout(t);
179
+ }, [pulse]);
180
+ return /* @__PURE__ */ jsxRuntime.jsxs(
181
+ "div",
182
+ {
183
+ "aria-hidden": "true",
184
+ className: chunkS5RVSXDV_cjs.cn(
185
+ chrome,
186
+ "pointer-events-none absolute bottom-5 left-1/2 z-40 hidden -translate-x-1/2 items-center gap-3 rounded-full border border-white/10 bg-neutral-900/80 px-4 py-1.5 text-xs text-white/70 backdrop-blur transition-opacity duration-500 select-none md:flex",
187
+ visible ? "opacity-100" : "opacity-0"
188
+ ),
189
+ children: [
190
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1", children: [
191
+ /* @__PURE__ */ jsxRuntime.jsx(Kbd, { children: "\u2191" }),
192
+ /* @__PURE__ */ jsxRuntime.jsx(Kbd, { children: "\u2193" }),
193
+ " ",
194
+ labels.navigateHint
195
+ ] }),
196
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-white/20", children: "\xB7" }),
197
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
198
+ /* @__PURE__ */ jsxRuntime.jsx(Kbd, { children: "F" }),
199
+ " ",
200
+ labels.fullscreenHint
201
+ ] }),
202
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-white/20", children: "\xB7" }),
203
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
204
+ /* @__PURE__ */ jsxRuntime.jsx(Kbd, { children: "?" }),
205
+ " ",
206
+ labels.helpHint
207
+ ] })
208
+ ]
209
+ }
210
+ );
211
+ }
212
+ function MobileNav({
213
+ active,
214
+ total,
215
+ onPrev,
216
+ onNext,
217
+ onOpenOutline,
218
+ labels
219
+ }) {
220
+ const btn = "flex size-10 items-center justify-center rounded-full text-white/80 transition-colors hover:bg-white/10 disabled:opacity-30";
221
+ return /* @__PURE__ */ jsxRuntime.jsxs(
222
+ "div",
223
+ {
224
+ className: chunkS5RVSXDV_cjs.cn(
225
+ chrome,
226
+ "absolute inset-x-0 bottom-0 z-40 flex items-center justify-between border-t border-white/10 bg-neutral-950/90 px-3 py-2 pb-[max(0.5rem,env(safe-area-inset-bottom))] backdrop-blur md:hidden"
227
+ ),
228
+ children: [
229
+ /* @__PURE__ */ jsxRuntime.jsx(
230
+ "button",
231
+ {
232
+ type: "button",
233
+ className: btn,
234
+ onClick: onPrev,
235
+ disabled: active === 0,
236
+ "aria-label": labels.previous,
237
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUp, { "aria-hidden": "true", className: "size-5" })
238
+ }
239
+ ),
240
+ /* @__PURE__ */ jsxRuntime.jsxs(
241
+ "button",
242
+ {
243
+ type: "button",
244
+ onClick: onOpenOutline,
245
+ className: "flex items-center gap-2 rounded-full px-4 py-1.5 text-sm font-semibold text-white/80 tabular-nums",
246
+ "aria-label": labels.openOutline,
247
+ children: [
248
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.List, { "aria-hidden": "true", className: "text-accent size-4" }),
249
+ active + 1,
250
+ " / ",
251
+ total
252
+ ]
253
+ }
254
+ ),
255
+ /* @__PURE__ */ jsxRuntime.jsx(
256
+ "button",
257
+ {
258
+ type: "button",
259
+ className: btn,
260
+ onClick: onNext,
261
+ disabled: active === total - 1,
262
+ "aria-label": labels.next,
263
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { "aria-hidden": "true", className: "size-5" })
264
+ }
265
+ )
266
+ ]
267
+ }
268
+ );
269
+ }
270
+ function OutlineDialog({
271
+ open,
272
+ onClose,
273
+ slides,
274
+ active,
275
+ goTo,
276
+ labels
277
+ }) {
278
+ const panelRef = React9__namespace.useRef(null);
279
+ const titleId = React9__namespace.useId();
280
+ React9__namespace.useEffect(() => {
281
+ if (!open) return;
282
+ const previous = document.activeElement;
283
+ const panel = panelRef.current;
284
+ const focusables = () => Array.from(
285
+ panel?.querySelectorAll("button:not([disabled])") ?? []
286
+ );
287
+ (focusables()[1] ?? focusables()[0])?.focus();
288
+ const onKey = (e) => {
289
+ if (e.key === "Escape") {
290
+ e.preventDefault();
291
+ onClose();
292
+ return;
293
+ }
294
+ if (e.key !== "Tab") return;
295
+ const items = focusables();
296
+ const first = items[0];
297
+ const last = items[items.length - 1];
298
+ if (e.shiftKey && document.activeElement === first) {
299
+ e.preventDefault();
300
+ last?.focus();
301
+ } else if (!e.shiftKey && document.activeElement === last) {
302
+ e.preventDefault();
303
+ first?.focus();
304
+ }
305
+ };
306
+ document.addEventListener("keydown", onKey, true);
307
+ return () => {
308
+ document.removeEventListener("keydown", onKey, true);
309
+ previous?.focus?.();
310
+ };
311
+ }, [open, onClose]);
312
+ if (!open || typeof document === "undefined") return null;
313
+ return reactDom.createPortal(
314
+ /* @__PURE__ */ jsxRuntime.jsxs(
315
+ "div",
316
+ {
317
+ ref: panelRef,
318
+ role: "dialog",
319
+ "aria-modal": "true",
320
+ "aria-labelledby": titleId,
321
+ className: "mie-deck-chrome fixed inset-0 z-[80] flex flex-col bg-neutral-950/95 text-white backdrop-blur-md",
322
+ children: [
323
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between border-b border-white/10 px-5 py-4", children: [
324
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { id: titleId, className: "text-lg font-bold text-white", children: labels.outline }),
325
+ /* @__PURE__ */ jsxRuntime.jsx(
326
+ "button",
327
+ {
328
+ type: "button",
329
+ onClick: onClose,
330
+ "aria-label": labels.closeOutline,
331
+ className: iconButton,
332
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { "aria-hidden": "true", className: "size-5" })
333
+ }
334
+ )
335
+ ] }),
336
+ /* @__PURE__ */ jsxRuntime.jsx("ol", { className: "flex-1 overflow-y-auto px-3 py-3", children: slides.map((s, i) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(
337
+ "button",
338
+ {
339
+ type: "button",
340
+ onClick: () => {
341
+ goTo(i);
342
+ onClose();
343
+ },
344
+ "aria-current": i === active ? "true" : void 0,
345
+ className: chunkS5RVSXDV_cjs.cn(
346
+ "flex w-full items-baseline gap-3 rounded-lg px-4 py-3 text-start transition-colors",
347
+ i === active ? "bg-accent/15" : "hover:bg-white/5"
348
+ ),
349
+ children: [
350
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-accent text-sm font-semibold tabular-nums", children: String(i + 1).padStart(2, "0") }),
351
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: i === active ? "text-white" : "text-white/75", children: slideLabel(s) })
352
+ ]
353
+ }
354
+ ) }, i)) })
355
+ ]
356
+ }
357
+ ),
358
+ document.body
359
+ );
360
+ }
361
+
362
+ // src/components/Deck/tones.ts
363
+ var dark = {
364
+ isLight: false,
365
+ text: "text-white",
366
+ muted: "text-white/70",
367
+ hairline: "border-white/10",
368
+ card: "bg-white/5"
369
+ };
370
+ var TONES = {
371
+ brand: {
372
+ ...dark,
373
+ surface: "bg-gradient-to-br from-primary-900 via-primary-950 to-primary-950"
374
+ },
375
+ deep: {
376
+ ...dark,
377
+ surface: "bg-gradient-to-b from-neutral-900 to-neutral-950"
378
+ },
379
+ ink: { ...dark, surface: "bg-neutral-950" },
380
+ glow: {
381
+ ...dark,
382
+ surface: "bg-gradient-to-br from-primary-950 via-primary-800 to-accent/70"
383
+ },
384
+ light: {
385
+ isLight: true,
386
+ surface: "bg-white",
387
+ text: "text-neutral-900",
388
+ muted: "text-neutral-600",
389
+ hairline: "border-neutral-200",
390
+ card: "bg-neutral-50"
391
+ }
392
+ };
393
+ var onDark = {
394
+ primary: {
395
+ text: "text-primary-300",
396
+ soft: "bg-primary-400/15",
397
+ border: "border-primary-400/30",
398
+ fill: "bg-primary-400",
399
+ svgFill: "fill-primary-400",
400
+ svgStroke: "stroke-primary-400"
401
+ },
402
+ secondary: {
403
+ text: "text-secondary-300",
404
+ soft: "bg-secondary-400/15",
405
+ border: "border-secondary-400/30",
406
+ fill: "bg-secondary-400",
407
+ svgFill: "fill-secondary-400",
408
+ svgStroke: "stroke-secondary-400"
409
+ },
410
+ accent: {
411
+ text: "text-accent",
412
+ soft: "bg-accent/15",
413
+ border: "border-accent/30",
414
+ fill: "bg-accent",
415
+ svgFill: "fill-accent",
416
+ svgStroke: "stroke-accent"
417
+ },
418
+ success: {
419
+ text: "text-success",
420
+ soft: "bg-success/15",
421
+ border: "border-success/30",
422
+ fill: "bg-success",
423
+ svgFill: "fill-success",
424
+ svgStroke: "stroke-success"
425
+ },
426
+ warning: {
427
+ text: "text-warning",
428
+ soft: "bg-warning/15",
429
+ border: "border-warning/30",
430
+ fill: "bg-warning",
431
+ svgFill: "fill-warning",
432
+ svgStroke: "stroke-warning"
433
+ },
434
+ danger: {
435
+ text: "text-destructive",
436
+ soft: "bg-destructive/15",
437
+ border: "border-destructive/30",
438
+ fill: "bg-destructive",
439
+ svgFill: "fill-destructive",
440
+ svgStroke: "stroke-destructive"
441
+ }
442
+ };
443
+ var lightText = {
444
+ primary: "text-primary-800",
445
+ secondary: "text-secondary-800",
446
+ accent: "text-neutral-900",
447
+ success: "text-neutral-900",
448
+ warning: "text-neutral-900",
449
+ danger: "text-destructive"
450
+ };
451
+ function accent(name = "accent", isLight = false) {
452
+ const spec = onDark[name];
453
+ return isLight ? { ...spec, text: lightText[name] } : spec;
454
+ }
455
+ var toneOf = (slide, fallback) => TONES[slide.tone ?? fallback];
456
+ var ACCENT_CYCLE = [
457
+ "accent",
458
+ "primary",
459
+ "secondary",
460
+ "success",
461
+ "warning"
462
+ ];
463
+
464
+ // src/components/Deck/DeckContext.tsx
465
+ var DeckContext = React9__namespace.createContext(null);
466
+ var DeckProvider = DeckContext.Provider;
467
+ function useDeck() {
468
+ const ctx = React9__namespace.useContext(DeckContext);
469
+ if (!ctx) throw new Error("Slide renderers must be rendered inside <Deck>.");
470
+ return ctx;
471
+ }
472
+ var ToneContext = React9__namespace.createContext(TONES.brand);
473
+ var useTone = () => React9__namespace.useContext(ToneContext);
474
+
475
+ // src/components/Deck/labels.ts
476
+ var defaultDeckLabels = {
477
+ presentation: "slide presentation",
478
+ slide: "slide",
479
+ slideNavigation: "Slide navigation",
480
+ goToSlide: (n, title) => `Go to slide ${n}${title ? `: ${title}` : ""}`,
481
+ outline: "Slides",
482
+ openOutline: "Open slide outline",
483
+ closeOutline: "Close outline",
484
+ print: "Print or save as PDF",
485
+ enterFullscreen: "Enter fullscreen",
486
+ exitFullscreen: "Exit fullscreen",
487
+ previous: "Previous slide",
488
+ next: "Next slide",
489
+ navigateHint: "Navigate",
490
+ fullscreenHint: "Fullscreen",
491
+ helpHint: "Help",
492
+ copy: "Copy link",
493
+ copied: "Copied",
494
+ statusNow: "Now",
495
+ statusNext: "Next",
496
+ statusLater: "Later",
497
+ watchVideo: "Watch the video",
498
+ lines: "Lines",
499
+ bars: "Bars",
500
+ more: (n) => `Show ${n} more`,
501
+ less: "Show less"
502
+ };
503
+ function reveal(i = 0) {
504
+ return {
505
+ className: "mie-deck-reveal",
506
+ style: { "--mie-reveal-i": i }
507
+ };
508
+ }
509
+ function Eyebrow({
510
+ children,
511
+ className
512
+ }) {
513
+ const tone = useTone();
514
+ const r = reveal(0);
515
+ return /* @__PURE__ */ jsxRuntime.jsx(
516
+ "p",
517
+ {
518
+ className: chunkS5RVSXDV_cjs.cn(
519
+ r.className,
520
+ "mb-4 text-xs font-semibold tracking-[0.2em] uppercase",
521
+ accent("accent", tone.isLight).text,
522
+ className
523
+ ),
524
+ style: r.style,
525
+ children
526
+ }
527
+ );
528
+ }
529
+ function SlideTitle({
530
+ children,
531
+ className,
532
+ size = "md"
533
+ }) {
534
+ const tone = useTone();
535
+ const r = reveal(1);
536
+ return /* @__PURE__ */ jsxRuntime.jsx(
537
+ "h2",
538
+ {
539
+ className: chunkS5RVSXDV_cjs.cn(
540
+ r.className,
541
+ "font-bold tracking-tight text-balance",
542
+ tone.text,
543
+ size === "xl" ? "text-5xl sm:text-6xl lg:text-7xl" : size === "lg" ? "text-4xl sm:text-5xl lg:text-6xl" : "text-3xl sm:text-4xl lg:text-5xl",
544
+ className
545
+ ),
546
+ style: r.style,
547
+ children
548
+ }
549
+ );
550
+ }
551
+ function Subtitle({
552
+ children,
553
+ className
554
+ }) {
555
+ const tone = useTone();
556
+ const r = reveal(2);
557
+ return /* @__PURE__ */ jsxRuntime.jsx(
558
+ "p",
559
+ {
560
+ className: chunkS5RVSXDV_cjs.cn(
561
+ r.className,
562
+ "mt-4 max-w-2xl text-base leading-relaxed text-pretty sm:text-lg",
563
+ tone.muted,
564
+ className
565
+ ),
566
+ style: r.style,
567
+ children
568
+ }
569
+ );
570
+ }
571
+ function SlideHeader({
572
+ eyebrow,
573
+ title,
574
+ subtitle,
575
+ center
576
+ }) {
577
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkS5RVSXDV_cjs.cn(center && "mx-auto text-center"), children: [
578
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx(Eyebrow, { children: eyebrow }),
579
+ /* @__PURE__ */ jsxRuntime.jsx(SlideTitle, { children: title }),
580
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx(Subtitle, { className: chunkS5RVSXDV_cjs.cn(center && "mx-auto"), children: subtitle })
581
+ ] });
582
+ }
583
+ function splitFigure(value) {
584
+ const start = value.search(/\d/);
585
+ if (start === -1) return null;
586
+ let end = start;
587
+ while (end < value.length && /[\d,.]/.test(value[end])) end += 1;
588
+ return [value.slice(0, start), value.slice(start, end), value.slice(end)];
589
+ }
590
+ function CountUp({
591
+ value,
592
+ duration = 1400
593
+ }) {
594
+ const ref = React9__namespace.useRef(null);
595
+ const match = splitFigure(value);
596
+ React9__namespace.useEffect(() => {
597
+ const el = ref.current;
598
+ if (!el || !match) return;
599
+ if (window.matchMedia?.("(prefers-reduced-motion: reduce)").matches) return;
600
+ const [prefix, digits, suffix] = match;
601
+ const target = parseFloat(digits.replace(/,/g, ""));
602
+ if (Number.isNaN(target)) return;
603
+ const decimals = digits.split(".")[1]?.length ?? 0;
604
+ const grouped = digits.includes(",");
605
+ const render = (n) => {
606
+ let out = n.toFixed(decimals);
607
+ if (grouped) {
608
+ const [whole, frac] = out.split(".");
609
+ out = whole.replace(/\B(?=(\d{3})+(?!\d))/g, ",") + (frac ? `.${frac}` : "");
610
+ }
611
+ el.textContent = `${prefix}${out}${suffix}`;
612
+ };
613
+ render(0);
614
+ let frame = 0;
615
+ const observer = new IntersectionObserver(
616
+ ([entry]) => {
617
+ if (!entry.isIntersecting) return;
618
+ observer.disconnect();
619
+ const start = performance.now();
620
+ const tick = (now) => {
621
+ const t = Math.min(1, (now - start) / duration);
622
+ render(target * (1 - Math.pow(1 - t, 3)));
623
+ if (t < 1) frame = requestAnimationFrame(tick);
624
+ else el.textContent = value;
625
+ };
626
+ frame = requestAnimationFrame(tick);
627
+ },
628
+ { threshold: 0.1 }
629
+ );
630
+ observer.observe(el);
631
+ return () => {
632
+ observer.disconnect();
633
+ cancelAnimationFrame(frame);
634
+ el.textContent = value;
635
+ };
636
+ }, [value, duration]);
637
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { ref, className: "tabular-nums", children: value });
638
+ }
639
+ function DeckIcon({
640
+ name,
641
+ className
642
+ }) {
643
+ const { icons } = useDeck();
644
+ if (!name) return null;
645
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkXI74P5F2_cjs.TemplateIcon, { name, icons, className });
646
+ }
647
+ function IconChip({
648
+ icon,
649
+ accent: accent2 = "accent"
650
+ }) {
651
+ const tone = useTone();
652
+ if (!icon) return null;
653
+ const a = accent(accent2, tone.isLight);
654
+ return /* @__PURE__ */ jsxRuntime.jsx(
655
+ "span",
656
+ {
657
+ className: chunkS5RVSXDV_cjs.cn(
658
+ "inline-flex size-11 items-center justify-center rounded-xl border",
659
+ a.soft,
660
+ a.border,
661
+ a.text
662
+ ),
663
+ children: /* @__PURE__ */ jsxRuntime.jsx(DeckIcon, { name: icon })
664
+ }
665
+ );
666
+ }
667
+ function Bullet({
668
+ item,
669
+ depth = 0
670
+ }) {
671
+ const tone = useTone();
672
+ const a = accent("accent", tone.isLight);
673
+ const b = typeof item === "string" ? { text: item } : item;
674
+ return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: chunkS5RVSXDV_cjs.cn("flex flex-col", depth > 0 && "ms-5 sm:ms-7"), children: [
675
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3", children: [
676
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: chunkS5RVSXDV_cjs.cn("mt-2 flex-none", a.text), children: b.icon ? /* @__PURE__ */ jsxRuntime.jsx(DeckIcon, { name: b.icon, className: "size-[1.1em]" }) : /* @__PURE__ */ jsxRuntime.jsx(
677
+ "span",
678
+ {
679
+ className: chunkS5RVSXDV_cjs.cn(
680
+ "block rounded-full",
681
+ depth === 0 ? chunkS5RVSXDV_cjs.cn("size-1.5", a.fill) : "size-1 bg-current opacity-60"
682
+ )
683
+ }
684
+ ) }),
685
+ /* @__PURE__ */ jsxRuntime.jsxs(
686
+ "span",
687
+ {
688
+ className: chunkS5RVSXDV_cjs.cn(
689
+ "leading-snug",
690
+ depth === 0 ? chunkS5RVSXDV_cjs.cn("text-lg sm:text-xl", tone.text) : chunkS5RVSXDV_cjs.cn("text-base", tone.muted)
691
+ ),
692
+ children: [
693
+ b.lead && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: chunkS5RVSXDV_cjs.cn("font-semibold", a.text), children: [
694
+ b.lead,
695
+ " "
696
+ ] }),
697
+ b.text
698
+ ]
699
+ }
700
+ )
701
+ ] }),
702
+ b.children && b.children.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "mt-2 flex flex-col gap-2", children: b.children.map((child, i) => /* @__PURE__ */ jsxRuntime.jsx(Bullet, { item: child, depth: depth + 1 }, i)) })
703
+ ] });
704
+ }
705
+ function SourceLink({
706
+ source,
707
+ className
708
+ }) {
709
+ const tone = useTone();
710
+ const href = chunkXI74P5F2_cjs.safeHref(source.url);
711
+ if (!href)
712
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkS5RVSXDV_cjs.cn("text-xs", tone.muted, className), children: source.label });
713
+ return /* @__PURE__ */ jsxRuntime.jsxs(
714
+ "a",
715
+ {
716
+ href,
717
+ target: "_blank",
718
+ rel: "noopener noreferrer",
719
+ className: chunkS5RVSXDV_cjs.cn(
720
+ "inline-flex items-center gap-1 text-xs underline underline-offset-2 hover:opacity-100",
721
+ tone.muted,
722
+ className
723
+ ),
724
+ children: [
725
+ source.label,
726
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ExternalLink, { "aria-hidden": "true", className: "size-3" })
727
+ ]
728
+ }
729
+ );
730
+ }
731
+ function HighlightFigure({
732
+ value,
733
+ label,
734
+ size = "md"
735
+ }) {
736
+ const tone = useTone();
737
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
738
+ /* @__PURE__ */ jsxRuntime.jsx(
739
+ "div",
740
+ {
741
+ className: chunkS5RVSXDV_cjs.cn(
742
+ "font-bold",
743
+ accent("accent", tone.isLight).text,
744
+ size === "lg" ? "text-4xl sm:text-5xl" : "text-3xl sm:text-4xl"
745
+ ),
746
+ children: /* @__PURE__ */ jsxRuntime.jsx(CountUp, { value })
747
+ }
748
+ ),
749
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkS5RVSXDV_cjs.cn("mt-1 text-xs tracking-wider uppercase", tone.muted), children: label })
750
+ ] });
751
+ }
752
+ function Card({
753
+ children,
754
+ className,
755
+ i
756
+ }) {
757
+ const tone = useTone();
758
+ const r = reveal(i ?? 3);
759
+ return /* @__PURE__ */ jsxRuntime.jsx(
760
+ "div",
761
+ {
762
+ className: chunkS5RVSXDV_cjs.cn(
763
+ r.className,
764
+ "rounded-2xl border p-6",
765
+ tone.card,
766
+ tone.hairline,
767
+ className
768
+ ),
769
+ style: r.style,
770
+ children
771
+ }
772
+ );
773
+ }
774
+ function ChartTable({
775
+ caption,
776
+ headers,
777
+ rows
778
+ }) {
779
+ return /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "sr-only", children: [
780
+ /* @__PURE__ */ jsxRuntime.jsx("caption", { children: caption }),
781
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsx("tr", { children: headers.map(
782
+ (h, i) => h ? /* @__PURE__ */ jsxRuntime.jsx("th", { scope: "col", children: h }, i) : (
783
+ // The row-label corner cell has no caption of its own.
784
+ /* @__PURE__ */ jsxRuntime.jsx("td", {}, i)
785
+ )
786
+ ) }) }),
787
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: rows.map((row, r) => /* @__PURE__ */ jsxRuntime.jsx("tr", { children: row.map(
788
+ (cell, c) => c === 0 ? /* @__PURE__ */ jsxRuntime.jsx("th", { scope: "row", children: cell }, c) : /* @__PURE__ */ jsxRuntime.jsx("td", { children: cell }, c)
789
+ ) }, r)) })
790
+ ] });
791
+ }
792
+ function useFormat() {
793
+ const { locale } = useDeck();
794
+ return React9__namespace.useMemo(
795
+ () => new Intl.NumberFormat(locale, { notation: "compact" }),
796
+ [locale]
797
+ );
798
+ }
799
+ function BarChart({ graphic }) {
800
+ const tone = useTone();
801
+ const format = useFormat();
802
+ const max = Math.max(1, ...graphic.bars.map((b) => b.value));
803
+ const hi = accent("accent", tone.isLight);
804
+ return /* @__PURE__ */ jsxRuntime.jsxs("figure", { "data-slot": "deck-bar-chart", className: "w-full", children: [
805
+ /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-hidden": "true", className: "flex h-56 items-end gap-2 sm:h-64", children: graphic.bars.map((bar, i) => /* @__PURE__ */ jsxRuntime.jsxs(React9__namespace.Fragment, { children: [
806
+ graphic.marker?.atIndex === i && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative h-full w-px flex-none border-s border-dashed border-current opacity-40", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute start-1/2 -top-6 -translate-x-1/2 text-[0.65rem] font-semibold tracking-wide whitespace-nowrap uppercase opacity-100", children: graphic.marker.label }) }),
807
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full min-w-0 flex-1 flex-col items-center gap-1", children: [
808
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full flex-1 pt-5", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative h-full", children: /* @__PURE__ */ jsxRuntime.jsx(
809
+ "div",
810
+ {
811
+ className: chunkS5RVSXDV_cjs.cn(
812
+ "mie-deck-grow absolute inset-x-0 bottom-0 rounded-t-md",
813
+ bar.highlight ? hi.fill : tone.isLight ? "bg-neutral-300" : "bg-white/25"
814
+ ),
815
+ style: {
816
+ height: `${bar.value / max * 100}%`,
817
+ "--mie-reveal-i": i
818
+ },
819
+ children: /* @__PURE__ */ jsxRuntime.jsx(
820
+ "span",
821
+ {
822
+ className: chunkS5RVSXDV_cjs.cn(
823
+ "absolute inset-x-0 bottom-full mb-1 text-center text-xs font-semibold tabular-nums",
824
+ tone.muted
825
+ ),
826
+ children: format.format(bar.value)
827
+ }
828
+ )
829
+ }
830
+ ) }) }),
831
+ /* @__PURE__ */ jsxRuntime.jsx(
832
+ "span",
833
+ {
834
+ className: chunkS5RVSXDV_cjs.cn(
835
+ "w-full truncate text-center text-xs",
836
+ tone.muted
837
+ ),
838
+ children: bar.label
839
+ }
840
+ )
841
+ ] })
842
+ ] }, bar.label)) }),
843
+ graphic.yAxisLabel && /* @__PURE__ */ jsxRuntime.jsx("figcaption", { className: chunkS5RVSXDV_cjs.cn("mt-2 text-xs", tone.muted), children: graphic.yAxisLabel }),
844
+ /* @__PURE__ */ jsxRuntime.jsx(
845
+ ChartTable,
846
+ {
847
+ caption: graphic.yAxisLabel ?? "Values",
848
+ headers: ["", graphic.yAxisLabel ?? "Value"],
849
+ rows: graphic.bars.map((b) => [b.label, b.value])
850
+ }
851
+ )
852
+ ] });
853
+ }
854
+ function HorizontalBars({ graphic }) {
855
+ const tone = useTone();
856
+ const format = useFormat();
857
+ const max = Math.max(1, ...graphic.bars.map((b) => b.value));
858
+ const a = accent("accent", tone.isLight);
859
+ return /* @__PURE__ */ jsxRuntime.jsx("ul", { "data-slot": "deck-horizontal-bars", className: "w-full space-y-3", children: graphic.bars.map((bar, i) => {
860
+ const r = reveal(3 + i);
861
+ return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: r.className, style: r.style, children: [
862
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-1 flex justify-between gap-3 text-sm", children: [
863
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: bar.label }),
864
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold tabular-nums", children: bar.display ?? format.format(bar.value) })
865
+ ] }),
866
+ /* @__PURE__ */ jsxRuntime.jsx(
867
+ "div",
868
+ {
869
+ "aria-hidden": "true",
870
+ className: chunkS5RVSXDV_cjs.cn(
871
+ "h-2 overflow-hidden rounded-full",
872
+ tone.isLight ? "bg-neutral-200" : "bg-white/10"
873
+ ),
874
+ children: /* @__PURE__ */ jsxRuntime.jsx(
875
+ "div",
876
+ {
877
+ className: chunkS5RVSXDV_cjs.cn("h-full rounded-full", a.fill),
878
+ style: { width: `${bar.value / max * 100}%` }
879
+ }
880
+ )
881
+ }
882
+ )
883
+ ] }, bar.label);
884
+ }) });
885
+ }
886
+ function KpiRow({ graphic }) {
887
+ const tone = useTone();
888
+ return /* @__PURE__ */ jsxRuntime.jsx(
889
+ "dl",
890
+ {
891
+ "data-slot": "deck-kpi-row",
892
+ className: "grid w-full grid-cols-2 gap-4 sm:grid-cols-4",
893
+ children: graphic.kpis.map((kpi, i) => {
894
+ const Trend = kpi.trend === "up" ? lucideReact.TrendingUp : kpi.trend === "down" ? lucideReact.TrendingDown : lucideReact.Minus;
895
+ const r = reveal(3 + i);
896
+ return /* @__PURE__ */ jsxRuntime.jsxs(
897
+ "div",
898
+ {
899
+ className: chunkS5RVSXDV_cjs.cn(
900
+ r.className,
901
+ "flex flex-col-reverse rounded-xl border p-4",
902
+ tone.card,
903
+ tone.hairline
904
+ ),
905
+ style: r.style,
906
+ children: [
907
+ /* @__PURE__ */ jsxRuntime.jsx("dt", { className: chunkS5RVSXDV_cjs.cn("text-xs", tone.muted), children: kpi.label }),
908
+ /* @__PURE__ */ jsxRuntime.jsxs("dd", { className: "flex items-center gap-2 text-2xl font-bold tabular-nums", children: [
909
+ kpi.value,
910
+ kpi.trend && /* @__PURE__ */ jsxRuntime.jsx(
911
+ Trend,
912
+ {
913
+ "aria-hidden": "true",
914
+ className: chunkS5RVSXDV_cjs.cn(
915
+ "size-4",
916
+ kpi.trend === "up" ? "text-success" : kpi.trend === "down" ? "text-destructive" : tone.muted
917
+ )
918
+ }
919
+ )
920
+ ] })
921
+ ]
922
+ },
923
+ kpi.label
924
+ );
925
+ })
926
+ }
927
+ );
928
+ }
929
+ function points(values, w, h, y) {
930
+ const step = values.length > 1 ? w / (values.length - 1) : 0;
931
+ return values.map((v, i) => `${(i * step).toFixed(1)},${(h - y(v) * h).toFixed(1)}`).join(" ");
932
+ }
933
+ function Spark({ graphic }) {
934
+ const tone = useTone();
935
+ const a = accent("accent", tone.isLight);
936
+ const max = Math.max(1, ...graphic.values);
937
+ const last = graphic.values[graphic.values.length - 1];
938
+ return /* @__PURE__ */ jsxRuntime.jsxs("figure", { "data-slot": "deck-spark", className: "w-full", children: [
939
+ /* @__PURE__ */ jsxRuntime.jsxs(
940
+ "figcaption",
941
+ {
942
+ className: chunkS5RVSXDV_cjs.cn(
943
+ "flex items-baseline justify-between text-sm",
944
+ tone.muted
945
+ ),
946
+ children: [
947
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: graphic.label }),
948
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: chunkS5RVSXDV_cjs.cn("text-2xl font-bold tabular-nums", a.text), children: [
949
+ last,
950
+ graphic.suffix
951
+ ] })
952
+ ]
953
+ }
954
+ ),
955
+ /* @__PURE__ */ jsxRuntime.jsx(
956
+ "svg",
957
+ {
958
+ "aria-hidden": "true",
959
+ viewBox: "0 0 100 30",
960
+ preserveAspectRatio: "none",
961
+ className: "mt-2 h-12 w-full overflow-visible",
962
+ children: /* @__PURE__ */ jsxRuntime.jsx(
963
+ "polyline",
964
+ {
965
+ points: points(graphic.values, 100, 30, (v) => v / max),
966
+ fill: "none",
967
+ strokeWidth: 2,
968
+ vectorEffect: "non-scaling-stroke",
969
+ className: a.svgStroke
970
+ }
971
+ )
972
+ }
973
+ ),
974
+ /* @__PURE__ */ jsxRuntime.jsx(
975
+ ChartTable,
976
+ {
977
+ caption: graphic.label,
978
+ headers: ["#", graphic.label],
979
+ rows: graphic.values.map((v, i) => [i + 1, v])
980
+ }
981
+ )
982
+ ] });
983
+ }
984
+ function MultiLine({ graphic }) {
985
+ const tone = useTone();
986
+ const { labels } = useDeck();
987
+ const format = useFormat();
988
+ const [view, setView] = React9__namespace.useState("lines");
989
+ const all = graphic.series.flatMap((s) => s.values);
990
+ const log = (graphic.scale ?? "log") === "log";
991
+ const tx = (v) => log ? Math.log10(Math.max(1, v)) : v;
992
+ const lo = Math.min(...all.map(tx));
993
+ const hi = Math.max(...all.map(tx));
994
+ const y = (v) => hi === lo ? 0.5 : (tx(v) - lo) / (hi - lo);
995
+ const colours = graphic.series.map(
996
+ (_, i) => accent(ACCENT_CYCLE[i % ACCENT_CYCLE.length], tone.isLight)
997
+ );
998
+ const toggle = (active) => chunkS5RVSXDV_cjs.cn(
999
+ "rounded-full px-3 py-1 text-xs font-semibold transition-colors",
1000
+ active ? tone.isLight ? "bg-neutral-900 text-white" : "bg-white text-neutral-900" : chunkS5RVSXDV_cjs.cn(tone.muted, "hover:opacity-100")
1001
+ );
1002
+ return /* @__PURE__ */ jsxRuntime.jsxs("figure", { "data-slot": "deck-multi-line", className: "w-full", children: [
1003
+ /* @__PURE__ */ jsxRuntime.jsxs(
1004
+ "div",
1005
+ {
1006
+ role: "group",
1007
+ "aria-label": graphic.caption,
1008
+ className: "mb-3 flex gap-1",
1009
+ children: [
1010
+ /* @__PURE__ */ jsxRuntime.jsx(
1011
+ "button",
1012
+ {
1013
+ type: "button",
1014
+ "aria-pressed": view === "lines",
1015
+ className: toggle(view === "lines"),
1016
+ onClick: () => setView("lines"),
1017
+ children: labels.lines
1018
+ }
1019
+ ),
1020
+ /* @__PURE__ */ jsxRuntime.jsx(
1021
+ "button",
1022
+ {
1023
+ type: "button",
1024
+ "aria-pressed": view === "bars",
1025
+ className: toggle(view === "bars"),
1026
+ onClick: () => setView("bars"),
1027
+ children: labels.bars
1028
+ }
1029
+ )
1030
+ ]
1031
+ }
1032
+ ),
1033
+ view === "lines" ? /* @__PURE__ */ jsxRuntime.jsx(
1034
+ "svg",
1035
+ {
1036
+ "aria-hidden": "true",
1037
+ viewBox: "0 0 100 50",
1038
+ preserveAspectRatio: "none",
1039
+ className: "h-56 w-full overflow-visible",
1040
+ children: graphic.series.map((s, i) => /* @__PURE__ */ jsxRuntime.jsx(
1041
+ "polyline",
1042
+ {
1043
+ points: points(s.values, 100, 50, y),
1044
+ fill: "none",
1045
+ strokeWidth: 2.5,
1046
+ strokeLinecap: "round",
1047
+ strokeLinejoin: "round",
1048
+ vectorEffect: "non-scaling-stroke",
1049
+ className: colours[i].svgStroke
1050
+ },
1051
+ s.label
1052
+ ))
1053
+ }
1054
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-hidden": "true", className: "grid gap-4 sm:grid-cols-2", children: graphic.series.map((s, i) => {
1055
+ const max = Math.max(1, ...s.values);
1056
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1057
+ /* @__PURE__ */ jsxRuntime.jsx(
1058
+ "p",
1059
+ {
1060
+ className: chunkS5RVSXDV_cjs.cn("mb-1 text-xs font-semibold", colours[i].text),
1061
+ children: s.label
1062
+ }
1063
+ ),
1064
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-20 items-end gap-1", children: s.values.map((v, j) => /* @__PURE__ */ jsxRuntime.jsx(
1065
+ "div",
1066
+ {
1067
+ className: chunkS5RVSXDV_cjs.cn("flex-1 rounded-t-sm", colours[i].fill),
1068
+ style: { height: `${v / max * 100}%` }
1069
+ },
1070
+ j
1071
+ )) })
1072
+ ] }, s.label);
1073
+ }) }),
1074
+ /* @__PURE__ */ jsxRuntime.jsx(
1075
+ "div",
1076
+ {
1077
+ "aria-hidden": "true",
1078
+ className: chunkS5RVSXDV_cjs.cn("mt-2 flex justify-between text-xs", tone.muted),
1079
+ children: graphic.xLabels.map((l) => /* @__PURE__ */ jsxRuntime.jsx("span", { children: l }, l))
1080
+ }
1081
+ ),
1082
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "mt-4 flex flex-wrap gap-x-6 gap-y-2 text-sm", children: graphic.series.map((s, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-center gap-2", children: [
1083
+ /* @__PURE__ */ jsxRuntime.jsx(
1084
+ "span",
1085
+ {
1086
+ "aria-hidden": "true",
1087
+ className: chunkS5RVSXDV_cjs.cn("size-2.5 rounded-full", colours[i].fill)
1088
+ }
1089
+ ),
1090
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: s.label }),
1091
+ s.summary && /* @__PURE__ */ jsxRuntime.jsx("span", { className: tone.muted, children: s.summary })
1092
+ ] }, s.label)) }),
1093
+ graphic.caption && /* @__PURE__ */ jsxRuntime.jsx("figcaption", { className: chunkS5RVSXDV_cjs.cn("mt-2 text-xs", tone.muted), children: graphic.caption }),
1094
+ /* @__PURE__ */ jsxRuntime.jsx(
1095
+ ChartTable,
1096
+ {
1097
+ caption: graphic.caption ?? graphic.series.map((s) => s.label).join(", "),
1098
+ headers: ["", ...graphic.series.map((s) => s.label)],
1099
+ rows: graphic.xLabels.map((x, i) => [
1100
+ x,
1101
+ ...graphic.series.map((s) => format.format(s.values[i] ?? 0))
1102
+ ])
1103
+ }
1104
+ )
1105
+ ] });
1106
+ }
1107
+ function Graphic({ graphic }) {
1108
+ const { graphics } = useDeck();
1109
+ switch (graphic.type) {
1110
+ case "bar":
1111
+ return /* @__PURE__ */ jsxRuntime.jsx(BarChart, { graphic });
1112
+ case "horizontal-bar":
1113
+ return /* @__PURE__ */ jsxRuntime.jsx(HorizontalBars, { graphic });
1114
+ case "multi-line":
1115
+ return /* @__PURE__ */ jsxRuntime.jsx(MultiLine, { graphic });
1116
+ case "kpi-row":
1117
+ return /* @__PURE__ */ jsxRuntime.jsx(KpiRow, { graphic });
1118
+ case "spark":
1119
+ return /* @__PURE__ */ jsxRuntime.jsx(Spark, { graphic });
1120
+ case "custom": {
1121
+ const Custom = graphics?.[graphic.component];
1122
+ return Custom ? /* @__PURE__ */ jsxRuntime.jsx(Custom, { ...graphic.props }) : null;
1123
+ }
1124
+ }
1125
+ }
1126
+ var slideAnchor = (slide, index) => slide.id ?? `slide-${index}`;
1127
+ var widthClass = {
1128
+ sm: "max-w-3xl",
1129
+ md: "max-w-4xl",
1130
+ lg: "max-w-5xl",
1131
+ xl: "max-w-6xl"
1132
+ };
1133
+ function SlideFrame({
1134
+ slide,
1135
+ index,
1136
+ tone: fallback,
1137
+ children,
1138
+ width = "xl",
1139
+ className
1140
+ }) {
1141
+ const { labels } = useDeck();
1142
+ const toneName = slide.tone ?? fallback;
1143
+ const tone = TONES[toneName];
1144
+ const title = "title" in slide ? slide.title : void 0;
1145
+ return /* @__PURE__ */ jsxRuntime.jsx(ToneContext.Provider, { value: tone, children: /* @__PURE__ */ jsxRuntime.jsxs(
1146
+ "section",
1147
+ {
1148
+ id: slideAnchor(slide, index),
1149
+ "data-slot": "deck-slide",
1150
+ "data-index": index,
1151
+ "data-tone": toneName,
1152
+ role: "group",
1153
+ "aria-roledescription": labels.slide,
1154
+ "aria-label": slide.navLabel ?? title ?? `${index + 1}`,
1155
+ className: chunkS5RVSXDV_cjs.cn(
1156
+ "mie-deck-slide relative isolate flex min-h-dvh w-full snap-start snap-always flex-col items-center justify-center overflow-hidden px-5 py-12 sm:px-8 sm:py-14 md:px-12 lg:px-20",
1157
+ tone.surface,
1158
+ tone.text,
1159
+ className
1160
+ ),
1161
+ children: [
1162
+ !tone.isLight && /* @__PURE__ */ jsxRuntime.jsxs(
1163
+ "div",
1164
+ {
1165
+ "aria-hidden": "true",
1166
+ className: "pointer-events-none absolute inset-0 -z-10 overflow-hidden print:hidden",
1167
+ children: [
1168
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-accent/15 absolute -end-24 -top-24 size-[28rem] rounded-full blur-3xl" }),
1169
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-primary-500/15 absolute -start-24 -bottom-32 size-[32rem] rounded-full blur-3xl" })
1170
+ ]
1171
+ }
1172
+ ),
1173
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkS5RVSXDV_cjs.cn("relative w-full", widthClass[width]), children })
1174
+ ]
1175
+ }
1176
+ ) });
1177
+ }
1178
+ var gridCols = (n) => n >= 4 ? "sm:grid-cols-2 lg:grid-cols-4" : n === 3 ? "md:grid-cols-3" : "md:grid-cols-2";
1179
+ function MetricsBody({ slide }) {
1180
+ const tone = useTone();
1181
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1182
+ /* @__PURE__ */ jsxRuntime.jsx(
1183
+ SlideHeader,
1184
+ {
1185
+ eyebrow: slide.eyebrow,
1186
+ title: slide.title,
1187
+ subtitle: slide.subtitle
1188
+ }
1189
+ ),
1190
+ /* @__PURE__ */ jsxRuntime.jsx(
1191
+ "div",
1192
+ {
1193
+ className: chunkS5RVSXDV_cjs.cn(
1194
+ "mt-10 grid grid-cols-1 gap-5",
1195
+ gridCols(slide.metrics.length)
1196
+ ),
1197
+ children: slide.metrics.map((m, i) => /* @__PURE__ */ jsxRuntime.jsxs(Card, { i: 3 + i, children: [
1198
+ m.icon && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-4", children: /* @__PURE__ */ jsxRuntime.jsx(IconChip, { icon: m.icon, accent: m.accent }) }),
1199
+ /* @__PURE__ */ jsxRuntime.jsx(
1200
+ "div",
1201
+ {
1202
+ className: chunkS5RVSXDV_cjs.cn(
1203
+ "text-4xl font-bold",
1204
+ accent(m.accent, tone.isLight).text
1205
+ ),
1206
+ children: /* @__PURE__ */ jsxRuntime.jsx(CountUp, { value: m.value })
1207
+ }
1208
+ ),
1209
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2 text-sm font-semibold", children: m.label }),
1210
+ m.description && /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkS5RVSXDV_cjs.cn("mt-1 text-sm leading-snug", tone.muted), children: m.description })
1211
+ ] }, m.label))
1212
+ }
1213
+ )
1214
+ ] });
1215
+ }
1216
+ function MetricsRenderer({
1217
+ slide,
1218
+ index
1219
+ }) {
1220
+ return /* @__PURE__ */ jsxRuntime.jsx(SlideFrame, { slide, index, tone: "brand", children: /* @__PURE__ */ jsxRuntime.jsx(MetricsBody, { slide }) });
1221
+ }
1222
+ function ChartBody({ slide }) {
1223
+ const tone = useTone();
1224
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1225
+ /* @__PURE__ */ jsxRuntime.jsx(
1226
+ SlideHeader,
1227
+ {
1228
+ eyebrow: slide.eyebrow,
1229
+ title: slide.title,
1230
+ subtitle: slide.subtitle
1231
+ }
1232
+ ),
1233
+ /* @__PURE__ */ jsxRuntime.jsx("div", { ...reveal(3), className: "mie-deck-reveal mt-10", children: /* @__PURE__ */ jsxRuntime.jsx(Graphic, { graphic: slide.graphic }) }),
1234
+ slide.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunkS5RVSXDV_cjs.cn("mt-6 max-w-3xl text-sm", tone.muted), children: slide.description }),
1235
+ slide.source && /* @__PURE__ */ jsxRuntime.jsx(SourceLink, { source: slide.source, className: "mt-4" })
1236
+ ] });
1237
+ }
1238
+ function ChartRenderer({
1239
+ slide,
1240
+ index
1241
+ }) {
1242
+ return /* @__PURE__ */ jsxRuntime.jsx(SlideFrame, { slide, index, tone: "deep", children: /* @__PURE__ */ jsxRuntime.jsx(ChartBody, { slide }) });
1243
+ }
1244
+ function FeatureHighlightBody({
1245
+ slide
1246
+ }) {
1247
+ const tone = useTone();
1248
+ const a = accent("accent", tone.isLight);
1249
+ const hasGraphic = !!slide.graphic;
1250
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1251
+ "div",
1252
+ {
1253
+ className: chunkS5RVSXDV_cjs.cn(hasGraphic && "grid items-center gap-10 lg:grid-cols-2"),
1254
+ children: [
1255
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1256
+ /* @__PURE__ */ jsxRuntime.jsx(SlideHeader, { eyebrow: slide.eyebrow, title: slide.title }),
1257
+ /* @__PURE__ */ jsxRuntime.jsx(
1258
+ "p",
1259
+ {
1260
+ ...reveal(2),
1261
+ className: chunkS5RVSXDV_cjs.cn(
1262
+ "mie-deck-reveal mt-4 text-lg leading-relaxed",
1263
+ tone.muted
1264
+ ),
1265
+ children: slide.body
1266
+ }
1267
+ ),
1268
+ slide.stat && /* @__PURE__ */ jsxRuntime.jsxs("div", { ...reveal(3), className: "mie-deck-reveal mt-8", children: [
1269
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkS5RVSXDV_cjs.cn("text-5xl font-bold", a.text), children: /* @__PURE__ */ jsxRuntime.jsx(CountUp, { value: slide.stat.value }) }),
1270
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkS5RVSXDV_cjs.cn("mt-1 text-sm", tone.muted), children: slide.stat.label })
1271
+ ] }),
1272
+ slide.bullets && slide.bullets.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("ul", { ...reveal(4), className: "mie-deck-reveal mt-6 space-y-2", children: slide.bullets.map((b) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-start gap-3", children: [
1273
+ /* @__PURE__ */ jsxRuntime.jsx(
1274
+ "span",
1275
+ {
1276
+ "aria-hidden": "true",
1277
+ className: chunkS5RVSXDV_cjs.cn("mt-2 size-1.5 flex-none rounded-full", a.fill)
1278
+ }
1279
+ ),
1280
+ b
1281
+ ] }, b)) }),
1282
+ slide.pullQuote && /* @__PURE__ */ jsxRuntime.jsx(
1283
+ "blockquote",
1284
+ {
1285
+ ...reveal(5),
1286
+ className: chunkS5RVSXDV_cjs.cn(
1287
+ "mie-deck-reveal mt-8 border-s-2 ps-4 italic",
1288
+ a.border,
1289
+ tone.muted
1290
+ ),
1291
+ children: slide.pullQuote
1292
+ }
1293
+ )
1294
+ ] }),
1295
+ hasGraphic && /* @__PURE__ */ jsxRuntime.jsxs("div", { ...reveal(3), className: "mie-deck-reveal flex flex-col gap-8", children: [
1296
+ /* @__PURE__ */ jsxRuntime.jsx(Graphic, { graphic: slide.graphic }),
1297
+ slide.secondaryGraphic && /* @__PURE__ */ jsxRuntime.jsx(Graphic, { graphic: slide.secondaryGraphic })
1298
+ ] })
1299
+ ]
1300
+ }
1301
+ );
1302
+ }
1303
+ function FeatureHighlightRenderer({
1304
+ slide,
1305
+ index
1306
+ }) {
1307
+ return /* @__PURE__ */ jsxRuntime.jsx(SlideFrame, { slide, index, tone: "deep", children: /* @__PURE__ */ jsxRuntime.jsx(FeatureHighlightBody, { slide }) });
1308
+ }
1309
+ function DeckTable({
1310
+ headers,
1311
+ rows
1312
+ }) {
1313
+ const tone = useTone();
1314
+ return /* @__PURE__ */ jsxRuntime.jsx(
1315
+ "div",
1316
+ {
1317
+ ...reveal(3),
1318
+ className: chunkS5RVSXDV_cjs.cn(
1319
+ "mie-deck-reveal mt-10 overflow-x-auto rounded-2xl border",
1320
+ tone.hairline,
1321
+ tone.card
1322
+ ),
1323
+ children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "min-w-full text-start text-sm sm:text-base", children: [
1324
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsx("tr", { className: chunkS5RVSXDV_cjs.cn("border-b", tone.hairline), children: headers.map((h, i) => /* @__PURE__ */ jsxRuntime.jsx(
1325
+ "th",
1326
+ {
1327
+ scope: "col",
1328
+ className: chunkS5RVSXDV_cjs.cn(
1329
+ "px-5 py-3 font-semibold",
1330
+ i === 0 ? "text-start" : "text-end",
1331
+ tone.muted
1332
+ ),
1333
+ children: h
1334
+ },
1335
+ h
1336
+ )) }) }),
1337
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: rows.map((row, r) => /* @__PURE__ */ jsxRuntime.jsx("tr", { className: chunkS5RVSXDV_cjs.cn(r > 0 && "border-t", tone.hairline), children: row.map(
1338
+ (cell, c) => c === 0 ? /* @__PURE__ */ jsxRuntime.jsx(
1339
+ "th",
1340
+ {
1341
+ scope: "row",
1342
+ className: "px-5 py-3 text-start font-medium",
1343
+ children: cell
1344
+ },
1345
+ c
1346
+ ) : /* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-5 py-3 text-end tabular-nums", children: cell }, c)
1347
+ ) }, r)) })
1348
+ ] })
1349
+ }
1350
+ );
1351
+ }
1352
+ function ComparisonTableRenderer({
1353
+ slide,
1354
+ index
1355
+ }) {
1356
+ const a = accent("accent", (slide.tone ?? "deep") === "light");
1357
+ const [metric, before, after, change] = slide.headers ?? [
1358
+ "Metric",
1359
+ "Before",
1360
+ "After",
1361
+ "Change"
1362
+ ];
1363
+ return /* @__PURE__ */ jsxRuntime.jsxs(SlideFrame, { slide, index, tone: "deep", width: "lg", children: [
1364
+ /* @__PURE__ */ jsxRuntime.jsx(
1365
+ SlideHeader,
1366
+ {
1367
+ eyebrow: slide.eyebrow,
1368
+ title: slide.title,
1369
+ subtitle: slide.subtitle
1370
+ }
1371
+ ),
1372
+ /* @__PURE__ */ jsxRuntime.jsx(
1373
+ DeckTable,
1374
+ {
1375
+ headers: [metric, before, after, change],
1376
+ rows: slide.rows.map((r) => [
1377
+ r.label,
1378
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "opacity-70", children: r.before }, "b"),
1379
+ r.after,
1380
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkS5RVSXDV_cjs.cn("font-semibold", a.text), children: r.change }, "c")
1381
+ ])
1382
+ }
1383
+ )
1384
+ ] });
1385
+ }
1386
+ function ImpactTableRenderer({
1387
+ slide,
1388
+ index
1389
+ }) {
1390
+ const [item, impact] = slide.headers ?? ["Investment", "Impact"];
1391
+ return /* @__PURE__ */ jsxRuntime.jsxs(SlideFrame, { slide, index, tone: "deep", width: "lg", children: [
1392
+ /* @__PURE__ */ jsxRuntime.jsx(
1393
+ SlideHeader,
1394
+ {
1395
+ eyebrow: slide.eyebrow,
1396
+ title: slide.title,
1397
+ subtitle: slide.subtitle
1398
+ }
1399
+ ),
1400
+ /* @__PURE__ */ jsxRuntime.jsx(
1401
+ DeckTable,
1402
+ {
1403
+ headers: [item, impact],
1404
+ rows: slide.rows.map((r) => [
1405
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
1406
+ r.item,
1407
+ r.detail && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-sm font-normal opacity-70", children: r.detail })
1408
+ ] }, "i"),
1409
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block text-start sm:text-end", children: r.impact }, "m")
1410
+ ])
1411
+ }
1412
+ )
1413
+ ] });
1414
+ }
1415
+ function CardsBody({ slide }) {
1416
+ const tone = useTone();
1417
+ const a = accent("accent", tone.isLight);
1418
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1419
+ /* @__PURE__ */ jsxRuntime.jsx(
1420
+ SlideHeader,
1421
+ {
1422
+ eyebrow: slide.eyebrow,
1423
+ title: slide.title,
1424
+ subtitle: slide.subtitle
1425
+ }
1426
+ ),
1427
+ /* @__PURE__ */ jsxRuntime.jsx(
1428
+ "div",
1429
+ {
1430
+ className: chunkS5RVSXDV_cjs.cn(
1431
+ "mt-10 grid grid-cols-1 gap-5",
1432
+ gridCols(slide.cards.length)
1433
+ ),
1434
+ children: slide.cards.map((card, i) => /* @__PURE__ */ jsxRuntime.jsxs(Card, { i: 3 + i, children: [
1435
+ card.icon && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-4", children: /* @__PURE__ */ jsxRuntime.jsx(IconChip, { icon: card.icon }) }),
1436
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-semibold", children: card.title }),
1437
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunkS5RVSXDV_cjs.cn("mt-2 leading-relaxed", tone.muted), children: card.body }),
1438
+ card.stat && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-6", children: [
1439
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkS5RVSXDV_cjs.cn("text-3xl font-bold", a.text), children: /* @__PURE__ */ jsxRuntime.jsx(CountUp, { value: card.stat }) }),
1440
+ card.statLabel && /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkS5RVSXDV_cjs.cn("text-sm", tone.muted), children: card.statLabel })
1441
+ ] })
1442
+ ] }, card.title))
1443
+ }
1444
+ ),
1445
+ slide.note && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunkS5RVSXDV_cjs.cn("mt-8 text-sm italic", tone.muted), children: slide.note })
1446
+ ] });
1447
+ }
1448
+ function CardsRenderer({
1449
+ slide,
1450
+ index
1451
+ }) {
1452
+ return /* @__PURE__ */ jsxRuntime.jsx(SlideFrame, { slide, index, tone: "brand", children: /* @__PURE__ */ jsxRuntime.jsx(CardsBody, { slide }) });
1453
+ }
1454
+ function RankedListBody({ slide }) {
1455
+ const tone = useTone();
1456
+ const { locale } = useDeck();
1457
+ const a = accent("accent", tone.isLight);
1458
+ const format = new Intl.NumberFormat(locale);
1459
+ const max = Math.max(1, ...slide.entries.map((e) => e.value));
1460
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1461
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-end justify-between gap-4", children: [
1462
+ /* @__PURE__ */ jsxRuntime.jsx(
1463
+ SlideHeader,
1464
+ {
1465
+ eyebrow: slide.eyebrow,
1466
+ title: slide.title,
1467
+ subtitle: slide.subtitle
1468
+ }
1469
+ ),
1470
+ slide.outOf && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunkS5RVSXDV_cjs.cn("text-sm", tone.muted), children: slide.outOf })
1471
+ ] }),
1472
+ /* @__PURE__ */ jsxRuntime.jsx("ol", { className: "mt-8 flex flex-col gap-2", children: slide.entries.map((e, i) => {
1473
+ const r = reveal(3 + i);
1474
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1475
+ "li",
1476
+ {
1477
+ className: chunkS5RVSXDV_cjs.cn(
1478
+ r.className,
1479
+ "grid grid-cols-[2rem_minmax(0,1fr)_auto] items-center gap-4 rounded-xl border px-4 py-3",
1480
+ e.highlighted ? chunkS5RVSXDV_cjs.cn(a.soft, a.border) : chunkS5RVSXDV_cjs.cn(tone.card, tone.hairline)
1481
+ ),
1482
+ style: r.style,
1483
+ children: [
1484
+ /* @__PURE__ */ jsxRuntime.jsx(
1485
+ "span",
1486
+ {
1487
+ className: chunkS5RVSXDV_cjs.cn(
1488
+ "text-sm font-bold tabular-nums",
1489
+ e.highlighted ? a.text : tone.muted
1490
+ ),
1491
+ children: i + 1
1492
+ }
1493
+ ),
1494
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "min-w-0", children: [
1495
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block truncate font-medium", children: e.label }),
1496
+ e.sublabel && /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkS5RVSXDV_cjs.cn("block truncate text-xs", tone.muted), children: e.sublabel }),
1497
+ /* @__PURE__ */ jsxRuntime.jsx(
1498
+ "span",
1499
+ {
1500
+ "aria-hidden": "true",
1501
+ className: chunkS5RVSXDV_cjs.cn(
1502
+ "mt-2 block h-1.5 overflow-hidden rounded-full",
1503
+ tone.isLight ? "bg-neutral-200" : "bg-white/10"
1504
+ ),
1505
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1506
+ "span",
1507
+ {
1508
+ className: chunkS5RVSXDV_cjs.cn(
1509
+ "block h-full rounded-full",
1510
+ e.highlighted ? a.fill : tone.isLight ? "bg-neutral-400" : "bg-white/40"
1511
+ ),
1512
+ style: { width: `${e.value / max * 100}%` }
1513
+ }
1514
+ )
1515
+ }
1516
+ )
1517
+ ] }),
1518
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-end", children: [
1519
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block font-semibold tabular-nums", children: e.display ?? format.format(e.value) }),
1520
+ e.secondary && /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkS5RVSXDV_cjs.cn("block text-xs", tone.muted), children: e.secondary }),
1521
+ e.change != null && e.change !== 0 && /* @__PURE__ */ jsxRuntime.jsxs(
1522
+ "span",
1523
+ {
1524
+ className: chunkS5RVSXDV_cjs.cn(
1525
+ "inline-flex items-center text-xs font-semibold",
1526
+ e.change > 0 ? "text-success" : "text-destructive"
1527
+ ),
1528
+ children: [
1529
+ e.change > 0 ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowUp, { "aria-hidden": "true", className: "size-3" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowDown, { "aria-hidden": "true", className: "size-3" }),
1530
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: e.change > 0 ? "+" : "\u2212" }),
1531
+ Math.abs(e.change)
1532
+ ]
1533
+ }
1534
+ )
1535
+ ] })
1536
+ ]
1537
+ },
1538
+ e.label
1539
+ );
1540
+ }) }),
1541
+ slide.source && /* @__PURE__ */ jsxRuntime.jsx(SourceLink, { source: slide.source, className: "mt-4" })
1542
+ ] });
1543
+ }
1544
+ function RankedListRenderer({
1545
+ slide,
1546
+ index
1547
+ }) {
1548
+ return /* @__PURE__ */ jsxRuntime.jsx(SlideFrame, { slide, index, tone: "deep", width: "lg", children: /* @__PURE__ */ jsxRuntime.jsx(RankedListBody, { slide }) });
1549
+ }
1550
+ function BreakdownRenderer({
1551
+ slide,
1552
+ index
1553
+ }) {
1554
+ return /* @__PURE__ */ jsxRuntime.jsx(SlideFrame, { slide, index, tone: "deep", children: /* @__PURE__ */ jsxRuntime.jsx(BreakdownBody, { slide }) });
1555
+ }
1556
+ function BreakdownBody({ slide }) {
1557
+ const tone = useTone();
1558
+ const a = accent("accent", tone.isLight);
1559
+ const total = slide.breakdown?.reduce((s, b) => s + b.count, 0) || 1;
1560
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-10 lg:grid-cols-2", children: [
1561
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1562
+ /* @__PURE__ */ jsxRuntime.jsx(SlideHeader, { eyebrow: slide.eyebrow, title: slide.title }),
1563
+ slide.body && /* @__PURE__ */ jsxRuntime.jsx(
1564
+ "p",
1565
+ {
1566
+ ...reveal(2),
1567
+ className: chunkS5RVSXDV_cjs.cn(
1568
+ "mie-deck-reveal mt-4 text-lg leading-relaxed",
1569
+ tone.muted
1570
+ ),
1571
+ children: slide.body
1572
+ }
1573
+ ),
1574
+ slide.callout && /* @__PURE__ */ jsxRuntime.jsxs(
1575
+ "div",
1576
+ {
1577
+ ...reveal(3),
1578
+ className: chunkS5RVSXDV_cjs.cn(
1579
+ "mie-deck-reveal mt-8 inline-flex items-baseline gap-3 rounded-2xl border px-5 py-3",
1580
+ a.soft,
1581
+ a.border
1582
+ ),
1583
+ children: [
1584
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkS5RVSXDV_cjs.cn("text-4xl font-bold", a.text), children: /* @__PURE__ */ jsxRuntime.jsx(CountUp, { value: slide.callout.value }) }),
1585
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: slide.callout.label })
1586
+ ]
1587
+ }
1588
+ ),
1589
+ slide.talkingPoint && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: chunkS5RVSXDV_cjs.cn("mt-6 text-sm italic", tone.muted), children: [
1590
+ "\u201C",
1591
+ slide.talkingPoint,
1592
+ "\u201D"
1593
+ ] }),
1594
+ slide.pullQuote && /* @__PURE__ */ jsxRuntime.jsx(
1595
+ "blockquote",
1596
+ {
1597
+ className: chunkS5RVSXDV_cjs.cn(
1598
+ "mt-6 border-s-2 ps-4 text-lg font-semibold",
1599
+ a.border
1600
+ ),
1601
+ children: slide.pullQuote
1602
+ }
1603
+ )
1604
+ ] }),
1605
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { ...reveal(3), className: "mie-deck-reveal flex flex-col gap-8", children: [
1606
+ slide.series && /* @__PURE__ */ jsxRuntime.jsx(Graphic, { graphic: slide.series }),
1607
+ slide.breakdown && slide.breakdown.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-2", children: slide.breakdown.map((b) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-center gap-3 text-sm", children: [
1608
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-36 flex-none truncate", children: b.label }),
1609
+ /* @__PURE__ */ jsxRuntime.jsx(
1610
+ "span",
1611
+ {
1612
+ "aria-hidden": "true",
1613
+ className: chunkS5RVSXDV_cjs.cn(
1614
+ "h-2 flex-1 overflow-hidden rounded-full",
1615
+ tone.isLight ? "bg-neutral-200" : "bg-white/10"
1616
+ ),
1617
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1618
+ "span",
1619
+ {
1620
+ className: chunkS5RVSXDV_cjs.cn("block h-full rounded-full", a.fill),
1621
+ style: { width: `${b.count / total * 100}%` }
1622
+ }
1623
+ )
1624
+ }
1625
+ ),
1626
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-10 flex-none text-end font-semibold tabular-nums", children: b.count })
1627
+ ] }, b.label)) }),
1628
+ slide.entries && slide.entries.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
1629
+ "ul",
1630
+ {
1631
+ className: chunkS5RVSXDV_cjs.cn(
1632
+ "max-h-64 divide-y overflow-y-auto rounded-xl border",
1633
+ tone.hairline,
1634
+ tone.card
1635
+ ),
1636
+ children: slide.entries.map((e) => /* @__PURE__ */ jsxRuntime.jsxs(
1637
+ "li",
1638
+ {
1639
+ className: chunkS5RVSXDV_cjs.cn(
1640
+ "flex items-center justify-between gap-3 px-4 py-2 text-sm",
1641
+ tone.hairline
1642
+ ),
1643
+ children: [
1644
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "min-w-0", children: [
1645
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block truncate font-medium", children: e.title }),
1646
+ e.meta && /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkS5RVSXDV_cjs.cn("block truncate text-xs", tone.muted), children: e.meta })
1647
+ ] }),
1648
+ e.date && /* @__PURE__ */ jsxRuntime.jsx(
1649
+ "span",
1650
+ {
1651
+ className: chunkS5RVSXDV_cjs.cn("flex-none text-xs tabular-nums", tone.muted),
1652
+ children: e.date
1653
+ }
1654
+ )
1655
+ ]
1656
+ },
1657
+ `${e.title}-${e.date ?? ""}`
1658
+ ))
1659
+ }
1660
+ )
1661
+ ] })
1662
+ ] });
1663
+ }
1664
+ function TabsRenderer({ slide, index }) {
1665
+ const [active, setActive] = React9__namespace.useState(0);
1666
+ const baseId = React9__namespace.useId();
1667
+ const tabs = React9__namespace.useRef([]);
1668
+ const current = slide.tabs[active]?.slide;
1669
+ const onKey = (e) => {
1670
+ const n = slide.tabs.length;
1671
+ const next = e.key === "ArrowRight" ? (active + 1) % n : e.key === "ArrowLeft" ? (active - 1 + n) % n : e.key === "Home" ? 0 : e.key === "End" ? n - 1 : -1;
1672
+ if (next < 0) return;
1673
+ e.preventDefault();
1674
+ e.stopPropagation();
1675
+ setActive(next);
1676
+ tabs.current[next]?.focus();
1677
+ };
1678
+ return /* @__PURE__ */ jsxRuntime.jsxs(SlideFrame, { slide, index, tone: "deep", children: [
1679
+ /* @__PURE__ */ jsxRuntime.jsx(SlideHeader, { eyebrow: slide.eyebrow, title: slide.title }),
1680
+ /* @__PURE__ */ jsxRuntime.jsx(
1681
+ "div",
1682
+ {
1683
+ role: "tablist",
1684
+ "aria-label": slide.title,
1685
+ className: "mt-6 flex flex-wrap gap-2",
1686
+ children: slide.tabs.map((tab, i) => /* @__PURE__ */ jsxRuntime.jsx(
1687
+ TabButton,
1688
+ {
1689
+ ref: (el) => {
1690
+ tabs.current[i] = el;
1691
+ },
1692
+ id: `${baseId}-tab-${i}`,
1693
+ panelId: `${baseId}-panel`,
1694
+ selected: i === active,
1695
+ icon: tab.icon,
1696
+ onClick: () => setActive(i),
1697
+ onKeyDown: onKey,
1698
+ children: tab.label
1699
+ },
1700
+ tab.label
1701
+ ))
1702
+ }
1703
+ ),
1704
+ /* @__PURE__ */ jsxRuntime.jsxs(
1705
+ "div",
1706
+ {
1707
+ role: "tabpanel",
1708
+ id: `${baseId}-panel`,
1709
+ "aria-labelledby": `${baseId}-tab-${active}`,
1710
+ className: "mt-8",
1711
+ children: [
1712
+ current?.type === "metrics" && /* @__PURE__ */ jsxRuntime.jsx(MetricsBody, { slide: current }),
1713
+ current?.type === "chart" && /* @__PURE__ */ jsxRuntime.jsx(ChartBody, { slide: current }),
1714
+ current?.type === "feature-highlight" && /* @__PURE__ */ jsxRuntime.jsx(FeatureHighlightBody, { slide: current }),
1715
+ current?.type === "cards" && /* @__PURE__ */ jsxRuntime.jsx(CardsBody, { slide: current }),
1716
+ current?.type === "ranked-list" && /* @__PURE__ */ jsxRuntime.jsx(RankedListBody, { slide: current })
1717
+ ]
1718
+ }
1719
+ )
1720
+ ] });
1721
+ }
1722
+ var TabButton = React9__namespace.forwardRef(({ id, panelId, selected, icon, onClick, onKeyDown, children }, ref) => {
1723
+ const tone = useTone();
1724
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1725
+ "button",
1726
+ {
1727
+ ref,
1728
+ type: "button",
1729
+ role: "tab",
1730
+ id,
1731
+ "aria-selected": selected,
1732
+ "aria-controls": panelId,
1733
+ tabIndex: selected ? 0 : -1,
1734
+ onClick,
1735
+ onKeyDown,
1736
+ className: chunkS5RVSXDV_cjs.cn(
1737
+ "inline-flex items-center gap-2 rounded-full border px-4 py-1.5 text-sm font-semibold transition-colors",
1738
+ selected ? tone.isLight ? "border-neutral-900 bg-neutral-900 text-white" : "border-white bg-white text-neutral-900" : chunkS5RVSXDV_cjs.cn(
1739
+ tone.hairline,
1740
+ tone.muted,
1741
+ tone.isLight ? "hover:bg-neutral-100" : "hover:bg-white/10"
1742
+ )
1743
+ ),
1744
+ children: [
1745
+ icon && /* @__PURE__ */ jsxRuntime.jsx(DeckIcon, { name: icon, className: "size-4" }),
1746
+ children
1747
+ ]
1748
+ }
1749
+ );
1750
+ });
1751
+ TabButton.displayName = "TabButton";
1752
+ function CycleRenderer({
1753
+ slide,
1754
+ index
1755
+ }) {
1756
+ const tone = toneOf(slide, "deep");
1757
+ const n = slide.nodes.length;
1758
+ return /* @__PURE__ */ jsxRuntime.jsx(SlideFrame, { slide, index, tone: "deep", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid items-center gap-10 lg:grid-cols-2", children: [
1759
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1760
+ slide.eyebrow && /* @__PURE__ */ jsxRuntime.jsx(Eyebrow, { children: slide.eyebrow }),
1761
+ /* @__PURE__ */ jsxRuntime.jsx(SlideTitle, { children: slide.title }),
1762
+ slide.body && /* @__PURE__ */ jsxRuntime.jsx(
1763
+ "p",
1764
+ {
1765
+ ...reveal(2),
1766
+ className: chunkS5RVSXDV_cjs.cn(
1767
+ "mie-deck-reveal mt-6 text-lg leading-relaxed",
1768
+ tone.muted
1769
+ ),
1770
+ children: slide.body
1771
+ }
1772
+ ),
1773
+ slide.talkingPoint && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: chunkS5RVSXDV_cjs.cn("mt-6 italic", tone.muted), children: [
1774
+ "\u201C",
1775
+ slide.talkingPoint,
1776
+ "\u201D"
1777
+ ] })
1778
+ ] }),
1779
+ /* @__PURE__ */ jsxRuntime.jsx(CycleWheel, { nodes: slide.nodes, n })
1780
+ ] }) });
1781
+ }
1782
+ function CycleWheel({ nodes, n }) {
1783
+ const tone = useTone();
1784
+ const a = accent("accent", tone.isLight);
1785
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1786
+ "ol",
1787
+ {
1788
+ ...reveal(3),
1789
+ className: "mie-deck-reveal relative mx-auto aspect-square w-64 sm:w-80 md:w-96",
1790
+ children: [
1791
+ /* @__PURE__ */ jsxRuntime.jsxs(
1792
+ "svg",
1793
+ {
1794
+ "aria-hidden": "true",
1795
+ viewBox: "0 0 400 400",
1796
+ className: "mie-deck-spin absolute inset-0 size-full",
1797
+ children: [
1798
+ /* @__PURE__ */ jsxRuntime.jsx(
1799
+ "circle",
1800
+ {
1801
+ cx: "200",
1802
+ cy: "200",
1803
+ r: "150",
1804
+ fill: "none",
1805
+ strokeWidth: "2",
1806
+ className: tone.isLight ? "stroke-neutral-200" : "stroke-white/10"
1807
+ }
1808
+ ),
1809
+ /* @__PURE__ */ jsxRuntime.jsx(
1810
+ "circle",
1811
+ {
1812
+ cx: "200",
1813
+ cy: "200",
1814
+ r: "150",
1815
+ fill: "none",
1816
+ strokeWidth: "2",
1817
+ strokeDasharray: "50 200",
1818
+ strokeLinecap: "round",
1819
+ className: a.svgStroke
1820
+ }
1821
+ ),
1822
+ nodes.map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
1823
+ "polygon",
1824
+ {
1825
+ points: "200,47 207,60 193,60",
1826
+ transform: `rotate(${360 / n * i + 180 / n} 200 200)`,
1827
+ className: a.svgFill,
1828
+ opacity: 0.8
1829
+ },
1830
+ i
1831
+ ))
1832
+ ]
1833
+ }
1834
+ ),
1835
+ nodes.map((node, i) => {
1836
+ const angle = 2 * Math.PI * i / n - Math.PI / 2;
1837
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1838
+ "li",
1839
+ {
1840
+ className: chunkS5RVSXDV_cjs.cn(
1841
+ "absolute z-10 w-28 -translate-x-1/2 -translate-y-1/2 rounded-xl border px-3 py-2 text-center shadow-lg backdrop-blur sm:w-32",
1842
+ tone.hairline,
1843
+ tone.isLight ? "bg-white" : "bg-neutral-900/90"
1844
+ ),
1845
+ style: {
1846
+ left: `${50 + 37.5 * Math.cos(angle)}%`,
1847
+ top: `${50 + 37.5 * Math.sin(angle)}%`
1848
+ },
1849
+ children: [
1850
+ node.icon && /* @__PURE__ */ jsxRuntime.jsx(
1851
+ DeckIcon,
1852
+ {
1853
+ name: node.icon,
1854
+ className: chunkS5RVSXDV_cjs.cn("mx-auto mb-1 size-4", a.text)
1855
+ }
1856
+ ),
1857
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-bold sm:text-sm", children: node.label }),
1858
+ node.metric && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunkS5RVSXDV_cjs.cn("text-sm font-bold sm:text-lg", a.text), children: node.metric })
1859
+ ]
1860
+ },
1861
+ node.label
1862
+ );
1863
+ })
1864
+ ]
1865
+ }
1866
+ );
1867
+ }
1868
+ function RoadmapRenderer({
1869
+ slide,
1870
+ index
1871
+ }) {
1872
+ const { labels } = useDeck();
1873
+ const tone = toneOf(slide, "ink");
1874
+ const a = accent("accent", tone.isLight);
1875
+ const status = {
1876
+ now: labels.statusNow,
1877
+ next: labels.statusNext,
1878
+ later: labels.statusLater
1879
+ };
1880
+ const statusTag = {
1881
+ now: chunkS5RVSXDV_cjs.cn(a.soft, a.border, a.text),
1882
+ next: chunkS5RVSXDV_cjs.cn(
1883
+ accent("primary", tone.isLight).soft,
1884
+ accent("primary", tone.isLight).border,
1885
+ accent("primary", tone.isLight).text
1886
+ ),
1887
+ later: chunkS5RVSXDV_cjs.cn(tone.hairline, tone.muted)
1888
+ };
1889
+ return /* @__PURE__ */ jsxRuntime.jsxs(SlideFrame, { slide, index, tone: "ink", children: [
1890
+ /* @__PURE__ */ jsxRuntime.jsx(
1891
+ SlideHeader,
1892
+ {
1893
+ eyebrow: slide.eyebrow,
1894
+ title: slide.title,
1895
+ subtitle: slide.subtitle
1896
+ }
1897
+ ),
1898
+ /* @__PURE__ */ jsxRuntime.jsx(
1899
+ "ol",
1900
+ {
1901
+ className: chunkS5RVSXDV_cjs.cn(
1902
+ "relative mt-10 flex flex-col gap-6 border-s ps-8",
1903
+ a.border
1904
+ ),
1905
+ children: slide.items.map((item, i) => {
1906
+ const r = reveal(3 + i);
1907
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1908
+ "li",
1909
+ {
1910
+ className: chunkS5RVSXDV_cjs.cn(r.className, "relative"),
1911
+ style: r.style,
1912
+ children: [
1913
+ /* @__PURE__ */ jsxRuntime.jsx(
1914
+ "span",
1915
+ {
1916
+ "aria-hidden": "true",
1917
+ className: chunkS5RVSXDV_cjs.cn(
1918
+ "absolute -start-[2.35rem] top-1.5 flex size-4 items-center justify-center rounded-full border-2",
1919
+ a.border,
1920
+ tone.isLight ? "bg-white" : "bg-neutral-950"
1921
+ ),
1922
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkS5RVSXDV_cjs.cn("size-1.5 rounded-full", a.fill) })
1923
+ }
1924
+ ),
1925
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
1926
+ item.icon && /* @__PURE__ */ jsxRuntime.jsx(
1927
+ IconChip,
1928
+ {
1929
+ icon: item.icon,
1930
+ accent: item.status === "later" ? "primary" : "accent"
1931
+ }
1932
+ ),
1933
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-semibold sm:text-xl", children: item.title }),
1934
+ item.status && /* @__PURE__ */ jsxRuntime.jsx(
1935
+ "span",
1936
+ {
1937
+ className: chunkS5RVSXDV_cjs.cn(
1938
+ "rounded-full border px-2.5 py-0.5 text-[0.65rem] font-semibold tracking-wider uppercase",
1939
+ statusTag[item.status]
1940
+ ),
1941
+ children: status[item.status]
1942
+ }
1943
+ )
1944
+ ] }),
1945
+ item.children && item.children.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "mt-2 flex flex-wrap gap-x-6 gap-y-1.5", children: item.children.map((child) => /* @__PURE__ */ jsxRuntime.jsxs(
1946
+ "li",
1947
+ {
1948
+ className: chunkS5RVSXDV_cjs.cn(
1949
+ "flex items-center gap-2 text-sm",
1950
+ tone.muted
1951
+ ),
1952
+ children: [
1953
+ /* @__PURE__ */ jsxRuntime.jsx(
1954
+ "span",
1955
+ {
1956
+ "aria-hidden": "true",
1957
+ className: "size-1 rounded-full bg-current"
1958
+ }
1959
+ ),
1960
+ child
1961
+ ]
1962
+ },
1963
+ child
1964
+ )) })
1965
+ ]
1966
+ },
1967
+ item.title
1968
+ );
1969
+ })
1970
+ }
1971
+ )
1972
+ ] });
1973
+ }
1974
+ var BASE = 50;
1975
+ var PEAK = 6;
1976
+ var SIGMA = 15;
1977
+ var gaussY = (x) => BASE - (BASE - PEAK) * Math.exp(-((x - 50) ** 2) / (2 * SIGMA * SIGMA));
1978
+ function AdoptionCurveRenderer({
1979
+ slide,
1980
+ index
1981
+ }) {
1982
+ const tone = toneOf(slide, "ink");
1983
+ const clipId = React9__namespace.useId();
1984
+ const pts = [];
1985
+ for (let x = 0; x <= 100; x += 1.5) pts.push(`${x},${gaussY(x).toFixed(2)}`);
1986
+ const area = `M 0,${BASE} L ${pts.join(" L ")} L 100,${BASE} Z`;
1987
+ const values = slide.segments.map((s) => parseFloat(s.pct) || 0);
1988
+ const sum = values.reduce((x, y) => x + y, 0) || 1;
1989
+ const widths = values.map((v) => v / sum * 100);
1990
+ const bands = slide.segments.map((s, i) => ({
1991
+ ...s,
1992
+ x0: widths.slice(0, i).reduce((x, y) => x + y, 0),
1993
+ w: widths[i],
1994
+ spec: accent(
1995
+ s.accent ?? ACCENT_CYCLE[i % ACCENT_CYCLE.length],
1996
+ tone.isLight
1997
+ )
1998
+ }));
1999
+ const hi = accent("accent", tone.isLight);
2000
+ return /* @__PURE__ */ jsxRuntime.jsxs(SlideFrame, { slide, index, tone: "ink", width: "lg", children: [
2001
+ /* @__PURE__ */ jsxRuntime.jsx(
2002
+ SlideHeader,
2003
+ {
2004
+ eyebrow: slide.eyebrow,
2005
+ title: slide.title,
2006
+ subtitle: slide.subtitle
2007
+ }
2008
+ ),
2009
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { ...reveal(3), className: "mie-deck-reveal relative mt-8 pb-10", children: [
2010
+ slide.annotations?.map((note) => /* @__PURE__ */ jsxRuntime.jsx(
2011
+ "span",
2012
+ {
2013
+ className: chunkS5RVSXDV_cjs.cn(
2014
+ "absolute z-20 w-40 max-w-[42vw] -translate-x-1/2 rounded-lg border px-3 py-1.5 text-center text-xs leading-snug font-semibold",
2015
+ note.emphasis ? chunkS5RVSXDV_cjs.cn(hi.soft, hi.border, hi.text) : chunkS5RVSXDV_cjs.cn(tone.hairline, tone.card)
2016
+ ),
2017
+ style: {
2018
+ left: `${note.atPct}%`,
2019
+ [note.side === "bottom" ? "bottom" : "top"]: 0
2020
+ },
2021
+ children: note.text
2022
+ },
2023
+ note.text
2024
+ )),
2025
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-[clamp(180px,30vh,300px)] w-full", children: /* @__PURE__ */ jsxRuntime.jsxs(
2026
+ "svg",
2027
+ {
2028
+ viewBox: "0 0 100 56",
2029
+ preserveAspectRatio: "none",
2030
+ className: "size-full overflow-visible",
2031
+ role: "img",
2032
+ "aria-label": slide.segments.map((s) => `${s.label} ${s.pct}`).join(", "),
2033
+ children: [
2034
+ /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: clipId, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: area }) }) }),
2035
+ /* @__PURE__ */ jsxRuntime.jsx("g", { clipPath: `url(#${clipId})`, children: bands.map((b) => /* @__PURE__ */ jsxRuntime.jsx(
2036
+ "rect",
2037
+ {
2038
+ x: b.x0,
2039
+ y: 0,
2040
+ width: b.w,
2041
+ height: BASE,
2042
+ className: b.spec.svgFill,
2043
+ opacity: 0.8
2044
+ },
2045
+ b.label
2046
+ )) }),
2047
+ /* @__PURE__ */ jsxRuntime.jsx(
2048
+ "path",
2049
+ {
2050
+ d: `M ${pts.join(" L ")}`,
2051
+ fill: "none",
2052
+ strokeWidth: 1,
2053
+ vectorEffect: "non-scaling-stroke",
2054
+ className: tone.isLight ? "stroke-neutral-900" : "stroke-white"
2055
+ }
2056
+ ),
2057
+ /* @__PURE__ */ jsxRuntime.jsx(
2058
+ "line",
2059
+ {
2060
+ x1: 0,
2061
+ y1: BASE,
2062
+ x2: 100,
2063
+ y2: BASE,
2064
+ strokeWidth: 0.5,
2065
+ vectorEffect: "non-scaling-stroke",
2066
+ className: tone.isLight ? "stroke-neutral-400" : "stroke-white/25"
2067
+ }
2068
+ )
2069
+ ]
2070
+ }
2071
+ ) }),
2072
+ /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-hidden": "true", className: "mt-2 flex w-full", children: bands.map((b) => /* @__PURE__ */ jsxRuntime.jsxs(
2073
+ "div",
2074
+ {
2075
+ className: "min-w-0 px-1 text-center",
2076
+ style: { flexBasis: `${b.w}%` },
2077
+ children: [
2078
+ /* @__PURE__ */ jsxRuntime.jsx(
2079
+ "div",
2080
+ {
2081
+ className: chunkS5RVSXDV_cjs.cn("text-sm font-bold sm:text-base", b.spec.text),
2082
+ children: b.pct
2083
+ }
2084
+ ),
2085
+ /* @__PURE__ */ jsxRuntime.jsx(
2086
+ "div",
2087
+ {
2088
+ className: chunkS5RVSXDV_cjs.cn(
2089
+ "truncate text-[0.7rem] tracking-wide uppercase sm:text-xs",
2090
+ tone.muted
2091
+ ),
2092
+ children: b.label
2093
+ }
2094
+ )
2095
+ ]
2096
+ },
2097
+ b.label
2098
+ )) }),
2099
+ slide.marker && /* @__PURE__ */ jsxRuntime.jsxs(
2100
+ "div",
2101
+ {
2102
+ className: "absolute bottom-0 z-20 -translate-x-1/2 text-center",
2103
+ style: { left: `${slide.marker.atPct}%` },
2104
+ children: [
2105
+ /* @__PURE__ */ jsxRuntime.jsx(
2106
+ "div",
2107
+ {
2108
+ "aria-hidden": "true",
2109
+ className: chunkS5RVSXDV_cjs.cn("mx-auto h-4 w-px", hi.fill)
2110
+ }
2111
+ ),
2112
+ /* @__PURE__ */ jsxRuntime.jsx(
2113
+ "span",
2114
+ {
2115
+ className: chunkS5RVSXDV_cjs.cn(
2116
+ "mt-1 inline-block rounded-full border px-2.5 py-0.5 text-[0.65rem] font-semibold tracking-wide uppercase",
2117
+ hi.soft,
2118
+ hi.border,
2119
+ hi.text
2120
+ ),
2121
+ children: slide.marker.label
2122
+ }
2123
+ )
2124
+ ]
2125
+ }
2126
+ )
2127
+ ] }),
2128
+ slide.source && /* @__PURE__ */ jsxRuntime.jsx(SourceLink, { source: slide.source, className: "mt-4" })
2129
+ ] });
2130
+ }
2131
+ function DiagramRenderer({
2132
+ slide,
2133
+ index
2134
+ }) {
2135
+ const { components } = useDeck();
2136
+ const tone = toneOf(slide, "deep");
2137
+ const center = new Map(slide.nodes.map((n) => [n.id, n]));
2138
+ const left = slide.callouts?.filter((c) => c.side === "left") ?? [];
2139
+ const right = slide.callouts?.filter((c) => c.side === "right") ?? [];
2140
+ const cols = left.length && right.length ? "lg:grid-cols-[minmax(0,1fr)_minmax(0,2.4fr)_minmax(0,1fr)]" : right.length ? "lg:grid-cols-[minmax(0,2.7fr)_minmax(0,1.25fr)]" : left.length ? "lg:grid-cols-[minmax(0,1.25fr)_minmax(0,2.7fr)]" : "";
2141
+ const stageBg = tone.isLight ? "bg-white" : "bg-neutral-900";
2142
+ return /* @__PURE__ */ jsxRuntime.jsxs(SlideFrame, { slide, index, tone: "deep", children: [
2143
+ /* @__PURE__ */ jsxRuntime.jsx(
2144
+ SlideHeader,
2145
+ {
2146
+ eyebrow: slide.eyebrow,
2147
+ title: slide.title,
2148
+ subtitle: slide.subtitle
2149
+ }
2150
+ ),
2151
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkS5RVSXDV_cjs.cn("mt-8", cols && chunkS5RVSXDV_cjs.cn("grid items-center gap-6", cols)), children: [
2152
+ left.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(Callouts, { callouts: left, end: true }),
2153
+ /* @__PURE__ */ jsxRuntime.jsxs(
2154
+ "div",
2155
+ {
2156
+ ...reveal(3),
2157
+ className: "mie-deck-reveal relative mx-auto h-[clamp(260px,40vh,440px)] w-full max-w-3xl",
2158
+ children: [
2159
+ slide.boundaries?.map((b) => {
2160
+ const xs = b.nodes.map((id) => center.get(id)?.x ?? 50);
2161
+ const ys = b.nodes.map((id) => center.get(id)?.y ?? 50);
2162
+ const l = Math.min(...xs) - 13;
2163
+ const t = Math.min(...ys) - 17;
2164
+ const spec = accent(b.accent ?? "primary", tone.isLight);
2165
+ return /* @__PURE__ */ jsxRuntime.jsx(
2166
+ "div",
2167
+ {
2168
+ className: chunkS5RVSXDV_cjs.cn(
2169
+ "absolute rounded-2xl border border-dashed",
2170
+ tone.hairline
2171
+ ),
2172
+ style: {
2173
+ left: `${l}%`,
2174
+ top: `${t}%`,
2175
+ width: `${Math.max(...xs) + 13 - l}%`,
2176
+ height: `${Math.max(...ys) + 17 - t}%`
2177
+ },
2178
+ children: /* @__PURE__ */ jsxRuntime.jsx(
2179
+ "span",
2180
+ {
2181
+ className: chunkS5RVSXDV_cjs.cn(
2182
+ "absolute start-4 -top-3 rounded-full border px-2.5 py-0.5 text-[0.6rem] font-semibold tracking-wide uppercase",
2183
+ stageBg,
2184
+ spec.border,
2185
+ spec.text
2186
+ ),
2187
+ children: b.label
2188
+ }
2189
+ )
2190
+ },
2191
+ b.label
2192
+ );
2193
+ }),
2194
+ /* @__PURE__ */ jsxRuntime.jsx(
2195
+ "svg",
2196
+ {
2197
+ "aria-hidden": "true",
2198
+ viewBox: "0 0 100 100",
2199
+ preserveAspectRatio: "none",
2200
+ className: "absolute inset-0 size-full",
2201
+ children: slide.edges.map((e) => {
2202
+ const a = center.get(e.from);
2203
+ const b = center.get(e.to);
2204
+ if (!a || !b) return null;
2205
+ return /* @__PURE__ */ jsxRuntime.jsx(
2206
+ "line",
2207
+ {
2208
+ x1: a.x,
2209
+ y1: a.y,
2210
+ x2: b.x,
2211
+ y2: b.y,
2212
+ strokeWidth: 1.2,
2213
+ strokeDasharray: e.dashed ? "4 3" : void 0,
2214
+ vectorEffect: "non-scaling-stroke",
2215
+ className: e.accent ? accent(e.accent, tone.isLight).svgStroke : tone.isLight ? "stroke-neutral-400" : "stroke-white/30"
2216
+ },
2217
+ `${e.from}-${e.to}`
2218
+ );
2219
+ })
2220
+ }
2221
+ ),
2222
+ slide.edges.map((e, i) => {
2223
+ const a = center.get(e.from);
2224
+ const b = center.get(e.to);
2225
+ if (!a || !b || !e.flow) return null;
2226
+ return /* @__PURE__ */ jsxRuntime.jsx(
2227
+ "span",
2228
+ {
2229
+ "aria-hidden": "true",
2230
+ className: chunkS5RVSXDV_cjs.cn(
2231
+ "mie-deck-flow absolute size-2 -translate-x-1/2 -translate-y-1/2 rounded-full",
2232
+ accent(e.accent ?? "accent", tone.isLight).fill
2233
+ ),
2234
+ style: {
2235
+ "--mie-from-x": `${a.x}%`,
2236
+ "--mie-from-y": `${a.y}%`,
2237
+ "--mie-to-x": `${b.x}%`,
2238
+ "--mie-to-y": `${b.y}%`,
2239
+ animationDelay: `${i * 0.5}s`
2240
+ }
2241
+ },
2242
+ `flow-${e.from}-${e.to}`
2243
+ );
2244
+ }),
2245
+ slide.edges.map((e) => {
2246
+ const a = center.get(e.from);
2247
+ const b = center.get(e.to);
2248
+ if (!a || !b || !e.label) return null;
2249
+ const at = e.labelAt ?? 0.5;
2250
+ return /* @__PURE__ */ jsxRuntime.jsx(
2251
+ "span",
2252
+ {
2253
+ className: chunkS5RVSXDV_cjs.cn(
2254
+ "absolute z-10 -translate-x-1/2 -translate-y-1/2 rounded-md border px-1.5 py-0.5 text-[0.6rem] font-medium whitespace-nowrap",
2255
+ stageBg,
2256
+ tone.hairline,
2257
+ tone.muted
2258
+ ),
2259
+ style: {
2260
+ left: `${a.x + (b.x - a.x) * at}%`,
2261
+ top: `${a.y + (b.y - a.y) * at}%`
2262
+ },
2263
+ children: e.label
2264
+ },
2265
+ `label-${e.from}-${e.to}`
2266
+ );
2267
+ }),
2268
+ slide.nodes.map((node) => {
2269
+ const spec = accent(node.accent ?? "primary", tone.isLight);
2270
+ return /* @__PURE__ */ jsxRuntime.jsx(
2271
+ "div",
2272
+ {
2273
+ className: "absolute z-[5] -translate-x-1/2 -translate-y-1/2",
2274
+ style: {
2275
+ left: `${node.x}%`,
2276
+ top: `${node.y}%`,
2277
+ width: `${node.w ?? 20}%`
2278
+ },
2279
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
2280
+ "div",
2281
+ {
2282
+ className: chunkS5RVSXDV_cjs.cn(
2283
+ "flex flex-col items-center gap-1.5 rounded-xl border px-2 py-3 text-center shadow-lg",
2284
+ stageBg,
2285
+ spec.border
2286
+ ),
2287
+ children: [
2288
+ node.image ? /* @__PURE__ */ jsxRuntime.jsx(
2289
+ chunkXI74P5F2_cjs.TemplateImg,
2290
+ {
2291
+ ...node.image,
2292
+ components,
2293
+ className: "h-7 w-auto object-contain sm:h-9"
2294
+ }
2295
+ ) : node.icon && /* @__PURE__ */ jsxRuntime.jsx(
2296
+ DeckIcon,
2297
+ {
2298
+ name: node.icon,
2299
+ className: chunkS5RVSXDV_cjs.cn("size-5 sm:size-6", spec.text)
2300
+ }
2301
+ ),
2302
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[0.62rem] leading-tight font-semibold sm:text-xs", children: node.label })
2303
+ ]
2304
+ }
2305
+ )
2306
+ },
2307
+ node.id
2308
+ );
2309
+ })
2310
+ ]
2311
+ }
2312
+ ),
2313
+ right.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(Callouts, { callouts: right })
2314
+ ] })
2315
+ ] });
2316
+ }
2317
+ function Callouts({
2318
+ callouts,
2319
+ end
2320
+ }) {
2321
+ const tone = useTone();
2322
+ const a = accent("accent", tone.isLight);
2323
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkS5RVSXDV_cjs.cn("flex flex-col gap-4", end && "lg:text-end"), children: callouts.map((c, i) => /* @__PURE__ */ jsxRuntime.jsxs(Card, { i: 4 + i, className: "p-4", children: [
2324
+ c.lead && /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkS5RVSXDV_cjs.cn("text-sm font-bold", a.text), children: c.lead }),
2325
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunkS5RVSXDV_cjs.cn("mt-1 text-sm leading-snug", tone.muted), children: c.text })
2326
+ ] }, c.text)) });
2327
+ }
2328
+ function BadgeCard({ cert, i }) {
2329
+ const { components } = useDeck();
2330
+ const tone = useTone();
2331
+ const a = accent(cert.accent ?? "accent", tone.isLight);
2332
+ return /* @__PURE__ */ jsxRuntime.jsxs(Card, { i, className: "flex flex-col items-center p-3 text-center", children: [
2333
+ cert.image ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-2 flex h-11 items-center justify-center rounded-lg bg-white px-2.5", children: /* @__PURE__ */ jsxRuntime.jsx(
2334
+ chunkXI74P5F2_cjs.TemplateImg,
2335
+ {
2336
+ ...cert.image,
2337
+ components,
2338
+ className: "h-7 w-auto max-w-[72px] object-contain"
2339
+ }
2340
+ ) }) : /* @__PURE__ */ jsxRuntime.jsx(
2341
+ "div",
2342
+ {
2343
+ "aria-hidden": "true",
2344
+ className: chunkS5RVSXDV_cjs.cn(
2345
+ "mb-2 flex size-10 items-center justify-center rounded-lg border text-sm font-extrabold",
2346
+ a.soft,
2347
+ a.border,
2348
+ a.text
2349
+ ),
2350
+ children: cert.badge ?? cert.name.slice(0, 3).toUpperCase()
2351
+ }
2352
+ ),
2353
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[0.8rem] leading-tight font-bold", children: cert.name }),
2354
+ cert.issuer && /* @__PURE__ */ jsxRuntime.jsx(
2355
+ "div",
2356
+ {
2357
+ className: chunkS5RVSXDV_cjs.cn(
2358
+ "mt-0.5 text-[0.62rem] tracking-wide uppercase",
2359
+ tone.muted
2360
+ ),
2361
+ children: cert.issuer
2362
+ }
2363
+ ),
2364
+ cert.source && /* @__PURE__ */ jsxRuntime.jsx(SourceLink, { source: cert.source, className: "mt-1.5" })
2365
+ ] });
2366
+ }
2367
+ function CertificationGridRenderer({
2368
+ slide,
2369
+ index
2370
+ }) {
2371
+ const { components } = useDeck();
2372
+ const tone = toneOf(slide, "deep");
2373
+ const count = slide.certifications.length;
2374
+ const featured = slide.featured;
2375
+ const cols = featured ? "sm:grid-cols-3 lg:grid-cols-4" : count >= 5 ? "sm:grid-cols-3 lg:grid-cols-5" : count === 4 ? "sm:grid-cols-2 lg:grid-cols-4" : "sm:grid-cols-3";
2376
+ return /* @__PURE__ */ jsxRuntime.jsxs(SlideFrame, { slide, index, tone: "deep", children: [
2377
+ /* @__PURE__ */ jsxRuntime.jsx(
2378
+ SlideHeader,
2379
+ {
2380
+ eyebrow: slide.eyebrow,
2381
+ title: slide.title,
2382
+ subtitle: slide.subtitle
2383
+ }
2384
+ ),
2385
+ /* @__PURE__ */ jsxRuntime.jsxs(
2386
+ "div",
2387
+ {
2388
+ className: featured ? "mt-7 grid items-center gap-8 lg:grid-cols-[auto_minmax(0,1fr)] lg:gap-12" : "mt-6",
2389
+ children: [
2390
+ featured && /* @__PURE__ */ jsxRuntime.jsxs(
2391
+ "div",
2392
+ {
2393
+ ...reveal(3),
2394
+ className: "mie-deck-reveal flex flex-col items-center text-center",
2395
+ children: [
2396
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex size-40 items-center justify-center rounded-full bg-white p-2 shadow-2xl sm:size-48", children: featured.image ? /* @__PURE__ */ jsxRuntime.jsx(
2397
+ chunkXI74P5F2_cjs.TemplateImg,
2398
+ {
2399
+ ...featured.image,
2400
+ components,
2401
+ className: "size-full object-contain"
2402
+ }
2403
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-2xl font-extrabold text-neutral-900", children: featured.badge ?? featured.name }) }),
2404
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-4 font-semibold", children: featured.name }),
2405
+ featured.description && /* @__PURE__ */ jsxRuntime.jsx(
2406
+ "p",
2407
+ {
2408
+ className: chunkS5RVSXDV_cjs.cn(
2409
+ "mt-1 max-w-[15rem] text-sm leading-snug",
2410
+ tone.muted
2411
+ ),
2412
+ children: featured.description
2413
+ }
2414
+ ),
2415
+ featured.source && /* @__PURE__ */ jsxRuntime.jsx(SourceLink, { source: featured.source, className: "mt-2.5" })
2416
+ ]
2417
+ }
2418
+ ),
2419
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkS5RVSXDV_cjs.cn("grid grid-cols-2 gap-3", cols), children: slide.certifications.map((cert, i) => /* @__PURE__ */ jsxRuntime.jsx(BadgeCard, { cert, i: 4 + i }, cert.name)) })
2420
+ ]
2421
+ }
2422
+ ),
2423
+ slide.footnote && /* @__PURE__ */ jsxRuntime.jsx(SourceLink, { source: slide.footnote, className: "mt-6" })
2424
+ ] });
2425
+ }
2426
+ var VISIBLE = 3;
2427
+ function ShowcaseCategory({
2428
+ category,
2429
+ i
2430
+ }) {
2431
+ const { labels } = useDeck();
2432
+ const tone = useTone();
2433
+ const a = accent("primary", tone.isLight);
2434
+ const [open, setOpen] = React9__namespace.useState(false);
2435
+ const listId = React9__namespace.useId();
2436
+ const hidden = category.items.length - VISIBLE;
2437
+ return /* @__PURE__ */ jsxRuntime.jsxs(Card, { i, className: "p-4", children: [
2438
+ /* @__PURE__ */ jsxRuntime.jsxs(
2439
+ "h3",
2440
+ {
2441
+ className: chunkS5RVSXDV_cjs.cn(
2442
+ "mb-3 flex items-center gap-2 text-xs font-bold tracking-wider uppercase",
2443
+ a.text
2444
+ ),
2445
+ children: [
2446
+ category.icon && /* @__PURE__ */ jsxRuntime.jsx(DeckIcon, { name: category.icon, className: "size-4" }),
2447
+ category.title,
2448
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkS5RVSXDV_cjs.cn("ms-auto tabular-nums", tone.muted), children: category.items.length })
2449
+ ]
2450
+ }
2451
+ ),
2452
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { id: listId, className: "space-y-1", children: (open ? category.items : category.items.slice(0, VISIBLE)).map(
2453
+ (item) => /* @__PURE__ */ jsxRuntime.jsxs(
2454
+ "li",
2455
+ {
2456
+ className: chunkS5RVSXDV_cjs.cn("flex gap-2 text-xs leading-relaxed", tone.muted),
2457
+ children: [
2458
+ /* @__PURE__ */ jsxRuntime.jsx(
2459
+ lucideReact.ChevronRight,
2460
+ {
2461
+ "aria-hidden": "true",
2462
+ className: "mt-0.5 size-3 flex-none rtl:-scale-x-100"
2463
+ }
2464
+ ),
2465
+ item
2466
+ ]
2467
+ },
2468
+ item
2469
+ )
2470
+ ) }),
2471
+ hidden > 0 && /* @__PURE__ */ jsxRuntime.jsx(
2472
+ "button",
2473
+ {
2474
+ type: "button",
2475
+ "aria-expanded": open,
2476
+ "aria-controls": listId,
2477
+ onClick: () => setOpen((o) => !o),
2478
+ className: chunkS5RVSXDV_cjs.cn(
2479
+ "mt-2 text-xs font-medium underline-offset-2 hover:underline",
2480
+ a.text
2481
+ ),
2482
+ children: open ? labels.less : labels.more(hidden)
2483
+ }
2484
+ )
2485
+ ] });
2486
+ }
2487
+ function ShowcaseRenderer({
2488
+ slide,
2489
+ index
2490
+ }) {
2491
+ const { components, labels } = useDeck();
2492
+ const tone = toneOf(slide, "deep");
2493
+ const a = accent("accent", tone.isLight);
2494
+ const video = slide.video;
2495
+ const videoHref = video ? chunkXI74P5F2_cjs.safeHref(video.href) : void 0;
2496
+ return /* @__PURE__ */ jsxRuntime.jsxs(SlideFrame, { slide, index, tone: "deep", children: [
2497
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-6 flex flex-col items-start gap-4 sm:flex-row sm:items-end sm:justify-between", children: [
2498
+ /* @__PURE__ */ jsxRuntime.jsx(
2499
+ SlideHeader,
2500
+ {
2501
+ eyebrow: slide.eyebrow,
2502
+ title: slide.title,
2503
+ subtitle: slide.subtitle
2504
+ }
2505
+ ),
2506
+ slide.total && /* @__PURE__ */ jsxRuntime.jsxs(
2507
+ "div",
2508
+ {
2509
+ ...reveal(2),
2510
+ className: chunkS5RVSXDV_cjs.cn(
2511
+ "mie-deck-reveal flex flex-none items-baseline gap-2 rounded-full border px-5 py-2",
2512
+ a.soft,
2513
+ a.border
2514
+ ),
2515
+ children: [
2516
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkS5RVSXDV_cjs.cn("text-3xl font-bold", a.text), children: /* @__PURE__ */ jsxRuntime.jsx(CountUp, { value: slide.total.value }) }),
2517
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkS5RVSXDV_cjs.cn("text-sm", tone.muted), children: slide.total.label })
2518
+ ]
2519
+ }
2520
+ )
2521
+ ] }),
2522
+ /* @__PURE__ */ jsxRuntime.jsxs(
2523
+ "div",
2524
+ {
2525
+ className: chunkS5RVSXDV_cjs.cn("grid gap-6", videoHref && "lg:grid-cols-[1fr_300px]"),
2526
+ children: [
2527
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3", children: slide.categories.map((cat, i) => /* @__PURE__ */ jsxRuntime.jsx(ShowcaseCategory, { category: cat, i: 3 + i }, cat.title)) }),
2528
+ video && videoHref && /* @__PURE__ */ jsxRuntime.jsxs(
2529
+ "a",
2530
+ {
2531
+ href: videoHref,
2532
+ target: "_blank",
2533
+ rel: "noopener noreferrer",
2534
+ ...reveal(5),
2535
+ className: chunkS5RVSXDV_cjs.cn(
2536
+ "mie-deck-reveal group flex flex-col overflow-hidden rounded-xl border lg:self-start",
2537
+ tone.hairline,
2538
+ tone.card
2539
+ ),
2540
+ children: [
2541
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex aspect-video items-center justify-center overflow-hidden bg-neutral-900", children: [
2542
+ video.thumbnail && /* @__PURE__ */ jsxRuntime.jsx(
2543
+ chunkXI74P5F2_cjs.TemplateImg,
2544
+ {
2545
+ ...video.thumbnail,
2546
+ components,
2547
+ className: "absolute inset-0 size-full object-cover transition-transform duration-300 group-hover:scale-105"
2548
+ }
2549
+ ),
2550
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/30" }),
2551
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "bg-primary-600 relative flex size-14 items-center justify-center rounded-full border-2 border-white/30 shadow-xl transition-transform group-hover:scale-110", children: /* @__PURE__ */ jsxRuntime.jsx(
2552
+ lucideReact.Play,
2553
+ {
2554
+ "aria-hidden": "true",
2555
+ className: "ms-1 size-6 fill-white text-white"
2556
+ }
2557
+ ) }),
2558
+ video.duration && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute end-2 bottom-2 rounded bg-black/60 px-2 py-0.5 font-mono text-xs text-white tabular-nums", children: video.duration })
2559
+ ] }),
2560
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-4", children: [
2561
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-1 text-sm font-semibold", children: video.title }),
2562
+ video.speaker && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunkS5RVSXDV_cjs.cn("mb-2 text-xs", tone.muted), children: video.speaker }),
2563
+ /* @__PURE__ */ jsxRuntime.jsxs(
2564
+ "span",
2565
+ {
2566
+ className: chunkS5RVSXDV_cjs.cn(
2567
+ "inline-flex items-center gap-1 text-xs font-medium",
2568
+ a.text
2569
+ ),
2570
+ children: [
2571
+ video.cta ?? labels.watchVideo,
2572
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ExternalLink, { "aria-hidden": "true", className: "size-3" })
2573
+ ]
2574
+ }
2575
+ )
2576
+ ] })
2577
+ ]
2578
+ }
2579
+ )
2580
+ ]
2581
+ }
2582
+ )
2583
+ ] });
2584
+ }
2585
+ function Highlights({
2586
+ items
2587
+ }) {
2588
+ const r = reveal(3);
2589
+ return /* @__PURE__ */ jsxRuntime.jsx(
2590
+ "div",
2591
+ {
2592
+ className: chunkS5RVSXDV_cjs.cn(
2593
+ r.className,
2594
+ "mt-10 flex flex-wrap items-center justify-center gap-x-10 gap-y-6"
2595
+ ),
2596
+ style: r.style,
2597
+ children: items.map((h) => /* @__PURE__ */ jsxRuntime.jsx(HighlightFigure, { value: h.value, label: h.label }, h.label))
2598
+ }
2599
+ );
2600
+ }
2601
+ function CoverRenderer({
2602
+ slide,
2603
+ index
2604
+ }) {
2605
+ const { components } = useDeck();
2606
+ const tone = toneOf(slide, "brand");
2607
+ return /* @__PURE__ */ jsxRuntime.jsx(SlideFrame, { slide, index, tone: "brand", width: "md", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center text-center", children: [
2608
+ slide.image && /* @__PURE__ */ jsxRuntime.jsx(
2609
+ chunkXI74P5F2_cjs.TemplateImg,
2610
+ {
2611
+ ...slide.image,
2612
+ priority: index === 0,
2613
+ components,
2614
+ className: "mb-8 h-32 w-auto object-contain sm:h-40"
2615
+ }
2616
+ ),
2617
+ slide.eyebrow && /* @__PURE__ */ jsxRuntime.jsx(Eyebrow, { children: slide.eyebrow }),
2618
+ /* @__PURE__ */ jsxRuntime.jsx(SlideTitle, { size: "xl", children: slide.title }),
2619
+ slide.subtitle && /* @__PURE__ */ jsxRuntime.jsx(Subtitle, { className: "mx-auto sm:text-xl", children: slide.subtitle }),
2620
+ slide.highlights && slide.highlights.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(Highlights, { items: slide.highlights }),
2621
+ (slide.dateline || slide.preparedBy) && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunkS5RVSXDV_cjs.cn("mt-10 text-sm", tone.muted), children: [slide.preparedBy, slide.dateline].filter(Boolean).join(" \xB7 ") })
2622
+ ] }) });
2623
+ }
2624
+ function SectionDividerRenderer({
2625
+ slide,
2626
+ index
2627
+ }) {
2628
+ const { components } = useDeck();
2629
+ const tone = toneOf(slide, "glow");
2630
+ const a = accent("accent", tone.isLight);
2631
+ const hasImage = !!slide.image;
2632
+ return /* @__PURE__ */ jsxRuntime.jsx(SlideFrame, { slide, index, tone: "glow", children: /* @__PURE__ */ jsxRuntime.jsxs(
2633
+ "div",
2634
+ {
2635
+ className: hasImage ? "grid items-center gap-10 md:grid-cols-2 lg:gap-16" : "flex flex-col items-center text-center",
2636
+ children: [
2637
+ slide.image && /* @__PURE__ */ jsxRuntime.jsx("div", { ...reveal(0), className: "mie-deck-reveal order-2 md:order-1", children: /* @__PURE__ */ jsxRuntime.jsx(
2638
+ chunkXI74P5F2_cjs.TemplateImg,
2639
+ {
2640
+ ...slide.image,
2641
+ components,
2642
+ className: "mx-auto aspect-[3/4] w-full max-w-sm rounded-2xl object-cover"
2643
+ }
2644
+ ) }),
2645
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: hasImage ? "order-1 md:order-2" : "max-w-4xl", children: [
2646
+ slide.eyebrow && /* @__PURE__ */ jsxRuntime.jsx(Eyebrow, { children: slide.eyebrow }),
2647
+ slide.statement && /* @__PURE__ */ jsxRuntime.jsx(
2648
+ "p",
2649
+ {
2650
+ ...reveal(1),
2651
+ className: "mie-deck-reveal text-6xl font-extrabold tracking-tight text-balance sm:text-7xl lg:text-8xl",
2652
+ children: slide.statement
2653
+ }
2654
+ ),
2655
+ /* @__PURE__ */ jsxRuntime.jsx(
2656
+ SlideTitle,
2657
+ {
2658
+ size: slide.statement ? "md" : "lg",
2659
+ className: chunkS5RVSXDV_cjs.cn(slide.statement && "mt-3 font-semibold opacity-80"),
2660
+ children: slide.title
2661
+ }
2662
+ ),
2663
+ slide.description && /* @__PURE__ */ jsxRuntime.jsx(Subtitle, { className: chunkS5RVSXDV_cjs.cn(!hasImage && "mx-auto"), children: slide.description }),
2664
+ /* @__PURE__ */ jsxRuntime.jsx(
2665
+ "div",
2666
+ {
2667
+ "aria-hidden": "true",
2668
+ className: chunkS5RVSXDV_cjs.cn(
2669
+ "mt-8 h-1 w-24 rounded-full",
2670
+ a.fill,
2671
+ !hasImage && "mx-auto"
2672
+ )
2673
+ }
2674
+ )
2675
+ ] })
2676
+ ]
2677
+ }
2678
+ ) });
2679
+ }
2680
+ function TableOfContentsRenderer({
2681
+ slide,
2682
+ index
2683
+ }) {
2684
+ const { slides, activeSlide, goTo, labels } = useDeck();
2685
+ const tone = toneOf(slide, "brand");
2686
+ const a = accent("accent", tone.isLight);
2687
+ const sections = slide.sections ?? Object.entries(
2688
+ slides.reduce((acc, s, i) => {
2689
+ if (i === index || !("title" in s) || !s.title) return acc;
2690
+ (acc[s.section ?? ""] ??= []).push({
2691
+ number: i + 1,
2692
+ title: s.navLabel ?? s.title
2693
+ });
2694
+ return acc;
2695
+ }, {})
2696
+ ).map(([heading, items]) => ({ heading: heading || void 0, items }));
2697
+ return /* @__PURE__ */ jsxRuntime.jsxs(SlideFrame, { slide, index, tone: "brand", children: [
2698
+ /* @__PURE__ */ jsxRuntime.jsx(
2699
+ SlideHeader,
2700
+ {
2701
+ eyebrow: slide.eyebrow,
2702
+ title: slide.title,
2703
+ subtitle: slide.description
2704
+ }
2705
+ ),
2706
+ /* @__PURE__ */ jsxRuntime.jsx("nav", { "aria-label": labels.outline, className: "mt-6 md:columns-2 md:gap-12", children: sections.map((section, s) => /* @__PURE__ */ jsxRuntime.jsxs(
2707
+ "div",
2708
+ {
2709
+ ...reveal(3 + s),
2710
+ className: "mie-deck-reveal mb-5 break-inside-avoid",
2711
+ children: [
2712
+ section.heading && /* @__PURE__ */ jsxRuntime.jsx(
2713
+ "h3",
2714
+ {
2715
+ className: chunkS5RVSXDV_cjs.cn(
2716
+ "mb-1.5 text-xs font-semibold tracking-[0.2em] uppercase",
2717
+ a.text
2718
+ ),
2719
+ children: section.heading
2720
+ }
2721
+ ),
2722
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex flex-col gap-0.5", children: section.items.map((entry) => {
2723
+ const target = entry.number - 1;
2724
+ const current = target === activeSlide;
2725
+ return /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(
2726
+ "button",
2727
+ {
2728
+ type: "button",
2729
+ onClick: () => goTo(target),
2730
+ "aria-current": current ? "true" : void 0,
2731
+ className: chunkS5RVSXDV_cjs.cn(
2732
+ "flex w-full items-baseline gap-3 rounded-lg px-3 py-1 text-start transition-colors",
2733
+ current ? a.soft : tone.isLight ? "hover:bg-neutral-100" : "hover:bg-white/5"
2734
+ ),
2735
+ children: [
2736
+ /* @__PURE__ */ jsxRuntime.jsx(
2737
+ "span",
2738
+ {
2739
+ className: chunkS5RVSXDV_cjs.cn(
2740
+ "text-sm font-semibold tabular-nums",
2741
+ a.text
2742
+ ),
2743
+ children: String(entry.number).padStart(2, "0")
2744
+ }
2745
+ ),
2746
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
2747
+ entry.title,
2748
+ entry.subtitle && /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkS5RVSXDV_cjs.cn("block text-xs", tone.muted), children: entry.subtitle })
2749
+ ] })
2750
+ ]
2751
+ }
2752
+ ) }, entry.number);
2753
+ }) })
2754
+ ]
2755
+ },
2756
+ section.heading ?? s
2757
+ )) })
2758
+ ] });
2759
+ }
2760
+ function BulletListRenderer({
2761
+ slide,
2762
+ index
2763
+ }) {
2764
+ const tone = toneOf(slide, "brand");
2765
+ const r = reveal(3);
2766
+ return /* @__PURE__ */ jsxRuntime.jsxs(SlideFrame, { slide, index, tone: "brand", width: "lg", children: [
2767
+ /* @__PURE__ */ jsxRuntime.jsx(
2768
+ SlideHeader,
2769
+ {
2770
+ eyebrow: slide.eyebrow,
2771
+ title: slide.title,
2772
+ subtitle: slide.subtitle
2773
+ }
2774
+ ),
2775
+ /* @__PURE__ */ jsxRuntime.jsx(
2776
+ "ul",
2777
+ {
2778
+ className: chunkS5RVSXDV_cjs.cn(r.className, "mt-10 flex flex-col gap-4"),
2779
+ style: r.style,
2780
+ children: slide.items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsx(Bullet, { item }, i))
2781
+ }
2782
+ ),
2783
+ slide.note && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunkS5RVSXDV_cjs.cn("mt-8 text-sm italic", tone.muted), children: slide.note })
2784
+ ] });
2785
+ }
2786
+ function QuoteRenderer({
2787
+ slide,
2788
+ index
2789
+ }) {
2790
+ const tone = toneOf(slide, "brand");
2791
+ const a = accent("accent", tone.isLight);
2792
+ return /* @__PURE__ */ jsxRuntime.jsx(
2793
+ SlideFrame,
2794
+ {
2795
+ slide: {
2796
+ ...slide,
2797
+ navLabel: slide.navLabel ?? slide.title ?? slide.attribution
2798
+ },
2799
+ index,
2800
+ tone: "brand",
2801
+ width: "md",
2802
+ children: /* @__PURE__ */ jsxRuntime.jsxs("figure", { className: "flex flex-col items-center text-center", children: [
2803
+ slide.eyebrow && /* @__PURE__ */ jsxRuntime.jsx(Eyebrow, { children: slide.eyebrow }),
2804
+ slide.title && /* @__PURE__ */ jsxRuntime.jsx(SlideTitle, { size: "md", className: "mb-6", children: slide.title }),
2805
+ /* @__PURE__ */ jsxRuntime.jsx(
2806
+ "span",
2807
+ {
2808
+ "aria-hidden": "true",
2809
+ className: chunkS5RVSXDV_cjs.cn("text-7xl leading-none sm:text-8xl", a.text),
2810
+ children: "\u201C"
2811
+ }
2812
+ ),
2813
+ /* @__PURE__ */ jsxRuntime.jsx(
2814
+ "blockquote",
2815
+ {
2816
+ ...reveal(2),
2817
+ className: "mie-deck-reveal -mt-4 text-2xl leading-snug font-semibold text-balance sm:text-3xl lg:text-4xl",
2818
+ children: slide.quote
2819
+ }
2820
+ ),
2821
+ (slide.attribution || slide.role) && /* @__PURE__ */ jsxRuntime.jsxs("figcaption", { ...reveal(3), className: "mie-deck-reveal mt-8", children: [
2822
+ slide.attribution && /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkS5RVSXDV_cjs.cn("text-lg font-semibold", a.text), children: slide.attribution }),
2823
+ slide.role && /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkS5RVSXDV_cjs.cn("block text-sm", tone.muted), children: slide.role })
2824
+ ] }),
2825
+ slide.source && /* @__PURE__ */ jsxRuntime.jsx(SourceLink, { source: slide.source, className: "mt-5" })
2826
+ ] })
2827
+ }
2828
+ );
2829
+ }
2830
+ function ImageRenderer({
2831
+ slide,
2832
+ index
2833
+ }) {
2834
+ const { components } = useDeck();
2835
+ const tone = toneOf(slide, "ink");
2836
+ return /* @__PURE__ */ jsxRuntime.jsxs(SlideFrame, { slide, index, tone: "ink", children: [
2837
+ /* @__PURE__ */ jsxRuntime.jsx(SlideTitle, { className: "mb-8 text-center", children: slide.title }),
2838
+ /* @__PURE__ */ jsxRuntime.jsxs("figure", { ...reveal(2), className: "mie-deck-reveal", children: [
2839
+ /* @__PURE__ */ jsxRuntime.jsx(
2840
+ chunkXI74P5F2_cjs.TemplateImg,
2841
+ {
2842
+ ...slide.image,
2843
+ components,
2844
+ className: "mx-auto max-h-[65dvh] w-auto rounded-2xl object-contain shadow-2xl"
2845
+ }
2846
+ ),
2847
+ slide.caption && /* @__PURE__ */ jsxRuntime.jsx("figcaption", { className: chunkS5RVSXDV_cjs.cn("mt-4 text-center text-sm", tone.muted), children: slide.caption })
2848
+ ] })
2849
+ ] });
2850
+ }
2851
+ function DefinitionListRenderer({
2852
+ slide,
2853
+ index
2854
+ }) {
2855
+ const tone = toneOf(slide, "brand");
2856
+ const a = accent("accent", tone.isLight);
2857
+ return /* @__PURE__ */ jsxRuntime.jsxs(SlideFrame, { slide, index, tone: "brand", children: [
2858
+ /* @__PURE__ */ jsxRuntime.jsx(
2859
+ SlideHeader,
2860
+ {
2861
+ eyebrow: slide.eyebrow,
2862
+ title: slide.title,
2863
+ subtitle: slide.subtitle
2864
+ }
2865
+ ),
2866
+ /* @__PURE__ */ jsxRuntime.jsx("dl", { className: "mt-6 flex flex-col gap-2", children: slide.terms.map((term, i) => {
2867
+ const initial = term.term.charAt(0);
2868
+ const r = reveal(3 + i);
2869
+ return (
2870
+ // A <dl> group div may contain only <dt>/<dd> (axe dlitem).
2871
+ /* @__PURE__ */ jsxRuntime.jsxs(
2872
+ "div",
2873
+ {
2874
+ className: chunkS5RVSXDV_cjs.cn(
2875
+ r.className,
2876
+ "rounded-xl border p-3",
2877
+ tone.card,
2878
+ tone.hairline
2879
+ ),
2880
+ style: r.style,
2881
+ children: [
2882
+ /* @__PURE__ */ jsxRuntime.jsxs("dt", { className: "flex items-center gap-4 text-base font-bold sm:text-lg", children: [
2883
+ /* @__PURE__ */ jsxRuntime.jsx(
2884
+ "span",
2885
+ {
2886
+ "aria-hidden": "true",
2887
+ className: chunkS5RVSXDV_cjs.cn(
2888
+ "flex size-10 flex-none items-center justify-center rounded-lg border text-xl font-extrabold",
2889
+ a.soft,
2890
+ a.border,
2891
+ a.text
2892
+ ),
2893
+ children: initial
2894
+ }
2895
+ ),
2896
+ term.term
2897
+ ] }),
2898
+ /* @__PURE__ */ jsxRuntime.jsxs(
2899
+ "dd",
2900
+ {
2901
+ className: chunkS5RVSXDV_cjs.cn(
2902
+ "ms-14 mt-0.5 text-sm leading-relaxed",
2903
+ tone.muted
2904
+ ),
2905
+ children: [
2906
+ term.lead && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: chunkS5RVSXDV_cjs.cn("font-semibold", tone.text), children: [
2907
+ term.lead,
2908
+ " "
2909
+ ] }),
2910
+ term.definition
2911
+ ]
2912
+ }
2913
+ )
2914
+ ]
2915
+ },
2916
+ term.term
2917
+ )
2918
+ );
2919
+ }) }),
2920
+ slide.source && /* @__PURE__ */ jsxRuntime.jsx(SourceLink, { source: slide.source, className: "mt-4" })
2921
+ ] });
2922
+ }
2923
+ function CopyLink({ url }) {
2924
+ const { labels } = useDeck();
2925
+ const tone = useTone();
2926
+ const [copied, setCopied] = React9__namespace.useState(false);
2927
+ React9__namespace.useEffect(() => {
2928
+ if (!copied) return;
2929
+ const t = setTimeout(() => setCopied(false), 2e3);
2930
+ return () => clearTimeout(t);
2931
+ }, [copied]);
2932
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2933
+ "div",
2934
+ {
2935
+ className: chunkS5RVSXDV_cjs.cn(
2936
+ "mt-8 flex w-full max-w-xl items-center gap-2 rounded-xl border p-2",
2937
+ tone.card,
2938
+ tone.hairline
2939
+ ),
2940
+ children: [
2941
+ /* @__PURE__ */ jsxRuntime.jsx("code", { className: "min-w-0 flex-1 truncate px-2 text-start text-sm", children: url }),
2942
+ /* @__PURE__ */ jsxRuntime.jsxs(
2943
+ "button",
2944
+ {
2945
+ type: "button",
2946
+ onClick: () => navigator.clipboard?.writeText(url).then(
2947
+ () => setCopied(true),
2948
+ () => {
2949
+ }
2950
+ ),
2951
+ className: chunkS5RVSXDV_cjs.cn(
2952
+ "inline-flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-sm font-semibold",
2953
+ tone.isLight ? "bg-neutral-900 text-white" : "bg-white text-neutral-900"
2954
+ ),
2955
+ children: [
2956
+ copied ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { "aria-hidden": "true", className: "size-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Copy, { "aria-hidden": "true", className: "size-4" }),
2957
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-live": "polite", children: copied ? labels.copied : labels.copy })
2958
+ ]
2959
+ }
2960
+ )
2961
+ ]
2962
+ }
2963
+ );
2964
+ }
2965
+ function CtaButton({ link, primary }) {
2966
+ const { components } = useDeck();
2967
+ const tone = useTone();
2968
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2969
+ chunkXI74P5F2_cjs.TemplateAnchor,
2970
+ {
2971
+ href: link.href,
2972
+ trackingId: link.trackingId,
2973
+ components,
2974
+ className: chunkS5RVSXDV_cjs.cn(
2975
+ "inline-flex items-center gap-2 rounded-full px-6 py-3 text-sm font-semibold transition-colors",
2976
+ primary ? "bg-accent text-neutral-950 hover:opacity-90" : chunkS5RVSXDV_cjs.cn(
2977
+ "border",
2978
+ tone.hairline,
2979
+ tone.isLight ? "hover:bg-neutral-100" : "hover:bg-white/10"
2980
+ )
2981
+ ),
2982
+ children: [
2983
+ link.label,
2984
+ primary && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowRight, { "aria-hidden": "true", className: "size-4 rtl:-scale-x-100" })
2985
+ ]
2986
+ }
2987
+ );
2988
+ }
2989
+ function ConclusionRenderer({
2990
+ slide,
2991
+ index
2992
+ }) {
2993
+ const tone = toneOf(slide, "brand");
2994
+ return /* @__PURE__ */ jsxRuntime.jsx(SlideFrame, { slide, index, tone: "brand", width: "sm", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center text-center", children: [
2995
+ slide.eyebrow && /* @__PURE__ */ jsxRuntime.jsx(Eyebrow, { children: slide.eyebrow }),
2996
+ /* @__PURE__ */ jsxRuntime.jsx(SlideTitle, { children: slide.title }),
2997
+ slide.body && /* @__PURE__ */ jsxRuntime.jsx(Subtitle, { className: "mx-auto", children: slide.body }),
2998
+ slide.highlights && slide.highlights.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(Highlights, { items: slide.highlights }),
2999
+ slide.takeaways && slide.takeaways.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
3000
+ "ul",
3001
+ {
3002
+ ...reveal(4),
3003
+ className: "mie-deck-reveal mt-10 flex flex-col gap-3 text-start",
3004
+ children: slide.takeaways.map((t) => /* @__PURE__ */ jsxRuntime.jsx(Bullet, { item: t }, t))
3005
+ }
3006
+ ),
3007
+ slide.share && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3008
+ slide.share.instructions && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunkS5RVSXDV_cjs.cn("mt-10 text-sm", tone.muted), children: slide.share.instructions }),
3009
+ /* @__PURE__ */ jsxRuntime.jsx(CopyLink, { url: slide.share.url })
3010
+ ] }),
3011
+ (slide.cta || slide.secondaryCta) && /* @__PURE__ */ jsxRuntime.jsxs(
3012
+ "div",
3013
+ {
3014
+ ...reveal(5),
3015
+ className: "mie-deck-reveal mt-12 flex flex-wrap items-center justify-center gap-4",
3016
+ children: [
3017
+ slide.cta && /* @__PURE__ */ jsxRuntime.jsx(CtaButton, { link: slide.cta, primary: true }),
3018
+ slide.secondaryCta && /* @__PURE__ */ jsxRuntime.jsx(CtaButton, { link: slide.secondaryCta })
3019
+ ]
3020
+ }
3021
+ ),
3022
+ (slide.preparedBy || slide.dateline) && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunkS5RVSXDV_cjs.cn("mt-10 text-sm", tone.muted), children: [slide.preparedBy, slide.dateline].filter(Boolean).join(" \xB7 ") }),
3023
+ slide.confidentiality && /* @__PURE__ */ jsxRuntime.jsx(
3024
+ "p",
3025
+ {
3026
+ className: chunkS5RVSXDV_cjs.cn("mt-3 text-xs tracking-wider uppercase", tone.muted),
3027
+ children: slide.confidentiality
3028
+ }
3029
+ )
3030
+ ] }) });
3031
+ }
3032
+
3033
+ // src/components/Deck/registry.tsx
3034
+ var slideRenderers = {
3035
+ cover: CoverRenderer,
3036
+ "section-divider": SectionDividerRenderer,
3037
+ "table-of-contents": TableOfContentsRenderer,
3038
+ "bullet-list": BulletListRenderer,
3039
+ quote: QuoteRenderer,
3040
+ image: ImageRenderer,
3041
+ "definition-list": DefinitionListRenderer,
3042
+ conclusion: ConclusionRenderer,
3043
+ metrics: MetricsRenderer,
3044
+ chart: ChartRenderer,
3045
+ "feature-highlight": FeatureHighlightRenderer,
3046
+ "comparison-table": ComparisonTableRenderer,
3047
+ "impact-table": ImpactTableRenderer,
3048
+ cards: CardsRenderer,
3049
+ "ranked-list": RankedListRenderer,
3050
+ breakdown: BreakdownRenderer,
3051
+ cycle: CycleRenderer,
3052
+ roadmap: RoadmapRenderer,
3053
+ "adoption-curve": AdoptionCurveRenderer,
3054
+ diagram: DiagramRenderer,
3055
+ "certification-grid": CertificationGridRenderer,
3056
+ showcase: ShowcaseRenderer,
3057
+ tabs: TabsRenderer
3058
+ };
3059
+ var typingTarget = (el) => el instanceof HTMLElement && (["INPUT", "TEXTAREA", "SELECT"].includes(el.tagName) || el.isContentEditable || el.getAttribute("role") === "tab");
3060
+ var spaceActivates = (el) => el instanceof HTMLElement && (el.tagName === "BUTTON" || el.getAttribute("role") === "button");
3061
+ var Deck = React9__namespace.forwardRef(
3062
+ ({
3063
+ slides,
3064
+ meta,
3065
+ home,
3066
+ onSlideChange,
3067
+ renderers,
3068
+ graphics,
3069
+ components,
3070
+ icons,
3071
+ labels: labelOverrides,
3072
+ locale,
3073
+ syncHash = true,
3074
+ className,
3075
+ ...rest
3076
+ }, ref) => {
3077
+ const rootRef = React9__namespace.useRef(null);
3078
+ const scrollRef = React9__namespace.useRef(null);
3079
+ const touchStart = React9__namespace.useRef(null);
3080
+ const [active, setActive] = React9__namespace.useState(0);
3081
+ const [ready, setReady] = React9__namespace.useState(false);
3082
+ const [outline, setOutline] = React9__namespace.useState(false);
3083
+ const [fullscreen, setFullscreen] = React9__namespace.useState(false);
3084
+ const [hintPulse, setHintPulse] = React9__namespace.useState(0);
3085
+ const labels = React9__namespace.useMemo(
3086
+ () => ({ ...defaultDeckLabels, ...labelOverrides }),
3087
+ [labelOverrides]
3088
+ );
3089
+ const total = slides.length;
3090
+ React9__namespace.useImperativeHandle(ref, () => rootRef.current);
3091
+ const slideEl = React9__namespace.useCallback(
3092
+ (i) => scrollRef.current?.querySelector(
3093
+ `[data-slot="deck-slide"][data-index="${i}"]`
3094
+ ),
3095
+ []
3096
+ );
3097
+ const goTo = React9__namespace.useCallback(
3098
+ (i) => {
3099
+ const clamped = Math.max(0, Math.min(i, total - 1));
3100
+ const reduce = window.matchMedia?.(
3101
+ "(prefers-reduced-motion: reduce)"
3102
+ ).matches;
3103
+ slideEl(clamped)?.scrollIntoView({
3104
+ behavior: reduce ? "auto" : "smooth"
3105
+ });
3106
+ },
3107
+ [slideEl, total]
3108
+ );
3109
+ React9__namespace.useEffect(() => {
3110
+ const root = scrollRef.current;
3111
+ if (!root) return;
3112
+ const observer = new IntersectionObserver(
3113
+ (entries) => {
3114
+ for (const entry of entries) {
3115
+ if (!entry.isIntersecting) continue;
3116
+ const rootHeight = root.clientHeight || window.innerHeight;
3117
+ if (entry.intersectionRatio < 0.5 && entry.intersectionRect.height < rootHeight / 2)
3118
+ continue;
3119
+ const el = entry.target;
3120
+ el.dataset.seen = "";
3121
+ setActive(Number(el.dataset.index));
3122
+ }
3123
+ },
3124
+ { root, threshold: [0.1, 0.25, 0.5] }
3125
+ );
3126
+ root.querySelectorAll('[data-slot="deck-slide"]').forEach((el) => observer.observe(el));
3127
+ setReady(true);
3128
+ return () => observer.disconnect();
3129
+ }, [total]);
3130
+ React9__namespace.useEffect(() => {
3131
+ const raw = window.location.hash.slice(1);
3132
+ let hash = raw;
3133
+ try {
3134
+ hash = decodeURIComponent(raw);
3135
+ } catch {
3136
+ }
3137
+ if (!hash) return;
3138
+ const i = slides.findIndex((s, n) => slideAnchor(s, n) === hash);
3139
+ if (i > 0) requestAnimationFrame(() => slideEl(i)?.scrollIntoView());
3140
+ }, []);
3141
+ const reportedSlide = React9__namespace.useRef(-1);
3142
+ React9__namespace.useEffect(() => {
3143
+ const slide = slides[active];
3144
+ if (!slide) return;
3145
+ if (syncHash && ready) {
3146
+ const hash = `#${slideAnchor(slide, active)}`;
3147
+ if (window.location.hash !== hash)
3148
+ window.history.replaceState(window.history.state, "", hash);
3149
+ }
3150
+ if (reportedSlide.current !== active) {
3151
+ reportedSlide.current = active;
3152
+ onSlideChange?.(slide, active);
3153
+ }
3154
+ }, [active, slides, syncHash, ready]);
3155
+ const toggleFullscreen = React9__namespace.useCallback(() => {
3156
+ if (!document.fullscreenElement)
3157
+ rootRef.current?.requestFullscreen?.().catch(() => {
3158
+ });
3159
+ else document.exitFullscreen?.().catch(() => {
3160
+ });
3161
+ }, []);
3162
+ React9__namespace.useEffect(() => {
3163
+ const onChange = () => setFullscreen(!!document.fullscreenElement);
3164
+ document.addEventListener("fullscreenchange", onChange);
3165
+ return () => document.removeEventListener("fullscreenchange", onChange);
3166
+ }, []);
3167
+ React9__namespace.useEffect(() => {
3168
+ const onKey = (e) => {
3169
+ if (outline || e.defaultPrevented || e.metaKey || e.ctrlKey || e.altKey)
3170
+ return;
3171
+ if (typingTarget(e.target)) return;
3172
+ const key = e.key;
3173
+ if (key === " " && spaceActivates(e.target)) return;
3174
+ if (["ArrowDown", "ArrowRight", "PageDown", " "].includes(key)) {
3175
+ e.preventDefault();
3176
+ goTo(active + 1);
3177
+ } else if (["ArrowUp", "ArrowLeft", "PageUp"].includes(key)) {
3178
+ e.preventDefault();
3179
+ goTo(active - 1);
3180
+ } else if (key === "Home") {
3181
+ e.preventDefault();
3182
+ goTo(0);
3183
+ } else if (key === "End") {
3184
+ e.preventDefault();
3185
+ goTo(total - 1);
3186
+ } else if (/^[1-9]$/.test(key)) {
3187
+ goTo(Number(key) - 1);
3188
+ } else if (key.toLowerCase() === "f") {
3189
+ toggleFullscreen();
3190
+ } else if (key === "?") {
3191
+ setHintPulse((p) => p + 1);
3192
+ }
3193
+ };
3194
+ window.addEventListener("keydown", onKey);
3195
+ return () => window.removeEventListener("keydown", onKey);
3196
+ }, [active, goTo, outline, toggleFullscreen, total]);
3197
+ const onTouchEnd = (e) => {
3198
+ if (touchStart.current === null) return;
3199
+ const delta = touchStart.current - e.changedTouches[0].clientY;
3200
+ touchStart.current = null;
3201
+ const el = slideEl(active);
3202
+ if (el && scrollRef.current && el.scrollHeight > scrollRef.current.clientHeight + 20)
3203
+ return;
3204
+ if (Math.abs(delta) > 120) goTo(active + (delta > 0 ? 1 : -1));
3205
+ };
3206
+ const context = React9__namespace.useMemo(
3207
+ () => ({
3208
+ slides,
3209
+ activeSlide: active,
3210
+ goTo,
3211
+ labels,
3212
+ components,
3213
+ icons,
3214
+ graphics,
3215
+ renderers,
3216
+ locale
3217
+ }),
3218
+ [
3219
+ slides,
3220
+ active,
3221
+ goTo,
3222
+ labels,
3223
+ components,
3224
+ icons,
3225
+ graphics,
3226
+ renderers,
3227
+ locale
3228
+ ]
3229
+ );
3230
+ const closeOutline = React9__namespace.useCallback(() => setOutline(false), []);
3231
+ const progress = total > 1 ? active / (total - 1) * 100 : 0;
3232
+ return /* @__PURE__ */ jsxRuntime.jsx(DeckProvider, { value: context, children: /* @__PURE__ */ jsxRuntime.jsxs(
3233
+ "div",
3234
+ {
3235
+ ref: rootRef,
3236
+ role: "region",
3237
+ "aria-roledescription": labels.presentation,
3238
+ "aria-label": meta.title,
3239
+ "data-slot": "deck",
3240
+ "data-ready": ready || void 0,
3241
+ className: chunkS5RVSXDV_cjs.cn(
3242
+ "mie-deck relative h-dvh w-full overflow-hidden bg-neutral-950 text-white",
3243
+ className
3244
+ ),
3245
+ ...rest,
3246
+ children: [
3247
+ /* @__PURE__ */ jsxRuntime.jsxs("h1", { className: "sr-only", children: [
3248
+ meta.title,
3249
+ meta.period ? ` \u2014 ${meta.period}` : ""
3250
+ ] }),
3251
+ home && /* @__PURE__ */ jsxRuntime.jsxs(
3252
+ chunkXI74P5F2_cjs.TemplateAnchor,
3253
+ {
3254
+ href: home.href,
3255
+ trackingId: home.trackingId,
3256
+ components,
3257
+ className: "mie-deck-chrome absolute start-3 top-3 z-50 inline-flex items-center gap-2 rounded-full border border-white/10 bg-black/25 py-1.5 ps-2 pe-3 text-xs font-semibold text-white/80 backdrop-blur transition-colors hover:bg-white/10 hover:text-white print:hidden",
3258
+ children: [
3259
+ home.logo && /* @__PURE__ */ jsxRuntime.jsx(
3260
+ chunkXI74P5F2_cjs.TemplateImg,
3261
+ {
3262
+ ...home.logo,
3263
+ alt: "",
3264
+ components,
3265
+ className: "size-[18px] object-contain"
3266
+ }
3267
+ ),
3268
+ home.label
3269
+ ]
3270
+ }
3271
+ ),
3272
+ /* @__PURE__ */ jsxRuntime.jsx(ProgressBar, { progress }),
3273
+ /* @__PURE__ */ jsxRuntime.jsx(DotNav, { slides, active, goTo, labels }),
3274
+ /* @__PURE__ */ jsxRuntime.jsx(
3275
+ SlideCounter,
3276
+ {
3277
+ active,
3278
+ total,
3279
+ section: slides[active]?.section
3280
+ }
3281
+ ),
3282
+ /* @__PURE__ */ jsxRuntime.jsx(KeyboardHints, { pulse: hintPulse, labels }),
3283
+ /* @__PURE__ */ jsxRuntime.jsx(
3284
+ Controls,
3285
+ {
3286
+ isFullscreen: fullscreen,
3287
+ onToggleFullscreen: toggleFullscreen,
3288
+ onOpenOutline: () => setOutline(true),
3289
+ labels
3290
+ }
3291
+ ),
3292
+ /* @__PURE__ */ jsxRuntime.jsx(
3293
+ "div",
3294
+ {
3295
+ ref: scrollRef,
3296
+ onTouchStart: (e) => {
3297
+ touchStart.current = e.touches[0].clientY;
3298
+ },
3299
+ onTouchEnd,
3300
+ className: "mie-deck-scroll size-full snap-y snap-mandatory overflow-y-auto",
3301
+ children: slides.map((slide, i) => {
3302
+ const Renderer = slide.type === "custom" ? renderers?.[slide.component] : renderers?.[slide.type] ?? slideRenderers[slide.type];
3303
+ return Renderer ? /* @__PURE__ */ jsxRuntime.jsx(Renderer, { slide, index: i }, slideAnchor(slide, i)) : null;
3304
+ })
3305
+ }
3306
+ ),
3307
+ /* @__PURE__ */ jsxRuntime.jsx(
3308
+ MobileNav,
3309
+ {
3310
+ active,
3311
+ total,
3312
+ onPrev: () => goTo(active - 1),
3313
+ onNext: () => goTo(active + 1),
3314
+ onOpenOutline: () => setOutline(true),
3315
+ labels
3316
+ }
3317
+ ),
3318
+ /* @__PURE__ */ jsxRuntime.jsx(
3319
+ OutlineDialog,
3320
+ {
3321
+ open: outline,
3322
+ onClose: closeOutline,
3323
+ slides,
3324
+ active,
3325
+ goTo,
3326
+ labels
3327
+ }
3328
+ )
3329
+ ]
3330
+ }
3331
+ ) });
3332
+ }
3333
+ );
3334
+ Deck.displayName = "Deck";
3335
+
3336
+ exports.Bullet = Bullet;
3337
+ exports.CountUp = CountUp;
3338
+ exports.Deck = Deck;
3339
+ exports.DeckIcon = DeckIcon;
3340
+ exports.Graphic = Graphic;
3341
+ exports.HighlightFigure = HighlightFigure;
3342
+ exports.IconChip = IconChip;
3343
+ exports.SlideCard = Card;
3344
+ exports.SlideEyebrow = Eyebrow;
3345
+ exports.SlideFrame = SlideFrame;
3346
+ exports.SlideHeader = SlideHeader;
3347
+ exports.SlideSubtitle = Subtitle;
3348
+ exports.SlideTitle = SlideTitle;
3349
+ exports.SourceLink = SourceLink;
3350
+ exports.defaultDeckLabels = defaultDeckLabels;
3351
+ exports.reveal = reveal;
3352
+ exports.slideAccent = accent;
3353
+ exports.slideAnchor = slideAnchor;
3354
+ exports.slideRenderers = slideRenderers;
3355
+ exports.slideTones = TONES;
3356
+ exports.toneOf = toneOf;
3357
+ exports.useDeck = useDeck;
3358
+ exports.useTone = useTone;
3359
+ //# sourceMappingURL=deck.cjs.map
3360
+ //# sourceMappingURL=deck.cjs.map