nexus-shared 3.0.0 → 3.1.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 (121) hide show
  1. package/CHANGELOG.md +446 -262
  2. package/LICENSE +21 -21
  3. package/README.md +1084 -1000
  4. package/dist/Client.Index.d.ts +3 -0
  5. package/dist/Client.Index.js +3 -0
  6. package/dist/Components/Chats/ChatParts.d.ts +2 -2
  7. package/dist/Components/Chats/ChatParts.js +3 -7
  8. package/dist/Components/Chats/ChatThread.js +3 -3
  9. package/dist/Components/Documents/Button.d.ts +6 -1
  10. package/dist/Components/Documents/Button.js +2 -2
  11. package/dist/Components/Documents/Menu.js +21 -9
  12. package/dist/Components/Documents/SplitButton.d.ts +3 -1
  13. package/dist/Components/Documents/SplitButton.js +7 -5
  14. package/dist/Components/Documents/TabButtons.d.ts +5 -2
  15. package/dist/Components/Documents/TabButtons.js +2 -2
  16. package/dist/Components/Forms/ApiForm.d.ts +1 -1
  17. package/dist/Components/Forms/ApiForm.js +1 -1
  18. package/dist/Components/Forms/Crud.js +177 -58
  19. package/dist/Components/Forms/CrudParts.d.ts +5 -1
  20. package/dist/Components/Forms/CrudParts.js +37 -5
  21. package/dist/Components/Forms/ExcelImport.d.ts +23 -7
  22. package/dist/Components/Forms/ExcelImport.js +189 -60
  23. package/dist/Components/Forms/Form.js +5 -13
  24. package/dist/Components/Forms/SubmitForm.d.ts +11 -2
  25. package/dist/Components/Forms/SubmitForm.js +23 -12
  26. package/dist/Components/Inputs/DropdownParts.d.ts +1 -1
  27. package/dist/Components/Inputs/DropdownParts.js +4 -6
  28. package/dist/Components/Inputs/NumberBox.js +24 -2
  29. package/dist/Components/Inputs/RowsInput.js +2 -2
  30. package/dist/Components/Inputs/Slider.js +4 -1
  31. package/dist/Components/Inputs/TabularForm.js +42 -10
  32. package/dist/Components/Inputs/TimePanel.js +4 -3
  33. package/dist/Components/Layouts/Popup.js +1 -4
  34. package/dist/Components/Layouts/ThemePicker.d.ts +20 -3
  35. package/dist/Components/Layouts/ThemePicker.js +77 -6
  36. package/dist/Components/Layouts/ThemeScript.d.ts +4 -2
  37. package/dist/Components/Layouts/ThemeScript.js +4 -2
  38. package/dist/Components/Layouts/ThemeSwitcher.d.ts +6 -3
  39. package/dist/Components/Layouts/ThemeSwitcher.js +9 -8
  40. package/dist/Components/Viewers/Avatar.d.ts +21 -0
  41. package/dist/Components/Viewers/Avatar.js +21 -0
  42. package/dist/Components/Viewers/DataTable.js +192 -44
  43. package/dist/Components/Viewers/DataTableColumns.d.ts +7 -3
  44. package/dist/Components/Viewers/DataTableColumns.js +25 -68
  45. package/dist/Components/Viewers/DataTableFilters.d.ts +21 -0
  46. package/dist/Components/Viewers/DataTableFilters.js +68 -0
  47. package/dist/Components/Viewers/DataTableParts.d.ts +2 -2
  48. package/dist/Components/Viewers/DataTableParts.js +3 -3
  49. package/dist/Helpers/AnimationHelpers.d.ts +11 -0
  50. package/dist/Helpers/AnimationHelpers.js +20 -2
  51. package/dist/Helpers/CrudBackend.d.ts +7 -4
  52. package/dist/Helpers/CrudBackend.js +4 -2
  53. package/dist/Helpers/ExcelBackend.d.ts +3 -3
  54. package/dist/Helpers/ExcelBackend.js +8 -2
  55. package/dist/Helpers/ExcelHelpers.d.ts +36 -8
  56. package/dist/Helpers/ExcelHelpers.js +55 -13
  57. package/dist/Helpers/FormStore.d.ts +9 -5
  58. package/dist/Helpers/FormStore.js +25 -5
  59. package/dist/Helpers/MessageBuilder.js +1 -0
  60. package/dist/Helpers/NumberHelpers.d.ts +7 -1
  61. package/dist/Helpers/NumberHelpers.js +41 -3
  62. package/dist/Helpers/PopoverHelpers.d.ts +17 -5
  63. package/dist/Helpers/PopoverHelpers.js +52 -17
  64. package/dist/Helpers/PopoverHooks.d.ts +24 -0
  65. package/dist/Helpers/PopoverHooks.js +62 -0
  66. package/dist/Helpers/RowsStore.d.ts +7 -2
  67. package/dist/Helpers/RowsStore.js +15 -3
  68. package/dist/Helpers/TableExport.js +12 -12
  69. package/dist/Helpers/TableFilters.d.ts +25 -0
  70. package/dist/Helpers/TableFilters.js +162 -0
  71. package/dist/Helpers/TableHelpers.d.ts +6 -3
  72. package/dist/Helpers/TableHelpers.js +8 -4
  73. package/dist/Helpers/TableStore.d.ts +11 -3
  74. package/dist/Helpers/TableStore.js +16 -5
  75. package/dist/Helpers/ThemeHelpers.d.ts +21 -4
  76. package/dist/Helpers/ThemeHelpers.js +46 -9
  77. package/dist/Helpers/UserPreferences.d.ts +14 -0
  78. package/dist/Helpers/UserPreferences.js +99 -0
  79. package/dist/Interfaces/CrudInterfaces.d.ts +20 -1
  80. package/dist/Interfaces/ExcelInterfaces.d.ts +12 -0
  81. package/dist/Interfaces/FormInterfaces.d.ts +33 -5
  82. package/dist/Interfaces/PreferenceInterfaces.d.ts +43 -0
  83. package/dist/Interfaces/PreferenceInterfaces.js +28 -0
  84. package/dist/Interfaces/TableInterfaces.d.ts +59 -12
  85. package/dist/Interfaces/ThemeInterfaces.d.ts +25 -0
  86. package/dist/Interfaces/ThemeInterfaces.js +15 -0
  87. package/dist/Services/ExcelApi.d.ts +3 -1
  88. package/dist/Services/ExcelApi.js +1 -1
  89. package/dist/Services/ThemeService.d.ts +18 -2
  90. package/dist/Services/ThemeService.js +80 -16
  91. package/dist/Shared.Index.d.ts +2 -0
  92. package/dist/Shared.Index.js +2 -0
  93. package/package.json +85 -85
  94. package/src/Styles/Nexus.Avatar.css +79 -0
  95. package/src/Styles/Nexus.Base.css +117 -70
  96. package/src/Styles/Nexus.Button.css +180 -153
  97. package/src/Styles/Nexus.Calendar.css +273 -275
  98. package/src/Styles/Nexus.Chat.css +1443 -1489
  99. package/src/Styles/Nexus.Choice.css +343 -345
  100. package/src/Styles/Nexus.Crud.css +168 -161
  101. package/src/Styles/Nexus.DateTime.css +81 -81
  102. package/src/Styles/Nexus.Dropdown.css +725 -774
  103. package/src/Styles/Nexus.Editor.css +295 -297
  104. package/src/Styles/Nexus.Excel.css +389 -370
  105. package/src/Styles/Nexus.Form.css +279 -321
  106. package/src/Styles/Nexus.Index.css +37 -36
  107. package/src/Styles/Nexus.Input.css +602 -637
  108. package/src/Styles/Nexus.Markdown.css +237 -265
  109. package/src/Styles/Nexus.Menu.css +237 -259
  110. package/src/Styles/Nexus.Popup.css +724 -731
  111. package/src/Styles/Nexus.RichText.css +2 -32
  112. package/src/Styles/Nexus.Rows.css +637 -596
  113. package/src/Styles/Nexus.Slider.css +276 -278
  114. package/src/Styles/Nexus.Tab.Buttons.css +432 -419
  115. package/src/Styles/Nexus.Table.css +1386 -1296
  116. package/src/Styles/Nexus.Theme.Picker.css +286 -232
  117. package/src/Styles/Nexus.Themes.css +194 -194
  118. package/src/Styles/Nexus.Time.css +144 -147
  119. package/src/Styles/Nexus.Toast.css +263 -265
  120. package/src/Styles/Nexus.Tokens.css +89 -72
  121. package/src/Styles/Nexus.Tree.css +431 -435
@@ -1,278 +1,276 @@
1
- @layer nexus.components {
2
- /*
3
- * Slider and range slider. The track and fill are drawn behind native range inputs whose own track is transparent,
4
- * so one and two thumbs look the same in every browser. Positions come from unitless fractions (0 to 1) that the
5
- * component writes to --nx-slider-start, --nx-slider-end, and --nx-slider-at: a thumb's center runs from half a thumb
6
- * in from the left edge to half a thumb in from the right.
7
- */
8
- .nx-slider {
9
- --nx-slider-thumb: 16px;
10
- --nx-slider-track: 4px;
11
- --nx-slider-accent: var(--nx-primary);
12
- /* A dark panel needs a stronger mix for the rail to stay visible. */
13
- --nx-slider-rail: light-dark(color-mix(in oklab, var(--nx-text) 14%, var(--nx-surface)), color-mix(in oklab, var(--nx-text) 24%, var(--nx-surface)));
14
- --nx-field-label-font: var(--nx-text-sm);
15
-
16
- display: flex;
17
- flex-direction: column;
18
- min-width: 0;
19
- }
20
-
21
- .nx-slider--sm {
22
- --nx-slider-thumb: 14px;
23
- --nx-slider-track: 3px;
24
- --nx-field-label-font: var(--nx-text-xs);
25
- }
26
-
27
- .nx-slider--lg {
28
- --nx-slider-thumb: 20px;
29
- --nx-slider-track: 6px;
30
- --nx-field-label-font: var(--nx-text-md);
31
- }
32
-
33
- .nx-slider__head {
34
- display: flex;
35
- align-items: baseline;
36
- justify-content: space-between;
37
- gap: var(--nx-space-3);
38
- margin-bottom: 2px;
39
- }
40
-
41
- .nx-slider__value {
42
- color: var(--nx-text);
43
- font-size: var(--nx-field-label-font);
44
- font-weight: 600;
45
- font-variant-numeric: tabular-nums;
46
- /* The same line height as the label, so a row with a value is as tall as one without. */
47
- line-height: 1.3;
48
- white-space: nowrap;
49
- }
50
-
51
- /* Taller than the thumb, so the hover and focus rings have room. */
52
- .nx-slider__control {
53
- position: relative;
54
- height: calc(var(--nx-slider-thumb) + 12px);
55
- }
56
-
57
- .nx-slider--range .nx-slider__control {
58
- cursor: pointer;
59
- touch-action: none;
60
- }
61
-
62
- .nx-slider__track {
63
- position: absolute;
64
- top: 50%;
65
- right: 0;
66
- left: 0;
67
- height: var(--nx-slider-track);
68
- border-radius: var(--nx-radius-full);
69
- background: var(--nx-slider-rail);
70
- transform: translateY(-50%);
71
- pointer-events: none;
72
- }
73
-
74
- .nx-slider__fill {
75
- position: absolute;
76
- top: 0;
77
- bottom: 0;
78
- left: calc(var(--nx-slider-thumb) / 2 + (100% - var(--nx-slider-thumb)) * var(--nx-slider-start));
79
- right: calc(100% - var(--nx-slider-thumb) / 2 - (100% - var(--nx-slider-thumb)) * var(--nx-slider-end));
80
- border-radius: inherit;
81
- background: var(--nx-slider-accent);
82
- }
83
-
84
- /* One thumb: the fill starts at the left end of the track. */
85
- .nx-slider:not(.nx-slider--range) .nx-slider__fill {
86
- left: 0;
87
- }
88
-
89
- .nx-slider__input {
90
- appearance: none;
91
- position: absolute;
92
- inset: 0;
93
- width: 100%;
94
- height: 100%;
95
- margin: 0;
96
- background: transparent;
97
- cursor: pointer;
98
- }
99
-
100
- .nx-slider__input:focus-visible {
101
- outline: none;
102
- }
103
-
104
- .nx-slider__input::-webkit-slider-runnable-track {
105
- height: 100%;
106
- background: transparent;
107
- }
108
-
109
- .nx-slider__input::-moz-range-track {
110
- height: 100%;
111
- background: transparent;
112
- }
113
-
114
- .nx-slider__input::-webkit-slider-thumb {
115
- appearance: none;
116
- box-sizing: border-box;
117
- width: var(--nx-slider-thumb);
118
- height: var(--nx-slider-thumb);
119
- margin-top: 6px;
120
- border: 2px solid var(--nx-slider-accent);
121
- border-radius: 50%;
122
- background: var(--nx-surface);
123
- box-shadow: var(--nx-shadow-sm);
124
- transition: box-shadow var(--nx-duration);
125
- }
126
-
127
- .nx-slider__input::-moz-range-thumb {
128
- box-sizing: border-box;
129
- width: var(--nx-slider-thumb);
130
- height: var(--nx-slider-thumb);
131
- border: 2px solid var(--nx-slider-accent);
132
- border-radius: 50%;
133
- background: var(--nx-surface);
134
- box-shadow: var(--nx-shadow-sm);
135
- transition: box-shadow var(--nx-duration);
136
- }
137
-
138
- .nx-slider__input:hover::-webkit-slider-thumb {
139
- box-shadow: 0 0 0 5px color-mix(in oklab, var(--nx-slider-accent) 16%, transparent);
140
- }
141
-
142
- .nx-slider__input:hover::-moz-range-thumb {
143
- box-shadow: 0 0 0 5px color-mix(in oklab, var(--nx-slider-accent) 16%, transparent);
144
- }
145
-
146
- .nx-slider__input:focus-visible::-webkit-slider-thumb {
147
- box-shadow: var(--nx-focus-ring);
148
- }
149
-
150
- .nx-slider__input:focus-visible::-moz-range-thumb {
151
- box-shadow: var(--nx-focus-ring);
152
- }
153
-
154
- .nx-slider__input:active::-webkit-slider-thumb {
155
- box-shadow: 0 0 0 7px color-mix(in oklab, var(--nx-slider-accent) 22%, transparent);
156
- }
157
-
158
- .nx-slider__input:active::-moz-range-thumb {
159
- box-shadow: 0 0 0 7px color-mix(in oklab, var(--nx-slider-accent) 22%, transparent);
160
- }
161
-
162
- /* Two thumbs: each input takes the pointer only on its thumb; the one moved last sits on top. */
163
- .nx-slider--range .nx-slider__input {
164
- pointer-events: none;
165
- }
166
-
167
- .nx-slider--range .nx-slider__input::-webkit-slider-thumb {
168
- pointer-events: auto;
169
- }
170
-
171
- .nx-slider--range .nx-slider__input::-moz-range-thumb {
172
- pointer-events: auto;
173
- }
174
-
175
- .nx-slider__control[data-active="0"] .nx-slider__input:first-of-type,
176
- .nx-slider__control[data-active="1"] .nx-slider__input:last-of-type {
177
- z-index: 1;
178
- }
179
-
180
- /* The value above the thumb */
181
- .nx-slider__tooltip {
182
- position: absolute;
183
- z-index: 2;
184
- bottom: calc(100% - 2px);
185
- left: calc(var(--nx-slider-thumb) / 2 + (100% - var(--nx-slider-thumb)) * var(--nx-slider-at));
186
- padding: 3px 7px;
187
- border-radius: var(--nx-radius-sm);
188
- background: var(--nx-text);
189
- color: var(--nx-surface);
190
- font-size: var(--nx-text-xs);
191
- font-weight: 600;
192
- font-variant-numeric: tabular-nums;
193
- line-height: 1.3;
194
- white-space: nowrap;
195
- opacity: 0;
196
- transform: translate(-50%, 4px);
197
- pointer-events: none;
198
- transition:
199
- opacity var(--nx-duration),
200
- transform var(--nx-duration);
201
- }
202
-
203
- .nx-slider__input:is(:hover, :focus-visible, :active) + .nx-slider__tooltip {
204
- opacity: 1;
205
- transform: translate(-50%, 0);
206
- }
207
-
208
- /* Marks under the track: clickable labels, centered on their point; the end marks line up with the track's ends. */
209
- .nx-slider__marks {
210
- position: relative;
211
- height: 1.4em;
212
- margin-top: -2px;
213
- font-size: var(--nx-text-xs);
214
- }
215
-
216
- .nx-slider__mark {
217
- position: absolute;
218
- top: 0;
219
- left: calc(var(--nx-slider-thumb) / 2 + (100% - var(--nx-slider-thumb)) * var(--nx-slider-at));
220
- padding: 0 2px;
221
- border: 0;
222
- border-radius: var(--nx-radius-sm);
223
- background: none;
224
- color: var(--nx-text-muted);
225
- font: inherit;
226
- line-height: 1.4;
227
- white-space: nowrap;
228
- transform: translateX(-50%);
229
- cursor: pointer;
230
- }
231
-
232
- .nx-slider__mark[data-edge="start"] {
233
- left: 0;
234
- transform: none;
235
- }
236
-
237
- .nx-slider__mark[data-edge="end"] {
238
- right: 0;
239
- left: auto;
240
- transform: none;
241
- }
242
-
243
- .nx-slider__mark:hover:not(:disabled) {
244
- color: var(--nx-text);
245
- }
246
-
247
- .nx-slider > .nx-field__footer {
248
- margin-top: 4px;
249
- }
250
-
251
- /* States */
252
- .nx-slider[data-invalid] {
253
- --nx-slider-accent: var(--nx-danger);
254
- }
255
-
256
- .nx-slider[data-disabled] {
257
- opacity: 0.55;
258
- }
259
-
260
- .nx-slider[data-disabled] :is(.nx-slider__control, .nx-slider__input, .nx-slider__mark) {
261
- cursor: not-allowed;
262
- }
263
-
264
- .nx-slider[data-readonly] {
265
- --nx-slider-accent: color-mix(in oklab, var(--nx-primary) 60%, var(--nx-text-subtle));
266
- }
267
-
268
- .nx-slider[data-readonly] :is(.nx-slider__control, .nx-slider__input, .nx-slider__mark) {
269
- cursor: default;
270
- }
271
-
272
- @media (prefers-reduced-motion: reduce) {
273
- .nx-slider__tooltip,
274
- .nx-slider__input::-webkit-slider-thumb {
275
- transition: none;
276
- }
277
- }
278
- }
1
+ @layer nexus.components {
2
+ /*
3
+ * Slider and range slider. The track and fill are drawn behind native range inputs whose own track is transparent,
4
+ * so one and two thumbs look the same in every browser. Positions come from unitless fractions (0 to 1) that the
5
+ * component writes to --nx-slider-start, --nx-slider-end, and --nx-slider-at: a thumb's center runs from half a thumb
6
+ * in from the left edge to half a thumb in from the right.
7
+ */
8
+ .nx-slider {
9
+ --nx-slider-thumb: 16px;
10
+ --nx-slider-track: 4px;
11
+ --nx-slider-accent: var(--nx-primary);
12
+ /* A dark panel needs a stronger mix for the rail to stay visible. */
13
+ --nx-slider-rail: light-dark(color-mix(in oklab, var(--nx-text) 14%, var(--nx-surface)), color-mix(in oklab, var(--nx-text) 24%, var(--nx-surface)));
14
+ --nx-field-label-font: var(--nx-text-sm);
15
+
16
+ display: flex;
17
+ flex-direction: column;
18
+ min-width: 0;
19
+ }
20
+
21
+ .nx-slider--sm {
22
+ --nx-slider-thumb: 14px;
23
+ --nx-slider-track: 3px;
24
+ --nx-field-label-font: var(--nx-text-xs);
25
+ }
26
+
27
+ .nx-slider--lg {
28
+ --nx-slider-thumb: 20px;
29
+ --nx-slider-track: 6px;
30
+ --nx-field-label-font: var(--nx-text-md);
31
+ }
32
+
33
+ .nx-slider__head {
34
+ display: flex;
35
+ align-items: baseline;
36
+ justify-content: space-between;
37
+ gap: var(--nx-space-3);
38
+ margin-bottom: 2px;
39
+ }
40
+
41
+ .nx-slider__value {
42
+ color: var(--nx-text);
43
+ font-size: var(--nx-field-label-font);
44
+ font-weight: 600;
45
+ font-variant-numeric: tabular-nums;
46
+ /* The same line height as the label, so a row with a value is as tall as one without. */
47
+ line-height: 1.3;
48
+ white-space: nowrap;
49
+ }
50
+
51
+ /* Taller than the thumb, so the hover and focus rings have room. */
52
+ .nx-slider__control {
53
+ position: relative;
54
+ height: calc(var(--nx-slider-thumb) + 12px);
55
+ }
56
+
57
+ .nx-slider--range .nx-slider__control {
58
+ cursor: pointer;
59
+ touch-action: none;
60
+ }
61
+
62
+ .nx-slider__track {
63
+ position: absolute;
64
+ top: 50%;
65
+ right: 0;
66
+ left: 0;
67
+ height: var(--nx-slider-track);
68
+ border-radius: var(--nx-radius-full);
69
+ background: var(--nx-slider-rail);
70
+ transform: translateY(-50%);
71
+ pointer-events: none;
72
+ }
73
+
74
+ .nx-slider__fill {
75
+ position: absolute;
76
+ top: 0;
77
+ bottom: 0;
78
+ left: calc(var(--nx-slider-thumb) / 2 + (100% - var(--nx-slider-thumb)) * var(--nx-slider-start));
79
+ right: calc(100% - var(--nx-slider-thumb) / 2 - (100% - var(--nx-slider-thumb)) * var(--nx-slider-end));
80
+ border-radius: inherit;
81
+ background: var(--nx-slider-accent);
82
+ }
83
+
84
+ /* One thumb: the fill starts at the left end of the track. */
85
+ .nx-slider:not(.nx-slider--range) .nx-slider__fill {
86
+ left: 0;
87
+ }
88
+
89
+ .nx-slider__input {
90
+ appearance: none;
91
+ position: absolute;
92
+ inset: 0;
93
+ width: 100%;
94
+ height: 100%;
95
+ margin: 0;
96
+ background: transparent;
97
+ cursor: pointer;
98
+ }
99
+
100
+ .nx-slider__input:focus-visible {
101
+ outline: none;
102
+ }
103
+
104
+ .nx-slider__input::-webkit-slider-runnable-track {
105
+ height: 100%;
106
+ background: transparent;
107
+ }
108
+
109
+ .nx-slider__input::-moz-range-track {
110
+ height: 100%;
111
+ background: transparent;
112
+ }
113
+
114
+ .nx-slider__input::-webkit-slider-thumb {
115
+ appearance: none;
116
+ box-sizing: border-box;
117
+ width: var(--nx-slider-thumb);
118
+ height: var(--nx-slider-thumb);
119
+ margin-top: 6px;
120
+ border: 2px solid var(--nx-slider-accent);
121
+ border-radius: 50%;
122
+ background: var(--nx-surface);
123
+ box-shadow: var(--nx-shadow-sm);
124
+ transition: box-shadow var(--nx-duration);
125
+ }
126
+
127
+ .nx-slider__input::-moz-range-thumb {
128
+ box-sizing: border-box;
129
+ width: var(--nx-slider-thumb);
130
+ height: var(--nx-slider-thumb);
131
+ border: 2px solid var(--nx-slider-accent);
132
+ border-radius: 50%;
133
+ background: var(--nx-surface);
134
+ box-shadow: var(--nx-shadow-sm);
135
+ transition: box-shadow var(--nx-duration);
136
+ }
137
+
138
+ .nx-slider__input:hover::-webkit-slider-thumb {
139
+ box-shadow: 0 0 0 5px color-mix(in oklab, var(--nx-slider-accent) 16%, transparent);
140
+ }
141
+
142
+ .nx-slider__input:hover::-moz-range-thumb {
143
+ box-shadow: 0 0 0 5px color-mix(in oklab, var(--nx-slider-accent) 16%, transparent);
144
+ }
145
+
146
+ .nx-slider__input:focus-visible::-webkit-slider-thumb {
147
+ box-shadow: var(--nx-focus-ring);
148
+ }
149
+
150
+ .nx-slider__input:focus-visible::-moz-range-thumb {
151
+ box-shadow: var(--nx-focus-ring);
152
+ }
153
+
154
+ .nx-slider__input:active::-webkit-slider-thumb {
155
+ box-shadow: 0 0 0 7px color-mix(in oklab, var(--nx-slider-accent) 22%, transparent);
156
+ }
157
+
158
+ .nx-slider__input:active::-moz-range-thumb {
159
+ box-shadow: 0 0 0 7px color-mix(in oklab, var(--nx-slider-accent) 22%, transparent);
160
+ }
161
+
162
+ /* Two thumbs: each input takes the pointer only on its thumb; the one moved last sits on top. */
163
+ .nx-slider--range .nx-slider__input {
164
+ pointer-events: none;
165
+ }
166
+
167
+ .nx-slider--range .nx-slider__input::-webkit-slider-thumb {
168
+ pointer-events: auto;
169
+ }
170
+
171
+ .nx-slider--range .nx-slider__input::-moz-range-thumb {
172
+ pointer-events: auto;
173
+ }
174
+
175
+ .nx-slider__control[data-active="0"] .nx-slider__input:first-of-type,
176
+ .nx-slider__control[data-active="1"] .nx-slider__input:last-of-type {
177
+ z-index: 1;
178
+ }
179
+
180
+ /* The value above the thumb */
181
+ .nx-slider__tooltip {
182
+ position: absolute;
183
+ z-index: 2;
184
+ bottom: calc(100% - 2px);
185
+ left: calc(var(--nx-slider-thumb) / 2 + (100% - var(--nx-slider-thumb)) * var(--nx-slider-at));
186
+ padding: 3px 7px;
187
+ border-radius: var(--nx-radius-sm);
188
+ background: var(--nx-text);
189
+ color: var(--nx-surface);
190
+ font-size: var(--nx-text-xs);
191
+ font-weight: 600;
192
+ font-variant-numeric: tabular-nums;
193
+ line-height: 1.3;
194
+ white-space: nowrap;
195
+ opacity: 0;
196
+ transform: translate(-50%, 4px);
197
+ pointer-events: none;
198
+ transition:
199
+ opacity var(--nx-duration),
200
+ transform var(--nx-duration);
201
+ }
202
+
203
+ .nx-slider__input:is(:hover, :focus-visible, :active) + .nx-slider__tooltip {
204
+ opacity: 1;
205
+ transform: translate(-50%, 0);
206
+ }
207
+
208
+ /* Marks under the track: clickable labels, centered on their point; the end marks line up with the track's ends. */
209
+ .nx-slider__marks {
210
+ position: relative;
211
+ height: 1.4em;
212
+ margin-top: -2px;
213
+ font-size: var(--nx-text-xs);
214
+ }
215
+
216
+ .nx-slider__mark {
217
+ position: absolute;
218
+ top: 0;
219
+ left: calc(var(--nx-slider-thumb) / 2 + (100% - var(--nx-slider-thumb)) * var(--nx-slider-at));
220
+ padding: 0 2px;
221
+ border: 0;
222
+ border-radius: var(--nx-radius-sm);
223
+ background: none;
224
+ color: var(--nx-text-muted);
225
+ font: inherit;
226
+ line-height: 1.4;
227
+ white-space: nowrap;
228
+ transform: translateX(-50%);
229
+ cursor: pointer;
230
+ }
231
+
232
+ .nx-slider__mark[data-edge="start"] {
233
+ left: 0;
234
+ transform: none;
235
+ }
236
+
237
+ .nx-slider__mark[data-edge="end"] {
238
+ right: 0;
239
+ left: auto;
240
+ transform: none;
241
+ }
242
+
243
+ .nx-slider__mark:hover:not(:disabled) {
244
+ color: var(--nx-text);
245
+ }
246
+
247
+ .nx-slider > .nx-field__footer {
248
+ margin-top: 4px;
249
+ }
250
+
251
+ /* States */
252
+ .nx-slider[data-invalid] {
253
+ --nx-slider-accent: var(--nx-danger);
254
+ }
255
+
256
+ .nx-slider[data-disabled] {
257
+ opacity: 0.55;
258
+ }
259
+
260
+ .nx-slider[data-disabled] :is(.nx-slider__control, .nx-slider__input, .nx-slider__mark) {
261
+ cursor: not-allowed;
262
+ }
263
+
264
+ .nx-slider[data-readonly] {
265
+ --nx-slider-accent: color-mix(in oklab, var(--nx-primary) 60%, var(--nx-text-subtle));
266
+ }
267
+
268
+ .nx-slider[data-readonly] :is(.nx-slider__control, .nx-slider__input, .nx-slider__mark) {
269
+ cursor: default;
270
+ }
271
+
272
+ [data-nx-motion="reduce"] .nx-slider__tooltip,
273
+ [data-nx-motion="reduce"] .nx-slider__input::-webkit-slider-thumb {
274
+ transition: none;
275
+ }
276
+ }