@mobielnl/elements 0.3.1 → 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.
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
  */
@@ -63,13 +73,27 @@ export declare type ElementsClassNames = {
63
73
  base?: string;
64
74
  };
65
75
 
66
- export declare function ElementsRoot({ children, classNames }: ElementsRootProps): JSX.Element;
76
+ export declare function ElementsRoot({ withShadowDOM, ...props }: ElementsRootProps): JSX.Element;
67
77
 
68
78
  export declare type ElementsRootProps = {
69
79
  /** The content to be rendered within the ElementsRoot component */
70
80
  children: ReactNode;
71
81
  /** Class slots for styling */
72
82
  classNames?: ElementsClassNames;
83
+ /**
84
+ * Enable Shadow DOM wrapping for complete style isolation
85
+ * - When `undefinded` or `false`, no Shadow DOM is applied
86
+ * - When `true`, wraps content in Shadow DOM without injecting CSS
87
+ * - When an object is provided, allows injecting CSS via `css` string or `cssUrl` path
88
+ *
89
+ * @example withShadowDOM={true}
90
+ * @example withShadowDOM={{ css: 'body { font-family: Arial, sans-serif; }' }}
91
+ * @example withShadowDOM={{ cssUrl: '/path/to/elements.css' }}
92
+ */
93
+ withShadowDOM?: boolean | {
94
+ css?: string;
95
+ cssUrl?: string;
96
+ };
73
97
  };
74
98
 
75
99
  export declare function FilterChip({ filter, filterOption, onRemove, classNames, }: FilterChipProps): JSX.Element | null;
@@ -171,35 +195,6 @@ declare type FilterValue = {
171
195
  value: string | string[];
172
196
  };
173
197
 
174
- /**
175
- * ClassNames for styling the `FooterInfo` component within `PropositionCard`
176
- */
177
- export declare type FooterInfoClassNames = {
178
- /** Wrapper container for the footer info section */
179
- base?: string;
180
- /** tcoPerMonth/average price text
181
- * @example "gem. 10,- /mnd" */
182
- averagePrice?: string;
183
- /** Device discount text
184
- * @example "100,- toestelkorting" */
185
- deviceDiscount?: string;
186
- };
187
-
188
- export declare type FooterInfoProps = {
189
- /** Device discount text
190
- * @example "100,- toestelkorting" */
191
- deviceDiscount?: string;
192
- /** Average total cost per month text
193
- * @example "gem. 10,- /mnd" */
194
- tcoPerMonth?: string;
195
- /** Class slots for styling */
196
- classNames?: FooterInfoClassNames;
197
- /** Whether the PropositionCard is horizontal */
198
- horizontal?: boolean;
199
- /** Whether the footer info is for a proposition with a product */
200
- hasProduct?: boolean;
201
- };
202
-
203
198
  declare type GetPageByPathQuery = {
204
199
  __typename?: 'RootQueryType';
205
200
  page?: {
@@ -247,6 +242,8 @@ declare type ListBoxClassNames = {
247
242
  selectedIcon?: string;
248
243
  };
249
244
 
245
+ declare type Maybe<T> = T | null;
246
+
250
247
  declare type ModalClassNames = {
251
248
  /** The backdrop slot, it is displayed behind the modal */
252
249
  backdrop?: string;
@@ -268,6 +265,59 @@ declare type ModalClassNames = {
268
265
  primaryButton?: string;
269
266
  };
270
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
+
271
321
  declare type PopoverContentClassNames = {
272
322
  base?: string;
273
323
  trigger?: string;
@@ -290,6 +340,80 @@ declare type PostcodeCheckLoadingClassNames = {
290
340
  addressText?: string;
291
341
  };
292
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
+
293
417
  /**
294
418
  * ClassNames for styling the `PricingSection` component within `PropositionCard`
295
419
  */
@@ -310,25 +434,18 @@ export declare type PricingSectionClassNames = {
310
434
  /** Promotion text for monthly fee
311
435
  * @example "12 mnd van 10,- voor:" */
312
436
  promotionText?: string;
437
+ /** Average price container (TCO per month) */
438
+ averagePrice?: string;
313
439
  };
314
440
 
315
- export declare type PricingSectionProps = {
316
- /** Promotion text for monthly fee
317
- * @example "12 mnd van 10,- voor:" */
318
- monthlyFeePromotionText?: string;
319
- /** Monthly fee text
320
- * @example "10,-" */
321
- monthlyFee: string;
322
- /** Product price text (one-time payment - only visible for phone propositions)
323
- * @example "+ 100,- eenmalig" */
324
- productPrice?: string;
441
+ export declare type PricingSectionProps = Pick<PropositionCardProps, 'onInfoClick' | 'productPrice' | 'monthlyFee' | 'tcoPerMonth' | 'monthlyFeePromotionText'> & {
325
442
  /** Class slots for styling */
326
443
  classNames?: PricingSectionClassNames;
327
444
  };
328
445
 
329
- 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';
330
447
 
331
- 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;
332
449
 
333
450
  /**
334
451
  * ClassNames for styling different parts of the `ProductResults` component
@@ -350,23 +467,25 @@ export declare type ProductResultsClassNames = {
350
467
  resultsGrid?: string;
351
468
  /** Credit info component class styling slots - see type `CreditInfoClassNames` */
352
469
  creditInfo?: CreditInfoClassNames;
470
+ /** Load more button */
471
+ loadMoreButton?: string;
353
472
  /** Results not found component class styling slots - see type `ResultsNotFoundClassNames` */
354
473
  resultsNotFound?: ResultsNotFoundClassNames;
355
474
  /** Proposition card class styling slots - see type `PropositionCardClassNames` */
356
475
  propositionCard?: PropositionCardClassNames;
357
476
  /** PostcodeCheck loading card class styling slots (only for fixed propositions) - see type `PostcodeCheckLoadingClassNames` */
358
477
  postcodeCheckLoading?: PostcodeCheckLoadingClassNames;
478
+ /** Postcode check modal class styling slots - see type `PostcodeCheckModalClassNames` */
479
+ postcodeCheckModal?: PostcodeCheckModalClassNames;
359
480
  };
360
481
 
361
482
  export declare type ProductResultsProps = {
362
483
  /** Product type of the results */
363
- productCategory: ProductCategory;
484
+ productCategory: Exclude<ProductCategory, 'smartphone-proposition-extended'>;
364
485
  /** Initial selected filters */
365
486
  initialSelectedFilters?: FilterValue[];
366
487
  /** Limit the number of propositions to display */
367
488
  limit?: number;
368
- /** Layout of the proposition cards */
369
- propositionCardLayout?: 'vertical' | 'horizontal';
370
489
  /** Class slots for styling */
371
490
  classNames?: ProductResultsClassNames;
372
491
  /** User profile */
@@ -385,59 +504,18 @@ export declare type ProductSectionClassNames = {
385
504
  imageWrapper?: string;
386
505
  /** Product image element */
387
506
  image?: string;
388
- /** Product title text
389
- * @example "iPhone 17" */
390
- title?: string;
391
- /** Product subtitle/brand text
392
- * @example "Apple" */
393
- subtitle?: string;
394
- /** Stock status badge
395
- * @example "Op voorraad" */
396
- stockStatus?: string;
397
- /** Average review score text
398
- * @example "9.5" */
399
- reviewScore?: string;
400
- /** Amount of reviews text
401
- * @example "(100)" */
402
- reviewCount?: string;
403
- /** Product specifications list container
404
- * @example "6.3 inch • 256GB opslag • 5 kleuren" */
405
- specifications?: string;
406
- };
407
-
408
- export declare type ProductSectionProps = {
409
- /** Product title text
410
- * @example "iPhone 17" */
411
- title: string;
412
- /** Product subtitle/brand text
413
- * @example "Apple" */
414
- subtitle: string;
415
- /** Product image URL */
416
- imageUrl: string;
417
- /** Product image alt text */
418
- imageAlt: string;
419
- /** Product specifications */
420
- specifications?: {
421
- title: string;
422
- }[];
423
- /** Stock status
424
- * @example "Op voorraad" */
425
- stockStatus?: string;
426
- /** Amount of reviews
427
- * @example 100 */
428
- reviewCount?: number;
429
- /** Average review score
430
- * @example 9.5 */
431
- reviewScore?: number;
432
- /** Class slots for styling */
433
- classNames?: ProductSectionClassNames;
434
- horizontal?: boolean;
507
+ /** Delivery Text Icon " */
508
+ deliveryTextIcon?: string;
509
+ /** Delivery Text
510
+ * @example "Direct leverbaar" */
511
+ deliveryText?: string;
435
512
  };
436
513
 
437
514
  declare type Profile = z.infer<typeof profileSchema>;
438
515
 
439
516
  declare const profileSchema: z_2.ZodObject<{
440
517
  keepCurrentMsisdn: z_2.ZodOptional<z_2.ZodBoolean>;
518
+ currentMsisdn: z_2.ZodOptional<z_2.ZodString>;
441
519
  currentSubscriptionType: z_2.ZodOptional<z_2.ZodEnum<{
442
520
  subscription: "subscription";
443
521
  prepaid: "prepaid";
@@ -464,20 +542,16 @@ declare const profileSchema: z_2.ZodObject<{
464
542
  export declare type PromotionsListClassNames = {
465
543
  /** Wrapper container for the promotions list */
466
544
  base?: string;
467
- /** Individual special/modification promotion item
545
+ /** Individual promotion item
468
546
  * @example "€4,50 korting per maand" */
469
547
  item?: string;
470
- /** Checkmark icon for each special promotion item */
471
- specialPromotionIcon?: string;
472
- /** Checkmark icon for each modification promotion item */
473
- modificationPromotionIcon?: string;
548
+ /** Checkmark icon for each promotion item */
549
+ promotionIcon?: string;
474
550
  };
475
551
 
476
552
  export declare type PromotionsListProps = {
477
- /** Special promotions to display */
478
- specialPromotions: string[];
479
- /** Modification promotions to display */
480
- modificationPromotions: string[];
553
+ /** Promotions to display */
554
+ promotions: string[];
481
555
  /** Class slots for styling */
482
556
  classNames?: PromotionsListClassNames;
483
557
  };
@@ -494,15 +568,15 @@ export declare type PropositionCardClassNames = {
494
568
  header?: string;
495
569
  /** Card body wrapper around `specifications`, `urgentChip` and `promotionsList` */
496
570
  body?: string;
497
- /** Card footer wrapper around `deliveryText`, `pricingSection` and `button` */
571
+ /** Card footer wrapper around `pricingSection` and `button` */
498
572
  footer?: string;
499
- /** Image wrapper for main product or proposition image on Horizontal card
573
+ /** Image wrapper for proposition provider image (only on Horizontal card)
500
574
  *
501
- * It handles alignment, placement, and general appearance for the product image */
575
+ * It handles alignment, placement, and general appearance for the proposition provider image */
502
576
  imageWrapper?: string;
503
- /** Main product or proposition image on Horizontal card */
577
+ /** Proposition provider image (only on Horizontal card) */
504
578
  image?: string;
505
- /** 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` */
506
580
  productSection?: ProductSectionClassNames;
507
581
  /** Proposition header class styling slots - see type `PropositionHeaderClassNames` */
508
582
  propositionHeader?: PropositionHeaderClassNames;
@@ -510,8 +584,6 @@ export declare type PropositionCardClassNames = {
510
584
  pricingSection?: PricingSectionClassNames;
511
585
  /** Promotions list class styling slots - see type `PromotionsListClassNames` */
512
586
  promotionsList?: PromotionsListClassNames;
513
- /** Footer info (tcoPerMonth/average price and device discount) class styling slots - see type `FooterInfoClassNames` */
514
- footerInfo?: FooterInfoClassNames;
515
587
  /** Specifications grid (only visible for sim only and fixed propositions)
516
588
  * @example
517
589
  * - "2 jaar"
@@ -522,15 +594,14 @@ export declare type PropositionCardClassNames = {
522
594
  /** Urgent text chip (only visible when promotion is urgent)
523
595
  * @example "Actie nog 6 dagen" */
524
596
  urgentChip?: string;
525
- /** Delivery promise text
526
- * @example "Voor 23:59 besteld, morgen in huis" */
527
- deliveryText?: string;
528
597
  /** Call To Action button
529
598
  * @example "Bekijk" */
530
599
  button?: string;
531
600
  };
532
601
 
533
602
  export declare type PropositionCardProps = {
603
+ /** Click handler to open the details modal */
604
+ onInfoClick: (tab: 'general' | 'conditions' | 'channels' | 'costs') => void;
534
605
  /** Whether the proposition is disabled */
535
606
  disabled?: boolean;
536
607
  /** Link to the proposition page */
@@ -545,19 +616,9 @@ export declare type PropositionCardProps = {
545
616
  productImageUrl?: string;
546
617
  /** Product image alt text */
547
618
  productImageAlt?: string;
548
- /** Product specifications */
549
- productSpecifications?: {
550
- title: string;
551
- }[];
552
619
  /** Product stock status
553
620
  * @example "in_stock" */
554
621
  productStockStatus?: string;
555
- /** Product review count
556
- * @example 100 */
557
- productReviewCount?: number;
558
- /** Product review score
559
- * @example 9.5 */
560
- productReviewScore?: number;
561
622
  /** Product price
562
623
  * @example "100,-" */
563
624
  productPrice?: string;
@@ -594,9 +655,6 @@ export declare type PropositionCardProps = {
594
655
  /** Device discount
595
656
  * @example "100,-" */
596
657
  deviceDiscount?: string;
597
- /** Delivery text
598
- * @example "Voor 23:59 besteld, morgen in huis" */
599
- deliveryText?: string | null;
600
658
  /** Urgent text for urgent special promotion
601
659
  * @example "Actie nog 6 dagen" */
602
660
  urgentText?: string;
@@ -611,9 +669,9 @@ export declare type PropositionCardProps = {
611
669
  export declare type PropositionHeaderClassNames = {
612
670
  /** Wrapper container for the proposition header */
613
671
  base?: string;
614
- /** 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) */
615
673
  imageWrapper?: string;
616
- /** Proposition provider image element*/
674
+ /** Proposition provider image element (only on Vertical card) */
617
675
  image?: string;
618
676
  /** Proposition title text
619
677
  * @example "30 GB"
@@ -634,10 +692,10 @@ export declare type PropositionHeaderProps = {
634
692
  * @example "Onbp min / sms"
635
693
  * @example "Glasvezel" */
636
694
  subtitle: string;
637
- /** Proposition image URL */
638
- imageUrl: string;
639
- /** Proposition image alt text */
640
- imageAlt: string;
695
+ /** Proposition provider image URL */
696
+ imageUrl?: string;
697
+ /** Proposition provider image alt text */
698
+ imageAlt?: string;
641
699
  /** Whether the proposition has a product/phone */
642
700
  hasProduct: boolean;
643
701
  /** Class slots for styling */
@@ -725,6 +783,38 @@ declare type ResultsNotFoundClassNames = {
725
783
  };
726
784
  };
727
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
+
728
818
  export declare function SelectFilter({ id, options, values, onChange, classNames, }: SelectFilterProps): JSX.Element;
729
819
 
730
820
  /**
@@ -860,4 +950,11 @@ declare type SortSelectClassNames = {
860
950
  endWrapper?: string;
861
951
  };
862
952
 
953
+ declare type VersionDistinctProperty = {
954
+ __typename?: 'VersionDistinctProperty';
955
+ key: Scalars['String']['output'];
956
+ label: Scalars['String']['output'];
957
+ option: DistinctPropertyOption;
958
+ };
959
+
863
960
  export { }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mobielnl/elements",
3
- "version": "0.3.1",
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",
@@ -38,8 +38,8 @@
38
38
  "node": ">=18"
39
39
  },
40
40
  "peerDependencies": {
41
- "react": ">=18",
42
- "react-dom": ">=18"
41
+ "react": ">=19",
42
+ "react-dom": ">=19"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@biomejs/biome": "2.1.4",
@@ -49,28 +49,35 @@
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/button": "^2.2.24",
53
- "@heroui/card": "^2.2.23",
54
- "@heroui/checkbox": "^2.3.24",
55
- "@heroui/chip": "^2.2.20",
56
- "@heroui/divider": "^2.2.17",
57
- "@heroui/image": "^2.2.15",
58
- "@heroui/input": "^2.4.25",
59
- "@heroui/link": "^2.2.22",
52
+ "@heroui/avatar": "^2.2.22",
53
+ "@heroui/badge": "^2.2.17",
54
+ "@heroui/button": "^2.2.27",
55
+ "@heroui/card": "^2.2.25",
56
+ "@heroui/checkbox": "^2.3.27",
57
+ "@heroui/chip": "^2.2.22",
58
+ "@heroui/divider": "^2.2.20",
59
+ "@heroui/image": "^2.2.17",
60
+ "@heroui/input": "^2.4.28",
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",
64
- "@heroui/slider": "^2.4.21",
65
- "@heroui/system": "^2.4.20",
67
+ "@heroui/skeleton": "^2.2.17",
68
+ "@heroui/slider": "^2.4.24",
69
+ "@heroui/system": "^2.4.23",
66
70
  "@heroui/table": "^2.2.27",
67
- "@heroui/theme": "^2.4.20",
71
+ "@heroui/tabs": "^2.2.24",
72
+ "@heroui/theme": "^2.4.23",
73
+ "@react-stately/flags": "^3.1.2",
68
74
  "@storybook/addon-a11y": "^9.1.2",
69
75
  "@storybook/addon-docs": "^9.1.2",
70
76
  "@storybook/react-vite": "^9.1.2",
71
77
  "@tailwindcss/vite": "^4.1.11",
72
78
  "@types/jest": "^30.0.0",
73
79
  "@types/js-cookie": "^3.0.6",
80
+ "@types/lodash": "^4.17.20",
74
81
  "@types/node": "^22.13.1",
75
82
  "@types/postcss-prefix-selector": "^1.16.3",
76
83
  "@types/react": "^19.1.10",
@@ -81,13 +88,15 @@
81
88
  "graphql": "^16.11.0",
82
89
  "graphql-request": "^7.2.0",
83
90
  "js-cookie": "^3.0.5",
91
+ "lodash": "^4.17.21",
84
92
  "postcss-prefix-selector": "^2.1.1",
85
- "react": "^18.3.1",
86
- "react-dom": "^18.3.1",
93
+ "react": "^19.2.0",
94
+ "react-dom": "^19.2.0",
95
+ "react-use": "^17.6.0",
87
96
  "remark-gfm": "^4.0.1",
88
97
  "storybook": "^9.1.2",
89
98
  "swr": "^2.3.2",
90
- "tailwindcss": "^4.1.11",
99
+ "tailwindcss": "^4.1.16",
91
100
  "typescript": "~5.8.3",
92
101
  "vite": "7.1.11",
93
102
  "vite-plugin-dts": "^4.5.0",