@pearpages/pulp-react 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +65 -0
- package/dist/ListboxOptions-DLsT-dkV.d.ts +11 -0
- package/dist/ToggleField-C-qKSgHh.d.ts +3 -0
- package/dist/accordion.css +90 -0
- package/dist/accordion.css.map +1 -0
- package/dist/accordion.d.ts +71 -0
- package/dist/accordion.js +6 -0
- package/dist/accordion.js.map +1 -0
- package/dist/alert.css +246 -0
- package/dist/alert.css.map +1 -0
- package/dist/alert.d.ts +46 -0
- package/dist/alert.js +10 -0
- package/dist/alert.js.map +1 -0
- package/dist/badge.css +89 -0
- package/dist/badge.css.map +1 -0
- package/dist/badge.d.ts +38 -0
- package/dist/badge.js +5 -0
- package/dist/badge.js.map +1 -0
- package/dist/button.css +162 -0
- package/dist/button.css.map +1 -0
- package/dist/button.d.ts +61 -0
- package/dist/button.js +8 -0
- package/dist/button.js.map +1 -0
- package/dist/calendar.css +128 -0
- package/dist/calendar.css.map +1 -0
- package/dist/calendar.d.ts +48 -0
- package/dist/calendar.js +6 -0
- package/dist/calendar.js.map +1 -0
- package/dist/card.css +66 -0
- package/dist/card.css.map +1 -0
- package/dist/card.d.ts +69 -0
- package/dist/card.js +5 -0
- package/dist/card.js.map +1 -0
- package/dist/checkbox.css +106 -0
- package/dist/checkbox.css.map +1 -0
- package/dist/checkbox.d.ts +41 -0
- package/dist/checkbox.js +7 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/chunk-2PXTVZ7H.js +95 -0
- package/dist/chunk-2PXTVZ7H.js.map +1 -0
- package/dist/chunk-2ZP4ZBI5.js +43 -0
- package/dist/chunk-2ZP4ZBI5.js.map +1 -0
- package/dist/chunk-3GWESUGD.js +28 -0
- package/dist/chunk-3GWESUGD.js.map +1 -0
- package/dist/chunk-4HRNRTXI.js +25 -0
- package/dist/chunk-4HRNRTXI.js.map +1 -0
- package/dist/chunk-5SBKZS56.js +56 -0
- package/dist/chunk-5SBKZS56.js.map +1 -0
- package/dist/chunk-6I26MMQF.js +19 -0
- package/dist/chunk-6I26MMQF.js.map +1 -0
- package/dist/chunk-75GTNRBH.js +45 -0
- package/dist/chunk-75GTNRBH.js.map +1 -0
- package/dist/chunk-7DS4I7OJ.js +30 -0
- package/dist/chunk-7DS4I7OJ.js.map +1 -0
- package/dist/chunk-ASNTNTJW.js +27 -0
- package/dist/chunk-ASNTNTJW.js.map +1 -0
- package/dist/chunk-ASOQ2MVR.js +19 -0
- package/dist/chunk-ASOQ2MVR.js.map +1 -0
- package/dist/chunk-AWQHULJC.js +31 -0
- package/dist/chunk-AWQHULJC.js.map +1 -0
- package/dist/chunk-BBV4L5WO.js +43 -0
- package/dist/chunk-BBV4L5WO.js.map +1 -0
- package/dist/chunk-CZBCGLEM.js +9 -0
- package/dist/chunk-CZBCGLEM.js.map +1 -0
- package/dist/chunk-DWE374JX.js +65 -0
- package/dist/chunk-DWE374JX.js.map +1 -0
- package/dist/chunk-DXOOW6Q6.js +159 -0
- package/dist/chunk-DXOOW6Q6.js.map +1 -0
- package/dist/chunk-F3OFZGGE.js +116 -0
- package/dist/chunk-F3OFZGGE.js.map +1 -0
- package/dist/chunk-FH54XQ35.js +125 -0
- package/dist/chunk-FH54XQ35.js.map +1 -0
- package/dist/chunk-FXRSZUDH.js +38 -0
- package/dist/chunk-FXRSZUDH.js.map +1 -0
- package/dist/chunk-GTTXRDXV.js +181 -0
- package/dist/chunk-GTTXRDXV.js.map +1 -0
- package/dist/chunk-I4KC4V6A.js +31 -0
- package/dist/chunk-I4KC4V6A.js.map +1 -0
- package/dist/chunk-I5OZ63W7.js +50 -0
- package/dist/chunk-I5OZ63W7.js.map +1 -0
- package/dist/chunk-IDNGNQNV.js +41 -0
- package/dist/chunk-IDNGNQNV.js.map +1 -0
- package/dist/chunk-J5S2HVHO.js +67 -0
- package/dist/chunk-J5S2HVHO.js.map +1 -0
- package/dist/chunk-K5QGGQOV.js +84 -0
- package/dist/chunk-K5QGGQOV.js.map +1 -0
- package/dist/chunk-KPQGS4PG.js +77 -0
- package/dist/chunk-KPQGS4PG.js.map +1 -0
- package/dist/chunk-MI4QUKQS.js +8 -0
- package/dist/chunk-MI4QUKQS.js.map +1 -0
- package/dist/chunk-MRQWUCBA.js +57 -0
- package/dist/chunk-MRQWUCBA.js.map +1 -0
- package/dist/chunk-MXWXJZFS.js +48 -0
- package/dist/chunk-MXWXJZFS.js.map +1 -0
- package/dist/chunk-N7L66GMG.js +129 -0
- package/dist/chunk-N7L66GMG.js.map +1 -0
- package/dist/chunk-NAYFLTK6.js +32 -0
- package/dist/chunk-NAYFLTK6.js.map +1 -0
- package/dist/chunk-O6OBFL3Q.js +155 -0
- package/dist/chunk-O6OBFL3Q.js.map +1 -0
- package/dist/chunk-OGIQRHNF.js +52 -0
- package/dist/chunk-OGIQRHNF.js.map +1 -0
- package/dist/chunk-OUFAFINB.js +45 -0
- package/dist/chunk-OUFAFINB.js.map +1 -0
- package/dist/chunk-OXYP34CG.js +43 -0
- package/dist/chunk-OXYP34CG.js.map +1 -0
- package/dist/chunk-P5C2U5ZF.js +73 -0
- package/dist/chunk-P5C2U5ZF.js.map +1 -0
- package/dist/chunk-PM4YO67Q.js +53 -0
- package/dist/chunk-PM4YO67Q.js.map +1 -0
- package/dist/chunk-Q6J6BMSB.js +86 -0
- package/dist/chunk-Q6J6BMSB.js.map +1 -0
- package/dist/chunk-T76YSNTZ.js +33 -0
- package/dist/chunk-T76YSNTZ.js.map +1 -0
- package/dist/chunk-TGMDOQCL.js +53 -0
- package/dist/chunk-TGMDOQCL.js.map +1 -0
- package/dist/chunk-TVI5AXLE.js +41 -0
- package/dist/chunk-TVI5AXLE.js.map +1 -0
- package/dist/chunk-U6QRAD73.js +22 -0
- package/dist/chunk-U6QRAD73.js.map +1 -0
- package/dist/chunk-UX42PQLT.js +76 -0
- package/dist/chunk-UX42PQLT.js.map +1 -0
- package/dist/chunk-XDVS7HX7.js +100 -0
- package/dist/chunk-XDVS7HX7.js.map +1 -0
- package/dist/chunk-Y4TZA77G.js +57 -0
- package/dist/chunk-Y4TZA77G.js.map +1 -0
- package/dist/chunk-YUHS5S5Y.js +12 -0
- package/dist/chunk-YUHS5S5Y.js.map +1 -0
- package/dist/chunk-Z4PN6B2C.js +17 -0
- package/dist/chunk-Z4PN6B2C.js.map +1 -0
- package/dist/chunk-ZVDN3GRI.js +49 -0
- package/dist/chunk-ZVDN3GRI.js.map +1 -0
- package/dist/combobox.css +280 -0
- package/dist/combobox.css.map +1 -0
- package/dist/combobox.d.ts +75 -0
- package/dist/combobox.js +10 -0
- package/dist/combobox.js.map +1 -0
- package/dist/component-manifest.json +3370 -0
- package/dist/date-picker.css +267 -0
- package/dist/date-picker.css.map +1 -0
- package/dist/date-picker.d.ts +59 -0
- package/dist/date-picker.js +8 -0
- package/dist/date-picker.js.map +1 -0
- package/dist/dialog.css +62 -0
- package/dist/dialog.css.map +1 -0
- package/dist/dialog.d.ts +56 -0
- package/dist/dialog.js +3 -0
- package/dist/dialog.js.map +1 -0
- package/dist/field.css +28 -0
- package/dist/field.css.map +1 -0
- package/dist/field.d.ts +98 -0
- package/dist/field.js +5 -0
- package/dist/field.js.map +1 -0
- package/dist/floating-Bw-LN_QT.d.ts +5 -0
- package/dist/heading.css +30 -0
- package/dist/heading.css.map +1 -0
- package/dist/heading.d.ts +316 -0
- package/dist/heading.js +4 -0
- package/dist/heading.js.map +1 -0
- package/dist/icon-button.css +177 -0
- package/dist/icon-button.css.map +1 -0
- package/dist/icon-button.d.ts +29 -0
- package/dist/icon-button.js +9 -0
- package/dist/icon-button.js.map +1 -0
- package/dist/icon.css +25 -0
- package/dist/icon.css.map +1 -0
- package/dist/icon.d.ts +33 -0
- package/dist/icon.js +4 -0
- package/dist/icon.js.map +1 -0
- package/dist/index.css +2345 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/inline.css +63 -0
- package/dist/inline.css.map +1 -0
- package/dist/inline.d.ts +322 -0
- package/dist/inline.js +4 -0
- package/dist/inline.js.map +1 -0
- package/dist/listbox.css +95 -0
- package/dist/listbox.css.map +1 -0
- package/dist/listbox.d.ts +47 -0
- package/dist/listbox.js +7 -0
- package/dist/listbox.js.map +1 -0
- package/dist/menu.css +102 -0
- package/dist/menu.css.map +1 -0
- package/dist/menu.d.ts +76 -0
- package/dist/menu.js +9 -0
- package/dist/menu.js.map +1 -0
- package/dist/pagination.css +212 -0
- package/dist/pagination.css.map +1 -0
- package/dist/pagination.d.ts +52 -0
- package/dist/pagination.js +10 -0
- package/dist/pagination.js.map +1 -0
- package/dist/picker.css +209 -0
- package/dist/picker.css.map +1 -0
- package/dist/picker.d.ts +57 -0
- package/dist/picker.js +8 -0
- package/dist/picker.js.map +1 -0
- package/dist/popover.css +48 -0
- package/dist/popover.css.map +1 -0
- package/dist/popover.d.ts +68 -0
- package/dist/popover.js +7 -0
- package/dist/popover.js.map +1 -0
- package/dist/progress.css +83 -0
- package/dist/progress.css.map +1 -0
- package/dist/progress.d.ts +40 -0
- package/dist/progress.js +5 -0
- package/dist/progress.js.map +1 -0
- package/dist/radio.css +107 -0
- package/dist/radio.css.map +1 -0
- package/dist/radio.d.ts +68 -0
- package/dist/radio.js +6 -0
- package/dist/radio.js.map +1 -0
- package/dist/select.css +98 -0
- package/dist/select.css.map +1 -0
- package/dist/select.d.ts +39 -0
- package/dist/select.js +6 -0
- package/dist/select.js.map +1 -0
- package/dist/skeleton.css +59 -0
- package/dist/skeleton.css.map +1 -0
- package/dist/skeleton.d.ts +34 -0
- package/dist/skeleton.js +4 -0
- package/dist/skeleton.js.map +1 -0
- package/dist/slider.css +126 -0
- package/dist/slider.css.map +1 -0
- package/dist/slider.d.ts +61 -0
- package/dist/slider.js +5 -0
- package/dist/slider.js.map +1 -0
- package/dist/spinner.css +60 -0
- package/dist/spinner.css.map +1 -0
- package/dist/spinner.d.ts +34 -0
- package/dist/spinner.js +5 -0
- package/dist/spinner.js.map +1 -0
- package/dist/stack.css +60 -0
- package/dist/stack.css.map +1 -0
- package/dist/stack.d.ts +319 -0
- package/dist/stack.js +4 -0
- package/dist/stack.js.map +1 -0
- package/dist/switch.css +97 -0
- package/dist/switch.css.map +1 -0
- package/dist/switch.d.ts +35 -0
- package/dist/switch.js +7 -0
- package/dist/switch.js.map +1 -0
- package/dist/table.css +188 -0
- package/dist/table.css.map +1 -0
- package/dist/table.d.ts +137 -0
- package/dist/table.js +6 -0
- package/dist/table.js.map +1 -0
- package/dist/tabs.css +75 -0
- package/dist/tabs.css.map +1 -0
- package/dist/tabs.d.ts +73 -0
- package/dist/tabs.js +5 -0
- package/dist/tabs.js.map +1 -0
- package/dist/text-field.css +75 -0
- package/dist/text-field.css.map +1 -0
- package/dist/text-field.d.ts +43 -0
- package/dist/text-field.js +6 -0
- package/dist/text-field.js.map +1 -0
- package/dist/text.css +53 -0
- package/dist/text.css.map +1 -0
- package/dist/text.d.ts +331 -0
- package/dist/text.js +4 -0
- package/dist/text.js.map +1 -0
- package/dist/textarea.css +84 -0
- package/dist/textarea.css.map +1 -0
- package/dist/textarea.d.ts +40 -0
- package/dist/textarea.js +6 -0
- package/dist/textarea.js.map +1 -0
- package/dist/toast.css +300 -0
- package/dist/toast.css.map +1 -0
- package/dist/toast.d.ts +60 -0
- package/dist/toast.js +11 -0
- package/dist/toast.js.map +1 -0
- package/dist/tooltip.css +36 -0
- package/dist/tooltip.css.map +1 -0
- package/dist/tooltip.d.ts +34 -0
- package/dist/tooltip.js +5 -0
- package/dist/tooltip.js.map +1 -0
- package/dist/visually-hidden.css +15 -0
- package/dist/visually-hidden.css.map +1 -0
- package/dist/visually-hidden.d.ts +308 -0
- package/dist/visually-hidden.js +4 -0
- package/dist/visually-hidden.js.map +1 -0
- package/package.json +261 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { Field, useField } from './chunk-2PXTVZ7H.js';
|
|
2
|
+
import { classes } from './chunk-MI4QUKQS.js';
|
|
3
|
+
import { createContext, useId, useState, useCallback, useContext } from 'react';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
// src/radio/Radio.module.css
|
|
7
|
+
var Radio_default = {
|
|
8
|
+
group: "Radio_group",
|
|
9
|
+
items: "Radio_items",
|
|
10
|
+
radio: "Radio_radio",
|
|
11
|
+
label: "Radio_label",
|
|
12
|
+
input: "Radio_input"
|
|
13
|
+
};
|
|
14
|
+
var RadioGroupContext = createContext(null);
|
|
15
|
+
function RadioGroup({
|
|
16
|
+
label,
|
|
17
|
+
description,
|
|
18
|
+
error,
|
|
19
|
+
name,
|
|
20
|
+
value,
|
|
21
|
+
defaultValue,
|
|
22
|
+
onValueChange,
|
|
23
|
+
orientation = "vertical",
|
|
24
|
+
size = "md",
|
|
25
|
+
disabled = false,
|
|
26
|
+
required = false,
|
|
27
|
+
id,
|
|
28
|
+
className,
|
|
29
|
+
ref,
|
|
30
|
+
children,
|
|
31
|
+
...rest
|
|
32
|
+
}) {
|
|
33
|
+
const autoName = useId();
|
|
34
|
+
const [uncontrolled, setUncontrolled] = useState(defaultValue);
|
|
35
|
+
const controlled = value !== void 0;
|
|
36
|
+
const current = controlled ? value : uncontrolled;
|
|
37
|
+
const setValue = useCallback(
|
|
38
|
+
(next) => {
|
|
39
|
+
if (!controlled) setUncontrolled(next);
|
|
40
|
+
onValueChange?.(next);
|
|
41
|
+
},
|
|
42
|
+
[controlled, onValueChange]
|
|
43
|
+
);
|
|
44
|
+
const invalid = error !== void 0 && error !== null && error !== false && error !== "";
|
|
45
|
+
return /* @__PURE__ */ jsx(RadioGroupContext.Provider, { value: { name: name ?? autoName, value: current, setValue, size }, children: /* @__PURE__ */ jsxs(Field, { id, invalid, disabled, required, className: classes(Radio_default.group, className), "data-size": size, children: [
|
|
46
|
+
/* @__PURE__ */ jsx(Field.Label, { as: "span", children: label }),
|
|
47
|
+
/* @__PURE__ */ jsx(RadioGroupItems, { ...rest, ref, orientation, children }),
|
|
48
|
+
description && /* @__PURE__ */ jsx(Field.Description, { children: description }),
|
|
49
|
+
invalid && /* @__PURE__ */ jsx(Field.Error, { children: error })
|
|
50
|
+
] }) });
|
|
51
|
+
}
|
|
52
|
+
function RadioGroupItems({ orientation, className, ref, children, ...rest }) {
|
|
53
|
+
const field = useField();
|
|
54
|
+
return /* @__PURE__ */ jsx(
|
|
55
|
+
"div",
|
|
56
|
+
{
|
|
57
|
+
...rest,
|
|
58
|
+
ref,
|
|
59
|
+
id: field.id,
|
|
60
|
+
role: "radiogroup",
|
|
61
|
+
"aria-labelledby": field.labelId,
|
|
62
|
+
"aria-describedby": field.describedBy,
|
|
63
|
+
"aria-invalid": field.invalid || void 0,
|
|
64
|
+
"aria-required": field.required || void 0,
|
|
65
|
+
className: classes(Radio_default.items, className),
|
|
66
|
+
"data-orientation": orientation,
|
|
67
|
+
children
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
function Radio({ value, label, disabled, className, ref, ...rest }) {
|
|
72
|
+
const group = useContext(RadioGroupContext);
|
|
73
|
+
const field = useField();
|
|
74
|
+
if (!group) throw new Error("Radio must be rendered inside <RadioGroup>");
|
|
75
|
+
const checked = group.value === value;
|
|
76
|
+
return /* @__PURE__ */ jsxs("label", { className: classes(Radio_default.radio, className), "data-checked": checked ? "" : void 0, "data-disabled": disabled || field.disabled ? "" : void 0, children: [
|
|
77
|
+
/* @__PURE__ */ jsx(
|
|
78
|
+
"input",
|
|
79
|
+
{
|
|
80
|
+
...rest,
|
|
81
|
+
ref,
|
|
82
|
+
type: "radio",
|
|
83
|
+
className: Radio_default.input,
|
|
84
|
+
name: group.name,
|
|
85
|
+
value,
|
|
86
|
+
checked,
|
|
87
|
+
onChange: () => group.setValue(value),
|
|
88
|
+
disabled: disabled || field.disabled,
|
|
89
|
+
required: field.required
|
|
90
|
+
}
|
|
91
|
+
),
|
|
92
|
+
/* @__PURE__ */ jsx("span", { className: Radio_default.label, children: label })
|
|
93
|
+
] });
|
|
94
|
+
}
|
|
95
|
+
RadioGroup.displayName = "RadioGroup";
|
|
96
|
+
Radio.displayName = "Radio";
|
|
97
|
+
|
|
98
|
+
export { Radio, RadioGroup };
|
|
99
|
+
//# sourceMappingURL=chunk-XDVS7HX7.js.map
|
|
100
|
+
//# sourceMappingURL=chunk-XDVS7HX7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/radio/Radio.module.css","../src/radio/Radio.tsx"],"names":["group","items","radio","label","input"],"mappings":"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","file":"chunk-XDVS7HX7.js","sourcesContent":["/* Every value is a token (--radio-*). The input draws itself; the dot is its ::after. */\n\n@layer components {\n .group {\n --_size: var(--radio-size-md);\n --_border: var(--radio-border);\n\n font-family: var(--font-family-body);\n\n &[data-size=\"sm\"] { --_size: var(--radio-size-sm); }\n &[data-size=\"lg\"] { --_size: var(--radio-size-lg); }\n &[data-invalid] { --_border: var(--radio-border-invalid); }\n }\n\n .items {\n display: flex;\n flex-direction: column;\n gap: var(--radio-group-gap);\n\n &[data-orientation=\"horizontal\"] {\n flex-flow: row wrap;\n gap: var(--radio-group-gap) var(--space-4);\n }\n }\n\n .radio {\n display: inline-flex;\n align-items: center;\n gap: var(--radio-gap);\n cursor: pointer;\n\n &[data-disabled] {\n cursor: not-allowed;\n }\n }\n\n .label {\n font-size: var(--field-label-font-size);\n color: var(--field-label-fg);\n }\n\n .input {\n display: grid;\n flex: none;\n place-content: center;\n inline-size: var(--_size);\n block-size: var(--_size);\n margin: 0;\n border: var(--size-hairline) solid var(--_border);\n border-radius: var(--radio-radius);\n background-color: var(--radio-bg);\n appearance: none;\n cursor: inherit;\n transition: border-color var(--radio-motion-duration) var(--motion-easing-standard);\n\n /* Sized from the box, not in percent: a grid item's percentage resolves against an auto area and collapses. */\n &::after {\n content: \"\";\n inline-size: calc(var(--_size) / 2);\n block-size: calc(var(--_size) / 2);\n border-radius: var(--radio-radius);\n background-color: var(--radio-dot);\n scale: 0;\n transition: scale var(--radio-motion-duration) var(--motion-easing-standard);\n }\n\n &:checked {\n border-color: var(--radio-border-checked);\n\n &::after {\n scale: 1;\n }\n }\n\n &:focus-visible {\n outline: var(--radio-focus-ring-width) solid var(--radio-focus-ring);\n outline-offset: var(--radio-focus-ring-offset);\n }\n\n &:disabled {\n opacity: 0.55;\n }\n\n &:hover:not(:disabled, :checked) {\n border-color: var(--radio-border-hover);\n }\n }\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useId,\n useState,\n type HTMLAttributes,\n type InputHTMLAttributes,\n type ReactNode,\n type Ref,\n} from 'react';\nimport { Field, useField } from '../field';\nimport { classes } from '../internal/classes';\nimport styles from './Radio.module.css';\n\nexport type RadioSize = 'sm' | 'md' | 'lg';\nexport type RadioGroupOrientation = 'vertical' | 'horizontal';\n\ninterface RadioGroupContextValue {\n name: string;\n value: string | undefined;\n setValue: (value: string) => void;\n size: RadioSize;\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null);\n\nexport interface RadioGroupProps extends Omit<HTMLAttributes<HTMLDivElement>, 'defaultValue' | 'onChange'> {\n /** Visible group label. */\n label: ReactNode;\n description?: ReactNode;\n error?: ReactNode;\n /** Form field name shared by the radios. Generated when omitted. */\n name?: string;\n /** Controlled selected value. */\n value?: string;\n /** Initially selected value when uncontrolled. */\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n /** @default 'vertical' */\n orientation?: RadioGroupOrientation;\n /** @default 'md' */\n size?: RadioSize;\n disabled?: boolean;\n required?: boolean;\n ref?: Ref<HTMLDivElement>;\n children: ReactNode;\n}\n\n/**\n * A set of native radios under one label. The group is labelled by\n * reference (`aria-labelledby`) and described through Field, so description\n * and error apply to the whole set. Keyboard is the browser's own: arrows\n * move and select within the group. Controlled or uncontrolled by `value`.\n *\n * @status stable\n * @category Forms\n * @accessibility A `radiogroup` labelled by reference through Field and described by its description and error. Native radios: arrows move and select within the group, Tab leaves it.\n * @do Use it for two to five exclusive options that should all be visible.\n * @dont Preselect a consequential choice; leave the group empty and mark it required.\n */\nexport function RadioGroup({\n label,\n description,\n error,\n name,\n value,\n defaultValue,\n onValueChange,\n orientation = 'vertical',\n size = 'md',\n disabled = false,\n required = false,\n id,\n className,\n ref,\n children,\n ...rest\n}: RadioGroupProps) {\n const autoName = useId();\n const [uncontrolled, setUncontrolled] = useState(defaultValue);\n const controlled = value !== undefined;\n const current = controlled ? value : uncontrolled;\n const setValue = useCallback(\n (next: string) => {\n if (!controlled) setUncontrolled(next);\n onValueChange?.(next);\n },\n [controlled, onValueChange],\n );\n const invalid = error !== undefined && error !== null && error !== false && error !== '';\n\n return (\n <RadioGroupContext.Provider value={{ name: name ?? autoName, value: current, setValue, size }}>\n <Field id={id} invalid={invalid} disabled={disabled} required={required} className={classes(styles.group, className)} data-size={size}>\n <Field.Label as=\"span\">{label}</Field.Label>\n <RadioGroupItems {...rest} ref={ref} orientation={orientation}>\n {children}\n </RadioGroupItems>\n {description && <Field.Description>{description}</Field.Description>}\n {invalid && <Field.Error>{error}</Field.Error>}\n </Field>\n </RadioGroupContext.Provider>\n );\n}\n\ninterface RadioGroupItemsProps extends HTMLAttributes<HTMLDivElement> {\n orientation: RadioGroupOrientation;\n ref?: Ref<HTMLDivElement>;\n children: ReactNode;\n}\n\nfunction RadioGroupItems({ orientation, className, ref, children, ...rest }: RadioGroupItemsProps) {\n const field = useField();\n return (\n <div\n {...rest}\n ref={ref}\n id={field.id}\n role=\"radiogroup\"\n aria-labelledby={field.labelId}\n aria-describedby={field.describedBy}\n aria-invalid={field.invalid || undefined}\n aria-required={field.required || undefined}\n className={classes(styles.items, className)}\n data-orientation={orientation}\n >\n {children}\n </div>\n );\n}\n\nexport interface RadioProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type' | 'value' | 'name' | 'checked' | 'defaultChecked' | 'onChange'> {\n /** The value this radio contributes to the group. */\n value: string;\n /** Visible label beside the radio. */\n label: ReactNode;\n /** The `<input>` element. */\n ref?: Ref<HTMLInputElement>;\n /** Applied to the wrapping label, not the input. */\n className?: string;\n}\n\n/** One option of a RadioGroup. Must be rendered inside `RadioGroup`. */\n/**\n * One option of a RadioGroup: a native radio with its own visible label.\n *\n * @status stable\n * @category Forms\n * @accessibility A native `input type=\"radio\"` labelled by its visible text; the group semantics, description and error come from RadioGroup.\n * @do Render it only inside RadioGroup.\n * @dont Disable a single radio without saying why in its label or the group description.\n */\nexport function Radio({ value, label, disabled, className, ref, ...rest }: RadioProps) {\n const group = useContext(RadioGroupContext);\n const field = useField();\n if (!group) throw new Error('Radio must be rendered inside <RadioGroup>');\n const checked = group.value === value;\n return (\n <label className={classes(styles.radio, className)} data-checked={checked ? '' : undefined} data-disabled={disabled || field.disabled ? '' : undefined}>\n <input\n {...rest}\n ref={ref}\n type=\"radio\"\n className={styles.input}\n name={group.name}\n value={value}\n checked={checked}\n onChange={() => group.setValue(value)}\n disabled={disabled || field.disabled}\n required={field.required}\n />\n <span className={styles.label}>{label}</span>\n </label>\n );\n}\n\nRadioGroup.displayName = 'RadioGroup';\nRadio.displayName = 'Radio';\n"]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { useFloatingPosition } from './chunk-U6QRAD73.js';
|
|
2
|
+
import { renderAsChild } from './chunk-ZVDN3GRI.js';
|
|
3
|
+
import { useId, useState, useRef, useCallback, useEffect } from 'react';
|
|
4
|
+
import { createPortal } from 'react-dom';
|
|
5
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
// src/tooltip/Tooltip.module.css
|
|
8
|
+
var Tooltip_default = {
|
|
9
|
+
tooltip: "Tooltip_tooltip"};
|
|
10
|
+
function Tooltip({ content, placement = "top", delay = 300, children }) {
|
|
11
|
+
const id = useId();
|
|
12
|
+
const [open, setOpen] = useState(false);
|
|
13
|
+
const timer = useRef(void 0);
|
|
14
|
+
const { refs, positionStyle, placement: resolved } = useFloatingPosition({ open, placement });
|
|
15
|
+
const show = useCallback(
|
|
16
|
+
(wait) => {
|
|
17
|
+
clearTimeout(timer.current);
|
|
18
|
+
if (wait === 0) setOpen(true);
|
|
19
|
+
else timer.current = setTimeout(() => setOpen(true), wait);
|
|
20
|
+
},
|
|
21
|
+
[]
|
|
22
|
+
);
|
|
23
|
+
const hide = useCallback(() => {
|
|
24
|
+
clearTimeout(timer.current);
|
|
25
|
+
setOpen(false);
|
|
26
|
+
}, []);
|
|
27
|
+
useEffect(() => () => clearTimeout(timer.current), []);
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
if (!open) return;
|
|
30
|
+
const onKeyDown = (event) => {
|
|
31
|
+
if (event.key === "Escape") hide();
|
|
32
|
+
};
|
|
33
|
+
document.addEventListener("keydown", onKeyDown);
|
|
34
|
+
return () => document.removeEventListener("keydown", onKeyDown);
|
|
35
|
+
}, [open, hide]);
|
|
36
|
+
const trigger = renderAsChild("Tooltip", children, {
|
|
37
|
+
ref: refs.setReference,
|
|
38
|
+
onMouseEnter: () => show(delay),
|
|
39
|
+
onMouseLeave: hide,
|
|
40
|
+
onFocus: () => show(0),
|
|
41
|
+
onBlur: hide,
|
|
42
|
+
"aria-describedby": open ? id : void 0
|
|
43
|
+
});
|
|
44
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
45
|
+
trigger,
|
|
46
|
+
open && createPortal(
|
|
47
|
+
// eslint-disable-next-line react/forbid-dom-props -- per-instance position (--_x/--_y), see internal/floating.ts
|
|
48
|
+
/* @__PURE__ */ jsx("div", { ref: refs.setFloating, id, role: "tooltip", className: Tooltip_default.tooltip, "data-placement": resolved, style: positionStyle, children: content }),
|
|
49
|
+
document.body
|
|
50
|
+
)
|
|
51
|
+
] });
|
|
52
|
+
}
|
|
53
|
+
Tooltip.displayName = "Tooltip";
|
|
54
|
+
|
|
55
|
+
export { Tooltip };
|
|
56
|
+
//# sourceMappingURL=chunk-Y4TZA77G.js.map
|
|
57
|
+
//# sourceMappingURL=chunk-Y4TZA77G.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tooltip/Tooltip.module.css","../src/tooltip/Tooltip.tsx"],"names":["tooltip"],"mappings":";;;;;;;AAAA,IAAA,eAAA,GAAA;AAAA,EAGG,OAAA,EAAAA,iBAkBY,CAAA;ACUR,SAAS,OAAA,CAAQ,EAAE,OAAA,EAAS,SAAA,GAAY,OAAO,KAAA,GAAQ,GAAA,EAAK,UAAS,EAAiB;AAC3F,EAAA,MAAM,KAAK,KAAA,EAAM;AACjB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,OAAsC,MAAS,CAAA;AAC7D,EAAA,MAAM,EAAE,IAAA,EAAM,aAAA,EAAe,SAAA,EAAW,QAAA,KAAa,mBAAA,CAAoB,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA;AAE5F,EAAA,MAAM,IAAA,GAAO,WAAA;AAAA,IACX,CAAC,IAAA,KAAiB;AAChB,MAAA,YAAA,CAAa,MAAM,OAAO,CAAA;AAC1B,MAAA,IAAI,IAAA,KAAS,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA;AAAA,iBACjB,OAAA,GAAU,UAAA,CAAW,MAAM,OAAA,CAAQ,IAAI,GAAG,IAAI,CAAA;AAAA,IAC3D,CAAA;AAAA,IACA;AAAC,GACH;AACA,EAAA,MAAM,IAAA,GAAO,YAAY,MAAM;AAC7B,IAAA,YAAA,CAAa,MAAM,OAAO,CAAA;AAC1B,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM,MAAM,YAAA,CAAa,MAAM,OAAO,CAAA,EAAG,EAAE,CAAA;AACrD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAyB;AAC1C,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU,IAAA,EAAK;AAAA,IACnC,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,SAAS,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AAIf,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,SAAA,EAAW,QAAA,EAAU;AAAA,IACjD,KAAK,IAAA,CAAK,YAAA;AAAA,IACV,YAAA,EAAc,MAAM,IAAA,CAAK,KAAK,CAAA;AAAA,IAC9B,YAAA,EAAc,IAAA;AAAA,IACd,OAAA,EAAS,MAAM,IAAA,CAAK,CAAC,CAAA;AAAA,IACrB,MAAA,EAAQ,IAAA;AAAA,IACR,kBAAA,EAAoB,OAAO,EAAA,GAAK;AAAA,GACjC,CAAA;AAED,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,OAAA;AAAA,IACA,IAAA,IACC,YAAA;AAAA;AAAA,sBAEE,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,IAAA,CAAK,aAAa,EAAA,EAAQ,IAAA,EAAK,SAAA,EAAU,SAAA,EAAW,gBAAO,OAAA,EAAS,gBAAA,EAAgB,QAAA,EAAU,KAAA,EAAO,eAC5G,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,MACA,QAAA,CAAS;AAAA;AACX,GAAA,EACJ,CAAA;AAEJ;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA","file":"chunk-Y4TZA77G.js","sourcesContent":["/* Every value is a token (--tooltip-*). Position comes in as --_x/--_y from the floating hook. */\n\n@layer components {\n .tooltip {\n --_gap: var(--tooltip-gap);\n\n position: fixed;\n z-index: var(--tooltip-layer);\n inset-block-start: var(--_y);\n inset-inline-start: var(--_x);\n max-inline-size: var(--tooltip-max-width);\n padding-block: var(--tooltip-padding-block);\n padding-inline: var(--tooltip-padding-inline);\n border-radius: var(--tooltip-radius);\n background-color: var(--tooltip-bg);\n color: var(--tooltip-fg);\n font-family: var(--font-family-body);\n font-size: var(--tooltip-font-size);\n line-height: var(--font-line-height-normal);\n box-shadow: var(--tooltip-shadow);\n pointer-events: none;\n animation: fade var(--tooltip-duration) var(--motion-easing-standard);\n }\n\n @keyframes fade {\n from {\n opacity: 0;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .tooltip {\n animation: none;\n }\n }\n}\n","import { useCallback, useEffect, useId, useRef, useState, type ReactElement, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { renderAsChild } from '../internal/asChild';\nimport { useFloatingPosition, type FloatingPlacement } from '../internal/floating';\nimport styles from './Tooltip.module.css';\n\nexport type TooltipPlacement = FloatingPlacement;\n\nexport interface TooltipProps {\n /** The tooltip text. Supplementary only: it must not be the control's only name. */\n content: ReactNode;\n /** Preferred side; flips when there is no room. @default 'top' */\n placement?: TooltipPlacement;\n /** Hover delay in milliseconds. Focus shows immediately. @default 300 */\n delay?: number;\n /** The single element that owns the tooltip; it receives the hover, focus and `aria-describedby` wiring. */\n children: ReactElement;\n}\n\n/**\n * A short description shown on hover or focus and linked with\n * `aria-describedby` while visible. Never the only name of a control: use it\n * for extra detail, and give icon-only controls a real label. Escape hides it.\n *\n * @status stable\n * @category Overlays\n * @accessibility Shown on hover after a delay and on focus immediately; the trigger gets `aria-describedby` pointing at the `tooltip` while it is visible; Escape hides it. It is a description, never a name.\n * @do Use it for extra detail on controls that already have a name.\n * @dont Put interactive content in it.\n * Use it to name an icon-only control; use IconButton's `label`.\n */\nexport function Tooltip({ content, placement = 'top', delay = 300, children }: TooltipProps) {\n const id = useId();\n const [open, setOpen] = useState(false);\n const timer = useRef<ReturnType<typeof setTimeout>>(undefined);\n const { refs, positionStyle, placement: resolved } = useFloatingPosition({ open, placement });\n\n const show = useCallback(\n (wait: number) => {\n clearTimeout(timer.current);\n if (wait === 0) setOpen(true);\n else timer.current = setTimeout(() => setOpen(true), wait);\n },\n [],\n );\n const hide = useCallback(() => {\n clearTimeout(timer.current);\n setOpen(false);\n }, []);\n\n useEffect(() => () => clearTimeout(timer.current), []);\n useEffect(() => {\n if (!open) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') hide();\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [open, hide]);\n\n // The helper merges these handlers with the child's own and forwards the ref.\n // eslint-disable-next-line react-hooks/refs -- forwarded to the reference element, not read\n const trigger = renderAsChild('Tooltip', children, {\n ref: refs.setReference,\n onMouseEnter: () => show(delay),\n onMouseLeave: hide,\n onFocus: () => show(0),\n onBlur: hide,\n 'aria-describedby': open ? id : undefined,\n });\n\n return (\n <>\n {trigger}\n {open &&\n createPortal(\n // eslint-disable-next-line react/forbid-dom-props -- per-instance position (--_x/--_y), see internal/floating.ts\n <div ref={refs.setFloating} id={id} role=\"tooltip\" className={styles.tooltip} data-placement={resolved} style={positionStyle}>\n {content}\n </div>,\n document.body,\n )}\n </>\n );\n}\n\nTooltip.displayName = 'Tooltip';\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// src/internal/AriaField.module.css
|
|
2
|
+
var AriaField_default = {
|
|
3
|
+
field: "AriaField_field",
|
|
4
|
+
label: "AriaField_label",
|
|
5
|
+
required: "AriaField_required",
|
|
6
|
+
description: "AriaField_description",
|
|
7
|
+
error: "AriaField_error"
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export { AriaField_default };
|
|
11
|
+
//# sourceMappingURL=chunk-YUHS5S5Y.js.map
|
|
12
|
+
//# sourceMappingURL=chunk-YUHS5S5Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/internal/AriaField.module.css"],"names":["field","label","required","description","error"],"mappings":";AAAA,IAAA,iBAAA,GAAA;AAAA,EAGG,KAAA,EAAAA,iBAAAA;AAAA,EAOA,KAAA,EAAAC,iBAAAA;AAAA,EAMA,QAAA,EAAAC,oBAAAA;AAAA,EAKA,WAAA,EAAAC,uBAAAA;AAAA,EAMA,KAAA,EAAAC;AAAA","file":"chunk-YUHS5S5Y.js","sourcesContent":["/* The same --field-* tokens Field reads, on React Aria's label, description and error parts. */\n\n@layer components {\n .field {\n display: flex;\n flex-direction: column;\n gap: var(--field-gap);\n font-family: var(--font-family-body);\n }\n\n .label {\n font-size: var(--field-label-font-size);\n font-weight: var(--field-label-font-weight);\n color: var(--field-label-fg);\n }\n\n .required {\n margin-inline-start: var(--field-required-gap);\n color: var(--field-required-fg);\n }\n\n .description {\n margin: 0;\n font-size: var(--field-description-font-size);\n color: var(--field-description-fg);\n }\n\n .error {\n margin: 0;\n font-size: var(--field-error-font-size);\n color: var(--field-error-fg);\n }\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { classes } from './chunk-MI4QUKQS.js';
|
|
2
|
+
import { createElement } from 'react';
|
|
3
|
+
|
|
4
|
+
// src/visually-hidden/VisuallyHidden.module.css
|
|
5
|
+
var VisuallyHidden_default = {
|
|
6
|
+
root: "VisuallyHidden_root"
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
// src/visually-hidden/VisuallyHidden.tsx
|
|
10
|
+
function VisuallyHidden({ as = "span", className, ref, children, ...rest }) {
|
|
11
|
+
return createElement(as, { ...rest, ref, className: classes(VisuallyHidden_default.root, className) }, children);
|
|
12
|
+
}
|
|
13
|
+
VisuallyHidden.displayName = "VisuallyHidden";
|
|
14
|
+
|
|
15
|
+
export { VisuallyHidden };
|
|
16
|
+
//# sourceMappingURL=chunk-Z4PN6B2C.js.map
|
|
17
|
+
//# sourceMappingURL=chunk-Z4PN6B2C.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/visually-hidden/VisuallyHidden.module.css","../src/visually-hidden/VisuallyHidden.tsx"],"names":["root"],"mappings":";;;;AAAA,IAAA,sBAAA,GAAA;AAAA,EAGG,IAAA,EAAAA;AAAA,CAAA;;;ACoBI,SAAS,cAAA,CAAe,EAAE,EAAA,GAAK,MAAA,EAAQ,WAAW,GAAA,EAAK,QAAA,EAAU,GAAG,IAAA,EAAK,EAAwB;AACtG,EAAA,OAAO,aAAA,CAAc,EAAA,EAAI,EAAE,GAAG,IAAA,EAAM,GAAA,EAAK,SAAA,EAAW,OAAA,CAAQ,sBAAA,CAAO,IAAA,EAAM,SAAS,CAAA,IAAK,QAAQ,CAAA;AACjG;AAEA,cAAA,CAAe,WAAA,GAAc,gBAAA","file":"chunk-Z4PN6B2C.js","sourcesContent":["/* The clip-path technique: present in the accessibility tree, absent from the layout. */\n\n@layer components {\n .root {\n position: absolute;\n inline-size: var(--visually-hidden-size);\n block-size: var(--visually-hidden-size);\n padding: 0;\n margin: 0;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n }\n}\n","import { createElement, type HTMLAttributes, type ReactNode, type Ref } from 'react';\nimport { classes } from '../internal/classes';\nimport styles from './VisuallyHidden.module.css';\n\nexport interface VisuallyHiddenProps extends HTMLAttributes<HTMLElement> {\n /** @default 'span' */\n as?: 'span' | 'div';\n ref?: Ref<HTMLElement>;\n children: ReactNode;\n}\n\n/**\n * Content for assistive technology only: read by screen readers, invisible\n * on screen, still in the accessibility tree (unlike `display: none`). Use\n * it to give icon-only controls a name or to add context a sighted user\n * gets from layout.\n *\n * @status stable\n * @category Utilities\n * @accessibility In the accessibility tree, out of the layout (clip-path, not `display: none`).\n * @do Use it for context a sighted user gets from layout (\"Sort by\", \"Step 2 of 4\").\n * @dont Hide instructions that sighted users also need.\n */\nexport function VisuallyHidden({ as = 'span', className, ref, children, ...rest }: VisuallyHiddenProps) {\n return createElement(as, { ...rest, ref, className: classes(styles.root, className) }, children);\n}\n\nVisuallyHidden.displayName = 'VisuallyHidden';\n"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { isValidElement, cloneElement } from 'react';
|
|
2
|
+
|
|
3
|
+
// src/internal/asChild.ts
|
|
4
|
+
function mergeRefs(...refs) {
|
|
5
|
+
return (value) => {
|
|
6
|
+
for (const ref of refs) {
|
|
7
|
+
if (typeof ref === "function") {
|
|
8
|
+
ref(value);
|
|
9
|
+
} else if (ref && typeof ref === "object") {
|
|
10
|
+
ref.current = value;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function renderAsChild(displayName, children, props, options = {}) {
|
|
16
|
+
if (!isValidElement(children)) {
|
|
17
|
+
throw new Error(`${displayName}: asChild requires a single valid React element as children`);
|
|
18
|
+
}
|
|
19
|
+
const child = children;
|
|
20
|
+
const childProps = child.props;
|
|
21
|
+
const { ref, ...ours } = props;
|
|
22
|
+
const merged = { ...ours };
|
|
23
|
+
if (typeof props.className === "string" || typeof childProps.className === "string") {
|
|
24
|
+
merged.className = [childProps.className, props.className].filter(Boolean).join(" ");
|
|
25
|
+
}
|
|
26
|
+
for (const [key, handler] of Object.entries(ours)) {
|
|
27
|
+
if (!key.startsWith("on") || typeof handler !== "function") continue;
|
|
28
|
+
if (options.replace?.includes(key)) continue;
|
|
29
|
+
const theirs = childProps[key];
|
|
30
|
+
if (typeof theirs !== "function") continue;
|
|
31
|
+
merged[key] = (event, ...rest) => {
|
|
32
|
+
theirs(event, ...rest);
|
|
33
|
+
const prevented = event?.defaultPrevented;
|
|
34
|
+
if (!prevented) {
|
|
35
|
+
handler(event, ...rest);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (ref) {
|
|
40
|
+
merged.ref = mergeRefs(ref, childProps.ref);
|
|
41
|
+
} else if (childProps.ref) {
|
|
42
|
+
merged.ref = childProps.ref;
|
|
43
|
+
}
|
|
44
|
+
return cloneElement(child, merged);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export { renderAsChild };
|
|
48
|
+
//# sourceMappingURL=chunk-ZVDN3GRI.js.map
|
|
49
|
+
//# sourceMappingURL=chunk-ZVDN3GRI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/internal/asChild.ts"],"names":[],"mappings":";;;AAQO,SAAS,aAAgB,IAAA,EAAyC;AACvE,EAAA,OAAO,CAAC,KAAA,KAAoB;AAC1B,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,OAAO,QAAQ,UAAA,EAAY;AAC7B,QAAA,GAAA,CAAI,KAAK,CAAA;AAAA,MACX,CAAA,MAAA,IAAW,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACzC,QAAC,IAA8B,OAAA,GAAU,KAAA;AAAA,MAC3C;AAAA,IACF;AAAA,EACF,CAAA;AACF;AA0BO,SAAS,cACd,WAAA,EACA,QAAA,EACA,KAAA,EACA,OAAA,GAA0B,EAAC,EACb;AACd,EAAA,IAAI,CAAC,cAAA,CAAe,QAAQ,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,WAAW,CAAA,2DAAA,CAA6D,CAAA;AAAA,EAC7F;AAEA,EAAA,MAAM,KAAA,GAAQ,QAAA;AACd,EAAA,MAAM,aAAa,KAAA,CAAM,KAAA;AAEzB,EAAA,MAAM,EAAE,GAAA,EAAK,GAAG,IAAA,EAAK,GAAI,KAAA;AACzB,EAAA,MAAM,MAAA,GAAuB,EAAE,GAAG,IAAA,EAAK;AAEvC,EAAA,IAAI,OAAO,KAAA,CAAM,SAAA,KAAc,YAAY,OAAO,UAAA,CAAW,cAAc,QAAA,EAAU;AACnF,IAAA,MAAA,CAAO,SAAA,GAAY,CAAC,UAAA,CAAW,SAAA,EAAW,KAAA,CAAM,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,EACrF;AAEA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACjD,IAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,IAAK,OAAO,YAAY,UAAA,EAAY;AAC5D,IAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,QAAA,CAAS,GAAG,CAAA,EAAG;AACpC,IAAA,MAAM,MAAA,GAAS,WAAW,GAAG,CAAA;AAC7B,IAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAElC,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,CAAC,KAAA,EAAA,GAAmB,IAAA,KAAoB;AACpD,MAAC,MAAA,CAAwC,KAAA,EAAO,GAAG,IAAI,CAAA;AACvD,MAAA,MAAM,YAAa,KAAA,EAAiD,gBAAA;AACpE,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAC,OAAA,CAAyC,KAAA,EAAO,GAAG,IAAI,CAAA;AAAA,MAC1D;AAAA,IACF,CAAA;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAA,CAAO,GAAA,GAAM,SAAA,CAAU,GAAA,EAAK,UAAA,CAAW,GAAG,CAAA;AAAA,EAC5C,CAAA,MAAA,IAAW,WAAW,GAAA,EAAK;AACzB,IAAA,MAAA,CAAO,MAAM,UAAA,CAAW,GAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,YAAA,CAAa,OAAO,MAAM,CAAA;AACnC","file":"chunk-ZVDN3GRI.js","sourcesContent":["import { cloneElement, isValidElement, type ReactElement, type ReactNode, type Ref } from 'react';\n\ntype UnknownProps = Record<string, unknown>;\n\n/**\n * Compose two refs into one, so a subcomponent can attach its own ref to a\n * child that already carries the consumer's.\n */\nexport function mergeRefs<T>(...refs: Array<Ref<T> | undefined>): Ref<T> {\n return (value: T | null) => {\n for (const ref of refs) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref && typeof ref === 'object') {\n (ref as { current: T | null }).current = value;\n }\n }\n };\n}\n\n/**\n * Shared implementation of the `asChild` pattern.\n *\n * Renders `children` in place of the component's own element, merging our props\n * into it rather than replacing them:\n *\n * - `className` is concatenated, the child's first.\n * - Every `on*` handler is composed: the child's runs first, and ours is skipped\n * if the child called `preventDefault()`. Passing an `onClick` to the child\n * therefore augments the behaviour instead of silently replacing it. Handlers\n * listed in `options.replace` are the exception: ours replaces the child's.\n * - Refs are merged, so a component that needs its own ref does not clobber one\n * the consumer supplied.\n *\n * @param displayName Used in the error message, e.g. 'Modal.Body'.\n */\nexport interface AsChildOptions {\n /**\n * Handlers that replace the child's instead of composing with it. Used when\n * the control is inert: a disabled control must not run the child's handler.\n */\n replace?: readonly string[];\n}\n\nexport function renderAsChild(\n displayName: string,\n children: ReactNode,\n props: UnknownProps,\n options: AsChildOptions = {},\n): ReactElement {\n if (!isValidElement(children)) {\n throw new Error(`${displayName}: asChild requires a single valid React element as children`);\n }\n\n const child = children as ReactElement<UnknownProps & { ref?: Ref<unknown> }>;\n const childProps = child.props;\n // `ref` travels inside props (React 19) and is merged, never read.\n const { ref, ...ours } = props as UnknownProps & { ref?: Ref<unknown> };\n const merged: UnknownProps = { ...ours };\n\n if (typeof props.className === 'string' || typeof childProps.className === 'string') {\n merged.className = [childProps.className, props.className].filter(Boolean).join(' ');\n }\n\n for (const [key, handler] of Object.entries(ours)) {\n if (!key.startsWith('on') || typeof handler !== 'function') continue;\n if (options.replace?.includes(key)) continue;\n const theirs = childProps[key];\n if (typeof theirs !== 'function') continue;\n\n merged[key] = (event: unknown, ...rest: unknown[]) => {\n (theirs as (...args: unknown[]) => void)(event, ...rest);\n const prevented = (event as { defaultPrevented?: boolean } | null)?.defaultPrevented;\n if (!prevented) {\n (handler as (...args: unknown[]) => void)(event, ...rest);\n }\n };\n }\n\n if (ref) {\n merged.ref = mergeRefs(ref, childProps.ref);\n } else if (childProps.ref) {\n merged.ref = childProps.ref;\n }\n\n return cloneElement(child, merged);\n}\n"]}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/* src/icon/Icon.module.css */
|
|
2
|
+
@layer components {
|
|
3
|
+
.Icon_icon {
|
|
4
|
+
display: inline-flex;
|
|
5
|
+
flex: none;
|
|
6
|
+
inline-size: 1em;
|
|
7
|
+
block-size: 1em;
|
|
8
|
+
font-size: var(--icon-size-md);
|
|
9
|
+
vertical-align: middle;
|
|
10
|
+
&[data-size=sm] {
|
|
11
|
+
font-size: var(--icon-size-sm);
|
|
12
|
+
}
|
|
13
|
+
&[data-size=lg] {
|
|
14
|
+
font-size: var(--icon-size-lg);
|
|
15
|
+
}
|
|
16
|
+
&[data-size=inherit] {
|
|
17
|
+
font-size: inherit;
|
|
18
|
+
}
|
|
19
|
+
& > * {
|
|
20
|
+
inline-size: 100%;
|
|
21
|
+
block-size: 100%;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* src/internal/AriaField.module.css */
|
|
27
|
+
@layer components {
|
|
28
|
+
.AriaField_field {
|
|
29
|
+
display: flex;
|
|
30
|
+
flex-direction: column;
|
|
31
|
+
gap: var(--field-gap);
|
|
32
|
+
font-family: var(--font-family-body);
|
|
33
|
+
}
|
|
34
|
+
.AriaField_label {
|
|
35
|
+
font-size: var(--field-label-font-size);
|
|
36
|
+
font-weight: var(--field-label-font-weight);
|
|
37
|
+
color: var(--field-label-fg);
|
|
38
|
+
}
|
|
39
|
+
.AriaField_required {
|
|
40
|
+
margin-inline-start: var(--field-required-gap);
|
|
41
|
+
color: var(--field-required-fg);
|
|
42
|
+
}
|
|
43
|
+
.AriaField_description {
|
|
44
|
+
margin: 0;
|
|
45
|
+
font-size: var(--field-description-font-size);
|
|
46
|
+
color: var(--field-description-fg);
|
|
47
|
+
}
|
|
48
|
+
.AriaField_error {
|
|
49
|
+
margin: 0;
|
|
50
|
+
font-size: var(--field-error-font-size);
|
|
51
|
+
color: var(--field-error-fg);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* src/listbox/Listbox.module.css */
|
|
56
|
+
@layer components {
|
|
57
|
+
.Listbox_list {
|
|
58
|
+
display: flex;
|
|
59
|
+
flex-direction: column;
|
|
60
|
+
max-block-size: var(--listbox-max-height);
|
|
61
|
+
padding: var(--listbox-padding);
|
|
62
|
+
overflow: auto;
|
|
63
|
+
border: var(--size-hairline) solid var(--listbox-border);
|
|
64
|
+
border-radius: var(--listbox-radius);
|
|
65
|
+
background-color: var(--listbox-bg);
|
|
66
|
+
color: var(--listbox-fg);
|
|
67
|
+
font-family: var(--listbox-font-family);
|
|
68
|
+
font-size: var(--listbox-font-size);
|
|
69
|
+
outline: none;
|
|
70
|
+
&[data-focus-visible] {
|
|
71
|
+
outline: var(--listbox-focus-ring-width) solid var(--listbox-focus-ring);
|
|
72
|
+
outline-offset: var(--listbox-focus-ring-offset);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
.Listbox_check {
|
|
76
|
+
flex: none;
|
|
77
|
+
visibility: hidden;
|
|
78
|
+
color: var(--listbox-item-check);
|
|
79
|
+
}
|
|
80
|
+
.Listbox_item {
|
|
81
|
+
display: flex;
|
|
82
|
+
align-items: center;
|
|
83
|
+
gap: var(--listbox-item-gap);
|
|
84
|
+
padding-block: var(--listbox-item-padding-block);
|
|
85
|
+
padding-inline: var(--listbox-item-padding-inline);
|
|
86
|
+
border-radius: var(--listbox-item-radius);
|
|
87
|
+
color: var(--listbox-item-fg);
|
|
88
|
+
cursor: default;
|
|
89
|
+
outline: none;
|
|
90
|
+
&[data-hovered],
|
|
91
|
+
&[data-focused] {
|
|
92
|
+
background-color: var(--listbox-item-bg-focus);
|
|
93
|
+
}
|
|
94
|
+
&[data-selected] {
|
|
95
|
+
background-color: var(--listbox-item-bg-selected);
|
|
96
|
+
.Listbox_check {
|
|
97
|
+
visibility: visible;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
&[data-disabled] {
|
|
101
|
+
color: var(--listbox-item-fg-disabled);
|
|
102
|
+
cursor: not-allowed;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
.Listbox_itemBody {
|
|
106
|
+
display: flex;
|
|
107
|
+
flex-direction: column;
|
|
108
|
+
min-inline-size: 0;
|
|
109
|
+
}
|
|
110
|
+
.Listbox_itemLabel {
|
|
111
|
+
overflow: hidden;
|
|
112
|
+
text-overflow: ellipsis;
|
|
113
|
+
white-space: nowrap;
|
|
114
|
+
}
|
|
115
|
+
.Listbox_itemDescription {
|
|
116
|
+
color: var(--listbox-item-fg-muted);
|
|
117
|
+
font-size: var(--listbox-item-description-font-size);
|
|
118
|
+
}
|
|
119
|
+
.Listbox_empty {
|
|
120
|
+
padding: var(--listbox-empty-padding);
|
|
121
|
+
color: var(--listbox-empty-fg);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/* src/visually-hidden/VisuallyHidden.module.css */
|
|
126
|
+
@layer components {
|
|
127
|
+
.VisuallyHidden_root {
|
|
128
|
+
position: absolute;
|
|
129
|
+
inline-size: var(--visually-hidden-size);
|
|
130
|
+
block-size: var(--visually-hidden-size);
|
|
131
|
+
padding: 0;
|
|
132
|
+
margin: 0;
|
|
133
|
+
overflow: hidden;
|
|
134
|
+
clip-path: inset(50%);
|
|
135
|
+
white-space: nowrap;
|
|
136
|
+
border: 0;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* src/spinner/Spinner.module.css */
|
|
141
|
+
@layer components {
|
|
142
|
+
.Spinner_spinner {
|
|
143
|
+
--_size: var(--spinner-size-md);
|
|
144
|
+
--_track: var(--spinner-track);
|
|
145
|
+
--_indicator: var(--spinner-indicator);
|
|
146
|
+
display: inline-flex;
|
|
147
|
+
flex: none;
|
|
148
|
+
inline-size: var(--_size);
|
|
149
|
+
block-size: var(--_size);
|
|
150
|
+
vertical-align: middle;
|
|
151
|
+
&[data-size=sm] {
|
|
152
|
+
--_size: var(--spinner-size-sm);
|
|
153
|
+
}
|
|
154
|
+
&[data-size=lg] {
|
|
155
|
+
--_size: var(--spinner-size-lg);
|
|
156
|
+
}
|
|
157
|
+
&[data-size=inherit] {
|
|
158
|
+
--_size: 1em;
|
|
159
|
+
}
|
|
160
|
+
&[data-tone=inherit] {
|
|
161
|
+
--_track: transparent;
|
|
162
|
+
--_indicator: currentcolor;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
.Spinner_ring {
|
|
166
|
+
inline-size: 100%;
|
|
167
|
+
block-size: 100%;
|
|
168
|
+
border: var(--spinner-width) solid var(--_track);
|
|
169
|
+
border-block-start-color: var(--_indicator);
|
|
170
|
+
border-radius: var(--radius-full);
|
|
171
|
+
animation: Spinner_spin var(--spinner-duration) linear infinite;
|
|
172
|
+
}
|
|
173
|
+
@keyframes Spinner_spin {
|
|
174
|
+
to {
|
|
175
|
+
rotate: 1turn;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
@media (prefers-reduced-motion: reduce) {
|
|
179
|
+
.Spinner_ring {
|
|
180
|
+
animation: none;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/* src/combobox/Combobox.module.css */
|
|
186
|
+
@layer components {
|
|
187
|
+
.Combobox_root {
|
|
188
|
+
--_height: var(--combobox-height-md);
|
|
189
|
+
--_font-size: var(--combobox-font-size-md);
|
|
190
|
+
--_border: var(--combobox-border-default);
|
|
191
|
+
font-family: var(--combobox-font-family);
|
|
192
|
+
&[data-size=sm] {
|
|
193
|
+
--_height: var(--combobox-height-sm);
|
|
194
|
+
--_font-size: var(--combobox-font-size-sm);
|
|
195
|
+
}
|
|
196
|
+
&[data-size=lg] {
|
|
197
|
+
--_height: var(--combobox-height-lg);
|
|
198
|
+
--_font-size: var(--combobox-font-size-lg);
|
|
199
|
+
}
|
|
200
|
+
&[data-invalid] {
|
|
201
|
+
--_border: var(--combobox-border-invalid);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
.Combobox_control {
|
|
205
|
+
display: grid;
|
|
206
|
+
align-items: center;
|
|
207
|
+
& > * {
|
|
208
|
+
grid-area: 1 / 1;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
.Combobox_input {
|
|
212
|
+
inline-size: 100%;
|
|
213
|
+
min-block-size: var(--_height);
|
|
214
|
+
padding-block: 0;
|
|
215
|
+
padding-inline: var(--combobox-padding-inline) var(--combobox-icon-size);
|
|
216
|
+
border: var(--size-hairline) solid var(--_border);
|
|
217
|
+
border-radius: var(--combobox-radius);
|
|
218
|
+
background-color: var(--combobox-bg);
|
|
219
|
+
color: var(--combobox-fg);
|
|
220
|
+
font-size: var(--_font-size);
|
|
221
|
+
transition: border-color var(--combobox-motion-duration) var(--motion-easing-standard);
|
|
222
|
+
&::placeholder {
|
|
223
|
+
color: var(--combobox-placeholder);
|
|
224
|
+
}
|
|
225
|
+
&[data-focused] {
|
|
226
|
+
border-color: var(--combobox-border-focus);
|
|
227
|
+
outline: var(--combobox-focus-ring-width) solid var(--combobox-focus-ring);
|
|
228
|
+
outline-offset: var(--combobox-focus-ring-offset);
|
|
229
|
+
}
|
|
230
|
+
&[data-disabled] {
|
|
231
|
+
cursor: not-allowed;
|
|
232
|
+
opacity: 0.55;
|
|
233
|
+
}
|
|
234
|
+
&[data-hovered]:not([data-focused], [data-disabled]) {
|
|
235
|
+
border-color: var(--combobox-border-hover);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
.Combobox_button {
|
|
239
|
+
display: grid;
|
|
240
|
+
place-items: center;
|
|
241
|
+
inline-size: var(--combobox-icon-size);
|
|
242
|
+
block-size: var(--_height);
|
|
243
|
+
padding: 0;
|
|
244
|
+
border: none;
|
|
245
|
+
border-radius: var(--combobox-radius);
|
|
246
|
+
background-color: transparent;
|
|
247
|
+
color: var(--combobox-icon);
|
|
248
|
+
justify-self: end;
|
|
249
|
+
cursor: pointer;
|
|
250
|
+
&[data-focus-visible] {
|
|
251
|
+
outline: var(--combobox-focus-ring-width) solid var(--combobox-focus-ring);
|
|
252
|
+
outline-offset: calc(-1 * var(--combobox-focus-ring-width));
|
|
253
|
+
}
|
|
254
|
+
&[data-disabled] {
|
|
255
|
+
cursor: not-allowed;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
.Combobox_popover {
|
|
259
|
+
inline-size: var(--trigger-width);
|
|
260
|
+
padding-block-start: var(--combobox-gap);
|
|
261
|
+
animation: Combobox_fade var(--combobox-popover-duration) var(--motion-easing-standard);
|
|
262
|
+
&[data-placement=top] {
|
|
263
|
+
padding-block: 0 var(--combobox-gap);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
.Combobox_list {
|
|
267
|
+
box-shadow: var(--combobox-popover-shadow);
|
|
268
|
+
}
|
|
269
|
+
@keyframes Combobox_fade {
|
|
270
|
+
from {
|
|
271
|
+
opacity: 0;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
@media (prefers-reduced-motion: reduce) {
|
|
275
|
+
.Combobox_popover {
|
|
276
|
+
animation: none;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/*# sourceMappingURL=combobox.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/icon/Icon.module.css","../src/internal/AriaField.module.css","../src/listbox/Listbox.module.css","../src/visually-hidden/VisuallyHidden.module.css","../src/spinner/Spinner.module.css","../src/combobox/Combobox.module.css"],"sourcesContent":["/* Every value is a token (--icon-*). The child SVG fills the box; colour is currentColor. */\n\n@layer components {\n .icon {\n display: inline-flex;\n flex: none;\n inline-size: 1em;\n block-size: 1em;\n font-size: var(--icon-size-md);\n vertical-align: middle;\n\n &[data-size=\"sm\"] { font-size: var(--icon-size-sm); }\n &[data-size=\"lg\"] { font-size: var(--icon-size-lg); }\n &[data-size=\"inherit\"] { font-size: inherit; }\n\n & > * {\n inline-size: 100%;\n block-size: 100%;\n }\n }\n}\n","/* The same --field-* tokens Field reads, on React Aria's label, description and error parts. */\n\n@layer components {\n .field {\n display: flex;\n flex-direction: column;\n gap: var(--field-gap);\n font-family: var(--font-family-body);\n }\n\n .label {\n font-size: var(--field-label-font-size);\n font-weight: var(--field-label-font-weight);\n color: var(--field-label-fg);\n }\n\n .required {\n margin-inline-start: var(--field-required-gap);\n color: var(--field-required-fg);\n }\n\n .description {\n margin: 0;\n font-size: var(--field-description-font-size);\n color: var(--field-description-fg);\n }\n\n .error {\n margin: 0;\n font-size: var(--field-error-font-size);\n color: var(--field-error-fg);\n }\n}\n","/*\n * Every value is a token (--listbox-*). React Aria writes the state:\n * data-focused (real or virtual focus), data-selected, data-disabled,\n * data-hovered, data-focus-visible, data-empty. The tick is in the DOM for\n * every option and revealed by data-selected.\n */\n\n@layer components {\n .list {\n display: flex;\n flex-direction: column;\n max-block-size: var(--listbox-max-height);\n padding: var(--listbox-padding);\n overflow: auto;\n border: var(--size-hairline) solid var(--listbox-border);\n border-radius: var(--listbox-radius);\n background-color: var(--listbox-bg);\n color: var(--listbox-fg);\n font-family: var(--listbox-font-family);\n font-size: var(--listbox-font-size);\n outline: none;\n\n &[data-focus-visible] {\n outline: var(--listbox-focus-ring-width) solid var(--listbox-focus-ring);\n outline-offset: var(--listbox-focus-ring-offset);\n }\n }\n\n .check {\n flex: none;\n visibility: hidden;\n color: var(--listbox-item-check);\n }\n\n .item {\n display: flex;\n align-items: center;\n gap: var(--listbox-item-gap);\n padding-block: var(--listbox-item-padding-block);\n padding-inline: var(--listbox-item-padding-inline);\n border-radius: var(--listbox-item-radius);\n color: var(--listbox-item-fg);\n cursor: default;\n outline: none;\n\n &[data-hovered],\n &[data-focused] {\n background-color: var(--listbox-item-bg-focus);\n }\n\n &[data-selected] {\n background-color: var(--listbox-item-bg-selected);\n\n .check {\n visibility: visible;\n }\n }\n\n &[data-disabled] {\n color: var(--listbox-item-fg-disabled);\n cursor: not-allowed;\n }\n }\n\n .itemBody {\n display: flex;\n flex-direction: column;\n min-inline-size: 0;\n }\n\n .itemLabel {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .itemDescription {\n color: var(--listbox-item-fg-muted);\n font-size: var(--listbox-item-description-font-size);\n }\n\n .empty {\n padding: var(--listbox-empty-padding);\n color: var(--listbox-empty-fg);\n }\n}\n","/* The clip-path technique: present in the accessibility tree, absent from the layout. */\n\n@layer components {\n .root {\n position: absolute;\n inline-size: var(--visually-hidden-size);\n block-size: var(--visually-hidden-size);\n padding: 0;\n margin: 0;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n }\n}\n","/* Every value is a token (--spinner-*). The ring is a border with one coloured side. */\n\n@layer components {\n .spinner {\n --_size: var(--spinner-size-md);\n --_track: var(--spinner-track);\n --_indicator: var(--spinner-indicator);\n\n display: inline-flex;\n flex: none;\n inline-size: var(--_size);\n block-size: var(--_size);\n vertical-align: middle;\n\n &[data-size=\"sm\"] { --_size: var(--spinner-size-sm); }\n &[data-size=\"lg\"] { --_size: var(--spinner-size-lg); }\n &[data-size=\"inherit\"] { --_size: 1em; }\n\n &[data-tone=\"inherit\"] {\n --_track: transparent;\n --_indicator: currentcolor;\n }\n }\n\n .ring {\n inline-size: 100%;\n block-size: 100%;\n border: var(--spinner-width) solid var(--_track);\n border-block-start-color: var(--_indicator);\n border-radius: var(--radius-full);\n animation: spin var(--spinner-duration) linear infinite;\n }\n\n @keyframes spin {\n to {\n rotate: 1turn;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .ring {\n animation: none;\n }\n }\n}\n","/*\n * Every value is a token (--combobox-*); the options read --listbox-*. Size\n * and invalid state resolve into private custom properties on the root. The\n * popover is positioned by React Aria; the gap to the control is its own\n * padding, so no offset number lives in code, and --trigger-width (set by\n * the vendor) makes it as wide as the control.\n */\n\n@layer components {\n .root {\n --_height: var(--combobox-height-md);\n --_font-size: var(--combobox-font-size-md);\n --_border: var(--combobox-border-default);\n\n font-family: var(--combobox-font-family);\n\n &[data-size=\"sm\"] {\n --_height: var(--combobox-height-sm);\n --_font-size: var(--combobox-font-size-sm);\n }\n\n &[data-size=\"lg\"] {\n --_height: var(--combobox-height-lg);\n --_font-size: var(--combobox-font-size-lg);\n }\n\n &[data-invalid] { --_border: var(--combobox-border-invalid); }\n }\n\n .control {\n display: grid;\n align-items: center;\n\n & > * {\n grid-area: 1 / 1;\n }\n }\n\n .input {\n inline-size: 100%;\n min-block-size: var(--_height);\n padding-block: 0;\n padding-inline: var(--combobox-padding-inline) var(--combobox-icon-size);\n border: var(--size-hairline) solid var(--_border);\n border-radius: var(--combobox-radius);\n background-color: var(--combobox-bg);\n color: var(--combobox-fg);\n font-size: var(--_font-size);\n transition: border-color var(--combobox-motion-duration) var(--motion-easing-standard);\n\n &::placeholder {\n color: var(--combobox-placeholder);\n }\n\n &[data-focused] {\n border-color: var(--combobox-border-focus);\n outline: var(--combobox-focus-ring-width) solid var(--combobox-focus-ring);\n outline-offset: var(--combobox-focus-ring-offset);\n }\n\n &[data-disabled] {\n cursor: not-allowed;\n opacity: 0.55;\n }\n\n &[data-hovered]:not([data-focused], [data-disabled]) {\n border-color: var(--combobox-border-hover);\n }\n }\n\n .button {\n display: grid;\n place-items: center;\n inline-size: var(--combobox-icon-size);\n block-size: var(--_height);\n padding: 0;\n border: none;\n border-radius: var(--combobox-radius);\n background-color: transparent;\n color: var(--combobox-icon);\n justify-self: end;\n cursor: pointer;\n\n &[data-focus-visible] {\n outline: var(--combobox-focus-ring-width) solid var(--combobox-focus-ring);\n outline-offset: calc(-1 * var(--combobox-focus-ring-width));\n }\n\n &[data-disabled] {\n cursor: not-allowed;\n }\n }\n\n .popover {\n inline-size: var(--trigger-width);\n padding-block-start: var(--combobox-gap);\n animation: fade var(--combobox-popover-duration) var(--motion-easing-standard);\n\n &[data-placement=\"top\"] {\n padding-block: 0 var(--combobox-gap);\n }\n }\n\n .list {\n box-shadow: var(--combobox-popover-shadow);\n }\n\n @keyframes fade {\n from {\n opacity: 0;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .popover {\n animation: none;\n }\n }\n}\n"],"mappings":";AAEA;AACE,GAACA;AACC,aAAS;AACT,UAAM;AACN,iBAAa;AACb,gBAAY;AACZ,eAAW,IAAI;AACf,oBAAgB;AAEhB,KAAC,CAAC;AAAkB,iBAAW,IAAI;AAAiB;AACpD,KAAC,CAAC;AAAkB,iBAAW,IAAI;AAAiB;AACpD,KAAC,CAAC;AAAuB,iBAAW;AAAS;AAE7C,MAAE,EAAE;AACF,mBAAa;AACb,kBAAY;AACd;AACF;AACF;;;AClBA;AACE,GAACC;AACC,aAAS;AACT,oBAAgB;AAChB,SAAK,IAAI;AACT,iBAAa,IAAI;AACnB;AAEA,GAACC;AACC,eAAW,IAAI;AACf,iBAAa,IAAI;AACjB,WAAO,IAAI;AACb;AAEA,GAACC;AACC,yBAAqB,IAAI;AACzB,WAAO,IAAI;AACb;AAEA,GAACC;AACC,YAAQ;AACR,eAAW,IAAI;AACf,WAAO,IAAI;AACb;AAEA,GAACC;AACC,YAAQ;AACR,eAAW,IAAI;AACf,WAAO,IAAI;AACb;AACF;;;ACzBA;AACE,GAACC;AACC,aAAS;AACT,oBAAgB;AAChB,oBAAgB,IAAI;AACpB,aAAS,IAAI;AACb,cAAU;AACV,YAAQ,IAAI,iBAAiB,MAAM,IAAI;AACvC,mBAAe,IAAI;AACnB,sBAAkB,IAAI;AACtB,WAAO,IAAI;AACX,iBAAa,IAAI;AACjB,eAAW,IAAI;AACf,aAAS;AAET,KAAC,CAAC;AACA,eAAS,IAAI,4BAA4B,MAAM,IAAI;AACnD,sBAAgB,IAAI;AACtB;AACF;AAEA,GAACC;AACC,UAAM;AACN,gBAAY;AACZ,WAAO,IAAI;AACb;AAEA,GAACC;AACC,aAAS;AACT,iBAAa;AACb,SAAK,IAAI;AACT,mBAAe,IAAI;AACnB,oBAAgB,IAAI;AACpB,mBAAe,IAAI;AACnB,WAAO,IAAI;AACX,YAAQ;AACR,aAAS;AAET,KAAC,CAAC;AAAA,IACF,CAAC,CAAC;AACA,wBAAkB,IAAI;AACxB;AAEA,KAAC,CAAC;AACA,wBAAkB,IAAI;AAEtB,OAzBHD;AA0BK,oBAAY;AACd;AACF;AAEA,KAAC,CAAC;AACA,aAAO,IAAI;AACX,cAAQ;AACV;AACF;AAEA,GAACE;AACC,aAAS;AACT,oBAAgB;AAChB,qBAAiB;AACnB;AAEA,GAACC;AACC,cAAU;AACV,mBAAe;AACf,iBAAa;AACf;AAEA,GAACC;AACC,WAAO,IAAI;AACX,eAAW,IAAI;AACjB;AAEA,GAACC;AACC,aAAS,IAAI;AACb,WAAO,IAAI;AACb;AACF;;;ACnFA;AACE,GAACC;AACC,cAAU;AACV,iBAAa,IAAI;AACjB,gBAAY,IAAI;AAChB,aAAS;AACT,YAAQ;AACR,cAAU;AACV,eAAW,MAAM;AACjB,iBAAa;AACb,YAAQ;AACV;AACF;;;ACZA;AACE,GAACC;AACC,aAAS,IAAI;AACb,cAAU,IAAI;AACd,kBAAc,IAAI;AAElB,aAAS;AACT,UAAM;AACN,iBAAa,IAAI;AACjB,gBAAY,IAAI;AAChB,oBAAgB;AAEhB,KAAC,CAAC;AAAkB,eAAS,IAAI;AAAoB;AACrD,KAAC,CAAC;AAAkB,eAAS,IAAI;AAAoB;AACrD,KAAC,CAAC;AAAuB,eAAS;AAAK;AAEvC,KAAC,CAAC;AACA,gBAAU;AACV,oBAAc;AAChB;AACF;AAEA,GAACC;AACC,iBAAa;AACb,gBAAY;AACZ,YAAQ,IAAI,iBAAiB,MAAM,IAAI;AACvC,8BAA0B,IAAI;AAC9B,mBAAe,IAAI;AACnB,eAAW,aAAK,IAAI,oBAAoB,OAAO;AACjD;AAEA,aAHaC;AAIX;AACE,cAAQ;AACV;AACF;AAEA,UAAO,wBAAyB;AAC9B,KAhBDD;AAiBG,iBAAW;AACb;AACF;AACF;;;ACpCA;AACE,GAACE;AACC,eAAW,IAAI;AACf,kBAAc,IAAI;AAClB,eAAW,IAAI;AAEf,iBAAa,IAAI;AAEjB,KAAC,CAAC;AACA,iBAAW,IAAI;AACf,oBAAc,IAAI;AACpB;AAEA,KAAC,CAAC;AACA,iBAAW,IAAI;AACf,oBAAc,IAAI;AACpB;AAEA,KAAC,CAAC;AAAgB,iBAAW,IAAI;AAA4B;AAC/D;AAEA,GAACC;AACC,aAAS;AACT,iBAAa;AAEb,MAAE,EAAE;AACF,iBAAW,EAAE,EAAE;AACjB;AACF;AAEA,GAACC;AACC,iBAAa;AACb,oBAAgB,IAAI;AACpB,mBAAe;AACf,oBAAgB,IAAI,2BAA2B,IAAI;AACnD,YAAQ,IAAI,iBAAiB,MAAM,IAAI;AACvC,mBAAe,IAAI;AACnB,sBAAkB,IAAI;AACtB,WAAO,IAAI;AACX,eAAW,IAAI;AACf,gBAAY,aAAa,IAAI,4BAA4B,IAAI;AAE7D,KAAC;AACC,aAAO,IAAI;AACb;AAEA,KAAC,CAAC;AACA,oBAAc,IAAI;AAClB,eAAS,IAAI,6BAA6B,MAAM,IAAI;AACpD,sBAAgB,IAAI;AACtB;AAEA,KAAC,CAAC;AACA,cAAQ;AACR,eAAS;AACX;AAEA,KAAC,CAAC,aAAa,KAAK,CAAC,eAAe,CAAC;AACnC,oBAAc,IAAI;AACpB;AACF;AAEA,GAACC;AACC,aAAS;AACT,iBAAa;AACb,iBAAa,IAAI;AACjB,gBAAY,IAAI;AAChB,aAAS;AACT,YAAQ;AACR,mBAAe,IAAI;AACnB,sBAAkB;AAClB,WAAO,IAAI;AACX,kBAAc;AACd,YAAQ;AAER,KAAC,CAAC;AACA,eAAS,IAAI,6BAA6B,MAAM,IAAI;AACpD,sBAAgB,KAAK,GAAG,EAAE,IAAI;AAChC;AAEA,KAAC,CAAC;AACA,cAAQ;AACV;AACF;AAEA,GAACC;AACC,iBAAa,IAAI;AACjB,yBAAqB,IAAI;AACzB,eAAW,cAAK,IAAI,6BAA6B,IAAI;AAErD,KAAC,CAAC;AACA,qBAAe,EAAE,IAAI;AACvB;AACF;AAEA,GAACC;AACC,gBAAY,IAAI;AAClB;AAEA,aAXaC;AAYX;AACE,eAAS;AACX;AACF;AAEA,UAAO,wBAAyB;AAC9B,KArBDF;AAsBG,iBAAW;AACb;AACF;AACF;","names":["icon","field","label","required","description","error","list","check","item","itemBody","itemLabel","itemDescription","empty","root","spinner","ring","spin","root","control","input","button","popover","list","fade"]}
|