@oslokommune/punkt-elements 16.7.0 → 16.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,23 @@ og skriver commits ca etter [Conventional Commits](https://conventionalcommits.o
5
5
 
6
6
  ---
7
7
 
8
+ ## [16.7.1](https://github.com/oslokommune/punkt/compare/16.7.0...16.7.1) (2026-04-13)
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
+
8
25
  ## [16.7.0](https://github.com/oslokommune/punkt/compare/16.6.2...16.7.0) (2026-04-10)
9
26
 
10
27
  ### ⚠ BREAKING CHANGES
@@ -1,6 +1,6 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("./element-gR_VtSiD.cjs"),_=require("./state-Dg-53wQ8.cjs"),u=require("./ref-CL-Xk9Xm.cjs"),c=require("./if-defined-BOW3ODSj.cjs"),$=require("./class-map-CsENJXf1.cjs"),y=require("./input-element-DdVhUvva.cjs"),S=require("./element-with-slot-ZX-up7jO.cjs");require("./icon-Bqj9oBbl.cjs");require("./input-wrapper-B0MkQ0IZ.cjs");const D=o=>/^\d{2}:\d{2}$/.test(o)&&parseInt(o.slice(0,2),10)<=23&&parseInt(o.slice(3),10)<=59,d=o=>{const[t,e]=o.split(":").map(Number);return t*60+e},m=o=>o?Math.max(1,Math.round(o/60)):1,w=(o,t)=>{const e=o?parseInt(String(o).split(":")[0],10):0,s=t?parseInt(String(t).split(":")[0],10):23;return Array.from({length:s-e+1},(i,n)=>n+e)},x=o=>{const t=m(o);return Array.from({length:Math.floor(60/t)},(e,s)=>s*t)},I=(o,t,e,s)=>{let r=o!==""?parseInt(o,10):e===1?0:23,p=t!==""?parseInt(t,10):e===1?0:Math.floor(59/s)*s;return p+=e*s,p>59?(p=0,r=(r+1)%24):p<0&&(p=Math.floor(59/s)*s,r=(r-1+24)%24),{hours:String(r).padStart(2,"0"),minutes:String(p).padStart(2,"0")}};var A=Object.defineProperty,F=Object.getOwnPropertyDescriptor,h=(o,t,e,s)=>{for(var i=s>1?void 0:s?F(t,e):t,n=o.length-1,r;n>=0;n--)(r=o[n])&&(i=(s?r(t,e,i):r(i))||i);return s&&i&&A(t,e,i),i};exports.PktTimepicker=class extends y.PktInputElement{constructor(){super(...arguments),this.hiddenInputRef=u.e(),this.hoursInputRef=u.e(),this.minutesInputRef=u.e(),this.buttonRef=u.e(),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=t=>{this.contains(t.target)||this._closePopup()},this._handleComponentFocusIn=()=>{this._hasFocus||(this._hasFocus=!0,this.onFocus())},this._handleComponentFocusOut=t=>{this.contains(t.relatedTarget)||(this._hasFocus=!1,this.onBlur())},this._handleHoursKeydown=t=>{var s,i,n;const e=t.target;switch(t.key){case"ArrowUp":{t.preventDefault();const r=this._hours!==""?parseInt(this._hours,10):0;this._hours=String((r+1)%24).padStart(2,"0"),this._syncValueFromDisplay(),this.onInput();break}case"ArrowDown":{t.preventDefault();const r=this._hours!==""?parseInt(this._hours,10):0;this._hours=String((r-1+24)%24).padStart(2,"0"),this._syncValueFromDisplay(),this.onInput();break}case"ArrowRight":t.preventDefault(),(s=this.minutesInputRef.value)==null||s.focus();break;case"Backspace":case"Delete":this._hoursDigitCount=0,this._hoursFirstDigit=-1;break;case"Tab":break;case"Enter":{t.preventDefault();const r=this.internals.form;r?r.requestSubmit():e.blur();break}default:if(/^\d$/.test(t.key)){t.preventDefault();const r=parseInt(t.key,10);if(this._hoursDigitCount===0)this._hoursFirstDigit=r,this._hours=String(r).padStart(2,"0"),this._hoursDigitCount=1,this.onInput(),r>=3&&(this._hoursFirstDigit=-1,this._hoursDigitCount=0,this._syncValueFromDisplay(),(i=this.minutesInputRef.value)==null||i.focus());else{const p=this._hoursFirstDigit*10+r;this._hours=p<=23?String(p).padStart(2,"0"):String(r).padStart(2,"0"),this._hoursFirstDigit=-1,this._hoursDigitCount=0,this._syncValueFromDisplay(),this.onInput(),(n=this.minutesInputRef.value)==null||n.focus()}}else t.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=t=>{var s;const e=t.target;switch(t.key){case"ArrowUp":{t.preventDefault();const i=this._minutes!==""?parseInt(this._minutes,10):0;this._minutes=String((i+this._minuteStep)%60).padStart(2,"0"),this._syncValueFromDisplay(),this.onInput();break}case"ArrowDown":{t.preventDefault();const i=this._minutes!==""?parseInt(this._minutes,10):0;this._minutes=String((i-this._minuteStep+60)%60).padStart(2,"0"),this._syncValueFromDisplay(),this.onInput();break}case"ArrowLeft":t.preventDefault(),(s=this.hoursInputRef.value)==null||s.focus();break;case"Backspace":case"Delete":this._minutesDigitCount=0,this._minutesFirstDigit=-1;break;case"Tab":break;case"Enter":{t.preventDefault();const i=this.internals.form;i?i.requestSubmit():e.blur();break}default:if(/^\d$/.test(t.key)){t.preventDefault();const i=parseInt(t.key,10);if(this._minutesDigitCount===0)this._minutesFirstDigit=i,this._minutes=String(i).padStart(2,"0"),this._minutesDigitCount=1,this.onInput(),i>=6&&(this._minutesFirstDigit=-1,this._minutesDigitCount=0,this._syncValueFromDisplay());else{const n=this._minutesFirstDigit*10+i;this._minutes=n<=59?String(n).padStart(2,"0"):String(i).padStart(2,"0"),this._minutesFirstDigit=-1,this._minutesDigitCount=0,this._syncValueFromDisplay(),this.onInput()}}else t.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=t=>{var p;const e=document.activeElement,s=e.closest(".pkt-timepicker-popup__col");if(!s)return;const i=Array.from(s.querySelectorAll(".pkt-timepicker-popup__option")),n=i.indexOf(e),r=e.dataset.type??"";switch(t.key){case"ArrowDown":t.preventDefault(),this._focusOptionAndSync(i[Math.min(n+1,i.length-1)],r);break;case"ArrowUp":t.preventDefault(),this._focusOptionAndSync(i[Math.max(n-1,0)],r);break;case"Home":t.preventDefault(),this._focusOptionAndSync(i[0],r);break;case"End":t.preventDefault(),this._focusOptionAndSync(i[i.length-1],r);break;case"ArrowRight":t.preventDefault(),r==="hour"&&(this._focusOptionAndSync(e,r),this.updateComplete.then(()=>{this._scrollToSelected(),this._focusSelectedOrFirst("minute")}));break;case"ArrowLeft":t.preventDefault(),r==="minute"&&(this._focusOptionAndSync(e,r),this.updateComplete.then(()=>{this._scrollToSelected(),this._focusSelectedOrFirst("hour")}));break;case"Enter":case" ":t.preventDefault(),e.click();break;case"Escape":t.preventDefault(),this._closePopup(),(p=this.buttonRef.value)==null||p.focus();break}}}get inputRef(){return this.hiddenInputRef}manageValidity(t){const e=this.hoursInputRef.value;if(!e)return;if(this.required&&!this.value){this.internals.setValidity({valueMissing:!0},a.strings.forms.messages.required,e),this._setAriaInvalid(!0);return}if(!this.value){this.internals.setValidity({}),this._setAriaInvalid(!1);return}const s=d(this.value),i=m(this.step);if(this.min&&s<d(String(this.min))){this.internals.setValidity({rangeUnderflow:!0},a.strings.forms.messages.rangeUnderflowMin.replace("{min}",String(this.min)),e),this._setAriaInvalid(!0);return}if(this.max&&s>d(String(this.max))){this.internals.setValidity({rangeOverflow:!0},a.strings.forms.messages.rangeOverflowMax.replace("{max}",String(this.max)),e),this._setAriaInvalid(!0);return}if(this.step&&s%i!==0){const n=i===60?a.strings.forms.messages.timeStepMismatchHour:i===30?a.strings.forms.messages.timeStepMismatchHalfHour:a.strings.forms.messages.timeStepMismatch.replace("{step}",`${i}, ${i*2}, ${i*3}`);this.internals.setValidity({stepMismatch:!0},n,e),this._setAriaInvalid(!0);return}this.internals.setValidity({}),this._setAriaInvalid(!1)}_setAriaInvalid(t){if(!this.touched&&t)return;const e=this.hoursInputRef.value,s=this.minutesInputRef.value;t?(e==null||e.setAttribute("aria-invalid","true"),s==null||s.setAttribute("aria-invalid","true")):(e==null||e.removeAttribute("aria-invalid"),s==null||s.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(t){super.willUpdate(t),t.has("value")&&this._syncDisplayFromValue()}updated(t){super.updated(t),this.classList.toggle("pkt-timepicker--stepper",this.stepArrows),this.classList.toggle("pkt-timepicker--fullwidth",this.fullwidth),t.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(t){return t===3600||t<3600&&3600%t===0&&t%60===0}_syncDisplayFromValue(){const t=D(this.value)?this.value.split(":"):null;t?(this._hours=t[0],this._minutes=t[1]):(this._hours="",this._minutes="")}_syncValueFromDisplay(){if(this._hours!==""&&this._minutes!==""){const t=`${this._hours}:${this._minutes}`;t!==this.value&&(this.value=t,this.onChange(t))}else this.value!==""&&(this.value="",this.onChange(""))}get _minuteStep(){return m(this.step)}get _hourOptions(){return w(this.min,this.max)}get _minuteOptions(){return x(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(){const t=this.querySelector(".pkt-timepicker-popup");t&&t.querySelectorAll(".pkt-timepicker-popup__col").forEach(e=>{const s=e.querySelector(".pkt-timepicker-popup__option--selected");s&&s.scrollIntoView({block:"center"})})}_focusSelectedOrFirst(t){var p;const e=this.querySelector(".pkt-timepicker-popup");if(!e)return;const s=e.querySelectorAll(".pkt-timepicker-popup__col"),i=t==="hour"?s[0]:s[1];if(!i)return;const n=i.querySelector(".pkt-timepicker-popup__option--selected"),r=i.querySelector(".pkt-timepicker-popup__option");(p=n||r)==null||p.focus()}_handleOptionClick(t,e){var i;const s=String(t).padStart(2,"0");e==="hour"?(this._hours=s,this.updateComplete.then(()=>this._focusSelectedOrFirst("minute"))):(this._minutes=s,this._closePopup(),(i=this.buttonRef.value)==null||i.focus())}_focusOptionAndSync(t,e){if(!t)return;const s=parseInt(t.dataset.value??"0",10);e==="hour"?this._hours=String(s).padStart(2,"0"):this._minutes=String(s).padStart(2,"0"),t.focus()}_stepTime(t){const e=I(this._hours,this._minutes,t,this._minuteStep);this._hours=e.hours,this._minutes=e.minutes,this._syncValueFromDisplay()}_renderOption(t,e){const s=String(t).padStart(2,"0"),i=e==="hour"?this._hours!==""?parseInt(this._hours,10):NaN:this._minutes!==""?parseInt(this._minutes,10):NaN,n=t===i;return a.b`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("./element-gR_VtSiD.cjs"),_=require("./state-Dg-53wQ8.cjs"),p=require("./ref-CL-Xk9Xm.cjs"),c=require("./if-defined-BOW3ODSj.cjs"),y=require("./class-map-CsENJXf1.cjs"),S=require("./input-element-DdVhUvva.cjs"),D=require("./element-with-slot-ZX-up7jO.cjs");require("./icon-Bqj9oBbl.cjs");require("./input-wrapper-B0MkQ0IZ.cjs");const w=o=>/^\d{2}:\d{2}$/.test(o)&&parseInt(o.slice(0,2),10)<=23&&parseInt(o.slice(3),10)<=59,d=o=>{const[t,e]=o.split(":").map(Number);return t*60+e},m=o=>o?Math.max(1,Math.round(o/60)):1,x=(o,t)=>{const e=o?parseInt(String(o).split(":")[0],10):0,s=t?parseInt(String(t).split(":")[0],10):23;return Array.from({length:s-e+1},(i,n)=>n+e)},I=o=>{const t=m(o);return Array.from({length:Math.floor(60/t)},(e,s)=>s*t)},A=(o,t,e,s)=>{let r=o!==""?parseInt(o,10):e===1?0:23,u=t!==""?parseInt(t,10):e===1?0:Math.floor(59/s)*s;return u+=e*s,u>59?(u=0,r=(r+1)%24):u<0&&(u=Math.floor(59/s)*s,r=(r-1+24)%24),{hours:String(r).padStart(2,"0"),minutes:String(u).padStart(2,"0")}};var F=Object.defineProperty,C=Object.getOwnPropertyDescriptor,l=(o,t,e,s)=>{for(var i=s>1?void 0:s?C(t,e):t,n=o.length-1,r;n>=0;n--)(r=o[n])&&(i=(s?r(t,e,i):r(i))||i);return s&&i&&F(t,e,i),i};exports.PktTimepicker=class extends S.PktInputElement{constructor(){super(...arguments),this.hiddenInputRef=p.e(),this.hoursInputRef=p.e(),this.minutesInputRef=p.e(),this.buttonRef=p.e(),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=t=>{this.contains(t.target)||this._closePopup()},this._handleComponentFocusIn=()=>{this._hasFocus||(this._hasFocus=!0,this.onFocus())},this._handleComponentFocusOut=t=>{this.contains(t.relatedTarget)||(this._hasFocus=!1,this.onBlur())},this._handleHoursKeydown=t=>{var s,i,n;const e=t.target;switch(t.key){case"ArrowUp":{t.preventDefault();const r=this._hours!==""?parseInt(this._hours,10):0;this._hours=String((r+1)%24).padStart(2,"0"),this._syncValueFromDisplay(),this.onInput();break}case"ArrowDown":{t.preventDefault();const r=this._hours!==""?parseInt(this._hours,10):0;this._hours=String((r-1+24)%24).padStart(2,"0"),this._syncValueFromDisplay(),this.onInput();break}case"ArrowRight":t.preventDefault(),(s=this.minutesInputRef.value)==null||s.focus();break;case"Backspace":case"Delete":this._hoursDigitCount=0,this._hoursFirstDigit=-1;break;case"Tab":break;case"Enter":{t.preventDefault();const r=this.internals.form;r?r.requestSubmit():e.blur();break}default:if(/^\d$/.test(t.key)){t.preventDefault();const r=parseInt(t.key,10);if(this._hoursDigitCount===0)this._hoursFirstDigit=r,this._hours=String(r).padStart(2,"0"),this._hoursDigitCount=1,this.onInput(),r>=3&&(this._hoursFirstDigit=-1,this._hoursDigitCount=0,this._syncValueFromDisplay(),(i=this.minutesInputRef.value)==null||i.focus());else{const u=this._hoursFirstDigit*10+r;this._hours=u<=23?String(u).padStart(2,"0"):String(r).padStart(2,"0"),this._hoursFirstDigit=-1,this._hoursDigitCount=0,this._syncValueFromDisplay(),this.onInput(),(n=this.minutesInputRef.value)==null||n.focus()}}else t.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=t=>{var s;const e=t.target;switch(t.key){case"ArrowUp":{t.preventDefault();const i=this._minutes!==""?parseInt(this._minutes,10):0;this._minutes=String((i+this._minuteStep)%60).padStart(2,"0"),this._syncValueFromDisplay(),this.onInput();break}case"ArrowDown":{t.preventDefault();const i=this._minutes!==""?parseInt(this._minutes,10):0;this._minutes=String((i-this._minuteStep+60)%60).padStart(2,"0"),this._syncValueFromDisplay(),this.onInput();break}case"ArrowLeft":t.preventDefault(),(s=this.hoursInputRef.value)==null||s.focus();break;case"Backspace":case"Delete":this._minutesDigitCount=0,this._minutesFirstDigit=-1;break;case"Tab":break;case"Enter":{t.preventDefault();const i=this.internals.form;i?i.requestSubmit():e.blur();break}default:if(/^\d$/.test(t.key)){t.preventDefault();const i=parseInt(t.key,10);if(this._minutesDigitCount===0)this._minutesFirstDigit=i,this._minutes=String(i).padStart(2,"0"),this._minutesDigitCount=1,this.onInput(),i>=6&&(this._minutesFirstDigit=-1,this._minutesDigitCount=0,this._syncValueFromDisplay());else{const n=this._minutesFirstDigit*10+i;this._minutes=n<=59?String(n).padStart(2,"0"):String(i).padStart(2,"0"),this._minutesFirstDigit=-1,this._minutesDigitCount=0,this._syncValueFromDisplay(),this.onInput()}}else t.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=t=>{var u;const e=document.activeElement,s=e.closest(".pkt-timepicker-popup__col");if(!s)return;const i=Array.from(s.querySelectorAll(".pkt-timepicker-popup__option")),n=i.indexOf(e),r=e.dataset.type??"";switch(t.key){case"ArrowDown":t.preventDefault(),this._focusOptionAndSync(i[Math.min(n+1,i.length-1)],r);break;case"ArrowUp":t.preventDefault(),this._focusOptionAndSync(i[Math.max(n-1,0)],r);break;case"Home":t.preventDefault(),this._focusOptionAndSync(i[0],r);break;case"End":t.preventDefault(),this._focusOptionAndSync(i[i.length-1],r);break;case"ArrowRight":t.preventDefault(),r==="hour"&&(this._focusOptionAndSync(e,r),this.updateComplete.then(()=>{this._scrollToSelected(),this._focusSelectedOrFirst("minute")}));break;case"ArrowLeft":t.preventDefault(),r==="minute"&&(this._focusOptionAndSync(e,r),this.updateComplete.then(()=>{this._scrollToSelected(),this._focusSelectedOrFirst("hour")}));break;case"Enter":case" ":t.preventDefault(),e.click();break;case"Escape":t.preventDefault(),this._closePopup(),(u=this.buttonRef.value)==null||u.focus();break}}}get inputRef(){return this.hiddenInputRef}manageValidity(t){const e=this.hoursInputRef.value;if(!e)return;if(this.required&&!this.value){this.internals.setValidity({valueMissing:!0},a.strings.forms.messages.required,e),this._setAriaInvalid(!0);return}if(!this.value){this.internals.setValidity({}),this._setAriaInvalid(!1);return}const s=d(this.value),i=m(this.step);if(this.min&&s<d(String(this.min))){this.internals.setValidity({rangeUnderflow:!0},a.strings.forms.messages.rangeUnderflowMin.replace("{min}",String(this.min)),e),this._setAriaInvalid(!0);return}if(this.max&&s>d(String(this.max))){this.internals.setValidity({rangeOverflow:!0},a.strings.forms.messages.rangeOverflowMax.replace("{max}",String(this.max)),e),this._setAriaInvalid(!0);return}if(this.step&&s%i!==0){const n=i===60?a.strings.forms.messages.timeStepMismatchHour:i===30?a.strings.forms.messages.timeStepMismatchHalfHour:a.strings.forms.messages.timeStepMismatch.replace("{step}",`${i}, ${i*2}, ${i*3}`);this.internals.setValidity({stepMismatch:!0},n,e),this._setAriaInvalid(!0);return}this.internals.setValidity({}),this._setAriaInvalid(!1)}_setAriaInvalid(t){if(!this.touched&&t)return;const e=this.hoursInputRef.value,s=this.minutesInputRef.value;t?(e==null||e.setAttribute("aria-invalid","true"),s==null||s.setAttribute("aria-invalid","true")):(e==null||e.removeAttribute("aria-invalid"),s==null||s.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(t){super.willUpdate(t),t.has("value")&&this._syncDisplayFromValue()}updated(t){super.updated(t),this.classList.toggle("pkt-timepicker--stepper",this.stepArrows),this.classList.toggle("pkt-timepicker--fullwidth",this.fullwidth),t.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(t){return t===3600||t<3600&&3600%t===0&&t%60===0}_syncDisplayFromValue(){const t=w(this.value)?this.value.split(":"):null;t?(this._hours=t[0],this._minutes=t[1]):(this._hours="",this._minutes="")}_syncValueFromDisplay(){if(this._hours!==""&&this._minutes!==""){const t=`${this._hours}:${this._minutes}`;t!==this.value&&(this.value=t,this.onChange(t))}else this.value!==""&&(this.value="",this.onChange(""))}get _minuteStep(){return m(this.step)}get _hourOptions(){return x(this.min,this.max)}get _minuteOptions(){return I(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(){const t=this.querySelector(".pkt-timepicker-popup");t&&t.querySelectorAll(".pkt-timepicker-popup__col").forEach(e=>{const s=e.querySelector(".pkt-timepicker-popup__option--selected");s&&s.scrollIntoView({block:"center"})})}_focusSelectedOrFirst(t){var u;const e=this.querySelector(".pkt-timepicker-popup");if(!e)return;const s=e.querySelectorAll(".pkt-timepicker-popup__col"),i=t==="hour"?s[0]:s[1];if(!i)return;const n=i.querySelector(".pkt-timepicker-popup__option--selected"),r=i.querySelector(".pkt-timepicker-popup__option");(u=n||r)==null||u.focus()}_handleOptionClick(t,e){var i;const s=String(t).padStart(2,"0");e==="hour"?(this._hours=s,this.updateComplete.then(()=>this._focusSelectedOrFirst("minute"))):(this._minutes=s,this._closePopup(),(i=this.buttonRef.value)==null||i.focus())}_focusOptionAndSync(t,e){if(!t)return;const s=parseInt(t.dataset.value??"0",10);e==="hour"?this._hours=String(s).padStart(2,"0"):this._minutes=String(s).padStart(2,"0"),t.focus()}_stepTime(t){const e=A(this._hours,this._minutes,t,this._minuteStep);this._hours=e.hours,this._minutes=e.minutes,this._syncValueFromDisplay()}_renderOption(t,e){const s=String(t).padStart(2,"0"),i=e==="hour"?this._hours!==""?parseInt(this._hours,10):NaN:this._minutes!==""?parseInt(this._minutes,10):NaN,n=t===i;return a.b`
2
2
  <button
3
- class=${$.e({"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":n})}
3
+ class=${y.e({"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":n})}
4
4
  type="button"
5
5
  role="option"
6
6
  aria-selected=${n?"true":"false"}
@@ -38,13 +38,16 @@
38
38
  ${this._minuteOptions.map(i=>this._renderOption(i,"minute"))}
39
39
  </div>
40
40
  </div>
41
- `}_renderContainer(){var n,r,p,k,f,g,b,v;const t=((n=this.strings.timepicker)==null?void 0:n.hours)??"Timer",e=((r=this.strings.timepicker)==null?void 0:r.minutes)??"Minutter",s=this.label?`${t}, ${this.label}`:t,i=this.label?`${e}, ${this.label}`:e;return a.b`
42
- <div class="pkt-input__container">
41
+ `}_renderContainer(){var n,r,u,k,f,g,b,v;const t=((n=this.strings.timepicker)==null?void 0:n.hours)??"Timer",e=((r=this.strings.timepicker)==null?void 0:r.minutes)??"Minutter",s=this.label?`${t}, ${this.label}`:t,i=this.label?`${e}, ${this.label}`:e;return a.b`
42
+ <div
43
+ class="pkt-input__container"
44
+ @click=${h=>{var $;h.target.closest("button, input")||($=this.hoursInputRef.value)==null||$.focus()}}
45
+ >
43
46
  ${this.stepArrows?a.b`
44
47
  <button
45
48
  class="pkt-input-icon pkt-btn pkt-btn--icon-only pkt-btn--tertiary pkt-timepicker__button pkt-timepicker__button--prev"
46
49
  type="button"
47
- aria-label=${((p=this.strings.timepicker)==null?void 0:p.prevTime)??"Forrige tidspunkt"}
50
+ aria-label=${((u=this.strings.timepicker)==null?void 0:u.prevTime)??"Forrige tidspunkt"}
48
51
  ?disabled=${this.disabled}
49
52
  @click=${()=>this._stepTime(-1)}
50
53
  >
@@ -55,7 +58,7 @@
55
58
  </button>
56
59
  `:a.A}
57
60
  <input
58
- ${u.n(this.hoursInputRef)}
61
+ ${p.n(this.hoursInputRef)}
59
62
  type="text"
60
63
  inputmode="numeric"
61
64
  maxlength="2"
@@ -77,11 +80,11 @@
77
80
  ?disabled=${this.disabled}
78
81
  @keydown=${this._handleHoursKeydown}
79
82
  @blur=${this._handleHoursBlur}
80
- @focus=${l=>{l.target.select(),l.stopImmediatePropagation()}}
83
+ @focus=${h=>{h.target.select(),h.stopImmediatePropagation()}}
81
84
  />
82
85
  <span class="pkt-timepicker__separator">:</span>
83
86
  <input
84
- ${u.n(this.minutesInputRef)}
87
+ ${p.n(this.minutesInputRef)}
85
88
  type="text"
86
89
  inputmode="numeric"
87
90
  maxlength="2"
@@ -103,7 +106,7 @@
103
106
  ?disabled=${this.disabled}
104
107
  @keydown=${this._handleMinutesKeydown}
105
108
  @blur=${this._handleMinutesBlur}
106
- @focus=${l=>{l.target.select(),l.stopImmediatePropagation()}}
109
+ @focus=${h=>{h.target.select(),h.stopImmediatePropagation()}}
107
110
  />
108
111
  ${this.hidePicker&&!this.stepArrows?a.b`<pkt-icon
109
112
  class="pkt-input-icon pkt-timepicker__icon"
@@ -112,7 +115,7 @@
112
115
  ></pkt-icon>`:a.A}
113
116
  ${!this.hidePicker&&!this.stepArrows?a.b`
114
117
  <button
115
- ${u.n(this.buttonRef)}
118
+ ${p.n(this.buttonRef)}
116
119
  class="pkt-input-icon pkt-btn pkt-btn--icon-only pkt-btn--tertiary pkt-timepicker__button"
117
120
  type="button"
118
121
  aria-label=${((f=this.strings.timepicker)==null?void 0:f.openPicker)??"Åpne tidspunkt-velger"}
@@ -143,7 +146,7 @@
143
146
  </button>
144
147
  `:a.A}
145
148
  <input
146
- ${u.n(this.hiddenInputRef)}
149
+ ${p.n(this.hiddenInputRef)}
147
150
  type="time"
148
151
  hidden
149
152
  name=${this.name||this.id}
@@ -178,11 +181,11 @@
178
181
  .requiredText=${this.requiredText}
179
182
  .tagText=${this.tagText}
180
183
  >
181
- <div class="pkt-contents" slot="helptext">${S.slotContent(this,"helptext")}</div>
184
+ <div class="pkt-contents" slot="helptext">${D.slotContent(this,"helptext")}</div>
182
185
  ${!this.hidePicker&&!this.stepArrows?a.b`
183
186
  <div class="pkt-timepicker__anchor">
184
187
  ${this._renderContainer()} ${this._renderPopup()}
185
188
  </div>
186
189
  `:this._renderContainer()}
187
190
  </pkt-input-wrapper>
188
- `}};h([a.n({type:String,reflect:!0})],exports.PktTimepicker.prototype,"value",2);h([a.n({type:Boolean,reflect:!0,attribute:"hide-picker"})],exports.PktTimepicker.prototype,"hidePicker",2);h([a.n({type:Boolean,reflect:!0,attribute:"step-arrows"})],exports.PktTimepicker.prototype,"stepArrows",2);h([_.r()],exports.PktTimepicker.prototype,"_hours",2);h([_.r()],exports.PktTimepicker.prototype,"_minutes",2);h([_.r()],exports.PktTimepicker.prototype,"_isOpen",2);exports.PktTimepicker=h([a.t("pkt-timepicker")],exports.PktTimepicker);
191
+ `}};l([a.n({type:String,reflect:!0})],exports.PktTimepicker.prototype,"value",2);l([a.n({type:Boolean,reflect:!0,attribute:"hide-picker"})],exports.PktTimepicker.prototype,"hidePicker",2);l([a.n({type:Boolean,reflect:!0,attribute:"step-arrows"})],exports.PktTimepicker.prototype,"stepArrows",2);l([_.r()],exports.PktTimepicker.prototype,"_hours",2);l([_.r()],exports.PktTimepicker.prototype,"_minutes",2);l([_.r()],exports.PktTimepicker.prototype,"_isOpen",2);exports.PktTimepicker=l([a.t("pkt-timepicker")],exports.PktTimepicker);
@@ -1,34 +1,34 @@
1
- import { s as c, b as u, A as o, n as b, t as w } from "./element-CPpT3rFQ.js";
1
+ import { s as d, b as u, A as o, n as b, t as x } from "./element-CPpT3rFQ.js";
2
2
  import { r as v } from "./state-C_1EOo3D.js";
3
3
  import { e as m, n as _ } from "./ref-Bg_Swj5w.js";
4
- import { o as k } from "./if-defined-B0krMLad.js";
5
- import { e as x } from "./class-map-CEnykyO_.js";
6
- import { P as I } from "./input-element-8nLwuQS4.js";
7
- import { s as F } from "./element-with-slot-Dqk6-TRR.js";
4
+ import { o as f } from "./if-defined-B0krMLad.js";
5
+ import { e as I } from "./class-map-CEnykyO_.js";
6
+ import { P as F } from "./input-element-8nLwuQS4.js";
7
+ import { s as A } from "./element-with-slot-Dqk6-TRR.js";
8
8
  import "./icon-BlKA8YuW.js";
9
9
  import "./input-wrapper-B2JpK016.js";
10
- const A = (t) => /^\d{2}:\d{2}$/.test(t) && parseInt(t.slice(0, 2), 10) <= 23 && parseInt(t.slice(3), 10) <= 59, f = (t) => {
10
+ const C = (t) => /^\d{2}:\d{2}$/.test(t) && parseInt(t.slice(0, 2), 10) <= 23 && parseInt(t.slice(3), 10) <= 59, k = (t) => {
11
11
  const [e, s] = t.split(":").map(Number);
12
12
  return e * 60 + s;
13
- }, g = (t) => t ? Math.max(1, Math.round(t / 60)) : 1, C = (t, e) => {
13
+ }, g = (t) => t ? Math.max(1, Math.round(t / 60)) : 1, O = (t, e) => {
14
14
  const s = t ? parseInt(String(t).split(":")[0], 10) : 0, i = e ? parseInt(String(e).split(":")[0], 10) : 23;
15
15
  return Array.from({ length: i - s + 1 }, (n, r) => r + s);
16
- }, O = (t) => {
16
+ }, T = (t) => {
17
17
  const e = g(t);
18
18
  return Array.from({ length: Math.floor(60 / e) }, (s, i) => i * e);
19
- }, T = (t, e, s, i) => {
19
+ }, M = (t, e, s, i) => {
20
20
  let a = t !== "" ? parseInt(t, 10) : s === 1 ? 0 : 23, p = e !== "" ? parseInt(e, 10) : s === 1 ? 0 : Math.floor(59 / i) * i;
21
21
  return p += s * i, p > 59 ? (p = 0, a = (a + 1) % 24) : p < 0 && (p = Math.floor(59 / i) * i, a = (a - 1 + 24) % 24), {
22
22
  hours: String(a).padStart(2, "0"),
23
23
  minutes: String(p).padStart(2, "0")
24
24
  };
25
25
  };
26
- var M = Object.defineProperty, V = Object.getOwnPropertyDescriptor, l = (t, e, s, i) => {
27
- for (var n = i > 1 ? void 0 : i ? V(e, s) : e, r = t.length - 1, a; r >= 0; r--)
26
+ var V = Object.defineProperty, P = Object.getOwnPropertyDescriptor, c = (t, e, s, i) => {
27
+ for (var n = i > 1 ? void 0 : i ? P(e, s) : e, r = t.length - 1, a; r >= 0; r--)
28
28
  (a = t[r]) && (n = (i ? a(e, s, n) : a(n)) || n);
29
- return i && n && M(e, s, n), n;
29
+ return i && n && V(e, s, n), n;
30
30
  };
31
- let h = class extends I {
31
+ let h = class extends F {
32
32
  constructor() {
33
33
  super(...arguments), this.hiddenInputRef = m(), this.hoursInputRef = m(), this.minutesInputRef = m(), this.buttonRef = m(), 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 = (t) => {
34
34
  this.contains(t.target) || this._closePopup();
@@ -185,32 +185,32 @@ let h = class extends I {
185
185
  const e = this.hoursInputRef.value;
186
186
  if (!e) return;
187
187
  if (this.required && !this.value) {
188
- this.internals.setValidity({ valueMissing: !0 }, c.forms.messages.required, e), this._setAriaInvalid(!0);
188
+ this.internals.setValidity({ valueMissing: !0 }, d.forms.messages.required, e), this._setAriaInvalid(!0);
189
189
  return;
190
190
  }
191
191
  if (!this.value) {
192
192
  this.internals.setValidity({}), this._setAriaInvalid(!1);
193
193
  return;
194
194
  }
195
- const s = f(this.value), i = g(this.step);
196
- if (this.min && s < f(String(this.min))) {
195
+ const s = k(this.value), i = g(this.step);
196
+ if (this.min && s < k(String(this.min))) {
197
197
  this.internals.setValidity(
198
198
  { rangeUnderflow: !0 },
199
- c.forms.messages.rangeUnderflowMin.replace("{min}", String(this.min)),
199
+ d.forms.messages.rangeUnderflowMin.replace("{min}", String(this.min)),
200
200
  e
201
201
  ), this._setAriaInvalid(!0);
202
202
  return;
203
203
  }
204
- if (this.max && s > f(String(this.max))) {
204
+ if (this.max && s > k(String(this.max))) {
205
205
  this.internals.setValidity(
206
206
  { rangeOverflow: !0 },
207
- c.forms.messages.rangeOverflowMax.replace("{max}", String(this.max)),
207
+ d.forms.messages.rangeOverflowMax.replace("{max}", String(this.max)),
208
208
  e
209
209
  ), this._setAriaInvalid(!0);
210
210
  return;
211
211
  }
212
212
  if (this.step && s % i !== 0) {
213
- const n = i === 60 ? c.forms.messages.timeStepMismatchHour : i === 30 ? c.forms.messages.timeStepMismatchHalfHour : c.forms.messages.timeStepMismatch.replace(
213
+ const n = i === 60 ? d.forms.messages.timeStepMismatchHour : i === 30 ? d.forms.messages.timeStepMismatchHalfHour : d.forms.messages.timeStepMismatch.replace(
214
214
  "{step}",
215
215
  `${i}, ${i * 2}, ${i * 3}`
216
216
  );
@@ -245,7 +245,7 @@ let h = class extends I {
245
245
  return t === 3600 || t < 3600 && 3600 % t === 0 && t % 60 === 0;
246
246
  }
247
247
  _syncDisplayFromValue() {
248
- const t = A(this.value) ? this.value.split(":") : null;
248
+ const t = C(this.value) ? this.value.split(":") : null;
249
249
  t ? (this._hours = t[0], this._minutes = t[1]) : (this._hours = "", this._minutes = "");
250
250
  }
251
251
  _syncValueFromDisplay() {
@@ -258,10 +258,10 @@ let h = class extends I {
258
258
  return g(this.step);
259
259
  }
260
260
  get _hourOptions() {
261
- return C(this.min, this.max);
261
+ return O(this.min, this.max);
262
262
  }
263
263
  get _minuteOptions() {
264
- return O(this.step);
264
+ return T(this.step);
265
265
  }
266
266
  _openPopup() {
267
267
  this._isOpen = !0, this.updateComplete.then(() => {
@@ -303,14 +303,14 @@ let h = class extends I {
303
303
  e === "hour" ? this._hours = String(s).padStart(2, "0") : this._minutes = String(s).padStart(2, "0"), t.focus();
304
304
  }
305
305
  _stepTime(t) {
306
- const e = T(this._hours, this._minutes, t, this._minuteStep);
306
+ const e = M(this._hours, this._minutes, t, this._minuteStep);
307
307
  this._hours = e.hours, this._minutes = e.minutes, this._syncValueFromDisplay();
308
308
  }
309
309
  _renderOption(t, e) {
310
310
  const s = String(t).padStart(2, "0"), i = e === "hour" ? this._hours !== "" ? parseInt(this._hours, 10) : NaN : this._minutes !== "" ? parseInt(this._minutes, 10) : NaN, n = t === i;
311
311
  return u`
312
312
  <button
313
- class=${x({
313
+ class=${I({
314
314
  "pkt-btn": !0,
315
315
  "pkt-btn--tertiary": !0,
316
316
  "pkt-btn--small": !0,
@@ -370,7 +370,13 @@ let h = class extends I {
370
370
  var n, r, a, p, $, y, S, D;
371
371
  const t = ((n = this.strings.timepicker) == null ? void 0 : n.hours) ?? "Timer", e = ((r = this.strings.timepicker) == null ? void 0 : r.minutes) ?? "Minutter", s = this.label ? `${t}, ${this.label}` : t, i = this.label ? `${e}, ${this.label}` : e;
372
372
  return u`
373
- <div class="pkt-input__container">
373
+ <div
374
+ class="pkt-input__container"
375
+ @click=${(l) => {
376
+ var w;
377
+ l.target.closest("button, input") || (w = this.hoursInputRef.value) == null || w.focus();
378
+ }}
379
+ >
374
380
  ${this.stepArrows ? u`
375
381
  <button
376
382
  class="pkt-input-icon pkt-btn pkt-btn--icon-only pkt-btn--tertiary pkt-timepicker__button pkt-timepicker__button--prev"
@@ -408,8 +414,8 @@ let h = class extends I {
408
414
  ?disabled=${this.disabled}
409
415
  @keydown=${this._handleHoursKeydown}
410
416
  @blur=${this._handleHoursBlur}
411
- @focus=${(d) => {
412
- d.target.select(), d.stopImmediatePropagation();
417
+ @focus=${(l) => {
418
+ l.target.select(), l.stopImmediatePropagation();
413
419
  }}
414
420
  />
415
421
  <span class="pkt-timepicker__separator">:</span>
@@ -436,8 +442,8 @@ let h = class extends I {
436
442
  ?disabled=${this.disabled}
437
443
  @keydown=${this._handleMinutesKeydown}
438
444
  @blur=${this._handleMinutesBlur}
439
- @focus=${(d) => {
440
- d.target.select(), d.stopImmediatePropagation();
445
+ @focus=${(l) => {
446
+ l.target.select(), l.stopImmediatePropagation();
441
447
  }}
442
448
  />
443
449
  ${this.hidePicker && !this.stepArrows ? u`<pkt-icon
@@ -484,9 +490,9 @@ let h = class extends I {
484
490
  name=${this.name || this.id}
485
491
  id=${this.id + "-input"}
486
492
  .value=${this.value}
487
- min=${k(this.min ?? void 0)}
488
- max=${k(this.max ?? void 0)}
489
- step=${k(this.step ?? void 0)}
493
+ min=${f(this.min ?? void 0)}
494
+ max=${f(this.max ?? void 0)}
495
+ step=${f(this.step ?? void 0)}
490
496
  ?required=${this.required}
491
497
  ?disabled=${this.disabled}
492
498
  tabindex="-1"
@@ -516,7 +522,7 @@ let h = class extends I {
516
522
  .requiredText=${this.requiredText}
517
523
  .tagText=${this.tagText}
518
524
  >
519
- <div class="pkt-contents" slot="helptext">${F(this, "helptext")}</div>
525
+ <div class="pkt-contents" slot="helptext">${A(this, "helptext")}</div>
520
526
  ${!this.hidePicker && !this.stepArrows ? u`
521
527
  <div class="pkt-timepicker__anchor">
522
528
  ${this._renderContainer()} ${this._renderPopup()}
@@ -526,26 +532,26 @@ let h = class extends I {
526
532
  `;
527
533
  }
528
534
  };
529
- l([
535
+ c([
530
536
  b({ type: String, reflect: !0 })
531
537
  ], h.prototype, "value", 2);
532
- l([
538
+ c([
533
539
  b({ type: Boolean, reflect: !0, attribute: "hide-picker" })
534
540
  ], h.prototype, "hidePicker", 2);
535
- l([
541
+ c([
536
542
  b({ type: Boolean, reflect: !0, attribute: "step-arrows" })
537
543
  ], h.prototype, "stepArrows", 2);
538
- l([
544
+ c([
539
545
  v()
540
546
  ], h.prototype, "_hours", 2);
541
- l([
547
+ c([
542
548
  v()
543
549
  ], h.prototype, "_minutes", 2);
544
- l([
550
+ c([
545
551
  v()
546
552
  ], h.prototype, "_isOpen", 2);
547
- h = l([
548
- w("pkt-timepicker")
553
+ h = c([
554
+ x("pkt-timepicker")
549
555
  ], h);
550
556
  export {
551
557
  h as PktTimepicker
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oslokommune/punkt-elements",
3
- "version": "16.7.0",
3
+ "version": "16.7.1",
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",
@@ -78,5 +78,5 @@
78
78
  "url": "https://github.com/oslokommune/punkt/issues"
79
79
  },
80
80
  "license": "MIT",
81
- "gitHead": "782a591e43ea062ca4ef23fe5415aca5f2d523b5"
81
+ "gitHead": "f03ecd48c2bc6097584f3a3f1d45848578bf524d"
82
82
  }
@@ -612,7 +612,14 @@ export class PktTimepicker extends PktInputElement<Props> {
612
612
  const hoursAriaLabel = this.label ? `${hoursLabel}, ${this.label}` : hoursLabel
613
613
  const minutesAriaLabel = this.label ? `${minutesLabel}, ${this.label}` : minutesLabel
614
614
  return html`
615
- <div class="pkt-input__container">
615
+ <div
616
+ class="pkt-input__container"
617
+ @click=${(e: Event) => {
618
+ const target = e.target as HTMLElement
619
+ if (target.closest('button, input')) return
620
+ this.hoursInputRef.value?.focus()
621
+ }}
622
+ >
616
623
  ${this.stepArrows
617
624
  ? html`
618
625
  <button