@rdlabo/capacitor-native-ui 1.2.1 → 2.0.0-beta.pr304.sha56daf151ad80

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 (65) hide show
  1. package/README.md +38 -26
  2. package/dist/core.d.ts +2 -2
  3. package/dist/native/activation.d.ts.map +1 -1
  4. package/dist/native/activation.js +19 -19
  5. package/dist/native/activation.js.map +1 -1
  6. package/dist/native/definitions.d.ts +22 -40
  7. package/dist/native/definitions.d.ts.map +1 -1
  8. package/dist/native/html.d.ts.map +1 -1
  9. package/dist/native/html.js +0 -1
  10. package/dist/native/html.js.map +1 -1
  11. package/dist/native/index.d.ts +2 -2
  12. package/dist/native/index.d.ts.map +1 -1
  13. package/dist/native/index.js +2 -11
  14. package/dist/native/index.js.map +1 -1
  15. package/dist/native/overlays/controller.js +1 -1
  16. package/dist/native/overlays/controller.js.map +1 -1
  17. package/dist/native/prehide.js +1 -1
  18. package/dist/native/prehide.js.map +1 -1
  19. package/dist/native/runtime.d.ts +1 -1
  20. package/dist/native/runtime.d.ts.map +1 -1
  21. package/dist/native/runtime.js +8 -20
  22. package/dist/native/runtime.js.map +1 -1
  23. package/dist/native/shared/candidate.d.ts +2 -2
  24. package/dist/native/shared/candidate.d.ts.map +1 -1
  25. package/dist/native/shared/candidate.js +2 -2
  26. package/dist/native/shared/candidate.js.map +1 -1
  27. package/dist/native/shared/control-options.d.ts +6 -0
  28. package/dist/native/shared/control-options.d.ts.map +1 -0
  29. package/dist/native/shared/control-options.js +17 -0
  30. package/dist/native/shared/control-options.js.map +1 -0
  31. package/dist/native/shared/toolbar-options.d.ts +6 -2
  32. package/dist/native/shared/toolbar-options.d.ts.map +1 -1
  33. package/dist/native/shared/toolbar-options.js +7 -15
  34. package/dist/native/shared/toolbar-options.js.map +1 -1
  35. package/dist/native/startup.d.ts.map +1 -1
  36. package/dist/native/startup.js +0 -16
  37. package/dist/native/startup.js.map +1 -1
  38. package/dist/native/vertical-bars-web.d.ts.map +1 -1
  39. package/dist/native/vertical-bars-web.js +3 -2
  40. package/dist/native/vertical-bars-web.js.map +1 -1
  41. package/dist/vertical-bars.d.ts +2 -2
  42. package/docs/configuration.md +94 -72
  43. package/docs/framework-independent.md +11 -5
  44. package/docs/migration.md +62 -84
  45. package/docs/native-ui-extensions.md +31 -28
  46. package/docs/native-ui.md +34 -50
  47. package/docs/setup.md +34 -22
  48. package/docs/vertical-bars.md +59 -65
  49. package/ios/Sources/NativeUIPlugin/NativeUIPlugin.swift +1 -1
  50. package/package.json +1 -1
  51. package/src/core.ts +1 -2
  52. package/src/native/activation.ts +13 -22
  53. package/src/native/definitions.ts +40 -90
  54. package/src/native/html.ts +0 -5
  55. package/src/native/index.ts +2 -11
  56. package/src/native/overlays/controller.ts +1 -1
  57. package/src/native/prehide.ts +1 -1
  58. package/src/native/runtime.ts +7 -16
  59. package/src/native/shared/candidate.ts +4 -4
  60. package/src/native/shared/control-options.ts +20 -0
  61. package/src/native/shared/toolbar-options.ts +8 -12
  62. package/src/native/startup.ts +0 -16
  63. package/src/native/vertical-bars-web.ts +4 -2
  64. package/src/vertical-bars.ts +2 -1
  65. package/docs/native-mini-player.md +0 -47
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","names":["extensionAncestors"],"sources":["../../src/native/runtime.ts"],"sourcesContent":["import { createDiagnostics } from './shared/diagnostics';\nimport { htmlSelector, readHTMLControl } from './html';\nimport { extensionAncestors, readExtension } from './extensions';\nimport { bounded, boundedListener } from './shared/bridge';\nimport { popoverTrigger } from './overlays/popover';\nimport {\n alignVerticalTabBar,\n forgetVerticalBarFrame,\n rememberVerticalBarFrame,\n validVerticalBarFrame,\n} from './shared/vertical-bars-geometry';\nimport { projectionIds } from './shared/projection-id';\nimport { inVerticalBarsSurface, topModal, modalUsesVerticalBars, modalVerticalBarFrame } from './shared/modal';\nimport type { PluginListenerHandle } from '@capacitor/core';\nimport { LIFECYCLE_WILL_ENTER, LIFECYCLE_WILL_LEAVE, LIFECYCLE_DID_ENTER, LIFECYCLE_DID_LEAVE } from './shared/events';\nimport { VERTICAL_BARS_TRANSITION_CANCELED, getNativeSearchBindings, setNativeUIIntegration } from '../native-integration';\nimport { createSearchSupport } from './components/searchable-tabs';\nimport type {\n NativeUIActivation,\n NativeUISnapshot,\n NativeUIRuntimeHandle,\n NativeUIRuntimeOptions,\n NativeUIPlugin,\n NativeUIStatus,\n} from './definitions';\nimport { readCandidate, selector, shadowSelector, motionSelector, isVerticalBarsCandidate } from './components';\nimport {\n activateProjectedElement,\n createVerticalBarsPageState,\n isVerticalBarsSource,\n preferredVerticalBarsBack,\n marker,\n syncToolbarText,\n toolbarTextMarker,\n prehideOnlyMutation,\n rejectedClass,\n unprojected,\n} from './shared/dom';\nimport { createIconRenderer } from './shared/icons';\nimport type { Candidate } from './shared/candidate';\nimport { CSS_MOTION_EVENTS } from './shared/events';\nimport { createCrossfade, fadeMarker } from './shared/crossfade';\n\nconst overlays = 'ion-modal, ion-popover, ion-alert, ion-action-sheet, ion-loading, ion-picker, ion-toast, ion-menu';\n// Only these Web overlays leave the rail's display and interaction intact.\nconst railPreservingOverlays = 'ion-toast, ion-popover, ion-picker';\nconst overlayNames = ['Modal', 'Popover', 'Alert', 'ActionSheet', 'Loading', 'Picker', 'Toast'];\nconst verticalBarsMarker = 'data-native-ui-vertical-bars';\nconst verticalBarsMemberMarker = 'data-native-ui-vertical-bars-member';\n\nexport const createRuntime = async (\n doc: Document,\n plugin: NativeUIPlugin,\n options: NativeUIRuntimeOptions = {},\n nativeVerticalBars: () => boolean = () => true,\n verticalBarsOnly = false,\n onStop?: (cause: 'failure' | 'pagehide') => void,\n): Promise<NativeUIRuntimeHandle & { retain: (deferActivation?: (id: string) => boolean) => () => void }> => {\n const win = doc.defaultView!;\n const extensions = options.extensions ?? [];\n const diagnose = createDiagnostics(options.debug);\n const scope = options.root ?? doc;\n const discovery = [\n options.source === 'extensions'\n ? ':not(*)'\n : options.source === 'html'\n ? htmlSelector\n : options.source === 'auto'\n ? `${selector}, ${htmlSelector}`\n : selector,\n ...extensions.map((extension) => extension.selector),\n ].join(', ');\n const icons = createIconRenderer();\n const crossfade = createCrossfade(win);\n const ids = new WeakMap<Element, string>();\n let rejected = new WeakMap<HTMLElement, string>();\n const sources = new Map<HTMLElement, string | null>();\n const verticalBarsOwners = new Set<HTMLElement>();\n const verticalBarsMembers = new Set<HTMLElement>();\n const suspended = new Set<HTMLElement[]>();\n const pages = new Set<HTMLElement>();\n const verticalBarsPages = createVerticalBarsPageState();\n const presented = new Set<HTMLElement>();\n const railPopovers = new WeakSet<HTMLElement>();\n const manualSuspensions = new Set<symbol>();\n const moving = new Map<HTMLElement, Set<string>>();\n const observed = new Set<Element | ShadowRoot>();\n const listeners = new AbortController();\n let actions = new Map<string, HTMLElement>();\n let nextId = 0;\n let revision = 0;\n const tabGeometry = new Map<HTMLElement, () => void>();\n let acceptedRevision = 0;\n let updatingRevision: number | undefined;\n let pendingActivations: NativeUIActivation[] = [];\n let lastSequence = 0;\n let lastSnapshot = '';\n let viewport = `${win.innerWidth}:${win.innerHeight}`;\n let forceRefresh = false;\n let dirty = false;\n let pending = false;\n let stopped = false;\n let destruction: Promise<void> | undefined;\n const retentions = new Set<{ accepts?: (id: string) => boolean; activation?: NativeUIActivation }>();\n /** True while a tab-switch handoff should skip crossfade. */\n let tabSwitchHandoff = false;\n /** Keep instant updates until this time — DidLeave often precedes the retire sync. */\n let handoffUntil = 0;\n /** Tab switch armed while a sync was already in flight; extend instant past that sync. */\n let handoffAcrossPending = false;\n /** Captured at the start of each sync so an in-flight update keeps a stable duration. */\n let handoffInstant = false;\n /** Retire native controls immediately as a modal starts covering the page. */\n let modalPresentHandoff = false;\n let frame = 0;\n let updates = 0;\n let reason: string | undefined;\n let listener: PluginListenerHandle | undefined;\n let searchListener: PluginListenerHandle | undefined;\n let waiters: (() => void)[] = [];\n const control = (kind: Candidate['control']['kind']): keyof NonNullable<NativeUIRuntimeOptions['controls']> => {\n if (kind === 'tab-bar') return 'tabs';\n if (kind === 'segment') return 'segment';\n if (kind === 'floating-action-button') return 'fab';\n return 'toolbar';\n };\n const controlEnabled = (candidate: Candidate) => {\n if (candidate.control.kind === 'extension') return true;\n const controls = options.controls;\n return controls === undefined || controls[control(candidate.control.kind)] === true;\n };\n const id = (element: Element) => {\n let value = ids.get(element);\n if (!value) {\n value = `native-ui-${++nextId}`;\n ids.set(element, value);\n projectionIds.set(element, value);\n }\n return value;\n };\n const style = doc.createElement('style');\n const hidden = `[${marker}]:not([${fadeMarker}])`;\n style.textContent = `${hidden}, ${hidden} *, ${hidden}::before, ${hidden}::after, ${hidden}::part(native) { visibility: hidden !important; }\n [${marker}], [${marker}] * { pointer-events: none !important; }\n /* Ionic disables the covered page while a menu is open. VerticalBars rail\n controls remain outside that page; zero specificity preserves any\n pointer-events rule supplied by the application itself. */\n :where(.menu-content-open) :where([${verticalBarsMarker}]) {\n pointer-events: auto;\n }\n :where(.menu-content-open) :where([${verticalBarsMarker}]) > :where(:not([${verticalBarsMemberMarker}])) {\n pointer-events: none;\n }`;\n\n const restore = (element: HTMLElement) => {\n lastSnapshot = '';\n search.release(element);\n element.removeAttribute(marker);\n if (!stopped) crossfade.play(element, false, handoffInstant || (isVerticalBarsSource(element) && !element.matches('ion-tab-bar')));\n if (element.getAttribute('aria-hidden') === 'true') {\n const previous = sources.get(element);\n if (previous == null) element.removeAttribute('aria-hidden');\n else element.setAttribute('aria-hidden', previous);\n }\n sources.delete(element);\n element.dispatchEvent(new CustomEvent('nativeUIChange'));\n };\n const restoreAll = () => {\n Array.from(sources.keys()).forEach(restore);\n verticalBarsOwners.forEach((element) => element.removeAttribute(verticalBarsMarker));\n verticalBarsOwners.clear();\n verticalBarsMembers.forEach((element) => element.removeAttribute(verticalBarsMemberMarker));\n verticalBarsMembers.clear();\n };\n const finishWaiters = () => {\n const current = waiters;\n waiters = [];\n current.forEach((resolve) => resolve());\n };\n const schedule = () => {\n if (stopped) return;\n dirty = true;\n if (!pending && !frame) frame = win.requestAnimationFrame(() => void sync());\n };\n const search = createSearchSupport(doc, id, schedule);\n const candidateSources = (candidate: Candidate) => candidate.sources ?? [candidate.element];\n const setRejected = (element: HTMLElement, value: boolean) => {\n element.classList.toggle(rejectedClass, value);\n };\n const measuringPointerPages = new WeakSet<HTMLElement>();\n const readEnabledCandidate = (element: HTMLElement): Candidate | undefined => {\n if (options.root && !options.root.contains(element)) return;\n if (element.matches('ion-back-button') && element.closest('ion-app.ios-theme-vertical-bars') && !isVerticalBarsCandidate(element))\n return;\n if (extensions.some((extension) => element.matches(extension.selector))) {\n const extension = extensions.find((definition) => element.matches(definition.selector))!;\n const unavailable = options.unavailableExtensions?.get(extension.name);\n if (unavailable) {\n diagnose(`${extension.name}: ${unavailable}`, element);\n return;\n }\n const candidate = readExtension(element, extensions, id, (reason) => diagnose(`${extension.name}: ${reason}`, element));\n if (verticalBarsOnly && (!candidate?.control.extension?.tabBarId || !nativeVerticalBars())) {\n if (candidate) diagnose('rail-only: element extensions stay on the Web when verticalBars.only is true.', element);\n return;\n }\n return candidate;\n }\n if (options.source === 'extensions') return;\n if (options.source === 'html' || element.matches(htmlSelector)) {\n const candidate = readHTMLControl(element, id, options);\n if (!candidate) {\n diagnose(\n 'unsupported-control: check the source visibility, accessible name, disabled ancestors, and supported HTML markup.',\n element,\n );\n return;\n }\n const rail = candidate.control.placement === 'vertical-bars';\n if (verticalBarsOnly && !rail) return;\n if (rail && !nativeVerticalBars()) return;\n return candidate;\n }\n if (element.querySelector(htmlSelector)) return; // A shared automatic surface must not cover explicitly selected descendants.\n if (verticalBarsOnly && (!isVerticalBarsCandidate(element) || element.closest('[data-native-ui-placement=\"element\"]'))) return;\n if (options.verticalBars?.enabled === false && isVerticalBarsCandidate(element)) return;\n const pointerPage = isVerticalBarsCandidate(element) ? element.closest<HTMLElement>('.ion-page') : undefined;\n let candidate: Candidate | undefined;\n if (pointerPage && getComputedStyle(pointerPage).pointerEvents === 'none') {\n const previous = pointerPage.style.getPropertyValue('pointer-events');\n const priority = pointerPage.style.getPropertyPriority('pointer-events');\n const hadStyle = pointerPage.hasAttribute('style');\n measuringPointerPages.add(pointerPage);\n pointerPage.style.setProperty('pointer-events', 'auto', 'important');\n try {\n candidate = readCandidate(element, id, options);\n } finally {\n if (previous) pointerPage.style.setProperty('pointer-events', previous, priority);\n else pointerPage.style.removeProperty('pointer-events');\n if (!hadStyle && !pointerPage.style.length) pointerPage.removeAttribute('style');\n win.setTimeout(() => measuringPointerPages.delete(pointerPage), 0);\n }\n } else candidate = readCandidate(element, id, options);\n if (candidate && isVerticalBarsCandidate(element) && !element.closest('[data-native-ui-placement=\"element\"]')) {\n if (!nativeVerticalBars()) return undefined;\n candidate.control.placement = 'vertical-bars';\n if (['button', 'button-group', 'menu-button'].includes(candidate.control.kind)) {\n const slot = (element.matches('ion-buttons') ? element : (element.closest('ion-buttons') ?? element)).getAttribute('slot');\n if (slot === 'start' || slot === 'end') candidate.control.toolbarSlot = slot;\n }\n }\n if (!candidate) diagnose('unsupported-control: check the supported Ionic markup, fixed placement, and styling requirements.', element);\n return candidate && controlEnabled(candidate) ? candidate : undefined;\n };\n const flush = async () => {\n if (stopped) return;\n schedule();\n try {\n await bounded(new Promise<void>((resolve) => waiters.push(resolve)));\n } catch (error) {\n await fail(error);\n }\n };\n const blocked = (element: HTMLElement) =>\n verticalBarsPages.isDeparted(element) ||\n (!isVerticalBarsSource(element) &&\n (Array.from(suspended).some((scopes) => scopes.some((scope) => scope.contains(element))) ||\n Array.from(pages).some((scope) => scope.contains(element)) ||\n Array.from(moving.keys()).some((surface) => surface.contains(element))));\n const painted = () => new Promise<void>((resolve) => win.requestAnimationFrame(() => win.requestAnimationFrame(() => resolve())));\n const overlayOpen = (includeMenu = true, allowModal = false, ignoredSelector?: string) => {\n const modal = topModal(doc);\n const ignored = (element: Element) =>\n (!!ignoredSelector && element.matches(ignoredSelector) && !railPopovers.has(element as HTMLElement)) ||\n (allowModal && !!modal && modalUsesVerticalBars(modal) && element.matches('ion-modal'));\n for (const element of presented) if (!element.isConnected) presented.delete(element);\n const presentedOverlayOpen = Array.from(presented).some(\n (element) => !ignored(element) && (includeMenu || !element.matches('ion-menu')),\n );\n return (\n manualSuspensions.size > 0 ||\n presentedOverlayOpen ||\n Array.from(doc.querySelectorAll(overlays)).some(\n (element) =>\n !ignored(element) &&\n (includeMenu || !element.matches('ion-menu')) &&\n ((element as Element & { presented?: boolean }).presented || element.classList.contains('show-menu')),\n )\n );\n };\n // Compare source data before PNG rendering mutates each item's payload.\n const signature = (candidate: Candidate) =>\n JSON.stringify({ control: candidate.control, icons: candidate.icons.map(({ source }) => source), assets: candidate.assets?.signature });\n const read = (): Candidate[] => {\n search.keepSearchTabsVisible();\n for (const page of pages) if (!page.isConnected) pages.delete(page);\n for (const surface of moving.keys()) if (!surface.isConnected) moving.delete(surface);\n if (doc.hidden || overlayOpen(false, true, railPreservingOverlays)) return [];\n if (win.visualViewport && (win.visualViewport.scale !== 1 || win.visualViewport.offsetTop !== 0) && !search.hasActive()) return [];\n const overlayVisible = overlayOpen();\n // Web rail projections also hide their originals. Measure those sources\n // without releasing the visible clones before native acknowledges ownership.\n const measurableSources = new Set([\n ...sources.keys(),\n ...Array.from(scope.querySelectorAll<HTMLElement>(`[${marker}], [data-native-ui-web-source]`)).filter(isVerticalBarsSource),\n ]);\n const candidates = unprojected(measurableSources, () =>\n search\n .decorate(\n Array.from(scope.querySelectorAll<HTMLElement>(discovery))\n .filter(\n (element) =>\n inVerticalBarsSurface(element) &&\n !verticalBarsPages.isDeparted(element) &&\n (!blocked(element) || (overlayVisible && isVerticalBarsSource(element))),\n )\n .map(readEnabledCandidate)\n .filter((candidate): candidate is Candidate => !!candidate),\n blocked,\n )\n .filter((candidate) => !rejected.has(candidate.element) || rejected.get(candidate.element) !== signature(candidate)),\n );\n // An extension owns its entire source subtree. Never project a nested built-in twice.\n const extensionSources = candidates.filter((candidate) => candidate.control.kind === 'extension');\n const exclusive = candidates.filter((candidate) => {\n if (extensionSources.some((owner) => owner !== candidate && owner.element.contains(candidate.element))) return false;\n const tabBarId = candidate.control.extension?.tabBarId;\n if (!tabBarId) return true;\n // Wait for the owning native tab host; do not cache an early rejection while its icons load.\n return (\n candidates.some(\n (owner) => owner.control.id === tabBarId && owner.control.kind === 'tab-bar' && owner.control.placement === 'vertical-bars',\n ) && extensionSources.filter((source) => source.control.extension?.tabBarId === tabBarId).length === 1\n );\n });\n const back = preferredVerticalBarsBack(\n candidates\n .filter((candidate) => candidate.control.kind === 'back-button' && isVerticalBarsCandidate(candidate.element))\n .map((candidate) => candidate.element),\n doc,\n );\n const selected = exclusive.filter(\n (candidate) => candidate.control.kind !== 'back-button' || !isVerticalBarsCandidate(candidate.element) || candidate.element === back,\n );\n return overlayVisible ? selected.filter((candidate) => isVerticalBarsCandidate(candidate.element)) : selected;\n };\n const observe = () => {\n const wanted = new Set<Element | ShadowRoot>();\n for (const element of Array.from(scope.querySelectorAll<HTMLElement>(discovery))) {\n wanted.add(element);\n if (element.parentElement) wanted.add(element.parentElement);\n if (extensions.some((extension) => element.matches(extension.selector))) {\n for (const ancestor of extensionAncestors(element)) {\n wanted.add(ancestor);\n const root = ancestor.getRootNode();\n if (root instanceof ShadowRoot) wanted.add(root);\n }\n }\n const inspectShadow = (node: Element) => {\n if (node.shadowRoot) {\n wanted.add(node.shadowRoot);\n node.shadowRoot.querySelectorAll('ion-icon').forEach(inspectShadow);\n }\n };\n inspectShadow(element);\n element.querySelectorAll(shadowSelector).forEach(inspectShadow);\n }\n // Reconnect only when the set changes; no per-frame observer allocation.\n if (wanted.size === observed.size && Array.from(wanted).every((element) => observed.has(element))) return;\n observer.disconnect();\n resize.disconnect();\n for (const element of observed) if (element instanceof ShadowRoot) element.removeEventListener('scroll', schedule, true);\n observed.clear();\n observer.observe(doc.documentElement, observation);\n for (const element of wanted) {\n observed.add(element);\n if (element instanceof ShadowRoot) {\n observer.observe(element, observation);\n on(element, 'scroll');\n } else resize.observe(element);\n }\n };\n const fail = async (error: unknown) => {\n reason = error instanceof Error ? error.message : String(error);\n console.warn('[Native UI] Returning to Web:', reason);\n const destruction = handle.destroy();\n onStop?.('failure');\n await destruction;\n // The Web fallback re-evaluates eligibility once native projection is stopped.\n win.dispatchEvent(new Event('nativeUIRefresh'));\n };\n const sync = async () => {\n frame = 0;\n dirty = false;\n pending = true;\n if (options.source !== 'extensions') syncToolbarText(doc);\n handoffInstant = tabSwitchHandoff || handoffAcrossPending || modalPresentHandoff || win.performance.now() < handoffUntil;\n try {\n // A retained sync performs no update; keep the modal handoff armed so the\n // deferred retirement still runs instantly after the overlay releases.\n if (retentions.size && !manualSuspensions.size) return;\n modalPresentHandoff = false;\n const size = `${win.innerWidth}:${win.innerHeight}`;\n // WebKit can resize before Ionic's fixed DOM positions catch up.\n // Measure on the next frame instead of retiring a valid native search.\n if (viewport !== size) {\n viewport = size;\n dirty = true;\n return;\n }\n observe();\n let candidates = read();\n const signatures = new Map(candidates.map((candidate) => [candidate.element, signature(candidate)]));\n const failedAssets = new Set<Candidate>();\n for (const candidate of candidates) {\n try {\n await candidate.assets?.render(icons);\n } catch {\n failedAssets.add(candidate);\n diagnose('invalid-assets: image conversion or serialized extension props failed.', candidate.element);\n }\n for (const icon of candidate.icons) {\n const field = icon.field ?? 'icon';\n icon.item[field] = await icons.render(\n icon.source,\n field === 'icon' ? icon.item.iconWidth! : icon.item.closeIconWidth!,\n field === 'icon' ? icon.item.iconHeight! : icon.item.closeIconHeight!,\n );\n }\n }\n candidates = candidates.filter((candidate) => !failedAssets.has(candidate));\n if (stopped || dirty || (retentions.size && !manualSuspensions.size)) return;\n const retained = new Set(candidates.flatMap(candidateSources));\n const removed = Array.from(sources.keys()).filter((element) => !retained.has(element));\n if (removed.some(isVerticalBarsSource)) {\n actions.forEach(forgetVerticalBarFrame);\n try {\n const geometry = await bounded(\n plugin.getVerticalBarsGeometry({ viewportWidth: win.innerWidth, ids: [...actions.keys(), 'BackButton', '__tabBar'] }),\n );\n if (stopped || dirty || (retentions.size && !manualSuspensions.size)) return;\n if (geometry.revision === acceptedRevision && size === `${win.innerWidth}:${win.innerHeight}`) {\n for (const tabBar of removed.filter((element) => element.matches('ion-tab-bar'))) {\n tabGeometry.get(tabBar)?.();\n tabGeometry.delete(tabBar);\n const items = new Map(\n [...actions]\n .filter(\n ([id, element]) => element.parentElement === tabBar && geometry.items[id] && validVerticalBarFrame(geometry.items[id]),\n )\n .map(([id, element]) => [element, geometry.items[id]]),\n );\n if (\n geometry.items['__tabBar'] &&\n validVerticalBarFrame(geometry.items['__tabBar']) &&\n items.size === tabBar.querySelectorAll('ion-tab-button').length\n )\n tabGeometry.set(tabBar, alignVerticalTabBar(tabBar, geometry.items['__tabBar'], items));\n }\n for (const [id, element] of actions) {\n const frame = geometry.items[element.matches('ion-back-button') ? 'BackButton' : id];\n if (frame) rememberVerticalBarFrame(element, frame);\n }\n }\n } catch {\n /* Older native binaries can still use the CSS fallback. */\n }\n }\n if (removed.length) {\n // Restore the source and let WebKit paint before removing its native cover.\n removed.forEach(restore);\n if (removed.some(isVerticalBarsSource))\n win.dispatchEvent(new CustomEvent('nativeUIVerticalBarsRelease', { detail: { instant: handoffInstant } }));\n // The outgoing tab is no longer visible, so waiting two frames only leaves its\n // native snapshot over the destination. Stack transitions still need the paint.\n if (!handoffInstant) {\n await painted();\n if (stopped || dirty) return;\n }\n }\n const root = doc.querySelector('ion-app.ios-theme-vertical-bars');\n const verticalBarEdge: 'left' | 'right' | undefined = options.nativeState?.edge\n ? options.nativeState.edge\n : options.rail\n ? options.rail.edge\n : root\n ? root.classList.contains('ios-theme-vertical-bars-left')\n ? 'left'\n : 'right'\n : undefined;\n const modal = topModal(doc);\n const verticalBarFrame = modal && modalUsesVerticalBars(modal) ? modalVerticalBarFrame(modal) : undefined;\n const data = {\n verticalBarFrame,\n viewportWidth: win.innerWidth,\n verticalBarEdge,\n controls: candidates.map((candidate) => candidate.control),\n };\n const serialized = JSON.stringify(data);\n if (serialized === lastSnapshot && !forceRefresh) return;\n const snapshot: NativeUISnapshot = { ...data, revision: ++revision, transitionDuration: crossfade.duration(handoffInstant) };\n // A native visibility notification during this update must survive its ack.\n forceRefresh = false;\n updates++;\n updatingRevision = snapshot.revision;\n const result = await bounded(plugin.update(snapshot));\n if (stopped || (retentions.size && !manualSuspensions.size)) return;\n if (result.revision !== snapshot.revision) throw new Error('Native UI revision mismatch');\n if (`${win.innerWidth}:${win.innerHeight}` !== size) {\n lastSnapshot = '';\n dirty = true;\n return;\n }\n if (result.rejectedSearches?.length) {\n search.reject(result.rejectedSearches);\n lastSnapshot = '';\n dirty = true;\n }\n for (const candidate of candidates) {\n if (result.rejectedControls?.includes(candidate.control.id)) {\n diagnose(\n 'native-rejected: the native renderer rejected this source; check decoded props, placement, and device support.',\n candidate.element,\n );\n rejected.set(candidate.element, signatures.get(candidate.element)!);\n setRejected(candidate.element, true);\n dirty = true;\n }\n }\n // A page mutation must not tear down unchanged shared controls such as tabs.\n const currentCandidates = dirty ? read() : candidates;\n const current = dirty ? new Map(currentCandidates.map((candidate) => [candidate.element, signature(candidate)])) : signatures;\n const currentSources = new Set(currentCandidates.flatMap(candidateSources));\n const accepted = candidates.filter((candidate) => current.get(candidate.element) === signatures.get(candidate.element));\n accepted.forEach((candidate) => setRejected(candidate.element, false));\n const acceptedVerticalBarsOwners = new Set(\n accepted.filter((candidate) => candidate.control.placement === 'vertical-bars').map((candidate) => candidate.element),\n );\n const acceptedVerticalBarsMembers = new Set(\n accepted\n .filter((candidate) => candidate.control.placement === 'vertical-bars')\n .flatMap((candidate) => Array.from(candidate.actions.values())),\n );\n const invalidated = candidates.length !== accepted.length;\n acceptedRevision = result.revision;\n lastSnapshot = invalidated ? '' : serialized;\n actions = new Map(\n candidates.filter((candidate) => current.has(candidate.element)).flatMap((candidate) => Array.from(candidate.actions)),\n );\n // Keep an existing cover while its content catches up. Only an ineligible\n // source needs to return to Web; new sources still require an exact ack.\n for (const element of sources.keys()) if (!currentSources.has(element)) restore(element);\n for (const element of verticalBarsOwners) {\n if (acceptedVerticalBarsOwners.has(element)) continue;\n element.removeAttribute(verticalBarsMarker);\n verticalBarsOwners.delete(element);\n }\n if (acceptedVerticalBarsOwners.size)\n win.dispatchEvent(new CustomEvent('nativeUIVerticalBarsAcquire', { detail: { instant: handoffInstant } }));\n for (const element of acceptedVerticalBarsOwners) {\n element.setAttribute(verticalBarsMarker, '');\n verticalBarsOwners.add(element);\n }\n for (const element of verticalBarsMembers) {\n if (acceptedVerticalBarsMembers.has(element)) continue;\n element.removeAttribute(verticalBarsMemberMarker);\n verticalBarsMembers.delete(element);\n }\n for (const element of acceptedVerticalBarsMembers) {\n element.setAttribute(verticalBarsMemberMarker, '');\n verticalBarsMembers.add(element);\n }\n for (const element of accepted.flatMap(candidateSources)) {\n const newlyProjected = !sources.has(element) || !element.hasAttribute(marker);\n if (!sources.has(element)) {\n sources.set(element, element.getAttribute('aria-hidden'));\n crossfade.play(element, true, handoffInstant || (isVerticalBarsSource(element) && !element.matches('ion-tab-bar')));\n }\n element.setAttribute(marker, '');\n element.setAttribute('aria-hidden', 'true');\n if (newlyProjected) element.dispatchEvent(new CustomEvent('nativeUIChange'));\n }\n const received = pendingActivations;\n pendingActivations = [];\n received.forEach(activate);\n await crossfade.settled();\n // Geometry belongs to the outgoing tab visual, not to other rail owners.\n // Keep it until that visual has completely faded back to native.\n for (const [tabBar, restore] of tabGeometry) {\n if (!tabBar.isConnected || acceptedVerticalBarsOwners.has(tabBar)) {\n restore();\n tabGeometry.delete(tabBar);\n }\n }\n if (invalidated) {\n dirty = true;\n // Sources that became ineligible must paint before their cover is removed.\n await painted();\n }\n } catch (error) {\n await fail(error);\n } finally {\n updatingRevision = undefined;\n pendingActivations = [];\n // A refresh received before the ack must also invalidate that ack's rejects.\n if (forceRefresh) rejected = new WeakMap();\n // A tab switch mid-update (or a dirty follow-up) must keep instant through the retire sync.\n if (!stopped && (handoffAcrossPending || (handoffInstant && dirty))) {\n handoffUntil = Math.max(handoffUntil, win.performance.now() + 400);\n }\n handoffAcrossPending = false;\n pending = false;\n if (dirty && !stopped) schedule();\n else finishWaiters();\n }\n };\n const observation: MutationObserverInit = {\n subtree: true,\n childList: true,\n characterData: true,\n attributes: true,\n attributeOldValue: true,\n };\n const observer = new MutationObserver((records) => {\n if (\n records.some(\n (record) =>\n record.attributeName !== marker &&\n record.attributeName !== 'data-native-ui-web-source' &&\n record.attributeName !== toolbarTextMarker &&\n record.attributeName !== fadeMarker &&\n !prehideOnlyMutation(record) &&\n !(record.attributeName === 'style' && measuringPointerPages.has(record.target as HTMLElement)) &&\n !(\n record.attributeName === 'aria-hidden' &&\n sources.has(record.target as HTMLElement) &&\n (record.target as Element).getAttribute('aria-hidden') === 'true'\n ),\n )\n )\n schedule();\n });\n const resize = new ResizeObserver(schedule);\n const on = (target: EventTarget, name: string, callback: EventListener = schedule) =>\n target.addEventListener(name, callback, { capture: true, signal: listeners.signal });\n const pageWill: EventListener = (event) => {\n const page = event.target as HTMLElement;\n verticalBarsPages.lifecycle(event);\n getNativeSearchBindings(doc)\n .filter((binding) => page.contains(binding.footer))\n .forEach((binding) => search.retire(binding));\n // Angular updates the URL before willLeave, but keeps ion-tab-bar.selectedTab on the\n // leaving tab until DidChange. A mismatch means this leave is a tab switch, not a stack push.\n if (event.type === LIFECYCLE_WILL_LEAVE) beginTabSwitchHandoffIfNeeded(page);\n pages.add(page);\n schedule();\n };\n const pageDid: EventListener = (event) => {\n const page = event.target as HTMLElement;\n verticalBarsPages.lifecycle(event);\n pages.delete(page);\n schedule();\n if (tabSwitchHandoff && pages.size === 0) endTabSwitchHandoff();\n };\n const tabOfPath = (tabs: Element, pathname: string) => {\n let best: { tab: string; length: number } | undefined;\n for (const button of Array.from(tabs.querySelectorAll('ion-tab-button'))) {\n const tab = button.getAttribute('tab');\n const href = button.getAttribute('href')?.split(/[?#]/)[0];\n if (!tab || !href) continue;\n if (pathname === href || pathname.startsWith(`${href}/`)) {\n if (!best || href.length > best.length) best = { tab, length: href.length };\n }\n }\n return best?.tab;\n };\n const armTabSwitchHandoff = () => {\n tabSwitchHandoff = true;\n // Retiring outgoing controls often lands in a later async sync than WillLeave/DidChange.\n handoffUntil = Math.max(handoffUntil, win.performance.now() + 400);\n // The in-flight sync already captured handoffInstant=false; hold instant for the next one.\n if (pending) handoffAcrossPending = true;\n };\n const beginTabSwitchHandoffIfNeeded = (page: HTMLElement) => {\n const tabs = page.closest('ion-tabs');\n if (!tabs) return;\n const bar = tabs.querySelector('ion-tab-bar');\n const selected =\n (bar && 'selectedTab' in bar ? String((bar as HTMLElement & { selectedTab?: string }).selectedTab ?? '') : '') ||\n tabs.querySelector('ion-tab-button.tab-selected')?.getAttribute('tab') ||\n undefined;\n const destination = tabOfPath(tabs, win.location.pathname);\n if (selected && destination && selected !== destination) armTabSwitchHandoff();\n };\n // DidChange / pageDid can land in the same turn as WillLeave. Clear the sticky flag on the\n // next frame; handoffUntil / handoffAcrossPending still cover the async retire sync.\n const endTabSwitchHandoff = () => {\n win.requestAnimationFrame(() => {\n if (stopped || !tabSwitchHandoff) return;\n tabSwitchHandoff = false;\n schedule();\n });\n };\n const motion: EventListener = (event) => {\n const target = event.target as HTMLElement;\n if (!target.matches?.(`${motionSelector}, ${discovery}`) && !(options.source !== 'ionic' && target.querySelector?.(discovery))) return;\n const key = (event as TransitionEvent).propertyName ?? (event as AnimationEvent).animationName;\n if (event.type === CSS_MOTION_EVENTS.transitionRun || event.type === CSS_MOTION_EVENTS.animationStart) {\n const keys = moving.get(target) ?? new Set<string>();\n keys.add(key);\n moving.set(target, keys);\n } else {\n moving.get(target)?.delete(key);\n if (!moving.get(target)?.size) moving.delete(target);\n }\n schedule();\n };\n for (const name of Object.values(CSS_MOTION_EVENTS)) on(doc, name, motion);\n for (const name of [LIFECYCLE_WILL_ENTER, LIFECYCLE_WILL_LEAVE]) on(doc, name, pageWill);\n for (const name of [LIFECYCLE_DID_ENTER, LIFECYCLE_DID_LEAVE]) on(doc, name, pageDid);\n on(doc, VERTICAL_BARS_TRANSITION_CANCELED, (event) => {\n const leaving = event.target as HTMLElement;\n const entering = (event as CustomEvent<{ entering?: HTMLElement }>).detail?.entering;\n verticalBarsPages.cancel(entering, leaving);\n pages.delete(leaving);\n if (entering) pages.delete(entering);\n schedule();\n });\n on(doc, 'ionTabsWillChange', () => {\n // Vanilla ion-tabs dispatches DOM events; @ionic/angular uses EventEmitters instead.\n armTabSwitchHandoff();\n schedule();\n });\n on(doc, 'ionTabsDidChange', endTabSwitchHandoff);\n const overlayPresenting = (element: HTMLElement) => {\n presented.add(element);\n if (element.matches('ion-popover')) {\n const trigger = popoverTrigger(element as HTMLIonPopoverElement);\n // Remember the source before native ownership changes. A successful native\n // popover retains projection; a Web fallback must retire the rail instead.\n if (trigger?.matches('ion-button') && isVerticalBarsSource(trigger as HTMLElement)) railPopovers.add(element);\n else railPopovers.delete(element);\n }\n if (element.matches('ion-modal')) {\n modalPresentHandoff = true;\n // A pending bridge update must retire the old controls immediately too.\n if (pending) handoffInstant = true;\n }\n schedule();\n };\n // Adoption changes the document, but not the in-flight Ionic event path.\n // Do not replay WillPresent: application handlers must run exactly once.\n on(doc, 'nativeUIOverlayAdopted', (event) => overlayPresenting((event as CustomEvent<HTMLElement>).detail));\n for (const name of overlayNames) {\n on(doc, `ion${name}WillPresent`, (event) => overlayPresenting(event.target as HTMLElement));\n on(doc, `ion${name}DidDismiss`, (event) => {\n presented.delete(event.target as HTMLElement);\n railPopovers.delete(event.target as HTMLElement);\n schedule();\n });\n }\n const eventMenu = (event: Event) =>\n event.composedPath().find((target): target is HTMLElement => target instanceof HTMLElement && target.matches('ion-menu'));\n on(doc, 'ionWillOpen', (event) => {\n const menu = eventMenu(event);\n if (menu) presented.add(menu);\n schedule();\n });\n on(doc, 'ionDidClose', (event) => {\n const menu = eventMenu(event);\n if (menu) presented.delete(menu);\n schedule();\n });\n for (const name of [\n 'ionChange',\n 'ionSelect',\n 'ionImgDidLoad',\n CSS_MOTION_EVENTS.transitionEnd,\n CSS_MOTION_EVENTS.animationEnd,\n 'focusin',\n 'focusout',\n ])\n on(doc, name);\n const refreshLayout = () => {\n rejected = new WeakMap();\n forceRefresh = true;\n schedule();\n };\n on(doc, 'visibilitychange', () => {\n if (doc.hidden) {\n getNativeSearchBindings(doc).forEach((binding) => search.retire(binding));\n schedule();\n } else refreshLayout();\n });\n on(win, 'resize', refreshLayout);\n on(win, 'keyboardWillShow', () => search.keyboard(true));\n on(win, 'keyboardWillHide', () => search.keyboard(false));\n on(win, 'scroll');\n on(win.matchMedia('(prefers-color-scheme: dark)'), 'change');\n on(win, 'nativeUIRefresh', (event) => {\n if ((event as Event & { retireSearch?: boolean }).retireSearch)\n getNativeSearchBindings(doc).forEach((binding) => search.retire(binding));\n refreshLayout();\n });\n if (win.visualViewport) {\n on(win.visualViewport, 'resize', refreshLayout);\n on(win.visualViewport, 'scroll');\n }\n const handle: NativeUIRuntimeHandle & { retain: (deferActivation?: (id: string) => boolean) => () => void } = {\n // A native overlay covers this surface; keep its controls and Web ownership intact.\n retain(deferActivation) {\n const retention: { accepts?: (id: string) => boolean; activation?: NativeUIActivation } = { accepts: deferActivation };\n retentions.add(retention);\n return () => {\n if (!retentions.delete(retention)) return;\n // UIKit may already expose the anchor while Ionic is still dismissing.\n // Replay at most one validated input after the live content is restored.\n const activation = retention.activation;\n if (activation && retention.accepts?.(activation.id)) win.queueMicrotask(() => activate(activation));\n schedule();\n };\n },\n markForCheck: schedule,\n getStatus: (): NativeUIStatus => ({\n state: stopped ? 'stopped' : sources.size ? 'native' : 'web',\n projected: sources.size,\n updates,\n reason,\n }),\n async suspend() {\n const token = Symbol();\n let resumed = false;\n if (!stopped) {\n manualSuspensions.add(token);\n getNativeSearchBindings(doc).forEach((binding) => search.retire(binding));\n await flush();\n }\n return {\n async resume() {\n if (resumed) return;\n resumed = true;\n if (stopped || !manualSuspensions.delete(token)) return;\n await flush();\n },\n };\n },\n destroy() {\n if (destruction) return destruction;\n stopped = true;\n destruction = Promise.resolve().then(async () => {\n tabGeometry.forEach((restore) => restore());\n tabGeometry.clear();\n setNativeUIIntegration(doc);\n win.cancelAnimationFrame(frame);\n listeners.abort();\n observer.disconnect();\n resize.disconnect();\n observed.clear();\n actions.clear();\n pendingActivations = [];\n search.destroy();\n crossfade.destroy();\n restoreAll();\n if (!doc.hidden) await painted();\n try {\n await bounded(plugin.clear({ revision: ++revision }));\n } catch {\n /* Always restore the Web, even after bridge loss. */\n }\n style.remove();\n doc.querySelectorAll<HTMLElement>(`.${rejectedClass}`).forEach((element) => setRejected(element, false));\n icons.clear();\n pages.clear();\n presented.clear();\n manualSuspensions.clear();\n moving.clear();\n suspended.clear();\n if (listener) await bounded(listener.remove()).catch(() => {});\n if (searchListener) await bounded(searchListener.remove()).catch(() => {});\n finishWaiters();\n });\n return destruction;\n },\n };\n const activate = (event: NativeUIActivation) => {\n const accepted = dispatchActivation(event);\n if (event.requestId && accepted !== undefined) {\n void bounded(plugin.completeExtensionAction({ requestId: event.requestId, accepted })).catch(() => {});\n }\n };\n const dispatchActivation = (event: NativeUIActivation): boolean | undefined => {\n if (stopped || doc.hidden || event.revision < acceptedRevision || event.revision > revision || event.sequence <= lastSequence)\n return false;\n const element = actions.get(event.id);\n const owner = element && Array.from(sources.keys()).find((source) => source === element || source.contains(element));\n const ignored = owner && isVerticalBarsSource(owner) ? (retentions.size ? 'ion-toast, ion-picker' : railPreservingOverlays) : undefined;\n if (overlayOpen(false, true, ignored)) {\n if (!manualSuspensions.size) {\n for (const retention of retentions) {\n if (retention.accepts?.(event.id) && (!retention.activation || event.sequence > retention.activation.sequence))\n retention.activation = event;\n }\n }\n return false;\n }\n // Native may send input before update() resolves on the JS bridge.\n // Revalidate it after ownership is accepted, using the same action path.\n if (event.revision > acceptedRevision && event.revision === updatingRevision) {\n pendingActivations.push(event);\n return;\n }\n lastSequence = event.sequence;\n if (!element) return false;\n if (!owner || !inVerticalBarsSurface(owner)) return false;\n const direct = !blocked(owner) && unprojected(sources.keys(), () => readEnabledCandidate(owner));\n const candidate = direct || read().find((candidate) => candidate.actions.has(event.id));\n const item = candidate?.control.items.find((item) => item.id === event.id);\n const searchAction =\n candidate?.control.search && [candidate.control.search.trigger.id, candidate.control.search.closeId].includes(event.id);\n const extensionAction = candidate?.control.kind === 'extension' && candidate.actions.get(event.id) === element;\n if (!extensionAction && !searchAction && (!item || item.disabled || item.visible === false)) return false;\n // The original Ionic host owns form submission, routerLink and selection events.\n activateProjectedElement(element);\n lastSnapshot = ''; // Reconcile even if Ionic rejects the proposed native selection.\n schedule();\n return true;\n };\n try {\n listener = await boundedListener(plugin.addListener('activate', activate));\n searchListener = await boundedListener(\n plugin.addListener('search', (event) => {\n if (\n stopped ||\n doc.hidden ||\n event.revision < acceptedRevision ||\n event.revision > revision ||\n overlayOpen(true, false, nativeVerticalBars() ? (retentions.size ? 'ion-toast, ion-picker' : railPreservingOverlays) : undefined)\n )\n return;\n search.event(event);\n }),\n );\n doc.head.append(style);\n observer.observe(doc.documentElement, observation);\n setNativeUIIntegration(doc, {\n async search(binding, active, focus) {\n if (!getNativeSearchBindings(doc).includes(binding) || !search.projected(binding)) return false;\n if (!active) {\n search.setStatus(binding, false);\n } else {\n const entering = !binding.active;\n if (entering) search.begin(binding, revision + 1);\n const nextFocused = focus === true ? true : focus === false ? false : entering ? false : binding.focused;\n search.setStatus(binding, true, nextFocused);\n }\n await flush();\n return !stopped && search.projected(binding);\n },\n async suspend(scopes) {\n getNativeSearchBindings(doc)\n .filter((binding) => scopes.some((scope) => scope.contains(binding.footer) || scope.contains(binding.tabBar)))\n .forEach((binding) => search.retire(binding));\n suspended.add(scopes);\n await flush();\n // Source DOM has been restored before Ionic starts moving it.\n await new Promise<void>((resolve) => win.requestAnimationFrame(() => resolve()));\n return (canceled = false) => {\n suspended.delete(scopes);\n if (canceled || !scopes.some((scope) => scope.closest('ion-app.ios-theme-vertical-bars'))) {\n scopes.forEach((scope) => pages.delete(scope)); // Preserve ordinary iPhone handoff; cancellation has no DidLeave.\n if (canceled) {\n verticalBarsPages.cancel(scopes[0], scopes[1]); // The entering page is abandoned; the leaving page stays active.\n }\n }\n schedule();\n };\n },\n });\n on(win, 'pagehide', () => {\n void handle.destroy();\n onStop?.('pagehide');\n });\n schedule();\n } catch (error) {\n await fail(error);\n }\n return handle;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","names":["extensionAncestors"],"sources":["../../src/native/runtime.ts"],"sourcesContent":["import { controlSelected } from './shared/control-options';\nimport { createDiagnostics } from './shared/diagnostics';\nimport { htmlSelector, readHTMLControl } from './html';\nimport { extensionAncestors, readExtension } from './extensions';\nimport { bounded, boundedListener } from './shared/bridge';\nimport { popoverTrigger } from './overlays/popover';\nimport {\n alignVerticalTabBar,\n forgetVerticalBarFrame,\n rememberVerticalBarFrame,\n validVerticalBarFrame,\n} from './shared/vertical-bars-geometry';\nimport { projectionIds } from './shared/projection-id';\nimport { inVerticalBarsSurface, topModal, modalUsesVerticalBars, modalVerticalBarFrame } from './shared/modal';\nimport type { PluginListenerHandle } from '@capacitor/core';\nimport { LIFECYCLE_WILL_ENTER, LIFECYCLE_WILL_LEAVE, LIFECYCLE_DID_ENTER, LIFECYCLE_DID_LEAVE } from './shared/events';\nimport { VERTICAL_BARS_TRANSITION_CANCELED, getNativeSearchBindings, setNativeUIIntegration } from '../native-integration';\nimport { createSearchSupport } from './components/searchable-tabs';\nimport type {\n NativeUIActivation,\n NativeUISnapshot,\n NativeUIRuntimeHandle,\n NativeUIRuntimeOptions,\n NativeUIPlugin,\n NativeUIStatus,\n} from './definitions';\nimport { readCandidate, selector, shadowSelector, motionSelector, isVerticalBarsCandidate } from './components';\nimport {\n activateProjectedElement,\n createVerticalBarsPageState,\n isVerticalBarsSource,\n preferredVerticalBarsBack,\n marker,\n syncToolbarText,\n toolbarTextMarker,\n prehideOnlyMutation,\n rejectedClass,\n unprojected,\n} from './shared/dom';\nimport { createIconRenderer } from './shared/icons';\nimport type { Candidate } from './shared/candidate';\nimport { CSS_MOTION_EVENTS } from './shared/events';\nimport { createCrossfade, fadeMarker } from './shared/crossfade';\n\nconst overlays = 'ion-modal, ion-popover, ion-alert, ion-action-sheet, ion-loading, ion-picker, ion-toast, ion-menu';\n// Only these Web overlays leave the rail's display and interaction intact.\nconst railPreservingOverlays = 'ion-toast, ion-popover, ion-picker';\nconst overlayNames = ['Modal', 'Popover', 'Alert', 'ActionSheet', 'Loading', 'Picker', 'Toast'];\nconst verticalBarsMarker = 'data-native-ui-vertical-bars';\nconst verticalBarsMemberMarker = 'data-native-ui-vertical-bars-member';\n\nexport const createRuntime = async (\n doc: Document,\n plugin: NativeUIPlugin,\n options: NativeUIRuntimeOptions = {},\n nativeVerticalBars: () => boolean = () => true,\n onStop?: (cause: 'failure' | 'pagehide') => void,\n): Promise<NativeUIRuntimeHandle & { retain: (deferActivation?: (id: string) => boolean) => () => void }> => {\n const win = doc.defaultView!;\n const extensions = options.extensions ?? [];\n const diagnose = createDiagnostics(options.debug);\n const scope = options.root ?? doc;\n const discovery = [\n options.source === 'extensions'\n ? ':not(*)'\n : options.source === 'html'\n ? htmlSelector\n : options.source === 'auto'\n ? `${selector}, ${htmlSelector}`\n : selector,\n ...extensions.map((extension) => extension.selector),\n ].join(', ');\n const icons = createIconRenderer();\n const crossfade = createCrossfade(win);\n const ids = new WeakMap<Element, string>();\n let rejected = new WeakMap<HTMLElement, string>();\n const sources = new Map<HTMLElement, string | null>();\n const verticalBarsOwners = new Set<HTMLElement>();\n const verticalBarsMembers = new Set<HTMLElement>();\n const suspended = new Set<HTMLElement[]>();\n const pages = new Set<HTMLElement>();\n const verticalBarsPages = createVerticalBarsPageState();\n const presented = new Set<HTMLElement>();\n const railPopovers = new WeakSet<HTMLElement>();\n const manualSuspensions = new Set<symbol>();\n const moving = new Map<HTMLElement, Set<string>>();\n const observed = new Set<Element | ShadowRoot>();\n const listeners = new AbortController();\n let actions = new Map<string, HTMLElement>();\n let nextId = 0;\n let revision = 0;\n const tabGeometry = new Map<HTMLElement, () => void>();\n let acceptedRevision = 0;\n let updatingRevision: number | undefined;\n let pendingActivations: NativeUIActivation[] = [];\n let lastSequence = 0;\n let lastSnapshot = '';\n let viewport = `${win.innerWidth}:${win.innerHeight}`;\n let forceRefresh = false;\n let dirty = false;\n let pending = false;\n let stopped = false;\n let destruction: Promise<void> | undefined;\n const retentions = new Set<{ accepts?: (id: string) => boolean; activation?: NativeUIActivation }>();\n /** True while a tab-switch handoff should skip crossfade. */\n let tabSwitchHandoff = false;\n /** Keep instant updates until this time — DidLeave often precedes the retire sync. */\n let handoffUntil = 0;\n /** Tab switch armed while a sync was already in flight; extend instant past that sync. */\n let handoffAcrossPending = false;\n /** Captured at the start of each sync so an in-flight update keeps a stable duration. */\n let handoffInstant = false;\n /** Retire native controls immediately as a modal starts covering the page. */\n let modalPresentHandoff = false;\n let frame = 0;\n let updates = 0;\n let reason: string | undefined;\n let listener: PluginListenerHandle | undefined;\n let searchListener: PluginListenerHandle | undefined;\n let waiters: (() => void)[] = [];\n const controlEnabled = (candidate: Candidate) => {\n const kind = candidate.control.kind;\n // Button readers apply selection/grouping per child; explicit HTML and extensions\n // are independent opt-ins. Only other automatic kinds need this final selection.\n const key = kind === 'tab-bar' ? 'tabs' : kind === 'segment' ? 'segment' : kind === 'floating-action-button' ? 'fab' : undefined;\n return !key || controlSelected(candidate.element, options, key, candidate.control.placement === 'vertical-bars');\n };\n const id = (element: Element) => {\n let value = ids.get(element);\n if (!value) {\n value = `native-ui-${++nextId}`;\n ids.set(element, value);\n projectionIds.set(element, value);\n }\n return value;\n };\n const style = doc.createElement('style');\n const hidden = `[${marker}]:not([${fadeMarker}])`;\n style.textContent = `${hidden}, ${hidden} *, ${hidden}::before, ${hidden}::after, ${hidden}::part(native) { visibility: hidden !important; }\n [${marker}], [${marker}] * { pointer-events: none !important; }\n /* Ionic disables the covered page while a menu is open. VerticalBars rail\n controls remain outside that page; zero specificity preserves any\n pointer-events rule supplied by the application itself. */\n :where(.menu-content-open) :where([${verticalBarsMarker}]) {\n pointer-events: auto;\n }\n :where(.menu-content-open) :where([${verticalBarsMarker}]) > :where(:not([${verticalBarsMemberMarker}])) {\n pointer-events: none;\n }`;\n\n const restore = (element: HTMLElement) => {\n lastSnapshot = '';\n search.release(element);\n element.removeAttribute(marker);\n if (!stopped) crossfade.play(element, false, handoffInstant || (isVerticalBarsSource(element) && !element.matches('ion-tab-bar')));\n if (element.getAttribute('aria-hidden') === 'true') {\n const previous = sources.get(element);\n if (previous == null) element.removeAttribute('aria-hidden');\n else element.setAttribute('aria-hidden', previous);\n }\n sources.delete(element);\n element.dispatchEvent(new CustomEvent('nativeUIChange'));\n };\n const restoreAll = () => {\n Array.from(sources.keys()).forEach(restore);\n verticalBarsOwners.forEach((element) => element.removeAttribute(verticalBarsMarker));\n verticalBarsOwners.clear();\n verticalBarsMembers.forEach((element) => element.removeAttribute(verticalBarsMemberMarker));\n verticalBarsMembers.clear();\n };\n const finishWaiters = () => {\n const current = waiters;\n waiters = [];\n current.forEach((resolve) => resolve());\n };\n const schedule = () => {\n if (stopped) return;\n dirty = true;\n if (!pending && !frame) frame = win.requestAnimationFrame(() => void sync());\n };\n const search = createSearchSupport(doc, id, schedule);\n const candidateSources = (candidate: Candidate) => candidate.sources ?? [candidate.element];\n const setRejected = (element: HTMLElement, value: boolean) => {\n element.classList.toggle(rejectedClass, value);\n };\n const measuringPointerPages = new WeakSet<HTMLElement>();\n const readEnabledCandidate = (element: HTMLElement): Candidate | undefined => {\n if (options.root && !options.root.contains(element)) return;\n if (element.matches('ion-back-button') && element.closest('ion-app.ios-theme-vertical-bars') && !isVerticalBarsCandidate(element))\n return;\n if (extensions.some((extension) => element.matches(extension.selector))) {\n const extension = extensions.find((definition) => element.matches(definition.selector))!;\n const unavailable = options.unavailableExtensions?.get(extension.name);\n if (unavailable) {\n diagnose(`${extension.name}: ${unavailable}`, element);\n return;\n }\n const candidate = readExtension(element, extensions, id, (reason) => diagnose(`${extension.name}: ${reason}`, element));\n return candidate;\n }\n if (options.source === 'extensions') return;\n if (options.source === 'html' || element.matches(htmlSelector)) {\n const candidate = readHTMLControl(element, id, options);\n if (!candidate) {\n diagnose(\n 'unsupported-control: check the source visibility, accessible name, disabled ancestors, and supported HTML markup.',\n element,\n );\n return;\n }\n const rail = candidate.control.placement === 'vertical-bars';\n if (rail && !nativeVerticalBars()) return;\n return candidate;\n }\n if (element.querySelector(htmlSelector)) return; // A shared automatic surface must not cover explicitly selected descendants.\n if (options.ionic?.auto === false) return;\n if (options.verticalBars?.enabled === false && isVerticalBarsCandidate(element)) return;\n const pointerPage = isVerticalBarsCandidate(element) ? element.closest<HTMLElement>('.ion-page') : undefined;\n let candidate: Candidate | undefined;\n if (pointerPage && getComputedStyle(pointerPage).pointerEvents === 'none') {\n const previous = pointerPage.style.getPropertyValue('pointer-events');\n const priority = pointerPage.style.getPropertyPriority('pointer-events');\n const hadStyle = pointerPage.hasAttribute('style');\n measuringPointerPages.add(pointerPage);\n pointerPage.style.setProperty('pointer-events', 'auto', 'important');\n try {\n candidate = readCandidate(element, id, options);\n } finally {\n if (previous) pointerPage.style.setProperty('pointer-events', previous, priority);\n else pointerPage.style.removeProperty('pointer-events');\n if (!hadStyle && !pointerPage.style.length) pointerPage.removeAttribute('style');\n win.setTimeout(() => measuringPointerPages.delete(pointerPage), 0);\n }\n } else candidate = readCandidate(element, id, options);\n if (candidate && isVerticalBarsCandidate(element) && !element.closest('[data-native-ui-placement=\"element\"]')) {\n if (!nativeVerticalBars()) return undefined;\n candidate.control.placement = 'vertical-bars';\n if (['button', 'button-group', 'menu-button'].includes(candidate.control.kind)) {\n const slot = (element.matches('ion-buttons') ? element : (element.closest('ion-buttons') ?? element)).getAttribute('slot');\n if (slot === 'start' || slot === 'end') candidate.control.toolbarSlot = slot;\n }\n }\n if (!candidate) diagnose('unsupported-control: check the supported Ionic markup, fixed placement, and styling requirements.', element);\n return candidate && controlEnabled(candidate) ? candidate : undefined;\n };\n const flush = async () => {\n if (stopped) return;\n schedule();\n try {\n await bounded(new Promise<void>((resolve) => waiters.push(resolve)));\n } catch (error) {\n await fail(error);\n }\n };\n const blocked = (element: HTMLElement) =>\n verticalBarsPages.isDeparted(element) ||\n (!isVerticalBarsSource(element) &&\n (Array.from(suspended).some((scopes) => scopes.some((scope) => scope.contains(element))) ||\n Array.from(pages).some((scope) => scope.contains(element)) ||\n Array.from(moving.keys()).some((surface) => surface.contains(element))));\n const painted = () => new Promise<void>((resolve) => win.requestAnimationFrame(() => win.requestAnimationFrame(() => resolve())));\n const overlayOpen = (includeMenu = true, allowModal = false, ignoredSelector?: string) => {\n const modal = topModal(doc);\n const ignored = (element: Element) =>\n (!!ignoredSelector && element.matches(ignoredSelector) && !railPopovers.has(element as HTMLElement)) ||\n (allowModal && !!modal && modalUsesVerticalBars(modal) && element.matches('ion-modal'));\n for (const element of presented) if (!element.isConnected) presented.delete(element);\n const presentedOverlayOpen = Array.from(presented).some(\n (element) => !ignored(element) && (includeMenu || !element.matches('ion-menu')),\n );\n return (\n manualSuspensions.size > 0 ||\n presentedOverlayOpen ||\n Array.from(doc.querySelectorAll(overlays)).some(\n (element) =>\n !ignored(element) &&\n (includeMenu || !element.matches('ion-menu')) &&\n ((element as Element & { presented?: boolean }).presented || element.classList.contains('show-menu')),\n )\n );\n };\n // Compare source data before PNG rendering mutates each item's payload.\n const signature = (candidate: Candidate) =>\n JSON.stringify({ control: candidate.control, icons: candidate.icons.map(({ source }) => source), assets: candidate.assets?.signature });\n const read = (): Candidate[] => {\n search.keepSearchTabsVisible();\n for (const page of pages) if (!page.isConnected) pages.delete(page);\n for (const surface of moving.keys()) if (!surface.isConnected) moving.delete(surface);\n if (doc.hidden || overlayOpen(false, true, railPreservingOverlays)) return [];\n if (win.visualViewport && (win.visualViewport.scale !== 1 || win.visualViewport.offsetTop !== 0) && !search.hasActive()) return [];\n const overlayVisible = overlayOpen();\n // Web rail projections also hide their originals. Measure those sources\n // without releasing the visible clones before native acknowledges ownership.\n const measurableSources = new Set([\n ...sources.keys(),\n ...Array.from(scope.querySelectorAll<HTMLElement>(`[${marker}], [data-native-ui-web-source]`)).filter(isVerticalBarsSource),\n ]);\n const candidates = unprojected(measurableSources, () =>\n search\n .decorate(\n Array.from(scope.querySelectorAll<HTMLElement>(discovery))\n .filter(\n (element) =>\n inVerticalBarsSurface(element) &&\n !verticalBarsPages.isDeparted(element) &&\n (!blocked(element) || (overlayVisible && isVerticalBarsSource(element))),\n )\n .map(readEnabledCandidate)\n .filter((candidate): candidate is Candidate => !!candidate),\n blocked,\n )\n .filter((candidate) => !rejected.has(candidate.element) || rejected.get(candidate.element) !== signature(candidate)),\n );\n // An extension owns its entire source subtree. Never project a nested built-in twice.\n const extensionSources = candidates.filter((candidate) => candidate.control.kind === 'extension');\n const exclusive = candidates.filter((candidate) => {\n if (extensionSources.some((owner) => owner !== candidate && owner.element.contains(candidate.element))) return false;\n const tabBarId = candidate.control.extension?.tabBarId;\n if (!tabBarId) return true;\n // Wait for the owning native tab host; do not cache an early rejection while its icons load.\n return (\n candidates.some(\n (owner) => owner.control.id === tabBarId && owner.control.kind === 'tab-bar' && owner.control.placement === 'vertical-bars',\n ) && extensionSources.filter((source) => source.control.extension?.tabBarId === tabBarId).length === 1\n );\n });\n const back = preferredVerticalBarsBack(\n candidates\n .filter((candidate) => candidate.control.kind === 'back-button' && isVerticalBarsCandidate(candidate.element))\n .map((candidate) => candidate.element),\n doc,\n );\n const selected = exclusive.filter(\n (candidate) => candidate.control.kind !== 'back-button' || !isVerticalBarsCandidate(candidate.element) || candidate.element === back,\n );\n return overlayVisible ? selected.filter((candidate) => isVerticalBarsCandidate(candidate.element)) : selected;\n };\n const observe = () => {\n const wanted = new Set<Element | ShadowRoot>();\n for (const element of Array.from(scope.querySelectorAll<HTMLElement>(discovery))) {\n wanted.add(element);\n if (element.parentElement) wanted.add(element.parentElement);\n if (extensions.some((extension) => element.matches(extension.selector))) {\n for (const ancestor of extensionAncestors(element)) {\n wanted.add(ancestor);\n const root = ancestor.getRootNode();\n if (root instanceof ShadowRoot) wanted.add(root);\n }\n }\n const inspectShadow = (node: Element) => {\n if (node.shadowRoot) {\n wanted.add(node.shadowRoot);\n node.shadowRoot.querySelectorAll('ion-icon').forEach(inspectShadow);\n }\n };\n inspectShadow(element);\n element.querySelectorAll(shadowSelector).forEach(inspectShadow);\n }\n // Reconnect only when the set changes; no per-frame observer allocation.\n if (wanted.size === observed.size && Array.from(wanted).every((element) => observed.has(element))) return;\n observer.disconnect();\n resize.disconnect();\n for (const element of observed) if (element instanceof ShadowRoot) element.removeEventListener('scroll', schedule, true);\n observed.clear();\n observer.observe(doc.documentElement, observation);\n for (const element of wanted) {\n observed.add(element);\n if (element instanceof ShadowRoot) {\n observer.observe(element, observation);\n on(element, 'scroll');\n } else resize.observe(element);\n }\n };\n const fail = async (error: unknown) => {\n reason = error instanceof Error ? error.message : String(error);\n console.warn('[Native UI] Returning to Web:', reason);\n const destruction = handle.destroy();\n onStop?.('failure');\n await destruction;\n // The Web fallback re-evaluates eligibility once native projection is stopped.\n win.dispatchEvent(new Event('nativeUIRefresh'));\n };\n const sync = async () => {\n frame = 0;\n dirty = false;\n pending = true;\n if (options.source !== 'extensions') syncToolbarText(doc);\n handoffInstant = tabSwitchHandoff || handoffAcrossPending || modalPresentHandoff || win.performance.now() < handoffUntil;\n try {\n // A retained sync performs no update; keep the modal handoff armed so the\n // deferred retirement still runs instantly after the overlay releases.\n if (retentions.size && !manualSuspensions.size) return;\n modalPresentHandoff = false;\n const size = `${win.innerWidth}:${win.innerHeight}`;\n // WebKit can resize before Ionic's fixed DOM positions catch up.\n // Measure on the next frame instead of retiring a valid native search.\n if (viewport !== size) {\n viewport = size;\n dirty = true;\n return;\n }\n observe();\n let candidates = read();\n const signatures = new Map(candidates.map((candidate) => [candidate.element, signature(candidate)]));\n const failedAssets = new Set<Candidate>();\n for (const candidate of candidates) {\n try {\n await candidate.assets?.render(icons);\n } catch {\n failedAssets.add(candidate);\n diagnose('invalid-assets: image conversion or serialized extension props failed.', candidate.element);\n }\n for (const icon of candidate.icons) {\n const field = icon.field ?? 'icon';\n icon.item[field] = await icons.render(\n icon.source,\n field === 'icon' ? icon.item.iconWidth! : icon.item.closeIconWidth!,\n field === 'icon' ? icon.item.iconHeight! : icon.item.closeIconHeight!,\n );\n }\n }\n candidates = candidates.filter((candidate) => !failedAssets.has(candidate));\n if (stopped || dirty || (retentions.size && !manualSuspensions.size)) return;\n const retained = new Set(candidates.flatMap(candidateSources));\n const removed = Array.from(sources.keys()).filter((element) => !retained.has(element));\n if (removed.some(isVerticalBarsSource)) {\n actions.forEach(forgetVerticalBarFrame);\n try {\n const geometry = await bounded(\n plugin.getVerticalBarsGeometry({ viewportWidth: win.innerWidth, ids: [...actions.keys(), 'BackButton', '__tabBar'] }),\n );\n if (stopped || dirty || (retentions.size && !manualSuspensions.size)) return;\n if (geometry.revision === acceptedRevision && size === `${win.innerWidth}:${win.innerHeight}`) {\n for (const tabBar of removed.filter((element) => element.matches('ion-tab-bar'))) {\n tabGeometry.get(tabBar)?.();\n tabGeometry.delete(tabBar);\n const items = new Map(\n [...actions]\n .filter(\n ([id, element]) => element.parentElement === tabBar && geometry.items[id] && validVerticalBarFrame(geometry.items[id]),\n )\n .map(([id, element]) => [element, geometry.items[id]]),\n );\n if (\n geometry.items['__tabBar'] &&\n validVerticalBarFrame(geometry.items['__tabBar']) &&\n items.size === tabBar.querySelectorAll('ion-tab-button').length\n )\n tabGeometry.set(tabBar, alignVerticalTabBar(tabBar, geometry.items['__tabBar'], items));\n }\n for (const [id, element] of actions) {\n const frame = geometry.items[element.matches('ion-back-button') ? 'BackButton' : id];\n if (frame) rememberVerticalBarFrame(element, frame);\n }\n }\n } catch {\n /* Older native binaries can still use the CSS fallback. */\n }\n }\n if (removed.length) {\n // Restore the source and let WebKit paint before removing its native cover.\n removed.forEach(restore);\n if (removed.some(isVerticalBarsSource))\n win.dispatchEvent(new CustomEvent('nativeUIVerticalBarsRelease', { detail: { instant: handoffInstant } }));\n // The outgoing tab is no longer visible, so waiting two frames only leaves its\n // native snapshot over the destination. Stack transitions still need the paint.\n if (!handoffInstant) {\n await painted();\n if (stopped || dirty) return;\n }\n }\n const root = doc.querySelector('ion-app.ios-theme-vertical-bars');\n const verticalBarEdge: 'left' | 'right' | undefined = options.nativeState?.edge\n ? options.nativeState.edge\n : options.rail\n ? options.rail.edge\n : root\n ? root.classList.contains('ios-theme-vertical-bars-left')\n ? 'left'\n : 'right'\n : undefined;\n const modal = topModal(doc);\n const verticalBarFrame = modal && modalUsesVerticalBars(modal) ? modalVerticalBarFrame(modal) : undefined;\n const data = {\n verticalBarFrame,\n viewportWidth: win.innerWidth,\n verticalBarEdge,\n controls: candidates.map((candidate) => candidate.control),\n };\n const serialized = JSON.stringify(data);\n if (serialized === lastSnapshot && !forceRefresh) return;\n const snapshot: NativeUISnapshot = { ...data, revision: ++revision, transitionDuration: crossfade.duration(handoffInstant) };\n // A native visibility notification during this update must survive its ack.\n forceRefresh = false;\n updates++;\n updatingRevision = snapshot.revision;\n const result = await bounded(plugin.update(snapshot));\n if (stopped || (retentions.size && !manualSuspensions.size)) return;\n if (result.revision !== snapshot.revision) throw new Error('Native UI revision mismatch');\n if (`${win.innerWidth}:${win.innerHeight}` !== size) {\n lastSnapshot = '';\n dirty = true;\n return;\n }\n if (result.rejectedSearches?.length) {\n search.reject(result.rejectedSearches);\n lastSnapshot = '';\n dirty = true;\n }\n for (const candidate of candidates) {\n if (result.rejectedControls?.includes(candidate.control.id)) {\n diagnose(\n 'native-rejected: the native renderer rejected this source; check decoded props, placement, and device support.',\n candidate.element,\n );\n rejected.set(candidate.element, signatures.get(candidate.element)!);\n setRejected(candidate.element, true);\n dirty = true;\n }\n }\n // A page mutation must not tear down unchanged shared controls such as tabs.\n const currentCandidates = dirty ? read() : candidates;\n const current = dirty ? new Map(currentCandidates.map((candidate) => [candidate.element, signature(candidate)])) : signatures;\n const currentSources = new Set(currentCandidates.flatMap(candidateSources));\n const accepted = candidates.filter((candidate) => current.get(candidate.element) === signatures.get(candidate.element));\n accepted.forEach((candidate) => setRejected(candidate.element, false));\n const acceptedVerticalBarsOwners = new Set(\n accepted.filter((candidate) => candidate.control.placement === 'vertical-bars').map((candidate) => candidate.element),\n );\n const acceptedVerticalBarsMembers = new Set(\n accepted\n .filter((candidate) => candidate.control.placement === 'vertical-bars')\n .flatMap((candidate) => Array.from(candidate.actions.values())),\n );\n const invalidated = candidates.length !== accepted.length;\n acceptedRevision = result.revision;\n lastSnapshot = invalidated ? '' : serialized;\n actions = new Map(\n candidates.filter((candidate) => current.has(candidate.element)).flatMap((candidate) => Array.from(candidate.actions)),\n );\n // Keep an existing cover while its content catches up. Only an ineligible\n // source needs to return to Web; new sources still require an exact ack.\n for (const element of sources.keys()) if (!currentSources.has(element)) restore(element);\n for (const element of verticalBarsOwners) {\n if (acceptedVerticalBarsOwners.has(element)) continue;\n element.removeAttribute(verticalBarsMarker);\n verticalBarsOwners.delete(element);\n }\n if (acceptedVerticalBarsOwners.size)\n win.dispatchEvent(new CustomEvent('nativeUIVerticalBarsAcquire', { detail: { instant: handoffInstant } }));\n for (const element of acceptedVerticalBarsOwners) {\n element.setAttribute(verticalBarsMarker, '');\n verticalBarsOwners.add(element);\n }\n for (const element of verticalBarsMembers) {\n if (acceptedVerticalBarsMembers.has(element)) continue;\n element.removeAttribute(verticalBarsMemberMarker);\n verticalBarsMembers.delete(element);\n }\n for (const element of acceptedVerticalBarsMembers) {\n element.setAttribute(verticalBarsMemberMarker, '');\n verticalBarsMembers.add(element);\n }\n for (const element of accepted.flatMap(candidateSources)) {\n const newlyProjected = !sources.has(element) || !element.hasAttribute(marker);\n if (!sources.has(element)) {\n sources.set(element, element.getAttribute('aria-hidden'));\n crossfade.play(element, true, handoffInstant || (isVerticalBarsSource(element) && !element.matches('ion-tab-bar')));\n }\n element.setAttribute(marker, '');\n element.setAttribute('aria-hidden', 'true');\n if (newlyProjected) element.dispatchEvent(new CustomEvent('nativeUIChange'));\n }\n const received = pendingActivations;\n pendingActivations = [];\n received.forEach(activate);\n await crossfade.settled();\n // Geometry belongs to the outgoing tab visual, not to other rail owners.\n // Keep it until that visual has completely faded back to native.\n for (const [tabBar, restore] of tabGeometry) {\n if (!tabBar.isConnected || acceptedVerticalBarsOwners.has(tabBar)) {\n restore();\n tabGeometry.delete(tabBar);\n }\n }\n if (invalidated) {\n dirty = true;\n // Sources that became ineligible must paint before their cover is removed.\n await painted();\n }\n } catch (error) {\n await fail(error);\n } finally {\n updatingRevision = undefined;\n pendingActivations = [];\n // A refresh received before the ack must also invalidate that ack's rejects.\n if (forceRefresh) rejected = new WeakMap();\n // A tab switch mid-update (or a dirty follow-up) must keep instant through the retire sync.\n if (!stopped && (handoffAcrossPending || (handoffInstant && dirty))) {\n handoffUntil = Math.max(handoffUntil, win.performance.now() + 400);\n }\n handoffAcrossPending = false;\n pending = false;\n if (dirty && !stopped) schedule();\n else finishWaiters();\n }\n };\n const observation: MutationObserverInit = {\n subtree: true,\n childList: true,\n characterData: true,\n attributes: true,\n attributeOldValue: true,\n };\n const observer = new MutationObserver((records) => {\n if (\n records.some(\n (record) =>\n record.attributeName !== marker &&\n record.attributeName !== 'data-native-ui-web-source' &&\n record.attributeName !== toolbarTextMarker &&\n record.attributeName !== fadeMarker &&\n !prehideOnlyMutation(record) &&\n !(record.attributeName === 'style' && measuringPointerPages.has(record.target as HTMLElement)) &&\n !(\n record.attributeName === 'aria-hidden' &&\n sources.has(record.target as HTMLElement) &&\n (record.target as Element).getAttribute('aria-hidden') === 'true'\n ),\n )\n )\n schedule();\n });\n const resize = new ResizeObserver(schedule);\n const on = (target: EventTarget, name: string, callback: EventListener = schedule) =>\n target.addEventListener(name, callback, { capture: true, signal: listeners.signal });\n const pageWill: EventListener = (event) => {\n const page = event.target as HTMLElement;\n verticalBarsPages.lifecycle(event);\n getNativeSearchBindings(doc)\n .filter((binding) => page.contains(binding.footer))\n .forEach((binding) => search.retire(binding));\n // Angular updates the URL before willLeave, but keeps ion-tab-bar.selectedTab on the\n // leaving tab until DidChange. A mismatch means this leave is a tab switch, not a stack push.\n if (event.type === LIFECYCLE_WILL_LEAVE) beginTabSwitchHandoffIfNeeded(page);\n pages.add(page);\n schedule();\n };\n const pageDid: EventListener = (event) => {\n const page = event.target as HTMLElement;\n verticalBarsPages.lifecycle(event);\n pages.delete(page);\n schedule();\n if (tabSwitchHandoff && pages.size === 0) endTabSwitchHandoff();\n };\n const tabOfPath = (tabs: Element, pathname: string) => {\n let best: { tab: string; length: number } | undefined;\n for (const button of Array.from(tabs.querySelectorAll('ion-tab-button'))) {\n const tab = button.getAttribute('tab');\n const href = button.getAttribute('href')?.split(/[?#]/)[0];\n if (!tab || !href) continue;\n if (pathname === href || pathname.startsWith(`${href}/`)) {\n if (!best || href.length > best.length) best = { tab, length: href.length };\n }\n }\n return best?.tab;\n };\n const armTabSwitchHandoff = () => {\n tabSwitchHandoff = true;\n // Retiring outgoing controls often lands in a later async sync than WillLeave/DidChange.\n handoffUntil = Math.max(handoffUntil, win.performance.now() + 400);\n // The in-flight sync already captured handoffInstant=false; hold instant for the next one.\n if (pending) handoffAcrossPending = true;\n };\n const beginTabSwitchHandoffIfNeeded = (page: HTMLElement) => {\n const tabs = page.closest('ion-tabs');\n if (!tabs) return;\n const bar = tabs.querySelector('ion-tab-bar');\n const selected =\n (bar && 'selectedTab' in bar ? String((bar as HTMLElement & { selectedTab?: string }).selectedTab ?? '') : '') ||\n tabs.querySelector('ion-tab-button.tab-selected')?.getAttribute('tab') ||\n undefined;\n const destination = tabOfPath(tabs, win.location.pathname);\n if (selected && destination && selected !== destination) armTabSwitchHandoff();\n };\n // DidChange / pageDid can land in the same turn as WillLeave. Clear the sticky flag on the\n // next frame; handoffUntil / handoffAcrossPending still cover the async retire sync.\n const endTabSwitchHandoff = () => {\n win.requestAnimationFrame(() => {\n if (stopped || !tabSwitchHandoff) return;\n tabSwitchHandoff = false;\n schedule();\n });\n };\n const motion: EventListener = (event) => {\n const target = event.target as HTMLElement;\n if (!target.matches?.(`${motionSelector}, ${discovery}`) && !(options.source !== 'ionic' && target.querySelector?.(discovery))) return;\n const key = (event as TransitionEvent).propertyName ?? (event as AnimationEvent).animationName;\n if (event.type === CSS_MOTION_EVENTS.transitionRun || event.type === CSS_MOTION_EVENTS.animationStart) {\n const keys = moving.get(target) ?? new Set<string>();\n keys.add(key);\n moving.set(target, keys);\n } else {\n moving.get(target)?.delete(key);\n if (!moving.get(target)?.size) moving.delete(target);\n }\n schedule();\n };\n for (const name of Object.values(CSS_MOTION_EVENTS)) on(doc, name, motion);\n for (const name of [LIFECYCLE_WILL_ENTER, LIFECYCLE_WILL_LEAVE]) on(doc, name, pageWill);\n for (const name of [LIFECYCLE_DID_ENTER, LIFECYCLE_DID_LEAVE]) on(doc, name, pageDid);\n on(doc, VERTICAL_BARS_TRANSITION_CANCELED, (event) => {\n const leaving = event.target as HTMLElement;\n const entering = (event as CustomEvent<{ entering?: HTMLElement }>).detail?.entering;\n verticalBarsPages.cancel(entering, leaving);\n pages.delete(leaving);\n if (entering) pages.delete(entering);\n schedule();\n });\n on(doc, 'ionTabsWillChange', () => {\n // Vanilla ion-tabs dispatches DOM events; @ionic/angular uses EventEmitters instead.\n armTabSwitchHandoff();\n schedule();\n });\n on(doc, 'ionTabsDidChange', endTabSwitchHandoff);\n const overlayPresenting = (element: HTMLElement) => {\n presented.add(element);\n if (element.matches('ion-popover')) {\n const trigger = popoverTrigger(element as HTMLIonPopoverElement);\n // Remember the source before native ownership changes. A successful native\n // popover retains projection; a Web fallback must retire the rail instead.\n if (trigger?.matches('ion-button') && isVerticalBarsSource(trigger as HTMLElement)) railPopovers.add(element);\n else railPopovers.delete(element);\n }\n if (element.matches('ion-modal')) {\n modalPresentHandoff = true;\n // A pending bridge update must retire the old controls immediately too.\n if (pending) handoffInstant = true;\n }\n schedule();\n };\n // Adoption changes the document, but not the in-flight Ionic event path.\n // Do not replay WillPresent: application handlers must run exactly once.\n on(doc, 'nativeUIOverlayAdopted', (event) => overlayPresenting((event as CustomEvent<HTMLElement>).detail));\n for (const name of overlayNames) {\n on(doc, `ion${name}WillPresent`, (event) => overlayPresenting(event.target as HTMLElement));\n on(doc, `ion${name}DidDismiss`, (event) => {\n presented.delete(event.target as HTMLElement);\n railPopovers.delete(event.target as HTMLElement);\n schedule();\n });\n }\n const eventMenu = (event: Event) =>\n event.composedPath().find((target): target is HTMLElement => target instanceof HTMLElement && target.matches('ion-menu'));\n on(doc, 'ionWillOpen', (event) => {\n const menu = eventMenu(event);\n if (menu) presented.add(menu);\n schedule();\n });\n on(doc, 'ionDidClose', (event) => {\n const menu = eventMenu(event);\n if (menu) presented.delete(menu);\n schedule();\n });\n for (const name of [\n 'ionChange',\n 'ionSelect',\n 'ionImgDidLoad',\n CSS_MOTION_EVENTS.transitionEnd,\n CSS_MOTION_EVENTS.animationEnd,\n 'focusin',\n 'focusout',\n ])\n on(doc, name);\n const refreshLayout = () => {\n rejected = new WeakMap();\n forceRefresh = true;\n schedule();\n };\n on(doc, 'visibilitychange', () => {\n if (doc.hidden) {\n getNativeSearchBindings(doc).forEach((binding) => search.retire(binding));\n schedule();\n } else refreshLayout();\n });\n on(win, 'resize', refreshLayout);\n on(win, 'keyboardWillShow', () => search.keyboard(true));\n on(win, 'keyboardWillHide', () => search.keyboard(false));\n on(win, 'scroll');\n on(win.matchMedia('(prefers-color-scheme: dark)'), 'change');\n on(win, 'nativeUIRefresh', (event) => {\n if ((event as Event & { retireSearch?: boolean }).retireSearch)\n getNativeSearchBindings(doc).forEach((binding) => search.retire(binding));\n refreshLayout();\n });\n if (win.visualViewport) {\n on(win.visualViewport, 'resize', refreshLayout);\n on(win.visualViewport, 'scroll');\n }\n const handle: NativeUIRuntimeHandle & { retain: (deferActivation?: (id: string) => boolean) => () => void } = {\n // A native overlay covers this surface; keep its controls and Web ownership intact.\n retain(deferActivation) {\n const retention: { accepts?: (id: string) => boolean; activation?: NativeUIActivation } = { accepts: deferActivation };\n retentions.add(retention);\n return () => {\n if (!retentions.delete(retention)) return;\n // UIKit may already expose the anchor while Ionic is still dismissing.\n // Replay at most one validated input after the live content is restored.\n const activation = retention.activation;\n if (activation && retention.accepts?.(activation.id)) win.queueMicrotask(() => activate(activation));\n schedule();\n };\n },\n markForCheck: schedule,\n getStatus: (): NativeUIStatus => ({\n state: stopped ? 'stopped' : sources.size ? 'native' : 'web',\n projected: sources.size,\n updates,\n reason,\n }),\n async suspend() {\n const token = Symbol();\n let resumed = false;\n if (!stopped) {\n manualSuspensions.add(token);\n getNativeSearchBindings(doc).forEach((binding) => search.retire(binding));\n await flush();\n }\n return {\n async resume() {\n if (resumed) return;\n resumed = true;\n if (stopped || !manualSuspensions.delete(token)) return;\n await flush();\n },\n };\n },\n destroy() {\n if (destruction) return destruction;\n stopped = true;\n destruction = Promise.resolve().then(async () => {\n tabGeometry.forEach((restore) => restore());\n tabGeometry.clear();\n setNativeUIIntegration(doc);\n win.cancelAnimationFrame(frame);\n listeners.abort();\n observer.disconnect();\n resize.disconnect();\n observed.clear();\n actions.clear();\n pendingActivations = [];\n search.destroy();\n crossfade.destroy();\n restoreAll();\n if (!doc.hidden) await painted();\n try {\n await bounded(plugin.clear({ revision: ++revision }));\n } catch {\n /* Always restore the Web, even after bridge loss. */\n }\n style.remove();\n doc.querySelectorAll<HTMLElement>(`.${rejectedClass}`).forEach((element) => setRejected(element, false));\n icons.clear();\n pages.clear();\n presented.clear();\n manualSuspensions.clear();\n moving.clear();\n suspended.clear();\n if (listener) await bounded(listener.remove()).catch(() => {});\n if (searchListener) await bounded(searchListener.remove()).catch(() => {});\n finishWaiters();\n });\n return destruction;\n },\n };\n const activate = (event: NativeUIActivation) => {\n const accepted = dispatchActivation(event);\n if (event.requestId && accepted !== undefined) {\n void bounded(plugin.completeExtensionAction({ requestId: event.requestId, accepted })).catch(() => {});\n }\n };\n const dispatchActivation = (event: NativeUIActivation): boolean | undefined => {\n if (stopped || doc.hidden || event.revision < acceptedRevision || event.revision > revision || event.sequence <= lastSequence)\n return false;\n const element = actions.get(event.id);\n const owner = element && Array.from(sources.keys()).find((source) => source === element || source.contains(element));\n const ignored = owner && isVerticalBarsSource(owner) ? (retentions.size ? 'ion-toast, ion-picker' : railPreservingOverlays) : undefined;\n if (overlayOpen(false, true, ignored)) {\n if (!manualSuspensions.size) {\n for (const retention of retentions) {\n if (retention.accepts?.(event.id) && (!retention.activation || event.sequence > retention.activation.sequence))\n retention.activation = event;\n }\n }\n return false;\n }\n // Native may send input before update() resolves on the JS bridge.\n // Revalidate it after ownership is accepted, using the same action path.\n if (event.revision > acceptedRevision && event.revision === updatingRevision) {\n pendingActivations.push(event);\n return;\n }\n lastSequence = event.sequence;\n if (!element) return false;\n if (!owner || !inVerticalBarsSurface(owner)) return false;\n const direct = !blocked(owner) && unprojected(sources.keys(), () => readEnabledCandidate(owner));\n const candidate = direct || read().find((candidate) => candidate.actions.has(event.id));\n const item = candidate?.control.items.find((item) => item.id === event.id);\n const searchAction =\n candidate?.control.search && [candidate.control.search.trigger.id, candidate.control.search.closeId].includes(event.id);\n const extensionAction = candidate?.control.kind === 'extension' && candidate.actions.get(event.id) === element;\n if (!extensionAction && !searchAction && (!item || item.disabled || item.visible === false)) return false;\n // The original Ionic host owns form submission, routerLink and selection events.\n activateProjectedElement(element);\n lastSnapshot = ''; // Reconcile even if Ionic rejects the proposed native selection.\n schedule();\n return true;\n };\n try {\n listener = await boundedListener(plugin.addListener('activate', activate));\n searchListener = await boundedListener(\n plugin.addListener('search', (event) => {\n if (\n stopped ||\n doc.hidden ||\n event.revision < acceptedRevision ||\n event.revision > revision ||\n overlayOpen(true, false, nativeVerticalBars() ? (retentions.size ? 'ion-toast, ion-picker' : railPreservingOverlays) : undefined)\n )\n return;\n search.event(event);\n }),\n );\n doc.head.append(style);\n observer.observe(doc.documentElement, observation);\n setNativeUIIntegration(doc, {\n async search(binding, active, focus) {\n if (!getNativeSearchBindings(doc).includes(binding) || !search.projected(binding)) return false;\n if (!active) {\n search.setStatus(binding, false);\n } else {\n const entering = !binding.active;\n if (entering) search.begin(binding, revision + 1);\n const nextFocused = focus === true ? true : focus === false ? false : entering ? false : binding.focused;\n search.setStatus(binding, true, nextFocused);\n }\n await flush();\n return !stopped && search.projected(binding);\n },\n async suspend(scopes) {\n getNativeSearchBindings(doc)\n .filter((binding) => scopes.some((scope) => scope.contains(binding.footer) || scope.contains(binding.tabBar)))\n .forEach((binding) => search.retire(binding));\n suspended.add(scopes);\n await flush();\n // Source DOM has been restored before Ionic starts moving it.\n await new Promise<void>((resolve) => win.requestAnimationFrame(() => resolve()));\n return (canceled = false) => {\n suspended.delete(scopes);\n if (canceled || !scopes.some((scope) => scope.closest('ion-app.ios-theme-vertical-bars'))) {\n scopes.forEach((scope) => pages.delete(scope)); // Preserve ordinary iPhone handoff; cancellation has no DidLeave.\n if (canceled) {\n verticalBarsPages.cancel(scopes[0], scopes[1]); // The entering page is abandoned; the leaving page stays active.\n }\n }\n schedule();\n };\n },\n });\n on(win, 'pagehide', () => {\n void handle.destroy();\n onStop?.('pagehide');\n });\n schedule();\n } catch (error) {\n await fail(error);\n }\n return handle;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AA4CA,MAAM,WAAW;AAEjB,MAAM,yBAAyB;AAC/B,MAAM,eAAe;CAAC;CAAS;CAAW;CAAS;CAAe;CAAW;CAAU;AAAO;AAC9F,MAAM,qBAAqB;AAC3B,MAAM,2BAA2B;AAEjC,MAAa,gBAAgB,OAC3B,KACA,QACA,UAAkC,CAAC,GACnC,2BAA0C,MAC1C,WAC2G;CAC3G,MAAM,MAAM,IAAI;CAChB,MAAM,aAAa,QAAQ,cAAc,CAAC;CAC1C,MAAM,WAAW,kBAAkB,QAAQ,KAAK;CAChD,MAAM,QAAQ,QAAQ,QAAQ;CAC9B,MAAM,YAAY,CAChB,QAAQ,WAAW,eACf,YACA,QAAQ,WAAW,SACjB,eACA,QAAQ,WAAW,SACjB,GAAG,SAAS,IAAI,iBAChB,UACR,GAAG,WAAW,KAAK,cAAc,UAAU,QAAQ,CACrD,CAAC,CAAC,KAAK,IAAI;CACX,MAAM,QAAQ,mBAAmB;CACjC,MAAM,YAAY,gBAAgB,GAAG;CACrC,MAAM,sBAAM,IAAI,QAAyB;CACzC,IAAI,2BAAW,IAAI,QAA6B;CAChD,MAAM,0BAAU,IAAI,IAAgC;CACpD,MAAM,qCAAqB,IAAI,IAAiB;CAChD,MAAM,sCAAsB,IAAI,IAAiB;CACjD,MAAM,4BAAY,IAAI,IAAmB;CACzC,MAAM,wBAAQ,IAAI,IAAiB;CACnC,MAAM,oBAAoB,4BAA4B;CACtD,MAAM,4BAAY,IAAI,IAAiB;CACvC,MAAM,+BAAe,IAAI,QAAqB;CAC9C,MAAM,oCAAoB,IAAI,IAAY;CAC1C,MAAM,yBAAS,IAAI,IAA8B;CACjD,MAAM,2BAAW,IAAI,IAA0B;CAC/C,MAAM,YAAY,IAAI,gBAAgB;CACtC,IAAI,0BAAU,IAAI,IAAyB;CAC3C,IAAI,SAAS;CACb,IAAI,WAAW;CACf,MAAM,8BAAc,IAAI,IAA6B;CACrD,IAAI,mBAAmB;CACvB,IAAI;CACJ,IAAI,qBAA2C,CAAC;CAChD,IAAI,eAAe;CACnB,IAAI,eAAe;CACnB,IAAI,WAAW,GAAG,IAAI,WAAW,GAAG,IAAI;CACxC,IAAI,eAAe;CACnB,IAAI,QAAQ;CACZ,IAAI,UAAU;CACd,IAAI,UAAU;CACd,IAAI;CACJ,MAAM,6BAAa,IAAI,IAA4E;;CAEnG,IAAI,mBAAmB;;CAEvB,IAAI,eAAe;;CAEnB,IAAI,uBAAuB;;CAE3B,IAAI,iBAAiB;;CAErB,IAAI,sBAAsB;CAC1B,IAAI,QAAQ;CACZ,IAAI,UAAU;CACd,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI,UAA0B,CAAC;CAC/B,MAAM,kBAAkB,cAAyB;EAC/C,MAAM,OAAO,UAAU,QAAQ;EAG/B,MAAM,MAAM,SAAS,YAAY,SAAS,SAAS,YAAY,YAAY,SAAS,2BAA2B,QAAQ,KAAA;EACvH,OAAO,CAAC,OAAO,gBAAgB,UAAU,SAAS,SAAS,KAAK,UAAU,QAAQ,cAAc,eAAe;CACjH;CACA,MAAM,MAAM,YAAqB;EAC/B,IAAI,QAAQ,IAAI,IAAI,OAAO;EAC3B,IAAI,CAAC,OAAO;GACV,QAAQ,aAAa,EAAE;GACvB,IAAI,IAAI,SAAS,KAAK;GACtB,cAAc,IAAI,SAAS,KAAK;EAClC;EACA,OAAO;CACT;CACA,MAAM,QAAQ,IAAI,cAAc,OAAO;CACvC,MAAM,SAAS,IAAI,OAAO,SAAS,WAAW;CAC9C,MAAM,cAAc,GAAG,OAAO,IAAI,OAAO,MAAM,OAAO,YAAY,OAAO,WAAW,OAAO;OACtF,OAAO,MAAM,OAAO;;;;yCAIc,mBAAmB;;;yCAGnB,mBAAmB,oBAAoB,yBAAyB;;;CAIvG,MAAM,WAAW,YAAyB;EACxC,eAAe;EACf,OAAO,QAAQ,OAAO;EACtB,QAAQ,gBAAgB,MAAM;EAC9B,IAAI,CAAC,SAAS,UAAU,KAAK,SAAS,OAAO,kBAAmB,qBAAqB,OAAO,KAAK,CAAC,QAAQ,QAAQ,aAAa,CAAE;EACjI,IAAI,QAAQ,aAAa,aAAa,MAAM,QAAQ;GAClD,MAAM,WAAW,QAAQ,IAAI,OAAO;GACpC,IAAI,YAAY,MAAM,QAAQ,gBAAgB,aAAa;QACtD,QAAQ,aAAa,eAAe,QAAQ;EACnD;EACA,QAAQ,OAAO,OAAO;EACtB,QAAQ,cAAc,IAAI,YAAY,gBAAgB,CAAC;CACzD;CACA,MAAM,mBAAmB;EACvB,MAAM,KAAK,QAAQ,KAAK,CAAC,CAAC,CAAC,QAAQ,OAAO;EAC1C,mBAAmB,SAAS,YAAY,QAAQ,gBAAgB,kBAAkB,CAAC;EACnF,mBAAmB,MAAM;EACzB,oBAAoB,SAAS,YAAY,QAAQ,gBAAgB,wBAAwB,CAAC;EAC1F,oBAAoB,MAAM;CAC5B;CACA,MAAM,sBAAsB;EAC1B,MAAM,UAAU;EAChB,UAAU,CAAC;EACX,QAAQ,SAAS,YAAY,QAAQ,CAAC;CACxC;CACA,MAAM,iBAAiB;EACrB,IAAI,SAAS;EACb,QAAQ;EACR,IAAI,CAAC,WAAW,CAAC,OAAO,QAAQ,IAAI,4BAA4B,KAAK,KAAK,CAAC;CAC7E;CACA,MAAM,SAAS,oBAAoB,KAAK,IAAI,QAAQ;CACpD,MAAM,oBAAoB,cAAyB,UAAU,WAAW,CAAC,UAAU,OAAO;CAC1F,MAAM,eAAe,SAAsB,UAAmB;EAC5D,QAAQ,UAAU,OAAO,eAAe,KAAK;CAC/C;CACA,MAAM,wCAAwB,IAAI,QAAqB;CACvD,MAAM,wBAAwB,YAAgD;EAC5E,IAAI,QAAQ,QAAQ,CAAC,QAAQ,KAAK,SAAS,OAAO,GAAG;EACrD,IAAI,QAAQ,QAAQ,iBAAiB,KAAK,QAAQ,QAAQ,iCAAiC,KAAK,CAAC,wBAAwB,OAAO,GAC9H;EACF,IAAI,WAAW,MAAM,cAAc,QAAQ,QAAQ,UAAU,QAAQ,CAAC,GAAG;GACvE,MAAM,YAAY,WAAW,MAAM,eAAe,QAAQ,QAAQ,WAAW,QAAQ,CAAC;GACtF,MAAM,cAAc,QAAQ,uBAAuB,IAAI,UAAU,IAAI;GACrE,IAAI,aAAa;IACf,SAAS,GAAG,UAAU,KAAK,IAAI,eAAe,OAAO;IACrD;GACF;GAEA,OADkB,cAAc,SAAS,YAAY,KAAK,WAAW,SAAS,GAAG,UAAU,KAAK,IAAI,UAAU,OAAO,CACtG;EACjB;EACA,IAAI,QAAQ,WAAW,cAAc;EACrC,IAAI,QAAQ,WAAW,UAAU,QAAQ,QAAA,+DAAoB,GAAG;GAC9D,MAAM,YAAY,gBAAgB,SAAS,IAAI,OAAO;GACtD,IAAI,CAAC,WAAW;IACd,SACE,qHACA,OACF;IACA;GACF;GAEA,IADa,UAAU,QAAQ,cAAc,mBACjC,CAAC,mBAAmB,GAAG;GACnC,OAAO;EACT;EACA,IAAI,QAAQ,cAAA,+DAA0B,GAAG;EACzC,IAAI,QAAQ,OAAO,SAAS,OAAO;EACnC,IAAI,QAAQ,cAAc,YAAY,SAAS,wBAAwB,OAAO,GAAG;EACjF,MAAM,cAAc,wBAAwB,OAAO,IAAI,QAAQ,QAAqB,WAAW,IAAI,KAAA;EACnG,IAAI;EACJ,IAAI,eAAe,iBAAiB,WAAW,CAAC,CAAC,kBAAkB,QAAQ;GACzE,MAAM,WAAW,YAAY,MAAM,iBAAiB,gBAAgB;GACpE,MAAM,WAAW,YAAY,MAAM,oBAAoB,gBAAgB;GACvE,MAAM,WAAW,YAAY,aAAa,OAAO;GACjD,sBAAsB,IAAI,WAAW;GACrC,YAAY,MAAM,YAAY,kBAAkB,QAAQ,WAAW;GACnE,IAAI;IACF,YAAY,cAAc,SAAS,IAAI,OAAO;GAChD,UAAU;IACR,IAAI,UAAU,YAAY,MAAM,YAAY,kBAAkB,UAAU,QAAQ;SAC3E,YAAY,MAAM,eAAe,gBAAgB;IACtD,IAAI,CAAC,YAAY,CAAC,YAAY,MAAM,QAAQ,YAAY,gBAAgB,OAAO;IAC/E,IAAI,iBAAiB,sBAAsB,OAAO,WAAW,GAAG,CAAC;GACnE;EACF,OAAO,YAAY,cAAc,SAAS,IAAI,OAAO;EACrD,IAAI,aAAa,wBAAwB,OAAO,KAAK,CAAC,QAAQ,QAAQ,wCAAsC,GAAG;GAC7G,IAAI,CAAC,mBAAmB,GAAG,OAAO,KAAA;GAClC,UAAU,QAAQ,YAAY;GAC9B,IAAI;IAAC;IAAU;IAAgB;GAAa,CAAC,CAAC,SAAS,UAAU,QAAQ,IAAI,GAAG;IAC9E,MAAM,QAAQ,QAAQ,QAAQ,aAAa,IAAI,UAAW,QAAQ,QAAQ,aAAa,KAAK,QAAA,CAAU,aAAa,MAAM;IACzH,IAAI,SAAS,WAAW,SAAS,OAAO,UAAU,QAAQ,cAAc;GAC1E;EACF;EACA,IAAI,CAAC,WAAW,SAAS,qGAAqG,OAAO;EACrI,OAAO,aAAa,eAAe,SAAS,IAAI,YAAY,KAAA;CAC9D;CACA,MAAM,QAAQ,YAAY;EACxB,IAAI,SAAS;EACb,SAAS;EACT,IAAI;GACF,MAAM,QAAQ,IAAI,SAAe,YAAY,QAAQ,KAAK,OAAO,CAAC,CAAC;EACrE,SAAS,OAAO;GACd,MAAM,KAAK,KAAK;EAClB;CACF;CACA,MAAM,WAAW,YACf,kBAAkB,WAAW,OAAO,KACnC,CAAC,qBAAqB,OAAO,MAC3B,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,WAAW,OAAO,MAAM,UAAU,MAAM,SAAS,OAAO,CAAC,CAAC,KACrF,MAAM,KAAK,KAAK,CAAC,CAAC,MAAM,UAAU,MAAM,SAAS,OAAO,CAAC,KACzD,MAAM,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,YAAY,QAAQ,SAAS,OAAO,CAAC;CAC3E,MAAM,gBAAgB,IAAI,SAAe,YAAY,IAAI,4BAA4B,IAAI,4BAA4B,QAAQ,CAAC,CAAC,CAAC;CAChI,MAAM,eAAe,cAAc,MAAM,aAAa,OAAO,oBAA6B;EACxF,MAAM,QAAQ,SAAS,GAAG;EAC1B,MAAM,WAAW,YACd,CAAC,CAAC,mBAAmB,QAAQ,QAAQ,eAAe,KAAK,CAAC,aAAa,IAAI,OAAsB,KACjG,cAAc,CAAC,CAAC,SAAS,sBAAsB,KAAK,KAAK,QAAQ,QAAQ,WAAW;EACvF,KAAK,MAAM,WAAW,WAAW,IAAI,CAAC,QAAQ,aAAa,UAAU,OAAO,OAAO;EACnF,MAAM,uBAAuB,MAAM,KAAK,SAAS,CAAC,CAAC,MAChD,YAAY,CAAC,QAAQ,OAAO,MAAM,eAAe,CAAC,QAAQ,QAAQ,UAAU,EAC/E;EACA,OACE,kBAAkB,OAAO,KACzB,wBACA,MAAM,KAAK,IAAI,iBAAiB,QAAQ,CAAC,CAAC,CAAC,MACxC,YACC,CAAC,QAAQ,OAAO,MACf,eAAe,CAAC,QAAQ,QAAQ,UAAU,OACzC,QAA8C,aAAa,QAAQ,UAAU,SAAS,WAAW,EACvG;CAEJ;CAEA,MAAM,aAAa,cACjB,KAAK,UAAU;EAAE,SAAS,UAAU;EAAS,OAAO,UAAU,MAAM,KAAK,EAAE,aAAa,MAAM;EAAG,QAAQ,UAAU,QAAQ;CAAU,CAAC;CACxI,MAAM,aAA0B;EAC9B,OAAO,sBAAsB;EAC7B,KAAK,MAAM,QAAQ,OAAO,IAAI,CAAC,KAAK,aAAa,MAAM,OAAO,IAAI;EAClE,KAAK,MAAM,WAAW,OAAO,KAAK,GAAG,IAAI,CAAC,QAAQ,aAAa,OAAO,OAAO,OAAO;EACpF,IAAI,IAAI,UAAU,YAAY,OAAO,MAAM,sBAAsB,GAAG,OAAO,CAAC;EAC5E,IAAI,IAAI,mBAAmB,IAAI,eAAe,UAAU,KAAK,IAAI,eAAe,cAAc,MAAM,CAAC,OAAO,UAAU,GAAG,OAAO,CAAC;EACjI,MAAM,iBAAiB,YAAY;EAGnC,MAAM,oCAAoB,IAAI,IAAI,CAChC,GAAG,QAAQ,KAAK,GAChB,GAAG,MAAM,KAAK,MAAM,iBAA8B,IAAI,OAAO,+BAA+B,CAAC,CAAC,CAAC,OAAO,oBAAoB,CAC5H,CAAC;EACD,MAAM,aAAa,YAAY,yBAC7B,OACG,SACC,MAAM,KAAK,MAAM,iBAA8B,SAAS,CAAC,CAAC,CACvD,QACE,YACC,sBAAsB,OAAO,KAC7B,CAAC,kBAAkB,WAAW,OAAO,MACpC,CAAC,QAAQ,OAAO,KAAM,kBAAkB,qBAAqB,OAAO,EACzE,CAAC,CACA,IAAI,oBAAoB,CAAC,CACzB,QAAQ,cAAsC,CAAC,CAAC,SAAS,GAC5D,OACF,CAAC,CACA,QAAQ,cAAc,CAAC,SAAS,IAAI,UAAU,OAAO,KAAK,SAAS,IAAI,UAAU,OAAO,MAAM,UAAU,SAAS,CAAC,CACvH;EAEA,MAAM,mBAAmB,WAAW,QAAQ,cAAc,UAAU,QAAQ,SAAS,WAAW;EAChG,MAAM,YAAY,WAAW,QAAQ,cAAc;GACjD,IAAI,iBAAiB,MAAM,UAAU,UAAU,aAAa,MAAM,QAAQ,SAAS,UAAU,OAAO,CAAC,GAAG,OAAO;GAC/G,MAAM,WAAW,UAAU,QAAQ,WAAW;GAC9C,IAAI,CAAC,UAAU,OAAO;GAEtB,OACE,WAAW,MACR,UAAU,MAAM,QAAQ,OAAO,YAAY,MAAM,QAAQ,SAAS,aAAa,MAAM,QAAQ,cAAc,eAC9G,KAAK,iBAAiB,QAAQ,WAAW,OAAO,QAAQ,WAAW,aAAa,QAAQ,CAAC,CAAC,WAAW;EAEzG,CAAC;EACD,MAAM,OAAO,0BACX,WACG,QAAQ,cAAc,UAAU,QAAQ,SAAS,iBAAiB,wBAAwB,UAAU,OAAO,CAAC,CAAC,CAC7G,KAAK,cAAc,UAAU,OAAO,GACvC,GACF;EACA,MAAM,WAAW,UAAU,QACxB,cAAc,UAAU,QAAQ,SAAS,iBAAiB,CAAC,wBAAwB,UAAU,OAAO,KAAK,UAAU,YAAY,IAClI;EACA,OAAO,iBAAiB,SAAS,QAAQ,cAAc,wBAAwB,UAAU,OAAO,CAAC,IAAI;CACvG;CACA,MAAM,gBAAgB;EACpB,MAAM,yBAAS,IAAI,IAA0B;EAC7C,KAAK,MAAM,WAAW,MAAM,KAAK,MAAM,iBAA8B,SAAS,CAAC,GAAG;GAChF,OAAO,IAAI,OAAO;GAClB,IAAI,QAAQ,eAAe,OAAO,IAAI,QAAQ,aAAa;GAC3D,IAAI,WAAW,MAAM,cAAc,QAAQ,QAAQ,UAAU,QAAQ,CAAC,GACpE,KAAK,MAAM,YAAYA,oBAAmB,OAAO,GAAG;IAClD,OAAO,IAAI,QAAQ;IACnB,MAAM,OAAO,SAAS,YAAY;IAClC,IAAI,gBAAgB,YAAY,OAAO,IAAI,IAAI;GACjD;GAEF,MAAM,iBAAiB,SAAkB;IACvC,IAAI,KAAK,YAAY;KACnB,OAAO,IAAI,KAAK,UAAU;KAC1B,KAAK,WAAW,iBAAiB,UAAU,CAAC,CAAC,QAAQ,aAAa;IACpE;GACF;GACA,cAAc,OAAO;GACrB,QAAQ,iBAAiB,cAAc,CAAC,CAAC,QAAQ,aAAa;EAChE;EAEA,IAAI,OAAO,SAAS,SAAS,QAAQ,MAAM,KAAK,MAAM,CAAC,CAAC,OAAO,YAAY,SAAS,IAAI,OAAO,CAAC,GAAG;EACnG,SAAS,WAAW;EACpB,OAAO,WAAW;EAClB,KAAK,MAAM,WAAW,UAAU,IAAI,mBAAmB,YAAY,QAAQ,oBAAoB,UAAU,UAAU,IAAI;EACvH,SAAS,MAAM;EACf,SAAS,QAAQ,IAAI,iBAAiB,WAAW;EACjD,KAAK,MAAM,WAAW,QAAQ;GAC5B,SAAS,IAAI,OAAO;GACpB,IAAI,mBAAmB,YAAY;IACjC,SAAS,QAAQ,SAAS,WAAW;IACrC,GAAG,SAAS,QAAQ;GACtB,OAAO,OAAO,QAAQ,OAAO;EAC/B;CACF;CACA,MAAM,OAAO,OAAO,UAAmB;EACrC,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EAC9D,QAAQ,KAAK,iCAAiC,MAAM;EACpD,MAAM,cAAc,OAAO,QAAQ;EACnC,SAAS,SAAS;EAClB,MAAM;EAEN,IAAI,cAAc,IAAI,MAAM,iBAAiB,CAAC;CAChD;CACA,MAAM,OAAO,YAAY;EACvB,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,IAAI,QAAQ,WAAW,cAAc,gBAAgB,GAAG;EACxD,iBAAiB,oBAAoB,wBAAwB,uBAAuB,IAAI,YAAY,IAAI,IAAI;EAC5G,IAAI;GAGF,IAAI,WAAW,QAAQ,CAAC,kBAAkB,MAAM;GAChD,sBAAsB;GACtB,MAAM,OAAO,GAAG,IAAI,WAAW,GAAG,IAAI;GAGtC,IAAI,aAAa,MAAM;IACrB,WAAW;IACX,QAAQ;IACR;GACF;GACA,QAAQ;GACR,IAAI,aAAa,KAAK;GACtB,MAAM,aAAa,IAAI,IAAI,WAAW,KAAK,cAAc,CAAC,UAAU,SAAS,UAAU,SAAS,CAAC,CAAC,CAAC;GACnG,MAAM,+BAAe,IAAI,IAAe;GACxC,KAAK,MAAM,aAAa,YAAY;IAClC,IAAI;KACF,MAAM,UAAU,QAAQ,OAAO,KAAK;IACtC,QAAQ;KACN,aAAa,IAAI,SAAS;KAC1B,SAAS,0EAA0E,UAAU,OAAO;IACtG;IACA,KAAK,MAAM,QAAQ,UAAU,OAAO;KAClC,MAAM,QAAQ,KAAK,SAAS;KAC5B,KAAK,KAAK,SAAS,MAAM,MAAM,OAC7B,KAAK,QACL,UAAU,SAAS,KAAK,KAAK,YAAa,KAAK,KAAK,gBACpD,UAAU,SAAS,KAAK,KAAK,aAAc,KAAK,KAAK,eACvD;IACF;GACF;GACA,aAAa,WAAW,QAAQ,cAAc,CAAC,aAAa,IAAI,SAAS,CAAC;GAC1E,IAAI,WAAW,SAAU,WAAW,QAAQ,CAAC,kBAAkB,MAAO;GACtE,MAAM,WAAW,IAAI,IAAI,WAAW,QAAQ,gBAAgB,CAAC;GAC7D,MAAM,UAAU,MAAM,KAAK,QAAQ,KAAK,CAAC,CAAC,CAAC,QAAQ,YAAY,CAAC,SAAS,IAAI,OAAO,CAAC;GACrF,IAAI,QAAQ,KAAK,oBAAoB,GAAG;IACtC,QAAQ,QAAQ,sBAAsB;IACtC,IAAI;KACF,MAAM,WAAW,MAAM,QACrB,OAAO,wBAAwB;MAAE,eAAe,IAAI;MAAY,KAAK;OAAC,GAAG,QAAQ,KAAK;OAAG;OAAc;MAAU;KAAE,CAAC,CACtH;KACA,IAAI,WAAW,SAAU,WAAW,QAAQ,CAAC,kBAAkB,MAAO;KACtE,IAAI,SAAS,aAAa,oBAAoB,SAAS,GAAG,IAAI,WAAW,GAAG,IAAI,eAAe;MAC7F,KAAK,MAAM,UAAU,QAAQ,QAAQ,YAAY,QAAQ,QAAQ,aAAa,CAAC,GAAG;OAChF,YAAY,IAAI,MAAM,CAAC,GAAG;OAC1B,YAAY,OAAO,MAAM;OACzB,MAAM,QAAQ,IAAI,IAChB,CAAC,GAAG,OAAO,CAAC,CACT,QACE,CAAC,IAAI,aAAa,QAAQ,kBAAkB,UAAU,SAAS,MAAM,OAAO,sBAAsB,SAAS,MAAM,GAAG,CACvH,CAAC,CACA,KAAK,CAAC,IAAI,aAAa,CAAC,SAAS,SAAS,MAAM,GAAG,CAAC,CACzD;OACA,IACE,SAAS,MAAM,eACf,sBAAsB,SAAS,MAAM,WAAW,KAChD,MAAM,SAAS,OAAO,iBAAiB,gBAAgB,CAAC,CAAC,QAEzD,YAAY,IAAI,QAAQ,oBAAoB,QAAQ,SAAS,MAAM,aAAa,KAAK,CAAC;MAC1F;MACA,KAAK,MAAM,CAAC,IAAI,YAAY,SAAS;OACnC,MAAM,QAAQ,SAAS,MAAM,QAAQ,QAAQ,iBAAiB,IAAI,eAAe;OACjF,IAAI,OAAO,yBAAyB,SAAS,KAAK;MACpD;KACF;IACF,QAAQ,CAER;GACF;GACA,IAAI,QAAQ,QAAQ;IAElB,QAAQ,QAAQ,OAAO;IACvB,IAAI,QAAQ,KAAK,oBAAoB,GACnC,IAAI,cAAc,IAAI,YAAY,+BAA+B,EAAE,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC,CAAC;IAG3G,IAAI,CAAC,gBAAgB;KACnB,MAAM,QAAQ;KACd,IAAI,WAAW,OAAO;IACxB;GACF;GACA,MAAM,OAAO,IAAI,cAAc,iCAAiC;GAChE,MAAM,kBAAgD,QAAQ,aAAa,OACvE,QAAQ,YAAY,OACpB,QAAQ,OACN,QAAQ,KAAK,OACb,OACE,KAAK,UAAU,SAAS,8BAA8B,IACpD,SACA,UACF,KAAA;GACR,MAAM,QAAQ,SAAS,GAAG;GAE1B,MAAM,OAAO;IACX,kBAFuB,SAAS,sBAAsB,KAAK,IAAI,sBAAsB,KAAK,IAAI,KAAA;IAG9F,eAAe,IAAI;IACnB;IACA,UAAU,WAAW,KAAK,cAAc,UAAU,OAAO;GAC3D;GACA,MAAM,aAAa,KAAK,UAAU,IAAI;GACtC,IAAI,eAAe,gBAAgB,CAAC,cAAc;GAClD,MAAM,WAA6B;IAAE,GAAG;IAAM,UAAU,EAAE;IAAU,oBAAoB,UAAU,SAAS,cAAc;GAAE;GAE3H,eAAe;GACf;GACA,mBAAmB,SAAS;GAC5B,MAAM,SAAS,MAAM,QAAQ,OAAO,OAAO,QAAQ,CAAC;GACpD,IAAI,WAAY,WAAW,QAAQ,CAAC,kBAAkB,MAAO;GAC7D,IAAI,OAAO,aAAa,SAAS,UAAU,MAAM,IAAI,MAAM,6BAA6B;GACxF,IAAI,GAAG,IAAI,WAAW,GAAG,IAAI,kBAAkB,MAAM;IACnD,eAAe;IACf,QAAQ;IACR;GACF;GACA,IAAI,OAAO,kBAAkB,QAAQ;IACnC,OAAO,OAAO,OAAO,gBAAgB;IACrC,eAAe;IACf,QAAQ;GACV;GACA,KAAK,MAAM,aAAa,YACtB,IAAI,OAAO,kBAAkB,SAAS,UAAU,QAAQ,EAAE,GAAG;IAC3D,SACE,kHACA,UAAU,OACZ;IACA,SAAS,IAAI,UAAU,SAAS,WAAW,IAAI,UAAU,OAAO,CAAE;IAClE,YAAY,UAAU,SAAS,IAAI;IACnC,QAAQ;GACV;GAGF,MAAM,oBAAoB,QAAQ,KAAK,IAAI;GAC3C,MAAM,UAAU,QAAQ,IAAI,IAAI,kBAAkB,KAAK,cAAc,CAAC,UAAU,SAAS,UAAU,SAAS,CAAC,CAAC,CAAC,IAAI;GACnH,MAAM,iBAAiB,IAAI,IAAI,kBAAkB,QAAQ,gBAAgB,CAAC;GAC1E,MAAM,WAAW,WAAW,QAAQ,cAAc,QAAQ,IAAI,UAAU,OAAO,MAAM,WAAW,IAAI,UAAU,OAAO,CAAC;GACtH,SAAS,SAAS,cAAc,YAAY,UAAU,SAAS,KAAK,CAAC;GACrE,MAAM,6BAA6B,IAAI,IACrC,SAAS,QAAQ,cAAc,UAAU,QAAQ,cAAc,eAAe,CAAC,CAAC,KAAK,cAAc,UAAU,OAAO,CACtH;GACA,MAAM,8BAA8B,IAAI,IACtC,SACG,QAAQ,cAAc,UAAU,QAAQ,cAAc,eAAe,CAAC,CACtE,SAAS,cAAc,MAAM,KAAK,UAAU,QAAQ,OAAO,CAAC,CAAC,CAClE;GACA,MAAM,cAAc,WAAW,WAAW,SAAS;GACnD,mBAAmB,OAAO;GAC1B,eAAe,cAAc,KAAK;GAClC,UAAU,IAAI,IACZ,WAAW,QAAQ,cAAc,QAAQ,IAAI,UAAU,OAAO,CAAC,CAAC,CAAC,SAAS,cAAc,MAAM,KAAK,UAAU,OAAO,CAAC,CACvH;GAGA,KAAK,MAAM,WAAW,QAAQ,KAAK,GAAG,IAAI,CAAC,eAAe,IAAI,OAAO,GAAG,QAAQ,OAAO;GACvF,KAAK,MAAM,WAAW,oBAAoB;IACxC,IAAI,2BAA2B,IAAI,OAAO,GAAG;IAC7C,QAAQ,gBAAgB,kBAAkB;IAC1C,mBAAmB,OAAO,OAAO;GACnC;GACA,IAAI,2BAA2B,MAC7B,IAAI,cAAc,IAAI,YAAY,+BAA+B,EAAE,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC,CAAC;GAC3G,KAAK,MAAM,WAAW,4BAA4B;IAChD,QAAQ,aAAa,oBAAoB,EAAE;IAC3C,mBAAmB,IAAI,OAAO;GAChC;GACA,KAAK,MAAM,WAAW,qBAAqB;IACzC,IAAI,4BAA4B,IAAI,OAAO,GAAG;IAC9C,QAAQ,gBAAgB,wBAAwB;IAChD,oBAAoB,OAAO,OAAO;GACpC;GACA,KAAK,MAAM,WAAW,6BAA6B;IACjD,QAAQ,aAAa,0BAA0B,EAAE;IACjD,oBAAoB,IAAI,OAAO;GACjC;GACA,KAAK,MAAM,WAAW,SAAS,QAAQ,gBAAgB,GAAG;IACxD,MAAM,iBAAiB,CAAC,QAAQ,IAAI,OAAO,KAAK,CAAC,QAAQ,aAAA,0BAAmB;IAC5E,IAAI,CAAC,QAAQ,IAAI,OAAO,GAAG;KACzB,QAAQ,IAAI,SAAS,QAAQ,aAAa,aAAa,CAAC;KACxD,UAAU,KAAK,SAAS,MAAM,kBAAmB,qBAAqB,OAAO,KAAK,CAAC,QAAQ,QAAQ,aAAa,CAAE;IACpH;IACA,QAAQ,aAAa,QAAQ,EAAE;IAC/B,QAAQ,aAAa,eAAe,MAAM;IAC1C,IAAI,gBAAgB,QAAQ,cAAc,IAAI,YAAY,gBAAgB,CAAC;GAC7E;GACA,MAAM,WAAW;GACjB,qBAAqB,CAAC;GACtB,SAAS,QAAQ,QAAQ;GACzB,MAAM,UAAU,QAAQ;GAGxB,KAAK,MAAM,CAAC,QAAQ,YAAY,aAC9B,IAAI,CAAC,OAAO,eAAe,2BAA2B,IAAI,MAAM,GAAG;IACjE,QAAQ;IACR,YAAY,OAAO,MAAM;GAC3B;GAEF,IAAI,aAAa;IACf,QAAQ;IAER,MAAM,QAAQ;GAChB;EACF,SAAS,OAAO;GACd,MAAM,KAAK,KAAK;EAClB,UAAU;GACR,mBAAmB,KAAA;GACnB,qBAAqB,CAAC;GAEtB,IAAI,cAAc,2BAAW,IAAI,QAAQ;GAEzC,IAAI,CAAC,YAAY,wBAAyB,kBAAkB,QAC1D,eAAe,KAAK,IAAI,cAAc,IAAI,YAAY,IAAI,IAAI,GAAG;GAEnE,uBAAuB;GACvB,UAAU;GACV,IAAI,SAAS,CAAC,SAAS,SAAS;QAC3B,cAAc;EACrB;CACF;CACA,MAAM,cAAoC;EACxC,SAAS;EACT,WAAW;EACX,eAAe;EACf,YAAY;EACZ,mBAAmB;CACrB;CACA,MAAM,WAAW,IAAI,kBAAkB,YAAY;EACjD,IACE,QAAQ,MACL,WACC,OAAO,kBAAA,8BACP,OAAO,kBAAkB,+BACzB,OAAO,kBAAA,iCACP,OAAO,kBAAA,2BACP,CAAC,oBAAoB,MAAM,KAC3B,EAAE,OAAO,kBAAkB,WAAW,sBAAsB,IAAI,OAAO,MAAqB,MAC5F,EACE,OAAO,kBAAkB,iBACzB,QAAQ,IAAI,OAAO,MAAqB,KACvC,OAAO,OAAmB,aAAa,aAAa,MAAM,OAEjE,GAEA,SAAS;CACb,CAAC;CACD,MAAM,SAAS,IAAI,eAAe,QAAQ;CAC1C,MAAM,MAAM,QAAqB,MAAc,WAA0B,aACvE,OAAO,iBAAiB,MAAM,UAAU;EAAE,SAAS;EAAM,QAAQ,UAAU;CAAO,CAAC;CACrF,MAAM,YAA2B,UAAU;EACzC,MAAM,OAAO,MAAM;EACnB,kBAAkB,UAAU,KAAK;EACjC,wBAAwB,GAAG,CAAC,CACzB,QAAQ,YAAY,KAAK,SAAS,QAAQ,MAAM,CAAC,CAAC,CAClD,SAAS,YAAY,OAAO,OAAO,OAAO,CAAC;EAG9C,IAAI,MAAM,SAAA,oBAA+B,8BAA8B,IAAI;EAC3E,MAAM,IAAI,IAAI;EACd,SAAS;CACX;CACA,MAAM,WAA0B,UAAU;EACxC,MAAM,OAAO,MAAM;EACnB,kBAAkB,UAAU,KAAK;EACjC,MAAM,OAAO,IAAI;EACjB,SAAS;EACT,IAAI,oBAAoB,MAAM,SAAS,GAAG,oBAAoB;CAChE;CACA,MAAM,aAAa,MAAe,aAAqB;EACrD,IAAI;EACJ,KAAK,MAAM,UAAU,MAAM,KAAK,KAAK,iBAAiB,gBAAgB,CAAC,GAAG;GACxE,MAAM,MAAM,OAAO,aAAa,KAAK;GACrC,MAAM,OAAO,OAAO,aAAa,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,CAAC;GACxD,IAAI,CAAC,OAAO,CAAC,MAAM;GACnB,IAAI,aAAa,QAAQ,SAAS,WAAW,GAAG,KAAK,EAAE,GACjD;QAAA,CAAC,QAAQ,KAAK,SAAS,KAAK,QAAQ,OAAO;KAAE;KAAK,QAAQ,KAAK;IAAO;GAAA;EAE9E;EACA,OAAO,MAAM;CACf;CACA,MAAM,4BAA4B;EAChC,mBAAmB;EAEnB,eAAe,KAAK,IAAI,cAAc,IAAI,YAAY,IAAI,IAAI,GAAG;EAEjE,IAAI,SAAS,uBAAuB;CACtC;CACA,MAAM,iCAAiC,SAAsB;EAC3D,MAAM,OAAO,KAAK,QAAQ,UAAU;EACpC,IAAI,CAAC,MAAM;EACX,MAAM,MAAM,KAAK,cAAc,aAAa;EAC5C,MAAM,YACH,OAAO,iBAAiB,MAAM,OAAQ,IAA+C,eAAe,EAAE,IAAI,OAC3G,KAAK,cAAc,6BAA6B,CAAC,EAAE,aAAa,KAAK,KACrE,KAAA;EACF,MAAM,cAAc,UAAU,MAAM,IAAI,SAAS,QAAQ;EACzD,IAAI,YAAY,eAAe,aAAa,aAAa,oBAAoB;CAC/E;CAGA,MAAM,4BAA4B;EAChC,IAAI,4BAA4B;GAC9B,IAAI,WAAW,CAAC,kBAAkB;GAClC,mBAAmB;GACnB,SAAS;EACX,CAAC;CACH;CACA,MAAM,UAAyB,UAAU;EACvC,MAAM,SAAS,MAAM;EACrB,IAAI,CAAC,OAAO,UAAU,GAAG,eAAe,IAAI,WAAW,KAAK,EAAE,QAAQ,WAAW,WAAW,OAAO,gBAAgB,SAAS,IAAI;EAChI,MAAM,MAAO,MAA0B,gBAAiB,MAAyB;EACjF,IAAI,MAAM,SAAS,kBAAkB,iBAAiB,MAAM,SAAS,kBAAkB,gBAAgB;GACrG,MAAM,OAAO,OAAO,IAAI,MAAM,qBAAK,IAAI,IAAY;GACnD,KAAK,IAAI,GAAG;GACZ,OAAO,IAAI,QAAQ,IAAI;EACzB,OAAO;GACL,OAAO,IAAI,MAAM,CAAC,EAAE,OAAO,GAAG;GAC9B,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,EAAE,MAAM,OAAO,OAAO,MAAM;EACrD;EACA,SAAS;CACX;CACA,KAAK,MAAM,QAAQ,OAAO,OAAO,iBAAiB,GAAG,GAAG,KAAK,MAAM,MAAM;CACzE,KAAK,MAAM,QAAQ,CAAC,sBAAsB,oBAAoB,GAAG,GAAG,KAAK,MAAM,QAAQ;CACvF,KAAK,MAAM,QAAQ,CAAC,qBAAqB,mBAAmB,GAAG,GAAG,KAAK,MAAM,OAAO;CACpF,GAAG,KAAK,oCAAoC,UAAU;EACpD,MAAM,UAAU,MAAM;EACtB,MAAM,WAAY,MAAkD,QAAQ;EAC5E,kBAAkB,OAAO,UAAU,OAAO;EAC1C,MAAM,OAAO,OAAO;EACpB,IAAI,UAAU,MAAM,OAAO,QAAQ;EACnC,SAAS;CACX,CAAC;CACD,GAAG,KAAK,2BAA2B;EAEjC,oBAAoB;EACpB,SAAS;CACX,CAAC;CACD,GAAG,KAAK,oBAAoB,mBAAmB;CAC/C,MAAM,qBAAqB,YAAyB;EAClD,UAAU,IAAI,OAAO;EACrB,IAAI,QAAQ,QAAQ,aAAa,GAAG;GAClC,MAAM,UAAU,eAAe,OAAgC;GAG/D,IAAI,SAAS,QAAQ,YAAY,KAAK,qBAAqB,OAAsB,GAAG,aAAa,IAAI,OAAO;QACvG,aAAa,OAAO,OAAO;EAClC;EACA,IAAI,QAAQ,QAAQ,WAAW,GAAG;GAChC,sBAAsB;GAEtB,IAAI,SAAS,iBAAiB;EAChC;EACA,SAAS;CACX;CAGA,GAAG,KAAK,2BAA2B,UAAU,kBAAmB,MAAmC,MAAM,CAAC;CAC1G,KAAK,MAAM,QAAQ,cAAc;EAC/B,GAAG,KAAK,MAAM,KAAK,eAAe,UAAU,kBAAkB,MAAM,MAAqB,CAAC;EAC1F,GAAG,KAAK,MAAM,KAAK,cAAc,UAAU;GACzC,UAAU,OAAO,MAAM,MAAqB;GAC5C,aAAa,OAAO,MAAM,MAAqB;GAC/C,SAAS;EACX,CAAC;CACH;CACA,MAAM,aAAa,UACjB,MAAM,aAAa,CAAC,CAAC,MAAM,WAAkC,kBAAkB,eAAe,OAAO,QAAQ,UAAU,CAAC;CAC1H,GAAG,KAAK,gBAAgB,UAAU;EAChC,MAAM,OAAO,UAAU,KAAK;EAC5B,IAAI,MAAM,UAAU,IAAI,IAAI;EAC5B,SAAS;CACX,CAAC;CACD,GAAG,KAAK,gBAAgB,UAAU;EAChC,MAAM,OAAO,UAAU,KAAK;EAC5B,IAAI,MAAM,UAAU,OAAO,IAAI;EAC/B,SAAS;CACX,CAAC;CACD,KAAK,MAAM,QAAQ;EACjB;EACA;EACA;EACA,kBAAkB;EAClB,kBAAkB;EAClB;EACA;CACF,GACE,GAAG,KAAK,IAAI;CACd,MAAM,sBAAsB;EAC1B,2BAAW,IAAI,QAAQ;EACvB,eAAe;EACf,SAAS;CACX;CACA,GAAG,KAAK,0BAA0B;EAChC,IAAI,IAAI,QAAQ;GACd,wBAAwB,GAAG,CAAC,CAAC,SAAS,YAAY,OAAO,OAAO,OAAO,CAAC;GACxE,SAAS;EACX,OAAO,cAAc;CACvB,CAAC;CACD,GAAG,KAAK,UAAU,aAAa;CAC/B,GAAG,KAAK,0BAA0B,OAAO,SAAS,IAAI,CAAC;CACvD,GAAG,KAAK,0BAA0B,OAAO,SAAS,KAAK,CAAC;CACxD,GAAG,KAAK,QAAQ;CAChB,GAAG,IAAI,WAAW,8BAA8B,GAAG,QAAQ;CAC3D,GAAG,KAAK,oBAAoB,UAAU;EACpC,IAAK,MAA6C,cAChD,wBAAwB,GAAG,CAAC,CAAC,SAAS,YAAY,OAAO,OAAO,OAAO,CAAC;EAC1E,cAAc;CAChB,CAAC;CACD,IAAI,IAAI,gBAAgB;EACtB,GAAG,IAAI,gBAAgB,UAAU,aAAa;EAC9C,GAAG,IAAI,gBAAgB,QAAQ;CACjC;CACA,MAAM,SAAwG;EAE5G,OAAO,iBAAiB;GACtB,MAAM,YAAoF,EAAE,SAAS,gBAAgB;GACrH,WAAW,IAAI,SAAS;GACxB,aAAa;IACX,IAAI,CAAC,WAAW,OAAO,SAAS,GAAG;IAGnC,MAAM,aAAa,UAAU;IAC7B,IAAI,cAAc,UAAU,UAAU,WAAW,EAAE,GAAG,IAAI,qBAAqB,SAAS,UAAU,CAAC;IACnG,SAAS;GACX;EACF;EACA,cAAc;EACd,kBAAkC;GAChC,OAAO,UAAU,YAAY,QAAQ,OAAO,WAAW;GACvD,WAAW,QAAQ;GACnB;GACA;EACF;EACA,MAAM,UAAU;GACd,MAAM,QAAQ,OAAO;GACrB,IAAI,UAAU;GACd,IAAI,CAAC,SAAS;IACZ,kBAAkB,IAAI,KAAK;IAC3B,wBAAwB,GAAG,CAAC,CAAC,SAAS,YAAY,OAAO,OAAO,OAAO,CAAC;IACxE,MAAM,MAAM;GACd;GACA,OAAO,EACL,MAAM,SAAS;IACb,IAAI,SAAS;IACb,UAAU;IACV,IAAI,WAAW,CAAC,kBAAkB,OAAO,KAAK,GAAG;IACjD,MAAM,MAAM;GACd,EACF;EACF;EACA,UAAU;GACR,IAAI,aAAa,OAAO;GACxB,UAAU;GACV,cAAc,QAAQ,QAAQ,CAAC,CAAC,KAAK,YAAY;IAC/C,YAAY,SAAS,YAAY,QAAQ,CAAC;IAC1C,YAAY,MAAM;IAClB,uBAAuB,GAAG;IAC1B,IAAI,qBAAqB,KAAK;IAC9B,UAAU,MAAM;IAChB,SAAS,WAAW;IACpB,OAAO,WAAW;IAClB,SAAS,MAAM;IACf,QAAQ,MAAM;IACd,qBAAqB,CAAC;IACtB,OAAO,QAAQ;IACf,UAAU,QAAQ;IAClB,WAAW;IACX,IAAI,CAAC,IAAI,QAAQ,MAAM,QAAQ;IAC/B,IAAI;KACF,MAAM,QAAQ,OAAO,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IACtD,QAAQ,CAER;IACA,MAAM,OAAO;IACb,IAAI,iBAA8B,IAAI,eAAe,CAAC,CAAC,SAAS,YAAY,YAAY,SAAS,KAAK,CAAC;IACvG,MAAM,MAAM;IACZ,MAAM,MAAM;IACZ,UAAU,MAAM;IAChB,kBAAkB,MAAM;IACxB,OAAO,MAAM;IACb,UAAU,MAAM;IAChB,IAAI,UAAU,MAAM,QAAQ,SAAS,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAC7D,IAAI,gBAAgB,MAAM,QAAQ,eAAe,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACzE,cAAc;GAChB,CAAC;GACD,OAAO;EACT;CACF;CACA,MAAM,YAAY,UAA8B;EAC9C,MAAM,WAAW,mBAAmB,KAAK;EACzC,IAAI,MAAM,aAAa,aAAa,KAAA,GAClC,QAAa,OAAO,wBAAwB;GAAE,WAAW,MAAM;GAAW;EAAS,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;CAEzG;CACA,MAAM,sBAAsB,UAAmD;EAC7E,IAAI,WAAW,IAAI,UAAU,MAAM,WAAW,oBAAoB,MAAM,WAAW,YAAY,MAAM,YAAY,cAC/G,OAAO;EACT,MAAM,UAAU,QAAQ,IAAI,MAAM,EAAE;EACpC,MAAM,QAAQ,WAAW,MAAM,KAAK,QAAQ,KAAK,CAAC,CAAC,CAAC,MAAM,WAAW,WAAW,WAAW,OAAO,SAAS,OAAO,CAAC;EACnH,MAAM,UAAU,SAAS,qBAAqB,KAAK,IAAK,WAAW,OAAO,0BAA0B,yBAA0B,KAAA;EAC9H,IAAI,YAAY,OAAO,MAAM,OAAO,GAAG;GACrC,IAAI,CAAC,kBAAkB,MAChB;SAAA,MAAM,aAAa,YACtB,IAAI,UAAU,UAAU,MAAM,EAAE,MAAM,CAAC,UAAU,cAAc,MAAM,WAAW,UAAU,WAAW,WACnG,UAAU,aAAa;GAAA;GAG7B,OAAO;EACT;EAGA,IAAI,MAAM,WAAW,oBAAoB,MAAM,aAAa,kBAAkB;GAC5E,mBAAmB,KAAK,KAAK;GAC7B;EACF;EACA,eAAe,MAAM;EACrB,IAAI,CAAC,SAAS,OAAO;EACrB,IAAI,CAAC,SAAS,CAAC,sBAAsB,KAAK,GAAG,OAAO;EAEpD,MAAM,YADS,CAAC,QAAQ,KAAK,KAAK,YAAY,QAAQ,KAAK,SAAS,qBAAqB,KAAK,CAAC,KACnE,KAAK,CAAC,CAAC,MAAM,cAAc,UAAU,QAAQ,IAAI,MAAM,EAAE,CAAC;EACtF,MAAM,OAAO,WAAW,QAAQ,MAAM,MAAM,SAAS,KAAK,OAAO,MAAM,EAAE;EACzE,MAAM,eACJ,WAAW,QAAQ,UAAU,CAAC,UAAU,QAAQ,OAAO,QAAQ,IAAI,UAAU,QAAQ,OAAO,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE;EAExH,IAAI,EADoB,WAAW,QAAQ,SAAS,eAAe,UAAU,QAAQ,IAAI,MAAM,EAAE,MAAM,YAC/E,CAAC,iBAAiB,CAAC,QAAQ,KAAK,YAAY,KAAK,YAAY,QAAQ,OAAO;EAEpG,yBAAyB,OAAO;EAChC,eAAe;EACf,SAAS;EACT,OAAO;CACT;CACA,IAAI;EACF,WAAW,MAAM,gBAAgB,OAAO,YAAY,YAAY,QAAQ,CAAC;EACzE,iBAAiB,MAAM,gBACrB,OAAO,YAAY,WAAW,UAAU;GACtC,IACE,WACA,IAAI,UACJ,MAAM,WAAW,oBACjB,MAAM,WAAW,YACjB,YAAY,MAAM,OAAO,mBAAmB,IAAK,WAAW,OAAO,0BAA0B,yBAA0B,KAAA,CAAS,GAEhI;GACF,OAAO,MAAM,KAAK;EACpB,CAAC,CACH;EACA,IAAI,KAAK,OAAO,KAAK;EACrB,SAAS,QAAQ,IAAI,iBAAiB,WAAW;EACjD,uBAAuB,KAAK;GAC1B,MAAM,OAAO,SAAS,QAAQ,OAAO;IACnC,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC,SAAS,OAAO,KAAK,CAAC,OAAO,UAAU,OAAO,GAAG,OAAO;IAC1F,IAAI,CAAC,QACH,OAAO,UAAU,SAAS,KAAK;SAC1B;KACL,MAAM,WAAW,CAAC,QAAQ;KAC1B,IAAI,UAAU,OAAO,MAAM,SAAS,WAAW,CAAC;KAChD,MAAM,cAAc,UAAU,OAAO,OAAO,UAAU,QAAQ,QAAQ,WAAW,QAAQ,QAAQ;KACjG,OAAO,UAAU,SAAS,MAAM,WAAW;IAC7C;IACA,MAAM,MAAM;IACZ,OAAO,CAAC,WAAW,OAAO,UAAU,OAAO;GAC7C;GACA,MAAM,QAAQ,QAAQ;IACpB,wBAAwB,GAAG,CAAC,CACzB,QAAQ,YAAY,OAAO,MAAM,UAAU,MAAM,SAAS,QAAQ,MAAM,KAAK,MAAM,SAAS,QAAQ,MAAM,CAAC,CAAC,CAAC,CAC7G,SAAS,YAAY,OAAO,OAAO,OAAO,CAAC;IAC9C,UAAU,IAAI,MAAM;IACpB,MAAM,MAAM;IAEZ,MAAM,IAAI,SAAe,YAAY,IAAI,4BAA4B,QAAQ,CAAC,CAAC;IAC/E,QAAQ,WAAW,UAAU;KAC3B,UAAU,OAAO,MAAM;KACvB,IAAI,YAAY,CAAC,OAAO,MAAM,UAAU,MAAM,QAAQ,iCAAiC,CAAC,GAAG;MACzF,OAAO,SAAS,UAAU,MAAM,OAAO,KAAK,CAAC;MAC7C,IAAI,UACF,kBAAkB,OAAO,OAAO,IAAI,OAAO,EAAE;KAEjD;KACA,SAAS;IACX;GACF;EACF,CAAC;EACD,GAAG,KAAK,kBAAkB;GACxB,OAAY,QAAQ;GACpB,SAAS,UAAU;EACrB,CAAC;EACD,SAAS;CACX,SAAS,OAAO;EACd,MAAM,KAAK,KAAK;CAClB;CACA,OAAO;AACT"}
@@ -6,8 +6,8 @@ export interface Candidate {
6
6
  signature: string;
7
7
  render(renderer: ReturnType<typeof createIconRenderer>): Promise<void>;
8
8
  };
9
- buttonProjection?: VerticalControlAreaOptions['buttonProjection'];
10
- buttonDefaultFill?: VerticalControlAreaOptions['buttonDefaultFill'];
9
+ buttonProjection?: 'system' | 'source';
10
+ buttonDefaultFill?: 'solid' | null;
11
11
  element: HTMLElement;
12
12
  sources?: HTMLElement[];
13
13
  control: NativeUIControl;
@@ -1 +1 @@
1
- {"version":3,"file":"candidate.d.ts","names":[],"sources":["../../../src/native/shared/candidate.ts"],"mappings":";;;iBAIiB;EACf;IAAW;IAAmB,OAAO,UAAU,kBAAkB,sBAAsB;;EACvF,mBAAmB;EACnB,oBAAoB;EACpB,SAAS;EACT,UAAU;EACV,SAAS;EACT,SAAS,YAAY;EACrB;IAAS,MAAM;IAAc;IAAgB;;;YAGnC,YAAY,SAAS;qBAGpB,kBACX,SAAS,aACT,MAAM,oBAAoB,qBAC1B,IAAI,UACJ,UAAS,+BACR;qBAgCU,aACX,WAAW,WACX,OAAO,aACP,IAAI,UACJ,UAAS,YACT,mBACC"}
1
+ {"version":3,"file":"candidate.d.ts","names":[],"sources":["../../../src/native/shared/candidate.ts"],"mappings":";;;iBAIiB;EACf;IAAW;IAAmB,OAAO,UAAU,kBAAkB,sBAAsB;;EACvF;EACA;EACA,SAAS;EACT,UAAU;EACV,SAAS;EACT,SAAS,YAAY;EACrB;IAAS,MAAM;IAAc;IAAgB;;;YAGnC,YAAY,SAAS;qBAGpB,kBACX,SAAS,aACT,MAAM,oBAAoB,qBAC1B,IAAI,UACJ,UAAS,+BACR;qBAgCU,aACX,WAAW,WACX,OAAO,aACP,IAAI,UACJ,UAAS,YACT,mBACC"}
@@ -6,8 +6,8 @@ const createCandidate = (element, kind, id, options = {}) => {
6
6
  const style = getComputedStyle(element);
7
7
  return {
8
8
  element,
9
- buttonProjection: options.buttonProjection,
10
- buttonDefaultFill: options.buttonDefaultFill,
9
+ buttonProjection: options.ionic?.verticalBars?.buttonProjection ?? "system",
10
+ buttonDefaultFill: options.ionic?.verticalBars?.buttonDefaultFill === "solid" ? "solid" : null,
11
11
  control: {
12
12
  id: id(element),
13
13
  kind: {
@@ -1 +1 @@
1
- {"version":3,"file":"candidate.js","names":[],"sources":["../../../src/native/shared/candidate.ts"],"sourcesContent":["import type { NativeUIControl, NativeUIItem, NativeUIControlKind, NativeUIComponent, VerticalControlAreaOptions } from '../definitions';\nimport { frame, isDark, isVerticalBarsSource, text, visible } from './dom';\nimport { iconSource, type createIconRenderer } from './icons';\n\nexport interface Candidate {\n assets?: { signature: string; render(renderer: ReturnType<typeof createIconRenderer>): Promise<void> };\n buttonProjection?: VerticalControlAreaOptions['buttonProjection'];\n buttonDefaultFill?: VerticalControlAreaOptions['buttonDefaultFill'];\n element: HTMLElement;\n sources?: HTMLElement[];\n control: NativeUIControl;\n actions: Map<string, HTMLElement>;\n icons: { item: NativeUIItem; source: string; field?: 'closeIcon' }[];\n}\n\nexport type Identify = (element: HTMLElement) => string;\ntype ItemElement = HTMLElement & { disabled?: boolean; selected?: boolean };\n\nexport const createCandidate = (\n element: HTMLElement,\n kind: NativeUIComponent | NativeUIControlKind,\n id: Identify,\n options: VerticalControlAreaOptions = {},\n): Candidate => {\n const rect = element.getBoundingClientRect();\n const style = getComputedStyle(element);\n return {\n element,\n buttonProjection: options.buttonProjection,\n buttonDefaultFill: options.buttonDefaultFill,\n control: {\n id: id(element),\n kind:\n (\n {\n 'ion-button': 'button',\n 'ion-buttons': 'button-group',\n 'ion-back-button': 'back-button',\n 'ion-menu-button': 'menu-button',\n 'ion-tab-bar': 'tab-bar',\n 'ion-segment': 'segment',\n 'ion-fab': 'floating-action-button',\n } as Partial<Record<string, NativeUIControlKind>>\n )[kind] ?? (kind as NativeUIControlKind),\n ...frame(rect),\n items: [],\n dark: isDark(style),\n rtl: style.direction === 'rtl',\n },\n actions: new Map(),\n icons: [],\n };\n};\n\n// Shared text, artwork, geometry and action data; component rules stay with their readers.\nexport const appendItem = (\n candidate: Candidate,\n child: HTMLElement,\n id: Identify,\n content: ParentNode = child,\n label = text(child),\n): NativeUIItem | undefined => {\n if (\n !visible(child, isVerticalBarsSource(candidate.element)) ||\n child.querySelector('input, button, a, img, canvas, video, ion-spinner, ion-avatar')\n )\n return;\n const icons = Array.from(content.querySelectorAll<HTMLElement>('ion-icon'));\n const directSVGs = Array.from(content.querySelectorAll<SVGElement>('svg'));\n if (icons.length + directSVGs.length > 1) return undefined;\n const svg = directSVGs[0] ?? icons[0]?.shadowRoot?.querySelector<SVGElement>('svg');\n if (icons.length && !svg) return undefined; // ion-icon has not finished loading.\n const labelElement = content.querySelector('[part=\"text\"], ion-label') ?? child;\n const native = child.shadowRoot?.querySelector('[part=\"native\"]');\n const labelStyle = getComputedStyle(labelElement);\n const badge = child.querySelector<HTMLElement>('ion-badge');\n const badgeStyle = badge && visible(badge) ? getComputedStyle(badge) : undefined;\n const sourceFill = (child as HTMLIonButtonElement).fill;\n const projectionOwner = [child, child.closest('ion-buttons')].find((element) =>\n element?.matches('[data-projection=\"source\"], [data-projection=\"system\"], .ios-theme-projection-source, .ios-theme-projection-system'),\n );\n const attributeProjection = projectionOwner?.getAttribute('data-projection');\n const projection =\n attributeProjection === 'source' || attributeProjection === 'system'\n ? attributeProjection\n : projectionOwner\n ? projectionOwner.classList.contains('ios-theme-projection-system')\n ? 'system'\n : 'source'\n : candidate.buttonProjection;\n const systemButton = projection !== 'source' && isVerticalBarsSource(child) && child.matches('ion-button, ion-menu-button');\n // Ionic defaults buttons inside ion-buttons to clear, even when the app defaults to solid.\n const defaultFill = child.closest('ion-buttons') ? 'clear' : candidate.buttonDefaultFill;\n const fill = !sourceFill || sourceFill === 'default' ? defaultFill : sourceFill;\n const buttonFill =\n !systemButton &&\n isVerticalBarsSource(child) &&\n child.matches('ion-button') &&\n (fill === 'clear' || fill === 'solid' || fill === 'outline')\n ? fill\n : undefined;\n const outline = buttonFill === 'outline' ? getComputedStyle(native ?? child) : undefined;\n const item: NativeUIItem = {\n id: id(child),\n ...frame(child.getBoundingClientRect(), candidate.element.getBoundingClientRect()),\n label,\n accessibilityLabel:\n child.getAttribute('aria-label') ??\n native?.getAttribute('aria-label') ??\n (icons[0]?.getAttribute('aria-hidden') === 'true' ? null : icons[0]?.getAttribute('aria-label')) ??\n label,\n disabled:\n !!(child as ItemElement).disabled ||\n !!(candidate.element as ItemElement).disabled ||\n getComputedStyle(child).pointerEvents === 'none',\n selected: !!(child as ItemElement).selected,\n fontSize: parseFloat(labelStyle.fontSize),\n fontWeight: parseInt(labelStyle.fontWeight, 10) || 400,\n color: systemButton ? 'currentColor' : getComputedStyle(native ?? child).color,\n iconTemplate: systemButton ? true : undefined,\n buttonFill,\n backgroundColor: buttonFill === 'solid' ? getComputedStyle(native ?? child).backgroundColor : undefined,\n borderColor: outline?.borderTopColor,\n borderWidth: outline ? parseFloat(outline.borderTopWidth) : undefined,\n badge: badgeStyle\n ? { value: badge!.textContent?.trim() ?? '', color: badgeStyle.backgroundColor, textColor: badgeStyle.color }\n : undefined,\n };\n if (svg) {\n const source = iconSource(svg);\n if (!source) return undefined;\n const size = (icons[0] ?? svg).getBoundingClientRect();\n item.iconWidth = size.width;\n item.iconHeight = size.height;\n if (!size.width || !size.height) return undefined;\n item.iconPosition = (icons[0] ?? svg).getAttribute('slot') === 'end' ? 'trailing' : 'leading';\n candidate.icons.push({ item, source });\n }\n if (native && child.matches('ion-button, ion-back-button')) {\n const style = getComputedStyle(native);\n const icon = icons[0] ?? svg;\n const iconStyle = icon && getComputedStyle(icon);\n const leadingMargin = parseFloat(iconStyle?.marginInlineStart ?? '') || 0;\n const trailingMargin = parseFloat(iconStyle?.marginInlineEnd ?? '') || 0;\n const trailing = item.iconPosition === 'trailing';\n const inner = native.querySelector('.button-inner');\n const gap = inner ? parseFloat(getComputedStyle(inner).columnGap) || 0 : 0;\n // UIKit centers the title/image pair using its insets. Include Ionic's\n // border and negative outer icon margin instead of applying a fixed offset.\n item.contentInsetLeading =\n (parseFloat(style.paddingInlineStart) || 0) +\n (parseFloat(style.borderInlineStartWidth) || 0) +\n (!trailing || !label ? leadingMargin : 0);\n item.contentInsetTrailing =\n (parseFloat(style.paddingInlineEnd) || 0) + (parseFloat(style.borderInlineEndWidth) || 0) + (trailing || !label ? trailingMargin : 0);\n item.imagePadding = label && icon ? gap + (trailing ? leadingMargin : trailingMargin) : 0;\n }\n if (!label && !svg) return undefined;\n candidate.control.items.push(item);\n candidate.actions.set(item.id, child);\n return item;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"candidate.js","names":[],"sources":["../../../src/native/shared/candidate.ts"],"sourcesContent":["import type { NativeUIControl, NativeUIItem, NativeUIControlKind, NativeUIComponent, VerticalControlAreaOptions } from '../definitions';\nimport { frame, isDark, isVerticalBarsSource, text, visible } from './dom';\nimport { iconSource, type createIconRenderer } from './icons';\n\nexport interface Candidate {\n assets?: { signature: string; render(renderer: ReturnType<typeof createIconRenderer>): Promise<void> };\n buttonProjection?: 'system' | 'source';\n buttonDefaultFill?: 'solid' | null;\n element: HTMLElement;\n sources?: HTMLElement[];\n control: NativeUIControl;\n actions: Map<string, HTMLElement>;\n icons: { item: NativeUIItem; source: string; field?: 'closeIcon' }[];\n}\n\nexport type Identify = (element: HTMLElement) => string;\ntype ItemElement = HTMLElement & { disabled?: boolean; selected?: boolean };\n\nexport const createCandidate = (\n element: HTMLElement,\n kind: NativeUIComponent | NativeUIControlKind,\n id: Identify,\n options: VerticalControlAreaOptions = {},\n): Candidate => {\n const rect = element.getBoundingClientRect();\n const style = getComputedStyle(element);\n return {\n element,\n buttonProjection: options.ionic?.verticalBars?.buttonProjection ?? 'system',\n buttonDefaultFill: options.ionic?.verticalBars?.buttonDefaultFill === 'solid' ? 'solid' : null,\n control: {\n id: id(element),\n kind:\n (\n {\n 'ion-button': 'button',\n 'ion-buttons': 'button-group',\n 'ion-back-button': 'back-button',\n 'ion-menu-button': 'menu-button',\n 'ion-tab-bar': 'tab-bar',\n 'ion-segment': 'segment',\n 'ion-fab': 'floating-action-button',\n } as Partial<Record<string, NativeUIControlKind>>\n )[kind] ?? (kind as NativeUIControlKind),\n ...frame(rect),\n items: [],\n dark: isDark(style),\n rtl: style.direction === 'rtl',\n },\n actions: new Map(),\n icons: [],\n };\n};\n\n// Shared text, artwork, geometry and action data; component rules stay with their readers.\nexport const appendItem = (\n candidate: Candidate,\n child: HTMLElement,\n id: Identify,\n content: ParentNode = child,\n label = text(child),\n): NativeUIItem | undefined => {\n if (\n !visible(child, isVerticalBarsSource(candidate.element)) ||\n child.querySelector('input, button, a, img, canvas, video, ion-spinner, ion-avatar')\n )\n return;\n const icons = Array.from(content.querySelectorAll<HTMLElement>('ion-icon'));\n const directSVGs = Array.from(content.querySelectorAll<SVGElement>('svg'));\n if (icons.length + directSVGs.length > 1) return undefined;\n const svg = directSVGs[0] ?? icons[0]?.shadowRoot?.querySelector<SVGElement>('svg');\n if (icons.length && !svg) return undefined; // ion-icon has not finished loading.\n const labelElement = content.querySelector('[part=\"text\"], ion-label') ?? child;\n const native = child.shadowRoot?.querySelector('[part=\"native\"]');\n const labelStyle = getComputedStyle(labelElement);\n const badge = child.querySelector<HTMLElement>('ion-badge');\n const badgeStyle = badge && visible(badge) ? getComputedStyle(badge) : undefined;\n const sourceFill = (child as HTMLIonButtonElement).fill;\n const projectionOwner = [child, child.closest('ion-buttons')].find((element) =>\n element?.matches('[data-projection=\"source\"], [data-projection=\"system\"], .ios-theme-projection-source, .ios-theme-projection-system'),\n );\n const attributeProjection = projectionOwner?.getAttribute('data-projection');\n const projection =\n attributeProjection === 'source' || attributeProjection === 'system'\n ? attributeProjection\n : projectionOwner\n ? projectionOwner.classList.contains('ios-theme-projection-system')\n ? 'system'\n : 'source'\n : candidate.buttonProjection;\n const systemButton = projection !== 'source' && isVerticalBarsSource(child) && child.matches('ion-button, ion-menu-button');\n // Ionic defaults buttons inside ion-buttons to clear, even when the app defaults to solid.\n const defaultFill = child.closest('ion-buttons') ? 'clear' : candidate.buttonDefaultFill;\n const fill = !sourceFill || sourceFill === 'default' ? defaultFill : sourceFill;\n const buttonFill =\n !systemButton &&\n isVerticalBarsSource(child) &&\n child.matches('ion-button') &&\n (fill === 'clear' || fill === 'solid' || fill === 'outline')\n ? fill\n : undefined;\n const outline = buttonFill === 'outline' ? getComputedStyle(native ?? child) : undefined;\n const item: NativeUIItem = {\n id: id(child),\n ...frame(child.getBoundingClientRect(), candidate.element.getBoundingClientRect()),\n label,\n accessibilityLabel:\n child.getAttribute('aria-label') ??\n native?.getAttribute('aria-label') ??\n (icons[0]?.getAttribute('aria-hidden') === 'true' ? null : icons[0]?.getAttribute('aria-label')) ??\n label,\n disabled:\n !!(child as ItemElement).disabled ||\n !!(candidate.element as ItemElement).disabled ||\n getComputedStyle(child).pointerEvents === 'none',\n selected: !!(child as ItemElement).selected,\n fontSize: parseFloat(labelStyle.fontSize),\n fontWeight: parseInt(labelStyle.fontWeight, 10) || 400,\n color: systemButton ? 'currentColor' : getComputedStyle(native ?? child).color,\n iconTemplate: systemButton ? true : undefined,\n buttonFill,\n backgroundColor: buttonFill === 'solid' ? getComputedStyle(native ?? child).backgroundColor : undefined,\n borderColor: outline?.borderTopColor,\n borderWidth: outline ? parseFloat(outline.borderTopWidth) : undefined,\n badge: badgeStyle\n ? { value: badge!.textContent?.trim() ?? '', color: badgeStyle.backgroundColor, textColor: badgeStyle.color }\n : undefined,\n };\n if (svg) {\n const source = iconSource(svg);\n if (!source) return undefined;\n const size = (icons[0] ?? svg).getBoundingClientRect();\n item.iconWidth = size.width;\n item.iconHeight = size.height;\n if (!size.width || !size.height) return undefined;\n item.iconPosition = (icons[0] ?? svg).getAttribute('slot') === 'end' ? 'trailing' : 'leading';\n candidate.icons.push({ item, source });\n }\n if (native && child.matches('ion-button, ion-back-button')) {\n const style = getComputedStyle(native);\n const icon = icons[0] ?? svg;\n const iconStyle = icon && getComputedStyle(icon);\n const leadingMargin = parseFloat(iconStyle?.marginInlineStart ?? '') || 0;\n const trailingMargin = parseFloat(iconStyle?.marginInlineEnd ?? '') || 0;\n const trailing = item.iconPosition === 'trailing';\n const inner = native.querySelector('.button-inner');\n const gap = inner ? parseFloat(getComputedStyle(inner).columnGap) || 0 : 0;\n // UIKit centers the title/image pair using its insets. Include Ionic's\n // border and negative outer icon margin instead of applying a fixed offset.\n item.contentInsetLeading =\n (parseFloat(style.paddingInlineStart) || 0) +\n (parseFloat(style.borderInlineStartWidth) || 0) +\n (!trailing || !label ? leadingMargin : 0);\n item.contentInsetTrailing =\n (parseFloat(style.paddingInlineEnd) || 0) + (parseFloat(style.borderInlineEndWidth) || 0) + (trailing || !label ? trailingMargin : 0);\n item.imagePadding = label && icon ? gap + (trailing ? leadingMargin : trailingMargin) : 0;\n }\n if (!label && !svg) return undefined;\n candidate.control.items.push(item);\n candidate.actions.set(item.id, child);\n return item;\n};\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { NativeUIControls, NativeUIOptions } from "../definitions.js";
2
+ //#region src/native/shared/control-options.d.ts
3
+ export declare const controlDefault: (options: NativeUIOptions, kind: keyof NativeUIControls, vertical: boolean) => boolean;
4
+ export declare const controlSelected: (element: HTMLElement, options: NativeUIOptions, kind: keyof NativeUIControls, vertical: boolean) => boolean;
5
+ //#endregion
6
+ //# sourceMappingURL=control-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-options.d.ts","names":[],"sources":["../../../src/native/shared/control-options.ts"],"mappings":";;qBAGa,iBAAkB,SAAS,iBAAiB,YAAY,kBAAkB;qBAQ1E,kBACX,SAAS,aACT,SAAS,iBACT,YAAY,kBACZ"}
@@ -0,0 +1,17 @@
1
+ //#region src/native/shared/control-options.ts
2
+ /** Resolve one default without changing discovery, explicit selection, or placement. */
3
+ const controlDefault = (options, kind, vertical) => {
4
+ const controls = options.controls;
5
+ const value = typeof controls === "object" ? controls[kind] : controls;
6
+ if (value === void 0 || value === true) return true;
7
+ if (value === false) return false;
8
+ return value === (vertical ? "verticalOnly" : "horizontalOnly");
9
+ };
10
+ const controlSelected = (element, options, kind, vertical) => {
11
+ const local = element.getAttribute(vertical ? "data-vertical-bars" : "data-horizontal-bars");
12
+ return local === "true" ? true : local === "false" ? false : controlDefault(options, kind, vertical);
13
+ };
14
+ //#endregion
15
+ export { controlDefault, controlSelected };
16
+
17
+ //# sourceMappingURL=control-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-options.js","names":[],"sources":["../../../src/native/shared/control-options.ts"],"sourcesContent":["import type { NativeUIControls, NativeUIOptions } from '../definitions';\n\n/** Resolve one default without changing discovery, explicit selection, or placement. */\nexport const controlDefault = (options: NativeUIOptions, kind: keyof NativeUIControls, vertical: boolean): boolean => {\n const controls = options.controls;\n const value = typeof controls === 'object' ? controls[kind] : controls;\n if (value === undefined || value === true) return true;\n if (value === false) return false;\n return value === (vertical ? 'verticalOnly' : 'horizontalOnly');\n};\n\nexport const controlSelected = (\n element: HTMLElement,\n options: NativeUIOptions,\n kind: keyof NativeUIControls,\n vertical: boolean,\n): boolean => {\n const local = element.getAttribute(vertical ? 'data-vertical-bars' : 'data-horizontal-bars');\n return local === 'true' ? true : local === 'false' ? false : controlDefault(options, kind, vertical);\n};\n"],"mappings":";;AAGA,MAAa,kBAAkB,SAA0B,MAA8B,aAA+B;CACpH,MAAM,WAAW,QAAQ;CACzB,MAAM,QAAQ,OAAO,aAAa,WAAW,SAAS,QAAQ;CAC9D,IAAI,UAAU,KAAA,KAAa,UAAU,MAAM,OAAO;CAClD,IAAI,UAAU,OAAO,OAAO;CAC5B,OAAO,WAAW,WAAW,iBAAiB;AAChD;AAEA,MAAa,mBACX,SACA,SACA,MACA,aACY;CACZ,MAAM,QAAQ,QAAQ,aAAa,WAAW,uBAAuB,sBAAsB;CAC3F,OAAO,UAAU,SAAS,OAAO,UAAU,UAAU,QAAQ,eAAe,SAAS,MAAM,QAAQ;AACrG"}
@@ -1,6 +1,10 @@
1
- import { ToolbarProjectionOptions, VerticalControlAreaOptions } from "../definitions.js";
1
+ import { VerticalControlAreaOptions } from "../definitions.js";
2
2
  //#region src/native/shared/toolbar-options.d.ts
3
- export declare const toolbarOptions: (options: VerticalControlAreaOptions, vertical: boolean) => Required<ToolbarProjectionOptions>;
3
+ export declare const toolbarOptions: (options: VerticalControlAreaOptions, vertical: boolean) => {
4
+ buttonGroup: boolean;
5
+ button: boolean;
6
+ backButton: boolean;
7
+ };
4
8
  export declare const localToolbarOption: (element: HTMLElement, vertical: boolean) => boolean | undefined;
5
9
  export declare const horizontalSelected: (element: HTMLElement, options: VerticalControlAreaOptions) => boolean;
6
10
  export declare const horizontalToolbarGroup: (element: HTMLElement, options: VerticalControlAreaOptions) => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar-options.d.ts","names":[],"sources":["../../../src/native/shared/toolbar-options.ts"],"mappings":";;qBAIa,iBAAkB,SAAS,4BAA4B,sBAAoB,SAAS;qBAWpF,qBAAsB,SAAS,aAAa;qBAK5C,qBAAsB,SAAS,aAAa,SAAS;qBAQrD,yBAA0B,SAAS,aAAa,SAAS;qBAuBzD,0BAA2B,SAAS"}
1
+ {"version":3,"file":"toolbar-options.d.ts","names":[],"sources":["../../../src/native/shared/toolbar-options.ts"],"mappings":";;qBAKa,iBAAkB,SAAS,4BAA4B;;;;;qBAMvD,qBAAsB,SAAS,aAAa;qBAK5C,qBAAsB,SAAS,aAAa,SAAS;qBAQrD,yBAA0B,SAAS,aAAa,SAAS;qBAuBzD,0BAA2B,SAAS"}
@@ -1,20 +1,12 @@
1
+ import { controlDefault } from "./control-options.js";
1
2
  import { modalUsesVerticalBars } from "./modal.js";
2
3
  import { childElements, inFixedToolbar, isExcluded, isNativeUIDisabled } from "./dom.js";
3
4
  //#region src/native/shared/toolbar-options.ts
4
- const toolbarOptions = (options, vertical) => {
5
- const layout = vertical ? options.vertical : options.horizontal;
6
- if (typeof layout === "boolean") return {
7
- buttons: layout,
8
- button: layout,
9
- backButton: layout
10
- };
11
- const settings = layout ?? {};
12
- return {
13
- buttons: settings.buttons ?? true,
14
- button: settings.button ?? true,
15
- backButton: settings.backButton ?? true
16
- };
17
- };
5
+ const toolbarOptions = (options, vertical) => ({
6
+ buttonGroup: controlDefault(options, "buttonGroup", vertical),
7
+ button: controlDefault(options, "button", vertical),
8
+ backButton: controlDefault(options, "backButton", vertical)
9
+ });
18
10
  const localToolbarOption = (element, vertical) => {
19
11
  const value = element.getAttribute(vertical ? "data-vertical-bars" : "data-horizontal-bars");
20
12
  return value === "true" ? true : value === "false" ? false : void 0;
@@ -25,7 +17,7 @@ const horizontalSelected = (element, options) => {
25
17
  return localToolbarOption(element, false) ?? toolbarOptions(options, false)[element.matches("ion-back-button") ? "backButton" : "button"];
26
18
  };
27
19
  const horizontalToolbarGroup = (element, options) => {
28
- if (!element.matches("ion-buttons.ios") || !(localToolbarOption(element, false) ?? toolbarOptions(options, false).buttons) || !inFixedToolbar(element) || isExcluded(element) || isNativeUIDisabled(element)) return false;
20
+ if (!element.matches("ion-buttons.ios") || !(localToolbarOption(element, false) ?? toolbarOptions(options, false).buttonGroup) || !inFixedToolbar(element) || isExcluded(element) || isNativeUIDisabled(element)) return false;
29
21
  const children = childElements(element);
30
22
  return children.length > 0 && children.every((child) => horizontalSelected(child, options) && !isExcluded(child) && !isNativeUIDisabled(child) && (child.matches("ion-menu-button.ios") || children.length > 1 && child.matches("ion-button.ios.button-clear") && child.fill === "clear"));
31
23
  };
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar-options.js","names":[],"sources":["../../../src/native/shared/toolbar-options.ts"],"sourcesContent":["import { modalUsesVerticalBars } from './modal';\nimport type { ToolbarProjectionOptions, VerticalControlAreaOptions } from '../definitions';\nimport { childElements, inFixedToolbar, isExcluded, isNativeUIDisabled } from './dom';\n\nexport const toolbarOptions = (options: VerticalControlAreaOptions, vertical: boolean): Required<ToolbarProjectionOptions> => {\n const layout = vertical ? options.vertical : options.horizontal;\n if (typeof layout === 'boolean') return { buttons: layout, button: layout, backButton: layout };\n const settings = layout ?? {};\n return {\n buttons: settings.buttons ?? true,\n button: settings.button ?? true,\n backButton: settings.backButton ?? true,\n };\n};\n\nexport const localToolbarOption = (element: HTMLElement, vertical: boolean): boolean | undefined => {\n const value = element.getAttribute(vertical ? 'data-vertical-bars' : 'data-horizontal-bars');\n return value === 'true' ? true : value === 'false' ? false : undefined;\n};\n\nexport const horizontalSelected = (element: HTMLElement, options: VerticalControlAreaOptions): boolean => {\n const group = element.parentElement;\n if (group?.matches('ion-buttons') && isNativeUIDisabled(group)) return false;\n return localToolbarOption(element, false) ?? toolbarOptions(options, false)[element.matches('ion-back-button') ? 'backButton' : 'button'];\n};\n\n// Group only if all original children qualify; otherwise selected actions remain individual.\n// Back navigation never joins an ordinary action group.\nexport const horizontalToolbarGroup = (element: HTMLElement, options: VerticalControlAreaOptions): boolean => {\n if (\n !element.matches('ion-buttons.ios') ||\n !(localToolbarOption(element, false) ?? toolbarOptions(options, false).buttons) ||\n !inFixedToolbar(element) ||\n isExcluded(element) ||\n isNativeUIDisabled(element)\n )\n return false;\n const children = childElements(element);\n return (\n children.length > 0 &&\n children.every(\n (child) =>\n horizontalSelected(child, options) &&\n !isExcluded(child) &&\n !isNativeUIDisabled(child) &&\n (child.matches('ion-menu-button.ios') ||\n (children.length > 1 && child.matches('ion-button.ios.button-clear') && (child as HTMLIonButtonElement).fill === 'clear')),\n )\n );\n};\n\nexport const inVerticalToolbarLayout = (element: HTMLElement): boolean =>\n !element.closest('ion-menu, ion-popover') && modalUsesVerticalBars(element) && !!element.closest('ion-app.ios-theme-vertical-bars');\n"],"mappings":";;;AAIA,MAAa,kBAAkB,SAAqC,aAA0D;CAC5H,MAAM,SAAS,WAAW,QAAQ,WAAW,QAAQ;CACrD,IAAI,OAAO,WAAW,WAAW,OAAO;EAAE,SAAS;EAAQ,QAAQ;EAAQ,YAAY;CAAO;CAC9F,MAAM,WAAW,UAAU,CAAC;CAC5B,OAAO;EACL,SAAS,SAAS,WAAW;EAC7B,QAAQ,SAAS,UAAU;EAC3B,YAAY,SAAS,cAAc;CACrC;AACF;AAEA,MAAa,sBAAsB,SAAsB,aAA2C;CAClG,MAAM,QAAQ,QAAQ,aAAa,WAAW,uBAAuB,sBAAsB;CAC3F,OAAO,UAAU,SAAS,OAAO,UAAU,UAAU,QAAQ,KAAA;AAC/D;AAEA,MAAa,sBAAsB,SAAsB,YAAiD;CACxG,MAAM,QAAQ,QAAQ;CACtB,IAAI,OAAO,QAAQ,aAAa,KAAK,mBAAmB,KAAK,GAAG,OAAO;CACvE,OAAO,mBAAmB,SAAS,KAAK,KAAK,eAAe,SAAS,KAAK,CAAC,CAAC,QAAQ,QAAQ,iBAAiB,IAAI,eAAe;AAClI;AAIA,MAAa,0BAA0B,SAAsB,YAAiD;CAC5G,IACE,CAAC,QAAQ,QAAQ,iBAAiB,KAClC,EAAE,mBAAmB,SAAS,KAAK,KAAK,eAAe,SAAS,KAAK,CAAC,CAAC,YACvE,CAAC,eAAe,OAAO,KACvB,WAAW,OAAO,KAClB,mBAAmB,OAAO,GAE1B,OAAO;CACT,MAAM,WAAW,cAAc,OAAO;CACtC,OACE,SAAS,SAAS,KAClB,SAAS,OACN,UACC,mBAAmB,OAAO,OAAO,KACjC,CAAC,WAAW,KAAK,KACjB,CAAC,mBAAmB,KAAK,MACxB,MAAM,QAAQ,qBAAqB,KACjC,SAAS,SAAS,KAAK,MAAM,QAAQ,6BAA6B,KAAM,MAA+B,SAAS,QACvH;AAEJ;AAEA,MAAa,2BAA2B,YACtC,CAAC,QAAQ,QAAQ,uBAAuB,KAAK,sBAAsB,OAAO,KAAK,CAAC,CAAC,QAAQ,QAAQ,iCAAiC"}
1
+ {"version":3,"file":"toolbar-options.js","names":[],"sources":["../../../src/native/shared/toolbar-options.ts"],"sourcesContent":["import { modalUsesVerticalBars } from './modal';\nimport type { VerticalControlAreaOptions } from '../definitions';\nimport { controlDefault } from './control-options';\nimport { childElements, inFixedToolbar, isExcluded, isNativeUIDisabled } from './dom';\n\nexport const toolbarOptions = (options: VerticalControlAreaOptions, vertical: boolean) => ({\n buttonGroup: controlDefault(options, 'buttonGroup', vertical),\n button: controlDefault(options, 'button', vertical),\n backButton: controlDefault(options, 'backButton', vertical),\n});\n\nexport const localToolbarOption = (element: HTMLElement, vertical: boolean): boolean | undefined => {\n const value = element.getAttribute(vertical ? 'data-vertical-bars' : 'data-horizontal-bars');\n return value === 'true' ? true : value === 'false' ? false : undefined;\n};\n\nexport const horizontalSelected = (element: HTMLElement, options: VerticalControlAreaOptions): boolean => {\n const group = element.parentElement;\n if (group?.matches('ion-buttons') && isNativeUIDisabled(group)) return false;\n return localToolbarOption(element, false) ?? toolbarOptions(options, false)[element.matches('ion-back-button') ? 'backButton' : 'button'];\n};\n\n// Group only if all original children qualify; otherwise selected actions remain individual.\n// Back navigation never joins an ordinary action group.\nexport const horizontalToolbarGroup = (element: HTMLElement, options: VerticalControlAreaOptions): boolean => {\n if (\n !element.matches('ion-buttons.ios') ||\n !(localToolbarOption(element, false) ?? toolbarOptions(options, false).buttonGroup) ||\n !inFixedToolbar(element) ||\n isExcluded(element) ||\n isNativeUIDisabled(element)\n )\n return false;\n const children = childElements(element);\n return (\n children.length > 0 &&\n children.every(\n (child) =>\n horizontalSelected(child, options) &&\n !isExcluded(child) &&\n !isNativeUIDisabled(child) &&\n (child.matches('ion-menu-button.ios') ||\n (children.length > 1 && child.matches('ion-button.ios.button-clear') && (child as HTMLIonButtonElement).fill === 'clear')),\n )\n );\n};\n\nexport const inVerticalToolbarLayout = (element: HTMLElement): boolean =>\n !element.closest('ion-menu, ion-popover') && modalUsesVerticalBars(element) && !!element.closest('ion-app.ios-theme-vertical-bars');\n"],"mappings":";;;;AAKA,MAAa,kBAAkB,SAAqC,cAAuB;CACzF,aAAa,eAAe,SAAS,eAAe,QAAQ;CAC5D,QAAQ,eAAe,SAAS,UAAU,QAAQ;CAClD,YAAY,eAAe,SAAS,cAAc,QAAQ;AAC5D;AAEA,MAAa,sBAAsB,SAAsB,aAA2C;CAClG,MAAM,QAAQ,QAAQ,aAAa,WAAW,uBAAuB,sBAAsB;CAC3F,OAAO,UAAU,SAAS,OAAO,UAAU,UAAU,QAAQ,KAAA;AAC/D;AAEA,MAAa,sBAAsB,SAAsB,YAAiD;CACxG,MAAM,QAAQ,QAAQ;CACtB,IAAI,OAAO,QAAQ,aAAa,KAAK,mBAAmB,KAAK,GAAG,OAAO;CACvE,OAAO,mBAAmB,SAAS,KAAK,KAAK,eAAe,SAAS,KAAK,CAAC,CAAC,QAAQ,QAAQ,iBAAiB,IAAI,eAAe;AAClI;AAIA,MAAa,0BAA0B,SAAsB,YAAiD;CAC5G,IACE,CAAC,QAAQ,QAAQ,iBAAiB,KAClC,EAAE,mBAAmB,SAAS,KAAK,KAAK,eAAe,SAAS,KAAK,CAAC,CAAC,gBACvE,CAAC,eAAe,OAAO,KACvB,WAAW,OAAO,KAClB,mBAAmB,OAAO,GAE1B,OAAO;CACT,MAAM,WAAW,cAAc,OAAO;CACtC,OACE,SAAS,SAAS,KAClB,SAAS,OACN,UACC,mBAAmB,OAAO,OAAO,KACjC,CAAC,WAAW,KAAK,KACjB,CAAC,mBAAmB,KAAK,MACxB,MAAM,QAAQ,qBAAqB,KACjC,SAAS,SAAS,KAAK,MAAM,QAAQ,6BAA6B,KAAM,MAA+B,SAAS,QACvH;AAEJ;AAEA,MAAa,2BAA2B,YACtC,CAAC,QAAQ,QAAQ,uBAAuB,KAAK,sBAAsB,OAAO,KAAK,CAAC,CAAC,QAAQ,QAAQ,iCAAiC"}
@@ -1 +1 @@
1
- {"version":3,"file":"startup.d.ts","names":["activate"],"sources":["../../src/native/startup.ts"],"mappings":";;;KAGK,iBAAiB,kBAAkBA;qBAI3B,gBAAuB,QAAO,iBAAsB,iBAAiB,mBAAiB,QAAQ;qBA4E9F,iBAAkB,UAAS,oBAAuB,QAAQ"}
1
+ {"version":3,"file":"startup.d.ts","names":["activate"],"sources":["../../src/native/startup.ts"],"mappings":";;;KAGK,iBAAiB,kBAAkBA;qBAI3B,gBAAuB,QAAO,iBAAsB,iBAAiB,mBAAiB,QAAQ;qBA4D9F,iBAAkB,UAAS,oBAAuB,QAAQ"}
@@ -11,27 +11,11 @@ const startNativeUI = async (input = {}, overlayFactory) => {
11
11
  const host = bars.placement?.webHost;
12
12
  if (root && (!root.isConnected || root.ownerDocument !== document)) throw new Error("Native UI requires a connected root in the current document");
13
13
  if (host && (!host.isConnected || host.ownerDocument !== document || root?.contains(host) || host.contains(root))) throw new Error("The Web rail host must be connected in the current document and outside the source root");
14
- const legacy = input.controls;
15
- const automatic = input.ionic?.auto;
16
- const controls = automatic === void 0 ? legacy : typeof automatic === "object" ? automatic : {};
17
- const defaultEnabled = automatic !== false;
18
14
  const options = {
19
15
  ...input,
20
16
  root,
21
17
  source: "auto",
22
- explicitControls: automatic !== void 0 || (legacy?.buttons ?? legacy?.toolbar ?? true),
23
18
  verticalBars: bars,
24
- controls: {
25
- ...controls,
26
- tabs: controls?.tabs ?? defaultEnabled,
27
- segment: controls?.segment ?? defaultEnabled,
28
- fab: controls?.fab ?? defaultEnabled,
29
- toolbar: controls?.buttons ?? (automatic === void 0 ? legacy?.toolbar : void 0) ?? defaultEnabled,
30
- popover: bars.popover ?? legacy?.popover ?? false
31
- },
32
- verticalBarsOnly: bars.only ?? input.verticalBarsOnly ?? false,
33
- buttonProjection: bars.buttonProjection ?? input.buttonProjection ?? "system",
34
- buttonDefaultFill: bars.buttonDefaultFill === "glass" ? null : bars.buttonDefaultFill ?? input.buttonDefaultFill ?? null,
35
19
  rail: host ? {
36
20
  host,
37
21
  edge: bars.placement?.edge === "leading" ? "left" : "right"