@bearmenu/ui 0.8.17 → 0.8.18

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 (71) hide show
  1. package/dist/{chunk-WYTJR2YU.js → chunk-5CPBSNWQ.js} +6 -1
  2. package/dist/{chunk-54FQQZZJ.js → chunk-EQYB4Q77.js} +1 -1
  3. package/dist/chunk-LYREUZH6.js +156 -0
  4. package/dist/chunk-PW247TG2.js +81 -0
  5. package/dist/components/alert.d.ts +2 -2
  6. package/dist/components/badge.d.ts +1 -1
  7. package/dist/components/button.d.ts +1 -1
  8. package/dist/components/card.d.ts +2 -2
  9. package/dist/components/command.d.ts +15 -15
  10. package/dist/components/concept-compare-rail.js +2 -2
  11. package/dist/components/concept-compare.js +2 -2
  12. package/dist/components/event-card.d.ts +22 -4
  13. package/dist/components/event-card.js +95 -50
  14. package/dist/components/event-day-header.d.ts +5 -3
  15. package/dist/components/event-day-header.js +12 -4
  16. package/dist/components/event-door.d.ts +41 -0
  17. package/dist/components/event-door.js +65 -0
  18. package/dist/components/event-hub-hero.d.ts +10 -2
  19. package/dist/components/event-hub-hero.js +11 -5
  20. package/dist/components/event-tonight-strip.d.ts +50 -0
  21. package/dist/components/event-tonight-strip.js +67 -0
  22. package/dist/components/item.d.ts +2 -2
  23. package/dist/components/menu-hub-hero.d.ts +7 -1
  24. package/dist/components/menu-hub-hero.js +2 -1
  25. package/dist/components/place-card.js +1 -1
  26. package/dist/components/poster-stack.d.ts +36 -3
  27. package/dist/components/poster-stack.js +49 -18
  28. package/dist/components/snap-rail.d.ts +2 -2
  29. package/dist/components/snap-rail.js +1 -1
  30. package/dist/components/spinner.d.ts +2 -2
  31. package/dist/components/tag.d.ts +2 -2
  32. package/dist/components/text.d.ts +3 -3
  33. package/dist/components/timeline-day.d.ts +54 -0
  34. package/dist/components/timeline-day.js +65 -0
  35. package/dist/components/timeline-hour-puck.d.ts +47 -0
  36. package/dist/components/timeline-hour-puck.js +3 -0
  37. package/dist/components/timeline-hour.d.ts +96 -0
  38. package/dist/components/{timeline-band.js → timeline-hour.js} +2 -1
  39. package/dist/components/timeline-playhead.js +1 -3
  40. package/package.json +1 -1
  41. package/src/components/event-card.tsx +70 -13
  42. package/src/components/event-day-header.tsx +19 -7
  43. package/src/components/event-door.stories.tsx +88 -0
  44. package/src/components/event-door.tsx +97 -0
  45. package/src/components/event-hub-hero.tsx +21 -3
  46. package/src/components/event-tonight-strip.stories.tsx +78 -0
  47. package/src/components/event-tonight-strip.test.tsx +59 -0
  48. package/src/components/event-tonight-strip.tsx +134 -0
  49. package/src/components/menu-hub-hero.test.tsx +13 -0
  50. package/src/components/menu-hub-hero.tsx +9 -2
  51. package/src/components/poster-stack.stories.tsx +43 -1
  52. package/src/components/poster-stack.tsx +98 -19
  53. package/src/components/snap-rail.tsx +6 -1
  54. package/src/components/timeline-day.stories.tsx +201 -0
  55. package/src/components/timeline-day.test.tsx +78 -0
  56. package/src/components/timeline-day.tsx +114 -0
  57. package/src/components/timeline-hour-puck.tsx +139 -0
  58. package/src/components/timeline-hour.tsx +266 -0
  59. package/src/components/timeline-playhead.tsx +1 -1
  60. package/dist/chunk-NSNEANOQ.js +0 -104
  61. package/dist/components/hour-band.d.ts +0 -66
  62. package/dist/components/hour-band.js +0 -81
  63. package/dist/components/hour-group.d.ts +0 -67
  64. package/dist/components/hour-group.js +0 -59
  65. package/dist/components/timeline-band.d.ts +0 -64
  66. package/src/components/hour-band.stories.tsx +0 -182
  67. package/src/components/hour-band.tsx +0 -146
  68. package/src/components/hour-group.stories.tsx +0 -100
  69. package/src/components/hour-group.tsx +0 -124
  70. package/src/components/timeline-band.stories.tsx +0 -206
  71. package/src/components/timeline-band.tsx +0 -247
@@ -12,6 +12,9 @@ var snapRailVariants = cva(
12
12
  {
13
13
  variants: {
14
14
  itemWidth: {
15
+ /** Square door tiles — three and a third per phone screen, so the
16
+ * cut fourth says "swipe"; more as the viewport widens. */
17
+ xs: "[&>*]:w-[30%] sm:[&>*]:w-[22%] md:[&>*]:w-[18%]",
15
18
  sm: "[&>*]:w-[46%]",
16
19
  md: "[&>*]:w-[60%]",
17
20
  lg: "[&>*]:w-[80%]",
@@ -25,7 +28,9 @@ var snapRailVariants = cva(
25
28
  bleed: {
26
29
  none: "",
27
30
  card: "-mx-3.5 px-3.5 scroll-px-3.5",
28
- page: "-mx-4 px-4 scroll-px-4"
31
+ /** The consumer's page gutter, read from `--page-gutter` (16px on a
32
+ * phone, 24px from md) — a fixed `-mx-4` was 8px short at md. */
33
+ page: "-mx-[var(--page-gutter,1rem)] px-[var(--page-gutter,1rem)] scroll-px-[var(--page-gutter,1rem)]"
29
34
  }
30
35
  },
31
36
  defaultVariants: {
@@ -1,4 +1,4 @@
1
- import { SnapRail, SnapRailDots } from './chunk-WYTJR2YU.js';
1
+ import { SnapRail, SnapRailDots } from './chunk-5CPBSNWQ.js';
2
2
  import { PhotoGround } from './chunk-SWD6CJ35.js';
3
3
  import { cn } from './chunk-FEK5XGZW.js';
4
4
  import * as React from 'react';
@@ -0,0 +1,156 @@
1
+ import { TimelineHourPuck, TIMELINE_MOBILE_GUTTER_CLASS } from './chunk-PW247TG2.js';
2
+ import { Separator } from './chunk-NWZGSLPU.js';
3
+ import { Skeleton } from './chunk-XBBEX4SF.js';
4
+ import { cn } from './chunk-FEK5XGZW.js';
5
+ import * as React from 'react';
6
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
7
+
8
+ var HEADING_CENTRE_LG = "lg:top-[30px]";
9
+ function TimelineHour({
10
+ time,
11
+ role = "hour",
12
+ isLive,
13
+ liveLabel,
14
+ countLabel,
15
+ note,
16
+ layout = "cards",
17
+ children,
18
+ overflow,
19
+ className
20
+ }) {
21
+ const isHero = role === "hero";
22
+ const isContinuation = role === "continuation";
23
+ const isUnscheduled = role === "unscheduled";
24
+ const hasStation = !isUnscheduled;
25
+ const isCards = layout === "cards";
26
+ const items = React.Children.toArray(children);
27
+ const overflowItems = React.Children.toArray(overflow);
28
+ return /* @__PURE__ */ jsxs(
29
+ "section",
30
+ {
31
+ "data-timeline-hour": role,
32
+ className: cn(
33
+ "relative flex flex-col pt-2.5",
34
+ // The phone gutter: the puck's column plus the 12px gap `HourBand` had.
35
+ hasStation && "pl-[70px] lg:pl-0",
36
+ "lg:pt-[22px]",
37
+ isHero ? cn(
38
+ // The lane. Placed by the grid, not by source order; `self-start`
39
+ // is load-bearing — a stretched item would be the day's full
40
+ // height and never stick.
41
+ // Longhands, not `grid-row`: a `/` inside an arbitrary value
42
+ // collides with the opacity-modifier parse.
43
+ "lg:col-start-1 lg:row-start-1 lg:[grid-row-end:span_var(--timeline-rows)] lg:self-start",
44
+ "lg:sticky lg:top-[var(--timeline-lane-top)] lg:pt-3.5"
45
+ ) : "lg:col-start-3",
46
+ className
47
+ ),
48
+ children: [
49
+ hasStation && /* @__PURE__ */ jsxs(Fragment, { children: [
50
+ /* @__PURE__ */ jsx(
51
+ TimelineHourPuck,
52
+ {
53
+ time,
54
+ isLive,
55
+ liveLabel,
56
+ className: cn(
57
+ "absolute left-0 top-2.5",
58
+ TIMELINE_MOBILE_GUTTER_CLASS,
59
+ // Out on the spine, centred on the heading rule.
60
+ "lg:left-[calc(var(--timeline-spine)*-0.5)] lg:w-0 lg:-translate-y-1/2",
61
+ HEADING_CENTRE_LG,
62
+ isContinuation && "invisible lg:visible",
63
+ isHero && "lg:hidden"
64
+ )
65
+ }
66
+ ),
67
+ /* @__PURE__ */ jsx(
68
+ Separator,
69
+ {
70
+ orientation: "vertical",
71
+ className: cn(
72
+ "absolute -bottom-2.5 left-[29px] top-10 h-auto -translate-x-1/2 lg:hidden",
73
+ isLive && "bg-success/30"
74
+ )
75
+ }
76
+ )
77
+ ] }),
78
+ /* @__PURE__ */ jsxs(
79
+ "div",
80
+ {
81
+ className: cn(
82
+ "items-center gap-2.5",
83
+ isUnscheduled ? "flex h-4" : "hidden lg:flex lg:h-4",
84
+ isHero && "lg:hidden"
85
+ ),
86
+ children: [
87
+ isUnscheduled && /* @__PURE__ */ jsx("span", { className: "font-mono text-[11.5px] text-muted-foreground tabular-nums lg:text-xs", children: time }),
88
+ /* @__PURE__ */ jsx(Separator, { className: "flex-1" }),
89
+ countLabel && /* @__PURE__ */ jsx("span", { className: "text-[10.5px] text-muted-foreground/70 lg:text-[11px]", children: countLabel })
90
+ ]
91
+ }
92
+ ),
93
+ /* @__PURE__ */ jsx(
94
+ "div",
95
+ {
96
+ className: cn(
97
+ "flex min-w-0 flex-col",
98
+ isCards && "gap-4 pb-2 lg:grid lg:grid-cols-2 lg:gap-5 lg:pb-0 lg:pt-3.5 xl:grid-cols-3",
99
+ isCards && isHero && "lg:flex lg:pt-0",
100
+ isUnscheduled && isCards && "pt-3.5"
101
+ ),
102
+ children: isCards ? items : items.map((child, index) => /* @__PURE__ */ jsxs("div", { children: [
103
+ index > 0 && /* @__PURE__ */ jsx(Separator, {}),
104
+ child
105
+ ] }, index))
106
+ }
107
+ ),
108
+ overflowItems.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-4 pb-2 lg:gap-0 lg:pb-0 lg:pt-2", children: overflowItems.map((child, index) => /* @__PURE__ */ jsxs("div", { children: [
109
+ index > 0 && /* @__PURE__ */ jsx(Separator, { className: "hidden lg:block" }),
110
+ child
111
+ ] }, index)) }),
112
+ note && /* @__PURE__ */ jsx("p", { className: "pt-[9px] text-[11.5px] text-muted-foreground", children: note })
113
+ ]
114
+ }
115
+ );
116
+ }
117
+ function TimelineHourSkeleton({ cardCount = 2, className }) {
118
+ return /* @__PURE__ */ jsxs(
119
+ "div",
120
+ {
121
+ "aria-hidden": "true",
122
+ className: cn("relative flex flex-col pl-[70px] pt-2.5 lg:col-start-3 lg:pl-0 lg:pt-[22px]", className),
123
+ children: [
124
+ /* @__PURE__ */ jsx(
125
+ Skeleton,
126
+ {
127
+ className: cn(
128
+ "absolute left-0 top-2.5 h-6 rounded-[7px]",
129
+ TIMELINE_MOBILE_GUTTER_CLASS,
130
+ "lg:left-[calc(var(--timeline-spine)*-0.5)] lg:h-[26px] lg:w-14 lg:-translate-x-1/2 lg:-translate-y-1/2",
131
+ HEADING_CENTRE_LG
132
+ )
133
+ }
134
+ ),
135
+ /* @__PURE__ */ jsx(
136
+ Separator,
137
+ {
138
+ orientation: "vertical",
139
+ className: "absolute -bottom-2.5 left-[29px] top-10 h-auto -translate-x-1/2 lg:hidden"
140
+ }
141
+ ),
142
+ /* @__PURE__ */ jsxs("div", { className: "hidden h-4 items-center gap-2.5 lg:flex", children: [
143
+ /* @__PURE__ */ jsx(Separator, { className: "flex-1" }),
144
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-3 w-12" })
145
+ ] }),
146
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-4 pb-2 lg:grid lg:grid-cols-2 lg:gap-5 lg:pb-0 lg:pt-3.5 xl:grid-cols-3", children: Array.from({ length: cardCount }, (_, index) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
147
+ /* @__PURE__ */ jsx(Skeleton, { className: "aspect-[4/3] w-full rounded-xl" }),
148
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-3.5 w-4/5" }),
149
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-3 w-1/2" })
150
+ ] }, index)) })
151
+ ]
152
+ }
153
+ );
154
+ }
155
+
156
+ export { TimelineHour, TimelineHourSkeleton };
@@ -0,0 +1,81 @@
1
+ import { cn } from './chunk-FEK5XGZW.js';
2
+ import { Radio } from 'lucide-react';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+
5
+ var LIVE_PUCK_PULSE_CLASS = "bm-timeline-live-puck-pulse";
6
+ var TIMELINE_MOBILE_GUTTER_CLASS = "w-[58px]";
7
+ function TimelineHourPuck({
8
+ time,
9
+ isLive,
10
+ liveLabel,
11
+ variant = "responsive",
12
+ className
13
+ }) {
14
+ const chipClasses = cn(
15
+ "inline-flex h-6 min-w-[58px] items-center justify-center gap-1 rounded-[7px] border border-transparent px-1 text-[12px] font-medium",
16
+ isLive ? cn("bg-success/10 text-success", LIVE_PUCK_PULSE_CLASS) : "bg-muted text-foreground"
17
+ );
18
+ const stationClasses = cn(
19
+ "rounded-[7px] border bg-background px-[7px] py-[3px] text-[12.5px] font-medium",
20
+ isLive ? cn("border-success/40 text-success", LIVE_PUCK_PULSE_CLASS) : "border-border text-foreground"
21
+ );
22
+ const glyphClasses = "h-2.5 w-2.5 shrink-0";
23
+ const labelHiddenClasses = "sr-only";
24
+ const labelStationClasses = cn(
25
+ "absolute top-[calc(100%+6px)] whitespace-nowrap bg-background px-1",
26
+ "text-[9.5px] font-extrabold tracking-[0.08em] text-success"
27
+ );
28
+ const labelResponsiveClasses = cn(
29
+ "absolute -m-px h-px w-px overflow-hidden whitespace-nowrap p-0 [clip:rect(0,0,0,0)]",
30
+ "lg:m-0 lg:h-auto lg:w-auto lg:overflow-visible lg:px-1 lg:[clip:auto]",
31
+ "lg:top-[calc(100%+6px)] lg:bg-background lg:text-[9.5px] lg:font-extrabold lg:tracking-[0.08em] lg:text-success"
32
+ );
33
+ return /* @__PURE__ */ jsxs("span", { className: cn("relative flex justify-center", className), children: [
34
+ isLive && /* @__PURE__ */ jsx("style", { children: `
35
+ @keyframes ${LIVE_PUCK_PULSE_CLASS} {
36
+ 0%, 100% { box-shadow: 0 0 0 0 color-mix(in oklch, var(--success) 40%, transparent); }
37
+ 50% { box-shadow: 0 0 0 4px color-mix(in oklch, var(--success) 0%, transparent); }
38
+ }
39
+ .${LIVE_PUCK_PULSE_CLASS} {
40
+ animation: ${LIVE_PUCK_PULSE_CLASS} 2.4s ease-in-out infinite;
41
+ }
42
+ @media (prefers-reduced-motion: reduce) {
43
+ .${LIVE_PUCK_PULSE_CLASS} { animation: none; }
44
+ }
45
+ ` }),
46
+ /* @__PURE__ */ jsxs(
47
+ "span",
48
+ {
49
+ className: cn(
50
+ "whitespace-nowrap font-mono tabular-nums",
51
+ variant === "chip" && chipClasses,
52
+ variant === "station" && stationClasses,
53
+ variant === "responsive" && cn(
54
+ chipClasses,
55
+ // The station look from `lg`: bordered, background-filled,
56
+ // no fixed width. Every chip utility above has an `lg:` twin.
57
+ "lg:h-auto lg:min-w-0 lg:gap-0 lg:border-border lg:bg-background lg:px-[7px] lg:py-[3px] lg:text-[12.5px] lg:text-foreground",
58
+ isLive && "lg:border-success/40 lg:bg-background lg:text-success"
59
+ )
60
+ ),
61
+ children: [
62
+ isLive && variant !== "station" && /* @__PURE__ */ jsx(Radio, { className: cn(glyphClasses, variant === "responsive" && "lg:hidden"), "aria-hidden": true }),
63
+ time
64
+ ]
65
+ }
66
+ ),
67
+ isLive && !!liveLabel && /* @__PURE__ */ jsx(
68
+ "span",
69
+ {
70
+ className: cn(
71
+ variant === "chip" && labelHiddenClasses,
72
+ variant === "station" && labelStationClasses,
73
+ variant === "responsive" && labelResponsiveClasses
74
+ ),
75
+ children: liveLabel
76
+ }
77
+ )
78
+ ] });
79
+ }
80
+
81
+ export { TIMELINE_MOBILE_GUTTER_CLASS, TimelineHourPuck };
@@ -3,10 +3,10 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const alertVariants: (props?: ({
6
- variant?: "default" | "destructive" | "warning" | "success" | null | undefined;
6
+ variant?: "success" | "warning" | "default" | "destructive" | null | undefined;
7
7
  } & class_variance_authority_types.ClassProp) | undefined) => string;
8
8
  declare const Alert: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
9
- variant?: "default" | "destructive" | "warning" | "success" | null | undefined;
9
+ variant?: "success" | "warning" | "default" | "destructive" | null | undefined;
10
10
  } & class_variance_authority_types.ClassProp) | undefined) => string> & React.RefAttributes<HTMLDivElement>>;
11
11
  declare const AlertTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & React.RefAttributes<HTMLParagraphElement>>;
12
12
  declare const AlertDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
@@ -4,7 +4,7 @@ import * as React from 'react';
4
4
  import { VariantProps } from 'class-variance-authority';
5
5
 
6
6
  declare const badgeVariants: (props?: ({
7
- variant?: "default" | "destructive" | "warning" | "success" | "outline" | "secondary" | "glass" | "overlay" | "brown" | "onPrimary" | null | undefined;
7
+ variant?: "success" | "warning" | "default" | "destructive" | "outline" | "secondary" | "glass" | "overlay" | "brown" | "onPrimary" | null | undefined;
8
8
  live?: boolean | null | undefined;
9
9
  } & class_variance_authority_types.ClassProp) | undefined) => string;
10
10
  interface BadgeProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {
@@ -3,7 +3,7 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const buttonVariants: (props?: ({
6
- variant?: "default" | "destructive" | "warning" | "link" | "outline" | "secondary" | "ghost" | "glass" | "overlay" | "ink" | "brown" | null | undefined;
6
+ variant?: "link" | "warning" | "default" | "destructive" | "outline" | "secondary" | "ghost" | "glass" | "overlay" | "ink" | "brown" | null | undefined;
7
7
  size?: "default" | "xs" | "sm" | "lg" | "pill" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
8
8
  fullWidth?: boolean | null | undefined;
9
9
  } & class_variance_authority_types.ClassProp) | undefined) => string;
@@ -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?: "muted" | "outline" | "glass" | "surface" | "elevated" | "elevatedPanel" | 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?: "muted" | "outline" | "glass" | "surface" | "elevated" | "elevatedPanel" | 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>>;
@@ -4,11 +4,11 @@ import { DialogProps } from '@radix-ui/react-dialog';
4
4
 
5
5
  declare const Command: React.ForwardRefExoticComponent<Omit<{
6
6
  children?: React.ReactNode;
7
- } & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
7
+ } & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>> & {
8
8
  ref?: React.Ref<HTMLDivElement>;
9
9
  } & {
10
10
  asChild?: boolean;
11
- }, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key"> & {
11
+ }, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild"> & {
12
12
  label?: string;
13
13
  shouldFilter?: boolean;
14
14
  filter?: (value: string, search: string, keywords?: string[]) => number;
@@ -28,61 +28,61 @@ declare const CommandInput: React.ForwardRefExoticComponent<Omit<Omit<Pick<Pick<
28
28
  ref?: React.Ref<HTMLInputElement>;
29
29
  } & {
30
30
  asChild?: boolean;
31
- }, "asChild" | "key" | keyof React.InputHTMLAttributes<HTMLInputElement>>, "onChange" | "type" | "value"> & {
31
+ }, "key" | "asChild" | keyof React.InputHTMLAttributes<HTMLInputElement>>, "onChange" | "type" | "value"> & {
32
32
  value?: string;
33
33
  onValueChange?: (search: string) => void;
34
34
  } & React.RefAttributes<HTMLInputElement>, "ref"> & React.RefAttributes<HTMLInputElement>>;
35
35
  declare const CommandList: React.ForwardRefExoticComponent<Omit<{
36
36
  children?: React.ReactNode;
37
- } & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
37
+ } & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>> & {
38
38
  ref?: React.Ref<HTMLDivElement>;
39
39
  } & {
40
40
  asChild?: boolean;
41
- }, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key"> & {
41
+ }, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild"> & {
42
42
  label?: string;
43
43
  } & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
44
44
  declare const CommandEmpty: React.ForwardRefExoticComponent<Omit<{
45
45
  children?: React.ReactNode;
46
- } & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
46
+ } & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>> & {
47
47
  ref?: React.Ref<HTMLDivElement>;
48
48
  } & {
49
49
  asChild?: boolean;
50
- }, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key"> & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
50
+ }, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild"> & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
51
51
  declare const CommandLoading: React.ForwardRefExoticComponent<Omit<{
52
52
  children?: React.ReactNode;
53
- } & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
53
+ } & Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>> & {
54
54
  ref?: React.Ref<HTMLDivElement>;
55
55
  } & {
56
56
  asChild?: boolean;
57
- }, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key"> & {
57
+ }, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild"> & {
58
58
  progress?: number;
59
59
  label?: string;
60
60
  } & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
61
61
  declare const CommandGroup: React.ForwardRefExoticComponent<Omit<{
62
62
  children?: React.ReactNode;
63
- } & Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
63
+ } & Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>> & {
64
64
  ref?: React.Ref<HTMLDivElement>;
65
65
  } & {
66
66
  asChild?: boolean;
67
- }, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key">, "heading" | "value"> & {
67
+ }, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild">, "heading" | "value"> & {
68
68
  heading?: React.ReactNode;
69
69
  value?: string;
70
70
  forceMount?: boolean;
71
71
  } & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
72
- declare const CommandSeparator: React.ForwardRefExoticComponent<Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
72
+ declare const CommandSeparator: React.ForwardRefExoticComponent<Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>> & {
73
73
  ref?: React.Ref<HTMLDivElement>;
74
74
  } & {
75
75
  asChild?: boolean;
76
- }, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key"> & {
76
+ }, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild"> & {
77
77
  alwaysRender?: boolean;
78
78
  } & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
79
79
  declare const CommandItem: React.ForwardRefExoticComponent<Omit<{
80
80
  children?: React.ReactNode;
81
- } & Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & {
81
+ } & Omit<Pick<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>> & {
82
82
  ref?: React.Ref<HTMLDivElement>;
83
83
  } & {
84
84
  asChild?: boolean;
85
- }, keyof React.HTMLAttributes<HTMLDivElement> | "asChild" | "key">, "onSelect" | "disabled" | "value"> & {
85
+ }, "key" | keyof React.HTMLAttributes<HTMLDivElement> | "asChild">, "onSelect" | "disabled" | "value"> & {
86
86
  disabled?: boolean;
87
87
  onSelect?: (value: string) => void;
88
88
  value?: string;
@@ -1,5 +1,5 @@
1
- export { ConceptCompareRail } from '../chunk-54FQQZZJ.js';
2
- import '../chunk-WYTJR2YU.js';
1
+ export { ConceptCompareRail } from '../chunk-EQYB4Q77.js';
2
+ import '../chunk-5CPBSNWQ.js';
3
3
  import '../chunk-SWD6CJ35.js';
4
4
  import '../chunk-FEK5XGZW.js';
5
5
  import '../chunk-MMUBH76A.js';
@@ -1,6 +1,6 @@
1
1
  import { Separator } from '../chunk-NWZGSLPU.js';
2
- import { ConceptCompareRail } from '../chunk-54FQQZZJ.js';
3
- import '../chunk-WYTJR2YU.js';
2
+ import { ConceptCompareRail } from '../chunk-EQYB4Q77.js';
3
+ import '../chunk-5CPBSNWQ.js';
4
4
  import { PhotoGround, PHOTO_GROUND } from '../chunk-SWD6CJ35.js';
5
5
  import { Skeleton } from '../chunk-XBBEX4SF.js';
6
6
  import { cn } from '../chunk-FEK5XGZW.js';
@@ -37,8 +37,22 @@ type EventCardProps = {
37
37
  * `Coverflow`) — it crops less than `3/4` and is not the same as it.
38
38
  */
39
39
  posterAspect?: "4/3" | "3/4" | "4/5";
40
- /** Larger title — the featured/highlight slot. Never a clamp: the title wraps in full either way. */
41
- emphasis?: boolean;
40
+ /**
41
+ * Larger title — the featured/highlight slot. Never a clamp: the title
42
+ * wraps in full either way. `"lg"` applies it from the `lg` breakpoint
43
+ * only: the timeline's day hero is an ordinary card in the phone column and
44
+ * the lane's feature poster on desktop, one node.
45
+ */
46
+ emphasis?: boolean | "lg";
47
+ /**
48
+ * `card` (default) at every width. `row-lg`: the card below `lg`, and from
49
+ * `lg` the compact row `EventCompactRow` draws — a 64px portrait poster
50
+ * beside the text, overlay pills off, the fee as a chip on the tags row.
51
+ * The timeline demotes an hour's later events to rows on desktop only, and
52
+ * a server render cannot swap components per viewport; this is the one
53
+ * node that paints both.
54
+ */
55
+ density?: "card" | "row-lg";
42
56
  /** Top-left overlay pill (the design's "Busy" hype marker). Include its icon. */
43
57
  badge?: React.ReactNode;
44
58
  /** Bottom-left overlay pill naming the category. Include its icon. */
@@ -59,8 +73,12 @@ type EventCardProps = {
59
73
  * locale, and "is this live" depends on the app's clock, not the DS's.
60
74
  */
61
75
  liveStatus?: string;
62
- /** Hide the day/time line — the timeline supplies its own hour heading. */
63
- hideWhen?: boolean;
76
+ /**
77
+ * Hide the day/time line — the timeline supplies its own hour heading.
78
+ * `"below-lg"` hides it on the phone only: the desktop lane's hero sits
79
+ * beside whatever hour is passing and has to carry its own start time.
80
+ */
81
+ hideWhen?: boolean | "below-lg";
64
82
  /**
65
83
  * Already over — dims the poster, mutes the title and shows the `endedLabel`
66
84
  * chip. Never row-level opacity, which composites the text below AA. Same