@dep-dio/dio-designsystem 0.2.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.
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1,3 @@
1
+ // src/svg-icons-register.ts
2
+ import "virtual:svg-icons-register";
3
+ //# sourceMappingURL=svg-icons-register.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/svg-icons-register.ts"],
4
+ "sourcesContent": ["import \"virtual:svg-icons-register\"\n"],
5
+ "mappings": ";AAAA,OAAO;",
6
+ "names": []
7
+ }
@@ -0,0 +1,3 @@
1
+ export declare class DioTimeline extends HTMLElement {
2
+ connectedCallback(): void;
3
+ }
@@ -0,0 +1,3 @@
1
+ export declare class DioToTopOfPage extends HTMLElement {
2
+ connectedCallback(): void;
3
+ }
@@ -0,0 +1 @@
1
+ export declare function createDioSvgIconsPlugin(): import("vite").Plugin<any>;
@@ -0,0 +1,28 @@
1
+ // src/vite-icons-plugin.ts
2
+ import { existsSync } from "node:fs";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
6
+ function resolveIconsDir() {
7
+ const moduleDir = path.dirname(fileURLToPath(import.meta.url));
8
+ const packageRoot = path.resolve(moduleDir, "..");
9
+ const distIcons = path.join(packageRoot, "dist/assets/icons");
10
+ const srcIcons = path.join(packageRoot, "src/assets/icons");
11
+ if (existsSync(distIcons)) {
12
+ return distIcons;
13
+ }
14
+ if (existsSync(srcIcons)) {
15
+ return srcIcons;
16
+ }
17
+ return path.join(moduleDir, "assets/icons");
18
+ }
19
+ function createDioSvgIconsPlugin() {
20
+ return createSvgIconsPlugin({
21
+ iconDirs: [resolveIconsDir()],
22
+ symbolId: "dio-[name]"
23
+ });
24
+ }
25
+ export {
26
+ createDioSvgIconsPlugin
27
+ };
28
+ //# sourceMappingURL=vite-icons-plugin.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/vite-icons-plugin.ts"],
4
+ "sourcesContent": ["import { existsSync } from \"node:fs\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\nimport { createSvgIconsPlugin } from \"vite-plugin-svg-icons\"\n\nfunction resolveIconsDir() {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url))\n const packageRoot = path.resolve(moduleDir, \"..\")\n const distIcons = path.join(packageRoot, \"dist/assets/icons\")\n const srcIcons = path.join(packageRoot, \"src/assets/icons\")\n\n if (existsSync(distIcons)) {\n return distIcons\n }\n\n if (existsSync(srcIcons)) {\n return srcIcons\n }\n\n return path.join(moduleDir, \"assets/icons\")\n}\n\nexport function createDioSvgIconsPlugin() {\n return createSvgIconsPlugin({\n iconDirs: [resolveIconsDir()],\n symbolId: \"dio-[name]\",\n })\n}\n"],
5
+ "mappings": ";AAAA,SAAS,kBAAkB;AAC3B,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAE9B,SAAS,4BAA4B;AAErC,SAAS,kBAAkB;AACvB,QAAM,YAAY,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAC7D,QAAM,cAAc,KAAK,QAAQ,WAAW,IAAI;AAChD,QAAM,YAAY,KAAK,KAAK,aAAa,mBAAmB;AAC5D,QAAM,WAAW,KAAK,KAAK,aAAa,kBAAkB;AAE1D,MAAI,WAAW,SAAS,GAAG;AACvB,WAAO;AAAA,EACX;AAEA,MAAI,WAAW,QAAQ,GAAG;AACtB,WAAO;AAAA,EACX;AAEA,SAAO,KAAK,KAAK,WAAW,cAAc;AAC9C;AAEO,SAAS,0BAA0B;AACtC,SAAO,qBAAqB;AAAA,IACxB,UAAU,CAAC,gBAAgB,CAAC;AAAA,IAC5B,UAAU;AAAA,EACd,CAAC;AACL;",
6
+ "names": []
7
+ }
package/dist/web.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { DioCarousel } from "./carousel/Carousel";
2
+ import { DioFeedbackBanner } from "./feedback-banner/FeedbackBanner";
3
+ import { DioNewsletterSubscribe } from "./newsletter-subscribe/NewsletterSubscribe";
4
+ import { DioSearchAutocomplete } from "./search-autocomplete/SearchAutocomplete";
5
+ import { DioTimeline } from "./timeline/Timeline";
6
+ import { DioToTopOfPage } from "./to-top-of-page/ToTopOfPage";
7
+ import "@digdir/designsystemet-web";
8
+ export { DioCarousel, DioFeedbackBanner, DioNewsletterSubscribe, DioSearchAutocomplete, DioTimeline, DioToTopOfPage, };
package/dist/web.js ADDED
@@ -0,0 +1,332 @@
1
+ // src/carousel/Carousel.ts
2
+ var DioCarousel = class extends HTMLElement {
3
+ constructor() {
4
+ super(...arguments);
5
+ this.current = 0;
6
+ }
7
+ connectedCallback() {
8
+ const items = [...this.querySelectorAll("[data-carousel-item]")];
9
+ const prev = this.querySelector("[data-carousel-prev]");
10
+ const next = this.querySelector("[data-carousel-next]");
11
+ const info = this.querySelector("[data-carousel-info-content]");
12
+ if (!items.length) return;
13
+ const show = (index) => {
14
+ this.current = (index + items.length) % items.length;
15
+ items.forEach((item, i) => {
16
+ item.hidden = i !== this.current;
17
+ });
18
+ if (info) {
19
+ const active = items[this.current];
20
+ const title = active.querySelector(".dio-carousel__title")?.textContent ?? "";
21
+ info.textContent = title;
22
+ }
23
+ prev?.toggleAttribute("disabled", items.length <= 1);
24
+ next?.toggleAttribute("disabled", items.length <= 1);
25
+ };
26
+ prev?.addEventListener("click", () => show(this.current - 1));
27
+ next?.addEventListener("click", () => show(this.current + 1));
28
+ show(0);
29
+ }
30
+ };
31
+
32
+ // src/feedback-banner/FeedbackBanner.ts
33
+ var DioFeedbackBanner = class extends HTMLElement {
34
+ connectedCallback() {
35
+ const close = this.querySelector("[data-hide-banner]");
36
+ close?.addEventListener("click", () => {
37
+ this.hidden = true;
38
+ });
39
+ }
40
+ };
41
+
42
+ // src/newsletter-subscribe/NewsletterSubscribe.ts
43
+ var emailRegex = /^(?!.*(?:''|\.\.))[A-Z0-9._!#$%&'*+\-/=?^`{|}~]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i;
44
+ var validateEmail = (value) => emailRegex.test(value);
45
+ var DioNewsletterSubscribe = class extends HTMLElement {
46
+ #abort = null;
47
+ connectedCallback() {
48
+ if (document.readyState !== "loading") {
49
+ this.init();
50
+ return;
51
+ }
52
+ document.addEventListener("DOMContentLoaded", () => this.init(), { once: true });
53
+ }
54
+ init() {
55
+ if (this.hasAttribute("data-initialized")) return;
56
+ this.#abort?.abort();
57
+ const ac = new AbortController();
58
+ this.#abort = ac;
59
+ const opts = { signal: ac.signal };
60
+ const ui = this.#getUi();
61
+ const subscribeUrl = this.#getSubscribeUrl();
62
+ if (!ui || !subscribeUrl) return;
63
+ const setErrorVisible = (visible) => {
64
+ ui.errorMessage?.classList.toggle("hidden", !visible);
65
+ if (visible) {
66
+ ui.errorMessage?.setAttribute("data-field", "validation");
67
+ } else {
68
+ ui.errorMessage?.removeAttribute("data-field");
69
+ }
70
+ };
71
+ const showInitial = () => {
72
+ ui.initialView?.classList.remove("hidden");
73
+ ui.actionView.classList.add("hidden");
74
+ ui.feedbackView.classList.add("hidden");
75
+ ui.emailInput.value = "";
76
+ ui.responseMessage.textContent = "";
77
+ setErrorVisible(false);
78
+ };
79
+ const showAction = () => {
80
+ ui.initialView?.classList.add("hidden");
81
+ ui.actionView.classList.remove("hidden");
82
+ ui.feedbackView.classList.add("hidden");
83
+ setErrorVisible(false);
84
+ };
85
+ const showFeedback = (message) => {
86
+ ui.actionView.classList.add("hidden");
87
+ ui.responseMessage.textContent = message;
88
+ ui.feedbackView.classList.remove("hidden");
89
+ };
90
+ ui.openButton.addEventListener(
91
+ "click",
92
+ () => {
93
+ showAction();
94
+ ui.emailInput.focus();
95
+ },
96
+ opts
97
+ );
98
+ ui.cancelButton?.addEventListener(
99
+ "click",
100
+ () => {
101
+ showInitial();
102
+ ui.openButton.focus();
103
+ },
104
+ opts
105
+ );
106
+ ui.okButton?.addEventListener("click", showInitial, opts);
107
+ ui.emailInput.addEventListener(
108
+ "keydown",
109
+ (e) => {
110
+ setErrorVisible(false);
111
+ if (e.key === "Enter") {
112
+ e.preventDefault();
113
+ ui.submitButton.click();
114
+ }
115
+ },
116
+ opts
117
+ );
118
+ ui.submitButton.addEventListener(
119
+ "click",
120
+ async () => {
121
+ if (!validateEmail(ui.emailInput.value)) {
122
+ setErrorVisible(true);
123
+ return;
124
+ }
125
+ const url = `${subscribeUrl}?email=${encodeURIComponent(ui.emailInput.value)}`;
126
+ try {
127
+ const res = await fetch(url, { method: "POST", signal: ac.signal });
128
+ const text = await res.text();
129
+ showFeedback(res.ok ? text : "");
130
+ } catch {
131
+ if (!ac.signal.aborted) showFeedback("");
132
+ }
133
+ },
134
+ opts
135
+ );
136
+ this.setAttribute("data-initialized", "true");
137
+ }
138
+ disconnectedCallback() {
139
+ this.#abort?.abort();
140
+ this.#abort = null;
141
+ }
142
+ #getSubscribeUrl() {
143
+ const endpoint = this.dataset.newsletterEndpoint;
144
+ const subscribeId = this.dataset.newsletterSubscribeId;
145
+ if (!endpoint || !subscribeId) return null;
146
+ return `${endpoint.replace(/\/$/, "")}/${encodeURIComponent(subscribeId)}`;
147
+ }
148
+ #getUi() {
149
+ const actionView = this.querySelector("[data-action]");
150
+ const openButton = this.querySelector("[data-open]");
151
+ const submitButton = this.querySelector("[data-submit]");
152
+ const emailInput = this.querySelector("[data-email]");
153
+ const feedbackView = this.querySelector("[data-feedback]");
154
+ const responseMessage = feedbackView?.querySelector("[data-response]");
155
+ if (!actionView || !openButton || !submitButton || !emailInput || !feedbackView || !responseMessage) {
156
+ return null;
157
+ }
158
+ return {
159
+ initialView: this.querySelector("[data-initial]"),
160
+ actionView,
161
+ openButton,
162
+ cancelButton: this.querySelector("[data-cancel]"),
163
+ okButton: this.querySelector("[data-ok]"),
164
+ submitButton,
165
+ emailInput,
166
+ errorMessage: this.querySelector("[data-error]"),
167
+ feedbackView,
168
+ responseMessage
169
+ };
170
+ }
171
+ };
172
+
173
+ // src/search-autocomplete/SearchAutocomplete.ts
174
+ var DioSearchAutocomplete = class extends HTMLElement {
175
+ #abort;
176
+ #debounce;
177
+ connectedCallback() {
178
+ const input = this.querySelector("[data-search-input]");
179
+ const list = this.querySelector("[data-search-suggest-list]");
180
+ const panel = this.querySelector("[data-search-suggest]");
181
+ if (!input || !list || !panel) return;
182
+ const source = this.getAttribute("data-autocomplete-source") ?? "";
183
+ const mockAttr = this.getAttribute("data-mock-suggestions");
184
+ let mocks = [];
185
+ if (mockAttr) {
186
+ try {
187
+ const parsed = JSON.parse(mockAttr);
188
+ if (Array.isArray(parsed)) mocks = parsed;
189
+ } catch {
190
+ mocks = [];
191
+ }
192
+ }
193
+ let currentTerm = "";
194
+ const reset = () => {
195
+ list.innerHTML = "";
196
+ panel.hidden = true;
197
+ input.setAttribute("aria-expanded", "false");
198
+ };
199
+ const render = (items) => {
200
+ list.replaceChildren(
201
+ ...items.map((item) => {
202
+ const li = document.createElement("li");
203
+ li.className = "dio-search-autocomplete__suggest-item";
204
+ const a = document.createElement("a");
205
+ const href = item.Url.trim();
206
+ a.setAttribute("href", /^(?:javascript|data):/i.test(href) ? "#" : href);
207
+ const title = document.createElement("span");
208
+ title.className = "dio-search-autocomplete__suggest-title";
209
+ title.textContent = item.Name;
210
+ const meta = document.createElement("span");
211
+ meta.className = "dio-search-autocomplete__suggest-meta";
212
+ meta.textContent = item.FormattedMetadata;
213
+ a.append(title, meta);
214
+ li.append(a);
215
+ return li;
216
+ })
217
+ );
218
+ panel.hidden = items.length === 0;
219
+ input.setAttribute("aria-expanded", String(items.length > 0));
220
+ };
221
+ const search = async (term) => {
222
+ if (term.length < 2) {
223
+ reset();
224
+ return;
225
+ }
226
+ if (term === currentTerm) return;
227
+ currentTerm = term;
228
+ if (mocks.length) {
229
+ render(mocks.filter((m) => m.Name.toLowerCase().includes(term.toLowerCase())));
230
+ return;
231
+ }
232
+ this.#abort?.abort();
233
+ this.#abort = new AbortController();
234
+ try {
235
+ const res = await fetch(`${source}${encodeURIComponent(term)}`, {
236
+ signal: this.#abort.signal
237
+ });
238
+ const data = await res.json();
239
+ render(Array.isArray(data) ? data : []);
240
+ } catch {
241
+ if (!this.#abort.signal.aborted) reset();
242
+ }
243
+ };
244
+ input.addEventListener("input", () => {
245
+ clearTimeout(this.#debounce);
246
+ this.#debounce = setTimeout(() => search(input.value), 350);
247
+ });
248
+ input.addEventListener("keydown", (e) => {
249
+ if (e.key === "Escape") reset();
250
+ });
251
+ const self = this;
252
+ if (self.__dioDocClick) document.removeEventListener("click", self.__dioDocClick);
253
+ self.__dioDocClick = (e) => {
254
+ if (!this.contains(e.target)) reset();
255
+ };
256
+ document.addEventListener("click", self.__dioDocClick);
257
+ }
258
+ disconnectedCallback() {
259
+ const self = this;
260
+ if (self.__dioDocClick) document.removeEventListener("click", self.__dioDocClick);
261
+ self.__dioDocClick = void 0;
262
+ clearTimeout(this.#debounce);
263
+ this.#abort?.abort();
264
+ }
265
+ };
266
+
267
+ // src/timeline/Timeline.ts
268
+ var DioTimeline = class extends HTMLElement {
269
+ connectedCallback() {
270
+ const list = this.matches(".dio-timeline") ? this : this.querySelector(".dio-timeline");
271
+ const reverseBtn = this.querySelector("[data-toggle-reverse-timeline]");
272
+ const expandBtn = this.querySelector("[data-toggle-all-years]");
273
+ const eventLists = () => this.querySelectorAll(".dio-timeline__events");
274
+ const events = () => this.querySelectorAll(".dio-timeline__event");
275
+ reverseBtn?.addEventListener("click", () => {
276
+ const reversed = reverseBtn.getAttribute("data-reversed") === "true";
277
+ const nextReversed = !reversed;
278
+ reverseBtn.setAttribute("data-reversed", String(nextReversed));
279
+ const label = reverseBtn.querySelector("span");
280
+ if (label) {
281
+ label.textContent = nextReversed ? reverseBtn.getAttribute("data-reversed-text") ?? "" : reverseBtn.getAttribute("data-initial-text") ?? "";
282
+ }
283
+ if (list) list.style.flexDirection = nextReversed ? "column-reverse" : "";
284
+ eventLists().forEach((eventList) => {
285
+ eventList.style.flexDirection = nextReversed ? "column-reverse" : "";
286
+ });
287
+ });
288
+ expandBtn?.addEventListener("click", () => {
289
+ const expanded = expandBtn.getAttribute("data-expanded") === "true";
290
+ expandBtn.setAttribute("data-expanded", String(!expanded));
291
+ const label = expandBtn.querySelector("span");
292
+ if (label) {
293
+ label.textContent = expanded ? expandBtn.getAttribute("data-initial-text") ?? "" : expandBtn.getAttribute("data-active-text") ?? "";
294
+ }
295
+ events().forEach((event) => {
296
+ event.open = !expanded;
297
+ });
298
+ });
299
+ }
300
+ };
301
+
302
+ // src/to-top-of-page/ToTopOfPage.ts
303
+ var DioToTopOfPage = class extends HTMLElement {
304
+ connectedCallback() {
305
+ const link = this.querySelector("[data-to-top-of-page]");
306
+ link?.addEventListener("click", (event) => {
307
+ event.preventDefault();
308
+ window.scrollTo({ top: 0, behavior: "smooth" });
309
+ });
310
+ }
311
+ };
312
+
313
+ // src/web.ts
314
+ import "@digdir/designsystemet-web";
315
+ var define = (name, ctor) => {
316
+ if (!customElements.get(name)) customElements.define(name, ctor);
317
+ };
318
+ define("dio-carousel", DioCarousel);
319
+ define("dio-feedback-banner", DioFeedbackBanner);
320
+ define("dio-newsletter-subscribe", DioNewsletterSubscribe);
321
+ define("dio-search-autocomplete", DioSearchAutocomplete);
322
+ define("dio-timeline", DioTimeline);
323
+ define("dio-to-top-of-page", DioToTopOfPage);
324
+ export {
325
+ DioCarousel,
326
+ DioFeedbackBanner,
327
+ DioNewsletterSubscribe,
328
+ DioSearchAutocomplete,
329
+ DioTimeline,
330
+ DioToTopOfPage
331
+ };
332
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/carousel/Carousel.ts", "../src/feedback-banner/FeedbackBanner.ts", "../src/newsletter-subscribe/NewsletterSubscribe.ts", "../src/search-autocomplete/SearchAutocomplete.ts", "../src/timeline/Timeline.ts", "../src/to-top-of-page/ToTopOfPage.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 NewsletterUi = {\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 DioNewsletterSubscribe 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.newsletterEndpoint\n const subscribeId = this.dataset.newsletterSubscribeId\n if (!endpoint || !subscribeId) return null\n return `${endpoint.replace(/\\/$/, \"\")}/${encodeURIComponent(subscribeId)}`\n }\n\n #getUi(): NewsletterUi | 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 list = this.matches(\".dio-timeline\")\n ? this\n : this.querySelector<HTMLElement>(\".dio-timeline\")\n const reverseBtn = this.querySelector<HTMLButtonElement>(\"[data-toggle-reverse-timeline]\")\n const expandBtn = this.querySelector<HTMLButtonElement>(\"[data-toggle-all-years]\")\n const eventLists = () => this.querySelectorAll<HTMLElement>(\".dio-timeline__events\")\n const events = () => this.querySelectorAll<HTMLDetailsElement>(\".dio-timeline__event\")\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 if (list) list.style.flexDirection = nextReversed ? \"column-reverse\" : \"\"\n eventLists().forEach((eventList) => {\n eventList.style.flexDirection = nextReversed ? \"column-reverse\" : \"\"\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 events().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 \"./carousel/Carousel\"\nimport { DioFeedbackBanner } from \"./feedback-banner/FeedbackBanner\"\nimport { DioNewsletterSubscribe } from \"./newsletter-subscribe/NewsletterSubscribe\"\nimport { DioSearchAutocomplete } from \"./search-autocomplete/SearchAutocomplete\"\nimport { DioTimeline } from \"./timeline/Timeline\"\nimport { DioToTopOfPage } from \"./to-top-of-page/ToTopOfPage\"\nimport \"@digdir/designsystemet-web\"\n\nexport {\n DioCarousel,\n DioFeedbackBanner,\n DioNewsletterSubscribe,\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-newsletter-subscribe\", DioNewsletterSubscribe)\ndefine(\"dio-search-autocomplete\", DioSearchAutocomplete)\ndefine(\"dio-timeline\", DioTimeline)\ndefine(\"dio-to-top-of-page\", DioToTopOfPage)\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/package.json ADDED
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "@dep-dio/dio-designsystem",
3
+ "version": "0.2.0",
4
+ "description": "DIO design system built on Designsystemet",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/dss-web/dio-designsystemet.git",
9
+ "directory": "packages/dio-designsystem"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "type": "module",
15
+ "sideEffects": [
16
+ "**/*.css",
17
+ "**/*.scss",
18
+ "./dist/web.js",
19
+ "./dist/svg-icons-register.js"
20
+ ],
21
+ "exports": {
22
+ "./icons": {
23
+ "types": "./dist/icons.d.ts",
24
+ "import": "./dist/icons.js"
25
+ },
26
+ "./web": {
27
+ "types": "./dist/web.d.ts",
28
+ "import": "./dist/web.js"
29
+ },
30
+ "./svg-icons-register": {
31
+ "types": "./dist/svg-icons-register.d.ts",
32
+ "import": "./dist/svg-icons-register.js"
33
+ },
34
+ "./vite-icons-plugin": {
35
+ "types": "./dist/vite-icons-plugin.d.ts",
36
+ "import": "./dist/vite-icons-plugin.js"
37
+ },
38
+ "./styles": "./dist/styles/main.css",
39
+ "./mixins": "./dist/styles/_mixins.scss"
40
+ },
41
+ "publishConfig": {
42
+ "access": "public"
43
+ },
44
+ "dependencies": {
45
+ "@digdir/designsystemet-css": "^1.17.0",
46
+ "@digdir/designsystemet-web": "^1.17.0",
47
+ "@navikt/aksel-icons": "^8.13.1"
48
+ },
49
+ "devDependencies": {
50
+ "@digdir/designsystemet": "^1.17.0",
51
+ "esbuild": "^0.28.1",
52
+ "fast-glob": "^3.3.3",
53
+ "sass": "^1.101.0",
54
+ "typescript": "~6.0.3",
55
+ "vite": "^8.1.0",
56
+ "vite-plugin-svg-icons": "^2.0.1"
57
+ },
58
+ "peerDependencies": {
59
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0",
60
+ "vite-plugin-svg-icons": "^2.0.0"
61
+ },
62
+ "peerDependenciesMeta": {
63
+ "vite": {
64
+ "optional": true
65
+ },
66
+ "vite-plugin-svg-icons": {
67
+ "optional": true
68
+ }
69
+ },
70
+ "scripts": {
71
+ "build-tokens": "designsystemet tokens build --config designsystemet.config.json",
72
+ "create-tokens": "designsystemet tokens create --config designsystemet.config.json",
73
+ "prepare-dist": "node scripts/prepare-dist.mjs",
74
+ "build:js": "node scripts/build-js.mjs && tsc -p tsconfig.build.json",
75
+ "build": "pnpm create-tokens && pnpm build-tokens && pnpm prepare-dist && pnpm build:js"
76
+ }
77
+ }