@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
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var chunk3BPC4LNH_js = require('../../chunk-3BPC4LNH.js');
3
+ var chunkT4AT3YCT_js = require('../../chunk-T4AT3YCT.js');
4
4
  require('../../chunk-ADIDI7AJ.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "Counter", {
9
9
  enumerable: true,
10
- get: function () { return chunk3BPC4LNH_js.Counter; }
10
+ get: function () { return chunkT4AT3YCT_js.Counter; }
11
11
  });
@@ -1,2 +1,2 @@
1
- export { Counter } from '../../chunk-TNGW36OC.mjs';
1
+ export { Counter } from '../../chunk-LRNSVRUN.mjs';
2
2
  import '../../chunk-IMKLN273.mjs';
@@ -1,15 +1,15 @@
1
1
  'use strict';
2
2
 
3
- var chunkNWLJ7VQF_js = require('../../chunk-NWLJ7VQF.js');
3
+ var chunkAIA3NHCK_js = require('../../chunk-AIA3NHCK.js');
4
4
  require('../../chunk-ADIDI7AJ.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "DatePickerInput", {
9
9
  enumerable: true,
10
- get: function () { return chunkNWLJ7VQF_js.DatePickerInput; }
10
+ get: function () { return chunkAIA3NHCK_js.DatePickerInput; }
11
11
  });
12
12
  Object.defineProperty(exports, "DateRangePicker", {
13
13
  enumerable: true,
14
- get: function () { return chunkNWLJ7VQF_js.DateRangePicker; }
14
+ get: function () { return chunkAIA3NHCK_js.DateRangePicker; }
15
15
  });
@@ -1,2 +1,2 @@
1
- export { DatePickerInput, DateRangePicker } from '../../chunk-RQGC6RPI.mjs';
1
+ export { DatePickerInput, DateRangePicker } from '../../chunk-FL3GD5FJ.mjs';
2
2
  import '../../chunk-IMKLN273.mjs';
@@ -7,8 +7,14 @@ interface DetailItem {
7
7
  }
8
8
  interface DetailListProps extends React.HTMLAttributes<HTMLDListElement> {
9
9
  items: DetailItem[];
10
- /** Layout direction. Default: "vertical" */
11
- direction?: "vertical" | "horizontal";
10
+ /**
11
+ * Layout direction. Default: "vertical".
12
+ * - "vertical" : label à gauche, valeur à droite (une ligne) ;
13
+ * - "horizontal" : items en colonnes côte à côte ;
14
+ * - "stacked" : icône + label en titre, valeur en dessous — pour les
15
+ * valeurs longues sur mobile (lisibilité).
16
+ */
17
+ direction?: "vertical" | "horizontal" | "stacked";
12
18
  /** Show dividers between items. Default: true */
13
19
  dividers?: boolean;
14
20
  }
@@ -7,8 +7,14 @@ interface DetailItem {
7
7
  }
8
8
  interface DetailListProps extends React.HTMLAttributes<HTMLDListElement> {
9
9
  items: DetailItem[];
10
- /** Layout direction. Default: "vertical" */
11
- direction?: "vertical" | "horizontal";
10
+ /**
11
+ * Layout direction. Default: "vertical".
12
+ * - "vertical" : label à gauche, valeur à droite (une ligne) ;
13
+ * - "horizontal" : items en colonnes côte à côte ;
14
+ * - "stacked" : icône + label en titre, valeur en dessous — pour les
15
+ * valeurs longues sur mobile (lisibilité).
16
+ */
17
+ direction?: "vertical" | "horizontal" | "stacked";
12
18
  /** Show dividers between items. Default: true */
13
19
  dividers?: boolean;
14
20
  }
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var chunkYSJAEDMG_js = require('../../chunk-YSJAEDMG.js');
3
+ var chunkE24VNM6S_js = require('../../chunk-E24VNM6S.js');
4
4
  require('../../chunk-ADIDI7AJ.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "DetailList", {
9
9
  enumerable: true,
10
- get: function () { return chunkYSJAEDMG_js.DetailList; }
10
+ get: function () { return chunkE24VNM6S_js.DetailList; }
11
11
  });
@@ -1,2 +1,2 @@
1
- export { DetailList } from '../../chunk-76DZXGKJ.mjs';
1
+ export { DetailList } from '../../chunk-N6THLJIG.mjs';
2
2
  import '../../chunk-IMKLN273.mjs';
@@ -0,0 +1,44 @@
1
+ import * as React from 'react';
2
+
3
+ interface FloatingDockItem {
4
+ /** Identifiant stable de l'item. */
5
+ key: string;
6
+ /** Libellé affiché quand l'item est actif (et pour l'accessibilité). */
7
+ label: string;
8
+ /** Icône (ex: `<Search className="w-5 h-5" />`), dimensionnée par l'appelant. */
9
+ icon: React.ReactNode;
10
+ /** Destination. Rendu comme `<a href>` (crawlable) même si `onNavigate` intercepte. */
11
+ href: string;
12
+ /** Item courant → bulle colorée + label visible. */
13
+ isActive?: boolean;
14
+ }
15
+ interface FloatingDockProps {
16
+ /** Items de navigation (3 à 5 recommandés). */
17
+ items: FloatingDockItem[];
18
+ /** Classes supplémentaires appliquées à la pilule `<nav>`. */
19
+ className?: string;
20
+ /** Libellé ARIA de la navigation. */
21
+ ariaLabel?: string;
22
+ /**
23
+ * Intercepte le clic d'un item (ex: navigation client Next, redirection login).
24
+ * Quand fourni, le `preventDefault` par défaut est appliqué avant l'appel —
25
+ * l'appelant gère lui-même la navigation.
26
+ */
27
+ onNavigate?: (item: FloatingDockItem) => void;
28
+ }
29
+ /**
30
+ * Barre de navigation flottante mobile — « dock » à bulle active.
31
+ *
32
+ * Présentation pure : l'îlot (pilule blanche arrondie, ombre douce, bulle
33
+ * colorée + label pour l'item actif) est rendu ici. Le positionnement `fixed`,
34
+ * le safe-area iOS, le masquage au scroll et la logique d'auth restent à la
35
+ * charge de l'appelant, via le wrapper englobant et `onNavigate`.
36
+ *
37
+ * - Item inactif : icône seule, cible tap 44px minimum.
38
+ * - Item actif : bulle colorée (token `secondary`) + label qui apparaît via une
39
+ * transition de largeur.
40
+ * - Rendu en `<a href>` (crawlable / accessible), interceptable par `onNavigate`.
41
+ */
42
+ declare const FloatingDock: React.ForwardRefExoticComponent<FloatingDockProps & React.RefAttributes<HTMLElement>>;
43
+
44
+ export { FloatingDock, type FloatingDockItem, type FloatingDockProps };
@@ -0,0 +1,44 @@
1
+ import * as React from 'react';
2
+
3
+ interface FloatingDockItem {
4
+ /** Identifiant stable de l'item. */
5
+ key: string;
6
+ /** Libellé affiché quand l'item est actif (et pour l'accessibilité). */
7
+ label: string;
8
+ /** Icône (ex: `<Search className="w-5 h-5" />`), dimensionnée par l'appelant. */
9
+ icon: React.ReactNode;
10
+ /** Destination. Rendu comme `<a href>` (crawlable) même si `onNavigate` intercepte. */
11
+ href: string;
12
+ /** Item courant → bulle colorée + label visible. */
13
+ isActive?: boolean;
14
+ }
15
+ interface FloatingDockProps {
16
+ /** Items de navigation (3 à 5 recommandés). */
17
+ items: FloatingDockItem[];
18
+ /** Classes supplémentaires appliquées à la pilule `<nav>`. */
19
+ className?: string;
20
+ /** Libellé ARIA de la navigation. */
21
+ ariaLabel?: string;
22
+ /**
23
+ * Intercepte le clic d'un item (ex: navigation client Next, redirection login).
24
+ * Quand fourni, le `preventDefault` par défaut est appliqué avant l'appel —
25
+ * l'appelant gère lui-même la navigation.
26
+ */
27
+ onNavigate?: (item: FloatingDockItem) => void;
28
+ }
29
+ /**
30
+ * Barre de navigation flottante mobile — « dock » à bulle active.
31
+ *
32
+ * Présentation pure : l'îlot (pilule blanche arrondie, ombre douce, bulle
33
+ * colorée + label pour l'item actif) est rendu ici. Le positionnement `fixed`,
34
+ * le safe-area iOS, le masquage au scroll et la logique d'auth restent à la
35
+ * charge de l'appelant, via le wrapper englobant et `onNavigate`.
36
+ *
37
+ * - Item inactif : icône seule, cible tap 44px minimum.
38
+ * - Item actif : bulle colorée (token `secondary`) + label qui apparaît via une
39
+ * transition de largeur.
40
+ * - Rendu en `<a href>` (crawlable / accessible), interceptable par `onNavigate`.
41
+ */
42
+ declare const FloatingDock: React.ForwardRefExoticComponent<FloatingDockProps & React.RefAttributes<HTMLElement>>;
43
+
44
+ export { FloatingDock, type FloatingDockItem, type FloatingDockProps };
@@ -0,0 +1,11 @@
1
+ 'use strict';
2
+
3
+ var chunkS732LTPT_js = require('../../chunk-S732LTPT.js');
4
+ require('../../chunk-ADIDI7AJ.js');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "FloatingDock", {
9
+ enumerable: true,
10
+ get: function () { return chunkS732LTPT_js.FloatingDock; }
11
+ });
@@ -0,0 +1,2 @@
1
+ export { FloatingDock } from '../../chunk-PBDPZTHK.mjs';
2
+ import '../../chunk-IMKLN273.mjs';
@@ -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,15 +21,20 @@ 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';
28
+ export { AnchorTabItem, AnchorTabs, AnchorTabsProps } from './components/AnchorTabs/index.mjs';
27
29
  export { FilterPill, FilterPillProps } from './components/FilterPill/index.mjs';
28
30
  export { Avatar, AvatarProps } from './components/Avatar/index.mjs';
29
31
  export { Tooltip, TooltipProps } from './components/Tooltip/index.mjs';
30
32
  export { Divider, DividerProps } from './components/Divider/index.mjs';
31
33
  export { DatePickerInput, DatePickerInputProps, DateRangePicker, DateRangePickerProps } from './components/DateRangePicker/index.mjs';
32
34
  export { SearchBar, SearchBarField, SearchBarProps } from './components/SearchBar/index.mjs';
35
+ import * as class_variance_authority_types from 'class-variance-authority/types';
36
+ import * as React from 'react';
37
+ import { VariantProps } from 'class-variance-authority';
33
38
  export { GuestPicker, GuestPickerProps } from './components/GuestPicker/index.mjs';
34
39
  export { MegaMenu, MegaMenuCard, MegaMenuColumn, MegaMenuLink, MegaMenuProps, MegaMenuSection } from './components/MegaMenu/index.mjs';
35
40
  export { Footer, FooterLinkGroup, FooterProps } from './components/Footer/index.mjs';
@@ -59,9 +64,125 @@ export { Switch, SwitchProps, switchThumbVariants, switchTrackVariants } from '.
59
64
  export { DualRangeSlider, DualRangeSliderProps } from './components/DualRangeSlider/index.mjs';
60
65
  export { CardList, CardListProps } from './components/CardList/index.mjs';
61
66
  export { FilterAccordion, FilterAccordionItemData, FilterAccordionProps } from './components/FilterAccordion/index.mjs';
67
+ export { RoomRate, RoomRateCancellation, RoomRateCancellationKind, RoomTypeCard, RoomTypeCardProps, RoomTypeCardSkeleton, RoomTypeCardSkeletonProps, RoomTypeData } from './components/RoomTypeCard/index.mjs';
68
+ import * as react_jsx_runtime from 'react/jsx-runtime';
62
69
  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
70
  import 'clsx';
71
+
72
+ declare const searchFieldVariants: (props?: ({
73
+ size?: "md" | "lg" | "xl" | null | undefined;
74
+ variant?: "default" | "hero" | null | undefined;
75
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
76
+ interface SearchFieldProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "type">, VariantProps<typeof searchFieldVariants> {
77
+ /** Callback when the clear button is clicked */
78
+ onClear?: () => void;
79
+ /** Additional class for the outer container */
80
+ containerClassName?: string;
81
+ /** Result count to display below the field */
82
+ resultCount?: number;
83
+ /** Label for the result count (e.g. "races trouvées") */
84
+ resultLabel?: string;
85
+ }
86
+ declare const SearchField: React.ForwardRefExoticComponent<SearchFieldProps & React.RefAttributes<HTMLInputElement>>;
87
+
88
+ interface DogFriendlyStat {
89
+ /** Libellé court, ex: "Taille acceptée" */
90
+ label: string;
91
+ /** Valeur mise en avant, ex: "Tous gabarits" ou "À confirmer" */
92
+ value: string;
93
+ /** Précision optionnelle, ex: "jusqu'à 2 chiens" */
94
+ note?: string;
95
+ }
96
+ interface DogFriendlyPanelProps extends React.HTMLAttributes<HTMLElement> {
97
+ /** Titre du bloc */
98
+ title?: string;
99
+ /** Info chien confirmée par l'établissement (vs à confirmer) */
100
+ confirmed?: boolean;
101
+ /** Libellé quand confirmé */
102
+ confirmedLabel?: string;
103
+ /** Libellé quand non confirmé */
104
+ unconfirmedLabel?: string;
105
+ /** Mini-cartes de faits (2 sur mobile, jusqu'à 4 sur desktop) */
106
+ stats: DogFriendlyStat[];
107
+ /** À-côtés dog-friendly (issus des équipements ETG mappés FR) */
108
+ perks?: string[];
109
+ }
110
+ /**
111
+ * Bandeau signature dog-friendly de la fiche hébergement.
112
+ * Met en avant l'accueil du chien : faits clés (taille, frais, jardin…) + à-côtés.
113
+ */
114
+ declare function DogFriendlyPanel({ title, confirmed, confirmedLabel, unconfirmedLabel, stats, perks, className, ...props }: DogFriendlyPanelProps): react_jsx_runtime.JSX.Element;
115
+
116
+ interface ReviewSubScore {
117
+ /** Libellé, ex: "Propreté" */
118
+ label: string;
119
+ /** Note /10 */
120
+ value: number;
121
+ }
122
+ interface ReviewItem {
123
+ /** Note /10 de l'avis */
124
+ score: number;
125
+ /** Libellé de la note, ex: "Excellent" */
126
+ scoreLabel: string;
127
+ /** Texte de l'avis (déjà en français) */
128
+ text: string;
129
+ /** Auteur */
130
+ author: string;
131
+ /** Contexte, ex: "Famille · 3 nuits · juin 2026" */
132
+ meta?: string;
133
+ /** Avis vérifié */
134
+ verified?: boolean;
135
+ /** Langue d'origine si traduit, ex: "l'anglais" → "Traduit de l'anglais" */
136
+ translatedFrom?: string;
137
+ }
138
+ interface ReviewSummaryProps extends React.HTMLAttributes<HTMLElement> {
139
+ /** Note globale /10 */
140
+ score?: number;
141
+ /** Libellé global, ex: "Très bien" */
142
+ scoreLabel?: string;
143
+ /** Nombre d'avis vérifiés */
144
+ count?: number;
145
+ /** Titre de la section */
146
+ title?: string;
147
+ /** Libellé du volume d'avis (D2 : "avis vérifiés" ; ne PAS afficher de plateforme non sourcée) */
148
+ countLabel?: string;
149
+ /** Sources RÉELLES uniquement (ex: ["Booking"]) — affichées après le volume ; laisser vide si aucune */
150
+ sources?: string[];
151
+ /** Sous-notes détaillées (/10) */
152
+ subScores?: ReviewSubScore[];
153
+ /** Avis mis en avant */
154
+ reviews?: ReviewItem[];
155
+ /** Callback bouton "Afficher tous les avis" */
156
+ onSeeAll?: () => void;
157
+ /** Libellé du bouton (par défaut dérivé du count) */
158
+ seeAllLabel?: string;
159
+ /** Message quand aucun avis */
160
+ emptyLabel?: string;
161
+ }
162
+ /**
163
+ * Bloc avis consolidé de la fiche hébergement (échelle /10 unique).
164
+ * Remplace les blocs avis redondants. N'affiche que des sources réelles.
165
+ */
166
+ declare function ReviewSummary({ score, scoreLabel, count, title, countLabel, sources, subScores, reviews, onSeeAll, seeAllLabel, emptyLabel, className, ...props }: ReviewSummaryProps): react_jsx_runtime.JSX.Element;
167
+
168
+ interface MobileBookingBarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onSelect"> {
169
+ /** Prix total déjà formaté, ex: "248 €" */
170
+ price: string;
171
+ /** Précision sous le prix, ex: "2 nuits · taxes incl." */
172
+ meta?: string;
173
+ /** Réassurance, ex: "Vous ne serez pas débité maintenant" */
174
+ reassurance?: string;
175
+ /** Libellé du bouton d'action */
176
+ ctaLabel?: string;
177
+ /** Action de réservation */
178
+ onReserve?: () => void;
179
+ /** Désactive l'action (ex: aucune disponibilité) */
180
+ disabled?: boolean;
181
+ }
182
+ /**
183
+ * Barre de réservation collante en bas d'écran (mobile).
184
+ * Présentationnelle : reçoit un prix déjà formaté (cf. buildRateDisplay côté app).
185
+ */
186
+ declare function MobileBookingBar({ price, meta, reassurance, ctaLabel, onReserve, disabled, className, ...props }: MobileBookingBarProps): react_jsx_runtime.JSX.Element;
187
+
188
+ export { DogFriendlyPanel, type DogFriendlyPanelProps, type DogFriendlyStat, MobileBookingBar, type MobileBookingBarProps, type ReviewItem, type ReviewSubScore, ReviewSummary, type ReviewSummaryProps, SearchField, type SearchFieldProps, searchFieldVariants };