@fragment-build/ui 3.2.3 → 4.0.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 (88) hide show
  1. package/README.md +73 -0
  2. package/components/code-snippet/CodeSnippet.d.ts +9 -0
  3. package/components/code-snippet/CodeSnippet.js +14 -4
  4. package/components/code-snippet/CodeSnippet.js.map +1 -1
  5. package/components/code-snippet/code-snippet.css +18 -0
  6. package/components/segmented-control/SegmentedControl.d.ts +16 -0
  7. package/components/segmented-control/SegmentedControl.js +18 -0
  8. package/components/segmented-control/SegmentedControl.js.map +1 -0
  9. package/components/segmented-control/SegmentedControl.styles.d.ts +46 -0
  10. package/components/segmented-control/SegmentedControl.styles.js +20 -0
  11. package/components/segmented-control/SegmentedControl.styles.js.map +1 -0
  12. package/components/segmented-control/segmented-control.css +41 -0
  13. package/fragments/empty-state/EmptyState.d.ts +12 -0
  14. package/fragments/empty-state/EmptyState.js +12 -0
  15. package/fragments/empty-state/EmptyState.js.map +1 -0
  16. package/fragments/empty-state/EmptyState.styles.d.ts +55 -0
  17. package/fragments/empty-state/EmptyState.styles.js +23 -0
  18. package/fragments/empty-state/EmptyState.styles.js.map +1 -0
  19. package/fragments/empty-state/empty-state.css +39 -0
  20. package/fragments/form/FormCard.d.ts +14 -0
  21. package/fragments/form/FormCard.js +14 -0
  22. package/fragments/form/FormCard.js.map +1 -0
  23. package/fragments/form/FormCard.styles.d.ts +49 -0
  24. package/fragments/form/FormCard.styles.js +23 -0
  25. package/fragments/form/FormCard.styles.js.map +1 -0
  26. package/fragments/form/FormSection.d.ts +3 -1
  27. package/fragments/form/FormSection.js +2 -2
  28. package/fragments/form/FormSection.js.map +1 -1
  29. package/fragments/form/FormSection.styles.d.ts +6 -0
  30. package/fragments/form/FormSection.styles.js +2 -0
  31. package/fragments/form/FormSection.styles.js.map +1 -1
  32. package/fragments/form/form-card.css +42 -0
  33. package/fragments/form/form-section.css +22 -10
  34. package/fragments/form/form.css +1 -1
  35. package/fragments/navbar/navbar.css +2 -2
  36. package/fragments/page/PageHeader.d.ts +7 -2
  37. package/fragments/page/PageHeader.js +3 -3
  38. package/fragments/page/PageHeader.js.map +1 -1
  39. package/fragments/page/PageHeader.styles.d.ts +30 -21
  40. package/fragments/page/PageHeader.styles.js +10 -0
  41. package/fragments/page/PageHeader.styles.js.map +1 -1
  42. package/fragments/page/page-header.css +23 -3
  43. package/fragments/save-bar/SaveBar.d.ts +12 -0
  44. package/fragments/save-bar/SaveBar.js +15 -0
  45. package/fragments/save-bar/SaveBar.js.map +1 -0
  46. package/fragments/save-bar/SaveBar.styles.d.ts +37 -0
  47. package/fragments/save-bar/SaveBar.styles.js +16 -0
  48. package/fragments/save-bar/SaveBar.styles.js.map +1 -0
  49. package/fragments/save-bar/save-bar.css +28 -0
  50. package/fragments/shell/shell.css +8 -4
  51. package/fragments/sidebar/Sidebar.js +4 -1
  52. package/fragments/sidebar/Sidebar.js.map +1 -1
  53. package/fragments/sidebar/sidebar.css +52 -30
  54. package/fragments/stat/StatCard.d.ts +29 -0
  55. package/fragments/stat/StatCard.js +20 -0
  56. package/fragments/stat/StatCard.js.map +1 -0
  57. package/fragments/stat/StatCard.styles.d.ts +85 -0
  58. package/fragments/stat/StatCard.styles.js +26 -0
  59. package/fragments/stat/StatCard.styles.js.map +1 -0
  60. package/fragments/stat/stat-card.css +64 -0
  61. package/fragments/widget/Widget.d.ts +9 -2
  62. package/fragments/widget/Widget.js +4 -3
  63. package/fragments/widget/Widget.js.map +1 -1
  64. package/fragments/widget/Widget.styles.d.ts +51 -0
  65. package/fragments/widget/Widget.styles.js +12 -0
  66. package/fragments/widget/Widget.styles.js.map +1 -1
  67. package/fragments/widget/widget.css +49 -4
  68. package/index.css +138 -37
  69. package/index.d.ts +5 -0
  70. package/index.js +5 -0
  71. package/index.js.map +1 -1
  72. package/package.json +1 -1
  73. package/src/components/code-snippet/code-snippet.css +18 -0
  74. package/src/components/segmented-control/segmented-control.css +41 -0
  75. package/src/fragments/empty-state/empty-state.css +39 -0
  76. package/src/fragments/form/form-card.css +42 -0
  77. package/src/fragments/form/form-section.css +22 -10
  78. package/src/fragments/form/form.css +1 -1
  79. package/src/fragments/navbar/navbar.css +2 -2
  80. package/src/fragments/page/page-header.css +23 -3
  81. package/src/fragments/save-bar/save-bar.css +28 -0
  82. package/src/fragments/shell/shell.css +8 -4
  83. package/src/fragments/sidebar/sidebar.css +52 -30
  84. package/src/fragments/stat/stat-card.css +64 -0
  85. package/src/fragments/widget/widget.css +49 -4
  86. package/src/index.css +138 -37
  87. package/src/theme.example.css +26 -0
  88. package/theme.example.css +26 -0
package/README.md CHANGED
@@ -28,6 +28,8 @@ Fragment UI is a design system and React component library which provides alread
28
28
  - [🔧 Configuration](#-configuration)
29
29
  - [`linkComponent`](#linkcomponent)
30
30
  - [Next.js 13+](#nextjs-13)
31
+ - [🎨 Theming](#-theming)
32
+ - [Fragment surfaces](#fragment-surfaces)
31
33
  - [🤝 Contributing](#-contributing)
32
34
  - [👨‍💻 Development](#-development)
33
35
  - [🤝 Community support](#-community-support)
@@ -179,6 +181,77 @@ import { ThemeSwitch } from '@fragment-build/ui';
179
181
  <ThemeSwitch />
180
182
  ```
181
183
 
184
+ ## 🎨 Theming
185
+
186
+ Fragment UI builds on the [HeroUI theme tokens](https://v3.heroui.com/docs/react/getting-started/theming).
187
+ Override any of them in your own stylesheet — see [`theme.example.css`](src/theme.example.css)
188
+ for the full list. Import Fragment UI first, then declare your overrides: both blocks are
189
+ unlayered and equally specific, so the later one wins.
190
+
191
+ ```css
192
+ @import 'tailwindcss';
193
+ @import "@heroui/styles";
194
+ @import "@fragment-build/ui";
195
+
196
+ :root,
197
+ .light,
198
+ [data-theme="light"] {
199
+ --accent: #F56460;
200
+ }
201
+ ```
202
+
203
+ ### Fragment surfaces
204
+
205
+ The `Sidebar` and `Navbar` fragments paint their own surface so they can be themed
206
+ independently of the page. Each defaults to the page surface, so a theme that declares none of
207
+ these renders exactly as it did before.
208
+
209
+ | Token | Default | Applies to |
210
+ | --- | --- | --- |
211
+ | `--sidebar` | `var(--background)` | Sidebar rail (collapsed + expanded) and its mobile bottom nav |
212
+ | `--sidebar-foreground` | `var(--foreground)` | Text, icons and tree guides inside the rail |
213
+ | `--navbar` | `var(--background)` | Navbar topbar and its mobile bottom nav |
214
+ | `--navbar-foreground` | `var(--foreground)` | Text and icons inside the navbar |
215
+
216
+ A tinted rail on a white page:
217
+
218
+ ```css
219
+ :root,
220
+ .light,
221
+ [data-theme="light"] {
222
+ --sidebar: #F7F5F0;
223
+ }
224
+ ```
225
+
226
+ They are also available as Tailwind utilities — `bg-sidebar`, `text-sidebar-foreground`,
227
+ `bg-navbar`, `text-navbar-foreground` — so you can reuse the same surface in your own markup.
228
+
229
+ #### Contrasting rails
230
+
231
+ The interactive states inside the rail are page-level palette roles, not sidebar roles, and
232
+ they do **not** follow `--sidebar` on their own. The active nav pill (`--accent-soft`) is
233
+ translucent, so it composites over whatever the rail is painted and needs nothing. The other
234
+ two do, once the rail contrasts noticeably with the page:
235
+
236
+ | Token | Default | Controls |
237
+ | --- | --- | --- |
238
+ | `--sidebar-default` | `var(--default)` | Hover ground of collapsible nav groups |
239
+ | `--sidebar-accent-soft-foreground` | `var(--accent-soft-foreground)` | Ink of the active nav item and active group |
240
+
241
+ A dark rail on a light page:
242
+
243
+ ```css
244
+ :root,
245
+ .light,
246
+ [data-theme="light"] {
247
+ --sidebar: oklch(21% 0.006 285.89);
248
+ --sidebar-foreground: oklch(99.11% 0 0);
249
+
250
+ --sidebar-default: rgba(255, 255, 255, 0.08);
251
+ --sidebar-accent-soft-foreground: color-mix(in oklab, var(--accent) 70%, var(--sidebar-foreground) 30%);
252
+ }
253
+ ```
254
+
182
255
  ## 🤝 Contributing
183
256
 
184
257
  Feel free to fork and make a Pull Request to this project. All the input is warmly welcome!
@@ -1,5 +1,14 @@
1
1
  export interface CodeSnippetProps {
2
2
  code: string;
3
3
  prefix?: string;
4
+ /**
5
+ * `inline` (default) is a one-line command with the copy button beside it. `block` is a panel
6
+ * for multi-line code, with a header carrying `title` and a labelled copy button.
7
+ */
8
+ variant?: 'inline' | 'block';
9
+ /** The block header's label, e.g. the file or language the snippet belongs to. */
10
+ title?: React.ReactNode;
11
+ copyLabel?: string;
12
+ copiedLabel?: string;
4
13
  }
5
14
  export declare const CodeSnippet: React.FC<CodeSnippetProps>;
@@ -1,15 +1,25 @@
1
1
  'use client';
2
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useState } from 'react';
4
4
  import { Button, Tooltip } from '@heroui/react';
5
5
  import { IconCheck, IconCopy } from '@tabler/icons-react';
6
- export const CodeSnippet = ({ code, prefix = '$' }) => {
6
+ export const CodeSnippet = ({ code, prefix = '$', variant = 'inline', title, copyLabel = 'Copy', copiedLabel = 'Copied', }) => {
7
7
  const [copied, setCopied] = useState(false);
8
8
  const handleCopy = async () => {
9
- await navigator.clipboard.writeText(code);
9
+ try {
10
+ await navigator.clipboard.writeText(code);
11
+ }
12
+ catch {
13
+ // Denied outside a secure context and in some embedded browsers. The code is on screen and
14
+ // selectable either way, so the button simply does not claim a copy that did not happen.
15
+ return;
16
+ }
10
17
  setCopied(true);
11
18
  setTimeout(() => setCopied(false), 2000);
12
19
  };
13
- return (_jsxs("div", { className: "fragment-code-snippet", children: [_jsxs("pre", { className: "fragment-code-snippet__code", children: [prefix && _jsxs("span", { className: "fragment-code-snippet__prefix", children: [prefix, " "] }), code] }), _jsxs(Tooltip, { children: [_jsx(Button, { isIconOnly: true, "aria-label": "Copy to clipboard", size: "sm", variant: "ghost", onPress: handleCopy, children: copied ? _jsx(IconCheck, { size: 14 }) : _jsx(IconCopy, { size: 14 }) }), _jsx(Tooltip.Content, { children: copied ? 'Copied!' : 'Copy to clipboard' })] })] }));
20
+ if (variant === 'block') {
21
+ return (_jsxs("div", { className: "fragment-code-snippet--block", children: [_jsxs("div", { className: "fragment-code-snippet__header", children: [_jsx("span", { className: "fragment-code-snippet__title", children: title }), _jsxs(Button, { "aria-live": "polite", onPress: handleCopy, size: "sm", variant: "ghost", children: [copied ? _jsx(IconCheck, { size: 14 }) : _jsx(IconCopy, { size: 14 }), copied ? copiedLabel : copyLabel] })] }), _jsxs("pre", { className: "fragment-code-snippet__block-code", children: [prefix && _jsxs("span", { className: "fragment-code-snippet__prefix", children: [prefix, " "] }), code] })] }));
22
+ }
23
+ return (_jsxs("div", { className: "fragment-code-snippet", children: [_jsxs("pre", { className: "fragment-code-snippet__code", children: [prefix && _jsxs("span", { className: "fragment-code-snippet__prefix", children: [prefix, " "] }), code] }), _jsxs(Tooltip, { children: [_jsx(Button, { isIconOnly: true, "aria-label": copyLabel, size: "sm", variant: "ghost", onPress: handleCopy, children: copied ? _jsx(IconCheck, { size: 14 }) : _jsx(IconCopy, { size: 14 }) }), _jsx(Tooltip.Content, { children: copied ? copiedLabel : copyLabel })] })] }));
14
24
  };
15
25
  //# sourceMappingURL=CodeSnippet.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CodeSnippet.js","sourceRoot":"","sources":["../../src/components/code-snippet/CodeSnippet.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAO1D,MAAM,CAAC,MAAM,WAAW,GAA+B,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,EAAE,EAAE;IAChF,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5C,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC5B,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1C,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,uBAAuB,aACpC,eAAK,SAAS,EAAC,6BAA6B,aACzC,MAAM,IAAI,gBAAM,SAAS,EAAC,+BAA+B,aAAE,MAAM,SAAS,EAC1E,IAAI,IACD,EACN,MAAC,OAAO,eACN,KAAC,MAAM,IACL,UAAU,sBACC,mBAAmB,EAC9B,IAAI,EAAC,IAAI,EACT,OAAO,EAAC,OAAO,EACf,OAAO,EAAE,UAAU,YAElB,MAAM,CAAC,CAAC,CAAC,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC,CAAC,CAAC,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,GAAI,GACnD,EACT,KAAC,OAAO,CAAC,OAAO,cAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,GAAmB,IACrE,IACN,CACP,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"CodeSnippet.js","sourceRoot":"","sources":["../../src/components/code-snippet/CodeSnippet.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAgB1D,MAAM,CAAC,MAAM,WAAW,GAA+B,CAAC,EACtD,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,OAAO,GAAG,QAAQ,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE,WAAW,GAAG,QAAQ,GAC1F,EAAE,EAAE;IACH,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5C,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,2FAA2F;YAC3F,yFAAyF;YACzF,OAAO;QACT,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC;IAEF,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,CACL,eAAK,SAAS,EAAC,8BAA8B,aAC3C,eAAK,SAAS,EAAC,+BAA+B,aAC5C,eAAM,SAAS,EAAC,8BAA8B,YAAE,KAAK,GAAQ,EAC7D,MAAC,MAAM,iBAAW,QAAQ,EAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,aACtE,MAAM,CAAC,CAAC,CAAC,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC,CAAC,CAAC,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,GAAI,EACzD,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,IAC1B,IACL,EACN,eAAK,SAAS,EAAC,mCAAmC,aAC/C,MAAM,IAAI,gBAAM,SAAS,EAAC,+BAA+B,aAAE,MAAM,SAAS,EAC1E,IAAI,IACD,IACF,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,uBAAuB,aACpC,eAAK,SAAS,EAAC,6BAA6B,aACzC,MAAM,IAAI,gBAAM,SAAS,EAAC,+BAA+B,aAAE,MAAM,SAAS,EAC1E,IAAI,IACD,EACN,MAAC,OAAO,eACN,KAAC,MAAM,IACL,UAAU,sBACE,SAAS,EACrB,IAAI,EAAC,IAAI,EACT,OAAO,EAAC,OAAO,EACf,OAAO,EAAE,UAAU,YAElB,MAAM,CAAC,CAAC,CAAC,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,GAAI,CAAC,CAAC,CAAC,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,GAAI,GACnD,EACT,KAAC,OAAO,CAAC,OAAO,cAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,GAAmB,IAC7D,IACN,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -11,3 +11,21 @@
11
11
  @apply text-muted;
12
12
  }
13
13
  }
14
+
15
+ @layer components {
16
+ .fragment-code-snippet--block {
17
+ @apply overflow-hidden rounded-xl border border-border bg-surface-secondary;
18
+ }
19
+
20
+ .fragment-code-snippet__header {
21
+ @apply flex items-center justify-between gap-2 border-b border-border py-1 pr-1 pl-4;
22
+ }
23
+
24
+ .fragment-code-snippet__title {
25
+ @apply text-xs font-medium text-muted;
26
+ }
27
+
28
+ .fragment-code-snippet__block-code {
29
+ @apply overflow-x-auto px-4 py-3 font-mono text-xs leading-relaxed text-foreground;
30
+ }
31
+ }
@@ -0,0 +1,16 @@
1
+ export interface SegmentedControlOption<K extends string> {
2
+ id: K;
3
+ label: React.ReactNode;
4
+ icon?: React.ReactNode;
5
+ isDisabled?: boolean;
6
+ }
7
+ export interface SegmentedControlProps<K extends string> {
8
+ options: SegmentedControlOption<K>[];
9
+ value: K;
10
+ onChange: (value: K) => void;
11
+ 'aria-label': string;
12
+ size?: 'sm' | 'md';
13
+ fullWidth?: boolean;
14
+ className?: string;
15
+ }
16
+ export declare const SegmentedControl: <K extends string>({ options, value, onChange, size, fullWidth, className, ...props }: SegmentedControlProps<K>) => import("react").JSX.Element;
@@ -0,0 +1,18 @@
1
+ 'use client';
2
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
3
+ /**
4
+ * A small set of mutually exclusive options shown all at once: a time range, a view mode, a metric.
5
+ * A Select hides the alternatives behind a click; for two to five short options this keeps them
6
+ * visible and one click apart.
7
+ */
8
+ import { ToggleButton, ToggleButtonGroup } from '@heroui/react';
9
+ import { segmentedControl } from './SegmentedControl.styles';
10
+ export const SegmentedControl = ({ options, value, onChange, size, fullWidth, className, ...props }) => {
11
+ const v = segmentedControl({ size, fullWidth });
12
+ return (_jsx(ToggleButtonGroup, { "aria-label": props['aria-label'], className: v.base({ className }), disallowEmptySelection: true, isDetached: true, onSelectionChange: (keys) => {
13
+ const next = [...keys][0];
14
+ if (next !== undefined)
15
+ onChange(String(next));
16
+ }, selectedKeys: [value], selectionMode: "single", children: options.map((option) => (_jsxs(ToggleButton, { className: v.item(), id: option.id, isDisabled: option.isDisabled, children: [option.icon, option.label] }, option.id))) }));
17
+ };
18
+ //# sourceMappingURL=SegmentedControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SegmentedControl.js","sourceRoot":"","sources":["../../src/components/segmented-control/SegmentedControl.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAmB7D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAmB,EACjD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,KAAK,EACrC,EAAE,EAAE;IAC7B,MAAM,CAAC,GAAG,gBAAgB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAEhD,OAAO,CACL,KAAC,iBAAiB,kBACJ,KAAK,CAAC,YAAY,CAAC,EAC/B,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,EAChC,sBAAsB,QACtB,UAAU,QACV,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1B,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,IAAI,KAAK,SAAS;gBAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAM,CAAC,CAAC;QACtD,CAAC,EACD,YAAY,EAAE,CAAC,KAAK,CAAC,EACrB,aAAa,EAAC,QAAQ,YAErB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,MAAC,YAAY,IAAC,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,aAC5E,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,KAAK,KAFuE,MAAM,CAAC,EAAE,CAGhF,CAChB,CAAC,GACgB,CACrB,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,46 @@
1
+ export declare const segmentedControl: import("tailwind-variants").TVReturnType<{
2
+ size: {
3
+ sm: {
4
+ base: string;
5
+ };
6
+ md: {};
7
+ };
8
+ fullWidth: {
9
+ true: {
10
+ base: string;
11
+ };
12
+ };
13
+ }, {
14
+ base: string;
15
+ item: string;
16
+ }, undefined, {
17
+ size: {
18
+ sm: {
19
+ base: string;
20
+ };
21
+ md: {};
22
+ };
23
+ fullWidth: {
24
+ true: {
25
+ base: string;
26
+ };
27
+ };
28
+ }, {
29
+ base: string;
30
+ item: string;
31
+ }, import("tailwind-variants").TVReturnTypeLike<{
32
+ size: {
33
+ sm: {
34
+ base: string;
35
+ };
36
+ md: {};
37
+ };
38
+ fullWidth: {
39
+ true: {
40
+ base: string;
41
+ };
42
+ };
43
+ }, {
44
+ base: string;
45
+ item: string;
46
+ }>>;
@@ -0,0 +1,20 @@
1
+ import { tv } from 'tailwind-variants';
2
+ export const segmentedControl = tv({
3
+ slots: {
4
+ base: 'fragment-segmented-control',
5
+ item: 'fragment-segmented-control__item',
6
+ },
7
+ variants: {
8
+ size: {
9
+ sm: { base: 'fragment-segmented-control--sm' },
10
+ md: {},
11
+ },
12
+ fullWidth: {
13
+ true: { base: 'fragment-segmented-control--full-width' },
14
+ },
15
+ },
16
+ defaultVariants: {
17
+ size: 'md',
18
+ },
19
+ });
20
+ //# sourceMappingURL=SegmentedControl.styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SegmentedControl.styles.js","sourceRoot":"","sources":["../../src/components/segmented-control/SegmentedControl.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAEvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;IACjC,KAAK,EAAE;QACL,IAAI,EAAE,4BAA4B;QAClC,IAAI,EAAE,kCAAkC;KACzC;IACD,QAAQ,EAAE;QACR,IAAI,EAAE;YACJ,EAAE,EAAE,EAAE,IAAI,EAAE,gCAAgC,EAAE;YAC9C,EAAE,EAAE,EAAE;SACP;QACD,SAAS,EAAE;YACT,IAAI,EAAE,EAAE,IAAI,EAAE,wCAAwC,EAAE;SACzD;KACF;IACD,eAAe,EAAE;QACf,IAAI,EAAE,IAAI;KACX;CACF,CAAC,CAAC"}
@@ -0,0 +1,41 @@
1
+ @layer components {
2
+ .fragment-segmented-control {
3
+ @apply inline-flex items-center gap-0.5 rounded-[var(--field-radius)] bg-default p-0.5;
4
+ }
5
+
6
+ .fragment-segmented-control--full-width {
7
+ @apply flex w-full;
8
+
9
+ .fragment-segmented-control__item {
10
+ @apply flex-1;
11
+ }
12
+ }
13
+
14
+ .fragment-segmented-control__item.toggle-button {
15
+ @apply h-8 rounded-[calc(var(--field-radius)-0.125rem)] px-3 text-sm font-medium text-muted md:h-8;
16
+
17
+ --toggle-button-bg: transparent;
18
+ --toggle-button-bg-hover: transparent;
19
+ --toggle-button-bg-pressed: transparent;
20
+ --toggle-button-bg-selected: var(--surface);
21
+ --toggle-button-bg-selected-hover: var(--surface);
22
+ --toggle-button-bg-selected-pressed: var(--surface);
23
+ --toggle-button-fg-selected: var(--surface-foreground, var(--foreground));
24
+
25
+ &:hover, &[data-hovered="true"] {
26
+ @apply text-foreground;
27
+ }
28
+
29
+ &[data-selected="true"] {
30
+ @apply shadow-sm text-foreground;
31
+ }
32
+
33
+ & svg {
34
+ @apply size-4;
35
+ }
36
+ }
37
+
38
+ .fragment-segmented-control--sm .fragment-segmented-control__item.toggle-button {
39
+ @apply h-7 px-2.5 text-xs md:h-7;
40
+ }
41
+ }
@@ -0,0 +1,12 @@
1
+ export interface EmptyStateProps {
2
+ icon?: React.ReactNode;
3
+ title: React.ReactNode;
4
+ description?: React.ReactNode;
5
+ /** Buttons or links. */
6
+ children?: React.ReactNode;
7
+ size?: 'sm' | 'md';
8
+ /** Draws a dashed outline, for an empty state that stands in for a whole card. */
9
+ bordered?: boolean;
10
+ className?: string;
11
+ }
12
+ export declare const EmptyState: React.FC<EmptyStateProps>;
@@ -0,0 +1,12 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * What a list, table or panel shows when there is nothing in it yet: an icon, one line saying
5
+ * what would be here, one saying how to get it there, and the action that does.
6
+ */
7
+ import { emptyState } from './EmptyState.styles';
8
+ export const EmptyState = ({ icon, title, description, children, className, ...props }) => {
9
+ const v = emptyState(props);
10
+ return (_jsxs("div", { className: v.base({ className }), children: [icon && _jsx("div", { className: v.icon(), children: icon }), _jsx("p", { className: v.title(), children: title }), description && _jsx("p", { className: v.description(), children: description }), children && _jsx("div", { className: v.actions(), children: children })] }));
11
+ };
12
+ //# sourceMappingURL=EmptyState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.js","sourceRoot":"","sources":["../../src/fragments/empty-state/EmptyState.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAcjD,MAAM,CAAC,MAAM,UAAU,GAA8B,CAAC,EACpD,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EACxD,EAAE,EAAE;IACH,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAE5B,OAAO,CACL,eAAK,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,aAClC,IAAI,IAAI,cAAK,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,YAAG,IAAI,GAAO,EAC/C,YAAG,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,YAAG,KAAK,GAAK,EACnC,WAAW,IAAI,YAAG,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,YAAG,WAAW,GAAK,EAC/D,QAAQ,IAAI,cAAK,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,YAAG,QAAQ,GAAO,IACtD,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,55 @@
1
+ export declare const emptyState: import("tailwind-variants").TVReturnType<{
2
+ size: {
3
+ sm: {
4
+ base: string;
5
+ };
6
+ md: {};
7
+ };
8
+ bordered: {
9
+ true: {
10
+ base: string;
11
+ };
12
+ };
13
+ }, {
14
+ base: string;
15
+ icon: string;
16
+ title: string;
17
+ description: string;
18
+ actions: string;
19
+ }, undefined, {
20
+ size: {
21
+ sm: {
22
+ base: string;
23
+ };
24
+ md: {};
25
+ };
26
+ bordered: {
27
+ true: {
28
+ base: string;
29
+ };
30
+ };
31
+ }, {
32
+ base: string;
33
+ icon: string;
34
+ title: string;
35
+ description: string;
36
+ actions: string;
37
+ }, import("tailwind-variants").TVReturnTypeLike<{
38
+ size: {
39
+ sm: {
40
+ base: string;
41
+ };
42
+ md: {};
43
+ };
44
+ bordered: {
45
+ true: {
46
+ base: string;
47
+ };
48
+ };
49
+ }, {
50
+ base: string;
51
+ icon: string;
52
+ title: string;
53
+ description: string;
54
+ actions: string;
55
+ }>>;
@@ -0,0 +1,23 @@
1
+ import { tv } from 'tailwind-variants';
2
+ export const emptyState = tv({
3
+ slots: {
4
+ base: 'fragment-empty-state',
5
+ icon: 'fragment-empty-state__icon',
6
+ title: 'fragment-empty-state__title',
7
+ description: 'fragment-empty-state__description',
8
+ actions: 'fragment-empty-state__actions',
9
+ },
10
+ variants: {
11
+ size: {
12
+ sm: { base: 'fragment-empty-state--sm' },
13
+ md: {},
14
+ },
15
+ bordered: {
16
+ true: { base: 'fragment-empty-state--bordered' },
17
+ },
18
+ },
19
+ defaultVariants: {
20
+ size: 'md',
21
+ },
22
+ });
23
+ //# sourceMappingURL=EmptyState.styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.styles.js","sourceRoot":"","sources":["../../src/fragments/empty-state/EmptyState.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAEvC,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;IAC3B,KAAK,EAAE;QACL,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,4BAA4B;QAClC,KAAK,EAAE,6BAA6B;QACpC,WAAW,EAAE,mCAAmC;QAChD,OAAO,EAAE,+BAA+B;KACzC;IACD,QAAQ,EAAE;QACR,IAAI,EAAE;YACJ,EAAE,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE;YACxC,EAAE,EAAE,EAAE;SACP;QACD,QAAQ,EAAE;YACR,IAAI,EAAE,EAAE,IAAI,EAAE,gCAAgC,EAAE;SACjD;KACF;IACD,eAAe,EAAE;QACf,IAAI,EAAE,IAAI;KACX;CACF,CAAC,CAAC"}
@@ -0,0 +1,39 @@
1
+ @layer components {
2
+ .fragment-empty-state {
3
+ @apply flex flex-col items-center justify-center text-center px-6 py-12;
4
+ }
5
+
6
+ .fragment-empty-state--sm {
7
+ @apply py-8;
8
+
9
+ .fragment-empty-state__icon {
10
+ @apply size-9 mb-3;
11
+ & svg {
12
+ @apply size-[18px];
13
+ }
14
+ }
15
+ }
16
+
17
+ .fragment-empty-state--bordered {
18
+ @apply rounded-2xl border border-dashed border-border bg-surface;
19
+ }
20
+
21
+ .fragment-empty-state__icon {
22
+ @apply mb-4 flex size-11 items-center justify-center rounded-xl bg-default text-muted;
23
+ & svg {
24
+ @apply size-5;
25
+ }
26
+ }
27
+
28
+ .fragment-empty-state__title {
29
+ @apply text-sm font-semibold text-foreground;
30
+ }
31
+
32
+ .fragment-empty-state__description {
33
+ @apply mt-1 max-w-sm text-sm text-muted text-balance;
34
+ }
35
+
36
+ .fragment-empty-state__actions {
37
+ @apply mt-5 flex flex-wrap items-center justify-center gap-2;
38
+ }
39
+ }
@@ -0,0 +1,14 @@
1
+ export interface FormCardProps {
2
+ children: React.ReactNode;
3
+ title: React.ReactNode;
4
+ description?: React.ReactNode;
5
+ /** Beside the title: a status chip, a "reset" link, a switch that enables the whole group. */
6
+ titleEndContent?: React.ReactNode;
7
+ /** Behind a hairline at the bottom: secondary actions, or a note on when the change applies. */
8
+ footer?: React.ReactNode;
9
+ /** `danger` marks a group of irreversible actions. */
10
+ variant?: 'default' | 'danger';
11
+ id?: string;
12
+ className?: string;
13
+ }
14
+ export declare const FormCard: React.FC<FormCardProps>;
@@ -0,0 +1,14 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ /**
4
+ * One group of settings drawn as a card: a heading that says what the group is for, then its
5
+ * fields. Where FormSection separates groups with rules on one sheet, FormCard gives each group its
6
+ * own surface — the better fit for a long settings page, where the eye needs landmarks to scan by.
7
+ */
8
+ import { Card } from '@heroui/react';
9
+ import { formCard } from './FormCard.styles';
10
+ export const FormCard = ({ children, title, description, titleEndContent, footer, id, className, ...props }) => {
11
+ const v = formCard(props);
12
+ return (_jsxs(Card, { className: v.base({ className }), id: id, children: [_jsxs("div", { className: v.header(), children: [_jsxs("div", { className: v.heading(), children: [_jsx("h3", { className: v.title(), children: title }), description && _jsx("div", { className: v.description(), children: description })] }), titleEndContent && _jsx("div", { className: v.headerEnd(), children: titleEndContent })] }), _jsx("div", { className: v.body(), children: children }), footer && _jsx("div", { className: v.footer(), children: footer })] }));
13
+ };
14
+ //# sourceMappingURL=FormCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormCard.js","sourceRoot":"","sources":["../../src/fragments/form/FormCard.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAgB7C,MAAM,CAAC,MAAM,QAAQ,GAA4B,CAAC,EAChD,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,KAAK,EAC/E,EAAE,EAAE;IACH,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE1B,OAAO,CACL,MAAC,IAAI,IAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,aAC5C,eAAK,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,aACxB,eAAK,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,aACzB,aAAI,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,YAAG,KAAK,GAAM,EACrC,WAAW,IAAI,cAAK,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,YAAG,WAAW,GAAO,IAChE,EACL,eAAe,IAAI,cAAK,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,YAAG,eAAe,GAAO,IACtE,EACN,cAAK,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,YAAG,QAAQ,GAAO,EACzC,MAAM,IAAI,cAAK,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,YAAG,MAAM,GAAO,IAChD,CACR,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,49 @@
1
+ export declare const formCard: import("tailwind-variants").TVReturnType<{
2
+ variant: {
3
+ default: {};
4
+ danger: {
5
+ base: string;
6
+ };
7
+ };
8
+ }, {
9
+ base: string;
10
+ header: string;
11
+ heading: string;
12
+ title: string;
13
+ description: string;
14
+ headerEnd: string;
15
+ body: string;
16
+ footer: string;
17
+ }, undefined, {
18
+ variant: {
19
+ default: {};
20
+ danger: {
21
+ base: string;
22
+ };
23
+ };
24
+ }, {
25
+ base: string;
26
+ header: string;
27
+ heading: string;
28
+ title: string;
29
+ description: string;
30
+ headerEnd: string;
31
+ body: string;
32
+ footer: string;
33
+ }, import("tailwind-variants").TVReturnTypeLike<{
34
+ variant: {
35
+ default: {};
36
+ danger: {
37
+ base: string;
38
+ };
39
+ };
40
+ }, {
41
+ base: string;
42
+ header: string;
43
+ heading: string;
44
+ title: string;
45
+ description: string;
46
+ headerEnd: string;
47
+ body: string;
48
+ footer: string;
49
+ }>>;
@@ -0,0 +1,23 @@
1
+ import { tv } from 'tailwind-variants';
2
+ export const formCard = tv({
3
+ slots: {
4
+ base: 'fragment-form-card',
5
+ header: 'fragment-form-card__header',
6
+ heading: 'fragment-form-card__heading',
7
+ title: 'fragment-form-card__title',
8
+ description: 'fragment-form-card__description',
9
+ headerEnd: 'fragment-form-card__header-end',
10
+ body: 'fragment-form-card__body',
11
+ footer: 'fragment-form-card__footer',
12
+ },
13
+ variants: {
14
+ variant: {
15
+ default: {},
16
+ danger: { base: 'fragment-form-card--danger' },
17
+ },
18
+ },
19
+ defaultVariants: {
20
+ variant: 'default',
21
+ },
22
+ });
23
+ //# sourceMappingURL=FormCard.styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormCard.styles.js","sourceRoot":"","sources":["../../src/fragments/form/FormCard.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAEvC,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,CAAC;IACzB,KAAK,EAAE;QACL,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,4BAA4B;QACpC,OAAO,EAAE,6BAA6B;QACtC,KAAK,EAAE,2BAA2B;QAClC,WAAW,EAAE,iCAAiC;QAC9C,SAAS,EAAE,gCAAgC;QAC3C,IAAI,EAAE,0BAA0B;QAChC,MAAM,EAAE,4BAA4B;KACrC;IACD,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,EAAE,IAAI,EAAE,4BAA4B,EAAE;SAC/C;KACF;IACD,eAAe,EAAE;QACf,OAAO,EAAE,SAAS;KACnB;CACF,CAAC,CAAC"}
@@ -4,8 +4,10 @@
4
4
  import React from 'react';
5
5
  export interface FormSectionProps {
6
6
  children: React.ReactNode;
7
- title: string;
7
+ title: React.ReactNode;
8
8
  description?: React.ReactNode;
9
+ /** Sits beside the title, for a status chip or a "reset to default" link. */
10
+ titleEndContent?: React.ReactNode;
9
11
  direction?: 'vertical' | 'horizontal';
10
12
  fullWidth?: boolean;
11
13
  }
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { formSection } from './FormSection.styles';
4
- export const FormSection = ({ children, title, description, ...props }) => {
4
+ export const FormSection = ({ children, title, description, titleEndContent, ...props }) => {
5
5
  const v = formSection(props);
6
- return (_jsx("div", { className: v.base(), children: _jsxs("div", { className: v.main(), children: [_jsxs("div", { className: v.info(), children: [_jsx("h3", { children: title }), _jsx("div", { className: v.description(), children: description })] }), _jsx("div", { className: v.content(), children: children })] }) }));
6
+ return (_jsx("div", { className: v.base(), children: _jsxs("div", { className: v.main(), children: [_jsxs("div", { className: v.info(), children: [_jsxs("div", { className: v.titleRow(), children: [_jsx("h3", { className: v.title(), children: title }), titleEndContent] }), description && _jsx("div", { className: v.description(), children: description })] }), _jsx("div", { className: v.content(), children: children })] }) }));
7
7
  };
8
8
  //# sourceMappingURL=FormSection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormSection.js","sourceRoot":"","sources":["../../src/fragments/form/FormSection.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAOb,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAUnD,MAAM,CAAC,MAAM,WAAW,GAA+B,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE;IACpG,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAE7B,OAAO,CACL,cAAK,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,YACtB,eAAK,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,aACtB,eAAK,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,aACtB,uBAAK,KAAK,GAAM,EAChB,cAAK,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,YAAG,WAAW,GAAO,IAChD,EACN,cAAK,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,YACxB,QAAQ,GACL,IACF,GACF,CACP,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"FormSection.js","sourceRoot":"","sources":["../../src/fragments/form/FormSection.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAOb,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAYnD,MAAM,CAAC,MAAM,WAAW,GAA+B,CAAC,EACtD,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,KAAK,EACxD,EAAE,EAAE;IACH,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAE7B,OAAO,CACL,cAAK,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,YACtB,eAAK,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,aACtB,eAAK,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,aACtB,eAAK,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,aAC1B,aAAI,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,YAAG,KAAK,GAAM,EACrC,eAAe,IACZ,EACL,WAAW,IAAI,cAAK,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,YAAG,WAAW,GAAO,IAChE,EACN,cAAK,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,YACxB,QAAQ,GACL,IACF,GACF,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -16,6 +16,8 @@ export declare const formSection: import("tailwind-variants").TVReturnType<{
16
16
  base: string;
17
17
  main: string;
18
18
  info: string;
19
+ titleRow: string;
20
+ title: string;
19
21
  content: string;
20
22
  description: string;
21
23
  }, undefined, {
@@ -36,6 +38,8 @@ export declare const formSection: import("tailwind-variants").TVReturnType<{
36
38
  base: string;
37
39
  main: string;
38
40
  info: string;
41
+ titleRow: string;
42
+ title: string;
39
43
  content: string;
40
44
  description: string;
41
45
  }, import("tailwind-variants").TVReturnTypeLike<{
@@ -56,6 +60,8 @@ export declare const formSection: import("tailwind-variants").TVReturnType<{
56
60
  base: string;
57
61
  main: string;
58
62
  info: string;
63
+ titleRow: string;
64
+ title: string;
59
65
  content: string;
60
66
  description: string;
61
67
  }>>;