@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
|
@@ -1,33 +1,100 @@
|
|
|
1
|
-
import { html, LitElement } from "lit";
|
|
2
1
|
import { computeFieldAttributes } from "./field-core.js";
|
|
3
2
|
export const FS_FIELD_TAG = "fs-field";
|
|
4
3
|
function uniqueId(prefix) {
|
|
5
4
|
return `${prefix}-${Math.random().toString(36).slice(2, 9)}`;
|
|
6
5
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
6
|
+
function setOrRemove(element, name, value) {
|
|
7
|
+
if (value === undefined) {
|
|
8
|
+
element.removeAttribute(name);
|
|
9
|
+
}
|
|
10
|
+
else if (element.getAttribute(name) !== value) {
|
|
11
|
+
element.setAttribute(name, value);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Kobler ledetekst, kontroll, hjelpetekst og feilmelding i vanlig DOM.
|
|
16
|
+
*
|
|
17
|
+
* Komponenten er for markup som blir til uten JavaScript: en Go-mal, en
|
|
18
|
+
* PHP-fil, en Razor-visning eller håndskrevet HTML. Lages markupen med
|
|
19
|
+
* JavaScript, uansett hvor koden kjører, skal `fs.field()` skrive
|
|
20
|
+
* attributtene i stedet, og da trengs ikke dette elementet.
|
|
21
|
+
*
|
|
22
|
+
* Komponenten rendrer ingenting. Den satte tidligere et `<slot>`-element inn i
|
|
23
|
+
* vanlig DOM, og siden serveren ikke visste om det, fjernet Datastars morfing
|
|
24
|
+
* det ved hver patch. Se `FIELD_PRESERVED_ATTRIBUTES` for hva serveren må
|
|
25
|
+
* skrive for at koblingen skal overleve en morfing.
|
|
26
|
+
*/
|
|
27
|
+
export class FsField extends HTMLElement {
|
|
28
|
+
/**
|
|
29
|
+
* Egenskapene speiler attributtene.
|
|
30
|
+
*
|
|
31
|
+
* Tilstanden bor i attributtet og ikke i et felt på klassen, slik at det
|
|
32
|
+
* serveren sendte og det komponenten mener alltid er det samme. En egen
|
|
33
|
+
* `invalid`-variabel ville kunne si noe annet enn markupen etter en morfing.
|
|
34
|
+
*/
|
|
35
|
+
get invalid() {
|
|
36
|
+
return this.hasAttribute("invalid");
|
|
37
|
+
}
|
|
38
|
+
set invalid(value) {
|
|
39
|
+
this.toggleAttribute("invalid", value);
|
|
40
|
+
}
|
|
41
|
+
get disabled() {
|
|
42
|
+
return this.hasAttribute("disabled");
|
|
43
|
+
}
|
|
44
|
+
set disabled(value) {
|
|
45
|
+
this.toggleAttribute("disabled", value);
|
|
46
|
+
}
|
|
47
|
+
get optional() {
|
|
48
|
+
return this.hasAttribute("optional");
|
|
49
|
+
}
|
|
50
|
+
set optional(value) {
|
|
51
|
+
this.toggleAttribute("optional", value);
|
|
52
|
+
}
|
|
53
|
+
get requiredMarker() {
|
|
54
|
+
const value = this.getAttribute("required-marker");
|
|
55
|
+
return value === "symbol" || value === "text" ? value : "none";
|
|
56
|
+
}
|
|
57
|
+
set requiredMarker(value) {
|
|
58
|
+
if (value === "none")
|
|
59
|
+
this.removeAttribute("required-marker");
|
|
60
|
+
else
|
|
61
|
+
this.setAttribute("required-marker", value);
|
|
62
|
+
}
|
|
63
|
+
get controlId() {
|
|
64
|
+
return this.getAttribute("control-id") ?? undefined;
|
|
65
|
+
}
|
|
66
|
+
set controlId(value) {
|
|
67
|
+
if (value === undefined)
|
|
68
|
+
this.removeAttribute("control-id");
|
|
69
|
+
else
|
|
70
|
+
this.setAttribute("control-id", value);
|
|
71
|
+
}
|
|
72
|
+
get describedBy() {
|
|
73
|
+
return this.getAttribute("described-by") ?? undefined;
|
|
74
|
+
}
|
|
75
|
+
set describedBy(value) {
|
|
76
|
+
if (value === undefined)
|
|
77
|
+
this.removeAttribute("described-by");
|
|
78
|
+
else
|
|
79
|
+
this.setAttribute("described-by", value);
|
|
80
|
+
}
|
|
81
|
+
connectedCallback() {
|
|
82
|
+
// `slotchange` melder ikke fra i vanlig DOM, og innholdet byttes ut mens
|
|
83
|
+
// brukeren fyller ut skjemaet. Bare childList: å sette et attributt på et
|
|
84
|
+
// barn utløser da ingen ny runde, så observatøren kan ikke gå i ring.
|
|
85
|
+
this.observer = new MutationObserver(() => this.sync());
|
|
86
|
+
this.observer.observe(this, { childList: true, subtree: true });
|
|
87
|
+
this.sync();
|
|
88
|
+
}
|
|
89
|
+
disconnectedCallback() {
|
|
90
|
+
this.observer?.disconnect();
|
|
91
|
+
this.observer = undefined;
|
|
92
|
+
}
|
|
93
|
+
attributeChangedCallback() {
|
|
94
|
+
if (this.isConnected)
|
|
95
|
+
this.sync();
|
|
96
|
+
}
|
|
97
|
+
sync() {
|
|
31
98
|
const label = this.querySelector("label");
|
|
32
99
|
const control = this.querySelector("input:not([type='hidden']), textarea, select");
|
|
33
100
|
const help = this.querySelector(".fs-help-text, [data-role='help']");
|
|
@@ -38,24 +105,37 @@ export class FsField extends LitElement {
|
|
|
38
105
|
help.id = uniqueId("fs-field-help");
|
|
39
106
|
if (error && !error.id)
|
|
40
107
|
error.id = uniqueId("fs-field-error");
|
|
41
|
-
//
|
|
42
|
-
//
|
|
43
|
-
//
|
|
108
|
+
// Markeringene leses også fra markupen. Skrev serveren dem med
|
|
109
|
+
// `fs.field()`, står de på ledeteksten, og en komponent som bare så på
|
|
110
|
+
// sine egne attributter ville fjernet dem igjen. I React ga det en
|
|
111
|
+
// hydreringsfeil: serveren sendte `data-required="symbol"`, komponenten
|
|
112
|
+
// tok det bort, og så mente React at HTML-en ikke stemte.
|
|
113
|
+
const marker = this.getAttribute("required-marker") ??
|
|
114
|
+
label?.getAttribute("data-required") ??
|
|
115
|
+
null;
|
|
116
|
+
const disabled = this.hasAttribute("disabled") || control.hasAttribute("disabled");
|
|
117
|
+
// Tilstanden leses fra markupen, ikke bare fra et attributt på verten.
|
|
118
|
+
// Skrev serveren feltet med `fs.field()`, står svaret allerede på
|
|
119
|
+
// kontrollen, og en komponent som regnet ut sitt eget ville fjernet det
|
|
120
|
+
// igjen. Da kranglet de to halvdelene av API-et med hverandre.
|
|
121
|
+
const invalid = this.hasAttribute("invalid") ||
|
|
122
|
+
control.getAttribute("aria-invalid") === "true";
|
|
44
123
|
const computed = computeFieldAttributes({
|
|
45
|
-
id: this.
|
|
124
|
+
id: this.getAttribute("control-id") ||
|
|
125
|
+
control.id ||
|
|
126
|
+
uniqueId("fs-field-control"),
|
|
46
127
|
help: Boolean(help),
|
|
47
128
|
error: Boolean(error),
|
|
48
129
|
helpId: help?.id,
|
|
49
130
|
errorId: error?.id,
|
|
50
|
-
required:
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
disabled: this.disabled,
|
|
131
|
+
required: marker === "symbol" || marker === "text" ? marker : undefined,
|
|
132
|
+
optional: this.hasAttribute("optional") ||
|
|
133
|
+
label?.hasAttribute("data-optional") === true,
|
|
134
|
+
invalid,
|
|
135
|
+
disabled,
|
|
56
136
|
describedBy: [
|
|
57
137
|
control.getAttribute("aria-describedby") ?? "",
|
|
58
|
-
this.
|
|
138
|
+
this.getAttribute("described-by") ?? "",
|
|
59
139
|
].filter(Boolean),
|
|
60
140
|
});
|
|
61
141
|
control.id = computed.control.id;
|
|
@@ -68,12 +148,14 @@ export class FsField extends LitElement {
|
|
|
68
148
|
setOrRemove(label, "aria-disabled", computed.label["aria-disabled"]);
|
|
69
149
|
}
|
|
70
150
|
if (error) {
|
|
151
|
+
// Bare `hidden`. Et skjult element er allerede ute av
|
|
152
|
+
// tilgjengelighetstreet, så `aria-hidden` var overflødig, og ga en
|
|
153
|
+
// hydreringsfeil i React fordi serveren ikke skriver det.
|
|
71
154
|
error.hidden = Boolean(computed.error.hidden);
|
|
72
|
-
error.setAttribute("aria-hidden", String(Boolean(computed.error.hidden)));
|
|
73
155
|
}
|
|
74
156
|
setOrRemove(control, "aria-describedby", computed.control["aria-describedby"]);
|
|
75
157
|
setOrRemove(control, "aria-invalid", computed.control["aria-invalid"]);
|
|
76
|
-
if (
|
|
158
|
+
if (disabled) {
|
|
77
159
|
control.setAttribute("disabled", "");
|
|
78
160
|
control.setAttribute("aria-disabled", "true");
|
|
79
161
|
}
|
|
@@ -94,22 +176,14 @@ export class FsField extends LitElement {
|
|
|
94
176
|
}
|
|
95
177
|
}
|
|
96
178
|
}
|
|
97
|
-
FsField.
|
|
98
|
-
invalid
|
|
99
|
-
disabled
|
|
100
|
-
optional
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
function setOrRemove(element, name, value) {
|
|
106
|
-
if (value === undefined) {
|
|
107
|
-
element.removeAttribute(name);
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
element.setAttribute(name, value);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
179
|
+
FsField.observedAttributes = [
|
|
180
|
+
"invalid",
|
|
181
|
+
"disabled",
|
|
182
|
+
"optional",
|
|
183
|
+
"required-marker",
|
|
184
|
+
"control-id",
|
|
185
|
+
"described-by",
|
|
186
|
+
];
|
|
113
187
|
export function defineFsField(tagName = FS_FIELD_TAG) {
|
|
114
188
|
if (!customElements.get(tagName)) {
|
|
115
189
|
customElements.define(tagName, FsField);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-field.js","sourceRoot":"","sources":["../../../../src/components/ramme/field/fs-field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"fs-field.js","sourceRoot":"","sources":["../../../../src/components/ramme/field/fs-field.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { LitElement } from "lit";
|
|
2
1
|
export declare const FS_POPOVER_TAG: "fs-popover";
|
|
3
|
-
export declare const POPOVER_CLASS: "fs-popover";
|
|
4
2
|
type Placement = "bottom-start" | "bottom-end" | "top-start" | "top-end";
|
|
5
3
|
/**
|
|
6
4
|
* Et panel som henger under en knapp, og som lukker seg selv.
|
|
@@ -9,48 +7,43 @@ type Placement = "bottom-start" | "bottom-end" | "top-start" | "top-end";
|
|
|
9
7
|
* løser tre ting som ellers krever kode: panelet legger seg over alt annet
|
|
10
8
|
* uten `z-index`, Escape lukker det, og et klikk utenfor lukker det.
|
|
11
9
|
*
|
|
12
|
-
* Det topplaget gjør
|
|
13
|
-
* ennå ikke i alle nettlesere, så posisjonen regnes ut her
|
|
14
|
-
* plass på skjermen.
|
|
10
|
+
* Det topplaget ikke gjør er å plassere panelet. `position-anchor` finnes
|
|
11
|
+
* ennå ikke i alle nettlesere, så posisjonen regnes ut her.
|
|
15
12
|
*
|
|
16
|
-
*
|
|
13
|
+
* Serveren skriver koblingen med `fs.popover()`: `aria-controls` på knappen,
|
|
14
|
+
* klassen og `popover` på panelet. Komponenten setter bare `aria-expanded`,
|
|
15
|
+
* som endrer seg når brukeren klikker, og posisjonen. Begge står i
|
|
16
|
+
* `data-preserve-attr` fra byggeren, ellers river morfingen dem bort.
|
|
17
17
|
*
|
|
18
18
|
* ```html
|
|
19
19
|
* <fs-popover placement="bottom-end">
|
|
20
|
-
* <button slot="trigger" class="fs-button"
|
|
21
|
-
*
|
|
20
|
+
* <button slot="trigger" class="fs-button" aria-controls="meny" aria-expanded="false"
|
|
21
|
+
* data-preserve-attr="aria-expanded">Handlinger</button>
|
|
22
|
+
* <ul id="meny" class="fs-popover" popover="manual" data-preserve-attr="style">…</ul>
|
|
22
23
|
* </fs-popover>
|
|
23
24
|
* ```
|
|
24
25
|
*/
|
|
25
|
-
export declare class FsPopover extends
|
|
26
|
-
static
|
|
27
|
-
open: {
|
|
28
|
-
type: BooleanConstructor;
|
|
29
|
-
reflect: boolean;
|
|
30
|
-
};
|
|
31
|
-
placement: {
|
|
32
|
-
type: StringConstructor;
|
|
33
|
-
};
|
|
34
|
-
};
|
|
35
|
-
/** Om panelet er åpent. Speiles, så CSS kan treffe tilstanden. */
|
|
36
|
-
open: boolean;
|
|
37
|
-
/** Hvilken kant panelet henger fra. Standard: `bottom-start`. */
|
|
38
|
-
placement: Placement;
|
|
26
|
+
export declare class FsPopover extends HTMLElement {
|
|
27
|
+
static observedAttributes: string[];
|
|
39
28
|
private panel?;
|
|
40
29
|
private triggerElement?;
|
|
41
|
-
|
|
42
|
-
|
|
30
|
+
private observer?;
|
|
31
|
+
/** Om panelet er åpent. Speiles, så CSS kan treffe tilstanden. */
|
|
32
|
+
get open(): boolean;
|
|
33
|
+
set open(value: boolean);
|
|
34
|
+
/** Hvilken kant panelet henger fra. Standard: `bottom-start`. */
|
|
35
|
+
get placement(): Placement;
|
|
36
|
+
set placement(value: Placement);
|
|
43
37
|
connectedCallback(): void;
|
|
44
38
|
disconnectedCallback(): void;
|
|
45
|
-
|
|
46
|
-
updated(): void;
|
|
47
|
-
private handleSlotChange;
|
|
39
|
+
attributeChangedCallback(): void;
|
|
48
40
|
private sync;
|
|
49
41
|
private handleTriggerClick;
|
|
50
42
|
private handleOutsideClick;
|
|
51
43
|
private handleKeydown;
|
|
52
44
|
/** Regner ut hvor panelet skal stå, mot knappens plass på skjermen. */
|
|
53
45
|
private reposition;
|
|
46
|
+
private emit;
|
|
54
47
|
/** Åpner panelet. */
|
|
55
48
|
show(): void;
|
|
56
49
|
/** Lukker panelet. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-popover.d.ts","sourceRoot":"","sources":["../../../../src/components/ramme/popover/fs-popover.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"fs-popover.d.ts","sourceRoot":"","sources":["../../../../src/components/ramme/popover/fs-popover.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,EAAG,YAAqB,CAAA;AAEnD,KAAK,SAAS,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS,CAAA;AASxE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,SAAU,SAAQ,WAAW;IACxC,MAAM,CAAC,kBAAkB,WAAwB;IAEjD,OAAO,CAAC,KAAK,CAAC,CAAa;IAC3B,OAAO,CAAC,cAAc,CAAC,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,CAAkB;IAEnC,kEAAkE;IAClE,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,EAGtB;IAED,iEAAiE;IACjE,IAAI,SAAS,IAAI,SAAS,CAGzB;IAED,IAAI,SAAS,CAAC,KAAK,EAAE,SAAS,EAE7B;IAED,iBAAiB,IAAI,IAAI;IAQzB,oBAAoB,IAAI,IAAI;IAe5B,wBAAwB,IAAI,IAAI;IAIhC,OAAO,CAAC,IAAI;IAmCZ,OAAO,CAAC,kBAAkB,CAEzB;IAED,OAAO,CAAC,kBAAkB,CAIzB;IAED,OAAO,CAAC,aAAa,CAMpB;IAED,uEAAuE;IACvE,OAAO,CAAC,UAAU,CAyBjB;IAED,OAAO,CAAC,IAAI;IAUZ,qBAAqB;IACrB,IAAI,IAAI,IAAI;IAMZ,sBAAsB;IACtB,IAAI,IAAI,IAAI;IAMZ,0BAA0B;IAC1B,MAAM,IAAI,IAAI;CAIf;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,YAAY,EAAE,SAAS,CAAA;KACxB;CACF;AAED,wBAAgB,eAAe,CAAC,OAAO,eAAiB,GAAG,IAAI,CAI9D"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
import { html, LitElement } from "lit";
|
|
2
1
|
export const FS_POPOVER_TAG = "fs-popover";
|
|
3
|
-
|
|
2
|
+
const PLACEMENTS = [
|
|
3
|
+
"bottom-start",
|
|
4
|
+
"bottom-end",
|
|
5
|
+
"top-start",
|
|
6
|
+
"top-end",
|
|
7
|
+
];
|
|
4
8
|
/**
|
|
5
9
|
* Et panel som henger under en knapp, og som lukker seg selv.
|
|
6
10
|
*
|
|
@@ -8,29 +12,25 @@ export const POPOVER_CLASS = "fs-popover";
|
|
|
8
12
|
* løser tre ting som ellers krever kode: panelet legger seg over alt annet
|
|
9
13
|
* uten `z-index`, Escape lukker det, og et klikk utenfor lukker det.
|
|
10
14
|
*
|
|
11
|
-
* Det topplaget gjør
|
|
12
|
-
* ennå ikke i alle nettlesere, så posisjonen regnes ut her
|
|
13
|
-
* plass på skjermen.
|
|
15
|
+
* Det topplaget ikke gjør er å plassere panelet. `position-anchor` finnes
|
|
16
|
+
* ennå ikke i alle nettlesere, så posisjonen regnes ut her.
|
|
14
17
|
*
|
|
15
|
-
*
|
|
18
|
+
* Serveren skriver koblingen med `fs.popover()`: `aria-controls` på knappen,
|
|
19
|
+
* klassen og `popover` på panelet. Komponenten setter bare `aria-expanded`,
|
|
20
|
+
* som endrer seg når brukeren klikker, og posisjonen. Begge står i
|
|
21
|
+
* `data-preserve-attr` fra byggeren, ellers river morfingen dem bort.
|
|
16
22
|
*
|
|
17
23
|
* ```html
|
|
18
24
|
* <fs-popover placement="bottom-end">
|
|
19
|
-
* <button slot="trigger" class="fs-button"
|
|
20
|
-
*
|
|
25
|
+
* <button slot="trigger" class="fs-button" aria-controls="meny" aria-expanded="false"
|
|
26
|
+
* data-preserve-attr="aria-expanded">Handlinger</button>
|
|
27
|
+
* <ul id="meny" class="fs-popover" popover="manual" data-preserve-attr="style">…</ul>
|
|
21
28
|
* </fs-popover>
|
|
22
29
|
* ```
|
|
23
30
|
*/
|
|
24
|
-
export class FsPopover extends
|
|
31
|
+
export class FsPopover extends HTMLElement {
|
|
25
32
|
constructor() {
|
|
26
33
|
super(...arguments);
|
|
27
|
-
/** Om panelet er åpent. Speiles, så CSS kan treffe tilstanden. */
|
|
28
|
-
this.open = false;
|
|
29
|
-
/** Hvilken kant panelet henger fra. Standard: `bottom-start`. */
|
|
30
|
-
this.placement = "bottom-start";
|
|
31
|
-
this.handleSlotChange = () => {
|
|
32
|
-
this.sync();
|
|
33
|
-
};
|
|
34
34
|
this.handleTriggerClick = () => {
|
|
35
35
|
this.toggle();
|
|
36
36
|
};
|
|
@@ -69,48 +69,66 @@ export class FsPopover extends LitElement {
|
|
|
69
69
|
this.panel.style.setProperty("--fs-popover-left", `${Math.round(left)}px`);
|
|
70
70
|
};
|
|
71
71
|
}
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
/** Om panelet er åpent. Speiles, så CSS kan treffe tilstanden. */
|
|
73
|
+
get open() {
|
|
74
|
+
return this.hasAttribute("open");
|
|
74
75
|
}
|
|
75
|
-
|
|
76
|
-
|
|
76
|
+
set open(value) {
|
|
77
|
+
if (value)
|
|
78
|
+
this.setAttribute("open", "");
|
|
79
|
+
else
|
|
80
|
+
this.removeAttribute("open");
|
|
81
|
+
}
|
|
82
|
+
/** Hvilken kant panelet henger fra. Standard: `bottom-start`. */
|
|
83
|
+
get placement() {
|
|
84
|
+
const value = this.getAttribute("placement");
|
|
85
|
+
return value && PLACEMENTS.includes(value) ? value : "bottom-start";
|
|
86
|
+
}
|
|
87
|
+
set placement(value) {
|
|
88
|
+
this.setAttribute("placement", value);
|
|
77
89
|
}
|
|
78
90
|
connectedCallback() {
|
|
79
|
-
super.connectedCallback();
|
|
80
91
|
window.addEventListener("resize", this.reposition);
|
|
81
92
|
window.addEventListener("scroll", this.reposition, true);
|
|
93
|
+
this.observer = new MutationObserver(() => this.sync());
|
|
94
|
+
this.observer.observe(this, { childList: true });
|
|
95
|
+
this.sync();
|
|
82
96
|
}
|
|
83
97
|
disconnectedCallback() {
|
|
84
98
|
window.removeEventListener("resize", this.reposition);
|
|
85
99
|
window.removeEventListener("scroll", this.reposition, true);
|
|
86
|
-
|
|
100
|
+
document.removeEventListener("click", this.handleOutsideClick, true);
|
|
101
|
+
document.removeEventListener("keydown", this.handleKeydown);
|
|
102
|
+
this.observer?.disconnect();
|
|
103
|
+
this.observer = undefined;
|
|
104
|
+
this.triggerElement?.removeEventListener("click", this.handleTriggerClick);
|
|
105
|
+
// Referansen må nullstilles, ellers ser `sync()` at knappen er den samme
|
|
106
|
+
// når elementet settes inn igjen, og hopper over å feste lytteren på
|
|
107
|
+
// nytt. Da lar panelet seg ikke åpne lenger.
|
|
108
|
+
this.triggerElement = undefined;
|
|
109
|
+
this.panel = undefined;
|
|
87
110
|
}
|
|
88
|
-
|
|
89
|
-
this.
|
|
90
|
-
|
|
91
|
-
updated() {
|
|
92
|
-
this.sync();
|
|
111
|
+
attributeChangedCallback() {
|
|
112
|
+
if (this.isConnected)
|
|
113
|
+
this.sync();
|
|
93
114
|
}
|
|
94
115
|
sync() {
|
|
95
116
|
const trigger = this.querySelector("[slot='trigger']");
|
|
96
117
|
const panel = [...this.children].find((child) => child instanceof HTMLElement &&
|
|
97
|
-
child.getAttribute("slot") !== "trigger"
|
|
98
|
-
child.tagName !== "SLOT");
|
|
118
|
+
child.getAttribute("slot") !== "trigger");
|
|
99
119
|
if (!trigger || !panel)
|
|
100
120
|
return;
|
|
101
|
-
this.triggerElement
|
|
121
|
+
if (this.triggerElement !== trigger) {
|
|
122
|
+
this.triggerElement?.removeEventListener("click", this.handleTriggerClick);
|
|
123
|
+
trigger.addEventListener("click", this.handleTriggerClick);
|
|
124
|
+
this.triggerElement = trigger;
|
|
125
|
+
}
|
|
102
126
|
this.panel = panel;
|
|
103
|
-
|
|
104
|
-
|
|
127
|
+
// Eneste attributtet komponenten eier. Resten skrev serveren.
|
|
128
|
+
const expanded = String(this.open);
|
|
129
|
+
if (trigger.getAttribute("aria-expanded") !== expanded) {
|
|
130
|
+
trigger.setAttribute("aria-expanded", expanded);
|
|
105
131
|
}
|
|
106
|
-
panel.classList.add(POPOVER_CLASS);
|
|
107
|
-
// `manual` og ikke `auto`: vi lukker selv, slik at knappen kan brukes til
|
|
108
|
-
// å lukke igjen uten at nettleseren rekker å lukke først.
|
|
109
|
-
panel.setAttribute("popover", "manual");
|
|
110
|
-
trigger.setAttribute("aria-expanded", String(this.open));
|
|
111
|
-
trigger.setAttribute("aria-controls", panel.id);
|
|
112
|
-
trigger.removeEventListener("click", this.handleTriggerClick);
|
|
113
|
-
trigger.addEventListener("click", this.handleTriggerClick);
|
|
114
132
|
if (this.open) {
|
|
115
133
|
if (!panel.matches(":popover-open"))
|
|
116
134
|
panel.showPopover();
|
|
@@ -125,27 +143,26 @@ export class FsPopover extends LitElement {
|
|
|
125
143
|
document.removeEventListener("keydown", this.handleKeydown);
|
|
126
144
|
}
|
|
127
145
|
}
|
|
146
|
+
emit(open) {
|
|
147
|
+
this.dispatchEvent(new CustomEvent("popover-toggle", {
|
|
148
|
+
detail: { open },
|
|
149
|
+
bubbles: true,
|
|
150
|
+
composed: true,
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
128
153
|
/** Åpner panelet. */
|
|
129
154
|
show() {
|
|
130
155
|
if (this.open)
|
|
131
156
|
return;
|
|
132
157
|
this.open = true;
|
|
133
|
-
this.
|
|
134
|
-
detail: { open: true },
|
|
135
|
-
bubbles: true,
|
|
136
|
-
composed: true,
|
|
137
|
-
}));
|
|
158
|
+
this.emit(true);
|
|
138
159
|
}
|
|
139
160
|
/** Lukker panelet. */
|
|
140
161
|
hide() {
|
|
141
162
|
if (!this.open)
|
|
142
163
|
return;
|
|
143
164
|
this.open = false;
|
|
144
|
-
this.
|
|
145
|
-
detail: { open: false },
|
|
146
|
-
bubbles: true,
|
|
147
|
-
composed: true,
|
|
148
|
-
}));
|
|
165
|
+
this.emit(false);
|
|
149
166
|
}
|
|
150
167
|
/** Åpner eller lukker. */
|
|
151
168
|
toggle() {
|
|
@@ -155,10 +172,7 @@ export class FsPopover extends LitElement {
|
|
|
155
172
|
this.show();
|
|
156
173
|
}
|
|
157
174
|
}
|
|
158
|
-
FsPopover.
|
|
159
|
-
open: { type: Boolean, reflect: true },
|
|
160
|
-
placement: { type: String },
|
|
161
|
-
};
|
|
175
|
+
FsPopover.observedAttributes = ["open", "placement"];
|
|
162
176
|
export function defineFsPopover(tagName = FS_POPOVER_TAG) {
|
|
163
177
|
if (!customElements.get(tagName)) {
|
|
164
178
|
customElements.define(tagName, FsPopover);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-popover.js","sourceRoot":"","sources":["../../../../src/components/ramme/popover/fs-popover.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"fs-popover.js","sourceRoot":"","sources":["../../../../src/components/ramme/popover/fs-popover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export declare const POPOVER_CLASS: "fs-popover";
|
|
2
|
+
export type PopoverOptions = {
|
|
3
|
+
/** Id på panelet. Kobler knappen til panelet med `aria-controls`. */
|
|
4
|
+
id: string;
|
|
5
|
+
/** Panelet er åpent. Standard: lukket. */
|
|
6
|
+
open?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export type PopoverAttributes = {
|
|
9
|
+
host: {
|
|
10
|
+
open?: "";
|
|
11
|
+
"data-preserve-attr": "open";
|
|
12
|
+
};
|
|
13
|
+
trigger: {
|
|
14
|
+
slot: "trigger";
|
|
15
|
+
"aria-expanded": "true" | "false";
|
|
16
|
+
"aria-controls": string;
|
|
17
|
+
"data-preserve-attr": "aria-expanded";
|
|
18
|
+
};
|
|
19
|
+
panel: {
|
|
20
|
+
class: typeof POPOVER_CLASS;
|
|
21
|
+
id: string;
|
|
22
|
+
popover: "manual";
|
|
23
|
+
"data-preserve-attr": "style";
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Attributtene for et sprettoppvindu.
|
|
28
|
+
*
|
|
29
|
+
* Serveren skriver både knappen og panelet med koblingen mellom dem.
|
|
30
|
+
* `<fs-popover>` regner ut posisjonen og lukker ved klikk utenfor.
|
|
31
|
+
*
|
|
32
|
+
* ```ts
|
|
33
|
+
* const boks = fs.popover({ id: "hjelp" })
|
|
34
|
+
* ```
|
|
35
|
+
* ```html
|
|
36
|
+
* <fs-popover>
|
|
37
|
+
* <button {...boks.trigger}>Hva betyr dette?</button>
|
|
38
|
+
* <div {...boks.panel}>Vi bruker fødselsdatoen til å finne riktig sats.</div>
|
|
39
|
+
* </fs-popover>
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare const popover: ({ id, open, }: PopoverOptions) => PopoverAttributes;
|
|
43
|
+
//# sourceMappingURL=popover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../../../src/components/ramme/popover/popover.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,EAAG,YAAqB,CAAA;AAElD,MAAM,MAAM,cAAc,GAAG;IAC3B,qEAAqE;IACrE,EAAE,EAAE,MAAM,CAAA;IACV,0CAA0C;IAC1C,IAAI,CAAC,EAAE,OAAO,CAAA;CACf,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE;QACJ,IAAI,CAAC,EAAE,EAAE,CAAA;QACT,oBAAoB,EAAE,MAAM,CAAA;KAC7B,CAAA;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS,CAAA;QACf,eAAe,EAAE,MAAM,GAAG,OAAO,CAAA;QACjC,eAAe,EAAE,MAAM,CAAA;QACvB,oBAAoB,EAAE,eAAe,CAAA;KACtC,CAAA;IACD,KAAK,EAAE;QACL,KAAK,EAAE,OAAO,aAAa,CAAA;QAC3B,EAAE,EAAE,MAAM,CAAA;QACV,OAAO,EAAE,QAAQ,CAAA;QACjB,oBAAoB,EAAE,OAAO,CAAA;KAC9B,CAAA;CACF,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,OAAO,GAAI,eAGrB,cAAc,KAAG,iBA6BlB,CAAA"}
|