@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.
- package/dist/{chunk-WYTJR2YU.js → chunk-5CPBSNWQ.js} +6 -1
- package/dist/{chunk-36KEHCET.js → chunk-5LTILG3L.js} +15 -4
- package/dist/{chunk-P43B3ONY.js → chunk-5XREWOBB.js} +3 -1
- package/dist/{chunk-CLLY6XB3.js → chunk-6VOWT4YR.js} +6 -3
- package/dist/{chunk-S33K4RC5.js → chunk-BKKQ7GCZ.js} +1 -1
- package/dist/{chunk-ZLPWEHZO.js → chunk-EQYB4Q77.js} +2 -2
- package/dist/chunk-LYREUZH6.js +156 -0
- package/dist/chunk-PW247TG2.js +81 -0
- package/dist/chunk-QY66ME5B.js +207 -0
- package/dist/{chunk-T6S2ZBV6.js → chunk-SDWN6L4O.js} +1 -1
- package/dist/{chunk-CNJQUHCU.js → chunk-SWD6CJ35.js} +2 -1
- package/dist/{chunk-HDR7V6IZ.js → chunk-TIQNM4XD.js} +8 -1
- package/dist/components/alert-dialog.js +1 -1
- package/dist/components/alert.d.ts +2 -2
- package/dist/components/badge.d.ts +1 -1
- package/dist/components/badge.js +1 -1
- package/dist/components/button.d.ts +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/calendar.js +1 -1
- package/dist/components/card.d.ts +2 -2
- package/dist/components/carousel.js +1 -1
- package/dist/components/coach-marks.d.ts +63 -0
- package/dist/components/coach-marks.js +162 -0
- package/dist/components/combobox.js +1 -1
- package/dist/components/command.d.ts +15 -15
- package/dist/components/concept-compare-rail.js +3 -3
- package/dist/components/concept-compare.js +3 -3
- package/dist/components/concept-convergence.js +2 -2
- package/dist/components/doorway-tiles.d.ts +11 -0
- package/dist/components/doorway-tiles.js +5 -3
- package/dist/components/empty-state.js +1 -1
- package/dist/components/event-card.d.ts +22 -4
- package/dist/components/event-card.js +95 -50
- package/dist/components/event-day-header.d.ts +5 -3
- package/dist/components/event-day-header.js +12 -4
- package/dist/components/event-detail-panel.js +2 -2
- package/dist/components/event-door.d.ts +41 -0
- package/dist/components/event-door.js +65 -0
- package/dist/components/event-hub-hero.d.ts +10 -2
- package/dist/components/event-hub-hero.js +11 -5
- package/dist/components/event-index-row.js +1 -1
- package/dist/components/event-list-row-wide.js +2 -2
- package/dist/components/event-list-row.js +1 -1
- package/dist/components/event-tonight-strip.d.ts +50 -0
- package/dist/components/event-tonight-strip.js +67 -0
- package/dist/components/facet-group.d.ts +8 -1
- package/dist/components/facet-group.js +3 -0
- package/dist/components/filter-category-row.js +1 -1
- package/dist/components/hue-chip.js +1 -1
- package/dist/components/item.d.ts +2 -2
- package/dist/components/item.js +4 -1
- package/dist/components/kitchen-dossier.js +1 -1
- package/dist/components/link-button.js +1 -1
- package/dist/components/menu-family-block.d.ts +8 -1
- package/dist/components/menu-family-block.js +101 -68
- package/dist/components/menu-family-card.js +2 -2
- package/dist/components/menu-filter-chips.d.ts +12 -3
- package/dist/components/menu-filter-chips.js +22 -4
- package/dist/components/menu-hub-hero.d.ts +7 -1
- package/dist/components/menu-hub-hero.js +2 -1
- package/dist/components/menu-index-list.js +1 -1
- package/dist/components/menu-item.js +3 -3
- package/dist/components/menu-kitchen-list.d.ts +14 -2
- package/dist/components/menu-kitchen-list.js +1 -1
- package/dist/components/multi-select-combobox.js +2 -2
- package/dist/components/pagination.js +1 -1
- package/dist/components/photo-ground.d.ts +7 -1
- package/dist/components/photo-ground.js +1 -1
- package/dist/components/place-card.js +2 -2
- package/dist/components/place-details-mobile.js +1 -1
- package/dist/components/poster-stack.d.ts +36 -3
- package/dist/components/poster-stack.js +49 -18
- package/dist/components/searchable-select.js +1 -1
- package/dist/components/section-header.d.ts +7 -1
- package/dist/components/section-header.js +11 -7
- package/dist/components/signature-chip.js +2 -2
- package/dist/components/sliding-panels.js +1 -1
- package/dist/components/snap-rail.d.ts +2 -2
- package/dist/components/snap-rail.js +1 -1
- package/dist/components/spinner.d.ts +2 -2
- package/dist/components/tag.d.ts +2 -2
- package/dist/components/text.d.ts +3 -3
- package/dist/components/timeline-day.d.ts +54 -0
- package/dist/components/timeline-day.js +65 -0
- package/dist/components/timeline-hour-puck.d.ts +47 -0
- package/dist/components/timeline-hour-puck.js +3 -0
- package/dist/components/timeline-hour.d.ts +96 -0
- package/dist/components/{timeline-band.js → timeline-hour.js} +2 -1
- package/dist/components/timeline-playhead.js +1 -3
- package/dist/components/toggle-group.js +9 -4
- package/dist/components/toggle.d.ts +1 -1
- package/dist/components/toggle.js +1 -1
- package/dist/components/top-ranking-entry.js +3 -3
- package/package.json +1 -1
- package/src/components/badge.stories.tsx +31 -1
- package/src/components/badge.tsx +2 -0
- package/src/components/button.stories.tsx +5 -4
- package/src/components/button.test.tsx +11 -1
- package/src/components/button.tsx +16 -5
- package/src/components/coach-marks.stories.tsx +79 -0
- package/src/components/coach-marks.test.tsx +140 -0
- package/src/components/coach-marks.tsx +252 -0
- package/src/components/doorway-tiles.stories.tsx +34 -0
- package/src/components/doorway-tiles.test.tsx +27 -0
- package/src/components/doorway-tiles.tsx +30 -2
- package/src/components/event-card.tsx +70 -13
- package/src/components/event-day-header.tsx +19 -7
- package/src/components/event-door.stories.tsx +88 -0
- package/src/components/event-door.tsx +97 -0
- package/src/components/event-hub-hero.tsx +21 -3
- package/src/components/event-tonight-strip.stories.tsx +78 -0
- package/src/components/event-tonight-strip.test.tsx +59 -0
- package/src/components/event-tonight-strip.tsx +134 -0
- package/src/components/facet-group.tsx +9 -0
- package/src/components/hue-chip.test.tsx +6 -3
- package/src/components/hue-chip.tsx +5 -2
- package/src/components/item.tsx +4 -1
- package/src/components/menu-family-block.stories.tsx +12 -0
- package/src/components/menu-family-block.tsx +53 -20
- package/src/components/menu-filter-chips.tsx +32 -4
- package/src/components/menu-hub-hero.test.tsx +13 -0
- package/src/components/menu-hub-hero.tsx +9 -2
- package/src/components/menu-kitchen-list.tsx +45 -6
- package/src/components/photo-ground.tsx +7 -0
- package/src/components/poster-stack.stories.tsx +43 -1
- package/src/components/poster-stack.tsx +98 -19
- package/src/components/section-header.test.tsx +15 -0
- package/src/components/section-header.tsx +26 -12
- package/src/components/snap-rail.tsx +6 -1
- package/src/components/timeline-day.stories.tsx +201 -0
- package/src/components/timeline-day.test.tsx +78 -0
- package/src/components/timeline-day.tsx +114 -0
- package/src/components/timeline-hour-puck.tsx +139 -0
- package/src/components/timeline-hour.tsx +266 -0
- package/src/components/timeline-playhead.tsx +1 -1
- package/src/components/toggle-group.stories.tsx +37 -1
- package/src/components/toggle-group.tsx +11 -6
- package/src/components/toggle.tsx +8 -0
- package/dist/chunk-NSNEANOQ.js +0 -104
- package/dist/chunk-SXQZ7DLH.js +0 -167
- package/dist/components/hour-band.d.ts +0 -66
- package/dist/components/hour-band.js +0 -81
- package/dist/components/hour-group.d.ts +0 -67
- package/dist/components/hour-group.js +0 -59
- package/dist/components/timeline-band.d.ts +0 -64
- package/src/components/hour-band.stories.tsx +0 -182
- package/src/components/hour-band.tsx +0 -146
- package/src/components/hour-group.stories.tsx +0 -100
- package/src/components/hour-group.tsx +0 -124
- package/src/components/timeline-band.stories.tsx +0 -206
- package/src/components/timeline-band.tsx +0 -247
|
@@ -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?: "
|
|
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?: "
|
|
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>>;
|
|
@@ -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-
|
|
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
|
|
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"
|
|
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
|
-
}, "
|
|
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
|
|
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"
|
|
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
|
|
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"
|
|
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
|
|
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"
|
|
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
|
|
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"
|
|
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
|
|
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"
|
|
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
|
|
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"
|
|
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-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-
|
|
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-
|
|
3
|
-
import '../chunk-
|
|
4
|
-
import { PhotoGround, PHOTO_GROUND } from '../chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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) }),
|
|
@@ -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
|
-
/**
|
|
41
|
-
|
|
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
|
-
/**
|
|
63
|
-
|
|
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
|