@salt-ds/core 1.42.0 → 1.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/CHANGELOG.md +120 -0
  2. package/css/salt-core.css +315 -30
  3. package/dist-cjs/border-layout/BorderLayout.js +1 -1
  4. package/dist-cjs/border-layout/BorderLayout.js.map +1 -1
  5. package/dist-cjs/button/Button.js +2 -2
  6. package/dist-cjs/button/Button.js.map +1 -1
  7. package/dist-cjs/combo-box/ComboBox.js +22 -20
  8. package/dist-cjs/combo-box/ComboBox.js.map +1 -1
  9. package/dist-cjs/dialog/DialogContent.css.js +1 -1
  10. package/dist-cjs/dialog/DialogContent.js +24 -4
  11. package/dist-cjs/dialog/DialogContent.js.map +1 -1
  12. package/dist-cjs/dialog/DialogHeader.css.js +1 -1
  13. package/dist-cjs/dialog/DialogHeader.js +15 -16
  14. package/dist-cjs/dialog/DialogHeader.js.map +1 -1
  15. package/dist-cjs/dropdown/Dropdown.css.js +1 -1
  16. package/dist-cjs/dropdown/Dropdown.js +3 -3
  17. package/dist-cjs/dropdown/Dropdown.js.map +1 -1
  18. package/dist-cjs/index.js +6 -0
  19. package/dist-cjs/index.js.map +1 -1
  20. package/dist-cjs/option/Option.js +5 -12
  21. package/dist-cjs/option/Option.js.map +1 -1
  22. package/dist-cjs/overlay/OverlayHeader.css.js +6 -0
  23. package/dist-cjs/overlay/OverlayHeader.css.js.map +1 -0
  24. package/dist-cjs/overlay/OverlayHeader.js +40 -0
  25. package/dist-cjs/overlay/OverlayHeader.js.map +1 -0
  26. package/dist-cjs/overlay/OverlayPanelCloseButton.css.js +1 -1
  27. package/dist-cjs/overlay/OverlayPanelContent.css.js +1 -1
  28. package/dist-cjs/overlay/OverlayPanelContent.js +26 -26
  29. package/dist-cjs/overlay/OverlayPanelContent.js.map +1 -1
  30. package/dist-cjs/pill-input/PillInput.css.js +1 -1
  31. package/dist-cjs/pill-input/PillInput.js +1 -0
  32. package/dist-cjs/pill-input/PillInput.js.map +1 -1
  33. package/dist-cjs/slider/RangeSlider.js +188 -0
  34. package/dist-cjs/slider/RangeSlider.js.map +1 -0
  35. package/dist-cjs/slider/Slider.js +151 -0
  36. package/dist-cjs/slider/Slider.js.map +1 -0
  37. package/dist-cjs/slider/internal/SliderThumb.css.js +6 -0
  38. package/dist-cjs/slider/internal/SliderThumb.css.js.map +1 -0
  39. package/dist-cjs/slider/internal/SliderThumb.js +141 -0
  40. package/dist-cjs/slider/internal/SliderThumb.js.map +1 -0
  41. package/dist-cjs/slider/internal/SliderTooltip.css.js +6 -0
  42. package/dist-cjs/slider/internal/SliderTooltip.css.js.map +1 -0
  43. package/dist-cjs/slider/internal/SliderTooltip.js +70 -0
  44. package/dist-cjs/slider/internal/SliderTooltip.js.map +1 -0
  45. package/dist-cjs/slider/internal/SliderTrack.css.js +6 -0
  46. package/dist-cjs/slider/internal/SliderTrack.css.js.map +1 -0
  47. package/dist-cjs/slider/internal/SliderTrack.js +179 -0
  48. package/dist-cjs/slider/internal/SliderTrack.js.map +1 -0
  49. package/dist-cjs/slider/internal/useRangeSliderThumb.js +234 -0
  50. package/dist-cjs/slider/internal/useRangeSliderThumb.js.map +1 -0
  51. package/dist-cjs/slider/internal/useSliderThumb.js +162 -0
  52. package/dist-cjs/slider/internal/useSliderThumb.js.map +1 -0
  53. package/dist-cjs/slider/internal/utils.js +127 -0
  54. package/dist-cjs/slider/internal/utils.js.map +1 -0
  55. package/dist-cjs/switch/Switch.js.map +1 -1
  56. package/dist-es/border-layout/BorderLayout.js +2 -2
  57. package/dist-es/border-layout/BorderLayout.js.map +1 -1
  58. package/dist-es/button/Button.js +2 -2
  59. package/dist-es/button/Button.js.map +1 -1
  60. package/dist-es/combo-box/ComboBox.js +23 -21
  61. package/dist-es/combo-box/ComboBox.js.map +1 -1
  62. package/dist-es/dialog/DialogContent.css.js +1 -1
  63. package/dist-es/dialog/DialogContent.js +24 -4
  64. package/dist-es/dialog/DialogContent.js.map +1 -1
  65. package/dist-es/dialog/DialogHeader.css.js +1 -1
  66. package/dist-es/dialog/DialogHeader.js +14 -15
  67. package/dist-es/dialog/DialogHeader.js.map +1 -1
  68. package/dist-es/dropdown/Dropdown.css.js +1 -1
  69. package/dist-es/dropdown/Dropdown.js +3 -3
  70. package/dist-es/dropdown/Dropdown.js.map +1 -1
  71. package/dist-es/index.js +3 -0
  72. package/dist-es/index.js.map +1 -1
  73. package/dist-es/option/Option.js +5 -12
  74. package/dist-es/option/Option.js.map +1 -1
  75. package/dist-es/overlay/OverlayHeader.css.js +4 -0
  76. package/dist-es/overlay/OverlayHeader.css.js.map +1 -0
  77. package/dist-es/overlay/OverlayHeader.js +38 -0
  78. package/dist-es/overlay/OverlayHeader.js.map +1 -0
  79. package/dist-es/overlay/OverlayPanelCloseButton.css.js +1 -1
  80. package/dist-es/overlay/OverlayPanelContent.css.js +1 -1
  81. package/dist-es/overlay/OverlayPanelContent.js +27 -27
  82. package/dist-es/overlay/OverlayPanelContent.js.map +1 -1
  83. package/dist-es/pill-input/PillInput.css.js +1 -1
  84. package/dist-es/pill-input/PillInput.js +1 -0
  85. package/dist-es/pill-input/PillInput.js.map +1 -1
  86. package/dist-es/slider/RangeSlider.js +186 -0
  87. package/dist-es/slider/RangeSlider.js.map +1 -0
  88. package/dist-es/slider/Slider.js +149 -0
  89. package/dist-es/slider/Slider.js.map +1 -0
  90. package/dist-es/slider/internal/SliderThumb.css.js +4 -0
  91. package/dist-es/slider/internal/SliderThumb.css.js.map +1 -0
  92. package/dist-es/slider/internal/SliderThumb.js +139 -0
  93. package/dist-es/slider/internal/SliderThumb.js.map +1 -0
  94. package/dist-es/slider/internal/SliderTooltip.css.js +4 -0
  95. package/dist-es/slider/internal/SliderTooltip.css.js.map +1 -0
  96. package/dist-es/slider/internal/SliderTooltip.js +68 -0
  97. package/dist-es/slider/internal/SliderTooltip.js.map +1 -0
  98. package/dist-es/slider/internal/SliderTrack.css.js +4 -0
  99. package/dist-es/slider/internal/SliderTrack.css.js.map +1 -0
  100. package/dist-es/slider/internal/SliderTrack.js +177 -0
  101. package/dist-es/slider/internal/SliderTrack.js.map +1 -0
  102. package/dist-es/slider/internal/useRangeSliderThumb.js +232 -0
  103. package/dist-es/slider/internal/useRangeSliderThumb.js.map +1 -0
  104. package/dist-es/slider/internal/useSliderThumb.js +160 -0
  105. package/dist-es/slider/internal/useSliderThumb.js.map +1 -0
  106. package/dist-es/slider/internal/utils.js +119 -0
  107. package/dist-es/slider/internal/utils.js.map +1 -0
  108. package/dist-es/switch/Switch.js.map +1 -1
  109. package/dist-types/border-layout/BorderLayout.d.ts +2 -3
  110. package/dist-types/dialog/DialogHeader.d.ts +9 -1
  111. package/dist-types/index.d.ts +1 -0
  112. package/dist-types/overlay/OverlayHeader.d.ts +20 -0
  113. package/dist-types/overlay/index.d.ts +1 -0
  114. package/dist-types/slider/RangeSlider.d.ts +99 -0
  115. package/dist-types/slider/Slider.d.ts +100 -0
  116. package/dist-types/slider/index.d.ts +2 -0
  117. package/dist-types/slider/internal/SliderThumb.d.ts +26 -0
  118. package/dist-types/slider/internal/SliderTooltip.d.ts +6 -0
  119. package/dist-types/slider/internal/SliderTrack.d.ts +24 -0
  120. package/dist-types/slider/internal/useRangeSliderThumb.d.ts +30 -0
  121. package/dist-types/slider/internal/useSliderThumb.d.ts +28 -0
  122. package/dist-types/slider/internal/utils.d.ts +20 -0
  123. package/dist-types/switch/Switch.d.ts +7 -7
  124. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,125 @@
1
1
  # @salt-ds/core
2
2
 
3
+ ## 1.44.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 7fe2106: Promote updated `Slider` and `RangeSlider` components to core. The update includes:
8
+
9
+ - Improved accessibility and focus behavior.
10
+ - Enhanced API for slider customization, including options like `marks`, `showTicks`, and `showTooltip`.
11
+ - Fixed touch interactions on mobile to allow dragging of the slider thumb without horizontal screen scrolling.
12
+ - Set the default `max` value of the `Slider` and `RangeSlider` as 100 to be consistent with the HTML specification.
13
+
14
+ ```tsx
15
+ <Slider
16
+ min={0}
17
+ max={30}
18
+ defaultValue={15}
19
+ marks={[
20
+ { value: 0, label: "Minimum" },
21
+ { value: 30, label: "Maximum" },
22
+ ]}
23
+ showTicks={true}
24
+ />
25
+ ```
26
+
27
+ ```tsx
28
+ <RangeSlider
29
+ min={0}
30
+ max={30}
31
+ defaultValue={15}
32
+ marks={[
33
+ { value: 0, label: "0" },
34
+ { value: 10, label: "10" },
35
+ { value: 15, label: "15" },
36
+ { value: 19, label: "19" },
37
+ { value: 30, label: "30" },
38
+ ]}
39
+ showTicks={true}
40
+ minLabel="Very low"
41
+ maxLabel="Very high"
42
+ restrictToMarks={true}
43
+ />
44
+ ```
45
+
46
+ ## 1.43.0
47
+
48
+ ### Minor Changes
49
+
50
+ - 78eaee3: Promote updated `DialogHeader` component to core. `DialogHeader`'s update follows our standardized header for container components and app regions, and it can be added to provide a structured header for dialog. The header includes a title and actions that follows our Header Block pattern.
51
+
52
+ - Fixed default `initialFocus` to close button (if used) as per accessibility guidance.
53
+ - Updated bottom padding of DialogHeader from `--salt-spacing-300` to `--salt-spacing-100`
54
+ - Updated close button position in `DialogHeader` to horizontally align with header icon using the new `actions` prop.
55
+ - Updated overflow border to be above and below `DialogContent` instead of below `DialogHeader` to make scrolling area more evident.
56
+ - Added `description` to `DialogHeader`. the description text is displayed just below the header.
57
+
58
+ ```typescript
59
+ <Dialog open={open} onOpenChange={onOpenChange}>
60
+ <DialogHeader
61
+ header="Terms and conditions"
62
+ actions={
63
+ <Button
64
+ aria-label="Close overlay"
65
+ appearance="transparent"
66
+ sentiment="neutral"
67
+ >
68
+ <CloseIcon aria-hidden />
69
+ </Button>
70
+ }
71
+ />
72
+ <DialogContent>
73
+ Only Chase Cards that we determine are eligible can be added to the wallet.
74
+ </DialogContent>
75
+ </Dialog>;
76
+ ```
77
+
78
+ Prompted `OverlayHeader` component to core.
79
+
80
+ - Fixed default `initialFocus` to close button (if used) as per accessibility guidance.
81
+ - Updated close button position in `OverlayHeader` using the new `actions` prop.
82
+ - Added `description` to `OverlayHeader`. the description text is displayed just below the header.
83
+
84
+ ```tsx
85
+ <Overlay {...args}>
86
+ <OverlayTrigger>
87
+ <Button>Show Overlay</Button>
88
+ </OverlayTrigger>
89
+ <OverlayPanel aria-labelledby={id}>
90
+ <OverlayHeader
91
+ id={id}
92
+ header="Title"
93
+ actions={
94
+ <Button
95
+ aria-label="Close overlay"
96
+ appearance="transparent"
97
+ sentiment="neutral"
98
+ >
99
+ <CloseIcon aria-hidden />
100
+ </Button>
101
+ }
102
+ />
103
+ <OverlayPanelContent>Content of Overlay</OverlayPanelContent>
104
+ </OverlayPanel>
105
+ </Overlay>
106
+ ```
107
+
108
+ ### Patch Changes
109
+
110
+ - 20abfb6: Fixed multiselect Option having nested interactive elements, impacted ComboBox, Dropdown and ListBox.
111
+
112
+ Fixes #4737.
113
+
114
+ - c59472d: fix type error when `BorderLayout` has only one child or its conditionally rendered
115
+ - 2bdfbfb: Fixed ComboBox and Dropdown status adornment spacing, to align with rest of form controls.
116
+
117
+ Closes #4794
118
+
119
+ - 0073384: Fixed invalid variant prop crashed Button
120
+ - ef8f30a: Fixed ComboBox having 2 popup lists due to browser's default `autoComplete` behaviour on `input`.
121
+ You can still enable it via `inputProps={{autoComplete: "on"}}` if needed.
122
+
3
123
  ## 1.42.0
4
124
 
5
125
  ### Minor Changes
package/css/salt-core.css CHANGED
@@ -1115,24 +1115,22 @@ a:focus .saltCard-interactable.saltCard-disabled {
1115
1115
  margin-left: var(--salt-spacing-200);
1116
1116
  margin-right: var(--salt-spacing-300);
1117
1117
  padding-left: var(--salt-spacing-100);
1118
- border-bottom: var(--salt-size-border) var(--salt-separable-borderStyle) transparent;
1119
- box-shadow: none;
1120
1118
  flex: 1 1 auto;
1121
1119
  }
1122
1120
  .saltDialogContent-overflow {
1123
1121
  padding-right: var(--salt-spacing-100);
1124
1122
  }
1125
1123
  .saltDialogContent-scroll {
1124
+ margin-left: var(--salt-spacing-300);
1125
+ margin-right: var(--salt-spacing-300);
1126
1126
  border-bottom: var(--salt-size-border) var(--salt-separable-borderStyle) var(--salt-separable-tertiary-borderColor);
1127
- box-shadow: var(--salt-overlayable-shadow-scroll);
1128
1127
  }
1129
1128
 
1130
1129
  /* src/dialog/DialogHeader.css */
1131
1130
  .saltDialogHeader {
1132
- padding-bottom: var(--salt-spacing-100);
1131
+ padding-bottom: var(--salt-spacing-300);
1133
1132
  padding-left: var(--salt-spacing-300);
1134
1133
  padding-right: var(--salt-spacing-300);
1135
- align-items: center;
1136
1134
  display: flex;
1137
1135
  flex-direction: row;
1138
1136
  gap: var(--salt-spacing-100);
@@ -1141,8 +1139,24 @@ a:focus .saltCard-interactable.saltCard-disabled {
1141
1139
  .saltDialogHeader-header {
1142
1140
  margin: 0;
1143
1141
  }
1142
+ .saltDialogHeader-container {
1143
+ flex-grow: 1;
1144
+ margin: 0;
1145
+ display: flex;
1146
+ flex-direction: column;
1147
+ gap: var(--salt-spacing-50);
1148
+ padding-top: calc((var(--salt-size-base) - var(--salt-text-h2-lineHeight)) / 2);
1149
+ align-items: flex-start;
1150
+ }
1151
+ .saltDialogHeader-header > .saltText {
1152
+ margin: 0;
1153
+ }
1154
+ .saltDialogHeader-actionsContainer {
1155
+ align-self: flex-start;
1156
+ }
1144
1157
  .saltDialogHeader .saltStatusIndicator.saltIcon {
1145
1158
  --icon-size: var(--salt-text-h2-lineHeight);
1159
+ padding-top: calc((var(--salt-size-base) - var(--salt-text-h2-lineHeight)) / 2);
1146
1160
  }
1147
1161
  .saltDialogHeader-withAccent {
1148
1162
  position: relative;
@@ -1152,22 +1166,10 @@ a:focus .saltCard-interactable.saltCard-disabled {
1152
1166
  position: absolute;
1153
1167
  top: 0;
1154
1168
  left: 0;
1155
- bottom: var(--salt-spacing-100);
1169
+ bottom: var(--salt-spacing-300);
1156
1170
  width: var(--salt-size-bar);
1157
1171
  background: var(--salt-accent-background);
1158
1172
  }
1159
- .saltDialogHeader-error::before {
1160
- background: var(--salt-status-error-borderColor);
1161
- }
1162
- .saltDialogHeader-info::before {
1163
- background: var(--salt-status-info-borderColor);
1164
- }
1165
- .saltDialogHeader-success::before {
1166
- background: var(--salt-status-success-borderColor);
1167
- }
1168
- .saltDialogHeader-warning::before {
1169
- background: var(--salt-status-warning-borderColor);
1170
- }
1171
1173
 
1172
1174
  /* src/divider/Divider.css */
1173
1175
  .saltDivider-primary {
@@ -1286,7 +1288,6 @@ a:focus .saltCard-interactable.saltCard-disabled {
1286
1288
  display: inline-flex;
1287
1289
  align-items: center;
1288
1290
  padding: 0 var(--salt-spacing-100);
1289
- gap: var(--salt-spacing-100);
1290
1291
  color: var(--dropdown-color);
1291
1292
  font-family: var(--salt-text-fontFamily);
1292
1293
  font-size: var(--salt-text-fontSize);
@@ -1434,6 +1435,12 @@ a:focus .saltCard-interactable.saltCard-disabled {
1434
1435
  color: var(--salt-content-secondary-foreground);
1435
1436
  font-weight: var(--salt-text-fontWeight-small);
1436
1437
  }
1438
+ .saltDropdown-startAdornmentContainer {
1439
+ margin-right: var(--salt-spacing-100);
1440
+ }
1441
+ .saltDropdown .saltDropdown-toggle {
1442
+ margin-left: var(--salt-spacing-100);
1443
+ }
1437
1444
 
1438
1445
  /* src/file-drop-zone/FileDropZone.css */
1439
1446
  .saltFileDropZone {
@@ -2726,6 +2733,35 @@ a:focus .saltCard-interactable.saltCard-disabled {
2726
2733
  display: none;
2727
2734
  }
2728
2735
 
2736
+ /* src/overlay/OverlayHeader.css */
2737
+ .saltOverlayHeader {
2738
+ padding: var(--salt-spacing-100);
2739
+ width: 100%;
2740
+ display: flex;
2741
+ flex-direction: row;
2742
+ justify-content: stretch;
2743
+ gap: var(--salt-spacing-100);
2744
+ box-sizing: border-box;
2745
+ }
2746
+ .saltOverlayHeader-container {
2747
+ flex-grow: 1;
2748
+ margin: 0;
2749
+ display: flex;
2750
+ flex-direction: column;
2751
+ gap: var(--salt-spacing-50);
2752
+ padding-top: calc((var(--salt-size-base) - var(--salt-text-h4-lineHeight)) / 2);
2753
+ align-items: flex-start;
2754
+ }
2755
+ .saltOverlayHeader-header {
2756
+ margin: 0;
2757
+ }
2758
+ .saltOverlayHeader-actionsContainer {
2759
+ align-self: flex-start;
2760
+ }
2761
+ .saltOverlayHeader ~ .saltOverlayPanelContent {
2762
+ padding-top: 0;
2763
+ }
2764
+
2729
2765
  /* src/overlay/OverlayPanel.css */
2730
2766
  .saltOverlayPanel {
2731
2767
  --overlay-borderColor: var(--saltOverlay-borderColor, var(--salt-container-primary-borderColor));
@@ -2767,20 +2803,14 @@ a:focus .saltCard-interactable.saltCard-disabled {
2767
2803
  overflow: hidden;
2768
2804
  padding: var(--saltOverlay-content-padding, var(--salt-spacing-100));
2769
2805
  }
2770
- .saltOverlayHeader ~ .saltOverlayPanelContent-separator {
2771
- border-top: var(--salt-size-border) var(--salt-separable-borderStyle) transparent;
2772
- }
2773
2806
  .saltOverlayPanelContent-overflow {
2774
2807
  padding-right: var(--salt-spacing-100);
2808
+ border-top: var(--salt-size-border) var(--salt-separable-borderStyle) transparent;
2809
+ border-bottom: var(--salt-size-border) var(--salt-separable-borderStyle) transparent;
2775
2810
  overflow-y: auto;
2776
2811
  }
2777
- .saltOverlayHeader ~ .saltOverlayPanelContent-scroll {
2812
+ .saltOverlayPanelContent-overflow.saltOverlayPanelContent-scroll-top {
2778
2813
  border-top: var(--salt-size-border) var(--salt-separable-borderStyle) var(--salt-separable-tertiary-borderColor);
2779
- box-shadow: var(--salt-overlayable-shadow-scroll);
2780
- margin-top: calc(0 - var(--salt-size-border));
2781
- }
2782
- .saltOverlayHeader ~ .saltOverlayPanelContent-separator ~ .saltOverlayPanelContent {
2783
- padding-top: 0;
2784
2814
  }
2785
2815
 
2786
2816
  /* src/pagination/CompactInput.css */
@@ -3169,7 +3199,7 @@ a:focus .saltCard-interactable.saltCard-disabled {
3169
3199
  .saltPillInput-endAdornmentContainer {
3170
3200
  align-items: center;
3171
3201
  display: inline-flex;
3172
- padding-left: var(--salt-spacing-100);
3202
+ padding-left: var(--salt-spacing-50);
3173
3203
  padding-top: var(--salt-spacing-50);
3174
3204
  column-gap: var(--salt-spacing-100);
3175
3205
  align-self: flex-start;
@@ -4527,4 +4557,259 @@ label.saltText small,
4527
4557
  }
4528
4558
  }
4529
4559
 
4530
- /* src/69f9d8f9-ed5e-44e2-9a8c-b7ed2155ac5d.css */
4560
+ /* src/slider/internal/SliderThumb.css */
4561
+ .saltSliderThumb {
4562
+ align-items: center;
4563
+ background: var(--salt-accent-borderColor);
4564
+ cursor: var(--salt-selectable-cursor-hover);
4565
+ display: flex;
4566
+ height: var(--salt-size-selectable);
4567
+ outline: none;
4568
+ position: absolute;
4569
+ top: calc(((var(--salt-size-selectable) - var(--salt-size-bar)) / 2) * -1);
4570
+ transform: translateX(-50%);
4571
+ width: var(--salt-size-border-strong);
4572
+ touch-action: none;
4573
+ }
4574
+ .saltSliderThumb-disabled {
4575
+ background: var(--salt-accent-borderColor-disabled);
4576
+ pointer-events: none;
4577
+ }
4578
+ .saltSliderThumb-focusVisible {
4579
+ outline-style: var(--salt-focused-outlineStyle);
4580
+ outline-width: var(--salt-focused-outlineWidth);
4581
+ outline-offset: var(--salt-focused-outlineOffset);
4582
+ outline-color: var(--salt-focused-outlineColor);
4583
+ }
4584
+ .saltSliderThumb:active,
4585
+ .saltSliderThumb-dragging {
4586
+ cursor: var(--draggable-grab-cursor-active);
4587
+ }
4588
+ .saltSliderThumb-input {
4589
+ border: 0;
4590
+ appearance: none;
4591
+ cursor: var(--salt-selectable-cursor-hover);
4592
+ height: var(--salt-size-base);
4593
+ left: var(--slider-progressPercentage);
4594
+ margin: 0;
4595
+ opacity: 0.0001;
4596
+ overflow: hidden;
4597
+ -webkit-appearance: none;
4598
+ pointer-events: none;
4599
+ width: var(--salt-size-base);
4600
+ padding: 0;
4601
+ position: absolute;
4602
+ transform: translateX(-50%);
4603
+ }
4604
+ .saltSliderThumb-secondThumb {
4605
+ z-index: 2;
4606
+ }
4607
+ .saltSliderThumb-accessibleText {
4608
+ position: absolute;
4609
+ height: 1px;
4610
+ width: 1px;
4611
+ padding: 0;
4612
+ margin: -1px;
4613
+ overflow: hidden;
4614
+ clip: rect(0, 0, 0, 0);
4615
+ white-space: nowrap;
4616
+ border-width: 0;
4617
+ }
4618
+
4619
+ /* src/slider/internal/SliderTooltip.css */
4620
+ .saltSliderTooltip {
4621
+ background: var(--salt-container-primary-background);
4622
+ border-color: var(--salt-container-primary-borderColor);
4623
+ border-style: var(--saltTooltip-borderStyle, var(--salt-container-borderStyle));
4624
+ border-width: var(--saltTooltip-borderWidth, var(--salt-size-border));
4625
+ border-radius: var(--saltTooltip-borderRadius, var(--salt-palette-corner-weak, 0));
4626
+ box-shadow: var(--saltTooltip-shadow, var(--salt-overlayable-shadow-popout));
4627
+ bottom: 50%;
4628
+ left: 50%;
4629
+ padding: var(--salt-spacing-50) var(--salt-spacing-100);
4630
+ position: absolute;
4631
+ transform: translate(-50%, -50%);
4632
+ text-align: var(--saltTooltip-textAlign, left);
4633
+ user-select: none;
4634
+ visibility: hidden;
4635
+ z-index: var(--saltTooltip-zIndex, var(--salt-zIndex-flyover));
4636
+ }
4637
+ .saltSliderTooltip-visible,
4638
+ .saltSliderTooltip:hover {
4639
+ visibility: visible;
4640
+ }
4641
+ .saltSliderTooltip-arrow {
4642
+ fill: var(--salt-container-primary-background);
4643
+ height: var(--salt-size-icon);
4644
+ left: 50%;
4645
+ position: absolute;
4646
+ pointer-events: none;
4647
+ top: 100%;
4648
+ transform: translateX(-50%);
4649
+ stroke: var(--salt-container-primary-borderColor);
4650
+ stroke-width: var(--salt-size-border);
4651
+ width: var(--salt-size-icon);
4652
+ }
4653
+ .saltSliderTooltip-text {
4654
+ white-space: nowrap;
4655
+ }
4656
+
4657
+ /* src/slider/internal/SliderTrack.css */
4658
+ .saltSliderTrack {
4659
+ --slider-track-background: var(--salt-track-borderColor);
4660
+ --slider-track-fill: var(--salt-accent-borderColor);
4661
+ --slider-progressPercentage: 0%;
4662
+ --slider-tick-height: calc((var(--salt-size-selectable) - var(--salt-size-bar)) / 2);
4663
+ --slider-progressPercentageStart: 0%;
4664
+ --slider-progressPercentageEnd: 0%;
4665
+ display: flex;
4666
+ touch-action: none;
4667
+ width: 100%;
4668
+ }
4669
+ .saltSliderTrack.saltSliderTrack-withMarks {
4670
+ margin-bottom: calc(var(--salt-size-base) / 2);
4671
+ }
4672
+ .saltSliderTrack-disabled {
4673
+ cursor: var(--salt-selectable-cursor-disabled);
4674
+ }
4675
+ .saltSliderTrack-container {
4676
+ align-items: center;
4677
+ display: flex;
4678
+ flex-direction: row;
4679
+ gap: var(--salt-spacing-100);
4680
+ width: 100%;
4681
+ }
4682
+ .saltSliderTrack-wrapper {
4683
+ align-items: center;
4684
+ cursor: var(--salt-selectable-cursor-hover);
4685
+ display: flex;
4686
+ flex: 1;
4687
+ height: var(--salt-size-selectable);
4688
+ position: relative;
4689
+ width: 100%;
4690
+ }
4691
+ .saltSliderTrack-disabled,
4692
+ .saltSliderTrack-disabled .saltSliderTrack-wrapper {
4693
+ cursor: var(--salt-selectable-cursor-disabled);
4694
+ }
4695
+ .saltSliderTrack-disabled .saltSliderTrack-wrapper {
4696
+ pointer-events: none;
4697
+ }
4698
+ .saltSliderTrack-rail {
4699
+ display: flex;
4700
+ flex: 100%;
4701
+ height: var(--salt-size-bar);
4702
+ justify-content: space-between;
4703
+ position: relative;
4704
+ }
4705
+ .saltSliderTrack-rail::before,
4706
+ .saltSliderTrack-rail::after {
4707
+ content: "";
4708
+ display: block;
4709
+ height: 100%;
4710
+ }
4711
+ .saltSliderTrack-rail::before {
4712
+ background: var(--slider-track-fill);
4713
+ border-top-left-radius: var(--salt-palette-corner-weaker);
4714
+ border-bottom-left-radius: var(--salt-palette-corner-weaker);
4715
+ width: calc(var(--slider-progressPercentage) - 1.5 * var(--salt-size-border-strong));
4716
+ }
4717
+ .saltSliderTrack-hasMinTick.saltSliderTrack-rail::before {
4718
+ border-bottom-left-radius: unset;
4719
+ }
4720
+ .saltSliderTrack-rail::after {
4721
+ background: var(--slider-track-background);
4722
+ border-top-right-radius: var(--salt-palette-corner-weaker);
4723
+ border-bottom-right-radius: var(--salt-palette-corner-weaker);
4724
+ width: calc(100% - var(--slider-progressPercentage) - 1.5 * var(--salt-size-border-strong));
4725
+ }
4726
+ .saltSliderTrack-hasMaxTick.saltSliderTrack-rail::after {
4727
+ border-bottom-right-radius: unset;
4728
+ }
4729
+ .saltSliderTrack-range .saltSliderTrack-rail::before {
4730
+ background: var(--slider-track-background);
4731
+ width: calc(var(--slider-progressPercentageStart) - (var(--salt-size-border-strong) * 1.5));
4732
+ }
4733
+ .saltSliderTrack-range .saltSliderTrack-rail::after {
4734
+ background: var(--slider-track-background);
4735
+ width: calc(100% - var(--slider-progressPercentageEnd) - (var(--salt-size-border-strong) * 1.5));
4736
+ }
4737
+ .saltSliderTrack-range .saltSliderTrack-rail .saltSliderTrack-fill {
4738
+ background: var(--slider-track-fill);
4739
+ height: 100%;
4740
+ left: calc(var(--slider-progressPercentageStart) + 1.5 * var(--salt-size-border-strong));
4741
+ position: absolute;
4742
+ width: calc(var(--slider-progressPercentageEnd) - var(--slider-progressPercentageStart) - var(--salt-size-border-strong) * 3);
4743
+ }
4744
+ .saltSliderTrack-minLabel,
4745
+ .saltSliderTrack-maxLabel {
4746
+ user-select: none;
4747
+ }
4748
+ .saltSliderTrack-dragging,
4749
+ .saltSliderTrack-dragging .saltSliderTrack-wrapper {
4750
+ cursor: var(--salt-draggable-grab-cursor-active);
4751
+ }
4752
+ .saltSliderTrack-disabled {
4753
+ --slider-track-fill: var(--salt-accent-borderColor-disabled);
4754
+ --slider-track-background: var(--salt-track-borderColor-disabled);
4755
+ }
4756
+ .saltSliderTrack-ticks {
4757
+ top: calc(var(--salt-size-bar) + var(--slider-tick-height));
4758
+ position: absolute;
4759
+ width: 100%;
4760
+ }
4761
+ .saltSliderTrack-tick {
4762
+ background: var(--slider-track-background);
4763
+ height: var(--slider-tick-height);
4764
+ position: absolute;
4765
+ transform: translate(-50%);
4766
+ width: var(--salt-size-border-strong);
4767
+ }
4768
+ .saltSliderTrack-withTicks .saltSliderTrack-tickHidden {
4769
+ visibility: hidden;
4770
+ }
4771
+ .saltSliderTrack-tickSelected {
4772
+ background: var(--slider-track-fill);
4773
+ }
4774
+ .saltSliderTrack-tick:first-of-type {
4775
+ transform: unset;
4776
+ }
4777
+ .saltSliderTrack-tick:last-of-type {
4778
+ transform: translateX(-100%);
4779
+ }
4780
+ .saltSliderTrack-marks {
4781
+ position: absolute;
4782
+ user-select: none;
4783
+ width: 100%;
4784
+ }
4785
+ .saltSliderTrack-markLabel {
4786
+ color: var(--salt-content-secondary-foreground);
4787
+ font-family: var(--salt-text-label-fontFamily);
4788
+ font-weight: var(--salt-text-label-fontWeight);
4789
+ font-size: var(--salt-text-label-fontSize);
4790
+ line-height: var(--salt-text-label-lineHeight);
4791
+ overflow: hidden;
4792
+ position: absolute;
4793
+ text-overflow: ellipsis;
4794
+ transform: translateX(-50%);
4795
+ top: calc(var(--slider-tick-height) + var(--salt-spacing-50));
4796
+ white-space: nowrap;
4797
+ }
4798
+ .saltSliderTrack-constrainLabelPosition .saltSliderTrack-markLabel:first-of-type {
4799
+ transform: translateX(0%);
4800
+ }
4801
+ .saltSliderTrack-constrainLabelPosition .saltSliderTrack-markLabel:last-of-type {
4802
+ transform: translateX(-100%);
4803
+ }
4804
+ .saltFormField .saltSliderTrack.saltSliderTrack-withMark {
4805
+ margin-bottom: 0;
4806
+ }
4807
+ .saltFormField .saltSliderTrack-container {
4808
+ --saltFormField-label-width: 10%;
4809
+ height: var(--salt-size-base);
4810
+ }
4811
+ .saltFormField .saltSliderTrack-markLabel {
4812
+ top: calc((var(--salt-size-base) - var(--salt-size-bar)) / 2);
4813
+ }
4814
+
4815
+ /* src/1af42f57-5eb2-47da-8657-1a22a667b415.css */
@@ -16,7 +16,7 @@ const BorderLayout = React.forwardRef(
16
16
  ({ children, className, gap, style, ...rest }, ref) => {
17
17
  const borderAreas = React.Children.map(
18
18
  children,
19
- (child) => child.props.position
19
+ (child) => React.isValidElement(child) && child.props.position
20
20
  );
21
21
  const topSection = borderAreas.includes("north") ? "north ".repeat(numberOfColumns) : "none ".repeat(numberOfColumns);
22
22
  const leftSection = borderAreas.includes("west") ? "west" : "center";
@@ -1 +1 @@
1
- {"version":3,"file":"BorderLayout.js","sources":["../src/border-layout/BorderLayout.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport {\n Children,\n type ElementType,\n type ReactElement,\n forwardRef,\n useEffect,\n} from \"react\";\n\nimport type { BorderItemProps } from \"../border-item\";\nimport { GridLayout, type GridLayoutProps } from \"../grid-layout\";\nimport {\n type PolymorphicComponentPropWithRef,\n type PolymorphicRef,\n type ResponsiveProp,\n makePrefixer,\n} from \"../utils\";\n\nexport type BorderLayoutProps<T extends ElementType> =\n PolymorphicComponentPropWithRef<\n T,\n {\n /**\n * Defines the size of the gutter between the columns and the rows by setting a density multiplier. Defaults to 0\n */\n gap?: GridLayoutProps<T>[\"gap\"];\n /**\n * Defines the size of the gutter between the columns by setting a density multiplier. Defaults to 0\n */\n columnGap?: GridLayoutProps<T>[\"columnGap\"];\n /**\n * Defines the size of the gutter between the rows by setting a density multiplier. Defaults to 0\n */\n rowGap?: GridLayoutProps<T>[\"rowGap\"];\n /**\n * Border item components to be rendered.\n */\n children: ReactElement<BorderItemProps<T>>[];\n /**\n * Defines the margin around the component. It can be specified as a number (which acts as a multiplier) or a string representing the margin value. Default is `0`.\n */\n margin?: ResponsiveProp<number | string>;\n /**\n * Defines the padding within the component. It can be specified as a number (which acts as a multiplier) or a string representing the padding value. Default is `0`.\n */\n padding?: ResponsiveProp<number | string>;\n }\n >;\n\nconst withBaseName = makePrefixer(\"saltBorderLayout\");\n\nconst numberOfColumns = 3;\n\ntype BorderLayoutComponent = <T extends ElementType = \"div\">(\n props: BorderLayoutProps<T>,\n) => ReactElement | null;\n\nexport const BorderLayout: BorderLayoutComponent = forwardRef(\n <T extends ElementType>(\n { children, className, gap, style, ...rest }: BorderLayoutProps<T>,\n ref?: PolymorphicRef<T>,\n ) => {\n const borderAreas = Children.map(\n children,\n (child: ReactElement<BorderItemProps<T>>) => child.props.position,\n );\n\n const topSection = borderAreas.includes(\"north\")\n ? \"north \".repeat(numberOfColumns)\n : \"none \".repeat(numberOfColumns);\n\n const leftSection = borderAreas.includes(\"west\") ? \"west\" : \"center\";\n\n const rightSection = borderAreas.includes(\"east\") ? \"east\" : \"center\";\n\n const midSection = `${leftSection} center ${rightSection}`;\n\n const bottomSection = borderAreas.includes(\"south\")\n ? \"south \".repeat(numberOfColumns)\n : \"none \".repeat(numberOfColumns);\n\n const gridTemplateAreas = `\"${topSection}\" \"${midSection}\" \"${bottomSection}\"`;\n\n const hasMainSection = borderAreas.includes(\"center\");\n\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\") {\n if (!hasMainSection) {\n console.warn(\n \"No main section has been found. A main section should be provided.\",\n );\n }\n }\n }, [hasMainSection]);\n\n const borderLayoutStyles = {\n ...style,\n \"--gridLayout-gridTemplate\": gridTemplateAreas,\n };\n\n return (\n <GridLayout\n className={clsx(withBaseName(), className, \"saltGridLayout-area\")}\n columns={numberOfColumns}\n gap={gap || 0}\n style={borderLayoutStyles}\n ref={ref}\n {...rest}\n >\n {children}\n </GridLayout>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","Children","useEffect","jsx","GridLayout","clsx"],"mappings":";;;;;;;;;;;;AAiDA,MAAM,YAAA,GAAeA,0BAAa,kBAAkB,CAAA;AAEpD,MAAM,eAAkB,GAAA,CAAA;AAMjB,MAAM,YAAsC,GAAAC,gBAAA;AAAA,EACjD,CACE,EAAE,QAAU,EAAA,SAAA,EAAW,KAAK,KAAO,EAAA,GAAG,IAAK,EAAA,EAC3C,GACG,KAAA;AACH,IAAA,MAAM,cAAcC,cAAS,CAAA,GAAA;AAAA,MAC3B,QAAA;AAAA,MACA,CAAC,KAA4C,KAAA,KAAA,CAAM,KAAM,CAAA;AAAA,KAC3D;AAEA,IAAM,MAAA,UAAA,GAAa,WAAY,CAAA,QAAA,CAAS,OAAO,CAAA,GAC3C,QAAS,CAAA,MAAA,CAAO,eAAe,CAAA,GAC/B,OAAQ,CAAA,MAAA,CAAO,eAAe,CAAA;AAElC,IAAA,MAAM,WAAc,GAAA,WAAA,CAAY,QAAS,CAAA,MAAM,IAAI,MAAS,GAAA,QAAA;AAE5D,IAAA,MAAM,YAAe,GAAA,WAAA,CAAY,QAAS,CAAA,MAAM,IAAI,MAAS,GAAA,QAAA;AAE7D,IAAA,MAAM,UAAa,GAAA,CAAA,EAAG,WAAW,CAAA,QAAA,EAAW,YAAY,CAAA,CAAA;AAExD,IAAM,MAAA,aAAA,GAAgB,WAAY,CAAA,QAAA,CAAS,OAAO,CAAA,GAC9C,QAAS,CAAA,MAAA,CAAO,eAAe,CAAA,GAC/B,OAAQ,CAAA,MAAA,CAAO,eAAe,CAAA;AAElC,IAAA,MAAM,oBAAoB,CAAI,CAAA,EAAA,UAAU,CAAM,GAAA,EAAA,UAAU,MAAM,aAAa,CAAA,CAAA,CAAA;AAE3E,IAAM,MAAA,cAAA,GAAiB,WAAY,CAAA,QAAA,CAAS,QAAQ,CAAA;AAEpD,IAAAC,eAAA,CAAU,MAAM;AACd,MAAI,IAAA,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,YAAc,EAAA;AACzC,QAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,UAAQ,OAAA,CAAA,IAAA;AAAA,YACN;AAAA,WACF;AAAA;AACF;AACF,KACF,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,IAAA,MAAM,kBAAqB,GAAA;AAAA,MACzB,GAAG,KAAA;AAAA,MACH,2BAA6B,EAAA;AAAA,KAC/B;AAEA,IACE,uBAAAC,cAAA;AAAA,MAACC,qBAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAAC,SAAA,CAAK,YAAa,EAAA,EAAG,WAAW,qBAAqB,CAAA;AAAA,QAChE,OAAS,EAAA,eAAA;AAAA,QACT,KAAK,GAAO,IAAA,CAAA;AAAA,QACZ,KAAO,EAAA,kBAAA;AAAA,QACP,GAAA;AAAA,QACC,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA;AAGN;;;;"}
1
+ {"version":3,"file":"BorderLayout.js","sources":["../src/border-layout/BorderLayout.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport {\n Children,\n type ElementType,\n type ReactElement,\n type ReactNode,\n forwardRef,\n isValidElement,\n useEffect,\n} from \"react\";\n\nimport type { BorderPosition } from \"../border-item\";\nimport { GridLayout, type GridLayoutProps } from \"../grid-layout\";\nimport {\n type PolymorphicComponentPropWithRef,\n type PolymorphicRef,\n type ResponsiveProp,\n makePrefixer,\n} from \"../utils\";\n\nexport type BorderLayoutProps<T extends ElementType> =\n PolymorphicComponentPropWithRef<\n T,\n {\n /**\n * Defines the size of the gutter between the columns and the rows by setting a density multiplier. Defaults to 0\n */\n gap?: GridLayoutProps<T>[\"gap\"];\n /**\n * Defines the size of the gutter between the columns by setting a density multiplier. Defaults to 0\n */\n columnGap?: GridLayoutProps<T>[\"columnGap\"];\n /**\n * Defines the size of the gutter between the rows by setting a density multiplier. Defaults to 0\n */\n rowGap?: GridLayoutProps<T>[\"rowGap\"];\n /**\n * Border item components to be rendered.\n */\n children: ReactNode;\n /**\n * Defines the margin around the component. It can be specified as a number (which acts as a multiplier) or a string representing the margin value. Default is `0`.\n */\n margin?: ResponsiveProp<number | string>;\n /**\n * Defines the padding within the component. It can be specified as a number (which acts as a multiplier) or a string representing the padding value. Default is `0`.\n */\n padding?: ResponsiveProp<number | string>;\n }\n >;\n\nconst withBaseName = makePrefixer(\"saltBorderLayout\");\n\nconst numberOfColumns = 3;\n\ntype BorderLayoutComponent = <T extends ElementType = \"div\">(\n props: BorderLayoutProps<T>,\n) => ReactElement | null;\n\nexport const BorderLayout: BorderLayoutComponent = forwardRef(\n <T extends ElementType>(\n { children, className, gap, style, ...rest }: BorderLayoutProps<T>,\n ref?: PolymorphicRef<T>,\n ) => {\n const borderAreas = Children.map(\n children,\n (child) => isValidElement(child) && child.props.position,\n ) as BorderPosition[];\n\n const topSection = borderAreas.includes(\"north\")\n ? \"north \".repeat(numberOfColumns)\n : \"none \".repeat(numberOfColumns);\n\n const leftSection = borderAreas.includes(\"west\") ? \"west\" : \"center\";\n\n const rightSection = borderAreas.includes(\"east\") ? \"east\" : \"center\";\n\n const midSection = `${leftSection} center ${rightSection}`;\n\n const bottomSection = borderAreas.includes(\"south\")\n ? \"south \".repeat(numberOfColumns)\n : \"none \".repeat(numberOfColumns);\n\n const gridTemplateAreas = `\"${topSection}\" \"${midSection}\" \"${bottomSection}\"`;\n\n const hasMainSection = borderAreas.includes(\"center\");\n\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\") {\n if (!hasMainSection) {\n console.warn(\n \"No main section has been found. A main section should be provided.\",\n );\n }\n }\n }, [hasMainSection]);\n\n const borderLayoutStyles = {\n ...style,\n \"--gridLayout-gridTemplate\": gridTemplateAreas,\n };\n\n return (\n <GridLayout\n className={clsx(withBaseName(), className, \"saltGridLayout-area\")}\n columns={numberOfColumns}\n gap={gap || 0}\n style={borderLayoutStyles}\n ref={ref}\n {...rest}\n >\n {children}\n </GridLayout>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","Children","isValidElement","useEffect","jsx","GridLayout","clsx"],"mappings":";;;;;;;;;;;;AAmDA,MAAM,YAAA,GAAeA,0BAAa,kBAAkB,CAAA;AAEpD,MAAM,eAAkB,GAAA,CAAA;AAMjB,MAAM,YAAsC,GAAAC,gBAAA;AAAA,EACjD,CACE,EAAE,QAAU,EAAA,SAAA,EAAW,KAAK,KAAO,EAAA,GAAG,IAAK,EAAA,EAC3C,GACG,KAAA;AACH,IAAA,MAAM,cAAcC,cAAS,CAAA,GAAA;AAAA,MAC3B,QAAA;AAAA,MACA,CAAC,KAAU,KAAAC,oBAAA,CAAe,KAAK,CAAA,IAAK,MAAM,KAAM,CAAA;AAAA,KAClD;AAEA,IAAM,MAAA,UAAA,GAAa,WAAY,CAAA,QAAA,CAAS,OAAO,CAAA,GAC3C,QAAS,CAAA,MAAA,CAAO,eAAe,CAAA,GAC/B,OAAQ,CAAA,MAAA,CAAO,eAAe,CAAA;AAElC,IAAA,MAAM,WAAc,GAAA,WAAA,CAAY,QAAS,CAAA,MAAM,IAAI,MAAS,GAAA,QAAA;AAE5D,IAAA,MAAM,YAAe,GAAA,WAAA,CAAY,QAAS,CAAA,MAAM,IAAI,MAAS,GAAA,QAAA;AAE7D,IAAA,MAAM,UAAa,GAAA,CAAA,EAAG,WAAW,CAAA,QAAA,EAAW,YAAY,CAAA,CAAA;AAExD,IAAM,MAAA,aAAA,GAAgB,WAAY,CAAA,QAAA,CAAS,OAAO,CAAA,GAC9C,QAAS,CAAA,MAAA,CAAO,eAAe,CAAA,GAC/B,OAAQ,CAAA,MAAA,CAAO,eAAe,CAAA;AAElC,IAAA,MAAM,oBAAoB,CAAI,CAAA,EAAA,UAAU,CAAM,GAAA,EAAA,UAAU,MAAM,aAAa,CAAA,CAAA,CAAA;AAE3E,IAAM,MAAA,cAAA,GAAiB,WAAY,CAAA,QAAA,CAAS,QAAQ,CAAA;AAEpD,IAAAC,eAAA,CAAU,MAAM;AACd,MAAI,IAAA,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,YAAc,EAAA;AACzC,QAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,UAAQ,OAAA,CAAA,IAAA;AAAA,YACN;AAAA,WACF;AAAA;AACF;AACF,KACF,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,IAAA,MAAM,kBAAqB,GAAA;AAAA,MACzB,GAAG,KAAA;AAAA,MACH,2BAA6B,EAAA;AAAA,KAC/B;AAEA,IACE,uBAAAC,cAAA;AAAA,MAACC,qBAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAAC,SAAA,CAAK,YAAa,EAAA,EAAG,WAAW,qBAAqB,CAAA;AAAA,QAChE,OAAS,EAAA,eAAA;AAAA,QACT,KAAK,GAAO,IAAA,CAAA;AAAA,QACZ,KAAO,EAAA,kBAAA;AAAA,QACP,GAAA;AAAA,QACC,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA;AAGN;;;;"}
@@ -72,8 +72,8 @@ const Button = React.forwardRef(
72
72
  window: targetWindow
73
73
  });
74
74
  const mapped = variantToAppearanceAndColor(variant);
75
- const appearance = appearanceProp ?? mapped.appearance ?? "solid";
76
- const sentiment = sentimentProp ?? mapped.sentiment ?? "neutral";
75
+ const appearance = appearanceProp ?? (mapped == null ? void 0 : mapped.appearance) ?? "solid";
76
+ const sentiment = sentimentProp ?? (mapped == null ? void 0 : mapped.sentiment) ?? "neutral";
77
77
  const { tabIndex, ...restButtonProps } = buttonProps;
78
78
  return /* @__PURE__ */ jsxRuntime.jsxs(
79
79
  "button",
@@ -1 +1 @@
1
- {"version":3,"file":"Button.js","sources":["../src/button/Button.tsx"],"sourcesContent":["import { Spinner } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type ReactElement,\n forwardRef,\n} from \"react\";\nimport { makePrefixer } from \"../utils\";\n\nimport buttonCss from \"./Button.css\";\nimport { useButton } from \"./useButton\";\n\nconst withBaseName = makePrefixer(\"saltButton\");\n\nexport const ButtonVariantValues = [\"primary\", \"secondary\", \"cta\"] as const;\nexport const ButtonAppearanceValues = [\n \"solid\",\n \"bordered\",\n \"transparent\",\n] as const;\nexport const ButtonSentimentValues = [\n \"accented\",\n \"neutral\",\n \"positive\",\n \"negative\",\n \"caution\",\n] as const;\nexport type ButtonVariant = (typeof ButtonVariantValues)[number];\nexport type ButtonAppearance = (typeof ButtonAppearanceValues)[number];\nexport type ButtonSentiment = (typeof ButtonSentimentValues)[number];\n\nexport interface ButtonProps extends ComponentPropsWithoutRef<\"button\"> {\n /**\n * If `true`, the button will be disabled.\n */\n disabled?: boolean;\n /**\n * If `true`, the button will be focusable when disabled.\n */\n focusableWhenDisabled?: boolean;\n /**\n * The variant to use. Options are 'primary', 'secondary' and 'cta'.\n * 'primary' is the default value.\n *\n * @deprecated Use `appearance` and `sentiment` instead.\n *\n * | variant | appearance | sentiment |\n * | ----------- | ------------- | ----------- |\n * | `cta` | `solid` | `accented` |\n * | `primary` | `solid` | `neutral` |\n * | `secondary` | `transparent` | `neutral` |\n */\n variant?: ButtonVariant;\n /**\n * The appearance of the button. Options are 'solid', 'bordered', and 'transparent'.\n * 'solid' is the default value.\n *\n * @since 1.36.0.\n */\n appearance?: ButtonAppearance;\n /**\n * The sentiment of the button. Options are 'accented', 'neutral', 'positive', 'negative' and 'caution'.\n * 'neutral' is the default value.\n *\n * @since 1.36.0.\n */\n sentiment?: ButtonSentiment;\n\n /**\n * If `true`, the button will be in a loading state. This allows a spinner to be nested inside the button.\n *\n * @since 1.38.0.\n */\n loading?: boolean;\n\n /**\n * Text to be announced by screen readers, intended to be used in conjunction with the `loading` prop.\n *\n * @since 1.38.0.\n */\n loadingAnnouncement?: string;\n}\n\nfunction variantToAppearanceAndColor(\n variant: ButtonVariant,\n): Pick<ButtonProps, \"appearance\" | \"sentiment\"> {\n switch (variant) {\n case \"primary\":\n return { appearance: \"solid\", sentiment: \"neutral\" };\n case \"secondary\":\n return { appearance: \"transparent\", sentiment: \"neutral\" };\n case \"cta\":\n return { appearance: \"solid\", sentiment: \"accented\" };\n }\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n function Button(\n {\n children,\n className,\n disabled,\n focusableWhenDisabled,\n onKeyUp,\n onKeyDown,\n onBlur,\n onClick,\n loading,\n loadingAnnouncement,\n appearance: appearanceProp,\n sentiment: sentimentProp,\n type = \"button\",\n variant = \"primary\",\n ...restProps\n },\n ref?,\n ): ReactElement<ButtonProps> {\n const { active, buttonProps } = useButton({\n loading,\n disabled,\n focusableWhenDisabled,\n onKeyUp,\n onKeyDown,\n onBlur,\n onClick,\n });\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-button\",\n css: buttonCss,\n window: targetWindow,\n });\n\n const mapped = variantToAppearanceAndColor(variant);\n const appearance: ButtonAppearance =\n appearanceProp ?? mapped.appearance ?? \"solid\";\n\n const sentiment: ButtonSentiment =\n sentimentProp ?? mapped.sentiment ?? \"neutral\";\n\n // we do not want to spread tab index in this case because the button element\n // does not require tabindex=\"0\" attribute\n const { tabIndex, ...restButtonProps } = buttonProps;\n return (\n <button\n {...restButtonProps}\n className={clsx(\n withBaseName(),\n withBaseName(variant),\n {\n [withBaseName(\"loading\")]: loading,\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"active\")]: active,\n [withBaseName(appearance)]: appearance,\n [withBaseName(sentiment)]: sentiment,\n },\n className,\n )}\n {...restProps}\n ref={ref}\n type={type}\n >\n {loading && (\n <div className={withBaseName(\"spinner\")} aria-hidden>\n <Spinner size=\"small\" aria-hidden disableAnnouncer />\n </div>\n )}\n {typeof loadingAnnouncement === \"string\" && (\n <span role=\"status\" className={withBaseName(\"sr-only\")}>\n {loadingAnnouncement}\n </span>\n )}\n {children}\n </button>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","Button","useButton","useWindow","useComponentCssInjection","buttonCss","jsxs","clsx","jsx","Spinner"],"mappings":"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"}
1
+ {"version":3,"file":"Button.js","sources":["../src/button/Button.tsx"],"sourcesContent":["import { Spinner } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ComponentPropsWithoutRef,\n type ReactElement,\n forwardRef,\n} from \"react\";\nimport { makePrefixer } from \"../utils\";\n\nimport buttonCss from \"./Button.css\";\nimport { useButton } from \"./useButton\";\n\nconst withBaseName = makePrefixer(\"saltButton\");\n\nexport const ButtonVariantValues = [\"primary\", \"secondary\", \"cta\"] as const;\nexport const ButtonAppearanceValues = [\n \"solid\",\n \"bordered\",\n \"transparent\",\n] as const;\nexport const ButtonSentimentValues = [\n \"accented\",\n \"neutral\",\n \"positive\",\n \"negative\",\n \"caution\",\n] as const;\nexport type ButtonVariant = (typeof ButtonVariantValues)[number];\nexport type ButtonAppearance = (typeof ButtonAppearanceValues)[number];\nexport type ButtonSentiment = (typeof ButtonSentimentValues)[number];\n\nexport interface ButtonProps extends ComponentPropsWithoutRef<\"button\"> {\n /**\n * If `true`, the button will be disabled.\n */\n disabled?: boolean;\n /**\n * If `true`, the button will be focusable when disabled.\n */\n focusableWhenDisabled?: boolean;\n /**\n * The variant to use. Options are 'primary', 'secondary' and 'cta'.\n * 'primary' is the default value.\n *\n * @deprecated Use `appearance` and `sentiment` instead.\n *\n * | variant | appearance | sentiment |\n * | ----------- | ------------- | ----------- |\n * | `cta` | `solid` | `accented` |\n * | `primary` | `solid` | `neutral` |\n * | `secondary` | `transparent` | `neutral` |\n */\n variant?: ButtonVariant;\n /**\n * The appearance of the button. Options are 'solid', 'bordered', and 'transparent'.\n * 'solid' is the default value.\n *\n * @since 1.36.0.\n */\n appearance?: ButtonAppearance;\n /**\n * The sentiment of the button. Options are 'accented', 'neutral', 'positive', 'negative' and 'caution'.\n * 'neutral' is the default value.\n *\n * @since 1.36.0.\n */\n sentiment?: ButtonSentiment;\n\n /**\n * If `true`, the button will be in a loading state. This allows a spinner to be nested inside the button.\n *\n * @since 1.38.0.\n */\n loading?: boolean;\n\n /**\n * Text to be announced by screen readers, intended to be used in conjunction with the `loading` prop.\n *\n * @since 1.38.0.\n */\n loadingAnnouncement?: string;\n}\n\nfunction variantToAppearanceAndColor(\n variant: ButtonVariant,\n): Pick<ButtonProps, \"appearance\" | \"sentiment\"> {\n switch (variant) {\n case \"primary\":\n return { appearance: \"solid\", sentiment: \"neutral\" };\n case \"secondary\":\n return { appearance: \"transparent\", sentiment: \"neutral\" };\n case \"cta\":\n return { appearance: \"solid\", sentiment: \"accented\" };\n }\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n function Button(\n {\n children,\n className,\n disabled,\n focusableWhenDisabled,\n onKeyUp,\n onKeyDown,\n onBlur,\n onClick,\n loading,\n loadingAnnouncement,\n appearance: appearanceProp,\n sentiment: sentimentProp,\n type = \"button\",\n variant = \"primary\",\n ...restProps\n },\n ref?,\n ): ReactElement<ButtonProps> {\n const { active, buttonProps } = useButton({\n loading,\n disabled,\n focusableWhenDisabled,\n onKeyUp,\n onKeyDown,\n onBlur,\n onClick,\n });\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-button\",\n css: buttonCss,\n window: targetWindow,\n });\n\n const mapped = variantToAppearanceAndColor(variant);\n const appearance: ButtonAppearance =\n appearanceProp ?? mapped?.appearance ?? \"solid\";\n\n const sentiment: ButtonSentiment =\n sentimentProp ?? mapped?.sentiment ?? \"neutral\";\n\n // we do not want to spread tab index in this case because the button element\n // does not require tabindex=\"0\" attribute\n const { tabIndex, ...restButtonProps } = buttonProps;\n return (\n <button\n {...restButtonProps}\n className={clsx(\n withBaseName(),\n withBaseName(variant),\n {\n [withBaseName(\"loading\")]: loading,\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"active\")]: active,\n [withBaseName(appearance)]: appearance,\n [withBaseName(sentiment)]: sentiment,\n },\n className,\n )}\n {...restProps}\n ref={ref}\n type={type}\n >\n {loading && (\n <div className={withBaseName(\"spinner\")} aria-hidden>\n <Spinner size=\"small\" aria-hidden disableAnnouncer />\n </div>\n )}\n {typeof loadingAnnouncement === \"string\" && (\n <span role=\"status\" className={withBaseName(\"sr-only\")}>\n {loadingAnnouncement}\n </span>\n )}\n {children}\n </button>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","Button","useButton","useWindow","useComponentCssInjection","buttonCss","jsxs","clsx","jsx","Spinner"],"mappings":"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"}