@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.
- package/README.md +3 -0
- package/dist/assets/icons/arrow-forward.svg +3 -0
- package/dist/assets/icons/chevron-down.svg +3 -0
- package/dist/assets/icons/chevron-right.svg +3 -0
- package/dist/assets/icons/chevron-up.svg +3 -0
- package/dist/assets/icons/envelope-closed.svg +3 -0
- package/dist/assets/icons/flag-english.svg +17 -0
- package/dist/assets/icons/flag-norwegian.svg +6 -0
- package/dist/assets/icons/flag-sami.svg +8 -0
- package/dist/assets/icons/love.svg +1 -0
- package/dist/assets/icons/printer-small.svg +3 -0
- package/dist/assets/icons/x-mark.svg +3 -0
- package/dist/carousel/Carousel.d.ts +4 -0
- package/dist/feedback-banner/FeedbackBanner.d.ts +3 -0
- package/dist/icons.d.ts +1 -0
- package/dist/icons.js +3 -0
- package/dist/icons.js.map +7 -0
- package/dist/newsletter-subscribe/NewsletterSubscribe.d.ts +6 -0
- package/dist/search-autocomplete/SearchAutocomplete.d.ts +5 -0
- package/dist/styles/_mixins.scss +48 -0
- package/dist/styles/main.css +5470 -0
- package/dist/svg-icons-register.d.ts +1 -0
- package/dist/svg-icons-register.js +3 -0
- package/dist/svg-icons-register.js.map +7 -0
- package/dist/timeline/Timeline.d.ts +3 -0
- package/dist/to-top-of-page/ToTopOfPage.d.ts +3 -0
- package/dist/vite-icons-plugin.d.ts +1 -0
- package/dist/vite-icons-plugin.js +28 -0
- package/dist/vite-icons-plugin.js.map +7 -0
- package/dist/web.d.ts +8 -0
- package/dist/web.js +332 -0
- package/dist/web.js.map +7 -0
- package/package.json +77 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {}
|
|
@@ -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
|
package/dist/web.js.map
ADDED
|
@@ -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
|
+
}
|