@bearmenu/ui 0.1.1 → 0.5.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 (113) hide show
  1. package/dist/{chunk-2CUFS5LF.js → chunk-2BMJRXQX.js} +1 -1
  2. package/dist/chunk-HLQ2IRE7.js +279 -0
  3. package/dist/chunk-IQASCH2V.js +25 -0
  4. package/dist/{chunk-UXAYXRFN.js → chunk-QJ54Z7TC.js} +15 -1
  5. package/dist/{chunk-X6GATUI2.js → chunk-UISA4CIG.js} +1 -0
  6. package/dist/components/alert-dialog.js +1 -1
  7. package/dist/components/button.js +1 -1
  8. package/dist/components/calendar.d.ts +9 -7
  9. package/dist/components/calendar.js +153 -39
  10. package/dist/components/card.d.ts +2 -1
  11. package/dist/components/card.js +1 -1
  12. package/dist/components/carousel.js +1 -1
  13. package/dist/components/checkbox.js +3 -25
  14. package/dist/components/dropdown-menu.js +1 -1
  15. package/dist/components/empty-state.js +1 -1
  16. package/dist/components/haptic-button.js +1 -1
  17. package/dist/components/link-button.js +1 -1
  18. package/dist/components/multi-select-combobox.js +1 -1
  19. package/dist/components/multi-select-menu.d.ts +26 -0
  20. package/dist/components/multi-select-menu.js +71 -0
  21. package/dist/components/pagination.js +1 -1
  22. package/dist/components/phone-frame.d.ts +17 -0
  23. package/dist/components/phone-frame.js +41 -0
  24. package/dist/components/place-about-tab.d.ts +17 -0
  25. package/dist/components/place-about-tab.js +6 -0
  26. package/dist/components/place-card.d.ts +17 -0
  27. package/dist/components/place-card.js +145 -0
  28. package/dist/components/place-details-mobile.d.ts +18 -0
  29. package/dist/components/place-details-mobile.js +187 -0
  30. package/dist/components/place-types.d.ts +145 -0
  31. package/dist/components/place-types.js +1 -0
  32. package/dist/components/search-bar.js +1 -1
  33. package/dist/components/searchable-select.js +1 -1
  34. package/dist/components/skeleton-card.js +1 -1
  35. package/dist/components/skeleton.js +1 -1
  36. package/dist/components/sliding-panels.js +1 -1
  37. package/dist/components/sonner.js +11 -2
  38. package/dist/components/tabs.js +1 -1
  39. package/dist/components/toaster.js +1 -1
  40. package/package.json +28 -9
  41. package/src/components/accordion.stories.tsx +51 -0
  42. package/src/components/alert-dialog.stories.tsx +45 -0
  43. package/src/components/alert.stories.tsx +85 -0
  44. package/src/components/aspect-ratio.stories.tsx +47 -0
  45. package/src/components/avatar.stories.tsx +66 -0
  46. package/src/components/badge.stories.tsx +60 -0
  47. package/src/components/breadcrumb.stories.tsx +63 -0
  48. package/src/components/button.stories.tsx +115 -0
  49. package/src/components/button.tsx +1 -1
  50. package/src/components/calendar.stories.tsx +47 -0
  51. package/src/components/calendar.tsx +160 -40
  52. package/src/components/card.stories.tsx +72 -0
  53. package/src/components/card.tsx +13 -1
  54. package/src/components/carousel.stories.tsx +62 -0
  55. package/src/components/checkbox.stories.tsx +54 -0
  56. package/src/components/checkbox.tsx +1 -1
  57. package/src/components/collapsible.stories.tsx +34 -0
  58. package/src/components/command.stories.tsx +64 -0
  59. package/src/components/currency-input.stories.tsx +50 -0
  60. package/src/components/dialog.stories.tsx +75 -0
  61. package/src/components/drawer.stories.tsx +47 -0
  62. package/src/components/dropdown-menu.stories.tsx +64 -0
  63. package/src/components/dropdown-menu.tsx +1 -1
  64. package/src/components/empty-state.stories.tsx +67 -0
  65. package/src/components/form.stories.tsx +73 -0
  66. package/src/components/haptic-button.stories.tsx +41 -0
  67. package/src/components/input-otp.stories.tsx +42 -0
  68. package/src/components/input.stories.tsx +41 -0
  69. package/src/components/label.stories.tsx +35 -0
  70. package/src/components/markdown-renderer.stories.tsx +45 -0
  71. package/src/components/multi-select-combobox.stories.tsx +78 -0
  72. package/src/components/multi-select-menu.tsx +96 -0
  73. package/src/components/pagination.stories.tsx +48 -0
  74. package/src/components/phone-frame.stories.tsx +51 -0
  75. package/src/components/phone-frame.test.tsx +82 -0
  76. package/src/components/phone-frame.tsx +59 -0
  77. package/src/components/place-about-tab.stories.tsx +164 -0
  78. package/src/components/place-about-tab.test.tsx +325 -0
  79. package/src/components/place-about-tab.tsx +474 -0
  80. package/src/components/place-card.stories.tsx +120 -0
  81. package/src/components/place-card.test.tsx +187 -0
  82. package/src/components/place-card.tsx +187 -0
  83. package/src/components/place-details-mobile.tsx +251 -0
  84. package/src/components/place-types.ts +127 -0
  85. package/src/components/popover.stories.tsx +42 -0
  86. package/src/components/progress.stories.tsx +35 -0
  87. package/src/components/radio-group.stories.tsx +46 -0
  88. package/src/components/rating.stories.tsx +45 -0
  89. package/src/components/scroll-area.stories.tsx +48 -0
  90. package/src/components/search-bar.stories.tsx +92 -0
  91. package/src/components/searchable-select.stories.tsx +55 -0
  92. package/src/components/select.stories.tsx +92 -0
  93. package/src/components/separator.stories.tsx +33 -0
  94. package/src/components/sheet.stories.tsx +95 -0
  95. package/src/components/skeleton-card.stories.tsx +53 -0
  96. package/src/components/skeleton.stories.tsx +42 -0
  97. package/src/components/skeleton.tsx +1 -0
  98. package/src/components/slider.stories.tsx +27 -0
  99. package/src/components/sliding-panels.stories.tsx +68 -0
  100. package/src/components/sonner.tsx +17 -2
  101. package/src/components/sticky-container.stories.tsx +33 -0
  102. package/src/components/switch.stories.tsx +35 -0
  103. package/src/components/table.stories.tsx +60 -0
  104. package/src/components/tabs.stories.tsx +53 -0
  105. package/src/components/tabs.tsx +1 -1
  106. package/src/components/text.stories.tsx +82 -0
  107. package/src/components/textarea.stories.tsx +35 -0
  108. package/src/components/toast.stories.tsx +63 -0
  109. package/src/components/toggle-group.stories.tsx +60 -0
  110. package/src/components/toggle.stories.tsx +48 -0
  111. package/src/components/tooltip.stories.tsx +71 -0
  112. package/src/globals.css +14 -2
  113. package/src/test/setup.ts +9 -0
@@ -13,7 +13,7 @@ var buttonVariants = cva(
13
13
  variant: {
14
14
  default: "bg-primary backdrop-blur-sm text-primary-foreground shadow-lg hover:bg-primary/85 border border-primary/20 transition-colors duration-200",
15
15
  destructive: "bg-destructive text-destructive-foreground shadow-lg hover:bg-destructive/90 hover:shadow-destructive/20 backdrop-blur-sm border border-destructive/20",
16
- outline: "border border-border bg-card/70 backdrop-blur-md hover:bg-accent hover:text-accent-foreground hover:border-accent-foreground/20 hover:shadow-lg glass-hover",
16
+ outline: "border border-border bg-sidebar backdrop-blur-md hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:border-sidebar-accent-foreground/20 hover:shadow-lg",
17
17
  secondary: "bg-secondary text-secondary-foreground shadow-lg hover:bg-secondary/90 hover:shadow-secondary/20 backdrop-blur-sm border border-secondary/20",
18
18
  ghost: "hover:bg-foreground/10 hover:text-foreground transition-colors duration-200",
19
19
  link: "text-primary underline-offset-4 hover:underline hover:text-primary/80",
@@ -0,0 +1,279 @@
1
+ import { Card, CardHeader, CardTitle, CardContent } from './chunk-QJ54Z7TC.js';
2
+ import { Text } from './chunk-4KOMHDZD.js';
3
+ import { Badge } from './chunk-NKHH23YK.js';
4
+ import { cn } from './chunk-FEK5XGZW.js';
5
+ import { __spreadProps, __spreadValues } from './chunk-3GWWZKX7.js';
6
+ import { Info, MapPin, Phone, Globe, Clock, UtensilsCrossed, CreditCard, Shield, Car, Building2 } from 'lucide-react';
7
+ import { jsxs, jsx } from 'react/jsx-runtime';
8
+
9
+ function Instagram(props) {
10
+ return /* @__PURE__ */ jsxs(
11
+ "svg",
12
+ __spreadProps(__spreadValues({
13
+ viewBox: "0 0 24 24",
14
+ fill: "none",
15
+ stroke: "currentColor",
16
+ strokeWidth: "2",
17
+ strokeLinecap: "round",
18
+ strokeLinejoin: "round"
19
+ }, props), {
20
+ children: [
21
+ /* @__PURE__ */ jsx("rect", { width: "20", height: "20", x: "2", y: "2", rx: "5", ry: "5" }),
22
+ /* @__PURE__ */ jsx("path", { d: "M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z" }),
23
+ /* @__PURE__ */ jsx("line", { x1: "17.5", x2: "17.51", y1: "6.5", y2: "6.5" })
24
+ ]
25
+ })
26
+ );
27
+ }
28
+ function Facebook(props) {
29
+ return /* @__PURE__ */ jsx(
30
+ "svg",
31
+ __spreadProps(__spreadValues({
32
+ viewBox: "0 0 24 24",
33
+ fill: "none",
34
+ stroke: "currentColor",
35
+ strokeWidth: "2",
36
+ strokeLinecap: "round",
37
+ strokeLinejoin: "round"
38
+ }, props), {
39
+ children: /* @__PURE__ */ jsx("path", { d: "M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z" })
40
+ })
41
+ );
42
+ }
43
+ function formatHour(h) {
44
+ return `${h.toString().padStart(2, "0")}:00`;
45
+ }
46
+ function humanizeEnum(value) {
47
+ return value.replace(/_/g, " ");
48
+ }
49
+ function PlaceAboutTab({
50
+ place,
51
+ labels,
52
+ mapSlot,
53
+ busynessSlot,
54
+ onLinkClick,
55
+ className
56
+ }) {
57
+ var _a, _b, _c;
58
+ const todayHours = place.hours && place.hours.length > 0 ? place.hours.map((slot) => `${formatHour(slot.opens_at)} - ${formatHour(slot.closes_at)}`) : null;
59
+ const formattedAddress = (_a = place.location) == null ? void 0 : _a.address;
60
+ const handleLinkClick = (kind, url) => {
61
+ if (onLinkClick && url) onLinkClick(kind, url);
62
+ };
63
+ const getAmenityLabel = (key) => labels.amenityLabels[key] || humanizeEnum(key);
64
+ const getPaymentLabel = (key) => labels.paymentLabels[key] || humanizeEnum(key);
65
+ const getAccessibilityLabel = (key) => labels.accessibilityLabels[key] || humanizeEnum(key);
66
+ const getParkingLabel = (key) => labels.parkingLabels[key] || humanizeEnum(key);
67
+ const getTypeLabel = (key) => labels.typeLabels[key] || humanizeEnum(key);
68
+ const getStatusLabel = (key) => labels.statusLabels[key] || humanizeEnum(key);
69
+ return /* @__PURE__ */ jsxs("div", { className: cn("space-y-4 pt-4 px-4", className), children: [
70
+ mapSlot,
71
+ (place.description || place.generative_summary || place.review_summary) && /* @__PURE__ */ jsxs(Card, { children: [
72
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, { className: "flex items-center gap-2", children: [
73
+ /* @__PURE__ */ jsx(Info, { className: "w-5 h-5", "aria-hidden": "true" }),
74
+ labels.description
75
+ ] }) }),
76
+ /* @__PURE__ */ jsxs(CardContent, { className: "space-y-4", children: [
77
+ place.generative_summary && /* @__PURE__ */ jsxs("div", { children: [
78
+ /* @__PURE__ */ jsx(Text, { as: "p", variant: "body-sm", color: "muted", className: "mb-2", children: labels.overview }),
79
+ /* @__PURE__ */ jsx(Text, { as: "p", color: "default", children: place.generative_summary })
80
+ ] }),
81
+ place.description && /* @__PURE__ */ jsxs("div", { children: [
82
+ /* @__PURE__ */ jsx(Text, { as: "p", variant: "body-sm", color: "muted", className: "mb-2", children: labels.description }),
83
+ /* @__PURE__ */ jsx(Text, { as: "p", color: "default", children: place.description })
84
+ ] }),
85
+ place.review_summary && /* @__PURE__ */ jsxs("div", { children: [
86
+ /* @__PURE__ */ jsx(Text, { as: "p", variant: "body-sm", color: "muted", className: "mb-2", children: labels.whatPeopleSay }),
87
+ /* @__PURE__ */ jsx(Text, { as: "p", color: "default", children: place.review_summary })
88
+ ] })
89
+ ] })
90
+ ] }),
91
+ /* @__PURE__ */ jsxs(Card, { children: [
92
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, { className: "flex items-center gap-2", children: [
93
+ /* @__PURE__ */ jsx(MapPin, { className: "w-5 h-5", "aria-hidden": "true" }),
94
+ labels.contactAndLocation
95
+ ] }) }),
96
+ /* @__PURE__ */ jsxs(CardContent, { className: "space-y-4", children: [
97
+ formattedAddress && /* @__PURE__ */ jsxs("div", { children: [
98
+ /* @__PURE__ */ jsx(Text, { as: "p", variant: "body-sm", color: "muted", className: "mb-1", children: labels.address }),
99
+ /* @__PURE__ */ jsx(Text, { as: "p", color: "default", children: formattedAddress })
100
+ ] }),
101
+ place.phone && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
102
+ /* @__PURE__ */ jsx(Phone, { className: "w-4 h-4 text-muted-foreground", "aria-hidden": "true" }),
103
+ /* @__PURE__ */ jsx(
104
+ "a",
105
+ {
106
+ href: `tel:${place.phone}`,
107
+ onClick: () => handleLinkClick("phone", place.phone),
108
+ className: "text-foreground hover:text-primary transition-colors",
109
+ children: place.phone
110
+ }
111
+ )
112
+ ] }),
113
+ place.website_url && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
114
+ /* @__PURE__ */ jsx(Globe, { className: "w-4 h-4 text-muted-foreground", "aria-hidden": "true" }),
115
+ /* @__PURE__ */ jsx(
116
+ "a",
117
+ {
118
+ href: place.website_url,
119
+ target: "_blank",
120
+ rel: "noopener noreferrer",
121
+ onClick: () => handleLinkClick("website", place.website_url),
122
+ className: "text-foreground hover:text-primary transition-colors break-all",
123
+ children: place.website_url
124
+ }
125
+ )
126
+ ] }),
127
+ ((_b = place.socials) == null ? void 0 : _b.instagram_url) && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
128
+ /* @__PURE__ */ jsx(Instagram, { className: "w-4 h-4 text-muted-foreground", "aria-hidden": "true" }),
129
+ /* @__PURE__ */ jsx(
130
+ "a",
131
+ {
132
+ href: place.socials.instagram_url,
133
+ target: "_blank",
134
+ rel: "noopener noreferrer",
135
+ onClick: () => {
136
+ var _a2;
137
+ return handleLinkClick("instagram", (_a2 = place.socials) == null ? void 0 : _a2.instagram_url);
138
+ },
139
+ className: "text-foreground hover:text-primary transition-colors",
140
+ children: labels.instagram
141
+ }
142
+ )
143
+ ] }),
144
+ ((_c = place.socials) == null ? void 0 : _c.facebook_url) && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
145
+ /* @__PURE__ */ jsx(Facebook, { className: "w-4 h-4 text-muted-foreground", "aria-hidden": "true" }),
146
+ /* @__PURE__ */ jsx(
147
+ "a",
148
+ {
149
+ href: place.socials.facebook_url,
150
+ target: "_blank",
151
+ rel: "noopener noreferrer",
152
+ onClick: () => {
153
+ var _a2;
154
+ return handleLinkClick("facebook", (_a2 = place.socials) == null ? void 0 : _a2.facebook_url);
155
+ },
156
+ className: "text-foreground hover:text-primary transition-colors",
157
+ children: labels.facebook
158
+ }
159
+ )
160
+ ] })
161
+ ] })
162
+ ] }),
163
+ todayHours && todayHours.length > 0 && /* @__PURE__ */ jsxs(Card, { children: [
164
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, { className: "flex items-center gap-2", children: [
165
+ /* @__PURE__ */ jsx(Clock, { className: "w-5 h-5", "aria-hidden": "true" }),
166
+ labels.todayHours
167
+ ] }) }),
168
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
169
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
170
+ /* @__PURE__ */ jsx(
171
+ "span",
172
+ {
173
+ className: cn(
174
+ "w-2 h-2 rounded-full",
175
+ place.open_now ? "bg-green-500" : "bg-muted-foreground"
176
+ )
177
+ }
178
+ ),
179
+ /* @__PURE__ */ jsx(
180
+ Text,
181
+ {
182
+ as: "span",
183
+ weight: "medium",
184
+ className: place.open_now ? "text-green-600 dark:text-green-400" : "",
185
+ children: place.open_now ? labels.statusOpen : labels.statusClosed
186
+ }
187
+ )
188
+ ] }),
189
+ todayHours.map((range, index) => /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsx(Text, { as: "span", color: "muted", children: range }) }, index))
190
+ ] }) })
191
+ ] }),
192
+ busynessSlot && place.busyness && place.busyness.length > 0 && /* @__PURE__ */ jsxs(Card, { children: [
193
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, { className: "flex items-center gap-2", children: [
194
+ /* @__PURE__ */ jsx(Clock, { className: "w-5 h-5", "aria-hidden": "true" }),
195
+ labels.typicalBusyness
196
+ ] }) }),
197
+ /* @__PURE__ */ jsx(CardContent, { children: busynessSlot })
198
+ ] }),
199
+ place.cuisines && place.cuisines.length > 0 && /* @__PURE__ */ jsxs(Card, { children: [
200
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, { className: "flex items-center gap-2", children: [
201
+ /* @__PURE__ */ jsx(UtensilsCrossed, { className: "w-5 h-5", "aria-hidden": "true" }),
202
+ labels.cuisines
203
+ ] }) }),
204
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: place.cuisines.map((cuisine, index) => /* @__PURE__ */ jsx(Badge, { variant: "secondary", children: cuisine.charAt(0).toUpperCase() + cuisine.slice(1) }, index)) }) })
205
+ ] }),
206
+ place.amenities && place.amenities.length > 0 && /* @__PURE__ */ jsxs(Card, { children: [
207
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { children: labels.amenities }) }),
208
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 md:grid-cols-3 gap-2", children: place.amenities.map((amenity, index) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm", children: [
209
+ /* @__PURE__ */ jsx(Text, { as: "span", color: "muted", children: "\u2022" }),
210
+ /* @__PURE__ */ jsx(Text, { as: "span", color: "default", children: getAmenityLabel(amenity) })
211
+ ] }, index)) }) })
212
+ ] }),
213
+ place.payment_options && place.payment_options.length > 0 && /* @__PURE__ */ jsxs(Card, { children: [
214
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, { className: "flex items-center gap-2", children: [
215
+ /* @__PURE__ */ jsx(CreditCard, { className: "w-5 h-5", "aria-hidden": "true" }),
216
+ labels.paymentOptions
217
+ ] }) }),
218
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: place.payment_options.map((payment, index) => /* @__PURE__ */ jsx(Badge, { variant: "outline", children: getPaymentLabel(payment) }, index)) }) })
219
+ ] }),
220
+ place.accessibility_features && place.accessibility_features.length > 0 && /* @__PURE__ */ jsxs(Card, { children: [
221
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, { className: "flex items-center gap-2", children: [
222
+ /* @__PURE__ */ jsx(Shield, { className: "w-5 h-5", "aria-hidden": "true" }),
223
+ labels.accessibility
224
+ ] }) }),
225
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-2", children: place.accessibility_features.map((feature, index) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm", children: [
226
+ /* @__PURE__ */ jsx(Text, { as: "span", color: "muted", children: "\u2022" }),
227
+ /* @__PURE__ */ jsx(Text, { as: "span", color: "default", children: getAccessibilityLabel(feature) })
228
+ ] }, index)) }) })
229
+ ] }),
230
+ place.parking_options && place.parking_options.length > 0 && /* @__PURE__ */ jsxs(Card, { children: [
231
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, { className: "flex items-center gap-2", children: [
232
+ /* @__PURE__ */ jsx(Car, { className: "w-5 h-5", "aria-hidden": "true" }),
233
+ labels.parking
234
+ ] }) }),
235
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: place.parking_options.map((parking, index) => /* @__PURE__ */ jsx(Badge, { variant: "outline", children: getParkingLabel(parking) }, index)) }) })
236
+ ] }),
237
+ place.landmarks && place.landmarks.length > 0 && /* @__PURE__ */ jsxs(Card, { children: [
238
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, { className: "flex items-center gap-2", children: [
239
+ /* @__PURE__ */ jsx(MapPin, { className: "w-5 h-5", "aria-hidden": "true" }),
240
+ labels.nearbyLandmarks
241
+ ] }) }),
242
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx("div", { className: "space-y-2", children: place.landmarks.map((landmark, index) => /* @__PURE__ */ jsxs("div", { className: "flex justify-between items-center", children: [
243
+ /* @__PURE__ */ jsx(Text, { as: "span", color: "default", children: landmark.name }),
244
+ landmark.distance_meters !== void 0 && landmark.distance_meters !== null && /* @__PURE__ */ jsxs(Text, { as: "span", variant: "body-sm", color: "muted", children: [
245
+ (landmark.distance_meters / 1e3).toFixed(1),
246
+ " km"
247
+ ] })
248
+ ] }, index)) }) })
249
+ ] }),
250
+ place.areas && place.areas.length > 0 && /* @__PURE__ */ jsxs(Card, { children: [
251
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, { className: "flex items-center gap-2", children: [
252
+ /* @__PURE__ */ jsx(Building2, { className: "w-5 h-5", "aria-hidden": "true" }),
253
+ labels.neighborhood
254
+ ] }) }),
255
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: place.areas.map((area, index) => /* @__PURE__ */ jsx(Badge, { variant: "secondary", children: area.name }, index)) }) })
256
+ ] }),
257
+ (place.type || place.business_status) && /* @__PURE__ */ jsxs(Card, { children: [
258
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { children: labels.businessInformation }) }),
259
+ /* @__PURE__ */ jsxs(CardContent, { className: "space-y-2", children: [
260
+ place.type && /* @__PURE__ */ jsxs("div", { className: "flex justify-between items-center", children: [
261
+ /* @__PURE__ */ jsx(Text, { as: "span", variant: "body-sm", color: "muted", children: labels.type }),
262
+ /* @__PURE__ */ jsx(Text, { as: "span", color: "default", children: getTypeLabel(place.type) })
263
+ ] }),
264
+ place.business_status && /* @__PURE__ */ jsxs("div", { className: "flex justify-between items-center", children: [
265
+ /* @__PURE__ */ jsx(Text, { as: "span", variant: "body-sm", color: "muted", children: labels.status }),
266
+ /* @__PURE__ */ jsx(
267
+ Badge,
268
+ {
269
+ variant: place.business_status === "operational" ? "default" : place.business_status === "closed_temporarily" ? "secondary" : "destructive",
270
+ children: getStatusLabel(place.business_status)
271
+ }
272
+ )
273
+ ] })
274
+ ] })
275
+ ] })
276
+ ] });
277
+ }
278
+
279
+ export { PlaceAboutTab };
@@ -0,0 +1,25 @@
1
+ import { cn } from './chunk-FEK5XGZW.js';
2
+ import { __objRest, __spreadProps, __spreadValues } from './chunk-3GWWZKX7.js';
3
+ import * as React from 'react';
4
+ import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
5
+ import { Check } from 'lucide-react';
6
+ import { jsx } from 'react/jsx-runtime';
7
+
8
+ var Checkbox = React.forwardRef((_a, ref) => {
9
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
10
+ return /* @__PURE__ */ jsx(
11
+ CheckboxPrimitive.Root,
12
+ __spreadProps(__spreadValues({
13
+ ref,
14
+ className: cn(
15
+ "peer h-5 w-5 shrink-0 rounded-md border border-border bg-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary data-[state=checked]:shadow-lg data-[state=checked]:shadow-primary/20 data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground data-[state=indeterminate]:border-primary data-[state=indeterminate]:shadow-lg data-[state=indeterminate]:shadow-primary/20 hover:border-primary/40 hover:shadow-md",
16
+ className
17
+ )
18
+ }, props), {
19
+ children: /* @__PURE__ */ jsx(CheckboxPrimitive.Indicator, { className: cn("flex items-center justify-center text-current"), children: /* @__PURE__ */ jsx(Check, { className: "h-3.5 w-3.5 animate-in zoom-in-50 duration-200" }) })
20
+ })
21
+ );
22
+ });
23
+ Checkbox.displayName = CheckboxPrimitive.Root.displayName;
24
+
25
+ export { Checkbox };
@@ -58,6 +58,20 @@ var CardContent = React.forwardRef(
58
58
  }
59
59
  );
60
60
  CardContent.displayName = "CardContent";
61
+ var CardAction = React.forwardRef(
62
+ (_a, ref) => {
63
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
64
+ return /* @__PURE__ */ jsx(
65
+ "div",
66
+ __spreadValues({
67
+ ref,
68
+ "data-slot": "card-action",
69
+ className: cn("col-start-2 row-span-2 row-start-1 self-start justify-self-end", className)
70
+ }, props)
71
+ );
72
+ }
73
+ );
74
+ CardAction.displayName = "CardAction";
61
75
  var CardFooter = React.forwardRef(
62
76
  (_a, ref) => {
63
77
  var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
@@ -66,4 +80,4 @@ var CardFooter = React.forwardRef(
66
80
  );
67
81
  CardFooter.displayName = "CardFooter";
68
82
 
69
- export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };
83
+ export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };
@@ -7,6 +7,7 @@ function Skeleton(_a) {
7
7
  return /* @__PURE__ */ jsx(
8
8
  "div",
9
9
  __spreadValues({
10
+ "data-slot": "skeleton",
10
11
  className: cn(
11
12
  "animate-pulse rounded-xl glass border border-border/30 relative overflow-hidden",
12
13
  "before:absolute before:inset-0 before:-translate-x-full before:animate-[shimmer_2s_infinite] before:bg-gradient-to-r before:from-transparent before:via-white/10 before:to-transparent",
@@ -1,4 +1,4 @@
1
- import { buttonVariants } from '../chunk-2CUFS5LF.js';
1
+ import { buttonVariants } from '../chunk-2BMJRXQX.js';
2
2
  import '../chunk-R47NEOSI.js';
3
3
  import { cn } from '../chunk-FEK5XGZW.js';
4
4
  import { __objRest, __spreadProps, __spreadValues } from '../chunk-3GWWZKX7.js';
@@ -1,4 +1,4 @@
1
- export { Button, buttonVariants } from '../chunk-2CUFS5LF.js';
1
+ export { Button, buttonVariants } from '../chunk-2BMJRXQX.js';
2
2
  import '../chunk-R47NEOSI.js';
3
3
  import '../chunk-FEK5XGZW.js';
4
4
  import '../chunk-3GWWZKX7.js';
@@ -1,11 +1,13 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
- import { DayPicker } from 'react-day-picker';
3
+ import { DayPicker, DayButton } from 'react-day-picker';
4
+ import { Button } from './button.js';
5
+ import 'class-variance-authority/types';
6
+ import 'class-variance-authority';
4
7
 
5
- type CalendarProps = React.ComponentProps<typeof DayPicker>;
6
- declare function Calendar({ className, classNames, showOutsideDays, ...props }: CalendarProps): react_jsx_runtime.JSX.Element;
7
- declare namespace Calendar {
8
- var displayName: string;
9
- }
8
+ declare function Calendar({ className, classNames, showOutsideDays, captionLayout, buttonVariant, formatters, components, ...props }: React.ComponentProps<typeof DayPicker> & {
9
+ buttonVariant?: React.ComponentProps<typeof Button>["variant"];
10
+ }): react_jsx_runtime.JSX.Element;
11
+ declare function CalendarDayButton({ className, day, modifiers, ...props }: React.ComponentProps<typeof DayButton>): react_jsx_runtime.JSX.Element;
10
12
 
11
- export { Calendar, type CalendarProps };
13
+ export { Calendar, CalendarDayButton };
@@ -1,56 +1,170 @@
1
- import { buttonVariants } from '../chunk-2CUFS5LF.js';
1
+ import { buttonVariants, Button } from '../chunk-2BMJRXQX.js';
2
2
  import '../chunk-R47NEOSI.js';
3
3
  import { cn } from '../chunk-FEK5XGZW.js';
4
- import { __objRest, __spreadValues } from '../chunk-3GWWZKX7.js';
5
- import { ChevronLeft, ChevronRight } from 'lucide-react';
6
- import { DayPicker } from 'react-day-picker';
4
+ import { __objRest, __spreadValues, __spreadProps } from '../chunk-3GWWZKX7.js';
5
+ import * as React from 'react';
6
+ import { ChevronLeftIcon, ChevronRightIcon, ChevronDownIcon } from 'lucide-react';
7
+ import { getDefaultClassNames, DayPicker } from 'react-day-picker';
7
8
  import { jsx } from 'react/jsx-runtime';
8
9
 
9
10
  function Calendar(_a) {
10
- var _b = _a, { className, classNames, showOutsideDays = true } = _b, props = __objRest(_b, ["className", "classNames", "showOutsideDays"]);
11
+ var _b = _a, {
12
+ className,
13
+ classNames,
14
+ showOutsideDays = true,
15
+ captionLayout = "label",
16
+ buttonVariant = "ghost",
17
+ formatters,
18
+ components
19
+ } = _b, props = __objRest(_b, [
20
+ "className",
21
+ "classNames",
22
+ "showOutsideDays",
23
+ "captionLayout",
24
+ "buttonVariant",
25
+ "formatters",
26
+ "components"
27
+ ]);
28
+ const defaultClassNames = getDefaultClassNames();
11
29
  return /* @__PURE__ */ jsx(
12
30
  DayPicker,
13
31
  __spreadValues({
14
32
  showOutsideDays,
15
- className: cn("p-3", className),
33
+ className: cn(
34
+ "group/calendar bg-background p-3 [--cell-size:--spacing(8)] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent",
35
+ String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`,
36
+ String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`,
37
+ className
38
+ ),
39
+ captionLayout,
40
+ formatters: __spreadValues({
41
+ formatMonthDropdown: (date) => date.toLocaleString("default", { month: "short" })
42
+ }, formatters),
16
43
  classNames: __spreadValues({
17
- months: "flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0",
18
- month: "space-y-4",
19
- caption: "flex justify-center pt-1 relative items-center",
20
- caption_label: "text-sm font-medium",
21
- nav: "space-x-1 flex items-center",
22
- nav_button: cn(
23
- buttonVariants({ variant: "outline" }),
24
- "h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100 glass-hover"
25
- ),
26
- nav_button_previous: "absolute left-1",
27
- nav_button_next: "absolute right-1",
28
- table: "w-full border-collapse space-y-1",
29
- head_row: "flex",
30
- head_cell: "text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]",
31
- row: "flex w-full mt-2",
32
- cell: "h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20",
44
+ root: cn("w-fit", defaultClassNames.root),
45
+ months: cn("relative flex flex-col gap-4 md:flex-row", defaultClassNames.months),
46
+ month: cn("flex w-full flex-col gap-4", defaultClassNames.month),
47
+ nav: cn(
48
+ "absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1",
49
+ defaultClassNames.nav
50
+ ),
51
+ button_previous: cn(
52
+ buttonVariants({ variant: buttonVariant }),
53
+ "size-(--cell-size) p-0 select-none aria-disabled:opacity-50",
54
+ defaultClassNames.button_previous
55
+ ),
56
+ button_next: cn(
57
+ buttonVariants({ variant: buttonVariant }),
58
+ "size-(--cell-size) p-0 select-none aria-disabled:opacity-50",
59
+ defaultClassNames.button_next
60
+ ),
61
+ month_caption: cn(
62
+ "flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)",
63
+ defaultClassNames.month_caption
64
+ ),
65
+ dropdowns: cn(
66
+ "flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium",
67
+ defaultClassNames.dropdowns
68
+ ),
69
+ dropdown_root: cn(
70
+ "relative rounded-md border border-input shadow-xs has-focus:border-ring has-focus:ring-[3px] has-focus:ring-ring/50",
71
+ defaultClassNames.dropdown_root
72
+ ),
73
+ dropdown: cn("absolute inset-0 bg-popover opacity-0", defaultClassNames.dropdown),
74
+ caption_label: cn(
75
+ "font-medium select-none",
76
+ captionLayout === "label" ? "text-sm" : "flex h-8 items-center gap-1 rounded-md pr-1 pl-2 text-sm [&>svg]:size-3.5 [&>svg]:text-muted-foreground",
77
+ defaultClassNames.caption_label
78
+ ),
79
+ table: "w-full border-collapse",
80
+ weekdays: cn("flex", defaultClassNames.weekdays),
81
+ weekday: cn(
82
+ "flex-1 rounded-md text-[0.8rem] font-normal text-muted-foreground select-none",
83
+ defaultClassNames.weekday
84
+ ),
85
+ week: cn("mt-2 flex w-full", defaultClassNames.week),
86
+ week_number_header: cn("w-(--cell-size) select-none", defaultClassNames.week_number_header),
87
+ week_number: cn(
88
+ "text-[0.8rem] text-muted-foreground select-none",
89
+ defaultClassNames.week_number
90
+ ),
33
91
  day: cn(
34
- buttonVariants({ variant: "ghost" }),
35
- "h-9 w-9 p-0 font-normal aria-selected:opacity-100 glass-hover"
36
- ),
37
- day_range_end: "day-range-end",
38
- day_selected: "bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground glass-glow",
39
- day_today: "bg-accent text-accent-foreground",
40
- day_outside: "day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 aria-selected:text-muted-foreground aria-selected:opacity-30",
41
- day_disabled: "text-muted-foreground opacity-50",
42
- day_range_middle: "aria-selected:bg-accent aria-selected:text-accent-foreground",
43
- day_hidden: "invisible"
92
+ "group/day relative aspect-square h-full w-full p-0 text-center select-none [&:last-child[data-selected=true]_button]:rounded-r-md",
93
+ props.showWeekNumber ? "[&:nth-child(2)[data-selected=true]_button]:rounded-l-md" : "[&:first-child[data-selected=true]_button]:rounded-l-md",
94
+ defaultClassNames.day
95
+ ),
96
+ range_start: cn("rounded-l-md bg-accent", defaultClassNames.range_start),
97
+ range_middle: cn("rounded-none", defaultClassNames.range_middle),
98
+ range_end: cn("rounded-r-md bg-accent", defaultClassNames.range_end),
99
+ today: cn(
100
+ "rounded-md bg-accent text-accent-foreground data-[selected=true]:rounded-none",
101
+ defaultClassNames.today
102
+ ),
103
+ outside: cn(
104
+ "text-muted-foreground aria-selected:text-muted-foreground",
105
+ defaultClassNames.outside
106
+ ),
107
+ disabled: cn("text-muted-foreground opacity-50", defaultClassNames.disabled),
108
+ hidden: cn("invisible", defaultClassNames.hidden)
44
109
  }, classNames),
45
- components: {
46
- Chevron: (props2) => {
47
- if (props2.orientation === "left") return /* @__PURE__ */ jsx(ChevronLeft, { className: "h-4 w-4" });
48
- return /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4" });
110
+ components: __spreadValues({
111
+ Root: (_a2) => {
112
+ var _b2 = _a2, { className: className2, rootRef } = _b2, props2 = __objRest(_b2, ["className", "rootRef"]);
113
+ return /* @__PURE__ */ jsx("div", __spreadValues({ "data-slot": "calendar", ref: rootRef, className: cn(className2) }, props2));
114
+ },
115
+ Chevron: (_c) => {
116
+ var _d = _c, { className: className2, orientation } = _d, props2 = __objRest(_d, ["className", "orientation"]);
117
+ if (orientation === "left") {
118
+ return /* @__PURE__ */ jsx(ChevronLeftIcon, __spreadValues({ className: cn("size-4", className2) }, props2));
119
+ }
120
+ if (orientation === "right") {
121
+ return /* @__PURE__ */ jsx(ChevronRightIcon, __spreadValues({ className: cn("size-4", className2) }, props2));
122
+ }
123
+ return /* @__PURE__ */ jsx(ChevronDownIcon, __spreadValues({ className: cn("size-4", className2) }, props2));
124
+ },
125
+ DayButton: CalendarDayButton,
126
+ WeekNumber: (_e) => {
127
+ var _f = _e, { children } = _f, props2 = __objRest(_f, ["children"]);
128
+ return /* @__PURE__ */ jsx("td", __spreadProps(__spreadValues({}, props2), { children: /* @__PURE__ */ jsx("div", { className: "flex size-(--cell-size) items-center justify-center text-center", children }) }));
49
129
  }
50
- }
130
+ }, components)
131
+ }, props)
132
+ );
133
+ }
134
+ function CalendarDayButton(_a) {
135
+ var _b = _a, {
136
+ className,
137
+ day,
138
+ modifiers
139
+ } = _b, props = __objRest(_b, [
140
+ "className",
141
+ "day",
142
+ "modifiers"
143
+ ]);
144
+ const defaultClassNames = getDefaultClassNames();
145
+ const ref = React.useRef(null);
146
+ React.useEffect(() => {
147
+ var _a2;
148
+ if (modifiers.focused) (_a2 = ref.current) == null ? void 0 : _a2.focus();
149
+ }, [modifiers.focused]);
150
+ return /* @__PURE__ */ jsx(
151
+ Button,
152
+ __spreadValues({
153
+ ref,
154
+ variant: "ghost",
155
+ size: "icon",
156
+ "data-day": day.date.toLocaleDateString(),
157
+ "data-selected-single": modifiers.selected && !modifiers.range_start && !modifiers.range_end && !modifiers.range_middle,
158
+ "data-range-start": modifiers.range_start,
159
+ "data-range-end": modifiers.range_end,
160
+ "data-range-middle": modifiers.range_middle,
161
+ className: cn(
162
+ "group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground dark:hover:text-accent-foreground flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md [&>span]:text-xs [&>span]:opacity-70",
163
+ defaultClassNames.day,
164
+ className
165
+ )
51
166
  }, props)
52
167
  );
53
168
  }
54
- Calendar.displayName = "Calendar";
55
169
 
56
- export { Calendar };
170
+ export { Calendar, CalendarDayButton };
@@ -8,6 +8,7 @@ declare const CardHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<H
8
8
  declare const CardTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
9
9
  declare const CardDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
10
10
  declare const CardContent: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
11
+ declare const CardAction: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
11
12
  declare const CardFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
12
13
 
13
- export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };
14
+ export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };
@@ -1,4 +1,4 @@
1
- export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '../chunk-UXAYXRFN.js';
1
+ export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '../chunk-QJ54Z7TC.js';
2
2
  import '../chunk-4KOMHDZD.js';
3
3
  import '../chunk-FEK5XGZW.js';
4
4
  import '../chunk-3GWWZKX7.js';
@@ -1,4 +1,4 @@
1
- import { Button } from '../chunk-2CUFS5LF.js';
1
+ import { Button } from '../chunk-2BMJRXQX.js';
2
2
  import '../chunk-R47NEOSI.js';
3
3
  import { cn } from '../chunk-FEK5XGZW.js';
4
4
  import { __objRest, __spreadProps, __spreadValues } from '../chunk-3GWWZKX7.js';