@sveltia/ui 0.9.0 → 0.10.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 +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 +73 -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,29 @@ 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
+ controlTarget.scrollIntoView({ block: 'nearest', inline: 'nearest', behavior: 'auto' });
100
+ }
101
+ }
92
102
  });
93
103
 
94
104
  parent.addEventListener('click', (event) => {
@@ -100,39 +110,66 @@ class Group {
100
110
  parent.addEventListener('keydown', (event) => {
101
111
  this.onKeyDown(event);
102
112
  });
113
+
114
+ parent.dispatchEvent(new CustomEvent('initialized'));
103
115
  }
104
116
 
105
- /** @type {string} */
117
+ /**
118
+ * CSS selector to retrieve the members.
119
+ * @type {string}
120
+ */
106
121
  get selector() {
107
122
  return this.childRoles.map((role) => `[role="${role}"]`).join(',');
108
123
  }
109
124
 
110
- /** @type {HTMLElement[]} */
125
+ /**
126
+ * List of all the members.
127
+ * @type {HTMLElement[]}
128
+ */
111
129
  get allMembers() {
112
130
  return /** @type {HTMLElement[]} */ ([...this.parent.querySelectorAll(this.selector)]);
113
131
  }
114
132
 
115
- /** @type {HTMLElement[]} */
133
+ /**
134
+ * List of the enabled and visible members.
135
+ * @type {HTMLElement[]}
136
+ */
116
137
  get activeMembers() {
117
138
  return this.allMembers.filter(
118
139
  (element) => !element.matches('[aria-disabled="true"], [aria-hidden="true"]'),
119
140
  );
120
141
  }
121
142
 
122
- /** @type {boolean} */
143
+ /**
144
+ * Get the currently selected member.
145
+ * @type {HTMLElement | undefined}
146
+ */
147
+ get selected() {
148
+ return this.activeMembers.find((element) =>
149
+ element.matches(`[${this.childSelectedAttr}="true"]`),
150
+ );
151
+ }
152
+
153
+ /**
154
+ * Whether the parent is disabled.
155
+ * @type {boolean}
156
+ */
123
157
  get isDisabled() {
124
158
  return this.parent.matches('[aria-disabled="true"]');
125
159
  }
126
160
 
127
- /** @type {boolean} */
161
+ /**
162
+ * Whether the parent is read-only.
163
+ * @type {boolean}
164
+ */
128
165
  get isReadOnly() {
129
166
  return this.parent.matches('[aria-readonly="true"]');
130
167
  }
131
168
 
132
169
  /**
133
170
  * Select (and move focus to) the given target.
134
- * @param {(MouseEvent | KeyboardEvent)} event Triggered event.
135
- * @param {HTMLElement} newTarget Target element.
171
+ * @param {(MouseEvent | KeyboardEvent)} event - Triggered event.
172
+ * @param {HTMLElement} newTarget - Target element.
136
173
  */
137
174
  selectTarget(event, newTarget) {
138
175
  if (this.isDisabled || this.isReadOnly) {
@@ -164,7 +201,8 @@ class Group {
164
201
  const singleSelect = isMenuItemRadio || !multiSelect;
165
202
  const isTarget = element === newTarget;
166
203
  const isSelected = element.matches(`[${this.childSelectedAttr}="true"]`);
167
- const controls = element.getAttribute('aria-controls');
204
+ const controlTargetId = element.getAttribute('aria-controls');
205
+ const controlTarget = controlTargetId ? document.getElementById(controlTargetId) : null;
168
206
 
169
207
  if (multiSelect && isTarget && (selectByClick || selectByKeydown)) {
170
208
  element.setAttribute(this.childSelectedAttr, String(!isSelected));
@@ -202,13 +240,18 @@ class Group {
202
240
  element.classList.toggle('focused', isTarget);
203
241
  }
204
242
 
205
- if (controls) {
206
- document.getElementById(controls)?.setAttribute('aria-hidden', String(!isTarget));
243
+ if (controlTarget) {
244
+ controlTarget.inert = !isTarget;
245
+ controlTarget.setAttribute('aria-hidden', String(!isTarget));
246
+
247
+ if (isTarget) {
248
+ controlTarget.scrollIntoView({ block: 'nearest', inline: 'nearest', behavior: 'auto' });
249
+ }
207
250
  }
208
251
 
209
252
  if (isTarget) {
210
253
  this.parent.setAttribute('aria-activedescendant', element.id);
211
- element.scrollIntoView({ block: 'nearest', inline: 'nearest', behavior: 'smooth' });
254
+ element.scrollIntoView({ block: 'nearest', inline: 'nearest', behavior: 'auto' });
212
255
  }
213
256
  });
214
257
 
@@ -224,7 +267,7 @@ class Group {
224
267
 
225
268
  /**
226
269
  * Handle the `click` event on the widget.
227
- * @param {MouseEvent} event `click` event.
270
+ * @param {MouseEvent} event - `click` event.
228
271
  */
229
272
  onClick(event) {
230
273
  // eslint-disable-next-line prefer-destructuring
@@ -240,7 +283,7 @@ class Group {
240
283
 
241
284
  /**
242
285
  * Handle the `keydown` event on the widget.
243
- * @param {KeyboardEvent} event `keydown` event.
286
+ * @param {KeyboardEvent} event - `keydown` event.
244
287
  */
245
288
  onKeyDown(event) {
246
289
  const { key, ctrlKey, metaKey, shiftKey, altKey } = event;
@@ -349,7 +392,7 @@ class Group {
349
392
 
350
393
  /**
351
394
  * Activate a new group.
352
- * @param {HTMLElement} parent Parent element.
395
+ * @param {HTMLElement} parent - Parent element.
353
396
  */
354
397
  export const activateGroup = (parent) => {
355
398
  (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.0",
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
  ],