@dryui/ui 1.2.0 → 1.3.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 (75) hide show
  1. package/dist/accordion/accordion-button-trigger.svelte +6 -0
  2. package/dist/alert/alert.svelte +2 -1
  3. package/dist/alert-dialog/alert-dialog-content.svelte +9 -69
  4. package/dist/alpha-slider/alpha-slider-input.svelte +4 -0
  5. package/dist/avatar/avatar.svelte +3 -4
  6. package/dist/backdrop/backdrop.svelte +12 -9
  7. package/dist/badge/badge.svelte +84 -72
  8. package/dist/button/button.svelte +3 -6
  9. package/dist/button-group/button-group.svelte +2 -2
  10. package/dist/calendar/calendar-button-grid.svelte +1 -1
  11. package/dist/card/card-root.svelte +9 -4
  12. package/dist/chip-group/chip-group-root.svelte +2 -2
  13. package/dist/code-block/code-block-button.svelte +6 -2
  14. package/dist/context-menu/context-menu-content.svelte +12 -79
  15. package/dist/diagram/diagram.svelte +3 -4
  16. package/dist/dialog/dialog-content.svelte +5 -103
  17. package/dist/drag-and-drop/drag-and-drop-item.svelte +1 -1
  18. package/dist/drawer/drawer-dialog-content.svelte +5 -155
  19. package/dist/dropdown-menu/dropdown-menu-content.svelte +14 -71
  20. package/dist/heading/heading.svelte +7 -6
  21. package/dist/hover-card/hover-card-content.svelte +3 -12
  22. package/dist/icon/icon.svelte +2 -2
  23. package/dist/index.d.ts +2 -2
  24. package/dist/index.js +1 -1
  25. package/dist/input/input.svelte +3 -3
  26. package/dist/internal/calendar-grid-button.svelte +29 -26
  27. package/dist/internal/calendar-grid-button.svelte.d.ts +1 -0
  28. package/dist/internal/close-button-base.svelte +15 -2
  29. package/dist/internal/close-button-base.svelte.d.ts +1 -0
  30. package/dist/internal/modal-content.svelte +331 -0
  31. package/dist/internal/modal-content.svelte.d.ts +26 -0
  32. package/dist/link-preview/link-preview-content.svelte +3 -11
  33. package/dist/logo-mark/logo-mark.svelte +2 -3
  34. package/dist/marquee/marquee.svelte +14 -3
  35. package/dist/mask-reveal/mask-reveal.svelte +17 -14
  36. package/dist/mega-menu/mega-menu-panel.svelte +14 -2
  37. package/dist/mega-menu/mega-menu-panel.svelte.d.ts +1 -0
  38. package/dist/menubar/menubar-content.svelte +21 -81
  39. package/dist/noise/noise.svelte +1 -0
  40. package/dist/option-picker/option-picker-preview.svelte +11 -10
  41. package/dist/popover/popover-content.svelte +10 -36
  42. package/dist/progress/progress.svelte +2 -2
  43. package/dist/prompt-input/index.d.ts +13 -1
  44. package/dist/prompt-input/prompt-input-button-textarea.svelte +13 -1
  45. package/dist/prompt-input/prompt-input-button-textarea.svelte.d.ts +3 -0
  46. package/dist/shimmer/shimmer.svelte +28 -3
  47. package/dist/slider/slider-input.svelte +3 -4
  48. package/dist/spacer/spacer.svelte +2 -2
  49. package/dist/spinner/spinner.svelte +2 -2
  50. package/dist/tabs/tabs-content.svelte +1 -1
  51. package/dist/tabs/tabs-list.svelte +13 -0
  52. package/dist/tag/tag-button.svelte +2 -3
  53. package/dist/text/text.svelte +4 -15
  54. package/dist/themes/dark.css +40 -24
  55. package/dist/themes/default.css +16 -12
  56. package/dist/themes/token-scope.d.ts +1 -0
  57. package/dist/themes/token-scope.js +1 -0
  58. package/dist/timeline/timeline-icon.svelte +11 -1
  59. package/dist/timeline/timeline-item.svelte +18 -5
  60. package/dist/timeline/timeline-root.svelte +3 -10
  61. package/dist/toast/toast-close-button.svelte +19 -7
  62. package/dist/toast/toast-provider.svelte +22 -1
  63. package/dist/toggle/toggle-button.svelte +7 -3
  64. package/dist/toggle-group/toggle-group-root.svelte +2 -2
  65. package/dist/tooltip/tooltip-content.svelte +8 -32
  66. package/dist/tour/tour-root.css +26 -26
  67. package/dist/tree/tree-item-label.svelte +8 -14
  68. package/dist/tree/tree-item-label.svelte.d.ts +2 -2
  69. package/dist/typography/heading.svelte +8 -6
  70. package/dist/typography/text.svelte +4 -3
  71. package/package.json +6 -2
  72. package/skills/dryui/SKILL.md +3 -3
  73. package/skills/dryui/rules/native-web-transitions.md +2 -2
  74. package/dist/themes/use-theme-override.svelte.d.ts +0 -1
  75. package/dist/themes/use-theme-override.svelte.js +0 -1
@@ -50,4 +50,10 @@
50
50
  svg[data-indicator].open {
51
51
  transform: rotate(180deg);
52
52
  }
53
+
54
+ @media (prefers-reduced-motion: reduce) {
55
+ svg[data-indicator] {
56
+ transition: none;
57
+ }
58
+ }
53
59
  </style>
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLAttributes } from 'svelte/elements';
4
+ import { variantAttrs } from '@dryui/primitives';
4
5
  import CloseButtonBase from '../internal/close-button-base.svelte';
5
6
 
6
7
  export type AlertVariant = 'info' | 'success' | 'warning' | 'error';
@@ -39,7 +40,7 @@
39
40
  <div
40
41
  role="alert"
41
42
  data-alert
42
- data-variant={variant}
43
+ {...variantAttrs({ variant })}
43
44
  data-dismissible={dismissible || undefined}
44
45
  class={className}
45
46
  {...rest}
@@ -2,85 +2,25 @@
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLAttributes } from 'svelte/elements';
4
4
  import { getAlertDialogCtx } from './context.svelte.js';
5
+ import ModalContent from '../internal/modal-content.svelte';
5
6
 
6
7
  interface Props extends HTMLAttributes<HTMLDialogElement> {
7
8
  children: Snippet;
8
9
  }
9
10
 
10
- let { class: className, children, ...rest }: Props = $props();
11
+ let { children, ...rest }: Props = $props();
11
12
 
12
13
  const ctx = getAlertDialogCtx();
13
-
14
- let dialogEl = $state<HTMLDialogElement>();
15
-
16
- $effect(() => {
17
- if (ctx.open && dialogEl && !dialogEl.open) {
18
- dialogEl.showModal();
19
- }
20
- if (!ctx.open && dialogEl?.open) {
21
- dialogEl.close();
22
- }
23
- });
24
14
  </script>
25
15
 
26
- <dialog
27
- bind:this={dialogEl}
28
- data-alert-dialog-content
16
+ <ModalContent
17
+ {ctx}
18
+ variant="alert-dialog"
19
+ side="center"
29
20
  role="alertdialog"
30
- aria-labelledby={ctx.headerId}
31
- data-state={ctx.open ? 'open' : 'closed'}
32
- onclose={() => ctx.close()}
33
- oncancel={(e) => e.preventDefault()}
34
- class={className}
21
+ dismissOnEscape={false}
22
+ dismissOnBackdropClick={false}
35
23
  {...rest}
36
24
  >
37
25
  {@render children()}
38
- </dialog>
39
-
40
- <style>
41
- [data-alert-dialog-content] {
42
- --dry-dialog-bg: var(--dry-color-bg-overlay);
43
- --dry-dialog-border: var(--dry-color-stroke-weak);
44
- --dry-dialog-radius: var(--dry-radius-xl);
45
- --dry-dialog-shadow: var(--dry-shadow-overlay);
46
- --dry-dialog-padding: var(--dry-space-6);
47
- --dry-dialog-max-width: 32rem;
48
-
49
- border: 1px solid var(--dry-dialog-border);
50
- border-radius: var(--dry-dialog-radius);
51
- background: var(--dry-dialog-bg);
52
- color: var(--dry-color-text-strong);
53
- box-shadow: var(--dry-dialog-shadow);
54
- grid-template-columns: min(var(--dry-dialog-max-width), 90vw);
55
- margin: auto;
56
- padding: 0;
57
- max-height: 85vh;
58
- display: grid;
59
-
60
- transition:
61
- opacity var(--dry-duration-normal) var(--dry-ease-spring-snappy),
62
- transform var(--dry-duration-normal) var(--dry-ease-spring-snappy);
63
- }
64
-
65
- [data-alert-dialog-content]:not([open]) {
66
- display: none;
67
- }
68
-
69
- [data-alert-dialog-content]::backdrop {
70
- background: var(--dry-overlay-bg, var(--dry-color-overlay-backdrop-strong));
71
- backdrop-filter: blur(var(--dry-overlay-blur, 4px));
72
- -webkit-backdrop-filter: blur(var(--dry-overlay-blur, 4px));
73
- }
74
-
75
- [data-alert-dialog-content][data-state='open'] {
76
- opacity: 1;
77
- transform: scale(1) translateY(0);
78
- }
79
-
80
- @starting-style {
81
- [data-alert-dialog-content][open] {
82
- opacity: 0;
83
- transform: scale(var(--dry-motion-scale-enter)) translateY(var(--dry-motion-distance-sm));
84
- }
85
- }
86
- </style>
26
+ </ModalContent>
@@ -77,6 +77,8 @@
77
77
 
78
78
  [data-alpha-slider-track-wrapper] {
79
79
  position: relative;
80
+ display: grid;
81
+ grid-template-columns: 1fr;
80
82
  height: var(--dry-space-4);
81
83
  border-radius: var(--dry-radius-full);
82
84
  overflow: hidden;
@@ -101,6 +103,8 @@
101
103
 
102
104
  [data-alpha-slider-input] {
103
105
  position: relative;
106
+ grid-column: 1;
107
+ grid-row: 1;
104
108
  height: 100%;
105
109
  appearance: none;
106
110
  background: transparent;
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLAttributes } from 'svelte/elements';
4
+ import { variantAttrs } from '@dryui/primitives';
4
5
 
5
6
  interface Props extends HTMLAttributes<HTMLSpanElement> {
6
7
  src?: string;
@@ -60,8 +61,7 @@
60
61
  role="img"
61
62
  aria-label={alt}
62
63
  data-avatar
63
- data-size={size}
64
- data-shape={shape}
64
+ {...variantAttrs({ size, shape })}
65
65
  class={className}
66
66
  {...rest}
67
67
  >
@@ -85,8 +85,7 @@
85
85
  role="img"
86
86
  aria-label={alt}
87
87
  data-avatar
88
- data-size={size}
89
- data-shape={shape}
88
+ {...variantAttrs({ size, shape })}
90
89
  class={className}
91
90
  {...rest}
92
91
  >
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLAttributes } from 'svelte/elements';
4
+ import { Portal } from '@dryui/primitives';
4
5
 
5
6
  interface Props extends HTMLAttributes<HTMLDivElement> {
6
7
  open?: boolean;
@@ -12,15 +13,17 @@
12
13
  </script>
13
14
 
14
15
  {#if open}
15
- <div
16
- data-backdrop
17
- data-invisible={invisible || undefined}
18
- aria-hidden={children ? undefined : true}
19
- class={className}
20
- {...rest}
21
- >
22
- {#if children}{@render children()}{/if}
23
- </div>
16
+ <Portal>
17
+ <div
18
+ data-backdrop
19
+ data-invisible={invisible || undefined}
20
+ aria-hidden={children ? undefined : true}
21
+ class={className}
22
+ {...rest}
23
+ >
24
+ {#if children}{@render children()}{/if}
25
+ </div>
26
+ </Portal>
24
27
  {/if}
25
28
 
26
29
  <style>
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLAttributes } from 'svelte/elements';
4
+ import { variantAttrs } from '@dryui/primitives';
4
5
  import { resolveAlias } from '../internal/color-aliases.js';
5
6
  import type { BadgeColor } from './index.js';
6
7
 
@@ -33,11 +34,13 @@
33
34
  class={className}
34
35
  data-badge={isDot ? undefined : ''}
35
36
  data-dot={isDot ? '' : undefined}
36
- data-variant={isDot ? undefined : variant}
37
- data-color={resolvedColor}
38
- data-size={isDot ? undefined : size}
39
- data-icon-only={hasIcon ? '' : undefined}
40
- data-pulse={pulse ? '' : undefined}
37
+ {...variantAttrs({
38
+ variant: isDot ? undefined : variant,
39
+ color: resolvedColor,
40
+ size: isDot ? undefined : size,
41
+ 'data-icon-only': hasIcon ? '' : undefined,
42
+ 'data-pulse': pulse ? '' : undefined
43
+ })}
41
44
  {...rest}
42
45
  >
43
46
  {#if isDot}
@@ -58,27 +61,32 @@
58
61
 
59
62
  [data-badge] {
60
63
  /* Component tokens (Tier 3) */
61
- --dry-badge-default-bg: var(--dry-color-fill);
62
- --dry-badge-default-color: var(--dry-color-text-weak);
63
- --dry-badge-bg: var(--dry-badge-default-bg);
64
- --dry-badge-color: var(--dry-badge-default-color);
65
- --dry-badge-border: transparent;
66
- --dry-badge-font-size: var(--dry-type-tiny-size, var(--dry-text-xs-size));
67
- --dry-badge-padding-x: var(--dry-space-2);
68
- --dry-badge-padding-y: var(--dry-space-0_5);
69
- --dry-badge-radius: var(--dry-radius-full);
64
+ --_badge-bg-default: var(--dry-color-fill);
65
+ --_badge-color-default: var(--dry-color-text-weak);
66
+ --_badge-border-default: transparent;
67
+ --_badge-font-size-default: var(--dry-type-tiny-size, var(--dry-text-xs-size));
68
+ --_badge-padding-x-default: var(--dry-space-2);
69
+ --_badge-padding-y-default: var(--dry-space-0_5);
70
+ --_badge-radius-default: var(--dry-radius-full);
71
+ --_badge-bg: var(--dry-badge-bg, var(--_badge-bg-default));
72
+ --_badge-color: var(--dry-badge-color, var(--_badge-color-default));
73
+ --_badge-border: var(--dry-badge-border, var(--_badge-border-default));
74
+ --_badge-font-size: var(--dry-badge-font-size, var(--_badge-font-size-default));
75
+ --_badge-padding-x: var(--dry-badge-padding-x, var(--_badge-padding-x-default));
76
+ --_badge-padding-y: var(--dry-badge-padding-y, var(--_badge-padding-y-default));
77
+ --_badge-radius: var(--dry-badge-radius, var(--_badge-radius-default));
70
78
 
71
79
  display: inline-grid;
72
80
  place-items: center;
73
- padding: var(--dry-badge-padding-y) var(--dry-badge-padding-x);
74
- font-size: var(--dry-badge-font-size);
81
+ padding: var(--_badge-padding-y) var(--_badge-padding-x);
82
+ font-size: var(--_badge-font-size);
75
83
  font-family: var(--dry-font-sans);
76
84
  font-weight: 500;
77
85
  line-height: var(--dry-type-tiny-leading, var(--dry-text-xs-leading));
78
- color: var(--dry-badge-color);
79
- background: var(--dry-badge-bg);
80
- border: 1px solid var(--dry-badge-border);
81
- border-radius: var(--dry-badge-radius);
86
+ color: var(--_badge-color);
87
+ background: var(--_badge-bg);
88
+ border: 1px solid var(--_badge-border);
89
+ border-radius: var(--_badge-radius);
82
90
  white-space: nowrap;
83
91
  user-select: none;
84
92
  }
@@ -86,105 +94,109 @@
86
94
  /* ── Sizes ────────────────────────────────────────────────────────────────── */
87
95
 
88
96
  [data-size='sm'] {
89
- --dry-badge-font-size: var(--dry-type-tiny-size, var(--dry-text-xs-size));
90
- --dry-badge-padding-x: var(--dry-space-2);
91
- --dry-badge-padding-y: var(--dry-space-0_5);
97
+ --_badge-font-size-default: var(--dry-type-tiny-size, var(--dry-text-xs-size));
98
+ --_badge-padding-x-default: var(--dry-space-2);
99
+ --_badge-padding-y-default: var(--dry-space-0_5);
92
100
  }
93
101
 
94
102
  [data-size='md'] {
95
- --dry-badge-font-size: var(--dry-type-small-size, var(--dry-text-sm-size));
96
- --dry-badge-padding-x: var(--dry-space-2_5);
97
- --dry-badge-padding-y: var(--dry-space-0_5);
103
+ --_badge-font-size-default: var(--dry-type-small-size, var(--dry-text-sm-size));
104
+ --_badge-padding-x-default: var(--dry-space-2_5);
105
+ --_badge-padding-y-default: var(--dry-space-0_5);
98
106
  }
99
107
 
100
108
  /* ── Variant: solid ───────────────────────────────────────────────────────── */
101
109
 
102
110
  [data-variant='solid'] {
103
- --dry-badge-border: transparent;
111
+ --_badge-border-default: transparent;
104
112
  }
105
113
 
106
114
  [data-variant='solid'][data-color='gray'] {
107
- --dry-badge-bg: var(--dry-color-fill-inverse);
108
- --dry-badge-color: var(--dry-color-text-inverse);
115
+ --_badge-bg-default: var(--dry-color-fill-inverse);
116
+ --_badge-color-default: var(--dry-color-text-inverse);
109
117
  }
110
118
 
111
119
  [data-variant='solid'][data-color='blue'] {
112
- --dry-badge-bg: var(--dry-color-fill-brand);
113
- --dry-badge-color: var(--dry-color-on-brand);
120
+ --_badge-bg-default: var(--dry-color-fill-brand);
121
+ --_badge-color-default: var(--dry-color-on-brand);
114
122
  }
115
123
 
116
124
  [data-variant='solid'][data-color='red'] {
117
- --dry-badge-bg: var(--dry-color-fill-error);
118
- --dry-badge-color: var(--dry-color-on-error);
125
+ --_badge-bg-default: var(--dry-color-fill-error);
126
+ --_badge-color-default: var(--dry-color-on-error);
119
127
  }
120
128
 
121
129
  [data-variant='solid'][data-color='green'] {
122
- --dry-badge-bg: var(--dry-color-fill-success);
123
- --dry-badge-color: var(--dry-color-on-success);
130
+ --_badge-bg-default: var(--dry-color-fill-success);
131
+ --_badge-color-default: var(--dry-color-on-success);
124
132
  }
125
133
 
126
134
  [data-variant='solid'][data-color='yellow'] {
127
- --dry-badge-bg: var(--dry-color-fill-yellow);
128
- --dry-badge-color: var(--dry-color-on-warning);
135
+ --_badge-bg-default: var(--dry-color-fill-yellow);
136
+ --_badge-color-default: var(--dry-color-on-warning);
129
137
  }
130
138
 
131
139
  [data-variant='solid'][data-color='purple'] {
132
- --dry-badge-bg: color-mix(in srgb, var(--dry-color-fill-brand) 80%, hsl(280, 65%, 55%));
133
- --dry-badge-color: var(--dry-color-on-brand);
140
+ --_badge-bg-default: color-mix(in srgb, var(--dry-color-fill-brand) 80%, hsl(280, 65%, 55%));
141
+ --_badge-color-default: var(--dry-color-on-brand);
134
142
  }
135
143
 
136
144
  [data-variant='solid'][data-color='orange'] {
137
- --dry-badge-bg: color-mix(
145
+ --_badge-bg-default: color-mix(
138
146
  in srgb,
139
147
  var(--dry-color-fill-warning) 70%,
140
148
  var(--dry-color-fill-error)
141
149
  );
142
- --dry-badge-color: var(--dry-color-on-warning);
150
+ --_badge-color-default: var(--dry-color-on-warning);
143
151
  }
144
152
 
145
153
  /* ── Variant: outline ─────────────────────────────────────────────────────── */
146
154
 
147
155
  [data-variant='outline'] {
148
- --dry-badge-bg: transparent;
156
+ --_badge-bg-default: transparent;
149
157
  }
150
158
 
151
159
  [data-variant='outline'][data-color='gray'] {
152
- --dry-badge-color: var(--dry-color-text-weak);
153
- --dry-badge-border: var(--dry-color-stroke-weak);
160
+ --_badge-color-default: var(--dry-color-text-weak);
161
+ --_badge-border-default: var(--dry-color-stroke-weak);
154
162
  }
155
163
 
156
164
  [data-variant='outline'][data-color='blue'] {
157
- --dry-badge-color: var(--dry-color-text-brand);
158
- --dry-badge-border: var(--dry-color-stroke-brand);
165
+ --_badge-color-default: var(--dry-color-text-brand);
166
+ --_badge-border-default: var(--dry-color-stroke-brand);
159
167
  }
160
168
 
161
169
  [data-variant='outline'][data-color='red'] {
162
- --dry-badge-color: var(--dry-color-text-error);
163
- --dry-badge-border: var(--dry-color-stroke-error);
170
+ --_badge-color-default: var(--dry-color-text-error);
171
+ --_badge-border-default: var(--dry-color-stroke-error);
164
172
  }
165
173
 
166
174
  [data-variant='outline'][data-color='green'] {
167
- --dry-badge-color: var(--dry-color-text-success);
168
- --dry-badge-border: var(--dry-color-stroke-success);
175
+ --_badge-color-default: var(--dry-color-text-success);
176
+ --_badge-border-default: var(--dry-color-stroke-success);
169
177
  }
170
178
 
171
179
  [data-variant='outline'][data-color='yellow'] {
172
- --dry-badge-color: var(--dry-color-text-warning);
173
- --dry-badge-border: var(--dry-color-stroke-warning);
180
+ --_badge-color-default: var(--dry-color-text-warning);
181
+ --_badge-border-default: var(--dry-color-stroke-warning);
174
182
  }
175
183
 
176
184
  [data-variant='outline'][data-color='purple'] {
177
- --dry-badge-color: color-mix(in srgb, var(--dry-color-fill-brand) 80%, hsl(280, 65%, 55%));
178
- --dry-badge-border: color-mix(in srgb, var(--dry-color-stroke-brand) 60%, hsl(280, 50%, 70%));
185
+ --_badge-color-default: color-mix(in srgb, var(--dry-color-fill-brand) 80%, hsl(280, 65%, 55%));
186
+ --_badge-border-default: color-mix(
187
+ in srgb,
188
+ var(--dry-color-stroke-brand) 60%,
189
+ hsl(280, 50%, 70%)
190
+ );
179
191
  }
180
192
 
181
193
  [data-variant='outline'][data-color='orange'] {
182
- --dry-badge-color: color-mix(
194
+ --_badge-color-default: color-mix(
183
195
  in srgb,
184
196
  var(--dry-color-text-warning) 60%,
185
197
  var(--dry-color-text-error)
186
198
  );
187
- --dry-badge-border: color-mix(
199
+ --_badge-border-default: color-mix(
188
200
  in srgb,
189
201
  var(--dry-color-stroke-warning) 60%,
190
202
  var(--dry-color-stroke-error)
@@ -194,51 +206,51 @@
194
206
  /* ── Variant: soft ────────────────────────────────────────────────────────── */
195
207
 
196
208
  [data-variant='soft'] {
197
- --dry-badge-border: var(--dry-color-stroke-weak);
209
+ --_badge-border-default: var(--dry-color-stroke-weak);
198
210
  }
199
211
 
200
212
  [data-variant='soft'][data-color='gray'] {
201
- --dry-badge-bg: var(--dry-color-fill);
202
- --dry-badge-color: var(--dry-color-text-weak);
213
+ --_badge-bg-default: var(--dry-color-fill);
214
+ --_badge-color-default: var(--dry-color-text-weak);
203
215
  }
204
216
 
205
217
  [data-variant='soft'][data-color='blue'] {
206
- --dry-badge-bg: var(--dry-color-fill-brand-weak);
207
- --dry-badge-color: var(--dry-color-text-brand);
218
+ --_badge-bg-default: var(--dry-color-fill-brand-weak);
219
+ --_badge-color-default: var(--dry-color-text-brand);
208
220
  }
209
221
 
210
222
  [data-variant='soft'][data-color='red'] {
211
- --dry-badge-bg: var(--dry-color-fill-error-weak);
212
- --dry-badge-color: var(--dry-color-text-error);
213
- --dry-badge-border: var(--dry-color-stroke-error-weak);
223
+ --_badge-bg-default: var(--dry-color-fill-error-weak);
224
+ --_badge-color-default: var(--dry-color-text-error);
225
+ --_badge-border-default: var(--dry-color-stroke-error-weak);
214
226
  }
215
227
 
216
228
  [data-variant='soft'][data-color='green'] {
217
- --dry-badge-bg: var(--dry-color-fill-success-weak);
218
- --dry-badge-color: var(--dry-color-text-success);
229
+ --_badge-bg-default: var(--dry-color-fill-success-weak);
230
+ --_badge-color-default: var(--dry-color-text-success);
219
231
  }
220
232
 
221
233
  [data-variant='soft'][data-color='yellow'] {
222
- --dry-badge-bg: var(--dry-color-fill-warning-weak);
223
- --dry-badge-color: var(--dry-color-text-warning);
234
+ --_badge-bg-default: var(--dry-color-fill-warning-weak);
235
+ --_badge-color-default: var(--dry-color-text-warning);
224
236
  }
225
237
 
226
238
  [data-variant='soft'][data-color='purple'] {
227
- --dry-badge-bg: color-mix(
239
+ --_badge-bg-default: color-mix(
228
240
  in srgb,
229
241
  var(--dry-color-fill-brand-weak) 70%,
230
242
  hsl(280, 65%, 55%, 0.1)
231
243
  );
232
- --dry-badge-color: color-mix(in srgb, var(--dry-color-text-brand) 70%, hsl(280, 65%, 40%));
244
+ --_badge-color-default: color-mix(in srgb, var(--dry-color-text-brand) 70%, hsl(280, 65%, 40%));
233
245
  }
234
246
 
235
247
  [data-variant='soft'][data-color='orange'] {
236
- --dry-badge-bg: color-mix(
248
+ --_badge-bg-default: color-mix(
237
249
  in srgb,
238
250
  var(--dry-color-fill-warning-weak) 50%,
239
251
  var(--dry-color-fill-error-weak)
240
252
  );
241
- --dry-badge-color: color-mix(
253
+ --_badge-color-default: color-mix(
242
254
  in srgb,
243
255
  var(--dry-color-text-warning) 50%,
244
256
  var(--dry-color-text-error)
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLAnchorAttributes, HTMLButtonAttributes } from 'svelte/elements';
4
+ import { variantAttrs } from '@dryui/primitives';
4
5
  import { getButtonGroupCtx } from '../button-group/context.svelte.js';
5
6
 
6
7
  const groupCtx = getButtonGroupCtx();
@@ -84,9 +85,7 @@
84
85
  aria-disabled={disabled || undefined}
85
86
  data-disabled={disabled || undefined}
86
87
  tabindex={disabled ? -1 : undefined}
87
- data-variant={variant}
88
- data-size={size}
89
- data-color={color}
88
+ {...variantAttrs({ variant, size, color })}
90
89
  class={className}
91
90
  onclick={handleLinkClick}
92
91
  {@attach attachRef}
@@ -98,9 +97,7 @@
98
97
  {type}
99
98
  {disabled}
100
99
  data-disabled={disabled || undefined}
101
- data-variant={variant}
102
- data-size={size}
103
- data-color={color}
100
+ {...variantAttrs({ variant, size, color })}
104
101
  class={className}
105
102
  {onclick}
106
103
  {...rest}
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLAttributes } from 'svelte/elements';
4
+ import { variantAttrs } from '@dryui/primitives';
4
5
  import { setButtonGroupCtx } from './context.svelte.js';
5
6
 
6
7
  interface Props extends HTMLAttributes<HTMLDivElement> {
@@ -27,8 +28,7 @@
27
28
  <div
28
29
  role="group"
29
30
  data-button-group
30
- data-orientation={orientation}
31
- data-size={size}
31
+ {...variantAttrs({ orientation, size })}
32
32
  class={className}
33
33
  {...rest}
34
34
  >
@@ -48,4 +48,4 @@
48
48
  };
49
49
  </script>
50
50
 
51
- <CalendarGridButton {adapter} {...props} />
51
+ <CalendarGridButton {adapter} hideHeader {...props} />
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLAttributes, HTMLButtonAttributes } from 'svelte/elements';
4
+ import { variantAttrs } from '@dryui/primitives';
4
5
 
5
6
  interface Props extends HTMLAttributes<HTMLElement> {
6
7
  as?: 'div' | 'button';
@@ -31,8 +32,10 @@
31
32
  data-card
32
33
  data-selected={selected ? '' : undefined}
33
34
  data-orientation={orientation}
34
- data-variant={variant !== 'default' ? variant : undefined}
35
- data-size={size !== 'default' ? size : undefined}
35
+ {...variantAttrs({
36
+ variant: variant !== 'default' ? variant : undefined,
37
+ size: size !== 'default' ? size : undefined
38
+ })}
36
39
  data-disabled={disabled ? '' : undefined}
37
40
  {disabled}
38
41
  aria-disabled={disabled || undefined}
@@ -47,8 +50,10 @@
47
50
  data-card
48
51
  data-selected={selected ? '' : undefined}
49
52
  data-orientation={orientation}
50
- data-variant={variant !== 'default' ? variant : undefined}
51
- data-size={size !== 'default' ? size : undefined}
53
+ {...variantAttrs({
54
+ variant: variant !== 'default' ? variant : undefined,
55
+ size: size !== 'default' ? size : undefined
56
+ })}
52
57
  data-disabled={disabled ? '' : undefined}
53
58
  aria-disabled={disabled || undefined}
54
59
  {...rest}
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLAttributes } from 'svelte/elements';
4
+ import { variantAttrs } from '@dryui/primitives';
4
5
  import { setChipGroupCtx } from './context.svelte.js';
5
6
 
6
7
  interface Props extends HTMLAttributes<HTMLDivElement> {
@@ -51,8 +52,7 @@
51
52
  <div
52
53
  role="group"
53
54
  data-chip-group
54
- data-orientation={orientation}
55
- data-size={size}
55
+ {...variantAttrs({ orientation, size })}
56
56
  class={className}
57
57
  {...rest}
58
58
  >
@@ -20,7 +20,7 @@
20
20
  }
21
21
 
22
22
  let {
23
- code,
23
+ code = '',
24
24
  language,
25
25
  showLineNumbers = false,
26
26
  showCopyButton = true,
@@ -122,7 +122,7 @@
122
122
  <span class="copy-btn-slot">
123
123
  <Button
124
124
  variant="trigger"
125
- size="icon-sm"
125
+ size="sm"
126
126
  type="button"
127
127
  data-code-block-copy
128
128
  onclick={handleCopy}
@@ -141,6 +141,7 @@
141
141
  >
142
142
  <polyline points="20 6 9 17 4 12"></polyline>
143
143
  </svg>
144
+ <span>Copied</span>
144
145
  {:else}
145
146
  <svg
146
147
  width="16"
@@ -155,6 +156,7 @@
155
156
  <rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
156
157
  <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
157
158
  </svg>
159
+ <span>Copy</span>
158
160
  {/if}
159
161
  </Button>
160
162
  </span>
@@ -207,6 +209,8 @@
207
209
  z-index: 1;
208
210
  display: inline-grid;
209
211
  color: var(--dry-code-copy-color);
212
+ background: var(--dry-code-bg);
213
+ border-radius: var(--dry-radius-md);
210
214
  --dry-btn-color: var(--dry-code-copy-color);
211
215
  }
212
216