@sveltia/ui 0.7.4 → 0.8.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 (118) hide show
  1. package/package/components/alert/alert.svelte +4 -4
  2. package/package/components/alert/alert.svelte.d.ts +2 -2
  3. package/package/components/button/button.svelte +13 -3
  4. package/package/components/button/button.svelte.d.ts +11 -4
  5. package/package/components/button/select-button-group.svelte +12 -8
  6. package/package/components/button/select-button.svelte +5 -4
  7. package/package/components/button/select-button.svelte.d.ts +2 -0
  8. package/package/components/calendar/calendar.svelte +20 -14
  9. package/package/components/checkbox/checkbox-group.svelte +6 -5
  10. package/package/components/checkbox/checkbox.svelte +16 -9
  11. package/package/components/checkbox/checkbox.svelte.d.ts +2 -2
  12. package/package/components/dialog/alert-dialog.svelte +50 -0
  13. package/package/components/dialog/alert-dialog.svelte.d.ts +55 -0
  14. package/package/components/dialog/confirmation-dialog.svelte +55 -0
  15. package/package/components/dialog/confirmation-dialog.svelte.d.ts +57 -0
  16. package/package/components/dialog/dialog.svelte +164 -220
  17. package/package/components/dialog/dialog.svelte.d.ts +20 -12
  18. package/package/components/dialog/prompt-dialog.svelte +78 -0
  19. package/package/components/dialog/prompt-dialog.svelte.d.ts +72 -0
  20. package/package/components/disclosure/disclosure.svelte +3 -3
  21. package/package/components/divider/divider.svelte +1 -1
  22. package/package/components/divider/spacer.svelte +1 -12
  23. package/package/components/divider/spacer.svelte.d.ts +0 -2
  24. package/package/components/drawer/drawer.svelte +118 -208
  25. package/package/components/drawer/drawer.svelte.d.ts +12 -8
  26. package/package/components/grid/grid-body.svelte +51 -0
  27. package/package/components/grid/grid-body.svelte.d.ts +36 -0
  28. package/package/components/grid/grid-cell.svelte +22 -0
  29. package/package/components/grid/grid-cell.svelte.d.ts +34 -0
  30. package/package/components/grid/grid-col-header.svelte +22 -0
  31. package/package/components/grid/grid-col-header.svelte.d.ts +34 -0
  32. package/package/components/grid/grid-foot.svelte +27 -0
  33. package/package/components/grid/grid-foot.svelte.d.ts +34 -0
  34. package/package/components/grid/grid-head.svelte +27 -0
  35. package/package/components/grid/grid-head.svelte.d.ts +34 -0
  36. package/package/components/grid/grid-row-header.svelte +23 -0
  37. package/package/components/grid/grid-row-header.svelte.d.ts +34 -0
  38. package/package/components/grid/grid-row.svelte +37 -0
  39. package/package/components/grid/grid-row.svelte.d.ts +44 -0
  40. package/package/components/grid/grid.svelte +52 -0
  41. package/package/components/grid/grid.svelte.d.ts +42 -0
  42. package/package/components/icon/icon.svelte +6 -7
  43. package/package/components/icon/icon.svelte.d.ts +0 -2
  44. package/package/components/listbox/listbox.svelte +6 -6
  45. package/package/components/listbox/option-group.svelte +6 -5
  46. package/package/components/listbox/option.svelte +7 -28
  47. package/package/components/listbox/option.svelte.d.ts +2 -0
  48. package/package/components/menu/menu-button.svelte +26 -16
  49. package/package/components/menu/menu-button.svelte.d.ts +2 -2
  50. package/package/components/menu/menu-item-checkbox.svelte +5 -4
  51. package/package/components/menu/menu-item-checkbox.svelte.d.ts +2 -0
  52. package/package/components/menu/menu-item-group.svelte +4 -3
  53. package/package/components/menu/menu-item-radio.svelte +5 -4
  54. package/package/components/menu/menu-item-radio.svelte.d.ts +2 -0
  55. package/package/components/menu/menu-item.svelte +7 -5
  56. package/package/components/menu/menu-item.svelte.d.ts +4 -2
  57. package/package/components/menu/menu.svelte +1 -1
  58. package/package/components/radio/radio-group.svelte +8 -8
  59. package/package/components/radio/radio-group.svelte.d.ts +2 -2
  60. package/package/components/radio/radio.svelte +5 -2
  61. package/package/components/radio/radio.svelte.d.ts +2 -0
  62. package/package/components/select/combobox.svelte +55 -35
  63. package/package/components/select/combobox.svelte.d.ts +3 -2
  64. package/package/components/select/select.svelte +10 -9
  65. package/package/components/select/select.svelte.d.ts +4 -3
  66. package/package/components/slider/slider.svelte +15 -7
  67. package/package/components/switch/switch.svelte +9 -6
  68. package/package/components/switch/switch.svelte.d.ts +2 -2
  69. package/package/components/table/table-body.svelte +31 -3
  70. package/package/components/table/table-body.svelte.d.ts +2 -0
  71. package/package/components/table/table-cell.svelte +3 -4
  72. package/package/components/table/table-cell.svelte.d.ts +1 -1
  73. package/package/components/table/table-col-header.svelte +1 -2
  74. package/package/components/table/table-foot.svelte +7 -3
  75. package/package/components/table/table-head.svelte +7 -3
  76. package/package/components/table/table-row-header.svelte +1 -2
  77. package/package/components/table/table-row.svelte +1 -14
  78. package/package/components/table/table-row.svelte.d.ts +0 -8
  79. package/package/components/table/table.svelte +5 -17
  80. package/package/components/table/table.svelte.d.ts +1 -7
  81. package/package/components/tabs/tab-list.svelte +7 -5
  82. package/package/components/tabs/tab-panel.svelte +1 -1
  83. package/package/components/tabs/tab.svelte +2 -1
  84. package/package/components/tabs/tab.svelte.d.ts +2 -0
  85. package/package/components/text-field/markdown-editor.svelte +36 -9
  86. package/package/components/text-field/markdown-editor.svelte.d.ts +2 -0
  87. package/package/components/text-field/number-input.svelte +107 -43
  88. package/package/components/text-field/number-input.svelte.d.ts +2 -0
  89. package/package/components/text-field/password-input.svelte +43 -12
  90. package/package/components/text-field/password-input.svelte.d.ts +2 -0
  91. package/package/components/text-field/search-bar.svelte +43 -13
  92. package/package/components/text-field/search-bar.svelte.d.ts +5 -0
  93. package/package/components/text-field/text-area.svelte +26 -6
  94. package/package/components/text-field/text-area.svelte.d.ts +2 -0
  95. package/package/components/text-field/text-input.svelte +37 -7
  96. package/package/components/text-field/text-input.svelte.d.ts +14 -4
  97. package/package/components/toast/toast.svelte +6 -16
  98. package/package/components/toast/toast.svelte.d.ts +2 -2
  99. package/package/components/toolbar/toolbar.svelte +3 -4
  100. package/package/components/util/app-shell.svelte +34 -29
  101. package/package/components/util/group.svelte +2 -2
  102. package/package/components/util/modal.svelte +220 -0
  103. package/package/components/util/modal.svelte.d.ts +83 -0
  104. package/package/components/util/popup.svelte +80 -121
  105. package/package/components/util/popup.svelte.d.ts +22 -13
  106. package/package/components/util/portal.svelte +1 -1
  107. package/package/index.d.ts +12 -0
  108. package/package/index.js +12 -0
  109. package/package/locales/en.d.ts +1 -0
  110. package/package/locales/en.js +1 -0
  111. package/package/locales/ja.d.ts +1 -0
  112. package/package/locales/ja.js +1 -0
  113. package/package/services/group.js +67 -13
  114. package/package/services/popup.d.ts +5 -1
  115. package/package/services/popup.js +22 -19
  116. package/package/styles/core.scss +13 -26
  117. package/package/styles/variables.scss +14 -2
  118. package/package.json +107 -11
package/package/index.js CHANGED
@@ -34,11 +34,22 @@ export { default as SelectButton } from './components/button/select-button.svelt
34
34
  export { default as Calendar } from './components/calendar/calendar.svelte';
35
35
  export { default as CheckboxGroup } from './components/checkbox/checkbox-group.svelte';
36
36
  export { default as Checkbox } from './components/checkbox/checkbox.svelte';
37
+ export { default as AlertDialog } from './components/dialog/alert-dialog.svelte';
38
+ export { default as ConfirmationDialog } from './components/dialog/confirmation-dialog.svelte';
37
39
  export { default as Dialog } from './components/dialog/dialog.svelte';
40
+ export { default as PromptDialog } from './components/dialog/prompt-dialog.svelte';
38
41
  export { default as Disclosure } from './components/disclosure/disclosure.svelte';
39
42
  export { default as Divider } from './components/divider/divider.svelte';
40
43
  export { default as Spacer } from './components/divider/spacer.svelte';
41
44
  export { default as Drawer } from './components/drawer/drawer.svelte';
45
+ export { default as GridBody } from './components/grid/grid-body.svelte';
46
+ export { default as GridCell } from './components/grid/grid-cell.svelte';
47
+ export { default as GridColHeader } from './components/grid/grid-col-header.svelte';
48
+ export { default as GridFoot } from './components/grid/grid-foot.svelte';
49
+ export { default as GridHead } from './components/grid/grid-head.svelte';
50
+ export { default as GridRowHeader } from './components/grid/grid-row-header.svelte';
51
+ export { default as GridRow } from './components/grid/grid-row.svelte';
52
+ export { default as Grid } from './components/grid/grid.svelte';
42
53
  export { default as Icon } from './components/icon/icon.svelte';
43
54
  export { default as Listbox } from './components/listbox/listbox.svelte';
44
55
  export { default as OptionGroup } from './components/listbox/option-group.svelte';
@@ -76,5 +87,6 @@ export { default as Toast } from './components/toast/toast.svelte';
76
87
  export { default as Toolbar } from './components/toolbar/toolbar.svelte';
77
88
  export { default as AppShell } from './components/util/app-shell.svelte';
78
89
  export { default as Group } from './components/util/group.svelte';
90
+ export { default as Modal } from './components/util/modal.svelte';
79
91
 
80
92
  export * from './services/util';
@@ -24,6 +24,7 @@ export namespace strings {
24
24
  }
25
25
  namespace password_input {
26
26
  const show_password: string;
27
+ const hide_password: string;
27
28
  }
28
29
  namespace markdown_editor {
29
30
  const markdown_editor_1: string;
@@ -24,6 +24,7 @@ export const strings = {
24
24
  },
25
25
  password_input: {
26
26
  show_password: 'Show Password',
27
+ hide_password: 'Hide Password',
27
28
  },
28
29
  markdown_editor: {
29
30
  markdown_editor: 'Markdown Editor',
@@ -24,6 +24,7 @@ export namespace strings {
24
24
  }
25
25
  namespace password_input {
26
26
  const show_password: string;
27
+ const hide_password: string;
27
28
  }
28
29
  namespace markdown_editor {
29
30
  const markdown_editor_1: string;
@@ -24,6 +24,7 @@ export const strings = {
24
24
  },
25
25
  password_input: {
26
26
  show_password: 'パスワードを表示',
27
+ hide_password: 'パスワードを隠す',
27
28
  },
28
29
  markdown_editor: {
29
30
  markdown_editor: 'Markdown エディター',
@@ -2,9 +2,9 @@ import { getRandomId, sleep } from './util';
2
2
 
3
3
  /**
4
4
  * @type {{ [role: string]: {
5
- * orientation: string,
5
+ * orientation: 'vertical' | 'horizontal',
6
6
  * childRoles: string[],
7
- * childSelectedAttr: string,
7
+ * childSelectedAttr: 'aria-selected' | 'aria-checked',
8
8
  * focusChild: boolean
9
9
  * } }}
10
10
  */
@@ -71,6 +71,7 @@ class Group {
71
71
  : this.parent.getAttribute('aria-orientation') ?? orientation;
72
72
  this.childRoles = childRoles;
73
73
  this.childSelectedAttr = childSelectedAttr;
74
+ this.childSelectedProp = childSelectedAttr.replace('aria-', '');
74
75
  this.focusChild = focusChild;
75
76
 
76
77
  const { allMembers } = this;
@@ -83,7 +84,7 @@ class Group {
83
84
  const isSelected = element.matches(`[${childSelectedAttr}="true"]`);
84
85
  const controls = document.querySelector(`#${element.getAttribute('aria-controls')}`);
85
86
 
86
- element.id ||= `${this.id}-item-${index}`;
87
+ element.id ||= `${this.id}-item-${index + 1}`;
87
88
  element.tabIndex ||= isSelected || (!hasSelected && index === 0) ? 0 : -1;
88
89
  element.setAttribute(this.childSelectedAttr, String(isSelected));
89
90
  controls?.setAttribute('aria-labelledby', element.id);
@@ -118,31 +119,77 @@ class Group {
118
119
  );
119
120
  }
120
121
 
122
+ /** @type {boolean} */
123
+ get isDisabled() {
124
+ return this.parent.matches('[aria-disabled="true"]');
125
+ }
126
+
127
+ /** @type {boolean} */
128
+ get isReadOnly() {
129
+ return this.parent.matches('[aria-readonly="true"]');
130
+ }
131
+
121
132
  /**
122
133
  * Select (and move focus to) the given target.
123
134
  * @param {(MouseEvent | KeyboardEvent)} event Triggered event.
124
135
  * @param {HTMLElement} newTarget Target element.
125
136
  */
126
137
  selectTarget(event, newTarget) {
127
- const targetParentGroup = newTarget.closest(this.parentGroupSelector);
138
+ if (this.isDisabled || this.isReadOnly) {
139
+ event.preventDefault();
140
+
141
+ return;
142
+ }
143
+
144
+ const targetRole = newTarget.getAttribute('role');
145
+ const targetParent = newTarget.closest(this.parentGroupSelector);
146
+ const selectByClick = event.type === 'click';
147
+
148
+ const selectByKeydown =
149
+ event.type === 'keydown' && /** @type {KeyboardEvent} */ (event).key === ' ';
128
150
 
129
151
  this.activeMembers.forEach((element) => {
130
- const isTarget = element === newTarget;
131
- const isSelected = element.matches('[aria-selected="true"]');
152
+ const isMenuItemCheckbox = element.matches('[role="menuitemcheckbox"]');
132
153
  const isMenuItemRadio = element.matches('[role="menuitemradio"]');
154
+
155
+ if (
156
+ (isMenuItemCheckbox || isMenuItemRadio) &&
157
+ (element.getAttribute('role') !== targetRole ||
158
+ element.closest(this.parentGroupSelector) !== targetParent)
159
+ ) {
160
+ return;
161
+ }
162
+
163
+ const multiSelect = isMenuItemCheckbox || this.multi;
164
+ const singleSelect = isMenuItemRadio || !multiSelect;
165
+ const isTarget = element === newTarget;
166
+ const isSelected = element.matches(`[${this.childSelectedAttr}="true"]`);
133
167
  const controls = element.getAttribute('aria-controls');
134
168
 
135
- if (this.multi && isTarget && event.type === 'click') {
169
+ if (multiSelect && isTarget && (selectByClick || selectByKeydown)) {
136
170
  element.setAttribute(this.childSelectedAttr, String(!isSelected));
137
- element.dispatchEvent(new CustomEvent(isSelected ? 'unselect' : 'select'));
171
+ element.dispatchEvent(
172
+ new CustomEvent('change', { detail: { [this.childSelectedProp]: !isSelected } }),
173
+ );
174
+
175
+ if (!isSelected) {
176
+ element.dispatchEvent(new CustomEvent('select'));
177
+ }
138
178
  }
139
179
 
140
180
  if (
141
- (isMenuItemRadio && element.closest(this.parentGroupSelector) === targetParentGroup) ||
142
- (!isMenuItemRadio && !this.multi)
181
+ singleSelect &&
182
+ isSelected !== isTarget &&
183
+ (isMenuItemRadio ? selectByKeydown || selectByClick : true)
143
184
  ) {
144
185
  element.setAttribute(this.childSelectedAttr, String(isTarget));
145
- element.dispatchEvent(new CustomEvent(isTarget ? 'select' : 'unselect'));
186
+ element.dispatchEvent(
187
+ new CustomEvent('change', { detail: { [this.childSelectedProp]: isTarget } }),
188
+ );
189
+
190
+ if (isTarget) {
191
+ element.dispatchEvent(new CustomEvent('select'));
192
+ }
146
193
  }
147
194
 
148
195
  if (this.focusChild) {
@@ -160,6 +207,7 @@ class Group {
160
207
  }
161
208
 
162
209
  if (isTarget) {
210
+ this.parent.setAttribute('aria-activedescendant', element.id);
163
211
  element.scrollIntoView({ block: 'nearest', inline: 'nearest', behavior: 'smooth' });
164
212
  }
165
213
  });
@@ -226,8 +274,14 @@ class Group {
226
274
  event.preventDefault();
227
275
  }
228
276
 
229
- if (['Enter', ' '].includes(key)) {
230
- currentTarget.click();
277
+ if (key === 'Enter') {
278
+ currentTarget.click(); // Also close the popup if needed
279
+
280
+ return;
281
+ }
282
+
283
+ if (key === ' ') {
284
+ this.selectTarget(event, currentTarget);
231
285
 
232
286
  return;
233
287
  }
@@ -23,8 +23,12 @@ declare class Popup {
23
23
  popupElement: HTMLDialogElement;
24
24
  position: PopupPosition;
25
25
  id: string;
26
+ /** @type {boolean} */
27
+ get isDisabled(): boolean;
28
+ /** @type {boolean} */
29
+ get isReadOnly(): boolean;
26
30
  /**
27
- * Continue checking the position in case the window or parent element resizes.
31
+ * Check the position of the anchor element.
28
32
  */
29
33
  checkPosition(): void;
30
34
  }
@@ -48,26 +48,26 @@ class Popup {
48
48
  const top = position.startsWith('bottom-')
49
49
  ? `${Math.round(intersectionRect.bottom)}px`
50
50
  : position.endsWith('-top')
51
- ? `${Math.round(intersectionRect.top)}px`
52
- : 'auto';
51
+ ? `${Math.round(intersectionRect.top)}px`
52
+ : 'auto';
53
53
 
54
54
  const right = position.startsWith('left-')
55
55
  ? `${Math.round(rootBounds.width - intersectionRect.left)}px`
56
56
  : position.endsWith('-right')
57
- ? `${Math.round(rootBounds.width - intersectionRect.right)}px`
58
- : 'auto';
57
+ ? `${Math.round(rootBounds.width - intersectionRect.right)}px`
58
+ : 'auto';
59
59
 
60
60
  const bottom = position.startsWith('top-')
61
61
  ? `${Math.round(rootBounds.height - intersectionRect.top)}px`
62
62
  : position.endsWith('-bottom')
63
- ? `${Math.round(rootBounds.height - intersectionRect.bottom)}px`
64
- : 'auto';
63
+ ? `${Math.round(rootBounds.height - intersectionRect.bottom)}px`
64
+ : 'auto';
65
65
 
66
66
  const left = position.startsWith('right-')
67
67
  ? `${Math.round(intersectionRect.right)}px`
68
68
  : position.endsWith('-left')
69
- ? `${Math.round(intersectionRect.left)}px`
70
- : 'auto';
69
+ ? `${Math.round(intersectionRect.left)}px`
70
+ : 'auto';
71
71
 
72
72
  const anchorPopup = /** @type {HTMLElement} */ (this.anchorElement.closest('.popup'));
73
73
 
@@ -100,7 +100,7 @@ class Popup {
100
100
  this.popupElement.setAttribute('id', this.id);
101
101
 
102
102
  this.anchorElement.addEventListener('click', () => {
103
- if (!this.anchorElement.matches('[aria-disabled="true"]')) {
103
+ if (!this.isDisabled && !this.isReadOnly) {
104
104
  this.open.set(!get(this.open));
105
105
  }
106
106
  });
@@ -109,7 +109,7 @@ class Popup {
109
109
  const { key, ctrlKey, metaKey, shiftKey, altKey } = event;
110
110
  const hasModifier = shiftKey || altKey || ctrlKey || metaKey;
111
111
 
112
- if (['Enter', ' '].includes(key) && !hasModifier) {
112
+ if (!this.isDisabled && !this.isReadOnly && ['Enter', ' '].includes(key) && !hasModifier) {
113
113
  event.preventDefault();
114
114
  event.stopPropagation();
115
115
  this.open.set(!get(this.open));
@@ -154,19 +154,22 @@ class Popup {
154
154
  });
155
155
  }
156
156
 
157
+ /** @type {boolean} */
158
+ get isDisabled() {
159
+ return this.anchorElement.matches('[aria-disabled="true"]');
160
+ }
161
+
162
+ /** @type {boolean} */
163
+ get isReadOnly() {
164
+ return this.anchorElement.matches('[aria-readonly="true"]');
165
+ }
166
+
157
167
  /**
158
- * Continue checking the position in case the window or parent element resizes.
168
+ * Check the position of the anchor element.
159
169
  */
160
170
  checkPosition() {
171
+ this.observer.unobserve(this.anchorElement);
161
172
  this.observer.observe(this.anchorElement);
162
-
163
- window.requestAnimationFrame(() => {
164
- this.observer.unobserve(this.anchorElement);
165
-
166
- if (get(this.open)) {
167
- this.checkPosition();
168
- }
169
- });
170
173
  }
171
174
  }
172
175
 
@@ -20,13 +20,18 @@
20
20
  overflow-anchor: none;
21
21
  scroll-behavior: smooth;
22
22
  box-sizing: border-box;
23
- outline-offset: 1px;
24
- outline-width: 2px !important;
23
+ outline-offset: 0px;
24
+ outline-width: var(--sui-focus-ring-width) !important;
25
25
  outline-style: solid;
26
26
  outline-color: transparent;
27
27
  border-width: 0;
28
28
  border-style: solid;
29
29
  vertical-align: top;
30
+
31
+ @media (prefers-reduced-motion) {
32
+ // Disable transition but make sure the `transitionend` event works
33
+ transition-duration: 1ms !important;
34
+ }
30
35
  }
31
36
 
32
37
  * {
@@ -39,7 +44,8 @@
39
44
  }
40
45
 
41
46
  :focus-visible {
42
- outline-color: var(--sui-primary-accent-color-light);
47
+ outline-color: var(--sui-primary-accent-color-translucent);
48
+ z-index: 2;
43
49
  }
44
50
 
45
51
  h1,
@@ -77,31 +83,10 @@ pre {
77
83
  user-select: text;
78
84
  }
79
85
 
80
- dialog {
81
- position: fixed;
82
- inset: 0;
83
- outline: 0;
84
- margin: 0;
85
- border: 0;
86
- padding: 0;
87
- width: 100vw;
88
- max-width: 100vw;
89
- height: 100vh;
90
- max-height: 100vh;
91
- color: var(--sui-primary-foreground-color);
92
- background: transparent;
93
- -webkit-user-select: none;
94
- user-select: none;
95
- touch-action: none;
96
- cursor: default;
97
-
98
- &::backdrop {
99
- background: transparent;
100
- }
101
- }
102
-
103
86
  .disabled,
87
+ .readonly,
104
88
  [aria-disabled="true"],
89
+ [aria-readonly="true"],
105
90
  [inert] {
106
91
  cursor: default;
107
92
  pointer-events: none;
@@ -115,7 +100,9 @@ dialog {
115
100
  }
116
101
 
117
102
  .disabled *,
103
+ .readonly *,
118
104
  [aria-disabled="true"] *,
105
+ [aria-readonly="true"] *,
119
106
  [inert] * {
120
107
  cursor: default;
121
108
  pointer-events: none;
@@ -10,7 +10,7 @@
10
10
  --sui-background-color-3-hsl: var(--sui-base-hue) 5% 96%; // secondary
11
11
  --sui-background-color-4-hsl: var(--sui-base-hue) 5% 94%; // tertiary/disabled
12
12
  --sui-background-color-5-hsl: var(--sui-base-hue) 5% 74%; // highlight
13
- --sui-border-color-1-hsl: var(--sui-base-hue) 5% 54%; // control
13
+ --sui-border-color-1-hsl: var(--sui-base-hue) 5% 50%; // control
14
14
  --sui-border-color-2-hsl: var(--sui-base-hue) 5% 74%; // primary
15
15
  --sui-border-color-3-hsl: var(--sui-base-hue) 5% 70%; // secondary
16
16
  --sui-shadow-color: var(--sui-base-hue) 10% 0%;
@@ -20,6 +20,7 @@
20
20
  --sui-primary-accent-color: hsl(var(--sui-base-hue) 80% 40%);
21
21
  --sui-primary-accent-color-dark: hsl(var(--sui-base-hue) 80% 35%);
22
22
  --sui-primary-accent-color-inverted: hsl(var(--sui-base-hue) 10% 100%); // white
23
+ --sui-primary-accent-color-translucent: hsl(var(--sui-base-hue) 80% 50% / 40%);
23
24
  // Alerts
24
25
  --sui-error-color-hue: 0;
25
26
  --sui-warning-color-hue: 40;
@@ -45,7 +46,7 @@
45
46
  --sui-background-color-3-hsl: var(--sui-base-hue) 10% 14%; // secondary
46
47
  --sui-background-color-4-hsl: var(--sui-base-hue) 10% 16%; // tertiary/disabled
47
48
  --sui-background-color-5-hsl: var(--sui-base-hue) 10% 26%; // highlight
48
- --sui-border-color-1-hsl: var(--sui-base-hue) 10% 46%; // control
49
+ --sui-border-color-1-hsl: var(--sui-base-hue) 10% 50%; // control
49
50
  --sui-border-color-2-hsl: var(--sui-base-hue) 10% 26%; // primary
50
51
  --sui-border-color-3-hsl: var(--sui-base-hue) 10% 22%; // secondary
51
52
  --sui-shadow-color: var(--sui-base-hue) 10% 0%;
@@ -55,6 +56,7 @@
55
56
  --sui-primary-accent-color: hsl(var(--sui-base-hue) 100% 40%);
56
57
  --sui-primary-accent-color-dark: hsl(var(--sui-base-hue) 100% 35%);
57
58
  --sui-primary-accent-color-inverted: hsl(var(--sui-base-hue) 10% 100%); // white
59
+ --sui-primary-accent-color-translucent: hsl(var(--sui-base-hue) 80% 50% / 40%);
58
60
  // Alerts
59
61
  --sui-error-color-hue: 0;
60
62
  --sui-warning-color-hue: 40;
@@ -122,6 +124,8 @@
122
124
  var(--sui-success-color-hue) var(--sui-alert-background-color-saturation)
123
125
  var(--sui-alert-background-color-lightness)
124
126
  );
127
+ // Outline
128
+ --sui-focus-ring-width: 4px;
125
129
  // Borders
126
130
  --sui-primary-border-color: hsl(var(--sui-border-color-2-hsl));
127
131
  --sui-secondary-border-color: hsl(var(--sui-border-color-3-hsl));
@@ -213,7 +217,9 @@
213
217
  --sui-textbox-background-color: hsl(var(--sui-background-color-1-hsl));
214
218
  --sui-textbox-font-family: var(--sui-font-family-default);
215
219
  --sui-textbox-font-size: var(--sui-font-size-default);
220
+ --sui-textbox-singleline-min-width: 240px;
216
221
  --sui-textbox-singleline-line-height: var(--sui-line-height-compact);
222
+ --sui-textbox-multiline-min-width: 480px;
217
223
  --sui-textbox-multiline-line-height: var(--sui-line-height-comfortable);
218
224
  // Tab
219
225
  --sui-tab-small-height: var(--sui-control-small-height);
@@ -237,4 +243,10 @@
237
243
  --sui-primary-row-height: 56px;
238
244
  --sui-secondary-row-height: 48px;
239
245
  }
246
+
247
+ @media (prefers-reduced-transparency) {
248
+ --sui-primary-background-color-translucent: hsl(var(--sui-background-color-2-hsl));
249
+ --sui-secondary-background-color-translucent: hsl(var(--sui-background-color-3-hsl));
250
+ --sui-tertiary-background-color-translucent: hsl(var(--sui-background-color-4-hsl));
251
+ }
240
252
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sveltia/ui",
3
- "version": "0.7.4",
3
+ "version": "0.8.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -23,33 +23,33 @@
23
23
  "test:unit": "vitest"
24
24
  },
25
25
  "dependencies": {
26
- "svelte": "^4.2.2"
26
+ "svelte": "^4.2.3"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@playwright/test": "^1.39.0",
30
30
  "@sveltejs/adapter-auto": "2.1.1",
31
- "@sveltejs/kit": "^1.27.3",
31
+ "@sveltejs/kit": "^1.27.5",
32
32
  "@sveltejs/package": "^2.2.2",
33
- "cspell": "^7.3.8",
33
+ "cspell": "^8.0.0",
34
34
  "eslint": "^8.53.0",
35
35
  "eslint-config-airbnb-base": "^15.0.0",
36
36
  "eslint-config-prettier": "^9.0.0",
37
37
  "eslint-plugin-import": "^2.29.0",
38
- "eslint-plugin-jsdoc": "^46.8.2",
39
- "eslint-plugin-svelte": "^2.34.1",
38
+ "eslint-plugin-jsdoc": "^46.9.0",
39
+ "eslint-plugin-svelte": "^2.35.0",
40
40
  "npm-run-all": "^4.1.5",
41
41
  "postcss": "^8.4.31",
42
42
  "postcss-html": "^1.5.0",
43
- "prettier": "^3.0.3",
44
- "prettier-plugin-svelte": "^3.0.3",
43
+ "prettier": "^3.1.0",
44
+ "prettier-plugin-svelte": "^3.1.0",
45
45
  "sass": "^1.69.5",
46
46
  "stylelint": "^15.11.0",
47
47
  "stylelint-config-recommended-scss": "^13.1.0",
48
- "stylelint-scss": "^5.3.0",
49
- "svelte-check": "^3.5.2",
48
+ "stylelint-scss": "^5.3.1",
49
+ "svelte-check": "^3.6.0",
50
50
  "svelte-i18n": "^4.0.0",
51
51
  "svelte-migrate": "^1.2.7",
52
- "svelte-preprocess": "^5.0.4",
52
+ "svelte-preprocess": "^5.1.0",
53
53
  "tslib": "^2.6.2",
54
54
  "vite": "^4.5.0",
55
55
  "vitest": "^0.34.6"
@@ -91,11 +91,26 @@
91
91
  "svelte": "./package/components/checkbox/checkbox.svelte",
92
92
  "default": "./package/components/checkbox/checkbox.svelte"
93
93
  },
94
+ "./components/dialog/alert-dialog.svelte": {
95
+ "types": "./package/components/dialog/alert-dialog.svelte.d.ts",
96
+ "svelte": "./package/components/dialog/alert-dialog.svelte",
97
+ "default": "./package/components/dialog/alert-dialog.svelte"
98
+ },
99
+ "./components/dialog/confirmation-dialog.svelte": {
100
+ "types": "./package/components/dialog/confirmation-dialog.svelte.d.ts",
101
+ "svelte": "./package/components/dialog/confirmation-dialog.svelte",
102
+ "default": "./package/components/dialog/confirmation-dialog.svelte"
103
+ },
94
104
  "./components/dialog/dialog.svelte": {
95
105
  "types": "./package/components/dialog/dialog.svelte.d.ts",
96
106
  "svelte": "./package/components/dialog/dialog.svelte",
97
107
  "default": "./package/components/dialog/dialog.svelte"
98
108
  },
109
+ "./components/dialog/prompt-dialog.svelte": {
110
+ "types": "./package/components/dialog/prompt-dialog.svelte.d.ts",
111
+ "svelte": "./package/components/dialog/prompt-dialog.svelte",
112
+ "default": "./package/components/dialog/prompt-dialog.svelte"
113
+ },
99
114
  "./components/disclosure/disclosure.svelte": {
100
115
  "types": "./package/components/disclosure/disclosure.svelte.d.ts",
101
116
  "svelte": "./package/components/disclosure/disclosure.svelte",
@@ -116,6 +131,46 @@
116
131
  "svelte": "./package/components/drawer/drawer.svelte",
117
132
  "default": "./package/components/drawer/drawer.svelte"
118
133
  },
134
+ "./components/grid/grid-body.svelte": {
135
+ "types": "./package/components/grid/grid-body.svelte.d.ts",
136
+ "svelte": "./package/components/grid/grid-body.svelte",
137
+ "default": "./package/components/grid/grid-body.svelte"
138
+ },
139
+ "./components/grid/grid-cell.svelte": {
140
+ "types": "./package/components/grid/grid-cell.svelte.d.ts",
141
+ "svelte": "./package/components/grid/grid-cell.svelte",
142
+ "default": "./package/components/grid/grid-cell.svelte"
143
+ },
144
+ "./components/grid/grid-col-header.svelte": {
145
+ "types": "./package/components/grid/grid-col-header.svelte.d.ts",
146
+ "svelte": "./package/components/grid/grid-col-header.svelte",
147
+ "default": "./package/components/grid/grid-col-header.svelte"
148
+ },
149
+ "./components/grid/grid-foot.svelte": {
150
+ "types": "./package/components/grid/grid-foot.svelte.d.ts",
151
+ "svelte": "./package/components/grid/grid-foot.svelte",
152
+ "default": "./package/components/grid/grid-foot.svelte"
153
+ },
154
+ "./components/grid/grid-head.svelte": {
155
+ "types": "./package/components/grid/grid-head.svelte.d.ts",
156
+ "svelte": "./package/components/grid/grid-head.svelte",
157
+ "default": "./package/components/grid/grid-head.svelte"
158
+ },
159
+ "./components/grid/grid-row-header.svelte": {
160
+ "types": "./package/components/grid/grid-row-header.svelte.d.ts",
161
+ "svelte": "./package/components/grid/grid-row-header.svelte",
162
+ "default": "./package/components/grid/grid-row-header.svelte"
163
+ },
164
+ "./components/grid/grid-row.svelte": {
165
+ "types": "./package/components/grid/grid-row.svelte.d.ts",
166
+ "svelte": "./package/components/grid/grid-row.svelte",
167
+ "default": "./package/components/grid/grid-row.svelte"
168
+ },
169
+ "./components/grid/grid.svelte": {
170
+ "types": "./package/components/grid/grid.svelte.d.ts",
171
+ "svelte": "./package/components/grid/grid.svelte",
172
+ "default": "./package/components/grid/grid.svelte"
173
+ },
119
174
  "./components/icon/icon.svelte": {
120
175
  "types": "./package/components/icon/icon.svelte.d.ts",
121
176
  "svelte": "./package/components/icon/icon.svelte",
@@ -301,6 +356,11 @@
301
356
  "svelte": "./package/components/util/group.svelte",
302
357
  "default": "./package/components/util/group.svelte"
303
358
  },
359
+ "./components/util/modal.svelte": {
360
+ "types": "./package/components/util/modal.svelte.d.ts",
361
+ "svelte": "./package/components/util/modal.svelte",
362
+ "default": "./package/components/util/modal.svelte"
363
+ },
304
364
  "./components/util/popup.svelte": {
305
365
  "types": "./package/components/util/popup.svelte.d.ts",
306
366
  "svelte": "./package/components/util/popup.svelte",
@@ -374,9 +434,18 @@
374
434
  "components/checkbox/checkbox.svelte": [
375
435
  "./package/components/checkbox/checkbox.svelte.d.ts"
376
436
  ],
437
+ "components/dialog/alert-dialog.svelte": [
438
+ "./package/components/dialog/alert-dialog.svelte.d.ts"
439
+ ],
440
+ "components/dialog/confirmation-dialog.svelte": [
441
+ "./package/components/dialog/confirmation-dialog.svelte.d.ts"
442
+ ],
377
443
  "components/dialog/dialog.svelte": [
378
444
  "./package/components/dialog/dialog.svelte.d.ts"
379
445
  ],
446
+ "components/dialog/prompt-dialog.svelte": [
447
+ "./package/components/dialog/prompt-dialog.svelte.d.ts"
448
+ ],
380
449
  "components/disclosure/disclosure.svelte": [
381
450
  "./package/components/disclosure/disclosure.svelte.d.ts"
382
451
  ],
@@ -389,6 +458,30 @@
389
458
  "components/drawer/drawer.svelte": [
390
459
  "./package/components/drawer/drawer.svelte.d.ts"
391
460
  ],
461
+ "components/grid/grid-body.svelte": [
462
+ "./package/components/grid/grid-body.svelte.d.ts"
463
+ ],
464
+ "components/grid/grid-cell.svelte": [
465
+ "./package/components/grid/grid-cell.svelte.d.ts"
466
+ ],
467
+ "components/grid/grid-col-header.svelte": [
468
+ "./package/components/grid/grid-col-header.svelte.d.ts"
469
+ ],
470
+ "components/grid/grid-foot.svelte": [
471
+ "./package/components/grid/grid-foot.svelte.d.ts"
472
+ ],
473
+ "components/grid/grid-head.svelte": [
474
+ "./package/components/grid/grid-head.svelte.d.ts"
475
+ ],
476
+ "components/grid/grid-row-header.svelte": [
477
+ "./package/components/grid/grid-row-header.svelte.d.ts"
478
+ ],
479
+ "components/grid/grid-row.svelte": [
480
+ "./package/components/grid/grid-row.svelte.d.ts"
481
+ ],
482
+ "components/grid/grid.svelte": [
483
+ "./package/components/grid/grid.svelte.d.ts"
484
+ ],
392
485
  "components/icon/icon.svelte": [
393
486
  "./package/components/icon/icon.svelte.d.ts"
394
487
  ],
@@ -500,6 +593,9 @@
500
593
  "components/util/group.svelte": [
501
594
  "./package/components/util/group.svelte.d.ts"
502
595
  ],
596
+ "components/util/modal.svelte": [
597
+ "./package/components/util/modal.svelte.d.ts"
598
+ ],
503
599
  "components/util/popup.svelte": [
504
600
  "./package/components/util/popup.svelte.d.ts"
505
601
  ],