@dododog/ui 0.2.1 → 0.4.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 (47) hide show
  1. package/dist/{chunk-OK3E73OK.js → chunk-2XH74PQR.js} +14 -0
  2. package/dist/chunk-36JNXXGH.js +360 -0
  3. package/dist/chunk-5A3MVRZJ.js +109 -0
  4. package/dist/{chunk-KVVXKSMQ.mjs → chunk-7JYJ7ICL.mjs} +14 -0
  5. package/dist/{chunk-NWLJ7VQF.js → chunk-AIA3NHCK.js} +1 -2
  6. package/dist/{chunk-YSJAEDMG.js → chunk-E24VNM6S.js} +8 -5
  7. package/dist/{chunk-RQGC6RPI.mjs → chunk-FL3GD5FJ.mjs} +1 -2
  8. package/dist/{chunk-TNGW36OC.mjs → chunk-LRNSVRUN.mjs} +2 -0
  9. package/dist/{chunk-76DZXGKJ.mjs → chunk-N6THLJIG.mjs} +8 -5
  10. package/dist/chunk-PBDPZTHK.mjs +53 -0
  11. package/dist/chunk-PU4CWOWU.mjs +87 -0
  12. package/dist/chunk-S732LTPT.js +75 -0
  13. package/dist/{chunk-3BPC4LNH.js → chunk-T4AT3YCT.js} +2 -0
  14. package/dist/chunk-XH2MVC4W.mjs +337 -0
  15. package/dist/components/AnchorTabs/index.d.mts +41 -0
  16. package/dist/components/AnchorTabs/index.d.ts +41 -0
  17. package/dist/components/AnchorTabs/index.js +11 -0
  18. package/dist/components/AnchorTabs/index.mjs +2 -0
  19. package/dist/components/Counter/index.js +2 -2
  20. package/dist/components/Counter/index.mjs +1 -1
  21. package/dist/components/DateRangePicker/index.js +3 -3
  22. package/dist/components/DateRangePicker/index.mjs +1 -1
  23. package/dist/components/DetailList/index.d.mts +8 -2
  24. package/dist/components/DetailList/index.d.ts +8 -2
  25. package/dist/components/DetailList/index.js +2 -2
  26. package/dist/components/DetailList/index.mjs +1 -1
  27. package/dist/components/FloatingDock/index.d.mts +44 -0
  28. package/dist/components/FloatingDock/index.d.ts +44 -0
  29. package/dist/components/FloatingDock/index.js +11 -0
  30. package/dist/components/FloatingDock/index.mjs +2 -0
  31. package/dist/components/RoomTypeCard/index.d.mts +92 -0
  32. package/dist/components/RoomTypeCard/index.d.ts +92 -0
  33. package/dist/components/RoomTypeCard/index.js +16 -0
  34. package/dist/components/RoomTypeCard/index.mjs +3 -0
  35. package/dist/index.d.mts +125 -4
  36. package/dist/index.d.ts +125 -4
  37. package/dist/index.js +542 -102
  38. package/dist/index.mjs +426 -22
  39. package/dist/tailwind-preset.d.mts +11 -0
  40. package/dist/tailwind-preset.d.ts +11 -0
  41. package/dist/tailwind-preset.js +7 -7
  42. package/dist/tailwind-preset.mjs +1 -1
  43. package/dist/tokens/index.d.mts +11 -0
  44. package/dist/tokens/index.d.ts +11 -0
  45. package/dist/tokens/index.js +8 -8
  46. package/dist/tokens/index.mjs +1 -1
  47. package/package.json +16 -1
package/dist/index.mjs CHANGED
@@ -1,62 +1,466 @@
1
+ export { Toast, toastVariants } from './chunk-YVTUUNAX.mjs';
2
+ export { Toggle } from './chunk-2AB5ZHY5.mjs';
3
+ export { Tooltip } from './chunk-2MJTZ6RR.mjs';
1
4
  export { VerticalMarquee } from './chunk-JP5ZR2HI.mjs';
5
+ export { Spinner, spinnerVariants } from './chunk-NCSFXSOZ.mjs';
6
+ export { StatCard } from './chunk-O2W7NR33.mjs';
7
+ export { StatusBadge, statusBadgeVariants } from './chunk-FZ7UNXSC.mjs';
2
8
  export { Stepper } from './chunk-2ASKBL63.mjs';
3
9
  export { Switch, switchThumbVariants, switchTrackVariants } from './chunk-DMCMWOBJ.mjs';
4
10
  export { Tabs } from './chunk-VOZPGXQD.mjs';
5
11
  export { Tag, tagVariants } from './chunk-WOG6V7OW.mjs';
6
12
  export { Textarea, textareaVariants } from './chunk-ZZ4EWC53.mjs';
7
- export { Toast, toastVariants } from './chunk-YVTUUNAX.mjs';
8
- export { Toggle } from './chunk-2AB5ZHY5.mjs';
9
- export { Tooltip } from './chunk-2MJTZ6RR.mjs';
13
+ export { RadioGroup } from './chunk-F2BUMJYW.mjs';
14
+ export { Rating } from './chunk-SGDC4IVX.mjs';
15
+ export { RoomTypeCard, RoomTypeCardSkeleton } from './chunk-XH2MVC4W.mjs';
10
16
  export { SearchBar } from './chunk-KQK7LFWM.mjs';
11
17
  export { SegmentedControl } from './chunk-36Y7UU32.mjs';
12
18
  export { Select, selectVariants } from './chunk-333YD5QI.mjs';
13
19
  export { Sidebar } from './chunk-MPL35D5G.mjs';
14
20
  export { Skeleton, SkeletonCircle, SkeletonImage, SkeletonText } from './chunk-PAHSQMXV.mjs';
15
- export { Spinner, spinnerVariants } from './chunk-NCSFXSOZ.mjs';
16
- export { StatCard } from './chunk-O2W7NR33.mjs';
17
- export { StatusBadge, statusBadgeVariants } from './chunk-FZ7UNXSC.mjs';
21
+ export { LoadingOverlay } from './chunk-WVEJS2J2.mjs';
22
+ export { MegaMenu } from './chunk-EUEM2D5M.mjs';
18
23
  export { MobileMenu } from './chunk-R4DC7XPP.mjs';
19
24
  export { Modal } from './chunk-74B2EGKT.mjs';
20
25
  export { Pagination } from './chunk-XQVODPHL.mjs';
21
26
  export { PriceDisplay } from './chunk-DGEXT7PN.mjs';
22
27
  export { ProgressBar, progressBarVariants, progressFillVariants } from './chunk-UGYMWWKT.mjs';
23
28
  export { PromoBanner, promoBannerVariants } from './chunk-FNDR3WOZ.mjs';
24
- export { RadioGroup } from './chunk-F2BUMJYW.mjs';
25
- export { Rating } from './chunk-SGDC4IVX.mjs';
29
+ export { Header } from './chunk-PPDKQ3FF.mjs';
26
30
  export { IconBadge, iconBadgeVariants } from './chunk-I4WCNTNP.mjs';
31
+ export { HotelCard } from './chunk-PXHZ4CXG.mjs';
27
32
  export { ImageGallery } from './chunk-QU6ZRLKO.mjs';
28
33
  export { ImageWithFallback } from './chunk-BUXVK2HE.mjs';
29
- export { Input, inputVariants } from './chunk-GRG4USTC.mjs';
30
34
  export { Lightbox } from './chunk-GBWVIY3C.mjs';
35
+ export { Input, inputVariants } from './chunk-GRG4USTC.mjs';
31
36
  export { LinkCard } from './chunk-UYDZKAGZ.mjs';
32
- export { LoadingOverlay } from './chunk-WVEJS2J2.mjs';
33
- export { MegaMenu } from './chunk-EUEM2D5M.mjs';
37
+ export { DualRangeSlider } from './chunk-ERL3WXNY.mjs';
34
38
  export { EmptyState } from './chunk-OCUHCDAQ.mjs';
35
39
  export { ErrorBoundary } from './chunk-5257MWFI.mjs';
36
40
  export { FilterAccordion } from './chunk-VQVRKRSM.mjs';
41
+ export { FloatingDock } from './chunk-PBDPZTHK.mjs';
37
42
  export { FilterPill } from './chunk-TNWMTKNR.mjs';
38
43
  export { Footer } from './chunk-SZ3SV4SJ.mjs';
39
44
  export { GuestPicker } from './chunk-EJ7LDW7E.mjs';
40
- export { Header } from './chunk-PPDKQ3FF.mjs';
41
- export { HotelCard } from './chunk-PXHZ4CXG.mjs';
45
+ export { Carousel } from './chunk-OOPP4ES2.mjs';
42
46
  export { Checkbox } from './chunk-EEIPCJQ2.mjs';
43
- export { Counter } from './chunk-TNGW36OC.mjs';
44
- export { DatePickerInput, DateRangePicker } from './chunk-RQGC6RPI.mjs';
45
- export { DetailList } from './chunk-76DZXGKJ.mjs';
46
- export { Drawer } from './chunk-ZLF7IL3Y.mjs';
47
+ export { DetailList } from './chunk-N6THLJIG.mjs';
47
48
  export { Divider } from './chunk-E4B6LXK7.mjs';
48
- export { DualRangeSlider } from './chunk-ERL3WXNY.mjs';
49
+ export { DatePickerInput, DateRangePicker } from './chunk-FL3GD5FJ.mjs';
50
+ export { Counter } from './chunk-LRNSVRUN.mjs';
51
+ export { Drawer } from './chunk-ZLF7IL3Y.mjs';
49
52
  export { DropdownMenu } from './chunk-Q7BKR6O7.mjs';
53
+ export { Avatar } from './chunk-2POGTS27.mjs';
50
54
  export { Badge, badgeVariants } from './chunk-XZU2SISM.mjs';
51
- export { BottomNavBar } from './chunk-UQRQZLMQ.mjs';
52
55
  export { Banner, bannerVariants } from './chunk-LFIZX2S6.mjs';
56
+ export { BottomNavBar } from './chunk-UQRQZLMQ.mjs';
53
57
  export { Breadcrumb, breadcrumbVariants } from './chunk-UKCH6RYL.mjs';
54
- export { Card, CardContent, CardDescription, CardImage, CardTitle, cardImageVariants, cardVariants } from './chunk-V5J2XLPD.mjs';
55
58
  export { Button, buttonVariants } from './chunk-4U5MNA3B.mjs';
59
+ export { Card, CardContent, CardDescription, CardImage, CardTitle, cardImageVariants, cardVariants } from './chunk-V5J2XLPD.mjs';
56
60
  export { CardList } from './chunk-RJWHPHHX.mjs';
57
- export { Carousel } from './chunk-OOPP4ES2.mjs';
58
61
  export { Accordion } from './chunk-NZ7GF6RF.mjs';
59
62
  export { Alert } from './chunk-BQWVWK74.mjs';
63
+ export { AnchorTabs } from './chunk-PU4CWOWU.mjs';
60
64
  export { Autocomplete, autocompleteInputVariants } from './chunk-B47HQHX3.mjs';
61
- export { Avatar } from './chunk-2POGTS27.mjs';
65
+ import { cn } from './chunk-IMKLN273.mjs';
62
66
  export { cn } from './chunk-IMKLN273.mjs';
67
+ import * as React from 'react';
68
+ import { cva } from 'class-variance-authority';
69
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
70
+
71
+ var searchFieldVariants = cva(
72
+ "w-full border bg-white transition-all text-primary placeholder:text-text-muted",
73
+ {
74
+ variants: {
75
+ size: {
76
+ md: "pl-11 pr-11 py-3 text-sm rounded-xl",
77
+ lg: "pl-12 pr-12 py-4 text-base rounded-2xl",
78
+ xl: "pl-14 pr-14 py-5 text-lg rounded-2xl"
79
+ },
80
+ variant: {
81
+ default: "border-gray-200 focus:border-secondary focus:outline-none focus:ring-2 focus:ring-secondary/30",
82
+ hero: "border-white/20 bg-white/10 text-white placeholder:text-white/50 focus:bg-white/20 focus:outline-none focus:ring-2 focus:ring-white/30 focus:border-white/40 backdrop-blur-sm"
83
+ }
84
+ },
85
+ defaultVariants: {
86
+ size: "lg",
87
+ variant: "default"
88
+ }
89
+ }
90
+ );
91
+ var iconSizeMap = {
92
+ md: 18,
93
+ lg: 20,
94
+ xl: 22
95
+ };
96
+ var iconPositionMap = {
97
+ md: "left-3.5",
98
+ lg: "left-4",
99
+ xl: "left-4.5"
100
+ };
101
+ var clearPositionMap = {
102
+ md: "right-3",
103
+ lg: "right-3.5",
104
+ xl: "right-4"
105
+ };
106
+ var SearchIcon = ({ size = 20 }) => /* @__PURE__ */ jsxs(
107
+ "svg",
108
+ {
109
+ xmlns: "http://www.w3.org/2000/svg",
110
+ width: size,
111
+ height: size,
112
+ viewBox: "0 0 24 24",
113
+ fill: "none",
114
+ stroke: "currentColor",
115
+ strokeWidth: "2",
116
+ strokeLinecap: "round",
117
+ strokeLinejoin: "round",
118
+ "aria-hidden": "true",
119
+ children: [
120
+ /* @__PURE__ */ jsx("circle", { cx: "11", cy: "11", r: "8" }),
121
+ /* @__PURE__ */ jsx("path", { d: "m21 21-4.3-4.3" })
122
+ ]
123
+ }
124
+ );
125
+ var ClearIcon = () => /* @__PURE__ */ jsxs(
126
+ "svg",
127
+ {
128
+ xmlns: "http://www.w3.org/2000/svg",
129
+ width: "16",
130
+ height: "16",
131
+ viewBox: "0 0 24 24",
132
+ fill: "none",
133
+ stroke: "currentColor",
134
+ strokeWidth: "2",
135
+ strokeLinecap: "round",
136
+ strokeLinejoin: "round",
137
+ "aria-hidden": "true",
138
+ children: [
139
+ /* @__PURE__ */ jsx("path", { d: "M18 6 6 18" }),
140
+ /* @__PURE__ */ jsx("path", { d: "m6 6 12 12" })
141
+ ]
142
+ }
143
+ );
144
+ var SearchField = React.forwardRef(
145
+ ({
146
+ className,
147
+ containerClassName,
148
+ size,
149
+ variant,
150
+ value,
151
+ onClear,
152
+ resultCount,
153
+ resultLabel,
154
+ ...props
155
+ }, ref) => {
156
+ const hasValue = typeof value === "string" && value.length > 0;
157
+ const resolvedSize = size ?? "lg";
158
+ const iconSize = iconSizeMap[resolvedSize] ?? 20;
159
+ const iconPosition = iconPositionMap[resolvedSize] ?? "left-4";
160
+ const clearPosition = clearPositionMap[resolvedSize] ?? "right-3.5";
161
+ const isHero = variant === "hero";
162
+ const iconColor = isHero ? "text-white/60" : "text-text-muted";
163
+ const clearColor = isHero ? "text-white/60 hover:text-white" : "text-text-muted hover:text-primary";
164
+ const countColor = isHero ? "text-white/50" : "text-text-muted";
165
+ return /* @__PURE__ */ jsxs("div", { className: cn("w-full", containerClassName), children: [
166
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
167
+ /* @__PURE__ */ jsx(
168
+ "div",
169
+ {
170
+ className: cn(
171
+ "absolute top-1/2 -translate-y-1/2 pointer-events-none",
172
+ iconPosition,
173
+ iconColor
174
+ ),
175
+ children: /* @__PURE__ */ jsx(SearchIcon, { size: iconSize })
176
+ }
177
+ ),
178
+ /* @__PURE__ */ jsx(
179
+ "input",
180
+ {
181
+ ref,
182
+ type: "text",
183
+ role: "searchbox",
184
+ className: cn(
185
+ searchFieldVariants({ size, variant }),
186
+ className
187
+ ),
188
+ value,
189
+ ...props
190
+ }
191
+ ),
192
+ hasValue && onClear && /* @__PURE__ */ jsx(
193
+ "button",
194
+ {
195
+ type: "button",
196
+ onClick: onClear,
197
+ className: cn(
198
+ "absolute top-1/2 -translate-y-1/2 p-1.5 rounded-lg transition-colors",
199
+ clearPosition,
200
+ clearColor
201
+ ),
202
+ "aria-label": "Effacer la recherche",
203
+ children: /* @__PURE__ */ jsx(ClearIcon, {})
204
+ }
205
+ )
206
+ ] }),
207
+ hasValue && resultCount != null && resultLabel && /* @__PURE__ */ jsxs(
208
+ "p",
209
+ {
210
+ className: cn("mt-2 text-sm", countColor),
211
+ "aria-live": "polite",
212
+ "aria-atomic": "true",
213
+ children: [
214
+ resultCount,
215
+ " ",
216
+ resultLabel
217
+ ]
218
+ }
219
+ )
220
+ ] });
221
+ }
222
+ );
223
+ SearchField.displayName = "SearchField";
224
+ function PawIcon({ className }) {
225
+ return /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, "aria-hidden": "true", children: [
226
+ /* @__PURE__ */ jsx("path", { d: "M10 5.172C10 3.782 8.423 2.679 6.5 3c-2.823.47-4.113 6.006-4 7 .08.703 1.725 1.722 3.656 1 1.261-.472 1.96-1.45 2.344-2.5" }),
227
+ /* @__PURE__ */ jsx("path", { d: "M14.267 5.172c0-1.39 1.577-2.493 3.5-2.172 2.823.47 4.113 6.006 4 7-.08.703-1.725 1.722-3.656 1-1.261-.472-1.855-1.45-2.239-2.5" }),
228
+ /* @__PURE__ */ jsx("path", { d: "M8 14v.5" }),
229
+ /* @__PURE__ */ jsx("path", { d: "M16 14v.5" }),
230
+ /* @__PURE__ */ jsx("path", { d: "M11.25 16.25h1.5L12 17l-.75-.75Z" }),
231
+ /* @__PURE__ */ jsx("path", { d: "M4.42 11.247A13.152 13.152 0 0 0 4 14.556C4 18.728 7.582 21 12 21s8-2.272 8-6.444c0-1.061-.162-2.2-.493-3.309m-9.243-6.082A8.801 8.801 0 0 1 12 5c.78 0 1.5.108 2.161.306" })
232
+ ] });
233
+ }
234
+ function CheckIcon({ className }) {
235
+ return /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "17", height: "17", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", className, "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M20 6 9 17l-5-5" }) });
236
+ }
237
+ var MD_COLS = {
238
+ 1: "md:grid-cols-1",
239
+ 2: "md:grid-cols-2",
240
+ 3: "md:grid-cols-3",
241
+ 4: "md:grid-cols-4"
242
+ };
243
+ function DogFriendlyPanel({
244
+ title = "Voyager avec votre chien",
245
+ confirmed = false,
246
+ confirmedLabel = "Confirm\xE9 par l'\xE9tablissement",
247
+ unconfirmedLabel = "Informations \xE0 confirmer",
248
+ stats,
249
+ perks,
250
+ className,
251
+ ...props
252
+ }) {
253
+ const mdCols = MD_COLS[Math.min(stats.length, 4)] ?? "md:grid-cols-4";
254
+ return /* @__PURE__ */ jsxs(
255
+ "section",
256
+ {
257
+ className: cn(
258
+ "rounded-2xl border border-secondary/25 bg-gradient-to-b from-secondary/[0.06] to-transparent p-4 md:p-6",
259
+ className
260
+ ),
261
+ ...props,
262
+ children: [
263
+ /* @__PURE__ */ jsxs("header", { className: "mb-4 flex items-center gap-3", children: [
264
+ /* @__PURE__ */ jsx("span", { className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-secondary text-white", children: /* @__PURE__ */ jsx(PawIcon, { className: "h-6 w-6" }) }),
265
+ /* @__PURE__ */ jsxs("div", { children: [
266
+ /* @__PURE__ */ jsx("h3", { className: "font-heading text-lg font-bold leading-tight text-primary", children: title }),
267
+ /* @__PURE__ */ jsxs(
268
+ "p",
269
+ {
270
+ className: cn(
271
+ "mt-0.5 inline-flex items-center gap-1 text-xs font-medium",
272
+ confirmed ? "text-accent-dark" : "text-text-muted"
273
+ ),
274
+ children: [
275
+ confirmed ? /* @__PURE__ */ jsx(CheckIcon, { className: "h-3.5 w-3.5" }) : null,
276
+ confirmed ? confirmedLabel : unconfirmedLabel
277
+ ]
278
+ }
279
+ )
280
+ ] })
281
+ ] }),
282
+ stats.length > 0 ? /* @__PURE__ */ jsx("div", { className: cn("mb-3 grid grid-cols-2 gap-2.5", mdCols), children: stats.map((stat) => /* @__PURE__ */ jsxs(
283
+ "div",
284
+ {
285
+ className: "rounded-xl border border-secondary/15 bg-white px-3 py-2.5",
286
+ children: [
287
+ /* @__PURE__ */ jsx("div", { className: "mb-0.5 text-[11px] uppercase tracking-wide text-text-muted", children: stat.label }),
288
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-semibold text-primary", children: stat.value }),
289
+ stat.note ? /* @__PURE__ */ jsx("div", { className: "text-xs text-text-secondary", children: stat.note }) : null
290
+ ]
291
+ },
292
+ stat.label
293
+ )) }) : null,
294
+ perks && perks.length > 0 ? /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-2 md:grid md:grid-cols-3 md:gap-x-7 md:gap-y-2.5", children: perks.map((perk) => /* @__PURE__ */ jsxs(
295
+ "li",
296
+ {
297
+ className: "flex items-center gap-2.5 text-sm text-primary",
298
+ children: [
299
+ /* @__PURE__ */ jsx(CheckIcon, { className: "h-[17px] w-[17px] shrink-0 text-accent" }),
300
+ perk
301
+ ]
302
+ },
303
+ perk
304
+ )) }) : null
305
+ ]
306
+ }
307
+ );
308
+ }
309
+ function CheckIcon2({ className }) {
310
+ return /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", className, "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "M20 6 9 17l-5-5" }) });
311
+ }
312
+ function formatScore(score) {
313
+ return score.toFixed(1).replace(".", ",");
314
+ }
315
+ function scoreBadgeClass(score) {
316
+ return score >= 8 ? "bg-primary" : "bg-rating-mid";
317
+ }
318
+ function ReviewSummary({
319
+ score,
320
+ scoreLabel,
321
+ count,
322
+ title = "Avis des voyageurs",
323
+ countLabel = "avis v\xE9rifi\xE9s",
324
+ sources,
325
+ subScores,
326
+ reviews,
327
+ onSeeAll,
328
+ seeAllLabel,
329
+ emptyLabel = "Peu d'avis v\xE9rifi\xE9s pour le moment",
330
+ className,
331
+ ...props
332
+ }) {
333
+ const hasReviews = Boolean(reviews && reviews.length > 0);
334
+ const isEmpty = score == null && !hasReviews;
335
+ return /* @__PURE__ */ jsxs(
336
+ "section",
337
+ {
338
+ className: cn(
339
+ "border-y border-sand-dark bg-surface-2 px-4 py-6 md:px-6 md:py-8",
340
+ className
341
+ ),
342
+ ...props,
343
+ children: [
344
+ /* @__PURE__ */ jsx("h2", { className: "mb-3 font-heading text-2xl font-bold tracking-tight text-primary", children: title }),
345
+ isEmpty ? /* @__PURE__ */ jsx("p", { className: "text-sm text-text-secondary", children: emptyLabel }) : /* @__PURE__ */ jsxs(Fragment, { children: [
346
+ score != null ? /* @__PURE__ */ jsxs("div", { className: "mb-1 flex items-baseline gap-2", children: [
347
+ /* @__PURE__ */ jsx("span", { className: "font-heading text-4xl font-bold leading-none text-primary", children: formatScore(score) }),
348
+ /* @__PURE__ */ jsx("span", { className: "text-lg font-medium text-text-muted", children: "/ 10" })
349
+ ] }) : null,
350
+ scoreLabel ? /* @__PURE__ */ jsx("div", { className: "font-heading text-lg font-bold text-primary", children: scoreLabel }) : null,
351
+ count != null ? /* @__PURE__ */ jsxs("div", { className: "mb-4 mt-1 text-sm text-text-secondary", children: [
352
+ count.toLocaleString("fr-FR"),
353
+ " ",
354
+ countLabel,
355
+ sources && sources.length > 0 ? /* @__PURE__ */ jsxs("span", { className: "text-text-muted", children: [
356
+ " \xB7 ",
357
+ sources.join(" \xB7 ")
358
+ ] }) : null
359
+ ] }) : null,
360
+ subScores && subScores.length > 0 ? /* @__PURE__ */ jsx("div", { className: "mb-5 flex border-y border-sand-dark", children: subScores.map((sub) => /* @__PURE__ */ jsxs(
361
+ "div",
362
+ {
363
+ className: "flex-1 border-l border-sand-dark px-1 py-3 text-center first:border-l-0",
364
+ children: [
365
+ /* @__PURE__ */ jsx("div", { className: "font-heading text-lg font-bold text-primary", children: formatScore(sub.value) }),
366
+ /* @__PURE__ */ jsx("div", { className: "mt-0.5 text-xs text-text-secondary", children: sub.label })
367
+ ]
368
+ },
369
+ sub.label
370
+ )) }) : null,
371
+ hasReviews ? /* @__PURE__ */ jsx("ul", { className: "-mx-4 flex gap-3 overflow-x-auto px-4 pb-1 [scrollbar-width:none] md:mx-0 md:px-0 [&::-webkit-scrollbar]:hidden", children: reviews.map((review, index) => /* @__PURE__ */ jsxs(
372
+ "li",
373
+ {
374
+ className: "flex w-[280px] shrink-0 flex-col rounded-2xl border border-sand-dark bg-white p-4",
375
+ children: [
376
+ /* @__PURE__ */ jsxs("div", { className: "mb-2 inline-flex items-center gap-2", children: [
377
+ /* @__PURE__ */ jsx(
378
+ "span",
379
+ {
380
+ className: cn(
381
+ "rounded-lg px-2 py-1 text-xs font-bold text-white",
382
+ scoreBadgeClass(review.score)
383
+ ),
384
+ children: formatScore(review.score)
385
+ }
386
+ ),
387
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-bold text-primary", children: review.scoreLabel })
388
+ ] }),
389
+ /* @__PURE__ */ jsx("p", { className: "m-0 text-sm leading-relaxed text-primary", children: review.text }),
390
+ /* @__PURE__ */ jsxs("div", { className: "mt-3.5", children: [
391
+ /* @__PURE__ */ jsx("div", { className: "text-sm font-semibold text-primary", children: review.author }),
392
+ review.meta ? /* @__PURE__ */ jsx("div", { className: "text-xs text-text-muted", children: review.meta }) : null,
393
+ /* @__PURE__ */ jsxs("div", { className: "mt-1.5 flex flex-wrap items-center gap-x-2.5 gap-y-1", children: [
394
+ review.verified ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 text-xs text-accent-dark", children: [
395
+ /* @__PURE__ */ jsx(CheckIcon2, { className: "h-3 w-3" }),
396
+ "Avis v\xE9rifi\xE9"
397
+ ] }) : null,
398
+ review.translatedFrom ? /* @__PURE__ */ jsxs("span", { className: "text-xs italic text-text-muted", children: [
399
+ "Traduit de ",
400
+ review.translatedFrom
401
+ ] }) : null
402
+ ] })
403
+ ] })
404
+ ]
405
+ },
406
+ `${review.author}-${index}`
407
+ )) }) : null,
408
+ onSeeAll ? /* @__PURE__ */ jsx(
409
+ "button",
410
+ {
411
+ type: "button",
412
+ onClick: onSeeAll,
413
+ className: "mt-4 w-full rounded-full border-[1.5px] border-primary bg-transparent px-4 py-3 text-sm font-semibold text-primary transition-colors hover:bg-primary hover:text-white",
414
+ children: seeAllLabel ?? (count != null ? `Afficher les ${count.toLocaleString("fr-FR")} avis` : "Afficher tous les avis")
415
+ }
416
+ ) : null
417
+ ] })
418
+ ]
419
+ }
420
+ );
421
+ }
422
+ function MobileBookingBar({
423
+ price,
424
+ meta,
425
+ reassurance,
426
+ ctaLabel = "R\xE9server",
427
+ onReserve,
428
+ disabled = false,
429
+ className,
430
+ ...props
431
+ }) {
432
+ return /* @__PURE__ */ jsxs(
433
+ "div",
434
+ {
435
+ className: cn(
436
+ "sticky bottom-0 z-50 flex items-center justify-between gap-3 border-t border-sand-dark bg-white/95 px-4 pt-3 shadow-[0_-4px_20px_rgba(29,34,48,0.08)] backdrop-blur pb-[calc(env(safe-area-inset-bottom)+0.75rem)]",
437
+ className
438
+ ),
439
+ ...props,
440
+ children: [
441
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
442
+ /* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-1.5", children: [
443
+ /* @__PURE__ */ jsx("span", { className: "font-heading text-xl font-bold text-primary", children: price }),
444
+ meta ? /* @__PURE__ */ jsx("span", { className: "truncate text-xs text-text-muted", children: meta }) : null
445
+ ] }),
446
+ reassurance ? /* @__PURE__ */ jsx("div", { className: "text-[11px] text-text-muted", children: reassurance }) : null
447
+ ] }),
448
+ /* @__PURE__ */ jsx(
449
+ "button",
450
+ {
451
+ type: "button",
452
+ onClick: onReserve,
453
+ disabled,
454
+ className: cn(
455
+ "shrink-0 rounded-full px-6 py-3 text-[15px] font-semibold text-white transition-colors",
456
+ disabled ? "cursor-not-allowed bg-text-muted" : "bg-secondary shadow-[0_4px_12px_rgba(242,124,84,0.35)] hover:bg-secondary-dark"
457
+ ),
458
+ children: ctaLabel
459
+ }
460
+ )
461
+ ]
462
+ }
463
+ );
464
+ }
465
+
466
+ export { DogFriendlyPanel, MobileBookingBar, ReviewSummary, SearchField, searchFieldVariants };
@@ -29,6 +29,17 @@ declare const dododogPreset: {
29
29
  readonly secondary: "#6b7280";
30
30
  readonly muted: "#9ca3af";
31
31
  };
32
+ readonly ink: {
33
+ readonly DEFAULT: "#1d2230";
34
+ readonly soft: "#3b4559";
35
+ };
36
+ readonly surface: {
37
+ readonly 1: "#fdfcf9";
38
+ readonly 2: "#f7f3ec";
39
+ };
40
+ readonly positive: "#047857";
41
+ readonly danger: "#a8473b";
42
+ readonly "rating-mid": "#f5b301";
32
43
  readonly white: "#ffffff";
33
44
  readonly black: "#000000";
34
45
  };
@@ -29,6 +29,17 @@ declare const dododogPreset: {
29
29
  readonly secondary: "#6b7280";
30
30
  readonly muted: "#9ca3af";
31
31
  };
32
+ readonly ink: {
33
+ readonly DEFAULT: "#1d2230";
34
+ readonly soft: "#3b4559";
35
+ };
36
+ readonly surface: {
37
+ readonly 1: "#fdfcf9";
38
+ readonly 2: "#f7f3ec";
39
+ };
40
+ readonly positive: "#047857";
41
+ readonly danger: "#a8473b";
42
+ readonly "rating-mid": "#f5b301";
32
43
  readonly white: "#ffffff";
33
44
  readonly black: "#000000";
34
45
  };
@@ -1,17 +1,17 @@
1
1
  'use strict';
2
2
 
3
- var chunkOK3E73OK_js = require('./chunk-OK3E73OK.js');
3
+ var chunk2XH74PQR_js = require('./chunk-2XH74PQR.js');
4
4
 
5
5
  // src/tailwind-preset.ts
6
6
  var dododogPreset = {
7
7
  theme: {
8
8
  extend: {
9
- colors: chunkOK3E73OK_js.colors,
10
- fontFamily: chunkOK3E73OK_js.fontFamily,
11
- fontSize: chunkOK3E73OK_js.fontSize,
12
- boxShadow: chunkOK3E73OK_js.boxShadow,
13
- keyframes: chunkOK3E73OK_js.keyframes,
14
- animation: chunkOK3E73OK_js.animation
9
+ colors: chunk2XH74PQR_js.colors,
10
+ fontFamily: chunk2XH74PQR_js.fontFamily,
11
+ fontSize: chunk2XH74PQR_js.fontSize,
12
+ boxShadow: chunk2XH74PQR_js.boxShadow,
13
+ keyframes: chunk2XH74PQR_js.keyframes,
14
+ animation: chunk2XH74PQR_js.animation
15
15
  }
16
16
  }
17
17
  };
@@ -1,4 +1,4 @@
1
- import { animation, keyframes, boxShadow, fontSize, fontFamily, colors } from './chunk-KVVXKSMQ.mjs';
1
+ import { animation, keyframes, boxShadow, fontSize, fontFamily, colors } from './chunk-7JYJ7ICL.mjs';
2
2
 
3
3
  // src/tailwind-preset.ts
4
4
  var dododogPreset = {
@@ -26,6 +26,17 @@ declare const colors: {
26
26
  readonly secondary: "#6b7280";
27
27
  readonly muted: "#9ca3af";
28
28
  };
29
+ readonly ink: {
30
+ readonly DEFAULT: "#1d2230";
31
+ readonly soft: "#3b4559";
32
+ };
33
+ readonly surface: {
34
+ readonly 1: "#fdfcf9";
35
+ readonly 2: "#f7f3ec";
36
+ };
37
+ readonly positive: "#047857";
38
+ readonly danger: "#a8473b";
39
+ readonly "rating-mid": "#f5b301";
29
40
  readonly white: "#ffffff";
30
41
  readonly black: "#000000";
31
42
  };
@@ -26,6 +26,17 @@ declare const colors: {
26
26
  readonly secondary: "#6b7280";
27
27
  readonly muted: "#9ca3af";
28
28
  };
29
+ readonly ink: {
30
+ readonly DEFAULT: "#1d2230";
31
+ readonly soft: "#3b4559";
32
+ };
33
+ readonly surface: {
34
+ readonly 1: "#fdfcf9";
35
+ readonly 2: "#f7f3ec";
36
+ };
37
+ readonly positive: "#047857";
38
+ readonly danger: "#a8473b";
39
+ readonly "rating-mid": "#f5b301";
29
40
  readonly white: "#ffffff";
30
41
  readonly black: "#000000";
31
42
  };
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkOK3E73OK_js = require('../chunk-OK3E73OK.js');
3
+ var chunk2XH74PQR_js = require('../chunk-2XH74PQR.js');
4
4
 
5
5
  // src/tokens/spacing.ts
6
6
  var spacing = {
@@ -54,31 +54,31 @@ var borderRadius = {
54
54
 
55
55
  Object.defineProperty(exports, "animation", {
56
56
  enumerable: true,
57
- get: function () { return chunkOK3E73OK_js.animation; }
57
+ get: function () { return chunk2XH74PQR_js.animation; }
58
58
  });
59
59
  Object.defineProperty(exports, "boxShadow", {
60
60
  enumerable: true,
61
- get: function () { return chunkOK3E73OK_js.boxShadow; }
61
+ get: function () { return chunk2XH74PQR_js.boxShadow; }
62
62
  });
63
63
  Object.defineProperty(exports, "colors", {
64
64
  enumerable: true,
65
- get: function () { return chunkOK3E73OK_js.colors; }
65
+ get: function () { return chunk2XH74PQR_js.colors; }
66
66
  });
67
67
  Object.defineProperty(exports, "fontFamily", {
68
68
  enumerable: true,
69
- get: function () { return chunkOK3E73OK_js.fontFamily; }
69
+ get: function () { return chunk2XH74PQR_js.fontFamily; }
70
70
  });
71
71
  Object.defineProperty(exports, "fontSize", {
72
72
  enumerable: true,
73
- get: function () { return chunkOK3E73OK_js.fontSize; }
73
+ get: function () { return chunk2XH74PQR_js.fontSize; }
74
74
  });
75
75
  Object.defineProperty(exports, "keyframes", {
76
76
  enumerable: true,
77
- get: function () { return chunkOK3E73OK_js.keyframes; }
77
+ get: function () { return chunk2XH74PQR_js.keyframes; }
78
78
  });
79
79
  Object.defineProperty(exports, "typography", {
80
80
  enumerable: true,
81
- get: function () { return chunkOK3E73OK_js.typography; }
81
+ get: function () { return chunk2XH74PQR_js.typography; }
82
82
  });
83
83
  exports.borderRadius = borderRadius;
84
84
  exports.spacing = spacing;
@@ -1,4 +1,4 @@
1
- export { animation, boxShadow, colors, fontFamily, fontSize, keyframes, typography } from '../chunk-KVVXKSMQ.mjs';
1
+ export { animation, boxShadow, colors, fontFamily, fontSize, keyframes, typography } from '../chunk-7JYJ7ICL.mjs';
2
2
 
3
3
  // src/tokens/spacing.ts
4
4
  var spacing = {