@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,148 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as f, jsx as i } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as R, useId as S, useMemo as F } from "react";
|
|
4
|
+
import { ChevronsLeft as A, ChevronLeft as B, ChevronRight as T, ChevronsRight as V } from "../../icons/index.js";
|
|
5
|
+
import { cn as g } from "../../lib/utils.js";
|
|
6
|
+
import { useStrings as _ } from "../../hooks/use-strings.js";
|
|
7
|
+
import { defaultStrings as $, formatString as h } from "../../lib/strings.js";
|
|
8
|
+
import { Select as q, SelectTrigger as z, SelectContent as D, SelectItem as E } from "./Select.js";
|
|
9
|
+
function p(r) {
|
|
10
|
+
return {
|
|
11
|
+
showing: (e, a, c) => h(r.showing, { from: e, to: a, total: c }),
|
|
12
|
+
rowsPerPage: r.rowsPerPage,
|
|
13
|
+
first: r.first,
|
|
14
|
+
last: r.last,
|
|
15
|
+
prev: r.prev,
|
|
16
|
+
next: r.next,
|
|
17
|
+
page: (e) => h(r.page, { n: e }),
|
|
18
|
+
perPage: (e) => h(r.perPage, { n: e }),
|
|
19
|
+
nav: r.nav
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
const Z = p(
|
|
23
|
+
$.pagination
|
|
24
|
+
);
|
|
25
|
+
function G(r, e, a = 7) {
|
|
26
|
+
if (e <= a) return Array.from({ length: e }, (l, m) => m + 1);
|
|
27
|
+
const c = 1, t = [], s = Math.max(2, r - c), d = Math.min(e - 1, r + c);
|
|
28
|
+
t.push(1), s > 2 && t.push("gap");
|
|
29
|
+
for (let l = s; l <= d; l++) t.push(l);
|
|
30
|
+
return d < e - 1 && t.push("gap"), t.push(e), t;
|
|
31
|
+
}
|
|
32
|
+
const H = R(function({
|
|
33
|
+
page: e,
|
|
34
|
+
pageCount: a,
|
|
35
|
+
onPageChange: c,
|
|
36
|
+
totalItems: t,
|
|
37
|
+
pageSize: s,
|
|
38
|
+
pageSizeOptions: d,
|
|
39
|
+
onPageSizeChange: l,
|
|
40
|
+
showJump: m = !0,
|
|
41
|
+
labels: w,
|
|
42
|
+
className: y,
|
|
43
|
+
"aria-label": P,
|
|
44
|
+
...k
|
|
45
|
+
}, C) {
|
|
46
|
+
const j = _(), o = { ...p(j.pagination), ...w }, v = S(), L = F(() => G(e, a), [e, a]), x = s ? (e - 1) * s + 1 : void 0, N = s && t ? Math.min(e * s, t) : void 0, u = (n) => {
|
|
47
|
+
n < 1 || n > a || n === e || c(n);
|
|
48
|
+
};
|
|
49
|
+
return /* @__PURE__ */ f(
|
|
50
|
+
"nav",
|
|
51
|
+
{
|
|
52
|
+
ref: C,
|
|
53
|
+
"aria-label": P ?? o.nav,
|
|
54
|
+
className: g("flex flex-wrap items-center justify-between gap-3", y),
|
|
55
|
+
...k,
|
|
56
|
+
children: [
|
|
57
|
+
/* @__PURE__ */ f("div", { className: "text-foreground-muted flex items-center gap-3 text-sm", children: [
|
|
58
|
+
t !== void 0 && s !== void 0 && x !== void 0 && N !== void 0 && /* @__PURE__ */ i("span", { className: "tabular", children: o.showing(x, N, t) }),
|
|
59
|
+
d && l && s !== void 0 && /* @__PURE__ */ f("div", { className: "flex items-center gap-2", children: [
|
|
60
|
+
/* @__PURE__ */ i("label", { htmlFor: v, className: "sr-only", children: o.rowsPerPage }),
|
|
61
|
+
/* @__PURE__ */ f(q, { value: String(s), onValueChange: (n) => l(Number(n)), children: [
|
|
62
|
+
/* @__PURE__ */ i(z, { id: v, size: "sm", className: "w-[7.5rem] whitespace-nowrap" }),
|
|
63
|
+
/* @__PURE__ */ i(D, { children: d.map((n) => /* @__PURE__ */ i(E, { value: String(n), children: o.perPage(n) }, n)) })
|
|
64
|
+
] })
|
|
65
|
+
] })
|
|
66
|
+
] }),
|
|
67
|
+
/* @__PURE__ */ f("ul", { className: "flex items-center gap-1", children: [
|
|
68
|
+
m && /* @__PURE__ */ i("li", { children: /* @__PURE__ */ i(
|
|
69
|
+
"button",
|
|
70
|
+
{
|
|
71
|
+
type: "button",
|
|
72
|
+
"aria-label": o.first,
|
|
73
|
+
disabled: e === 1,
|
|
74
|
+
onClick: () => u(1),
|
|
75
|
+
className: b,
|
|
76
|
+
children: /* @__PURE__ */ i(A, { className: "size-4", "aria-hidden": !0 })
|
|
77
|
+
}
|
|
78
|
+
) }),
|
|
79
|
+
/* @__PURE__ */ i("li", { children: /* @__PURE__ */ i(
|
|
80
|
+
"button",
|
|
81
|
+
{
|
|
82
|
+
type: "button",
|
|
83
|
+
"aria-label": o.prev,
|
|
84
|
+
disabled: e === 1,
|
|
85
|
+
onClick: () => u(e - 1),
|
|
86
|
+
className: b,
|
|
87
|
+
children: /* @__PURE__ */ i(B, { className: "size-4", "aria-hidden": !0 })
|
|
88
|
+
}
|
|
89
|
+
) }),
|
|
90
|
+
L.map(
|
|
91
|
+
(n, M) => n === "gap" ? /* @__PURE__ */ i("li", { className: "text-foreground-subtle px-2", children: "…" }, `gap-${M}`) : /* @__PURE__ */ i("li", { children: /* @__PURE__ */ i(
|
|
92
|
+
"button",
|
|
93
|
+
{
|
|
94
|
+
type: "button",
|
|
95
|
+
"aria-label": o.page(n),
|
|
96
|
+
"aria-current": n === e ? "page" : void 0,
|
|
97
|
+
onClick: () => u(n),
|
|
98
|
+
className: g(
|
|
99
|
+
"tabular inline-flex size-8 items-center justify-center rounded-md text-sm outline-none",
|
|
100
|
+
"transition-colors duration-[var(--duration-fast)]",
|
|
101
|
+
"focus-visible:ring-ring focus-visible:ring-offset-background focus-visible:ring-2 focus-visible:ring-offset-2",
|
|
102
|
+
n === e ? "bg-accent text-on-accent font-medium" : "text-foreground-muted hover:bg-background-muted hover:text-foreground"
|
|
103
|
+
),
|
|
104
|
+
children: n
|
|
105
|
+
}
|
|
106
|
+
) }, n)
|
|
107
|
+
),
|
|
108
|
+
/* @__PURE__ */ i("li", { children: /* @__PURE__ */ i(
|
|
109
|
+
"button",
|
|
110
|
+
{
|
|
111
|
+
type: "button",
|
|
112
|
+
"aria-label": o.next,
|
|
113
|
+
disabled: e === a,
|
|
114
|
+
onClick: () => u(e + 1),
|
|
115
|
+
className: b,
|
|
116
|
+
children: /* @__PURE__ */ i(T, { className: "size-4", "aria-hidden": !0 })
|
|
117
|
+
}
|
|
118
|
+
) }),
|
|
119
|
+
m && /* @__PURE__ */ i("li", { children: /* @__PURE__ */ i(
|
|
120
|
+
"button",
|
|
121
|
+
{
|
|
122
|
+
type: "button",
|
|
123
|
+
"aria-label": o.last,
|
|
124
|
+
disabled: e === a,
|
|
125
|
+
onClick: () => u(a),
|
|
126
|
+
className: b,
|
|
127
|
+
children: /* @__PURE__ */ i(V, { className: "size-4", "aria-hidden": !0 })
|
|
128
|
+
}
|
|
129
|
+
) })
|
|
130
|
+
] })
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
);
|
|
134
|
+
});
|
|
135
|
+
H.displayName = "Pagination";
|
|
136
|
+
const b = g(
|
|
137
|
+
"inline-flex size-8 items-center justify-center rounded-md text-foreground-muted",
|
|
138
|
+
"transition-colors duration-[var(--duration-fast)]",
|
|
139
|
+
"hover:bg-background-muted hover:text-foreground",
|
|
140
|
+
"disabled:opacity-50 disabled:pointer-events-none",
|
|
141
|
+
"outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
|
|
142
|
+
);
|
|
143
|
+
export {
|
|
144
|
+
H as Pagination,
|
|
145
|
+
Z as defaultPaginationLabels,
|
|
146
|
+
p as paginationLabelsFromStrings
|
|
147
|
+
};
|
|
148
|
+
//# sourceMappingURL=Pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pagination.js","sources":["../../../src/components/ui/Pagination.tsx"],"sourcesContent":["'use client';\n\nimport { forwardRef, useId, useMemo, type HTMLAttributes } from 'react';\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from '@/icons';\nimport { cn } from '@/lib/utils';\nimport { useStrings } from '@/hooks/use-strings';\nimport { defaultStrings, formatString, type UiStrings } from '@/lib/strings';\nimport { Select, SelectContent, SelectItem, SelectTrigger } from './Select';\n\nexport interface PaginationLabels {\n /** Summary line. Receives the computed range. */\n showing: (from: number, to: number, total: number) => string;\n /** sr-only label for the page-size select. */\n rowsPerPage: string;\n first: string;\n last: string;\n prev: string;\n next: string;\n /** aria-label for a numbered page button. */\n page: (n: number) => string;\n /** Suffix in the page-size options, e.g. \"20 / page\". */\n perPage: (n: number) => string;\n /** aria-label of the nav landmark. */\n nav: string;\n}\n\n/** Build the label set from a strings object (context → functions). */\nexport function paginationLabelsFromStrings(s: UiStrings['pagination']): PaginationLabels {\n return {\n showing: (from, to, total) => formatString(s.showing, { from, to, total }),\n rowsPerPage: s.rowsPerPage,\n first: s.first,\n last: s.last,\n prev: s.prev,\n next: s.next,\n page: (n) => formatString(s.page, { n }),\n perPage: (n) => formatString(s.perPage, { n }),\n nav: s.nav,\n };\n}\n\n/** English defaults — derived from `defaultStrings.pagination`. */\nexport const defaultPaginationLabels: PaginationLabels = paginationLabelsFromStrings(\n defaultStrings.pagination,\n);\n\nexport interface PaginationProps extends HTMLAttributes<HTMLElement> {\n /** 1-indexed current page. */\n page: number;\n /** Total number of pages. Set to 0 to hide page numbers. */\n pageCount: number;\n /** Called with the new page when navigating. */\n onPageChange: (page: number) => void;\n /** Total item count, for the \"Showing 1-20 of 200\" hint. Omit to hide. */\n totalItems?: number;\n /** Items shown per page (controlled if `onPageSizeChange` is provided). */\n pageSize?: number;\n /** Options for the page-size select. */\n pageSizeOptions?: number[];\n /** Called when the user picks a new page size. */\n onPageSizeChange?: (size: number) => void;\n /** Show first/last (« ») jump buttons. Default true. */\n showJump?: boolean;\n /** Override any of the visible / accessible strings (i18n). */\n labels?: Partial<PaginationLabels>;\n}\n\nfunction pageRange(current: number, total: number, max = 7): (number | 'gap')[] {\n if (total <= max) return Array.from({ length: total }, (_, i) => i + 1);\n const window = 1;\n const result: (number | 'gap')[] = [];\n const start = Math.max(2, current - window);\n const end = Math.min(total - 1, current + window);\n\n result.push(1);\n if (start > 2) result.push('gap');\n for (let i = start; i <= end; i++) result.push(i);\n if (end < total - 1) result.push('gap');\n result.push(total);\n return result;\n}\n\n/**\n * Numbered pagination with prev/next, first/last jumps, page-size selector,\n * and item-count summary.\n *\n * @example\n * <Pagination page={page} pageCount={20} onPageChange={setPage}\n * totalItems={400} pageSize={20}\n * pageSizeOptions={[10, 20, 50]} onPageSizeChange={setSize} />\n *\n * @do Place the count summary on the left and controls on the right.\n * @dont Show numbers when there are >100 pages — use a \"jump to\" input instead.\n */\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(function Pagination(\n {\n page,\n pageCount,\n onPageChange,\n totalItems,\n pageSize,\n pageSizeOptions,\n onPageSizeChange,\n showJump = true,\n labels: labelsProp,\n className,\n 'aria-label': ariaLabel,\n ...props\n },\n ref,\n) {\n const strings = useStrings();\n const labels = { ...paginationLabelsFromStrings(strings.pagination), ...labelsProp };\n const pageSizeId = useId();\n const pages = useMemo(() => pageRange(page, pageCount), [page, pageCount]);\n\n const from = pageSize ? (page - 1) * pageSize + 1 : undefined;\n const to = pageSize && totalItems ? Math.min(page * pageSize, totalItems) : undefined;\n\n const goto = (p: number) => {\n if (p < 1 || p > pageCount || p === page) return;\n onPageChange(p);\n };\n\n return (\n <nav\n ref={ref}\n aria-label={ariaLabel ?? labels.nav}\n className={cn('flex flex-wrap items-center justify-between gap-3', className)}\n {...props}\n >\n <div className=\"text-foreground-muted flex items-center gap-3 text-sm\">\n {totalItems !== undefined &&\n pageSize !== undefined &&\n from !== undefined &&\n to !== undefined && (\n <span className=\"tabular\">{labels.showing(from, to, totalItems)}</span>\n )}\n {pageSizeOptions && onPageSizeChange && pageSize !== undefined && (\n <div className=\"flex items-center gap-2\">\n <label htmlFor={pageSizeId} className=\"sr-only\">\n {labels.rowsPerPage}\n </label>\n <Select value={String(pageSize)} onValueChange={(v) => onPageSizeChange(Number(v))}>\n <SelectTrigger id={pageSizeId} size=\"sm\" className=\"w-[7.5rem] whitespace-nowrap\" />\n <SelectContent>\n {pageSizeOptions.map((s) => (\n <SelectItem key={s} value={String(s)}>\n {labels.perPage(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n </div>\n\n <ul className=\"flex items-center gap-1\">\n {showJump && (\n <li>\n <button\n type=\"button\"\n aria-label={labels.first}\n disabled={page === 1}\n onClick={() => goto(1)}\n className={navButtonClass}\n >\n <ChevronsLeft className=\"size-4\" aria-hidden />\n </button>\n </li>\n )}\n <li>\n <button\n type=\"button\"\n aria-label={labels.prev}\n disabled={page === 1}\n onClick={() => goto(page - 1)}\n className={navButtonClass}\n >\n <ChevronLeft className=\"size-4\" aria-hidden />\n </button>\n </li>\n {pages.map((p, i) =>\n p === 'gap' ? (\n <li key={`gap-${i}`} className=\"text-foreground-subtle px-2\">\n …\n </li>\n ) : (\n <li key={p}>\n <button\n type=\"button\"\n aria-label={labels.page(p)}\n aria-current={p === page ? 'page' : undefined}\n onClick={() => goto(p)}\n className={cn(\n 'tabular inline-flex size-8 items-center justify-center rounded-md text-sm outline-none',\n 'transition-colors duration-[var(--duration-fast)]',\n 'focus-visible:ring-ring focus-visible:ring-offset-background focus-visible:ring-2 focus-visible:ring-offset-2',\n p === page\n ? 'bg-accent text-on-accent font-medium'\n : 'text-foreground-muted hover:bg-background-muted hover:text-foreground',\n )}\n >\n {p}\n </button>\n </li>\n ),\n )}\n <li>\n <button\n type=\"button\"\n aria-label={labels.next}\n disabled={page === pageCount}\n onClick={() => goto(page + 1)}\n className={navButtonClass}\n >\n <ChevronRight className=\"size-4\" aria-hidden />\n </button>\n </li>\n {showJump && (\n <li>\n <button\n type=\"button\"\n aria-label={labels.last}\n disabled={page === pageCount}\n onClick={() => goto(pageCount)}\n className={navButtonClass}\n >\n <ChevronsRight className=\"size-4\" aria-hidden />\n </button>\n </li>\n )}\n </ul>\n </nav>\n );\n});\nPagination.displayName = 'Pagination';\n\nconst navButtonClass = cn(\n 'inline-flex size-8 items-center justify-center rounded-md text-foreground-muted',\n 'transition-colors duration-[var(--duration-fast)]',\n 'hover:bg-background-muted hover:text-foreground',\n 'disabled:opacity-50 disabled:pointer-events-none',\n 'outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n);\n"],"names":["paginationLabelsFromStrings","s","from","to","total","formatString","n","defaultPaginationLabels","defaultStrings","pageRange","current","max","_","i","window","result","start","end","Pagination","forwardRef","page","pageCount","onPageChange","totalItems","pageSize","pageSizeOptions","onPageSizeChange","showJump","labelsProp","className","ariaLabel","props","ref","strings","useStrings","labels","pageSizeId","useId","pages","useMemo","goto","p","jsxs","cn","jsx","Select","v","SelectTrigger","SelectContent","SelectItem","navButtonClass","ChevronsLeft","ChevronLeft","ChevronRight","ChevronsRight"],"mappings":";;;;;;;;AA2BO,SAASA,EAA4BC,GAA8C;AACxF,SAAO;AAAA,IACL,SAAS,CAACC,GAAMC,GAAIC,MAAUC,EAAaJ,EAAE,SAAS,EAAE,MAAAC,GAAM,IAAAC,GAAI,OAAAC,EAAA,CAAO;AAAA,IACzE,aAAaH,EAAE;AAAA,IACf,OAAOA,EAAE;AAAA,IACT,MAAMA,EAAE;AAAA,IACR,MAAMA,EAAE;AAAA,IACR,MAAMA,EAAE;AAAA,IACR,MAAM,CAACK,MAAMD,EAAaJ,EAAE,MAAM,EAAE,GAAAK,GAAG;AAAA,IACvC,SAAS,CAACA,MAAMD,EAAaJ,EAAE,SAAS,EAAE,GAAAK,GAAG;AAAA,IAC7C,KAAKL,EAAE;AAAA,EAAA;AAEX;AAGO,MAAMM,IAA4CP;AAAA,EACvDQ,EAAe;AACjB;AAuBA,SAASC,EAAUC,GAAiBN,GAAeO,IAAM,GAAuB;AAC9E,MAAIP,KAASO,EAAK,QAAO,MAAM,KAAK,EAAE,QAAQP,EAAA,GAAS,CAACQ,GAAGC,MAAMA,IAAI,CAAC;AACtE,QAAMC,IAAS,GACTC,IAA6B,CAAA,GAC7BC,IAAQ,KAAK,IAAI,GAAGN,IAAUI,CAAM,GACpCG,IAAM,KAAK,IAAIb,IAAQ,GAAGM,IAAUI,CAAM;AAEhD,EAAAC,EAAO,KAAK,CAAC,GACTC,IAAQ,KAAGD,EAAO,KAAK,KAAK;AAChC,WAASF,IAAIG,GAAOH,KAAKI,GAAKJ,IAAK,CAAAE,EAAO,KAAKF,CAAC;AAChD,SAAII,IAAMb,IAAQ,KAAGW,EAAO,KAAK,KAAK,GACtCA,EAAO,KAAKX,CAAK,GACVW;AACT;AAcO,MAAMG,IAAaC,EAAyC,SACjE;AAAA,EACE,MAAAC;AAAA,EACA,WAAAC;AAAA,EACA,cAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,QAAQC;AAAA,EACR,WAAAC;AAAA,EACA,cAAcC;AAAA,EACd,GAAGC;AACL,GACAC,GACA;AACA,QAAMC,IAAUC,EAAA,GACVC,IAAS,EAAE,GAAGnC,EAA4BiC,EAAQ,UAAU,GAAG,GAAGL,EAAA,GAClEQ,IAAaC,EAAA,GACbC,IAAQC,EAAQ,MAAM9B,EAAUW,GAAMC,CAAS,GAAG,CAACD,GAAMC,CAAS,CAAC,GAEnEnB,IAAOsB,KAAYJ,IAAO,KAAKI,IAAW,IAAI,QAC9CrB,IAAKqB,KAAYD,IAAa,KAAK,IAAIH,IAAOI,GAAUD,CAAU,IAAI,QAEtEiB,IAAO,CAACC,MAAc;AAC1B,IAAIA,IAAI,KAAKA,IAAIpB,KAAaoB,MAAMrB,KACpCE,EAAamB,CAAC;AAAA,EAChB;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAV;AAAA,MACA,cAAYF,KAAaK,EAAO;AAAA,MAChC,WAAWQ,EAAG,qDAAqDd,CAAS;AAAA,MAC3E,GAAGE;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAW,EAAC,OAAA,EAAI,WAAU,yDACZ,UAAA;AAAA,UAAAnB,MAAe,UACdC,MAAa,UACbtB,MAAS,UACTC,MAAO,UACL,gBAAAyC,EAAC,QAAA,EAAK,WAAU,WAAW,UAAAT,EAAO,QAAQjC,GAAMC,GAAIoB,CAAU,GAAE;AAAA,UAEnEE,KAAmBC,KAAoBF,MAAa,UACnD,gBAAAkB,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,YAAA,gBAAAE,EAAC,WAAM,SAASR,GAAY,WAAU,WACnC,YAAO,aACV;AAAA,YACA,gBAAAM,EAACG,GAAA,EAAO,OAAO,OAAOrB,CAAQ,GAAG,eAAe,CAACsB,MAAMpB,EAAiB,OAAOoB,CAAC,CAAC,GAC/E,UAAA;AAAA,cAAA,gBAAAF,EAACG,KAAc,IAAIX,GAAY,MAAK,MAAK,WAAU,gCAA+B;AAAA,gCACjFY,GAAA,EACE,UAAAvB,EAAgB,IAAI,CAACxB,wBACnBgD,GAAA,EAAmB,OAAO,OAAOhD,CAAC,GAChC,UAAAkC,EAAO,QAAQlC,CAAC,EAAA,GADFA,CAEjB,CACD,EAAA,CACH;AAAA,YAAA,EAAA,CACF;AAAA,UAAA,EAAA,CACF;AAAA,QAAA,GAEJ;AAAA,QAEA,gBAAAyC,EAAC,MAAA,EAAG,WAAU,2BACX,UAAA;AAAA,UAAAf,uBACE,MAAA,EACC,UAAA,gBAAAiB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAYT,EAAO;AAAA,cACnB,UAAUf,MAAS;AAAA,cACnB,SAAS,MAAMoB,EAAK,CAAC;AAAA,cACrB,WAAWU;AAAA,cAEX,UAAA,gBAAAN,EAACO,GAAA,EAAa,WAAU,UAAS,eAAW,GAAA,CAAC;AAAA,YAAA;AAAA,UAAA,GAEjD;AAAA,4BAED,MAAA,EACC,UAAA,gBAAAP;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAYT,EAAO;AAAA,cACnB,UAAUf,MAAS;AAAA,cACnB,SAAS,MAAMoB,EAAKpB,IAAO,CAAC;AAAA,cAC5B,WAAW8B;AAAA,cAEX,UAAA,gBAAAN,EAACQ,GAAA,EAAY,WAAU,UAAS,eAAW,GAAA,CAAC;AAAA,YAAA;AAAA,UAAA,GAEhD;AAAA,UACCd,EAAM;AAAA,YAAI,CAACG,GAAG5B,MACb4B,MAAM,QACJ,gBAAAG,EAAC,MAAA,EAAoB,WAAU,+BAA8B,iBAApD,OAAO/B,CAAC,EAEjB,sBAEC,MAAA,EACC,UAAA,gBAAA+B;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAYT,EAAO,KAAKM,CAAC;AAAA,gBACzB,gBAAcA,MAAMrB,IAAO,SAAS;AAAA,gBACpC,SAAS,MAAMoB,EAAKC,CAAC;AAAA,gBACrB,WAAWE;AAAA,kBACT;AAAA,kBACA;AAAA,kBACA;AAAA,kBACAF,MAAMrB,IACF,yCACA;AAAA,gBAAA;AAAA,gBAGL,UAAAqB;AAAA,cAAA;AAAA,YAAA,KAfIA,CAiBT;AAAA,UAAA;AAAA,4BAGH,MAAA,EACC,UAAA,gBAAAG;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAYT,EAAO;AAAA,cACnB,UAAUf,MAASC;AAAA,cACnB,SAAS,MAAMmB,EAAKpB,IAAO,CAAC;AAAA,cAC5B,WAAW8B;AAAA,cAEX,UAAA,gBAAAN,EAACS,GAAA,EAAa,WAAU,UAAS,eAAW,GAAA,CAAC;AAAA,YAAA;AAAA,UAAA,GAEjD;AAAA,UACC1B,uBACE,MAAA,EACC,UAAA,gBAAAiB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAYT,EAAO;AAAA,cACnB,UAAUf,MAASC;AAAA,cACnB,SAAS,MAAMmB,EAAKnB,CAAS;AAAA,cAC7B,WAAW6B;AAAA,cAEX,UAAA,gBAAAN,EAACU,GAAA,EAAc,WAAU,UAAS,eAAW,GAAA,CAAC;AAAA,YAAA;AAAA,UAAA,EAChD,CACF;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN,CAAC;AACDpC,EAAW,cAAc;AAEzB,MAAMgC,IAAiBP;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as i } from "react";
|
|
4
|
+
import * as o from "@radix-ui/react-popover";
|
|
5
|
+
import { cn as s } from "../../lib/utils.js";
|
|
6
|
+
const v = o.Root, P = o.Trigger, g = o.Anchor, u = o.Close, p = i(function({ className: e, align: r = "center", sideOffset: a = 4, ...n }, d) {
|
|
7
|
+
return /* @__PURE__ */ t(o.Portal, { children: /* @__PURE__ */ t(
|
|
8
|
+
o.Content,
|
|
9
|
+
{
|
|
10
|
+
ref: d,
|
|
11
|
+
align: r,
|
|
12
|
+
sideOffset: a,
|
|
13
|
+
className: s(
|
|
14
|
+
"z-[var(--z-popover)] min-w-72 max-w-sm rounded-lg border border-border bg-popover p-4 text-popover-foreground shadow-md",
|
|
15
|
+
"outline-none",
|
|
16
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
17
|
+
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
18
|
+
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
19
|
+
"data-[side=bottom]:slide-in-from-top-1 data-[side=top]:slide-in-from-bottom-1",
|
|
20
|
+
"data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1",
|
|
21
|
+
e
|
|
22
|
+
),
|
|
23
|
+
...n
|
|
24
|
+
}
|
|
25
|
+
) });
|
|
26
|
+
});
|
|
27
|
+
p.displayName = "PopoverContent";
|
|
28
|
+
export {
|
|
29
|
+
v as Popover,
|
|
30
|
+
g as PopoverAnchor,
|
|
31
|
+
u as PopoverClose,
|
|
32
|
+
p as PopoverContent,
|
|
33
|
+
P as PopoverTrigger
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=Popover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Popover.js","sources":["../../../src/components/ui/Popover.tsx"],"sourcesContent":["'use client';\n\nimport {\n forwardRef,\n type ComponentPropsWithoutRef,\n type ElementRef,\n} from 'react';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport { cn } from '@/lib/utils';\n\nexport const Popover = PopoverPrimitive.Root;\nexport const PopoverTrigger = PopoverPrimitive.Trigger;\nexport const PopoverAnchor = PopoverPrimitive.Anchor;\nexport const PopoverClose = PopoverPrimitive.Close;\n\nexport const PopoverContent = forwardRef<\n ElementRef<typeof PopoverPrimitive.Content>,\n ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(function PopoverContent({ className, align = 'center', sideOffset = 4, ...props }, ref) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'z-[var(--z-popover)] min-w-72 max-w-sm rounded-lg border border-border bg-popover p-4 text-popover-foreground shadow-md',\n 'outline-none',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n 'data-[side=bottom]:slide-in-from-top-1 data-[side=top]:slide-in-from-bottom-1',\n 'data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1',\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n});\nPopoverContent.displayName = 'PopoverContent';\n\n/**\n * @example\n * <Popover>\n * <PopoverTrigger asChild><Button variant=\"outline\">Options</Button></PopoverTrigger>\n * <PopoverContent>…</PopoverContent>\n * </Popover>\n *\n * @do Reserve Popover for low-stakes, transient UI — pickers, mini-forms.\n * @dont Use Popover for navigation menus — that's DropdownMenu.\n */\n"],"names":["Popover","PopoverPrimitive","PopoverTrigger","PopoverAnchor","PopoverClose","PopoverContent","forwardRef","className","align","sideOffset","props","ref","jsx","cn"],"mappings":";;;;;AAUO,MAAMA,IAAUC,EAAiB,MAC3BC,IAAiBD,EAAiB,SAClCE,IAAgBF,EAAiB,QACjCG,IAAeH,EAAiB,OAEhCI,IAAiBC,EAG5B,SAAwB,EAAE,WAAAC,GAAW,OAAAC,IAAQ,UAAU,YAAAC,IAAa,GAAG,GAAGC,EAAA,GAASC,GAAK;AACxF,SACE,gBAAAC,EAACX,EAAiB,QAAjB,EACC,UAAA,gBAAAW;AAAA,IAACX,EAAiB;AAAA,IAAjB;AAAA,MACC,KAAAU;AAAA,MACA,OAAAH;AAAA,MACA,YAAAC;AAAA,MACA,WAAWI;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACAN;AAAA,MAAA;AAAA,MAED,GAAGG;AAAA,IAAA;AAAA,EAAA,GAER;AAEJ,CAAC;AACDL,EAAe,cAAc;"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as a, jsxs as k } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as f } from "react";
|
|
4
|
+
import * as g from "@radix-ui/react-progress";
|
|
5
|
+
import { cn as c } from "../../lib/utils.js";
|
|
6
|
+
const p = { sm: "h-1", md: "h-1.5", lg: "h-2" }, w = {
|
|
7
|
+
accent: "bg-accent",
|
|
8
|
+
success: "bg-success",
|
|
9
|
+
warning: "bg-warning",
|
|
10
|
+
danger: "bg-danger"
|
|
11
|
+
}, v = f(
|
|
12
|
+
function({ className: e, value: r, size: n = "md", tone: i = "accent", ...l }, d) {
|
|
13
|
+
const o = r == null;
|
|
14
|
+
return /* @__PURE__ */ a(
|
|
15
|
+
g.Root,
|
|
16
|
+
{
|
|
17
|
+
ref: d,
|
|
18
|
+
value: o ? void 0 : r,
|
|
19
|
+
className: c(
|
|
20
|
+
"relative w-full overflow-hidden rounded-full bg-background-muted",
|
|
21
|
+
p[n],
|
|
22
|
+
e
|
|
23
|
+
),
|
|
24
|
+
...l,
|
|
25
|
+
children: /* @__PURE__ */ a(
|
|
26
|
+
g.Indicator,
|
|
27
|
+
{
|
|
28
|
+
className: c(
|
|
29
|
+
"h-full w-full flex-1 transition-transform",
|
|
30
|
+
w[i],
|
|
31
|
+
o && "animate-progress-indeterminate origin-left"
|
|
32
|
+
),
|
|
33
|
+
style: o ? void 0 : { transform: `translateX(-${100 - (r ?? 0)}%)` }
|
|
34
|
+
}
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
v.displayName = "Progress";
|
|
41
|
+
const x = {
|
|
42
|
+
accent: "stroke-accent",
|
|
43
|
+
success: "stroke-success",
|
|
44
|
+
warning: "stroke-warning",
|
|
45
|
+
danger: "stroke-danger"
|
|
46
|
+
}, P = f(function({ value: e, size: r = 36, thickness: n = 3, className: i, tone: l = "accent", ...d }, o) {
|
|
47
|
+
const s = e === void 0, m = (r - n) / 2, t = 2 * Math.PI * m, h = s ? 0 : t - Math.min(100, Math.max(0, e)) / 100 * t;
|
|
48
|
+
return /* @__PURE__ */ k(
|
|
49
|
+
"svg",
|
|
50
|
+
{
|
|
51
|
+
ref: o,
|
|
52
|
+
width: r,
|
|
53
|
+
height: r,
|
|
54
|
+
viewBox: `0 0 ${r} ${r}`,
|
|
55
|
+
role: "progressbar",
|
|
56
|
+
"aria-valuemin": 0,
|
|
57
|
+
"aria-valuemax": 100,
|
|
58
|
+
"aria-valuenow": s ? void 0 : e,
|
|
59
|
+
className: c("shrink-0", s && "animate-spin", i),
|
|
60
|
+
...d,
|
|
61
|
+
children: [
|
|
62
|
+
/* @__PURE__ */ a(
|
|
63
|
+
"circle",
|
|
64
|
+
{
|
|
65
|
+
cx: r / 2,
|
|
66
|
+
cy: r / 2,
|
|
67
|
+
r: m,
|
|
68
|
+
strokeWidth: n,
|
|
69
|
+
className: "stroke-background-muted fill-none"
|
|
70
|
+
}
|
|
71
|
+
),
|
|
72
|
+
/* @__PURE__ */ a(
|
|
73
|
+
"circle",
|
|
74
|
+
{
|
|
75
|
+
cx: r / 2,
|
|
76
|
+
cy: r / 2,
|
|
77
|
+
r: m,
|
|
78
|
+
strokeWidth: n,
|
|
79
|
+
strokeLinecap: "round",
|
|
80
|
+
strokeDasharray: t,
|
|
81
|
+
strokeDashoffset: s ? t * 0.7 : h,
|
|
82
|
+
className: c(x[l], "fill-none transition-[stroke-dashoffset]"),
|
|
83
|
+
transform: `rotate(-90 ${r / 2} ${r / 2})`
|
|
84
|
+
}
|
|
85
|
+
)
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
});
|
|
90
|
+
P.displayName = "ProgressCircle";
|
|
91
|
+
export {
|
|
92
|
+
v as Progress,
|
|
93
|
+
P as ProgressCircle
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=Progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Progress.js","sources":["../../../src/components/ui/Progress.tsx"],"sourcesContent":["'use client';\n\nimport {\n forwardRef,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type SVGProps,\n} from 'react';\nimport * as ProgressPrimitive from '@radix-ui/react-progress';\nimport { cn } from '@/lib/utils';\n\n/* -----------------------------------------------------------------------------\n * Linear — bar that fills left-to-right.\n * Circular — SVG ring. Both support determinate (value 0..100) and\n * indeterminate (`value` omitted) states.\n * --------------------------------------------------------------------------- */\n\nexport interface ProgressProps\n extends Omit<ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>, 'value'> {\n /** 0–100. Omit for indeterminate. */\n value?: number | null;\n /** Bar height. */\n size?: 'sm' | 'md' | 'lg';\n /** Visual tone. Use `success`/`danger` to colour-code completion state. */\n tone?: 'accent' | 'success' | 'warning' | 'danger';\n}\n\nconst heightMap = { sm: 'h-1', md: 'h-1.5', lg: 'h-2' } as const;\nconst fillTone = {\n accent: 'bg-accent',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n} as const;\n\n/**\n * Linear progress bar.\n *\n * @example\n * <Progress value={uploadPct} aria-label=\"Upload progress\" />\n * <Progress aria-label=\"Loading\" /> // indeterminate\n *\n * @do Always pair Progress with an `aria-label` describing what is progressing.\n * @dont Use a Progress for an unknown-completion task — use a Spinner.\n */\nexport const Progress = forwardRef<ElementRef<typeof ProgressPrimitive.Root>, ProgressProps>(\n function Progress({ className, value, size = 'md', tone = 'accent', ...props }, ref) {\n const indeterminate = value === undefined || value === null;\n return (\n <ProgressPrimitive.Root\n ref={ref}\n value={indeterminate ? undefined : value}\n className={cn(\n 'relative w-full overflow-hidden rounded-full bg-background-muted',\n heightMap[size],\n className,\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n className={cn(\n 'h-full w-full flex-1 transition-transform',\n fillTone[tone],\n indeterminate && 'animate-progress-indeterminate origin-left',\n )}\n style={\n indeterminate\n ? undefined\n : { transform: `translateX(-${100 - (value ?? 0)}%)` }\n }\n />\n </ProgressPrimitive.Root>\n );\n },\n);\nProgress.displayName = 'Progress';\n\nexport interface ProgressCircleProps extends SVGProps<SVGSVGElement> {\n /** 0–100. Omit for indeterminate. */\n value?: number;\n /** Pixel size of the SVG. */\n size?: number;\n /** Stroke thickness. */\n thickness?: number;\n /** Visible label for screen readers. */\n 'aria-label': string;\n tone?: 'accent' | 'success' | 'warning' | 'danger';\n}\n\nconst circleTone = {\n accent: 'stroke-accent',\n success: 'stroke-success',\n warning: 'stroke-warning',\n danger: 'stroke-danger',\n} as const;\n\n/**\n * Circular progress ring. Pairs with a numeric label for percentage-style\n * indicators.\n *\n * @example\n * <ProgressCircle value={72} aria-label=\"Storage used\" />\n */\nexport const ProgressCircle = forwardRef<SVGSVGElement, ProgressCircleProps>(function ProgressCircle(\n { value, size = 36, thickness = 3, className, tone = 'accent', ...props },\n ref,\n) {\n const isIndeterminate = value === undefined;\n const radius = (size - thickness) / 2;\n const circumference = 2 * Math.PI * radius;\n const offset = isIndeterminate ? 0 : circumference - (Math.min(100, Math.max(0, value)) / 100) * circumference;\n\n return (\n <svg\n ref={ref}\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={isIndeterminate ? undefined : value}\n className={cn('shrink-0', isIndeterminate && 'animate-spin', className)}\n {...props}\n >\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n strokeWidth={thickness}\n className=\"stroke-background-muted fill-none\"\n />\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n strokeWidth={thickness}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={isIndeterminate ? circumference * 0.7 : offset}\n className={cn(circleTone[tone], 'fill-none transition-[stroke-dashoffset]')}\n transform={`rotate(-90 ${size / 2} ${size / 2})`}\n />\n </svg>\n );\n});\nProgressCircle.displayName = 'ProgressCircle';\n"],"names":["heightMap","fillTone","Progress","forwardRef","className","value","size","tone","props","ref","indeterminate","jsx","ProgressPrimitive","cn","circleTone","ProgressCircle","thickness","isIndeterminate","radius","circumference","offset","jsxs"],"mappings":";;;;;AA2BA,MAAMA,IAAY,EAAE,IAAI,OAAO,IAAI,SAAS,IAAI,MAAA,GAC1CC,IAAW;AAAA,EACf,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AACV,GAYaC,IAAWC;AAAA,EACtB,SAAkB,EAAE,WAAAC,GAAW,OAAAC,GAAO,MAAAC,IAAO,MAAM,MAAAC,IAAO,UAAU,GAAGC,EAAA,GAASC,GAAK;AACnF,UAAMC,IAAuCL,KAAU;AACvD,WACE,gBAAAM;AAAA,MAACC,EAAkB;AAAA,MAAlB;AAAA,QACC,KAAAH;AAAA,QACA,OAAOC,IAAgB,SAAYL;AAAA,QACnC,WAAWQ;AAAA,UACT;AAAA,UACAb,EAAUM,CAAI;AAAA,UACdF;AAAA,QAAA;AAAA,QAED,GAAGI;AAAA,QAEJ,UAAA,gBAAAG;AAAA,UAACC,EAAkB;AAAA,UAAlB;AAAA,YACC,WAAWC;AAAA,cACT;AAAA,cACAZ,EAASM,CAAI;AAAA,cACbG,KAAiB;AAAA,YAAA;AAAA,YAEnB,OACEA,IACI,SACA,EAAE,WAAW,eAAe,OAAOL,KAAS,EAAE,KAAA;AAAA,UAAK;AAAA,QAAA;AAAA,MAE3D;AAAA,IAAA;AAAA,EAGN;AACF;AACAH,EAAS,cAAc;AAcvB,MAAMY,IAAa;AAAA,EACjB,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AACV,GASaC,IAAiBZ,EAA+C,SAC3E,EAAE,OAAAE,GAAO,MAAAC,IAAO,IAAI,WAAAU,IAAY,GAAG,WAAAZ,GAAW,MAAAG,IAAO,UAAU,GAAGC,EAAA,GAClEC,GACA;AACA,QAAMQ,IAAkBZ,MAAU,QAC5Ba,KAAUZ,IAAOU,KAAa,GAC9BG,IAAgB,IAAI,KAAK,KAAKD,GAC9BE,IAASH,IAAkB,IAAIE,IAAiB,KAAK,IAAI,KAAK,KAAK,IAAI,GAAGd,CAAK,CAAC,IAAI,MAAOc;AAEjG,SACE,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAZ;AAAA,MACA,OAAOH;AAAA,MACP,QAAQA;AAAA,MACR,SAAS,OAAOA,CAAI,IAAIA,CAAI;AAAA,MAC5B,MAAK;AAAA,MACL,iBAAe;AAAA,MACf,iBAAe;AAAA,MACf,iBAAeW,IAAkB,SAAYZ;AAAA,MAC7C,WAAWQ,EAAG,YAAYI,KAAmB,gBAAgBb,CAAS;AAAA,MACrE,GAAGI;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAG;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAIL,IAAO;AAAA,YACX,IAAIA,IAAO;AAAA,YACX,GAAGY;AAAA,YACH,aAAaF;AAAA,YACb,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAEZ,gBAAAL;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAIL,IAAO;AAAA,YACX,IAAIA,IAAO;AAAA,YACX,GAAGY;AAAA,YACH,aAAaF;AAAA,YACb,eAAc;AAAA,YACd,iBAAiBG;AAAA,YACjB,kBAAkBF,IAAkBE,IAAgB,MAAMC;AAAA,YAC1D,WAAWP,EAAGC,EAAWP,CAAI,GAAG,0CAA0C;AAAA,YAC1E,WAAW,cAAcD,IAAO,CAAC,IAAIA,IAAO,CAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MAC/C;AAAA,IAAA;AAAA,EAAA;AAGN,CAAC;AACDS,EAAe,cAAc;"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as e, jsxs as n } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as f, useId as g } from "react";
|
|
4
|
+
import * as c from "@radix-ui/react-radio-group";
|
|
5
|
+
import { cn as o } from "../../lib/utils.js";
|
|
6
|
+
const v = f(function({ className: i, orientation: t = "vertical", ...r }, s) {
|
|
7
|
+
return /* @__PURE__ */ e(
|
|
8
|
+
c.Root,
|
|
9
|
+
{
|
|
10
|
+
ref: s,
|
|
11
|
+
className: o(
|
|
12
|
+
"flex gap-3",
|
|
13
|
+
t === "vertical" ? "flex-col" : "flex-row flex-wrap",
|
|
14
|
+
i
|
|
15
|
+
),
|
|
16
|
+
...r
|
|
17
|
+
}
|
|
18
|
+
);
|
|
19
|
+
});
|
|
20
|
+
v.displayName = "RadioGroup";
|
|
21
|
+
const h = f(function({ className: i, label: t, description: r, hideLabel: s, id: m, disabled: d, ...p }, x) {
|
|
22
|
+
const b = g(), a = m ?? b, l = r ? `${a}-desc` : void 0;
|
|
23
|
+
return /* @__PURE__ */ n("div", { className: o("flex items-start gap-2.5", i), children: [
|
|
24
|
+
/* @__PURE__ */ e(
|
|
25
|
+
c.Item,
|
|
26
|
+
{
|
|
27
|
+
ref: x,
|
|
28
|
+
id: a,
|
|
29
|
+
disabled: d,
|
|
30
|
+
"aria-describedby": l,
|
|
31
|
+
className: o(
|
|
32
|
+
"mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-full border bg-card",
|
|
33
|
+
"transition-colors duration-[var(--duration-fast)] 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
|
+
"data-[state=checked]:border-accent",
|
|
36
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
37
|
+
"border-border-input"
|
|
38
|
+
),
|
|
39
|
+
...p,
|
|
40
|
+
children: /* @__PURE__ */ e(c.Indicator, { className: "flex items-center justify-center", children: /* @__PURE__ */ e("span", { className: "size-2 rounded-full bg-accent", "aria-hidden": !0 }) })
|
|
41
|
+
}
|
|
42
|
+
),
|
|
43
|
+
t && /* @__PURE__ */ n("div", { className: o("flex flex-col gap-0.5", s && "sr-only"), children: [
|
|
44
|
+
/* @__PURE__ */ e(
|
|
45
|
+
"label",
|
|
46
|
+
{
|
|
47
|
+
htmlFor: a,
|
|
48
|
+
className: o(
|
|
49
|
+
"text-sm text-foreground select-none",
|
|
50
|
+
d && "opacity-50 cursor-not-allowed"
|
|
51
|
+
),
|
|
52
|
+
children: t
|
|
53
|
+
}
|
|
54
|
+
),
|
|
55
|
+
r && /* @__PURE__ */ e("p", { id: l, className: "text-xs text-foreground-subtle", children: r })
|
|
56
|
+
] })
|
|
57
|
+
] });
|
|
58
|
+
});
|
|
59
|
+
h.displayName = "RadioItem";
|
|
60
|
+
export {
|
|
61
|
+
v as RadioGroup,
|
|
62
|
+
h as RadioItem
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=RadioGroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RadioGroup.js","sources":["../../../src/components/ui/RadioGroup.tsx"],"sourcesContent":["'use client';\n\nimport {\n forwardRef,\n useId,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type ReactNode,\n} from 'react';\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group';\nimport { cn } from '@/lib/utils';\n\nexport interface RadioGroupProps\n extends ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root> {\n /** Lay out the radios horizontally (default) or vertically. */\n orientation?: 'horizontal' | 'vertical';\n}\n\nexport const RadioGroup = forwardRef<\n ElementRef<typeof RadioGroupPrimitive.Root>,\n RadioGroupProps\n>(function RadioGroup({ className, orientation = 'vertical', ...props }, ref) {\n return (\n <RadioGroupPrimitive.Root\n ref={ref}\n className={cn(\n 'flex gap-3',\n orientation === 'vertical' ? 'flex-col' : 'flex-row flex-wrap',\n className,\n )}\n {...props}\n />\n );\n});\nRadioGroup.displayName = 'RadioGroup';\n\nexport interface RadioItemProps\n extends Omit<ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>, 'asChild'> {\n label?: ReactNode;\n description?: ReactNode;\n hideLabel?: boolean;\n}\n\n/**\n * One radio option with inline label + description.\n *\n * @example\n * <RadioGroup defaultValue=\"weekly\">\n * <RadioItem value=\"daily\" label=\"Daily\" description=\"Every morning at 9am\" />\n * <RadioItem value=\"weekly\" label=\"Weekly\" description=\"Monday mornings\" />\n * <RadioItem value=\"never\" label=\"Never\" />\n * </RadioGroup>\n *\n * @do Pair every RadioItem with a label — naked radios are unreachable for\n * screen reader users.\n * @dont Use RadioGroup for binary choices — use Switch.\n */\nexport const RadioItem = forwardRef<\n ElementRef<typeof RadioGroupPrimitive.Item>,\n RadioItemProps\n>(function RadioItem({ className, label, description, hideLabel, id, disabled, ...props }, ref) {\n const autoId = useId();\n const fieldId = id ?? autoId;\n const descId = description ? `${fieldId}-desc` : undefined;\n\n return (\n <div className={cn('flex items-start gap-2.5', className)}>\n <RadioGroupPrimitive.Item\n ref={ref}\n id={fieldId}\n disabled={disabled}\n aria-describedby={descId}\n className={cn(\n 'mt-0.5 flex size-4 shrink-0 items-center justify-center rounded-full border bg-card',\n 'transition-colors duration-[var(--duration-fast)] 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 'data-[state=checked]:border-accent',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'border-border-input',\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <span className=\"size-2 rounded-full bg-accent\" aria-hidden />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n\n {label && (\n <div className={cn('flex flex-col gap-0.5', hideLabel && 'sr-only')}>\n <label\n htmlFor={fieldId}\n className={cn(\n 'text-sm text-foreground select-none',\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 </div>\n );\n});\nRadioItem.displayName = 'RadioItem';\n"],"names":["RadioGroup","forwardRef","className","orientation","props","ref","jsx","RadioGroupPrimitive","cn","RadioItem","label","description","hideLabel","id","disabled","autoId","useId","fieldId","descId"],"mappings":";;;;;AAkBO,MAAMA,IAAaC,EAGxB,SAAoB,EAAE,WAAAC,GAAW,aAAAC,IAAc,YAAY,GAAGC,EAAA,GAASC,GAAK;AAC5E,SACE,gBAAAC;AAAA,IAACC,EAAoB;AAAA,IAApB;AAAA,MACC,KAAAF;AAAA,MACA,WAAWG;AAAA,QACT;AAAA,QACAL,MAAgB,aAAa,aAAa;AAAA,QAC1CD;AAAA,MAAA;AAAA,MAED,GAAGE;AAAA,IAAA;AAAA,EAAA;AAGV,CAAC;AACDJ,EAAW,cAAc;AAuBlB,MAAMS,IAAYR,EAGvB,SAAmB,EAAE,WAAAC,GAAW,OAAAQ,GAAO,aAAAC,GAAa,WAAAC,GAAW,IAAAC,GAAI,UAAAC,GAAU,GAAGV,EAAA,GAASC,GAAK;AAC9F,QAAMU,IAASC,EAAA,GACTC,IAAUJ,KAAME,GAChBG,IAASP,IAAc,GAAGM,CAAO,UAAU;AAEjD,2BACG,OAAA,EAAI,WAAWT,EAAG,4BAA4BN,CAAS,GACtD,UAAA;AAAA,IAAA,gBAAAI;AAAA,MAACC,EAAoB;AAAA,MAApB;AAAA,QACC,KAAAF;AAAA,QACA,IAAIY;AAAA,QACJ,UAAAH;AAAA,QACA,oBAAkBI;AAAA,QAClB,WAAWV;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,QAED,GAAGJ;AAAA,QAEJ,UAAA,gBAAAE,EAACC,EAAoB,WAApB,EAA8B,WAAU,oCACvC,UAAA,gBAAAD,EAAC,QAAA,EAAK,WAAU,iCAAgC,eAAW,GAAA,CAAC,EAAA,CAC9D;AAAA,MAAA;AAAA,IAAA;AAAA,IAGDI,uBACE,OAAA,EAAI,WAAWF,EAAG,yBAAyBI,KAAa,SAAS,GAChE,UAAA;AAAA,MAAA,gBAAAN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAASW;AAAA,UACT,WAAWT;AAAA,YACT;AAAA,YACAM,KAAY;AAAA,UAAA;AAAA,UAGb,UAAAJ;AAAA,QAAA;AAAA,MAAA;AAAA,MAEFC,KACC,gBAAAL,EAAC,KAAA,EAAE,IAAIY,GAAQ,WAAU,kCACtB,UAAAP,EAAA,CACH;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GAEJ;AAEJ,CAAC;AACDF,EAAU,cAAc;"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsxs as d, jsx as l } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as c } from "react";
|
|
4
|
+
import * as e from "@radix-ui/react-scroll-area";
|
|
5
|
+
import { cn as n } from "../../lib/utils.js";
|
|
6
|
+
const f = c(function({ className: o, children: r, ...a }, t) {
|
|
7
|
+
return /* @__PURE__ */ d(
|
|
8
|
+
e.Root,
|
|
9
|
+
{
|
|
10
|
+
ref: t,
|
|
11
|
+
className: n("relative overflow-hidden", o),
|
|
12
|
+
...a,
|
|
13
|
+
children: [
|
|
14
|
+
/* @__PURE__ */ l(e.Viewport, { className: "h-full w-full rounded-[inherit]", children: r }),
|
|
15
|
+
/* @__PURE__ */ l(s, {}),
|
|
16
|
+
/* @__PURE__ */ l(e.Corner, {})
|
|
17
|
+
]
|
|
18
|
+
}
|
|
19
|
+
);
|
|
20
|
+
});
|
|
21
|
+
f.displayName = "ScrollArea";
|
|
22
|
+
const s = c(function({ className: o, orientation: r = "vertical", ...a }, t) {
|
|
23
|
+
return /* @__PURE__ */ l(
|
|
24
|
+
e.ScrollAreaScrollbar,
|
|
25
|
+
{
|
|
26
|
+
ref: t,
|
|
27
|
+
orientation: r,
|
|
28
|
+
className: n(
|
|
29
|
+
"flex touch-none select-none transition-colors duration-[var(--duration-fast)]",
|
|
30
|
+
r === "vertical" && "h-full w-2 border-l border-l-transparent p-px",
|
|
31
|
+
r === "horizontal" && "h-2 flex-col border-t border-t-transparent p-px",
|
|
32
|
+
o
|
|
33
|
+
),
|
|
34
|
+
...a,
|
|
35
|
+
children: /* @__PURE__ */ l(e.ScrollAreaThumb, { className: "relative flex-1 rounded-full bg-border-strong" })
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
});
|
|
39
|
+
s.displayName = "ScrollBar";
|
|
40
|
+
export {
|
|
41
|
+
f as ScrollArea,
|
|
42
|
+
s as ScrollBar
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=ScrollArea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollArea.js","sources":["../../../src/components/ui/ScrollArea.tsx"],"sourcesContent":["'use client';\n\nimport {\n forwardRef,\n type ComponentPropsWithoutRef,\n type ElementRef,\n} from 'react';\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';\nimport { cn } from '@/lib/utils';\n\n/**\n * Custom scroll container with consistent styled scrollbars across OS / browsers.\n * Use when the default OS scrollbar would visually clash (sidebars, command\n * palettes, code panes). Falls back to native scroll inside the viewport.\n *\n * @example\n * <ScrollArea className=\"h-64 rounded-md border border-border\">\n * <div className=\"p-3\">…long content…</div>\n * </ScrollArea>\n */\nexport const ScrollArea = forwardRef<\n ElementRef<typeof ScrollAreaPrimitive.Root>,\n ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(function ScrollArea({ className, children, ...props }, ref) {\n return (\n <ScrollAreaPrimitive.Root\n ref={ref}\n className={cn('relative overflow-hidden', className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n});\nScrollArea.displayName = 'ScrollArea';\n\nexport const ScrollBar = forwardRef<\n ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(function ScrollBar({ className, orientation = 'vertical', ...props }, ref) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n 'flex touch-none select-none transition-colors duration-[var(--duration-fast)]',\n orientation === 'vertical' && 'h-full w-2 border-l border-l-transparent p-px',\n orientation === 'horizontal' && 'h-2 flex-col border-t border-t-transparent p-px',\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border-strong\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n});\nScrollBar.displayName = 'ScrollBar';\n"],"names":["ScrollArea","forwardRef","className","children","props","ref","jsxs","ScrollAreaPrimitive","cn","jsx","ScrollBar","orientation"],"mappings":";;;;;AAoBO,MAAMA,IAAaC,EAGxB,SAAoB,EAAE,WAAAC,GAAW,UAAAC,GAAU,GAAGC,EAAA,GAASC,GAAK;AAC5D,SACE,gBAAAC;AAAA,IAACC,EAAoB;AAAA,IAApB;AAAA,MACC,KAAAF;AAAA,MACA,WAAWG,EAAG,4BAA4BN,CAAS;AAAA,MAClD,GAAGE;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAK,EAACF,EAAoB,UAApB,EAA6B,WAAU,mCACrC,UAAAJ,GACH;AAAA,0BACCO,GAAA,EAAU;AAAA,QACX,gBAAAD,EAACF,EAAoB,QAApB,CAAA,CAA2B;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGlC,CAAC;AACDP,EAAW,cAAc;AAElB,MAAMU,IAAYT,EAGvB,SAAmB,EAAE,WAAAC,GAAW,aAAAS,IAAc,YAAY,GAAGP,EAAA,GAASC,GAAK;AAC3E,SACE,gBAAAI;AAAA,IAACF,EAAoB;AAAA,IAApB;AAAA,MACC,KAAAF;AAAA,MACA,aAAAM;AAAA,MACA,WAAWH;AAAA,QACT;AAAA,QACAG,MAAgB,cAAc;AAAA,QAC9BA,MAAgB,gBAAgB;AAAA,QAChCT;AAAA,MAAA;AAAA,MAED,GAAGE;AAAA,MAEJ,UAAA,gBAAAK,EAACF,EAAoB,iBAApB,EAAoC,WAAU,gDAAA,CAAgD;AAAA,IAAA;AAAA,EAAA;AAGrG,CAAC;AACDG,EAAU,cAAc;"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as t, jsxs as d } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef as n } from "react";
|
|
4
|
+
import * as o from "@radix-ui/react-select";
|
|
5
|
+
import { Check as h, ChevronDown as S, ChevronUp as b, ChevronsUpDown as x } from "../../icons/index.js";
|
|
6
|
+
import { cn as c } from "../../lib/utils.js";
|
|
7
|
+
const U = o.Root, j = o.Value, v = n(function({ className: r, placeholder: a, size: e = "md", tone: s = "default", ...i }, g) {
|
|
8
|
+
return /* @__PURE__ */ d(
|
|
9
|
+
o.Trigger,
|
|
10
|
+
{
|
|
11
|
+
ref: g,
|
|
12
|
+
className: c(
|
|
13
|
+
"inline-flex w-full items-center justify-between gap-2 rounded-md border bg-card text-lg md:text-sm text-foreground",
|
|
14
|
+
"transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out)]",
|
|
15
|
+
"outline-none",
|
|
16
|
+
"focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-offset-background",
|
|
17
|
+
"disabled:opacity-50 disabled:cursor-not-allowed",
|
|
18
|
+
"data-[placeholder]:text-foreground-subtle",
|
|
19
|
+
e === "sm" && "h-8 px-2.5",
|
|
20
|
+
e === "md" && "h-9 px-3",
|
|
21
|
+
e === "lg" && "h-10 px-3.5",
|
|
22
|
+
s === "default" ? "border-border-input focus-visible:border-accent focus-visible:ring-ring" : "border-danger focus-visible:border-danger focus-visible:ring-danger",
|
|
23
|
+
r
|
|
24
|
+
),
|
|
25
|
+
...i,
|
|
26
|
+
children: [
|
|
27
|
+
/* @__PURE__ */ t(o.Value, { placeholder: a }),
|
|
28
|
+
/* @__PURE__ */ t(o.Icon, { asChild: !0, children: /* @__PURE__ */ t(x, { className: "size-4 text-foreground-subtle shrink-0", "aria-hidden": !0 }) })
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
});
|
|
33
|
+
v.displayName = "SelectTrigger";
|
|
34
|
+
const u = "flex h-6 cursor-default items-center justify-center text-foreground-subtle", m = n(function({ className: r, ...a }, e) {
|
|
35
|
+
return /* @__PURE__ */ t(o.ScrollUpButton, { ref: e, className: c(u, r), ...a, children: /* @__PURE__ */ t(b, { className: "size-4", "aria-hidden": !0 }) });
|
|
36
|
+
});
|
|
37
|
+
m.displayName = "SelectScrollUpButton";
|
|
38
|
+
const p = n(function({ className: r, ...a }, e) {
|
|
39
|
+
return /* @__PURE__ */ t(o.ScrollDownButton, { ref: e, className: c(u, r), ...a, children: /* @__PURE__ */ t(S, { className: "size-4", "aria-hidden": !0 }) });
|
|
40
|
+
});
|
|
41
|
+
p.displayName = "SelectScrollDownButton";
|
|
42
|
+
const N = n(function({ className: r, children: a, position: e = "popper", ...s }, i) {
|
|
43
|
+
return /* @__PURE__ */ t(o.Portal, { children: /* @__PURE__ */ d(
|
|
44
|
+
o.Content,
|
|
45
|
+
{
|
|
46
|
+
ref: i,
|
|
47
|
+
position: e,
|
|
48
|
+
className: c(
|
|
49
|
+
"z-[var(--z-popover)] min-w-[var(--radix-select-trigger-width)] max-h-96",
|
|
50
|
+
"overflow-hidden rounded-lg border border-border bg-popover text-popover-foreground",
|
|
51
|
+
"shadow-md",
|
|
52
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
53
|
+
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
54
|
+
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
55
|
+
e === "popper" && "data-[side=bottom]:translate-y-1 data-[side=top]:-translate-y-1",
|
|
56
|
+
r
|
|
57
|
+
),
|
|
58
|
+
...s,
|
|
59
|
+
children: [
|
|
60
|
+
/* @__PURE__ */ t(m, {}),
|
|
61
|
+
/* @__PURE__ */ t(o.Viewport, { className: "p-1", children: a }),
|
|
62
|
+
/* @__PURE__ */ t(p, {})
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
) });
|
|
66
|
+
});
|
|
67
|
+
N.displayName = "SelectContent";
|
|
68
|
+
const f = n(function({ className: r, ...a }, e) {
|
|
69
|
+
return /* @__PURE__ */ t(
|
|
70
|
+
o.Label,
|
|
71
|
+
{
|
|
72
|
+
ref: e,
|
|
73
|
+
className: c("px-2 py-1.5 text-xs font-medium text-foreground-subtle", r),
|
|
74
|
+
...a
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
});
|
|
78
|
+
f.displayName = "SelectLabel";
|
|
79
|
+
const y = n(function({ className: r, children: a, leadingIcon: e, ...s }, i) {
|
|
80
|
+
return /* @__PURE__ */ d(
|
|
81
|
+
o.Item,
|
|
82
|
+
{
|
|
83
|
+
ref: i,
|
|
84
|
+
className: c(
|
|
85
|
+
"relative flex w-full cursor-default select-none items-center gap-2",
|
|
86
|
+
"rounded-sm px-2 py-1.5 pr-8 text-sm text-foreground outline-none",
|
|
87
|
+
"data-[highlighted]:bg-background-muted data-[highlighted]:text-foreground",
|
|
88
|
+
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
89
|
+
r
|
|
90
|
+
),
|
|
91
|
+
...s,
|
|
92
|
+
children: [
|
|
93
|
+
e && /* @__PURE__ */ t("span", { className: "flex items-center text-foreground-subtle [&_svg]:size-4", children: e }),
|
|
94
|
+
/* @__PURE__ */ t(o.ItemText, { children: a }),
|
|
95
|
+
/* @__PURE__ */ t("span", { className: "absolute right-2 flex items-center justify-center", children: /* @__PURE__ */ t(o.ItemIndicator, { children: /* @__PURE__ */ t(h, { className: "size-4 text-accent", "aria-hidden": !0 }) }) })
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
);
|
|
99
|
+
});
|
|
100
|
+
y.displayName = "SelectItem";
|
|
101
|
+
const w = n(function({ className: r, ...a }, e) {
|
|
102
|
+
return /* @__PURE__ */ t(
|
|
103
|
+
o.Separator,
|
|
104
|
+
{
|
|
105
|
+
ref: e,
|
|
106
|
+
className: c("-mx-1 my-1 h-px bg-border", r),
|
|
107
|
+
...a
|
|
108
|
+
}
|
|
109
|
+
);
|
|
110
|
+
});
|
|
111
|
+
w.displayName = "SelectSeparator";
|
|
112
|
+
const B = n(function({ label: r, children: a, ...e }, s) {
|
|
113
|
+
return /* @__PURE__ */ d(o.Group, { ref: s, ...e, children: [
|
|
114
|
+
r && /* @__PURE__ */ t(f, { children: r }),
|
|
115
|
+
a
|
|
116
|
+
] });
|
|
117
|
+
});
|
|
118
|
+
B.displayName = "SelectGroup";
|
|
119
|
+
export {
|
|
120
|
+
U as Select,
|
|
121
|
+
N as SelectContent,
|
|
122
|
+
B as SelectGroup,
|
|
123
|
+
y as SelectItem,
|
|
124
|
+
f as SelectLabel,
|
|
125
|
+
p as SelectScrollDownButton,
|
|
126
|
+
m as SelectScrollUpButton,
|
|
127
|
+
w as SelectSeparator,
|
|
128
|
+
v as SelectTrigger,
|
|
129
|
+
j as SelectValue
|
|
130
|
+
};
|
|
131
|
+
//# sourceMappingURL=Select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select.js","sources":["../../../src/components/ui/Select.tsx"],"sourcesContent":["'use client';\n\nimport {\n forwardRef,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type ReactNode,\n} from 'react';\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport { Check, ChevronDown, ChevronUp, ChevronsUpDown } from '@/icons';\nimport { cn } from '@/lib/utils';\n\n/* -----------------------------------------------------------------------------\n * Compound API:\n *\n * <Select value={…} onValueChange={…}>\n * <SelectTrigger placeholder=\"Pick one\" />\n * <SelectContent>\n * <SelectGroup label=\"Active\">\n * <SelectItem value=\"a\">Apple</SelectItem>\n * <SelectItem value=\"b\">Banana</SelectItem>\n * </SelectGroup>\n * </SelectContent>\n * </Select>\n *\n * All accessibility is handled by Radix: keyboard navigation, type-ahead,\n * focus trap, ARIA roles. We only style.\n * --------------------------------------------------------------------------- */\n\nexport const Select = SelectPrimitive.Root;\nexport const SelectValue = SelectPrimitive.Value;\n\nexport interface SelectTriggerProps\n extends Omit<ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>, 'children'> {\n /** Placeholder shown when no value is selected. */\n placeholder?: string;\n /** Trigger height — matches Input sizes. */\n size?: 'sm' | 'md' | 'lg';\n /** Visual tone — `error` swaps the border + ring to danger. */\n tone?: 'default' | 'error';\n}\n\nexport const SelectTrigger = forwardRef<\n ElementRef<typeof SelectPrimitive.Trigger>,\n SelectTriggerProps\n>(function SelectTrigger({ className, placeholder, size = 'md', tone = 'default', ...props }, ref) {\n return (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'inline-flex w-full items-center justify-between gap-2 rounded-md border bg-card text-lg md:text-sm text-foreground',\n 'transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out)]',\n 'outline-none',\n 'focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n 'data-[placeholder]:text-foreground-subtle',\n size === 'sm' && 'h-8 px-2.5',\n size === 'md' && 'h-9 px-3',\n size === 'lg' && 'h-10 px-3.5',\n tone === 'default'\n ? 'border-border-input focus-visible:border-accent focus-visible:ring-ring'\n : 'border-danger focus-visible:border-danger focus-visible:ring-danger',\n className,\n )}\n {...props}\n >\n <SelectPrimitive.Value placeholder={placeholder} />\n <SelectPrimitive.Icon asChild>\n <ChevronsUpDown className=\"size-4 text-foreground-subtle shrink-0\" aria-hidden />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n );\n});\nSelectTrigger.displayName = 'SelectTrigger';\n\nconst scrollBtn =\n 'flex h-6 cursor-default items-center justify-center text-foreground-subtle';\n\nexport const SelectScrollUpButton = forwardRef<\n ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(function SelectScrollUpButton({ className, ...props }, ref) {\n return (\n <SelectPrimitive.ScrollUpButton ref={ref} className={cn(scrollBtn, className)} {...props}>\n <ChevronUp className=\"size-4\" aria-hidden />\n </SelectPrimitive.ScrollUpButton>\n );\n});\nSelectScrollUpButton.displayName = 'SelectScrollUpButton';\n\nexport const SelectScrollDownButton = forwardRef<\n ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(function SelectScrollDownButton({ className, ...props }, ref) {\n return (\n <SelectPrimitive.ScrollDownButton ref={ref} className={cn(scrollBtn, className)} {...props}>\n <ChevronDown className=\"size-4\" aria-hidden />\n </SelectPrimitive.ScrollDownButton>\n );\n});\nSelectScrollDownButton.displayName = 'SelectScrollDownButton';\n\nexport const SelectContent = forwardRef<\n ElementRef<typeof SelectPrimitive.Content>,\n ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(function SelectContent({ className, children, position = 'popper', ...props }, ref) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n position={position}\n className={cn(\n 'z-[var(--z-popover)] min-w-[var(--radix-select-trigger-width)] max-h-96',\n 'overflow-hidden rounded-lg border border-border bg-popover text-popover-foreground',\n 'shadow-md',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=top]:-translate-y-1',\n className,\n )}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport className=\"p-1\">{children}</SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n});\nSelectContent.displayName = 'SelectContent';\n\nexport const SelectLabel = forwardRef<\n ElementRef<typeof SelectPrimitive.Label>,\n ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(function SelectLabel({ className, ...props }, ref) {\n return (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 text-xs font-medium text-foreground-subtle', className)}\n {...props}\n />\n );\n});\nSelectLabel.displayName = 'SelectLabel';\n\nexport interface SelectItemProps\n extends ComponentPropsWithoutRef<typeof SelectPrimitive.Item> {\n /** Icon shown to the left of the label. */\n leadingIcon?: ReactNode;\n}\n\nexport const SelectItem = forwardRef<\n ElementRef<typeof SelectPrimitive.Item>,\n SelectItemProps\n>(function SelectItem({ className, children, leadingIcon, ...props }, ref) {\n return (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center gap-2',\n 'rounded-sm px-2 py-1.5 pr-8 text-sm text-foreground outline-none',\n 'data-[highlighted]:bg-background-muted data-[highlighted]:text-foreground',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n {leadingIcon && (\n <span className=\"flex items-center text-foreground-subtle [&_svg]:size-4\">\n {leadingIcon}\n </span>\n )}\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n <span className=\"absolute right-2 flex items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"size-4 text-accent\" aria-hidden />\n </SelectPrimitive.ItemIndicator>\n </span>\n </SelectPrimitive.Item>\n );\n});\nSelectItem.displayName = 'SelectItem';\n\nexport const SelectSeparator = forwardRef<\n ElementRef<typeof SelectPrimitive.Separator>,\n ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(function SelectSeparator({ className, ...props }, ref) {\n return (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-border', className)}\n {...props}\n />\n );\n});\nSelectSeparator.displayName = 'SelectSeparator';\n\n/** Optional grouping with a label header. Pure composition over Radix Group + Label. */\nexport interface SelectGroupProps\n extends ComponentPropsWithoutRef<typeof SelectPrimitive.Group> {\n label?: ReactNode;\n}\nexport const SelectGroup = forwardRef<\n ElementRef<typeof SelectPrimitive.Group>,\n SelectGroupProps\n>(function SelectGroup({ label, children, ...props }, ref) {\n return (\n <SelectPrimitive.Group ref={ref} {...props}>\n {label && <SelectLabel>{label}</SelectLabel>}\n {children}\n </SelectPrimitive.Group>\n );\n});\nSelectGroup.displayName = 'SelectGroup';\n\n/**\n * Compose `Select` + `SelectTrigger` + `SelectContent` + `SelectItem` for a\n * single-choice picker. Keyboard, type-ahead, and ARIA come from Radix.\n *\n * @example Basic\n * <Select onValueChange={setStatus}>\n * <SelectTrigger placeholder=\"Status\" />\n * <SelectContent>\n * <SelectItem value=\"open\">Open</SelectItem>\n * <SelectItem value=\"closed\">Closed</SelectItem>\n * </SelectContent>\n * </Select>\n *\n * @example Grouped\n * <SelectContent>\n * <SelectGroup label=\"People\">\n * <SelectItem value=\"anu\">Anu</SelectItem>\n * <SelectItem value=\"bat\">Bat</SelectItem>\n * </SelectGroup>\n * <SelectSeparator />\n * <SelectGroup label=\"Bots\">\n * <SelectItem value=\"robo\">Robo</SelectItem>\n * </SelectGroup>\n * </SelectContent>\n *\n * @do Use `placeholder` on the trigger when there is no default value.\n * @dont Use Select for more than ~12 options — switch to `Combobox`.\n */\n"],"names":["Select","SelectPrimitive","SelectValue","SelectTrigger","forwardRef","className","placeholder","size","tone","props","ref","jsxs","cn","jsx","ChevronsUpDown","scrollBtn","SelectScrollUpButton","ChevronUp","SelectScrollDownButton","ChevronDown","SelectContent","children","position","SelectLabel","SelectItem","leadingIcon","Check","SelectSeparator","SelectGroup","label"],"mappings":"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"}
|