@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
@@ -0,0 +1,92 @@
1
+ import * as React from 'react';
2
+
3
+ type RoomRateCancellationKind = "free" | "partial" | "nonrefundable";
4
+ interface RoomRateCancellation {
5
+ kind: RoomRateCancellationKind;
6
+ /** Texte explicite, ex: "Annulation gratuite avant le 10 août" ou "Non remboursable" */
7
+ label: string;
8
+ }
9
+ interface RoomRate {
10
+ id: string;
11
+ /** ex: "Sans petit-déjeuner", "Petit-déjeuner inclus" */
12
+ mealLabel?: string;
13
+ cancellation: RoomRateCancellation;
14
+ /** Prix par nuit (déjà arrondi côté appelant si souhaité) */
15
+ pricePerNight: number;
16
+ /** Prix total du séjour */
17
+ totalPrice: number;
18
+ /** Prix total barré (avant réduction) */
19
+ originalTotal?: number;
20
+ /** ex: "2 nuits, taxes incl." */
21
+ totalLabel?: string;
22
+ /** Frais chien explicite, ex: "Chien inclus : +16 €" */
23
+ dogFeeLabel?: string;
24
+ }
25
+ interface RoomTypeData {
26
+ name: string;
27
+ image?: string;
28
+ /** Nombre total de photos pour cette chambre (badge) */
29
+ imageCount?: number;
30
+ /**
31
+ * Si défini, `image` est une photo de l'ÉTABLISSEMENT (non attribuée à cette
32
+ * chambre) : ce libellé est utilisé comme `alt` et affiché en incrustation
33
+ * (ex: "Photo de l'établissement"). Prend le pas sur le badge `imageCount`
34
+ * pour ne jamais laisser croire à une galerie propre à la chambre.
35
+ */
36
+ establishmentPhotoLabel?: string;
37
+ /** ex: "1 lit double", "2 lits jumeaux" */
38
+ beds?: string;
39
+ /** Surface en m² */
40
+ sizeSqm?: number;
41
+ /** Capacité max voyageurs */
42
+ maxOccupancy?: number;
43
+ /** Équipements clés, ex: ["Wi-Fi", "Climatisation", "TV"] */
44
+ amenities?: string[];
45
+ /** Description courte de la chambre (sous la ligne de méta) */
46
+ description?: string;
47
+ /** Atout mis en avant en vert, ex: "Vue jardin", "Jardin privatif clos" */
48
+ highlight?: string;
49
+ }
50
+ interface RoomTypeCardProps extends React.HTMLAttributes<HTMLDivElement> {
51
+ room: RoomTypeData;
52
+ rates: RoomRate[];
53
+ /** id de la formule actuellement sélectionnée */
54
+ selectedRateId?: string;
55
+ onSelectRate?: (rateId: string) => void;
56
+ /** Nombre de formules visibles avant le bouton "X autres formules" (défaut 2) */
57
+ initialVisibleRates?: number;
58
+ selectLabel?: string;
59
+ /** Variante d'affichage : "default" (détaillée) ou "compact" (grille 2 colonnes mobile) */
60
+ variant?: "default" | "compact";
61
+ /** Disponibilité : "unavailable" masque les formules et affiche un état dédié */
62
+ availability?: "available" | "unavailable";
63
+ /** Callback du lien "Voir d'autres dates" (état indisponible) */
64
+ onSeeOtherDates?: () => void;
65
+ /** Libellé de l'état indisponible */
66
+ unavailableLabel?: string;
67
+ /** Render custom image (ex: next/image) */
68
+ renderImage?: (props: {
69
+ src: string;
70
+ alt: string;
71
+ className: string;
72
+ }) => React.ReactNode;
73
+ }
74
+ declare const RoomTypeCard: React.ForwardRefExoticComponent<RoomTypeCardProps & React.RefAttributes<HTMLDivElement>>;
75
+
76
+ interface RoomTypeCardSkeletonProps extends React.HTMLAttributes<HTMLDivElement> {
77
+ /** Aligné sur `RoomTypeCard.variant` : compact = image 128px, padding réduit. */
78
+ variant?: "default" | "compact";
79
+ }
80
+ /**
81
+ * Squelette de chargement calqué sur la structure de `RoomTypeCard`
82
+ * (image, titre, caractéristiques, formule, prix + CTA). À afficher pendant
83
+ * la recherche des tarifs temps réel.
84
+ *
85
+ * Purement décoratif (`aria-hidden`) : lorsque plusieurs squelettes sont
86
+ * rendus, porter l'annonce sur un conteneur unique côté appelant
87
+ * (`role="status"` + `aria-label`), afin d'éviter les annonces dupliquées
88
+ * pour les lecteurs d'écran.
89
+ */
90
+ declare const RoomTypeCardSkeleton: React.ForwardRefExoticComponent<RoomTypeCardSkeletonProps & React.RefAttributes<HTMLDivElement>>;
91
+
92
+ export { type RoomRate, type RoomRateCancellation, type RoomRateCancellationKind, RoomTypeCard, type RoomTypeCardProps, RoomTypeCardSkeleton, type RoomTypeCardSkeletonProps, type RoomTypeData };
@@ -0,0 +1,92 @@
1
+ import * as React from 'react';
2
+
3
+ type RoomRateCancellationKind = "free" | "partial" | "nonrefundable";
4
+ interface RoomRateCancellation {
5
+ kind: RoomRateCancellationKind;
6
+ /** Texte explicite, ex: "Annulation gratuite avant le 10 août" ou "Non remboursable" */
7
+ label: string;
8
+ }
9
+ interface RoomRate {
10
+ id: string;
11
+ /** ex: "Sans petit-déjeuner", "Petit-déjeuner inclus" */
12
+ mealLabel?: string;
13
+ cancellation: RoomRateCancellation;
14
+ /** Prix par nuit (déjà arrondi côté appelant si souhaité) */
15
+ pricePerNight: number;
16
+ /** Prix total du séjour */
17
+ totalPrice: number;
18
+ /** Prix total barré (avant réduction) */
19
+ originalTotal?: number;
20
+ /** ex: "2 nuits, taxes incl." */
21
+ totalLabel?: string;
22
+ /** Frais chien explicite, ex: "Chien inclus : +16 €" */
23
+ dogFeeLabel?: string;
24
+ }
25
+ interface RoomTypeData {
26
+ name: string;
27
+ image?: string;
28
+ /** Nombre total de photos pour cette chambre (badge) */
29
+ imageCount?: number;
30
+ /**
31
+ * Si défini, `image` est une photo de l'ÉTABLISSEMENT (non attribuée à cette
32
+ * chambre) : ce libellé est utilisé comme `alt` et affiché en incrustation
33
+ * (ex: "Photo de l'établissement"). Prend le pas sur le badge `imageCount`
34
+ * pour ne jamais laisser croire à une galerie propre à la chambre.
35
+ */
36
+ establishmentPhotoLabel?: string;
37
+ /** ex: "1 lit double", "2 lits jumeaux" */
38
+ beds?: string;
39
+ /** Surface en m² */
40
+ sizeSqm?: number;
41
+ /** Capacité max voyageurs */
42
+ maxOccupancy?: number;
43
+ /** Équipements clés, ex: ["Wi-Fi", "Climatisation", "TV"] */
44
+ amenities?: string[];
45
+ /** Description courte de la chambre (sous la ligne de méta) */
46
+ description?: string;
47
+ /** Atout mis en avant en vert, ex: "Vue jardin", "Jardin privatif clos" */
48
+ highlight?: string;
49
+ }
50
+ interface RoomTypeCardProps extends React.HTMLAttributes<HTMLDivElement> {
51
+ room: RoomTypeData;
52
+ rates: RoomRate[];
53
+ /** id de la formule actuellement sélectionnée */
54
+ selectedRateId?: string;
55
+ onSelectRate?: (rateId: string) => void;
56
+ /** Nombre de formules visibles avant le bouton "X autres formules" (défaut 2) */
57
+ initialVisibleRates?: number;
58
+ selectLabel?: string;
59
+ /** Variante d'affichage : "default" (détaillée) ou "compact" (grille 2 colonnes mobile) */
60
+ variant?: "default" | "compact";
61
+ /** Disponibilité : "unavailable" masque les formules et affiche un état dédié */
62
+ availability?: "available" | "unavailable";
63
+ /** Callback du lien "Voir d'autres dates" (état indisponible) */
64
+ onSeeOtherDates?: () => void;
65
+ /** Libellé de l'état indisponible */
66
+ unavailableLabel?: string;
67
+ /** Render custom image (ex: next/image) */
68
+ renderImage?: (props: {
69
+ src: string;
70
+ alt: string;
71
+ className: string;
72
+ }) => React.ReactNode;
73
+ }
74
+ declare const RoomTypeCard: React.ForwardRefExoticComponent<RoomTypeCardProps & React.RefAttributes<HTMLDivElement>>;
75
+
76
+ interface RoomTypeCardSkeletonProps extends React.HTMLAttributes<HTMLDivElement> {
77
+ /** Aligné sur `RoomTypeCard.variant` : compact = image 128px, padding réduit. */
78
+ variant?: "default" | "compact";
79
+ }
80
+ /**
81
+ * Squelette de chargement calqué sur la structure de `RoomTypeCard`
82
+ * (image, titre, caractéristiques, formule, prix + CTA). À afficher pendant
83
+ * la recherche des tarifs temps réel.
84
+ *
85
+ * Purement décoratif (`aria-hidden`) : lorsque plusieurs squelettes sont
86
+ * rendus, porter l'annonce sur un conteneur unique côté appelant
87
+ * (`role="status"` + `aria-label`), afin d'éviter les annonces dupliquées
88
+ * pour les lecteurs d'écran.
89
+ */
90
+ declare const RoomTypeCardSkeleton: React.ForwardRefExoticComponent<RoomTypeCardSkeletonProps & React.RefAttributes<HTMLDivElement>>;
91
+
92
+ export { type RoomRate, type RoomRateCancellation, type RoomRateCancellationKind, RoomTypeCard, type RoomTypeCardProps, RoomTypeCardSkeleton, type RoomTypeCardSkeletonProps, type RoomTypeData };
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ var chunk36JNXXGH_js = require('../../chunk-36JNXXGH.js');
4
+ require('../../chunk-NCU5PY34.js');
5
+ require('../../chunk-ADIDI7AJ.js');
6
+
7
+
8
+
9
+ Object.defineProperty(exports, "RoomTypeCard", {
10
+ enumerable: true,
11
+ get: function () { return chunk36JNXXGH_js.RoomTypeCard; }
12
+ });
13
+ Object.defineProperty(exports, "RoomTypeCardSkeleton", {
14
+ enumerable: true,
15
+ get: function () { return chunk36JNXXGH_js.RoomTypeCardSkeleton; }
16
+ });
@@ -0,0 +1,3 @@
1
+ export { RoomTypeCard, RoomTypeCardSkeleton } from '../../chunk-XH2MVC4W.mjs';
2
+ import '../../chunk-PAHSQMXV.mjs';
3
+ import '../../chunk-IMKLN273.mjs';
package/dist/index.d.mts CHANGED
@@ -21,6 +21,7 @@ export { EmptyState, EmptyStateProps } from './components/EmptyState/index.mjs';
21
21
  export { Stepper, StepperProps, StepperStep } from './components/Stepper/index.mjs';
22
22
  export { Sidebar, SidebarItem, SidebarProps } from './components/Sidebar/index.mjs';
23
23
  export { BottomNavBar, BottomNavBarProps, BottomNavItem } from './components/BottomNavBar/index.mjs';
24
+ export { FloatingDock, FloatingDockItem, FloatingDockProps } from './components/FloatingDock/index.mjs';
24
25
  export { SegmentedControl, SegmentedControlOption, SegmentedControlProps } from './components/SegmentedControl/index.mjs';
25
26
  export { Drawer, DrawerProps } from './components/Drawer/index.mjs';
26
27
  export { TabItem, Tabs, TabsProps } from './components/Tabs/index.mjs';
@@ -30,6 +31,9 @@ export { Tooltip, TooltipProps } from './components/Tooltip/index.mjs';
30
31
  export { Divider, DividerProps } from './components/Divider/index.mjs';
31
32
  export { DatePickerInput, DatePickerInputProps, DateRangePicker, DateRangePickerProps } from './components/DateRangePicker/index.mjs';
32
33
  export { SearchBar, SearchBarField, SearchBarProps } from './components/SearchBar/index.mjs';
34
+ import * as class_variance_authority_types from 'class-variance-authority/types';
35
+ import * as React from 'react';
36
+ import { VariantProps } from 'class-variance-authority';
33
37
  export { GuestPicker, GuestPickerProps } from './components/GuestPicker/index.mjs';
34
38
  export { MegaMenu, MegaMenuCard, MegaMenuColumn, MegaMenuLink, MegaMenuProps, MegaMenuSection } from './components/MegaMenu/index.mjs';
35
39
  export { Footer, FooterLinkGroup, FooterProps } from './components/Footer/index.mjs';
@@ -59,9 +63,125 @@ export { Switch, SwitchProps, switchThumbVariants, switchTrackVariants } from '.
59
63
  export { DualRangeSlider, DualRangeSliderProps } from './components/DualRangeSlider/index.mjs';
60
64
  export { CardList, CardListProps } from './components/CardList/index.mjs';
61
65
  export { FilterAccordion, FilterAccordionItemData, FilterAccordionProps } from './components/FilterAccordion/index.mjs';
66
+ export { RoomRate, RoomRateCancellation, RoomRateCancellationKind, RoomTypeCard, RoomTypeCardProps, RoomTypeCardSkeleton, RoomTypeCardSkeletonProps, RoomTypeData } from './components/RoomTypeCard/index.mjs';
67
+ import * as react_jsx_runtime from 'react/jsx-runtime';
62
68
  export { cn } from './utils/index.mjs';
63
- import 'class-variance-authority/types';
64
- import 'react';
65
- import 'class-variance-authority';
66
- import 'react/jsx-runtime';
67
69
  import 'clsx';
70
+
71
+ declare const searchFieldVariants: (props?: ({
72
+ size?: "md" | "lg" | "xl" | null | undefined;
73
+ variant?: "default" | "hero" | null | undefined;
74
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
75
+ interface SearchFieldProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "type">, VariantProps<typeof searchFieldVariants> {
76
+ /** Callback when the clear button is clicked */
77
+ onClear?: () => void;
78
+ /** Additional class for the outer container */
79
+ containerClassName?: string;
80
+ /** Result count to display below the field */
81
+ resultCount?: number;
82
+ /** Label for the result count (e.g. "races trouvées") */
83
+ resultLabel?: string;
84
+ }
85
+ declare const SearchField: React.ForwardRefExoticComponent<SearchFieldProps & React.RefAttributes<HTMLInputElement>>;
86
+
87
+ interface DogFriendlyStat {
88
+ /** Libellé court, ex: "Taille acceptée" */
89
+ label: string;
90
+ /** Valeur mise en avant, ex: "Tous gabarits" ou "À confirmer" */
91
+ value: string;
92
+ /** Précision optionnelle, ex: "jusqu'à 2 chiens" */
93
+ note?: string;
94
+ }
95
+ interface DogFriendlyPanelProps extends React.HTMLAttributes<HTMLElement> {
96
+ /** Titre du bloc */
97
+ title?: string;
98
+ /** Info chien confirmée par l'établissement (vs à confirmer) */
99
+ confirmed?: boolean;
100
+ /** Libellé quand confirmé */
101
+ confirmedLabel?: string;
102
+ /** Libellé quand non confirmé */
103
+ unconfirmedLabel?: string;
104
+ /** Mini-cartes de faits (2 sur mobile, jusqu'à 4 sur desktop) */
105
+ stats: DogFriendlyStat[];
106
+ /** À-côtés dog-friendly (issus des équipements ETG mappés FR) */
107
+ perks?: string[];
108
+ }
109
+ /**
110
+ * Bandeau signature dog-friendly de la fiche hébergement.
111
+ * Met en avant l'accueil du chien : faits clés (taille, frais, jardin…) + à-côtés.
112
+ */
113
+ declare function DogFriendlyPanel({ title, confirmed, confirmedLabel, unconfirmedLabel, stats, perks, className, ...props }: DogFriendlyPanelProps): react_jsx_runtime.JSX.Element;
114
+
115
+ interface ReviewSubScore {
116
+ /** Libellé, ex: "Propreté" */
117
+ label: string;
118
+ /** Note /10 */
119
+ value: number;
120
+ }
121
+ interface ReviewItem {
122
+ /** Note /10 de l'avis */
123
+ score: number;
124
+ /** Libellé de la note, ex: "Excellent" */
125
+ scoreLabel: string;
126
+ /** Texte de l'avis (déjà en français) */
127
+ text: string;
128
+ /** Auteur */
129
+ author: string;
130
+ /** Contexte, ex: "Famille · 3 nuits · juin 2026" */
131
+ meta?: string;
132
+ /** Avis vérifié */
133
+ verified?: boolean;
134
+ /** Langue d'origine si traduit, ex: "l'anglais" → "Traduit de l'anglais" */
135
+ translatedFrom?: string;
136
+ }
137
+ interface ReviewSummaryProps extends React.HTMLAttributes<HTMLElement> {
138
+ /** Note globale /10 */
139
+ score?: number;
140
+ /** Libellé global, ex: "Très bien" */
141
+ scoreLabel?: string;
142
+ /** Nombre d'avis vérifiés */
143
+ count?: number;
144
+ /** Titre de la section */
145
+ title?: string;
146
+ /** Libellé du volume d'avis (D2 : "avis vérifiés" ; ne PAS afficher de plateforme non sourcée) */
147
+ countLabel?: string;
148
+ /** Sources RÉELLES uniquement (ex: ["Booking"]) — affichées après le volume ; laisser vide si aucune */
149
+ sources?: string[];
150
+ /** Sous-notes détaillées (/10) */
151
+ subScores?: ReviewSubScore[];
152
+ /** Avis mis en avant */
153
+ reviews?: ReviewItem[];
154
+ /** Callback bouton "Afficher tous les avis" */
155
+ onSeeAll?: () => void;
156
+ /** Libellé du bouton (par défaut dérivé du count) */
157
+ seeAllLabel?: string;
158
+ /** Message quand aucun avis */
159
+ emptyLabel?: string;
160
+ }
161
+ /**
162
+ * Bloc avis consolidé de la fiche hébergement (échelle /10 unique).
163
+ * Remplace les blocs avis redondants. N'affiche que des sources réelles.
164
+ */
165
+ declare function ReviewSummary({ score, scoreLabel, count, title, countLabel, sources, subScores, reviews, onSeeAll, seeAllLabel, emptyLabel, className, ...props }: ReviewSummaryProps): react_jsx_runtime.JSX.Element;
166
+
167
+ interface MobileBookingBarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onSelect"> {
168
+ /** Prix total déjà formaté, ex: "248 €" */
169
+ price: string;
170
+ /** Précision sous le prix, ex: "2 nuits · taxes incl." */
171
+ meta?: string;
172
+ /** Réassurance, ex: "Vous ne serez pas débité maintenant" */
173
+ reassurance?: string;
174
+ /** Libellé du bouton d'action */
175
+ ctaLabel?: string;
176
+ /** Action de réservation */
177
+ onReserve?: () => void;
178
+ /** Désactive l'action (ex: aucune disponibilité) */
179
+ disabled?: boolean;
180
+ }
181
+ /**
182
+ * Barre de réservation collante en bas d'écran (mobile).
183
+ * Présentationnelle : reçoit un prix déjà formaté (cf. buildRateDisplay côté app).
184
+ */
185
+ declare function MobileBookingBar({ price, meta, reassurance, ctaLabel, onReserve, disabled, className, ...props }: MobileBookingBarProps): react_jsx_runtime.JSX.Element;
186
+
187
+ export { DogFriendlyPanel, type DogFriendlyPanelProps, type DogFriendlyStat, MobileBookingBar, type MobileBookingBarProps, type ReviewItem, type ReviewSubScore, ReviewSummary, type ReviewSummaryProps, SearchField, type SearchFieldProps, searchFieldVariants };
package/dist/index.d.ts CHANGED
@@ -21,6 +21,7 @@ export { EmptyState, EmptyStateProps } from './components/EmptyState/index.js';
21
21
  export { Stepper, StepperProps, StepperStep } from './components/Stepper/index.js';
22
22
  export { Sidebar, SidebarItem, SidebarProps } from './components/Sidebar/index.js';
23
23
  export { BottomNavBar, BottomNavBarProps, BottomNavItem } from './components/BottomNavBar/index.js';
24
+ export { FloatingDock, FloatingDockItem, FloatingDockProps } from './components/FloatingDock/index.js';
24
25
  export { SegmentedControl, SegmentedControlOption, SegmentedControlProps } from './components/SegmentedControl/index.js';
25
26
  export { Drawer, DrawerProps } from './components/Drawer/index.js';
26
27
  export { TabItem, Tabs, TabsProps } from './components/Tabs/index.js';
@@ -30,6 +31,9 @@ export { Tooltip, TooltipProps } from './components/Tooltip/index.js';
30
31
  export { Divider, DividerProps } from './components/Divider/index.js';
31
32
  export { DatePickerInput, DatePickerInputProps, DateRangePicker, DateRangePickerProps } from './components/DateRangePicker/index.js';
32
33
  export { SearchBar, SearchBarField, SearchBarProps } from './components/SearchBar/index.js';
34
+ import * as class_variance_authority_types from 'class-variance-authority/types';
35
+ import * as React from 'react';
36
+ import { VariantProps } from 'class-variance-authority';
33
37
  export { GuestPicker, GuestPickerProps } from './components/GuestPicker/index.js';
34
38
  export { MegaMenu, MegaMenuCard, MegaMenuColumn, MegaMenuLink, MegaMenuProps, MegaMenuSection } from './components/MegaMenu/index.js';
35
39
  export { Footer, FooterLinkGroup, FooterProps } from './components/Footer/index.js';
@@ -59,9 +63,125 @@ export { Switch, SwitchProps, switchThumbVariants, switchTrackVariants } from '.
59
63
  export { DualRangeSlider, DualRangeSliderProps } from './components/DualRangeSlider/index.js';
60
64
  export { CardList, CardListProps } from './components/CardList/index.js';
61
65
  export { FilterAccordion, FilterAccordionItemData, FilterAccordionProps } from './components/FilterAccordion/index.js';
66
+ export { RoomRate, RoomRateCancellation, RoomRateCancellationKind, RoomTypeCard, RoomTypeCardProps, RoomTypeCardSkeleton, RoomTypeCardSkeletonProps, RoomTypeData } from './components/RoomTypeCard/index.js';
67
+ import * as react_jsx_runtime from 'react/jsx-runtime';
62
68
  export { cn } from './utils/index.js';
63
- import 'class-variance-authority/types';
64
- import 'react';
65
- import 'class-variance-authority';
66
- import 'react/jsx-runtime';
67
69
  import 'clsx';
70
+
71
+ declare const searchFieldVariants: (props?: ({
72
+ size?: "md" | "lg" | "xl" | null | undefined;
73
+ variant?: "default" | "hero" | null | undefined;
74
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
75
+ interface SearchFieldProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "type">, VariantProps<typeof searchFieldVariants> {
76
+ /** Callback when the clear button is clicked */
77
+ onClear?: () => void;
78
+ /** Additional class for the outer container */
79
+ containerClassName?: string;
80
+ /** Result count to display below the field */
81
+ resultCount?: number;
82
+ /** Label for the result count (e.g. "races trouvées") */
83
+ resultLabel?: string;
84
+ }
85
+ declare const SearchField: React.ForwardRefExoticComponent<SearchFieldProps & React.RefAttributes<HTMLInputElement>>;
86
+
87
+ interface DogFriendlyStat {
88
+ /** Libellé court, ex: "Taille acceptée" */
89
+ label: string;
90
+ /** Valeur mise en avant, ex: "Tous gabarits" ou "À confirmer" */
91
+ value: string;
92
+ /** Précision optionnelle, ex: "jusqu'à 2 chiens" */
93
+ note?: string;
94
+ }
95
+ interface DogFriendlyPanelProps extends React.HTMLAttributes<HTMLElement> {
96
+ /** Titre du bloc */
97
+ title?: string;
98
+ /** Info chien confirmée par l'établissement (vs à confirmer) */
99
+ confirmed?: boolean;
100
+ /** Libellé quand confirmé */
101
+ confirmedLabel?: string;
102
+ /** Libellé quand non confirmé */
103
+ unconfirmedLabel?: string;
104
+ /** Mini-cartes de faits (2 sur mobile, jusqu'à 4 sur desktop) */
105
+ stats: DogFriendlyStat[];
106
+ /** À-côtés dog-friendly (issus des équipements ETG mappés FR) */
107
+ perks?: string[];
108
+ }
109
+ /**
110
+ * Bandeau signature dog-friendly de la fiche hébergement.
111
+ * Met en avant l'accueil du chien : faits clés (taille, frais, jardin…) + à-côtés.
112
+ */
113
+ declare function DogFriendlyPanel({ title, confirmed, confirmedLabel, unconfirmedLabel, stats, perks, className, ...props }: DogFriendlyPanelProps): react_jsx_runtime.JSX.Element;
114
+
115
+ interface ReviewSubScore {
116
+ /** Libellé, ex: "Propreté" */
117
+ label: string;
118
+ /** Note /10 */
119
+ value: number;
120
+ }
121
+ interface ReviewItem {
122
+ /** Note /10 de l'avis */
123
+ score: number;
124
+ /** Libellé de la note, ex: "Excellent" */
125
+ scoreLabel: string;
126
+ /** Texte de l'avis (déjà en français) */
127
+ text: string;
128
+ /** Auteur */
129
+ author: string;
130
+ /** Contexte, ex: "Famille · 3 nuits · juin 2026" */
131
+ meta?: string;
132
+ /** Avis vérifié */
133
+ verified?: boolean;
134
+ /** Langue d'origine si traduit, ex: "l'anglais" → "Traduit de l'anglais" */
135
+ translatedFrom?: string;
136
+ }
137
+ interface ReviewSummaryProps extends React.HTMLAttributes<HTMLElement> {
138
+ /** Note globale /10 */
139
+ score?: number;
140
+ /** Libellé global, ex: "Très bien" */
141
+ scoreLabel?: string;
142
+ /** Nombre d'avis vérifiés */
143
+ count?: number;
144
+ /** Titre de la section */
145
+ title?: string;
146
+ /** Libellé du volume d'avis (D2 : "avis vérifiés" ; ne PAS afficher de plateforme non sourcée) */
147
+ countLabel?: string;
148
+ /** Sources RÉELLES uniquement (ex: ["Booking"]) — affichées après le volume ; laisser vide si aucune */
149
+ sources?: string[];
150
+ /** Sous-notes détaillées (/10) */
151
+ subScores?: ReviewSubScore[];
152
+ /** Avis mis en avant */
153
+ reviews?: ReviewItem[];
154
+ /** Callback bouton "Afficher tous les avis" */
155
+ onSeeAll?: () => void;
156
+ /** Libellé du bouton (par défaut dérivé du count) */
157
+ seeAllLabel?: string;
158
+ /** Message quand aucun avis */
159
+ emptyLabel?: string;
160
+ }
161
+ /**
162
+ * Bloc avis consolidé de la fiche hébergement (échelle /10 unique).
163
+ * Remplace les blocs avis redondants. N'affiche que des sources réelles.
164
+ */
165
+ declare function ReviewSummary({ score, scoreLabel, count, title, countLabel, sources, subScores, reviews, onSeeAll, seeAllLabel, emptyLabel, className, ...props }: ReviewSummaryProps): react_jsx_runtime.JSX.Element;
166
+
167
+ interface MobileBookingBarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onSelect"> {
168
+ /** Prix total déjà formaté, ex: "248 €" */
169
+ price: string;
170
+ /** Précision sous le prix, ex: "2 nuits · taxes incl." */
171
+ meta?: string;
172
+ /** Réassurance, ex: "Vous ne serez pas débité maintenant" */
173
+ reassurance?: string;
174
+ /** Libellé du bouton d'action */
175
+ ctaLabel?: string;
176
+ /** Action de réservation */
177
+ onReserve?: () => void;
178
+ /** Désactive l'action (ex: aucune disponibilité) */
179
+ disabled?: boolean;
180
+ }
181
+ /**
182
+ * Barre de réservation collante en bas d'écran (mobile).
183
+ * Présentationnelle : reçoit un prix déjà formaté (cf. buildRateDisplay côté app).
184
+ */
185
+ declare function MobileBookingBar({ price, meta, reassurance, ctaLabel, onReserve, disabled, className, ...props }: MobileBookingBarProps): react_jsx_runtime.JSX.Element;
186
+
187
+ export { DogFriendlyPanel, type DogFriendlyPanelProps, type DogFriendlyStat, MobileBookingBar, type MobileBookingBarProps, type ReviewItem, type ReviewSubScore, ReviewSummary, type ReviewSummaryProps, SearchField, type SearchFieldProps, searchFieldVariants };