@bearmenu/ui 0.8.15 → 0.8.17
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/README.md +1 -0
- package/dist/{chunk-ZLPWEHZO.js → chunk-54FQQZZJ.js} +1 -1
- package/dist/{chunk-5FCC5L5F.js → chunk-5LTILG3L.js} +29 -6
- package/dist/{chunk-P43B3ONY.js → chunk-5XREWOBB.js} +3 -1
- package/dist/{chunk-V4E333QS.js → chunk-5YNIQ2BL.js} +7 -29
- package/dist/{chunk-CLLY6XB3.js → chunk-6VOWT4YR.js} +6 -3
- package/dist/{chunk-S33K4RC5.js → chunk-BKKQ7GCZ.js} +1 -1
- package/dist/chunk-QY66ME5B.js +207 -0
- package/dist/chunk-RIH2IS7X.js +29 -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 +3 -2
- package/dist/components/badge.d.ts +1 -1
- package/dist/components/badge.js +1 -1
- package/dist/components/button.d.ts +5 -1
- package/dist/components/button.js +3 -2
- package/dist/components/calendar.js +3 -2
- package/dist/components/carousel.js +3 -2
- package/dist/components/coach-marks.d.ts +63 -0
- package/dist/components/coach-marks.js +162 -0
- package/dist/components/combobox.js +3 -2
- package/dist/components/concept-compare-rail.js +2 -2
- package/dist/components/concept-compare.js +2 -2
- package/dist/components/concept-convergence.js +2 -2
- package/dist/components/date-input.d.ts +1 -1
- package/dist/components/doorway-tiles.d.ts +11 -0
- package/dist/components/doorway-tiles.js +5 -3
- package/dist/components/empty-state.js +3 -2
- package/dist/components/event-detail-panel.js +4 -3
- package/dist/components/event-index-row.js +1 -1
- package/dist/components/event-list-row-wide.js +4 -3
- package/dist/components/event-list-row.js +1 -1
- 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/haptic-switch.d.ts +35 -0
- package/dist/components/haptic-switch.js +3 -0
- package/dist/components/hue-chip.js +1 -1
- package/dist/components/item.js +4 -1
- package/dist/components/kitchen-dossier.js +2 -2
- package/dist/components/link-button.js +3 -2
- package/dist/components/menu-family-block.d.ts +8 -1
- package/dist/components/menu-family-block.js +103 -69
- 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-index-list.js +3 -2
- 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 +4 -3
- package/dist/components/pagination.js +3 -2
- 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/searchable-select.js +3 -2
- 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 +3 -2
- package/dist/components/switch.d.ts +7 -1
- package/dist/components/switch.js +33 -24
- 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/dist/hooks/use-haptic.d.ts +9 -1
- package/dist/hooks/use-haptic.js +1 -1
- 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 +41 -6
- 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/facet-group.tsx +9 -0
- package/src/components/haptic-switch.test.tsx +134 -0
- package/src/components/haptic-switch.tsx +62 -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-kitchen-list.tsx +45 -6
- package/src/components/photo-ground.tsx +7 -0
- package/src/components/section-header.test.tsx +15 -0
- package/src/components/section-header.tsx +26 -12
- package/src/components/switch.tsx +29 -18
- 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/src/hooks/use-haptic.test.tsx +54 -59
- package/src/hooks/use-haptic.ts +18 -44
- package/dist/chunk-SXQZ7DLH.js +0 -167
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { MenuKitchenList } from '../chunk-
|
|
2
|
-
import { HueChip } from '../chunk-
|
|
1
|
+
import { MenuKitchenList } from '../chunk-QY66ME5B.js';
|
|
2
|
+
import { HueChip } from '../chunk-6VOWT4YR.js';
|
|
3
3
|
import { Separator } from '../chunk-NWZGSLPU.js';
|
|
4
|
-
import { PhotoGround, PHOTO_GROUND } from '../chunk-
|
|
4
|
+
import { PhotoGround, PHOTO_GROUND } from '../chunk-SWD6CJ35.js';
|
|
5
5
|
import { Skeleton } from '../chunk-XBBEX4SF.js';
|
|
6
|
-
import { buttonVariants } from '../chunk-
|
|
7
|
-
import '../chunk-
|
|
6
|
+
import { buttonVariants } from '../chunk-5LTILG3L.js';
|
|
7
|
+
import '../chunk-RIH2IS7X.js';
|
|
8
|
+
import '../chunk-5YNIQ2BL.js';
|
|
8
9
|
import { cn } from '../chunk-FEK5XGZW.js';
|
|
9
10
|
import { __objRest, __spreadValues } from '../chunk-MMUBH76A.js';
|
|
10
11
|
import { Wallet } from 'lucide-react';
|
|
@@ -15,8 +16,8 @@ function DefaultLink(_a) {
|
|
|
15
16
|
return /* @__PURE__ */ jsx("a", __spreadValues({ href }, props));
|
|
16
17
|
}
|
|
17
18
|
var GROUND = PHOTO_GROUND;
|
|
18
|
-
var
|
|
19
|
-
var
|
|
19
|
+
var INK_PHONE = "bg-[linear-gradient(to_bottom,oklch(0.16_0.012_55_/_0.12)_0%,oklch(0.16_0.012_55_/_0.55)_38%,oklch(0.16_0.012_55_/_0.92)_62%,oklch(0.16_0.012_55_/_0.96)_100%)]";
|
|
20
|
+
var INK_WIDE = "lg:bg-[linear-gradient(to_right,oklch(0.16_0.012_55_/_0.32)_0%,oklch(0.16_0.012_55_/_0.62)_34%,oklch(0.16_0.012_55_/_0.9)_52%,oklch(0.16_0.012_55_/_0.96)_100%)]";
|
|
20
21
|
var TEXT_SCRIM = (
|
|
21
22
|
/* `isolate` + `before:-z-10`: a positioned pseudo-element paints ABOVE the
|
|
22
23
|
column's in-flow text unless the column is its own stacking context and
|
|
@@ -30,10 +31,12 @@ function MenuFamilyBlock({
|
|
|
30
31
|
formatCount = String,
|
|
31
32
|
hue,
|
|
32
33
|
gradient,
|
|
34
|
+
variant = "wide",
|
|
33
35
|
linkComponent: LinkComponent = DefaultLink,
|
|
34
36
|
className
|
|
35
37
|
}) {
|
|
36
38
|
var _a, _b, _c, _d, _e, _f;
|
|
39
|
+
const wide = variant === "wide";
|
|
37
40
|
const [photo] = (_a = family.photoUrls) != null ? _a : [];
|
|
38
41
|
const venues = (_b = family.venues) != null ? _b : [];
|
|
39
42
|
const overflow = Math.max(family.venueCount - venues.length, 0);
|
|
@@ -45,77 +48,108 @@ function MenuFamilyBlock({
|
|
|
45
48
|
className: cn(
|
|
46
49
|
/* `isolate` confines the blend and the backdrop-filter to this card.
|
|
47
50
|
`dark` scopes every token inside to its dark-theme value. */
|
|
48
|
-
|
|
51
|
+
/* A flex column, so a `h-full` card in a rail fills its row: siblings
|
|
52
|
+
with two rows and with three end on the same baseline. */
|
|
53
|
+
"dark relative isolate flex flex-col overflow-hidden rounded-[14px] text-foreground",
|
|
49
54
|
GROUND,
|
|
50
55
|
className
|
|
51
56
|
),
|
|
52
57
|
children: [
|
|
53
58
|
/* @__PURE__ */ jsx(PhotoGround, { photos: [photo], initials: initial, mode: "stack", gradient }),
|
|
54
|
-
/* @__PURE__ */ jsx("span", { "aria-hidden": true, className: cn("absolute inset-0",
|
|
55
|
-
/* @__PURE__ */ jsxs(
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": true, className: cn("absolute inset-0", INK_PHONE, wide && INK_WIDE) }),
|
|
60
|
+
/* @__PURE__ */ jsxs(
|
|
61
|
+
"div",
|
|
62
|
+
{
|
|
63
|
+
className: cn(
|
|
64
|
+
"relative grid flex-1 grid-cols-1 grid-rows-[auto_1fr]",
|
|
65
|
+
wide && "lg:grid-cols-[34%_1fr] lg:grid-rows-1"
|
|
66
|
+
),
|
|
67
|
+
children: [
|
|
68
|
+
/* @__PURE__ */ jsxs(
|
|
69
|
+
"div",
|
|
70
|
+
{
|
|
71
|
+
className: cn(
|
|
72
|
+
"relative flex min-h-[220px] flex-col justify-end p-3.5",
|
|
73
|
+
wide && "lg:min-h-[320px] lg:p-5",
|
|
74
|
+
TEXT_SCRIM
|
|
75
|
+
),
|
|
76
|
+
children: [
|
|
77
|
+
pill && /* @__PURE__ */ jsx(
|
|
78
|
+
"span",
|
|
79
|
+
{
|
|
80
|
+
className: cn(
|
|
81
|
+
"absolute right-3.5 top-3.5 rounded-full bg-[oklch(0.16_0.012_55_/_0.78)] px-2.5 py-1 text-[11px] font-semibold text-white",
|
|
82
|
+
wide && "lg:static lg:mb-3 lg:self-start"
|
|
83
|
+
),
|
|
84
|
+
children: pill
|
|
85
|
+
}
|
|
86
|
+
),
|
|
87
|
+
family.kicker && /* @__PURE__ */ jsx("span", { className: "mb-1 text-[11px] font-semibold uppercase tracking-[0.14em] text-white/70", children: family.kicker }),
|
|
88
|
+
/* @__PURE__ */ jsx(
|
|
89
|
+
"h3",
|
|
90
|
+
{
|
|
91
|
+
className: cn(
|
|
92
|
+
"text-balance font-serif text-[26px] font-semibold leading-tight tracking-[-0.02em] text-white",
|
|
93
|
+
wide && "lg:text-[30px]"
|
|
94
|
+
),
|
|
95
|
+
children: family.name
|
|
96
|
+
}
|
|
97
|
+
),
|
|
98
|
+
/* @__PURE__ */ jsxs("span", { className: "mt-1 flex flex-wrap items-center gap-x-2.5 gap-y-1 text-[13px] font-medium tabular-nums text-white/70", children: [
|
|
99
|
+
labels.venueUnit(family.venueCount),
|
|
100
|
+
(_f = family.facts) == null ? void 0 : _f.map((fact) => /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-2.5", children: [
|
|
101
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "text-white/40", children: "\xB7" }),
|
|
102
|
+
fact
|
|
103
|
+
] }, fact)),
|
|
104
|
+
family.priceBandLabel && /* @__PURE__ */ jsxs(
|
|
105
|
+
"span",
|
|
106
|
+
{
|
|
107
|
+
className: "inline-flex items-center gap-1",
|
|
108
|
+
"aria-label": `${labels.priceBand}: ${family.priceBandLabel}`,
|
|
109
|
+
children: [
|
|
110
|
+
/* @__PURE__ */ jsx(Wallet, { className: "h-3.5 w-3.5 shrink-0 text-white/60", "aria-hidden": true }),
|
|
111
|
+
family.priceBandLabel
|
|
112
|
+
]
|
|
113
|
+
}
|
|
114
|
+
)
|
|
115
|
+
] }),
|
|
116
|
+
/* @__PURE__ */ jsx(
|
|
117
|
+
LinkComponent,
|
|
118
|
+
{
|
|
119
|
+
href: family.href,
|
|
120
|
+
"aria-label": labels.browse,
|
|
121
|
+
className: cn(buttonVariants({ variant: "ink", size: "pill" }), "mt-3.5 w-max max-w-full"),
|
|
122
|
+
children: labels.browseShort && wide ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
123
|
+
/* @__PURE__ */ jsx("span", { className: "lg:hidden", children: labels.browse }),
|
|
124
|
+
/* @__PURE__ */ jsx("span", { className: "hidden lg:inline", children: labels.browseShort })
|
|
125
|
+
] }) : labels.browse
|
|
126
|
+
}
|
|
127
|
+
)
|
|
128
|
+
]
|
|
129
|
+
}
|
|
62
130
|
),
|
|
63
|
-
children: [
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
family.priceBandLabel && /* @__PURE__ */ jsxs(
|
|
74
|
-
"span",
|
|
131
|
+
/* @__PURE__ */ jsxs("div", { className: cn("flex min-w-0 flex-col px-3.5 pb-3.5", wide && "lg:p-5"), children: [
|
|
132
|
+
family.chips && family.chips.length > 0 && /* @__PURE__ */ jsx("ul", { className: cn("flex flex-wrap items-center gap-1.5", wide && "lg:justify-end"), children: family.chips.map((chip) => (
|
|
133
|
+
/* Label only. The counts are VENUES beside a dish group's name,
|
|
134
|
+
which every reader takes for dishes. */
|
|
135
|
+
/* @__PURE__ */ jsx(HueChip, { as: "li", hue, children: chip.label }, chip.slug)
|
|
136
|
+
)) }),
|
|
137
|
+
venues.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
138
|
+
/* @__PURE__ */ jsx(Separator, { className: "my-3 via-white/15" }),
|
|
139
|
+
/* @__PURE__ */ jsx(
|
|
140
|
+
MenuKitchenList,
|
|
75
141
|
{
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
family.priceBandLabel
|
|
81
|
-
]
|
|
142
|
+
kitchens: venues,
|
|
143
|
+
labels: labels.kitchens,
|
|
144
|
+
layout: wide ? "stacked" : "phone",
|
|
145
|
+
linkComponent: LinkComponent
|
|
82
146
|
}
|
|
83
147
|
)
|
|
84
|
-
] })
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
"aria-label": labels.browse,
|
|
90
|
-
className: cn(buttonVariants({ variant: "ink", size: "pill" }), "mt-3.5 w-max max-w-full"),
|
|
91
|
-
children: labels.browseShort ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
92
|
-
/* @__PURE__ */ jsx("span", { className: "lg:hidden", children: labels.browse }),
|
|
93
|
-
/* @__PURE__ */ jsx("span", { className: "hidden lg:inline", children: labels.browseShort })
|
|
94
|
-
] }) : labels.browse
|
|
95
|
-
}
|
|
96
|
-
)
|
|
97
|
-
]
|
|
98
|
-
}
|
|
99
|
-
),
|
|
100
|
-
/* @__PURE__ */ jsxs("div", { className: cn("flex min-w-0 flex-col px-3.5 pb-3.5 lg:p-5", PAPER), children: [
|
|
101
|
-
family.chips && family.chips.length > 0 && /* @__PURE__ */ jsx("ul", { className: "flex flex-wrap items-center gap-1.5 lg:justify-end", children: family.chips.map((chip) => (
|
|
102
|
-
/* Label only. The counts are VENUES beside a dish group's name,
|
|
103
|
-
which every reader takes for dishes. */
|
|
104
|
-
/* @__PURE__ */ jsx(HueChip, { as: "li", hue, children: chip.label }, chip.slug)
|
|
105
|
-
)) }),
|
|
106
|
-
venues.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
107
|
-
/* @__PURE__ */ jsx(Separator, { className: "my-3 via-white/15" }),
|
|
108
|
-
/* @__PURE__ */ jsx(
|
|
109
|
-
MenuKitchenList,
|
|
110
|
-
{
|
|
111
|
-
kitchens: venues,
|
|
112
|
-
labels: labels.kitchens,
|
|
113
|
-
linkComponent: LinkComponent
|
|
114
|
-
}
|
|
115
|
-
)
|
|
116
|
-
] })
|
|
117
|
-
] })
|
|
118
|
-
] })
|
|
148
|
+
] })
|
|
149
|
+
] })
|
|
150
|
+
]
|
|
151
|
+
}
|
|
152
|
+
)
|
|
119
153
|
]
|
|
120
154
|
}
|
|
121
155
|
);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { HueChip } from '../chunk-
|
|
2
|
-
import { PhotoGround, PHOTO_GROUND } from '../chunk-
|
|
1
|
+
import { HueChip } from '../chunk-6VOWT4YR.js';
|
|
2
|
+
import { PhotoGround, PHOTO_GROUND } from '../chunk-SWD6CJ35.js';
|
|
3
3
|
import { cn } from '../chunk-FEK5XGZW.js';
|
|
4
4
|
import { __objRest, __spreadValues } from '../chunk-MMUBH76A.js';
|
|
5
5
|
import { Wallet } from 'lucide-react';
|
|
@@ -58,11 +58,18 @@ type MenuFilterChipsProps = {
|
|
|
58
58
|
onMorePointerDown?: () => void;
|
|
59
59
|
/** Locale-aware integer formatter for the counts. Defaults to `String`. */
|
|
60
60
|
formatCount?: (value: number) => string;
|
|
61
|
+
/**
|
|
62
|
+
* `sm` (36px) is the row under a page header. `lg` (44px) is for a row
|
|
63
|
+
* inside a sticky bar, where the chips are the only thing the thumb can
|
|
64
|
+
* reach and 36px sits under the target floor.
|
|
65
|
+
*/
|
|
66
|
+
chipSize?: MenuFilterChipSize;
|
|
61
67
|
/** Accessible name for the row. */
|
|
62
68
|
ariaLabel?: string;
|
|
63
69
|
className?: string;
|
|
64
70
|
};
|
|
65
|
-
|
|
71
|
+
type MenuFilterChipSize = "sm" | "lg";
|
|
72
|
+
declare function MenuFilterChips({ chips, onToggle, unitLabel, onMore, moreLabel, moreIcon, onMorePointerDown, formatCount, chipSize, ariaLabel, className, }: MenuFilterChipsProps): react_jsx_runtime.JSX.Element;
|
|
66
73
|
/**
|
|
67
74
|
* MenuFilterSummary — what the active filters did, and the way out.
|
|
68
75
|
*
|
|
@@ -80,8 +87,10 @@ type MenuFilterSummaryProps = {
|
|
|
80
87
|
className?: string;
|
|
81
88
|
};
|
|
82
89
|
declare function MenuFilterSummary({ summary, clearLabel, onClear, className, }: MenuFilterSummaryProps): react_jsx_runtime.JSX.Element;
|
|
83
|
-
declare function MenuFilterChipsSkeleton({ className }: {
|
|
90
|
+
declare function MenuFilterChipsSkeleton({ className, chipSize, }: {
|
|
84
91
|
className?: string;
|
|
92
|
+
/** Match the row it stands in for, so the chips do not jump 8px on load. */
|
|
93
|
+
chipSize?: MenuFilterChipSize;
|
|
85
94
|
}): react_jsx_runtime.JSX.Element;
|
|
86
95
|
|
|
87
|
-
export { MenuFilterChips, type MenuFilterChipsProps, MenuFilterChipsSkeleton, MenuFilterSummary, type MenuFilterSummaryProps };
|
|
96
|
+
export { type MenuFilterChipSize, MenuFilterChips, type MenuFilterChipsProps, MenuFilterChipsSkeleton, MenuFilterSummary, type MenuFilterSummaryProps };
|
|
@@ -14,6 +14,7 @@ function MenuFilterChips({
|
|
|
14
14
|
moreIcon,
|
|
15
15
|
onMorePointerDown,
|
|
16
16
|
formatCount = String,
|
|
17
|
+
chipSize = "sm",
|
|
17
18
|
ariaLabel,
|
|
18
19
|
className
|
|
19
20
|
}) {
|
|
@@ -30,6 +31,7 @@ function MenuFilterChips({
|
|
|
30
31
|
Chip,
|
|
31
32
|
{
|
|
32
33
|
chip,
|
|
34
|
+
size: chipSize,
|
|
33
35
|
onToggle: () => onToggle(chip.key),
|
|
34
36
|
formatCount
|
|
35
37
|
},
|
|
@@ -46,7 +48,11 @@ function MenuFilterChips({
|
|
|
46
48
|
onPointerDown: onMorePointerDown,
|
|
47
49
|
"aria-label": moreLabel,
|
|
48
50
|
"aria-haspopup": "dialog",
|
|
49
|
-
className:
|
|
51
|
+
className: cn(
|
|
52
|
+
"inline-flex shrink-0 items-center justify-center rounded-full border border-border text-accent transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring motion-reduce:transition-none lg:hidden",
|
|
53
|
+
// The one control that never scrolls keeps the chips' height.
|
|
54
|
+
chipSize === "lg" ? "size-11" : "size-10"
|
|
55
|
+
),
|
|
50
56
|
children: moreIcon
|
|
51
57
|
}
|
|
52
58
|
),
|
|
@@ -67,6 +73,7 @@ function MenuFilterChips({
|
|
|
67
73
|
}
|
|
68
74
|
function Chip({
|
|
69
75
|
chip,
|
|
76
|
+
size,
|
|
70
77
|
onToggle,
|
|
71
78
|
formatCount
|
|
72
79
|
}) {
|
|
@@ -77,7 +84,8 @@ function Chip({
|
|
|
77
84
|
onClick: onToggle,
|
|
78
85
|
"aria-pressed": chip.active,
|
|
79
86
|
className: cn(
|
|
80
|
-
"inline-flex
|
|
87
|
+
"inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap rounded-full border px-4 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring motion-reduce:transition-none",
|
|
88
|
+
size === "lg" ? "h-11" : "h-9",
|
|
81
89
|
chip.active ? "border-accent font-semibold text-accent shadow-[0_1px_2px_oklch(0.51_0.095_45_/_0.08)]" : "border-border bg-card text-foreground hover:border-accent/40",
|
|
82
90
|
// Dimmed, never disabled — pressing it is how the reader finds out
|
|
83
91
|
// which active filter is in the way.
|
|
@@ -112,10 +120,20 @@ function MenuFilterSummary({
|
|
|
112
120
|
] });
|
|
113
121
|
}
|
|
114
122
|
var CHIP_WIDTHS = [128, 104, 96, 148, 112, 88];
|
|
115
|
-
function MenuFilterChipsSkeleton({
|
|
123
|
+
function MenuFilterChipsSkeleton({
|
|
124
|
+
className,
|
|
125
|
+
chipSize = "sm"
|
|
126
|
+
}) {
|
|
116
127
|
return /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-2 overflow-hidden", className), "aria-hidden": true, children: [
|
|
117
128
|
/* @__PURE__ */ jsx(Skeleton, { className: "h-3 w-[92px] shrink-0" }),
|
|
118
|
-
CHIP_WIDTHS.map((width, index) => /* @__PURE__ */ jsx(
|
|
129
|
+
CHIP_WIDTHS.map((width, index) => /* @__PURE__ */ jsx(
|
|
130
|
+
Skeleton,
|
|
131
|
+
{
|
|
132
|
+
className: cn("shrink-0 rounded-full", chipSize === "lg" ? "h-11" : "h-9"),
|
|
133
|
+
style: { width }
|
|
134
|
+
},
|
|
135
|
+
index
|
|
136
|
+
))
|
|
119
137
|
] });
|
|
120
138
|
}
|
|
121
139
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Separator } from '../chunk-NWZGSLPU.js';
|
|
2
2
|
import { Skeleton } from '../chunk-XBBEX4SF.js';
|
|
3
|
-
import { Button } from '../chunk-
|
|
4
|
-
import '../chunk-
|
|
3
|
+
import { Button } from '../chunk-5LTILG3L.js';
|
|
4
|
+
import '../chunk-RIH2IS7X.js';
|
|
5
|
+
import '../chunk-5YNIQ2BL.js';
|
|
5
6
|
import { cn } from '../chunk-FEK5XGZW.js';
|
|
6
7
|
import { __objRest, __spreadValues } from '../chunk-MMUBH76A.js';
|
|
7
8
|
import { useState } from 'react';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { MentionSignal, MenuItem } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-
|
|
1
|
+
export { MentionSignal, MenuItem } from '../chunk-SDWN6L4O.js';
|
|
2
|
+
import '../chunk-BKKQ7GCZ.js';
|
|
3
|
+
import '../chunk-5XREWOBB.js';
|
|
4
4
|
import '../chunk-FEK5XGZW.js';
|
|
5
5
|
import '../chunk-MMUBH76A.js';
|
|
@@ -54,6 +54,17 @@ type MenuKitchenListLabels = {
|
|
|
54
54
|
/** Reveals the next page of rows, e.g. "Show 10 more". */
|
|
55
55
|
showMore?: string;
|
|
56
56
|
};
|
|
57
|
+
/**
|
|
58
|
+
* `wide` (default): the intent page's full-width list — from `lg` the venue
|
|
59
|
+
* takes a fixed 226px column and the dish stands beside it in a column of its
|
|
60
|
+
* own. `stacked`: the list sits in a narrow column (a concept card's row
|
|
61
|
+
* half), so the venue keeps the row and the dish takes a SECOND LINE under it
|
|
62
|
+
* from `lg`; in a half-width card the dish column had ~100px and its kicker,
|
|
63
|
+
* name and meta wrapped into a stack of single words. `phone`: the phone row
|
|
64
|
+
* at every width — no dish line, the venue and its price only — for a card
|
|
65
|
+
* that keeps its phone form on a desktop rail.
|
|
66
|
+
*/
|
|
67
|
+
type MenuKitchenListLayout = "wide" | "stacked" | "phone";
|
|
57
68
|
type MenuKitchenListProps = {
|
|
58
69
|
kitchens: MenuKitchenPreview[];
|
|
59
70
|
labels: MenuKitchenListLabels;
|
|
@@ -62,10 +73,11 @@ type MenuKitchenListProps = {
|
|
|
62
73
|
* navigates for the eleventh — the list is the page.
|
|
63
74
|
*/
|
|
64
75
|
onShowMore?: () => void;
|
|
76
|
+
layout?: MenuKitchenListLayout;
|
|
65
77
|
linkComponent?: MenuLinkComponent;
|
|
66
78
|
className?: string;
|
|
67
79
|
};
|
|
68
|
-
declare function MenuKitchenList({ kitchens, labels, onShowMore, linkComponent, className, }: MenuKitchenListProps): react_jsx_runtime.JSX.Element;
|
|
80
|
+
declare function MenuKitchenList({ kitchens, labels, onShowMore, layout, linkComponent, className, }: MenuKitchenListProps): react_jsx_runtime.JSX.Element;
|
|
69
81
|
/**
|
|
70
82
|
* The list's own loading state, at the row's own footprint.
|
|
71
83
|
*
|
|
@@ -80,4 +92,4 @@ declare function MenuKitchenListSkeleton({ rows, className, }: {
|
|
|
80
92
|
className?: string;
|
|
81
93
|
}): react_jsx_runtime.JSX.Element;
|
|
82
94
|
|
|
83
|
-
export { MenuKitchenList, type MenuKitchenListLabels, type MenuKitchenListLinkProps, type MenuKitchenListProps, MenuKitchenListSkeleton };
|
|
95
|
+
export { MenuKitchenList, type MenuKitchenListLabels, type MenuKitchenListLayout, type MenuKitchenListLinkProps, type MenuKitchenListProps, MenuKitchenListSkeleton };
|
|
@@ -2,9 +2,10 @@ import { Popover, PopoverTrigger, PopoverContent } from '../chunk-2ADCZXZJ.js';
|
|
|
2
2
|
import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../chunk-MCOHLWRS.js';
|
|
3
3
|
import '../chunk-PDTPO6NG.js';
|
|
4
4
|
import { Checkbox } from '../chunk-NMEVJT5Q.js';
|
|
5
|
-
import { Button } from '../chunk-
|
|
6
|
-
import '../chunk-
|
|
7
|
-
import
|
|
5
|
+
import { Button } from '../chunk-5LTILG3L.js';
|
|
6
|
+
import '../chunk-RIH2IS7X.js';
|
|
7
|
+
import '../chunk-5YNIQ2BL.js';
|
|
8
|
+
import { Badge } from '../chunk-5XREWOBB.js';
|
|
8
9
|
import { cn } from '../chunk-FEK5XGZW.js';
|
|
9
10
|
import '../chunk-MMUBH76A.js';
|
|
10
11
|
import * as React from 'react';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { buttonVariants } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
import { buttonVariants } from '../chunk-5LTILG3L.js';
|
|
2
|
+
import '../chunk-RIH2IS7X.js';
|
|
3
|
+
import '../chunk-5YNIQ2BL.js';
|
|
3
4
|
import { cn } from '../chunk-FEK5XGZW.js';
|
|
4
5
|
import { __objRest, __spreadValues, __spreadProps } from '../chunk-MMUBH76A.js';
|
|
5
6
|
import { ChevronsLeftIcon, ChevronLeftIcon, ChevronRightIcon, ChevronsRightIcon, MoreHorizontalIcon } from 'lucide-react';
|
|
@@ -36,6 +36,12 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
|
36
36
|
*/
|
|
37
37
|
/** The ground under the photography. Fixed, and deliberately not a token. */
|
|
38
38
|
declare const PHOTO_GROUND = "bg-[oklch(0.21_0.012_55)]";
|
|
39
|
+
/**
|
|
40
|
+
* The shadow a glyph wears when it stands on `PHOTO_GROUND` in a photograph's
|
|
41
|
+
* place — the card family's fallback treatment: a ground and a lifted glyph,
|
|
42
|
+
* never a bare icon on a flat fill. Same literal family as the ground.
|
|
43
|
+
*/
|
|
44
|
+
declare const PHOTO_GLYPH_SHADOW = "drop-shadow-[0_2px_6px_oklch(0.16_0.012_55_/_0.6)]";
|
|
39
45
|
type PhotoGroundProps = {
|
|
40
46
|
/** One per slot. An absent one draws the slot's initial on the ground. */
|
|
41
47
|
photos: (string | undefined)[];
|
|
@@ -67,4 +73,4 @@ type PhotoGroundProps = {
|
|
|
67
73
|
};
|
|
68
74
|
declare function PhotoGround({ photos, initials, mode, active, mosaicClassName, phoneTiles, gradient, overlay, overlayClassName, loading, glyphClassName, className, }: PhotoGroundProps): react_jsx_runtime.JSX.Element;
|
|
69
75
|
|
|
70
|
-
export { PHOTO_GROUND, PhotoGround, type PhotoGroundProps };
|
|
76
|
+
export { PHOTO_GLYPH_SHADOW, PHOTO_GROUND, PhotoGround, type PhotoGroundProps };
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
+
import { OVERLAY_PILL } from '../chunk-EZG2NELX.js';
|
|
1
2
|
import { HOVER_IMAGE_MOTION, HOVER_IMAGE_WRAPPER, HOVER_MOTION, HOVER_LIFT_GRID_GROUP } from '../chunk-XCB3F6SF.js';
|
|
2
3
|
import { NEUTRAL_ICON_FILTER } from '../chunk-LQWGZIYA.js';
|
|
3
|
-
import { OVERLAY_PILL } from '../chunk-EZG2NELX.js';
|
|
4
4
|
import { GradeAtom } from '../chunk-DJD3EMPK.js';
|
|
5
5
|
import { showsGradeAtom } from '../chunk-I5V446BX.js';
|
|
6
6
|
import { Separator } from '../chunk-NWZGSLPU.js';
|
|
7
7
|
import { springSnappy } from '../chunk-OIV7B44M.js';
|
|
8
8
|
import { Skeleton } from '../chunk-XBBEX4SF.js';
|
|
9
|
-
import { Badge } from '../chunk-
|
|
9
|
+
import { Badge } from '../chunk-5XREWOBB.js';
|
|
10
10
|
import { cn } from '../chunk-FEK5XGZW.js';
|
|
11
11
|
import { __objRest, __spreadValues } from '../chunk-MMUBH76A.js';
|
|
12
12
|
import { forwardRef, memo, useState, useMemo } from 'react';
|
|
@@ -3,7 +3,7 @@ import '../chunk-FMTJGO76.js';
|
|
|
3
3
|
import '../chunk-MWB7S54O.js';
|
|
4
4
|
import '../chunk-NWZGSLPU.js';
|
|
5
5
|
import { Text } from '../chunk-ZLMRVBD7.js';
|
|
6
|
-
import { Badge } from '../chunk-
|
|
6
|
+
import { Badge } from '../chunk-5XREWOBB.js';
|
|
7
7
|
import { cn } from '../chunk-FEK5XGZW.js';
|
|
8
8
|
import '../chunk-MMUBH76A.js';
|
|
9
9
|
import { useState } from 'react';
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Popover, PopoverTrigger, PopoverContent } from '../chunk-2ADCZXZJ.js';
|
|
2
2
|
import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../chunk-MCOHLWRS.js';
|
|
3
3
|
import '../chunk-PDTPO6NG.js';
|
|
4
|
-
import { Button } from '../chunk-
|
|
5
|
-
import '../chunk-
|
|
4
|
+
import { Button } from '../chunk-5LTILG3L.js';
|
|
5
|
+
import '../chunk-RIH2IS7X.js';
|
|
6
|
+
import '../chunk-5YNIQ2BL.js';
|
|
6
7
|
import { cn } from '../chunk-FEK5XGZW.js';
|
|
7
8
|
import '../chunk-MMUBH76A.js';
|
|
8
9
|
import * as React from 'react';
|
|
@@ -50,9 +50,15 @@ type SectionHeaderProps = {
|
|
|
50
50
|
* would dilute the headings that matter. Defaults to `"h2"`.
|
|
51
51
|
*/
|
|
52
52
|
as?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "p" | "div";
|
|
53
|
+
/**
|
|
54
|
+
* Controls at the end of the title row, after `action` — a rail's
|
|
55
|
+
* previous / next pair on desktop. The header owns none of their
|
|
56
|
+
* behaviour; it only holds the slot.
|
|
57
|
+
*/
|
|
58
|
+
trailing?: React.ReactNode;
|
|
53
59
|
className?: string;
|
|
54
60
|
};
|
|
55
|
-
declare function SectionHeader({ title, count, subtitle, action, actionHref, actionTone, subtitleFrom, linkComponent: LinkComponent, onAction, as: Heading, className, }: SectionHeaderProps): react_jsx_runtime.JSX.Element;
|
|
61
|
+
declare function SectionHeader({ title, count, subtitle, action, actionHref, actionTone, subtitleFrom, linkComponent: LinkComponent, onAction, as: Heading, trailing, className, }: SectionHeaderProps): react_jsx_runtime.JSX.Element;
|
|
56
62
|
type SectionHeaderSkeletonProps = {
|
|
57
63
|
/** Shows the inline count placeholder, matching `SectionHeaderProps["count"]`. */
|
|
58
64
|
showCount?: boolean;
|
|
@@ -31,6 +31,7 @@ function SectionHeader({
|
|
|
31
31
|
linkComponent: LinkComponent = DefaultLink,
|
|
32
32
|
onAction,
|
|
33
33
|
as: Heading = "h2",
|
|
34
|
+
trailing,
|
|
34
35
|
className
|
|
35
36
|
}) {
|
|
36
37
|
const actionIcon = /* @__PURE__ */ jsx(ChevronRight, { className: "h-3.5 w-3.5", "aria-hidden": true });
|
|
@@ -41,13 +42,16 @@ function SectionHeader({
|
|
|
41
42
|
/* @__PURE__ */ jsx(Heading, { className: "truncate text-[17px] font-bold tracking-[-0.01em] text-foreground md:text-[18px]", children: title }),
|
|
42
43
|
count !== void 0 && /* @__PURE__ */ jsx("span", { className: "ml-1.5 shrink-0 text-[12px] tabular-nums text-muted-foreground lg:ml-0.5", children: count })
|
|
43
44
|
] }),
|
|
44
|
-
action
|
|
45
|
-
action,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
(action || trailing) && /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-3", children: [
|
|
46
|
+
action && (actionHref ? /* @__PURE__ */ jsxs(LinkComponent, { href: actionHref, className: actionClasses, onClick: onAction, children: [
|
|
47
|
+
action,
|
|
48
|
+
actionIcon
|
|
49
|
+
] }) : onAction ? /* @__PURE__ */ jsxs("button", { type: "button", className: actionClasses, onClick: onAction, children: [
|
|
50
|
+
action,
|
|
51
|
+
actionIcon
|
|
52
|
+
] }) : null),
|
|
53
|
+
trailing
|
|
54
|
+
] })
|
|
51
55
|
] }),
|
|
52
56
|
subtitle && /* @__PURE__ */ jsx(
|
|
53
57
|
"p",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { Button } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
import { Button } from '../chunk-5LTILG3L.js';
|
|
2
|
+
import '../chunk-RIH2IS7X.js';
|
|
3
|
+
import '../chunk-5YNIQ2BL.js';
|
|
3
4
|
import { cn } from '../chunk-FEK5XGZW.js';
|
|
4
5
|
import '../chunk-MMUBH76A.js';
|
|
5
6
|
import * as React from 'react';
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import * as SwitchPrimitive from '@radix-ui/react-switch';
|
|
3
3
|
|
|
4
|
-
declare const Switch: React.ForwardRefExoticComponent<Omit<SwitchPrimitive.SwitchProps & React.RefAttributes<HTMLButtonElement>, "ref"> &
|
|
4
|
+
declare const Switch: React.ForwardRefExoticComponent<Omit<SwitchPrimitive.SwitchProps & React.RefAttributes<HTMLButtonElement>, "ref"> & {
|
|
5
|
+
/**
|
|
6
|
+
* Tick on iOS through a `HapticSwitch` laid over the control. Off by default;
|
|
7
|
+
* a switch that writes a persisted setting opts in.
|
|
8
|
+
*/
|
|
9
|
+
haptic?: boolean;
|
|
10
|
+
} & React.RefAttributes<HTMLButtonElement>>;
|
|
5
11
|
|
|
6
12
|
export { Switch };
|
|
@@ -1,32 +1,41 @@
|
|
|
1
|
+
import { HapticSwitch } from '../chunk-RIH2IS7X.js';
|
|
2
|
+
import '../chunk-5YNIQ2BL.js';
|
|
1
3
|
import { cn } from '../chunk-FEK5XGZW.js';
|
|
2
4
|
import { __objRest, __spreadProps, __spreadValues } from '../chunk-MMUBH76A.js';
|
|
3
5
|
import * as React from 'react';
|
|
4
6
|
import * as SwitchPrimitive from '@radix-ui/react-switch';
|
|
5
|
-
import { jsx } from 'react/jsx-runtime';
|
|
7
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
8
|
|
|
7
|
-
var Switch = React.forwardRef(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
className
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
9
|
+
var Switch = React.forwardRef(
|
|
10
|
+
(_a, ref) => {
|
|
11
|
+
var _b = _a, { className, haptic = false, disabled } = _b, props = __objRest(_b, ["className", "haptic", "disabled"]);
|
|
12
|
+
return /* @__PURE__ */ jsxs(
|
|
13
|
+
SwitchPrimitive.Root,
|
|
14
|
+
__spreadProps(__spreadValues({
|
|
15
|
+
ref,
|
|
16
|
+
"data-slot": "switch",
|
|
17
|
+
disabled,
|
|
18
|
+
className: cn(
|
|
19
|
+
"peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input aria-invalid:ring-2 aria-invalid:ring-destructive/40",
|
|
20
|
+
haptic && "relative",
|
|
21
|
+
className
|
|
22
|
+
)
|
|
23
|
+
}, props), {
|
|
24
|
+
children: [
|
|
25
|
+
/* @__PURE__ */ jsx(
|
|
26
|
+
SwitchPrimitive.Thumb,
|
|
27
|
+
{
|
|
28
|
+
className: cn(
|
|
29
|
+
"pointer-events-none block size-5 rounded-full bg-background shadow-md ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0 data-[state=checked]:bg-primary-foreground"
|
|
30
|
+
)
|
|
31
|
+
}
|
|
32
|
+
),
|
|
33
|
+
haptic && /* @__PURE__ */ jsx(HapticSwitch, { disabled })
|
|
34
|
+
]
|
|
35
|
+
})
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
);
|
|
30
39
|
Switch.displayName = SwitchPrimitive.Root.displayName;
|
|
31
40
|
|
|
32
41
|
export { Switch };
|