@fragment-build/ui 3.3.0 → 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 (83) hide show
  1. package/components/code-snippet/CodeSnippet.d.ts +9 -0
  2. package/components/code-snippet/CodeSnippet.js +14 -4
  3. package/components/code-snippet/CodeSnippet.js.map +1 -1
  4. package/components/code-snippet/code-snippet.css +18 -0
  5. package/components/segmented-control/SegmentedControl.d.ts +16 -0
  6. package/components/segmented-control/SegmentedControl.js +18 -0
  7. package/components/segmented-control/SegmentedControl.js.map +1 -0
  8. package/components/segmented-control/SegmentedControl.styles.d.ts +46 -0
  9. package/components/segmented-control/SegmentedControl.styles.js +20 -0
  10. package/components/segmented-control/SegmentedControl.styles.js.map +1 -0
  11. package/components/segmented-control/segmented-control.css +41 -0
  12. package/fragments/empty-state/EmptyState.d.ts +12 -0
  13. package/fragments/empty-state/EmptyState.js +12 -0
  14. package/fragments/empty-state/EmptyState.js.map +1 -0
  15. package/fragments/empty-state/EmptyState.styles.d.ts +55 -0
  16. package/fragments/empty-state/EmptyState.styles.js +23 -0
  17. package/fragments/empty-state/EmptyState.styles.js.map +1 -0
  18. package/fragments/empty-state/empty-state.css +39 -0
  19. package/fragments/form/FormCard.d.ts +14 -0
  20. package/fragments/form/FormCard.js +14 -0
  21. package/fragments/form/FormCard.js.map +1 -0
  22. package/fragments/form/FormCard.styles.d.ts +49 -0
  23. package/fragments/form/FormCard.styles.js +23 -0
  24. package/fragments/form/FormCard.styles.js.map +1 -0
  25. package/fragments/form/FormSection.d.ts +3 -1
  26. package/fragments/form/FormSection.js +2 -2
  27. package/fragments/form/FormSection.js.map +1 -1
  28. package/fragments/form/FormSection.styles.d.ts +6 -0
  29. package/fragments/form/FormSection.styles.js +2 -0
  30. package/fragments/form/FormSection.styles.js.map +1 -1
  31. package/fragments/form/form-card.css +42 -0
  32. package/fragments/form/form-section.css +22 -10
  33. package/fragments/form/form.css +1 -1
  34. package/fragments/page/PageHeader.d.ts +7 -2
  35. package/fragments/page/PageHeader.js +3 -3
  36. package/fragments/page/PageHeader.js.map +1 -1
  37. package/fragments/page/PageHeader.styles.d.ts +30 -21
  38. package/fragments/page/PageHeader.styles.js +10 -0
  39. package/fragments/page/PageHeader.styles.js.map +1 -1
  40. package/fragments/page/page-header.css +23 -3
  41. package/fragments/save-bar/SaveBar.d.ts +12 -0
  42. package/fragments/save-bar/SaveBar.js +15 -0
  43. package/fragments/save-bar/SaveBar.js.map +1 -0
  44. package/fragments/save-bar/SaveBar.styles.d.ts +37 -0
  45. package/fragments/save-bar/SaveBar.styles.js +16 -0
  46. package/fragments/save-bar/SaveBar.styles.js.map +1 -0
  47. package/fragments/save-bar/save-bar.css +28 -0
  48. package/fragments/shell/shell.css +8 -4
  49. package/fragments/sidebar/Sidebar.js +4 -1
  50. package/fragments/sidebar/Sidebar.js.map +1 -1
  51. package/fragments/sidebar/sidebar.css +41 -24
  52. package/fragments/stat/StatCard.d.ts +29 -0
  53. package/fragments/stat/StatCard.js +20 -0
  54. package/fragments/stat/StatCard.js.map +1 -0
  55. package/fragments/stat/StatCard.styles.d.ts +85 -0
  56. package/fragments/stat/StatCard.styles.js +26 -0
  57. package/fragments/stat/StatCard.styles.js.map +1 -0
  58. package/fragments/stat/stat-card.css +64 -0
  59. package/fragments/widget/Widget.d.ts +9 -2
  60. package/fragments/widget/Widget.js +4 -3
  61. package/fragments/widget/Widget.js.map +1 -1
  62. package/fragments/widget/Widget.styles.d.ts +51 -0
  63. package/fragments/widget/Widget.styles.js +12 -0
  64. package/fragments/widget/Widget.styles.js.map +1 -1
  65. package/fragments/widget/widget.css +49 -4
  66. package/index.css +112 -38
  67. package/index.d.ts +5 -0
  68. package/index.js +5 -0
  69. package/index.js.map +1 -1
  70. package/package.json +1 -1
  71. package/src/components/code-snippet/code-snippet.css +18 -0
  72. package/src/components/segmented-control/segmented-control.css +41 -0
  73. package/src/fragments/empty-state/empty-state.css +39 -0
  74. package/src/fragments/form/form-card.css +42 -0
  75. package/src/fragments/form/form-section.css +22 -10
  76. package/src/fragments/form/form.css +1 -1
  77. package/src/fragments/page/page-header.css +23 -3
  78. package/src/fragments/save-bar/save-bar.css +28 -0
  79. package/src/fragments/shell/shell.css +8 -4
  80. package/src/fragments/sidebar/sidebar.css +41 -24
  81. package/src/fragments/stat/stat-card.css +64 -0
  82. package/src/fragments/widget/widget.css +49 -4
  83. package/src/index.css +112 -38
@@ -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
  }>>;
@@ -4,6 +4,8 @@ export const formSection = tv({
4
4
  base: 'fragment-form-section',
5
5
  main: 'fragment-form-section__main',
6
6
  info: 'fragment-form-section__info',
7
+ titleRow: 'fragment-form-section__title-row',
8
+ title: 'fragment-form-section__title',
7
9
  content: 'fragment-form-section__content',
8
10
  description: 'fragment-form-section__description',
9
11
  },
@@ -1 +1 @@
1
- {"version":3,"file":"FormSection.styles.js","sourceRoot":"","sources":["../../src/fragments/form/FormSection.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAEvC,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;IAC5B,KAAK,EAAE;QACL,IAAI,EAAE,uBAAuB;QAC7B,IAAI,EAAE,6BAA6B;QACnC,IAAI,EAAE,6BAA6B;QACnC,OAAO,EAAE,gCAAgC;QACzC,WAAW,EAAE,oCAAoC;KAClD;IACD,QAAQ,EAAE;QACR,SAAS,EAAE;YACT,UAAU,EAAE,EAAE,IAAI,EAAE,mCAAmC,EAAE;YACzD,QAAQ,EAAE,EAAE,IAAI,EAAE,iCAAiC,EAAE;SACtD;QACD,SAAS,EAAE;YACT,IAAI,EAAE,EAAE,IAAI,EAAE,mCAAmC,EAAE;SACpD;KACF;IACD,eAAe,EAAE;QACf,SAAS,EAAE,UAAU;QACrB,SAAS,EAAE,KAAK;KACjB;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"FormSection.styles.js","sourceRoot":"","sources":["../../src/fragments/form/FormSection.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAEvC,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;IAC5B,KAAK,EAAE;QACL,IAAI,EAAE,uBAAuB;QAC7B,IAAI,EAAE,6BAA6B;QACnC,IAAI,EAAE,6BAA6B;QACnC,QAAQ,EAAE,kCAAkC;QAC5C,KAAK,EAAE,8BAA8B;QACrC,OAAO,EAAE,gCAAgC;QACzC,WAAW,EAAE,oCAAoC;KAClD;IACD,QAAQ,EAAE;QACR,SAAS,EAAE;YACT,UAAU,EAAE,EAAE,IAAI,EAAE,mCAAmC,EAAE;YACzD,QAAQ,EAAE,EAAE,IAAI,EAAE,iCAAiC,EAAE;SACtD;QACD,SAAS,EAAE;YACT,IAAI,EAAE,EAAE,IAAI,EAAE,mCAAmC,EAAE;SACpD;KACF;IACD,eAAe,EAAE;QACf,SAAS,EAAE,UAAU;QACrB,SAAS,EAAE,KAAK;KACjB;CACF,CAAC,CAAC"}
@@ -0,0 +1,42 @@
1
+ @layer components {
2
+ .fragment-form-card {
3
+ @apply p-0 gap-0 overflow-visible;
4
+ }
5
+
6
+ .fragment-form-card__header {
7
+ @apply flex items-start gap-4 px-6 pt-5;
8
+ }
9
+
10
+ .fragment-form-card__heading {
11
+ @apply min-w-0 flex-1;
12
+ }
13
+
14
+ .fragment-form-card__title {
15
+ @apply text-base font-semibold;
16
+ }
17
+
18
+ .fragment-form-card__description {
19
+ @apply mt-1 text-sm text-muted;
20
+ }
21
+
22
+ .fragment-form-card__header-end {
23
+ @apply shrink-0 flex items-center gap-2;
24
+ }
25
+
26
+ .fragment-form-card__body {
27
+ @apply flex flex-col gap-5 px-6 pt-5 pb-6;
28
+ }
29
+
30
+ .fragment-form-card__footer {
31
+ @apply flex items-center justify-between gap-3 rounded-b-[inherit] border-t border-separator bg-surface-secondary px-6 py-3
32
+ text-xs text-muted;
33
+ }
34
+
35
+ .fragment-form-card--danger {
36
+ @apply border-danger/30;
37
+
38
+ .fragment-form-card__title {
39
+ @apply text-danger;
40
+ }
41
+ }
42
+ }