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