@rdlabo/ionic-theme-ios27 1.2.0 → 1.2.1-beta.pr273.shae866fb1dca9f

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.
Files changed (121) hide show
  1. package/dist/css/components/ion-button.css +1 -1
  2. package/dist/css/components/ion-toolbar.css +1 -1
  3. package/dist/css/ionic-theme-ios27.css +1 -1
  4. package/dist/css/vertical-bars.css +1 -1
  5. package/dist/native/components/index.js +2 -2
  6. package/dist/native/components/index.js.map +1 -1
  7. package/dist/native/definitions.d.ts +32 -0
  8. package/dist/native/definitions.d.ts.map +1 -1
  9. package/dist/native/index.d.ts.map +1 -1
  10. package/dist/native/index.js +23 -6
  11. package/dist/native/index.js.map +1 -1
  12. package/dist/native/overlays/content.d.ts +4 -0
  13. package/dist/native/overlays/content.d.ts.map +1 -0
  14. package/dist/native/overlays/content.js +51 -0
  15. package/dist/native/overlays/content.js.map +1 -0
  16. package/dist/native/overlays/controller.d.ts +8 -0
  17. package/dist/native/overlays/controller.d.ts.map +1 -0
  18. package/dist/native/overlays/controller.js +266 -0
  19. package/dist/native/overlays/controller.js.map +1 -0
  20. package/dist/native/overlays/dialog-animation.d.ts +8 -0
  21. package/dist/native/overlays/dialog-animation.d.ts.map +1 -0
  22. package/dist/native/overlays/dialog-animation.js +31 -0
  23. package/dist/native/overlays/dialog-animation.js.map +1 -0
  24. package/dist/native/overlays/dismiss-animation.d.ts +4 -0
  25. package/dist/native/overlays/dismiss-animation.d.ts.map +1 -0
  26. package/dist/native/overlays/dismiss-animation.js +18 -0
  27. package/dist/native/overlays/dismiss-animation.js.map +1 -0
  28. package/dist/native/overlays/focus.d.ts +5 -0
  29. package/dist/native/overlays/focus.d.ts.map +1 -0
  30. package/dist/native/overlays/focus.js +59 -0
  31. package/dist/native/overlays/focus.js.map +1 -0
  32. package/dist/native/overlays/popover.d.ts +11 -0
  33. package/dist/native/overlays/popover.d.ts.map +1 -0
  34. package/dist/native/overlays/popover.js +78 -0
  35. package/dist/native/overlays/popover.js.map +1 -0
  36. package/dist/native/overlays/styles.d.ts +9 -0
  37. package/dist/native/overlays/styles.d.ts.map +1 -0
  38. package/dist/native/overlays/styles.js +82 -0
  39. package/dist/native/overlays/styles.js.map +1 -0
  40. package/dist/native/prehide.d.ts.map +1 -1
  41. package/dist/native/prehide.js +6 -2
  42. package/dist/native/prehide.js.map +1 -1
  43. package/dist/native/runtime.d.ts +4 -1
  44. package/dist/native/runtime.d.ts.map +1 -1
  45. package/dist/native/runtime.js +29 -8
  46. package/dist/native/runtime.js.map +1 -1
  47. package/dist/native/shared/dom.d.ts +2 -0
  48. package/dist/native/shared/dom.d.ts.map +1 -1
  49. package/dist/native/shared/dom.js +5 -1
  50. package/dist/native/shared/dom.js.map +1 -1
  51. package/dist/native/shared/projection-id.d.ts +4 -0
  52. package/dist/native/shared/projection-id.d.ts.map +1 -0
  53. package/dist/native/shared/projection-id.js +7 -0
  54. package/dist/native/shared/projection-id.js.map +1 -0
  55. package/dist/native/vertical-bars-web.d.ts.map +1 -1
  56. package/dist/native/vertical-bars-web.js +4 -2
  57. package/dist/native/vertical-bars-web.js.map +1 -1
  58. package/dist/native-integration/index.d.ts +1 -1
  59. package/dist/native-integration/index.js.map +1 -1
  60. package/dist/native-integration/transition.d.ts +1 -1
  61. package/dist/native-integration/transition.js.map +1 -1
  62. package/dist/sheets-of-glass/animations.d.ts +1 -1
  63. package/dist/sheets-of-glass/animations.js +1 -1
  64. package/dist/sheets-of-glass/animations.js.map +1 -1
  65. package/dist/sheets-of-glass/index.js +1 -1
  66. package/dist/sheets-of-glass/index.js.map +1 -1
  67. package/dist/tab-bar-searchable/animations/enter.d.ts +1 -1
  68. package/dist/tab-bar-searchable/animations/enter.d.ts.map +1 -1
  69. package/dist/tab-bar-searchable/animations/enter.js +1 -1
  70. package/dist/tab-bar-searchable/animations/enter.js.map +1 -1
  71. package/dist/tab-bar-searchable/animations/leave.d.ts +1 -1
  72. package/dist/tab-bar-searchable/animations/leave.d.ts.map +1 -1
  73. package/dist/tab-bar-searchable/animations/leave.js +1 -1
  74. package/dist/tab-bar-searchable/animations/leave.js.map +1 -1
  75. package/dist/tab-bar-searchable/index.js +1 -1
  76. package/dist/tab-bar-searchable/index.js.map +1 -1
  77. package/dist/transition/index.d.ts +1 -1
  78. package/dist/transition/index.js +1 -1
  79. package/dist/transition/index.js.map +1 -1
  80. package/dist/transition/ios.transition.d.ts +1 -1
  81. package/dist/transition/ios.transition.js.map +1 -1
  82. package/dist/utils.d.ts +1 -1
  83. package/dist/utils.js.map +1 -1
  84. package/docs/native-ui-shell.md +20 -4
  85. package/docs/vertical-bars.md +3 -1
  86. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellSearchController.swift +65 -91
  87. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellTabBar.swift +9 -3
  88. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift +79 -3
  89. package/ios/Sources/IonicNativeUIShellPlugin/IonicNativeUIShellPlugin.swift +57 -1
  90. package/ios/Sources/IonicNativeUIShellPlugin/Overlays/ShellOverlayController.swift +116 -0
  91. package/ios/Sources/IonicNativeUIShellPlugin/Overlays/ShellOverlayHost.swift +36 -0
  92. package/ios/Tests/IonicNativeUIShellPluginTests/ShellSnapshotTests.swift +27 -0
  93. package/package.json +2 -2
  94. package/src/native/components/index.ts +3 -2
  95. package/src/native/definitions.ts +27 -1
  96. package/src/native/index.ts +23 -6
  97. package/src/native/overlays/content.ts +51 -0
  98. package/src/native/overlays/controller.ts +322 -0
  99. package/src/native/overlays/dialog-animation.ts +30 -0
  100. package/src/native/overlays/dismiss-animation.ts +15 -0
  101. package/src/native/overlays/focus.ts +64 -0
  102. package/src/native/overlays/popover.ts +80 -0
  103. package/src/native/overlays/styles.ts +80 -0
  104. package/src/native/prehide.ts +6 -1
  105. package/src/native/runtime.ts +39 -15
  106. package/src/native/shared/dom.ts +14 -0
  107. package/src/native/shared/projection-id.ts +2 -0
  108. package/src/native/vertical-bars-web.ts +11 -1
  109. package/src/native-integration/index.ts +1 -1
  110. package/src/native-integration/transition.ts +1 -1
  111. package/src/sheets-of-glass/animations.ts +2 -2
  112. package/src/sheets-of-glass/index.ts +2 -2
  113. package/src/styles/components/ion-button.scss +47 -0
  114. package/src/styles/components/ion-toolbar.scss +62 -7
  115. package/src/styles/vertical-bars.scss +23 -0
  116. package/src/tab-bar-searchable/animations/enter.ts +2 -1
  117. package/src/tab-bar-searchable/animations/leave.ts +2 -1
  118. package/src/tab-bar-searchable/index.ts +1 -1
  119. package/src/transition/index.ts +3 -3
  120. package/src/transition/ios.transition.ts +1 -1
  121. package/src/utils.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"vertical-bars-web.js","names":[],"sources":["../../src/native/vertical-bars-web.ts"],"sourcesContent":["import { createVerticalBarsWebSearch, searchProjectionClass } from './vertical-bars-web-search';\nimport { inVerticalBarsSurface, topModal } from './shared/modal';\nimport type { NativeUIShellHandle, NativeUIShellOptions, NativeUIShellStatus } from './definitions';\nimport { VERTICAL_BARS_TRANSITION_CANCELED } from '../native-integration';\nimport {\n activateProjectedElement,\n createVerticalBarsPageState,\n verticalBarsActionCandidate,\n verticalBarsBackCandidate,\n verticalBarsEnteringPage,\n verticalBarsToolbarActions,\n isExcluded,\n isShellDisabled,\n isVerticalBarsToolbarGroup,\n preferredVerticalBarsBack,\n verticalBarsOwned,\n marker,\n prehideOnlyMutation,\n prehiddenClass,\n unprojected,\n withoutPrehide,\n} from './shared/dom';\n\nconst backProjectionClass = 'ios-theme-vertical-bars-back-button-projection';\nconst toolbarProjectionClass = 'ios-theme-vertical-bars-toolbar-projection';\nconst readyClass = 'ios-theme-vertical-bars-toolbar-ready';\nconst toolbarControlSize = 46;\nconst toolbarControlGap = 10;\n\ninterface ToolbarProjection {\n source: HTMLIonButtonsElement;\n projection: HTMLElement;\n actions: { source: HTMLElement; projection: HTMLElement; previousAriaHidden: string | null }[];\n}\n\ninterface ToolbarSource {\n group: HTMLIonButtonsElement;\n actions: HTMLElement[];\n}\n\nexport const createVerticalBarsWebProjection = (\n doc: Document,\n options: NativeUIShellOptions,\n enabled: () => boolean = () => true,\n): NativeUIShellHandle => {\n const win = doc.defaultView!;\n const toolbarEnabled = options.controls === undefined || options.controls.toolbar === true;\n let root: HTMLElement | undefined;\n let backSource: HTMLIonBackButtonElement | undefined;\n let backProjection: HTMLIonBackButtonElement | undefined;\n let previousBackAriaHidden: string | null = null;\n let toolbarProjections: ToolbarProjection[] = [];\n let suspended = 0;\n let stopped = false;\n let frame = 0;\n let updates = 0;\n let observingVerticalBars = false;\n const verticalBarsPages = createVerticalBarsPageState();\n let sourceObserver: MutationObserver | undefined;\n let waiters: (() => void)[] = [];\n const listeners = new AbortController();\n const verticalBarsRoot = () => doc.querySelector<HTMLElement>('ion-app.ios-theme-vertical-bars');\n const projectedSources = () =>\n [backSource, search.source, ...toolbarProjections.flatMap(({ actions }) => actions.map(({ source }) => source))].filter(\n (source): source is HTMLElement => !!source,\n );\n const isRendered = (element: HTMLElement) =>\n withoutPrehide(element, () => {\n const style = getComputedStyle(element);\n const rect = element.getBoundingClientRect();\n return element.isConnected && style.display !== 'none' && style.visibility === 'visible' && rect.width > 0 && rect.height > 0;\n });\n const search = createVerticalBarsWebSearch(\n doc,\n (element) =>\n (options.controls === undefined || options.controls.tabs === true) &&\n !!verticalBarsRoot()?.contains(element) &&\n inVerticalBarsSurface(element) &&\n !isExcluded(element, verticalBarsEnteringPage(element)) &&\n !isShellDisabled(element) &&\n !verticalBarsPages.isDeparted(element) &&\n isRendered(element),\n () => {\n void schedule();\n },\n );\n const inEligibleToolbar = (element: HTMLElement) =>\n !!verticalBarsRoot()?.contains(element) &&\n inVerticalBarsSurface(element) &&\n verticalBarsActionCandidate(element) &&\n !isExcluded(element, verticalBarsEnteringPage(element)) &&\n !verticalBarsPages.isDeparted(element);\n const isEligibleBack = (element: HTMLIonBackButtonElement) =>\n !!verticalBarsRoot()?.contains(element) &&\n inVerticalBarsSurface(element) &&\n verticalBarsOwned(element) &&\n verticalBarsBackCandidate(element) &&\n !isExcluded(element, verticalBarsEnteringPage(element)) &&\n !verticalBarsPages.isDeparted(element) &&\n unprojected(projectedSources(), () => isRendered(element));\n const pageOrder = (element: Element) => Array.from(doc.querySelectorAll('.ion-page')).indexOf(element.closest('.ion-page')!);\n const findBack = () => {\n const candidates = Array.from(doc.querySelectorAll<HTMLIonBackButtonElement>(`ion-back-button:not(.${backProjectionClass})`)).filter(\n isEligibleBack,\n );\n return preferredVerticalBarsBack(candidates, doc);\n };\n const findToolbarGroups = () => {\n const candidates = Array.from(doc.querySelectorAll<HTMLIonButtonsElement>(`ion-buttons:not(.${toolbarProjectionClass})`)).flatMap(\n (group): ToolbarSource[] => {\n const actions = verticalBarsToolbarActions(group).filter((action) => unprojected(projectedSources(), () => isRendered(action)));\n if (!actions.length) return [];\n if (!isVerticalBarsToolbarGroup(group)) return actions.filter(inEligibleToolbar).map((action) => ({ group, actions: [action] }));\n return inEligibleToolbar(group) && unprojected(projectedSources(), () => isRendered(group)) ? [{ group, actions }] : [];\n },\n );\n const highestPage = Math.max(...candidates.map(({ group }) => pageOrder(group)));\n return candidates.filter(({ group }) => pageOrder(group) === highestPage);\n };\n const isCurrentToolbarAction = (source: HTMLElement) => findToolbarGroups().some(({ actions }) => actions.includes(source));\n const restore = () => {\n search.restore();\n backProjection?.remove();\n backProjection = undefined;\n if (backSource) {\n backSource.removeAttribute(marker);\n if (previousBackAriaHidden === null) backSource.removeAttribute('aria-hidden');\n else backSource.setAttribute('aria-hidden', previousBackAriaHidden);\n backSource.dispatchEvent(new CustomEvent('nativeUIShellChange'));\n }\n backSource = undefined;\n previousBackAriaHidden = null;\n for (const { projection, actions } of toolbarProjections) {\n projection.remove();\n for (const { source, previousAriaHidden } of actions) {\n source.removeAttribute(marker);\n if (previousAriaHidden === null) source.removeAttribute('aria-hidden');\n else source.setAttribute('aria-hidden', previousAriaHidden);\n source.dispatchEvent(new CustomEvent('nativeUIShellChange'));\n }\n }\n toolbarProjections = [];\n sourceObserver?.disconnect();\n sourceObserver = undefined;\n root?.classList.remove(readyClass);\n root = undefined;\n };\n const copyAttributes = (target: HTMLElement, original: HTMLElement) => {\n for (const name of ['id', 'slot', marker, 'aria-hidden']) target.removeAttribute(name);\n for (const attribute of Array.from(target.attributes))\n if (!['class', marker].includes(attribute.name) && !original.hasAttribute(attribute.name)) target.removeAttribute(attribute.name);\n for (const attribute of Array.from(original.attributes))\n if (!['id', 'slot', marker, 'aria-hidden'].includes(attribute.name)) target.setAttribute(attribute.name, attribute.value);\n target.classList.remove(prehiddenClass);\n };\n const syncBack = (target: HTMLIonBackButtonElement, original: HTMLIonBackButtonElement) => {\n copyAttributes(target, original);\n target.classList.add(backProjectionClass, 'ion-cloned-element');\n target.disabled = original.disabled;\n target.defaultHref = original.defaultHref;\n target.icon = original.icon;\n target.color = original.color;\n target.mode = original.mode;\n target.text = '';\n };\n const syncAction = (target: HTMLElement, original: HTMLElement) => {\n copyAttributes(target, original);\n target.classList.add('ios-theme-vertical-bars-toolbar-action', 'ion-cloned-element');\n const label =\n original.getAttribute('aria-label') ??\n original.shadowRoot?.querySelector('[part~=native]')?.getAttribute('aria-label') ??\n original.textContent?.trim();\n if (label) target.setAttribute('aria-label', label);\n if ('disabled' in original) (target as HTMLIonButtonElement).disabled = (original as HTMLIonButtonElement).disabled;\n if (original.matches('ion-button')) {\n const icon = original.querySelector<HTMLElement>('ion-icon, svg');\n const clonedIcon = icon?.cloneNode(true) as HTMLElement | undefined;\n clonedIcon?.setAttribute('slot', 'icon-only');\n target.replaceChildren(...(clonedIcon ? [clonedIcon] : []));\n }\n };\n const sameSources = (back: HTMLIonBackButtonElement | undefined, groups: ToolbarSource[]) =>\n back === backSource &&\n groups.length === toolbarProjections.length &&\n groups.every(({ group, actions }, index) => {\n const current = toolbarProjections[index];\n return (\n group === current.source &&\n actions.length === current.actions.length &&\n actions.every((action, actionIndex) => action === current.actions[actionIndex].source)\n );\n });\n const syncExisting = () => {\n if (backSource && backProjection) syncBack(backProjection, backSource);\n let topOffset = backSource ? toolbarControlSize + toolbarControlGap : 0;\n for (const { projection, source, actions } of toolbarProjections) {\n if (actions.length === 1 && !projection.matches('ion-buttons')) syncAction(projection, actions[0].source);\n else copyAttributes(projection, source);\n projection.classList.add(toolbarProjectionClass, 'ion-cloned-element');\n projection.style.setProperty('--ios-theme-vertical-bars-toolbar-offset', `${topOffset}px`);\n if (projection.matches('ion-buttons')) actions.forEach(({ source: action, projection: clone }) => syncAction(clone, action));\n topOffset += actions.length * toolbarControlSize + toolbarControlGap;\n }\n };\n const project = (nextBack: HTMLIonBackButtonElement | undefined, groups: ToolbarSource[]) => {\n root = topModal(doc) ?? verticalBarsRoot()!;\n let topOffset = 0;\n if (nextBack) {\n backSource = nextBack;\n previousBackAriaHidden = nextBack.getAttribute('aria-hidden');\n backProjection = nextBack.cloneNode(false) as HTMLIonBackButtonElement;\n syncBack(backProjection, nextBack);\n backProjection.addEventListener(\n 'click',\n (event) => {\n event.preventDefault();\n event.stopImmediatePropagation();\n if (backSource && backSource === findBack()) activateProjectedElement(backSource);\n },\n { capture: true },\n );\n root.append(backProjection);\n nextBack.setAttribute(marker, '');\n nextBack.setAttribute('aria-hidden', 'true');\n nextBack.dispatchEvent(new CustomEvent('nativeUIShellChange'));\n topOffset = toolbarControlSize + toolbarControlGap;\n }\n for (const { group, actions: sources } of groups) {\n const projection = (sources.length === 1 ? sources[0] : group).cloneNode(false) as HTMLElement;\n if (sources.length === 1) syncAction(projection, sources[0]);\n else copyAttributes(projection, group);\n projection.classList.add(toolbarProjectionClass, 'ion-cloned-element');\n projection.style.setProperty('--ios-theme-vertical-bars-toolbar-offset', `${topOffset}px`);\n const actions = sources.map((source) => {\n const clone = sources.length === 1 ? projection : (source.cloneNode(false) as HTMLElement);\n if (sources.length > 1) syncAction(clone, source);\n clone.addEventListener(\n 'click',\n (event) => {\n event.preventDefault();\n event.stopImmediatePropagation();\n if (isCurrentToolbarAction(source)) activateProjectedElement(source);\n },\n { capture: true },\n );\n if (sources.length > 1) projection.append(clone);\n const previousAriaHidden = source.getAttribute('aria-hidden');\n source.setAttribute(marker, '');\n source.setAttribute('aria-hidden', 'true');\n source.dispatchEvent(new CustomEvent('nativeUIShellChange'));\n return { source, projection: clone, previousAriaHidden };\n });\n root.append(projection);\n toolbarProjections.push({ source: group, projection, actions });\n topOffset += actions.length * toolbarControlSize + toolbarControlGap;\n }\n if (nextBack || toolbarProjections.length) root.classList.add(readyClass);\n sourceObserver = new MutationObserver((records) => {\n if (\n records.some(\n (record) =>\n record.type !== 'attributes' || (![marker, 'aria-hidden'].includes(record.attributeName ?? '') && !prehideOnlyMutation(record)),\n )\n )\n schedule();\n });\n if (nextBack?.shadowRoot)\n sourceObserver.observe(nextBack.shadowRoot, { subtree: true, childList: true, attributes: true, attributeOldValue: true });\n for (const { group } of groups)\n sourceObserver.observe(group, { subtree: true, childList: true, attributes: true, attributeOldValue: true });\n };\n const performUpdate = () => {\n frame = 0;\n const currentRoot = verticalBarsRoot();\n if (observingVerticalBars !== !!currentRoot) {\n observingVerticalBars = !!currentRoot;\n observer.disconnect();\n observer.observe(doc.documentElement, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeOldValue: true,\n attributeFilter: observingVerticalBars ? undefined : ['class'],\n });\n }\n if (stopped || suspended || !currentRoot || !enabled()) return restore();\n const nextBack = toolbarEnabled ? findBack() : undefined;\n const groups = toolbarEnabled ? findToolbarGroups() : [];\n const projectionRoot = topModal(doc) ?? currentRoot;\n search.update(projectionRoot);\n if (!nextBack && !groups.length && !search.source) return restore();\n if (root === (topModal(doc) ?? currentRoot) && sameSources(nextBack, groups)) return syncExisting();\n restore();\n project(nextBack, groups);\n search.update(projectionRoot);\n updates++;\n };\n const update = () => {\n try {\n performUpdate();\n } catch {\n restore();\n } finally {\n const pending = waiters;\n waiters = [];\n pending.forEach((resolve) => resolve());\n }\n };\n const schedule = (): Promise<void> => {\n if (stopped) return Promise.resolve();\n // Release Web ownership before the native runtime can acknowledge its next frame.\n if (!enabled()) restore();\n const done = new Promise<void>((resolve) => waiters.push(resolve));\n if (!frame) frame = win.requestAnimationFrame(update);\n return done;\n };\n const observer = new MutationObserver((records) => {\n const insideProjection = (target: Node) => {\n const element = target instanceof Element ? target : target.parentNode instanceof Element ? target.parentNode : undefined;\n const rootNode = target.getRootNode();\n const shadowHost = rootNode instanceof ShadowRoot ? rootNode.host : undefined;\n return !![element, shadowHost].some((candidate) =>\n candidate?.closest(`.${backProjectionClass}, .${toolbarProjectionClass}, .${searchProjectionClass}`),\n );\n };\n const verticalBarsChanged = records.some(\n (record) =>\n (record.type === 'attributes' && (record.target as Element).matches('ion-app')) ||\n (record.type === 'childList' &&\n Array.from(record.addedNodes).some(\n (node) =>\n node instanceof Element &&\n (node.matches('ion-app.ios-theme-vertical-bars') || !!node.querySelector('ion-app.ios-theme-vertical-bars')),\n )),\n );\n if (\n (observingVerticalBars &&\n records.some((record) => record.attributeName !== marker && !prehideOnlyMutation(record) && !insideProjection(record.target))) ||\n (!observingVerticalBars && verticalBarsChanged && records.some((record) => !prehideOnlyMutation(record)))\n )\n schedule();\n });\n observer.observe(doc.documentElement, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeOldValue: true,\n attributeFilter: ['class'],\n });\n const pageLifecycle = (event: Event) => {\n const page = event.target;\n if (!(page instanceof HTMLElement) || !page.matches('.ion-page')) return;\n if (event.type === VERTICAL_BARS_TRANSITION_CANCELED) {\n const entering = (event as CustomEvent<{ entering?: HTMLElement }>).detail?.entering;\n verticalBarsPages.cancel(entering, page);\n } else verticalBarsPages.lifecycle(event);\n if (verticalBarsRoot()) schedule();\n };\n for (const name of ['ionViewWillEnter', 'ionViewWillLeave', 'ionViewDidEnter', 'ionViewDidLeave'])\n doc.addEventListener(name, pageLifecycle, { capture: true, signal: listeners.signal });\n doc.addEventListener(VERTICAL_BARS_TRANSITION_CANCELED, pageLifecycle, { capture: true, signal: listeners.signal });\n for (const name of ['ionModalWillPresent', 'ionModalDidDismiss'])\n doc.addEventListener(name, schedule, { capture: true, signal: listeners.signal });\n win.addEventListener('resize', schedule, { signal: listeners.signal });\n win.addEventListener('nativeUIShellRefresh', schedule, { signal: listeners.signal });\n schedule();\n\n return {\n getStatus: (): NativeUIShellStatus => ({\n state: stopped ? 'stopped' : 'web',\n projected:\n Number(!!backSource) + Number(!!search.source) + toolbarProjections.reduce((count, group) => count + group.actions.length, 0),\n updates,\n }),\n async suspend() {\n suspended++;\n restore();\n let resumed = false;\n return {\n async resume() {\n if (resumed) return;\n resumed = true;\n suspended = Math.max(0, suspended - 1);\n if (!suspended) await schedule();\n },\n };\n },\n async destroy() {\n if (stopped) return;\n stopped = true;\n win.cancelAnimationFrame(frame);\n frame = 0;\n waiters.forEach((resolve) => resolve());\n waiters = [];\n observer.disconnect();\n sourceObserver?.disconnect();\n listeners.abort();\n restore();\n },\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"vertical-bars-web.js","names":[],"sources":["../../src/native/vertical-bars-web.ts"],"sourcesContent":["import { createVerticalBarsWebSearch, searchProjectionClass } from './vertical-bars-web-search';\nimport { inVerticalBarsSurface, topModal } from './shared/modal';\nimport type { NativeUIShellHandle, NativeUIShellOptions, NativeUIShellStatus } from './definitions';\nimport { VERTICAL_BARS_TRANSITION_CANCELED } from '../native-integration';\nimport {\n activateProjectedElement,\n createVerticalBarsPageState,\n verticalBarsActionCandidate,\n verticalBarsBackCandidate,\n verticalBarsEnteringPage,\n verticalBarsToolbarActions,\n isExcluded,\n isShellDisabled,\n isVerticalBarsToolbarGroup,\n preferredVerticalBarsBack,\n verticalBarsOwned,\n marker,\n syncToolbarText,\n toolbarTextMarker,\n prehideOnlyMutation,\n prehiddenClass,\n unprojected,\n withoutPrehide,\n} from './shared/dom';\n\nconst backProjectionClass = 'ios-theme-vertical-bars-back-button-projection';\nconst toolbarProjectionClass = 'ios-theme-vertical-bars-toolbar-projection';\nconst readyClass = 'ios-theme-vertical-bars-toolbar-ready';\nconst toolbarControlSize = 46;\nconst toolbarControlGap = 10;\n\ninterface ToolbarProjection {\n source: HTMLIonButtonsElement;\n projection: HTMLElement;\n actions: { source: HTMLElement; projection: HTMLElement; previousAriaHidden: string | null }[];\n}\n\ninterface ToolbarSource {\n group: HTMLIonButtonsElement;\n actions: HTMLElement[];\n}\n\nexport const createVerticalBarsWebProjection = (\n doc: Document,\n options: NativeUIShellOptions,\n enabled: () => boolean = () => true,\n): NativeUIShellHandle => {\n const win = doc.defaultView!;\n const toolbarEnabled = options.controls === undefined || options.controls.toolbar === true;\n let root: HTMLElement | undefined;\n let backSource: HTMLIonBackButtonElement | undefined;\n let backProjection: HTMLIonBackButtonElement | undefined;\n let previousBackAriaHidden: string | null = null;\n let toolbarProjections: ToolbarProjection[] = [];\n let suspended = 0;\n let stopped = false;\n let frame = 0;\n let updates = 0;\n let observingVerticalBars = false;\n const verticalBarsPages = createVerticalBarsPageState();\n let sourceObserver: MutationObserver | undefined;\n let waiters: (() => void)[] = [];\n const listeners = new AbortController();\n const verticalBarsRoot = () => doc.querySelector<HTMLElement>('ion-app.ios-theme-vertical-bars');\n const projectedSources = () =>\n [backSource, search.source, ...toolbarProjections.flatMap(({ actions }) => actions.map(({ source }) => source))].filter(\n (source): source is HTMLElement => !!source,\n );\n const isRendered = (element: HTMLElement) =>\n withoutPrehide(element, () => {\n const style = getComputedStyle(element);\n const rect = element.getBoundingClientRect();\n return element.isConnected && style.display !== 'none' && style.visibility === 'visible' && rect.width > 0 && rect.height > 0;\n });\n const search = createVerticalBarsWebSearch(\n doc,\n (element) =>\n (options.controls === undefined || options.controls.tabs === true) &&\n !!verticalBarsRoot()?.contains(element) &&\n inVerticalBarsSurface(element) &&\n !isExcluded(element, verticalBarsEnteringPage(element)) &&\n !isShellDisabled(element) &&\n !verticalBarsPages.isDeparted(element) &&\n isRendered(element),\n () => {\n void schedule();\n },\n );\n const inEligibleToolbar = (element: HTMLElement) =>\n !!verticalBarsRoot()?.contains(element) &&\n inVerticalBarsSurface(element) &&\n verticalBarsActionCandidate(element) &&\n !isExcluded(element, verticalBarsEnteringPage(element)) &&\n !verticalBarsPages.isDeparted(element);\n const isEligibleBack = (element: HTMLIonBackButtonElement) =>\n !!verticalBarsRoot()?.contains(element) &&\n inVerticalBarsSurface(element) &&\n verticalBarsOwned(element) &&\n verticalBarsBackCandidate(element) &&\n !isExcluded(element, verticalBarsEnteringPage(element)) &&\n !verticalBarsPages.isDeparted(element) &&\n unprojected(projectedSources(), () => isRendered(element));\n const pageOrder = (element: Element) => Array.from(doc.querySelectorAll('.ion-page')).indexOf(element.closest('.ion-page')!);\n const findBack = () => {\n const candidates = Array.from(doc.querySelectorAll<HTMLIonBackButtonElement>(`ion-back-button:not(.${backProjectionClass})`)).filter(\n isEligibleBack,\n );\n return preferredVerticalBarsBack(candidates, doc);\n };\n const findToolbarGroups = () => {\n const candidates = Array.from(doc.querySelectorAll<HTMLIonButtonsElement>(`ion-buttons:not(.${toolbarProjectionClass})`)).flatMap(\n (group): ToolbarSource[] => {\n const actions = verticalBarsToolbarActions(group).filter((action) => unprojected(projectedSources(), () => isRendered(action)));\n if (!actions.length) return [];\n if (!isVerticalBarsToolbarGroup(group)) return actions.filter(inEligibleToolbar).map((action) => ({ group, actions: [action] }));\n return inEligibleToolbar(group) && unprojected(projectedSources(), () => isRendered(group)) ? [{ group, actions }] : [];\n },\n );\n const highestPage = Math.max(...candidates.map(({ group }) => pageOrder(group)));\n return candidates.filter(({ group }) => pageOrder(group) === highestPage);\n };\n const isCurrentToolbarAction = (source: HTMLElement) => findToolbarGroups().some(({ actions }) => actions.includes(source));\n const restore = () => {\n search.restore();\n backProjection?.remove();\n backProjection = undefined;\n if (backSource) {\n backSource.removeAttribute(marker);\n if (previousBackAriaHidden === null) backSource.removeAttribute('aria-hidden');\n else backSource.setAttribute('aria-hidden', previousBackAriaHidden);\n backSource.dispatchEvent(new CustomEvent('nativeUIShellChange'));\n }\n backSource = undefined;\n previousBackAriaHidden = null;\n for (const { projection, actions } of toolbarProjections) {\n projection.remove();\n for (const { source, previousAriaHidden } of actions) {\n source.removeAttribute(marker);\n if (previousAriaHidden === null) source.removeAttribute('aria-hidden');\n else source.setAttribute('aria-hidden', previousAriaHidden);\n source.dispatchEvent(new CustomEvent('nativeUIShellChange'));\n }\n }\n toolbarProjections = [];\n sourceObserver?.disconnect();\n sourceObserver = undefined;\n root?.classList.remove(readyClass);\n root = undefined;\n };\n const copyAttributes = (target: HTMLElement, original: HTMLElement) => {\n for (const name of ['id', 'slot', marker, 'aria-hidden']) target.removeAttribute(name);\n for (const attribute of Array.from(target.attributes))\n if (!['class', marker].includes(attribute.name) && !original.hasAttribute(attribute.name)) target.removeAttribute(attribute.name);\n for (const attribute of Array.from(original.attributes))\n if (!['id', 'slot', marker, 'aria-hidden'].includes(attribute.name)) target.setAttribute(attribute.name, attribute.value);\n target.classList.remove(prehiddenClass);\n };\n const syncBack = (target: HTMLIonBackButtonElement, original: HTMLIonBackButtonElement) => {\n copyAttributes(target, original);\n target.classList.add(backProjectionClass, 'ion-cloned-element');\n target.disabled = original.disabled;\n target.defaultHref = original.defaultHref;\n target.icon = original.icon;\n target.color = original.color;\n target.mode = original.mode;\n target.text = '';\n };\n const syncAction = (target: HTMLElement, original: HTMLElement) => {\n copyAttributes(target, original);\n target.classList.add('ios-theme-vertical-bars-toolbar-action', 'ion-cloned-element');\n const label =\n original.getAttribute('aria-label') ??\n original.shadowRoot?.querySelector('[part~=native]')?.getAttribute('aria-label') ??\n original.textContent?.trim();\n if (label) target.setAttribute('aria-label', label);\n if ('disabled' in original) (target as HTMLIonButtonElement).disabled = (original as HTMLIonButtonElement).disabled;\n if (original.matches('ion-button')) {\n const icon = original.querySelector<HTMLElement>('ion-icon, svg');\n const clonedIcon = icon?.cloneNode(true) as HTMLElement | undefined;\n clonedIcon?.setAttribute('slot', 'icon-only');\n target.replaceChildren(...(clonedIcon ? [clonedIcon] : []));\n }\n };\n const sameSources = (back: HTMLIonBackButtonElement | undefined, groups: ToolbarSource[]) =>\n back === backSource &&\n groups.length === toolbarProjections.length &&\n groups.every(({ group, actions }, index) => {\n const current = toolbarProjections[index];\n return (\n group === current.source &&\n actions.length === current.actions.length &&\n actions.every((action, actionIndex) => action === current.actions[actionIndex].source)\n );\n });\n const syncExisting = () => {\n if (backSource && backProjection) syncBack(backProjection, backSource);\n let topOffset = backSource ? toolbarControlSize + toolbarControlGap : 0;\n for (const { projection, source, actions } of toolbarProjections) {\n if (actions.length === 1 && !projection.matches('ion-buttons')) syncAction(projection, actions[0].source);\n else copyAttributes(projection, source);\n projection.classList.add(toolbarProjectionClass, 'ion-cloned-element');\n projection.style.setProperty('--ios-theme-vertical-bars-toolbar-offset', `${topOffset}px`);\n if (projection.matches('ion-buttons')) actions.forEach(({ source: action, projection: clone }) => syncAction(clone, action));\n topOffset += actions.length * toolbarControlSize + toolbarControlGap;\n }\n };\n const project = (nextBack: HTMLIonBackButtonElement | undefined, groups: ToolbarSource[]) => {\n root = topModal(doc) ?? verticalBarsRoot()!;\n let topOffset = 0;\n if (nextBack) {\n backSource = nextBack;\n previousBackAriaHidden = nextBack.getAttribute('aria-hidden');\n backProjection = nextBack.cloneNode(false) as HTMLIonBackButtonElement;\n syncBack(backProjection, nextBack);\n backProjection.addEventListener(\n 'click',\n (event) => {\n event.preventDefault();\n event.stopImmediatePropagation();\n if (backSource && backSource === findBack()) activateProjectedElement(backSource);\n },\n { capture: true },\n );\n root.append(backProjection);\n nextBack.setAttribute(marker, '');\n nextBack.setAttribute('aria-hidden', 'true');\n nextBack.dispatchEvent(new CustomEvent('nativeUIShellChange'));\n topOffset = toolbarControlSize + toolbarControlGap;\n }\n for (const { group, actions: sources } of groups) {\n const projection = (sources.length === 1 ? sources[0] : group).cloneNode(false) as HTMLElement;\n if (sources.length === 1) syncAction(projection, sources[0]);\n else copyAttributes(projection, group);\n projection.classList.add(toolbarProjectionClass, 'ion-cloned-element');\n projection.style.setProperty('--ios-theme-vertical-bars-toolbar-offset', `${topOffset}px`);\n const actions = sources.map((source) => {\n const clone = sources.length === 1 ? projection : (source.cloneNode(false) as HTMLElement);\n if (sources.length > 1) syncAction(clone, source);\n clone.addEventListener(\n 'click',\n (event) => {\n event.preventDefault();\n event.stopImmediatePropagation();\n if (isCurrentToolbarAction(source)) activateProjectedElement(source);\n },\n { capture: true },\n );\n if (sources.length > 1) projection.append(clone);\n const previousAriaHidden = source.getAttribute('aria-hidden');\n source.setAttribute(marker, '');\n source.setAttribute('aria-hidden', 'true');\n source.dispatchEvent(new CustomEvent('nativeUIShellChange'));\n return { source, projection: clone, previousAriaHidden };\n });\n root.append(projection);\n toolbarProjections.push({ source: group, projection, actions });\n topOffset += actions.length * toolbarControlSize + toolbarControlGap;\n }\n if (nextBack || toolbarProjections.length) root.classList.add(readyClass);\n sourceObserver = new MutationObserver((records) => {\n if (\n records.some(\n (record) =>\n record.type !== 'attributes' || (![marker, 'aria-hidden'].includes(record.attributeName ?? '') && !prehideOnlyMutation(record)),\n )\n )\n schedule();\n });\n if (nextBack?.shadowRoot)\n sourceObserver.observe(nextBack.shadowRoot, { subtree: true, childList: true, attributes: true, attributeOldValue: true });\n for (const { group } of groups)\n sourceObserver.observe(group, { subtree: true, childList: true, attributes: true, attributeOldValue: true });\n };\n const performUpdate = () => {\n frame = 0;\n syncToolbarText(doc);\n const currentRoot = verticalBarsRoot();\n if (observingVerticalBars !== !!currentRoot) {\n observingVerticalBars = !!currentRoot;\n observer.disconnect();\n observer.observe(doc.documentElement, {\n subtree: true,\n childList: true,\n characterData: observingVerticalBars,\n attributes: true,\n attributeOldValue: true,\n attributeFilter: observingVerticalBars ? undefined : ['class'],\n });\n }\n if (stopped || suspended || !currentRoot || !enabled()) return restore();\n const nextBack = toolbarEnabled ? findBack() : undefined;\n const groups = toolbarEnabled ? findToolbarGroups() : [];\n const projectionRoot = topModal(doc) ?? currentRoot;\n search.update(projectionRoot);\n if (!nextBack && !groups.length && !search.source) return restore();\n if (root === (topModal(doc) ?? currentRoot) && sameSources(nextBack, groups)) return syncExisting();\n restore();\n project(nextBack, groups);\n search.update(projectionRoot);\n updates++;\n };\n const update = () => {\n try {\n performUpdate();\n } catch {\n restore();\n } finally {\n const pending = waiters;\n waiters = [];\n pending.forEach((resolve) => resolve());\n }\n };\n const schedule = (): Promise<void> => {\n if (stopped) return Promise.resolve();\n // Release Web ownership before the native runtime can acknowledge its next frame.\n if (!enabled()) restore();\n const done = new Promise<void>((resolve) => waiters.push(resolve));\n if (!frame) frame = win.requestAnimationFrame(update);\n return done;\n };\n const observer = new MutationObserver((records) => {\n const insideProjection = (target: Node) => {\n const element = target instanceof Element ? target : target.parentNode instanceof Element ? target.parentNode : undefined;\n const rootNode = target.getRootNode();\n const shadowHost = rootNode instanceof ShadowRoot ? rootNode.host : undefined;\n return !![element, shadowHost].some((candidate) =>\n candidate?.closest(`.${backProjectionClass}, .${toolbarProjectionClass}, .${searchProjectionClass}`),\n );\n };\n const verticalBarsChanged = records.some(\n (record) =>\n (record.type === 'attributes' && (record.target as Element).matches('ion-app')) ||\n (record.type === 'childList' &&\n Array.from(record.addedNodes).some(\n (node) =>\n node instanceof Element &&\n (node.matches('ion-app.ios-theme-vertical-bars') || !!node.querySelector('ion-app.ios-theme-vertical-bars')),\n )),\n );\n if (\n (observingVerticalBars &&\n records.some(\n (record) =>\n record.attributeName !== marker &&\n record.attributeName !== toolbarTextMarker &&\n !prehideOnlyMutation(record) &&\n !insideProjection(record.target),\n )) ||\n (!observingVerticalBars && verticalBarsChanged && records.some((record) => !prehideOnlyMutation(record)))\n )\n schedule();\n });\n observer.observe(doc.documentElement, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeOldValue: true,\n attributeFilter: ['class'],\n });\n const pageLifecycle = (event: Event) => {\n const page = event.target;\n if (!(page instanceof HTMLElement) || !page.matches('.ion-page')) return;\n if (event.type === VERTICAL_BARS_TRANSITION_CANCELED) {\n const entering = (event as CustomEvent<{ entering?: HTMLElement }>).detail?.entering;\n verticalBarsPages.cancel(entering, page);\n } else verticalBarsPages.lifecycle(event);\n if (verticalBarsRoot()) schedule();\n };\n for (const name of ['ionViewWillEnter', 'ionViewWillLeave', 'ionViewDidEnter', 'ionViewDidLeave'])\n doc.addEventListener(name, pageLifecycle, { capture: true, signal: listeners.signal });\n doc.addEventListener(VERTICAL_BARS_TRANSITION_CANCELED, pageLifecycle, { capture: true, signal: listeners.signal });\n for (const name of ['ionModalWillPresent', 'ionModalDidDismiss'])\n doc.addEventListener(name, schedule, { capture: true, signal: listeners.signal });\n win.addEventListener('resize', schedule, { signal: listeners.signal });\n win.addEventListener('nativeUIShellRefresh', schedule, { signal: listeners.signal });\n schedule();\n\n return {\n getStatus: (): NativeUIShellStatus => ({\n state: stopped ? 'stopped' : 'web',\n projected:\n Number(!!backSource) + Number(!!search.source) + toolbarProjections.reduce((count, group) => count + group.actions.length, 0),\n updates,\n }),\n async suspend() {\n suspended++;\n restore();\n let resumed = false;\n return {\n async resume() {\n if (resumed) return;\n resumed = true;\n suspended = Math.max(0, suspended - 1);\n if (!suspended) await schedule();\n },\n };\n },\n async destroy() {\n if (stopped) return;\n stopped = true;\n win.cancelAnimationFrame(frame);\n frame = 0;\n waiters.forEach((resolve) => resolve());\n waiters = [];\n observer.disconnect();\n sourceObserver?.disconnect();\n listeners.abort();\n restore();\n },\n };\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Animation } from "@ionic/core";
1
+ import { Animation } from "@ionic/core/components";
2
2
  //#region src/native-integration/index.d.ts
3
3
  export interface NativeUIShellIntegration {
4
4
  suspend(scopes: HTMLElement[]): Promise<(canceled?: boolean) => void>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/native-integration/index.ts"],"sourcesContent":["/// <reference lib=\"es2021.weakref\" />\nimport type { Animation } from '@ionic/core';\n\nexport interface NativeUIShellIntegration {\n suspend(scopes: HTMLElement[]): Promise<(canceled?: boolean) => void>;\n search?(binding: NativeSearchBinding, active: boolean, focus?: boolean): Promise<boolean>;\n}\n\nexport interface NativeSearchBinding {\n tabBar: HTMLElement;\n trigger: HTMLElement;\n footer: HTMLElement;\n active: boolean;\n focused: boolean;\n}\n\nconst searches = new WeakMap<Document, WeakRef<NativeSearchBinding>[]>();\n\nexport const registerNativeSearch = (tabBar: HTMLElement, trigger: HTMLElement, footer: HTMLElement): NativeSearchBinding => {\n const binding = { tabBar, trigger, footer, active: false, focused: false };\n const entries = (searches.get(tabBar.ownerDocument) ?? []).filter((entry) => entry.deref() && entry.deref()?.footer !== footer);\n entries.push(new WeakRef(binding));\n searches.set(tabBar.ownerDocument, entries);\n tabBar.ownerDocument.defaultView?.dispatchEvent(new Event('nativeUIShellRefresh'));\n return binding;\n};\n\nexport const getNativeSearchBindings = (doc: Document): NativeSearchBinding[] =>\n (searches.get(doc) ?? []).flatMap((entry) => entry.deref() ?? []);\n\nexport const requestNativeSearch = async (binding: NativeSearchBinding, active: boolean, focus?: boolean): Promise<boolean> =>\n (await runtimes.get(binding.tabBar.ownerDocument)?.search?.(binding, active, focus)) ?? false;\n\nconst runtimes = new WeakMap<Document, NativeUIShellIntegration>();\nexport const VERTICAL_BARS_TRANSITION_CANCELED = 'iosThemeVerticalBarsTransitionCanceled';\n\nexport const setNativeUIShellIntegration = (doc: Document, runtime?: NativeUIShellIntegration) => {\n if (runtime) runtimes.set(doc, runtime);\n else runtimes.delete(doc);\n};\n\nexport const isNativeUIShell = (element: HTMLElement) => element.hasAttribute('data-native-ui-shell');\n\nexport const suspendNativeUIShell = async (scopes: HTMLElement[]): Promise<(canceled?: boolean) => void> =>\n (await runtimes.get(scopes[0]?.ownerDocument)?.suspend(scopes)) ?? (() => {});\n\nconst connectedTransitions = new WeakSet<Animation>();\nconst cancellationTransitions = new WeakSet<Animation>();\n\n/** Ionic write hooks cannot await the bridge. Gate playback, including interactive playback. */\nexport const connectNativeUIShellTransition = (animation: Animation, entering: HTMLElement, leaving?: HTMLElement) => {\n if (leaving && !cancellationTransitions.has(animation)) {\n cancellationTransitions.add(animation);\n animation.onFinish((step) => {\n if (step === 0) leaving.dispatchEvent(new CustomEvent(VERTICAL_BARS_TRANSITION_CANCELED, { bubbles: true, detail: { entering } }));\n });\n }\n if (connectedTransitions.has(animation) || !runtimes.has(entering.ownerDocument)) return;\n connectedTransitions.add(animation);\n const scopes = leaving ? [entering, leaving] : [entering];\n const play = animation.play.bind(animation);\n const progressStart = animation.progressStart.bind(animation);\n const progressStep = animation.progressStep.bind(animation);\n const progressEnd = animation.progressEnd.bind(animation);\n const destroy = animation.destroy.bind(animation);\n let release: ((canceled?: boolean) => void) | undefined;\n let preparation: Promise<void> | undefined;\n let disposed = false;\n let interactiveReady = false;\n let step: number | undefined;\n let end: Parameters<Animation['progressEnd']> | undefined;\n const prepare = () =>\n (preparation ??= suspendNativeUIShell(scopes).then((resume) => {\n if (disposed) resume(true);\n else release = resume;\n }));\n const finish = (canceled = false) => {\n release?.(canceled);\n release = undefined;\n preparation = undefined;\n };\n animation.onFinish((step) => finish(step === 0));\n animation.play = async (options) => {\n await prepare();\n if (disposed) return;\n try {\n await play(options);\n } finally {\n finish();\n }\n };\n animation.progressStart = (...args) => {\n interactiveReady = false;\n step = undefined;\n end = undefined;\n void prepare().then(() => {\n if (disposed) return;\n progressStart(...args);\n interactiveReady = true;\n if (step !== undefined) progressStep(step);\n if (end) progressEnd(...end);\n });\n return animation;\n };\n animation.progressStep = (value) => {\n step = value;\n if (interactiveReady) progressStep(value);\n return animation;\n };\n animation.progressEnd = (...args) => {\n end = args;\n if (interactiveReady) progressEnd(...args);\n return animation;\n };\n animation.destroy = (...args) => {\n disposed = true;\n finish(true);\n return destroy(...args);\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/native-integration/index.ts"],"sourcesContent":["/// <reference lib=\"es2021.weakref\" />\nimport type { Animation } from '@ionic/core/components';\n\nexport interface NativeUIShellIntegration {\n suspend(scopes: HTMLElement[]): Promise<(canceled?: boolean) => void>;\n search?(binding: NativeSearchBinding, active: boolean, focus?: boolean): Promise<boolean>;\n}\n\nexport interface NativeSearchBinding {\n tabBar: HTMLElement;\n trigger: HTMLElement;\n footer: HTMLElement;\n active: boolean;\n focused: boolean;\n}\n\nconst searches = new WeakMap<Document, WeakRef<NativeSearchBinding>[]>();\n\nexport const registerNativeSearch = (tabBar: HTMLElement, trigger: HTMLElement, footer: HTMLElement): NativeSearchBinding => {\n const binding = { tabBar, trigger, footer, active: false, focused: false };\n const entries = (searches.get(tabBar.ownerDocument) ?? []).filter((entry) => entry.deref() && entry.deref()?.footer !== footer);\n entries.push(new WeakRef(binding));\n searches.set(tabBar.ownerDocument, entries);\n tabBar.ownerDocument.defaultView?.dispatchEvent(new Event('nativeUIShellRefresh'));\n return binding;\n};\n\nexport const getNativeSearchBindings = (doc: Document): NativeSearchBinding[] =>\n (searches.get(doc) ?? []).flatMap((entry) => entry.deref() ?? []);\n\nexport const requestNativeSearch = async (binding: NativeSearchBinding, active: boolean, focus?: boolean): Promise<boolean> =>\n (await runtimes.get(binding.tabBar.ownerDocument)?.search?.(binding, active, focus)) ?? false;\n\nconst runtimes = new WeakMap<Document, NativeUIShellIntegration>();\nexport const VERTICAL_BARS_TRANSITION_CANCELED = 'iosThemeVerticalBarsTransitionCanceled';\n\nexport const setNativeUIShellIntegration = (doc: Document, runtime?: NativeUIShellIntegration) => {\n if (runtime) runtimes.set(doc, runtime);\n else runtimes.delete(doc);\n};\n\nexport const isNativeUIShell = (element: HTMLElement) => element.hasAttribute('data-native-ui-shell');\n\nexport const suspendNativeUIShell = async (scopes: HTMLElement[]): Promise<(canceled?: boolean) => void> =>\n (await runtimes.get(scopes[0]?.ownerDocument)?.suspend(scopes)) ?? (() => {});\n\nconst connectedTransitions = new WeakSet<Animation>();\nconst cancellationTransitions = new WeakSet<Animation>();\n\n/** Ionic write hooks cannot await the bridge. Gate playback, including interactive playback. */\nexport const connectNativeUIShellTransition = (animation: Animation, entering: HTMLElement, leaving?: HTMLElement) => {\n if (leaving && !cancellationTransitions.has(animation)) {\n cancellationTransitions.add(animation);\n animation.onFinish((step) => {\n if (step === 0) leaving.dispatchEvent(new CustomEvent(VERTICAL_BARS_TRANSITION_CANCELED, { bubbles: true, detail: { entering } }));\n });\n }\n if (connectedTransitions.has(animation) || !runtimes.has(entering.ownerDocument)) return;\n connectedTransitions.add(animation);\n const scopes = leaving ? [entering, leaving] : [entering];\n const play = animation.play.bind(animation);\n const progressStart = animation.progressStart.bind(animation);\n const progressStep = animation.progressStep.bind(animation);\n const progressEnd = animation.progressEnd.bind(animation);\n const destroy = animation.destroy.bind(animation);\n let release: ((canceled?: boolean) => void) | undefined;\n let preparation: Promise<void> | undefined;\n let disposed = false;\n let interactiveReady = false;\n let step: number | undefined;\n let end: Parameters<Animation['progressEnd']> | undefined;\n const prepare = () =>\n (preparation ??= suspendNativeUIShell(scopes).then((resume) => {\n if (disposed) resume(true);\n else release = resume;\n }));\n const finish = (canceled = false) => {\n release?.(canceled);\n release = undefined;\n preparation = undefined;\n };\n animation.onFinish((step) => finish(step === 0));\n animation.play = async (options) => {\n await prepare();\n if (disposed) return;\n try {\n await play(options);\n } finally {\n finish();\n }\n };\n animation.progressStart = (...args) => {\n interactiveReady = false;\n step = undefined;\n end = undefined;\n void prepare().then(() => {\n if (disposed) return;\n progressStart(...args);\n interactiveReady = true;\n if (step !== undefined) progressStep(step);\n if (end) progressEnd(...end);\n });\n return animation;\n };\n animation.progressStep = (value) => {\n step = value;\n if (interactiveReady) progressStep(value);\n return animation;\n };\n animation.progressEnd = (...args) => {\n end = args;\n if (interactiveReady) progressEnd(...args);\n return animation;\n };\n animation.destroy = (...args) => {\n disposed = true;\n finish(true);\n return destroy(...args);\n };\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { AnimationBuilder } from "@ionic/core";
1
+ import { AnimationBuilder } from "@ionic/core/components";
2
2
  //#region src/native-integration/transition.d.ts
3
3
  export declare const withNativeUIShellTransition: (builder: AnimationBuilder) => AnimationBuilder;
4
4
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"transition.js","names":[],"sources":["../../src/native-integration/transition.ts"],"sourcesContent":["import type { AnimationBuilder } from '@ionic/core';\nimport { connectNativeUIShellTransition } from './index';\n\n/**\n * Keeps an existing Ionic navigation animation and coordinates native control handoff.\n * Register the returned builder as navAnimation. Do not use it for overlay animations.\n * The builder must return a fresh Animation for each navigation; Ionic destroys it afterward.\n */\nexport const withNativeUIShellTransition =\n (builder: AnimationBuilder): AnimationBuilder =>\n (baseEl, opts) => {\n const animation = builder(baseEl, opts);\n if (opts?.enteringEl) connectNativeUIShellTransition(animation, opts.enteringEl, opts.leavingEl);\n return animation;\n };\n"],"mappings":";;;;;;;AAQA,MAAa,+BACV,aACA,QAAQ,SAAS;CAChB,MAAM,YAAY,QAAQ,QAAQ,IAAI;CACtC,IAAI,MAAM,YAAY,+BAA+B,WAAW,KAAK,YAAY,KAAK,SAAS;CAC/F,OAAO;AACT"}
1
+ {"version":3,"file":"transition.js","names":[],"sources":["../../src/native-integration/transition.ts"],"sourcesContent":["import type { AnimationBuilder } from '@ionic/core/components';\nimport { connectNativeUIShellTransition } from './index';\n\n/**\n * Keeps an existing Ionic navigation animation and coordinates native control handoff.\n * Register the returned builder as navAnimation. Do not use it for overlay animations.\n * The builder must return a fresh Animation for each navigation; Ionic destroys it afterward.\n */\nexport const withNativeUIShellTransition =\n (builder: AnimationBuilder): AnimationBuilder =>\n (baseEl, opts) => {\n const animation = builder(baseEl, opts);\n if (opts?.enteringEl) connectNativeUIShellTransition(animation, opts.enteringEl, opts.leavingEl);\n return animation;\n };\n"],"mappings":";;;;;;;AAQA,MAAa,+BACV,aACA,QAAQ,SAAS;CAChB,MAAM,YAAY,QAAQ,QAAQ,IAAI;CACtC,IAAI,MAAM,YAAY,+BAA+B,WAAW,KAAK,YAAY,KAAK,SAAS;CAC/F,OAAO;AACT"}
@@ -1,5 +1,5 @@
1
1
  import { AnimationPosition, EffectScales } from "./interfaces.js";
2
- import { Animation, AnimationKeyFrames, GestureDetail } from "@ionic/core";
2
+ import { Animation, AnimationKeyFrames, GestureDetail } from "@ionic/core/components";
3
3
  //#region src/sheets-of-glass/animations.d.ts
4
4
  export declare const animationRect: (element: Element, vertical?: boolean) => DOMRect | {
5
5
  left: number;
@@ -1,5 +1,5 @@
1
1
  import { getStep } from "../utils.js";
2
- import { createAnimation } from "@ionic/core";
2
+ import { createAnimation } from "@ionic/core/components/index.js";
3
3
  //#region src/sheets-of-glass/animations.ts
4
4
  const animationRect = (element, vertical = false) => {
5
5
  const rect = element.getBoundingClientRect();
@@ -1 +1 @@
1
- {"version":3,"file":"animations.js","names":[],"sources":["../../src/sheets-of-glass/animations.ts"],"sourcesContent":["import type { Animation, AnimationKeyFrames } from '@ionic/core';\nimport { AnimationPosition, EffectScales } from './interfaces';\nimport { createAnimation, GestureDetail } from '@ionic/core';\nimport { getStep } from '../utils';\n\n// Work in main/cross-axis coordinates so native horizontal samples also drive the rail.\nexport const animationRect = (element: Element, vertical = false) => {\n const rect = element.getBoundingClientRect();\n return vertical\n ? { left: rect.top, top: rect.left, right: rect.bottom, width: rect.height, height: rect.width, x: rect.y, y: rect.x }\n : rect;\n};\nconst translate = (x: number, y: number, vertical: boolean) => `translate3d(${vertical ? y : x}px, ${vertical ? x : y}px, 0)`;\nconst stretchTransform = (x: number, y: number, vertical: boolean) => `scale(${vertical ? y : x}, ${vertical ? x : y})`;\nconst mainSize = (element: HTMLElement, vertical: boolean) => (vertical ? element.offsetHeight : element.offsetWidth);\nconst axisScale = (transform: string, vertical: boolean) => {\n const matrix = new DOMMatrixReadOnly(transform);\n return vertical ? { a: matrix.d, d: matrix.a } : matrix;\n};\n\nexport const getScaleAnimation = (effectElement: Element): Animation => {\n return createAnimation().addElement(effectElement.shadowRoot!.querySelector<HTMLElement>('[part=\"native\"]')!).easing('ease-out');\n};\n\n// Seconds, center progress, extra width/height (pt), platter expansion progress.\nconst tabBarPressFrames = [\n [0, 0, 0, 0, 0],\n [0.033, 0.091, 4.26, 1.52, 0.148],\n [0.067, 0.312, 13.28, 2.89, 0.46],\n [0.1, 0.551, 21.99, 2.24, 0.752],\n [0.133, 0.736, 25.94, 2.77, 0.951],\n [0.167, 0.858, 24.35, 6.03, 1.052],\n [0.2, 0.932, 22.72, 8.41, 1.081],\n [0.267, 0.985, 21.55, 10.38, 1.058],\n [0.333, 1.003, 17.89, 13.98, 1.01],\n [0.4, 1.015, 13.54, 18.42, 1],\n [0.467, 1.018, 11.3, 20.75, 1],\n [0.6, 1.005, 12.36, 19.72, 1],\n [0.733, 0.993, 14.75, 17.27, 1],\n [0.9, 1, 16, 16, 1],\n];\n\n// Short-tap transfer, measured separately from a held press (seconds, center, width/height deltas).\nconst tabBarTapFrames = [\n [0, 0, 0, 0],\n [0.033, 0.099, 4.15, 2.91],\n [0.067, 0.333, 13.81, 5.59],\n [0.1, 0.589, 23.77, 5.52],\n [0.133, 0.794, 29.84, 4.24],\n [0.167, 0.925, 29.01, 5.83],\n [0.2, 0.992, 26.85, 7.25],\n [0.233, 1.015, 25.83, 7.87],\n [0.267, 1.018, 20.43, 5.56],\n [0.3, 1.018, 12.87, 3.16],\n [0.367, 1.024, 1.3, 2.69],\n [0.433, 1.031, -3.98, 4.1],\n [0.5, 1.027, -5.05, 3.89],\n [0.6, 1.013, -2.95, 2.31],\n [0.7, 1.003, -0.74, 0.59],\n [0.8, 1, 0, 0],\n];\n\n// UITabBarController presentation-layer samples: horizontal stretch precedes vertical stretch.\nexport const createTabBarPressAnimation = (\n effect: HTMLElement,\n from: HTMLElement,\n to: HTMLElement,\n bar: HTMLElement,\n vertical = false,\n): Animation => {\n const box = animationRect(bar, vertical);\n const center = box.left + box.width / 2;\n const left = center - mainSize(bar, vertical) / 2;\n const fromBox = animationRect(from, vertical);\n const toBox = animationRect(to, vertical);\n const parentScale = box.width / mainSize(bar, vertical);\n const buttonScale = axisScale(getComputedStyle(from).transform, vertical);\n const width = fromBox.width / parentScale / buttonScale.a;\n const height = fromBox.height / parentScale / buttonScale.d;\n const start = (fromBox.left + fromBox.width / 2 - box.left) / parentScale;\n const end = (toBox.left + toBox.width / 2 - box.left) / parentScale;\n const selected = from === to;\n const growth = vertical ? 20 / 16 : 1;\n const frames = tabBarPressFrames.map(([time, position, extraWidth, extraHeight, expansion]) => {\n const scale = vertical ? 1 : 1 + (14.14 / mainSize(bar, vertical)) * expansion;\n // A selected item expands in place, without the transfer's sideways deformation.\n const press = 1 - Math.exp(-18 * time) * (1 + 18 * time);\n return {\n offset: time / 0.9,\n x: center + (left + start + (end - start) * position - center) * scale - width / 2,\n sx: ((width + (selected ? 16 * press : extraWidth) * growth) * scale) / width,\n sy: ((height + (selected ? 16 * press : extraHeight) * growth) * scale) / height,\n };\n });\n const move = createAnimation()\n .addElement(effect)\n .beforeStyles({\n width: `${vertical ? height : width}px`,\n height: `${vertical ? width : height}px`,\n display: 'block',\n opacity: '1',\n })\n .keyframes(frames.map(({ offset, x }) => ({ offset, transform: translate(x, box.top + box.height / 2 - height / 2, vertical) })));\n const stretch = getScaleAnimation(effect)\n .easing('linear')\n .keyframes(frames.map(({ offset, sx, sy }) => ({ offset, transform: stretchTransform(sx, sy, vertical) })));\n return createAnimation().duration(900).easing('linear').addAnimation([move, stretch]);\n};\n\n// Drag samples: faster movement stretches sideways, then rebounds vertically at rest.\nexport const createTabBarDragAnimation = (effect: HTMLElement, bar: HTMLElement, velocity: number, vertical = false): Animation => {\n const native = effect.shadowRoot!.querySelector<HTMLElement>('[part=\"native\"]')!;\n const current = axisScale(native.style.transform || getComputedStyle(native).transform, vertical);\n const { width, height } = animationRect(effect, vertical);\n const scale = vertical ? 1 : 1 + 14.14 / mainSize(bar, vertical);\n const restX = ((width + (vertical ? 20 : 16)) * scale) / width;\n const restY = ((height + (vertical ? 20 : 16)) * scale) / height;\n // Approximate the 100/600pt/s UIKit samples; keep deformation bounded for fast swipes.\n const stretch = Math.min(16, 32 * velocity * velocity) * scale;\n const rebound = Math.max(stretch, (current.a - restX) * width) * 0.8;\n return getScaleAnimation(effect)\n .duration(500)\n .easing('linear')\n .keyframes([\n { offset: 0, transform: stretchTransform(current.a, current.d, vertical) },\n { offset: 0.2, transform: stretchTransform(restX + stretch / width, restY - stretch / height, vertical) },\n { offset: 0.44, transform: stretchTransform(restX - rebound / width, restY + rebound / height, vertical) },\n { offset: 1, transform: stretchTransform(restX, restY, vertical) },\n ]);\n};\n\n// UITabBarController release samples: return to rest with a small undershoot.\nexport const createTabBarReleaseAnimation = (\n effectElement: Element,\n target: HTMLElement,\n tap?: { elapsed: number; distance: number },\n vertical = false,\n): Animation => {\n const tapElapsed = tap?.elapsed;\n const native = effectElement.shadowRoot!.querySelector<HTMLElement>('[part=\"native\"]')!;\n const scale = axisScale(native.style.transform || getComputedStyle(native).transform, vertical);\n const samples = [\n [0, 1],\n [0.033, 0.85],\n [0.067, 0.58],\n [0.1, 0.31],\n [0.133, 0.15],\n [0.167, 0.055],\n [0.2, 0.01],\n [0.267, -0.01],\n [0.367, -0.004],\n [0.45, 0],\n ];\n const bar = target.parentElement!;\n const box = animationRect(bar, vertical);\n const current = animationRect(effectElement, vertical);\n const targetBox = animationRect(target, vertical);\n const center = box.left + box.width / 2;\n const x = center + (targetBox.left + targetBox.width / 2 - center) / (box.width / mainSize(bar, vertical)) - current.width / 2;\n const y = box.top + box.height / 2 - current.height / 2;\n // The vertical platter contracts from 64pt items to 44 × 58pt on release.\n const endScaleX = vertical ? target.offsetHeight / current.width : 1;\n const endScaleY = vertical ? target.offsetWidth / current.height : 1;\n const elapsed = (tapElapsed ?? 0) / 1000;\n const duration = tapElapsed === undefined ? 450 : 800 - tapElapsed;\n let frames = samples.map(([time, remaining]) => ({\n offset: time / 0.45,\n x: x + (current.x - x) * remaining,\n y: y + (current.y - y) * remaining,\n sx: endScaleX + (scale.a - endScaleX) * remaining,\n sy: endScaleY + (scale.d - endScaleY) * remaining,\n }));\n if (tapElapsed !== undefined && !vertical) {\n const nextIndex = tabBarTapFrames.findIndex(([time]) => time > elapsed);\n const previous = tabBarTapFrames[Math.max(0, nextIndex - 1)];\n const next = tabBarTapFrames[nextIndex];\n const progress = previous[1] + ((next[1] - previous[1]) * (elapsed - previous[0])) / (next[0] - previous[0]);\n // The late squeeze grows with travel (adjacent and three-item UIKit samples).\n const extraDistance = Math.max(0, tap!.distance - 1);\n // Start at the rendered press, not a recomputed rectangle, to avoid a release-frame jump.\n frames = [\n { offset: 0, x: current.x, y: current.y, sx: scale.a, sy: scale.d },\n ...tabBarTapFrames.slice(nextIndex).map(([time, position, width, height]) => ({\n offset: (time - elapsed) / (0.8 - elapsed),\n x: x + ((current.x - x) * (1 - position)) / Math.max(0.1, 1 - progress),\n y: y + ((current.y - y) * (1 - position)) / Math.max(0.1, 1 - progress),\n sx: 1 + (width * (time >= 0.367 ? 1 + 0.75 * extraDistance : 1)) / current.width,\n sy: 1 + (height * (time >= 0.367 ? 1 + 0.5 * extraDistance : 1)) / current.height,\n })),\n ];\n }\n const stretch = createAnimation()\n .addElement(native)\n .duration(duration)\n .easing('linear')\n .keyframes(frames.map(({ offset, sx, sy }) => ({ offset, transform: stretchTransform(sx, sy, vertical) })));\n const move = createAnimation()\n .addElement(effectElement)\n .duration(duration)\n .easing('linear')\n .keyframes(\n frames.map(({ offset, x, y }) => ({\n offset,\n transform: translate(x, y, vertical),\n })),\n );\n // Blend the reflective lens into the selected surface during the final 200ms.\n const offset = 1 - 200 / duration;\n const selectedBackground =\n 'var(--ios27-tab-selected-background, rgba(var(--ios-theme-button-color-selected-rgb, var(--ios26-button-color-selected-rgb, var(--ios27-button-color-selected-default-rgb))), 0.095))';\n const glass = createAnimation()\n .addElement(effectElement)\n .easing('linear')\n .keyframes([\n { offset: 0, opacity: 1 },\n { offset, opacity: 1 },\n { offset: 1, opacity: 0 },\n ]);\n const selected = createAnimation()\n .addElement(target.shadowRoot!.querySelector<HTMLElement>('[part=\"native\"]')!)\n .easing('linear')\n .keyframes([\n { offset: 0, backgroundColor: 'transparent' },\n { offset, backgroundColor: 'transparent' },\n { offset: 1, backgroundColor: selectedBackground },\n ]);\n const release = createAnimation().duration(duration).addAnimation([stretch, move, glass, selected]);\n if (tapElapsed !== undefined && !vertical) {\n // A short UIKit tap keeps expanding after lift-off, then settles independently of the lens.\n // Width deltas from the 50ms tap; preserve the rendered size for an uninterrupted handoff.\n const width = mainSize(bar, vertical);\n const expansion = box.width - width;\n const peak = Math.max(8.65, expansion);\n const platter = createAnimation()\n .addElement(bar)\n .easing('linear')\n .keyframes(\n [\n [0, expansion],\n [17, expansion + (peak - expansion) * 0.503],\n [34, expansion + (peak - expansion) * 0.868],\n [50, peak],\n [67, peak * (8.46 / 8.65)],\n [83, peak * (7.73 / 8.65)],\n [100, peak * (6.66 / 8.65)],\n [117, peak * (5.44 / 8.65)],\n [134, peak * (4.19 / 8.65)],\n [150, peak * (3 / 8.65)],\n [167, peak * (1.97 / 8.65)],\n [184, peak * (1.09 / 8.65)],\n [200, peak * (0.39 / 8.65)],\n [217, 0],\n [234, peak * (-0.48 / 8.65)],\n [250, peak * (-0.7 / 8.65)],\n [267, peak * (-0.8 / 8.65)],\n [283, peak * (-0.82 / 8.65)],\n [300, peak * (-0.77 / 8.65)],\n [317, peak * (-0.68 / 8.65)],\n [334, peak * (-0.57 / 8.65)],\n [350, peak * (-0.46 / 8.65)],\n [383, peak * (-0.14 / 8.65)],\n [417, 0],\n [duration, 0],\n ].map(([time, extra]) => ({ offset: time / duration, transform: `scale(${1 + extra / width}) translateZ(0)` })),\n );\n release.addAnimation(platter);\n }\n return release;\n};\n\nexport const createPreMoveAnimation = (\n effectElement: Element,\n tabSelectedElement: Element,\n currentTouchedElement: Element,\n animationPosition: AnimationPosition,\n): Animation => {\n const diff = Math.max(\n Math.abs(tabSelectedElement.getBoundingClientRect().left - currentTouchedElement.getBoundingClientRect().left),\n 140,\n );\n return createAnimation()\n .duration(diff * 2.1)\n .easing('ease-out')\n .addElement(effectElement)\n .beforeStyles({\n width: `${tabSelectedElement.clientWidth}px`,\n height: `${tabSelectedElement.clientHeight}px`,\n display: 'block',\n opacity: '1',\n transform: 'none',\n })\n .keyframes([\n {\n offset: 0,\n transform: `translate3d(${tabSelectedElement.getBoundingClientRect().left}px, ${animationPosition.positionY}px, 0)`,\n },\n {\n offset: 1,\n transform: `translate3d(${currentTouchedElement.getBoundingClientRect().left}px, ${animationPosition.positionY}px, 0)`,\n },\n ]);\n};\n\nexport const createMoveAnimation = (\n effectElement: Element,\n detail: GestureDetail,\n tabSelectedElement: Element,\n animationPosition: AnimationPosition,\n vertical = false,\n): Animation => {\n return createAnimation()\n .duration(500)\n .addElement(effectElement)\n .beforeStyles({\n width: `${tabSelectedElement.clientWidth}px`,\n height: `${tabSelectedElement.clientHeight}px`,\n display: 'block',\n opacity: '1',\n transform: 'none',\n })\n .fromTo(\n 'transform',\n translate(animationPosition.minPositionX, animationPosition.positionY, vertical),\n translate(animationPosition.maxPositionX, animationPosition.positionY, vertical),\n )\n .progressStep(getStep(detail.currentX, animationPosition));\n};\n\nexport const getMoveAnimationKeyframe = (type: 'moveRight' | 'moveLeft' | 'slowly', scales: EffectScales): AnimationKeyFrames => {\n return {\n moveRight: [\n {\n offset: 0,\n transform: scales.large,\n },\n {\n offset: 0.4,\n transform: scales.small,\n },\n {\n offset: 0.75,\n transform: scales.xlarge,\n },\n {\n offset: 1,\n transform: scales.large,\n },\n ],\n moveLeft: [\n {\n offset: 0,\n transform: scales.large,\n },\n {\n offset: 0.1,\n transform: scales.xlarge,\n },\n {\n offset: 0.6,\n transform: scales.small,\n },\n {\n offset: 1,\n transform: scales.large,\n },\n ],\n slowly: [\n {\n offset: 0,\n transform: scales.large,\n },\n {\n offset: 0.4,\n transform: scales.medium,\n },\n {\n offset: 1,\n transform: scales.large,\n },\n ],\n }[type];\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"animations.js","names":[],"sources":["../../src/sheets-of-glass/animations.ts"],"sourcesContent":["import type { Animation, AnimationKeyFrames, GestureDetail } from '@ionic/core/components';\nimport { AnimationPosition, EffectScales } from './interfaces';\nimport { createAnimation } from '@ionic/core/components/index.js';\nimport { getStep } from '../utils';\n\n// Work in main/cross-axis coordinates so native horizontal samples also drive the rail.\nexport const animationRect = (element: Element, vertical = false) => {\n const rect = element.getBoundingClientRect();\n return vertical\n ? { left: rect.top, top: rect.left, right: rect.bottom, width: rect.height, height: rect.width, x: rect.y, y: rect.x }\n : rect;\n};\nconst translate = (x: number, y: number, vertical: boolean) => `translate3d(${vertical ? y : x}px, ${vertical ? x : y}px, 0)`;\nconst stretchTransform = (x: number, y: number, vertical: boolean) => `scale(${vertical ? y : x}, ${vertical ? x : y})`;\nconst mainSize = (element: HTMLElement, vertical: boolean) => (vertical ? element.offsetHeight : element.offsetWidth);\nconst axisScale = (transform: string, vertical: boolean) => {\n const matrix = new DOMMatrixReadOnly(transform);\n return vertical ? { a: matrix.d, d: matrix.a } : matrix;\n};\n\nexport const getScaleAnimation = (effectElement: Element): Animation => {\n return createAnimation().addElement(effectElement.shadowRoot!.querySelector<HTMLElement>('[part=\"native\"]')!).easing('ease-out');\n};\n\n// Seconds, center progress, extra width/height (pt), platter expansion progress.\nconst tabBarPressFrames = [\n [0, 0, 0, 0, 0],\n [0.033, 0.091, 4.26, 1.52, 0.148],\n [0.067, 0.312, 13.28, 2.89, 0.46],\n [0.1, 0.551, 21.99, 2.24, 0.752],\n [0.133, 0.736, 25.94, 2.77, 0.951],\n [0.167, 0.858, 24.35, 6.03, 1.052],\n [0.2, 0.932, 22.72, 8.41, 1.081],\n [0.267, 0.985, 21.55, 10.38, 1.058],\n [0.333, 1.003, 17.89, 13.98, 1.01],\n [0.4, 1.015, 13.54, 18.42, 1],\n [0.467, 1.018, 11.3, 20.75, 1],\n [0.6, 1.005, 12.36, 19.72, 1],\n [0.733, 0.993, 14.75, 17.27, 1],\n [0.9, 1, 16, 16, 1],\n];\n\n// Short-tap transfer, measured separately from a held press (seconds, center, width/height deltas).\nconst tabBarTapFrames = [\n [0, 0, 0, 0],\n [0.033, 0.099, 4.15, 2.91],\n [0.067, 0.333, 13.81, 5.59],\n [0.1, 0.589, 23.77, 5.52],\n [0.133, 0.794, 29.84, 4.24],\n [0.167, 0.925, 29.01, 5.83],\n [0.2, 0.992, 26.85, 7.25],\n [0.233, 1.015, 25.83, 7.87],\n [0.267, 1.018, 20.43, 5.56],\n [0.3, 1.018, 12.87, 3.16],\n [0.367, 1.024, 1.3, 2.69],\n [0.433, 1.031, -3.98, 4.1],\n [0.5, 1.027, -5.05, 3.89],\n [0.6, 1.013, -2.95, 2.31],\n [0.7, 1.003, -0.74, 0.59],\n [0.8, 1, 0, 0],\n];\n\n// UITabBarController presentation-layer samples: horizontal stretch precedes vertical stretch.\nexport const createTabBarPressAnimation = (\n effect: HTMLElement,\n from: HTMLElement,\n to: HTMLElement,\n bar: HTMLElement,\n vertical = false,\n): Animation => {\n const box = animationRect(bar, vertical);\n const center = box.left + box.width / 2;\n const left = center - mainSize(bar, vertical) / 2;\n const fromBox = animationRect(from, vertical);\n const toBox = animationRect(to, vertical);\n const parentScale = box.width / mainSize(bar, vertical);\n const buttonScale = axisScale(getComputedStyle(from).transform, vertical);\n const width = fromBox.width / parentScale / buttonScale.a;\n const height = fromBox.height / parentScale / buttonScale.d;\n const start = (fromBox.left + fromBox.width / 2 - box.left) / parentScale;\n const end = (toBox.left + toBox.width / 2 - box.left) / parentScale;\n const selected = from === to;\n const growth = vertical ? 20 / 16 : 1;\n const frames = tabBarPressFrames.map(([time, position, extraWidth, extraHeight, expansion]) => {\n const scale = vertical ? 1 : 1 + (14.14 / mainSize(bar, vertical)) * expansion;\n // A selected item expands in place, without the transfer's sideways deformation.\n const press = 1 - Math.exp(-18 * time) * (1 + 18 * time);\n return {\n offset: time / 0.9,\n x: center + (left + start + (end - start) * position - center) * scale - width / 2,\n sx: ((width + (selected ? 16 * press : extraWidth) * growth) * scale) / width,\n sy: ((height + (selected ? 16 * press : extraHeight) * growth) * scale) / height,\n };\n });\n const move = createAnimation()\n .addElement(effect)\n .beforeStyles({\n width: `${vertical ? height : width}px`,\n height: `${vertical ? width : height}px`,\n display: 'block',\n opacity: '1',\n })\n .keyframes(frames.map(({ offset, x }) => ({ offset, transform: translate(x, box.top + box.height / 2 - height / 2, vertical) })));\n const stretch = getScaleAnimation(effect)\n .easing('linear')\n .keyframes(frames.map(({ offset, sx, sy }) => ({ offset, transform: stretchTransform(sx, sy, vertical) })));\n return createAnimation().duration(900).easing('linear').addAnimation([move, stretch]);\n};\n\n// Drag samples: faster movement stretches sideways, then rebounds vertically at rest.\nexport const createTabBarDragAnimation = (effect: HTMLElement, bar: HTMLElement, velocity: number, vertical = false): Animation => {\n const native = effect.shadowRoot!.querySelector<HTMLElement>('[part=\"native\"]')!;\n const current = axisScale(native.style.transform || getComputedStyle(native).transform, vertical);\n const { width, height } = animationRect(effect, vertical);\n const scale = vertical ? 1 : 1 + 14.14 / mainSize(bar, vertical);\n const restX = ((width + (vertical ? 20 : 16)) * scale) / width;\n const restY = ((height + (vertical ? 20 : 16)) * scale) / height;\n // Approximate the 100/600pt/s UIKit samples; keep deformation bounded for fast swipes.\n const stretch = Math.min(16, 32 * velocity * velocity) * scale;\n const rebound = Math.max(stretch, (current.a - restX) * width) * 0.8;\n return getScaleAnimation(effect)\n .duration(500)\n .easing('linear')\n .keyframes([\n { offset: 0, transform: stretchTransform(current.a, current.d, vertical) },\n { offset: 0.2, transform: stretchTransform(restX + stretch / width, restY - stretch / height, vertical) },\n { offset: 0.44, transform: stretchTransform(restX - rebound / width, restY + rebound / height, vertical) },\n { offset: 1, transform: stretchTransform(restX, restY, vertical) },\n ]);\n};\n\n// UITabBarController release samples: return to rest with a small undershoot.\nexport const createTabBarReleaseAnimation = (\n effectElement: Element,\n target: HTMLElement,\n tap?: { elapsed: number; distance: number },\n vertical = false,\n): Animation => {\n const tapElapsed = tap?.elapsed;\n const native = effectElement.shadowRoot!.querySelector<HTMLElement>('[part=\"native\"]')!;\n const scale = axisScale(native.style.transform || getComputedStyle(native).transform, vertical);\n const samples = [\n [0, 1],\n [0.033, 0.85],\n [0.067, 0.58],\n [0.1, 0.31],\n [0.133, 0.15],\n [0.167, 0.055],\n [0.2, 0.01],\n [0.267, -0.01],\n [0.367, -0.004],\n [0.45, 0],\n ];\n const bar = target.parentElement!;\n const box = animationRect(bar, vertical);\n const current = animationRect(effectElement, vertical);\n const targetBox = animationRect(target, vertical);\n const center = box.left + box.width / 2;\n const x = center + (targetBox.left + targetBox.width / 2 - center) / (box.width / mainSize(bar, vertical)) - current.width / 2;\n const y = box.top + box.height / 2 - current.height / 2;\n // The vertical platter contracts from 64pt items to 44 × 58pt on release.\n const endScaleX = vertical ? target.offsetHeight / current.width : 1;\n const endScaleY = vertical ? target.offsetWidth / current.height : 1;\n const elapsed = (tapElapsed ?? 0) / 1000;\n const duration = tapElapsed === undefined ? 450 : 800 - tapElapsed;\n let frames = samples.map(([time, remaining]) => ({\n offset: time / 0.45,\n x: x + (current.x - x) * remaining,\n y: y + (current.y - y) * remaining,\n sx: endScaleX + (scale.a - endScaleX) * remaining,\n sy: endScaleY + (scale.d - endScaleY) * remaining,\n }));\n if (tapElapsed !== undefined && !vertical) {\n const nextIndex = tabBarTapFrames.findIndex(([time]) => time > elapsed);\n const previous = tabBarTapFrames[Math.max(0, nextIndex - 1)];\n const next = tabBarTapFrames[nextIndex];\n const progress = previous[1] + ((next[1] - previous[1]) * (elapsed - previous[0])) / (next[0] - previous[0]);\n // The late squeeze grows with travel (adjacent and three-item UIKit samples).\n const extraDistance = Math.max(0, tap!.distance - 1);\n // Start at the rendered press, not a recomputed rectangle, to avoid a release-frame jump.\n frames = [\n { offset: 0, x: current.x, y: current.y, sx: scale.a, sy: scale.d },\n ...tabBarTapFrames.slice(nextIndex).map(([time, position, width, height]) => ({\n offset: (time - elapsed) / (0.8 - elapsed),\n x: x + ((current.x - x) * (1 - position)) / Math.max(0.1, 1 - progress),\n y: y + ((current.y - y) * (1 - position)) / Math.max(0.1, 1 - progress),\n sx: 1 + (width * (time >= 0.367 ? 1 + 0.75 * extraDistance : 1)) / current.width,\n sy: 1 + (height * (time >= 0.367 ? 1 + 0.5 * extraDistance : 1)) / current.height,\n })),\n ];\n }\n const stretch = createAnimation()\n .addElement(native)\n .duration(duration)\n .easing('linear')\n .keyframes(frames.map(({ offset, sx, sy }) => ({ offset, transform: stretchTransform(sx, sy, vertical) })));\n const move = createAnimation()\n .addElement(effectElement)\n .duration(duration)\n .easing('linear')\n .keyframes(\n frames.map(({ offset, x, y }) => ({\n offset,\n transform: translate(x, y, vertical),\n })),\n );\n // Blend the reflective lens into the selected surface during the final 200ms.\n const offset = 1 - 200 / duration;\n const selectedBackground =\n 'var(--ios27-tab-selected-background, rgba(var(--ios-theme-button-color-selected-rgb, var(--ios26-button-color-selected-rgb, var(--ios27-button-color-selected-default-rgb))), 0.095))';\n const glass = createAnimation()\n .addElement(effectElement)\n .easing('linear')\n .keyframes([\n { offset: 0, opacity: 1 },\n { offset, opacity: 1 },\n { offset: 1, opacity: 0 },\n ]);\n const selected = createAnimation()\n .addElement(target.shadowRoot!.querySelector<HTMLElement>('[part=\"native\"]')!)\n .easing('linear')\n .keyframes([\n { offset: 0, backgroundColor: 'transparent' },\n { offset, backgroundColor: 'transparent' },\n { offset: 1, backgroundColor: selectedBackground },\n ]);\n const release = createAnimation().duration(duration).addAnimation([stretch, move, glass, selected]);\n if (tapElapsed !== undefined && !vertical) {\n // A short UIKit tap keeps expanding after lift-off, then settles independently of the lens.\n // Width deltas from the 50ms tap; preserve the rendered size for an uninterrupted handoff.\n const width = mainSize(bar, vertical);\n const expansion = box.width - width;\n const peak = Math.max(8.65, expansion);\n const platter = createAnimation()\n .addElement(bar)\n .easing('linear')\n .keyframes(\n [\n [0, expansion],\n [17, expansion + (peak - expansion) * 0.503],\n [34, expansion + (peak - expansion) * 0.868],\n [50, peak],\n [67, peak * (8.46 / 8.65)],\n [83, peak * (7.73 / 8.65)],\n [100, peak * (6.66 / 8.65)],\n [117, peak * (5.44 / 8.65)],\n [134, peak * (4.19 / 8.65)],\n [150, peak * (3 / 8.65)],\n [167, peak * (1.97 / 8.65)],\n [184, peak * (1.09 / 8.65)],\n [200, peak * (0.39 / 8.65)],\n [217, 0],\n [234, peak * (-0.48 / 8.65)],\n [250, peak * (-0.7 / 8.65)],\n [267, peak * (-0.8 / 8.65)],\n [283, peak * (-0.82 / 8.65)],\n [300, peak * (-0.77 / 8.65)],\n [317, peak * (-0.68 / 8.65)],\n [334, peak * (-0.57 / 8.65)],\n [350, peak * (-0.46 / 8.65)],\n [383, peak * (-0.14 / 8.65)],\n [417, 0],\n [duration, 0],\n ].map(([time, extra]) => ({ offset: time / duration, transform: `scale(${1 + extra / width}) translateZ(0)` })),\n );\n release.addAnimation(platter);\n }\n return release;\n};\n\nexport const createPreMoveAnimation = (\n effectElement: Element,\n tabSelectedElement: Element,\n currentTouchedElement: Element,\n animationPosition: AnimationPosition,\n): Animation => {\n const diff = Math.max(\n Math.abs(tabSelectedElement.getBoundingClientRect().left - currentTouchedElement.getBoundingClientRect().left),\n 140,\n );\n return createAnimation()\n .duration(diff * 2.1)\n .easing('ease-out')\n .addElement(effectElement)\n .beforeStyles({\n width: `${tabSelectedElement.clientWidth}px`,\n height: `${tabSelectedElement.clientHeight}px`,\n display: 'block',\n opacity: '1',\n transform: 'none',\n })\n .keyframes([\n {\n offset: 0,\n transform: `translate3d(${tabSelectedElement.getBoundingClientRect().left}px, ${animationPosition.positionY}px, 0)`,\n },\n {\n offset: 1,\n transform: `translate3d(${currentTouchedElement.getBoundingClientRect().left}px, ${animationPosition.positionY}px, 0)`,\n },\n ]);\n};\n\nexport const createMoveAnimation = (\n effectElement: Element,\n detail: GestureDetail,\n tabSelectedElement: Element,\n animationPosition: AnimationPosition,\n vertical = false,\n): Animation => {\n return createAnimation()\n .duration(500)\n .addElement(effectElement)\n .beforeStyles({\n width: `${tabSelectedElement.clientWidth}px`,\n height: `${tabSelectedElement.clientHeight}px`,\n display: 'block',\n opacity: '1',\n transform: 'none',\n })\n .fromTo(\n 'transform',\n translate(animationPosition.minPositionX, animationPosition.positionY, vertical),\n translate(animationPosition.maxPositionX, animationPosition.positionY, vertical),\n )\n .progressStep(getStep(detail.currentX, animationPosition));\n};\n\nexport const getMoveAnimationKeyframe = (type: 'moveRight' | 'moveLeft' | 'slowly', scales: EffectScales): AnimationKeyFrames => {\n return {\n moveRight: [\n {\n offset: 0,\n transform: scales.large,\n },\n {\n offset: 0.4,\n transform: scales.small,\n },\n {\n offset: 0.75,\n transform: scales.xlarge,\n },\n {\n offset: 1,\n transform: scales.large,\n },\n ],\n moveLeft: [\n {\n offset: 0,\n transform: scales.large,\n },\n {\n offset: 0.1,\n transform: scales.xlarge,\n },\n {\n offset: 0.6,\n transform: scales.small,\n },\n {\n offset: 1,\n transform: scales.large,\n },\n ],\n slowly: [\n {\n offset: 0,\n transform: scales.large,\n },\n {\n offset: 0.4,\n transform: scales.medium,\n },\n {\n offset: 1,\n transform: scales.large,\n },\n ],\n }[type];\n};\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { changeSelectedElement, cloneElement, getStep } from "../utils.js";
2
2
  import { isNativeUIShell } from "../native-integration/index.js";
3
3
  import { animationRect, createMoveAnimation, createPreMoveAnimation, createTabBarDragAnimation, createTabBarPressAnimation, createTabBarReleaseAnimation, getMoveAnimationKeyframe, getScaleAnimation } from "./animations.js";
4
- import { createGesture } from "@ionic/core";
4
+ import { createGesture } from "@ionic/core/components/index.js";
5
5
  //#region src/sheets-of-glass/index.ts
6
6
  const GESTURE_NAME = "ios27-enable-gesture";
7
7
  const ANIMATED_NAME = "ios27-animated";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/sheets-of-glass/index.ts"],"sourcesContent":["import { AnimationPosition, EffectScales, registeredEffect } from './interfaces';\nimport { createAnimation, createGesture } from '@ionic/core';\nimport type { Animation, Gesture, GestureDetail } from '@ionic/core';\nimport { changeSelectedElement, cloneElement, getStep } from '../utils';\nimport { isNativeUIShell } from '../native-integration';\nimport {\n animationRect,\n createMoveAnimation,\n createPreMoveAnimation,\n createTabBarDragAnimation,\n createTabBarPressAnimation,\n createTabBarReleaseAnimation,\n getMoveAnimationKeyframe,\n getScaleAnimation,\n} from './animations';\n\nconst GESTURE_NAME = 'ios27-enable-gesture';\nconst ANIMATED_NAME = 'ios27-animated';\n\nexport const registerEffect = (\n targetElement: HTMLElement,\n effectTagName: string,\n selectedClassName: string,\n scales: EffectScales,\n vertical = false,\n): registeredEffect | undefined => {\n if (!targetElement.classList.contains('ios')) {\n return undefined;\n }\n\n let gesture!: Gesture;\n let moveAnimation: Animation | undefined;\n let currentTouchedElement: HTMLElement | undefined;\n let selectedElementBeforeGesture: HTMLElement | undefined;\n let clearActivatedTimer: ReturnType<typeof setTimeout> | undefined;\n let animationPosition: AnimationPosition | undefined = undefined;\n let scaleAnimationPromise: Promise<void> | undefined;\n let startAnimationPromise: Promise<void> | undefined;\n let maxVelocity = 0;\n let releaseAnimation: Animation | undefined;\n let tabPressAnimation: Animation | undefined;\n let tabPressStartedAt = 0;\n let tabDragging = false;\n let destroyed = false;\n const originalTabBarScale = targetElement.style.getPropertyValue('--ios27-tab-bar-scale');\n const effectElement = cloneElement(effectTagName, false);\n if (vertical) effectElement.classList.add('ios27-vertical-tab-effect');\n const stopTabPress = () => {\n if (!tabPressAnimation) return;\n const native = effectElement.shadowRoot!.querySelector<HTMLElement>('[part=\"native\"]')!;\n const transform = getComputedStyle(effectElement).transform;\n const scale = getComputedStyle(native).transform;\n tabPressAnimation.destroy();\n tabPressAnimation = undefined;\n effectElement.style.transform = transform;\n native.style.transform = scale;\n };\n let onPointerUp: (() => void) | undefined;\n let onPointerCancel: (() => void) | undefined;\n\n const removePointerEndListeners = () => {\n if (onPointerUp) {\n document.removeEventListener('pointerup', onPointerUp);\n onPointerUp = undefined;\n }\n if (onPointerCancel) {\n document.removeEventListener('pointercancel', onPointerCancel);\n onPointerCancel = undefined;\n }\n };\n\n const cancelActiveGesture = () => {\n stopTabPress();\n releaseAnimation?.destroy();\n releaseAnimation = undefined;\n removePointerEndListeners();\n if (clearActivatedTimer !== undefined) {\n clearTimeout(clearActivatedTimer);\n clearActivatedTimer = undefined;\n }\n currentTouchedElement?.classList.remove('ion-activated');\n // Preserve a committed selection, or restore the original if the press was cancelled.\n if (!currentTouchedElement?.classList.contains(selectedClassName)) {\n selectedElementBeforeGesture?.classList.add(selectedClassName);\n }\n currentTouchedElement = undefined;\n selectedElementBeforeGesture = undefined;\n moveAnimation?.destroy();\n moveAnimation = undefined;\n effectElement.style.display = 'none';\n maxVelocity = 0;\n targetElement.classList.remove(ANIMATED_NAME);\n };\n\n /**\n * These event listeners fix a bug where gestures don't complete properly.\n * They terminate the gesture using native events as a fallback.\n */\n const onPointerDown = (event: PointerEvent) => {\n if (isNativeUIShell(targetElement)) return;\n stopTabPress();\n tabDragging = false;\n releaseAnimation?.destroy();\n releaseAnimation = undefined;\n clearActivated();\n gesture.destroy();\n createAnimationGesture();\n removePointerEndListeners();\n onPointerUp = () => {\n clearActivatedTimer = setTimeout(async () => {\n await onEndGesture();\n if (destroyed) return;\n gesture.destroy();\n createAnimationGesture();\n });\n removePointerEndListeners();\n };\n onPointerCancel = () => {\n cancelActiveGesture();\n gesture.destroy();\n createAnimationGesture();\n };\n document.addEventListener('pointerup', onPointerUp);\n document.addEventListener('pointercancel', onPointerCancel);\n };\n targetElement.addEventListener('pointerdown', onPointerDown);\n const onClick = (event: MouseEvent) => {\n // A drag commits its destination itself; the browser may click the old pressed tab.\n if (vertical && tabDragging && event.isTrusted && event.detail > 0) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n };\n targetElement.addEventListener('click', onClick, true);\n\n const axisDetail = (detail: GestureDetail): GestureDetail =>\n vertical\n ? {\n ...detail,\n currentX: detail.currentY,\n currentY: detail.currentX,\n startX: detail.startY,\n startY: detail.startX,\n velocityX: detail.velocityY,\n velocityY: detail.velocityX,\n }\n : detail;\n const createAnimationGesture = () => {\n targetElement.classList.add(GESTURE_NAME);\n gesture = createGesture({\n el: targetElement,\n threshold: 0,\n direction: vertical ? 'y' : 'x',\n gestureName: `${GESTURE_NAME}_${effectTagName}_${crypto.randomUUID()}`,\n onStart: (event) => onStartGesture(axisDetail(event)),\n onMove: (event) => onMoveGesture(axisDetail(event)),\n onEnd: (detail) => {\n // Ionic coalesces moves; consume the release coordinate before committing a drag.\n if (effectTagName === 'ion-tab-button' && tabDragging) onMoveGesture(axisDetail(detail));\n onEndGesture().then();\n },\n });\n gesture.enable(true);\n };\n createAnimationGesture();\n\n const clearActivated = (isEndGesture: boolean = false) => {\n if (!currentTouchedElement) {\n return;\n }\n if (!isEndGesture && !currentTouchedElement.classList.contains(selectedClassName)) {\n currentTouchedElement!.click();\n currentTouchedElement.classList.add(selectedClassName);\n }\n currentTouchedElement.classList.remove('ion-activated');\n currentTouchedElement = undefined;\n selectedElementBeforeGesture = undefined;\n effectElement.style.display = 'none';\n maxVelocity = 0;\n targetElement.classList.remove(ANIMATED_NAME);\n };\n\n const onStartGesture = (detail: GestureDetail): boolean | undefined => {\n if (isNativeUIShell(targetElement)) return false;\n currentTouchedElement = ((detail.event.target as HTMLElement).closest(effectTagName) as HTMLElement) || undefined;\n const tabSelectedElement = targetElement.querySelector(`${effectTagName}.${selectedClassName}`);\n if (\n currentTouchedElement === undefined ||\n currentTouchedElement.parentElement !== targetElement ||\n (currentTouchedElement as HTMLIonTabButtonElement).disabled ||\n tabSelectedElement === null\n ) {\n currentTouchedElement = undefined;\n return false;\n }\n selectedElementBeforeGesture = tabSelectedElement as HTMLElement;\n if (effectTagName === 'ion-tab-button') {\n // UIKit expands the platter by 14.14pt at both two- and four-tab widths.\n targetElement.style.setProperty(\n '--ios27-tab-bar-scale',\n String(1 + 14.14 / (vertical ? targetElement.offsetHeight : targetElement.offsetWidth)),\n );\n }\n if (vertical) targetElement.classList.add(ANIMATED_NAME);\n animationPosition = {\n minPositionX: animationRect(targetElement, vertical).left,\n maxPositionX:\n animationRect(targetElement, vertical).right - (vertical ? tabSelectedElement.clientHeight : tabSelectedElement.clientWidth),\n width: vertical ? tabSelectedElement.clientHeight : tabSelectedElement.clientWidth,\n positionY: animationRect(tabSelectedElement, vertical).top,\n };\n targetElement.classList.add(ANIMATED_NAME);\n changeSelectedElement(targetElement, currentTouchedElement, effectTagName, selectedClassName);\n\n if (effectTagName === 'ion-tab-button') {\n moveAnimation = createMoveAnimation(effectElement, detail, tabSelectedElement, animationPosition, vertical);\n moveAnimation.progressStart(\n true,\n getStep(\n animationRect(tabSelectedElement, vertical).left + animationRect(tabSelectedElement, vertical).width / 2,\n animationPosition,\n ),\n );\n tabPressAnimation = createTabBarPressAnimation(\n effectElement,\n tabSelectedElement as HTMLElement,\n currentTouchedElement,\n targetElement,\n vertical,\n );\n tabPressStartedAt = performance.now();\n void tabPressAnimation.play();\n return true;\n }\n\n const startAnimation = (() => {\n if (tabSelectedElement === currentTouchedElement) {\n return new Promise<void>((resolve) => resolve());\n } else {\n const preMoveAnimation = createPreMoveAnimation(effectElement, tabSelectedElement, currentTouchedElement, animationPosition!);\n return preMoveAnimation.play().finally(() => preMoveAnimation.destroy());\n }\n })();\n startAnimationPromise = startAnimation;\n startAnimation.then(() => {\n if (!currentTouchedElement) {\n return;\n }\n moveAnimation = createMoveAnimation(effectElement, detail, tabSelectedElement, animationPosition!);\n moveAnimation.progressStart(\n true,\n getStep(currentTouchedElement.getBoundingClientRect().left + currentTouchedElement.clientWidth / 2, animationPosition!),\n );\n });\n getScaleAnimation(effectElement).duration(200).to('opacity', 1).to('transform', scales.large).play();\n return true;\n };\n\n const onMoveGesture = (detail: GestureDetail): boolean | undefined => {\n if (currentTouchedElement === undefined || !moveAnimation || releaseAnimation) {\n return false; // Skip Animation\n }\n if (effectTagName === 'ion-tab-button') {\n if (Math.abs(detail.currentX - detail.startX) < 3 && !tabDragging) return;\n tabDragging = true;\n stopTabPress();\n tabPressAnimation = createTabBarDragAnimation(effectElement, targetElement, detail.velocityX, vertical);\n void tabPressAnimation.play();\n } else if (scaleAnimationPromise === undefined) {\n if (Math.abs(detail.velocityX) > maxVelocity) {\n maxVelocity = Math.abs(detail.velocityX);\n }\n if (Math.abs(detail.velocityX) > 0.2) {\n scaleAnimationPromise = getScaleAnimation(effectElement)\n .duration(720)\n .keyframes(getMoveAnimationKeyframe('slowly', scales))\n .play()\n .finally(() => (scaleAnimationPromise = undefined));\n }\n if (maxVelocity > 0.2 && Math.abs(detail.velocityX) < 0.15 && Math.abs(detail.startX - detail.currentX) > 100) {\n scaleAnimationPromise = getScaleAnimation(effectElement)\n .duration(720)\n .keyframes(getMoveAnimationKeyframe(detail.velocityX > 0 ? 'moveRight' : 'moveLeft', scales))\n .play()\n .finally(() => (scaleAnimationPromise = undefined));\n maxVelocity = 0;\n }\n }\n\n const currentX = detail.currentX;\n const previousY = animationRect(targetElement, vertical).top + animationRect(targetElement, vertical).height / 2;\n const nextEl = (targetElement.getRootNode() as Document | ShadowRoot).elementFromPoint(\n vertical ? previousY : currentX,\n vertical ? currentX : previousY,\n );\n let latestTouchedElement: HTMLElement | undefined = (nextEl?.closest(effectTagName) as HTMLElement) || undefined;\n if (vertical && effectTagName === 'ion-tab-button') {\n // Overlapping, scaled tabs must not steal a drag from their neighbor.\n const bar = targetElement.getBoundingClientRect();\n const tabs = Array.from(targetElement.querySelectorAll<HTMLElement>(effectTagName)).filter((tab) => tab.offsetWidth > 0);\n const distance = (tab: HTMLElement) => Math.abs(currentX - (bar.top + tab.offsetTop + tab.offsetHeight / 2));\n latestTouchedElement =\n currentX >= bar.top && currentX <= bar.bottom\n ? tabs.reduce<HTMLElement | undefined>(\n (closest, tab) => (!closest || distance(tab) < distance(closest) ? tab : closest),\n undefined,\n )\n : undefined;\n }\n\n if (\n latestTouchedElement &&\n latestTouchedElement.parentElement === targetElement &&\n !(latestTouchedElement as HTMLIonTabButtonElement).disabled &&\n currentTouchedElement !== latestTouchedElement\n ) {\n currentTouchedElement = latestTouchedElement;\n changeSelectedElement(targetElement, currentTouchedElement, effectTagName, selectedClassName);\n }\n moveAnimation.progressStep(getStep(detail.currentX, animationPosition!));\n return true;\n };\n\n const onEndGesture = async (): Promise<boolean | undefined> => {\n if (releaseAnimation) return;\n // タイマーをクリア(正常にonEndGestureが実行された場合)\n if (clearActivatedTimer !== undefined) {\n clearTimeout(clearActivatedTimer);\n clearActivatedTimer = undefined;\n }\n\n if (currentTouchedElement && !currentTouchedElement.classList.contains(selectedClassName)) {\n currentTouchedElement.click();\n currentTouchedElement.classList.add(selectedClassName);\n }\n\n if (startAnimationPromise) {\n await startAnimationPromise;\n }\n\n const tapElapsed =\n tabPressAnimation && !tabDragging && selectedElementBeforeGesture !== currentTouchedElement\n ? performance.now() - tabPressStartedAt\n : undefined;\n if (tabPressAnimation && !tabDragging && tapElapsed === undefined) {\n // A quick tap still completes the initial stretch before relaxing.\n const pressing = tabPressAnimation;\n const remaining = 200 - (performance.now() - tabPressStartedAt);\n if (remaining > 0) await new Promise<void>((resolve) => setTimeout(resolve, remaining));\n if (tabPressAnimation !== pressing) return;\n }\n\n if (currentTouchedElement === undefined || !moveAnimation || releaseAnimation) {\n return false;\n }\n\n if (effectTagName !== 'ion-tab-button')\n setTimeout(() => {\n if (!currentTouchedElement) {\n return;\n }\n const targetX = currentTouchedElement.getBoundingClientRect().left + currentTouchedElement.clientWidth / 2;\n const step = getStep(targetX, animationPosition!);\n moveAnimation!.progressStep(step);\n });\n if (effectTagName === 'ion-tab-button') {\n stopTabPress();\n moveAnimation.destroy();\n moveAnimation = undefined;\n const tabs = Array.from(targetElement.querySelectorAll<HTMLElement>(effectTagName)).filter((tab) => tab.offsetWidth > 0);\n if (vertical) {\n currentTouchedElement.classList.remove('ion-activated');\n targetElement.classList.remove(ANIMATED_NAME);\n }\n const releasing = createTabBarReleaseAnimation(\n effectElement,\n currentTouchedElement,\n tapElapsed !== undefined && tapElapsed < 200\n ? {\n elapsed: tapElapsed,\n distance: Math.abs(tabs.indexOf(currentTouchedElement) - tabs.indexOf(selectedElementBeforeGesture!)),\n }\n : undefined,\n vertical,\n );\n currentTouchedElement.classList.remove('ion-activated');\n releaseAnimation = releasing;\n await releasing.play();\n if (releaseAnimation !== releasing) return;\n clearActivated(true);\n releasing.destroy();\n releaseAnimation = undefined;\n } else {\n await getScaleAnimation(effectElement).duration(120).to('transform', `scale(1, 0.92)`).play();\n }\n moveAnimation?.destroy();\n\n clearActivated(true);\n return true;\n };\n\n const nativeChanged = () => {\n gesture.enable(!isNativeUIShell(targetElement));\n cancelActiveGesture();\n };\n targetElement.addEventListener('nativeUIShellChange', nativeChanged);\n if (isNativeUIShell(targetElement)) nativeChanged();\n\n return {\n destroy: () => {\n destroyed = true;\n cancelActiveGesture();\n // Remove event listeners\n targetElement.removeEventListener('pointerdown', onPointerDown);\n targetElement.removeEventListener('click', onClick, true);\n targetElement.removeEventListener('nativeUIShellChange', nativeChanged);\n\n // Destroy gesture\n if (gesture) {\n gesture.destroy();\n }\n // Remove gesture class\n targetElement.classList.remove(GESTURE_NAME);\n effectElement.remove();\n if (effectTagName === 'ion-tab-button') {\n if (originalTabBarScale) targetElement.style.setProperty('--ios27-tab-bar-scale', originalTabBarScale);\n else targetElement.style.removeProperty('--ios27-tab-bar-scale');\n }\n },\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/sheets-of-glass/index.ts"],"sourcesContent":["import { AnimationPosition, EffectScales, registeredEffect } from './interfaces';\nimport { createAnimation, createGesture } from '@ionic/core/components/index.js';\nimport type { Animation, Gesture, GestureDetail } from '@ionic/core/components';\nimport { changeSelectedElement, cloneElement, getStep } from '../utils';\nimport { isNativeUIShell } from '../native-integration';\nimport {\n animationRect,\n createMoveAnimation,\n createPreMoveAnimation,\n createTabBarDragAnimation,\n createTabBarPressAnimation,\n createTabBarReleaseAnimation,\n getMoveAnimationKeyframe,\n getScaleAnimation,\n} from './animations';\n\nconst GESTURE_NAME = 'ios27-enable-gesture';\nconst ANIMATED_NAME = 'ios27-animated';\n\nexport const registerEffect = (\n targetElement: HTMLElement,\n effectTagName: string,\n selectedClassName: string,\n scales: EffectScales,\n vertical = false,\n): registeredEffect | undefined => {\n if (!targetElement.classList.contains('ios')) {\n return undefined;\n }\n\n let gesture!: Gesture;\n let moveAnimation: Animation | undefined;\n let currentTouchedElement: HTMLElement | undefined;\n let selectedElementBeforeGesture: HTMLElement | undefined;\n let clearActivatedTimer: ReturnType<typeof setTimeout> | undefined;\n let animationPosition: AnimationPosition | undefined = undefined;\n let scaleAnimationPromise: Promise<void> | undefined;\n let startAnimationPromise: Promise<void> | undefined;\n let maxVelocity = 0;\n let releaseAnimation: Animation | undefined;\n let tabPressAnimation: Animation | undefined;\n let tabPressStartedAt = 0;\n let tabDragging = false;\n let destroyed = false;\n const originalTabBarScale = targetElement.style.getPropertyValue('--ios27-tab-bar-scale');\n const effectElement = cloneElement(effectTagName, false);\n if (vertical) effectElement.classList.add('ios27-vertical-tab-effect');\n const stopTabPress = () => {\n if (!tabPressAnimation) return;\n const native = effectElement.shadowRoot!.querySelector<HTMLElement>('[part=\"native\"]')!;\n const transform = getComputedStyle(effectElement).transform;\n const scale = getComputedStyle(native).transform;\n tabPressAnimation.destroy();\n tabPressAnimation = undefined;\n effectElement.style.transform = transform;\n native.style.transform = scale;\n };\n let onPointerUp: (() => void) | undefined;\n let onPointerCancel: (() => void) | undefined;\n\n const removePointerEndListeners = () => {\n if (onPointerUp) {\n document.removeEventListener('pointerup', onPointerUp);\n onPointerUp = undefined;\n }\n if (onPointerCancel) {\n document.removeEventListener('pointercancel', onPointerCancel);\n onPointerCancel = undefined;\n }\n };\n\n const cancelActiveGesture = () => {\n stopTabPress();\n releaseAnimation?.destroy();\n releaseAnimation = undefined;\n removePointerEndListeners();\n if (clearActivatedTimer !== undefined) {\n clearTimeout(clearActivatedTimer);\n clearActivatedTimer = undefined;\n }\n currentTouchedElement?.classList.remove('ion-activated');\n // Preserve a committed selection, or restore the original if the press was cancelled.\n if (!currentTouchedElement?.classList.contains(selectedClassName)) {\n selectedElementBeforeGesture?.classList.add(selectedClassName);\n }\n currentTouchedElement = undefined;\n selectedElementBeforeGesture = undefined;\n moveAnimation?.destroy();\n moveAnimation = undefined;\n effectElement.style.display = 'none';\n maxVelocity = 0;\n targetElement.classList.remove(ANIMATED_NAME);\n };\n\n /**\n * These event listeners fix a bug where gestures don't complete properly.\n * They terminate the gesture using native events as a fallback.\n */\n const onPointerDown = (event: PointerEvent) => {\n if (isNativeUIShell(targetElement)) return;\n stopTabPress();\n tabDragging = false;\n releaseAnimation?.destroy();\n releaseAnimation = undefined;\n clearActivated();\n gesture.destroy();\n createAnimationGesture();\n removePointerEndListeners();\n onPointerUp = () => {\n clearActivatedTimer = setTimeout(async () => {\n await onEndGesture();\n if (destroyed) return;\n gesture.destroy();\n createAnimationGesture();\n });\n removePointerEndListeners();\n };\n onPointerCancel = () => {\n cancelActiveGesture();\n gesture.destroy();\n createAnimationGesture();\n };\n document.addEventListener('pointerup', onPointerUp);\n document.addEventListener('pointercancel', onPointerCancel);\n };\n targetElement.addEventListener('pointerdown', onPointerDown);\n const onClick = (event: MouseEvent) => {\n // A drag commits its destination itself; the browser may click the old pressed tab.\n if (vertical && tabDragging && event.isTrusted && event.detail > 0) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n };\n targetElement.addEventListener('click', onClick, true);\n\n const axisDetail = (detail: GestureDetail): GestureDetail =>\n vertical\n ? {\n ...detail,\n currentX: detail.currentY,\n currentY: detail.currentX,\n startX: detail.startY,\n startY: detail.startX,\n velocityX: detail.velocityY,\n velocityY: detail.velocityX,\n }\n : detail;\n const createAnimationGesture = () => {\n targetElement.classList.add(GESTURE_NAME);\n gesture = createGesture({\n el: targetElement,\n threshold: 0,\n direction: vertical ? 'y' : 'x',\n gestureName: `${GESTURE_NAME}_${effectTagName}_${crypto.randomUUID()}`,\n onStart: (event) => onStartGesture(axisDetail(event)),\n onMove: (event) => onMoveGesture(axisDetail(event)),\n onEnd: (detail) => {\n // Ionic coalesces moves; consume the release coordinate before committing a drag.\n if (effectTagName === 'ion-tab-button' && tabDragging) onMoveGesture(axisDetail(detail));\n onEndGesture().then();\n },\n });\n gesture.enable(true);\n };\n createAnimationGesture();\n\n const clearActivated = (isEndGesture: boolean = false) => {\n if (!currentTouchedElement) {\n return;\n }\n if (!isEndGesture && !currentTouchedElement.classList.contains(selectedClassName)) {\n currentTouchedElement!.click();\n currentTouchedElement.classList.add(selectedClassName);\n }\n currentTouchedElement.classList.remove('ion-activated');\n currentTouchedElement = undefined;\n selectedElementBeforeGesture = undefined;\n effectElement.style.display = 'none';\n maxVelocity = 0;\n targetElement.classList.remove(ANIMATED_NAME);\n };\n\n const onStartGesture = (detail: GestureDetail): boolean | undefined => {\n if (isNativeUIShell(targetElement)) return false;\n currentTouchedElement = ((detail.event.target as HTMLElement).closest(effectTagName) as HTMLElement) || undefined;\n const tabSelectedElement = targetElement.querySelector(`${effectTagName}.${selectedClassName}`);\n if (\n currentTouchedElement === undefined ||\n currentTouchedElement.parentElement !== targetElement ||\n (currentTouchedElement as HTMLIonTabButtonElement).disabled ||\n tabSelectedElement === null\n ) {\n currentTouchedElement = undefined;\n return false;\n }\n selectedElementBeforeGesture = tabSelectedElement as HTMLElement;\n if (effectTagName === 'ion-tab-button') {\n // UIKit expands the platter by 14.14pt at both two- and four-tab widths.\n targetElement.style.setProperty(\n '--ios27-tab-bar-scale',\n String(1 + 14.14 / (vertical ? targetElement.offsetHeight : targetElement.offsetWidth)),\n );\n }\n if (vertical) targetElement.classList.add(ANIMATED_NAME);\n animationPosition = {\n minPositionX: animationRect(targetElement, vertical).left,\n maxPositionX:\n animationRect(targetElement, vertical).right - (vertical ? tabSelectedElement.clientHeight : tabSelectedElement.clientWidth),\n width: vertical ? tabSelectedElement.clientHeight : tabSelectedElement.clientWidth,\n positionY: animationRect(tabSelectedElement, vertical).top,\n };\n targetElement.classList.add(ANIMATED_NAME);\n changeSelectedElement(targetElement, currentTouchedElement, effectTagName, selectedClassName);\n\n if (effectTagName === 'ion-tab-button') {\n moveAnimation = createMoveAnimation(effectElement, detail, tabSelectedElement, animationPosition, vertical);\n moveAnimation.progressStart(\n true,\n getStep(\n animationRect(tabSelectedElement, vertical).left + animationRect(tabSelectedElement, vertical).width / 2,\n animationPosition,\n ),\n );\n tabPressAnimation = createTabBarPressAnimation(\n effectElement,\n tabSelectedElement as HTMLElement,\n currentTouchedElement,\n targetElement,\n vertical,\n );\n tabPressStartedAt = performance.now();\n void tabPressAnimation.play();\n return true;\n }\n\n const startAnimation = (() => {\n if (tabSelectedElement === currentTouchedElement) {\n return new Promise<void>((resolve) => resolve());\n } else {\n const preMoveAnimation = createPreMoveAnimation(effectElement, tabSelectedElement, currentTouchedElement, animationPosition!);\n return preMoveAnimation.play().finally(() => preMoveAnimation.destroy());\n }\n })();\n startAnimationPromise = startAnimation;\n startAnimation.then(() => {\n if (!currentTouchedElement) {\n return;\n }\n moveAnimation = createMoveAnimation(effectElement, detail, tabSelectedElement, animationPosition!);\n moveAnimation.progressStart(\n true,\n getStep(currentTouchedElement.getBoundingClientRect().left + currentTouchedElement.clientWidth / 2, animationPosition!),\n );\n });\n getScaleAnimation(effectElement).duration(200).to('opacity', 1).to('transform', scales.large).play();\n return true;\n };\n\n const onMoveGesture = (detail: GestureDetail): boolean | undefined => {\n if (currentTouchedElement === undefined || !moveAnimation || releaseAnimation) {\n return false; // Skip Animation\n }\n if (effectTagName === 'ion-tab-button') {\n if (Math.abs(detail.currentX - detail.startX) < 3 && !tabDragging) return;\n tabDragging = true;\n stopTabPress();\n tabPressAnimation = createTabBarDragAnimation(effectElement, targetElement, detail.velocityX, vertical);\n void tabPressAnimation.play();\n } else if (scaleAnimationPromise === undefined) {\n if (Math.abs(detail.velocityX) > maxVelocity) {\n maxVelocity = Math.abs(detail.velocityX);\n }\n if (Math.abs(detail.velocityX) > 0.2) {\n scaleAnimationPromise = getScaleAnimation(effectElement)\n .duration(720)\n .keyframes(getMoveAnimationKeyframe('slowly', scales))\n .play()\n .finally(() => (scaleAnimationPromise = undefined));\n }\n if (maxVelocity > 0.2 && Math.abs(detail.velocityX) < 0.15 && Math.abs(detail.startX - detail.currentX) > 100) {\n scaleAnimationPromise = getScaleAnimation(effectElement)\n .duration(720)\n .keyframes(getMoveAnimationKeyframe(detail.velocityX > 0 ? 'moveRight' : 'moveLeft', scales))\n .play()\n .finally(() => (scaleAnimationPromise = undefined));\n maxVelocity = 0;\n }\n }\n\n const currentX = detail.currentX;\n const previousY = animationRect(targetElement, vertical).top + animationRect(targetElement, vertical).height / 2;\n const nextEl = (targetElement.getRootNode() as Document | ShadowRoot).elementFromPoint(\n vertical ? previousY : currentX,\n vertical ? currentX : previousY,\n );\n let latestTouchedElement: HTMLElement | undefined = (nextEl?.closest(effectTagName) as HTMLElement) || undefined;\n if (vertical && effectTagName === 'ion-tab-button') {\n // Overlapping, scaled tabs must not steal a drag from their neighbor.\n const bar = targetElement.getBoundingClientRect();\n const tabs = Array.from(targetElement.querySelectorAll<HTMLElement>(effectTagName)).filter((tab) => tab.offsetWidth > 0);\n const distance = (tab: HTMLElement) => Math.abs(currentX - (bar.top + tab.offsetTop + tab.offsetHeight / 2));\n latestTouchedElement =\n currentX >= bar.top && currentX <= bar.bottom\n ? tabs.reduce<HTMLElement | undefined>(\n (closest, tab) => (!closest || distance(tab) < distance(closest) ? tab : closest),\n undefined,\n )\n : undefined;\n }\n\n if (\n latestTouchedElement &&\n latestTouchedElement.parentElement === targetElement &&\n !(latestTouchedElement as HTMLIonTabButtonElement).disabled &&\n currentTouchedElement !== latestTouchedElement\n ) {\n currentTouchedElement = latestTouchedElement;\n changeSelectedElement(targetElement, currentTouchedElement, effectTagName, selectedClassName);\n }\n moveAnimation.progressStep(getStep(detail.currentX, animationPosition!));\n return true;\n };\n\n const onEndGesture = async (): Promise<boolean | undefined> => {\n if (releaseAnimation) return;\n // タイマーをクリア(正常にonEndGestureが実行された場合)\n if (clearActivatedTimer !== undefined) {\n clearTimeout(clearActivatedTimer);\n clearActivatedTimer = undefined;\n }\n\n if (currentTouchedElement && !currentTouchedElement.classList.contains(selectedClassName)) {\n currentTouchedElement.click();\n currentTouchedElement.classList.add(selectedClassName);\n }\n\n if (startAnimationPromise) {\n await startAnimationPromise;\n }\n\n const tapElapsed =\n tabPressAnimation && !tabDragging && selectedElementBeforeGesture !== currentTouchedElement\n ? performance.now() - tabPressStartedAt\n : undefined;\n if (tabPressAnimation && !tabDragging && tapElapsed === undefined) {\n // A quick tap still completes the initial stretch before relaxing.\n const pressing = tabPressAnimation;\n const remaining = 200 - (performance.now() - tabPressStartedAt);\n if (remaining > 0) await new Promise<void>((resolve) => setTimeout(resolve, remaining));\n if (tabPressAnimation !== pressing) return;\n }\n\n if (currentTouchedElement === undefined || !moveAnimation || releaseAnimation) {\n return false;\n }\n\n if (effectTagName !== 'ion-tab-button')\n setTimeout(() => {\n if (!currentTouchedElement) {\n return;\n }\n const targetX = currentTouchedElement.getBoundingClientRect().left + currentTouchedElement.clientWidth / 2;\n const step = getStep(targetX, animationPosition!);\n moveAnimation!.progressStep(step);\n });\n if (effectTagName === 'ion-tab-button') {\n stopTabPress();\n moveAnimation.destroy();\n moveAnimation = undefined;\n const tabs = Array.from(targetElement.querySelectorAll<HTMLElement>(effectTagName)).filter((tab) => tab.offsetWidth > 0);\n if (vertical) {\n currentTouchedElement.classList.remove('ion-activated');\n targetElement.classList.remove(ANIMATED_NAME);\n }\n const releasing = createTabBarReleaseAnimation(\n effectElement,\n currentTouchedElement,\n tapElapsed !== undefined && tapElapsed < 200\n ? {\n elapsed: tapElapsed,\n distance: Math.abs(tabs.indexOf(currentTouchedElement) - tabs.indexOf(selectedElementBeforeGesture!)),\n }\n : undefined,\n vertical,\n );\n currentTouchedElement.classList.remove('ion-activated');\n releaseAnimation = releasing;\n await releasing.play();\n if (releaseAnimation !== releasing) return;\n clearActivated(true);\n releasing.destroy();\n releaseAnimation = undefined;\n } else {\n await getScaleAnimation(effectElement).duration(120).to('transform', `scale(1, 0.92)`).play();\n }\n moveAnimation?.destroy();\n\n clearActivated(true);\n return true;\n };\n\n const nativeChanged = () => {\n gesture.enable(!isNativeUIShell(targetElement));\n cancelActiveGesture();\n };\n targetElement.addEventListener('nativeUIShellChange', nativeChanged);\n if (isNativeUIShell(targetElement)) nativeChanged();\n\n return {\n destroy: () => {\n destroyed = true;\n cancelActiveGesture();\n // Remove event listeners\n targetElement.removeEventListener('pointerdown', onPointerDown);\n targetElement.removeEventListener('click', onClick, true);\n targetElement.removeEventListener('nativeUIShellChange', nativeChanged);\n\n // Destroy gesture\n if (gesture) {\n gesture.destroy();\n }\n // Remove gesture class\n targetElement.classList.remove(GESTURE_NAME);\n effectElement.remove();\n if (effectTagName === 'ion-tab-button') {\n if (originalTabBarScale) targetElement.style.setProperty('--ios27-tab-bar-scale', originalTabBarScale);\n else targetElement.style.removeProperty('--ios27-tab-bar-scale');\n }\n },\n };\n};\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { Animation } from "@ionic/core";
2
1
  import { ElementReferences, ElementSizes } from "@rdlabo/ionic-theme-utils";
2
+ import { Animation } from "@ionic/core/components";
3
3
  //#region src/tab-bar-searchable/animations/enter.d.ts
4
4
  export declare const createEffectAnimation: (references: ElementReferences, sizes: ElementSizes) => Animation;
5
5
  export declare const createSearchContainerAnimation: (references: ElementReferences, sizes: ElementSizes) => Animation;
@@ -1 +1 @@
1
- {"version":3,"file":"enter.d.ts","names":[],"sources":["../../../src/tab-bar-searchable/animations/enter.ts"],"mappings":";;;qBAIa,wBAAyB,YAAY,mBAAmB,OAAO,iBAAe;qBA4B9E,iCAAkC,YAAY,mBAAmB,OAAO,iBAAe;qBAYvF,8BAA+B,YAAY,sBAAoB;qBAS/D,wBAAyB,WAAW,aAAa,YAAY,mBAAmB,OAAO,iBAAe;qBA2BtG,2BAA4B,cAAc,gBAAc"}
1
+ {"version":3,"file":"enter.d.ts","names":[],"sources":["../../../src/tab-bar-searchable/animations/enter.ts"],"mappings":";;;qBAKa,wBAAyB,YAAY,mBAAmB,OAAO,iBAAe;qBA4B9E,iCAAkC,YAAY,mBAAmB,OAAO,iBAAe;qBAYvF,8BAA+B,YAAY,sBAAoB;qBAS/D,wBAAyB,WAAW,aAAa,YAAY,mBAAmB,OAAO,iBAAe;qBA2BtG,2BAA4B,cAAc,gBAAc"}
@@ -1,5 +1,5 @@
1
1
  import { cloneElement } from "../../utils.js";
2
- import { createAnimation } from "@ionic/core";
2
+ import { createAnimation } from "@ionic/core/components/index.js";
3
3
  import { ANIMATION_DELAY_CLOSE_BUTTONS, OPACITY_TRANSITION } from "@rdlabo/ionic-theme-utils";
4
4
  //#region src/tab-bar-searchable/animations/enter.ts
5
5
  const createEffectAnimation = (references, sizes) => {
@@ -1 +1 @@
1
- {"version":3,"file":"enter.js","names":[],"sources":["../../../src/tab-bar-searchable/animations/enter.ts"],"sourcesContent":["import { Animation, createAnimation } from '@ionic/core';\nimport { ANIMATION_DELAY_CLOSE_BUTTONS, OPACITY_TRANSITION, type ElementReferences, type ElementSizes } from '@rdlabo/ionic-theme-utils';\nimport { cloneElement } from '../../utils';\n\nexport const createEffectAnimation = (references: ElementReferences, sizes: ElementSizes): Animation => {\n const effectElement = cloneElement('ion-icon');\n const closeButtonRect = references.closeButtonIcon?.getBoundingClientRect();\n const iconName = references.selectedTabButtonIcon?.getAttribute('name');\n const selectedTabButtonIconRect = references.selectedTabButtonIcon?.getBoundingClientRect();\n\n return createAnimation()\n .addElement(effectElement)\n .beforeAddWrite(() => {\n effectElement.style.display = 'inline-block';\n references.closeButtonIcon.style.opacity = '0';\n if (iconName && closeButtonRect) {\n effectElement.setAttribute('name', iconName);\n effectElement.style.width = `${closeButtonRect.width}px`;\n effectElement.style.height = `${closeButtonRect.height}px`;\n }\n })\n .afterAddWrite(() => {\n effectElement.style.display = 'none';\n references.closeButtonIcon.style.opacity = '1';\n })\n .fromTo(\n 'transform',\n `translate3d(${selectedTabButtonIconRect.left}px, ${selectedTabButtonIconRect.top}px, 0)`,\n `translate3d(${closeButtonRect.left}px, ${closeButtonRect.top}px, 0)`,\n );\n};\n\nexport const createSearchContainerAnimation = (references: ElementReferences, sizes: ElementSizes): Animation => {\n return createAnimation()\n .addElement(references.searchContainer)\n .beforeAddWrite(() => (references.searchContainer.style.transformOrigin = 'right center'))\n .fromTo(\n 'transform',\n `scale(${sizes.fabButton.width / sizes.searchContainer.width}, ${sizes.fabButton.height / sizes.searchContainer.height})`,\n 'scale(1)',\n )\n .fromTo('opacity', '0.2', '1');\n};\n\nexport const createCloseButtonsAnimation = (references: ElementReferences): Animation => {\n return createAnimation()\n .delay(ANIMATION_DELAY_CLOSE_BUTTONS)\n .addElement(references.closeButtons)\n .beforeAddWrite(() => (references.closeButtons.style.transformOrigin = 'left center'))\n .afterClearStyles(['transform', 'transform-origin'])\n .fromTo('transform', 'scale(1.5, 1)', 'scale(1)');\n};\n\nexport const createTabBarAnimation = (ionTabBar: HTMLElement, references: ElementReferences, sizes: ElementSizes): Animation => {\n return createAnimation()\n .addElement(ionTabBar)\n .beforeAddWrite(() => {\n ionTabBar.style.transformOrigin = 'left center';\n ionTabBar.querySelectorAll<HTMLElement>('ion-tab-button').forEach((element: HTMLElement) => {\n element.style.transition = OPACITY_TRANSITION;\n element.style.opacity = '0';\n });\n references.selectedTabButton.classList.remove('tab-selected');\n const iconName = references.selectedTabButtonIcon?.getAttribute('name');\n if (iconName) {\n references.closeButtonIcon?.setAttribute('name', iconName);\n }\n })\n .afterAddWrite(() => {\n references.selectedTabButton.classList.add('tab-selected');\n ionTabBar.style.pointerEvents = 'none';\n })\n .fromTo(\n 'transform',\n 'scale(1)',\n `scale(${sizes.closeButton.width / sizes.tabBar.width}, ${sizes.closeButton.height / sizes.tabBar.height})`,\n )\n .fromTo('opacity', '1', '0');\n};\n\nexport const createFabButtonAnimation = (ionFabButton: HTMLElement): Animation => {\n return createAnimation()\n .addElement(ionFabButton)\n .beforeAddWrite(() => {\n ionFabButton.style.transformOrigin = 'center right';\n ionFabButton.querySelector<HTMLElement>('ion-icon')?.style.setProperty('opacity', '0');\n })\n .afterAddWrite(() => {\n ionFabButton.style.pointerEvents = 'none';\n })\n .fromTo('opacity', '1', '0');\n};\n"],"mappings":";;;;AAIA,MAAa,yBAAyB,YAA+B,UAAmC;CACtG,MAAM,gBAAgB,aAAa,UAAU;CAC7C,MAAM,kBAAkB,WAAW,iBAAiB,sBAAsB;CAC1E,MAAM,WAAW,WAAW,uBAAuB,aAAa,MAAM;CACtE,MAAM,4BAA4B,WAAW,uBAAuB,sBAAsB;CAE1F,OAAO,gBAAgB,CAAC,CACrB,WAAW,aAAa,CAAC,CACzB,qBAAqB;EACpB,cAAc,MAAM,UAAU;EAC9B,WAAW,gBAAgB,MAAM,UAAU;EAC3C,IAAI,YAAY,iBAAiB;GAC/B,cAAc,aAAa,QAAQ,QAAQ;GAC3C,cAAc,MAAM,QAAQ,GAAG,gBAAgB,MAAM;GACrD,cAAc,MAAM,SAAS,GAAG,gBAAgB,OAAO;EACzD;CACF,CAAC,CAAC,CACD,oBAAoB;EACnB,cAAc,MAAM,UAAU;EAC9B,WAAW,gBAAgB,MAAM,UAAU;CAC7C,CAAC,CAAC,CACD,OACC,aACA,eAAe,0BAA0B,KAAK,MAAM,0BAA0B,IAAI,SAClF,eAAe,gBAAgB,KAAK,MAAM,gBAAgB,IAAI,OAChE;AACJ;AAEA,MAAa,kCAAkC,YAA+B,UAAmC;CAC/G,OAAO,gBAAgB,CAAC,CACrB,WAAW,WAAW,eAAe,CAAC,CACtC,qBAAsB,WAAW,gBAAgB,MAAM,kBAAkB,cAAe,CAAC,CACzF,OACC,aACA,SAAS,MAAM,UAAU,QAAQ,MAAM,gBAAgB,MAAM,IAAI,MAAM,UAAU,SAAS,MAAM,gBAAgB,OAAO,IACvH,UACF,CAAC,CACA,OAAO,WAAW,OAAO,GAAG;AACjC;AAEA,MAAa,+BAA+B,eAA6C;CACvF,OAAO,gBAAgB,CAAC,CACrB,MAAM,6BAA6B,CAAC,CACpC,WAAW,WAAW,YAAY,CAAC,CACnC,qBAAsB,WAAW,aAAa,MAAM,kBAAkB,aAAc,CAAC,CACrF,iBAAiB,CAAC,aAAa,kBAAkB,CAAC,CAAC,CACnD,OAAO,aAAa,iBAAiB,UAAU;AACpD;AAEA,MAAa,yBAAyB,WAAwB,YAA+B,UAAmC;CAC9H,OAAO,gBAAgB,CAAC,CACrB,WAAW,SAAS,CAAC,CACrB,qBAAqB;EACpB,UAAU,MAAM,kBAAkB;EAClC,UAAU,iBAA8B,gBAAgB,CAAC,CAAC,SAAS,YAAyB;GAC1F,QAAQ,MAAM,aAAa;GAC3B,QAAQ,MAAM,UAAU;EAC1B,CAAC;EACD,WAAW,kBAAkB,UAAU,OAAO,cAAc;EAC5D,MAAM,WAAW,WAAW,uBAAuB,aAAa,MAAM;EACtE,IAAI,UACF,WAAW,iBAAiB,aAAa,QAAQ,QAAQ;CAE7D,CAAC,CAAC,CACD,oBAAoB;EACnB,WAAW,kBAAkB,UAAU,IAAI,cAAc;EACzD,UAAU,MAAM,gBAAgB;CAClC,CAAC,CAAC,CACD,OACC,aACA,YACA,SAAS,MAAM,YAAY,QAAQ,MAAM,OAAO,MAAM,IAAI,MAAM,YAAY,SAAS,MAAM,OAAO,OAAO,EAC3G,CAAC,CACA,OAAO,WAAW,KAAK,GAAG;AAC/B;AAEA,MAAa,4BAA4B,iBAAyC;CAChF,OAAO,gBAAgB,CAAC,CACrB,WAAW,YAAY,CAAC,CACxB,qBAAqB;EACpB,aAAa,MAAM,kBAAkB;EACrC,aAAa,cAA2B,UAAU,CAAC,EAAE,MAAM,YAAY,WAAW,GAAG;CACvF,CAAC,CAAC,CACD,oBAAoB;EACnB,aAAa,MAAM,gBAAgB;CACrC,CAAC,CAAC,CACD,OAAO,WAAW,KAAK,GAAG;AAC/B"}
1
+ {"version":3,"file":"enter.js","names":[],"sources":["../../../src/tab-bar-searchable/animations/enter.ts"],"sourcesContent":["import type { Animation } from '@ionic/core/components';\nimport { createAnimation } from '@ionic/core/components/index.js';\nimport { ANIMATION_DELAY_CLOSE_BUTTONS, OPACITY_TRANSITION, type ElementReferences, type ElementSizes } from '@rdlabo/ionic-theme-utils';\nimport { cloneElement } from '../../utils';\n\nexport const createEffectAnimation = (references: ElementReferences, sizes: ElementSizes): Animation => {\n const effectElement = cloneElement('ion-icon');\n const closeButtonRect = references.closeButtonIcon?.getBoundingClientRect();\n const iconName = references.selectedTabButtonIcon?.getAttribute('name');\n const selectedTabButtonIconRect = references.selectedTabButtonIcon?.getBoundingClientRect();\n\n return createAnimation()\n .addElement(effectElement)\n .beforeAddWrite(() => {\n effectElement.style.display = 'inline-block';\n references.closeButtonIcon.style.opacity = '0';\n if (iconName && closeButtonRect) {\n effectElement.setAttribute('name', iconName);\n effectElement.style.width = `${closeButtonRect.width}px`;\n effectElement.style.height = `${closeButtonRect.height}px`;\n }\n })\n .afterAddWrite(() => {\n effectElement.style.display = 'none';\n references.closeButtonIcon.style.opacity = '1';\n })\n .fromTo(\n 'transform',\n `translate3d(${selectedTabButtonIconRect.left}px, ${selectedTabButtonIconRect.top}px, 0)`,\n `translate3d(${closeButtonRect.left}px, ${closeButtonRect.top}px, 0)`,\n );\n};\n\nexport const createSearchContainerAnimation = (references: ElementReferences, sizes: ElementSizes): Animation => {\n return createAnimation()\n .addElement(references.searchContainer)\n .beforeAddWrite(() => (references.searchContainer.style.transformOrigin = 'right center'))\n .fromTo(\n 'transform',\n `scale(${sizes.fabButton.width / sizes.searchContainer.width}, ${sizes.fabButton.height / sizes.searchContainer.height})`,\n 'scale(1)',\n )\n .fromTo('opacity', '0.2', '1');\n};\n\nexport const createCloseButtonsAnimation = (references: ElementReferences): Animation => {\n return createAnimation()\n .delay(ANIMATION_DELAY_CLOSE_BUTTONS)\n .addElement(references.closeButtons)\n .beforeAddWrite(() => (references.closeButtons.style.transformOrigin = 'left center'))\n .afterClearStyles(['transform', 'transform-origin'])\n .fromTo('transform', 'scale(1.5, 1)', 'scale(1)');\n};\n\nexport const createTabBarAnimation = (ionTabBar: HTMLElement, references: ElementReferences, sizes: ElementSizes): Animation => {\n return createAnimation()\n .addElement(ionTabBar)\n .beforeAddWrite(() => {\n ionTabBar.style.transformOrigin = 'left center';\n ionTabBar.querySelectorAll<HTMLElement>('ion-tab-button').forEach((element: HTMLElement) => {\n element.style.transition = OPACITY_TRANSITION;\n element.style.opacity = '0';\n });\n references.selectedTabButton.classList.remove('tab-selected');\n const iconName = references.selectedTabButtonIcon?.getAttribute('name');\n if (iconName) {\n references.closeButtonIcon?.setAttribute('name', iconName);\n }\n })\n .afterAddWrite(() => {\n references.selectedTabButton.classList.add('tab-selected');\n ionTabBar.style.pointerEvents = 'none';\n })\n .fromTo(\n 'transform',\n 'scale(1)',\n `scale(${sizes.closeButton.width / sizes.tabBar.width}, ${sizes.closeButton.height / sizes.tabBar.height})`,\n )\n .fromTo('opacity', '1', '0');\n};\n\nexport const createFabButtonAnimation = (ionFabButton: HTMLElement): Animation => {\n return createAnimation()\n .addElement(ionFabButton)\n .beforeAddWrite(() => {\n ionFabButton.style.transformOrigin = 'center right';\n ionFabButton.querySelector<HTMLElement>('ion-icon')?.style.setProperty('opacity', '0');\n })\n .afterAddWrite(() => {\n ionFabButton.style.pointerEvents = 'none';\n })\n .fromTo('opacity', '1', '0');\n};\n"],"mappings":";;;;AAKA,MAAa,yBAAyB,YAA+B,UAAmC;CACtG,MAAM,gBAAgB,aAAa,UAAU;CAC7C,MAAM,kBAAkB,WAAW,iBAAiB,sBAAsB;CAC1E,MAAM,WAAW,WAAW,uBAAuB,aAAa,MAAM;CACtE,MAAM,4BAA4B,WAAW,uBAAuB,sBAAsB;CAE1F,OAAO,gBAAgB,CAAC,CACrB,WAAW,aAAa,CAAC,CACzB,qBAAqB;EACpB,cAAc,MAAM,UAAU;EAC9B,WAAW,gBAAgB,MAAM,UAAU;EAC3C,IAAI,YAAY,iBAAiB;GAC/B,cAAc,aAAa,QAAQ,QAAQ;GAC3C,cAAc,MAAM,QAAQ,GAAG,gBAAgB,MAAM;GACrD,cAAc,MAAM,SAAS,GAAG,gBAAgB,OAAO;EACzD;CACF,CAAC,CAAC,CACD,oBAAoB;EACnB,cAAc,MAAM,UAAU;EAC9B,WAAW,gBAAgB,MAAM,UAAU;CAC7C,CAAC,CAAC,CACD,OACC,aACA,eAAe,0BAA0B,KAAK,MAAM,0BAA0B,IAAI,SAClF,eAAe,gBAAgB,KAAK,MAAM,gBAAgB,IAAI,OAChE;AACJ;AAEA,MAAa,kCAAkC,YAA+B,UAAmC;CAC/G,OAAO,gBAAgB,CAAC,CACrB,WAAW,WAAW,eAAe,CAAC,CACtC,qBAAsB,WAAW,gBAAgB,MAAM,kBAAkB,cAAe,CAAC,CACzF,OACC,aACA,SAAS,MAAM,UAAU,QAAQ,MAAM,gBAAgB,MAAM,IAAI,MAAM,UAAU,SAAS,MAAM,gBAAgB,OAAO,IACvH,UACF,CAAC,CACA,OAAO,WAAW,OAAO,GAAG;AACjC;AAEA,MAAa,+BAA+B,eAA6C;CACvF,OAAO,gBAAgB,CAAC,CACrB,MAAM,6BAA6B,CAAC,CACpC,WAAW,WAAW,YAAY,CAAC,CACnC,qBAAsB,WAAW,aAAa,MAAM,kBAAkB,aAAc,CAAC,CACrF,iBAAiB,CAAC,aAAa,kBAAkB,CAAC,CAAC,CACnD,OAAO,aAAa,iBAAiB,UAAU;AACpD;AAEA,MAAa,yBAAyB,WAAwB,YAA+B,UAAmC;CAC9H,OAAO,gBAAgB,CAAC,CACrB,WAAW,SAAS,CAAC,CACrB,qBAAqB;EACpB,UAAU,MAAM,kBAAkB;EAClC,UAAU,iBAA8B,gBAAgB,CAAC,CAAC,SAAS,YAAyB;GAC1F,QAAQ,MAAM,aAAa;GAC3B,QAAQ,MAAM,UAAU;EAC1B,CAAC;EACD,WAAW,kBAAkB,UAAU,OAAO,cAAc;EAC5D,MAAM,WAAW,WAAW,uBAAuB,aAAa,MAAM;EACtE,IAAI,UACF,WAAW,iBAAiB,aAAa,QAAQ,QAAQ;CAE7D,CAAC,CAAC,CACD,oBAAoB;EACnB,WAAW,kBAAkB,UAAU,IAAI,cAAc;EACzD,UAAU,MAAM,gBAAgB;CAClC,CAAC,CAAC,CACD,OACC,aACA,YACA,SAAS,MAAM,YAAY,QAAQ,MAAM,OAAO,MAAM,IAAI,MAAM,YAAY,SAAS,MAAM,OAAO,OAAO,EAC3G,CAAC,CACA,OAAO,WAAW,KAAK,GAAG;AAC/B;AAEA,MAAa,4BAA4B,iBAAyC;CAChF,OAAO,gBAAgB,CAAC,CACrB,WAAW,YAAY,CAAC,CACxB,qBAAqB;EACpB,aAAa,MAAM,kBAAkB;EACrC,aAAa,cAA2B,UAAU,CAAC,EAAE,MAAM,YAAY,WAAW,GAAG;CACvF,CAAC,CAAC,CACD,oBAAoB;EACnB,aAAa,MAAM,gBAAgB;CACrC,CAAC,CAAC,CACD,OAAO,WAAW,KAAK,GAAG;AAC/B"}
@@ -1,5 +1,5 @@
1
- import { Animation } from "@ionic/core";
2
1
  import { ElementReferences, ElementSizes } from "@rdlabo/ionic-theme-utils";
2
+ import { Animation } from "@ionic/core/components";
3
3
  //#region src/tab-bar-searchable/animations/leave.d.ts
4
4
  export declare const createReverseEffectAnimation: (references: ElementReferences, searchableElementSizes: ElementSizes, colorSelected: string) => Animation;
5
5
  export declare const createReverseSearchContainerAnimation: (references: ElementReferences, sizes: ElementSizes) => Animation;
@@ -1 +1 @@
1
- {"version":3,"file":"leave.d.ts","names":[],"sources":["../../../src/tab-bar-searchable/animations/leave.ts"],"mappings":";;;qBAIa,+BACX,YAAY,mBACZ,wBAAwB,cACxB,0BACC;qBA2BU,wCAAyC,YAAY,mBAAmB,OAAO,iBAAe;qBAY9F,qCAAsC,YAAY,sBAAoB;qBAStE,+BAAgC,WAAW,aAAa,YAAY,mBAAmB,OAAO,iBAAe;qBAoB7G,kCAAmC,cAAc,aAAa,YAAY,iBAAe"}
1
+ {"version":3,"file":"leave.d.ts","names":[],"sources":["../../../src/tab-bar-searchable/animations/leave.ts"],"mappings":";;;qBAKa,+BACX,YAAY,mBACZ,wBAAwB,cACxB,0BACC;qBA2BU,wCAAyC,YAAY,mBAAmB,OAAO,iBAAe;qBAY9F,qCAAsC,YAAY,sBAAoB;qBAStE,+BAAgC,WAAW,aAAa,YAAY,mBAAmB,OAAO,iBAAe;qBAoB7G,kCAAmC,cAAc,aAAa,YAAY,iBAAe"}
@@ -1,5 +1,5 @@
1
1
  import { cloneElement } from "../../utils.js";
2
- import { createAnimation } from "@ionic/core";
2
+ import { createAnimation } from "@ionic/core/components/index.js";
3
3
  import { ANIMATION_DELAY_CLOSE_BUTTONS, OPACITY_TRANSITION } from "@rdlabo/ionic-theme-utils";
4
4
  //#region src/tab-bar-searchable/animations/leave.ts
5
5
  const createReverseEffectAnimation = (references, searchableElementSizes, colorSelected) => {
@@ -1 +1 @@
1
- {"version":3,"file":"leave.js","names":[],"sources":["../../../src/tab-bar-searchable/animations/leave.ts"],"sourcesContent":["import { Animation, createAnimation } from '@ionic/core';\nimport { ANIMATION_DELAY_CLOSE_BUTTONS, OPACITY_TRANSITION, type ElementReferences, type ElementSizes } from '@rdlabo/ionic-theme-utils';\nimport { cloneElement } from '../../utils';\n\nexport const createReverseEffectAnimation = (\n references: ElementReferences,\n searchableElementSizes: ElementSizes,\n colorSelected: string,\n): Animation => {\n const effectElement = cloneElement('ion-icon');\n const closeButtonRect = references.closeButtonIcon?.getBoundingClientRect();\n\n return createAnimation()\n .addElement(effectElement)\n .beforeAddWrite(() => {\n effectElement.style.display = 'inline-block';\n references.closeButtonIcon.style.opacity = '0';\n if (searchableElementSizes.selectedTabButtonIcon) {\n effectElement.style.width = `${searchableElementSizes.selectedTabButtonIcon.width}px`;\n effectElement.style.height = `${searchableElementSizes.selectedTabButtonIcon.height}px`;\n effectElement.style.color = colorSelected;\n }\n })\n .afterAddWrite(() => {\n effectElement.style.display = 'none';\n references.closeButtonIcon.style.opacity = '1';\n effectElement.style.color = '';\n })\n .fromTo(\n 'transform',\n `translate3d(${closeButtonRect.left}px, ${closeButtonRect.top}px, 0)`,\n `translate3d(${searchableElementSizes.selectedTabButtonIcon.left}px, ${searchableElementSizes.selectedTabButtonIcon.top}px, 0)`,\n );\n};\n\nexport const createReverseSearchContainerAnimation = (references: ElementReferences, sizes: ElementSizes): Animation => {\n return createAnimation()\n .addElement(references.searchContainer)\n .beforeAddWrite(() => (references.searchContainer.style.transformOrigin = 'right center'))\n .fromTo(\n 'transform',\n 'scale(1)',\n `scale(${sizes.fabButton.width / sizes.searchContainer.width}, ${sizes.fabButton.height / sizes.searchContainer.height})`,\n )\n .fromTo('opacity', '1', '0.2');\n};\n\nexport const createReverseCloseButtonsAnimation = (references: ElementReferences): Animation => {\n return createAnimation()\n .delay(ANIMATION_DELAY_CLOSE_BUTTONS)\n .addElement(references.closeButtons)\n .beforeAddWrite(() => (references.closeButtons.style.transformOrigin = 'left center'))\n .afterClearStyles(['transform', 'transform-origin'])\n .fromTo('transform', 'scale(1)', 'scale(1.5, 1)');\n};\n\nexport const createReverseTabBarAnimation = (ionTabBar: HTMLElement, references: ElementReferences, sizes: ElementSizes): Animation => {\n return createAnimation()\n .addElement(ionTabBar)\n .beforeAddWrite(() => {\n ionTabBar.style.transformOrigin = 'left center';\n ionTabBar.style.pointerEvents = 'auto';\n ionTabBar.querySelectorAll<HTMLElement>('ion-tab-button').forEach((element: HTMLElement) => {\n element.style.transition = OPACITY_TRANSITION;\n element.style.opacity = '1';\n });\n })\n .afterClearStyles(['transform', 'opacity', 'transform-origin'])\n .fromTo(\n 'transform',\n `scale(${sizes.closeButton.width / sizes.tabBar.width}, ${sizes.closeButton.height / sizes.tabBar.height})`,\n 'scale(1)',\n )\n .fromTo('opacity', '0', '1');\n};\n\nexport const createReverseFabButtonAnimation = (ionFabButton: HTMLElement, references: ElementSizes): Animation => {\n return createAnimation()\n .addElement(ionFabButton)\n .beforeAddWrite(() => {\n ionFabButton.querySelector<HTMLElement>('ion-icon')?.style.setProperty('opacity', '1');\n ionFabButton.style.transformOrigin = 'center right';\n })\n .afterAddWrite(() => {\n ionFabButton.style.pointerEvents = 'auto';\n })\n .fromTo('opacity', '0', '1')\n .fromTo('transform', `scale(${references.searchContainer.height / references.fabButton.height})`, 'scale(1)');\n};\n"],"mappings":";;;;AAIA,MAAa,gCACX,YACA,wBACA,kBACc;CACd,MAAM,gBAAgB,aAAa,UAAU;CAC7C,MAAM,kBAAkB,WAAW,iBAAiB,sBAAsB;CAE1E,OAAO,gBAAgB,CAAC,CACrB,WAAW,aAAa,CAAC,CACzB,qBAAqB;EACpB,cAAc,MAAM,UAAU;EAC9B,WAAW,gBAAgB,MAAM,UAAU;EAC3C,IAAI,uBAAuB,uBAAuB;GAChD,cAAc,MAAM,QAAQ,GAAG,uBAAuB,sBAAsB,MAAM;GAClF,cAAc,MAAM,SAAS,GAAG,uBAAuB,sBAAsB,OAAO;GACpF,cAAc,MAAM,QAAQ;EAC9B;CACF,CAAC,CAAC,CACD,oBAAoB;EACnB,cAAc,MAAM,UAAU;EAC9B,WAAW,gBAAgB,MAAM,UAAU;EAC3C,cAAc,MAAM,QAAQ;CAC9B,CAAC,CAAC,CACD,OACC,aACA,eAAe,gBAAgB,KAAK,MAAM,gBAAgB,IAAI,SAC9D,eAAe,uBAAuB,sBAAsB,KAAK,MAAM,uBAAuB,sBAAsB,IAAI,OAC1H;AACJ;AAEA,MAAa,yCAAyC,YAA+B,UAAmC;CACtH,OAAO,gBAAgB,CAAC,CACrB,WAAW,WAAW,eAAe,CAAC,CACtC,qBAAsB,WAAW,gBAAgB,MAAM,kBAAkB,cAAe,CAAC,CACzF,OACC,aACA,YACA,SAAS,MAAM,UAAU,QAAQ,MAAM,gBAAgB,MAAM,IAAI,MAAM,UAAU,SAAS,MAAM,gBAAgB,OAAO,EACzH,CAAC,CACA,OAAO,WAAW,KAAK,KAAK;AACjC;AAEA,MAAa,sCAAsC,eAA6C;CAC9F,OAAO,gBAAgB,CAAC,CACrB,MAAM,6BAA6B,CAAC,CACpC,WAAW,WAAW,YAAY,CAAC,CACnC,qBAAsB,WAAW,aAAa,MAAM,kBAAkB,aAAc,CAAC,CACrF,iBAAiB,CAAC,aAAa,kBAAkB,CAAC,CAAC,CACnD,OAAO,aAAa,YAAY,eAAe;AACpD;AAEA,MAAa,gCAAgC,WAAwB,YAA+B,UAAmC;CACrI,OAAO,gBAAgB,CAAC,CACrB,WAAW,SAAS,CAAC,CACrB,qBAAqB;EACpB,UAAU,MAAM,kBAAkB;EAClC,UAAU,MAAM,gBAAgB;EAChC,UAAU,iBAA8B,gBAAgB,CAAC,CAAC,SAAS,YAAyB;GAC1F,QAAQ,MAAM,aAAa;GAC3B,QAAQ,MAAM,UAAU;EAC1B,CAAC;CACH,CAAC,CAAC,CACD,iBAAiB;EAAC;EAAa;EAAW;CAAkB,CAAC,CAAC,CAC9D,OACC,aACA,SAAS,MAAM,YAAY,QAAQ,MAAM,OAAO,MAAM,IAAI,MAAM,YAAY,SAAS,MAAM,OAAO,OAAO,IACzG,UACF,CAAC,CACA,OAAO,WAAW,KAAK,GAAG;AAC/B;AAEA,MAAa,mCAAmC,cAA2B,eAAwC;CACjH,OAAO,gBAAgB,CAAC,CACrB,WAAW,YAAY,CAAC,CACxB,qBAAqB;EACpB,aAAa,cAA2B,UAAU,CAAC,EAAE,MAAM,YAAY,WAAW,GAAG;EACrF,aAAa,MAAM,kBAAkB;CACvC,CAAC,CAAC,CACD,oBAAoB;EACnB,aAAa,MAAM,gBAAgB;CACrC,CAAC,CAAC,CACD,OAAO,WAAW,KAAK,GAAG,CAAC,CAC3B,OAAO,aAAa,SAAS,WAAW,gBAAgB,SAAS,WAAW,UAAU,OAAO,IAAI,UAAU;AAChH"}
1
+ {"version":3,"file":"leave.js","names":[],"sources":["../../../src/tab-bar-searchable/animations/leave.ts"],"sourcesContent":["import type { Animation } from '@ionic/core/components';\nimport { createAnimation } from '@ionic/core/components/index.js';\nimport { ANIMATION_DELAY_CLOSE_BUTTONS, OPACITY_TRANSITION, type ElementReferences, type ElementSizes } from '@rdlabo/ionic-theme-utils';\nimport { cloneElement } from '../../utils';\n\nexport const createReverseEffectAnimation = (\n references: ElementReferences,\n searchableElementSizes: ElementSizes,\n colorSelected: string,\n): Animation => {\n const effectElement = cloneElement('ion-icon');\n const closeButtonRect = references.closeButtonIcon?.getBoundingClientRect();\n\n return createAnimation()\n .addElement(effectElement)\n .beforeAddWrite(() => {\n effectElement.style.display = 'inline-block';\n references.closeButtonIcon.style.opacity = '0';\n if (searchableElementSizes.selectedTabButtonIcon) {\n effectElement.style.width = `${searchableElementSizes.selectedTabButtonIcon.width}px`;\n effectElement.style.height = `${searchableElementSizes.selectedTabButtonIcon.height}px`;\n effectElement.style.color = colorSelected;\n }\n })\n .afterAddWrite(() => {\n effectElement.style.display = 'none';\n references.closeButtonIcon.style.opacity = '1';\n effectElement.style.color = '';\n })\n .fromTo(\n 'transform',\n `translate3d(${closeButtonRect.left}px, ${closeButtonRect.top}px, 0)`,\n `translate3d(${searchableElementSizes.selectedTabButtonIcon.left}px, ${searchableElementSizes.selectedTabButtonIcon.top}px, 0)`,\n );\n};\n\nexport const createReverseSearchContainerAnimation = (references: ElementReferences, sizes: ElementSizes): Animation => {\n return createAnimation()\n .addElement(references.searchContainer)\n .beforeAddWrite(() => (references.searchContainer.style.transformOrigin = 'right center'))\n .fromTo(\n 'transform',\n 'scale(1)',\n `scale(${sizes.fabButton.width / sizes.searchContainer.width}, ${sizes.fabButton.height / sizes.searchContainer.height})`,\n )\n .fromTo('opacity', '1', '0.2');\n};\n\nexport const createReverseCloseButtonsAnimation = (references: ElementReferences): Animation => {\n return createAnimation()\n .delay(ANIMATION_DELAY_CLOSE_BUTTONS)\n .addElement(references.closeButtons)\n .beforeAddWrite(() => (references.closeButtons.style.transformOrigin = 'left center'))\n .afterClearStyles(['transform', 'transform-origin'])\n .fromTo('transform', 'scale(1)', 'scale(1.5, 1)');\n};\n\nexport const createReverseTabBarAnimation = (ionTabBar: HTMLElement, references: ElementReferences, sizes: ElementSizes): Animation => {\n return createAnimation()\n .addElement(ionTabBar)\n .beforeAddWrite(() => {\n ionTabBar.style.transformOrigin = 'left center';\n ionTabBar.style.pointerEvents = 'auto';\n ionTabBar.querySelectorAll<HTMLElement>('ion-tab-button').forEach((element: HTMLElement) => {\n element.style.transition = OPACITY_TRANSITION;\n element.style.opacity = '1';\n });\n })\n .afterClearStyles(['transform', 'opacity', 'transform-origin'])\n .fromTo(\n 'transform',\n `scale(${sizes.closeButton.width / sizes.tabBar.width}, ${sizes.closeButton.height / sizes.tabBar.height})`,\n 'scale(1)',\n )\n .fromTo('opacity', '0', '1');\n};\n\nexport const createReverseFabButtonAnimation = (ionFabButton: HTMLElement, references: ElementSizes): Animation => {\n return createAnimation()\n .addElement(ionFabButton)\n .beforeAddWrite(() => {\n ionFabButton.querySelector<HTMLElement>('ion-icon')?.style.setProperty('opacity', '1');\n ionFabButton.style.transformOrigin = 'center right';\n })\n .afterAddWrite(() => {\n ionFabButton.style.pointerEvents = 'auto';\n })\n .fromTo('opacity', '0', '1')\n .fromTo('transform', `scale(${references.searchContainer.height / references.fabButton.height})`, 'scale(1)');\n};\n"],"mappings":";;;;AAKA,MAAa,gCACX,YACA,wBACA,kBACc;CACd,MAAM,gBAAgB,aAAa,UAAU;CAC7C,MAAM,kBAAkB,WAAW,iBAAiB,sBAAsB;CAE1E,OAAO,gBAAgB,CAAC,CACrB,WAAW,aAAa,CAAC,CACzB,qBAAqB;EACpB,cAAc,MAAM,UAAU;EAC9B,WAAW,gBAAgB,MAAM,UAAU;EAC3C,IAAI,uBAAuB,uBAAuB;GAChD,cAAc,MAAM,QAAQ,GAAG,uBAAuB,sBAAsB,MAAM;GAClF,cAAc,MAAM,SAAS,GAAG,uBAAuB,sBAAsB,OAAO;GACpF,cAAc,MAAM,QAAQ;EAC9B;CACF,CAAC,CAAC,CACD,oBAAoB;EACnB,cAAc,MAAM,UAAU;EAC9B,WAAW,gBAAgB,MAAM,UAAU;EAC3C,cAAc,MAAM,QAAQ;CAC9B,CAAC,CAAC,CACD,OACC,aACA,eAAe,gBAAgB,KAAK,MAAM,gBAAgB,IAAI,SAC9D,eAAe,uBAAuB,sBAAsB,KAAK,MAAM,uBAAuB,sBAAsB,IAAI,OAC1H;AACJ;AAEA,MAAa,yCAAyC,YAA+B,UAAmC;CACtH,OAAO,gBAAgB,CAAC,CACrB,WAAW,WAAW,eAAe,CAAC,CACtC,qBAAsB,WAAW,gBAAgB,MAAM,kBAAkB,cAAe,CAAC,CACzF,OACC,aACA,YACA,SAAS,MAAM,UAAU,QAAQ,MAAM,gBAAgB,MAAM,IAAI,MAAM,UAAU,SAAS,MAAM,gBAAgB,OAAO,EACzH,CAAC,CACA,OAAO,WAAW,KAAK,KAAK;AACjC;AAEA,MAAa,sCAAsC,eAA6C;CAC9F,OAAO,gBAAgB,CAAC,CACrB,MAAM,6BAA6B,CAAC,CACpC,WAAW,WAAW,YAAY,CAAC,CACnC,qBAAsB,WAAW,aAAa,MAAM,kBAAkB,aAAc,CAAC,CACrF,iBAAiB,CAAC,aAAa,kBAAkB,CAAC,CAAC,CACnD,OAAO,aAAa,YAAY,eAAe;AACpD;AAEA,MAAa,gCAAgC,WAAwB,YAA+B,UAAmC;CACrI,OAAO,gBAAgB,CAAC,CACrB,WAAW,SAAS,CAAC,CACrB,qBAAqB;EACpB,UAAU,MAAM,kBAAkB;EAClC,UAAU,MAAM,gBAAgB;EAChC,UAAU,iBAA8B,gBAAgB,CAAC,CAAC,SAAS,YAAyB;GAC1F,QAAQ,MAAM,aAAa;GAC3B,QAAQ,MAAM,UAAU;EAC1B,CAAC;CACH,CAAC,CAAC,CACD,iBAAiB;EAAC;EAAa;EAAW;CAAkB,CAAC,CAAC,CAC9D,OACC,aACA,SAAS,MAAM,YAAY,QAAQ,MAAM,OAAO,MAAM,IAAI,MAAM,YAAY,SAAS,MAAM,OAAO,OAAO,IACzG,UACF,CAAC,CACA,OAAO,WAAW,KAAK,GAAG;AAC/B;AAEA,MAAa,mCAAmC,cAA2B,eAAwC;CACjH,OAAO,gBAAgB,CAAC,CACrB,WAAW,YAAY,CAAC,CACxB,qBAAqB;EACpB,aAAa,cAA2B,UAAU,CAAC,EAAE,MAAM,YAAY,WAAW,GAAG;EACrF,aAAa,MAAM,kBAAkB;CACvC,CAAC,CAAC,CACD,oBAAoB;EACnB,aAAa,MAAM,gBAAgB;CACrC,CAAC,CAAC,CACD,OAAO,WAAW,KAAK,GAAG,CAAC,CAC3B,OAAO,aAAa,SAAS,WAAW,gBAAgB,SAAS,WAAW,UAAU,OAAO,IAAI,UAAU;AAChH"}