@dododog/ui 0.8.0 → 0.9.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 (153) hide show
  1. package/dist/{chunk-S26SN3WK.js → chunk-3JM2X4I2.js} +44 -40
  2. package/dist/{chunk-QTW2FJUJ.mjs → chunk-BFGRWOQM.mjs} +44 -40
  3. package/dist/chunk-P2SGBTKS.mjs +138 -0
  4. package/dist/chunk-ZCQJN4IT.js +160 -0
  5. package/dist/components/FloatingDock/index.js +2 -2
  6. package/dist/components/FloatingDock/index.mjs +1 -1
  7. package/dist/components/RoomTypeCard/index.js +3 -3
  8. package/dist/components/RoomTypeCard/index.mjs +1 -1
  9. package/dist/index.js +38 -38
  10. package/dist/index.mjs +9 -9
  11. package/package.json +11 -11
  12. package/dist/chunk-PBDPZTHK.mjs +0 -53
  13. package/dist/chunk-S732LTPT.js +0 -75
  14. package/dist/components/Accordion/index.d.mts +0 -24
  15. package/dist/components/Accordion/index.d.ts +0 -24
  16. package/dist/components/Alert/index.d.mts +0 -40
  17. package/dist/components/Alert/index.d.ts +0 -40
  18. package/dist/components/AnchorTabs/index.d.mts +0 -59
  19. package/dist/components/AnchorTabs/index.d.ts +0 -59
  20. package/dist/components/Autocomplete/index.d.mts +0 -27
  21. package/dist/components/Autocomplete/index.d.ts +0 -27
  22. package/dist/components/Avatar/index.d.mts +0 -13
  23. package/dist/components/Avatar/index.d.ts +0 -13
  24. package/dist/components/Badge/index.d.mts +0 -13
  25. package/dist/components/Badge/index.d.ts +0 -13
  26. package/dist/components/Banner/index.d.mts +0 -19
  27. package/dist/components/Banner/index.d.ts +0 -19
  28. package/dist/components/BottomNavBar/index.d.mts +0 -17
  29. package/dist/components/BottomNavBar/index.d.ts +0 -17
  30. package/dist/components/Breadcrumb/index.d.mts +0 -23
  31. package/dist/components/Breadcrumb/index.d.ts +0 -23
  32. package/dist/components/Button/index.d.mts +0 -17
  33. package/dist/components/Button/index.d.ts +0 -17
  34. package/dist/components/Card/index.d.mts +0 -30
  35. package/dist/components/Card/index.d.ts +0 -30
  36. package/dist/components/CardList/index.d.mts +0 -30
  37. package/dist/components/CardList/index.d.ts +0 -30
  38. package/dist/components/Carousel/index.d.mts +0 -15
  39. package/dist/components/Carousel/index.d.ts +0 -15
  40. package/dist/components/Checkbox/index.d.mts +0 -16
  41. package/dist/components/Checkbox/index.d.ts +0 -16
  42. package/dist/components/Counter/index.d.mts +0 -14
  43. package/dist/components/Counter/index.d.ts +0 -14
  44. package/dist/components/DateRangePicker/index.d.mts +0 -26
  45. package/dist/components/DateRangePicker/index.d.ts +0 -26
  46. package/dist/components/DetailList/index.d.mts +0 -23
  47. package/dist/components/DetailList/index.d.ts +0 -23
  48. package/dist/components/Divider/index.d.mts +0 -10
  49. package/dist/components/Divider/index.d.ts +0 -10
  50. package/dist/components/Drawer/index.d.mts +0 -13
  51. package/dist/components/Drawer/index.d.ts +0 -13
  52. package/dist/components/DropdownMenu/index.d.mts +0 -19
  53. package/dist/components/DropdownMenu/index.d.ts +0 -19
  54. package/dist/components/DualRangeSlider/index.d.mts +0 -26
  55. package/dist/components/DualRangeSlider/index.d.ts +0 -26
  56. package/dist/components/EmptyState/index.d.mts +0 -12
  57. package/dist/components/EmptyState/index.d.ts +0 -12
  58. package/dist/components/ErrorBoundary/index.d.mts +0 -21
  59. package/dist/components/ErrorBoundary/index.d.ts +0 -21
  60. package/dist/components/FilterAccordion/index.d.mts +0 -16
  61. package/dist/components/FilterAccordion/index.d.ts +0 -16
  62. package/dist/components/FilterPill/index.d.mts +0 -19
  63. package/dist/components/FilterPill/index.d.ts +0 -19
  64. package/dist/components/FloatingDock/index.d.mts +0 -44
  65. package/dist/components/FloatingDock/index.d.ts +0 -44
  66. package/dist/components/Footer/index.d.mts +0 -46
  67. package/dist/components/Footer/index.d.ts +0 -46
  68. package/dist/components/GuestPicker/index.d.mts +0 -31
  69. package/dist/components/GuestPicker/index.d.ts +0 -31
  70. package/dist/components/Header/index.d.mts +0 -37
  71. package/dist/components/Header/index.d.ts +0 -37
  72. package/dist/components/HotelCard/index.d.mts +0 -45
  73. package/dist/components/HotelCard/index.d.ts +0 -45
  74. package/dist/components/IconBadge/index.d.mts +0 -14
  75. package/dist/components/IconBadge/index.d.ts +0 -14
  76. package/dist/components/ImageGallery/index.d.mts +0 -16
  77. package/dist/components/ImageGallery/index.d.ts +0 -16
  78. package/dist/components/ImageWithFallback/index.d.mts +0 -17
  79. package/dist/components/ImageWithFallback/index.d.ts +0 -17
  80. package/dist/components/Input/index.d.mts +0 -18
  81. package/dist/components/Input/index.d.ts +0 -18
  82. package/dist/components/Lightbox/index.d.mts +0 -15
  83. package/dist/components/Lightbox/index.d.ts +0 -15
  84. package/dist/components/LinkCard/index.d.mts +0 -12
  85. package/dist/components/LinkCard/index.d.ts +0 -12
  86. package/dist/components/LoadingOverlay/index.d.mts +0 -12
  87. package/dist/components/LoadingOverlay/index.d.ts +0 -12
  88. package/dist/components/MegaMenu/index.d.mts +0 -52
  89. package/dist/components/MegaMenu/index.d.ts +0 -52
  90. package/dist/components/MobileMenu/index.d.mts +0 -35
  91. package/dist/components/MobileMenu/index.d.ts +0 -35
  92. package/dist/components/Modal/index.d.mts +0 -12
  93. package/dist/components/Modal/index.d.ts +0 -12
  94. package/dist/components/Pagination/index.d.mts +0 -13
  95. package/dist/components/Pagination/index.d.ts +0 -13
  96. package/dist/components/PriceDisplay/index.d.mts +0 -14
  97. package/dist/components/PriceDisplay/index.d.ts +0 -14
  98. package/dist/components/ProgressBar/index.d.mts +0 -19
  99. package/dist/components/ProgressBar/index.d.ts +0 -19
  100. package/dist/components/PromoBanner/index.d.mts +0 -39
  101. package/dist/components/PromoBanner/index.d.ts +0 -39
  102. package/dist/components/RadioGroup/index.d.mts +0 -21
  103. package/dist/components/RadioGroup/index.d.ts +0 -21
  104. package/dist/components/Rating/index.d.mts +0 -12
  105. package/dist/components/Rating/index.d.ts +0 -12
  106. package/dist/components/RoomTypeCard/index.d.mts +0 -102
  107. package/dist/components/RoomTypeCard/index.d.ts +0 -102
  108. package/dist/components/SearchBar/index.d.mts +0 -20
  109. package/dist/components/SearchBar/index.d.ts +0 -20
  110. package/dist/components/SegmentedControl/index.d.mts +0 -15
  111. package/dist/components/SegmentedControl/index.d.ts +0 -15
  112. package/dist/components/Select/index.d.mts +0 -26
  113. package/dist/components/Select/index.d.ts +0 -26
  114. package/dist/components/Sidebar/index.d.mts +0 -19
  115. package/dist/components/Sidebar/index.d.ts +0 -19
  116. package/dist/components/SignInCallout/index.d.mts +0 -26
  117. package/dist/components/SignInCallout/index.d.ts +0 -26
  118. package/dist/components/Skeleton/index.d.mts +0 -31
  119. package/dist/components/Skeleton/index.d.ts +0 -31
  120. package/dist/components/Spinner/index.d.mts +0 -13
  121. package/dist/components/Spinner/index.d.ts +0 -13
  122. package/dist/components/StatCard/index.d.mts +0 -15
  123. package/dist/components/StatCard/index.d.ts +0 -15
  124. package/dist/components/StatusBadge/index.d.mts +0 -16
  125. package/dist/components/StatusBadge/index.d.ts +0 -16
  126. package/dist/components/Stepper/index.d.mts +0 -16
  127. package/dist/components/Stepper/index.d.ts +0 -16
  128. package/dist/components/Switch/index.d.mts +0 -22
  129. package/dist/components/Switch/index.d.ts +0 -22
  130. package/dist/components/Tabs/index.d.mts +0 -18
  131. package/dist/components/Tabs/index.d.ts +0 -18
  132. package/dist/components/Tag/index.d.mts +0 -15
  133. package/dist/components/Tag/index.d.ts +0 -15
  134. package/dist/components/Textarea/index.d.mts +0 -16
  135. package/dist/components/Textarea/index.d.ts +0 -16
  136. package/dist/components/Toast/index.d.mts +0 -16
  137. package/dist/components/Toast/index.d.ts +0 -16
  138. package/dist/components/Toggle/index.d.mts +0 -13
  139. package/dist/components/Toggle/index.d.ts +0 -13
  140. package/dist/components/Tooltip/index.d.mts +0 -11
  141. package/dist/components/Tooltip/index.d.ts +0 -11
  142. package/dist/components/VerticalMarquee/index.d.mts +0 -16
  143. package/dist/components/VerticalMarquee/index.d.ts +0 -16
  144. package/dist/index.d.mts +0 -189
  145. package/dist/index.d.ts +0 -189
  146. package/dist/tailwind-preset.d.mts +0 -170
  147. package/dist/tailwind-preset.d.ts +0 -170
  148. package/dist/tokens/index.d.mts +0 -219
  149. package/dist/tokens/index.d.ts +0 -219
  150. package/dist/typography-BUlhEnfy.d.mts +0 -16
  151. package/dist/typography-BUlhEnfy.d.ts +0 -16
  152. package/dist/utils/index.d.mts +0 -5
  153. package/dist/utils/index.d.ts +0 -5
@@ -89,20 +89,20 @@ function formatPrice(price) {
89
89
  }
90
90
  function CancellationChip({ cancellation }) {
91
91
  if (cancellation.kind === "free") {
92
- return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1.5 text-xs font-medium text-emerald-700", children: [
93
- /* @__PURE__ */ jsxRuntime.jsx(CheckIcon, { className: "w-3.5 h-3.5 flex-shrink-0" }),
94
- cancellation.label
92
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-start gap-1.5 text-xs font-medium text-emerald-700", children: [
93
+ /* @__PURE__ */ jsxRuntime.jsx(CheckIcon, { className: "w-3.5 h-3.5 mt-[3px] flex-shrink-0" }),
94
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: cancellation.label })
95
95
  ] });
96
96
  }
97
97
  if (cancellation.kind === "partial") {
98
- return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1.5 text-xs font-medium text-amber-700", children: [
99
- /* @__PURE__ */ jsxRuntime.jsx(CheckIcon, { className: "w-3.5 h-3.5 flex-shrink-0" }),
100
- cancellation.label
98
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-start gap-1.5 text-xs font-medium text-amber-700", children: [
99
+ /* @__PURE__ */ jsxRuntime.jsx(CheckIcon, { className: "w-3.5 h-3.5 mt-[3px] flex-shrink-0" }),
100
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: cancellation.label })
101
101
  ] });
102
102
  }
103
- return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1.5 text-xs text-text-muted", children: [
104
- /* @__PURE__ */ jsxRuntime.jsx(NoRefundIcon, { className: "w-3.5 h-3.5 flex-shrink-0" }),
105
- cancellation.label
103
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-start gap-1.5 text-xs text-text-muted", children: [
104
+ /* @__PURE__ */ jsxRuntime.jsx(NoRefundIcon, { className: "w-3.5 h-3.5 mt-[3px] flex-shrink-0" }),
105
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: cancellation.label })
106
106
  ] });
107
107
  }
108
108
  function RateRow({
@@ -120,44 +120,48 @@ function RateRow({
120
120
  "div",
121
121
  {
122
122
  className: chunkADIDI7AJ_js.cn(
123
- "flex items-end justify-between gap-3 py-3",
123
+ "py-3",
124
124
  withTopBorder && "border-t border-dashed border-sand-dark"
125
125
  ),
126
126
  children: [
127
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0", children: [
127
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
128
128
  rate.mealLabel && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[13px] font-medium text-primary", children: rate.mealLabel }),
129
129
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5", children: /* @__PURE__ */ jsxRuntime.jsx(CancellationChip, { cancellation: rate.cancellation }) }),
130
- rate.dogFeeLabel && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-1 inline-flex items-center gap-1.5 text-xs font-medium text-secondary", children: [
131
- /* @__PURE__ */ jsxRuntime.jsx(DogIcon, { className: "w-3.5 h-3.5 flex-shrink-0" }),
132
- rate.dogFeeLabel
130
+ rate.dogFeeLabel && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-1 inline-flex items-start gap-1.5 text-xs font-medium text-secondary", children: [
131
+ /* @__PURE__ */ jsxRuntime.jsx(DogIcon, { className: "w-3.5 h-3.5 mt-[1px] flex-shrink-0" }),
132
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: rate.dogFeeLabel })
133
133
  ] })
134
134
  ] }),
135
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-right flex-shrink-0", children: [
136
- rate.originalTotal && rate.originalTotal > rate.totalPrice && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[11px] text-text-muted line-through leading-none", children: formatPrice(rate.originalTotal) }),
137
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-heading text-lg font-bold text-primary leading-tight", children: formatPrice(rate.totalPrice) }),
138
- rate.totalLabel && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[11px] text-text-muted", children: rate.totalLabel }),
139
- showReserveCta ? /* @__PURE__ */ jsxRuntime.jsx(
140
- "button",
141
- {
142
- type: "button",
143
- onClick: () => onReserve?.(rate.id),
144
- className: "mt-1.5 text-[13px] font-semibold px-5 py-1.5 rounded-full bg-secondary text-white transition-colors hover:bg-secondary-dark focus-visible:ring-2 focus-visible:ring-secondary focus-visible:ring-offset-1",
145
- children: reserveLabel
146
- }
147
- ) : /* @__PURE__ */ jsxRuntime.jsx(
148
- "button",
149
- {
150
- type: "button",
151
- onClick: () => onSelect?.(rate.id),
152
- "aria-pressed": selected,
153
- className: chunkADIDI7AJ_js.cn(
154
- "mt-1.5 text-[13px] font-medium px-4 py-1.5 rounded-full transition-colors",
155
- selected ? "bg-secondary text-white" : "border border-secondary text-secondary hover:bg-secondary hover:text-white"
156
- ),
157
- children: selected ? "S\xE9lectionn\xE9" : selectLabel
158
- }
159
- ),
160
- showReserveCta && ctaNote && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 text-[11px] leading-tight text-text-muted", children: ctaNote })
135
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2.5 flex items-end justify-between gap-3", children: [
136
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
137
+ rate.originalTotal && rate.originalTotal > rate.totalPrice && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[11px] text-text-muted line-through leading-none", children: formatPrice(rate.originalTotal) }),
138
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-heading text-lg font-bold text-primary leading-tight", children: formatPrice(rate.totalPrice) }),
139
+ rate.totalLabel && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-0.5 text-[11px] leading-snug text-text-muted", children: rate.totalLabel })
140
+ ] }),
141
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 flex-col items-end", children: [
142
+ showReserveCta ? /* @__PURE__ */ jsxRuntime.jsx(
143
+ "button",
144
+ {
145
+ type: "button",
146
+ onClick: () => onReserve?.(rate.id),
147
+ className: "text-[13px] font-semibold px-5 py-1.5 rounded-full bg-secondary text-white transition-colors hover:bg-secondary-dark focus-visible:ring-2 focus-visible:ring-secondary focus-visible:ring-offset-1",
148
+ children: reserveLabel
149
+ }
150
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
151
+ "button",
152
+ {
153
+ type: "button",
154
+ onClick: () => onSelect?.(rate.id),
155
+ "aria-pressed": selected,
156
+ className: chunkADIDI7AJ_js.cn(
157
+ "text-[13px] font-medium px-4 py-1.5 rounded-full transition-colors",
158
+ selected ? "bg-secondary text-white" : "border border-secondary text-secondary hover:bg-secondary hover:text-white"
159
+ ),
160
+ children: selected ? "S\xE9lectionn\xE9" : selectLabel
161
+ }
162
+ ),
163
+ showReserveCta && ctaNote && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 max-w-[10rem] text-right text-[11px] leading-tight text-text-muted", children: ctaNote })
164
+ ] })
161
165
  ] })
162
166
  ]
163
167
  }
@@ -67,20 +67,20 @@ function formatPrice(price) {
67
67
  }
68
68
  function CancellationChip({ cancellation }) {
69
69
  if (cancellation.kind === "free") {
70
- return /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5 text-xs font-medium text-emerald-700", children: [
71
- /* @__PURE__ */ jsx(CheckIcon, { className: "w-3.5 h-3.5 flex-shrink-0" }),
72
- cancellation.label
70
+ return /* @__PURE__ */ jsxs("span", { className: "inline-flex items-start gap-1.5 text-xs font-medium text-emerald-700", children: [
71
+ /* @__PURE__ */ jsx(CheckIcon, { className: "w-3.5 h-3.5 mt-[3px] flex-shrink-0" }),
72
+ /* @__PURE__ */ jsx("span", { children: cancellation.label })
73
73
  ] });
74
74
  }
75
75
  if (cancellation.kind === "partial") {
76
- return /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5 text-xs font-medium text-amber-700", children: [
77
- /* @__PURE__ */ jsx(CheckIcon, { className: "w-3.5 h-3.5 flex-shrink-0" }),
78
- cancellation.label
76
+ return /* @__PURE__ */ jsxs("span", { className: "inline-flex items-start gap-1.5 text-xs font-medium text-amber-700", children: [
77
+ /* @__PURE__ */ jsx(CheckIcon, { className: "w-3.5 h-3.5 mt-[3px] flex-shrink-0" }),
78
+ /* @__PURE__ */ jsx("span", { children: cancellation.label })
79
79
  ] });
80
80
  }
81
- return /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5 text-xs text-text-muted", children: [
82
- /* @__PURE__ */ jsx(NoRefundIcon, { className: "w-3.5 h-3.5 flex-shrink-0" }),
83
- cancellation.label
81
+ return /* @__PURE__ */ jsxs("span", { className: "inline-flex items-start gap-1.5 text-xs text-text-muted", children: [
82
+ /* @__PURE__ */ jsx(NoRefundIcon, { className: "w-3.5 h-3.5 mt-[3px] flex-shrink-0" }),
83
+ /* @__PURE__ */ jsx("span", { children: cancellation.label })
84
84
  ] });
85
85
  }
86
86
  function RateRow({
@@ -98,44 +98,48 @@ function RateRow({
98
98
  "div",
99
99
  {
100
100
  className: cn(
101
- "flex items-end justify-between gap-3 py-3",
101
+ "py-3",
102
102
  withTopBorder && "border-t border-dashed border-sand-dark"
103
103
  ),
104
104
  children: [
105
- /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
105
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
106
106
  rate.mealLabel && /* @__PURE__ */ jsx("div", { className: "text-[13px] font-medium text-primary", children: rate.mealLabel }),
107
107
  /* @__PURE__ */ jsx("div", { className: "mt-0.5", children: /* @__PURE__ */ jsx(CancellationChip, { cancellation: rate.cancellation }) }),
108
- rate.dogFeeLabel && /* @__PURE__ */ jsxs("div", { className: "mt-1 inline-flex items-center gap-1.5 text-xs font-medium text-secondary", children: [
109
- /* @__PURE__ */ jsx(DogIcon, { className: "w-3.5 h-3.5 flex-shrink-0" }),
110
- rate.dogFeeLabel
108
+ rate.dogFeeLabel && /* @__PURE__ */ jsxs("div", { className: "mt-1 inline-flex items-start gap-1.5 text-xs font-medium text-secondary", children: [
109
+ /* @__PURE__ */ jsx(DogIcon, { className: "w-3.5 h-3.5 mt-[1px] flex-shrink-0" }),
110
+ /* @__PURE__ */ jsx("span", { children: rate.dogFeeLabel })
111
111
  ] })
112
112
  ] }),
113
- /* @__PURE__ */ jsxs("div", { className: "text-right flex-shrink-0", children: [
114
- rate.originalTotal && rate.originalTotal > rate.totalPrice && /* @__PURE__ */ jsx("div", { className: "text-[11px] text-text-muted line-through leading-none", children: formatPrice(rate.originalTotal) }),
115
- /* @__PURE__ */ jsx("div", { className: "font-heading text-lg font-bold text-primary leading-tight", children: formatPrice(rate.totalPrice) }),
116
- rate.totalLabel && /* @__PURE__ */ jsx("div", { className: "text-[11px] text-text-muted", children: rate.totalLabel }),
117
- showReserveCta ? /* @__PURE__ */ jsx(
118
- "button",
119
- {
120
- type: "button",
121
- onClick: () => onReserve?.(rate.id),
122
- className: "mt-1.5 text-[13px] font-semibold px-5 py-1.5 rounded-full bg-secondary text-white transition-colors hover:bg-secondary-dark focus-visible:ring-2 focus-visible:ring-secondary focus-visible:ring-offset-1",
123
- children: reserveLabel
124
- }
125
- ) : /* @__PURE__ */ jsx(
126
- "button",
127
- {
128
- type: "button",
129
- onClick: () => onSelect?.(rate.id),
130
- "aria-pressed": selected,
131
- className: cn(
132
- "mt-1.5 text-[13px] font-medium px-4 py-1.5 rounded-full transition-colors",
133
- selected ? "bg-secondary text-white" : "border border-secondary text-secondary hover:bg-secondary hover:text-white"
134
- ),
135
- children: selected ? "S\xE9lectionn\xE9" : selectLabel
136
- }
137
- ),
138
- showReserveCta && ctaNote && /* @__PURE__ */ jsx("div", { className: "mt-1 text-[11px] leading-tight text-text-muted", children: ctaNote })
113
+ /* @__PURE__ */ jsxs("div", { className: "mt-2.5 flex items-end justify-between gap-3", children: [
114
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
115
+ rate.originalTotal && rate.originalTotal > rate.totalPrice && /* @__PURE__ */ jsx("div", { className: "text-[11px] text-text-muted line-through leading-none", children: formatPrice(rate.originalTotal) }),
116
+ /* @__PURE__ */ jsx("div", { className: "font-heading text-lg font-bold text-primary leading-tight", children: formatPrice(rate.totalPrice) }),
117
+ rate.totalLabel && /* @__PURE__ */ jsx("div", { className: "mt-0.5 text-[11px] leading-snug text-text-muted", children: rate.totalLabel })
118
+ ] }),
119
+ /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 flex-col items-end", children: [
120
+ showReserveCta ? /* @__PURE__ */ jsx(
121
+ "button",
122
+ {
123
+ type: "button",
124
+ onClick: () => onReserve?.(rate.id),
125
+ className: "text-[13px] font-semibold px-5 py-1.5 rounded-full bg-secondary text-white transition-colors hover:bg-secondary-dark focus-visible:ring-2 focus-visible:ring-secondary focus-visible:ring-offset-1",
126
+ children: reserveLabel
127
+ }
128
+ ) : /* @__PURE__ */ jsx(
129
+ "button",
130
+ {
131
+ type: "button",
132
+ onClick: () => onSelect?.(rate.id),
133
+ "aria-pressed": selected,
134
+ className: cn(
135
+ "text-[13px] font-medium px-4 py-1.5 rounded-full transition-colors",
136
+ selected ? "bg-secondary text-white" : "border border-secondary text-secondary hover:bg-secondary hover:text-white"
137
+ ),
138
+ children: selected ? "S\xE9lectionn\xE9" : selectLabel
139
+ }
140
+ ),
141
+ showReserveCta && ctaNote && /* @__PURE__ */ jsx("div", { className: "mt-1 max-w-[10rem] text-right text-[11px] leading-tight text-text-muted", children: ctaNote })
142
+ ] })
139
143
  ] })
140
144
  ]
141
145
  }
@@ -0,0 +1,138 @@
1
+ import { cn } from './chunk-IMKLN273.mjs';
2
+ import * as React from 'react';
3
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
+
5
+ var FloatingDock = React.forwardRef(
6
+ ({ items, className, ariaLabel = "Navigation rapide", onNavigate }, ref) => {
7
+ const [openKey, setOpenKey] = React.useState(null);
8
+ const navRef = React.useRef(null);
9
+ const setNavRef = React.useCallback(
10
+ (node) => {
11
+ navRef.current = node;
12
+ if (typeof ref === "function") ref(node);
13
+ else if (ref) ref.current = node;
14
+ },
15
+ [ref]
16
+ );
17
+ React.useEffect(() => {
18
+ if (!openKey) return;
19
+ const onPointerDown = (e) => {
20
+ if (navRef.current && !navRef.current.contains(e.target)) {
21
+ setOpenKey(null);
22
+ }
23
+ };
24
+ const onKeyDown = (e) => {
25
+ if (e.key === "Escape") setOpenKey(null);
26
+ };
27
+ document.addEventListener("pointerdown", onPointerDown);
28
+ document.addEventListener("keydown", onKeyDown);
29
+ return () => {
30
+ document.removeEventListener("pointerdown", onPointerDown);
31
+ document.removeEventListener("keydown", onKeyDown);
32
+ };
33
+ }, [openKey]);
34
+ return /* @__PURE__ */ jsx(
35
+ "nav",
36
+ {
37
+ ref: setNavRef,
38
+ "aria-label": ariaLabel,
39
+ className: cn(
40
+ "inline-flex items-center gap-1 rounded-full border border-black/5 bg-white/95 px-2 py-2 shadow-[0_8px_30px_rgba(0,0,0,0.12)] backdrop-blur",
41
+ className
42
+ ),
43
+ children: items.map((item) => {
44
+ const subItems = item.menuItems ?? [];
45
+ const hasMenu = subItems.length > 0;
46
+ const isOpen = openKey === item.key;
47
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
48
+ /* @__PURE__ */ jsx("span", { className: "shrink-0", "aria-hidden": "true", children: item.icon }),
49
+ /* @__PURE__ */ jsx(
50
+ "span",
51
+ {
52
+ className: cn(
53
+ "overflow-hidden whitespace-nowrap text-sm font-medium transition-all duration-300",
54
+ item.isActive ? "ml-2 max-w-[8rem] opacity-100" : "ml-0 max-w-0 opacity-0"
55
+ ),
56
+ children: item.label
57
+ }
58
+ )
59
+ ] });
60
+ const triggerClass = cn(
61
+ "flex min-h-[44px] items-center justify-center rounded-full outline-none transition-colors focus-visible:ring-2 focus-visible:ring-secondary focus-visible:ring-offset-2",
62
+ item.isActive ? "bg-secondary px-4 text-white" : "w-11 text-primary/70 hover:bg-secondary/5 hover:text-secondary"
63
+ );
64
+ if (hasMenu) {
65
+ return /* @__PURE__ */ jsxs("div", { className: "relative", children: [
66
+ isOpen && /* @__PURE__ */ jsx(
67
+ "div",
68
+ {
69
+ role: "menu",
70
+ "aria-label": item.label,
71
+ className: "absolute bottom-full left-1/2 z-10 mb-3 w-56 -translate-x-1/2 overflow-hidden rounded-2xl border border-black/5 bg-white shadow-[0_8px_30px_rgba(0,0,0,0.18)]",
72
+ children: subItems.map((sub) => /* @__PURE__ */ jsxs(
73
+ "a",
74
+ {
75
+ href: sub.href,
76
+ role: "menuitem",
77
+ "aria-current": sub.isActive ? "page" : void 0,
78
+ onClick: (event) => {
79
+ if (onNavigate) {
80
+ event.preventDefault();
81
+ onNavigate(sub);
82
+ }
83
+ setOpenKey(null);
84
+ },
85
+ className: cn(
86
+ "flex items-center gap-3 px-4 py-3 text-sm outline-none transition-colors focus-visible:bg-secondary/10",
87
+ sub.isActive ? "bg-secondary/10 font-semibold text-secondary" : "text-primary/80 hover:bg-secondary/5 hover:text-secondary"
88
+ ),
89
+ children: [
90
+ /* @__PURE__ */ jsx("span", { className: "shrink-0", "aria-hidden": "true", children: sub.icon }),
91
+ /* @__PURE__ */ jsx("span", { className: "whitespace-nowrap", children: sub.label })
92
+ ]
93
+ },
94
+ sub.key
95
+ ))
96
+ }
97
+ ),
98
+ /* @__PURE__ */ jsx(
99
+ "button",
100
+ {
101
+ type: "button",
102
+ "aria-label": item.label,
103
+ "aria-haspopup": "menu",
104
+ "aria-expanded": isOpen,
105
+ title: item.label,
106
+ onClick: () => {
107
+ setOpenKey(isOpen ? null : item.key);
108
+ },
109
+ className: triggerClass,
110
+ children: content
111
+ }
112
+ )
113
+ ] }, item.key);
114
+ }
115
+ return /* @__PURE__ */ jsx(
116
+ "a",
117
+ {
118
+ href: item.href,
119
+ "aria-label": item.label,
120
+ "aria-current": item.isActive ? "page" : void 0,
121
+ title: item.label,
122
+ onClick: onNavigate ? (event) => {
123
+ event.preventDefault();
124
+ onNavigate(item);
125
+ } : void 0,
126
+ className: triggerClass,
127
+ children: content
128
+ },
129
+ item.key
130
+ );
131
+ })
132
+ }
133
+ );
134
+ }
135
+ );
136
+ FloatingDock.displayName = "FloatingDock";
137
+
138
+ export { FloatingDock };
@@ -0,0 +1,160 @@
1
+ 'use strict';
2
+
3
+ var chunkADIDI7AJ_js = require('./chunk-ADIDI7AJ.js');
4
+ var React = require('react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ function _interopNamespace(e) {
8
+ if (e && e.__esModule) return e;
9
+ var n = Object.create(null);
10
+ if (e) {
11
+ Object.keys(e).forEach(function (k) {
12
+ if (k !== 'default') {
13
+ var d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: function () { return e[k]; }
17
+ });
18
+ }
19
+ });
20
+ }
21
+ n.default = e;
22
+ return Object.freeze(n);
23
+ }
24
+
25
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
26
+
27
+ var FloatingDock = React__namespace.forwardRef(
28
+ ({ items, className, ariaLabel = "Navigation rapide", onNavigate }, ref) => {
29
+ const [openKey, setOpenKey] = React__namespace.useState(null);
30
+ const navRef = React__namespace.useRef(null);
31
+ const setNavRef = React__namespace.useCallback(
32
+ (node) => {
33
+ navRef.current = node;
34
+ if (typeof ref === "function") ref(node);
35
+ else if (ref) ref.current = node;
36
+ },
37
+ [ref]
38
+ );
39
+ React__namespace.useEffect(() => {
40
+ if (!openKey) return;
41
+ const onPointerDown = (e) => {
42
+ if (navRef.current && !navRef.current.contains(e.target)) {
43
+ setOpenKey(null);
44
+ }
45
+ };
46
+ const onKeyDown = (e) => {
47
+ if (e.key === "Escape") setOpenKey(null);
48
+ };
49
+ document.addEventListener("pointerdown", onPointerDown);
50
+ document.addEventListener("keydown", onKeyDown);
51
+ return () => {
52
+ document.removeEventListener("pointerdown", onPointerDown);
53
+ document.removeEventListener("keydown", onKeyDown);
54
+ };
55
+ }, [openKey]);
56
+ return /* @__PURE__ */ jsxRuntime.jsx(
57
+ "nav",
58
+ {
59
+ ref: setNavRef,
60
+ "aria-label": ariaLabel,
61
+ className: chunkADIDI7AJ_js.cn(
62
+ "inline-flex items-center gap-1 rounded-full border border-black/5 bg-white/95 px-2 py-2 shadow-[0_8px_30px_rgba(0,0,0,0.12)] backdrop-blur",
63
+ className
64
+ ),
65
+ children: items.map((item) => {
66
+ const subItems = item.menuItems ?? [];
67
+ const hasMenu = subItems.length > 0;
68
+ const isOpen = openKey === item.key;
69
+ const content = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
70
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0", "aria-hidden": "true", children: item.icon }),
71
+ /* @__PURE__ */ jsxRuntime.jsx(
72
+ "span",
73
+ {
74
+ className: chunkADIDI7AJ_js.cn(
75
+ "overflow-hidden whitespace-nowrap text-sm font-medium transition-all duration-300",
76
+ item.isActive ? "ml-2 max-w-[8rem] opacity-100" : "ml-0 max-w-0 opacity-0"
77
+ ),
78
+ children: item.label
79
+ }
80
+ )
81
+ ] });
82
+ const triggerClass = chunkADIDI7AJ_js.cn(
83
+ "flex min-h-[44px] items-center justify-center rounded-full outline-none transition-colors focus-visible:ring-2 focus-visible:ring-secondary focus-visible:ring-offset-2",
84
+ item.isActive ? "bg-secondary px-4 text-white" : "w-11 text-primary/70 hover:bg-secondary/5 hover:text-secondary"
85
+ );
86
+ if (hasMenu) {
87
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
88
+ isOpen && /* @__PURE__ */ jsxRuntime.jsx(
89
+ "div",
90
+ {
91
+ role: "menu",
92
+ "aria-label": item.label,
93
+ className: "absolute bottom-full left-1/2 z-10 mb-3 w-56 -translate-x-1/2 overflow-hidden rounded-2xl border border-black/5 bg-white shadow-[0_8px_30px_rgba(0,0,0,0.18)]",
94
+ children: subItems.map((sub) => /* @__PURE__ */ jsxRuntime.jsxs(
95
+ "a",
96
+ {
97
+ href: sub.href,
98
+ role: "menuitem",
99
+ "aria-current": sub.isActive ? "page" : void 0,
100
+ onClick: (event) => {
101
+ if (onNavigate) {
102
+ event.preventDefault();
103
+ onNavigate(sub);
104
+ }
105
+ setOpenKey(null);
106
+ },
107
+ className: chunkADIDI7AJ_js.cn(
108
+ "flex items-center gap-3 px-4 py-3 text-sm outline-none transition-colors focus-visible:bg-secondary/10",
109
+ sub.isActive ? "bg-secondary/10 font-semibold text-secondary" : "text-primary/80 hover:bg-secondary/5 hover:text-secondary"
110
+ ),
111
+ children: [
112
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0", "aria-hidden": "true", children: sub.icon }),
113
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "whitespace-nowrap", children: sub.label })
114
+ ]
115
+ },
116
+ sub.key
117
+ ))
118
+ }
119
+ ),
120
+ /* @__PURE__ */ jsxRuntime.jsx(
121
+ "button",
122
+ {
123
+ type: "button",
124
+ "aria-label": item.label,
125
+ "aria-haspopup": "menu",
126
+ "aria-expanded": isOpen,
127
+ title: item.label,
128
+ onClick: () => {
129
+ setOpenKey(isOpen ? null : item.key);
130
+ },
131
+ className: triggerClass,
132
+ children: content
133
+ }
134
+ )
135
+ ] }, item.key);
136
+ }
137
+ return /* @__PURE__ */ jsxRuntime.jsx(
138
+ "a",
139
+ {
140
+ href: item.href,
141
+ "aria-label": item.label,
142
+ "aria-current": item.isActive ? "page" : void 0,
143
+ title: item.label,
144
+ onClick: onNavigate ? (event) => {
145
+ event.preventDefault();
146
+ onNavigate(item);
147
+ } : void 0,
148
+ className: triggerClass,
149
+ children: content
150
+ },
151
+ item.key
152
+ );
153
+ })
154
+ }
155
+ );
156
+ }
157
+ );
158
+ FloatingDock.displayName = "FloatingDock";
159
+
160
+ exports.FloatingDock = FloatingDock;
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var chunkS732LTPT_js = require('../../chunk-S732LTPT.js');
3
+ var chunkZCQJN4IT_js = require('../../chunk-ZCQJN4IT.js');
4
4
  require('../../chunk-ADIDI7AJ.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "FloatingDock", {
9
9
  enumerable: true,
10
- get: function () { return chunkS732LTPT_js.FloatingDock; }
10
+ get: function () { return chunkZCQJN4IT_js.FloatingDock; }
11
11
  });
@@ -1,2 +1,2 @@
1
- export { FloatingDock } from '../../chunk-PBDPZTHK.mjs';
1
+ export { FloatingDock } from '../../chunk-P2SGBTKS.mjs';
2
2
  import '../../chunk-IMKLN273.mjs';
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkS26SN3WK_js = require('../../chunk-S26SN3WK.js');
3
+ var chunk3JM2X4I2_js = require('../../chunk-3JM2X4I2.js');
4
4
  require('../../chunk-NCU5PY34.js');
5
5
  require('../../chunk-ADIDI7AJ.js');
6
6
 
@@ -8,9 +8,9 @@ require('../../chunk-ADIDI7AJ.js');
8
8
 
9
9
  Object.defineProperty(exports, "RoomTypeCard", {
10
10
  enumerable: true,
11
- get: function () { return chunkS26SN3WK_js.RoomTypeCard; }
11
+ get: function () { return chunk3JM2X4I2_js.RoomTypeCard; }
12
12
  });
13
13
  Object.defineProperty(exports, "RoomTypeCardSkeleton", {
14
14
  enumerable: true,
15
- get: function () { return chunkS26SN3WK_js.RoomTypeCardSkeleton; }
15
+ get: function () { return chunk3JM2X4I2_js.RoomTypeCardSkeleton; }
16
16
  });
@@ -1,3 +1,3 @@
1
- export { RoomTypeCard, RoomTypeCardSkeleton } from '../../chunk-QTW2FJUJ.mjs';
1
+ export { RoomTypeCard, RoomTypeCardSkeleton } from '../../chunk-BFGRWOQM.mjs';
2
2
  import '../../chunk-PAHSQMXV.mjs';
3
3
  import '../../chunk-IMKLN273.mjs';