@bearmenu/ui 0.8.8 → 0.8.10
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-24RFI4RQ.js +167 -0
- package/dist/chunk-2XCZJWTV.js +121 -0
- package/dist/chunk-5RWTOT5Y.js +72 -0
- package/dist/chunk-62ES6N32.js +27 -0
- package/dist/chunk-AKQ57NXY.js +58 -0
- package/dist/chunk-CLLY6XB3.js +41 -0
- package/dist/chunk-DTXNDLSE.js +125 -0
- package/dist/chunk-F6FMZJDG.js +113 -0
- package/dist/{chunk-2WDJR6K7.js → chunk-G7IFL4Z4.js} +4 -1
- package/dist/chunk-MZL7CGCL.js +109 -0
- package/dist/chunk-Q6QH52LJ.js +38 -0
- package/dist/chunk-SY6RV476.js +48 -0
- package/dist/chunk-TH6W2PWG.js +213 -0
- package/dist/chunk-UDN7UHJW.js +60 -0
- package/dist/{chunk-TT3WFS6S.js → chunk-YOKHBAIH.js} +11 -11
- package/dist/components/alert.d.ts +2 -2
- package/dist/components/badge.d.ts +1 -1
- package/dist/components/concept-compare-rail.d.ts +50 -0
- package/dist/components/concept-compare-rail.js +5 -0
- package/dist/components/concept-compare.d.ts +110 -0
- package/dist/components/concept-compare.js +238 -0
- package/dist/components/concept-convergence.d.ts +41 -0
- package/dist/components/concept-convergence.js +53 -0
- package/dist/components/convergence.d.ts +25 -0
- package/dist/components/convergence.js +4 -0
- package/dist/components/date-input.d.ts +1 -1
- package/dist/components/event-card.js +1 -1
- package/dist/components/event-compact-row.d.ts +1 -1
- package/dist/components/event-compact-row.js +1 -1
- package/dist/components/event-detail-panel.d.ts +171 -25
- package/dist/components/event-detail-panel.js +472 -175
- 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 +2 -2
- package/dist/components/explainer-steps.d.ts +34 -0
- package/dist/components/explainer-steps.js +36 -0
- package/dist/components/glass-ground.d.ts +66 -0
- package/dist/components/glass-ground.js +3 -0
- package/dist/components/hub-surface.d.ts +27 -0
- package/dist/components/hub-surface.js +30 -0
- package/dist/components/hue-chip.d.ts +70 -0
- package/dist/components/hue-chip.js +3 -0
- package/dist/components/kitchen-dossier.d.ts +88 -0
- package/dist/components/kitchen-dossier.js +187 -0
- package/dist/components/menu-dead-end.d.ts +56 -0
- package/dist/components/menu-dead-end.js +49 -0
- package/dist/components/menu-family-block.d.ts +99 -0
- package/dist/components/menu-family-block.js +155 -0
- package/dist/components/menu-family-card.d.ts +65 -0
- package/dist/components/menu-family-card.js +79 -0
- package/dist/components/menu-field.d.ts +57 -0
- package/dist/components/menu-field.js +93 -0
- package/dist/components/menu-filter-chips.d.ts +86 -0
- package/dist/components/menu-filter-chips.js +122 -0
- package/dist/components/menu-group-rows.d.ts +53 -0
- package/dist/components/menu-group-rows.js +67 -0
- package/dist/components/menu-hub-hero.d.ts +65 -0
- package/dist/components/menu-hub-hero.js +103 -0
- package/dist/components/menu-index-header.d.ts +37 -0
- package/dist/components/menu-index-header.js +68 -0
- package/dist/components/menu-index-list.d.ts +48 -0
- package/dist/components/menu-index-list.js +96 -0
- package/dist/components/menu-intent-hero.d.ts +69 -0
- package/dist/components/menu-intent-hero.js +87 -0
- package/dist/components/menu-intent-tiles.d.ts +31 -0
- package/dist/components/menu-intent-tiles.js +50 -0
- package/dist/components/menu-item.d.ts +127 -0
- package/dist/components/menu-item.js +5 -0
- package/dist/components/menu-kitchen-list.d.ts +82 -0
- package/dist/components/menu-kitchen-list.js +5 -0
- package/dist/components/menu-mocks.d.ts +90 -0
- package/dist/components/menu-mocks.js +504 -0
- package/dist/components/menu-types.d.ts +421 -0
- package/dist/components/menu-types.js +1 -0
- package/dist/components/motion-icon-controls.js +2 -2
- package/dist/components/motion-icon-set.js +21 -9
- package/dist/components/motion-icon.d.ts +22 -1
- package/dist/components/motion-icon.js +1 -1
- package/dist/components/open-now-list.d.ts +40 -0
- package/dist/components/open-now-list.js +69 -0
- package/dist/components/photo-ground.d.ts +64 -0
- package/dist/components/photo-ground.js +3 -0
- package/dist/components/place-about-tab.js +2 -2
- package/dist/components/place-details-mobile.js +2 -2
- package/dist/components/place-types.d.ts +112 -1
- package/dist/components/qa-block.d.ts +36 -0
- package/dist/components/qa-block.js +24 -0
- package/dist/components/scroll-fade.js +3 -121
- package/dist/components/signature-chip.d.ts +37 -0
- package/dist/components/signature-chip.js +4 -0
- package/dist/components/snap-rail.d.ts +48 -5
- package/dist/components/snap-rail.js +3 -51
- package/dist/components/stat-banner.d.ts +47 -0
- package/dist/components/stat-banner.js +61 -0
- package/dist/components/story.d.ts +34 -0
- package/dist/components/story.js +3 -0
- package/dist/components/tag.d.ts +2 -2
- package/dist/components/text.d.ts +1 -1
- package/dist/components/top-comparison.d.ts +28 -0
- package/dist/components/top-comparison.js +76 -0
- package/dist/components/top-cross-link.d.ts +34 -0
- package/dist/components/top-cross-link.js +101 -0
- package/dist/components/top-ranking-entry.d.ts +53 -0
- package/dist/components/top-ranking-entry.js +217 -0
- package/dist/components/top-ranking-hero.d.ts +61 -0
- package/dist/components/top-ranking-hero.js +99 -0
- package/dist/components/top-ranking-legend.d.ts +69 -0
- package/dist/components/top-ranking-legend.js +124 -0
- package/dist/components/top-types.d.ts +109 -0
- package/dist/components/top-types.js +1 -0
- package/dist/components/venue-grade-dimensions.d.ts +38 -0
- package/dist/components/venue-grade-dimensions.js +3 -0
- package/dist/components/venue-quotes.d.ts +32 -0
- package/dist/components/venue-quotes.js +3 -0
- package/dist/components/venue-wall.d.ts +41 -0
- package/dist/components/venue-wall.js +118 -0
- package/dist/components/weekday-theme-banner.d.ts +70 -0
- package/dist/components/weekday-theme-banner.js +127 -0
- package/dist/components/weekend-panel.js +2 -2
- package/package.json +1 -1
- package/src/components/colour-dictionary.stories.tsx +227 -0
- package/src/components/concept-compare-rail.tsx +131 -0
- package/src/components/concept-compare.stories.tsx +172 -0
- package/src/components/concept-compare.tsx +443 -0
- package/src/components/concept-convergence.stories.tsx +53 -0
- package/src/components/concept-convergence.tsx +90 -0
- package/src/components/convergence.stories.tsx +54 -0
- package/src/components/convergence.tsx +177 -0
- package/src/components/event-compact-row.tsx +1 -1
- package/src/components/event-detail-panel.stories.tsx +205 -97
- package/src/components/event-detail-panel.test.tsx +181 -0
- package/src/components/event-detail-panel.tsx +703 -185
- package/src/components/explainer-steps.stories.tsx +46 -0
- package/src/components/explainer-steps.tsx +74 -0
- package/src/components/glass-ground.tsx +129 -0
- package/src/components/hub-surface.stories.tsx +68 -0
- package/src/components/hub-surface.tsx +50 -0
- package/src/components/hue-chip.stories.tsx +76 -0
- package/src/components/hue-chip.test.tsx +62 -0
- package/src/components/hue-chip.tsx +99 -0
- package/src/components/kitchen-dossier.stories.tsx +108 -0
- package/src/components/kitchen-dossier.tsx +322 -0
- package/src/components/menu-dead-end.stories.tsx +67 -0
- package/src/components/menu-dead-end.tsx +127 -0
- package/src/components/menu-family-block.stories.tsx +91 -0
- package/src/components/menu-family-block.tsx +314 -0
- package/src/components/menu-family-card.stories.tsx +120 -0
- package/src/components/menu-family-card.tsx +191 -0
- package/src/components/menu-field.stories.tsx +74 -0
- package/src/components/menu-field.tsx +199 -0
- package/src/components/menu-filter-chips.stories.tsx +107 -0
- package/src/components/menu-filter-chips.tsx +238 -0
- package/src/components/menu-group-rows.stories.tsx +54 -0
- package/src/components/menu-group-rows.tsx +133 -0
- package/src/components/menu-hub-hero.stories.tsx +92 -0
- package/src/components/menu-hub-hero.tsx +187 -0
- package/src/components/menu-index-header.stories.tsx +72 -0
- package/src/components/menu-index-header.tsx +125 -0
- package/src/components/menu-index-list.stories.tsx +50 -0
- package/src/components/menu-index-list.tsx +149 -0
- package/src/components/menu-intent-hero.stories.tsx +67 -0
- package/src/components/menu-intent-hero.tsx +189 -0
- package/src/components/menu-intent-tiles.stories.tsx +54 -0
- package/src/components/menu-intent-tiles.tsx +76 -0
- package/src/components/menu-item.tsx +416 -0
- package/src/components/menu-kitchen-list.stories.tsx +67 -0
- package/src/components/menu-kitchen-list.test.tsx +78 -0
- package/src/components/menu-kitchen-list.tsx +284 -0
- package/src/components/menu-mocks.ts +592 -0
- package/src/components/menu-types.ts +442 -0
- package/src/components/motion-icon-controls.tsx +11 -11
- package/src/components/motion-icon-set.tsx +36 -8
- package/src/components/motion-icon.test.tsx +23 -1
- package/src/components/motion-icon.tsx +20 -0
- package/src/components/open-now-list.stories.tsx +76 -0
- package/src/components/open-now-list.tsx +127 -0
- package/src/components/photo-ground.tsx +147 -0
- package/src/components/place-types.ts +112 -0
- package/src/components/qa-block.stories.tsx +43 -0
- package/src/components/qa-block.tsx +60 -0
- package/src/components/signature-chip.tsx +77 -0
- package/src/components/snap-rail.tsx +133 -9
- package/src/components/stat-banner.stories.tsx +100 -0
- package/src/components/stat-banner.tsx +117 -0
- package/src/components/story.tsx +225 -0
- package/src/components/top-comparison.stories.tsx +78 -0
- package/src/components/top-comparison.tsx +151 -0
- package/src/components/top-cross-link.stories.tsx +84 -0
- package/src/components/top-cross-link.tsx +171 -0
- package/src/components/top-ranking-entry.stories.tsx +171 -0
- package/src/components/top-ranking-entry.test.tsx +105 -0
- package/src/components/top-ranking-entry.tsx +425 -0
- package/src/components/top-ranking-hero.stories.tsx +76 -0
- package/src/components/top-ranking-hero.tsx +218 -0
- package/src/components/top-ranking-legend.stories.tsx +78 -0
- package/src/components/top-ranking-legend.tsx +239 -0
- package/src/components/top-types.ts +110 -0
- package/src/components/venue-grade-dimensions.stories.tsx +83 -0
- package/src/components/venue-grade-dimensions.tsx +91 -0
- package/src/components/venue-quotes.stories.tsx +59 -0
- package/src/components/venue-quotes.tsx +64 -0
- package/src/components/venue-wall.stories.tsx +78 -0
- package/src/components/venue-wall.tsx +185 -0
- package/src/components/weekday-theme-banner.stories.tsx +113 -0
- package/src/components/weekday-theme-banner.tsx +231 -0
- package/dist/{chunk-XWMRABZW.js → chunk-HSIYYA2E.js} +1 -1
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
import { __spreadProps, __spreadValues } from '../chunk-3GWWZKX7.js';
|
|
2
|
+
|
|
3
|
+
// src/components/menu-mocks.ts
|
|
4
|
+
var mockGradients = {
|
|
5
|
+
// The forest dictionary (docs/colour-dictionary.md, Foundations/Colour dictionary):
|
|
6
|
+
// wheat, ember, pine, maple, lake water. Post-generator films these, so they
|
|
7
|
+
// must be the same values the app paints.
|
|
8
|
+
pasta: "linear-gradient(150deg, oklch(0.555 0.105 80), oklch(0.455 0.10 70))",
|
|
9
|
+
meat: "linear-gradient(150deg, oklch(0.49 0.13 28), oklch(0.41 0.12 22))",
|
|
10
|
+
greens: "linear-gradient(150deg, oklch(0.505 0.115 148), oklch(0.415 0.11 142))",
|
|
11
|
+
sweet: "linear-gradient(150deg, oklch(0.505 0.14 50), oklch(0.405 0.13 42))",
|
|
12
|
+
cocktail: "linear-gradient(150deg, oklch(0.485 0.095 205), oklch(0.405 0.09 212))"
|
|
13
|
+
};
|
|
14
|
+
var mockPlaces = [
|
|
15
|
+
{
|
|
16
|
+
id: "p1",
|
|
17
|
+
slug: "the-copper-yard",
|
|
18
|
+
name: "The Copper Yard",
|
|
19
|
+
open_now: true,
|
|
20
|
+
rating: { rating: 4.6, count: 318 },
|
|
21
|
+
hours: [{ opens_at: 12, closes_at: 23 }],
|
|
22
|
+
price_dishes: { price_range_low: 19, price_range_high: 62, median_price: 28 },
|
|
23
|
+
cuisines: ["italian", "pizza"],
|
|
24
|
+
type: "pub",
|
|
25
|
+
busyness: [
|
|
26
|
+
{ hour: 12, score: 22 },
|
|
27
|
+
{ hour: 13, score: 26 },
|
|
28
|
+
{ hour: 14, score: 30 },
|
|
29
|
+
{ hour: 15, score: 38 },
|
|
30
|
+
{ hour: 16, score: 52 },
|
|
31
|
+
{ hour: 17, score: 74 },
|
|
32
|
+
{ hour: 18, score: 92 },
|
|
33
|
+
{ hour: 19, score: 100 },
|
|
34
|
+
{ hour: 20, score: 86 },
|
|
35
|
+
{ hour: 21, score: 64 }
|
|
36
|
+
],
|
|
37
|
+
reviews_digest: {
|
|
38
|
+
review_count: 318,
|
|
39
|
+
grade: {
|
|
40
|
+
overall: 8.4,
|
|
41
|
+
show_number: true,
|
|
42
|
+
descriptor: "Foarte bun",
|
|
43
|
+
confidence: "high",
|
|
44
|
+
dimensions: {
|
|
45
|
+
food: 89,
|
|
46
|
+
service: 82,
|
|
47
|
+
value: 86,
|
|
48
|
+
ambiance: 78,
|
|
49
|
+
portion: 91,
|
|
50
|
+
consistency: 84
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
value: { value: "fair" },
|
|
54
|
+
tags: [{ value: "casual" }, { value: "cozy" }, { value: "family_friendly" }],
|
|
55
|
+
highlights: [
|
|
56
|
+
{
|
|
57
|
+
text: "The wings are the reason to sit at the bar \u2014 hot honey, and they keep going until the kitchen shuts.",
|
|
58
|
+
review_ids: ["r1", "r2", "r3"]
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
text: "Last kitchen open on this street. We came at half eleven and still ate properly.",
|
|
62
|
+
review_ids: ["r4", "r5"]
|
|
63
|
+
}
|
|
64
|
+
],
|
|
65
|
+
must_try: [
|
|
66
|
+
{
|
|
67
|
+
name: "Chicken wings, 6 pc",
|
|
68
|
+
why: "Buttermilk brine and hot honey, fried to order until the kitchen shuts.",
|
|
69
|
+
strength: "signature",
|
|
70
|
+
slug: "chicken-wings",
|
|
71
|
+
mentions: 23,
|
|
72
|
+
sizes_and_prices: [{ size: 320, price: 32 }],
|
|
73
|
+
review_ids: ["r1", "r2", "r3"]
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
id: "p2",
|
|
80
|
+
slug: "salt-and-stone",
|
|
81
|
+
name: "Salt & Stone",
|
|
82
|
+
open_now: true,
|
|
83
|
+
rating: { rating: 4.8, count: 204 },
|
|
84
|
+
hours: [{ opens_at: 11, closes_at: 22 }],
|
|
85
|
+
price_dishes: { price_range_low: 38, price_range_high: 84, median_price: 49 },
|
|
86
|
+
cuisines: ["italian"],
|
|
87
|
+
type: "restaurant",
|
|
88
|
+
reviews_digest: {
|
|
89
|
+
review_count: 204,
|
|
90
|
+
grade: {
|
|
91
|
+
overall: 8.9,
|
|
92
|
+
show_number: true,
|
|
93
|
+
dimensions: { food: 93, service: 88, value: 74, ambiance: 85 }
|
|
94
|
+
},
|
|
95
|
+
must_try: [
|
|
96
|
+
{
|
|
97
|
+
name: "Truffle Tagliatelle",
|
|
98
|
+
why: "Made in-house each morning with black truffle and parmesan.",
|
|
99
|
+
strength: "signature",
|
|
100
|
+
slug: "truffle-tagliatelle",
|
|
101
|
+
mentions: 17,
|
|
102
|
+
sizes_and_prices: [{ size: 320, price: 62 }],
|
|
103
|
+
review_ids: ["r6", "r7"]
|
|
104
|
+
}
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
id: "p3",
|
|
110
|
+
slug: "the-quiet-hours",
|
|
111
|
+
name: "The Quiet Hours",
|
|
112
|
+
open_now: true,
|
|
113
|
+
rating: { rating: 4.5, count: 96 },
|
|
114
|
+
hours: [{ opens_at: 8, closes_at: 20 }],
|
|
115
|
+
price_dishes: { price_range_low: 8, price_range_high: 26, median_price: 14 },
|
|
116
|
+
type: "coffee_shop",
|
|
117
|
+
reviews_digest: {
|
|
118
|
+
review_count: 96,
|
|
119
|
+
// A coffee bar is graded on coffee_quality and never on food — the
|
|
120
|
+
// dimension row must survive the absence rather than draw a zero.
|
|
121
|
+
grade: {
|
|
122
|
+
overall: 8.6,
|
|
123
|
+
show_number: true,
|
|
124
|
+
dimensions: { coffee_quality: 91, service: 86, value: 80, ambiance: 88 }
|
|
125
|
+
},
|
|
126
|
+
must_try: [
|
|
127
|
+
{
|
|
128
|
+
name: "Flat white",
|
|
129
|
+
strength: "frequent",
|
|
130
|
+
slug: "flat-white",
|
|
131
|
+
mentions: 28,
|
|
132
|
+
sizes_and_prices: [{ size: 220, price: 14 }]
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
id: "p4",
|
|
139
|
+
slug: "green-room-canteen",
|
|
140
|
+
name: "Green Room Canteen",
|
|
141
|
+
open_now: false,
|
|
142
|
+
rating: { rating: 4.7, count: 141 },
|
|
143
|
+
price_dishes: { price_range_low: 22, price_range_high: 51, median_price: 31 },
|
|
144
|
+
type: "restaurant"
|
|
145
|
+
// No digest at all: a place the census has not reached. Every venue surface
|
|
146
|
+
// has to render this without collapsing.
|
|
147
|
+
}
|
|
148
|
+
];
|
|
149
|
+
var placeBySlug = (slug) => mockPlaces.find((place) => place.slug === slug);
|
|
150
|
+
var mockVenues = [
|
|
151
|
+
{
|
|
152
|
+
place: placeBySlug("the-copper-yard"),
|
|
153
|
+
href: "/places/the-copper-yard",
|
|
154
|
+
closes_at_label: "23:00",
|
|
155
|
+
signature: {
|
|
156
|
+
item: {
|
|
157
|
+
id: "s1",
|
|
158
|
+
slug: "chicken-wings",
|
|
159
|
+
name: "Chicken wings, 6 pc",
|
|
160
|
+
kind: "dish",
|
|
161
|
+
mentions: 23,
|
|
162
|
+
sizes_and_prices: [{ size: 320, price: 32 }]
|
|
163
|
+
},
|
|
164
|
+
why: "Buttermilk brine and hot honey, fried to order until the kitchen shuts.",
|
|
165
|
+
isSignature: true,
|
|
166
|
+
href: "/menu/dishes/chicken-wings"
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
place: placeBySlug("salt-and-stone"),
|
|
171
|
+
href: "/places/salt-and-stone",
|
|
172
|
+
closes_at_label: "22:00",
|
|
173
|
+
signature: {
|
|
174
|
+
item: {
|
|
175
|
+
id: "s2",
|
|
176
|
+
slug: "truffle-tagliatelle",
|
|
177
|
+
name: "Truffle Tagliatelle",
|
|
178
|
+
kind: "dish",
|
|
179
|
+
mentions: 17,
|
|
180
|
+
sizes_and_prices: [{ size: 320, price: 62 }]
|
|
181
|
+
},
|
|
182
|
+
why: "Made in-house each morning with black truffle and parmesan.",
|
|
183
|
+
isSignature: true,
|
|
184
|
+
href: "/menu/dishes/truffle-tagliatelle"
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
place: placeBySlug("the-quiet-hours"),
|
|
189
|
+
href: "/places/the-quiet-hours",
|
|
190
|
+
closes_at_label: "20:00",
|
|
191
|
+
signature: {
|
|
192
|
+
item: {
|
|
193
|
+
id: "s3",
|
|
194
|
+
slug: "flat-white",
|
|
195
|
+
name: "Flat white",
|
|
196
|
+
kind: "drink",
|
|
197
|
+
mentions: 28,
|
|
198
|
+
sizes_and_prices: [{ size: 220, price: 14 }]
|
|
199
|
+
},
|
|
200
|
+
href: "/menu/drinks/flat-white"
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
place: placeBySlug("green-room-canteen"),
|
|
205
|
+
href: "/places/green-room-canteen"
|
|
206
|
+
// No signature: the row must still read as a venue.
|
|
207
|
+
}
|
|
208
|
+
];
|
|
209
|
+
var mockItems = [
|
|
210
|
+
{
|
|
211
|
+
id: "i1",
|
|
212
|
+
slug: "truffle-tagliatelle",
|
|
213
|
+
name: "Truffle Tagliatelle",
|
|
214
|
+
kind: "dish",
|
|
215
|
+
category_slug: "pasta",
|
|
216
|
+
mentions: 17,
|
|
217
|
+
sizes_and_prices: [{ size: 320, price: 62 }],
|
|
218
|
+
place: { slug: "salt-and-stone", name: "Salt & Stone" }
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
id: "i2",
|
|
222
|
+
slug: "chicken-wings",
|
|
223
|
+
name: "Chicken wings, 6 pc",
|
|
224
|
+
kind: "dish",
|
|
225
|
+
category_slug: "chicken-dish",
|
|
226
|
+
mentions: 23,
|
|
227
|
+
sizes_and_prices: [{ size: 320, price: 32 }],
|
|
228
|
+
place: { slug: "the-copper-yard", name: "The Copper Yard" }
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
id: "i3",
|
|
232
|
+
slug: "burrata-heirloom-tomato",
|
|
233
|
+
name: "Burrata & heirloom tomato",
|
|
234
|
+
kind: "dish",
|
|
235
|
+
category_slug: "salad",
|
|
236
|
+
mentions: 14,
|
|
237
|
+
sizes_and_prices: [{ size: 300, price: 49 }],
|
|
238
|
+
place: { slug: "green-room-canteen", name: "Green Room Canteen" }
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
id: "i4",
|
|
242
|
+
slug: "flat-white",
|
|
243
|
+
name: "Flat white",
|
|
244
|
+
kind: "drink",
|
|
245
|
+
category_slug: "non-alcoholic",
|
|
246
|
+
mentions: 28,
|
|
247
|
+
sizes_and_prices: [{ size: 220, price: 14 }],
|
|
248
|
+
place: { slug: "the-quiet-hours", name: "The Quiet Hours" }
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
id: "i5",
|
|
252
|
+
slug: "house-negroni",
|
|
253
|
+
name: "House negroni",
|
|
254
|
+
kind: "drink",
|
|
255
|
+
category_slug: "cocktail",
|
|
256
|
+
// Deliberately unmentioned: the badge must not render "0".
|
|
257
|
+
mentions: 0,
|
|
258
|
+
sizes_and_prices: [{ size: 150, price: 32 }],
|
|
259
|
+
place: { slug: "the-copper-yard", name: "The Copper Yard" }
|
|
260
|
+
}
|
|
261
|
+
];
|
|
262
|
+
var mockConcept = {
|
|
263
|
+
slug: "margherita",
|
|
264
|
+
title: "Margherita",
|
|
265
|
+
kind: "dish",
|
|
266
|
+
venue_count: 87,
|
|
267
|
+
price_low: 10,
|
|
268
|
+
price_high: 120,
|
|
269
|
+
alias_count: 12,
|
|
270
|
+
mentions: 214,
|
|
271
|
+
rows: [
|
|
272
|
+
{
|
|
273
|
+
place_slug: "the-copper-yard",
|
|
274
|
+
place_name: "The Copper Yard",
|
|
275
|
+
alias: "Pizza Margherita",
|
|
276
|
+
price: 34,
|
|
277
|
+
mentions: 23,
|
|
278
|
+
rating: 4.6,
|
|
279
|
+
place_type: "pub",
|
|
280
|
+
featured: true
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
place_slug: "salt-and-stone",
|
|
284
|
+
place_name: "Salt & Stone",
|
|
285
|
+
alias: "Margherita D.O.P.",
|
|
286
|
+
price: 46,
|
|
287
|
+
mentions: 17,
|
|
288
|
+
rating: 4.8,
|
|
289
|
+
place_type: "restaurant"
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
place_slug: "green-room-canteen",
|
|
293
|
+
place_name: "Green Room Canteen",
|
|
294
|
+
alias: "Marinara Bianca",
|
|
295
|
+
price: 52,
|
|
296
|
+
mentions: 9,
|
|
297
|
+
rating: 4.7,
|
|
298
|
+
place_type: "canteen"
|
|
299
|
+
}
|
|
300
|
+
]
|
|
301
|
+
};
|
|
302
|
+
var mockFamily = {
|
|
303
|
+
slug: "italian",
|
|
304
|
+
name: "Italian",
|
|
305
|
+
venue_count: 247,
|
|
306
|
+
chips: [
|
|
307
|
+
{ slug: "pizza", label: "Pizza", count: 120 },
|
|
308
|
+
{ slug: "pasta", label: "Pasta", count: 96 },
|
|
309
|
+
{ slug: "salad", label: "Salad", count: 88 },
|
|
310
|
+
{ slug: "chicken-dish", label: "Chicken", count: 77 }
|
|
311
|
+
],
|
|
312
|
+
price_low: 32,
|
|
313
|
+
price_high: 84,
|
|
314
|
+
price_median: 49,
|
|
315
|
+
venue_photo_urls: []
|
|
316
|
+
};
|
|
317
|
+
var mockDrinkFamily = {
|
|
318
|
+
slug: "cocktail",
|
|
319
|
+
name: "Cocktails",
|
|
320
|
+
venue_count: 21,
|
|
321
|
+
// No counts: there is no drink-group facet on places, so these ship as bare
|
|
322
|
+
// labels rather than with an invented number.
|
|
323
|
+
chips: [
|
|
324
|
+
{ slug: "spritz", label: "Spritz" },
|
|
325
|
+
{ slug: "negroni", label: "Negroni" },
|
|
326
|
+
{ slug: "sour", label: "Sour" }
|
|
327
|
+
],
|
|
328
|
+
price_low: 18,
|
|
329
|
+
price_high: 54,
|
|
330
|
+
price_median: 28,
|
|
331
|
+
venue_photo_urls: []
|
|
332
|
+
};
|
|
333
|
+
var intentGradient = (hue) => `linear-gradient(150deg, oklch(0.52 0.14 ${hue}), oklch(0.43 0.13 ${hue - 4}))`;
|
|
334
|
+
var mockIntentTiles = [
|
|
335
|
+
{ slug: "italian", label: "Italian tonight", caption: "247 kitchens", href: "/top/italian?open=now", gradient: intentGradient(40) },
|
|
336
|
+
{ slug: "burgeri", label: "Burgers", caption: "229 kitchens", href: "/top/burgeri", gradient: intentGradient(25) },
|
|
337
|
+
{ slug: "restaurante", label: "Open right now", caption: "by the hour", href: "/top/restaurante?open=now", gradient: intentGradient(60) },
|
|
338
|
+
{ slug: "brunch", label: "Brunch", caption: "314 kitchens", href: "/top/brunch", gradient: intentGradient(75) },
|
|
339
|
+
{ slug: "vegan", label: "Vegan", caption: "108 kitchens", href: "/top/vegan", gradient: intentGradient(148) },
|
|
340
|
+
{ slug: "centru", label: "In Centru", caption: "by neighbourhood", href: "/top/centru", gradient: intentGradient(300) }
|
|
341
|
+
];
|
|
342
|
+
var mockFormatters = {
|
|
343
|
+
price: (value) => `${value} lei`,
|
|
344
|
+
number: (value) => value.toLocaleString("en-US"),
|
|
345
|
+
score: (value) => (value / 10).toFixed(1)
|
|
346
|
+
};
|
|
347
|
+
var mockHubLabels = {
|
|
348
|
+
mentions: (count) => `${count} mentions`,
|
|
349
|
+
venues: (count) => `${count} kitchens`,
|
|
350
|
+
seeAll: "See all",
|
|
351
|
+
signature: "SIGNATURE",
|
|
352
|
+
openNow: "Open now",
|
|
353
|
+
until: "until"
|
|
354
|
+
};
|
|
355
|
+
var mockKitchens = [
|
|
356
|
+
{
|
|
357
|
+
place: placeBySlug("salt-and-stone"),
|
|
358
|
+
href: "/places/salt-and-stone",
|
|
359
|
+
metaLabel: "courtyard \xB7 Centru",
|
|
360
|
+
hoursLabel: "kitchen until 23:00",
|
|
361
|
+
priceLabel: "62 lei",
|
|
362
|
+
dish: {
|
|
363
|
+
name: "Truffle Tagliatelle",
|
|
364
|
+
href: "/menu/dishes/truffle-tagliatelle",
|
|
365
|
+
kicker: "MOST NAMED HERE",
|
|
366
|
+
meta: "17 reviews name it"
|
|
367
|
+
}
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
place: placeBySlug("the-copper-yard"),
|
|
371
|
+
href: "/places/the-copper-yard",
|
|
372
|
+
metaLabel: "pizzeria \xB7 Centru",
|
|
373
|
+
hoursLabel: "kitchen until 23:30",
|
|
374
|
+
priceLabel: "54 lei",
|
|
375
|
+
dish: {
|
|
376
|
+
name: "Tagliatelle cu Hribi",
|
|
377
|
+
href: "/menu/dishes/tagliatelle-cu-hribi",
|
|
378
|
+
kicker: "MOST NAMED HERE",
|
|
379
|
+
meta: "14 reviews name it"
|
|
380
|
+
}
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
// Closed, and its must-try has no live menu row — the dish line is inert.
|
|
384
|
+
place: __spreadProps(__spreadValues({}, placeBySlug("the-quiet-hours")), { open_now: false }),
|
|
385
|
+
href: "/places/the-quiet-hours",
|
|
386
|
+
metaLabel: "bistro \xB7 Gheorgheni",
|
|
387
|
+
hoursLabel: "closed \xB7 opens 12:00",
|
|
388
|
+
priceLabel: "58 lei",
|
|
389
|
+
dish: { name: "Risotto ai Funghi", kicker: "MOST NAMED HERE" }
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
// No dish at all: the row must still read as a venue.
|
|
393
|
+
place: placeBySlug("green-room-canteen"),
|
|
394
|
+
href: "/places/green-room-canteen",
|
|
395
|
+
metaLabel: "bistro \xB7 Centru",
|
|
396
|
+
priceLabel: "38 lei"
|
|
397
|
+
}
|
|
398
|
+
];
|
|
399
|
+
var mockMatchedKitchens = mockKitchens.slice(0, 3).map((kitchen) => __spreadProps(__spreadValues({}, kitchen), {
|
|
400
|
+
dish: kitchen.dish && __spreadProps(__spreadValues({}, kitchen.dish), {
|
|
401
|
+
kicker: "WHY IT MATCHES",
|
|
402
|
+
meta: "mid-range \xB7 300g",
|
|
403
|
+
matched: true,
|
|
404
|
+
matchLabel: "vegetarian"
|
|
405
|
+
})
|
|
406
|
+
}));
|
|
407
|
+
var mockIntentFigures = [
|
|
408
|
+
{ key: "total", value: "247", label: "kitchens" },
|
|
409
|
+
{ key: "pizza", value: "120", label: "make a pizza", onSelect: () => {
|
|
410
|
+
} },
|
|
411
|
+
{ key: "pasta", value: "96", label: "make pasta", onSelect: () => {
|
|
412
|
+
} },
|
|
413
|
+
{ key: "open", value: "58", label: "open now", onSelect: () => {
|
|
414
|
+
} }
|
|
415
|
+
];
|
|
416
|
+
var mockFilterChips = [
|
|
417
|
+
{ key: "open", label: "Open now", count: 58, active: true },
|
|
418
|
+
{ key: "price", label: "Mid-range", count: 96 },
|
|
419
|
+
{ key: "terrace", label: "Terrace", count: 31 },
|
|
420
|
+
{ key: "veg", label: "Has a vegetarian dish", count: 84 },
|
|
421
|
+
{ key: "late", label: "Serving past midnight", count: 4 },
|
|
422
|
+
{ key: "centru", label: "Centru", count: 90 }
|
|
423
|
+
];
|
|
424
|
+
var mockLoosenOptions = [
|
|
425
|
+
{ key: "open", label: "Drop \u201COpen now\u201D", gainLabel: "+8 kitchens" },
|
|
426
|
+
{ key: "price", label: "Drop \u201CMid-range\u201D", gainLabel: "+7 kitchens" },
|
|
427
|
+
{ key: "veg", label: "Drop \u201CVegetarian\u201D", gainLabel: "+2 kitchens" }
|
|
428
|
+
];
|
|
429
|
+
var mockIndexEntries = [
|
|
430
|
+
["Breakfast & brunch", 314],
|
|
431
|
+
["Romanian", 299],
|
|
432
|
+
["Bakery", 250],
|
|
433
|
+
["Italian", 247],
|
|
434
|
+
["Pizza", 245],
|
|
435
|
+
["Fast food", 229],
|
|
436
|
+
["Vegetarian", 172],
|
|
437
|
+
["American", 153],
|
|
438
|
+
["Vegan", 108],
|
|
439
|
+
["Mediterranean", 78],
|
|
440
|
+
["Seafood", 77],
|
|
441
|
+
["Eastern European", 67],
|
|
442
|
+
["Fusion", 61],
|
|
443
|
+
["Middle Eastern", 58],
|
|
444
|
+
["BBQ", 57],
|
|
445
|
+
["Deli", 51],
|
|
446
|
+
["Steakhouse", 49],
|
|
447
|
+
["Japanese", 34],
|
|
448
|
+
["French", 26],
|
|
449
|
+
["Sushi", 23],
|
|
450
|
+
["Turkish", 22],
|
|
451
|
+
["Chinese", 14],
|
|
452
|
+
["Greek", 12],
|
|
453
|
+
["Indian", 11],
|
|
454
|
+
["Thai", 7],
|
|
455
|
+
["German", 5],
|
|
456
|
+
["Lebanese", 3],
|
|
457
|
+
["Portuguese", 1]
|
|
458
|
+
].map(([name, count], index) => ({
|
|
459
|
+
slug: String(name).toLowerCase().replace(/[^a-z]+/g, "-"),
|
|
460
|
+
name: String(name),
|
|
461
|
+
count: Number(count),
|
|
462
|
+
href: `/menu/cuisines/${String(name).toLowerCase().replace(/[^a-z]+/g, "-")}`,
|
|
463
|
+
gradient: Object.values(mockGradients)[index % 5]
|
|
464
|
+
}));
|
|
465
|
+
var mockFamilyBlock = {
|
|
466
|
+
slug: "italian",
|
|
467
|
+
name: "Italian",
|
|
468
|
+
venueCount: 247,
|
|
469
|
+
chips: [
|
|
470
|
+
{ slug: "pizza", label: "Pizza", count: 120 },
|
|
471
|
+
{ slug: "pasta", label: "Pasta", count: 96 },
|
|
472
|
+
{ slug: "salad", label: "Salad", count: 88 }
|
|
473
|
+
],
|
|
474
|
+
priceBandLabel: "22\u201386 lei",
|
|
475
|
+
photoUrls: [],
|
|
476
|
+
// Three, as the cuisines index sends, and stripped the same way: no dish and
|
|
477
|
+
// no price. The dish column is ~110px inside this card, which truncates the
|
|
478
|
+
// name and wraps its kicker to three lines; the price is already the band
|
|
479
|
+
// above.
|
|
480
|
+
venues: mockKitchens.slice(0, 3).map((kitchen) => __spreadProps(__spreadValues({}, kitchen), { dish: void 0, priceLabel: void 0 })),
|
|
481
|
+
href: "/menu/cuisines/italian"
|
|
482
|
+
};
|
|
483
|
+
var mockBareFamilyBlock = {
|
|
484
|
+
slug: "portuguese",
|
|
485
|
+
name: "Portuguese",
|
|
486
|
+
venueCount: 1,
|
|
487
|
+
href: "/menu/cuisines/portuguese"
|
|
488
|
+
};
|
|
489
|
+
var mockQa = [
|
|
490
|
+
{
|
|
491
|
+
question: "Which Italian kitchen is best in Cluj?",
|
|
492
|
+
answer: "Salt & Stone is named most often \u2014 seventeen reviews single out the truffle tagliatelle. The Copper Yard is second on volume and about eight lei cheaper across the menu."
|
|
493
|
+
},
|
|
494
|
+
{
|
|
495
|
+
question: "What does an Italian main cost?",
|
|
496
|
+
answer: "Pasta runs 38 to 84 lei and pizza 30 to 68 across these kitchens. Ninety-six of them sit in the mid-range price band."
|
|
497
|
+
},
|
|
498
|
+
{
|
|
499
|
+
question: "Anywhere open late?",
|
|
500
|
+
answer: "Four keep the kitchen going past midnight \u2014 The Copper Yard until 00:00 is the latest of the Italian rooms."
|
|
501
|
+
}
|
|
502
|
+
];
|
|
503
|
+
|
|
504
|
+
export { mockBareFamilyBlock, mockConcept, mockDrinkFamily, mockFamily, mockFamilyBlock, mockFilterChips, mockFormatters, mockGradients, mockHubLabels, mockIndexEntries, mockIntentFigures, mockIntentTiles, mockItems, mockKitchens, mockLoosenOptions, mockMatchedKitchens, mockPlaces, mockQa, mockVenues };
|