@varialkit/slider 0.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.
@@ -0,0 +1,417 @@
1
+ .solara-slider {
2
+ --slider-track-bg: var(--color-surface-300);
3
+ --slider-track-fill: var(--color-accent-primary);
4
+ --slider-thumb-bg: var(--color-surface-0);
5
+ --slider-thumb-border: var(--color-divider-primary);
6
+ --slider-thumb-hover: var(--color-surface-100);
7
+ --slider-thumb-active: var(--color-surface-0);
8
+ --slider-thumb-focus-border: var(--color-primary);
9
+ --slider-thumb-focus-halo: var(--color-primary-focus);
10
+ --slider-tooltip-bg: var(--color-text-primary);
11
+ --slider-tooltip-text: var(--color-text-inverse);
12
+ --slider-track-height: 6px;
13
+ --slider-track-radius: 9999px;
14
+ --slider-fill-end-radius: var(--slider-track-radius);
15
+ --slider-thumb-size: 20px;
16
+ // Thumb geometry defaults (knob variant uses these directly).
17
+ --slider-thumb-width: var(--slider-thumb-size);
18
+ --slider-thumb-height: var(--slider-thumb-size);
19
+ --slider-thumb-radius: 50%;
20
+ --slider-thumb-opacity: 1;
21
+ // Track padding keeps thumbs from clipping at the ends.
22
+ --slider-track-padding-offset: 0px;
23
+ --slider-track-padding: calc(var(--slider-thumb-width) / 2 + var(--slider-track-padding-offset));
24
+
25
+ display: inline-block;
26
+ width: 100%;
27
+ position: relative;
28
+ touch-action: none;
29
+ user-select: none;
30
+ font-family: var(--font-body);
31
+ }
32
+
33
+ .solara-slider__container {
34
+ position: relative;
35
+ display: flex;
36
+ align-items: center;
37
+ width: 100%;
38
+
39
+ }
40
+
41
+ .solara-slider__track-wrapper {
42
+ position: relative;
43
+ width: 100%;
44
+ height: var(--slider-thumb-size);
45
+ padding: 0 var(--slider-track-padding);
46
+ box-sizing: border-box;
47
+ cursor: pointer;
48
+ display: flex;
49
+ align-items: center;
50
+
51
+ &::before {
52
+ content: "";
53
+ position: absolute;
54
+ top: calc(var(--space-1) * -1);
55
+ bottom: calc(var(--space-1) * -1);
56
+ left: 0;
57
+ right: 0;
58
+ z-index: 1;
59
+ }
60
+ }
61
+
62
+ .solara-slider__track {
63
+ position: relative;
64
+ width: 100%;
65
+ height: var(--slider-track-height);
66
+ overflow: hidden;
67
+ border-radius: var(--slider-track-radius);
68
+ background-color: var(--slider-track-bg);
69
+ transition: background-color 0.2s ease;
70
+
71
+ &::before {
72
+ content: "";
73
+ position: absolute;
74
+ left: var(--slider-range-start, 0%);
75
+ top: 0;
76
+ height: 100%;
77
+ width: calc(var(--slider-range-end, 0%) - var(--slider-range-start, 0%));
78
+ background-color: var(--slider-track-fill);
79
+ pointer-events: none;
80
+ border-radius: var(--slider-track-radius) var(--slider-fill-end-radius) var(--slider-fill-end-radius)
81
+ var(--slider-track-radius);
82
+ transition: width 0.15s ease-out, left 0.15s ease-out;
83
+ }
84
+ }
85
+
86
+ .solara-slider__range {
87
+ position: absolute;
88
+ pointer-events: none;
89
+ height: 100%;
90
+ width: 100%;
91
+ opacity: 0;
92
+ }
93
+
94
+ .solara-slider__input {
95
+ position: absolute;
96
+ width: 100%;
97
+ height: 100%;
98
+ top: 0;
99
+ left: 0;
100
+ opacity: 0;
101
+ margin: 0;
102
+ cursor: pointer;
103
+ z-index: 3;
104
+
105
+ &:focus-visible~.solara-slider__thumb {
106
+ border-color: var(--slider-thumb-focus-border);
107
+ box-shadow: 0 0 0 2px var(--slider-thumb-focus-halo);
108
+ outline: none;
109
+ }
110
+
111
+ &:disabled {
112
+ cursor: not-allowed;
113
+ }
114
+ }
115
+
116
+ .solara-slider__input--range {
117
+ pointer-events: none;
118
+ }
119
+
120
+ .solara-slider--vertical .solara-slider__input {
121
+ pointer-events: none;
122
+ }
123
+
124
+ .solara-slider__thumb {
125
+ position: absolute;
126
+ top: 50%;
127
+ left: var(--slider-progress, 0%);
128
+ width: var(--slider-thumb-width);
129
+ height: var(--slider-thumb-height);
130
+ background-color: var(--slider-thumb-bg);
131
+ border-radius: var(--slider-thumb-radius);
132
+ border: 1px solid var(--slider-thumb-border);
133
+ box-shadow: var(--elevation-1);
134
+ opacity: var(--slider-thumb-opacity);
135
+ z-index: 2;
136
+ pointer-events: none;
137
+ transform: translate(-50%, -50%);
138
+ transition:
139
+ left 0.15s ease-out,
140
+ background-color 0.2s ease,
141
+ box-shadow 0.2s ease,
142
+ transform 0.2s ease,
143
+ border-color 0.2s ease;
144
+ }
145
+
146
+ .solara-slider__thumb--lower {
147
+ z-index: 2;
148
+ }
149
+
150
+ .solara-slider__thumb--upper {
151
+ z-index: 3;
152
+ }
153
+
154
+ .solara-slider__tooltip-trigger {
155
+ position: absolute;
156
+ top: 50%;
157
+ left: var(--slider-progress, 0%);
158
+ display: block;
159
+ width: 1px;
160
+ height: 1px;
161
+ pointer-events: none;
162
+ transform: translate(-50%, -50%);
163
+ z-index: 4;
164
+ }
165
+
166
+ .solara-slider__tooltip-anchor {
167
+ display: block;
168
+ width: 1px;
169
+ height: 1px;
170
+ pointer-events: none;
171
+ }
172
+
173
+ .solara-slider--vertical .solara-slider__tooltip-trigger {
174
+ top: auto;
175
+ left: 50%;
176
+ bottom: var(--slider-progress, 0%);
177
+ transform: translate(-50%, 50%);
178
+ }
179
+
180
+ .solara-slider:hover:not(.solara-slider--disabled) .solara-slider__thumb {
181
+ background-color: var(--slider-thumb-hover);
182
+ border-color: var(--color-divider-accent);
183
+ box-shadow: var(--elevation-2);
184
+ }
185
+
186
+ .solara-slider--dragging .solara-slider__thumb {
187
+ background-color: var(--slider-thumb-active);
188
+ border-color: var(--color-divider-accent);
189
+ box-shadow: var(--elevation-3);
190
+ transition: background-color 0.1s ease, box-shadow 0.1s ease, border-color 0.1s ease;
191
+ }
192
+
193
+ .solara-slider__tooltip {
194
+ position: absolute;
195
+ bottom: 100%;
196
+ left: 50%;
197
+ transform: translateX(-50%) translateY(-6px);
198
+ background-color: var(--slider-tooltip-bg);
199
+ color: var(--slider-tooltip-text);
200
+ padding: 2px 6px;
201
+ border-radius: 4px;
202
+ font-size: var(--font-size-caption-scaled);
203
+ line-height: var(--line-height-caption-scaled);
204
+ white-space: nowrap;
205
+ box-shadow: var(--elevation-1);
206
+ pointer-events: none;
207
+ z-index: 10;
208
+ transition: opacity 0.15s ease, transform 0.15s ease;
209
+
210
+ &::after {
211
+ content: "";
212
+ position: absolute;
213
+ top: 100%;
214
+ left: 50%;
215
+ transform: translateX(-50%);
216
+ border-width: 4px;
217
+ border-style: solid;
218
+ border-color: var(--slider-tooltip-bg) transparent transparent transparent;
219
+ }
220
+ }
221
+
222
+ .solara-slider--vertical {
223
+ height: 100%;
224
+ width: var(--slider-thumb-size);
225
+ }
226
+
227
+ .solara-slider--vertical .solara-slider__container {
228
+ height: 100%;
229
+ width: var(--slider-thumb-size);
230
+ }
231
+
232
+ .solara-slider--vertical .solara-slider__track-wrapper {
233
+ width: var(--slider-thumb-size);
234
+ height: 100%;
235
+ padding: var(--slider-track-padding) 0;
236
+ justify-content: center;
237
+ }
238
+
239
+ .solara-slider--vertical .solara-slider__track {
240
+ width: var(--slider-track-height);
241
+ height: 100%;
242
+ }
243
+
244
+ .solara-slider--vertical .solara-slider__track::before {
245
+ left: 0;
246
+ top: auto;
247
+ bottom: var(--slider-range-start, 0%);
248
+ width: 100%;
249
+ height: calc(var(--slider-range-end, 0%) - var(--slider-range-start, 0%));
250
+ border-radius: var(--slider-track-radius) var(--slider-track-radius) var(--slider-fill-end-radius)
251
+ var(--slider-fill-end-radius);
252
+ transition: height 0.15s ease-out, bottom 0.15s ease-out;
253
+ }
254
+
255
+ .solara-slider--vertical .solara-slider__thumb {
256
+ top: auto;
257
+ left: 50%;
258
+ bottom: var(--slider-progress, 0%);
259
+ transform: translate(-50%, 50%);
260
+ transition:
261
+ bottom 0.15s ease-out,
262
+ background-color 0.2s ease,
263
+ box-shadow 0.2s ease,
264
+ transform 0.2s ease,
265
+ border-color 0.2s ease;
266
+ }
267
+
268
+ .solara-slider--vertical .solara-slider__tooltip {
269
+ bottom: auto;
270
+ left: 100%;
271
+ top: 50%;
272
+ transform: translateY(-50%) translateX(8px);
273
+
274
+ &::after {
275
+ top: 50%;
276
+ left: 0;
277
+ transform: translateY(-50%) translateX(-100%);
278
+ border-color: transparent var(--slider-tooltip-bg) transparent transparent;
279
+ }
280
+ }
281
+
282
+ .solara-slider--size-small {
283
+ --slider-track-height: 4px;
284
+ --slider-thumb-size: 16px;
285
+ }
286
+
287
+ .solara-slider--size-medium {
288
+ --slider-track-height: 6px;
289
+ --slider-thumb-size: 20px;
290
+ }
291
+
292
+ .solara-slider--size-large {
293
+ --slider-track-height: 8px;
294
+ --slider-thumb-size: 24px;
295
+ }
296
+
297
+ .solara-slider--size-xlarge {
298
+ --slider-track-height: 12px;
299
+ --slider-thumb-size: 30px;
300
+ }
301
+
302
+ .solara-slider--type-knob {
303
+ --slider-thumb-width: var(--slider-thumb-size);
304
+ --slider-thumb-height: var(--slider-thumb-size);
305
+ --slider-thumb-radius: 50%;
306
+ --slider-track-padding-offset: 1px;
307
+ }
308
+
309
+ .solara-slider--type-thumb {
310
+ --slider-thumb-size: var(--slider-track-height);
311
+ --slider-thumb-width: 5px;
312
+ --slider-thumb-height: calc(var(--slider-track-height) - var(--slider-thumb-gap));
313
+ --slider-thumb-radius: 9999px;
314
+ --slider-fill-end-radius: 6px;
315
+ --slider-thumb-border: transparent;
316
+ --slider-thumb-opacity: 0.65;
317
+ // Extra horizontal padding so the thumb doesn't clip at track edges.
318
+ --slider-track-padding-offset: 4px;
319
+ // Pull the thumb slightly inside the filled bar end.
320
+ --slider-thumb-inset: 5px;
321
+ // Vertical breathing room between thumb and track edges.
322
+ --slider-thumb-gap: 3px;
323
+ }
324
+
325
+ .solara-slider--type-thumb .solara-slider__thumb {
326
+ // Align the thumb to the track's usable width (track minus padding),
327
+ // then pull it inward so its right edge sits inside the fill.
328
+ left: calc(
329
+ var(--slider-track-padding) +
330
+ (100% - (var(--slider-track-padding) * 2)) * var(--slider-progress-decimal, 0) -
331
+ var(--slider-thumb-inset)
332
+ );
333
+ // Thumb height already accounts for gap; keep transform for alignment only.
334
+ transform: translate(-100%, -50%);
335
+ }
336
+
337
+ .solara-slider--type-thumb .solara-slider__tooltip-trigger {
338
+ left: calc(
339
+ var(--slider-track-padding) +
340
+ (100% - (var(--slider-track-padding) * 2)) * var(--slider-progress-decimal, 0) -
341
+ var(--slider-thumb-inset)
342
+ );
343
+ transform: translate(-100%, -50%);
344
+ }
345
+
346
+ .solara-slider--type-thumb.solara-slider--vertical .solara-slider__thumb {
347
+ left: 50%;
348
+ // Same idea as horizontal: clamp to usable track height and inset slightly.
349
+ bottom: calc(
350
+ var(--slider-track-padding) +
351
+ (100% - (var(--slider-track-padding) * 2)) * var(--slider-progress-decimal, 0) -
352
+ var(--slider-thumb-inset)
353
+ );
354
+ transform: translate(-50%, 0);
355
+ }
356
+
357
+ .solara-slider--type-thumb.solara-slider--vertical .solara-slider__tooltip-trigger {
358
+ left: 50%;
359
+ bottom: calc(
360
+ var(--slider-track-padding) +
361
+ (100% - (var(--slider-track-padding) * 2)) * var(--slider-progress-decimal, 0) -
362
+ var(--slider-thumb-inset)
363
+ );
364
+ transform: translate(-50%, 0);
365
+ }
366
+
367
+ .solara-slider--type-thumb.solara-slider--size-small {
368
+ // Smaller track but keep the thumb slim and consistent.
369
+ --slider-track-height: 12px;
370
+ --slider-thumb-width: 5px;
371
+ --slider-thumb-gap: 3px;
372
+ --slider-fill-end-radius: 5px;
373
+ --slider-track-padding-offset: 3px;
374
+ }
375
+
376
+ .solara-slider--type-thumb.solara-slider--size-medium {
377
+ // Taller track for readability with the same slim thumb width.
378
+ --slider-track-height: 16px;
379
+ --slider-thumb-width: 5px;
380
+ --slider-thumb-gap: 4px;
381
+ --slider-fill-end-radius: 6px;
382
+ --slider-track-padding-offset: 6px;
383
+ }
384
+
385
+ .solara-slider--type-thumb.solara-slider--size-large {
386
+ // Larger track; increase padding so the thumb remains inset.
387
+ --slider-track-height: 19px;
388
+ --slider-thumb-width: 5px;
389
+ --slider-thumb-gap: 6px;
390
+ --slider-fill-end-radius: 8px;
391
+ --slider-track-padding-offset: 9px;
392
+ --slider-thumb-inset: 6px;
393
+ }
394
+
395
+ .solara-slider--type-thumb.solara-slider--size-xlarge {
396
+ // Extra-large track with more breathing room.
397
+ --slider-track-height: 24px;
398
+ --slider-thumb-width: 5px;
399
+ --slider-track-padding-offset: 10px;
400
+ --slider-thumb-inset: 7px;
401
+ --slider-thumb-gap: 8px;
402
+ --slider-fill-end-radius: 10px;
403
+ }
404
+
405
+ .solara-slider--disabled {
406
+ opacity: 0.6;
407
+ cursor: not-allowed;
408
+ }
409
+
410
+ .solara-slider--disabled .solara-slider__track-wrapper,
411
+ .solara-slider--disabled .solara-slider__input {
412
+ cursor: not-allowed;
413
+ }
414
+
415
+ .solara-slider--dragging .solara-slider__track::before {
416
+ transition: none;
417
+ }