@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.
- package/package/components/alert/alert.svelte +2 -4
- package/package/components/alert/alert.svelte.d.ts +2 -2
- package/package/components/button/button.svelte +78 -26
- package/package/components/button/button.svelte.d.ts +73 -63
- package/package/components/button/select-button-group.svelte +6 -1
- package/package/components/button/select-button-group.svelte.d.ts +13 -13
- package/package/components/button/select-button.svelte +2 -1
- package/package/components/button/select-button.svelte.d.ts +19 -19
- package/package/components/button/split-button.svelte +10 -2
- package/package/components/button/split-button.svelte.d.ts +19 -11
- package/package/components/calendar/calendar.svelte +2 -2
- package/package/components/calendar/calendar.svelte.d.ts +2 -2
- package/package/components/checkbox/checkbox-group.svelte.d.ts +7 -7
- package/package/components/checkbox/checkbox.svelte +8 -6
- package/package/components/checkbox/checkbox.svelte.d.ts +22 -16
- package/package/components/dialog/alert-dialog.svelte.d.ts +6 -6
- package/package/components/dialog/confirmation-dialog.svelte.d.ts +8 -8
- package/package/components/dialog/dialog.svelte +17 -15
- package/package/components/dialog/dialog.svelte.d.ts +30 -24
- package/package/components/dialog/prompt-dialog.svelte +1 -1
- package/package/components/dialog/prompt-dialog.svelte.d.ts +12 -12
- package/package/components/disclosure/disclosure.svelte +6 -1
- package/package/components/disclosure/disclosure.svelte.d.ts +29 -19
- package/package/components/divider/divider.svelte.d.ts +5 -5
- package/package/components/divider/spacer.svelte.d.ts +4 -4
- package/package/components/drawer/drawer.svelte +34 -16
- package/package/components/drawer/drawer.svelte.d.ts +22 -16
- package/package/components/grid/grid-body.svelte.d.ts +4 -4
- package/package/components/grid/grid-cell.svelte.d.ts +2 -2
- package/package/components/grid/grid-col-header.svelte.d.ts +2 -2
- package/package/components/grid/grid-foot.svelte.d.ts +2 -2
- package/package/components/grid/grid-head.svelte.d.ts +2 -2
- package/package/components/grid/grid-row-header.svelte.d.ts +2 -2
- package/package/components/grid/grid-row.svelte +10 -2
- package/package/components/grid/grid-row.svelte.d.ts +8 -8
- package/package/components/grid/grid.svelte +7 -2
- package/package/components/grid/grid.svelte.d.ts +8 -8
- package/package/components/icon/icon.svelte.d.ts +4 -4
- package/package/components/listbox/listbox.svelte +11 -5
- package/package/components/listbox/listbox.svelte.d.ts +15 -15
- package/package/components/listbox/option-group.svelte.d.ts +7 -7
- package/package/components/listbox/option.svelte +4 -2
- package/package/components/listbox/option.svelte.d.ts +15 -13
- package/package/components/menu/menu-button.svelte +8 -2
- package/package/components/menu/menu-button.svelte.d.ts +20 -18
- package/package/components/menu/menu-item-checkbox.svelte +1 -1
- package/package/components/menu/menu-item-checkbox.svelte.d.ts +16 -16
- package/package/components/menu/menu-item-group.svelte +1 -1
- package/package/components/menu/menu-item-group.svelte.d.ts +7 -7
- package/package/components/menu/menu-item-radio.svelte +1 -1
- package/package/components/menu/menu-item-radio.svelte.d.ts +16 -16
- package/package/components/menu/menu-item.svelte +32 -19
- package/package/components/menu/menu-item.svelte.d.ts +32 -18
- package/package/components/menu/menu.svelte +13 -7
- package/package/components/menu/menu.svelte.d.ts +7 -7
- package/package/components/radio/radio-group.svelte +6 -1
- package/package/components/radio/radio-group.svelte.d.ts +15 -15
- package/package/components/radio/radio.svelte +1 -1
- package/package/components/radio/radio.svelte.d.ts +14 -14
- package/package/components/select/combobox.svelte +10 -8
- package/package/components/select/combobox.svelte.d.ts +22 -16
- package/package/components/select/select.svelte.d.ts +12 -12
- package/package/components/slider/slider.svelte +26 -22
- package/package/components/slider/slider.svelte.d.ts +23 -23
- package/package/components/switch/switch.svelte +5 -0
- package/package/components/switch/switch.svelte.d.ts +18 -14
- package/package/components/table/table-body.svelte.d.ts +4 -4
- package/package/components/table/table-cell.svelte.d.ts +2 -2
- package/package/components/table/table-col-header.svelte.d.ts +2 -2
- package/package/components/table/table-foot.svelte.d.ts +2 -2
- package/package/components/table/table-head.svelte.d.ts +2 -2
- package/package/components/table/table-row-header.svelte.d.ts +2 -2
- package/package/components/table/table-row.svelte.d.ts +2 -2
- package/package/components/table/table.svelte.d.ts +2 -2
- package/package/components/tabs/tab-box.svelte +30 -0
- package/package/components/tabs/tab-box.svelte.d.ts +33 -0
- package/package/components/tabs/tab-list.svelte +105 -22
- package/package/components/tabs/tab-list.svelte.d.ts +10 -10
- package/package/components/tabs/tab-panel.svelte +6 -2
- package/package/components/tabs/tab-panel.svelte.d.ts +2 -2
- package/package/components/tabs/tab-panels.svelte +32 -0
- package/package/components/tabs/tab-panels.svelte.d.ts +31 -0
- package/package/components/tabs/tab.svelte.d.ts +11 -11
- package/package/components/text-field/markdown-editor.svelte.d.ts +12 -12
- package/package/components/text-field/number-input.svelte +11 -4
- package/package/components/text-field/number-input.svelte.d.ts +40 -20
- package/package/components/text-field/password-input.svelte +7 -3
- package/package/components/text-field/password-input.svelte.d.ts +30 -18
- package/package/components/text-field/search-bar.svelte +7 -3
- package/package/components/text-field/search-bar.svelte.d.ts +46 -36
- package/package/components/text-field/text-area.svelte +4 -2
- package/package/components/text-field/text-area.svelte.d.ts +25 -21
- package/package/components/text-field/text-input.svelte +17 -2
- package/package/components/text-field/text-input.svelte.d.ts +53 -53
- package/package/components/toast/toast.svelte +16 -12
- package/package/components/toast/toast.svelte.d.ts +8 -8
- package/package/components/toolbar/toolbar.svelte.d.ts +8 -8
- package/package/components/util/app-shell.svelte +22 -6
- package/package/components/util/app-shell.svelte.d.ts +2 -0
- package/package/components/util/group.svelte.d.ts +5 -5
- package/package/components/util/modal.svelte +26 -9
- package/package/components/util/modal.svelte.d.ts +34 -34
- package/package/components/util/popup.svelte +35 -13
- package/package/components/util/popup.svelte.d.ts +33 -28
- package/package/components/util/portal.svelte +5 -3
- package/package/components/util/portal.svelte.d.ts +2 -2
- package/package/index.d.ts +5 -3
- package/package/index.js +6 -4
- package/package/services/events.d.ts +1 -1
- package/package/services/events.js +11 -8
- package/package/services/group.js +100 -30
- package/package/services/popup.d.ts +27 -13
- package/package/services/popup.js +23 -9
- package/package/services/util.d.ts +2 -2
- package/package/services/util.js +5 -5
- package/package/styles/core.scss +1 -0
- package/package/styles/variables.scss +1 -0
- package/package.json +39 -23
|
@@ -2,10 +2,10 @@ import { getRandomId, sleep } from './util';
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @type {{ [role: string]: {
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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
|
-
|
|
85
|
-
const
|
|
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
|
|
90
|
+
element.tabIndex ||= isSelected ? 0 : -1;
|
|
89
91
|
element.setAttribute(this.childSelectedAttr, String(isSelected));
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
|
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 (
|
|
206
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
/**
|
|
37
|
+
/**
|
|
38
|
+
* Whether the anchor element is disabled.
|
|
39
|
+
* @type {boolean}
|
|
40
|
+
*/
|
|
30
41
|
get isDisabled(): boolean;
|
|
31
|
-
/**
|
|
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,
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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>;
|
package/package/services/util.js
CHANGED
|
@@ -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) =>
|
package/package/styles/core.scss
CHANGED
|
@@ -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.
|
|
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.
|
|
26
|
+
"svelte": "^4.2.8"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@playwright/test": "^1.40.
|
|
30
|
-
"@sveltejs/adapter-auto": "
|
|
31
|
-
"@sveltejs/kit": "^
|
|
32
|
-
"@sveltejs/package": "^2.2.
|
|
33
|
-
"
|
|
34
|
-
"
|
|
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.
|
|
37
|
-
"eslint-plugin-import": "^2.29.
|
|
38
|
-
"eslint-plugin-jsdoc": "^
|
|
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.
|
|
42
|
-
"postcss-html": "^1.
|
|
43
|
-
"prettier": "^3.
|
|
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.
|
|
46
|
-
"stylelint": "^
|
|
47
|
-
"stylelint-config-recommended-scss": "^
|
|
48
|
-
"stylelint-scss": "^
|
|
49
|
-
"svelte-check": "^3.6.
|
|
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-
|
|
52
|
-
"svelte-preprocess": "^5.1.1",
|
|
52
|
+
"svelte-preprocess": "^5.1.3",
|
|
53
53
|
"tslib": "^2.6.2",
|
|
54
|
-
"vite": "^
|
|
55
|
-
"vitest": "^
|
|
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
|
],
|