@epilot/zenith-react 0.2.0-next.0 → 0.2.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/accordion/accordion.js +57 -48
- package/dist/components/accordion/accordion.js.map +1 -1
- package/dist/components/alert-dialog/alert-dialog.js +120 -92
- package/dist/components/alert-dialog/alert-dialog.js.map +1 -1
- package/dist/components/avatar/avatar-group.js +38 -35
- package/dist/components/avatar/avatar-group.js.map +1 -1
- package/dist/components/avatar/avatar.js +78 -71
- package/dist/components/avatar/avatar.js.map +1 -1
- package/dist/components/badge/badge.js +60 -55
- package/dist/components/badge/badge.js.map +1 -1
- package/dist/components/breadcrumb/breadcrumb.js +99 -54
- package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
- package/dist/components/button/button.js +87 -77
- package/dist/components/button/button.js.map +1 -1
- package/dist/components/button-group/button-group.js +36 -32
- package/dist/components/button-group/button-group.js.map +1 -1
- package/dist/components/callout/callout.js +105 -98
- package/dist/components/callout/callout.js.map +1 -1
- package/dist/components/card/card.js +62 -52
- package/dist/components/card/card.js.map +1 -1
- package/dist/components/checkbox/checkbox.js +22 -19
- package/dist/components/checkbox/checkbox.js.map +1 -1
- package/dist/components/code-block/code-block.js +135 -123
- package/dist/components/code-block/code-block.js.map +1 -1
- package/dist/components/code-editor/code-editor.js +276 -260
- package/dist/components/code-editor/code-editor.js.map +1 -1
- package/dist/components/collapsible-sidebar/collapsible-sidebar.js +62 -56
- package/dist/components/collapsible-sidebar/collapsible-sidebar.js.map +1 -1
- package/dist/components/command/command.js +116 -105
- package/dist/components/command/command.js.map +1 -1
- package/dist/components/data-table/data-table-body.js +38 -34
- package/dist/components/data-table/data-table-body.js.map +1 -1
- package/dist/components/data-table/data-table-column-header.js +30 -26
- package/dist/components/data-table/data-table-column-header.js.map +1 -1
- package/dist/components/data-table/data-table-column-order.js +79 -73
- package/dist/components/data-table/data-table-column-order.js.map +1 -1
- package/dist/components/data-table/data-table-column-visibility.js +25 -22
- package/dist/components/data-table/data-table-column-visibility.js.map +1 -1
- package/dist/components/data-table/data-table-content.js +47 -44
- package/dist/components/data-table/data-table-content.js.map +1 -1
- package/dist/components/data-table/data-table-error.js +36 -32
- package/dist/components/data-table/data-table-error.js.map +1 -1
- package/dist/components/data-table/data-table-footer.js +10 -8
- package/dist/components/data-table/data-table-footer.js.map +1 -1
- package/dist/components/data-table/data-table-header-draggable.js +40 -36
- package/dist/components/data-table/data-table-header-draggable.js.map +1 -1
- package/dist/components/data-table/data-table-loading.js +21 -18
- package/dist/components/data-table/data-table-loading.js.map +1 -1
- package/dist/components/data-table/data-table-resize-handle.js +13 -11
- package/dist/components/data-table/data-table-resize-handle.js.map +1 -1
- package/dist/components/data-table/data-table-row.js +47 -44
- package/dist/components/data-table/data-table-row.js.map +1 -1
- package/dist/components/data-table/data-table-toolbar.js +9 -7
- package/dist/components/data-table/data-table-toolbar.js.map +1 -1
- package/dist/components/data-table/data-table.js +48 -46
- package/dist/components/data-table/data-table.js.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.js +173 -164
- package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
- package/dist/components/date-range-picker/range-calendar.js +36 -34
- package/dist/components/date-range-picker/range-calendar.js.map +1 -1
- package/dist/components/date-time-picker/calendar.js +290 -272
- package/dist/components/date-time-picker/calendar.js.map +1 -1
- package/dist/components/date-time-picker/date-time-picker-input.js +22 -20
- package/dist/components/date-time-picker/date-time-picker-input.js.map +1 -1
- package/dist/components/date-time-picker/date-time-picker-panel.js +126 -120
- package/dist/components/date-time-picker/date-time-picker-panel.js.map +1 -1
- package/dist/components/date-time-picker/date-time-picker.js +42 -40
- package/dist/components/date-time-picker/date-time-picker.js.map +1 -1
- package/dist/components/date-time-picker/time-picker.js +95 -87
- package/dist/components/date-time-picker/time-picker.js.map +1 -1
- package/dist/components/dialog/dialog.js +115 -95
- package/dist/components/dialog/dialog.js.map +1 -1
- package/dist/components/drawer/drawer.js +144 -109
- package/dist/components/drawer/drawer.js.map +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.js +141 -112
- package/dist/components/dropdown-menu/dropdown-menu.js.map +1 -1
- package/dist/components/field/field-combobox.js +196 -176
- package/dist/components/field/field-combobox.js.map +1 -1
- package/dist/components/field/field.js +137 -126
- package/dist/components/field/field.js.map +1 -1
- package/dist/components/list/list.js +237 -219
- package/dist/components/list/list.js.map +1 -1
- package/dist/components/option-card/option-card.js +129 -116
- package/dist/components/option-card/option-card.js.map +1 -1
- package/dist/components/pill/pill.js +55 -51
- package/dist/components/pill/pill.js.map +1 -1
- package/dist/components/popover/popover.js +53 -36
- package/dist/components/popover/popover.js.map +1 -1
- package/dist/components/radio/radio.js +38 -34
- package/dist/components/radio/radio.js.map +1 -1
- package/dist/components/scroll-area/scroll-area.js +38 -35
- package/dist/components/scroll-area/scroll-area.js.map +1 -1
- package/dist/components/scroll-overflow/scroll-overflow.js +166 -151
- package/dist/components/scroll-overflow/scroll-overflow.js.map +1 -1
- package/dist/components/segmented-control/segmented-control.js +93 -85
- package/dist/components/segmented-control/segmented-control.js.map +1 -1
- package/dist/components/select/select.js +149 -128
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/separator/separator.js +19 -16
- package/dist/components/separator/separator.js.map +1 -1
- package/dist/components/skeleton/skeleton.js +34 -30
- package/dist/components/skeleton/skeleton.js.map +1 -1
- package/dist/components/spinner/spinner.js +22 -17
- package/dist/components/spinner/spinner.js.map +1 -1
- package/dist/components/surface/surface.js +25 -22
- package/dist/components/surface/surface.js.map +1 -1
- package/dist/components/switch/switch.js +66 -57
- package/dist/components/switch/switch.js.map +1 -1
- package/dist/components/table/table-pagination.js +139 -129
- package/dist/components/table/table-pagination.js.map +1 -1
- package/dist/components/table/table.js +104 -90
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/tabs/tabs.js +206 -128
- package/dist/components/tabs/tabs.js.map +1 -1
- package/dist/components/toast/toast.js +112 -100
- package/dist/components/toast/toast.js.map +1 -1
- package/dist/components/toggle/toggle.js +32 -30
- package/dist/components/toggle/toggle.js.map +1 -1
- package/dist/components/tooltip/tooltip.js +59 -46
- package/dist/components/tooltip/tooltip.js.map +1 -1
- package/dist/index.d.ts +12 -0
- package/dist/lib/clear-button.js +18 -17
- package/dist/lib/clear-button.js.map +1 -1
- package/dist/styles/host-reset.js +47 -0
- package/dist/styles/host-reset.js.map +1 -0
- package/dist/styles/overlay-layer.js +5 -0
- package/dist/styles/overlay-layer.js.map +1 -0
- package/dist/tokens.json +1 -1
- package/package.json +8 -7
- package/scripts/migration-diagnostics.mjs +42 -7
- package/scripts/migration-sweep.mjs +9 -1
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { jsx as
|
|
1
|
+
import { jsx as b } from "react/jsx-runtime";
|
|
2
2
|
import * as S from "react";
|
|
3
|
-
import { mergeClasses as
|
|
4
|
-
import { makeZenithStyles as
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { NS as E } from "../../tokens/
|
|
9
|
-
import {
|
|
10
|
-
|
|
3
|
+
import { mergeClasses as y, SLOT_ATTR as v, shorthands as x } from "@epilot/zenith-runtime/v1";
|
|
4
|
+
import { makeZenithStyles as w } from "../../styles/make-styles.js";
|
|
5
|
+
import { boxModel as o } from "../../styles/host-reset.js";
|
|
6
|
+
import { radiusMd as $, spacingElement3 as z, spacingElement1 as i, textBase as C, radiusSm as R, spacingElement2 as O, textSm as k, textXs as A, errorA8 as B, accentA8 as N, fontWeightNormal as T } from "../../tokens/index.js";
|
|
7
|
+
import { useZenithPaletteTokensFor as W } from "../../tokens/use-palette-tokens.js";
|
|
8
|
+
import { NS as E } from "../../tokens/core.meta.generated.js";
|
|
9
|
+
import { NS as I } from "../../tokens/palette.generated.js";
|
|
10
|
+
import { isCoreFamily as F } from "../../packages/tokens/dist/install.js";
|
|
11
|
+
const J = [
|
|
11
12
|
"accent",
|
|
12
13
|
"neutral",
|
|
13
14
|
"gray",
|
|
@@ -29,30 +30,31 @@ const X = [
|
|
|
29
30
|
"orange",
|
|
30
31
|
"yellow",
|
|
31
32
|
"bronze"
|
|
32
|
-
],
|
|
33
|
-
const t =
|
|
34
|
-
return `var(--zenith-${
|
|
35
|
-
},
|
|
36
|
-
const t =
|
|
37
|
-
return `var(--zenith-${
|
|
38
|
-
},
|
|
33
|
+
], a = "--zenith-badge-bg", s = "--zenith-badge-fg", l = "--zenith-badge-bd", d = (e) => e === "neutral" ? "gray" : e, g = (e) => F(e) ? E : I, r = (e, n) => {
|
|
34
|
+
const t = d(e);
|
|
35
|
+
return `var(--zenith-${g(t)}-${t}-${n})`;
|
|
36
|
+
}, L = (e, n) => {
|
|
37
|
+
const t = d(e);
|
|
38
|
+
return `var(--zenith-${g(t)}-${t}-${n})`;
|
|
39
|
+
}, G = {
|
|
39
40
|
soft: (e) => ({
|
|
40
|
-
[
|
|
41
|
-
[
|
|
42
|
-
[
|
|
41
|
+
[a]: r(e, "soft"),
|
|
42
|
+
[s]: r(e, "default"),
|
|
43
|
+
[l]: "transparent"
|
|
43
44
|
}),
|
|
44
45
|
solid: (e) => ({
|
|
45
|
-
[
|
|
46
|
-
[
|
|
47
|
-
[
|
|
46
|
+
[a]: r(e, "solid"),
|
|
47
|
+
[s]: r(e, "contrast"),
|
|
48
|
+
[l]: "transparent"
|
|
48
49
|
}),
|
|
49
50
|
surface: (e) => ({
|
|
50
|
-
[
|
|
51
|
-
[
|
|
52
|
-
[
|
|
51
|
+
[a]: r(e, "surface"),
|
|
52
|
+
[s]: r(e, "default"),
|
|
53
|
+
[l]: L(e, "a6")
|
|
53
54
|
})
|
|
54
|
-
},
|
|
55
|
+
}, H = w({
|
|
55
56
|
root: {
|
|
57
|
+
...o,
|
|
56
58
|
display: "inline-flex",
|
|
57
59
|
alignItems: "center",
|
|
58
60
|
justifyContent: "center",
|
|
@@ -60,32 +62,33 @@ const X = [
|
|
|
60
62
|
whiteSpace: "nowrap",
|
|
61
63
|
flexShrink: 0,
|
|
62
64
|
overflow: "hidden",
|
|
63
|
-
fontWeight:
|
|
65
|
+
fontWeight: T,
|
|
64
66
|
// NEVER write a CSS shorthand in a Griffel style object. Atoms are one declaration each, so a
|
|
65
67
|
// shorthand cannot be resolved against a longhand — `border` and a later `borderColor` would
|
|
66
68
|
// both survive with the winner decided by insertion order. Griffel warns at runtime, which
|
|
67
69
|
// means the mistake ships silently in production where nobody reads the console.
|
|
68
70
|
// `shorthands.*` expands to the individual longhands.
|
|
69
|
-
...
|
|
71
|
+
...x.border("1px", "solid", `var(${l})`),
|
|
70
72
|
// The whole point: one rule each, colour supplied per instance.
|
|
71
|
-
backgroundColor: `var(${
|
|
72
|
-
color: `var(${
|
|
73
|
+
backgroundColor: `var(${a})`,
|
|
74
|
+
color: `var(${s})`,
|
|
73
75
|
transitionProperty: "color, box-shadow",
|
|
74
76
|
":focus-visible": {
|
|
75
77
|
outlineWidth: "2px",
|
|
76
78
|
outlineStyle: "solid",
|
|
77
79
|
outlineOffset: "2px",
|
|
78
|
-
outlineColor:
|
|
80
|
+
outlineColor: N
|
|
79
81
|
},
|
|
80
82
|
// v1 `aria-invalid:outline-error-a8`. Declared after the focus ring so an invalid focused
|
|
81
83
|
// badge paints the error ring, matching v1's variant ordering.
|
|
82
84
|
"&[aria-invalid]": {
|
|
83
|
-
outlineColor:
|
|
85
|
+
outlineColor: B
|
|
84
86
|
},
|
|
85
87
|
"& > svg": { pointerEvents: "none" }
|
|
86
88
|
},
|
|
87
89
|
sm: {
|
|
88
|
-
|
|
90
|
+
...o,
|
|
91
|
+
fontSize: A,
|
|
89
92
|
lineHeight: "1rem",
|
|
90
93
|
letterSpacing: "0.04px",
|
|
91
94
|
gap: i,
|
|
@@ -95,49 +98,51 @@ const X = [
|
|
|
95
98
|
"& > svg": { width: "0.75rem", height: "0.75rem" }
|
|
96
99
|
},
|
|
97
100
|
base: {
|
|
98
|
-
|
|
101
|
+
...o,
|
|
102
|
+
fontSize: k,
|
|
99
103
|
lineHeight: "1.25rem",
|
|
100
104
|
gap: i,
|
|
101
|
-
paddingInline:
|
|
105
|
+
paddingInline: O,
|
|
102
106
|
minWidth: "1.25rem",
|
|
103
|
-
borderRadius:
|
|
107
|
+
borderRadius: R,
|
|
104
108
|
"& > svg": { width: "1rem", height: "1rem" }
|
|
105
109
|
},
|
|
106
110
|
lg: {
|
|
107
|
-
|
|
111
|
+
...o,
|
|
112
|
+
fontSize: C,
|
|
108
113
|
lineHeight: "1.5rem",
|
|
109
114
|
gap: i,
|
|
110
|
-
paddingInline:
|
|
115
|
+
paddingInline: z,
|
|
111
116
|
minWidth: "1.5rem",
|
|
112
|
-
borderRadius:
|
|
117
|
+
borderRadius: $,
|
|
113
118
|
"& > svg": { width: "1rem", height: "1rem" }
|
|
114
119
|
}
|
|
115
|
-
}),
|
|
120
|
+
}), K = S.forwardRef(
|
|
116
121
|
function({
|
|
117
|
-
className:
|
|
122
|
+
className: n,
|
|
118
123
|
color: t = "accent",
|
|
119
|
-
variant:
|
|
120
|
-
size:
|
|
124
|
+
variant: p = "soft",
|
|
125
|
+
size: f = "base",
|
|
121
126
|
style: c,
|
|
122
|
-
...
|
|
123
|
-
},
|
|
124
|
-
|
|
125
|
-
const
|
|
126
|
-
return /* @__PURE__ */
|
|
127
|
+
...h
|
|
128
|
+
}, u) {
|
|
129
|
+
W(t);
|
|
130
|
+
const m = H();
|
|
131
|
+
return /* @__PURE__ */ b(
|
|
127
132
|
"span",
|
|
128
133
|
{
|
|
129
|
-
ref:
|
|
134
|
+
ref: u,
|
|
130
135
|
"data-slot": "badge",
|
|
131
|
-
[
|
|
132
|
-
className:
|
|
133
|
-
style: { ...
|
|
134
|
-
...
|
|
136
|
+
[v]: "badge",
|
|
137
|
+
className: y(m.root, m[f], n),
|
|
138
|
+
style: { ...G[p](t), ...c },
|
|
139
|
+
...h
|
|
135
140
|
}
|
|
136
141
|
);
|
|
137
142
|
}
|
|
138
143
|
);
|
|
139
144
|
export {
|
|
140
|
-
|
|
141
|
-
|
|
145
|
+
J as BADGE_COLORS,
|
|
146
|
+
K as Badge
|
|
142
147
|
};
|
|
143
148
|
//# sourceMappingURL=badge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"badge.js","sources":["../../../src/components/badge/badge.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 { NS, PALETTE_NS } from \"../../tokens\"\nimport { isCoreFamily } from \"../../tokens/install\"\nimport { useZenithPaletteTokensFor } from \"../../tokens/use-palette-tokens\"\nimport * as tokens from \"../../tokens\"\n\n/**\n * REFERENCE COMPONENT — the colour-matrix collapse. Read this before writing another component\n * that takes a `color` prop.\n */\n\nconst COLORS = [\n \"accent\",\n \"neutral\",\n \"gray\",\n \"success\",\n \"warning\",\n \"error\",\n \"info\",\n \"blue\",\n \"sky\",\n \"mint\",\n \"lime\",\n \"green\",\n \"teal\",\n \"cyan\",\n \"indigo\",\n \"purple\",\n \"pink\",\n \"red\",\n \"orange\",\n \"yellow\",\n \"bronze\",\n] as const\n\nexport type BadgeColor = (typeof COLORS)[number]\nexport type BadgeVariant = \"soft\" | \"solid\" | \"surface\"\nexport type BadgeSize = \"sm\" | \"base\" | \"lg\"\n\n/** The three slots a variant can paint. Set inline; read by the atoms below. */\nconst BG = \"--zenith-badge-bg\"\nconst FG = \"--zenith-badge-fg\"\nconst BD = \"--zenith-badge-bd\"\n\nconst resolveColor = (color: BadgeColor): string =>\n color === \"neutral\" ? \"gray\" : color\n\n/**\n * The namespace fix. `resolveColor` runs FIRST so `neutral` is classified as `gray` (core) rather\n * than as the literal string \"neutral\" (which is in neither sheet's family list) — same order\n * `semantic`/`primitive` already apply it in.\n */\nconst namespaceFor = (family: string): string =>\n isCoreFamily(family) ? NS : PALETTE_NS\n\nconst semantic = (color: BadgeColor, slot: string): string => {\n const family = resolveColor(color)\n return `var(--zenith-${namespaceFor(family)}-${family}-${slot})`\n}\nconst primitive = (color: BadgeColor, step: string): string => {\n const family = resolveColor(color)\n return `var(--zenith-${namespaceFor(family)}-${family}-${step})`\n}\n\n/**\n * Which token each variant pulls into each slot. This replaces the 60-entry compound matrix: it is\n * data about three variants, not about 60 combinations.\n */\nconst VARIANT_SLOTS: Record<\n BadgeVariant,\n (color: BadgeColor) => Record<string, string>\n> = {\n soft: (c) => ({\n [BG]: semantic(c, \"soft\"),\n [FG]: semantic(c, \"default\"),\n [BD]: \"transparent\",\n }),\n solid: (c) => ({\n [BG]: semantic(c, \"solid\"),\n [FG]: semantic(c, \"contrast\"),\n [BD]: \"transparent\",\n }),\n surface: (c) => ({\n [BG]: semantic(c, \"surface\"),\n [FG]: semantic(c, \"default\"),\n [BD]: primitive(c, \"a6\"),\n }),\n}\n\nconst useStyles = makeZenithStyles({\n root: {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"fit-content\",\n whiteSpace: \"nowrap\",\n flexShrink: 0,\n overflow: \"hidden\",\n fontWeight: tokens.fontWeightNormal,\n // NEVER write a CSS shorthand in a Griffel style object. Atoms are one declaration each, so a\n // shorthand cannot be resolved against a longhand — `border` and a later `borderColor` would\n // both survive with the winner decided by insertion order. Griffel warns at runtime, which\n // means the mistake ships silently in production where nobody reads the console.\n // `shorthands.*` expands to the individual longhands.\n ...shorthands.border(\"1px\", \"solid\", `var(${BD})`),\n // The whole point: one rule each, colour supplied per instance.\n backgroundColor: `var(${BG})`,\n color: `var(${FG})`,\n transitionProperty: \"color, box-shadow\",\n \":focus-visible\": {\n outlineWidth: \"2px\",\n outlineStyle: \"solid\",\n outlineOffset: \"2px\",\n outlineColor: tokens.accentA8,\n },\n // v1 `aria-invalid:outline-error-a8`. Declared after the focus ring so an invalid focused\n // badge paints the error ring, matching v1's variant ordering.\n \"&[aria-invalid]\": {\n outlineColor: tokens.errorA8,\n },\n \"& > svg\": { pointerEvents: \"none\" },\n },\n sm: {\n fontSize: tokens.textXs,\n lineHeight: \"1rem\",\n letterSpacing: \"0.04px\",\n gap: tokens.spacingElement1,\n paddingInline: tokens.spacingElement1,\n minWidth: \"1rem\",\n borderRadius: \"3px\",\n \"& > svg\": { width: \"0.75rem\", height: \"0.75rem\" },\n },\n base: {\n fontSize: tokens.textSm,\n lineHeight: \"1.25rem\",\n gap: tokens.spacingElement1,\n paddingInline: tokens.spacingElement2,\n minWidth: \"1.25rem\",\n borderRadius: tokens.radiusSm,\n \"& > svg\": { width: \"1rem\", height: \"1rem\" },\n },\n lg: {\n fontSize: tokens.textBase,\n lineHeight: \"1.5rem\",\n gap: tokens.spacingElement1,\n paddingInline: tokens.spacingElement3,\n minWidth: \"1.5rem\",\n borderRadius: tokens.radiusMd,\n \"& > svg\": { width: \"1rem\", height: \"1rem\" },\n },\n})\n\nexport type BadgeProps = Omit<React.ComponentProps<\"span\">, \"color\"> & {\n color?: BadgeColor\n /**\n * Named `variant`, not `style`. v1 called this `style`, which shadows the HTML `style` attribute\n * and made a badge unable to take both a visual treatment and an inline style. Retrocompat is\n * not a requirement here, so the collision is fixed rather than inherited.\n */\n variant?: BadgeVariant\n size?: BadgeSize\n}\n\nexport const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n function Badge(\n {\n className,\n color = \"accent\",\n variant = \"soft\",\n size = \"base\",\n style,\n ...props\n },\n ref\n ) {\n // A decorative family can still arrive from an expression the build cannot see, so this has to\n // be re-evaluated every commit (WP2B2 — the hook closes over this render's resolved value) —\n // but it is the resolved family that decides, and a core one needs no palette sheet.\n useZenithPaletteTokensFor(color)\n\n const styles = useStyles()\n\n return (\n <span\n ref={ref}\n data-slot=\"badge\"\n {...{ [SLOT_ATTR]: \"badge\" }}\n className={mergeClasses(styles.root, styles[size], className)}\n style={\n { ...VARIANT_SLOTS[variant](color), ...style } as React.CSSProperties\n }\n {...props}\n />\n )\n }\n)\n\nexport { COLORS as BADGE_COLORS }\n"],"names":["COLORS","BG","FG","BD","resolveColor","color","namespaceFor","family","isCoreFamily","NS","PALETTE_NS","semantic","slot","primitive","step","VARIANT_SLOTS","c","useStyles","makeZenithStyles","tokens.fontWeightNormal","shorthands","tokens.accentA8","tokens.errorA8","tokens.textXs","tokens.spacingElement1","tokens.textSm","tokens.spacingElement2","tokens.radiusSm","tokens.textBase","tokens.spacingElement3","tokens.radiusMd","Badge","React","className","variant","size","style","props","ref","useZenithPaletteTokensFor","styles","jsx","SLOT_ATTR","mergeClasses"],"mappings":"
|
|
1
|
+
{"version":3,"file":"badge.js","sources":["../../../src/components/badge/badge.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 { boxModel } from \"../../styles/host-reset\"\nimport { NS, PALETTE_NS } from \"../../tokens\"\nimport { isCoreFamily } from \"../../tokens/install\"\nimport { useZenithPaletteTokensFor } from \"../../tokens/use-palette-tokens\"\nimport * as tokens from \"../../tokens\"\n\n/**\n * REFERENCE COMPONENT — the colour-matrix collapse. Read this before writing another component\n * that takes a `color` prop.\n */\n\nconst COLORS = [\n \"accent\",\n \"neutral\",\n \"gray\",\n \"success\",\n \"warning\",\n \"error\",\n \"info\",\n \"blue\",\n \"sky\",\n \"mint\",\n \"lime\",\n \"green\",\n \"teal\",\n \"cyan\",\n \"indigo\",\n \"purple\",\n \"pink\",\n \"red\",\n \"orange\",\n \"yellow\",\n \"bronze\",\n] as const\n\nexport type BadgeColor = (typeof COLORS)[number]\nexport type BadgeVariant = \"soft\" | \"solid\" | \"surface\"\nexport type BadgeSize = \"sm\" | \"base\" | \"lg\"\n\n/** The three slots a variant can paint. Set inline; read by the atoms below. */\nconst BG = \"--zenith-badge-bg\"\nconst FG = \"--zenith-badge-fg\"\nconst BD = \"--zenith-badge-bd\"\n\nconst resolveColor = (color: BadgeColor): string =>\n color === \"neutral\" ? \"gray\" : color\n\n/**\n * The namespace fix. `resolveColor` runs FIRST so `neutral` is classified as `gray` (core) rather\n * than as the literal string \"neutral\" (which is in neither sheet's family list) — same order\n * `semantic`/`primitive` already apply it in.\n */\nconst namespaceFor = (family: string): string =>\n isCoreFamily(family) ? NS : PALETTE_NS\n\nconst semantic = (color: BadgeColor, slot: string): string => {\n const family = resolveColor(color)\n return `var(--zenith-${namespaceFor(family)}-${family}-${slot})`\n}\nconst primitive = (color: BadgeColor, step: string): string => {\n const family = resolveColor(color)\n return `var(--zenith-${namespaceFor(family)}-${family}-${step})`\n}\n\n/**\n * Which token each variant pulls into each slot. This replaces the 60-entry compound matrix: it is\n * data about three variants, not about 60 combinations.\n */\nconst VARIANT_SLOTS: Record<\n BadgeVariant,\n (color: BadgeColor) => Record<string, string>\n> = {\n soft: (c) => ({\n [BG]: semantic(c, \"soft\"),\n [FG]: semantic(c, \"default\"),\n [BD]: \"transparent\",\n }),\n solid: (c) => ({\n [BG]: semantic(c, \"solid\"),\n [FG]: semantic(c, \"contrast\"),\n [BD]: \"transparent\",\n }),\n surface: (c) => ({\n [BG]: semantic(c, \"surface\"),\n [FG]: semantic(c, \"default\"),\n [BD]: primitive(c, \"a6\"),\n }),\n}\n\nconst useStyles = makeZenithStyles({\n root: {\n ...boxModel,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"fit-content\",\n whiteSpace: \"nowrap\",\n flexShrink: 0,\n overflow: \"hidden\",\n fontWeight: tokens.fontWeightNormal,\n // NEVER write a CSS shorthand in a Griffel style object. Atoms are one declaration each, so a\n // shorthand cannot be resolved against a longhand — `border` and a later `borderColor` would\n // both survive with the winner decided by insertion order. Griffel warns at runtime, which\n // means the mistake ships silently in production where nobody reads the console.\n // `shorthands.*` expands to the individual longhands.\n ...shorthands.border(\"1px\", \"solid\", `var(${BD})`),\n // The whole point: one rule each, colour supplied per instance.\n backgroundColor: `var(${BG})`,\n color: `var(${FG})`,\n transitionProperty: \"color, box-shadow\",\n \":focus-visible\": {\n outlineWidth: \"2px\",\n outlineStyle: \"solid\",\n outlineOffset: \"2px\",\n outlineColor: tokens.accentA8,\n },\n // v1 `aria-invalid:outline-error-a8`. Declared after the focus ring so an invalid focused\n // badge paints the error ring, matching v1's variant ordering.\n \"&[aria-invalid]\": {\n outlineColor: tokens.errorA8,\n },\n \"& > svg\": { pointerEvents: \"none\" },\n },\n sm: {\n ...boxModel,\n fontSize: tokens.textXs,\n lineHeight: \"1rem\",\n letterSpacing: \"0.04px\",\n gap: tokens.spacingElement1,\n paddingInline: tokens.spacingElement1,\n minWidth: \"1rem\",\n borderRadius: \"3px\",\n \"& > svg\": { width: \"0.75rem\", height: \"0.75rem\" },\n },\n base: {\n ...boxModel,\n fontSize: tokens.textSm,\n lineHeight: \"1.25rem\",\n gap: tokens.spacingElement1,\n paddingInline: tokens.spacingElement2,\n minWidth: \"1.25rem\",\n borderRadius: tokens.radiusSm,\n \"& > svg\": { width: \"1rem\", height: \"1rem\" },\n },\n lg: {\n ...boxModel,\n fontSize: tokens.textBase,\n lineHeight: \"1.5rem\",\n gap: tokens.spacingElement1,\n paddingInline: tokens.spacingElement3,\n minWidth: \"1.5rem\",\n borderRadius: tokens.radiusMd,\n \"& > svg\": { width: \"1rem\", height: \"1rem\" },\n },\n})\n\nexport type BadgeProps = Omit<React.ComponentProps<\"span\">, \"color\"> & {\n color?: BadgeColor\n /**\n * Named `variant`, not `style`. v1 called this `style`, which shadows the HTML `style` attribute\n * and made a badge unable to take both a visual treatment and an inline style. Retrocompat is\n * not a requirement here, so the collision is fixed rather than inherited.\n */\n variant?: BadgeVariant\n size?: BadgeSize\n}\n\nexport const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n function Badge(\n {\n className,\n color = \"accent\",\n variant = \"soft\",\n size = \"base\",\n style,\n ...props\n },\n ref\n ) {\n // A decorative family can still arrive from an expression the build cannot see, so this has to\n // be re-evaluated every commit (WP2B2 — the hook closes over this render's resolved value) —\n // but it is the resolved family that decides, and a core one needs no palette sheet.\n useZenithPaletteTokensFor(color)\n\n const styles = useStyles()\n\n return (\n <span\n ref={ref}\n data-slot=\"badge\"\n {...{ [SLOT_ATTR]: \"badge\" }}\n className={mergeClasses(styles.root, styles[size], className)}\n style={\n { ...VARIANT_SLOTS[variant](color), ...style } as React.CSSProperties\n }\n {...props}\n />\n )\n }\n)\n\nexport { COLORS as BADGE_COLORS }\n"],"names":["COLORS","BG","FG","BD","resolveColor","color","namespaceFor","family","isCoreFamily","NS","PALETTE_NS","semantic","slot","primitive","step","VARIANT_SLOTS","c","useStyles","makeZenithStyles","boxModel","tokens.fontWeightNormal","shorthands","tokens.accentA8","tokens.errorA8","tokens.textXs","tokens.spacingElement1","tokens.textSm","tokens.spacingElement2","tokens.radiusSm","tokens.textBase","tokens.spacingElement3","tokens.radiusMd","Badge","React","className","variant","size","style","props","ref","useZenithPaletteTokensFor","styles","jsx","SLOT_ATTR","mergeClasses"],"mappings":"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"}
|
|
@@ -1,111 +1,156 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import * as
|
|
3
|
-
import {
|
|
4
|
-
import { makeZenithStyles as
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
1
|
+
import { jsx as o, jsxs as w } from "react/jsx-runtime";
|
|
2
|
+
import * as l from "react";
|
|
3
|
+
import { mergeClasses as p, SLOT_ATTR as s, shorthands as n } from "@epilot/zenith-runtime/v1";
|
|
4
|
+
import { makeZenithStyles as L } from "../../styles/make-styles.js";
|
|
5
|
+
import { boxModel as h } from "../../styles/host-reset.js";
|
|
6
|
+
import { grayDefault as y, fontWeightSemibold as x, accentA8 as R, grayLight as S, leadingBase as N, textBase as D, spacingElement1 as I, spacingElement2 as A } from "../../tokens/index.js";
|
|
7
|
+
import { Root as E } from "../../vendor/.bun/@radix-ui_react-slot@1.2.4_0ac650c021fb1b59/vendor/@radix-ui/react-slot/dist/index.js";
|
|
8
|
+
const k = L({
|
|
9
|
+
// A truncating crumb can only shrink if every box above it may shrink below its content too. The
|
|
10
|
+
// nav is the box a flex row (a view header) actually sizes, so it carries the rule; plain trails
|
|
11
|
+
// keep their content size.
|
|
12
|
+
root: {
|
|
13
|
+
[`&:has([${s}="breadcrumb-item"][data-truncate])`]: {
|
|
14
|
+
minWidth: 0
|
|
15
|
+
}
|
|
16
|
+
},
|
|
8
17
|
list: {
|
|
18
|
+
...h,
|
|
19
|
+
// A layout row, not a numbered list: reset the browser's markers and indent so the trail does
|
|
20
|
+
// not depend on the host shipping a CSS reset.
|
|
21
|
+
listStyleType: "none",
|
|
22
|
+
...n.margin(0),
|
|
23
|
+
...n.padding(0),
|
|
9
24
|
display: "flex",
|
|
10
25
|
alignItems: "center",
|
|
11
26
|
// gap-2
|
|
12
|
-
...
|
|
13
|
-
fontSize:
|
|
14
|
-
lineHeight:
|
|
27
|
+
...n.gap(A),
|
|
28
|
+
fontSize: D,
|
|
29
|
+
lineHeight: N,
|
|
30
|
+
minWidth: 0
|
|
15
31
|
},
|
|
16
32
|
separator: {
|
|
17
|
-
color:
|
|
33
|
+
color: S
|
|
18
34
|
},
|
|
19
35
|
item: {
|
|
20
36
|
display: "inline-flex",
|
|
21
37
|
alignItems: "center",
|
|
22
38
|
// gap-1
|
|
23
|
-
...
|
|
39
|
+
...n.gap(I)
|
|
40
|
+
},
|
|
41
|
+
itemTruncate: {
|
|
42
|
+
...h,
|
|
43
|
+
minWidth: 0
|
|
44
|
+
},
|
|
45
|
+
truncate: {
|
|
46
|
+
...n.overflow("hidden"),
|
|
47
|
+
textOverflow: "ellipsis",
|
|
48
|
+
whiteSpace: "nowrap"
|
|
24
49
|
},
|
|
25
50
|
link: {
|
|
26
|
-
|
|
27
|
-
|
|
51
|
+
// A browser underlines a bare `<a>`; the underline is a hover affordance here.
|
|
52
|
+
textDecorationLine: "none",
|
|
53
|
+
fontWeight: x,
|
|
54
|
+
color: S,
|
|
28
55
|
transitionProperty: "color, background-color, border-color, text-decoration-color, fill, stroke",
|
|
29
56
|
transitionDuration: "150ms",
|
|
30
57
|
transitionTimingFunction: "cubic-bezier(0.4, 0, 0.2, 1)",
|
|
31
58
|
cursor: "pointer",
|
|
32
59
|
":hover": {
|
|
33
|
-
color:
|
|
60
|
+
color: y,
|
|
34
61
|
textDecorationLine: "underline"
|
|
35
62
|
},
|
|
36
63
|
":focus-visible": {
|
|
37
64
|
outlineWidth: "2px",
|
|
38
65
|
outlineStyle: "solid",
|
|
39
66
|
outlineOffset: "2px",
|
|
40
|
-
outlineColor:
|
|
67
|
+
outlineColor: R
|
|
41
68
|
}
|
|
42
69
|
},
|
|
43
70
|
page: {
|
|
44
|
-
fontWeight:
|
|
45
|
-
color:
|
|
71
|
+
fontWeight: x,
|
|
72
|
+
color: y
|
|
46
73
|
}
|
|
47
|
-
}),
|
|
48
|
-
function({
|
|
49
|
-
|
|
50
|
-
|
|
74
|
+
}), M = l.forwardRef(
|
|
75
|
+
function({
|
|
76
|
+
separator: a = "/",
|
|
77
|
+
"aria-label": c = "Breadcrumb",
|
|
78
|
+
className: m,
|
|
79
|
+
children: t,
|
|
80
|
+
...d
|
|
81
|
+
}, r) {
|
|
82
|
+
const i = k(), b = l.Children.toArray(t).filter(l.isValidElement);
|
|
83
|
+
return /* @__PURE__ */ o(
|
|
51
84
|
"nav",
|
|
52
85
|
{
|
|
53
|
-
ref:
|
|
86
|
+
ref: r,
|
|
54
87
|
"data-slot": "breadcrumb",
|
|
55
|
-
[
|
|
56
|
-
"aria-label":
|
|
57
|
-
className:
|
|
58
|
-
...
|
|
59
|
-
children: /* @__PURE__ */
|
|
60
|
-
|
|
88
|
+
[s]: "breadcrumb",
|
|
89
|
+
"aria-label": c,
|
|
90
|
+
className: p(i.root, m),
|
|
91
|
+
...d,
|
|
92
|
+
children: /* @__PURE__ */ o("ol", { className: i.list, children: b.map((f, e) => /* @__PURE__ */ w(l.Fragment, { children: [
|
|
93
|
+
e > 0 && /* @__PURE__ */ o(
|
|
61
94
|
"li",
|
|
62
95
|
{
|
|
63
96
|
role: "presentation",
|
|
64
97
|
"aria-hidden": "true",
|
|
65
|
-
className:
|
|
66
|
-
children:
|
|
98
|
+
className: i.separator,
|
|
99
|
+
children: a
|
|
67
100
|
}
|
|
68
101
|
),
|
|
69
|
-
|
|
70
|
-
] },
|
|
102
|
+
f
|
|
103
|
+
] }, e)) })
|
|
71
104
|
}
|
|
72
105
|
);
|
|
73
106
|
}
|
|
74
|
-
),
|
|
75
|
-
|
|
76
|
-
|
|
107
|
+
), P = l.forwardRef(function({
|
|
108
|
+
href: a,
|
|
109
|
+
isCurrent: c = !1,
|
|
110
|
+
className: m,
|
|
111
|
+
children: t,
|
|
112
|
+
asChild: d = !1,
|
|
113
|
+
truncate: r = !1,
|
|
114
|
+
title: i,
|
|
115
|
+
...b
|
|
116
|
+
}, f) {
|
|
117
|
+
const e = k(), T = !!a, B = d ? E : "a", g = r ? e.truncate : void 0, u = i ?? (r && (typeof t == "string" || typeof t == "number") ? String(t) : void 0), W = T || d ? /* @__PURE__ */ o(
|
|
118
|
+
B,
|
|
77
119
|
{
|
|
78
120
|
"data-slot": "breadcrumb-link",
|
|
79
|
-
[
|
|
80
|
-
...
|
|
81
|
-
className:
|
|
82
|
-
...
|
|
83
|
-
...
|
|
84
|
-
|
|
121
|
+
[s]: "breadcrumb-link",
|
|
122
|
+
...a ? { href: a } : {},
|
|
123
|
+
className: p(e.link, g, m),
|
|
124
|
+
...u !== void 0 ? { title: u } : {},
|
|
125
|
+
...c ? { "aria-current": "page" } : {},
|
|
126
|
+
...b,
|
|
127
|
+
children: t
|
|
85
128
|
}
|
|
86
|
-
) : /* @__PURE__ */
|
|
129
|
+
) : /* @__PURE__ */ o(
|
|
87
130
|
"span",
|
|
88
131
|
{
|
|
89
132
|
"data-slot": "breadcrumb-page",
|
|
90
|
-
[
|
|
91
|
-
className:
|
|
92
|
-
...
|
|
93
|
-
|
|
133
|
+
[s]: "breadcrumb-page",
|
|
134
|
+
className: p(e.page, g, m),
|
|
135
|
+
...u !== void 0 ? { title: u } : {},
|
|
136
|
+
...c ? { "aria-current": "page" } : {},
|
|
137
|
+
children: t
|
|
94
138
|
}
|
|
95
139
|
);
|
|
96
|
-
return /* @__PURE__ */
|
|
140
|
+
return /* @__PURE__ */ o(
|
|
97
141
|
"li",
|
|
98
142
|
{
|
|
99
|
-
ref:
|
|
143
|
+
ref: f,
|
|
100
144
|
"data-slot": "breadcrumb-item",
|
|
101
|
-
[
|
|
102
|
-
|
|
103
|
-
|
|
145
|
+
[s]: "breadcrumb-item",
|
|
146
|
+
...r ? { "data-truncate": "" } : {},
|
|
147
|
+
className: p(e.item, r && e.itemTruncate),
|
|
148
|
+
children: W
|
|
104
149
|
}
|
|
105
150
|
);
|
|
106
151
|
});
|
|
107
152
|
export {
|
|
108
|
-
|
|
109
|
-
|
|
153
|
+
M as Breadcrumb,
|
|
154
|
+
P as BreadcrumbItem
|
|
110
155
|
};
|
|
111
156
|
//# sourceMappingURL=breadcrumb.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"breadcrumb.js","sources":["../../../src/components/breadcrumb/breadcrumb.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 { Slot } from \"@radix-ui/react-slot\"\n\n/** Breadcrumb — Card's compound pattern applied to the nav / ol / li structure. */\n\nexport type BreadcrumbProps = React.ComponentProps<\"nav\"> & {\n separator?: React.ReactNode\n}\n\nconst useStyles = makeZenithStyles({\n list: {\n display: \"flex\",\n alignItems: \"center\",\n // gap-2\n ...shorthands.gap(tokens.spacingElement2),\n fontSize: tokens.textBase,\n lineHeight: tokens.leadingBase,\n },\n separator: {\n color: tokens.grayLight,\n },\n item: {\n display: \"inline-flex\",\n alignItems: \"center\",\n // gap-1\n ...shorthands.gap(tokens.spacingElement1),\n },\n link: {\n fontWeight: tokens.fontWeightSemibold,\n color: tokens.grayLight,\n transitionProperty:\n \"color, background-color, border-color, text-decoration-color, fill, stroke\",\n transitionDuration: \"150ms\",\n transitionTimingFunction: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n cursor: \"pointer\",\n \":hover\": {\n color: tokens.grayDefault,\n textDecorationLine: \"underline\",\n },\n \":focus-visible\": {\n outlineWidth: \"2px\",\n outlineStyle: \"solid\",\n outlineOffset: \"2px\",\n outlineColor: tokens.accentA8,\n },\n },\n page: {\n fontWeight: tokens.fontWeightSemibold,\n color: tokens.grayDefault,\n },\n})\n\nexport const Breadcrumb = React.forwardRef<HTMLElement, BreadcrumbProps>(\n function Breadcrumb({ separator = \"/\", className, children, ...props }, ref) {\n const styles = useStyles()\n const items = React.Children.toArray(children).filter(React.isValidElement)\n\n return (\n <nav\n ref={ref}\n data-slot=\"breadcrumb\"\n {...{ [SLOT_ATTR]: \"breadcrumb\" }}\n aria-label=\"Breadcrumb\"\n className={className}\n {...props}\n >\n <ol className={styles.list}>\n {items.map((child, index) => (\n <React.Fragment key={index}>\n {index > 0 && (\n <li\n role=\"presentation\"\n aria-hidden=\"true\"\n className={styles.separator}\n >\n {separator}\n </li>\n )}\n {child}\n </React.Fragment>\n ))}\n </ol>\n </nav>\n )\n }\n)\n\nexport type BreadcrumbItemProps = Omit<React.ComponentProps<\"a\">, \"href\"> & {\n href?: string\n isCurrent?: boolean\n /**\n * Render the child instead of the built-in `a`, keeping the link styling and slot markers. This\n * is how a consumer supplies a router link. v1 supports it; it was dropped here while the package\n * was on Base UI and restored once it moved back to Radix.\n */\n asChild?: boolean\n}\n\nexport const BreadcrumbItem = React.forwardRef<\n HTMLLIElement,\n BreadcrumbItemProps\n>(function BreadcrumbItem(\n { href, isCurrent = false, className, children, asChild = false, ...props },\n ref\n) {\n const styles = useStyles()\n const isLink = !!href\n\n const LinkRoot = asChild ? Slot : \"a\"\n\n const content =\n isLink || asChild ? (\n <LinkRoot\n data-slot=\"breadcrumb-link\"\n {...{ [SLOT_ATTR]: \"breadcrumb-link\" }}\n {...(href ? { href } : {})}\n className={mergeClasses(styles.link, className)}\n {...(isCurrent ? { \"aria-current\": \"page\" as const } : {})}\n {...props}\n >\n {children}\n </LinkRoot>\n ) : (\n <span\n data-slot=\"breadcrumb-page\"\n {...{ [SLOT_ATTR]: \"breadcrumb-page\" }}\n className={mergeClasses(styles.page, className)}\n {...(isCurrent ? { \"aria-current\": \"page\" as const } : {})}\n >\n {children}\n </span>\n )\n\n return (\n <li\n ref={ref}\n data-slot=\"breadcrumb-item\"\n {...{ [SLOT_ATTR]: \"breadcrumb-item\" }}\n className={styles.item}\n >\n {content}\n </li>\n )\n})\n"],"names":["useStyles","makeZenithStyles","shorthands","tokens.spacingElement2","tokens.textBase","tokens.leadingBase","tokens.grayLight","tokens.spacingElement1","tokens.fontWeightSemibold","tokens.grayDefault","tokens.accentA8","Breadcrumb","React","separator","className","children","props","ref","styles","items","jsx","SLOT_ATTR","child","index","jsxs","BreadcrumbItem","href","isCurrent","asChild","content","Slot","mergeClasses"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"breadcrumb.js","sources":["../../../src/components/breadcrumb/breadcrumb.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 { boxModel } from \"../../styles/host-reset\"\nimport * as tokens from \"../../tokens\"\nimport { Slot } from \"@radix-ui/react-slot\"\n\n/** Breadcrumb — Card's compound pattern applied to the nav / ol / li structure. */\n\nexport type BreadcrumbProps = React.ComponentProps<\"nav\"> & {\n separator?: React.ReactNode\n /**\n * Accessible name of the navigation landmark, read by screen readers. Pass a translated string\n * for any locale other than English. Defaults to \"Breadcrumb\".\n */\n \"aria-label\"?: string\n}\n\nconst useStyles = makeZenithStyles({\n // A truncating crumb can only shrink if every box above it may shrink below its content too. The\n // nav is the box a flex row (a view header) actually sizes, so it carries the rule; plain trails\n // keep their content size.\n root: {\n [`&:has([${SLOT_ATTR}=\"breadcrumb-item\"][data-truncate])`]: {\n minWidth: 0,\n },\n },\n list: {\n ...boxModel,\n // A layout row, not a numbered list: reset the browser's markers and indent so the trail does\n // not depend on the host shipping a CSS reset.\n listStyleType: \"none\",\n ...shorthands.margin(0),\n ...shorthands.padding(0),\n display: \"flex\",\n alignItems: \"center\",\n // gap-2\n ...shorthands.gap(tokens.spacingElement2),\n fontSize: tokens.textBase,\n lineHeight: tokens.leadingBase,\n minWidth: 0,\n },\n separator: {\n color: tokens.grayLight,\n },\n item: {\n display: \"inline-flex\",\n alignItems: \"center\",\n // gap-1\n ...shorthands.gap(tokens.spacingElement1),\n },\n itemTruncate: {\n ...boxModel,\n minWidth: 0,\n },\n truncate: {\n ...shorthands.overflow(\"hidden\"),\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n link: {\n // A browser underlines a bare `<a>`; the underline is a hover affordance here.\n textDecorationLine: \"none\",\n fontWeight: tokens.fontWeightSemibold,\n color: tokens.grayLight,\n transitionProperty:\n \"color, background-color, border-color, text-decoration-color, fill, stroke\",\n transitionDuration: \"150ms\",\n transitionTimingFunction: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n cursor: \"pointer\",\n \":hover\": {\n color: tokens.grayDefault,\n textDecorationLine: \"underline\",\n },\n \":focus-visible\": {\n outlineWidth: \"2px\",\n outlineStyle: \"solid\",\n outlineOffset: \"2px\",\n outlineColor: tokens.accentA8,\n },\n },\n page: {\n fontWeight: tokens.fontWeightSemibold,\n color: tokens.grayDefault,\n },\n})\n\nexport const Breadcrumb = React.forwardRef<HTMLElement, BreadcrumbProps>(\n function Breadcrumb(\n {\n separator = \"/\",\n \"aria-label\": ariaLabel = \"Breadcrumb\",\n className,\n children,\n ...props\n },\n ref\n ) {\n const styles = useStyles()\n const items = React.Children.toArray(children).filter(React.isValidElement)\n\n return (\n <nav\n ref={ref}\n data-slot=\"breadcrumb\"\n {...{ [SLOT_ATTR]: \"breadcrumb\" }}\n aria-label={ariaLabel}\n className={mergeClasses(styles.root, className)}\n {...props}\n >\n <ol className={styles.list}>\n {items.map((child, index) => (\n <React.Fragment key={index}>\n {index > 0 && (\n <li\n role=\"presentation\"\n aria-hidden=\"true\"\n className={styles.separator}\n >\n {separator}\n </li>\n )}\n {child}\n </React.Fragment>\n ))}\n </ol>\n </nav>\n )\n }\n)\n\nexport type BreadcrumbItemProps = Omit<React.ComponentProps<\"a\">, \"href\"> & {\n href?: string\n isCurrent?: boolean\n /**\n * Render the child instead of the built-in `a`, keeping the link styling and slot markers. This\n * is how a consumer supplies a router link. v1 supports it; it was dropped here while the package\n * was on Base UI and restored once it moved back to Radix.\n */\n asChild?: boolean\n /**\n * Keep the crumb on one line and cut it with an ellipsis when the trail runs out of room, with\n * the full text as its `title`. Pass `title` yourself when the children are not plain text.\n */\n truncate?: boolean\n}\n\nexport const BreadcrumbItem = React.forwardRef<\n HTMLLIElement,\n BreadcrumbItemProps\n>(function BreadcrumbItem(\n {\n href,\n isCurrent = false,\n className,\n children,\n asChild = false,\n truncate = false,\n title,\n ...props\n },\n ref\n) {\n const styles = useStyles()\n const isLink = !!href\n\n const LinkRoot = asChild ? Slot : \"a\"\n const truncateClass = truncate ? styles.truncate : undefined\n const fullText =\n title ??\n (truncate && (typeof children === \"string\" || typeof children === \"number\")\n ? String(children)\n : undefined)\n\n const content =\n isLink || asChild ? (\n <LinkRoot\n data-slot=\"breadcrumb-link\"\n {...{ [SLOT_ATTR]: \"breadcrumb-link\" }}\n {...(href ? { href } : {})}\n className={mergeClasses(styles.link, truncateClass, className)}\n {...(fullText !== undefined ? { title: fullText } : {})}\n {...(isCurrent ? { \"aria-current\": \"page\" as const } : {})}\n {...props}\n >\n {children}\n </LinkRoot>\n ) : (\n <span\n data-slot=\"breadcrumb-page\"\n {...{ [SLOT_ATTR]: \"breadcrumb-page\" }}\n className={mergeClasses(styles.page, truncateClass, className)}\n {...(fullText !== undefined ? { title: fullText } : {})}\n {...(isCurrent ? { \"aria-current\": \"page\" as const } : {})}\n >\n {children}\n </span>\n )\n\n return (\n <li\n ref={ref}\n data-slot=\"breadcrumb-item\"\n {...{ [SLOT_ATTR]: \"breadcrumb-item\" }}\n {...(truncate ? { \"data-truncate\": \"\" } : {})}\n className={mergeClasses(styles.item, truncate && styles.itemTruncate)}\n >\n {content}\n </li>\n )\n})\n"],"names":["useStyles","makeZenithStyles","SLOT_ATTR","boxModel","shorthands","tokens.spacingElement2","tokens.textBase","tokens.leadingBase","tokens.grayLight","tokens.spacingElement1","tokens.fontWeightSemibold","tokens.grayDefault","tokens.accentA8","Breadcrumb","React","separator","ariaLabel","className","children","props","ref","styles","items","jsx","mergeClasses","child","index","jsxs","BreadcrumbItem","href","isCurrent","asChild","truncate","title","isLink","LinkRoot","Slot","truncateClass","fullText","content"],"mappings":"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"}
|