@mobielnl/elements 0.4.0 → 0.5.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.
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { r as pt, t as Z, i as Re, a as q, n as De, p as mt, b as fn, c as Ve, d as pn, v as mn, e as gn, f as x, g as le, s as vn, h as yn, j as Ie, k as H, l as gt, m as Y, o as bn, q as Tn, u as te, w as ue, x as I, y as ne, z as Vn, A as An, B as vt, C as Ne, D as Sn, E as wn, F as Pn, G as D, H as yt, I as bt, J as Tt, K as je, L as Vt, M as xn, N as Cn, O as Mn, P as ze, Q as Fn, R as On, S as Rn, T as Dn, U as In, V as Nn, W as Kn, X as En, Y as Bn, Z as Ln, _ as kn } from "./index-CJzOpHdk.js";
2
+ import { r as pt, t as Z, i as Re, a as q, n as De, p as mt, b as fn, c as Ve, d as pn, v as mn, e as gn, f as x, g as le, s as vn, h as yn, j as Ie, k as H, l as gt, m as Y, o as bn, q as Tn, u as te, w as ue, x as I, y as ne, z as Vn, A as An, B as vt, C as Ne, D as Sn, E as wn, F as Pn, G as D, H as yt, I as bt, J as Tt, K as je, L as Vt, M as xn, N as Cn, O as Mn, P as ze, Q as Fn, R as On, S as Rn, T as Dn, U as In, V as Nn, W as Kn, X as En, Y as Bn, Z as Ln, _ as kn } from "./index-Bqq_Hib9.js";
3
3
  import { Fragment as _n } from "react";
4
4
  var ae = typeof globalThis < "u" && globalThis.process ? globalThis.process : { env: { NODE_ENV: "production" } };
5
5
  function At(t, e) {
package/dist/index.d.ts CHANGED
@@ -55,6 +55,16 @@ declare type CreditInfoClassNames = {
55
55
  descriptionLink?: string;
56
56
  };
57
57
 
58
+ declare type DistinctPropertyOption = {
59
+ hex?: Maybe<Scalars['String']['output']>;
60
+ indexable: Scalars['Boolean']['output'];
61
+ key: Scalars['String']['output'];
62
+ label: Scalars['String']['output'];
63
+ name?: Maybe<Scalars['String']['output']>;
64
+ slug: Scalars['String']['output'];
65
+ value?: Maybe<Scalars['Value']['output']>;
66
+ };
67
+
58
68
  /**
59
69
  * ClassNames for styling the `ElementsRoot` component
60
70
  */
@@ -185,35 +195,6 @@ declare type FilterValue = {
185
195
  value: string | string[];
186
196
  };
187
197
 
188
- /**
189
- * ClassNames for styling the `FooterInfo` component within `PropositionCard`
190
- */
191
- export declare type FooterInfoClassNames = {
192
- /** Wrapper container for the footer info section */
193
- base?: string;
194
- /** tcoPerMonth/average price text
195
- * @example "gem. 10,- /mnd" */
196
- averagePrice?: string;
197
- /** Device discount text
198
- * @example "100,- toestelkorting" */
199
- deviceDiscount?: string;
200
- };
201
-
202
- export declare type FooterInfoProps = {
203
- /** Device discount text
204
- * @example "100,- toestelkorting" */
205
- deviceDiscount?: string;
206
- /** Average total cost per month text
207
- * @example "gem. 10,- /mnd" */
208
- tcoPerMonth?: string;
209
- /** Class slots for styling */
210
- classNames?: FooterInfoClassNames;
211
- /** Whether the PropositionCard is horizontal */
212
- horizontal?: boolean;
213
- /** Whether the footer info is for a proposition with a product */
214
- hasProduct?: boolean;
215
- };
216
-
217
198
  declare type GetPageByPathQuery = {
218
199
  __typename?: 'RootQueryType';
219
200
  page?: {
@@ -261,6 +242,8 @@ declare type ListBoxClassNames = {
261
242
  selectedIcon?: string;
262
243
  };
263
244
 
245
+ declare type Maybe<T> = T | null;
246
+
264
247
  declare type ModalClassNames = {
265
248
  /** The backdrop slot, it is displayed behind the modal */
266
249
  backdrop?: string;
@@ -282,6 +265,59 @@ declare type ModalClassNames = {
282
265
  primaryButton?: string;
283
266
  };
284
267
 
268
+ declare type ModalClassNames_2 = {
269
+ /** The backdrop slot, it is displayed behind the modal */
270
+ backdrop?: string;
271
+ /** The wrapper slot of the modal. It wraps the base and the backdrop slots */
272
+ wrapper?: string;
273
+ /** The main slot of the modal content */
274
+ base?: string;
275
+ /** The header of the modal, it is displayed at the top of the modal */
276
+ header?: string;
277
+ /** The body of the modal, it is displayed in the middle of the modal */
278
+ body?: string;
279
+ /** The footer of the modal, it is displayed at the bottom of the modal */
280
+ footer?: string;
281
+ /** The close button (X) of the modal in top-right corner */
282
+ closeButton?: string;
283
+ };
284
+
285
+ declare type PhoneListContainerClassNames = {
286
+ base?: string;
287
+ wrapper?: string;
288
+ title?: string;
289
+ description?: string;
290
+ selectedIcon?: string;
291
+ item?: string;
292
+ itemWrapper?: string;
293
+ itemContent?: string;
294
+ itemLabel?: string;
295
+ itemDescription?: string;
296
+ emptyContent?: string;
297
+ };
298
+
299
+ export declare function PhoneSelector({ onChange, classNames, disabled, productSlug: initialProductSlug, selectedDistinctProperties: initialSelectedDistinctProperties, }: PhoneSelectorProps): JSX.Element;
300
+
301
+ declare type PhoneSelectorClassNames = {
302
+ base?: string;
303
+ button?: string;
304
+ /** Filter modal class styling slots - see type `ModalClassNames` */
305
+ modal?: ModalClassNames;
306
+ brandTabs?: string;
307
+ phoneList?: PhoneListContainerClassNames;
308
+ variantList?: string;
309
+ confirmButton?: string;
310
+ };
311
+
312
+ declare type PhoneSelectorProps = {
313
+ onChange?: (productSlug: string, distinctProperties: VersionDistinctProperty[]) => void;
314
+ classNames?: PhoneSelectorClassNames;
315
+ disabled?: boolean;
316
+ placeholder?: string;
317
+ productSlug?: string;
318
+ selectedDistinctProperties?: VersionDistinctProperty[];
319
+ };
320
+
285
321
  declare type PopoverContentClassNames = {
286
322
  base?: string;
287
323
  trigger?: string;
@@ -304,6 +340,80 @@ declare type PostcodeCheckLoadingClassNames = {
304
340
  addressText?: string;
305
341
  };
306
342
 
343
+ export declare type PostcodeCheckModalClassNames = {
344
+ /** Modal dialog class styling slots - see type `ModalClassNames` */
345
+ modal?: ModalClassNames_2;
346
+ /** Header section containing icon and title */
347
+ header?: {
348
+ /** Container wrapping the header content */
349
+ container?: string;
350
+ /** Icon wrapper with background */
351
+ iconWrapper?: string;
352
+ /** Home location icon */
353
+ icon?: string;
354
+ /** Main title text */
355
+ title?: string;
356
+ /** Description text below title */
357
+ description?: string;
358
+ };
359
+ /** Form section for address input */
360
+ form?: {
361
+ /** Form element container */
362
+ container?: string;
363
+ /** Address section label */
364
+ addressLabel?: string;
365
+ /** Container for postcode, number, and numberAddon inputs */
366
+ inputsContainer?: string;
367
+ /** Input field styling slots */
368
+ input?: {
369
+ /** Input wrapper styling */
370
+ inputWrapper?: string;
371
+ /** Input element styling */
372
+ input?: string;
373
+ /** Input label styling */
374
+ label?: string;
375
+ };
376
+ /** Error message container */
377
+ error?: {
378
+ /** Error container wrapper */
379
+ container?: string;
380
+ /** Error text styling */
381
+ text?: string;
382
+ };
383
+ };
384
+ /** Provider selection section */
385
+ provider?: {
386
+ /** Provider section label */
387
+ label?: string;
388
+ /** Select component styling */
389
+ select?: {
390
+ /** Select label styling */
391
+ label?: string;
392
+ /** Select trigger button styling */
393
+ trigger?: string;
394
+ /** Provider item container in select */
395
+ itemContainer?: string;
396
+ /** Provider icon styling */
397
+ icon?: string;
398
+ };
399
+ };
400
+ /** Submit button styling */
401
+ submitButton?: string;
402
+ };
403
+
404
+ export declare type PostcodeCheckModalProps = {
405
+ /** Whether the modal is open */
406
+ open: boolean;
407
+ /** Callback function to handle modal open state changes */
408
+ onOpenChange: (open: boolean) => void;
409
+ /** Class slots for styling */
410
+ classNames?: PostcodeCheckModalClassNames;
411
+ /** Callback function to handle profile changes */
412
+ onProfileChange?: (profile: Partial<Profile>) => void;
413
+ /** User profile */
414
+ profile: Profile;
415
+ };
416
+
307
417
  /**
308
418
  * ClassNames for styling the `PricingSection` component within `PropositionCard`
309
419
  */
@@ -324,25 +434,18 @@ export declare type PricingSectionClassNames = {
324
434
  /** Promotion text for monthly fee
325
435
  * @example "12 mnd van 10,- voor:" */
326
436
  promotionText?: string;
437
+ /** Average price container (TCO per month) */
438
+ averagePrice?: string;
327
439
  };
328
440
 
329
- export declare type PricingSectionProps = {
330
- /** Promotion text for monthly fee
331
- * @example "12 mnd van 10,- voor:" */
332
- monthlyFeePromotionText?: string;
333
- /** Monthly fee text
334
- * @example "10,-" */
335
- monthlyFee: string;
336
- /** Product price text (one-time payment - only visible for phone propositions)
337
- * @example "+ 100,- eenmalig" */
338
- productPrice?: string;
441
+ export declare type PricingSectionProps = Pick<PropositionCardProps, 'onInfoClick' | 'productPrice' | 'monthlyFee' | 'tcoPerMonth' | 'monthlyFeePromotionText'> & {
339
442
  /** Class slots for styling */
340
443
  classNames?: PricingSectionClassNames;
341
444
  };
342
445
 
343
- declare type ProductCategory = 'sim-only-proposition' | 'smartphone-proposition' | 'phone-and-subscription' | 'fixed-proposition';
446
+ declare type ProductCategory = 'sim-only-proposition' | 'fixed-proposition' | 'smartphone-proposition' | 'smartphone-proposition-extended';
344
447
 
345
- export declare function ProductResults({ productCategory, initialSelectedFilters, limit, propositionCardLayout, classNames, profile, onProfileChange, }: ProductResultsProps): JSX.Element;
448
+ export declare function ProductResults({ productCategory, initialSelectedFilters, limit, classNames, profile, onProfileChange, }: ProductResultsProps): JSX.Element;
346
449
 
347
450
  /**
348
451
  * ClassNames for styling different parts of the `ProductResults` component
@@ -372,17 +475,17 @@ export declare type ProductResultsClassNames = {
372
475
  propositionCard?: PropositionCardClassNames;
373
476
  /** PostcodeCheck loading card class styling slots (only for fixed propositions) - see type `PostcodeCheckLoadingClassNames` */
374
477
  postcodeCheckLoading?: PostcodeCheckLoadingClassNames;
478
+ /** Postcode check modal class styling slots - see type `PostcodeCheckModalClassNames` */
479
+ postcodeCheckModal?: PostcodeCheckModalClassNames;
375
480
  };
376
481
 
377
482
  export declare type ProductResultsProps = {
378
483
  /** Product type of the results */
379
- productCategory: ProductCategory;
484
+ productCategory: Exclude<ProductCategory, 'smartphone-proposition-extended'>;
380
485
  /** Initial selected filters */
381
486
  initialSelectedFilters?: FilterValue[];
382
487
  /** Limit the number of propositions to display */
383
488
  limit?: number;
384
- /** Layout of the proposition cards */
385
- propositionCardLayout?: 'vertical' | 'horizontal';
386
489
  /** Class slots for styling */
387
490
  classNames?: ProductResultsClassNames;
388
491
  /** User profile */
@@ -401,59 +504,18 @@ export declare type ProductSectionClassNames = {
401
504
  imageWrapper?: string;
402
505
  /** Product image element */
403
506
  image?: string;
404
- /** Product title text
405
- * @example "iPhone 17" */
406
- title?: string;
407
- /** Product subtitle/brand text
408
- * @example "Apple" */
409
- subtitle?: string;
410
- /** Stock status badge
411
- * @example "Op voorraad" */
412
- stockStatus?: string;
413
- /** Average review score text
414
- * @example "9.5" */
415
- reviewScore?: string;
416
- /** Amount of reviews text
417
- * @example "(100)" */
418
- reviewCount?: string;
419
- /** Product specifications list container
420
- * @example "6.3 inch • 256GB opslag • 5 kleuren" */
421
- specifications?: string;
422
- };
423
-
424
- export declare type ProductSectionProps = {
425
- /** Product title text
426
- * @example "iPhone 17" */
427
- title: string;
428
- /** Product subtitle/brand text
429
- * @example "Apple" */
430
- subtitle: string;
431
- /** Product image URL */
432
- imageUrl: string;
433
- /** Product image alt text */
434
- imageAlt: string;
435
- /** Product specifications */
436
- specifications?: {
437
- title: string;
438
- }[];
439
- /** Stock status
440
- * @example "Op voorraad" */
441
- stockStatus?: string;
442
- /** Amount of reviews
443
- * @example 100 */
444
- reviewCount?: number;
445
- /** Average review score
446
- * @example 9.5 */
447
- reviewScore?: number;
448
- /** Class slots for styling */
449
- classNames?: ProductSectionClassNames;
450
- horizontal?: boolean;
507
+ /** Delivery Text Icon " */
508
+ deliveryTextIcon?: string;
509
+ /** Delivery Text
510
+ * @example "Direct leverbaar" */
511
+ deliveryText?: string;
451
512
  };
452
513
 
453
514
  declare type Profile = z.infer<typeof profileSchema>;
454
515
 
455
516
  declare const profileSchema: z_2.ZodObject<{
456
517
  keepCurrentMsisdn: z_2.ZodOptional<z_2.ZodBoolean>;
518
+ currentMsisdn: z_2.ZodOptional<z_2.ZodString>;
457
519
  currentSubscriptionType: z_2.ZodOptional<z_2.ZodEnum<{
458
520
  subscription: "subscription";
459
521
  prepaid: "prepaid";
@@ -480,20 +542,16 @@ declare const profileSchema: z_2.ZodObject<{
480
542
  export declare type PromotionsListClassNames = {
481
543
  /** Wrapper container for the promotions list */
482
544
  base?: string;
483
- /** Individual special/modification promotion item
545
+ /** Individual promotion item
484
546
  * @example "€4,50 korting per maand" */
485
547
  item?: string;
486
- /** Checkmark icon for each special promotion item */
487
- specialPromotionIcon?: string;
488
- /** Checkmark icon for each modification promotion item */
489
- modificationPromotionIcon?: string;
548
+ /** Checkmark icon for each promotion item */
549
+ promotionIcon?: string;
490
550
  };
491
551
 
492
552
  export declare type PromotionsListProps = {
493
- /** Special promotions to display */
494
- specialPromotions: string[];
495
- /** Modification promotions to display */
496
- modificationPromotions: string[];
553
+ /** Promotions to display */
554
+ promotions: string[];
497
555
  /** Class slots for styling */
498
556
  classNames?: PromotionsListClassNames;
499
557
  };
@@ -510,15 +568,15 @@ export declare type PropositionCardClassNames = {
510
568
  header?: string;
511
569
  /** Card body wrapper around `specifications`, `urgentChip` and `promotionsList` */
512
570
  body?: string;
513
- /** Card footer wrapper around `deliveryText`, `pricingSection` and `button` */
571
+ /** Card footer wrapper around `pricingSection` and `button` */
514
572
  footer?: string;
515
- /** Image wrapper for main product or proposition image on Horizontal card
573
+ /** Image wrapper for proposition provider image (only on Horizontal card)
516
574
  *
517
- * It handles alignment, placement, and general appearance for the product image */
575
+ * It handles alignment, placement, and general appearance for the proposition provider image */
518
576
  imageWrapper?: string;
519
- /** Main product or proposition image on Horizontal card */
577
+ /** Proposition provider image (only on Horizontal card) */
520
578
  image?: string;
521
- /** Product section (only visible for phone propositions) class styling slots - see type `ProductSectionClassNames` */
579
+ /** Product section (only visible for smartphone propositions) class styling slots - see type `ProductSectionClassNames` */
522
580
  productSection?: ProductSectionClassNames;
523
581
  /** Proposition header class styling slots - see type `PropositionHeaderClassNames` */
524
582
  propositionHeader?: PropositionHeaderClassNames;
@@ -526,8 +584,6 @@ export declare type PropositionCardClassNames = {
526
584
  pricingSection?: PricingSectionClassNames;
527
585
  /** Promotions list class styling slots - see type `PromotionsListClassNames` */
528
586
  promotionsList?: PromotionsListClassNames;
529
- /** Footer info (tcoPerMonth/average price and device discount) class styling slots - see type `FooterInfoClassNames` */
530
- footerInfo?: FooterInfoClassNames;
531
587
  /** Specifications grid (only visible for sim only and fixed propositions)
532
588
  * @example
533
589
  * - "2 jaar"
@@ -538,15 +594,14 @@ export declare type PropositionCardClassNames = {
538
594
  /** Urgent text chip (only visible when promotion is urgent)
539
595
  * @example "Actie nog 6 dagen" */
540
596
  urgentChip?: string;
541
- /** Delivery promise text
542
- * @example "Voor 23:59 besteld, morgen in huis" */
543
- deliveryText?: string;
544
597
  /** Call To Action button
545
598
  * @example "Bekijk" */
546
599
  button?: string;
547
600
  };
548
601
 
549
602
  export declare type PropositionCardProps = {
603
+ /** Click handler to open the details modal */
604
+ onInfoClick: (tab: 'general' | 'conditions' | 'channels' | 'costs') => void;
550
605
  /** Whether the proposition is disabled */
551
606
  disabled?: boolean;
552
607
  /** Link to the proposition page */
@@ -561,19 +616,9 @@ export declare type PropositionCardProps = {
561
616
  productImageUrl?: string;
562
617
  /** Product image alt text */
563
618
  productImageAlt?: string;
564
- /** Product specifications */
565
- productSpecifications?: {
566
- title: string;
567
- }[];
568
619
  /** Product stock status
569
620
  * @example "in_stock" */
570
621
  productStockStatus?: string;
571
- /** Product review count
572
- * @example 100 */
573
- productReviewCount?: number;
574
- /** Product review score
575
- * @example 9.5 */
576
- productReviewScore?: number;
577
622
  /** Product price
578
623
  * @example "100,-" */
579
624
  productPrice?: string;
@@ -610,9 +655,6 @@ export declare type PropositionCardProps = {
610
655
  /** Device discount
611
656
  * @example "100,-" */
612
657
  deviceDiscount?: string;
613
- /** Delivery text
614
- * @example "Voor 23:59 besteld, morgen in huis" */
615
- deliveryText?: string | null;
616
658
  /** Urgent text for urgent special promotion
617
659
  * @example "Actie nog 6 dagen" */
618
660
  urgentText?: string;
@@ -627,9 +669,9 @@ export declare type PropositionCardProps = {
627
669
  export declare type PropositionHeaderClassNames = {
628
670
  /** Wrapper container for the proposition header */
629
671
  base?: string;
630
- /** Image wrapper, it handles alignment, placement, and general appearance for the proposition provider image */
672
+ /** Image wrapper, it handles alignment, placement, and general appearance for the proposition provider image (only on Vertical card) */
631
673
  imageWrapper?: string;
632
- /** Proposition provider image element*/
674
+ /** Proposition provider image element (only on Vertical card) */
633
675
  image?: string;
634
676
  /** Proposition title text
635
677
  * @example "30 GB"
@@ -650,10 +692,10 @@ export declare type PropositionHeaderProps = {
650
692
  * @example "Onbp min / sms"
651
693
  * @example "Glasvezel" */
652
694
  subtitle: string;
653
- /** Proposition image URL */
654
- imageUrl: string;
655
- /** Proposition image alt text */
656
- imageAlt: string;
695
+ /** Proposition provider image URL */
696
+ imageUrl?: string;
697
+ /** Proposition provider image alt text */
698
+ imageAlt?: string;
657
699
  /** Whether the proposition has a product/phone */
658
700
  hasProduct: boolean;
659
701
  /** Class slots for styling */
@@ -741,6 +783,38 @@ declare type ResultsNotFoundClassNames = {
741
783
  };
742
784
  };
743
785
 
786
+ /** All built-in and custom scalars, mapped to their actual values */
787
+ declare type Scalars = {
788
+ ID: {
789
+ input: string;
790
+ output: string;
791
+ };
792
+ String: {
793
+ input: string;
794
+ output: string;
795
+ };
796
+ Boolean: {
797
+ input: boolean;
798
+ output: boolean;
799
+ };
800
+ Int: {
801
+ input: number;
802
+ output: number;
803
+ };
804
+ Float: {
805
+ input: number;
806
+ output: number;
807
+ };
808
+ Json: {
809
+ input: any;
810
+ output: any;
811
+ };
812
+ Value: {
813
+ input: any;
814
+ output: any;
815
+ };
816
+ };
817
+
744
818
  export declare function SelectFilter({ id, options, values, onChange, classNames, }: SelectFilterProps): JSX.Element;
745
819
 
746
820
  /**
@@ -876,4 +950,11 @@ declare type SortSelectClassNames = {
876
950
  endWrapper?: string;
877
951
  };
878
952
 
953
+ declare type VersionDistinctProperty = {
954
+ __typename?: 'VersionDistinctProperty';
955
+ key: Scalars['String']['output'];
956
+ label: Scalars['String']['output'];
957
+ option: DistinctPropertyOption;
958
+ };
959
+
879
960
  export { }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mobielnl/elements",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Mobiel.nl Elements - React component library for partner websites",
5
5
  "private": false,
6
6
  "type": "module",
@@ -49,6 +49,8 @@
49
49
  "@graphql-codegen/typescript-graphql-request": "^6.2.0",
50
50
  "@graphql-codegen/typescript-operations": "^4.4.0",
51
51
  "@heroui/alert": "^2.2.27",
52
+ "@heroui/avatar": "^2.2.22",
53
+ "@heroui/badge": "^2.2.17",
52
54
  "@heroui/button": "^2.2.27",
53
55
  "@heroui/card": "^2.2.25",
54
56
  "@heroui/checkbox": "^2.3.27",
@@ -57,13 +59,16 @@
57
59
  "@heroui/image": "^2.2.17",
58
60
  "@heroui/input": "^2.4.28",
59
61
  "@heroui/link": "^2.2.23",
62
+ "@heroui/listbox": "^2.3.26",
60
63
  "@heroui/modal": "^2.2.24",
61
64
  "@heroui/radio": "^2.3.27",
62
65
  "@heroui/scroll-shadow": "^2.3.18",
63
66
  "@heroui/select": "^2.4.28",
67
+ "@heroui/skeleton": "^2.2.17",
64
68
  "@heroui/slider": "^2.4.24",
65
69
  "@heroui/system": "^2.4.23",
66
70
  "@heroui/table": "^2.2.27",
71
+ "@heroui/tabs": "^2.2.24",
67
72
  "@heroui/theme": "^2.4.23",
68
73
  "@react-stately/flags": "^3.1.2",
69
74
  "@storybook/addon-a11y": "^9.1.2",
@@ -72,6 +77,7 @@
72
77
  "@tailwindcss/vite": "^4.1.11",
73
78
  "@types/jest": "^30.0.0",
74
79
  "@types/js-cookie": "^3.0.6",
80
+ "@types/lodash": "^4.17.20",
75
81
  "@types/node": "^22.13.1",
76
82
  "@types/postcss-prefix-selector": "^1.16.3",
77
83
  "@types/react": "^19.1.10",
@@ -82,9 +88,11 @@
82
88
  "graphql": "^16.11.0",
83
89
  "graphql-request": "^7.2.0",
84
90
  "js-cookie": "^3.0.5",
91
+ "lodash": "^4.17.21",
85
92
  "postcss-prefix-selector": "^2.1.1",
86
93
  "react": "^19.2.0",
87
94
  "react-dom": "^19.2.0",
95
+ "react-use": "^17.6.0",
88
96
  "remark-gfm": "^4.0.1",
89
97
  "storybook": "^9.1.2",
90
98
  "swr": "^2.3.2",