@dep-dio/dio-designsystem 0.2.0 → 0.3.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,153 @@
1
+ $bp-xxsmall: 320px;
2
+ $bp-xsmall: 399px;
3
+ $bp-small: 499px;
4
+ $bp-small-upper: 500px;
5
+ $bp-medium: 899px;
6
+ $bp-medium-upper: 900px;
7
+ $bp-large: 1024px;
8
+ $bp-xlarge: 1100px;
9
+ $bp-pageheader: 768px;
10
+ $bp-pageheader-up: 769px;
11
+ $bp-content: 699px;
12
+ $bp-content-up: 700px;
13
+
14
+ @mixin xxsmall {
15
+ @media (max-width: $bp-xxsmall) {
16
+ @content;
17
+ }
18
+ }
19
+
20
+ @mixin xsmall {
21
+ @media (max-width: $bp-xsmall) {
22
+ @content;
23
+ }
24
+ }
25
+
26
+ @mixin small {
27
+ @media (max-width: $bp-small) {
28
+ @content;
29
+ }
30
+ }
31
+
32
+ @mixin medium {
33
+ @media (max-width: $bp-medium) {
34
+ @content;
35
+ }
36
+ }
37
+
38
+ @mixin medium_only {
39
+ @media (min-width: $bp-small-upper) and (max-width: $bp-medium) {
40
+ @content;
41
+ }
42
+ }
43
+
44
+ @mixin medium_up {
45
+ @media (min-width: $bp-medium-upper) {
46
+ @content;
47
+ }
48
+ }
49
+
50
+ @mixin large {
51
+ @media (max-width: $bp-large) {
52
+ @content;
53
+ }
54
+ }
55
+
56
+ @mixin large_up {
57
+ @media (min-width: $bp-medium-upper) {
58
+ @content;
59
+ }
60
+ }
61
+
62
+ @mixin xlarge_up {
63
+ @media (min-width: $bp-xlarge) {
64
+ @content;
65
+ }
66
+ }
67
+
68
+ @mixin pageheader {
69
+ @media (max-width: $bp-pageheader) {
70
+ @content;
71
+ }
72
+ }
73
+
74
+ @mixin pageheader_up {
75
+ @media (min-width: $bp-pageheader-up) {
76
+ @content;
77
+ }
78
+ }
79
+
80
+ @mixin content {
81
+ @media (max-width: $bp-content) {
82
+ @content;
83
+ }
84
+ }
85
+
86
+ @mixin content_up {
87
+ @media (min-width: $bp-content-up) {
88
+ @content;
89
+ }
90
+ }
91
+
92
+ @mixin dio-text-heading-1 {
93
+ font-weight: var(--ds-heading-lg-font-weight);
94
+ line-height: var(--ds-heading-lg-line-height);
95
+ font-size: var(--ds-heading-lg-font-size);
96
+ letter-spacing: var(--ds-heading-lg-letter-spacing);
97
+
98
+ @include medium {
99
+ font-size: var(--ds-heading-md-font-size);
100
+ font-weight: var(--ds-heading-md-font-weight);
101
+ letter-spacing: var(--ds-heading-md-letter-spacing);
102
+ line-height: var(--ds-heading-md-line-height);
103
+ }
104
+ }
105
+
106
+ @mixin dio-text-heading-2 {
107
+ font-size: var(--ds-heading-sm-font-size);
108
+ font-weight: var(--ds-heading-sm-font-weight);
109
+ letter-spacing: var(--ds-heading-sm-letter-spacing);
110
+ line-height: var(--ds-heading-sm-line-height);
111
+ }
112
+
113
+ @mixin dio-text-heading-3 {
114
+ font-weight: var(--ds-heading-xs-font-weight);
115
+ line-height: var(--ds-heading-xs-line-height);
116
+ font-size: var(--ds-heading-xs-font-size);
117
+ letter-spacing: var(--ds-heading-xs-letter-spacing);
118
+ }
119
+
120
+ @mixin dio-text-heading-4 {
121
+ font-size: var(--ds-heading-2xs-font-size);
122
+ font-weight: var(--ds-heading-2xs-font-weight);
123
+ letter-spacing: var(--ds-heading-2xs-letter-spacing);
124
+ line-height: var(--ds-heading-2xs-line-height);
125
+ }
126
+
127
+ @mixin dio-text-large {
128
+ font-weight: var(--ds-body-xl-font-weight);
129
+ line-height: var(--ds-body-xl-line-height);
130
+ font-size: var(--ds-body-xl-font-size);
131
+ letter-spacing: var(--ds-body-xl-letter-spacing);
132
+
133
+ @include medium {
134
+ font-size: var(--ds-body-lg-font-size);
135
+ font-weight: var(--ds-body-lg-font-weight);
136
+ letter-spacing: var(--ds-body-lg-letter-spacing);
137
+ line-height: var(--ds-body-lg-line-height);
138
+ }
139
+ }
140
+
141
+ @mixin dio-text-base {
142
+ font-weight: var(--ds-body-md-font-weight);
143
+ line-height: var(--ds-body-md-line-height);
144
+ font-size: var(--ds-body-md-font-size);
145
+ letter-spacing: var(--ds-body-md-letter-spacing);
146
+ }
147
+
148
+ @mixin dio-text-small {
149
+ font-weight: var(--ds-body-sm-font-weight);
150
+ line-height: var(--ds-body-sm-line-height);
151
+ font-size: var(--ds-body-sm-font-size);
152
+ letter-spacing: var(--ds-body-sm-letter-spacing);
153
+ }
@@ -0,0 +1 @@
1
+ declare module '@dep-dio/dio-designsystem/styles' {}
@@ -0,0 +1,18 @@
1
+ /* build: v1.18.0 */
2
+ import type {} from '@digdir/designsystemet-types';
3
+
4
+ // Augment types based on theme
5
+ declare module '@digdir/designsystemet-types' {
6
+ export interface ColorDefinitions {
7
+ primary: never;
8
+ accent1: never;
9
+ regjeringsbla: never;
10
+ neutral: never;
11
+ }
12
+ export interface SeverityColorDefinitions {
13
+ info: never;
14
+ success: never;
15
+ warning: never;
16
+ danger: never;
17
+ }
18
+ }
@@ -1 +1 @@
1
- export declare function createDioSvgIconsPlugin(): import("vite").Plugin<any>;
1
+ export declare function createDioSvgIconsPlugin(): { name: string }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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;",
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(): { name: string } {\n return createSvgIconsPlugin({\n iconDirs: [resolveIconsDir()],\n symbolId: \"dio-[name]\",\n }) as { name: string }\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,0BAA4C;AACxD,SAAO,qBAAqB;AAAA,IACxB,UAAU,CAAC,gBAAgB,CAAC;AAAA,IAC5B,UAAU;AAAA,EACd,CAAC;AACL;",
6
6
  "names": []
7
7
  }
package/dist/web.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { DioCarousel } from "./carousel/Carousel";
2
2
  import { DioFeedbackBanner } from "./feedback-banner/FeedbackBanner";
3
- import { DioNewsletterSubscribe } from "./newsletter-subscribe/NewsletterSubscribe";
3
+ import { DioNewsAlertSubscribe } from "./news-alert-subscribe/NewsAlertSubscribe";
4
4
  import { DioSearchAutocomplete } from "./search-autocomplete/SearchAutocomplete";
5
5
  import { DioTimeline } from "./timeline/Timeline";
6
6
  import { DioToTopOfPage } from "./to-top-of-page/ToTopOfPage";
7
7
  import "@digdir/designsystemet-web";
8
- export { DioCarousel, DioFeedbackBanner, DioNewsletterSubscribe, DioSearchAutocomplete, DioTimeline, DioToTopOfPage, };
8
+ export { DioCarousel, DioFeedbackBanner, DioNewsAlertSubscribe, DioSearchAutocomplete, DioTimeline, DioToTopOfPage, };
package/dist/web.js CHANGED
@@ -39,10 +39,10 @@ var DioFeedbackBanner = class extends HTMLElement {
39
39
  }
40
40
  };
41
41
 
42
- // src/newsletter-subscribe/NewsletterSubscribe.ts
42
+ // src/news-alert-subscribe/NewsAlertSubscribe.ts
43
43
  var emailRegex = /^(?!.*(?:''|\.\.))[A-Z0-9._!#$%&'*+\-/=?^`{|}~]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i;
44
44
  var validateEmail = (value) => emailRegex.test(value);
45
- var DioNewsletterSubscribe = class extends HTMLElement {
45
+ var DioNewsAlertSubscribe = class extends HTMLElement {
46
46
  #abort = null;
47
47
  connectedCallback() {
48
48
  if (document.readyState !== "loading") {
@@ -140,8 +140,8 @@ var DioNewsletterSubscribe = class extends HTMLElement {
140
140
  this.#abort = null;
141
141
  }
142
142
  #getSubscribeUrl() {
143
- const endpoint = this.dataset.newsletterEndpoint;
144
- const subscribeId = this.dataset.newsletterSubscribeId;
143
+ const endpoint = this.dataset.newsAlertEndpoint;
144
+ const subscribeId = this.dataset.newsAlertSubscribeId;
145
145
  if (!endpoint || !subscribeId) return null;
146
146
  return `${endpoint.replace(/\/$/, "")}/${encodeURIComponent(subscribeId)}`;
147
147
  }
@@ -267,11 +267,8 @@ var DioSearchAutocomplete = class extends HTMLElement {
267
267
  // src/timeline/Timeline.ts
268
268
  var DioTimeline = class extends HTMLElement {
269
269
  connectedCallback() {
270
- const list = this.matches(".dio-timeline") ? this : this.querySelector(".dio-timeline");
271
270
  const reverseBtn = this.querySelector("[data-toggle-reverse-timeline]");
272
271
  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
272
  reverseBtn?.addEventListener("click", () => {
276
273
  const reversed = reverseBtn.getAttribute("data-reversed") === "true";
277
274
  const nextReversed = !reversed;
@@ -280,10 +277,13 @@ var DioTimeline = class extends HTMLElement {
280
277
  if (label) {
281
278
  label.textContent = nextReversed ? reverseBtn.getAttribute("data-reversed-text") ?? "" : reverseBtn.getAttribute("data-initial-text") ?? "";
282
279
  }
283
- if (list) list.style.flexDirection = nextReversed ? "column-reverse" : "";
284
- eventLists().forEach((eventList) => {
285
- eventList.style.flexDirection = nextReversed ? "column-reverse" : "";
286
- });
280
+ this.querySelectorAll("[data-timeline-event-list]").forEach(
281
+ (eventList) => {
282
+ const fragment = document.createDocumentFragment();
283
+ [...eventList.children].reverse().forEach((child) => fragment.appendChild(child));
284
+ eventList.appendChild(fragment);
285
+ }
286
+ );
287
287
  });
288
288
  expandBtn?.addEventListener("click", () => {
289
289
  const expanded = expandBtn.getAttribute("data-expanded") === "true";
@@ -292,7 +292,7 @@ var DioTimeline = class extends HTMLElement {
292
292
  if (label) {
293
293
  label.textContent = expanded ? expandBtn.getAttribute("data-initial-text") ?? "" : expandBtn.getAttribute("data-active-text") ?? "";
294
294
  }
295
- events().forEach((event) => {
295
+ this.querySelectorAll("[data-timeline-event]").forEach((event) => {
296
296
  event.open = !expanded;
297
297
  });
298
298
  });
@@ -317,14 +317,14 @@ var define = (name, ctor) => {
317
317
  };
318
318
  define("dio-carousel", DioCarousel);
319
319
  define("dio-feedback-banner", DioFeedbackBanner);
320
- define("dio-newsletter-subscribe", DioNewsletterSubscribe);
320
+ define("dio-news-alert-subscribe", DioNewsAlertSubscribe);
321
321
  define("dio-search-autocomplete", DioSearchAutocomplete);
322
322
  define("dio-timeline", DioTimeline);
323
323
  define("dio-to-top-of-page", DioToTopOfPage);
324
324
  export {
325
325
  DioCarousel,
326
326
  DioFeedbackBanner,
327
- DioNewsletterSubscribe,
327
+ DioNewsAlertSubscribe,
328
328
  DioSearchAutocomplete,
329
329
  DioTimeline,
330
330
  DioToTopOfPage
package/dist/web.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
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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",
3
+ "sources": ["../src/carousel/Carousel.ts", "../src/feedback-banner/FeedbackBanner.ts", "../src/news-alert-subscribe/NewsAlertSubscribe.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 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 \"./carousel/Carousel\"\nimport { DioFeedbackBanner } from \"./feedback-banner/FeedbackBanner\"\nimport { DioNewsAlertSubscribe } from \"./news-alert-subscribe/NewsAlertSubscribe\"\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 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,77 +1,90 @@
1
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"
2
+ "name": "@dep-dio/dio-designsystem",
3
+ "version": "0.3.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"
25
10
  },
26
- "./web": {
27
- "types": "./dist/web.d.ts",
28
- "import": "./dist/web.js"
11
+ "files": [
12
+ "dist",
13
+ "designsystemet.config.json"
14
+ ],
15
+ "type": "module",
16
+ "sideEffects": [
17
+ "**/*.css",
18
+ "**/*.scss",
19
+ "./dist/web.js",
20
+ "./dist/svg-icons-register.js"
21
+ ],
22
+ "exports": {
23
+ "./icons": {
24
+ "types": "./dist/icons.d.ts",
25
+ "import": "./dist/icons.js"
26
+ },
27
+ "./web": {
28
+ "types": "./dist/web.d.ts",
29
+ "import": "./dist/web.js"
30
+ },
31
+ "./svg-icons-register": {
32
+ "types": "./dist/svg-icons-register.d.ts",
33
+ "import": "./dist/svg-icons-register.js"
34
+ },
35
+ "./vite-icons-plugin": {
36
+ "types": "./dist/vite-icons-plugin.d.ts",
37
+ "import": "./dist/vite-icons-plugin.js"
38
+ },
39
+ "./styles": {
40
+ "types": "./dist/styles.d.ts",
41
+ "default": "./dist/styles/main.css"
42
+ },
43
+ "./styles.css": "./dist/styles/main.css",
44
+ "./scss-utils": "./dist/styles/scss-utils.scss",
45
+ "./designsystemet.config.json": "./designsystemet.config.json",
46
+ "./types": {
47
+ "types": "./dist/types.d.ts"
48
+ }
29
49
  },
30
- "./svg-icons-register": {
31
- "types": "./dist/svg-icons-register.d.ts",
32
- "import": "./dist/svg-icons-register.js"
50
+ "publishConfig": {
51
+ "access": "public"
33
52
  },
34
- "./vite-icons-plugin": {
35
- "types": "./dist/vite-icons-plugin.d.ts",
36
- "import": "./dist/vite-icons-plugin.js"
53
+ "scripts": {
54
+ "build": "npm run tokens && npm run prepare-dist && npm run build:js",
55
+ "build:js": "node scripts/build-js.mjs && tsc -p tsconfig.build.json",
56
+ "prepare-dist": "node scripts/prepare-dist.mjs",
57
+ "prepublishOnly": "npm run build",
58
+ "tokens": "npm run tokens:create && npm run tokens:patch && npm run tokens:build",
59
+ "tokens:build": "designsystemet tokens build --config designsystemet.config.json",
60
+ "tokens:create": "designsystemet tokens create --config designsystemet.config.json",
61
+ "tokens:patch": "node scripts/patch-tokens.mjs"
37
62
  },
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
63
+ "dependencies": {
64
+ "@digdir/designsystemet-css": "^1.18.0",
65
+ "@digdir/designsystemet-types": "^1.18.0",
66
+ "@digdir/designsystemet-web": "^1.18.0",
67
+ "@navikt/aksel-icons": "^8.16.1"
65
68
  },
66
- "vite-plugin-svg-icons": {
67
- "optional": true
69
+ "devDependencies": {
70
+ "@digdir/designsystemet": "^1.18.0",
71
+ "esbuild": "^0.28.1",
72
+ "fast-glob": "^3.3.3",
73
+ "sass": "^1.102.0",
74
+ "typescript": "~7.0.2",
75
+ "vite": "^8.1.5",
76
+ "vite-plugin-svg-icons": "^2.0.1"
77
+ },
78
+ "peerDependencies": {
79
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0",
80
+ "vite-plugin-svg-icons": "^2.0.0"
81
+ },
82
+ "peerDependenciesMeta": {
83
+ "vite": {
84
+ "optional": true
85
+ },
86
+ "vite-plugin-svg-icons": {
87
+ "optional": true
88
+ }
68
89
  }
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
- }
90
+ }
@@ -1,48 +0,0 @@
1
- @mixin dio-text-heading-1 {
2
- font-weight: var(--ds-heading-xl-font-weight);
3
- line-height: var(--ds-heading-xl-line-height);
4
- font-size: var(--ds-heading-xl-font-size);
5
- letter-spacing: var(--ds-heading-xl-letter-spacing);
6
- }
7
-
8
- @mixin dio-text-heading-2 {
9
- font-size: var(--ds-heading-lg-font-size);
10
- font-weight: var(--ds-heading-lg-font-weight);
11
- letter-spacing: var(--ds-heading-lg-letter-spacing);
12
- line-height: var(--ds-heading-lg-line-height);
13
- }
14
-
15
- @mixin dio-text-heading-3 {
16
- font-weight: var(--ds-heading-sm-font-weight);
17
- line-height: var(--ds-heading-sm-line-height);
18
- font-size: var(--ds-heading-sm-font-size);
19
- letter-spacing: var(--ds-heading-sm-letter-spacing);
20
- }
21
-
22
- @mixin dio-text-heading-4 {
23
- font-size: var(--ds-heading-xs-font-size);
24
- font-weight: var(--ds-heading-xs-font-weight);
25
- letter-spacing: var(--ds-heading-xs-letter-spacing);
26
- line-height: var(--ds-heading-xs-line-height);
27
- }
28
-
29
- @mixin dio-text-large {
30
- font-weight: var(--ds-body-xl-font-weight);
31
- line-height: var(--ds-body-xl-line-height);
32
- font-size: var(--ds-body-xl-font-size);
33
- letter-spacing: var(--ds-body-xl-letter-spacing);
34
- }
35
-
36
- @mixin dio-text-base {
37
- font-weight: var(--ds-body-md-font-weight);
38
- line-height: var(--ds-body-md-line-height);
39
- font-size: var(--ds-body-md-font-size);
40
- letter-spacing: var(--ds-body-md-letter-spacing);
41
- }
42
-
43
- @mixin dio-text-small {
44
- font-weight: var(--ds-body-sm-font-weight);
45
- line-height: var(--ds-body-sm-line-height);
46
- font-size: var(--ds-body-sm-font-size);
47
- letter-spacing: var(--ds-body-sm-letter-spacing);
48
- }