@juspay/svelte-ui-components 2.14.0 → 2.18.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 (41) hide show
  1. package/dist/Button/Button.svelte +14 -0
  2. package/dist/Button/properties.d.ts +2 -0
  3. package/dist/Card/Card.svelte +51 -0
  4. package/dist/Card/Card.svelte.d.ts +4 -0
  5. package/dist/Card/properties.d.ts +10 -0
  6. package/dist/Card/properties.js +1 -0
  7. package/dist/ColorPicker/ColorPicker.svelte +583 -0
  8. package/dist/ColorPicker/ColorPicker.svelte.d.ts +4 -0
  9. package/dist/ColorPicker/properties.d.ts +15 -0
  10. package/dist/ColorPicker/properties.js +1 -0
  11. package/dist/Combobox/Combobox.svelte +432 -0
  12. package/dist/Combobox/Combobox.svelte.d.ts +6 -0
  13. package/dist/Combobox/properties.d.ts +42 -0
  14. package/dist/Combobox/properties.js +1 -0
  15. package/dist/EmptyState/EmptyState.svelte +66 -0
  16. package/dist/EmptyState/EmptyState.svelte.d.ts +4 -0
  17. package/dist/EmptyState/properties.d.ts +11 -0
  18. package/dist/EmptyState/properties.js +1 -0
  19. package/dist/Icon/Icon.svelte +22 -2
  20. package/dist/Icon/properties.d.ts +3 -4
  21. package/dist/Input/Input.svelte +30 -5
  22. package/dist/Input/Input.svelte.d.ts +1 -0
  23. package/dist/Input/properties.d.ts +11 -2
  24. package/dist/ListItem/ListItem.svelte +9 -3
  25. package/dist/ListItem/properties.d.ts +3 -0
  26. package/dist/Menu/Menu.svelte +17 -6
  27. package/dist/Menu/properties.d.ts +4 -0
  28. package/dist/Slider/Slider.svelte +9 -6
  29. package/dist/SplitInput/SplitInput.svelte +225 -0
  30. package/dist/SplitInput/SplitInput.svelte.d.ts +7 -0
  31. package/dist/SplitInput/properties.d.ts +20 -0
  32. package/dist/SplitInput/properties.js +1 -0
  33. package/dist/Tabs/Tabs.svelte +22 -6
  34. package/dist/Tabs/properties.d.ts +5 -0
  35. package/dist/assets/swap-vertical.svg +6 -0
  36. package/dist/index.d.ts +10 -0
  37. package/dist/index.js +5 -0
  38. package/dist/types.d.ts +15 -1
  39. package/dist/utils.d.ts +10 -1
  40. package/dist/utils.js +118 -0
  41. package/package.json +1 -1
@@ -12,6 +12,8 @@
12
12
  testId,
13
13
  ariaLabel,
14
14
  ariaExpanded,
15
+ ariaSelected,
16
+ role,
15
17
  onclick,
16
18
  onkeyup = () => {},
17
19
  showProgressBar = $bindable(false),
@@ -46,6 +48,8 @@
46
48
  data-pw={testId}
47
49
  aria-label={ariaLabel}
48
50
  aria-expanded={ariaExpanded}
51
+ aria-selected={ariaSelected}
52
+ {role}
49
53
  >
50
54
  {#if showLoader && loaderType === 'Circular'}
51
55
  <div class="button-loader"><Loader /></div>
@@ -96,6 +100,11 @@
96
100
  .disabled {
97
101
  cursor: var(--disabled-cursor, not-allowed);
98
102
  opacity: var(--disabled-opacity, 0.4);
103
+ color: var(--disabled-text-color);
104
+ font-size: var(--disabled-font-size);
105
+ font-weight: var(--disabled-font-weight);
106
+ border: var(--disabled-border);
107
+ background: var(--disabled-background-color);
99
108
  }
100
109
 
101
110
  .button-loader {
@@ -116,6 +125,11 @@
116
125
  background: var(--button-hover-color, var(--button-color, #3a4550));
117
126
  color: var(--button-hover-text-color, var(--button-text-color, white));
118
127
  border: var(--button-hover-border, var(--button-border, none));
128
+ transform: var(--button-hover-transform);
129
+ }
130
+
131
+ button:active {
132
+ transform: var(--button-active-transform);
119
133
  }
120
134
 
121
135
  .button-progress-bar {
@@ -13,6 +13,8 @@ export type OptionalButtonProperties = {
13
13
  children?: Snippet;
14
14
  ariaLabel?: string;
15
15
  ariaExpanded?: boolean;
16
+ ariaSelected?: boolean;
17
+ role?: string;
16
18
  disabled?: boolean;
17
19
  classes?: string;
18
20
  };
@@ -0,0 +1,51 @@
1
+ <script lang="ts">
2
+ import type { CardProperties } from './properties';
3
+
4
+ let { children, title, description, classes }: CardProperties = $props();
5
+ </script>
6
+
7
+ <div class="card {classes ?? ''}">
8
+ {#if typeof title === 'string' && title.length > 0}
9
+ <div class="card-header">
10
+ <div class="card-title">{title}</div>
11
+ {#if typeof description === 'string' && description.length > 0}
12
+ <div class="card-description">{description}</div>
13
+ {/if}
14
+ </div>
15
+ {/if}
16
+ <div class="card-content">
17
+ {@render children()}
18
+ </div>
19
+ </div>
20
+
21
+ <style>
22
+ .card {
23
+ background: var(--card-background, inherit);
24
+ border: var(--card-border, 1px solid currentColor);
25
+ border-radius: var(--card-border-radius, 8px);
26
+ overflow: var(--card-overflow, hidden);
27
+ color: inherit;
28
+ }
29
+
30
+ .card-header {
31
+ padding: var(--card-header-padding, 16px 16px 0);
32
+ border-bottom: var(--card-header-border-bottom, none);
33
+ }
34
+
35
+ .card-title {
36
+ font-size: var(--card-title-font-size, 16px);
37
+ font-weight: var(--card-title-font-weight, 600);
38
+ color: var(--card-title-color, inherit);
39
+ }
40
+
41
+ .card-description {
42
+ font-size: var(--card-description-font-size, 14px);
43
+ color: var(--card-description-color, inherit);
44
+ opacity: var(--card-description-opacity, 0.6);
45
+ margin-top: var(--card-description-margin-top, 4px);
46
+ }
47
+
48
+ .card-content {
49
+ padding: var(--card-content-padding, 16px);
50
+ }
51
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { CardProperties } from './properties';
2
+ declare const Card: import("svelte").Component<CardProperties, {}, "">;
3
+ type Card = ReturnType<typeof Card>;
4
+ export default Card;
@@ -0,0 +1,10 @@
1
+ import type { Snippet } from 'svelte';
2
+ export type CardProperties = MandatoryCardProperties & OptionalCardProperties;
3
+ export type MandatoryCardProperties = {
4
+ children: Snippet;
5
+ };
6
+ export type OptionalCardProperties = {
7
+ title?: string;
8
+ description?: string;
9
+ classes?: string;
10
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,583 @@
1
+ <script lang="ts">
2
+ import Button from '../Button/Button.svelte';
3
+ import Input from '../Input/Input.svelte';
4
+ import Slider from '../Slider/Slider.svelte';
5
+ import SplitInput from '../SplitInput/SplitInput.svelte';
6
+ import swapVerticalSvg from '../assets/swap-vertical.svg?raw';
7
+ import type { ColorPickerProperties } from './properties';
8
+ import {
9
+ hexToHsv,
10
+ hsvToHex,
11
+ hsvToRgb,
12
+ hsvToHsl,
13
+ hslToHsv,
14
+ rgbToHsv,
15
+ isValidHex,
16
+ clampInt
17
+ } from '../utils';
18
+
19
+ let {
20
+ value = $bindable('#000000'),
21
+ label,
22
+ disabled = false,
23
+ showValue = false,
24
+ testId,
25
+ onchange,
26
+ oninput,
27
+ classes
28
+ }: ColorPickerProperties = $props();
29
+
30
+ // ── Internal state ──────────────────────────────────────────────
31
+
32
+ let open = $state(false);
33
+ let containerEl: HTMLDivElement | null = $state(null);
34
+
35
+ let hue = $state(0);
36
+ let sat = $state(1);
37
+ let val = $state(1);
38
+
39
+ type ColorMode = 'HEX' | 'RGB' | 'HSL';
40
+ const modes: ColorMode[] = ['HEX', 'RGB', 'HSL'];
41
+ let mode: ColorMode = $state('HEX');
42
+
43
+ // ── Derived values ──────────────────────────────────────────────
44
+
45
+ let hexInputValue = $derived(value);
46
+ let currentRgb = $derived(hsvToRgb(hue, sat, val));
47
+ let currentHsl = $derived(hsvToHsl(hue, sat, val));
48
+
49
+ let _syncTrigger = $derived.by(() => {
50
+ const hsv = hexToHsv(value);
51
+ if (hsv !== null) {
52
+ hue = hsv.h;
53
+ sat = hsv.s;
54
+ val = hsv.v;
55
+ }
56
+ return value;
57
+ });
58
+
59
+ // ── Color commit ────────────────────────────────────────────────
60
+
61
+ function commitColor() {
62
+ const hex = hsvToHex(hue, sat, val);
63
+ if (hex !== value) {
64
+ value = hex;
65
+ oninput?.(value);
66
+ onchange?.(value);
67
+ }
68
+ }
69
+
70
+ // ── Popover open/close ──────────────────────────────────────────
71
+
72
+ function togglePicker(_event: MouseEvent) {
73
+ if (disabled === false) {
74
+ open = !open;
75
+ }
76
+ }
77
+
78
+ function handleWindowClick(e: MouseEvent) {
79
+ if (
80
+ open &&
81
+ containerEl !== null &&
82
+ e.target instanceof Node &&
83
+ containerEl.contains(e.target) === false
84
+ ) {
85
+ open = false;
86
+ }
87
+ }
88
+
89
+ // ── Saturation panel drag ───────────────────────────────────────
90
+
91
+ let satPanelEl: HTMLDivElement | null = $state(null);
92
+ let draggingSat = $state(false);
93
+
94
+ function handleSatDown(e: PointerEvent) {
95
+ if (disabled) {
96
+ return;
97
+ }
98
+ draggingSat = true;
99
+ if (e.currentTarget instanceof HTMLElement) {
100
+ e.currentTarget.setPointerCapture(e.pointerId);
101
+ }
102
+ updateSatFromPointer(e);
103
+ }
104
+
105
+ function handleSatMove(e: PointerEvent) {
106
+ if (draggingSat === false) {
107
+ return;
108
+ }
109
+ updateSatFromPointer(e);
110
+ }
111
+
112
+ function handleSatUp() {
113
+ draggingSat = false;
114
+ }
115
+
116
+ function updateSatFromPointer(e: PointerEvent) {
117
+ if (satPanelEl === null) {
118
+ return;
119
+ }
120
+ const rect = satPanelEl.getBoundingClientRect();
121
+ sat = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));
122
+ val = Math.max(0, Math.min(1, 1 - (e.clientY - rect.top) / rect.height));
123
+ commitColor();
124
+ }
125
+
126
+ // ── Hue slider ─────────────────────────────────────────────────
127
+
128
+ let hueDegrees = $derived(Math.round(hue * 360));
129
+
130
+ function handleHueInput(newHue: number) {
131
+ hue = newHue / 360;
132
+ commitColor();
133
+ }
134
+
135
+ // ── Input field handlers ────────────────────────────────────────
136
+
137
+ function handleTextInput(newValue: string) {
138
+ if (isValidHex(newValue)) {
139
+ value = newValue;
140
+ oninput?.(value);
141
+ onchange?.(value);
142
+ }
143
+ }
144
+
145
+ function handleHexFieldInput(newValue: string) {
146
+ let v = newValue.trim();
147
+ if (v.charAt(0) !== '#') {
148
+ v = '#' + v;
149
+ }
150
+ if (isValidHex(v)) {
151
+ value = v;
152
+ oninput?.(value);
153
+ onchange?.(value);
154
+ }
155
+ }
156
+
157
+ function handleRgbInput(vals: string[]) {
158
+ const r = clampInt(vals.at(0) ?? '0', 0, 255);
159
+ const g = clampInt(vals.at(1) ?? '0', 0, 255);
160
+ const b = clampInt(vals.at(2) ?? '0', 0, 255);
161
+ const hsv = rgbToHsv(r, g, b);
162
+ hue = hsv.h;
163
+ sat = hsv.s;
164
+ val = hsv.v;
165
+ commitColor();
166
+ }
167
+
168
+ function handleHslInput(vals: string[]) {
169
+ const h = clampInt(vals.at(0) ?? '0', 0, 360);
170
+ const s = clampInt(vals.at(1) ?? '0', 0, 100);
171
+ const l = clampInt(vals.at(2) ?? '0', 0, 100);
172
+ const hsv = hslToHsv(h, s, l);
173
+ hue = hsv.h;
174
+ sat = hsv.s;
175
+ val = hsv.v;
176
+ commitColor();
177
+ }
178
+
179
+ function cycleMode() {
180
+ const idx = modes.indexOf(mode);
181
+ mode = modes.at((idx + 1) % modes.length) ?? 'HEX';
182
+ }
183
+ </script>
184
+
185
+ <svelte:window onclick={handleWindowClick} />
186
+
187
+ <div
188
+ class="color-picker-container {classes ?? ''}"
189
+ class:disabled
190
+ data-pw={testId}
191
+ bind:this={containerEl}
192
+ >
193
+ {#if typeof label === 'string'}
194
+ <span class="color-picker-label">{label}</span>
195
+ {/if}
196
+
197
+ <!-- Trigger: swatch button + optional hex input -->
198
+ <div class="color-picker-row">
199
+ <div class="color-picker-swatch-btn" class:standalone={showValue === false}>
200
+ <Button onclick={togglePicker} {disabled} ariaLabel="Pick a color" ariaExpanded={open}>
201
+ <span class="color-picker-checkerboard">
202
+ <span class="color-picker-swatch" style="background-color: {value};"></span>
203
+ </span>
204
+ </Button>
205
+ </div>
206
+ {#if showValue}
207
+ <div class="color-picker-input-wrap">
208
+ <Input
209
+ bind:value
210
+ disable={disabled}
211
+ maxLength={7}
212
+ classes="color-picker-text-input"
213
+ onInput={handleTextInput}
214
+ />
215
+ </div>
216
+ {/if}
217
+ </div>
218
+
219
+ <!-- Popover panel -->
220
+ {#if open}
221
+ <div class="color-picker-popover" role="dialog" aria-label="Color picker">
222
+ <div
223
+ class="cp-sat-panel"
224
+ style="background-color: {hsvToHex(hue, 1, 1)};"
225
+ bind:this={satPanelEl}
226
+ onpointerdown={handleSatDown}
227
+ onpointermove={handleSatMove}
228
+ onpointerup={handleSatUp}
229
+ role="slider"
230
+ aria-label="Saturation and brightness"
231
+ aria-valuenow={Math.round(sat * 100)}
232
+ aria-valuemin={0}
233
+ aria-valuemax={100}
234
+ aria-valuetext="{Math.round(sat * 100)}% saturation, {Math.round(val * 100)}% brightness"
235
+ tabindex={0}
236
+ >
237
+ <div class="cp-sat-white"></div>
238
+ <div class="cp-sat-black"></div>
239
+ <div class="cp-sat-thumb" style="left: {sat * 100}%; top: {(1 - val) * 100}%;"></div>
240
+ </div>
241
+
242
+ <div class="cp-hue-slider">
243
+ <Slider
244
+ value={hueDegrees}
245
+ min={0}
246
+ max={360}
247
+ step={1}
248
+ {disabled}
249
+ classes="cp-hue-track"
250
+ oninput={handleHueInput}
251
+ onchange={handleHueInput}
252
+ />
253
+ </div>
254
+
255
+ <div class="cp-inputs">
256
+ <div class="cp-preview" style="background-color: {value};"></div>
257
+
258
+ {#if mode === 'HEX'}
259
+ <div class="cp-field-hex">
260
+ <Input
261
+ value={hexInputValue}
262
+ maxLength={7}
263
+ classes="cp-field-input"
264
+ onInput={handleHexFieldInput}
265
+ />
266
+ <span class="cp-field-label">HEX</span>
267
+ </div>
268
+ {:else if mode === 'RGB'}
269
+ <SplitInput
270
+ values={[String(currentRgb.r), String(currentRgb.g), String(currentRgb.b)]}
271
+ fields={[
272
+ { label: 'R', dataType: 'number', min: 0, max: 255 },
273
+ { label: 'G', dataType: 'number', min: 0, max: 255 },
274
+ { label: 'B', dataType: 'number', min: 0, max: 255 }
275
+ ]}
276
+ {disabled}
277
+ classes="cp-split-input"
278
+ oninput={handleRgbInput}
279
+ />
280
+ {:else}
281
+ <SplitInput
282
+ values={[String(currentHsl.h), String(currentHsl.s), String(currentHsl.l)]}
283
+ fields={[
284
+ { label: 'H', dataType: 'number', min: 0, max: 360 },
285
+ { label: 'S', dataType: 'number', min: 0, max: 100 },
286
+ { label: 'L', dataType: 'number', min: 0, max: 100 }
287
+ ]}
288
+ {disabled}
289
+ classes="cp-split-input"
290
+ oninput={handleHslInput}
291
+ />
292
+ {/if}
293
+
294
+ <div class="cp-mode-toggle">
295
+ <Button onclick={cycleMode} ariaLabel="Switch color mode">
296
+ <!-- eslint-disable-next-line svelte/no-at-html-tags -->
297
+ {@html swapVerticalSvg}
298
+ </Button>
299
+ </div>
300
+ </div>
301
+ </div>
302
+ {/if}
303
+ </div>
304
+
305
+ <style>
306
+ /* ── Container ─────────────────────────────────────────────── */
307
+
308
+ .color-picker-container {
309
+ display: flex;
310
+ flex-direction: column;
311
+ gap: var(--color-picker-gap, 8px);
312
+ width: var(--color-picker-width, fit-content);
313
+ position: relative;
314
+ }
315
+
316
+ .color-picker-container.disabled {
317
+ opacity: var(--color-picker-disabled-opacity, 0.5);
318
+ cursor: not-allowed;
319
+ }
320
+
321
+ .color-picker-label {
322
+ font-size: var(--color-picker-label-font-size, 13px);
323
+ font-weight: var(--color-picker-label-font-weight, 500);
324
+ color: var(--color-picker-label-color, #374151);
325
+ letter-spacing: var(--color-picker-label-letter-spacing, 0.01em);
326
+ }
327
+
328
+ /* ── Trigger row ───────────────────────────────────────────── */
329
+
330
+ .color-picker-row {
331
+ display: flex;
332
+ align-items: center;
333
+ gap: var(--color-picker-row-gap, 0px);
334
+ }
335
+
336
+ .color-picker-swatch-btn {
337
+ --button-color: var(--color-picker-swatch-btn-background, #f9fafb);
338
+ --button-border: var(--color-picker-swatch-btn-border, 1px solid #d1d5db);
339
+ --button-border-radius: var(--color-picker-swatch-btn-border-radius, 10px 0 0 10px);
340
+ --button-hover-color: var(--color-picker-swatch-btn-hover-background, #f3f4f6);
341
+ --button-padding: var(--color-picker-swatch-padding, 5px);
342
+ --button-width: fit-content;
343
+ flex-shrink: 0;
344
+ }
345
+
346
+ .color-picker-swatch-btn.standalone {
347
+ --button-border-radius: var(--color-picker-swatch-btn-border-radius, 10px);
348
+ }
349
+
350
+ .color-picker-checkerboard {
351
+ display: block;
352
+ width: var(--color-picker-swatch-size, 26px);
353
+ height: var(--color-picker-swatch-size, 26px);
354
+ border-radius: var(--color-picker-swatch-border-radius, 5px);
355
+ overflow: hidden;
356
+ background-image:
357
+ linear-gradient(45deg, #ccc 25%, transparent 25%),
358
+ linear-gradient(-45deg, #ccc 25%, transparent 25%),
359
+ linear-gradient(45deg, transparent 75%, #ccc 75%),
360
+ linear-gradient(-45deg, transparent 75%, #ccc 75%);
361
+ background-size: 8px 8px;
362
+ background-position:
363
+ 0 0,
364
+ 0 4px,
365
+ 4px -4px,
366
+ -4px 0px;
367
+ flex-shrink: 0;
368
+ }
369
+
370
+ .color-picker-swatch {
371
+ display: block;
372
+ width: 100%;
373
+ height: 100%;
374
+ border-radius: inherit;
375
+ box-shadow: var(--color-picker-swatch-inner-shadow, inset 0 0 0 1px rgba(0, 0, 0, 0.08));
376
+ }
377
+
378
+ .color-picker-input-wrap {
379
+ flex: 1;
380
+ min-width: 0;
381
+ }
382
+
383
+ .color-picker-input-wrap :global(.color-picker-text-input) {
384
+ --input-border: 1px solid #d1d5db;
385
+ --input-radius: 0 10px 10px 0;
386
+ --input-margin: 0;
387
+ --input-padding: 8px 12px;
388
+ --input-font-size: 13px;
389
+ --input-font-weight: 500;
390
+ --input-font-family: var(
391
+ --color-picker-mono-font,
392
+ ui-monospace,
393
+ SFMono-Regular,
394
+ Menlo,
395
+ Monaco,
396
+ Consolas,
397
+ monospace
398
+ );
399
+ --input-box-shadow: none;
400
+ --input-width: 100%;
401
+ --input-height: 38px;
402
+ margin-left: -1px;
403
+ }
404
+
405
+ /* ── Popover ───────────────────────────────────────────────── */
406
+
407
+ .color-picker-popover {
408
+ position: absolute;
409
+ top: 100%;
410
+ left: 0;
411
+ z-index: var(--color-picker-popover-z-index, 50);
412
+ margin-top: 6px;
413
+ width: var(--color-picker-popover-width, 280px);
414
+ padding: var(--color-picker-popover-padding, 12px);
415
+ background: var(--color-picker-popover-background, #ffffff);
416
+ border: var(--color-picker-popover-border, 1px solid #e5e7eb);
417
+ border-radius: var(--color-picker-popover-border-radius, 12px);
418
+ box-shadow: var(
419
+ --color-picker-popover-shadow,
420
+ 0 4px 24px rgba(0, 0, 0, 0.12),
421
+ 0 1px 4px rgba(0, 0, 0, 0.06)
422
+ );
423
+ display: flex;
424
+ flex-direction: column;
425
+ gap: 12px;
426
+ touch-action: none;
427
+ }
428
+
429
+ /* ── Saturation / brightness panel ─────────────────────────── */
430
+
431
+ .cp-sat-panel {
432
+ position: relative;
433
+ width: 100%;
434
+ aspect-ratio: 1 / 0.7;
435
+ border-radius: var(--color-picker-panel-border-radius, 8px);
436
+ cursor: crosshair;
437
+ overflow: hidden;
438
+ user-select: none;
439
+ }
440
+
441
+ .cp-sat-white {
442
+ position: absolute;
443
+ inset: 0;
444
+ background: linear-gradient(to right, #ffffff, transparent);
445
+ border-radius: inherit;
446
+ }
447
+
448
+ .cp-sat-black {
449
+ position: absolute;
450
+ inset: 0;
451
+ background: linear-gradient(to bottom, transparent, #000000);
452
+ border-radius: inherit;
453
+ }
454
+
455
+ .cp-sat-thumb {
456
+ position: absolute;
457
+ width: 16px;
458
+ height: 16px;
459
+ border-radius: 50%;
460
+ border: 2.5px solid #ffffff;
461
+ box-shadow:
462
+ 0 0 0 1px rgba(0, 0, 0, 0.15),
463
+ 0 1px 4px rgba(0, 0, 0, 0.3);
464
+ transform: translate(-50%, -50%);
465
+ pointer-events: none;
466
+ }
467
+
468
+ /* ── Hue slider ────────────────────────────────────────────── */
469
+
470
+ .cp-hue-slider {
471
+ --slider-container-padding: 0;
472
+ --slider-track: linear-gradient(
473
+ to right,
474
+ #ff0000 0%,
475
+ #ffff00 16.67%,
476
+ #00ff00 33.33%,
477
+ #00ffff 50%,
478
+ #0000ff 66.67%,
479
+ #ff00ff 83.33%,
480
+ #ff0000 100%
481
+ );
482
+ --slider-track-height: 14px;
483
+ --slider-track-border-radius: 7px;
484
+ --slider-thumb-size: 18px;
485
+ --slider-thumb-background: #ffffff;
486
+ --slider-thumb-border: 2.5px solid #ffffff;
487
+ --slider-thumb-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15), 0 1px 4px rgba(0, 0, 0, 0.25);
488
+ }
489
+
490
+ /* ── Input fields ──────────────────────────────────────────── */
491
+
492
+ .cp-inputs {
493
+ display: flex;
494
+ align-items: flex-start;
495
+ gap: 6px;
496
+ }
497
+
498
+ .cp-preview {
499
+ width: 36px;
500
+ height: 36px;
501
+ border-radius: 6px;
502
+ border: 1px solid rgba(0, 0, 0, 0.08);
503
+ flex-shrink: 0;
504
+ }
505
+
506
+ .cp-field-hex {
507
+ display: flex;
508
+ flex-direction: column;
509
+ align-items: center;
510
+ gap: 3px;
511
+ flex: 3;
512
+ min-width: 0;
513
+ }
514
+
515
+ .cp-field-hex :global(.cp-field-input) {
516
+ --input-border: 1px solid var(--color-picker-field-border, #d1d5db);
517
+ --input-radius: 6px;
518
+ --input-margin: 0;
519
+ --input-padding: 0 6px;
520
+ --input-font-size: 12px;
521
+ --input-font-weight: 500;
522
+ --input-font-family: var(
523
+ --color-picker-mono-font,
524
+ ui-monospace,
525
+ SFMono-Regular,
526
+ Menlo,
527
+ Monaco,
528
+ Consolas,
529
+ monospace
530
+ );
531
+ --input-text-color: var(--color-picker-field-color, #374151);
532
+ --input-background: var(--color-picker-field-background, #ffffff);
533
+ --input-box-shadow: none;
534
+ --input-width: 100%;
535
+ --input-height: 32px;
536
+ --input-text-align: center;
537
+ --input-focus-border: 1px solid var(--color-picker-field-focus-border, #3b82f6);
538
+ }
539
+
540
+ .cp-split-input {
541
+ --field-group-gap: 6px;
542
+ --field-group-border: 1px solid var(--color-picker-field-border, #d1d5db);
543
+ --field-group-border-radius: 6px;
544
+ --field-group-focus-border: 1px solid var(--color-picker-field-focus-border, #3b82f6);
545
+ --field-group-input-height: 32px;
546
+ --field-group-font-size: 12px;
547
+ --field-group-font-weight: 500;
548
+ --field-group-font-family: var(
549
+ --color-picker-mono-font,
550
+ ui-monospace,
551
+ SFMono-Regular,
552
+ Menlo,
553
+ Monaco,
554
+ Consolas,
555
+ monospace
556
+ );
557
+ --field-group-label-color: var(--color-picker-field-label-color, #9ca3af);
558
+ flex: 1;
559
+ min-width: 0;
560
+ }
561
+
562
+ .cp-field-label {
563
+ font-size: 10px;
564
+ font-weight: 500;
565
+ color: var(--color-picker-field-label-color, #9ca3af);
566
+ text-transform: uppercase;
567
+ letter-spacing: 0.05em;
568
+ }
569
+
570
+ .cp-mode-toggle {
571
+ --button-color: var(--color-picker-field-background, #ffffff);
572
+ --button-border: 1px solid var(--color-picker-field-border, #d1d5db);
573
+ --button-border-radius: 6px;
574
+ --button-padding: 0;
575
+ --button-width: 28px;
576
+ --button-height: 32px;
577
+ --button-text-color: var(--color-picker-field-label-color, #9ca3af);
578
+ --button-hover-color: var(--color-picker-field-background, #ffffff);
579
+ --button-hover-border: 1px solid var(--color-picker-field-focus-border, #3b82f6);
580
+ --button-hover-text-color: var(--color-picker-field-color, #374151);
581
+ flex-shrink: 0;
582
+ }
583
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { ColorPickerProperties } from './properties';
2
+ declare const ColorPicker: import("svelte").Component<ColorPickerProperties, {}, "value">;
3
+ type ColorPicker = ReturnType<typeof ColorPicker>;
4
+ export default ColorPicker;