@oslokommune/punkt-elements 13.5.6 → 13.5.10

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 CHANGED
@@ -5,6 +5,40 @@ og skriver commits ca etter [Conventional Commits](https://conventionalcommits.o
5
5
 
6
6
  ---
7
7
 
8
+ ## [13.5.10](https://github.com/oslokommune/punkt/compare/13.5.9...13.5.10) (2025-09-11)
9
+
10
+ ### ⚠ BREAKING CHANGES
11
+ Ingen
12
+
13
+ ### Features
14
+ Ingen
15
+
16
+ ### Bug Fixes
17
+ Ingen
18
+
19
+ ### Chores
20
+ Ingen
21
+
22
+ ---
23
+
24
+
25
+ ## [13.5.9](https://github.com/oslokommune/punkt/compare/13.5.8...13.5.9) (2025-09-11)
26
+
27
+ ### ⚠ BREAKING CHANGES
28
+ Ingen
29
+
30
+ ### Features
31
+ Ingen
32
+
33
+ ### Bug Fixes
34
+ Ingen
35
+
36
+ ### Chores
37
+ Ingen
38
+
39
+ ---
40
+
41
+
8
42
  ## [13.5.6](https://github.com/oslokommune/punkt/compare/13.5.5...13.5.6) (2025-09-09)
9
43
 
10
44
  ### ⚠ BREAKING CHANGES
@@ -1,12 +1,12 @@
1
- "use strict";const d=require("./class-map-BBG2gMX4.cjs"),u=require("./if-defined-Cni-RHLS.cjs"),l=require("./element-6DBpyGQm.cjs"),v=require("./state-DPobt-Yz.cjs"),o=require("./calendar-32W9p9uc.cjs"),y=require("./input-element-C4xJoM-X.cjs"),r=require("./ref-iJtiv3o2.cjs"),k=require("./repeat-CDsZqct8.cjs");require("./icon-B_ryAy4Q.cjs");require("./input-wrapper-CZ-a00V7.cjs");require("./tag-Bbs0U_Au.cjs");const $=require("./pkt-slot-controller-BzddBp7z.cjs"),b={dateformat:{default:"dd.MM.yyyy"},min:{default:null},max:{default:null},weeknumbers:{default:!1},withcontrols:{default:!1},multiple:{default:!1},range:{default:!1}},p={props:b};var x=Object.defineProperty,w=Object.getOwnPropertyDescriptor,n=(c,t,e,i)=>{for(var a=i>1?void 0:i?w(t,e):t,s=c.length-1,h;s>=0;s--)(h=c[s])&&(a=(i?h(t,e,a):h(a))||a);return i&&a&&x(t,e,a),a};const m=c=>new Promise(t=>setTimeout(t,c));exports.PktDatepicker=class extends y.PktInputElement{constructor(){super(),this._valueProperty="",this._value=[],this.label="Datovelger",this.dateformat=p.props.dateformat.default,this.multiple=p.props.multiple.default,this.maxlength=null,this.range=p.props.range.default,this.showRangeLabels=!1,this.min=null,this.max=null,this.weeknumbers=p.props.weeknumbers.default,this.withcontrols=p.props.withcontrols.default,this.excludedates=[],this.excludeweekdays=[],this.currentmonth=null,this.calendarOpen=!1,this.timezone="Europe/Oslo",this.inputClasses={},this.buttonClasses={},this.inputRef=r.e(),this.inputRefTo=r.e(),this.btnRef=r.e(),this.calRef=r.e(),this.popupRef=r.e(),this.helptextSlot=r.e(),this.addToSelected=t=>{const e=t.target;if(!e.value)return;const i=this.min?o.newDate(this.min):null,a=this.max?o.newDate(this.max):null,s=o.newDate(e.value.split(",")[0]);s&&!isNaN(s.getTime())&&(!i||s>=i)&&(!a||s<=a)&&this.calRef.value&&this.calRef.value.handleDateSelect(s),e.value=""},this.slotController=new $.PktSlotController(this,this.helptextSlot)}get value(){return this._valueProperty}set value(t){const e=this._valueProperty;this._valueProperty=Array.isArray(t)?t.join(","):t||"",this.valueChanged(this._valueProperty,e),this.requestUpdate("value",e)}async connectedCallback(){super.connectedCallback();const t=navigator.userAgent,e=/iP(hone|od|ad)/.test(t);this.inputType=e?"text":"date",document&&document.body.addEventListener("click",i=>{var a,s;(a=this.inputRef)!=null&&a.value&&((s=this.btnRef)!=null&&s.value)&&!this.inputRef.value.contains(i.target)&&!(this.inputRefTo.value&&this.inputRefTo.value.contains(i.target))&&!this.btnRef.value.contains(i.target)&&!i.target.closest(".pkt-calendar-popup")&&this.calendarOpen&&(this.onBlur(),this.hideCalendar())}),document&&document.body.addEventListener("keydown",i=>{i.key==="Escape"&&this.calendarOpen&&this.hideCalendar()}),this.value&&(this._value=Array.isArray(this.value)?this.value.filter(Boolean):this.value.split(",").filter(Boolean)),this.min=this.min||p.props.min.default,this.max=this.max||p.props.max.default,typeof this.excludedates=="string"&&(this.excludedates=this.excludedates.split(",")),typeof this.excludeweekdays=="string"&&(this.excludeweekdays=this.excludeweekdays.split(",")),(this.multiple||this.range)&&this.name&&!this.name.endsWith("[]")&&(this.name=this.name+"[]"),this.calendarOpen&&(await m(20),this.handleCalendarPosition())}disconnectedCallback(){super.disconnectedCallback(),document&&document.body.removeEventListener("click",t=>{var e,i;(e=this.inputRef)!=null&&e.value&&((i=this.btnRef)!=null&&i.value)&&!this.inputRef.value.contains(t.target)&&!this.btnRef.value.contains(t.target)&&this.hideCalendar()})}onInput(){this.dispatchEvent(new Event("input",{bubbles:!0}))}valueChanged(t,e){if(t!==e){let i=[];if(t&&(typeof t=="string"?i=t.split(",").filter(Boolean):i=String(t).split(",").filter(Boolean)),this.min||this.max){const s=this.min?new Date(this.min):null,h=this.max?new Date(this.max):null;i=i.filter(f=>{const g=new Date(f);return!(isNaN(g.getTime())||s&&g<s||h&&g>h)})}this._value=i;const a=i.join(",");this._valueProperty!==a&&(this._valueProperty=a),super.valueChanged(a,e)}}attributeChangedCallback(t,e,i){t==="value"&&this.value!==e&&this.valueChanged(i,e),t==="excludedates"&&typeof this.excludedates=="string"&&(this.excludedates=(i==null?void 0:i.split(","))??[]),t==="excludeweekdays"&&typeof this.excludeweekdays=="string"&&(this.excludeweekdays=(i==null?void 0:i.split(","))??[]),super.attributeChangedCallback(t,e,i)}updated(t){if(t.has("value")){const e=Array.isArray(this.value)?this.value.join(","):this.value,i=t.get("value"),a=Array.isArray(i)?i.join(","):i;this.valueChanged(e,a)}t.has("multiple")&&(this.multiple&&!Array.isArray(this._value)?this._value=typeof this.value=="string"?this.value?this.value.split(",").filter(Boolean):[]:[]:!this.multiple&&Array.isArray(this._value)&&(this._value=this._value.filter(Boolean)),!this.multiple&&!this.range&&Array.isArray(this._value)&&(this._value=[this._value[0]??""])),super.updated(t)}renderInput(){return l.x`
1
+ "use strict";const d=require("./class-map-BBG2gMX4.cjs"),h=require("./if-defined-Cni-RHLS.cjs"),s=require("./element-6DBpyGQm.cjs"),v=require("./state-DPobt-Yz.cjs"),o=require("./calendar-32W9p9uc.cjs"),m=require("./input-element-C4xJoM-X.cjs"),r=require("./ref-iJtiv3o2.cjs"),y=require("./repeat-CDsZqct8.cjs");require("./icon-B_ryAy4Q.cjs");require("./input-wrapper-CZ-a00V7.cjs");require("./tag-Bbs0U_Au.cjs");const k=require("./pkt-slot-controller-BzddBp7z.cjs"),$={dateformat:{default:"dd.MM.yyyy"},min:{default:null},max:{default:null},weeknumbers:{default:!1},withcontrols:{default:!1},multiple:{default:!1},range:{default:!1}},p={props:$};var b=Object.defineProperty,x=Object.getOwnPropertyDescriptor,n=(c,t,e,i)=>{for(var a=i>1?void 0:i?x(t,e):t,l=c.length-1,u;l>=0;l--)(u=c[l])&&(a=(i?u(t,e,a):u(a))||a);return i&&a&&b(t,e,a),a};const g=c=>new Promise(t=>setTimeout(t,c));exports.PktDatepicker=class extends m.PktInputElement{constructor(){super(),this._valueProperty="",this._value=[],this.label="Datovelger",this.dateformat=p.props.dateformat.default,this.multiple=p.props.multiple.default,this.maxlength=null,this.range=p.props.range.default,this.showRangeLabels=!1,this.min=null,this.max=null,this.weeknumbers=p.props.weeknumbers.default,this.withcontrols=p.props.withcontrols.default,this.excludedates=[],this.excludeweekdays=[],this.currentmonth=null,this.calendarOpen=!1,this.timezone="Europe/Oslo",this.inputClasses={},this.buttonClasses={},this.inputRef=r.e(),this.inputRefTo=r.e(),this.btnRef=r.e(),this.calRef=r.e(),this.popupRef=r.e(),this.helptextSlot=r.e(),this.addToSelected=t=>{const e=t.target;if(!e.value)return;const i=this.min?o.newDate(this.min):null,a=this.max?o.newDate(this.max):null,l=o.newDate(e.value.split(",")[0]);l&&!isNaN(l.getTime())&&(!i||l>=i)&&(!a||l<=a)&&this.calRef.value&&this.calRef.value.handleDateSelect(l),e.value=""},this.slotController=new k.PktSlotController(this,this.helptextSlot)}get value(){return this._valueProperty}set value(t){const e=this._valueProperty;this._valueProperty=Array.isArray(t)?t.join(","):t||"",this.valueChanged(this._valueProperty,e),this.requestUpdate("value",e)}async connectedCallback(){super.connectedCallback();const t=navigator.userAgent,e=/iP(hone|od|ad)/.test(t);this.inputType=e?"text":"date",document&&document.body.addEventListener("click",i=>{var a,l;(a=this.inputRef)!=null&&a.value&&((l=this.btnRef)!=null&&l.value)&&!this.inputRef.value.contains(i.target)&&!(this.inputRefTo.value&&this.inputRefTo.value.contains(i.target))&&!this.btnRef.value.contains(i.target)&&!i.target.closest(".pkt-calendar-popup")&&this.calendarOpen&&(this.onBlur(),this.hideCalendar())}),document&&document.body.addEventListener("keydown",i=>{i.key==="Escape"&&this.calendarOpen&&this.hideCalendar()}),this.value&&(this._value=Array.isArray(this.value)?this.value.filter(Boolean):this.value.split(",").filter(Boolean)),this.min=this.min||p.props.min.default,this.max=this.max||p.props.max.default,typeof this.excludedates=="string"&&(this.excludedates=this.excludedates.split(",")),typeof this.excludeweekdays=="string"&&(this.excludeweekdays=this.excludeweekdays.split(",")),(this.multiple||this.range)&&this.name&&!this.name.endsWith("[]")&&(this.name=this.name+"[]"),this.calendarOpen&&(await g(20),this.handleCalendarPosition())}disconnectedCallback(){super.disconnectedCallback(),document&&document.body.removeEventListener("click",t=>{var e,i;(e=this.inputRef)!=null&&e.value&&((i=this.btnRef)!=null&&i.value)&&!this.inputRef.value.contains(t.target)&&!this.btnRef.value.contains(t.target)&&this.hideCalendar()})}onInput(){this.dispatchEvent(new Event("input",{bubbles:!0}))}valueChanged(t,e){if(t===e)return;let i=[];t&&(typeof t=="string"?i=t.split(",").filter(Boolean):i=String(t).split(",").filter(Boolean)),this._value=i;const a=i.join(",");this._valueProperty!==a&&(this._valueProperty=a),super.valueChanged(a,e)}attributeChangedCallback(t,e,i){t==="value"&&this.value!==e&&this.valueChanged(i,e),t==="excludedates"&&typeof this.excludedates=="string"&&(this.excludedates=(i==null?void 0:i.split(","))??[]),t==="excludeweekdays"&&typeof this.excludeweekdays=="string"&&(this.excludeweekdays=(i==null?void 0:i.split(","))??[]),super.attributeChangedCallback(t,e,i)}updated(t){if(t.has("value")){const e=Array.isArray(this.value)?this.value.join(","):this.value,i=t.get("value"),a=Array.isArray(i)?i.join(","):i;this.valueChanged(e,a)}t.has("multiple")&&(this.multiple&&!Array.isArray(this._value)?this._value=typeof this.value=="string"?this.value?this.value.split(",").filter(Boolean):[]:[]:!this.multiple&&Array.isArray(this._value)&&(this._value=this._value.filter(Boolean)),!this.multiple&&!this.range&&Array.isArray(this._value)&&(this._value=[this._value[0]??""])),super.updated(t)}renderInput(){return s.x`
2
2
  <input
3
3
  class="${d.e(this.inputClasses)}"
4
4
  .type=${this.inputType}
5
5
  id="${this.id}-input"
6
6
  .value=${this._value[0]??""}
7
- min=${u.o(this.min)}
8
- max=${u.o(this.max)}
9
- placeholder=${u.o(this.placeholder)}
7
+ min=${h.o(this.min)}
8
+ max=${h.o(this.max)}
9
+ placeholder=${h.o(this.placeholder)}
10
10
  ?readonly=${this.readonly}
11
11
  aria-describedby="${this.id}-helptext"
12
12
  @click=${t=>{t.preventDefault(),this.showCalendar()}}
@@ -18,57 +18,57 @@
18
18
  @change=${t=>{this.touched=!0,t.stopImmediatePropagation()}}
19
19
  ${r.n(this.inputRef)}
20
20
  />
21
- `}renderRangeInput(){const t={"pkt-input-prefix":this.showRangeLabels,"pkt-hide":!this.showRangeLabels};return l.x`
22
- ${this.showRangeLabels?l.x` <div class="pkt-input-prefix">${this.strings.generic.from}</div> `:l.E}
21
+ `}renderRangeInput(){const t={"pkt-input-prefix":this.showRangeLabels,"pkt-hide":!this.showRangeLabels};return s.x`
22
+ ${this.showRangeLabels?s.x` <div class="pkt-input-prefix">${this.strings.generic.from}</div> `:s.E}
23
23
  <input
24
24
  class=${d.e(this.inputClasses)}
25
25
  .type=${this.inputType}
26
26
  id="${this.id}-input"
27
27
  .value=${this._value[0]??""}
28
- min=${u.o(this.min)}
29
- max=${u.o(this.max)}
30
- placeholder=${u.o(this.placeholder)}
28
+ min=${h.o(this.min)}
29
+ max=${h.o(this.max)}
30
+ placeholder=${h.o(this.placeholder)}
31
31
  ?readonly=${this.readonly}
32
32
  ?disabled=${this.disabled}
33
33
  @click=${e=>{e.preventDefault(),this.showCalendar()}}
34
- @keydown=${e=>{var i,a;if(e.key===","&&((i=this.inputRef.value)==null||i.blur()),(e.key==="Space"||e.key===" ")&&(e.preventDefault(),this.toggleCalendar(e)),e.key==="Enter"){const s=this.internals.form;s?s.requestSubmit():(a=this.inputRefTo.value)==null||a.focus()}}}
34
+ @keydown=${e=>{var i,a;if(e.key===","&&((i=this.inputRef.value)==null||i.blur()),(e.key==="Space"||e.key===" ")&&(e.preventDefault(),this.toggleCalendar(e)),e.key==="Enter"){const l=this.internals.form;l?l.requestSubmit():(a=this.inputRefTo.value)==null||a.focus()}}}
35
35
  @input=${e=>{this.onInput(),e.stopImmediatePropagation()}}
36
36
  @focus=${()=>{this.onFocus(),this.isMobileSafari&&this.showCalendar()}}
37
- @blur=${e=>{var i,a;if(e.target.value){this.manageValidity(e.target);const s=o.fromISOToDate(e.target.value);s&&this._value[0]!==e.target.value&&this._value[1]&&(this.clearInputValue(),(a=(i=this.calRef)==null?void 0:i.value)==null||a.handleDateSelect(s))}else this._value[0]&&this.clearInputValue()}}
37
+ @blur=${e=>{var i,a;if(e.target.value){this.manageValidity(e.target);const l=o.fromISOToDate(e.target.value);l&&this._value[0]!==e.target.value&&this._value[1]&&(this.clearInputValue(),(a=(i=this.calRef)==null?void 0:i.value)==null||a.handleDateSelect(l))}else this._value[0]&&this.clearInputValue()}}
38
38
  @change=${e=>{e.stopImmediatePropagation()}}
39
39
  ${r.n(this.inputRef)}
40
40
  />
41
41
  <div class="${d.e(t)}" id="${this.id}-to-label">
42
42
  ${this.strings.generic.to}
43
43
  </div>
44
- ${this.showRangeLabels?l.E:l.x` <div class="pkt-input-separator">–</div> `}
44
+ ${this.showRangeLabels?s.E:s.x` <div class="pkt-input-separator">–</div> `}
45
45
  <input
46
46
  class=${d.e(this.inputClasses)}
47
47
  .type=${this.inputType}
48
48
  id="${this.id}-to"
49
49
  aria-labelledby="${this.id}-to-label"
50
50
  .value=${this._value[1]??""}
51
- min=${u.o(this.min)}
52
- max=${u.o(this.max)}
53
- placeholder=${u.o(this.placeholder)}
51
+ min=${h.o(this.min)}
52
+ max=${h.o(this.max)}
53
+ placeholder=${h.o(this.placeholder)}
54
54
  ?readonly=${this.readonly}
55
55
  ?disabled=${this.disabled}
56
56
  @click=${e=>{e.preventDefault(),this.showCalendar()}}
57
- @keydown=${e=>{var i,a;if(e.key===","&&((i=this.inputRefTo.value)==null||i.blur()),(e.key==="Space"||e.key===" ")&&(e.preventDefault(),this.toggleCalendar(e)),e.key==="Enter"){const s=this.internals.form;s?s.requestSubmit():(a=this.inputRefTo.value)==null||a.blur()}}}
57
+ @keydown=${e=>{var i,a;if(e.key===","&&((i=this.inputRefTo.value)==null||i.blur()),(e.key==="Space"||e.key===" ")&&(e.preventDefault(),this.toggleCalendar(e)),e.key==="Enter"){const l=this.internals.form;l?l.requestSubmit():(a=this.inputRefTo.value)==null||a.blur()}}}
58
58
  @input=${e=>{this.onInput(),e.stopImmediatePropagation()}}
59
59
  @focus=${()=>{this.onFocus(),this.isMobileSafari&&this.showCalendar()}}
60
- @blur=${e=>{var i,a,s;if((i=this.calRef.value)!=null&&i.contains(e.relatedTarget)||this.onBlur(),e.target.value){this.manageValidity(e.target);const h=e.target.value;this.min&&this.min>h?this.internals.setValidity({rangeUnderflow:!0},this.strings.forms.messages.rangeUnderflow,e.target):this.max&&this.max<h&&this.internals.setValidity({rangeOverflow:!0},this.strings.forms.messages.rangeOverflow,e.target);const f=o.fromISOToDate(e.target.value);f&&this._value[1]!==o.formatISODate(f)&&((s=(a=this.calRef)==null?void 0:a.value)==null||s.handleDateSelect(f))}}}
60
+ @blur=${e=>{var i,a,l;if((i=this.calRef.value)!=null&&i.contains(e.relatedTarget)||this.onBlur(),e.target.value){this.manageValidity(e.target);const u=e.target.value;this.min&&this.min>u?this.internals.setValidity({rangeUnderflow:!0},this.strings.forms.messages.rangeUnderflow,e.target):this.max&&this.max<u&&this.internals.setValidity({rangeOverflow:!0},this.strings.forms.messages.rangeOverflow,e.target);const f=o.fromISOToDate(e.target.value);f&&this._value[1]!==o.formatISODate(f)&&((l=(a=this.calRef)==null?void 0:a.value)==null||l.handleDateSelect(f))}}}
61
61
  @change=${e=>{this.touched=!0,e.stopImmediatePropagation()}}
62
62
  ${r.n(this.inputRefTo)}
63
63
  />
64
- `}renderMultipleInput(){return l.x`
64
+ `}renderMultipleInput(){return s.x`
65
65
  <input
66
66
  class=${d.e(this.inputClasses)}
67
67
  .type=${this.inputType}
68
68
  id="${this.id}-input"
69
- min=${u.o(this.min)}
70
- max=${u.o(this.max)}
71
- placeholder=${u.o(this.placeholder)}
69
+ min=${h.o(this.min)}
70
+ max=${h.o(this.max)}
71
+ placeholder=${h.o(this.placeholder)}
72
72
  ?readonly=${this.readonly}
73
73
  ?disabled=${this.disabled||this.maxlength&&this._value.length>=this.maxlength}
74
74
  @click=${t=>{t.preventDefault(),this.showCalendar()}}
@@ -79,9 +79,9 @@
79
79
  @change=${t=>{this.touched=!0,t.stopImmediatePropagation()}}
80
80
  ${r.n(this.inputRef)}
81
81
  />
82
- `}renderTags(){return l.x`
82
+ `}renderTags(){return s.x`
83
83
  <div class="pkt-datepicker__tags" aria-live="polite">
84
- ${this._value[0]?k.c((this._value??[]).filter(Boolean).sort(),t=>t,t=>l.x`
84
+ ${this._value[0]?y.c((this._value??[]).filter(Boolean).sort(),t=>t,t=>s.x`
85
85
  <pkt-tag
86
86
  .id="${this.id+t+"-tag"}"
87
87
  closeTag
@@ -89,9 +89,9 @@
89
89
  @close=${()=>{var e;return(e=this.calRef.value)==null?void 0:e.handleDateSelect(o.fromISOToDate(t))}}
90
90
  ><time datetime="${t}">${o.fromISOtoLocal(t,this.dateformat)}</time></pkt-tag
91
91
  >
92
- `):l.E}
92
+ `):s.E}
93
93
  </div>
94
- `}renderCalendar(){return l.x`<div
94
+ `}renderCalendar(){return s.x`<div
95
95
  class="pkt-calendar-popup pkt-${this.calendarOpen?"show":"hide"}"
96
96
  @focusout=${t=>{this.calendarOpen&&this.handleFocusOut(t)}}
97
97
  id="${this.id}-popup"
@@ -114,7 +114,7 @@
114
114
  @close=${()=>{this.onBlur(),this.hideCalendar()}}
115
115
  ${r.n(this.calRef)}
116
116
  ></pkt-calendar>
117
- </div>`}render(){return this.inputClasses={"pkt-input":!0,"pkt-datepicker__input":!0,"pkt-input--fullwidth":this.fullwidth,"pkt-datepicker--hasrangelabels":this.showRangeLabels,"pkt-datepicker--multiple":this.multiple,"pkt-datepicker--range":this.range},this.buttonClasses={"pkt-input-icon":!0,"pkt-btn":!0,"pkt-btn--icon-only":!0,"pkt-btn--tertiary":!0,"pkt-datepicker__calendar-button":!0},l.x`
117
+ </div>`}render(){return this.inputClasses={"pkt-input":!0,"pkt-datepicker__input":!0,"pkt-input--fullwidth":this.fullwidth,"pkt-datepicker--hasrangelabels":this.showRangeLabels,"pkt-datepicker--multiple":this.multiple,"pkt-datepicker--range":this.range},this.buttonClasses={"pkt-input-icon":!0,"pkt-btn":!0,"pkt-btn--icon-only":!0,"pkt-btn--tertiary":!0,"pkt-datepicker__calendar-button":!0},s.x`
118
118
  <pkt-input-wrapper
119
119
  label="${this.label}"
120
120
  forId="${this.id}-input"
@@ -140,7 +140,7 @@
140
140
  class="pkt-datepicker"
141
141
  >
142
142
  <div class="pkt-contents" ${r.n(this.helptextSlot)} name="helptext" slot="helptext"></div>
143
- ${this.multiple?this.renderTags():l.E}
143
+ ${this.multiple?this.renderTags():s.E}
144
144
  <div
145
145
  class="pkt-datepicker__inputs ${this.range&&this.showRangeLabels?"pkt-input__range-inputs":""}"
146
146
  >
@@ -161,4 +161,4 @@
161
161
  </div>
162
162
  </pkt-input-wrapper>
163
163
  ${this.renderCalendar()}
164
- `}handleCalendarPosition(){var t;if(this.popupRef.value&&this.inputRef.value){const e=this.multiple&&!!this.maxlength,i=((t=this.inputRef.value.parentElement)==null?void 0:t.getBoundingClientRect())||this.inputRef.value.getBoundingClientRect(),a=e?i.height+30:i.height,s=this.popupRef.value.getBoundingClientRect().height;let h=e?"calc(100% - 30px)":"100%";i&&i.top+s>window.innerHeight&&i.top-s>0&&(h=`calc(100% - ${a}px - ${s}px)`),this.popupRef.value.style.top=h}}handleFocusOut(t){this.contains(t.target)||(this.onBlur(),this.hideCalendar())}async showCalendar(){var t;this.calendarOpen=!0,await m(20),this.handleCalendarPosition(),this.isMobileSafari&&((t=this.calRef.value)==null||t.focusOnCurrentDate())}hideCalendar(){this.calendarOpen=!1}async toggleCalendar(t){t.preventDefault(),this.calendarOpen?this.hideCalendar():this.showCalendar()}clearInputValue(){this._value=[],this.value=""}};n([l.n({type:String,reflect:!0})],exports.PktDatepicker.prototype,"value",1);n([l.n({type:Array})],exports.PktDatepicker.prototype,"_value",2);n([l.n({type:String,reflect:!0})],exports.PktDatepicker.prototype,"label",2);n([l.n({type:String})],exports.PktDatepicker.prototype,"dateformat",2);n([l.n({type:Boolean,reflect:!0})],exports.PktDatepicker.prototype,"multiple",2);n([l.n({type:Number,reflect:!0})],exports.PktDatepicker.prototype,"maxlength",2);n([l.n({type:Boolean,reflect:!0})],exports.PktDatepicker.prototype,"range",2);n([l.n({type:Boolean})],exports.PktDatepicker.prototype,"showRangeLabels",2);n([l.n({type:String,reflect:!0})],exports.PktDatepicker.prototype,"min",2);n([l.n({type:String,reflect:!0})],exports.PktDatepicker.prototype,"max",2);n([l.n({type:Boolean})],exports.PktDatepicker.prototype,"weeknumbers",2);n([l.n({type:Boolean,reflect:!0})],exports.PktDatepicker.prototype,"withcontrols",2);n([l.n({converter:o.converters.csvToArray})],exports.PktDatepicker.prototype,"excludedates",2);n([l.n({converter:o.converters.csvToArray})],exports.PktDatepicker.prototype,"excludeweekdays",2);n([l.n({type:String})],exports.PktDatepicker.prototype,"currentmonth",2);n([l.n({type:Boolean,reflect:!0})],exports.PktDatepicker.prototype,"calendarOpen",2);n([l.n({type:String})],exports.PktDatepicker.prototype,"timezone",2);n([v.r()],exports.PktDatepicker.prototype,"inputClasses",2);n([v.r()],exports.PktDatepicker.prototype,"buttonClasses",2);exports.PktDatepicker=n([l.t("pkt-datepicker")],exports.PktDatepicker);
164
+ `}handleCalendarPosition(){var t;if(this.popupRef.value&&this.inputRef.value){const e=this.multiple&&!!this.maxlength,i=((t=this.inputRef.value.parentElement)==null?void 0:t.getBoundingClientRect())||this.inputRef.value.getBoundingClientRect(),a=e?i.height+30:i.height,l=this.popupRef.value.getBoundingClientRect().height;let u=e?"calc(100% - 30px)":"100%";i&&i.top+l>window.innerHeight&&i.top-l>0&&(u=`calc(100% - ${a}px - ${l}px)`),this.popupRef.value.style.top=u}}handleFocusOut(t){this.contains(t.target)||(this.onBlur(),this.hideCalendar())}async showCalendar(){var t;this.calendarOpen=!0,await g(20),this.handleCalendarPosition(),this.isMobileSafari&&((t=this.calRef.value)==null||t.focusOnCurrentDate())}hideCalendar(){this.calendarOpen=!1}async toggleCalendar(t){t.preventDefault(),this.calendarOpen?this.hideCalendar():this.showCalendar()}clearInputValue(){this._value=[],this.value=""}};n([s.n({type:String,reflect:!0})],exports.PktDatepicker.prototype,"value",1);n([s.n({type:Array})],exports.PktDatepicker.prototype,"_value",2);n([s.n({type:String,reflect:!0})],exports.PktDatepicker.prototype,"label",2);n([s.n({type:String})],exports.PktDatepicker.prototype,"dateformat",2);n([s.n({type:Boolean,reflect:!0})],exports.PktDatepicker.prototype,"multiple",2);n([s.n({type:Number,reflect:!0})],exports.PktDatepicker.prototype,"maxlength",2);n([s.n({type:Boolean,reflect:!0})],exports.PktDatepicker.prototype,"range",2);n([s.n({type:Boolean})],exports.PktDatepicker.prototype,"showRangeLabels",2);n([s.n({type:String,reflect:!0})],exports.PktDatepicker.prototype,"min",2);n([s.n({type:String,reflect:!0})],exports.PktDatepicker.prototype,"max",2);n([s.n({type:Boolean})],exports.PktDatepicker.prototype,"weeknumbers",2);n([s.n({type:Boolean,reflect:!0})],exports.PktDatepicker.prototype,"withcontrols",2);n([s.n({converter:o.converters.csvToArray})],exports.PktDatepicker.prototype,"excludedates",2);n([s.n({converter:o.converters.csvToArray})],exports.PktDatepicker.prototype,"excludeweekdays",2);n([s.n({type:String})],exports.PktDatepicker.prototype,"currentmonth",2);n([s.n({type:Boolean,reflect:!0})],exports.PktDatepicker.prototype,"calendarOpen",2);n([s.n({type:String})],exports.PktDatepicker.prototype,"timezone",2);n([v.r()],exports.PktDatepicker.prototype,"inputClasses",2);n([v.r()],exports.PktDatepicker.prototype,"buttonClasses",2);exports.PktDatepicker=n([s.t("pkt-datepicker")],exports.PktDatepicker);
@@ -1,16 +1,16 @@
1
1
  import { e as f } from "./class-map-BpTj9gtz.js";
2
- import { o } from "./if-defined-CmuO4Vz9.js";
3
- import { x as p, E as g, n as r, a as R } from "./element-CgEWt74-.js";
4
- import { r as x } from "./state-Bo2bck5_.js";
5
- import { n as y, f as $, a as C, b, p as _, d as w } from "./calendar-CJSxvwAq.js";
6
- import { P as S } from "./input-element-NnrDmp4r.js";
7
- import { e as m, n as d } from "./ref-BBYSqgeW.js";
8
- import { c as T } from "./repeat-C8BeHwYx.js";
2
+ import { o as h } from "./if-defined-CmuO4Vz9.js";
3
+ import { x as u, E as g, n as r, a as R } from "./element-CgEWt74-.js";
4
+ import { r as k } from "./state-Bo2bck5_.js";
5
+ import { n as v, f as y, a as w, b as $, p as C, d as x } from "./calendar-CJSxvwAq.js";
6
+ import { P as _ } from "./input-element-NnrDmp4r.js";
7
+ import { e as m, n as p } from "./ref-BBYSqgeW.js";
8
+ import { c as S } from "./repeat-C8BeHwYx.js";
9
9
  import "./icon-CC1js8eR.js";
10
10
  import "./input-wrapper-Dr__Sxql.js";
11
11
  import "./tag-DyXzTY68.js";
12
- import { P as D } from "./pkt-slot-controller-BPGj-LC5.js";
13
- const I = {
12
+ import { P as T } from "./pkt-slot-controller-BPGj-LC5.js";
13
+ const D = {
14
14
  dateformat: {
15
15
  default: "dd.MM.yyyy"
16
16
  },
@@ -33,15 +33,15 @@ const I = {
33
33
  default: !1
34
34
  }
35
35
  }, c = {
36
- props: I
36
+ props: D
37
37
  };
38
- var P = Object.defineProperty, B = Object.getOwnPropertyDescriptor, n = (t, e, i, a) => {
39
- for (var s = a > 1 ? void 0 : a ? B(e, i) : e, h = t.length - 1, u; h >= 0; h--)
40
- (u = t[h]) && (s = (a ? u(e, i, s) : u(s)) || s);
41
- return a && s && P(e, i, s), s;
38
+ var I = Object.defineProperty, P = Object.getOwnPropertyDescriptor, n = (t, e, i, s) => {
39
+ for (var a = s > 1 ? void 0 : s ? P(e, i) : e, o = t.length - 1, d; o >= 0; o--)
40
+ (d = t[o]) && (a = (s ? d(e, i, a) : d(a)) || a);
41
+ return s && a && I(e, i, a), a;
42
42
  };
43
- const k = (t) => new Promise((e) => setTimeout(e, t));
44
- let l = class extends S {
43
+ const b = (t) => new Promise((e) => setTimeout(e, t));
44
+ let l = class extends _ {
45
45
  /**
46
46
  * Housekeeping / lifecycle methods
47
47
  */
@@ -49,9 +49,9 @@ let l = class extends S {
49
49
  super(), this._valueProperty = "", this._value = [], this.label = "Datovelger", this.dateformat = c.props.dateformat.default, this.multiple = c.props.multiple.default, this.maxlength = null, this.range = c.props.range.default, this.showRangeLabels = !1, this.min = null, this.max = null, this.weeknumbers = c.props.weeknumbers.default, this.withcontrols = c.props.withcontrols.default, this.excludedates = [], this.excludeweekdays = [], this.currentmonth = null, this.calendarOpen = !1, this.timezone = "Europe/Oslo", this.inputClasses = {}, this.buttonClasses = {}, this.inputRef = m(), this.inputRefTo = m(), this.btnRef = m(), this.calRef = m(), this.popupRef = m(), this.helptextSlot = m(), this.addToSelected = (t) => {
50
50
  const e = t.target;
51
51
  if (!e.value) return;
52
- const i = this.min ? y(this.min) : null, a = this.max ? y(this.max) : null, s = y(e.value.split(",")[0]);
53
- s && !isNaN(s.getTime()) && (!i || s >= i) && (!a || s <= a) && this.calRef.value && this.calRef.value.handleDateSelect(s), e.value = "";
54
- }, this.slotController = new D(this, this.helptextSlot);
52
+ const i = this.min ? v(this.min) : null, s = this.max ? v(this.max) : null, a = v(e.value.split(",")[0]);
53
+ a && !isNaN(a.getTime()) && (!i || a >= i) && (!s || a <= s) && this.calRef.value && this.calRef.value.handleDateSelect(a), e.value = "";
54
+ }, this.slotController = new T(this, this.helptextSlot);
55
55
  }
56
56
  get value() {
57
57
  return this._valueProperty;
@@ -64,11 +64,11 @@ let l = class extends S {
64
64
  super.connectedCallback();
65
65
  const t = navigator.userAgent, e = /iP(hone|od|ad)/.test(t);
66
66
  this.inputType = e ? "text" : "date", document && document.body.addEventListener("click", (i) => {
67
- var a, s;
68
- (a = this.inputRef) != null && a.value && ((s = this.btnRef) != null && s.value) && !this.inputRef.value.contains(i.target) && !(this.inputRefTo.value && this.inputRefTo.value.contains(i.target)) && !this.btnRef.value.contains(i.target) && !i.target.closest(".pkt-calendar-popup") && this.calendarOpen && (this.onBlur(), this.hideCalendar());
67
+ var s, a;
68
+ (s = this.inputRef) != null && s.value && ((a = this.btnRef) != null && a.value) && !this.inputRef.value.contains(i.target) && !(this.inputRefTo.value && this.inputRefTo.value.contains(i.target)) && !this.btnRef.value.contains(i.target) && !i.target.closest(".pkt-calendar-popup") && this.calendarOpen && (this.onBlur(), this.hideCalendar());
69
69
  }), document && document.body.addEventListener("keydown", (i) => {
70
70
  i.key === "Escape" && this.calendarOpen && this.hideCalendar();
71
- }), this.value && (this._value = Array.isArray(this.value) ? this.value.filter(Boolean) : this.value.split(",").filter(Boolean)), this.min = this.min || c.props.min.default, this.max = this.max || c.props.max.default, typeof this.excludedates == "string" && (this.excludedates = this.excludedates.split(",")), typeof this.excludeweekdays == "string" && (this.excludeweekdays = this.excludeweekdays.split(",")), (this.multiple || this.range) && this.name && !this.name.endsWith("[]") && (this.name = this.name + "[]"), this.calendarOpen && (await k(20), this.handleCalendarPosition());
71
+ }), this.value && (this._value = Array.isArray(this.value) ? this.value.filter(Boolean) : this.value.split(",").filter(Boolean)), this.min = this.min || c.props.min.default, this.max = this.max || c.props.max.default, typeof this.excludedates == "string" && (this.excludedates = this.excludedates.split(",")), typeof this.excludeweekdays == "string" && (this.excludeweekdays = this.excludeweekdays.split(",")), (this.multiple || this.range) && this.name && !this.name.endsWith("[]") && (this.name = this.name + "[]"), this.calendarOpen && (await b(20), this.handleCalendarPosition());
72
72
  }
73
73
  disconnectedCallback() {
74
74
  super.disconnectedCallback(), document && document.body.removeEventListener("click", (t) => {
@@ -80,27 +80,19 @@ let l = class extends S {
80
80
  this.dispatchEvent(new Event("input", { bubbles: !0 }));
81
81
  }
82
82
  valueChanged(t, e) {
83
- if (t !== e) {
84
- let i = [];
85
- if (t && (typeof t == "string" ? i = t.split(",").filter(Boolean) : i = String(t).split(",").filter(Boolean)), this.min || this.max) {
86
- const s = this.min ? new Date(this.min) : null, h = this.max ? new Date(this.max) : null;
87
- i = i.filter((u) => {
88
- const v = new Date(u);
89
- return !(isNaN(v.getTime()) || s && v < s || h && v > h);
90
- });
91
- }
92
- this._value = i;
93
- const a = i.join(",");
94
- this._valueProperty !== a && (this._valueProperty = a), super.valueChanged(a, e);
95
- }
83
+ if (t === e) return;
84
+ let i = [];
85
+ t && (typeof t == "string" ? i = t.split(",").filter(Boolean) : i = String(t).split(",").filter(Boolean)), this._value = i;
86
+ const s = i.join(",");
87
+ this._valueProperty !== s && (this._valueProperty = s), super.valueChanged(s, e);
96
88
  }
97
89
  attributeChangedCallback(t, e, i) {
98
90
  t === "value" && this.value !== e && this.valueChanged(i, e), t === "excludedates" && typeof this.excludedates == "string" && (this.excludedates = (i == null ? void 0 : i.split(",")) ?? []), t === "excludeweekdays" && typeof this.excludeweekdays == "string" && (this.excludeweekdays = (i == null ? void 0 : i.split(",")) ?? []), super.attributeChangedCallback(t, e, i);
99
91
  }
100
92
  updated(t) {
101
93
  if (t.has("value")) {
102
- const e = Array.isArray(this.value) ? this.value.join(",") : this.value, i = t.get("value"), a = Array.isArray(i) ? i.join(",") : i;
103
- this.valueChanged(e, a);
94
+ const e = Array.isArray(this.value) ? this.value.join(",") : this.value, i = t.get("value"), s = Array.isArray(i) ? i.join(",") : i;
95
+ this.valueChanged(e, s);
104
96
  }
105
97
  t.has("multiple") && (this.multiple && !Array.isArray(this._value) ? this._value = typeof this.value == "string" ? this.value ? this.value.split(",").filter(Boolean) : [] : [] : !this.multiple && Array.isArray(this._value) && (this._value = this._value.filter(Boolean)), !this.multiple && !this.range && Array.isArray(this._value) && (this._value = [this._value[0] ?? ""])), super.updated(t);
106
98
  }
@@ -108,15 +100,15 @@ let l = class extends S {
108
100
  * Rendering
109
101
  */
110
102
  renderInput() {
111
- return p`
103
+ return u`
112
104
  <input
113
105
  class="${f(this.inputClasses)}"
114
106
  .type=${this.inputType}
115
107
  id="${this.id}-input"
116
108
  .value=${this._value[0] ?? ""}
117
- min=${o(this.min)}
118
- max=${o(this.max)}
119
- placeholder=${o(this.placeholder)}
109
+ min=${h(this.min)}
110
+ max=${h(this.max)}
111
+ placeholder=${h(this.placeholder)}
120
112
  ?readonly=${this.readonly}
121
113
  aria-describedby="${this.id}-helptext"
122
114
  @click=${(t) => {
@@ -126,8 +118,8 @@ let l = class extends S {
126
118
  @keydown=${(t) => {
127
119
  var e, i;
128
120
  if (t.key === "," && ((e = this.inputRef.value) == null || e.blur()), (t.key === "Space" || t.key === " ") && (t.preventDefault(), this.toggleCalendar(t)), t.key === "Enter") {
129
- const a = this.internals.form;
130
- a ? a.requestSubmit() : (i = this.inputRef.value) == null || i.blur();
121
+ const s = this.internals.form;
122
+ s ? s.requestSubmit() : (i = this.inputRef.value) == null || i.blur();
131
123
  }
132
124
  }}
133
125
  @input=${(t) => {
@@ -143,7 +135,7 @@ let l = class extends S {
143
135
  @change=${(t) => {
144
136
  this.touched = !0, t.stopImmediatePropagation();
145
137
  }}
146
- ${d(this.inputRef)}
138
+ ${p(this.inputRef)}
147
139
  />
148
140
  `;
149
141
  }
@@ -152,26 +144,26 @@ let l = class extends S {
152
144
  "pkt-input-prefix": this.showRangeLabels,
153
145
  "pkt-hide": !this.showRangeLabels
154
146
  };
155
- return p`
156
- ${this.showRangeLabels ? p` <div class="pkt-input-prefix">${this.strings.generic.from}</div> ` : g}
147
+ return u`
148
+ ${this.showRangeLabels ? u` <div class="pkt-input-prefix">${this.strings.generic.from}</div> ` : g}
157
149
  <input
158
150
  class=${f(this.inputClasses)}
159
151
  .type=${this.inputType}
160
152
  id="${this.id}-input"
161
153
  .value=${this._value[0] ?? ""}
162
- min=${o(this.min)}
163
- max=${o(this.max)}
164
- placeholder=${o(this.placeholder)}
154
+ min=${h(this.min)}
155
+ max=${h(this.max)}
156
+ placeholder=${h(this.placeholder)}
165
157
  ?readonly=${this.readonly}
166
158
  ?disabled=${this.disabled}
167
159
  @click=${(e) => {
168
160
  e.preventDefault(), this.showCalendar();
169
161
  }}
170
162
  @keydown=${(e) => {
171
- var i, a;
163
+ var i, s;
172
164
  if (e.key === "," && ((i = this.inputRef.value) == null || i.blur()), (e.key === "Space" || e.key === " ") && (e.preventDefault(), this.toggleCalendar(e)), e.key === "Enter") {
173
- const s = this.internals.form;
174
- s ? s.requestSubmit() : (a = this.inputRefTo.value) == null || a.focus();
165
+ const a = this.internals.form;
166
+ a ? a.requestSubmit() : (s = this.inputRefTo.value) == null || s.focus();
175
167
  }
176
168
  }}
177
169
  @input=${(e) => {
@@ -181,41 +173,41 @@ let l = class extends S {
181
173
  this.onFocus(), this.isMobileSafari && this.showCalendar();
182
174
  }}
183
175
  @blur=${(e) => {
184
- var i, a;
176
+ var i, s;
185
177
  if (e.target.value) {
186
178
  this.manageValidity(e.target);
187
- const s = $(e.target.value);
188
- s && this._value[0] !== e.target.value && this._value[1] && (this.clearInputValue(), (a = (i = this.calRef) == null ? void 0 : i.value) == null || a.handleDateSelect(s));
179
+ const a = y(e.target.value);
180
+ a && this._value[0] !== e.target.value && this._value[1] && (this.clearInputValue(), (s = (i = this.calRef) == null ? void 0 : i.value) == null || s.handleDateSelect(a));
189
181
  } else this._value[0] && this.clearInputValue();
190
182
  }}
191
183
  @change=${(e) => {
192
184
  e.stopImmediatePropagation();
193
185
  }}
194
- ${d(this.inputRef)}
186
+ ${p(this.inputRef)}
195
187
  />
196
188
  <div class="${f(t)}" id="${this.id}-to-label">
197
189
  ${this.strings.generic.to}
198
190
  </div>
199
- ${this.showRangeLabels ? g : p` <div class="pkt-input-separator">–</div> `}
191
+ ${this.showRangeLabels ? g : u` <div class="pkt-input-separator">–</div> `}
200
192
  <input
201
193
  class=${f(this.inputClasses)}
202
194
  .type=${this.inputType}
203
195
  id="${this.id}-to"
204
196
  aria-labelledby="${this.id}-to-label"
205
197
  .value=${this._value[1] ?? ""}
206
- min=${o(this.min)}
207
- max=${o(this.max)}
208
- placeholder=${o(this.placeholder)}
198
+ min=${h(this.min)}
199
+ max=${h(this.max)}
200
+ placeholder=${h(this.placeholder)}
209
201
  ?readonly=${this.readonly}
210
202
  ?disabled=${this.disabled}
211
203
  @click=${(e) => {
212
204
  e.preventDefault(), this.showCalendar();
213
205
  }}
214
206
  @keydown=${(e) => {
215
- var i, a;
207
+ var i, s;
216
208
  if (e.key === "," && ((i = this.inputRefTo.value) == null || i.blur()), (e.key === "Space" || e.key === " ") && (e.preventDefault(), this.toggleCalendar(e)), e.key === "Enter") {
217
- const s = this.internals.form;
218
- s ? s.requestSubmit() : (a = this.inputRefTo.value) == null || a.blur();
209
+ const a = this.internals.form;
210
+ a ? a.requestSubmit() : (s = this.inputRefTo.value) == null || s.blur();
219
211
  }
220
212
  }}
221
213
  @input=${(e) => {
@@ -225,39 +217,39 @@ let l = class extends S {
225
217
  this.onFocus(), this.isMobileSafari && this.showCalendar();
226
218
  }}
227
219
  @blur=${(e) => {
228
- var i, a, s;
220
+ var i, s, a;
229
221
  if ((i = this.calRef.value) != null && i.contains(e.relatedTarget) || this.onBlur(), e.target.value) {
230
222
  this.manageValidity(e.target);
231
- const h = e.target.value;
232
- this.min && this.min > h ? this.internals.setValidity(
223
+ const o = e.target.value;
224
+ this.min && this.min > o ? this.internals.setValidity(
233
225
  { rangeUnderflow: !0 },
234
226
  this.strings.forms.messages.rangeUnderflow,
235
227
  e.target
236
- ) : this.max && this.max < h && this.internals.setValidity(
228
+ ) : this.max && this.max < o && this.internals.setValidity(
237
229
  { rangeOverflow: !0 },
238
230
  this.strings.forms.messages.rangeOverflow,
239
231
  e.target
240
232
  );
241
- const u = $(e.target.value);
242
- u && this._value[1] !== C(u) && ((s = (a = this.calRef) == null ? void 0 : a.value) == null || s.handleDateSelect(u));
233
+ const d = y(e.target.value);
234
+ d && this._value[1] !== w(d) && ((a = (s = this.calRef) == null ? void 0 : s.value) == null || a.handleDateSelect(d));
243
235
  }
244
236
  }}
245
237
  @change=${(e) => {
246
238
  this.touched = !0, e.stopImmediatePropagation();
247
239
  }}
248
- ${d(this.inputRefTo)}
240
+ ${p(this.inputRefTo)}
249
241
  />
250
242
  `;
251
243
  }
252
244
  renderMultipleInput() {
253
- return p`
245
+ return u`
254
246
  <input
255
247
  class=${f(this.inputClasses)}
256
248
  .type=${this.inputType}
257
249
  id="${this.id}-input"
258
- min=${o(this.min)}
259
- max=${o(this.max)}
260
- placeholder=${o(this.placeholder)}
250
+ min=${h(this.min)}
251
+ max=${h(this.max)}
252
+ placeholder=${h(this.placeholder)}
261
253
  ?readonly=${this.readonly}
262
254
  ?disabled=${this.disabled || this.maxlength && this._value.length >= this.maxlength}
263
255
  @click=${(t) => {
@@ -283,29 +275,29 @@ let l = class extends S {
283
275
  @change=${(t) => {
284
276
  this.touched = !0, t.stopImmediatePropagation();
285
277
  }}
286
- ${d(this.inputRef)}
278
+ ${p(this.inputRef)}
287
279
  />
288
280
  `;
289
281
  }
290
282
  renderTags() {
291
- return p`
283
+ return u`
292
284
  <div class="pkt-datepicker__tags" aria-live="polite">
293
- ${this._value[0] ? T(
285
+ ${this._value[0] ? S(
294
286
  (this._value ?? []).filter(Boolean).sort(),
295
287
  (t) => t,
296
- (t) => p`
288
+ (t) => u`
297
289
  <pkt-tag
298
290
  .id="${this.id + t + "-tag"}"
299
291
  closeTag
300
- ariaLabel="${this.strings.calendar.deleteDate} ${b(
292
+ ariaLabel="${this.strings.calendar.deleteDate} ${$(
301
293
  t,
302
294
  this.dateformat
303
295
  )}"
304
296
  @close=${() => {
305
297
  var e;
306
- return (e = this.calRef.value) == null ? void 0 : e.handleDateSelect($(t));
298
+ return (e = this.calRef.value) == null ? void 0 : e.handleDateSelect(y(t));
307
299
  }}
308
- ><time datetime="${t}">${b(t, this.dateformat)}</time></pkt-tag
300
+ ><time datetime="${t}">${$(t, this.dateformat)}</time></pkt-tag
309
301
  >
310
302
  `
311
303
  ) : g}
@@ -313,13 +305,13 @@ let l = class extends S {
313
305
  `;
314
306
  }
315
307
  renderCalendar() {
316
- return p`<div
308
+ return u`<div
317
309
  class="pkt-calendar-popup pkt-${this.calendarOpen ? "show" : "hide"}"
318
310
  @focusout=${(t) => {
319
311
  this.calendarOpen && this.handleFocusOut(t);
320
312
  }}
321
313
  id="${this.id}-popup"
322
- ${d(this.popupRef)}
314
+ ${p(this.popupRef)}
323
315
  >
324
316
  <pkt-calendar
325
317
  id="${this.id}-calendar"
@@ -333,14 +325,14 @@ let l = class extends S {
333
325
  .latest=${this.max}
334
326
  .excludedates=${Array.isArray(this.excludedates) ? this.excludedates : this.excludedates.split(",")}
335
327
  .excludeweekdays=${this.excludeweekdays}
336
- .currentmonth=${this.currentmonth ? _(this.currentmonth) : null}
328
+ .currentmonth=${this.currentmonth ? C(this.currentmonth) : null}
337
329
  @date-selected=${(t) => {
338
330
  this.value = !this.multiple && !this.range ? t.detail[0] : Array.isArray(t.detail) ? t.detail.join(",") : t.detail, this._value = t.detail, this.inputRef.value && (this.range && this.inputRefTo.value ? (this.inputRef.value.value = this._value[0] ?? "", this.inputRefTo.value.value = this._value[1] ?? "", this.manageValidity(this.inputRef.value), this.manageValidity(this.inputRefTo.value)) : this.multiple || (this.inputRef.value.value = this._value.length ? this._value[0] : "", this.manageValidity(this.inputRef.value)));
339
331
  }}
340
332
  @close=${() => {
341
333
  this.onBlur(), this.hideCalendar();
342
334
  }}
343
- ${d(this.calRef)}
335
+ ${p(this.calRef)}
344
336
  ></pkt-calendar>
345
337
  </div>`;
346
338
  }
@@ -358,7 +350,7 @@ let l = class extends S {
358
350
  "pkt-btn--icon-only": !0,
359
351
  "pkt-btn--tertiary": !0,
360
352
  "pkt-datepicker__calendar-button": !0
361
- }, p`
353
+ }, u`
362
354
  <pkt-input-wrapper
363
355
  label="${this.label}"
364
356
  forId="${this.id}-input"
@@ -383,7 +375,7 @@ let l = class extends S {
383
375
  .ariaDescribedBy=${this.ariaDescribedBy}
384
376
  class="pkt-datepicker"
385
377
  >
386
- <div class="pkt-contents" ${d(this.helptextSlot)} name="helptext" slot="helptext"></div>
378
+ <div class="pkt-contents" ${p(this.helptextSlot)} name="helptext" slot="helptext"></div>
387
379
  ${this.multiple ? this.renderTags() : g}
388
380
  <div
389
381
  class="pkt-datepicker__inputs ${this.range && this.showRangeLabels ? "pkt-input__range-inputs" : ""}"
@@ -398,7 +390,7 @@ let l = class extends S {
398
390
  (t.key === "Enter" || t.key === " " || t.key === "Space") && (t.preventDefault(), this.toggleCalendar(t));
399
391
  }}
400
392
  ?disabled=${this.disabled}
401
- ${d(this.btnRef)}
393
+ ${p(this.btnRef)}
402
394
  >
403
395
  <pkt-icon name="calendar"></pkt-icon>
404
396
  <span class="pkt-btn__text">${this.strings.calendar.buttonAltText}</span>
@@ -415,9 +407,9 @@ let l = class extends S {
415
407
  handleCalendarPosition() {
416
408
  var t;
417
409
  if (this.popupRef.value && this.inputRef.value) {
418
- const e = this.multiple && !!this.maxlength, i = ((t = this.inputRef.value.parentElement) == null ? void 0 : t.getBoundingClientRect()) || this.inputRef.value.getBoundingClientRect(), a = e ? i.height + 30 : i.height, s = this.popupRef.value.getBoundingClientRect().height;
419
- let h = e ? "calc(100% - 30px)" : "100%";
420
- i && i.top + s > window.innerHeight && i.top - s > 0 && (h = `calc(100% - ${a}px - ${s}px)`), this.popupRef.value.style.top = h;
410
+ const e = this.multiple && !!this.maxlength, i = ((t = this.inputRef.value.parentElement) == null ? void 0 : t.getBoundingClientRect()) || this.inputRef.value.getBoundingClientRect(), s = e ? i.height + 30 : i.height, a = this.popupRef.value.getBoundingClientRect().height;
411
+ let o = e ? "calc(100% - 30px)" : "100%";
412
+ i && i.top + a > window.innerHeight && i.top - a > 0 && (o = `calc(100% - ${s}px - ${a}px)`), this.popupRef.value.style.top = o;
421
413
  }
422
414
  }
423
415
  handleFocusOut(t) {
@@ -425,7 +417,7 @@ let l = class extends S {
425
417
  }
426
418
  async showCalendar() {
427
419
  var t;
428
- this.calendarOpen = !0, await k(20), this.handleCalendarPosition(), this.isMobileSafari && ((t = this.calRef.value) == null || t.focusOnCurrentDate());
420
+ this.calendarOpen = !0, await b(20), this.handleCalendarPosition(), this.isMobileSafari && ((t = this.calRef.value) == null || t.focusOnCurrentDate());
429
421
  }
430
422
  hideCalendar() {
431
423
  this.calendarOpen = !1;
@@ -474,10 +466,10 @@ n([
474
466
  r({ type: Boolean, reflect: !0 })
475
467
  ], l.prototype, "withcontrols", 2);
476
468
  n([
477
- r({ converter: w.csvToArray })
469
+ r({ converter: x.csvToArray })
478
470
  ], l.prototype, "excludedates", 2);
479
471
  n([
480
- r({ converter: w.csvToArray })
472
+ r({ converter: x.csvToArray })
481
473
  ], l.prototype, "excludeweekdays", 2);
482
474
  n([
483
475
  r({ type: String })
@@ -489,10 +481,10 @@ n([
489
481
  r({ type: String })
490
482
  ], l.prototype, "timezone", 2);
491
483
  n([
492
- x()
484
+ k()
493
485
  ], l.prototype, "inputClasses", 2);
494
486
  n([
495
- x()
487
+ k()
496
488
  ], l.prototype, "buttonClasses", 2);
497
489
  l = n([
498
490
  R("pkt-datepicker")
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./datepicker-CmTrG5GE.cjs"),t=e.PktDatepicker;Object.defineProperty(exports,"PktDatepicker",{enumerable:!0,get:()=>e.PktDatepicker});exports.default=t;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./datepicker-DonUad47.cjs"),t=e.PktDatepicker;Object.defineProperty(exports,"PktDatepicker",{enumerable:!0,get:()=>e.PktDatepicker});exports.default=t;
@@ -1,4 +1,4 @@
1
- import { P as t } from "./datepicker-BJKJBoy_.js";
1
+ import { P as t } from "./datepicker-F3TwE9o7.js";
2
2
  const a = t;
3
3
  export {
4
4
  t as PktDatepicker,
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const P=require("./alert-7rUOhlNi.cjs"),l=require("./accordionitem-Csh7iSVG.cjs"),d=require("./backlink-JbBNi3qg.cjs"),b=require("./button-B8rdtaHB.cjs"),k=require("./calendar-32W9p9uc.cjs"),m=require("./card-DBlFf1ry.cjs"),g=require("./combobox-DjO0RMUB.cjs"),h=require("./consent-hYeFWNFr.cjs"),f=require("./checkbox-Gn7Wtk9h.cjs"),t=require("./element-6DBpyGQm.cjs"),y=require("./pkt-slot-controller-BzddBp7z.cjs"),s=require("./ref-iJtiv3o2.cjs"),O=require("./class-map-BBG2gMX4.cjs"),j=require("./datepicker-CmTrG5GE.cjs"),q=require("./helptext-CzQX6YVE.cjs"),x=require("./heading-CNycsyMj.cjs"),C=require("./icon-B_ryAy4Q.cjs"),v=require("./input-wrapper-CZ-a00V7.cjs"),S=require("./link-Cjl0xwSq.cjs"),$=require("./linkcard-DqIvb54H.cjs"),L=require("./loader-DNidjwH-.cjs"),_=require("./messagebox-CjPtPPrW.cjs"),A=require("./modal-CRtxhCaP.cjs"),B=require("./progressbar-DhMBXkww.cjs"),p=require("./radiobutton-CdT6v1oq.cjs"),T=require("./tag-Bbs0U_Au.cjs"),I=require("./textarea-CPXsMFUq.cjs"),M=require("./textinput-aNI5kibM.cjs"),R=require("./select-CD6Zn8YH.cjs");var H=Object.defineProperty,w=Object.getOwnPropertyDescriptor,o=(a,e,r,i)=>{for(var n=i>1?void 0:i?w(e,r):e,u=a.length-1,c;u>=0;u--)(c=a[u])&&(n=(i?c(e,r,n):c(n))||n);return i&&n&&H(e,r,n),n};exports.PktComponent=class extends t.PktElement{constructor(){super(),this.string="",this.strings=[],this.darkmode=!1,this._list=[],this.defaultSlot=s.e(),this.namedSlot=s.e(),this.slotController=new y.PktSlotController(this,this.defaultSlot,this.namedSlot)}connectedCallback(){this.strings.length&&this.strings.forEach(e=>{this._list.push(e.toUpperCase())}),super.connectedCallback()}render(){const e={"pkt-component":!0,"pkt-component--has-list":this.strings.length>0,"pkt-darkmode":this.darkmode};return t.x`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const P=require("./alert-7rUOhlNi.cjs"),l=require("./accordionitem-Csh7iSVG.cjs"),d=require("./backlink-JbBNi3qg.cjs"),b=require("./button-B8rdtaHB.cjs"),k=require("./calendar-32W9p9uc.cjs"),m=require("./card-DBlFf1ry.cjs"),g=require("./combobox-DjO0RMUB.cjs"),h=require("./consent-hYeFWNFr.cjs"),f=require("./checkbox-Gn7Wtk9h.cjs"),t=require("./element-6DBpyGQm.cjs"),y=require("./pkt-slot-controller-BzddBp7z.cjs"),s=require("./ref-iJtiv3o2.cjs"),O=require("./class-map-BBG2gMX4.cjs"),j=require("./datepicker-DonUad47.cjs"),q=require("./helptext-CzQX6YVE.cjs"),x=require("./heading-CNycsyMj.cjs"),C=require("./icon-B_ryAy4Q.cjs"),v=require("./input-wrapper-CZ-a00V7.cjs"),S=require("./link-Cjl0xwSq.cjs"),$=require("./linkcard-DqIvb54H.cjs"),L=require("./loader-DNidjwH-.cjs"),_=require("./messagebox-CjPtPPrW.cjs"),A=require("./modal-CRtxhCaP.cjs"),B=require("./progressbar-DhMBXkww.cjs"),p=require("./radiobutton-CdT6v1oq.cjs"),T=require("./tag-Bbs0U_Au.cjs"),I=require("./textarea-CPXsMFUq.cjs"),M=require("./textinput-aNI5kibM.cjs"),R=require("./select-CD6Zn8YH.cjs");var H=Object.defineProperty,w=Object.getOwnPropertyDescriptor,o=(a,e,r,i)=>{for(var n=i>1?void 0:i?w(e,r):e,u=a.length-1,c;u>=0;u--)(c=a[u])&&(n=(i?c(e,r,n):c(n))||n);return i&&n&&H(e,r,n),n};exports.PktComponent=class extends t.PktElement{constructor(){super(),this.string="",this.strings=[],this.darkmode=!1,this._list=[],this.defaultSlot=s.e(),this.namedSlot=s.e(),this.slotController=new y.PktSlotController(this,this.defaultSlot,this.namedSlot)}connectedCallback(){this.strings.length&&this.strings.forEach(e=>{this._list.push(e.toUpperCase())}),super.connectedCallback()}render(){const e={"pkt-component":!0,"pkt-component--has-list":this.strings.length>0,"pkt-darkmode":this.darkmode};return t.x`
2
2
  <div class="${O.e(e)}">
3
3
  <h1 class="pkt-txt-28">${this.string}</h1>
4
4
 
package/dist/pkt-index.js CHANGED
@@ -12,7 +12,7 @@ import { P as k, t as h, x as P, n, a as c } from "./element-CgEWt74-.js";
12
12
  import { P as x } from "./pkt-slot-controller-BPGj-LC5.js";
13
13
  import { e as m, n as d } from "./ref-BBYSqgeW.js";
14
14
  import { e as u } from "./class-map-BpTj9gtz.js";
15
- import { P as F } from "./datepicker-BJKJBoy_.js";
15
+ import { P as F } from "./datepicker-F3TwE9o7.js";
16
16
  import { P as Q } from "./helptext-B7eI0iBQ.js";
17
17
  import { P as X } from "./heading-Bdh9absf.js";
18
18
  import { P as Z } from "./icon-CC1js8eR.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oslokommune/punkt-elements",
3
- "version": "13.5.6",
3
+ "version": "13.5.10",
4
4
  "description": "Komponentbiblioteket til Punkt, et designsystem laget av Oslo Origo",
5
5
  "homepage": "https://punkt.oslo.kommune.no",
6
6
  "author": "Team Designsystem, Oslo Origo",
@@ -19,14 +19,14 @@
19
19
  "build": "tsc && vite build",
20
20
  "build-app": "tsc && vite build --config vite.config-app.ts",
21
21
  "preview": "vite preview --outDir dist-app",
22
- "test": "jest --config jest.config.cjs"
22
+ "test": "vitest",
23
+ "test:run": "vitest run",
24
+ "test:ui": "vitest --ui"
23
25
  },
24
26
  "dependencies": {
25
27
  "@date-fns/tz": "^1.2.0",
26
28
  "@lit-labs/router": "^0.1.3",
27
- "@types/jest": "^29.5.14",
28
29
  "@types/node": "^20.17.30",
29
- "@types/testing-library__jest-dom": "^5.14.9",
30
30
  "date-fns": "^4.1.0",
31
31
  "dialog-polyfill": "^0.5.6",
32
32
  "lit": "^3.3.0",
@@ -43,15 +43,15 @@
43
43
  "@oslokommune/punkt-assets": "^13.3.1",
44
44
  "@oslokommune/punkt-css": "^13.5.0",
45
45
  "@testing-library/jest-dom": "^6.6.3",
46
- "jest": "^29.7.0",
46
+ "@vitest/ui": "^1.0.0",
47
47
  "jest-axe": "^9.0.0",
48
- "jest-environment-jsdom": "^29.7.0",
48
+ "jsdom": "^23.0.0",
49
49
  "sass": "^1.78.0",
50
- "ts-jest": "^29.2.6",
51
50
  "typescript": "^5.6.2",
52
51
  "vite": "^5.4.18",
53
52
  "vite-plugin-dts": "^4.2.1",
54
- "vite-plugin-web-components-hmr": "^0.1.3"
53
+ "vite-plugin-web-components-hmr": "^0.1.3",
54
+ "vitest": "^1.0.0"
55
55
  },
56
56
  "private": false,
57
57
  "publishConfig": {
@@ -73,5 +73,5 @@
73
73
  "url": "https://github.com/oslokommune/punkt/issues"
74
74
  },
75
75
  "license": "MIT",
76
- "gitHead": "5f0019a262ea4b9086590f7b6d572f5a39142f31"
76
+ "gitHead": "620a533438712c433484060ce628f538354c2c55"
77
77
  }
@@ -1,6 +1,7 @@
1
1
  import '@testing-library/jest-dom'
2
2
  import { axe, toHaveNoViolations } from 'jest-axe'
3
3
  import { fireEvent } from '@testing-library/dom'
4
+ import { vi } from 'vitest'
4
5
  import { createElementTest, BaseTestConfig } from '../../tests/test-framework'
5
6
  import { CustomElementFor } from '../../tests/component-registry'
6
7
  import './alert'
@@ -215,8 +216,8 @@ describe('PktAlert', () => {
215
216
  await alert.updateComplete
216
217
 
217
218
  // Listen for close events
218
- const closeSpy = jest.fn()
219
- const onCloseSpy = jest.fn()
219
+ const closeSpy = vi.fn()
220
+ const onCloseSpy = vi.fn()
220
221
  alert.addEventListener('close', closeSpy)
221
222
  alert.addEventListener('on-close', onCloseSpy)
222
223
 
@@ -1,6 +1,7 @@
1
1
  import '@testing-library/jest-dom'
2
2
  import { axe, toHaveNoViolations } from 'jest-axe'
3
3
  import { fireEvent } from '@testing-library/dom'
4
+ import { vi } from 'vitest'
4
5
  import { createElementTest, BaseTestConfig } from '../../tests/test-framework'
5
6
  import { CustomElementFor } from '../../tests/component-registry'
6
7
  import './button'
@@ -241,7 +242,7 @@ describe('PktButton', () => {
241
242
 
242
243
  test('prevents click events when disabled', async () => {
243
244
  const { button } = await createButtonTest({ disabled: true, content: 'Test Button' })
244
- const clickSpy = jest.fn()
245
+ const clickSpy = vi.fn()
245
246
 
246
247
  await button.updateComplete
247
248
 
@@ -255,7 +256,7 @@ describe('PktButton', () => {
255
256
 
256
257
  test('prevents keyboard events when disabled', async () => {
257
258
  const { button } = await createButtonTest({ disabled: true, content: 'Test Button' })
258
- const clickSpy = jest.fn()
259
+ const clickSpy = vi.fn()
259
260
 
260
261
  await button.updateComplete
261
262
 
@@ -310,7 +311,7 @@ describe('PktButton', () => {
310
311
 
311
312
  test('prevents click events when loading', async () => {
312
313
  const { button } = await createButtonTest({ content: 'Test Button' })
313
- const clickSpy = jest.fn()
314
+ const clickSpy = vi.fn()
314
315
 
315
316
  // Set isLoading as a property
316
317
  button.isLoading = true
@@ -375,7 +376,7 @@ describe('PktButton', () => {
375
376
  describe('Click functionality', () => {
376
377
  test('allows click events when not disabled or loading', async () => {
377
378
  const { button } = await createButtonTest({ content: 'Test Button' })
378
- const clickSpy = jest.fn()
379
+ const clickSpy = vi.fn()
379
380
 
380
381
  await button.updateComplete
381
382
 
@@ -389,7 +390,7 @@ describe('PktButton', () => {
389
390
 
390
391
  test('allows keyboard activation when not disabled or loading', async () => {
391
392
  const { button } = await createButtonTest({ content: 'Test Button' })
392
- const clickSpy = jest.fn()
393
+ const clickSpy = vi.fn()
393
394
 
394
395
  await button.updateComplete
395
396
 
@@ -1,5 +1,6 @@
1
1
  import '@testing-library/jest-dom'
2
2
  import { axe, toHaveNoViolations } from 'jest-axe'
3
+ import { vi } from 'vitest'
3
4
  import { createElementTest, BaseTestConfig } from '../../tests/test-framework'
4
5
  import { CustomElementFor } from '../../tests/component-registry'
5
6
  import './card'
@@ -43,9 +44,9 @@ afterEach(() => {
43
44
  })
44
45
 
45
46
  // Global console.warn spy to suppress validation warnings in tests
46
- let consoleWarnSpy: jest.SpyInstance
47
+ let consoleWarnSpy: any
47
48
  beforeEach(() => {
48
- consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {})
49
+ consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
49
50
  })
50
51
 
51
52
  afterEach(() => {
@@ -151,7 +152,7 @@ describe('PktCard', () => {
151
152
  test('validates skin values and logs warnings for invalid skins', async () => {
152
153
  // Clear the global spy and create a new one for this specific test
153
154
  consoleWarnSpy.mockRestore()
154
- const localConsoleSpy = jest.spyOn(console, 'warn').mockImplementation(() => {})
155
+ const localConsoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
155
156
 
156
157
  const { card } = await createCardTest({ skin: 'zebra' })
157
158
  await card.updateComplete
@@ -166,7 +167,7 @@ describe('PktCard', () => {
166
167
 
167
168
  // Restore and recreate global spy for subsequent tests
168
169
  localConsoleSpy.mockRestore()
169
- consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {})
170
+ consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
170
171
  })
171
172
 
172
173
  test('applies different layout properties correctly', async () => {
@@ -1,6 +1,7 @@
1
1
  import '@testing-library/jest-dom'
2
2
  import { axe, toHaveNoViolations } from 'jest-axe'
3
3
  import { fireEvent } from '@testing-library/dom'
4
+ import { vi } from 'vitest'
4
5
 
5
6
  expect.extend(toHaveNoViolations)
6
7
 
@@ -706,7 +707,7 @@ describe('PktCombobox', () => {
706
707
  const combobox = container.querySelector('pkt-combobox') as PktCombobox
707
708
  await combobox.updateComplete
708
709
 
709
- const searchEventSpy = jest.fn()
710
+ const searchEventSpy = vi.fn()
710
711
  combobox.addEventListener('search', searchEventSpy)
711
712
 
712
713
  // Simulate search change
@@ -1,6 +1,7 @@
1
1
  import '@testing-library/jest-dom'
2
2
  import { axe, toHaveNoViolations } from 'jest-axe'
3
3
  import { fireEvent } from '@testing-library/dom'
4
+ import { vi } from 'vitest'
4
5
  import { createElementTest, BaseTestConfig } from '../../tests/test-framework'
5
6
  import { CustomElementFor } from '../../tests/component-registry'
6
7
  import './consent'
@@ -46,13 +47,13 @@ afterEach(() => {
46
47
  }
47
48
  // Clean up global variables
48
49
  delete window.cookieBanner_googleAnalyticsId
49
- delete window.cookieBanner_hotjarId
50
- delete window.cookieBanner_devMode
51
- delete window.cookieBanner_cookieDomain
52
- delete window.cookieBanner_cookieSecure
53
- delete window.cookieBanner_cookieExpiryDays
54
- delete window.cookieBanner
55
- delete window.__cookieEvents
50
+ ;(window as any).cookieBanner_hotjarId = undefined
51
+ ;(window as any).cookieBanner_devMode = undefined
52
+ ;(window as any).cookieBanner_cookieDomain = undefined
53
+ ;(window as any).cookieBanner_cookieSecure = undefined
54
+ ;(window as any).cookieBanner_cookieExpiryDays = undefined
55
+ ;(window as any).cookieBanner = undefined
56
+ ;(window as any).__cookieEvents = undefined
56
57
  })
57
58
 
58
59
  describe('PktConsent', () => {
@@ -218,10 +219,10 @@ describe('PktConsent', () => {
218
219
  Object.defineProperty(window, 'cookieBanner', {
219
220
  value: {
220
221
  cookieConsent: {
221
- validateConsentCookie: jest.fn().mockResolvedValue(true),
222
- getConsentCookie: jest.fn().mockReturnValue('mock-cookie'),
222
+ validateConsentCookie: vi.fn().mockResolvedValue(true),
223
+ getConsentCookie: vi.fn().mockReturnValue('mock-cookie'),
223
224
  },
224
- openCookieModal: jest.fn(),
225
+ openCookieModal: vi.fn(),
225
226
  },
226
227
  writable: true,
227
228
  })
@@ -229,21 +230,21 @@ describe('PktConsent', () => {
229
230
  // Mock window.__cookieEvents
230
231
  Object.defineProperty(window, '__cookieEvents', {
231
232
  value: {
232
- on: jest.fn(),
233
- off: jest.fn(),
233
+ on: vi.fn(),
234
+ off: vi.fn(),
234
235
  },
235
236
  writable: true,
236
237
  })
237
238
 
238
239
  // Use fake timers to control setTimeout
239
- jest.useFakeTimers()
240
+ vi.useFakeTimers()
240
241
  })
241
242
 
242
243
  afterEach(() => {
243
244
  // Clean up mocks and timers
244
- jest.useRealTimers()
245
- delete (window as any).cookieBanner
246
- delete (window as any).__cookieEvents
245
+ vi.useRealTimers()
246
+ ;(window as any).cookieBanner = undefined
247
+ ;(window as any).__cookieEvents = undefined
247
248
  })
248
249
 
249
250
  test('handles click event on button trigger', async () => {
@@ -255,7 +256,7 @@ describe('PktConsent', () => {
255
256
  fireEvent.click(button!)
256
257
 
257
258
  // Fast-forward time to trigger setTimeout
258
- jest.runAllTimers()
259
+ vi.runAllTimers()
259
260
 
260
261
  expect(window.cookieBanner.openCookieModal).toHaveBeenCalled()
261
262
  })
@@ -271,7 +272,7 @@ describe('PktConsent', () => {
271
272
  fireEvent.click(link!)
272
273
 
273
274
  // Fast-forward time to trigger setTimeout
274
- jest.runAllTimers()
275
+ vi.runAllTimers()
275
276
 
276
277
  expect(window.cookieBanner.openCookieModal).toHaveBeenCalled()
277
278
  })
@@ -415,12 +416,12 @@ describe('PktConsent', () => {
415
416
 
416
417
  // Mock the event system
417
418
  window.__cookieEvents = {
418
- on: jest.fn(),
419
- off: jest.fn(),
419
+ on: vi.fn(),
420
+ off: vi.fn(),
420
421
  }
421
422
 
422
423
  // Set up a handler
423
- const mockHandler = jest.fn()
424
+ const mockHandler = vi.fn()
424
425
  consent['_cookieEventHandler'] = mockHandler
425
426
 
426
427
  // Disconnect the component
@@ -179,44 +179,25 @@ export class PktDatepicker extends PktInputElement {
179
179
  }
180
180
 
181
181
  valueChanged(newValue: string | null, oldValue: string | null): void {
182
- if (newValue !== oldValue) {
183
- let validatedValue: string[] = []
184
-
185
- if (newValue) {
186
- // Handle case where newValue might be a string or need conversion
187
- if (typeof newValue === 'string') {
188
- validatedValue = newValue.split(',').filter(Boolean)
189
- } else {
190
- // If not a string, convert to string first
191
- validatedValue = String(newValue).split(',').filter(Boolean)
192
- }
193
- }
194
-
195
- // Validate dates against min/max boundaries
196
- if (this.min || this.max) {
197
- const minDate = this.min ? new Date(this.min) : null
198
- const maxDate = this.max ? new Date(this.max) : null
199
-
200
- validatedValue = validatedValue.filter((dateStr) => {
201
- const date = new Date(dateStr)
202
- if (isNaN(date.getTime())) return false
203
- if (minDate && date < minDate) return false
204
- if (maxDate && date > maxDate) return false
205
- return true
206
- })
182
+ if (newValue === oldValue) return
183
+
184
+ let parsedValue: string[] = []
185
+ if (newValue) {
186
+ if (typeof newValue === 'string') {
187
+ parsedValue = newValue.split(',').filter(Boolean)
188
+ } else {
189
+ parsedValue = String(newValue).split(',').filter(Boolean)
207
190
  }
191
+ }
208
192
 
209
- this._value = validatedValue
210
-
211
- // Update the public value property to reflect validated value
212
- const validatedValueString = validatedValue.join(',')
213
- if (this._valueProperty !== validatedValueString) {
214
- this._valueProperty = validatedValueString
215
- }
193
+ this._value = parsedValue
216
194
 
217
- // Call base class valueChanged to handle events properly
218
- super.valueChanged(validatedValueString, oldValue)
195
+ const parsedValueString = parsedValue.join(',')
196
+ if (this._valueProperty !== parsedValueString) {
197
+ this._valueProperty = parsedValueString
219
198
  }
199
+
200
+ super.valueChanged(parsedValueString, oldValue)
220
201
  }
221
202
 
222
203
  attributeChangedCallback(name: string, _old: string | null, value: string | null): void {
@@ -79,39 +79,31 @@ describe('PktDatepicker', () => {
79
79
  }
80
80
  })
81
81
 
82
- test('validates dates against earliest/latest boundaries', async () => {
83
- const container = await createDatepicker('min="2024-06-10" max="2024-06-20"')
82
+ test.each`
83
+ description | value | expectedRangeUnderflow | expectedValid
84
+ ${'Test date before min - component should mark it invalid'} | ${'2024-06-05'} | ${true} | ${false}
85
+ ${'Test date after max - component should mark it invalid'} | ${'2024-06-25'} | ${false} | ${false}
86
+ ${'Test valid date - should be accepted and marked valid'} | ${'2024-06-15'} | ${false} | ${true}
87
+ `(
88
+ 'validates dates against earliest/latest boundaries - $description',
89
+ async ({ value, expectedRangeUnderflow, expectedValid }) => {
90
+ const container = await createDatepicker('min="2024-06-10" max="2024-06-20"')
84
91
 
85
- const datepicker = container.querySelector('pkt-datepicker') as PktDatepicker
86
- await datepicker.updateComplete
87
-
88
- const input = datepicker.querySelector('input') as HTMLInputElement
89
-
90
- // Test date before min - component should filter it out
91
- datepicker.value = '2024-06-05'
92
- await datepicker.updateComplete
93
-
94
- // Component should reject invalid date (filter it out)
95
- expect(datepicker.value).toBe('')
96
- expect(input.value).toBe('')
97
-
98
- // Test date after max - component should filter it out
99
- datepicker.value = '2024-06-25'
100
- await datepicker.updateComplete
92
+ const datepicker = container.querySelector('pkt-datepicker') as PktDatepicker
93
+ await datepicker.updateComplete
101
94
 
102
- // Component should reject invalid date (filter it out)
103
- expect(datepicker.value).toBe('')
104
- expect(input.value).toBe('')
95
+ const input = datepicker.querySelector('input') as HTMLInputElement
105
96
 
106
- // Test valid date - should be accepted
107
- datepicker.value = '2024-06-15'
108
- await datepicker.updateComplete
97
+ datepicker.value = value
98
+ await datepicker.updateComplete
109
99
 
110
- // Valid date should be accepted
111
- expect(datepicker.value).toBe('2024-06-15')
112
- expect(input.value).toBe('2024-06-15')
113
- expect(input.validity.valid).toBe(true)
114
- })
100
+ expect(datepicker.value).toBe(value)
101
+ expect(input.value).toBe(value)
102
+ expect(datepicker._value).toEqual([value])
103
+ expect(input.validity.rangeUnderflow).toBe(expectedRangeUnderflow)
104
+ expect(input.validity.valid).toBe(expectedValid)
105
+ },
106
+ )
115
107
  })
116
108
 
117
109
  describe('Error handling and edge cases', () => {
@@ -1,5 +1,6 @@
1
1
  import '@testing-library/jest-dom'
2
2
  import { axe, toHaveNoViolations } from 'jest-axe'
3
+ import { vi } from 'vitest'
3
4
 
4
5
  expect.extend(toHaveNoViolations)
5
6
 
@@ -241,7 +242,7 @@ describe('PktHeading', () => {
241
242
  })
242
243
 
243
244
  test('handles invalid levels gracefully', async () => {
244
- const consoleSpy = jest.spyOn(console, 'warn').mockImplementation()
245
+ const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
245
246
 
246
247
  const container = await createHeading()
247
248
  const heading = container.querySelector('pkt-heading') as PktHeading
@@ -1,5 +1,6 @@
1
1
  import '@testing-library/jest-dom'
2
2
  import { axe, toHaveNoViolations } from 'jest-axe'
3
+ import { vi } from 'vitest'
3
4
  import {
4
5
  createElementTest,
5
6
  BaseTestConfig,
@@ -43,7 +44,7 @@ afterEach(() => {
43
44
  })
44
45
 
45
46
  // Mock fetch for icon loading
46
- const mockFetch = jest.fn()
47
+ const mockFetch = vi.fn()
47
48
  const mockSvgContent =
48
49
  '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="test-path"></path></svg>'
49
50
 
@@ -270,7 +271,7 @@ describe('PktIcon', () => {
270
271
 
271
272
  describe('Global configuration', () => {
272
273
  test('uses custom pktFetch function when provided', async () => {
273
- const customFetch = jest.fn().mockResolvedValue({
274
+ const customFetch = vi.fn().mockResolvedValue({
274
275
  ok: true,
275
276
  text: () => Promise.resolve('<svg>custom</svg>'),
276
277
  })
@@ -1,6 +1,7 @@
1
1
  import '@testing-library/jest-dom'
2
2
  import { axe, toHaveNoViolations } from 'jest-axe'
3
3
  import { fireEvent } from '@testing-library/dom'
4
+ import { vi } from 'vitest'
4
5
  import { createElementTest, BaseTestConfig } from '../../tests/test-framework'
5
6
  import { CustomElementFor } from '../../tests/component-registry'
6
7
  import './link'
@@ -147,7 +148,7 @@ describe('PktLink', () => {
147
148
  await link.updateComplete
148
149
 
149
150
  const anchor = link.querySelector('a')
150
- const clickHandler = jest.fn()
151
+ const clickHandler = vi.fn()
151
152
  anchor?.addEventListener('click', clickHandler)
152
153
 
153
154
  fireEvent.click(anchor!)
@@ -1,6 +1,7 @@
1
1
  import '@testing-library/jest-dom'
2
2
  import { axe, toHaveNoViolations } from 'jest-axe'
3
3
  import { fireEvent } from '@testing-library/dom'
4
+ import { vi } from 'vitest'
4
5
  import { createElementTest, BaseTestConfig } from '../../tests/test-framework'
5
6
  import { CustomElementFor } from '../../tests/component-registry'
6
7
  import { type IPktMessagebox } from './messagebox'
@@ -167,8 +168,8 @@ describe('PktMessagebox', () => {
167
168
  test('dispatches close events when closed', async () => {
168
169
  const { messagebox } = await createMessageboxTest({ closable: true })
169
170
 
170
- const closeHandler = jest.fn()
171
- const onCloseHandler = jest.fn()
171
+ const closeHandler = vi.fn()
172
+ const onCloseHandler = vi.fn()
172
173
  messagebox.addEventListener('close', closeHandler)
173
174
  messagebox.addEventListener('on-close', onCloseHandler)
174
175
 
@@ -1,6 +1,7 @@
1
1
  import '@testing-library/jest-dom'
2
2
  import { axe, toHaveNoViolations } from 'jest-axe'
3
3
  import { fireEvent } from '@testing-library/dom'
4
+ import { vi } from 'vitest'
4
5
  import { createElementTest, BaseTestConfig } from '../../tests/test-framework'
5
6
  import { CustomElementFor } from '../../tests/component-registry'
6
7
  import './radiobutton'
@@ -203,8 +204,8 @@ describe('pkt-radiobutton', () => {
203
204
  test('manages focus events correctly', async () => {
204
205
  const { radiobutton } = await createRadioButtonTest()
205
206
 
206
- const focusSpy = jest.fn()
207
- const blurSpy = jest.fn()
207
+ const focusSpy = vi.fn()
208
+ const blurSpy = vi.fn()
208
209
  radiobutton.addEventListener('focus', focusSpy)
209
210
  radiobutton.addEventListener('blur', blurSpy)
210
211
 
@@ -1,5 +1,6 @@
1
1
  import '@testing-library/jest-dom'
2
2
  import { axe, toHaveNoViolations } from 'jest-axe'
3
+ import { vi } from 'vitest'
3
4
  import { createElementTest, BaseTestConfig } from '../../tests/test-framework'
4
5
  import { CustomElementFor } from '../../tests/component-registry'
5
6
  import { type IPktSelect, type TSelectOption } from './select'
@@ -159,8 +160,8 @@ describe('pkt-select', () => {
159
160
  test('manages focus events correctly', async () => {
160
161
  const { select } = await createSelectTest()
161
162
 
162
- const focusSpy = jest.spyOn(select, 'onFocus')
163
- const blurSpy = jest.spyOn(select, 'onBlur')
163
+ const focusSpy = vi.spyOn(select, 'onFocus')
164
+ const blurSpy = vi.spyOn(select, 'onBlur')
164
165
 
165
166
  const selectElement = select.querySelector('select') as HTMLSelectElement
166
167
 
@@ -1,6 +1,7 @@
1
1
  import '@testing-library/jest-dom'
2
2
  import { axe, toHaveNoViolations } from 'jest-axe'
3
3
  import { fireEvent } from '@testing-library/dom'
4
+ import { vi } from 'vitest'
4
5
  import { createElementTest, BaseTestConfig } from '../../tests/test-framework'
5
6
  import { CustomElementFor } from '../../tests/component-registry'
6
7
  import { type IPktTag } from './tag'
@@ -125,7 +126,7 @@ describe('PktTag', () => {
125
126
 
126
127
  test('dispatches close event when close button is clicked', async () => {
127
128
  const { tag } = await createTagTest({ closeTag: true })
128
- const closeSpy = jest.fn()
129
+ const closeSpy = vi.fn()
129
130
  tag.addEventListener('close', closeSpy)
130
131
 
131
132
  const button = tag.querySelector('button') as HTMLButtonElement