@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,15 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ interface FixedActionBarProps {
5
+ title?: ReactNode;
6
+ description?: ReactNode;
7
+ children: ReactNode;
8
+ width?: "compact" | "narrow" | "wide" | "full";
9
+ actionsWidth?: "auto" | "full";
10
+ className?: string;
11
+ }
12
+ /** Persistent bottom context and action for read-only or transactional pages. */
13
+ declare function FixedActionBar({ title, description, children, width, actionsWidth, className, }: FixedActionBarProps): react_jsx_runtime.JSX.Element;
14
+
15
+ export { FixedActionBar, type FixedActionBarProps };
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ import {
3
+ Text
4
+ } from "../chunk-EIY5LLSP.js";
5
+ import {
6
+ cn
7
+ } from "../chunk-G6SRSWXB.js";
8
+
9
+ // src/primitives/fixed-action-bar.tsx
10
+ import { jsx, jsxs } from "react/jsx-runtime";
11
+ var widthStyles = {
12
+ compact: "max-w-2xl",
13
+ narrow: "max-w-3xl",
14
+ wide: "max-w-5xl",
15
+ full: "max-w-none"
16
+ };
17
+ function FixedActionBar({
18
+ title,
19
+ description,
20
+ children,
21
+ width = "narrow",
22
+ actionsWidth = "auto",
23
+ className
24
+ }) {
25
+ return /* @__PURE__ */ jsx(
26
+ "aside",
27
+ {
28
+ "aria-label": "Page action",
29
+ className: cn(
30
+ "fixed inset-x-0 bottom-0 z-40 border-t border-border bg-background/95 backdrop-blur-sm",
31
+ "pb-[env(safe-area-inset-bottom)] supports-backdrop-filter:bg-background/80",
32
+ className
33
+ ),
34
+ children: /* @__PURE__ */ jsxs("div", { className: cn("mx-auto flex items-center gap-4 px-4 py-3 md:px-6", title ? "justify-between" : "justify-end", widthStyles[width]), children: [
35
+ title && /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
36
+ /* @__PURE__ */ jsx(Text, { className: "truncate font-medium", children: title }),
37
+ description && /* @__PURE__ */ jsx(Text, { variant: "muted", className: "text-sm", children: description })
38
+ ] }),
39
+ /* @__PURE__ */ jsx("div", { className: cn("shrink-0", actionsWidth === "full" && "w-full"), children })
40
+ ] })
41
+ }
42
+ );
43
+ }
44
+ export {
45
+ FixedActionBar
46
+ };
@@ -0,0 +1,65 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }"use client";
2
+ "use client";
3
+
4
+
5
+ var _chunkJDEXZGIYcjs = require('../chunk-JDEXZGIY.cjs');
6
+
7
+
8
+ var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
9
+
10
+ // src/primitives/floating-action-button.tsx
11
+ var _react = require('react');
12
+ var _jsxruntime = require('react/jsx-runtime');
13
+ var FloatingActionButton = _react.forwardRef.call(void 0, function FloatingActionButton2({
14
+ label,
15
+ icon,
16
+ visible = true,
17
+ bottom = "bottom-6",
18
+ side = "right",
19
+ asChild = false,
20
+ children,
21
+ className,
22
+ variant = "default",
23
+ size,
24
+ ...rest
25
+ }, ref) {
26
+ const iconOnly = !asChild && label == null;
27
+ const labelNode = !iconOnly && label != null && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: icon ? "ml-1.5" : void 0, children: label });
28
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
29
+ "div",
30
+ {
31
+ "aria-hidden": !visible,
32
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
33
+ "fixed z-40 transition-all duration-300 ease-out motion-reduce:transition-opacity",
34
+ bottom,
35
+ side === "right" && "right-6 md:right-8",
36
+ side === "left" && "left-6 md:left-8",
37
+ side === "center" && "left-1/2 -translate-x-1/2",
38
+ visible ? "opacity-100 translate-y-0 pointer-events-auto" : "opacity-0 translate-y-3 pointer-events-none"
39
+ ),
40
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
41
+ _chunkJDEXZGIYcjs.Button,
42
+ {
43
+ ref,
44
+ asChild,
45
+ variant,
46
+ size: _nullishCoalesce(size, () => ( (iconOnly ? "icon" : "default"))),
47
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
48
+ "shadow-lg",
49
+ iconOnly ? "rounded-full h-14 w-14" : "rounded-full px-5 h-12",
50
+ className
51
+ ),
52
+ tabIndex: visible ? void 0 : -1,
53
+ ...rest,
54
+ children: asChild ? children : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
55
+ icon,
56
+ labelNode
57
+ ] })
58
+ }
59
+ )
60
+ }
61
+ );
62
+ });
63
+
64
+
65
+ exports.FloatingActionButton = FloatingActionButton;
@@ -0,0 +1,52 @@
1
+ import * as React from 'react';
2
+ import { ReactNode } from 'react';
3
+ import { ButtonProps } from './button.cjs';
4
+ import 'class-variance-authority/types';
5
+ import 'class-variance-authority';
6
+
7
+ interface FloatingActionButtonProps extends Omit<ButtonProps, "children"> {
8
+ /** Text label shown next to the icon. Pass null for icon-only. */
9
+ label?: ReactNode;
10
+ /** Leading icon (lucide-react element, normally). */
11
+ icon?: ReactNode;
12
+ /**
13
+ * When false, the FAB is hidden — slides out + fades out. Typically
14
+ * wired to the `past` boolean from `useScrollPast`. Defaults to true
15
+ * (always visible) so the primitive also works as a standalone FAB.
16
+ */
17
+ visible?: boolean;
18
+ /** Bottom inset (Tailwind utility). Defaults to "bottom-6". */
19
+ bottom?: string;
20
+ /** Horizontal anchor. Defaults to "right". */
21
+ side?: "right" | "left" | "center";
22
+ /**
23
+ * When true, the FAB renders its single child as the trigger element
24
+ * (Radix Slot via Button). Use for next/link integrations.
25
+ *
26
+ * <FloatingActionButton asChild icon={<Plus />} label="New">
27
+ * <Link href="/new" />
28
+ * </FloatingActionButton>
29
+ */
30
+ asChild?: boolean;
31
+ /** Children only used when asChild=true — should be a single element. */
32
+ children?: ReactNode;
33
+ }
34
+ /**
35
+ * Floating action button that lands in the corner with a soft rise +
36
+ * fade once `visible` flips true. Pair with `useScrollPast` to reveal
37
+ * once the page's primary CTA scrolls off-screen.
38
+ *
39
+ * Design notes:
40
+ * - z-40 sits above the page chrome but below modals/sheets (z-50)
41
+ * - rounded-full pill shape with shadow-lg for elevation cue
42
+ * - `pointer-events-none` while hidden so it never blocks underlying
43
+ * content during the fade-out
44
+ * - motion-reduce: skips the rise transition (still fades)
45
+ *
46
+ * For scroll containers that aren't the document, render this inside
47
+ * a positioned ancestor — the `fixed` positioning falls back to
48
+ * relative-to-nearest-transformed-ancestor in those cases.
49
+ */
50
+ declare const FloatingActionButton: React.ForwardRefExoticComponent<FloatingActionButtonProps & React.RefAttributes<HTMLButtonElement>>;
51
+
52
+ export { FloatingActionButton, type FloatingActionButtonProps };
@@ -0,0 +1,52 @@
1
+ import * as React from 'react';
2
+ import { ReactNode } from 'react';
3
+ import { ButtonProps } from './button.js';
4
+ import 'class-variance-authority/types';
5
+ import 'class-variance-authority';
6
+
7
+ interface FloatingActionButtonProps extends Omit<ButtonProps, "children"> {
8
+ /** Text label shown next to the icon. Pass null for icon-only. */
9
+ label?: ReactNode;
10
+ /** Leading icon (lucide-react element, normally). */
11
+ icon?: ReactNode;
12
+ /**
13
+ * When false, the FAB is hidden — slides out + fades out. Typically
14
+ * wired to the `past` boolean from `useScrollPast`. Defaults to true
15
+ * (always visible) so the primitive also works as a standalone FAB.
16
+ */
17
+ visible?: boolean;
18
+ /** Bottom inset (Tailwind utility). Defaults to "bottom-6". */
19
+ bottom?: string;
20
+ /** Horizontal anchor. Defaults to "right". */
21
+ side?: "right" | "left" | "center";
22
+ /**
23
+ * When true, the FAB renders its single child as the trigger element
24
+ * (Radix Slot via Button). Use for next/link integrations.
25
+ *
26
+ * <FloatingActionButton asChild icon={<Plus />} label="New">
27
+ * <Link href="/new" />
28
+ * </FloatingActionButton>
29
+ */
30
+ asChild?: boolean;
31
+ /** Children only used when asChild=true — should be a single element. */
32
+ children?: ReactNode;
33
+ }
34
+ /**
35
+ * Floating action button that lands in the corner with a soft rise +
36
+ * fade once `visible` flips true. Pair with `useScrollPast` to reveal
37
+ * once the page's primary CTA scrolls off-screen.
38
+ *
39
+ * Design notes:
40
+ * - z-40 sits above the page chrome but below modals/sheets (z-50)
41
+ * - rounded-full pill shape with shadow-lg for elevation cue
42
+ * - `pointer-events-none` while hidden so it never blocks underlying
43
+ * content during the fade-out
44
+ * - motion-reduce: skips the rise transition (still fades)
45
+ *
46
+ * For scroll containers that aren't the document, render this inside
47
+ * a positioned ancestor — the `fixed` positioning falls back to
48
+ * relative-to-nearest-transformed-ancestor in those cases.
49
+ */
50
+ declare const FloatingActionButton: React.ForwardRefExoticComponent<FloatingActionButtonProps & React.RefAttributes<HTMLButtonElement>>;
51
+
52
+ export { FloatingActionButton, type FloatingActionButtonProps };
@@ -0,0 +1,65 @@
1
+ "use client";
2
+ "use client";
3
+ import {
4
+ Button
5
+ } from "../chunk-W326GKML.js";
6
+ import {
7
+ cn
8
+ } from "../chunk-G6SRSWXB.js";
9
+
10
+ // src/primitives/floating-action-button.tsx
11
+ import { forwardRef } from "react";
12
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
13
+ var FloatingActionButton = forwardRef(function FloatingActionButton2({
14
+ label,
15
+ icon,
16
+ visible = true,
17
+ bottom = "bottom-6",
18
+ side = "right",
19
+ asChild = false,
20
+ children,
21
+ className,
22
+ variant = "default",
23
+ size,
24
+ ...rest
25
+ }, ref) {
26
+ const iconOnly = !asChild && label == null;
27
+ const labelNode = !iconOnly && label != null && /* @__PURE__ */ jsx("span", { className: icon ? "ml-1.5" : void 0, children: label });
28
+ return /* @__PURE__ */ jsx(
29
+ "div",
30
+ {
31
+ "aria-hidden": !visible,
32
+ className: cn(
33
+ "fixed z-40 transition-all duration-300 ease-out motion-reduce:transition-opacity",
34
+ bottom,
35
+ side === "right" && "right-6 md:right-8",
36
+ side === "left" && "left-6 md:left-8",
37
+ side === "center" && "left-1/2 -translate-x-1/2",
38
+ visible ? "opacity-100 translate-y-0 pointer-events-auto" : "opacity-0 translate-y-3 pointer-events-none"
39
+ ),
40
+ children: /* @__PURE__ */ jsx(
41
+ Button,
42
+ {
43
+ ref,
44
+ asChild,
45
+ variant,
46
+ size: size ?? (iconOnly ? "icon" : "default"),
47
+ className: cn(
48
+ "shadow-lg",
49
+ iconOnly ? "rounded-full h-14 w-14" : "rounded-full px-5 h-12",
50
+ className
51
+ ),
52
+ tabIndex: visible ? void 0 : -1,
53
+ ...rest,
54
+ children: asChild ? children : /* @__PURE__ */ jsxs(Fragment, { children: [
55
+ icon,
56
+ labelNode
57
+ ] })
58
+ }
59
+ )
60
+ }
61
+ );
62
+ });
63
+ export {
64
+ FloatingActionButton
65
+ };
@@ -0,0 +1,38 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
+
3
+
4
+ var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
5
+
6
+ // src/primitives/form-section.tsx
7
+ var _react = require('react');
8
+ var _jsxruntime = require('react/jsx-runtime');
9
+ function FormSection({
10
+ label,
11
+ meta,
12
+ children,
13
+ className
14
+ }) {
15
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "section", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "space-y-3", className), children: [
16
+ (label || meta) && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-baseline justify-between gap-2", children: [
17
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h2", { className: "font-mono text-[0.65rem] uppercase tracking-[0.18em] text-muted-foreground", children: label }),
18
+ meta && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "font-mono text-[0.65rem] uppercase tracking-wider text-muted-foreground", children: meta })
19
+ ] }),
20
+ children
21
+ ] });
22
+ }
23
+ function FormSectionList({ children, className }) {
24
+ const items = _react.Children.toArray(children).filter(Boolean);
25
+ if (items.length === 0) return null;
26
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "space-y-6", className), children: items.map((child, i) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
27
+ "div",
28
+ {
29
+ className: i === 0 ? void 0 : "border-t border-border pt-6",
30
+ children: child
31
+ },
32
+ i
33
+ )) });
34
+ }
35
+
36
+
37
+
38
+ exports.FormSection = FormSection; exports.FormSectionList = FormSectionList;
@@ -0,0 +1,43 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ interface FormSectionProps {
5
+ /**
6
+ * Mono uppercase tracking-wide label. Distinct from
7
+ * <SettingsSection>'s larger h2 heading — FormSection is sized for
8
+ * sub-areas inside a single pane (composer right-rail, sidebar form,
9
+ * multi-area editor) where the label reads as a field-group caption
10
+ * rather than a page heading.
11
+ */
12
+ label: ReactNode;
13
+ /**
14
+ * Right-aligned meta slot, baseline-aligned with the label. Use for
15
+ * small status hints: counts ("4 rules"), pending text ("Saving…"),
16
+ * a reset link. Heavier controls belong inside `children`.
17
+ */
18
+ meta?: ReactNode;
19
+ children: ReactNode;
20
+ className?: string;
21
+ }
22
+ /**
23
+ * Labelled section primitive for form panes. Compose inside a
24
+ * <FormSectionList> to get horizontal dividers + consistent vertical
25
+ * rhythm between adjacent sections.
26
+ */
27
+ declare function FormSection({ label, meta, children, className, }: FormSectionProps): react_jsx_runtime.JSX.Element;
28
+ interface FormSectionListProps {
29
+ children: ReactNode;
30
+ className?: string;
31
+ }
32
+ /**
33
+ * Vertical stack of <FormSection>s with a light horizontal divider
34
+ * between adjacent items — same structural cue as a settings page,
35
+ * scaled for the compact form-pane label style.
36
+ *
37
+ * Filters out null/false children, so conditional sections
38
+ * (`{condition && <FormSection .../>}`) don't produce empty divider
39
+ * rows.
40
+ */
41
+ declare function FormSectionList({ children, className }: FormSectionListProps): react_jsx_runtime.JSX.Element | null;
42
+
43
+ export { FormSection, FormSectionList, type FormSectionListProps, type FormSectionProps };
@@ -0,0 +1,43 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ interface FormSectionProps {
5
+ /**
6
+ * Mono uppercase tracking-wide label. Distinct from
7
+ * <SettingsSection>'s larger h2 heading — FormSection is sized for
8
+ * sub-areas inside a single pane (composer right-rail, sidebar form,
9
+ * multi-area editor) where the label reads as a field-group caption
10
+ * rather than a page heading.
11
+ */
12
+ label: ReactNode;
13
+ /**
14
+ * Right-aligned meta slot, baseline-aligned with the label. Use for
15
+ * small status hints: counts ("4 rules"), pending text ("Saving…"),
16
+ * a reset link. Heavier controls belong inside `children`.
17
+ */
18
+ meta?: ReactNode;
19
+ children: ReactNode;
20
+ className?: string;
21
+ }
22
+ /**
23
+ * Labelled section primitive for form panes. Compose inside a
24
+ * <FormSectionList> to get horizontal dividers + consistent vertical
25
+ * rhythm between adjacent sections.
26
+ */
27
+ declare function FormSection({ label, meta, children, className, }: FormSectionProps): react_jsx_runtime.JSX.Element;
28
+ interface FormSectionListProps {
29
+ children: ReactNode;
30
+ className?: string;
31
+ }
32
+ /**
33
+ * Vertical stack of <FormSection>s with a light horizontal divider
34
+ * between adjacent items — same structural cue as a settings page,
35
+ * scaled for the compact form-pane label style.
36
+ *
37
+ * Filters out null/false children, so conditional sections
38
+ * (`{condition && <FormSection .../>}`) don't produce empty divider
39
+ * rows.
40
+ */
41
+ declare function FormSectionList({ children, className }: FormSectionListProps): react_jsx_runtime.JSX.Element | null;
42
+
43
+ export { FormSection, FormSectionList, type FormSectionListProps, type FormSectionProps };
@@ -0,0 +1,38 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "../chunk-G6SRSWXB.js";
5
+
6
+ // src/primitives/form-section.tsx
7
+ import { Children } from "react";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ function FormSection({
10
+ label,
11
+ meta,
12
+ children,
13
+ className
14
+ }) {
15
+ return /* @__PURE__ */ jsxs("section", { className: cn("space-y-3", className), children: [
16
+ (label || meta) && /* @__PURE__ */ jsxs("div", { className: "flex items-baseline justify-between gap-2", children: [
17
+ /* @__PURE__ */ jsx("h2", { className: "font-mono text-[0.65rem] uppercase tracking-[0.18em] text-muted-foreground", children: label }),
18
+ meta && /* @__PURE__ */ jsx("div", { className: "font-mono text-[0.65rem] uppercase tracking-wider text-muted-foreground", children: meta })
19
+ ] }),
20
+ children
21
+ ] });
22
+ }
23
+ function FormSectionList({ children, className }) {
24
+ const items = Children.toArray(children).filter(Boolean);
25
+ if (items.length === 0) return null;
26
+ return /* @__PURE__ */ jsx("div", { className: cn("space-y-6", className), children: items.map((child, i) => /* @__PURE__ */ jsx(
27
+ "div",
28
+ {
29
+ className: i === 0 ? void 0 : "border-t border-border pt-6",
30
+ children: child
31
+ },
32
+ i
33
+ )) });
34
+ }
35
+ export {
36
+ FormSection,
37
+ FormSectionList
38
+ };
@@ -0,0 +1,52 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
+
3
+
4
+ var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
5
+
6
+ // src/primitives/key-value-grid.tsx
7
+ var _jsxruntime = require('react/jsx-runtime');
8
+ function KeyValueGrid({
9
+ items,
10
+ columns = 2,
11
+ size = "xs",
12
+ className
13
+ }) {
14
+ const colsClass = columns === 3 ? "grid-cols-3" : "grid-cols-2";
15
+ const textClass = size === "xs" ? "text-xs" : "text-sm";
16
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
17
+ "dl",
18
+ {
19
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
20
+ "grid gap-x-3 gap-y-0.5",
21
+ colsClass,
22
+ textClass,
23
+ className
24
+ ),
25
+ children: items.map((item, i) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "contents", children: [
26
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
27
+ "dt",
28
+ {
29
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
30
+ "text-muted-foreground",
31
+ item.emphasis && "font-medium text-foreground"
32
+ ),
33
+ children: item.label
34
+ }
35
+ ),
36
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
37
+ "dd",
38
+ {
39
+ className: _chunkKWLSBTB2cjs.cn.call(void 0,
40
+ "text-right tabular-nums",
41
+ item.emphasis && "font-medium"
42
+ ),
43
+ children: item.value
44
+ }
45
+ )
46
+ ] }, i))
47
+ }
48
+ );
49
+ }
50
+
51
+
52
+ exports.KeyValueGrid = KeyValueGrid;
@@ -0,0 +1,20 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ interface KeyValueGridItem {
5
+ label: ReactNode;
6
+ value: ReactNode;
7
+ /** Render with `font-medium` for a totals/summary row. */
8
+ emphasis?: boolean;
9
+ }
10
+ interface KeyValueGridProps {
11
+ items: KeyValueGridItem[];
12
+ /** Number of columns. Defaults to 2. */
13
+ columns?: 2 | 3;
14
+ /** Visual size. `xs` matches dense popovers; `sm` matches cards. */
15
+ size?: "xs" | "sm";
16
+ className?: string;
17
+ }
18
+ declare function KeyValueGrid({ items, columns, size, className, }: KeyValueGridProps): react_jsx_runtime.JSX.Element;
19
+
20
+ export { KeyValueGrid, type KeyValueGridItem, type KeyValueGridProps };
@@ -0,0 +1,20 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ interface KeyValueGridItem {
5
+ label: ReactNode;
6
+ value: ReactNode;
7
+ /** Render with `font-medium` for a totals/summary row. */
8
+ emphasis?: boolean;
9
+ }
10
+ interface KeyValueGridProps {
11
+ items: KeyValueGridItem[];
12
+ /** Number of columns. Defaults to 2. */
13
+ columns?: 2 | 3;
14
+ /** Visual size. `xs` matches dense popovers; `sm` matches cards. */
15
+ size?: "xs" | "sm";
16
+ className?: string;
17
+ }
18
+ declare function KeyValueGrid({ items, columns, size, className, }: KeyValueGridProps): react_jsx_runtime.JSX.Element;
19
+
20
+ export { KeyValueGrid, type KeyValueGridItem, type KeyValueGridProps };
@@ -0,0 +1,52 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "../chunk-G6SRSWXB.js";
5
+
6
+ // src/primitives/key-value-grid.tsx
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ function KeyValueGrid({
9
+ items,
10
+ columns = 2,
11
+ size = "xs",
12
+ className
13
+ }) {
14
+ const colsClass = columns === 3 ? "grid-cols-3" : "grid-cols-2";
15
+ const textClass = size === "xs" ? "text-xs" : "text-sm";
16
+ return /* @__PURE__ */ jsx(
17
+ "dl",
18
+ {
19
+ className: cn(
20
+ "grid gap-x-3 gap-y-0.5",
21
+ colsClass,
22
+ textClass,
23
+ className
24
+ ),
25
+ children: items.map((item, i) => /* @__PURE__ */ jsxs("div", { className: "contents", children: [
26
+ /* @__PURE__ */ jsx(
27
+ "dt",
28
+ {
29
+ className: cn(
30
+ "text-muted-foreground",
31
+ item.emphasis && "font-medium text-foreground"
32
+ ),
33
+ children: item.label
34
+ }
35
+ ),
36
+ /* @__PURE__ */ jsx(
37
+ "dd",
38
+ {
39
+ className: cn(
40
+ "text-right tabular-nums",
41
+ item.emphasis && "font-medium"
42
+ ),
43
+ children: item.value
44
+ }
45
+ )
46
+ ] }, i))
47
+ }
48
+ );
49
+ }
50
+ export {
51
+ KeyValueGrid
52
+ };
@@ -0,0 +1,34 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
+
3
+
4
+ var _chunkKWLSBTB2cjs = require('../chunk-KWLSBTB2.cjs');
5
+
6
+ // src/primitives/marketing-footer.tsx
7
+ var _jsxruntime = require('react/jsx-runtime');
8
+ function MarketingFooter({
9
+ brand,
10
+ links = [],
11
+ meta,
12
+ renderLink,
13
+ className
14
+ }) {
15
+ const cls = "transition-colors hover:text-foreground";
16
+ const link = (l) => {
17
+ if (renderLink)
18
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: renderLink({ href: l.href, children: l.label, className: cls }) }, l.href);
19
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "a", { href: l.href, className: cls, children: l.label }, l.href);
20
+ };
21
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "footer", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "border-t border-border", className), children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mx-auto flex w-full max-w-5xl flex-wrap items-center justify-between gap-4 px-4 py-6 md:px-6", children: [
22
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex items-center", children: brand }),
23
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-4 font-mono text-xs text-muted-foreground", children: [
24
+ links.map(link),
25
+ meta && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
26
+ links.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-muted-foreground/40", children: "\xB7" }),
27
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: meta })
28
+ ] })
29
+ ] })
30
+ ] }) });
31
+ }
32
+
33
+
34
+ exports.MarketingFooter = MarketingFooter;