@rdlabo/ionic-theme-ios27 1.2.0-3 → 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 -434
- 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 -730
- 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 +123 -135
- 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 +10 -8
- package/docs/special-markup.md +2 -0
- package/docs/vertical-bars.md +283 -0
- package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift +34 -14
- package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellSnapshot.swift +2 -0
- package/ios/Tests/IonicNativeUIShellPluginTests/ShellSnapshotTests.swift +3 -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/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 +2 -2
- package/src/native/shared/candidate.ts +39 -10
- package/src/native/shared/dom.ts +4 -4
- package/src/styles/vertical-bars.scss +4 -2
- package/src/vertical-bars.ts +9 -1
- package/dist/vertical-bars.d.ts.map +0 -1
|
@@ -10,7 +10,26 @@ export interface NativeUIShellStatus {
|
|
|
10
10
|
reason?: string;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
export interface
|
|
13
|
+
export interface VerticalControlAreaOptions {
|
|
14
|
+
/** Appearance of native vertical ion-button and ion-menu-button actions.
|
|
15
|
+
* `system` (default) uses SwiftUI styling and template icons; `source` projects supported Ionic fill and colors.
|
|
16
|
+
* Local data-projection="source|system" or ios-theme-projection-source / ios-theme-projection-system take precedence:
|
|
17
|
+
* the button itself, then its nearest ion-buttons, then this option. On the same element, a valid attribute wins;
|
|
18
|
+
* otherwise system wins if both classes are present. Invalid attribute values are ignored.
|
|
19
|
+
* Local settings update live; removing them restores inheritance. Actions, disabled state and grouping are preserved.
|
|
20
|
+
* Does not affect back buttons, tabs, FABs, horizontal controls, source elements or Web clones.
|
|
21
|
+
*/
|
|
22
|
+
buttonProjection?: 'source' | 'system';
|
|
23
|
+
/** Default fill for native vertical ion-button actions resolved to `source`, including local overrides.
|
|
24
|
+
* Use `solid` for Ionic's default design, or `null` (also the omitted default) for the iOS theme's glass design.
|
|
25
|
+
* Applies when fill is omitted or `default`, outside ion-buttons. Inside ion-buttons the default is clear.
|
|
26
|
+
* Explicit clear, solid and outline take precedence; clear and outline cannot be configured as defaults.
|
|
27
|
+
* Source elements and Web clones are unchanged.
|
|
28
|
+
*/
|
|
29
|
+
buttonDefaultFill?: 'solid' | null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface NativeUIShellOptions extends VerticalControlAreaOptions {
|
|
14
33
|
/** Enables Native UI Shell globally. Defaults to `true`. */
|
|
15
34
|
enabled?: boolean;
|
|
16
35
|
/** Controls eligible for native projection. Omit to enable every control; when present, only `true` controls are enabled. */
|
|
@@ -82,6 +101,8 @@ export interface ShellItem extends Frame {
|
|
|
82
101
|
fontSize: number;
|
|
83
102
|
fontWeight: number;
|
|
84
103
|
color: string;
|
|
104
|
+
/** Resolved ion-button fill for vertical projection; clear omits the native glass background. */
|
|
105
|
+
buttonFill?: 'clear' | 'solid' | 'outline';
|
|
85
106
|
backgroundColor?: string;
|
|
86
107
|
borderColor?: string;
|
|
87
108
|
borderWidth?: number;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FoldState } from './types';
|
|
2
|
+
|
|
3
|
+
/** Keep posture on ion-app so descendants can follow it through CSS. */
|
|
4
|
+
export function applyFoldStateClasses(root: HTMLElement, fold: FoldState): void {
|
|
5
|
+
for (const state of ['flat', 'half-opened', 'closed']) {
|
|
6
|
+
root.classList.toggle(`ios-theme-fold-${state}`, fold.state === state);
|
|
7
|
+
}
|
|
8
|
+
root.classList.toggle('ios-theme-fold-expanded', fold.state === 'half-opened' || (fold.state === 'flat' && !!fold.hingeBounds));
|
|
9
|
+
}
|
package/src/native/index.ts
CHANGED
|
@@ -7,6 +7,7 @@ import type {
|
|
|
7
7
|
VerticalBarEdge,
|
|
8
8
|
VerticalBarPlacement,
|
|
9
9
|
VerticalControlAreaHandle,
|
|
10
|
+
VerticalControlAreaOptions,
|
|
10
11
|
WebViewMetrics,
|
|
11
12
|
} from './definitions';
|
|
12
13
|
import { createRuntime } from './runtime';
|
|
@@ -23,6 +24,7 @@ export type {
|
|
|
23
24
|
VerticalBarEdge,
|
|
24
25
|
VerticalBarPlacement,
|
|
25
26
|
VerticalControlAreaHandle,
|
|
27
|
+
VerticalControlAreaOptions,
|
|
26
28
|
WebViewMetrics,
|
|
27
29
|
} from './definitions';
|
|
28
30
|
|
|
@@ -160,9 +162,18 @@ export const setVerticalControlAreaPlacement = (placement: VerticalBarEdge | Ver
|
|
|
160
162
|
document.defaultView?.dispatchEvent(new Event('nativeUIShellRefresh'));
|
|
161
163
|
};
|
|
162
164
|
|
|
163
|
-
/**
|
|
164
|
-
|
|
165
|
-
|
|
165
|
+
/**
|
|
166
|
+
* Call once after ion-app is mounted. Ionic markup remains the source of truth.
|
|
167
|
+
* Native vertical buttons default to SwiftUI appearance.
|
|
168
|
+
* See VerticalControlAreaOptions for source styling and local overrides.
|
|
169
|
+
*/
|
|
170
|
+
export const enableVerticalControlArea = async (options: VerticalControlAreaOptions = {}): Promise<VerticalControlAreaHandle> => {
|
|
171
|
+
const handle = await enableNativeUIShell({
|
|
172
|
+
buttonProjection: options.buttonProjection,
|
|
173
|
+
buttonDefaultFill: options.buttonDefaultFill,
|
|
174
|
+
controls: { tabs: true, toolbar: true },
|
|
175
|
+
verticalBarsOnly: true,
|
|
176
|
+
});
|
|
166
177
|
return {
|
|
167
178
|
getStatus: () => handle.getStatus(),
|
|
168
179
|
suspend: () => handle.suspend(),
|
|
@@ -188,6 +199,9 @@ export const enableNativeUIShell = (options: NativeUIShellOptions = {}): Promise
|
|
|
188
199
|
const controls = options.controls;
|
|
189
200
|
const configuration = JSON.stringify([
|
|
190
201
|
options.verticalBarsOnly === true,
|
|
202
|
+
options.buttonProjection ?? 'system',
|
|
203
|
+
// Local source overrides can use this even when the startup projection is system.
|
|
204
|
+
options.buttonDefaultFill ?? null,
|
|
191
205
|
...(['tabs', 'toolbar', 'segment', 'fab'] as const).map((component) => !controls || controls[component] === true),
|
|
192
206
|
]);
|
|
193
207
|
if (active && activeConfiguration !== configuration)
|
package/src/native/prehide.ts
CHANGED
|
@@ -74,6 +74,8 @@ export const prehideVerticalBarsToolbarSources = (doc: Document): { suspend: ()
|
|
|
74
74
|
};
|
|
75
75
|
const sources = scope.matches('ion-back-button') ? [scope] : Array.from(scope.querySelectorAll<HTMLElement>(sourceSelector));
|
|
76
76
|
sources.forEach((element) => {
|
|
77
|
+
// Shell opt-out is temporary; decide initial placement once it is lifted.
|
|
78
|
+
if (isShellDisabled(element)) return;
|
|
77
79
|
if (!modalUsesVerticalBars(element) || element.closest(overlays) || (scope.matches('.ion-page') && routedPage(element) !== scope))
|
|
78
80
|
return;
|
|
79
81
|
if (element.matches('ion-buttons')) {
|
|
@@ -228,7 +230,7 @@ export const prehideVerticalBarsToolbarSources = (doc: Document): { suspend: ()
|
|
|
228
230
|
childList: true,
|
|
229
231
|
attributes: true,
|
|
230
232
|
attributeOldValue: true,
|
|
231
|
-
attributeFilter: ['class', 'hidden', 'inert', 'icon', 'color'],
|
|
233
|
+
attributeFilter: ['class', 'data-shell', 'hidden', 'inert', 'icon', 'color'],
|
|
232
234
|
});
|
|
233
235
|
return {
|
|
234
236
|
suspend: () => {
|
package/src/native/runtime.ts
CHANGED
|
@@ -172,14 +172,14 @@ export const createRuntime = async (
|
|
|
172
172
|
measuringPointerPages.add(pointerPage);
|
|
173
173
|
pointerPage.style.setProperty('pointer-events', 'auto', 'important');
|
|
174
174
|
try {
|
|
175
|
-
candidate = readCandidate(element, id);
|
|
175
|
+
candidate = readCandidate(element, id, options);
|
|
176
176
|
} finally {
|
|
177
177
|
if (previous) pointerPage.style.setProperty('pointer-events', previous, priority);
|
|
178
178
|
else pointerPage.style.removeProperty('pointer-events');
|
|
179
179
|
if (!hadStyle && !pointerPage.style.length) pointerPage.removeAttribute('style');
|
|
180
180
|
win.setTimeout(() => measuringPointerPages.delete(pointerPage), 0);
|
|
181
181
|
}
|
|
182
|
-
} else candidate = readCandidate(element, id);
|
|
182
|
+
} else candidate = readCandidate(element, id, options);
|
|
183
183
|
if (candidate && isVerticalBarsCandidate(element)) {
|
|
184
184
|
if (!nativeVerticalBars()) return undefined;
|
|
185
185
|
candidate.control.placement = 'vertical-bars';
|
|
@@ -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
|
}
|
|
@@ -282,7 +283,8 @@ html.ios-theme-native-ui-shell-prehide
|
|
|
282
283
|
[icon],
|
|
283
284
|
[color],
|
|
284
285
|
.ios-theme-vertical-bars-back-web-owned,
|
|
285
|
-
.
|
|
286
|
+
.ios-theme-shell-disabled,
|
|
287
|
+
[data-shell='disabled'],
|
|
286
288
|
.ios-theme-disabled,
|
|
287
289
|
.ios26-disabled,
|
|
288
290
|
.ios-theme-vertical-bars-back-button-projection
|
|
@@ -295,7 +297,7 @@ html.ios-theme-native-ui-shell-prehide
|
|
|
295
297
|
ion-footer[collapse] *,
|
|
296
298
|
ion-buttons.ios-theme-horizontal-only *,
|
|
297
299
|
.ios-theme-shell-disabled *,
|
|
298
|
-
|
|
300
|
+
[data-shell='disabled'] *,
|
|
299
301
|
.ios-theme-disabled *,
|
|
300
302
|
.ios26-disabled *
|
|
301
303
|
)
|
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"}
|