@epicbagel/saas-kit 1.32.0 → 1.33.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 (217) hide show
  1. package/THIRD_PARTY_NOTICES.md +6 -5
  2. package/dist/chunk-2DCJ2SFU.js +20 -0
  3. package/dist/chunk-2FVFPGP5.js +489 -0
  4. package/dist/{chunk-HTPPNW74.js → chunk-AWCXVYPL.js} +1 -1
  5. package/dist/chunk-B54ZEKBG.cjs +63 -0
  6. package/dist/chunk-CXAFTEEP.cjs +20 -0
  7. package/dist/{chunk-MOJHETNO.cjs → chunk-F3D5HA2F.cjs} +10 -10
  8. package/dist/chunk-G3SF4RRA.cjs +489 -0
  9. package/dist/chunk-HTTRUJQU.cjs +60 -0
  10. package/dist/{chunk-JS6BLIWL.js → chunk-IZF4WCK6.js} +11 -11
  11. package/dist/{chunk-PH2TV7XI.cjs → chunk-KOR2QR7I.cjs} +5 -5
  12. package/dist/{chunk-BGCNGYPL.cjs → chunk-PTMZTP3V.cjs} +2 -2
  13. package/dist/{chunk-6O3DUMF7.js → chunk-REGA2L5S.js} +1 -1
  14. package/dist/{chunk-PNI354BY.cjs → chunk-SL6ECEN6.cjs} +2 -2
  15. package/dist/{chunk-ZGTPNSR7.js → chunk-TS4MC3B3.js} +4 -4
  16. package/dist/chunk-TUQVHPSI.js +60 -0
  17. package/dist/chunk-VWOWPNKT.js +73 -0
  18. package/dist/chunk-XH2I3YJ6.js +63 -0
  19. package/dist/chunk-Y6X6XDHE.cjs +73 -0
  20. package/dist/primitives/accent-theme.cjs +66 -0
  21. package/dist/primitives/accent-theme.d.cts +32 -0
  22. package/dist/primitives/accent-theme.d.ts +32 -0
  23. package/dist/primitives/accent-theme.js +66 -0
  24. package/dist/primitives/activity-feed.cjs +2 -2
  25. package/dist/primitives/activity-feed.js +2 -2
  26. package/dist/primitives/agent-audio-visualizer-bar.cjs +3 -3
  27. package/dist/primitives/agent-audio-visualizer-bar.js +2 -2
  28. package/dist/primitives/alert.d.cts +1 -1
  29. package/dist/primitives/alert.d.ts +1 -1
  30. package/dist/primitives/app-layout.cjs +114 -0
  31. package/dist/primitives/app-layout.d.cts +47 -0
  32. package/dist/primitives/app-layout.d.ts +47 -0
  33. package/dist/primitives/app-layout.js +114 -0
  34. package/dist/primitives/app-sidebar.cjs +52 -0
  35. package/dist/primitives/app-sidebar.d.cts +105 -0
  36. package/dist/primitives/app-sidebar.d.ts +105 -0
  37. package/dist/primitives/app-sidebar.js +52 -0
  38. package/dist/primitives/archive-confirmation-dialog.cjs +2 -2
  39. package/dist/primitives/archive-confirmation-dialog.js +3 -3
  40. package/dist/primitives/back-bar.cjs +37 -0
  41. package/dist/primitives/back-bar.d.cts +31 -0
  42. package/dist/primitives/back-bar.d.ts +31 -0
  43. package/dist/primitives/back-bar.js +37 -0
  44. package/dist/primitives/badge.d.cts +1 -1
  45. package/dist/primitives/badge.d.ts +1 -1
  46. package/dist/primitives/batch-action-bar.cjs +134 -0
  47. package/dist/primitives/batch-action-bar.d.cts +27 -0
  48. package/dist/primitives/batch-action-bar.d.ts +27 -0
  49. package/dist/primitives/batch-action-bar.js +134 -0
  50. package/dist/primitives/board-view-internals.cjs +3 -3
  51. package/dist/primitives/board-view-internals.js +2 -2
  52. package/dist/primitives/board-view.cjs +8 -8
  53. package/dist/primitives/board-view.js +7 -7
  54. package/dist/primitives/brand-mark.cjs +26 -0
  55. package/dist/primitives/brand-mark.d.cts +10 -0
  56. package/dist/primitives/brand-mark.d.ts +10 -0
  57. package/dist/primitives/brand-mark.js +26 -0
  58. package/dist/primitives/bubble.d.cts +1 -1
  59. package/dist/primitives/bubble.d.ts +1 -1
  60. package/dist/primitives/button.d.cts +2 -2
  61. package/dist/primitives/button.d.ts +2 -2
  62. package/dist/primitives/chat.cjs +27 -27
  63. package/dist/primitives/chat.js +21 -21
  64. package/dist/primitives/code-block.cjs +4 -4
  65. package/dist/primitives/code-block.js +3 -3
  66. package/dist/primitives/command.cjs +129 -0
  67. package/dist/primitives/command.d.cts +60 -0
  68. package/dist/primitives/command.d.ts +60 -0
  69. package/dist/primitives/command.js +129 -0
  70. package/dist/primitives/compact-list.cjs +24 -0
  71. package/dist/primitives/compact-list.d.cts +18 -0
  72. package/dist/primitives/compact-list.d.ts +18 -0
  73. package/dist/primitives/compact-list.js +24 -0
  74. package/dist/primitives/connection.cjs +6 -6
  75. package/dist/primitives/connection.js +8 -8
  76. package/dist/primitives/context-bar.cjs +57 -0
  77. package/dist/primitives/context-bar.d.cts +50 -0
  78. package/dist/primitives/context-bar.d.ts +50 -0
  79. package/dist/primitives/context-bar.js +57 -0
  80. package/dist/primitives/copy-button.cjs +3 -3
  81. package/dist/primitives/copy-button.js +2 -2
  82. package/dist/primitives/cycling-prompt.cjs +102 -0
  83. package/dist/primitives/cycling-prompt.d.cts +24 -0
  84. package/dist/primitives/cycling-prompt.d.ts +24 -0
  85. package/dist/primitives/cycling-prompt.js +102 -0
  86. package/dist/primitives/dialog.d.cts +9 -9
  87. package/dist/primitives/dialog.d.ts +9 -9
  88. package/dist/primitives/dotted-list.cjs +41 -0
  89. package/dist/primitives/dotted-list.d.cts +28 -0
  90. package/dist/primitives/dotted-list.d.ts +28 -0
  91. package/dist/primitives/dotted-list.js +41 -0
  92. package/dist/primitives/drawer.d.cts +6 -6
  93. package/dist/primitives/drawer.d.ts +6 -6
  94. package/dist/primitives/field.cjs +3 -3
  95. package/dist/primitives/field.js +2 -2
  96. package/dist/primitives/file-dropzone.cjs +3 -3
  97. package/dist/primitives/file-dropzone.js +2 -2
  98. package/dist/primitives/file-preview.cjs +4 -4
  99. package/dist/primitives/file-preview.js +3 -3
  100. package/dist/primitives/filter-bar.cjs +4 -4
  101. package/dist/primitives/filter-bar.js +3 -3
  102. package/dist/primitives/fixed-action-bar.cjs +46 -0
  103. package/dist/primitives/fixed-action-bar.d.cts +15 -0
  104. package/dist/primitives/fixed-action-bar.d.ts +15 -0
  105. package/dist/primitives/fixed-action-bar.js +46 -0
  106. package/dist/primitives/floating-action-button.cjs +65 -0
  107. package/dist/primitives/floating-action-button.d.cts +52 -0
  108. package/dist/primitives/floating-action-button.d.ts +52 -0
  109. package/dist/primitives/floating-action-button.js +65 -0
  110. package/dist/primitives/form-section.cjs +38 -0
  111. package/dist/primitives/form-section.d.cts +43 -0
  112. package/dist/primitives/form-section.d.ts +43 -0
  113. package/dist/primitives/form-section.js +38 -0
  114. package/dist/primitives/key-value-grid.cjs +52 -0
  115. package/dist/primitives/key-value-grid.d.cts +20 -0
  116. package/dist/primitives/key-value-grid.d.ts +20 -0
  117. package/dist/primitives/key-value-grid.js +52 -0
  118. package/dist/primitives/marketing-footer.cjs +34 -0
  119. package/dist/primitives/marketing-footer.d.cts +29 -0
  120. package/dist/primitives/marketing-footer.d.ts +29 -0
  121. package/dist/primitives/marketing-footer.js +34 -0
  122. package/dist/primitives/marketing-header.cjs +41 -0
  123. package/dist/primitives/marketing-header.d.cts +31 -0
  124. package/dist/primitives/marketing-header.d.ts +31 -0
  125. package/dist/primitives/marketing-header.js +41 -0
  126. package/dist/primitives/marketing-section.cjs +8 -0
  127. package/dist/primitives/marketing-section.d.cts +35 -0
  128. package/dist/primitives/marketing-section.d.ts +35 -0
  129. package/dist/primitives/marketing-section.js +8 -0
  130. package/dist/primitives/marketing-shell.cjs +28 -0
  131. package/dist/primitives/marketing-shell.d.cts +14 -0
  132. package/dist/primitives/marketing-shell.d.ts +14 -0
  133. package/dist/primitives/marketing-shell.js +28 -0
  134. package/dist/primitives/notes.cjs +4 -4
  135. package/dist/primitives/notes.js +4 -4
  136. package/dist/primitives/page-header.cjs +3 -67
  137. package/dist/primitives/page-header.js +3 -67
  138. package/dist/primitives/page-tabs.cjs +4 -57
  139. package/dist/primitives/page-tabs.js +4 -57
  140. package/dist/primitives/pager.cjs +85 -0
  141. package/dist/primitives/pager.d.cts +39 -0
  142. package/dist/primitives/pager.d.ts +39 -0
  143. package/dist/primitives/pager.js +85 -0
  144. package/dist/primitives/pagination.cjs +119 -0
  145. package/dist/primitives/pagination.d.cts +41 -0
  146. package/dist/primitives/pagination.d.ts +41 -0
  147. package/dist/primitives/pagination.js +119 -0
  148. package/dist/primitives/poster.cjs +11 -1
  149. package/dist/primitives/poster.d.cts +12 -1
  150. package/dist/primitives/poster.d.ts +12 -1
  151. package/dist/primitives/poster.js +10 -0
  152. package/dist/primitives/resource-list.cjs +8 -8
  153. package/dist/primitives/resource-list.js +7 -7
  154. package/dist/primitives/responsive-embed.cjs +29 -0
  155. package/dist/primitives/responsive-embed.d.cts +14 -0
  156. package/dist/primitives/responsive-embed.d.ts +14 -0
  157. package/dist/primitives/responsive-embed.js +29 -0
  158. package/dist/primitives/save-bar.cjs +91 -0
  159. package/dist/primitives/save-bar.d.cts +55 -0
  160. package/dist/primitives/save-bar.d.ts +55 -0
  161. package/dist/primitives/save-bar.js +91 -0
  162. package/dist/primitives/settings-list.cjs +10 -0
  163. package/dist/primitives/settings-list.d.cts +31 -0
  164. package/dist/primitives/settings-list.d.ts +31 -0
  165. package/dist/primitives/settings-list.js +10 -0
  166. package/dist/primitives/settings-section.cjs +34 -0
  167. package/dist/primitives/settings-section.d.cts +44 -0
  168. package/dist/primitives/settings-section.d.ts +44 -0
  169. package/dist/primitives/settings-section.js +34 -0
  170. package/dist/primitives/sheet.d.cts +9 -9
  171. package/dist/primitives/sheet.d.ts +9 -9
  172. package/dist/primitives/short-video.cjs +110 -0
  173. package/dist/primitives/short-video.d.cts +30 -0
  174. package/dist/primitives/short-video.d.ts +30 -0
  175. package/dist/primitives/short-video.js +110 -0
  176. package/dist/primitives/stats-card.cjs +46 -0
  177. package/dist/primitives/stats-card.d.cts +19 -0
  178. package/dist/primitives/stats-card.d.ts +19 -0
  179. package/dist/primitives/stats-card.js +46 -0
  180. package/dist/primitives/stats-strip.cjs +38 -0
  181. package/dist/primitives/stats-strip.d.cts +24 -0
  182. package/dist/primitives/stats-strip.d.ts +24 -0
  183. package/dist/primitives/stats-strip.js +38 -0
  184. package/dist/primitives/step-list.cjs +32 -0
  185. package/dist/primitives/step-list.d.cts +19 -0
  186. package/dist/primitives/step-list.d.ts +19 -0
  187. package/dist/primitives/step-list.js +32 -0
  188. package/dist/primitives/steps.cjs +77 -0
  189. package/dist/primitives/steps.d.cts +35 -0
  190. package/dist/primitives/steps.d.ts +35 -0
  191. package/dist/primitives/steps.js +77 -0
  192. package/dist/primitives/tabbed-page-header.cjs +53 -0
  193. package/dist/primitives/tabbed-page-header.d.cts +26 -0
  194. package/dist/primitives/tabbed-page-header.d.ts +26 -0
  195. package/dist/primitives/tabbed-page-header.js +53 -0
  196. package/dist/primitives/theme-selector.cjs +17 -17
  197. package/dist/primitives/theme-selector.js +5 -5
  198. package/dist/primitives/voice-dictation-button.cjs +5 -5
  199. package/dist/primitives/voice-dictation-button.js +4 -4
  200. package/dist/primitives/voice-session-controls.cjs +4 -4
  201. package/dist/primitives/voice-session-controls.js +3 -3
  202. package/dist/primitives/workflow-assistant.cjs +5 -5
  203. package/dist/primitives/workflow-assistant.js +3 -3
  204. package/package.json +312 -1
  205. package/src/styles/components/poster.css +42 -1
  206. package/dist/{chunk-5OF6D3GH.js → chunk-4TJBXXUE.js} +3 -3
  207. package/dist/{chunk-DILYV4FI.js → chunk-7ZRFXJVN.js} +3 -3
  208. package/dist/{chunk-YYFVG5A6.cjs → chunk-D46FNEZ5.cjs} +2 -2
  209. package/dist/{chunk-NKWHDI4C.cjs → chunk-FB3VY2PL.cjs} +2 -2
  210. package/dist/{chunk-MW67PHAQ.cjs → chunk-GUVQAWUW.cjs} +9 -9
  211. package/dist/{chunk-WHDHUYS6.js → chunk-HBRVOGLA.js} +3 -3
  212. package/dist/{chunk-FARCLWLU.cjs → chunk-HHF5DEKM.cjs} +3 -3
  213. package/dist/{chunk-TWCJMFST.js → chunk-O42YC6ZQ.js} +3 -3
  214. package/dist/{chunk-ZJFYOXSM.cjs → chunk-SRVRNHCX.cjs} +2 -2
  215. package/dist/{chunk-UFFHGKI7.js → chunk-SW4T3O7M.js} +9 -9
  216. package/dist/{chunk-62UTAG2C.js → chunk-ULZB4A2I.js} +3 -3
  217. package/dist/{chunk-ZLEM2SAU.cjs → chunk-Z3JJSNR5.cjs} +2 -2
@@ -0,0 +1,110 @@
1
+ "use client";
2
+ "use client";
3
+ import {
4
+ cn
5
+ } from "../chunk-G6SRSWXB.js";
6
+
7
+ // src/primitives/short-video.tsx
8
+ import { useRef, useState } from "react";
9
+ import { Play, Pause, Volume2, VolumeX } from "lucide-react";
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+ function formatDuration(sec) {
12
+ const m = Math.floor(sec / 60);
13
+ const s = Math.floor(sec % 60);
14
+ return `${m}:${s.toString().padStart(2, "0")}`;
15
+ }
16
+ function ShortVideo({
17
+ src,
18
+ poster,
19
+ durationSec,
20
+ orientation = "portrait",
21
+ caption,
22
+ maxWidth = 320,
23
+ className
24
+ }) {
25
+ const videoRef = useRef(null);
26
+ const [playing, setPlaying] = useState(false);
27
+ const [muted, setMuted] = useState(false);
28
+ const [started, setStarted] = useState(false);
29
+ const togglePlay = () => {
30
+ const el = videoRef.current;
31
+ if (!el) return;
32
+ if (el.paused) {
33
+ void el.play();
34
+ setStarted(true);
35
+ } else {
36
+ el.pause();
37
+ }
38
+ };
39
+ const toggleMute = () => {
40
+ const el = videoRef.current;
41
+ if (!el) return;
42
+ el.muted = !el.muted;
43
+ setMuted(el.muted);
44
+ };
45
+ return /* @__PURE__ */ jsxs("figure", { className: cn("flex flex-col gap-2", className), style: { maxWidth }, children: [
46
+ /* @__PURE__ */ jsxs(
47
+ "div",
48
+ {
49
+ className: cn(
50
+ "group relative overflow-hidden rounded-2xl border bg-muted",
51
+ orientation === "portrait" ? "aspect-[9/16]" : "aspect-video"
52
+ ),
53
+ children: [
54
+ /* @__PURE__ */ jsx(
55
+ "video",
56
+ {
57
+ ref: videoRef,
58
+ src,
59
+ poster,
60
+ preload: "metadata",
61
+ playsInline: true,
62
+ className: "h-full w-full object-cover",
63
+ onPlay: () => setPlaying(true),
64
+ onPause: () => setPlaying(false),
65
+ onEnded: () => setPlaying(false),
66
+ onClick: togglePlay
67
+ }
68
+ ),
69
+ !started && /* @__PURE__ */ jsx(
70
+ "button",
71
+ {
72
+ type: "button",
73
+ onClick: togglePlay,
74
+ "aria-label": "Play video",
75
+ className: "absolute inset-0 flex items-center justify-center bg-black/20 transition-colors hover:bg-black/30",
76
+ children: /* @__PURE__ */ jsx("span", { className: "flex size-16 items-center justify-center rounded-full bg-background/90 shadow-lg backdrop-blur-sm transition-transform group-hover:scale-105", children: /* @__PURE__ */ jsx(Play, { className: "ml-1 size-7 text-foreground" }) })
77
+ }
78
+ ),
79
+ !started && durationSec ? /* @__PURE__ */ jsx("span", { className: "absolute bottom-3 right-3 rounded-full bg-black/60 px-2 py-0.5 font-mono text-[11px] font-medium text-white", children: formatDuration(durationSec) }) : null,
80
+ started && /* @__PURE__ */ jsxs("div", { className: "absolute inset-x-0 bottom-0 flex items-center justify-between gap-2 bg-gradient-to-t from-black/60 to-transparent p-3 opacity-0 transition-opacity group-hover:opacity-100", children: [
81
+ /* @__PURE__ */ jsx(
82
+ "button",
83
+ {
84
+ type: "button",
85
+ onClick: togglePlay,
86
+ "aria-label": playing ? "Pause" : "Play",
87
+ className: "flex size-9 items-center justify-center rounded-full bg-background/90 text-foreground",
88
+ children: playing ? /* @__PURE__ */ jsx(Pause, { className: "size-4" }) : /* @__PURE__ */ jsx(Play, { className: "ml-0.5 size-4" })
89
+ }
90
+ ),
91
+ /* @__PURE__ */ jsx(
92
+ "button",
93
+ {
94
+ type: "button",
95
+ onClick: toggleMute,
96
+ "aria-label": muted ? "Unmute" : "Mute",
97
+ className: "flex size-9 items-center justify-center rounded-full bg-background/90 text-foreground",
98
+ children: muted ? /* @__PURE__ */ jsx(VolumeX, { className: "size-4" }) : /* @__PURE__ */ jsx(Volume2, { className: "size-4" })
99
+ }
100
+ )
101
+ ] })
102
+ ]
103
+ }
104
+ ),
105
+ caption && /* @__PURE__ */ jsx("figcaption", { className: "text-sm text-muted-foreground", children: caption })
106
+ ] });
107
+ }
108
+ export {
109
+ ShortVideo
110
+ };
@@ -0,0 +1,46 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
+
3
+
4
+
5
+
6
+
7
+ var _chunkR3DQS6U4cjs = require('../chunk-R3DQS6U4.cjs');
8
+ require('../chunk-KWLSBTB2.cjs');
9
+
10
+ // src/primitives/stats-card.tsx
11
+ var _react = require('react');
12
+ var _jsxruntime = require('react/jsx-runtime');
13
+ function StatsCard({
14
+ title,
15
+ value,
16
+ icon,
17
+ change,
18
+ changeType
19
+ }) {
20
+ const iconNode = _react.isValidElement.call(void 0, icon) ? icon : /* @__PURE__ */ (() => {
21
+ const Icon = icon;
22
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Icon, { className: "h-4 w-4 text-muted-foreground" });
23
+ })();
24
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkR3DQS6U4cjs.Card, { children: [
25
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkR3DQS6U4cjs.CardHeader, { className: "flex flex-row items-center justify-between space-y-0 pb-2", children: [
26
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR3DQS6U4cjs.CardTitle, { className: "text-sm font-medium", children: title }),
27
+ iconNode
28
+ ] }),
29
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkR3DQS6U4cjs.CardContent, { children: [
30
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "text-2xl font-bold", children: value }),
31
+ change && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
32
+ "p",
33
+ {
34
+ className: `text-xs ${changeType === "positive" ? "text-green-500" : "text-red-500"}`,
35
+ children: [
36
+ change,
37
+ " from last month"
38
+ ]
39
+ }
40
+ )
41
+ ] })
42
+ ] });
43
+ }
44
+
45
+
46
+ exports.StatsCard = StatsCard;
@@ -0,0 +1,19 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+ import { LucideIcon } from 'lucide-react';
4
+
5
+ interface StatsCardProps {
6
+ title: string;
7
+ value: string;
8
+ /**
9
+ * Lucide component reference OR an instantiated element. Pass an
10
+ * element when calling from a server component (component references
11
+ * can't cross the server→client boundary).
12
+ */
13
+ icon: LucideIcon | ReactNode;
14
+ change?: string;
15
+ changeType?: "positive" | "negative";
16
+ }
17
+ declare function StatsCard({ title, value, icon, change, changeType, }: StatsCardProps): react_jsx_runtime.JSX.Element;
18
+
19
+ export { StatsCard };
@@ -0,0 +1,19 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+ import { LucideIcon } from 'lucide-react';
4
+
5
+ interface StatsCardProps {
6
+ title: string;
7
+ value: string;
8
+ /**
9
+ * Lucide component reference OR an instantiated element. Pass an
10
+ * element when calling from a server component (component references
11
+ * can't cross the server→client boundary).
12
+ */
13
+ icon: LucideIcon | ReactNode;
14
+ change?: string;
15
+ changeType?: "positive" | "negative";
16
+ }
17
+ declare function StatsCard({ title, value, icon, change, changeType, }: StatsCardProps): react_jsx_runtime.JSX.Element;
18
+
19
+ export { StatsCard };
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ import {
3
+ Card,
4
+ CardContent,
5
+ CardHeader,
6
+ CardTitle
7
+ } from "../chunk-35YMAIEL.js";
8
+ import "../chunk-G6SRSWXB.js";
9
+
10
+ // src/primitives/stats-card.tsx
11
+ import { isValidElement } from "react";
12
+ import { jsx, jsxs } from "react/jsx-runtime";
13
+ function StatsCard({
14
+ title,
15
+ value,
16
+ icon,
17
+ change,
18
+ changeType
19
+ }) {
20
+ const iconNode = isValidElement(icon) ? icon : /* @__PURE__ */ (() => {
21
+ const Icon = icon;
22
+ return /* @__PURE__ */ jsx(Icon, { className: "h-4 w-4 text-muted-foreground" });
23
+ })();
24
+ return /* @__PURE__ */ jsxs(Card, { children: [
25
+ /* @__PURE__ */ jsxs(CardHeader, { className: "flex flex-row items-center justify-between space-y-0 pb-2", children: [
26
+ /* @__PURE__ */ jsx(CardTitle, { className: "text-sm font-medium", children: title }),
27
+ iconNode
28
+ ] }),
29
+ /* @__PURE__ */ jsxs(CardContent, { children: [
30
+ /* @__PURE__ */ jsx("div", { className: "text-2xl font-bold", children: value }),
31
+ change && /* @__PURE__ */ jsxs(
32
+ "p",
33
+ {
34
+ className: `text-xs ${changeType === "positive" ? "text-green-500" : "text-red-500"}`,
35
+ children: [
36
+ change,
37
+ " from last month"
38
+ ]
39
+ }
40
+ )
41
+ ] })
42
+ ] });
43
+ }
44
+ export {
45
+ StatsCard
46
+ };
@@ -0,0 +1,38 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }"use client";
2
+
3
+
4
+
5
+ var _chunkR3DQS6U4cjs = require('../chunk-R3DQS6U4.cjs');
6
+
7
+
8
+ var _chunkEJP2L5QVcjs = require('../chunk-EJP2L5QV.cjs');
9
+
10
+
11
+ var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
12
+
13
+ // src/primitives/stats-strip.tsx
14
+ var _jsxruntime = require('react/jsx-runtime');
15
+ var COLS = {
16
+ 3: "sm:grid-cols-3",
17
+ 4: "sm:grid-cols-4",
18
+ 5: "sm:grid-cols-5",
19
+ 6: "sm:grid-cols-6"
20
+ };
21
+ function StatsStrip({ items, columns = 5, className }) {
22
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "grid grid-cols-2 gap-2", _nullishCoalesce(COLS[columns], () => ( COLS[5])), className), children: items.map((item, i) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR3DQS6U4cjs.Card, { children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkR3DQS6U4cjs.CardContent, { className: "py-3 px-4", children: [
23
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "text-[10px] uppercase tracking-wider text-muted-foreground", children: item.label }),
24
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
25
+ "div",
26
+ {
27
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
28
+ "text-2xl font-semibold",
29
+ item.tone ? _chunkEJP2L5QVcjs.statusColors[item.tone].icon : "text-foreground"
30
+ ),
31
+ children: item.value
32
+ }
33
+ )
34
+ ] }) }, i)) });
35
+ }
36
+
37
+
38
+ exports.StatsStrip = StatsStrip;
@@ -0,0 +1,24 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+ import { StatusColorKey } from '../lib/status-colors.cjs';
4
+
5
+ interface StatsStripItem {
6
+ label: ReactNode;
7
+ value: ReactNode;
8
+ /** Tone for the value text. Maps to the kit's standard token palette. */
9
+ tone?: StatusColorKey;
10
+ }
11
+ interface StatsStripProps {
12
+ items: StatsStripItem[];
13
+ /** Columns at the `sm:` breakpoint. Mobile is always 2 cols. */
14
+ columns?: 3 | 4 | 5 | 6;
15
+ className?: string;
16
+ }
17
+ /**
18
+ * Horizontal strip of metric cards — useful for "X total / Y this week
19
+ * / Z verified" page headers. Each card is composed of `Card` +
20
+ * `CardContent`; coloured tones map to `status-colors`.
21
+ */
22
+ declare function StatsStrip({ items, columns, className }: StatsStripProps): react_jsx_runtime.JSX.Element;
23
+
24
+ export { StatsStrip, type StatsStripItem, type StatsStripProps };
@@ -0,0 +1,24 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+ import { StatusColorKey } from '../lib/status-colors.js';
4
+
5
+ interface StatsStripItem {
6
+ label: ReactNode;
7
+ value: ReactNode;
8
+ /** Tone for the value text. Maps to the kit's standard token palette. */
9
+ tone?: StatusColorKey;
10
+ }
11
+ interface StatsStripProps {
12
+ items: StatsStripItem[];
13
+ /** Columns at the `sm:` breakpoint. Mobile is always 2 cols. */
14
+ columns?: 3 | 4 | 5 | 6;
15
+ className?: string;
16
+ }
17
+ /**
18
+ * Horizontal strip of metric cards — useful for "X total / Y this week
19
+ * / Z verified" page headers. Each card is composed of `Card` +
20
+ * `CardContent`; coloured tones map to `status-colors`.
21
+ */
22
+ declare function StatsStrip({ items, columns, className }: StatsStripProps): react_jsx_runtime.JSX.Element;
23
+
24
+ export { StatsStrip, type StatsStripItem, type StatsStripProps };
@@ -0,0 +1,38 @@
1
+ "use client";
2
+ import {
3
+ Card,
4
+ CardContent
5
+ } from "../chunk-35YMAIEL.js";
6
+ import {
7
+ statusColors
8
+ } from "../chunk-F7JHSZNT.js";
9
+ import {
10
+ cn
11
+ } from "../chunk-G6SRSWXB.js";
12
+
13
+ // src/primitives/stats-strip.tsx
14
+ import { jsx, jsxs } from "react/jsx-runtime";
15
+ var COLS = {
16
+ 3: "sm:grid-cols-3",
17
+ 4: "sm:grid-cols-4",
18
+ 5: "sm:grid-cols-5",
19
+ 6: "sm:grid-cols-6"
20
+ };
21
+ function StatsStrip({ items, columns = 5, className }) {
22
+ return /* @__PURE__ */ jsx("div", { className: cn("grid grid-cols-2 gap-2", COLS[columns] ?? COLS[5], className), children: items.map((item, i) => /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, { className: "py-3 px-4", children: [
23
+ /* @__PURE__ */ jsx("div", { className: "text-[10px] uppercase tracking-wider text-muted-foreground", children: item.label }),
24
+ /* @__PURE__ */ jsx(
25
+ "div",
26
+ {
27
+ className: cn(
28
+ "text-2xl font-semibold",
29
+ item.tone ? statusColors[item.tone].icon : "text-foreground"
30
+ ),
31
+ children: item.value
32
+ }
33
+ )
34
+ ] }) }, i)) });
35
+ }
36
+ export {
37
+ StatsStrip
38
+ };
@@ -0,0 +1,32 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }"use client";
2
+
3
+
4
+ var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
5
+
6
+ // src/primitives/step-list.tsx
7
+ var _react = require('react');
8
+ var _jsxruntime = require('react/jsx-runtime');
9
+
10
+ function Step({ n, children, className }) {
11
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "flex items-start gap-3", className), children: [
12
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "flex-shrink-0 inline-flex items-center justify-center h-5 w-5 rounded-full bg-primary text-primary-foreground text-[11px] font-medium", children: n }),
13
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "text-sm flex-1", children })
14
+ ] });
15
+ }
16
+ function StepList({ children, spacing = "normal", className }) {
17
+ const spacingClass = spacing === "tight" ? "space-y-2" : spacing === "loose" ? "space-y-4" : "space-y-3";
18
+ let counter = 0;
19
+ const numbered = _react.Children.map(children, (child) => {
20
+ if (!_react.isValidElement.call(void 0, child)) return child;
21
+ const stepChild = child;
22
+ if (stepChild.type !== Step) return stepChild;
23
+ counter += 1;
24
+ if (stepChild.props.n != null) return stepChild;
25
+ return /* @__PURE__ */ _react.createElement.call(void 0, Step, { ...stepChild.props, n: counter, key: _nullishCoalesce(stepChild.key, () => ( counter)) });
26
+ });
27
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunkKWLSBTB2cjs.cn.call(void 0, spacingClass, className), children: numbered });
28
+ }
29
+
30
+
31
+
32
+ exports.Step = Step; exports.StepList = StepList;
@@ -0,0 +1,19 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ interface StepProps {
5
+ /** Explicit number. Omit to let `StepList` auto-number. */
6
+ n?: number;
7
+ children: ReactNode;
8
+ className?: string;
9
+ }
10
+ declare function Step({ n, children, className }: StepProps): react_jsx_runtime.JSX.Element;
11
+ interface StepListProps {
12
+ children: ReactNode;
13
+ /** Vertical spacing between steps. Defaults to `space-y-3`. */
14
+ spacing?: "tight" | "normal" | "loose";
15
+ className?: string;
16
+ }
17
+ declare function StepList({ children, spacing, className }: StepListProps): react_jsx_runtime.JSX.Element;
18
+
19
+ export { Step, StepList, type StepListProps, type StepProps };
@@ -0,0 +1,19 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ interface StepProps {
5
+ /** Explicit number. Omit to let `StepList` auto-number. */
6
+ n?: number;
7
+ children: ReactNode;
8
+ className?: string;
9
+ }
10
+ declare function Step({ n, children, className }: StepProps): react_jsx_runtime.JSX.Element;
11
+ interface StepListProps {
12
+ children: ReactNode;
13
+ /** Vertical spacing between steps. Defaults to `space-y-3`. */
14
+ spacing?: "tight" | "normal" | "loose";
15
+ className?: string;
16
+ }
17
+ declare function StepList({ children, spacing, className }: StepListProps): react_jsx_runtime.JSX.Element;
18
+
19
+ export { Step, StepList, type StepListProps, type StepProps };
@@ -0,0 +1,32 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "../chunk-G6SRSWXB.js";
5
+
6
+ // src/primitives/step-list.tsx
7
+ import { Children, isValidElement } from "react";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ import { createElement } from "react";
10
+ function Step({ n, children, className }) {
11
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex items-start gap-3", className), children: [
12
+ /* @__PURE__ */ jsx("span", { className: "flex-shrink-0 inline-flex items-center justify-center h-5 w-5 rounded-full bg-primary text-primary-foreground text-[11px] font-medium", children: n }),
13
+ /* @__PURE__ */ jsx("div", { className: "text-sm flex-1", children })
14
+ ] });
15
+ }
16
+ function StepList({ children, spacing = "normal", className }) {
17
+ const spacingClass = spacing === "tight" ? "space-y-2" : spacing === "loose" ? "space-y-4" : "space-y-3";
18
+ let counter = 0;
19
+ const numbered = Children.map(children, (child) => {
20
+ if (!isValidElement(child)) return child;
21
+ const stepChild = child;
22
+ if (stepChild.type !== Step) return stepChild;
23
+ counter += 1;
24
+ if (stepChild.props.n != null) return stepChild;
25
+ return /* @__PURE__ */ createElement(Step, { ...stepChild.props, n: counter, key: stepChild.key ?? counter });
26
+ });
27
+ return /* @__PURE__ */ jsx("div", { className: cn(spacingClass, className), children: numbered });
28
+ }
29
+ export {
30
+ Step,
31
+ StepList
32
+ };
@@ -0,0 +1,77 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
+
3
+
4
+ var _chunkHTTRUJQUcjs = require('../chunk-HTTRUJQU.cjs');
5
+
6
+
7
+ var _chunk6T2EULKNcjs = require('../chunk-6T2EULKN.cjs');
8
+
9
+
10
+ var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
11
+
12
+ // src/primitives/steps.tsx
13
+ var _jsxruntime = require('react/jsx-runtime');
14
+ function Steps({
15
+ eyebrow,
16
+ title,
17
+ description,
18
+ caption,
19
+ items,
20
+ variant = "numbered",
21
+ tone = "default",
22
+ className,
23
+ id,
24
+ marginTop = "none"
25
+ }) {
26
+ const cols = items.length === 2 ? "md:grid-cols-2" : "md:grid-cols-3";
27
+ const isList = variant === "list";
28
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkHTTRUJQUcjs.MarketingSection, { tone, width: "widest", className: _chunkKWLSBTB2cjs.cn.call(void 0, marginTop === "md" && "mt-4", className), id, children: [
29
+ (eyebrow || title || description || caption) && (isList ? (
30
+ // List header: left-aligned, with the caption pinned to the right.
31
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mb-10 flex flex-col gap-4 md:mb-14 md:flex-row md:items-end md:justify-between", children: [
32
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { children: [
33
+ eyebrow && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk6T2EULKNcjs.Eyebrow, { className: "mb-3 block", children: eyebrow }),
34
+ title && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h2", { className: "text-3xl font-medium leading-[1.1] tracking-tight md:text-4xl", children: title }),
35
+ description && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "mt-4 max-w-xl text-base leading-relaxed text-muted-foreground md:text-lg", children: description })
36
+ ] }),
37
+ caption && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk6T2EULKNcjs.Eyebrow, { className: "shrink-0 md:pb-1.5", children: caption })
38
+ ] })
39
+ ) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mx-auto mb-12 max-w-2xl text-center md:mb-16", children: [
40
+ eyebrow && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk6T2EULKNcjs.Eyebrow, { className: "mb-3 block", children: eyebrow }),
41
+ title && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h2", { className: "text-3xl font-medium tracking-tight md:text-4xl", children: title }),
42
+ description && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "mt-4 text-base leading-relaxed text-muted-foreground md:text-lg", children: description })
43
+ ] })),
44
+ isList ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { children: items.map((step, i) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
45
+ "div",
46
+ {
47
+ className: "grid grid-cols-1 gap-2 border-t border-border py-8 md:grid-cols-[5rem_1fr_1.15fr] md:items-baseline md:gap-10 md:py-10",
48
+ children: [
49
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "font-mono text-3xl font-medium tabular-nums text-foreground/20 md:text-4xl", children: String(i + 1).padStart(2, "0") }),
50
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h3", { className: "text-xl font-medium tracking-tight md:text-2xl", children: step.title }),
51
+ step.description && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-base leading-relaxed text-muted-foreground", children: step.description })
52
+ ]
53
+ },
54
+ i
55
+ )) }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "grid gap-8 md:gap-12", cols), children: items.map(
56
+ (step, i) => variant === "cards" ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
57
+ "div",
58
+ {
59
+ className: "rounded-xl border border-border bg-background p-6 text-left",
60
+ children: [
61
+ step.icon ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "mb-4 inline-flex h-10 w-10 items-center justify-center rounded-lg bg-muted text-foreground [&_svg]:h-5 [&_svg]:w-5", children: step.icon }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "mb-4 font-mono text-sm text-muted-foreground", children: String(i + 1).padStart(2, "0") }),
62
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h3", { className: "text-lg font-medium tracking-tight", children: step.title }),
63
+ step.description && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "mt-2 text-base leading-relaxed text-muted-foreground", children: step.description })
64
+ ]
65
+ },
66
+ i
67
+ ) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "text-center", children: [
68
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "mx-auto mb-4 font-mono text-3xl font-medium tabular-nums text-foreground/30", children: String(i + 1).padStart(2, "0") }),
69
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h3", { className: "text-lg font-medium tracking-tight md:text-xl", children: step.title }),
70
+ step.description && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "mx-auto mt-2 max-w-xs text-base leading-relaxed text-muted-foreground", children: step.description })
71
+ ] }, i)
72
+ ) })
73
+ ] });
74
+ }
75
+
76
+
77
+ exports.Steps = Steps;
@@ -0,0 +1,35 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ type Step = {
5
+ title: ReactNode;
6
+ description?: ReactNode;
7
+ /** Rendered icon element (server-safe). Used by the "cards" variant. */
8
+ icon?: ReactNode;
9
+ };
10
+ /**
11
+ * Steps — a "how it works" section.
12
+ *
13
+ * - "numbered" → big mono number + title + copy, centered columns (default)
14
+ * - "cards" → bordered cards with an icon + title + copy
15
+ * - "list" → editorial rule-separated rows (index · title · copy), with a
16
+ * left-aligned header and an optional right-aligned `caption`
17
+ *
18
+ * For the tabbed two-column "how it works" layout, use HowItWorksTabs.
19
+ */
20
+ interface StepsProps {
21
+ eyebrow?: ReactNode;
22
+ title?: ReactNode;
23
+ description?: ReactNode;
24
+ /** Right-aligned header note (the "list" variant), e.g. "SPEC → QUEUE → DECISION". */
25
+ caption?: ReactNode;
26
+ items: Step[];
27
+ variant?: "numbered" | "cards" | "list";
28
+ tone?: "default" | "muted" | "inverted";
29
+ className?: string;
30
+ id?: string;
31
+ marginTop?: "none" | "md";
32
+ }
33
+ declare function Steps({ eyebrow, title, description, caption, items, variant, tone, className, id, marginTop, }: StepsProps): react_jsx_runtime.JSX.Element;
34
+
35
+ export { type Step, Steps, type StepsProps };
@@ -0,0 +1,35 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ type Step = {
5
+ title: ReactNode;
6
+ description?: ReactNode;
7
+ /** Rendered icon element (server-safe). Used by the "cards" variant. */
8
+ icon?: ReactNode;
9
+ };
10
+ /**
11
+ * Steps — a "how it works" section.
12
+ *
13
+ * - "numbered" → big mono number + title + copy, centered columns (default)
14
+ * - "cards" → bordered cards with an icon + title + copy
15
+ * - "list" → editorial rule-separated rows (index · title · copy), with a
16
+ * left-aligned header and an optional right-aligned `caption`
17
+ *
18
+ * For the tabbed two-column "how it works" layout, use HowItWorksTabs.
19
+ */
20
+ interface StepsProps {
21
+ eyebrow?: ReactNode;
22
+ title?: ReactNode;
23
+ description?: ReactNode;
24
+ /** Right-aligned header note (the "list" variant), e.g. "SPEC → QUEUE → DECISION". */
25
+ caption?: ReactNode;
26
+ items: Step[];
27
+ variant?: "numbered" | "cards" | "list";
28
+ tone?: "default" | "muted" | "inverted";
29
+ className?: string;
30
+ id?: string;
31
+ marginTop?: "none" | "md";
32
+ }
33
+ declare function Steps({ eyebrow, title, description, caption, items, variant, tone, className, id, marginTop, }: StepsProps): react_jsx_runtime.JSX.Element;
34
+
35
+ export { type Step, Steps, type StepsProps };