@bearmenu/ui 0.6.1 → 0.7.0

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 (69) hide show
  1. package/dist/chunk-A5ONAJCE.js +102 -0
  2. package/dist/chunk-AV777R4G.js +43 -0
  3. package/dist/{chunk-WKMLZDUT.js → chunk-FRPPIXMY.js} +1 -1
  4. package/dist/{chunk-PSR7N36A.js → chunk-HCM6LKM5.js} +1 -1
  5. package/dist/{chunk-YJ6OBKZJ.js → chunk-TL4YU2O5.js} +10 -3
  6. package/dist/chunk-UX6SWAKH.js +320 -0
  7. package/dist/{chunk-7PPCH42H.js → chunk-VQNDZVI7.js} +1 -1
  8. package/dist/chunk-WSRWFA6K.js +26 -0
  9. package/dist/chunk-YLNYXPIH.js +61 -0
  10. package/dist/components/accordion.js +1 -1
  11. package/dist/components/badge.d.ts +2 -1
  12. package/dist/components/badge.js +1 -1
  13. package/dist/components/card.js +127 -4
  14. package/dist/components/combobox.js +2 -2
  15. package/dist/components/command.js +2 -2
  16. package/dist/components/currency-input.js +1 -1
  17. package/dist/components/date-input.js +1 -1
  18. package/dist/components/dialog.js +1 -1
  19. package/dist/components/filter-category-row.d.ts +13 -0
  20. package/dist/components/filter-category-row.js +44 -0
  21. package/dist/components/input-group.d.ts +2 -0
  22. package/dist/components/input-group.js +10 -5
  23. package/dist/components/input.d.ts +1 -0
  24. package/dist/components/input.js +1 -1
  25. package/dist/components/multi-select-combobox.js +3 -3
  26. package/dist/components/phone-frame.js +1 -1
  27. package/dist/components/place-about-tab.d.ts +2 -2
  28. package/dist/components/place-about-tab.js +4 -3
  29. package/dist/components/place-details-mobile.js +5 -3
  30. package/dist/components/place-schedule-week.d.ts +19 -0
  31. package/dist/components/place-schedule-week.js +4 -0
  32. package/dist/components/place-types.d.ts +18 -9
  33. package/dist/components/scroll-fade.js +7 -2
  34. package/dist/components/searchable-select.js +2 -2
  35. package/dist/components/separator.js +3 -26
  36. package/dist/components/sheet.js +1 -1
  37. package/dist/components/sliding-panels.d.ts +1 -0
  38. package/dist/components/sliding-panels.js +22 -6
  39. package/dist/components/sort-option-list.d.ts +16 -0
  40. package/dist/components/sort-option-list.js +46 -0
  41. package/dist/components/tabs.js +98 -17
  42. package/dist/components/tag.js +3 -61
  43. package/dist/components/toast.js +1 -1
  44. package/dist/components/toaster.js +1 -1
  45. package/package.json +23 -113
  46. package/src/components/accordion.tsx +1 -1
  47. package/src/components/badge.tsx +9 -2
  48. package/src/components/card.tsx +22 -18
  49. package/src/components/dialog.tsx +1 -1
  50. package/src/components/filter-category-row.tsx +52 -0
  51. package/src/components/input-group.tsx +9 -4
  52. package/src/components/input.tsx +8 -3
  53. package/src/components/phone-frame.tsx +1 -1
  54. package/src/components/place-about-tab.stories.tsx +24 -13
  55. package/src/components/place-about-tab.test.tsx +92 -38
  56. package/src/components/place-about-tab.tsx +310 -344
  57. package/src/components/place-schedule-week.tsx +128 -0
  58. package/src/components/place-types.ts +27 -8
  59. package/src/components/scroll-fade.tsx +9 -4
  60. package/src/components/sheet.tsx +1 -1
  61. package/src/components/sliding-panels.tsx +33 -6
  62. package/src/components/sort-option-list.tsx +57 -0
  63. package/src/components/tabs.tsx +76 -11
  64. package/src/components/toast.tsx +1 -1
  65. package/src/globals.css +77 -19
  66. package/src/lib/motion.ts +137 -0
  67. package/dist/chunk-BAZFVSSG.js +0 -279
  68. package/dist/chunk-RIDXFY6M.js +0 -38
  69. package/dist/chunk-XK2ZDQVE.js +0 -122
@@ -1,4 +1,127 @@
1
- export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, cardVariants } from '../chunk-XK2ZDQVE.js';
2
- import '../chunk-Y5D5LP4A.js';
3
- import '../chunk-FEK5XGZW.js';
4
- import '../chunk-3GWWZKX7.js';
1
+ import { textVariants } from '../chunk-Y5D5LP4A.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,6 +1,6 @@
1
1
  import { Popover, PopoverTrigger, PopoverContent } from '../chunk-UUJVXN2O.js';
2
- import { Command, CommandInput, CommandList, CommandLoading, CommandEmpty, CommandGroup, CommandItem } from '../chunk-PSR7N36A.js';
3
- import '../chunk-WKMLZDUT.js';
2
+ import { Command, CommandInput, CommandList, CommandLoading, CommandEmpty, CommandGroup, CommandItem } from '../chunk-HCM6LKM5.js';
3
+ import '../chunk-FRPPIXMY.js';
4
4
  import { Button } from '../chunk-ZFNOCP6W.js';
5
5
  import '../chunk-R47NEOSI.js';
6
6
  import { cn } from '../chunk-FEK5XGZW.js';
@@ -1,4 +1,4 @@
1
- export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandLoading, CommandSeparator, CommandShortcut } from '../chunk-PSR7N36A.js';
2
- import '../chunk-WKMLZDUT.js';
1
+ export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandLoading, CommandSeparator, CommandShortcut } from '../chunk-HCM6LKM5.js';
2
+ import '../chunk-FRPPIXMY.js';
3
3
  import '../chunk-FEK5XGZW.js';
4
4
  import '../chunk-3GWWZKX7.js';
@@ -1,4 +1,4 @@
1
- import { Input } from '../chunk-RIDXFY6M.js';
1
+ import { Input } from '../chunk-AV777R4G.js';
2
2
  import { cn } from '../chunk-FEK5XGZW.js';
3
3
  import { __objRest, __spreadValues } from '../chunk-3GWWZKX7.js';
4
4
  import * as React from 'react';
@@ -1,4 +1,4 @@
1
- import { Input } from '../chunk-RIDXFY6M.js';
1
+ import { Input } from '../chunk-AV777R4G.js';
2
2
  import { cn } from '../chunk-FEK5XGZW.js';
3
3
  import { __objRest, __spreadValues } from '../chunk-3GWWZKX7.js';
4
4
  import * as React from 'react';
@@ -1,3 +1,3 @@
1
- export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, dialogContentVariants } from '../chunk-WKMLZDUT.js';
1
+ export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, dialogContentVariants } from '../chunk-FRPPIXMY.js';
2
2
  import '../chunk-FEK5XGZW.js';
3
3
  import '../chunk-3GWWZKX7.js';
@@ -0,0 +1,13 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { LucideIcon } from 'lucide-react';
3
+
4
+ interface FilterCategoryRowProps {
5
+ icon: LucideIcon;
6
+ label: string;
7
+ description: string;
8
+ count?: number;
9
+ onClick: () => void;
10
+ }
11
+ declare function FilterCategoryRow({ icon: Icon, label, description, count, onClick, }: FilterCategoryRowProps): react_jsx_runtime.JSX.Element;
12
+
13
+ export { FilterCategoryRow };
@@ -0,0 +1,44 @@
1
+ import { Text } from '../chunk-Y5D5LP4A.js';
2
+ import { Badge } from '../chunk-TL4YU2O5.js';
3
+ import '../chunk-FEK5XGZW.js';
4
+ import '../chunk-3GWWZKX7.js';
5
+ import { ChevronRight } from 'lucide-react';
6
+ import { jsxs, jsx } from 'react/jsx-runtime';
7
+
8
+ function FilterCategoryRow({
9
+ icon: Icon,
10
+ label,
11
+ description,
12
+ count = 0,
13
+ onClick
14
+ }) {
15
+ return /* @__PURE__ */ jsxs(
16
+ "button",
17
+ {
18
+ type: "button",
19
+ onClick,
20
+ className: "flex items-center justify-between w-full py-3 transition-colors hover:bg-muted/50 rounded-lg px-2 -mx-2",
21
+ children: [
22
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
23
+ /* @__PURE__ */ jsx(
24
+ Icon,
25
+ {
26
+ "aria-hidden": "true",
27
+ className: "w-5 h-5 text-muted-foreground flex-shrink-0"
28
+ }
29
+ ),
30
+ /* @__PURE__ */ jsxs("div", { className: "text-left", children: [
31
+ /* @__PURE__ */ jsx(Text, { as: "p", weight: "medium", children: label }),
32
+ /* @__PURE__ */ jsx(Text, { as: "p", variant: "body-sm", color: "muted", children: description })
33
+ ] })
34
+ ] }),
35
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
36
+ count > 0 && /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "text-xs", children: count }),
37
+ /* @__PURE__ */ jsx(ChevronRight, { className: "w-5 h-5 text-muted-foreground" })
38
+ ] })
39
+ ]
40
+ }
41
+ );
42
+ }
43
+
44
+ export { FilterCategoryRow };
@@ -4,9 +4,11 @@ import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const inputGroupVariants: (props?: ({
6
6
  size?: "default" | "sm" | "lg" | null | undefined;
7
+ shape?: "rounded" | "pill" | null | undefined;
7
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
8
9
  declare const InputGroup: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & VariantProps<(props?: ({
9
10
  size?: "default" | "sm" | "lg" | null | undefined;
11
+ shape?: "rounded" | "pill" | null | undefined;
10
12
  } & class_variance_authority_types.ClassProp) | undefined) => string> & React.RefAttributes<HTMLDivElement>>;
11
13
  declare const InputGroupInput: React.ForwardRefExoticComponent<React.InputHTMLAttributes<HTMLInputElement> & React.RefAttributes<HTMLInputElement>>;
12
14
  declare const InputGroupAddon: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & {
@@ -6,29 +6,34 @@ import { cva } from 'class-variance-authority';
6
6
  import { jsx } from 'react/jsx-runtime';
7
7
 
8
8
  var inputGroupVariants = cva(
9
- "flex items-center w-full rounded-xl border border-border bg-background text-base md:text-sm text-foreground transition-colors focus-within:outline-none focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 has-[input:disabled]:cursor-not-allowed has-[input:disabled]:opacity-50 aria-invalid:border-destructive aria-invalid:focus-within:ring-destructive/40",
9
+ "flex items-center w-full border border-border bg-background text-base md:text-sm text-foreground transition-colors focus-within:outline-none focus-within:ring-2 focus-within:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 has-[input:disabled]:cursor-not-allowed has-[input:disabled]:opacity-50 aria-invalid:border-destructive aria-invalid:focus-within:ring-destructive/40",
10
10
  {
11
11
  variants: {
12
12
  size: {
13
13
  sm: "h-9",
14
14
  default: "h-11",
15
15
  lg: "h-12"
16
+ },
17
+ shape: {
18
+ rounded: "rounded-xl focus-within:ring-ring",
19
+ pill: "rounded-full shadow-[var(--shadow-card)] focus-within:ring-accent/30"
16
20
  }
17
21
  },
18
22
  defaultVariants: {
19
- size: "default"
23
+ size: "default",
24
+ shape: "rounded"
20
25
  }
21
26
  }
22
27
  );
23
28
  var InputGroupContext = React.createContext({});
24
29
  var InputGroup = React.forwardRef((_a, ref) => {
25
- var _b = _a, { className, size, children } = _b, props = __objRest(_b, ["className", "size", "children"]);
26
- return /* @__PURE__ */ jsx(InputGroupContext.Provider, { value: { size }, children: /* @__PURE__ */ jsx(
30
+ var _b = _a, { className, size, shape, children } = _b, props = __objRest(_b, ["className", "size", "shape", "children"]);
31
+ return /* @__PURE__ */ jsx(InputGroupContext.Provider, { value: { size, shape }, children: /* @__PURE__ */ jsx(
27
32
  "div",
28
33
  __spreadProps(__spreadValues({
29
34
  ref,
30
35
  "data-slot": "input-group",
31
- className: cn(inputGroupVariants({ size }), className)
36
+ className: cn(inputGroupVariants({ size, shape }), className)
32
37
  }, props), {
33
38
  children
34
39
  })
@@ -4,6 +4,7 @@ import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const inputVariants: (props?: ({
6
6
  size?: "default" | "sm" | "lg" | null | undefined;
7
+ shape?: "rounded" | "pill" | null | undefined;
7
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
8
9
  interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "size">, VariantProps<typeof inputVariants> {
9
10
  }
@@ -1,3 +1,3 @@
1
- export { Input, inputVariants } from '../chunk-RIDXFY6M.js';
1
+ export { Input, inputVariants } from '../chunk-AV777R4G.js';
2
2
  import '../chunk-FEK5XGZW.js';
3
3
  import '../chunk-3GWWZKX7.js';
@@ -1,10 +1,10 @@
1
1
  import { Checkbox } from '../chunk-D5QHEHXJ.js';
2
2
  import { Popover, PopoverTrigger, PopoverContent } from '../chunk-UUJVXN2O.js';
3
- import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../chunk-PSR7N36A.js';
4
- import '../chunk-WKMLZDUT.js';
3
+ import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../chunk-HCM6LKM5.js';
4
+ import '../chunk-FRPPIXMY.js';
5
5
  import { Button } from '../chunk-ZFNOCP6W.js';
6
6
  import '../chunk-R47NEOSI.js';
7
- import { Badge } from '../chunk-YJ6OBKZJ.js';
7
+ import { Badge } from '../chunk-TL4YU2O5.js';
8
8
  import { cn } from '../chunk-FEK5XGZW.js';
9
9
  import '../chunk-3GWWZKX7.js';
10
10
  import * as React from 'react';
@@ -14,7 +14,7 @@ function PhoneFrame({
14
14
  const innerWidth = width - FRAME_PADDING * 2;
15
15
  const scale = mobileViewportWidth ? innerWidth / mobileViewportWidth : 1;
16
16
  const viewportHeight = mobileViewportWidth ? screenHeight / scale : screenHeight;
17
- return /* @__PURE__ */ jsx("div", { className: cn("relative mx-auto shrink-0", className), style: { width }, children: /* @__PURE__ */ jsxs("div", { className: "rounded-[2.5rem] border-[1.5px] border-white/15 bg-black/80 p-1.5 shadow-2xl shadow-black/40", children: [
17
+ return /* @__PURE__ */ jsx("div", { className: cn("relative mx-auto shrink-0", className), style: { width }, children: /* @__PURE__ */ jsxs("div", { className: "rounded-[2.5rem] border-[1.5px] border-white/15 bg-black p-1.5 shadow-2xl shadow-black/40", children: [
18
18
  /* @__PURE__ */ jsx("div", { className: "absolute top-[10px] left-1/2 -translate-x-1/2 w-[68px] h-[20px] bg-black rounded-full z-10" }),
19
19
  /* @__PURE__ */ jsx(
20
20
  "div",
@@ -4,11 +4,11 @@ import { PlacePreview, PlaceAboutTabLabels, PlaceLinkKind } from './place-types.
4
4
  interface PlaceAboutTabProps {
5
5
  place: PlacePreview;
6
6
  labels: PlaceAboutTabLabels;
7
- /** Slot for an embedded map (FE only). Omit to skip the map row. */
7
+ /** Slot for an embedded map. Rendered first, full-bleed the caller controls the breakout / gradient treatment. */
8
8
  mapSlot?: React.ReactNode;
9
9
  /** Slot for an embedded busyness chart. Rendered only when both this prop and `place.busyness` are present. */
10
10
  busynessSlot?: React.ReactNode;
11
- /** Fires when the user clicks a contact link (phone/website/social). The URL is what the caller passed in. */
11
+ /** Fires when the user clicks a contact link (phone/website/social). */
12
12
  onLinkClick?: (kind: PlaceLinkKind, url: string) => void;
13
13
  className?: string;
14
14
  }
@@ -1,6 +1,7 @@
1
- export { PlaceAboutTab } from '../chunk-BAZFVSSG.js';
2
- import '../chunk-XK2ZDQVE.js';
1
+ export { PlaceAboutTab } from '../chunk-UX6SWAKH.js';
2
+ import '../chunk-YLNYXPIH.js';
3
+ import '../chunk-WSRWFA6K.js';
4
+ import '../chunk-A5ONAJCE.js';
3
5
  import '../chunk-Y5D5LP4A.js';
4
- import '../chunk-YJ6OBKZJ.js';
5
6
  import '../chunk-FEK5XGZW.js';
6
7
  import '../chunk-3GWWZKX7.js';
@@ -1,7 +1,9 @@
1
- import { PlaceAboutTab } from '../chunk-BAZFVSSG.js';
2
- import '../chunk-XK2ZDQVE.js';
1
+ import { PlaceAboutTab } from '../chunk-UX6SWAKH.js';
2
+ import '../chunk-YLNYXPIH.js';
3
+ import '../chunk-WSRWFA6K.js';
4
+ import '../chunk-A5ONAJCE.js';
3
5
  import { Text } from '../chunk-Y5D5LP4A.js';
4
- import { Badge } from '../chunk-YJ6OBKZJ.js';
6
+ import { Badge } from '../chunk-TL4YU2O5.js';
5
7
  import { cn } from '../chunk-FEK5XGZW.js';
6
8
  import '../chunk-3GWWZKX7.js';
7
9
  import { useState } from 'react';
@@ -0,0 +1,19 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { PlaceSchedule, PlaceScheduleWeekLabels } from './place-types.js';
3
+
4
+ interface PlaceScheduleWeekProps {
5
+ schedule?: PlaceSchedule;
6
+ labels: PlaceScheduleWeekLabels;
7
+ /**
8
+ * When true, scrolls the today row into view on mount. Use inside a drawer/dialog
9
+ * where the schedule is the only content — auto-scrolling avoids weekend rows
10
+ * being clipped at the bottom of small viewports. Default false: do not auto-scroll
11
+ * when the schedule sits inline on a longer page, where the behaviour disorients
12
+ * the reader.
13
+ */
14
+ autoScrollToToday?: boolean;
15
+ className?: string;
16
+ }
17
+ declare function PlaceScheduleWeek({ schedule, labels, autoScrollToToday, className, }: PlaceScheduleWeekProps): react_jsx_runtime.JSX.Element;
18
+
19
+ export { PlaceScheduleWeek, type PlaceScheduleWeekProps };
@@ -0,0 +1,4 @@
1
+ export { PlaceScheduleWeek } from '../chunk-A5ONAJCE.js';
2
+ import '../chunk-Y5D5LP4A.js';
3
+ import '../chunk-FEK5XGZW.js';
4
+ import '../chunk-3GWWZKX7.js';
@@ -18,6 +18,7 @@ type PlacePreview = {
18
18
  review_count?: number;
19
19
  hours?: PlaceHourBlock[];
20
20
  today_schedule?: PlaceHourBlock[];
21
+ schedule?: PlaceSchedule;
21
22
  location?: {
22
23
  address?: string;
23
24
  geolocation?: {
@@ -65,6 +66,8 @@ type PlaceHourBlock = {
65
66
  opens_at: number;
66
67
  closes_at: number;
67
68
  };
69
+ type WeekdayKey = 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday';
70
+ type PlaceSchedule = Record<WeekdayKey, PlaceHourBlock[]>;
68
71
  type PlacePriceRange = {
69
72
  price_range_low?: number;
70
73
  price_range_high?: number;
@@ -85,15 +88,14 @@ type PlaceCardLabels = {
85
88
  * to the raw enum value (with underscores → spaces).
86
89
  */
87
90
  type PlaceAboutTabLabels = {
88
- overview: string;
91
+ /** Section heading for the editorial prose block (generative summary + review summary + description). */
89
92
  description: string;
90
- whatPeopleSay: string;
91
93
  contactAndLocation: string;
92
- address: string;
93
94
  instagram: string;
94
95
  facebook: string;
96
+ /** Section heading for the inline weekly schedule. */
95
97
  todayHours: string;
96
- statusOpen: string;
98
+ /** Used by the inline schedule's closed-day line-through. */
97
99
  statusClosed: string;
98
100
  typicalBusyness: string;
99
101
  cuisines: string;
@@ -102,10 +104,10 @@ type PlaceAboutTabLabels = {
102
104
  accessibility: string;
103
105
  parking: string;
104
106
  nearbyLandmarks: string;
105
- neighborhood: string;
106
- businessInformation: string;
107
- type: string;
108
- status: string;
107
+ /** Weekday key → translated day name, consumed by the inline `<PlaceScheduleWeek>`. */
108
+ scheduleDays: Record<WeekdayKey, string>;
109
+ /** Fallback shown by `<PlaceScheduleWeek>` when no schedule data is present. */
110
+ noHoursAvailable: string;
109
111
  amenityLabels: Record<string, string>;
110
112
  paymentLabels: Record<string, string>;
111
113
  accessibilityLabels: Record<string, string>;
@@ -115,6 +117,13 @@ type PlaceAboutTabLabels = {
115
117
  };
116
118
  /** Discriminator for `<PlaceAboutTab>`'s `onLinkClick` callback. */
117
119
  type PlaceLinkKind = 'phone' | 'website' | 'instagram' | 'facebook' | 'address';
120
+ /** Labels passed to `<PlaceScheduleWeek>`. */
121
+ type PlaceScheduleWeekLabels = {
122
+ days: Record<WeekdayKey, string>;
123
+ closed: string;
124
+ /** Shown when the `schedule` prop is missing or empty. */
125
+ noHoursAvailable: string;
126
+ };
118
127
  /**
119
128
  * Labels passed to `<PlaceDetailsMobile>`. Extends `PlaceAboutTabLabels` with
120
129
  * the header/tab-strip strings unique to the mobile place-details surface.
@@ -142,4 +151,4 @@ type PlaceDetailsMobileLabels = PlaceAboutTabLabels & {
142
151
  noImageAvailable: string;
143
152
  };
144
153
 
145
- export type { PlaceAboutTabLabels, PlaceCardLabels, PlaceDetailsMobileLabels, PlaceHourBlock, PlaceLinkKind, PlacePreview, PlacePriceRange };
154
+ export type { PlaceAboutTabLabels, PlaceCardLabels, PlaceDetailsMobileLabels, PlaceHourBlock, PlaceLinkKind, PlacePreview, PlacePriceRange, PlaceSchedule, PlaceScheduleWeekLabels, WeekdayKey };
@@ -88,7 +88,12 @@ var ScrollFade = React.forwardRef(
88
88
  "aria-hidden": true,
89
89
  className: cn(
90
90
  "pointer-events-none absolute z-10 transition-opacity duration-300",
91
- orientation === "vertical" ? `inset-x-0 top-0 ${fadeSize} bg-gradient-to-b` : `inset-y-0 left-0 ${fadeSize} bg-gradient-to-r`,
91
+ // `from-30%` adds a solid plateau before the gradient starts
92
+ // fading — without it the gradient is a pure linear ramp and only
93
+ // the very top pixel reads as solid, leaving the cut edge visible.
94
+ // -4px inset pulls the fade past the container edge so the very
95
+ // edge of clipped content is covered by the solid plateau.
96
+ orientation === "vertical" ? `inset-x-0 -top-1 ${fadeSize} bg-gradient-to-b from-30%` : `inset-y-0 -left-1 ${fadeSize} bg-gradient-to-r from-30%`,
92
97
  fromClass,
93
98
  atStart ? "opacity-0" : "opacity-100"
94
99
  )
@@ -100,7 +105,7 @@ var ScrollFade = React.forwardRef(
100
105
  "aria-hidden": true,
101
106
  className: cn(
102
107
  "pointer-events-none absolute z-10 transition-opacity duration-300",
103
- orientation === "vertical" ? `inset-x-0 bottom-0 ${fadeSize} bg-gradient-to-t` : `inset-y-0 right-0 ${fadeSize} bg-gradient-to-l`,
108
+ orientation === "vertical" ? `inset-x-0 -bottom-1 ${fadeSize} bg-gradient-to-t from-30%` : `inset-y-0 -right-1 ${fadeSize} bg-gradient-to-l from-30%`,
104
109
  fromClass,
105
110
  atEnd ? "opacity-0" : "opacity-100"
106
111
  )
@@ -1,6 +1,6 @@
1
1
  import { Popover, PopoverTrigger, PopoverContent } from '../chunk-UUJVXN2O.js';
2
- import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../chunk-PSR7N36A.js';
3
- import '../chunk-WKMLZDUT.js';
2
+ import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from '../chunk-HCM6LKM5.js';
3
+ import '../chunk-FRPPIXMY.js';
4
4
  import { Button } from '../chunk-ZFNOCP6W.js';
5
5
  import '../chunk-R47NEOSI.js';
6
6
  import { cn } from '../chunk-FEK5XGZW.js';
@@ -1,26 +1,3 @@
1
- import { cn } from '../chunk-FEK5XGZW.js';
2
- import { __objRest, __spreadValues } from '../chunk-3GWWZKX7.js';
3
- import * as React from 'react';
4
- import * as SeparatorPrimitive from '@radix-ui/react-separator';
5
- import { jsx } from 'react/jsx-runtime';
6
-
7
- var Separator = React.forwardRef((_a, ref) => {
8
- var _b = _a, { className, orientation = "horizontal", decorative = true } = _b, props = __objRest(_b, ["className", "orientation", "decorative"]);
9
- return /* @__PURE__ */ jsx(
10
- SeparatorPrimitive.Root,
11
- __spreadValues({
12
- ref,
13
- "data-slot": "separator",
14
- decorative,
15
- orientation,
16
- className: cn(
17
- "shrink-0",
18
- orientation === "horizontal" ? "h-px w-full bg-gradient-to-r from-transparent via-border to-transparent" : "h-full w-px bg-gradient-to-b from-transparent via-border to-transparent",
19
- className
20
- )
21
- }, props)
22
- );
23
- });
24
- Separator.displayName = SeparatorPrimitive.Root.displayName;
25
-
26
- export { Separator };
1
+ export { Separator } from '../chunk-WSRWFA6K.js';
2
+ import '../chunk-FEK5XGZW.js';
3
+ import '../chunk-3GWWZKX7.js';
@@ -26,7 +26,7 @@ var SheetOverlay = React.forwardRef((_a, ref) => {
26
26
  });
27
27
  SheetOverlay.displayName = SheetPrimitive.Overlay.displayName;
28
28
  var sheetVariants = cva(
29
- "fixed z-[1000] gap-4 bg-background border-border p-6 shadow-2xl transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
29
+ "fixed z-[1000] gap-4 bg-background border-border p-6 shadow-2xl data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=open]:duration-[var(--duration-deliberate)] data-[state=closed]:duration-[var(--duration-exit-standard)] data-[state=open]:ease-[var(--ease-enter)] data-[state=closed]:ease-[var(--ease-exit)]",
30
30
  {
31
31
  variants: {
32
32
  side: {
@@ -7,6 +7,7 @@ interface Panel {
7
7
  showBackButton?: boolean;
8
8
  backButtonLabel?: string;
9
9
  onBack?: () => void;
10
+ parentId?: string;
10
11
  }
11
12
  interface SlidingPanelsProps {
12
13
  panels: Panel[];
@@ -2,6 +2,7 @@ import { Button } from '../chunk-ZFNOCP6W.js';
2
2
  import '../chunk-R47NEOSI.js';
3
3
  import { cn } from '../chunk-FEK5XGZW.js';
4
4
  import '../chunk-3GWWZKX7.js';
5
+ import * as React from 'react';
5
6
  import { useRef, useState, useLayoutEffect } from 'react';
6
7
  import { ChevronLeft } from 'lucide-react';
7
8
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -16,6 +17,18 @@ var SlidingPanels = ({
16
17
  const currentPanelData = panels[currentIndex];
17
18
  const panelRefs = useRef([]);
18
19
  const [containerHeight, setContainerHeight] = useState();
20
+ const usesTreeModel = panels.some((p) => p.parentId);
21
+ const activeAncestors = React.useMemo(() => {
22
+ if (!usesTreeModel) return /* @__PURE__ */ new Set();
23
+ const ancestors = /* @__PURE__ */ new Set();
24
+ let cursor = panels.find((p) => p.id === currentPanel);
25
+ while (cursor == null ? void 0 : cursor.parentId) {
26
+ ancestors.add(cursor.parentId);
27
+ const nextId = cursor.parentId;
28
+ cursor = panels.find((p) => p.id === nextId);
29
+ }
30
+ return ancestors;
31
+ }, [panels, currentPanel, usesTreeModel]);
19
32
  useLayoutEffect(() => {
20
33
  const activeEl = panelRefs.current[currentIndex];
21
34
  if (!activeEl) return;
@@ -26,13 +39,16 @@ var SlidingPanels = ({
26
39
  return () => ro.disconnect();
27
40
  }, [currentIndex]);
28
41
  const handleBack = () => {
29
- const previousPanel = panels[currentIndex - 1];
30
- if (!previousPanel) return;
31
42
  if (currentPanelData == null ? void 0 : currentPanelData.onBack) {
32
43
  currentPanelData.onBack();
33
- } else {
34
- onPanelChange(previousPanel.id);
44
+ return;
35
45
  }
46
+ if (currentPanelData == null ? void 0 : currentPanelData.parentId) {
47
+ onPanelChange(currentPanelData.parentId);
48
+ return;
49
+ }
50
+ const previousPanel = panels[currentIndex - 1];
51
+ if (previousPanel) onPanelChange(previousPanel.id);
36
52
  };
37
53
  return /* @__PURE__ */ jsx(
38
54
  "div",
@@ -44,8 +60,8 @@ var SlidingPanels = ({
44
60
  style: { height: containerHeight, overflowClipMargin: "8px" },
45
61
  children: panels.map((panel, index) => {
46
62
  const isActive = panel.id === currentPanel;
47
- const isLeft = index < currentIndex;
48
- const isRight = index > currentIndex;
63
+ const isLeft = usesTreeModel ? activeAncestors.has(panel.id) : index < currentIndex;
64
+ const isRight = !isActive && !isLeft;
49
65
  return /* @__PURE__ */ jsxs(
50
66
  "div",
51
67
  {
@@ -0,0 +1,16 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ type SortOptionListItem<T extends string> = {
4
+ value: T;
5
+ label: string;
6
+ };
7
+ interface SortOptionListProps<T extends string> {
8
+ options: SortOptionListItem<T>[];
9
+ value: T;
10
+ onChange: (value: T) => void;
11
+ ariaLabel: string;
12
+ className?: string;
13
+ }
14
+ declare function SortOptionList<T extends string>({ options, value, onChange, ariaLabel, className, }: SortOptionListProps<T>): react_jsx_runtime.JSX.Element;
15
+
16
+ export { SortOptionList, type SortOptionListItem };