@epilot/zenith-react 0.1.0-next.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +95 -15
- package/dist/components/appearance-boundary/appearance-boundary.js +32 -34
- package/dist/components/appearance-boundary/appearance-boundary.js.map +1 -1
- package/dist/components/badge/badge.js +1 -1
- package/dist/components/badge/badge.js.map +1 -1
- package/dist/components/breadcrumb/breadcrumb.js +10 -10
- package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
- package/dist/components/button/button.js +28 -28
- package/dist/components/button/button.js.map +1 -1
- package/dist/components/button-group/button-group.js.map +1 -1
- package/dist/components/callout/callout.js +13 -13
- package/dist/components/callout/callout.js.map +1 -1
- package/dist/components/card/card.js.map +1 -1
- package/dist/components/checkbox/checkbox.js +13 -13
- package/dist/components/checkbox/checkbox.js.map +1 -1
- package/dist/components/code-block/code-block.js +6 -6
- package/dist/components/code-block/code-block.js.map +1 -1
- package/dist/components/code-editor/code-editor.js +1 -1
- package/dist/components/code-editor/code-editor.js.map +1 -1
- package/dist/components/code-editor/indent.js.map +1 -1
- package/dist/components/command/command.js +7 -13
- package/dist/components/command/command.js.map +1 -1
- package/dist/components/data-table/data-table-body.js +120 -66
- package/dist/components/data-table/data-table-body.js.map +1 -1
- package/dist/components/data-table/data-table-column-header.js +7 -7
- package/dist/components/data-table/data-table-column-header.js.map +1 -1
- package/dist/components/data-table/data-table-column-order.js +277 -0
- package/dist/components/data-table/data-table-column-order.js.map +1 -0
- package/dist/components/data-table/data-table-content.js +72 -58
- package/dist/components/data-table/data-table-content.js.map +1 -1
- package/dist/components/data-table/data-table-context.js +8 -4
- package/dist/components/data-table/data-table-context.js.map +1 -1
- package/dist/components/data-table/data-table-footer.js +31 -0
- package/dist/components/data-table/data-table-footer.js.map +1 -0
- package/dist/components/data-table/data-table-header-draggable.js +151 -0
- package/dist/components/data-table/data-table-header-draggable.js.map +1 -0
- package/dist/components/data-table/data-table-header.js +130 -57
- package/dist/components/data-table/data-table-header.js.map +1 -1
- package/dist/components/data-table/data-table-resize-handle.js +137 -0
- package/dist/components/data-table/data-table-resize-handle.js.map +1 -0
- package/dist/components/data-table/data-table.js +184 -156
- package/dist/components/data-table/data-table.js.map +1 -1
- package/dist/components/data-table/hooks/use-data-table-virtualizer.js +9 -0
- package/dist/components/data-table/hooks/use-data-table-virtualizer.js.map +1 -0
- package/dist/components/date-range-picker/date-range-picker.js +197 -195
- package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
- package/dist/components/date-time-picker/calendar.js +29 -29
- package/dist/components/date-time-picker/calendar.js.map +1 -1
- package/dist/components/date-time-picker/time-picker.js +55 -55
- package/dist/components/date-time-picker/time-picker.js.map +1 -1
- package/dist/components/density-provider/density-provider.js.map +1 -1
- package/dist/components/dialog/dialog.js +1 -1
- package/dist/components/dialog/dialog.js.map +1 -1
- package/dist/components/drawer/drawer.js +5 -5
- package/dist/components/drawer/drawer.js.map +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.js +36 -36
- package/dist/components/dropdown-menu/dropdown-menu.js.map +1 -1
- package/dist/components/field/field-combobox.js +4 -4
- package/dist/components/field/field-combobox.js.map +1 -1
- package/dist/components/field/field.js +40 -40
- package/dist/components/field/field.js.map +1 -1
- package/dist/components/label/label.js +0 -28
- package/dist/components/label/label.js.map +1 -1
- package/dist/components/list/list.js +42 -52
- package/dist/components/list/list.js.map +1 -1
- package/dist/components/option-card/option-card.js +27 -25
- package/dist/components/option-card/option-card.js.map +1 -1
- package/dist/components/pill/pill.js +9 -9
- package/dist/components/pill/pill.js.map +1 -1
- package/dist/components/radio/radio.js +14 -14
- package/dist/components/radio/radio.js.map +1 -1
- package/dist/components/scroll-area/scroll-area.js +9 -9
- package/dist/components/scroll-area/scroll-area.js.map +1 -1
- package/dist/components/segmented-control/segmented-control.js +1 -1
- package/dist/components/segmented-control/segmented-control.js.map +1 -1
- package/dist/components/select/select.js +11 -11
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/separator/separator.js.map +1 -1
- package/dist/components/skeleton/skeleton.js.map +1 -1
- package/dist/components/slot/compose-as-child.js.map +1 -1
- package/dist/components/spinner/spinner.js.map +1 -1
- package/dist/components/switch/switch.js +11 -11
- package/dist/components/switch/switch.js.map +1 -1
- package/dist/components/table/table-pagination.js +1 -1
- package/dist/components/table/table-pagination.js.map +1 -1
- package/dist/components/table/table.js +15 -15
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/text/text.js +10 -1
- package/dist/components/text/text.js.map +1 -1
- package/dist/components/toast/toast.js +30 -32
- package/dist/components/toast/toast.js.map +1 -1
- package/dist/components/toggle/toggle.js +20 -20
- package/dist/components/toggle/toggle.js.map +1 -1
- package/dist/delivery/index.d.ts +10 -44
- package/dist/delivery/index.js +5 -9
- package/dist/index.d.ts +1994 -2272
- package/dist/index.js +133 -121
- package/dist/index.js.map +1 -1
- package/dist/lib/clear-button.js.map +1 -1
- package/dist/lib/code-highlight.js.map +1 -1
- package/dist/lib/code-tokens.js.map +1 -1
- package/dist/lib/pagination.js.map +1 -1
- package/dist/packages/tokens/dist/delivery/index.js +18 -48
- package/dist/packages/tokens/dist/delivery/index.js.map +1 -1
- package/dist/packages/tokens/dist/generated/core.generated.js +18 -0
- package/dist/packages/tokens/dist/generated/core.generated.js.map +1 -0
- package/dist/packages/tokens/dist/generated/palette.generated.js +5 -5
- package/dist/packages/tokens/dist/generated/palette.generated.js.map +1 -1
- package/dist/packages/tokens/dist/install.js +9 -9
- package/dist/packages/tokens/dist/install.js.map +1 -1
- package/dist/styles/document-context.js.map +1 -1
- package/dist/styles/make-styles.js.map +1 -1
- package/dist/tokens/core.meta.generated.js +2 -2
- package/dist/tokens/core.meta.generated.js.map +1 -1
- package/dist/tokens/index.d.ts +1029 -1104
- package/dist/tokens/index.js +1031 -1106
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/palette.generated.js +2 -2
- package/dist/tokens/palette.generated.js.map +1 -1
- package/dist/tokens/use-palette-tokens.js.map +1 -1
- package/dist/tokens.json +605 -755
- package/dist/vendor/.bun/@dnd-kit_core@6.3.1_6f4b9a1cfb20c0ae/vendor/@dnd-kit/core/dist/core.esm.js +385 -340
- package/dist/vendor/.bun/@dnd-kit_core@6.3.1_6f4b9a1cfb20c0ae/vendor/@dnd-kit/core/dist/core.esm.js.map +1 -1
- package/dist/vendor/.bun/@dnd-kit_sortable@10.0.0_1d291640e1250bbe/vendor/@dnd-kit/sortable/dist/sortable.esm.js +344 -229
- package/dist/vendor/.bun/@dnd-kit_sortable@10.0.0_1d291640e1250bbe/vendor/@dnd-kit/sortable/dist/sortable.esm.js.map +1 -1
- package/dist/vendor/.bun/@dnd-kit_utilities@3.2.2_62547eec5a2188e3/vendor/@dnd-kit/utilities/dist/utilities.esm.js +1 -1
- package/dist/vendor/.bun/@tanstack_react-virtual@3.11.2_6f4b9a1cfb20c0ae/vendor/@tanstack/react-virtual/dist/esm/index.js +36 -0
- package/dist/vendor/.bun/@tanstack_react-virtual@3.11.2_6f4b9a1cfb20c0ae/vendor/@tanstack/react-virtual/dist/esm/index.js.map +1 -0
- package/dist/vendor/.bun/@tanstack_virtual-core@3.11.2/vendor/@tanstack/virtual-core/dist/esm/index.js +450 -0
- package/dist/vendor/.bun/@tanstack_virtual-core@3.11.2/vendor/@tanstack/virtual-core/dist/esm/index.js.map +1 -0
- package/dist/vendor/.bun/@tanstack_virtual-core@3.11.2/vendor/@tanstack/virtual-core/dist/esm/utils.js +50 -0
- package/dist/vendor/.bun/@tanstack_virtual-core@3.11.2/vendor/@tanstack/virtual-core/dist/esm/utils.js.map +1 -0
- package/package.json +5 -4
- package/scripts/migration-diagnostics-core.mjs +19 -90
- package/scripts/migration-diagnostics.mjs +1 -16
- package/scripts/migration-sweep.mjs +2 -12
- package/ADOPTING.md +0 -73
- package/dist/packages/tokens/dist/delivery/internal.js +0 -181
- package/dist/packages/tokens/dist/delivery/internal.js.map +0 -1
- package/dist/packages/tokens/dist/generated/core.meta.generated.js +0 -10
- package/dist/packages/tokens/dist/generated/core.meta.generated.js.map +0 -1
- package/dist/token-assets/core/5cd4072decf5df2a664f0b1d5f2ec250a3309101ded3056c1f87c8bbe3738d50.css +0 -22
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { jsx as
|
|
1
|
+
import { jsx as f, jsxs as j } from "react/jsx-runtime";
|
|
2
2
|
import * as e from "react";
|
|
3
3
|
import { Root as H, Scrollbar as W, Thumb as O, Corner as L, Viewport as q } from "../../vendor/.bun/@radix-ui_react-scroll-area@1.2.10_2b23df507bdda662/vendor/@radix-ui/react-scroll-area/dist/index.js";
|
|
4
4
|
import { mergeClasses as b, SLOT_ATTR as o, shorthands as R } from "@epilot/zenith-runtime/v1";
|
|
5
5
|
import { makeZenithStyles as I } from "../../styles/make-styles.js";
|
|
6
|
-
import { grayA9 as M, grayA11 as Z, grayA10 as _,
|
|
6
|
+
import { grayA9 as M, grayA11 as Z, grayA10 as _, focusRing as B } from "../../tokens/index.js";
|
|
7
7
|
import { useScrollbarStyles as G } from "./scrollbar-styles.js";
|
|
8
8
|
const T = e.createContext(null), E = I({
|
|
9
9
|
root: {
|
|
@@ -82,7 +82,7 @@ const T = e.createContext(null), E = I({
|
|
|
82
82
|
onFocusCapture: n,
|
|
83
83
|
onBlurCapture: x,
|
|
84
84
|
...D
|
|
85
|
-
},
|
|
85
|
+
}, p) {
|
|
86
86
|
const d = E(), y = G(), w = e.useRef(null), k = e.useRef(
|
|
87
87
|
void 0
|
|
88
88
|
), s = e.useRef({
|
|
@@ -111,13 +111,13 @@ const T = e.createContext(null), E = I({
|
|
|
111
111
|
() => ({ orientation: a, onScroll: S }),
|
|
112
112
|
[a, S]
|
|
113
113
|
), $ = a === "both" ? ["vertical", "horizontal"] : [a];
|
|
114
|
-
return /* @__PURE__ */
|
|
114
|
+
return /* @__PURE__ */ f(T.Provider, { value: N, children: /* @__PURE__ */ j(
|
|
115
115
|
H,
|
|
116
116
|
{
|
|
117
117
|
...D,
|
|
118
118
|
type: "auto",
|
|
119
119
|
ref: (r) => {
|
|
120
|
-
w.current = r, typeof
|
|
120
|
+
w.current = r, typeof p == "function" ? p(r) : p && (p.current = r);
|
|
121
121
|
},
|
|
122
122
|
"data-slot": "scroll-area",
|
|
123
123
|
[o]: "scroll-area",
|
|
@@ -138,7 +138,7 @@ const T = e.createContext(null), E = I({
|
|
|
138
138
|
},
|
|
139
139
|
children: [
|
|
140
140
|
g,
|
|
141
|
-
$.map((r) => /* @__PURE__ */
|
|
141
|
+
$.map((r) => /* @__PURE__ */ f(
|
|
142
142
|
W,
|
|
143
143
|
{
|
|
144
144
|
orientation: r,
|
|
@@ -152,7 +152,7 @@ const T = e.createContext(null), E = I({
|
|
|
152
152
|
onPointerDown: () => {
|
|
153
153
|
s.current.drag = !0, m();
|
|
154
154
|
},
|
|
155
|
-
children: /* @__PURE__ */
|
|
155
|
+
children: /* @__PURE__ */ f(
|
|
156
156
|
O,
|
|
157
157
|
{
|
|
158
158
|
"data-slot": "scroll-area-thumb",
|
|
@@ -163,7 +163,7 @@ const T = e.createContext(null), E = I({
|
|
|
163
163
|
},
|
|
164
164
|
r
|
|
165
165
|
)),
|
|
166
|
-
a === "both" && /* @__PURE__ */
|
|
166
|
+
a === "both" && /* @__PURE__ */ f(L, { className: d.corner })
|
|
167
167
|
]
|
|
168
168
|
}
|
|
169
169
|
) });
|
|
@@ -172,7 +172,7 @@ const T = e.createContext(null), E = I({
|
|
|
172
172
|
const t = e.useContext(T), l = E();
|
|
173
173
|
if (!t)
|
|
174
174
|
throw new Error("ScrollAreaViewport requires a ScrollArea parent");
|
|
175
|
-
return /* @__PURE__ */
|
|
175
|
+
return /* @__PURE__ */ f(
|
|
176
176
|
q,
|
|
177
177
|
{
|
|
178
178
|
...v,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-area.js","sources":["../../../src/components/scroll-area/scroll-area.tsx"],"sourcesContent":["import * as React from \"react\"\nimport * as Primitive from \"@radix-ui/react-scroll-area\"\nimport { mergeClasses, shorthands } from \"@epilot/zenith-runtime/v1\"\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeZenithStyles } from \"../../styles/make-styles\"\nimport * as tokens from \"../../tokens\"\nimport { useScrollbarStyles } from \"./scrollbar-styles\"\n\nexport type ScrollAreaOrientation = \"vertical\" | \"horizontal\" | \"both\"\nexport type ScrollAreaVisibility = \"interaction\" | \"always\"\nexport type ScrollAreaProps = Omit<\n React.ComponentPropsWithoutRef<typeof Primitive.Root>,\n \"asChild\" | \"type\" | \"scrollHideDelay\"\n> & {\n orientation?: ScrollAreaOrientation\n visibility?: ScrollAreaVisibility\n}\nexport type ScrollAreaViewportProps = Omit<\n React.ComponentPropsWithoutRef<typeof Primitive.Viewport>,\n \"asChild\"\n>\n\nconst Context = React.createContext<{\n orientation: ScrollAreaOrientation\n onScroll: () => void\n} | null>(null)\n\nconst useStyles = makeZenithStyles({\n root: {\n position: \"relative\",\n minWidth: 0,\n minHeight: 0,\n ...shorthands.overflow(\"hidden\"),\n [`&[data-revealed='true'] > [${SLOT_ATTR}='scroll-area-scrollbar']`]: {\n opacity: 1,\n pointerEvents: \"auto\",\n },\n \"@media (forced-colors: active)\": {\n [`& > [${SLOT_ATTR}='scroll-area-scrollbar']`]: {\n opacity: 1,\n pointerEvents: \"auto\",\n backgroundColor: \"Canvas\",\n },\n },\n },\n viewport: {\n width: \"100%\",\n height: \"100%\",\n minWidth: 0,\n minHeight: 0,\n boxSizing: \"border-box\",\n borderRadius: \"inherit\",\n \":focus-visible\": {\n outlineWidth: \"3px\",\n outlineStyle: \"solid\",\n outlineColor: tokens.semFocusRing,\n outlineOffset: \"-3px\",\n },\n },\n verticalContent: {\n // Radix's measurement wrapper defaults to display:table, which expands long lines.\n \"& > div\": { display: \"block\", minWidth: \"100%\" },\n },\n reserveVertical: { paddingInlineEnd: \"12px\" },\n reserveHorizontal: { paddingBottom: \"12px\" },\n track: {\n boxSizing: \"border-box\",\n ...shorthands.padding(\"3px\"),\n backgroundColor: \"transparent\",\n opacity: 0,\n pointerEvents: \"none\",\n transitionProperty: \"opacity\",\n transitionDuration: \"120ms\",\n \"@media (prefers-reduced-motion: reduce)\": { transitionDuration: \"0s\" },\n [`&:hover > [${SLOT_ATTR}='scroll-area-thumb']`]: {\n backgroundColor: tokens.grayA10,\n },\n [`&:active > [${SLOT_ATTR}='scroll-area-thumb']`]: {\n backgroundColor: tokens.grayA11,\n },\n \"@media (forced-colors: active)\": {\n [`& > [${SLOT_ATTR}='scroll-area-thumb']`]: {\n backgroundColor: \"ButtonText\",\n forcedColorAdjust: \"none\",\n },\n },\n },\n vertical: { width: \"12px\" },\n horizontal: { height: \"12px\", flexDirection: \"column\" },\n thumb: { backgroundColor: tokens.grayA9 },\n // Radix owns thumb length (including its 18px minimum) and uses it in drag math.\n // A CSS-only minimum overrides the paint but not that math, overshooting the track.\n corner: { backgroundColor: \"transparent\", pointerEvents: \"none\" },\n})\n\n/** Native scrolling with Radix tracks. Dimensions belong here; scroll refs belong to the viewport. */\nexport const ScrollArea = React.forwardRef<HTMLDivElement, ScrollAreaProps>(\n function ScrollArea(\n {\n orientation = \"vertical\",\n visibility = \"interaction\",\n className,\n children,\n onPointerEnter,\n onPointerLeave,\n onFocusCapture,\n onBlurCapture,\n ...props\n },\n ref\n ) {\n const styles = useStyles()\n const scrollbar = useScrollbarStyles()\n const root = React.useRef<HTMLDivElement | null>(null)\n const timer = React.useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined\n )\n const interaction = React.useRef({\n hover: false,\n focus: false,\n drag: false,\n })\n const [revealed, setRevealed] = React.useState(false)\n const clear = React.useCallback(() => {\n clearTimeout(timer.current)\n }, [])\n const reveal = React.useCallback(() => {\n clear()\n setRevealed(true)\n }, [clear])\n const settle = React.useCallback(() => {\n clear()\n if (!Object.values(interaction.current).some(Boolean)) {\n timer.current = setTimeout(() => setRevealed(false), 600)\n }\n }, [clear])\n const pulse = React.useCallback(() => {\n reveal()\n settle()\n }, [reveal, settle])\n React.useEffect(() => {\n const doc = root.current?.ownerDocument\n const endDrag = () => {\n if (interaction.current.drag) {\n interaction.current.drag = false\n settle()\n }\n }\n doc?.addEventListener(\"pointerup\", endDrag, true)\n doc?.addEventListener(\"pointercancel\", endDrag, true)\n return () => {\n clear()\n doc?.removeEventListener(\"pointerup\", endDrag, true)\n doc?.removeEventListener(\"pointercancel\", endDrag, true)\n }\n }, [clear, settle])\n const context = React.useMemo(\n () => ({ orientation, onScroll: pulse }),\n [orientation, pulse]\n )\n const tracks =\n orientation === \"both\"\n ? ([\"vertical\", \"horizontal\"] as const)\n : [orientation]\n return (\n <Context.Provider value={context}>\n <Primitive.Root\n {...props}\n type=\"auto\"\n ref={(node) => {\n root.current = node\n if (typeof ref === \"function\") ref(node)\n else if (ref) ref.current = node\n }}\n data-slot=\"scroll-area\"\n {...{ [SLOT_ATTR]: \"scroll-area\" }}\n data-orientation={orientation}\n data-revealed={visibility === \"always\" || revealed}\n className={mergeClasses(styles.root, className)}\n onPointerEnter={(event) => {\n if (event.pointerType !== \"touch\") {\n interaction.current.hover = true\n reveal()\n }\n onPointerEnter?.(event)\n }}\n onPointerLeave={(event) => {\n interaction.current.hover = false\n settle()\n onPointerLeave?.(event)\n }}\n onFocusCapture={(event) => {\n interaction.current.focus = true\n reveal()\n onFocusCapture?.(event)\n }}\n onBlurCapture={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n interaction.current.focus = false\n settle()\n }\n onBlurCapture?.(event)\n }}\n >\n {children}\n {tracks.map((axis) => (\n <Primitive.Scrollbar\n key={axis}\n orientation={axis}\n data-slot=\"scroll-area-scrollbar\"\n {...{ [SLOT_ATTR]: \"scroll-area-scrollbar\" }}\n className={mergeClasses(\n scrollbar.track,\n styles.track,\n styles[axis]\n )}\n onPointerDown={() => {\n interaction.current.drag = true\n reveal()\n }}\n >\n <Primitive.Thumb\n data-slot=\"scroll-area-thumb\"\n {...{ [SLOT_ATTR]: \"scroll-area-thumb\" }}\n className={mergeClasses(scrollbar.thumb, styles.thumb)}\n />\n </Primitive.Scrollbar>\n ))}\n {orientation === \"both\" && (\n <Primitive.Corner className={styles.corner} />\n )}\n </Primitive.Root>\n </Context.Provider>\n )\n }\n)\n\n/** Put keyboard focus, accessible naming and onScroll on this actual scroll element. */\nexport const ScrollAreaViewport = React.forwardRef<\n HTMLDivElement,\n ScrollAreaViewportProps\n>(function ScrollAreaViewport({ className, onScroll, ...props }, ref) {\n const context = React.useContext(Context)\n const styles = useStyles()\n if (!context)\n throw new Error(\"ScrollAreaViewport requires a ScrollArea parent\")\n return (\n <Primitive.Viewport\n {...props}\n ref={ref}\n data-slot=\"scroll-area-viewport\"\n {...{ [SLOT_ATTR]: \"scroll-area-viewport\" }}\n className={mergeClasses(\n styles.viewport,\n context.orientation === \"vertical\" && styles.verticalContent,\n context.orientation !== \"horizontal\" && styles.reserveVertical,\n context.orientation !== \"vertical\" && styles.reserveHorizontal,\n className\n )}\n onScroll={(event) => {\n if (event.target === event.currentTarget) {\n context.onScroll()\n onScroll?.(event)\n }\n }}\n />\n )\n})\n"],"names":["Context","React","useStyles","makeZenithStyles","shorthands","SLOT_ATTR","tokens.semFocusRing","tokens.grayA10","tokens.grayA11","tokens.grayA9","ScrollArea","orientation","visibility","className","children","onPointerEnter","onPointerLeave","onFocusCapture","onBlurCapture","props","ref","styles","scrollbar","useScrollbarStyles","root","timer","interaction","revealed","setRevealed","clear","reveal","settle","pulse","doc","_a","endDrag","context","tracks","jsx","jsxs","Primitive.Root","node","mergeClasses","event","axis","Primitive.Scrollbar","Primitive.Thumb","Primitive.Corner","ScrollAreaViewport","onScroll","Primitive.Viewport"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scroll-area.js","sources":["../../../src/components/scroll-area/scroll-area.tsx"],"sourcesContent":["import * as React from \"react\"\nimport * as Primitive from \"@radix-ui/react-scroll-area\"\nimport { mergeClasses, shorthands } from \"@epilot/zenith-runtime/v1\"\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeZenithStyles } from \"../../styles/make-styles\"\nimport * as tokens from \"../../tokens\"\nimport { useScrollbarStyles } from \"./scrollbar-styles\"\n\nexport type ScrollAreaOrientation = \"vertical\" | \"horizontal\" | \"both\"\nexport type ScrollAreaVisibility = \"interaction\" | \"always\"\nexport type ScrollAreaProps = Omit<\n React.ComponentPropsWithoutRef<typeof Primitive.Root>,\n \"asChild\" | \"type\" | \"scrollHideDelay\"\n> & {\n orientation?: ScrollAreaOrientation\n visibility?: ScrollAreaVisibility\n}\nexport type ScrollAreaViewportProps = Omit<\n React.ComponentPropsWithoutRef<typeof Primitive.Viewport>,\n \"asChild\"\n>\n\nconst Context = React.createContext<{\n orientation: ScrollAreaOrientation\n onScroll: () => void\n} | null>(null)\n\nconst useStyles = makeZenithStyles({\n root: {\n position: \"relative\",\n minWidth: 0,\n minHeight: 0,\n ...shorthands.overflow(\"hidden\"),\n [`&[data-revealed='true'] > [${SLOT_ATTR}='scroll-area-scrollbar']`]: {\n opacity: 1,\n pointerEvents: \"auto\",\n },\n \"@media (forced-colors: active)\": {\n [`& > [${SLOT_ATTR}='scroll-area-scrollbar']`]: {\n opacity: 1,\n pointerEvents: \"auto\",\n backgroundColor: \"Canvas\",\n },\n },\n },\n viewport: {\n width: \"100%\",\n height: \"100%\",\n minWidth: 0,\n minHeight: 0,\n boxSizing: \"border-box\",\n borderRadius: \"inherit\",\n \":focus-visible\": {\n outlineWidth: \"3px\",\n outlineStyle: \"solid\",\n outlineColor: tokens.focusRing,\n outlineOffset: \"-3px\",\n },\n },\n verticalContent: {\n // Radix's measurement wrapper defaults to display:table, which expands long lines.\n \"& > div\": { display: \"block\", minWidth: \"100%\" },\n },\n reserveVertical: { paddingInlineEnd: \"12px\" },\n reserveHorizontal: { paddingBottom: \"12px\" },\n track: {\n boxSizing: \"border-box\",\n ...shorthands.padding(\"3px\"),\n backgroundColor: \"transparent\",\n opacity: 0,\n pointerEvents: \"none\",\n transitionProperty: \"opacity\",\n transitionDuration: \"120ms\",\n \"@media (prefers-reduced-motion: reduce)\": { transitionDuration: \"0s\" },\n [`&:hover > [${SLOT_ATTR}='scroll-area-thumb']`]: {\n backgroundColor: tokens.grayA10,\n },\n [`&:active > [${SLOT_ATTR}='scroll-area-thumb']`]: {\n backgroundColor: tokens.grayA11,\n },\n \"@media (forced-colors: active)\": {\n [`& > [${SLOT_ATTR}='scroll-area-thumb']`]: {\n backgroundColor: \"ButtonText\",\n forcedColorAdjust: \"none\",\n },\n },\n },\n vertical: { width: \"12px\" },\n horizontal: { height: \"12px\", flexDirection: \"column\" },\n thumb: { backgroundColor: tokens.grayA9 },\n // Radix owns thumb length (including its 18px minimum) and uses it in drag math.\n // A CSS-only minimum overrides the paint but not that math, overshooting the track.\n corner: { backgroundColor: \"transparent\", pointerEvents: \"none\" },\n})\n\n/** Native scrolling with Radix tracks. Dimensions belong here; scroll refs belong to the viewport. */\nexport const ScrollArea = React.forwardRef<HTMLDivElement, ScrollAreaProps>(\n function ScrollArea(\n {\n orientation = \"vertical\",\n visibility = \"interaction\",\n className,\n children,\n onPointerEnter,\n onPointerLeave,\n onFocusCapture,\n onBlurCapture,\n ...props\n },\n ref\n ) {\n const styles = useStyles()\n const scrollbar = useScrollbarStyles()\n const root = React.useRef<HTMLDivElement | null>(null)\n const timer = React.useRef<ReturnType<typeof setTimeout> | undefined>(\n undefined\n )\n const interaction = React.useRef({\n hover: false,\n focus: false,\n drag: false,\n })\n const [revealed, setRevealed] = React.useState(false)\n const clear = React.useCallback(() => {\n clearTimeout(timer.current)\n }, [])\n const reveal = React.useCallback(() => {\n clear()\n setRevealed(true)\n }, [clear])\n const settle = React.useCallback(() => {\n clear()\n if (!Object.values(interaction.current).some(Boolean)) {\n timer.current = setTimeout(() => setRevealed(false), 600)\n }\n }, [clear])\n const pulse = React.useCallback(() => {\n reveal()\n settle()\n }, [reveal, settle])\n React.useEffect(() => {\n const doc = root.current?.ownerDocument\n const endDrag = () => {\n if (interaction.current.drag) {\n interaction.current.drag = false\n settle()\n }\n }\n doc?.addEventListener(\"pointerup\", endDrag, true)\n doc?.addEventListener(\"pointercancel\", endDrag, true)\n return () => {\n clear()\n doc?.removeEventListener(\"pointerup\", endDrag, true)\n doc?.removeEventListener(\"pointercancel\", endDrag, true)\n }\n }, [clear, settle])\n const context = React.useMemo(\n () => ({ orientation, onScroll: pulse }),\n [orientation, pulse]\n )\n const tracks =\n orientation === \"both\"\n ? ([\"vertical\", \"horizontal\"] as const)\n : [orientation]\n return (\n <Context.Provider value={context}>\n <Primitive.Root\n {...props}\n type=\"auto\"\n ref={(node) => {\n root.current = node\n if (typeof ref === \"function\") ref(node)\n else if (ref) ref.current = node\n }}\n data-slot=\"scroll-area\"\n {...{ [SLOT_ATTR]: \"scroll-area\" }}\n data-orientation={orientation}\n data-revealed={visibility === \"always\" || revealed}\n className={mergeClasses(styles.root, className)}\n onPointerEnter={(event) => {\n if (event.pointerType !== \"touch\") {\n interaction.current.hover = true\n reveal()\n }\n onPointerEnter?.(event)\n }}\n onPointerLeave={(event) => {\n interaction.current.hover = false\n settle()\n onPointerLeave?.(event)\n }}\n onFocusCapture={(event) => {\n interaction.current.focus = true\n reveal()\n onFocusCapture?.(event)\n }}\n onBlurCapture={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n interaction.current.focus = false\n settle()\n }\n onBlurCapture?.(event)\n }}\n >\n {children}\n {tracks.map((axis) => (\n <Primitive.Scrollbar\n key={axis}\n orientation={axis}\n data-slot=\"scroll-area-scrollbar\"\n {...{ [SLOT_ATTR]: \"scroll-area-scrollbar\" }}\n className={mergeClasses(\n scrollbar.track,\n styles.track,\n styles[axis]\n )}\n onPointerDown={() => {\n interaction.current.drag = true\n reveal()\n }}\n >\n <Primitive.Thumb\n data-slot=\"scroll-area-thumb\"\n {...{ [SLOT_ATTR]: \"scroll-area-thumb\" }}\n className={mergeClasses(scrollbar.thumb, styles.thumb)}\n />\n </Primitive.Scrollbar>\n ))}\n {orientation === \"both\" && (\n <Primitive.Corner className={styles.corner} />\n )}\n </Primitive.Root>\n </Context.Provider>\n )\n }\n)\n\n/** Put keyboard focus, accessible naming and onScroll on this actual scroll element. */\nexport const ScrollAreaViewport = React.forwardRef<\n HTMLDivElement,\n ScrollAreaViewportProps\n>(function ScrollAreaViewport({ className, onScroll, ...props }, ref) {\n const context = React.useContext(Context)\n const styles = useStyles()\n if (!context)\n throw new Error(\"ScrollAreaViewport requires a ScrollArea parent\")\n return (\n <Primitive.Viewport\n {...props}\n ref={ref}\n data-slot=\"scroll-area-viewport\"\n {...{ [SLOT_ATTR]: \"scroll-area-viewport\" }}\n className={mergeClasses(\n styles.viewport,\n context.orientation === \"vertical\" && styles.verticalContent,\n context.orientation !== \"horizontal\" && styles.reserveVertical,\n context.orientation !== \"vertical\" && styles.reserveHorizontal,\n className\n )}\n onScroll={(event) => {\n if (event.target === event.currentTarget) {\n context.onScroll()\n onScroll?.(event)\n }\n }}\n />\n )\n})\n"],"names":["Context","React","useStyles","makeZenithStyles","shorthands","SLOT_ATTR","tokens.focusRing","tokens.grayA10","tokens.grayA11","tokens.grayA9","ScrollArea","orientation","visibility","className","children","onPointerEnter","onPointerLeave","onFocusCapture","onBlurCapture","props","ref","styles","scrollbar","useScrollbarStyles","root","timer","interaction","revealed","setRevealed","clear","reveal","settle","pulse","doc","_a","endDrag","context","tracks","jsx","jsxs","Primitive.Root","node","mergeClasses","event","axis","Primitive.Scrollbar","Primitive.Thumb","Primitive.Corner","ScrollAreaViewport","onScroll","Primitive.Viewport"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { useRef as M, useState as k, useCallback as v, useLayoutEffect as w } fr
|
|
|
4
4
|
import { Root as O, Item as V } from "../../vendor/.bun/@radix-ui_react-radio-group@1.3.8_2b23df507bdda662/vendor/@radix-ui/react-radio-group/dist/index.js";
|
|
5
5
|
import { SLOT_ATTR as e, mergeClasses as C, shorthands as n } from "@epilot/zenith-runtime/v1";
|
|
6
6
|
import { makeZenithStyles as G } from "../../styles/make-styles.js";
|
|
7
|
-
import {
|
|
7
|
+
import { accentDefault as R, accentA8 as P, accentSoft as I, fontWeightSemibold as Y, leadingXs as Z, textXs as _, spacingElement1 as m, spacingElement3 as A, body as J } from "../../tokens/index.js";
|
|
8
8
|
const T = u.createContext({
|
|
9
9
|
layout: "hug"
|
|
10
10
|
}), W = G({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"segmented-control.js","sources":["../../../src/components/segmented-control/segmented-control.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { useCallback, useLayoutEffect, useRef, useState } from \"react\"\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\"\n\nimport { mergeClasses, shorthands } from \"@epilot/zenith-runtime/v1\"\n\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeZenithStyles } from \"../../styles/make-styles\"\nimport * as tokens from \"../../tokens\"\n\nexport type SegmentedControlLayout = \"hug\" | \"equal\" | \"stretch\"\n\nexport type SegmentedControlProps = React.ComponentProps<\n typeof RadioGroupPrimitive.Root\n> & {\n layout?: SegmentedControlLayout\n}\n\nexport type SegmentedControlItemProps = React.ComponentProps<\n typeof RadioGroupPrimitive.Item\n> & {\n icon?: React.ReactNode\n}\n\ninterface SegmentedControlContextValue {\n layout: SegmentedControlLayout\n}\n\nconst SegmentedControlContext =\n React.createContext<SegmentedControlContextValue>({\n layout: \"hug\",\n })\n\nconst useStyles = makeZenithStyles({\n group: {\n position: \"relative\",\n display: \"inline-flex\",\n alignItems: \"center\",\n ...shorthands.gap(tokens.spacingElement1),\n ...shorthands.borderRadius(\"9999px\"),\n backgroundColor: tokens.semAccentSoft,\n ...shorthands.padding(tokens.spacingElement1),\n ...shorthands.border(\"0\"),\n boxShadow: \"none\",\n },\n groupStretch: {\n display: \"flex\",\n width: \"100%\",\n },\n groupVertical: {\n flexDirection: \"column\",\n display: \"inline-flex\",\n width: \"fit-content\",\n },\n indicator: {\n pointerEvents: \"none\",\n position: \"absolute\",\n top: 0,\n left: 0,\n zIndex: 0,\n ...shorthands.borderRadius(\"9999px\"),\n backgroundColor: tokens.body,\n // Tailwind `shadow-sm`\n boxShadow: \"0 1px 2px 0 #0000000d\",\n },\n indicatorAnimated: {\n transitionProperty: \"transform, width, height\",\n transitionDuration: \"150ms\",\n transitionTimingFunction: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n },\n item: {\n position: \"relative\",\n zIndex: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n ...shorthands.gap(tokens.spacingElement1),\n ...shorthands.borderRadius(\"9999px\"),\n minWidth: \"3rem\",\n // v1 uses Tailwind's `px-3` = 0.75rem here. The semantic spacing scale has NO 0.75rem\n // token -- it runs 0.25/0.5/0.5/1/1.5/2 -- so this is a literal by necessity.\n // `spacingGroup1` is 0.5rem and reaching for it by name (as three components did)\n // silently loses 4px per side. See STATUS: the scale gap is the root cause.\n paddingLeft: tokens.spacingElement3,\n paddingRight: tokens.spacingElement3,\n paddingTop: tokens.spacingElement1,\n paddingBottom: tokens.spacingElement1,\n fontSize: tokens.textXs,\n lineHeight: tokens.leadingXs,\n fontWeight: tokens.fontWeightSemibold,\n color: tokens.semAccentDefault,\n cursor: \"pointer\",\n userSelect: \"none\",\n backgroundColor: \"transparent\",\n outlineStyle: \"none\",\n ...shorthands.border(\"0\"),\n boxShadow: \"none\",\n aspectRatio: \"auto\",\n width: \"auto\",\n height: \"auto\",\n transitionProperty: \"background-color, color\",\n transitionDuration: \"150ms\",\n transitionTimingFunction: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \":hover:not([data-checked])\": {\n backgroundColor: tokens.semAccentSoft,\n },\n \":focus-visible\": {\n outlineWidth: \"2px\",\n outlineStyle: \"solid\",\n outlineColor: tokens.accentA8,\n },\n \"&[data-disabled]\": {\n pointerEvents: \"none\",\n opacity: 0.5,\n backgroundColor: \"transparent\",\n },\n \"&[data-checked]\": {\n backgroundColor: \"transparent\",\n color: tokens.semAccentDefault,\n },\n \"&[data-checked][data-disabled]\": {\n backgroundColor: \"transparent\",\n },\n [`& [${SLOT_ATTR}=\"radio-group-indicator\"]`]: {\n display: \"none\",\n },\n // Keyed on SLOT_ATTR, never data-slot (rule 4): the composed RadioGroup emits both, and\n // data-slot values are shared with v1 so such a rule would also match v1-rendered DOM.\n [`[${SLOT_ATTR}='radio-group-indicator']`]: {\n display: \"none\",\n },\n },\n itemStretch: {\n flexGrow: 1,\n flexShrink: 1,\n flexBasis: \"0%\",\n },\n icon: {\n flexShrink: 0,\n width: \"1rem\",\n height: \"1rem\",\n pointerEvents: \"none\",\n \"& svg\": {\n width: \"100%\",\n height: \"100%\",\n display: \"block\",\n },\n },\n label: {\n lineHeight: \"1rem\",\n overflowX: \"hidden\",\n overflowY: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n})\n\nexport const SegmentedControl = React.forwardRef<\n HTMLDivElement,\n SegmentedControlProps\n>(function SegmentedControl(\n {\n className,\n layout = \"hug\",\n orientation = \"horizontal\",\n value: valueProp,\n defaultValue,\n onValueChange,\n children,\n ...props\n },\n forwardedRef\n) {\n const styles = useStyles()\n const rootRef = useRef<HTMLDivElement>(null)\n const [trackedValue, setTrackedValue] = useState(defaultValue)\n // Starts false to prevent CSS transition flash on SSR hydration\n const [indicatorReady, setIndicatorReady] = useState(false)\n const [indicatorStyle, setIndicatorStyle] = useState<React.CSSProperties>({\n opacity: 0,\n })\n\n const isControlled = valueProp !== undefined\n const currentValue = isControlled ? valueProp : trackedValue\n\n const updateIndicator = useCallback(() => {\n if (!rootRef.current) return\n const el = rootRef.current.querySelector<HTMLElement>(\n `[${SLOT_ATTR}=\"segmented-control-item\"][data-state=\"checked\"]`\n )\n if (!el) return\n setIndicatorStyle({\n opacity: 1,\n width: el.offsetWidth,\n height: el.offsetHeight,\n transform: `translate(${el.offsetLeft}px, ${el.offsetTop}px)`,\n })\n setIndicatorReady(true)\n }, [])\n\n // Must run before indicator effect so equalized widths are measured correctly\n useLayoutEffect(() => {\n if (!rootRef.current) return\n const items = Array.from(\n rootRef.current.querySelectorAll<HTMLElement>(\n `[${SLOT_ATTR}=\"segmented-control-item\"]`\n )\n )\n if (!items.length) return\n items.forEach((el) => (el.style.minWidth = \"\"))\n if (layout !== \"equal\") return\n const max = Math.max(...items.map((el) => el.offsetWidth))\n items.forEach((el) => (el.style.minWidth = `${max}px`))\n }, [layout])\n\n useLayoutEffect(() => {\n if (!indicatorReady) {\n updateIndicator()\n return\n }\n const raf = requestAnimationFrame(updateIndicator)\n return () => cancelAnimationFrame(raf)\n }, [currentValue, indicatorReady, updateIndicator])\n\n const handleValueChange = useCallback(\n (value: string) => {\n if (!isControlled) setTrackedValue(value)\n onValueChange?.(value)\n },\n [isControlled, onValueChange]\n )\n\n const handleRef = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node)\n } else if (forwardedRef) {\n forwardedRef.current = node\n }\n }\n\n const contextValue = React.useMemo(() => ({ layout }), [layout])\n\n return (\n <SegmentedControlContext.Provider value={contextValue}>\n <RadioGroupPrimitive.Root\n ref={handleRef}\n data-slot=\"segmented-control\"\n {...{ [SLOT_ATTR]: \"segmented-control\" }}\n data-layout={layout}\n value={isControlled ? valueProp : undefined}\n defaultValue={defaultValue}\n onValueChange={handleValueChange}\n orientation={orientation}\n className={mergeClasses(\n styles.group,\n layout === \"stretch\" && styles.groupStretch,\n orientation === \"vertical\" && styles.groupVertical,\n className\n )}\n {...props}\n >\n <span\n aria-hidden=\"true\"\n data-slot=\"segmented-control-indicator\"\n {...{ [SLOT_ATTR]: \"segmented-control-indicator\" }}\n className={mergeClasses(\n styles.indicator,\n indicatorReady && styles.indicatorAnimated\n )}\n style={indicatorStyle}\n />\n {children}\n </RadioGroupPrimitive.Root>\n </SegmentedControlContext.Provider>\n )\n})\n\nexport const SegmentedControlItem = React.forwardRef<\n HTMLButtonElement,\n SegmentedControlItemProps\n>(function SegmentedControlItem(\n { className, value, icon, children, ...props },\n ref\n) {\n const styles = useStyles()\n const { layout } = React.useContext(SegmentedControlContext)\n\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n value={value}\n data-slot=\"segmented-control-item\"\n {...{ [SLOT_ATTR]: \"segmented-control-item\" }}\n className={mergeClasses(\n styles.item,\n layout === \"stretch\" && styles.itemStretch,\n className\n )}\n {...props}\n >\n {icon && (\n <span\n aria-hidden=\"true\"\n data-slot=\"segmented-control-item-icon\"\n {...{ [SLOT_ATTR]: \"segmented-control-item-icon\" }}\n className={styles.icon}\n >\n {icon}\n </span>\n )}\n {children && (\n <span\n data-slot=\"segmented-control-item-label\"\n {...{ [SLOT_ATTR]: \"segmented-control-item-label\" }}\n className={styles.label}\n >\n {children}\n </span>\n )}\n </RadioGroupPrimitive.Item>\n )\n})\n"],"names":["SegmentedControlContext","React","useStyles","makeZenithStyles","shorthands","tokens.spacingElement1","tokens.semAccentSoft","tokens.body","tokens.spacingElement3","tokens.textXs","tokens.leadingXs","tokens.fontWeightSemibold","tokens.semAccentDefault","tokens.accentA8","SLOT_ATTR","SegmentedControl","className","layout","orientation","valueProp","defaultValue","onValueChange","children","props","forwardedRef","styles","rootRef","useRef","trackedValue","setTrackedValue","useState","indicatorReady","setIndicatorReady","indicatorStyle","setIndicatorStyle","isControlled","currentValue","updateIndicator","useCallback","el","useLayoutEffect","items","max","raf","handleValueChange","value","handleRef","node","contextValue","jsx","jsxs","RadioGroupPrimitive.Root","mergeClasses","SegmentedControlItem","icon","ref","RadioGroupPrimitive.Item"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"segmented-control.js","sources":["../../../src/components/segmented-control/segmented-control.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { useCallback, useLayoutEffect, useRef, useState } from \"react\"\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\"\n\nimport { mergeClasses, shorthands } from \"@epilot/zenith-runtime/v1\"\n\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeZenithStyles } from \"../../styles/make-styles\"\nimport * as tokens from \"../../tokens\"\n\nexport type SegmentedControlLayout = \"hug\" | \"equal\" | \"stretch\"\n\nexport type SegmentedControlProps = React.ComponentProps<\n typeof RadioGroupPrimitive.Root\n> & {\n layout?: SegmentedControlLayout\n}\n\nexport type SegmentedControlItemProps = React.ComponentProps<\n typeof RadioGroupPrimitive.Item\n> & {\n icon?: React.ReactNode\n}\n\ninterface SegmentedControlContextValue {\n layout: SegmentedControlLayout\n}\n\nconst SegmentedControlContext =\n React.createContext<SegmentedControlContextValue>({\n layout: \"hug\",\n })\n\nconst useStyles = makeZenithStyles({\n group: {\n position: \"relative\",\n display: \"inline-flex\",\n alignItems: \"center\",\n ...shorthands.gap(tokens.spacingElement1),\n ...shorthands.borderRadius(\"9999px\"),\n backgroundColor: tokens.accentSoft,\n ...shorthands.padding(tokens.spacingElement1),\n ...shorthands.border(\"0\"),\n boxShadow: \"none\",\n },\n groupStretch: {\n display: \"flex\",\n width: \"100%\",\n },\n groupVertical: {\n flexDirection: \"column\",\n display: \"inline-flex\",\n width: \"fit-content\",\n },\n indicator: {\n pointerEvents: \"none\",\n position: \"absolute\",\n top: 0,\n left: 0,\n zIndex: 0,\n ...shorthands.borderRadius(\"9999px\"),\n backgroundColor: tokens.body,\n // Tailwind `shadow-sm`\n boxShadow: \"0 1px 2px 0 #0000000d\",\n },\n indicatorAnimated: {\n transitionProperty: \"transform, width, height\",\n transitionDuration: \"150ms\",\n transitionTimingFunction: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n },\n item: {\n position: \"relative\",\n zIndex: 1,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n ...shorthands.gap(tokens.spacingElement1),\n ...shorthands.borderRadius(\"9999px\"),\n minWidth: \"3rem\",\n // v1 uses Tailwind's `px-3` = 0.75rem here. The semantic spacing scale has NO 0.75rem\n // token -- it runs 0.25/0.5/0.5/1/1.5/2 -- so this is a literal by necessity.\n // `spacingGroup1` is 0.5rem and reaching for it by name (as three components did)\n // silently loses 4px per side. See STATUS: the scale gap is the root cause.\n paddingLeft: tokens.spacingElement3,\n paddingRight: tokens.spacingElement3,\n paddingTop: tokens.spacingElement1,\n paddingBottom: tokens.spacingElement1,\n fontSize: tokens.textXs,\n lineHeight: tokens.leadingXs,\n fontWeight: tokens.fontWeightSemibold,\n color: tokens.accentDefault,\n cursor: \"pointer\",\n userSelect: \"none\",\n backgroundColor: \"transparent\",\n outlineStyle: \"none\",\n ...shorthands.border(\"0\"),\n boxShadow: \"none\",\n aspectRatio: \"auto\",\n width: \"auto\",\n height: \"auto\",\n transitionProperty: \"background-color, color\",\n transitionDuration: \"150ms\",\n transitionTimingFunction: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \":hover:not([data-checked])\": {\n backgroundColor: tokens.accentSoft,\n },\n \":focus-visible\": {\n outlineWidth: \"2px\",\n outlineStyle: \"solid\",\n outlineColor: tokens.accentA8,\n },\n \"&[data-disabled]\": {\n pointerEvents: \"none\",\n opacity: 0.5,\n backgroundColor: \"transparent\",\n },\n \"&[data-checked]\": {\n backgroundColor: \"transparent\",\n color: tokens.accentDefault,\n },\n \"&[data-checked][data-disabled]\": {\n backgroundColor: \"transparent\",\n },\n [`& [${SLOT_ATTR}=\"radio-group-indicator\"]`]: {\n display: \"none\",\n },\n // Keyed on SLOT_ATTR, never data-slot (rule 4): the composed RadioGroup emits both, and\n // data-slot values are shared with v1 so such a rule would also match v1-rendered DOM.\n [`[${SLOT_ATTR}='radio-group-indicator']`]: {\n display: \"none\",\n },\n },\n itemStretch: {\n flexGrow: 1,\n flexShrink: 1,\n flexBasis: \"0%\",\n },\n icon: {\n flexShrink: 0,\n width: \"1rem\",\n height: \"1rem\",\n pointerEvents: \"none\",\n \"& svg\": {\n width: \"100%\",\n height: \"100%\",\n display: \"block\",\n },\n },\n label: {\n lineHeight: \"1rem\",\n overflowX: \"hidden\",\n overflowY: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n})\n\nexport const SegmentedControl = React.forwardRef<\n HTMLDivElement,\n SegmentedControlProps\n>(function SegmentedControl(\n {\n className,\n layout = \"hug\",\n orientation = \"horizontal\",\n value: valueProp,\n defaultValue,\n onValueChange,\n children,\n ...props\n },\n forwardedRef\n) {\n const styles = useStyles()\n const rootRef = useRef<HTMLDivElement>(null)\n const [trackedValue, setTrackedValue] = useState(defaultValue)\n // Starts false to prevent CSS transition flash on SSR hydration\n const [indicatorReady, setIndicatorReady] = useState(false)\n const [indicatorStyle, setIndicatorStyle] = useState<React.CSSProperties>({\n opacity: 0,\n })\n\n const isControlled = valueProp !== undefined\n const currentValue = isControlled ? valueProp : trackedValue\n\n const updateIndicator = useCallback(() => {\n if (!rootRef.current) return\n const el = rootRef.current.querySelector<HTMLElement>(\n `[${SLOT_ATTR}=\"segmented-control-item\"][data-state=\"checked\"]`\n )\n if (!el) return\n setIndicatorStyle({\n opacity: 1,\n width: el.offsetWidth,\n height: el.offsetHeight,\n transform: `translate(${el.offsetLeft}px, ${el.offsetTop}px)`,\n })\n setIndicatorReady(true)\n }, [])\n\n // Must run before indicator effect so equalized widths are measured correctly\n useLayoutEffect(() => {\n if (!rootRef.current) return\n const items = Array.from(\n rootRef.current.querySelectorAll<HTMLElement>(\n `[${SLOT_ATTR}=\"segmented-control-item\"]`\n )\n )\n if (!items.length) return\n items.forEach((el) => (el.style.minWidth = \"\"))\n if (layout !== \"equal\") return\n const max = Math.max(...items.map((el) => el.offsetWidth))\n items.forEach((el) => (el.style.minWidth = `${max}px`))\n }, [layout])\n\n useLayoutEffect(() => {\n if (!indicatorReady) {\n updateIndicator()\n return\n }\n const raf = requestAnimationFrame(updateIndicator)\n return () => cancelAnimationFrame(raf)\n }, [currentValue, indicatorReady, updateIndicator])\n\n const handleValueChange = useCallback(\n (value: string) => {\n if (!isControlled) setTrackedValue(value)\n onValueChange?.(value)\n },\n [isControlled, onValueChange]\n )\n\n const handleRef = (node: HTMLDivElement | null) => {\n rootRef.current = node\n if (typeof forwardedRef === \"function\") {\n forwardedRef(node)\n } else if (forwardedRef) {\n forwardedRef.current = node\n }\n }\n\n const contextValue = React.useMemo(() => ({ layout }), [layout])\n\n return (\n <SegmentedControlContext.Provider value={contextValue}>\n <RadioGroupPrimitive.Root\n ref={handleRef}\n data-slot=\"segmented-control\"\n {...{ [SLOT_ATTR]: \"segmented-control\" }}\n data-layout={layout}\n value={isControlled ? valueProp : undefined}\n defaultValue={defaultValue}\n onValueChange={handleValueChange}\n orientation={orientation}\n className={mergeClasses(\n styles.group,\n layout === \"stretch\" && styles.groupStretch,\n orientation === \"vertical\" && styles.groupVertical,\n className\n )}\n {...props}\n >\n <span\n aria-hidden=\"true\"\n data-slot=\"segmented-control-indicator\"\n {...{ [SLOT_ATTR]: \"segmented-control-indicator\" }}\n className={mergeClasses(\n styles.indicator,\n indicatorReady && styles.indicatorAnimated\n )}\n style={indicatorStyle}\n />\n {children}\n </RadioGroupPrimitive.Root>\n </SegmentedControlContext.Provider>\n )\n})\n\nexport const SegmentedControlItem = React.forwardRef<\n HTMLButtonElement,\n SegmentedControlItemProps\n>(function SegmentedControlItem(\n { className, value, icon, children, ...props },\n ref\n) {\n const styles = useStyles()\n const { layout } = React.useContext(SegmentedControlContext)\n\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n value={value}\n data-slot=\"segmented-control-item\"\n {...{ [SLOT_ATTR]: \"segmented-control-item\" }}\n className={mergeClasses(\n styles.item,\n layout === \"stretch\" && styles.itemStretch,\n className\n )}\n {...props}\n >\n {icon && (\n <span\n aria-hidden=\"true\"\n data-slot=\"segmented-control-item-icon\"\n {...{ [SLOT_ATTR]: \"segmented-control-item-icon\" }}\n className={styles.icon}\n >\n {icon}\n </span>\n )}\n {children && (\n <span\n data-slot=\"segmented-control-item-label\"\n {...{ [SLOT_ATTR]: \"segmented-control-item-label\" }}\n className={styles.label}\n >\n {children}\n </span>\n )}\n </RadioGroupPrimitive.Item>\n )\n})\n"],"names":["SegmentedControlContext","React","useStyles","makeZenithStyles","shorthands","tokens.spacingElement1","tokens.accentSoft","tokens.body","tokens.spacingElement3","tokens.textXs","tokens.leadingXs","tokens.fontWeightSemibold","tokens.accentDefault","tokens.accentA8","SLOT_ATTR","SegmentedControl","className","layout","orientation","valueProp","defaultValue","onValueChange","children","props","forwardedRef","styles","rootRef","useRef","trackedValue","setTrackedValue","useState","indicatorReady","setIndicatorReady","indicatorStyle","setIndicatorStyle","isControlled","currentValue","updateIndicator","useCallback","el","useLayoutEffect","items","max","raf","handleValueChange","value","handleRef","node","contextValue","jsx","jsxs","RadioGroupPrimitive.Root","mergeClasses","SegmentedControlItem","icon","ref","RadioGroupPrimitive.Item"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { jsx as t, jsxs as h } from "react/jsx-runtime";
|
|
2
2
|
import * as s from "react";
|
|
3
|
-
import { Root as D, Portal as B, Content as L, Viewport as $, Group as k, Item as P, ItemIndicator as W, ItemText as z, Label as X, ScrollDownButton as j, ScrollUpButton as E, Separator as M, Value as U, Trigger as Y, Icon as
|
|
3
|
+
import { Root as D, Portal as B, Content as L, Viewport as $, Group as k, Item as P, ItemIndicator as W, ItemText as z, Label as X, ScrollDownButton as j, ScrollUpButton as E, Separator as M, Value as U, Trigger as Y, Icon as O } from "../../vendor/.bun/@radix-ui_react-select@2.2.6_2b23df507bdda662/vendor/@radix-ui/react-select/dist/index.js";
|
|
4
4
|
import { SLOT_ATTR as i, mergeClasses as p, shorthands as c } from "@epilot/zenith-runtime/v1";
|
|
5
|
-
import { useAppearanceAttributes as
|
|
6
|
-
import { useDensity as
|
|
7
|
-
import { makeZenithStyles as
|
|
8
|
-
import { spacingElement1 as g,
|
|
5
|
+
import { useAppearanceAttributes as Z } from "../appearance-boundary/appearance-boundary.js";
|
|
6
|
+
import { useDensity as F } from "../density-provider/density-provider.js";
|
|
7
|
+
import { makeZenithStyles as G } from "../../styles/make-styles.js";
|
|
8
|
+
import { spacingElement1 as g, graySoft as H, gray11 as V, fontWeightSemibold as _, leadingXs as J, textXs as K, spacingElement2 as d, grayA11 as f, accentA3 as S, grayA12 as y, leadingSm as b, textSm as v, selectItemPaddingY as I, selectItemPaddingLeft as Q, body as tt, accentA11 as C, focusRing as q, accentSoft as et, grayA8 as ot, radiusMd as R, radius2xl as rt, selectContentGap as at, selectContentPadding as nt, radiusLg as it } from "../../tokens/index.js";
|
|
9
9
|
const lt = (n) => /* @__PURE__ */ t(
|
|
10
10
|
"svg",
|
|
11
11
|
{
|
|
@@ -50,7 +50,7 @@ const lt = (n) => /* @__PURE__ */ t(
|
|
|
50
50
|
...n,
|
|
51
51
|
children: /* @__PURE__ */ t("path", { d: "M480-528 324-372q-11 11-28 11t-28-11q-11-11-11-28t11-28l184-184q12-12 28-12t28 12l184 184q11 11 11 28t-11 28q-11 11-28 11t-28-11L480-528Z" })
|
|
52
52
|
}
|
|
53
|
-
), u =
|
|
53
|
+
), u = G({
|
|
54
54
|
trigger: {
|
|
55
55
|
display: "flex",
|
|
56
56
|
width: "100%",
|
|
@@ -373,7 +373,7 @@ const lt = (n) => /* @__PURE__ */ t(
|
|
|
373
373
|
children: [
|
|
374
374
|
e,
|
|
375
375
|
/* @__PURE__ */ t(
|
|
376
|
-
|
|
376
|
+
O,
|
|
377
377
|
{
|
|
378
378
|
asChild: !0,
|
|
379
379
|
"data-slot": "select-icon",
|
|
@@ -413,16 +413,16 @@ const lt = (n) => /* @__PURE__ */ t(
|
|
|
413
413
|
align: l = "center",
|
|
414
414
|
container: r,
|
|
415
415
|
...m
|
|
416
|
-
},
|
|
417
|
-
const w = u(), x =
|
|
416
|
+
}, N) {
|
|
417
|
+
const w = u(), x = F(), A = Z();
|
|
418
418
|
return /* @__PURE__ */ t(B, { container: r, children: /* @__PURE__ */ h(
|
|
419
419
|
L,
|
|
420
420
|
{
|
|
421
|
-
ref:
|
|
421
|
+
ref: N,
|
|
422
422
|
"data-slot": "select-content",
|
|
423
423
|
[i]: "select-content",
|
|
424
424
|
...x !== void 0 ? { "data-density": x } : {},
|
|
425
|
-
...
|
|
425
|
+
...A,
|
|
426
426
|
position: a,
|
|
427
427
|
align: l,
|
|
428
428
|
className: p(w.popup, o),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.js","sources":["../../../src/components/select/select.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { mergeClasses, shorthands } from \"@epilot/zenith-runtime/v1\"\n\nimport { useAppearanceAttributes } from \"../appearance-boundary/appearance-boundary\"\nimport { useDensity } from \"../density-provider/density-provider\"\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeZenithStyles } from \"../../styles/make-styles\"\nimport * as tokens from \"../../tokens\"\n\nconst XIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 -960 960 960\"\n width=\"24px\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M480-424 284-228q-11 11-28 11t-28-11q-11-11-11-28t11-28l196-196-196-196q-11-11-11-28t11-28q11-11 28-11t28 11l196 196 196-196q11-11 28-11t28 11q11 11 11 28t-11 28L536-480l196 196q11 11 11 28t-11 28q-11 11-28 11t-28-11L480-424Z\" />\n </svg>\n)\n\nconst CheckIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 -960 960 960\"\n width=\"24px\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"m382-354 339-339q12-12 28-12t28 12q12 12 12 28.5T777-636L410-268q-12 12-28 12t-28-12L182-440q-12-12-11.5-28.5T183-497q12-12 28.5-12t28.5 12l142 143Z\" />\n </svg>\n)\n\nconst ChevronDownIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 -960 960 960\"\n width=\"24px\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M459-381 314-526q-3-3-4.5-6.5T308-540q0-8 5.5-14t14.5-6h304q9 0 14.5 6t5.5 14q0 2-6 14L501-381q-5 5-10 7t-11 2q-6 0-11-2t-10-7Z\" />\n </svg>\n)\n\nconst ChevronUpIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 -960 960 960\"\n width=\"24px\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M480-528 324-372q-11 11-28 11t-28-11q-11-11-11-28t11-28l184-184q12-12 28-12t28 12l184 184q11 11 11 28t-11 28q-11 11-28 11t-28-11L480-528Z\" />\n </svg>\n)\n\nconst useStyles = makeZenithStyles({\n trigger: {\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n ...shorthands.gap(tokens.spacingElement2),\n ...shorthands.borderRadius(tokens.radiusLg),\n backgroundColor: \"transparent\",\n fontSize: tokens.textSm,\n lineHeight: tokens.leadingSm,\n outlineStyle: \"none\",\n whiteSpace: \"normal\",\n textAlign: \"left\",\n cursor: \"pointer\",\n transitionProperty: \"color, box-shadow\",\n transitionDuration: \"150ms\",\n transitionTimingFunction: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"@media (prefers-reduced-motion: reduce)\": {\n transitionDuration: \"0.01ms\",\n },\n \":focus-visible\": {\n outlineWidth: \"2px\",\n outlineStyle: \"solid\",\n outlineOffset: \"2px\",\n outlineColor: tokens.semFocusRing,\n },\n \":disabled\": {\n cursor: \"not-allowed\",\n opacity: 0.5,\n },\n \"&[data-placeholder]\": {\n color: tokens.grayA8,\n },\n \"& svg\": {\n pointerEvents: \"none\",\n flexShrink: 0,\n },\n [`& [${SLOT_ATTR}=\"select-value\"]`]: {\n display: \"flex\",\n alignItems: \"center\",\n ...shorthands.gap(tokens.spacingElement2),\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n\n // The open-state chevron rotation is declared HERE, on the trigger that carries the state\n // attribute, reaching the icon by SLOT_ATTR.\n [`&[data-state='open'] [${SLOT_ATTR}=\"select-icon\"] svg`]: {\n transform: \"rotate(180deg)\",\n },\n [`&[data-state='open'] [${SLOT_ATTR}=\"select-icon\"]`]: {\n transform: \"rotate(180deg)\",\n },\n [`&[data-open] [${SLOT_ATTR}=\"select-icon\"] svg`]: {\n transform: \"rotate(180deg)\",\n },\n [`&[data-popup-open] [${SLOT_ATTR}=\"select-icon\"] svg`]: {\n transform: \"rotate(180deg)\",\n },\n },\n triggerIconWrapper: {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n },\n triggerIcon: {\n width: \"1.5rem\",\n height: \"1.5rem\",\n color: tokens.grayA11,\n transitionProperty: \"transform\",\n transitionDuration: \"150ms\",\n transitionTimingFunction: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"@media (prefers-reduced-motion: reduce)\": {\n transitionDuration: \"0.01ms\",\n },\n },\n triggerClear: {\n position: \"absolute\",\n right: \"2.75rem\",\n paddingTop: \"0.125rem\",\n paddingBottom: \"0.125rem\",\n paddingLeft: \"0.125rem\",\n paddingRight: \"0.125rem\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"transparent\",\n color: tokens.accentA11,\n cursor: \"pointer\",\n ...shorthands.borderRadius(tokens.radiusMd),\n \":hover\": {\n backgroundColor: tokens.semAccentSoft,\n },\n \":focus-visible\": {\n outlineColor: tokens.semFocusRing,\n outlineWidth: \"2px\",\n outlineStyle: \"solid\",\n outlineOffset: \"2px\",\n },\n },\n triggerClearIcon: {\n width: \"1.25rem\",\n height: \"1.25rem\",\n color: tokens.accentA11,\n },\n popup: {\n backgroundColor: tokens.body,\n // DENSITY-SPEC.md §2.3 — popup padding/gap only; the slide-in animation offsets a few lines\n // below deliberately keep the plain (non-density) `spacingElement2` value: they are not in the\n // approved matrix, and re-using the same primitive for two unrelated purposes doesn't make the\n // animation distance a density lever too.\n ...shorthands.padding(tokens.selectContentPadding),\n ...shorthands.gap(tokens.selectContentGap),\n color: tokens.grayA12,\n position: \"relative\",\n zIndex: 50,\n transformOrigin: \"var(--radix-select-content-transform-origin)\",\n overflowX: \"hidden\",\n overflowY: \"auto\",\n ...shorthands.borderRadius(tokens.radius2xl),\n ...shorthands.border(\"1px\", \"solid\", \"transparent\"),\n // v1 shadow-md\n boxShadow: \"0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a\",\n outlineStyle: \"none\",\n maxHeight: \"var(--radix-popper-available-height, 20rem)\",\n \"@media (prefers-reduced-motion: reduce)\": {\n animationDuration: \"0.01ms\",\n animationIterationCount: \"1\",\n \"&[data-state='open']\": {\n animationDuration: \"0.01ms\",\n },\n },\n \"&[data-state='open']\": {\n animationName: {\n from: { opacity: 0, transform: \"scale(0.95)\" },\n to: { opacity: 1, transform: \"scale(1)\" },\n },\n animationDuration: \"150ms\",\n animationTimingFunction: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n },\n \"&[data-state='open'][data-side='bottom']\": {\n animationName: {\n from: {\n opacity: 0,\n transform: `translateY(-${tokens.spacingElement2}) scale(0.95)`,\n },\n to: { opacity: 1, transform: \"translateY(0) scale(1)\" },\n },\n },\n \"&[data-state='open'][data-side='left']\": {\n animationName: {\n from: {\n opacity: 0,\n transform: `translateX(${tokens.spacingElement2}) scale(0.95)`,\n },\n to: { opacity: 1, transform: \"translateX(0) scale(1)\" },\n },\n },\n \"&[data-state='open'][data-side='right']\": {\n animationName: {\n from: {\n opacity: 0,\n transform: `translateX(-${tokens.spacingElement2}) scale(0.95)`,\n },\n to: { opacity: 1, transform: \"translateX(0) scale(1)\" },\n },\n },\n \"&[data-state='open'][data-side='top']\": {\n animationName: {\n from: {\n opacity: 0,\n transform: `translateY(${tokens.spacingElement2}) scale(0.95)`,\n },\n to: { opacity: 1, transform: \"translateY(0) scale(1)\" },\n },\n },\n \"&[data-state='closed']\": {\n animationName: {\n from: { opacity: 1, transform: \"scale(1)\" },\n to: { opacity: 0, transform: \"scale(0.95)\" },\n },\n animationDuration: \"100ms\",\n animationTimingFunction: \"cubic-bezier(0.4, 0, 1, 1)\",\n },\n },\n viewport: {\n width: \"100%\",\n minWidth: \"var(--radix-select-trigger-width)\",\n scrollMarginTop: tokens.spacingElement1,\n scrollMarginBottom: tokens.spacingElement1,\n },\n item: {\n position: \"relative\",\n display: \"flex\",\n width: \"100%\",\n cursor: \"default\",\n userSelect: \"none\",\n alignItems: \"center\",\n ...shorthands.gap(tokens.spacingElement2),\n ...shorthands.borderRadius(tokens.radiusMd),\n // DENSITY-SPEC.md §2.3 — left padding and vertical padding are density levers; right padding\n // stays a fixed 32px at every tier (reserves the check-indicator's space, not modeled in\n // density.yaml).\n paddingLeft: tokens.selectItemPaddingLeft,\n paddingRight: \"2rem\",\n paddingTop: tokens.selectItemPaddingY,\n paddingBottom: tokens.selectItemPaddingY,\n fontSize: tokens.textSm,\n lineHeight: tokens.leadingSm,\n color: tokens.grayA12,\n outlineStyle: \"none\",\n \":not(:first-child)\": {\n marginTop: \"0.125rem\",\n },\n \"&[data-highlighted]\": {\n backgroundColor: tokens.accentA3,\n },\n \"&[data-state='checked']\": {\n backgroundColor: tokens.accentA3,\n },\n \"&[data-disabled]\": {\n pointerEvents: \"none\",\n opacity: 0.5,\n },\n \"& svg\": {\n pointerEvents: \"none\",\n flexShrink: 0,\n },\n \"& svg:not([class*='text-'])\": {\n color: tokens.grayA11,\n },\n },\n itemIndicatorWrapper: {\n position: \"absolute\",\n right: tokens.spacingElement2,\n display: \"flex\",\n width: \"1rem\",\n height: \"1rem\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n itemIndicatorIcon: {\n width: \"1rem\",\n height: \"1rem\",\n color: tokens.grayA11,\n },\n label: {\n paddingLeft: tokens.spacingElement2,\n paddingRight: tokens.spacingElement2,\n paddingTop: \"0.375rem\",\n paddingBottom: \"0.375rem\",\n fontSize: tokens.textXs,\n lineHeight: tokens.leadingXs,\n fontWeight: tokens.fontWeightSemibold,\n color: tokens.gray11,\n },\n separator: {\n pointerEvents: \"none\",\n marginLeft: `calc(-1 * ${tokens.spacingElement1})`,\n marginRight: `calc(-1 * ${tokens.spacingElement1})`,\n marginTop: tokens.spacingElement1,\n marginBottom: tokens.spacingElement1,\n height: \"1px\",\n backgroundColor: tokens.semGraySoft,\n },\n scrollArrow: {\n display: \"flex\",\n cursor: \"default\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n scrollArrowUp: {\n paddingBottom: tokens.spacingElement1,\n },\n scrollArrowDown: {\n paddingTop: tokens.spacingElement1,\n },\n scrollArrowIcon: {\n width: \"1.5rem\",\n height: \"1.5rem\",\n },\n scrollArrowDownIcon: {\n transform: \"rotate(180deg)\",\n },\n})\n\nexport type SelectProps = React.ComponentProps<typeof SelectPrimitive.Root>\n\nexport const Select: React.ForwardRefExoticComponent<\n SelectProps & React.RefAttributes<HTMLElement>\n> = React.forwardRef<HTMLElement, SelectProps>(function Select(props, _ref) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n})\n\nexport type SelectGroupProps = React.ComponentProps<\n typeof SelectPrimitive.Group\n>\n\nexport const SelectGroup = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Group>,\n SelectGroupProps\n>(function SelectGroup({ className, ...props }, ref) {\n return (\n <SelectPrimitive.Group\n ref={ref}\n data-slot=\"select-group\"\n {...{ [SLOT_ATTR]: \"select-group\" }}\n className={className}\n {...props}\n />\n )\n})\n\nexport type SelectValueProps = React.ComponentProps<\n typeof SelectPrimitive.Value\n>\n\nexport const SelectValue = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Value>,\n SelectValueProps\n>(function SelectValue({ className, ...props }, ref) {\n return (\n <SelectPrimitive.Value\n ref={ref}\n data-slot=\"select-value\"\n {...{ [SLOT_ATTR]: \"select-value\" }}\n className={className}\n {...props}\n />\n )\n})\n\nexport type SelectTriggerProps = React.ComponentProps<\n typeof SelectPrimitive.Trigger\n>\n\nexport const SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n SelectTriggerProps\n>(function SelectTrigger({ className, children, ...props }, ref) {\n const styles = useStyles()\n\n return (\n <SelectPrimitive.Trigger\n ref={ref}\n data-slot=\"select-trigger\"\n {...{ [SLOT_ATTR]: \"select-trigger\" }}\n className={mergeClasses(styles.trigger, className)}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon\n asChild\n data-slot=\"select-icon\"\n {...{ [SLOT_ATTR]: \"select-icon\" }}\n className={styles.triggerIconWrapper}\n >\n <ChevronDownIcon className={styles.triggerIcon} />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n})\n\nexport type SelectTriggerClearProps = React.ComponentProps<\"span\">\n\nexport const SelectTriggerClear = React.forwardRef<\n HTMLSpanElement,\n SelectTriggerClearProps\n>(function SelectTriggerClear({ className, onClick, ...props }, ref) {\n const styles = useStyles()\n\n return (\n <span\n ref={ref}\n role=\"button\"\n tabIndex={0}\n data-slot=\"select-trigger-clear\"\n {...{ [SLOT_ATTR]: \"select-trigger-clear\" }}\n className={mergeClasses(styles.triggerClear, className)}\n onPointerDown={(event) => {\n event.preventDefault()\n event.stopPropagation()\n }}\n onClick={(event: React.MouseEvent<HTMLSpanElement>) => {\n event.preventDefault()\n event.stopPropagation()\n onClick?.(event)\n }}\n {...props}\n >\n <XIcon className={styles.triggerClearIcon} />\n </span>\n )\n})\n\nexport type SelectContentProps = React.ComponentProps<\n typeof SelectPrimitive.Content\n> & {\n container?: React.ComponentProps<typeof SelectPrimitive.Portal>[\"container\"]\n}\n\nexport const SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n SelectContentProps\n>(function SelectContent(\n {\n className,\n children,\n position = \"popper\",\n align = \"center\",\n container,\n ...props\n },\n ref\n) {\n const styles = useStyles()\n // DENSITY-SPEC.md §4.4 — SelectContent is a portal root: stamp the explicit override ONLY when\n // one exists in the React tree, so an ambient shell default (which already reaches this portal\n // via ordinary DOM inheritance, since the portal container is still a descendant of `<html>`)\n // isn't masked by a stale/default value.\n const override = useDensity()\n // SPEC.md §2 rule 3 — the same portal asymmetry, for the appearance pair: re-stamp the\n // nearest explicit AppearanceBoundary's mode+surface, or neither attribute when there is\n // none, leaving live shell inheritance in place.\n const appearance = useAppearanceAttributes()\n\n return (\n <SelectPrimitive.Portal container={container}>\n <SelectPrimitive.Content\n ref={ref}\n data-slot=\"select-content\"\n {...{ [SLOT_ATTR]: \"select-content\" }}\n {...(override !== undefined ? { \"data-density\": override } : {})}\n {...appearance}\n position={position}\n align={align}\n className={mergeClasses(styles.popup, className)}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n data-slot=\"select-viewport\"\n {...{ [SLOT_ATTR]: \"select-viewport\" }}\n className={styles.viewport}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n})\n\nexport type SelectLabelProps = React.ComponentProps<\n typeof SelectPrimitive.Label\n>\n\nexport const SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n SelectLabelProps\n>(function SelectLabel({ className, ...props }, ref) {\n const styles = useStyles()\n\n return (\n <SelectPrimitive.Label\n ref={ref}\n data-slot=\"select-label\"\n {...{ [SLOT_ATTR]: \"select-label\" }}\n className={mergeClasses(styles.label, className)}\n {...props}\n />\n )\n})\n\nexport type SelectItemProps = React.ComponentProps<typeof SelectPrimitive.Item>\n\nexport const SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n SelectItemProps\n>(function SelectItem({ className, children, ...props }, ref) {\n const styles = useStyles()\n\n return (\n <SelectPrimitive.Item\n ref={ref}\n data-slot=\"select-item\"\n {...{ [SLOT_ATTR]: \"select-item\" }}\n className={mergeClasses(styles.item, className)}\n {...props}\n >\n <span className={styles.itemIndicatorWrapper}>\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className={styles.itemIndicatorIcon} />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n})\n\nexport type SelectSeparatorProps = React.ComponentProps<\n typeof SelectPrimitive.Separator\n>\n\nexport const SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n SelectSeparatorProps\n>(function SelectSeparator({ className, ...props }, ref) {\n const styles = useStyles()\n\n return (\n <SelectPrimitive.Separator\n ref={ref}\n data-slot=\"select-separator\"\n {...{ [SLOT_ATTR]: \"select-separator\" }}\n className={mergeClasses(styles.separator, className)}\n {...props}\n />\n )\n})\n\nexport type SelectScrollUpButtonProps = React.ComponentProps<\n typeof SelectPrimitive.ScrollUpButton\n>\n\nexport const SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n SelectScrollUpButtonProps\n>(function SelectScrollUpButton({ className, children, ...props }, ref) {\n const styles = useStyles()\n\n return (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n data-slot=\"select-scroll-up-button\"\n {...{ [SLOT_ATTR]: \"select-scroll-up-button\" }}\n className={mergeClasses(\n styles.scrollArrow,\n styles.scrollArrowUp,\n className\n )}\n {...props}\n >\n {children ?? <ChevronUpIcon className={styles.scrollArrowIcon} />}\n </SelectPrimitive.ScrollUpButton>\n )\n})\n\nexport type SelectScrollDownButtonProps = React.ComponentProps<\n typeof SelectPrimitive.ScrollDownButton\n>\n\nexport const SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n SelectScrollDownButtonProps\n>(function SelectScrollDownButton({ className, children, ...props }, ref) {\n const styles = useStyles()\n\n return (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n data-slot=\"select-scroll-down-button\"\n {...{ [SLOT_ATTR]: \"select-scroll-down-button\" }}\n className={mergeClasses(\n styles.scrollArrow,\n styles.scrollArrowDown,\n className\n )}\n {...props}\n >\n {children ?? (\n <ChevronUpIcon\n className={mergeClasses(\n styles.scrollArrowIcon,\n styles.scrollArrowDownIcon\n )}\n />\n )}\n </SelectPrimitive.ScrollDownButton>\n )\n})\n"],"names":["XIcon","props","jsx","CheckIcon","ChevronDownIcon","ChevronUpIcon","useStyles","makeZenithStyles","shorthands","tokens.spacingElement2","tokens.radiusLg","tokens.textSm","tokens.leadingSm","tokens.semFocusRing","tokens.grayA8","SLOT_ATTR","tokens.grayA11","tokens.accentA11","tokens.radiusMd","tokens.semAccentSoft","tokens.body","tokens.selectContentPadding","tokens.selectContentGap","tokens.grayA12","tokens.radius2xl","tokens.spacingElement1","tokens.selectItemPaddingLeft","tokens.selectItemPaddingY","tokens.accentA3","tokens.textXs","tokens.leadingXs","tokens.fontWeightSemibold","tokens.gray11","tokens.semGraySoft","Select","React","_ref","SelectPrimitive.Root","SelectGroup","className","ref","SelectPrimitive.Group","SelectValue","SelectPrimitive.Value","SelectTrigger","children","styles","jsxs","SelectPrimitive.Trigger","mergeClasses","SelectPrimitive.Icon","SelectTriggerClear","onClick","event","SelectContent","position","align","container","override","useDensity","appearance","useAppearanceAttributes","SelectPrimitive.Portal","SelectPrimitive.Content","SelectScrollUpButton","SelectPrimitive.Viewport","SelectScrollDownButton","SelectLabel","SelectPrimitive.Label","SelectItem","SelectPrimitive.Item","SelectPrimitive.ItemIndicator","SelectPrimitive.ItemText","SelectSeparator","SelectPrimitive.Separator","SelectPrimitive.ScrollUpButton","SelectPrimitive.ScrollDownButton"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"select.js","sources":["../../../src/components/select/select.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { mergeClasses, shorthands } from \"@epilot/zenith-runtime/v1\"\n\nimport { useAppearanceAttributes } from \"../appearance-boundary/appearance-boundary\"\nimport { useDensity } from \"../density-provider/density-provider\"\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeZenithStyles } from \"../../styles/make-styles\"\nimport * as tokens from \"../../tokens\"\n\nconst XIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 -960 960 960\"\n width=\"24px\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M480-424 284-228q-11 11-28 11t-28-11q-11-11-11-28t11-28l196-196-196-196q-11-11-11-28t11-28q11-11 28-11t28 11l196 196 196-196q11-11 28-11t28 11q11 11 11 28t-11 28L536-480l196 196q11 11 11 28t-11 28q-11 11-28 11t-28-11L480-424Z\" />\n </svg>\n)\n\nconst CheckIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 -960 960 960\"\n width=\"24px\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"m382-354 339-339q12-12 28-12t28 12q12 12 12 28.5T777-636L410-268q-12 12-28 12t-28-12L182-440q-12-12-11.5-28.5T183-497q12-12 28.5-12t28.5 12l142 143Z\" />\n </svg>\n)\n\nconst ChevronDownIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 -960 960 960\"\n width=\"24px\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M459-381 314-526q-3-3-4.5-6.5T308-540q0-8 5.5-14t14.5-6h304q9 0 14.5 6t5.5 14q0 2-6 14L501-381q-5 5-10 7t-11 2q-6 0-11-2t-10-7Z\" />\n </svg>\n)\n\nconst ChevronUpIcon = (props: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 -960 960 960\"\n width=\"24px\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M480-528 324-372q-11 11-28 11t-28-11q-11-11-11-28t11-28l184-184q12-12 28-12t28 12l184 184q11 11 11 28t-11 28q-11 11-28 11t-28-11L480-528Z\" />\n </svg>\n)\n\nconst useStyles = makeZenithStyles({\n trigger: {\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n ...shorthands.gap(tokens.spacingElement2),\n ...shorthands.borderRadius(tokens.radiusLg),\n backgroundColor: \"transparent\",\n fontSize: tokens.textSm,\n lineHeight: tokens.leadingSm,\n outlineStyle: \"none\",\n whiteSpace: \"normal\",\n textAlign: \"left\",\n cursor: \"pointer\",\n transitionProperty: \"color, box-shadow\",\n transitionDuration: \"150ms\",\n transitionTimingFunction: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"@media (prefers-reduced-motion: reduce)\": {\n transitionDuration: \"0.01ms\",\n },\n \":focus-visible\": {\n outlineWidth: \"2px\",\n outlineStyle: \"solid\",\n outlineOffset: \"2px\",\n outlineColor: tokens.focusRing,\n },\n \":disabled\": {\n cursor: \"not-allowed\",\n opacity: 0.5,\n },\n \"&[data-placeholder]\": {\n color: tokens.grayA8,\n },\n \"& svg\": {\n pointerEvents: \"none\",\n flexShrink: 0,\n },\n [`& [${SLOT_ATTR}=\"select-value\"]`]: {\n display: \"flex\",\n alignItems: \"center\",\n ...shorthands.gap(tokens.spacingElement2),\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n\n // The open-state chevron rotation is declared HERE, on the trigger that carries the state\n // attribute, reaching the icon by SLOT_ATTR.\n [`&[data-state='open'] [${SLOT_ATTR}=\"select-icon\"] svg`]: {\n transform: \"rotate(180deg)\",\n },\n [`&[data-state='open'] [${SLOT_ATTR}=\"select-icon\"]`]: {\n transform: \"rotate(180deg)\",\n },\n [`&[data-open] [${SLOT_ATTR}=\"select-icon\"] svg`]: {\n transform: \"rotate(180deg)\",\n },\n [`&[data-popup-open] [${SLOT_ATTR}=\"select-icon\"] svg`]: {\n transform: \"rotate(180deg)\",\n },\n },\n triggerIconWrapper: {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n },\n triggerIcon: {\n width: \"1.5rem\",\n height: \"1.5rem\",\n color: tokens.grayA11,\n transitionProperty: \"transform\",\n transitionDuration: \"150ms\",\n transitionTimingFunction: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"@media (prefers-reduced-motion: reduce)\": {\n transitionDuration: \"0.01ms\",\n },\n },\n triggerClear: {\n position: \"absolute\",\n right: \"2.75rem\",\n paddingTop: \"0.125rem\",\n paddingBottom: \"0.125rem\",\n paddingLeft: \"0.125rem\",\n paddingRight: \"0.125rem\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"transparent\",\n color: tokens.accentA11,\n cursor: \"pointer\",\n ...shorthands.borderRadius(tokens.radiusMd),\n \":hover\": {\n backgroundColor: tokens.accentSoft,\n },\n \":focus-visible\": {\n outlineColor: tokens.focusRing,\n outlineWidth: \"2px\",\n outlineStyle: \"solid\",\n outlineOffset: \"2px\",\n },\n },\n triggerClearIcon: {\n width: \"1.25rem\",\n height: \"1.25rem\",\n color: tokens.accentA11,\n },\n popup: {\n backgroundColor: tokens.body,\n // DENSITY-SPEC.md §2.3 — popup padding/gap only; the slide-in animation offsets a few lines\n // below deliberately keep the plain (non-density) `spacingElement2` value: they are not in the\n // approved matrix, and re-using the same primitive for two unrelated purposes doesn't make the\n // animation distance a density lever too.\n ...shorthands.padding(tokens.selectContentPadding),\n ...shorthands.gap(tokens.selectContentGap),\n color: tokens.grayA12,\n position: \"relative\",\n zIndex: 50,\n transformOrigin: \"var(--radix-select-content-transform-origin)\",\n overflowX: \"hidden\",\n overflowY: \"auto\",\n ...shorthands.borderRadius(tokens.radius2xl),\n ...shorthands.border(\"1px\", \"solid\", \"transparent\"),\n // v1 shadow-md\n boxShadow: \"0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a\",\n outlineStyle: \"none\",\n maxHeight: \"var(--radix-popper-available-height, 20rem)\",\n \"@media (prefers-reduced-motion: reduce)\": {\n animationDuration: \"0.01ms\",\n animationIterationCount: \"1\",\n \"&[data-state='open']\": {\n animationDuration: \"0.01ms\",\n },\n },\n \"&[data-state='open']\": {\n animationName: {\n from: { opacity: 0, transform: \"scale(0.95)\" },\n to: { opacity: 1, transform: \"scale(1)\" },\n },\n animationDuration: \"150ms\",\n animationTimingFunction: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n },\n \"&[data-state='open'][data-side='bottom']\": {\n animationName: {\n from: {\n opacity: 0,\n transform: `translateY(-${tokens.spacingElement2}) scale(0.95)`,\n },\n to: { opacity: 1, transform: \"translateY(0) scale(1)\" },\n },\n },\n \"&[data-state='open'][data-side='left']\": {\n animationName: {\n from: {\n opacity: 0,\n transform: `translateX(${tokens.spacingElement2}) scale(0.95)`,\n },\n to: { opacity: 1, transform: \"translateX(0) scale(1)\" },\n },\n },\n \"&[data-state='open'][data-side='right']\": {\n animationName: {\n from: {\n opacity: 0,\n transform: `translateX(-${tokens.spacingElement2}) scale(0.95)`,\n },\n to: { opacity: 1, transform: \"translateX(0) scale(1)\" },\n },\n },\n \"&[data-state='open'][data-side='top']\": {\n animationName: {\n from: {\n opacity: 0,\n transform: `translateY(${tokens.spacingElement2}) scale(0.95)`,\n },\n to: { opacity: 1, transform: \"translateY(0) scale(1)\" },\n },\n },\n \"&[data-state='closed']\": {\n animationName: {\n from: { opacity: 1, transform: \"scale(1)\" },\n to: { opacity: 0, transform: \"scale(0.95)\" },\n },\n animationDuration: \"100ms\",\n animationTimingFunction: \"cubic-bezier(0.4, 0, 1, 1)\",\n },\n },\n viewport: {\n width: \"100%\",\n minWidth: \"var(--radix-select-trigger-width)\",\n scrollMarginTop: tokens.spacingElement1,\n scrollMarginBottom: tokens.spacingElement1,\n },\n item: {\n position: \"relative\",\n display: \"flex\",\n width: \"100%\",\n cursor: \"default\",\n userSelect: \"none\",\n alignItems: \"center\",\n ...shorthands.gap(tokens.spacingElement2),\n ...shorthands.borderRadius(tokens.radiusMd),\n // DENSITY-SPEC.md §2.3 — left padding and vertical padding are density levers; right padding\n // stays a fixed 32px at every tier (reserves the check-indicator's space, not modeled in\n // density.yaml).\n paddingLeft: tokens.selectItemPaddingLeft,\n paddingRight: \"2rem\",\n paddingTop: tokens.selectItemPaddingY,\n paddingBottom: tokens.selectItemPaddingY,\n fontSize: tokens.textSm,\n lineHeight: tokens.leadingSm,\n color: tokens.grayA12,\n outlineStyle: \"none\",\n \":not(:first-child)\": {\n marginTop: \"0.125rem\",\n },\n \"&[data-highlighted]\": {\n backgroundColor: tokens.accentA3,\n },\n \"&[data-state='checked']\": {\n backgroundColor: tokens.accentA3,\n },\n \"&[data-disabled]\": {\n pointerEvents: \"none\",\n opacity: 0.5,\n },\n \"& svg\": {\n pointerEvents: \"none\",\n flexShrink: 0,\n },\n \"& svg:not([class*='text-'])\": {\n color: tokens.grayA11,\n },\n },\n itemIndicatorWrapper: {\n position: \"absolute\",\n right: tokens.spacingElement2,\n display: \"flex\",\n width: \"1rem\",\n height: \"1rem\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n itemIndicatorIcon: {\n width: \"1rem\",\n height: \"1rem\",\n color: tokens.grayA11,\n },\n label: {\n paddingLeft: tokens.spacingElement2,\n paddingRight: tokens.spacingElement2,\n paddingTop: \"0.375rem\",\n paddingBottom: \"0.375rem\",\n fontSize: tokens.textXs,\n lineHeight: tokens.leadingXs,\n fontWeight: tokens.fontWeightSemibold,\n color: tokens.gray11,\n },\n separator: {\n pointerEvents: \"none\",\n marginLeft: `calc(-1 * ${tokens.spacingElement1})`,\n marginRight: `calc(-1 * ${tokens.spacingElement1})`,\n marginTop: tokens.spacingElement1,\n marginBottom: tokens.spacingElement1,\n height: \"1px\",\n backgroundColor: tokens.graySoft,\n },\n scrollArrow: {\n display: \"flex\",\n cursor: \"default\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n scrollArrowUp: {\n paddingBottom: tokens.spacingElement1,\n },\n scrollArrowDown: {\n paddingTop: tokens.spacingElement1,\n },\n scrollArrowIcon: {\n width: \"1.5rem\",\n height: \"1.5rem\",\n },\n scrollArrowDownIcon: {\n transform: \"rotate(180deg)\",\n },\n})\n\nexport type SelectProps = React.ComponentProps<typeof SelectPrimitive.Root>\n\nexport const Select: React.ForwardRefExoticComponent<\n SelectProps & React.RefAttributes<HTMLElement>\n> = React.forwardRef<HTMLElement, SelectProps>(function Select(props, _ref) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n})\n\nexport type SelectGroupProps = React.ComponentProps<\n typeof SelectPrimitive.Group\n>\n\nexport const SelectGroup = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Group>,\n SelectGroupProps\n>(function SelectGroup({ className, ...props }, ref) {\n return (\n <SelectPrimitive.Group\n ref={ref}\n data-slot=\"select-group\"\n {...{ [SLOT_ATTR]: \"select-group\" }}\n className={className}\n {...props}\n />\n )\n})\n\nexport type SelectValueProps = React.ComponentProps<\n typeof SelectPrimitive.Value\n>\n\nexport const SelectValue = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Value>,\n SelectValueProps\n>(function SelectValue({ className, ...props }, ref) {\n return (\n <SelectPrimitive.Value\n ref={ref}\n data-slot=\"select-value\"\n {...{ [SLOT_ATTR]: \"select-value\" }}\n className={className}\n {...props}\n />\n )\n})\n\nexport type SelectTriggerProps = React.ComponentProps<\n typeof SelectPrimitive.Trigger\n>\n\nexport const SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n SelectTriggerProps\n>(function SelectTrigger({ className, children, ...props }, ref) {\n const styles = useStyles()\n\n return (\n <SelectPrimitive.Trigger\n ref={ref}\n data-slot=\"select-trigger\"\n {...{ [SLOT_ATTR]: \"select-trigger\" }}\n className={mergeClasses(styles.trigger, className)}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon\n asChild\n data-slot=\"select-icon\"\n {...{ [SLOT_ATTR]: \"select-icon\" }}\n className={styles.triggerIconWrapper}\n >\n <ChevronDownIcon className={styles.triggerIcon} />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n})\n\nexport type SelectTriggerClearProps = React.ComponentProps<\"span\">\n\nexport const SelectTriggerClear = React.forwardRef<\n HTMLSpanElement,\n SelectTriggerClearProps\n>(function SelectTriggerClear({ className, onClick, ...props }, ref) {\n const styles = useStyles()\n\n return (\n <span\n ref={ref}\n role=\"button\"\n tabIndex={0}\n data-slot=\"select-trigger-clear\"\n {...{ [SLOT_ATTR]: \"select-trigger-clear\" }}\n className={mergeClasses(styles.triggerClear, className)}\n onPointerDown={(event) => {\n event.preventDefault()\n event.stopPropagation()\n }}\n onClick={(event: React.MouseEvent<HTMLSpanElement>) => {\n event.preventDefault()\n event.stopPropagation()\n onClick?.(event)\n }}\n {...props}\n >\n <XIcon className={styles.triggerClearIcon} />\n </span>\n )\n})\n\nexport type SelectContentProps = React.ComponentProps<\n typeof SelectPrimitive.Content\n> & {\n container?: React.ComponentProps<typeof SelectPrimitive.Portal>[\"container\"]\n}\n\nexport const SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n SelectContentProps\n>(function SelectContent(\n {\n className,\n children,\n position = \"popper\",\n align = \"center\",\n container,\n ...props\n },\n ref\n) {\n const styles = useStyles()\n // DENSITY-SPEC.md §4.4 — SelectContent is a portal root: stamp the explicit override ONLY when\n // one exists in the React tree, so an ambient shell default (which already reaches this portal\n // via ordinary DOM inheritance, since the portal container is still a descendant of `<html>`)\n // isn't masked by a stale/default value.\n const override = useDensity()\n // SPEC.md §2 rule 3 — the same portal asymmetry, for the appearance pair: re-stamp the\n // nearest explicit AppearanceBoundary's mode+surface, or neither attribute when there is\n // none, leaving live shell inheritance in place.\n const appearance = useAppearanceAttributes()\n\n return (\n <SelectPrimitive.Portal container={container}>\n <SelectPrimitive.Content\n ref={ref}\n data-slot=\"select-content\"\n {...{ [SLOT_ATTR]: \"select-content\" }}\n {...(override !== undefined ? { \"data-density\": override } : {})}\n {...appearance}\n position={position}\n align={align}\n className={mergeClasses(styles.popup, className)}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n data-slot=\"select-viewport\"\n {...{ [SLOT_ATTR]: \"select-viewport\" }}\n className={styles.viewport}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n})\n\nexport type SelectLabelProps = React.ComponentProps<\n typeof SelectPrimitive.Label\n>\n\nexport const SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n SelectLabelProps\n>(function SelectLabel({ className, ...props }, ref) {\n const styles = useStyles()\n\n return (\n <SelectPrimitive.Label\n ref={ref}\n data-slot=\"select-label\"\n {...{ [SLOT_ATTR]: \"select-label\" }}\n className={mergeClasses(styles.label, className)}\n {...props}\n />\n )\n})\n\nexport type SelectItemProps = React.ComponentProps<typeof SelectPrimitive.Item>\n\nexport const SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n SelectItemProps\n>(function SelectItem({ className, children, ...props }, ref) {\n const styles = useStyles()\n\n return (\n <SelectPrimitive.Item\n ref={ref}\n data-slot=\"select-item\"\n {...{ [SLOT_ATTR]: \"select-item\" }}\n className={mergeClasses(styles.item, className)}\n {...props}\n >\n <span className={styles.itemIndicatorWrapper}>\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className={styles.itemIndicatorIcon} />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n})\n\nexport type SelectSeparatorProps = React.ComponentProps<\n typeof SelectPrimitive.Separator\n>\n\nexport const SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n SelectSeparatorProps\n>(function SelectSeparator({ className, ...props }, ref) {\n const styles = useStyles()\n\n return (\n <SelectPrimitive.Separator\n ref={ref}\n data-slot=\"select-separator\"\n {...{ [SLOT_ATTR]: \"select-separator\" }}\n className={mergeClasses(styles.separator, className)}\n {...props}\n />\n )\n})\n\nexport type SelectScrollUpButtonProps = React.ComponentProps<\n typeof SelectPrimitive.ScrollUpButton\n>\n\nexport const SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n SelectScrollUpButtonProps\n>(function SelectScrollUpButton({ className, children, ...props }, ref) {\n const styles = useStyles()\n\n return (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n data-slot=\"select-scroll-up-button\"\n {...{ [SLOT_ATTR]: \"select-scroll-up-button\" }}\n className={mergeClasses(\n styles.scrollArrow,\n styles.scrollArrowUp,\n className\n )}\n {...props}\n >\n {children ?? <ChevronUpIcon className={styles.scrollArrowIcon} />}\n </SelectPrimitive.ScrollUpButton>\n )\n})\n\nexport type SelectScrollDownButtonProps = React.ComponentProps<\n typeof SelectPrimitive.ScrollDownButton\n>\n\nexport const SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n SelectScrollDownButtonProps\n>(function SelectScrollDownButton({ className, children, ...props }, ref) {\n const styles = useStyles()\n\n return (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n data-slot=\"select-scroll-down-button\"\n {...{ [SLOT_ATTR]: \"select-scroll-down-button\" }}\n className={mergeClasses(\n styles.scrollArrow,\n styles.scrollArrowDown,\n className\n )}\n {...props}\n >\n {children ?? (\n <ChevronUpIcon\n className={mergeClasses(\n styles.scrollArrowIcon,\n styles.scrollArrowDownIcon\n )}\n />\n )}\n </SelectPrimitive.ScrollDownButton>\n )\n})\n"],"names":["XIcon","props","jsx","CheckIcon","ChevronDownIcon","ChevronUpIcon","useStyles","makeZenithStyles","shorthands","tokens.spacingElement2","tokens.radiusLg","tokens.textSm","tokens.leadingSm","tokens.focusRing","tokens.grayA8","SLOT_ATTR","tokens.grayA11","tokens.accentA11","tokens.radiusMd","tokens.accentSoft","tokens.body","tokens.selectContentPadding","tokens.selectContentGap","tokens.grayA12","tokens.radius2xl","tokens.spacingElement1","tokens.selectItemPaddingLeft","tokens.selectItemPaddingY","tokens.accentA3","tokens.textXs","tokens.leadingXs","tokens.fontWeightSemibold","tokens.gray11","tokens.graySoft","Select","React","_ref","SelectPrimitive.Root","SelectGroup","className","ref","SelectPrimitive.Group","SelectValue","SelectPrimitive.Value","SelectTrigger","children","styles","jsxs","SelectPrimitive.Trigger","mergeClasses","SelectPrimitive.Icon","SelectTriggerClear","onClick","event","SelectContent","position","align","container","override","useDensity","appearance","useAppearanceAttributes","SelectPrimitive.Portal","SelectPrimitive.Content","SelectScrollUpButton","SelectPrimitive.Viewport","SelectScrollDownButton","SelectLabel","SelectPrimitive.Label","SelectItem","SelectPrimitive.Item","SelectPrimitive.ItemIndicator","SelectPrimitive.ItemText","SelectSeparator","SelectPrimitive.Separator","SelectPrimitive.ScrollUpButton","SelectPrimitive.ScrollDownButton"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"separator.js","sources":["../../../src/components/separator/separator.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { mergeClasses } from \"@epilot/zenith-runtime/v1\"\n\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeZenithStyles } from \"../../styles/make-styles\"\nimport * as tokens from \"../../tokens\"\n\n/**\n * Separator — v1's `@radix-ui/react-separator` ported to Griffel atoms with no Radix dependency
|
|
1
|
+
{"version":3,"file":"separator.js","sources":["../../../src/components/separator/separator.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { mergeClasses } from \"@epilot/zenith-runtime/v1\"\n\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeZenithStyles } from \"../../styles/make-styles\"\nimport * as tokens from \"../../tokens\"\n\n/**\n * Separator — v1's `@radix-ui/react-separator` ported to Griffel atoms with no Radix dependency. A\n * separator needs no behaviour beyond correct semantics, so it is a plain `<div>`.\n */\n\nexport type SeparatorOrientation = \"horizontal\" | \"vertical\"\n\nconst useStyles = makeZenithStyles({\n horizontal: {\n backgroundColor: tokens.grayA5,\n flexShrink: 0,\n height: \"1px\",\n width: \"100%\",\n },\n vertical: {\n backgroundColor: tokens.grayA5,\n flexShrink: 0,\n height: \"100%\",\n width: \"1px\",\n },\n})\n\nexport type SeparatorProps = React.ComponentProps<\"div\"> & {\n orientation?: SeparatorOrientation\n /**\n * When `true` the separator is purely decorative and is hidden from assistive technology\n * (`aria-hidden=\"true\"`, no `role`). When `false` it is a meaningful separator and gets\n * `role=\"separator\"` plus `aria-orientation`.\n */\n decorative?: boolean\n}\n\nexport const Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n function Separator(\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) {\n const styles = useStyles()\n\n const meaningful = !decorative\n\n return (\n <div\n ref={ref}\n data-slot=\"separator\"\n {...{ [SLOT_ATTR]: \"separator\" }}\n data-orientation={orientation}\n role={meaningful ? \"separator\" : undefined}\n aria-orientation={meaningful ? orientation : undefined}\n aria-hidden={decorative ? \"true\" : undefined}\n className={mergeClasses(styles[orientation], className)}\n {...props}\n />\n )\n }\n)\n"],"names":["useStyles","makeZenithStyles","tokens.grayA5","Separator","React","className","orientation","decorative","props","ref","styles","meaningful","jsx","SLOT_ATTR","mergeClasses"],"mappings":";;;;;AAeA,MAAMA,IAAYC,EAAiB;AAAA,EACjC,YAAY;AAAA,IACV,iBAAiBC;AAAAA,IACjB,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,OAAO;AAAA,EAAA;AAAA,EAET,UAAU;AAAA,IACR,iBAAiBA;AAAAA,IACjB,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,OAAO;AAAA,EAAA;AAEX,CAAC,GAYYC,IAAYC,EAAM;AAAA,EAC7B,SACE,EAAE,WAAAC,GAAW,aAAAC,IAAc,cAAc,YAAAC,IAAa,IAAM,GAAGC,EAAA,GAC/DC,GACA;AACA,UAAMC,IAASV,EAAA,GAETW,IAAa,CAACJ;AAEpB,WACE,gBAAAK;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAH;AAAA,QACA,aAAU;AAAA,QACJ,CAACI,CAAS,GAAG;AAAA,QACnB,oBAAkBP;AAAA,QAClB,MAAMK,IAAa,cAAc;AAAA,QACjC,oBAAkBA,IAAaL,IAAc;AAAA,QAC7C,eAAaC,IAAa,SAAS;AAAA,QACnC,WAAWO,EAAaJ,EAAOJ,CAAW,GAAGD,CAAS;AAAA,QACrD,GAAGG;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skeleton.js","sources":["../../../src/components/skeleton/skeleton.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { mergeClasses, shorthands } from \"@epilot/zenith-runtime/v1\"\n\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeZenithStyles } from \"../../styles/make-styles\"\nimport * as tokens from \"../../tokens\"\nimport { useZenithPaletteTokensWhen } from \"../../tokens/use-palette-tokens\"\n\n/**\n * Skeleton — v1's loading placeholder ported to Griffel atoms
|
|
1
|
+
{"version":3,"file":"skeleton.js","sources":["../../../src/components/skeleton/skeleton.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { mergeClasses, shorthands } from \"@epilot/zenith-runtime/v1\"\n\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeZenithStyles } from \"../../styles/make-styles\"\nimport * as tokens from \"../../tokens\"\nimport { useZenithPaletteTokensWhen } from \"../../tokens/use-palette-tokens\"\n\n/**\n * Skeleton — v1's loading placeholder ported to Griffel atoms. Two variants, `default` and `ai`.\n */\n\nexport type SkeletonVariant = \"default\" | \"ai\"\n\nconst useStyles = makeZenithStyles({\n default: {\n backgroundColor: tokens.gray4,\n ...shorthands.borderRadius(tokens.radiusMd),\n animationName: {\n \"0%,100%\": { opacity: 1 },\n \"50%\": { opacity: 0.5 },\n },\n animationDuration: \"2s\",\n animationTimingFunction: \"cubic-bezier(0.4,0,0.6,1)\",\n animationIterationCount: \"infinite\",\n },\n ai: {\n backgroundColor: tokens.gray3,\n ...shorthands.borderRadius(tokens.radiusMd),\n position: \"relative\",\n ...shorthands.overflow(\"hidden\"),\n },\n spot: {\n position: \"absolute\",\n inset: \"-50%\",\n ...shorthands.borderRadius(\"50%\"),\n opacity: 0.6,\n filter: \"blur(18px)\",\n pointerEvents: \"none\",\n },\n spot1: {\n backgroundImage: `radial-gradient(circle, ${tokens.purpleA4} 0%, transparent 65%)`,\n animationName: {\n \"0%,100%\": { transform: \"translate(-20%, 0%) scale(1)\" },\n \"33%\": { transform: \"translate(40%, -25%) scale(1.2)\" },\n \"66%\": { transform: \"translate(-10%, 30%) scale(0.9)\" },\n },\n animationDuration: \"10s\",\n animationTimingFunction: \"ease-in-out\",\n animationIterationCount: \"infinite\",\n },\n spot2: {\n backgroundImage: `radial-gradient(circle, ${tokens.pinkA4} 0%, transparent 65%)`,\n animationName: {\n \"0%,100%\": { transform: \"translate(20%, 0%) scale(1.1)\" },\n \"33%\": { transform: \"translate(-35%, 25%) scale(0.9)\" },\n \"66%\": { transform: \"translate(30%, -20%) scale(1.3)\" },\n },\n animationDuration: \"12s\",\n animationTimingFunction: \"ease-in-out\",\n animationIterationCount: \"infinite\",\n },\n spot3: {\n backgroundImage: `radial-gradient(circle, ${tokens.indigoA4} 0%, transparent 65%)`,\n animationName: {\n \"0%,100%\": { transform: \"translate(0%, 20%) scale(1)\" },\n \"33%\": { transform: \"translate(25%, -30%) scale(1.2)\" },\n \"66%\": { transform: \"translate(-30%, 10%) scale(0.8)\" },\n },\n animationDuration: \"14s\",\n animationTimingFunction: \"ease-in-out\",\n animationIterationCount: \"infinite\",\n },\n})\n\nexport type SkeletonProps = React.ComponentProps<\"div\"> & {\n /**\n * `default` is the ordinary loading pulse. `ai` is the placeholder for content being generated,\n * drawn with three drifting colour spots.\n */\n variant?: SkeletonVariant\n}\n\nexport const Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n function Skeleton(\n { variant = \"default\", className, children, ...props },\n ref\n ) {\n // The decorative families live in the palette sheet, which is not installed by default\n // (CONVENTIONS rule 3). Only the `ai` variant paints them — purple-a4, pink-a4, indigo-a4.\n // The hook is called unconditionally every render (WP2B2 — hook order); the `variant === \"ai\"`\n // branch lives inside its commit-phase effect, not around this call, so the default variant\n // still installs nothing it never reads.\n useZenithPaletteTokensWhen(variant === \"ai\")\n\n const styles = useStyles()\n\n if (variant === \"ai\") {\n return (\n <div\n ref={ref}\n data-slot=\"skeleton\"\n {...{ [SLOT_ATTR]: \"skeleton\" }}\n className={mergeClasses(styles.ai, className)}\n {...props}\n >\n <span\n aria-hidden=\"true\"\n className={mergeClasses(styles.spot, styles.spot1)}\n />\n <span\n aria-hidden=\"true\"\n className={mergeClasses(styles.spot, styles.spot2)}\n />\n <span\n aria-hidden=\"true\"\n className={mergeClasses(styles.spot, styles.spot3)}\n />\n {children}\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n data-slot=\"skeleton\"\n {...{ [SLOT_ATTR]: \"skeleton\" }}\n className={mergeClasses(styles.default, className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n"],"names":["useStyles","makeZenithStyles","tokens.gray4","shorthands","tokens.radiusMd","tokens.gray3","tokens.purpleA4","tokens.pinkA4","tokens.indigoA4","Skeleton","React","variant","className","children","props","ref","useZenithPaletteTokensWhen","styles","jsxs","SLOT_ATTR","mergeClasses","jsx"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose-as-child.js","sources":["../../../src/components/slot/compose-as-child.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { mergeClasses } from \"@epilot/zenith-runtime/v1\"\nimport { Slot } from \"@radix-ui/react-slot\"\n\n/**\n * The Radix Slot is still responsible for its established prop contract: it composes event\n * handlers and refs, and gives an existing child's inline style precedence. Its built-in className\n * merge is string concatenation, however, which cannot collapse competing Griffel atomic groups.\n *
|
|
1
|
+
{"version":3,"file":"compose-as-child.js","sources":["../../../src/components/slot/compose-as-child.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { mergeClasses } from \"@epilot/zenith-runtime/v1\"\nimport { Slot } from \"@radix-ui/react-slot\"\n\n/**\n * The Radix Slot is still responsible for its established prop contract: it composes event\n * handlers and refs, and gives an existing child's inline style precedence. Its built-in className\n * merge is string concatenation, however, which cannot collapse competing Griffel atomic groups.\n * @internal composition plumbing for `asChild`, not a component. Its only callers are Surface and\n */\nexport type ComposeAsChildProps = Omit<\n React.ComponentPropsWithoutRef<typeof Slot>,\n \"children\" | \"className\"\n> & {\n children: React.ReactElement\n className?: string\n /** Values which must win over raw child props (appearance's canonical DOM pair). */\n forceProps?: Record<string, unknown>\n}\n\nexport const ComposeAsChild = React.forwardRef<\n HTMLElement,\n ComposeAsChildProps\n>(function ComposeAsChild(\n { children, className, forceProps, ...slotProps },\n forwardedRef\n) {\n const child = React.Children.only(children)\n\n if (child.type === React.Fragment)\n throw new Error(\"asChild requires one real element, not a React.Fragment\")\n\n const classedChild = child as React.ReactElement<{ className?: string }>\n const childWithMergedClasses = React.cloneElement(classedChild, {\n ...forceProps,\n // Child classes first makes the composer's role recipe authoritative; its caller class is\n // appended by the composer and can then deliberately override the recipe. Inline child\n // styles still win through Radix Slot's normal style merge.\n className: mergeClasses(classedChild.props.className, className),\n })\n\n return (\n <Slot {...slotProps} ref={forwardedRef}>\n {childWithMergedClasses}\n </Slot>\n )\n})\n"],"names":["ComposeAsChild","React","children","className","forceProps","slotProps","forwardedRef","child","classedChild","childWithMergedClasses","mergeClasses","Slot"],"mappings":";;;;AAqBO,MAAMA,IAAiBC,EAAM,WAGlC,SACA,EAAE,UAAAC,GAAU,WAAAC,GAAW,YAAAC,GAAY,GAAGC,EAAA,GACtCC,GACA;AACA,QAAMC,IAAQN,EAAM,SAAS,KAAKC,CAAQ;AAE1C,MAAIK,EAAM,SAASN,EAAM;AACvB,UAAM,IAAI,MAAM,yDAAyD;AAE3E,QAAMO,IAAeD,GACfE,IAAyBR,EAAM,aAAaO,GAAc;AAAA,IAC9D,GAAGJ;AAAA;AAAA;AAAA;AAAA,IAIH,WAAWM,EAAaF,EAAa,MAAM,WAAWL,CAAS;AAAA,EAAA,CAChE;AAED,2BACGQ,GAAA,EAAM,GAAGN,GAAW,KAAKC,GACvB,UAAAG,GACH;AAEJ,CAAC;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spinner.js","sources":["../../../src/components/spinner/spinner.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { mergeClasses } from \"@epilot/zenith-runtime/v1\"\n\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeZenithStyles } from \"../../styles/make-styles\"\n\n/**\n * Spinner — v1's SVG spinner ported to a size-driven style object.\n *\n * v1 sizes this with Tailwind `size-*` utilities and deprecated the `size` prop in favour of a\n * `className` like `size-4`. There is no Tailwind here, so that escape hatch does not exist
|
|
1
|
+
{"version":3,"file":"spinner.js","sources":["../../../src/components/spinner/spinner.tsx"],"sourcesContent":["import * as React from \"react\"\n\nimport { mergeClasses } from \"@epilot/zenith-runtime/v1\"\n\nimport { SLOT_ATTR } from \"../../renderer/contract\"\nimport { makeZenithStyles } from \"../../styles/make-styles\"\n\n/**\n * Spinner — v1's SVG spinner ported to a size-driven style object.\n *\n * v1 sizes this with Tailwind `size-*` utilities and deprecated the `size` prop in favour of a\n * `className` like `size-4`. There is no Tailwind here, so that escape hatch does not exist:\n * `size` is the supported API and the `@deprecated` tag is dropped (CONVENTIONS rule 9).\n */\n\nexport type SpinnerSize = \"sm\" | \"base\" | \"lg\" | \"xl\" | \"2xl\"\n\nconst useStyles = makeZenithStyles({\n sm: {\n width: \"1rem\",\n height: \"1rem\",\n },\n base: {\n width: \"1.5rem\",\n height: \"1.5rem\",\n },\n lg: {\n width: \"2.5rem\",\n height: \"2.5rem\",\n },\n xl: {\n width: \"4rem\",\n height: \"4rem\",\n },\n \"2xl\": {\n width: \"6rem\",\n height: \"6rem\",\n },\n spin: {\n transformOrigin: \"center\",\n animationName: {\n \"100%\": { transform: \"rotate(360deg)\" },\n },\n animationDuration: \"2s\",\n animationTimingFunction: \"linear\",\n animationIterationCount: \"infinite\",\n },\n dash: {\n animationName: {\n \"0%\": {\n strokeDasharray: \"0 150\",\n strokeDashoffset: 0,\n },\n \"47.5%\": {\n strokeDasharray: \"42 150\",\n strokeDashoffset: -16,\n },\n \"95%,100%\": {\n strokeDasharray: \"42 150\",\n strokeDashoffset: -59,\n },\n },\n animationDuration: \"1.5s\",\n animationTimingFunction: \"ease-in-out\",\n animationIterationCount: \"infinite\",\n },\n})\n\nexport type SpinnerProps = React.ComponentProps<\"svg\"> & {\n size?: SpinnerSize\n}\n\nexport const Spinner = React.forwardRef<SVGSVGElement, SpinnerProps>(\n function Spinner({ size = \"base\", className, ...props }, ref) {\n const styles = useStyles()\n\n return (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n role=\"status\"\n data-slot=\"spinner\"\n {...{ [SLOT_ATTR]: \"spinner\" }}\n className={mergeClasses(styles[size], className)}\n {...props}\n >\n <g className={styles.spin}>\n <circle cx=\"12\" cy=\"12\" r=\"9.5\" strokeWidth=\"3\" opacity=\"0.1\" />\n <circle\n className={styles.dash}\n cx=\"12\"\n cy=\"12\"\n r=\"9.5\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </g>\n </svg>\n )\n }\n)\n"],"names":["useStyles","makeZenithStyles","Spinner","React","size","className","props","ref","styles","jsx","SLOT_ATTR","mergeClasses","jsxs"],"mappings":";;;;AAiBA,MAAMA,IAAYC,EAAiB;AAAA,EACjC,IAAI;AAAA,IACF,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,IAAI;AAAA,IACF,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,IAAI;AAAA,IACF,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,OAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,EAAA;AAAA,EAEV,MAAM;AAAA,IACJ,iBAAiB;AAAA,IACjB,eAAe;AAAA,MACb,QAAQ,EAAE,WAAW,iBAAA;AAAA,IAAiB;AAAA,IAExC,mBAAmB;AAAA,IACnB,yBAAyB;AAAA,IACzB,yBAAyB;AAAA,EAAA;AAAA,EAE3B,MAAM;AAAA,IACJ,eAAe;AAAA,MACb,MAAM;AAAA,QACJ,iBAAiB;AAAA,QACjB,kBAAkB;AAAA,MAAA;AAAA,MAEpB,SAAS;AAAA,QACP,iBAAiB;AAAA,QACjB,kBAAkB;AAAA,MAAA;AAAA,MAEpB,YAAY;AAAA,QACV,iBAAiB;AAAA,QACjB,kBAAkB;AAAA,MAAA;AAAA,IACpB;AAAA,IAEF,mBAAmB;AAAA,IACnB,yBAAyB;AAAA,IACzB,yBAAyB;AAAA,EAAA;AAE7B,CAAC,GAMYC,IAAUC,EAAM;AAAA,EAC3B,SAAiB,EAAE,MAAAC,IAAO,QAAQ,WAAAC,GAAW,GAAGC,EAAA,GAASC,GAAK;AAC5D,UAAMC,IAASR,EAAA;AAEf,WACE,gBAAAS;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAF;AAAA,QACA,OAAM;AAAA,QACN,OAAM;AAAA,QACN,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,QAAO;AAAA,QACP,MAAK;AAAA,QACL,aAAU;AAAA,QACJ,CAACG,CAAS,GAAG;AAAA,QACnB,WAAWC,EAAaH,EAAOJ,CAAI,GAAGC,CAAS;AAAA,QAC9C,GAAGC;AAAA,QAEJ,UAAA,gBAAAM,EAAC,KAAA,EAAE,WAAWJ,EAAO,MACnB,UAAA;AAAA,UAAA,gBAAAC,EAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,OAAM,aAAY,KAAI,SAAQ,MAAA,CAAM;AAAA,UAC9D,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWD,EAAO;AAAA,cAClB,IAAG;AAAA,cACH,IAAG;AAAA,cACH,GAAE;AAAA,cACF,aAAY;AAAA,cACZ,eAAc;AAAA,cACd,MAAK;AAAA,YAAA;AAAA,UAAA;AAAA,QACP,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;"}
|