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