@bearmenu/ui 0.8.9 → 0.8.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/dist/chunk-24RFI4RQ.js +167 -0
  2. package/dist/{chunk-UKBNQO6Q.js → chunk-2CXU5WZO.js} +1 -1
  3. package/dist/chunk-2XCZJWTV.js +121 -0
  4. package/dist/{chunk-62ES6N32.js → chunk-43RC7MHY.js} +1 -1
  5. package/dist/chunk-5RWTOT5Y.js +72 -0
  6. package/dist/{chunk-Q6QH52LJ.js → chunk-6TEEY5YA.js} +2 -2
  7. package/dist/{chunk-AXV5O2IZ.js → chunk-AKQ57NXY.js} +3 -3
  8. package/dist/chunk-CLLY6XB3.js +41 -0
  9. package/dist/chunk-DTXNDLSE.js +125 -0
  10. package/dist/chunk-F6FMZJDG.js +113 -0
  11. package/dist/{chunk-2WDJR6K7.js → chunk-G7IFL4Z4.js} +4 -1
  12. package/dist/chunk-H3ZZDX5L.js +61 -0
  13. package/dist/{chunk-H3BV4VAG.js → chunk-JS3EINZD.js} +2 -2
  14. package/dist/chunk-MZL7CGCL.js +109 -0
  15. package/dist/{chunk-TH6W2PWG.js → chunk-UDTG3RSE.js} +1 -1
  16. package/dist/chunk-WCTHZKU7.js +37 -0
  17. package/dist/{chunk-TT3WFS6S.js → chunk-YOKHBAIH.js} +11 -11
  18. package/dist/components/alert-dialog.js +1 -1
  19. package/dist/components/alert.d.ts +2 -2
  20. package/dist/components/avatar.d.ts +3 -3
  21. package/dist/components/badge.d.ts +1 -1
  22. package/dist/components/badge.js +1 -1
  23. package/dist/components/button.d.ts +2 -2
  24. package/dist/components/button.js +1 -1
  25. package/dist/components/calendar.js +1 -1
  26. package/dist/components/card.d.ts +4 -4
  27. package/dist/components/carousel.js +1 -1
  28. package/dist/components/combobox.js +1 -1
  29. package/dist/components/command.d.ts +2 -2
  30. package/dist/components/concept-compare-rail.d.ts +50 -0
  31. package/dist/components/concept-compare-rail.js +5 -0
  32. package/dist/components/concept-compare.d.ts +75 -38
  33. package/dist/components/concept-compare.js +209 -133
  34. package/dist/components/concept-convergence.d.ts +41 -0
  35. package/dist/components/concept-convergence.js +53 -0
  36. package/dist/components/convergence.d.ts +25 -0
  37. package/dist/components/convergence.js +4 -0
  38. package/dist/components/dialog.d.ts +2 -2
  39. package/dist/components/empty-state.js +1 -1
  40. package/dist/components/event-card.js +1 -1
  41. package/dist/components/event-compact-row.js +1 -1
  42. package/dist/components/event-detail-panel.js +2 -2
  43. package/dist/components/event-index-row.js +1 -1
  44. package/dist/components/event-list-row-wide.js +2 -2
  45. package/dist/components/event-list-row.js +2 -2
  46. package/dist/components/explainer-steps.d.ts +34 -0
  47. package/dist/components/explainer-steps.js +36 -0
  48. package/dist/components/filter-category-row.js +1 -1
  49. package/dist/components/glass-ground.d.ts +61 -0
  50. package/dist/components/glass-ground.js +3 -0
  51. package/dist/components/haptic-button.js +1 -1
  52. package/dist/components/hub-surface.js +11 -1
  53. package/dist/components/hue-chip.d.ts +70 -0
  54. package/dist/components/hue-chip.js +3 -0
  55. package/dist/components/input-group.d.ts +2 -2
  56. package/dist/components/input.d.ts +1 -1
  57. package/dist/components/item.d.ts +4 -4
  58. package/dist/components/kbd.d.ts +2 -2
  59. package/dist/components/kitchen-dossier.d.ts +88 -0
  60. package/dist/components/kitchen-dossier.js +186 -0
  61. package/dist/components/link-button.js +1 -1
  62. package/dist/components/menu-dead-end.d.ts +56 -0
  63. package/dist/components/menu-dead-end.js +49 -0
  64. package/dist/components/menu-family-block.d.ts +98 -0
  65. package/dist/components/menu-family-block.js +153 -0
  66. package/dist/components/menu-family-card.d.ts +33 -27
  67. package/dist/components/menu-family-card.js +41 -85
  68. package/dist/components/menu-field.js +92 -2
  69. package/dist/components/menu-filter-chips.d.ts +86 -0
  70. package/dist/components/menu-filter-chips.js +122 -0
  71. package/dist/components/menu-group-rows.d.ts +53 -0
  72. package/dist/components/menu-group-rows.js +67 -0
  73. package/dist/components/menu-hub-hero.js +10 -5
  74. package/dist/components/menu-index-header.d.ts +37 -0
  75. package/dist/components/menu-index-header.js +68 -0
  76. package/dist/components/menu-index-list.d.ts +48 -0
  77. package/dist/components/menu-index-list.js +96 -0
  78. package/dist/components/menu-intent-hero.d.ts +69 -0
  79. package/dist/components/menu-intent-hero.js +87 -0
  80. package/dist/components/menu-item.js +3 -3
  81. package/dist/components/menu-kitchen-list.d.ts +82 -0
  82. package/dist/components/menu-kitchen-list.js +5 -0
  83. package/dist/components/menu-mocks.d.ts +37 -2
  84. package/dist/components/menu-mocks.js +152 -27
  85. package/dist/components/menu-types.d.ts +182 -6
  86. package/dist/components/motion-icon-controls.js +2 -2
  87. package/dist/components/motion-icon-set.js +6 -6
  88. package/dist/components/motion-icon.d.ts +22 -1
  89. package/dist/components/motion-icon.js +1 -1
  90. package/dist/components/multi-select-combobox.js +2 -2
  91. package/dist/components/native-select.d.ts +2 -2
  92. package/dist/components/pagination.js +1 -1
  93. package/dist/components/photo-ground.d.ts +64 -0
  94. package/dist/components/photo-ground.js +3 -0
  95. package/dist/components/place-about-tab.js +2 -2
  96. package/dist/components/place-details-mobile.js +3 -3
  97. package/dist/components/place-types.d.ts +2 -2
  98. package/dist/components/qa-block.d.ts +36 -0
  99. package/dist/components/qa-block.js +24 -0
  100. package/dist/components/scroll-fade.js +3 -121
  101. package/dist/components/searchable-select.js +1 -1
  102. package/dist/components/select.d.ts +1 -1
  103. package/dist/components/signature-chip.d.ts +2 -2
  104. package/dist/components/signature-chip.js +2 -2
  105. package/dist/components/sliding-panels.js +1 -1
  106. package/dist/components/snap-rail.d.ts +26 -3
  107. package/dist/components/snap-rail.js +3 -109
  108. package/dist/components/spinner.d.ts +4 -4
  109. package/dist/components/story.d.ts +34 -0
  110. package/dist/components/story.js +3 -0
  111. package/dist/components/tag.d.ts +4 -4
  112. package/dist/components/text.d.ts +5 -5
  113. package/dist/components/toggle.d.ts +1 -1
  114. package/dist/components/top-comparison.d.ts +28 -0
  115. package/dist/components/top-comparison.js +76 -0
  116. package/dist/components/top-cross-link.d.ts +34 -0
  117. package/dist/components/top-cross-link.js +101 -0
  118. package/dist/components/top-ranking-entry.d.ts +53 -0
  119. package/dist/components/top-ranking-entry.js +217 -0
  120. package/dist/components/top-ranking-hero.d.ts +61 -0
  121. package/dist/components/top-ranking-hero.js +99 -0
  122. package/dist/components/top-ranking-legend.d.ts +69 -0
  123. package/dist/components/top-ranking-legend.js +124 -0
  124. package/dist/components/top-types.d.ts +109 -0
  125. package/dist/components/top-types.js +1 -0
  126. package/dist/components/venue-grade-dimensions.d.ts +3 -1
  127. package/dist/components/venue-grade-dimensions.js +1 -1
  128. package/dist/components/venue-quotes.d.ts +1 -1
  129. package/dist/components/venue-quotes.js +1 -1
  130. package/dist/components/venue-wall.js +5 -3
  131. package/dist/components/weekday-theme-banner.js +1 -1
  132. package/dist/components/weekend-panel.js +2 -2
  133. package/package.json +1 -1
  134. package/src/components/badge.tsx +1 -1
  135. package/src/components/button.tsx +2 -2
  136. package/src/components/concept-compare-rail.tsx +132 -0
  137. package/src/components/concept-compare.stories.tsx +122 -54
  138. package/src/components/concept-compare.tsx +368 -196
  139. package/src/components/concept-convergence.stories.tsx +53 -0
  140. package/src/components/concept-convergence.tsx +90 -0
  141. package/src/components/convergence.stories.tsx +54 -0
  142. package/src/components/convergence.tsx +177 -0
  143. package/src/components/explainer-steps.stories.tsx +46 -0
  144. package/src/components/explainer-steps.tsx +74 -0
  145. package/src/components/glass-ground.tsx +104 -0
  146. package/src/components/hub-surface.tsx +11 -1
  147. package/src/components/hue-chip.stories.tsx +76 -0
  148. package/src/components/hue-chip.test.tsx +62 -0
  149. package/src/components/hue-chip.tsx +99 -0
  150. package/src/components/kitchen-dossier.stories.tsx +108 -0
  151. package/src/components/kitchen-dossier.tsx +321 -0
  152. package/src/components/menu-dead-end.stories.tsx +67 -0
  153. package/src/components/menu-dead-end.tsx +127 -0
  154. package/src/components/menu-family-block.stories.tsx +91 -0
  155. package/src/components/menu-family-block.tsx +303 -0
  156. package/src/components/menu-family-card.stories.tsx +43 -35
  157. package/src/components/menu-family-card.tsx +115 -142
  158. package/src/components/menu-filter-chips.stories.tsx +107 -0
  159. package/src/components/menu-filter-chips.tsx +238 -0
  160. package/src/components/menu-group-rows.stories.tsx +54 -0
  161. package/src/components/menu-group-rows.tsx +133 -0
  162. package/src/components/menu-hub-hero.test.tsx +39 -0
  163. package/src/components/menu-hub-hero.tsx +17 -5
  164. package/src/components/menu-index-header.stories.tsx +72 -0
  165. package/src/components/menu-index-header.tsx +125 -0
  166. package/src/components/menu-index-list.stories.tsx +50 -0
  167. package/src/components/menu-index-list.tsx +149 -0
  168. package/src/components/menu-intent-hero.stories.tsx +67 -0
  169. package/src/components/menu-intent-hero.tsx +189 -0
  170. package/src/components/menu-kitchen-list.stories.tsx +67 -0
  171. package/src/components/menu-kitchen-list.test.tsx +78 -0
  172. package/src/components/menu-kitchen-list.tsx +284 -0
  173. package/src/components/menu-mocks.ts +198 -23
  174. package/src/components/menu-types.ts +189 -6
  175. package/src/components/motion-icon-controls.tsx +11 -11
  176. package/src/components/motion-icon-set.tsx +6 -5
  177. package/src/components/motion-icon.test.tsx +23 -1
  178. package/src/components/motion-icon.tsx +20 -0
  179. package/src/components/photo-ground.tsx +147 -0
  180. package/src/components/place-types.ts +2 -2
  181. package/src/components/qa-block.stories.tsx +43 -0
  182. package/src/components/qa-block.tsx +60 -0
  183. package/src/components/signature-chip.tsx +3 -3
  184. package/src/components/snap-rail.tsx +58 -15
  185. package/src/components/story.tsx +225 -0
  186. package/src/components/top-comparison.stories.tsx +78 -0
  187. package/src/components/top-comparison.tsx +151 -0
  188. package/src/components/top-cross-link.stories.tsx +84 -0
  189. package/src/components/top-cross-link.tsx +171 -0
  190. package/src/components/top-ranking-entry.stories.tsx +171 -0
  191. package/src/components/top-ranking-entry.test.tsx +105 -0
  192. package/src/components/top-ranking-entry.tsx +425 -0
  193. package/src/components/top-ranking-hero.stories.tsx +76 -0
  194. package/src/components/top-ranking-hero.tsx +218 -0
  195. package/src/components/top-ranking-legend.stories.tsx +78 -0
  196. package/src/components/top-ranking-legend.tsx +239 -0
  197. package/src/components/top-types.ts +110 -0
  198. package/src/components/venue-grade-dimensions.tsx +2 -2
  199. package/src/components/venue-quotes.stories.tsx +1 -1
  200. package/src/components/venue-quotes.tsx +4 -2
  201. package/src/components/venue-wall.tsx +9 -4
  202. package/src/components/weekday-theme-banner.tsx +1 -1
  203. package/dist/chunk-THOVPZNN.js +0 -37
  204. package/dist/chunk-YS6BHKZO.js +0 -92
  205. package/dist/components/ranked-venue-list.d.ts +0 -49
  206. package/dist/components/ranked-venue-list.js +0 -87
  207. package/dist/components/signature-line-list.d.ts +0 -45
  208. package/dist/components/signature-line-list.js +0 -99
  209. package/dist/components/venue-busyness-strip.d.ts +0 -35
  210. package/dist/components/venue-busyness-strip.js +0 -37
  211. package/dist/components/venue-signature-block.d.ts +0 -39
  212. package/dist/components/venue-signature-block.js +0 -6
  213. package/dist/components/venue-spotlight.d.ts +0 -74
  214. package/dist/components/venue-spotlight.js +0 -138
  215. package/src/components/ranked-venue-list.stories.tsx +0 -80
  216. package/src/components/ranked-venue-list.tsx +0 -177
  217. package/src/components/signature-line-list.stories.tsx +0 -85
  218. package/src/components/signature-line-list.tsx +0 -136
  219. package/src/components/venue-busyness-strip.stories.tsx +0 -66
  220. package/src/components/venue-busyness-strip.tsx +0 -64
  221. package/src/components/venue-signature-block.stories.tsx +0 -68
  222. package/src/components/venue-signature-block.tsx +0 -71
  223. package/src/components/venue-spotlight.stories.tsx +0 -141
  224. package/src/components/venue-spotlight.tsx +0 -236
  225. package/dist/{chunk-XWMRABZW.js → chunk-HSIYYA2E.js} +1 -1
@@ -0,0 +1,53 @@
1
+ import { PhotoGround } from '../chunk-5RWTOT5Y.js';
2
+ import { Convergence } from '../chunk-MZL7CGCL.js';
3
+ import '../chunk-LEAYBICI.js';
4
+ import { Badge } from '../chunk-2CXU5WZO.js';
5
+ import { cn } from '../chunk-FEK5XGZW.js';
6
+ import '../chunk-3GWWZKX7.js';
7
+ import { jsxs, jsx } from 'react/jsx-runtime';
8
+
9
+ function ConceptConvergence({ aliases, concept, scale, className }) {
10
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-3 text-white", className), children: [
11
+ /* @__PURE__ */ jsx(
12
+ Convergence,
13
+ {
14
+ linesClassName: "text-white/30",
15
+ sources: aliases.map((alias, index) => /* @__PURE__ */ jsxs(
16
+ "span",
17
+ {
18
+ className: "inline-flex h-7 max-w-full items-center gap-1.5 rounded-full bg-white/10 px-2.5 text-[11.5px] text-white",
19
+ children: [
20
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate", children: alias.label }),
21
+ /* @__PURE__ */ jsx("span", { className: "shrink-0 tabular-nums text-white/60", children: alias.price })
22
+ ]
23
+ },
24
+ index
25
+ )),
26
+ target: /* @__PURE__ */ jsxs("span", { className: "relative isolate block aspect-[4/5] w-[112px] overflow-hidden rounded-[16px] shadow-[0_8px_24px_oklch(0_0_0/0.35)]", children: [
27
+ /* @__PURE__ */ jsx(
28
+ PhotoGround,
29
+ {
30
+ className: "-z-10",
31
+ mode: "stack",
32
+ photos: [concept.photoUrl],
33
+ initials: concept.title.charAt(0).toLocaleUpperCase(),
34
+ overlay: true,
35
+ loading: "eager"
36
+ }
37
+ ),
38
+ /* @__PURE__ */ jsx(Badge, { variant: "overlay", className: "absolute left-2 top-2", children: concept.badge }),
39
+ /* @__PURE__ */ jsx("span", { className: "absolute inset-x-2 bottom-2 block text-balance font-serif text-[17px] font-semibold leading-tight tracking-[-0.02em] [text-shadow:0_1px_8px_oklch(0_0_0/0.5)]", children: concept.title })
40
+ ] })
41
+ }
42
+ ),
43
+ scale && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-[11px] tabular-nums text-white/60", children: [
44
+ /* @__PURE__ */ jsx("span", { children: scale[0] }),
45
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "h-px flex-1 bg-white/20" }),
46
+ /* @__PURE__ */ jsx("span", { className: "font-semibold text-white", children: scale[1] }),
47
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "h-px flex-1 bg-white/20" }),
48
+ /* @__PURE__ */ jsx("span", { children: scale[2] })
49
+ ] })
50
+ ] });
51
+ }
52
+
53
+ export { ConceptConvergence };
@@ -0,0 +1,25 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ type ConvergeLinesProps = {
5
+ /** How many sources the lines leave from. */
6
+ count: number;
7
+ /** Draw the curves in, source by source. Off: drawn already. */
8
+ animate?: boolean;
9
+ className?: string;
10
+ };
11
+ declare function ConvergeLines({ count, animate, className }: ConvergeLinesProps): react_jsx_runtime.JSX.Element;
12
+ type ConvergenceProps = {
13
+ /** The many. One node each; the stack fans slightly so it reads as a spread, not a list. */
14
+ sources: ReactNode[];
15
+ /** The one. */
16
+ target: ReactNode;
17
+ /** The entrance choreography. Off for static reuse; the reader's reduced-motion setting is honoured either way. */
18
+ animate?: boolean;
19
+ /** The curves' colour, e.g. `"text-white/30"` on a dark stage. Defaults to the border. */
20
+ linesClassName?: string;
21
+ className?: string;
22
+ };
23
+ declare function Convergence({ sources, target, animate, linesClassName, className, }: ConvergenceProps): react_jsx_runtime.JSX.Element;
24
+
25
+ export { ConvergeLines, type ConvergeLinesProps, Convergence, type ConvergenceProps };
@@ -0,0 +1,4 @@
1
+ export { ConvergeLines, Convergence } from '../chunk-MZL7CGCL.js';
2
+ import '../chunk-LEAYBICI.js';
3
+ import '../chunk-FEK5XGZW.js';
4
+ import '../chunk-3GWWZKX7.js';
@@ -10,11 +10,11 @@ declare const DialogPortal: React.FC<DialogPrimitive.DialogPortalProps>;
10
10
  declare const DialogClose: React.ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
11
11
  declare const DialogOverlay: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
12
12
  declare const dialogContentVariants: (props?: ({
13
- size?: "default" | "sm" | "lg" | "xl" | "full" | null | undefined;
13
+ size?: "sm" | "default" | "lg" | "xl" | "full" | null | undefined;
14
14
  scrollBehavior?: "inside" | "outside" | null | undefined;
15
15
  } & class_variance_authority_types.ClassProp) | undefined) => string;
16
16
  declare const DialogContent: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & VariantProps<(props?: ({
17
- size?: "default" | "sm" | "lg" | "xl" | "full" | null | undefined;
17
+ size?: "sm" | "default" | "lg" | "xl" | "full" | null | undefined;
18
18
  scrollBehavior?: "inside" | "outside" | null | undefined;
19
19
  } & class_variance_authority_types.ClassProp) | undefined) => string> & {
20
20
  showCloseButton?: boolean;
@@ -1,4 +1,4 @@
1
- import { Button } from '../chunk-H3BV4VAG.js';
1
+ import { Button } from '../chunk-JS3EINZD.js';
2
2
  import '../chunk-R47NEOSI.js';
3
3
  import { Text } from '../chunk-7BWTYWM3.js';
4
4
  import { cn } from '../chunk-FEK5XGZW.js';
@@ -1,5 +1,5 @@
1
- import { TagGroup } from '../chunk-6XMYEZVR.js';
2
1
  import { resolveEventEntryFee } from '../chunk-DNSXMHYX.js';
2
+ import { TagGroup } from '../chunk-6XMYEZVR.js';
3
3
  import { Tag } from '../chunk-ZDAHKI3A.js';
4
4
  import { EventPosterFallback } from '../chunk-FDITZ2VM.js';
5
5
  import { Skeleton } from '../chunk-QXHMPJ35.js';
@@ -1,5 +1,5 @@
1
- import { TagGroup } from '../chunk-6XMYEZVR.js';
2
1
  import { resolveEventEntryFee } from '../chunk-DNSXMHYX.js';
2
+ import { TagGroup } from '../chunk-6XMYEZVR.js';
3
3
  import { Tag } from '../chunk-ZDAHKI3A.js';
4
4
  import { EventPosterFallback } from '../chunk-FDITZ2VM.js';
5
5
  import { Skeleton } from '../chunk-QXHMPJ35.js';
@@ -1,8 +1,8 @@
1
- import { Separator } from '../chunk-WSRWFA6K.js';
2
1
  import { resolveEventEntryFee } from '../chunk-DNSXMHYX.js';
2
+ import { Separator } from '../chunk-WSRWFA6K.js';
3
3
  import { EventPosterFallback } from '../chunk-FDITZ2VM.js';
4
4
  import { Skeleton } from '../chunk-QXHMPJ35.js';
5
- import { Button } from '../chunk-H3BV4VAG.js';
5
+ import { Button } from '../chunk-JS3EINZD.js';
6
6
  import '../chunk-R47NEOSI.js';
7
7
  import { cn } from '../chunk-FEK5XGZW.js';
8
8
  import { __spreadProps, __spreadValues, __objRest } from '../chunk-3GWWZKX7.js';
@@ -1,6 +1,6 @@
1
- import { Separator } from '../chunk-WSRWFA6K.js';
2
1
  import { TagGroup } from '../chunk-6XMYEZVR.js';
3
2
  import { Tag } from '../chunk-ZDAHKI3A.js';
3
+ import { Separator } from '../chunk-WSRWFA6K.js';
4
4
  import { EventPosterFallback } from '../chunk-FDITZ2VM.js';
5
5
  import { cn } from '../chunk-FEK5XGZW.js';
6
6
  import { __objRest, __spreadValues } from '../chunk-3GWWZKX7.js';
@@ -1,9 +1,9 @@
1
- import { Separator } from '../chunk-WSRWFA6K.js';
2
1
  import { resolveEventEntryFee } from '../chunk-DNSXMHYX.js';
3
2
  import { Tag } from '../chunk-ZDAHKI3A.js';
3
+ import { Separator } from '../chunk-WSRWFA6K.js';
4
4
  import { EventPosterFallback } from '../chunk-FDITZ2VM.js';
5
5
  import { Skeleton } from '../chunk-QXHMPJ35.js';
6
- import { buttonVariants } from '../chunk-H3BV4VAG.js';
6
+ import { buttonVariants } from '../chunk-JS3EINZD.js';
7
7
  import '../chunk-R47NEOSI.js';
8
8
  import { cn } from '../chunk-FEK5XGZW.js';
9
9
  import { __objRest, __spreadValues } from '../chunk-3GWWZKX7.js';
@@ -1,7 +1,7 @@
1
- import { Separator } from '../chunk-WSRWFA6K.js';
2
- import { TagGroup } from '../chunk-6XMYEZVR.js';
3
1
  import { resolveEventEntryFee } from '../chunk-DNSXMHYX.js';
2
+ import { TagGroup } from '../chunk-6XMYEZVR.js';
4
3
  import { Tag } from '../chunk-ZDAHKI3A.js';
4
+ import { Separator } from '../chunk-WSRWFA6K.js';
5
5
  import { EventPosterFallback } from '../chunk-FDITZ2VM.js';
6
6
  import { Skeleton } from '../chunk-QXHMPJ35.js';
7
7
  import { cn } from '../chunk-FEK5XGZW.js';
@@ -0,0 +1,34 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ /**
5
+ * ExplainerSteps — how something works, as numbered rules a reader can scan.
6
+ *
7
+ * Each step is a numeral in a ring, one line of prose, and the live figure
8
+ * that proves the line, right-aligned with its unit. A thread runs from one
9
+ * numeral to the next so the three read as a sequence, and the last numeral
10
+ * is filled: the rules end where the reader is asked to do something.
11
+ *
12
+ * A step without a figure shows none — an invented number in the column is
13
+ * worse than an empty one. But a list where no step has a figure should be
14
+ * prose, not steps.
15
+ *
16
+ * Server-safe. Data in, not children: a server component composes these from
17
+ * translated strings and numbers, and an array is easier to number than a
18
+ * child list is to clone.
19
+ */
20
+ type ExplainerStepItem = {
21
+ /** One line. Two at most on a phone; a third is a paragraph and belongs elsewhere. */
22
+ text: ReactNode;
23
+ /** The live figure, pre-formatted. */
24
+ figure?: string;
25
+ /** A unit or caption beside the figure, e.g. "names". */
26
+ unit?: string;
27
+ };
28
+ type ExplainerStepsProps = {
29
+ steps: ExplainerStepItem[];
30
+ className?: string;
31
+ };
32
+ declare function ExplainerSteps({ steps, className }: ExplainerStepsProps): react_jsx_runtime.JSX.Element;
33
+
34
+ export { type ExplainerStepItem, ExplainerSteps, type ExplainerStepsProps };
@@ -0,0 +1,36 @@
1
+ import { cn } from '../chunk-FEK5XGZW.js';
2
+ import '../chunk-3GWWZKX7.js';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+
5
+ function ExplainerSteps({ steps, className }) {
6
+ return /* @__PURE__ */ jsx("ol", { className: cn("flex flex-col", className), children: steps.map((step, index) => {
7
+ const isLast = index === steps.length - 1;
8
+ return /* @__PURE__ */ jsxs("li", { className: "relative flex gap-3.5 pb-5 last:pb-0", children: [
9
+ !isLast && /* @__PURE__ */ jsx(
10
+ "span",
11
+ {
12
+ "aria-hidden": true,
13
+ className: "absolute bottom-0 left-[11px] top-7 w-px bg-border"
14
+ }
15
+ ),
16
+ /* @__PURE__ */ jsx(
17
+ "span",
18
+ {
19
+ "aria-hidden": true,
20
+ className: cn(
21
+ "relative flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-[11px] font-bold tabular-nums",
22
+ isLast ? "bg-primary text-primary-foreground" : "border border-border bg-background text-muted-foreground"
23
+ ),
24
+ children: index + 1
25
+ }
26
+ ),
27
+ /* @__PURE__ */ jsx("p", { className: "min-w-0 flex-1 pt-0.5 text-[14px] leading-[1.45] text-foreground", children: step.text }),
28
+ step.figure && /* @__PURE__ */ jsxs("span", { className: "shrink-0 pt-0.5 text-right text-[15px] font-bold leading-[1.45] tabular-nums text-foreground", children: [
29
+ step.figure,
30
+ step.unit && /* @__PURE__ */ jsx("span", { className: "ml-1 text-[11px] font-normal text-muted-foreground", children: step.unit })
31
+ ] })
32
+ ] }, index);
33
+ }) });
34
+ }
35
+
36
+ export { ExplainerSteps };
@@ -1,5 +1,5 @@
1
1
  import { Text } from '../chunk-7BWTYWM3.js';
2
- import { Badge } from '../chunk-UKBNQO6Q.js';
2
+ import { Badge } from '../chunk-2CXU5WZO.js';
3
3
  import '../chunk-FEK5XGZW.js';
4
4
  import '../chunk-3GWWZKX7.js';
5
5
  import { ChevronRight } from 'lucide-react';
@@ -0,0 +1,61 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ /**
4
+ * GlassGround — an inked caption rising out of one edge of a photograph.
5
+ *
6
+ * One layer over a `PhotoGround`: an ink gradient running in one direction —
7
+ * absent where the photograph is the subject, solid where the type is.
8
+ * `MenuFamilyBlock` drew this first; this is the same idea with the stops as
9
+ * data, so a card can say "clear for 128px, then ink" without a sixth copy of
10
+ * the gradient string.
11
+ *
12
+ * ## Why there is no blur any more
13
+ *
14
+ * This used to be two masked `backdrop-blur`s under the ink — a progressive
15
+ * frost. Measured on `/menu` in production (2026-09-14): the page carried 73
16
+ * backdrop-filter composited layers, six dossiers' worth of these among them,
17
+ * and the main thread spent 9 ms per scrolled frame re-layerising them
18
+ * (2.7 s over a six-second fling; 56 ms with backdrop-filter disabled). A
19
+ * frost is not worth a page that cannot scroll on a phone, so the caption
20
+ * rests on the ink alone, eased through five stops so the ramp has no crease.
21
+ * See `docs/audits/audit-menu-page-performance-2026-09-14.md` in the app.
22
+ *
23
+ * ## Why the stops are custom properties
24
+ *
25
+ * Tailwind emits only the classes it can read verbatim, so the gradient
26
+ * cannot be assembled from props into a class. The class below is literal and
27
+ * reads `--glass-*` variables; the component writes those inline, having
28
+ * interpolated the quarter stops in JS (`clear` and `full` must share a
29
+ * unit). Same mechanism as `HueChip`'s hue. The ink's colour is the
30
+ * package's one scrim literal, `oklch(0.16 0.012 55)`, never `var(--scrim)`.
31
+ *
32
+ * ## The ramp ends where the type begins
33
+ *
34
+ * `clear` is where the ink starts, `full` where it is solid. Set `full` to
35
+ * the exact seam the content starts at — a ramp that runs past the seam puts
36
+ * the first row of type on half-ink.
37
+ */
38
+ type GlassStops = {
39
+ /** Which way the ink runs — toward the type. */
40
+ direction: "to bottom" | "to right";
41
+ /** Where the ink begins, e.g. `"0px"` or `"24%"`. */
42
+ clear: string;
43
+ /** Where the ink is solid — the seam the content starts at. Same unit as `clear`. */
44
+ full: string;
45
+ };
46
+ type GlassGroundProps = {
47
+ stops: GlassStops;
48
+ /** Stops from `lg`. Omit to keep the same ramp at every width. */
49
+ lgStops?: GlassStops;
50
+ /**
51
+ * How dark the ink gets at the far edge, 0–1. `0.96` is a caption the
52
+ * photograph is only a texture under; `0.6` is a photograph the caption is
53
+ * drawn on — the type is lifted, the room stays a room.
54
+ */
55
+ peak?: number;
56
+ /** Placement only. The ink is a `bg-*` on this same element, so a background here would replace it. */
57
+ className?: string;
58
+ };
59
+ declare function GlassGround({ stops, lgStops, peak, className }: GlassGroundProps): react_jsx_runtime.JSX.Element;
60
+
61
+ export { GlassGround, type GlassGroundProps, type GlassStops };
@@ -0,0 +1,3 @@
1
+ export { GlassGround } from '../chunk-WCTHZKU7.js';
2
+ import '../chunk-FEK5XGZW.js';
3
+ import '../chunk-3GWWZKX7.js';
@@ -1,4 +1,4 @@
1
- import { Button } from '../chunk-H3BV4VAG.js';
1
+ import { Button } from '../chunk-JS3EINZD.js';
2
2
  import { useHaptic } from '../chunk-R47NEOSI.js';
3
3
  import '../chunk-FEK5XGZW.js';
4
4
  import { __objRest, __spreadProps, __spreadValues } from '../chunk-3GWWZKX7.js';
@@ -9,7 +9,17 @@ function HubSurface({ flush, className, children }) {
9
9
  className: cn(
10
10
  "rounded-[18px] border border-border bg-card shadow-none",
11
11
  flush ? "overflow-hidden" : "px-3.5 py-4",
12
- "lg:overflow-visible lg:rounded-none lg:bg-transparent lg:p-0 lg:shadow-none",
12
+ /*
13
+ * `lg:border-0` is load-bearing and was missing.
14
+ *
15
+ * Above `lg` this surface stops being a card — the background, the
16
+ * radius, the padding and the shadow are all dropped so the section
17
+ * sits on the page. The border was not, so every section on every
18
+ * desktop page kept a 1px rectangle around content that no longer had
19
+ * a card behind it. A caller that genuinely wants an edge at desktop
20
+ * adds `lg:border` in `className`, which lands after this in `cn`.
21
+ */
22
+ "lg:overflow-visible lg:rounded-none lg:border-0 lg:bg-transparent lg:p-0 lg:shadow-none",
13
23
  className
14
24
  ),
15
25
  children
@@ -0,0 +1,70 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ /**
4
+ * HueChip — a pill that wears a category's colour as a pale wash.
5
+ *
6
+ * Menu surfaces label things with a family's hue: a cuisine's dish groups, a
7
+ * going-out family's tags, a price band. Every one of them was an inline
8
+ * `style` with a hand-written `color-mix` next to a hand-written pill class
9
+ * list, which is how the two below drifted apart and how the mix space bug
10
+ * survived as long as it did — it had to be found and fixed in each copy.
11
+ *
12
+ * ## The mix space is the whole reason this is a component
13
+ *
14
+ * **`in oklab`, and never `in oklch`.** They describe the same colours, but
15
+ * oklch is POLAR, so `color-mix(in oklch, …)` interpolates the hue ANGLE — and
16
+ * the paper being mixed into is achromatic (`--card` is `oklch(1 0 0)`, hue 0).
17
+ * Mixing 20% of a family colour into that lands at a fifth of the family's hue:
18
+ * honey 82° came out at 16°, which is pink, so a Breakfast & Brunch card wore
19
+ * pink chips under an amber mosaic. Cool families were worse — a bar's 205°
20
+ * blue mixes to 41°, orange; a club's 300° violet to 60°, mustard.
21
+ *
22
+ * oklab is rectangular: mixing toward an achromatic base scales chroma along
23
+ * the SAME hue instead of rotating it, which is what "a pale version of this
24
+ * colour" has to mean.
25
+ *
26
+ * ## Why an inline style and not a Tailwind class
27
+ *
28
+ * The hue is DATA — one of ~40 cuisine values resolved by the app at request
29
+ * time — not one of a fixed set of variants. Tailwind can only emit classes it
30
+ * can see at build time, so a class-based version would mean either a
31
+ * safelisted colour per cuisine (a palette that must be edited to add a
32
+ * cuisine) or an arbitrary-value class built from a runtime string, which
33
+ * Tailwind cannot compile. A CSS custom property set inline is the honest
34
+ * mechanism; this component is the one place that writes it.
35
+ */
36
+ /** Mix strengths, so callers say what a chip IS rather than picking a number. */
37
+ declare const STRENGTH: {
38
+ /** A labelled facet: readable at 11.5px, still clearly the family's colour. */
39
+ readonly chip: 20;
40
+ /** A quieter wash, for a chip that sits beside a stronger one. */
41
+ readonly subtle: 12;
42
+ };
43
+ type HueChipTone = keyof typeof STRENGTH;
44
+ /**
45
+ * The tint itself, exported for the surfaces that need the colour rather than
46
+ * the pill — a section ground, a hover state. Same rule: `in oklab`.
47
+ */
48
+ declare function hueTint(hue: string, tone?: HueChipTone, base?: string): string;
49
+ type HueChipProps = {
50
+ /**
51
+ * A finished CSS colour — the DS owns no category table, so the app resolves
52
+ * it. Without one the chip falls back to `--muted`, which is the right
53
+ * neutral for a facet that has no family behind it.
54
+ */
55
+ hue?: string;
56
+ tone?: HueChipTone;
57
+ /** The paper the wash is mixed into. Must be the surface the chip sits on. */
58
+ base?: string;
59
+ /** Drawn before the label, e.g. a wallet on a price band. */
60
+ icon?: React.ReactNode;
61
+ /** `li` inside a list, which is where most of these live. */
62
+ as?: "span" | "li" | "div";
63
+ children: React.ReactNode;
64
+ className?: string;
65
+ /** For a chip whose visible text is a bare figure, e.g. "22–86 lei". */
66
+ "aria-label"?: string;
67
+ };
68
+ declare function HueChip({ hue, tone, base, icon, as: Tag, children, className, "aria-label": ariaLabel, }: HueChipProps): react_jsx_runtime.JSX.Element;
69
+
70
+ export { HueChip, type HueChipProps, type HueChipTone, hueTint };
@@ -0,0 +1,3 @@
1
+ export { HueChip, hueTint } from '../chunk-CLLY6XB3.js';
2
+ import '../chunk-FEK5XGZW.js';
3
+ import '../chunk-3GWWZKX7.js';
@@ -3,11 +3,11 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const inputGroupVariants: (props?: ({
6
- size?: "default" | "sm" | "lg" | null | undefined;
6
+ size?: "sm" | "default" | "lg" | null | undefined;
7
7
  shape?: "rounded" | "pill" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  declare const InputGroup: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
10
- size?: "default" | "sm" | "lg" | null | undefined;
10
+ size?: "sm" | "default" | "lg" | null | undefined;
11
11
  shape?: "rounded" | "pill" | null | undefined;
12
12
  } & class_variance_authority_types.ClassProp) | undefined) => string> & React.RefAttributes<HTMLDivElement>>;
13
13
  declare const InputGroupInput: React.ForwardRefExoticComponent<React.InputHTMLAttributes<HTMLInputElement> & React.RefAttributes<HTMLInputElement>>;
@@ -3,7 +3,7 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const inputVariants: (props?: ({
6
- size?: "default" | "sm" | "lg" | null | undefined;
6
+ size?: "sm" | "default" | "lg" | null | undefined;
7
7
  shape?: "rounded" | "pill" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "size">, VariantProps<typeof inputVariants> {
@@ -3,13 +3,13 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const itemVariants: (props?: ({
6
- variant?: "default" | "outline" | "muted" | null | undefined;
7
- size?: "default" | "sm" | "lg" | null | undefined;
6
+ variant?: "default" | "muted" | "outline" | null | undefined;
7
+ size?: "sm" | "default" | "lg" | null | undefined;
8
8
  interactive?: boolean | null | undefined;
9
9
  } & class_variance_authority_types.ClassProp) | undefined) => string;
10
10
  declare const Item: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
11
- variant?: "default" | "outline" | "muted" | null | undefined;
12
- size?: "default" | "sm" | "lg" | null | undefined;
11
+ variant?: "default" | "muted" | "outline" | null | undefined;
12
+ size?: "sm" | "default" | "lg" | null | undefined;
13
13
  interactive?: boolean | null | undefined;
14
14
  } & class_variance_authority_types.ClassProp) | undefined) => string> & {
15
15
  asChild?: boolean;
@@ -3,10 +3,10 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const kbdVariants: (props?: ({
6
- size?: "default" | "sm" | "lg" | null | undefined;
6
+ size?: "sm" | "default" | "lg" | null | undefined;
7
7
  } & class_variance_authority_types.ClassProp) | undefined) => string;
8
8
  declare const Kbd: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLElement> & VariantProps<(props?: ({
9
- size?: "default" | "sm" | "lg" | null | undefined;
9
+ size?: "sm" | "default" | "lg" | null | undefined;
10
10
  } & class_variance_authority_types.ClassProp) | undefined) => string> & React.RefAttributes<HTMLElement>>;
11
11
  declare const KbdGroup: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLSpanElement> & React.RefAttributes<HTMLSpanElement>>;
12
12
 
@@ -0,0 +1,88 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+ import { MenuVenueSignature, MenuLinkComponent, MenuLinkProps } from './menu-types.js';
4
+ import { PlacePreview, CitedText, PlaceGradeDimensions } from './place-types.js';
5
+ import { VenueGradeDimensionKey } from './venue-grade-dimensions.js';
6
+
7
+ /**
8
+ * KitchenDossier — one kitchen, told as a story on its own photograph.
9
+ *
10
+ * The hub used to say this three times: a spotlight with everything the
11
+ * digest knows, a ranked row with a grade, a card with the signature dish —
12
+ * and the same kitchen led all three. This is the one card: the venue's
13
+ * photograph clear at the top, an inked caption rising from the foot with
14
+ * the identity (rating, name, type · area · reviews), and under it a PANEL
15
+ * that says the three or four things the reviews established one at a time —
16
+ * the dish it is known for, what people say, the grade — with segments at the
17
+ * top edge showing which is up. The story runs on its own while the card is
18
+ * in view; a tap advances.
19
+ *
20
+ * ## A photograph with a caption, not a dark card
21
+ *
22
+ * `ConceptCompare` is a dark card with a photograph showing through two glass
23
+ * bands. This is the reverse — the room is the subject and the facts are its
24
+ * caption — which is `GlassGround` at its lightest and smallest: anchored to
25
+ * the CAPTION, not the card, so it covers the identity, the panel and the
26
+ * action plus a short lead above them and nothing else; ink that never
27
+ * passes 0.6; a text shadow under the identity doing the rest. Everything
28
+ * above the caption is the photograph, untouched. The panel is a translucent
29
+ * ink pane (no backdrop blur — see `GlassGround` for the measurement that
30
+ * removed it), so its rule reads as a panel and not a hole. The same layout
31
+ * at every width; the desktop card is wider, not turned on its side.
32
+ *
33
+ * ## Two targets, and everything else is "next"
34
+ *
35
+ * The name and the action open the venue; the dish name in the first part
36
+ * opens the item. A tap anywhere else on the card advances the story.
37
+ */
38
+ /** @deprecated Alias of `MenuLinkProps`; kept for symmetry with the other menu surfaces. */
39
+ type KitchenDossierLinkProps = MenuLinkProps;
40
+ type KitchenDossierLabels = {
41
+ /** Kickers over the three parts. */
42
+ knownFor: string;
43
+ whatPeopleSay: string;
44
+ theGrade: string;
45
+ /** Currency beside the price, e.g. "lei". */
46
+ currency: string;
47
+ /** Beside the mention count, e.g. "4 name it". */
48
+ mentions: (count: number) => string;
49
+ /** "427 reviews", composed by the caller. */
50
+ reviewCount?: string;
51
+ /** "Open until 22:00", composed by the caller. Omit when closed or unknown. */
52
+ openUntil?: string;
53
+ /** Accessible name per segment, e.g. "Part 2 of 3". */
54
+ part: (index: number, count: number) => string;
55
+ /** Accessible name of the tap-to-advance. */
56
+ next: string;
57
+ /** Dimension key → translated label. */
58
+ dimensions: Partial<Record<VenueGradeDimensionKey, string>>;
59
+ };
60
+ type KitchenDossierProps = {
61
+ place: PlacePreview;
62
+ /** The venue's destination. */
63
+ href: string;
64
+ /** "Restaurant · Centru", composed by the caller. */
65
+ meta?: string;
66
+ /** Part one. */
67
+ signature?: MenuVenueSignature;
68
+ /** Part two — the digest's highlights; two are shown. */
69
+ quotes?: CitedText[];
70
+ /** Part three — the grade, with the overall already formatted. */
71
+ grade?: {
72
+ overall?: string;
73
+ dimensions?: PlaceGradeDimensions;
74
+ };
75
+ labels: KitchenDossierLabels;
76
+ formatPrice: (amount: number) => string;
77
+ /** 0–100 → display numeral. */
78
+ formatScore: (value: number) => string;
79
+ /** How long each part shows. */
80
+ partDurationMs?: number;
81
+ /** The foot's action — pass a rendered link or button. */
82
+ action?: ReactNode;
83
+ linkComponent?: MenuLinkComponent;
84
+ className?: string;
85
+ };
86
+ declare function KitchenDossier({ place, href, meta, signature, quotes, grade, labels, formatPrice, formatScore, partDurationMs, action, linkComponent: LinkComponent, className, }: KitchenDossierProps): react_jsx_runtime.JSX.Element;
87
+
88
+ export { KitchenDossier, type KitchenDossierLabels, type KitchenDossierLinkProps, type KitchenDossierProps };