@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.
- package/dist/chunk-24RFI4RQ.js +167 -0
- package/dist/{chunk-UKBNQO6Q.js → chunk-2CXU5WZO.js} +1 -1
- package/dist/chunk-2XCZJWTV.js +121 -0
- package/dist/{chunk-62ES6N32.js → chunk-43RC7MHY.js} +1 -1
- package/dist/chunk-5RWTOT5Y.js +72 -0
- package/dist/{chunk-Q6QH52LJ.js → chunk-6TEEY5YA.js} +2 -2
- package/dist/{chunk-AXV5O2IZ.js → chunk-AKQ57NXY.js} +3 -3
- 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-H3ZZDX5L.js +61 -0
- package/dist/{chunk-H3BV4VAG.js → chunk-JS3EINZD.js} +2 -2
- package/dist/chunk-MZL7CGCL.js +109 -0
- package/dist/{chunk-TH6W2PWG.js → chunk-UDTG3RSE.js} +1 -1
- package/dist/chunk-WCTHZKU7.js +37 -0
- package/dist/{chunk-TT3WFS6S.js → chunk-YOKHBAIH.js} +11 -11
- package/dist/components/alert-dialog.js +1 -1
- package/dist/components/alert.d.ts +2 -2
- package/dist/components/avatar.d.ts +3 -3
- package/dist/components/badge.d.ts +1 -1
- package/dist/components/badge.js +1 -1
- package/dist/components/button.d.ts +2 -2
- package/dist/components/button.js +1 -1
- package/dist/components/calendar.js +1 -1
- package/dist/components/card.d.ts +4 -4
- package/dist/components/carousel.js +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/command.d.ts +2 -2
- 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 +75 -38
- package/dist/components/concept-compare.js +209 -133
- 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/dialog.d.ts +2 -2
- package/dist/components/empty-state.js +1 -1
- package/dist/components/event-card.js +1 -1
- package/dist/components/event-compact-row.js +1 -1
- package/dist/components/event-detail-panel.js +2 -2
- 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/filter-category-row.js +1 -1
- package/dist/components/glass-ground.d.ts +61 -0
- package/dist/components/glass-ground.js +3 -0
- package/dist/components/haptic-button.js +1 -1
- package/dist/components/hub-surface.js +11 -1
- package/dist/components/hue-chip.d.ts +70 -0
- package/dist/components/hue-chip.js +3 -0
- package/dist/components/input-group.d.ts +2 -2
- package/dist/components/input.d.ts +1 -1
- package/dist/components/item.d.ts +4 -4
- package/dist/components/kbd.d.ts +2 -2
- package/dist/components/kitchen-dossier.d.ts +88 -0
- package/dist/components/kitchen-dossier.js +186 -0
- package/dist/components/link-button.js +1 -1
- 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 +98 -0
- package/dist/components/menu-family-block.js +153 -0
- package/dist/components/menu-family-card.d.ts +33 -27
- package/dist/components/menu-family-card.js +41 -85
- package/dist/components/menu-field.js +92 -2
- 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.js +10 -5
- 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-item.js +3 -3
- 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 +37 -2
- package/dist/components/menu-mocks.js +152 -27
- package/dist/components/menu-types.d.ts +182 -6
- package/dist/components/motion-icon-controls.js +2 -2
- package/dist/components/motion-icon-set.js +6 -6
- package/dist/components/motion-icon.d.ts +22 -1
- package/dist/components/motion-icon.js +1 -1
- package/dist/components/multi-select-combobox.js +2 -2
- package/dist/components/native-select.d.ts +2 -2
- package/dist/components/pagination.js +1 -1
- 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 +3 -3
- package/dist/components/place-types.d.ts +2 -2
- 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/searchable-select.js +1 -1
- package/dist/components/select.d.ts +1 -1
- package/dist/components/signature-chip.d.ts +2 -2
- package/dist/components/signature-chip.js +2 -2
- package/dist/components/sliding-panels.js +1 -1
- package/dist/components/snap-rail.d.ts +26 -3
- package/dist/components/snap-rail.js +3 -109
- package/dist/components/spinner.d.ts +4 -4
- package/dist/components/story.d.ts +34 -0
- package/dist/components/story.js +3 -0
- package/dist/components/tag.d.ts +4 -4
- package/dist/components/text.d.ts +5 -5
- package/dist/components/toggle.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 +3 -1
- package/dist/components/venue-grade-dimensions.js +1 -1
- package/dist/components/venue-quotes.d.ts +1 -1
- package/dist/components/venue-quotes.js +1 -1
- package/dist/components/venue-wall.js +5 -3
- package/dist/components/weekday-theme-banner.js +1 -1
- package/dist/components/weekend-panel.js +2 -2
- package/package.json +1 -1
- package/src/components/badge.tsx +1 -1
- package/src/components/button.tsx +2 -2
- package/src/components/concept-compare-rail.tsx +132 -0
- package/src/components/concept-compare.stories.tsx +122 -54
- package/src/components/concept-compare.tsx +368 -196
- 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/explainer-steps.stories.tsx +46 -0
- package/src/components/explainer-steps.tsx +74 -0
- package/src/components/glass-ground.tsx +104 -0
- package/src/components/hub-surface.tsx +11 -1
- 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 +321 -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 +303 -0
- package/src/components/menu-family-card.stories.tsx +43 -35
- package/src/components/menu-family-card.tsx +115 -142
- 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.test.tsx +39 -0
- package/src/components/menu-hub-hero.tsx +17 -5
- 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-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 +198 -23
- package/src/components/menu-types.ts +189 -6
- package/src/components/motion-icon-controls.tsx +11 -11
- package/src/components/motion-icon-set.tsx +6 -5
- package/src/components/motion-icon.test.tsx +23 -1
- package/src/components/motion-icon.tsx +20 -0
- package/src/components/photo-ground.tsx +147 -0
- package/src/components/place-types.ts +2 -2
- package/src/components/qa-block.stories.tsx +43 -0
- package/src/components/qa-block.tsx +60 -0
- package/src/components/signature-chip.tsx +3 -3
- package/src/components/snap-rail.tsx +58 -15
- 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.tsx +2 -2
- package/src/components/venue-quotes.stories.tsx +1 -1
- package/src/components/venue-quotes.tsx +4 -2
- package/src/components/venue-wall.tsx +9 -4
- package/src/components/weekday-theme-banner.tsx +1 -1
- package/dist/chunk-THOVPZNN.js +0 -37
- package/dist/chunk-YS6BHKZO.js +0 -92
- package/dist/components/ranked-venue-list.d.ts +0 -49
- package/dist/components/ranked-venue-list.js +0 -87
- package/dist/components/signature-line-list.d.ts +0 -45
- package/dist/components/signature-line-list.js +0 -99
- package/dist/components/venue-busyness-strip.d.ts +0 -35
- package/dist/components/venue-busyness-strip.js +0 -37
- package/dist/components/venue-signature-block.d.ts +0 -39
- package/dist/components/venue-signature-block.js +0 -6
- package/dist/components/venue-spotlight.d.ts +0 -74
- package/dist/components/venue-spotlight.js +0 -138
- package/src/components/ranked-venue-list.stories.tsx +0 -80
- package/src/components/ranked-venue-list.tsx +0 -177
- package/src/components/signature-line-list.stories.tsx +0 -85
- package/src/components/signature-line-list.tsx +0 -136
- package/src/components/venue-busyness-strip.stories.tsx +0 -66
- package/src/components/venue-busyness-strip.tsx +0 -64
- package/src/components/venue-signature-block.stories.tsx +0 -68
- package/src/components/venue-signature-block.tsx +0 -71
- package/src/components/venue-spotlight.stories.tsx +0 -141
- package/src/components/venue-spotlight.tsx +0 -236
- 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 };
|
|
@@ -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?: "
|
|
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?: "
|
|
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,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-
|
|
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-
|
|
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 };
|
|
@@ -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 };
|
|
@@ -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
|
-
|
|
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 };
|
|
@@ -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?: "
|
|
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?: "
|
|
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?: "
|
|
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" | "
|
|
7
|
-
size?: "
|
|
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" | "
|
|
12
|
-
size?: "
|
|
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;
|
package/dist/components/kbd.d.ts
CHANGED
|
@@ -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?: "
|
|
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?: "
|
|
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 };
|