@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.
Files changed (180) hide show
  1. package/README.md +15 -2
  2. package/dist/_virtual/_rolldown/runtime.js +13 -0
  3. package/dist/css/ionic-theme-ios27.css +1 -1
  4. package/dist/css/vertical-bars.css +1 -1
  5. package/dist/focus-controller/index.d.ts +4 -2
  6. package/dist/focus-controller/index.d.ts.map +1 -1
  7. package/dist/focus-controller/index.js +100 -57
  8. package/dist/focus-controller/index.js.map +1 -0
  9. package/dist/index.d.ts +10 -8
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +54 -60
  12. package/dist/index.js.map +1 -0
  13. package/dist/native/components/index.d.ts +13 -10
  14. package/dist/native/components/index.d.ts.map +1 -1
  15. package/dist/native/components/index.js +39 -41
  16. package/dist/native/components/index.js.map +1 -0
  17. package/dist/native/components/ion-back-button.d.ts +6 -1
  18. package/dist/native/components/ion-back-button.d.ts.map +1 -1
  19. package/dist/native/components/ion-back-button.js +19 -13
  20. package/dist/native/components/ion-back-button.js.map +1 -0
  21. package/dist/native/components/ion-button.d.ts +8 -2
  22. package/dist/native/components/ion-button.d.ts.map +1 -1
  23. package/dist/native/components/ion-button.js +22 -17
  24. package/dist/native/components/ion-button.js.map +1 -0
  25. package/dist/native/components/ion-buttons.d.ts +8 -2
  26. package/dist/native/components/ion-buttons.d.ts.map +1 -1
  27. package/dist/native/components/ion-buttons.js +29 -33
  28. package/dist/native/components/ion-buttons.js.map +1 -0
  29. package/dist/native/components/ion-fab.d.ts +6 -1
  30. package/dist/native/components/ion-fab.d.ts.map +1 -1
  31. package/dist/native/components/ion-fab.js +131 -151
  32. package/dist/native/components/ion-fab.js.map +1 -0
  33. package/dist/native/components/ion-menu-button.d.ts +8 -2
  34. package/dist/native/components/ion-menu-button.d.ts.map +1 -1
  35. package/dist/native/components/ion-menu-button.js +29 -19
  36. package/dist/native/components/ion-menu-button.js.map +1 -0
  37. package/dist/native/components/ion-segment.d.ts +6 -1
  38. package/dist/native/components/ion-segment.d.ts.map +1 -1
  39. package/dist/native/components/ion-segment.js +29 -23
  40. package/dist/native/components/ion-segment.js.map +1 -0
  41. package/dist/native/components/ion-tab-bar.d.ts +6 -1
  42. package/dist/native/components/ion-tab-bar.d.ts.map +1 -1
  43. package/dist/native/components/ion-tab-bar.js +49 -40
  44. package/dist/native/components/ion-tab-bar.js.map +1 -0
  45. package/dist/native/components/searchable-tabs.d.ts +17 -15
  46. package/dist/native/components/searchable-tabs.d.ts.map +1 -1
  47. package/dist/native/components/searchable-tabs.js +382 -435
  48. package/dist/native/components/searchable-tabs.js.map +1 -0
  49. package/dist/native/definitions.d.ts +118 -111
  50. package/dist/native/definitions.d.ts.map +1 -1
  51. package/dist/native/definitions.js +0 -1
  52. package/dist/native/foldable/fold-state.d.ts +5 -0
  53. package/dist/native/foldable/fold-state.d.ts.map +1 -0
  54. package/dist/native/foldable/fold-state.js +14 -0
  55. package/dist/native/foldable/fold-state.js.map +1 -0
  56. package/dist/native/foldable/types.d.ts +12 -0
  57. package/dist/native/foldable/types.d.ts.map +1 -0
  58. package/dist/native/foldable/types.js +0 -0
  59. package/dist/native/index.d.ts +6 -3
  60. package/dist/native/index.d.ts.map +1 -1
  61. package/dist/native/index.js +228 -204
  62. package/dist/native/index.js.map +1 -0
  63. package/dist/native/prehide.d.ts +4 -2
  64. package/dist/native/prehide.d.ts.map +1 -1
  65. package/dist/native/prehide.js +220 -242
  66. package/dist/native/prehide.js.map +1 -0
  67. package/dist/native/runtime.d.ts +3 -1
  68. package/dist/native/runtime.d.ts.map +1 -1
  69. package/dist/native/runtime.js +626 -724
  70. package/dist/native/runtime.js.map +1 -0
  71. package/dist/native/shared/candidate.d.ts +16 -11
  72. package/dist/native/shared/candidate.d.ts.map +1 -1
  73. package/dist/native/shared/candidate.js +96 -95
  74. package/dist/native/shared/candidate.js.map +1 -0
  75. package/dist/native/shared/crossfade.d.ts +6 -4
  76. package/dist/native/shared/crossfade.d.ts.map +1 -1
  77. package/dist/native/shared/crossfade.js +49 -45
  78. package/dist/native/shared/crossfade.js.map +1 -0
  79. package/dist/native/shared/dom.d.ts +7 -5
  80. package/dist/native/shared/dom.d.ts.map +1 -1
  81. package/dist/native/shared/dom.js +163 -211
  82. package/dist/native/shared/dom.js.map +1 -0
  83. package/dist/native/shared/events.d.ts +8 -6
  84. package/dist/native/shared/events.d.ts.map +1 -1
  85. package/dist/native/shared/events.js +12 -7
  86. package/dist/native/shared/events.js.map +1 -0
  87. package/dist/native/shared/icons.d.ts +4 -2
  88. package/dist/native/shared/icons.d.ts.map +1 -1
  89. package/dist/native/shared/icons.js +59 -53
  90. package/dist/native/shared/icons.js.map +1 -0
  91. package/dist/native/shared/modal.d.ts +3 -1
  92. package/dist/native/shared/modal.d.ts.map +1 -1
  93. package/dist/native/shared/modal.js +156 -139
  94. package/dist/native/shared/modal.js.map +1 -0
  95. package/dist/native/vertical-bars-web.d.ts +3 -1
  96. package/dist/native/vertical-bars-web.d.ts.map +1 -1
  97. package/dist/native/vertical-bars-web.js +332 -346
  98. package/dist/native/vertical-bars-web.js.map +1 -0
  99. package/dist/native-integration/index.d.ts +10 -8
  100. package/dist/native-integration/index.d.ts.map +1 -1
  101. package/dist/native-integration/index.js +102 -100
  102. package/dist/native-integration/index.js.map +1 -0
  103. package/dist/native-integration/transition.d.ts +3 -1
  104. package/dist/native-integration/transition.d.ts.map +1 -1
  105. package/dist/native-integration/transition.js +15 -6
  106. package/dist/native-integration/transition.js.map +1 -0
  107. package/dist/searchbar/index.d.ts +4 -2
  108. package/dist/searchbar/index.d.ts.map +1 -1
  109. package/dist/searchbar/index.js +64 -56
  110. package/dist/searchbar/index.js.map +1 -0
  111. package/dist/segment/index.d.ts +3 -1
  112. package/dist/segment/index.d.ts.map +1 -1
  113. package/dist/segment/index.js +465 -324
  114. package/dist/segment/index.js.map +1 -0
  115. package/dist/sheets-of-glass/animations.d.ts +13 -12
  116. package/dist/sheets-of-glass/animations.d.ts.map +1 -1
  117. package/dist/sheets-of-glass/animations.js +496 -306
  118. package/dist/sheets-of-glass/animations.js.map +1 -0
  119. package/dist/sheets-of-glass/index.d.ts +3 -1
  120. package/dist/sheets-of-glass/index.d.ts.map +1 -1
  121. package/dist/sheets-of-glass/index.js +294 -357
  122. package/dist/sheets-of-glass/index.js.map +1 -0
  123. package/dist/sheets-of-glass/interfaces.d.ts +11 -9
  124. package/dist/sheets-of-glass/interfaces.d.ts.map +1 -1
  125. package/dist/sheets-of-glass/interfaces.js +0 -1
  126. package/dist/tab-bar-searchable/animations/enter.d.ts +4 -2
  127. package/dist/tab-bar-searchable/animations/enter.d.ts.map +1 -1
  128. package/dist/tab-bar-searchable/animations/enter.js +50 -69
  129. package/dist/tab-bar-searchable/animations/enter.js.map +1 -0
  130. package/dist/tab-bar-searchable/animations/leave.d.ts +4 -2
  131. package/dist/tab-bar-searchable/animations/leave.d.ts.map +1 -1
  132. package/dist/tab-bar-searchable/animations/leave.js +48 -62
  133. package/dist/tab-bar-searchable/animations/leave.js.map +1 -0
  134. package/dist/tab-bar-searchable/index.d.ts +5 -3
  135. package/dist/tab-bar-searchable/index.d.ts.map +1 -1
  136. package/dist/tab-bar-searchable/index.js +125 -109
  137. package/dist/tab-bar-searchable/index.js.map +1 -0
  138. package/dist/transition/index.d.ts +9 -8
  139. package/dist/transition/index.d.ts.map +1 -1
  140. package/dist/transition/index.js +203 -192
  141. package/dist/transition/index.js.map +1 -0
  142. package/dist/transition/ios.transition.d.ts +7 -5
  143. package/dist/transition/ios.transition.d.ts.map +1 -1
  144. package/dist/transition/ios.transition.js +15 -11
  145. package/dist/transition/ios.transition.js.map +1 -0
  146. package/dist/utils.d.ts +10 -8
  147. package/dist/utils.d.ts.map +1 -1
  148. package/dist/utils.js +58 -66
  149. package/dist/utils.js.map +1 -0
  150. package/dist/vertical-bars.d.ts +5 -4
  151. package/dist/vertical-bars.js +4 -2
  152. package/docs/iphone-duo-with-original-theme.md +18 -29
  153. package/docs/iphone-duo.md +44 -204
  154. package/docs/native-ui-shell.md +15 -11
  155. package/docs/special-markup.md +2 -0
  156. package/docs/vertical-bars.md +283 -0
  157. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellSearchController.swift +1 -1
  158. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift +61 -16
  159. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalSearch.swift +118 -0
  160. package/ios/Sources/IonicNativeUIShellPlugin/IonicNativeUIShellPlugin.swift +17 -8
  161. package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellSnapshot.swift +2 -0
  162. package/ios/Tests/IonicNativeUIShellPluginTests/ShellSnapshotTests.swift +40 -0
  163. package/package.json +9 -6
  164. package/src/native/components/index.ts +3 -2
  165. package/src/native/components/ion-button.ts +3 -2
  166. package/src/native/components/ion-buttons.ts +4 -3
  167. package/src/native/components/ion-menu-button.ts +3 -2
  168. package/src/native/components/searchable-tabs.ts +8 -11
  169. package/src/native/definitions.ts +22 -1
  170. package/src/native/foldable/fold-state.ts +9 -0
  171. package/src/native/foldable/types.ts +4 -0
  172. package/src/native/index.ts +17 -3
  173. package/src/native/prehide.ts +3 -1
  174. package/src/native/runtime.ts +14 -9
  175. package/src/native/shared/candidate.ts +39 -10
  176. package/src/native/shared/dom.ts +4 -4
  177. package/src/styles/vertical-bars.scss +12 -2
  178. package/src/tab-bar-searchable/index.ts +40 -9
  179. package/src/vertical-bars.ts +9 -1
  180. 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 = (element: HTMLElement, kind: NativeUIShellComponent, id: Identify): Candidate => {
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 outline =
58
- isVerticalBarsSource(child) && child.matches('ion-button') && (child as HTMLIonButtonElement).fill === 'outline'
59
- ? getComputedStyle(native ?? child)
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
- backgroundColor:
79
- isVerticalBarsSource(child) && child.matches('ion-button') && (child as HTMLIonButtonElement).fill === 'solid'
80
- ? getComputedStyle(native ?? child).backgroundColor
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
@@ -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 = '.ionic-theme-disabled, .ios-theme-disabled, .ios26-disabled, .ion-cloned-element, [hidden], [inert]';
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(.ionic-theme-disabled, .ios-theme-disabled, .ios26-disabled)';
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('.ionic-theme-disabled, .ios-theme-disabled, .ios26-disabled') &&
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
- .ionic-theme-disabled,
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
- .ionic-theme-disabled *,
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
- resumeNative ??= await suspendNativeUIShell([ionTabBar, ionFooter, ionFabButton.closest('ion-fab') ?? ionFabButton]);
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
- const effectAnimation = createEffectAnimation(references, sizes);
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([tabBarAnimation, fabButtonAnimation, searchContainerAnimation, effectAnimation, closeButtonsAnimation])
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 effectAnimation = createReverseEffectAnimation(references, searchableEventCache.elementSizes, searchableEventCache.colorSelected);
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([tabBarAnimation, fabButtonAnimation, searchContainerAnimation, effectAnimation, closeButtonsAnimation])
213
+ .addAnimation([...tabAnimations, fabButtonAnimation, searchContainerAnimation, closeButtonsAnimation])
183
214
  .play();
184
215
  };
@@ -1,3 +1,11 @@
1
1
  export { enableVerticalControlArea, setVerticalControlAreaPlacement, IonicNativeUIShell } from './native';
2
2
  export { withNativeUIShellTransition } from './native-integration/transition';
3
- export type { NativeUIShellStatus, NativeUIShellSuspension, VerticalBarEdge, VerticalControlAreaHandle } from './native';
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"}