@fab1o978/react-ui 0.1.5 → 0.1.8

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.
@@ -121,48 +121,6 @@
121
121
  box-shadow: 0 0 0 1.5px rgba(0, 0, 0, 0.2), 0 2px 4px rgba(0, 0, 0, 0.2);
122
122
  background: transparent;
123
123
  }
124
- .ColorPicker_module_lSlider2 {
125
- position: relative;
126
- height: 10px;
127
- border-radius: 5px;
128
- cursor: ew-resize;
129
- margin-block: 5px;
130
- background-color: var(--color-neutral-200);
131
- box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2);
132
- }
133
- .ColorPicker_module_lThumb2 {
134
- position: absolute;
135
- top: 50%;
136
- width: 20px;
137
- height: 20px;
138
- border-radius: 50%;
139
- transform: translate(-50%, -50%);
140
- background: white;
141
- border: 2px solid rgba(0, 0, 0, 0.2);
142
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.25);
143
- pointer-events: none;
144
- }
145
- .ColorPicker_module_alphaSlider2 {
146
- position: relative;
147
- height: 10px;
148
- border-radius: 5px;
149
- cursor: ew-resize;
150
- margin-block: 5px;
151
- background-color: var(--color-neutral-200);
152
- box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2);
153
- }
154
- .ColorPicker_module_alphaThumb2 {
155
- position: absolute;
156
- top: 50%;
157
- width: 20px;
158
- height: 20px;
159
- border-radius: 50%;
160
- transform: translate(-50%, -50%);
161
- background: white;
162
- border: 2px solid rgba(0, 0, 0, 0.2);
163
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.25);
164
- pointer-events: none;
165
- }
166
124
  .ColorPicker_module_previewSwatch2 {
167
125
  width: 100%;
168
126
  height: 48px;
@@ -315,4 +273,204 @@
315
273
  padding: 0;
316
274
  flex-shrink: 0;
317
275
  }
276
+
277
+ /* src/components/SliderControl/SliderControl.module.scss */
278
+ :root {
279
+ --accent: #3b82f6;
280
+ --accent-dot: rgb(82.52, 145, 247.08);
281
+ --accent-track: #3b82f6;
282
+ --accent-ring: #3b82f6;
283
+ --accent-glow: rgba(59, 130, 246, 0.3);
284
+ --accent-light: rgb(157.485, 188.725, 239.765);
285
+ --color-primary-50: rgb(169.3455, 194.6925, 236.1045);
286
+ --color-primary-100: rgb(149.4545, 184.4575, 241.6455);
287
+ --color-primary-400: rgb(82.52, 145, 247.08);
288
+ --color-primary-500: #3b82f6;
289
+ --color-primary-600: rgb(29.8390243902, 111.4024390244, 244.6609756098);
290
+ --color-primary-700: rgb(10.712195122, 95.2195121951, 233.287804878);
291
+ --color-neutral-0: #ffffff;
292
+ --color-neutral-100: #f3f4f6;
293
+ --color-neutral-200: #e5e7eb;
294
+ --color-neutral-400: #9ca3af;
295
+ --color-neutral-600: #4b5563;
296
+ --color-neutral-900: #111827;
297
+ --color-success-500: #22c55e;
298
+ --color-success-600: #16a34a;
299
+ --color-danger-500: #ef4444;
300
+ --color-danger-600: #dc2626;
301
+ --color-warning-500: #f59e0b;
302
+ --color-warning-600: #d97706;
303
+ --font-family-base:
304
+ "Inter",
305
+ system-ui,
306
+ -apple-system,
307
+ sans-serif;
308
+ --font-size-xs: 0.75rem;
309
+ --font-size-sm: 0.875rem;
310
+ --font-size-md: 1rem;
311
+ --font-size-lg: 1.125rem;
312
+ --spacing-1: 0.25rem;
313
+ --spacing-2: 0.5rem;
314
+ --spacing-3: 0.75rem;
315
+ --spacing-4: 1rem;
316
+ --radius-sm: 0.25rem;
317
+ --radius-md: 0.375rem;
318
+ --radius-lg: 0.5rem;
319
+ --radius-full: 9999px;
320
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
321
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
322
+ --transition-fast: 150ms ease;
323
+ --color-surface: #ffffff;
324
+ --color-surface-elevated: #ffffff;
325
+ }
326
+ [data-theme=dark] {
327
+ --color-neutral-0: #0f172a;
328
+ --color-neutral-100: #1e293b;
329
+ --color-neutral-200: #334155;
330
+ --color-neutral-400: #94a3b8;
331
+ --color-neutral-600: #cbd5e1;
332
+ --color-neutral-900: #f8fafc;
333
+ --color-surface: #1e293b;
334
+ --color-surface-elevated: #273549;
335
+ --color-primary-50: #172554;
336
+ --color-primary-100: #1e3a8a;
337
+ --accent-light: #172554;
338
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.4);
339
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.5), 0 2px 4px -2px rgb(0 0 0 / 0.4);
340
+ }
341
+ .SliderControl_module_wrapper2 {
342
+ display: flex;
343
+ align-items: center;
344
+ gap: 10px;
345
+ font-family: var(--font-family-base);
346
+ user-select: none;
347
+ -webkit-user-select: none;
348
+ }
349
+ .SliderControl_module_disabled2 {
350
+ opacity: 0.45;
351
+ pointer-events: none;
352
+ }
353
+ .SliderControl_module_icon2 {
354
+ display: flex;
355
+ align-items: center;
356
+ justify-content: center;
357
+ color: var(--color-neutral-400);
358
+ flex-shrink: 0;
359
+ line-height: 0;
360
+ }
361
+ .SliderControl_module_trackArea2 {
362
+ position: relative;
363
+ flex: 1;
364
+ height: 36px;
365
+ display: flex;
366
+ align-items: center;
367
+ cursor: pointer;
368
+ }
369
+ .SliderControl_module_groove2 {
370
+ position: relative;
371
+ width: 100%;
372
+ height: 22px;
373
+ border-radius: var(--radius-full);
374
+ background: var(--color-neutral-300);
375
+ display: flex;
376
+ align-items: center;
377
+ box-shadow:
378
+ inset 0 4px 8px rgba(0, 0, 0, 0.14),
379
+ inset 0 2px 4px rgba(0, 0, 0, 0.06),
380
+ inset 0 -2px 3px rgba(255, 255, 255, 0.1);
381
+ }
382
+ .SliderControl_module_rail2 {
383
+ position: absolute;
384
+ left: 8px;
385
+ right: 8px;
386
+ height: 6px;
387
+ border-radius: var(--radius-full);
388
+ background: var(--color-neutral-400);
389
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.3), inset 0 1px 1px rgba(0, 0, 0, 0.18);
390
+ overflow: hidden;
391
+ }
392
+ .SliderControl_module_fill2 {
393
+ position: absolute;
394
+ top: 0;
395
+ left: 0;
396
+ height: 100%;
397
+ background: var(--slider-accent-track, var(--accent-track));
398
+ border-radius: var(--radius-full);
399
+ transition: width 60ms linear;
400
+ }
401
+ .SliderControl_module_thumb2 {
402
+ position: absolute;
403
+ top: 50%;
404
+ width: 18px;
405
+ height: 18px;
406
+ border-radius: 50%;
407
+ transform: translate(-50%, -50%);
408
+ background: #dde0e6;
409
+ border: 1px solid rgba(0, 0, 0, 0.1);
410
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.22);
411
+ cursor: grab;
412
+ transition: box-shadow 120ms ease, transform 120ms ease;
413
+ outline: none;
414
+ z-index: 2;
415
+ }
416
+ .SliderControl_module_thumb2:focus-visible {
417
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.22), 0 0 0 3px var(--slider-accent-ring, var(--accent-ring));
418
+ }
419
+ .SliderControl_module_thumbDragging2 {
420
+ cursor: grabbing;
421
+ transform: translate(-50%, -50%) scale(1.08);
422
+ box-shadow:
423
+ 0 1px 4px rgba(0, 0, 0, 0.28),
424
+ 0 0 0 3px var(--slider-accent-ring, var(--accent-ring)),
425
+ 0 0 0 6px var(--slider-accent-glow, var(--accent-glow));
426
+ }
427
+ .SliderControl_module_tooltip2 {
428
+ position: absolute;
429
+ bottom: calc(100% + 6px);
430
+ transform: translateX(-50%);
431
+ background: rgba(18, 18, 26, 0.85);
432
+ backdrop-filter: blur(6px);
433
+ -webkit-backdrop-filter: blur(6px);
434
+ color: #fff;
435
+ font-size: 11px;
436
+ font-weight: 600;
437
+ letter-spacing: 0.02em;
438
+ padding: 3px 8px;
439
+ border-radius: 6px;
440
+ white-space: nowrap;
441
+ pointer-events: none;
442
+ opacity: 0;
443
+ transition: opacity 120ms ease;
444
+ z-index: 10;
445
+ }
446
+ .SliderControl_module_tooltip2::after {
447
+ content: "";
448
+ position: absolute;
449
+ top: 100%;
450
+ left: 50%;
451
+ transform: translateX(-50%);
452
+ border: 4px solid transparent;
453
+ border-top-color: rgba(18, 18, 26, 0.85);
454
+ }
455
+ .SliderControl_module_tooltipVisible2 {
456
+ opacity: 1;
457
+ }
458
+ [data-theme=dark] .SliderControl_module_groove2 {
459
+ box-shadow:
460
+ inset 0 1px 0 rgba(255, 255, 255, 0.07),
461
+ inset 0 3px 7px rgba(0, 0, 0, 0.32),
462
+ inset 0 1px 3px rgba(0, 0, 0, 0.22),
463
+ inset 0 -2px 3px rgba(255, 255, 255, 0.04);
464
+ }
465
+ [data-theme=dark] .SliderControl_module_thumb2 {
466
+ background: #4a4f5c;
467
+ border-color: rgba(255, 255, 255, 0.08);
468
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.45);
469
+ }
470
+ [data-theme=dark] .SliderControl_module_thumbDragging2 {
471
+ box-shadow:
472
+ 0 1px 4px rgba(0, 0, 0, 0.5),
473
+ 0 0 0 3px var(--slider-accent-ring, var(--accent-ring)),
474
+ 0 0 0 6px var(--slider-accent-glow, var(--accent-glow));
475
+ }
318
476
  /*# sourceMappingURL=index.css.map */
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/styles/tokens.scss","../../../src/components/ColorPicker/ColorPicker.module.scss"],"sourcesContent":["@use \"sass:color\";\n\n@import url(\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap\");\n\n// Accent di default — cambia qui per aggiornare tutta la libreria\n$accent: #3b82f6;\n\n:root {\n // Accent scale — derivata da $accent a compile time\n --accent: #{$accent};\n --accent-dot: #{color.scale($accent, $lightness: 12%)};\n --accent-track: #{$accent};\n --accent-ring: #{$accent};\n --accent-glow: #{color.change($accent, $alpha: 0.3)};\n --accent-light: #{color.scale($accent, $lightness: 45%, $saturation: -20%)};\n\n // Primary scale (mantenuta per retrocompatibilità con Button, Badge, Input)\n --color-primary-50: #{color.scale($accent, $lightness: 49%, $saturation: -30%)};\n --color-primary-100: #{color.scale($accent, $lightness: 42%, $saturation: -15%)};\n --color-primary-400: #{color.scale($accent, $lightness: 12%)};\n --color-primary-500: #{$accent};\n --color-primary-600: #{color.scale($accent, $lightness: -10%)};\n --color-primary-700: #{color.scale($accent, $lightness: -20%)};\n\n // Neutral\n --color-neutral-0: #ffffff;\n --color-neutral-100: #f3f4f6;\n --color-neutral-200: #e5e7eb;\n --color-neutral-400: #9ca3af;\n --color-neutral-600: #4b5563;\n --color-neutral-900: #111827;\n\n // Semantic\n --color-success-500: #22c55e;\n --color-success-600: #16a34a;\n --color-danger-500: #ef4444;\n --color-danger-600: #dc2626;\n --color-warning-500: #f59e0b;\n --color-warning-600: #d97706;\n\n // Typography\n --font-family-base: \"Inter\", system-ui, -apple-system, sans-serif;\n --font-size-xs: 0.75rem;\n --font-size-sm: 0.875rem;\n --font-size-md: 1rem;\n --font-size-lg: 1.125rem;\n\n // Spacing\n --spacing-1: 0.25rem;\n --spacing-2: 0.5rem;\n --spacing-3: 0.75rem;\n --spacing-4: 1rem;\n\n // Radius\n --radius-sm: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-full: 9999px;\n\n // Shadows\n --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n\n // Transitions\n --transition-fast: 150ms ease;\n\n // Surface (background di card/panel)\n --color-surface: #ffffff;\n --color-surface-elevated: #ffffff;\n}\n\n// ─── Dark theme ────────────────────────────────────────────────────────────────\n// Applicato via data-theme=\"dark\" sull'elemento root (gestito da Storybook decorator\n// e dall'app consumer). I componenti non devono fare nulla di speciale: basta che\n// usino i token var() e riceveranno automaticamente i valori dark.\n\n[data-theme=\"dark\"] {\n // Neutral (scala invertita)\n --color-neutral-0: #0f172a;\n --color-neutral-100: #1e293b;\n --color-neutral-200: #334155;\n --color-neutral-400: #94a3b8;\n --color-neutral-600: #cbd5e1;\n --color-neutral-900: #f8fafc;\n\n // Surface\n --color-surface: #1e293b;\n --color-surface-elevated: #273549;\n\n // Primary scale dark (per il default accent blu — le sfumature chiare diventano scure)\n --color-primary-50: #172554;\n --color-primary-100: #1e3a8a;\n // 400 / 500 / 600 / 700 rimangono invariati (abbastanza saturi su bg scuro)\n\n // Accent light: variante scura\n --accent-light: #172554;\n\n // Shadows (più forti su bg scuro)\n --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.4);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.5), 0 2px 4px -2px rgb(0 0 0 / 0.4);\n}\n","@use \"../../styles/tokens\" as *;\n\n$accent-base: var(--colorpicker-accent, var(--accent));\n$accent-ring: var(--colorpicker-accent-ring, var(--accent-ring));\n$accent-glow: var(--colorpicker-accent-glow, var(--accent-glow));\n$accent-light: var(--colorpicker-accent-light, var(--accent-light));\n\n$disc: 200px;\n$slider-w: 20px;\n$thumb-size: 20px;\n$gap: 0.5rem;\n\n// ─── Dark theme scoped sull'elemento (prop theme=\"dark\") ──────────────────────\n// Sovrascrive i token globali localmente — non dipende dal data-theme dell'app.\n\n.colorPicker[data-theme=\"dark\"] {\n --color-neutral-0: #0f172a;\n --color-neutral-100: #1e293b;\n --color-neutral-200: #334155;\n --color-neutral-400: #94a3b8;\n --color-neutral-600: #cbd5e1;\n --color-neutral-900: #f8fafc;\n --color-surface: #1e293b;\n --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.4);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.5), 0 2px 4px -2px rgb(0 0 0 / 0.4);\n}\n\n// ─── Card ──────────────────────────────────────────────────────────────────────\n\n.colorPicker {\n display: inline-flex;\n flex-direction: column;\n gap: 0.75rem;\n padding: 1rem;\n background: var(--color-surface);\n backdrop-filter: blur(16px);\n -webkit-backdrop-filter: blur(16px);\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-lg);\n box-shadow: var(--shadow-md), 0 0 0 1px rgba(0,0,0,0.04);\n font-family: var(--font-family-base);\n width: calc(#{$disc} + 2rem); // disc + card padding (1rem × 2 sides)\n box-sizing: border-box;\n user-select: none;\n}\n\n// ─── Disc + L slider row ───────────────────────────────────────────────────────\n\n.topRow {\n display: flex;\n justify-content: center;\n}\n\n.discWrapper {\n position: relative;\n width: $disc;\n height: $disc;\n flex-shrink: 0;\n border-radius: 50%;\n box-shadow: 0 0 0 1.5px var(--color-neutral-200);\n}\n\n.disc {\n display: block;\n width: $disc;\n height: $disc;\n cursor: crosshair;\n border-radius: 50%;\n}\n\n.dot {\n position: absolute;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n border: 2px solid;\n transform: translate(-50%, -50%);\n pointer-events: none;\n box-shadow: 0 0 0 1.5px rgba(0, 0, 0, 0.2), 0 2px 4px rgba(0, 0, 0, 0.2);\n background: transparent;\n}\n\n// ─── Lightness slider (horizontal) ────────────────────────────────────────────\n\n.lSlider {\n position: relative;\n height: 10px;\n border-radius: 5px;\n cursor: ew-resize;\n margin-block: 5px;\n background-color: var(--color-neutral-200);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n\n.lThumb {\n position: absolute;\n top: 50%;\n width: $thumb-size;\n height: $thumb-size;\n border-radius: 50%;\n transform: translate(-50%, -50%);\n background: white;\n border: 2px solid rgba(0, 0, 0, 0.2);\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.25);\n pointer-events: none;\n}\n\n// ─── Alpha slider (horizontal) ────────────────────────────────────────────────\n\n.alphaSlider {\n position: relative;\n height: 10px;\n border-radius: 5px;\n cursor: ew-resize;\n margin-block: 5px;\n background-color: var(--color-neutral-200);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2);\n}\n\n\n.alphaThumb {\n position: absolute;\n top: 50%;\n width: $thumb-size;\n height: $thumb-size;\n border-radius: 50%;\n transform: translate(-50%, -50%);\n background: white;\n border: 2px solid rgba(0, 0, 0, 0.2);\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.25);\n pointer-events: none;\n}\n\n// ─── Preview swatch ────────────────────────────────────────────────────────────\n\n.previewSwatch {\n width: 100%;\n height: 48px;\n border-radius: var(--radius-md);\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);\n position: relative;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 0 0.5rem;\n box-sizing: border-box;\n}\n\n.eyedropperBtn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: var(--radius-sm);\n background: rgba(255, 255, 255, 0.15);\n cursor: pointer;\n backdrop-filter: blur(4px);\n transition: background var(--transition-fast);\n\n &:hover {\n background: rgba(255, 255, 255, 0.4);\n }\n}\n\n// ─── Inputs ────────────────────────────────────────────────────────────────────\n\n.inputSection {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.tabs {\n display: flex;\n background: var(--color-neutral-100);\n border-radius: var(--radius-sm);\n padding: 2px;\n gap: 2px;\n}\n\n.tab {\n flex: 1;\n padding: 0.2rem 0;\n font-size: 0.65rem;\n font-weight: 600;\n letter-spacing: 0.04em;\n border: none;\n border-radius: calc(var(--radius-sm) - 1px);\n background: transparent;\n color: var(--color-neutral-400);\n cursor: pointer;\n transition: background var(--transition-fast), color var(--transition-fast);\n\n &:hover:not(.tabActive) {\n color: var(--color-neutral-600);\n }\n}\n\n.tabActive {\n background: $accent-base;\n color: #fff;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n}\n\n.inputWrapper {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.inputAddon {\n position: absolute;\n left: 0.5rem;\n font-size: var(--font-size-xs);\n font-family: \"SF Mono\", \"Fira Code\", \"Consolas\", monospace;\n color: var(--color-neutral-400);\n pointer-events: none;\n line-height: 1;\n}\n\n.input {\n width: 100%;\n box-sizing: border-box;\n padding: 0.4rem 2rem; // symmetric: room for # on left and copy icon on right\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-sm);\n font-size: var(--font-size-xs);\n font-family: \"SF Mono\", \"Fira Code\", \"Consolas\", monospace;\n color: var(--color-neutral-900);\n background: var(--color-neutral-0);\n outline: none;\n text-align: center;\n transition: border-color var(--transition-fast), box-shadow var(--transition-fast);\n\n &:focus {\n border-color: $accent-base;\n box-shadow: 0 0 0 2px $accent-glow;\n }\n}\n\n.inputCopyBtn {\n position: absolute;\n right: 0.35rem;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n border: none;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--color-neutral-400);\n cursor: pointer;\n transition: background var(--transition-fast), color var(--transition-fast);\n\n &:hover {\n background: var(--color-neutral-100);\n color: var(--color-neutral-900);\n }\n}\n\n\n// ─── Recent colors ─────────────────────────────────────────────────────────────\n\n.recents {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding-top: 0.25rem;\n border-top: 1px solid var(--color-neutral-100);\n overflow: hidden;\n}\n\n.recentsLabel {\n font-size: 0.6rem;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--color-neutral-400);\n flex-shrink: 0;\n}\n\n.swatches {\n display: flex;\n gap: 0.35rem;\n flex-wrap: nowrap;\n overflow: hidden;\n}\n\n.recentSwatch {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n border: 1.5px solid rgba(0, 0, 0, 0.1);\n cursor: pointer;\n padding: 0;\n flex-shrink: 0;\n}\n"],"mappings":"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","names":["colorPicker","topRow","discWrapper","disc","dot","lSlider","lThumb","alphaSlider","alphaThumb","previewSwatch","eyedropperBtn","inputSection","tabs","tab","tabActive","inputWrapper","inputAddon","input","inputCopyBtn","recents","recentsLabel","swatches","recentSwatch"]}
1
+ {"version":3,"sources":["../../../src/styles/tokens.scss","../../../src/components/ColorPicker/ColorPicker.module.scss","../../../src/styles/tokens.scss","../../../src/components/SliderControl/SliderControl.module.scss"],"sourcesContent":["@use \"sass:color\";\n\n@import url(\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap\");\n\n// Accent di default — cambia qui per aggiornare tutta la libreria\n$accent: #3b82f6;\n\n:root {\n // Accent scale — derivata da $accent a compile time\n --accent: #{$accent};\n --accent-dot: #{color.scale($accent, $lightness: 12%)};\n --accent-track: #{$accent};\n --accent-ring: #{$accent};\n --accent-glow: #{color.change($accent, $alpha: 0.3)};\n --accent-light: #{color.scale($accent, $lightness: 45%, $saturation: -20%)};\n\n // Primary scale (mantenuta per retrocompatibilità con Button, Badge, Input)\n --color-primary-50: #{color.scale($accent, $lightness: 49%, $saturation: -30%)};\n --color-primary-100: #{color.scale($accent, $lightness: 42%, $saturation: -15%)};\n --color-primary-400: #{color.scale($accent, $lightness: 12%)};\n --color-primary-500: #{$accent};\n --color-primary-600: #{color.scale($accent, $lightness: -10%)};\n --color-primary-700: #{color.scale($accent, $lightness: -20%)};\n\n // Neutral\n --color-neutral-0: #ffffff;\n --color-neutral-100: #f3f4f6;\n --color-neutral-200: #e5e7eb;\n --color-neutral-400: #9ca3af;\n --color-neutral-600: #4b5563;\n --color-neutral-900: #111827;\n\n // Semantic\n --color-success-500: #22c55e;\n --color-success-600: #16a34a;\n --color-danger-500: #ef4444;\n --color-danger-600: #dc2626;\n --color-warning-500: #f59e0b;\n --color-warning-600: #d97706;\n\n // Typography\n --font-family-base: \"Inter\", system-ui, -apple-system, sans-serif;\n --font-size-xs: 0.75rem;\n --font-size-sm: 0.875rem;\n --font-size-md: 1rem;\n --font-size-lg: 1.125rem;\n\n // Spacing\n --spacing-1: 0.25rem;\n --spacing-2: 0.5rem;\n --spacing-3: 0.75rem;\n --spacing-4: 1rem;\n\n // Radius\n --radius-sm: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-full: 9999px;\n\n // Shadows\n --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n\n // Transitions\n --transition-fast: 150ms ease;\n\n // Surface (background di card/panel)\n --color-surface: #ffffff;\n --color-surface-elevated: #ffffff;\n}\n\n// ─── Dark theme ────────────────────────────────────────────────────────────────\n// Applicato via data-theme=\"dark\" sull'elemento root (gestito da Storybook decorator\n// e dall'app consumer). I componenti non devono fare nulla di speciale: basta che\n// usino i token var() e riceveranno automaticamente i valori dark.\n\n[data-theme=\"dark\"] {\n // Neutral (scala invertita)\n --color-neutral-0: #0f172a;\n --color-neutral-100: #1e293b;\n --color-neutral-200: #334155;\n --color-neutral-400: #94a3b8;\n --color-neutral-600: #cbd5e1;\n --color-neutral-900: #f8fafc;\n\n // Surface\n --color-surface: #1e293b;\n --color-surface-elevated: #273549;\n\n // Primary scale dark (per il default accent blu — le sfumature chiare diventano scure)\n --color-primary-50: #172554;\n --color-primary-100: #1e3a8a;\n // 400 / 500 / 600 / 700 rimangono invariati (abbastanza saturi su bg scuro)\n\n // Accent light: variante scura\n --accent-light: #172554;\n\n // Shadows (più forti su bg scuro)\n --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.4);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.5), 0 2px 4px -2px rgb(0 0 0 / 0.4);\n}\n","@use \"../../styles/tokens\" as *;\n\n$accent-base: var(--colorpicker-accent, var(--accent));\n$accent-ring: var(--colorpicker-accent-ring, var(--accent-ring));\n$accent-glow: var(--colorpicker-accent-glow, var(--accent-glow));\n$accent-light: var(--colorpicker-accent-light, var(--accent-light));\n\n$disc: 200px;\n$slider-w: 20px;\n$thumb-size: 20px;\n$gap: 0.5rem;\n\n// ─── Dark theme scoped sull'elemento (prop theme=\"dark\") ──────────────────────\n// Sovrascrive i token globali localmente — non dipende dal data-theme dell'app.\n\n.colorPicker[data-theme=\"dark\"] {\n --color-neutral-0: #0f172a;\n --color-neutral-100: #1e293b;\n --color-neutral-200: #334155;\n --color-neutral-400: #94a3b8;\n --color-neutral-600: #cbd5e1;\n --color-neutral-900: #f8fafc;\n --color-surface: #1e293b;\n --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.4);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.5), 0 2px 4px -2px rgb(0 0 0 / 0.4);\n}\n\n// ─── Card ──────────────────────────────────────────────────────────────────────\n\n.colorPicker {\n display: inline-flex;\n flex-direction: column;\n gap: 0.75rem;\n padding: 1rem;\n background: var(--color-surface);\n backdrop-filter: blur(16px);\n -webkit-backdrop-filter: blur(16px);\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-lg);\n box-shadow: var(--shadow-md), 0 0 0 1px rgba(0,0,0,0.04);\n font-family: var(--font-family-base);\n width: calc(#{$disc} + 2rem); // disc + card padding (1rem × 2 sides)\n box-sizing: border-box;\n user-select: none;\n}\n\n// ─── Disc + L slider row ───────────────────────────────────────────────────────\n\n.topRow {\n display: flex;\n justify-content: center;\n}\n\n.discWrapper {\n position: relative;\n width: $disc;\n height: $disc;\n flex-shrink: 0;\n border-radius: 50%;\n box-shadow: 0 0 0 1.5px var(--color-neutral-200);\n}\n\n.disc {\n display: block;\n width: $disc;\n height: $disc;\n cursor: crosshair;\n border-radius: 50%;\n}\n\n.dot {\n position: absolute;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n border: 2px solid;\n transform: translate(-50%, -50%);\n pointer-events: none;\n box-shadow: 0 0 0 1.5px rgba(0, 0, 0, 0.2), 0 2px 4px rgba(0, 0, 0, 0.2);\n background: transparent;\n}\n\n\n// ─── Preview swatch ────────────────────────────────────────────────────────────\n\n.previewSwatch {\n width: 100%;\n height: 48px;\n border-radius: var(--radius-md);\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);\n position: relative;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 0 0.5rem;\n box-sizing: border-box;\n}\n\n.eyedropperBtn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: var(--radius-sm);\n background: rgba(255, 255, 255, 0.15);\n cursor: pointer;\n backdrop-filter: blur(4px);\n transition: background var(--transition-fast);\n\n &:hover {\n background: rgba(255, 255, 255, 0.4);\n }\n}\n\n// ─── Inputs ────────────────────────────────────────────────────────────────────\n\n.inputSection {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.tabs {\n display: flex;\n background: var(--color-neutral-100);\n border-radius: var(--radius-sm);\n padding: 2px;\n gap: 2px;\n}\n\n.tab {\n flex: 1;\n padding: 0.2rem 0;\n font-size: 0.65rem;\n font-weight: 600;\n letter-spacing: 0.04em;\n border: none;\n border-radius: calc(var(--radius-sm) - 1px);\n background: transparent;\n color: var(--color-neutral-400);\n cursor: pointer;\n transition: background var(--transition-fast), color var(--transition-fast);\n\n &:hover:not(.tabActive) {\n color: var(--color-neutral-600);\n }\n}\n\n.tabActive {\n background: $accent-base;\n color: #fff;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n}\n\n.inputWrapper {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.inputAddon {\n position: absolute;\n left: 0.5rem;\n font-size: var(--font-size-xs);\n font-family: \"SF Mono\", \"Fira Code\", \"Consolas\", monospace;\n color: var(--color-neutral-400);\n pointer-events: none;\n line-height: 1;\n}\n\n.input {\n width: 100%;\n box-sizing: border-box;\n padding: 0.4rem 2rem; // symmetric: room for # on left and copy icon on right\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-sm);\n font-size: var(--font-size-xs);\n font-family: \"SF Mono\", \"Fira Code\", \"Consolas\", monospace;\n color: var(--color-neutral-900);\n background: var(--color-neutral-0);\n outline: none;\n text-align: center;\n transition: border-color var(--transition-fast), box-shadow var(--transition-fast);\n\n &:focus {\n border-color: $accent-base;\n box-shadow: 0 0 0 2px $accent-glow;\n }\n}\n\n.inputCopyBtn {\n position: absolute;\n right: 0.35rem;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n border: none;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--color-neutral-400);\n cursor: pointer;\n transition: background var(--transition-fast), color var(--transition-fast);\n\n &:hover {\n background: var(--color-neutral-100);\n color: var(--color-neutral-900);\n }\n}\n\n\n// ─── Recent colors ─────────────────────────────────────────────────────────────\n\n.recents {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding-top: 0.25rem;\n border-top: 1px solid var(--color-neutral-100);\n overflow: hidden;\n}\n\n.recentsLabel {\n font-size: 0.6rem;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--color-neutral-400);\n flex-shrink: 0;\n}\n\n.swatches {\n display: flex;\n gap: 0.35rem;\n flex-wrap: nowrap;\n overflow: hidden;\n}\n\n.recentSwatch {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n border: 1.5px solid rgba(0, 0, 0, 0.1);\n cursor: pointer;\n padding: 0;\n flex-shrink: 0;\n}\n","@use \"sass:color\";\n\n@import url(\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap\");\n\n// Accent di default — cambia qui per aggiornare tutta la libreria\n$accent: #3b82f6;\n\n:root {\n // Accent scale — derivata da $accent a compile time\n --accent: #{$accent};\n --accent-dot: #{color.scale($accent, $lightness: 12%)};\n --accent-track: #{$accent};\n --accent-ring: #{$accent};\n --accent-glow: #{color.change($accent, $alpha: 0.3)};\n --accent-light: #{color.scale($accent, $lightness: 45%, $saturation: -20%)};\n\n // Primary scale (mantenuta per retrocompatibilità con Button, Badge, Input)\n --color-primary-50: #{color.scale($accent, $lightness: 49%, $saturation: -30%)};\n --color-primary-100: #{color.scale($accent, $lightness: 42%, $saturation: -15%)};\n --color-primary-400: #{color.scale($accent, $lightness: 12%)};\n --color-primary-500: #{$accent};\n --color-primary-600: #{color.scale($accent, $lightness: -10%)};\n --color-primary-700: #{color.scale($accent, $lightness: -20%)};\n\n // Neutral\n --color-neutral-0: #ffffff;\n --color-neutral-100: #f3f4f6;\n --color-neutral-200: #e5e7eb;\n --color-neutral-400: #9ca3af;\n --color-neutral-600: #4b5563;\n --color-neutral-900: #111827;\n\n // Semantic\n --color-success-500: #22c55e;\n --color-success-600: #16a34a;\n --color-danger-500: #ef4444;\n --color-danger-600: #dc2626;\n --color-warning-500: #f59e0b;\n --color-warning-600: #d97706;\n\n // Typography\n --font-family-base: \"Inter\", system-ui, -apple-system, sans-serif;\n --font-size-xs: 0.75rem;\n --font-size-sm: 0.875rem;\n --font-size-md: 1rem;\n --font-size-lg: 1.125rem;\n\n // Spacing\n --spacing-1: 0.25rem;\n --spacing-2: 0.5rem;\n --spacing-3: 0.75rem;\n --spacing-4: 1rem;\n\n // Radius\n --radius-sm: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-full: 9999px;\n\n // Shadows\n --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n\n // Transitions\n --transition-fast: 150ms ease;\n\n // Surface (background di card/panel)\n --color-surface: #ffffff;\n --color-surface-elevated: #ffffff;\n}\n\n// ─── Dark theme ────────────────────────────────────────────────────────────────\n// Applicato via data-theme=\"dark\" sull'elemento root (gestito da Storybook decorator\n// e dall'app consumer). I componenti non devono fare nulla di speciale: basta che\n// usino i token var() e riceveranno automaticamente i valori dark.\n\n[data-theme=\"dark\"] {\n // Neutral (scala invertita)\n --color-neutral-0: #0f172a;\n --color-neutral-100: #1e293b;\n --color-neutral-200: #334155;\n --color-neutral-400: #94a3b8;\n --color-neutral-600: #cbd5e1;\n --color-neutral-900: #f8fafc;\n\n // Surface\n --color-surface: #1e293b;\n --color-surface-elevated: #273549;\n\n // Primary scale dark (per il default accent blu — le sfumature chiare diventano scure)\n --color-primary-50: #172554;\n --color-primary-100: #1e3a8a;\n // 400 / 500 / 600 / 700 rimangono invariati (abbastanza saturi su bg scuro)\n\n // Accent light: variante scura\n --accent-light: #172554;\n\n // Shadows (più forti su bg scuro)\n --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.4);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.5), 0 2px 4px -2px rgb(0 0 0 / 0.4);\n}\n","@use \"../../styles/tokens\" as *;\n\n$accent-track: var(--slider-accent-track, var(--accent-track));\n$accent-ring: var(--slider-accent-ring, var(--accent-ring));\n$accent-glow: var(--slider-accent-glow, var(--accent-glow));\n\n$groove-height: 22px;\n$rail-height: 6px;\n$thumb-size: 18px;\n$hit-zone: 36px;\n\n.wrapper {\n display: flex;\n align-items: center;\n gap: 10px;\n font-family: var(--font-family-base);\n user-select: none;\n -webkit-user-select: none;\n}\n\n.disabled {\n opacity: 0.45;\n pointer-events: none;\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-neutral-400);\n flex-shrink: 0;\n line-height: 0;\n}\n\n// ── Hit zone ───────────────────────────────────────────────────────────────────\n.trackArea {\n position: relative;\n flex: 1;\n height: $hit-zone;\n display: flex;\n align-items: center;\n cursor: pointer;\n}\n\n// ── Groove — the carved channel, >= thumb size ─────────────────────────────────\n.groove {\n position: relative;\n width: 100%;\n height: $groove-height;\n border-radius: var(--radius-full);\n background: var(--color-neutral-300);\n display: flex;\n align-items: center;\n // purely inset: no outer shadow\n box-shadow:\n inset 0 4px 8px rgba(0, 0, 0, 0.14),\n inset 0 2px 4px rgba(0, 0, 0, 0.06),\n inset 0 -2px 3px rgba(255, 255, 255, 0.10);\n}\n\n// ── Rail — thin line inside the groove where fill runs ─────────────────────────\n.rail {\n position: absolute;\n left: 8px;\n right: 8px;\n height: $rail-height;\n border-radius: var(--radius-full);\n background: var(--color-neutral-400);\n box-shadow:\n inset 0 1px 3px rgba(0, 0, 0, 0.30),\n inset 0 1px 1px rgba(0, 0, 0, 0.18);\n overflow: hidden;\n}\n\n// ── Fill ───────────────────────────────────────────────────────────────────────\n.fill {\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n background: $accent-track;\n border-radius: var(--radius-full);\n transition: width 60ms linear;\n}\n\n// ── Thumb ──────────────────────────────────────────────────────────────────────\n.thumb {\n position: absolute;\n top: 50%;\n width: $thumb-size;\n height: $thumb-size;\n border-radius: 50%;\n transform: translate(-50%, -50%);\n background: #dde0e6;\n border: 1px solid rgba(0, 0, 0, 0.10);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.22);\n cursor: grab;\n transition: box-shadow 120ms ease, transform 120ms ease;\n outline: none;\n z-index: 2;\n}\n\n.thumb:focus-visible {\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.22),\n 0 0 0 3px $accent-ring;\n}\n\n.thumbDragging {\n cursor: grabbing;\n transform: translate(-50%, -50%) scale(1.08);\n box-shadow:\n 0 1px 4px rgba(0, 0, 0, 0.28),\n 0 0 0 3px $accent-ring,\n 0 0 0 6px $accent-glow;\n}\n\n// ── Tooltip ────────────────────────────────────────────────────────────────────\n.tooltip {\n position: absolute;\n bottom: calc(100% + 6px);\n transform: translateX(-50%);\n background: rgba(18, 18, 26, 0.85);\n backdrop-filter: blur(6px);\n -webkit-backdrop-filter: blur(6px);\n color: #fff;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n padding: 3px 8px;\n border-radius: 6px;\n white-space: nowrap;\n pointer-events: none;\n opacity: 0;\n transition: opacity 120ms ease;\n z-index: 10;\n\n &::after {\n content: \"\";\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 4px solid transparent;\n border-top-color: rgba(18, 18, 26, 0.85);\n }\n}\n\n.tooltipVisible {\n opacity: 1;\n}\n\n// ── Dark mode ──────────────────────────────────────────────────────────────────\n[data-theme=\"dark\"] {\n .groove {\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.07),\n inset 0 3px 7px rgba(0, 0, 0, 0.32),\n inset 0 1px 3px rgba(0, 0, 0, 0.22),\n inset 0 -2px 3px rgba(255, 255, 255, 0.04);\n }\n\n .thumb {\n background: #4a4f5c;\n border-color: rgba(255, 255, 255, 0.08);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.45);\n }\n\n .thumbDragging {\n box-shadow:\n 0 1px 4px rgba(0, 0, 0, 0.5),\n 0 0 0 3px $accent-ring,\n 0 0 0 6px $accent-glow;\n }\n}\n"],"mappings":"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","names":["colorPicker","topRow","discWrapper","disc","dot","previewSwatch","eyedropperBtn","inputSection","tabs","tab","tabActive","inputWrapper","inputAddon","input","inputCopyBtn","recents","recentsLabel","swatches","recentSwatch","wrapper","disabled","icon","trackArea","groove","rail","fill","thumb","thumbDragging","tooltip","tooltipVisible"]}
@@ -10,10 +10,6 @@ var ColorPicker_module_default = {
10
10
  discWrapper: "ColorPicker_module_discWrapper2",
11
11
  disc: "ColorPicker_module_disc2",
12
12
  dot: "ColorPicker_module_dot2",
13
- lSlider: "ColorPicker_module_lSlider2",
14
- lThumb: "ColorPicker_module_lThumb2",
15
- alphaSlider: "ColorPicker_module_alphaSlider2",
16
- alphaThumb: "ColorPicker_module_alphaThumb2",
17
13
  previewSwatch: "ColorPicker_module_previewSwatch2",
18
14
  eyedropperBtn: "ColorPicker_module_eyedropperBtn2",
19
15
  inputSection: "ColorPicker_module_inputSection2",
@@ -30,6 +26,21 @@ var ColorPicker_module_default = {
30
26
  recentSwatch: "ColorPicker_module_recentSwatch2"
31
27
  };
32
28
 
29
+ // src/components/SliderControl/SliderControl.module.scss
30
+ var SliderControl_module_default = {
31
+ wrapper: "SliderControl_module_wrapper2",
32
+ disabled: "SliderControl_module_disabled2",
33
+ icon: "SliderControl_module_icon2",
34
+ trackArea: "SliderControl_module_trackArea2",
35
+ groove: "SliderControl_module_groove2",
36
+ rail: "SliderControl_module_rail2",
37
+ fill: "SliderControl_module_fill2",
38
+ thumb: "SliderControl_module_thumb2",
39
+ thumbDragging: "SliderControl_module_thumbDragging2",
40
+ tooltip: "SliderControl_module_tooltip2",
41
+ tooltipVisible: "SliderControl_module_tooltipVisible2"
42
+ };
43
+
33
44
  // src/utils/color.ts
34
45
  function hexToHsl(hex) {
35
46
  const r = parseInt(hex.slice(1, 3), 16) / 255;
@@ -145,6 +156,177 @@ function accentToCssVars(tokens, prefix) {
145
156
  [`--${prefix}-accent-light`]: tokens.light
146
157
  };
147
158
  }
159
+ function clamp(v, min, max) {
160
+ return Math.min(Math.max(v, min), max);
161
+ }
162
+ function snapToStep(v, min, step) {
163
+ return Math.round((v - min) / step) * step + min;
164
+ }
165
+ var SliderControl = ({
166
+ value: controlledValue,
167
+ defaultValue = 50,
168
+ min = 0,
169
+ max = 100,
170
+ step = 1,
171
+ onChange,
172
+ showTooltip = "drag",
173
+ showPercentage = false,
174
+ leftIcon,
175
+ rightIcon,
176
+ railBackground,
177
+ accent,
178
+ className,
179
+ disabled = false
180
+ }) => {
181
+ const isControlled = controlledValue !== void 0;
182
+ const [internalValue, setInternalValue] = useState(defaultValue);
183
+ const [isDragging, setIsDragging] = useState(false);
184
+ const [isFocused, setIsFocused] = useState(false);
185
+ const trackRef = useRef(null);
186
+ const thumbRef = useRef(null);
187
+ const value = isControlled ? controlledValue : internalValue;
188
+ const pct = (clamp(value, min, max) - min) / (max - min);
189
+ const accentVars = accent ? accentToCssVars(deriveAccent(accent), "slider") : {};
190
+ const setValue = useCallback(
191
+ (next) => {
192
+ const snapped = clamp(snapToStep(next, min, step), min, max);
193
+ if (!isControlled) setInternalValue(snapped);
194
+ onChange?.(snapped);
195
+ },
196
+ [isControlled, min, max, step, onChange]
197
+ );
198
+ const valueFromPointer = useCallback(
199
+ (e) => {
200
+ const rect = trackRef.current.getBoundingClientRect();
201
+ const ratio = clamp((e.clientX - rect.left) / rect.width, 0, 1);
202
+ return min + ratio * (max - min);
203
+ },
204
+ [min, max]
205
+ );
206
+ const handlePointerDown = useCallback(
207
+ (e) => {
208
+ if (disabled) return;
209
+ e.currentTarget.setPointerCapture(e.pointerId);
210
+ setIsDragging(true);
211
+ thumbRef.current?.focus();
212
+ setValue(valueFromPointer(e.nativeEvent));
213
+ },
214
+ [disabled, setValue, valueFromPointer]
215
+ );
216
+ const handlePointerMove = useCallback(
217
+ (e) => {
218
+ if (!isDragging || disabled) return;
219
+ setValue(valueFromPointer(e.nativeEvent));
220
+ },
221
+ [isDragging, disabled, setValue, valueFromPointer]
222
+ );
223
+ const handlePointerUp = useCallback(() => {
224
+ setIsDragging(false);
225
+ thumbRef.current?.blur();
226
+ }, []);
227
+ useEffect(() => {
228
+ const el = trackRef.current;
229
+ if (!el) return;
230
+ const onWheel = (e) => {
231
+ if (disabled) return;
232
+ e.preventDefault();
233
+ setValue(value + (e.deltaY < 0 ? step : -step));
234
+ };
235
+ el.addEventListener("wheel", onWheel, { passive: false });
236
+ return () => el.removeEventListener("wheel", onWheel);
237
+ }, [disabled, value, step, setValue]);
238
+ const handleKeyDown = useCallback(
239
+ (e) => {
240
+ if (disabled) return;
241
+ const map = {
242
+ ArrowRight: step,
243
+ ArrowUp: step,
244
+ ArrowLeft: -step,
245
+ ArrowDown: -step,
246
+ PageUp: step * 10,
247
+ PageDown: -step * 10
248
+ };
249
+ if (e.key === "Home") {
250
+ setValue(min);
251
+ e.preventDefault();
252
+ return;
253
+ }
254
+ if (e.key === "End") {
255
+ setValue(max);
256
+ e.preventDefault();
257
+ return;
258
+ }
259
+ if (map[e.key] !== void 0) {
260
+ setValue(value + map[e.key]);
261
+ e.preventDefault();
262
+ }
263
+ },
264
+ [disabled, step, min, max, value, setValue]
265
+ );
266
+ const tooltipVisible = showTooltip === "always" || showTooltip === "drag" && (isDragging || isFocused);
267
+ const decimals = step < 1 ? Math.ceil(-Math.log10(step)) : 0;
268
+ const displayValue = showPercentage ? `${Math.round((value - min) / (max - min) * 100)}%` : value.toFixed(decimals);
269
+ const tooltipOffset = `calc(${pct * 100}% + ${(0.5 - pct) * 20}px)`;
270
+ return /* @__PURE__ */ jsxs(
271
+ "div",
272
+ {
273
+ className: [SliderControl_module_default.wrapper, disabled ? SliderControl_module_default.disabled : "", className ?? ""].filter(Boolean).join(" "),
274
+ style: accentVars,
275
+ children: [
276
+ leftIcon !== null && leftIcon !== void 0 && /* @__PURE__ */ jsx("span", { className: SliderControl_module_default.icon, children: leftIcon }),
277
+ /* @__PURE__ */ jsxs(
278
+ "div",
279
+ {
280
+ ref: trackRef,
281
+ className: SliderControl_module_default.trackArea,
282
+ onPointerDown: handlePointerDown,
283
+ onPointerMove: handlePointerMove,
284
+ onPointerUp: handlePointerUp,
285
+ onPointerCancel: handlePointerUp,
286
+ children: [
287
+ /* @__PURE__ */ jsx("div", { className: SliderControl_module_default.groove, children: /* @__PURE__ */ jsx(
288
+ "div",
289
+ {
290
+ className: SliderControl_module_default.rail,
291
+ style: railBackground ? { background: railBackground } : void 0,
292
+ children: !railBackground && /* @__PURE__ */ jsx("div", { className: SliderControl_module_default.fill, style: { width: `${pct * 100}%` } })
293
+ }
294
+ ) }),
295
+ /* @__PURE__ */ jsx(
296
+ "div",
297
+ {
298
+ ref: thumbRef,
299
+ role: "slider",
300
+ tabIndex: disabled ? -1 : 0,
301
+ "aria-valuenow": Math.round(value),
302
+ "aria-valuemin": min,
303
+ "aria-valuemax": max,
304
+ "aria-disabled": disabled,
305
+ className: [SliderControl_module_default.thumb, isDragging ? SliderControl_module_default.thumbDragging : ""].filter(Boolean).join(" "),
306
+ style: { left: `calc(${pct * 100}% + ${(0.5 - pct) * 24}px)` },
307
+ onKeyDown: handleKeyDown,
308
+ onFocus: () => setIsFocused(true),
309
+ onBlur: () => setIsFocused(false)
310
+ }
311
+ ),
312
+ /* @__PURE__ */ jsx(
313
+ "div",
314
+ {
315
+ className: [SliderControl_module_default.tooltip, tooltipVisible ? SliderControl_module_default.tooltipVisible : ""].filter(Boolean).join(" "),
316
+ style: { left: tooltipOffset },
317
+ "aria-hidden": "true",
318
+ children: displayValue
319
+ }
320
+ )
321
+ ]
322
+ }
323
+ ),
324
+ rightIcon !== null && rightIcon !== void 0 && /* @__PURE__ */ jsx("span", { className: SliderControl_module_default.icon, children: rightIcon })
325
+ ]
326
+ }
327
+ );
328
+ };
329
+ SliderControl.displayName = "SliderControl";
148
330
  var DISC = 200;
149
331
  var CopyIcon = () => /* @__PURE__ */ jsxs("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", children: [
150
332
  /* @__PURE__ */ jsx("rect", { x: "5", y: "5", width: "7", height: "7", rx: "1.5", stroke: "currentColor", strokeWidth: "1.4" }),
@@ -314,50 +496,21 @@ var ColorPicker = ({
314
496
  },
315
497
  [updateDisc]
316
498
  );
317
- const updateL = useCallback(
318
- (clientX, rect) => {
319
- const nl = Math.max(0, Math.min(100, (clientX - rect.left) / rect.width * 100));
499
+ const handleLChange = useCallback(
500
+ (nl) => {
320
501
  setL(nl);
321
502
  notify(h, s, nl, a);
322
503
  },
323
504
  [h, s, a, notify]
324
505
  );
325
- const handleLPointerDown = useCallback(
326
- (e) => {
327
- e.currentTarget.setPointerCapture(e.pointerId);
328
- updateL(e.clientX, e.currentTarget.getBoundingClientRect());
329
- },
330
- [updateL]
331
- );
332
- const handleLPointerMove = useCallback(
333
- (e) => {
334
- if (e.buttons === 0) return;
335
- updateL(e.clientX, e.currentTarget.getBoundingClientRect());
336
- },
337
- [updateL]
338
- );
339
- const updateA = useCallback(
340
- (clientX, rect) => {
341
- const na = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));
506
+ const handleAChange = useCallback(
507
+ (val) => {
508
+ const na = val / 100;
342
509
  setA(na);
343
510
  notify(h, s, l, na);
344
511
  },
345
512
  [h, s, l, notify]
346
513
  );
347
- const handleAPointerDown = useCallback(
348
- (e) => {
349
- e.currentTarget.setPointerCapture(e.pointerId);
350
- updateA(e.clientX, e.currentTarget.getBoundingClientRect());
351
- },
352
- [updateA]
353
- );
354
- const handleAPointerMove = useCallback(
355
- (e) => {
356
- if (e.buttons === 0) return;
357
- updateA(e.clientX, e.currentTarget.getBoundingClientRect());
358
- },
359
- [updateA]
360
- );
361
514
  const { r: rr, g: gg, b: bb } = hslToRgb(h, s, l);
362
515
  const luminance = (0.299 * rr + 0.587 * gg + 0.114 * bb) / 255;
363
516
  const swatchFg = luminance > 0.6 ? "rgba(0,0,0,0.5)" : "rgba(255,255,255,0.9)";
@@ -370,7 +523,6 @@ var ColorPicker = ({
370
523
  hsl(${h}, ${s}%, 5%),
371
524
  hsl(${h}, ${s}%, 50%),
372
525
  hsl(${h}, ${s}%, 95%))`;
373
- const alphaGradient = `linear-gradient(to right, transparent, ${rgbStr})`;
374
526
  const handleEyeDropper = async () => {
375
527
  if (!window.EyeDropper) return;
376
528
  try {
@@ -431,35 +583,27 @@ var ColorPicker = ({
431
583
  )
432
584
  ] }) }),
433
585
  /* @__PURE__ */ jsx(
434
- "div",
586
+ SliderControl,
435
587
  {
436
- className: ColorPicker_module_default.lSlider,
437
- style: { backgroundImage: lGradient },
438
- onPointerDown: handleLPointerDown,
439
- onPointerMove: handleLPointerMove,
440
- children: /* @__PURE__ */ jsx(
441
- "div",
442
- {
443
- className: ColorPicker_module_default.lThumb,
444
- style: { left: `${l}%` }
445
- }
446
- )
588
+ value: l,
589
+ onChange: handleLChange,
590
+ min: 0,
591
+ max: 100,
592
+ step: 1,
593
+ showTooltip: "never",
594
+ railBackground: lGradient
447
595
  }
448
596
  ),
449
597
  showAlpha && /* @__PURE__ */ jsx(
450
- "div",
598
+ SliderControl,
451
599
  {
452
- className: ColorPicker_module_default.alphaSlider,
453
- style: { backgroundImage: alphaGradient },
454
- onPointerDown: handleAPointerDown,
455
- onPointerMove: handleAPointerMove,
456
- children: /* @__PURE__ */ jsx(
457
- "div",
458
- {
459
- className: ColorPicker_module_default.alphaThumb,
460
- style: { left: `${a * 100}%` }
461
- }
462
- )
600
+ value: Math.round(a * 100),
601
+ onChange: handleAChange,
602
+ min: 0,
603
+ max: 100,
604
+ step: 1,
605
+ showTooltip: "never",
606
+ railBackground: `linear-gradient(to right, transparent, ${rgbStr}), repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%) 0 / 10px 10px`
463
607
  }
464
608
  ),
465
609
  /* @__PURE__ */ jsx(