@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.
@@ -1,8 +1,8 @@
1
1
  @charset "UTF-8";
2
2
  @import "@digdir/designsystemet-css/index.css";
3
3
  /*
4
- build: v1.18.0
5
- design-tokens: v1.18.0
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
- margin: var(--ds-size-8) 0;
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-page__button {
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 {
@@ -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: SeverityColors[];
5
+ export declare const severityColors: string[];
6
6
  export declare const colors: Color[];
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- /* build: v1.18.0 */
1
+ /* build: v1.21.1 */
2
2
  import type {} from '@digdir/designsystemet-types';
3
3
 
4
4
  // Augment types based on theme
@@ -1,3 +1,5 @@
1
1
  export declare class DioToTopOfPage extends HTMLElement {
2
+ #private;
2
3
  connectedCallback(): void;
4
+ disconnectedCallback(): void;
3
5
  }
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
- const self = this;
252
- if (self.__dioDocClick) document.removeEventListener("click", self.__dioDocClick);
253
- self.__dioDocClick = (e) => {
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", self.__dioDocClick);
261
+ document.addEventListener("click", this.#docClickHandler);
257
262
  }
258
263
  disconnectedCallback() {
259
- const self = this;
260
- if (self.__dioDocClick) document.removeEventListener("click", self.__dioDocClick);
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].reverse().forEach((child) => fragment.appendChild(child));
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
- link?.addEventListener("click", (event) => {
307
- event.preventDefault();
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.4.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.18.0",
69
- "@digdir/designsystemet-react": "^1.19.0",
70
- "@digdir/designsystemet-types": "^1.18.0",
71
- "@digdir/designsystemet-web": "^1.18.0",
72
- "@navikt/aksel-icons": "^8.16.1",
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.18.0",
77
- "@types/react": "^19.2.17",
78
- "@types/react-dom": "^19.2.3",
79
- "esbuild": "^0.28.1",
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.2.8",
82
- "react-dom": "^19.2.8",
83
- "sass": "^1.102.0",
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.1.5",
85
+ "vite": "^8.3.0",
86
86
  "vite-plugin-svg-icons": "^2.0.1"
87
87
  },
88
88
  "peerDependencies": {