@charcuterie/ui 4.5.1 → 4.7.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.
Files changed (58) hide show
  1. package/README.md +12 -0
  2. package/dist/LaneTimeline/LaneTimeline.d.ts +132 -0
  3. package/dist/LaneTimeline/LaneTimeline.d.ts.map +1 -0
  4. package/dist/LaneTimeline/LaneTimeline.js +165 -0
  5. package/dist/LaneTimeline/LaneTimeline.js.map +1 -0
  6. package/dist/LaneTimeline/LaneTimelineBar.d.ts +97 -0
  7. package/dist/LaneTimeline/LaneTimelineBar.d.ts.map +1 -0
  8. package/dist/LaneTimeline/LaneTimelineBar.js +69 -0
  9. package/dist/LaneTimeline/LaneTimelineBar.js.map +1 -0
  10. package/dist/LaneTimeline/LaneTimelineLane.d.ts +84 -0
  11. package/dist/LaneTimeline/LaneTimelineLane.d.ts.map +1 -0
  12. package/dist/LaneTimeline/LaneTimelineLane.js +109 -0
  13. package/dist/LaneTimeline/LaneTimelineLane.js.map +1 -0
  14. package/dist/LaneTimeline/laneTimelineGeometry.d.ts +268 -0
  15. package/dist/LaneTimeline/laneTimelineGeometry.d.ts.map +1 -0
  16. package/dist/LaneTimeline/laneTimelineGeometry.js +277 -0
  17. package/dist/LaneTimeline/laneTimelineGeometry.js.map +1 -0
  18. package/dist/LaneTimeline/useTrackMeasurements.d.ts +69 -0
  19. package/dist/LaneTimeline/useTrackMeasurements.d.ts.map +1 -0
  20. package/dist/LaneTimeline/useTrackMeasurements.js +134 -0
  21. package/dist/LaneTimeline/useTrackMeasurements.js.map +1 -0
  22. package/dist/Overlay/OverlayPanel.d.ts.map +1 -1
  23. package/dist/Overlay/OverlayPanel.js +54 -2
  24. package/dist/Overlay/OverlayPanel.js.map +1 -1
  25. package/dist/Overlay/OverlayStack.d.ts +5 -0
  26. package/dist/Overlay/OverlayStack.d.ts.map +1 -1
  27. package/dist/Overlay/OverlayStack.js +2 -0
  28. package/dist/Overlay/OverlayStack.js.map +1 -1
  29. package/dist/Toast/ToastRegion.d.ts +61 -0
  30. package/dist/Toast/ToastRegion.d.ts.map +1 -1
  31. package/dist/Toast/ToastRegion.js +80 -3
  32. package/dist/Toast/ToastRegion.js.map +1 -1
  33. package/dist/Toolbar/useToolbarOverflow.d.ts.map +1 -1
  34. package/dist/Toolbar/useToolbarOverflow.js +39 -0
  35. package/dist/Toolbar/useToolbarOverflow.js.map +1 -1
  36. package/dist/index.d.ts +6 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +2 -0
  39. package/dist/index.js.map +1 -1
  40. package/package.json +3 -3
  41. package/src/LaneTimeline/LaneTimeline.mdx +191 -0
  42. package/src/LaneTimeline/LaneTimeline.stories.tsx +561 -0
  43. package/src/LaneTimeline/LaneTimeline.test.tsx +330 -0
  44. package/src/LaneTimeline/LaneTimeline.tsx +381 -0
  45. package/src/LaneTimeline/LaneTimelineBar.tsx +237 -0
  46. package/src/LaneTimeline/LaneTimelineLane.tsx +332 -0
  47. package/src/LaneTimeline/laneTimelineGeometry.test.ts +429 -0
  48. package/src/LaneTimeline/laneTimelineGeometry.ts +476 -0
  49. package/src/LaneTimeline/useTrackMeasurements.ts +165 -0
  50. package/src/Overlay/OverlayPanel.tsx +63 -2
  51. package/src/Overlay/OverlayStack.tsx +7 -1
  52. package/src/Toast/Toast.stories.tsx +154 -0
  53. package/src/Toast/ToastRegion.test.tsx +172 -0
  54. package/src/Toast/ToastRegion.tsx +120 -32
  55. package/src/Toolbar/Toolbar.test.tsx +84 -0
  56. package/src/Toolbar/useToolbarOverflow.ts +43 -0
  57. package/src/index.ts +13 -0
  58. package/src/sourceRules.test.ts +22 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"laneTimelineGeometry.js","sourceRoot":"","sources":["../../src/LaneTimeline/laneTimelineGeometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { RefObject } from "react";
2
+ /**
3
+ * The track's width, and the font size it is drawn in.
4
+ *
5
+ * ## Measured, because no breakpoint can answer this
6
+ *
7
+ * `Nav` folds its bar on a measured width and
8
+ * `useToolbarOverflow.ts` writes down the general form of the
9
+ * argument: mux-magic collapses at a hardcoded `480px`, plex-channels
10
+ * at `760px`, and neither number has a reason. A timeline has the
11
+ * same problem one level worse, because the question is not "how
12
+ * wide is the box" but **"how wide is one day"** — and that is the
13
+ * width divided by a number that lives in the data. Thirty columns
14
+ * in 900px is a readable month; three hundred and sixty five columns
15
+ * in the same 900px is a grey smear. A media query sees the first
16
+ * number and a container query sees the first number, so neither can
17
+ * decide this.
18
+ *
19
+ * ## Why the font size comes back too
20
+ *
21
+ * The minimum readable column is a multiple of the **type**, not a
22
+ * count of pixels. Every length in this token set moves with the
23
+ * density axis — `--font-size-md` is one thing on a desktop and
24
+ * another on the kiosk — so a column floor pinned at 20px is
25
+ * generous at one density and clips a two-digit date at the next.
26
+ * `Avatar` makes the same argument about a chip that stays 20px
27
+ * while the prose around it scales, and it is the same mistake.
28
+ *
29
+ * ⚠️ **The measured element must not be sized by its own contents.**
30
+ * The timeline reads its own box to decide what to draw in it, so a
31
+ * shrink-wrapping parent makes the answer its own input: fewer
32
+ * columns, narrower box, fewer columns. `LaneTimeline`'s root
33
+ * declares `container-type: inline-size`, which forbids exactly that
34
+ * — the same reason `Main` declares one — so the loop cannot form
35
+ * even when a caller drops the component into a `inline-flex` cell.
36
+ *
37
+ * ## The first paint
38
+ *
39
+ * `useLayoutEffect`, so the measurement lands **before the browser
40
+ * paints** and a timeline that has to fall back to the Narrow View
41
+ * never flashes an unreadable axis first. Same reasoning as
42
+ * `useToolbarOverflow`; the failure it prevents was visible on a
43
+ * kiosk Pi, where a slow first frame is on screen long enough to
44
+ * read.
45
+ *
46
+ * ## ⚠️ `trackRef` goes on a PROBE, never on the real track
47
+ *
48
+ * The one-way trap, and it is not hypothetical — the first draft
49
+ * had it. Attach this to the axis track itself and the Narrow View
50
+ * unmounts the element being measured, so the width never updates
51
+ * again and the timeline can never come back when the window
52
+ * widens. Hiding the track with `display: none` instead is worse: a
53
+ * hidden box measures 0, 0 reads as *unmeasured*, unmeasured shows
54
+ * the axis, the axis hides the fallback, and the component
55
+ * oscillates every frame.
56
+ *
57
+ * So the ref belongs to a zero-height `aria-hidden` cell that sits
58
+ * in the **same grid track** the axis would occupy and is rendered
59
+ * in both layouts. It answers the question actually being asked —
60
+ * *how wide would a day column be if I drew one* — in the layout
61
+ * where no day column exists.
62
+ */
63
+ export declare const useTrackMeasurements: () => {
64
+ fontSize: number;
65
+ inlineSize: number;
66
+ isMeasured: boolean;
67
+ trackRef: RefObject<HTMLDivElement | null>;
68
+ };
69
+ //# sourceMappingURL=useTrackMeasurements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTrackMeasurements.d.ts","sourceRoot":"","sources":["../../src/LaneTimeline/useTrackMeasurements.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAQtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AACH,eAAO,MAAM,oBAAoB,QAAO;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,OAAO,CAAA;IACnB,QAAQ,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;CA2F3C,CAAA"}
@@ -0,0 +1,134 @@
1
+ import { useCallback, useLayoutEffect, useRef, useState, } from "react";
2
+ /**
3
+ * The track's width, and the font size it is drawn in.
4
+ *
5
+ * ## Measured, because no breakpoint can answer this
6
+ *
7
+ * `Nav` folds its bar on a measured width and
8
+ * `useToolbarOverflow.ts` writes down the general form of the
9
+ * argument: mux-magic collapses at a hardcoded `480px`, plex-channels
10
+ * at `760px`, and neither number has a reason. A timeline has the
11
+ * same problem one level worse, because the question is not "how
12
+ * wide is the box" but **"how wide is one day"** — and that is the
13
+ * width divided by a number that lives in the data. Thirty columns
14
+ * in 900px is a readable month; three hundred and sixty five columns
15
+ * in the same 900px is a grey smear. A media query sees the first
16
+ * number and a container query sees the first number, so neither can
17
+ * decide this.
18
+ *
19
+ * ## Why the font size comes back too
20
+ *
21
+ * The minimum readable column is a multiple of the **type**, not a
22
+ * count of pixels. Every length in this token set moves with the
23
+ * density axis — `--font-size-md` is one thing on a desktop and
24
+ * another on the kiosk — so a column floor pinned at 20px is
25
+ * generous at one density and clips a two-digit date at the next.
26
+ * `Avatar` makes the same argument about a chip that stays 20px
27
+ * while the prose around it scales, and it is the same mistake.
28
+ *
29
+ * ⚠️ **The measured element must not be sized by its own contents.**
30
+ * The timeline reads its own box to decide what to draw in it, so a
31
+ * shrink-wrapping parent makes the answer its own input: fewer
32
+ * columns, narrower box, fewer columns. `LaneTimeline`'s root
33
+ * declares `container-type: inline-size`, which forbids exactly that
34
+ * — the same reason `Main` declares one — so the loop cannot form
35
+ * even when a caller drops the component into a `inline-flex` cell.
36
+ *
37
+ * ## The first paint
38
+ *
39
+ * `useLayoutEffect`, so the measurement lands **before the browser
40
+ * paints** and a timeline that has to fall back to the Narrow View
41
+ * never flashes an unreadable axis first. Same reasoning as
42
+ * `useToolbarOverflow`; the failure it prevents was visible on a
43
+ * kiosk Pi, where a slow first frame is on screen long enough to
44
+ * read.
45
+ *
46
+ * ## ⚠️ `trackRef` goes on a PROBE, never on the real track
47
+ *
48
+ * The one-way trap, and it is not hypothetical — the first draft
49
+ * had it. Attach this to the axis track itself and the Narrow View
50
+ * unmounts the element being measured, so the width never updates
51
+ * again and the timeline can never come back when the window
52
+ * widens. Hiding the track with `display: none` instead is worse: a
53
+ * hidden box measures 0, 0 reads as *unmeasured*, unmeasured shows
54
+ * the axis, the axis hides the fallback, and the component
55
+ * oscillates every frame.
56
+ *
57
+ * So the ref belongs to a zero-height `aria-hidden` cell that sits
58
+ * in the **same grid track** the axis would occupy and is rendered
59
+ * in both layouts. It answers the question actually being asked —
60
+ * *how wide would a day column be if I drew one* — in the layout
61
+ * where no day column exists.
62
+ */
63
+ export const useTrackMeasurements = () => {
64
+ const trackRef = useRef(null);
65
+ const [measurements, setMeasurements] = useState({
66
+ fontSize: 0,
67
+ inlineSize: 0,
68
+ /**
69
+ * Its own flag rather than `inlineSize > 0`, and the reason is
70
+ * written out on `getIsAxisReadable`: **zero is a real width
71
+ * here.** The track is a `minmax(0, 1fr)` column beside a fixed
72
+ * label rail, so any container narrower than the rail resolves
73
+ * it to exactly 0px — and reading that as "not measured yet"
74
+ * puts a thirty-column axis into a phone and calls it readable.
75
+ */
76
+ isMeasured: false,
77
+ });
78
+ const measure = useCallback(() => {
79
+ const track = trackRef.current;
80
+ if (!track) {
81
+ return;
82
+ }
83
+ const style = getComputedStyle(track);
84
+ const next = {
85
+ fontSize: Number.parseFloat(style.fontSize) || 0,
86
+ inlineSize: track.clientWidth,
87
+ isMeasured: true,
88
+ };
89
+ setMeasurements((current) => current.fontSize === next.fontSize &&
90
+ current.inlineSize === next.inlineSize &&
91
+ current.isMeasured
92
+ ? current
93
+ : next);
94
+ }, []);
95
+ useLayoutEffect(measure);
96
+ useLayoutEffect(() => {
97
+ const track = trackRef.current;
98
+ if (!track) {
99
+ return;
100
+ }
101
+ /**
102
+ * Only when the **box** changed.
103
+ *
104
+ * A `ResizeObserver` delivers a record on observe and again for
105
+ * every reflow inside the frame it fired in, and measuring from
106
+ * each one is what raises chromium's "ResizeObserver loop
107
+ * completed with undelivered notifications". The same guard
108
+ * `useToolbarOverflow` carries, for the same reason: this
109
+ * callback's own `setState` can reflow the element it is
110
+ * watching.
111
+ */
112
+ let lastInlineSize = -1;
113
+ const observer = new ResizeObserver(([entry]) => {
114
+ const inlineSize = entry?.contentRect.width ??
115
+ track.getBoundingClientRect().width;
116
+ if (inlineSize === lastInlineSize) {
117
+ return;
118
+ }
119
+ lastInlineSize = inlineSize;
120
+ measure();
121
+ });
122
+ observer.observe(track);
123
+ return () => {
124
+ observer.disconnect();
125
+ };
126
+ }, [measure]);
127
+ return {
128
+ fontSize: measurements.fontSize,
129
+ inlineSize: measurements.inlineSize,
130
+ isMeasured: measurements.isMeasured,
131
+ trackRef,
132
+ };
133
+ };
134
+ //# sourceMappingURL=useTrackMeasurements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTrackMeasurements.js","sourceRoot":"","sources":["../../src/LaneTimeline/useTrackMeasurements.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,eAAe,EACf,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAA;AAEd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAKlC,EAAE;IACF,MAAM,QAAQ,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAA;IAE7C,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC;QAC/C,QAAQ,EAAE,CAAC;QACX,UAAU,EAAE,CAAC;QACb;;;;;;;WAOG;QACH,UAAU,EAAE,KAAK;KAClB,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAA;QAE9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAM;QACR,CAAC;QAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;QAErC,MAAM,IAAI,GAAG;YACX,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YAChD,UAAU,EAAE,KAAK,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI;SACjB,CAAA;QAED,eAAe,CAAC,CAAC,OAAO,EAAE,EAAE,CAC1B,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;YAClC,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU;YACtC,OAAO,CAAC,UAAU;YAChB,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,IAAI,CACT,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,eAAe,CAAC,OAAO,CAAC,CAAA;IAExB,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAA;QAE9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAM;QACR,CAAC;QAED;;;;;;;;;;WAUG;QACH,IAAI,cAAc,GAAG,CAAC,CAAC,CAAA;QAEvB,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE;YAC9C,MAAM,UAAU,GACd,KAAK,EAAE,WAAW,CAAC,KAAK;gBACxB,KAAK,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAA;YAErC,IAAI,UAAU,KAAK,cAAc,EAAE,CAAC;gBAClC,OAAM;YACR,CAAC;YAED,cAAc,GAAG,UAAU,CAAA;YAE3B,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;QAEF,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAEvB,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,UAAU,EAAE,CAAA;QACvB,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAEb,OAAO;QACL,QAAQ,EAAE,YAAY,CAAC,QAAQ;QAC/B,UAAU,EAAE,YAAY,CAAC,UAAU;QACnC,UAAU,EAAE,YAAY,CAAC,UAAU;QACnC,QAAQ;KACT,CAAA;AACH,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"OverlayPanel.d.ts","sourceRoot":"","sources":["../../src/Overlay/OverlayPanel.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAOjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IAC5C,8CAA8C;IAC9C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,IAAI,CAAC,EAAE,aAAa,GAAG,QAAQ,CAAA;CAChC,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,6IAU1B,iBAAiB,KAAG,SA0HtB,CAAA"}
1
+ {"version":3,"file":"OverlayPanel.d.ts","sourceRoot":"","sources":["../../src/Overlay/OverlayPanel.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAOjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IAC5C,8CAA8C;IAC9C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,IAAI,CAAC,EAAE,aAAa,GAAG,QAAQ,CAAA;CAChC,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,6IAU1B,iBAAiB,KAAG,SAuLtB,CAAA"}
@@ -30,11 +30,46 @@ export const OverlayPanel = ({ "aria-label": ariaLabel, "aria-labelledby": ariaL
30
30
  // `outsidePress` on a *lower* modal would close it too, so it is
31
31
  // scoped to the top — which is also why the scrim needs no click
32
32
  // handler of its own.
33
- outsidePress: isDismissable && isTop,
33
+ outsidePress: (event) => {
34
+ if (!isDismissable || !isTop)
35
+ return false;
36
+ /*
37
+ * ⚠️ A press on a toast is NOT an outside press.
38
+ *
39
+ * A `ToastRegion` renders in the page, so floating-ui sees a
40
+ * press on its Undo as a press outside the floating element
41
+ * — and closing the modal on the way to taking an action
42
+ * back is the opposite of what the button says. The region
43
+ * marks itself with `data-charcuterie-toast-region`; nothing
44
+ * else in the fleet carries that attribute.
45
+ *
46
+ * ⚠️ Do not delete this on the evidence of a small story.
47
+ * floating-ui has a *second*, accidental guard that hides
48
+ * this one: `closeOnPressOutside` bails out early when the
49
+ * press target's body-level ancestor contains none of the
50
+ * `[data-floating-ui-inert]` markers `markOthers` left
51
+ * behind, on the theory that such an element was injected
52
+ * after the panel opened. A page that is nothing but a
53
+ * region takes that branch and never reaches this predicate
54
+ * at all. A page with content beside the region — every real
55
+ * app — does reach it. `Toast.stories.tsx`'s
56
+ * `OverStackedModals` carries a heading and a paragraph for
57
+ * exactly that reason, and `ToastRegion.test.tsx` fails
58
+ * without this predicate only because they are there.
59
+ */
60
+ const target = event.target;
61
+ return (target?.closest?.("[data-charcuterie-toast-region]") == null);
62
+ },
34
63
  }),
35
64
  useRole(context, { role }),
36
65
  ]);
37
66
  const { register, unregister } = stack;
67
+ /**
68
+ * Where this panel sits in the stack, and therefore how far above
69
+ * `--layer-modal` it paints. `0` when unprovided — a lone `Modal`
70
+ * is the only thing open.
71
+ */
72
+ const stackIndex = Math.max(stack.orderedIds.indexOf(id), 0);
38
73
  useEffect(() => {
39
74
  if (!isVisible) {
40
75
  return;
@@ -58,7 +93,24 @@ export const OverlayPanel = ({ "aria-label": ariaLabel, "aria-labelledby": ariaL
58
93
  if (!isVisible) {
59
94
  return null;
60
95
  }
61
- return (_jsxs(_Fragment, { children: [stack.isProvided ? null : (_jsx(SharedBackdrop, { isVisible: true })), _jsx(FloatingPortal, { children: _jsx("div", { className: "fixed inset-0 z-[var(--layer-modal)] flex items-center justify-center", children: _jsx(FloatingFocusManager, { context: context,
96
+ return (_jsxs(_Fragment, { children: [stack.isProvided ? null : (_jsx(SharedBackdrop, { isVisible: true })), _jsx(FloatingPortal, { children: _jsx("div", { className: "fixed inset-0 flex items-center justify-center",
97
+ /*
98
+ * ⚠️ Cascading, not one shared layer.
99
+ *
100
+ * Every panel used to render at the one `--layer-modal`, and
101
+ * which of two open modals painted on top fell out of the
102
+ * order their portals happened to be appended in. A modal
103
+ * opened from inside another is the case that made this
104
+ * visible. The index in the stack is the answer the stack
105
+ * already knows.
106
+ *
107
+ * The scale's gaps are 100, so a cascade this deep is
108
+ * arithmetic nobody has to think about — and the toast sits
109
+ * at `--layer-toast` plus the same depth, above all of it.
110
+ */
111
+ style: {
112
+ zIndex: `calc(var(--layer-modal) + ${stackIndex})`,
113
+ }, children: _jsx(FloatingFocusManager, { context: context,
62
114
  // `undefined` keeps the manager's own default (the first
63
115
  // tabbable), so nothing changes for a panel that does not
64
116
  // ask.
@@ -1 +1 @@
1
- {"version":3,"file":"OverlayPanel.js","sourceRoot":"","sources":["../../src/Overlay/OverlayPanel.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OverlayPanel.js","sourceRoot":"","sources":["../../src/Overlay/OverlayPanel.tsx"],"names":[],"mappings":"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"}
@@ -28,6 +28,11 @@ export type OverlayStackEntry = {
28
28
  };
29
29
  export type OverlayStackValue = {
30
30
  depth: number;
31
+ /**
32
+ * The open ids, oldest first. A panel reads its own index out of
33
+ * this to cascade its z-index above the one below it.
34
+ */
35
+ orderedIds: string[];
31
36
  /**
32
37
  * `false` in the context default. An `OverlayPanel` reads this to
33
38
  * decide whether to render its own scrim (unprovided) or defer to
@@ -1 +1 @@
1
- {"version":3,"file":"OverlayStack.d.ts","sourceRoot":"","sources":["../../src/Overlay/OverlayStack.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAWtC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,UAAU,EAAE,OAAO,CAAA;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAA;IAC5C,sEAAsE;IACtE,eAAe,EAAE,MAAM,IAAI,CAAA;IAC3B,KAAK,EAAE,IAAI,GAAG,MAAM,CAAA;IACpB,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CACjC,CAAA;AAcD,eAAO,MAAM,eAAe,QAAO,iBACF,CAAA;AAEjC,eAAO,MAAM,oBAAoB,GAAI,eAElC;IACD,QAAQ,EAAE,SAAS,CAAA;CACpB,KAAG,SAyDH,CAAA"}
1
+ {"version":3,"file":"OverlayStack.d.ts","sourceRoot":"","sources":["../../src/Overlay/OverlayStack.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAWtC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB;;;;OAIG;IACH,UAAU,EAAE,OAAO,CAAA;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAA;IAC5C,sEAAsE;IACtE,eAAe,EAAE,MAAM,IAAI,CAAA;IAC3B,KAAK,EAAE,IAAI,GAAG,MAAM,CAAA;IACpB,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;CACjC,CAAA;AAeD,eAAO,MAAM,eAAe,QAAO,iBACF,CAAA;AAEjC,eAAO,MAAM,oBAAoB,GAAI,eAElC;IACD,QAAQ,EAAE,SAAS,CAAA;CACpB,KAAG,SAyDH,CAAA"}
@@ -5,6 +5,7 @@ import { SharedBackdrop } from "./SharedBackdrop.js";
5
5
  const DEFAULT_STACK = {
6
6
  depth: 0,
7
7
  isProvided: false,
8
+ orderedIds: [],
8
9
  register: () => { },
9
10
  requestCloseTop: () => { },
10
11
  topId: null,
@@ -36,6 +37,7 @@ export const OverlayStackProvider = ({ children, }) => {
36
37
  const value = useMemo(() => ({
37
38
  depth: entries.length,
38
39
  isProvided: true,
40
+ orderedIds: entries.map((one) => one.id),
39
41
  register,
40
42
  requestCloseTop,
41
43
  topId: entries.at(-1)?.id ?? null,
@@ -1 +1 @@
1
- {"version":3,"file":"OverlayStack.js","sourceRoot":"","sources":["../../src/Overlay/OverlayStack.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,OAAO,EACP,QAAQ,GACT,MAAM,OAAO,CAAA;AAEd,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAsB,CAAA;AA6CrD,MAAM,aAAa,GAAsB;IACvC,KAAK,EAAE,CAAC;IACR,UAAU,EAAE,KAAK;IACjB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;IAClB,eAAe,EAAE,GAAG,EAAE,GAAE,CAAC;IACzB,KAAK,EAAE,IAAI;IACX,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC;CACrB,CAAA;AAED,MAAM,mBAAmB,GACvB,aAAa,CAAoB,aAAa,CAAC,CAAA;AAEjD,MAAM,CAAC,MAAM,eAAe,GAAG,GAAsB,EAAE,CACrD,UAAU,CAAC,mBAAmB,CAAC,CAAA;AAEjC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,EACnC,QAAQ,GAGT,EAAa,EAAE;IACd,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAEpC,EAAE,CAAC,CAAA;IAEL,mEAAmE;IACnE,uBAAuB;IACvB,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;IAExC,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,KAAwB,EAAE,EAAE;QAC3B,UAAU,CAAC,CAAC,QAAQ,EAAE,EAAE;QACtB,yDAAyD;QACzD,0DAA0D;QAC1D,8DAA8D;QAC9D,yCAAyC;QACzC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;YACzC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACnB,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAClC;YACH,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CACzB,CAAA;IACH,CAAC,EACD,EAAE,CACH,CAAA;IAED,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,EAAU,EAAE,EAAE;QAC5C,UAAU,CAAC,CAAC,QAAQ,EAAE,EAAE,CACtB,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CACxC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAA;IACtC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IAEhB,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC;QACL,KAAK,EAAE,OAAO,CAAC,MAAM;QACrB,UAAU,EAAE,IAAI;QAChB,QAAQ;QACR,eAAe;QACf,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI;QACjC,UAAU;KACX,CAAC,EACF,CAAC,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,CAAC,CACjD,CAAA;IAED,OAAO,CACL,MAAC,mBAAmB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,aAGxC,KAAC,cAAc,IAAC,SAAS,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,GAAI,EAEhD,QAAQ,IACoB,CAChC,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"OverlayStack.js","sourceRoot":"","sources":["../../src/Overlay/OverlayStack.tsx"],"names":[],"mappings":"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"}
@@ -46,12 +46,73 @@ export type ToastRegionProps = {
46
46
  * sync. The lifecycle *inside* one toast is state a store cannot
47
47
  * see, which is why `Toast` owns that and nothing more.
48
48
  *
49
+ * ### It is the top of the layer scale, and it moves to stay there
50
+ *
51
+ * ⚠️ The container was `z-50` — a hand-picked number, in the library
52
+ * whose whole point is that nobody picks one. It is
53
+ * `--layer-toast` now, the top of the scale, above `--layer-tooltip`.
54
+ * The owner's rule: *"I think toast should always exist on top of
55
+ * everything."*
56
+ *
57
+ * The open panels cascade — a modal over a modal paints at
58
+ * `--layer-modal + n` — so the depth is added here too, and the
59
+ * toast clears the whole stack rather than only its first floor.
60
+ * Both numbers come off `useOverlayStack`, so the ordering is
61
+ * arithmetic rather than portal-append order.
62
+ *
63
+ * ### Painting on top is only half of "on top"
64
+ *
65
+ * ⚠️ A press on a toast while a `Modal` is open is an **outside**
66
+ * press as far as floating-ui is concerned, and `useDismiss` would
67
+ * close the modal on the way to taking an action back. That is why
68
+ * the container carries `data-charcuterie-toast-region`:
69
+ * `OverlayPanel`'s `outsidePress` reads it and lets the press
70
+ * through. Nothing else in the fleet carries that attribute.
71
+ *
72
+ * ⚠️ Do **not** move this region inside the panel's portal to solve
73
+ * that. Two reasons, both measured. `FloatingFocusManager`'s `modal`
74
+ * already leaves it alone — `markOthers` concatenates
75
+ * `body.querySelectorAll('[aria-live],[role="status"],output')` onto
76
+ * its keep-list, and this region is a `role="status"`, so it is
77
+ * never marked `aria-hidden` where it stands. And the panel's
78
+ * container sets a z-index, so a region nested inside it would be
79
+ * trapped in that stacking context and lose to the *next* modal
80
+ * however high `--layer-toast` climbs.
81
+ *
49
82
  * ### `pointer-events-none` on the container, `auto` on each toast
50
83
  *
51
84
  * A fixed overlay across the bottom of the viewport swallows every
52
85
  * click in that band, including on the app behind it, and it does so
53
86
  * invisibly. The container passes clicks through and each toast
54
87
  * takes them back.
88
+ *
89
+ * The list keeps `pointer-events: none` and still scrolls: a wheel
90
+ * event over a toast chains to the nearest scrollable **ancestor**,
91
+ * which is the list, and hit-testing never has to reach it.
92
+ *
93
+ * ### Many at once, and the newest is the one you can see
94
+ *
95
+ * The column grows upward from the bottom of the viewport, so
96
+ * without a bound the oldest toasts climb off the top of the page —
97
+ * clipped by the viewport, and unreachable, because a fixed element
98
+ * is not something the page can scroll to. The list is capped at
99
+ * `min(60dvh, 32rem)` and scrolls `overscroll-contain`, so the page
100
+ * behind never moves because a notification arrived. The owner's
101
+ * rule: *"if you have multiple toasts, it should accomodate them
102
+ * somehow."*
103
+ *
104
+ * ⚠️ Bottom-pinned with `margin-block-start: auto` on the first
105
+ * toast, **not** `justify-content: flex-end`. Measured in chromium:
106
+ * with `justify-end` an overflowing list reports
107
+ * `scrollHeight === clientHeight` and the toasts above the fold
108
+ * cannot be scrolled to at all — content overflowing a flex
109
+ * container's *start* edge is not reachable overflow. An auto margin
110
+ * resolves to `0` the moment the free space runs out, so the same
111
+ * rule pins a short list and scrolls a long one.
112
+ *
113
+ * The scroll is taken to the bottom whenever the count changes,
114
+ * because the newest toast is the one with the action on it and it
115
+ * is the one at the far end.
55
116
  */
56
117
  export declare const ToastRegion: ({ className, label, onDismiss, toasts, }: ToastRegionProps) => ReactNode;
57
118
  //# sourceMappingURL=ToastRegion.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToastRegion.d.ts","sourceRoot":"","sources":["../../src/Toast/ToastRegion.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAKtC,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,MAAM,EAAE,WAAW,EAAE,CAAA;CACtB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,WAAW,GAAI,0CAKzB,gBAAgB,KAAG,SA+BrB,CAAA"}
1
+ {"version":3,"file":"ToastRegion.d.ts","sourceRoot":"","sources":["../../src/Toast/ToastRegion.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAOtC,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,MAAM,EAAE,WAAW,EAAE,CAAA;CACtB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8FG;AACH,eAAO,MAAM,WAAW,GAAI,0CAKzB,gBAAgB,KAAG,SAwDrB,CAAA"}
@@ -1,4 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useRef } from "react";
3
+ import { useOverlayStack } from "../Overlay/OverlayStack.js";
2
4
  import { toClassName } from "../toClassName.js";
3
5
  import { Toast } from "./Toast.js";
4
6
  /**
@@ -28,14 +30,89 @@ import { Toast } from "./Toast.js";
28
30
  * sync. The lifecycle *inside* one toast is state a store cannot
29
31
  * see, which is why `Toast` owns that and nothing more.
30
32
  *
33
+ * ### It is the top of the layer scale, and it moves to stay there
34
+ *
35
+ * ⚠️ The container was `z-50` — a hand-picked number, in the library
36
+ * whose whole point is that nobody picks one. It is
37
+ * `--layer-toast` now, the top of the scale, above `--layer-tooltip`.
38
+ * The owner's rule: *"I think toast should always exist on top of
39
+ * everything."*
40
+ *
41
+ * The open panels cascade — a modal over a modal paints at
42
+ * `--layer-modal + n` — so the depth is added here too, and the
43
+ * toast clears the whole stack rather than only its first floor.
44
+ * Both numbers come off `useOverlayStack`, so the ordering is
45
+ * arithmetic rather than portal-append order.
46
+ *
47
+ * ### Painting on top is only half of "on top"
48
+ *
49
+ * ⚠️ A press on a toast while a `Modal` is open is an **outside**
50
+ * press as far as floating-ui is concerned, and `useDismiss` would
51
+ * close the modal on the way to taking an action back. That is why
52
+ * the container carries `data-charcuterie-toast-region`:
53
+ * `OverlayPanel`'s `outsidePress` reads it and lets the press
54
+ * through. Nothing else in the fleet carries that attribute.
55
+ *
56
+ * ⚠️ Do **not** move this region inside the panel's portal to solve
57
+ * that. Two reasons, both measured. `FloatingFocusManager`'s `modal`
58
+ * already leaves it alone — `markOthers` concatenates
59
+ * `body.querySelectorAll('[aria-live],[role="status"],output')` onto
60
+ * its keep-list, and this region is a `role="status"`, so it is
61
+ * never marked `aria-hidden` where it stands. And the panel's
62
+ * container sets a z-index, so a region nested inside it would be
63
+ * trapped in that stacking context and lose to the *next* modal
64
+ * however high `--layer-toast` climbs.
65
+ *
31
66
  * ### `pointer-events-none` on the container, `auto` on each toast
32
67
  *
33
68
  * A fixed overlay across the bottom of the viewport swallows every
34
69
  * click in that band, including on the app behind it, and it does so
35
70
  * invisibly. The container passes clicks through and each toast
36
71
  * takes them back.
72
+ *
73
+ * The list keeps `pointer-events: none` and still scrolls: a wheel
74
+ * event over a toast chains to the nearest scrollable **ancestor**,
75
+ * which is the list, and hit-testing never has to reach it.
76
+ *
77
+ * ### Many at once, and the newest is the one you can see
78
+ *
79
+ * The column grows upward from the bottom of the viewport, so
80
+ * without a bound the oldest toasts climb off the top of the page —
81
+ * clipped by the viewport, and unreachable, because a fixed element
82
+ * is not something the page can scroll to. The list is capped at
83
+ * `min(60dvh, 32rem)` and scrolls `overscroll-contain`, so the page
84
+ * behind never moves because a notification arrived. The owner's
85
+ * rule: *"if you have multiple toasts, it should accomodate them
86
+ * somehow."*
87
+ *
88
+ * ⚠️ Bottom-pinned with `margin-block-start: auto` on the first
89
+ * toast, **not** `justify-content: flex-end`. Measured in chromium:
90
+ * with `justify-end` an overflowing list reports
91
+ * `scrollHeight === clientHeight` and the toasts above the fold
92
+ * cannot be scrolled to at all — content overflowing a flex
93
+ * container's *start* edge is not reachable overflow. An auto margin
94
+ * resolves to `0` the moment the free space runs out, so the same
95
+ * rule pins a short list and scrolls a long one.
96
+ *
97
+ * The scroll is taken to the bottom whenever the count changes,
98
+ * because the newest toast is the one with the action on it and it
99
+ * is the one at the far end.
37
100
  */
38
- export const ToastRegion = ({ className, label = "Notifications", onDismiss, toasts, }) => (_jsx("div", { "aria-label": label, "aria-atomic": "false", className: toClassName("pointer-events-none fixed inset-x-0 bottom-0 z-50 flex flex-col items-center gap-2 p-4", className), role: "status", children: _jsx("ul", { className: "pointer-events-none flex w-full max-w-sm list-none flex-col gap-2 p-0", children: toasts.map((toast) => (_jsx(Toast, { duration: toast.duration, intent: toast.intent, onRemove: () => {
39
- onDismiss(toast.key);
40
- }, title: toast.title, children: toast.description }, toast.key))) }) }));
101
+ export const ToastRegion = ({ className, label = "Notifications", onDismiss, toasts, }) => {
102
+ const { depth } = useOverlayStack();
103
+ const listRef = useRef(null);
104
+ const _toastCount = toasts.length;
105
+ useEffect(() => {
106
+ const list = listRef.current;
107
+ if (!list) {
108
+ return;
109
+ }
110
+ list.scrollTop = list.scrollHeight;
111
+ }, []);
112
+ return (_jsx("div", { "aria-label": label, "data-charcuterie-toast-region": "", "aria-atomic": "false", className: toClassName("pointer-events-none fixed inset-x-0 bottom-0 flex flex-col items-center gap-2 p-4", className), role: "status", style: {
113
+ zIndex: `calc(var(--layer-toast) + ${depth})`,
114
+ }, children: _jsx("ul", { ref: listRef, className: "charcuterie-scrollbar pointer-events-none flex max-h-[min(60dvh,32rem)] w-full max-w-sm list-none flex-col gap-2 overflow-y-auto overscroll-contain p-0 [&>li]:shrink-0 [&>li:first-child]:mt-auto", children: toasts.map((toast) => (_jsx(Toast, { duration: toast.duration, intent: toast.intent, onRemove: () => {
115
+ onDismiss(toast.key);
116
+ }, title: toast.title, children: toast.description }, toast.key))) }) }));
117
+ };
41
118
  //# sourceMappingURL=ToastRegion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToastRegion.js","sourceRoot":"","sources":["../../src/Toast/ToastRegion.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAa,CAAA;AAuBnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAC1B,SAAS,EACT,KAAK,GAAG,eAAe,EACvB,SAAS,EACT,MAAM,GACW,EAAa,EAAE,CAAC,CACjC,4BACc,KAAK,iBAML,OAAO,EACnB,SAAS,EAAE,WAAW,CACpB,wFAAwF,EACxF,SAAS,CACV,EACD,IAAI,EAAC,QAAQ,YAEb,aAAI,SAAS,EAAC,uEAAuE,YAClF,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACrB,KAAC,KAAK,IACJ,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,MAAM,EAAE,KAAK,CAAC,MAAM,EAEpB,QAAQ,EAAE,GAAG,EAAE;gBACb,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACtB,CAAC,EACD,KAAK,EAAE,KAAK,CAAC,KAAK,YAEjB,KAAK,CAAC,WAAW,IANb,KAAK,CAAC,GAAG,CAOR,CACT,CAAC,GACC,GACD,CACP,CAAA"}
1
+ {"version":3,"file":"ToastRegion.js","sourceRoot":"","sources":["../../src/Toast/ToastRegion.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA6B,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAa,CAAA;AAuBnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8FG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAC1B,SAAS,EACT,KAAK,GAAG,eAAe,EACvB,SAAS,EACT,MAAM,GACW,EAAa,EAAE;IAChC,MAAM,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAA;IAEnC,MAAM,OAAO,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAA;IAE9C,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAA;IAEjC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAA;QAE5B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAM;QACR,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAA;IACpC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,CACL,4BACc,KAAK,mCACa,EAAE,iBAMpB,OAAO,EACnB,SAAS,EAAE,WAAW,CACpB,mFAAmF,EACnF,SAAS,CACV,EACD,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE;YACL,MAAM,EAAE,6BAA6B,KAAK,GAAG;SAC9C,YAED,aACE,GAAG,EAAE,OAAO,EACZ,SAAS,EAAC,oMAAoM,YAE7M,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACrB,KAAC,KAAK,IACJ,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,MAAM,EAAE,KAAK,CAAC,MAAM,EAEpB,QAAQ,EAAE,GAAG,EAAE;oBACb,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBACtB,CAAC,EACD,KAAK,EAAE,KAAK,CAAC,KAAK,YAEjB,KAAK,CAAC,WAAW,IANb,KAAK,CAAC,GAAG,CAOR,CACT,CAAC,GACC,GACD,CACP,CAAA;AACH,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"useToolbarOverflow.d.ts","sourceRoot":"","sources":["../../src/Toolbar/useToolbarOverflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAUtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,kBAAkB,GAAI,eAEhC;IACD,qCAAqC;IACrC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAC5B,KAAG;IACF,YAAY,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IAC9C,2DAA2D;IAC3D,SAAS,EAAE,CACT,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,GAAG,IAAI,KACxB,IAAI,CAAA;IACT,mDAAmD;IACnD,YAAY,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAA;IACnD,YAAY,EAAE,MAAM,CAAA;CAwKrB,CAAA"}
1
+ {"version":3,"file":"useToolbarOverflow.d.ts","sourceRoot":"","sources":["../../src/Toolbar/useToolbarOverflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAUtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,kBAAkB,GAAI,eAEhC;IACD,qCAAqC;IACrC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAC5B,KAAG;IACF,YAAY,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IAC9C,2DAA2D;IAC3D,SAAS,EAAE,CACT,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,GAAG,IAAI,KACxB,IAAI,CAAA;IACT,mDAAmD;IACnD,YAAY,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAA;IACnD,YAAY,EAAE,MAAM,CAAA;CAmNrB,CAAA"}
@@ -103,6 +103,45 @@ export const useToolbarOverflow = ({ itemKeys, }) => {
103
103
  * answer, so a stable bar renders once and stops.
104
104
  */
105
105
  useLayoutEffect(measure);
106
+ /**
107
+ * Measure again once the webfont has actually arrived.
108
+ *
109
+ * Every width above is a **text** width, so it is only as correct
110
+ * as the font that was loaded when it was read. On a cold cache
111
+ * the first measurement happens in the fallback face, the items
112
+ * come out a few pixels off, and `chooseVisibleCount` keeps or
113
+ * drops one action it should not have — then never revisits it,
114
+ * because swapping a font changes no box the `ResizeObserver`
115
+ * watches and triggers no render.
116
+ *
117
+ * The user-visible symptom is a bar that settles one button wrong
118
+ * and stays there. It needs the two faces to disagree across a
119
+ * collapse boundary, so it is latent rather than observed: no
120
+ * story in the library crosses one today, which is why `vrt`
121
+ * reports nothing either way. That makes it a gap to close, not a
122
+ * regression to chase — the bar is supposed to measure what is on
123
+ * screen, and until now it could not.
124
+ *
125
+ * `document.fonts.ready` resolves immediately when the fonts are
126
+ * already in, so a warm load pays one microtask and
127
+ * `setVisibleCount` bails on the unchanged answer.
128
+ */
129
+ useLayoutEffect(() => {
130
+ // jsdom has no `document.fonts`, and neither does a very old
131
+ // browser. Nothing to wait for is not an error.
132
+ if (!document.fonts) {
133
+ return;
134
+ }
135
+ let isActive = true;
136
+ document.fonts.ready.then(() => {
137
+ if (isActive) {
138
+ measure();
139
+ }
140
+ });
141
+ return () => {
142
+ isActive = false;
143
+ };
144
+ }, [measure]);
106
145
  useLayoutEffect(() => {
107
146
  const container = containerRef.current;
108
147
  if (!container) {
@@ -1 +1 @@
1
- {"version":3,"file":"useToolbarOverflow.js","sourceRoot":"","sources":["../../src/Toolbar/useToolbarOverflow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useToolbarOverflow.js","sourceRoot":"","sources":["../../src/Toolbar/useToolbarOverflow.ts"],"names":[],"mappings":"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"}