@bearmenu/ui 0.8.10 → 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 (84) hide show
  1. package/dist/{chunk-UKBNQO6Q.js → chunk-2CXU5WZO.js} +1 -1
  2. package/dist/{chunk-62ES6N32.js → chunk-43RC7MHY.js} +1 -1
  3. package/dist/{chunk-Q6QH52LJ.js → chunk-6TEEY5YA.js} +2 -2
  4. package/dist/{chunk-UDN7UHJW.js → chunk-H3ZZDX5L.js} +2 -1
  5. package/dist/{chunk-H3BV4VAG.js → chunk-JS3EINZD.js} +2 -2
  6. package/dist/{chunk-TH6W2PWG.js → chunk-UDTG3RSE.js} +1 -1
  7. package/dist/{chunk-SY6RV476.js → chunk-WCTHZKU7.js} +10 -21
  8. package/dist/components/alert-dialog.js +1 -1
  9. package/dist/components/alert.d.ts +2 -2
  10. package/dist/components/avatar.d.ts +3 -3
  11. package/dist/components/badge.d.ts +1 -1
  12. package/dist/components/badge.js +1 -1
  13. package/dist/components/button.d.ts +2 -2
  14. package/dist/components/button.js +1 -1
  15. package/dist/components/calendar.js +1 -1
  16. package/dist/components/card.d.ts +4 -4
  17. package/dist/components/carousel.js +1 -1
  18. package/dist/components/combobox.js +1 -1
  19. package/dist/components/command.d.ts +8 -8
  20. package/dist/components/concept-compare-rail.js +1 -1
  21. package/dist/components/concept-compare.js +4 -4
  22. package/dist/components/concept-convergence.js +1 -1
  23. package/dist/components/date-input.d.ts +1 -1
  24. package/dist/components/dialog.d.ts +2 -2
  25. package/dist/components/empty-state.js +1 -1
  26. package/dist/components/event-detail-panel.js +1 -1
  27. package/dist/components/event-list-row-wide.js +1 -1
  28. package/dist/components/filter-category-row.js +1 -1
  29. package/dist/components/glass-ground.d.ts +26 -31
  30. package/dist/components/glass-ground.js +1 -1
  31. package/dist/components/haptic-button.js +1 -1
  32. package/dist/components/input-group.d.ts +2 -2
  33. package/dist/components/input.d.ts +1 -1
  34. package/dist/components/item.d.ts +4 -4
  35. package/dist/components/kbd.d.ts +2 -2
  36. package/dist/components/kitchen-dossier.d.ts +7 -7
  37. package/dist/components/kitchen-dossier.js +6 -7
  38. package/dist/components/link-button.js +1 -1
  39. package/dist/components/menu-family-block.d.ts +9 -10
  40. package/dist/components/menu-family-block.js +2 -4
  41. package/dist/components/menu-family-card.js +1 -3
  42. package/dist/components/menu-hub-hero.js +10 -5
  43. package/dist/components/menu-item.js +3 -3
  44. package/dist/components/multi-select-combobox.js +2 -2
  45. package/dist/components/native-select.d.ts +2 -2
  46. package/dist/components/pagination.js +1 -1
  47. package/dist/components/photo-ground.d.ts +1 -1
  48. package/dist/components/place-details-mobile.js +1 -1
  49. package/dist/components/searchable-select.js +1 -1
  50. package/dist/components/select.d.ts +1 -1
  51. package/dist/components/signature-chip.d.ts +2 -2
  52. package/dist/components/signature-chip.js +2 -2
  53. package/dist/components/sliding-panels.js +1 -1
  54. package/dist/components/snap-rail.d.ts +2 -2
  55. package/dist/components/spinner.d.ts +4 -4
  56. package/dist/components/tag.d.ts +4 -4
  57. package/dist/components/text.d.ts +3 -3
  58. package/dist/components/toggle.d.ts +1 -1
  59. package/dist/components/top-ranking-entry.js +3 -3
  60. package/dist/components/venue-quotes.d.ts +1 -1
  61. package/dist/components/venue-quotes.js +1 -1
  62. package/dist/components/venue-wall.js +5 -3
  63. package/dist/components/weekday-theme-banner.js +1 -1
  64. package/package.json +1 -1
  65. package/src/components/badge.tsx +1 -1
  66. package/src/components/button.tsx +2 -2
  67. package/src/components/concept-compare-rail.tsx +2 -1
  68. package/src/components/concept-compare.stories.tsx +3 -3
  69. package/src/components/concept-compare.tsx +10 -5
  70. package/src/components/glass-ground.tsx +31 -56
  71. package/src/components/kitchen-dossier.stories.tsx +1 -1
  72. package/src/components/kitchen-dossier.tsx +15 -16
  73. package/src/components/menu-family-block.stories.tsx +3 -3
  74. package/src/components/menu-family-block.tsx +16 -27
  75. package/src/components/menu-family-card.stories.tsx +2 -2
  76. package/src/components/menu-family-card.tsx +6 -13
  77. package/src/components/menu-hub-hero.test.tsx +39 -0
  78. package/src/components/menu-hub-hero.tsx +17 -5
  79. package/src/components/photo-ground.tsx +1 -1
  80. package/src/components/signature-chip.tsx +3 -3
  81. package/src/components/venue-quotes.stories.tsx +1 -1
  82. package/src/components/venue-quotes.tsx +4 -2
  83. package/src/components/venue-wall.tsx +9 -4
  84. package/src/components/weekday-theme-banner.tsx +1 -1
@@ -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
 
@@ -10,7 +10,7 @@ import { VenueGradeDimensionKey } from './venue-grade-dimensions.js';
10
10
  * The hub used to say this three times: a spotlight with everything the
11
11
  * digest knows, a ranked row with a grade, a card with the signature dish —
12
12
  * and the same kitchen led all three. This is the one card: the venue's
13
- * photograph clear at the top, a frosted caption rising from the foot with
13
+ * photograph clear at the top, an inked caption rising from the foot with
14
14
  * the identity (rating, name, type · area · reviews), and under it a PANEL
15
15
  * that says the three or four things the reviews established one at a time —
16
16
  * the dish it is known for, what people say, the grade — with segments at the
@@ -23,12 +23,12 @@ import { VenueGradeDimensionKey } from './venue-grade-dimensions.js';
23
23
  * bands. This is the reverse — the room is the subject and the facts are its
24
24
  * caption — which is `GlassGround` at its lightest and smallest: anchored to
25
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; a `sm` blur that
27
- * only takes the edge off the detail; ink that never passes 0.45; a text
28
- * shadow under the identity doing the rest. Everything above the caption is
29
- * the photograph, untouched. The panel is its own glass, so its rule reads
30
- * as a panel and not a hole. The same layout at every width; the desktop
31
- * card is wider, not turned on its side.
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
32
  *
33
33
  * ## Two targets, and everything else is "next"
34
34
  *
@@ -1,7 +1,7 @@
1
1
  import { DIMENSION_ORDER, VenueGradeDimensions } from '../chunk-AKQ57NXY.js';
2
- import { VenueQuotes } from '../chunk-62ES6N32.js';
2
+ import { VenueQuotes } from '../chunk-43RC7MHY.js';
3
3
  import { StoryProvider, StorySegments, StoryPanel } from '../chunk-F6FMZJDG.js';
4
- import { GlassGround } from '../chunk-SY6RV476.js';
4
+ import { GlassGround } from '../chunk-WCTHZKU7.js';
5
5
  import { Separator } from '../chunk-WSRWFA6K.js';
6
6
  import { PhotoGround, PHOTO_GROUND } from '../chunk-5RWTOT5Y.js';
7
7
  import { cn } from '../chunk-FEK5XGZW.js';
@@ -52,7 +52,7 @@ function KitchenDossier({
52
52
  children: item.name
53
53
  }
54
54
  ) : /* @__PURE__ */ jsx("span", { className: "text-[16px] font-bold leading-tight tracking-[-0.01em] text-white", children: item.name }),
55
- signature.why && /* @__PURE__ */ jsx("p", { className: "mt-1 line-clamp-2 font-serif text-[13px] italic leading-snug text-white/75", children: signature.why }),
55
+ signature.why && /* @__PURE__ */ jsx("p", { className: "mt-1 line-clamp-2 font-serif text-[13px] leading-snug text-white/75", children: signature.why }),
56
56
  (firstEntry || mentions > 0) && /* @__PURE__ */ jsxs(Fragment, { children: [
57
57
  /* @__PURE__ */ jsx(Separator, { className: "my-2.5 via-white/20" }),
58
58
  /* @__PURE__ */ jsxs("div", { className: "flex items-end justify-between gap-3", children: [
@@ -131,7 +131,7 @@ function KitchenDossier({
131
131
  className: "-mt-1"
132
132
  }
133
133
  ),
134
- /* @__PURE__ */ jsx("div", { className: "relative min-h-[184px] flex-1", children: labels.openUntil && /* @__PURE__ */ jsxs("span", { className: "absolute left-0 top-3 inline-flex h-[30px] items-center gap-[7px] rounded-full bg-[oklch(0.16_0.012_55_/_0.72)] px-3 text-[11.5px] font-bold text-white backdrop-blur-[2px]", children: [
134
+ /* @__PURE__ */ jsx("div", { className: "relative min-h-[184px] flex-1", children: labels.openUntil && /* @__PURE__ */ jsxs("span", { className: "absolute left-0 top-3 inline-flex h-[30px] items-center gap-[7px] rounded-full bg-[oklch(0.16_0.012_55_/_0.78)] px-3 text-[11.5px] font-bold text-white", children: [
135
135
  /* @__PURE__ */ jsx("i", { className: "h-[7px] w-[7px] rounded-full bg-success", "aria-hidden": true }),
136
136
  labels.openUntil
137
137
  ] }) }),
@@ -145,8 +145,7 @@ function KitchenDossier({
145
145
  GlassGround,
146
146
  {
147
147
  stops: { direction: "to bottom", clear: "0px", full: GLASS_LEAD },
148
- peak: 0.4,
149
- blur: "sm"
148
+ peak: 0.6
150
149
  }
151
150
  )
152
151
  }
@@ -165,7 +164,7 @@ function KitchenDossier({
165
164
  StoryPanel,
166
165
  {
167
166
  parts,
168
- className: "rounded-[14px] border border-white/10 bg-[oklch(0.16_0.012_55_/_0.35)] p-4 backdrop-blur-md"
167
+ className: "rounded-[14px] border border-white/10 bg-[oklch(0.16_0.012_55_/_0.62)] p-4"
169
168
  }
170
169
  ),
171
170
  action && /* @__PURE__ */ jsx("div", { className: "flex [&>*]:w-full lg:[&>*]:w-auto", children: action })
@@ -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 '../chunk-FEK5XGZW.js';
4
4
  import { __objRest, __spreadProps, __spreadValues } from '../chunk-3GWWZKX7.js';
@@ -14,17 +14,16 @@ import './place-types.js';
14
14
  *
15
15
  * 1. **The mosaic**, full-bleed, wearing the family's hue through a
16
16
  * `mix-blend-color` layer.
17
- * 2. **A masked backdrop-filter** — absent where the photography is the
18
- * subject, full where the rows begin so the pictures stay sharp where
19
- * they are looked at and go soft exactly where they are read over.
20
- * 3. **An ink gradient** over that. This is what actually buys the contrast:
21
- * frost alone blurs without darkening, and blurred mid-tones will not carry
22
- * 16px type.
17
+ * 2. **An ink gradient** — absent where the photography is the subject, full
18
+ * where the rows begin. This is what buys the contrast. There used to be a
19
+ * masked backdrop-filter under it; it was removed for the measurement
20
+ * recorded in `GlassGround` (73 blur layers cost `/menu` 9 ms per scrolled
21
+ * frame on a phone).
23
22
  *
24
- * On the phone the frost and ink run top to bottom: the name and the action
25
- * sit on clear photography, the chips and the rows on the frosted foot. On
26
- * desktop the same three layers turn ninety degrees — the photo column on the
27
- * left stays clear, the row column on the right is the frosted one. The mosaic
23
+ * On the phone the ink runs top to bottom: the name and the action sit on
24
+ * clear photography, the chips and the rows on the inked foot. On desktop the
25
+ * same layers turn ninety degrees — the photo column on the left stays clear,
26
+ * the row column on the right is the inked one. The mosaic
28
27
  * runs 3×2 there rather than 2×2, because at 1110px a four-tile grid makes each
29
28
  * photograph too big to read as texture.
30
29
  *
@@ -15,7 +15,6 @@ function DefaultLink(_a) {
15
15
  var MOSAIC_TILES = 6;
16
16
  var PHONE_TILES = 4;
17
17
  var GROUND = PHOTO_GROUND;
18
- var FROST = "backdrop-blur-xl [mask-image:linear-gradient(to_bottom,transparent_0%,black_42%)] lg:[mask-image:linear-gradient(to_right,transparent_36%,black_54%)]";
19
18
  var INK = "bg-[linear-gradient(to_bottom,oklch(0.16_0.012_55_/_0.42)_0%,oklch(0.16_0.012_55_/_0.6)_30%,oklch(0.16_0.012_55_/_0.9)_48%,oklch(0.16_0.012_55_/_0.96)_100%)] lg:bg-[linear-gradient(to_right,oklch(0.16_0.012_55_/_0.38)_0%,oklch(0.16_0.012_55_/_0.6)_30%,oklch(0.16_0.012_55_/_0.92)_46%,oklch(0.16_0.012_55_/_0.96)_100%)]";
20
19
  var TEXT_SCRIM = (
21
20
  /* `isolate` + `before:-z-10`: a positioned pseudo-element paints ABOVE the
@@ -59,18 +58,17 @@ function MenuFamilyBlock({
59
58
  gradient
60
59
  }
61
60
  ),
62
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: cn("absolute inset-0", FROST) }),
63
61
  /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: cn("absolute inset-0", INK) }),
64
62
  /* @__PURE__ */ jsxs("div", { className: "relative grid grid-cols-1 lg:grid-cols-[38%_1fr]", children: [
65
63
  /* @__PURE__ */ jsxs("div", { className: cn("relative flex flex-col p-3.5 lg:min-h-[320px] lg:justify-end lg:p-5", TEXT_SCRIM), children: [
66
- overflow > 0 && /* @__PURE__ */ jsx("span", { className: "mb-16 self-end rounded-full bg-[oklch(0.16_0.012_55_/_0.72)] px-2.5 py-1 text-[11px] font-semibold text-white backdrop-blur-[2px] lg:mb-3 lg:self-start", children: labels.more(overflow) }),
64
+ overflow > 0 && /* @__PURE__ */ jsx("span", { className: "mb-16 self-end rounded-full bg-[oklch(0.16_0.012_55_/_0.78)] px-2.5 py-1 text-[11px] font-semibold text-white lg:mb-3 lg:self-start", children: labels.more(overflow) }),
67
65
  /* @__PURE__ */ jsx("h3", { className: "text-balance font-serif text-[26px] font-semibold leading-tight tracking-[-0.02em] text-white lg:text-[30px]", children: family.name }),
68
66
  /* @__PURE__ */ jsx("span", { className: "mt-0.5 block text-[13px] font-medium tabular-nums text-white/70", children: labels.venueUnit(family.venueCount) }),
69
67
  /* @__PURE__ */ jsx(
70
68
  LinkComponent,
71
69
  {
72
70
  href: family.href,
73
- className: "mt-3.5 inline-flex h-10 w-max items-center rounded-full border border-white/20 bg-white/[0.12] px-4 text-[13.5px] font-bold text-white backdrop-blur-md transition-colors hover:bg-white/20 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white motion-reduce:transition-none",
71
+ className: "mt-3.5 inline-flex h-10 w-max items-center rounded-full border border-white/20 bg-white/[0.16] px-4 text-[13.5px] font-bold text-white transition-colors hover:bg-white/25 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white motion-reduce:transition-none",
74
72
  children: labels.browse
75
73
  }
76
74
  )
@@ -11,7 +11,6 @@ function DefaultLink(_a) {
11
11
  }
12
12
  var MOSAIC_CELLS = 4;
13
13
  var GROUND = PHOTO_GROUND;
14
- var FROST = "backdrop-blur-xl [mask-image:linear-gradient(to_bottom,transparent_28%,black_58%)]";
15
14
  var INK = "bg-[linear-gradient(to_bottom,oklch(0.16_0.012_55_/_0.78)_0%,oklch(0.16_0.012_55_/_0.5)_34%,oklch(0.16_0.012_55_/_0.86)_62%,oklch(0.16_0.012_55_/_0.96)_100%)]";
16
15
  function MenuFamilyCard({
17
16
  family,
@@ -47,7 +46,6 @@ function MenuFamilyCard({
47
46
  gradient
48
47
  }
49
48
  ),
50
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: cn("absolute inset-0 -z-20", FROST) }),
51
49
  /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: cn("absolute inset-0 -z-10", INK) }),
52
50
  /* @__PURE__ */ jsxs("span", { className: "block text-white", children: [
53
51
  /* @__PURE__ */ jsx("b", { className: "block text-[34px] font-extrabold leading-none tracking-[-0.03em] tabular-nums", children: family.venue_count }),
@@ -69,7 +67,7 @@ function MenuFamilyCard({
69
67
  ),
70
68
  (_d = family.chips) == null ? void 0 : _d.map((chip) => /* @__PURE__ */ jsx(HueChip, { hue, children: chip.label }, chip.slug))
71
69
  ] }),
72
- /* @__PURE__ */ jsx("span", { className: "mt-3.5 inline-flex h-10 items-center rounded-full border border-white/20 bg-white/[0.12] px-4 text-[13.5px] font-bold text-white backdrop-blur-md transition-colors group-hover:bg-white/20 motion-reduce:transition-none", children: labels.browse })
70
+ /* @__PURE__ */ jsx("span", { className: "mt-3.5 inline-flex h-10 items-center rounded-full border border-white/20 bg-white/[0.16] px-4 text-[13.5px] font-bold text-white transition-colors group-hover:bg-white/25 motion-reduce:transition-none", children: labels.browse })
73
71
  ] })
74
72
  ]
75
73
  }
@@ -3,6 +3,7 @@ import '../chunk-3GWWZKX7.js';
3
3
  import { jsxs, jsx } from 'react/jsx-runtime';
4
4
 
5
5
  var TEXTURE_CELLS = 28;
6
+ var PHONE_CELLS = 6;
6
7
  function MenuHubHero({
7
8
  kicker,
8
9
  kickerIcon,
@@ -39,9 +40,10 @@ function MenuHubHero({
39
40
  "div",
40
41
  {
41
42
  "aria-hidden": true,
42
- className: "absolute inset-0 grid auto-rows-fr grid-cols-4 gap-0.5 lg:grid-cols-7",
43
+ className: "absolute inset-0 grid auto-rows-fr grid-cols-3 gap-0.5 lg:grid-cols-7",
43
44
  children: Array.from({ length: TEXTURE_CELLS }, (_, cell) => {
44
45
  const url = (tileUrls == null ? void 0 : tileUrls.length) ? tileUrls[cell % tileUrls.length] : void 0;
46
+ const phone = cell < PHONE_CELLS ? void 0 : "hidden lg:block";
45
47
  return url ? (
46
48
  // eslint-disable-next-line @next/next/no-img-element
47
49
  /* @__PURE__ */ jsx(
@@ -51,14 +53,17 @@ function MenuHubHero({
51
53
  alt: "",
52
54
  loading: "lazy",
53
55
  decoding: "async",
54
- className: "h-full w-full object-cover"
56
+ className: cn("h-full w-full object-cover", phone)
55
57
  },
56
58
  cell
57
59
  )
58
60
  ) : /* @__PURE__ */ jsx(
59
61
  "div",
60
62
  {
61
- className: "bg-[repeating-linear-gradient(135deg,oklch(0.6_0.02_55)_0_9px,oklch(0.68_0.016_58)_9px_18px)] opacity-[0.42]"
63
+ className: cn(
64
+ "bg-[repeating-linear-gradient(135deg,oklch(0.6_0.02_55)_0_9px,oklch(0.68_0.016_58)_9px_18px)] opacity-[0.42]",
65
+ phone
66
+ )
62
67
  },
63
68
  cell
64
69
  );
@@ -71,7 +76,7 @@ function MenuHubHero({
71
76
  "aria-hidden": true,
72
77
  className: cn(
73
78
  "absolute inset-0",
74
- (tileUrls == null ? void 0 : tileUrls.length) || backgroundUrl ? "bg-[linear-gradient(100deg,oklch(0.16_0.012_55_/_0.96)_0%,oklch(0.16_0.012_55_/_0.88)_52%,oklch(0.16_0.012_55_/_0.72)_100%)]" : "bg-[linear-gradient(100deg,oklch(0.18_0.012_55_/_0.95)_0%,oklch(0.18_0.012_55_/_0.72)_52%,oklch(0.18_0.012_55_/_0.3)_100%)]"
79
+ (tileUrls == null ? void 0 : tileUrls.length) || backgroundUrl ? "bg-[linear-gradient(100deg,oklch(0.16_0.012_55_/_0.96)_0%,oklch(0.16_0.012_55_/_0.86)_52%,oklch(0.16_0.012_55_/_0.6)_100%)]" : "bg-[linear-gradient(100deg,oklch(0.18_0.012_55_/_0.95)_0%,oklch(0.18_0.012_55_/_0.72)_52%,oklch(0.18_0.012_55_/_0.3)_100%)]"
75
80
  )
76
81
  }
77
82
  ),
@@ -88,7 +93,7 @@ function MenuHubHero({
88
93
  /* @__PURE__ */ jsx("div", { className: "mt-[5px] text-xs opacity-[0.72]", children: figure.label })
89
94
  ] }, figure.label)) }),
90
95
  (proof || action) && /* @__PURE__ */ jsxs("div", { className: "mt-auto flex flex-wrap items-center gap-3 pt-5", children: [
91
- proof && /* @__PURE__ */ jsxs("span", { className: "inline-flex min-h-11 items-center gap-2.5 rounded-full bg-white/10 px-4 py-2 text-[13px] backdrop-blur-[6px]", children: [
96
+ proof && /* @__PURE__ */ jsxs("span", { className: "inline-flex min-h-11 items-center gap-2.5 rounded-full bg-white/[0.14] px-4 py-2 text-[13px]", children: [
92
97
  proofIcon,
93
98
  proof
94
99
  ] }),
@@ -1,5 +1,5 @@
1
- export { MentionSignal, MenuItem } from '../chunk-TH6W2PWG.js';
2
- import '../chunk-Q6QH52LJ.js';
3
- import '../chunk-UKBNQO6Q.js';
1
+ export { MentionSignal, MenuItem } from '../chunk-UDTG3RSE.js';
2
+ import '../chunk-6TEEY5YA.js';
3
+ import '../chunk-2CXU5WZO.js';
4
4
  import '../chunk-FEK5XGZW.js';
5
5
  import '../chunk-3GWWZKX7.js';
@@ -2,9 +2,9 @@ import { Popover, PopoverTrigger, PopoverContent } from '../chunk-66MAPLXS.js';
2
2
  import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../chunk-XNA2INVQ.js';
3
3
  import '../chunk-FRPPIXMY.js';
4
4
  import { Checkbox } from '../chunk-D5QHEHXJ.js';
5
- import { Button } from '../chunk-H3BV4VAG.js';
5
+ import { Button } from '../chunk-JS3EINZD.js';
6
6
  import '../chunk-R47NEOSI.js';
7
- import { Badge } from '../chunk-UKBNQO6Q.js';
7
+ import { Badge } from '../chunk-2CXU5WZO.js';
8
8
  import { cn } from '../chunk-FEK5XGZW.js';
9
9
  import '../chunk-3GWWZKX7.js';
10
10
  import * as React from 'react';
@@ -3,10 +3,10 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const nativeSelectVariants: (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 NativeSelect: React.ForwardRefExoticComponent<Omit<React.SelectHTMLAttributes<HTMLSelectElement>, "size"> & 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<HTMLSelectElement>>;
11
11
 
12
12
  export { NativeSelect, nativeSelectVariants };
@@ -1,4 +1,4 @@
1
- import { buttonVariants } from '../chunk-H3BV4VAG.js';
1
+ import { buttonVariants } from '../chunk-JS3EINZD.js';
2
2
  import '../chunk-R47NEOSI.js';
3
3
  import { cn } from '../chunk-FEK5XGZW.js';
4
4
  import { __objRest, __spreadValues, __spreadProps } from '../chunk-3GWWZKX7.js';
@@ -14,7 +14,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
14
14
  *
15
15
  * It owns the photographs and their colour: the ground, the tiles, the fallback
16
16
  * initial, the family's hue and an optional uniform dark overlay. It does NOT
17
- * own the glass — the scrims and frosted bands that carry a card's type run in
17
+ * own the ink — the scrims and bands that carry a card's type run in
18
18
  * a different direction on every card (down the family block's phone, across
19
19
  * its desktop, in from both ends of the concept card) and are the card's own.
20
20
  *
@@ -3,7 +3,7 @@ import '../chunk-VG3PND3D.js';
3
3
  import '../chunk-ZDAHKI3A.js';
4
4
  import '../chunk-WSRWFA6K.js';
5
5
  import { Text } from '../chunk-7BWTYWM3.js';
6
- import { Badge } from '../chunk-UKBNQO6Q.js';
6
+ import { Badge } from '../chunk-2CXU5WZO.js';
7
7
  import { cn } from '../chunk-FEK5XGZW.js';
8
8
  import '../chunk-3GWWZKX7.js';
9
9
  import { useState } from 'react';
@@ -1,7 +1,7 @@
1
1
  import { Popover, PopoverTrigger, PopoverContent } from '../chunk-66MAPLXS.js';
2
2
  import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../chunk-XNA2INVQ.js';
3
3
  import '../chunk-FRPPIXMY.js';
4
- import { Button } from '../chunk-H3BV4VAG.js';
4
+ import { Button } from '../chunk-JS3EINZD.js';
5
5
  import '../chunk-R47NEOSI.js';
6
6
  import { cn } from '../chunk-FEK5XGZW.js';
7
7
  import '../chunk-3GWWZKX7.js';
@@ -7,7 +7,7 @@ declare const Select: React.FC<SelectPrimitive.SelectProps>;
7
7
  declare const SelectGroup: React.ForwardRefExoticComponent<SelectPrimitive.SelectGroupProps & React.RefAttributes<HTMLDivElement>>;
8
8
  declare const SelectValue: React.ForwardRefExoticComponent<SelectPrimitive.SelectValueProps & React.RefAttributes<HTMLSpanElement>>;
9
9
  declare const SelectTrigger: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & VariantProps<(props?: ({
10
- size?: "default" | "sm" | "lg" | null | undefined;
10
+ size?: "sm" | "default" | "lg" | null | undefined;
11
11
  } & class_variance_authority_types.ClassProp) | undefined) => string> & React.RefAttributes<HTMLButtonElement>>;
12
12
  declare const SelectScrollUpButton: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectScrollUpButtonProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
13
13
  declare const SelectScrollDownButton: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectScrollDownButtonProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
@@ -18,8 +18,8 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
18
18
  *
19
19
  * `surface="image"` is for card covers, where the chip sits over the photo
20
20
  * rather than in the caption block. The accent-on-canvas palette has no
21
- * contrast guarantee over an arbitrary photo, so it swaps to the same frosted
22
- * fill the place badge uses there and keeps the dashed edge — which is what
21
+ * contrast guarantee over an arbitrary photo, so it swaps to the same solid
22
+ * ink fill the place badge uses there and keeps the dashed edge — which is what
23
23
  * says "there is evidence behind this" — in the inverted colour.
24
24
  *
25
25
  * The label is passed in: the DS owns no translation keys.
@@ -1,4 +1,4 @@
1
- export { SignatureChip } from '../chunk-Q6QH52LJ.js';
2
- import '../chunk-UKBNQO6Q.js';
1
+ export { SignatureChip } from '../chunk-6TEEY5YA.js';
2
+ import '../chunk-2CXU5WZO.js';
3
3
  import '../chunk-FEK5XGZW.js';
4
4
  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 '../chunk-R47NEOSI.js';
3
3
  import { cn } from '../chunk-FEK5XGZW.js';
4
4
  import '../chunk-3GWWZKX7.js';
@@ -22,7 +22,7 @@ import { VariantProps } from 'class-variance-authority';
22
22
  */
23
23
  declare const snapRailVariants: (props?: ({
24
24
  itemWidth?: "sm" | "lg" | "full" | "md" | null | undefined;
25
- gap?: "default" | "sm" | null | undefined;
25
+ gap?: "sm" | "default" | null | undefined;
26
26
  bleed?: "none" | "page" | "card" | null | undefined;
27
27
  } & class_variance_authority_types.ClassProp) | undefined) => string;
28
28
  type SnapRailProps = React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof snapRailVariants> & {
@@ -44,7 +44,7 @@ type SnapRailProps = React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof
44
44
  };
45
45
  declare const SnapRail: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
46
46
  itemWidth?: "sm" | "lg" | "full" | "md" | null | undefined;
47
- gap?: "default" | "sm" | null | undefined;
47
+ gap?: "sm" | "default" | null | undefined;
48
48
  bleed?: "none" | "page" | "card" | null | undefined;
49
49
  } & class_variance_authority_types.ClassProp) | undefined) => string> & {
50
50
  /**
@@ -3,12 +3,12 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const spinnerVariants: (props?: ({
6
- size?: "default" | "xs" | "sm" | "lg" | "xl" | null | undefined;
7
- tone?: "inherit" | "default" | "destructive" | "primary" | null | undefined;
6
+ size?: "xs" | "sm" | "default" | "lg" | "xl" | null | undefined;
7
+ tone?: "default" | "inherit" | "destructive" | "primary" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  declare const Spinner: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLSpanElement> & VariantProps<(props?: ({
10
- size?: "default" | "xs" | "sm" | "lg" | "xl" | null | undefined;
11
- tone?: "inherit" | "default" | "destructive" | "primary" | null | undefined;
10
+ size?: "xs" | "sm" | "default" | "lg" | "xl" | null | undefined;
11
+ tone?: "default" | "inherit" | "destructive" | "primary" | null | undefined;
12
12
  } & class_variance_authority_types.ClassProp) | undefined) => string> & {
13
13
  /** Visually-hidden label for screen readers. Defaults to "Loading". */
14
14
  label?: string;
@@ -3,12 +3,12 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const tagVariants: (props?: ({
6
- variant?: "default" | "destructive" | "outline" | "success" | "warning" | "primary" | "quiet" | null | undefined;
7
- size?: "default" | "sm" | "lg" | null | undefined;
6
+ variant?: "default" | "success" | "warning" | "destructive" | "outline" | "primary" | "quiet" | null | undefined;
7
+ size?: "sm" | "default" | "lg" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  declare const Tag: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLSpanElement> & VariantProps<(props?: ({
10
- variant?: "default" | "destructive" | "outline" | "success" | "warning" | "primary" | "quiet" | null | undefined;
11
- size?: "default" | "sm" | "lg" | null | undefined;
10
+ variant?: "default" | "success" | "warning" | "destructive" | "outline" | "primary" | "quiet" | null | undefined;
11
+ size?: "sm" | "default" | "lg" | null | undefined;
12
12
  } & class_variance_authority_types.ClassProp) | undefined) => string> & {
13
13
  onRemove?: () => void;
14
14
  removeLabel?: string;
@@ -23,10 +23,10 @@ import { VariantProps } from 'class-variance-authority';
23
23
  */
24
24
  declare const textVariants: (props?: ({
25
25
  variant?: "h2" | "h3" | "label" | "body" | "caption" | "h1" | "h4" | "small" | "display" | "body-lg" | "body-sm" | "overline" | null | undefined;
26
- color?: "inherit" | "default" | "destructive" | "muted" | "primary" | "primary-foreground" | null | undefined;
26
+ color?: "default" | "inherit" | "destructive" | "muted" | "primary" | "primary-foreground" | null | undefined;
27
27
  weight?: "bold" | "medium" | "normal" | "semibold" | null | undefined;
28
- leading?: "none" | "normal" | "tight" | "snug" | "relaxed" | "loose" | null | undefined;
29
- tracking?: "normal" | "tight" | "wide" | "wider" | null | undefined;
28
+ leading?: "none" | "tight" | "loose" | "normal" | "snug" | "relaxed" | null | undefined;
29
+ tracking?: "tight" | "normal" | "wide" | "wider" | null | undefined;
30
30
  wrap?: "balance" | "pretty" | "nowrap" | null | undefined;
31
31
  } & class_variance_authority_types.ClassProp) | undefined) => string;
32
32
  type TextTag = "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "p" | "span" | "div" | "label" | "strong" | "em" | "small" | "li" | "dt" | "dd";
@@ -6,7 +6,7 @@ import { VariantProps } from 'class-variance-authority';
6
6
 
7
7
  declare const toggleVariants: (props?: ({
8
8
  variant?: "default" | "outline" | null | undefined;
9
- size?: "default" | "sm" | "lg" | null | undefined;
9
+ size?: "sm" | "default" | "lg" | null | undefined;
10
10
  } & class_variance_authority_types.ClassProp) | undefined) => string;
11
11
  declare function Toggle({ className, variant, size, ...props }: React.ComponentProps<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>): react_jsx_runtime.JSX.Element;
12
12
 
@@ -1,8 +1,8 @@
1
- import { MenuItem } from '../chunk-TH6W2PWG.js';
2
- import '../chunk-Q6QH52LJ.js';
1
+ import { MenuItem } from '../chunk-UDTG3RSE.js';
2
+ import '../chunk-6TEEY5YA.js';
3
3
  import { Separator } from '../chunk-WSRWFA6K.js';
4
4
  import { Skeleton } from '../chunk-QXHMPJ35.js';
5
- import '../chunk-UKBNQO6Q.js';
5
+ import '../chunk-2CXU5WZO.js';
6
6
  import { cn } from '../chunk-FEK5XGZW.js';
7
7
  import { __objRest, __spreadValues } from '../chunk-3GWWZKX7.js';
8
8
  import { MapPin, Star, MessageSquareQuote } from 'lucide-react';
@@ -6,7 +6,7 @@ import { CitedText } from './place-types.js';
6
6
  *
7
7
  * These are `reviews_digest.highlights`: one to three short positives already
8
8
  * resolved into the request locale. They are the only place on a hub where a
9
- * reviewer speaks in their own register, so they are set in serif italic
9
+ * reviewer speaks in their own register, so they are set in quoted serif
10
10
  * against the sans everything else uses.
11
11
  *
12
12
  * `onCite` turns a quote into a button that opens the reviews behind it —
@@ -1,3 +1,3 @@
1
- export { VenueQuotes } from '../chunk-62ES6N32.js';
1
+ export { VenueQuotes } from '../chunk-43RC7MHY.js';
2
2
  import '../chunk-FEK5XGZW.js';
3
3
  import '../chunk-3GWWZKX7.js';
@@ -6,6 +6,8 @@ function DefaultLink(_a) {
6
6
  var _b = _a, { href } = _b, props = __objRest(_b, ["href"]);
7
7
  return /* @__PURE__ */ jsx("a", __spreadValues({ href }, props));
8
8
  }
9
+ var WALL_CELLS = 18;
10
+ var PHONE_CELLS = 6;
9
11
  function VenueWall({
10
12
  places,
11
13
  hrefs,
@@ -28,7 +30,7 @@ function VenueWall({
28
30
  ),
29
31
  children: [
30
32
  (tileUrls == null ? void 0 : tileUrls.length) ? /* @__PURE__ */ jsxs(Fragment, { children: [
31
- /* @__PURE__ */ jsx("div", { "aria-hidden": true, className: "absolute inset-0 grid auto-rows-fr grid-cols-4 gap-0.5 lg:grid-cols-6", children: Array.from({ length: 18 }, (_, cell) => (
33
+ /* @__PURE__ */ jsx("div", { "aria-hidden": true, className: "absolute inset-0 grid auto-rows-fr grid-cols-3 gap-0.5 lg:grid-cols-6", children: Array.from({ length: WALL_CELLS }, (_, cell) => (
32
34
  // eslint-disable-next-line @next/next/no-img-element
33
35
  /* @__PURE__ */ jsx(
34
36
  "img",
@@ -37,7 +39,7 @@ function VenueWall({
37
39
  alt: "",
38
40
  loading: "lazy",
39
41
  decoding: "async",
40
- className: "h-full w-full object-cover"
42
+ className: cn("h-full w-full object-cover", cell >= PHONE_CELLS && "hidden lg:block")
41
43
  },
42
44
  cell
43
45
  )
@@ -94,7 +96,7 @@ function VenueWall({
94
96
  ) }),
95
97
  /* @__PURE__ */ jsx("span", { className: "truncate text-[12.5px] font-medium", children: place.name })
96
98
  ] });
97
- const chipClasses = "inline-flex max-w-[220px] items-center gap-2 rounded-full bg-white/10 py-1 pl-1 pr-3.5 backdrop-blur-[6px]";
99
+ const chipClasses = "inline-flex max-w-[220px] items-center gap-2 rounded-full bg-white/[0.14] py-1 pl-1 pr-3.5";
98
100
  return /* @__PURE__ */ jsx("li", { children: (hrefs == null ? void 0 : hrefs[place.slug]) ? /* @__PURE__ */ jsx(
99
101
  LinkComponent,
100
102
  {
@@ -76,7 +76,7 @@ function WeekdayThemeBanner({
76
76
  "relative z-[1] hidden border-t border-white/15 p-4 lg:block lg:min-w-[240px] lg:border-l lg:border-t-0 lg:p-5",
77
77
  // Over a photograph the rail needs its own ground, or seven lines of
78
78
  // small type land on whatever the plate happens to be.
79
- imageUrl && "bg-black/45 backdrop-blur-[2px]"
79
+ imageUrl && "bg-black/55"
80
80
  ),
81
81
  children: [
82
82
  weekLabel && /* @__PURE__ */ jsx("div", { className: "mb-2 text-[10px] font-bold tracking-[0.12em] opacity-70", children: weekLabel }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bearmenu/ui",
3
- "version": "0.8.10",
3
+ "version": "0.8.11",
4
4
  "description": "BearMenu design system — shared UI tokens, primitives, and components",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {
@@ -14,7 +14,7 @@ const badgeVariants = cva(
14
14
  "border-transparent bg-destructive text-destructive-foreground",
15
15
  outline: "text-foreground border-border",
16
16
  overlay:
17
- "border-transparent bg-foreground/70 text-background backdrop-blur-sm",
17
+ "border-transparent bg-foreground/80 text-background",
18
18
  glass: "glass text-foreground border-border/50",
19
19
  success:
20
20
  "border-transparent bg-success text-success-foreground",
@@ -28,14 +28,14 @@ const buttonVariants = cva(
28
28
  * into a dark photo.
29
29
  *
30
30
  * Deliberately NOT theme-aware, and so deliberately different from
31
- * `Badge`'s `overlay` (`bg-foreground/70 text-background`, which
31
+ * `Badge`'s `overlay` (`bg-foreground/80 text-background`, which
32
32
  * inverts). A photo is equally a photo in both themes — this chrome has
33
33
  * to contrast with the image beneath it, not with the app canvas, so it
34
34
  * stays dark-on-light-glyph either way. Reconcile Badge to this, not the
35
35
  * reverse, if the two are ever unified.
36
36
  */
37
37
  overlay:
38
- "bg-black/40 text-white backdrop-blur-sm hover:bg-black/60 focus-visible:ring-white/70",
38
+ "bg-black/50 text-white hover:bg-black/65 focus-visible:ring-white/70",
39
39
  brown:
40
40
  "bg-brown text-brown-foreground shadow-sm hover:bg-brown/85 hover:shadow",
41
41
  antagonist:
@@ -67,7 +67,8 @@ export type ConceptCompareRailProps = {
67
67
  * not `var(--scrim)`, which is the app's token and not this package's.
68
68
  */
69
69
  const FOOT_GLASS = cn(
70
- "before:pointer-events-none before:absolute before:inset-0 before:-z-10 before:content-[''] before:backdrop-blur-lg",
70
+ // Ink only no backdrop-blur; see `GlassGround` for the measurement.
71
+ "before:pointer-events-none before:absolute before:inset-0 before:-z-10 before:content-['']",
71
72
  "before:bg-[oklch(0.16_0.012_55_/_0.9)]",
72
73
  "lg:before:[mask-image:linear-gradient(to_top,black_60%,transparent_100%)] lg:before:bg-[linear-gradient(to_top,oklch(0.16_0.012_55_/_0.88)_0%,oklch(0.16_0.012_55_/_0.84)_60%,oklch(0.16_0.012_55_/_0.4)_85%,oklch(0.16_0.012_55_/_0)_100%)]"
73
74
  );
@@ -12,7 +12,7 @@ const labels = {
12
12
 
13
13
  const formatPrice = (amount: number) => `${amount} lei`;
14
14
 
15
- /** A stand-in venue photograph with enough variance that the glass has something to blur. */
15
+ /** A stand-in venue photograph with enough variance that the ink bands have something to sit on. */
16
16
  function room(hue: number, label: string) {
17
17
  return (
18
18
  "data:image/svg+xml;utf8," +
@@ -79,7 +79,7 @@ const hrefs = Object.fromEntries(rooms.map((r) => [r.place_slug, `/places/${r.pl
79
79
  const seeAll = (
80
80
  <a
81
81
  href="/menu/dishes/papanasi"
82
- className="inline-flex h-10 items-center justify-center gap-1.5 rounded-full border border-white/20 bg-white/[0.12] px-4 text-[13.5px] font-bold text-white backdrop-blur-md"
82
+ className="inline-flex h-10 items-center justify-center gap-1.5 rounded-full border border-white/20 bg-white/[0.16] px-4 text-[13.5px] font-bold text-white"
83
83
  >
84
84
  See all 45 kitchens
85
85
  </a>
@@ -111,7 +111,7 @@ const meta: Meta<typeof ConceptCompare> = {
111
111
  docs: {
112
112
  description: {
113
113
  component:
114
- "One dish across the kitchens that make it — and **no surfaces at all**. The card is a contact sheet of venue photographs, one per room, and the three readable things float on it through glass: the identity across the top, each kitchen's line over its own photograph, the foot along the bottom. Read ACROSS, not down: four rooms side by side, each with its own name and price. The photographs are placed as cells of the same grid as the rooms, spanning from the head down, so the head's glass genuinely blurs them and every seam lands on a room boundary. Nothing in it is themed — the edge is the only thing that adapts to the page.",
114
+ "One dish across the kitchens that make it — and **no surfaces at all**. The card is a contact sheet of venue photographs, one per room, and the three readable things float on it on ink bands: the identity across the top, each kitchen's line over its own photograph, the foot along the bottom. Read ACROSS, not down: four rooms side by side, each with its own name and price. The photographs are placed as cells of the same grid as the rooms, spanning from the head down, so the head's ink fades into them and every seam lands on a room boundary. Nothing in it is themed — the edge is the only thing that adapts to the page.",
115
115
  },
116
116
  },
117
117
  },