nexus-shared 3.1.0 → 3.2.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 (104) hide show
  1. package/CHANGELOG.md +704 -446
  2. package/LICENSE +21 -21
  3. package/README.md +44 -5
  4. package/dist/Client.Index.d.ts +3 -0
  5. package/dist/Client.Index.js +3 -0
  6. package/dist/Components/Forms/Crud.js +322 -161
  7. package/dist/Components/Forms/CrudHistory.d.ts +66 -0
  8. package/dist/Components/Forms/CrudHistory.js +140 -0
  9. package/dist/Components/Forms/CrudParts.js +2 -1
  10. package/dist/Components/Forms/Form.js +4 -1
  11. package/dist/Components/Inputs/CodeBox.d.ts +69 -0
  12. package/dist/Components/Inputs/CodeBox.js +316 -0
  13. package/dist/Components/Inputs/DatePicker.js +4 -1
  14. package/dist/Components/Inputs/DateRangePicker.js +4 -1
  15. package/dist/Components/Inputs/DateTimePicker.js +4 -1
  16. package/dist/Components/Inputs/Dropdown.js +4 -1
  17. package/dist/Components/Inputs/InputRenderer.js +3 -0
  18. package/dist/Components/Inputs/NumberBox.js +4 -2
  19. package/dist/Components/Inputs/TextArea.js +4 -1
  20. package/dist/Components/Inputs/TextBox.js +4 -1
  21. package/dist/Components/Inputs/TimePicker.js +4 -1
  22. package/dist/Components/Inputs/TreeView.d.ts +55 -5
  23. package/dist/Components/Inputs/TreeView.js +372 -23
  24. package/dist/Components/Layouts/ThemePicker.d.ts +3 -2
  25. package/dist/Components/Layouts/ThemePicker.js +16 -4
  26. package/dist/Components/Viewers/DataTable.js +63 -21
  27. package/dist/Components/Viewers/DataTableParts.d.ts +26 -8
  28. package/dist/Components/Viewers/DataTableParts.js +39 -10
  29. package/dist/Helpers/ApiModules.d.ts +3 -34
  30. package/dist/Helpers/ApiModules.js +3 -3
  31. package/dist/Helpers/ApiRoutes.d.ts +68 -26
  32. package/dist/Helpers/ApiRoutes.js +31 -27
  33. package/dist/Helpers/ArrayHelpers.d.ts +0 -0
  34. package/dist/Helpers/ArrayHelpers.js +2 -0
  35. package/dist/Helpers/CodeHelpers.d.ts +97 -0
  36. package/dist/Helpers/CodeHelpers.js +332 -0
  37. package/dist/Helpers/CrudBackend.d.ts +94 -4
  38. package/dist/Helpers/CrudBackend.js +168 -9
  39. package/dist/Helpers/CrudColumns.d.ts +51 -0
  40. package/dist/Helpers/CrudColumns.js +69 -0
  41. package/dist/Helpers/CrudHelpers.d.ts +50 -5
  42. package/dist/Helpers/CrudHelpers.js +109 -12
  43. package/dist/Helpers/InputParamsHelpers.js +8 -0
  44. package/dist/Helpers/MessageBuilder.js +2 -0
  45. package/dist/Helpers/NexusHelpers.d.ts +0 -0
  46. package/dist/Helpers/NexusHelpers.js +1 -0
  47. package/dist/Helpers/RequestCache.d.ts +35 -0
  48. package/dist/Helpers/RequestCache.js +113 -0
  49. package/dist/Helpers/TableExport.js +12 -12
  50. package/dist/Helpers/TableHelpers.d.ts +1 -1
  51. package/dist/Helpers/TableHelpers.js +7 -2
  52. package/dist/Helpers/TableJoins.d.ts +70 -0
  53. package/dist/Helpers/TableJoins.js +250 -0
  54. package/dist/Helpers/TableStore.d.ts +5 -0
  55. package/dist/Helpers/TableStore.js +9 -0
  56. package/dist/Helpers/TreeStore.d.ts +225 -11
  57. package/dist/Helpers/TreeStore.js +683 -90
  58. package/dist/Helpers/UserPreferences.d.ts +8 -0
  59. package/dist/Helpers/UserPreferences.js +17 -0
  60. package/dist/Interfaces/CrudInterfaces.d.ts +47 -9
  61. package/dist/Interfaces/FormInterfaces.d.ts +4 -1
  62. package/dist/Interfaces/InputInterfaces.d.ts +24 -0
  63. package/dist/Interfaces/MessageInterfaces.d.ts +1 -1
  64. package/dist/Interfaces/PreferenceInterfaces.d.ts +8 -0
  65. package/dist/Interfaces/PreferenceInterfaces.js +2 -5
  66. package/dist/Interfaces/TableInterfaces.d.ts +86 -4
  67. package/dist/Services/ApiProxy.d.ts +36 -1
  68. package/dist/Services/ApiProxy.js +182 -52
  69. package/dist/Services/ApiProxyRules.d.ts +203 -0
  70. package/dist/Services/ApiProxyRules.js +426 -0
  71. package/dist/Services/JoinSources.d.ts +48 -0
  72. package/dist/Services/JoinSources.js +74 -0
  73. package/dist/Services/ServerApi.d.ts +13 -2
  74. package/dist/Services/ServerApi.js +8 -3
  75. package/dist/Shared.Index.d.ts +4 -0
  76. package/dist/Shared.Index.js +4 -0
  77. package/package.json +87 -85
  78. package/src/Styles/Nexus.Avatar.css +79 -79
  79. package/src/Styles/Nexus.Base.css +117 -117
  80. package/src/Styles/Nexus.Button.css +180 -180
  81. package/src/Styles/Nexus.Calendar.css +273 -273
  82. package/src/Styles/Nexus.Chat.css +1443 -1443
  83. package/src/Styles/Nexus.Choice.css +343 -343
  84. package/src/Styles/Nexus.Crud.css +168 -168
  85. package/src/Styles/Nexus.DateTime.css +81 -81
  86. package/src/Styles/Nexus.Dropdown.css +725 -725
  87. package/src/Styles/Nexus.Editor.css +295 -295
  88. package/src/Styles/Nexus.Excel.css +389 -389
  89. package/src/Styles/Nexus.Form.css +279 -279
  90. package/src/Styles/Nexus.Index.css +37 -37
  91. package/src/Styles/Nexus.Input.css +196 -4
  92. package/src/Styles/Nexus.Markdown.css +237 -237
  93. package/src/Styles/Nexus.Menu.css +237 -237
  94. package/src/Styles/Nexus.Popup.css +724 -724
  95. package/src/Styles/Nexus.Rows.css +637 -637
  96. package/src/Styles/Nexus.Slider.css +276 -276
  97. package/src/Styles/Nexus.Tab.Buttons.css +432 -432
  98. package/src/Styles/Nexus.Table.css +31 -30
  99. package/src/Styles/Nexus.Theme.Picker.css +59 -3
  100. package/src/Styles/Nexus.Themes.css +194 -194
  101. package/src/Styles/Nexus.Time.css +144 -144
  102. package/src/Styles/Nexus.Toast.css +263 -263
  103. package/src/Styles/Nexus.Tokens.css +89 -89
  104. package/src/Styles/Nexus.Tree.css +500 -431
@@ -1,276 +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
- [data-nx-motion="reduce"] .nx-slider__tooltip,
273
- [data-nx-motion="reduce"] .nx-slider__input::-webkit-slider-thumb {
274
- transition: none;
275
- }
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
+ [data-nx-motion="reduce"] .nx-slider__tooltip,
273
+ [data-nx-motion="reduce"] .nx-slider__input::-webkit-slider-thumb {
274
+ transition: none;
275
+ }
276
+ }