@charcuterie/ui 2.11.0 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Toolbar/Toolbar.d.ts +156 -0
- package/dist/Toolbar/Toolbar.d.ts.map +1 -0
- package/dist/Toolbar/Toolbar.js +169 -0
- package/dist/Toolbar/Toolbar.js.map +1 -0
- package/dist/Toolbar/ToolbarSlot.d.ts +44 -0
- package/dist/Toolbar/ToolbarSlot.d.ts.map +1 -0
- package/dist/Toolbar/ToolbarSlot.js +69 -0
- package/dist/Toolbar/ToolbarSlot.js.map +1 -0
- package/dist/Toolbar/chooseVisibleCount.d.ts +38 -0
- package/dist/Toolbar/chooseVisibleCount.d.ts.map +1 -0
- package/dist/Toolbar/chooseVisibleCount.js +69 -0
- package/dist/Toolbar/chooseVisibleCount.js.map +1 -0
- package/dist/Toolbar/useToolbarOverflow.d.ts +49 -0
- package/dist/Toolbar/useToolbarOverflow.d.ts.map +1 -0
- package/dist/Toolbar/useToolbarOverflow.js +157 -0
- package/dist/Toolbar/useToolbarOverflow.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/testing/expectAgentDrivable.d.ts.map +1 -1
- package/dist/testing/expectAgentDrivable.js +32 -7
- package/dist/testing/expectAgentDrivable.js.map +1 -1
- package/package.json +2 -2
- package/src/Toolbar/Toolbar.mdx +126 -0
- package/src/Toolbar/Toolbar.stories.tsx +347 -0
- package/src/Toolbar/Toolbar.test.tsx +286 -0
- package/src/Toolbar/Toolbar.tsx +461 -0
- package/src/Toolbar/ToolbarSlot.tsx +122 -0
- package/src/Toolbar/chooseVisibleCount.test.ts +92 -0
- package/src/Toolbar/chooseVisibleCount.ts +92 -0
- package/src/Toolbar/useToolbarOverflow.ts +229 -0
- package/src/icons.storyHelpers.tsx +23 -0
- package/src/index.ts +8 -0
- package/src/sourceRules.test.ts +7 -1
- package/src/testing/expectAgentDrivable.ts +50 -20
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { useCallback, useLayoutEffect, useRef, useState, } from "react";
|
|
2
|
+
import { chooseVisibleCount } from "./chooseVisibleCount.js";
|
|
3
|
+
/**
|
|
4
|
+
* The measuring half of progressive overflow — `chooseVisibleCount`
|
|
5
|
+
* is the decision, this is the tape measure.
|
|
6
|
+
*
|
|
7
|
+
* ## Measured, not breakpointed
|
|
8
|
+
*
|
|
9
|
+
* mux-magic collapses at a hardcoded `480px` and plex-channels at a
|
|
10
|
+
* hardcoded `760px`, and both numbers are wrong the moment a label
|
|
11
|
+
* gets longer, the density axis changes, or a rail takes half the
|
|
12
|
+
* row. A measured bar has no number to be wrong: it asks the
|
|
13
|
+
* elements how wide they actually are, in the font and density they
|
|
14
|
+
* are actually rendered in.
|
|
15
|
+
*
|
|
16
|
+
* ## One instance, and cached widths
|
|
17
|
+
*
|
|
18
|
+
* An item that has collapsed is **not in the DOM** — that is the
|
|
19
|
+
* whole point, against a mechanism that renders every action twice
|
|
20
|
+
* and hides one with a CSS specificity coin-flip. So its width
|
|
21
|
+
* cannot be re-read while it is away, and it is remembered from
|
|
22
|
+
* when it was last in the bar instead.
|
|
23
|
+
*
|
|
24
|
+
* The first paint is what seeds the cache: every item starts in the
|
|
25
|
+
* bar (`chooseVisibleCount` returns all of them for an unmeasured
|
|
26
|
+
* container), gets measured, and the row collapses **before paint**
|
|
27
|
+
* because the measuring runs in a layout effect. Any item whose
|
|
28
|
+
* width is still unknown forces one more all-visible pass rather
|
|
29
|
+
* than being guessed at — one extra layout pass, and it converges,
|
|
30
|
+
* because a mounted item always measures.
|
|
31
|
+
*
|
|
32
|
+
* ⚠️ **The measured element must not be sized by its own contents.**
|
|
33
|
+
* If the bar shrink-wraps its items, collapsing one narrows the box,
|
|
34
|
+
* which collapses another — a loop with no error anywhere.
|
|
35
|
+
* `Toolbar`'s root is `flex-1 min-w-0` for exactly this reason, the
|
|
36
|
+
* same trap `useAdaptiveColumns` documents about a container capped
|
|
37
|
+
* by its own answer.
|
|
38
|
+
*/
|
|
39
|
+
export const useToolbarOverflow = ({ itemKeys, }) => {
|
|
40
|
+
const containerRef = useRef(null);
|
|
41
|
+
const itemElements = useRef(new Map());
|
|
42
|
+
const triggerElement = useRef(null);
|
|
43
|
+
const itemInlineSizes = useRef(new Map());
|
|
44
|
+
/**
|
|
45
|
+
* Zero until the trigger has been in the row once.
|
|
46
|
+
*
|
|
47
|
+
* A bar that has never overflowed has no trigger to measure, and
|
|
48
|
+
* the very first decision to collapse is taken without one. It
|
|
49
|
+
* errs the only safe way: with the trigger costed at nothing, the
|
|
50
|
+
* chosen count is at worst one item too many, which resolves on
|
|
51
|
+
* the next pass once the trigger exists and measures.
|
|
52
|
+
*/
|
|
53
|
+
const triggerInlineSize = useRef(0);
|
|
54
|
+
const [visibleCount, setVisibleCount] = useState(itemKeys.length);
|
|
55
|
+
/**
|
|
56
|
+
* Written during render, and deliberately.
|
|
57
|
+
*
|
|
58
|
+
* `itemKeys` is a fresh array on every render of the caller, so
|
|
59
|
+
* depending on it would give `measure` a new identity each time
|
|
60
|
+
* — which re-subscribes the `ResizeObserver` on every render. A
|
|
61
|
+
* ref is a pure cache here: a render React throws away and
|
|
62
|
+
* re-runs writes the same value, and nothing observable happens.
|
|
63
|
+
* Same reasoning as `useClonedChild`'s `useShallowStable`.
|
|
64
|
+
*/
|
|
65
|
+
const itemKeysRef = useRef(itemKeys);
|
|
66
|
+
itemKeysRef.current = itemKeys;
|
|
67
|
+
const measure = useCallback(() => {
|
|
68
|
+
const container = containerRef.current;
|
|
69
|
+
if (!container) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const keys = itemKeysRef.current;
|
|
73
|
+
for (const [key, element] of itemElements.current) {
|
|
74
|
+
itemInlineSizes.current.set(key, element.getBoundingClientRect().width);
|
|
75
|
+
}
|
|
76
|
+
if (triggerElement.current) {
|
|
77
|
+
triggerInlineSize.current =
|
|
78
|
+
triggerElement.current.getBoundingClientRect().width;
|
|
79
|
+
}
|
|
80
|
+
const hasEveryWidth = keys.every((key) => itemInlineSizes.current.has(key));
|
|
81
|
+
const next = hasEveryWidth
|
|
82
|
+
? chooseVisibleCount({
|
|
83
|
+
availableInlineSize: container.clientWidth,
|
|
84
|
+
gapInlineSize: Number.parseFloat(getComputedStyle(container).columnGap) || 0,
|
|
85
|
+
itemInlineSizes: keys.map((key) => itemInlineSizes.current.get(key) ?? 0),
|
|
86
|
+
triggerInlineSize: triggerInlineSize.current,
|
|
87
|
+
})
|
|
88
|
+
: // An item that has never been mounted has no width. Show
|
|
89
|
+
// everything for one pass so it can be measured, rather
|
|
90
|
+
// than guessing a number and collapsing around it.
|
|
91
|
+
keys.length;
|
|
92
|
+
setVisibleCount((current) => current === next ? current : next);
|
|
93
|
+
}, []);
|
|
94
|
+
/**
|
|
95
|
+
* A layout effect, not an effect: it runs after the DOM is
|
|
96
|
+
* written and **before the browser paints**, so the collapse that
|
|
97
|
+
* follows the first measurement is never a visible flash of a bar
|
|
98
|
+
* too wide for its box.
|
|
99
|
+
*
|
|
100
|
+
* No dependency array — it re-measures after every render, which
|
|
101
|
+
* is what keeps a changed label or a new item honest. It is cheap
|
|
102
|
+
* and it converges: `setVisibleCount` bails on an unchanged
|
|
103
|
+
* answer, so a stable bar renders once and stops.
|
|
104
|
+
*/
|
|
105
|
+
useLayoutEffect(measure);
|
|
106
|
+
useLayoutEffect(() => {
|
|
107
|
+
const container = containerRef.current;
|
|
108
|
+
if (!container) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Only when the **box** changed.
|
|
113
|
+
*
|
|
114
|
+
* A `ResizeObserver` delivers a record on observe and again for
|
|
115
|
+
* every content reflow inside the frame it fired in, and
|
|
116
|
+
* measuring from each one is what raises chromium's
|
|
117
|
+
* "ResizeObserver loop completed with undelivered
|
|
118
|
+
* notifications" — the callback doing work that schedules more
|
|
119
|
+
* observation. The item-side re-measure is already covered by
|
|
120
|
+
* the layout effect above; this subscription exists for one
|
|
121
|
+
* question, which is whether the container got wider or
|
|
122
|
+
* narrower.
|
|
123
|
+
*/
|
|
124
|
+
let lastInlineSize = -1;
|
|
125
|
+
const observer = new ResizeObserver(([entry]) => {
|
|
126
|
+
const inlineSize = entry?.contentRect.width ??
|
|
127
|
+
container.getBoundingClientRect().width;
|
|
128
|
+
if (inlineSize === lastInlineSize) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
lastInlineSize = inlineSize;
|
|
132
|
+
measure();
|
|
133
|
+
});
|
|
134
|
+
observer.observe(container);
|
|
135
|
+
return () => {
|
|
136
|
+
observer.disconnect();
|
|
137
|
+
};
|
|
138
|
+
}, [measure]);
|
|
139
|
+
const trackItem = useCallback((key, element) => {
|
|
140
|
+
if (element) {
|
|
141
|
+
itemElements.current.set(key, element);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
itemElements.current.delete(key);
|
|
145
|
+
}
|
|
146
|
+
}, []);
|
|
147
|
+
const trackTrigger = useCallback((element) => {
|
|
148
|
+
triggerElement.current = element;
|
|
149
|
+
}, []);
|
|
150
|
+
return {
|
|
151
|
+
containerRef,
|
|
152
|
+
trackItem,
|
|
153
|
+
trackTrigger,
|
|
154
|
+
visibleCount,
|
|
155
|
+
};
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=useToolbarOverflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useToolbarOverflow.js","sourceRoot":"","sources":["../../src/Toolbar/useToolbarOverflow.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -136,6 +136,9 @@ export type { ToastRecord, ToastRegionProps, } from "./Toast/ToastRegion.tsx";
|
|
|
136
136
|
export { ToastRegion } from "./Toast/ToastRegion.tsx";
|
|
137
137
|
export type { ToastStatus } from "./Toast/toastLifecycle.ts";
|
|
138
138
|
export { toastTransitions } from "./Toast/toastLifecycle.ts";
|
|
139
|
+
export { chooseVisibleCount } from "./Toolbar/chooseVisibleCount.ts";
|
|
140
|
+
export type { ToolbarAction, ToolbarControl, ToolbarItem, ToolbarProps, } from "./Toolbar/Toolbar.tsx";
|
|
141
|
+
export { Toolbar } from "./Toolbar/Toolbar.tsx";
|
|
139
142
|
export type { TooltipProps } from "./Tooltip/Tooltip.tsx";
|
|
140
143
|
export { Tooltip } from "./Tooltip/Tooltip.tsx";
|
|
141
144
|
export { toClassName } from "./toClassName.ts";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -84,6 +84,8 @@ export { TextLink } from "./TextLink/TextLink.js";
|
|
|
84
84
|
export { Toast } from "./Toast/Toast.js";
|
|
85
85
|
export { ToastRegion } from "./Toast/ToastRegion.js";
|
|
86
86
|
export { toastTransitions } from "./Toast/toastLifecycle.js";
|
|
87
|
+
export { chooseVisibleCount } from "./Toolbar/chooseVisibleCount.js";
|
|
88
|
+
export { Toolbar } from "./Toolbar/Toolbar.js";
|
|
87
89
|
export { Tooltip } from "./Tooltip/Tooltip.js";
|
|
88
90
|
export { toClassName } from "./toClassName.js";
|
|
89
91
|
export { VisuallyHidden } from "./VisuallyHidden/VisuallyHidden.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expectAgentDrivable.d.ts","sourceRoot":"","sources":["../../src/testing/expectAgentDrivable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,cAAc,EAAE,CACd,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,KACjC,WAAW,EAAE,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;
|
|
1
|
+
{"version":3,"file":"expectAgentDrivable.d.ts","sourceRoot":"","sources":["../../src/testing/expectAgentDrivable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,cAAc,EAAE,CACd,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,KACjC,WAAW,EAAE,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAwHD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,YAAY,EACpB,QAAQ,WAAW,KAClB,WAqHF,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,GACjC,SAAS,OAAO,KACf,IAMF,CAAA"}
|
|
@@ -62,14 +62,32 @@ const COMPOSITE_MEMBER_ROLES = new Set([
|
|
|
62
62
|
"tab",
|
|
63
63
|
"treeitem",
|
|
64
64
|
]);
|
|
65
|
+
/**
|
|
66
|
+
* A toolbar's members are ordinary controls.
|
|
67
|
+
*
|
|
68
|
+
* Every other composite here names its members by role — a `tab`, an
|
|
69
|
+
* `option`, a `menuitem`. A `role="toolbar"` names none of them: the
|
|
70
|
+
* APG's toolbar holds plain buttons, toggle buttons, a radio group,
|
|
71
|
+
* a menu button, and it is the *container* that declares the
|
|
72
|
+
* pattern. So `toolbar` sat in `COMPOSITE_ROLES` from M4 and was
|
|
73
|
+
* unreachable, because nothing inside one ever carried a member
|
|
74
|
+
* role — a roving toolbar was rejected outright with "has a negative
|
|
75
|
+
* tabindex", which is the assertion this helper makes for a
|
|
76
|
+
* *standalone* button and precisely the wrong one here.
|
|
77
|
+
*/
|
|
78
|
+
const TOOLBAR_MEMBER_SELECTOR = "a[href], button, input, select, textarea, [tabindex]";
|
|
79
|
+
const getGroupMembers = (group) => group.getAttribute("role") === "toolbar"
|
|
80
|
+
? Array.from(group.querySelectorAll(TOOLBAR_MEMBER_SELECTOR))
|
|
81
|
+
: Array.from(group.querySelectorAll("[role]")).filter((member) => COMPOSITE_MEMBER_ROLES.has(member.getAttribute("role") ?? ""));
|
|
65
82
|
const getCompositeGroup = (element) => {
|
|
66
|
-
|
|
67
|
-
return null;
|
|
68
|
-
}
|
|
83
|
+
const isMemberByRole = COMPOSITE_MEMBER_ROLES.has(element.getAttribute("role") ?? "");
|
|
69
84
|
let current = element.parentElement;
|
|
70
85
|
while (current) {
|
|
71
|
-
|
|
72
|
-
|
|
86
|
+
const groupRole = current.getAttribute("role") ?? "";
|
|
87
|
+
if (COMPOSITE_ROLES.has(groupRole)) {
|
|
88
|
+
return groupRole === "toolbar" || isMemberByRole
|
|
89
|
+
? current
|
|
90
|
+
: null;
|
|
73
91
|
}
|
|
74
92
|
current = current.parentElement;
|
|
75
93
|
}
|
|
@@ -136,9 +154,16 @@ export const expectAgentDrivable = (canvas, target) => {
|
|
|
136
154
|
// *group* reachable, exactly once". Zero tab stops strands the
|
|
137
155
|
// whole widget; several put every member back in the tab
|
|
138
156
|
// order, which is the pattern not being implemented at all.
|
|
139
|
-
const tabStops =
|
|
140
|
-
!member.hasAttribute("disabled") &&
|
|
157
|
+
const tabStops = getGroupMembers(group).filter((member) => !member.hasAttribute("disabled") &&
|
|
141
158
|
member.getAttribute("aria-disabled") !== "true" &&
|
|
159
|
+
// floating-ui plants `aria-hidden` focus guards
|
|
160
|
+
// (`<span tabindex="0">`) either side of an overlay's
|
|
161
|
+
// reference element, and a toolbar holding an overflow
|
|
162
|
+
// trigger therefore contains two. They are not members of
|
|
163
|
+
// anything — a screen reader and an agent both skip them —
|
|
164
|
+
// and counting them reported a correct roving group as
|
|
165
|
+
// having three tab stops.
|
|
166
|
+
!getIsHiddenFromAgents(member) &&
|
|
142
167
|
member.tabIndex >= 0);
|
|
143
168
|
if (tabStops.length !== 1) {
|
|
144
169
|
throw new Error(`Not agent-drivable: ${describeTarget(target)} is inside a \`${group.getAttribute("role")}\` with ${tabStops.length} tab stops. A roving-tabindex group needs exactly one — Tab enters and leaves it once, and the arrow keys move within it.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expectAgentDrivable.js","sourceRoot":"","sources":["../../src/testing/expectAgentDrivable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAmBH,MAAM,cAAc,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAe,EAAE,EAAE,CACrD,IAAI,KAAK,SAAS;IAChB,CAAC,CAAC,SAAS,IAAI,GAAG;IAClB,CAAC,CAAC,SAAS,IAAI,WACX,OAAO,IAAI,KAAK,QAAQ;QACtB,CAAC,CAAC,IAAI,IAAI,GAAG;QACb,CAAC,CAAC,MAAM,CAAC,IAAI,CACjB,EAAE,CAAA;AAER;;;;;;;;;;;;;;;GAeG;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,MAAM;IACN,SAAS;IACT,MAAM;IACN,SAAS;IACT,YAAY;IACZ,SAAS;IACT,SAAS;IACT,MAAM;IACN,UAAU;CACX,CAAC,CAAA;AAEF,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,UAAU;IACV,UAAU;IACV,kBAAkB;IAClB,eAAe;IACf,QAAQ;IACR,OAAO;IACP,KAAK;IACL,UAAU;CACX,CAAC,CAAA;AAEF,MAAM,
|
|
1
|
+
{"version":3,"file":"expectAgentDrivable.js","sourceRoot":"","sources":["../../src/testing/expectAgentDrivable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAmBH,MAAM,cAAc,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAe,EAAE,EAAE,CACrD,IAAI,KAAK,SAAS;IAChB,CAAC,CAAC,SAAS,IAAI,GAAG;IAClB,CAAC,CAAC,SAAS,IAAI,WACX,OAAO,IAAI,KAAK,QAAQ;QACtB,CAAC,CAAC,IAAI,IAAI,GAAG;QACb,CAAC,CAAC,MAAM,CAAC,IAAI,CACjB,EAAE,CAAA;AAER;;;;;;;;;;;;;;;GAeG;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,MAAM;IACN,SAAS;IACT,MAAM;IACN,SAAS;IACT,YAAY;IACZ,SAAS;IACT,SAAS;IACT,MAAM;IACN,UAAU;CACX,CAAC,CAAA;AAEF,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,UAAU;IACV,UAAU;IACV,kBAAkB;IAClB,eAAe;IACf,QAAQ;IACR,OAAO;IACP,KAAK;IACL,UAAU;CACX,CAAC,CAAA;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,uBAAuB,GAC3B,sDAAsD,CAAA;AAExD,MAAM,eAAe,GAAG,CAAC,KAAc,EAAE,EAAE,CACzC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,SAAS;IACtC,CAAC,CAAC,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,gBAAgB,CACpB,uBAAuB,CACxB,CACF;IACH,CAAC,CAAC,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,gBAAgB,CAAc,QAAQ,CAAC,CAC9C,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAClB,sBAAsB,CAAC,GAAG,CACxB,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAClC,CACF,CAAA;AAEP,MAAM,iBAAiB,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC7C,MAAM,cAAc,GAAG,sBAAsB,CAAC,GAAG,CAC/C,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CACnC,CAAA;IAED,IAAI,OAAO,GAAG,OAAO,CAAC,aAAa,CAAA;IAEnC,OAAO,OAAO,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;QAEpD,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,OAAO,SAAS,KAAK,SAAS,IAAI,cAAc;gBAC9C,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,IAAI,CAAA;QACV,CAAC;QAED,OAAO,GAAG,OAAO,CAAC,aAAa,CAAA;IACjC,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,qBAAqB,GAAG,CAAC,OAAgB,EAAE,EAAE;IACjD,IAAI,OAAO,GAAmB,OAAO,CAAA;IAErC,OAAO,OAAO,EAAE,CAAC;QACf,IACE,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,MAAM;YAC9C,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,EAC7B,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,GAAG,OAAO,CAAC,aAAa,CAAA;IACjC,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,MAAoB,EACpB,MAAmB,EACN,EAAE;IACf,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,CACnC,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,IAAI,KAAK,SAAS;QACvB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAC1B,CAAA;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,uCAAuC,cAAc,CACnD,MAAM,CACP,gLAAgL,CAClL,CAAA;IACH,CAAC;IAED,kEAAkE;IAClE,kEAAkE;IAClE,gEAAgE;IAChE,6BAA6B;IAC7B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,uBACE,OAAO,CAAC,MACV,mBAAmB,cAAc,CAC/B,MAAM,CACP,0EAA0E,CAC5E,CAAA;IACH,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;IAEzB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,uBAAuB,cAAc,CACnC,MAAM,CACP,4BAA4B,CAC9B,CAAA;IACH,CAAC;IAED,IAAI,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,uBAAuB,cAAc,CACnC,MAAM,CACP,4GAA4G,CAC9G,CAAA;IACH,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,gCAAgC,cAAc,CAC5C,MAAM,CACP,sJAAsJ,CACxJ,CAAA;IACH,CAAC;IAED,MAAM,qBAAqB,GAAG;QAC5B,GAAG;QACH,QAAQ;QACR,OAAO;QACP,QAAQ;QACR,UAAU;KACX,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;IAEzC,MAAM,UAAU,GACd,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC;QAChC,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,MAAM,CAAA;IAElD,IACE,qBAAqB;QACrB,CAAC,UAAU;QACX,OAAO,CAAC,QAAQ,GAAG,CAAC,EACpB,CAAC;QACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;QAExC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,uBAAuB,cAAc,CACnC,MAAM,CACP,4EAA4E,CAC9E,CAAA;QACH,CAAC;QAED,wDAAwD;QACxD,2DAA2D;QAC3D,+DAA+D;QAC/D,yDAAyD;QACzD,4DAA4D;QAC5D,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,MAAM,CAC5C,CAAC,MAAM,EAAE,EAAE,CACT,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC;YAChC,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,MAAM;YAC/C,gDAAgD;YAChD,sDAAsD;YACtD,uDAAuD;YACvD,0DAA0D;YAC1D,2DAA2D;YAC3D,uDAAuD;YACvD,0BAA0B;YAC1B,CAAC,qBAAqB,CAAC,MAAM,CAAC;YAC9B,MAAM,CAAC,QAAQ,IAAI,CAAC,CACvB,CAAA;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,uBAAuB,cAAc,CACnC,MAAM,CACP,kBAAkB,KAAK,CAAC,YAAY,CACnC,MAAM,CACP,WACC,QAAQ,CAAC,MACX,2HAA2H,CAC5H,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,OAAgB,EACV,EAAE;IACR,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,yNAAyN,CAC1N,CAAA;IACH,CAAC;AACH,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@charcuterie/ui",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.12.0",
|
|
4
4
|
"description": "The Charcuterie components. Tokens for look, @charcuterie/logic for state, ARIA that agents can actually drive.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"typecheck": "tsc --noEmit"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@charcuterie/logic": "1.
|
|
51
|
+
"@charcuterie/logic": "1.3.0",
|
|
52
52
|
"@charcuterie/tokens": "1.5.0",
|
|
53
53
|
"@floating-ui/react": "^0.27.20",
|
|
54
54
|
"@tanstack/react-virtual": "^3.13.12"
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { Canvas, Controls, Meta } from "@storybook/addon-docs/blocks";
|
|
2
|
+
|
|
3
|
+
import * as ToolbarStories from "./Toolbar.stories";
|
|
4
|
+
|
|
5
|
+
<Meta of={ToolbarStories} />
|
|
6
|
+
|
|
7
|
+
# Toolbar
|
|
8
|
+
|
|
9
|
+
A row of controls that collapses into an overflow when it runs out of room — measured, not
|
|
10
|
+
breakpointed, with **exactly one instance** of every control in the document.
|
|
11
|
+
|
|
12
|
+
<Canvas of={ToolbarStories.Default} />
|
|
13
|
+
|
|
14
|
+
## Props
|
|
15
|
+
|
|
16
|
+
<Controls />
|
|
17
|
+
|
|
18
|
+
## What four repos got wrong
|
|
19
|
+
|
|
20
|
+
mux-magic's `PageHeader` is the fleet's original, and plex-channels' `Header` names it in
|
|
21
|
+
its own comments as the thing it copied. Both inherit all of this:
|
|
22
|
+
|
|
23
|
+
| Defect | There | Here |
|
|
24
|
+
| --- | --- | --- |
|
|
25
|
+
| `role="toolbar"`, no toolbar keyboard model | six sequential tab stops | one tab stop, arrow keys, `RovingFocus` |
|
|
26
|
+
| Toggles with no state | `Switch` is an `aria-hidden` `<span>`; Dry Run announces identically on and off | the control is the app's own, and `Switch` carries `role="switch"` |
|
|
27
|
+
| Triggers advertise nothing | zero `aria-expanded` / `aria-haspopup` / `aria-controls` in the file | written by `useRole`, inside `Menu` / `Popover` |
|
|
28
|
+
| No focus management | no focus-on-open, no return-to-trigger | `Menu` seeds the first item; `FloatingFocusManager` returns focus |
|
|
29
|
+
| Collapse by DOM duplication | every action rendered twice, one copy hidden by a documented CSS specificity coin-flip | one instance, relocated |
|
|
30
|
+
| Nothing decides what collapses | two hardcoded media queries at 480/481px, ⋮ shown at every width | measured, priority-ordered, trigger only when something overflowed |
|
|
31
|
+
|
|
32
|
+
## The overflow's role is a **type**, not a flag
|
|
33
|
+
|
|
34
|
+
`role="menu"` permits only `menuitem`, `menuitemradio`, `menuitemcheckbox`, `group` and
|
|
35
|
+
`separator`. A header overflow usually is not a menu — it holds toggles — and
|
|
36
|
+
plex-channels puts a `ColorSchemeSwitcher` inside one today, which is invalid ARIA that no
|
|
37
|
+
gate catches.
|
|
38
|
+
|
|
39
|
+
So the caller cannot get it wrong:
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
// Every row is an action → a real `role="menu"`.
|
|
43
|
+
<Toolbar overflow="menu" items={[{ key: "retry", label: "Retry", onSelect }]} label="Deck actions" />
|
|
44
|
+
|
|
45
|
+
// A control in the array → this is a compile error with `overflow="menu"`,
|
|
46
|
+
// and requires `overflow="panel"`, which opens a `Popover`
|
|
47
|
+
// (`role="dialog"`, `aria-haspopup="dialog"`).
|
|
48
|
+
<Toolbar
|
|
49
|
+
overflow="panel"
|
|
50
|
+
items={[
|
|
51
|
+
{ key: "retry", label: "Retry", onSelect },
|
|
52
|
+
{ element: <DryRunSwitch />, key: "dry-run", type: "control" },
|
|
53
|
+
]}
|
|
54
|
+
label="Deck controls"
|
|
55
|
+
/>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Same instinct as
|
|
59
|
+
[`Menu`'s items being a discriminated union](../../../docs/decisions/2026-08-05-menu-items-is-a-discriminated-union.md):
|
|
60
|
+
the kinds are told apart by the type system, in the data, rather than by a boolean prop or
|
|
61
|
+
a runtime warning.
|
|
62
|
+
|
|
63
|
+
<Canvas of={ToolbarStories.AllVariants} />
|
|
64
|
+
|
|
65
|
+
## Priority is the array order
|
|
66
|
+
|
|
67
|
+
`items[0]` is the last thing to collapse, and it is also paint order. One axis rather than
|
|
68
|
+
two, because a separate `priority` number beside a separate display order is a pair a
|
|
69
|
+
caller can put out of step.
|
|
70
|
+
|
|
71
|
+
<Canvas of={ToolbarStories.Responsive} />
|
|
72
|
+
|
|
73
|
+
## Measured, not breakpointed
|
|
74
|
+
|
|
75
|
+
There is no `collapseAt` prop. The bar reads the widths its items actually have, so a
|
|
76
|
+
longer label, a different font, or `data-density="kiosk"` moves the collapse point on its
|
|
77
|
+
own — where `480px` is wrong the moment any of those change.
|
|
78
|
+
|
|
79
|
+
Two consequences worth knowing:
|
|
80
|
+
|
|
81
|
+
- **The root is `flex-1 min-w-0`, and must stay sized by its container.** A bar that
|
|
82
|
+
shrink-wraps its items would narrow when one collapsed, which would collapse another —
|
|
83
|
+
a loop with no error anywhere. `useAdaptiveColumns` documents the same trap from the
|
|
84
|
+
other end.
|
|
85
|
+
- **A collapsed item's width is remembered, not re-read.** It is not in the DOM to
|
|
86
|
+
measure. The first paint mounts everything, measures it, and collapses *before paint* in
|
|
87
|
+
a layout effect.
|
|
88
|
+
|
|
89
|
+
## The keyboard model
|
|
90
|
+
|
|
91
|
+
Tab **once** to enter, then:
|
|
92
|
+
|
|
93
|
+
| Key | Does |
|
|
94
|
+
| --- | --- |
|
|
95
|
+
| `ArrowRight` / `ArrowLeft` | move to the next / previous member |
|
|
96
|
+
| `Home` / `End` | jump to the first / last member |
|
|
97
|
+
| `Tab` | leaves the toolbar entirely |
|
|
98
|
+
|
|
99
|
+
The overflow trigger is the group's last member, so the arrow keys reach it. Clicking a
|
|
100
|
+
member, or tabbing into the group, makes that member active — so the next arrow key
|
|
101
|
+
continues from where the user is.
|
|
102
|
+
|
|
103
|
+
A **disabled** action is simply not registered with the roving group, so the arrows skip it
|
|
104
|
+
while it stays in the DOM and stays announced — the same mechanism `Menu` and
|
|
105
|
+
`SegmentedControl` use.
|
|
106
|
+
|
|
107
|
+
<Canvas of={ToolbarStories.AllStates} />
|
|
108
|
+
|
|
109
|
+
## Controls the toolbar does not render
|
|
110
|
+
|
|
111
|
+
A `control` item is the app's own element, and the tab stop is written onto the first
|
|
112
|
+
focusable in its subtree rather than cloned in as a prop: most components in this library
|
|
113
|
+
forward no `tabIndex`, so a clone would compile, do nothing, and leave the bar with one tab
|
|
114
|
+
stop per control.
|
|
115
|
+
|
|
116
|
+
A control holding **more than one** focusable is a nested composite this component does not
|
|
117
|
+
manage — only the first gets the tab stop. Put a `SegmentedControl` in a toolbar and it
|
|
118
|
+
brings its own arrow-key model; that is the APG's expectation too.
|
|
119
|
+
|
|
120
|
+
## Relocating is a different job
|
|
121
|
+
|
|
122
|
+
Progressive collapse answers *what fits*. On a phone the whole bar often wants to leave the
|
|
123
|
+
header, which is a layout decision — `useMediaQuery` from `@charcuterie/logic`, over the
|
|
124
|
+
`matchMediaMatcher` seam, and one instance mounted in one place or the other.
|
|
125
|
+
|
|
126
|
+
<Canvas of={ToolbarStories.InAppShell} />
|