@fiestaboard/ui 3.0.1 → 3.1.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/dist/components/containment/json-tree.d.ts +59 -0
- package/dist/components/containment/json-tree.js +122 -0
- package/dist/components/containment/json-tree.js.map +1 -0
- package/dist/components/feedback/status-dot.d.ts +49 -0
- package/dist/components/feedback/status-dot.js +58 -0
- package/dist/components/feedback/status-dot.js.map +1 -0
- package/dist/components/forms/secret-input.d.ts +38 -0
- package/dist/components/forms/secret-input.js +42 -0
- package/dist/components/forms/secret-input.js.map +1 -0
- package/dist/components/forms/time-picker.d.ts +87 -0
- package/dist/components/forms/time-picker.js +260 -0
- package/dist/components/forms/time-picker.js.map +1 -0
- package/dist/components/forms/toggle-card.d.ts +120 -0
- package/dist/components/forms/toggle-card.js +211 -0
- package/dist/components/forms/toggle-card.js.map +1 -0
- package/dist/components/overlays/popover.d.ts +65 -0
- package/dist/components/overlays/popover.js +89 -0
- package/dist/components/overlays/popover.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +67 -61
- package/package.json +1 -1
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn as e } from "../../lib/utils.js";
|
|
3
|
+
import { Button as t } from "./button.js";
|
|
4
|
+
import { Flex as n } from "../layout/flex.js";
|
|
5
|
+
import { Popover as r, PopoverContent as i, PopoverTrigger as a } from "../overlays/popover.js";
|
|
6
|
+
import { Text as o } from "../typography/text.js";
|
|
7
|
+
import { Clock as s } from "lucide-react";
|
|
8
|
+
import * as c from "react";
|
|
9
|
+
import { Fragment as l, jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
10
|
+
//#region src/components/forms/time-picker.tsx
|
|
11
|
+
var f = /^(\d{1,2}):(\d{1,2})$/, p = {
|
|
12
|
+
hours: "00",
|
|
13
|
+
minutes: "00"
|
|
14
|
+
};
|
|
15
|
+
function m(e) {
|
|
16
|
+
if (!e) return null;
|
|
17
|
+
let t = f.exec(e.trim());
|
|
18
|
+
if (!t) return null;
|
|
19
|
+
let n = Number(t[1]), r = Number(t[2]);
|
|
20
|
+
return n > 23 || r > 59 ? null : {
|
|
21
|
+
hours: String(n).padStart(2, "0"),
|
|
22
|
+
minutes: String(r).padStart(2, "0")
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function h({ hours: e, minutes: t }, n, r, i) {
|
|
26
|
+
if (n === "24") return `${e}:${t}`;
|
|
27
|
+
let a = Number(e), o = a >= 12 ? i : r;
|
|
28
|
+
return `${a % 12 == 0 ? 12 : a % 12}:${t} ${o}`;
|
|
29
|
+
}
|
|
30
|
+
function g(e, t, n, r) {
|
|
31
|
+
return t === "24" ? String(e).padStart(2, "0") : `${e % 12 == 0 ? 12 : e % 12} ${e >= 12 ? r : n}`;
|
|
32
|
+
}
|
|
33
|
+
var _ = [
|
|
34
|
+
"08:00",
|
|
35
|
+
"12:00",
|
|
36
|
+
"18:00",
|
|
37
|
+
"20:00",
|
|
38
|
+
"00:00"
|
|
39
|
+
], v = "[role=\"option\"]";
|
|
40
|
+
function y(e, t) {
|
|
41
|
+
let n = e.findIndex((e) => e.value === t);
|
|
42
|
+
if (n >= 0) return n;
|
|
43
|
+
let r = Number(t), i = 0;
|
|
44
|
+
for (let t = 1; t < e.length; t += 1) Math.abs(Number(e[t].value) - r) < Math.abs(Number(e[i].value) - r) && (i = t);
|
|
45
|
+
return i;
|
|
46
|
+
}
|
|
47
|
+
var b = {
|
|
48
|
+
panel: "Choose a time",
|
|
49
|
+
hour: "Hour",
|
|
50
|
+
minute: "Minute",
|
|
51
|
+
quickPresets: "Quick presets",
|
|
52
|
+
am: "AM",
|
|
53
|
+
pm: "PM"
|
|
54
|
+
};
|
|
55
|
+
function x({ value: n, defaultValue: o = "", onValueChange: l, placeholder: f = "00:00", className: g, contentClassName: _, disabled: v, id: y, "aria-label": x, "aria-labelledby": C, "aria-describedby": w, "aria-invalid": T, hourCycle: E = "12", minuteStep: D = 5, presets: O, labels: k, defaultOpen: A = !1, open: j, onOpenChange: M, ref: N }) {
|
|
56
|
+
let [P, F] = c.useState(A), I = j ?? P, [L, R] = c.useState(o), z = n ?? L, B = c.useId(), V = {
|
|
57
|
+
...b,
|
|
58
|
+
...k
|
|
59
|
+
}, H = m(z), U = H ?? p, W = (e) => {
|
|
60
|
+
j === void 0 && F(e), M?.(e);
|
|
61
|
+
}, G = (e) => {
|
|
62
|
+
n === void 0 && R(e), l?.(e);
|
|
63
|
+
}, K = H ? h(H, E, V.am, V.pm) : f, q = `${B}-value`, J = `${B}-label`, Y = C ?? (x ? J : void 0);
|
|
64
|
+
return /* @__PURE__ */ d(r, {
|
|
65
|
+
open: I,
|
|
66
|
+
onOpenChange: W,
|
|
67
|
+
children: [/* @__PURE__ */ u(a, {
|
|
68
|
+
asChild: !0,
|
|
69
|
+
children: /* @__PURE__ */ d(t, {
|
|
70
|
+
ref: N,
|
|
71
|
+
id: y,
|
|
72
|
+
type: "button",
|
|
73
|
+
variant: "outline",
|
|
74
|
+
disabled: v,
|
|
75
|
+
"aria-labelledby": Y ? `${Y} ${q}` : void 0,
|
|
76
|
+
"aria-describedby": w,
|
|
77
|
+
"aria-invalid": T,
|
|
78
|
+
className: e("h-9 w-full justify-start px-3 text-sm font-normal", !H && "text-muted-foreground", g),
|
|
79
|
+
children: [
|
|
80
|
+
/* @__PURE__ */ u(s, {
|
|
81
|
+
className: "size-4",
|
|
82
|
+
"aria-hidden": "true"
|
|
83
|
+
}),
|
|
84
|
+
x && !C ? /* @__PURE__ */ u("span", {
|
|
85
|
+
id: J,
|
|
86
|
+
className: "sr-only",
|
|
87
|
+
children: x
|
|
88
|
+
}) : null,
|
|
89
|
+
/* @__PURE__ */ u("span", {
|
|
90
|
+
id: q,
|
|
91
|
+
children: K
|
|
92
|
+
})
|
|
93
|
+
]
|
|
94
|
+
})
|
|
95
|
+
}), /* @__PURE__ */ u(i, {
|
|
96
|
+
className: e("w-64", _),
|
|
97
|
+
align: "start",
|
|
98
|
+
label: V.panel,
|
|
99
|
+
children: I ? /* @__PURE__ */ u(S, {
|
|
100
|
+
baseId: B,
|
|
101
|
+
parts: U,
|
|
102
|
+
hasValue: H !== null,
|
|
103
|
+
hourCycle: E,
|
|
104
|
+
minuteStep: D,
|
|
105
|
+
presets: O,
|
|
106
|
+
text: V,
|
|
107
|
+
onChange: G,
|
|
108
|
+
onClose: () => W(!1)
|
|
109
|
+
}) : null
|
|
110
|
+
})]
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
function S({ baseId: e, parts: r, hasValue: i, hourCycle: a, minuteStep: s, presets: f, text: y, onChange: b, onClose: x }) {
|
|
114
|
+
let S = c.useRef(null), w = c.useMemo(() => Array.from({ length: 24 }, (e, t) => ({
|
|
115
|
+
value: String(t).padStart(2, "0"),
|
|
116
|
+
label: g(t, a, y.am, y.pm)
|
|
117
|
+
})), [
|
|
118
|
+
a,
|
|
119
|
+
y.am,
|
|
120
|
+
y.pm
|
|
121
|
+
]), T = c.useMemo(() => {
|
|
122
|
+
let e = Math.min(60, Math.max(1, Math.floor(s) || 1));
|
|
123
|
+
return Array.from({ length: Math.ceil(60 / e) }, (t, n) => {
|
|
124
|
+
let r = String(n * e).padStart(2, "0");
|
|
125
|
+
return {
|
|
126
|
+
value: r,
|
|
127
|
+
label: r
|
|
128
|
+
};
|
|
129
|
+
});
|
|
130
|
+
}, [s]), E = c.useMemo(() => (f ?? _.map((e) => ({ value: e }))).filter((e) => m(e.value) !== null), [f]);
|
|
131
|
+
c.useEffect(() => {
|
|
132
|
+
let e = requestAnimationFrame(() => {
|
|
133
|
+
S.current?.querySelector(`${v}[tabindex="0"]`)?.focus({ preventScroll: !0 });
|
|
134
|
+
});
|
|
135
|
+
return () => cancelAnimationFrame(e);
|
|
136
|
+
}, []);
|
|
137
|
+
let D = `${e}-hour`, O = `${e}-minute`, k = `${e}-presets`;
|
|
138
|
+
return /* @__PURE__ */ d(l, { children: [/* @__PURE__ */ d(n, {
|
|
139
|
+
gap: "4",
|
|
140
|
+
children: [/* @__PURE__ */ d("div", {
|
|
141
|
+
className: "flex-1",
|
|
142
|
+
ref: S,
|
|
143
|
+
children: [/* @__PURE__ */ u(o, {
|
|
144
|
+
as: "span",
|
|
145
|
+
id: D,
|
|
146
|
+
size: "xs",
|
|
147
|
+
weight: "medium",
|
|
148
|
+
tone: "muted",
|
|
149
|
+
className: "mb-2 block",
|
|
150
|
+
children: y.hour
|
|
151
|
+
}), /* @__PURE__ */ u(C, {
|
|
152
|
+
labelId: D,
|
|
153
|
+
options: w,
|
|
154
|
+
selected: r.hours,
|
|
155
|
+
onSelect: (e) => b(`${e}:${r.minutes}`)
|
|
156
|
+
})]
|
|
157
|
+
}), /* @__PURE__ */ d("div", {
|
|
158
|
+
className: "flex-1",
|
|
159
|
+
children: [/* @__PURE__ */ u(o, {
|
|
160
|
+
as: "span",
|
|
161
|
+
id: O,
|
|
162
|
+
size: "xs",
|
|
163
|
+
weight: "medium",
|
|
164
|
+
tone: "muted",
|
|
165
|
+
className: "mb-2 block",
|
|
166
|
+
children: y.minute
|
|
167
|
+
}), /* @__PURE__ */ u(C, {
|
|
168
|
+
labelId: O,
|
|
169
|
+
options: T,
|
|
170
|
+
selected: r.minutes,
|
|
171
|
+
onSelect: (e) => b(`${r.hours}:${e}`)
|
|
172
|
+
})]
|
|
173
|
+
})]
|
|
174
|
+
}), E.length > 0 && /* @__PURE__ */ d("div", {
|
|
175
|
+
className: "mt-4 border-t pt-4",
|
|
176
|
+
children: [/* @__PURE__ */ u(o, {
|
|
177
|
+
as: "span",
|
|
178
|
+
id: k,
|
|
179
|
+
size: "xs",
|
|
180
|
+
weight: "medium",
|
|
181
|
+
tone: "muted",
|
|
182
|
+
className: "mb-2 block",
|
|
183
|
+
children: y.quickPresets
|
|
184
|
+
}), /* @__PURE__ */ u(n, {
|
|
185
|
+
gap: "2",
|
|
186
|
+
wrap: !0,
|
|
187
|
+
role: "group",
|
|
188
|
+
"aria-labelledby": k,
|
|
189
|
+
children: E.map((e) => {
|
|
190
|
+
let n = m(e.value) ?? p, o = `${n.hours}:${n.minutes}`;
|
|
191
|
+
return /* @__PURE__ */ u(t, {
|
|
192
|
+
type: "button",
|
|
193
|
+
variant: "outline",
|
|
194
|
+
size: "sm",
|
|
195
|
+
"aria-current": i && o === `${r.hours}:${r.minutes}` ? !0 : void 0,
|
|
196
|
+
onClick: () => {
|
|
197
|
+
b(o), x();
|
|
198
|
+
},
|
|
199
|
+
className: "h-7 px-2 text-xs aria-[current=true]:bg-accent aria-[current=true]:text-accent-foreground",
|
|
200
|
+
children: e.label ?? h(n, a, y.am, y.pm)
|
|
201
|
+
}, e.value);
|
|
202
|
+
})
|
|
203
|
+
})]
|
|
204
|
+
})] });
|
|
205
|
+
}
|
|
206
|
+
function C({ labelId: t, options: n, selected: r, onSelect: i }) {
|
|
207
|
+
let a = c.useRef(null), o = y(n, r);
|
|
208
|
+
c.useEffect(() => {
|
|
209
|
+
let e = a.current, t = e?.querySelectorAll(v)[o];
|
|
210
|
+
if (!e || !t) return;
|
|
211
|
+
let n = e.getBoundingClientRect(), r = t.getBoundingClientRect();
|
|
212
|
+
e.scrollTop += r.top - n.top - (e.clientHeight - r.height) / 2;
|
|
213
|
+
}, []);
|
|
214
|
+
let s = (e) => {
|
|
215
|
+
let t = Math.max(0, Math.min(n.length - 1, e));
|
|
216
|
+
i(n[t].value), (a.current?.querySelectorAll(v))?.[t]?.focus();
|
|
217
|
+
}, l = (e, t) => {
|
|
218
|
+
switch (e.key) {
|
|
219
|
+
case "ArrowDown":
|
|
220
|
+
e.preventDefault(), s(t + 1);
|
|
221
|
+
break;
|
|
222
|
+
case "ArrowUp":
|
|
223
|
+
e.preventDefault(), s(t - 1);
|
|
224
|
+
break;
|
|
225
|
+
case "PageDown":
|
|
226
|
+
e.preventDefault(), s(t + 5);
|
|
227
|
+
break;
|
|
228
|
+
case "PageUp":
|
|
229
|
+
e.preventDefault(), s(t - 5);
|
|
230
|
+
break;
|
|
231
|
+
case "Home":
|
|
232
|
+
e.preventDefault(), s(0);
|
|
233
|
+
break;
|
|
234
|
+
case "End":
|
|
235
|
+
e.preventDefault(), s(n.length - 1);
|
|
236
|
+
break;
|
|
237
|
+
case "Enter":
|
|
238
|
+
case " ": e.preventDefault(), i(n[t].value);
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
return /* @__PURE__ */ u("div", {
|
|
242
|
+
ref: a,
|
|
243
|
+
role: "listbox",
|
|
244
|
+
"aria-labelledby": t,
|
|
245
|
+
className: "max-h-48 overflow-y-auto rounded-md border bg-background",
|
|
246
|
+
children: n.map((t, n) => /* @__PURE__ */ u("div", {
|
|
247
|
+
role: "option",
|
|
248
|
+
"aria-selected": t.value === r,
|
|
249
|
+
tabIndex: n === o ? 0 : -1,
|
|
250
|
+
onClick: () => i(t.value),
|
|
251
|
+
onKeyDown: (e) => l(e, n),
|
|
252
|
+
className: e("cursor-default px-3 py-2 text-left text-sm transition-colors duration-control", "hover:bg-accent hover:text-accent-foreground", "outline-none focus:bg-accent focus:text-accent-foreground focus:ring-[3px] focus:ring-inset focus:ring-ring/50", t.value === r && "bg-accent font-medium text-accent-foreground"),
|
|
253
|
+
children: t.label
|
|
254
|
+
}, t.value))
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
//#endregion
|
|
258
|
+
export { x as TimePicker };
|
|
259
|
+
|
|
260
|
+
//# sourceMappingURL=time-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-picker.js","names":[],"sources":["../../../src/components/forms/time-picker.tsx"],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { type VariantProps } from "class-variance-authority";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
/**
|
|
4
|
+
* A `radiogroup` has no implicit label, so axe (and every screen reader)
|
|
5
|
+
* needs one from the call site. Requiring it in the type means a group can
|
|
6
|
+
* never ship nameless: pass `aria-label`, or `aria-labelledby` pointing at
|
|
7
|
+
* the heading/`<Label>` that already introduces the options.
|
|
8
|
+
*/
|
|
9
|
+
export type SelectionGroupNameProps = {
|
|
10
|
+
"aria-label": string;
|
|
11
|
+
"aria-labelledby"?: string;
|
|
12
|
+
} | {
|
|
13
|
+
"aria-labelledby": string;
|
|
14
|
+
"aria-label"?: string;
|
|
15
|
+
};
|
|
16
|
+
export interface SelectionGroupBaseProps {
|
|
17
|
+
/** Selected option value (controlled). Pair with `onValueChange`. */
|
|
18
|
+
value?: string | null;
|
|
19
|
+
/** Initially selected option value (uncontrolled). */
|
|
20
|
+
defaultValue?: string | null;
|
|
21
|
+
/** Fired with the newly selected value. Selection is never emptied. */
|
|
22
|
+
onValueChange?: (value: string) => void;
|
|
23
|
+
/** Disables every option in the group. */
|
|
24
|
+
disabled?: boolean;
|
|
25
|
+
/** Form field name — each option renders a hidden radio input under it. */
|
|
26
|
+
name?: string;
|
|
27
|
+
/** id of the form that owns the group, when rendered outside it. */
|
|
28
|
+
form?: string;
|
|
29
|
+
/** Marks the group required for form validation. */
|
|
30
|
+
required?: boolean;
|
|
31
|
+
}
|
|
32
|
+
declare const toggleCardGroupVariants: (props?: ({
|
|
33
|
+
columns?: "1" | "2" | "3" | null | undefined;
|
|
34
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
35
|
+
declare const toggleCardVariants: (props?: ({
|
|
36
|
+
size?: "sm" | "md" | "lg" | null | undefined;
|
|
37
|
+
align?: "start" | "center" | null | undefined;
|
|
38
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
39
|
+
type ToggleCardSize = NonNullable<VariantProps<typeof toggleCardVariants>["size"]>;
|
|
40
|
+
type ToggleCardAlign = NonNullable<VariantProps<typeof toggleCardVariants>["align"]>;
|
|
41
|
+
export type ToggleCardGroupProps = SelectionGroupBaseProps & SelectionGroupNameProps & VariantProps<typeof toggleCardGroupVariants> & {
|
|
42
|
+
/** Size applied to every card in the group; a card may override it. */
|
|
43
|
+
size?: ToggleCardSize;
|
|
44
|
+
/** Content alignment applied to every card in the group. */
|
|
45
|
+
align?: ToggleCardAlign;
|
|
46
|
+
/** Show the selected-check on every card in the group. @default true */
|
|
47
|
+
indicator?: boolean;
|
|
48
|
+
className?: string;
|
|
49
|
+
children?: React.ReactNode;
|
|
50
|
+
} & Omit<React.ComponentProps<"div">, "defaultValue" | "onChange">;
|
|
51
|
+
/**
|
|
52
|
+
* Single-select group of {@link ToggleCard}s — a real `radiogroup`.
|
|
53
|
+
*
|
|
54
|
+
* One tab stop for the whole group; arrow keys move the selection and wrap.
|
|
55
|
+
* Cards inside it take their state from the group's `value`, so they need a
|
|
56
|
+
* `value` of their own and must NOT be given `pressed`.
|
|
57
|
+
*/
|
|
58
|
+
declare function ToggleCardGroup({ className, columns, size, align, indicator, children, ...props }: ToggleCardGroupProps): React.JSX.Element;
|
|
59
|
+
export type ToggleCardProps = Omit<React.ComponentProps<"button">, "value" | "title"> & VariantProps<typeof toggleCardVariants> & {
|
|
60
|
+
/** Identifies the card inside a {@link ToggleCardGroup}. */
|
|
61
|
+
value?: string;
|
|
62
|
+
/** Standalone toggle state — only outside a group. Pair with `onPressedChange`. */
|
|
63
|
+
pressed?: boolean;
|
|
64
|
+
onPressedChange?: (pressed: boolean) => void;
|
|
65
|
+
/** Leading icon (a lucide element); sized to 16px unless it sets its own. */
|
|
66
|
+
icon?: React.ReactNode;
|
|
67
|
+
/** Primary label. Provides the card's accessible name. */
|
|
68
|
+
title?: React.ReactNode;
|
|
69
|
+
/** Secondary line under the title. */
|
|
70
|
+
description?: React.ReactNode;
|
|
71
|
+
/** Trailing content on the title row — a badge, a size indicator, a price. */
|
|
72
|
+
meta?: React.ReactNode;
|
|
73
|
+
/**
|
|
74
|
+
* Render a check in the corner when selected, so selection is not carried
|
|
75
|
+
* by hue alone. @default true
|
|
76
|
+
*/
|
|
77
|
+
indicator?: boolean;
|
|
78
|
+
/** Extra body content below the title row — a preview, a thumbnail row. */
|
|
79
|
+
children?: React.ReactNode;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* A large selectable tile: optional icon, title, description and preview
|
|
83
|
+
* body.
|
|
84
|
+
*
|
|
85
|
+
* Inside a {@link ToggleCardGroup} it is a `radio` (`aria-checked`, roving
|
|
86
|
+
* tabindex, arrow-key navigation). On its own, with `pressed`, it is a
|
|
87
|
+
* toggle button (`aria-pressed`). See the note at the top of this file.
|
|
88
|
+
*/
|
|
89
|
+
declare function ToggleCard({ className, size, align, value, pressed, onPressedChange, icon, title, description, meta, indicator, children, ...props }: ToggleCardProps): React.JSX.Element;
|
|
90
|
+
declare const segmentedControlVariants: (props?: ({
|
|
91
|
+
wrap?: boolean | null | undefined;
|
|
92
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
93
|
+
declare const segmentedControlItemVariants: (props?: ({
|
|
94
|
+
size?: "sm" | "md" | "lg" | null | undefined;
|
|
95
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
96
|
+
type SegmentedControlSize = NonNullable<VariantProps<typeof segmentedControlItemVariants>["size"]>;
|
|
97
|
+
export type SegmentedControlProps = SelectionGroupBaseProps & SelectionGroupNameProps & VariantProps<typeof segmentedControlVariants> & {
|
|
98
|
+
/** Size applied to every item; an item may override it. */
|
|
99
|
+
size?: SegmentedControlSize;
|
|
100
|
+
className?: string;
|
|
101
|
+
children?: React.ReactNode;
|
|
102
|
+
} & Omit<React.ComponentProps<"div">, "defaultValue" | "onChange">;
|
|
103
|
+
/**
|
|
104
|
+
* Compact single-select pill row — the toolbar-scale sibling of
|
|
105
|
+
* {@link ToggleCardGroup}, with the same `radiogroup` semantics.
|
|
106
|
+
*/
|
|
107
|
+
declare function SegmentedControl({ className, size, wrap, children, ...props }: SegmentedControlProps): React.JSX.Element;
|
|
108
|
+
export type SegmentedControlItemProps = Omit<React.ComponentProps<"button">, "value"> & VariantProps<typeof segmentedControlItemVariants> & {
|
|
109
|
+
/** Identifies the item inside a {@link SegmentedControl}. */
|
|
110
|
+
value?: string;
|
|
111
|
+
/** Standalone toggle state — only outside a SegmentedControl. */
|
|
112
|
+
pressed?: boolean;
|
|
113
|
+
onPressedChange?: (pressed: boolean) => void;
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* One pill. Inside a {@link SegmentedControl} it is a `radio`; on its own
|
|
117
|
+
* with `pressed` it is an `aria-pressed` toggle (a filter chip).
|
|
118
|
+
*/
|
|
119
|
+
declare function SegmentedControlItem({ className, size, value, pressed, onPressedChange, children, ...props }: SegmentedControlItemProps): React.JSX.Element;
|
|
120
|
+
export { SegmentedControl, SegmentedControlItem, segmentedControlItemVariants, segmentedControlVariants, ToggleCard, ToggleCardGroup, toggleCardGroupVariants, toggleCardVariants, };
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn as e } from "../../lib/utils.js";
|
|
3
|
+
import { Check as t } from "lucide-react";
|
|
4
|
+
import * as n from "react";
|
|
5
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
6
|
+
import { cva as a } from "class-variance-authority";
|
|
7
|
+
import { Radio as o } from "@base-ui/react/radio";
|
|
8
|
+
import { RadioGroup as s } from "@base-ui/react/radio-group";
|
|
9
|
+
//#region src/components/forms/toggle-card.tsx
|
|
10
|
+
function c({ slot: e, onValueChange: t, className: n, children: i, ...a }) {
|
|
11
|
+
return /* @__PURE__ */ r(s, {
|
|
12
|
+
"data-slot": e,
|
|
13
|
+
className: n,
|
|
14
|
+
onValueChange: (e) => t?.(e),
|
|
15
|
+
...a,
|
|
16
|
+
children: i
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function l({ grouped: e, value: t, pressed: n, onPressedChange: i, onClick: a, disabled: s, ref: c, children: l, ...u }) {
|
|
20
|
+
if (e) return /* @__PURE__ */ r(o.Root, {
|
|
21
|
+
value: t,
|
|
22
|
+
render: /* @__PURE__ */ r("button", { type: "button" }),
|
|
23
|
+
nativeButton: !0,
|
|
24
|
+
disabled: s,
|
|
25
|
+
onClick: a,
|
|
26
|
+
ref: c,
|
|
27
|
+
...u,
|
|
28
|
+
children: l
|
|
29
|
+
});
|
|
30
|
+
let d = (e) => {
|
|
31
|
+
a?.(e), !e.defaultPrevented && i?.(!n);
|
|
32
|
+
};
|
|
33
|
+
return /* @__PURE__ */ r("button", {
|
|
34
|
+
type: "button",
|
|
35
|
+
disabled: s,
|
|
36
|
+
ref: c,
|
|
37
|
+
...n === void 0 ? {} : {
|
|
38
|
+
"aria-pressed": n,
|
|
39
|
+
...n ? { "data-checked": "" } : { "data-unchecked": "" }
|
|
40
|
+
},
|
|
41
|
+
onClick: d,
|
|
42
|
+
...u,
|
|
43
|
+
children: l
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
var u = a("gap-3", {
|
|
47
|
+
variants: { columns: {
|
|
48
|
+
1: "flex flex-col",
|
|
49
|
+
2: "grid grid-cols-1 sm:grid-cols-2",
|
|
50
|
+
3: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3"
|
|
51
|
+
} },
|
|
52
|
+
defaultVariants: { columns: "1" }
|
|
53
|
+
}), d = a([
|
|
54
|
+
"group/toggle-card relative flex w-full cursor-pointer flex-col border border-input bg-transparent",
|
|
55
|
+
"transition-[color,background-color,border-color,box-shadow] duration-control outline-none",
|
|
56
|
+
"not-data-[checked]:hover:border-primary/50 not-data-[checked]:hover:bg-accent/50",
|
|
57
|
+
"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
|
|
58
|
+
"data-[checked]:border-primary data-[checked]:bg-primary/5",
|
|
59
|
+
"disabled:pointer-events-none disabled:opacity-50",
|
|
60
|
+
"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4"
|
|
61
|
+
], {
|
|
62
|
+
variants: {
|
|
63
|
+
size: {
|
|
64
|
+
sm: "gap-1.5 rounded-md p-2 text-xs",
|
|
65
|
+
md: "gap-2 rounded-lg p-3 text-sm",
|
|
66
|
+
lg: "gap-2.5 rounded-xl px-4 py-3.5 text-sm"
|
|
67
|
+
},
|
|
68
|
+
align: {
|
|
69
|
+
start: "text-left",
|
|
70
|
+
center: "text-center"
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
defaultVariants: {
|
|
74
|
+
size: "md",
|
|
75
|
+
align: "start"
|
|
76
|
+
}
|
|
77
|
+
}), f = a("flex w-full min-w-0", {
|
|
78
|
+
variants: { align: {
|
|
79
|
+
start: "flex-row items-start gap-3",
|
|
80
|
+
center: "flex-col items-center gap-1.5"
|
|
81
|
+
} },
|
|
82
|
+
defaultVariants: { align: "start" }
|
|
83
|
+
}), p = n.createContext(null);
|
|
84
|
+
function m({ className: t, columns: i, size: a, align: o, indicator: s, children: l, ...d }) {
|
|
85
|
+
let f = n.useMemo(() => ({
|
|
86
|
+
size: a,
|
|
87
|
+
align: o,
|
|
88
|
+
indicator: s
|
|
89
|
+
}), [
|
|
90
|
+
a,
|
|
91
|
+
o,
|
|
92
|
+
s
|
|
93
|
+
]);
|
|
94
|
+
return /* @__PURE__ */ r(p.Provider, {
|
|
95
|
+
value: f,
|
|
96
|
+
children: /* @__PURE__ */ r(c, {
|
|
97
|
+
slot: "toggle-card-group",
|
|
98
|
+
className: e(u({ columns: i }), t),
|
|
99
|
+
...d,
|
|
100
|
+
children: l
|
|
101
|
+
})
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
function h({ className: a, size: o, align: s, value: c, pressed: u, onPressedChange: m, icon: h, title: g, description: _, meta: v, indicator: y, children: b, ...x }) {
|
|
105
|
+
let S = n.useContext(p), C = o ?? S?.size ?? "md", w = s ?? S?.align ?? "start", T = y ?? S?.indicator ?? !0;
|
|
106
|
+
return /* @__PURE__ */ i(l, {
|
|
107
|
+
grouped: S !== null,
|
|
108
|
+
value: c,
|
|
109
|
+
pressed: u,
|
|
110
|
+
onPressedChange: m,
|
|
111
|
+
"data-slot": "toggle-card",
|
|
112
|
+
"data-size": C,
|
|
113
|
+
className: e(d({
|
|
114
|
+
size: C,
|
|
115
|
+
align: w
|
|
116
|
+
}), T && (w === "center" ? "px-6" : "pr-8"), a),
|
|
117
|
+
...x,
|
|
118
|
+
children: [
|
|
119
|
+
/* @__PURE__ */ i("span", {
|
|
120
|
+
"data-slot": "toggle-card-header",
|
|
121
|
+
className: f({ align: w }),
|
|
122
|
+
children: [
|
|
123
|
+
h != null && /* @__PURE__ */ r("span", {
|
|
124
|
+
"data-slot": "toggle-card-icon",
|
|
125
|
+
className: e("flex shrink-0 items-center text-muted-foreground transition-colors duration-control group-data-[checked]/toggle-card:text-primary", w === "start" && "mt-0.5"),
|
|
126
|
+
"aria-hidden": "true",
|
|
127
|
+
children: h
|
|
128
|
+
}),
|
|
129
|
+
(g != null || _ != null) && /* @__PURE__ */ i("span", {
|
|
130
|
+
"data-slot": "toggle-card-body",
|
|
131
|
+
className: "flex min-w-0 flex-1 flex-col gap-1",
|
|
132
|
+
children: [g != null && /* @__PURE__ */ r("span", {
|
|
133
|
+
"data-slot": "toggle-card-title",
|
|
134
|
+
className: "font-medium",
|
|
135
|
+
children: g
|
|
136
|
+
}), _ != null && /* @__PURE__ */ r("span", {
|
|
137
|
+
"data-slot": "toggle-card-description",
|
|
138
|
+
className: "text-xs font-normal text-muted-foreground",
|
|
139
|
+
children: _
|
|
140
|
+
})]
|
|
141
|
+
}),
|
|
142
|
+
v != null && /* @__PURE__ */ r("span", {
|
|
143
|
+
"data-slot": "toggle-card-meta",
|
|
144
|
+
className: "shrink-0 text-muted-foreground",
|
|
145
|
+
children: v
|
|
146
|
+
})
|
|
147
|
+
]
|
|
148
|
+
}),
|
|
149
|
+
b,
|
|
150
|
+
T && /* @__PURE__ */ r("span", {
|
|
151
|
+
"data-slot": "toggle-card-indicator",
|
|
152
|
+
"aria-hidden": "true",
|
|
153
|
+
className: "pointer-events-none absolute right-2 top-2 flex size-4 items-center justify-center rounded-full border border-input text-primary-foreground opacity-0 transition-[color,background-color,border-color,opacity] duration-control group-data-[checked]/toggle-card:border-primary group-data-[checked]/toggle-card:bg-primary group-data-[checked]/toggle-card:opacity-100",
|
|
154
|
+
children: /* @__PURE__ */ r(t, { className: "size-3" })
|
|
155
|
+
})
|
|
156
|
+
]
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
var g = a("flex items-center gap-2", {
|
|
160
|
+
variants: { wrap: {
|
|
161
|
+
true: "flex-wrap",
|
|
162
|
+
false: "flex-nowrap"
|
|
163
|
+
} },
|
|
164
|
+
defaultVariants: { wrap: !0 }
|
|
165
|
+
}), _ = a([
|
|
166
|
+
"group/segmented-item inline-flex cursor-pointer items-center justify-center gap-1.5 whitespace-nowrap",
|
|
167
|
+
"border border-input bg-transparent font-medium text-foreground",
|
|
168
|
+
"transition-[color,background-color,border-color,box-shadow] duration-control outline-none",
|
|
169
|
+
"not-data-[checked]:hover:border-primary/50 not-data-[checked]:hover:bg-accent",
|
|
170
|
+
"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
|
|
171
|
+
"data-[checked]:border-primary data-[checked]:bg-primary/10 data-[checked]:text-primary",
|
|
172
|
+
"disabled:pointer-events-none disabled:opacity-50",
|
|
173
|
+
"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4"
|
|
174
|
+
], {
|
|
175
|
+
variants: { size: {
|
|
176
|
+
sm: "h-7 rounded-md px-2.5 text-xs",
|
|
177
|
+
md: "h-8 rounded-md px-3 text-sm",
|
|
178
|
+
lg: "h-9 rounded-md px-4 text-sm"
|
|
179
|
+
} },
|
|
180
|
+
defaultVariants: { size: "md" }
|
|
181
|
+
}), v = n.createContext(null);
|
|
182
|
+
function y({ className: t, size: i, wrap: a, children: o, ...s }) {
|
|
183
|
+
let l = n.useMemo(() => ({ size: i }), [i]);
|
|
184
|
+
return /* @__PURE__ */ r(v.Provider, {
|
|
185
|
+
value: l,
|
|
186
|
+
children: /* @__PURE__ */ r(c, {
|
|
187
|
+
slot: "segmented-control",
|
|
188
|
+
className: e(g({ wrap: a }), t),
|
|
189
|
+
...s,
|
|
190
|
+
children: o
|
|
191
|
+
})
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
function b({ className: t, size: i, value: a, pressed: o, onPressedChange: s, children: c, ...u }) {
|
|
195
|
+
let d = n.useContext(v), f = i ?? d?.size ?? "md";
|
|
196
|
+
return /* @__PURE__ */ r(l, {
|
|
197
|
+
grouped: d !== null,
|
|
198
|
+
value: a,
|
|
199
|
+
pressed: o,
|
|
200
|
+
onPressedChange: s,
|
|
201
|
+
"data-slot": "segmented-control-item",
|
|
202
|
+
"data-size": f,
|
|
203
|
+
className: e(_({ size: f }), t),
|
|
204
|
+
...u,
|
|
205
|
+
children: c
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
//#endregion
|
|
209
|
+
export { y as SegmentedControl, b as SegmentedControlItem, h as ToggleCard, m as ToggleCardGroup, _ as segmentedControlItemVariants, g as segmentedControlVariants, u as toggleCardGroupVariants, d as toggleCardVariants };
|
|
210
|
+
|
|
211
|
+
//# sourceMappingURL=toggle-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toggle-card.js","names":[],"sources":["../../../src/components/forms/toggle-card.tsx"],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Popover as PopoverPrimitive } from "@base-ui/react/popover";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
type PopoverRootProps = React.ComponentProps<typeof PopoverPrimitive.Root>;
|
|
4
|
+
type PopoverPositionerProps = React.ComponentProps<typeof PopoverPrimitive.Positioner>;
|
|
5
|
+
declare function usePopoverClose(): () => void;
|
|
6
|
+
interface PopoverProps extends Omit<PopoverRootProps, "children"> {
|
|
7
|
+
children?: React.ReactNode;
|
|
8
|
+
/**
|
|
9
|
+
* Whether a press outside the popup dismisses it. Escape and `<PopoverClose>`
|
|
10
|
+
* keep working when this is `false`, so the popup is never a keyboard trap.
|
|
11
|
+
* @default true
|
|
12
|
+
*/
|
|
13
|
+
closeOnOutsideClick?: boolean;
|
|
14
|
+
}
|
|
15
|
+
declare function Popover({ actionsRef, closeOnOutsideClick, onOpenChange, children, ...props }: PopoverProps): React.JSX.Element;
|
|
16
|
+
declare function PopoverTrigger({ asChild, children, ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger> & {
|
|
17
|
+
asChild?: boolean;
|
|
18
|
+
}): React.JSX.Element;
|
|
19
|
+
interface PopoverContentProps extends Omit<React.ComponentProps<typeof PopoverPrimitive.Popup>, "children"> {
|
|
20
|
+
/** Preferred side of the anchor. Flipped automatically when it does not fit. */
|
|
21
|
+
side?: "top" | "right" | "bottom" | "left";
|
|
22
|
+
/** Alignment along the chosen side. Shifted automatically when it does not fit. */
|
|
23
|
+
align?: "start" | "center" | "end";
|
|
24
|
+
/** Distance in pixels between the anchor and the popup. */
|
|
25
|
+
sideOffset?: number;
|
|
26
|
+
/** Offset in pixels along the alignment axis. */
|
|
27
|
+
alignOffset?: number;
|
|
28
|
+
/** Minimum gap kept between the popup and the edge of the viewport. */
|
|
29
|
+
collisionPadding?: PopoverPositionerProps["collisionPadding"];
|
|
30
|
+
/** Element the popup is kept inside of. Defaults to the viewport. */
|
|
31
|
+
collisionBoundary?: PopoverPositionerProps["collisionBoundary"];
|
|
32
|
+
/** How side/alignment overflow is corrected. See Base UI's `collisionAvoidance`. */
|
|
33
|
+
collisionAvoidance?: PopoverPositionerProps["collisionAvoidance"];
|
|
34
|
+
/** Keep the popup on screen after the anchor scrolls out of view. */
|
|
35
|
+
sticky?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Anchor the popup to something other than the trigger — an element, a ref,
|
|
38
|
+
* or a virtual element (`getBoundingClientRect`). Useful for anchoring to a
|
|
39
|
+
* text selection or an editor node rather than a button.
|
|
40
|
+
*/
|
|
41
|
+
anchor?: PopoverPositionerProps["anchor"];
|
|
42
|
+
/** Class applied to the positioner wrapper rather than the popup surface. */
|
|
43
|
+
positionerClassName?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Accessible name for the popup, which Base UI renders with `role="dialog"`.
|
|
46
|
+
* Ignored once a `<PopoverTitle>` is rendered inside, since that wins by
|
|
47
|
+
* `aria-labelledby`.
|
|
48
|
+
* @default "Popover"
|
|
49
|
+
*/
|
|
50
|
+
label?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Popup body. A function receives an imperative `close`, so a picker can
|
|
53
|
+
* dismiss itself on selection.
|
|
54
|
+
*/
|
|
55
|
+
children?: React.ReactNode | ((api: {
|
|
56
|
+
close: () => void;
|
|
57
|
+
}) => React.ReactNode);
|
|
58
|
+
}
|
|
59
|
+
declare function PopoverContent({ className, positionerClassName, side, align, sideOffset, alignOffset, collisionPadding, collisionBoundary, collisionAvoidance, sticky, anchor, label, children, ...props }: PopoverContentProps): React.JSX.Element;
|
|
60
|
+
declare function PopoverTitle({ className, ...props }: React.ComponentProps<typeof PopoverPrimitive.Title>): React.JSX.Element;
|
|
61
|
+
declare function PopoverDescription({ className, ...props }: React.ComponentProps<typeof PopoverPrimitive.Description>): React.JSX.Element;
|
|
62
|
+
declare function PopoverClose({ asChild, children, ...props }: React.ComponentProps<typeof PopoverPrimitive.Close> & {
|
|
63
|
+
asChild?: boolean;
|
|
64
|
+
}): React.JSX.Element;
|
|
65
|
+
export { Popover, PopoverClose, PopoverContent, PopoverDescription, PopoverTitle, PopoverTrigger, usePopoverClose };
|