@rdlabo/ionic-theme-ios27 1.2.0-2 → 1.2.0-4
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 +15 -2
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/css/ionic-theme-ios27.css +1 -1
- package/dist/css/vertical-bars.css +1 -1
- package/dist/focus-controller/index.d.ts +4 -2
- package/dist/focus-controller/index.d.ts.map +1 -1
- package/dist/focus-controller/index.js +100 -57
- package/dist/focus-controller/index.js.map +1 -0
- package/dist/index.d.ts +10 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -60
- package/dist/index.js.map +1 -0
- package/dist/native/components/index.d.ts +13 -10
- package/dist/native/components/index.d.ts.map +1 -1
- package/dist/native/components/index.js +39 -41
- package/dist/native/components/index.js.map +1 -0
- package/dist/native/components/ion-back-button.d.ts +6 -1
- package/dist/native/components/ion-back-button.d.ts.map +1 -1
- package/dist/native/components/ion-back-button.js +19 -13
- package/dist/native/components/ion-back-button.js.map +1 -0
- package/dist/native/components/ion-button.d.ts +8 -2
- package/dist/native/components/ion-button.d.ts.map +1 -1
- package/dist/native/components/ion-button.js +22 -17
- package/dist/native/components/ion-button.js.map +1 -0
- package/dist/native/components/ion-buttons.d.ts +8 -2
- package/dist/native/components/ion-buttons.d.ts.map +1 -1
- package/dist/native/components/ion-buttons.js +29 -33
- package/dist/native/components/ion-buttons.js.map +1 -0
- package/dist/native/components/ion-fab.d.ts +6 -1
- package/dist/native/components/ion-fab.d.ts.map +1 -1
- package/dist/native/components/ion-fab.js +131 -151
- package/dist/native/components/ion-fab.js.map +1 -0
- package/dist/native/components/ion-menu-button.d.ts +8 -2
- package/dist/native/components/ion-menu-button.d.ts.map +1 -1
- package/dist/native/components/ion-menu-button.js +29 -19
- package/dist/native/components/ion-menu-button.js.map +1 -0
- package/dist/native/components/ion-segment.d.ts +6 -1
- package/dist/native/components/ion-segment.d.ts.map +1 -1
- package/dist/native/components/ion-segment.js +29 -23
- package/dist/native/components/ion-segment.js.map +1 -0
- package/dist/native/components/ion-tab-bar.d.ts +6 -1
- package/dist/native/components/ion-tab-bar.d.ts.map +1 -1
- package/dist/native/components/ion-tab-bar.js +49 -40
- package/dist/native/components/ion-tab-bar.js.map +1 -0
- package/dist/native/components/searchable-tabs.d.ts +17 -15
- package/dist/native/components/searchable-tabs.d.ts.map +1 -1
- package/dist/native/components/searchable-tabs.js +382 -435
- package/dist/native/components/searchable-tabs.js.map +1 -0
- package/dist/native/definitions.d.ts +118 -111
- package/dist/native/definitions.d.ts.map +1 -1
- package/dist/native/definitions.js +0 -1
- package/dist/native/foldable/fold-state.d.ts +5 -0
- package/dist/native/foldable/fold-state.d.ts.map +1 -0
- package/dist/native/foldable/fold-state.js +14 -0
- package/dist/native/foldable/fold-state.js.map +1 -0
- package/dist/native/foldable/types.d.ts +12 -0
- package/dist/native/foldable/types.d.ts.map +1 -0
- package/dist/native/foldable/types.js +0 -0
- package/dist/native/index.d.ts +6 -3
- package/dist/native/index.d.ts.map +1 -1
- package/dist/native/index.js +228 -204
- package/dist/native/index.js.map +1 -0
- package/dist/native/prehide.d.ts +4 -2
- package/dist/native/prehide.d.ts.map +1 -1
- package/dist/native/prehide.js +220 -242
- package/dist/native/prehide.js.map +1 -0
- package/dist/native/runtime.d.ts +3 -1
- package/dist/native/runtime.d.ts.map +1 -1
- package/dist/native/runtime.js +626 -724
- package/dist/native/runtime.js.map +1 -0
- package/dist/native/shared/candidate.d.ts +16 -11
- package/dist/native/shared/candidate.d.ts.map +1 -1
- package/dist/native/shared/candidate.js +96 -95
- package/dist/native/shared/candidate.js.map +1 -0
- package/dist/native/shared/crossfade.d.ts +6 -4
- package/dist/native/shared/crossfade.d.ts.map +1 -1
- package/dist/native/shared/crossfade.js +49 -45
- package/dist/native/shared/crossfade.js.map +1 -0
- package/dist/native/shared/dom.d.ts +7 -5
- package/dist/native/shared/dom.d.ts.map +1 -1
- package/dist/native/shared/dom.js +163 -211
- package/dist/native/shared/dom.js.map +1 -0
- package/dist/native/shared/events.d.ts +8 -6
- package/dist/native/shared/events.d.ts.map +1 -1
- package/dist/native/shared/events.js +12 -7
- package/dist/native/shared/events.js.map +1 -0
- package/dist/native/shared/icons.d.ts +4 -2
- package/dist/native/shared/icons.d.ts.map +1 -1
- package/dist/native/shared/icons.js +59 -53
- package/dist/native/shared/icons.js.map +1 -0
- package/dist/native/shared/modal.d.ts +3 -1
- package/dist/native/shared/modal.d.ts.map +1 -1
- package/dist/native/shared/modal.js +156 -139
- package/dist/native/shared/modal.js.map +1 -0
- package/dist/native/vertical-bars-web.d.ts +3 -1
- package/dist/native/vertical-bars-web.d.ts.map +1 -1
- package/dist/native/vertical-bars-web.js +332 -346
- package/dist/native/vertical-bars-web.js.map +1 -0
- package/dist/native-integration/index.d.ts +10 -8
- package/dist/native-integration/index.d.ts.map +1 -1
- package/dist/native-integration/index.js +102 -100
- package/dist/native-integration/index.js.map +1 -0
- package/dist/native-integration/transition.d.ts +3 -1
- package/dist/native-integration/transition.d.ts.map +1 -1
- package/dist/native-integration/transition.js +15 -6
- package/dist/native-integration/transition.js.map +1 -0
- package/dist/searchbar/index.d.ts +4 -2
- package/dist/searchbar/index.d.ts.map +1 -1
- package/dist/searchbar/index.js +64 -56
- package/dist/searchbar/index.js.map +1 -0
- package/dist/segment/index.d.ts +3 -1
- package/dist/segment/index.d.ts.map +1 -1
- package/dist/segment/index.js +465 -324
- package/dist/segment/index.js.map +1 -0
- package/dist/sheets-of-glass/animations.d.ts +13 -12
- package/dist/sheets-of-glass/animations.d.ts.map +1 -1
- package/dist/sheets-of-glass/animations.js +496 -306
- package/dist/sheets-of-glass/animations.js.map +1 -0
- package/dist/sheets-of-glass/index.d.ts +3 -1
- package/dist/sheets-of-glass/index.d.ts.map +1 -1
- package/dist/sheets-of-glass/index.js +294 -357
- package/dist/sheets-of-glass/index.js.map +1 -0
- package/dist/sheets-of-glass/interfaces.d.ts +11 -9
- package/dist/sheets-of-glass/interfaces.d.ts.map +1 -1
- package/dist/sheets-of-glass/interfaces.js +0 -1
- package/dist/tab-bar-searchable/animations/enter.d.ts +4 -2
- package/dist/tab-bar-searchable/animations/enter.d.ts.map +1 -1
- package/dist/tab-bar-searchable/animations/enter.js +50 -69
- package/dist/tab-bar-searchable/animations/enter.js.map +1 -0
- package/dist/tab-bar-searchable/animations/leave.d.ts +4 -2
- package/dist/tab-bar-searchable/animations/leave.d.ts.map +1 -1
- package/dist/tab-bar-searchable/animations/leave.js +48 -62
- package/dist/tab-bar-searchable/animations/leave.js.map +1 -0
- package/dist/tab-bar-searchable/index.d.ts +5 -3
- package/dist/tab-bar-searchable/index.d.ts.map +1 -1
- package/dist/tab-bar-searchable/index.js +125 -109
- package/dist/tab-bar-searchable/index.js.map +1 -0
- package/dist/transition/index.d.ts +9 -8
- package/dist/transition/index.d.ts.map +1 -1
- package/dist/transition/index.js +203 -192
- package/dist/transition/index.js.map +1 -0
- package/dist/transition/ios.transition.d.ts +7 -5
- package/dist/transition/ios.transition.d.ts.map +1 -1
- package/dist/transition/ios.transition.js +15 -11
- package/dist/transition/ios.transition.js.map +1 -0
- package/dist/utils.d.ts +10 -8
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +58 -66
- package/dist/utils.js.map +1 -0
- package/dist/vertical-bars.d.ts +5 -4
- package/dist/vertical-bars.js +4 -2
- package/docs/iphone-duo-with-original-theme.md +18 -29
- package/docs/iphone-duo.md +44 -204
- package/docs/native-ui-shell.md +15 -11
- package/docs/special-markup.md +2 -0
- package/docs/vertical-bars.md +283 -0
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellSearchController.swift +1 -1
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift +61 -16
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalSearch.swift +118 -0
- package/ios/Sources/IonicNativeUIShellPlugin/IonicNativeUIShellPlugin.swift +17 -8
- package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellSnapshot.swift +2 -0
- package/ios/Tests/IonicNativeUIShellPluginTests/ShellSnapshotTests.swift +40 -0
- package/package.json +9 -6
- package/src/native/components/index.ts +3 -2
- package/src/native/components/ion-button.ts +3 -2
- package/src/native/components/ion-buttons.ts +4 -3
- package/src/native/components/ion-menu-button.ts +3 -2
- package/src/native/components/searchable-tabs.ts +8 -11
- package/src/native/definitions.ts +22 -1
- package/src/native/foldable/fold-state.ts +9 -0
- package/src/native/foldable/types.ts +4 -0
- package/src/native/index.ts +17 -3
- package/src/native/prehide.ts +3 -1
- package/src/native/runtime.ts +14 -9
- package/src/native/shared/candidate.ts +39 -10
- package/src/native/shared/dom.ts +4 -4
- package/src/styles/vertical-bars.scss +12 -2
- package/src/tab-bar-searchable/index.ts +40 -9
- package/src/vertical-bars.ts +9 -1
- package/dist/vertical-bars.d.ts.map +0 -1
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import type { ShellControl, ShellItem, NativeUIShellComponent } from '../definitions';
|
|
1
|
+
import type { ShellControl, ShellItem, NativeUIShellComponent, VerticalControlAreaOptions } from '../definitions';
|
|
2
2
|
import { frame, isDark, isVerticalBarsSource, text, visible } from './dom';
|
|
3
3
|
import { iconSource } from './icons';
|
|
4
4
|
|
|
5
5
|
export interface Candidate {
|
|
6
|
+
buttonProjection?: VerticalControlAreaOptions['buttonProjection'];
|
|
7
|
+
buttonDefaultFill?: VerticalControlAreaOptions['buttonDefaultFill'];
|
|
6
8
|
element: HTMLElement;
|
|
7
9
|
sources?: HTMLElement[];
|
|
8
10
|
control: ShellControl;
|
|
@@ -13,11 +15,18 @@ export interface Candidate {
|
|
|
13
15
|
export type Identify = (element: HTMLElement) => string;
|
|
14
16
|
type ItemElement = HTMLElement & { disabled?: boolean; selected?: boolean };
|
|
15
17
|
|
|
16
|
-
export const createCandidate = (
|
|
18
|
+
export const createCandidate = (
|
|
19
|
+
element: HTMLElement,
|
|
20
|
+
kind: NativeUIShellComponent,
|
|
21
|
+
id: Identify,
|
|
22
|
+
options: VerticalControlAreaOptions = {},
|
|
23
|
+
): Candidate => {
|
|
17
24
|
const rect = element.getBoundingClientRect();
|
|
18
25
|
const style = getComputedStyle(element);
|
|
19
26
|
return {
|
|
20
27
|
element,
|
|
28
|
+
buttonProjection: options.buttonProjection,
|
|
29
|
+
buttonDefaultFill: options.buttonDefaultFill,
|
|
21
30
|
control: {
|
|
22
31
|
id: id(element),
|
|
23
32
|
kind,
|
|
@@ -54,10 +63,31 @@ export const appendItem = (
|
|
|
54
63
|
const labelStyle = getComputedStyle(labelElement);
|
|
55
64
|
const badge = child.querySelector<HTMLElement>('ion-badge');
|
|
56
65
|
const badgeStyle = badge && visible(badge) ? getComputedStyle(badge) : undefined;
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
66
|
+
const sourceFill = (child as HTMLIonButtonElement).fill;
|
|
67
|
+
const projectionOwner = [child, child.closest('ion-buttons')].find((element) =>
|
|
68
|
+
element?.matches('[data-projection="source"], [data-projection="system"], .ios-theme-projection-source, .ios-theme-projection-system'),
|
|
69
|
+
);
|
|
70
|
+
const attributeProjection = projectionOwner?.getAttribute('data-projection');
|
|
71
|
+
const projection =
|
|
72
|
+
attributeProjection === 'source' || attributeProjection === 'system'
|
|
73
|
+
? attributeProjection
|
|
74
|
+
: projectionOwner
|
|
75
|
+
? projectionOwner.classList.contains('ios-theme-projection-system')
|
|
76
|
+
? 'system'
|
|
77
|
+
: 'source'
|
|
78
|
+
: candidate.buttonProjection;
|
|
79
|
+
const systemButton = projection !== 'source' && isVerticalBarsSource(child) && child.matches('ion-button, ion-menu-button');
|
|
80
|
+
// Ionic defaults buttons inside ion-buttons to clear, even when the app defaults to solid.
|
|
81
|
+
const defaultFill = child.closest('ion-buttons') ? 'clear' : candidate.buttonDefaultFill;
|
|
82
|
+
const fill = !sourceFill || sourceFill === 'default' ? defaultFill : sourceFill;
|
|
83
|
+
const buttonFill =
|
|
84
|
+
!systemButton &&
|
|
85
|
+
isVerticalBarsSource(child) &&
|
|
86
|
+
child.matches('ion-button') &&
|
|
87
|
+
(fill === 'clear' || fill === 'solid' || fill === 'outline')
|
|
88
|
+
? fill
|
|
60
89
|
: undefined;
|
|
90
|
+
const outline = buttonFill === 'outline' ? getComputedStyle(native ?? child) : undefined;
|
|
61
91
|
const item: ShellItem = {
|
|
62
92
|
id: id(child),
|
|
63
93
|
...frame(child.getBoundingClientRect(), candidate.element.getBoundingClientRect()),
|
|
@@ -74,11 +104,10 @@ export const appendItem = (
|
|
|
74
104
|
selected: !!(child as ItemElement).selected,
|
|
75
105
|
fontSize: parseFloat(labelStyle.fontSize),
|
|
76
106
|
fontWeight: parseInt(labelStyle.fontWeight, 10) || 400,
|
|
77
|
-
color: getComputedStyle(native ?? child).color,
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
: undefined,
|
|
107
|
+
color: systemButton ? 'currentColor' : getComputedStyle(native ?? child).color,
|
|
108
|
+
iconTemplate: systemButton ? true : undefined,
|
|
109
|
+
buttonFill,
|
|
110
|
+
backgroundColor: buttonFill === 'solid' ? getComputedStyle(native ?? child).backgroundColor : undefined,
|
|
82
111
|
borderColor: outline?.borderTopColor,
|
|
83
112
|
borderWidth: outline ? parseFloat(outline.borderTopWidth) : undefined,
|
|
84
113
|
badge: badgeStyle
|
package/src/native/shared/dom.ts
CHANGED
|
@@ -52,7 +52,7 @@ export const isDark = (style: CSSStyleDeclaration): boolean => {
|
|
|
52
52
|
const background = style.getPropertyValue('--ion-background-color-rgb').match(/\d+/g)?.slice(0, 3).map(Number);
|
|
53
53
|
return !!background && background.length === 3 && background[0] * 0.2126 + background[1] * 0.7152 + background[2] * 0.0722 < 128;
|
|
54
54
|
};
|
|
55
|
-
const permanentlyExcluded = '.
|
|
55
|
+
const permanentlyExcluded = '.ios-theme-disabled, .ios26-disabled, .ion-cloned-element, [hidden], [inert]';
|
|
56
56
|
export const excluded = `${permanentlyExcluded}, .ion-page-hidden, .ion-page-invisible`;
|
|
57
57
|
const enteringPages = new WeakSet<HTMLElement>();
|
|
58
58
|
export const setVerticalBarsEnteringPage = (page: HTMLElement, entering: boolean): void => {
|
|
@@ -88,8 +88,8 @@ export const createVerticalBarsPageState = () => {
|
|
|
88
88
|
},
|
|
89
89
|
};
|
|
90
90
|
};
|
|
91
|
-
const disabledButtonGroup = 'ion-buttons:is(.
|
|
92
|
-
const shellDisabledSelector = '.ios-theme-shell-disabled';
|
|
91
|
+
const disabledButtonGroup = 'ion-buttons:is(.ios-theme-disabled, .ios26-disabled)';
|
|
92
|
+
const shellDisabledSelector = '.ios-theme-shell-disabled, [data-shell="disabled"]';
|
|
93
93
|
|
|
94
94
|
export const isDisabledButtonGroupChild = (element: HTMLElement): boolean =>
|
|
95
95
|
element.matches('ion-button') && element.parentElement?.matches(disabledButtonGroup) === true;
|
|
@@ -188,7 +188,7 @@ export const isVerticalBarsToolbarGroup = (element: HTMLElement): boolean => {
|
|
|
188
188
|
return (
|
|
189
189
|
element.matches('ion-buttons') &&
|
|
190
190
|
verticalBarsOwned(element) &&
|
|
191
|
-
!element.matches('.
|
|
191
|
+
!element.matches('.ios-theme-disabled, .ios26-disabled') &&
|
|
192
192
|
!isShellDisabled(element)
|
|
193
193
|
);
|
|
194
194
|
};
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
initial-value: 320px;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
ion-app.ios-theme-fold-half-opened ion-split-pane.split-pane-fold-layout,
|
|
14
15
|
ion-split-pane.ios-theme-split-pane-half-open {
|
|
15
16
|
--ios-theme-split-pane-width: 50vw;
|
|
16
17
|
}
|
|
@@ -57,6 +58,14 @@ ion-app.ios-theme-vertical-bars .ios-transition-shade {
|
|
|
57
58
|
clip-path: inset(0 var(--ios-theme-vertical-bars-safe-area-right-resolved) 0 var(--ios-theme-vertical-bars-safe-area-left-resolved));
|
|
58
59
|
}
|
|
59
60
|
|
|
61
|
+
// A vertical system rail can leave no top inset for the page header.
|
|
62
|
+
ion-app.ios-theme-vertical-bars
|
|
63
|
+
ion-header.ios:not(.header-collapse-condense, .ios-theme-disabled, .ios26-disabled):not(
|
|
64
|
+
:where(ion-menu *, ion-modal:not(.ios-theme-vertical-bars-modal) *, ion-popover *)
|
|
65
|
+
) {
|
|
66
|
+
--ion-safe-area-top: max(24px, env(safe-area-inset-top, 0px));
|
|
67
|
+
}
|
|
68
|
+
|
|
60
69
|
// Keep page backgrounds and the router full width; move only their foregrounds.
|
|
61
70
|
ion-app.ios-theme-vertical-bars
|
|
62
71
|
ion-content:is(.ios, .md):not(.ios-theme-disabled, .ios26-disabled):not(
|
|
@@ -274,7 +283,8 @@ html.ios-theme-native-ui-shell-prehide
|
|
|
274
283
|
[icon],
|
|
275
284
|
[color],
|
|
276
285
|
.ios-theme-vertical-bars-back-web-owned,
|
|
277
|
-
.
|
|
286
|
+
.ios-theme-shell-disabled,
|
|
287
|
+
[data-shell='disabled'],
|
|
278
288
|
.ios-theme-disabled,
|
|
279
289
|
.ios26-disabled,
|
|
280
290
|
.ios-theme-vertical-bars-back-button-projection
|
|
@@ -287,7 +297,7 @@ html.ios-theme-native-ui-shell-prehide
|
|
|
287
297
|
ion-footer[collapse] *,
|
|
288
298
|
ion-buttons.ios-theme-horizontal-only *,
|
|
289
299
|
.ios-theme-shell-disabled *,
|
|
290
|
-
|
|
300
|
+
[data-shell='disabled'] *,
|
|
291
301
|
.ios-theme-disabled *,
|
|
292
302
|
.ios26-disabled *
|
|
293
303
|
)
|
|
@@ -64,6 +64,8 @@ export const attachTabBarSearchable = (
|
|
|
64
64
|
// Initialize
|
|
65
65
|
ionFooter.style.pointerEvents = 'none';
|
|
66
66
|
ionFooter.style.opacity = '0';
|
|
67
|
+
// Search dismissal belongs beside the Web search field, never in the vertical rail.
|
|
68
|
+
ionFooter.querySelector('ion-buttons[slot=start]')?.classList.add('ios-theme-horizontal-only');
|
|
67
69
|
const nativeSearch = registerNativeSearch(ionTabBar, ionFabButton, ionFooter);
|
|
68
70
|
|
|
69
71
|
// Saved Params
|
|
@@ -72,6 +74,8 @@ export const attachTabBarSearchable = (
|
|
|
72
74
|
// Leave is valid both while native Enter awaits its ack and after it completes.
|
|
73
75
|
let nativeEntry = false;
|
|
74
76
|
let nativeRequest = 0;
|
|
77
|
+
let verticalSearch = false;
|
|
78
|
+
let tabVisibilityObserver: MutationObserver | undefined;
|
|
75
79
|
|
|
76
80
|
return async (event: Event, type: TabBarSearchableType) => {
|
|
77
81
|
const selector = type === TabBarSearchableType.Enter ? 'ion-fab-button' : 'ion-buttons[slot=start] ion-button';
|
|
@@ -93,19 +97,38 @@ export const attachTabBarSearchable = (
|
|
|
93
97
|
return;
|
|
94
98
|
}
|
|
95
99
|
if (type === TabBarSearchableType.Enter) {
|
|
96
|
-
|
|
100
|
+
verticalSearch = !!ionTabBar.closest('ion-app.ios-theme-vertical-bars');
|
|
101
|
+
if (verticalSearch) {
|
|
102
|
+
// Ionic hides horizontal tabs when the keyboard opens; keep this rail available.
|
|
103
|
+
const keepTabsVisible = () => {
|
|
104
|
+
if (ionTabBar.classList.contains('tab-bar-hidden') && ionTabBar.closest('ion-app.ios-theme-vertical-bars')) {
|
|
105
|
+
ionTabBar.classList.remove('tab-bar-hidden');
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
tabVisibilityObserver?.disconnect();
|
|
109
|
+
tabVisibilityObserver = new MutationObserver(keepTabsVisible);
|
|
110
|
+
tabVisibilityObserver.observe(ionTabBar, { attributes: true, attributeFilter: ['class'] });
|
|
111
|
+
keepTabsVisible();
|
|
112
|
+
}
|
|
113
|
+
resumeNative ??= await suspendNativeUIShell([
|
|
114
|
+
...(verticalSearch ? [] : [ionTabBar]),
|
|
115
|
+
ionFooter,
|
|
116
|
+
ionFabButton.closest('ion-fab') ?? ionFabButton,
|
|
117
|
+
]);
|
|
97
118
|
try {
|
|
98
|
-
searchableEventCache = await enterEvent(event, ionTabBar, ionFabButton, ionFooter);
|
|
119
|
+
searchableEventCache = await enterEvent(event, ionTabBar, ionFabButton, ionFooter, verticalSearch);
|
|
99
120
|
} catch (error) {
|
|
121
|
+
tabVisibilityObserver?.disconnect();
|
|
100
122
|
resumeNative();
|
|
101
123
|
resumeNative = undefined;
|
|
102
124
|
throw error;
|
|
103
125
|
}
|
|
104
126
|
} else if (searchableEventCache !== undefined) {
|
|
105
127
|
try {
|
|
106
|
-
await leaveEvent(event, searchableEventCache, ionTabBar, ionFabButton, ionFooter);
|
|
128
|
+
await leaveEvent(event, searchableEventCache, ionTabBar, ionFabButton, ionFooter, verticalSearch);
|
|
107
129
|
searchableEventCache = undefined;
|
|
108
130
|
} finally {
|
|
131
|
+
tabVisibilityObserver?.disconnect();
|
|
109
132
|
resumeNative?.();
|
|
110
133
|
resumeNative = undefined;
|
|
111
134
|
}
|
|
@@ -120,6 +143,7 @@ const enterEvent = async (
|
|
|
120
143
|
ionTabBar: HTMLElement,
|
|
121
144
|
ionFabButton: HTMLElement,
|
|
122
145
|
ionFooter: HTMLElement,
|
|
146
|
+
verticalSearch: boolean,
|
|
123
147
|
): Promise<SearchableEventCache> => {
|
|
124
148
|
if (!(event.target as HTMLElement)?.closest('ion-fab-button')) {
|
|
125
149
|
throw throwErrorByFailedClickElement('ion-fab-button');
|
|
@@ -131,10 +155,12 @@ const enterEvent = async (
|
|
|
131
155
|
? getComputedStyle(references.selectedTabButton).getPropertyValue('--color-selected').trim()
|
|
132
156
|
: '';
|
|
133
157
|
|
|
134
|
-
|
|
158
|
+
if (verticalSearch) references.closeButtonIcon.setAttribute('name', 'close');
|
|
159
|
+
const tabAnimations = verticalSearch
|
|
160
|
+
? []
|
|
161
|
+
: [createTabBarAnimation(ionTabBar, references, sizes), createEffectAnimation(references, sizes)];
|
|
135
162
|
const searchContainerAnimation = createSearchContainerAnimation(references, sizes);
|
|
136
163
|
const closeButtonsAnimation = createCloseButtonsAnimation(references);
|
|
137
|
-
const tabBarAnimation = createTabBarAnimation(ionTabBar, references, sizes);
|
|
138
164
|
const fabButtonAnimation = createFabButtonAnimation(ionFabButton);
|
|
139
165
|
|
|
140
166
|
await createAnimation()
|
|
@@ -144,7 +170,7 @@ const enterEvent = async (
|
|
|
144
170
|
.addElement(ionFooter)
|
|
145
171
|
.afterAddWrite(() => (ionFooter.style.pointerEvents = 'auto'))
|
|
146
172
|
.fromTo('opacity', '0.8', '1')
|
|
147
|
-
.addAnimation([
|
|
173
|
+
.addAnimation([...tabAnimations, fabButtonAnimation, searchContainerAnimation, closeButtonsAnimation])
|
|
148
174
|
.play();
|
|
149
175
|
|
|
150
176
|
return {
|
|
@@ -159,6 +185,7 @@ const leaveEvent = async (
|
|
|
159
185
|
ionTabBar: HTMLElement,
|
|
160
186
|
ionFabButton: HTMLElement,
|
|
161
187
|
ionFooter: HTMLElement,
|
|
188
|
+
verticalSearch: boolean,
|
|
162
189
|
): Promise<void> => {
|
|
163
190
|
if (!(event.target as HTMLElement)?.closest('ion-buttons[slot=start] ion-button')) {
|
|
164
191
|
throw throwErrorByFailedClickElement('ion-buttons[slot=start] ion-button');
|
|
@@ -166,10 +193,14 @@ const leaveEvent = async (
|
|
|
166
193
|
|
|
167
194
|
const references = getElementReferences(ionTabBar, ionFooter);
|
|
168
195
|
|
|
169
|
-
const
|
|
196
|
+
const tabAnimations = verticalSearch
|
|
197
|
+
? []
|
|
198
|
+
: [
|
|
199
|
+
createReverseTabBarAnimation(ionTabBar, references, searchableEventCache.elementSizes),
|
|
200
|
+
createReverseEffectAnimation(references, searchableEventCache.elementSizes, searchableEventCache.colorSelected),
|
|
201
|
+
];
|
|
170
202
|
const searchContainerAnimation = createReverseSearchContainerAnimation(references, searchableEventCache.elementSizes);
|
|
171
203
|
const closeButtonsAnimation = createReverseCloseButtonsAnimation(references);
|
|
172
|
-
const tabBarAnimation = createReverseTabBarAnimation(ionTabBar, references, searchableEventCache.elementSizes);
|
|
173
204
|
const fabButtonAnimation = createReverseFabButtonAnimation(ionFabButton, searchableEventCache.elementSizes);
|
|
174
205
|
|
|
175
206
|
await createAnimation()
|
|
@@ -179,6 +210,6 @@ const leaveEvent = async (
|
|
|
179
210
|
.addElement(ionFooter)
|
|
180
211
|
.afterAddWrite(() => (ionFooter.style.pointerEvents = 'none'))
|
|
181
212
|
.fromTo('opacity', '1', '0')
|
|
182
|
-
.addAnimation([
|
|
213
|
+
.addAnimation([...tabAnimations, fabButtonAnimation, searchContainerAnimation, closeButtonsAnimation])
|
|
183
214
|
.play();
|
|
184
215
|
};
|
package/src/vertical-bars.ts
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
export { enableVerticalControlArea, setVerticalControlAreaPlacement, IonicNativeUIShell } from './native';
|
|
2
2
|
export { withNativeUIShellTransition } from './native-integration/transition';
|
|
3
|
-
export type {
|
|
3
|
+
export type {
|
|
4
|
+
NativeUIShellStatus,
|
|
5
|
+
NativeUIShellSuspension,
|
|
6
|
+
VerticalBarEdge,
|
|
7
|
+
VerticalControlAreaHandle,
|
|
8
|
+
VerticalControlAreaOptions,
|
|
9
|
+
} from './native';
|
|
10
|
+
|
|
11
|
+
export { applyFoldStateClasses } from './native/foldable/fold-state';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vertical-bars.d.ts","sourceRoot":"","sources":["../src/vertical-bars.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,+BAA+B,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC1G,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAC9E,YAAY,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC"}
|