@dryui/ui 4.0.0 → 4.0.1

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 (39) hide show
  1. package/dist/badge/badge.svelte +2 -6
  2. package/dist/chromatic-aberration/chromatic-aberration.svelte +25 -13
  3. package/dist/date-picker/datepicker-button-trigger.svelte +146 -44
  4. package/dist/displacement/displacement.svelte +1 -0
  5. package/dist/file-upload/file-upload-dropzone.svelte +1 -1
  6. package/dist/gradient-mesh/gradient-mesh.svelte +83 -90
  7. package/dist/link-preview/link-preview-trigger.svelte +1 -1
  8. package/dist/option-picker/option-picker-preview.svelte +11 -2
  9. package/dist/rich-text-editor/rich-text-editor-content.svelte +1 -1
  10. package/dist/select/index.d.ts +7 -1
  11. package/dist/tag/tag-button.svelte +2 -6
  12. package/dist/tags-input/tags-input-tag.svelte +1 -1
  13. package/dist/themes/aurora.css +54 -6
  14. package/dist/themes/dark.css +66 -6
  15. package/dist/themes/default.css +26 -1
  16. package/dist/themes/midnight.css +31 -1
  17. package/dist/themes/terminal.css +31 -1
  18. package/dist/time-input/index.d.ts +2 -2
  19. package/dist/time-input/time-input.meta.js +1 -1
  20. package/package.json +6 -6
  21. package/src/badge/badge.svelte +2 -6
  22. package/src/chromatic-aberration/chromatic-aberration.svelte +25 -13
  23. package/src/date-picker/datepicker-button-trigger.svelte +146 -44
  24. package/src/displacement/displacement.svelte +1 -0
  25. package/src/file-upload/file-upload-dropzone.svelte +1 -1
  26. package/src/gradient-mesh/gradient-mesh.svelte +83 -90
  27. package/src/link-preview/link-preview-trigger.svelte +1 -1
  28. package/src/option-picker/option-picker-preview.svelte +11 -2
  29. package/src/rich-text-editor/rich-text-editor-content.svelte +1 -1
  30. package/src/select/index.ts +7 -1
  31. package/src/tag/tag-button.svelte +2 -6
  32. package/src/tags-input/tags-input-tag.svelte +1 -1
  33. package/src/themes/aurora.css +54 -6
  34. package/src/themes/dark.css +66 -6
  35. package/src/themes/default.css +26 -1
  36. package/src/themes/midnight.css +31 -1
  37. package/src/themes/terminal.css +31 -1
  38. package/src/time-input/index.ts +6 -2
  39. package/src/time-input/time-input.meta.ts +1 -1
@@ -152,12 +152,8 @@
152
152
  }
153
153
 
154
154
  [data-variant='solid'][data-color='orange'] {
155
- --_badge-bg-default: color-mix(
156
- in srgb,
157
- var(--dry-color-fill-warning) 70%,
158
- var(--dry-color-fill-error)
159
- );
160
- --_badge-color-default: var(--dry-color-on-warning);
155
+ --_badge-bg-default: var(--dry-color-fill-orange);
156
+ --_badge-color-default: var(--dry-color-on-orange);
161
157
  }
162
158
 
163
159
  /* ── Variant: outline ─────────────────────────────────────────────────────── */
@@ -30,29 +30,41 @@
30
30
 
31
31
  <svg data-chromatic-aberration-svg width="0" height="0" aria-hidden="true">
32
32
  <defs>
33
- <filter id={filterId} color-interpolation-filters="sRGB">
33
+ <filter
34
+ id={filterId}
35
+ color-interpolation-filters="sRGB"
36
+ x="-20%"
37
+ y="-20%"
38
+ width="140%"
39
+ height="140%"
40
+ >
41
+ <feOffset in="SourceAlpha" dx={offsetX} dy={offsetY} result="redAlpha" />
42
+ <feFlood flood-color="rgb(255, 24, 86)" flood-opacity="0.62" result="redFlood" />
43
+ <feComposite in="redFlood" in2="redAlpha" operator="in" result="redFringe" />
34
44
  <feOffset in="SourceGraphic" dx={offsetX} dy={offsetY} result="red" />
35
45
  <feColorMatrix
36
46
  in="red"
37
47
  type="matrix"
38
- values="1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0"
39
- result="redOnly"
48
+ values="1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0"
49
+ result="redSignal"
40
50
  />
51
+ <feBlend in="redFringe" in2="redSignal" mode="screen" result="redOnly" />
52
+ <feOffset in="SourceAlpha" dx={-offsetX} dy={-offsetY} result="blueAlpha" />
53
+ <feFlood flood-color="rgb(0, 132, 255)" flood-opacity="0.62" result="blueFlood" />
54
+ <feComposite in="blueFlood" in2="blueAlpha" operator="in" result="blueFringe" />
41
55
  <feOffset in="SourceGraphic" dx={-offsetX} dy={-offsetY} result="blue" />
42
56
  <feColorMatrix
43
57
  in="blue"
44
58
  type="matrix"
45
- values="0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0"
46
- result="blueOnly"
59
+ values="0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0"
60
+ result="blueSignal"
47
61
  />
48
- <feColorMatrix
49
- in="SourceGraphic"
50
- type="matrix"
51
- values="0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0"
52
- result="greenOnly"
53
- />
54
- <feBlend in="redOnly" in2="greenOnly" mode="screen" result="rg" />
55
- <feBlend in="rg" in2="blueOnly" mode="screen" />
62
+ <feBlend in="blueFringe" in2="blueSignal" mode="screen" result="blueOnly" />
63
+ <feMerge>
64
+ <feMergeNode in="redOnly" />
65
+ <feMergeNode in="blueOnly" />
66
+ <feMergeNode in="SourceGraphic" />
67
+ </feMerge>
56
68
  </filter>
57
69
  </defs>
58
70
  </svg>
@@ -1,9 +1,8 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLButtonAttributes } from 'svelte/elements';
4
- import Button from '../button/button.svelte';
5
4
  import { getDatePickerCtx } from './context.svelte.js';
6
- import { formatDate } from '@dryui/primitives';
5
+ import { formatDate, variantAttrs } from '@dryui/primitives';
7
6
 
8
7
  interface Props extends Omit<HTMLButtonAttributes, 'children'> {
9
8
  placeholder?: string;
@@ -15,15 +14,13 @@
15
14
 
16
15
  const ctx = getDatePickerCtx();
17
16
 
17
+ let triggerEl = $state<HTMLButtonElement>();
18
+
18
19
  $effect(() => {
19
- const node = document.getElementById(ctx.triggerId);
20
- if (node) {
21
- ctx.triggerEl = node as HTMLButtonElement;
22
- }
20
+ if (!triggerEl) return;
21
+ ctx.triggerEl = triggerEl;
23
22
  return () => {
24
- if (ctx.triggerEl && ctx.triggerEl.id === ctx.triggerId) {
25
- ctx.triggerEl = null;
26
- }
23
+ if (ctx.triggerEl === triggerEl) ctx.triggerEl = null;
27
24
  };
28
25
  });
29
26
 
@@ -34,39 +31,144 @@
34
31
  );
35
32
  </script>
36
33
 
37
- <Button
38
- variant="outline"
39
- type="button"
40
- {size}
41
- id={ctx.triggerId}
42
- aria-haspopup="dialog"
43
- aria-expanded={ctx.open}
44
- aria-controls={ctx.contentId}
45
- data-state={ctx.open ? 'open' : 'closed'}
46
- data-disabled={ctx.disabled ? '' : undefined}
47
- disabled={ctx.disabled}
48
- popovertarget={ctx.contentId}
49
- {...rest}
50
- >
51
- {#if children}
52
- {@render children()}
53
- {:else}
54
- <span data-placeholder={!ctx.value ? '' : undefined}>
55
- {displayText || placeholder}
56
- </span>
57
- {/if}
58
- <svg
59
- xmlns="http://www.w3.org/2000/svg"
60
- viewBox="0 0 24 24"
61
- fill="none"
62
- stroke="currentColor"
63
- stroke-width="2"
64
- aria-hidden="true"
65
- ><rect x="3" y="4" width="18" height="18" rx="2" ry="2" /><line
66
- x1="16"
67
- y1="2"
68
- x2="16"
69
- y2="6"
70
- /><line x1="8" y1="2" x2="8" y2="6" /><line x1="3" y1="10" x2="21" y2="10" /></svg
34
+ <span class="wrapper">
35
+ <button
36
+ bind:this={triggerEl}
37
+ type="button"
38
+ id={ctx.triggerId}
39
+ aria-haspopup="dialog"
40
+ aria-expanded={ctx.open}
41
+ aria-controls={ctx.contentId}
42
+ data-state={ctx.open ? 'open' : 'closed'}
43
+ data-date-picker-trigger
44
+ data-disabled={ctx.disabled || undefined}
45
+ disabled={ctx.disabled}
46
+ popovertarget={ctx.contentId}
47
+ {...variantAttrs({ size })}
48
+ {...rest}
71
49
  >
72
- </Button>
50
+ <span data-content>
51
+ {#if children}
52
+ {@render children()}
53
+ {:else}
54
+ <span data-placeholder={!ctx.value ? '' : undefined}>
55
+ {displayText || placeholder}
56
+ </span>
57
+ {/if}
58
+ </span>
59
+ <svg
60
+ data-indicator
61
+ xmlns="http://www.w3.org/2000/svg"
62
+ viewBox="0 0 24 24"
63
+ fill="none"
64
+ stroke="currentColor"
65
+ stroke-width="2"
66
+ aria-hidden="true"
67
+ ><rect x="3" y="4" width="18" height="18" rx="2" ry="2" /><path
68
+ d="M16 2v4M8 2v4M3 10h18"
69
+ /></svg
70
+ >
71
+ </button>
72
+ </span>
73
+
74
+ <style>
75
+ .wrapper {
76
+ display: grid;
77
+ grid-template-columns: minmax(0, 1fr);
78
+ }
79
+
80
+ [data-date-picker-trigger] {
81
+ --_dpt-bg: var(--dry-date-picker-trigger-bg, var(--dry-form-control-bg));
82
+ --_dpt-border: var(--dry-date-picker-trigger-border, var(--dry-form-control-border));
83
+ --_dpt-color: var(--dry-date-picker-trigger-color, var(--dry-form-control-color));
84
+ --_dpt-radius: var(--dry-date-picker-trigger-radius, var(--dry-form-control-radius));
85
+ --_dpt-padding-x: var(
86
+ --dry-date-picker-trigger-padding-x,
87
+ var(--dry-form-control-padding-inline)
88
+ );
89
+ --_dpt-padding-y: var(
90
+ --dry-date-picker-trigger-padding-y,
91
+ var(--dry-form-control-padding-block)
92
+ );
93
+ --_dpt-font-size: var(--dry-date-picker-trigger-font-size, var(--dry-form-control-font-size));
94
+
95
+ display: grid;
96
+ grid-template-columns: minmax(0, 1fr) max-content;
97
+ align-items: center;
98
+ gap: var(--dry-space-2);
99
+ padding-block: var(--_dpt-padding-y);
100
+ padding-inline: var(--_dpt-padding-x);
101
+ font-size: var(--_dpt-font-size);
102
+ line-height: var(--dry-type-small-leading);
103
+ font-family: var(--dry-font-sans);
104
+ color: var(--_dpt-color);
105
+ background: var(--_dpt-bg);
106
+ border: 1px solid var(--_dpt-border);
107
+ border-radius: var(--_dpt-radius);
108
+ box-sizing: border-box;
109
+ appearance: none;
110
+ text-align: start;
111
+ cursor: pointer;
112
+ user-select: none;
113
+ transition:
114
+ border-color var(--dry-duration-fast) var(--dry-ease-default),
115
+ box-shadow var(--dry-duration-fast) var(--dry-ease-default);
116
+ }
117
+
118
+ [data-date-picker-trigger] [data-content] {
119
+ display: block;
120
+ overflow: hidden;
121
+ text-overflow: ellipsis;
122
+ white-space: nowrap;
123
+ }
124
+
125
+ [data-date-picker-trigger] [data-placeholder] {
126
+ color: var(--dry-form-control-color-placeholder);
127
+ }
128
+
129
+ [data-date-picker-trigger]:hover:not([data-disabled]) {
130
+ border-color: var(--dry-form-control-border-hover);
131
+ }
132
+
133
+ [data-date-picker-trigger]:focus-visible {
134
+ outline: var(--dry-focus-ring);
135
+ outline-offset: -1px;
136
+ border-color: var(--dry-color-stroke-focus);
137
+ box-shadow: 0 0 0 1px var(--dry-color-stroke-focus);
138
+ }
139
+
140
+ [data-date-picker-trigger][data-disabled] {
141
+ --dry-date-picker-trigger-bg: var(--dry-color-bg-sunken);
142
+ --dry-date-picker-trigger-border: var(--dry-color-stroke-disabled);
143
+ --dry-date-picker-trigger-color: var(--dry-color-text-disabled);
144
+ cursor: not-allowed;
145
+ }
146
+
147
+ [data-date-picker-trigger][data-size='sm'] {
148
+ --dry-date-picker-trigger-padding-x: var(--dry-space-2);
149
+ --dry-date-picker-trigger-padding-y: var(--dry-space-1);
150
+ --dry-date-picker-trigger-font-size: var(--dry-type-tiny-size);
151
+ line-height: var(--dry-type-tiny-leading);
152
+ }
153
+
154
+ [data-date-picker-trigger][data-size='md'] {
155
+ --dry-date-picker-trigger-padding-x: var(--dry-space-3);
156
+ --dry-date-picker-trigger-padding-y: var(--dry-space-2);
157
+ --dry-date-picker-trigger-font-size: var(--dry-type-small-size);
158
+ line-height: var(--dry-type-small-leading);
159
+ }
160
+
161
+ [data-date-picker-trigger][data-size='lg'] {
162
+ --dry-date-picker-trigger-padding-x: var(--dry-space-4);
163
+ --dry-date-picker-trigger-padding-y: var(--dry-space-2_5);
164
+ --dry-date-picker-trigger-font-size: var(--dry-type-heading-4-size);
165
+ line-height: var(--dry-type-heading-4-leading);
166
+ }
167
+
168
+ svg[data-indicator] {
169
+ height: 1em;
170
+ aspect-ratio: 1;
171
+ place-self: center;
172
+ opacity: 0.7;
173
+ }
174
+ </style>
@@ -133,6 +133,7 @@
133
133
 
134
134
  [data-displacement] {
135
135
  position: relative;
136
+ block-size: 100%;
136
137
  border-radius: inherit;
137
138
  overflow: hidden;
138
139
  }
@@ -115,7 +115,7 @@
115
115
  [data-fu-dropzone][data-dragging] {
116
116
  --_fu-border-default: var(--dry-color-fill-brand);
117
117
  --_fu-bg-default: color-mix(in srgb, var(--dry-color-fill-brand) 8%, transparent);
118
- color: var(--dry-color-fill-brand);
118
+ color: var(--dry-color-text-brand);
119
119
  }
120
120
 
121
121
  [data-fu-dropzone][data-disabled] {
@@ -6,8 +6,6 @@
6
6
  observeInViewport,
7
7
  observePageVisibility,
8
8
  observeReducedMotionPreference,
9
- registerPropertyOnce,
10
- supportsPropertyRegistration,
11
9
  supportsPointerTracking
12
10
  } from '@dryui/primitives';
13
11
 
@@ -90,34 +88,9 @@
90
88
  }
91
89
 
92
90
  $effect(() => {
93
- registerPropertyOnce({
94
- name: '--dry-mesh-color-1',
95
- syntax: '<color>',
96
- inherits: false,
97
- initialValue: '#7b68ee'
98
- });
99
- registerPropertyOnce({
100
- name: '--dry-mesh-color-2',
101
- syntax: '<color>',
102
- inherits: false,
103
- initialValue: '#38bdf8'
104
- });
105
- registerPropertyOnce({
106
- name: '--dry-mesh-color-3',
107
- syntax: '<color>',
108
- inherits: false,
109
- initialValue: '#f472b6'
110
- });
111
- registerPropertyOnce({
112
- name: '--dry-mesh-color-4',
113
- syntax: '<color>',
114
- inherits: false,
115
- initialValue: '#4ade80'
116
- });
117
-
118
91
  const updateAnimatedState = (matches: boolean) => {
119
92
  prefersReducedMotion = matches;
120
- animated = !matches && supportsPropertyRegistration();
93
+ animated = !matches;
121
94
  };
122
95
 
123
96
  const stopMotionObserver = observeReducedMotionPreference(updateAnimatedState);
@@ -135,11 +108,7 @@
135
108
  );
136
109
  }
137
110
 
138
- if (!supportsPropertyRegistration() || getReducedMotionPreference()) {
139
- animated = false;
140
- } else {
141
- animated = true;
142
- }
111
+ animated = !getReducedMotionPreference();
143
112
 
144
113
  return () => {
145
114
  cancelQueuedPointerPosition();
@@ -190,6 +159,17 @@
190
159
  --dry-mesh-duration: 12s;
191
160
  --dry-mesh-pointer-x: 50%;
192
161
  --dry-mesh-pointer-y: 50%;
162
+ --dry-mesh-origin-1: 18% 18%;
163
+ --dry-mesh-origin-2: 82% 18%;
164
+ --dry-mesh-origin-3: 72% 82%;
165
+ --dry-mesh-origin-4: 18% 78%;
166
+ --dry-mesh-base: linear-gradient(
167
+ 135deg,
168
+ var(--dry-mesh-color-4, #4ade80) 0%,
169
+ var(--dry-mesh-color-1, #7b68ee) 34%,
170
+ var(--dry-mesh-color-2, #38bdf8) 68%,
171
+ var(--dry-mesh-color-3, #f472b6) 100%
172
+ );
193
173
 
194
174
  position: relative;
195
175
  isolation: isolate;
@@ -197,62 +177,76 @@
197
177
  border-radius: inherit;
198
178
  background:
199
179
  radial-gradient(
200
- ellipse 60% 50% at 20% 20%,
201
- var(--dry-mesh-color-1, #7b68ee),
180
+ ellipse 80% 70% at var(--dry-mesh-origin-1),
181
+ var(--dry-mesh-color-1, #7b68ee) 0%,
182
+ transparent 68%
183
+ ),
184
+ radial-gradient(
185
+ ellipse 70% 68% at var(--dry-mesh-origin-2),
186
+ var(--dry-mesh-color-2, #38bdf8) 0%,
202
187
  transparent 70%
203
188
  ),
204
189
  radial-gradient(
205
- ellipse 50% 60% at 80% 20%,
206
- var(--dry-mesh-color-2, #38bdf8),
190
+ ellipse 78% 62% at var(--dry-mesh-origin-3),
191
+ var(--dry-mesh-color-3, #f472b6) 0%,
207
192
  transparent 70%
208
193
  ),
209
194
  radial-gradient(
210
- ellipse 55% 55% at 70% 80%,
211
- var(--dry-mesh-color-3, #f472b6),
195
+ ellipse 72% 66% at var(--dry-mesh-origin-4),
196
+ var(--dry-mesh-color-4, #4ade80) 0%,
197
+ transparent 72%
198
+ ),
199
+ var(--dry-mesh-base);
200
+ background:
201
+ radial-gradient(
202
+ ellipse 80% 70% at var(--dry-mesh-origin-1),
203
+ color-mix(in srgb, var(--dry-mesh-color-1, #7b68ee) 86%, transparent) 0%,
204
+ transparent 68%
205
+ ),
206
+ radial-gradient(
207
+ ellipse 70% 68% at var(--dry-mesh-origin-2),
208
+ color-mix(in srgb, var(--dry-mesh-color-2, #38bdf8) 82%, transparent) 0%,
212
209
  transparent 70%
213
210
  ),
214
- radial-gradient(ellipse 50% 50% at 25% 75%, var(--dry-mesh-color-4, #4ade80), transparent 70%);
215
- }
216
-
217
- /* Static fallback without @property */
218
- @supports not (background: paint(id)) {
219
- [data-gradient-mesh]:not([data-animated]) {
220
- background: linear-gradient(
221
- 135deg,
222
- var(--dry-mesh-color-1, #7b68ee) 0%,
223
- var(--dry-mesh-color-2, #38bdf8) 33%,
224
- var(--dry-mesh-color-3, #f472b6) 66%,
225
- var(--dry-mesh-color-4, #4ade80) 100%
226
- );
227
- }
211
+ radial-gradient(
212
+ ellipse 78% 62% at var(--dry-mesh-origin-3),
213
+ color-mix(in srgb, var(--dry-mesh-color-3, #f472b6) 84%, transparent) 0%,
214
+ transparent 70%
215
+ ),
216
+ radial-gradient(
217
+ ellipse 72% 66% at var(--dry-mesh-origin-4),
218
+ color-mix(in srgb, var(--dry-mesh-color-4, #4ade80) 84%, transparent) 0%,
219
+ transparent 72%
220
+ ),
221
+ var(--dry-mesh-base);
222
+ background-size:
223
+ 130% 130%,
224
+ 125% 125%,
225
+ 135% 130%,
226
+ 125% 130%,
227
+ 100% 100%;
228
+ background-position:
229
+ 0% 8%,
230
+ 100% 0%,
231
+ 90% 100%,
232
+ 0% 92%,
233
+ center;
228
234
  }
229
235
 
230
236
  [data-gradient-mesh][data-animated] {
231
237
  animation: mesh-cycle var(--dry-mesh-duration) ease-in-out infinite alternate;
232
238
  }
233
239
 
240
+ [data-gradient-mesh][data-animated]:not([data-paused]) {
241
+ will-change: background-position;
242
+ }
243
+
234
244
  [data-gradient-mesh][data-animated][data-paused] {
235
245
  animation-play-state: paused;
236
246
  }
237
247
 
238
248
  [data-gradient-mesh][data-interactive] {
239
- background:
240
- radial-gradient(
241
- ellipse 60% 50% at var(--dry-mesh-pointer-x) var(--dry-mesh-pointer-y),
242
- var(--dry-mesh-color-1, #7b68ee),
243
- transparent 70%
244
- ),
245
- radial-gradient(
246
- ellipse 50% 60% at 80% 20%,
247
- var(--dry-mesh-color-2, #38bdf8),
248
- transparent 70%
249
- ),
250
- radial-gradient(
251
- ellipse 55% 55% at 70% 80%,
252
- var(--dry-mesh-color-3, #f472b6),
253
- transparent 70%
254
- ),
255
- radial-gradient(ellipse 50% 50% at 25% 75%, var(--dry-mesh-color-4, #4ade80), transparent 70%);
249
+ --dry-mesh-origin-1: var(--dry-mesh-pointer-x) var(--dry-mesh-pointer-y);
256
250
  }
257
251
 
258
252
  [data-gradient-mesh][data-reduced-motion] {
@@ -266,31 +260,30 @@
266
260
 
267
261
  @keyframes mesh-cycle {
268
262
  0% {
269
- --dry-mesh-color-1: var(--dry-mesh-color-1);
270
- --dry-mesh-color-2: var(--dry-mesh-color-2);
271
- --dry-mesh-color-3: var(--dry-mesh-color-3);
272
- --dry-mesh-color-4: var(--dry-mesh-color-4);
273
- }
274
-
275
- 33% {
276
- --dry-mesh-color-1: var(--dry-mesh-color-2);
277
- --dry-mesh-color-2: var(--dry-mesh-color-3);
278
- --dry-mesh-color-3: var(--dry-mesh-color-4);
279
- --dry-mesh-color-4: var(--dry-mesh-color-1);
263
+ background-position:
264
+ 0% 8%,
265
+ 100% 0%,
266
+ 90% 100%,
267
+ 0% 92%,
268
+ center;
280
269
  }
281
270
 
282
- 66% {
283
- --dry-mesh-color-1: var(--dry-mesh-color-3);
284
- --dry-mesh-color-2: var(--dry-mesh-color-4);
285
- --dry-mesh-color-3: var(--dry-mesh-color-1);
286
- --dry-mesh-color-4: var(--dry-mesh-color-2);
271
+ 50% {
272
+ background-position:
273
+ 12% 18%,
274
+ 88% 14%,
275
+ 100% 82%,
276
+ 14% 100%,
277
+ center;
287
278
  }
288
279
 
289
280
  100% {
290
- --dry-mesh-color-1: var(--dry-mesh-color-4);
291
- --dry-mesh-color-2: var(--dry-mesh-color-1);
292
- --dry-mesh-color-3: var(--dry-mesh-color-2);
293
- --dry-mesh-color-4: var(--dry-mesh-color-3);
281
+ background-position:
282
+ 8% 0%,
283
+ 96% 18%,
284
+ 82% 94%,
285
+ 6% 84%,
286
+ center;
294
287
  }
295
288
  }
296
289
 
@@ -55,7 +55,7 @@
55
55
  }
56
56
 
57
57
  [data-link-preview-trigger]:hover {
58
- color: var(--dry-color-fill-brand-hover);
58
+ color: var(--dry-color-text-brand);
59
59
  text-decoration-color: currentColor;
60
60
  }
61
61
  </style>
@@ -50,7 +50,10 @@
50
50
  --dry-option-picker-preview-bg,
51
51
  color-mix(in srgb, var(--dry-color-fill-weak) 72%, var(--dry-color-bg-base) 28%)
52
52
  );
53
- color: var(--dry-option-picker-preview-color, var(--dry-color-text-strong));
53
+ color: var(
54
+ --dry-option-picker-preview-color,
55
+ var(--_option-picker-preview-preset-color, var(--dry-color-text-strong))
56
+ );
54
57
  box-shadow: var(--dry-option-picker-preview-shadow, none);
55
58
  overflow: hidden;
56
59
  }
@@ -74,7 +77,7 @@
74
77
  --_preset-color,
75
78
  var(--dry-option-picker-preview-bg, var(--dry-color-fill-selected))
76
79
  );
77
- --dry-option-picker-preview-color: var(--dry-option-picker-preview-tint-light, white);
80
+ --_option-picker-preview-preset-color: var(--dry-option-picker-preview-tint-light, white);
78
81
  --dry-option-picker-preview-border: color-mix(
79
82
  in srgb,
80
83
  var(--_preset-color-resolved) 46%,
@@ -105,6 +108,12 @@
105
108
  transition: border-radius var(--dry-duration-fast) var(--dry-ease-default);
106
109
  }
107
110
 
111
+ @supports (color: contrast-color(white)) {
112
+ [data-option-picker-preview][data-variant='preset'] {
113
+ --_option-picker-preview-preset-color: contrast-color(var(--_preset-color-resolved));
114
+ }
115
+ }
116
+
108
117
  [data-option-picker-preview][data-variant='font'] {
109
118
  --dry-option-picker-preview-size: 2.75rem;
110
119
  --dry-option-picker-preview-bg: color-mix(
@@ -174,7 +174,7 @@
174
174
  }
175
175
 
176
176
  [data-part='content'] a {
177
- color: var(--dry-color-fill-brand);
177
+ color: var(--dry-color-text-brand);
178
178
  text-decoration: underline;
179
179
  }
180
180
 
@@ -1,4 +1,10 @@
1
- export type { SelectRootProps, SelectTriggerProps, SelectContentProps, SelectItemProps, SelectValueProps } from '@dryui/primitives';
1
+ export type { SelectRootProps, SelectContentProps, SelectItemProps, SelectValueProps } from '@dryui/primitives';
2
+ import type { Snippet } from 'svelte';
3
+ import type { HTMLButtonAttributes } from 'svelte/elements';
4
+ export interface SelectTriggerProps extends Omit<HTMLButtonAttributes, 'children'> {
5
+ size?: 'sm' | 'md' | 'lg';
6
+ children: Snippet;
7
+ }
2
8
  import SelectRoot from './select-root-input.svelte';
3
9
  import SelectTrigger from './select-trigger-button.svelte';
4
10
  import SelectContent from './select-content.svelte';
@@ -146,12 +146,8 @@
146
146
  }
147
147
 
148
148
  [data-variant='solid'][data-color='orange'] {
149
- --_tag-bg-default: color-mix(
150
- in srgb,
151
- var(--dry-color-fill-warning) 70%,
152
- var(--dry-color-fill-error)
153
- );
154
- --_tag-color-default: var(--dry-color-on-warning);
149
+ --_tag-bg-default: var(--dry-color-fill-orange);
150
+ --_tag-color-default: var(--dry-color-on-orange);
155
151
  }
156
152
 
157
153
  /* ── Variant: outline ─────────────────────────────────────────────────────── */
@@ -41,7 +41,7 @@
41
41
  margin-inline-end: var(--dry-tags-input-gap, var(--dry-space-1_5));
42
42
  margin-block: calc(var(--dry-tags-input-gap, var(--dry-space-1_5)) / 2);
43
43
  background: color-mix(in srgb, var(--dry-color-fill-brand) 15%, transparent);
44
- color: var(--dry-color-fill-brand);
44
+ color: var(--dry-color-text-brand);
45
45
  border-radius: var(--dry-tags-input-tag-radius, var(--dry-radius-md));
46
46
  overflow: hidden;
47
47
  font-size: var(