@sveltia/ui 0.9.0 → 0.10.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 (118) hide show
  1. package/package/components/alert/alert.svelte +2 -4
  2. package/package/components/alert/alert.svelte.d.ts +2 -2
  3. package/package/components/button/button.svelte +78 -26
  4. package/package/components/button/button.svelte.d.ts +73 -63
  5. package/package/components/button/select-button-group.svelte +6 -1
  6. package/package/components/button/select-button-group.svelte.d.ts +13 -13
  7. package/package/components/button/select-button.svelte +2 -1
  8. package/package/components/button/select-button.svelte.d.ts +19 -19
  9. package/package/components/button/split-button.svelte +10 -2
  10. package/package/components/button/split-button.svelte.d.ts +19 -11
  11. package/package/components/calendar/calendar.svelte +2 -2
  12. package/package/components/calendar/calendar.svelte.d.ts +2 -2
  13. package/package/components/checkbox/checkbox-group.svelte.d.ts +7 -7
  14. package/package/components/checkbox/checkbox.svelte +8 -6
  15. package/package/components/checkbox/checkbox.svelte.d.ts +22 -16
  16. package/package/components/dialog/alert-dialog.svelte.d.ts +6 -6
  17. package/package/components/dialog/confirmation-dialog.svelte.d.ts +8 -8
  18. package/package/components/dialog/dialog.svelte +17 -15
  19. package/package/components/dialog/dialog.svelte.d.ts +30 -24
  20. package/package/components/dialog/prompt-dialog.svelte +1 -1
  21. package/package/components/dialog/prompt-dialog.svelte.d.ts +12 -12
  22. package/package/components/disclosure/disclosure.svelte +6 -1
  23. package/package/components/disclosure/disclosure.svelte.d.ts +29 -19
  24. package/package/components/divider/divider.svelte.d.ts +5 -5
  25. package/package/components/divider/spacer.svelte.d.ts +4 -4
  26. package/package/components/drawer/drawer.svelte +34 -16
  27. package/package/components/drawer/drawer.svelte.d.ts +22 -16
  28. package/package/components/grid/grid-body.svelte.d.ts +4 -4
  29. package/package/components/grid/grid-cell.svelte.d.ts +2 -2
  30. package/package/components/grid/grid-col-header.svelte.d.ts +2 -2
  31. package/package/components/grid/grid-foot.svelte.d.ts +2 -2
  32. package/package/components/grid/grid-head.svelte.d.ts +2 -2
  33. package/package/components/grid/grid-row-header.svelte.d.ts +2 -2
  34. package/package/components/grid/grid-row.svelte +10 -2
  35. package/package/components/grid/grid-row.svelte.d.ts +8 -8
  36. package/package/components/grid/grid.svelte +7 -2
  37. package/package/components/grid/grid.svelte.d.ts +8 -8
  38. package/package/components/icon/icon.svelte.d.ts +4 -4
  39. package/package/components/listbox/listbox.svelte +11 -5
  40. package/package/components/listbox/listbox.svelte.d.ts +15 -15
  41. package/package/components/listbox/option-group.svelte.d.ts +7 -7
  42. package/package/components/listbox/option.svelte +4 -2
  43. package/package/components/listbox/option.svelte.d.ts +15 -13
  44. package/package/components/menu/menu-button.svelte +8 -2
  45. package/package/components/menu/menu-button.svelte.d.ts +20 -18
  46. package/package/components/menu/menu-item-checkbox.svelte +1 -1
  47. package/package/components/menu/menu-item-checkbox.svelte.d.ts +16 -16
  48. package/package/components/menu/menu-item-group.svelte +1 -1
  49. package/package/components/menu/menu-item-group.svelte.d.ts +7 -7
  50. package/package/components/menu/menu-item-radio.svelte +1 -1
  51. package/package/components/menu/menu-item-radio.svelte.d.ts +16 -16
  52. package/package/components/menu/menu-item.svelte +32 -19
  53. package/package/components/menu/menu-item.svelte.d.ts +32 -18
  54. package/package/components/menu/menu.svelte +13 -7
  55. package/package/components/menu/menu.svelte.d.ts +7 -7
  56. package/package/components/radio/radio-group.svelte +6 -1
  57. package/package/components/radio/radio-group.svelte.d.ts +15 -15
  58. package/package/components/radio/radio.svelte +1 -1
  59. package/package/components/radio/radio.svelte.d.ts +14 -14
  60. package/package/components/select/combobox.svelte +10 -8
  61. package/package/components/select/combobox.svelte.d.ts +22 -16
  62. package/package/components/select/select.svelte.d.ts +12 -12
  63. package/package/components/slider/slider.svelte +26 -22
  64. package/package/components/slider/slider.svelte.d.ts +23 -23
  65. package/package/components/switch/switch.svelte +5 -0
  66. package/package/components/switch/switch.svelte.d.ts +18 -14
  67. package/package/components/table/table-body.svelte.d.ts +4 -4
  68. package/package/components/table/table-cell.svelte.d.ts +2 -2
  69. package/package/components/table/table-col-header.svelte.d.ts +2 -2
  70. package/package/components/table/table-foot.svelte.d.ts +2 -2
  71. package/package/components/table/table-head.svelte.d.ts +2 -2
  72. package/package/components/table/table-row-header.svelte.d.ts +2 -2
  73. package/package/components/table/table-row.svelte.d.ts +2 -2
  74. package/package/components/table/table.svelte.d.ts +2 -2
  75. package/package/components/tabs/tab-box.svelte +30 -0
  76. package/package/components/tabs/tab-box.svelte.d.ts +33 -0
  77. package/package/components/tabs/tab-list.svelte +105 -22
  78. package/package/components/tabs/tab-list.svelte.d.ts +10 -10
  79. package/package/components/tabs/tab-panel.svelte +6 -2
  80. package/package/components/tabs/tab-panel.svelte.d.ts +2 -2
  81. package/package/components/tabs/tab-panels.svelte +32 -0
  82. package/package/components/tabs/tab-panels.svelte.d.ts +31 -0
  83. package/package/components/tabs/tab.svelte.d.ts +11 -11
  84. package/package/components/text-field/markdown-editor.svelte.d.ts +12 -12
  85. package/package/components/text-field/number-input.svelte +11 -4
  86. package/package/components/text-field/number-input.svelte.d.ts +40 -20
  87. package/package/components/text-field/password-input.svelte +7 -3
  88. package/package/components/text-field/password-input.svelte.d.ts +30 -18
  89. package/package/components/text-field/search-bar.svelte +7 -3
  90. package/package/components/text-field/search-bar.svelte.d.ts +46 -36
  91. package/package/components/text-field/text-area.svelte +4 -2
  92. package/package/components/text-field/text-area.svelte.d.ts +25 -21
  93. package/package/components/text-field/text-input.svelte +17 -2
  94. package/package/components/text-field/text-input.svelte.d.ts +53 -53
  95. package/package/components/toast/toast.svelte +16 -12
  96. package/package/components/toast/toast.svelte.d.ts +8 -8
  97. package/package/components/toolbar/toolbar.svelte.d.ts +8 -8
  98. package/package/components/util/app-shell.svelte +22 -6
  99. package/package/components/util/app-shell.svelte.d.ts +2 -0
  100. package/package/components/util/group.svelte.d.ts +5 -5
  101. package/package/components/util/modal.svelte +26 -9
  102. package/package/components/util/modal.svelte.d.ts +34 -34
  103. package/package/components/util/popup.svelte +35 -13
  104. package/package/components/util/popup.svelte.d.ts +33 -28
  105. package/package/components/util/portal.svelte +5 -3
  106. package/package/components/util/portal.svelte.d.ts +2 -2
  107. package/package/index.d.ts +5 -3
  108. package/package/index.js +6 -4
  109. package/package/services/events.d.ts +1 -1
  110. package/package/services/events.js +11 -8
  111. package/package/services/group.js +100 -30
  112. package/package/services/popup.d.ts +27 -13
  113. package/package/services/popup.js +23 -9
  114. package/package/services/util.d.ts +2 -2
  115. package/package/services/util.js +5 -5
  116. package/package/styles/core.scss +1 -0
  117. package/package/styles/variables.scss +1 -0
  118. package/package.json +39 -23
@@ -2,10 +2,10 @@ import { getRandomId, sleep } from './util';
2
2
 
3
3
  /**
4
4
  * @type {{ [role: string]: {
5
- * orientation: 'vertical' | 'horizontal',
6
- * childRoles: string[],
7
- * childSelectedAttr: 'aria-selected' | 'aria-checked',
8
- * focusChild: boolean
5
+ * orientation: 'vertical' | 'horizontal',
6
+ * childRoles: string[],
7
+ * childSelectedAttr: 'aria-selected' | 'aria-checked',
8
+ * focusChild: boolean
9
9
  * } }}
10
10
  */
11
11
  const config = {
@@ -53,12 +53,14 @@ const config = {
53
53
  class Group {
54
54
  /**
55
55
  * Initialize a new `Group` instance.
56
- * @param {HTMLElement} parent Parent element.
56
+ * @param {HTMLElement} parent - Parent element.
57
57
  * @todo Check for added elements probably with `MutationObserver`.
58
58
  */
59
59
  constructor(parent) {
60
+ parent.dispatchEvent(new CustomEvent('initializing'));
61
+
60
62
  this.parent = parent;
61
- this.role = parent.getAttribute('role');
63
+ this.role = /** @type {string} */ (parent.getAttribute('role'));
62
64
  this.grid = this.role === 'listbox' && parent.matches('.grid');
63
65
  this.multi = this.parent.getAttribute('aria-multiselectable') === 'true';
64
66
  this.id = getRandomId(this.role);
@@ -74,21 +76,39 @@ class Group {
74
76
  this.childSelectedProp = childSelectedAttr.replace('aria-', '');
75
77
  this.focusChild = focusChild;
76
78
 
77
- const { allMembers } = this;
78
-
79
- const hasSelected = allMembers.some((element) =>
80
- element.matches(`[${childSelectedAttr}="true"]`),
81
- );
79
+ const { allMembers, selected: defaultSelected } = this;
82
80
 
83
81
  allMembers.forEach((element, index) => {
84
- const isSelected = element.matches(`[${childSelectedAttr}="true"]`);
85
- const controls = document.querySelector(`#${element.getAttribute('aria-controls')}`);
82
+ // Select the first one if no member has the `selected` attribute
83
+ const isSelected = defaultSelected ? element === defaultSelected : index === 0;
84
+
85
+ const controlTarget = /** @type {HTMLElement | null} */ (
86
+ document.querySelector(`#${element.getAttribute('aria-controls')}`)
87
+ );
86
88
 
87
89
  element.id ||= `${this.id}-item-${index + 1}`;
88
- element.tabIndex ||= isSelected || (!hasSelected && index === 0) ? 0 : -1;
90
+ element.tabIndex ||= isSelected ? 0 : -1;
89
91
  element.setAttribute(this.childSelectedAttr, String(isSelected));
90
- controls?.setAttribute('aria-labelledby', element.id);
91
- controls?.setAttribute('aria-hidden', String(!isSelected));
92
+
93
+ if (controlTarget) {
94
+ controlTarget.inert = !isSelected;
95
+ controlTarget.setAttribute('aria-labelledby', element.id);
96
+ controlTarget.setAttribute('aria-hidden', String(!isSelected));
97
+
98
+ if (isSelected) {
99
+ window.setTimeout(() => {
100
+ try {
101
+ controlTarget.scrollIntoView({
102
+ block: 'nearest',
103
+ inline: 'nearest',
104
+ behavior: 'auto',
105
+ });
106
+ } catch {
107
+ controlTarget.scrollIntoView(true);
108
+ }
109
+ }, 300);
110
+ }
111
+ }
92
112
  });
93
113
 
94
114
  parent.addEventListener('click', (event) => {
@@ -100,39 +120,66 @@ class Group {
100
120
  parent.addEventListener('keydown', (event) => {
101
121
  this.onKeyDown(event);
102
122
  });
123
+
124
+ parent.dispatchEvent(new CustomEvent('initialized'));
103
125
  }
104
126
 
105
- /** @type {string} */
127
+ /**
128
+ * CSS selector to retrieve the members.
129
+ * @type {string}
130
+ */
106
131
  get selector() {
107
132
  return this.childRoles.map((role) => `[role="${role}"]`).join(',');
108
133
  }
109
134
 
110
- /** @type {HTMLElement[]} */
135
+ /**
136
+ * List of all the members.
137
+ * @type {HTMLElement[]}
138
+ */
111
139
  get allMembers() {
112
140
  return /** @type {HTMLElement[]} */ ([...this.parent.querySelectorAll(this.selector)]);
113
141
  }
114
142
 
115
- /** @type {HTMLElement[]} */
143
+ /**
144
+ * List of the enabled and visible members.
145
+ * @type {HTMLElement[]}
146
+ */
116
147
  get activeMembers() {
117
148
  return this.allMembers.filter(
118
149
  (element) => !element.matches('[aria-disabled="true"], [aria-hidden="true"]'),
119
150
  );
120
151
  }
121
152
 
122
- /** @type {boolean} */
153
+ /**
154
+ * Get the currently selected member.
155
+ * @type {HTMLElement | undefined}
156
+ */
157
+ get selected() {
158
+ return this.activeMembers.find((element) =>
159
+ element.matches(`[${this.childSelectedAttr}="true"]`),
160
+ );
161
+ }
162
+
163
+ /**
164
+ * Whether the parent is disabled.
165
+ * @type {boolean}
166
+ */
123
167
  get isDisabled() {
124
168
  return this.parent.matches('[aria-disabled="true"]');
125
169
  }
126
170
 
127
- /** @type {boolean} */
171
+ /**
172
+ * Whether the parent is read-only.
173
+ * @type {boolean}
174
+ */
128
175
  get isReadOnly() {
129
176
  return this.parent.matches('[aria-readonly="true"]');
130
177
  }
131
178
 
132
179
  /**
133
180
  * Select (and move focus to) the given target.
134
- * @param {(MouseEvent | KeyboardEvent)} event Triggered event.
135
- * @param {HTMLElement} newTarget Target element.
181
+ * @param {(MouseEvent | KeyboardEvent)} event - Triggered event.
182
+ * @param {HTMLElement} newTarget - Target element.
136
183
  */
137
184
  selectTarget(event, newTarget) {
138
185
  if (this.isDisabled || this.isReadOnly) {
@@ -164,7 +211,8 @@ class Group {
164
211
  const singleSelect = isMenuItemRadio || !multiSelect;
165
212
  const isTarget = element === newTarget;
166
213
  const isSelected = element.matches(`[${this.childSelectedAttr}="true"]`);
167
- const controls = element.getAttribute('aria-controls');
214
+ const controlTargetId = element.getAttribute('aria-controls');
215
+ const controlTarget = controlTargetId ? document.getElementById(controlTargetId) : null;
168
216
 
169
217
  if (multiSelect && isTarget && (selectByClick || selectByKeydown)) {
170
218
  element.setAttribute(this.childSelectedAttr, String(!isSelected));
@@ -202,13 +250,35 @@ class Group {
202
250
  element.classList.toggle('focused', isTarget);
203
251
  }
204
252
 
205
- if (controls) {
206
- document.getElementById(controls)?.setAttribute('aria-hidden', String(!isTarget));
253
+ if (controlTarget) {
254
+ controlTarget.inert = !isTarget;
255
+ controlTarget.setAttribute('aria-hidden', String(!isTarget));
256
+
257
+ if (isTarget) {
258
+ window.setTimeout(() => {
259
+ try {
260
+ controlTarget.scrollIntoView({
261
+ block: 'nearest',
262
+ inline: 'nearest',
263
+ behavior: 'auto',
264
+ });
265
+ } catch {
266
+ controlTarget.scrollIntoView(true);
267
+ }
268
+ }, 300);
269
+ }
207
270
  }
208
271
 
209
272
  if (isTarget) {
210
273
  this.parent.setAttribute('aria-activedescendant', element.id);
211
- element.scrollIntoView({ block: 'nearest', inline: 'nearest', behavior: 'smooth' });
274
+
275
+ window.setTimeout(() => {
276
+ try {
277
+ element.scrollIntoView({ block: 'nearest', inline: 'nearest', behavior: 'auto' });
278
+ } catch {
279
+ element.scrollIntoView(true);
280
+ }
281
+ }, 300);
212
282
  }
213
283
  });
214
284
 
@@ -224,7 +294,7 @@ class Group {
224
294
 
225
295
  /**
226
296
  * Handle the `click` event on the widget.
227
- * @param {MouseEvent} event `click` event.
297
+ * @param {MouseEvent} event - `click` event.
228
298
  */
229
299
  onClick(event) {
230
300
  // eslint-disable-next-line prefer-destructuring
@@ -240,7 +310,7 @@ class Group {
240
310
 
241
311
  /**
242
312
  * Handle the `keydown` event on the widget.
243
- * @param {KeyboardEvent} event `keydown` event.
313
+ * @param {KeyboardEvent} event - `keydown` event.
244
314
  */
245
315
  onKeyDown(event) {
246
316
  const { key, ctrlKey, metaKey, shiftKey, altKey } = event;
@@ -349,7 +419,7 @@ class Group {
349
419
 
350
420
  /**
351
421
  * Activate a new group.
352
- * @param {HTMLElement} parent Parent element.
422
+ * @param {HTMLElement} parent - Parent element.
353
423
  */
354
424
  export const activateGroup = (parent) => {
355
425
  (async () => {
@@ -6,19 +6,27 @@ export function activatePopup(...args: any[]): Popup;
6
6
  declare class Popup {
7
7
  /**
8
8
  * Initialize a new `Popup` instance.
9
- * @param {HTMLButtonElement} anchorElement `<button>` element that triggers the popup.
10
- * @param {HTMLDialogElement} popupElement `<dialog>` element to be used for the popup.
11
- * @param {PopupPosition} position Where to show the popup content.
12
- * @param {HTMLElement} [positionBaseElement] The base element of the `position`. If omitted, this
13
- * will be the `anchorElement`.
9
+ * @param {HTMLButtonElement} anchorElement - `<button>` element that triggers the popup.
10
+ * @param {HTMLDialogElement} popupElement - `<dialog>` element to be used for the popup.
11
+ * @param {PopupPosition} position - Where to show the popup content.
12
+ * @param {HTMLElement} [positionBaseElement] - The base element of the `position`. If omitted,
13
+ * this will be the `anchorElement`.
14
14
  */
15
- constructor(anchorElement: HTMLButtonElement, popupElement: HTMLDialogElement, position: PopupPosition, positionBaseElement?: HTMLElement);
15
+ constructor(anchorElement: HTMLButtonElement, popupElement: HTMLDialogElement, position: PopupPosition, positionBaseElement?: HTMLElement | undefined);
16
16
  open: import("svelte/store").Writable<boolean>;
17
- style: import("svelte/store").Writable<{
18
- inset: any;
19
- zIndex: any;
20
- width: any;
21
- height: any;
17
+ /**
18
+ * @type {import('svelte/store').Writable<{
19
+ * inset: string | undefined,
20
+ * zIndex: number | undefined,
21
+ * width: string | undefined,
22
+ * height: string | undefined,
23
+ * }>}
24
+ */
25
+ style: import('svelte/store').Writable<{
26
+ inset: string | undefined;
27
+ zIndex: number | undefined;
28
+ width: string | undefined;
29
+ height: string | undefined;
22
30
  }>;
23
31
  observer: IntersectionObserver;
24
32
  anchorElement: HTMLButtonElement;
@@ -26,9 +34,15 @@ declare class Popup {
26
34
  position: PopupPosition;
27
35
  positionBaseElement: HTMLElement;
28
36
  id: string;
29
- /** @type {boolean} */
37
+ /**
38
+ * Whether the anchor element is disabled.
39
+ * @type {boolean}
40
+ */
30
41
  get isDisabled(): boolean;
31
- /** @type {boolean} */
42
+ /**
43
+ * Whether the anchor element is read-only.
44
+ * @type {boolean}
45
+ */
32
46
  get isReadOnly(): boolean;
33
47
  /**
34
48
  * Check the position of the anchor element.
@@ -9,6 +9,14 @@ import { getRandomId } from './util';
9
9
  class Popup {
10
10
  open = writable(false);
11
11
 
12
+ /**
13
+ * @type {import('svelte/store').Writable<{
14
+ * inset: string | undefined,
15
+ * zIndex: number | undefined,
16
+ * width: string | undefined,
17
+ * height: string | undefined,
18
+ * }>}
19
+ */
12
20
  style = writable({ inset: undefined, zIndex: undefined, width: undefined, height: undefined });
13
21
 
14
22
  observer = new IntersectionObserver((entries) => {
@@ -18,7 +26,7 @@ class Popup {
18
26
  }
19
27
 
20
28
  const { scrollHeight: contentHeight, scrollWidth: contentWidth } =
21
- this.popupElement.querySelector('.content');
29
+ /** @type {HTMLElement} */ (this.popupElement.querySelector('.content'));
22
30
 
23
31
  const topMargin = intersectionRect.top - 8;
24
32
  const bottomMargin = rootBounds.height - intersectionRect.bottom - 8;
@@ -86,11 +94,11 @@ class Popup {
86
94
 
87
95
  /**
88
96
  * Initialize a new `Popup` instance.
89
- * @param {HTMLButtonElement} anchorElement `<button>` element that triggers the popup.
90
- * @param {HTMLDialogElement} popupElement `<dialog>` element to be used for the popup.
91
- * @param {PopupPosition} position Where to show the popup content.
92
- * @param {HTMLElement} [positionBaseElement] The base element of the `position`. If omitted, this
93
- * will be the `anchorElement`.
97
+ * @param {HTMLButtonElement} anchorElement - `<button>` element that triggers the popup.
98
+ * @param {HTMLDialogElement} popupElement - `<dialog>` element to be used for the popup.
99
+ * @param {PopupPosition} position - Where to show the popup content.
100
+ * @param {HTMLElement} [positionBaseElement] - The base element of the `position`. If omitted,
101
+ * this will be the `anchorElement`.
94
102
  */
95
103
  constructor(anchorElement, popupElement, position, positionBaseElement) {
96
104
  this.anchorElement = anchorElement;
@@ -157,12 +165,18 @@ class Popup {
157
165
  });
158
166
  }
159
167
 
160
- /** @type {boolean} */
168
+ /**
169
+ * Whether the anchor element is disabled.
170
+ * @type {boolean}
171
+ */
161
172
  get isDisabled() {
162
173
  return this.anchorElement.matches('[aria-disabled="true"]');
163
174
  }
164
175
 
165
- /** @type {boolean} */
176
+ /**
177
+ * Whether the anchor element is read-only.
178
+ * @type {boolean}
179
+ */
166
180
  get isReadOnly() {
167
181
  return this.anchorElement.matches('[aria-readonly="true"]');
168
182
  }
@@ -178,7 +192,7 @@ class Popup {
178
192
 
179
193
  /**
180
194
  * Activate a new popup.
181
- * @param {...any} args Arguments.
195
+ * @param {...any} args - Arguments.
182
196
  * @returns {Popup} New popup.
183
197
  */
184
198
  // @ts-ignore
@@ -1,3 +1,3 @@
1
- export function getRandomId(prefix?: string, length?: number): string;
1
+ export function getRandomId(prefix?: string | undefined, length?: number | undefined): string;
2
2
  export function isObject(input: any): boolean;
3
- export function sleep(ms?: number): Promise<void>;
3
+ export function sleep(ms?: number | undefined): Promise<void>;
@@ -1,21 +1,21 @@
1
1
  /**
2
2
  * Get a random ID that can be used for elements.
3
- * @param {string} [prefix] Prefix to be added to the ID, e.g. `popup`.
4
- * @param {number} [length] Number of characters to be used in the ID.
3
+ * @param {string} [prefix] - Prefix to be added to the ID, e.g. `popup`.
4
+ * @param {number} [length] - Number of characters to be used in the ID.
5
5
  * @returns {string} Generated ID.
6
6
  */
7
7
  export const getRandomId = (prefix = 'e', length = 7) =>
8
8
  [
9
9
  prefix,
10
10
  new Array(length)
11
- .fill()
11
+ .fill(0)
12
12
  .map(() => '0123456789abcdef'[Math.floor(Math.random() * 12)])
13
13
  .join(''),
14
14
  ].join('-');
15
15
 
16
16
  /**
17
17
  * Check if the given input is a simple object.
18
- * @param {*} input Input, probably an object.
18
+ * @param {*} input - Input, probably an object.
19
19
  * @returns {boolean} Result.
20
20
  */
21
21
  export const isObject = (input) =>
@@ -24,7 +24,7 @@ export const isObject = (input) =>
24
24
  /**
25
25
  * Return a simple `Promise` to resolve in the given time, making it easier to wait for a bit in the
26
26
  * code, particularly while making sequential HTTP requests.
27
- * @param {number} [ms] Milliseconds to wait.
27
+ * @param {number} [ms] - Milliseconds to wait.
28
28
  * @returns {Promise<void>} Nothing.
29
29
  */
30
30
  export const sleep = (ms = 1000) =>
@@ -29,6 +29,7 @@
29
29
  vertical-align: top;
30
30
 
31
31
  @media (prefers-reduced-motion) {
32
+ scroll-behavior: auto;
32
33
  // Disable transition but make sure the `transitionend` event works
33
34
  transition-duration: 1ms !important;
34
35
  }
@@ -222,6 +222,7 @@
222
222
  --sui-textbox-multiline-min-width: 480px;
223
223
  --sui-textbox-multiline-line-height: var(--sui-line-height-comfortable);
224
224
  // Tab
225
+ --sui-tab-height: var(--sui-control-medium-height);
225
226
  --sui-tab-small-height: var(--sui-control-small-height);
226
227
  --sui-tab-medium-height: var(--sui-control-medium-height);
227
228
  --sui-tab-large-height: var(--sui-control-large-height);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sveltia/ui",
3
- "version": "0.9.0",
3
+ "version": "0.10.1",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -23,36 +23,36 @@
23
23
  "test:unit": "vitest"
24
24
  },
25
25
  "dependencies": {
26
- "svelte": "^4.2.7"
26
+ "svelte": "^4.2.8"
27
27
  },
28
28
  "devDependencies": {
29
- "@playwright/test": "^1.40.0",
30
- "@sveltejs/adapter-auto": "2.1.1",
31
- "@sveltejs/kit": "^1.27.6",
32
- "@sveltejs/package": "^2.2.3",
33
- "cspell": "^8.0.0",
34
- "eslint": "^8.54.0",
29
+ "@playwright/test": "^1.40.1",
30
+ "@sveltejs/adapter-auto": "^3.1.0",
31
+ "@sveltejs/kit": "^2.3.2",
32
+ "@sveltejs/package": "^2.2.5",
33
+ "@sveltejs/vite-plugin-svelte": "^3.0.1",
34
+ "cspell": "^8.3.2",
35
+ "eslint": "^8.56.0",
35
36
  "eslint-config-airbnb-base": "^15.0.0",
36
- "eslint-config-prettier": "^9.0.0",
37
- "eslint-plugin-import": "^2.29.0",
38
- "eslint-plugin-jsdoc": "^46.9.0",
37
+ "eslint-config-prettier": "^9.1.0",
38
+ "eslint-plugin-import": "^2.29.1",
39
+ "eslint-plugin-jsdoc": "^48.0.2",
39
40
  "eslint-plugin-svelte": "^2.35.1",
40
41
  "npm-run-all": "^4.1.5",
41
- "postcss": "^8.4.31",
42
- "postcss-html": "^1.5.0",
43
- "prettier": "^3.1.0",
42
+ "postcss": "^8.4.33",
43
+ "postcss-html": "^1.6.0",
44
+ "prettier": "^3.2.2",
44
45
  "prettier-plugin-svelte": "^3.1.2",
45
- "sass": "^1.69.5",
46
- "stylelint": "^15.11.0",
47
- "stylelint-config-recommended-scss": "^13.1.0",
48
- "stylelint-scss": "^5.3.1",
49
- "svelte-check": "^3.6.2",
46
+ "sass": "^1.69.7",
47
+ "stylelint": "^16.1.0",
48
+ "stylelint-config-recommended-scss": "^14.0.0",
49
+ "stylelint-scss": "^6.0.0",
50
+ "svelte-check": "^3.6.3",
50
51
  "svelte-i18n": "^4.0.0",
51
- "svelte-migrate": "^1.2.7",
52
- "svelte-preprocess": "^5.1.1",
52
+ "svelte-preprocess": "^5.1.3",
53
53
  "tslib": "^2.6.2",
54
- "vite": "^4.5.0",
55
- "vitest": "^0.34.6"
54
+ "vite": "^5.0.11",
55
+ "vitest": "^1.2.0"
56
56
  },
57
57
  "exports": {
58
58
  "./package.json": "./package.json",
@@ -296,6 +296,11 @@
296
296
  "svelte": "./package/components/table/table.svelte",
297
297
  "default": "./package/components/table/table.svelte"
298
298
  },
299
+ "./components/tabs/tab-box.svelte": {
300
+ "types": "./package/components/tabs/tab-box.svelte.d.ts",
301
+ "svelte": "./package/components/tabs/tab-box.svelte",
302
+ "default": "./package/components/tabs/tab-box.svelte"
303
+ },
299
304
  "./components/tabs/tab-list.svelte": {
300
305
  "types": "./package/components/tabs/tab-list.svelte.d.ts",
301
306
  "svelte": "./package/components/tabs/tab-list.svelte",
@@ -306,6 +311,11 @@
306
311
  "svelte": "./package/components/tabs/tab-panel.svelte",
307
312
  "default": "./package/components/tabs/tab-panel.svelte"
308
313
  },
314
+ "./components/tabs/tab-panels.svelte": {
315
+ "types": "./package/components/tabs/tab-panels.svelte.d.ts",
316
+ "svelte": "./package/components/tabs/tab-panels.svelte",
317
+ "default": "./package/components/tabs/tab-panels.svelte"
318
+ },
309
319
  "./components/tabs/tab.svelte": {
310
320
  "types": "./package/components/tabs/tab.svelte.d.ts",
311
321
  "svelte": "./package/components/tabs/tab.svelte",
@@ -562,12 +572,18 @@
562
572
  "components/table/table.svelte": [
563
573
  "./package/components/table/table.svelte.d.ts"
564
574
  ],
575
+ "components/tabs/tab-box.svelte": [
576
+ "./package/components/tabs/tab-box.svelte.d.ts"
577
+ ],
565
578
  "components/tabs/tab-list.svelte": [
566
579
  "./package/components/tabs/tab-list.svelte.d.ts"
567
580
  ],
568
581
  "components/tabs/tab-panel.svelte": [
569
582
  "./package/components/tabs/tab-panel.svelte.d.ts"
570
583
  ],
584
+ "components/tabs/tab-panels.svelte": [
585
+ "./package/components/tabs/tab-panels.svelte.d.ts"
586
+ ],
571
587
  "components/tabs/tab.svelte": [
572
588
  "./package/components/tabs/tab.svelte.d.ts"
573
589
  ],