@dryui/ui 0.5.2 → 1.0.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 (99) hide show
  1. package/dist/alert/{alert-root.svelte → alert.svelte} +78 -20
  2. package/dist/alert/alert.svelte.d.ts +15 -0
  3. package/dist/alert/index.d.ts +15 -14
  4. package/dist/alert/index.js +3 -12
  5. package/dist/breadcrumb/breadcrumb-link.svelte +1 -1
  6. package/dist/button/button.svelte +1 -1
  7. package/dist/card/card-root.svelte +2 -2
  8. package/dist/chromatic-shift/chromatic-shift.svelte +2 -2
  9. package/dist/code-block/code-block-button.svelte +1 -1
  10. package/dist/color-picker/color-picker-area.svelte +2 -2
  11. package/dist/color-picker/color-picker-channel-input.svelte +2 -2
  12. package/dist/color-picker/color-picker-input-alpha-slider.svelte +2 -2
  13. package/dist/color-picker/color-picker-input-hue-slider.svelte +2 -2
  14. package/dist/color-picker/color-picker-input.svelte +9 -9
  15. package/dist/color-picker/color-picker-swatch.svelte +2 -2
  16. package/dist/combobox/combobox-input.svelte +9 -9
  17. package/dist/command-palette/command-palette-item.svelte +1 -1
  18. package/dist/data-grid/data-grid-button-input-column.svelte +1 -1
  19. package/dist/diagram/diagram.svelte +222 -32
  20. package/dist/diagram/diagram.svelte.d.ts +1 -0
  21. package/dist/diagram/edge-routing.d.ts +63 -1
  22. package/dist/diagram/edge-routing.js +316 -26
  23. package/dist/diagram/layout.js +633 -62
  24. package/dist/diagram/types.d.ts +58 -0
  25. package/dist/drag-and-drop/drag-and-drop-handle.svelte +1 -1
  26. package/dist/drag-and-drop/drag-and-drop-item.svelte +1 -1
  27. package/dist/file-select/file-select-root.svelte +2 -2
  28. package/dist/file-upload/file-upload-dropzone.svelte +2 -2
  29. package/dist/gauge/gauge.svelte +1 -1
  30. package/dist/image-comparison/image-comparison.svelte +1 -1
  31. package/dist/index.d.ts +3 -3
  32. package/dist/index.js +1 -1
  33. package/dist/input/input.svelte +10 -11
  34. package/dist/label/label.svelte +1 -1
  35. package/dist/link/link.svelte +1 -1
  36. package/dist/list/list-item.svelte +2 -2
  37. package/dist/multi-select-combobox/multi-select-combobox-selection-item.svelte +9 -3
  38. package/dist/multi-select-combobox/multi-select-combobox-selection-remove-button.svelte +2 -0
  39. package/dist/navigation-menu/navigation-menu-link.svelte +1 -1
  40. package/dist/notification-center/notification-center-item.svelte +1 -1
  41. package/dist/number-input/number-input-button.svelte +3 -3
  42. package/dist/option-picker/context.svelte.d.ts +9 -0
  43. package/dist/option-picker/context.svelte.js +2 -0
  44. package/dist/option-picker/option-picker-item.svelte +31 -4
  45. package/dist/option-picker/option-picker-preview.svelte +2 -2
  46. package/dist/option-picker/option-picker-root.svelte +2 -2
  47. package/dist/phone-input/phone-input-select.svelte +2 -2
  48. package/dist/pin-input/pin-input-cell.svelte +1 -1
  49. package/dist/pin-input/pin-input-root.svelte +1 -1
  50. package/dist/progress/progress.svelte +1 -1
  51. package/dist/scroll-area/scroll-area.svelte +1 -1
  52. package/dist/shimmer/index.d.ts +8 -0
  53. package/dist/shimmer/index.js +1 -0
  54. package/dist/shimmer/shimmer.svelte +87 -0
  55. package/dist/shimmer/shimmer.svelte.d.ts +10 -0
  56. package/dist/sidebar/sidebar-item.svelte +1 -1
  57. package/dist/slider/slider-input.svelte +2 -2
  58. package/dist/splitter/splitter-handle.svelte +1 -1
  59. package/dist/table-of-contents/table-of-contents-item.svelte +1 -1
  60. package/dist/table-of-contents/table-of-contents-list.svelte +1 -1
  61. package/dist/tags-input/tags-input-root.svelte +1 -1
  62. package/dist/tags-input/tags-input-tag-delete-button.svelte +2 -0
  63. package/dist/tags-input/tags-input-tag.svelte +9 -3
  64. package/dist/textarea/textarea.svelte +11 -11
  65. package/dist/themes/default.css +31 -0
  66. package/dist/toast/toast-root.svelte +1 -1
  67. package/dist/tour/tour-root.css +3 -3
  68. package/dist/tree/tree-item-children.svelte +1 -1
  69. package/dist/tree/tree-item-label.svelte +1 -1
  70. package/dist/video-embed/video-embed-button.svelte +1 -1
  71. package/package.json +11 -750
  72. package/skills/dryui/SKILL.md +26 -21
  73. package/skills/dryui/rules/compound-components.md +3 -3
  74. package/skills/dryui/rules/theming.md +1 -1
  75. package/dist/alert/alert-button-close.svelte +0 -29
  76. package/dist/alert/alert-button-close.svelte.d.ts +0 -8
  77. package/dist/alert/alert-description.svelte +0 -28
  78. package/dist/alert/alert-description.svelte.d.ts +0 -8
  79. package/dist/alert/alert-icon.svelte +0 -26
  80. package/dist/alert/alert-icon.svelte.d.ts +0 -8
  81. package/dist/alert/alert-root.svelte.d.ts +0 -12
  82. package/dist/alert/alert-title.svelte +0 -29
  83. package/dist/alert/alert-title.svelte.d.ts +0 -8
  84. package/dist/alert/context.svelte.d.ts +0 -9
  85. package/dist/alert/context.svelte.js +0 -10
  86. package/dist/option-swatch-group/context.svelte.d.ts +0 -9
  87. package/dist/option-swatch-group/context.svelte.js +0 -2
  88. package/dist/option-swatch-group/index.d.ts +0 -29
  89. package/dist/option-swatch-group/index.js +0 -12
  90. package/dist/option-swatch-group/option-swatch-group-item-button.svelte +0 -214
  91. package/dist/option-swatch-group/option-swatch-group-item-button.svelte.d.ts +0 -12
  92. package/dist/option-swatch-group/option-swatch-group-label.svelte +0 -24
  93. package/dist/option-swatch-group/option-swatch-group-label.svelte.d.ts +0 -8
  94. package/dist/option-swatch-group/option-swatch-group-meta.svelte +0 -24
  95. package/dist/option-swatch-group/option-swatch-group-meta.svelte.d.ts +0 -8
  96. package/dist/option-swatch-group/option-swatch-group-root.svelte +0 -81
  97. package/dist/option-swatch-group/option-swatch-group-root.svelte.d.ts +0 -12
  98. package/dist/option-swatch-group/option-swatch-group-swatch.svelte +0 -52
  99. package/dist/option-swatch-group/option-swatch-group-swatch.svelte.d.ts +0 -10
@@ -0,0 +1,87 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import type { HTMLAttributes } from 'svelte/elements';
4
+
5
+ interface Props extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {
6
+ color?: string;
7
+ duration?: number;
8
+ children: Snippet;
9
+ }
10
+
11
+ let {
12
+ color = 'var(--dry-color-fill-brand)',
13
+ duration = 3,
14
+ class: className,
15
+ children,
16
+ ...rest
17
+ }: Props = $props();
18
+
19
+ function applyStyles(node: HTMLSpanElement) {
20
+ $effect(() => {
21
+ node.style.setProperty('--dry-shimmer-color', color);
22
+ node.style.setProperty('--dry-shimmer-duration', `${duration}s`);
23
+ });
24
+ }
25
+ </script>
26
+
27
+ <span data-shimmer class={className} {...rest} {@attach applyStyles}>
28
+ <span data-shimmer-base>
29
+ {@render children()}
30
+ </span>
31
+ <span data-shimmer-streak aria-hidden="true">
32
+ {@render children()}
33
+ </span>
34
+ </span>
35
+
36
+ <style>
37
+ [data-shimmer] {
38
+ display: grid;
39
+ grid-template-columns: var(--dry-shimmer-outer-columns, max-content);
40
+ grid-column: var(--dry-shimmer-column, auto);
41
+ justify-self: var(--dry-shimmer-justify-self, auto);
42
+ isolation: isolate;
43
+ }
44
+
45
+ [data-shimmer-base],
46
+ [data-shimmer-streak] {
47
+ grid-area: 1 / 1;
48
+ display: grid;
49
+ grid-template-columns: var(--dry-shimmer-content-columns, none);
50
+ grid-auto-flow: column;
51
+ grid-auto-columns: max-content;
52
+ align-items: center;
53
+ gap: var(--dry-shimmer-gap, var(--dry-space-2));
54
+ }
55
+
56
+ [data-shimmer-streak] {
57
+ color: var(--dry-shimmer-color, var(--dry-color-fill-brand));
58
+ pointer-events: none;
59
+ -webkit-mask-image: linear-gradient(100deg, transparent 40%, #000 50%, transparent 60%);
60
+ mask-image: linear-gradient(100deg, transparent 40%, #000 50%, transparent 60%);
61
+ -webkit-mask-size: 200% 100%;
62
+ mask-size: 200% 100%;
63
+ -webkit-mask-repeat: no-repeat;
64
+ mask-repeat: no-repeat;
65
+ will-change: mask-position;
66
+ animation: shimmer-sweep var(--dry-shimmer-duration, 3s) linear infinite;
67
+ }
68
+
69
+ @keyframes shimmer-sweep {
70
+ from {
71
+ -webkit-mask-position: 150% 0;
72
+ mask-position: 150% 0;
73
+ }
74
+ to {
75
+ -webkit-mask-position: -50% 0;
76
+ mask-position: -50% 0;
77
+ }
78
+ }
79
+
80
+ @media (prefers-reduced-motion: reduce) {
81
+ [data-shimmer-streak] {
82
+ animation: none;
83
+ -webkit-mask-position: 50% 0;
84
+ mask-position: 50% 0;
85
+ }
86
+ }
87
+ </style>
@@ -0,0 +1,10 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ interface Props extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {
4
+ color?: string;
5
+ duration?: number;
6
+ children: Snippet;
7
+ }
8
+ declare const Shimmer: import("svelte").Component<Props, {}, "">;
9
+ type Shimmer = ReturnType<typeof Shimmer>;
10
+ export default Shimmer;
@@ -51,7 +51,7 @@
51
51
  }
52
52
 
53
53
  [data-sidebar-item]:focus-visible {
54
- outline: 2px solid var(--dry-color-focus-ring);
54
+ outline: var(--dry-focus-ring);
55
55
  outline-offset: 2px;
56
56
  }
57
57
  </style>
@@ -152,12 +152,12 @@
152
152
  }
153
153
 
154
154
  &:focus-visible {
155
- outline: 2px solid var(--dry-color-focus-ring);
155
+ outline: var(--dry-focus-ring);
156
156
  outline-offset: 4px;
157
157
  }
158
158
 
159
159
  &[data-disabled] {
160
- opacity: 0.5;
160
+ opacity: var(--dry-state-disabled-opacity);
161
161
  cursor: not-allowed;
162
162
  }
163
163
 
@@ -139,7 +139,7 @@
139
139
  }
140
140
 
141
141
  [data-part='handle']:focus-visible {
142
- outline: 2px solid var(--dry-color-focus-ring);
142
+ outline: var(--dry-focus-ring);
143
143
  outline-offset: -2px;
144
144
  }
145
145
 
@@ -80,7 +80,7 @@
80
80
  }
81
81
 
82
82
  [data-part='item']:focus-within > a {
83
- outline: 2px solid var(--dry-color-focus-ring);
83
+ outline: var(--dry-focus-ring);
84
84
  outline-offset: 2px;
85
85
  }
86
86
  </style>
@@ -81,7 +81,7 @@
81
81
  }
82
82
 
83
83
  [data-part='item']:focus-within > a {
84
- outline: 2px solid var(--dry-color-focus-ring);
84
+ outline: var(--dry-focus-ring);
85
85
  outline-offset: 2px;
86
86
  }
87
87
  </style>
@@ -101,7 +101,7 @@
101
101
  }
102
102
 
103
103
  &:focus-within {
104
- outline: 2px solid var(--dry-color-focus-ring);
104
+ outline: var(--dry-focus-ring);
105
105
  outline-offset: -1px;
106
106
  border-color: var(--dry-color-stroke-focus);
107
107
  box-shadow: 0 0 0 1px var(--dry-color-stroke-focus);
@@ -22,6 +22,8 @@
22
22
  </script>
23
23
 
24
24
  <CloseButtonBase
25
+ variant="bare"
26
+ size="sm"
25
27
  aria-label="Remove tag: {value}"
26
28
  disabled={ctx.disabled}
27
29
  {...rest}
@@ -35,13 +35,15 @@
35
35
  grid-auto-columns: max-content;
36
36
  vertical-align: middle;
37
37
  align-items: center;
38
- gap: var(--dry-space-1);
39
- padding: var(--dry-space-1) var(--dry-tags-input-tag-padding-x, var(--dry-space-2));
38
+ padding-block: var(--dry-space-1);
39
+ padding-inline-start: var(--dry-tags-input-tag-padding-x, var(--dry-space-2));
40
+ padding-inline-end: 0;
40
41
  margin-inline-end: var(--dry-tags-input-gap, var(--dry-space-1_5));
41
42
  margin-block: calc(var(--dry-tags-input-gap, var(--dry-space-1_5)) / 2);
42
43
  background: color-mix(in srgb, var(--dry-color-fill-brand) 15%, transparent);
43
44
  color: var(--dry-color-fill-brand);
44
- border-radius: var(--dry-radius-full);
45
+ border-radius: var(--dry-tags-input-tag-radius, var(--dry-radius-md));
46
+ overflow: hidden;
45
47
  font-size: var(
46
48
  --dry-tags-input-tag-font-size,
47
49
  var(--dry-type-tiny-size, var(--dry-text-xs-size))
@@ -51,5 +53,9 @@
51
53
  line-height: 1.5;
52
54
  white-space: nowrap;
53
55
  user-select: none;
56
+ --dry-btn-radius: 0;
57
+ --dry-btn-padding-x: var(--dry-tags-input-tag-padding-x, var(--dry-space-2));
58
+ --dry-btn-padding-y: 0;
59
+ --dry-btn-font-size: inherit;
54
60
  }
55
61
  </style>
@@ -43,19 +43,19 @@
43
43
  }
44
44
 
45
45
  textarea {
46
- --dry-input-bg: var(--dry-control-bg, var(--dry-color-bg-raised));
47
- --dry-input-border: var(--dry-control-border, var(--dry-color-stroke-strong));
48
- --dry-input-padding-x: var(--dry-space-3);
49
- --dry-input-padding-y: var(--dry-space-2);
50
- --dry-input-font-size: var(--dry-type-small-size);
46
+ --dry-input-bg: var(--dry-form-control-bg);
47
+ --dry-input-border: var(--dry-form-control-border);
48
+ --dry-input-padding-x: var(--dry-form-control-padding-inline);
49
+ --dry-input-padding-y: var(--dry-form-control-padding-block);
50
+ --dry-input-font-size: var(--dry-form-control-font-size);
51
51
  padding: var(--dry-input-padding-y) var(--dry-input-padding-x);
52
52
  font-size: var(--dry-input-font-size);
53
53
  line-height: var(--dry-type-small-leading);
54
54
  font-family: var(--dry-font-sans);
55
- color: var(--dry-input-color, var(--dry-color-text-strong));
55
+ color: var(--dry-input-color, var(--dry-form-control-color));
56
56
  background: var(--dry-input-bg);
57
57
  border: 1px solid var(--dry-input-border);
58
- border-radius: var(--dry-input-radius, var(--dry-control-radius, var(--dry-radius-md)));
58
+ border-radius: var(--dry-input-radius, var(--dry-form-control-radius));
59
59
  transition:
60
60
  border-color var(--dry-duration-fast) var(--dry-ease-default),
61
61
  box-shadow var(--dry-duration-fast) var(--dry-ease-default);
@@ -65,22 +65,22 @@
65
65
  min-height: 160px;
66
66
 
67
67
  &::placeholder {
68
- color: var(--dry-color-text-weak);
68
+ color: var(--dry-form-control-color-placeholder);
69
69
  }
70
70
 
71
71
  &:hover:not([data-disabled]) {
72
- border-color: var(--dry-color-stroke-strong);
72
+ border-color: var(--dry-form-control-border-hover);
73
73
  }
74
74
 
75
75
  &:focus-visible {
76
- outline: 2px solid var(--dry-color-focus-ring);
76
+ outline: var(--dry-focus-ring);
77
77
  outline-offset: -1px;
78
78
  border-color: var(--dry-color-focus-ring);
79
79
  box-shadow: 0 0 0 1px var(--dry-color-focus-ring);
80
80
  }
81
81
 
82
82
  &[data-disabled] {
83
- opacity: 0.5;
83
+ opacity: var(--dry-state-disabled-opacity);
84
84
  cursor: not-allowed;
85
85
  }
86
86
 
@@ -305,6 +305,37 @@ samp {
305
305
  --dry-text-4xl-size: var(--dry-type-ui-display-size);
306
306
  --dry-text-4xl-leading: var(--dry-type-ui-display-leading);
307
307
 
308
+ /* ─── State ───────────────────────────────────────────────────────
309
+ Shared shorthands for focus / disabled state. Consumers can
310
+ override these at :root to restyle every focusable or disabled
311
+ control in one place.
312
+ - Focus ring: `outline: var(--dry-focus-ring); outline-offset: 2px;`
313
+ - Disabled state: `opacity: var(--dry-state-disabled-opacity); cursor: not-allowed;`
314
+ */
315
+ --dry-focus-ring: 2px solid var(--dry-color-focus-ring);
316
+ --dry-state-disabled-opacity: 0.5;
317
+
318
+ /* ─── Form control shared tokens ──────────────────────────────────
319
+ Consumed by input, textarea, combobox-input, and color-picker-input.
320
+ Per-component `--dry-<name>-*` overrides still work — they now
321
+ resolve through this shared family by default, so consumers can
322
+ restyle all form controls with one change at :root.
323
+ Intentionally excluded (pre-existing divergence):
324
+ - border-focus: some controls use --dry-color-stroke-focus,
325
+ others use --dry-color-focus-ring; left per-component.
326
+ - bg-disabled: input uses --dry-color-bg-sunken, others rely on
327
+ opacity; left per-component.
328
+ */
329
+ --dry-form-control-bg: var(--dry-color-bg-raised);
330
+ --dry-form-control-border: var(--dry-color-stroke-strong);
331
+ --dry-form-control-border-hover: var(--dry-color-stroke-strong);
332
+ --dry-form-control-color: var(--dry-color-text-strong);
333
+ --dry-form-control-color-placeholder: var(--dry-color-text-weak);
334
+ --dry-form-control-radius: var(--dry-radius-md);
335
+ --dry-form-control-font-size: var(--dry-type-small-size);
336
+ --dry-form-control-padding-block: var(--dry-space-2);
337
+ --dry-form-control-padding-inline: var(--dry-space-3);
338
+
308
339
  /* ─── Motion ──────────────────────────────────────────────────── */
309
340
  --dry-duration-instant: 0ms;
310
341
  --dry-duration-fast: 120ms;
@@ -149,7 +149,7 @@
149
149
  background: var(--dry-color-stroke-weak, #e2e8f0);
150
150
  border-radius: 0 0 var(--dry-radius-lg) var(--dry-radius-lg);
151
151
  overflow: hidden;
152
- transition: grid-template-columns 0.3s ease;
152
+ transition: grid-template-columns var(--dry-duration-normal) var(--dry-ease-default);
153
153
  }
154
154
 
155
155
  [data-part='progress']::after {
@@ -115,7 +115,7 @@
115
115
  }
116
116
 
117
117
  [data-tour-root] [data-part='skipButton']:focus-visible {
118
- outline: 2px solid var(--dry-color-focus-ring);
118
+ outline: var(--dry-focus-ring);
119
119
  outline-offset: 2px;
120
120
  }
121
121
 
@@ -136,7 +136,7 @@
136
136
  }
137
137
 
138
138
  [data-tour-root] [data-part='prevButton']:focus-visible {
139
- outline: 2px solid var(--dry-color-focus-ring);
139
+ outline: var(--dry-focus-ring);
140
140
  outline-offset: 2px;
141
141
  }
142
142
 
@@ -157,7 +157,7 @@
157
157
  }
158
158
 
159
159
  [data-tour-root] [data-part='nextButton']:focus-visible {
160
- outline: 2px solid var(--dry-color-focus-ring);
160
+ outline: var(--dry-focus-ring);
161
161
  outline-offset: 2px;
162
162
  }
163
163
 
@@ -44,6 +44,6 @@
44
44
  display: grid;
45
45
  grid-template-rows: var(--_rows, 0fr);
46
46
  padding-left: var(--dry-tree-indent, var(--dry-space-4));
47
- transition: grid-template-rows var(--dry-duration-normal, 200ms) var(--dry-ease-default, ease);
47
+ transition: grid-template-rows var(--dry-duration-normal) var(--dry-ease-default);
48
48
  }
49
49
  </style>
@@ -61,7 +61,7 @@
61
61
  }
62
62
 
63
63
  [data-part='label']:focus-visible {
64
- outline: 2px solid var(--dry-color-focus-ring);
64
+ outline: var(--dry-focus-ring);
65
65
  outline-offset: 2px;
66
66
  }
67
67
 
@@ -160,7 +160,7 @@
160
160
  height: var(--dry-video-embed-play-size);
161
161
  aspect-ratio: 1;
162
162
  filter: drop-shadow(0 2px 8px rgb(15 23 42 / 0.3));
163
- transition: transform var(--dry-duration-normal, 200ms) ease;
163
+ transition: transform var(--dry-duration-normal) var(--dry-ease-default);
164
164
  }
165
165
 
166
166
  .play-btn-slot:hover [data-part='play-icon'] {