@oslokommune/punkt-elements 16.16.1 → 16.17.2
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 +35 -0
- package/dist/{accordion-nNH87Y60.js → accordion-CU2tJ5vn.js} +23 -9
- package/dist/{accordion-BB1JrONI.cjs → accordion-DDZkjXFb.cjs} +20 -7
- package/dist/{checkbox-nTbihMxW.cjs → checkbox-BerAYcfK.cjs} +1 -1
- package/dist/{checkbox-Bjp43NxA.js → checkbox-CF5mSBR5.js} +1 -1
- package/dist/{combobox-C4Q6kQEs.cjs → combobox-DYttdLJ4.cjs} +1 -1
- package/dist/{combobox-CL9BLuxt.js → combobox-DjvRMKOD.js} +3 -3
- package/dist/components/header-menu/header-menu.d.ts +41 -0
- package/dist/components/header-menu/header-menu.test.d.ts +0 -0
- package/dist/components/header-menu/index.d.ts +5 -0
- package/dist/components/header-menu/types.d.ts +6 -0
- package/dist/components/index.d.ts +4 -0
- package/dist/components/searchinput/index.d.ts +4 -0
- package/dist/components/searchinput/searchinput.d.ts +27 -0
- package/dist/components/searchinput/searchinput.test.d.ts +0 -0
- package/dist/{datepicker-DYd3JCs_.cjs → datepicker-D3QQbd_H.cjs} +1 -1
- package/dist/{datepicker-BUK1Qanw.js → datepicker-M_jcY3wp.js} +2 -2
- package/dist/docs/components/header-full.d.ts +13 -0
- package/dist/docs/components/header-menu.d.ts +8 -0
- package/dist/docs/components/searchinput.d.ts +14 -0
- package/dist/{fileupload-DjUAvBcP.cjs → fileupload-BD_0oMrW.cjs} +1 -1
- package/dist/{fileupload-DbmqRkz3.js → fileupload-F9UMO7eS.js} +3 -3
- package/dist/focus-modality-controller-BSZAQk8y.cjs +1 -0
- package/dist/focus-modality-controller-pzSZkDkH.js +29 -0
- package/dist/{header-Dps8o-ZY.cjs → header-DZranHLm.cjs} +2 -2
- package/dist/{header-T5O6sfCN.js → header-j0SSHF4C.js} +4 -3
- package/dist/header-menu-CPI1_5oZ.cjs +126 -0
- package/dist/header-menu-zhGYdnvz.js +319 -0
- package/dist/header-menu.d.ts +1 -0
- package/dist/{helptext-C5rG4VkA.js → helptext-BdqoW19r.js} +1 -1
- package/dist/{helptext-DQgStO4D.cjs → helptext-KWXjKljV.cjs} +1 -1
- package/dist/{input-element-CjebcQd1.js → input-element-B1ciW1N2.js} +1 -1
- package/dist/{input-element-FGcr5hGd.cjs → input-element-D0egtEnr.cjs} +1 -1
- package/dist/{input-wrapper-B_XFi211.cjs → input-wrapper-DOIWggEv.cjs} +1 -1
- package/dist/{input-wrapper-DBpMVSxt.js → input-wrapper-DVU68NcJ.js} +5 -29
- package/dist/{modal-B6591sWa.cjs → modal-C_LxgxzC.cjs} +1 -1
- package/dist/{modal-DyIC3uhs.js → modal-Ca7dETTw.js} +1 -1
- package/dist/pkt-accordion.cjs +1 -1
- package/dist/pkt-accordion.js +1 -1
- package/dist/pkt-checkbox.cjs +1 -1
- package/dist/pkt-checkbox.js +1 -1
- package/dist/pkt-combobox.cjs +1 -1
- package/dist/pkt-combobox.js +1 -1
- package/dist/pkt-consent.cjs +1 -1
- package/dist/pkt-consent.js +1 -1
- package/dist/pkt-datepicker.cjs +1 -1
- package/dist/pkt-datepicker.js +1 -1
- package/dist/pkt-fileupload.cjs +1 -1
- package/dist/pkt-fileupload.js +1 -1
- package/dist/pkt-header-menu.cjs +1 -0
- package/dist/pkt-header-menu.js +2 -0
- package/dist/pkt-header.cjs +1 -1
- package/dist/pkt-header.js +1 -1
- package/dist/pkt-helptext.cjs +1 -1
- package/dist/pkt-helptext.js +1 -1
- package/dist/pkt-index.cjs +1 -1
- package/dist/pkt-index.js +24 -22
- package/dist/pkt-input-wrapper.cjs +1 -1
- package/dist/pkt-input-wrapper.js +1 -1
- package/dist/pkt-link.cjs +1 -1
- package/dist/pkt-link.js +1 -1
- package/dist/pkt-linkcard.cjs +1 -1
- package/dist/pkt-linkcard.js +1 -1
- package/dist/pkt-loader.cjs +1 -1
- package/dist/pkt-loader.js +1 -1
- package/dist/pkt-messagebox.cjs +1 -1
- package/dist/pkt-messagebox.js +1 -1
- package/dist/pkt-modal.cjs +1 -1
- package/dist/pkt-modal.js +1 -1
- package/dist/pkt-progressbar.cjs +1 -1
- package/dist/pkt-progressbar.js +1 -1
- package/dist/pkt-radiobutton.cjs +1 -1
- package/dist/pkt-radiobutton.js +1 -1
- package/dist/pkt-searchinput.cjs +1 -0
- package/dist/pkt-searchinput.js +2 -0
- package/dist/pkt-select.cjs +1 -1
- package/dist/pkt-select.js +1 -1
- package/dist/pkt-tabs.cjs +1 -1
- package/dist/pkt-tabs.js +1 -1
- package/dist/pkt-textarea.cjs +1 -1
- package/dist/pkt-textarea.js +1 -1
- package/dist/pkt-textinput.cjs +1 -1
- package/dist/pkt-textinput.js +1 -1
- package/dist/pkt-timepicker.cjs +1 -1
- package/dist/pkt-timepicker.js +1 -1
- package/dist/{radiobutton-DvXr7tDk.cjs → radiobutton-B1Xg6XzP.cjs} +1 -1
- package/dist/{radiobutton-B-8-wWFf.js → radiobutton-BAn1V_mQ.js} +1 -1
- package/dist/searchinput-BVIaoetB.cjs +60 -0
- package/dist/searchinput-CIseS5tL.js +147 -0
- package/dist/searchinput.d.ts +1 -0
- package/dist/{select-D9B8Ighz.js → select-6XCVj1lP.js} +3 -3
- package/dist/{select-B75wzvyz.cjs → select-DO0xGhQQ.cjs} +1 -1
- package/dist/shared-types/header-menu.d.ts +108 -0
- package/dist/shared-types/index.d.ts +3 -0
- package/dist/shared-types/searchinput.d.ts +41 -0
- package/dist/shared-types/skin.d.ts +1 -1
- package/dist/shared-utils/header-menu/example-data.d.ts +11 -0
- package/dist/shared-utils/header-menu/fetch-header-footer-data.d.ts +12 -0
- package/dist/shared-utils/header-menu/icon-map.d.ts +34 -0
- package/dist/shared-utils/header-menu/index.d.ts +11 -0
- package/dist/shared-utils/header-menu/select-megamenu.d.ts +16 -0
- package/dist/tests/component-registry.d.ts +2 -0
- package/dist/{textarea-CjqprL6Y.cjs → textarea-CV6z3LDf.cjs} +1 -1
- package/dist/{textarea-CIWXMaAD.js → textarea-DBSNSvrX.js} +2 -2
- package/dist/{textinput-CxzAxM8E.js → textinput-BZZnFDk3.js} +2 -2
- package/dist/{textinput-B0VWmVIF.cjs → textinput-Dsc-8-BB.cjs} +1 -1
- package/dist/{timepicker-Cv9juQeB.cjs → timepicker-C2Ua6vHY.cjs} +1 -1
- package/dist/{timepicker-DXrpg5C7.js → timepicker-DDQ7CfOy.js} +2 -2
- package/package.json +2 -2
- package/src/components/accordion/accordionitem.ts +22 -5
- package/src/components/header/header-service.ts +1 -0
- package/src/components/header-menu/header-menu.test.ts +314 -0
- package/src/components/header-menu/header-menu.ts +401 -0
- package/src/components/header-menu/index.ts +6 -0
- package/src/components/header-menu/types.ts +31 -0
- package/src/components/index.ts +10 -0
- package/src/components/searchinput/index.ts +10 -0
- package/src/components/searchinput/searchinput.test.ts +312 -0
- package/src/components/searchinput/searchinput.ts +213 -0
- /package/dist/{consent-zh2npq2K.cjs → consent-B5dIDyLD.cjs} +0 -0
- /package/dist/{consent-f_IGyHss.js → consent-DSHrt9eS.js} +0 -0
- /package/dist/{dialog-polyfill.esm-BmVHGRTX.js → dialog-polyfill.esm-B7W3teD0.js} +0 -0
- /package/dist/{dialog-polyfill.esm-CXDsb3l-.cjs → dialog-polyfill.esm-BnAQvMQO.cjs} +0 -0
- /package/dist/{input-wrapper-CYCCx8MP.cjs → input-wrapper-CQGoyLdZ.cjs} +0 -0
- /package/dist/{input-wrapper-kw2y6Jp_.js → input-wrapper-DwSsP39J.js} +0 -0
- /package/dist/{link-B8zYc5WK.cjs → link-DMKjKawh.cjs} +0 -0
- /package/dist/{link-CjJcwcxR.js → link-F51Ho7CV.js} +0 -0
- /package/dist/{linkcard-C4x-NJMi.cjs → linkcard-CBmJbSoV.cjs} +0 -0
- /package/dist/{linkcard-Ddh5R_L-.js → linkcard-E07qJZMP.js} +0 -0
- /package/dist/{loader-CGQXAuyM.cjs → loader-q_eO6zaE.cjs} +0 -0
- /package/dist/{loader-DeizpX45.js → loader-teN65oWo.js} +0 -0
- /package/dist/{messagebox-DqoPqo4K.js → messagebox-Ct9lfe0Z.js} +0 -0
- /package/dist/{messagebox-Ccu29rDv.cjs → messagebox-D1QeQqb8.cjs} +0 -0
- /package/dist/{pkt-options-controller-DbLrdRwH.js → pkt-options-controller-CCB15L_G.js} +0 -0
- /package/dist/{pkt-options-controller-BPBb_O2K.cjs → pkt-options-controller-CeAQ-D-i.cjs} +0 -0
- /package/dist/{progressbar-CrwpnIkv.cjs → progressbar-Ca7pRjmt.cjs} +0 -0
- /package/dist/{progressbar-uC-0W6o4.js → progressbar-o-M17HPA.js} +0 -0
- /package/dist/{tabs-RnDtIFv3.cjs → tabs-CN_RIMWg.cjs} +0 -0
- /package/dist/{tabs-4eWA7CsK.js → tabs-ClI1XQDt.js} +0 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
const e=require(`./element-DjtxO-1r.cjs`),t=require(`./class-map-CJ-msbHs.cjs`);require(`./icon-Dr8sfT2X.cjs`);const n=require(`./if-defined-XKOD_t_V.cjs`),r=require(`./focus-modality-controller-BSZAQk8y.cjs`);var i=class extends e.t{constructor(...e){super(...e),this.appearance=`local`,this.disabled=!1,this.fullwidth=!1,this.id=``,this.placeholder=`Søk…`,this.value=``,this.focusModality=new r.t(this,`.pkt-searchinput`)}get suggestionsId(){return`${this.id}-suggestions`}dispatchSearch(){this.dispatchEvent(new CustomEvent(`pkt-search`,{detail:{value:this.value},bubbles:!0,composed:!0}))}onInput(e){this.value=e.target.value}onInputKeydown(e){e.key===`Enter`&&(e.preventDefault(),this.dispatchSearch())}onSearchClick(e){e.preventDefault(),this.dispatchSearch()}onSuggestionClick(e,t,n){let r=new CustomEvent(`pkt-suggestion-click`,{detail:{index:n,suggestion:t},bubbles:!0,composed:!0,cancelable:!0});this.dispatchEvent(r)||e.preventDefault()}renderSuggestion(t,n){let r=e.d`
|
|
2
|
+
${t.title?e.d`<h3 class="pkt-searchinput__suggestion-title">${t.title}</h3>`:e.l}
|
|
3
|
+
${t.text?e.d`<p class="pkt-searchinput__suggestion-text">${t.text}</p>`:e.l}
|
|
4
|
+
`;return t.href?e.d`<a
|
|
5
|
+
href=${t.href}
|
|
6
|
+
class="pkt-searchinput__suggestion"
|
|
7
|
+
@click=${e=>this.onSuggestionClick(e,t,n)}
|
|
8
|
+
>
|
|
9
|
+
${r}
|
|
10
|
+
</a>`:t.nonInteractive?e.d`<div class="pkt-searchinput__suggestion">${r}</div>`:e.d`<button
|
|
11
|
+
type="button"
|
|
12
|
+
class="pkt-searchinput__suggestion"
|
|
13
|
+
@click=${e=>this.onSuggestionClick(e,t,n)}
|
|
14
|
+
>
|
|
15
|
+
${r}
|
|
16
|
+
</button>`}render(){let r=t.t({"pkt-searchinput":!0,[`pkt-searchinput--${this.appearance}`]:!0,"pkt-searchinput--fullwidth":this.fullwidth}),i=t.t({"pkt-searchinput__button":!0,"pkt-input-icon":this.appearance===`local`,"pkt-btn":!0,"pkt-btn--medium":!0,"pkt-btn--icon-only":!0,"pkt-btn--tertiary":this.appearance===`local`,"pkt-btn--primary":this.appearance===`global`||this.appearance===`local-with-button`,"pkt-btn--yellow":this.appearance===`global`}),a=t.t({"pkt-input":!0,"pkt-input--fullwidth":this.fullwidth}),o=this.appearance===`local`?`pkt-input__container`:`pkt-searchinput__field`,s=e.d`
|
|
17
|
+
${this.label?e.d`<label for=${n.t(this.id||void 0)} class="pkt-inputwrapper__label"
|
|
18
|
+
>${this.label}</label
|
|
19
|
+
>`:e.l}
|
|
20
|
+
<div class=${o}>
|
|
21
|
+
<input
|
|
22
|
+
class=${a}
|
|
23
|
+
type="search"
|
|
24
|
+
name=${this.name||this.id}
|
|
25
|
+
id=${this.id}
|
|
26
|
+
placeholder=${this.placeholder||`Søk…`}
|
|
27
|
+
.value=${this.value}
|
|
28
|
+
?disabled=${this.disabled}
|
|
29
|
+
autocomplete="off"
|
|
30
|
+
aria-autocomplete="list"
|
|
31
|
+
aria-controls=${this.suggestionsId}
|
|
32
|
+
@input=${this.onInput}
|
|
33
|
+
@keydown=${this.onInputKeydown}
|
|
34
|
+
/>
|
|
35
|
+
<button
|
|
36
|
+
type="submit"
|
|
37
|
+
class=${i}
|
|
38
|
+
?disabled=${this.disabled}
|
|
39
|
+
@click=${this.onSearchClick}
|
|
40
|
+
>
|
|
41
|
+
<pkt-icon class="pkt-btn__icon" name="magnifying-glass-big" />
|
|
42
|
+
<span class="pkt-btn__text">${this.label||this.placeholder||`Søk…`}</span>
|
|
43
|
+
</button>
|
|
44
|
+
</div>
|
|
45
|
+
${this.suggestions?e.d`<ul
|
|
46
|
+
id=${this.suggestionsId}
|
|
47
|
+
class="pkt-searchinput__suggestions"
|
|
48
|
+
aria-live="assertive"
|
|
49
|
+
>
|
|
50
|
+
${this.suggestions.map((t,n)=>e.d` <li>${this.renderSuggestion(t,n)}</li> `)}
|
|
51
|
+
</ul>`:e.l}
|
|
52
|
+
`;return this.action?e.d`<form
|
|
53
|
+
role="search"
|
|
54
|
+
class=${r}
|
|
55
|
+
action=${this.action}
|
|
56
|
+
method=${n.t(this.method)}
|
|
57
|
+
@submit=${e=>{e.preventDefault()}}
|
|
58
|
+
>
|
|
59
|
+
${s}
|
|
60
|
+
</form>`:e.d`<div role="search" class=${r}>${s}</div>`}};e.r([e.s({type:String})],i.prototype,`appearance`,void 0),e.r([e.s({type:Boolean,reflect:!0})],i.prototype,`disabled`,void 0),e.r([e.s({type:Boolean,reflect:!0})],i.prototype,`fullwidth`,void 0),e.r([e.s({type:String,reflect:!0})],i.prototype,`id`,void 0),e.r([e.s({type:String})],i.prototype,`label`,void 0),e.r([e.s({type:String})],i.prototype,`name`,void 0),e.r([e.s({type:String})],i.prototype,`placeholder`,void 0),e.r([e.s({type:String})],i.prototype,`value`,void 0),e.r([e.s({type:Array})],i.prototype,`suggestions`,void 0),e.r([e.s({type:String})],i.prototype,`action`,void 0),e.r([e.s({type:String})],i.prototype,`method`,void 0);try{e.c(`pkt-searchinput`)(i)}catch{console.warn(`Forsøker å definere <pkt-searchinput>, men den er allerede definert`)}var a=i;Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return a}});
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { c as e, d as t, l as n, r, s as i, t as a } from "./element-cZ85T_aa.js";
|
|
2
|
+
import { t as o } from "./class-map-C8HuhNzZ.js";
|
|
3
|
+
import "./icon-Co72KtgF.js";
|
|
4
|
+
import { t as s } from "./if-defined-Cjj8qN-Z.js";
|
|
5
|
+
import { t as c } from "./focus-modality-controller-pzSZkDkH.js";
|
|
6
|
+
//#region src/components/searchinput/searchinput.ts
|
|
7
|
+
var l = class extends a {
|
|
8
|
+
constructor(...e) {
|
|
9
|
+
super(...e), this.appearance = "local", this.disabled = !1, this.fullwidth = !1, this.id = "", this.placeholder = "Søk…", this.value = "", this.focusModality = new c(this, ".pkt-searchinput");
|
|
10
|
+
}
|
|
11
|
+
get suggestionsId() {
|
|
12
|
+
return `${this.id}-suggestions`;
|
|
13
|
+
}
|
|
14
|
+
dispatchSearch() {
|
|
15
|
+
this.dispatchEvent(new CustomEvent("pkt-search", {
|
|
16
|
+
detail: { value: this.value },
|
|
17
|
+
bubbles: !0,
|
|
18
|
+
composed: !0
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
onInput(e) {
|
|
22
|
+
this.value = e.target.value;
|
|
23
|
+
}
|
|
24
|
+
onInputKeydown(e) {
|
|
25
|
+
e.key === "Enter" && (e.preventDefault(), this.dispatchSearch());
|
|
26
|
+
}
|
|
27
|
+
onSearchClick(e) {
|
|
28
|
+
e.preventDefault(), this.dispatchSearch();
|
|
29
|
+
}
|
|
30
|
+
onSuggestionClick(e, t, n) {
|
|
31
|
+
let r = new CustomEvent("pkt-suggestion-click", {
|
|
32
|
+
detail: {
|
|
33
|
+
index: n,
|
|
34
|
+
suggestion: t
|
|
35
|
+
},
|
|
36
|
+
bubbles: !0,
|
|
37
|
+
composed: !0,
|
|
38
|
+
cancelable: !0
|
|
39
|
+
});
|
|
40
|
+
this.dispatchEvent(r) || e.preventDefault();
|
|
41
|
+
}
|
|
42
|
+
renderSuggestion(e, r) {
|
|
43
|
+
let i = t`
|
|
44
|
+
${e.title ? t`<h3 class="pkt-searchinput__suggestion-title">${e.title}</h3>` : n}
|
|
45
|
+
${e.text ? t`<p class="pkt-searchinput__suggestion-text">${e.text}</p>` : n}
|
|
46
|
+
`;
|
|
47
|
+
return e.href ? t`<a
|
|
48
|
+
href=${e.href}
|
|
49
|
+
class="pkt-searchinput__suggestion"
|
|
50
|
+
@click=${(t) => this.onSuggestionClick(t, e, r)}
|
|
51
|
+
>
|
|
52
|
+
${i}
|
|
53
|
+
</a>` : e.nonInteractive ? t`<div class="pkt-searchinput__suggestion">${i}</div>` : t`<button
|
|
54
|
+
type="button"
|
|
55
|
+
class="pkt-searchinput__suggestion"
|
|
56
|
+
@click=${(t) => this.onSuggestionClick(t, e, r)}
|
|
57
|
+
>
|
|
58
|
+
${i}
|
|
59
|
+
</button>`;
|
|
60
|
+
}
|
|
61
|
+
render() {
|
|
62
|
+
let e = o({
|
|
63
|
+
"pkt-searchinput": !0,
|
|
64
|
+
[`pkt-searchinput--${this.appearance}`]: !0,
|
|
65
|
+
"pkt-searchinput--fullwidth": this.fullwidth
|
|
66
|
+
}), r = o({
|
|
67
|
+
"pkt-searchinput__button": !0,
|
|
68
|
+
"pkt-input-icon": this.appearance === "local",
|
|
69
|
+
"pkt-btn": !0,
|
|
70
|
+
"pkt-btn--medium": !0,
|
|
71
|
+
"pkt-btn--icon-only": !0,
|
|
72
|
+
"pkt-btn--tertiary": this.appearance === "local",
|
|
73
|
+
"pkt-btn--primary": this.appearance === "global" || this.appearance === "local-with-button",
|
|
74
|
+
"pkt-btn--yellow": this.appearance === "global"
|
|
75
|
+
}), i = o({
|
|
76
|
+
"pkt-input": !0,
|
|
77
|
+
"pkt-input--fullwidth": this.fullwidth
|
|
78
|
+
}), a = this.appearance === "local" ? "pkt-input__container" : "pkt-searchinput__field", c = t`
|
|
79
|
+
${this.label ? t`<label for=${s(this.id || void 0)} class="pkt-inputwrapper__label"
|
|
80
|
+
>${this.label}</label
|
|
81
|
+
>` : n}
|
|
82
|
+
<div class=${a}>
|
|
83
|
+
<input
|
|
84
|
+
class=${i}
|
|
85
|
+
type="search"
|
|
86
|
+
name=${this.name || this.id}
|
|
87
|
+
id=${this.id}
|
|
88
|
+
placeholder=${this.placeholder || "Søk…"}
|
|
89
|
+
.value=${this.value}
|
|
90
|
+
?disabled=${this.disabled}
|
|
91
|
+
autocomplete="off"
|
|
92
|
+
aria-autocomplete="list"
|
|
93
|
+
aria-controls=${this.suggestionsId}
|
|
94
|
+
@input=${this.onInput}
|
|
95
|
+
@keydown=${this.onInputKeydown}
|
|
96
|
+
/>
|
|
97
|
+
<button
|
|
98
|
+
type="submit"
|
|
99
|
+
class=${r}
|
|
100
|
+
?disabled=${this.disabled}
|
|
101
|
+
@click=${this.onSearchClick}
|
|
102
|
+
>
|
|
103
|
+
<pkt-icon class="pkt-btn__icon" name="magnifying-glass-big" />
|
|
104
|
+
<span class="pkt-btn__text">${this.label || this.placeholder || "Søk…"}</span>
|
|
105
|
+
</button>
|
|
106
|
+
</div>
|
|
107
|
+
${this.suggestions ? t`<ul
|
|
108
|
+
id=${this.suggestionsId}
|
|
109
|
+
class="pkt-searchinput__suggestions"
|
|
110
|
+
aria-live="assertive"
|
|
111
|
+
>
|
|
112
|
+
${this.suggestions.map((e, n) => t` <li>${this.renderSuggestion(e, n)}</li> `)}
|
|
113
|
+
</ul>` : n}
|
|
114
|
+
`;
|
|
115
|
+
return this.action ? t`<form
|
|
116
|
+
role="search"
|
|
117
|
+
class=${e}
|
|
118
|
+
action=${this.action}
|
|
119
|
+
method=${s(this.method)}
|
|
120
|
+
@submit=${(e) => {
|
|
121
|
+
e.preventDefault();
|
|
122
|
+
}}
|
|
123
|
+
>
|
|
124
|
+
${c}
|
|
125
|
+
</form>` : t`<div role="search" class=${e}>${c}</div>`;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
r([i({ type: String })], l.prototype, "appearance", void 0), r([i({
|
|
129
|
+
type: Boolean,
|
|
130
|
+
reflect: !0
|
|
131
|
+
})], l.prototype, "disabled", void 0), r([i({
|
|
132
|
+
type: Boolean,
|
|
133
|
+
reflect: !0
|
|
134
|
+
})], l.prototype, "fullwidth", void 0), r([i({
|
|
135
|
+
type: String,
|
|
136
|
+
reflect: !0
|
|
137
|
+
})], l.prototype, "id", void 0), r([i({ type: String })], l.prototype, "label", void 0), r([i({ type: String })], l.prototype, "name", void 0), r([i({ type: String })], l.prototype, "placeholder", void 0), r([i({ type: String })], l.prototype, "value", void 0), r([i({ type: Array })], l.prototype, "suggestions", void 0), r([i({ type: String })], l.prototype, "action", void 0), r([i({ type: String })], l.prototype, "method", void 0);
|
|
138
|
+
try {
|
|
139
|
+
e("pkt-searchinput")(l);
|
|
140
|
+
} catch {
|
|
141
|
+
console.warn("Forsøker å definere <pkt-searchinput>, men den er allerede definert");
|
|
142
|
+
}
|
|
143
|
+
//#endregion
|
|
144
|
+
//#region src/components/searchinput/index.ts
|
|
145
|
+
var u = l;
|
|
146
|
+
//#endregion
|
|
147
|
+
export { l as n, u as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {}
|
|
@@ -2,9 +2,9 @@ import { c as e, d as t, o as n, r, s as i } from "./element-cZ85T_aa.js";
|
|
|
2
2
|
import { n as a } from "./element-with-slot-4J2o3SeU.js";
|
|
3
3
|
import { t as o } from "./if-defined-Cjj8qN-Z.js";
|
|
4
4
|
import { n as s, t as c } from "./ref-RS8Uv6uC.js";
|
|
5
|
-
import { t as l } from "./input-element-
|
|
6
|
-
import { t as u } from "./pkt-options-controller-
|
|
7
|
-
import "./input-wrapper-
|
|
5
|
+
import { t as l } from "./input-element-B1ciW1N2.js";
|
|
6
|
+
import { t as u } from "./pkt-options-controller-CCB15L_G.js";
|
|
7
|
+
import "./input-wrapper-DVU68NcJ.js";
|
|
8
8
|
//#region src/base-elements/options-input-element.ts
|
|
9
9
|
var d = class extends l {
|
|
10
10
|
constructor(...e) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const e=require(`./element-DjtxO-1r.cjs`),t=require(`./element-with-slot-CWoTGA1B.cjs`),n=require(`./if-defined-XKOD_t_V.cjs`),r=require(`./ref-BaJ0mBT_.cjs`),i=require(`./input-element-
|
|
1
|
+
const e=require(`./element-DjtxO-1r.cjs`),t=require(`./element-with-slot-CWoTGA1B.cjs`),n=require(`./if-defined-XKOD_t_V.cjs`),r=require(`./ref-BaJ0mBT_.cjs`),i=require(`./input-element-D0egtEnr.cjs`),a=require(`./pkt-options-controller-CeAQ-D-i.cjs`);require(`./input-wrapper-DOIWggEv.cjs`);var o=class extends i.t{constructor(...e){super(...e),this._optionsProp=[],this._options=[]}get options(){return this._options.map(e=>({...e,selected:this.isOptionSelected(e)}))}set options(e){this._optionsProp=e,this.requestUpdate(`_optionsProp`,this._options)}isOptionSelected(e){return Array.isArray(this.value)?this.value.includes(e.value):e.value===this.value}findOptionByValue(e){return this._options.find(t=>t.value===e)}getSelectedOptions(){return this._options.filter(e=>this.isOptionSelected(e))}parseOptions(){let e=this._optionsProp.length>0,t=this.optionsController?.nodes?.length&&this.optionsController.nodes.length>0;e?this._options=this._optionsProp:t&&(this._options=this.optionsController.options)}willUpdate(e){super.willUpdate(e),this.parseOptions()}};e.r([e.s({type:Array,attribute:`options`})],o.prototype,`_optionsProp`,void 0),e.r([e.o()],o.prototype,`_options`,void 0);var s=class extends o{constructor(){super(),this.inputRef=r.t(),this.value=``,this.selectedIndex=-1,this.selectedOptions=void 0,this.optionsController=new a.t(this)}connectedCallback(){super.connectedCallback(),this.parseOptions(),this._options.forEach(e=>{e.selected&&!this.value&&(this.value=e.value)})}add(e,t){let n={value:e.value||e.text,label:e.text||e.value,selected:e.selected,disabled:e.disabled};if(t===void 0)this._options.push(n);else if(typeof t==`number`)this._options.splice(t,0,n);else{let e=t.value||t.text,r=this._options.findIndex(t=>t.value===e);r>=0?this._options.splice(r,0,n):this._options.push(n)}e.selected&&(this.value=e.value||e.text,this.selectedIndex=this._options.findIndex(e=>e.value===this.value)),this.requestUpdate()}remove(e){typeof e==`number`&&(this.selectedIndex===e&&(this.value=this._options[0]?.value||``),this._options.splice(e,1),this.requestUpdate())}item(e){return this.inputRef.value?.item(e)}namedItem(e){return this.inputRef.value?.namedItem(e)}showPicker(){this.inputRef.value&&`showPicker`in this.inputRef.value&&this.inputRef.value.showPicker()}attributeChangedCallback(e,t,n){e===`options`&&(this._options=n?JSON.parse(n):[]),e===`value`&&this.value!==t&&(this.selectedIndex=this.touched?this.returnNumberOrNull(this.inputRef.value?.selectedIndex):this._options.findIndex(e=>e.value===n),this.selectedOptions=this.inputRef.value?.selectedOptions,this.valueChanged(n,t)),super.attributeChangedCallback(e,t,n)}update(e){super.update(e),e.has(`_optionsProp`)&&this._optionsProp.length>0&&(this._options=this._optionsProp,this.requestUpdate(`_options`),!this.value&&this._options.length>0&&(this.value=this._options[0].value,this.selectedIndex=0)),e.has(`value`)&&this.value!==e.get(`value`)&&(this.selectedIndex=this.touched?this.returnNumberOrNull(this.inputRef.value?.selectedIndex):this._options.findIndex(e=>e.value===this.value),this.selectedOptions=this.inputRef.value?.selectedOptions,this.valueChanged(this.value,e.get(`value`))),e.has(`id`)&&!this.name&&this.id&&(this.name=this.id)}firstUpdated(e){super.firstUpdated(e),this._optionsProp.length&&(this._options=this._optionsProp),!this.value&&this._options.length>0?(this.value=this._options[0].value,this.selectedIndex=0):this.selectedIndex=this._options.findIndex(e=>e.value===this.value),this.selectedOptions=this.inputRef.value?.selectedOptions}render(){let i=`pkt-input ${this.fullwidth?`pkt-input--fullwidth`:``}`;return e.d`
|
|
2
2
|
<pkt-input-wrapper
|
|
3
3
|
?counter=${this.counter}
|
|
4
4
|
?disabled=${this.disabled}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* header-menu.ts
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the global header mega menu, shared between
|
|
5
|
+
* @oslokommune/punkt-elements and (eventually) @oslokommune/punkt-react.
|
|
6
|
+
*
|
|
7
|
+
* The shape mirrors the live API response from
|
|
8
|
+
* https://cdn.web.oslo.kommune.no/header-footer/header-footer.json
|
|
9
|
+
* which the legacy oslo.kommune.no header consumes.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Locale keys present in the live payload. Typed as a string union with a
|
|
13
|
+
* `string & {}` escape hatch so additional locales can be added without
|
|
14
|
+
* a type-level breaking change.
|
|
15
|
+
*/
|
|
16
|
+
export type THeaderMenuLocale = 'nb-NO' | 'en-GB' | (string & {});
|
|
17
|
+
/** Plain link without an icon. */
|
|
18
|
+
export interface IHeaderMenuLink {
|
|
19
|
+
text: string;
|
|
20
|
+
url: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Link with an icon name. The icon name is the raw value from the API
|
|
24
|
+
* (legacy ODS naming) and gets mapped to a Punkt icon name inside the
|
|
25
|
+
* component via `mapOdsIcon`.
|
|
26
|
+
*
|
|
27
|
+
* `IconType` is generic so the Elements package can narrow it to
|
|
28
|
+
* `PktIconName` while shared code keeps it as `string`.
|
|
29
|
+
*/
|
|
30
|
+
export interface IHeaderMenuIconLink<IconType = string> extends IHeaderMenuLink {
|
|
31
|
+
icon: IconType;
|
|
32
|
+
}
|
|
33
|
+
/** CTA button at the top of the menu (e.g. "Min side"). */
|
|
34
|
+
export interface IHeaderMenuButton<IconType = string> extends IHeaderMenuLink {
|
|
35
|
+
iconName?: IconType;
|
|
36
|
+
}
|
|
37
|
+
/** Featured services grid: a heading and 1–N icon-prefixed links. */
|
|
38
|
+
export interface IHeaderMenuServices<IconType = string> {
|
|
39
|
+
title: string;
|
|
40
|
+
links: IHeaderMenuIconLink<IconType>[];
|
|
41
|
+
}
|
|
42
|
+
/** Categorised column section: a heading and a flat list of links. */
|
|
43
|
+
export interface IHeaderMenuSection {
|
|
44
|
+
title: string;
|
|
45
|
+
links: IHeaderMenuLink[];
|
|
46
|
+
}
|
|
47
|
+
/** The `megamenu` slice of the API payload. */
|
|
48
|
+
export interface IMegaMenu<IconType = string> {
|
|
49
|
+
buttons?: IHeaderMenuButton<IconType>[];
|
|
50
|
+
services: IHeaderMenuServices<IconType>;
|
|
51
|
+
sections: IHeaderMenuSection[];
|
|
52
|
+
links: IHeaderMenuLink[];
|
|
53
|
+
some: IHeaderMenuLink[];
|
|
54
|
+
}
|
|
55
|
+
/** The `footer` slice — kept here so consumers can reuse one fetch for both. */
|
|
56
|
+
export interface IHeaderFooter {
|
|
57
|
+
sections: IHeaderMenuSection[];
|
|
58
|
+
links: IHeaderMenuLink[];
|
|
59
|
+
some: IHeaderMenuLink[];
|
|
60
|
+
}
|
|
61
|
+
/** Per-locale slice of the API response. */
|
|
62
|
+
export interface IHeaderFooterLocaleData<IconType = string> {
|
|
63
|
+
megamenu: IMegaMenu<IconType>;
|
|
64
|
+
footer: IHeaderFooter;
|
|
65
|
+
header?: {
|
|
66
|
+
contact: IHeaderMenuLink;
|
|
67
|
+
};
|
|
68
|
+
search?: {
|
|
69
|
+
input: {
|
|
70
|
+
id: string;
|
|
71
|
+
name: string;
|
|
72
|
+
placeholder: string;
|
|
73
|
+
autocomplete?: string;
|
|
74
|
+
};
|
|
75
|
+
texts: Record<string, string>;
|
|
76
|
+
endpoint: string;
|
|
77
|
+
hiddenFields?: Array<{
|
|
78
|
+
name: string;
|
|
79
|
+
value: string;
|
|
80
|
+
}>;
|
|
81
|
+
};
|
|
82
|
+
i18n?: {
|
|
83
|
+
menu: string;
|
|
84
|
+
search: string;
|
|
85
|
+
navAriaLabel: string;
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/** Top-level API response keyed by locale. */
|
|
89
|
+
export type THeaderFooterApi<IconType = string> = Record<THeaderMenuLocale, IHeaderFooterLocaleData<IconType>>;
|
|
90
|
+
/**
|
|
91
|
+
* Public props for the pkt-header-menu element / future React component.
|
|
92
|
+
* Fields are intentionally framework-agnostic — Elements adds Lit-specific
|
|
93
|
+
* pieces (Booleanish converters, etc.) on top.
|
|
94
|
+
*/
|
|
95
|
+
export interface IPktHeaderMenu<IconType = string> {
|
|
96
|
+
/** Endpoint to fetch the header/footer payload from. */
|
|
97
|
+
dataUrl?: string;
|
|
98
|
+
/** Pre-fetched payload. If supplied, the component skips its own fetch. */
|
|
99
|
+
data?: THeaderFooterApi<IconType>;
|
|
100
|
+
/** Locale key to select from the payload. Defaults to `nb-NO`. */
|
|
101
|
+
locale?: THeaderMenuLocale;
|
|
102
|
+
/** Whether the menu is visible. Controlled by the parent header. */
|
|
103
|
+
open?: boolean;
|
|
104
|
+
/** Pixel breakpoint below which sections collapse into accordions. */
|
|
105
|
+
mobileBreakpoint?: number;
|
|
106
|
+
}
|
|
107
|
+
/** Default URL of the live header/footer endpoint. */
|
|
108
|
+
export declare const DEFAULT_HEADER_FOOTER_URL = "https://cdn.web.oslo.kommune.no/header-footer/header-footer.json";
|
|
@@ -4,6 +4,8 @@ export type { TAriaBoolean, TAriaBooleanMixed, TAriaCurrent, TAriaHasPopup, TAri
|
|
|
4
4
|
export type { THeadingLevel, THeadingSize, THeadingWeight } from './heading';
|
|
5
5
|
export type { User, Representing, UserMenuItem, InternalMenuItemBase, InternalMenuLink, InternalMenuButton, TInternalMenuItem, TSlotMenuVariant, THeaderMenu, TLogOutButtonPlacement, THeaderPosition, THeaderScrollBehavior, } from './header';
|
|
6
6
|
export { convertUserMenuItem } from './header';
|
|
7
|
+
export type { THeaderMenuLocale, IHeaderMenuLink, IHeaderMenuIconLink, IHeaderMenuButton, IHeaderMenuServices, IHeaderMenuSection, IMegaMenu, IHeaderFooter, IHeaderFooterLocaleData, THeaderFooterApi, IPktHeaderMenu, } from './header-menu';
|
|
8
|
+
export { DEFAULT_HEADER_FOOTER_URL } from './header-menu';
|
|
7
9
|
export type { TLayout, TVerticalPosition, THorizontalPosition, TPosition, TPositionWithCenter, } from './layout';
|
|
8
10
|
export type { THTMLButtonType, TSelectionMode } from './form';
|
|
9
11
|
export type { TSize3, TSize5, TSize7 } from './size';
|
|
@@ -15,5 +17,6 @@ export type { ITimepickerStrings } from './timepicker';
|
|
|
15
17
|
export { defaultTimepickerStrings } from './timepicker';
|
|
16
18
|
export type { TProgressbarRole, TProgressbarSkin, TProgressbarStatusPlacement, TProgressbarStatusType, TProgressbarTitlePosition, } from './progressbar';
|
|
17
19
|
export type { IPktComboboxOption, TPktComboboxTagSkin, TPktComboboxDisplayValue, TPktComboboxTagPlacement, } from './combobox';
|
|
20
|
+
export type { TPktSearchInputAppearance, TPktSearchInputMethod, IPktSearchInputSuggestion, IPktSearchInput, } from './searchinput';
|
|
18
21
|
export type { TUploadStrategy as TFileUploadStrategy, TFileUploadItemRenderer, TFilesChangedReason, TFileValidator, TTransferProgress, IFileItem, IFileTransfer, IFileValidateDetail, ITransferCancelledDetail, IFilesChangedDetail, IFileUploadStrings, } from './fileupload';
|
|
19
22
|
export { defaultFileUploadStrings } from './fileupload';
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for Search input (`pkt-searchinput` / `PktSearchInput`).
|
|
3
|
+
*
|
|
4
|
+
* Shared between Elements and React so API contracts and suggestion payloads
|
|
5
|
+
* stay aligned. React extends suggestions with `ReactNode` and optional
|
|
6
|
+
* `onClick` in the component layer — see `@oslokommune/punkt-react`.
|
|
7
|
+
*/
|
|
8
|
+
export type TPktSearchInputAppearance = 'local' | 'local-with-button' | 'global';
|
|
9
|
+
export type TPktSearchInputMethod = 'get' | 'post' | 'dialog';
|
|
10
|
+
/**
|
|
11
|
+
* Plain suggestion item (JSON-serializable). Used by Elements and as the
|
|
12
|
+
* portable shape for API data and design-token documentation.
|
|
13
|
+
*/
|
|
14
|
+
export interface IPktSearchInputSuggestion {
|
|
15
|
+
title?: string;
|
|
16
|
+
text?: string;
|
|
17
|
+
href?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Presentational row only (e.g. «Ingen resultater»). Renders as a non-focusable
|
|
20
|
+
* container — not a link or button — and does not emit selection events.
|
|
21
|
+
* Ignored when `href` is set (link always wins).
|
|
22
|
+
*/
|
|
23
|
+
nonInteractive?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Public props for the web component (Elements). React mirrors these and adds
|
|
27
|
+
* callback props in its wrapper.
|
|
28
|
+
*/
|
|
29
|
+
export interface IPktSearchInput {
|
|
30
|
+
appearance?: TPktSearchInputAppearance;
|
|
31
|
+
disabled?: boolean;
|
|
32
|
+
fullwidth?: boolean;
|
|
33
|
+
id: string;
|
|
34
|
+
label?: string;
|
|
35
|
+
name?: string;
|
|
36
|
+
placeholder?: string;
|
|
37
|
+
value?: string;
|
|
38
|
+
suggestions?: IPktSearchInputSuggestion[];
|
|
39
|
+
action?: string;
|
|
40
|
+
method?: TPktSearchInputMethod;
|
|
41
|
+
}
|
|
@@ -17,7 +17,7 @@ export type TMessageboxSkin = 'beige' | 'blue' | 'red' | 'green';
|
|
|
17
17
|
/**
|
|
18
18
|
* Accordion component skin variants
|
|
19
19
|
*/
|
|
20
|
-
export type TAccordionSkin = 'borderless' | 'outlined' | 'beige' | 'blue';
|
|
20
|
+
export type TAccordionSkin = 'borderless' | 'outlined' | 'beige' | 'blue' | 'plus-minus';
|
|
21
21
|
/**
|
|
22
22
|
* Card component skin variants
|
|
23
23
|
*/
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { THeaderFooterApi } from '../../shared-types/header-menu';
|
|
2
|
+
/**
|
|
3
|
+
* Example header/footer payload used by the dev/demo pages in both
|
|
4
|
+
* Punkt Elements and Punkt React. Mirrors the live Oslo kommune
|
|
5
|
+
* payload closely enough to exercise every region of the mega menu
|
|
6
|
+
* (services grid, four section columns, footer + social links).
|
|
7
|
+
*
|
|
8
|
+
* Tests use focused per-test fixtures with smaller shapes — this
|
|
9
|
+
* dataset is for visual demos only.
|
|
10
|
+
*/
|
|
11
|
+
export declare const EXAMPLE_HEADER_FOOTER_DATA: THeaderFooterApi;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DEFAULT_HEADER_FOOTER_URL, type THeaderFooterApi } from '../../shared-types/header-menu';
|
|
2
|
+
export { DEFAULT_HEADER_FOOTER_URL };
|
|
3
|
+
/**
|
|
4
|
+
* Fetch and parse the Oslo kommune header/footer JSON payload.
|
|
5
|
+
*
|
|
6
|
+
* Throws on HTTP errors and on invalid JSON. The caller is responsible
|
|
7
|
+
* for surfacing or hiding errors — the Lit element, for example, hides
|
|
8
|
+
* the menu and dispatches a `data-error` event.
|
|
9
|
+
*
|
|
10
|
+
* `signal` lets callers abort the fetch when the component disconnects.
|
|
11
|
+
*/
|
|
12
|
+
export declare function fetchHeaderFooterData<IconType = string>(url?: string, signal?: AbortSignal): Promise<THeaderFooterApi<IconType>>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renames from legacy oslo.kommune.no design-system icon names ("ods")
|
|
3
|
+
* to current Punkt icon names. Only entries where the name actually
|
|
4
|
+
* changed are listed — `mapOdsIcon` returns the input unchanged for any
|
|
5
|
+
* name not in this map, so identity entries would just be noise.
|
|
6
|
+
*/
|
|
7
|
+
export declare const ICON_MAP_ODS_TO_PUNKT: Readonly<Record<string, string>>;
|
|
8
|
+
/**
|
|
9
|
+
* Translate a legacy ODS icon name to a Punkt icon name. Falls back to
|
|
10
|
+
* the input string when no mapping exists, so unknown icons render as-is
|
|
11
|
+
* rather than blowing up.
|
|
12
|
+
*/
|
|
13
|
+
export declare function mapOdsIcon(name: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Map of known social-media hostnames to Punkt icon names. Hostnames are
|
|
16
|
+
* stored without the `www.` / `m.` subdomain prefix — `deriveSocialIcon`
|
|
17
|
+
* normalises before looking up.
|
|
18
|
+
*/
|
|
19
|
+
export declare const SOCIAL_HOSTNAME_TO_ICON: Readonly<Record<string, string>>;
|
|
20
|
+
/**
|
|
21
|
+
* The header/footer API ships social-media entries as `{ text, url }` only
|
|
22
|
+
* (no `icon` field). Resolve an icon name from the entry — preferring the
|
|
23
|
+
* URL's hostname because it's stable across locales (`facebook.com` is the
|
|
24
|
+
* same regardless of how the link is labelled).
|
|
25
|
+
*
|
|
26
|
+
* If the URL doesn't parse or its host isn't a known platform, fall back
|
|
27
|
+
* to deriving from the label: lower-case, slugify, run through
|
|
28
|
+
* `mapOdsIcon` so legacy spellings like "LinkedIn" / "linked-in" still
|
|
29
|
+
* resolve to `linkedin`.
|
|
30
|
+
*
|
|
31
|
+
* Returns `undefined` when neither input yields a usable icon — callers
|
|
32
|
+
* should then skip the icon rather than rendering a broken one.
|
|
33
|
+
*/
|
|
34
|
+
export declare function deriveSocialIcon(url?: string, text?: string): string | undefined;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Header menu helper exports
|
|
3
|
+
*
|
|
4
|
+
* Shared between @oslokommune/punkt-elements and (later) @oslokommune/punkt-react
|
|
5
|
+
* so both implementations stay aligned with the live oslo.kommune.no
|
|
6
|
+
* header/footer API.
|
|
7
|
+
*/
|
|
8
|
+
export { ICON_MAP_ODS_TO_PUNKT, mapOdsIcon, deriveSocialIcon } from './icon-map';
|
|
9
|
+
export { selectLocaleData, selectMegamenu } from './select-megamenu';
|
|
10
|
+
export { DEFAULT_HEADER_FOOTER_URL, fetchHeaderFooterData, } from './fetch-header-footer-data';
|
|
11
|
+
export { EXAMPLE_HEADER_FOOTER_DATA } from './example-data';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { IHeaderFooterLocaleData, IMegaMenu, THeaderFooterApi, THeaderMenuLocale } from '../../shared-types/header-menu';
|
|
2
|
+
/**
|
|
3
|
+
* Pick the locale slice from a header/footer payload. Falls back to
|
|
4
|
+
* `nb-NO` when the requested locale is missing — the same fallback the
|
|
5
|
+
* legacy oslo.kommune.no header used.
|
|
6
|
+
*
|
|
7
|
+
* Returns `undefined` when the payload doesn't contain the fallback
|
|
8
|
+
* either (e.g. a malformed response). Callers should treat that as an
|
|
9
|
+
* error state.
|
|
10
|
+
*/
|
|
11
|
+
export declare function selectLocaleData<IconType = string>(api: THeaderFooterApi<IconType> | undefined, locale?: THeaderMenuLocale): IHeaderFooterLocaleData<IconType> | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Convenience wrapper that returns the `megamenu` slice for the given
|
|
14
|
+
* locale.
|
|
15
|
+
*/
|
|
16
|
+
export declare function selectMegamenu<IconType = string>(api: THeaderFooterApi<IconType> | undefined, locale?: THeaderMenuLocale): IMegaMenu<IconType> | undefined;
|
|
@@ -24,6 +24,7 @@ import { PktModal } from '../components/modal/modal';
|
|
|
24
24
|
import { PktProgressbar } from '../components/progressbar/progressbar';
|
|
25
25
|
import { PktRadioButton } from '../components/radiobutton/radiobutton';
|
|
26
26
|
import { PktSelect } from '../components/select/select';
|
|
27
|
+
import { PktSearchInput } from '../components/searchinput/searchinput';
|
|
27
28
|
import { PktTag } from '../components/tag/tag';
|
|
28
29
|
import { PktTextarea } from '../components/textarea/textarea';
|
|
29
30
|
import { PktTextinput } from '../components/textinput/textinput';
|
|
@@ -57,6 +58,7 @@ export declare const customElementComponentRegistry: {
|
|
|
57
58
|
readonly 'pkt-progressbar': typeof PktProgressbar;
|
|
58
59
|
readonly 'pkt-radiobutton': typeof PktRadioButton;
|
|
59
60
|
readonly 'pkt-select': typeof PktSelect;
|
|
61
|
+
readonly 'pkt-searchinput': typeof PktSearchInput;
|
|
60
62
|
readonly 'pkt-tag': typeof PktTag;
|
|
61
63
|
readonly 'pkt-textarea': typeof PktTextarea;
|
|
62
64
|
readonly 'pkt-textinput': typeof PktTextinput;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const e=require(`./element-DjtxO-1r.cjs`),t=require(`./directive-CJ2giQBZ.cjs`),n=require(`./class-map-CJ-msbHs.cjs`),r=require(`./directive-helpers-D1QSxY17.cjs`),i=require(`./element-with-slot-CWoTGA1B.cjs`);require(`./icon-Dr8sfT2X.cjs`);const a=require(`./if-defined-XKOD_t_V.cjs`),o=require(`./ref-BaJ0mBT_.cjs`),s=require(`./input-element-
|
|
1
|
+
const e=require(`./element-DjtxO-1r.cjs`),t=require(`./directive-CJ2giQBZ.cjs`),n=require(`./class-map-CJ-msbHs.cjs`),r=require(`./directive-helpers-D1QSxY17.cjs`),i=require(`./element-with-slot-CWoTGA1B.cjs`);require(`./icon-Dr8sfT2X.cjs`);const a=require(`./if-defined-XKOD_t_V.cjs`),o=require(`./ref-BaJ0mBT_.cjs`),s=require(`./input-element-D0egtEnr.cjs`);require(`./input-wrapper-DOIWggEv.cjs`);var c=t.t(class extends t.n{constructor(e){if(super(e),e.type!==t.r.PROPERTY&&e.type!==t.r.ATTRIBUTE&&e.type!==t.r.BOOLEAN_ATTRIBUTE)throw Error("The `live` directive is not allowed on child or event bindings");if(!r.i(e))throw Error("`live` bindings can only contain a single expression")}render(e){return e}update(n,[i]){if(i===e.u||i===e.l)return i;let a=n.element,o=n.name;if(n.type===t.r.PROPERTY){if(i===a[o])return e.u}else if(n.type===t.r.BOOLEAN_ATTRIBUTE){if(!!i===a.hasAttribute(o))return e.u}else if(n.type===t.r.ATTRIBUTE&&a.getAttribute(o)===i+``)return e.u;return r.r(n),i}}),l=class extends s.t{constructor(...e){super(...e),this.inputRef=o.t(),this.value=``,this.autocomplete=`off`,this.rows=null,this.counterCurrent=0}attributeChangedCallback(e,t,n){e===`value`&&this.value!==t&&(this.counterCurrent=n?n.length:0,this.valueChanged(n,t)),super.attributeChangedCallback(e,t,n)}updated(e){super.updated(e),e.has(`value`)&&(this.counterCurrent=this.value?.length||0,this.valueChanged(this.value,e.get(`value`))),e.has(`id`)&&!this.name&&this.id&&(this.name=this.id)}render(){let t=n.t({"pkt-input":!0,"pkt-input--fullwidth":this.fullwidth,"pkt-input--counter-error":this.counter&&this.counterMaxLength&&this.value.length&&this.value.length>this.counterMaxLength}),r=this.ariaLabelledby||`${this.id}-input-label`;return e.d`<pkt-input-wrapper
|
|
2
2
|
label=${this.label}
|
|
3
3
|
?counter=${this.counter}
|
|
4
4
|
?disabled=${this.disabled}
|
|
@@ -6,8 +6,8 @@ import { n as p } from "./element-with-slot-4J2o3SeU.js";
|
|
|
6
6
|
import "./icon-Co72KtgF.js";
|
|
7
7
|
import { t as m } from "./if-defined-Cjj8qN-Z.js";
|
|
8
8
|
import { n as h, t as g } from "./ref-RS8Uv6uC.js";
|
|
9
|
-
import { t as _ } from "./input-element-
|
|
10
|
-
import "./input-wrapper-
|
|
9
|
+
import { t as _ } from "./input-element-B1ciW1N2.js";
|
|
10
|
+
import "./input-wrapper-DVU68NcJ.js";
|
|
11
11
|
//#region ../../node_modules/lit-html/directives/live.js
|
|
12
12
|
var v = l(class extends s {
|
|
13
13
|
constructor(e) {
|
|
@@ -4,8 +4,8 @@ import { n as s } from "./element-with-slot-4J2o3SeU.js";
|
|
|
4
4
|
import "./icon-Co72KtgF.js";
|
|
5
5
|
import { t as c } from "./if-defined-Cjj8qN-Z.js";
|
|
6
6
|
import { n as l, t as u } from "./ref-RS8Uv6uC.js";
|
|
7
|
-
import { t as d } from "./input-element-
|
|
8
|
-
import "./input-wrapper-
|
|
7
|
+
import { t as d } from "./input-element-B1ciW1N2.js";
|
|
8
|
+
import "./input-wrapper-DVU68NcJ.js";
|
|
9
9
|
//#region src/components/textinput/textinput.ts
|
|
10
10
|
var f = class extends d {
|
|
11
11
|
constructor(...e) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const e=require(`./element-DjtxO-1r.cjs`),t=require(`./class-map-CJ-msbHs.cjs`),n=require(`./element-with-slot-CWoTGA1B.cjs`);require(`./icon-Dr8sfT2X.cjs`);const r=require(`./if-defined-XKOD_t_V.cjs`),i=require(`./ref-BaJ0mBT_.cjs`),a=require(`./input-element-
|
|
1
|
+
const e=require(`./element-DjtxO-1r.cjs`),t=require(`./class-map-CJ-msbHs.cjs`),n=require(`./element-with-slot-CWoTGA1B.cjs`);require(`./icon-Dr8sfT2X.cjs`);const r=require(`./if-defined-XKOD_t_V.cjs`),i=require(`./ref-BaJ0mBT_.cjs`),a=require(`./input-element-D0egtEnr.cjs`);require(`./input-wrapper-DOIWggEv.cjs`);var o=class extends a.t{constructor(...e){super(...e),this.inputRef=i.t(),this.value=``,this.type=`text`,this.size=null,this.autocomplete=null,this.iconNameRight=null,this.prefix=null,this.suffix=null,this.omitSearchIcon=!1,this.counterCurrent=0}attributeChangedCallback(e,t,n){e===`value`&&this.value!==t&&(this.counterCurrent=n?n.length:0,this.valueChanged(n,t)),super.attributeChangedCallback(e,t,n)}updated(e){super.updated(e),e.has(`value`)&&(this.counterCurrent=this.value?.length||0,this.valueChanged(this.value,e.get(`value`))),e.has(`id`)&&!this.name&&this.id&&(this.name=this.id)}render(){let a=this.type===`search`&&!this.iconNameRight&&!this.omitSearchIcon,o=t.t({"pkt-input":!0,"pkt-input--fullwidth":this.fullwidth,"pkt-input--counter-error":this.counter&&this.counterMaxLength&&this.value.length&&this.value.length>this.counterMaxLength}),s=this.ariaLabelledby||`${this.id}-input-label`;return e.d`
|
|
2
2
|
<pkt-input-wrapper
|
|
3
3
|
label="${this.label}"
|
|
4
4
|
?counter=${this.counter}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const e=require(`./element-DjtxO-1r.cjs`),t=require(`./class-map-CJ-msbHs.cjs`),n=require(`./element-with-slot-CWoTGA1B.cjs`);require(`./icon-Dr8sfT2X.cjs`);const r=require(`./if-defined-XKOD_t_V.cjs`),i=require(`./ref-BaJ0mBT_.cjs`),a=require(`./input-element-FGcr5hGd.cjs`);require(`./input-wrapper-B_XFi211.cjs`);var o=e=>/^\d{2}:\d{2}$/.test(e)&&parseInt(e.slice(0,2),10)<=23&&parseInt(e.slice(3),10)<=59,s=e=>{let[t,n]=e.split(`:`).map(Number);return t*60+n},c=e=>e?Math.max(1,Math.round(e/60)):1,l=(e,t)=>{let n=e?parseInt(String(e).split(`:`)[0],10):0,r=t?parseInt(String(t).split(`:`)[0],10):23;return Array.from({length:r-n+1},(e,t)=>t+n)},u=e=>{let t=c(e);return Array.from({length:Math.floor(60/t)},(e,n)=>n*t)},d=(e,t,n,r)=>{let i=e===``?n===1?0:23:parseInt(e,10),a=t===``?n===1?0:Math.floor(59/r)*r:parseInt(t,10);return a+=n*r,a>59?(a=0,i=(i+1)%24):a<0&&(a=Math.floor(59/r)*r,i=(i-1+24)%24),{hours:String(i).padStart(2,`0`),minutes:String(a).padStart(2,`0`)}},f=class extends a.t{constructor(...e){super(...e),this.hiddenInputRef=i.t(),this.hoursInputRef=i.t(),this.minutesInputRef=i.t(),this.buttonRef=i.t(),this.value=``,this.hidePicker=!1,this.stepArrows=!1,this._hours=``,this._minutes=``,this._isOpen=!1,this._hoursDigitCount=0,this._hoursFirstDigit=-1,this._minutesDigitCount=0,this._minutesFirstDigit=-1,this._hasFocus=!1,this._outsideClickHandler=e=>{this.contains(e.target)||this._closePopup()},this._handleComponentFocusIn=()=>{this._hasFocus||(this._hasFocus=!0,this.onFocus())},this._handleComponentFocusOut=e=>{this.contains(e.relatedTarget)||(this._hasFocus=!1,this.onBlur())},this._handleHoursKeydown=e=>{let t=e.target;switch(e.key){case`ArrowUp`:{e.preventDefault();let t=this._hours===``?0:parseInt(this._hours,10);this._hours=String((t+1)%24).padStart(2,`0`),this._syncValueFromDisplay(),this.onInput();break}case`ArrowDown`:{e.preventDefault();let t=this._hours===``?0:parseInt(this._hours,10);this._hours=String((t-1+24)%24).padStart(2,`0`),this._syncValueFromDisplay(),this.onInput();break}case`ArrowRight`:e.preventDefault(),this.minutesInputRef.value?.focus();break;case`Backspace`:case`Delete`:this._hoursDigitCount=0,this._hoursFirstDigit=-1;break;case`Tab`:break;case`Enter`:{e.preventDefault();let n=this.internals.form;n?n.requestSubmit():t.blur();break}default:if(/^\d$/.test(e.key)){e.preventDefault();let t=parseInt(e.key,10);if(this._hoursDigitCount===0)this._hoursFirstDigit=t,this._hours=String(t).padStart(2,`0`),this._hoursDigitCount=1,this.onInput(),t>=3&&(this._hoursFirstDigit=-1,this._hoursDigitCount=0,this._syncValueFromDisplay(),this.minutesInputRef.value?.focus());else{let e=this._hoursFirstDigit*10+t;this._hours=e<=23?String(e).padStart(2,`0`):String(t).padStart(2,`0`),this._hoursFirstDigit=-1,this._hoursDigitCount=0,this._syncValueFromDisplay(),this.onInput(),this.minutesInputRef.value?.focus()}}else e.preventDefault()}},this._handleHoursBlur=()=>{this._hours!==``&&(this._hours=String(parseInt(this._hours,10)).padStart(2,`0`)),this._hoursDigitCount=0,this._hoursFirstDigit=-1,this._syncValueFromDisplay()},this._handleMinutesKeydown=e=>{let t=e.target;switch(e.key){case`ArrowUp`:{e.preventDefault();let t=this._minutes===``?0:parseInt(this._minutes,10);this._minutes=String((t+this._minuteStep)%60).padStart(2,`0`),this._syncValueFromDisplay(),this.onInput();break}case`ArrowDown`:{e.preventDefault();let t=this._minutes===``?0:parseInt(this._minutes,10);this._minutes=String((t-this._minuteStep+60)%60).padStart(2,`0`),this._syncValueFromDisplay(),this.onInput();break}case`ArrowLeft`:e.preventDefault(),this.hoursInputRef.value?.focus();break;case`Backspace`:case`Delete`:this._minutesDigitCount=0,this._minutesFirstDigit=-1;break;case`Tab`:break;case`Enter`:{e.preventDefault();let n=this.internals.form;n?n.requestSubmit():t.blur();break}default:if(/^\d$/.test(e.key)){e.preventDefault();let t=parseInt(e.key,10);if(this._minutesDigitCount===0)this._minutesFirstDigit=t,this._minutes=String(t).padStart(2,`0`),this._minutesDigitCount=1,this.onInput(),t>=6&&(this._minutesFirstDigit=-1,this._minutesDigitCount=0,this._syncValueFromDisplay());else{let e=this._minutesFirstDigit*10+t;this._minutes=e<=59?String(e).padStart(2,`0`):String(t).padStart(2,`0`),this._minutesFirstDigit=-1,this._minutesDigitCount=0,this._syncValueFromDisplay(),this.onInput()}}else e.preventDefault()}},this._handleMinutesBlur=()=>{this._minutes!==``&&(this._minutes=String(parseInt(this._minutes,10)).padStart(2,`0`)),this._minutesDigitCount=0,this._minutesFirstDigit=-1,this._syncValueFromDisplay()},this._handlePopupKeydown=e=>{let t=document.activeElement,n=t.closest(`.pkt-timepicker-popup__col`);if(!n)return;let r=Array.from(n.querySelectorAll(`.pkt-timepicker-popup__option`)),i=r.indexOf(t),a=t.dataset.type??``;switch(e.key){case`ArrowDown`:e.preventDefault(),this._focusOptionAndSync(r[Math.min(i+1,r.length-1)],a);break;case`ArrowUp`:e.preventDefault(),this._focusOptionAndSync(r[Math.max(i-1,0)],a);break;case`Home`:e.preventDefault(),this._focusOptionAndSync(r[0],a);break;case`End`:e.preventDefault(),this._focusOptionAndSync(r[r.length-1],a);break;case`ArrowRight`:e.preventDefault(),a===`hour`&&(this._focusOptionAndSync(t,a),this.updateComplete.then(()=>{this._scrollToSelected(),this._focusSelectedOrFirst(`minute`)}));break;case`ArrowLeft`:e.preventDefault(),a===`minute`&&(this._focusOptionAndSync(t,a),this.updateComplete.then(()=>{this._scrollToSelected(),this._focusSelectedOrFirst(`hour`)}));break;case`Enter`:case` `:e.preventDefault(),t.click();break;case`Escape`:e.preventDefault(),this._closePopup(),this.buttonRef.value?.focus();break}}}get inputRef(){return this.hiddenInputRef}manageValidity(t){let n=this.hoursInputRef.value;if(!n)return;if(this.required&&!this.value){this.internals.setValidity({valueMissing:!0},e.i.forms.messages.required,n),this._setAriaInvalid(!0);return}if(!this.value){this.internals.setValidity({}),this._setAriaInvalid(!1);return}let r=s(this.value),i=c(this.step);if(this.min&&r<s(String(this.min))){this.internals.setValidity({rangeUnderflow:!0},e.i.forms.messages.rangeUnderflowMin.replace(`{min}`,String(this.min)),n),this._setAriaInvalid(!0);return}if(this.max&&r>s(String(this.max))){this.internals.setValidity({rangeOverflow:!0},e.i.forms.messages.rangeOverflowMax.replace(`{max}`,String(this.max)),n),this._setAriaInvalid(!0);return}if(this.step&&r%i!==0){let t=i===60?e.i.forms.messages.timeStepMismatchHour:i===30?e.i.forms.messages.timeStepMismatchHalfHour:e.i.forms.messages.timeStepMismatch.replace(`{step}`,`${i}, ${i*2}, ${i*3}`);this.internals.setValidity({stepMismatch:!0},t,n),this._setAriaInvalid(!0);return}this.internals.setValidity({}),this._setAriaInvalid(!1)}_setAriaInvalid(e){if(!this.touched&&e)return;let t=this.hoursInputRef.value,n=this.minutesInputRef.value;e?(t?.setAttribute(`aria-invalid`,`true`),n?.setAttribute(`aria-invalid`,`true`)):(t?.removeAttribute(`aria-invalid`),n?.removeAttribute(`aria-invalid`))}connectedCallback(){super.connectedCallback(),this.addEventListener(`focusin`,this._handleComponentFocusIn),this.addEventListener(`focusout`,this._handleComponentFocusOut),document.addEventListener(`click`,this._outsideClickHandler)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener(`focusin`,this._handleComponentFocusIn),this.removeEventListener(`focusout`,this._handleComponentFocusOut),document.removeEventListener(`click`,this._outsideClickHandler)}willUpdate(e){super.willUpdate(e),e.has(`value`)&&this._syncDisplayFromValue()}updated(e){super.updated(e),this.classList.toggle(`pkt-timepicker--stepper`,this.stepArrows),this.classList.toggle(`pkt-timepicker--fullwidth`,this.fullwidth),e.has(`step`)&&this.step!==null&&!this._isValidStep(this.step)&&console.warn(`pkt-timepicker: step="${this.step}" er ikke en gyldig verdi. Step må være et multiplum av 60 (hele minutter) eller nøyaktig 3600 (hel time).`)}formResetCallback(){super.formResetCallback(),this._hours=``,this._minutes=``,this._isOpen=!1}_isValidStep(e){return e===3600||e<3600&&3600%e==0&&e%60==0}_syncDisplayFromValue(){let e=o(this.value)?this.value.split(`:`):null;e?(this._hours=e[0],this._minutes=e[1]):(this._hours=``,this._minutes=``)}_syncValueFromDisplay(){if(this._hours!==``&&this._minutes!==``){let e=`${this._hours}:${this._minutes}`;e!==this.value&&(this.value=e,this.onChange(e))}else this.value!==``&&(this.value=``,this.onChange(``))}get _minuteStep(){return c(this.step)}get _hourOptions(){return l(this.min,this.max)}get _minuteOptions(){return u(this.step)}_openPopup(){this._isOpen=!0,this.updateComplete.then(()=>{this._scrollToSelected(),this._focusSelectedOrFirst(`hour`)})}_closePopup(){this._isOpen=!1,this._syncValueFromDisplay()}_togglePopup(){this._isOpen?this._closePopup():this._openPopup()}_scrollToSelected(){let e=this.querySelector(`.pkt-timepicker-popup`);e&&e.querySelectorAll(`.pkt-timepicker-popup__col`).forEach(e=>{let t=e.querySelector(`.pkt-timepicker-popup__option--selected`);t&&t.scrollIntoView({block:`center`})})}_focusSelectedOrFirst(e){let t=this.querySelector(`.pkt-timepicker-popup`);if(!t)return;let n=t.querySelectorAll(`.pkt-timepicker-popup__col`),r=e===`hour`?n[0]:n[1];if(!r)return;let i=r.querySelector(`.pkt-timepicker-popup__option--selected`),a=r.querySelector(`.pkt-timepicker-popup__option`);(i||a)?.focus()}_handleOptionClick(e,t){let n=String(e).padStart(2,`0`);t===`hour`?(this._hours=n,this.updateComplete.then(()=>this._focusSelectedOrFirst(`minute`))):(this._minutes=n,this._closePopup(),this.buttonRef.value?.focus())}_focusOptionAndSync(e,t){if(!e)return;let n=parseInt(e.dataset.value??`0`,10);t===`hour`?this._hours=String(n).padStart(2,`0`):this._minutes=String(n).padStart(2,`0`),e.focus()}_stepTime(e){let t=d(this._hours,this._minutes,e,this._minuteStep);this._hours=t.hours,this._minutes=t.minutes,this._syncValueFromDisplay()}_renderOption(n,r){let i=String(n).padStart(2,`0`),a=n===(r===`hour`?this._hours===``?NaN:parseInt(this._hours,10):this._minutes===``?NaN:parseInt(this._minutes,10));return e.d`
|
|
1
|
+
const e=require(`./element-DjtxO-1r.cjs`),t=require(`./class-map-CJ-msbHs.cjs`),n=require(`./element-with-slot-CWoTGA1B.cjs`);require(`./icon-Dr8sfT2X.cjs`);const r=require(`./if-defined-XKOD_t_V.cjs`),i=require(`./ref-BaJ0mBT_.cjs`),a=require(`./input-element-D0egtEnr.cjs`);require(`./input-wrapper-DOIWggEv.cjs`);var o=e=>/^\d{2}:\d{2}$/.test(e)&&parseInt(e.slice(0,2),10)<=23&&parseInt(e.slice(3),10)<=59,s=e=>{let[t,n]=e.split(`:`).map(Number);return t*60+n},c=e=>e?Math.max(1,Math.round(e/60)):1,l=(e,t)=>{let n=e?parseInt(String(e).split(`:`)[0],10):0,r=t?parseInt(String(t).split(`:`)[0],10):23;return Array.from({length:r-n+1},(e,t)=>t+n)},u=e=>{let t=c(e);return Array.from({length:Math.floor(60/t)},(e,n)=>n*t)},d=(e,t,n,r)=>{let i=e===``?n===1?0:23:parseInt(e,10),a=t===``?n===1?0:Math.floor(59/r)*r:parseInt(t,10);return a+=n*r,a>59?(a=0,i=(i+1)%24):a<0&&(a=Math.floor(59/r)*r,i=(i-1+24)%24),{hours:String(i).padStart(2,`0`),minutes:String(a).padStart(2,`0`)}},f=class extends a.t{constructor(...e){super(...e),this.hiddenInputRef=i.t(),this.hoursInputRef=i.t(),this.minutesInputRef=i.t(),this.buttonRef=i.t(),this.value=``,this.hidePicker=!1,this.stepArrows=!1,this._hours=``,this._minutes=``,this._isOpen=!1,this._hoursDigitCount=0,this._hoursFirstDigit=-1,this._minutesDigitCount=0,this._minutesFirstDigit=-1,this._hasFocus=!1,this._outsideClickHandler=e=>{this.contains(e.target)||this._closePopup()},this._handleComponentFocusIn=()=>{this._hasFocus||(this._hasFocus=!0,this.onFocus())},this._handleComponentFocusOut=e=>{this.contains(e.relatedTarget)||(this._hasFocus=!1,this.onBlur())},this._handleHoursKeydown=e=>{let t=e.target;switch(e.key){case`ArrowUp`:{e.preventDefault();let t=this._hours===``?0:parseInt(this._hours,10);this._hours=String((t+1)%24).padStart(2,`0`),this._syncValueFromDisplay(),this.onInput();break}case`ArrowDown`:{e.preventDefault();let t=this._hours===``?0:parseInt(this._hours,10);this._hours=String((t-1+24)%24).padStart(2,`0`),this._syncValueFromDisplay(),this.onInput();break}case`ArrowRight`:e.preventDefault(),this.minutesInputRef.value?.focus();break;case`Backspace`:case`Delete`:this._hoursDigitCount=0,this._hoursFirstDigit=-1;break;case`Tab`:break;case`Enter`:{e.preventDefault();let n=this.internals.form;n?n.requestSubmit():t.blur();break}default:if(/^\d$/.test(e.key)){e.preventDefault();let t=parseInt(e.key,10);if(this._hoursDigitCount===0)this._hoursFirstDigit=t,this._hours=String(t).padStart(2,`0`),this._hoursDigitCount=1,this.onInput(),t>=3&&(this._hoursFirstDigit=-1,this._hoursDigitCount=0,this._syncValueFromDisplay(),this.minutesInputRef.value?.focus());else{let e=this._hoursFirstDigit*10+t;this._hours=e<=23?String(e).padStart(2,`0`):String(t).padStart(2,`0`),this._hoursFirstDigit=-1,this._hoursDigitCount=0,this._syncValueFromDisplay(),this.onInput(),this.minutesInputRef.value?.focus()}}else e.preventDefault()}},this._handleHoursBlur=()=>{this._hours!==``&&(this._hours=String(parseInt(this._hours,10)).padStart(2,`0`)),this._hoursDigitCount=0,this._hoursFirstDigit=-1,this._syncValueFromDisplay()},this._handleMinutesKeydown=e=>{let t=e.target;switch(e.key){case`ArrowUp`:{e.preventDefault();let t=this._minutes===``?0:parseInt(this._minutes,10);this._minutes=String((t+this._minuteStep)%60).padStart(2,`0`),this._syncValueFromDisplay(),this.onInput();break}case`ArrowDown`:{e.preventDefault();let t=this._minutes===``?0:parseInt(this._minutes,10);this._minutes=String((t-this._minuteStep+60)%60).padStart(2,`0`),this._syncValueFromDisplay(),this.onInput();break}case`ArrowLeft`:e.preventDefault(),this.hoursInputRef.value?.focus();break;case`Backspace`:case`Delete`:this._minutesDigitCount=0,this._minutesFirstDigit=-1;break;case`Tab`:break;case`Enter`:{e.preventDefault();let n=this.internals.form;n?n.requestSubmit():t.blur();break}default:if(/^\d$/.test(e.key)){e.preventDefault();let t=parseInt(e.key,10);if(this._minutesDigitCount===0)this._minutesFirstDigit=t,this._minutes=String(t).padStart(2,`0`),this._minutesDigitCount=1,this.onInput(),t>=6&&(this._minutesFirstDigit=-1,this._minutesDigitCount=0,this._syncValueFromDisplay());else{let e=this._minutesFirstDigit*10+t;this._minutes=e<=59?String(e).padStart(2,`0`):String(t).padStart(2,`0`),this._minutesFirstDigit=-1,this._minutesDigitCount=0,this._syncValueFromDisplay(),this.onInput()}}else e.preventDefault()}},this._handleMinutesBlur=()=>{this._minutes!==``&&(this._minutes=String(parseInt(this._minutes,10)).padStart(2,`0`)),this._minutesDigitCount=0,this._minutesFirstDigit=-1,this._syncValueFromDisplay()},this._handlePopupKeydown=e=>{let t=document.activeElement,n=t.closest(`.pkt-timepicker-popup__col`);if(!n)return;let r=Array.from(n.querySelectorAll(`.pkt-timepicker-popup__option`)),i=r.indexOf(t),a=t.dataset.type??``;switch(e.key){case`ArrowDown`:e.preventDefault(),this._focusOptionAndSync(r[Math.min(i+1,r.length-1)],a);break;case`ArrowUp`:e.preventDefault(),this._focusOptionAndSync(r[Math.max(i-1,0)],a);break;case`Home`:e.preventDefault(),this._focusOptionAndSync(r[0],a);break;case`End`:e.preventDefault(),this._focusOptionAndSync(r[r.length-1],a);break;case`ArrowRight`:e.preventDefault(),a===`hour`&&(this._focusOptionAndSync(t,a),this.updateComplete.then(()=>{this._scrollToSelected(),this._focusSelectedOrFirst(`minute`)}));break;case`ArrowLeft`:e.preventDefault(),a===`minute`&&(this._focusOptionAndSync(t,a),this.updateComplete.then(()=>{this._scrollToSelected(),this._focusSelectedOrFirst(`hour`)}));break;case`Enter`:case` `:e.preventDefault(),t.click();break;case`Escape`:e.preventDefault(),this._closePopup(),this.buttonRef.value?.focus();break}}}get inputRef(){return this.hiddenInputRef}manageValidity(t){let n=this.hoursInputRef.value;if(!n)return;if(this.required&&!this.value){this.internals.setValidity({valueMissing:!0},e.i.forms.messages.required,n),this._setAriaInvalid(!0);return}if(!this.value){this.internals.setValidity({}),this._setAriaInvalid(!1);return}let r=s(this.value),i=c(this.step);if(this.min&&r<s(String(this.min))){this.internals.setValidity({rangeUnderflow:!0},e.i.forms.messages.rangeUnderflowMin.replace(`{min}`,String(this.min)),n),this._setAriaInvalid(!0);return}if(this.max&&r>s(String(this.max))){this.internals.setValidity({rangeOverflow:!0},e.i.forms.messages.rangeOverflowMax.replace(`{max}`,String(this.max)),n),this._setAriaInvalid(!0);return}if(this.step&&r%i!==0){let t=i===60?e.i.forms.messages.timeStepMismatchHour:i===30?e.i.forms.messages.timeStepMismatchHalfHour:e.i.forms.messages.timeStepMismatch.replace(`{step}`,`${i}, ${i*2}, ${i*3}`);this.internals.setValidity({stepMismatch:!0},t,n),this._setAriaInvalid(!0);return}this.internals.setValidity({}),this._setAriaInvalid(!1)}_setAriaInvalid(e){if(!this.touched&&e)return;let t=this.hoursInputRef.value,n=this.minutesInputRef.value;e?(t?.setAttribute(`aria-invalid`,`true`),n?.setAttribute(`aria-invalid`,`true`)):(t?.removeAttribute(`aria-invalid`),n?.removeAttribute(`aria-invalid`))}connectedCallback(){super.connectedCallback(),this.addEventListener(`focusin`,this._handleComponentFocusIn),this.addEventListener(`focusout`,this._handleComponentFocusOut),document.addEventListener(`click`,this._outsideClickHandler)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener(`focusin`,this._handleComponentFocusIn),this.removeEventListener(`focusout`,this._handleComponentFocusOut),document.removeEventListener(`click`,this._outsideClickHandler)}willUpdate(e){super.willUpdate(e),e.has(`value`)&&this._syncDisplayFromValue()}updated(e){super.updated(e),this.classList.toggle(`pkt-timepicker--stepper`,this.stepArrows),this.classList.toggle(`pkt-timepicker--fullwidth`,this.fullwidth),e.has(`step`)&&this.step!==null&&!this._isValidStep(this.step)&&console.warn(`pkt-timepicker: step="${this.step}" er ikke en gyldig verdi. Step må være et multiplum av 60 (hele minutter) eller nøyaktig 3600 (hel time).`)}formResetCallback(){super.formResetCallback(),this._hours=``,this._minutes=``,this._isOpen=!1}_isValidStep(e){return e===3600||e<3600&&3600%e==0&&e%60==0}_syncDisplayFromValue(){let e=o(this.value)?this.value.split(`:`):null;e?(this._hours=e[0],this._minutes=e[1]):(this._hours=``,this._minutes=``)}_syncValueFromDisplay(){if(this._hours!==``&&this._minutes!==``){let e=`${this._hours}:${this._minutes}`;e!==this.value&&(this.value=e,this.onChange(e))}else this.value!==``&&(this.value=``,this.onChange(``))}get _minuteStep(){return c(this.step)}get _hourOptions(){return l(this.min,this.max)}get _minuteOptions(){return u(this.step)}_openPopup(){this._isOpen=!0,this.updateComplete.then(()=>{this._scrollToSelected(),this._focusSelectedOrFirst(`hour`)})}_closePopup(){this._isOpen=!1,this._syncValueFromDisplay()}_togglePopup(){this._isOpen?this._closePopup():this._openPopup()}_scrollToSelected(){let e=this.querySelector(`.pkt-timepicker-popup`);e&&e.querySelectorAll(`.pkt-timepicker-popup__col`).forEach(e=>{let t=e.querySelector(`.pkt-timepicker-popup__option--selected`);t&&t.scrollIntoView({block:`center`})})}_focusSelectedOrFirst(e){let t=this.querySelector(`.pkt-timepicker-popup`);if(!t)return;let n=t.querySelectorAll(`.pkt-timepicker-popup__col`),r=e===`hour`?n[0]:n[1];if(!r)return;let i=r.querySelector(`.pkt-timepicker-popup__option--selected`),a=r.querySelector(`.pkt-timepicker-popup__option`);(i||a)?.focus()}_handleOptionClick(e,t){let n=String(e).padStart(2,`0`);t===`hour`?(this._hours=n,this.updateComplete.then(()=>this._focusSelectedOrFirst(`minute`))):(this._minutes=n,this._closePopup(),this.buttonRef.value?.focus())}_focusOptionAndSync(e,t){if(!e)return;let n=parseInt(e.dataset.value??`0`,10);t===`hour`?this._hours=String(n).padStart(2,`0`):this._minutes=String(n).padStart(2,`0`),e.focus()}_stepTime(e){let t=d(this._hours,this._minutes,e,this._minuteStep);this._hours=t.hours,this._minutes=t.minutes,this._syncValueFromDisplay()}_renderOption(n,r){let i=String(n).padStart(2,`0`),a=n===(r===`hour`?this._hours===``?NaN:parseInt(this._hours,10):this._minutes===``?NaN:parseInt(this._minutes,10));return e.d`
|
|
2
2
|
<button
|
|
3
3
|
class=${t.t({"pkt-btn":!0,"pkt-btn--tertiary":!0,"pkt-btn--small":!0,"pkt-btn--label-only":!0,"pkt-timepicker-popup__option":!0,"pkt-timepicker-popup__option--selected":a})}
|
|
4
4
|
type="button"
|