@dododog/ui 0.13.1 → 0.14.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.
package/dist/index.d.mts CHANGED
@@ -164,8 +164,14 @@ interface ReviewSummaryProps extends React.HTMLAttributes<HTMLElement> {
164
164
  sources?: string[];
165
165
  /** Sous-notes détaillées (/10) */
166
166
  subScores?: ReviewSubScore[];
167
- /** Avis mis en avant */
167
+ /** Avis mis en avant (liste COMPLÈTE : la pagination « Voir plus » est gérée en interne) */
168
168
  reviews?: ReviewItem[];
169
+ /** Nombre d'avis affichés initialement (défaut : 8). Le reste est déplié via « Voir plus d'avis ». */
170
+ initialVisibleReviews?: number;
171
+ /** Pas de déploiement à chaque clic sur « Voir plus d'avis » (défaut : 8). */
172
+ reviewsStep?: number;
173
+ /** Libellé du bouton de déploiement progressif (défaut : « Voir plus d'avis »). */
174
+ moreReviewsLabel?: string;
169
175
  /** Callback bouton "Afficher tous les avis" */
170
176
  onSeeAll?: () => void;
171
177
  /** Libellé du bouton (par défaut dérivé du count) */
@@ -177,7 +183,7 @@ interface ReviewSummaryProps extends React.HTMLAttributes<HTMLElement> {
177
183
  * Bloc avis consolidé de la fiche hébergement (échelle /10 unique).
178
184
  * Remplace les blocs avis redondants. N'affiche que des sources réelles.
179
185
  */
180
- declare function ReviewSummary({ score, scoreLabel, count, title, countLabel, sources, subScores, reviews, onSeeAll, seeAllLabel, emptyLabel, className, ...props }: ReviewSummaryProps): react_jsx_runtime.JSX.Element;
186
+ declare function ReviewSummary({ score, scoreLabel, count, title, countLabel, sources, subScores, reviews, initialVisibleReviews, reviewsStep, moreReviewsLabel, onSeeAll, seeAllLabel, emptyLabel, className, ...props }: ReviewSummaryProps): react_jsx_runtime.JSX.Element;
181
187
 
182
188
  interface MobileBookingBarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onSelect"> {
183
189
  /** Prix total déjà formaté, ex: "248 €" */
package/dist/index.d.ts CHANGED
@@ -164,8 +164,14 @@ interface ReviewSummaryProps extends React.HTMLAttributes<HTMLElement> {
164
164
  sources?: string[];
165
165
  /** Sous-notes détaillées (/10) */
166
166
  subScores?: ReviewSubScore[];
167
- /** Avis mis en avant */
167
+ /** Avis mis en avant (liste COMPLÈTE : la pagination « Voir plus » est gérée en interne) */
168
168
  reviews?: ReviewItem[];
169
+ /** Nombre d'avis affichés initialement (défaut : 8). Le reste est déplié via « Voir plus d'avis ». */
170
+ initialVisibleReviews?: number;
171
+ /** Pas de déploiement à chaque clic sur « Voir plus d'avis » (défaut : 8). */
172
+ reviewsStep?: number;
173
+ /** Libellé du bouton de déploiement progressif (défaut : « Voir plus d'avis »). */
174
+ moreReviewsLabel?: string;
169
175
  /** Callback bouton "Afficher tous les avis" */
170
176
  onSeeAll?: () => void;
171
177
  /** Libellé du bouton (par défaut dérivé du count) */
@@ -177,7 +183,7 @@ interface ReviewSummaryProps extends React.HTMLAttributes<HTMLElement> {
177
183
  * Bloc avis consolidé de la fiche hébergement (échelle /10 unique).
178
184
  * Remplace les blocs avis redondants. N'affiche que des sources réelles.
179
185
  */
180
- declare function ReviewSummary({ score, scoreLabel, count, title, countLabel, sources, subScores, reviews, onSeeAll, seeAllLabel, emptyLabel, className, ...props }: ReviewSummaryProps): react_jsx_runtime.JSX.Element;
186
+ declare function ReviewSummary({ score, scoreLabel, count, title, countLabel, sources, subScores, reviews, initialVisibleReviews, reviewsStep, moreReviewsLabel, onSeeAll, seeAllLabel, emptyLabel, className, ...props }: ReviewSummaryProps): react_jsx_runtime.JSX.Element;
181
187
 
182
188
  interface MobileBookingBarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onSelect"> {
183
189
  /** Prix total déjà formaté, ex: "248 €" */
package/dist/index.js CHANGED
@@ -1,12 +1,13 @@
1
1
  'use strict';
2
2
 
3
+ var chunk7IJOHVNJ_js = require('./chunk-7IJOHVNJ.js');
3
4
  var chunkL7OYR6U3_js = require('./chunk-L7OYR6U3.js');
4
5
  var chunkVTELEOT7_js = require('./chunk-VTELEOT7.js');
5
6
  var chunkDTIYZ3TQ_js = require('./chunk-DTIYZ3TQ.js');
6
7
  var chunkE6ZNND75_js = require('./chunk-E6ZNND75.js');
7
- var chunk7IJOHVNJ_js = require('./chunk-7IJOHVNJ.js');
8
8
  var chunkBXFU7V2X_js = require('./chunk-BXFU7V2X.js');
9
9
  var chunkN3JU7JS7_js = require('./chunk-N3JU7JS7.js');
10
+ var chunkXHRDPJTF_js = require('./chunk-XHRDPJTF.js');
10
11
  var chunkTT7L3ZU7_js = require('./chunk-TT7L3ZU7.js');
11
12
  var chunkCWXP2ZI2_js = require('./chunk-CWXP2ZI2.js');
12
13
  var chunkDFXXGKMI_js = require('./chunk-DFXXGKMI.js');
@@ -14,40 +15,39 @@ var chunkOTHB7MU7_js = require('./chunk-OTHB7MU7.js');
14
15
  var chunk3VU6TPAT_js = require('./chunk-3VU6TPAT.js');
15
16
  var chunkI4S3R6C6_js = require('./chunk-I4S3R6C6.js');
16
17
  var chunk762LQMWP_js = require('./chunk-762LQMWP.js');
17
- var chunkOGB5LIXN_js = require('./chunk-OGB5LIXN.js');
18
+ var chunk6KW7ZSKR_js = require('./chunk-6KW7ZSKR.js');
18
19
  var chunkSEHALSKW_js = require('./chunk-SEHALSKW.js');
20
+ var chunkOGB5LIXN_js = require('./chunk-OGB5LIXN.js');
19
21
  var chunkQWDKSY6Y_js = require('./chunk-QWDKSY6Y.js');
20
- var chunkKFQILIZO_js = require('./chunk-KFQILIZO.js');
21
- var chunkNCU5PY34_js = require('./chunk-NCU5PY34.js');
22
22
  var chunk3R7PT3JG_js = require('./chunk-3R7PT3JG.js');
23
23
  var chunkDS4LM7OS_js = require('./chunk-DS4LM7OS.js');
24
24
  var chunkWXSBKARZ_js = require('./chunk-WXSBKARZ.js');
25
- var chunkXHRDPJTF_js = require('./chunk-XHRDPJTF.js');
26
- var chunkKZSGVMUG_js = require('./chunk-KZSGVMUG.js');
25
+ var chunkSCGN5H6D_js = require('./chunk-SCGN5H6D.js');
26
+ var chunkB4LR4H6R_js = require('./chunk-B4LR4H6R.js');
27
27
  var chunkPG4I4NWO_js = require('./chunk-PG4I4NWO.js');
28
28
  var chunkPRDIS2VR_js = require('./chunk-PRDIS2VR.js');
29
- var chunkTZHT7NZU_js = require('./chunk-TZHT7NZU.js');
30
- var chunkB4LR4H6R_js = require('./chunk-B4LR4H6R.js');
31
29
  var chunkGXKON34B_js = require('./chunk-GXKON34B.js');
30
+ var chunkTZHT7NZU_js = require('./chunk-TZHT7NZU.js');
31
+ var chunkKFQILIZO_js = require('./chunk-KFQILIZO.js');
32
+ var chunkNCU5PY34_js = require('./chunk-NCU5PY34.js');
32
33
  var chunkHS3MAW3G_js = require('./chunk-HS3MAW3G.js');
33
- var chunk6KW7ZSKR_js = require('./chunk-6KW7ZSKR.js');
34
- var chunkDLOHAW74_js = require('./chunk-DLOHAW74.js');
34
+ var chunkDFC6XK57_js = require('./chunk-DFC6XK57.js');
35
35
  var chunk77WKG2D7_js = require('./chunk-77WKG2D7.js');
36
36
  var chunkU3XWNFHH_js = require('./chunk-U3XWNFHH.js');
37
37
  var chunkW7DZZS6L_js = require('./chunk-W7DZZS6L.js');
38
38
  var chunkTE4WHZ4Q_js = require('./chunk-TE4WHZ4Q.js');
39
39
  var chunkHN6B4TAW_js = require('./chunk-HN6B4TAW.js');
40
- var chunkSCGN5H6D_js = require('./chunk-SCGN5H6D.js');
40
+ var chunkKZSGVMUG_js = require('./chunk-KZSGVMUG.js');
41
41
  var chunkNBDPT3XQ_js = require('./chunk-NBDPT3XQ.js');
42
42
  var chunkZCQJN4IT_js = require('./chunk-ZCQJN4IT.js');
43
43
  var chunkC4RZBOKH_js = require('./chunk-C4RZBOKH.js');
44
44
  var chunkKOO5ZXLD_js = require('./chunk-KOO5ZXLD.js');
45
45
  var chunkIRKM5UF4_js = require('./chunk-IRKM5UF4.js');
46
- var chunkYN4HPIRC_js = require('./chunk-YN4HPIRC.js');
47
46
  var chunkECVKFE6U_js = require('./chunk-ECVKFE6U.js');
47
+ var chunkYN4HPIRC_js = require('./chunk-YN4HPIRC.js');
48
48
  var chunkMKOKWME3_js = require('./chunk-MKOKWME3.js');
49
- var chunkDFC6XK57_js = require('./chunk-DFC6XK57.js');
50
- require('./chunk-VNURXHKK.js');
49
+ var chunkDLOHAW74_js = require('./chunk-DLOHAW74.js');
50
+ var chunkBS7R7VDS_js = require('./chunk-BS7R7VDS.js');
51
51
  var chunkVWFY24XF_js = require('./chunk-VWFY24XF.js');
52
52
  var chunkT5FLQQP6_js = require('./chunk-T5FLQQP6.js');
53
53
  var chunkTDGU5Y2P_js = require('./chunk-TDGU5Y2P.js');
@@ -57,25 +57,25 @@ var chunk7W3TFPIF_js = require('./chunk-7W3TFPIF.js');
57
57
  var chunkTJDHGNMR_js = require('./chunk-TJDHGNMR.js');
58
58
  var chunkP7GAKOCX_js = require('./chunk-P7GAKOCX.js');
59
59
  var chunkMY6BYO5F_js = require('./chunk-MY6BYO5F.js');
60
- var chunkIJIUUBFT_js = require('./chunk-IJIUUBFT.js');
61
- var chunkAIA3NHCK_js = require('./chunk-AIA3NHCK.js');
62
60
  var chunkT4AT3YCT_js = require('./chunk-T4AT3YCT.js');
61
+ var chunkAIA3NHCK_js = require('./chunk-AIA3NHCK.js');
62
+ var chunkIJIUUBFT_js = require('./chunk-IJIUUBFT.js');
63
63
  var chunkE24VNM6S_js = require('./chunk-E24VNM6S.js');
64
64
  var chunkXXC2YD3D_js = require('./chunk-XXC2YD3D.js');
65
- var chunkBS7R7VDS_js = require('./chunk-BS7R7VDS.js');
65
+ require('./chunk-VNURXHKK.js');
66
66
  var chunkNHB2TI2B_js = require('./chunk-NHB2TI2B.js');
67
+ var chunkEY4ZIR3P_js = require('./chunk-EY4ZIR3P.js');
67
68
  var chunkZ5S7LHMY_js = require('./chunk-Z5S7LHMY.js');
68
69
  var chunk6EG6EAHW_js = require('./chunk-6EG6EAHW.js');
69
- var chunkEY4ZIR3P_js = require('./chunk-EY4ZIR3P.js');
70
70
  var chunkPND5YKFN_js = require('./chunk-PND5YKFN.js');
71
- var chunkYZTVHCLK_js = require('./chunk-YZTVHCLK.js');
72
71
  var chunkH3JNRTAI_js = require('./chunk-H3JNRTAI.js');
72
+ var chunkYZTVHCLK_js = require('./chunk-YZTVHCLK.js');
73
73
  var chunkZAUYE2EI_js = require('./chunk-ZAUYE2EI.js');
74
74
  var chunkMCF3EQTV_js = require('./chunk-MCF3EQTV.js');
75
75
  var chunkG3LZ32WA_js = require('./chunk-G3LZ32WA.js');
76
76
  var chunkHB2XJOBZ_js = require('./chunk-HB2XJOBZ.js');
77
- var chunkWXEZA6NE_js = require('./chunk-WXEZA6NE.js');
78
77
  var chunkWBRVUWGC_js = require('./chunk-WBRVUWGC.js');
78
+ var chunkWXEZA6NE_js = require('./chunk-WXEZA6NE.js');
79
79
  var chunkADIDI7AJ_js = require('./chunk-ADIDI7AJ.js');
80
80
  var React = require('react');
81
81
  var classVarianceAuthority = require('class-variance-authority');
@@ -342,6 +342,11 @@ function DogFriendlyPanel({
342
342
  function CheckIcon2({ className }) {
343
343
  return /* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.jsx("path", { d: "M20 6 9 17l-5-5" }) });
344
344
  }
345
+ function ChevronDownIcon({ className }) {
346
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m6 9 6 6 6-6" }) });
347
+ }
348
+ var DEFAULT_INITIAL_VISIBLE = 8;
349
+ var DEFAULT_REVIEWS_STEP = 8;
345
350
  function formatScore(score) {
346
351
  return score.toFixed(1).replace(".", ",");
347
352
  }
@@ -357,14 +362,21 @@ function ReviewSummary({
357
362
  sources,
358
363
  subScores,
359
364
  reviews,
365
+ initialVisibleReviews = DEFAULT_INITIAL_VISIBLE,
366
+ reviewsStep = DEFAULT_REVIEWS_STEP,
367
+ moreReviewsLabel = "Voir plus d'avis",
360
368
  onSeeAll,
361
369
  seeAllLabel,
362
370
  emptyLabel = "Peu d'avis v\xE9rifi\xE9s pour le moment",
363
371
  className,
364
372
  ...props
365
373
  }) {
366
- const hasReviews = Boolean(reviews && reviews.length > 0);
374
+ const totalReviews = reviews?.length ?? 0;
375
+ const hasReviews = totalReviews > 0;
367
376
  const isEmpty = score == null && !hasReviews;
377
+ const [visibleCount, setVisibleCount] = React__namespace.useState(initialVisibleReviews);
378
+ const visibleReviews = reviews ? reviews.slice(0, visibleCount) : [];
379
+ const hasMoreReviews = visibleCount < totalReviews;
368
380
  return /* @__PURE__ */ jsxRuntime.jsxs(
369
381
  "section",
370
382
  {
@@ -401,7 +413,7 @@ function ReviewSummary({
401
413
  },
402
414
  sub.label
403
415
  )) }) : null,
404
- hasReviews ? /* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.jsxs(
416
+ hasReviews ? /* @__PURE__ */ jsxRuntime.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: visibleReviews.map((review, index) => /* @__PURE__ */ jsxRuntime.jsxs(
405
417
  "li",
406
418
  {
407
419
  className: "flex w-[280px] shrink-0 flex-col rounded-2xl border border-sand-dark bg-white p-4",
@@ -438,6 +450,20 @@ function ReviewSummary({
438
450
  },
439
451
  `${review.author}-${index}`
440
452
  )) }) : null,
453
+ hasMoreReviews ? /* @__PURE__ */ jsxRuntime.jsxs(
454
+ "button",
455
+ {
456
+ type: "button",
457
+ onClick: () => setVisibleCount(
458
+ (current) => Math.min(current + reviewsStep, totalReviews)
459
+ ),
460
+ className: "mt-4 inline-flex w-full items-center justify-center gap-1.5 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",
461
+ children: [
462
+ moreReviewsLabel,
463
+ /* @__PURE__ */ jsxRuntime.jsx(ChevronDownIcon, { className: "h-4 w-4" })
464
+ ]
465
+ }
466
+ ) : null,
441
467
  onSeeAll ? /* @__PURE__ */ jsxRuntime.jsx(
442
468
  "button",
443
469
  {
@@ -496,6 +522,14 @@ function MobileBookingBar({
496
522
  );
497
523
  }
498
524
 
525
+ Object.defineProperty(exports, "Tag", {
526
+ enumerable: true,
527
+ get: function () { return chunk7IJOHVNJ_js.Tag; }
528
+ });
529
+ Object.defineProperty(exports, "tagVariants", {
530
+ enumerable: true,
531
+ get: function () { return chunk7IJOHVNJ_js.tagVariants; }
532
+ });
499
533
  Object.defineProperty(exports, "Textarea", {
500
534
  enumerable: true,
501
535
  get: function () { return chunkL7OYR6U3_js.Textarea; }
@@ -520,14 +554,6 @@ Object.defineProperty(exports, "Tooltip", {
520
554
  enumerable: true,
521
555
  get: function () { return chunkE6ZNND75_js.Tooltip; }
522
556
  });
523
- Object.defineProperty(exports, "Tag", {
524
- enumerable: true,
525
- get: function () { return chunk7IJOHVNJ_js.Tag; }
526
- });
527
- Object.defineProperty(exports, "tagVariants", {
528
- enumerable: true,
529
- get: function () { return chunk7IJOHVNJ_js.tagVariants; }
530
- });
531
557
  Object.defineProperty(exports, "TripHeroCard", {
532
558
  enumerable: true,
533
559
  get: function () { return chunkBXFU7V2X_js.TripHeroCard; }
@@ -536,6 +562,14 @@ Object.defineProperty(exports, "VerticalMarquee", {
536
562
  enumerable: true,
537
563
  get: function () { return chunkN3JU7JS7_js.VerticalMarquee; }
538
564
  });
565
+ Object.defineProperty(exports, "Spinner", {
566
+ enumerable: true,
567
+ get: function () { return chunkXHRDPJTF_js.Spinner; }
568
+ });
569
+ Object.defineProperty(exports, "spinnerVariants", {
570
+ enumerable: true,
571
+ get: function () { return chunkXHRDPJTF_js.spinnerVariants; }
572
+ });
539
573
  Object.defineProperty(exports, "StatCard", {
540
574
  enumerable: true,
541
575
  get: function () { return chunkTT7L3ZU7_js.StatCard; }
@@ -576,41 +610,21 @@ Object.defineProperty(exports, "Tabs", {
576
610
  enumerable: true,
577
611
  get: function () { return chunk762LQMWP_js.Tabs; }
578
612
  });
579
- Object.defineProperty(exports, "SectionHeader", {
613
+ Object.defineProperty(exports, "SearchLoadingChecklist", {
580
614
  enumerable: true,
581
- get: function () { return chunkOGB5LIXN_js.SectionHeader; }
615
+ get: function () { return chunk6KW7ZSKR_js.SearchLoadingChecklist; }
582
616
  });
583
617
  Object.defineProperty(exports, "SearchWidget", {
584
618
  enumerable: true,
585
619
  get: function () { return chunkSEHALSKW_js.SearchWidget; }
586
620
  });
587
- Object.defineProperty(exports, "SegmentedControl", {
588
- enumerable: true,
589
- get: function () { return chunkQWDKSY6Y_js.SegmentedControl; }
590
- });
591
- Object.defineProperty(exports, "RoomTypeCard", {
592
- enumerable: true,
593
- get: function () { return chunkKFQILIZO_js.RoomTypeCard; }
594
- });
595
- Object.defineProperty(exports, "RoomTypeCardSkeleton", {
596
- enumerable: true,
597
- get: function () { return chunkKFQILIZO_js.RoomTypeCardSkeleton; }
598
- });
599
- Object.defineProperty(exports, "Skeleton", {
600
- enumerable: true,
601
- get: function () { return chunkNCU5PY34_js.Skeleton; }
602
- });
603
- Object.defineProperty(exports, "SkeletonCircle", {
604
- enumerable: true,
605
- get: function () { return chunkNCU5PY34_js.SkeletonCircle; }
606
- });
607
- Object.defineProperty(exports, "SkeletonImage", {
621
+ Object.defineProperty(exports, "SectionHeader", {
608
622
  enumerable: true,
609
- get: function () { return chunkNCU5PY34_js.SkeletonImage; }
623
+ get: function () { return chunkOGB5LIXN_js.SectionHeader; }
610
624
  });
611
- Object.defineProperty(exports, "SkeletonText", {
625
+ Object.defineProperty(exports, "SegmentedControl", {
612
626
  enumerable: true,
613
- get: function () { return chunkNCU5PY34_js.SkeletonText; }
627
+ get: function () { return chunkQWDKSY6Y_js.SegmentedControl; }
614
628
  });
615
629
  Object.defineProperty(exports, "Select", {
616
630
  enumerable: true,
@@ -632,17 +646,13 @@ Object.defineProperty(exports, "signInCalloutVariants", {
632
646
  enumerable: true,
633
647
  get: function () { return chunkWXSBKARZ_js.signInCalloutVariants; }
634
648
  });
635
- Object.defineProperty(exports, "Spinner", {
636
- enumerable: true,
637
- get: function () { return chunkXHRDPJTF_js.Spinner; }
638
- });
639
- Object.defineProperty(exports, "spinnerVariants", {
649
+ Object.defineProperty(exports, "Pagination", {
640
650
  enumerable: true,
641
- get: function () { return chunkXHRDPJTF_js.spinnerVariants; }
651
+ get: function () { return chunkSCGN5H6D_js.Pagination; }
642
652
  });
643
- Object.defineProperty(exports, "MobileMenu", {
653
+ Object.defineProperty(exports, "PriceDisplay", {
644
654
  enumerable: true,
645
- get: function () { return chunkKZSGVMUG_js.MobileMenu; }
655
+ get: function () { return chunkB4LR4H6R_js.PriceDisplay; }
646
656
  });
647
657
  Object.defineProperty(exports, "ProgressBar", {
648
658
  enumerable: true,
@@ -664,29 +674,45 @@ Object.defineProperty(exports, "promoBannerVariants", {
664
674
  enumerable: true,
665
675
  get: function () { return chunkPRDIS2VR_js.promoBannerVariants; }
666
676
  });
677
+ Object.defineProperty(exports, "RadioGroup", {
678
+ enumerable: true,
679
+ get: function () { return chunkGXKON34B_js.RadioGroup; }
680
+ });
667
681
  Object.defineProperty(exports, "Rating", {
668
682
  enumerable: true,
669
683
  get: function () { return chunkTZHT7NZU_js.Rating; }
670
684
  });
671
- Object.defineProperty(exports, "PriceDisplay", {
685
+ Object.defineProperty(exports, "RoomTypeCard", {
672
686
  enumerable: true,
673
- get: function () { return chunkB4LR4H6R_js.PriceDisplay; }
687
+ get: function () { return chunkKFQILIZO_js.RoomTypeCard; }
674
688
  });
675
- Object.defineProperty(exports, "RadioGroup", {
689
+ Object.defineProperty(exports, "RoomTypeCardSkeleton", {
676
690
  enumerable: true,
677
- get: function () { return chunkGXKON34B_js.RadioGroup; }
691
+ get: function () { return chunkKFQILIZO_js.RoomTypeCardSkeleton; }
678
692
  });
679
- Object.defineProperty(exports, "SearchBar", {
693
+ Object.defineProperty(exports, "Skeleton", {
680
694
  enumerable: true,
681
- get: function () { return chunkHS3MAW3G_js.SearchBar; }
695
+ get: function () { return chunkNCU5PY34_js.Skeleton; }
682
696
  });
683
- Object.defineProperty(exports, "SearchLoadingChecklist", {
697
+ Object.defineProperty(exports, "SkeletonCircle", {
684
698
  enumerable: true,
685
- get: function () { return chunk6KW7ZSKR_js.SearchLoadingChecklist; }
699
+ get: function () { return chunkNCU5PY34_js.SkeletonCircle; }
686
700
  });
687
- Object.defineProperty(exports, "ImageWithFallback", {
701
+ Object.defineProperty(exports, "SkeletonImage", {
688
702
  enumerable: true,
689
- get: function () { return chunkDLOHAW74_js.ImageWithFallback; }
703
+ get: function () { return chunkNCU5PY34_js.SkeletonImage; }
704
+ });
705
+ Object.defineProperty(exports, "SkeletonText", {
706
+ enumerable: true,
707
+ get: function () { return chunkNCU5PY34_js.SkeletonText; }
708
+ });
709
+ Object.defineProperty(exports, "SearchBar", {
710
+ enumerable: true,
711
+ get: function () { return chunkHS3MAW3G_js.SearchBar; }
712
+ });
713
+ Object.defineProperty(exports, "ImpactCard", {
714
+ enumerable: true,
715
+ get: function () { return chunkDFC6XK57_js.ImpactCard; }
690
716
  });
691
717
  Object.defineProperty(exports, "Input", {
692
718
  enumerable: true,
@@ -712,9 +738,9 @@ Object.defineProperty(exports, "MegaMenu", {
712
738
  enumerable: true,
713
739
  get: function () { return chunkHN6B4TAW_js.MegaMenu; }
714
740
  });
715
- Object.defineProperty(exports, "Pagination", {
741
+ Object.defineProperty(exports, "MobileMenu", {
716
742
  enumerable: true,
717
- get: function () { return chunkSCGN5H6D_js.Pagination; }
743
+ get: function () { return chunkKZSGVMUG_js.MobileMenu; }
718
744
  });
719
745
  Object.defineProperty(exports, "Modal", {
720
746
  enumerable: true,
@@ -736,6 +762,10 @@ Object.defineProperty(exports, "Header", {
736
762
  enumerable: true,
737
763
  get: function () { return chunkIRKM5UF4_js.Header; }
738
764
  });
765
+ Object.defineProperty(exports, "HotelCard", {
766
+ enumerable: true,
767
+ get: function () { return chunkECVKFE6U_js.HotelCard; }
768
+ });
739
769
  Object.defineProperty(exports, "IconBadge", {
740
770
  enumerable: true,
741
771
  get: function () { return chunkYN4HPIRC_js.IconBadge; }
@@ -744,17 +774,17 @@ Object.defineProperty(exports, "iconBadgeVariants", {
744
774
  enumerable: true,
745
775
  get: function () { return chunkYN4HPIRC_js.iconBadgeVariants; }
746
776
  });
747
- Object.defineProperty(exports, "HotelCard", {
748
- enumerable: true,
749
- get: function () { return chunkECVKFE6U_js.HotelCard; }
750
- });
751
777
  Object.defineProperty(exports, "ImageGallery", {
752
778
  enumerable: true,
753
779
  get: function () { return chunkMKOKWME3_js.ImageGallery; }
754
780
  });
755
- Object.defineProperty(exports, "ImpactCard", {
781
+ Object.defineProperty(exports, "ImageWithFallback", {
756
782
  enumerable: true,
757
- get: function () { return chunkDFC6XK57_js.ImpactCard; }
783
+ get: function () { return chunkDLOHAW74_js.ImageWithFallback; }
784
+ });
785
+ Object.defineProperty(exports, "DogCard", {
786
+ enumerable: true,
787
+ get: function () { return chunkBS7R7VDS_js.DogCard; }
758
788
  });
759
789
  Object.defineProperty(exports, "Drawer", {
760
790
  enumerable: true,
@@ -792,9 +822,9 @@ Object.defineProperty(exports, "CardList", {
792
822
  enumerable: true,
793
823
  get: function () { return chunkMY6BYO5F_js.CardList; }
794
824
  });
795
- Object.defineProperty(exports, "Checkbox", {
825
+ Object.defineProperty(exports, "Counter", {
796
826
  enumerable: true,
797
- get: function () { return chunkIJIUUBFT_js.Checkbox; }
827
+ get: function () { return chunkT4AT3YCT_js.Counter; }
798
828
  });
799
829
  Object.defineProperty(exports, "DatePickerInput", {
800
830
  enumerable: true,
@@ -804,9 +834,9 @@ Object.defineProperty(exports, "DateRangePicker", {
804
834
  enumerable: true,
805
835
  get: function () { return chunkAIA3NHCK_js.DateRangePicker; }
806
836
  });
807
- Object.defineProperty(exports, "Counter", {
837
+ Object.defineProperty(exports, "Checkbox", {
808
838
  enumerable: true,
809
- get: function () { return chunkT4AT3YCT_js.Counter; }
839
+ get: function () { return chunkIJIUUBFT_js.Checkbox; }
810
840
  });
811
841
  Object.defineProperty(exports, "DetailList", {
812
842
  enumerable: true,
@@ -816,10 +846,6 @@ Object.defineProperty(exports, "Divider", {
816
846
  enumerable: true,
817
847
  get: function () { return chunkXXC2YD3D_js.Divider; }
818
848
  });
819
- Object.defineProperty(exports, "DogCard", {
820
- enumerable: true,
821
- get: function () { return chunkBS7R7VDS_js.DogCard; }
822
- });
823
849
  Object.defineProperty(exports, "Autocomplete", {
824
850
  enumerable: true,
825
851
  get: function () { return chunkNHB2TI2B_js.Autocomplete; }
@@ -828,6 +854,10 @@ Object.defineProperty(exports, "autocompleteInputVariants", {
828
854
  enumerable: true,
829
855
  get: function () { return chunkNHB2TI2B_js.autocompleteInputVariants; }
830
856
  });
857
+ Object.defineProperty(exports, "Avatar", {
858
+ enumerable: true,
859
+ get: function () { return chunkEY4ZIR3P_js.Avatar; }
860
+ });
831
861
  Object.defineProperty(exports, "Badge", {
832
862
  enumerable: true,
833
863
  get: function () { return chunkZ5S7LHMY_js.Badge; }
@@ -844,22 +874,10 @@ Object.defineProperty(exports, "bannerVariants", {
844
874
  enumerable: true,
845
875
  get: function () { return chunk6EG6EAHW_js.bannerVariants; }
846
876
  });
847
- Object.defineProperty(exports, "Avatar", {
848
- enumerable: true,
849
- get: function () { return chunkEY4ZIR3P_js.Avatar; }
850
- });
851
877
  Object.defineProperty(exports, "BottomNavBar", {
852
878
  enumerable: true,
853
879
  get: function () { return chunkPND5YKFN_js.BottomNavBar; }
854
880
  });
855
- Object.defineProperty(exports, "Button", {
856
- enumerable: true,
857
- get: function () { return chunkYZTVHCLK_js.Button; }
858
- });
859
- Object.defineProperty(exports, "buttonVariants", {
860
- enumerable: true,
861
- get: function () { return chunkYZTVHCLK_js.buttonVariants; }
862
- });
863
881
  Object.defineProperty(exports, "Breadcrumb", {
864
882
  enumerable: true,
865
883
  get: function () { return chunkH3JNRTAI_js.Breadcrumb; }
@@ -868,6 +886,14 @@ Object.defineProperty(exports, "breadcrumbVariants", {
868
886
  enumerable: true,
869
887
  get: function () { return chunkH3JNRTAI_js.breadcrumbVariants; }
870
888
  });
889
+ Object.defineProperty(exports, "Button", {
890
+ enumerable: true,
891
+ get: function () { return chunkYZTVHCLK_js.Button; }
892
+ });
893
+ Object.defineProperty(exports, "buttonVariants", {
894
+ enumerable: true,
895
+ get: function () { return chunkYZTVHCLK_js.buttonVariants; }
896
+ });
871
897
  Object.defineProperty(exports, "Card", {
872
898
  enumerable: true,
873
899
  get: function () { return chunkZAUYE2EI_js.Card; }
@@ -920,14 +946,14 @@ Object.defineProperty(exports, "dogAvatarColor", {
920
946
  enumerable: true,
921
947
  get: function () { return chunkHB2XJOBZ_js.dogAvatarColor; }
922
948
  });
923
- Object.defineProperty(exports, "AnchorTabs", {
924
- enumerable: true,
925
- get: function () { return chunkWXEZA6NE_js.AnchorTabs; }
926
- });
927
949
  Object.defineProperty(exports, "Alert", {
928
950
  enumerable: true,
929
951
  get: function () { return chunkWBRVUWGC_js.Alert; }
930
952
  });
953
+ Object.defineProperty(exports, "AnchorTabs", {
954
+ enumerable: true,
955
+ get: function () { return chunkWXEZA6NE_js.AnchorTabs; }
956
+ });
931
957
  Object.defineProperty(exports, "cn", {
932
958
  enumerable: true,
933
959
  get: function () { return chunkADIDI7AJ_js.cn; }
package/dist/index.mjs CHANGED
@@ -1,10 +1,11 @@
1
+ export { Tag, tagVariants } from './chunk-WOG6V7OW.mjs';
1
2
  export { Textarea, textareaVariants } from './chunk-ZZ4EWC53.mjs';
2
3
  export { Toast, toastVariants } from './chunk-YVTUUNAX.mjs';
3
4
  export { Toggle } from './chunk-2AB5ZHY5.mjs';
4
5
  export { Tooltip } from './chunk-2MJTZ6RR.mjs';
5
- export { Tag, tagVariants } from './chunk-WOG6V7OW.mjs';
6
6
  export { TripHeroCard } from './chunk-LO2XNMZO.mjs';
7
7
  export { VerticalMarquee } from './chunk-JP5ZR2HI.mjs';
8
+ export { Spinner, spinnerVariants } from './chunk-NCSFXSOZ.mjs';
8
9
  export { StatCard } from './chunk-O2W7NR33.mjs';
9
10
  export { StatTile } from './chunk-ZEPXWD6U.mjs';
10
11
  export { StatusBadge, statusBadgeVariants } from './chunk-FZ7UNXSC.mjs';
@@ -12,40 +13,39 @@ export { StayListRow } from './chunk-IVCQVBOT.mjs';
12
13
  export { Stepper } from './chunk-2ASKBL63.mjs';
13
14
  export { Switch, switchThumbVariants, switchTrackVariants } from './chunk-DMCMWOBJ.mjs';
14
15
  export { Tabs } from './chunk-VOZPGXQD.mjs';
15
- export { SectionHeader } from './chunk-DM76AK4A.mjs';
16
+ export { SearchLoadingChecklist } from './chunk-SRYZ4N7T.mjs';
16
17
  export { SearchWidget } from './chunk-DUT3ABEI.mjs';
18
+ export { SectionHeader } from './chunk-DM76AK4A.mjs';
17
19
  export { SegmentedControl } from './chunk-36Y7UU32.mjs';
18
- export { RoomTypeCard, RoomTypeCardSkeleton } from './chunk-IGBEBAPY.mjs';
19
- export { Skeleton, SkeletonCircle, SkeletonImage, SkeletonText } from './chunk-PAHSQMXV.mjs';
20
20
  export { Select, selectVariants } from './chunk-333YD5QI.mjs';
21
21
  export { Sidebar } from './chunk-MPL35D5G.mjs';
22
22
  export { SignInCallout, signInCalloutVariants } from './chunk-Z3KRMKHP.mjs';
23
- export { Spinner, spinnerVariants } from './chunk-NCSFXSOZ.mjs';
24
- export { MobileMenu } from './chunk-R4DC7XPP.mjs';
23
+ export { Pagination } from './chunk-XQVODPHL.mjs';
24
+ export { PriceDisplay } from './chunk-REXLQTNE.mjs';
25
25
  export { ProgressBar, progressBarVariants, progressFillVariants } from './chunk-UGYMWWKT.mjs';
26
26
  export { PromoBanner, promoBannerVariants } from './chunk-FNDR3WOZ.mjs';
27
- export { Rating } from './chunk-SGDC4IVX.mjs';
28
- export { PriceDisplay } from './chunk-REXLQTNE.mjs';
29
27
  export { RadioGroup } from './chunk-F2BUMJYW.mjs';
28
+ export { Rating } from './chunk-SGDC4IVX.mjs';
29
+ export { RoomTypeCard, RoomTypeCardSkeleton } from './chunk-IGBEBAPY.mjs';
30
+ export { Skeleton, SkeletonCircle, SkeletonImage, SkeletonText } from './chunk-PAHSQMXV.mjs';
30
31
  export { SearchBar } from './chunk-KQK7LFWM.mjs';
31
- export { SearchLoadingChecklist } from './chunk-SRYZ4N7T.mjs';
32
- export { ImageWithFallback } from './chunk-BUXVK2HE.mjs';
32
+ export { ImpactCard } from './chunk-IKQYFSBW.mjs';
33
33
  export { Input, inputVariants } from './chunk-GRG4USTC.mjs';
34
34
  export { Lightbox } from './chunk-GBWVIY3C.mjs';
35
35
  export { LinkCard } from './chunk-UYDZKAGZ.mjs';
36
36
  export { LoadingOverlay } from './chunk-WVEJS2J2.mjs';
37
37
  export { MegaMenu } from './chunk-EUEM2D5M.mjs';
38
- export { Pagination } from './chunk-XQVODPHL.mjs';
38
+ export { MobileMenu } from './chunk-R4DC7XPP.mjs';
39
39
  export { Modal } from './chunk-74B2EGKT.mjs';
40
40
  export { FloatingDock } from './chunk-P2SGBTKS.mjs';
41
41
  export { Footer } from './chunk-SZ3SV4SJ.mjs';
42
42
  export { GuestPicker } from './chunk-EJ7LDW7E.mjs';
43
43
  export { Header } from './chunk-PPDKQ3FF.mjs';
44
- export { IconBadge, iconBadgeVariants } from './chunk-I4WCNTNP.mjs';
45
44
  export { HotelCard } from './chunk-XSSRFA5O.mjs';
45
+ export { IconBadge, iconBadgeVariants } from './chunk-I4WCNTNP.mjs';
46
46
  export { ImageGallery } from './chunk-QU6ZRLKO.mjs';
47
- export { ImpactCard } from './chunk-IKQYFSBW.mjs';
48
- import './chunk-OZULAGYL.mjs';
47
+ export { ImageWithFallback } from './chunk-BUXVK2HE.mjs';
48
+ export { DogCard } from './chunk-4A3AQ66D.mjs';
49
49
  export { Drawer } from './chunk-ZLF7IL3Y.mjs';
50
50
  export { DropdownMenu } from './chunk-Q7BKR6O7.mjs';
51
51
  export { DualRangeSlider } from './chunk-ERL3WXNY.mjs';
@@ -55,25 +55,25 @@ export { FilterAccordion } from './chunk-VQVRKRSM.mjs';
55
55
  export { FilterPill } from './chunk-YKBASX5A.mjs';
56
56
  export { Carousel } from './chunk-OOPP4ES2.mjs';
57
57
  export { CardList } from './chunk-RJWHPHHX.mjs';
58
- export { Checkbox } from './chunk-EEIPCJQ2.mjs';
59
- export { DatePickerInput, DateRangePicker } from './chunk-FL3GD5FJ.mjs';
60
58
  export { Counter } from './chunk-LRNSVRUN.mjs';
59
+ export { DatePickerInput, DateRangePicker } from './chunk-FL3GD5FJ.mjs';
60
+ export { Checkbox } from './chunk-EEIPCJQ2.mjs';
61
61
  export { DetailList } from './chunk-N6THLJIG.mjs';
62
62
  export { Divider } from './chunk-E4B6LXK7.mjs';
63
- export { DogCard } from './chunk-4A3AQ66D.mjs';
63
+ import './chunk-OZULAGYL.mjs';
64
64
  export { Autocomplete, autocompleteInputVariants } from './chunk-B47HQHX3.mjs';
65
+ export { Avatar } from './chunk-2POGTS27.mjs';
65
66
  export { Badge, badgeVariants } from './chunk-XZU2SISM.mjs';
66
67
  export { Banner, bannerVariants } from './chunk-LFIZX2S6.mjs';
67
- export { Avatar } from './chunk-2POGTS27.mjs';
68
68
  export { BottomNavBar } from './chunk-UQRQZLMQ.mjs';
69
- export { Button, buttonVariants } from './chunk-4U5MNA3B.mjs';
70
69
  export { Breadcrumb, breadcrumbVariants } from './chunk-UKCH6RYL.mjs';
70
+ export { Button, buttonVariants } from './chunk-4U5MNA3B.mjs';
71
71
  export { Card, CardContent, CardDescription, CardImage, CardTitle, cardImageVariants, cardVariants } from './chunk-V5J2XLPD.mjs';
72
72
  export { Accordion } from './chunk-NZ7GF6RF.mjs';
73
73
  export { ActiveStayCard } from './chunk-CRQ4XOCC.mjs';
74
74
  export { DOG_AVATAR_COLORS, DogAvatar, DogAvatarStack, dogAvatarColor } from './chunk-AGNY5DBW.mjs';
75
- export { AnchorTabs } from './chunk-M2H6QUAL.mjs';
76
75
  export { Alert } from './chunk-BQWVWK74.mjs';
76
+ export { AnchorTabs } from './chunk-M2H6QUAL.mjs';
77
77
  import { cn } from './chunk-IMKLN273.mjs';
78
78
  export { cn } from './chunk-IMKLN273.mjs';
79
79
  import * as React from 'react';
@@ -321,6 +321,11 @@ function DogFriendlyPanel({
321
321
  function CheckIcon2({ className }) {
322
322
  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" }) });
323
323
  }
324
+ function ChevronDownIcon({ className }) {
325
+ return /* @__PURE__ */ jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { d: "m6 9 6 6 6-6" }) });
326
+ }
327
+ var DEFAULT_INITIAL_VISIBLE = 8;
328
+ var DEFAULT_REVIEWS_STEP = 8;
324
329
  function formatScore(score) {
325
330
  return score.toFixed(1).replace(".", ",");
326
331
  }
@@ -336,14 +341,21 @@ function ReviewSummary({
336
341
  sources,
337
342
  subScores,
338
343
  reviews,
344
+ initialVisibleReviews = DEFAULT_INITIAL_VISIBLE,
345
+ reviewsStep = DEFAULT_REVIEWS_STEP,
346
+ moreReviewsLabel = "Voir plus d'avis",
339
347
  onSeeAll,
340
348
  seeAllLabel,
341
349
  emptyLabel = "Peu d'avis v\xE9rifi\xE9s pour le moment",
342
350
  className,
343
351
  ...props
344
352
  }) {
345
- const hasReviews = Boolean(reviews && reviews.length > 0);
353
+ const totalReviews = reviews?.length ?? 0;
354
+ const hasReviews = totalReviews > 0;
346
355
  const isEmpty = score == null && !hasReviews;
356
+ const [visibleCount, setVisibleCount] = React.useState(initialVisibleReviews);
357
+ const visibleReviews = reviews ? reviews.slice(0, visibleCount) : [];
358
+ const hasMoreReviews = visibleCount < totalReviews;
347
359
  return /* @__PURE__ */ jsxs(
348
360
  "section",
349
361
  {
@@ -380,7 +392,7 @@ function ReviewSummary({
380
392
  },
381
393
  sub.label
382
394
  )) }) : null,
383
- 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(
395
+ 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: visibleReviews.map((review, index) => /* @__PURE__ */ jsxs(
384
396
  "li",
385
397
  {
386
398
  className: "flex w-[280px] shrink-0 flex-col rounded-2xl border border-sand-dark bg-white p-4",
@@ -417,6 +429,20 @@ function ReviewSummary({
417
429
  },
418
430
  `${review.author}-${index}`
419
431
  )) }) : null,
432
+ hasMoreReviews ? /* @__PURE__ */ jsxs(
433
+ "button",
434
+ {
435
+ type: "button",
436
+ onClick: () => setVisibleCount(
437
+ (current) => Math.min(current + reviewsStep, totalReviews)
438
+ ),
439
+ className: "mt-4 inline-flex w-full items-center justify-center gap-1.5 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",
440
+ children: [
441
+ moreReviewsLabel,
442
+ /* @__PURE__ */ jsx(ChevronDownIcon, { className: "h-4 w-4" })
443
+ ]
444
+ }
445
+ ) : null,
420
446
  onSeeAll ? /* @__PURE__ */ jsx(
421
447
  "button",
422
448
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dododog/ui",
3
- "version": "0.13.1",
3
+ "version": "0.14.0",
4
4
  "description": "React UI component library for DodoDog — pet-friendly travel platform",
5
5
  "sideEffects": false,
6
6
  "license": "MIT",