@rdlabo/ionic-theme-ios27 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.
- package/README.md +24 -280
- package/dist/css/components/ion-toolbar.css +1 -1
- package/dist/css/ionic-theme-ios27.css +1 -1
- package/dist/css/vertical-bars.css +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/layout/index.d.ts +18 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +26 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/segment/index.js +3 -3
- package/dist/segment/index.js.map +1 -1
- package/dist/sheets-of-glass/index.js +7 -7
- package/dist/sheets-of-glass/index.js.map +1 -1
- package/dist/tab-bar-searchable/dismiss-button.js +53 -3
- package/dist/tab-bar-searchable/dismiss-button.js.map +1 -1
- package/dist/tab-bar-searchable/index.js +18 -3
- package/dist/tab-bar-searchable/index.js.map +1 -1
- package/dist/transition/ios.transition.d.ts.map +1 -1
- package/dist/transition/ios.transition.js +7 -4
- package/dist/transition/ios.transition.js.map +1 -1
- package/dist/transition/native-ui.d.ts +6 -0
- package/dist/transition/native-ui.d.ts.map +1 -0
- package/dist/{native-integration/index.js → transition/native-ui.js} +16 -30
- package/dist/transition/native-ui.js.map +1 -0
- package/docs/adaptive-themes.md +151 -0
- package/docs/add-native-ui.md +53 -0
- package/docs/animation.md +1 -1
- package/docs/eslint.md +1 -1
- package/docs/features.md +3 -3
- package/docs/iphone-duo-with-original-theme.md +44 -29
- package/docs/iphone-duo.md +29 -32
- package/docs/migration.md +12 -24
- package/docs/setup.md +82 -0
- package/docs/special-markup.md +5 -5
- package/docs/using-ion-item-group.md +2 -2
- package/docs/vertical-bars-layout.md +47 -0
- package/package.json +12 -42
- package/src/index.ts +3 -1
- package/src/layout/index.ts +29 -0
- package/src/segment/index.ts +3 -3
- package/src/sheets-of-glass/index.ts +7 -7
- package/src/styles/components/ion-toolbar.scss +1 -1
- package/src/styles/vertical-bars.scss +15 -18
- package/src/tab-bar-searchable/dismiss-button.ts +73 -4
- package/src/tab-bar-searchable/index.ts +20 -3
- package/src/transition/ios.transition.ts +7 -4
- package/src/{native-integration/index.ts → transition/native-ui.ts} +17 -46
- package/Package.swift +0 -21
- package/dist/_virtual/_rolldown/runtime.js +0 -13
- package/dist/native/components/index.d.ts +0 -19
- package/dist/native/components/index.d.ts.map +0 -1
- package/dist/native/components/index.js +0 -40
- package/dist/native/components/index.js.map +0 -1
- package/dist/native/components/ion-back-button.d.ts +0 -9
- package/dist/native/components/ion-back-button.d.ts.map +0 -1
- package/dist/native/components/ion-back-button.js +0 -20
- package/dist/native/components/ion-back-button.js.map +0 -1
- package/dist/native/components/ion-button.d.ts +0 -10
- package/dist/native/components/ion-button.d.ts.map +0 -1
- package/dist/native/components/ion-button.js +0 -23
- package/dist/native/components/ion-button.js.map +0 -1
- package/dist/native/components/ion-buttons.d.ts +0 -11
- package/dist/native/components/ion-buttons.d.ts.map +0 -1
- package/dist/native/components/ion-buttons.js +0 -30
- package/dist/native/components/ion-buttons.js.map +0 -1
- package/dist/native/components/ion-fab.d.ts +0 -10
- package/dist/native/components/ion-fab.d.ts.map +0 -1
- package/dist/native/components/ion-fab.js +0 -132
- package/dist/native/components/ion-fab.js.map +0 -1
- package/dist/native/components/ion-menu-button.d.ts +0 -13
- package/dist/native/components/ion-menu-button.d.ts.map +0 -1
- package/dist/native/components/ion-menu-button.js +0 -31
- package/dist/native/components/ion-menu-button.js.map +0 -1
- package/dist/native/components/ion-segment.d.ts +0 -11
- package/dist/native/components/ion-segment.d.ts.map +0 -1
- package/dist/native/components/ion-segment.js +0 -30
- package/dist/native/components/ion-segment.js.map +0 -1
- package/dist/native/components/ion-tab-bar.d.ts +0 -11
- package/dist/native/components/ion-tab-bar.d.ts.map +0 -1
- package/dist/native/components/ion-tab-bar.js +0 -50
- package/dist/native/components/ion-tab-bar.js.map +0 -1
- package/dist/native/components/searchable-tabs.d.ts +0 -20
- package/dist/native/components/searchable-tabs.d.ts.map +0 -1
- package/dist/native/components/searchable-tabs.js +0 -383
- package/dist/native/components/searchable-tabs.js.map +0 -1
- package/dist/native/definitions.d.ts +0 -152
- package/dist/native/definitions.d.ts.map +0 -1
- package/dist/native/definitions.js +0 -0
- package/dist/native/foldable/fold-state.d.ts +0 -5
- package/dist/native/foldable/fold-state.d.ts.map +0 -1
- package/dist/native/foldable/fold-state.js +0 -14
- package/dist/native/foldable/fold-state.js.map +0 -1
- package/dist/native/foldable/types.d.ts +0 -12
- package/dist/native/foldable/types.d.ts.map +0 -1
- package/dist/native/foldable/types.js +0 -0
- package/dist/native/index.d.ts +0 -11
- package/dist/native/index.d.ts.map +0 -1
- package/dist/native/index.js +0 -242
- package/dist/native/index.js.map +0 -1
- package/dist/native/prehide.d.ts +0 -7
- package/dist/native/prehide.d.ts.map +0 -1
- package/dist/native/prehide.js +0 -230
- package/dist/native/prehide.js.map +0 -1
- package/dist/native/runtime.d.ts +0 -5
- package/dist/native/runtime.d.ts.map +0 -1
- package/dist/native/runtime.js +0 -640
- package/dist/native/runtime.js.map +0 -1
- package/dist/native/shared/candidate.d.ts +0 -21
- package/dist/native/shared/candidate.d.ts.map +0 -1
- package/dist/native/shared/candidate.js +0 -98
- package/dist/native/shared/candidate.js.map +0 -1
- package/dist/native/shared/crossfade.d.ts +0 -10
- package/dist/native/shared/crossfade.d.ts.map +0 -1
- package/dist/native/shared/crossfade.js +0 -50
- package/dist/native/shared/crossfade.js.map +0 -1
- package/dist/native/shared/dom.d.ts +0 -46
- package/dist/native/shared/dom.d.ts.map +0 -1
- package/dist/native/shared/dom.js +0 -172
- package/dist/native/shared/dom.js.map +0 -1
- package/dist/native/shared/events.d.ts +0 -11
- package/dist/native/shared/events.d.ts.map +0 -1
- package/dist/native/shared/events.js +0 -13
- package/dist/native/shared/events.js.map +0 -1
- package/dist/native/shared/icons.d.ts +0 -8
- package/dist/native/shared/icons.d.ts.map +0 -1
- package/dist/native/shared/icons.js +0 -61
- package/dist/native/shared/icons.js.map +0 -1
- package/dist/native/shared/modal.d.ts +0 -10
- package/dist/native/shared/modal.d.ts.map +0 -1
- package/dist/native/shared/modal.js +0 -160
- package/dist/native/shared/modal.js.map +0 -1
- package/dist/native/vertical-bars-web-search.d.ts +0 -9
- package/dist/native/vertical-bars-web-search.d.ts.map +0 -1
- package/dist/native/vertical-bars-web-search.js +0 -84
- package/dist/native/vertical-bars-web-search.js.map +0 -1
- package/dist/native/vertical-bars-web.d.ts +0 -5
- package/dist/native/vertical-bars-web.d.ts.map +0 -1
- package/dist/native/vertical-bars-web.js +0 -341
- package/dist/native/vertical-bars-web.js.map +0 -1
- package/dist/native-integration/index.d.ts +0 -23
- package/dist/native-integration/index.d.ts.map +0 -1
- package/dist/native-integration/index.js.map +0 -1
- package/dist/native-integration/transition.d.ts +0 -5
- package/dist/native-integration/transition.d.ts.map +0 -1
- package/dist/native-integration/transition.js +0 -16
- package/dist/native-integration/transition.js.map +0 -1
- package/dist/vertical-bars.d.ts +0 -5
- package/dist/vertical-bars.js +0 -4
- package/docs/e2e-testing.md +0 -51
- package/docs/feedback.md +0 -65
- package/docs/native-ui-shell.md +0 -285
- package/docs/vertical-bars.md +0 -285
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellButton.swift +0 -71
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellButtons.swift +0 -24
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellComponents.swift +0 -18
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellFab.swift +0 -83
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellSearchController.swift +0 -432
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellSegment.swift +0 -91
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellTabBar.swift +0 -221
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift +0 -437
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalSearch.swift +0 -118
- package/ios/Sources/IonicNativeUIShellPlugin/IonicNativeUIShellPlugin.swift +0 -396
- package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellCrossfade.swift +0 -35
- package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellHost.swift +0 -8
- package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellRendering.swift +0 -27
- package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellSnapshot.swift +0 -135
- package/ios/Tests/IonicNativeUIShellPluginTests/ShellSnapshotTests.swift +0 -650
- package/src/native/components/index.ts +0 -53
- package/src/native/components/ion-back-button.ts +0 -19
- package/src/native/components/ion-button.ts +0 -24
- package/src/native/components/ion-buttons.ts +0 -38
- package/src/native/components/ion-fab.ts +0 -151
- package/src/native/components/ion-menu-button.ts +0 -24
- package/src/native/components/ion-segment.ts +0 -27
- package/src/native/components/ion-tab-bar.ts +0 -50
- package/src/native/components/searchable-tabs.ts +0 -459
- package/src/native/definitions.ts +0 -191
- package/src/native/foldable/fold-state.ts +0 -9
- package/src/native/foldable/types.ts +0 -4
- package/src/native/index.ts +0 -281
- package/src/native/prehide.ts +0 -265
- package/src/native/runtime.ts +0 -781
- package/src/native/shared/candidate.ts +0 -150
- package/src/native/shared/crossfade.ts +0 -50
- package/src/native/shared/dom.ts +0 -286
- package/src/native/shared/events.ts +0 -8
- package/src/native/shared/icons.ts +0 -57
- package/src/native/shared/modal.ts +0 -157
- package/src/native/vertical-bars-web-search.ts +0 -80
- package/src/native/vertical-bars-web.ts +0 -411
- package/src/native-integration/transition.ts +0 -15
- package/src/vertical-bars.ts +0 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
@property --ios-theme-split-pane-width{syntax:"<length>";inherits:false;initial-value:320px}ion-app.ios-theme-fold-half-opened ion-split-pane.split-pane-fold-layout,ion-split-pane.ios-theme-split-pane-half-open{--ios-theme-split-pane-width: 50vw}ion-app.ios-theme-vertical-bars{--ios-theme-vertical-bars-safe-area-left-resolved: var(--ios-theme-vertical-bars-safe-area-left, 0px);--ios-theme-vertical-bars-safe-area-right-resolved: var( --ios-theme-vertical-bars-safe-area-right, var(--ios-theme-vertical-bars-native-inset, max(80px, env(safe-area-inset-right, 0px))) )}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-left{--ios-theme-vertical-bars-safe-area-left-resolved: var( --ios-theme-vertical-bars-safe-area-left, var(--ios-theme-vertical-bars-native-inset, max(80px, env(safe-area-inset-left, 0px))) );--ios-theme-vertical-bars-safe-area-right-resolved: var(--ios-theme-vertical-bars-safe-area-right, 0px)}ion-app.ios-theme-vertical-bars ion-modal:not(.ios-theme-vertical-bars-modal){--ios-theme-vertical-bars-safe-area-left-resolved: 0px;--ios-theme-vertical-bars-safe-area-right-resolved: 0px}ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal{--ios-theme-vertical-bars-modal-toolbar-top: max( 24px, calc(var(--ios-theme-vertical-bars-toolbar-top, 220px) - var(--ios-theme-vertical-bars-modal-offset-top, 0px)) )}:is(ion-app.ios-theme-vertical-bars,ion-modal.ios-theme-vertical-bars-modal).ios-theme-vertical-bars-toolbar-ready>:is(ion-menu-button,ion-button).ios-theme-vertical-bars-toolbar-projection{--ios26-glass-background-rgb: var(--ion-background-color-rgb, 255, 255, 255);--ios26-glass-border-color-rgb: var(--ion-background-color-rgb, 255, 255, 255);--ios26-glass-box-shadow-color-rgb: var(--ion-text-color-rgb, 0, 0, 0)}ion-app.ios-theme-vertical-bars .ios-transition-shade{clip-path:inset(0 var(--ios-theme-vertical-bars-safe-area-right-resolved) 0 var(--ios-theme-vertical-bars-safe-area-left-resolved))}ion-app.ios-theme-vertical-bars ion-header.ios:not(.header-collapse-condense,.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)){--ion-safe-area-top: max(24px, env(safe-area-inset-top, 0px))}ion-app.ios-theme-vertical-bars ion-content:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)){--ion-safe-area-left: 0px;--ion-safe-area-right: 0px}ion-app.ios-theme-vertical-bars ion-content:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *))::part(scroll){padding-inline-start:calc(var(--padding-start, 0px) + var(--ios-theme-vertical-bars-safe-area-left-resolved));padding-inline-end:calc(var(--padding-end, 0px) + var(--ios-theme-vertical-bars-safe-area-right-resolved))}ion-app.ios-theme-vertical-bars ion-content:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)):dir(rtl)::part(scroll){padding-inline-start:calc(var(--padding-start, 0px) + var(--ios-theme-vertical-bars-safe-area-right-resolved));padding-inline-end:calc(var(--padding-end, 0px) + var(--ios-theme-vertical-bars-safe-area-left-resolved))}ion-app.ios-theme-vertical-bars ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)){--ion-safe-area-left: 0px;--ion-safe-area-right: 0px}ion-app.ios-theme-vertical-bars ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)):not([data-native-ui-shell-toolbar-text]):has(>.ios-theme-native-ui-shell-prehidden,>ion-buttons>.ios-theme-native-ui-shell-prehidden):not(:has(>:not(ion-buttons,.ios-theme-native-ui-shell-prehidden))):not(:has(>ion-buttons:not(.ios-theme-native-ui-shell-prehidden)>:not(.ios-theme-native-ui-shell-prehidden))){display:none}ion-app.ios-theme-vertical-bars ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)):not(:where(ion-header.header-collapse-condense *,ion-footer.footer-collapse-fade *))>ion-title.ios.title-default:not(.ios-theme-disabled,.ios26-disabled){inset-inline-start:var(--ios-theme-vertical-bars-safe-area-left-resolved);width:calc(100% - var(--ios-theme-vertical-bars-safe-area-left-resolved) - var(--ios-theme-vertical-bars-safe-area-right-resolved))}ion-app.ios-theme-vertical-bars ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)):not(:where(ion-header.header-collapse-condense *,ion-footer.footer-collapse-fade *))>ion-title.ios.title-default:not(.ios-theme-disabled,.ios26-disabled):dir(rtl){inset-inline-start:var(--ios-theme-vertical-bars-safe-area-right-resolved)}ion-app.ios-theme-vertical-bars ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)):not(:where(ion-header.header-collapse-condense *,ion-footer.footer-collapse-fade *))::part(container){padding-inline-start:calc(var(--padding-start, 0px) + var(--ios-theme-vertical-bars-safe-area-left-resolved));padding-inline-end:calc(var(--padding-end, 0px) + var(--ios-theme-vertical-bars-safe-area-right-resolved))}ion-app.ios-theme-vertical-bars ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)):not(:where(ion-header.header-collapse-condense *,ion-footer.footer-collapse-fade *)):dir(rtl)::part(container){padding-inline-start:calc(var(--padding-start, 0px) + var(--ios-theme-vertical-bars-safe-area-right-resolved));padding-inline-end:calc(var(--padding-end, 0px) + var(--ios-theme-vertical-bars-safe-area-left-resolved))}ion-app.ios-theme-vertical-bars ion-fab:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal *,ion-popover *)){--ion-safe-area-left: 0px;--ion-safe-area-right: 0px;--ios-theme-vertical-bars-fab-edge-gap: 16px;--ios-theme-vertical-bars-fab-start-offset: var(--ios-theme-menu-width, var(--ios26-menu-width, 0px))}ion-app.ios-theme-vertical-bars ion-fab:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal *,ion-popover *)).fab-horizontal-start{inset-inline-start:calc(var(--ios-theme-vertical-bars-fab-edge-gap) + var(--ios-theme-vertical-bars-fab-start-offset) + var(--ios-theme-vertical-bars-safe-area-left-resolved))}ion-app.ios-theme-vertical-bars ion-fab:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal *,ion-popover *)).fab-horizontal-end{inset-inline-end:calc(var(--ios-theme-vertical-bars-fab-edge-gap) + var(--ios-theme-vertical-bars-safe-area-right-resolved))}ion-app.ios-theme-vertical-bars ion-fab:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal *,ion-popover *)):dir(rtl).fab-horizontal-start{inset-inline-start:calc(var(--ios-theme-vertical-bars-fab-edge-gap) + var(--ios-theme-vertical-bars-fab-start-offset) + var(--ios-theme-vertical-bars-safe-area-right-resolved))}ion-app.ios-theme-vertical-bars ion-fab:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal *,ion-popover *)):dir(rtl).fab-horizontal-end{inset-inline-end:calc(var(--ios-theme-vertical-bars-fab-edge-gap) + var(--ios-theme-vertical-bars-safe-area-left-resolved))}ion-app.ios-theme-vertical-bars ion-fab:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal *,ion-popover *)):has(.fab-button-small){--ios-theme-vertical-bars-fab-edge-gap: 10px}ion-app.ios-theme-vertical-bars ion-menu:is(.ios,.md).menu-side-end:not(:dir(rtl)):not(.ios-theme-disabled,.ios26-disabled),ion-app.ios-theme-vertical-bars ion-menu:is(.ios,.md).menu-side-start:dir(rtl):not(.ios-theme-disabled,.ios26-disabled){--ion-safe-area-right: 0px}ion-app.ios-theme-vertical-bars ion-menu:is(.ios,.md).menu-side-end:not(:dir(rtl)):not(.ios-theme-disabled,.ios26-disabled)::part(container),ion-app.ios-theme-vertical-bars ion-menu:is(.ios,.md).menu-side-start:dir(rtl):not(.ios-theme-disabled,.ios26-disabled)::part(container){margin-right:var(--ios-theme-vertical-bars-safe-area-right-resolved)}ion-app.ios-theme-vertical-bars ion-menu:is(.ios,.md).menu-side-start:not(:dir(rtl)):not(.ios-theme-disabled,.ios26-disabled),ion-app.ios-theme-vertical-bars ion-menu:is(.ios,.md).menu-side-end:dir(rtl):not(.ios-theme-disabled,.ios26-disabled){--ion-safe-area-left: 0px}ion-app.ios-theme-vertical-bars ion-menu:is(.ios,.md).menu-side-start:not(:dir(rtl)):not(.ios-theme-disabled,.ios26-disabled)::part(container),ion-app.ios-theme-vertical-bars ion-menu:is(.ios,.md).menu-side-end:dir(rtl):not(.ios-theme-disabled,.ios26-disabled)::part(container){margin-left:var(--ios-theme-vertical-bars-safe-area-left-resolved)}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled){--ios-theme-side-tab-bar-width: 48px;--ios-theme-side-tab-content-width: 44px;--ios-theme-side-tab-bar-gap: 24px;contain:layout style;position:absolute;z-index:2;display:flex;flex-direction:column;width:44px;min-width:44px;max-width:44px;height:fit-content;min-height:0;padding:2px;border-radius:24px;left:auto;right:calc(24px + (48px - var(--ios-theme-side-tab-bar-width))/2);margin:0;top:auto;bottom:var(--ios-theme-side-tab-bar-gap)}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled).ios27-enable-gesture{touch-action:pan-x pinch-zoom}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled)>ion-tab-button:not(.ion-cloned-element){display:block;flex:none;width:44px;min-width:44px;height:58px;min-height:58px;border-radius:22px}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled)>ion-tab-button:not(.ion-cloned-element)::part(native){justify-content:center;min-height:58px;padding:0}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled)>ion-tab-button:not(.ion-cloned-element) ion-label{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled)>ion-tab-button:not(.ion-cloned-element) ion-icon{margin:0;font-size:28px}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled)>ion-tab-button.ion-activated{transform:scale(1.16)}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled)>ion-tab-button:not(.ion-cloned-element)~ion-tab-button:not(.ion-cloned-element){margin-block-start:-8px;margin-inline-start:0}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):is(.ios27-animated,:has(>ion-tab-button:is(.ion-activated,:active))){--ios-theme-side-tab-bar-width: 72px;--ios-theme-side-tab-content-width: 64px;--ios-theme-side-tab-bar-gap: 20px;width:64px;min-width:64px;max-width:64px;padding:4px;border-radius:36px;transform:none;-webkit-transform:none}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):is(.ios27-animated,:has(>ion-tab-button:is(.ion-activated,:active)))>ion-tab-button:not(.ion-cloned-element){width:64px;min-width:64px;height:64px;min-height:64px;border-radius:32px}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):is(.ios27-animated,:has(>ion-tab-button:is(.ion-activated,:active)))>ion-tab-button:not(.ion-cloned-element)::part(native){flex-direction:column;min-height:64px;padding-block:11px}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):is(.ios27-animated,:has(>ion-tab-button:is(.ion-activated,:active)))>ion-tab-button:not(.ion-cloned-element) ion-label{position:static;width:auto;height:auto;max-width:64px;padding:0;margin:1px 0 0;overflow:hidden;clip:auto;font-size:10px;line-height:12px;text-overflow:ellipsis;white-space:nowrap}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):is(.ios27-animated,:has(>ion-tab-button:is(.ion-activated,:active)))>ion-tab-button:not(.ion-cloned-element) ion-icon{margin:0;font-size:28px}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-left ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled){right:auto;left:calc(24px + (48px - var(--ios-theme-side-tab-bar-width))/2)}.ios-theme-native-ui-shell-prehidden{position:absolute !important;visibility:hidden !important}html.ios-theme-native-ui-shell-prehide ion-app.ios-theme-vertical-bars ion-back-button:not([icon],[color],.ios-theme-vertical-bars-back-web-owned,.ios-theme-shell-disabled,[data-shell=disabled],.ios-theme-disabled,.ios26-disabled,.ios-theme-vertical-bars-back-button-projection):not(:where(ion-menu *,ion-modal *,ion-popover *,ion-header[collapse] *,ion-footer[collapse] *,ion-buttons.ios-theme-horizontal-only *,.ios-theme-shell-disabled *,[data-shell=disabled] *,.ios-theme-disabled *,.ios26-disabled *)){position:absolute !important;visibility:hidden !important}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)) ion-back-button:is(.ios,.md)[data-native-ui-shell]:not(.ios-theme-disabled,.ios26-disabled,.ios-theme-vertical-bars-back-button-projection),ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)) ion-back-button:is(.ios,.md)[data-native-ui-shell]:not(.ios-theme-disabled,.ios26-disabled,.ios-theme-vertical-bars-back-button-projection){display:none}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)) ion-buttons:is(.ios,.md)>:is(ion-button,ion-menu-button):is(.ios,.md)[data-native-ui-shell]:not(.ios-theme-disabled,.ios26-disabled,.ios-theme-vertical-bars-toolbar-action),ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)) ion-buttons:is(.ios,.md)>:is(ion-button,ion-menu-button):is(.ios,.md)[data-native-ui-shell]:not(.ios-theme-disabled,.ios26-disabled,.ios-theme-vertical-bars-toolbar-action){display:none}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)) ion-buttons:is(.ios,.md):has(>:is(ion-back-button,ion-button,ion-menu-button)[data-native-ui-shell]):not(:has(>:is(ion-back-button,ion-button,ion-menu-button):not([data-native-ui-shell]))),ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)) ion-buttons:is(.ios,.md):has(>:is(ion-back-button,ion-button,ion-menu-button)[data-native-ui-shell]):not(:has(>:is(ion-back-button,ion-button,ion-menu-button):not([data-native-ui-shell]))){display:none}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-back-button.ios-theme-vertical-bars-back-button-projection,ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-back-button.ios-theme-vertical-bars-back-button-projection{position:fixed;z-index:1001;top:var(--ios-theme-vertical-bars-modal-toolbar-top, var(--ios-theme-vertical-bars-toolbar-top, 220px));right:max(4px,(var(--ios-theme-vertical-bars-safe-area-right-resolved) - 46px)/2);display:block;width:46px;height:46px;margin:0}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection,ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection{position:fixed;z-index:1001;top:calc(var(--ios-theme-vertical-bars-modal-toolbar-top, var(--ios-theme-vertical-bars-toolbar-top, 220px)) + var(--ios-theme-vertical-bars-toolbar-offset, 0px));right:max(4px,(var(--ios-theme-vertical-bars-safe-area-right-resolved) - 46px)/2);width:46px;min-width:46px;height:46px;min-height:46px;margin:0}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection :is(ion-icon,svg),ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection :is(ion-icon,svg){width:22px;height:22px;margin:0;font-size:22px}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-menu-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection,ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-menu-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection{backdrop-filter:blur(2px) saturate(360%);transform:translateZ(0);-webkit-transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:rgba(var(--ios-theme-glass-background-rgb, var(--ios26-glass-background-rgb)), 0.72);box-shadow:inset 0 1px 2px rgba(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)), 0.25),inset 0 -1px 2px rgba(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)), 0.3),0 -0.5px 0 rgba(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)), 0.65),0 .5px 0 rgba(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)), 0.65),0 0 0 .5px rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.22),0 .5px 1px rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.08);border:.5px solid rgb(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)));background-image:linear-gradient(180deg, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0) 4%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.01) 8%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 16%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.027) 22%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.026) 28%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.018) 36%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 44%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 50%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 58%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.008) 80%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.006) 88%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0) 94%);background-origin:padding-box;background-clip:border-box;border-inline-color:rgba(0,0,0,0)}@supports(background-clip: border-area){ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-menu-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection,ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-menu-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection{border-color:rgba(0,0,0,0);background-image:linear-gradient(180deg, rgb(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb))), transparent 50%, rgb(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)))),linear-gradient(180deg, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0) 4%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.01) 8%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 16%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.027) 22%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.026) 28%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.018) 36%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 44%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 50%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 58%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.008) 80%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.006) 88%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0) 94%),linear-gradient(transparent, transparent);background-origin:border-box,padding-box,border-box;background-clip:border-area,padding-box,border-box}}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-menu-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection,ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-menu-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection{border-radius:50%}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection:not(.button-solid):not(.button-outline),ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection:not(.button-solid):not(.button-outline){--background: rgba(var(--ios-theme-glass-background-rgb, var(--ios26-glass-background-rgb)), 0.72)}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection,ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection{--border-radius: 50%;--box-shadow:inset 0 1px 2px rgba(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)), 0.25),inset 0 -1px 2px rgba(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)), 0.3),0 -0.5px 0 rgba(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)), 0.65),0 .5px 0 rgba(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)), 0.65),0 0 0 .5px rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.22),0 .5px 1px rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.08)}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection:not(.button-outline)::part(native),ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection:not(.button-outline)::part(native){backdrop-filter:blur(2px) saturate(360%);transform:translateZ(0);-webkit-transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden;box-shadow:var(--box-shadow);border:.5px solid rgb(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)));background-image:linear-gradient(180deg, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0) 4%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.01) 8%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 16%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.027) 22%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.026) 28%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.018) 36%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 44%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 50%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 58%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.008) 80%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.006) 88%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0) 94%);background-origin:padding-box;background-clip:border-box;border-inline-color:rgba(0,0,0,0)}@supports(background-clip: border-area){ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection:not(.button-outline)::part(native),ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection:not(.button-outline)::part(native){border-color:rgba(0,0,0,0);background-image:linear-gradient(180deg, rgb(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb))), transparent 50%, rgb(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)))),linear-gradient(180deg, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0) 4%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.01) 8%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 16%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.027) 22%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.026) 28%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.018) 36%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 44%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 50%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 58%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.008) 80%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.006) 88%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0) 94%),linear-gradient(transparent, transparent);background-origin:border-box,padding-box,border-box;background-clip:border-area,padding-box,border-box}}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-buttons:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection,ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-buttons:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection{display:flex;flex-direction:column;height:auto;min-height:0}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-buttons:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection>:is(ion-button,ion-menu-button):is(.ios,.md).ios-theme-vertical-bars-toolbar-action,ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-buttons:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection>:is(ion-button,ion-menu-button):is(.ios,.md).ios-theme-vertical-bars-toolbar-action{display:block;width:44px;min-width:44px;height:46px;min-height:46px;margin:0 1px}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-buttons:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection>:is(ion-button,ion-menu-button):is(.ios,.md).ios-theme-vertical-bars-toolbar-action::part(native),ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-buttons:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection>:is(ion-button,ion-menu-button):is(.ios,.md).ios-theme-vertical-bars-toolbar-action::part(native){margin-inline:auto}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-left>ion-back-button.ios-theme-vertical-bars-back-button-projection,ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-left>:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection,ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-left ion-modal.ios-theme-vertical-bars-modal>ion-back-button.ios-theme-vertical-bars-back-button-projection,ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-left ion-modal.ios-theme-vertical-bars-modal>:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection{right:auto;left:max(4px,(var(--ios-theme-vertical-bars-safe-area-left-resolved) - 46px)/2)}ion-tab-button.ios.ion-cloned-element.ios27-vertical-tab-effect{border-radius:32px}ion-tab-button.ios.ion-cloned-element.ios27-vertical-tab-effect::part(native){min-height:0;height:100%}:is(ion-app.ios-theme-vertical-bars,ion-modal.ios-theme-vertical-bars-modal)>ion-fab.ios-theme-vertical-bars-search-projection{position:fixed;left:auto;right:25px;top:auto;bottom:24px;z-index:3;width:46px;height:46px;margin:0}:is(ion-app.ios-theme-vertical-bars,ion-modal.ios-theme-vertical-bars-modal)>ion-fab.ios-theme-vertical-bars-search-projection>ion-fab-button{width:46px;height:46px;margin:0}ion-app.ios-theme-vertical-bars ion-fab>ion-fab-button[data-native-ui-shell]{visibility:hidden !important}.ios-theme-vertical-bars-search-projection[hidden]{display:none !important}ion-app.ios-theme-vertical-bars-left>ion-fab.ios-theme-vertical-bars-search-projection,ion-app.ios-theme-vertical-bars-left ion-modal.ios-theme-vertical-bars-modal>ion-fab.ios-theme-vertical-bars-search-projection{left:25px;right:auto}
|
|
1
|
+
@property --ios-theme-split-pane-width{syntax:"<length>";inherits:false;initial-value:320px}ion-app.ios-theme-fold-half-opened ion-split-pane.split-pane-fold-layout,ion-split-pane.ios-theme-split-pane-half-open{--ios-theme-split-pane-width: 50vw}ion-app.ios-theme-vertical-bars{--ios-theme-vertical-bars-safe-area-left-resolved: var(--ios-theme-vertical-bars-safe-area-left, 0px);--ios-theme-vertical-bars-safe-area-right-resolved: var( --ios-theme-vertical-bars-safe-area-right, var(--ios-theme-vertical-bars-native-inset, max(80px, env(safe-area-inset-right, 0px))) )}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-left{--ios-theme-vertical-bars-safe-area-left-resolved: var( --ios-theme-vertical-bars-safe-area-left, var(--ios-theme-vertical-bars-native-inset, max(80px, env(safe-area-inset-left, 0px))) );--ios-theme-vertical-bars-safe-area-right-resolved: var(--ios-theme-vertical-bars-safe-area-right, 0px)}ion-app.ios-theme-vertical-bars ion-modal:not(.ios-theme-vertical-bars-modal){--ios-theme-vertical-bars-safe-area-left-resolved: 0px;--ios-theme-vertical-bars-safe-area-right-resolved: 0px}ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal{--ios-theme-vertical-bars-modal-toolbar-top: max( 24px, calc(var(--ios-theme-vertical-bars-toolbar-top, 220px) - var(--ios-theme-vertical-bars-modal-offset-top, 0px)) )}:is(ion-app.ios-theme-vertical-bars,ion-modal.ios-theme-vertical-bars-modal).ios-theme-vertical-bars-toolbar-ready>:is(ion-menu-button,ion-button).ios-theme-vertical-bars-toolbar-projection{--ios26-glass-background-rgb: var(--ion-background-color-rgb, 255, 255, 255);--ios26-glass-border-color-rgb: var(--ion-background-color-rgb, 255, 255, 255);--ios26-glass-box-shadow-color-rgb: var(--ion-text-color-rgb, 0, 0, 0)}ion-app.ios-theme-vertical-bars .ios-transition-shade{clip-path:inset(0 var(--ios-theme-vertical-bars-safe-area-right-resolved) 0 var(--ios-theme-vertical-bars-safe-area-left-resolved))}ion-app.ios-theme-vertical-bars ion-header.ios:not(.header-collapse-condense,.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)){--ion-safe-area-top: max(24px, env(safe-area-inset-top, 0px))}ion-app.ios-theme-vertical-bars ion-content:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)){--ion-safe-area-left: 0px;--ion-safe-area-right: 0px}ion-app.ios-theme-vertical-bars ion-content:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *))::part(scroll){padding-inline-start:calc(var(--padding-start, 0px) + var(--ios-theme-vertical-bars-safe-area-left-resolved));padding-inline-end:calc(var(--padding-end, 0px) + var(--ios-theme-vertical-bars-safe-area-right-resolved))}ion-app.ios-theme-vertical-bars ion-content:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)):dir(rtl)::part(scroll){padding-inline-start:calc(var(--padding-start, 0px) + var(--ios-theme-vertical-bars-safe-area-right-resolved));padding-inline-end:calc(var(--padding-end, 0px) + var(--ios-theme-vertical-bars-safe-area-left-resolved))}ion-app.ios-theme-vertical-bars ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)){--ion-safe-area-left: 0px;--ion-safe-area-right: 0px}ion-app.ios-theme-vertical-bars ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)):not([data-native-ui-toolbar-text]):has(>.native-ui-prehidden,>ion-buttons>.native-ui-prehidden):not(:has(>:not(ion-buttons,.native-ui-prehidden))):not(:has(>ion-buttons:not(.native-ui-prehidden)>:not(.native-ui-prehidden))){display:none}ion-app.ios-theme-vertical-bars ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)):not(:where(ion-header.header-collapse-condense *,ion-footer.footer-collapse-fade *))>ion-title.ios.title-default:not(.ios-theme-disabled,.ios26-disabled){inset-inline-start:var(--ios-theme-vertical-bars-safe-area-left-resolved);width:calc(100% - var(--ios-theme-vertical-bars-safe-area-left-resolved) - var(--ios-theme-vertical-bars-safe-area-right-resolved))}ion-app.ios-theme-vertical-bars ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)):not(:where(ion-header.header-collapse-condense *,ion-footer.footer-collapse-fade *))>ion-title.ios.title-default:not(.ios-theme-disabled,.ios26-disabled):dir(rtl){inset-inline-start:var(--ios-theme-vertical-bars-safe-area-right-resolved)}ion-app.ios-theme-vertical-bars ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)):not(:where(ion-header.header-collapse-condense *,ion-footer.footer-collapse-fade *))::part(container){padding-inline-start:calc(var(--padding-start, 0px) + var(--ios-theme-vertical-bars-safe-area-left-resolved));padding-inline-end:calc(var(--padding-end, 0px) + var(--ios-theme-vertical-bars-safe-area-right-resolved))}ion-app.ios-theme-vertical-bars ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)):not(:where(ion-header.header-collapse-condense *,ion-footer.footer-collapse-fade *)):dir(rtl)::part(container){padding-inline-start:calc(var(--padding-start, 0px) + var(--ios-theme-vertical-bars-safe-area-right-resolved));padding-inline-end:calc(var(--padding-end, 0px) + var(--ios-theme-vertical-bars-safe-area-left-resolved))}ion-app.ios-theme-vertical-bars ion-fab:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal *,ion-popover *)){--ion-safe-area-left: 0px;--ion-safe-area-right: 0px;--ios-theme-vertical-bars-fab-edge-gap: 16px;--ios-theme-vertical-bars-fab-start-offset: var(--ios-theme-menu-width, var(--ios26-menu-width, 0px))}ion-app.ios-theme-vertical-bars ion-fab:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal *,ion-popover *)).fab-horizontal-start{inset-inline-start:calc(var(--ios-theme-vertical-bars-fab-edge-gap) + var(--ios-theme-vertical-bars-fab-start-offset) + var(--ios-theme-vertical-bars-safe-area-left-resolved))}ion-app.ios-theme-vertical-bars ion-fab:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal *,ion-popover *)).fab-horizontal-end{inset-inline-end:calc(var(--ios-theme-vertical-bars-fab-edge-gap) + var(--ios-theme-vertical-bars-safe-area-right-resolved))}ion-app.ios-theme-vertical-bars ion-fab:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal *,ion-popover *)):dir(rtl).fab-horizontal-start{inset-inline-start:calc(var(--ios-theme-vertical-bars-fab-edge-gap) + var(--ios-theme-vertical-bars-fab-start-offset) + var(--ios-theme-vertical-bars-safe-area-right-resolved))}ion-app.ios-theme-vertical-bars ion-fab:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal *,ion-popover *)):dir(rtl).fab-horizontal-end{inset-inline-end:calc(var(--ios-theme-vertical-bars-fab-edge-gap) + var(--ios-theme-vertical-bars-safe-area-left-resolved))}ion-app.ios-theme-vertical-bars ion-fab:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal *,ion-popover *)):has(.fab-button-small){--ios-theme-vertical-bars-fab-edge-gap: 10px}ion-app.ios-theme-vertical-bars ion-menu:is(.ios,.md).menu-side-end:not(:dir(rtl)):not(.ios-theme-disabled,.ios26-disabled),ion-app.ios-theme-vertical-bars ion-menu:is(.ios,.md).menu-side-start:dir(rtl):not(.ios-theme-disabled,.ios26-disabled){--ion-safe-area-right: 0px}ion-app.ios-theme-vertical-bars ion-menu:is(.ios,.md).menu-side-end:not(:dir(rtl)):not(.ios-theme-disabled,.ios26-disabled)::part(container),ion-app.ios-theme-vertical-bars ion-menu:is(.ios,.md).menu-side-start:dir(rtl):not(.ios-theme-disabled,.ios26-disabled)::part(container){margin-right:var(--ios-theme-vertical-bars-safe-area-right-resolved)}ion-app.ios-theme-vertical-bars ion-menu:is(.ios,.md).menu-side-start:not(:dir(rtl)):not(.ios-theme-disabled,.ios26-disabled),ion-app.ios-theme-vertical-bars ion-menu:is(.ios,.md).menu-side-end:dir(rtl):not(.ios-theme-disabled,.ios26-disabled){--ion-safe-area-left: 0px}ion-app.ios-theme-vertical-bars ion-menu:is(.ios,.md).menu-side-start:not(:dir(rtl)):not(.ios-theme-disabled,.ios26-disabled)::part(container),ion-app.ios-theme-vertical-bars ion-menu:is(.ios,.md).menu-side-end:dir(rtl):not(.ios-theme-disabled,.ios26-disabled)::part(container){margin-left:var(--ios-theme-vertical-bars-safe-area-left-resolved)}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled){--ios-theme-side-tab-bar-width: 48px;--ios-theme-side-tab-content-width: 44px;--ios-theme-side-tab-bar-gap: 24px;contain:layout style;position:absolute;z-index:2;display:flex;flex-direction:column;width:44px;min-width:44px;max-width:44px;height:fit-content;min-height:0;padding:2px;border-radius:24px;left:auto;right:calc(24px + (48px - var(--ios-theme-side-tab-bar-width))/2);margin:0;top:auto;bottom:var(--ios-theme-side-tab-bar-gap)}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled).ios27-enable-gesture{touch-action:pan-x pinch-zoom}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled)>ion-tab-button:not(.ion-cloned-element){display:block;flex:none;width:44px;min-width:44px;height:58px;min-height:58px;border-radius:22px}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled)>ion-tab-button:not(.ion-cloned-element)::part(native){justify-content:center;min-height:58px;padding:0}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled)>ion-tab-button:not(.ion-cloned-element) ion-label{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled)>ion-tab-button:not(.ion-cloned-element) ion-icon{margin:0;font-size:28px}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled)>ion-tab-button.ion-activated{transform:scale(1.16)}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled)>ion-tab-button:not(.ion-cloned-element)~ion-tab-button:not(.ion-cloned-element){margin-block-start:-8px;margin-inline-start:0}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):is(.ios27-animated,:has(>ion-tab-button:is(.ion-activated,:active))){--ios-theme-side-tab-bar-width: 72px;--ios-theme-side-tab-content-width: 64px;--ios-theme-side-tab-bar-gap: 20px;width:64px;min-width:64px;max-width:64px;padding:4px;border-radius:36px;transform:none;-webkit-transform:none}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):is(.ios27-animated,:has(>ion-tab-button:is(.ion-activated,:active)))>ion-tab-button:not(.ion-cloned-element){width:64px;min-width:64px;height:64px;min-height:64px;border-radius:32px}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):is(.ios27-animated,:has(>ion-tab-button:is(.ion-activated,:active)))>ion-tab-button:not(.ion-cloned-element)::part(native){flex-direction:column;min-height:64px;padding-block:11px}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):is(.ios27-animated,:has(>ion-tab-button:is(.ion-activated,:active)))>ion-tab-button:not(.ion-cloned-element) ion-label{position:static;width:auto;height:auto;max-width:64px;padding:0;margin:1px 0 0;overflow:hidden;clip:auto;font-size:10px;line-height:12px;text-overflow:ellipsis;white-space:nowrap}ion-app.ios-theme-vertical-bars ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):is(.ios27-animated,:has(>ion-tab-button:is(.ion-activated,:active)))>ion-tab-button:not(.ion-cloned-element) ion-icon{margin:0;font-size:28px}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-left ion-tabs:not(:where(ion-menu *,ion-modal *,ion-popover *))>ion-tab-bar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled){right:auto;left:calc(24px + (48px - var(--ios-theme-side-tab-bar-width))/2)}.native-ui-prehidden{position:absolute !important;visibility:hidden !important}html.native-ui-prehide ion-app.ios-theme-vertical-bars ion-back-button:not([icon],[color],.ios-theme-vertical-bars-back-web-owned,.native-ui-disabled,[data-native-ui=disabled],.ios-theme-disabled,.ios26-disabled,.ios-theme-vertical-bars-back-button-projection):not(:where(ion-menu *,ion-modal *,ion-popover *,ion-header[collapse] *,ion-footer[collapse] *,ion-buttons.ios-theme-horizontal-only *,.native-ui-disabled *,[data-native-ui=disabled] *,.ios-theme-disabled *,.ios26-disabled *)){position:absolute !important;visibility:hidden !important}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)) ion-back-button:is(.ios,.md)[data-native-ui-projected]:not(.ios-theme-disabled,.ios26-disabled,.ios-theme-vertical-bars-back-button-projection),ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)) ion-back-button:is(.ios,.md)[data-native-ui-projected]:not(.ios-theme-disabled,.ios26-disabled,.ios-theme-vertical-bars-back-button-projection){display:none}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)) ion-buttons:is(.ios,.md)>:is(ion-button,ion-menu-button):is(.ios,.md)[data-native-ui-projected]:not(.ios-theme-disabled,.ios26-disabled,.ios-theme-vertical-bars-toolbar-action),ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)) ion-buttons:is(.ios,.md)>:is(ion-button,ion-menu-button):is(.ios,.md)[data-native-ui-projected]:not(.ios-theme-disabled,.ios26-disabled,.ios-theme-vertical-bars-toolbar-action){display:none}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)) ion-buttons:is(.ios,.md):has(>:is(ion-back-button,ion-button,ion-menu-button)[data-native-ui-projected]):not(:has(>:is(ion-back-button,ion-button,ion-menu-button):not([data-native-ui-projected]))),ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready ion-toolbar:is(.ios,.md):not(.ios-theme-disabled,.ios26-disabled):not(:where(ion-menu *,ion-modal:not(.ios-theme-vertical-bars-modal) *,ion-popover *)) ion-buttons:is(.ios,.md):has(>:is(ion-back-button,ion-button,ion-menu-button)[data-native-ui-projected]):not(:has(>:is(ion-back-button,ion-button,ion-menu-button):not([data-native-ui-projected]))){display:none}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-back-button.ios-theme-vertical-bars-back-button-projection,ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-back-button.ios-theme-vertical-bars-back-button-projection{position:fixed;z-index:1001;top:var(--ios-theme-vertical-bars-modal-toolbar-top, var(--ios-theme-vertical-bars-toolbar-top, 220px));right:max(4px,(var(--ios-theme-vertical-bars-safe-area-right-resolved) - 46px)/2);display:block;width:46px;height:46px;margin:0}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection,ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection{position:fixed;z-index:1001;top:calc(var(--ios-theme-vertical-bars-modal-toolbar-top, var(--ios-theme-vertical-bars-toolbar-top, 220px)) + var(--ios-theme-vertical-bars-toolbar-offset, 0px));right:max(4px,(var(--ios-theme-vertical-bars-safe-area-right-resolved) - 46px)/2);width:46px;min-width:46px;height:46px;min-height:46px;margin:0}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection :is(ion-icon,svg),ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection :is(ion-icon,svg){width:22px;height:22px;margin:0;font-size:22px}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-menu-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection,ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-menu-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection{backdrop-filter:blur(2px) saturate(360%);transform:translateZ(0);-webkit-transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:rgba(var(--ios-theme-glass-background-rgb, var(--ios26-glass-background-rgb)), 0.72);box-shadow:inset 0 1px 2px rgba(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)), 0.25),inset 0 -1px 2px rgba(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)), 0.3),0 -0.5px 0 rgba(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)), 0.65),0 .5px 0 rgba(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)), 0.65),0 0 0 .5px rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.22),0 .5px 1px rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.08);border:.5px solid rgb(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)));background-image:linear-gradient(180deg, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0) 4%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.01) 8%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 16%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.027) 22%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.026) 28%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.018) 36%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 44%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 50%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 58%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.008) 80%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.006) 88%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0) 94%);background-origin:padding-box;background-clip:border-box;border-inline-color:rgba(0,0,0,0)}@supports(background-clip: border-area){ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-menu-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection,ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-menu-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection{border-color:rgba(0,0,0,0);background-image:linear-gradient(180deg, rgb(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb))), transparent 50%, rgb(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)))),linear-gradient(180deg, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0) 4%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.01) 8%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 16%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.027) 22%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.026) 28%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.018) 36%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 44%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 50%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 58%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.008) 80%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.006) 88%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0) 94%),linear-gradient(transparent, transparent);background-origin:border-box,padding-box,border-box;background-clip:border-area,padding-box,border-box}}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-menu-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection,ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-menu-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection{border-radius:50%}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection:not(.button-solid):not(.button-outline),ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection:not(.button-solid):not(.button-outline){--background: rgba(var(--ios-theme-glass-background-rgb, var(--ios26-glass-background-rgb)), 0.72)}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection,ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection{--border-radius: 50%;--box-shadow:inset 0 1px 2px rgba(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)), 0.25),inset 0 -1px 2px rgba(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)), 0.3),0 -0.5px 0 rgba(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)), 0.65),0 .5px 0 rgba(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)), 0.65),0 0 0 .5px rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.22),0 .5px 1px rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.08)}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection:not(.button-outline)::part(native),ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection:not(.button-outline)::part(native){backdrop-filter:blur(2px) saturate(360%);transform:translateZ(0);-webkit-transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden;box-shadow:var(--box-shadow);border:.5px solid rgb(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)));background-image:linear-gradient(180deg, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0) 4%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.01) 8%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 16%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.027) 22%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.026) 28%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.018) 36%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 44%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 50%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 58%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.008) 80%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.006) 88%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0) 94%);background-origin:padding-box;background-clip:border-box;border-inline-color:rgba(0,0,0,0)}@supports(background-clip: border-area){ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection:not(.button-outline)::part(native),ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-button:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection:not(.button-outline)::part(native){border-color:rgba(0,0,0,0);background-image:linear-gradient(180deg, rgb(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb))), transparent 50%, rgb(var(--ios-theme-glass-border-color-rgb, var(--ios26-glass-border-color-rgb)))),linear-gradient(180deg, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0) 4%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.01) 8%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 16%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.027) 22%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.026) 28%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.018) 36%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 44%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 50%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 58%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.008) 80%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.006) 88%, rgba(var(--ion-text-color-rgb, 0, 0, 0), 0) 94%),linear-gradient(transparent, transparent);background-origin:border-box,padding-box,border-box;background-clip:border-area,padding-box,border-box}}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-buttons:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection,ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-buttons:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection{display:flex;flex-direction:column;height:auto;min-height:0}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-buttons:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection>:is(ion-button,ion-menu-button):is(.ios,.md).ios-theme-vertical-bars-toolbar-action,ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-buttons:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection>:is(ion-button,ion-menu-button):is(.ios,.md).ios-theme-vertical-bars-toolbar-action{display:block;width:44px;min-width:44px;height:46px;min-height:46px;margin:0 1px}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-toolbar-ready>ion-buttons:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection>:is(ion-button,ion-menu-button):is(.ios,.md).ios-theme-vertical-bars-toolbar-action::part(native),ion-app.ios-theme-vertical-bars ion-modal.ios-theme-vertical-bars-modal.ios-theme-vertical-bars-toolbar-ready>ion-buttons:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection>:is(ion-button,ion-menu-button):is(.ios,.md).ios-theme-vertical-bars-toolbar-action::part(native){margin-inline:auto}ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-left>ion-back-button.ios-theme-vertical-bars-back-button-projection,ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-left>:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection,ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-left ion-modal.ios-theme-vertical-bars-modal>ion-back-button.ios-theme-vertical-bars-back-button-projection,ion-app.ios-theme-vertical-bars.ios-theme-vertical-bars-left ion-modal.ios-theme-vertical-bars-modal>:is(.ios,.md).ios-theme-vertical-bars-toolbar-projection{right:auto;left:max(4px,(var(--ios-theme-vertical-bars-safe-area-left-resolved) - 46px)/2)}ion-tab-button.ios.ion-cloned-element.ios27-vertical-tab-effect{border-radius:32px}ion-tab-button.ios.ion-cloned-element.ios27-vertical-tab-effect::part(native){min-height:0;height:100%}:is(ion-app.ios-theme-vertical-bars,ion-modal.ios-theme-vertical-bars-modal)>ion-fab.ios-theme-vertical-bars-search-projection{position:fixed;left:auto;right:25px;top:auto;bottom:24px;z-index:3;width:46px;height:46px;margin:0}:is(ion-app.ios-theme-vertical-bars,ion-modal.ios-theme-vertical-bars-modal)>ion-fab.ios-theme-vertical-bars-search-projection>ion-fab-button{width:46px;height:46px;margin:0}ion-app.ios-theme-vertical-bars ion-fab>ion-fab-button[data-native-ui-projected]{visibility:hidden !important}.ios-theme-vertical-bars-search-projection[hidden]{display:none !important}ion-app.ios-theme-vertical-bars-left>ion-fab.ios-theme-vertical-bars-search-projection,ion-app.ios-theme-vertical-bars-left ion-modal.ios-theme-vertical-bars-modal>ion-fab.ios-theme-vertical-bars-search-projection{left:25px;right:auto}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,11 +2,12 @@ import { AnimationPosition, EffectScales, registeredEffect } from "./sheets-of-g
|
|
|
2
2
|
import { ElementReferences, ElementSizes, SearchableEventCache, TabBarSearchableFunction, TabBarSearchableType, attachTabBarSearchable } from "./tab-bar-searchable/index.js";
|
|
3
3
|
import { SearchbarCancelButtonIconSupport, supportSeachbarCancelButtonIcon } from "./searchbar/index.js";
|
|
4
4
|
import { IosTransitionConfig, iosTransitionAnimation, setConfig, shadow } from "./transition/ios.transition.js";
|
|
5
|
-
import {
|
|
5
|
+
import { withNativeUITransition } from "./transition/native-ui.js";
|
|
6
6
|
import { registerSegmentEffect } from "./segment/index.js";
|
|
7
|
+
import { FoldState, VerticalBarsLayout, applyFoldStateClasses, setVerticalBarsLayout } from "./layout/index.js";
|
|
7
8
|
import { iosPopoverEnterAnimation as popoverEnterAnimation, iosPopoverLeaveAnimation as popoverLeaveAnimation } from "@rdlabo/ionic-theme-utils";
|
|
8
9
|
//#region src/index.d.ts
|
|
9
10
|
export declare const registerTabBarEffect: (targetElement: HTMLElement) => registeredEffect | undefined;
|
|
10
11
|
//#endregion
|
|
11
|
-
export { AnimationPosition, EffectScales, type ElementReferences, type ElementSizes, IosTransitionConfig, type SearchableEventCache, SearchbarCancelButtonIconSupport, type TabBarSearchableFunction, TabBarSearchableType, attachTabBarSearchable, iosTransitionAnimation, popoverEnterAnimation, popoverLeaveAnimation, registerSegmentEffect, registeredEffect, setConfig, shadow, supportSeachbarCancelButtonIcon,
|
|
12
|
+
export { AnimationPosition, EffectScales, type ElementReferences, type ElementSizes, type FoldState, IosTransitionConfig, type SearchableEventCache, SearchbarCancelButtonIconSupport, type TabBarSearchableFunction, TabBarSearchableType, type VerticalBarsLayout, applyFoldStateClasses, attachTabBarSearchable, iosTransitionAnimation, popoverEnterAnimation, popoverLeaveAnimation, registerSegmentEffect, registeredEffect, setConfig, setVerticalBarsLayout, shadow, supportSeachbarCancelButtonIcon, withNativeUITransition };
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;;;;qBAaa,uBAAwB,eAAe,gBAAc"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { registerEffect } from "./sheets-of-glass/index.js";
|
|
2
2
|
import { TabBarSearchableType, attachTabBarSearchable } from "./tab-bar-searchable/index.js";
|
|
3
3
|
import { supportSeachbarCancelButtonIcon } from "./searchbar/index.js";
|
|
4
|
-
import {
|
|
4
|
+
import { withNativeUITransition } from "./transition/native-ui.js";
|
|
5
5
|
import { iosTransitionAnimation, setConfig, shadow } from "./transition/ios.transition.js";
|
|
6
6
|
import { registerSegmentEffect } from "./segment/index.js";
|
|
7
|
+
import { applyFoldStateClasses, setVerticalBarsLayout } from "./layout/index.js";
|
|
7
8
|
import { iosPopoverEnterAnimation as popoverEnterAnimation, iosPopoverLeaveAnimation as popoverLeaveAnimation } from "@rdlabo/ionic-theme-utils";
|
|
8
9
|
//#region src/index.ts
|
|
9
10
|
const registerTabBarEffect = (targetElement) => {
|
|
@@ -50,6 +51,6 @@ const registerTabBarEffect = (targetElement) => {
|
|
|
50
51
|
} };
|
|
51
52
|
};
|
|
52
53
|
//#endregion
|
|
53
|
-
export { TabBarSearchableType, attachTabBarSearchable, iosTransitionAnimation, popoverEnterAnimation, popoverLeaveAnimation, registerSegmentEffect, registerTabBarEffect, setConfig, shadow, supportSeachbarCancelButtonIcon,
|
|
54
|
+
export { TabBarSearchableType, applyFoldStateClasses, attachTabBarSearchable, iosTransitionAnimation, popoverEnterAnimation, popoverLeaveAnimation, registerSegmentEffect, registerTabBarEffect, setConfig, setVerticalBarsLayout, shadow, supportSeachbarCancelButtonIcon, withNativeUITransition };
|
|
54
55
|
|
|
55
56
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { registeredEffect } from './sheets-of-glass/interfaces';\nimport { registerEffect } from './sheets-of-glass';\nexport * from './sheets-of-glass/interfaces';\nexport {\n iosPopoverEnterAnimation as popoverEnterAnimation,\n iosPopoverLeaveAnimation as popoverLeaveAnimation,\n} from '@rdlabo/ionic-theme-utils';\nexport * from './tab-bar-searchable';\nexport * from './searchbar';\nexport * from './transition/ios.transition';\nexport {
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { registeredEffect } from './sheets-of-glass/interfaces';\nimport { registerEffect } from './sheets-of-glass';\nexport * from './sheets-of-glass/interfaces';\nexport {\n iosPopoverEnterAnimation as popoverEnterAnimation,\n iosPopoverLeaveAnimation as popoverLeaveAnimation,\n} from '@rdlabo/ionic-theme-utils';\nexport * from './tab-bar-searchable';\nexport * from './searchbar';\nexport * from './transition/ios.transition';\nexport { withNativeUITransition } from './transition/native-ui';\nexport { registerSegmentEffect } from './segment';\n\nexport const registerTabBarEffect = (targetElement: HTMLElement): registeredEffect | undefined => {\n const win = targetElement.ownerDocument.defaultView;\n if (!targetElement.classList.contains('ios') || !win) return undefined;\n const reducedMotion = win.matchMedia('(prefers-reduced-motion: reduce)');\n const verticalBarsRoot = targetElement.closest('ion-app');\n let effect: registeredEffect | undefined;\n let placement: 'disabled' | 'horizontal' | 'left' | 'right' | undefined;\n const update = () => {\n const isVertical =\n !!verticalBarsRoot?.classList.contains('ios-theme-vertical-bars') &&\n targetElement.matches('ion-tabs > ion-tab-bar:not(.ios-theme-disabled, .ios26-disabled)') &&\n !targetElement.closest('ion-menu, ion-modal, ion-popover');\n const disabled = reducedMotion.matches || !targetElement.matches('.ios:not(.ios-theme-disabled, .ios26-disabled)');\n const nextPlacement = disabled\n ? 'disabled'\n : isVertical\n ? verticalBarsRoot?.classList.contains('ios-theme-vertical-bars-left')\n ? 'left'\n : 'right'\n : 'horizontal';\n // Gesture/activation classes also change during interaction. Rebuild only when\n // eligibility or placement changes, retaining cancellation when the rail changes sides.\n if (placement === nextPlacement) return;\n placement = nextPlacement;\n effect?.destroy();\n effect = disabled\n ? undefined\n : registerEffect(\n targetElement,\n 'ion-tab-button',\n 'tab-selected',\n {\n small: 'scale(1.1, 1)',\n medium: 'scale(1.2)',\n large: 'scale(1.15, 1.4)',\n xlarge: 'scale(1.3)',\n },\n isVertical,\n );\n };\n update();\n reducedMotion.addEventListener('change', update);\n const placementObserver = new win.MutationObserver((records) => {\n if (\n records.some((record) =>\n record.type === 'attributes'\n ? record.target === targetElement || record.target === verticalBarsRoot\n : [...Array.from(record.addedNodes), ...Array.from(record.removedNodes)].some((node) => node.contains(targetElement)),\n )\n )\n update();\n });\n if (verticalBarsRoot)\n placementObserver.observe(verticalBarsRoot, { attributes: true, attributeFilter: ['class'], childList: true, subtree: true });\n placementObserver.observe(targetElement, { attributes: true, attributeFilter: ['class'] });\n return {\n destroy: () => {\n reducedMotion.removeEventListener('change', update);\n placementObserver.disconnect();\n effect?.destroy();\n effect = undefined;\n },\n };\n};\n\nexport { setVerticalBarsLayout, applyFoldStateClasses, type VerticalBarsLayout, type FoldState } from './layout';\n"],"mappings":";;;;;;;;;AAaA,MAAa,wBAAwB,kBAA6D;CAChG,MAAM,MAAM,cAAc,cAAc;CACxC,IAAI,CAAC,cAAc,UAAU,SAAS,KAAK,KAAK,CAAC,KAAK,OAAO,KAAA;CAC7D,MAAM,gBAAgB,IAAI,WAAW,kCAAkC;CACvE,MAAM,mBAAmB,cAAc,QAAQ,SAAS;CACxD,IAAI;CACJ,IAAI;CACJ,MAAM,eAAe;EACnB,MAAM,aACJ,CAAC,CAAC,kBAAkB,UAAU,SAAS,yBAAyB,KAChE,cAAc,QAAQ,kEAAkE,KACxF,CAAC,cAAc,QAAQ,kCAAkC;EAC3D,MAAM,WAAW,cAAc,WAAW,CAAC,cAAc,QAAQ,gDAAgD;EACjH,MAAM,gBAAgB,WAClB,aACA,aACE,kBAAkB,UAAU,SAAS,8BAA8B,IACjE,SACA,UACF;EAGN,IAAI,cAAc,eAAe;EACjC,YAAY;EACZ,QAAQ,QAAQ;EAChB,SAAS,WACL,KAAA,IACA,eACE,eACA,kBACA,gBACA;GACE,OAAO;GACP,QAAQ;GACR,OAAO;GACP,QAAQ;EACV,GACA,UACF;CACN;CACA,OAAO;CACP,cAAc,iBAAiB,UAAU,MAAM;CAC/C,MAAM,oBAAoB,IAAI,IAAI,kBAAkB,YAAY;EAC9D,IACE,QAAQ,MAAM,WACZ,OAAO,SAAS,eACZ,OAAO,WAAW,iBAAiB,OAAO,WAAW,mBACrD,CAAC,GAAG,MAAM,KAAK,OAAO,UAAU,GAAG,GAAG,MAAM,KAAK,OAAO,YAAY,CAAC,CAAC,CAAC,MAAM,SAAS,KAAK,SAAS,aAAa,CAAC,CACxH,GAEA,OAAO;CACX,CAAC;CACD,IAAI,kBACF,kBAAkB,QAAQ,kBAAkB;EAAE,YAAY;EAAM,iBAAiB,CAAC,OAAO;EAAG,WAAW;EAAM,SAAS;CAAK,CAAC;CAC9H,kBAAkB,QAAQ,eAAe;EAAE,YAAY;EAAM,iBAAiB,CAAC,OAAO;CAAE,CAAC;CACzF,OAAO,EACL,eAAe;EACb,cAAc,oBAAoB,UAAU,MAAM;EAClD,kBAAkB,WAAW;EAC7B,QAAQ,QAAQ;EAChB,SAAS,KAAA;CACX,EACF;AACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//#region src/layout/index.d.ts
|
|
2
|
+
export interface VerticalBarsLayout {
|
|
3
|
+
edge: 'leading' | 'trailing' | null;
|
|
4
|
+
inset?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare const setVerticalBarsLayout: (layout: VerticalBarsLayout, root?: HTMLElement, rtl?: boolean) => void;
|
|
7
|
+
export interface FoldState {
|
|
8
|
+
state: 'flat' | 'half-opened' | 'closed';
|
|
9
|
+
hingeBounds?: {
|
|
10
|
+
x: number;
|
|
11
|
+
y: number;
|
|
12
|
+
width: number;
|
|
13
|
+
height: number;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export declare function applyFoldStateClasses(root: HTMLElement, fold: FoldState): void;
|
|
17
|
+
//#endregion
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/layout/index.ts"],"mappings":";iBACiB;EACf;EACA;;qBAIW,wBAAyB,QAAQ,oBAAoB,OAAO,aAAa;iBAYrE;EACf;EACA;IAAgB;IAAW;IAAW;IAAe;;;wBAIvC,sBAAsB,MAAM,aAAa,MAAM"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
//#region src/layout/index.ts
|
|
2
|
+
/** Applies only Web layout. Does not enable Native UI or report native availability. */
|
|
3
|
+
const setVerticalBarsLayout = (layout, root, rtl) => {
|
|
4
|
+
const app = root ?? (typeof document === "undefined" ? void 0 : document.querySelector("ion-app"));
|
|
5
|
+
if (!app) return;
|
|
6
|
+
const { edge, inset = 0 } = layout;
|
|
7
|
+
const direction = rtl ?? app.closest("[dir]")?.getAttribute("dir") === "rtl";
|
|
8
|
+
app.classList.toggle("ios-theme-vertical-bars", edge !== null);
|
|
9
|
+
app.classList.toggle("ios-theme-vertical-bars-left", edge !== null && edge === "leading" !== direction);
|
|
10
|
+
if (edge && Number.isFinite(inset) && inset > 0) app.style.setProperty("--ios-theme-vertical-bars-native-inset", `${inset}px`);
|
|
11
|
+
else app.style.removeProperty("--ios-theme-vertical-bars-native-inset");
|
|
12
|
+
app.ownerDocument.defaultView?.dispatchEvent(new Event("nativeUIRefresh"));
|
|
13
|
+
};
|
|
14
|
+
/** Maps application-supplied posture to theme CSS, without subscribing to a device plugin. */
|
|
15
|
+
function applyFoldStateClasses(root, fold) {
|
|
16
|
+
for (const state of [
|
|
17
|
+
"flat",
|
|
18
|
+
"half-opened",
|
|
19
|
+
"closed"
|
|
20
|
+
]) root.classList.toggle(`ios-theme-fold-${state}`, fold.state === state);
|
|
21
|
+
root.classList.toggle("ios-theme-fold-expanded", fold.state === "half-opened" || fold.state === "flat" && !!fold.hingeBounds);
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
export { applyFoldStateClasses, setVerticalBarsLayout };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/layout/index.ts"],"sourcesContent":["/** Web layout inputs. Device capabilities belong to the application or native plugin. */\nexport interface VerticalBarsLayout {\n edge: 'leading' | 'trailing' | null;\n inset?: number;\n}\n\n/** Applies only Web layout. Does not enable Native UI or report native availability. */\nexport const setVerticalBarsLayout = (layout: VerticalBarsLayout, root?: HTMLElement, rtl?: boolean): void => {\n const app = root ?? (typeof document === 'undefined' ? undefined : document.querySelector<HTMLElement>('ion-app'));\n if (!app) return;\n const { edge, inset = 0 } = layout;\n const direction = rtl ?? app.closest('[dir]')?.getAttribute('dir') === 'rtl';\n app.classList.toggle('ios-theme-vertical-bars', edge !== null);\n app.classList.toggle('ios-theme-vertical-bars-left', edge !== null && (edge === 'leading') !== direction);\n if (edge && Number.isFinite(inset) && inset > 0) app.style.setProperty('--ios-theme-vertical-bars-native-inset', `${inset}px`);\n else app.style.removeProperty('--ios-theme-vertical-bars-native-inset');\n app.ownerDocument.defaultView?.dispatchEvent(new Event('nativeUIRefresh'));\n};\n\nexport interface FoldState {\n state: 'flat' | 'half-opened' | 'closed';\n hingeBounds?: { x: number; y: number; width: number; height: number };\n}\n\n/** Maps application-supplied posture to theme CSS, without subscribing to a device plugin. */\nexport function applyFoldStateClasses(root: HTMLElement, fold: FoldState): void {\n for (const state of ['flat', 'half-opened', 'closed']) root.classList.toggle(`ios-theme-fold-${state}`, fold.state === state);\n root.classList.toggle('ios-theme-fold-expanded', fold.state === 'half-opened' || (fold.state === 'flat' && !!fold.hingeBounds));\n}\n"],"mappings":";;AAOA,MAAa,yBAAyB,QAA4B,MAAoB,QAAwB;CAC5G,MAAM,MAAM,SAAS,OAAO,aAAa,cAAc,KAAA,IAAY,SAAS,cAA2B,SAAS;CAChH,IAAI,CAAC,KAAK;CACV,MAAM,EAAE,MAAM,QAAQ,MAAM;CAC5B,MAAM,YAAY,OAAO,IAAI,QAAQ,OAAO,CAAC,EAAE,aAAa,KAAK,MAAM;CACvE,IAAI,UAAU,OAAO,2BAA2B,SAAS,IAAI;CAC7D,IAAI,UAAU,OAAO,gCAAgC,SAAS,QAAS,SAAS,cAAe,SAAS;CACxG,IAAI,QAAQ,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG,IAAI,MAAM,YAAY,0CAA0C,GAAG,MAAM,GAAG;MACxH,IAAI,MAAM,eAAe,wCAAwC;CACtE,IAAI,cAAc,aAAa,cAAc,IAAI,MAAM,iBAAiB,CAAC;AAC3E;;AAQA,SAAgB,sBAAsB,MAAmB,MAAuB;CAC9E,KAAK,MAAM,SAAS;EAAC;EAAQ;EAAe;CAAQ,GAAG,KAAK,UAAU,OAAO,kBAAkB,SAAS,KAAK,UAAU,KAAK;CAC5H,KAAK,UAAU,OAAO,2BAA2B,KAAK,UAAU,iBAAkB,KAAK,UAAU,UAAU,CAAC,CAAC,KAAK,WAAY;AAChI"}
|
package/dist/segment/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isNativeUI } from "@rdlabo/capacitor-native-ui/integration";
|
|
2
2
|
//#region src/segment/index.ts
|
|
3
3
|
const selectionFrames = [
|
|
4
4
|
[
|
|
@@ -323,7 +323,7 @@ const registerSegmentEffect = (targetElement) => {
|
|
|
323
323
|
})), 650);
|
|
324
324
|
};
|
|
325
325
|
const down = (event) => {
|
|
326
|
-
if (pointer || event.button !== 0 || segment.disabled || reducedMotion.matches ||
|
|
326
|
+
if (pointer || event.button !== 0 || segment.disabled || reducedMotion.matches || isNativeUI(segment)) return;
|
|
327
327
|
const button = event.target.closest("ion-segment-button");
|
|
328
328
|
const old = selected();
|
|
329
329
|
if (!button || button.disabled || !old) return;
|
|
@@ -455,7 +455,7 @@ const registerSegmentEffect = (targetElement) => {
|
|
|
455
455
|
if (!pointer && !pendingEnd) abort();
|
|
456
456
|
}, { signal: listeners.signal });
|
|
457
457
|
reducedMotion.addEventListener("change", abort, { signal: listeners.signal });
|
|
458
|
-
segment.addEventListener("
|
|
458
|
+
segment.addEventListener("nativeUIChange", abort, { signal: listeners.signal });
|
|
459
459
|
return { destroy: () => {
|
|
460
460
|
destroyed = true;
|
|
461
461
|
listeners.abort();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/segment/index.ts"],"sourcesContent":["import type { registeredEffect } from '../sheets-of-glass/interfaces';\nimport { isNativeUIShell } from '../native-integration';\n\ninterface LensRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n// iOS 27 presentation-layer samples, relative to valueChanged (seconds).\n// Position is normalized; deformation is additive in points, not a width multiplier.\nconst selectionFrames = [\n [0, 0, 0, 0],\n [0.033, 0.08, 4, 3],\n [0.067, 0.27, 11, 7],\n [0.1, 0.47, 17, 10],\n [0.133, 0.64, 22, 11],\n [0.167, 0.76, 26, 10.5],\n [0.2, 0.84, 29.5, 9.5],\n [0.267, 0.935, 24, 7.5],\n [0.333, 0.994, 7.5, 3.5],\n [0.4, 1.022, -0.6, 2.9],\n [0.5, 1.024, -3.3, 2.5],\n [0.6, 1.015, -2, 1.5],\n [0.7, 1.002, -0.5, 0.4],\n [0.8, 1, 0, 0],\n];\n\nconst releaseFrames = [\n [0, 1, 1],\n [0.033, 1.01, 0.81],\n [0.067, 0.7, 0.205],\n [0.1, 0.51, -0.042],\n [0.133, 0.43, -0.101],\n [0.167, 0.189, -0.075],\n [0.2, 0.043, 0.027],\n [0.267, -0.154, 0.196],\n [0.333, -0.183, 0.236],\n [0.4, -0.123, 0.159],\n [0.5, -0.038, 0.05],\n [0.6, 0.005, -0.007],\n [0.7, 0.008, -0.01],\n [0.8, 0, 0],\n];\n\n/** Visual-only enhancement: Ionic retains ownership of selection, gestures and events. */\nexport const registerSegmentEffect = (targetElement: HTMLElement): registeredEffect | undefined => {\n const segment = targetElement as HTMLIonSegmentElement;\n const doc = segment.ownerDocument;\n const win = doc.defaultView;\n if (!segment.classList.contains('ios') || !win || segment.matches('.ios27-enable-gesture, .ios-theme-disabled, .ios26-disabled'))\n return undefined;\n const reducedMotion = win.matchMedia('(prefers-reduced-motion: reduce)');\n if (reducedMotion.matches) return undefined;\n const lens = doc.createElement('div');\n lens.className = 'ios27-segment-lens';\n lens.setAttribute('aria-hidden', 'true');\n const edge = doc.createElement('div');\n edge.className = 'ios27-segment-edge';\n lens.append(edge);\n segment.append(lens);\n segment.classList.add('ios27-enable-gesture');\n const listeners = new AbortController();\n let animation: Animation | undefined;\n let containerRelease: Animation | undefined;\n let handoff: Animation[] = [];\n let destroyed = false;\n let pendingEnd = 0;\n let surfaceWidth = 1;\n let surfaceColor = 'transparent';\n let pointer:\n | { id: number; startX: number; startedAt: number; from: LensRect; button: HTMLElement; selected: boolean; moved: boolean }\n | undefined;\n const buttons = () => Array.from(segment.querySelectorAll<HTMLIonSegmentButtonElement>('ion-segment-button'));\n const selected = () => buttons().find((button) => button.value === segment.value);\n\n const rect = (button: HTMLElement): LensRect => {\n const outer = segment.getBoundingClientRect();\n const box = button.getBoundingClientRect();\n const sx = outer.width / segment.offsetWidth || 1;\n const sy = outer.height / segment.offsetHeight || 1;\n return {\n x: (box.left + box.width / 2 - outer.left) / sx + segment.scrollLeft,\n y: (box.top + box.height / 2 - outer.top) / sy,\n width: Math.max(1, button.clientWidth - 4),\n height: button.clientHeight,\n };\n };\n const currentRect = (): LensRect => {\n const outer = segment.getBoundingClientRect();\n const box = lens.getBoundingClientRect();\n const sx = outer.width / segment.offsetWidth || 1;\n const sy = outer.height / segment.offsetHeight || 1;\n return {\n x: (box.left + box.width / 2 - outer.left) / sx + segment.scrollLeft,\n y: (box.top + box.height / 2 - outer.top) / sy,\n width: box.width / sx,\n height: box.height / sy,\n };\n };\n // Animate dimensions separately so the glass border and shadow are not scaled.\n const frame = (box: LensRect): Keyframe => ({\n transform: `translate3d(${box.x - box.width / 2}px, ${box.y - box.height / 2}px, 0)`,\n width: `${box.width}px`,\n height: `${box.height}px`,\n backgroundColor: `color-mix(in srgb, ${surfaceColor} ${100 - Math.max(0, Math.min(1, (box.width - surfaceWidth) / 24)) * 90}%, transparent)`,\n });\n const hide = () => {\n animation?.cancel();\n animation = undefined;\n lens.hidden = true;\n segment.classList.remove('ios27-animated');\n handoff.forEach((effect) => effect.cancel());\n handoff = [];\n };\n lens.hidden = true;\n const play = (frames: Keyframe[], duration: number, hold = false, startTime = win.performance.now()) => {\n animation?.cancel();\n handoff.forEach((effect) => effect.cancel());\n handoff = [];\n // WebKit can paint the newly unhidden element once at its underlying\n // top-left position before the replacement WAAPI effect is sampled.\n // Prime that underlying style so interrupted/reversed selections always\n // hand off from the first frame instead of briefly flashing at (0, 0).\n const first = frames[0];\n if (first) {\n lens.style.transform = String(first['transform']);\n lens.style.width = String(first['width']);\n lens.style.height = String(first['height']);\n lens.style.backgroundColor = String(first['backgroundColor']);\n }\n segment.classList.add('ios27-animated');\n lens.hidden = false;\n const running = lens.animate(frames, { duration, easing: 'linear', fill: 'forwards' });\n // Keep the event's timeline origin even when rendering starts a frame later.\n running.startTime = startTime;\n animation = running;\n const restingWidth = hold ? surfaceWidth : parseFloat(String(frames[frames.length - 1]['width']));\n // No raised edge at either resting endpoint; reveal it with the lens deformation.\n handoff = [\n edge.animate(\n frames.map((sample) => ({\n offset: sample.offset,\n opacity: Math.max(\n 0,\n Math.min(1, (parseFloat(String(sample['width'])) - (surfaceWidth + (restingWidth - surfaceWidth) * (sample.offset ?? 0))) / 24),\n ),\n })),\n { duration, fill: 'forwards' },\n ),\n ];\n const indicator = selected()?.shadowRoot?.querySelector<HTMLElement>('[part=\"indicator\"]');\n if (!hold && indicator) {\n // Blend into Ionic's actual selected surface, including custom colors/shadows.\n // Fading the whole lens also removes its reflective edge before it is detached.\n const offset = Math.max(0, 1 - 200 / duration);\n handoff.push(\n lens.animate([{ opacity: 1 }, { opacity: 1, offset }, { opacity: 0 }], { duration, fill: 'forwards' }),\n indicator.animate([{ opacity: 0 }, { opacity: 0, offset }, { opacity: 1 }], { duration, fill: 'forwards' }),\n );\n }\n handoff.forEach((effect) => (effect.startTime = startTime));\n if (!hold)\n void running.finished.then(\n () => {\n if (animation === running) hide();\n },\n () => {},\n );\n };\n const settle = (from: LensRect, to: LensRect, changed: boolean, startTime: number) => {\n const toolbar = segment.classList.contains('in-toolbar') && !segment.classList.contains('segment-expand');\n const frames = selectionFrames.map(([time, position, width, height], index) => {\n const remaining = 1 - position;\n const box = {\n x: from.x + (to.x - from.x) * position,\n y: from.y + (to.y - from.y) * position,\n width: Math.max(1, to.width + (from.width - to.width) * (changed ? remaining : releaseFrames[index][1]) + (changed ? width : 0)),\n height: Math.max(\n 1,\n to.height +\n (from.height - to.height) * (changed ? remaining : releaseFrames[index][2]) +\n (changed ? height * (toolbar ? 1 : 1.1) : 0),\n ),\n };\n return { ...frame(box), offset: time / 0.8 };\n });\n play(frames, 800, false, startTime);\n };\n const releasePressed = (from: LensRect, to: LensRect) => {\n const samples = [\n [0, 1],\n [0.033, 0.78],\n [0.067, 0.49],\n [0.1, 0.28],\n [0.133, 0.157],\n [0.167, 0.089],\n [0.2, 0.054],\n [0.233, 0.034],\n [0.267, 0.009],\n [0.317, 0],\n [0.43, -0.013],\n [0.65, 0],\n ];\n play(\n samples.map(([time, remaining]) => ({\n ...frame({\n ...to,\n width: to.width + (from.width - to.width) * remaining,\n height: to.height + (from.height - to.height) * remaining,\n }),\n offset: time / 0.65,\n })),\n 650,\n );\n };\n const down = (event: PointerEvent) => {\n if (pointer || event.button !== 0 || segment.disabled || reducedMotion.matches || isNativeUIShell(segment)) return;\n const button = (event.target as Element).closest<HTMLIonSegmentButtonElement>('ion-segment-button');\n const old = selected();\n if (!button || button.disabled || !old) return;\n containerRelease?.cancel();\n win.cancelAnimationFrame(pendingEnd);\n const rest = rect(old);\n surfaceWidth = rest.width;\n const style = win.getComputedStyle(old);\n surfaceColor = style.getPropertyValue('--indicator-color') || 'transparent';\n lens.style.borderRadius = style.getPropertyValue('--border-radius');\n const interrupted = !!animation;\n const from = interrupted ? currentRect() : rest;\n hide();\n pointer = {\n id: event.pointerId,\n startX: event.clientX,\n startedAt: win.performance.now(),\n from: rest,\n button: old,\n selected: old === button,\n moved: false,\n };\n segment.classList.add('ios27-segment-pressed');\n if (pointer.selected) {\n const samples = [\n [0, 0],\n [0.033, 0.133],\n [0.067, 0.43],\n [0.1, 0.67],\n [0.133, 0.83],\n [0.167, 0.92],\n [0.2, 0.97],\n [0.233, 1],\n ];\n play(\n samples.map(([time, expansion]) => ({\n ...frame({\n ...from,\n width: from.width + (rest.width + 24 - from.width) * expansion,\n height: from.height + (rest.height + 16 - from.height) * expansion,\n }),\n offset: time / 0.233,\n })),\n 233,\n true,\n );\n } else if (interrupted) {\n play([frame(from), frame(from)], 1, true);\n }\n };\n const move = (event: PointerEvent) => {\n if (!pointer || pointer.id !== event.pointerId || !pointer.selected || !segment.swipeGesture || segment.scrollable) return;\n const dx = (event.clientX - pointer.startX) / (segment.getBoundingClientRect().width / segment.offsetWidth || 1);\n if (Math.abs(dx) < 3 && !pointer.moved) return;\n pointer.moved = true;\n const centers = buttons()\n .filter((button) => !button.disabled)\n .map((button) => rect(button).x);\n const box = {\n ...pointer.from,\n x: Math.max(Math.min(...centers), Math.min(Math.max(...centers), pointer.from.x + dx)),\n width: pointer.from.width + 24,\n height: pointer.from.height + 16,\n };\n animation?.cancel();\n animation = undefined;\n Object.assign(lens.style, frame(box));\n };\n const end = (event: PointerEvent) => {\n if (!pointer || pointer.id !== event.pointerId) return;\n const releasedAt = win.performance.now();\n const state = pointer;\n const from = !lens.hidden ? currentRect() : state.from;\n const scale = new DOMMatrixReadOnly(win.getComputedStyle(segment).transform).a;\n pointer = undefined;\n segment.classList.remove('ios27-segment-pressed');\n if (\n segment.matches('.in-toolbar:not(.segment-expand)') &&\n releasedAt - state.startedAt < 200 &&\n !reducedMotion.matches &&\n event.type !== 'pointercancel'\n ) {\n // UIKit keeps outward velocity on a short tap instead of shortening the return.\n const held = (releasedAt - state.startedAt) / 1000;\n const amplitude = parseFloat(win.getComputedStyle(segment).getPropertyValue('--ios27-segment-scale')) - 1;\n const velocity = amplitude * Math.exp(-12.6 * held) * (12.6 ** 2 / 15.7 + 15.7) * Math.sin(15.7 * held);\n const frames = Array.from({ length: 37 }, (_, index) => {\n const time = index / 60;\n const displacement =\n Math.exp(-10 * time) * ((scale - 1) * Math.cos(15 * time) + ((velocity + 10 * (scale - 1)) / 15) * Math.sin(15 * time));\n return { transform: `scale(${index === 36 ? 1 : 1 + displacement})` };\n });\n const returning = segment.animate(frames, { duration: 600 });\n containerRelease = returning;\n void returning.finished.then(\n () => {\n if (containerRelease === returning) containerRelease = undefined;\n },\n () => {},\n );\n }\n // Capture runs before Ionic's pointer-end handler. Read its committed value afterwards.\n pendingEnd = win.requestAnimationFrame(() => {\n pendingEnd = 0;\n if (destroyed || pointer) return;\n const next = selected();\n if (!next || reducedMotion.matches || event.type === 'pointercancel') {\n hide();\n return;\n }\n const changed = next !== state.button;\n // Ionic has committed selection: use the destination's public appearance\n // for the moving surface as well as the final indicator.\n const nextStyle = win.getComputedStyle(next);\n surfaceColor = nextStyle.getPropertyValue('--indicator-color') || 'transparent';\n lens.style.borderRadius = nextStyle.getPropertyValue('--border-radius');\n if (!changed && !state.moved && animation) {\n // A short selected-item tap completes its press before returning, as UIKit does.\n const pressing = animation;\n void pressing.finished.then(\n () => {\n if (!destroyed && !pointer && animation === pressing) releasePressed(currentRect(), rect(next));\n },\n () => {},\n );\n } else if (changed || !lens.hidden) settle(from, rect(next), changed && !state.moved, releasedAt);\n });\n };\n const abort = () => {\n containerRelease?.cancel();\n containerRelease = undefined;\n win.cancelAnimationFrame(pendingEnd);\n pendingEnd = 0;\n pointer = undefined;\n segment.classList.remove('ios27-segment-pressed');\n hide();\n };\n segment.addEventListener('pointerdown', down, { capture: true, signal: listeners.signal });\n doc.addEventListener('pointermove', move, { capture: true, signal: listeners.signal });\n doc.addEventListener('pointerup', end, { capture: true, signal: listeners.signal });\n doc.addEventListener('pointercancel', end, { capture: true, signal: listeners.signal });\n win.addEventListener('blur', abort, { signal: listeners.signal });\n win.addEventListener('resize', abort, { signal: listeners.signal });\n segment.addEventListener(\n 'ionSelect',\n () => {\n if (!pointer && !pendingEnd) abort();\n },\n { signal: listeners.signal },\n );\n reducedMotion.addEventListener('change', abort, { signal: listeners.signal });\n segment.addEventListener('nativeUIShellChange', abort, { signal: listeners.signal });\n return {\n destroy: () => {\n destroyed = true;\n listeners.abort();\n abort();\n segment.classList.remove('ios27-enable-gesture');\n lens.remove();\n },\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/segment/index.ts"],"sourcesContent":["import type { registeredEffect } from '../sheets-of-glass/interfaces';\nimport { isNativeUI } from '@rdlabo/capacitor-native-ui/integration';\n\ninterface LensRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n// iOS 27 presentation-layer samples, relative to valueChanged (seconds).\n// Position is normalized; deformation is additive in points, not a width multiplier.\nconst selectionFrames = [\n [0, 0, 0, 0],\n [0.033, 0.08, 4, 3],\n [0.067, 0.27, 11, 7],\n [0.1, 0.47, 17, 10],\n [0.133, 0.64, 22, 11],\n [0.167, 0.76, 26, 10.5],\n [0.2, 0.84, 29.5, 9.5],\n [0.267, 0.935, 24, 7.5],\n [0.333, 0.994, 7.5, 3.5],\n [0.4, 1.022, -0.6, 2.9],\n [0.5, 1.024, -3.3, 2.5],\n [0.6, 1.015, -2, 1.5],\n [0.7, 1.002, -0.5, 0.4],\n [0.8, 1, 0, 0],\n];\n\nconst releaseFrames = [\n [0, 1, 1],\n [0.033, 1.01, 0.81],\n [0.067, 0.7, 0.205],\n [0.1, 0.51, -0.042],\n [0.133, 0.43, -0.101],\n [0.167, 0.189, -0.075],\n [0.2, 0.043, 0.027],\n [0.267, -0.154, 0.196],\n [0.333, -0.183, 0.236],\n [0.4, -0.123, 0.159],\n [0.5, -0.038, 0.05],\n [0.6, 0.005, -0.007],\n [0.7, 0.008, -0.01],\n [0.8, 0, 0],\n];\n\n/** Visual-only enhancement: Ionic retains ownership of selection, gestures and events. */\nexport const registerSegmentEffect = (targetElement: HTMLElement): registeredEffect | undefined => {\n const segment = targetElement as HTMLIonSegmentElement;\n const doc = segment.ownerDocument;\n const win = doc.defaultView;\n if (!segment.classList.contains('ios') || !win || segment.matches('.ios27-enable-gesture, .ios-theme-disabled, .ios26-disabled'))\n return undefined;\n const reducedMotion = win.matchMedia('(prefers-reduced-motion: reduce)');\n if (reducedMotion.matches) return undefined;\n const lens = doc.createElement('div');\n lens.className = 'ios27-segment-lens';\n lens.setAttribute('aria-hidden', 'true');\n const edge = doc.createElement('div');\n edge.className = 'ios27-segment-edge';\n lens.append(edge);\n segment.append(lens);\n segment.classList.add('ios27-enable-gesture');\n const listeners = new AbortController();\n let animation: Animation | undefined;\n let containerRelease: Animation | undefined;\n let handoff: Animation[] = [];\n let destroyed = false;\n let pendingEnd = 0;\n let surfaceWidth = 1;\n let surfaceColor = 'transparent';\n let pointer:\n | { id: number; startX: number; startedAt: number; from: LensRect; button: HTMLElement; selected: boolean; moved: boolean }\n | undefined;\n const buttons = () => Array.from(segment.querySelectorAll<HTMLIonSegmentButtonElement>('ion-segment-button'));\n const selected = () => buttons().find((button) => button.value === segment.value);\n\n const rect = (button: HTMLElement): LensRect => {\n const outer = segment.getBoundingClientRect();\n const box = button.getBoundingClientRect();\n const sx = outer.width / segment.offsetWidth || 1;\n const sy = outer.height / segment.offsetHeight || 1;\n return {\n x: (box.left + box.width / 2 - outer.left) / sx + segment.scrollLeft,\n y: (box.top + box.height / 2 - outer.top) / sy,\n width: Math.max(1, button.clientWidth - 4),\n height: button.clientHeight,\n };\n };\n const currentRect = (): LensRect => {\n const outer = segment.getBoundingClientRect();\n const box = lens.getBoundingClientRect();\n const sx = outer.width / segment.offsetWidth || 1;\n const sy = outer.height / segment.offsetHeight || 1;\n return {\n x: (box.left + box.width / 2 - outer.left) / sx + segment.scrollLeft,\n y: (box.top + box.height / 2 - outer.top) / sy,\n width: box.width / sx,\n height: box.height / sy,\n };\n };\n // Animate dimensions separately so the glass border and shadow are not scaled.\n const frame = (box: LensRect): Keyframe => ({\n transform: `translate3d(${box.x - box.width / 2}px, ${box.y - box.height / 2}px, 0)`,\n width: `${box.width}px`,\n height: `${box.height}px`,\n backgroundColor: `color-mix(in srgb, ${surfaceColor} ${100 - Math.max(0, Math.min(1, (box.width - surfaceWidth) / 24)) * 90}%, transparent)`,\n });\n const hide = () => {\n animation?.cancel();\n animation = undefined;\n lens.hidden = true;\n segment.classList.remove('ios27-animated');\n handoff.forEach((effect) => effect.cancel());\n handoff = [];\n };\n lens.hidden = true;\n const play = (frames: Keyframe[], duration: number, hold = false, startTime = win.performance.now()) => {\n animation?.cancel();\n handoff.forEach((effect) => effect.cancel());\n handoff = [];\n // WebKit can paint the newly unhidden element once at its underlying\n // top-left position before the replacement WAAPI effect is sampled.\n // Prime that underlying style so interrupted/reversed selections always\n // hand off from the first frame instead of briefly flashing at (0, 0).\n const first = frames[0];\n if (first) {\n lens.style.transform = String(first['transform']);\n lens.style.width = String(first['width']);\n lens.style.height = String(first['height']);\n lens.style.backgroundColor = String(first['backgroundColor']);\n }\n segment.classList.add('ios27-animated');\n lens.hidden = false;\n const running = lens.animate(frames, { duration, easing: 'linear', fill: 'forwards' });\n // Keep the event's timeline origin even when rendering starts a frame later.\n running.startTime = startTime;\n animation = running;\n const restingWidth = hold ? surfaceWidth : parseFloat(String(frames[frames.length - 1]['width']));\n // No raised edge at either resting endpoint; reveal it with the lens deformation.\n handoff = [\n edge.animate(\n frames.map((sample) => ({\n offset: sample.offset,\n opacity: Math.max(\n 0,\n Math.min(1, (parseFloat(String(sample['width'])) - (surfaceWidth + (restingWidth - surfaceWidth) * (sample.offset ?? 0))) / 24),\n ),\n })),\n { duration, fill: 'forwards' },\n ),\n ];\n const indicator = selected()?.shadowRoot?.querySelector<HTMLElement>('[part=\"indicator\"]');\n if (!hold && indicator) {\n // Blend into Ionic's actual selected surface, including custom colors/shadows.\n // Fading the whole lens also removes its reflective edge before it is detached.\n const offset = Math.max(0, 1 - 200 / duration);\n handoff.push(\n lens.animate([{ opacity: 1 }, { opacity: 1, offset }, { opacity: 0 }], { duration, fill: 'forwards' }),\n indicator.animate([{ opacity: 0 }, { opacity: 0, offset }, { opacity: 1 }], { duration, fill: 'forwards' }),\n );\n }\n handoff.forEach((effect) => (effect.startTime = startTime));\n if (!hold)\n void running.finished.then(\n () => {\n if (animation === running) hide();\n },\n () => {},\n );\n };\n const settle = (from: LensRect, to: LensRect, changed: boolean, startTime: number) => {\n const toolbar = segment.classList.contains('in-toolbar') && !segment.classList.contains('segment-expand');\n const frames = selectionFrames.map(([time, position, width, height], index) => {\n const remaining = 1 - position;\n const box = {\n x: from.x + (to.x - from.x) * position,\n y: from.y + (to.y - from.y) * position,\n width: Math.max(1, to.width + (from.width - to.width) * (changed ? remaining : releaseFrames[index][1]) + (changed ? width : 0)),\n height: Math.max(\n 1,\n to.height +\n (from.height - to.height) * (changed ? remaining : releaseFrames[index][2]) +\n (changed ? height * (toolbar ? 1 : 1.1) : 0),\n ),\n };\n return { ...frame(box), offset: time / 0.8 };\n });\n play(frames, 800, false, startTime);\n };\n const releasePressed = (from: LensRect, to: LensRect) => {\n const samples = [\n [0, 1],\n [0.033, 0.78],\n [0.067, 0.49],\n [0.1, 0.28],\n [0.133, 0.157],\n [0.167, 0.089],\n [0.2, 0.054],\n [0.233, 0.034],\n [0.267, 0.009],\n [0.317, 0],\n [0.43, -0.013],\n [0.65, 0],\n ];\n play(\n samples.map(([time, remaining]) => ({\n ...frame({\n ...to,\n width: to.width + (from.width - to.width) * remaining,\n height: to.height + (from.height - to.height) * remaining,\n }),\n offset: time / 0.65,\n })),\n 650,\n );\n };\n const down = (event: PointerEvent) => {\n if (pointer || event.button !== 0 || segment.disabled || reducedMotion.matches || isNativeUI(segment)) return;\n const button = (event.target as Element).closest<HTMLIonSegmentButtonElement>('ion-segment-button');\n const old = selected();\n if (!button || button.disabled || !old) return;\n containerRelease?.cancel();\n win.cancelAnimationFrame(pendingEnd);\n const rest = rect(old);\n surfaceWidth = rest.width;\n const style = win.getComputedStyle(old);\n surfaceColor = style.getPropertyValue('--indicator-color') || 'transparent';\n lens.style.borderRadius = style.getPropertyValue('--border-radius');\n const interrupted = !!animation;\n const from = interrupted ? currentRect() : rest;\n hide();\n pointer = {\n id: event.pointerId,\n startX: event.clientX,\n startedAt: win.performance.now(),\n from: rest,\n button: old,\n selected: old === button,\n moved: false,\n };\n segment.classList.add('ios27-segment-pressed');\n if (pointer.selected) {\n const samples = [\n [0, 0],\n [0.033, 0.133],\n [0.067, 0.43],\n [0.1, 0.67],\n [0.133, 0.83],\n [0.167, 0.92],\n [0.2, 0.97],\n [0.233, 1],\n ];\n play(\n samples.map(([time, expansion]) => ({\n ...frame({\n ...from,\n width: from.width + (rest.width + 24 - from.width) * expansion,\n height: from.height + (rest.height + 16 - from.height) * expansion,\n }),\n offset: time / 0.233,\n })),\n 233,\n true,\n );\n } else if (interrupted) {\n play([frame(from), frame(from)], 1, true);\n }\n };\n const move = (event: PointerEvent) => {\n if (!pointer || pointer.id !== event.pointerId || !pointer.selected || !segment.swipeGesture || segment.scrollable) return;\n const dx = (event.clientX - pointer.startX) / (segment.getBoundingClientRect().width / segment.offsetWidth || 1);\n if (Math.abs(dx) < 3 && !pointer.moved) return;\n pointer.moved = true;\n const centers = buttons()\n .filter((button) => !button.disabled)\n .map((button) => rect(button).x);\n const box = {\n ...pointer.from,\n x: Math.max(Math.min(...centers), Math.min(Math.max(...centers), pointer.from.x + dx)),\n width: pointer.from.width + 24,\n height: pointer.from.height + 16,\n };\n animation?.cancel();\n animation = undefined;\n Object.assign(lens.style, frame(box));\n };\n const end = (event: PointerEvent) => {\n if (!pointer || pointer.id !== event.pointerId) return;\n const releasedAt = win.performance.now();\n const state = pointer;\n const from = !lens.hidden ? currentRect() : state.from;\n const scale = new DOMMatrixReadOnly(win.getComputedStyle(segment).transform).a;\n pointer = undefined;\n segment.classList.remove('ios27-segment-pressed');\n if (\n segment.matches('.in-toolbar:not(.segment-expand)') &&\n releasedAt - state.startedAt < 200 &&\n !reducedMotion.matches &&\n event.type !== 'pointercancel'\n ) {\n // UIKit keeps outward velocity on a short tap instead of shortening the return.\n const held = (releasedAt - state.startedAt) / 1000;\n const amplitude = parseFloat(win.getComputedStyle(segment).getPropertyValue('--ios27-segment-scale')) - 1;\n const velocity = amplitude * Math.exp(-12.6 * held) * (12.6 ** 2 / 15.7 + 15.7) * Math.sin(15.7 * held);\n const frames = Array.from({ length: 37 }, (_, index) => {\n const time = index / 60;\n const displacement =\n Math.exp(-10 * time) * ((scale - 1) * Math.cos(15 * time) + ((velocity + 10 * (scale - 1)) / 15) * Math.sin(15 * time));\n return { transform: `scale(${index === 36 ? 1 : 1 + displacement})` };\n });\n const returning = segment.animate(frames, { duration: 600 });\n containerRelease = returning;\n void returning.finished.then(\n () => {\n if (containerRelease === returning) containerRelease = undefined;\n },\n () => {},\n );\n }\n // Capture runs before Ionic's pointer-end handler. Read its committed value afterwards.\n pendingEnd = win.requestAnimationFrame(() => {\n pendingEnd = 0;\n if (destroyed || pointer) return;\n const next = selected();\n if (!next || reducedMotion.matches || event.type === 'pointercancel') {\n hide();\n return;\n }\n const changed = next !== state.button;\n // Ionic has committed selection: use the destination's public appearance\n // for the moving surface as well as the final indicator.\n const nextStyle = win.getComputedStyle(next);\n surfaceColor = nextStyle.getPropertyValue('--indicator-color') || 'transparent';\n lens.style.borderRadius = nextStyle.getPropertyValue('--border-radius');\n if (!changed && !state.moved && animation) {\n // A short selected-item tap completes its press before returning, as UIKit does.\n const pressing = animation;\n void pressing.finished.then(\n () => {\n if (!destroyed && !pointer && animation === pressing) releasePressed(currentRect(), rect(next));\n },\n () => {},\n );\n } else if (changed || !lens.hidden) settle(from, rect(next), changed && !state.moved, releasedAt);\n });\n };\n const abort = () => {\n containerRelease?.cancel();\n containerRelease = undefined;\n win.cancelAnimationFrame(pendingEnd);\n pendingEnd = 0;\n pointer = undefined;\n segment.classList.remove('ios27-segment-pressed');\n hide();\n };\n segment.addEventListener('pointerdown', down, { capture: true, signal: listeners.signal });\n doc.addEventListener('pointermove', move, { capture: true, signal: listeners.signal });\n doc.addEventListener('pointerup', end, { capture: true, signal: listeners.signal });\n doc.addEventListener('pointercancel', end, { capture: true, signal: listeners.signal });\n win.addEventListener('blur', abort, { signal: listeners.signal });\n win.addEventListener('resize', abort, { signal: listeners.signal });\n segment.addEventListener(\n 'ionSelect',\n () => {\n if (!pointer && !pendingEnd) abort();\n },\n { signal: listeners.signal },\n );\n reducedMotion.addEventListener('change', abort, { signal: listeners.signal });\n segment.addEventListener('nativeUIChange', abort, { signal: listeners.signal });\n return {\n destroy: () => {\n destroyed = true;\n listeners.abort();\n abort();\n segment.classList.remove('ios27-enable-gesture');\n lens.remove();\n },\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { changeSelectedElement, cloneElement, getStep } from "../utils.js";
|
|
2
|
-
import { isNativeUIShell } from "../native-integration/index.js";
|
|
3
2
|
import { animationRect, createMoveAnimation, createPreMoveAnimation, createTabBarDragAnimation, createTabBarPressAnimation, createTabBarReleaseAnimation, getMoveAnimationKeyframe, getScaleAnimation } from "./animations.js";
|
|
4
3
|
import { createGesture } from "@ionic/core/components/index.js";
|
|
4
|
+
import { isNativeUI } from "@rdlabo/capacitor-native-ui/integration";
|
|
5
5
|
//#region src/sheets-of-glass/index.ts
|
|
6
6
|
const GESTURE_NAME = "ios27-enable-gesture";
|
|
7
7
|
const ANIMATED_NAME = "ios27-animated";
|
|
@@ -70,7 +70,7 @@ const registerEffect = (targetElement, effectTagName, selectedClassName, scales,
|
|
|
70
70
|
* They terminate the gesture using native events as a fallback.
|
|
71
71
|
*/
|
|
72
72
|
const onPointerDown = (event) => {
|
|
73
|
-
if (
|
|
73
|
+
if (isNativeUI(targetElement)) return;
|
|
74
74
|
stopTabPress();
|
|
75
75
|
tabDragging = false;
|
|
76
76
|
releaseAnimation?.destroy();
|
|
@@ -144,7 +144,7 @@ const registerEffect = (targetElement, effectTagName, selectedClassName, scales,
|
|
|
144
144
|
targetElement.classList.remove(ANIMATED_NAME);
|
|
145
145
|
};
|
|
146
146
|
const onStartGesture = (detail) => {
|
|
147
|
-
if (
|
|
147
|
+
if (isNativeUI(targetElement)) return false;
|
|
148
148
|
currentTouchedElement = detail.event.target.closest(effectTagName) || void 0;
|
|
149
149
|
const tabSelectedElement = targetElement.querySelector(`${effectTagName}.${selectedClassName}`);
|
|
150
150
|
if (currentTouchedElement === void 0 || currentTouchedElement.parentElement !== targetElement || currentTouchedElement.disabled || tabSelectedElement === null) {
|
|
@@ -269,17 +269,17 @@ const registerEffect = (targetElement, effectTagName, selectedClassName, scales,
|
|
|
269
269
|
return true;
|
|
270
270
|
};
|
|
271
271
|
const nativeChanged = () => {
|
|
272
|
-
gesture.enable(!
|
|
272
|
+
gesture.enable(!isNativeUI(targetElement));
|
|
273
273
|
cancelActiveGesture();
|
|
274
274
|
};
|
|
275
|
-
targetElement.addEventListener("
|
|
276
|
-
if (
|
|
275
|
+
targetElement.addEventListener("nativeUIChange", nativeChanged);
|
|
276
|
+
if (isNativeUI(targetElement)) nativeChanged();
|
|
277
277
|
return { destroy: () => {
|
|
278
278
|
destroyed = true;
|
|
279
279
|
cancelActiveGesture();
|
|
280
280
|
targetElement.removeEventListener("pointerdown", onPointerDown);
|
|
281
281
|
targetElement.removeEventListener("click", onClick, true);
|
|
282
|
-
targetElement.removeEventListener("
|
|
282
|
+
targetElement.removeEventListener("nativeUIChange", nativeChanged);
|
|
283
283
|
if (gesture) gesture.destroy();
|
|
284
284
|
targetElement.classList.remove(GESTURE_NAME);
|
|
285
285
|
effectElement.remove();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/sheets-of-glass/index.ts"],"sourcesContent":["import { AnimationPosition, EffectScales, registeredEffect } from './interfaces';\nimport { createAnimation, createGesture } from '@ionic/core/components/index.js';\nimport type { Animation, Gesture, GestureDetail } from '@ionic/core/components';\nimport { changeSelectedElement, cloneElement, getStep } from '../utils';\nimport { isNativeUIShell } from '../native-integration';\nimport {\n animationRect,\n createMoveAnimation,\n createPreMoveAnimation,\n createTabBarDragAnimation,\n createTabBarPressAnimation,\n createTabBarReleaseAnimation,\n getMoveAnimationKeyframe,\n getScaleAnimation,\n} from './animations';\n\nconst GESTURE_NAME = 'ios27-enable-gesture';\nconst ANIMATED_NAME = 'ios27-animated';\n\nexport const registerEffect = (\n targetElement: HTMLElement,\n effectTagName: string,\n selectedClassName: string,\n scales: EffectScales,\n vertical = false,\n): registeredEffect | undefined => {\n if (!targetElement.classList.contains('ios')) {\n return undefined;\n }\n\n let gesture!: Gesture;\n let moveAnimation: Animation | undefined;\n let currentTouchedElement: HTMLElement | undefined;\n let selectedElementBeforeGesture: HTMLElement | undefined;\n let clearActivatedTimer: ReturnType<typeof setTimeout> | undefined;\n let animationPosition: AnimationPosition | undefined = undefined;\n let scaleAnimationPromise: Promise<void> | undefined;\n let startAnimationPromise: Promise<void> | undefined;\n let maxVelocity = 0;\n let releaseAnimation: Animation | undefined;\n let tabPressAnimation: Animation | undefined;\n let tabPressStartedAt = 0;\n let tabDragging = false;\n let destroyed = false;\n const originalTabBarScale = targetElement.style.getPropertyValue('--ios27-tab-bar-scale');\n const effectElement = cloneElement(effectTagName, false);\n if (vertical) effectElement.classList.add('ios27-vertical-tab-effect');\n const stopTabPress = () => {\n if (!tabPressAnimation) return;\n const native = effectElement.shadowRoot!.querySelector<HTMLElement>('[part=\"native\"]')!;\n const transform = getComputedStyle(effectElement).transform;\n const scale = getComputedStyle(native).transform;\n tabPressAnimation.destroy();\n tabPressAnimation = undefined;\n effectElement.style.transform = transform;\n native.style.transform = scale;\n };\n let onPointerUp: (() => void) | undefined;\n let onPointerCancel: (() => void) | undefined;\n\n const removePointerEndListeners = () => {\n if (onPointerUp) {\n document.removeEventListener('pointerup', onPointerUp);\n onPointerUp = undefined;\n }\n if (onPointerCancel) {\n document.removeEventListener('pointercancel', onPointerCancel);\n onPointerCancel = undefined;\n }\n };\n\n const cancelActiveGesture = () => {\n stopTabPress();\n releaseAnimation?.destroy();\n releaseAnimation = undefined;\n removePointerEndListeners();\n if (clearActivatedTimer !== undefined) {\n clearTimeout(clearActivatedTimer);\n clearActivatedTimer = undefined;\n }\n currentTouchedElement?.classList.remove('ion-activated');\n // Preserve a committed selection, or restore the original if the press was cancelled.\n if (!currentTouchedElement?.classList.contains(selectedClassName)) {\n selectedElementBeforeGesture?.classList.add(selectedClassName);\n }\n currentTouchedElement = undefined;\n selectedElementBeforeGesture = undefined;\n moveAnimation?.destroy();\n moveAnimation = undefined;\n effectElement.style.display = 'none';\n maxVelocity = 0;\n targetElement.classList.remove(ANIMATED_NAME);\n };\n\n /**\n * These event listeners fix a bug where gestures don't complete properly.\n * They terminate the gesture using native events as a fallback.\n */\n const onPointerDown = (event: PointerEvent) => {\n if (isNativeUIShell(targetElement)) return;\n stopTabPress();\n tabDragging = false;\n releaseAnimation?.destroy();\n releaseAnimation = undefined;\n clearActivated();\n gesture.destroy();\n createAnimationGesture();\n removePointerEndListeners();\n onPointerUp = () => {\n clearActivatedTimer = setTimeout(async () => {\n await onEndGesture();\n if (destroyed) return;\n gesture.destroy();\n createAnimationGesture();\n });\n removePointerEndListeners();\n };\n onPointerCancel = () => {\n cancelActiveGesture();\n gesture.destroy();\n createAnimationGesture();\n };\n document.addEventListener('pointerup', onPointerUp);\n document.addEventListener('pointercancel', onPointerCancel);\n };\n targetElement.addEventListener('pointerdown', onPointerDown);\n const onClick = (event: MouseEvent) => {\n // A drag commits its destination itself; the browser may click the old pressed tab.\n if (vertical && tabDragging && event.isTrusted && event.detail > 0) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n };\n targetElement.addEventListener('click', onClick, true);\n\n const axisDetail = (detail: GestureDetail): GestureDetail =>\n vertical\n ? {\n ...detail,\n currentX: detail.currentY,\n currentY: detail.currentX,\n startX: detail.startY,\n startY: detail.startX,\n velocityX: detail.velocityY,\n velocityY: detail.velocityX,\n }\n : detail;\n const createAnimationGesture = () => {\n targetElement.classList.add(GESTURE_NAME);\n gesture = createGesture({\n el: targetElement,\n threshold: 0,\n direction: vertical ? 'y' : 'x',\n gestureName: `${GESTURE_NAME}_${effectTagName}_${crypto.randomUUID()}`,\n onStart: (event) => onStartGesture(axisDetail(event)),\n onMove: (event) => onMoveGesture(axisDetail(event)),\n onEnd: (detail) => {\n // Ionic coalesces moves; consume the release coordinate before committing a drag.\n if (effectTagName === 'ion-tab-button' && tabDragging) onMoveGesture(axisDetail(detail));\n onEndGesture().then();\n },\n });\n gesture.enable(true);\n };\n createAnimationGesture();\n\n const clearActivated = (isEndGesture: boolean = false) => {\n if (!currentTouchedElement) {\n return;\n }\n if (!isEndGesture && !currentTouchedElement.classList.contains(selectedClassName)) {\n currentTouchedElement!.click();\n currentTouchedElement.classList.add(selectedClassName);\n }\n currentTouchedElement.classList.remove('ion-activated');\n currentTouchedElement = undefined;\n selectedElementBeforeGesture = undefined;\n effectElement.style.display = 'none';\n maxVelocity = 0;\n targetElement.classList.remove(ANIMATED_NAME);\n };\n\n const onStartGesture = (detail: GestureDetail): boolean | undefined => {\n if (isNativeUIShell(targetElement)) return false;\n currentTouchedElement = ((detail.event.target as HTMLElement).closest(effectTagName) as HTMLElement) || undefined;\n const tabSelectedElement = targetElement.querySelector(`${effectTagName}.${selectedClassName}`);\n if (\n currentTouchedElement === undefined ||\n currentTouchedElement.parentElement !== targetElement ||\n (currentTouchedElement as HTMLIonTabButtonElement).disabled ||\n tabSelectedElement === null\n ) {\n currentTouchedElement = undefined;\n return false;\n }\n selectedElementBeforeGesture = tabSelectedElement as HTMLElement;\n if (effectTagName === 'ion-tab-button') {\n // UIKit expands the platter by 14.14pt at both two- and four-tab widths.\n targetElement.style.setProperty(\n '--ios27-tab-bar-scale',\n String(1 + 14.14 / (vertical ? targetElement.offsetHeight : targetElement.offsetWidth)),\n );\n }\n if (vertical) targetElement.classList.add(ANIMATED_NAME);\n animationPosition = {\n minPositionX: animationRect(targetElement, vertical).left,\n maxPositionX:\n animationRect(targetElement, vertical).right - (vertical ? tabSelectedElement.clientHeight : tabSelectedElement.clientWidth),\n width: vertical ? tabSelectedElement.clientHeight : tabSelectedElement.clientWidth,\n positionY: animationRect(tabSelectedElement, vertical).top,\n };\n targetElement.classList.add(ANIMATED_NAME);\n changeSelectedElement(targetElement, currentTouchedElement, effectTagName, selectedClassName);\n\n if (effectTagName === 'ion-tab-button') {\n moveAnimation = createMoveAnimation(effectElement, detail, tabSelectedElement, animationPosition, vertical);\n moveAnimation.progressStart(\n true,\n getStep(\n animationRect(tabSelectedElement, vertical).left + animationRect(tabSelectedElement, vertical).width / 2,\n animationPosition,\n ),\n );\n tabPressAnimation = createTabBarPressAnimation(\n effectElement,\n tabSelectedElement as HTMLElement,\n currentTouchedElement,\n targetElement,\n vertical,\n );\n tabPressStartedAt = performance.now();\n void tabPressAnimation.play();\n return true;\n }\n\n const startAnimation = (() => {\n if (tabSelectedElement === currentTouchedElement) {\n return new Promise<void>((resolve) => resolve());\n } else {\n const preMoveAnimation = createPreMoveAnimation(effectElement, tabSelectedElement, currentTouchedElement, animationPosition!);\n return preMoveAnimation.play().finally(() => preMoveAnimation.destroy());\n }\n })();\n startAnimationPromise = startAnimation;\n startAnimation.then(() => {\n if (!currentTouchedElement) {\n return;\n }\n moveAnimation = createMoveAnimation(effectElement, detail, tabSelectedElement, animationPosition!);\n moveAnimation.progressStart(\n true,\n getStep(currentTouchedElement.getBoundingClientRect().left + currentTouchedElement.clientWidth / 2, animationPosition!),\n );\n });\n getScaleAnimation(effectElement).duration(200).to('opacity', 1).to('transform', scales.large).play();\n return true;\n };\n\n const onMoveGesture = (detail: GestureDetail): boolean | undefined => {\n if (currentTouchedElement === undefined || !moveAnimation || releaseAnimation) {\n return false; // Skip Animation\n }\n if (effectTagName === 'ion-tab-button') {\n if (Math.abs(detail.currentX - detail.startX) < 3 && !tabDragging) return;\n tabDragging = true;\n stopTabPress();\n tabPressAnimation = createTabBarDragAnimation(effectElement, targetElement, detail.velocityX, vertical);\n void tabPressAnimation.play();\n } else if (scaleAnimationPromise === undefined) {\n if (Math.abs(detail.velocityX) > maxVelocity) {\n maxVelocity = Math.abs(detail.velocityX);\n }\n if (Math.abs(detail.velocityX) > 0.2) {\n scaleAnimationPromise = getScaleAnimation(effectElement)\n .duration(720)\n .keyframes(getMoveAnimationKeyframe('slowly', scales))\n .play()\n .finally(() => (scaleAnimationPromise = undefined));\n }\n if (maxVelocity > 0.2 && Math.abs(detail.velocityX) < 0.15 && Math.abs(detail.startX - detail.currentX) > 100) {\n scaleAnimationPromise = getScaleAnimation(effectElement)\n .duration(720)\n .keyframes(getMoveAnimationKeyframe(detail.velocityX > 0 ? 'moveRight' : 'moveLeft', scales))\n .play()\n .finally(() => (scaleAnimationPromise = undefined));\n maxVelocity = 0;\n }\n }\n\n const currentX = detail.currentX;\n const previousY = animationRect(targetElement, vertical).top + animationRect(targetElement, vertical).height / 2;\n const nextEl = (targetElement.getRootNode() as Document | ShadowRoot).elementFromPoint(\n vertical ? previousY : currentX,\n vertical ? currentX : previousY,\n );\n let latestTouchedElement: HTMLElement | undefined = (nextEl?.closest(effectTagName) as HTMLElement) || undefined;\n if (vertical && effectTagName === 'ion-tab-button') {\n // Overlapping, scaled tabs must not steal a drag from their neighbor.\n const bar = targetElement.getBoundingClientRect();\n const tabs = Array.from(targetElement.querySelectorAll<HTMLElement>(effectTagName)).filter((tab) => tab.offsetWidth > 0);\n const distance = (tab: HTMLElement) => Math.abs(currentX - (bar.top + tab.offsetTop + tab.offsetHeight / 2));\n latestTouchedElement =\n currentX >= bar.top && currentX <= bar.bottom\n ? tabs.reduce<HTMLElement | undefined>(\n (closest, tab) => (!closest || distance(tab) < distance(closest) ? tab : closest),\n undefined,\n )\n : undefined;\n }\n\n if (\n latestTouchedElement &&\n latestTouchedElement.parentElement === targetElement &&\n !(latestTouchedElement as HTMLIonTabButtonElement).disabled &&\n currentTouchedElement !== latestTouchedElement\n ) {\n currentTouchedElement = latestTouchedElement;\n changeSelectedElement(targetElement, currentTouchedElement, effectTagName, selectedClassName);\n }\n moveAnimation.progressStep(getStep(detail.currentX, animationPosition!));\n return true;\n };\n\n const onEndGesture = async (): Promise<boolean | undefined> => {\n if (releaseAnimation) return;\n // タイマーをクリア(正常にonEndGestureが実行された場合)\n if (clearActivatedTimer !== undefined) {\n clearTimeout(clearActivatedTimer);\n clearActivatedTimer = undefined;\n }\n\n if (currentTouchedElement && !currentTouchedElement.classList.contains(selectedClassName)) {\n currentTouchedElement.click();\n currentTouchedElement.classList.add(selectedClassName);\n }\n\n if (startAnimationPromise) {\n await startAnimationPromise;\n }\n\n const tapElapsed =\n tabPressAnimation && !tabDragging && selectedElementBeforeGesture !== currentTouchedElement\n ? performance.now() - tabPressStartedAt\n : undefined;\n if (tabPressAnimation && !tabDragging && tapElapsed === undefined) {\n // A quick tap still completes the initial stretch before relaxing.\n const pressing = tabPressAnimation;\n const remaining = 200 - (performance.now() - tabPressStartedAt);\n if (remaining > 0) await new Promise<void>((resolve) => setTimeout(resolve, remaining));\n if (tabPressAnimation !== pressing) return;\n }\n\n if (currentTouchedElement === undefined || !moveAnimation || releaseAnimation) {\n return false;\n }\n\n if (effectTagName !== 'ion-tab-button')\n setTimeout(() => {\n if (!currentTouchedElement) {\n return;\n }\n const targetX = currentTouchedElement.getBoundingClientRect().left + currentTouchedElement.clientWidth / 2;\n const step = getStep(targetX, animationPosition!);\n moveAnimation!.progressStep(step);\n });\n if (effectTagName === 'ion-tab-button') {\n stopTabPress();\n moveAnimation.destroy();\n moveAnimation = undefined;\n const tabs = Array.from(targetElement.querySelectorAll<HTMLElement>(effectTagName)).filter((tab) => tab.offsetWidth > 0);\n if (vertical) {\n currentTouchedElement.classList.remove('ion-activated');\n targetElement.classList.remove(ANIMATED_NAME);\n }\n const releasing = createTabBarReleaseAnimation(\n effectElement,\n currentTouchedElement,\n tapElapsed !== undefined && tapElapsed < 200\n ? {\n elapsed: tapElapsed,\n distance: Math.abs(tabs.indexOf(currentTouchedElement) - tabs.indexOf(selectedElementBeforeGesture!)),\n }\n : undefined,\n vertical,\n );\n currentTouchedElement.classList.remove('ion-activated');\n releaseAnimation = releasing;\n await releasing.play();\n if (releaseAnimation !== releasing) return;\n clearActivated(true);\n releasing.destroy();\n releaseAnimation = undefined;\n } else {\n await getScaleAnimation(effectElement).duration(120).to('transform', `scale(1, 0.92)`).play();\n }\n moveAnimation?.destroy();\n\n clearActivated(true);\n return true;\n };\n\n const nativeChanged = () => {\n gesture.enable(!isNativeUIShell(targetElement));\n cancelActiveGesture();\n };\n targetElement.addEventListener('nativeUIShellChange', nativeChanged);\n if (isNativeUIShell(targetElement)) nativeChanged();\n\n return {\n destroy: () => {\n destroyed = true;\n cancelActiveGesture();\n // Remove event listeners\n targetElement.removeEventListener('pointerdown', onPointerDown);\n targetElement.removeEventListener('click', onClick, true);\n targetElement.removeEventListener('nativeUIShellChange', nativeChanged);\n\n // Destroy gesture\n if (gesture) {\n gesture.destroy();\n }\n // Remove gesture class\n targetElement.classList.remove(GESTURE_NAME);\n effectElement.remove();\n if (effectTagName === 'ion-tab-button') {\n if (originalTabBarScale) targetElement.style.setProperty('--ios27-tab-bar-scale', originalTabBarScale);\n else targetElement.style.removeProperty('--ios27-tab-bar-scale');\n }\n },\n };\n};\n"],"mappings":";;;;;AAgBA,MAAM,eAAe;AACrB,MAAM,gBAAgB;AAEtB,MAAa,kBACX,eACA,eACA,mBACA,QACA,WAAW,UACsB;CACjC,IAAI,CAAC,cAAc,UAAU,SAAS,KAAK,GACzC;CAGF,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI,oBAAmD,KAAA;CACvD,IAAI;CACJ,IAAI;CACJ,IAAI,cAAc;CAClB,IAAI;CACJ,IAAI;CACJ,IAAI,oBAAoB;CACxB,IAAI,cAAc;CAClB,IAAI,YAAY;CAChB,MAAM,sBAAsB,cAAc,MAAM,iBAAiB,uBAAuB;CACxF,MAAM,gBAAgB,aAAa,eAAe,KAAK;CACvD,IAAI,UAAU,cAAc,UAAU,IAAI,2BAA2B;CACrE,MAAM,qBAAqB;EACzB,IAAI,CAAC,mBAAmB;EACxB,MAAM,SAAS,cAAc,WAAY,cAA2B,mBAAiB;EACrF,MAAM,YAAY,iBAAiB,aAAa,CAAC,CAAC;EAClD,MAAM,QAAQ,iBAAiB,MAAM,CAAC,CAAC;EACvC,kBAAkB,QAAQ;EAC1B,oBAAoB,KAAA;EACpB,cAAc,MAAM,YAAY;EAChC,OAAO,MAAM,YAAY;CAC3B;CACA,IAAI;CACJ,IAAI;CAEJ,MAAM,kCAAkC;EACtC,IAAI,aAAa;GACf,SAAS,oBAAoB,aAAa,WAAW;GACrD,cAAc,KAAA;EAChB;EACA,IAAI,iBAAiB;GACnB,SAAS,oBAAoB,iBAAiB,eAAe;GAC7D,kBAAkB,KAAA;EACpB;CACF;CAEA,MAAM,4BAA4B;EAChC,aAAa;EACb,kBAAkB,QAAQ;EAC1B,mBAAmB,KAAA;EACnB,0BAA0B;EAC1B,IAAI,wBAAwB,KAAA,GAAW;GACrC,aAAa,mBAAmB;GAChC,sBAAsB,KAAA;EACxB;EACA,uBAAuB,UAAU,OAAO,eAAe;EAEvD,IAAI,CAAC,uBAAuB,UAAU,SAAS,iBAAiB,GAC9D,8BAA8B,UAAU,IAAI,iBAAiB;EAE/D,wBAAwB,KAAA;EACxB,+BAA+B,KAAA;EAC/B,eAAe,QAAQ;EACvB,gBAAgB,KAAA;EAChB,cAAc,MAAM,UAAU;EAC9B,cAAc;EACd,cAAc,UAAU,OAAO,aAAa;CAC9C;;;;;CAMA,MAAM,iBAAiB,UAAwB;EAC7C,IAAI,gBAAgB,aAAa,GAAG;EACpC,aAAa;EACb,cAAc;EACd,kBAAkB,QAAQ;EAC1B,mBAAmB,KAAA;EACnB,eAAe;EACf,QAAQ,QAAQ;EAChB,uBAAuB;EACvB,0BAA0B;EAC1B,oBAAoB;GAClB,sBAAsB,WAAW,YAAY;IAC3C,MAAM,aAAa;IACnB,IAAI,WAAW;IACf,QAAQ,QAAQ;IAChB,uBAAuB;GACzB,CAAC;GACD,0BAA0B;EAC5B;EACA,wBAAwB;GACtB,oBAAoB;GACpB,QAAQ,QAAQ;GAChB,uBAAuB;EACzB;EACA,SAAS,iBAAiB,aAAa,WAAW;EAClD,SAAS,iBAAiB,iBAAiB,eAAe;CAC5D;CACA,cAAc,iBAAiB,eAAe,aAAa;CAC3D,MAAM,WAAW,UAAsB;EAErC,IAAI,YAAY,eAAe,MAAM,aAAa,MAAM,SAAS,GAAG;GAClE,MAAM,eAAe;GACrB,MAAM,yBAAyB;EACjC;CACF;CACA,cAAc,iBAAiB,SAAS,SAAS,IAAI;CAErD,MAAM,cAAc,WAClB,WACI;EACE,GAAG;EACH,UAAU,OAAO;EACjB,UAAU,OAAO;EACjB,QAAQ,OAAO;EACf,QAAQ,OAAO;EACf,WAAW,OAAO;EAClB,WAAW,OAAO;CACpB,IACA;CACN,MAAM,+BAA+B;EACnC,cAAc,UAAU,IAAI,YAAY;EACxC,UAAU,cAAc;GACtB,IAAI;GACJ,WAAW;GACX,WAAW,WAAW,MAAM;GAC5B,aAAa,GAAG,aAAa,GAAG,cAAc,GAAG,OAAO,WAAW;GACnE,UAAU,UAAU,eAAe,WAAW,KAAK,CAAC;GACpD,SAAS,UAAU,cAAc,WAAW,KAAK,CAAC;GAClD,QAAQ,WAAW;IAEjB,IAAI,kBAAkB,oBAAoB,aAAa,cAAc,WAAW,MAAM,CAAC;IACvF,aAAa,CAAC,CAAC,KAAK;GACtB;EACF,CAAC;EACD,QAAQ,OAAO,IAAI;CACrB;CACA,uBAAuB;CAEvB,MAAM,kBAAkB,eAAwB,UAAU;EACxD,IAAI,CAAC,uBACH;EAEF,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,UAAU,SAAS,iBAAiB,GAAG;GACjF,sBAAuB,MAAM;GAC7B,sBAAsB,UAAU,IAAI,iBAAiB;EACvD;EACA,sBAAsB,UAAU,OAAO,eAAe;EACtD,wBAAwB,KAAA;EACxB,+BAA+B,KAAA;EAC/B,cAAc,MAAM,UAAU;EAC9B,cAAc;EACd,cAAc,UAAU,OAAO,aAAa;CAC9C;CAEA,MAAM,kBAAkB,WAA+C;EACrE,IAAI,gBAAgB,aAAa,GAAG,OAAO;EAC3C,wBAA0B,OAAO,MAAM,OAAuB,QAAQ,aAAa,KAAqB,KAAA;EACxG,MAAM,qBAAqB,cAAc,cAAc,GAAG,cAAc,GAAG,mBAAmB;EAC9F,IACE,0BAA0B,KAAA,KAC1B,sBAAsB,kBAAkB,iBACvC,sBAAkD,YACnD,uBAAuB,MACvB;GACA,wBAAwB,KAAA;GACxB,OAAO;EACT;EACA,+BAA+B;EAC/B,IAAI,kBAAkB,kBAEpB,cAAc,MAAM,YAClB,yBACA,OAAO,IAAI,SAAS,WAAW,cAAc,eAAe,cAAc,YAAY,CACxF;EAEF,IAAI,UAAU,cAAc,UAAU,IAAI,aAAa;EACvD,oBAAoB;GAClB,cAAc,cAAc,eAAe,QAAQ,CAAC,CAAC;GACrD,cACE,cAAc,eAAe,QAAQ,CAAC,CAAC,SAAS,WAAW,mBAAmB,eAAe,mBAAmB;GAClH,OAAO,WAAW,mBAAmB,eAAe,mBAAmB;GACvE,WAAW,cAAc,oBAAoB,QAAQ,CAAC,CAAC;EACzD;EACA,cAAc,UAAU,IAAI,aAAa;EACzC,sBAAsB,eAAe,uBAAuB,eAAe,iBAAiB;EAE5F,IAAI,kBAAkB,kBAAkB;GACtC,gBAAgB,oBAAoB,eAAe,QAAQ,oBAAoB,mBAAmB,QAAQ;GAC1G,cAAc,cACZ,MACA,QACE,cAAc,oBAAoB,QAAQ,CAAC,CAAC,OAAO,cAAc,oBAAoB,QAAQ,CAAC,CAAC,QAAQ,GACvG,iBACF,CACF;GACA,oBAAoB,2BAClB,eACA,oBACA,uBACA,eACA,QACF;GACA,oBAAoB,YAAY,IAAI;GACpC,kBAAuB,KAAK;GAC5B,OAAO;EACT;EAEA,MAAM,wBAAwB;GAC5B,IAAI,uBAAuB,uBACzB,OAAO,IAAI,SAAe,YAAY,QAAQ,CAAC;QAC1C;IACL,MAAM,mBAAmB,uBAAuB,eAAe,oBAAoB,uBAAuB,iBAAkB;IAC5H,OAAO,iBAAiB,KAAK,CAAC,CAAC,cAAc,iBAAiB,QAAQ,CAAC;GACzE;EACF,EAAA,CAAG;EACH,wBAAwB;EACxB,eAAe,WAAW;GACxB,IAAI,CAAC,uBACH;GAEF,gBAAgB,oBAAoB,eAAe,QAAQ,oBAAoB,iBAAkB;GACjG,cAAc,cACZ,MACA,QAAQ,sBAAsB,sBAAsB,CAAC,CAAC,OAAO,sBAAsB,cAAc,GAAG,iBAAkB,CACxH;EACF,CAAC;EACD,kBAAkB,aAAa,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,aAAa,OAAO,KAAK,CAAC,CAAC,KAAK;EACnG,OAAO;CACT;CAEA,MAAM,iBAAiB,WAA+C;EACpE,IAAI,0BAA0B,KAAA,KAAa,CAAC,iBAAiB,kBAC3D,OAAO;EAET,IAAI,kBAAkB,kBAAkB;GACtC,IAAI,KAAK,IAAI,OAAO,WAAW,OAAO,MAAM,IAAI,KAAK,CAAC,aAAa;GACnE,cAAc;GACd,aAAa;GACb,oBAAoB,0BAA0B,eAAe,eAAe,OAAO,WAAW,QAAQ;GACtG,kBAAuB,KAAK;EAC9B,OAAO,IAAI,0BAA0B,KAAA,GAAW;GAC9C,IAAI,KAAK,IAAI,OAAO,SAAS,IAAI,aAC/B,cAAc,KAAK,IAAI,OAAO,SAAS;GAEzC,IAAI,KAAK,IAAI,OAAO,SAAS,IAAI,IAC/B,wBAAwB,kBAAkB,aAAa,CAAC,CACrD,SAAS,GAAG,CAAC,CACb,UAAU,yBAAyB,UAAU,MAAM,CAAC,CAAC,CACrD,KAAK,CAAC,CACN,cAAe,wBAAwB,KAAA,CAAU;GAEtD,IAAI,cAAc,MAAO,KAAK,IAAI,OAAO,SAAS,IAAI,OAAQ,KAAK,IAAI,OAAO,SAAS,OAAO,QAAQ,IAAI,KAAK;IAC7G,wBAAwB,kBAAkB,aAAa,CAAC,CACrD,SAAS,GAAG,CAAC,CACb,UAAU,yBAAyB,OAAO,YAAY,IAAI,cAAc,YAAY,MAAM,CAAC,CAAC,CAC5F,KAAK,CAAC,CACN,cAAe,wBAAwB,KAAA,CAAU;IACpD,cAAc;GAChB;EACF;EAEA,MAAM,WAAW,OAAO;EACxB,MAAM,YAAY,cAAc,eAAe,QAAQ,CAAC,CAAC,MAAM,cAAc,eAAe,QAAQ,CAAC,CAAC,SAAS;EAK/G,IAAI,uBAJY,cAAc,YAAY,CAAC,CAA2B,iBACpE,WAAW,YAAY,UACvB,WAAW,WAAW,SAEkC,CAAC,EAAE,QAAQ,aAAa,KAAqB,KAAA;EACvG,IAAI,YAAY,kBAAkB,kBAAkB;GAElD,MAAM,MAAM,cAAc,sBAAsB;GAChD,MAAM,OAAO,MAAM,KAAK,cAAc,iBAA8B,aAAa,CAAC,CAAC,CAAC,QAAQ,QAAQ,IAAI,cAAc,CAAC;GACvH,MAAM,YAAY,QAAqB,KAAK,IAAI,YAAY,IAAI,MAAM,IAAI,YAAY,IAAI,eAAe,EAAE;GAC3G,uBACE,YAAY,IAAI,OAAO,YAAY,IAAI,SACnC,KAAK,QACF,SAAS,QAAS,CAAC,WAAW,SAAS,GAAG,IAAI,SAAS,OAAO,IAAI,MAAM,SACzE,KAAA,CACF,IACA,KAAA;EACR;EAEA,IACE,wBACA,qBAAqB,kBAAkB,iBACvC,CAAE,qBAAiD,YACnD,0BAA0B,sBAC1B;GACA,wBAAwB;GACxB,sBAAsB,eAAe,uBAAuB,eAAe,iBAAiB;EAC9F;EACA,cAAc,aAAa,QAAQ,OAAO,UAAU,iBAAkB,CAAC;EACvE,OAAO;CACT;CAEA,MAAM,eAAe,YAA0C;EAC7D,IAAI,kBAAkB;EAEtB,IAAI,wBAAwB,KAAA,GAAW;GACrC,aAAa,mBAAmB;GAChC,sBAAsB,KAAA;EACxB;EAEA,IAAI,yBAAyB,CAAC,sBAAsB,UAAU,SAAS,iBAAiB,GAAG;GACzF,sBAAsB,MAAM;GAC5B,sBAAsB,UAAU,IAAI,iBAAiB;EACvD;EAEA,IAAI,uBACF,MAAM;EAGR,MAAM,aACJ,qBAAqB,CAAC,eAAe,iCAAiC,wBAClE,YAAY,IAAI,IAAI,oBACpB,KAAA;EACN,IAAI,qBAAqB,CAAC,eAAe,eAAe,KAAA,GAAW;GAEjE,MAAM,WAAW;GACjB,MAAM,YAAY,OAAO,YAAY,IAAI,IAAI;GAC7C,IAAI,YAAY,GAAG,MAAM,IAAI,SAAe,YAAY,WAAW,SAAS,SAAS,CAAC;GACtF,IAAI,sBAAsB,UAAU;EACtC;EAEA,IAAI,0BAA0B,KAAA,KAAa,CAAC,iBAAiB,kBAC3D,OAAO;EAGT,IAAI,kBAAkB,kBACpB,iBAAiB;GACf,IAAI,CAAC,uBACH;GAEF,MAAM,UAAU,sBAAsB,sBAAsB,CAAC,CAAC,OAAO,sBAAsB,cAAc;GACzG,MAAM,OAAO,QAAQ,SAAS,iBAAkB;GAChD,cAAe,aAAa,IAAI;EAClC,CAAC;EACH,IAAI,kBAAkB,kBAAkB;GACtC,aAAa;GACb,cAAc,QAAQ;GACtB,gBAAgB,KAAA;GAChB,MAAM,OAAO,MAAM,KAAK,cAAc,iBAA8B,aAAa,CAAC,CAAC,CAAC,QAAQ,QAAQ,IAAI,cAAc,CAAC;GACvH,IAAI,UAAU;IACZ,sBAAsB,UAAU,OAAO,eAAe;IACtD,cAAc,UAAU,OAAO,aAAa;GAC9C;GACA,MAAM,YAAY,6BAChB,eACA,uBACA,eAAe,KAAA,KAAa,aAAa,MACrC;IACE,SAAS;IACT,UAAU,KAAK,IAAI,KAAK,QAAQ,qBAAqB,IAAI,KAAK,QAAQ,4BAA6B,CAAC;GACtG,IACA,KAAA,GACJ,QACF;GACA,sBAAsB,UAAU,OAAO,eAAe;GACtD,mBAAmB;GACnB,MAAM,UAAU,KAAK;GACrB,IAAI,qBAAqB,WAAW;GACpC,eAAe,IAAI;GACnB,UAAU,QAAQ;GAClB,mBAAmB,KAAA;EACrB,OACE,MAAM,kBAAkB,aAAa,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,aAAa,gBAAgB,CAAC,CAAC,KAAK;EAE9F,eAAe,QAAQ;EAEvB,eAAe,IAAI;EACnB,OAAO;CACT;CAEA,MAAM,sBAAsB;EAC1B,QAAQ,OAAO,CAAC,gBAAgB,aAAa,CAAC;EAC9C,oBAAoB;CACtB;CACA,cAAc,iBAAiB,uBAAuB,aAAa;CACnE,IAAI,gBAAgB,aAAa,GAAG,cAAc;CAElD,OAAO,EACL,eAAe;EACb,YAAY;EACZ,oBAAoB;EAEpB,cAAc,oBAAoB,eAAe,aAAa;EAC9D,cAAc,oBAAoB,SAAS,SAAS,IAAI;EACxD,cAAc,oBAAoB,uBAAuB,aAAa;EAGtE,IAAI,SACF,QAAQ,QAAQ;EAGlB,cAAc,UAAU,OAAO,YAAY;EAC3C,cAAc,OAAO;EACrB,IAAI,kBAAkB,kBAAkB;GACtC,IAAI,qBAAqB,cAAc,MAAM,YAAY,yBAAyB,mBAAmB;QAChG,cAAc,MAAM,eAAe,uBAAuB;EACjE;CACF,EACF;AACF"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/sheets-of-glass/index.ts"],"sourcesContent":["import { AnimationPosition, EffectScales, registeredEffect } from './interfaces';\nimport { createAnimation, createGesture } from '@ionic/core/components/index.js';\nimport type { Animation, Gesture, GestureDetail } from '@ionic/core/components';\nimport { changeSelectedElement, cloneElement, getStep } from '../utils';\nimport { isNativeUI } from '@rdlabo/capacitor-native-ui/integration';\nimport {\n animationRect,\n createMoveAnimation,\n createPreMoveAnimation,\n createTabBarDragAnimation,\n createTabBarPressAnimation,\n createTabBarReleaseAnimation,\n getMoveAnimationKeyframe,\n getScaleAnimation,\n} from './animations';\n\nconst GESTURE_NAME = 'ios27-enable-gesture';\nconst ANIMATED_NAME = 'ios27-animated';\n\nexport const registerEffect = (\n targetElement: HTMLElement,\n effectTagName: string,\n selectedClassName: string,\n scales: EffectScales,\n vertical = false,\n): registeredEffect | undefined => {\n if (!targetElement.classList.contains('ios')) {\n return undefined;\n }\n\n let gesture!: Gesture;\n let moveAnimation: Animation | undefined;\n let currentTouchedElement: HTMLElement | undefined;\n let selectedElementBeforeGesture: HTMLElement | undefined;\n let clearActivatedTimer: ReturnType<typeof setTimeout> | undefined;\n let animationPosition: AnimationPosition | undefined = undefined;\n let scaleAnimationPromise: Promise<void> | undefined;\n let startAnimationPromise: Promise<void> | undefined;\n let maxVelocity = 0;\n let releaseAnimation: Animation | undefined;\n let tabPressAnimation: Animation | undefined;\n let tabPressStartedAt = 0;\n let tabDragging = false;\n let destroyed = false;\n const originalTabBarScale = targetElement.style.getPropertyValue('--ios27-tab-bar-scale');\n const effectElement = cloneElement(effectTagName, false);\n if (vertical) effectElement.classList.add('ios27-vertical-tab-effect');\n const stopTabPress = () => {\n if (!tabPressAnimation) return;\n const native = effectElement.shadowRoot!.querySelector<HTMLElement>('[part=\"native\"]')!;\n const transform = getComputedStyle(effectElement).transform;\n const scale = getComputedStyle(native).transform;\n tabPressAnimation.destroy();\n tabPressAnimation = undefined;\n effectElement.style.transform = transform;\n native.style.transform = scale;\n };\n let onPointerUp: (() => void) | undefined;\n let onPointerCancel: (() => void) | undefined;\n\n const removePointerEndListeners = () => {\n if (onPointerUp) {\n document.removeEventListener('pointerup', onPointerUp);\n onPointerUp = undefined;\n }\n if (onPointerCancel) {\n document.removeEventListener('pointercancel', onPointerCancel);\n onPointerCancel = undefined;\n }\n };\n\n const cancelActiveGesture = () => {\n stopTabPress();\n releaseAnimation?.destroy();\n releaseAnimation = undefined;\n removePointerEndListeners();\n if (clearActivatedTimer !== undefined) {\n clearTimeout(clearActivatedTimer);\n clearActivatedTimer = undefined;\n }\n currentTouchedElement?.classList.remove('ion-activated');\n // Preserve a committed selection, or restore the original if the press was cancelled.\n if (!currentTouchedElement?.classList.contains(selectedClassName)) {\n selectedElementBeforeGesture?.classList.add(selectedClassName);\n }\n currentTouchedElement = undefined;\n selectedElementBeforeGesture = undefined;\n moveAnimation?.destroy();\n moveAnimation = undefined;\n effectElement.style.display = 'none';\n maxVelocity = 0;\n targetElement.classList.remove(ANIMATED_NAME);\n };\n\n /**\n * These event listeners fix a bug where gestures don't complete properly.\n * They terminate the gesture using native events as a fallback.\n */\n const onPointerDown = (event: PointerEvent) => {\n if (isNativeUI(targetElement)) return;\n stopTabPress();\n tabDragging = false;\n releaseAnimation?.destroy();\n releaseAnimation = undefined;\n clearActivated();\n gesture.destroy();\n createAnimationGesture();\n removePointerEndListeners();\n onPointerUp = () => {\n clearActivatedTimer = setTimeout(async () => {\n await onEndGesture();\n if (destroyed) return;\n gesture.destroy();\n createAnimationGesture();\n });\n removePointerEndListeners();\n };\n onPointerCancel = () => {\n cancelActiveGesture();\n gesture.destroy();\n createAnimationGesture();\n };\n document.addEventListener('pointerup', onPointerUp);\n document.addEventListener('pointercancel', onPointerCancel);\n };\n targetElement.addEventListener('pointerdown', onPointerDown);\n const onClick = (event: MouseEvent) => {\n // A drag commits its destination itself; the browser may click the old pressed tab.\n if (vertical && tabDragging && event.isTrusted && event.detail > 0) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n };\n targetElement.addEventListener('click', onClick, true);\n\n const axisDetail = (detail: GestureDetail): GestureDetail =>\n vertical\n ? {\n ...detail,\n currentX: detail.currentY,\n currentY: detail.currentX,\n startX: detail.startY,\n startY: detail.startX,\n velocityX: detail.velocityY,\n velocityY: detail.velocityX,\n }\n : detail;\n const createAnimationGesture = () => {\n targetElement.classList.add(GESTURE_NAME);\n gesture = createGesture({\n el: targetElement,\n threshold: 0,\n direction: vertical ? 'y' : 'x',\n gestureName: `${GESTURE_NAME}_${effectTagName}_${crypto.randomUUID()}`,\n onStart: (event) => onStartGesture(axisDetail(event)),\n onMove: (event) => onMoveGesture(axisDetail(event)),\n onEnd: (detail) => {\n // Ionic coalesces moves; consume the release coordinate before committing a drag.\n if (effectTagName === 'ion-tab-button' && tabDragging) onMoveGesture(axisDetail(detail));\n onEndGesture().then();\n },\n });\n gesture.enable(true);\n };\n createAnimationGesture();\n\n const clearActivated = (isEndGesture: boolean = false) => {\n if (!currentTouchedElement) {\n return;\n }\n if (!isEndGesture && !currentTouchedElement.classList.contains(selectedClassName)) {\n currentTouchedElement!.click();\n currentTouchedElement.classList.add(selectedClassName);\n }\n currentTouchedElement.classList.remove('ion-activated');\n currentTouchedElement = undefined;\n selectedElementBeforeGesture = undefined;\n effectElement.style.display = 'none';\n maxVelocity = 0;\n targetElement.classList.remove(ANIMATED_NAME);\n };\n\n const onStartGesture = (detail: GestureDetail): boolean | undefined => {\n if (isNativeUI(targetElement)) return false;\n currentTouchedElement = ((detail.event.target as HTMLElement).closest(effectTagName) as HTMLElement) || undefined;\n const tabSelectedElement = targetElement.querySelector(`${effectTagName}.${selectedClassName}`);\n if (\n currentTouchedElement === undefined ||\n currentTouchedElement.parentElement !== targetElement ||\n (currentTouchedElement as HTMLIonTabButtonElement).disabled ||\n tabSelectedElement === null\n ) {\n currentTouchedElement = undefined;\n return false;\n }\n selectedElementBeforeGesture = tabSelectedElement as HTMLElement;\n if (effectTagName === 'ion-tab-button') {\n // UIKit expands the platter by 14.14pt at both two- and four-tab widths.\n targetElement.style.setProperty(\n '--ios27-tab-bar-scale',\n String(1 + 14.14 / (vertical ? targetElement.offsetHeight : targetElement.offsetWidth)),\n );\n }\n if (vertical) targetElement.classList.add(ANIMATED_NAME);\n animationPosition = {\n minPositionX: animationRect(targetElement, vertical).left,\n maxPositionX:\n animationRect(targetElement, vertical).right - (vertical ? tabSelectedElement.clientHeight : tabSelectedElement.clientWidth),\n width: vertical ? tabSelectedElement.clientHeight : tabSelectedElement.clientWidth,\n positionY: animationRect(tabSelectedElement, vertical).top,\n };\n targetElement.classList.add(ANIMATED_NAME);\n changeSelectedElement(targetElement, currentTouchedElement, effectTagName, selectedClassName);\n\n if (effectTagName === 'ion-tab-button') {\n moveAnimation = createMoveAnimation(effectElement, detail, tabSelectedElement, animationPosition, vertical);\n moveAnimation.progressStart(\n true,\n getStep(\n animationRect(tabSelectedElement, vertical).left + animationRect(tabSelectedElement, vertical).width / 2,\n animationPosition,\n ),\n );\n tabPressAnimation = createTabBarPressAnimation(\n effectElement,\n tabSelectedElement as HTMLElement,\n currentTouchedElement,\n targetElement,\n vertical,\n );\n tabPressStartedAt = performance.now();\n void tabPressAnimation.play();\n return true;\n }\n\n const startAnimation = (() => {\n if (tabSelectedElement === currentTouchedElement) {\n return new Promise<void>((resolve) => resolve());\n } else {\n const preMoveAnimation = createPreMoveAnimation(effectElement, tabSelectedElement, currentTouchedElement, animationPosition!);\n return preMoveAnimation.play().finally(() => preMoveAnimation.destroy());\n }\n })();\n startAnimationPromise = startAnimation;\n startAnimation.then(() => {\n if (!currentTouchedElement) {\n return;\n }\n moveAnimation = createMoveAnimation(effectElement, detail, tabSelectedElement, animationPosition!);\n moveAnimation.progressStart(\n true,\n getStep(currentTouchedElement.getBoundingClientRect().left + currentTouchedElement.clientWidth / 2, animationPosition!),\n );\n });\n getScaleAnimation(effectElement).duration(200).to('opacity', 1).to('transform', scales.large).play();\n return true;\n };\n\n const onMoveGesture = (detail: GestureDetail): boolean | undefined => {\n if (currentTouchedElement === undefined || !moveAnimation || releaseAnimation) {\n return false; // Skip Animation\n }\n if (effectTagName === 'ion-tab-button') {\n if (Math.abs(detail.currentX - detail.startX) < 3 && !tabDragging) return;\n tabDragging = true;\n stopTabPress();\n tabPressAnimation = createTabBarDragAnimation(effectElement, targetElement, detail.velocityX, vertical);\n void tabPressAnimation.play();\n } else if (scaleAnimationPromise === undefined) {\n if (Math.abs(detail.velocityX) > maxVelocity) {\n maxVelocity = Math.abs(detail.velocityX);\n }\n if (Math.abs(detail.velocityX) > 0.2) {\n scaleAnimationPromise = getScaleAnimation(effectElement)\n .duration(720)\n .keyframes(getMoveAnimationKeyframe('slowly', scales))\n .play()\n .finally(() => (scaleAnimationPromise = undefined));\n }\n if (maxVelocity > 0.2 && Math.abs(detail.velocityX) < 0.15 && Math.abs(detail.startX - detail.currentX) > 100) {\n scaleAnimationPromise = getScaleAnimation(effectElement)\n .duration(720)\n .keyframes(getMoveAnimationKeyframe(detail.velocityX > 0 ? 'moveRight' : 'moveLeft', scales))\n .play()\n .finally(() => (scaleAnimationPromise = undefined));\n maxVelocity = 0;\n }\n }\n\n const currentX = detail.currentX;\n const previousY = animationRect(targetElement, vertical).top + animationRect(targetElement, vertical).height / 2;\n const nextEl = (targetElement.getRootNode() as Document | ShadowRoot).elementFromPoint(\n vertical ? previousY : currentX,\n vertical ? currentX : previousY,\n );\n let latestTouchedElement: HTMLElement | undefined = (nextEl?.closest(effectTagName) as HTMLElement) || undefined;\n if (vertical && effectTagName === 'ion-tab-button') {\n // Overlapping, scaled tabs must not steal a drag from their neighbor.\n const bar = targetElement.getBoundingClientRect();\n const tabs = Array.from(targetElement.querySelectorAll<HTMLElement>(effectTagName)).filter((tab) => tab.offsetWidth > 0);\n const distance = (tab: HTMLElement) => Math.abs(currentX - (bar.top + tab.offsetTop + tab.offsetHeight / 2));\n latestTouchedElement =\n currentX >= bar.top && currentX <= bar.bottom\n ? tabs.reduce<HTMLElement | undefined>(\n (closest, tab) => (!closest || distance(tab) < distance(closest) ? tab : closest),\n undefined,\n )\n : undefined;\n }\n\n if (\n latestTouchedElement &&\n latestTouchedElement.parentElement === targetElement &&\n !(latestTouchedElement as HTMLIonTabButtonElement).disabled &&\n currentTouchedElement !== latestTouchedElement\n ) {\n currentTouchedElement = latestTouchedElement;\n changeSelectedElement(targetElement, currentTouchedElement, effectTagName, selectedClassName);\n }\n moveAnimation.progressStep(getStep(detail.currentX, animationPosition!));\n return true;\n };\n\n const onEndGesture = async (): Promise<boolean | undefined> => {\n if (releaseAnimation) return;\n // タイマーをクリア(正常にonEndGestureが実行された場合)\n if (clearActivatedTimer !== undefined) {\n clearTimeout(clearActivatedTimer);\n clearActivatedTimer = undefined;\n }\n\n if (currentTouchedElement && !currentTouchedElement.classList.contains(selectedClassName)) {\n currentTouchedElement.click();\n currentTouchedElement.classList.add(selectedClassName);\n }\n\n if (startAnimationPromise) {\n await startAnimationPromise;\n }\n\n const tapElapsed =\n tabPressAnimation && !tabDragging && selectedElementBeforeGesture !== currentTouchedElement\n ? performance.now() - tabPressStartedAt\n : undefined;\n if (tabPressAnimation && !tabDragging && tapElapsed === undefined) {\n // A quick tap still completes the initial stretch before relaxing.\n const pressing = tabPressAnimation;\n const remaining = 200 - (performance.now() - tabPressStartedAt);\n if (remaining > 0) await new Promise<void>((resolve) => setTimeout(resolve, remaining));\n if (tabPressAnimation !== pressing) return;\n }\n\n if (currentTouchedElement === undefined || !moveAnimation || releaseAnimation) {\n return false;\n }\n\n if (effectTagName !== 'ion-tab-button')\n setTimeout(() => {\n if (!currentTouchedElement) {\n return;\n }\n const targetX = currentTouchedElement.getBoundingClientRect().left + currentTouchedElement.clientWidth / 2;\n const step = getStep(targetX, animationPosition!);\n moveAnimation!.progressStep(step);\n });\n if (effectTagName === 'ion-tab-button') {\n stopTabPress();\n moveAnimation.destroy();\n moveAnimation = undefined;\n const tabs = Array.from(targetElement.querySelectorAll<HTMLElement>(effectTagName)).filter((tab) => tab.offsetWidth > 0);\n if (vertical) {\n currentTouchedElement.classList.remove('ion-activated');\n targetElement.classList.remove(ANIMATED_NAME);\n }\n const releasing = createTabBarReleaseAnimation(\n effectElement,\n currentTouchedElement,\n tapElapsed !== undefined && tapElapsed < 200\n ? {\n elapsed: tapElapsed,\n distance: Math.abs(tabs.indexOf(currentTouchedElement) - tabs.indexOf(selectedElementBeforeGesture!)),\n }\n : undefined,\n vertical,\n );\n currentTouchedElement.classList.remove('ion-activated');\n releaseAnimation = releasing;\n await releasing.play();\n if (releaseAnimation !== releasing) return;\n clearActivated(true);\n releasing.destroy();\n releaseAnimation = undefined;\n } else {\n await getScaleAnimation(effectElement).duration(120).to('transform', `scale(1, 0.92)`).play();\n }\n moveAnimation?.destroy();\n\n clearActivated(true);\n return true;\n };\n\n const nativeChanged = () => {\n gesture.enable(!isNativeUI(targetElement));\n cancelActiveGesture();\n };\n targetElement.addEventListener('nativeUIChange', nativeChanged);\n if (isNativeUI(targetElement)) nativeChanged();\n\n return {\n destroy: () => {\n destroyed = true;\n cancelActiveGesture();\n // Remove event listeners\n targetElement.removeEventListener('pointerdown', onPointerDown);\n targetElement.removeEventListener('click', onClick, true);\n targetElement.removeEventListener('nativeUIChange', nativeChanged);\n\n // Destroy gesture\n if (gesture) {\n gesture.destroy();\n }\n // Remove gesture class\n targetElement.classList.remove(GESTURE_NAME);\n effectElement.remove();\n if (effectTagName === 'ion-tab-button') {\n if (originalTabBarScale) targetElement.style.setProperty('--ios27-tab-bar-scale', originalTabBarScale);\n else targetElement.style.removeProperty('--ios27-tab-bar-scale');\n }\n },\n };\n};\n"],"mappings":"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"}
|