@salt-ds/lab 1.0.0-alpha.64 → 1.0.0-alpha.66

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 (105) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/css/salt-lab.css +111 -269
  3. package/dist-cjs/carousel/Carousel.css.js +1 -1
  4. package/dist-cjs/carousel/Carousel.js +30 -87
  5. package/dist-cjs/carousel/Carousel.js.map +1 -1
  6. package/dist-cjs/carousel/CarouselContext.js +62 -0
  7. package/dist-cjs/carousel/CarouselContext.js.map +1 -0
  8. package/dist-cjs/carousel/CarouselControls.css.js +6 -0
  9. package/dist-cjs/carousel/CarouselControls.css.js.map +1 -0
  10. package/dist-cjs/carousel/CarouselControls.js +122 -0
  11. package/dist-cjs/carousel/CarouselControls.js.map +1 -0
  12. package/dist-cjs/carousel/CarouselReducer.js +77 -0
  13. package/dist-cjs/carousel/CarouselReducer.js.map +1 -0
  14. package/dist-cjs/carousel/CarouselSlide.css.js +6 -0
  15. package/dist-cjs/carousel/CarouselSlide.css.js.map +1 -0
  16. package/dist-cjs/carousel/CarouselSlide.js +95 -45
  17. package/dist-cjs/carousel/CarouselSlide.js.map +1 -1
  18. package/dist-cjs/carousel/CarouselSlider.css.js +6 -0
  19. package/dist-cjs/carousel/CarouselSlider.css.js.map +1 -0
  20. package/dist-cjs/carousel/CarouselSlider.js +93 -0
  21. package/dist-cjs/carousel/CarouselSlider.js.map +1 -0
  22. package/dist-cjs/index.js +6 -6
  23. package/dist-es/carousel/Carousel.css.js +1 -1
  24. package/dist-es/carousel/Carousel.js +32 -89
  25. package/dist-es/carousel/Carousel.js.map +1 -1
  26. package/dist-es/carousel/CarouselContext.js +58 -0
  27. package/dist-es/carousel/CarouselContext.js.map +1 -0
  28. package/dist-es/carousel/CarouselControls.css.js +4 -0
  29. package/dist-es/carousel/CarouselControls.css.js.map +1 -0
  30. package/dist-es/carousel/CarouselControls.js +120 -0
  31. package/dist-es/carousel/CarouselControls.js.map +1 -0
  32. package/dist-es/carousel/CarouselReducer.js +75 -0
  33. package/dist-es/carousel/CarouselReducer.js.map +1 -0
  34. package/dist-es/carousel/CarouselSlide.css.js +4 -0
  35. package/dist-es/carousel/CarouselSlide.css.js.map +1 -0
  36. package/dist-es/carousel/CarouselSlide.js +96 -46
  37. package/dist-es/carousel/CarouselSlide.js.map +1 -1
  38. package/dist-es/carousel/CarouselSlider.css.js +4 -0
  39. package/dist-es/carousel/CarouselSlider.css.js.map +1 -0
  40. package/dist-es/carousel/CarouselSlider.js +91 -0
  41. package/dist-es/carousel/CarouselSlider.js.map +1 -0
  42. package/dist-es/index.js +3 -3
  43. package/dist-types/carousel/Carousel.d.ts +10 -23
  44. package/dist-types/carousel/CarouselContext.d.ts +11 -0
  45. package/dist-types/carousel/CarouselControls.d.ts +26 -0
  46. package/dist-types/carousel/CarouselReducer.d.ts +30 -0
  47. package/dist-types/carousel/CarouselSlide.d.ts +31 -8
  48. package/dist-types/carousel/CarouselSlider.d.ts +13 -0
  49. package/dist-types/carousel/index.d.ts +2 -0
  50. package/dist-types/index.d.ts +0 -1
  51. package/dist-types/utils/index.d.ts +1 -1
  52. package/package.json +2 -2
  53. package/dist-cjs/slider/RangeSlider.js +0 -182
  54. package/dist-cjs/slider/RangeSlider.js.map +0 -1
  55. package/dist-cjs/slider/Slider.js +0 -145
  56. package/dist-cjs/slider/Slider.js.map +0 -1
  57. package/dist-cjs/slider/internal/SliderThumb.css.js +0 -6
  58. package/dist-cjs/slider/internal/SliderThumb.css.js.map +0 -1
  59. package/dist-cjs/slider/internal/SliderThumb.js +0 -141
  60. package/dist-cjs/slider/internal/SliderThumb.js.map +0 -1
  61. package/dist-cjs/slider/internal/SliderTooltip.css.js +0 -6
  62. package/dist-cjs/slider/internal/SliderTooltip.css.js.map +0 -1
  63. package/dist-cjs/slider/internal/SliderTooltip.js +0 -58
  64. package/dist-cjs/slider/internal/SliderTooltip.js.map +0 -1
  65. package/dist-cjs/slider/internal/SliderTrack.css.js +0 -6
  66. package/dist-cjs/slider/internal/SliderTrack.css.js.map +0 -1
  67. package/dist-cjs/slider/internal/SliderTrack.js +0 -168
  68. package/dist-cjs/slider/internal/SliderTrack.js.map +0 -1
  69. package/dist-cjs/slider/internal/useRangeSliderThumb.js +0 -233
  70. package/dist-cjs/slider/internal/useRangeSliderThumb.js.map +0 -1
  71. package/dist-cjs/slider/internal/useSliderThumb.js +0 -162
  72. package/dist-cjs/slider/internal/useSliderThumb.js.map +0 -1
  73. package/dist-cjs/slider/internal/utils.js +0 -113
  74. package/dist-cjs/slider/internal/utils.js.map +0 -1
  75. package/dist-es/slider/RangeSlider.js +0 -180
  76. package/dist-es/slider/RangeSlider.js.map +0 -1
  77. package/dist-es/slider/Slider.js +0 -143
  78. package/dist-es/slider/Slider.js.map +0 -1
  79. package/dist-es/slider/internal/SliderThumb.css.js +0 -4
  80. package/dist-es/slider/internal/SliderThumb.css.js.map +0 -1
  81. package/dist-es/slider/internal/SliderThumb.js +0 -139
  82. package/dist-es/slider/internal/SliderThumb.js.map +0 -1
  83. package/dist-es/slider/internal/SliderTooltip.css.js +0 -4
  84. package/dist-es/slider/internal/SliderTooltip.css.js.map +0 -1
  85. package/dist-es/slider/internal/SliderTooltip.js +0 -56
  86. package/dist-es/slider/internal/SliderTooltip.js.map +0 -1
  87. package/dist-es/slider/internal/SliderTrack.css.js +0 -4
  88. package/dist-es/slider/internal/SliderTrack.css.js.map +0 -1
  89. package/dist-es/slider/internal/SliderTrack.js +0 -166
  90. package/dist-es/slider/internal/SliderTrack.js.map +0 -1
  91. package/dist-es/slider/internal/useRangeSliderThumb.js +0 -231
  92. package/dist-es/slider/internal/useRangeSliderThumb.js.map +0 -1
  93. package/dist-es/slider/internal/useSliderThumb.js +0 -160
  94. package/dist-es/slider/internal/useSliderThumb.js.map +0 -1
  95. package/dist-es/slider/internal/utils.js +0 -105
  96. package/dist-es/slider/internal/utils.js.map +0 -1
  97. package/dist-types/slider/RangeSlider.d.ts +0 -99
  98. package/dist-types/slider/Slider.d.ts +0 -100
  99. package/dist-types/slider/index.d.ts +0 -2
  100. package/dist-types/slider/internal/SliderThumb.d.ts +0 -28
  101. package/dist-types/slider/internal/SliderTooltip.d.ts +0 -6
  102. package/dist-types/slider/internal/SliderTrack.d.ts +0 -24
  103. package/dist-types/slider/internal/useRangeSliderThumb.d.ts +0 -30
  104. package/dist-types/slider/internal/useSliderThumb.d.ts +0 -28
  105. package/dist-types/slider/internal/utils.d.ts +0 -20
package/CHANGELOG.md CHANGED
@@ -1,5 +1,69 @@
1
1
  # @salt-ds/lab
2
2
 
3
+ ## 1.0.0-alpha.66
4
+
5
+ ### Minor Changes
6
+
7
+ - 799cf41: Updated `Carousel` component
8
+
9
+ - Renamed `initialIndex` to `defaultActiveSlideIndex`
10
+ - Added controlled `activeSlideIndex`
11
+ - Added `visibleSlides` to control how many slides can be visible at a time.
12
+ - Added `CarouselSlider` and extracted the controls to its own component, `CarouselControls` to improve composition.
13
+ - Added appearance in `CarouselSlide` to allow for border items.
14
+ - Added keyboard navigation.
15
+ - Removed usage of `DeckLayout`.
16
+
17
+ before:
18
+
19
+ ```tsx
20
+ <Carousel>
21
+ {items.map((item, index) => (
22
+ <CarouselSlide
23
+ key={index}
24
+ ButtonBar={<Button variant="cta">Learn more</Button>}
25
+ description="Lorem ipsum"
26
+ title="Carousel slide title"
27
+ />
28
+ ))}
29
+ </Carousel>
30
+ ```
31
+
32
+ after:
33
+
34
+ ```tsx
35
+ <Carousel>
36
+ <CarouselControls />
37
+ <CarouselSlider>
38
+ {items.map((slide) => (
39
+ <CarouselSlide
40
+ key={slide.title}
41
+ header={<H3>{slide.title}</H3>}
42
+ actions={<Link href="#">{slide.link}</Link>}
43
+ >
44
+ <Text>{slide.content}</Text>
45
+ </CarouselSlide>
46
+ ))}
47
+ </CarouselSlider>
48
+ </Carousel>
49
+ ```
50
+
51
+ ### Patch Changes
52
+
53
+ - Updated dependencies [851b2eb]
54
+ - @salt-ds/core@1.44.1
55
+
56
+ ## 1.0.0-alpha.65
57
+
58
+ ### Minor Changes
59
+
60
+ - 7fe2106: Removed `Slider` and `RangeSlider` from labs and promoted to core.
61
+
62
+ ### Patch Changes
63
+
64
+ - Updated dependencies [7fe2106]
65
+ - @salt-ds/core@1.44.0
66
+
3
67
  ## 1.0.0-alpha.64
4
68
 
5
69
  ### Minor Changes
@@ -10,6 +74,7 @@
10
74
  ### Patch Changes
11
75
 
12
76
  - 2bdfbfb: Fixed DateInput adornment size and spacing, to align with rest of form controls.
77
+ - 5725384: Fixed the focus visible behaviour of Slider and RangeSlider.
13
78
  - Updated dependencies [78eaee3]
14
79
  - Updated dependencies [20abfb6]
15
80
  - Updated dependencies [c59472d]
package/css/salt-lab.css CHANGED
@@ -252,27 +252,122 @@
252
252
  }
253
253
 
254
254
  /* src/carousel/Carousel.css */
255
- .saltGridLayout.saltCarousel {
256
- grid-template-columns: min-content auto min-content;
257
- grid-template-areas: "prev-button slider next-button" "dots dots dots";
255
+ .saltCarousel {
256
+ display: grid;
257
+ grid-row-gap: var(--salt-spacing-100);
258
+ grid-template-areas: "controls" "slider";
259
+ grid-template-rows: auto 1fr;
258
260
  }
259
- .saltCarousel.saltCarousel-compact {
260
- grid-template-areas: "slider slider slider" "prev-button dots next-button";
261
+ .saltCarousel.saltCarousel-bottom {
262
+ grid-template-areas: "slider" "controls";
263
+ grid-template-rows: 1fr auto;
261
264
  }
262
- .saltCarousel-prev-button {
263
- grid-area: prev-button;
264
- height: 100%;
265
+
266
+ /* src/carousel/CarouselControls.css */
267
+ .saltCarouselControls {
268
+ display: flex;
269
+ gap: var(--salt-spacing-100);
270
+ align-items: center;
271
+ grid-area: controls;
265
272
  }
266
- .saltCarousel-next-button {
267
- grid-area: next-button;
268
- height: 100%;
273
+ .saltCarouselControls-container {
274
+ display: flex;
275
+ flex-flow: wrap;
276
+ align-items: center;
277
+ gap: var(--salt-spacing-100);
278
+ justify-content: space-between;
279
+ }
280
+ .saltCarouselControls-container:last-child {
281
+ margin-left: auto;
282
+ }
283
+ .saltCarouselControls-container h2 {
284
+ margin: 0;
285
+ }
286
+ .saltCarouselControls-sr-only {
287
+ display: none;
288
+ }
289
+ .saltCarouselControls:focus-within .saltCarouselControls-sr-only {
290
+ display: block;
291
+ position: fixed;
292
+ top: 0;
293
+ left: 0;
294
+ transform: translate(-100%, -100%);
269
295
  }
270
- .saltCarousel-slider {
296
+
297
+ /* src/carousel/CarouselSlide.css */
298
+ .saltCarouselSlide {
299
+ scroll-snap-align: start;
300
+ display: flex;
301
+ flex-direction: column;
302
+ flex: 0 0 auto;
303
+ box-sizing: border-box;
304
+ width: var(--carousel-slide-width, 100%);
305
+ gap: var(--salt-spacing-200);
306
+ }
307
+ .saltCarouselSlide:focus-visible {
308
+ outline: var(--salt-focused-outline);
309
+ outline-offset: calc(0px - var(--salt-focused-outlineWidth));
310
+ }
311
+ .saltCarouselSlide-actions {
312
+ display: none;
313
+ }
314
+ .saltCarouselSlide-sr-only {
315
+ position: fixed;
316
+ top: 0;
317
+ left: 0;
318
+ transform: translate(-100%, -100%);
319
+ }
320
+ .saltCarouselSlide-actions.saltCarouselSlide-visible {
321
+ display: flex;
322
+ }
323
+ .saltCarouselSlide-container {
324
+ display: flex;
325
+ flex-direction: column;
326
+ box-sizing: border-box;
327
+ gap: var(--salt-spacing-200);
328
+ padding-left: var(--salt-spacing-25);
329
+ padding-bottom: var(--salt-spacing-25);
330
+ flex-grow: 1;
331
+ }
332
+ .saltCarouselSlide-content {
333
+ display: flex;
334
+ flex-direction: column;
335
+ flex-grow: 1;
336
+ gap: var(--salt-spacing-100);
337
+ }
338
+ .saltCarouselSlide-card {
339
+ padding: var(--salt-spacing-200);
340
+ padding-top: 0;
341
+ }
342
+ .saltCarouselSlide-content h2,
343
+ .saltCarouselSlide-content h3 {
344
+ margin: 0;
345
+ }
346
+ .saltCarouselSlide-bordered {
347
+ border: var(--salt-size-border) var(--salt-container-borderStyle) var(--salt-container-primary-borderColor);
348
+ border-radius: var(--salt-palette-corner, 0);
349
+ overflow: hidden;
350
+ }
351
+
352
+ /* src/carousel/CarouselSlider.css */
353
+ .saltCarouselSlider {
354
+ display: flex;
355
+ scroll-snap-type: x mandatory;
356
+ overflow-x: auto;
357
+ scroll-behavior: smooth;
358
+ width: 100%;
359
+ gap: var(--salt-spacing-100);
271
360
  grid-area: slider;
272
361
  }
273
- .saltCarousel-dots {
274
- grid-area: dots;
275
- justify-self: center;
362
+ @supports (scrollbar-width: none) {
363
+ .saltCarouselSlider {
364
+ scrollbar-width: none;
365
+ }
366
+ }
367
+ @supports not (scrollbar-width: none) {
368
+ .saltCarouselSlider::-webkit-scrollbar {
369
+ display: none;
370
+ }
276
371
  }
277
372
 
278
373
  /* src/cascading-menu/CascadingMenuItem.css */
@@ -4502,259 +4597,6 @@
4502
4597
  font-weight: 700;
4503
4598
  }
4504
4599
 
4505
- /* src/slider/internal/SliderThumb.css */
4506
- .saltSliderThumb {
4507
- align-items: center;
4508
- background: var(--salt-accent-borderColor);
4509
- cursor: var(--salt-selectable-cursor-hover);
4510
- display: flex;
4511
- height: var(--salt-size-selectable);
4512
- outline: none;
4513
- position: absolute;
4514
- top: calc(((var(--salt-size-selectable) - var(--salt-size-bar)) / 2) * -1);
4515
- transform: translateX(-50%);
4516
- width: var(--salt-size-border-strong);
4517
- }
4518
- .saltSliderThumb-disabled {
4519
- background: var(--salt-accent-borderColor-disabled);
4520
- pointer-events: none;
4521
- }
4522
- .saltSliderThumb-focusVisible {
4523
- outline-style: var(--salt-focused-outlineStyle);
4524
- outline-width: var(--salt-focused-outlineWidth);
4525
- outline-offset: var(--salt-focused-outlineOffset);
4526
- outline-color: var(--salt-focused-outlineColor);
4527
- }
4528
- .saltSliderThumb:active,
4529
- .saltSliderThumb-dragging {
4530
- cursor: var(--draggable-grab-cursor-active);
4531
- }
4532
- .saltSliderThumb-input {
4533
- border: 0;
4534
- appearance: none;
4535
- cursor: var(--salt-selectable-cursor-hover);
4536
- height: var(--salt-size-base);
4537
- left: var(--slider-progressPercentage);
4538
- margin: 0;
4539
- opacity: 0.0001;
4540
- overflow: hidden;
4541
- -webkit-appearance: none;
4542
- pointer-events: none;
4543
- width: var(--salt-size-base);
4544
- padding: 0;
4545
- position: absolute;
4546
- transform: translateX(-50%);
4547
- }
4548
- .saltSliderThumb-secondThumb {
4549
- z-index: 2;
4550
- }
4551
- .saltSliderThumb-accessibleText {
4552
- position: absolute;
4553
- height: 1px;
4554
- width: 1px;
4555
- padding: 0;
4556
- margin: -1px;
4557
- overflow: hidden;
4558
- clip: rect(0, 0, 0, 0);
4559
- white-space: nowrap;
4560
- border-width: 0;
4561
- }
4562
-
4563
- /* src/slider/internal/SliderTooltip.css */
4564
- .saltSliderTooltip {
4565
- background: var(--salt-container-primary-background);
4566
- border-color: var(--salt-container-primary-borderColor);
4567
- border-style: var(--saltTooltip-borderStyle, var(--salt-container-borderStyle));
4568
- border-width: var(--saltTooltip-borderWidth, var(--salt-size-border));
4569
- border-radius: var(--saltTooltip-borderRadius, var(--salt-palette-corner-weak, 0));
4570
- box-shadow: var(--saltTooltip-shadow, var(--salt-overlayable-shadow-popout));
4571
- bottom: 50%;
4572
- left: 50%;
4573
- padding: var(--salt-spacing-50) var(--salt-spacing-100);
4574
- position: absolute;
4575
- transform: translate(-50%, -50%);
4576
- text-align: var(--saltTooltip-textAlign, left);
4577
- user-select: none;
4578
- visibility: hidden;
4579
- z-index: var(--saltTooltip-zIndex, var(--salt-zIndex-flyover));
4580
- }
4581
- .saltSliderTooltip-visible,
4582
- .saltSliderTooltip:hover {
4583
- visibility: visible;
4584
- }
4585
- .saltSliderTooltip-arrow {
4586
- fill: var(--salt-container-primary-background);
4587
- height: var(--salt-size-icon);
4588
- left: 50%;
4589
- position: absolute;
4590
- pointer-events: none;
4591
- top: 100%;
4592
- transform: translateX(-50%);
4593
- stroke: var(--salt-container-primary-borderColor);
4594
- stroke-width: var(--salt-size-border);
4595
- width: var(--salt-size-icon);
4596
- }
4597
- .saltSliderTooltip-text {
4598
- white-space: nowrap;
4599
- }
4600
-
4601
- /* src/slider/internal/SliderTrack.css */
4602
- .saltSliderTrack {
4603
- --slider-track-background: var(--salt-track-borderColor);
4604
- --slider-track-fill: var(--salt-accent-borderColor);
4605
- --slider-progressPercentage: 0%;
4606
- --slider-tick-height: calc((var(--salt-size-selectable) - var(--salt-size-bar)) / 2);
4607
- --slider-progressPercentageStart: 0%;
4608
- --slider-progressPercentageEnd: 0%;
4609
- display: flex;
4610
- width: 100%;
4611
- }
4612
- .saltSliderTrack.saltSliderTrack-withMarks {
4613
- margin-bottom: calc(var(--salt-size-base) / 2);
4614
- }
4615
- .saltSliderTrack-disabled {
4616
- cursor: var(--salt-selectable-cursor-disabled);
4617
- }
4618
- .saltSliderTrack-container {
4619
- align-items: center;
4620
- display: flex;
4621
- flex-direction: row;
4622
- gap: var(--salt-spacing-100);
4623
- width: 100%;
4624
- }
4625
- .saltSliderTrack-wrapper {
4626
- align-items: center;
4627
- cursor: var(--salt-selectable-cursor-hover);
4628
- display: flex;
4629
- flex: 1;
4630
- height: var(--salt-size-selectable);
4631
- position: relative;
4632
- width: 100%;
4633
- }
4634
- .saltSliderTrack-disabled,
4635
- .saltSliderTrack-disabled .saltSliderTrack-wrapper {
4636
- cursor: var(--salt-selectable-cursor-disabled);
4637
- }
4638
- .saltSliderTrack-disabled .saltSliderTrack-wrapper {
4639
- pointer-events: none;
4640
- }
4641
- .saltSliderTrack-rail {
4642
- display: flex;
4643
- flex: 100%;
4644
- height: var(--salt-size-bar);
4645
- justify-content: space-between;
4646
- position: relative;
4647
- }
4648
- .saltSliderTrack-rail::before,
4649
- .saltSliderTrack-rail::after {
4650
- content: "";
4651
- display: block;
4652
- height: 100%;
4653
- }
4654
- .saltSliderTrack-rail::before {
4655
- background: var(--slider-track-fill);
4656
- border-top-left-radius: var(--salt-palette-corner-weaker);
4657
- border-bottom-left-radius: var(--salt-palette-corner-weaker);
4658
- width: calc(var(--slider-progressPercentage) - 1.5 * var(--salt-size-border-strong));
4659
- }
4660
- .saltSliderTrack-hasMinTick.saltSliderTrack-rail::before {
4661
- border-bottom-left-radius: unset;
4662
- }
4663
- .saltSliderTrack-rail::after {
4664
- background: var(--slider-track-background);
4665
- border-top-right-radius: var(--salt-palette-corner-weaker);
4666
- border-bottom-right-radius: var(--salt-palette-corner-weaker);
4667
- width: calc(100% - var(--slider-progressPercentage) - 1.5 * var(--salt-size-border-strong));
4668
- }
4669
- .saltSliderTrack-hasMaxTick.saltSliderTrack-rail::after {
4670
- border-bottom-right-radius: unset;
4671
- }
4672
- .saltSliderTrack-range .saltSliderTrack-rail::before {
4673
- background: var(--slider-track-background);
4674
- width: calc(var(--slider-progressPercentageStart) - (var(--salt-size-border-strong) * 1.5));
4675
- }
4676
- .saltSliderTrack-range .saltSliderTrack-rail::after {
4677
- background: var(--slider-track-background);
4678
- width: calc(100% - var(--slider-progressPercentageEnd) - (var(--salt-size-border-strong) * 1.5));
4679
- }
4680
- .saltSliderTrack-range .saltSliderTrack-rail .saltSliderTrack-fill {
4681
- background: var(--slider-track-fill);
4682
- height: 100%;
4683
- left: calc(var(--slider-progressPercentageStart) + 1.5 * var(--salt-size-border-strong));
4684
- position: absolute;
4685
- width: calc(var(--slider-progressPercentageEnd) - var(--slider-progressPercentageStart) - var(--salt-size-border-strong) * 3);
4686
- }
4687
- .saltSliderTrack-minLabel,
4688
- .saltSliderTrack-maxLabel {
4689
- user-select: none;
4690
- }
4691
- .saltSliderTrack-dragging,
4692
- .saltSliderTrack-dragging .saltSliderTrack-wrapper {
4693
- cursor: var(--salt-draggable-grab-cursor-active);
4694
- }
4695
- .saltSliderTrack-disabled {
4696
- --slider-track-fill: var(--salt-accent-borderColor-disabled);
4697
- --slider-track-background: var(--salt-track-borderColor-disabled);
4698
- }
4699
- .saltSliderTrack-ticks {
4700
- top: calc(var(--salt-size-bar) + var(--slider-tick-height));
4701
- position: absolute;
4702
- width: 100%;
4703
- }
4704
- .saltSliderTrack-tick {
4705
- background: var(--slider-track-background);
4706
- height: var(--slider-tick-height);
4707
- position: absolute;
4708
- transform: translate(-50%);
4709
- width: var(--salt-size-border-strong);
4710
- }
4711
- .saltSliderTrack-withTicks .saltSliderTrack-tickHidden {
4712
- visibility: hidden;
4713
- }
4714
- .saltSliderTrack-tickSelected {
4715
- background: var(--slider-track-fill);
4716
- }
4717
- .saltSliderTrack-tick:first-of-type {
4718
- transform: unset;
4719
- }
4720
- .saltSliderTrack-tick:last-of-type {
4721
- transform: translateX(-100%);
4722
- }
4723
- .saltSliderTrack-marks {
4724
- position: absolute;
4725
- user-select: none;
4726
- width: 100%;
4727
- }
4728
- .saltSliderTrack-markLabel {
4729
- color: var(--salt-content-secondary-foreground);
4730
- font-family: var(--salt-text-label-fontFamily);
4731
- font-weight: var(--salt-text-label-fontWeight);
4732
- font-size: var(--salt-text-label-fontSize);
4733
- line-height: var(--salt-text-label-lineHeight);
4734
- overflow: hidden;
4735
- position: absolute;
4736
- text-overflow: ellipsis;
4737
- transform: translateX(-50%);
4738
- top: calc(var(--slider-tick-height) + var(--salt-spacing-50));
4739
- white-space: nowrap;
4740
- }
4741
- .saltSliderTrack-constrainLabelPosition .saltSliderTrack-markLabel:first-of-type {
4742
- transform: translateX(0%);
4743
- }
4744
- .saltSliderTrack-constrainLabelPosition .saltSliderTrack-markLabel:last-of-type {
4745
- transform: translateX(-100%);
4746
- }
4747
- .saltFormField .saltSliderTrack.saltSliderTrack-withMark {
4748
- margin-bottom: 0;
4749
- }
4750
- .saltFormField .saltSliderTrack-container {
4751
- --saltFormField-label-width: 10%;
4752
- height: var(--salt-size-base);
4753
- }
4754
- .saltFormField .saltSliderTrack-markLabel {
4755
- top: calc((var(--salt-size-base) - var(--salt-size-bar)) / 2);
4756
- }
4757
-
4758
4600
  /* src/tabs/drag-drop/Draggable.css */
4759
4601
  .saltDraggable {
4760
4602
  background: transparent;
@@ -4850,4 +4692,4 @@
4850
4692
  margin: calc(var(--salt-size-unit) / 2) 0;
4851
4693
  }
4852
4694
 
4853
- /* src/0d86cd54-f468-4741-b120-7ef6ac6f9def.css */
4695
+ /* src/89b851ef-eba4-4203-af10-5eb7e5bfc25b.css */
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var css_248z = ".saltGridLayout.saltCarousel {\n grid-template-columns: min-content auto min-content;\n grid-template-areas: \"prev-button slider next-button\" \"dots dots dots\";\n}\n\n.saltCarousel.saltCarousel-compact {\n grid-template-areas: \"slider slider slider\" \"prev-button dots next-button\";\n}\n\n.saltCarousel-prev-button {\n grid-area: prev-button;\n height: 100%;\n}\n\n.saltCarousel-next-button {\n grid-area: next-button;\n height: 100%;\n}\n\n.saltCarousel-slider {\n grid-area: slider;\n}\n\n.saltCarousel-dots {\n grid-area: dots;\n justify-self: center;\n}\n";
3
+ var css_248z = ".saltCarousel {\n display: grid;\n grid-row-gap: var(--salt-spacing-100);\n grid-template-areas: \"controls\" \"slider\";\n grid-template-rows: auto 1fr;\n}\n\n.saltCarousel.saltCarousel-bottom {\n grid-template-areas: \"slider\" \"controls\";\n grid-template-rows: 1fr auto;\n}\n";
4
4
 
5
5
  module.exports = css_248z;
6
6
  //# sourceMappingURL=Carousel.css.js.map
@@ -1,24 +1,22 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
- var react = require('react');
5
4
  var core = require('@salt-ds/core');
6
5
  var styles = require('@salt-ds/styles');
7
6
  var window = require('@salt-ds/window');
8
7
  var clsx = require('clsx');
9
- var DeckLayout = require('../deck-layout/DeckLayout.js');
10
- var useSlideSelection = require('../utils/useSlideSelection.js');
8
+ var react = require('react');
11
9
  var Carousel$1 = require('./Carousel.css.js');
10
+ var CarouselContext = require('./CarouselContext.js');
12
11
 
13
12
  const withBaseName = core.makePrefixer("saltCarousel");
14
13
  const Carousel = react.forwardRef(
15
14
  function Carousel2({
16
- initialIndex,
17
- animation = "slide",
18
- carouselDescription,
15
+ defaultActiveSlideIndex = 0,
16
+ activeSlideIndex,
17
+ visibleSlides: visibleSlidesProp = 1,
19
18
  children,
20
- className,
21
- compact,
19
+ controlsPlacement = "top",
22
20
  id: idProp,
23
21
  ...rest
24
22
  }, ref) {
@@ -28,88 +26,33 @@ const Carousel = react.forwardRef(
28
26
  css: Carousel$1,
29
27
  window: targetWindow
30
28
  });
31
- const { NextIcon, PreviousIcon } = core.useIcon();
29
+ const { matchedBreakpoints } = core.useBreakpoint();
30
+ const visibleSlides = core.resolveResponsiveValue(
31
+ visibleSlidesProp,
32
+ matchedBreakpoints
33
+ );
32
34
  const id = core.useId(idProp);
33
- const slidesCount = react.Children.count(children);
34
- const [_, selectedSlide, handleSlideSelection] = useSlideSelection.useSlideSelection(initialIndex);
35
- const moveSlide = (direction) => {
36
- const moveLeft = selectedSlide === 0 ? slidesCount - 1 : selectedSlide - 1;
37
- const moveRight = selectedSlide === slidesCount - 1 ? 0 : selectedSlide + 1;
38
- const newSelection = direction === "left" ? moveLeft : moveRight;
39
- const newTransition = direction === "left" ? "decrease" : "increase";
40
- handleSlideSelection(newSelection, newTransition);
41
- };
42
- const handleRadioChange = ({
43
- target: { value }
44
- }) => {
45
- handleSlideSelection(Number(value));
46
- };
47
- react.useEffect(() => {
48
- if (process.env.NODE_ENV !== "production") {
49
- if (slidesCount < 1) {
50
- console.warn(
51
- "Carousel component requires more than one children to render. At least two elements should be provided."
52
- );
53
- }
54
- }
55
- }, [slidesCount]);
56
- return /* @__PURE__ */ jsxRuntime.jsxs(
57
- core.GridLayout,
35
+ return /* @__PURE__ */ jsxRuntime.jsx(
36
+ CarouselContext.CarouselProvider,
58
37
  {
59
- "aria-label": carouselDescription,
60
- "aria-roledescription": "carousel",
38
+ defaultActiveSlideIndex,
39
+ activeSlideIndex,
40
+ visibleSlides,
61
41
  id,
62
- role: "region",
63
- ref,
64
- gap: 0,
65
- columns: 3,
66
- className: clsx.clsx(
67
- withBaseName(),
68
- compact && withBaseName("compact"),
69
- className
70
- ),
71
- ...rest,
72
- children: [
73
- /* @__PURE__ */ jsxRuntime.jsx(
74
- core.Button,
75
- {
76
- variant: "secondary",
77
- className: withBaseName("prev-button"),
78
- onClick: () => moveSlide("left"),
79
- children: /* @__PURE__ */ jsxRuntime.jsx(PreviousIcon, { size: 2 })
80
- }
81
- ),
82
- /* @__PURE__ */ jsxRuntime.jsx(
83
- DeckLayout.DeckLayout,
84
- {
85
- activeIndex: selectedSlide,
86
- animation,
87
- className: withBaseName("slider"),
88
- children
89
- }
90
- ),
91
- /* @__PURE__ */ jsxRuntime.jsx(
92
- core.Button,
93
- {
94
- variant: "secondary",
95
- className: withBaseName("next-button"),
96
- onClick: () => moveSlide("right"),
97
- children: /* @__PURE__ */ jsxRuntime.jsx(NextIcon, { size: 2 })
98
- }
99
- ),
100
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: withBaseName("dots"), children: /* @__PURE__ */ jsxRuntime.jsx(
101
- core.RadioButtonGroup,
102
- {
103
- "aria-label": "Carousel buttons",
104
- onChange: handleRadioChange,
105
- value: `${selectedSlide}`,
106
- direction: "horizontal",
107
- children: Array.from({ length: slidesCount }, (_2, index) => ({
108
- value: `${index}`
109
- })).map((radio) => /* @__PURE__ */ react.createElement(core.RadioButton, { ...radio, key: radio.value }))
110
- }
111
- ) })
112
- ]
42
+ children: /* @__PURE__ */ jsxRuntime.jsx(
43
+ "section",
44
+ {
45
+ role: "region",
46
+ className: clsx.clsx(withBaseName(), {
47
+ [withBaseName(controlsPlacement)]: controlsPlacement === "bottom"
48
+ }),
49
+ "aria-roledescription": "carousel",
50
+ id,
51
+ ref,
52
+ ...rest,
53
+ children
54
+ }
55
+ )
113
56
  }
114
57
  );
115
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Carousel.js","sources":["../src/carousel/Carousel.tsx"],"sourcesContent":["import {\n Button,\n GridLayout,\n RadioButton,\n RadioButtonGroup,\n makePrefixer,\n useIcon,\n useId,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ChangeEventHandler,\n Children,\n type HTMLAttributes,\n type ReactElement,\n forwardRef,\n useEffect,\n} from \"react\";\nimport { DeckLayout } from \"../deck-layout\";\nimport { useSlideSelection } from \"../utils\";\nimport type { CarouselSlideProps } from \"./CarouselSlide\";\n\nimport carouselCss from \"./Carousel.css\";\n\nconst withBaseName = makePrefixer(\"saltCarousel\");\n\nexport interface CarouselProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * The initial Index enables you to select the active slide in the carousel.\n * Optional, default 0.\n **/\n initialIndex?: number;\n /**\n * The animation when the slides are shown.\n * Optional. Defaults to `slide`\n **/\n animation?: \"slide\" | \"fade\";\n /**\n * If this props is passed it will set the aria-label with value to the carousel container.\n * Optional. Defaults to undefined\n */\n carouselDescription?: string;\n /**\n * Collection of slides to render\n * Component must implement CarouselSlideProps. Mandatory.\n */\n children: Array<ReactElement<CarouselSlideProps>>;\n /**\n * This prop will enable compact / reduced width mode.\n * The navigation buttons would be part of indicators\n * Optional. Defaults to false\n **/\n compact?: boolean;\n /**\n * It sets the id for the Carousel Container.\n * String. Optional\n */\n id?: string;\n}\n\nexport const Carousel = forwardRef<HTMLDivElement, CarouselProps>(\n function Carousel(\n {\n initialIndex,\n animation = \"slide\",\n carouselDescription,\n children,\n className,\n compact,\n id: idProp,\n ...rest\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-carousel\",\n css: carouselCss,\n window: targetWindow,\n });\n const { NextIcon, PreviousIcon } = useIcon();\n const id = useId(idProp);\n const slidesCount = Children.count(children);\n\n const [_, selectedSlide, handleSlideSelection] =\n useSlideSelection(initialIndex);\n\n const moveSlide = (direction: \"left\" | \"right\") => {\n const moveLeft =\n selectedSlide === 0 ? slidesCount - 1 : selectedSlide - 1;\n const moveRight =\n selectedSlide === slidesCount - 1 ? 0 : selectedSlide + 1;\n const newSelection = direction === \"left\" ? moveLeft : moveRight;\n const newTransition = direction === \"left\" ? \"decrease\" : \"increase\";\n handleSlideSelection(newSelection, newTransition);\n };\n\n const handleRadioChange: ChangeEventHandler<HTMLInputElement> = ({\n target: { value },\n }) => {\n handleSlideSelection(Number(value));\n };\n\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\") {\n if (slidesCount < 1) {\n console.warn(\n \"Carousel component requires more than one children to render. At least two elements should be provided.\",\n );\n }\n }\n }, [slidesCount]);\n\n return (\n <GridLayout\n aria-label={carouselDescription}\n aria-roledescription=\"carousel\"\n id={id}\n role=\"region\"\n ref={ref}\n gap={0}\n columns={3}\n className={clsx(\n withBaseName(),\n compact && withBaseName(\"compact\"),\n className,\n )}\n {...rest}\n >\n <Button\n variant=\"secondary\"\n className={withBaseName(\"prev-button\")}\n onClick={() => moveSlide(\"left\")}\n >\n <PreviousIcon size={2} />\n </Button>\n <DeckLayout\n activeIndex={selectedSlide}\n animation={animation}\n className={withBaseName(\"slider\")}\n >\n {children}\n </DeckLayout>\n <Button\n variant=\"secondary\"\n className={withBaseName(\"next-button\")}\n onClick={() => moveSlide(\"right\")}\n >\n <NextIcon size={2} />\n </Button>\n <div className={withBaseName(\"dots\")}>\n <RadioButtonGroup\n aria-label=\"Carousel buttons\"\n onChange={handleRadioChange}\n value={`${selectedSlide}`}\n direction={\"horizontal\"}\n >\n {Array.from({ length: slidesCount }, (_, index) => ({\n value: `${index}`,\n })).map((radio) => (\n <RadioButton {...radio} key={radio.value} />\n ))}\n </RadioButtonGroup>\n </div>\n </GridLayout>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","Carousel","useWindow","useComponentCssInjection","carouselCss","useIcon","useId","Children","useSlideSelection","useEffect","jsxs","GridLayout","clsx","jsx","Button","DeckLayout","RadioButtonGroup","_","createElement","RadioButton"],"mappings":"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"}
1
+ {"version":3,"file":"Carousel.js","sources":["../src/carousel/Carousel.tsx"],"sourcesContent":["import {\n type ResponsiveProp,\n makePrefixer,\n resolveResponsiveValue,\n useBreakpoint,\n useId,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type HTMLAttributes, forwardRef } from \"react\";\nimport carouselCss from \"./Carousel.css\";\nimport { CarouselProvider } from \"./CarouselContext\";\n\nconst withBaseName = makePrefixer(\"saltCarousel\");\n\nexport interface CarouselProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * The initial Index enables you to select the active slide in the carousel.\n * Optional, default 0.\n **/\n defaultActiveSlideIndex?: number;\n /**\n * Controlled index of active slide in the carousel.\n **/\n activeSlideIndex?: number;\n /**\n * Set the placement of the CarouselControls relative to the CarouselSlider element. Defaults to `top`.\n */\n controlsPlacement?: \"top\" | \"bottom\";\n /**\n * Number of slides visible at a time.\n * Optional, default 1.\n **/\n visibleSlides?: ResponsiveProp<number>;\n}\n\nexport const Carousel = forwardRef<HTMLDivElement, CarouselProps>(\n function Carousel(\n {\n defaultActiveSlideIndex = 0,\n activeSlideIndex,\n visibleSlides: visibleSlidesProp = 1,\n children,\n controlsPlacement = \"top\",\n id: idProp,\n ...rest\n },\n ref,\n ) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-carousel\",\n css: carouselCss,\n window: targetWindow,\n });\n const { matchedBreakpoints } = useBreakpoint();\n\n const visibleSlides = resolveResponsiveValue(\n visibleSlidesProp,\n matchedBreakpoints,\n );\n const id = useId(idProp);\n return (\n <CarouselProvider\n defaultActiveSlideIndex={defaultActiveSlideIndex}\n activeSlideIndex={activeSlideIndex}\n visibleSlides={visibleSlides}\n id={id}\n >\n <section\n role=\"region\"\n className={clsx(withBaseName(), {\n [withBaseName(controlsPlacement)]: controlsPlacement === \"bottom\",\n })}\n aria-roledescription=\"carousel\"\n id={id}\n ref={ref}\n {...rest}\n >\n {children}\n </section>\n </CarouselProvider>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","Carousel","useWindow","useComponentCssInjection","carouselCss","useBreakpoint","resolveResponsiveValue","useId","jsx","CarouselProvider","clsx"],"mappings":";;;;;;;;;;;AAcA,MAAM,YAAA,GAAeA,kBAAa,cAAc,CAAA;AAuBzC,MAAM,QAAW,GAAAC,gBAAA;AAAA,EACtB,SAASC,SACP,CAAA;AAAA,IACE,uBAA0B,GAAA,CAAA;AAAA,IAC1B,gBAAA;AAAA,IACA,eAAe,iBAAoB,GAAA,CAAA;AAAA,IACnC,QAAA;AAAA,IACA,iBAAoB,GAAA,KAAA;AAAA,IACpB,EAAI,EAAA,MAAA;AAAA,IACJ,GAAG;AAAA,KAEL,GACA,EAAA;AACA,IAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,IAAyBC,+BAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,eAAA;AAAA,MACR,GAAK,EAAAC,UAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AACD,IAAM,MAAA,EAAE,kBAAmB,EAAA,GAAIC,kBAAc,EAAA;AAE7C,IAAA,MAAM,aAAgB,GAAAC,2BAAA;AAAA,MACpB,iBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAM,MAAA,EAAA,GAAKC,WAAM,MAAM,CAAA;AACvB,IACE,uBAAAC,cAAA;AAAA,MAACC,gCAAA;AAAA,MAAA;AAAA,QACC,uBAAA;AAAA,QACA,gBAAA;AAAA,QACA,aAAA;AAAA,QACA,EAAA;AAAA,QAEA,QAAA,kBAAAD,cAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,IAAK,EAAA,QAAA;AAAA,YACL,SAAA,EAAWE,SAAK,CAAA,YAAA,EAAgB,EAAA;AAAA,cAC9B,CAAC,YAAA,CAAa,iBAAiB,CAAC,GAAG,iBAAsB,KAAA;AAAA,aAC1D,CAAA;AAAA,YACD,sBAAqB,EAAA,UAAA;AAAA,YACrB,EAAA;AAAA,YACA,GAAA;AAAA,YACC,GAAG,IAAA;AAAA,YAEH;AAAA;AAAA;AACH;AAAA,KACF;AAAA;AAGN;;;;"}