@dep-dio/dio-designsystem 0.4.0 → 0.6.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.
- package/dist/components/Divider/Divider.d.ts +2 -0
- package/dist/components/Dropdown/Dropdown.d.ts +1 -1
- package/dist/components/FileUpload/FileUpload.d.ts +16 -0
- package/dist/react.d.ts +3 -1
- package/dist/react.js +3503 -2703
- package/dist/react.js.map +4 -4
- package/dist/styles/main.css +31 -4
- package/dist/theme-colors.d.ts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/web-components/ToTopOfPage/DioToTopOfPage.d.ts +2 -0
- package/dist/web.js +112 -15
- package/dist/web.js.map +2 -2
- package/package.json +14 -14
package/dist/styles/main.css
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
@charset "UTF-8";
|
|
2
2
|
@import "@digdir/designsystemet-css/index.css";
|
|
3
3
|
/*
|
|
4
|
-
build: v1.
|
|
5
|
-
design-tokens: v1.
|
|
4
|
+
build: v1.21.1
|
|
5
|
+
design-tokens: v1.21.1
|
|
6
6
|
*/
|
|
7
7
|
@layer ds.theme.size-mode {
|
|
8
8
|
:root {
|
|
@@ -1553,6 +1553,10 @@ design-tokens: v1.18.0
|
|
|
1553
1553
|
flex-direction: column;
|
|
1554
1554
|
}
|
|
1555
1555
|
|
|
1556
|
+
.dio-divider {
|
|
1557
|
+
margin-block: var(--ds-size-6);
|
|
1558
|
+
}
|
|
1559
|
+
|
|
1556
1560
|
.dio-feedback-banner__close-button {
|
|
1557
1561
|
position: absolute;
|
|
1558
1562
|
right: 0;
|
|
@@ -1730,10 +1734,33 @@ design-tokens: v1.18.0
|
|
|
1730
1734
|
}
|
|
1731
1735
|
|
|
1732
1736
|
.dio-to-top-of-page {
|
|
1733
|
-
|
|
1737
|
+
display: none;
|
|
1738
|
+
position: sticky;
|
|
1739
|
+
right: 0;
|
|
1740
|
+
bottom: 0;
|
|
1741
|
+
left: 0;
|
|
1742
|
+
z-index: 100;
|
|
1743
|
+
opacity: 0;
|
|
1744
|
+
transform: translateY(100%);
|
|
1745
|
+
pointer-events: none;
|
|
1746
|
+
transition: display 0.25s allow-discrete, opacity 0.25s ease, transform 0.25s ease;
|
|
1734
1747
|
}
|
|
1735
|
-
.dio-to-top-of-
|
|
1748
|
+
.dio-to-top-of-page--visible {
|
|
1749
|
+
display: block;
|
|
1750
|
+
opacity: 1;
|
|
1751
|
+
transform: translateY(0);
|
|
1752
|
+
pointer-events: auto;
|
|
1753
|
+
}
|
|
1754
|
+
@starting-style {
|
|
1755
|
+
.dio-to-top-of-page--visible {
|
|
1756
|
+
opacity: 0;
|
|
1757
|
+
transform: translateY(100%);
|
|
1758
|
+
}
|
|
1759
|
+
}
|
|
1760
|
+
.dio-to-top-of-page [data-to-top-of-page-link] {
|
|
1736
1761
|
width: 100%;
|
|
1762
|
+
margin-bottom: var(--ds-size-2, "8px");
|
|
1763
|
+
text-align: center;
|
|
1737
1764
|
}
|
|
1738
1765
|
|
|
1739
1766
|
.dio-topic-link-list {
|
package/dist/theme-colors.d.ts
CHANGED
|
@@ -2,5 +2,5 @@ import type { Color as ThemeColor, SeverityColors } from "@digdir/designsystemet
|
|
|
2
2
|
export type { ThemeColor, SeverityColors };
|
|
3
3
|
export type Color = ThemeColor | Exclude<SeverityColors, ThemeColor>;
|
|
4
4
|
export declare const themeColors: ThemeColor[];
|
|
5
|
-
export declare const severityColors:
|
|
5
|
+
export declare const severityColors: string[];
|
|
6
6
|
export declare const colors: Color[];
|
package/dist/types.d.ts
CHANGED
package/dist/web.js
CHANGED
|
@@ -171,9 +171,15 @@ var DioNewsAlertSubscribe = class extends HTMLElement {
|
|
|
171
171
|
};
|
|
172
172
|
|
|
173
173
|
// src/web-components/SearchAutocomplete/DioSearchAutocomplete.ts
|
|
174
|
+
function isSuggestItem(value) {
|
|
175
|
+
if (typeof value !== "object" || value === null) return false;
|
|
176
|
+
const record = value;
|
|
177
|
+
return typeof record.Name === "string" && typeof record.Url === "string" && typeof record.FormattedMetadata === "string";
|
|
178
|
+
}
|
|
174
179
|
var DioSearchAutocomplete = class extends HTMLElement {
|
|
175
180
|
#abort;
|
|
176
181
|
#debounce;
|
|
182
|
+
#docClickHandler;
|
|
177
183
|
connectedCallback() {
|
|
178
184
|
const input = this.querySelector("[data-search-input]");
|
|
179
185
|
const list = this.querySelector("[data-search-suggest-list]");
|
|
@@ -185,7 +191,7 @@ var DioSearchAutocomplete = class extends HTMLElement {
|
|
|
185
191
|
if (mockAttr) {
|
|
186
192
|
try {
|
|
187
193
|
const parsed = JSON.parse(mockAttr);
|
|
188
|
-
if (Array.isArray(parsed)) mocks = parsed;
|
|
194
|
+
if (Array.isArray(parsed)) mocks = parsed.filter(isSuggestItem);
|
|
189
195
|
} catch {
|
|
190
196
|
mocks = [];
|
|
191
197
|
}
|
|
@@ -236,7 +242,7 @@ var DioSearchAutocomplete = class extends HTMLElement {
|
|
|
236
242
|
signal: this.#abort.signal
|
|
237
243
|
});
|
|
238
244
|
const data = await res.json();
|
|
239
|
-
render(Array.isArray(data) ? data : []);
|
|
245
|
+
render(Array.isArray(data) ? data.filter(isSuggestItem) : []);
|
|
240
246
|
} catch {
|
|
241
247
|
if (!this.#abort.signal.aborted) reset();
|
|
242
248
|
}
|
|
@@ -248,17 +254,15 @@ var DioSearchAutocomplete = class extends HTMLElement {
|
|
|
248
254
|
input.addEventListener("keydown", (e) => {
|
|
249
255
|
if (e.key === "Escape") reset();
|
|
250
256
|
});
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
if (!this.contains(e.target)) reset();
|
|
257
|
+
if (this.#docClickHandler) document.removeEventListener("click", this.#docClickHandler);
|
|
258
|
+
this.#docClickHandler = (e) => {
|
|
259
|
+
if (e.target instanceof Node && !this.contains(e.target)) reset();
|
|
255
260
|
};
|
|
256
|
-
document.addEventListener("click",
|
|
261
|
+
document.addEventListener("click", this.#docClickHandler);
|
|
257
262
|
}
|
|
258
263
|
disconnectedCallback() {
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
self.__dioDocClick = void 0;
|
|
264
|
+
if (this.#docClickHandler) document.removeEventListener("click", this.#docClickHandler);
|
|
265
|
+
this.#docClickHandler = void 0;
|
|
262
266
|
clearTimeout(this.#debounce);
|
|
263
267
|
this.#abort?.abort();
|
|
264
268
|
}
|
|
@@ -280,7 +284,7 @@ var DioTimeline = class extends HTMLElement {
|
|
|
280
284
|
this.querySelectorAll("[data-timeline-event-list]").forEach(
|
|
281
285
|
(eventList) => {
|
|
282
286
|
const fragment = document.createDocumentFragment();
|
|
283
|
-
[...eventList.children].
|
|
287
|
+
[...eventList.children].toReversed().forEach((child) => fragment.appendChild(child));
|
|
284
288
|
eventList.appendChild(fragment);
|
|
285
289
|
}
|
|
286
290
|
);
|
|
@@ -300,13 +304,106 @@ var DioTimeline = class extends HTMLElement {
|
|
|
300
304
|
};
|
|
301
305
|
|
|
302
306
|
// src/web-components/ToTopOfPage/DioToTopOfPage.ts
|
|
307
|
+
var DEFAULT_SCREENS_TO_SHOW_BUTTON = 4;
|
|
308
|
+
var isDocumentScrollRoot = (root) => root === document.documentElement || root === document.body || root === document.scrollingElement;
|
|
309
|
+
var isScrollable = (element) => {
|
|
310
|
+
const { overflowY } = getComputedStyle(element);
|
|
311
|
+
if (overflowY !== "auto" && overflowY !== "scroll" && overflowY !== "overlay") return false;
|
|
312
|
+
return element.scrollHeight > element.clientHeight;
|
|
313
|
+
};
|
|
303
314
|
var DioToTopOfPage = class extends HTMLElement {
|
|
315
|
+
#abort = null;
|
|
316
|
+
#resizeTimer;
|
|
317
|
+
#resizeObserver = null;
|
|
318
|
+
#scrollRoot = null;
|
|
304
319
|
connectedCallback() {
|
|
305
|
-
const link = this.querySelector("[data-to-top-of-page]");
|
|
306
|
-
|
|
307
|
-
|
|
320
|
+
const link = this.querySelector("[data-to-top-of-page-link]");
|
|
321
|
+
if (!link) return;
|
|
322
|
+
this.#abort?.abort();
|
|
323
|
+
const ac = new AbortController();
|
|
324
|
+
this.#abort = ac;
|
|
325
|
+
const opts = { signal: ac.signal };
|
|
326
|
+
link.addEventListener(
|
|
327
|
+
"click",
|
|
328
|
+
(event) => {
|
|
329
|
+
event.preventDefault();
|
|
330
|
+
this.#scrollToTop();
|
|
331
|
+
},
|
|
332
|
+
opts
|
|
333
|
+
);
|
|
334
|
+
const update = () => this.#update();
|
|
335
|
+
const init = () => {
|
|
336
|
+
this.#scrollRoot = this.#findScrollRoot();
|
|
337
|
+
const scrollTarget = isDocumentScrollRoot(this.#scrollRoot) ? window : this.#scrollRoot;
|
|
338
|
+
scrollTarget.addEventListener("scroll", update, opts);
|
|
339
|
+
if (typeof ResizeObserver !== "undefined" && !isDocumentScrollRoot(this.#scrollRoot)) {
|
|
340
|
+
this.#resizeObserver = new ResizeObserver(update);
|
|
341
|
+
this.#resizeObserver.observe(this.#scrollRoot);
|
|
342
|
+
}
|
|
343
|
+
update();
|
|
344
|
+
};
|
|
345
|
+
window.addEventListener("resize", () => this.#debouncedUpdate(update), opts);
|
|
346
|
+
if (document.readyState === "loading") {
|
|
347
|
+
document.addEventListener("DOMContentLoaded", init, { ...opts, once: true });
|
|
348
|
+
} else {
|
|
349
|
+
requestAnimationFrame(init);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
disconnectedCallback() {
|
|
353
|
+
this.#abort?.abort();
|
|
354
|
+
this.#abort = null;
|
|
355
|
+
this.#resizeObserver?.disconnect();
|
|
356
|
+
this.#resizeObserver = null;
|
|
357
|
+
clearTimeout(this.#resizeTimer);
|
|
358
|
+
this.#scrollRoot = null;
|
|
359
|
+
}
|
|
360
|
+
#findScrollRoot() {
|
|
361
|
+
let parent = this.parentElement;
|
|
362
|
+
while (parent) {
|
|
363
|
+
if (isScrollable(parent)) return parent;
|
|
364
|
+
parent = parent.parentElement;
|
|
365
|
+
}
|
|
366
|
+
return document.scrollingElement ?? document.documentElement;
|
|
367
|
+
}
|
|
368
|
+
#getScrollMetrics() {
|
|
369
|
+
const root = this.#scrollRoot ?? document.documentElement;
|
|
370
|
+
if (isDocumentScrollRoot(root)) {
|
|
371
|
+
return {
|
|
372
|
+
scrollTop: window.pageYOffset || document.documentElement.scrollTop,
|
|
373
|
+
viewportHeight: window.innerHeight
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
return { scrollTop: root.scrollTop, viewportHeight: root.clientHeight };
|
|
377
|
+
}
|
|
378
|
+
#scrollToTop() {
|
|
379
|
+
const root = this.#scrollRoot ?? document.documentElement;
|
|
380
|
+
if (isDocumentScrollRoot(root)) {
|
|
308
381
|
window.scrollTo({ top: 0, behavior: "smooth" });
|
|
309
|
-
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
root.scrollTo({ top: 0, behavior: "smooth" });
|
|
385
|
+
}
|
|
386
|
+
#debouncedUpdate(update) {
|
|
387
|
+
clearTimeout(this.#resizeTimer);
|
|
388
|
+
this.#resizeTimer = setTimeout(update, 250);
|
|
389
|
+
}
|
|
390
|
+
#update() {
|
|
391
|
+
const screens = this.#getScreensToShow();
|
|
392
|
+
if (screens === 0) {
|
|
393
|
+
this.classList.add("dio-to-top-of-page--visible");
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
const { scrollTop, viewportHeight } = this.#getScrollMetrics();
|
|
397
|
+
if (scrollTop > viewportHeight * screens) {
|
|
398
|
+
this.classList.add("dio-to-top-of-page--visible");
|
|
399
|
+
} else {
|
|
400
|
+
this.classList.remove("dio-to-top-of-page--visible");
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
#getScreensToShow() {
|
|
404
|
+
const value = Number(this.dataset.toTopScreens);
|
|
405
|
+
if (!Number.isFinite(value) || value < 0) return DEFAULT_SCREENS_TO_SHOW_BUTTON;
|
|
406
|
+
return value;
|
|
310
407
|
}
|
|
311
408
|
};
|
|
312
409
|
|
package/dist/web.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/web-components/Carousel/DioCarousel.ts", "../src/web-components/FeedbackBanner/DioFeedbackBanner.ts", "../src/web-components/NewsAlertSubscribe/DioNewsAlertSubscribe.ts", "../src/web-components/SearchAutocomplete/DioSearchAutocomplete.ts", "../src/web-components/Timeline/DioTimeline.ts", "../src/web-components/ToTopOfPage/DioToTopOfPage.ts", "../src/web.ts"],
|
|
4
|
-
"sourcesContent": ["export class DioCarousel extends HTMLElement {\n private current = 0\n\n connectedCallback() {\n const items = [...this.querySelectorAll<HTMLElement>(\"[data-carousel-item]\")]\n const prev = this.querySelector<HTMLButtonElement>(\"[data-carousel-prev]\")\n const next = this.querySelector<HTMLButtonElement>(\"[data-carousel-next]\")\n const info = this.querySelector<HTMLElement>(\"[data-carousel-info-content]\")\n\n if (!items.length) return\n\n const show = (index: number) => {\n this.current = (index + items.length) % items.length\n items.forEach((item, i) => {\n item.hidden = i !== this.current\n })\n if (info) {\n const active = items[this.current]\n const title = active.querySelector(\".dio-carousel__title\")?.textContent ?? \"\"\n info.textContent = title\n }\n prev?.toggleAttribute(\"disabled\", items.length <= 1)\n next?.toggleAttribute(\"disabled\", items.length <= 1)\n }\n\n prev?.addEventListener(\"click\", () => show(this.current - 1))\n next?.addEventListener(\"click\", () => show(this.current + 1))\n show(0)\n }\n}\n", "export class DioFeedbackBanner extends HTMLElement {\n connectedCallback() {\n const close = this.querySelector<HTMLButtonElement>(\"[data-hide-banner]\")\n close?.addEventListener(\"click\", () => {\n this.hidden = true\n })\n }\n}\n", "const emailRegex = /^(?!.*(?:''|\\.\\.))[A-Z0-9._!#$%&'*+\\-/=?^`{|}~]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i\n\nconst validateEmail = (value: string): boolean => emailRegex.test(value)\n\ntype NewsAlertUi = {\n initialView: HTMLElement | null\n actionView: HTMLElement\n openButton: HTMLElement\n cancelButton: HTMLElement | null\n okButton: HTMLElement | null\n submitButton: HTMLElement\n emailInput: HTMLInputElement\n errorMessage: HTMLElement | null\n feedbackView: HTMLElement\n responseMessage: HTMLElement\n}\n\nexport class DioNewsAlertSubscribe extends HTMLElement {\n #abort: AbortController | null = null\n\n connectedCallback() {\n if (document.readyState !== \"loading\") {\n this.init()\n return\n }\n document.addEventListener(\"DOMContentLoaded\", () => this.init(), { once: true })\n }\n\n init(): void {\n if (this.hasAttribute(\"data-initialized\")) return\n\n this.#abort?.abort()\n const ac = new AbortController()\n this.#abort = ac\n const opts: AddEventListenerOptions = { signal: ac.signal }\n\n const ui = this.#getUi()\n const subscribeUrl = this.#getSubscribeUrl()\n\n if (!ui || !subscribeUrl) return\n\n const setErrorVisible = (visible: boolean): void => {\n ui.errorMessage?.classList.toggle(\"hidden\", !visible)\n if (visible) {\n ui.errorMessage?.setAttribute(\"data-field\", \"validation\")\n } else {\n ui.errorMessage?.removeAttribute(\"data-field\")\n }\n }\n\n const showInitial = (): void => {\n ui.initialView?.classList.remove(\"hidden\")\n ui.actionView.classList.add(\"hidden\")\n ui.feedbackView.classList.add(\"hidden\")\n ui.emailInput.value = \"\"\n ui.responseMessage.textContent = \"\"\n setErrorVisible(false)\n }\n\n const showAction = (): void => {\n ui.initialView?.classList.add(\"hidden\")\n ui.actionView.classList.remove(\"hidden\")\n ui.feedbackView.classList.add(\"hidden\")\n setErrorVisible(false)\n }\n\n const showFeedback = (message: string): void => {\n ui.actionView.classList.add(\"hidden\")\n ui.responseMessage.textContent = message\n ui.feedbackView.classList.remove(\"hidden\")\n }\n\n ui.openButton.addEventListener(\n \"click\",\n () => {\n showAction()\n ui.emailInput.focus()\n },\n opts,\n )\n\n ui.cancelButton?.addEventListener(\n \"click\",\n () => {\n showInitial()\n ui.openButton.focus()\n },\n opts,\n )\n\n ui.okButton?.addEventListener(\"click\", showInitial, opts)\n\n ui.emailInput.addEventListener(\n \"keydown\",\n (e: KeyboardEvent) => {\n setErrorVisible(false)\n if (e.key === \"Enter\") {\n e.preventDefault()\n ui.submitButton.click()\n }\n },\n opts,\n )\n\n ui.submitButton.addEventListener(\n \"click\",\n async () => {\n if (!validateEmail(ui.emailInput.value)) {\n setErrorVisible(true)\n return\n }\n const url = `${subscribeUrl}?email=${encodeURIComponent(ui.emailInput.value)}`\n try {\n const res = await fetch(url, { method: \"POST\", signal: ac.signal })\n const text = await res.text()\n showFeedback(res.ok ? text : \"\")\n } catch {\n if (!ac.signal.aborted) showFeedback(\"\")\n }\n },\n opts,\n )\n\n this.setAttribute(\"data-initialized\", \"true\")\n }\n\n disconnectedCallback(): void {\n this.#abort?.abort()\n this.#abort = null\n }\n\n #getSubscribeUrl(): string | null {\n const endpoint = this.dataset.newsAlertEndpoint\n const subscribeId = this.dataset.newsAlertSubscribeId\n if (!endpoint || !subscribeId) return null\n return `${endpoint.replace(/\\/$/, \"\")}/${encodeURIComponent(subscribeId)}`\n }\n\n #getUi(): NewsAlertUi | null {\n const actionView = this.querySelector<HTMLElement>(\"[data-action]\")\n const openButton = this.querySelector<HTMLElement>(\"[data-open]\")\n const submitButton = this.querySelector<HTMLButtonElement>(\"[data-submit]\")\n const emailInput = this.querySelector<HTMLInputElement>(\"[data-email]\")\n const feedbackView = this.querySelector<HTMLElement>(\"[data-feedback]\")\n const responseMessage = feedbackView?.querySelector<HTMLElement>(\"[data-response]\")\n\n if (\n !actionView ||\n !openButton ||\n !submitButton ||\n !emailInput ||\n !feedbackView ||\n !responseMessage\n ) {\n return null\n }\n\n return {\n initialView: this.querySelector<HTMLElement>(\"[data-initial]\"),\n actionView,\n openButton,\n cancelButton: this.querySelector<HTMLElement>(\"[data-cancel]\"),\n okButton: this.querySelector<HTMLElement>(\"[data-ok]\"),\n submitButton,\n emailInput,\n errorMessage: this.querySelector<HTMLElement>(\"[data-error]\"),\n feedbackView,\n responseMessage,\n }\n }\n}\n", "type SuggestItem = {\n Name: string\n Url: string\n FormattedMetadata: string\n}\n\nexport class DioSearchAutocomplete extends HTMLElement {\n #abort?: AbortController\n #debounce?: ReturnType<typeof setTimeout>\n\n connectedCallback() {\n const input = this.querySelector<HTMLInputElement>(\"[data-search-input]\")\n const list = this.querySelector<HTMLUListElement>(\"[data-search-suggest-list]\")\n const panel = this.querySelector<HTMLElement>(\"[data-search-suggest]\")\n if (!input || !list || !panel) return\n\n const source = this.getAttribute(\"data-autocomplete-source\") ?? \"\"\n const mockAttr = this.getAttribute(\"data-mock-suggestions\")\n let mocks: SuggestItem[] = []\n if (mockAttr) {\n try {\n const parsed = JSON.parse(mockAttr) as unknown\n if (Array.isArray(parsed)) mocks = parsed as SuggestItem[]\n } catch {\n mocks = []\n }\n }\n let currentTerm = \"\"\n\n const reset = () => {\n list.innerHTML = \"\"\n panel.hidden = true\n input.setAttribute(\"aria-expanded\", \"false\")\n }\n\n const render = (items: SuggestItem[]) => {\n list.replaceChildren(\n ...items.map((item) => {\n const li = document.createElement(\"li\")\n li.className = \"dio-search-autocomplete__suggest-item\"\n\n const a = document.createElement(\"a\")\n const href = item.Url.trim()\n a.setAttribute(\"href\", /^(?:javascript|data):/i.test(href) ? \"#\" : href)\n\n const title = document.createElement(\"span\")\n title.className = \"dio-search-autocomplete__suggest-title\"\n title.textContent = item.Name\n\n const meta = document.createElement(\"span\")\n meta.className = \"dio-search-autocomplete__suggest-meta\"\n meta.textContent = item.FormattedMetadata\n\n a.append(title, meta)\n li.append(a)\n return li\n }),\n )\n panel.hidden = items.length === 0\n input.setAttribute(\"aria-expanded\", String(items.length > 0))\n }\n\n const search = async (term: string) => {\n if (term.length < 2) {\n reset()\n return\n }\n if (term === currentTerm) return\n currentTerm = term\n\n if (mocks.length) {\n render(mocks.filter((m) => m.Name.toLowerCase().includes(term.toLowerCase())))\n return\n }\n\n this.#abort?.abort()\n this.#abort = new AbortController()\n try {\n const res = await fetch(`${source}${encodeURIComponent(term)}`, {\n signal: this.#abort.signal,\n })\n const data = (await res.json()) as SuggestItem[]\n render(Array.isArray(data) ? data : [])\n } catch {\n if (!this.#abort.signal.aborted) reset()\n }\n }\n\n input.addEventListener(\"input\", () => {\n clearTimeout(this.#debounce)\n this.#debounce = setTimeout(() => search(input.value), 350)\n })\n\n input.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Escape\") reset()\n })\n\n const self = this as unknown as { __dioDocClick?: (e: MouseEvent) => void }\n if (self.__dioDocClick) document.removeEventListener(\"click\", self.__dioDocClick)\n self.__dioDocClick = (e) => {\n if (!this.contains(e.target as Node)) reset()\n }\n document.addEventListener(\"click\", self.__dioDocClick)\n }\n\n disconnectedCallback() {\n const self = this as unknown as { __dioDocClick?: (e: MouseEvent) => void }\n if (self.__dioDocClick) document.removeEventListener(\"click\", self.__dioDocClick)\n self.__dioDocClick = undefined\n clearTimeout(this.#debounce)\n this.#abort?.abort()\n }\n}\n", "export class DioTimeline extends HTMLElement {\n connectedCallback() {\n const reverseBtn = this.querySelector<HTMLButtonElement>(\"[data-toggle-reverse-timeline]\")\n const expandBtn = this.querySelector<HTMLButtonElement>(\"[data-toggle-all-years]\")\n\n reverseBtn?.addEventListener(\"click\", () => {\n const reversed = reverseBtn.getAttribute(\"data-reversed\") === \"true\"\n const nextReversed = !reversed\n reverseBtn.setAttribute(\"data-reversed\", String(nextReversed))\n const label = reverseBtn.querySelector(\"span\")\n if (label) {\n label.textContent = nextReversed\n ? (reverseBtn.getAttribute(\"data-reversed-text\") ?? \"\")\n : (reverseBtn.getAttribute(\"data-initial-text\") ?? \"\")\n }\n this.querySelectorAll<HTMLElement>(\"[data-timeline-event-list]\").forEach(\n (eventList) => {\n const fragment = document.createDocumentFragment()\n ;[...eventList.children]\n .reverse()\n .forEach((child) => fragment.appendChild(child))\n eventList.appendChild(fragment)\n },\n )\n })\n\n expandBtn?.addEventListener(\"click\", () => {\n const expanded = expandBtn.getAttribute(\"data-expanded\") === \"true\"\n expandBtn.setAttribute(\"data-expanded\", String(!expanded))\n const label = expandBtn.querySelector(\"span\")\n if (label) {\n label.textContent = expanded\n ? (expandBtn.getAttribute(\"data-initial-text\") ?? \"\")\n : (expandBtn.getAttribute(\"data-active-text\") ?? \"\")\n }\n this.querySelectorAll<HTMLDetailsElement>(\"[data-timeline-event]\").forEach((event) => {\n event.open = !expanded\n })\n })\n }\n}\n", "export class DioToTopOfPage extends HTMLElement {\n connectedCallback() {\n const link = this.querySelector<HTMLAnchorElement>(\"[data-to-top-of-page]\")\n link?.addEventListener(\"click\", (event) => {\n event.preventDefault()\n window.scrollTo({ top: 0, behavior: \"smooth\" })\n })\n }\n}\n", "import { DioCarousel } from \"./web-components/Carousel/DioCarousel\"\nimport { DioFeedbackBanner } from \"./web-components/FeedbackBanner/DioFeedbackBanner\"\nimport { DioNewsAlertSubscribe } from \"./web-components/NewsAlertSubscribe/DioNewsAlertSubscribe\"\nimport { DioSearchAutocomplete } from \"./web-components/SearchAutocomplete/DioSearchAutocomplete\"\nimport { DioTimeline } from \"./web-components/Timeline/DioTimeline\"\nimport { DioToTopOfPage } from \"./web-components/ToTopOfPage/DioToTopOfPage\"\nimport \"@digdir/designsystemet-web\"\n\nexport {\n DioCarousel,\n DioFeedbackBanner,\n DioNewsAlertSubscribe,\n DioSearchAutocomplete,\n DioTimeline,\n DioToTopOfPage,\n}\n\nconst define = (name: string, ctor: CustomElementConstructor) => {\n if (!customElements.get(name)) customElements.define(name, ctor)\n}\n\ndefine(\"dio-carousel\", DioCarousel)\ndefine(\"dio-feedback-banner\", DioFeedbackBanner)\ndefine(\"dio-news-alert-subscribe\", DioNewsAlertSubscribe)\ndefine(\"dio-search-autocomplete\", DioSearchAutocomplete)\ndefine(\"dio-timeline\", DioTimeline)\ndefine(\"dio-to-top-of-page\", DioToTopOfPage)\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["export class DioCarousel extends HTMLElement {\n private current = 0\n\n connectedCallback() {\n const items = [...this.querySelectorAll<HTMLElement>(\"[data-carousel-item]\")]\n const prev = this.querySelector<HTMLButtonElement>(\"[data-carousel-prev]\")\n const next = this.querySelector<HTMLButtonElement>(\"[data-carousel-next]\")\n const info = this.querySelector<HTMLElement>(\"[data-carousel-info-content]\")\n\n if (!items.length) return\n\n const show = (index: number) => {\n this.current = (index + items.length) % items.length\n items.forEach((item, i) => {\n item.hidden = i !== this.current\n })\n if (info) {\n const active = items[this.current]\n const title = active.querySelector(\".dio-carousel__title\")?.textContent ?? \"\"\n info.textContent = title\n }\n prev?.toggleAttribute(\"disabled\", items.length <= 1)\n next?.toggleAttribute(\"disabled\", items.length <= 1)\n }\n\n prev?.addEventListener(\"click\", () => show(this.current - 1))\n next?.addEventListener(\"click\", () => show(this.current + 1))\n show(0)\n }\n}\n", "export class DioFeedbackBanner extends HTMLElement {\n connectedCallback() {\n const close = this.querySelector<HTMLButtonElement>(\"[data-hide-banner]\")\n close?.addEventListener(\"click\", () => {\n this.hidden = true\n })\n }\n}\n", "const emailRegex = /^(?!.*(?:''|\\.\\.))[A-Z0-9._!#$%&'*+\\-/=?^`{|}~]+@[A-Z0-9.-]+\\.[A-Z]{2,}$/i\n\nconst validateEmail = (value: string): boolean => emailRegex.test(value)\n\ntype NewsAlertUi = {\n initialView: HTMLElement | null\n actionView: HTMLElement\n openButton: HTMLElement\n cancelButton: HTMLElement | null\n okButton: HTMLElement | null\n submitButton: HTMLElement\n emailInput: HTMLInputElement\n errorMessage: HTMLElement | null\n feedbackView: HTMLElement\n responseMessage: HTMLElement\n}\n\nexport class DioNewsAlertSubscribe extends HTMLElement {\n #abort: AbortController | null = null\n\n connectedCallback() {\n if (document.readyState !== \"loading\") {\n this.init()\n return\n }\n document.addEventListener(\"DOMContentLoaded\", () => this.init(), { once: true })\n }\n\n init(): void {\n if (this.hasAttribute(\"data-initialized\")) return\n\n this.#abort?.abort()\n const ac = new AbortController()\n this.#abort = ac\n const opts: AddEventListenerOptions = { signal: ac.signal }\n\n const ui = this.#getUi()\n const subscribeUrl = this.#getSubscribeUrl()\n\n if (!ui || !subscribeUrl) return\n\n const setErrorVisible = (visible: boolean): void => {\n ui.errorMessage?.classList.toggle(\"hidden\", !visible)\n if (visible) {\n ui.errorMessage?.setAttribute(\"data-field\", \"validation\")\n } else {\n ui.errorMessage?.removeAttribute(\"data-field\")\n }\n }\n\n const showInitial = (): void => {\n ui.initialView?.classList.remove(\"hidden\")\n ui.actionView.classList.add(\"hidden\")\n ui.feedbackView.classList.add(\"hidden\")\n ui.emailInput.value = \"\"\n ui.responseMessage.textContent = \"\"\n setErrorVisible(false)\n }\n\n const showAction = (): void => {\n ui.initialView?.classList.add(\"hidden\")\n ui.actionView.classList.remove(\"hidden\")\n ui.feedbackView.classList.add(\"hidden\")\n setErrorVisible(false)\n }\n\n const showFeedback = (message: string): void => {\n ui.actionView.classList.add(\"hidden\")\n ui.responseMessage.textContent = message\n ui.feedbackView.classList.remove(\"hidden\")\n }\n\n ui.openButton.addEventListener(\n \"click\",\n () => {\n showAction()\n ui.emailInput.focus()\n },\n opts,\n )\n\n ui.cancelButton?.addEventListener(\n \"click\",\n () => {\n showInitial()\n ui.openButton.focus()\n },\n opts,\n )\n\n ui.okButton?.addEventListener(\"click\", showInitial, opts)\n\n ui.emailInput.addEventListener(\n \"keydown\",\n (e: KeyboardEvent) => {\n setErrorVisible(false)\n if (e.key === \"Enter\") {\n e.preventDefault()\n ui.submitButton.click()\n }\n },\n opts,\n )\n\n ui.submitButton.addEventListener(\n \"click\",\n async () => {\n if (!validateEmail(ui.emailInput.value)) {\n setErrorVisible(true)\n return\n }\n const url = `${subscribeUrl}?email=${encodeURIComponent(ui.emailInput.value)}`\n try {\n const res = await fetch(url, { method: \"POST\", signal: ac.signal })\n const text = await res.text()\n showFeedback(res.ok ? text : \"\")\n } catch {\n if (!ac.signal.aborted) showFeedback(\"\")\n }\n },\n opts,\n )\n\n this.setAttribute(\"data-initialized\", \"true\")\n }\n\n disconnectedCallback(): void {\n this.#abort?.abort()\n this.#abort = null\n }\n\n #getSubscribeUrl(): string | null {\n const endpoint = this.dataset.newsAlertEndpoint\n const subscribeId = this.dataset.newsAlertSubscribeId\n if (!endpoint || !subscribeId) return null\n return `${endpoint.replace(/\\/$/, \"\")}/${encodeURIComponent(subscribeId)}`\n }\n\n #getUi(): NewsAlertUi | null {\n const actionView = this.querySelector<HTMLElement>(\"[data-action]\")\n const openButton = this.querySelector<HTMLElement>(\"[data-open]\")\n const submitButton = this.querySelector<HTMLButtonElement>(\"[data-submit]\")\n const emailInput = this.querySelector<HTMLInputElement>(\"[data-email]\")\n const feedbackView = this.querySelector<HTMLElement>(\"[data-feedback]\")\n const responseMessage = feedbackView?.querySelector<HTMLElement>(\"[data-response]\")\n\n if (\n !actionView ||\n !openButton ||\n !submitButton ||\n !emailInput ||\n !feedbackView ||\n !responseMessage\n ) {\n return null\n }\n\n return {\n initialView: this.querySelector<HTMLElement>(\"[data-initial]\"),\n actionView,\n openButton,\n cancelButton: this.querySelector<HTMLElement>(\"[data-cancel]\"),\n okButton: this.querySelector<HTMLElement>(\"[data-ok]\"),\n submitButton,\n emailInput,\n errorMessage: this.querySelector<HTMLElement>(\"[data-error]\"),\n feedbackView,\n responseMessage,\n }\n }\n}\n", "type SuggestItem = {\n Name: string\n Url: string\n FormattedMetadata: string\n}\n\nfunction isSuggestItem(value: unknown): value is SuggestItem {\n if (typeof value !== \"object\" || value === null) return false\n\n // oxlint-disable-next-line no-unsafe-type-assertion -- validated field-by-field below; this is the standard unknown-to-shape guard idiom\n const record = value as Record<string, unknown>\n return (\n typeof record.Name === \"string\" &&\n typeof record.Url === \"string\" &&\n typeof record.FormattedMetadata === \"string\"\n )\n}\n\nexport class DioSearchAutocomplete extends HTMLElement {\n #abort?: AbortController\n #debounce?: ReturnType<typeof setTimeout>\n #docClickHandler?: (e: MouseEvent) => void\n\n connectedCallback() {\n const input = this.querySelector<HTMLInputElement>(\"[data-search-input]\")\n const list = this.querySelector<HTMLUListElement>(\"[data-search-suggest-list]\")\n const panel = this.querySelector<HTMLElement>(\"[data-search-suggest]\")\n if (!input || !list || !panel) return\n\n const source = this.getAttribute(\"data-autocomplete-source\") ?? \"\"\n const mockAttr = this.getAttribute(\"data-mock-suggestions\")\n let mocks: SuggestItem[] = []\n if (mockAttr) {\n try {\n const parsed = JSON.parse(mockAttr) as unknown\n if (Array.isArray(parsed)) mocks = parsed.filter(isSuggestItem)\n } catch {\n mocks = []\n }\n }\n let currentTerm = \"\"\n\n const reset = () => {\n list.innerHTML = \"\"\n panel.hidden = true\n input.setAttribute(\"aria-expanded\", \"false\")\n }\n\n const render = (items: SuggestItem[]) => {\n list.replaceChildren(\n ...items.map((item) => {\n const li = document.createElement(\"li\")\n li.className = \"dio-search-autocomplete__suggest-item\"\n\n const a = document.createElement(\"a\")\n const href = item.Url.trim()\n a.setAttribute(\"href\", /^(?:javascript|data):/i.test(href) ? \"#\" : href)\n\n const title = document.createElement(\"span\")\n title.className = \"dio-search-autocomplete__suggest-title\"\n title.textContent = item.Name\n\n const meta = document.createElement(\"span\")\n meta.className = \"dio-search-autocomplete__suggest-meta\"\n meta.textContent = item.FormattedMetadata\n\n a.append(title, meta)\n li.append(a)\n return li\n }),\n )\n panel.hidden = items.length === 0\n input.setAttribute(\"aria-expanded\", String(items.length > 0))\n }\n\n const search = async (term: string) => {\n if (term.length < 2) {\n reset()\n return\n }\n if (term === currentTerm) return\n currentTerm = term\n\n if (mocks.length) {\n render(mocks.filter((m) => m.Name.toLowerCase().includes(term.toLowerCase())))\n return\n }\n\n this.#abort?.abort()\n this.#abort = new AbortController()\n try {\n const res = await fetch(`${source}${encodeURIComponent(term)}`, {\n signal: this.#abort.signal,\n })\n const data = (await res.json()) as unknown\n render(Array.isArray(data) ? data.filter(isSuggestItem) : [])\n } catch {\n if (!this.#abort.signal.aborted) reset()\n }\n }\n\n input.addEventListener(\"input\", () => {\n clearTimeout(this.#debounce)\n this.#debounce = setTimeout(() => search(input.value), 350)\n })\n\n input.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Escape\") reset()\n })\n\n if (this.#docClickHandler) document.removeEventListener(\"click\", this.#docClickHandler)\n this.#docClickHandler = (e) => {\n if (e.target instanceof Node && !this.contains(e.target)) reset()\n }\n document.addEventListener(\"click\", this.#docClickHandler)\n }\n\n disconnectedCallback() {\n if (this.#docClickHandler) document.removeEventListener(\"click\", this.#docClickHandler)\n this.#docClickHandler = undefined\n clearTimeout(this.#debounce)\n this.#abort?.abort()\n }\n}\n", "export class DioTimeline extends HTMLElement {\n connectedCallback() {\n const reverseBtn = this.querySelector<HTMLButtonElement>(\"[data-toggle-reverse-timeline]\")\n const expandBtn = this.querySelector<HTMLButtonElement>(\"[data-toggle-all-years]\")\n\n reverseBtn?.addEventListener(\"click\", () => {\n const reversed = reverseBtn.getAttribute(\"data-reversed\") === \"true\"\n const nextReversed = !reversed\n reverseBtn.setAttribute(\"data-reversed\", String(nextReversed))\n const label = reverseBtn.querySelector(\"span\")\n if (label) {\n label.textContent = nextReversed\n ? (reverseBtn.getAttribute(\"data-reversed-text\") ?? \"\")\n : (reverseBtn.getAttribute(\"data-initial-text\") ?? \"\")\n }\n this.querySelectorAll<HTMLElement>(\"[data-timeline-event-list]\").forEach(\n (eventList) => {\n const fragment = document.createDocumentFragment()\n ;[...eventList.children]\n .toReversed()\n .forEach((child) => fragment.appendChild(child))\n eventList.appendChild(fragment)\n },\n )\n })\n\n expandBtn?.addEventListener(\"click\", () => {\n const expanded = expandBtn.getAttribute(\"data-expanded\") === \"true\"\n expandBtn.setAttribute(\"data-expanded\", String(!expanded))\n const label = expandBtn.querySelector(\"span\")\n if (label) {\n label.textContent = expanded\n ? (expandBtn.getAttribute(\"data-initial-text\") ?? \"\")\n : (expandBtn.getAttribute(\"data-active-text\") ?? \"\")\n }\n this.querySelectorAll<HTMLDetailsElement>(\"[data-timeline-event]\").forEach((event) => {\n event.open = !expanded\n })\n })\n }\n}\n", "const DEFAULT_SCREENS_TO_SHOW_BUTTON = 4\n\nconst isDocumentScrollRoot = (root: Element): boolean =>\n root === document.documentElement ||\n root === document.body ||\n root === document.scrollingElement\n\nconst isScrollable = (element: Element): boolean => {\n const { overflowY } = getComputedStyle(element)\n if (overflowY !== \"auto\" && overflowY !== \"scroll\" && overflowY !== \"overlay\") return false\n return element.scrollHeight > element.clientHeight\n}\n\nexport class DioToTopOfPage extends HTMLElement {\n #abort: AbortController | null = null\n #resizeTimer: ReturnType<typeof setTimeout> | undefined\n #resizeObserver: ResizeObserver | null = null\n #scrollRoot: Element | null = null\n\n connectedCallback() {\n const link = this.querySelector<HTMLAnchorElement>(\"[data-to-top-of-page-link]\")\n if (!link) return\n\n this.#abort?.abort()\n const ac = new AbortController()\n this.#abort = ac\n const opts: AddEventListenerOptions = { signal: ac.signal }\n\n link.addEventListener(\n \"click\",\n (event) => {\n event.preventDefault()\n this.#scrollToTop()\n },\n opts,\n )\n\n const update = () => this.#update()\n\n const init = () => {\n this.#scrollRoot = this.#findScrollRoot()\n\n const scrollTarget = isDocumentScrollRoot(this.#scrollRoot) ? window : this.#scrollRoot\n scrollTarget.addEventListener(\"scroll\", update, opts)\n\n if (typeof ResizeObserver !== \"undefined\" && !isDocumentScrollRoot(this.#scrollRoot)) {\n this.#resizeObserver = new ResizeObserver(update)\n this.#resizeObserver.observe(this.#scrollRoot)\n }\n\n update()\n }\n\n window.addEventListener(\"resize\", () => this.#debouncedUpdate(update), opts)\n\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", init, { ...opts, once: true })\n } else {\n requestAnimationFrame(init)\n }\n }\n\n disconnectedCallback() {\n this.#abort?.abort()\n this.#abort = null\n this.#resizeObserver?.disconnect()\n this.#resizeObserver = null\n clearTimeout(this.#resizeTimer)\n this.#scrollRoot = null\n }\n\n #findScrollRoot(): Element {\n let parent = this.parentElement\n while (parent) {\n if (isScrollable(parent)) return parent\n parent = parent.parentElement\n }\n return document.scrollingElement ?? document.documentElement\n }\n\n #getScrollMetrics(): { scrollTop: number; viewportHeight: number } {\n const root = this.#scrollRoot ?? document.documentElement\n if (isDocumentScrollRoot(root)) {\n return {\n scrollTop: window.pageYOffset || document.documentElement.scrollTop,\n viewportHeight: window.innerHeight,\n }\n }\n return { scrollTop: root.scrollTop, viewportHeight: root.clientHeight }\n }\n\n #scrollToTop(): void {\n const root = this.#scrollRoot ?? document.documentElement\n if (isDocumentScrollRoot(root)) {\n window.scrollTo({ top: 0, behavior: \"smooth\" })\n return\n }\n root.scrollTo({ top: 0, behavior: \"smooth\" })\n }\n\n #debouncedUpdate(update: () => void): void {\n clearTimeout(this.#resizeTimer)\n this.#resizeTimer = setTimeout(update, 250)\n }\n\n #update() {\n const screens = this.#getScreensToShow()\n\n if (screens === 0) {\n this.classList.add(\"dio-to-top-of-page--visible\")\n return\n }\n\n const { scrollTop, viewportHeight } = this.#getScrollMetrics()\n\n if (scrollTop > viewportHeight * screens) {\n this.classList.add(\"dio-to-top-of-page--visible\")\n } else {\n this.classList.remove(\"dio-to-top-of-page--visible\")\n }\n }\n\n #getScreensToShow(): number {\n const value = Number(this.dataset.toTopScreens)\n if (!Number.isFinite(value) || value < 0) return DEFAULT_SCREENS_TO_SHOW_BUTTON\n return value\n }\n}\n", "import { DioCarousel } from \"./web-components/Carousel/DioCarousel\"\nimport { DioFeedbackBanner } from \"./web-components/FeedbackBanner/DioFeedbackBanner\"\nimport { DioNewsAlertSubscribe } from \"./web-components/NewsAlertSubscribe/DioNewsAlertSubscribe\"\nimport { DioSearchAutocomplete } from \"./web-components/SearchAutocomplete/DioSearchAutocomplete\"\nimport { DioTimeline } from \"./web-components/Timeline/DioTimeline\"\nimport { DioToTopOfPage } from \"./web-components/ToTopOfPage/DioToTopOfPage\"\nimport \"@digdir/designsystemet-web\"\n\nexport {\n DioCarousel,\n DioFeedbackBanner,\n DioNewsAlertSubscribe,\n DioSearchAutocomplete,\n DioTimeline,\n DioToTopOfPage,\n}\n\nconst define = (name: string, ctor: CustomElementConstructor) => {\n if (!customElements.get(name)) customElements.define(name, ctor)\n}\n\ndefine(\"dio-carousel\", DioCarousel)\ndefine(\"dio-feedback-banner\", DioFeedbackBanner)\ndefine(\"dio-news-alert-subscribe\", DioNewsAlertSubscribe)\ndefine(\"dio-search-autocomplete\", DioSearchAutocomplete)\ndefine(\"dio-timeline\", DioTimeline)\ndefine(\"dio-to-top-of-page\", DioToTopOfPage)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dep-dio/dio-designsystem",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "DIO design system built on Designsystemet",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -65,24 +65,24 @@
|
|
|
65
65
|
"tokens:patch": "node scripts/patch-tokens.mjs"
|
|
66
66
|
},
|
|
67
67
|
"dependencies": {
|
|
68
|
-
"@digdir/designsystemet-css": "^1.
|
|
69
|
-
"@digdir/designsystemet-react": "^1.
|
|
70
|
-
"@digdir/designsystemet-types": "^1.
|
|
71
|
-
"@digdir/designsystemet-web": "^1.
|
|
72
|
-
"@navikt/aksel-icons": "^8.16.
|
|
68
|
+
"@digdir/designsystemet-css": "^1.21.1",
|
|
69
|
+
"@digdir/designsystemet-react": "^1.21.1",
|
|
70
|
+
"@digdir/designsystemet-types": "^1.21.1",
|
|
71
|
+
"@digdir/designsystemet-web": "^1.21.1",
|
|
72
|
+
"@navikt/aksel-icons": "^8.16.2",
|
|
73
73
|
"classnames": "^2.5.1"
|
|
74
74
|
},
|
|
75
75
|
"devDependencies": {
|
|
76
|
-
"@digdir/designsystemet": "^1.
|
|
77
|
-
"@types/react": "^19.
|
|
78
|
-
"@types/react-dom": "^19.
|
|
79
|
-
"esbuild": "^0.28.
|
|
76
|
+
"@digdir/designsystemet": "^1.21.1",
|
|
77
|
+
"@types/react": "^19.3.0",
|
|
78
|
+
"@types/react-dom": "^19.3.0",
|
|
79
|
+
"esbuild": "^0.28.2",
|
|
80
80
|
"fast-glob": "^3.3.3",
|
|
81
|
-
"react": "^19.
|
|
82
|
-
"react-dom": "^19.
|
|
83
|
-
"sass": "^1.
|
|
81
|
+
"react": "^19.3.0",
|
|
82
|
+
"react-dom": "^19.3.0",
|
|
83
|
+
"sass": "^1.104.1",
|
|
84
84
|
"typescript": "~7.0.2",
|
|
85
|
-
"vite": "^8.
|
|
85
|
+
"vite": "^8.3.0",
|
|
86
86
|
"vite-plugin-svg-icons": "^2.0.1"
|
|
87
87
|
},
|
|
88
88
|
"peerDependencies": {
|