@fristil/designsystem 0.4.0 → 0.5.1
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/CHANGELOG.md +136 -0
- package/README.md +22 -7
- package/dist/components/frittstaende/connection-status/connection-status.d.ts +28 -0
- package/dist/components/frittstaende/connection-status/connection-status.d.ts.map +1 -0
- package/dist/components/frittstaende/connection-status/connection-status.js +22 -0
- package/dist/components/frittstaende/connection-status/connection-status.js.map +1 -0
- package/dist/components/frittstaende/connection-status/fs-connection-status.d.ts +54 -0
- package/dist/components/frittstaende/connection-status/fs-connection-status.d.ts.map +1 -0
- package/dist/components/frittstaende/connection-status/fs-connection-status.js +123 -0
- package/dist/components/frittstaende/connection-status/fs-connection-status.js.map +1 -0
- package/dist/components/frittstaende/session-timeout/fs-session-timeout.d.ts +56 -0
- package/dist/components/frittstaende/session-timeout/fs-session-timeout.d.ts.map +1 -0
- package/dist/components/frittstaende/session-timeout/fs-session-timeout.js +183 -0
- package/dist/components/frittstaende/session-timeout/fs-session-timeout.js.map +1 -0
- package/dist/components/frittstaende/session-timeout/session-timeout.d.ts +28 -0
- package/dist/components/frittstaende/session-timeout/session-timeout.d.ts.map +1 -0
- package/dist/components/frittstaende/session-timeout/session-timeout.js +22 -0
- package/dist/components/frittstaende/session-timeout/session-timeout.js.map +1 -0
- package/dist/components/frittstaende/toast/fs-toast.d.ts +16 -22
- package/dist/components/frittstaende/toast/fs-toast.d.ts.map +1 -1
- package/dist/components/frittstaende/toast/fs-toast.js +38 -27
- package/dist/components/frittstaende/toast/fs-toast.js.map +1 -1
- package/dist/components/frittstaende/toast/toast.d.ts +34 -0
- package/dist/components/frittstaende/toast/toast.d.ts.map +1 -0
- package/dist/components/frittstaende/toast/toast.js +26 -0
- package/dist/components/frittstaende/toast/toast.js.map +1 -0
- package/dist/components/ramme/error-summary/error-summary.d.ts +39 -0
- package/dist/components/ramme/error-summary/error-summary.d.ts.map +1 -0
- package/dist/components/ramme/error-summary/error-summary.js +31 -0
- package/dist/components/ramme/error-summary/error-summary.js.map +1 -0
- package/dist/components/ramme/error-summary/fs-error-summary.d.ts +16 -42
- package/dist/components/ramme/error-summary/fs-error-summary.d.ts.map +1 -1
- package/dist/components/ramme/error-summary/fs-error-summary.js +57 -92
- package/dist/components/ramme/error-summary/fs-error-summary.js.map +1 -1
- package/dist/components/ramme/field/field-core.d.ts +37 -0
- package/dist/components/ramme/field/field-core.d.ts.map +1 -1
- package/dist/components/ramme/field/field-core.js +37 -0
- package/dist/components/ramme/field/field-core.js.map +1 -1
- package/dist/components/ramme/field/fs-field.d.ts +39 -40
- package/dist/components/ramme/field/fs-field.d.ts.map +1 -1
- package/dist/components/ramme/field/fs-field.js +128 -54
- package/dist/components/ramme/field/fs-field.js.map +1 -1
- package/dist/components/ramme/popover/fs-popover.d.ts +20 -27
- package/dist/components/ramme/popover/fs-popover.d.ts.map +1 -1
- package/dist/components/ramme/popover/fs-popover.js +68 -54
- package/dist/components/ramme/popover/fs-popover.js.map +1 -1
- package/dist/components/ramme/popover/popover.d.ts +43 -0
- package/dist/components/ramme/popover/popover.d.ts.map +1 -0
- package/dist/components/ramme/popover/popover.js +49 -0
- package/dist/components/ramme/popover/popover.js.map +1 -0
- package/dist/components/ramme/suggestion/fs-suggestion.d.ts +75 -0
- package/dist/components/ramme/suggestion/fs-suggestion.d.ts.map +1 -0
- package/dist/components/ramme/suggestion/fs-suggestion.js +232 -0
- package/dist/components/ramme/suggestion/fs-suggestion.js.map +1 -0
- package/dist/components/ramme/suggestion/suggestion.d.ts +97 -0
- package/dist/components/ramme/suggestion/suggestion.d.ts.map +1 -0
- package/dist/components/ramme/suggestion/suggestion.js +79 -0
- package/dist/components/ramme/suggestion/suggestion.js.map +1 -0
- package/dist/components/ramme/tabs/fs-tabs.d.ts +31 -36
- package/dist/components/ramme/tabs/fs-tabs.d.ts.map +1 -1
- package/dist/components/ramme/tabs/fs-tabs.js +62 -84
- package/dist/components/ramme/tabs/fs-tabs.js.map +1 -1
- package/dist/components/ramme/tabs/tabs.d.ts +50 -0
- package/dist/components/ramme/tabs/tabs.d.ts.map +1 -0
- package/dist/components/ramme/tabs/tabs.js +54 -0
- package/dist/components/ramme/tabs/tabs.js.map +1 -0
- package/dist/fs.d.ts +94 -0
- package/dist/fs.d.ts.map +1 -1
- package/dist/fs.js +42 -0
- package/dist/fs.js.map +1 -1
- package/dist/index.d.ts +10 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/jsx/react.d.ts +35 -50
- package/dist/jsx/react.d.ts.map +1 -1
- package/dist/react.d.ts +142 -1
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +77 -2
- package/dist/react.js.map +1 -1
- package/package.json +15 -18
- package/src/components/frittstaende/connection-status/connection-status.css +33 -0
- package/src/components/frittstaende/connection-status/connection-status.ts +41 -0
- package/src/components/frittstaende/connection-status/fs-connection-status.ts +144 -0
- package/src/components/frittstaende/session-timeout/fs-session-timeout.ts +216 -0
- package/src/components/frittstaende/session-timeout/session-timeout.css +43 -0
- package/src/components/frittstaende/session-timeout/session-timeout.ts +42 -0
- package/src/components/frittstaende/toast/fs-toast.ts +39 -30
- package/src/components/frittstaende/toast/toast.ts +45 -0
- package/src/components/ramme/error-summary/error-summary.ts +55 -0
- package/src/components/ramme/error-summary/fs-error-summary.ts +62 -119
- package/src/components/ramme/field/field-core.ts +38 -0
- package/src/components/ramme/field/fs-field.ts +145 -61
- package/src/components/ramme/popover/fs-popover.ts +78 -72
- package/src/components/ramme/popover/popover.ts +79 -0
- package/src/components/ramme/suggestion/fs-suggestion.ts +265 -0
- package/src/components/ramme/suggestion/suggestion.ts +105 -0
- package/src/components/ramme/tabs/fs-tabs.ts +67 -98
- package/src/components/ramme/tabs/tabs.ts +104 -0
- package/dist/components/frittstaende/calendar/fs-calendar.d.ts +0 -52
- package/dist/components/frittstaende/calendar/fs-calendar.d.ts.map +0 -1
- package/dist/components/frittstaende/calendar/fs-calendar.js +0 -462
- package/dist/components/frittstaende/calendar/fs-calendar.js.map +0 -1
- package/dist/components/frittstaende/date-field/fs-date-field.d.ts +0 -110
- package/dist/components/frittstaende/date-field/fs-date-field.d.ts.map +0 -1
- package/dist/components/frittstaende/date-field/fs-date-field.js +0 -264
- package/dist/components/frittstaende/date-field/fs-date-field.js.map +0 -1
- package/dist/components/frittstaende/suggestion/fs-suggestion.d.ts +0 -133
- package/dist/components/frittstaende/suggestion/fs-suggestion.d.ts.map +0 -1
- package/dist/components/frittstaende/suggestion/fs-suggestion.js +0 -280
- package/dist/components/frittstaende/suggestion/fs-suggestion.js.map +0 -1
- package/src/components/frittstaende/calendar/fs-calendar.ts +0 -525
- package/src/components/frittstaende/date-field/date-field.css +0 -54
- package/src/components/frittstaende/date-field/fs-date-field.ts +0 -309
- package/src/components/frittstaende/suggestion/fs-suggestion.ts +0 -333
- /package/src/components/{frittstaende → ramme}/suggestion/suggestion.css +0 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { SESSION_TIMEOUT_CLASS, SESSION_TIMEOUT_DIALOG_CLASS, } from "./session-timeout.js";
|
|
2
|
+
export const FS_SESSION_TIMEOUT_TAG = "fs-session-timeout";
|
|
3
|
+
/** Sekundene som skal leses opp. Hvert sekund ville vært uutholdelig. */
|
|
4
|
+
const ANNONSER_VED = new Set([120, 60, 30, 10]);
|
|
5
|
+
function klokke(sekunder) {
|
|
6
|
+
const m = Math.floor(sekunder / 60);
|
|
7
|
+
const s = sekunder % 60;
|
|
8
|
+
return `${m}:${String(s).padStart(2, "0")}`;
|
|
9
|
+
}
|
|
10
|
+
function ord(sekunder) {
|
|
11
|
+
if (sekunder >= 60) {
|
|
12
|
+
const m = Math.round(sekunder / 60);
|
|
13
|
+
return m === 1 ? "ett minutt" : `${m} minutter`;
|
|
14
|
+
}
|
|
15
|
+
return sekunder === 1 ? "ett sekund" : `${sekunder} sekunder`;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Varsler før en innlogget økt går ut.
|
|
19
|
+
*
|
|
20
|
+
* Dette er tingen hver store organisasjon bygger selv og gjør feil. Enten
|
|
21
|
+
* kommer det ingen advarsel, og brukeren mister et halvutfylt søknadsskjema,
|
|
22
|
+
* eller så stjeler dialogen fokus midt i en setning, eller så leser
|
|
23
|
+
* skjermleseren nedtellingen hvert sekund.
|
|
24
|
+
*
|
|
25
|
+
* Komponenten er frittstående fordi nedtellingen er klientens klokke. Tallet
|
|
26
|
+
* endrer seg ut fra når brukeren sist rørte tastaturet, og det er ingenting
|
|
27
|
+
* en server kan sende. Den bærer heller ingen verdi inn i en innsending.
|
|
28
|
+
*
|
|
29
|
+
* Dialogen er en ekte `<dialog>` med `showModal()`, så fokusfellen, Escape og
|
|
30
|
+
* topplaget kommer fra nettleseren. Fokus går tilbake dit brukeren var.
|
|
31
|
+
*
|
|
32
|
+
* ```html
|
|
33
|
+
* <fs-session-timeout class="fs-session-timeout" warn-at="1500" expires-at="1800"
|
|
34
|
+
* data-ignore-morph></fs-session-timeout>
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* ```ts
|
|
38
|
+
* document.querySelector("fs-session-timeout")
|
|
39
|
+
* .addEventListener("session-extend", () => fetch("/forleng", { method: "POST" }))
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export class FsSessionTimeout extends HTMLElement {
|
|
43
|
+
constructor() {
|
|
44
|
+
super(...arguments);
|
|
45
|
+
this.lastActivity = Date.now();
|
|
46
|
+
this.forrigeFokus = null;
|
|
47
|
+
this.registerActivity = () => {
|
|
48
|
+
if (this.dialog?.open)
|
|
49
|
+
return;
|
|
50
|
+
this.lastActivity = Date.now();
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** Sekunder uten aktivitet før varselet kommer. */
|
|
54
|
+
get warnAt() {
|
|
55
|
+
return Number(this.getAttribute("warn-at")) || 25 * 60;
|
|
56
|
+
}
|
|
57
|
+
/** Sekunder uten aktivitet før økten er ute. */
|
|
58
|
+
get expiresAt() {
|
|
59
|
+
return Number(this.getAttribute("expires-at")) || 30 * 60;
|
|
60
|
+
}
|
|
61
|
+
connectedCallback() {
|
|
62
|
+
this.classList.add(SESSION_TIMEOUT_CLASS);
|
|
63
|
+
// Dialogen bygges først når den skal vises, ikke her. Lagde vi den med
|
|
64
|
+
// én gang, sto den i DOM-en før React rakk å hydrere, og React fant et
|
|
65
|
+
// element den ikke hadde rendret. `<fs-toast>` og
|
|
66
|
+
// `<fs-connection-status>` gjør det på samme måte.
|
|
67
|
+
for (const navn of ["pointerdown", "keydown", "scroll"]) {
|
|
68
|
+
document.addEventListener(navn, this.registerActivity, { passive: true });
|
|
69
|
+
}
|
|
70
|
+
this.ticker = window.setInterval(() => this.tick(), 1000);
|
|
71
|
+
}
|
|
72
|
+
disconnectedCallback() {
|
|
73
|
+
for (const navn of ["pointerdown", "keydown", "scroll"]) {
|
|
74
|
+
document.removeEventListener(navn, this.registerActivity);
|
|
75
|
+
}
|
|
76
|
+
if (this.ticker)
|
|
77
|
+
window.clearInterval(this.ticker);
|
|
78
|
+
this.ticker = undefined;
|
|
79
|
+
}
|
|
80
|
+
build() {
|
|
81
|
+
if (this.dialog)
|
|
82
|
+
return;
|
|
83
|
+
const dialog = document.createElement("dialog");
|
|
84
|
+
dialog.className = SESSION_TIMEOUT_DIALOG_CLASS;
|
|
85
|
+
// alertdialog og ikke dialog: dette er en avbrytelse brukeren ikke ba om,
|
|
86
|
+
// og da skal skjermleseren lese hele innholdet når den åpnes.
|
|
87
|
+
dialog.setAttribute("aria-labelledby", "fs-session-timeout-title");
|
|
88
|
+
dialog.setAttribute("role", "alertdialog");
|
|
89
|
+
const tittel = document.createElement("h2");
|
|
90
|
+
tittel.className = "fs-session-timeout__title";
|
|
91
|
+
tittel.id = "fs-session-timeout-title";
|
|
92
|
+
tittel.textContent = "Du blir snart logget ut";
|
|
93
|
+
const tekst = document.createElement("p");
|
|
94
|
+
tekst.className = "fs-session-timeout__text";
|
|
95
|
+
tekst.append("Vi logger deg ut om ");
|
|
96
|
+
const count = document.createElement("span");
|
|
97
|
+
count.className = "fs-session-timeout__count";
|
|
98
|
+
// Tallet oppdateres hvert sekund. Leses det opp hver gang, blir dialogen
|
|
99
|
+
// ubrukelig med skjermleser, så opplesningen skjer i live-området under.
|
|
100
|
+
count.setAttribute("aria-hidden", "true");
|
|
101
|
+
tekst.append(count, " for å beskytte opplysningene dine.");
|
|
102
|
+
const live = document.createElement("span");
|
|
103
|
+
live.className = "fs-sr-only";
|
|
104
|
+
live.setAttribute("role", "status");
|
|
105
|
+
live.setAttribute("aria-live", "polite");
|
|
106
|
+
const knapper = document.createElement("div");
|
|
107
|
+
knapper.className = "fs-session-timeout__actions";
|
|
108
|
+
const fortsett = document.createElement("button");
|
|
109
|
+
fortsett.type = "button";
|
|
110
|
+
fortsett.className = "fs-button";
|
|
111
|
+
fortsett.textContent = "Fortsett å være innlogget";
|
|
112
|
+
fortsett.addEventListener("click", () => this.extend());
|
|
113
|
+
const loggUt = document.createElement("button");
|
|
114
|
+
loggUt.type = "button";
|
|
115
|
+
loggUt.className = "fs-button";
|
|
116
|
+
loggUt.dataset.variant = "secondary";
|
|
117
|
+
loggUt.textContent = "Logg ut nå";
|
|
118
|
+
loggUt.addEventListener("click", () => {
|
|
119
|
+
this.close();
|
|
120
|
+
this.emit("session-logout");
|
|
121
|
+
});
|
|
122
|
+
knapper.append(fortsett, loggUt);
|
|
123
|
+
dialog.append(tittel, tekst, live, knapper);
|
|
124
|
+
this.append(dialog);
|
|
125
|
+
this.dialog = dialog;
|
|
126
|
+
this.countElement = count;
|
|
127
|
+
this.liveElement = live;
|
|
128
|
+
}
|
|
129
|
+
tick() {
|
|
130
|
+
const gått = Math.floor((Date.now() - this.lastActivity) / 1000);
|
|
131
|
+
const igjen = this.expiresAt - gått;
|
|
132
|
+
if (igjen <= 0) {
|
|
133
|
+
this.close();
|
|
134
|
+
this.emit("session-expired");
|
|
135
|
+
this.lastActivity = Date.now();
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (gått < this.warnAt)
|
|
139
|
+
return;
|
|
140
|
+
if (!this.dialog?.open)
|
|
141
|
+
this.open();
|
|
142
|
+
if (this.countElement)
|
|
143
|
+
this.countElement.textContent = klokke(igjen);
|
|
144
|
+
if (this.liveElement && ANNONSER_VED.has(igjen)) {
|
|
145
|
+
this.liveElement.textContent = `Du blir logget ut om ${ord(igjen)}.`;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
open() {
|
|
149
|
+
this.build();
|
|
150
|
+
if (!this.dialog || this.dialog.open)
|
|
151
|
+
return;
|
|
152
|
+
// Fokus skal tilbake dit brukeren var. Uten dette starter neste
|
|
153
|
+
// tastetrykk på toppen av siden, midt i et skjema.
|
|
154
|
+
this.forrigeFokus = document.activeElement;
|
|
155
|
+
this.dialog.showModal();
|
|
156
|
+
this.emit("session-warn");
|
|
157
|
+
}
|
|
158
|
+
close() {
|
|
159
|
+
if (!this.dialog?.open)
|
|
160
|
+
return;
|
|
161
|
+
this.dialog.close();
|
|
162
|
+
if (this.liveElement)
|
|
163
|
+
this.liveElement.textContent = "";
|
|
164
|
+
this.forrigeFokus?.focus();
|
|
165
|
+
this.forrigeFokus = null;
|
|
166
|
+
}
|
|
167
|
+
emit(navn) {
|
|
168
|
+
this.dispatchEvent(new CustomEvent(navn, { bubbles: true, composed: true }));
|
|
169
|
+
}
|
|
170
|
+
/** Forlenger økten og lukker varselet. Kall den når serveren har svart. */
|
|
171
|
+
extend() {
|
|
172
|
+
this.lastActivity = Date.now();
|
|
173
|
+
this.close();
|
|
174
|
+
this.emit("session-extend");
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
FsSessionTimeout.observedAttributes = ["warn-at", "expires-at"];
|
|
178
|
+
export function defineFsSessionTimeout(tagName = FS_SESSION_TIMEOUT_TAG) {
|
|
179
|
+
if (!customElements.get(tagName)) {
|
|
180
|
+
customElements.define(tagName, FsSessionTimeout);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=fs-session-timeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs-session-timeout.js","sourceRoot":"","sources":["../../../../src/components/frittstaende/session-timeout/fs-session-timeout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export declare const SESSION_TIMEOUT_CLASS: "fs-session-timeout";
|
|
2
|
+
export declare const SESSION_TIMEOUT_DIALOG_CLASS: "fs-session-timeout__dialog";
|
|
3
|
+
export type SessionTimeoutOptions = {
|
|
4
|
+
/** Sekunder uten aktivitet før varselet kommer. Standard: 25 minutter. */
|
|
5
|
+
warnAt?: number;
|
|
6
|
+
/** Sekunder uten aktivitet før økten er ute. Standard: 30 minutter. */
|
|
7
|
+
expiresAt?: number;
|
|
8
|
+
};
|
|
9
|
+
export type SessionTimeoutAttributes = {
|
|
10
|
+
class: typeof SESSION_TIMEOUT_CLASS;
|
|
11
|
+
"warn-at"?: string;
|
|
12
|
+
"expires-at"?: string;
|
|
13
|
+
"data-ignore-morph": "";
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Attributtene for varselet om at innlogget økt går ut.
|
|
17
|
+
*
|
|
18
|
+
* Nedtellingen er klientens klokke, og endrer seg hvert sekund ut fra når
|
|
19
|
+
* brukeren sist rørte tastaturet. Det er en tilstand ingen server kan sende,
|
|
20
|
+
* og derfor eier komponenten alt inni seg. `data-ignore-morph` er ikke
|
|
21
|
+
* valgfri: uten den river Datastars morfing dialogen bort mens den står åpen.
|
|
22
|
+
*
|
|
23
|
+
* ```ts
|
|
24
|
+
* <fs-session-timeout {...fs.sessionTimeout({ warnAt: 1500, expiresAt: 1800 })} />
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare const sessionTimeout: ({ warnAt, expiresAt, }?: SessionTimeoutOptions) => SessionTimeoutAttributes;
|
|
28
|
+
//# sourceMappingURL=session-timeout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-timeout.d.ts","sourceRoot":"","sources":["../../../../src/components/frittstaende/session-timeout/session-timeout.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB,EAAG,oBAA6B,CAAA;AAClE,eAAO,MAAM,4BAA4B,EACvC,4BAAqC,CAAA;AAEvC,MAAM,MAAM,qBAAqB,GAAG;IAClC,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,OAAO,qBAAqB,CAAA;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mBAAmB,EAAE,EAAE,CAAA;CACxB,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,cAAc,GAAI,yBAG5B,qBAA0B,KAAG,wBAM5B,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { attributes } from "../../css/shared.js";
|
|
2
|
+
export const SESSION_TIMEOUT_CLASS = "fs-session-timeout";
|
|
3
|
+
export const SESSION_TIMEOUT_DIALOG_CLASS = "fs-session-timeout__dialog";
|
|
4
|
+
/**
|
|
5
|
+
* Attributtene for varselet om at innlogget økt går ut.
|
|
6
|
+
*
|
|
7
|
+
* Nedtellingen er klientens klokke, og endrer seg hvert sekund ut fra når
|
|
8
|
+
* brukeren sist rørte tastaturet. Det er en tilstand ingen server kan sende,
|
|
9
|
+
* og derfor eier komponenten alt inni seg. `data-ignore-morph` er ikke
|
|
10
|
+
* valgfri: uten den river Datastars morfing dialogen bort mens den står åpen.
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* <fs-session-timeout {...fs.sessionTimeout({ warnAt: 1500, expiresAt: 1800 })} />
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export const sessionTimeout = ({ warnAt = 25 * 60, expiresAt = 30 * 60, } = {}) => attributes({
|
|
17
|
+
class: SESSION_TIMEOUT_CLASS,
|
|
18
|
+
"warn-at": warnAt === 25 * 60 ? undefined : String(warnAt),
|
|
19
|
+
"expires-at": expiresAt === 30 * 60 ? undefined : String(expiresAt),
|
|
20
|
+
"data-ignore-morph": "",
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=session-timeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-timeout.js","sourceRoot":"","sources":["../../../../src/components/frittstaende/session-timeout/session-timeout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,MAAM,CAAC,MAAM,qBAAqB,GAAG,oBAA6B,CAAA;AAClE,MAAM,CAAC,MAAM,4BAA4B,GACvC,4BAAqC,CAAA;AAgBvC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAC7B,MAAM,GAAG,EAAE,GAAG,EAAE,EAChB,SAAS,GAAG,EAAE,GAAG,EAAE,MACM,EAAE,EAA4B,EAAE,CACzD,UAAU,CAAC;IACT,KAAK,EAAE,qBAAqB;IAC5B,SAAS,EAAE,MAAM,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IAC1D,YAAY,EAAE,SAAS,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;IACnE,mBAAmB,EAAE,EAAW;CACjC,CAAC,CAAA"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import { LitElement } from "lit";
|
|
2
1
|
export declare const FS_TOAST_TAG: "fs-toast";
|
|
3
|
-
export declare const TOAST_CLASS: "fs-toast";
|
|
4
|
-
export declare const TOAST_CLOSE_CLASS: "fs-toast__close";
|
|
5
2
|
export declare const toastColors: readonly ["neutral", "success", "warning", "danger"];
|
|
6
3
|
export type ToastColor = (typeof toastColors)[number];
|
|
7
|
-
export type
|
|
4
|
+
export type ShowOptions = {
|
|
8
5
|
/** Hva meldingen betyr. Standard: `neutral`. */
|
|
9
6
|
color?: ToastColor;
|
|
10
7
|
/** Millisekunder før meldingen forsvinner. `0` lar den bli stående. */
|
|
@@ -15,8 +12,15 @@ export type ToastOptions = {
|
|
|
15
12
|
/**
|
|
16
13
|
* Køen av korte meldinger i hjørnet av skjermen.
|
|
17
14
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
15
|
+
* Dette er den eneste frittstående komponenten, og den eneste delen av pakken
|
|
16
|
+
* du kaller i stedet for å skrive. Elementet er beholderen, ikke meldingen:
|
|
17
|
+
* du legger det inn én gang i appen og kaller `show()` når noe skal meldes.
|
|
18
|
+
* Meldingene finnes ikke før en hendelse på klienten skaper dem, så det er
|
|
19
|
+
* ingenting for serveren å rendre.
|
|
20
|
+
*
|
|
21
|
+
* Serveren skriver beholderen med `fs.toast()`, og den setter
|
|
22
|
+
* `data-ignore-morph`. Uten det river Datastars morfing meldingene bort ved
|
|
23
|
+
* neste patch, fordi serverens utgave av regionen er tom.
|
|
20
24
|
*
|
|
21
25
|
* Beholderen er en `role="status"`-region, ikke `role="alert"`. En melding
|
|
22
26
|
* som dukker opp i hjørnet skal ikke avbryte det skjermleseren holder på med;
|
|
@@ -34,25 +38,15 @@ export type ToastOptions = {
|
|
|
34
38
|
* })
|
|
35
39
|
* ```
|
|
36
40
|
*/
|
|
37
|
-
export declare class FsToast extends
|
|
38
|
-
static
|
|
39
|
-
duration: {
|
|
40
|
-
type: NumberConstructor;
|
|
41
|
-
};
|
|
42
|
-
label: {
|
|
43
|
-
type: StringConstructor;
|
|
44
|
-
};
|
|
45
|
-
};
|
|
41
|
+
export declare class FsToast extends HTMLElement {
|
|
42
|
+
static observedAttributes: string[];
|
|
46
43
|
/** Standard levetid i millisekunder. `0` lar meldingene bli stående. */
|
|
47
|
-
duration: number;
|
|
48
|
-
|
|
49
|
-
label: string;
|
|
50
|
-
createRenderRoot(): this;
|
|
51
|
-
render(): import("lit").TemplateResult<1>;
|
|
44
|
+
get duration(): number;
|
|
45
|
+
set duration(value: number);
|
|
52
46
|
connectedCallback(): void;
|
|
53
|
-
|
|
47
|
+
attributeChangedCallback(navn: string, _gammel: string, ny: string): void;
|
|
54
48
|
/** Viser en melding, og returnerer elementet den ble lagt i. */
|
|
55
|
-
show(message: string, options?:
|
|
49
|
+
show(message: string, options?: ShowOptions): HTMLElement;
|
|
56
50
|
/** Fjerner en melding. */
|
|
57
51
|
dismiss(toast: HTMLElement): void;
|
|
58
52
|
/** Fjerner alle meldingene. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-toast.d.ts","sourceRoot":"","sources":["../../../../src/components/frittstaende/toast/fs-toast.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fs-toast.d.ts","sourceRoot":"","sources":["../../../../src/components/frittstaende/toast/fs-toast.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,EAAG,UAAmB,CAAA;AAE/C,eAAO,MAAM,WAAW,sDAAuD,CAAA;AAC/E,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAErD,MAAM,MAAM,WAAW,GAAG;IACxB,gDAAgD;IAChD,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,OAAQ,SAAQ,WAAW;IACtC,MAAM,CAAC,kBAAkB,WAAwB;IAEjD,wEAAwE;IACxE,IAAI,QAAQ,IAAI,MAAM,CAQrB;IAED,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,EAEzB;IAED,iBAAiB,IAAI,IAAI;IAazB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAMzE,gEAAgE;IAChE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,WAAW;IA2C7D,0BAA0B;IAC1B,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IASjC,+BAA+B;IAC/B,KAAK,IAAI,IAAI;CAKd;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,OAAO,CAAA;KACpB;CACF;AAED,wBAAgB,aAAa,CAAC,OAAO,aAAe,GAAG,IAAI,CAI1D"}
|
|
@@ -1,13 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TOAST_CLASS, TOAST_CLOSE_CLASS } from "./toast.js";
|
|
2
2
|
export const FS_TOAST_TAG = "fs-toast";
|
|
3
|
-
export const TOAST_CLASS = "fs-toast";
|
|
4
|
-
export const TOAST_CLOSE_CLASS = "fs-toast__close";
|
|
5
3
|
export const toastColors = ["neutral", "success", "warning", "danger"];
|
|
6
4
|
/**
|
|
7
5
|
* Køen av korte meldinger i hjørnet av skjermen.
|
|
8
6
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
7
|
+
* Dette er den eneste frittstående komponenten, og den eneste delen av pakken
|
|
8
|
+
* du kaller i stedet for å skrive. Elementet er beholderen, ikke meldingen:
|
|
9
|
+
* du legger det inn én gang i appen og kaller `show()` når noe skal meldes.
|
|
10
|
+
* Meldingene finnes ikke før en hendelse på klienten skaper dem, så det er
|
|
11
|
+
* ingenting for serveren å rendre.
|
|
12
|
+
*
|
|
13
|
+
* Serveren skriver beholderen med `fs.toast()`, og den setter
|
|
14
|
+
* `data-ignore-morph`. Uten det river Datastars morfing meldingene bort ved
|
|
15
|
+
* neste patch, fordi serverens utgave av regionen er tom.
|
|
11
16
|
*
|
|
12
17
|
* Beholderen er en `role="status"`-region, ikke `role="alert"`. En melding
|
|
13
18
|
* som dukker opp i hjørnet skal ikke avbryte det skjermleseren holder på med;
|
|
@@ -25,30 +30,39 @@ export const toastColors = ["neutral", "success", "warning", "danger"];
|
|
|
25
30
|
* })
|
|
26
31
|
* ```
|
|
27
32
|
*/
|
|
28
|
-
export class FsToast extends
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
export class FsToast extends HTMLElement {
|
|
34
|
+
/** Standard levetid i millisekunder. `0` lar meldingene bli stående. */
|
|
35
|
+
get duration() {
|
|
36
|
+
// `0` er en gyldig verdi og betyr at meldingene blir stående. Uten
|
|
37
|
+
// sjekken mot null her forsvant de likevel etter seks sekunder, og bare
|
|
38
|
+
// `show(..., { duration: 0 })` virket.
|
|
39
|
+
const rå = this.getAttribute("duration");
|
|
40
|
+
if (rå === null)
|
|
41
|
+
return 6000;
|
|
42
|
+
const value = Number(rå);
|
|
43
|
+
return Number.isFinite(value) && value >= 0 ? value : 6000;
|
|
38
44
|
}
|
|
39
|
-
|
|
40
|
-
|
|
45
|
+
set duration(value) {
|
|
46
|
+
this.setAttribute("duration", String(value));
|
|
41
47
|
}
|
|
42
48
|
connectedCallback() {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
this.
|
|
49
|
+
// Skrev serveren regionen med fs.toast(), står alt dette allerede. Her
|
|
50
|
+
// settes det bare når det mangler, så en ren HTML-side uten bygger også
|
|
51
|
+
// får en region skjermleseren forstår.
|
|
52
|
+
if (!this.hasAttribute("role"))
|
|
53
|
+
this.setAttribute("role", "status");
|
|
54
|
+
if (!this.hasAttribute("aria-live")) {
|
|
55
|
+
this.setAttribute("aria-live", "polite");
|
|
56
|
+
}
|
|
57
|
+
if (!this.hasAttribute("aria-label")) {
|
|
58
|
+
this.setAttribute("aria-label", this.getAttribute("label") ?? "Meldinger");
|
|
59
|
+
}
|
|
47
60
|
}
|
|
48
|
-
|
|
61
|
+
attributeChangedCallback(navn, _gammel, ny) {
|
|
49
62
|
// `label` kan settes etter at elementet står i DOM-en, for eksempel av et
|
|
50
63
|
// rammeverk som fyller inn attributtene i et senere steg.
|
|
51
|
-
|
|
64
|
+
if (navn === "label" && ny)
|
|
65
|
+
this.setAttribute("aria-label", ny);
|
|
52
66
|
}
|
|
53
67
|
/** Viser en melding, og returnerer elementet den ble lagt i. */
|
|
54
68
|
show(message, options = {}) {
|
|
@@ -96,10 +110,7 @@ export class FsToast extends LitElement {
|
|
|
96
110
|
}
|
|
97
111
|
}
|
|
98
112
|
}
|
|
99
|
-
FsToast.
|
|
100
|
-
duration: { type: Number },
|
|
101
|
-
label: { type: String },
|
|
102
|
-
};
|
|
113
|
+
FsToast.observedAttributes = ["duration", "label"];
|
|
103
114
|
export function defineFsToast(tagName = FS_TOAST_TAG) {
|
|
104
115
|
if (!customElements.get(tagName)) {
|
|
105
116
|
customElements.define(tagName, FsToast);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-toast.js","sourceRoot":"","sources":["../../../../src/components/frittstaende/toast/fs-toast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"fs-toast.js","sourceRoot":"","sources":["../../../../src/components/frittstaende/toast/fs-toast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE3D,MAAM,CAAC,MAAM,YAAY,GAAG,UAAmB,CAAA;AAE/C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAA;AAY/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,OAAO,OAAQ,SAAQ,WAAW;IAGtC,wEAAwE;IACxE,IAAI,QAAQ;QACV,mEAAmE;QACnE,wEAAwE;QACxE,uCAAuC;QACvC,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAA;QACxC,IAAI,EAAE,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,CAAA;QACxB,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;IAC5D,CAAC;IAED,IAAI,QAAQ,CAAC,KAAa;QACxB,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9C,CAAC;IAED,iBAAiB;QACf,uEAAuE;QACvE,wEAAwE;QACxE,uCAAuC;QACvC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QACnE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;QAC1C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,CAAA;QAC5E,CAAC;IACH,CAAC;IAED,wBAAwB,CAAC,IAAY,EAAE,OAAe,EAAE,EAAU;QAChE,0EAA0E;QAC1E,0DAA0D;QAC1D,IAAI,IAAI,KAAK,OAAO,IAAI,EAAE;YAAE,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;IACjE,CAAC;IAED,gEAAgE;IAChE,IAAI,CAAC,OAAe,EAAE,UAAuB,EAAE;QAC7C,MAAM,EACJ,KAAK,GAAG,SAAS,EACjB,QAAQ,GAAG,IAAI,CAAC,QAAQ,EACxB,UAAU,GAAG,cAAc,GAC5B,GAAG,OAAO,CAAA;QAEX,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QAC3C,KAAK,CAAC,SAAS,GAAG,WAAW,CAAA;QAC7B,IAAI,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAA;QAEpD,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QAC3C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAA;QAC1B,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAElB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QAC9C,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAA;QACrB,KAAK,CAAC,SAAS,GAAG,iBAAiB,CAAA;QACnC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;QAC5C,KAAK,CAAC,WAAW,GAAG,GAAG,CAAA;QACvB,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAC1D,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAEnB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAEnB,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,IAAI,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAA;YAElE,sEAAsE;YACtE,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;YAC9C,MAAM,MAAM,GAAG,GAAG,EAAE;gBAClB,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAA;YAChE,CAAC,CAAA;YAED,KAAK,CAAC,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;YAC3C,KAAK,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;YAC5C,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;YACxC,KAAK,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QAC5C,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED,0BAA0B;IAC1B,OAAO,CAAC,KAAkB;QACxB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAM;QACjC,KAAK,CAAC,MAAM,EAAE,CAAA;QAEd,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CACpE,CAAA;IACH,CAAC;IAED,+BAA+B;IAC/B,KAAK;QACH,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,WAAW,EAAE,CAAC,EAAE,CAAC;YAC7D,KAAK,CAAC,MAAM,EAAE,CAAA;QAChB,CAAC;IACH,CAAC;;AA/FM,0BAAkB,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;AAwGnD,MAAM,UAAU,aAAa,CAAC,OAAO,GAAG,YAAY;IAClD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACzC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export declare const TOAST_CLASS: "fs-toast";
|
|
2
|
+
export declare const TOAST_CLOSE_CLASS: "fs-toast__close";
|
|
3
|
+
export type ToastOptions = {
|
|
4
|
+
/** Tekst som sier hva regionen er. Blir `aria-label`. */
|
|
5
|
+
label?: string;
|
|
6
|
+
};
|
|
7
|
+
export type ToastAttributes = {
|
|
8
|
+
region: {
|
|
9
|
+
role: "status";
|
|
10
|
+
"aria-live": "polite";
|
|
11
|
+
"aria-label": string;
|
|
12
|
+
"data-ignore-morph": "";
|
|
13
|
+
};
|
|
14
|
+
toast: {
|
|
15
|
+
class: typeof TOAST_CLASS;
|
|
16
|
+
};
|
|
17
|
+
close: {
|
|
18
|
+
class: typeof TOAST_CLOSE_CLASS;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Attributtene for varselregionen.
|
|
23
|
+
*
|
|
24
|
+
* Regionen er `role="status"` og ikke `role="alert"`. En melding som kommer
|
|
25
|
+
* fordi noe gikk bra skal ikke avbryte det skjermleseren holder på med.
|
|
26
|
+
*
|
|
27
|
+
* `data-ignore-morph` er ikke valgfri. `<fs-toast>` lager og fjerner sine egne
|
|
28
|
+
* elementer inni regionen, og uten attributtet river Datastars morfing dem bort
|
|
29
|
+
* ved neste patch, fordi serverens utgave av regionen er tom. Attributtet må
|
|
30
|
+
* stå i HTML-en serveren sender: komponenten kan ikke sette det på seg selv,
|
|
31
|
+
* siden morfingen leser det fra serverens node.
|
|
32
|
+
*/
|
|
33
|
+
export declare const toast: ({ label, }?: ToastOptions) => ToastAttributes;
|
|
34
|
+
//# sourceMappingURL=toast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../../../../src/components/frittstaende/toast/toast.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,EAAG,UAAmB,CAAA;AAC9C,eAAO,MAAM,iBAAiB,EAAG,iBAA0B,CAAA;AAE3D,MAAM,MAAM,YAAY,GAAG;IACzB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ,CAAA;QACd,WAAW,EAAE,QAAQ,CAAA;QACrB,YAAY,EAAE,MAAM,CAAA;QACpB,mBAAmB,EAAE,EAAE,CAAA;KACxB,CAAA;IACD,KAAK,EAAE;QAAE,KAAK,EAAE,OAAO,WAAW,CAAA;KAAE,CAAA;IACpC,KAAK,EAAE;QAAE,KAAK,EAAE,OAAO,iBAAiB,CAAA;KAAE,CAAA;CAC3C,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,KAAK,GAAI,aAEnB,YAAiB,KAAG,eASrB,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { attributes } from "../../css/shared.js";
|
|
2
|
+
export const TOAST_CLASS = "fs-toast";
|
|
3
|
+
export const TOAST_CLOSE_CLASS = "fs-toast__close";
|
|
4
|
+
/**
|
|
5
|
+
* Attributtene for varselregionen.
|
|
6
|
+
*
|
|
7
|
+
* Regionen er `role="status"` og ikke `role="alert"`. En melding som kommer
|
|
8
|
+
* fordi noe gikk bra skal ikke avbryte det skjermleseren holder på med.
|
|
9
|
+
*
|
|
10
|
+
* `data-ignore-morph` er ikke valgfri. `<fs-toast>` lager og fjerner sine egne
|
|
11
|
+
* elementer inni regionen, og uten attributtet river Datastars morfing dem bort
|
|
12
|
+
* ved neste patch, fordi serverens utgave av regionen er tom. Attributtet må
|
|
13
|
+
* stå i HTML-en serveren sender: komponenten kan ikke sette det på seg selv,
|
|
14
|
+
* siden morfingen leser det fra serverens node.
|
|
15
|
+
*/
|
|
16
|
+
export const toast = ({ label = "Varsler", } = {}) => ({
|
|
17
|
+
region: attributes({
|
|
18
|
+
role: "status",
|
|
19
|
+
"aria-live": "polite",
|
|
20
|
+
"aria-label": label,
|
|
21
|
+
"data-ignore-morph": "",
|
|
22
|
+
}),
|
|
23
|
+
toast: { class: TOAST_CLASS },
|
|
24
|
+
close: { class: TOAST_CLOSE_CLASS },
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=toast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toast.js","sourceRoot":"","sources":["../../../../src/components/frittstaende/toast/toast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,MAAM,CAAC,MAAM,WAAW,GAAG,UAAmB,CAAA;AAC9C,MAAM,CAAC,MAAM,iBAAiB,GAAG,iBAA0B,CAAA;AAkB3D;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EACpB,KAAK,GAAG,SAAS,MACD,EAAE,EAAmB,EAAE,CAAC,CAAC;IACzC,MAAM,EAAE,UAAU,CAAC;QACjB,IAAI,EAAE,QAAiB;QACvB,WAAW,EAAE,QAAiB;QAC9B,YAAY,EAAE,KAAK;QACnB,mBAAmB,EAAE,EAAW;KACjC,CAAC;IACF,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE;IAC7B,KAAK,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE;CACpC,CAAC,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export declare const ERROR_SUMMARY_CLASS: "fs-error-summary";
|
|
2
|
+
export declare const ERROR_SUMMARY_TITLE_CLASS: "fs-error-summary__title";
|
|
3
|
+
export type ErrorSummaryOptions = {
|
|
4
|
+
/** Antall feil serveren fant. Er det null, skjules boksen. */
|
|
5
|
+
count?: number;
|
|
6
|
+
/** Id på boksen, slik at skjemaet kan flytte fokus hit etter innsending. */
|
|
7
|
+
id?: string;
|
|
8
|
+
};
|
|
9
|
+
export type ErrorSummaryAttributes = {
|
|
10
|
+
container: {
|
|
11
|
+
class: typeof ERROR_SUMMARY_CLASS;
|
|
12
|
+
role: "alert";
|
|
13
|
+
tabindex: "-1";
|
|
14
|
+
id?: string;
|
|
15
|
+
hidden?: true;
|
|
16
|
+
};
|
|
17
|
+
title: {
|
|
18
|
+
class: typeof ERROR_SUMMARY_TITLE_CLASS;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Attributtene for en feiloppsummering.
|
|
23
|
+
*
|
|
24
|
+
* Serveren skriver hele boksen, også overskriften og lista. `<fs-error-summary>`
|
|
25
|
+
* flytter bare fokus og håndterer klikk på lenkene. Tidligere lagde komponenten
|
|
26
|
+
* overskriften selv, og da forsvant den ved hver morfing i Datastar.
|
|
27
|
+
*
|
|
28
|
+
* ```ts
|
|
29
|
+
* const feil = fs.errorSummary({ count: errors.length, id: "feil" })
|
|
30
|
+
* ```
|
|
31
|
+
* ```html
|
|
32
|
+
* <fs-error-summary {...feil.container}>
|
|
33
|
+
* <h2 {...feil.title}>Du må rette 2 feil</h2>
|
|
34
|
+
* <ul><li><a href="#epost">E-posten mangler @</a></li></ul>
|
|
35
|
+
* </fs-error-summary>
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare const errorSummary: ({ count, id, }?: ErrorSummaryOptions) => ErrorSummaryAttributes;
|
|
39
|
+
//# sourceMappingURL=error-summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-summary.d.ts","sourceRoot":"","sources":["../../../../src/components/ramme/error-summary/error-summary.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,EAAG,kBAA2B,CAAA;AAC9D,eAAO,MAAM,yBAAyB,EAAG,yBAAkC,CAAA;AAE3E,MAAM,MAAM,mBAAmB,GAAG;IAChC,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4EAA4E;IAC5E,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE;QACT,KAAK,EAAE,OAAO,mBAAmB,CAAA;QACjC,IAAI,EAAE,OAAO,CAAA;QACb,QAAQ,EAAE,IAAI,CAAA;QACd,EAAE,CAAC,EAAE,MAAM,CAAA;QACX,MAAM,CAAC,EAAE,IAAI,CAAA;KACd,CAAA;IACD,KAAK,EAAE;QACL,KAAK,EAAE,OAAO,yBAAyB,CAAA;KACxC,CAAA;CACF,CAAA;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,YAAY,GAAI,iBAG1B,mBAAwB,KAAG,sBAS5B,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { attributes } from "../../css/shared.js";
|
|
2
|
+
export const ERROR_SUMMARY_CLASS = "fs-error-summary";
|
|
3
|
+
export const ERROR_SUMMARY_TITLE_CLASS = "fs-error-summary__title";
|
|
4
|
+
/**
|
|
5
|
+
* Attributtene for en feiloppsummering.
|
|
6
|
+
*
|
|
7
|
+
* Serveren skriver hele boksen, også overskriften og lista. `<fs-error-summary>`
|
|
8
|
+
* flytter bare fokus og håndterer klikk på lenkene. Tidligere lagde komponenten
|
|
9
|
+
* overskriften selv, og da forsvant den ved hver morfing i Datastar.
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* const feil = fs.errorSummary({ count: errors.length, id: "feil" })
|
|
13
|
+
* ```
|
|
14
|
+
* ```html
|
|
15
|
+
* <fs-error-summary {...feil.container}>
|
|
16
|
+
* <h2 {...feil.title}>Du må rette 2 feil</h2>
|
|
17
|
+
* <ul><li><a href="#epost">E-posten mangler @</a></li></ul>
|
|
18
|
+
* </fs-error-summary>
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export const errorSummary = ({ count = 0, id, } = {}) => ({
|
|
22
|
+
container: attributes({
|
|
23
|
+
class: ERROR_SUMMARY_CLASS,
|
|
24
|
+
role: "alert",
|
|
25
|
+
tabindex: "-1",
|
|
26
|
+
id,
|
|
27
|
+
hidden: count === 0 ? true : undefined,
|
|
28
|
+
}),
|
|
29
|
+
title: { class: ERROR_SUMMARY_TITLE_CLASS },
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=error-summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-summary.js","sourceRoot":"","sources":["../../../../src/components/ramme/error-summary/error-summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,MAAM,CAAC,MAAM,mBAAmB,GAAG,kBAA2B,CAAA;AAC9D,MAAM,CAAC,MAAM,yBAAyB,GAAG,yBAAkC,CAAA;AAsB3E;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAC3B,KAAK,GAAG,CAAC,EACT,EAAE,MACqB,EAAE,EAA0B,EAAE,CAAC,CAAC;IACvD,SAAS,EAAE,UAAU,CAAC;QACpB,KAAK,EAAE,mBAAmB;QAC1B,IAAI,EAAE,OAAgB;QACtB,QAAQ,EAAE,IAAa;QACvB,EAAE;QACF,MAAM,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAE,IAAc,CAAC,CAAC,CAAC,SAAS;KAClD,CAAC;IACF,KAAK,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE;CAC5C,CAAC,CAAA"}
|