@dryui/ui 0.0.7 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/alert/alert-close.svelte +2 -1
  2. package/dist/alert/alert-icon.svelte +1 -0
  3. package/dist/alert/alert-root.svelte +2 -18
  4. package/dist/button-group/button-group.svelte +4 -5
  5. package/dist/calendar/calendar-root.svelte +1 -1
  6. package/dist/checkbox/checkbox.svelte +82 -27
  7. package/dist/color-picker/color-picker-root.svelte +1 -0
  8. package/dist/combobox/combobox-group.svelte +0 -1
  9. package/dist/country-select/country-select.svelte +3 -5
  10. package/dist/date-range-picker/date-range-picker-root.svelte +0 -1
  11. package/dist/dialog/dialog-footer.svelte +0 -1
  12. package/dist/field/field-root.svelte +1 -9
  13. package/dist/file-select/file-select-clear.svelte +1 -0
  14. package/dist/file-select/file-select-root.svelte +3 -2
  15. package/dist/file-select/file-select-trigger.svelte +2 -0
  16. package/dist/file-select/file-select-value.svelte +1 -0
  17. package/dist/file-upload/file-upload-dropzone.svelte +2 -0
  18. package/dist/file-upload/file-upload-root.svelte +0 -1
  19. package/dist/flip-card/flip-card-back.svelte +5 -0
  20. package/dist/flip-card/flip-card-front.svelte +5 -0
  21. package/dist/flip-card/flip-card-root.svelte +11 -35
  22. package/dist/float-button/float-button-action.svelte +2 -6
  23. package/dist/float-button/float-button-root.svelte +4 -9
  24. package/dist/float-button/float-button-trigger.svelte +5 -9
  25. package/dist/input-group/input-group-action.svelte +33 -0
  26. package/dist/input-group/input-group-input.svelte +35 -8
  27. package/dist/input-group/input-group-prefix.svelte +13 -0
  28. package/dist/input-group/input-group-root.svelte +0 -94
  29. package/dist/input-group/input-group-select.svelte +38 -0
  30. package/dist/input-group/input-group-separator.svelte +7 -0
  31. package/dist/input-group/input-group-suffix.svelte +13 -0
  32. package/dist/label/label.svelte +1 -0
  33. package/dist/list/list-root.svelte +0 -1
  34. package/dist/map/map-root.svelte +7 -11
  35. package/dist/markdown-renderer/markdown-renderer.svelte +109 -108
  36. package/dist/multi-select-combobox/multi-select-combobox-group.svelte +0 -1
  37. package/dist/navigation-menu/navigation-menu-item.svelte +6 -0
  38. package/dist/navigation-menu/navigation-menu-list.svelte +0 -4
  39. package/dist/notification-center/notification-center-group.svelte +12 -0
  40. package/dist/notification-center/notification-center-item.svelte +28 -0
  41. package/dist/notification-center/notification-center-panel.svelte +34 -0
  42. package/dist/notification-center/notification-center-root.svelte +1 -82
  43. package/dist/notification-center/notification-center-trigger.svelte +1 -0
  44. package/dist/option-swatch-group/option-swatch-group-root.svelte +1 -1
  45. package/dist/pin-input/pin-input-cell.svelte +1 -2
  46. package/dist/radio-group/radio-group.svelte +0 -1
  47. package/dist/range-calendar/range-calendar-grid.svelte +139 -0
  48. package/dist/range-calendar/range-calendar-root.svelte +0 -164
  49. package/dist/rich-text-editor/rich-text-editor-content.svelte +73 -0
  50. package/dist/rich-text-editor/rich-text-editor-root.svelte +0 -221
  51. package/dist/rich-text-editor/rich-text-editor-toolbar.svelte +149 -0
  52. package/dist/shader-canvas/shader-canvas.svelte +0 -1
  53. package/dist/sidebar/sidebar-content.svelte +7 -14
  54. package/dist/sidebar/sidebar-group-label.svelte +10 -4
  55. package/dist/sidebar/sidebar-group.svelte +8 -0
  56. package/dist/sidebar/sidebar-header.svelte +9 -5
  57. package/dist/sidebar/sidebar-root.svelte +1 -1
  58. package/dist/sidebar/sidebar-trigger.svelte +0 -1
  59. package/dist/system-map/system-map.svelte +0 -1
  60. package/dist/tabs/tabs-root.svelte +17 -1
  61. package/dist/tabs/tabs-trigger.svelte +4 -13
  62. package/dist/tags-input/tags-input-root.svelte +12 -5
  63. package/dist/tags-input/tags-input-tag-delete.svelte +2 -2
  64. package/dist/tags-input/tags-input-tag.svelte +1 -1
  65. package/dist/transfer/transfer-item.svelte +2 -1
  66. package/dist/transfer/transfer-list.svelte +7 -18
  67. package/dist/virtual-list/virtual-list.svelte +0 -1
  68. package/package.json +1183 -447
@@ -36,7 +36,8 @@
36
36
  place-items: center;
37
37
  height: var(--dry-space-11);
38
38
  aspect-ratio: 1;
39
- padding: 0;
39
+ padding-block: 0;
40
+ padding-inline: var(--dry-alert-gap, var(--dry-space-3)) 0;
40
41
  border: none;
41
42
  border-radius: var(--dry-radius-sm);
42
43
  background: transparent;
@@ -21,5 +21,6 @@
21
21
  display: grid;
22
22
  align-items: center;
23
23
  margin-top: var(--dry-space-0_5);
24
+ padding-inline-end: var(--dry-alert-gap, var(--dry-space-3));
24
25
  }
25
26
  </style>
@@ -48,7 +48,6 @@
48
48
  </div>
49
49
  {/if}
50
50
 
51
- <!-- svelte-ignore css_unused_selector -->
52
51
  <style>
53
52
  [data-alert] {
54
53
  --dry-alert-bg: var(--dry-color-fill-info-weak);
@@ -64,9 +63,9 @@
64
63
 
65
64
  container-type: inline-size;
66
65
  display: grid;
67
- grid-template-columns: 1fr;
66
+ grid-template-columns: auto 1fr auto;
68
67
  align-items: start;
69
- column-gap: var(--dry-alert-gap, var(--dry-space-3));
68
+ column-gap: 0;
70
69
  row-gap: var(--dry-space-1);
71
70
  padding: var(--dry-alert-padding, var(--dry-space-6));
72
71
  background: var(--dry-alert-bg);
@@ -106,26 +105,11 @@
106
105
  --dry-alert-icon-color: var(--dry-color-fill-error);
107
106
  }
108
107
 
109
- /* ── Grid modifiers ────────────────────────────────────────────────────────── */
110
-
111
- [data-alert]:has([data-alert-icon]) {
112
- grid-template-columns: auto 1fr;
113
- }
114
-
115
- [data-alert]:has([data-alert-close]) {
116
- grid-template-columns: 1fr auto;
117
- }
118
-
119
- [data-alert]:has([data-alert-icon]):has([data-alert-close]) {
120
- grid-template-columns: auto 1fr auto;
121
- }
122
-
123
108
  /* ── Responsive ────────────────────────────────────────────────────────────── */
124
109
 
125
110
  @container (max-width: 640px) {
126
111
  [data-alert] {
127
112
  padding: var(--dry-alert-padding, var(--dry-space-3));
128
- column-gap: var(--dry-alert-gap, var(--dry-space-2));
129
113
  }
130
114
  }
131
115
  </style>
@@ -28,7 +28,6 @@
28
28
  {@render children()}
29
29
  </div>
30
30
 
31
- <!-- svelte-ignore css_unused_selector -->
32
31
  <style>
33
32
  [data-button-group] {
34
33
  --dry-button-group-radius: var(--dry-radius-md);
@@ -65,8 +64,8 @@
65
64
 
66
65
  & > :where(button, a):hover,
67
66
  & > :where(button, a):focus-visible,
68
- & > :where(span):has(:hover) > :where(button, a),
69
- & > :where(span):has(:focus-visible) > :where(button, a) {
67
+ & > :where(span):hover > :where(button, a),
68
+ & > :where(span):focus-within > :where(button, a) {
70
69
  z-index: var(--dry-button-group-hover-z-index);
71
70
  position: relative;
72
71
  }
@@ -97,8 +96,8 @@
97
96
 
98
97
  & > :where(button, a):hover,
99
98
  & > :where(button, a):focus-visible,
100
- & > :where(span):has(:hover) > :where(button, a),
101
- & > :where(span):has(:focus-visible) > :where(button, a) {
99
+ & > :where(span):hover > :where(button, a),
100
+ & > :where(span):focus-within > :where(button, a) {
102
101
  z-index: var(--dry-button-group-hover-z-index);
103
102
  position: relative;
104
103
  }
@@ -132,7 +132,7 @@
132
132
  --dry-calendar-today-color: var(--dry-color-fill-brand);
133
133
  --dry-calendar-outside-color: var(--dry-color-text-weak);
134
134
 
135
- display: grid;
135
+ display: inline-grid;
136
136
  box-sizing: border-box;
137
137
  padding: var(--dry-calendar-padding);
138
138
  background: var(--dry-calendar-bg);
@@ -1,12 +1,14 @@
1
1
  <script lang="ts">
2
+ import type { Snippet } from 'svelte';
2
3
  import type { HTMLInputAttributes } from 'svelte/elements';
3
4
  import { getFormControlCtx } from '@dryui/primitives';
4
5
 
5
- interface Props extends Omit<HTMLInputAttributes, 'size'> {
6
+ interface Props extends Omit<HTMLInputAttributes, 'size' | 'children'> {
6
7
  checked?: boolean;
7
8
  indeterminate?: boolean;
8
9
  size?: 'sm' | 'md' | 'lg';
9
10
  disabled?: boolean;
11
+ children?: Snippet | undefined;
10
12
  }
11
13
 
12
14
  let {
@@ -14,6 +16,7 @@
14
16
  indeterminate = false,
15
17
  size = 'md',
16
18
  disabled = false,
19
+ children,
17
20
  class: className,
18
21
  ...rest
19
22
  }: Props = $props();
@@ -21,37 +24,86 @@
21
24
  const ctx = getFormControlCtx();
22
25
  const isDisabled = $derived(disabled || ctx?.disabled || false);
23
26
 
24
- let inputEl: HTMLInputElement | undefined = $state();
25
-
26
27
  let dataState = $derived(indeterminate ? 'indeterminate' : checked ? 'checked' : 'unchecked');
27
28
 
28
- $effect(() => {
29
- if (inputEl) {
30
- inputEl.indeterminate = indeterminate;
31
- }
32
- });
29
+ function applyIndeterminate(node: HTMLInputElement) {
30
+ $effect(() => {
31
+ node.indeterminate = indeterminate;
32
+ });
33
+ }
33
34
  </script>
34
35
 
35
- <span class="wrapper">
36
- <input
37
- bind:this={inputEl}
38
- type="checkbox"
39
- bind:checked
40
- id={ctx?.id}
41
- disabled={isDisabled}
42
- required={ctx?.required || undefined}
43
- aria-describedby={ctx?.describedBy}
44
- aria-invalid={ctx?.hasError || undefined}
45
- aria-errormessage={ctx?.errorMessageId}
36
+ {#if children}
37
+ <label
38
+ class="checkbox-label"
46
39
  data-disabled={isDisabled || undefined}
47
- data-state={dataState}
48
40
  data-size={size}
49
- class={className}
50
- {...rest}
51
- />
52
- </span>
41
+ >
42
+ <span class="wrapper">
43
+ <input
44
+ {@attach applyIndeterminate}
45
+ type="checkbox"
46
+ bind:checked
47
+ id={ctx?.id}
48
+ disabled={isDisabled}
49
+ required={ctx?.required || undefined}
50
+ aria-describedby={ctx?.describedBy}
51
+ aria-invalid={ctx?.hasError || undefined}
52
+ aria-errormessage={ctx?.errorMessageId}
53
+ data-disabled={isDisabled || undefined}
54
+ data-state={dataState}
55
+ data-size={size}
56
+ class={className}
57
+ {...rest}
58
+ />
59
+ </span>
60
+ <span class="checkbox-text">{@render children()}</span>
61
+ </label>
62
+ {:else}
63
+ <span class="wrapper">
64
+ <input
65
+ {@attach applyIndeterminate}
66
+ type="checkbox"
67
+ bind:checked
68
+ id={ctx?.id}
69
+ disabled={isDisabled}
70
+ required={ctx?.required || undefined}
71
+ aria-describedby={ctx?.describedBy}
72
+ aria-invalid={ctx?.hasError || undefined}
73
+ aria-errormessage={ctx?.errorMessageId}
74
+ data-disabled={isDisabled || undefined}
75
+ data-state={dataState}
76
+ data-size={size}
77
+ class={className}
78
+ {...rest}
79
+ />
80
+ </span>
81
+ {/if}
53
82
 
54
83
  <style>
84
+ .checkbox-label {
85
+ display: grid;
86
+ grid-template-columns: max-content 1fr;
87
+ align-items: center;
88
+ gap: var(--dry-space-3);
89
+ cursor: pointer;
90
+ }
91
+
92
+ .checkbox-label[data-disabled] {
93
+ cursor: not-allowed;
94
+ }
95
+
96
+ .checkbox-text {
97
+ font-size: var(--dry-text-sm-size);
98
+ line-height: var(--dry-text-sm-line);
99
+ color: var(--dry-color-text-strong);
100
+ user-select: none;
101
+ }
102
+
103
+ .checkbox-label[data-disabled] .checkbox-text {
104
+ color: var(--dry-color-text-disabled);
105
+ }
106
+
55
107
  .wrapper {
56
108
  display: inline-grid;
57
109
  grid-template-columns: minmax(48px, max-content);
@@ -100,7 +152,10 @@
100
152
  aspect-ratio: 35 / 60;
101
153
  border: solid var(--dry-checkbox-check-color);
102
154
  border-width: 0 2px 2px 0;
103
- transform: rotate(45deg) scale(1) translateY(-10%);
155
+ margin-left: calc(var(--dry-checkbox-size) * 0.52);
156
+ margin-top: calc(var(--dry-checkbox-size) * -0.18);
157
+ transform: rotate(45deg) scale(1);
158
+ transform-origin: center;
104
159
  animation: checkScale var(--dry-duration-fast) var(--dry-ease-spring);
105
160
  }
106
161
  }
@@ -177,10 +232,10 @@
177
232
 
178
233
  @keyframes checkScale {
179
234
  from {
180
- transform: rotate(45deg) scale(0) translateY(-10%);
235
+ transform: rotate(45deg) scale(0);
181
236
  }
182
237
  to {
183
- transform: rotate(45deg) scale(1) translateY(-10%);
238
+ transform: rotate(45deg) scale(1);
184
239
  }
185
240
  }
186
241
 
@@ -172,6 +172,7 @@
172
172
 
173
173
  container-type: inline-size;
174
174
  display: grid;
175
+ grid-template-columns: var(--dry-color-picker-area-width);
175
176
  gap: var(--dry-space-3);
176
177
  }
177
178
 
@@ -17,7 +17,6 @@
17
17
  {@render children()}
18
18
  </div>
19
19
 
20
- <!-- svelte-ignore css_unused_selector -->
21
20
  <style>
22
21
  [data-combobox-group] [data-part='group-label'] {
23
22
  padding: var(--dry-space-1_5) var(--dry-space-2);
@@ -279,8 +279,7 @@
279
279
  [data-country-select-wrapper] [data-part='trigger'] {
280
280
  all: unset;
281
281
  display: grid;
282
- grid-auto-flow: column;
283
- grid-auto-columns: max-content;
282
+ grid-template-columns: auto 1fr auto;
284
283
  align-items: center;
285
284
  gap: var(--dry-space-2, 0.5rem);
286
285
  padding: var(--dry-space-2, 0.5rem) var(--dry-space-3, 0.75rem);
@@ -309,7 +308,6 @@
309
308
 
310
309
  [data-country-select-wrapper] [data-part='dial-code'] {
311
310
  color: var(--dry-color-text-weak, #64748b);
312
- margin-left: auto;
313
311
  }
314
312
 
315
313
  [data-country-select-wrapper] [data-part='placeholder'] {
@@ -322,6 +320,7 @@
322
320
  left: 0;
323
321
  right: 0;
324
322
  z-index: 50;
323
+ display: grid;
325
324
  margin-top: var(--dry-space-1, 0.25rem);
326
325
  background: var(--dry-color-bg-raised, #ffffff);
327
326
  border: 1px solid var(--dry-color-stroke-weak, #e2e8f0);
@@ -343,8 +342,7 @@
343
342
  [data-country-select-wrapper] [data-part='option'] {
344
343
  all: unset;
345
344
  display: grid;
346
- grid-auto-flow: column;
347
- grid-auto-columns: max-content;
345
+ grid-template-columns: auto 1fr auto;
348
346
  align-items: center;
349
347
  gap: var(--dry-space-2, 0.5rem);
350
348
  padding: var(--dry-space-2, 0.5rem) var(--dry-space-3, 0.75rem);
@@ -151,7 +151,6 @@
151
151
 
152
152
  {@render children()}
153
153
 
154
- <!-- svelte-ignore css_unused_selector -->
155
154
  <style>
156
155
  [data-drp-root] {
157
156
  display: contents;
@@ -13,7 +13,6 @@
13
13
  {@render children()}
14
14
  </div>
15
15
 
16
- <!-- svelte-ignore css_unused_selector -->
17
16
  <style>
18
17
  [data-dialog-footer] {
19
18
  --dry-section-padding: var(--dry-dialog-padding);
@@ -73,10 +73,10 @@
73
73
  {@render children()}
74
74
  </div>
75
75
 
76
- <!-- svelte-ignore css_unused_selector -->
77
76
  <style>
78
77
  [data-field] {
79
78
  --dry-field-gap: var(--dry-space-1_5);
79
+ --dry-field-label-order: 1;
80
80
  display: grid;
81
81
  gap: var(--dry-field-gap);
82
82
 
@@ -87,13 +87,5 @@
87
87
  &[data-error] {
88
88
  --dry-field-gap: var(--dry-space-1);
89
89
  }
90
-
91
- & > :where(:not(label)) {
92
- order: 4;
93
- }
94
-
95
- & > :where(label) {
96
- order: 1;
97
- }
98
90
  }
99
91
  </style>
@@ -18,6 +18,7 @@
18
18
  type="button"
19
19
  onclick={ctx.clear}
20
20
  aria-label="Clear selection"
21
+ data-fs-clear
21
22
  data-disabled={ctx.disabled || undefined}
22
23
  {...rest}
23
24
  >
@@ -71,9 +71,10 @@
71
71
  });
72
72
  </script>
73
73
 
74
- {@render children()}
74
+ <div data-file-select data-disabled={disabled || undefined}>
75
+ {@render children()}
76
+ </div>
75
77
 
76
- <!-- svelte-ignore css_unused_selector -->
77
78
  <style>
78
79
  [data-file-select] {
79
80
  container-type: inline-size;
@@ -16,8 +16,10 @@
16
16
  type="button"
17
17
  onclick={ctx.request}
18
18
  disabled={ctx.disabled || ctx.loading || undefined}
19
+ data-fs-trigger
19
20
  data-loading={ctx.loading || undefined}
20
21
  data-disabled={ctx.disabled || undefined}
22
+ data-size={size}
21
23
  {...rest}
22
24
  class={className}
23
25
  >
@@ -11,6 +11,7 @@
11
11
  </script>
12
12
 
13
13
  <span
14
+ data-fs-value
14
15
  data-placeholder={!ctx.value || undefined}
15
16
  data-loading={ctx.loading || undefined}
16
17
  {...rest}
@@ -58,6 +58,8 @@
58
58
  <div
59
59
  role="button"
60
60
  tabindex={ctx.disabled ? undefined : 0}
61
+ data-fu-dropzone
62
+ data-size={size}
61
63
  data-dragging={ctx.isDragging || undefined}
62
64
  data-disabled={ctx.disabled || undefined}
63
65
  class={className}
@@ -134,7 +134,6 @@
134
134
 
135
135
  {@render children()}
136
136
 
137
- <!-- svelte-ignore css_unused_selector -->
138
137
  <style>
139
138
  .file-upload-hidden-input {
140
139
  display: none;
@@ -25,5 +25,10 @@
25
25
  <style>
26
26
  [data-flip-card-back] {
27
27
  z-index: 1;
28
+ backface-visibility: hidden;
29
+ transition: transform var(--dry-flip-card-duration, 0.6s) ease;
30
+ position: absolute;
31
+ inset: 0;
32
+ transform: var(--dry-flip-card-back-transform, rotateY(180deg));
28
33
  }
29
34
  </style>
@@ -16,5 +16,10 @@
16
16
  <style>
17
17
  [data-flip-card-front] {
18
18
  z-index: 2;
19
+ backface-visibility: hidden;
20
+ transition: transform var(--dry-flip-card-duration, 0.6s) ease;
21
+ position: absolute;
22
+ inset: 0;
23
+ transform: var(--dry-flip-card-front-transform, rotateY(0deg));
19
24
  }
20
25
  </style>
@@ -59,53 +59,29 @@
59
59
  {@render children()}
60
60
  </div>
61
61
 
62
- <!-- svelte-ignore css_unused_selector -->
63
62
  <style>
64
63
  [data-flip-card] {
65
64
  --dry-flip-card-duration: 0.6s;
66
65
  --dry-flip-card-perspective: 1000px;
66
+ --dry-flip-card-front-transform: rotateY(0deg);
67
+ --dry-flip-card-back-transform: rotateY(180deg);
67
68
 
68
69
  perspective: var(--dry-flip-card-perspective);
69
70
  position: relative;
70
71
  }
71
72
 
72
- [data-flip-card] > :where([data-part='front']),
73
- [data-flip-card] > :where([data-part='back']) {
74
- backface-visibility: hidden;
75
- transition: transform var(--dry-flip-card-duration) ease;
76
- position: absolute;
77
- inset: 0;
73
+ [data-flip-card][data-direction='horizontal'][data-flipped] {
74
+ --dry-flip-card-front-transform: rotateY(180deg);
75
+ --dry-flip-card-back-transform: rotateY(360deg);
78
76
  }
79
77
 
80
- [data-flip-card] > :where([data-part='front']) {
81
- transform: rotateY(0deg);
78
+ [data-flip-card][data-direction='vertical'] {
79
+ --dry-flip-card-front-transform: rotateX(0deg);
80
+ --dry-flip-card-back-transform: rotateX(180deg);
82
81
  }
83
82
 
84
- [data-flip-card] > :where([data-part='back']) {
85
- transform: rotateY(180deg);
86
- }
87
-
88
- [data-flip-card][data-direction='horizontal'][data-flipped] > :where([data-part='front']) {
89
- transform: rotateY(180deg);
90
- }
91
-
92
- [data-flip-card][data-direction='horizontal'][data-flipped] > :where([data-part='back']) {
93
- transform: rotateY(360deg);
94
- }
95
-
96
- [data-flip-card][data-direction='vertical'] > :where([data-part='front']) {
97
- transform: rotateX(0deg);
98
- }
99
-
100
- [data-flip-card][data-direction='vertical'] > :where([data-part='back']) {
101
- transform: rotateX(180deg);
102
- }
103
-
104
- [data-flip-card][data-direction='vertical'][data-flipped] > :where([data-part='front']) {
105
- transform: rotateX(180deg);
106
- }
107
-
108
- [data-flip-card][data-direction='vertical'][data-flipped] > :where([data-part='back']) {
109
- transform: rotateX(360deg);
83
+ [data-flip-card][data-direction='vertical'][data-flipped] {
84
+ --dry-flip-card-front-transform: rotateX(180deg);
85
+ --dry-flip-card-back-transform: rotateX(360deg);
110
86
  }
111
87
  </style>
@@ -14,6 +14,7 @@
14
14
 
15
15
  <button
16
16
  type="button"
17
+ data-float-button-action
17
18
  data-state={ctx.open ? 'open' : 'closed'}
18
19
  tabindex={ctx.open ? 0 : -1}
19
20
  {...rest}
@@ -22,13 +23,8 @@
22
23
  {@render children()}
23
24
  </button>
24
25
 
25
- <!-- svelte-ignore css_unused_selector -->
26
26
  <style>
27
- [data-float-button-action-wrapper] {
28
- display: contents;
29
- }
30
-
31
- [data-float-button-action-wrapper] :where(button) {
27
+ [data-float-button-action] {
32
28
  --dry-fab-action-bg: var(--dry-color-bg-overlay);
33
29
  --dry-fab-action-color: var(--dry-color-text-strong);
34
30
  --dry-fab-action-border: var(--dry-color-stroke-weak);
@@ -27,17 +27,12 @@
27
27
  });
28
28
  </script>
29
29
 
30
- <div data-state={open ? 'open' : 'closed'} {...rest} class={className}>
30
+ <div data-float-button data-position={position} data-state={open ? 'open' : 'closed'} {...rest} class={className}>
31
31
  {@render children()}
32
32
  </div>
33
33
 
34
- <!-- svelte-ignore css_unused_selector -->
35
34
  <style>
36
- [data-float-button-wrapper] {
37
- display: contents;
38
- }
39
-
40
- [data-float-button-wrapper] :where([data-float-button]) {
35
+ [data-float-button] {
41
36
  --dry-fab-offset: var(--dry-space-6);
42
37
  --dry-fab-gap: var(--dry-space-3);
43
38
  --dry-fab-z-index: var(--dry-layer-overlay);
@@ -49,12 +44,12 @@
49
44
  gap: var(--dry-fab-gap);
50
45
  }
51
46
 
52
- [data-float-button-wrapper][data-position='bottom-right'] :where([data-float-button]) {
47
+ [data-float-button][data-position='bottom-right'] {
53
48
  bottom: var(--dry-fab-offset);
54
49
  right: var(--dry-fab-offset);
55
50
  }
56
51
 
57
- [data-float-button-wrapper][data-position='bottom-left'] :where([data-float-button]) {
52
+ [data-float-button][data-position='bottom-left'] {
58
53
  bottom: var(--dry-fab-offset);
59
54
  left: var(--dry-fab-offset);
60
55
  }
@@ -18,6 +18,7 @@
18
18
  aria-expanded={ctx.open}
19
19
  data-state={ctx.open ? 'open' : 'closed'}
20
20
  data-float-button-trigger
21
+ data-size={size}
21
22
  class={className}
22
23
  onclick={() => ctx.toggle()}
23
24
  {...rest}
@@ -25,13 +26,8 @@
25
26
  {@render children()}
26
27
  </button>
27
28
 
28
- <!-- svelte-ignore css_unused_selector -->
29
29
  <style>
30
- [data-float-button-trigger-wrapper] {
31
- display: contents;
32
- }
33
-
34
- [data-float-button-trigger-wrapper] :where(button) {
30
+ [data-float-button-trigger] {
35
31
  --dry-fab-bg: var(--dry-color-fill-brand);
36
32
  --dry-fab-color: var(--dry-color-on-brand);
37
33
  --dry-fab-shadow: var(--dry-shadow-lg);
@@ -73,17 +69,17 @@
73
69
  }
74
70
  }
75
71
 
76
- [data-float-button-trigger-wrapper][data-size='sm'] :where(button) {
72
+ [data-float-button-trigger][data-size='sm'] {
77
73
  height: 44px;
78
74
  aspect-ratio: 1;
79
75
  }
80
76
 
81
- [data-float-button-trigger-wrapper][data-size='md'] :where(button) {
77
+ [data-float-button-trigger][data-size='md'] {
82
78
  height: 52px;
83
79
  aspect-ratio: 1;
84
80
  }
85
81
 
86
- [data-float-button-trigger-wrapper][data-size='lg'] :where(button) {
82
+ [data-float-button-trigger][data-size='lg'] {
87
83
  height: 60px;
88
84
  aspect-ratio: 1;
89
85
  }
@@ -27,3 +27,36 @@
27
27
  >
28
28
  {@render children?.()}
29
29
  </button>
30
+
31
+ <style>
32
+ [data-input-group-action] {
33
+ display: inline-grid;
34
+ grid-auto-flow: column;
35
+ grid-auto-columns: max-content;
36
+ align-items: center;
37
+ gap: 0.5rem;
38
+ padding: 0 var(--dry-input-group-padding-x);
39
+ white-space: nowrap;
40
+ appearance: none;
41
+ border: 0;
42
+ background: transparent;
43
+ color: var(--dry-color-text-strong);
44
+ cursor: pointer;
45
+ font: inherit;
46
+ font-size: var(--dry-input-group-font-size);
47
+ transition: background-color 160ms ease;
48
+ }
49
+
50
+ [data-input-group-action]:hover:not(:disabled) {
51
+ background: var(--dry-color-fill-weak);
52
+ }
53
+
54
+ [data-input-group-action]:focus-visible {
55
+ outline: none;
56
+ background: var(--dry-color-fill-weak);
57
+ }
58
+
59
+ [data-input-group-action]:disabled {
60
+ cursor: not-allowed;
61
+ }
62
+ </style>