@bearmenu/ui 0.8.16 → 0.8.18

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 (151) hide show
  1. package/dist/{chunk-WYTJR2YU.js → chunk-5CPBSNWQ.js} +6 -1
  2. package/dist/{chunk-36KEHCET.js → chunk-5LTILG3L.js} +15 -4
  3. package/dist/{chunk-P43B3ONY.js → chunk-5XREWOBB.js} +3 -1
  4. package/dist/{chunk-CLLY6XB3.js → chunk-6VOWT4YR.js} +6 -3
  5. package/dist/{chunk-S33K4RC5.js → chunk-BKKQ7GCZ.js} +1 -1
  6. package/dist/{chunk-ZLPWEHZO.js → chunk-EQYB4Q77.js} +2 -2
  7. package/dist/chunk-LYREUZH6.js +156 -0
  8. package/dist/chunk-PW247TG2.js +81 -0
  9. package/dist/chunk-QY66ME5B.js +207 -0
  10. package/dist/{chunk-T6S2ZBV6.js → chunk-SDWN6L4O.js} +1 -1
  11. package/dist/{chunk-CNJQUHCU.js → chunk-SWD6CJ35.js} +2 -1
  12. package/dist/{chunk-HDR7V6IZ.js → chunk-TIQNM4XD.js} +8 -1
  13. package/dist/components/alert-dialog.js +1 -1
  14. package/dist/components/alert.d.ts +2 -2
  15. package/dist/components/badge.d.ts +1 -1
  16. package/dist/components/badge.js +1 -1
  17. package/dist/components/button.d.ts +1 -1
  18. package/dist/components/button.js +1 -1
  19. package/dist/components/calendar.js +1 -1
  20. package/dist/components/card.d.ts +2 -2
  21. package/dist/components/carousel.js +1 -1
  22. package/dist/components/coach-marks.d.ts +63 -0
  23. package/dist/components/coach-marks.js +162 -0
  24. package/dist/components/combobox.js +1 -1
  25. package/dist/components/command.d.ts +15 -15
  26. package/dist/components/concept-compare-rail.js +3 -3
  27. package/dist/components/concept-compare.js +3 -3
  28. package/dist/components/concept-convergence.js +2 -2
  29. package/dist/components/doorway-tiles.d.ts +11 -0
  30. package/dist/components/doorway-tiles.js +5 -3
  31. package/dist/components/empty-state.js +1 -1
  32. package/dist/components/event-card.d.ts +22 -4
  33. package/dist/components/event-card.js +95 -50
  34. package/dist/components/event-day-header.d.ts +5 -3
  35. package/dist/components/event-day-header.js +12 -4
  36. package/dist/components/event-detail-panel.js +2 -2
  37. package/dist/components/event-door.d.ts +41 -0
  38. package/dist/components/event-door.js +65 -0
  39. package/dist/components/event-hub-hero.d.ts +10 -2
  40. package/dist/components/event-hub-hero.js +11 -5
  41. package/dist/components/event-index-row.js +1 -1
  42. package/dist/components/event-list-row-wide.js +2 -2
  43. package/dist/components/event-list-row.js +1 -1
  44. package/dist/components/event-tonight-strip.d.ts +50 -0
  45. package/dist/components/event-tonight-strip.js +67 -0
  46. package/dist/components/facet-group.d.ts +8 -1
  47. package/dist/components/facet-group.js +3 -0
  48. package/dist/components/filter-category-row.js +1 -1
  49. package/dist/components/hue-chip.js +1 -1
  50. package/dist/components/item.d.ts +2 -2
  51. package/dist/components/item.js +4 -1
  52. package/dist/components/kitchen-dossier.js +1 -1
  53. package/dist/components/link-button.js +1 -1
  54. package/dist/components/menu-family-block.d.ts +8 -1
  55. package/dist/components/menu-family-block.js +101 -68
  56. package/dist/components/menu-family-card.js +2 -2
  57. package/dist/components/menu-filter-chips.d.ts +12 -3
  58. package/dist/components/menu-filter-chips.js +22 -4
  59. package/dist/components/menu-hub-hero.d.ts +7 -1
  60. package/dist/components/menu-hub-hero.js +2 -1
  61. package/dist/components/menu-index-list.js +1 -1
  62. package/dist/components/menu-item.js +3 -3
  63. package/dist/components/menu-kitchen-list.d.ts +14 -2
  64. package/dist/components/menu-kitchen-list.js +1 -1
  65. package/dist/components/multi-select-combobox.js +2 -2
  66. package/dist/components/pagination.js +1 -1
  67. package/dist/components/photo-ground.d.ts +7 -1
  68. package/dist/components/photo-ground.js +1 -1
  69. package/dist/components/place-card.js +2 -2
  70. package/dist/components/place-details-mobile.js +1 -1
  71. package/dist/components/poster-stack.d.ts +36 -3
  72. package/dist/components/poster-stack.js +49 -18
  73. package/dist/components/searchable-select.js +1 -1
  74. package/dist/components/section-header.d.ts +7 -1
  75. package/dist/components/section-header.js +11 -7
  76. package/dist/components/signature-chip.js +2 -2
  77. package/dist/components/sliding-panels.js +1 -1
  78. package/dist/components/snap-rail.d.ts +2 -2
  79. package/dist/components/snap-rail.js +1 -1
  80. package/dist/components/spinner.d.ts +2 -2
  81. package/dist/components/tag.d.ts +2 -2
  82. package/dist/components/text.d.ts +3 -3
  83. package/dist/components/timeline-day.d.ts +54 -0
  84. package/dist/components/timeline-day.js +65 -0
  85. package/dist/components/timeline-hour-puck.d.ts +47 -0
  86. package/dist/components/timeline-hour-puck.js +3 -0
  87. package/dist/components/timeline-hour.d.ts +96 -0
  88. package/dist/components/{timeline-band.js → timeline-hour.js} +2 -1
  89. package/dist/components/timeline-playhead.js +1 -3
  90. package/dist/components/toggle-group.js +9 -4
  91. package/dist/components/toggle.d.ts +1 -1
  92. package/dist/components/toggle.js +1 -1
  93. package/dist/components/top-ranking-entry.js +3 -3
  94. package/package.json +1 -1
  95. package/src/components/badge.stories.tsx +31 -1
  96. package/src/components/badge.tsx +2 -0
  97. package/src/components/button.stories.tsx +5 -4
  98. package/src/components/button.test.tsx +11 -1
  99. package/src/components/button.tsx +16 -5
  100. package/src/components/coach-marks.stories.tsx +79 -0
  101. package/src/components/coach-marks.test.tsx +140 -0
  102. package/src/components/coach-marks.tsx +252 -0
  103. package/src/components/doorway-tiles.stories.tsx +34 -0
  104. package/src/components/doorway-tiles.test.tsx +27 -0
  105. package/src/components/doorway-tiles.tsx +30 -2
  106. package/src/components/event-card.tsx +70 -13
  107. package/src/components/event-day-header.tsx +19 -7
  108. package/src/components/event-door.stories.tsx +88 -0
  109. package/src/components/event-door.tsx +97 -0
  110. package/src/components/event-hub-hero.tsx +21 -3
  111. package/src/components/event-tonight-strip.stories.tsx +78 -0
  112. package/src/components/event-tonight-strip.test.tsx +59 -0
  113. package/src/components/event-tonight-strip.tsx +134 -0
  114. package/src/components/facet-group.tsx +9 -0
  115. package/src/components/hue-chip.test.tsx +6 -3
  116. package/src/components/hue-chip.tsx +5 -2
  117. package/src/components/item.tsx +4 -1
  118. package/src/components/menu-family-block.stories.tsx +12 -0
  119. package/src/components/menu-family-block.tsx +53 -20
  120. package/src/components/menu-filter-chips.tsx +32 -4
  121. package/src/components/menu-hub-hero.test.tsx +13 -0
  122. package/src/components/menu-hub-hero.tsx +9 -2
  123. package/src/components/menu-kitchen-list.tsx +45 -6
  124. package/src/components/photo-ground.tsx +7 -0
  125. package/src/components/poster-stack.stories.tsx +43 -1
  126. package/src/components/poster-stack.tsx +98 -19
  127. package/src/components/section-header.test.tsx +15 -0
  128. package/src/components/section-header.tsx +26 -12
  129. package/src/components/snap-rail.tsx +6 -1
  130. package/src/components/timeline-day.stories.tsx +201 -0
  131. package/src/components/timeline-day.test.tsx +78 -0
  132. package/src/components/timeline-day.tsx +114 -0
  133. package/src/components/timeline-hour-puck.tsx +139 -0
  134. package/src/components/timeline-hour.tsx +266 -0
  135. package/src/components/timeline-playhead.tsx +1 -1
  136. package/src/components/toggle-group.stories.tsx +37 -1
  137. package/src/components/toggle-group.tsx +11 -6
  138. package/src/components/toggle.tsx +8 -0
  139. package/dist/chunk-NSNEANOQ.js +0 -104
  140. package/dist/chunk-SXQZ7DLH.js +0 -167
  141. package/dist/components/hour-band.d.ts +0 -66
  142. package/dist/components/hour-band.js +0 -81
  143. package/dist/components/hour-group.d.ts +0 -67
  144. package/dist/components/hour-group.js +0 -59
  145. package/dist/components/timeline-band.d.ts +0 -64
  146. package/src/components/hour-band.stories.tsx +0 -182
  147. package/src/components/hour-band.tsx +0 -146
  148. package/src/components/hour-group.stories.tsx +0 -100
  149. package/src/components/hour-group.tsx +0 -124
  150. package/src/components/timeline-band.stories.tsx +0 -206
  151. package/src/components/timeline-band.tsx +0 -247
@@ -1,4 +1,4 @@
1
- import { buttonVariants, Button } from '../chunk-36KEHCET.js';
1
+ import { buttonVariants, Button } from '../chunk-5LTILG3L.js';
2
2
  import '../chunk-RIH2IS7X.js';
3
3
  import '../chunk-5YNIQ2BL.js';
4
4
  import { cn } from '../chunk-FEK5XGZW.js';
@@ -3,12 +3,12 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const cardVariants: (props?: ({
6
- variant?: "muted" | "outline" | "glass" | "surface" | "elevated" | "elevatedPanel" | null | undefined;
6
+ variant?: "outline" | "glass" | "muted" | "surface" | "elevated" | "elevatedPanel" | null | undefined;
7
7
  size?: "default" | "sm" | "lg" | null | undefined;
8
8
  interactive?: boolean | null | undefined;
9
9
  } & class_variance_authority_types.ClassProp) | undefined) => string;
10
10
  declare const Card: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
11
- variant?: "muted" | "outline" | "glass" | "surface" | "elevated" | "elevatedPanel" | null | undefined;
11
+ variant?: "outline" | "glass" | "muted" | "surface" | "elevated" | "elevatedPanel" | null | undefined;
12
12
  size?: "default" | "sm" | "lg" | null | undefined;
13
13
  interactive?: boolean | null | undefined;
14
14
  } & class_variance_authority_types.ClassProp) | undefined) => string> & React.RefAttributes<HTMLDivElement>>;
@@ -1,4 +1,4 @@
1
- import { Button } from '../chunk-36KEHCET.js';
1
+ import { Button } from '../chunk-5LTILG3L.js';
2
2
  import '../chunk-RIH2IS7X.js';
3
3
  import '../chunk-5YNIQ2BL.js';
4
4
  import { cn } from '../chunk-FEK5XGZW.js';
@@ -0,0 +1,63 @@
1
+ import * as React from 'react';
2
+
3
+ /**
4
+ * CoachMarks — a guided tour drawn OVER the real page.
5
+ *
6
+ * Four things, one at a time: the page dims, the current stop's target is cut
7
+ * out of the dimming in a spotlight, its step number sits on the spotlight's
8
+ * corner, and one callout beside the spotlight says what the target is. Only
9
+ * the current stop is marked — a map of every stop's number over the page
10
+ * competes with the page's own numerals and with the callout's "Step N of
11
+ * M"; the way through is Next, Back and the arrow keys. The reader learns
12
+ * the surface by looking at the surface, not at a picture of it; nothing on
13
+ * the page moves or re-renders to be taught.
14
+ *
15
+ * Targets are found by `data-coach-mark="<stop id>"` on the page's own
16
+ * elements, so the page keeps its markup and the tour attaches from outside.
17
+ * The tour is built from the stops whose target is ON THE PAGE when it opens
18
+ * (or when the itinerary changes): a stop with nothing to point at is not
19
+ * counted, so "Step 3 of 5" is always a step the reader will reach. Where
20
+ * the same id is on two elements — a desktop and a phone rendering of one
21
+ * control — the visible one is taken.
22
+ *
23
+ * The consumer owns the words (`labels`, `stops`) and the open state; the
24
+ * tour owns its position, the geometry (8px breathing room, the callout's
25
+ * side, re-measure on scroll and resize) and the keys (Escape closes, the
26
+ * arrows step). `onProgress` reports the current stop for a toolbar label.
27
+ *
28
+ * Rendered into `document.body`: a page wrapper with an opacity or transform
29
+ * transition is a stacking context, and the tour must sit above everything
30
+ * the page and its chrome draw, whatever wraps the consumer.
31
+ */
32
+ type CoachMarkStop = {
33
+ /** Matches the target's `data-coach-mark` attribute. */
34
+ id: string;
35
+ title: string;
36
+ body: string;
37
+ };
38
+ type CoachMarksLabels = {
39
+ /** "Step 2 of 4". */
40
+ progress: (step: number, total: number) => string;
41
+ back: string;
42
+ next: string;
43
+ /** The last stop's forward action, e.g. "Done". */
44
+ done: string;
45
+ skip: string;
46
+ };
47
+ type CoachMarksProps = {
48
+ open: boolean;
49
+ stops: CoachMarkStop[];
50
+ /** Skip, Done, Escape and a tap on the dimmed page all end here. */
51
+ onClose: () => void;
52
+ /**
53
+ * 1-based position, the count of stops the page actually has, and the
54
+ * stop being shown — its id is what a consumer remembers, since the
55
+ * position shifts when a stop's target is missing.
56
+ */
57
+ onProgress?: (step: number, total: number, stop: CoachMarkStop) => void;
58
+ labels: CoachMarksLabels;
59
+ className?: string;
60
+ };
61
+ declare function CoachMarks({ open, stops, onClose, onProgress, labels, className }: CoachMarksProps): React.ReactPortal | null;
62
+
63
+ export { type CoachMarkStop, CoachMarks, type CoachMarksLabels, type CoachMarksProps };
@@ -0,0 +1,162 @@
1
+ import { Button } from '../chunk-5LTILG3L.js';
2
+ import '../chunk-RIH2IS7X.js';
3
+ import '../chunk-5YNIQ2BL.js';
4
+ import { cn } from '../chunk-FEK5XGZW.js';
5
+ import '../chunk-MMUBH76A.js';
6
+ import { useState, useLayoutEffect, useCallback, useEffect } from 'react';
7
+ import { createPortal } from 'react-dom';
8
+ import { Lightbulb, ArrowRight } from 'lucide-react';
9
+ import { jsxs, jsx } from 'react/jsx-runtime';
10
+
11
+ var PAD = 8;
12
+ var CALLOUT_WIDTH = 320;
13
+ var CALLOUT_GAP = 14;
14
+ var CALLOUT_ROOM = 280;
15
+ var EDGE = 12;
16
+ var PIN = "pointer-events-none absolute z-[1] flex h-8 w-8 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full bg-[oklch(0.26_0.03_60)] text-[13px] font-extrabold text-[oklch(0.82_0.15_85)] ring-2 ring-[oklch(0.82_0.15_85)] shadow-[0_2px_8px_oklch(0.16_0.012_55_/_0.45)] transition-[top,left] duration-300 motion-reduce:transition-none";
17
+ function findTarget(id) {
18
+ if (typeof document === "undefined") return null;
19
+ const candidates = document.querySelectorAll(`[data-coach-mark="${id}"]`);
20
+ for (const candidate of candidates) {
21
+ if (candidate.getClientRects().length > 0) return candidate;
22
+ }
23
+ return null;
24
+ }
25
+ function measure(element) {
26
+ const box = element.getBoundingClientRect();
27
+ return { top: box.top, left: box.left, width: box.width, height: box.height };
28
+ }
29
+ function CoachMarks({ open, stops, onClose, onProgress, labels, className }) {
30
+ const [available, setAvailable] = useState([]);
31
+ const [index, setIndex] = useState(0);
32
+ const [rect, setRect] = useState(null);
33
+ const [viewport, setViewport] = useState({ width: 0, height: 0 });
34
+ const itinerary = stops.map((stop) => stop.id).join("|");
35
+ useLayoutEffect(() => {
36
+ if (!open) return;
37
+ const present = stops.filter((stop) => findTarget(stop.id));
38
+ setAvailable(present);
39
+ setIndex(0);
40
+ if (present.length === 0) onClose();
41
+ }, [open, itinerary]);
42
+ const current = available[index];
43
+ const currentId = current == null ? void 0 : current.id;
44
+ const remeasure = useCallback(() => {
45
+ const element = currentId ? findTarget(currentId) : null;
46
+ setRect(element ? measure(element) : null);
47
+ setViewport({ width: window.innerWidth, height: window.innerHeight });
48
+ }, [currentId]);
49
+ useLayoutEffect(() => {
50
+ if (!open || !current) return;
51
+ const element = findTarget(current.id);
52
+ if (!element) {
53
+ const forward = available.findIndex((stop, at) => at > index && findTarget(stop.id));
54
+ if (forward !== -1) setIndex(forward);
55
+ else onClose();
56
+ return;
57
+ }
58
+ element.scrollIntoView({ block: "center", behavior: "smooth", inline: "nearest" });
59
+ remeasure();
60
+ const settle = setTimeout(remeasure, 400);
61
+ return () => clearTimeout(settle);
62
+ }, [open, current, index, available, remeasure, onClose]);
63
+ useEffect(() => {
64
+ if (!open || !current) return;
65
+ onProgress == null ? void 0 : onProgress(index + 1, available.length, current);
66
+ }, [open, current, index, available.length, onProgress]);
67
+ useEffect(() => {
68
+ if (!open) return;
69
+ window.addEventListener("resize", remeasure);
70
+ window.addEventListener("scroll", remeasure, true);
71
+ const onKey = (event) => {
72
+ if (event.key === "Escape") onClose();
73
+ if (event.key === "ArrowRight") setIndex((at) => Math.min(at + 1, available.length - 1));
74
+ if (event.key === "ArrowLeft") setIndex((at) => Math.max(at - 1, 0));
75
+ };
76
+ window.addEventListener("keydown", onKey);
77
+ return () => {
78
+ window.removeEventListener("resize", remeasure);
79
+ window.removeEventListener("scroll", remeasure, true);
80
+ window.removeEventListener("keydown", onKey);
81
+ };
82
+ }, [open, remeasure, onClose, available.length]);
83
+ if (!open || !current || !rect) return null;
84
+ const last = index === available.length - 1;
85
+ const spot = {
86
+ top: rect.top - PAD,
87
+ left: rect.left - PAD,
88
+ width: rect.width + PAD * 2,
89
+ height: rect.height + PAD * 2
90
+ };
91
+ const roomBelow = viewport.height - (spot.top + spot.height);
92
+ const calloutLeft = Math.min(
93
+ Math.max(spot.left, EDGE),
94
+ Math.max(EDGE, viewport.width - CALLOUT_WIDTH - EDGE)
95
+ );
96
+ const calloutPlace = roomBelow > CALLOUT_ROOM ? { top: spot.top + spot.height + CALLOUT_GAP, left: calloutLeft } : spot.top > CALLOUT_ROOM ? { bottom: viewport.height - spot.top + CALLOUT_GAP, left: calloutLeft } : { bottom: EDGE, left: calloutLeft };
97
+ return createPortal(
98
+ /* @__PURE__ */ jsxs(
99
+ "div",
100
+ {
101
+ className: cn("fixed inset-0 z-[80]", className),
102
+ role: "dialog",
103
+ "aria-modal": true,
104
+ "aria-label": current.title,
105
+ children: [
106
+ /* @__PURE__ */ jsx(
107
+ "button",
108
+ {
109
+ type: "button",
110
+ "aria-label": labels.skip,
111
+ onClick: onClose,
112
+ className: "absolute inset-0 cursor-default"
113
+ }
114
+ ),
115
+ /* @__PURE__ */ jsx(
116
+ "div",
117
+ {
118
+ "aria-hidden": true,
119
+ className: "pointer-events-none absolute rounded-[18px] shadow-[0_0_0_9999px_oklch(0.16_0.012_55_/_0.55)] ring-2 ring-[oklch(0.82_0.15_85)] transition-[top,left,width,height] duration-300 motion-reduce:transition-none",
120
+ style: spot
121
+ }
122
+ ),
123
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: PIN, style: { top: rect.top - 2, left: rect.left - 2 }, children: index + 1 }),
124
+ /* @__PURE__ */ jsxs(
125
+ "div",
126
+ {
127
+ className: "absolute z-[2] w-[min(320px,calc(100vw-24px))] rounded-2xl border border-border bg-card p-4 text-card-foreground shadow-xl",
128
+ style: calloutPlace,
129
+ children: [
130
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5 rounded-full bg-[oklch(0.82_0.15_85)] px-2.5 py-1 text-[10.5px] font-extrabold uppercase tracking-[0.08em] text-[oklch(0.26_0.03_60)]", children: [
131
+ /* @__PURE__ */ jsx(Lightbulb, { className: "h-3 w-3", "aria-hidden": true }),
132
+ labels.progress(index + 1, available.length)
133
+ ] }),
134
+ /* @__PURE__ */ jsx("p", { className: "mt-3 text-[15px] font-bold leading-snug", children: current.title }),
135
+ /* @__PURE__ */ jsx("p", { className: "mt-1.5 text-sm leading-relaxed text-muted-foreground", children: current.body }),
136
+ /* @__PURE__ */ jsxs("div", { className: "mt-4 flex items-center gap-2", children: [
137
+ index > 0 && /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setIndex(index - 1), children: labels.back }),
138
+ /* @__PURE__ */ jsxs(
139
+ Button,
140
+ {
141
+ type: "button",
142
+ size: "sm",
143
+ onClick: () => last ? onClose() : setIndex(index + 1),
144
+ children: [
145
+ last ? labels.done : labels.next,
146
+ !last && /* @__PURE__ */ jsx(ArrowRight, { "aria-hidden": true })
147
+ ]
148
+ }
149
+ ),
150
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "link", size: "sm", className: "ml-auto", onClick: onClose, children: labels.skip })
151
+ ] })
152
+ ]
153
+ }
154
+ )
155
+ ]
156
+ }
157
+ ),
158
+ document.body
159
+ );
160
+ }
161
+
162
+ export { CoachMarks };
@@ -1,7 +1,7 @@
1
1
  import { Popover, PopoverTrigger, PopoverContent } from '../chunk-2ADCZXZJ.js';
2
2
  import { Command, CommandInput, CommandList, CommandLoading, CommandEmpty, CommandGroup, CommandItem } from '../chunk-MCOHLWRS.js';
3
3
  import '../chunk-PDTPO6NG.js';
4
- import { Button } from '../chunk-36KEHCET.js';
4
+ import { Button } from '../chunk-5LTILG3L.js';
5
5
  import '../chunk-RIH2IS7X.js';
6
6
  import '../chunk-5YNIQ2BL.js';
7
7
  import { cn } from '../chunk-FEK5XGZW.js';
@@ -4,11 +4,11 @@ import { DialogProps } from '@radix-ui/react-dialog';
4
4
 
5
5
  declare const Command: React.ForwardRefExoticComponent<Omit<{
6
6
  children?: React.ReactNode;
7
- } & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
7
+ } & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>> & {
8
8
  ref?: React.Ref<HTMLDivElement>;
9
9
  } & {
10
10
  asChild?: boolean;
11
- }, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key"> & {
11
+ }, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild"> & {
12
12
  label?: string;
13
13
  shouldFilter?: boolean;
14
14
  filter?: (value: string, search: string, keywords?: string[]) => number;
@@ -28,61 +28,61 @@ declare const CommandInput: React.ForwardRefExoticComponent<Omit<Omit<Pick<Pick<
28
28
  ref?: React.Ref<HTMLInputElement>;
29
29
  } & {
30
30
  asChild?: boolean;
31
- }, "asChild" | "key" | keyof React.InputHTMLAttributes<HTMLInputElement>>, "onChange" | "type" | "value"> & {
31
+ }, "key" | "asChild" | keyof React.InputHTMLAttributes<HTMLInputElement>>, "onChange" | "type" | "value"> & {
32
32
  value?: string;
33
33
  onValueChange?: (search: string) => void;
34
34
  } & React.RefAttributes<HTMLInputElement>, "ref"> & React.RefAttributes<HTMLInputElement>>;
35
35
  declare const CommandList: React.ForwardRefExoticComponent<Omit<{
36
36
  children?: React.ReactNode;
37
- } & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
37
+ } & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>> & {
38
38
  ref?: React.Ref<HTMLDivElement>;
39
39
  } & {
40
40
  asChild?: boolean;
41
- }, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key"> & {
41
+ }, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild"> & {
42
42
  label?: string;
43
43
  } & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
44
44
  declare const CommandEmpty: React.ForwardRefExoticComponent<Omit<{
45
45
  children?: React.ReactNode;
46
- } & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
46
+ } & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>> & {
47
47
  ref?: React.Ref<HTMLDivElement>;
48
48
  } & {
49
49
  asChild?: boolean;
50
- }, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key"> & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
50
+ }, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild"> & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
51
51
  declare const CommandLoading: React.ForwardRefExoticComponent<Omit<{
52
52
  children?: React.ReactNode;
53
- } & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
53
+ } & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>> & {
54
54
  ref?: React.Ref<HTMLDivElement>;
55
55
  } & {
56
56
  asChild?: boolean;
57
- }, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key"> & {
57
+ }, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild"> & {
58
58
  progress?: number;
59
59
  label?: string;
60
60
  } & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
61
61
  declare const CommandGroup: React.ForwardRefExoticComponent<Omit<{
62
62
  children?: React.ReactNode;
63
- } & Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
63
+ } & Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>> & {
64
64
  ref?: React.Ref<HTMLDivElement>;
65
65
  } & {
66
66
  asChild?: boolean;
67
- }, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key">, "heading" | "value"> & {
67
+ }, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild">, "heading" | "value"> & {
68
68
  heading?: React.ReactNode;
69
69
  value?: string;
70
70
  forceMount?: boolean;
71
71
  } & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
72
- declare const CommandSeparator: React.ForwardRefExoticComponent<Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
72
+ declare const CommandSeparator: React.ForwardRefExoticComponent<Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>> & {
73
73
  ref?: React.Ref<HTMLDivElement>;
74
74
  } & {
75
75
  asChild?: boolean;
76
- }, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key"> & {
76
+ }, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild"> & {
77
77
  alwaysRender?: boolean;
78
78
  } & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
79
79
  declare const CommandItem: React.ForwardRefExoticComponent<Omit<{
80
80
  children?: React.ReactNode;
81
- } & Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
81
+ } & Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>> & {
82
82
  ref?: React.Ref<HTMLDivElement>;
83
83
  } & {
84
84
  asChild?: boolean;
85
- }, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key">, "onSelect" | "disabled" | "value"> & {
85
+ }, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild">, "onSelect" | "disabled" | "value"> & {
86
86
  disabled?: boolean;
87
87
  onSelect?: (value: string) => void;
88
88
  value?: string;
@@ -1,5 +1,5 @@
1
- export { ConceptCompareRail } from '../chunk-ZLPWEHZO.js';
2
- import '../chunk-WYTJR2YU.js';
3
- import '../chunk-CNJQUHCU.js';
1
+ export { ConceptCompareRail } from '../chunk-EQYB4Q77.js';
2
+ import '../chunk-5CPBSNWQ.js';
3
+ import '../chunk-SWD6CJ35.js';
4
4
  import '../chunk-FEK5XGZW.js';
5
5
  import '../chunk-MMUBH76A.js';
@@ -1,7 +1,7 @@
1
1
  import { Separator } from '../chunk-NWZGSLPU.js';
2
- import { ConceptCompareRail } from '../chunk-ZLPWEHZO.js';
3
- import '../chunk-WYTJR2YU.js';
4
- import { PhotoGround, PHOTO_GROUND } from '../chunk-CNJQUHCU.js';
2
+ import { ConceptCompareRail } from '../chunk-EQYB4Q77.js';
3
+ import '../chunk-5CPBSNWQ.js';
4
+ import { PhotoGround, PHOTO_GROUND } from '../chunk-SWD6CJ35.js';
5
5
  import { Skeleton } from '../chunk-XBBEX4SF.js';
6
6
  import { cn } from '../chunk-FEK5XGZW.js';
7
7
  import { __objRest, __spreadValues } from '../chunk-MMUBH76A.js';
@@ -1,7 +1,7 @@
1
- import { PhotoGround } from '../chunk-CNJQUHCU.js';
1
+ import { PhotoGround } from '../chunk-SWD6CJ35.js';
2
2
  import { Convergence } from '../chunk-4XDJXMLF.js';
3
3
  import '../chunk-OIV7B44M.js';
4
- import { Badge } from '../chunk-P43B3ONY.js';
4
+ import { Badge } from '../chunk-5XREWOBB.js';
5
5
  import { cn } from '../chunk-FEK5XGZW.js';
6
6
  import '../chunk-MMUBH76A.js';
7
7
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -33,6 +33,17 @@ type DoorwayTile = {
33
33
  gradient?: string;
34
34
  /** Pre-resolved photograph of the CLASS, from the consumer's own origin. */
35
35
  photoUrl?: string;
36
+ /**
37
+ * A glyph in the photograph's place — for a tile about an ACTION, not a
38
+ * thing. A search door has no class to photograph, and any subject put on
39
+ * it (a table, a lens, a book) reads as one more family; the initial the
40
+ * fallback draws is a family's initial too. So the print holds the glyph
41
+ * instead, on the photo ground with the photo fallback's drop shadow, and
42
+ * the tile keeps its siblings' silhouette. Wins over `photoUrl`.
43
+ *
44
+ * A node rather than a name: the app owns its iconography.
45
+ */
46
+ icon?: React.ReactNode;
36
47
  };
37
48
  type DoorwayTilesTreatment = "polaroid" | "ground";
38
49
  type DoorwayTilesProps = {
@@ -1,4 +1,4 @@
1
- import { PhotoGround } from '../chunk-CNJQUHCU.js';
1
+ import { PHOTO_GROUND, PHOTO_GLYPH_SHADOW, PhotoGround } from '../chunk-SWD6CJ35.js';
2
2
  import { cn } from '../chunk-FEK5XGZW.js';
3
3
  import { __objRest, __spreadValues } from '../chunk-MMUBH76A.js';
4
4
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -13,6 +13,8 @@ var SCRIM = "after:pointer-events-none after:absolute after:inset-x-0 after:bott
13
13
  var GROUND_PHOTO = "absolute inset-0 z-0 h-full w-full object-cover mix-blend-multiply transition-transform duration-500 ease-out group-hover:scale-[1.04] motion-reduce:transition-none motion-reduce:group-hover:scale-100";
14
14
  var GROUND_LIFT = "absolute inset-0 z-0 opacity-[0.22]";
15
15
  var GROUND_GLYPH = "absolute inset-0 z-0 flex items-center justify-center font-serif text-[64px] font-semibold leading-none text-white/15";
16
+ var PRINT_ICON = `absolute inset-0 flex items-center justify-center ${PHOTO_GROUND} text-white/90 [&_svg]:h-[44%] [&_svg]:w-[44%] [&_svg]:${PHOTO_GLYPH_SHADOW}`;
17
+ var GROUND_ICON = "absolute inset-0 z-0 flex items-center justify-center text-white/15 [&_svg]:h-[40%] [&_svg]:w-[40%]";
16
18
  function DoorwayTiles({
17
19
  tiles,
18
20
  all,
@@ -31,7 +33,7 @@ function DoorwayTiles({
31
33
  className: cn(TILE, SCRIM),
32
34
  style: ground,
33
35
  children: [
34
- isPolaroid ? /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: POLAROID, children: tile.photoUrl ? (
36
+ isPolaroid ? /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: POLAROID, children: tile.icon ? /* @__PURE__ */ jsx("span", { className: PRINT_ICON, children: tile.icon }) : tile.photoUrl ? (
35
37
  /* Not lazy: the grid sits directly under the hero, and these
36
38
  photographs are the first thing the reader looks at. */
37
39
  // eslint-disable-next-line @next/next/no-img-element
@@ -52,7 +54,7 @@ function DoorwayTiles({
52
54
  mode: "stack",
53
55
  glyphClassName: "text-[44px]"
54
56
  }
55
- ) }) : tile.photoUrl ? /* @__PURE__ */ jsxs(Fragment, { children: [
57
+ ) }) : tile.icon ? /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: GROUND_ICON, children: tile.icon }) : tile.photoUrl ? /* @__PURE__ */ jsxs(Fragment, { children: [
56
58
  /* @__PURE__ */ jsx("img", { src: tile.photoUrl, alt: "", decoding: "async", className: GROUND_PHOTO }),
57
59
  /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: GROUND_LIFT, style: ground })
58
60
  ] }) : /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: GROUND_GLYPH, children: tile.label.charAt(0) }),
@@ -1,4 +1,4 @@
1
- import { Button } from '../chunk-36KEHCET.js';
1
+ import { Button } from '../chunk-5LTILG3L.js';
2
2
  import '../chunk-RIH2IS7X.js';
3
3
  import '../chunk-5YNIQ2BL.js';
4
4
  import { Text } from '../chunk-ZLMRVBD7.js';
@@ -37,8 +37,22 @@ type EventCardProps = {
37
37
  * `Coverflow`) — it crops less than `3/4` and is not the same as it.
38
38
  */
39
39
  posterAspect?: "4/3" | "3/4" | "4/5";
40
- /** Larger title — the featured/highlight slot. Never a clamp: the title wraps in full either way. */
41
- emphasis?: boolean;
40
+ /**
41
+ * Larger title — the featured/highlight slot. Never a clamp: the title
42
+ * wraps in full either way. `"lg"` applies it from the `lg` breakpoint
43
+ * only: the timeline's day hero is an ordinary card in the phone column and
44
+ * the lane's feature poster on desktop, one node.
45
+ */
46
+ emphasis?: boolean | "lg";
47
+ /**
48
+ * `card` (default) at every width. `row-lg`: the card below `lg`, and from
49
+ * `lg` the compact row `EventCompactRow` draws — a 64px portrait poster
50
+ * beside the text, overlay pills off, the fee as a chip on the tags row.
51
+ * The timeline demotes an hour's later events to rows on desktop only, and
52
+ * a server render cannot swap components per viewport; this is the one
53
+ * node that paints both.
54
+ */
55
+ density?: "card" | "row-lg";
42
56
  /** Top-left overlay pill (the design's "Busy" hype marker). Include its icon. */
43
57
  badge?: React.ReactNode;
44
58
  /** Bottom-left overlay pill naming the category. Include its icon. */
@@ -59,8 +73,12 @@ type EventCardProps = {
59
73
  * locale, and "is this live" depends on the app's clock, not the DS's.
60
74
  */
61
75
  liveStatus?: string;
62
- /** Hide the day/time line — the timeline supplies its own hour heading. */
63
- hideWhen?: boolean;
76
+ /**
77
+ * Hide the day/time line — the timeline supplies its own hour heading.
78
+ * `"below-lg"` hides it on the phone only: the desktop lane's hero sits
79
+ * beside whatever hour is passing and has to carry its own start time.
80
+ */
81
+ hideWhen?: boolean | "below-lg";
64
82
  /**
65
83
  * Already over — dims the poster, mutes the title and shows the `endedLabel`
66
84
  * chip. Never row-level opacity, which composites the text below AA. Same