@craftzbay/ui 0.9.0 → 0.10.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.
- package/README.md +72 -6
- package/dist-lib/components/ui/Accordion.js +60 -0
- package/dist-lib/components/ui/Accordion.js.map +1 -0
- package/dist-lib/components/ui/Alert.d.ts +1 -1
- package/dist-lib/components/ui/Alert.js +66 -0
- package/dist-lib/components/ui/Alert.js.map +1 -0
- package/dist-lib/components/ui/Avatar.d.ts +2 -2
- package/dist-lib/components/ui/Avatar.js +96 -0
- package/dist-lib/components/ui/Avatar.js.map +1 -0
- package/dist-lib/components/ui/Badge.d.ts +1 -1
- package/dist-lib/components/ui/Badge.js +67 -0
- package/dist-lib/components/ui/Badge.js.map +1 -0
- package/dist-lib/components/ui/Breadcrumbs.js +34 -0
- package/dist-lib/components/ui/Breadcrumbs.js.map +1 -0
- package/dist-lib/components/ui/Button.d.ts +1 -1
- package/dist-lib/components/ui/Button.js +117 -0
- package/dist-lib/components/ui/Button.js.map +1 -0
- package/dist-lib/components/ui/Calendar.d.ts +7 -1
- package/dist-lib/components/ui/Calendar.js +111 -0
- package/dist-lib/components/ui/Calendar.js.map +1 -0
- package/dist-lib/components/ui/Card.d.ts +1 -1
- package/dist-lib/components/ui/Card.js +116 -0
- package/dist-lib/components/ui/Card.js.map +1 -0
- package/dist-lib/components/ui/Carousel.d.ts +5 -1
- package/dist-lib/components/ui/Carousel.js +143 -0
- package/dist-lib/components/ui/Carousel.js.map +1 -0
- package/dist-lib/components/ui/Chart.d.ts +26 -4
- package/dist-lib/components/ui/Chart.js +253 -0
- package/dist-lib/components/ui/Chart.js.map +1 -0
- package/dist-lib/components/ui/Checkbox.js +56 -0
- package/dist-lib/components/ui/Checkbox.js.map +1 -0
- package/dist-lib/components/ui/Combobox.d.ts +7 -0
- package/dist-lib/components/ui/Combobox.js +164 -0
- package/dist-lib/components/ui/Combobox.js.map +1 -0
- package/dist-lib/components/ui/CommandPalette.d.ts +3 -3
- package/dist-lib/components/ui/CommandPalette.js +174 -0
- package/dist-lib/components/ui/CommandPalette.js.map +1 -0
- package/dist-lib/components/ui/ContextMenu.js +150 -0
- package/dist-lib/components/ui/ContextMenu.js.map +1 -0
- package/dist-lib/components/ui/DataGrid.js +84 -0
- package/dist-lib/components/ui/DataGrid.js.map +1 -0
- package/dist-lib/components/ui/DatePicker.d.ts +16 -13
- package/dist-lib/components/ui/DatePicker.js +174 -0
- package/dist-lib/components/ui/DatePicker.js.map +1 -0
- package/dist-lib/components/ui/DesignSystemProvider.d.ts +8 -1
- package/dist-lib/components/ui/DesignSystemProvider.js +79 -0
- package/dist-lib/components/ui/DesignSystemProvider.js.map +1 -0
- package/dist-lib/components/ui/Dialog.d.ts +1 -1
- package/dist-lib/components/ui/Dialog.js +140 -0
- package/dist-lib/components/ui/Dialog.js.map +1 -0
- package/dist-lib/components/ui/Drawer.d.ts +6 -0
- package/dist-lib/components/ui/Drawer.js +98 -0
- package/dist-lib/components/ui/Drawer.js.map +1 -0
- package/dist-lib/components/ui/DropdownMenu.js +164 -0
- package/dist-lib/components/ui/DropdownMenu.js.map +1 -0
- package/dist-lib/components/ui/EmptyState.js +32 -0
- package/dist-lib/components/ui/EmptyState.js.map +1 -0
- package/dist-lib/components/ui/ErrorState.js +48 -0
- package/dist-lib/components/ui/ErrorState.js.map +1 -0
- package/dist-lib/components/ui/FileUpload.d.ts +3 -0
- package/dist-lib/components/ui/FileUpload.js +108 -0
- package/dist-lib/components/ui/FileUpload.js.map +1 -0
- package/dist-lib/components/ui/Form.d.ts +1 -0
- package/dist-lib/components/ui/Form.js +105 -0
- package/dist-lib/components/ui/Form.js.map +1 -0
- package/dist-lib/components/ui/Icon.js +26 -0
- package/dist-lib/components/ui/Icon.js.map +1 -0
- package/dist-lib/components/ui/IconButton.d.ts +1 -1
- package/dist-lib/components/ui/IconButton.js +56 -0
- package/dist-lib/components/ui/IconButton.js.map +1 -0
- package/dist-lib/components/ui/Input.d.ts +6 -3
- package/dist-lib/components/ui/Input.js +135 -0
- package/dist-lib/components/ui/Input.js.map +1 -0
- package/dist-lib/components/ui/Kbd.js +24 -0
- package/dist-lib/components/ui/Kbd.js.map +1 -0
- package/dist-lib/components/ui/MultiSelect.d.ts +3 -1
- package/dist-lib/components/ui/MultiSelect.js +196 -0
- package/dist-lib/components/ui/MultiSelect.js.map +1 -0
- package/dist-lib/components/ui/Pagination.d.ts +23 -0
- package/dist-lib/components/ui/Pagination.js +148 -0
- package/dist-lib/components/ui/Pagination.js.map +1 -0
- package/dist-lib/components/ui/Popover.js +35 -0
- package/dist-lib/components/ui/Popover.js.map +1 -0
- package/dist-lib/components/ui/Progress.js +95 -0
- package/dist-lib/components/ui/Progress.js.map +1 -0
- package/dist-lib/components/ui/RadioGroup.js +64 -0
- package/dist-lib/components/ui/RadioGroup.js.map +1 -0
- package/dist-lib/components/ui/ScrollArea.js +44 -0
- package/dist-lib/components/ui/ScrollArea.js.map +1 -0
- package/dist-lib/components/ui/Select.js +131 -0
- package/dist-lib/components/ui/Select.js.map +1 -0
- package/dist-lib/components/ui/Separator.js +26 -0
- package/dist-lib/components/ui/Separator.js.map +1 -0
- package/dist-lib/components/ui/Sheet.d.ts +1 -1
- package/dist-lib/components/ui/Sheet.js +113 -0
- package/dist-lib/components/ui/Sheet.js.map +1 -0
- package/dist-lib/components/ui/Sidebar.d.ts +18 -6
- package/dist-lib/components/ui/Sidebar.js +169 -0
- package/dist-lib/components/ui/Sidebar.js.map +1 -0
- package/dist-lib/components/ui/Skeleton.js +28 -0
- package/dist-lib/components/ui/Skeleton.js.map +1 -0
- package/dist-lib/components/ui/Slider.js +52 -0
- package/dist-lib/components/ui/Slider.js.map +1 -0
- package/dist-lib/components/ui/Snackbar.d.ts +1 -1
- package/dist-lib/components/ui/Snackbar.js +56 -0
- package/dist-lib/components/ui/Snackbar.js.map +1 -0
- package/dist-lib/components/ui/Spinner.js +42 -0
- package/dist-lib/components/ui/Spinner.js.map +1 -0
- package/dist-lib/components/ui/Stepper.js +88 -0
- package/dist-lib/components/ui/Stepper.js.map +1 -0
- package/dist-lib/components/ui/Switch.js +77 -0
- package/dist-lib/components/ui/Switch.js.map +1 -0
- package/dist-lib/components/ui/Table.d.ts +9 -1
- package/dist-lib/components/ui/Table.js +157 -0
- package/dist-lib/components/ui/Table.js.map +1 -0
- package/dist-lib/components/ui/Tabs.d.ts +1 -1
- package/dist-lib/components/ui/Tabs.js +89 -0
- package/dist-lib/components/ui/Tabs.js.map +1 -0
- package/dist-lib/components/ui/TagInput.d.ts +17 -2
- package/dist-lib/components/ui/TagInput.js +111 -0
- package/dist-lib/components/ui/TagInput.js.map +1 -0
- package/dist-lib/components/ui/Textarea.js +77 -0
- package/dist-lib/components/ui/Textarea.js.map +1 -0
- package/dist-lib/components/ui/Timeline.d.ts +16 -6
- package/dist-lib/components/ui/Timeline.js +52 -0
- package/dist-lib/components/ui/Timeline.js.map +1 -0
- package/dist-lib/components/ui/Toast.d.ts +1 -1
- package/dist-lib/components/ui/Toast.js +171 -0
- package/dist-lib/components/ui/Toast.js.map +1 -0
- package/dist-lib/components/ui/Tooltip.js +58 -0
- package/dist-lib/components/ui/Tooltip.js.map +1 -0
- package/dist-lib/components/ui/TopNav.js +52 -0
- package/dist-lib/components/ui/TopNav.js.map +1 -0
- package/dist-lib/components/ui/Tree.d.ts +27 -5
- package/dist-lib/components/ui/Tree.js +167 -0
- package/dist-lib/components/ui/Tree.js.map +1 -0
- package/dist-lib/hooks/use-field-ids.d.ts +29 -0
- package/dist-lib/hooks/use-field-ids.js +18 -0
- package/dist-lib/hooks/use-field-ids.js.map +1 -0
- package/dist-lib/hooks/use-media-query.js +18 -0
- package/dist-lib/hooks/use-media-query.js.map +1 -0
- package/dist-lib/hooks/use-strings.d.ts +5 -0
- package/dist-lib/hooks/use-strings.js +12 -0
- package/dist-lib/hooks/use-strings.js.map +1 -0
- package/dist-lib/hooks/use-toast.js +36 -0
- package/dist-lib/hooks/use-toast.js.map +1 -0
- package/dist-lib/icon.d.ts +8 -0
- package/dist-lib/icon.js +7 -0
- package/dist-lib/icon.js.map +1 -0
- package/dist-lib/icons/index.d.ts +71 -88
- package/dist-lib/icons/index.js +145 -0
- package/dist-lib/icons/index.js.map +1 -0
- package/dist-lib/illustrations/index.js +105 -0
- package/dist-lib/illustrations/index.js.map +1 -0
- package/dist-lib/index.d.ts +62 -59
- package/dist-lib/index.js +267 -4529
- package/dist-lib/index.js.map +1 -1
- package/dist-lib/lib/strings.d.ts +129 -0
- package/dist-lib/lib/strings.js +85 -0
- package/dist-lib/lib/strings.js.map +1 -0
- package/dist-lib/lib/strings.mn.d.ts +3 -0
- package/dist-lib/lib/strings.mn.js +70 -0
- package/dist-lib/lib/strings.mn.js.map +1 -0
- package/dist-lib/lib/utils.d.ts +0 -1
- package/dist-lib/lib/utils.js +10 -0
- package/dist-lib/lib/utils.js.map +1 -0
- package/dist-lib/styles.css +1 -1
- package/dist-lib/theme.css +777 -0
- package/package.json +31 -8
- package/dist-lib/index.cjs +0 -8
- package/dist-lib/index.cjs.map +0 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as l, jsx as n } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as p } from "react";
|
|
4
|
+
import { cn as d } from "../../lib/utils.js";
|
|
5
|
+
import { useStrings as m } from "../../hooks/use-strings.js";
|
|
6
|
+
const u = { sm: "size-3.5", md: "size-4", lg: "size-6" }, f = {
|
|
7
|
+
accent: "text-accent",
|
|
8
|
+
neutral: "text-foreground-subtle",
|
|
9
|
+
"on-accent": "text-on-accent"
|
|
10
|
+
}, x = p(function({ className: t, tone: r = "accent", size: o = "md", label: i, decorative: e, ...s }, c) {
|
|
11
|
+
const a = m();
|
|
12
|
+
return /* @__PURE__ */ l(
|
|
13
|
+
"svg",
|
|
14
|
+
{
|
|
15
|
+
ref: c,
|
|
16
|
+
viewBox: "0 0 24 24",
|
|
17
|
+
role: e ? void 0 : "status",
|
|
18
|
+
"aria-label": e ? void 0 : i ?? a.spinner.loading,
|
|
19
|
+
"aria-hidden": e || void 0,
|
|
20
|
+
className: d("animate-spin", u[o], f[r], t),
|
|
21
|
+
...s,
|
|
22
|
+
children: [
|
|
23
|
+
/* @__PURE__ */ n("circle", { cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "2.5", strokeOpacity: 0.2, fill: "none" }),
|
|
24
|
+
/* @__PURE__ */ n(
|
|
25
|
+
"path",
|
|
26
|
+
{
|
|
27
|
+
d: "M12 2a10 10 0 0 1 10 10",
|
|
28
|
+
stroke: "currentColor",
|
|
29
|
+
strokeWidth: "2.5",
|
|
30
|
+
strokeLinecap: "round",
|
|
31
|
+
fill: "none"
|
|
32
|
+
}
|
|
33
|
+
)
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
);
|
|
37
|
+
});
|
|
38
|
+
x.displayName = "Spinner";
|
|
39
|
+
export {
|
|
40
|
+
x as Spinner
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=Spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spinner.js","sources":["../../../src/components/ui/Spinner.tsx"],"sourcesContent":["'use client';\n\nimport { forwardRef, type SVGProps } from 'react';\nimport { cn } from '@/lib/utils';\nimport { useStrings } from '@/hooks/use-strings';\n\nexport interface SpinnerProps extends SVGProps<SVGSVGElement> {\n /** Visual weight. */\n tone?: 'accent' | 'neutral' | 'on-accent';\n /** Pixel size. */\n size?: 'sm' | 'md' | 'lg';\n /** Accessible label. Required unless `decorative` is true. */\n label?: string;\n /** Hide from assistive tech (set when a parent already announces busy state). */\n decorative?: boolean;\n}\n\nconst sizeMap = { sm: 'size-3.5', md: 'size-4', lg: 'size-6' };\nconst toneMap = {\n accent: 'text-accent',\n neutral: 'text-foreground-subtle',\n 'on-accent': 'text-on-accent',\n};\n\n/**\n * Small indeterminate progress indicator. Use when the operation duration is\n * unknown and Progress isn't appropriate.\n *\n * @example\n * <Spinner label=\"Loading users\" />\n * <Button loading>Saving…</Button> // uses Spinner internally\n *\n * @do Provide a `label` so the busy state is announced.\n * @dont Use a Spinner for tasks that take 300ms+; use Skeleton instead.\n */\nexport const Spinner = forwardRef<SVGSVGElement, SpinnerProps>(function Spinner(\n { className, tone = 'accent', size = 'md', label, decorative, ...props },\n ref,\n) {\n const strings = useStrings();\n return (\n <svg\n ref={ref}\n viewBox=\"0 0 24 24\"\n role={decorative ? undefined : 'status'}\n aria-label={decorative ? undefined : (label ?? strings.spinner.loading)}\n aria-hidden={decorative || undefined}\n className={cn('animate-spin', sizeMap[size], toneMap[tone], className)}\n {...props}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeOpacity={0.2} fill=\"none\" />\n <path\n d=\"M12 2a10 10 0 0 1 10 10\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </svg>\n );\n});\nSpinner.displayName = 'Spinner';\n"],"names":["sizeMap","toneMap","Spinner","forwardRef","className","tone","size","label","decorative","props","ref","strings","useStrings","jsxs","cn","jsx"],"mappings":";;;;;AAiBA,MAAMA,IAAU,EAAE,IAAI,YAAY,IAAI,UAAU,IAAI,SAAA,GAC9CC,IAAU;AAAA,EACd,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,aAAa;AACf,GAaaC,IAAUC,EAAwC,SAC7D,EAAE,WAAAC,GAAW,MAAAC,IAAO,UAAU,MAAAC,IAAO,MAAM,OAAAC,GAAO,YAAAC,GAAY,GAAGC,EAAA,GACjEC,GACA;AACA,QAAMC,IAAUC,EAAA;AAChB,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAH;AAAA,MACA,SAAQ;AAAA,MACR,MAAMF,IAAa,SAAY;AAAA,MAC/B,cAAYA,IAAa,SAAaD,KAASI,EAAQ,QAAQ;AAAA,MAC/D,eAAaH,KAAc;AAAA,MAC3B,WAAWM,EAAG,gBAAgBd,EAAQM,CAAI,GAAGL,EAAQI,CAAI,GAAGD,CAAS;AAAA,MACpE,GAAGK;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAM,EAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,QAAO,gBAAe,aAAY,OAAM,eAAe,KAAK,MAAK,QAAO;AAAA,QACvG,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,GAAE;AAAA,YACF,QAAO;AAAA,YACP,aAAY;AAAA,YACZ,eAAc;AAAA,YACd,MAAK;AAAA,UAAA;AAAA,QAAA;AAAA,MACP;AAAA,IAAA;AAAA,EAAA;AAGN,CAAC;AACDb,EAAQ,cAAc;"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as l, jsxs as n } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as p } from "react";
|
|
4
|
+
import { Check as u } from "../../icons/index.js";
|
|
5
|
+
import { cn as e } from "../../lib/utils.js";
|
|
6
|
+
import { useStrings as g } from "../../hooks/use-strings.js";
|
|
7
|
+
const b = p(function({ steps: o, current: c, orientation: t = "horizontal", className: d, ...i }, f) {
|
|
8
|
+
const x = g();
|
|
9
|
+
return /* @__PURE__ */ l(
|
|
10
|
+
"ol",
|
|
11
|
+
{
|
|
12
|
+
ref: f,
|
|
13
|
+
"aria-label": i["aria-label"] ?? x.stepper.label,
|
|
14
|
+
className: e(
|
|
15
|
+
t === "horizontal" ? "flex w-full items-center" : "flex flex-col gap-6",
|
|
16
|
+
d
|
|
17
|
+
),
|
|
18
|
+
...i,
|
|
19
|
+
children: o.map((s, r) => {
|
|
20
|
+
const a = r < c ? "complete" : r === c ? "current" : "upcoming", m = r === o.length - 1;
|
|
21
|
+
return /* @__PURE__ */ n(
|
|
22
|
+
"li",
|
|
23
|
+
{
|
|
24
|
+
"aria-current": a === "current" ? "step" : void 0,
|
|
25
|
+
className: e(
|
|
26
|
+
t === "horizontal" ? "flex flex-1 items-center gap-3 last:flex-initial" : "flex items-start gap-3"
|
|
27
|
+
),
|
|
28
|
+
children: [
|
|
29
|
+
/* @__PURE__ */ n("div", { className: e(t === "horizontal" ? "flex items-center gap-3" : "flex flex-col items-center"), children: [
|
|
30
|
+
/* @__PURE__ */ l(
|
|
31
|
+
"span",
|
|
32
|
+
{
|
|
33
|
+
"aria-hidden": !0,
|
|
34
|
+
className: e(
|
|
35
|
+
"inline-flex size-7 items-center justify-center rounded-full text-xs font-semibold transition-colors",
|
|
36
|
+
a === "complete" && "bg-accent text-on-accent",
|
|
37
|
+
a === "current" && "bg-card border-2 border-accent text-accent",
|
|
38
|
+
a === "upcoming" && "bg-background-muted text-foreground-subtle border border-border"
|
|
39
|
+
),
|
|
40
|
+
children: a === "complete" ? /* @__PURE__ */ l(u, { className: "size-4" }) : r + 1
|
|
41
|
+
}
|
|
42
|
+
),
|
|
43
|
+
t === "vertical" && !m && /* @__PURE__ */ l(
|
|
44
|
+
"span",
|
|
45
|
+
{
|
|
46
|
+
className: e(
|
|
47
|
+
"mt-1 w-px flex-1 min-h-6",
|
|
48
|
+
r < c ? "bg-accent" : "bg-border"
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
)
|
|
52
|
+
] }),
|
|
53
|
+
/* @__PURE__ */ n("div", { className: e("flex flex-col", t === "horizontal" && "min-w-0"), children: [
|
|
54
|
+
/* @__PURE__ */ l(
|
|
55
|
+
"span",
|
|
56
|
+
{
|
|
57
|
+
className: e(
|
|
58
|
+
"text-sm font-medium",
|
|
59
|
+
a === "upcoming" ? "text-foreground-subtle" : "text-foreground"
|
|
60
|
+
),
|
|
61
|
+
children: s.title
|
|
62
|
+
}
|
|
63
|
+
),
|
|
64
|
+
t === "vertical" && s.description && /* @__PURE__ */ l("p", { className: "text-xs text-foreground-muted mt-0.5", children: s.description })
|
|
65
|
+
] }),
|
|
66
|
+
t === "horizontal" && !m && /* @__PURE__ */ l(
|
|
67
|
+
"span",
|
|
68
|
+
{
|
|
69
|
+
"aria-hidden": !0,
|
|
70
|
+
className: e(
|
|
71
|
+
"h-px flex-1 mx-2",
|
|
72
|
+
r < c ? "bg-accent" : "bg-border"
|
|
73
|
+
)
|
|
74
|
+
}
|
|
75
|
+
)
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
r
|
|
79
|
+
);
|
|
80
|
+
})
|
|
81
|
+
}
|
|
82
|
+
);
|
|
83
|
+
});
|
|
84
|
+
b.displayName = "Stepper";
|
|
85
|
+
export {
|
|
86
|
+
b as Stepper
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=Stepper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stepper.js","sources":["../../../src/components/ui/Stepper.tsx"],"sourcesContent":["'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { Check } from '@/icons';\nimport { cn } from '@/lib/utils';\nimport { useStrings } from '@/hooks/use-strings';\n\nexport interface Step {\n /** Step heading. */\n title: ReactNode;\n /** Optional secondary description, only shown in vertical orientation. */\n description?: ReactNode;\n}\n\nexport interface StepperProps extends HTMLAttributes<HTMLOListElement> {\n /** Ordered list of steps. */\n steps: Step[];\n /** 0-indexed active step. Steps before it are marked complete. */\n current: number;\n /** Layout direction. */\n orientation?: 'horizontal' | 'vertical';\n}\n\n/**\n * Multi-step progress indicator. Use the horizontal variant in narrow flows\n * (top of an onboarding modal) and vertical for deeper context.\n *\n * @example Onboarding\n * <Stepper\n * current={step}\n * steps={[\n * { title: 'Workspace' },\n * { title: 'Invite team' },\n * { title: 'Connect data' },\n * { title: 'Done' },\n * ]}\n * />\n *\n * @do Keep titles 1–2 words. Save explanations for the page body.\n * @dont Use Stepper for free-form navigation. It implies a linear flow.\n */\nexport const Stepper = forwardRef<HTMLOListElement, StepperProps>(function Stepper(\n { steps, current, orientation = 'horizontal', className, ...props },\n ref,\n) {\n const strings = useStrings();\n return (\n <ol\n ref={ref}\n aria-label={props['aria-label'] ?? strings.stepper.label}\n className={cn(\n orientation === 'horizontal' ? 'flex w-full items-center' : 'flex flex-col gap-6',\n className,\n )}\n {...props}\n >\n {steps.map((step, i) => {\n const state = i < current ? 'complete' : i === current ? 'current' : 'upcoming';\n const isLast = i === steps.length - 1;\n return (\n <li\n key={i}\n aria-current={state === 'current' ? 'step' : undefined}\n className={cn(\n orientation === 'horizontal'\n ? 'flex flex-1 items-center gap-3 last:flex-initial'\n : 'flex items-start gap-3',\n )}\n >\n <div className={cn(orientation === 'horizontal' ? 'flex items-center gap-3' : 'flex flex-col items-center')}>\n <span\n aria-hidden\n className={cn(\n 'inline-flex size-7 items-center justify-center rounded-full text-xs font-semibold transition-colors',\n state === 'complete' && 'bg-accent text-on-accent',\n state === 'current' && 'bg-card border-2 border-accent text-accent',\n state === 'upcoming' && 'bg-background-muted text-foreground-subtle border border-border',\n )}\n >\n {state === 'complete' ? <Check className=\"size-4\" /> : i + 1}\n </span>\n {orientation === 'vertical' && !isLast && (\n <span\n className={cn(\n 'mt-1 w-px flex-1 min-h-6',\n i < current ? 'bg-accent' : 'bg-border',\n )}\n />\n )}\n </div>\n <div className={cn('flex flex-col', orientation === 'horizontal' && 'min-w-0')}>\n <span\n className={cn(\n 'text-sm font-medium',\n state === 'upcoming' ? 'text-foreground-subtle' : 'text-foreground',\n )}\n >\n {step.title}\n </span>\n {orientation === 'vertical' && step.description && (\n <p className=\"text-xs text-foreground-muted mt-0.5\">{step.description}</p>\n )}\n </div>\n {orientation === 'horizontal' && !isLast && (\n <span\n aria-hidden\n className={cn(\n 'h-px flex-1 mx-2',\n i < current ? 'bg-accent' : 'bg-border',\n )}\n />\n )}\n </li>\n );\n })}\n </ol>\n );\n});\nStepper.displayName = 'Stepper';\n"],"names":["Stepper","forwardRef","steps","current","orientation","className","props","ref","strings","useStrings","jsx","cn","step","i","state","isLast","jsxs","Check"],"mappings":";;;;;;AAyCO,MAAMA,IAAUC,EAA2C,SAChE,EAAE,OAAAC,GAAO,SAAAC,GAAS,aAAAC,IAAc,cAAc,WAAAC,GAAW,GAAGC,EAAA,GAC5DC,GACA;AACA,QAAMC,IAAUC,EAAA;AAChB,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAH;AAAA,MACA,cAAYD,EAAM,YAAY,KAAKE,EAAQ,QAAQ;AAAA,MACnD,WAAWG;AAAA,QACTP,MAAgB,eAAe,6BAA6B;AAAA,QAC5DC;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,MAEH,UAAAJ,EAAM,IAAI,CAACU,GAAMC,MAAM;AACtB,cAAMC,IAAQD,IAAIV,IAAU,aAAaU,MAAMV,IAAU,YAAY,YAC/DY,IAASF,MAAMX,EAAM,SAAS;AACpC,eACE,gBAAAc;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,gBAAcF,MAAU,YAAY,SAAS;AAAA,YAC7C,WAAWH;AAAA,cACTP,MAAgB,eACZ,qDACA;AAAA,YAAA;AAAA,YAGN,UAAA;AAAA,cAAA,gBAAAY,EAAC,SAAI,WAAWL,EAAGP,MAAgB,eAAe,4BAA4B,4BAA4B,GACxG,UAAA;AAAA,gBAAA,gBAAAM;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,eAAW;AAAA,oBACX,WAAWC;AAAA,sBACT;AAAA,sBACAG,MAAU,cAAc;AAAA,sBACxBA,MAAU,aAAa;AAAA,sBACvBA,MAAU,cAAc;AAAA,oBAAA;AAAA,oBAGzB,gBAAU,aAAa,gBAAAJ,EAACO,KAAM,WAAU,UAAS,IAAKJ,IAAI;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAE5DT,MAAgB,cAAc,CAACW,KAC9B,gBAAAL;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAWC;AAAA,sBACT;AAAA,sBACAE,IAAIV,IAAU,cAAc;AAAA,oBAAA;AAAA,kBAC9B;AAAA,gBAAA;AAAA,cACF,GAEJ;AAAA,cACA,gBAAAa,EAAC,SAAI,WAAWL,EAAG,iBAAiBP,MAAgB,gBAAgB,SAAS,GAC3E,UAAA;AAAA,gBAAA,gBAAAM;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,WAAWC;AAAA,sBACT;AAAA,sBACAG,MAAU,aAAa,2BAA2B;AAAA,oBAAA;AAAA,oBAGnD,UAAAF,EAAK;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEPR,MAAgB,cAAcQ,EAAK,iCACjC,KAAA,EAAE,WAAU,wCAAwC,UAAAA,EAAK,YAAA,CAAY;AAAA,cAAA,GAE1E;AAAA,cACCR,MAAgB,gBAAgB,CAACW,KAChC,gBAAAL;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,eAAW;AAAA,kBACX,WAAWC;AAAA,oBACT;AAAA,oBACAE,IAAIV,IAAU,cAAc;AAAA,kBAAA;AAAA,gBAC9B;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,UAjDGU;AAAA,QAAA;AAAA,MAqDX,CAAC;AAAA,IAAA;AAAA,EAAA;AAGP,CAAC;AACDb,EAAQ,cAAc;"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as t, jsxs as l } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as p, useId as w } from "react";
|
|
4
|
+
import * as f from "@radix-ui/react-switch";
|
|
5
|
+
import { cn as e } from "../../lib/utils.js";
|
|
6
|
+
const k = {
|
|
7
|
+
sm: "h-4 w-7",
|
|
8
|
+
md: "h-5 w-9"
|
|
9
|
+
}, N = {
|
|
10
|
+
sm: "size-3 data-[state=checked]:translate-x-3",
|
|
11
|
+
md: "size-4 data-[state=checked]:translate-x-4"
|
|
12
|
+
}, S = p(
|
|
13
|
+
function({
|
|
14
|
+
className: m,
|
|
15
|
+
label: r,
|
|
16
|
+
description: s,
|
|
17
|
+
labelPosition: o = "after",
|
|
18
|
+
size: n = "md",
|
|
19
|
+
hideLabel: u,
|
|
20
|
+
id: h,
|
|
21
|
+
disabled: i,
|
|
22
|
+
...b
|
|
23
|
+
}, x) {
|
|
24
|
+
const g = w(), a = h ?? g, c = s ? `${a}-desc` : void 0, v = /* @__PURE__ */ t(
|
|
25
|
+
f.Root,
|
|
26
|
+
{
|
|
27
|
+
ref: x,
|
|
28
|
+
id: a,
|
|
29
|
+
disabled: i,
|
|
30
|
+
"aria-describedby": c,
|
|
31
|
+
className: e(
|
|
32
|
+
"peer inline-flex shrink-0 items-center rounded-full border-2 border-transparent",
|
|
33
|
+
"transition-colors duration-[var(--duration-base)] ease-[var(--ease-out)]",
|
|
34
|
+
"outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
35
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
36
|
+
"data-[state=checked]:bg-accent data-[state=unchecked]:bg-switch-track-off",
|
|
37
|
+
k[n]
|
|
38
|
+
),
|
|
39
|
+
...b,
|
|
40
|
+
children: /* @__PURE__ */ t(
|
|
41
|
+
f.Thumb,
|
|
42
|
+
{
|
|
43
|
+
className: e(
|
|
44
|
+
"pointer-events-none block rounded-full bg-switch-thumb shadow-sm",
|
|
45
|
+
"transition-transform duration-[var(--duration-base)] ease-[var(--ease-out)]",
|
|
46
|
+
"translate-x-0",
|
|
47
|
+
N[n]
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
)
|
|
51
|
+
}
|
|
52
|
+
), d = r && /* @__PURE__ */ l("div", { className: e("flex flex-col gap-0.5 select-none", u && "sr-only"), children: [
|
|
53
|
+
/* @__PURE__ */ t(
|
|
54
|
+
"label",
|
|
55
|
+
{
|
|
56
|
+
htmlFor: a,
|
|
57
|
+
className: e(
|
|
58
|
+
"text-sm text-foreground",
|
|
59
|
+
i && "opacity-50 cursor-not-allowed"
|
|
60
|
+
),
|
|
61
|
+
children: r
|
|
62
|
+
}
|
|
63
|
+
),
|
|
64
|
+
s && /* @__PURE__ */ t("p", { id: c, className: "text-xs text-foreground-subtle", children: s })
|
|
65
|
+
] });
|
|
66
|
+
return /* @__PURE__ */ l("div", { className: e("inline-flex items-center gap-2.5", m), children: [
|
|
67
|
+
o === "before" && d,
|
|
68
|
+
v,
|
|
69
|
+
o === "after" && d
|
|
70
|
+
] });
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
S.displayName = "Switch";
|
|
74
|
+
export {
|
|
75
|
+
S as Switch
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=Switch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Switch.js","sources":["../../../src/components/ui/Switch.tsx"],"sourcesContent":["'use client';\n\nimport {\n forwardRef,\n useId,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type ReactNode,\n} from 'react';\nimport * as SwitchPrimitive from '@radix-ui/react-switch';\nimport { cn } from '@/lib/utils';\n\nexport interface SwitchProps\n extends Omit<ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>, 'asChild'> {\n /** Inline label rendered to the right. */\n label?: ReactNode;\n /** Secondary description rendered below the label. */\n description?: ReactNode;\n /** Position the label before the switch instead of after. */\n labelPosition?: 'before' | 'after';\n /** Visual size. */\n size?: 'sm' | 'md';\n /** Hide the label visually while keeping it accessible. */\n hideLabel?: boolean;\n}\n\nconst trackSize = {\n sm: 'h-4 w-7',\n md: 'h-5 w-9',\n} as const;\nconst thumbSize = {\n sm: 'size-3 data-[state=checked]:translate-x-3',\n md: 'size-4 data-[state=checked]:translate-x-4',\n} as const;\n\n/**\n * Binary on/off toggle for instant-apply settings. Use Checkbox when the\n * choice is part of a form that needs explicit submission.\n *\n * @example Instant toggle\n * <Switch label=\"Email digest\" checked={on} onCheckedChange={setOn} />\n *\n * @example With description\n * <Switch label=\"Two-factor authentication\"\n * description=\"Required for admins on production accounts.\"\n * checked={tfa}\n * onCheckedChange={setTfa} />\n *\n * @do Use Switch when the change takes effect immediately. Pair with\n * a toast confirming the new state.\n * @dont Use Switch inside a form that requires submission — Checkbox\n * better matches that mental model.\n */\nexport const Switch = forwardRef<ElementRef<typeof SwitchPrimitive.Root>, SwitchProps>(\n function Switch(\n {\n className,\n label,\n description,\n labelPosition = 'after',\n size = 'md',\n hideLabel,\n id,\n disabled,\n ...props\n },\n ref,\n ) {\n const autoId = useId();\n const fieldId = id ?? autoId;\n const descId = description ? `${fieldId}-desc` : undefined;\n\n const control = (\n <SwitchPrimitive.Root\n ref={ref}\n id={fieldId}\n disabled={disabled}\n aria-describedby={descId}\n className={cn(\n 'peer inline-flex shrink-0 items-center rounded-full border-2 border-transparent',\n 'transition-colors duration-[var(--duration-base)] ease-[var(--ease-out)]',\n 'outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'data-[state=checked]:bg-accent data-[state=unchecked]:bg-switch-track-off',\n trackSize[size],\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n className={cn(\n 'pointer-events-none block rounded-full bg-switch-thumb shadow-sm',\n 'transition-transform duration-[var(--duration-base)] ease-[var(--ease-out)]',\n 'translate-x-0',\n thumbSize[size],\n )}\n />\n </SwitchPrimitive.Root>\n );\n\n const labelBlock = label && (\n <div className={cn('flex flex-col gap-0.5 select-none', hideLabel && 'sr-only')}>\n <label\n htmlFor={fieldId}\n className={cn(\n 'text-sm text-foreground',\n disabled && 'opacity-50 cursor-not-allowed',\n )}\n >\n {label}\n </label>\n {description && (\n <p id={descId} className=\"text-xs text-foreground-subtle\">\n {description}\n </p>\n )}\n </div>\n );\n\n return (\n <div className={cn('inline-flex items-center gap-2.5', className)}>\n {labelPosition === 'before' && labelBlock}\n {control}\n {labelPosition === 'after' && labelBlock}\n </div>\n );\n },\n);\n\nSwitch.displayName = 'Switch';\n"],"names":["trackSize","thumbSize","Switch","forwardRef","className","label","description","labelPosition","size","hideLabel","id","disabled","props","ref","autoId","useId","fieldId","descId","control","jsx","SwitchPrimitive","cn","labelBlock","jsxs"],"mappings":";;;;;AA0BA,MAAMA,IAAY;AAAA,EAChB,IAAI;AAAA,EACJ,IAAI;AACN,GACMC,IAAY;AAAA,EAChB,IAAI;AAAA,EACJ,IAAI;AACN,GAoBaC,IAASC;AAAA,EACpB,SACE;AAAA,IACE,WAAAC;AAAA,IACA,OAAAC;AAAA,IACA,aAAAC;AAAA,IACA,eAAAC,IAAgB;AAAA,IAChB,MAAAC,IAAO;AAAA,IACP,WAAAC;AAAA,IACA,IAAAC;AAAA,IACA,UAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,GACA;AACA,UAAMC,IAASC,EAAA,GACTC,IAAUN,KAAMI,GAChBG,IAASX,IAAc,GAAGU,CAAO,UAAU,QAE3CE,IACJ,gBAAAC;AAAA,MAACC,EAAgB;AAAA,MAAhB;AAAA,QACC,KAAAP;AAAA,QACA,IAAIG;AAAA,QACJ,UAAAL;AAAA,QACA,oBAAkBM;AAAA,QAClB,WAAWI;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACArB,EAAUQ,CAAI;AAAA,QAAA;AAAA,QAEf,GAAGI;AAAA,QAEJ,UAAA,gBAAAO;AAAA,UAACC,EAAgB;AAAA,UAAhB;AAAA,YACC,WAAWC;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACApB,EAAUO,CAAI;AAAA,YAAA;AAAA,UAChB;AAAA,QAAA;AAAA,MACF;AAAA,IAAA,GAIEc,IAAajB,KACjB,gBAAAkB,EAAC,OAAA,EAAI,WAAWF,EAAG,qCAAqCZ,KAAa,SAAS,GAC5E,UAAA;AAAA,MAAA,gBAAAU;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAASH;AAAA,UACT,WAAWK;AAAA,YACT;AAAA,YACAV,KAAY;AAAA,UAAA;AAAA,UAGb,UAAAN;AAAA,QAAA;AAAA,MAAA;AAAA,MAEFC,KACC,gBAAAa,EAAC,KAAA,EAAE,IAAIF,GAAQ,WAAU,kCACtB,UAAAX,EAAA,CACH;AAAA,IAAA,GAEJ;AAGF,6BACG,OAAA,EAAI,WAAWe,EAAG,oCAAoCjB,CAAS,GAC7D,UAAA;AAAA,MAAAG,MAAkB,YAAYe;AAAA,MAC9BJ;AAAA,MACAX,MAAkB,WAAWe;AAAA,IAAA,GAChC;AAAA,EAEJ;AACF;AAEApB,EAAO,cAAc;"}
|
|
@@ -6,7 +6,15 @@ export declare const TableFooter: import('react').ForwardRefExoticComponent<HTML
|
|
|
6
6
|
export declare const TableRow: import('react').ForwardRefExoticComponent<HTMLAttributes<HTMLTableRowElement> & {
|
|
7
7
|
selected?: boolean;
|
|
8
8
|
} & import('react').RefAttributes<HTMLTableRowElement>>;
|
|
9
|
-
export
|
|
9
|
+
export interface TableHeadProps extends ThHTMLAttributes<HTMLTableCellElement> {
|
|
10
|
+
/**
|
|
11
|
+
* Render the header label in small caps (`uppercase tracking-wide`).
|
|
12
|
+
* Off by default — mixed case reads better for long / Cyrillic labels.
|
|
13
|
+
* @default false
|
|
14
|
+
*/
|
|
15
|
+
uppercase?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare const TableHead: import('react').ForwardRefExoticComponent<TableHeadProps & import('react').RefAttributes<HTMLTableCellElement>>;
|
|
10
18
|
export declare const TableCell: import('react').ForwardRefExoticComponent<TdHTMLAttributes<HTMLTableCellElement> & import('react').RefAttributes<HTMLTableCellElement>>;
|
|
11
19
|
export declare const TableCaption: import('react').ForwardRefExoticComponent<HTMLAttributes<HTMLTableCaptionElement> & import('react').RefAttributes<HTMLTableCaptionElement>>;
|
|
12
20
|
export interface TableSortHeaderProps extends ThHTMLAttributes<HTMLTableCellElement> {
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as t, jsxs as p } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as s } from "react";
|
|
4
|
+
import { ArrowUp as g, ArrowDown as T, ArrowUpDown as N } from "../../icons/index.js";
|
|
5
|
+
import { cn as r } from "../../lib/utils.js";
|
|
6
|
+
const x = s(
|
|
7
|
+
function({ className: a, ...e }, o) {
|
|
8
|
+
return /* @__PURE__ */ t("div", { className: "relative w-full overflow-auto", children: /* @__PURE__ */ t(
|
|
9
|
+
"table",
|
|
10
|
+
{
|
|
11
|
+
ref: o,
|
|
12
|
+
className: r("w-full caption-bottom text-sm border-collapse", a),
|
|
13
|
+
...e
|
|
14
|
+
}
|
|
15
|
+
) });
|
|
16
|
+
}
|
|
17
|
+
);
|
|
18
|
+
x.displayName = "Table";
|
|
19
|
+
const h = s(
|
|
20
|
+
function({ className: a, ...e }, o) {
|
|
21
|
+
return /* @__PURE__ */ t(
|
|
22
|
+
"thead",
|
|
23
|
+
{
|
|
24
|
+
ref: o,
|
|
25
|
+
className: r(
|
|
26
|
+
"sticky top-0 z-10 bg-background-subtle text-foreground-muted",
|
|
27
|
+
"[&_tr]:border-b [&_tr]:border-border",
|
|
28
|
+
a
|
|
29
|
+
),
|
|
30
|
+
...e
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
h.displayName = "TableHeader";
|
|
36
|
+
const v = s(
|
|
37
|
+
function({ className: a, ...e }, o) {
|
|
38
|
+
return /* @__PURE__ */ t(
|
|
39
|
+
"tbody",
|
|
40
|
+
{
|
|
41
|
+
ref: o,
|
|
42
|
+
className: r("[&_tr:last-child]:border-0", a),
|
|
43
|
+
...e
|
|
44
|
+
}
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
v.displayName = "TableBody";
|
|
49
|
+
const y = s(
|
|
50
|
+
function({ className: a, ...e }, o) {
|
|
51
|
+
return /* @__PURE__ */ t(
|
|
52
|
+
"tfoot",
|
|
53
|
+
{
|
|
54
|
+
ref: o,
|
|
55
|
+
className: r("border-t border-border bg-background-subtle font-medium", a),
|
|
56
|
+
...e
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
y.displayName = "TableFooter";
|
|
62
|
+
const w = s(function({ className: a, selected: e, ...o }, n) {
|
|
63
|
+
return /* @__PURE__ */ t(
|
|
64
|
+
"tr",
|
|
65
|
+
{
|
|
66
|
+
ref: n,
|
|
67
|
+
"data-selected": e || void 0,
|
|
68
|
+
"aria-selected": e || void 0,
|
|
69
|
+
className: r(
|
|
70
|
+
"border-b border-border transition-colors duration-[var(--duration-fast)]",
|
|
71
|
+
"hover:bg-background-subtle",
|
|
72
|
+
"data-[selected]:bg-accent-soft data-[selected]:hover:bg-accent-soft",
|
|
73
|
+
a
|
|
74
|
+
),
|
|
75
|
+
...o
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
});
|
|
79
|
+
w.displayName = "TableRow";
|
|
80
|
+
const c = s(function({ className: a, uppercase: e = !1, ...o }, n) {
|
|
81
|
+
return /* @__PURE__ */ t(
|
|
82
|
+
"th",
|
|
83
|
+
{
|
|
84
|
+
ref: n,
|
|
85
|
+
className: r(
|
|
86
|
+
"h-10 px-3 text-left align-middle text-xs font-medium text-foreground-subtle",
|
|
87
|
+
e && "uppercase tracking-wide",
|
|
88
|
+
"[&:has([role=checkbox])]:w-10 [&:has([role=checkbox])]:pr-0",
|
|
89
|
+
a
|
|
90
|
+
),
|
|
91
|
+
...o
|
|
92
|
+
}
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
c.displayName = "TableHead";
|
|
96
|
+
const k = s(function({ className: a, ...e }, o) {
|
|
97
|
+
return /* @__PURE__ */ t(
|
|
98
|
+
"td",
|
|
99
|
+
{
|
|
100
|
+
ref: o,
|
|
101
|
+
className: r("px-3 py-3 align-middle text-foreground", a),
|
|
102
|
+
...e
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
});
|
|
106
|
+
k.displayName = "TableCell";
|
|
107
|
+
const H = s(
|
|
108
|
+
function({ className: a, ...e }, o) {
|
|
109
|
+
return /* @__PURE__ */ t(
|
|
110
|
+
"caption",
|
|
111
|
+
{
|
|
112
|
+
ref: o,
|
|
113
|
+
className: r("mt-4 text-sm text-foreground-subtle", a),
|
|
114
|
+
...e
|
|
115
|
+
}
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
);
|
|
119
|
+
H.displayName = "TableCaption";
|
|
120
|
+
const C = s(
|
|
121
|
+
function({ sortKey: a, currentSort: e, onSortChange: o, children: n, className: b, ...u }, f) {
|
|
122
|
+
const i = (e == null ? void 0 : e.key) === a, d = i ? e == null ? void 0 : e.direction : void 0, m = () => {
|
|
123
|
+
o(a, i && d === "asc" ? "desc" : "asc");
|
|
124
|
+
};
|
|
125
|
+
return /* @__PURE__ */ t(c, { ref: f, className: r("p-0", b), "aria-sort": i ? d === "asc" ? "ascending" : "descending" : "none", ...u, children: /* @__PURE__ */ p(
|
|
126
|
+
"button",
|
|
127
|
+
{
|
|
128
|
+
type: "button",
|
|
129
|
+
onClick: m,
|
|
130
|
+
className: r(
|
|
131
|
+
"inline-flex h-10 w-full items-center gap-1.5 px-3 outline-none",
|
|
132
|
+
"transition-colors duration-[var(--duration-fast)]",
|
|
133
|
+
"hover:text-foreground focus-visible:text-foreground",
|
|
134
|
+
"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background rounded-sm",
|
|
135
|
+
i && "text-foreground"
|
|
136
|
+
),
|
|
137
|
+
children: [
|
|
138
|
+
n,
|
|
139
|
+
d === "asc" ? /* @__PURE__ */ t(g, { className: "size-3.5", "aria-hidden": !0 }) : d === "desc" ? /* @__PURE__ */ t(T, { className: "size-3.5", "aria-hidden": !0 }) : /* @__PURE__ */ t(N, { className: "size-3.5 opacity-40", "aria-hidden": !0 })
|
|
140
|
+
]
|
|
141
|
+
}
|
|
142
|
+
) });
|
|
143
|
+
}
|
|
144
|
+
);
|
|
145
|
+
C.displayName = "TableSortHeader";
|
|
146
|
+
export {
|
|
147
|
+
x as Table,
|
|
148
|
+
v as TableBody,
|
|
149
|
+
H as TableCaption,
|
|
150
|
+
k as TableCell,
|
|
151
|
+
y as TableFooter,
|
|
152
|
+
c as TableHead,
|
|
153
|
+
h as TableHeader,
|
|
154
|
+
w as TableRow,
|
|
155
|
+
C as TableSortHeader
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=Table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Table.js","sources":["../../../src/components/ui/Table.tsx"],"sourcesContent":["'use client';\n\nimport { forwardRef, type HTMLAttributes, type ThHTMLAttributes, type TdHTMLAttributes } from 'react';\nimport { ArrowDown, ArrowUp, ArrowUpDown } from '@/icons';\nimport { cn } from '@/lib/utils';\n\n/* -----------------------------------------------------------------------------\n * Table primitives — minimal sugar over <table>. Pair with a sortable\n * header helper (`TableSortHeader`) when you need built-in sort visuals.\n * Empty + loading states are pure composition with the rest of the system.\n * --------------------------------------------------------------------------- */\n\nexport const Table = forwardRef<HTMLTableElement, HTMLAttributes<HTMLTableElement>>(\n function Table({ className, ...props }, ref) {\n return (\n <div className=\"relative w-full overflow-auto\">\n <table\n ref={ref}\n className={cn('w-full caption-bottom text-sm border-collapse', className)}\n {...props}\n />\n </div>\n );\n },\n);\nTable.displayName = 'Table';\n\nexport const TableHeader = forwardRef<HTMLTableSectionElement, HTMLAttributes<HTMLTableSectionElement>>(\n function TableHeader({ className, ...props }, ref) {\n return (\n <thead\n ref={ref}\n className={cn(\n 'sticky top-0 z-10 bg-background-subtle text-foreground-muted',\n '[&_tr]:border-b [&_tr]:border-border',\n className,\n )}\n {...props}\n />\n );\n },\n);\nTableHeader.displayName = 'TableHeader';\n\nexport const TableBody = forwardRef<HTMLTableSectionElement, HTMLAttributes<HTMLTableSectionElement>>(\n function TableBody({ className, ...props }, ref) {\n return (\n <tbody\n ref={ref}\n className={cn('[&_tr:last-child]:border-0', className)}\n {...props}\n />\n );\n },\n);\nTableBody.displayName = 'TableBody';\n\nexport const TableFooter = forwardRef<HTMLTableSectionElement, HTMLAttributes<HTMLTableSectionElement>>(\n function TableFooter({ className, ...props }, ref) {\n return (\n <tfoot\n ref={ref}\n className={cn('border-t border-border bg-background-subtle font-medium', className)}\n {...props}\n />\n );\n },\n);\nTableFooter.displayName = 'TableFooter';\n\nexport const TableRow = forwardRef<\n HTMLTableRowElement,\n HTMLAttributes<HTMLTableRowElement> & { selected?: boolean }\n>(function TableRow({ className, selected, ...props }, ref) {\n return (\n <tr\n ref={ref}\n data-selected={selected || undefined}\n aria-selected={selected || undefined}\n className={cn(\n 'border-b border-border transition-colors duration-[var(--duration-fast)]',\n 'hover:bg-background-subtle',\n 'data-[selected]:bg-accent-soft data-[selected]:hover:bg-accent-soft',\n className,\n )}\n {...props}\n />\n );\n});\nTableRow.displayName = 'TableRow';\n\nexport interface TableHeadProps extends ThHTMLAttributes<HTMLTableCellElement> {\n /**\n * Render the header label in small caps (`uppercase tracking-wide`).\n * Off by default — mixed case reads better for long / Cyrillic labels.\n * @default false\n */\n uppercase?: boolean;\n}\n\nexport const TableHead = forwardRef<HTMLTableCellElement, TableHeadProps>(function TableHead(\n { className, uppercase = false, ...props },\n ref,\n) {\n return (\n <th\n ref={ref}\n className={cn(\n 'h-10 px-3 text-left align-middle text-xs font-medium text-foreground-subtle',\n uppercase && 'uppercase tracking-wide',\n '[&:has([role=checkbox])]:w-10 [&:has([role=checkbox])]:pr-0',\n className,\n )}\n {...props}\n />\n );\n});\nTableHead.displayName = 'TableHead';\n\nexport const TableCell = forwardRef<\n HTMLTableCellElement,\n TdHTMLAttributes<HTMLTableCellElement>\n>(function TableCell({ className, ...props }, ref) {\n return (\n <td\n ref={ref}\n className={cn('px-3 py-3 align-middle text-foreground', className)}\n {...props}\n />\n );\n});\nTableCell.displayName = 'TableCell';\n\nexport const TableCaption = forwardRef<HTMLTableCaptionElement, HTMLAttributes<HTMLTableCaptionElement>>(\n function TableCaption({ className, ...props }, ref) {\n return (\n <caption\n ref={ref}\n className={cn('mt-4 text-sm text-foreground-subtle', className)}\n {...props}\n />\n );\n },\n);\nTableCaption.displayName = 'TableCaption';\n\nexport interface TableSortHeaderProps extends ThHTMLAttributes<HTMLTableCellElement> {\n /** Stable column key used in `currentSort.key`. */\n sortKey: string;\n /** Currently sorted column + direction (or null). */\n currentSort: { key: string; direction: 'asc' | 'desc' } | null;\n /** Called when the user clicks the header. */\n onSortChange: (key: string, direction: 'asc' | 'desc') => void;\n}\n\n/**\n * Sortable column header. Click toggles asc → desc → asc; the icon reflects\n * the current state.\n *\n * @example\n * <TableSortHeader sortKey=\"name\" currentSort={sort} onSortChange={onSort}>\n * Name\n * </TableSortHeader>\n *\n * @do Sort by one column at a time. Multi-sort hides state from users.\n * @dont Sort silently — the icon must change so users see what changed.\n */\nexport const TableSortHeader = forwardRef<HTMLTableCellElement, TableSortHeaderProps>(\n function TableSortHeader(\n { sortKey, currentSort, onSortChange, children, className, ...props },\n ref,\n ) {\n const active = currentSort?.key === sortKey;\n const direction = active ? currentSort?.direction : undefined;\n const handle = () => {\n onSortChange(sortKey, active && direction === 'asc' ? 'desc' : 'asc');\n };\n return (\n <TableHead ref={ref} className={cn('p-0', className)} aria-sort={active ? (direction === 'asc' ? 'ascending' : 'descending') : 'none'} {...props}>\n <button\n type=\"button\"\n onClick={handle}\n className={cn(\n 'inline-flex h-10 w-full items-center gap-1.5 px-3 outline-none',\n 'transition-colors duration-[var(--duration-fast)]',\n 'hover:text-foreground focus-visible:text-foreground',\n 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background rounded-sm',\n active && 'text-foreground',\n )}\n >\n {children}\n {direction === 'asc' ? (\n <ArrowUp className=\"size-3.5\" aria-hidden />\n ) : direction === 'desc' ? (\n <ArrowDown className=\"size-3.5\" aria-hidden />\n ) : (\n <ArrowUpDown className=\"size-3.5 opacity-40\" aria-hidden />\n )}\n </button>\n </TableHead>\n );\n },\n);\nTableSortHeader.displayName = 'TableSortHeader';\n"],"names":["Table","forwardRef","className","props","ref","jsx","cn","TableHeader","TableBody","TableFooter","TableRow","selected","TableHead","uppercase","TableCell","TableCaption","TableSortHeader","sortKey","currentSort","onSortChange","children","active","direction","handle","jsxs","ArrowUp","ArrowDown","ArrowUpDown"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ComponentPropsWithoutRef } from 'react';
|
|
2
|
-
import { VariantProps } from '../../lib/cva';
|
|
2
|
+
import { VariantProps } from '../../lib/cva.js';
|
|
3
3
|
import * as TabsPrimitive from '@radix-ui/react-tabs';
|
|
4
4
|
export declare const Tabs: import('react').ForwardRefExoticComponent<TabsPrimitive.TabsProps & import('react').RefAttributes<HTMLDivElement>>;
|
|
5
5
|
declare const list: (props?: ({
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as n } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as r } from "react";
|
|
4
|
+
import * as i from "@radix-ui/react-tabs";
|
|
5
|
+
import { cn as s } from "../../lib/utils.js";
|
|
6
|
+
import { cva as u } from "class-variance-authority";
|
|
7
|
+
const _ = i.Root, v = u("inline-flex items-center", {
|
|
8
|
+
variants: {
|
|
9
|
+
variant: {
|
|
10
|
+
underline: "gap-4 border-b border-border w-full",
|
|
11
|
+
pills: "gap-1 rounded-lg bg-background-muted p-1"
|
|
12
|
+
},
|
|
13
|
+
size: {
|
|
14
|
+
sm: "h-9 text-xs",
|
|
15
|
+
md: "h-10 text-sm",
|
|
16
|
+
lg: "h-11 text-sm"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
defaultVariants: { variant: "underline", size: "md" }
|
|
20
|
+
}), f = r(
|
|
21
|
+
function({ className: t, variant: a = "underline", size: e, ...o }, l) {
|
|
22
|
+
return /* @__PURE__ */ n(
|
|
23
|
+
i.List,
|
|
24
|
+
{
|
|
25
|
+
ref: l,
|
|
26
|
+
"data-variant": a,
|
|
27
|
+
className: s(v({ variant: a, size: e }), t),
|
|
28
|
+
...o
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
f.displayName = "TabsList";
|
|
34
|
+
const c = r(function({ className: t, ...a }, e) {
|
|
35
|
+
return /* @__PURE__ */ n(
|
|
36
|
+
i.Trigger,
|
|
37
|
+
{
|
|
38
|
+
ref: e,
|
|
39
|
+
className: s(
|
|
40
|
+
"inline-flex items-center gap-2 whitespace-nowrap font-medium",
|
|
41
|
+
"outline-none transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out)]",
|
|
42
|
+
"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
43
|
+
"disabled:pointer-events-none disabled:opacity-50",
|
|
44
|
+
// Underline variant
|
|
45
|
+
"[[data-variant=underline]_&]:relative [[data-variant=underline]_&]:h-full",
|
|
46
|
+
"[[data-variant=underline]_&]:px-1 [[data-variant=underline]_&]:text-foreground-muted",
|
|
47
|
+
"[[data-variant=underline]_&]:hover:text-foreground",
|
|
48
|
+
"[[data-variant=underline]_&]:data-[state=active]:text-foreground",
|
|
49
|
+
"[[data-variant=underline]_&]:data-[state=active]:after:absolute",
|
|
50
|
+
"[[data-variant=underline]_&]:data-[state=active]:after:inset-x-0",
|
|
51
|
+
"[[data-variant=underline]_&]:data-[state=active]:after:-bottom-px",
|
|
52
|
+
"[[data-variant=underline]_&]:data-[state=active]:after:h-0.5",
|
|
53
|
+
"[[data-variant=underline]_&]:data-[state=active]:after:bg-accent",
|
|
54
|
+
// Pills variant
|
|
55
|
+
"[[data-variant=pills]_&]:h-full [[data-variant=pills]_&]:rounded-md [[data-variant=pills]_&]:px-3",
|
|
56
|
+
"[[data-variant=pills]_&]:text-foreground-muted",
|
|
57
|
+
"[[data-variant=pills]_&]:hover:text-foreground",
|
|
58
|
+
"[[data-variant=pills]_&]:data-[state=active]:bg-card",
|
|
59
|
+
"[[data-variant=pills]_&]:data-[state=active]:text-foreground",
|
|
60
|
+
"[[data-variant=pills]_&]:data-[state=active]:shadow-xs",
|
|
61
|
+
t
|
|
62
|
+
),
|
|
63
|
+
...a
|
|
64
|
+
}
|
|
65
|
+
);
|
|
66
|
+
});
|
|
67
|
+
c.displayName = "TabsTrigger";
|
|
68
|
+
const g = r(function({ className: t, ...a }, e) {
|
|
69
|
+
return /* @__PURE__ */ n(
|
|
70
|
+
i.Content,
|
|
71
|
+
{
|
|
72
|
+
ref: e,
|
|
73
|
+
className: s(
|
|
74
|
+
"mt-4 outline-none",
|
|
75
|
+
"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
76
|
+
t
|
|
77
|
+
),
|
|
78
|
+
...a
|
|
79
|
+
}
|
|
80
|
+
);
|
|
81
|
+
});
|
|
82
|
+
g.displayName = "TabsContent";
|
|
83
|
+
export {
|
|
84
|
+
_ as Tabs,
|
|
85
|
+
g as TabsContent,
|
|
86
|
+
f as TabsList,
|
|
87
|
+
c as TabsTrigger
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=Tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tabs.js","sources":["../../../src/components/ui/Tabs.tsx"],"sourcesContent":["'use client';\n\nimport {\n forwardRef,\n type ComponentPropsWithoutRef,\n type ElementRef,\n} from 'react';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\nimport { cn } from '@/lib/utils';\nimport { cva, type VariantProps } from '@/lib/cva';\n\n/* -----------------------------------------------------------------------------\n * Two visual variants — `underline` (refined-minimal default) and `pills`.\n * Variant is set on `TabsList`; trigger styles auto-derive via data-attr.\n * --------------------------------------------------------------------------- */\n\nexport const Tabs = TabsPrimitive.Root;\n\nconst list = cva('inline-flex items-center', {\n variants: {\n variant: {\n underline: 'gap-4 border-b border-border w-full',\n pills: 'gap-1 rounded-lg bg-background-muted p-1',\n },\n size: {\n sm: 'h-9 text-xs',\n md: 'h-10 text-sm',\n lg: 'h-11 text-sm',\n },\n },\n defaultVariants: { variant: 'underline', size: 'md' },\n});\n\nexport interface TabsListProps\n extends ComponentPropsWithoutRef<typeof TabsPrimitive.List>,\n VariantProps<typeof list> {}\n\nexport const TabsList = forwardRef<ElementRef<typeof TabsPrimitive.List>, TabsListProps>(\n function TabsList({ className, variant = 'underline', size, ...props }, ref) {\n return (\n <TabsPrimitive.List\n ref={ref}\n data-variant={variant}\n className={cn(list({ variant, size }), className)}\n {...props}\n />\n );\n },\n);\nTabsList.displayName = 'TabsList';\n\nexport const TabsTrigger = forwardRef<\n ElementRef<typeof TabsPrimitive.Trigger>,\n ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(function TabsTrigger({ className, ...props }, ref) {\n return (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n 'inline-flex items-center gap-2 whitespace-nowrap font-medium',\n 'outline-none transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out)]',\n 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:pointer-events-none disabled:opacity-50',\n // Underline variant\n '[[data-variant=underline]_&]:relative [[data-variant=underline]_&]:h-full',\n '[[data-variant=underline]_&]:px-1 [[data-variant=underline]_&]:text-foreground-muted',\n '[[data-variant=underline]_&]:hover:text-foreground',\n '[[data-variant=underline]_&]:data-[state=active]:text-foreground',\n '[[data-variant=underline]_&]:data-[state=active]:after:absolute',\n '[[data-variant=underline]_&]:data-[state=active]:after:inset-x-0',\n '[[data-variant=underline]_&]:data-[state=active]:after:-bottom-px',\n '[[data-variant=underline]_&]:data-[state=active]:after:h-0.5',\n '[[data-variant=underline]_&]:data-[state=active]:after:bg-accent',\n // Pills variant\n '[[data-variant=pills]_&]:h-full [[data-variant=pills]_&]:rounded-md [[data-variant=pills]_&]:px-3',\n '[[data-variant=pills]_&]:text-foreground-muted',\n '[[data-variant=pills]_&]:hover:text-foreground',\n '[[data-variant=pills]_&]:data-[state=active]:bg-card',\n '[[data-variant=pills]_&]:data-[state=active]:text-foreground',\n '[[data-variant=pills]_&]:data-[state=active]:shadow-xs',\n className,\n )}\n {...props}\n />\n );\n});\nTabsTrigger.displayName = 'TabsTrigger';\n\nexport const TabsContent = forwardRef<\n ElementRef<typeof TabsPrimitive.Content>,\n ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(function TabsContent({ className, ...props }, ref) {\n return (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'mt-4 outline-none',\n 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n className,\n )}\n {...props}\n />\n );\n});\nTabsContent.displayName = 'TabsContent';\n\n/**\n * @example Underline (default)\n * <Tabs defaultValue=\"overview\">\n * <TabsList>\n * <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n * <TabsTrigger value=\"activity\">Activity</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"overview\">…</TabsContent>\n * <TabsContent value=\"activity\">…</TabsContent>\n * </Tabs>\n *\n * @example Pills\n * <TabsList variant=\"pills\"><TabsTrigger value=\"all\">All</TabsTrigger>…</TabsList>\n *\n * @do Use `underline` at the top of a page or panel. Use `pills` inside a\n * card or for filter-style switches.\n * @dont Mix variants on the same screen — pick one and commit.\n */\n"],"names":["Tabs","TabsPrimitive","list","cva","TabsList","forwardRef","className","variant","size","props","ref","jsx","cn","TabsTrigger","TabsContent"],"mappings":";;;;;;AAgBO,MAAMA,IAAOC,EAAc,MAE5BC,IAAOC,EAAI,4BAA4B;AAAA,EAC3C,UAAU;AAAA,IACR,SAAS;AAAA,MACP,WAAW;AAAA,MACX,OAAO;AAAA,IAAA;AAAA,IAET,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,EACN;AAAA,EAEF,iBAAiB,EAAE,SAAS,aAAa,MAAM,KAAA;AACjD,CAAC,GAMYC,IAAWC;AAAA,EACtB,SAAkB,EAAE,WAAAC,GAAW,SAAAC,IAAU,aAAa,MAAAC,GAAM,GAAGC,EAAA,GAASC,GAAK;AAC3E,WACE,gBAAAC;AAAA,MAACV,EAAc;AAAA,MAAd;AAAA,QACC,KAAAS;AAAA,QACA,gBAAcH;AAAA,QACd,WAAWK,EAAGV,EAAK,EAAE,SAAAK,GAAS,MAAAC,EAAA,CAAM,GAAGF,CAAS;AAAA,QAC/C,GAAGG;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;AACAL,EAAS,cAAc;AAEhB,MAAMS,IAAcR,EAGzB,SAAqB,EAAE,WAAAC,GAAW,GAAGG,EAAA,GAASC,GAAK;AACnD,SACE,gBAAAC;AAAA,IAACV,EAAc;AAAA,IAAd;AAAA,MACC,KAAAS;AAAA,MACA,WAAWE;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QAEA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QAEA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACAN;AAAA,MAAA;AAAA,MAED,GAAGG;AAAA,IAAA;AAAA,EAAA;AAGV,CAAC;AACDI,EAAY,cAAc;AAEnB,MAAMC,IAAcT,EAGzB,SAAqB,EAAE,WAAAC,GAAW,GAAGG,EAAA,GAASC,GAAK;AACnD,SACE,gBAAAC;AAAA,IAACV,EAAc;AAAA,IAAd;AAAA,MACC,KAAAS;AAAA,MACA,WAAWE;AAAA,QACT;AAAA,QACA;AAAA,QACAN;AAAA,MAAA;AAAA,MAED,GAAGG;AAAA,IAAA;AAAA,EAAA;AAGV,CAAC;AACDK,EAAY,cAAc;"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
1
2
|
export interface TagInputProps {
|
|
2
3
|
/** Controlled list of tags. */
|
|
3
4
|
value?: string[];
|
|
@@ -5,16 +6,30 @@ export interface TagInputProps {
|
|
|
5
6
|
defaultValue?: string[];
|
|
6
7
|
/** Called when the tag list changes. */
|
|
7
8
|
onChange?: (tags: string[]) => void;
|
|
9
|
+
/** Visible label rendered above the field. */
|
|
10
|
+
label?: ReactNode;
|
|
11
|
+
/** Visually conceal the label while keeping it for screen readers. */
|
|
12
|
+
hideLabel?: boolean;
|
|
13
|
+
/** Hint below the field. Hidden while `error` is set. */
|
|
14
|
+
description?: ReactNode;
|
|
8
15
|
/** Placeholder shown inside the inline input. */
|
|
9
16
|
placeholder?: string;
|
|
10
17
|
/** Maximum number of tags. */
|
|
11
18
|
max?: number;
|
|
12
19
|
/** Disable the editor. */
|
|
13
20
|
disabled?: boolean;
|
|
14
|
-
/**
|
|
15
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Validation state. `true` only paints the danger border; a ReactNode also
|
|
23
|
+
* renders the message below the field and wires `aria-describedby`.
|
|
24
|
+
*/
|
|
25
|
+
error?: boolean | ReactNode;
|
|
16
26
|
/** Treat these characters as separators (default: Enter + comma). */
|
|
17
27
|
separators?: string[];
|
|
28
|
+
/** Consumer-supplied id for the inline input. */
|
|
29
|
+
id?: string;
|
|
30
|
+
/** Extra ids to append to `aria-describedby`. */
|
|
31
|
+
'aria-describedby'?: string;
|
|
32
|
+
'aria-label'?: string;
|
|
18
33
|
className?: string;
|
|
19
34
|
}
|
|
20
35
|
/**
|