@juwel-development/design-system 3.7.0 → 3.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -0
- package/dist/design-system.js +123 -71
- package/dist/index.css +1 -1
- package/dist/types/Interaction/Select/Select.d.ts +53 -0
- package/dist/types/index.d.ts +1 -0
- package/package.json +1 -1
- package/src/Interaction/Select/Select.tsx +140 -0
- package/src/index.ts +1 -0
package/README.md
CHANGED
|
@@ -32,6 +32,68 @@ If the host already imports Tailwind and only wants the palette, take the tokens
|
|
|
32
32
|
@import "@juwel-development/design-system/tokens.css";
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
+
## Select
|
|
36
|
+
|
|
37
|
+
`Select` is a compound namespace: `Select.Root` renders a labelled, uncontrolled native
|
|
38
|
+
single-select field and `Select.Option` renders one text-only native option. Root starts on
|
|
39
|
+
an empty, selectable placeholder; `required` makes that empty value invalid without choosing an
|
|
40
|
+
option for the user.
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
import { Select } from '@juwel-development/design-system';
|
|
44
|
+
import { Subject } from 'rxjs';
|
|
45
|
+
|
|
46
|
+
const marketChange$ = new Subject<string>();
|
|
47
|
+
|
|
48
|
+
<Select.Root
|
|
49
|
+
label={'Home market'}
|
|
50
|
+
name={'homeMarket'}
|
|
51
|
+
required={true}
|
|
52
|
+
placeholder={'Choose a market'}
|
|
53
|
+
onChange$={marketChange$}
|
|
54
|
+
>
|
|
55
|
+
<Select.Option value={'de'}>{'Germany'}</Select.Option>
|
|
56
|
+
<Select.Option value={'gb'}>{'United Kingdom'}</Select.Option>
|
|
57
|
+
</Select.Root>;
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`Root` requires `label`, `name`, and `placeholder`; its `children` compose `Select.Option`
|
|
61
|
+
members, including arrays, fragments, conditional children and consumer components that
|
|
62
|
+
render options. An empty field can omit children. Each `Option` requires a `value` and a
|
|
63
|
+
text-only `children` label, and accepts an optional `testId`. Option values must be
|
|
64
|
+
unique, stable, nonempty strings; every label and message is worded by the consumer.
|
|
65
|
+
The empty string is reserved for the placeholder, which remains selectable so an optional
|
|
66
|
+
field can be cleared. The browser owns keyboard navigation and the native popup.
|
|
67
|
+
|
|
68
|
+
Optional props are `required`, `disabled`, `defaultValue`, `onChange$`, `optionalLabel`,
|
|
69
|
+
`hint`, `invalid`, `errorMessage`, and `testId`. Labels always name the control; hints and
|
|
70
|
+
visible errors describe it. `invalid` exposes the consumer's validation state through
|
|
71
|
+
`aria-invalid`, and `errorMessage` renders only while invalid. Styling follows Input's
|
|
72
|
+
control, typography, focus-ring, motion, and state tokens.
|
|
73
|
+
|
|
74
|
+
`defaultValue` initializes a matching option on mount; omitted or unmatched values start
|
|
75
|
+
empty. Later `defaultValue` changes do not overwrite the user's selection. Reordered or
|
|
76
|
+
relabeled options preserve a surviving selected value; removing that option returns the
|
|
77
|
+
control to empty. Options arriving later do not apply an earlier unmatched default.
|
|
78
|
+
|
|
79
|
+
`onChange$` emits the selected string once per user change, including `''` on clearing.
|
|
80
|
+
Rendering, option replacement, and native form reset do not emit. The consumer owns the
|
|
81
|
+
Subject and must reconcile its own domain state when replacing options or resetting a form.
|
|
82
|
+
Native form reset restores the original default while that option remains mounted; if it
|
|
83
|
+
is removed, reset returns to empty. A newly mounted option does not inherit an earlier
|
|
84
|
+
option's reset default, even when it reuses its value. Keep React keys stable (use the
|
|
85
|
+
option value) across translation and reordering to preserve native selection and reset
|
|
86
|
+
state. No `reset$` prop is needed. A new record can initialize through a remount. Forms can
|
|
87
|
+
also read the current value directly by `name`, without any event subscription.
|
|
88
|
+
|
|
89
|
+
The previous unpublished `<Select options={...} />` API has been removed. For Home Market
|
|
90
|
+
in `g-label-manager` #125, put the existing field props on `Select.Root` and map market
|
|
91
|
+
records to `<Select.Option key={market.id} value={market.id}>{translatedName}</Select.Option>`
|
|
92
|
+
children. Keep `required` and the localized `placeholder` on Root; the empty option is
|
|
93
|
+
provided by Root, so callers do not compose another empty Option. Derive types with
|
|
94
|
+
`ComponentProps<typeof Select.Root>` or `ComponentProps<typeof Select.Option>` from React.
|
|
95
|
+
The consumer still awaits a published library release before changing its dependency.
|
|
96
|
+
|
|
35
97
|
## Collection
|
|
36
98
|
|
|
37
99
|
`Collection` is a vertical group of freely composed items with internal hairlines and
|
package/dist/design-system.js
CHANGED
|
@@ -661,11 +661,63 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
661
661
|
"aria-current": a ? "page" : void 0,
|
|
662
662
|
"data-testid": o,
|
|
663
663
|
children: n
|
|
664
|
-
}),
|
|
664
|
+
}), Ke = h([
|
|
665
|
+
"flex flex-col gap-[var(--space-stack)]",
|
|
666
|
+
"[&>label]:font-secondary [&>label]:font-medium [&>label]:text-body [&>label]:text-foreground",
|
|
667
|
+
"[&>span]:font-secondary [&>span]:text-muted [&>span]:text-small",
|
|
668
|
+
"[&>p]:font-secondary [&>p]:text-small [&>p]:text-muted [&>p[data-error]]:text-error",
|
|
669
|
+
"[&>select]:block [&>select]:w-full [&>select]:rounded-[var(--radius-control)] [&>select]:border [&>select]:border-solid [&>select]:border-control-border [&>select]:bg-transparent [&>select]:px-3 [&>select]:py-2",
|
|
670
|
+
"[&>select]:font-primary [&>select]:text-body [&>select]:text-foreground [&>select]:transition-colors [&>select]:duration-[var(--motion-duration-color)]",
|
|
671
|
+
"[&>select]:outline-focus-ring [&>select]:outline-offset-[var(--focus-ring-offset)] [&>select]:focus-visible:outline [&>select]:focus-visible:outline-[length:var(--focus-ring-width)]",
|
|
672
|
+
"[&>select:user-invalid]:border-error [&>select]:aria-[invalid=true]:border-error [&>select]:disabled:cursor-not-allowed [&>select]:disabled:border-disabled [&>select]:disabled:text-muted"
|
|
673
|
+
].join(" ")), qe = {
|
|
674
|
+
Root: ({ label: n, name: r, required: i, optionalLabel: a, disabled: o, invalid: s, hint: l, errorMessage: u, testId: d, defaultValue: f, onChange$: p, placeholder: m, children: h }) => {
|
|
675
|
+
let g = c(), _ = `${g}-control`, v = `${g}-hint`, y = `${g}-error`, b = [l ? v : void 0, s && u ? y : void 0].filter(Boolean).join(" ") || void 0;
|
|
676
|
+
return /* @__PURE__ */ t("div", {
|
|
677
|
+
className: Ke(),
|
|
678
|
+
children: [
|
|
679
|
+
/* @__PURE__ */ e("label", {
|
|
680
|
+
htmlFor: _,
|
|
681
|
+
children: n
|
|
682
|
+
}),
|
|
683
|
+
/* @__PURE__ */ t("select", {
|
|
684
|
+
id: _,
|
|
685
|
+
name: r,
|
|
686
|
+
required: i,
|
|
687
|
+
disabled: o,
|
|
688
|
+
defaultValue: f ?? "",
|
|
689
|
+
"aria-invalid": s || void 0,
|
|
690
|
+
"aria-describedby": b,
|
|
691
|
+
"data-testid": d,
|
|
692
|
+
onChange: (e) => !o && p?.next(e.currentTarget.value),
|
|
693
|
+
children: [/* @__PURE__ */ e("option", {
|
|
694
|
+
value: "",
|
|
695
|
+
children: m
|
|
696
|
+
}), h]
|
|
697
|
+
}),
|
|
698
|
+
!i && a && /* @__PURE__ */ e("span", { children: a }),
|
|
699
|
+
l && /* @__PURE__ */ e("p", {
|
|
700
|
+
id: v,
|
|
701
|
+
children: l
|
|
702
|
+
}),
|
|
703
|
+
s && u && /* @__PURE__ */ e("p", {
|
|
704
|
+
id: y,
|
|
705
|
+
"data-error": !0,
|
|
706
|
+
children: u
|
|
707
|
+
})
|
|
708
|
+
]
|
|
709
|
+
});
|
|
710
|
+
},
|
|
711
|
+
Option: ({ value: t, children: n, testId: r }) => /* @__PURE__ */ e("option", {
|
|
712
|
+
value: t,
|
|
713
|
+
"data-testid": r,
|
|
714
|
+
children: n
|
|
715
|
+
})
|
|
716
|
+
}, z = class extends Error {
|
|
665
717
|
constructor(e) {
|
|
666
718
|
super(`Slider configuration: ${e}`), this.name = "SliderConfigurationError";
|
|
667
719
|
}
|
|
668
|
-
},
|
|
720
|
+
}, Je = h([
|
|
669
721
|
"block h-[var(--slider-thumb-size)] w-full cursor-pointer appearance-none bg-transparent",
|
|
670
722
|
"disabled:cursor-not-allowed",
|
|
671
723
|
"outline-focus-ring outline-offset-[var(--focus-ring-offset)] focus-visible:outline focus-visible:outline-[length:var(--focus-ring-width)]",
|
|
@@ -676,19 +728,19 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
676
728
|
"[&::-moz-range-track]:h-[var(--slider-track-thickness)] [&::-moz-range-track]:rounded-[var(--radius-control)] [&::-moz-range-track]:bg-control-border",
|
|
677
729
|
"[&::-moz-range-thumb]:size-[var(--slider-thumb-size)] [&::-moz-range-thumb]:rounded-[var(--radius-control)] [&::-moz-range-thumb]:border-none [&::-moz-range-thumb]:bg-foreground",
|
|
678
730
|
"[&:disabled::-moz-range-track]:bg-disabled [&:disabled::-moz-range-thumb]:bg-disabled"
|
|
679
|
-
].join(" ")),
|
|
731
|
+
].join(" ")), Ye = (e) => {
|
|
680
732
|
for (let [t, n] of Object.entries(e)) if (!Number.isFinite(n)) throw new z(`\`${t}\` must be a finite number, got ${n}`);
|
|
681
733
|
if (e.min >= e.max) throw new z(`\`min\` (${e.min}) must be below \`max\` (${e.max})`);
|
|
682
734
|
if (e.step <= 0) throw new z(`\`step\` (${e.step}) must be positive`);
|
|
683
735
|
if (e.value < e.min || e.value > e.max) throw new z(`\`value\` (${e.value}) must lie within [${e.min}, ${e.max}]`);
|
|
684
|
-
},
|
|
736
|
+
}, Xe = ({ min: t, max: n, step: r = 1, value: i, onInput$: a, label: o, valueText: s, disabled: c, testId: l }) => (Ye({
|
|
685
737
|
min: t,
|
|
686
738
|
max: n,
|
|
687
739
|
step: r,
|
|
688
740
|
value: i
|
|
689
741
|
}), /* @__PURE__ */ e("input", {
|
|
690
742
|
type: "range",
|
|
691
|
-
className:
|
|
743
|
+
className: Je(),
|
|
692
744
|
min: t,
|
|
693
745
|
max: n,
|
|
694
746
|
step: r,
|
|
@@ -698,37 +750,37 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
698
750
|
"aria-valuetext": s,
|
|
699
751
|
"data-testid": l,
|
|
700
752
|
onChange: (e) => a.next(e.currentTarget.valueAsNumber)
|
|
701
|
-
})),
|
|
753
|
+
})), Ze = class extends Error {
|
|
702
754
|
constructor(e) {
|
|
703
755
|
super(`Tabs.${e} must be composed inside Tabs.Root`), this.name = "TabsCompositionError";
|
|
704
756
|
}
|
|
705
|
-
},
|
|
757
|
+
}, Qe = h([
|
|
706
758
|
"flex flex-row overflow-x-auto",
|
|
707
759
|
"p-[calc(var(--focus-ring-width)+var(--focus-ring-offset))]",
|
|
708
760
|
"m-[calc(-1*(var(--focus-ring-width)+var(--focus-ring-offset)))]",
|
|
709
761
|
"scroll-p-[calc(var(--focus-ring-width)+var(--focus-ring-offset))]"
|
|
710
|
-
].join(" ")),
|
|
762
|
+
].join(" ")), $e = h([
|
|
711
763
|
"font-secondary text-label tracking-label",
|
|
712
764
|
"text-muted hover:text-foreground aria-selected:text-foreground",
|
|
713
765
|
"border-b-[length:var(--tab-marker-thickness)] border-solid border-transparent aria-selected:border-foreground",
|
|
714
766
|
"shrink-0 cursor-pointer select-none text-nowrap px-[var(--tab-inset-inline)] py-[var(--tab-inset-block)]",
|
|
715
767
|
"transition-colors duration-[var(--motion-duration-color)]",
|
|
716
768
|
"outline-focus-ring outline-offset-[var(--focus-ring-offset)] focus-visible:outline focus-visible:outline-[length:var(--focus-ring-width)]"
|
|
717
|
-
].join(" ")),
|
|
769
|
+
].join(" ")), et = h("outline-focus-ring outline-offset-[var(--focus-ring-offset)] focus-visible:outline focus-visible:outline-[length:var(--focus-ring-width)]"), B = r(void 0), V = (e) => {
|
|
718
770
|
let t = o(B);
|
|
719
|
-
if (t === void 0) throw new
|
|
771
|
+
if (t === void 0) throw new Ze(e);
|
|
720
772
|
return t;
|
|
721
|
-
}, H = (e) => e.split("").map((e) => e.charCodeAt(0).toString(16).padStart(4, "0")).join(""),
|
|
773
|
+
}, H = (e) => e.split("").map((e) => e.charCodeAt(0).toString(16).padStart(4, "0")).join(""), tt = (e) => {
|
|
722
774
|
e.currentTarget.scrollIntoView({
|
|
723
775
|
block: "nearest",
|
|
724
776
|
inline: "nearest"
|
|
725
777
|
});
|
|
726
|
-
}, U = (e, t) => `${e}tab-${H(t)}`, W = (e, t) => `${e}panel-${H(t)}`,
|
|
778
|
+
}, U = (e, t) => `${e}tab-${H(t)}`, W = (e, t) => `${e}panel-${H(t)}`, nt = (e, t) => {
|
|
727
779
|
let n = e.closest("[role=\"tablist\"]");
|
|
728
780
|
if (n === null) return;
|
|
729
781
|
let r = Array.from(n.querySelectorAll(":scope > [role=\"tab\"]"));
|
|
730
782
|
return r[(r.indexOf(e) + t + r.length) % r.length];
|
|
731
|
-
},
|
|
783
|
+
}, rt = {
|
|
732
784
|
Root: ({ active: t, onSelect$: n, label: r, children: i, testId: a }) => {
|
|
733
785
|
let o = c();
|
|
734
786
|
return /* @__PURE__ */ e(B.Provider, {
|
|
@@ -749,7 +801,7 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
749
801
|
return /* @__PURE__ */ e("div", {
|
|
750
802
|
role: "tablist",
|
|
751
803
|
"aria-label": r,
|
|
752
|
-
className:
|
|
804
|
+
className: Qe(),
|
|
753
805
|
"data-testid": n,
|
|
754
806
|
children: t
|
|
755
807
|
});
|
|
@@ -765,18 +817,18 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
765
817
|
tabIndex: s ? 0 : -1,
|
|
766
818
|
"data-value": t,
|
|
767
819
|
"data-testid": r,
|
|
768
|
-
className:
|
|
820
|
+
className: $e(),
|
|
769
821
|
onClick: () => a.next(t),
|
|
770
822
|
onKeyDown: (e) => {
|
|
771
823
|
if (e.key !== "ArrowLeft" && e.key !== "ArrowRight") return;
|
|
772
824
|
e.preventDefault();
|
|
773
|
-
let t =
|
|
825
|
+
let t = nt(e.currentTarget, e.key === "ArrowRight" ? 1 : -1);
|
|
774
826
|
if (t === void 0) return;
|
|
775
827
|
t.focus();
|
|
776
828
|
let n = t.dataset.value;
|
|
777
829
|
n !== void 0 && a.next(n);
|
|
778
830
|
},
|
|
779
|
-
onFocus:
|
|
831
|
+
onFocus: tt,
|
|
780
832
|
children: n
|
|
781
833
|
});
|
|
782
834
|
},
|
|
@@ -788,12 +840,12 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
788
840
|
"aria-labelledby": U(a, t),
|
|
789
841
|
hidden: !o,
|
|
790
842
|
tabIndex: o ? 0 : void 0,
|
|
791
|
-
className:
|
|
843
|
+
className: et(),
|
|
792
844
|
"data-testid": r,
|
|
793
845
|
children: o ? n : void 0
|
|
794
846
|
});
|
|
795
847
|
}
|
|
796
|
-
},
|
|
848
|
+
}, it = h("block min-h-24 w-full rounded-[var(--radius-control)] border border-solid border-control-border bg-transparent px-3 py-2 font-primary text-body text-foreground transition-colors duration-[var(--motion-duration-color)] outline-focus-ring outline-offset-[var(--focus-ring-offset)] focus-visible:outline focus-visible:outline-[length:var(--focus-ring-width)] [&:user-invalid]:border-error aria-[invalid=true]:border-error disabled:cursor-not-allowed disabled:border-disabled disabled:text-muted"), at = ({ label: n, name: r, required: i, optionalLabel: a, invalid: o, disabled: u, defaultValue: d, placeholder: f, autocomplete: p, hint: m, errorMessage: h, onInput$: g, reset$: _, testId: v }) => {
|
|
797
849
|
let y = c(), b = `${y}-control`, x = `${y}-hint`, S = `${y}-error`, C = [m ? x : void 0, o ? S : void 0].filter(Boolean).join(" ") || void 0, w = l(null);
|
|
798
850
|
return s(() => {
|
|
799
851
|
let e = _?.subscribe(() => {
|
|
@@ -812,7 +864,7 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
812
864
|
ref: w,
|
|
813
865
|
id: b,
|
|
814
866
|
name: r,
|
|
815
|
-
className:
|
|
867
|
+
className: it(),
|
|
816
868
|
required: i,
|
|
817
869
|
disabled: u,
|
|
818
870
|
defaultValue: d,
|
|
@@ -839,29 +891,29 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
839
891
|
})
|
|
840
892
|
]
|
|
841
893
|
});
|
|
842
|
-
},
|
|
894
|
+
}, ot = h([
|
|
843
895
|
"flex flex-col items-center",
|
|
844
896
|
"min-h-[var(--cover-height)]",
|
|
845
897
|
"px-[var(--gutter)] py-[var(--space-region)]"
|
|
846
|
-
].join(" ")),
|
|
898
|
+
].join(" ")), st = "my-auto max-w-full", ct = ({ children: n, foot: r, testId: i }) => {
|
|
847
899
|
let a = r != null && typeof r != "boolean";
|
|
848
900
|
return /* @__PURE__ */ t("div", {
|
|
849
|
-
className:
|
|
901
|
+
className: ot(),
|
|
850
902
|
"data-testid": i,
|
|
851
903
|
children: [/* @__PURE__ */ e("div", {
|
|
852
|
-
className:
|
|
904
|
+
className: st,
|
|
853
905
|
children: n
|
|
854
906
|
}), a && /* @__PURE__ */ e("div", { children: r })]
|
|
855
907
|
});
|
|
856
|
-
},
|
|
908
|
+
}, lt = class extends Error {
|
|
857
909
|
constructor(e) {
|
|
858
910
|
super(`Dialog.${e} must be composed inside Dialog.Root`), this.name = "DialogCompositionError";
|
|
859
911
|
}
|
|
860
|
-
},
|
|
912
|
+
}, ut = class extends Error {
|
|
861
913
|
constructor() {
|
|
862
914
|
super("A Dialog takes exactly one accessible naming source: a visible Dialog.Title or ariaLabel on Dialog.Root, never both"), this.name = "DialogNamingError";
|
|
863
915
|
}
|
|
864
|
-
},
|
|
916
|
+
}, dt = h([
|
|
865
917
|
"open:flex open:flex-col m-auto p-0 overflow-hidden",
|
|
866
918
|
"bg-surface text-foreground",
|
|
867
919
|
"rounded-[var(--radius-dialog)] shadow-[var(--elevation-floating)]",
|
|
@@ -872,17 +924,17 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
872
924
|
content: ["w-[32rem] max-w-[calc(100vw-2*var(--gutter))]", "max-h-[calc(100dvh-2*var(--space-region))]"].join(" ")
|
|
873
925
|
} },
|
|
874
926
|
defaultVariants: { extent: "screen" }
|
|
875
|
-
}),
|
|
927
|
+
}), ft = h(["px-[var(--space-region)] pt-[var(--space-region)] pb-[var(--space-region)]", "[&:has(+[data-dialog-member=description])]:pb-0"].join(" ")), pt = h(["px-[var(--space-region)] pt-[var(--space-region)] pb-[var(--space-region)]", "[[data-dialog-member=title]+&]:mt-[var(--space-stack)] [[data-dialog-member=title]+&]:pt-0"].join(" ")), mt = h([
|
|
876
928
|
"grow shrink min-h-0 overflow-y-auto",
|
|
877
929
|
"px-[var(--space-region)] py-[var(--space-region)]",
|
|
878
930
|
"[&:not(:first-child)]:border-t [&:not(:first-child)]:border-border"
|
|
879
|
-
].join(" ")),
|
|
931
|
+
].join(" ")), ht = h([
|
|
880
932
|
"flex flex-row flex-wrap items-center justify-end gap-[var(--space-stack)] shrink-0",
|
|
881
933
|
"px-[var(--space-region)] pt-[var(--space-region)] pb-[var(--space-region)]",
|
|
882
934
|
"[[data-dialog-member=content]+&]:border-t [[data-dialog-member=content]+&]:border-border"
|
|
883
935
|
].join(" ")), G = r(void 0), K = (e) => {
|
|
884
936
|
let t = o(G);
|
|
885
|
-
if (t === void 0) throw new
|
|
937
|
+
if (t === void 0) throw new lt(e);
|
|
886
938
|
return t;
|
|
887
939
|
}, q = "a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])", J = (e, { presented: t, opener: n }) => {
|
|
888
940
|
if (e === void 0 || e.open) return;
|
|
@@ -890,7 +942,7 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
890
942
|
n.current = r instanceof HTMLElement && r !== document.body ? r : void 0, e.showModal(), t.current = !0, e.querySelector(q)?.focus();
|
|
891
943
|
}, Y = (e, { presented: t }) => {
|
|
892
944
|
t.current = !1, e?.open && e.close();
|
|
893
|
-
},
|
|
945
|
+
}, gt = {
|
|
894
946
|
Root: ({ children: t, onDismiss$: n, showDialog$: r, extent: i, ariaLabel: o, testId: d }) => {
|
|
895
947
|
let f = c(), p = l(void 0), m = l(!1), h = l(void 0), [g] = u(() => ({
|
|
896
948
|
presented: m,
|
|
@@ -926,7 +978,7 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
926
978
|
ref: (e) => {
|
|
927
979
|
p.current = e ?? void 0, e?.setAttribute("headingreset", "");
|
|
928
980
|
},
|
|
929
|
-
className:
|
|
981
|
+
className: dt({ extent: i }),
|
|
930
982
|
"aria-label": o,
|
|
931
983
|
"aria-labelledby": o === void 0 && _.title ? b.titleId : void 0,
|
|
932
984
|
"aria-describedby": _.description ? b.descriptionId : void 0,
|
|
@@ -951,10 +1003,10 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
951
1003
|
},
|
|
952
1004
|
Title: ({ children: t, testId: n }) => {
|
|
953
1005
|
let { titleId: r, isLabelled: i, registerNamePart: a } = K("Title");
|
|
954
|
-
if (s(() => a("title"), [a]), i) throw new
|
|
1006
|
+
if (s(() => a("title"), [a]), i) throw new ut();
|
|
955
1007
|
return /* @__PURE__ */ e("div", {
|
|
956
1008
|
"data-dialog-member": "title",
|
|
957
|
-
className:
|
|
1009
|
+
className: ft(),
|
|
958
1010
|
"data-testid": n,
|
|
959
1011
|
children: /* @__PURE__ */ e("h1", {
|
|
960
1012
|
id: r,
|
|
@@ -967,7 +1019,7 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
967
1019
|
let { descriptionId: r, registerNamePart: i } = K("Description");
|
|
968
1020
|
return s(() => i("description"), [i]), /* @__PURE__ */ e("div", {
|
|
969
1021
|
"data-dialog-member": "description",
|
|
970
|
-
className:
|
|
1022
|
+
className: pt(),
|
|
971
1023
|
"data-testid": n,
|
|
972
1024
|
children: /* @__PURE__ */ e("p", {
|
|
973
1025
|
id: r,
|
|
@@ -978,27 +1030,27 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
978
1030
|
},
|
|
979
1031
|
Content: ({ children: t, testId: n }) => (K("Content"), /* @__PURE__ */ e("div", {
|
|
980
1032
|
"data-dialog-member": "content",
|
|
981
|
-
className:
|
|
1033
|
+
className: mt(),
|
|
982
1034
|
"data-testid": n,
|
|
983
1035
|
children: t
|
|
984
1036
|
})),
|
|
985
1037
|
Actions: ({ children: t, testId: n }) => (K("Actions"), /* @__PURE__ */ e("div", {
|
|
986
1038
|
"data-dialog-member": "actions",
|
|
987
|
-
className:
|
|
1039
|
+
className: ht(),
|
|
988
1040
|
"data-testid": n,
|
|
989
1041
|
children: t
|
|
990
1042
|
}))
|
|
991
|
-
},
|
|
1043
|
+
}, _t = h("font-secondary text-small text-muted py-[var(--space-region)] px-[var(--gutter)]", {
|
|
992
1044
|
variants: { edge: {
|
|
993
1045
|
none: "",
|
|
994
1046
|
rule: "border-t border-solid border-rule"
|
|
995
1047
|
} },
|
|
996
1048
|
defaultVariants: { edge: "rule" }
|
|
997
|
-
}),
|
|
998
|
-
className:
|
|
1049
|
+
}), vt = ({ edge: t, children: n, testId: r }) => /* @__PURE__ */ e("footer", {
|
|
1050
|
+
className: _t({ edge: t }),
|
|
999
1051
|
"data-testid": r,
|
|
1000
1052
|
children: n
|
|
1001
|
-
}),
|
|
1053
|
+
}), yt = h("font-secondary text-small", {
|
|
1002
1054
|
variants: { state: {
|
|
1003
1055
|
idle: "text-muted",
|
|
1004
1056
|
sending: "text-muted",
|
|
@@ -1006,13 +1058,13 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
1006
1058
|
failed: "text-error"
|
|
1007
1059
|
} },
|
|
1008
1060
|
defaultVariants: { state: "idle" }
|
|
1009
|
-
}),
|
|
1061
|
+
}), bt = {
|
|
1010
1062
|
sent: "status",
|
|
1011
1063
|
failed: "alert"
|
|
1012
|
-
},
|
|
1064
|
+
}, xt = ({ action: n, method: r = "post", state: i = "idle", children: a, actions: o, note: s, testId: c }) => {
|
|
1013
1065
|
let l = s != null && typeof s != "boolean";
|
|
1014
1066
|
if (i === "sent" && !l) throw Error("Form in the `sent` state must be given a `note` - it is the outcome message.");
|
|
1015
|
-
let u = i !== "sent", d =
|
|
1067
|
+
let u = i !== "sent", d = bt[i];
|
|
1016
1068
|
return /* @__PURE__ */ t("form", {
|
|
1017
1069
|
action: n,
|
|
1018
1070
|
method: r,
|
|
@@ -1030,12 +1082,12 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
1030
1082
|
}),
|
|
1031
1083
|
l && /* @__PURE__ */ e("p", {
|
|
1032
1084
|
role: d,
|
|
1033
|
-
className:
|
|
1085
|
+
className: yt({ state: i }),
|
|
1034
1086
|
children: s
|
|
1035
1087
|
})
|
|
1036
1088
|
]
|
|
1037
1089
|
});
|
|
1038
|
-
},
|
|
1090
|
+
}, St = h([
|
|
1039
1091
|
"flex items-baseline justify-between",
|
|
1040
1092
|
"font-secondary text-label leading-label tracking-label text-muted",
|
|
1041
1093
|
"py-[var(--space-region)] px-[var(--gutter)]",
|
|
@@ -1046,50 +1098,50 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
1046
1098
|
rule: "border-b border-solid border-rule"
|
|
1047
1099
|
} },
|
|
1048
1100
|
defaultVariants: { edge: "rule" }
|
|
1049
|
-
}),
|
|
1101
|
+
}), Ct = [
|
|
1050
1102
|
"inline-flex shrink-0 items-center",
|
|
1051
1103
|
"min-h-[calc(var(--text-label)*var(--leading-label))]",
|
|
1052
1104
|
"min-w-[var(--standing-min-width)]"
|
|
1053
|
-
].join(" "),
|
|
1054
|
-
className:
|
|
1105
|
+
].join(" "), wt = ({ edge: n, standing: r, navName: i, children: a, testId: o }) => /* @__PURE__ */ t("header", {
|
|
1106
|
+
className: St({ edge: n }),
|
|
1055
1107
|
"data-testid": o,
|
|
1056
1108
|
children: [/* @__PURE__ */ e("div", {
|
|
1057
|
-
className:
|
|
1109
|
+
className: Ct,
|
|
1058
1110
|
children: r
|
|
1059
1111
|
}), /* @__PURE__ */ e("nav", {
|
|
1060
1112
|
"aria-label": i,
|
|
1061
1113
|
className: "flex flex-wrap items-baseline gap-[var(--space-region)]",
|
|
1062
1114
|
children: a
|
|
1063
1115
|
})]
|
|
1064
|
-
}),
|
|
1116
|
+
}), Tt = h("flex flex-col min-h-[var(--fold-height)] gap-[var(--space-stack)]", {
|
|
1065
1117
|
variants: { place: {
|
|
1066
1118
|
start: "justify-start",
|
|
1067
1119
|
center: "justify-center",
|
|
1068
1120
|
between: "justify-between"
|
|
1069
1121
|
} },
|
|
1070
1122
|
defaultVariants: { place: "center" }
|
|
1071
|
-
}),
|
|
1072
|
-
className:
|
|
1123
|
+
}), Et = ({ place: t, children: n, testId: r }) => /* @__PURE__ */ e("div", {
|
|
1124
|
+
className: Tt({ place: t }),
|
|
1073
1125
|
"data-testid": r,
|
|
1074
1126
|
children: n
|
|
1075
|
-
}),
|
|
1076
|
-
className:
|
|
1127
|
+
}), Dt = h("flex flex-col gap-[var(--space-stack)] py-[var(--space-band)] px-[var(--gutter)]"), Ot = h("font-primary text-title leading-title tracking-optical text-foreground"), kt = h("font-primary text-lede leading-lede text-foreground max-w-[var(--measure-wide)]"), X = h("font-primary text-small text-muted max-w-[var(--measure)]"), At = ({ title: n, lede: r, intro: i, testId: a }) => /* @__PURE__ */ t("header", {
|
|
1128
|
+
className: Dt(),
|
|
1077
1129
|
"data-testid": a,
|
|
1078
1130
|
children: [
|
|
1079
1131
|
/* @__PURE__ */ e("h1", {
|
|
1080
|
-
className:
|
|
1132
|
+
className: Ot(),
|
|
1081
1133
|
children: n
|
|
1082
1134
|
}),
|
|
1083
1135
|
r !== void 0 && /* @__PURE__ */ e("p", {
|
|
1084
|
-
className:
|
|
1136
|
+
className: kt(),
|
|
1085
1137
|
children: r
|
|
1086
1138
|
}),
|
|
1087
1139
|
i !== void 0 && /* @__PURE__ */ e("p", {
|
|
1088
|
-
className:
|
|
1140
|
+
className: X(),
|
|
1089
1141
|
children: i
|
|
1090
1142
|
})
|
|
1091
1143
|
]
|
|
1092
|
-
}),
|
|
1144
|
+
}), jt = h([
|
|
1093
1145
|
"relative",
|
|
1094
1146
|
"py-[var(--space-band)]",
|
|
1095
1147
|
"[[data-section]+&]:border-t [[data-section]+&]:border-solid [[data-section]+&]:border-rule"
|
|
@@ -1099,20 +1151,20 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
1099
1151
|
full: ""
|
|
1100
1152
|
} },
|
|
1101
1153
|
defaultVariants: { bleed: "inset" }
|
|
1102
|
-
}),
|
|
1154
|
+
}), Mt = ({ bleed: t, name: n, children: r, testId: i }) => /* @__PURE__ */ e("section", {
|
|
1103
1155
|
"data-section": "",
|
|
1104
|
-
className:
|
|
1156
|
+
className: jt({ bleed: t }),
|
|
1105
1157
|
"aria-label": n,
|
|
1106
1158
|
"data-testid": i,
|
|
1107
1159
|
children: r
|
|
1108
|
-
}),
|
|
1160
|
+
}), Nt = h([
|
|
1109
1161
|
"grid gap-[var(--space-region)] lg:grid-cols-[12rem_minmax(0,1fr)]",
|
|
1110
1162
|
"[&>div:first-child]:border-solid [&>div:first-child]:border-border [&>div:first-child]:border-b [&>div:first-child]:pb-[var(--space-stack)]",
|
|
1111
1163
|
"lg:[&>div:first-child]:border-b-0 lg:[&>div:first-child]:border-r lg:[&>div:first-child]:pb-0 lg:[&>div:first-child]:pr-[var(--space-stack)]",
|
|
1112
1164
|
"lg:[&>div:first-child>nav]:sticky lg:[&>div:first-child>nav]:top-0 lg:[&>div:first-child>nav]:max-h-[min(100dvh,var(--sidebar-scrollport-height,100dvh))] lg:[&>div:first-child>nav]:overflow-y-auto",
|
|
1113
1165
|
"[&>div:first-child>nav]:p-[calc(var(--focus-ring-width)+var(--focus-ring-offset))] lg:[&>div:first-child>nav]:scroll-p-[calc(var(--focus-ring-width)+var(--focus-ring-offset))]",
|
|
1114
1166
|
"[&>div:first-child>nav>ul]:flex [&>div:first-child>nav>ul]:flex-col [&>div:first-child>nav>ul]:gap-[var(--space-stack)]"
|
|
1115
|
-
].join(" ")),
|
|
1167
|
+
].join(" ")), Pt = (e) => {
|
|
1116
1168
|
if (!e) return;
|
|
1117
1169
|
let t = [];
|
|
1118
1170
|
for (let n = e.parentElement; n && n !== e.ownerDocument.documentElement; n = n.parentElement) t.push(n);
|
|
@@ -1126,7 +1178,7 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
1126
1178
|
return window.addEventListener("resize", n), () => {
|
|
1127
1179
|
r?.disconnect(), window.removeEventListener("resize", n), e.style.removeProperty("--sidebar-scrollport-height");
|
|
1128
1180
|
};
|
|
1129
|
-
},
|
|
1181
|
+
}, Ft = h([
|
|
1130
1182
|
"w-full text-left font-secondary text-label tracking-label",
|
|
1131
1183
|
"underline-offset-[var(--underline-offset)]",
|
|
1132
1184
|
"outline-focus-ring outline-offset-[var(--focus-ring-offset)] focus-visible:outline focus-visible:outline-[length:var(--focus-ring-width)]"
|
|
@@ -1141,7 +1193,7 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
1141
1193
|
let a = o(Z), s = a !== void 0 && a.active === t;
|
|
1142
1194
|
return /* @__PURE__ */ e("li", { children: /* @__PURE__ */ e("button", {
|
|
1143
1195
|
type: "button",
|
|
1144
|
-
className:
|
|
1196
|
+
className: Ft({ state: r ? "inert" : s ? "active" : "usable" }),
|
|
1145
1197
|
disabled: r,
|
|
1146
1198
|
"aria-current": s ? "true" : void 0,
|
|
1147
1199
|
"data-testid": i,
|
|
@@ -1153,14 +1205,14 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
1153
1205
|
}, $ = ({ children: t, testId: n }) => /* @__PURE__ */ e("div", {
|
|
1154
1206
|
"data-testid": n,
|
|
1155
1207
|
children: t
|
|
1156
|
-
}),
|
|
1208
|
+
}), It = {
|
|
1157
1209
|
Root: ({ active: r, label: a, onSelect$: o, children: s, testId: c }) => {
|
|
1158
1210
|
let l = n.toArray(s).filter(i);
|
|
1159
1211
|
return /* @__PURE__ */ t("div", {
|
|
1160
|
-
className:
|
|
1212
|
+
className: Nt(),
|
|
1161
1213
|
"data-testid": c,
|
|
1162
1214
|
children: [/* @__PURE__ */ e("div", { children: /* @__PURE__ */ e("nav", {
|
|
1163
|
-
ref:
|
|
1215
|
+
ref: Pt,
|
|
1164
1216
|
"aria-label": a,
|
|
1165
1217
|
children: /* @__PURE__ */ e(Z, {
|
|
1166
1218
|
value: {
|
|
@@ -1174,7 +1226,7 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
1174
1226
|
},
|
|
1175
1227
|
Item: Q,
|
|
1176
1228
|
Content: $
|
|
1177
|
-
},
|
|
1229
|
+
}, Lt = {
|
|
1178
1230
|
surface: "#ffffff",
|
|
1179
1231
|
foreground: "#0f172a",
|
|
1180
1232
|
muted: "#64748b",
|
|
@@ -1199,7 +1251,7 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
1199
1251
|
warning: "#b45309",
|
|
1200
1252
|
error: "#d63384",
|
|
1201
1253
|
info: "#0e7490"
|
|
1202
|
-
},
|
|
1254
|
+
}, Rt = {
|
|
1203
1255
|
surface: "#0f172a",
|
|
1204
1256
|
foreground: "#f8fafc",
|
|
1205
1257
|
muted: "#94a3b8",
|
|
@@ -1226,4 +1278,4 @@ var p = (e) => typeof e == "boolean" ? `${e}` : e === 0 ? "0" : e, m = f, h = (e
|
|
|
1226
1278
|
info: "#22d3ee"
|
|
1227
1279
|
};
|
|
1228
1280
|
//#endregion
|
|
1229
|
-
export { x as Brandmark, Pe as Button, w as Checklist, Ve as Choices, _ as Cluster, te as Collection,
|
|
1281
|
+
export { x as Brandmark, Pe as Button, w as Checklist, Ve as Choices, _ as Cluster, te as Collection, ct as Cover, ae as DefinitionList, gt as Dialog, M as Eyebrow, se as Figure, vt as Footer, xt as Form, P as H1, I as H2, _e as H3, ye as H4, xe as H5, Ce as H6, wt as Header, Et as Hero, Ue as Input, Ge as Link, ue as Meter, Te as Note, De as P, At as PageHead, Me as Prose, he as Rail, Mt as Section, qe as Select, It as Sidebar, Xe as Slider, y as Stack, A as Table, rt as Tabs, at as TextArea, Rt as dark, Lt as light };
|
package/dist/index.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-serif:ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-slate-200:oklch(92.9% .013 255.508);--color-slate-900:oklch(20.8% .042 265.755);--color-stone-50:oklch(98.5% .001 106.423);--color-white:#fff;--spacing:.25rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-9xl:8rem;--text-9xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--radius-md:.375rem;--radius-lg:.5rem;--aspect-video:16 / 9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-surface:var(--color-surface);--color-foreground:var(--color-foreground);--color-muted:var(--color-muted);--color-border:var(--color-border);--color-control-border:var(--color-control-border);--color-rule:var(--color-rule);--color-backing:var(--color-backing);--color-scrim:var(--color-scrim);--color-meter-fill:var(--color-meter-fill);--color-meter-track:var(--color-meter-track);--color-primary:var(--color-primary);--color-primary-hover:var(--color-primary-hover);--color-primary-foreground:var(--color-primary-foreground);--color-secondary:var(--color-secondary);--color-secondary-hover:var(--color-secondary-hover);--color-secondary-foreground:var(--color-secondary-foreground);--color-disabled:var(--color-disabled);--color-disabled-hover:var(--color-disabled-hover);--color-focus-ring:var(--color-focus-ring);--color-link:var(--color-link);--color-success:var(--color-success);--color-warning:var(--color-warning);--color-error:var(--color-error);--color-info:var(--color-info);--font-primary:inherit;--font-secondary:inherit;--text-display:clamp(3rem, 7vw, 6rem);--leading-display:1.05;--text-title:clamp(2.25rem, 5vw, 4.25rem);--leading-title:1.1;--text-subtitle:clamp(1.5rem, 3vw, 2.25rem);--leading-subtitle:1.2;--text-lede:1.25rem;--leading-lede:1.4;--text-body:1.0625rem;--leading-body:1.6;--text-small:.9375rem;--text-label:.8125rem;--leading-label:1.5;--text-dialog-title:clamp(1.5rem, 3vw, 2.25rem);--leading-dialog-title:1.2;--tracking-label:.14em;--tracking-optical:-.02em;--aspect-portrait:4 / 5;--aspect-square:1 / 1;--aspect-landscape:3 / 2;--aspect-wide:16 / 9}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.isolate{isolation:isolate}.z-10{z-index:10}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-0{margin:0}.m-\[calc\(-1\*\(var\(--focus-ring-width\)\+var\(--focus-ring-offset\)\)\)\]{margin:calc(-1 * (var(--focus-ring-width) + var(--focus-ring-offset)))}.m-auto{margin:auto}.mx-auto{margin-inline:auto}.my-auto{margin-block:auto}.mt-\[0\.3rem\]{margin-top:.3rem}.mt-\[0\.35em\]{margin-top:.35em}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.aspect-landscape{aspect-ratio:var(--aspect-landscape)}.aspect-portrait{aspect-ratio:var(--aspect-portrait)}.aspect-square{aspect-ratio:var(--aspect-square)}.aspect-wide{aspect-ratio:var(--aspect-wide)}.size-\[var\(--choice-marker-dot-size\)\]{width:var(--choice-marker-dot-size);height:var(--choice-marker-dot-size)}.size-\[var\(--choice-marker-size\)\]{width:var(--choice-marker-size);height:var(--choice-marker-size)}.h-12{height:calc(var(--spacing) * 12)}.h-\[calc\(100dvh-2\*var\(--space-region\)\)\]{height:calc(100dvh - 2 * var(--space-region))}.h-\[var\(--meter-track-thickness\)\]{height:var(--meter-track-thickness)}.h-\[var\(--slider-thumb-size\)\]{height:var(--slider-thumb-size)}.h-full{height:100%}.max-h-\[calc\(100dvh-2\*var\(--space-region\)\)\]{max-height:calc(100dvh - 2 * var(--space-region))}.max-h-none{max-height:none}.min-h-0{min-height:0}.min-h-24{min-height:calc(var(--spacing) * 24)}.min-h-\[calc\(var\(--text-label\)\*var\(--leading-label\)\)\]{min-height:calc(var(--text-label) * var(--leading-label))}.min-h-\[var\(--cover-height\)\]{min-height:var(--cover-height)}.min-h-\[var\(--fold-height\)\]{min-height:var(--fold-height)}.w-\[32rem\]{width:32rem}.w-\[360px\]{width:360px}.w-\[calc\(100vw-2\*var\(--gutter\)\)\]{width:calc(100vw - 2 * var(--gutter))}.w-\[calc\(var\(--meter-level\)\*100\%\)\]{width:calc(var(--meter-level) * 100%)}.w-\[var\(--measure-action\)\]{width:var(--measure-action)}.w-full{width:100%}.\[max-width\:var\(--measure-display\)\]{max-width:var(--measure-display)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-\[calc\(100vw-2\*var\(--gutter\)\)\]{max-width:calc(100vw - 2 * var(--gutter))}.max-w-\[var\(--measure\)\]{max-width:var(--measure)}.max-w-\[var\(--measure-display\)\]{max-width:var(--measure-display)}.max-w-\[var\(--measure-wide\)\]{max-width:var(--measure-wide)}.max-w-full{max-width:100%}.max-w-none{max-width:none}.min-w-0{min-width:0}.min-w-42{min-width:calc(var(--spacing) * 42)}.min-w-\[var\(--control-min-width\)\]{min-width:var(--control-min-width)}.min-w-\[var\(--standing-min-width\)\]{min-width:var(--standing-min-width)}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.scroll-p-\[calc\(var\(--focus-ring-width\)\+var\(--focus-ring-offset\)\)\]{scroll-padding:calc(var(--focus-ring-width) + var(--focus-ring-offset))}.list-none{list-style-type:none}.appearance-none{appearance:none}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-\[var\(--space-region\)\]{gap:var(--space-region)}.gap-\[var\(--space-stack\)\]{gap:var(--space-stack)}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-12>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 12) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 12) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-\[var\(--space-region\)\]{column-gap:var(--space-region)}.gap-x-\[var\(--space-stack\)\]{column-gap:var(--space-stack)}.gap-y-\[var\(--space-stack\)\]{row-gap:var(--space-stack)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded-\[var\(--radius-control\)\]{border-radius:var(--radius-control)}.rounded-\[var\(--radius-dialog\)\]{border-radius:var(--radius-dialog)}.rounded-\[var\(--radius-…\)\]{border-radius:var(--radius-…)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-\[length\:var\(--tab-marker-thickness\)\]{border-bottom-style:var(--tw-border-style);border-bottom-width:var(--tab-marker-thickness)}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.border-border{border-color:var(--color-border)}.border-control-border{border-color:var(--color-control-border)}.border-primary{border-color:var(--color-primary)}.border-rule{border-color:var(--color-rule)}.border-slate-200{border-color:var(--color-slate-200)}.border-transparent{border-color:#0000}.bg-\[color-mix\(in_oklab\,var\(--color-meter-fill\)_calc\(var\(--meter-level\)\*100\%\)\,var\(--color-error\)\)\]{background-color:var(--color-meter-fill)}@supports (color:color-mix(in lab, red, red)){.bg-\[color-mix\(in_oklab\,var\(--color-meter-fill\)_calc\(var\(--meter-level\)\*100\%\)\,var\(--color-error\)\)\]{background-color:color-mix(in oklab,var(--color-meter-fill) calc(var(--meter-level) * 100%),var(--color-error))}}.bg-backing{background-color:var(--color-backing)}.bg-foreground{background-color:var(--color-foreground)}.bg-meter-fill{background-color:var(--color-meter-fill)}.bg-meter-track{background-color:var(--color-meter-track)}.bg-primary{background-color:var(--color-primary)}.bg-secondary{background-color:var(--color-secondary)}.bg-stone-50{background-color:var(--color-stone-50)}.bg-surface{background-color:var(--color-surface)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.object-cover{object-fit:cover}.object-bottom{object-position:bottom}.object-center{object-position:center}.object-left{object-position:left}.object-right{object-position:right}.object-top{object-position:top}.p-0{padding:0}.p-4{padding:calc(var(--spacing) * 4)}.p-\[calc\(var\(--focus-ring-width\)\+var\(--focus-ring-offset\)\)\]{padding:calc(var(--focus-ring-width) + var(--focus-ring-offset))}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-\[var\(--gutter\)\]{padding-inline:var(--gutter)}.px-\[var\(--space-region\)\]{padding-inline:var(--space-region)}.px-\[var\(--tab-inset-inline\)\]{padding-inline:var(--tab-inset-inline)}.py-1{padding-block:var(--spacing)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-\[var\(--space-band\)\]{padding-block:var(--space-band)}.py-\[var\(--space-collection-item\)\]{padding-block:var(--space-collection-item)}.py-\[var\(--space-region\)\]{padding-block:var(--space-region)}.py-\[var\(--tab-inset-block\)\]{padding-block:var(--tab-inset-block)}.pt-1{padding-top:var(--spacing)}.pt-\[var\(--space-region\)\]{padding-top:var(--space-region)}.pb-1{padding-bottom:var(--spacing)}.pb-\[var\(--space-region\)\]{padding-bottom:var(--space-region)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.font-mono{font-family:var(--font-mono)}.font-primary{font-family:var(--font-primary)}.font-sans{font-family:var(--font-sans)}.font-secondary{font-family:var(--font-secondary)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-9xl{font-size:var(--text-9xl);line-height:var(--tw-leading,var(--text-9xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-body{font-size:var(--text-body)}.text-dialog-title{font-size:var(--text-dialog-title)}.text-display{font-size:var(--text-display)}.text-label{font-size:var(--text-label)}.text-lede{font-size:var(--text-lede)}.text-small{font-size:var(--text-small)}.text-subtitle{font-size:var(--text-subtitle)}.text-title{font-size:var(--text-title)}.leading-body{--tw-leading:var(--leading-body);line-height:var(--leading-body)}.leading-dialog-title{--tw-leading:var(--leading-dialog-title);line-height:var(--leading-dialog-title)}.leading-display{--tw-leading:var(--leading-display);line-height:var(--leading-display)}.leading-label{--tw-leading:var(--leading-label);line-height:var(--leading-label)}.leading-lede{--tw-leading:var(--leading-lede);line-height:var(--leading-lede)}.leading-subtitle{--tw-leading:var(--leading-subtitle);line-height:var(--leading-subtitle)}.leading-title{--tw-leading:var(--leading-title);line-height:var(--leading-title)}.font-\[500\]{--tw-font-weight:500;font-weight:500}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-label{--tw-tracking:var(--tracking-label);letter-spacing:var(--tracking-label)}.tracking-optical{--tw-tracking:var(--tracking-optical);letter-spacing:var(--tracking-optical)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.text-nowrap{text-wrap:nowrap}.text-\[var\(--text-small\)\]{color:var(--text-small)}.text-error{color:var(--color-error)}.text-foreground{color:var(--color-foreground)}.text-info{color:var(--color-info)}.text-inherit{color:inherit}.text-link{color:var(--color-link)}.text-muted{color:var(--color-muted)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-slate-900{color:var(--color-slate-900)}.text-success{color:var(--color-success)}.text-warning{color:var(--color-warning)}.uppercase{text-transform:uppercase}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.decoration-\[length\:var\(--underline-thickness\)\]{text-decoration-thickness:var(--underline-thickness)}.underline-offset-\[var\(--underline-offset\)\]{text-underline-offset:var(--underline-offset)}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[var\(--elevation-floating\)\]{--tw-shadow:var(--elevation-floating);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.outline-offset-\[var\(--focus-ring-offset\)\]{outline-offset:var(--focus-ring-offset)}.outline-focus-ring{outline-color:var(--color-focus-ring)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-\[var\(--motion-duration-color\)\]{--tw-duration:var(--motion-duration-color);transition-duration:var(--motion-duration-color)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.group-disabled\/choice\:text-muted:is(:where(.group\/choice):disabled *){color:var(--color-muted)}.backdrop\:bg-scrim::backdrop{background-color:var(--color-scrim)}.backdrop\:\[backdrop-filter\:blur\(var\(--scrim-blur\)\)\]::backdrop{-webkit-backdrop-filter:blur(var(--scrim-blur));backdrop-filter:blur(var(--scrim-blur))}.before\:mt-\[0\.35em\]:before{content:var(--tw-content);margin-top:.35em}.before\:size-\[calc\(var\(--tick-length\)\*0\.7\)\]:before{content:var(--tw-content);width:calc(var(--tick-length) * .7);height:calc(var(--tick-length) * .7)}.before\:shrink-0:before{content:var(--tw-content);flex-shrink:0}.before\:rotate-45:before{content:var(--tw-content);rotate:45deg}.before\:bg-\[var\(--color-rule\)\]:before{content:var(--tw-content);background-color:var(--color-rule)}.before\:content-\[\'\'\]:before{--tw-content:"";content:var(--tw-content)}.before\:\[border-right\:var\(--tick-thickness\)_solid_var\(--color-rule\)\]:before{content:var(--tw-content);border-right:var(--tick-thickness) solid var(--color-rule)}.before\:\[border-top\:var\(--tick-thickness\)_solid_var\(--color-rule\)\]:before{content:var(--tw-content);border-top:var(--tick-thickness) solid var(--color-rule)}.first\:border-t:first-child{border-top-style:var(--tw-border-style);border-top-width:1px}.first\:pl-0:first-child{padding-left:0}.last\:pr-0:last-child{padding-right:0}.open\:flex:is([open],:popover-open,:open){display:flex}.open\:flex-col:is([open],:popover-open,:open){flex-direction:column}@media (hover:hover){.hover\:border-muted:hover{border-color:var(--color-muted)}.hover\:bg-primary-hover:hover{background-color:var(--color-primary-hover)}.hover\:bg-secondary-hover:hover{background-color:var(--color-secondary-hover)}.hover\:text-sm:hover{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-\[length\:var\(--underline-thickness\)\]:hover{text-decoration-thickness:var(--underline-thickness)}.hover\:decoration-\[length\:var\(--underline-thickness-hover\)\]:hover{text-decoration-thickness:var(--underline-thickness-hover)}.hover\:underline-offset-\[var\(--underline-offset\)\]:hover{text-underline-offset:var(--underline-offset)}.hover\:opacity-90:hover{opacity:.9}}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-\[length\:var\(--focus-ring-width\)\]:focus-visible{outline-style:var(--tw-outline-style);outline-width:var(--focus-ring-width)}.focus-visible\:outline-\[length\:…\]:focus-visible{outline-style:var(--tw-outline-style);outline-width:…}.focus-visible\:outline-focus-ring:focus-visible{outline-color:var(--color-focus-ring)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-disabled:disabled{border-color:var(--color-disabled)}.disabled\:bg-disabled:disabled{background-color:var(--color-disabled)}.disabled\:text-muted:disabled{color:var(--color-muted)}@media (hover:hover){.disabled\:hover\:bg-disabled-hover:disabled:hover{background-color:var(--color-disabled-hover)}}.aria-checked\:border-foreground[aria-checked=true],.aria-selected\:border-foreground[aria-selected=true]{border-color:var(--color-foreground)}.aria-selected\:text-foreground[aria-selected=true]{color:var(--color-foreground)}.aria-\[invalid\=true\]\:border-error[aria-invalid=true]{border-color:var(--color-error)}@media (width>=40rem){.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:py-2{padding-block:calc(var(--spacing) * 2)}}@media (width>=48rem){.md\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}@media (width>=64rem){.lg\:sticky{position:sticky}.lg\:top-6{top:calc(var(--spacing) * 6)}.lg\:max-w-\[var\(--measure-display\)\]{max-width:var(--measure-display)}.lg\:grid-cols-\[10rem_minmax\(0\,1fr\)\]{grid-template-columns:10rem minmax(0,1fr)}.lg\:grid-cols-\[12rem_minmax\(0\,1fr\)\]{grid-template-columns:12rem minmax(0,1fr)}.lg\:grid-cols-\[16rem_minmax\(0\,1fr\)\]{grid-template-columns:16rem minmax(0,1fr)}.lg\:flex-row{flex-direction:row}.lg\:items-baseline{align-items:baseline}.lg\:items-start{align-items:flex-start}.lg\:gap-x-12{column-gap:calc(var(--spacing) * 12)}}.\[\&_\[aria-current\=page\]\]\:text-foreground [aria-current=page]{color:var(--color-foreground)}.\[\&_caption\]\:pb-3 caption{padding-bottom:calc(var(--spacing) * 3)}.\[\&_caption\]\:text-left caption{text-align:left}.\[\&_caption\]\:font-secondary caption{font-family:var(--font-secondary)}.\[\&_caption\]\:text-label caption{font-size:var(--text-label)}.\[\&_caption\]\:tracking-label caption{--tw-tracking:var(--tracking-label);letter-spacing:var(--tracking-label)}.\[\&_caption\]\:text-muted caption{color:var(--color-muted)}.\[\&\+li\]\:border-t+li{border-top-style:var(--tw-border-style);border-top-width:1px}.\[\&\+li\]\:border-solid+li{--tw-border-style:solid;border-style:solid}.\[\&\+li\]\:border-border+li{border-color:var(--color-border)}.\[\&\:\:-moz-range-thumb\]\:size-\[var\(--slider-thumb-size\)\]::-moz-range-thumb{width:var(--slider-thumb-size);height:var(--slider-thumb-size)}.\[\&\:\:-moz-range-thumb\]\:rounded-\[var\(--radius-control\)\]::-moz-range-thumb{border-radius:var(--radius-control)}.\[\&\:\:-moz-range-thumb\]\:border-none::-moz-range-thumb{--tw-border-style:none;border-style:none}.\[\&\:\:-moz-range-thumb\]\:bg-foreground::-moz-range-thumb{background-color:var(--color-foreground)}.\[\&\:\:-moz-range-track\]\:h-\[var\(--slider-track-thickness\)\]::-moz-range-track{height:var(--slider-track-thickness)}.\[\&\:\:-moz-range-track\]\:rounded-\[var\(--radius-control\)\]::-moz-range-track{border-radius:var(--radius-control)}.\[\&\:\:-moz-range-track\]\:bg-control-border::-moz-range-track{background-color:var(--color-control-border)}.\[\&\:\:-webkit-slider-runnable-track\]\:h-\[var\(--slider-track-thickness\)\]::-webkit-slider-runnable-track{height:var(--slider-track-thickness)}.\[\&\:\:-webkit-slider-runnable-track\]\:rounded-\[var\(--radius-control\)\]::-webkit-slider-runnable-track{border-radius:var(--radius-control)}.\[\&\:\:-webkit-slider-runnable-track\]\:bg-control-border::-webkit-slider-runnable-track{background-color:var(--color-control-border)}.\[\&\:\:-webkit-slider-thumb\]\:mt-\[calc\(\(var\(--slider-track-thickness\)-var\(--slider-thumb-size\)\)\/2\)\]::-webkit-slider-thumb{margin-top:calc((var(--slider-track-thickness) - var(--slider-thumb-size)) / 2)}.\[\&\:\:-webkit-slider-thumb\]\:size-\[var\(--slider-thumb-size\)\]::-webkit-slider-thumb{width:var(--slider-thumb-size);height:var(--slider-thumb-size)}.\[\&\:\:-webkit-slider-thumb\]\:appearance-none::-webkit-slider-thumb{appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:rounded-\[var\(--radius-control\)\]::-webkit-slider-thumb{border-radius:var(--radius-control)}.\[\&\:\:-webkit-slider-thumb\]\:bg-foreground::-webkit-slider-thumb{background-color:var(--color-foreground)}.\[\&\:disabled\:\:-moz-range-thumb\]\:bg-disabled:disabled::-moz-range-thumb{background-color:var(--color-disabled)}.\[\&\:disabled\:\:-moz-range-track\]\:bg-disabled:disabled::-moz-range-track{background-color:var(--color-disabled)}.\[\&\:disabled\:\:-webkit-slider-runnable-track\]\:bg-disabled:disabled::-webkit-slider-runnable-track{background-color:var(--color-disabled)}.\[\&\:disabled\:\:-webkit-slider-thumb\]\:bg-disabled:disabled::-webkit-slider-thumb{background-color:var(--color-disabled)}.\[\&\:has\(\+\[data-dialog-member\=description\]\)\]\:pb-0:has(+[data-dialog-member=description]){padding-bottom:0}.\[\&\:not\(\:first-child\)\]\:mt-\[var\(--space-stack\)\]:not(:first-child){margin-top:var(--space-stack)}.\[\&\:not\(\:first-child\)\]\:border-t:not(:first-child){border-top-style:var(--tw-border-style);border-top-width:1px}.\[\&\:not\(\:first-child\)\]\:border-solid:not(:first-child){--tw-border-style:solid;border-style:solid}.\[\&\:not\(\:first-child\)\]\:border-border:not(:first-child){border-color:var(--color-border)}.\[\&\:not\(\:first-child\)\]\:pt-\[var\(--space-stack\)\]:not(:first-child){padding-top:var(--space-stack)}.\[\&\:not\(\[data-notes\]\)\]\:overflow-x-auto:not([data-notes]){overflow-x:auto}.\[\&\:user-invalid\]\:border-error:user-invalid{border-color:var(--color-error)}@media (width>=64rem){.lg\:\[\&\>dd\]\:col-start-2>dd{grid-column-start:2}.lg\:\[\&\>dd\]\:row-start-1>dd{grid-row-start:1}}.\[\&\>div\:first-child\]\:border-b>div:first-child{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&\>div\:first-child\]\:border-solid>div:first-child{--tw-border-style:solid;border-style:solid}.\[\&\>div\:first-child\]\:border-border>div:first-child{border-color:var(--color-border)}.\[\&\>div\:first-child\]\:pb-\[var\(--space-stack\)\]>div:first-child{padding-bottom:var(--space-stack)}@media (width>=64rem){.lg\:\[\&\>div\:first-child\]\:border-r>div:first-child{border-right-style:var(--tw-border-style);border-right-width:1px}.lg\:\[\&\>div\:first-child\]\:border-b-0>div:first-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.lg\:\[\&\>div\:first-child\]\:pr-\[var\(--space-stack\)\]>div:first-child{padding-right:var(--space-stack)}.lg\:\[\&\>div\:first-child\]\:pb-0>div:first-child{padding-bottom:0}}.\[\&\>div\:first-child\>nav\]\:p-\[calc\(var\(--focus-ring-width\)\+var\(--focus-ring-offset\)\)\]>div:first-child>nav{padding:calc(var(--focus-ring-width) + var(--focus-ring-offset))}@media (width>=64rem){.lg\:\[\&\>div\:first-child\>nav\]\:sticky>div:first-child>nav{position:sticky}.lg\:\[\&\>div\:first-child\>nav\]\:top-0>div:first-child>nav{top:0}.lg\:\[\&\>div\:first-child\>nav\]\:max-h-\[min\(100dvh\,var\(--sidebar-scrollport-height\,100dvh\)\)\]>div:first-child>nav{max-height:min(100dvh, var(--sidebar-scrollport-height,100dvh))}.lg\:\[\&\>div\:first-child\>nav\]\:scroll-p-\[calc\(var\(--focus-ring-width\)\+var\(--focus-ring-offset\)\)\]>div:first-child>nav{scroll-padding:calc(var(--focus-ring-width) + var(--focus-ring-offset))}.lg\:\[\&\>div\:first-child\>nav\]\:overflow-y-auto>div:first-child>nav{overflow-y:auto}}.\[\&\>div\:first-child\>nav\>ul\]\:flex>div:first-child>nav>ul{display:flex}.\[\&\>div\:first-child\>nav\>ul\]\:flex-col>div:first-child>nav>ul{flex-direction:column}.\[\&\>div\:first-child\>nav\>ul\]\:gap-\[var\(--space-stack\)\]>div:first-child>nav>ul{gap:var(--space-stack)}@media (width>=64rem){.lg\:\[\&\>dt\]\:col-start-1>dt{grid-column-start:1}}.\[\&\>table\]\:w-full>table{width:100%}.\[\&\>table\]\:border-collapse>table{border-collapse:collapse}.\[\&\>table\]\:text-left>table{text-align:left}.\[\&\>table\>\*\:nth-child\(2\)\>tr\:first-child\]\:border-rule>table>:nth-child(2)>tr:first-child{border-color:var(--color-rule)}@media not all and (width>=48rem){.\[\&\[data-notes\=content\]_tbody\]\:max-md\:block[data-notes=content] tbody,.\[\&\[data-notes\=content\]_td\]\:max-md\:block[data-notes=content] td,.\[\&\[data-notes\=content\]_tfoot\]\:max-md\:block[data-notes=content] tfoot,.\[\&\[data-notes\=content\]_th\]\:max-md\:block[data-notes=content] th,.\[\&\[data-notes\=content\]_thead\]\:max-md\:block[data-notes=content] thead,.\[\&\[data-notes\=content\]_tr\]\:max-md\:block[data-notes=content] tr,.\[\&\[data-notes\=content\]\>table\]\:max-md\:block[data-notes=content]>table{display:block}.\[\&\[data-notes\=supplementary\]_\[data-variant\=note\]\]\:max-md\:hidden[data-notes=supplementary] [data-variant=note]{display:none}}[data-dialog-member=content]+.\[\[data-dialog-member\=content\]\+\&\]\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}[data-dialog-member=content]+.\[\[data-dialog-member\=content\]\+\&\]\:border-border{border-color:var(--color-border)}[data-dialog-member=title]+.\[\[data-dialog-member\=title\]\+\&\]\:mt-\[var\(--space-stack\)\]{margin-top:var(--space-stack)}[data-dialog-member=title]+.\[\[data-dialog-member\=title\]\+\&\]\:pt-0{padding-top:0}[data-section]+.\[\[data-section\]\+\&\]\:z-10{z-index:10}[data-section]+.\[\[data-section\]\+\&\]\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}[data-section]+.\[\[data-section\]\+\&\]\:border-solid{--tw-border-style:solid;border-style:solid}[data-section]+.\[\[data-section\]\+\&\]\:border-rule{border-color:var(--color-rule)}}:root{--color-surface:#fff;--color-foreground:#0f172a;--color-muted:#64748b;--color-border:#e2e8f0;--color-control-border:#64748b;--color-rule:#808fa3;--color-backing:#f1f5f9;--color-scrim:#0f172a80;--color-meter-fill:#0f172a;--color-meter-track:#e2e8f0;--color-primary:#7c3aed;--color-primary-hover:#6d28d9;--color-primary-foreground:#f8fafc;--color-secondary:#0369a1;--color-secondary-hover:#075985;--color-secondary-foreground:#f8fafc;--color-disabled:#94a3b8;--color-disabled-hover:#64748b;--color-focus-ring:var(--color-ring,#475569);--color-link:#2563eb;--color-success:#047857;--color-warning:#b45309;--color-error:#d63384;--color-info:#0e7490}.dark{--color-surface:#0f172a;--color-foreground:#f8fafc;--color-muted:#94a3b8;--color-border:#334155;--color-control-border:#94a3b8;--color-rule:#5b6a80;--color-backing:#1e293b;--color-scrim:#0f172a80;--color-meter-fill:#f8fafc;--color-meter-track:#334155;--color-primary:#8b5cf6;--color-primary-hover:#a78bfa;--color-primary-foreground:#020617;--color-secondary:#0284c7;--color-secondary-hover:#0ea5e9;--color-secondary-foreground:#020617;--color-disabled:#475569;--color-disabled-hover:#334155;--color-focus-ring:var(--color-ring,#cbd5e1);--color-link:#60a5fa;--color-success:#34d399;--color-warning:#fbbf24;--color-error:#f48fb1;--color-info:#22d3ee}:root{--motion-duration-color:.15s}@media (prefers-reduced-motion:reduce){:root{--motion-duration-color:0s}}:root{--focus-ring-width:3px;--focus-ring-offset:2px;--radius-control:.5rem;--radius-dialog:.375rem;--control-min-width:10.5rem;--standing-min-width:7.5rem;--underline-offset:.18em;--underline-thickness:1px;--underline-thickness-hover:2px;--measure:66ch;--measure-display:36ch;--measure-wide:72ch;--measure-action:20rem;--space-stack:.5em;--space-region:1.5em;--space-band:4em;--space-collection-item:1em;--gutter:clamp(1.5rem, 5vw, 4rem);--fold-height:min(70vh, 40rem);--cover-height:100svh;--tick-length:.9rem;--tick-thickness:1px;--tab-marker-thickness:2px;--tab-inset-inline:1em;--tab-inset-block:.5em;--slider-track-thickness:.25rem;--slider-thumb-size:1.5rem;--choice-marker-size:1.125rem;--choice-marker-dot-size:.5rem;--meter-track-thickness:.5rem;--scrim-blur:0;--elevation-floating:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-serif:ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-slate-200:oklch(92.9% .013 255.508);--color-slate-900:oklch(20.8% .042 265.755);--color-stone-50:oklch(98.5% .001 106.423);--color-white:#fff;--spacing:.25rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-9xl:8rem;--text-9xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--radius-md:.375rem;--radius-lg:.5rem;--aspect-video:16 / 9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-surface:var(--color-surface);--color-foreground:var(--color-foreground);--color-muted:var(--color-muted);--color-border:var(--color-border);--color-control-border:var(--color-control-border);--color-rule:var(--color-rule);--color-backing:var(--color-backing);--color-scrim:var(--color-scrim);--color-meter-fill:var(--color-meter-fill);--color-meter-track:var(--color-meter-track);--color-primary:var(--color-primary);--color-primary-hover:var(--color-primary-hover);--color-primary-foreground:var(--color-primary-foreground);--color-secondary:var(--color-secondary);--color-secondary-hover:var(--color-secondary-hover);--color-secondary-foreground:var(--color-secondary-foreground);--color-disabled:var(--color-disabled);--color-disabled-hover:var(--color-disabled-hover);--color-focus-ring:var(--color-focus-ring);--color-link:var(--color-link);--color-success:var(--color-success);--color-warning:var(--color-warning);--color-error:var(--color-error);--color-info:var(--color-info);--font-primary:inherit;--font-secondary:inherit;--text-display:clamp(3rem, 7vw, 6rem);--leading-display:1.05;--text-title:clamp(2.25rem, 5vw, 4.25rem);--leading-title:1.1;--text-subtitle:clamp(1.5rem, 3vw, 2.25rem);--leading-subtitle:1.2;--text-lede:1.25rem;--leading-lede:1.4;--text-body:1.0625rem;--leading-body:1.6;--text-small:.9375rem;--text-label:.8125rem;--leading-label:1.5;--text-dialog-title:clamp(1.5rem, 3vw, 2.25rem);--leading-dialog-title:1.2;--tracking-label:.14em;--tracking-optical:-.02em;--aspect-portrait:4 / 5;--aspect-square:1 / 1;--aspect-landscape:3 / 2;--aspect-wide:16 / 9}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.isolate{isolation:isolate}.z-10{z-index:10}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-0{margin:0}.m-\[calc\(-1\*\(var\(--focus-ring-width\)\+var\(--focus-ring-offset\)\)\)\]{margin:calc(-1 * (var(--focus-ring-width) + var(--focus-ring-offset)))}.m-auto{margin:auto}.mx-auto{margin-inline:auto}.my-auto{margin-block:auto}.mt-\[0\.3rem\]{margin-top:.3rem}.mt-\[0\.35em\]{margin-top:.35em}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.aspect-landscape{aspect-ratio:var(--aspect-landscape)}.aspect-portrait{aspect-ratio:var(--aspect-portrait)}.aspect-square{aspect-ratio:var(--aspect-square)}.aspect-wide{aspect-ratio:var(--aspect-wide)}.size-\[var\(--choice-marker-dot-size\)\]{width:var(--choice-marker-dot-size);height:var(--choice-marker-dot-size)}.size-\[var\(--choice-marker-size\)\]{width:var(--choice-marker-size);height:var(--choice-marker-size)}.h-12{height:calc(var(--spacing) * 12)}.h-\[calc\(100dvh-2\*var\(--space-region\)\)\]{height:calc(100dvh - 2 * var(--space-region))}.h-\[var\(--meter-track-thickness\)\]{height:var(--meter-track-thickness)}.h-\[var\(--slider-thumb-size\)\]{height:var(--slider-thumb-size)}.h-full{height:100%}.max-h-\[calc\(100dvh-2\*var\(--space-region\)\)\]{max-height:calc(100dvh - 2 * var(--space-region))}.max-h-none{max-height:none}.min-h-0{min-height:0}.min-h-24{min-height:calc(var(--spacing) * 24)}.min-h-\[calc\(var\(--text-label\)\*var\(--leading-label\)\)\]{min-height:calc(var(--text-label) * var(--leading-label))}.min-h-\[var\(--cover-height\)\]{min-height:var(--cover-height)}.min-h-\[var\(--fold-height\)\]{min-height:var(--fold-height)}.w-\[32rem\]{width:32rem}.w-\[360px\]{width:360px}.w-\[calc\(100vw-2\*var\(--gutter\)\)\]{width:calc(100vw - 2 * var(--gutter))}.w-\[calc\(var\(--meter-level\)\*100\%\)\]{width:calc(var(--meter-level) * 100%)}.w-\[var\(--measure-action\)\]{width:var(--measure-action)}.w-full{width:100%}.\[max-width\:var\(--measure-display\)\]{max-width:var(--measure-display)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-\[calc\(100vw-2\*var\(--gutter\)\)\]{max-width:calc(100vw - 2 * var(--gutter))}.max-w-\[var\(--measure\)\]{max-width:var(--measure)}.max-w-\[var\(--measure-display\)\]{max-width:var(--measure-display)}.max-w-\[var\(--measure-wide\)\]{max-width:var(--measure-wide)}.max-w-full{max-width:100%}.max-w-none{max-width:none}.min-w-0{min-width:0}.min-w-42{min-width:calc(var(--spacing) * 42)}.min-w-\[var\(--control-min-width\)\]{min-width:var(--control-min-width)}.min-w-\[var\(--standing-min-width\)\]{min-width:var(--standing-min-width)}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.scroll-p-\[calc\(var\(--focus-ring-width\)\+var\(--focus-ring-offset\)\)\]{scroll-padding:calc(var(--focus-ring-width) + var(--focus-ring-offset))}.list-none{list-style-type:none}.appearance-none{appearance:none}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-\[var\(--space-region\)\]{gap:var(--space-region)}.gap-\[var\(--space-stack\)\]{gap:var(--space-stack)}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-12>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 12) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 12) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-\[var\(--space-region\)\]{column-gap:var(--space-region)}.gap-x-\[var\(--space-stack\)\]{column-gap:var(--space-stack)}.gap-y-\[var\(--space-stack\)\]{row-gap:var(--space-stack)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded-\[var\(--radius-control\)\]{border-radius:var(--radius-control)}.rounded-\[var\(--radius-dialog\)\]{border-radius:var(--radius-dialog)}.rounded-\[var\(--radius-…\)\]{border-radius:var(--radius-…)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-\[length\:var\(--tab-marker-thickness\)\]{border-bottom-style:var(--tw-border-style);border-bottom-width:var(--tab-marker-thickness)}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.border-border{border-color:var(--color-border)}.border-control-border{border-color:var(--color-control-border)}.border-primary{border-color:var(--color-primary)}.border-rule{border-color:var(--color-rule)}.border-slate-200{border-color:var(--color-slate-200)}.border-transparent{border-color:#0000}.bg-\[color-mix\(in_oklab\,var\(--color-meter-fill\)_calc\(var\(--meter-level\)\*100\%\)\,var\(--color-error\)\)\]{background-color:var(--color-meter-fill)}@supports (color:color-mix(in lab, red, red)){.bg-\[color-mix\(in_oklab\,var\(--color-meter-fill\)_calc\(var\(--meter-level\)\*100\%\)\,var\(--color-error\)\)\]{background-color:color-mix(in oklab,var(--color-meter-fill) calc(var(--meter-level) * 100%),var(--color-error))}}.bg-backing{background-color:var(--color-backing)}.bg-foreground{background-color:var(--color-foreground)}.bg-meter-fill{background-color:var(--color-meter-fill)}.bg-meter-track{background-color:var(--color-meter-track)}.bg-primary{background-color:var(--color-primary)}.bg-secondary{background-color:var(--color-secondary)}.bg-stone-50{background-color:var(--color-stone-50)}.bg-surface{background-color:var(--color-surface)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.object-cover{object-fit:cover}.object-bottom{object-position:bottom}.object-center{object-position:center}.object-left{object-position:left}.object-right{object-position:right}.object-top{object-position:top}.p-0{padding:0}.p-4{padding:calc(var(--spacing) * 4)}.p-\[calc\(var\(--focus-ring-width\)\+var\(--focus-ring-offset\)\)\]{padding:calc(var(--focus-ring-width) + var(--focus-ring-offset))}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-\[var\(--gutter\)\]{padding-inline:var(--gutter)}.px-\[var\(--space-region\)\]{padding-inline:var(--space-region)}.px-\[var\(--tab-inset-inline\)\]{padding-inline:var(--tab-inset-inline)}.py-1{padding-block:var(--spacing)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-\[var\(--space-band\)\]{padding-block:var(--space-band)}.py-\[var\(--space-collection-item\)\]{padding-block:var(--space-collection-item)}.py-\[var\(--space-region\)\]{padding-block:var(--space-region)}.py-\[var\(--tab-inset-block\)\]{padding-block:var(--tab-inset-block)}.pt-1{padding-top:var(--spacing)}.pt-\[var\(--space-region\)\]{padding-top:var(--space-region)}.pb-1{padding-bottom:var(--spacing)}.pb-\[var\(--space-region\)\]{padding-bottom:var(--space-region)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.font-mono{font-family:var(--font-mono)}.font-primary{font-family:var(--font-primary)}.font-sans{font-family:var(--font-sans)}.font-secondary{font-family:var(--font-secondary)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-9xl{font-size:var(--text-9xl);line-height:var(--tw-leading,var(--text-9xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-body{font-size:var(--text-body)}.text-dialog-title{font-size:var(--text-dialog-title)}.text-display{font-size:var(--text-display)}.text-label{font-size:var(--text-label)}.text-lede{font-size:var(--text-lede)}.text-small{font-size:var(--text-small)}.text-subtitle{font-size:var(--text-subtitle)}.text-title{font-size:var(--text-title)}.leading-body{--tw-leading:var(--leading-body);line-height:var(--leading-body)}.leading-dialog-title{--tw-leading:var(--leading-dialog-title);line-height:var(--leading-dialog-title)}.leading-display{--tw-leading:var(--leading-display);line-height:var(--leading-display)}.leading-label{--tw-leading:var(--leading-label);line-height:var(--leading-label)}.leading-lede{--tw-leading:var(--leading-lede);line-height:var(--leading-lede)}.leading-subtitle{--tw-leading:var(--leading-subtitle);line-height:var(--leading-subtitle)}.leading-title{--tw-leading:var(--leading-title);line-height:var(--leading-title)}.font-\[500\]{--tw-font-weight:500;font-weight:500}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-label{--tw-tracking:var(--tracking-label);letter-spacing:var(--tracking-label)}.tracking-optical{--tw-tracking:var(--tracking-optical);letter-spacing:var(--tracking-optical)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.text-nowrap{text-wrap:nowrap}.text-\[var\(--text-small\)\]{color:var(--text-small)}.text-error{color:var(--color-error)}.text-foreground{color:var(--color-foreground)}.text-info{color:var(--color-info)}.text-inherit{color:inherit}.text-link{color:var(--color-link)}.text-muted{color:var(--color-muted)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-slate-900{color:var(--color-slate-900)}.text-success{color:var(--color-success)}.text-warning{color:var(--color-warning)}.uppercase{text-transform:uppercase}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.decoration-\[length\:var\(--underline-thickness\)\]{text-decoration-thickness:var(--underline-thickness)}.underline-offset-\[var\(--underline-offset\)\]{text-underline-offset:var(--underline-offset)}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[var\(--elevation-floating\)\]{--tw-shadow:var(--elevation-floating);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.outline-offset-\[var\(--focus-ring-offset\)\]{outline-offset:var(--focus-ring-offset)}.outline-focus-ring{outline-color:var(--color-focus-ring)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-\[var\(--motion-duration-color\)\]{--tw-duration:var(--motion-duration-color);transition-duration:var(--motion-duration-color)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.group-disabled\/choice\:text-muted:is(:where(.group\/choice):disabled *){color:var(--color-muted)}.backdrop\:bg-scrim::backdrop{background-color:var(--color-scrim)}.backdrop\:\[backdrop-filter\:blur\(var\(--scrim-blur\)\)\]::backdrop{-webkit-backdrop-filter:blur(var(--scrim-blur));backdrop-filter:blur(var(--scrim-blur))}.before\:mt-\[0\.35em\]:before{content:var(--tw-content);margin-top:.35em}.before\:size-\[calc\(var\(--tick-length\)\*0\.7\)\]:before{content:var(--tw-content);width:calc(var(--tick-length) * .7);height:calc(var(--tick-length) * .7)}.before\:shrink-0:before{content:var(--tw-content);flex-shrink:0}.before\:rotate-45:before{content:var(--tw-content);rotate:45deg}.before\:bg-\[var\(--color-rule\)\]:before{content:var(--tw-content);background-color:var(--color-rule)}.before\:content-\[\'\'\]:before{--tw-content:"";content:var(--tw-content)}.before\:\[border-right\:var\(--tick-thickness\)_solid_var\(--color-rule\)\]:before{content:var(--tw-content);border-right:var(--tick-thickness) solid var(--color-rule)}.before\:\[border-top\:var\(--tick-thickness\)_solid_var\(--color-rule\)\]:before{content:var(--tw-content);border-top:var(--tick-thickness) solid var(--color-rule)}.first\:border-t:first-child{border-top-style:var(--tw-border-style);border-top-width:1px}.first\:pl-0:first-child{padding-left:0}.last\:pr-0:last-child{padding-right:0}.open\:flex:is([open],:popover-open,:open){display:flex}.open\:flex-col:is([open],:popover-open,:open){flex-direction:column}@media (hover:hover){.hover\:border-muted:hover{border-color:var(--color-muted)}.hover\:bg-primary-hover:hover{background-color:var(--color-primary-hover)}.hover\:bg-secondary-hover:hover{background-color:var(--color-secondary-hover)}.hover\:text-sm:hover{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-\[length\:var\(--underline-thickness\)\]:hover{text-decoration-thickness:var(--underline-thickness)}.hover\:decoration-\[length\:var\(--underline-thickness-hover\)\]:hover{text-decoration-thickness:var(--underline-thickness-hover)}.hover\:underline-offset-\[var\(--underline-offset\)\]:hover{text-underline-offset:var(--underline-offset)}.hover\:opacity-90:hover{opacity:.9}}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-\[length\:var\(--focus-ring-width\)\]:focus-visible{outline-style:var(--tw-outline-style);outline-width:var(--focus-ring-width)}.focus-visible\:outline-\[length\:…\]:focus-visible{outline-style:var(--tw-outline-style);outline-width:…}.focus-visible\:outline-focus-ring:focus-visible{outline-color:var(--color-focus-ring)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-disabled:disabled{border-color:var(--color-disabled)}.disabled\:bg-disabled:disabled{background-color:var(--color-disabled)}.disabled\:text-muted:disabled{color:var(--color-muted)}@media (hover:hover){.disabled\:hover\:bg-disabled-hover:disabled:hover{background-color:var(--color-disabled-hover)}}.aria-checked\:border-foreground[aria-checked=true],.aria-selected\:border-foreground[aria-selected=true]{border-color:var(--color-foreground)}.aria-selected\:text-foreground[aria-selected=true]{color:var(--color-foreground)}.aria-\[invalid\=true\]\:border-error[aria-invalid=true]{border-color:var(--color-error)}@media (width>=40rem){.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:py-2{padding-block:calc(var(--spacing) * 2)}}@media (width>=48rem){.md\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}@media (width>=64rem){.lg\:sticky{position:sticky}.lg\:top-6{top:calc(var(--spacing) * 6)}.lg\:max-w-\[var\(--measure-display\)\]{max-width:var(--measure-display)}.lg\:grid-cols-\[10rem_minmax\(0\,1fr\)\]{grid-template-columns:10rem minmax(0,1fr)}.lg\:grid-cols-\[12rem_minmax\(0\,1fr\)\]{grid-template-columns:12rem minmax(0,1fr)}.lg\:grid-cols-\[16rem_minmax\(0\,1fr\)\]{grid-template-columns:16rem minmax(0,1fr)}.lg\:flex-row{flex-direction:row}.lg\:items-baseline{align-items:baseline}.lg\:items-start{align-items:flex-start}.lg\:gap-x-12{column-gap:calc(var(--spacing) * 12)}}.\[\&_\[aria-current\=page\]\]\:text-foreground [aria-current=page]{color:var(--color-foreground)}.\[\&_caption\]\:pb-3 caption{padding-bottom:calc(var(--spacing) * 3)}.\[\&_caption\]\:text-left caption{text-align:left}.\[\&_caption\]\:font-secondary caption{font-family:var(--font-secondary)}.\[\&_caption\]\:text-label caption{font-size:var(--text-label)}.\[\&_caption\]\:tracking-label caption{--tw-tracking:var(--tracking-label);letter-spacing:var(--tracking-label)}.\[\&_caption\]\:text-muted caption{color:var(--color-muted)}.\[\&\+li\]\:border-t+li{border-top-style:var(--tw-border-style);border-top-width:1px}.\[\&\+li\]\:border-solid+li{--tw-border-style:solid;border-style:solid}.\[\&\+li\]\:border-border+li{border-color:var(--color-border)}.\[\&\:\:-moz-range-thumb\]\:size-\[var\(--slider-thumb-size\)\]::-moz-range-thumb{width:var(--slider-thumb-size);height:var(--slider-thumb-size)}.\[\&\:\:-moz-range-thumb\]\:rounded-\[var\(--radius-control\)\]::-moz-range-thumb{border-radius:var(--radius-control)}.\[\&\:\:-moz-range-thumb\]\:border-none::-moz-range-thumb{--tw-border-style:none;border-style:none}.\[\&\:\:-moz-range-thumb\]\:bg-foreground::-moz-range-thumb{background-color:var(--color-foreground)}.\[\&\:\:-moz-range-track\]\:h-\[var\(--slider-track-thickness\)\]::-moz-range-track{height:var(--slider-track-thickness)}.\[\&\:\:-moz-range-track\]\:rounded-\[var\(--radius-control\)\]::-moz-range-track{border-radius:var(--radius-control)}.\[\&\:\:-moz-range-track\]\:bg-control-border::-moz-range-track{background-color:var(--color-control-border)}.\[\&\:\:-webkit-slider-runnable-track\]\:h-\[var\(--slider-track-thickness\)\]::-webkit-slider-runnable-track{height:var(--slider-track-thickness)}.\[\&\:\:-webkit-slider-runnable-track\]\:rounded-\[var\(--radius-control\)\]::-webkit-slider-runnable-track{border-radius:var(--radius-control)}.\[\&\:\:-webkit-slider-runnable-track\]\:bg-control-border::-webkit-slider-runnable-track{background-color:var(--color-control-border)}.\[\&\:\:-webkit-slider-thumb\]\:mt-\[calc\(\(var\(--slider-track-thickness\)-var\(--slider-thumb-size\)\)\/2\)\]::-webkit-slider-thumb{margin-top:calc((var(--slider-track-thickness) - var(--slider-thumb-size)) / 2)}.\[\&\:\:-webkit-slider-thumb\]\:size-\[var\(--slider-thumb-size\)\]::-webkit-slider-thumb{width:var(--slider-thumb-size);height:var(--slider-thumb-size)}.\[\&\:\:-webkit-slider-thumb\]\:appearance-none::-webkit-slider-thumb{appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:rounded-\[var\(--radius-control\)\]::-webkit-slider-thumb{border-radius:var(--radius-control)}.\[\&\:\:-webkit-slider-thumb\]\:bg-foreground::-webkit-slider-thumb{background-color:var(--color-foreground)}.\[\&\:disabled\:\:-moz-range-thumb\]\:bg-disabled:disabled::-moz-range-thumb{background-color:var(--color-disabled)}.\[\&\:disabled\:\:-moz-range-track\]\:bg-disabled:disabled::-moz-range-track{background-color:var(--color-disabled)}.\[\&\:disabled\:\:-webkit-slider-runnable-track\]\:bg-disabled:disabled::-webkit-slider-runnable-track{background-color:var(--color-disabled)}.\[\&\:disabled\:\:-webkit-slider-thumb\]\:bg-disabled:disabled::-webkit-slider-thumb{background-color:var(--color-disabled)}.\[\&\:has\(\+\[data-dialog-member\=description\]\)\]\:pb-0:has(+[data-dialog-member=description]){padding-bottom:0}.\[\&\:not\(\:first-child\)\]\:mt-\[var\(--space-stack\)\]:not(:first-child){margin-top:var(--space-stack)}.\[\&\:not\(\:first-child\)\]\:border-t:not(:first-child){border-top-style:var(--tw-border-style);border-top-width:1px}.\[\&\:not\(\:first-child\)\]\:border-solid:not(:first-child){--tw-border-style:solid;border-style:solid}.\[\&\:not\(\:first-child\)\]\:border-border:not(:first-child){border-color:var(--color-border)}.\[\&\:not\(\:first-child\)\]\:pt-\[var\(--space-stack\)\]:not(:first-child){padding-top:var(--space-stack)}.\[\&\:not\(\[data-notes\]\)\]\:overflow-x-auto:not([data-notes]){overflow-x:auto}.\[\&\:user-invalid\]\:border-error:user-invalid{border-color:var(--color-error)}@media (width>=64rem){.lg\:\[\&\>dd\]\:col-start-2>dd{grid-column-start:2}.lg\:\[\&\>dd\]\:row-start-1>dd{grid-row-start:1}}.\[\&\>div\:first-child\]\:border-b>div:first-child{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&\>div\:first-child\]\:border-solid>div:first-child{--tw-border-style:solid;border-style:solid}.\[\&\>div\:first-child\]\:border-border>div:first-child{border-color:var(--color-border)}.\[\&\>div\:first-child\]\:pb-\[var\(--space-stack\)\]>div:first-child{padding-bottom:var(--space-stack)}@media (width>=64rem){.lg\:\[\&\>div\:first-child\]\:border-r>div:first-child{border-right-style:var(--tw-border-style);border-right-width:1px}.lg\:\[\&\>div\:first-child\]\:border-b-0>div:first-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.lg\:\[\&\>div\:first-child\]\:pr-\[var\(--space-stack\)\]>div:first-child{padding-right:var(--space-stack)}.lg\:\[\&\>div\:first-child\]\:pb-0>div:first-child{padding-bottom:0}}.\[\&\>div\:first-child\>nav\]\:p-\[calc\(var\(--focus-ring-width\)\+var\(--focus-ring-offset\)\)\]>div:first-child>nav{padding:calc(var(--focus-ring-width) + var(--focus-ring-offset))}@media (width>=64rem){.lg\:\[\&\>div\:first-child\>nav\]\:sticky>div:first-child>nav{position:sticky}.lg\:\[\&\>div\:first-child\>nav\]\:top-0>div:first-child>nav{top:0}.lg\:\[\&\>div\:first-child\>nav\]\:max-h-\[min\(100dvh\,var\(--sidebar-scrollport-height\,100dvh\)\)\]>div:first-child>nav{max-height:min(100dvh, var(--sidebar-scrollport-height,100dvh))}.lg\:\[\&\>div\:first-child\>nav\]\:scroll-p-\[calc\(var\(--focus-ring-width\)\+var\(--focus-ring-offset\)\)\]>div:first-child>nav{scroll-padding:calc(var(--focus-ring-width) + var(--focus-ring-offset))}.lg\:\[\&\>div\:first-child\>nav\]\:overflow-y-auto>div:first-child>nav{overflow-y:auto}}.\[\&\>div\:first-child\>nav\>ul\]\:flex>div:first-child>nav>ul{display:flex}.\[\&\>div\:first-child\>nav\>ul\]\:flex-col>div:first-child>nav>ul{flex-direction:column}.\[\&\>div\:first-child\>nav\>ul\]\:gap-\[var\(--space-stack\)\]>div:first-child>nav>ul{gap:var(--space-stack)}@media (width>=64rem){.lg\:\[\&\>dt\]\:col-start-1>dt{grid-column-start:1}}.\[\&\>label\]\:font-secondary>label{font-family:var(--font-secondary)}.\[\&\>label\]\:text-body>label{font-size:var(--text-body)}.\[\&\>label\]\:font-medium>label{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\[\&\>label\]\:text-foreground>label{color:var(--color-foreground)}.\[\&\>p\]\:font-secondary>p{font-family:var(--font-secondary)}.\[\&\>p\]\:text-small>p{font-size:var(--text-small)}.\[\&\>p\]\:text-muted>p{color:var(--color-muted)}.\[\&\>p\[data-error\]\]\:text-error>p[data-error]{color:var(--color-error)}.\[\&\>select\]\:block>select{display:block}.\[\&\>select\]\:w-full>select{width:100%}.\[\&\>select\]\:rounded-\[var\(--radius-control\)\]>select{border-radius:var(--radius-control)}.\[\&\>select\]\:border>select{border-style:var(--tw-border-style);border-width:1px}.\[\&\>select\]\:border-solid>select{--tw-border-style:solid;border-style:solid}.\[\&\>select\]\:border-control-border>select{border-color:var(--color-control-border)}.\[\&\>select\]\:bg-transparent>select{background-color:#0000}.\[\&\>select\]\:px-3>select{padding-inline:calc(var(--spacing) * 3)}.\[\&\>select\]\:py-2>select{padding-block:calc(var(--spacing) * 2)}.\[\&\>select\]\:font-primary>select{font-family:var(--font-primary)}.\[\&\>select\]\:text-body>select{font-size:var(--text-body)}.\[\&\>select\]\:text-foreground>select{color:var(--color-foreground)}.\[\&\>select\]\:outline-offset-\[var\(--focus-ring-offset\)\]>select{outline-offset:var(--focus-ring-offset)}.\[\&\>select\]\:outline-focus-ring>select{outline-color:var(--color-focus-ring)}.\[\&\>select\]\:transition-colors>select{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.\[\&\>select\]\:duration-\[var\(--motion-duration-color\)\]>select{--tw-duration:var(--motion-duration-color);transition-duration:var(--motion-duration-color)}.\[\&\>select\]\:focus-visible\:outline>select:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.\[\&\>select\]\:focus-visible\:outline-\[length\:var\(--focus-ring-width\)\]>select:focus-visible{outline-style:var(--tw-outline-style);outline-width:var(--focus-ring-width)}.\[\&\>select\]\:disabled\:cursor-not-allowed>select:disabled{cursor:not-allowed}.\[\&\>select\]\:disabled\:border-disabled>select:disabled{border-color:var(--color-disabled)}.\[\&\>select\]\:disabled\:text-muted>select:disabled{color:var(--color-muted)}.\[\&\>select\]\:aria-\[invalid\=true\]\:border-error>select[aria-invalid=true]{border-color:var(--color-error)}.\[\&\>select\:user-invalid\]\:border-error>select:user-invalid{border-color:var(--color-error)}.\[\&\>span\]\:font-secondary>span{font-family:var(--font-secondary)}.\[\&\>span\]\:text-small>span{font-size:var(--text-small)}.\[\&\>span\]\:text-muted>span{color:var(--color-muted)}.\[\&\>table\]\:w-full>table{width:100%}.\[\&\>table\]\:border-collapse>table{border-collapse:collapse}.\[\&\>table\]\:text-left>table{text-align:left}.\[\&\>table\>\*\:nth-child\(2\)\>tr\:first-child\]\:border-rule>table>:nth-child(2)>tr:first-child{border-color:var(--color-rule)}@media not all and (width>=48rem){.\[\&\[data-notes\=content\]_tbody\]\:max-md\:block[data-notes=content] tbody,.\[\&\[data-notes\=content\]_td\]\:max-md\:block[data-notes=content] td,.\[\&\[data-notes\=content\]_tfoot\]\:max-md\:block[data-notes=content] tfoot,.\[\&\[data-notes\=content\]_th\]\:max-md\:block[data-notes=content] th,.\[\&\[data-notes\=content\]_thead\]\:max-md\:block[data-notes=content] thead,.\[\&\[data-notes\=content\]_tr\]\:max-md\:block[data-notes=content] tr,.\[\&\[data-notes\=content\]\>table\]\:max-md\:block[data-notes=content]>table{display:block}.\[\&\[data-notes\=supplementary\]_\[data-variant\=note\]\]\:max-md\:hidden[data-notes=supplementary] [data-variant=note]{display:none}}[data-dialog-member=content]+.\[\[data-dialog-member\=content\]\+\&\]\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}[data-dialog-member=content]+.\[\[data-dialog-member\=content\]\+\&\]\:border-border{border-color:var(--color-border)}[data-dialog-member=title]+.\[\[data-dialog-member\=title\]\+\&\]\:mt-\[var\(--space-stack\)\]{margin-top:var(--space-stack)}[data-dialog-member=title]+.\[\[data-dialog-member\=title\]\+\&\]\:pt-0{padding-top:0}[data-section]+.\[\[data-section\]\+\&\]\:z-10{z-index:10}[data-section]+.\[\[data-section\]\+\&\]\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}[data-section]+.\[\[data-section\]\+\&\]\:border-solid{--tw-border-style:solid;border-style:solid}[data-section]+.\[\[data-section\]\+\&\]\:border-rule{border-color:var(--color-rule)}}:root{--color-surface:#fff;--color-foreground:#0f172a;--color-muted:#64748b;--color-border:#e2e8f0;--color-control-border:#64748b;--color-rule:#808fa3;--color-backing:#f1f5f9;--color-scrim:#0f172a80;--color-meter-fill:#0f172a;--color-meter-track:#e2e8f0;--color-primary:#7c3aed;--color-primary-hover:#6d28d9;--color-primary-foreground:#f8fafc;--color-secondary:#0369a1;--color-secondary-hover:#075985;--color-secondary-foreground:#f8fafc;--color-disabled:#94a3b8;--color-disabled-hover:#64748b;--color-focus-ring:var(--color-ring,#475569);--color-link:#2563eb;--color-success:#047857;--color-warning:#b45309;--color-error:#d63384;--color-info:#0e7490}.dark{--color-surface:#0f172a;--color-foreground:#f8fafc;--color-muted:#94a3b8;--color-border:#334155;--color-control-border:#94a3b8;--color-rule:#5b6a80;--color-backing:#1e293b;--color-scrim:#0f172a80;--color-meter-fill:#f8fafc;--color-meter-track:#334155;--color-primary:#8b5cf6;--color-primary-hover:#a78bfa;--color-primary-foreground:#020617;--color-secondary:#0284c7;--color-secondary-hover:#0ea5e9;--color-secondary-foreground:#020617;--color-disabled:#475569;--color-disabled-hover:#334155;--color-focus-ring:var(--color-ring,#cbd5e1);--color-link:#60a5fa;--color-success:#34d399;--color-warning:#fbbf24;--color-error:#f48fb1;--color-info:#22d3ee}:root{--motion-duration-color:.15s}@media (prefers-reduced-motion:reduce){:root{--motion-duration-color:0s}}:root{--focus-ring-width:3px;--focus-ring-offset:2px;--radius-control:.5rem;--radius-dialog:.375rem;--control-min-width:10.5rem;--standing-min-width:7.5rem;--underline-offset:.18em;--underline-thickness:1px;--underline-thickness-hover:2px;--measure:66ch;--measure-display:36ch;--measure-wide:72ch;--measure-action:20rem;--space-stack:.5em;--space-region:1.5em;--space-band:4em;--space-collection-item:1em;--gutter:clamp(1.5rem, 5vw, 4rem);--fold-height:min(70vh, 40rem);--cover-height:100svh;--tick-length:.9rem;--tick-thickness:1px;--tab-marker-thickness:2px;--tab-inset-inline:1em;--tab-inset-block:.5em;--slider-track-thickness:.25rem;--slider-thumb-size:1.5rem;--choice-marker-size:1.125rem;--choice-marker-dot-size:.5rem;--meter-track-thickness:.5rem;--scrim-blur:0;--elevation-floating:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type FunctionComponent, type ReactNode } from 'react';
|
|
2
|
+
import type { Subject } from 'rxjs';
|
|
3
|
+
export interface ISelectRootProps {
|
|
4
|
+
/** Always rendered and associated with the control. */
|
|
5
|
+
label: string;
|
|
6
|
+
/** How the surrounding form reads the value on submit. */
|
|
7
|
+
name: string;
|
|
8
|
+
required?: boolean;
|
|
9
|
+
/** Caller-localized marker, rendered only when the field is optional. */
|
|
10
|
+
optionalLabel?: string;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
invalid?: boolean;
|
|
13
|
+
hint?: string;
|
|
14
|
+
errorMessage?: string;
|
|
15
|
+
testId?: string;
|
|
16
|
+
/** Initial selection only; omitted or unmatched values start empty. */
|
|
17
|
+
defaultValue?: string;
|
|
18
|
+
/** Emits the selected value only on user changes; never on render or native form reset. */
|
|
19
|
+
onChange$?: Subject<string>;
|
|
20
|
+
/** Caller-localized wording for the first, empty option, which remains selectable. */
|
|
21
|
+
placeholder: string;
|
|
22
|
+
/** Compose Select.Option children; arrays, fragments and consumer components are supported. */
|
|
23
|
+
children?: ReactNode;
|
|
24
|
+
}
|
|
25
|
+
export interface ISelectOptionProps {
|
|
26
|
+
/** Unique, stable, nonempty identity; the empty string belongs to Root's placeholder. */
|
|
27
|
+
value: string;
|
|
28
|
+
/** Caller-localized text; native options do not accept rich content. */
|
|
29
|
+
children: string;
|
|
30
|
+
testId?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* An uncontrolled native single-select field composed from Root and Option.
|
|
34
|
+
* Root owns the label, selectable empty placeholder and field messages; Option renders text.
|
|
35
|
+
*
|
|
36
|
+
* @Guarantees
|
|
37
|
+
* - Required rejects empty; forms read the current stable value by name.
|
|
38
|
+
* - onChange$ emits user changes (including clearing), never rendering, option updates or reset.
|
|
39
|
+
* - Omitted/unmatched defaults start empty; later defaultValue changes do not select a value.
|
|
40
|
+
* - Removing the selected option falls back to empty without emitting.
|
|
41
|
+
*
|
|
42
|
+
* @CallerMustEnsure
|
|
43
|
+
* - Compose Option members under Root; arrays, fragments and consumer components are supported.
|
|
44
|
+
* - Option values are unique, stable and nonempty, with stable React keys when mapping children.
|
|
45
|
+
* - The consumer owns all wording, stream lifetime and domain reconciliation on updates/reset.
|
|
46
|
+
* - Native reset restores the original default while its option stays mounted, otherwise empty.
|
|
47
|
+
* A newly mounted option does not inherit a removed option's reset default; remount Root to
|
|
48
|
+
* initialize another record. Translation/reordering with stable keys preserves native state.
|
|
49
|
+
*/
|
|
50
|
+
export declare const Select: {
|
|
51
|
+
readonly Root: FunctionComponent<ISelectRootProps>;
|
|
52
|
+
readonly Option: FunctionComponent<ISelectOptionProps>;
|
|
53
|
+
};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -23,6 +23,7 @@ export { Button } from 'Interaction/Button/Button';
|
|
|
23
23
|
export { Choices } from 'Interaction/Choices/Choices';
|
|
24
24
|
export { Input } from 'Interaction/Input/Input';
|
|
25
25
|
export { Link } from 'Interaction/Link/Link';
|
|
26
|
+
export { Select } from 'Interaction/Select/Select';
|
|
26
27
|
export { Slider } from 'Interaction/Slider/Slider';
|
|
27
28
|
export { Tabs } from 'Interaction/Tabs/Tabs';
|
|
28
29
|
export { TextArea } from 'Interaction/TextArea/TextArea';
|
package/package.json
CHANGED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { cva } from 'class-variance-authority';
|
|
2
|
+
import { type FunctionComponent, type ReactNode, useId } from 'react';
|
|
3
|
+
import type { Subject } from 'rxjs';
|
|
4
|
+
|
|
5
|
+
// Field styling follows Input and ADRs 0001–0004; native appearance retains the platform picker.
|
|
6
|
+
const selectRoot = cva(
|
|
7
|
+
[
|
|
8
|
+
'flex flex-col gap-[var(--space-stack)]',
|
|
9
|
+
'[&>label]:font-secondary [&>label]:font-medium [&>label]:text-body [&>label]:text-foreground',
|
|
10
|
+
'[&>span]:font-secondary [&>span]:text-muted [&>span]:text-small',
|
|
11
|
+
'[&>p]:font-secondary [&>p]:text-small [&>p]:text-muted [&>p[data-error]]:text-error',
|
|
12
|
+
'[&>select]:block [&>select]:w-full [&>select]:rounded-[var(--radius-control)] [&>select]:border [&>select]:border-solid [&>select]:border-control-border [&>select]:bg-transparent [&>select]:px-3 [&>select]:py-2',
|
|
13
|
+
'[&>select]:font-primary [&>select]:text-body [&>select]:text-foreground [&>select]:transition-colors [&>select]:duration-[var(--motion-duration-color)]',
|
|
14
|
+
'[&>select]:outline-focus-ring [&>select]:outline-offset-[var(--focus-ring-offset)] [&>select]:focus-visible:outline [&>select]:focus-visible:outline-[length:var(--focus-ring-width)]',
|
|
15
|
+
'[&>select:user-invalid]:border-error [&>select]:aria-[invalid=true]:border-error [&>select]:disabled:cursor-not-allowed [&>select]:disabled:border-disabled [&>select]:disabled:text-muted',
|
|
16
|
+
].join(' '),
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
export interface ISelectRootProps {
|
|
20
|
+
/** Always rendered and associated with the control. */
|
|
21
|
+
label: string;
|
|
22
|
+
/** How the surrounding form reads the value on submit. */
|
|
23
|
+
name: string;
|
|
24
|
+
required?: boolean;
|
|
25
|
+
/** Caller-localized marker, rendered only when the field is optional. */
|
|
26
|
+
optionalLabel?: string;
|
|
27
|
+
disabled?: boolean;
|
|
28
|
+
invalid?: boolean;
|
|
29
|
+
hint?: string;
|
|
30
|
+
errorMessage?: string;
|
|
31
|
+
testId?: string;
|
|
32
|
+
/** Initial selection only; omitted or unmatched values start empty. */
|
|
33
|
+
defaultValue?: string;
|
|
34
|
+
/** Emits the selected value only on user changes; never on render or native form reset. */
|
|
35
|
+
onChange$?: Subject<string>;
|
|
36
|
+
/** Caller-localized wording for the first, empty option, which remains selectable. */
|
|
37
|
+
placeholder: string;
|
|
38
|
+
/** Compose Select.Option children; arrays, fragments and consumer components are supported. */
|
|
39
|
+
children?: ReactNode;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* An uncontrolled native single-select field. The first option is always empty and selectable;
|
|
44
|
+
* `required` makes that empty value invalid. Option updates preserve a surviving selected value
|
|
45
|
+
* and fall back to empty when it disappears, without emitting. The form reads the value by name.
|
|
46
|
+
*/
|
|
47
|
+
const SelectRoot: FunctionComponent<ISelectRootProps> = ({
|
|
48
|
+
label,
|
|
49
|
+
name,
|
|
50
|
+
required,
|
|
51
|
+
optionalLabel,
|
|
52
|
+
disabled,
|
|
53
|
+
invalid,
|
|
54
|
+
hint,
|
|
55
|
+
errorMessage,
|
|
56
|
+
testId,
|
|
57
|
+
defaultValue,
|
|
58
|
+
onChange$,
|
|
59
|
+
placeholder,
|
|
60
|
+
children,
|
|
61
|
+
}) => {
|
|
62
|
+
const id = useId();
|
|
63
|
+
const controlId = `${id}-control`;
|
|
64
|
+
const hintId = `${id}-hint`;
|
|
65
|
+
const errorId = `${id}-error`;
|
|
66
|
+
const describedBy =
|
|
67
|
+
[hint ? hintId : undefined, invalid && errorMessage ? errorId : undefined]
|
|
68
|
+
.filter(Boolean)
|
|
69
|
+
.join(' ') || undefined;
|
|
70
|
+
|
|
71
|
+
return (
|
|
72
|
+
<div className={selectRoot()}>
|
|
73
|
+
<label htmlFor={controlId}>{label}</label>
|
|
74
|
+
<select
|
|
75
|
+
id={controlId}
|
|
76
|
+
name={name}
|
|
77
|
+
required={required}
|
|
78
|
+
disabled={disabled}
|
|
79
|
+
defaultValue={defaultValue ?? ''}
|
|
80
|
+
aria-invalid={invalid || undefined}
|
|
81
|
+
aria-describedby={describedBy}
|
|
82
|
+
data-testid={testId}
|
|
83
|
+
onChange={(event) =>
|
|
84
|
+
!disabled && onChange$?.next(event.currentTarget.value)
|
|
85
|
+
}
|
|
86
|
+
>
|
|
87
|
+
<option value={''}>{placeholder}</option>
|
|
88
|
+
{children}
|
|
89
|
+
</select>
|
|
90
|
+
{!required && optionalLabel && <span>{optionalLabel}</span>}
|
|
91
|
+
{hint && <p id={hintId}>{hint}</p>}
|
|
92
|
+
{invalid && errorMessage && (
|
|
93
|
+
<p id={errorId} data-error>
|
|
94
|
+
{errorMessage}
|
|
95
|
+
</p>
|
|
96
|
+
)}
|
|
97
|
+
</div>
|
|
98
|
+
);
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export interface ISelectOptionProps {
|
|
102
|
+
/** Unique, stable, nonempty identity; the empty string belongs to Root's placeholder. */
|
|
103
|
+
value: string;
|
|
104
|
+
/** Caller-localized text; native options do not accept rich content. */
|
|
105
|
+
children: string;
|
|
106
|
+
testId?: string;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const SelectOption: FunctionComponent<ISelectOptionProps> = ({
|
|
110
|
+
value,
|
|
111
|
+
children,
|
|
112
|
+
testId,
|
|
113
|
+
}) => (
|
|
114
|
+
<option value={value} data-testid={testId}>
|
|
115
|
+
{children}
|
|
116
|
+
</option>
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* An uncontrolled native single-select field composed from Root and Option.
|
|
121
|
+
* Root owns the label, selectable empty placeholder and field messages; Option renders text.
|
|
122
|
+
*
|
|
123
|
+
* @Guarantees
|
|
124
|
+
* - Required rejects empty; forms read the current stable value by name.
|
|
125
|
+
* - onChange$ emits user changes (including clearing), never rendering, option updates or reset.
|
|
126
|
+
* - Omitted/unmatched defaults start empty; later defaultValue changes do not select a value.
|
|
127
|
+
* - Removing the selected option falls back to empty without emitting.
|
|
128
|
+
*
|
|
129
|
+
* @CallerMustEnsure
|
|
130
|
+
* - Compose Option members under Root; arrays, fragments and consumer components are supported.
|
|
131
|
+
* - Option values are unique, stable and nonempty, with stable React keys when mapping children.
|
|
132
|
+
* - The consumer owns all wording, stream lifetime and domain reconciliation on updates/reset.
|
|
133
|
+
* - Native reset restores the original default while its option stays mounted, otherwise empty.
|
|
134
|
+
* A newly mounted option does not inherit a removed option's reset default; remount Root to
|
|
135
|
+
* initialize another record. Translation/reordering with stable keys preserves native state.
|
|
136
|
+
*/
|
|
137
|
+
export const Select = {
|
|
138
|
+
Root: SelectRoot,
|
|
139
|
+
Option: SelectOption,
|
|
140
|
+
} as const;
|
package/src/index.ts
CHANGED
|
@@ -24,6 +24,7 @@ export { Button } from 'Interaction/Button/Button';
|
|
|
24
24
|
export { Choices } from 'Interaction/Choices/Choices';
|
|
25
25
|
export { Input } from 'Interaction/Input/Input';
|
|
26
26
|
export { Link } from 'Interaction/Link/Link';
|
|
27
|
+
export { Select } from 'Interaction/Select/Select';
|
|
27
28
|
export { Slider } from 'Interaction/Slider/Slider';
|
|
28
29
|
export { Tabs } from 'Interaction/Tabs/Tabs';
|
|
29
30
|
export { TextArea } from 'Interaction/TextArea/TextArea';
|