@ionic/core
Version:
Base components for Ionic
4 lines • 4.85 kB
JavaScript
/*!
* (C) Ionic http://ionicframework.com - MIT License
*/
import{w as o,d as t}from"./p-ZjP4CjeZ.js";import{g as n,h as i,a as e}from"./p-V1THdfzs.js";import{a,b as r,c as s}from"./p-B4IBdPVJ.js";import{a as d,K as c}from"./p-BMPN55of.js";const l=new WeakMap,u=(o,t,n,i=0,e=!1)=>{l.has(o)!==n&&(n?f(o,t,i,e):w(o,t))},f=(o,t,n,i=!1)=>{const e=t.parentNode,a=t.cloneNode(!1);a.classList.add("cloned-input"),a.tabIndex=-1,i&&(a.disabled=!0);const r="rtl"===o.ownerDocument.dir;a.style.insetInlineStart=r?e.offsetWidth-t.offsetLeft-t.offsetWidth+"px":`${t.offsetLeft}px`,e.appendChild(a),l.set(o,a);const s=r?9999:-9999;o.style.pointerEvents="none",t.style.transform=`translate3d(${s}px,${n}px,0) scale(0)`},w=(o,t)=>{const n=l.get(o);n&&(l.delete(o),n.remove()),o.style.pointerEvents="",t.style.transform=""},p="input, textarea, [no-blur], [contenteditable]",m="$ionPaddingTimer",h=(o,t,n)=>{const i=o[m];i&&clearTimeout(i),t>0?o.style.setProperty("--keyboard-offset",`${t}px`):o[m]=setTimeout((()=>{o.style.setProperty("--keyboard-offset","0px"),n&&n()}),120)},b=(o,t,n)=>{o.addEventListener("focusout",(()=>{t&&h(t,0,n)}),{once:!0})};let y=0;const S="data-ionic-skip-scroll-assist",D=o=>{if(document.activeElement===o)return;const t=o.getAttribute("id"),n=o.closest(`label[for="${t}"]`),i=document.activeElement?.closest(`label[for="${t}"]`);null!==n&&n===i||(o.setAttribute(S,"true"),o.focus())},M=async(o,t,e,a,r,s,d=!1,c=0,l=!0)=>{if(!e&&!a)return;const f=((o,t,n,i)=>((o,t,n,i)=>{const e=o.top,a=o.bottom,r=t.top,s=r+15,d=Math.min(t.bottom,i-n)-50-a,c=s-e,l=Math.round(d<0?-d:c>0?-c:0),u=Math.min(l,e-r),f=Math.abs(u);return{scrollAmount:u,scrollDuration:Math.min(400,Math.max(150,f/.3)),scrollPadding:n,inputSafeY:4-(e-s)}})((o.closest("ion-item,[ion-item]")??o).getBoundingClientRect(),t.getBoundingClientRect(),n,i))(o,e||a,r,c);if(e&&Math.abs(f.scrollAmount)<4)return D(t),void(s&&null!==e&&(h(e,y),b(t,e,(()=>y=0))));if(u(o,t,!0,f.inputSafeY,d),D(t),s&&e&&(y=f.scrollPadding,h(e,y)),"undefined"!=typeof window){let a;const r=async()=>{void 0!==a&&clearTimeout(a),window.removeEventListener("ionKeyboardDidShow",d),window.removeEventListener("ionKeyboardDidShow",r),e&&await i(e,0,f.scrollAmount,f.scrollDuration),u(o,t,!1,f.inputSafeY),document.activeElement===t&&D(t),s&&b(t,e,(()=>y=0))},d=()=>{window.removeEventListener("ionKeyboardDidShow",d),window.addEventListener("ionKeyboardDidShow",r)};if(e){const o=await n(e);if(l&&f.scrollAmount>o.scrollHeight-o.clientHeight-o.scrollTop)return"password"===t.type?(f.scrollAmount+=50,window.addEventListener("ionKeyboardDidShow",d)):window.addEventListener("ionKeyboardDidShow",r),void(a=setTimeout(r,1e3))}r()}},x=async(n,i)=>{if(void 0===t)return;const l="ios"===i,f="android"===i,w=n.getNumber("keyboardHeight",290),m=n.getBoolean("scrollAssist",!0),h=n.getBoolean("hideCaretOnScroll",l),b=n.getBoolean("inputBlurring",!1),y=n.getBoolean("scrollPadding",!0),D=Array.from(t.querySelectorAll("ion-input, ion-textarea")),x=new WeakMap,K=new WeakMap,v=await c.getResizeMode(),k=async t=>{await new Promise((o=>s(t,o)));const n=t.shadowRoot||t,i=n.querySelector("input")||n.querySelector("textarea"),c=e(t),l=c?null:t.closest("ion-footer");if(i){if(c&&h&&!x.has(t)){const o=((o,t,n)=>{if(!n||!t)return()=>{};const i=n=>{var i;(i=t)===i.getRootNode().activeElement&&u(o,t,n)},e=()=>u(o,t,!1),s=()=>i(!0),d=()=>i(!1);return a(n,"ionScrollStart",s),a(n,"ionScrollEnd",d),t.addEventListener("blur",e),()=>{r(n,"ionScrollStart",s),r(n,"ionScrollEnd",d),t.removeEventListener("blur",e)}})(t,i,c);x.set(t,o)}if("date"!==i.type&&"datetime-local"!==i.type&&(c||l)&&m&&!K.has(t)){const n=((t,n,i,e,a,r,s,c=!1)=>{const l=r&&(void 0===s||s.mode===d.None);let u=!1;const f=void 0!==o?o.innerHeight:0,w=o=>{!1!==u?M(t,n,i,e,o.detail.keyboardHeight,l,c,f,!1):u=!0},p=()=>{u=!1,o?.removeEventListener("ionKeyboardDidShow",w),t.removeEventListener("focusout",p)},m=async()=>{n.hasAttribute(S)?n.removeAttribute(S):(M(t,n,i,e,a,l,c,f),o?.addEventListener("ionKeyboardDidShow",w),t.addEventListener("focusout",p))};return t.addEventListener("focusin",m),()=>{t.removeEventListener("focusin",m),o?.removeEventListener("ionKeyboardDidShow",w),t.removeEventListener("focusout",p)}})(t,i,c,l,w,y,v,f);K.set(t,n)}}};b&&(()=>{let o=!0,t=!1;const n=document;a(n,"ionScrollStart",(()=>{t=!0})),n.addEventListener("focusin",(()=>{o=!0}),!0),n.addEventListener("touchend",(i=>{if(t)return void(t=!1);const e=n.activeElement;if(!e)return;if(e.matches(p))return;const a=i.target;a!==e&&(a.matches(p)||a.closest(p)||(o=!1,setTimeout((()=>{o||e.blur()}),50)))}),!1)})();for(const o of D)k(o);t.addEventListener("ionInputDidLoad",(o=>{k(o.detail)})),t.addEventListener("ionInputDidUnload",(o=>{(o=>{if(h){const t=x.get(o);t&&t(),x.delete(o)}if(m){const t=K.get(o);t&&t(),K.delete(o)}})(o.detail)}))};export{x as startInputShims}