@epicbagel/saas-kit 1.32.0 → 1.34.0

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 (228) hide show
  1. package/README.md +67 -0
  2. package/THIRD_PARTY_NOTICES.md +6 -5
  3. package/dist/chunk-2BNEE3U6.cjs +36 -0
  4. package/dist/chunk-2DCJ2SFU.js +20 -0
  5. package/dist/chunk-5GFMSK27.js +489 -0
  6. package/dist/chunk-5PHOKJCT.cjs +42 -0
  7. package/dist/chunk-B54ZEKBG.cjs +63 -0
  8. package/dist/chunk-BB7PO2BW.js +67 -0
  9. package/dist/chunk-BOMVE7QO.cjs +47 -0
  10. package/dist/{chunk-FPOJ2NGG.js → chunk-C3VZMTVB.js} +1 -1
  11. package/dist/chunk-CXAFTEEP.cjs +20 -0
  12. package/dist/chunk-EXHF3QUY.js +36 -0
  13. package/dist/chunk-FYNHRHVY.cjs +47 -0
  14. package/dist/chunk-HTTRUJQU.cjs +60 -0
  15. package/dist/chunk-I3GBXIFL.cjs +67 -0
  16. package/dist/chunk-O3G3TVPU.js +27 -0
  17. package/dist/{chunk-JS6BLIWL.js → chunk-ROUWBWEQ.js} +7 -7
  18. package/dist/chunk-TDCVZKMX.cjs +27 -0
  19. package/dist/{chunk-E2UVQXBO.cjs → chunk-TP74SBRH.cjs} +6 -6
  20. package/dist/chunk-TUQVHPSI.js +60 -0
  21. package/dist/chunk-UKYUWSF2.cjs +489 -0
  22. package/dist/{chunk-MOJHETNO.cjs → chunk-VUMLLKWY.cjs} +5 -5
  23. package/dist/chunk-VWOWPNKT.js +73 -0
  24. package/dist/chunk-W5L6LQI3.js +42 -0
  25. package/dist/chunk-WMTCL463.js +47 -0
  26. package/dist/chunk-WTVL2FK7.js +47 -0
  27. package/dist/chunk-XH2I3YJ6.js +63 -0
  28. package/dist/chunk-Y6X6XDHE.cjs +73 -0
  29. package/dist/primitives/accent-theme.cjs +7 -0
  30. package/dist/primitives/accent-theme.d.cts +32 -0
  31. package/dist/primitives/accent-theme.d.ts +32 -0
  32. package/dist/primitives/accent-theme.js +7 -0
  33. package/dist/primitives/activity-feed.cjs +3 -3
  34. package/dist/primitives/activity-feed.js +4 -4
  35. package/dist/primitives/anchor.cjs +3 -30
  36. package/dist/primitives/anchor.js +3 -30
  37. package/dist/primitives/app-layout.cjs +114 -0
  38. package/dist/primitives/app-layout.d.cts +47 -0
  39. package/dist/primitives/app-layout.d.ts +47 -0
  40. package/dist/primitives/app-layout.js +114 -0
  41. package/dist/primitives/app-sidebar.cjs +52 -0
  42. package/dist/primitives/app-sidebar.d.cts +105 -0
  43. package/dist/primitives/app-sidebar.d.ts +105 -0
  44. package/dist/primitives/app-sidebar.js +52 -0
  45. package/dist/primitives/back-bar.cjs +37 -0
  46. package/dist/primitives/back-bar.d.cts +31 -0
  47. package/dist/primitives/back-bar.d.ts +31 -0
  48. package/dist/primitives/back-bar.js +37 -0
  49. package/dist/primitives/batch-action-bar.cjs +134 -0
  50. package/dist/primitives/batch-action-bar.d.cts +27 -0
  51. package/dist/primitives/batch-action-bar.d.ts +27 -0
  52. package/dist/primitives/batch-action-bar.js +134 -0
  53. package/dist/primitives/board-view.cjs +7 -7
  54. package/dist/primitives/board-view.js +6 -6
  55. package/dist/primitives/brand-mark.cjs +8 -0
  56. package/dist/primitives/brand-mark.d.cts +10 -0
  57. package/dist/primitives/brand-mark.d.ts +10 -0
  58. package/dist/primitives/brand-mark.js +8 -0
  59. package/dist/primitives/branded-page.cjs +201 -0
  60. package/dist/primitives/branded-page.d.cts +118 -0
  61. package/dist/primitives/branded-page.d.ts +118 -0
  62. package/dist/primitives/branded-page.js +201 -0
  63. package/dist/primitives/call-card.cjs +2 -2
  64. package/dist/primitives/call-card.js +3 -3
  65. package/dist/primitives/chat.cjs +21 -21
  66. package/dist/primitives/chat.js +17 -17
  67. package/dist/primitives/command.cjs +129 -0
  68. package/dist/primitives/command.d.cts +60 -0
  69. package/dist/primitives/command.d.ts +60 -0
  70. package/dist/primitives/command.js +129 -0
  71. package/dist/primitives/compact-list.cjs +24 -0
  72. package/dist/primitives/compact-list.d.cts +18 -0
  73. package/dist/primitives/compact-list.d.ts +18 -0
  74. package/dist/primitives/compact-list.js +24 -0
  75. package/dist/primitives/connection.cjs +2 -2
  76. package/dist/primitives/connection.js +2 -2
  77. package/dist/primitives/context-bar.cjs +57 -0
  78. package/dist/primitives/context-bar.d.cts +50 -0
  79. package/dist/primitives/context-bar.d.ts +50 -0
  80. package/dist/primitives/context-bar.js +57 -0
  81. package/dist/primitives/cycling-prompt.cjs +102 -0
  82. package/dist/primitives/cycling-prompt.d.cts +24 -0
  83. package/dist/primitives/cycling-prompt.d.ts +24 -0
  84. package/dist/primitives/cycling-prompt.js +102 -0
  85. package/dist/primitives/dialog.d.cts +9 -9
  86. package/dist/primitives/dialog.d.ts +9 -9
  87. package/dist/primitives/document-preview.cjs +5 -5
  88. package/dist/primitives/document-preview.js +3 -3
  89. package/dist/primitives/dotted-list.cjs +41 -0
  90. package/dist/primitives/dotted-list.d.cts +28 -0
  91. package/dist/primitives/dotted-list.d.ts +28 -0
  92. package/dist/primitives/dotted-list.js +41 -0
  93. package/dist/primitives/drawer.d.cts +6 -6
  94. package/dist/primitives/drawer.d.ts +6 -6
  95. package/dist/primitives/field.cjs +3 -3
  96. package/dist/primitives/field.js +2 -2
  97. package/dist/primitives/file-dropzone.cjs +3 -3
  98. package/dist/primitives/file-dropzone.js +2 -2
  99. package/dist/primitives/file-preview-internals.cjs +4 -4
  100. package/dist/primitives/file-preview-internals.js +3 -3
  101. package/dist/primitives/file-preview.cjs +12 -12
  102. package/dist/primitives/file-preview.js +3 -3
  103. package/dist/primitives/filter-bar.cjs +4 -4
  104. package/dist/primitives/filter-bar.js +3 -3
  105. package/dist/primitives/fixed-action-bar.cjs +9 -0
  106. package/dist/primitives/fixed-action-bar.d.cts +15 -0
  107. package/dist/primitives/fixed-action-bar.d.ts +15 -0
  108. package/dist/primitives/fixed-action-bar.js +9 -0
  109. package/dist/primitives/floating-action-button.cjs +65 -0
  110. package/dist/primitives/floating-action-button.d.cts +52 -0
  111. package/dist/primitives/floating-action-button.d.ts +52 -0
  112. package/dist/primitives/floating-action-button.js +65 -0
  113. package/dist/primitives/form-section.cjs +38 -0
  114. package/dist/primitives/form-section.d.cts +43 -0
  115. package/dist/primitives/form-section.d.ts +43 -0
  116. package/dist/primitives/form-section.js +38 -0
  117. package/dist/primitives/key-value-grid.cjs +52 -0
  118. package/dist/primitives/key-value-grid.d.cts +20 -0
  119. package/dist/primitives/key-value-grid.d.ts +20 -0
  120. package/dist/primitives/key-value-grid.js +52 -0
  121. package/dist/primitives/marketing-footer.cjs +34 -0
  122. package/dist/primitives/marketing-footer.d.cts +29 -0
  123. package/dist/primitives/marketing-footer.d.ts +29 -0
  124. package/dist/primitives/marketing-footer.js +34 -0
  125. package/dist/primitives/marketing-header.cjs +8 -0
  126. package/dist/primitives/marketing-header.d.cts +31 -0
  127. package/dist/primitives/marketing-header.d.ts +31 -0
  128. package/dist/primitives/marketing-header.js +8 -0
  129. package/dist/primitives/marketing-section.cjs +8 -0
  130. package/dist/primitives/marketing-section.d.cts +35 -0
  131. package/dist/primitives/marketing-section.d.ts +35 -0
  132. package/dist/primitives/marketing-section.js +8 -0
  133. package/dist/primitives/marketing-shell.cjs +28 -0
  134. package/dist/primitives/marketing-shell.d.cts +14 -0
  135. package/dist/primitives/marketing-shell.d.ts +14 -0
  136. package/dist/primitives/marketing-shell.js +28 -0
  137. package/dist/primitives/notes.cjs +3 -3
  138. package/dist/primitives/notes.js +3 -3
  139. package/dist/primitives/page-header.cjs +3 -67
  140. package/dist/primitives/page-header.js +3 -67
  141. package/dist/primitives/page-shell.cjs +3 -41
  142. package/dist/primitives/page-shell.js +3 -41
  143. package/dist/primitives/page-tabs.cjs +4 -57
  144. package/dist/primitives/page-tabs.js +4 -57
  145. package/dist/primitives/pager.cjs +85 -0
  146. package/dist/primitives/pager.d.cts +39 -0
  147. package/dist/primitives/pager.d.ts +39 -0
  148. package/dist/primitives/pager.js +85 -0
  149. package/dist/primitives/pagination.cjs +119 -0
  150. package/dist/primitives/pagination.d.cts +41 -0
  151. package/dist/primitives/pagination.d.ts +41 -0
  152. package/dist/primitives/pagination.js +119 -0
  153. package/dist/primitives/poster.cjs +11 -1
  154. package/dist/primitives/poster.d.cts +12 -1
  155. package/dist/primitives/poster.d.ts +12 -1
  156. package/dist/primitives/poster.js +10 -0
  157. package/dist/primitives/resource-list.cjs +7 -7
  158. package/dist/primitives/resource-list.js +6 -6
  159. package/dist/primitives/responsive-dialog.cjs +3 -3
  160. package/dist/primitives/responsive-dialog.js +2 -2
  161. package/dist/primitives/responsive-embed.cjs +29 -0
  162. package/dist/primitives/responsive-embed.d.cts +14 -0
  163. package/dist/primitives/responsive-embed.d.ts +14 -0
  164. package/dist/primitives/responsive-embed.js +29 -0
  165. package/dist/primitives/save-bar.cjs +91 -0
  166. package/dist/primitives/save-bar.d.cts +55 -0
  167. package/dist/primitives/save-bar.d.ts +55 -0
  168. package/dist/primitives/save-bar.js +91 -0
  169. package/dist/primitives/section.cjs +2 -2
  170. package/dist/primitives/section.js +3 -3
  171. package/dist/primitives/settings-list.cjs +10 -0
  172. package/dist/primitives/settings-list.d.cts +31 -0
  173. package/dist/primitives/settings-list.d.ts +31 -0
  174. package/dist/primitives/settings-list.js +10 -0
  175. package/dist/primitives/settings-section.cjs +34 -0
  176. package/dist/primitives/settings-section.d.cts +44 -0
  177. package/dist/primitives/settings-section.d.ts +44 -0
  178. package/dist/primitives/settings-section.js +34 -0
  179. package/dist/primitives/sheet.d.cts +9 -9
  180. package/dist/primitives/sheet.d.ts +9 -9
  181. package/dist/primitives/short-video.cjs +110 -0
  182. package/dist/primitives/short-video.d.cts +30 -0
  183. package/dist/primitives/short-video.d.ts +30 -0
  184. package/dist/primitives/short-video.js +110 -0
  185. package/dist/primitives/stats-card.cjs +46 -0
  186. package/dist/primitives/stats-card.d.cts +19 -0
  187. package/dist/primitives/stats-card.d.ts +19 -0
  188. package/dist/primitives/stats-card.js +46 -0
  189. package/dist/primitives/stats-strip.cjs +38 -0
  190. package/dist/primitives/stats-strip.d.cts +24 -0
  191. package/dist/primitives/stats-strip.d.ts +24 -0
  192. package/dist/primitives/stats-strip.js +38 -0
  193. package/dist/primitives/step-list.cjs +32 -0
  194. package/dist/primitives/step-list.d.cts +19 -0
  195. package/dist/primitives/step-list.d.ts +19 -0
  196. package/dist/primitives/step-list.js +32 -0
  197. package/dist/primitives/steps.cjs +77 -0
  198. package/dist/primitives/steps.d.cts +35 -0
  199. package/dist/primitives/steps.d.ts +35 -0
  200. package/dist/primitives/steps.js +77 -0
  201. package/dist/primitives/switch-field.cjs +3 -3
  202. package/dist/primitives/switch-field.js +3 -3
  203. package/dist/primitives/tabbed-page-header.cjs +53 -0
  204. package/dist/primitives/tabbed-page-header.d.cts +26 -0
  205. package/dist/primitives/tabbed-page-header.d.ts +26 -0
  206. package/dist/primitives/tabbed-page-header.js +53 -0
  207. package/dist/primitives/theme-selector.cjs +15 -15
  208. package/dist/primitives/theme-selector.js +2 -2
  209. package/dist/primitives/voice-dictation-button.cjs +3 -3
  210. package/dist/primitives/voice-dictation-button.js +2 -2
  211. package/dist/primitives/voice-session-controls.cjs +3 -3
  212. package/dist/primitives/voice-session-controls.js +2 -2
  213. package/dist/primitives/workflow-assistant.cjs +4 -4
  214. package/dist/primitives/workflow-assistant.js +2 -2
  215. package/package.json +322 -1
  216. package/src/styles/components/poster.css +42 -1
  217. package/dist/{chunk-PH2TV7XI.cjs → chunk-2YW5VA2V.cjs} +2 -2
  218. package/dist/{chunk-UFFHGKI7.js → chunk-6LB37JWO.js} +8 -8
  219. package/dist/{chunk-AO56ET4F.cjs → chunk-BTHYGHOH.cjs} +2 -2
  220. package/dist/{chunk-WHDHUYS6.js → chunk-HBRVOGLA.js} +3 -3
  221. package/dist/{chunk-6O3DUMF7.js → chunk-HTUYUMAH.js} +3 -3
  222. package/dist/{chunk-PNI354BY.cjs → chunk-JMNDFISN.cjs} +2 -2
  223. package/dist/{chunk-CRZ4INEJ.js → chunk-JTI4244T.js} +10 -10
  224. package/dist/{chunk-ZGTPNSR7.js → chunk-NNEV5RHQ.js} +3 -3
  225. package/dist/{chunk-TWCJMFST.js → chunk-O42YC6ZQ.js} +3 -3
  226. package/dist/{chunk-MW67PHAQ.cjs → chunk-S2IMM37Q.cjs} +6 -6
  227. package/dist/{chunk-ZJFYOXSM.cjs → chunk-SRVRNHCX.cjs} +2 -2
  228. package/dist/{chunk-ZLEM2SAU.cjs → chunk-Z3JJSNR5.cjs} +2 -2
@@ -0,0 +1,57 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
+ "use client";
3
+
4
+
5
+ var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
6
+
7
+ // src/primitives/context-bar.tsx
8
+ var _jsxruntime = require('react/jsx-runtime');
9
+ var TONES = {
10
+ /** Inverted/solid — the strongest "you are in a special mode" signal (preview, impersonation). */
11
+ dark: "bg-foreground text-background",
12
+ /** Quiet, in-flow notice. */
13
+ muted: "bg-muted text-muted-foreground",
14
+ /** Caution — staging, destructive context, "this is live data". */
15
+ warning: "bg-amber-500 text-black",
16
+ /** Branded/informational. */
17
+ info: "bg-primary text-primary-foreground"
18
+ };
19
+ function ContextBar({
20
+ label,
21
+ icon,
22
+ children,
23
+ actions,
24
+ tone = "dark",
25
+ sticky = false,
26
+ frosted = false,
27
+ className,
28
+ maxWidth
29
+ }) {
30
+ const frostedMuted = frosted && tone === "muted";
31
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
32
+ "div",
33
+ {
34
+ "data-slot": "context-bar",
35
+ "data-frosted-surface": frostedMuted ? "muted" : void 0,
36
+ className: _chunkKWLSBTB2cjs.cn.call(void 0, "w-full", frostedMuted ? "text-foreground" : TONES[tone], sticky && "sticky top-0 z-40", className),
37
+ children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
38
+ "div",
39
+ {
40
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
41
+ "mx-auto flex w-full items-center gap-x-3 gap-y-2 px-4 py-3 sm:px-6",
42
+ maxWidth
43
+ ),
44
+ children: [
45
+ icon && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "flex shrink-0 items-center opacity-80 [&_svg]:size-4", children: icon }),
46
+ label && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "shrink-0 font-mono text-xs font-medium uppercase tracking-[0.2em]", children: label }),
47
+ children ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "min-w-0 flex-1 truncate text-sm", !frostedMuted && "opacity-90"), children }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "flex-1" }),
48
+ actions && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "flex shrink-0 items-center gap-2", children: actions })
49
+ ]
50
+ }
51
+ )
52
+ }
53
+ );
54
+ }
55
+
56
+
57
+ exports.ContextBar = ContextBar;
@@ -0,0 +1,50 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ declare const TONES: {
5
+ /** Inverted/solid — the strongest "you are in a special mode" signal (preview, impersonation). */
6
+ readonly dark: "bg-foreground text-background";
7
+ /** Quiet, in-flow notice. */
8
+ readonly muted: "bg-muted text-muted-foreground";
9
+ /** Caution — staging, destructive context, "this is live data". */
10
+ readonly warning: "bg-amber-500 text-black";
11
+ /** Branded/informational. */
12
+ readonly info: "bg-primary text-primary-foreground";
13
+ };
14
+ interface ContextBarProps {
15
+ /**
16
+ * Short tag rendered in mono uppercase, e.g. `"Preview"`, `"Staging"`, `"Viewing as"`. The "what
17
+ * mode is this" label.
18
+ */
19
+ label?: ReactNode;
20
+ /** Leading icon (sized to 1rem). */
21
+ icon?: ReactNode;
22
+ /** The message — a sentence explaining the context. */
23
+ children?: ReactNode;
24
+ /** Right-aligned controls — a toggle, a button, a dismiss. */
25
+ actions?: ReactNode;
26
+ /** Visual tone. Default `"dark"` (inverted). */
27
+ tone?: keyof typeof TONES;
28
+ /** Pin to the top of the scroll container. Default `false`. */
29
+ sticky?: boolean;
30
+ /** Blurred translucent muted tone; warning, info and dark tones stay solid for contrast. */
31
+ frosted?: boolean;
32
+ className?: string;
33
+ /** Constrain the inner row to a max width (else full-bleed). e.g. `"max-w-5xl"`. */
34
+ maxWidth?: string;
35
+ }
36
+ /**
37
+ * A full-width bar that announces the **current mode/context** of a view — a preview, an
38
+ * impersonation session, a staging environment, a draft — with an optional label, message, and
39
+ * right-aligned actions. App-agnostic: the booking preview is one use; "Viewing as {user}",
40
+ * "Staging — not real data", and "Draft — unpublished" are others.
41
+ *
42
+ * ```tsx
43
+ * <ContextBar tone="dark" icon={<Eye />} label="Preview" actions={<CopyButton … />}>
44
+ * This is exactly what your recipient sees — nothing is booked here.
45
+ * </ContextBar>
46
+ * ```
47
+ */
48
+ declare function ContextBar({ label, icon, children, actions, tone, sticky, frosted, className, maxWidth, }: ContextBarProps): react_jsx_runtime.JSX.Element;
49
+
50
+ export { ContextBar, type ContextBarProps };
@@ -0,0 +1,50 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ declare const TONES: {
5
+ /** Inverted/solid — the strongest "you are in a special mode" signal (preview, impersonation). */
6
+ readonly dark: "bg-foreground text-background";
7
+ /** Quiet, in-flow notice. */
8
+ readonly muted: "bg-muted text-muted-foreground";
9
+ /** Caution — staging, destructive context, "this is live data". */
10
+ readonly warning: "bg-amber-500 text-black";
11
+ /** Branded/informational. */
12
+ readonly info: "bg-primary text-primary-foreground";
13
+ };
14
+ interface ContextBarProps {
15
+ /**
16
+ * Short tag rendered in mono uppercase, e.g. `"Preview"`, `"Staging"`, `"Viewing as"`. The "what
17
+ * mode is this" label.
18
+ */
19
+ label?: ReactNode;
20
+ /** Leading icon (sized to 1rem). */
21
+ icon?: ReactNode;
22
+ /** The message — a sentence explaining the context. */
23
+ children?: ReactNode;
24
+ /** Right-aligned controls — a toggle, a button, a dismiss. */
25
+ actions?: ReactNode;
26
+ /** Visual tone. Default `"dark"` (inverted). */
27
+ tone?: keyof typeof TONES;
28
+ /** Pin to the top of the scroll container. Default `false`. */
29
+ sticky?: boolean;
30
+ /** Blurred translucent muted tone; warning, info and dark tones stay solid for contrast. */
31
+ frosted?: boolean;
32
+ className?: string;
33
+ /** Constrain the inner row to a max width (else full-bleed). e.g. `"max-w-5xl"`. */
34
+ maxWidth?: string;
35
+ }
36
+ /**
37
+ * A full-width bar that announces the **current mode/context** of a view — a preview, an
38
+ * impersonation session, a staging environment, a draft — with an optional label, message, and
39
+ * right-aligned actions. App-agnostic: the booking preview is one use; "Viewing as {user}",
40
+ * "Staging — not real data", and "Draft — unpublished" are others.
41
+ *
42
+ * ```tsx
43
+ * <ContextBar tone="dark" icon={<Eye />} label="Preview" actions={<CopyButton … />}>
44
+ * This is exactly what your recipient sees — nothing is booked here.
45
+ * </ContextBar>
46
+ * ```
47
+ */
48
+ declare function ContextBar({ label, icon, children, actions, tone, sticky, frosted, className, maxWidth, }: ContextBarProps): react_jsx_runtime.JSX.Element;
49
+
50
+ export { ContextBar, type ContextBarProps };
@@ -0,0 +1,57 @@
1
+ "use client";
2
+ "use client";
3
+ import {
4
+ cn
5
+ } from "../chunk-G6SRSWXB.js";
6
+
7
+ // src/primitives/context-bar.tsx
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ var TONES = {
10
+ /** Inverted/solid — the strongest "you are in a special mode" signal (preview, impersonation). */
11
+ dark: "bg-foreground text-background",
12
+ /** Quiet, in-flow notice. */
13
+ muted: "bg-muted text-muted-foreground",
14
+ /** Caution — staging, destructive context, "this is live data". */
15
+ warning: "bg-amber-500 text-black",
16
+ /** Branded/informational. */
17
+ info: "bg-primary text-primary-foreground"
18
+ };
19
+ function ContextBar({
20
+ label,
21
+ icon,
22
+ children,
23
+ actions,
24
+ tone = "dark",
25
+ sticky = false,
26
+ frosted = false,
27
+ className,
28
+ maxWidth
29
+ }) {
30
+ const frostedMuted = frosted && tone === "muted";
31
+ return /* @__PURE__ */ jsx(
32
+ "div",
33
+ {
34
+ "data-slot": "context-bar",
35
+ "data-frosted-surface": frostedMuted ? "muted" : void 0,
36
+ className: cn("w-full", frostedMuted ? "text-foreground" : TONES[tone], sticky && "sticky top-0 z-40", className),
37
+ children: /* @__PURE__ */ jsxs(
38
+ "div",
39
+ {
40
+ className: cn(
41
+ "mx-auto flex w-full items-center gap-x-3 gap-y-2 px-4 py-3 sm:px-6",
42
+ maxWidth
43
+ ),
44
+ children: [
45
+ icon && /* @__PURE__ */ jsx("span", { className: "flex shrink-0 items-center opacity-80 [&_svg]:size-4", children: icon }),
46
+ label && /* @__PURE__ */ jsx("span", { className: "shrink-0 font-mono text-xs font-medium uppercase tracking-[0.2em]", children: label }),
47
+ children ? /* @__PURE__ */ jsx("span", { className: cn("min-w-0 flex-1 truncate text-sm", !frostedMuted && "opacity-90"), children }) : /* @__PURE__ */ jsx("span", { className: "flex-1" }),
48
+ actions && /* @__PURE__ */ jsx("span", { className: "flex shrink-0 items-center gap-2", children: actions })
49
+ ]
50
+ }
51
+ )
52
+ }
53
+ );
54
+ }
55
+ export {
56
+ ContextBar
57
+ };
@@ -0,0 +1,102 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }"use client";
2
+ "use client";
3
+
4
+
5
+ var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
6
+
7
+ // src/primitives/cycling-prompt.tsx
8
+ var _react = require('react');
9
+ var _jsxruntime = require('react/jsx-runtime');
10
+ var TYPE_MS = 45;
11
+ var DELETE_MS = 22;
12
+ var HOLD_MS = 1800;
13
+ function CyclingPrompt({
14
+ prompts,
15
+ className
16
+ }) {
17
+ const [idx, setIdx] = _react.useState.call(void 0, 0);
18
+ const [text, setText] = _react.useState.call(void 0, "");
19
+ const [phase, setPhase] = _react.useState.call(void 0,
20
+ "typing"
21
+ );
22
+ const [reducedMotion, setReducedMotion] = _react.useState.call(void 0, false);
23
+ _react.useEffect.call(void 0, () => {
24
+ if (typeof window === "undefined") return;
25
+ const mq = window.matchMedia("(prefers-reduced-motion: reduce)");
26
+ setReducedMotion(mq.matches);
27
+ const onChange = () => setReducedMotion(mq.matches);
28
+ mq.addEventListener("change", onChange);
29
+ return () => mq.removeEventListener("change", onChange);
30
+ }, []);
31
+ _react.useEffect.call(void 0, () => {
32
+ if (reducedMotion || prompts.length === 0) return;
33
+ const current = _nullishCoalesce(prompts[idx], () => ( ""));
34
+ if (phase === "typing") {
35
+ if (text.length < current.length) {
36
+ const t2 = setTimeout(
37
+ () => setText(current.slice(0, text.length + 1)),
38
+ TYPE_MS
39
+ );
40
+ return () => clearTimeout(t2);
41
+ }
42
+ const t = setTimeout(() => setPhase("deleting"), HOLD_MS);
43
+ return () => clearTimeout(t);
44
+ }
45
+ if (phase === "deleting") {
46
+ if (text.length > 0) {
47
+ const t = setTimeout(() => setText(text.slice(0, -1)), DELETE_MS);
48
+ return () => clearTimeout(t);
49
+ }
50
+ setIdx((i) => (i + 1) % prompts.length);
51
+ setPhase("typing");
52
+ }
53
+ }, [text, phase, idx, reducedMotion, prompts]);
54
+ const display = reducedMotion ? _nullishCoalesce(prompts[0], () => ( "")) : text;
55
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "inline-flex items-baseline", className), children: [
56
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: display }),
57
+ !reducedMotion && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
58
+ "span",
59
+ {
60
+ "aria-hidden": true,
61
+ className: "ml-0.5 inline-block h-[1em] w-[2px] translate-y-[0.15em] animate-pulse bg-current"
62
+ }
63
+ )
64
+ ] });
65
+ }
66
+ function TypewriterText({
67
+ text,
68
+ active = true,
69
+ speedMs = 24,
70
+ onComplete,
71
+ className
72
+ }) {
73
+ const [length, setLength] = _react.useState.call(void 0, active ? 0 : text.length);
74
+ const completed = _react.useRef.call(void 0, false);
75
+ const onCompleteRef = _react.useRef.call(void 0, onComplete);
76
+ _react.useEffect.call(void 0, () => {
77
+ onCompleteRef.current = onComplete;
78
+ }, [onComplete]);
79
+ _react.useEffect.call(void 0, () => {
80
+ setLength(active ? 0 : text.length);
81
+ completed.current = false;
82
+ }, [active, text]);
83
+ _react.useEffect.call(void 0, () => {
84
+ if (!active || length >= text.length) {
85
+ if (length >= text.length && !completed.current) {
86
+ completed.current = true;
87
+ _optionalChain([onCompleteRef, 'access', _ => _.current, 'optionalCall', _2 => _2()]);
88
+ }
89
+ return;
90
+ }
91
+ const timer = window.setTimeout(() => setLength((value) => value + 1), speedMs);
92
+ return () => window.clearTimeout(timer);
93
+ }, [active, length, speedMs, text.length]);
94
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "whitespace-pre-wrap", className), "aria-label": text, children: [
95
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { "aria-hidden": true, children: text.slice(0, length) }),
96
+ active && length < text.length && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { "aria-hidden": true, className: "ml-0.5 inline-block h-[1em] w-px animate-pulse bg-current motion-reduce:hidden" })
97
+ ] });
98
+ }
99
+
100
+
101
+
102
+ exports.CyclingPrompt = CyclingPrompt; exports.TypewriterText = TypewriterText;
@@ -0,0 +1,24 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ /**
4
+ * CyclingPrompt — typewriter caption that types, holds, deletes, and
5
+ * advances through a list of phrases. Pure useEffect state machine.
6
+ * Honors prefers-reduced-motion by showing the first phrase statically.
7
+ *
8
+ * Phrases are caller-supplied so each app shows its own examples.
9
+ */
10
+ declare function CyclingPrompt({ prompts, className, }: {
11
+ prompts: string[];
12
+ className?: string;
13
+ }): react_jsx_runtime.JSX.Element;
14
+ interface TypewriterTextProps {
15
+ text: string;
16
+ active?: boolean;
17
+ speedMs?: number;
18
+ onComplete?: () => void;
19
+ className?: string;
20
+ }
21
+ /** One-shot, accessible typewriter text for guided product demonstrations. */
22
+ declare function TypewriterText({ text, active, speedMs, onComplete, className, }: TypewriterTextProps): react_jsx_runtime.JSX.Element;
23
+
24
+ export { CyclingPrompt, TypewriterText, type TypewriterTextProps };
@@ -0,0 +1,24 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ /**
4
+ * CyclingPrompt — typewriter caption that types, holds, deletes, and
5
+ * advances through a list of phrases. Pure useEffect state machine.
6
+ * Honors prefers-reduced-motion by showing the first phrase statically.
7
+ *
8
+ * Phrases are caller-supplied so each app shows its own examples.
9
+ */
10
+ declare function CyclingPrompt({ prompts, className, }: {
11
+ prompts: string[];
12
+ className?: string;
13
+ }): react_jsx_runtime.JSX.Element;
14
+ interface TypewriterTextProps {
15
+ text: string;
16
+ active?: boolean;
17
+ speedMs?: number;
18
+ onComplete?: () => void;
19
+ className?: string;
20
+ }
21
+ /** One-shot, accessible typewriter text for guided product demonstrations. */
22
+ declare function TypewriterText({ text, active, speedMs, onComplete, className, }: TypewriterTextProps): react_jsx_runtime.JSX.Element;
23
+
24
+ export { CyclingPrompt, TypewriterText, type TypewriterTextProps };
@@ -0,0 +1,102 @@
1
+ "use client";
2
+ "use client";
3
+ import {
4
+ cn
5
+ } from "../chunk-G6SRSWXB.js";
6
+
7
+ // src/primitives/cycling-prompt.tsx
8
+ import { useEffect, useRef, useState } from "react";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ var TYPE_MS = 45;
11
+ var DELETE_MS = 22;
12
+ var HOLD_MS = 1800;
13
+ function CyclingPrompt({
14
+ prompts,
15
+ className
16
+ }) {
17
+ const [idx, setIdx] = useState(0);
18
+ const [text, setText] = useState("");
19
+ const [phase, setPhase] = useState(
20
+ "typing"
21
+ );
22
+ const [reducedMotion, setReducedMotion] = useState(false);
23
+ useEffect(() => {
24
+ if (typeof window === "undefined") return;
25
+ const mq = window.matchMedia("(prefers-reduced-motion: reduce)");
26
+ setReducedMotion(mq.matches);
27
+ const onChange = () => setReducedMotion(mq.matches);
28
+ mq.addEventListener("change", onChange);
29
+ return () => mq.removeEventListener("change", onChange);
30
+ }, []);
31
+ useEffect(() => {
32
+ if (reducedMotion || prompts.length === 0) return;
33
+ const current = prompts[idx] ?? "";
34
+ if (phase === "typing") {
35
+ if (text.length < current.length) {
36
+ const t2 = setTimeout(
37
+ () => setText(current.slice(0, text.length + 1)),
38
+ TYPE_MS
39
+ );
40
+ return () => clearTimeout(t2);
41
+ }
42
+ const t = setTimeout(() => setPhase("deleting"), HOLD_MS);
43
+ return () => clearTimeout(t);
44
+ }
45
+ if (phase === "deleting") {
46
+ if (text.length > 0) {
47
+ const t = setTimeout(() => setText(text.slice(0, -1)), DELETE_MS);
48
+ return () => clearTimeout(t);
49
+ }
50
+ setIdx((i) => (i + 1) % prompts.length);
51
+ setPhase("typing");
52
+ }
53
+ }, [text, phase, idx, reducedMotion, prompts]);
54
+ const display = reducedMotion ? prompts[0] ?? "" : text;
55
+ return /* @__PURE__ */ jsxs("span", { className: cn("inline-flex items-baseline", className), children: [
56
+ /* @__PURE__ */ jsx("span", { children: display }),
57
+ !reducedMotion && /* @__PURE__ */ jsx(
58
+ "span",
59
+ {
60
+ "aria-hidden": true,
61
+ className: "ml-0.5 inline-block h-[1em] w-[2px] translate-y-[0.15em] animate-pulse bg-current"
62
+ }
63
+ )
64
+ ] });
65
+ }
66
+ function TypewriterText({
67
+ text,
68
+ active = true,
69
+ speedMs = 24,
70
+ onComplete,
71
+ className
72
+ }) {
73
+ const [length, setLength] = useState(active ? 0 : text.length);
74
+ const completed = useRef(false);
75
+ const onCompleteRef = useRef(onComplete);
76
+ useEffect(() => {
77
+ onCompleteRef.current = onComplete;
78
+ }, [onComplete]);
79
+ useEffect(() => {
80
+ setLength(active ? 0 : text.length);
81
+ completed.current = false;
82
+ }, [active, text]);
83
+ useEffect(() => {
84
+ if (!active || length >= text.length) {
85
+ if (length >= text.length && !completed.current) {
86
+ completed.current = true;
87
+ onCompleteRef.current?.();
88
+ }
89
+ return;
90
+ }
91
+ const timer = window.setTimeout(() => setLength((value) => value + 1), speedMs);
92
+ return () => window.clearTimeout(timer);
93
+ }, [active, length, speedMs, text.length]);
94
+ return /* @__PURE__ */ jsxs("span", { className: cn("whitespace-pre-wrap", className), "aria-label": text, children: [
95
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, children: text.slice(0, length) }),
96
+ active && length < text.length && /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "ml-0.5 inline-block h-[1em] w-px animate-pulse bg-current motion-reduce:hidden" })
97
+ ] });
98
+ }
99
+ export {
100
+ CyclingPrompt,
101
+ TypewriterText
102
+ };
@@ -1,13 +1,13 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import * as DialogPrimitive from '@radix-ui/react-dialog';
2
+ import * as SheetPrimitive from '@radix-ui/react-dialog';
3
3
  import * as React from 'react';
4
4
 
5
- declare const Dialog: React.FC<DialogPrimitive.DialogProps>;
6
- declare const DialogTrigger: React.ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
7
- declare const DialogPortal: React.FC<DialogPrimitive.DialogPortalProps>;
8
- declare const DialogClose: React.ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
9
- declare const DialogOverlay: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
10
- interface DialogContentProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {
5
+ declare const Dialog: React.FC<SheetPrimitive.DialogProps>;
6
+ declare const DialogTrigger: React.ForwardRefExoticComponent<SheetPrimitive.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
7
+ declare const DialogPortal: React.FC<SheetPrimitive.DialogPortalProps>;
8
+ declare const DialogClose: React.ForwardRefExoticComponent<SheetPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
9
+ declare const DialogOverlay: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
10
+ interface DialogContentProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content> {
11
11
  size?: "sm" | "md" | "lg" | "xl" | "2xl" | "wide";
12
12
  height?: "auto" | "viewport-md" | "viewport-lg";
13
13
  layout?: "grid" | "column";
@@ -30,13 +30,13 @@ declare const DialogFooter: {
30
30
  ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
31
31
  displayName: string;
32
32
  };
33
- interface DialogTitleProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title> {
33
+ interface DialogTitleProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title> {
34
34
  visuallyHidden?: boolean;
35
35
  size?: "default" | "base";
36
36
  display?: "block" | "inline-flex";
37
37
  }
38
38
  declare const DialogTitle: React.ForwardRefExoticComponent<DialogTitleProps & React.RefAttributes<HTMLHeadingElement>>;
39
- interface DialogDescriptionProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description> {
39
+ interface DialogDescriptionProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description> {
40
40
  visuallyHidden?: boolean;
41
41
  }
42
42
  declare const DialogDescription: React.ForwardRefExoticComponent<DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>>;
@@ -1,13 +1,13 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import * as DialogPrimitive from '@radix-ui/react-dialog';
2
+ import * as SheetPrimitive from '@radix-ui/react-dialog';
3
3
  import * as React from 'react';
4
4
 
5
- declare const Dialog: React.FC<DialogPrimitive.DialogProps>;
6
- declare const DialogTrigger: React.ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
7
- declare const DialogPortal: React.FC<DialogPrimitive.DialogPortalProps>;
8
- declare const DialogClose: React.ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
9
- declare const DialogOverlay: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
10
- interface DialogContentProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {
5
+ declare const Dialog: React.FC<SheetPrimitive.DialogProps>;
6
+ declare const DialogTrigger: React.ForwardRefExoticComponent<SheetPrimitive.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
7
+ declare const DialogPortal: React.FC<SheetPrimitive.DialogPortalProps>;
8
+ declare const DialogClose: React.ForwardRefExoticComponent<SheetPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
9
+ declare const DialogOverlay: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
10
+ interface DialogContentProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content> {
11
11
  size?: "sm" | "md" | "lg" | "xl" | "2xl" | "wide";
12
12
  height?: "auto" | "viewport-md" | "viewport-lg";
13
13
  layout?: "grid" | "column";
@@ -30,13 +30,13 @@ declare const DialogFooter: {
30
30
  ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
31
31
  displayName: string;
32
32
  };
33
- interface DialogTitleProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title> {
33
+ interface DialogTitleProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title> {
34
34
  visuallyHidden?: boolean;
35
35
  size?: "default" | "base";
36
36
  display?: "block" | "inline-flex";
37
37
  }
38
38
  declare const DialogTitle: React.ForwardRefExoticComponent<DialogTitleProps & React.RefAttributes<HTMLHeadingElement>>;
39
- interface DialogDescriptionProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description> {
39
+ interface DialogDescriptionProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description> {
40
40
  visuallyHidden?: boolean;
41
41
  }
42
42
  declare const DialogDescription: React.ForwardRefExoticComponent<DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>>;
@@ -5,10 +5,10 @@
5
5
 
6
6
 
7
7
 
8
- var _chunkE2UVQXBOcjs = require('../chunk-E2UVQXBO.cjs');
9
- require('../chunk-AO56ET4F.cjs');
10
- require('../chunk-WDXEJDMO.cjs');
8
+ var _chunkTP74SBRHcjs = require('../chunk-TP74SBRH.cjs');
9
+ require('../chunk-BTHYGHOH.cjs');
11
10
  require('../chunk-2BHI5ZWJ.cjs');
11
+ require('../chunk-WDXEJDMO.cjs');
12
12
  require('../chunk-T2ZFSPE4.cjs');
13
13
  require('../chunk-JDEXZGIY.cjs');
14
14
  require('../chunk-KWLSBTB2.cjs');
@@ -29,7 +29,7 @@ function DocumentPreview({
29
29
  fallback
30
30
  }) {
31
31
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
32
- _chunkE2UVQXBOcjs.PreviewDialog,
32
+ _chunkTP74SBRHcjs.PreviewDialog,
33
33
  {
34
34
  open,
35
35
  onOpenChange,
@@ -37,7 +37,7 @@ function DocumentPreview({
37
37
  onDownload,
38
38
  downloading,
39
39
  downloadLabel,
40
- children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkE2UVQXBOcjs.PreviewStage, { children: loading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkE2UVQXBOcjs.PreviewLoading, { label: "Loading preview\u2026" }) : error ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkE2UVQXBOcjs.PreviewNotice, { icon: _lucidereact.FileWarning, alert: true, message: error, children: fallback }) : src ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
40
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTP74SBRHcjs.PreviewStage, { children: loading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTP74SBRHcjs.PreviewLoading, { label: "Loading preview\u2026" }) : error ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTP74SBRHcjs.PreviewNotice, { icon: _lucidereact.FileWarning, alert: true, message: error, children: fallback }) : src ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
41
41
  "iframe",
42
42
  {
43
43
  src,
@@ -5,10 +5,10 @@ import {
5
5
  PreviewLoading,
6
6
  PreviewNotice,
7
7
  PreviewStage
8
- } from "../chunk-FPOJ2NGG.js";
9
- import "../chunk-CRZ4INEJ.js";
10
- import "../chunk-3QT5VYZ3.js";
8
+ } from "../chunk-C3VZMTVB.js";
9
+ import "../chunk-JTI4244T.js";
11
10
  import "../chunk-4HWCNRK4.js";
11
+ import "../chunk-3QT5VYZ3.js";
12
12
  import "../chunk-KN4RPX35.js";
13
13
  import "../chunk-W326GKML.js";
14
14
  import "../chunk-G6SRSWXB.js";
@@ -0,0 +1,41 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
+
3
+
4
+ var _chunkW5I4FN7Gcjs = require('../chunk-W5I4FN7G.cjs');
5
+ require('../chunk-EJP2L5QV.cjs');
6
+
7
+
8
+ var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
9
+
10
+ // src/primitives/dotted-list.tsx
11
+ var _jsxruntime = require('react/jsx-runtime');
12
+ function DottedList({
13
+ items,
14
+ maxItems,
15
+ moreSuffix = "more",
16
+ className
17
+ }) {
18
+ const visible = maxItems != null ? items.slice(0, maxItems) : items;
19
+ const overflow = maxItems != null && items.length > maxItems ? items.length - maxItems : 0;
20
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "ul", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "mt-2 space-y-0.5", className), children: [
21
+ visible.map((item, i) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "li", { className: "text-xs flex items-start gap-2 text-foreground/80", children: [
22
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkW5I4FN7Gcjs.SentimentDot, { sentiment: item.sentiment }),
23
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { children: [
24
+ item.text,
25
+ item.meta && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "text-muted-foreground", children: [
26
+ " \u2014 ",
27
+ item.meta
28
+ ] })
29
+ ] })
30
+ ] }, i)),
31
+ overflow > 0 && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "li", { className: "text-[11px] text-muted-foreground pl-4", children: [
32
+ "+ ",
33
+ overflow,
34
+ " ",
35
+ moreSuffix
36
+ ] })
37
+ ] });
38
+ }
39
+
40
+
41
+ exports.DottedList = DottedList;