@bearmenu/ui 0.8.4 → 0.8.7

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 (150) hide show
  1. package/dist/chunk-637L7XQ3.js +85 -0
  2. package/dist/chunk-6XMYEZVR.js +26 -0
  3. package/dist/chunk-DNSXMHYX.js +8 -0
  4. package/dist/chunk-FDITZ2VM.js +16 -0
  5. package/dist/chunk-GPH6L4DX.js +55 -0
  6. package/dist/{chunk-N2KNBPAQ.js → chunk-QXHMPJ35.js} +1 -0
  7. package/dist/chunk-TT3WFS6S.js +379 -0
  8. package/dist/chunk-UXWAOISG.js +170 -0
  9. package/dist/{chunk-UZ3PCIE5.js → chunk-XWMRABZW.js} +2 -2
  10. package/dist/{chunk-VBA45GLP.js → chunk-ZDAHKI3A.js} +12 -2
  11. package/dist/components/card.d.ts +2 -2
  12. package/dist/components/card.js +4 -127
  13. package/dist/components/category-deck.d.ts +50 -0
  14. package/dist/components/category-deck.js +128 -0
  15. package/dist/components/concept-card.d.ts +43 -0
  16. package/dist/components/concept-card.js +81 -0
  17. package/dist/components/coverflow.d.ts +123 -0
  18. package/dist/components/coverflow.js +300 -0
  19. package/dist/components/day-rail-chip.d.ts +82 -0
  20. package/dist/components/day-rail-chip.js +105 -0
  21. package/dist/components/drift-rail.d.ts +28 -0
  22. package/dist/components/drift-rail.js +3 -0
  23. package/dist/components/event-card.d.ts +97 -0
  24. package/dist/components/event-card.js +164 -0
  25. package/dist/components/event-compact-row.d.ts +73 -0
  26. package/dist/components/event-compact-row.js +134 -0
  27. package/dist/components/event-day-header.d.ts +65 -0
  28. package/dist/components/event-day-header.js +95 -0
  29. package/dist/components/event-day-separator.d.ts +46 -0
  30. package/dist/components/event-day-separator.js +50 -0
  31. package/dist/components/event-detail-panel.d.ts +80 -0
  32. package/dist/components/event-detail-panel.js +251 -0
  33. package/dist/components/event-hub-hero.d.ts +34 -0
  34. package/dist/components/event-hub-hero.js +57 -0
  35. package/dist/components/event-index-row.d.ts +68 -0
  36. package/dist/components/event-index-row.js +84 -0
  37. package/dist/components/event-list-row-wide.d.ts +101 -0
  38. package/dist/components/event-list-row-wide.js +218 -0
  39. package/dist/components/event-list-row.d.ts +82 -0
  40. package/dist/components/event-list-row.js +173 -0
  41. package/dist/components/event-poster-fallback.d.ts +20 -0
  42. package/dist/components/event-poster-fallback.js +3 -0
  43. package/dist/components/event-types.d.ts +122 -0
  44. package/dist/components/event-types.js +2 -0
  45. package/dist/components/events-empty-state.d.ts +44 -0
  46. package/dist/components/events-empty-state.js +73 -0
  47. package/dist/components/facet-group.d.ts +93 -0
  48. package/dist/components/facet-group.js +222 -0
  49. package/dist/components/featured-rail-item.d.ts +42 -0
  50. package/dist/components/featured-rail-item.js +88 -0
  51. package/dist/components/hour-band.d.ts +68 -0
  52. package/dist/components/hour-band.js +53 -0
  53. package/dist/components/hour-group.d.ts +67 -0
  54. package/dist/components/hour-group.js +59 -0
  55. package/dist/components/motion-icon-controls.js +3 -379
  56. package/dist/components/multi-select-combobox.js +1 -1
  57. package/dist/components/place-about-tab.js +3 -3
  58. package/dist/components/place-details-mobile.js +3 -3
  59. package/dist/components/poster-stack.d.ts +30 -0
  60. package/dist/components/poster-stack.js +104 -0
  61. package/dist/components/poster-tape.d.ts +36 -0
  62. package/dist/components/poster-tape.js +64 -0
  63. package/dist/components/poster-wall.d.ts +25 -0
  64. package/dist/components/poster-wall.js +183 -0
  65. package/dist/components/quiet-stretch.d.ts +43 -0
  66. package/dist/components/quiet-stretch.js +54 -0
  67. package/dist/components/section-header.d.ts +53 -0
  68. package/dist/components/section-header.js +63 -0
  69. package/dist/components/segmented-nav.d.ts +62 -0
  70. package/dist/components/segmented-nav.js +54 -0
  71. package/dist/components/skeleton-card.js +1 -1
  72. package/dist/components/skeleton.d.ts +17 -0
  73. package/dist/components/skeleton.js +1 -1
  74. package/dist/components/tag-group.js +3 -26
  75. package/dist/components/tag.d.ts +2 -2
  76. package/dist/components/tag.js +1 -1
  77. package/dist/components/timeline-band.d.ts +46 -0
  78. package/dist/components/timeline-band.js +5 -0
  79. package/dist/components/venue-events-block.d.ts +143 -0
  80. package/dist/components/venue-events-block.js +222 -0
  81. package/dist/components/weekend-panel.d.ts +44 -0
  82. package/dist/components/weekend-panel.js +231 -0
  83. package/package.json +1 -1
  84. package/src/components/card.tsx +44 -1
  85. package/src/components/category-deck.stories.tsx +96 -0
  86. package/src/components/category-deck.tsx +227 -0
  87. package/src/components/concept-card.stories.tsx +80 -0
  88. package/src/components/concept-card.tsx +143 -0
  89. package/src/components/coverflow.stories.tsx +240 -0
  90. package/src/components/coverflow.test.tsx +193 -0
  91. package/src/components/coverflow.tsx +550 -0
  92. package/src/components/day-rail-chip.stories.tsx +145 -0
  93. package/src/components/day-rail-chip.tsx +201 -0
  94. package/src/components/drift-rail.stories.tsx +92 -0
  95. package/src/components/drift-rail.tsx +86 -0
  96. package/src/components/event-card.stories.tsx +248 -0
  97. package/src/components/event-card.test.tsx +188 -0
  98. package/src/components/event-card.tsx +329 -0
  99. package/src/components/event-compact-row.stories.tsx +221 -0
  100. package/src/components/event-compact-row.test.tsx +51 -0
  101. package/src/components/event-compact-row.tsx +270 -0
  102. package/src/components/event-day-header.stories.tsx +124 -0
  103. package/src/components/event-day-header.tsx +180 -0
  104. package/src/components/event-day-separator.stories.tsx +70 -0
  105. package/src/components/event-day-separator.tsx +95 -0
  106. package/src/components/event-detail-panel.stories.tsx +191 -0
  107. package/src/components/event-detail-panel.tsx +360 -0
  108. package/src/components/event-hub-hero.stories.tsx +66 -0
  109. package/src/components/event-hub-hero.tsx +110 -0
  110. package/src/components/event-index-row.stories.tsx +116 -0
  111. package/src/components/event-index-row.tsx +181 -0
  112. package/src/components/event-list-row-wide.stories.tsx +204 -0
  113. package/src/components/event-list-row-wide.tsx +386 -0
  114. package/src/components/event-list-row.stories.tsx +159 -0
  115. package/src/components/event-list-row.tsx +335 -0
  116. package/src/components/event-poster-fallback.stories.tsx +52 -0
  117. package/src/components/event-poster-fallback.tsx +31 -0
  118. package/src/components/event-types.ts +137 -0
  119. package/src/components/events-empty-state.stories.tsx +59 -0
  120. package/src/components/events-empty-state.tsx +131 -0
  121. package/src/components/facet-group.stories.tsx +247 -0
  122. package/src/components/facet-group.test.tsx +225 -0
  123. package/src/components/facet-group.tsx +352 -0
  124. package/src/components/featured-rail-item.stories.tsx +86 -0
  125. package/src/components/featured-rail-item.tsx +153 -0
  126. package/src/components/hour-band.stories.tsx +159 -0
  127. package/src/components/hour-band.tsx +126 -0
  128. package/src/components/hour-group.stories.tsx +100 -0
  129. package/src/components/hour-group.tsx +124 -0
  130. package/src/components/poster-stack.stories.tsx +68 -0
  131. package/src/components/poster-stack.tsx +155 -0
  132. package/src/components/poster-tape.stories.tsx +70 -0
  133. package/src/components/poster-tape.tsx +122 -0
  134. package/src/components/poster-wall.stories.tsx +95 -0
  135. package/src/components/poster-wall.tsx +220 -0
  136. package/src/components/quiet-stretch.stories.tsx +62 -0
  137. package/src/components/quiet-stretch.tsx +115 -0
  138. package/src/components/section-header.stories.tsx +70 -0
  139. package/src/components/section-header.tsx +134 -0
  140. package/src/components/segmented-nav.stories.tsx +118 -0
  141. package/src/components/segmented-nav.tsx +113 -0
  142. package/src/components/skeleton.tsx +18 -0
  143. package/src/components/tag.tsx +11 -1
  144. package/src/components/timeline-band.stories.tsx +206 -0
  145. package/src/components/timeline-band.tsx +207 -0
  146. package/src/components/venue-events-block.stories.tsx +216 -0
  147. package/src/components/venue-events-block.tsx +408 -0
  148. package/src/components/weekend-panel.stories.tsx +92 -0
  149. package/src/components/weekend-panel.tsx +322 -0
  150. package/src/globals.css +19 -0
@@ -0,0 +1,170 @@
1
+ import { textVariants } from './chunk-7BWTYWM3.js';
2
+ import { cn } from './chunk-FEK5XGZW.js';
3
+ import { __objRest, __spreadValues } from './chunk-3GWWZKX7.js';
4
+ import * as React from 'react';
5
+ import { cva } from 'class-variance-authority';
6
+ import { jsx } from 'react/jsx-runtime';
7
+
8
+ var cardVariants = cva(
9
+ "rounded-3xl text-card-foreground transition-[background-color,border-color] duration-[var(--duration-quick)] ease-[var(--ease-standard)]",
10
+ {
11
+ variants: {
12
+ variant: {
13
+ surface: "bg-card border border-border",
14
+ glass: "glass",
15
+ outline: "bg-transparent border border-border",
16
+ muted: "bg-muted border border-transparent",
17
+ // `surface` PLUS elevation. The border is NOT replaced, and that is the
18
+ // whole design of these two.
19
+ //
20
+ // In light mode `--card` is pure white on a 0.986 ground — 1.04:1, a
21
+ // five-in-255 step — so a plain surface is defined by its 1.32:1
22
+ // hairline alone. That is proportionate under a pill and invisible under
23
+ // a panel, which is what "this looks flat" means here: there is no z.
24
+ //
25
+ // But dropping the border to go shadow-only breaks both themes. Every
26
+ // elevation token in this system is downward-offset, so a white
27
+ // shadow-only box has no defined TOP edge on a near-white page and
28
+ // reads as half-drawn. And on the 0.155 dark canvas the shadow is
29
+ // nearly invisible, so `--border` is the only thing left describing the
30
+ // box. The border IS the dark-mode fallback, which is why neither
31
+ // variant needs a `dark:` branch.
32
+ elevated: "bg-card border border-border shadow-[var(--shadow-card)]",
33
+ // The same recipe at panel scale — see `--shadow-panel` for why a
34
+ // bigger box does not simply take the card shadow. Resting elevation
35
+ // only: deliberately absent from `compoundVariants` below, because a
36
+ // several-hundred-pixel slab that translates under the cursor is a
37
+ // wobble rather than a lift. A panel that size delegates interaction to
38
+ // its children.
39
+ elevatedPanel: "bg-card border border-border shadow-[var(--shadow-panel)]"
40
+ },
41
+ size: {
42
+ sm: "[&_[data-slot=card-header]]:p-4 [&_[data-slot=card-content]]:p-4 [&_[data-slot=card-content]]:pt-0 [&_[data-slot=card-footer]]:p-4 [&_[data-slot=card-footer]]:pt-0",
43
+ default: "[&_[data-slot=card-header]]:p-6 [&_[data-slot=card-content]]:p-6 [&_[data-slot=card-content]]:pt-0 [&_[data-slot=card-footer]]:p-6 [&_[data-slot=card-footer]]:pt-0",
44
+ lg: "[&_[data-slot=card-header]]:p-8 [&_[data-slot=card-content]]:p-8 [&_[data-slot=card-content]]:pt-0 [&_[data-slot=card-footer]]:p-8 [&_[data-slot=card-footer]]:pt-0"
45
+ },
46
+ // Interactive variant follows v1.0 `press-response` archetype:
47
+ // hover lift via shadow + translate (200ms), press scale-down (instant).
48
+ //
49
+ // The hover SHADOW is not here — it lives in `compoundVariants` below, so
50
+ // it can be expressed relative to the resting elevation. `box-shadow` is
51
+ // a single property, so a flat `hover:shadow-md` REPLACES a resting
52
+ // shadow rather than stepping up from it: an `elevated` card would
53
+ // translate upward while its shadow got tighter, which is physically
54
+ // backwards and reads as a flicker.
55
+ interactive: {
56
+ true: "cursor-pointer transition-[transform,border-color,box-shadow] duration-[var(--duration-quick)] ease-[var(--ease-standard)] hover:border-primary/40 hover:-translate-y-0.5 active:scale-[0.97] active:duration-[var(--duration-instant)] motion-reduce:hover:translate-y-0 motion-reduce:active:scale-100",
57
+ false: ""
58
+ }
59
+ },
60
+ // The first four reproduce the previous `hover:shadow-md` exactly; only
61
+ // `elevated` is new. `elevatedPanel` is absent on purpose — see its note.
62
+ compoundVariants: [
63
+ { variant: "surface", interactive: true, class: "hover:shadow-md" },
64
+ { variant: "glass", interactive: true, class: "hover:shadow-md" },
65
+ { variant: "outline", interactive: true, class: "hover:shadow-md" },
66
+ { variant: "muted", interactive: true, class: "hover:shadow-md" },
67
+ {
68
+ variant: "elevated",
69
+ interactive: true,
70
+ class: "hover:shadow-[var(--shadow-card-hover)]"
71
+ }
72
+ ],
73
+ defaultVariants: {
74
+ variant: "surface",
75
+ size: "default",
76
+ interactive: false
77
+ }
78
+ }
79
+ );
80
+ var Card = React.forwardRef((_a, ref) => {
81
+ var _b = _a, { className, variant, size, interactive } = _b, props = __objRest(_b, ["className", "variant", "size", "interactive"]);
82
+ return /* @__PURE__ */ jsx(
83
+ "div",
84
+ __spreadValues({
85
+ ref,
86
+ "data-slot": "card",
87
+ className: cn(cardVariants({ variant, size, interactive }), className)
88
+ }, props)
89
+ );
90
+ });
91
+ Card.displayName = "Card";
92
+ var CardHeader = React.forwardRef(
93
+ (_a, ref) => {
94
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
95
+ return /* @__PURE__ */ jsx(
96
+ "div",
97
+ __spreadValues({
98
+ ref,
99
+ "data-slot": "card-header",
100
+ className: cn("flex flex-col space-y-1.5 p-6", className)
101
+ }, props)
102
+ );
103
+ }
104
+ );
105
+ CardHeader.displayName = "CardHeader";
106
+ var CardTitle = React.forwardRef(
107
+ (_a, ref) => {
108
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
109
+ return /* @__PURE__ */ jsx(
110
+ "div",
111
+ __spreadValues({
112
+ ref,
113
+ "data-slot": "card-title",
114
+ className: cn(textVariants({ variant: "h4", wrap: "balance" }), className)
115
+ }, props)
116
+ );
117
+ }
118
+ );
119
+ CardTitle.displayName = "CardTitle";
120
+ var CardDescription = React.forwardRef(
121
+ (_a, ref) => {
122
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
123
+ return /* @__PURE__ */ jsx(
124
+ "div",
125
+ __spreadValues({
126
+ ref,
127
+ "data-slot": "card-description",
128
+ className: cn("text-sm", textVariants({ color: "muted", wrap: "pretty" }), className)
129
+ }, props)
130
+ );
131
+ }
132
+ );
133
+ CardDescription.displayName = "CardDescription";
134
+ var CardContent = React.forwardRef(
135
+ (_a, ref) => {
136
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
137
+ return /* @__PURE__ */ jsx("div", __spreadValues({ ref, "data-slot": "card-content", className: cn("p-6 pt-0", className) }, props));
138
+ }
139
+ );
140
+ CardContent.displayName = "CardContent";
141
+ var CardAction = React.forwardRef(
142
+ (_a, ref) => {
143
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
144
+ return /* @__PURE__ */ jsx(
145
+ "div",
146
+ __spreadValues({
147
+ ref,
148
+ "data-slot": "card-action",
149
+ className: cn("col-start-2 row-span-2 row-start-1 self-start justify-self-end", className)
150
+ }, props)
151
+ );
152
+ }
153
+ );
154
+ CardAction.displayName = "CardAction";
155
+ var CardFooter = React.forwardRef(
156
+ (_a, ref) => {
157
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
158
+ return /* @__PURE__ */ jsx(
159
+ "div",
160
+ __spreadValues({
161
+ ref,
162
+ "data-slot": "card-footer",
163
+ className: cn("flex items-center p-6 pt-0", className)
164
+ }, props)
165
+ );
166
+ }
167
+ );
168
+ CardFooter.displayName = "CardFooter";
169
+
170
+ export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, cardVariants };
@@ -1,6 +1,6 @@
1
- import { Tag } from './chunk-VBA45GLP.js';
2
- import { Separator } from './chunk-WSRWFA6K.js';
3
1
  import { PlaceScheduleWeek } from './chunk-VG3PND3D.js';
2
+ import { Separator } from './chunk-WSRWFA6K.js';
3
+ import { Tag } from './chunk-ZDAHKI3A.js';
4
4
  import { Text } from './chunk-7BWTYWM3.js';
5
5
  import { cn } from './chunk-FEK5XGZW.js';
6
6
  import { __spreadProps, __spreadValues } from './chunk-3GWWZKX7.js';
@@ -15,10 +15,20 @@ var tagVariants = cva(
15
15
  success: "border-success/30 bg-success/10 text-success",
16
16
  warning: "border-warning/30 bg-warning/10 text-warning",
17
17
  destructive: "border-destructive/30 bg-destructive/10 text-destructive",
18
- outline: "border-border bg-transparent text-foreground"
18
+ outline: "border-border bg-transparent text-foreground",
19
+ /**
20
+ * Decorative metadata — a tag the reader scans past, not one that
21
+ * labels a state. `outline` at full `text-foreground` is too loud
22
+ * repeated a dozen times down a list, and `default`'s `bg-muted` fill
23
+ * is reserved: in the event row family a FILLED chip means live.
24
+ */
25
+ quiet: "border-border bg-transparent text-muted-foreground"
19
26
  },
20
27
  size: {
21
- sm: "h-5 px-2 text-[10px]",
28
+ // 22px/11px, matching the event row family's chip. 10px was the
29
+ // smallest type in the package and below the floor used everywhere
30
+ // else; there is no surface that wants it.
31
+ sm: "h-[22px] px-2 text-[11px]",
22
32
  default: "h-6 px-2.5",
23
33
  lg: "h-7 px-3 text-sm"
24
34
  }
@@ -3,12 +3,12 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const cardVariants: (props?: ({
6
- variant?: "outline" | "glass" | "muted" | "surface" | null | undefined;
6
+ variant?: "outline" | "glass" | "muted" | "surface" | "elevated" | "elevatedPanel" | null | undefined;
7
7
  size?: "default" | "sm" | "lg" | null | undefined;
8
8
  interactive?: boolean | null | undefined;
9
9
  } & class_variance_authority_types.ClassProp) | undefined) => string;
10
10
  declare const Card: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
11
- variant?: "outline" | "glass" | "muted" | "surface" | null | undefined;
11
+ variant?: "outline" | "glass" | "muted" | "surface" | "elevated" | "elevatedPanel" | null | undefined;
12
12
  size?: "default" | "sm" | "lg" | null | undefined;
13
13
  interactive?: boolean | null | undefined;
14
14
  } & class_variance_authority_types.ClassProp) | undefined) => string> & React.RefAttributes<HTMLDivElement>>;
@@ -1,127 +1,4 @@
1
- import { textVariants } from '../chunk-7BWTYWM3.js';
2
- import { cn } from '../chunk-FEK5XGZW.js';
3
- import { __objRest, __spreadValues } from '../chunk-3GWWZKX7.js';
4
- import * as React from 'react';
5
- import { cva } from 'class-variance-authority';
6
- import { jsx } from 'react/jsx-runtime';
7
-
8
- var cardVariants = cva(
9
- "rounded-3xl text-card-foreground transition-[background-color,border-color] duration-[var(--duration-quick)] ease-[var(--ease-standard)]",
10
- {
11
- variants: {
12
- variant: {
13
- surface: "bg-card border border-border",
14
- glass: "glass",
15
- outline: "bg-transparent border border-border",
16
- muted: "bg-muted border border-transparent"
17
- },
18
- size: {
19
- sm: "[&_[data-slot=card-header]]:p-4 [&_[data-slot=card-content]]:p-4 [&_[data-slot=card-content]]:pt-0 [&_[data-slot=card-footer]]:p-4 [&_[data-slot=card-footer]]:pt-0",
20
- default: "[&_[data-slot=card-header]]:p-6 [&_[data-slot=card-content]]:p-6 [&_[data-slot=card-content]]:pt-0 [&_[data-slot=card-footer]]:p-6 [&_[data-slot=card-footer]]:pt-0",
21
- lg: "[&_[data-slot=card-header]]:p-8 [&_[data-slot=card-content]]:p-8 [&_[data-slot=card-content]]:pt-0 [&_[data-slot=card-footer]]:p-8 [&_[data-slot=card-footer]]:pt-0"
22
- },
23
- // Interactive variant follows v1.0 `press-response` archetype:
24
- // hover lift via shadow + translate (200ms), press scale-down (instant).
25
- interactive: {
26
- true: "cursor-pointer transition-[transform,border-color,box-shadow] duration-[var(--duration-quick)] ease-[var(--ease-standard)] hover:border-primary/40 hover:-translate-y-0.5 hover:shadow-md active:scale-[0.97] active:duration-[var(--duration-instant)] motion-reduce:hover:translate-y-0 motion-reduce:active:scale-100",
27
- false: ""
28
- }
29
- },
30
- defaultVariants: {
31
- variant: "surface",
32
- size: "default",
33
- interactive: false
34
- }
35
- }
36
- );
37
- var Card = React.forwardRef((_a, ref) => {
38
- var _b = _a, { className, variant, size, interactive } = _b, props = __objRest(_b, ["className", "variant", "size", "interactive"]);
39
- return /* @__PURE__ */ jsx(
40
- "div",
41
- __spreadValues({
42
- ref,
43
- "data-slot": "card",
44
- className: cn(cardVariants({ variant, size, interactive }), className)
45
- }, props)
46
- );
47
- });
48
- Card.displayName = "Card";
49
- var CardHeader = React.forwardRef(
50
- (_a, ref) => {
51
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
52
- return /* @__PURE__ */ jsx(
53
- "div",
54
- __spreadValues({
55
- ref,
56
- "data-slot": "card-header",
57
- className: cn("flex flex-col space-y-1.5 p-6", className)
58
- }, props)
59
- );
60
- }
61
- );
62
- CardHeader.displayName = "CardHeader";
63
- var CardTitle = React.forwardRef(
64
- (_a, ref) => {
65
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
66
- return /* @__PURE__ */ jsx(
67
- "div",
68
- __spreadValues({
69
- ref,
70
- "data-slot": "card-title",
71
- className: cn(textVariants({ variant: "h4", wrap: "balance" }), className)
72
- }, props)
73
- );
74
- }
75
- );
76
- CardTitle.displayName = "CardTitle";
77
- var CardDescription = React.forwardRef(
78
- (_a, ref) => {
79
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
80
- return /* @__PURE__ */ jsx(
81
- "div",
82
- __spreadValues({
83
- ref,
84
- "data-slot": "card-description",
85
- className: cn("text-sm", textVariants({ color: "muted", wrap: "pretty" }), className)
86
- }, props)
87
- );
88
- }
89
- );
90
- CardDescription.displayName = "CardDescription";
91
- var CardContent = React.forwardRef(
92
- (_a, ref) => {
93
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
94
- return /* @__PURE__ */ jsx("div", __spreadValues({ ref, "data-slot": "card-content", className: cn("p-6 pt-0", className) }, props));
95
- }
96
- );
97
- CardContent.displayName = "CardContent";
98
- var CardAction = React.forwardRef(
99
- (_a, ref) => {
100
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
101
- return /* @__PURE__ */ jsx(
102
- "div",
103
- __spreadValues({
104
- ref,
105
- "data-slot": "card-action",
106
- className: cn("col-start-2 row-span-2 row-start-1 self-start justify-self-end", className)
107
- }, props)
108
- );
109
- }
110
- );
111
- CardAction.displayName = "CardAction";
112
- var CardFooter = React.forwardRef(
113
- (_a, ref) => {
114
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
115
- return /* @__PURE__ */ jsx(
116
- "div",
117
- __spreadValues({
118
- ref,
119
- "data-slot": "card-footer",
120
- className: cn("flex items-center p-6 pt-0", className)
121
- }, props)
122
- );
123
- }
124
- );
125
- CardFooter.displayName = "CardFooter";
126
-
127
- export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, cardVariants };
1
+ export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, cardVariants } from '../chunk-UXWAOISG.js';
2
+ import '../chunk-7BWTYWM3.js';
3
+ import '../chunk-FEK5XGZW.js';
4
+ import '../chunk-3GWWZKX7.js';
@@ -0,0 +1,50 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+
4
+ type CategoryDeckPoster = {
5
+ src?: string;
6
+ alt?: string;
7
+ /**
8
+ * Rendered in the card instead of an `<img>`. Wins over `src`.
9
+ *
10
+ * The deck was built for event posters, where every card is a photograph.
11
+ * The menu hub fans the same deck over dish categories, and that app renders
12
+ * no menu-item photography on card surfaces — it draws a tinted colour field
13
+ * carrying the item's name. Without a slot, those decks fanned four empty
14
+ * `bg-muted` blocks.
15
+ *
16
+ * Same escape hatch, and the same name-and-precedence rule, as
17
+ * `FeaturedRailItemProps.fallback` and `PosterTapeItem.fallback` — except
18
+ * those two are fallbacks shown when a poster is ABSENT, while this one is a
19
+ * deliberate replacement. Hence `content`, not `fallback`: a caller passing
20
+ * it is choosing what the card is, not what it degrades to.
21
+ */
22
+ content?: React.ReactNode;
23
+ };
24
+ type CategoryDeckLinkProps = {
25
+ href: string;
26
+ className?: string;
27
+ children: React.ReactNode;
28
+ onClick?: (mouseEvent: React.MouseEvent) => void;
29
+ };
30
+ type CategoryDeckProps = {
31
+ name: string;
32
+ /** Caller-composed, e.g. "32 events · /petreceri". */
33
+ meta: string;
34
+ /** Up to four posters, fanned back to front. A poster with neither `content`
35
+ * nor `src` renders a placeholder block. */
36
+ posters: CategoryDeckPoster[];
37
+ href?: string;
38
+ /** Defaults to a plain `<a>`. Pass `next/link` in a Next app. */
39
+ linkComponent?: React.ComponentType<CategoryDeckLinkProps>;
40
+ onClick?: (mouseEvent: React.MouseEvent) => void;
41
+ className?: string;
42
+ };
43
+ declare function CategoryDeck({ name, meta, posters, href, linkComponent: LinkComponent, onClick, className, }: CategoryDeckProps): react_jsx_runtime.JSX.Element;
44
+ type CategoryDeckSkeletonProps = {
45
+ className?: string;
46
+ };
47
+ /** The deck's resting layout — the fan sits at its rest transform, never spread. */
48
+ declare function CategoryDeckSkeleton({ className }: CategoryDeckSkeletonProps): react_jsx_runtime.JSX.Element;
49
+
50
+ export { CategoryDeck, type CategoryDeckLinkProps, type CategoryDeckPoster, type CategoryDeckProps, CategoryDeckSkeleton, type CategoryDeckSkeletonProps };
@@ -0,0 +1,128 @@
1
+ import { Skeleton } from '../chunk-QXHMPJ35.js';
2
+ import { cn } from '../chunk-FEK5XGZW.js';
3
+ import { __objRest, __spreadValues } from '../chunk-3GWWZKX7.js';
4
+ import { ChevronRight } from 'lucide-react';
5
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
6
+
7
+ var DECK_POSTER_COUNT = 4;
8
+ var DECK_TRANSITION = "transition-transform duration-[400ms] ease-[cubic-bezier(0.2,0.8,0.2,1)] motion-reduce:transition-none";
9
+ var DECK_CARD_TRANSFORMS = [
10
+ {
11
+ rest: "[transform:translateX(-50%)_rotate(-9deg)_translateX(-26px)]",
12
+ spread: "group-hover:[transform:translateX(-50%)_rotate(-14deg)_translateX(-64px)_translateY(-6px)] group-focus-visible:[transform:translateX(-50%)_rotate(-14deg)_translateX(-64px)_translateY(-6px)]",
13
+ z: "z-0"
14
+ },
15
+ {
16
+ rest: "[transform:translateX(-50%)_rotate(-3deg)_translateX(-9px)]",
17
+ spread: "group-hover:[transform:translateX(-50%)_rotate(-5deg)_translateX(-22px)_translateY(-10px)] group-focus-visible:[transform:translateX(-50%)_rotate(-5deg)_translateX(-22px)_translateY(-10px)]",
18
+ z: "z-[1]"
19
+ },
20
+ {
21
+ rest: "[transform:translateX(-50%)_rotate(3deg)_translateX(9px)]",
22
+ spread: "group-hover:[transform:translateX(-50%)_rotate(5deg)_translateX(22px)_translateY(-10px)] group-focus-visible:[transform:translateX(-50%)_rotate(5deg)_translateX(22px)_translateY(-10px)]",
23
+ z: "z-[1]"
24
+ },
25
+ {
26
+ rest: "[transform:translateX(-50%)_rotate(9deg)_translateX(26px)]",
27
+ spread: "group-hover:[transform:translateX(-50%)_rotate(14deg)_translateX(64px)_translateY(-6px)] group-focus-visible:[transform:translateX(-50%)_rotate(14deg)_translateX(64px)_translateY(-6px)]",
28
+ z: "z-[2]"
29
+ }
30
+ ];
31
+ function DefaultLink(_a) {
32
+ var _b = _a, { href } = _b, props = __objRest(_b, ["href"]);
33
+ return /* @__PURE__ */ jsx("a", __spreadValues({ href }, props));
34
+ }
35
+ function CategoryDeck({
36
+ name,
37
+ meta,
38
+ posters,
39
+ href,
40
+ linkComponent: LinkComponent = DefaultLink,
41
+ onClick,
42
+ className
43
+ }) {
44
+ const slots = Array.from(
45
+ { length: DECK_POSTER_COUNT },
46
+ (_, index) => {
47
+ var _a;
48
+ return (_a = posters[index]) != null ? _a : {};
49
+ }
50
+ );
51
+ const body = /* @__PURE__ */ jsxs(Fragment, { children: [
52
+ /* @__PURE__ */ jsx("div", { className: "relative h-[150px] sm:h-[186px]", "aria-hidden": true, children: slots.map((poster, index) => {
53
+ var _a;
54
+ const transform = DECK_CARD_TRANSFORMS[index];
55
+ return /* @__PURE__ */ jsx(
56
+ "div",
57
+ {
58
+ className: cn(
59
+ "absolute left-1/2 top-0 aspect-[4/5] w-24 overflow-hidden rounded-[10px] bg-muted",
60
+ "shadow-[0_10px_26px_color-mix(in_oklch,var(--foreground)_18%,transparent)]",
61
+ "sm:w-[120px]",
62
+ transform.rest,
63
+ transform.spread,
64
+ transform.z,
65
+ DECK_TRANSITION
66
+ ),
67
+ children: poster.content ? poster.content : poster.src ? (
68
+ // eslint-disable-next-line @next/next/no-img-element
69
+ /* @__PURE__ */ jsx(
70
+ "img",
71
+ {
72
+ src: poster.src,
73
+ alt: (_a = poster.alt) != null ? _a : "",
74
+ loading: "lazy",
75
+ decoding: "async",
76
+ className: "h-full w-full object-cover"
77
+ }
78
+ )
79
+ ) : /* @__PURE__ */ jsx("div", { className: "h-full w-full bg-muted" })
80
+ },
81
+ index
82
+ );
83
+ }) }),
84
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-[9px] pt-3.5", children: [
85
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
86
+ /* @__PURE__ */ jsx("div", { className: "truncate text-[14.5px] font-extrabold tracking-[-0.015em] sm:text-base", children: name }),
87
+ /* @__PURE__ */ jsx("div", { className: "truncate font-mono text-[11.5px] text-muted-foreground", children: meta })
88
+ ] }),
89
+ /* @__PURE__ */ jsx(ChevronRight, { className: "ml-auto h-4 w-4 shrink-0 text-muted-foreground", "aria-hidden": true })
90
+ ] })
91
+ ] });
92
+ const rootClasses = cn(
93
+ "group flex min-w-0 flex-col text-left",
94
+ (href || onClick) && "cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 rounded-xl",
95
+ className
96
+ );
97
+ if (href) {
98
+ return /* @__PURE__ */ jsx(LinkComponent, { href, className: rootClasses, onClick, children: body });
99
+ }
100
+ if (onClick) {
101
+ return /* @__PURE__ */ jsx("button", { type: "button", className: rootClasses, onClick, children: body });
102
+ }
103
+ return /* @__PURE__ */ jsx("div", { className: rootClasses, children: body });
104
+ }
105
+ function CategoryDeckSkeleton({ className }) {
106
+ return /* @__PURE__ */ jsxs("div", { "aria-hidden": "true", className: cn("flex min-w-0 flex-col", className), children: [
107
+ /* @__PURE__ */ jsx("div", { className: "relative h-[150px] sm:h-[186px]", children: DECK_CARD_TRANSFORMS.map((transform, index) => /* @__PURE__ */ jsx(
108
+ Skeleton,
109
+ {
110
+ className: cn(
111
+ "absolute left-1/2 top-0 aspect-[4/5] w-24 rounded-[10px] sm:w-[120px]",
112
+ transform.rest,
113
+ transform.z
114
+ )
115
+ },
116
+ index
117
+ )) }),
118
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-[9px] pt-3.5", children: [
119
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
120
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-[14.5px] w-24 sm:h-4 sm:w-28" }),
121
+ /* @__PURE__ */ jsx(Skeleton, { className: "mt-1.5 h-[11.5px] w-32" })
122
+ ] }),
123
+ /* @__PURE__ */ jsx(Skeleton, { className: "ml-auto h-4 w-4 shrink-0 rounded-full" })
124
+ ] })
125
+ ] });
126
+ }
127
+
128
+ export { CategoryDeck, CategoryDeckSkeleton };
@@ -0,0 +1,43 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React$1 from 'react';
3
+
4
+ /**
5
+ * ConceptCard — the recurring-series cover card (e.g. a weekly party
6
+ * concept), a wide 2:1 image with a bottom scrim carrying a kind pill,
7
+ * a composed date/venue/count line and the title.
8
+ *
9
+ * Same contract as `EventCard`: DS-owned props, plain `<img>`, anchor
10
+ * whenever `href` is given. Absent `coverUrl` falls back to a flat
11
+ * `bg-muted` block, same treatment `EventCard` gives a missing poster.
12
+ */
13
+ type ConceptCardLinkProps = {
14
+ href: string;
15
+ className?: string;
16
+ children: React.ReactNode;
17
+ onClick?: (mouseEvent: React.MouseEvent) => void;
18
+ };
19
+ type ConceptCardProps = {
20
+ title: string;
21
+ /**
22
+ * The whole date/venue/count line, composed by the caller, e.g. "Every
23
+ * Saturday · Flying Circus · 4 dates" — clause order is locale-dependent.
24
+ */
25
+ meta: string;
26
+ /** Label plus its icon, e.g. `<><PartyPopper .../> Party</>`. */
27
+ kind: React.ReactNode;
28
+ coverUrl?: string;
29
+ href?: string;
30
+ /** Defaults to a plain `<a>`. Pass `next/link` in a Next app. */
31
+ linkComponent?: React.ComponentType<ConceptCardLinkProps>;
32
+ onClick?: (mouseEvent: React.MouseEvent) => void;
33
+ className?: string;
34
+ /** Forwarded to the cover's `loading` attribute (`"eager"` when true). */
35
+ priority?: boolean;
36
+ };
37
+ declare const ConceptCard: React$1.NamedExoticComponent<ConceptCardProps>;
38
+ type ConceptCardSkeletonProps = {
39
+ className?: string;
40
+ };
41
+ declare function ConceptCardSkeleton({ className }: ConceptCardSkeletonProps): react_jsx_runtime.JSX.Element;
42
+
43
+ export { ConceptCard, type ConceptCardLinkProps, type ConceptCardProps, ConceptCardSkeleton, type ConceptCardSkeletonProps };
@@ -0,0 +1,81 @@
1
+ import { Skeleton } from '../chunk-QXHMPJ35.js';
2
+ import { cn } from '../chunk-FEK5XGZW.js';
3
+ import { __objRest, __spreadValues } from '../chunk-3GWWZKX7.js';
4
+ import { memo, useState } from 'react';
5
+ import { Calendar } from 'lucide-react';
6
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
+
8
+ function DefaultLink(_a) {
9
+ var _b = _a, { href } = _b, props = __objRest(_b, ["href"]);
10
+ return /* @__PURE__ */ jsx("a", __spreadValues({ href }, props));
11
+ }
12
+ var ConceptCard = memo(function ConceptCard2({
13
+ title,
14
+ meta,
15
+ kind,
16
+ coverUrl,
17
+ href,
18
+ linkComponent: LinkComponent = DefaultLink,
19
+ onClick,
20
+ className,
21
+ priority
22
+ }) {
23
+ const [imgError, setImgError] = useState(false);
24
+ const showCover = !!coverUrl && !imgError;
25
+ const body = /* @__PURE__ */ jsxs(Fragment, { children: [
26
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-muted", children: showCover && // eslint-disable-next-line @next/next/no-img-element
27
+ /* @__PURE__ */ jsx(
28
+ "img",
29
+ {
30
+ src: coverUrl,
31
+ alt: title,
32
+ title,
33
+ loading: priority ? "eager" : "lazy",
34
+ decoding: "async",
35
+ className: "h-full w-full object-cover",
36
+ onError: () => setImgError(true)
37
+ }
38
+ ) }),
39
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-x-0 bottom-0 z-[1] h-[60%] bg-gradient-to-t from-black/90 via-black/60 to-transparent" }),
40
+ /* @__PURE__ */ jsx("span", { className: "absolute left-2 top-2 z-[2] inline-flex items-center gap-1 rounded-md bg-black/50 px-2 py-1 text-[11px] font-semibold text-white", children: kind }),
41
+ /* @__PURE__ */ jsxs("div", { className: "relative z-[2] mt-auto flex w-full flex-col gap-0.5 p-2.5 text-white", children: [
42
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 text-[11px] font-medium text-white/85", children: [
43
+ /* @__PURE__ */ jsx(Calendar, { className: "h-3 w-3 shrink-0", "aria-hidden": true }),
44
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: meta })
45
+ ] }),
46
+ /* @__PURE__ */ jsx("div", { className: "line-clamp-1 text-[14px] font-semibold leading-[1.25]", children: title })
47
+ ] })
48
+ ] });
49
+ const rootClasses = cn(
50
+ "relative flex aspect-[2/1] flex-col overflow-hidden rounded-xl text-left",
51
+ (href || onClick) && "cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
52
+ className
53
+ );
54
+ if (href) {
55
+ return /* @__PURE__ */ jsx(LinkComponent, { href, className: rootClasses, onClick, children: body });
56
+ }
57
+ if (onClick) {
58
+ return /* @__PURE__ */ jsx("button", { type: "button", className: rootClasses, onClick, children: body });
59
+ }
60
+ return /* @__PURE__ */ jsx("div", { className: rootClasses, children: body });
61
+ });
62
+ function ConceptCardSkeleton({ className }) {
63
+ return /* @__PURE__ */ jsxs(
64
+ "div",
65
+ {
66
+ "aria-hidden": "true",
67
+ className: cn("relative flex aspect-[2/1] flex-col overflow-hidden rounded-xl", className),
68
+ children: [
69
+ /* @__PURE__ */ jsx(Skeleton, { className: "absolute inset-0 rounded-none" }),
70
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-x-0 bottom-0 z-[1] h-[60%] bg-gradient-to-t from-black/90 via-black/60 to-transparent" }),
71
+ /* @__PURE__ */ jsx(Skeleton, { className: "absolute left-2 top-2 z-[2] h-[26px] w-16 rounded-md bg-white/20" }),
72
+ /* @__PURE__ */ jsxs("div", { className: "relative z-[2] mt-auto flex w-full flex-col gap-1 p-2.5", children: [
73
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-[11px] w-24 bg-white/15" }),
74
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-[14px] w-2/3 bg-white/20" })
75
+ ] })
76
+ ]
77
+ }
78
+ );
79
+ }
80
+
81
+ export { ConceptCard, ConceptCardSkeleton };