@sveltia/ui 0.66.0 → 0.67.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/dist/components/text-editor/shiki/generated.d.ts +1 -1
- package/dist/components/text-editor/shiki/generated.js +1 -1
- package/dist/components/text-editor/toolbar/insert-link-button.svelte +4 -0
- package/dist/components/text-field/text-area.svelte +11 -2
- package/dist/components/util/modal.svelte +32 -9
- package/dist/locales/README.md +3 -0
- package/dist/locales/sv.yaml +113 -0
- package/dist/locales/vi.yaml +116 -0
- package/dist/typedefs.d.ts +7 -0
- package/dist/typedefs.js +4 -0
- package/package.json +9 -9
|
@@ -7,7 +7,7 @@ export const SHIKI_VERSION: "4.4.3";
|
|
|
7
7
|
/**
|
|
8
8
|
* Version of this package, used to resolve the prebuilt Shiki engine chunk from a CDN.
|
|
9
9
|
*/
|
|
10
|
-
export const UI_VERSION: "0.
|
|
10
|
+
export const UI_VERSION: "0.67.1";
|
|
11
11
|
/**
|
|
12
12
|
* Available syntax highlighting languages, sorted by display name.
|
|
13
13
|
* @type {{ id: string, name: string, aliases?: string[] }[]}
|
|
@@ -10,7 +10,7 @@ export const SHIKI_VERSION = "4.4.3";
|
|
|
10
10
|
/**
|
|
11
11
|
* Version of this package, used to resolve the prebuilt Shiki engine chunk from a CDN.
|
|
12
12
|
*/
|
|
13
|
-
export const UI_VERSION = "0.
|
|
13
|
+
export const UI_VERSION = "0.67.1";
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* Available syntax highlighting languages, sorted by display name.
|
|
@@ -148,6 +148,9 @@
|
|
|
148
148
|
|
|
149
149
|
await focusEditor(editorStore.editor);
|
|
150
150
|
editorStore.editor.dispatchCommand(TOGGLE_LINK_COMMAND, anchorURL);
|
|
151
|
+
} else if (editorStore.editor) {
|
|
152
|
+
// The dialog leaves the focus alone (see `restoreFocus` below), so bring it back here
|
|
153
|
+
await focusEditor(editorStore.editor);
|
|
151
154
|
}
|
|
152
155
|
|
|
153
156
|
anchorURL = '';
|
|
@@ -202,6 +205,7 @@
|
|
|
202
205
|
bind:value={anchorURL}
|
|
203
206
|
okDisabled={!anchorURL}
|
|
204
207
|
okLabel={dialogMode === 'create' ? _('_sui.insert') : _('_sui.update')}
|
|
208
|
+
restoreFocus={false}
|
|
205
209
|
onClose={(event) => {
|
|
206
210
|
onDialogClose(event);
|
|
207
211
|
}}
|
|
@@ -59,6 +59,14 @@
|
|
|
59
59
|
...restProps
|
|
60
60
|
/* eslint-enable prefer-const */
|
|
61
61
|
} = $props();
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Content for the clone element used to measure the auto-resized height. A trailing line break is
|
|
65
|
+
* added because browsers don’t render the last empty line, which would otherwise make the clone
|
|
66
|
+
* one line shorter than the `<textarea>`.
|
|
67
|
+
* @type {string}
|
|
68
|
+
*/
|
|
69
|
+
const cloneValue = $derived(`${value}\n`);
|
|
62
70
|
</script>
|
|
63
71
|
|
|
64
72
|
<div
|
|
@@ -84,7 +92,7 @@
|
|
|
84
92
|
aria-invalid={invalid}
|
|
85
93
|
class:auto-resize={autoResize}></textarea>
|
|
86
94
|
{#if autoResize}
|
|
87
|
-
<div class="clone" aria-hidden="true" {dir}>{
|
|
95
|
+
<div class="clone" aria-hidden="true" {dir}>{cloneValue}</div>
|
|
88
96
|
{/if}
|
|
89
97
|
{#if useEmojiAutocomplete && !disabled && !readonly}
|
|
90
98
|
<EmojiAutocomplete {element} />
|
|
@@ -160,5 +168,6 @@ textarea[aria-invalid=true] {
|
|
|
160
168
|
textarea,
|
|
161
169
|
.clone {
|
|
162
170
|
white-space: pre-wrap;
|
|
163
|
-
word-break:
|
|
171
|
+
word-break: normal;
|
|
172
|
+
overflow-wrap: anywhere;
|
|
164
173
|
}</style>
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
lightDismiss = false,
|
|
41
41
|
escapeDismiss = true,
|
|
42
42
|
keepContent = false,
|
|
43
|
+
restoreFocus = true,
|
|
43
44
|
children,
|
|
44
45
|
extraContent,
|
|
45
46
|
onOpening,
|
|
@@ -152,26 +153,44 @@
|
|
|
152
153
|
*/
|
|
153
154
|
let lastActiveElement;
|
|
154
155
|
|
|
156
|
+
/**
|
|
157
|
+
* Timer used to defer the focus restoration in {@link moveFocusBack}.
|
|
158
|
+
* @type {number | undefined}
|
|
159
|
+
*/
|
|
160
|
+
let restoreFocusTimer;
|
|
161
|
+
|
|
155
162
|
/**
|
|
156
163
|
* Move the focus back to the element that had it before the modal was opened. This is done
|
|
157
164
|
* manually rather than relying on the browser’s own focus restoration, because the modal is
|
|
158
165
|
* closed while `<body>` is `inert`, which prevents the focus from being restored.
|
|
159
166
|
*/
|
|
160
|
-
const
|
|
161
|
-
const { activeElement } = document;
|
|
167
|
+
const moveFocusBack = () => {
|
|
162
168
|
const element = lastActiveElement;
|
|
163
169
|
|
|
164
170
|
lastActiveElement = undefined;
|
|
165
171
|
|
|
166
|
-
if (!element
|
|
172
|
+
if (!restoreFocus || !element) {
|
|
167
173
|
return;
|
|
168
174
|
}
|
|
169
175
|
|
|
170
|
-
//
|
|
171
|
-
//
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
176
|
+
// Wait for the current task to finish before moving the focus. The modal is typically closed
|
|
177
|
+
// from within an event handler, and the event that triggered it is still being processed:
|
|
178
|
+
// Firefox dispatches `keypress` to whatever holds the focus at that point, so restoring it
|
|
179
|
+
// synchronously would let the Enter key that submitted the modal activate the button that
|
|
180
|
+
// opened it, immediately reopening the modal.
|
|
181
|
+
restoreFocusTimer = window.setTimeout(() => {
|
|
182
|
+
const { activeElement } = document;
|
|
183
|
+
|
|
184
|
+
if (!element.isConnected) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Only take the focus back if it’s still inside the modal, or nowhere because the modal took
|
|
189
|
+
// it down with itself. If it has already moved on, pulling it back would undo what happened.
|
|
190
|
+
if (!activeElement || activeElement === document.body || dialog?.contains(activeElement)) {
|
|
191
|
+
element.focus();
|
|
192
|
+
}
|
|
193
|
+
});
|
|
175
194
|
};
|
|
176
195
|
|
|
177
196
|
/**
|
|
@@ -235,6 +254,9 @@
|
|
|
235
254
|
const gen = generation;
|
|
236
255
|
const { activeElement } = document;
|
|
237
256
|
|
|
257
|
+
// Cancel a pending restoration from a previous close, which would otherwise pull the focus out
|
|
258
|
+
// of the modal that’s being opened right now
|
|
259
|
+
window.clearTimeout(restoreFocusTimer);
|
|
238
260
|
lastActiveElement = activeElement instanceof HTMLElement ? activeElement : undefined;
|
|
239
261
|
|
|
240
262
|
onOpening?.(new CustomEvent('Opening'));
|
|
@@ -291,7 +313,7 @@
|
|
|
291
313
|
document.body.inert = false;
|
|
292
314
|
}
|
|
293
315
|
|
|
294
|
-
|
|
316
|
+
moveFocusBack();
|
|
295
317
|
setActiveClass = false;
|
|
296
318
|
setOpenClass = false;
|
|
297
319
|
|
|
@@ -340,6 +362,7 @@
|
|
|
340
362
|
|
|
341
363
|
// onUnmount
|
|
342
364
|
return () => {
|
|
365
|
+
window.clearTimeout(restoreFocusTimer);
|
|
343
366
|
dialog?.close();
|
|
344
367
|
unmount(placeholder);
|
|
345
368
|
};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Dialog action button labels
|
|
2
|
+
ok: OK
|
|
3
|
+
cancel: Avbryt
|
|
4
|
+
close: Stäng
|
|
5
|
+
|
|
6
|
+
# Button to clear content, e.g. search input or calendar date
|
|
7
|
+
clear: Rensa
|
|
8
|
+
|
|
9
|
+
# Text editor dialog buttons for link/image insertion
|
|
10
|
+
insert: Infoga
|
|
11
|
+
update: Uppdatera
|
|
12
|
+
remove: Ta bort
|
|
13
|
+
|
|
14
|
+
# Combobox dropdown toggle button aria-labels
|
|
15
|
+
collapse: Fäll ihop
|
|
16
|
+
expand: Fäll ut
|
|
17
|
+
|
|
18
|
+
# Infobar/toast dismiss button label
|
|
19
|
+
dismiss: Avfärda
|
|
20
|
+
|
|
21
|
+
# Calendar component
|
|
22
|
+
calendar:
|
|
23
|
+
# View switcher group aria-labels and navigation button aria-labels
|
|
24
|
+
year: År
|
|
25
|
+
previous_decade: Föregående årtionde
|
|
26
|
+
next_decade: Nästa årtionde
|
|
27
|
+
month: Månad
|
|
28
|
+
previous_month: Föregående månad
|
|
29
|
+
next_month: Nästa månad
|
|
30
|
+
# “Today” button label in footer
|
|
31
|
+
today: Idag
|
|
32
|
+
|
|
33
|
+
# Split button component
|
|
34
|
+
split_button:
|
|
35
|
+
# Wrapper aria-label, e.g. “Save Options” when primary button is “Save”
|
|
36
|
+
x_options: 'Alternativ för {$name}'
|
|
37
|
+
# Dropdown toggle aria-label
|
|
38
|
+
more_options: Fler alternativ
|
|
39
|
+
|
|
40
|
+
# Combobox component
|
|
41
|
+
combobox:
|
|
42
|
+
# Placeholder when no option is selected
|
|
43
|
+
select_an_option: Välj ett alternativ…
|
|
44
|
+
# Filter input aria-label
|
|
45
|
+
filter_options: Filtrera alternativ
|
|
46
|
+
# Empty state message when filter has no matches
|
|
47
|
+
no_matching_options: Inga matchande alternativ hittades
|
|
48
|
+
|
|
49
|
+
# Number input component
|
|
50
|
+
number_input:
|
|
51
|
+
# Spin button aria-labels for incrementing/decrementing the number value
|
|
52
|
+
increase: Öka
|
|
53
|
+
decrease: Minska
|
|
54
|
+
|
|
55
|
+
# Password input component
|
|
56
|
+
password_input:
|
|
57
|
+
# Visibility toggle button aria-labels
|
|
58
|
+
show_password: Visa lösenord
|
|
59
|
+
hide_password: Dölj lösenord
|
|
60
|
+
|
|
61
|
+
# Secret input component (API keys, tokens, etc.)
|
|
62
|
+
secret_input:
|
|
63
|
+
# Visibility toggle button aria-labels
|
|
64
|
+
show_secret: Visa hemlighet
|
|
65
|
+
hide_secret: Dölj hemlighet
|
|
66
|
+
|
|
67
|
+
# Select tags component (multi-select)
|
|
68
|
+
select_tags:
|
|
69
|
+
# Listbox aria-label
|
|
70
|
+
selected_options: Valda inställningar
|
|
71
|
+
# Remove button aria-label, e.g. “Remove Option 1”
|
|
72
|
+
remove_x: 'Ta bort {$name}'
|
|
73
|
+
|
|
74
|
+
# Text editor component
|
|
75
|
+
text_editor:
|
|
76
|
+
# Toolbar aria-labels
|
|
77
|
+
text_editor: Textredigerare
|
|
78
|
+
code_editor: Kodredigerare
|
|
79
|
+
# Block style menu button and menu aria-labels
|
|
80
|
+
text_style_options: Textstilinställningar
|
|
81
|
+
show_text_style_options: Visa textstilinställningar
|
|
82
|
+
# Block style menu items
|
|
83
|
+
paragraph: Paragraf
|
|
84
|
+
heading_1: Rubrik 1
|
|
85
|
+
heading_2: Rubrik 2
|
|
86
|
+
heading_3: Rubrik 3
|
|
87
|
+
heading_4: Rubrik 4
|
|
88
|
+
heading_5: Rubrik 5
|
|
89
|
+
heading_6: Rubrik 6
|
|
90
|
+
bulleted_list: Punktlista
|
|
91
|
+
numbered_list: Numrerad lista
|
|
92
|
+
blockquote: Blockcitat
|
|
93
|
+
code_block: Kodblock
|
|
94
|
+
# Inline style button aria-labels
|
|
95
|
+
bold: Fet
|
|
96
|
+
italic: Kursiv
|
|
97
|
+
strikethrough: Genomstruken
|
|
98
|
+
code: Kod
|
|
99
|
+
link: Länk
|
|
100
|
+
# Link dialog title
|
|
101
|
+
insert_link: Infoga länk
|
|
102
|
+
update_link: Uppdatera länk
|
|
103
|
+
# Link dialog input field labels
|
|
104
|
+
text: Text
|
|
105
|
+
url: URL
|
|
106
|
+
# Markdown mode toggle button aria-label
|
|
107
|
+
edit_in_markdown: Redigera som Markdown
|
|
108
|
+
# Error message when rich text conversion fails
|
|
109
|
+
converter_error: Det gick inte att aktivera läget för formaterad text. Använd istället redigeraren för vanlig text.
|
|
110
|
+
# Language selector aria-label
|
|
111
|
+
language: Språk
|
|
112
|
+
# Plain text mode option in language selector
|
|
113
|
+
plain_text: Vanlig text
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# Dialog action button labels
|
|
2
|
+
ok: Đồng ý
|
|
3
|
+
cancel: Hủy
|
|
4
|
+
close: Đóng
|
|
5
|
+
|
|
6
|
+
# Button to clear content, e.g. search input or calendar date
|
|
7
|
+
clear: Xóa
|
|
8
|
+
|
|
9
|
+
# Text editor dialog buttons for link/image insertion
|
|
10
|
+
insert: Chèn
|
|
11
|
+
update: Cập nhật
|
|
12
|
+
remove: Xóa
|
|
13
|
+
|
|
14
|
+
# Combobox dropdown toggle button aria-labels
|
|
15
|
+
collapse: Thu gọn
|
|
16
|
+
expand: Mở rộng
|
|
17
|
+
|
|
18
|
+
# Infobar/toast dismiss button label
|
|
19
|
+
dismiss: Đóng
|
|
20
|
+
|
|
21
|
+
# Emoji suggestion listbox aria-label, shared by the text fields and the text editor
|
|
22
|
+
emoji_suggestions: Gợi ý biểu tượng cảm xúc
|
|
23
|
+
|
|
24
|
+
# Calendar component
|
|
25
|
+
calendar:
|
|
26
|
+
# View switcher group aria-labels and navigation button aria-labels
|
|
27
|
+
year: Năm
|
|
28
|
+
previous_decade: Thập kỷ trước
|
|
29
|
+
next_decade: Thập kỷ sau
|
|
30
|
+
month: Tháng
|
|
31
|
+
previous_month: Tháng trước
|
|
32
|
+
next_month: Tháng sau
|
|
33
|
+
# “Today” button label in footer
|
|
34
|
+
today: Hôm nay
|
|
35
|
+
|
|
36
|
+
# Split button component
|
|
37
|
+
split_button:
|
|
38
|
+
# Wrapper aria-label, e.g. “Save Options” when primary button is “Save”
|
|
39
|
+
x_options: Tùy chọn cho {$name}
|
|
40
|
+
# Dropdown toggle aria-label
|
|
41
|
+
more_options: Tùy chọn khác
|
|
42
|
+
|
|
43
|
+
# Combobox component
|
|
44
|
+
combobox:
|
|
45
|
+
# Placeholder when no option is selected
|
|
46
|
+
select_an_option: Chọn một tùy chọn…
|
|
47
|
+
# Filter input aria-label
|
|
48
|
+
filter_options: Lọc tùy chọn
|
|
49
|
+
# Empty state message when filter has no matches
|
|
50
|
+
no_matching_options: Không tìm thấy tùy chọn phù hợp
|
|
51
|
+
|
|
52
|
+
# Number input component
|
|
53
|
+
number_input:
|
|
54
|
+
# Spin button aria-labels for incrementing/decrementing the number value
|
|
55
|
+
increase: Tăng
|
|
56
|
+
decrease: Giảm
|
|
57
|
+
|
|
58
|
+
# Password input component
|
|
59
|
+
password_input:
|
|
60
|
+
# Visibility toggle button aria-labels
|
|
61
|
+
show_password: Hiện mật khẩu
|
|
62
|
+
hide_password: Ẩn mật khẩu
|
|
63
|
+
|
|
64
|
+
# Secret input component (API keys, tokens, etc.)
|
|
65
|
+
secret_input:
|
|
66
|
+
# Visibility toggle button aria-labels
|
|
67
|
+
show_secret: Hiện mã bí mật
|
|
68
|
+
hide_secret: Ẩn mã bí mật
|
|
69
|
+
|
|
70
|
+
# Select tags component (multi-select)
|
|
71
|
+
select_tags:
|
|
72
|
+
# Listbox aria-label
|
|
73
|
+
selected_options: Các tùy chọn đã chọn
|
|
74
|
+
# Remove button aria-label, e.g. “Remove Option 1”
|
|
75
|
+
remove_x: Xóa {$name}
|
|
76
|
+
|
|
77
|
+
# Text editor component
|
|
78
|
+
text_editor:
|
|
79
|
+
# Toolbar aria-labels
|
|
80
|
+
text_editor: Trình soạn thảo văn bản
|
|
81
|
+
code_editor: Trình soạn thảo mã
|
|
82
|
+
# Block style menu button and menu aria-labels
|
|
83
|
+
text_style_options: Tùy chọn kiểu văn bản
|
|
84
|
+
show_text_style_options: Hiện tùy chọn kiểu văn bản
|
|
85
|
+
# Block style menu items
|
|
86
|
+
paragraph: Đoạn văn
|
|
87
|
+
heading_1: Tiêu đề 1
|
|
88
|
+
heading_2: Tiêu đề 2
|
|
89
|
+
heading_3: Tiêu đề 3
|
|
90
|
+
heading_4: Tiêu đề 4
|
|
91
|
+
heading_5: Tiêu đề 5
|
|
92
|
+
heading_6: Tiêu đề 6
|
|
93
|
+
bulleted_list: Dấu đầu dòng
|
|
94
|
+
numbered_list: Đánh số
|
|
95
|
+
blockquote: Trích dẫn
|
|
96
|
+
code_block: Khối mã
|
|
97
|
+
# Inline style button aria-labels
|
|
98
|
+
bold: In đậm
|
|
99
|
+
italic: In nghiêng
|
|
100
|
+
strikethrough: Gạch ngang
|
|
101
|
+
code: Mã
|
|
102
|
+
link: Liên kết
|
|
103
|
+
# Link dialog title
|
|
104
|
+
insert_link: Chèn liên kết
|
|
105
|
+
update_link: Cập nhật liên kết
|
|
106
|
+
# Link dialog input field labels
|
|
107
|
+
text: Văn bản
|
|
108
|
+
url: URL
|
|
109
|
+
# Markdown mode toggle button aria-label
|
|
110
|
+
edit_in_markdown: Chỉnh sửa bằng Markdown
|
|
111
|
+
# Error message when rich text conversion fails
|
|
112
|
+
converter_error: Không thể bật chế độ văn bản đa định dạng. Vui lòng sử dụng trình soạn thảo văn bản thuần.
|
|
113
|
+
# Language selector aria-label
|
|
114
|
+
language: Ngôn ngữ
|
|
115
|
+
# Plain text mode option in language selector
|
|
116
|
+
plain_text: Văn bản thuần
|
package/dist/typedefs.d.ts
CHANGED
|
@@ -153,6 +153,13 @@ export type ModalProps = {
|
|
|
153
153
|
* open, and unmounted once the closing transition is complete.
|
|
154
154
|
*/
|
|
155
155
|
keepContent?: boolean | undefined;
|
|
156
|
+
/**
|
|
157
|
+
* Whether to move the focus back to the element that had it
|
|
158
|
+
* before the modal was opened. Default: `true`. Disable this if the consumer takes care of the
|
|
159
|
+
* focus itself once the modal is closed, such as when the modal is opened from a rich text editor,
|
|
160
|
+
* where refocusing the element would reset the caret and discard the user’s selection.
|
|
161
|
+
*/
|
|
162
|
+
restoreFocus?: boolean | undefined;
|
|
156
163
|
/**
|
|
157
164
|
* A reference to the `<dialog>` element.
|
|
158
165
|
*/
|
package/dist/typedefs.js
CHANGED
|
@@ -57,6 +57,10 @@
|
|
|
57
57
|
* @property {boolean} [keepContent] Whether to keep the `<dialog>` element and its content in the
|
|
58
58
|
* DOM tree while the modal is not displayed. By default, these are mounted only while the modal is
|
|
59
59
|
* open, and unmounted once the closing transition is complete.
|
|
60
|
+
* @property {boolean} [restoreFocus] Whether to move the focus back to the element that had it
|
|
61
|
+
* before the modal was opened. Default: `true`. Disable this if the consumer takes care of the
|
|
62
|
+
* focus itself once the modal is closed, such as when the modal is opened from a rich text editor,
|
|
63
|
+
* where refocusing the element would reset the caret and discard the user’s selection.
|
|
60
64
|
* @property {HTMLDialogElement} [dialog] A reference to the `<dialog>` element.
|
|
61
65
|
* @property {Snippet} [children] Primary slot content.
|
|
62
66
|
* @property {Snippet} [extraContent] Extra slot content.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sveltia/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.67.1",
|
|
4
4
|
"description": "A collection of Svelte components and utilities for building user interfaces.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -53,27 +53,27 @@
|
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@rollup/plugin-yaml": "^5.0.0",
|
|
55
55
|
"@sveltejs/adapter-auto": "^7.0.1",
|
|
56
|
-
"@sveltejs/kit": "^2.70.
|
|
56
|
+
"@sveltejs/kit": "^2.70.3",
|
|
57
57
|
"@sveltejs/package": "^2.5.8",
|
|
58
58
|
"@sveltejs/vite-plugin-svelte": "^7.3.0",
|
|
59
|
-
"@vitest/coverage-v8": "^4.1.
|
|
59
|
+
"@vitest/coverage-v8": "^4.1.11",
|
|
60
60
|
"cspell": "^10.0.1",
|
|
61
61
|
"eslint": "^9.39.5",
|
|
62
62
|
"eslint-config-airbnb-extended": "^3.2.0",
|
|
63
63
|
"eslint-config-prettier": "^10.1.8",
|
|
64
64
|
"eslint-plugin-import": "^2.32.0",
|
|
65
|
-
"eslint-plugin-jsdoc": "^64.2.
|
|
65
|
+
"eslint-plugin-jsdoc": "^64.2.1",
|
|
66
66
|
"eslint-plugin-package-json": "^1.7.1",
|
|
67
67
|
"eslint-plugin-svelte": "^3.23.0",
|
|
68
68
|
"globals": "^17.11.0",
|
|
69
|
-
"happy-dom": "^20.11.
|
|
70
|
-
"oxlint": "^1.
|
|
69
|
+
"happy-dom": "^20.11.6",
|
|
70
|
+
"oxlint": "^1.79.0",
|
|
71
71
|
"postcss": "^8.5.26",
|
|
72
72
|
"postcss-html": "^2.0.0",
|
|
73
73
|
"prettier": "^3.9.6",
|
|
74
74
|
"prettier-plugin-svelte": "^4.1.1",
|
|
75
|
-
"rolldown": "^1.2.
|
|
76
|
-
"sass": "^1.
|
|
75
|
+
"rolldown": "^1.2.5",
|
|
76
|
+
"sass": "^1.103.0",
|
|
77
77
|
"shiki": "^4.4.3",
|
|
78
78
|
"stylelint": "^17.14.1",
|
|
79
79
|
"stylelint-config-recommended-scss": "^17.0.1",
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
"svelte-preprocess": "^6.0.5",
|
|
84
84
|
"tslib": "^2.8.1",
|
|
85
85
|
"vite": "^8.2.1",
|
|
86
|
-
"vitest": "^4.1.
|
|
86
|
+
"vitest": "^4.1.11"
|
|
87
87
|
},
|
|
88
88
|
"peerDependencies": {
|
|
89
89
|
"svelte": "^5.0.0"
|