@ionic/core
Version:
Base components for Ionic
4 lines • 10.9 kB
JavaScript
/*!
* (C) Ionic http://ionicframework.com - MIT License
*/
import{r as t,d as i,h as e,f as s,g as o}from"./p-BpRUsN_W.js";import{n,r as a}from"./p-Co7eql8D.js";import{h as r,b as h,a as l}from"./p-DPNVo1nr.js";import{a as c,b as d}from"./p-SEecsUh7.js";import{c as p}from"./p-byZM6qHV.js";import"./p-Dojwmvde.js";import"./p-C2LaBx3E.js";const f=class{constructor(e){t(this,e),this.ionChange=i(this,"ionChange",7),this.isScrolling=!1,this.isColumnVisible=!1,this.canExitInputMode=!0,this.updateValueTextOnScroll=!1,this.isUserScroll=!1,this.enableHaptics=!1,this.ariaLabel=null,this.isActive=!1,this.disabled=!1,this.numericInput=!1,this.centerPickerItemInView=(t,i=!0,e=!0)=>{const{isColumnVisible:s,scrollEl:o}=this;if(s&&o){const s=t.offsetTop-3*t.clientHeight+t.clientHeight/2;o.scrollTop!==s&&(this.canExitInputMode=e,this.updateValueTextOnScroll=!1,this.isUserScroll=!1,this.stopWatchingForOutsidePress(),o.scroll({top:s,left:0,behavior:i?"smooth":void 0}))}},this.setPickerItemActiveState=(t,i)=>{i?t.classList.add(u):t.classList.remove(u)},this.inputModeChange=t=>{if(!this.numericInput)return;const{useInputMode:i,inputModeColumn:e}=t.detail;this.setInputModeActive(!(!i||void 0!==e&&e!==this.el))},this.setInputModeActive=t=>{this.isScrolling?this.scrollEndCallback=()=>{this.isActive=t}:this.isActive=t},this.clearScrollEndTimeout=()=>{this.scrollEndTimeout&&(clearTimeout(this.scrollEndTimeout),this.scrollEndTimeout=void 0)},this.resetScrollEndTimeout=()=>{this.clearScrollEndTimeout(),this.scrollEndTimeout=setTimeout(this.settle,m)},this.watchForOutsidePress=()=>{n?.addEventListener("pointerdown",this.onPointerDownOutside,{capture:!0})},this.stopWatchingForOutsidePress=()=>{n?.removeEventListener("pointerdown",this.onPointerDownOutside,{capture:!0})},this.discardScroll=()=>{this.stopWatchingForOutsidePress(),this.clearScrollEndTimeout(),this.scrollEndCallback=void 0,this.centeredOption=void 0,this.haltedAtScrollTop=void 0,this.isScrolling=!1,this.isUserScroll=!1,this.canExitInputMode=!0},this.settle=()=>{const{centeredOption:t}=this;this.clearScrollEndTimeout(),this.stopWatchingForOutsidePress(),this.isUserScroll=!1,this.isScrolling=!1,this.updateValueTextOnScroll=!0,this.enableHaptics&&r();const{scrollEndCallback:i}=this;i&&(i(),this.scrollEndCallback=void 0),this.canExitInputMode=!0,void 0!==t&&(this.centeredOption=void 0,t.isConnected&&this.setValue(t.value))},this.onPointerDownOutside=t=>{const{centeredOption:i,parentEl:e,scrollEl:s}=this;if(!this.isScrolling)return;const o=t.composedPath();o.includes(this.el)||null!=e&&o.includes(e)||(void 0!==i&&i.isConnected&&(this.centerPickerItemInView(i,!1,!1),this.haltedAtScrollTop=s?.scrollTop),this.settle())},this.initializeScrollListener=()=>{this.enableHaptics=c("ios");const{el:t,scrollEl:i}=this;let e=this.activeItem;const s=()=>{a((()=>{if(!this.el.isConnected||!this.isColumnVisible||!i)return;const{haltedAtScrollTop:s}=this;if(void 0!==s){if(Math.abs(i.scrollTop-s)<=b)return;this.haltedAtScrollTop=void 0}this.resetScrollEndTimeout(),this.isScrolling||(this.enableHaptics&&h(),this.isScrolling=!0),this.isUserScroll&&this.watchForOutsidePress();const o=i.getBoundingClientRect(),a=o.x+o.width/2,r=o.y+o.height/2,c=t.getRootNode(),d=c instanceof ShadowRoot?c:n;if(void 0===d)return;let p=d.elementsFromPoint(a,r).find((t=>"ION-PICKER-COLUMN-OPTION"===t.tagName));if(void 0===p){const t=d.elementFromPoint(a,r);"ION-PICKER-COLUMN-OPTION"===t?.tagName&&(p=t)}void 0===p||p.disabled||(void 0!==e&&this.setPickerItemActiveState(e,!1),p!==e&&(this.enableHaptics&&l(),this.canExitInputMode&&this.exitInputMode()),e=p,this.setPickerItemActiveState(p,!0),this.updateValueTextOnScroll&&this.assistiveFocusable?.setAttribute("aria-valuetext",this.getOptionValueText(p)),this.centeredOption=p)}))},o=()=>{this.isUserScroll=!0,this.haltedAtScrollTop=void 0};a((()=>{i&&(i.addEventListener("scroll",s),i.addEventListener("pointerdown",o),i.addEventListener("wheel",o,{passive:!0}),i.addEventListener("touchmove",o,{passive:!0}),this.destroyScrollListener=()=>{i.removeEventListener("scroll",s),i.removeEventListener("pointerdown",o),i.removeEventListener("wheel",o),i.removeEventListener("touchmove",o)})}))},this.exitInputMode=()=>{const{parentEl:t}=this;null!=t&&(t.exitInputMode(),this.el.classList.remove("picker-column-active"))},this.findNextOption=(t=1)=>{const{activeItem:i}=this;if(!i)return null;let e=i,s=i.nextElementSibling;for(;null!=s;){if(t>0&&t--,"ION-PICKER-COLUMN-OPTION"===s.tagName&&!s.disabled&&0===t)return s;e=s,s=s.nextElementSibling}return e},this.findPreviousOption=(t=1)=>{const{activeItem:i}=this;if(!i)return null;let e=i,s=i.previousElementSibling;for(;null!=s;){if(t>0&&t--,"ION-PICKER-COLUMN-OPTION"===s.tagName&&!s.disabled&&0===t)return s;e=s,s=s.previousElementSibling}return e},this.onKeyDown=t=>{const i=c("mobile");let e=null;switch(t.key){case"ArrowDown":e=i?this.findPreviousOption():this.findNextOption();break;case"ArrowUp":e=i?this.findNextOption():this.findPreviousOption();break;case"PageUp":e=i?this.findNextOption(5):this.findPreviousOption(5);break;case"PageDown":e=i?this.findPreviousOption(5):this.findNextOption(5);break;case"Home":e=this.el.querySelector("ion-picker-column-option:first-of-type");break;case"End":e=this.el.querySelector("ion-picker-column-option:last-of-type")}null!==e&&(this.setValue(e.value),t.preventDefault())},this.getOptionValueText=t=>t?t.getAttribute("aria-label")??t.innerText:""}ariaLabelChanged(t){this.ariaLabel=t}valueChange(){this.isColumnVisible&&this.scrollActiveItemIntoView(!0)}componentWillLoad(){const t=this.parentEl=this.el.closest("ion-picker");new IntersectionObserver((t=>{if(t[t.length-1].isIntersecting){const{activeItem:t,el:i}=this;this.isColumnVisible=!0;const e=i.querySelector(`.${u}`);e&&this.setPickerItemActiveState(e,!1),this.scrollActiveItemIntoView(),t&&this.setPickerItemActiveState(t,!0),this.initializeScrollListener()}else this.isColumnVisible=!1,this.stopWatchingForOutsidePress(),this.centeredOption=void 0,this.haltedAtScrollTop=void 0,this.destroyScrollListener&&(this.destroyScrollListener(),this.destroyScrollListener=void 0)}),{threshold:.001,root:this.parentEl}).observe(this.el),null!==t&&t.addEventListener("ionInputModeChange",(t=>this.inputModeChange(t)))}componentDidRender(){const{el:t,activeItem:i,isColumnVisible:e,value:s}=this;if(e&&!i){const i=t.querySelector("ion-picker-column-option");null!==i&&i.value!==s&&this.setValue(i.value)}}async scrollActiveItemIntoView(t=!1){const i=this.activeItem;i&&this.centerPickerItemInView(i,t,!1)}async setValue(t){!0!==this.disabled&&this.value!==t&&(this.value=t,this.ionChange.emit({value:t}))}async setFocus(){this.assistiveFocusable&&this.assistiveFocusable.focus()}connectedCallback(){this.ariaLabel=this.el.getAttribute("aria-label")??"Select a value"}disconnectedCallback(){this.discardScroll()}get activeItem(){const{value:t}=this;return Array.from(this.el.querySelectorAll("ion-picker-column-option")).find((i=>!(!this.disabled&&i.disabled)&&i.value===t))}render(){const{color:t,disabled:i,isActive:o,numericInput:n}=this,a=d(this);return e(s,{key:"60a893619d0b01fba53fbccef67a10d533a22657",class:p(t,{[a]:!0,"picker-column-active":o,"picker-column-numeric-input":n,"picker-column-disabled":i})},e("slot",{key:"79f1e047f89c5ec916ed02efaac56ef3f73b8969",name:"prefix"}),e("div",{key:"c45c86e88353a196ff38159f40f390bc27852c9e",class:"picker-opts",ref:t=>{this.scrollEl=t},role:"slider",tabindex:this.disabled?void 0:0,"aria-label":this.ariaLabel,"aria-valuemin":0,"aria-valuemax":0,"aria-valuenow":0,"aria-valuetext":this.getOptionValueText(this.activeItem),"aria-orientation":"vertical",onKeyDown:t=>this.onKeyDown(t)},e("div",{key:"e02d76752f5d3dd4cd2846fbc28645f1508a4b49",class:"picker-item-empty","aria-hidden":"true"}," "),e("div",{key:"d577bcbadc530970b2781692b050811633625c5a",class:"picker-item-empty","aria-hidden":"true"}," "),e("div",{key:"c89e78c3a896bc1f55b922d01df16fdbb1259bdd",class:"picker-item-empty","aria-hidden":"true"}," "),e("slot",{key:"6c597ff899692597432ee2aa0b42de53b86deed4"}),e("div",{key:"91686ed94f14c47647836ed4d63e54b5c54ee3b9",class:"picker-item-empty","aria-hidden":"true"}," "),e("div",{key:"2ff058c6d0e8cef4e143c2d848f9a52684579af1",class:"picker-item-empty","aria-hidden":"true"}," "),e("div",{key:"bc7386bec6fced36e44084a7a137b3fe6506c996",class:"picker-item-empty","aria-hidden":"true"}," ")),e("slot",{key:"8835fd3f4e025bce964e6f05984c9aaadc20d7fb",name:"suffix"}))}get el(){return o(this)}static get watchers(){return{"aria-label":[{ariaLabelChanged:0}],value:[{valueChange:0}]}}},u="option-active",m=250,b=2;f.style=":host{display:-ms-flexbox;display:flex;position:relative;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;max-width:100%;height:200px;font-size:22px;text-align:center}.assistive-focusable{left:0;right:0;top:0;bottom:0;position:absolute;z-index:1;pointer-events:none}.assistive-focusable:focus{outline:none}.picker-opts{-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px;padding-top:0px;padding-bottom:0px;min-width:26px;max-height:200px;outline:none;text-align:inherit;-webkit-scroll-snap-type:y mandatory;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory;overflow-x:hidden;overflow-y:scroll;scrollbar-width:none}.picker-item-empty{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;display:block;width:100%;height:34px;border:0px;outline:none;background:transparent;color:inherit;font-family:var(--ion-font-family, inherit);font-size:inherit;line-height:34px;text-align:inherit;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.picker-opts::-webkit-scrollbar{display:none}::slotted(ion-picker-column-option){display:block;scroll-snap-align:center}.picker-item-empty,:host(:not([disabled])) ::slotted(ion-picker-column-option.option-disabled){scroll-snap-align:none}::slotted([slot=prefix]),::slotted([slot=suffix]){max-width:200px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}::slotted([slot=prefix]){-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px;padding-top:0;padding-bottom:0;-ms-flex-pack:end;justify-content:end}::slotted([slot=suffix]){-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px;padding-top:0;padding-bottom:0;-ms-flex-pack:start;justify-content:start}:host(.picker-column-disabled) .picker-opts{overflow-y:hidden}:host(.picker-column-disabled) ::slotted(ion-picker-column-option){cursor:default;opacity:0.4;pointer-events:none}@media (any-hover: hover){:host(:focus) .picker-opts{outline:none;background:rgba(var(--ion-color-primary-rgb, 0, 84, 233), 0.2)}:host(.ion-color:focus) .picker-opts{background:rgba(var(--ion-color-base-rgb), 0.2)}}";export{f as ion_picker_column}