@rdlabo/capacitor-native-ui 0.0.0-stage → 2.0.0-1
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/LICENSE +21 -0
- package/Package.swift +23 -0
- package/README.md +66 -2
- package/RdlaboCapacitorNativeUi.podspec +17 -0
- package/android/build.gradle +69 -0
- package/android/proguard-rules.pro +0 -0
- package/android/src/main/AndroidManifest.xml +1 -0
- package/android/src/main/java/dev/rdlabo/capacitor/nativeui/NativeUI.kt +51 -0
- package/android/src/main/java/dev/rdlabo/capacitor/nativeui/NativeUIPlugin.kt +192 -0
- package/android/src/main/java/dev/rdlabo/capacitor/nativeui/NativeUISnapshot.kt +57 -0
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/core.d.ts +4 -0
- package/dist/core.js +3 -0
- package/dist/native/activation.d.ts +14 -0
- package/dist/native/activation.d.ts.map +1 -0
- package/dist/native/activation.js +305 -0
- package/dist/native/activation.js.map +1 -0
- package/dist/native/components/index.d.ts +19 -0
- package/dist/native/components/index.d.ts.map +1 -0
- package/dist/native/components/index.js +38 -0
- package/dist/native/components/index.js.map +1 -0
- package/dist/native/components/ion-back-button.d.ts +10 -0
- package/dist/native/components/ion-back-button.d.ts.map +1 -0
- package/dist/native/components/ion-back-button.js +21 -0
- package/dist/native/components/ion-back-button.js.map +1 -0
- package/dist/native/components/ion-button.d.ts +10 -0
- package/dist/native/components/ion-button.d.ts.map +1 -0
- package/dist/native/components/ion-button.js +25 -0
- package/dist/native/components/ion-button.js.map +1 -0
- package/dist/native/components/ion-buttons.d.ts +11 -0
- package/dist/native/components/ion-buttons.d.ts.map +1 -0
- package/dist/native/components/ion-buttons.js +30 -0
- package/dist/native/components/ion-buttons.js.map +1 -0
- package/dist/native/components/ion-fab.d.ts +10 -0
- package/dist/native/components/ion-fab.d.ts.map +1 -0
- package/dist/native/components/ion-fab.js +132 -0
- package/dist/native/components/ion-fab.js.map +1 -0
- package/dist/native/components/ion-menu-button.d.ts +13 -0
- package/dist/native/components/ion-menu-button.d.ts.map +1 -0
- package/dist/native/components/ion-menu-button.js +44 -0
- package/dist/native/components/ion-menu-button.js.map +1 -0
- package/dist/native/components/ion-segment.d.ts +11 -0
- package/dist/native/components/ion-segment.d.ts.map +1 -0
- package/dist/native/components/ion-segment.js +30 -0
- package/dist/native/components/ion-segment.js.map +1 -0
- package/dist/native/components/ion-tab-bar.d.ts +11 -0
- package/dist/native/components/ion-tab-bar.d.ts.map +1 -0
- package/dist/native/components/ion-tab-bar.js +50 -0
- package/dist/native/components/ion-tab-bar.js.map +1 -0
- package/dist/native/components/searchable-tabs.d.ts +20 -0
- package/dist/native/components/searchable-tabs.d.ts.map +1 -0
- package/dist/native/components/searchable-tabs.js +413 -0
- package/dist/native/components/searchable-tabs.js.map +1 -0
- package/dist/native/definitions.d.ts +237 -0
- package/dist/native/definitions.d.ts.map +1 -0
- package/dist/native/definitions.js +0 -0
- package/dist/native/extensions.d.ts +31 -0
- package/dist/native/extensions.d.ts.map +1 -0
- package/dist/native/extensions.js +122 -0
- package/dist/native/extensions.js.map +1 -0
- 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 +15 -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/html.d.ts +9 -0
- package/dist/native/html.d.ts.map +1 -0
- package/dist/native/html.js +197 -0
- package/dist/native/html.js.map +1 -0
- package/dist/native/index.d.ts +10 -0
- package/dist/native/index.d.ts.map +1 -0
- package/dist/native/index.js +19 -0
- package/dist/native/index.js.map +1 -0
- package/dist/native/legacy-layout.d.ts +5 -0
- package/dist/native/legacy-layout.d.ts.map +1 -0
- package/dist/native/legacy-layout.js +27 -0
- package/dist/native/legacy-layout.js.map +1 -0
- package/dist/native/overlays/content.d.ts +4 -0
- package/dist/native/overlays/content.d.ts.map +1 -0
- package/dist/native/overlays/content.js +51 -0
- package/dist/native/overlays/content.js.map +1 -0
- package/dist/native/overlays/controller.d.ts +8 -0
- package/dist/native/overlays/controller.d.ts.map +1 -0
- package/dist/native/overlays/controller.js +285 -0
- package/dist/native/overlays/controller.js.map +1 -0
- package/dist/native/overlays/dialog-animation.d.ts +9 -0
- package/dist/native/overlays/dialog-animation.d.ts.map +1 -0
- package/dist/native/overlays/dialog-animation.js +53 -0
- package/dist/native/overlays/dialog-animation.js.map +1 -0
- package/dist/native/overlays/dismiss-animation.d.ts +4 -0
- package/dist/native/overlays/dismiss-animation.d.ts.map +1 -0
- package/dist/native/overlays/dismiss-animation.js +18 -0
- package/dist/native/overlays/dismiss-animation.js.map +1 -0
- package/dist/native/overlays/focus.d.ts +5 -0
- package/dist/native/overlays/focus.d.ts.map +1 -0
- package/dist/native/overlays/focus.js +59 -0
- package/dist/native/overlays/focus.js.map +1 -0
- package/dist/native/overlays/popover.d.ts +12 -0
- package/dist/native/overlays/popover.d.ts.map +1 -0
- package/dist/native/overlays/popover.js +110 -0
- package/dist/native/overlays/popover.js.map +1 -0
- package/dist/native/overlays/styles.d.ts +11 -0
- package/dist/native/overlays/styles.d.ts.map +1 -0
- package/dist/native/overlays/styles.js +167 -0
- package/dist/native/overlays/styles.js.map +1 -0
- package/dist/native/prehide.d.ts +8 -0
- package/dist/native/prehide.d.ts.map +1 -0
- package/dist/native/prehide.js +238 -0
- package/dist/native/prehide.js.map +1 -0
- package/dist/native/runtime.d.ts +7 -0
- package/dist/native/runtime.d.ts.map +1 -0
- package/dist/native/runtime.js +776 -0
- package/dist/native/runtime.js.map +1 -0
- package/dist/native/shared/bridge.d.ts +6 -0
- package/dist/native/shared/bridge.d.ts.map +1 -0
- package/dist/native/shared/bridge.js +18 -0
- package/dist/native/shared/bridge.js.map +1 -0
- package/dist/native/shared/candidate.d.ts +25 -0
- package/dist/native/shared/candidate.d.ts.map +1 -0
- package/dist/native/shared/candidate.js +106 -0
- package/dist/native/shared/candidate.js.map +1 -0
- package/dist/native/shared/clipping.d.ts +5 -0
- package/dist/native/shared/clipping.d.ts.map +1 -0
- package/dist/native/shared/clipping.js +26 -0
- package/dist/native/shared/clipping.js.map +1 -0
- package/dist/native/shared/control-options.d.ts +6 -0
- package/dist/native/shared/control-options.d.ts.map +1 -0
- package/dist/native/shared/control-options.js +17 -0
- package/dist/native/shared/control-options.js.map +1 -0
- package/dist/native/shared/crossfade.d.ts +12 -0
- package/dist/native/shared/crossfade.d.ts.map +1 -0
- package/dist/native/shared/crossfade.js +67 -0
- package/dist/native/shared/crossfade.js.map +1 -0
- package/dist/native/shared/diagnostics.d.ts +4 -0
- package/dist/native/shared/diagnostics.d.ts.map +1 -0
- package/dist/native/shared/diagnostics.js +18 -0
- package/dist/native/shared/diagnostics.js.map +1 -0
- package/dist/native/shared/dom.d.ts +46 -0
- package/dist/native/shared/dom.d.ts.map +1 -0
- package/dist/native/shared/dom.js +180 -0
- package/dist/native/shared/dom.js.map +1 -0
- package/dist/native/shared/events.d.ts +15 -0
- package/dist/native/shared/events.d.ts.map +1 -0
- package/dist/native/shared/events.js +17 -0
- package/dist/native/shared/events.js.map +1 -0
- package/dist/native/shared/icons.d.ts +8 -0
- package/dist/native/shared/icons.d.ts.map +1 -0
- package/dist/native/shared/icons.js +61 -0
- package/dist/native/shared/icons.js.map +1 -0
- package/dist/native/shared/modal.d.ts +10 -0
- package/dist/native/shared/modal.d.ts.map +1 -0
- package/dist/native/shared/modal.js +160 -0
- package/dist/native/shared/modal.js.map +1 -0
- package/dist/native/shared/projection-id.d.ts +4 -0
- package/dist/native/shared/projection-id.d.ts.map +1 -0
- package/dist/native/shared/projection-id.js +7 -0
- package/dist/native/shared/projection-id.js.map +1 -0
- package/dist/native/shared/toolbar-options.d.ts +13 -0
- package/dist/native/shared/toolbar-options.d.ts.map +1 -0
- package/dist/native/shared/toolbar-options.js +28 -0
- package/dist/native/shared/toolbar-options.js.map +1 -0
- package/dist/native/shared/vertical-bars-geometry.d.ts +10 -0
- package/dist/native/shared/vertical-bars-geometry.d.ts.map +1 -0
- package/dist/native/shared/vertical-bars-geometry.js +85 -0
- package/dist/native/shared/vertical-bars-geometry.js.map +1 -0
- package/dist/native/startup.d.ts +8 -0
- package/dist/native/startup.d.ts.map +1 -0
- package/dist/native/startup.js +70 -0
- package/dist/native/startup.js.map +1 -0
- package/dist/native/vertical-bars-web-search.d.ts +10 -0
- package/dist/native/vertical-bars-web-search.d.ts.map +1 -0
- package/dist/native/vertical-bars-web-search.js +90 -0
- package/dist/native/vertical-bars-web-search.js.map +1 -0
- package/dist/native/vertical-bars-web.d.ts +5 -0
- package/dist/native/vertical-bars-web.d.ts.map +1 -0
- package/dist/native/vertical-bars-web.js +422 -0
- package/dist/native/vertical-bars-web.js.map +1 -0
- package/dist/native-integration/index.d.ts +25 -0
- package/dist/native-integration/index.d.ts.map +1 -0
- package/dist/native-integration/index.js +33 -0
- package/dist/native-integration/index.js.map +1 -0
- package/dist/vertical-bars.d.ts +6 -0
- package/dist/vertical-bars.js +5 -0
- package/docs/appearance.md +45 -0
- package/docs/configuration.md +219 -0
- package/docs/framework-independent.md +107 -0
- package/docs/ionic-vertical-bars.md +173 -0
- package/docs/migration.md +184 -0
- package/docs/native-ui-extensions.md +394 -0
- package/docs/native-ui.md +528 -0
- package/docs/setup.md +224 -0
- package/docs/vertical-bars.md +431 -0
- package/ios/Sources/NativeUIPlugin/Components/NativeUIButton.swift +71 -0
- package/ios/Sources/NativeUIPlugin/Components/NativeUIButtons.swift +24 -0
- package/ios/Sources/NativeUIPlugin/Components/NativeUIComponents.swift +19 -0
- package/ios/Sources/NativeUIPlugin/Components/NativeUIFab.swift +80 -0
- package/ios/Sources/NativeUIPlugin/Components/NativeUISearchController.swift +439 -0
- package/ios/Sources/NativeUIPlugin/Components/NativeUISegment.swift +91 -0
- package/ios/Sources/NativeUIPlugin/Components/NativeUITabBar.swift +218 -0
- package/ios/Sources/NativeUIPlugin/Components/NativeUIVerticalBars.swift +590 -0
- package/ios/Sources/NativeUIPlugin/Components/NativeUIVerticalSearch.swift +118 -0
- package/ios/Sources/NativeUIPlugin/Extensions/NativeUI.swift +178 -0
- package/ios/Sources/NativeUIPlugin/Extensions/NativeUIRendering.swift +38 -0
- package/ios/Sources/NativeUIPlugin/NativeUIPlugin.swift +615 -0
- package/ios/Sources/NativeUIPlugin/Overlays/NativeUIOverlayController.swift +119 -0
- package/ios/Sources/NativeUIPlugin/Overlays/NativeUIOverlayHost.swift +75 -0
- package/ios/Sources/NativeUIPlugin/Shared/NativeUIControlRendering.swift +21 -0
- package/ios/Sources/NativeUIPlugin/Shared/NativeUICrossfade.swift +35 -0
- package/ios/Sources/NativeUIPlugin/Shared/NativeUIHost.swift +8 -0
- package/ios/Sources/NativeUIPlugin/Shared/NativeUISnapshot.swift +161 -0
- package/ios/Sources/NativeUIPlugin/Shared/NativeUIVerticalBarsGeometry.swift +52 -0
- package/ios/Tests/NativeUIPluginTests/NativeUIExtensionTests.swift +165 -0
- package/ios/Tests/NativeUIPluginTests/NativeUISnapshotTests.swift +805 -0
- package/package.json +89 -4
- package/src/core.ts +14 -0
- package/src/native/activation.ts +385 -0
- package/src/native/components/index.ts +45 -0
- package/src/native/components/ion-back-button.ts +22 -0
- package/src/native/components/ion-button.ts +25 -0
- package/src/native/components/ion-buttons.ts +37 -0
- package/src/native/components/ion-fab.ts +151 -0
- package/src/native/components/ion-menu-button.ts +37 -0
- package/src/native/components/ion-segment.ts +27 -0
- package/src/native/components/ion-tab-bar.ts +50 -0
- package/src/native/components/searchable-tabs.ts +499 -0
- package/src/native/definitions.ts +274 -0
- package/src/native/extensions.ts +176 -0
- package/src/native/foldable/fold-state.ts +10 -0
- package/src/native/foldable/types.ts +4 -0
- package/src/native/html.ts +199 -0
- package/src/native/index.ts +32 -0
- package/src/native/legacy-layout.ts +21 -0
- package/src/native/overlays/content.ts +51 -0
- package/src/native/overlays/controller.ts +349 -0
- package/src/native/overlays/dialog-animation.ts +53 -0
- package/src/native/overlays/dismiss-animation.ts +15 -0
- package/src/native/overlays/focus.ts +64 -0
- package/src/native/overlays/popover.ts +120 -0
- package/src/native/overlays/styles.ts +181 -0
- package/src/native/prehide.ts +285 -0
- package/src/native/runtime.ts +979 -0
- package/src/native/shared/bridge.ts +18 -0
- package/src/native/shared/candidate.ts +162 -0
- package/src/native/shared/clipping.ts +24 -0
- package/src/native/shared/control-options.ts +20 -0
- package/src/native/shared/crossfade.ts +67 -0
- package/src/native/shared/diagnostics.ts +13 -0
- package/src/native/shared/dom.ts +304 -0
- package/src/native/shared/events.ts +14 -0
- package/src/native/shared/icons.ts +57 -0
- package/src/native/shared/modal.ts +157 -0
- package/src/native/shared/projection-id.ts +2 -0
- package/src/native/shared/toolbar-options.ts +49 -0
- package/src/native/shared/vertical-bars-geometry.ts +80 -0
- package/src/native/startup.ts +68 -0
- package/src/native/vertical-bars-web-search.ts +86 -0
- package/src/native/vertical-bars-web.ts +500 -0
- package/src/native-integration/index.ts +49 -0
- package/src/vertical-bars.ts +12 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { controlDefault } from "./shared/control-options.js";
|
|
2
|
+
import { observeVerticalBarsModals } from "./shared/modal.js";
|
|
3
|
+
import { toolbarOptions } from "./shared/toolbar-options.js";
|
|
4
|
+
import { createDiagnostics } from "./shared/diagnostics.js";
|
|
5
|
+
import { createHTMLWebProjection } from "./html.js";
|
|
6
|
+
import { defineNativeUI, validateExtensions } from "./extensions.js";
|
|
7
|
+
import { nativeWebViewMetrics } from "../native-integration/index.js";
|
|
8
|
+
import { bounded, boundedListener } from "./shared/bridge.js";
|
|
9
|
+
import { createRuntime } from "./runtime.js";
|
|
10
|
+
import { createVerticalBarsWebProjection } from "./vertical-bars-web.js";
|
|
11
|
+
import { prehideVerticalBarsToolbarSources } from "./prehide.js";
|
|
12
|
+
import { Capacitor, registerPlugin } from "@capacitor/core";
|
|
13
|
+
//#region src/native/activation.ts
|
|
14
|
+
const plugin = registerPlugin("NativeUI");
|
|
15
|
+
const NativeUI = plugin;
|
|
16
|
+
let active;
|
|
17
|
+
let activeFailed = false;
|
|
18
|
+
let activeRoot;
|
|
19
|
+
let activeRailHost;
|
|
20
|
+
let activeConfiguration;
|
|
21
|
+
let activeExtensions = [];
|
|
22
|
+
let stopping;
|
|
23
|
+
const stopActivation = (owner, destruction) => {
|
|
24
|
+
if (active !== owner) return;
|
|
25
|
+
active = void 0;
|
|
26
|
+
activeFailed = false;
|
|
27
|
+
activeConfiguration = void 0;
|
|
28
|
+
activeRoot = void 0;
|
|
29
|
+
activeRailHost = void 0;
|
|
30
|
+
activeExtensions = [];
|
|
31
|
+
stopping = destruction;
|
|
32
|
+
const release = () => {
|
|
33
|
+
if (stopping === destruction) stopping = void 0;
|
|
34
|
+
};
|
|
35
|
+
destruction.then(release, release);
|
|
36
|
+
};
|
|
37
|
+
const web = (reason) => ({
|
|
38
|
+
markForCheck: () => {},
|
|
39
|
+
getStatus: () => ({
|
|
40
|
+
state: "web",
|
|
41
|
+
projected: 0,
|
|
42
|
+
updates: 0,
|
|
43
|
+
reason
|
|
44
|
+
}),
|
|
45
|
+
suspend: async () => ({ resume: async () => {} }),
|
|
46
|
+
destroy: async () => {}
|
|
47
|
+
});
|
|
48
|
+
const combine = (native, fallback) => ({
|
|
49
|
+
markForCheck() {
|
|
50
|
+
native.markForCheck();
|
|
51
|
+
fallback.markForCheck();
|
|
52
|
+
},
|
|
53
|
+
getStatus() {
|
|
54
|
+
const nativeStatus = native.getStatus();
|
|
55
|
+
const fallbackStatus = fallback.getStatus();
|
|
56
|
+
return {
|
|
57
|
+
...nativeStatus,
|
|
58
|
+
state: nativeStatus.state === "stopped" && fallbackStatus.state === "stopped" ? "stopped" : nativeStatus.projected > 0 ? "native" : "web",
|
|
59
|
+
projected: nativeStatus.projected + fallbackStatus.projected,
|
|
60
|
+
updates: nativeStatus.updates + fallbackStatus.updates
|
|
61
|
+
};
|
|
62
|
+
},
|
|
63
|
+
async suspend() {
|
|
64
|
+
const [nativeLease, fallbackLease] = await Promise.all([native.suspend(), fallback.suspend()]);
|
|
65
|
+
return { resume: async () => void await Promise.all([nativeLease.resume(), fallbackLease.resume()]) };
|
|
66
|
+
},
|
|
67
|
+
async destroy() {
|
|
68
|
+
await Promise.all([native.destroy(), fallback.destroy()]);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
/** Wraps a runtime handle with the shared enable-lifecycle: reason, suspend hooks and idempotent destroy. */
|
|
72
|
+
const manage = (handle, lifecycle = {}) => {
|
|
73
|
+
let destruction;
|
|
74
|
+
return {
|
|
75
|
+
markForCheck: () => {
|
|
76
|
+
if (!destruction) handle.markForCheck();
|
|
77
|
+
},
|
|
78
|
+
getStatus: () => lifecycle.reason ? {
|
|
79
|
+
...handle.getStatus(),
|
|
80
|
+
reason: lifecycle.reason
|
|
81
|
+
} : handle.getStatus(),
|
|
82
|
+
async suspend() {
|
|
83
|
+
const lease = await handle.suspend();
|
|
84
|
+
const resume = await lifecycle.suspend?.();
|
|
85
|
+
return { async resume() {
|
|
86
|
+
await lease.resume();
|
|
87
|
+
resume?.();
|
|
88
|
+
} };
|
|
89
|
+
},
|
|
90
|
+
destroy() {
|
|
91
|
+
if (!destruction) {
|
|
92
|
+
destruction = Promise.resolve().then(async () => {
|
|
93
|
+
try {
|
|
94
|
+
await handle.destroy();
|
|
95
|
+
} finally {
|
|
96
|
+
await lifecycle.destroy?.();
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
lifecycle.stopping?.(destruction);
|
|
100
|
+
}
|
|
101
|
+
return destruction;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
/** Reads the current native WebView geometry and applies it to page transitions. */
|
|
106
|
+
const configureNativeTransition = async () => {
|
|
107
|
+
const metrics = typeof document !== "undefined" && Capacitor.getPlatform() === "ios" && Capacitor.isPluginAvailable("NativeUI") ? await bounded(plugin.getWebViewMetrics()) : { radius: 0 };
|
|
108
|
+
nativeWebViewMetrics.radius = metrics.radius;
|
|
109
|
+
return metrics;
|
|
110
|
+
};
|
|
111
|
+
/** Resolves a logical vertical-bar edge to the physical side for the given direction. */
|
|
112
|
+
const physicalVerticalBarEdge = (edge, rtl) => edge === "leading" !== rtl ? "left" : "right";
|
|
113
|
+
const elementRtl = (element) => element.closest("[dir]")?.getAttribute("dir") === "rtl";
|
|
114
|
+
const webProjection = (doc, options, enabled = () => true) => {
|
|
115
|
+
const ionic = () => createVerticalBarsWebProjection(doc, options, () => options.verticalBars?.enabled !== false && enabled());
|
|
116
|
+
if (options.source === "html") return createHTMLWebProjection(doc, options);
|
|
117
|
+
if (options.source === "auto") return combine(ionic(), createHTMLWebProjection(doc, options));
|
|
118
|
+
return ionic();
|
|
119
|
+
};
|
|
120
|
+
/** Call once at application startup. Ionic markup remains the source of truth. */
|
|
121
|
+
const enableNativeUI = (options = {}, overlayFactory) => {
|
|
122
|
+
if (typeof document === "undefined") return Promise.resolve(web("Requires a document"));
|
|
123
|
+
const extensions = [...options.extensions ?? []];
|
|
124
|
+
const nativeState = options.nativeState = {};
|
|
125
|
+
try {
|
|
126
|
+
validateExtensions(extensions, document);
|
|
127
|
+
} catch (error) {
|
|
128
|
+
return Promise.reject(error);
|
|
129
|
+
}
|
|
130
|
+
const configuration = JSON.stringify([
|
|
131
|
+
options.source ?? "ionic",
|
|
132
|
+
options.debug === true,
|
|
133
|
+
options.ionic?.auto !== false,
|
|
134
|
+
options.verticalBars?.enabled !== false,
|
|
135
|
+
options.verticalBars?.placement?.edge,
|
|
136
|
+
options.rail?.edge,
|
|
137
|
+
toolbarOptions(options, false),
|
|
138
|
+
toolbarOptions(options, true),
|
|
139
|
+
options.ionic?.verticalBars?.buttonProjection ?? "system",
|
|
140
|
+
options.ionic?.verticalBars?.buttonDefaultFill ?? "glass",
|
|
141
|
+
...[
|
|
142
|
+
"tabs",
|
|
143
|
+
"segment",
|
|
144
|
+
"fab"
|
|
145
|
+
].flatMap((kind) => [controlDefault(options, kind, false), controlDefault(options, kind, true)]),
|
|
146
|
+
options.ionic?.verticalBars?.popover === true
|
|
147
|
+
]);
|
|
148
|
+
if (active && activeFailed) {
|
|
149
|
+
const previous = active;
|
|
150
|
+
stopActivation(previous, previous.then((handle) => handle.destroy()));
|
|
151
|
+
}
|
|
152
|
+
if (active && (activeConfiguration !== configuration || activeRoot !== options.root || activeRailHost !== options.rail?.host || extensions.length !== activeExtensions.length || extensions.some((extension, index) => extension !== activeExtensions[index]))) return Promise.reject(/* @__PURE__ */ new Error("Native UI is already running with different controls or extensions; destroy it before changing configuration."));
|
|
153
|
+
if (active) return active;
|
|
154
|
+
activeConfiguration = configuration;
|
|
155
|
+
activeRoot = options.root;
|
|
156
|
+
activeRailHost = options.rail?.host;
|
|
157
|
+
activeExtensions = extensions;
|
|
158
|
+
const previousStop = stopping;
|
|
159
|
+
let start;
|
|
160
|
+
const stop = (destruction) => stopActivation(start, destruction);
|
|
161
|
+
let releaseNative = async () => {};
|
|
162
|
+
let retired = false;
|
|
163
|
+
const pagehide = () => runtimeStopped("pagehide");
|
|
164
|
+
const runtimeStopped = (cause) => {
|
|
165
|
+
if (cause === "failure") {
|
|
166
|
+
if (active === start) activeFailed = true;
|
|
167
|
+
start.then(async () => {
|
|
168
|
+
if (!retired) document.defaultView?.addEventListener("pagehide", pagehide, { once: true });
|
|
169
|
+
await releaseNative();
|
|
170
|
+
}).catch(() => {});
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const destruction = start.then((handle) => handle.destroy());
|
|
174
|
+
stop(destruction);
|
|
175
|
+
destruction.catch(() => {});
|
|
176
|
+
};
|
|
177
|
+
return start = active = (async () => {
|
|
178
|
+
if (previousStop) await previousStop.catch(() => {});
|
|
179
|
+
const platform = Capacitor.getPlatform();
|
|
180
|
+
const diagnose = createDiagnostics(options.debug);
|
|
181
|
+
const stopModals = options.source === "html" ? () => {} : observeVerticalBarsModals(document);
|
|
182
|
+
const prehide = platform !== "android" && options.source !== "html" && options.ionic?.auto !== false ? prehideVerticalBarsToolbarSources(document, () => options.verticalBars?.enabled !== false, options.root, options) : void 0;
|
|
183
|
+
const fallback = (reason) => {
|
|
184
|
+
diagnose(`web-fallback: ${reason}`);
|
|
185
|
+
return manage(webProjection(document, options), {
|
|
186
|
+
reason,
|
|
187
|
+
suspend: () => prehide?.suspend(),
|
|
188
|
+
destroy: () => {
|
|
189
|
+
retired = true;
|
|
190
|
+
document.defaultView?.removeEventListener("pagehide", pagehide);
|
|
191
|
+
prehide?.stop();
|
|
192
|
+
stopModals();
|
|
193
|
+
},
|
|
194
|
+
stopping: stop
|
|
195
|
+
});
|
|
196
|
+
};
|
|
197
|
+
if (platform !== "ios" && platform !== "android") return fallback("Requires Capacitor iOS or Android");
|
|
198
|
+
if (!Capacitor.isPluginAvailable("NativeUI")) return fallback("Native UI plugin is not registered");
|
|
199
|
+
let runtime;
|
|
200
|
+
let overlays;
|
|
201
|
+
let metricsListener;
|
|
202
|
+
let nativeRelease;
|
|
203
|
+
releaseNative = () => nativeRelease ?? (nativeRelease = (async () => {
|
|
204
|
+
try {
|
|
205
|
+
await overlays?.destroy();
|
|
206
|
+
} finally {
|
|
207
|
+
if (metricsListener) await bounded(metricsListener.remove()).catch(() => {});
|
|
208
|
+
}
|
|
209
|
+
})());
|
|
210
|
+
const cleanup = async () => {
|
|
211
|
+
retired = true;
|
|
212
|
+
try {
|
|
213
|
+
await releaseNative();
|
|
214
|
+
} finally {
|
|
215
|
+
document.defaultView?.removeEventListener("pagehide", pagehide);
|
|
216
|
+
prehide?.stop();
|
|
217
|
+
stopModals();
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
try {
|
|
221
|
+
const ordinaryControls = [
|
|
222
|
+
"button",
|
|
223
|
+
"backButton",
|
|
224
|
+
"tabs",
|
|
225
|
+
"segment",
|
|
226
|
+
"fab"
|
|
227
|
+
].some((kind) => controlDefault(options, kind, false));
|
|
228
|
+
const capabilities = await bounded(plugin.configure({ suppressScrollEdgeEffect: ordinaryControls }));
|
|
229
|
+
if (!capabilities.supported) return fallback("Native UI is unavailable on this device");
|
|
230
|
+
const unavailableExtensions = /* @__PURE__ */ new Map();
|
|
231
|
+
for (const extension of extensions) if (platform === "android" && extension.placement === "tab-accessory") unavailableExtensions.set(extension.name, "unsupported-placement: tab-accessory requires a supported iOS tab host.");
|
|
232
|
+
else if (!capabilities.extensions?.includes(extension.name)) unavailableExtensions.set(extension.name, "unregistered-extension: register this name in the native app before enabling the shell, then rebuild.");
|
|
233
|
+
if (platform === "android") {
|
|
234
|
+
runtime = await createRuntime(document, plugin, {
|
|
235
|
+
...options,
|
|
236
|
+
source: "extensions",
|
|
237
|
+
extensions,
|
|
238
|
+
unavailableExtensions
|
|
239
|
+
}, () => false, runtimeStopped);
|
|
240
|
+
runtime = combine(runtime, webProjection(document, options));
|
|
241
|
+
metricsListener = await boundedListener(plugin.addListener("webViewMetricsChange", () => {
|
|
242
|
+
document.defaultView?.dispatchEvent(new Event("nativeUIRefresh"));
|
|
243
|
+
}));
|
|
244
|
+
return manage(runtime, {
|
|
245
|
+
stopping: stop,
|
|
246
|
+
destroy: cleanup
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
let deviceEdge = null;
|
|
250
|
+
const ionicRoot = () => {
|
|
251
|
+
if (options.source === "html") return null;
|
|
252
|
+
const root = options.root ?? document.body;
|
|
253
|
+
return root.closest("ion-app") ?? root.querySelector("ion-app");
|
|
254
|
+
};
|
|
255
|
+
const updateNativeEdge = () => {
|
|
256
|
+
const requested = options.verticalBars?.placement?.edge;
|
|
257
|
+
const root = ionicRoot() ?? options.root ?? document.body;
|
|
258
|
+
nativeState.edge = deviceEdge && (!requested || requested === deviceEdge) ? physicalVerticalBarEdge(deviceEdge, elementRtl(root)) : void 0;
|
|
259
|
+
};
|
|
260
|
+
const nativeVerticalBars = () => {
|
|
261
|
+
updateNativeEdge();
|
|
262
|
+
if (options.verticalBars?.enabled === false) return false;
|
|
263
|
+
const app = ionicRoot();
|
|
264
|
+
if (!app?.classList.contains("ios-theme-vertical-bars")) return !!nativeState.edge;
|
|
265
|
+
return (app.classList.contains("ios-theme-vertical-bars-left") ? "left" : "right") === nativeState.edge;
|
|
266
|
+
};
|
|
267
|
+
const applyMetrics = (metrics) => {
|
|
268
|
+
if (ordinaryControls) nativeWebViewMetrics.radius = metrics.radius;
|
|
269
|
+
deviceEdge = metrics.verticalBarEdge ?? null;
|
|
270
|
+
updateNativeEdge();
|
|
271
|
+
document.defaultView?.dispatchEvent(new Event("nativeUIRefresh"));
|
|
272
|
+
};
|
|
273
|
+
metricsListener = await boundedListener(plugin.addListener("webViewMetricsChange", applyMetrics));
|
|
274
|
+
await bounded(Promise.resolve().then(() => plugin.getWebViewMetrics())).then(applyMetrics).catch(() => void 0);
|
|
275
|
+
const native = await createRuntime(document, plugin, {
|
|
276
|
+
...options,
|
|
277
|
+
extensions,
|
|
278
|
+
unavailableExtensions
|
|
279
|
+
}, nativeVerticalBars, runtimeStopped);
|
|
280
|
+
runtime = combine(native, webProjection(document, options, () => !nativeVerticalBars() || native.getStatus().projected === 0));
|
|
281
|
+
if (options.ionic?.verticalBars?.popover === true && overlayFactory) overlays = await overlayFactory(document, plugin, options, native.retain, nativeVerticalBars);
|
|
282
|
+
return manage(runtime, {
|
|
283
|
+
suspend: async () => {
|
|
284
|
+
const restorePrehide = prehide?.suspend();
|
|
285
|
+
const resumeOverlays = await overlays?.suspend();
|
|
286
|
+
return () => {
|
|
287
|
+
restorePrehide?.();
|
|
288
|
+
resumeOverlays?.();
|
|
289
|
+
};
|
|
290
|
+
},
|
|
291
|
+
stopping: stop,
|
|
292
|
+
destroy: cleanup
|
|
293
|
+
});
|
|
294
|
+
} catch (error) {
|
|
295
|
+
await overlays?.destroy().catch(() => {});
|
|
296
|
+
await runtime?.destroy().catch(() => {});
|
|
297
|
+
if (metricsListener) await bounded(metricsListener.remove()).catch(() => {});
|
|
298
|
+
return fallback(error instanceof Error ? error.message : String(error));
|
|
299
|
+
}
|
|
300
|
+
})();
|
|
301
|
+
};
|
|
302
|
+
//#endregion
|
|
303
|
+
export { NativeUI, configureNativeTransition, defineNativeUI, enableNativeUI };
|
|
304
|
+
|
|
305
|
+
//# sourceMappingURL=activation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activation.js","names":[],"sources":["../../src/native/activation.ts"],"sourcesContent":["import { controlDefault } from './shared/control-options';\nimport { toolbarOptions } from './shared/toolbar-options';\nimport { createDiagnostics } from './shared/diagnostics';\nimport { createHTMLWebProjection } from './html';\nimport { validateExtensions, type NativeUIExtension } from './extensions';\nimport { Capacitor, registerPlugin } from '@capacitor/core';\nimport { nativeWebViewMetrics } from '../native-integration';\nimport type { NativeUIRuntimeHandle, NativeUIRuntimeOptions, NativeUIPlugin, VerticalBarEdge, WebViewMetrics } from './definitions';\nimport { createRuntime } from './runtime';\nimport { bounded, boundedListener } from './shared/bridge';\ninterface OverlayController {\n suspend(): Promise<() => void>;\n destroy(): Promise<void>;\n}\ntype OverlayFactory = (\n doc: Document,\n plugin: NativeUIPlugin,\n options: NativeUIRuntimeOptions,\n retain: (deferActivation?: (id: string) => boolean) => () => void,\n nativeRail: () => boolean,\n) => Promise<OverlayController>;\nimport { createVerticalBarsWebProjection } from './vertical-bars-web';\nimport { prehideVerticalBarsToolbarSources } from './prehide';\nimport { observeVerticalBarsModals } from './shared/modal';\nexport { defineNativeUI } from './extensions';\nexport type { NativeUIExtension, NativeUIValue } from './extensions';\nexport type {\n NativeUIComponent,\n NativeUIControls,\n NativeUIRuntimeHandle,\n NativeUIRuntimeOptions,\n NativeUIStatus,\n NativeUISuspension,\n VerticalBarEdge,\n WebViewMetrics,\n} from './definitions';\n\nconst plugin = registerPlugin<NativeUIPlugin>('NativeUI');\nexport const NativeUI = plugin;\nlet active: Promise<NativeUIRuntimeHandle> | undefined;\nlet activeFailed = false;\nlet activeRoot: HTMLElement | undefined;\nlet activeRailHost: HTMLElement | undefined;\nlet activeConfiguration: string | undefined;\nlet activeExtensions: readonly NativeUIExtension[] = [];\nlet stopping: Promise<void> | undefined;\n\n// Every stop entry point releases the activation immediately but reserves the\n// shared native/DOM resources until its teardown has settled.\nconst stopActivation = (owner: Promise<NativeUIRuntimeHandle>, destruction: Promise<void>) => {\n if (active !== owner) return;\n active = undefined;\n activeFailed = false;\n activeConfiguration = undefined;\n activeRoot = undefined;\n activeRailHost = undefined;\n activeExtensions = [];\n stopping = destruction;\n const release = () => {\n if (stopping === destruction) stopping = undefined;\n };\n void destruction.then(release, release);\n};\nconst web = (reason: string): NativeUIRuntimeHandle => ({\n markForCheck: () => {},\n getStatus: () => ({ state: 'web', projected: 0, updates: 0, reason }),\n suspend: async () => ({ resume: async () => {} }),\n destroy: async () => {},\n});\n\nconst combine = (native: NativeUIRuntimeHandle, fallback: NativeUIRuntimeHandle): NativeUIRuntimeHandle => ({\n markForCheck() {\n native.markForCheck();\n fallback.markForCheck();\n },\n getStatus() {\n const nativeStatus = native.getStatus();\n const fallbackStatus = fallback.getStatus();\n return {\n ...nativeStatus,\n state:\n nativeStatus.state === 'stopped' && fallbackStatus.state === 'stopped' ? 'stopped' : nativeStatus.projected > 0 ? 'native' : 'web',\n projected: nativeStatus.projected + fallbackStatus.projected,\n updates: nativeStatus.updates + fallbackStatus.updates,\n };\n },\n async suspend() {\n const [nativeLease, fallbackLease] = await Promise.all([native.suspend(), fallback.suspend()]);\n return { resume: async () => void (await Promise.all([nativeLease.resume(), fallbackLease.resume()])) };\n },\n async destroy() {\n await Promise.all([native.destroy(), fallback.destroy()]);\n },\n});\n\n/** Wraps a runtime handle with the shared enable-lifecycle: reason, suspend hooks and idempotent destroy. */\nconst manage = (\n handle: NativeUIRuntimeHandle,\n lifecycle: {\n reason?: string;\n suspend?: () => (() => void) | undefined | Promise<(() => void) | undefined>;\n /** Registers teardown before it starts so direct destroy and disable share the same queue. */\n stopping?: (destruction: Promise<void>) => void;\n destroy?: () => void | Promise<void>;\n } = {},\n): NativeUIRuntimeHandle => {\n let destruction: Promise<void> | undefined;\n return {\n markForCheck: () => {\n if (!destruction) handle.markForCheck();\n },\n getStatus: () => (lifecycle.reason ? { ...handle.getStatus(), reason: lifecycle.reason } : handle.getStatus()),\n async suspend() {\n const lease = await handle.suspend();\n const resume = await lifecycle.suspend?.();\n return {\n async resume() {\n await lease.resume();\n resume?.();\n },\n };\n },\n destroy() {\n if (!destruction) {\n destruction = Promise.resolve().then(async () => {\n try {\n await handle.destroy();\n } finally {\n await lifecycle.destroy?.();\n }\n });\n lifecycle.stopping?.(destruction);\n }\n return destruction;\n },\n };\n};\n\n/** Reads the current native WebView geometry and applies it to page transitions. */\nexport const configureNativeTransition = async (): Promise<WebViewMetrics> => {\n const metrics =\n typeof document !== 'undefined' && Capacitor.getPlatform() === 'ios' && Capacitor.isPluginAvailable('NativeUI')\n ? await bounded(plugin.getWebViewMetrics())\n : { radius: 0 };\n nativeWebViewMetrics.radius = metrics.radius;\n return metrics;\n};\n\n/** Resolves a logical vertical-bar edge to the physical side for the given direction. */\nconst physicalVerticalBarEdge = (edge: Exclude<VerticalBarEdge, null>, rtl: boolean): 'left' | 'right' =>\n (edge === 'leading') !== rtl ? 'left' : 'right';\n\nconst elementRtl = (element: Element): boolean => element.closest('[dir]')?.getAttribute('dir') === 'rtl';\n\nconst webProjection = (doc: Document, options: NativeUIRuntimeOptions, enabled: () => boolean = () => true) => {\n const ionic = () => createVerticalBarsWebProjection(doc, options, () => options.verticalBars?.enabled !== false && enabled());\n if (options.source === 'html') return createHTMLWebProjection(doc, options);\n if (options.source === 'auto') return combine(ionic(), createHTMLWebProjection(doc, options));\n return ionic();\n};\n\n/** Call once at application startup. Ionic markup remains the source of truth. */\nexport const enableNativeUI = (options: NativeUIRuntimeOptions = {}, overlayFactory?: OverlayFactory): Promise<NativeUIRuntimeHandle> => {\n if (typeof document === 'undefined') return Promise.resolve(web('Requires a document'));\n const extensions = [...(options.extensions ?? [])];\n const nativeState: NonNullable<NativeUIRuntimeOptions['nativeState']> = (options.nativeState = {});\n try {\n validateExtensions(extensions, document);\n } catch (error) {\n return Promise.reject(error);\n }\n const configuration = JSON.stringify([\n options.source ?? 'ionic',\n options.debug === true,\n options.ionic?.auto !== false,\n options.verticalBars?.enabled !== false,\n options.verticalBars?.placement?.edge,\n options.rail?.edge,\n toolbarOptions(options, false),\n toolbarOptions(options, true),\n options.ionic?.verticalBars?.buttonProjection ?? 'system',\n // Local source overrides can use this even when the startup projection is system.\n options.ionic?.verticalBars?.buttonDefaultFill ?? 'glass',\n ...(['tabs', 'segment', 'fab'] as const).flatMap((kind) => [controlDefault(options, kind, false), controlDefault(options, kind, true)]),\n options.ionic?.verticalBars?.popover === true,\n ]);\n if (active && activeFailed) {\n const previous = active;\n stopActivation(\n previous,\n previous.then((handle) => handle.destroy()),\n );\n }\n if (\n active &&\n (activeConfiguration !== configuration ||\n activeRoot !== options.root ||\n activeRailHost !== options.rail?.host ||\n extensions.length !== activeExtensions.length ||\n extensions.some((extension, index) => extension !== activeExtensions[index]))\n )\n return Promise.reject(\n new Error('Native UI is already running with different controls or extensions; destroy it before changing configuration.'),\n );\n if (active) return active;\n activeConfiguration = configuration;\n activeRoot = options.root;\n activeRailHost = options.rail?.host;\n activeExtensions = extensions;\n const previousStop = stopping;\n let start: Promise<NativeUIRuntimeHandle>;\n const stop = (destruction: Promise<void>) => stopActivation(start, destruction);\n let releaseNative = async () => {};\n let retired = false;\n const pagehide = () => runtimeStopped('pagehide');\n const runtimeStopped = (cause: 'failure' | 'pagehide') => {\n if (cause === 'failure') {\n // Keep the Web rail usable, but replace this degraded activation on the next enable.\n if (active === start) activeFailed = true;\n void start\n .then(async () => {\n if (!retired) document.defaultView?.addEventListener('pagehide', pagehide, { once: true });\n await releaseNative();\n })\n .catch(() => {});\n return;\n }\n const destruction = start.then((handle) => handle.destroy());\n stop(destruction);\n void destruction.catch(() => {});\n };\n return (start = active =\n (async () => {\n // Native controls and DOM ownership are shared. A replacement activation\n // must wait until the old handle has finished clearing both surfaces.\n if (previousStop) await previousStop.catch(() => {});\n const platform = Capacitor.getPlatform();\n const diagnose = createDiagnostics(options.debug);\n const stopModals = options.source === 'html' ? () => {} : observeVerticalBarsModals(document);\n const prehide =\n platform !== 'android' && options.source !== 'html' && options.ionic?.auto !== false\n ? prehideVerticalBarsToolbarSources(document, () => options.verticalBars?.enabled !== false, options.root, options)\n : undefined;\n const fallback = (reason: string) => {\n diagnose(`web-fallback: ${reason}`);\n return manage(webProjection(document, options), {\n reason,\n suspend: () => prehide?.suspend(),\n destroy: () => {\n retired = true;\n document.defaultView?.removeEventListener('pagehide', pagehide);\n prehide?.stop();\n stopModals();\n },\n stopping: stop,\n });\n };\n if (platform !== 'ios' && platform !== 'android') return fallback('Requires Capacitor iOS or Android');\n if (!Capacitor.isPluginAvailable('NativeUI')) return fallback('Native UI plugin is not registered');\n let runtime: NativeUIRuntimeHandle | undefined;\n let overlays: OverlayController | undefined;\n let metricsListener: Awaited<ReturnType<typeof plugin.addListener>> | undefined;\n let nativeRelease: Promise<void> | undefined;\n releaseNative = () =>\n (nativeRelease ??= (async () => {\n try {\n await overlays?.destroy();\n } finally {\n if (metricsListener) await bounded(metricsListener.remove()).catch(() => {});\n }\n })());\n const cleanup = async () => {\n retired = true;\n try {\n await releaseNative();\n } finally {\n document.defaultView?.removeEventListener('pagehide', pagehide);\n prehide?.stop();\n stopModals();\n }\n };\n try {\n const ordinaryControls = (['button', 'backButton', 'tabs', 'segment', 'fab'] as const).some((kind) =>\n controlDefault(options, kind, false),\n );\n const capabilities = await bounded(plugin.configure({ suppressScrollEdgeEffect: ordinaryControls }));\n if (!capabilities.supported) return fallback('Native UI is unavailable on this device');\n const unavailableExtensions = new Map<string, string>();\n for (const extension of extensions) {\n if (platform === 'android' && extension.placement === 'tab-accessory')\n unavailableExtensions.set(extension.name, 'unsupported-placement: tab-accessory requires a supported iOS tab host.');\n else if (!capabilities.extensions?.includes(extension.name))\n unavailableExtensions.set(\n extension.name,\n 'unregistered-extension: register this name in the native app before enabling the shell, then rebuild.',\n );\n }\n if (platform === 'android') {\n runtime = await createRuntime(\n document,\n plugin,\n {\n ...options,\n source: 'extensions',\n extensions,\n unavailableExtensions,\n },\n () => false,\n runtimeStopped,\n );\n runtime = combine(runtime, webProjection(document, options));\n metricsListener = await boundedListener(\n plugin.addListener('webViewMetricsChange', () => {\n document.defaultView?.dispatchEvent(new Event('nativeUIRefresh'));\n }),\n );\n return manage(runtime, {\n stopping: stop,\n destroy: cleanup,\n });\n }\n let deviceEdge: VerticalBarEdge = null;\n const ionicRoot = () => {\n if (options.source === 'html') return null;\n const root = options.root ?? document.body;\n return root.closest<HTMLElement>('ion-app') ?? root.querySelector<HTMLElement>('ion-app');\n };\n const updateNativeEdge = () => {\n const requested = options.verticalBars?.placement?.edge;\n const root = ionicRoot() ?? options.root ?? document.body;\n nativeState.edge =\n deviceEdge && (!requested || requested === deviceEdge) ? physicalVerticalBarEdge(deviceEdge, elementRtl(root)) : undefined;\n };\n // Ionic layout is read-only input; device metrics determine native availability.\n const nativeVerticalBars = () => {\n updateNativeEdge();\n if (options.verticalBars?.enabled === false) return false;\n const app = ionicRoot();\n if (!app?.classList.contains('ios-theme-vertical-bars')) return !!nativeState.edge;\n const physicalEdge = app.classList.contains('ios-theme-vertical-bars-left') ? 'left' : 'right';\n return physicalEdge === nativeState.edge;\n };\n const applyMetrics = (metrics: WebViewMetrics) => {\n if (ordinaryControls) nativeWebViewMetrics.radius = metrics.radius;\n deviceEdge = metrics.verticalBarEdge ?? null;\n updateNativeEdge();\n document.defaultView?.dispatchEvent(new Event('nativeUIRefresh'));\n };\n metricsListener = await boundedListener(plugin.addListener('webViewMetricsChange', applyMetrics));\n await bounded(Promise.resolve().then(() => plugin.getWebViewMetrics()))\n .then(applyMetrics)\n .catch(() => undefined);\n const native = await createRuntime(\n document,\n plugin,\n { ...options, extensions, unavailableExtensions },\n nativeVerticalBars,\n runtimeStopped,\n );\n runtime = combine(\n native,\n webProjection(document, options, () => !nativeVerticalBars() || native.getStatus().projected === 0),\n );\n if (options.ionic?.verticalBars?.popover === true && overlayFactory)\n overlays = await overlayFactory(document, plugin, options, native.retain, nativeVerticalBars);\n return manage(runtime, {\n suspend: async () => {\n const restorePrehide = prehide?.suspend();\n const resumeOverlays = await overlays?.suspend();\n return () => {\n restorePrehide?.();\n resumeOverlays?.();\n };\n },\n stopping: stop,\n destroy: cleanup,\n });\n } catch (error) {\n await overlays?.destroy().catch(() => {});\n await runtime?.destroy().catch(() => {});\n if (metricsListener) await bounded(metricsListener.remove()).catch(() => {});\n return fallback(error instanceof Error ? error.message : String(error));\n }\n })());\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Candidate, Identify } from "../shared/candidate.js";
|
|
2
|
+
import { VerticalControlAreaOptions } from "../definitions.js";
|
|
3
|
+
import { ion_button_d_exports } from "./ion-button.js";
|
|
4
|
+
import { ion_buttons_d_exports } from "./ion-buttons.js";
|
|
5
|
+
import { ion_back_button_d_exports } from "./ion-back-button.js";
|
|
6
|
+
import { ion_menu_button_d_exports } from "./ion-menu-button.js";
|
|
7
|
+
import { ion_tab_bar_d_exports } from "./ion-tab-bar.js";
|
|
8
|
+
import { ion_segment_d_exports } from "./ion-segment.js";
|
|
9
|
+
import { ion_fab_d_exports } from "./ion-fab.js";
|
|
10
|
+
//#region src/native/components/index.d.ts
|
|
11
|
+
export declare const components: readonly [typeof ion_button_d_exports, typeof ion_buttons_d_exports, typeof ion_back_button_d_exports, typeof ion_menu_button_d_exports, typeof ion_tab_bar_d_exports, typeof ion_segment_d_exports, typeof ion_fab_d_exports];
|
|
12
|
+
export type NativeUIComponent = (typeof components)[number]['tag'];
|
|
13
|
+
export declare const selector: string;
|
|
14
|
+
export declare const shadowSelector: string;
|
|
15
|
+
export declare const motionSelector: string;
|
|
16
|
+
export declare const isVerticalBarsCandidate: (element: HTMLElement) => boolean;
|
|
17
|
+
export declare const readCandidate: (element: HTMLElement, id: Identify, options?: VerticalControlAreaOptions) => Candidate | undefined;
|
|
18
|
+
//#endregion
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["button","buttons","backButton","menuButton","tabBar","segment","fab"],"sources":["../../../src/native/components/index.ts"],"mappings":";;;;;;;;;;qBAYa,6BAAUA,6BAAAC,8BAAAC,kCAAAC,kCAAAC,8BAAAC,8BAAAC;YACX,4BAA4B;qBAC3B;qBAIA;qBAIA;qBAQA,0BAAuB,SAAA;qBAEvB,gBAAiB,SAAS,aAAa,IAAI,UAAU,UAAS,+BAAkC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { isVerticalBarsSource, visible, withoutPrehide } from "../shared/dom.js";
|
|
2
|
+
import { ion_button_exports } from "./ion-button.js";
|
|
3
|
+
import { ion_menu_button_exports } from "./ion-menu-button.js";
|
|
4
|
+
import { ion_buttons_exports } from "./ion-buttons.js";
|
|
5
|
+
import { ion_back_button_exports } from "./ion-back-button.js";
|
|
6
|
+
import { ion_tab_bar_exports } from "./ion-tab-bar.js";
|
|
7
|
+
import { ion_segment_exports } from "./ion-segment.js";
|
|
8
|
+
import { ion_fab_exports } from "./ion-fab.js";
|
|
9
|
+
//#region src/native/components/index.ts
|
|
10
|
+
const components = [
|
|
11
|
+
ion_button_exports,
|
|
12
|
+
ion_buttons_exports,
|
|
13
|
+
ion_back_button_exports,
|
|
14
|
+
ion_menu_button_exports,
|
|
15
|
+
ion_tab_bar_exports,
|
|
16
|
+
ion_segment_exports,
|
|
17
|
+
ion_fab_exports
|
|
18
|
+
];
|
|
19
|
+
const selector = components.map((component) => "selector" in component ? component.selector : component.tag).filter(Boolean).join(", ");
|
|
20
|
+
const shadowSelector = ["ion-icon", ...components.flatMap((component) => "shadowSelector" in component ? [component.shadowSelector] : [])].join(", ");
|
|
21
|
+
const motionSelector = [
|
|
22
|
+
".ion-page",
|
|
23
|
+
"ion-header",
|
|
24
|
+
"ion-footer",
|
|
25
|
+
"ion-toolbar",
|
|
26
|
+
...components.filter((component) => "tracksMotion" in component && component.tracksMotion).map((component) => component.tag)
|
|
27
|
+
].join(", ");
|
|
28
|
+
const isVerticalBarsCandidate = isVerticalBarsSource;
|
|
29
|
+
const readCandidate = (element, id, options = {}) => {
|
|
30
|
+
const verticalBars = isVerticalBarsCandidate(element);
|
|
31
|
+
if (!element.classList.contains("ios") && !verticalBars || !visible(element, verticalBars) || element.closest("ion-popover") || element.closest("ion-modal") && !verticalBars) return;
|
|
32
|
+
if (element.contains(element.ownerDocument.activeElement)) return;
|
|
33
|
+
return withoutPrehide(element, () => components.find((component) => component.tag === element.localName)?.read(element, id, options));
|
|
34
|
+
};
|
|
35
|
+
//#endregion
|
|
36
|
+
export { components, isVerticalBarsCandidate, motionSelector, readCandidate, selector, shadowSelector };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["button","buttons","backButton","menuButton","tabBar","segment","fab"],"sources":["../../../src/native/components/index.ts"],"sourcesContent":["import type { VerticalControlAreaOptions } from '../definitions';\nimport * as button from './ion-button';\nimport * as buttons from './ion-buttons';\nimport * as backButton from './ion-back-button';\nimport * as menuButton from './ion-menu-button';\nimport * as tabBar from './ion-tab-bar';\nimport * as segment from './ion-segment';\nimport * as fab from './ion-fab';\nimport { isVerticalBarsSource, visible, withoutPrehide } from '../shared/dom';\nimport type { Candidate, Identify } from '../shared/candidate';\n\n// Static composition only. Each component declares its own tag, discovery and reader.\nexport const components = [button, buttons, backButton, menuButton, tabBar, segment, fab] as const;\nexport type NativeUIComponent = (typeof components)[number]['tag'];\nexport const selector = components\n .map((component) => ('selector' in component ? component.selector : component.tag))\n .filter(Boolean)\n .join(', ');\nexport const shadowSelector = [\n 'ion-icon',\n ...components.flatMap((component) => ('shadowSelector' in component ? [component.shadowSelector] : [])),\n].join(', ');\nexport const motionSelector = [\n '.ion-page',\n 'ion-header',\n 'ion-footer',\n 'ion-toolbar',\n ...components.filter((component) => 'tracksMotion' in component && component.tracksMotion).map((component) => component.tag),\n].join(', ');\n\nexport const isVerticalBarsCandidate = isVerticalBarsSource;\n\nexport const readCandidate = (element: HTMLElement, id: Identify, options: VerticalControlAreaOptions = {}): Candidate | undefined => {\n const verticalBars = isVerticalBarsCandidate(element);\n if (\n (!element.classList.contains('ios') && !verticalBars) ||\n !visible(element, verticalBars) ||\n element.closest('ion-popover') ||\n (element.closest('ion-modal') && !verticalBars)\n )\n return;\n if (element.contains(element.ownerDocument.activeElement)) return;\n // Read icon and control geometry before restoring prehide, which can collapse the toolbar.\n return withoutPrehide(element, () => components.find((component) => component.tag === element.localName)?.read(element, id, options));\n};\n"],"mappings":";;;;;;;;;AAYA,MAAa,aAAa;CAACA;CAAQC;CAASC;CAAYC;CAAYC;CAAQC;CAASC;AAAG;AAExF,MAAa,WAAW,WACrB,KAAK,cAAe,cAAc,YAAY,UAAU,WAAW,UAAU,GAAI,CAAC,CAClF,OAAO,OAAO,CAAC,CACf,KAAK,IAAI;AACZ,MAAa,iBAAiB,CAC5B,YACA,GAAG,WAAW,SAAS,cAAe,oBAAoB,YAAY,CAAC,UAAU,cAAc,IAAI,CAAC,CAAE,CACxG,CAAC,CAAC,KAAK,IAAI;AACX,MAAa,iBAAiB;CAC5B;CACA;CACA;CACA;CACA,GAAG,WAAW,QAAQ,cAAc,kBAAkB,aAAa,UAAU,YAAY,CAAC,CAAC,KAAK,cAAc,UAAU,GAAG;AAC7H,CAAC,CAAC,KAAK,IAAI;AAEX,MAAa,0BAA0B;AAEvC,MAAa,iBAAiB,SAAsB,IAAc,UAAsC,CAAC,MAA6B;CACpI,MAAM,eAAe,wBAAwB,OAAO;CACpD,IACG,CAAC,QAAQ,UAAU,SAAS,KAAK,KAAK,CAAC,gBACxC,CAAC,QAAQ,SAAS,YAAY,KAC9B,QAAQ,QAAQ,aAAa,KAC5B,QAAQ,QAAQ,WAAW,KAAK,CAAC,cAElC;CACF,IAAI,QAAQ,SAAS,QAAQ,cAAc,aAAa,GAAG;CAE3D,OAAO,eAAe,eAAe,WAAW,MAAM,cAAc,UAAU,QAAQ,QAAQ,SAAS,CAAC,EAAE,KAAK,SAAS,IAAI,OAAO,CAAC;AACtI"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Candidate, Identify } from "../shared/candidate.js";
|
|
2
|
+
import { VerticalControlAreaOptions } from "../definitions.js";
|
|
3
|
+
declare namespace ion_back_button_d_exports {
|
|
4
|
+
export { read, tag };
|
|
5
|
+
}
|
|
6
|
+
export declare const tag = "ion-back-button";
|
|
7
|
+
export declare const read: (element: HTMLElement, id: Identify, options?: VerticalControlAreaOptions) => Candidate | undefined;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { ion_back_button_d_exports };
|
|
10
|
+
//# sourceMappingURL=ion-back-button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ion-back-button.d.ts","names":[],"sources":["../../../src/native/components/ion-back-button.ts"],"mappings":";;;;;qBAMa;qBAEA,OAAQ,SAAS,aAAa,IAAI,UAAU,UAAS,+BAAkC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { __exportAll } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { inFixedToolbar, isVerticalBarsSource } from "../shared/dom.js";
|
|
3
|
+
import { horizontalSelected, inVerticalToolbarLayout } from "../shared/toolbar-options.js";
|
|
4
|
+
import { appendItem, createCandidate } from "../shared/candidate.js";
|
|
5
|
+
//#region src/native/components/ion-back-button.ts
|
|
6
|
+
var ion_back_button_exports = /* @__PURE__ */ __exportAll({
|
|
7
|
+
read: () => read,
|
|
8
|
+
tag: () => tag
|
|
9
|
+
});
|
|
10
|
+
const tag = "ion-back-button";
|
|
11
|
+
const read = (element, id, options = {}) => {
|
|
12
|
+
const button = element;
|
|
13
|
+
if ((inVerticalToolbarLayout(element) ? !isVerticalBarsSource(element) : !horizontalSelected(element, options)) || !button.shadowRoot || button.icon !== void 0 || button.color !== void 0 || !isVerticalBarsSource(element) && !inFixedToolbar(element)) return;
|
|
14
|
+
const candidate = createCandidate(element, tag, id);
|
|
15
|
+
const label = button.shadowRoot.querySelector("[part=\"text\"]")?.textContent?.trim() ?? "";
|
|
16
|
+
return appendItem(candidate, element, id, button.shadowRoot, label) ? candidate : void 0;
|
|
17
|
+
};
|
|
18
|
+
//#endregion
|
|
19
|
+
export { ion_back_button_exports, read, tag };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=ion-back-button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ion-back-button.js","names":[],"sources":["../../../src/native/components/ion-back-button.ts"],"sourcesContent":["import type { VerticalControlAreaOptions } from '../definitions';\nimport { horizontalSelected, inVerticalToolbarLayout } from '../shared/toolbar-options';\nimport { createCandidate, appendItem } from '../shared/candidate';\nimport type { Candidate, Identify } from '../shared/candidate';\nimport { inFixedToolbar, isVerticalBarsSource } from '../shared/dom';\n\nexport const tag = 'ion-back-button';\n\nexport const read = (element: HTMLElement, id: Identify, options: VerticalControlAreaOptions = {}): Candidate | undefined => {\n const button = element as HTMLIonBackButtonElement;\n if (\n (inVerticalToolbarLayout(element) ? !isVerticalBarsSource(element) : !horizontalSelected(element, options)) ||\n !button.shadowRoot ||\n button.icon !== undefined ||\n button.color !== undefined ||\n (!isVerticalBarsSource(element) && !inFixedToolbar(element))\n )\n return;\n const candidate = createCandidate(element, tag, id);\n const label = button.shadowRoot.querySelector('[part=\"text\"]')?.textContent?.trim() ?? '';\n return appendItem(candidate, element, id, button.shadowRoot, label) ? candidate : undefined;\n};\n"],"mappings":";;;;;;;;;AAMA,MAAa,MAAM;AAEnB,MAAa,QAAQ,SAAsB,IAAc,UAAsC,CAAC,MAA6B;CAC3H,MAAM,SAAS;CACf,KACG,wBAAwB,OAAO,IAAI,CAAC,qBAAqB,OAAO,IAAI,CAAC,mBAAmB,SAAS,OAAO,MACzG,CAAC,OAAO,cACR,OAAO,SAAS,KAAA,KAChB,OAAO,UAAU,KAAA,KAChB,CAAC,qBAAqB,OAAO,KAAK,CAAC,eAAe,OAAO,GAE1D;CACF,MAAM,YAAY,gBAAgB,SAAS,KAAK,EAAE;CAClD,MAAM,QAAQ,OAAO,WAAW,cAAc,iBAAe,CAAC,EAAE,aAAa,KAAK,KAAK;CACvF,OAAO,WAAW,WAAW,SAAS,IAAI,OAAO,YAAY,KAAK,IAAI,YAAY,KAAA;AACpF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Candidate, Identify } from "../shared/candidate.js";
|
|
2
|
+
import { VerticalControlAreaOptions } from "../definitions.js";
|
|
3
|
+
declare namespace ion_button_d_exports {
|
|
4
|
+
export { read, tag };
|
|
5
|
+
}
|
|
6
|
+
export declare const tag = "ion-button";
|
|
7
|
+
export declare const read: (element: HTMLElement, id: Identify, options?: VerticalControlAreaOptions) => Candidate | undefined;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { ion_button_d_exports };
|
|
10
|
+
//# sourceMappingURL=ion-button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ion-button.d.ts","names":[],"sources":["../../../src/native/components/ion-button.ts"],"mappings":";;;;;qBAMa;qBAEA,OAAQ,SAAS,aAAa,IAAI,UAAU,UAAS,+BAAkC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { __exportAll } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { inFixedToolbar, isVerticalBarsToolbarAction, isVerticalBarsToolbarGroup } from "../shared/dom.js";
|
|
3
|
+
import { horizontalSelected, horizontalToolbarGroup, inVerticalToolbarLayout } from "../shared/toolbar-options.js";
|
|
4
|
+
import { appendItem, createCandidate } from "../shared/candidate.js";
|
|
5
|
+
//#region src/native/components/ion-button.ts
|
|
6
|
+
var ion_button_exports = /* @__PURE__ */ __exportAll({
|
|
7
|
+
read: () => read,
|
|
8
|
+
tag: () => tag
|
|
9
|
+
});
|
|
10
|
+
const tag = "ion-button";
|
|
11
|
+
const read = (element, id, options = {}) => {
|
|
12
|
+
const button = element;
|
|
13
|
+
const verticalBars = inVerticalToolbarLayout(element);
|
|
14
|
+
if (verticalBars && element.parentElement && isVerticalBarsToolbarGroup(element.parentElement)) return;
|
|
15
|
+
const fill = button.fill ?? "default";
|
|
16
|
+
const group = element.parentElement?.matches("ion-buttons") ? element.parentElement : void 0;
|
|
17
|
+
if (!verticalBars && (!horizontalSelected(element, options) || group && horizontalToolbarGroup(group, options))) return;
|
|
18
|
+
if (!inFixedToolbar(element) || verticalBars && !isVerticalBarsToolbarAction(element) || !verticalBars && fill !== "default" && !(group && fill === "clear") || !verticalBars && button.classList.contains("ion-color")) return;
|
|
19
|
+
const candidate = createCandidate(element, tag, id, options);
|
|
20
|
+
return appendItem(candidate, element, id) ? candidate : void 0;
|
|
21
|
+
};
|
|
22
|
+
//#endregion
|
|
23
|
+
export { ion_button_exports, read, tag };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=ion-button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ion-button.js","names":[],"sources":["../../../src/native/components/ion-button.ts"],"sourcesContent":["import { horizontalSelected, horizontalToolbarGroup, inVerticalToolbarLayout } from '../shared/toolbar-options';\nimport type { VerticalControlAreaOptions } from '../definitions';\nimport { createCandidate, appendItem } from '../shared/candidate';\nimport type { Candidate, Identify } from '../shared/candidate';\nimport { inFixedToolbar, isVerticalBarsToolbarAction, isVerticalBarsToolbarGroup } from '../shared/dom';\n\nexport const tag = 'ion-button';\n\nexport const read = (element: HTMLElement, id: Identify, options: VerticalControlAreaOptions = {}): Candidate | undefined => {\n const button = element as HTMLIonButtonElement;\n const verticalBars = inVerticalToolbarLayout(element);\n if (verticalBars && element.parentElement && isVerticalBarsToolbarGroup(element.parentElement)) return;\n const fill = button.fill ?? 'default';\n const group = element.parentElement?.matches('ion-buttons') ? element.parentElement : undefined;\n if (!verticalBars && (!horizontalSelected(element, options) || (group && horizontalToolbarGroup(group, options)))) return;\n if (\n !inFixedToolbar(element) ||\n (verticalBars && !isVerticalBarsToolbarAction(element)) ||\n (!verticalBars && fill !== 'default' && !(group && fill === 'clear')) ||\n (!verticalBars && button.classList.contains('ion-color'))\n )\n return;\n const candidate = createCandidate(element, tag, id, options);\n return appendItem(candidate, element, id) ? candidate : undefined;\n};\n"],"mappings":";;;;;;;;;AAMA,MAAa,MAAM;AAEnB,MAAa,QAAQ,SAAsB,IAAc,UAAsC,CAAC,MAA6B;CAC3H,MAAM,SAAS;CACf,MAAM,eAAe,wBAAwB,OAAO;CACpD,IAAI,gBAAgB,QAAQ,iBAAiB,2BAA2B,QAAQ,aAAa,GAAG;CAChG,MAAM,OAAO,OAAO,QAAQ;CAC5B,MAAM,QAAQ,QAAQ,eAAe,QAAQ,aAAa,IAAI,QAAQ,gBAAgB,KAAA;CACtF,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,SAAS,OAAO,KAAM,SAAS,uBAAuB,OAAO,OAAO,IAAK;CACnH,IACE,CAAC,eAAe,OAAO,KACtB,gBAAgB,CAAC,4BAA4B,OAAO,KACpD,CAAC,gBAAgB,SAAS,aAAa,EAAE,SAAS,SAAS,YAC3D,CAAC,gBAAgB,OAAO,UAAU,SAAS,WAAW,GAEvD;CACF,MAAM,YAAY,gBAAgB,SAAS,KAAK,IAAI,OAAO;CAC3D,OAAO,WAAW,WAAW,SAAS,EAAE,IAAI,YAAY,KAAA;AAC1D"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Candidate, Identify } from "../shared/candidate.js";
|
|
2
|
+
import { VerticalControlAreaOptions } from "../definitions.js";
|
|
3
|
+
declare namespace ion_buttons_d_exports {
|
|
4
|
+
export { read, tag, tracksMotion };
|
|
5
|
+
}
|
|
6
|
+
export declare const tag = "ion-buttons";
|
|
7
|
+
export declare const tracksMotion = true;
|
|
8
|
+
export declare const read: (element: HTMLElement, id: Identify, options?: VerticalControlAreaOptions) => Candidate | undefined;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { ion_buttons_d_exports };
|
|
11
|
+
//# sourceMappingURL=ion-buttons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ion-buttons.d.ts","names":[],"sources":["../../../src/native/components/ion-buttons.ts"],"mappings":";;;;;qBAOa;qBACA;qBAEA,OAAQ,SAAS,aAAa,IAAI,UAAU,UAAS,+BAAkC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { __exportAll } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { childElements, inFixedToolbar, isVerticalBarsToolbarGroup, verticalBarsToolbarActions } from "../shared/dom.js";
|
|
3
|
+
import { horizontalToolbarGroup, inVerticalToolbarLayout } from "../shared/toolbar-options.js";
|
|
4
|
+
import { appendItem, createCandidate } from "../shared/candidate.js";
|
|
5
|
+
import { append, read as read$1 } from "./ion-menu-button.js";
|
|
6
|
+
//#region src/native/components/ion-buttons.ts
|
|
7
|
+
var ion_buttons_exports = /* @__PURE__ */ __exportAll({
|
|
8
|
+
read: () => read,
|
|
9
|
+
tag: () => tag,
|
|
10
|
+
tracksMotion: () => true
|
|
11
|
+
});
|
|
12
|
+
const tag = "ion-buttons";
|
|
13
|
+
const tracksMotion = true;
|
|
14
|
+
const read = (element, id, options = {}) => {
|
|
15
|
+
if (!inFixedToolbar(element)) return;
|
|
16
|
+
let children = childElements(element);
|
|
17
|
+
const verticalBars = inVerticalToolbarLayout(element);
|
|
18
|
+
if (verticalBars ? !isVerticalBarsToolbarGroup(element) : !horizontalToolbarGroup(element, options)) return;
|
|
19
|
+
if (children.length === 1) return read$1(element, id, options);
|
|
20
|
+
if (verticalBars) children = verticalBarsToolbarActions(element);
|
|
21
|
+
if (!children.length || children.some((child) => !child.matches(`ion-menu-button${verticalBars ? "" : ".ios"}`) && (!child.matches(`ion-button${verticalBars ? "" : ".ios.button-clear"}`) || !verticalBars && child.fill !== "clear"))) return;
|
|
22
|
+
const candidate = createCandidate(element, tag, id, options);
|
|
23
|
+
if (verticalBars && children.length !== childElements(element).length) candidate.sources = children;
|
|
24
|
+
for (const child of children) if (!(child.matches("ion-menu-button") ? append(candidate, child, id) : appendItem(candidate, child, id))) return;
|
|
25
|
+
return candidate;
|
|
26
|
+
};
|
|
27
|
+
//#endregion
|
|
28
|
+
export { ion_buttons_exports, read, tag, tracksMotion };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=ion-buttons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ion-buttons.js","names":["menuButton.read","menuButton.append"],"sources":["../../../src/native/components/ion-buttons.ts"],"sourcesContent":["import { horizontalToolbarGroup, inVerticalToolbarLayout } from '../shared/toolbar-options';\nimport type { VerticalControlAreaOptions } from '../definitions';\nimport { createCandidate, appendItem } from '../shared/candidate';\nimport type { Candidate, Identify } from '../shared/candidate';\nimport { childElements, verticalBarsToolbarActions, inFixedToolbar, isVerticalBarsToolbarGroup } from '../shared/dom';\nimport * as menuButton from './ion-menu-button';\n\nexport const tag = 'ion-buttons';\nexport const tracksMotion = true;\n\nexport const read = (element: HTMLElement, id: Identify, options: VerticalControlAreaOptions = {}): Candidate | undefined => {\n if (!inFixedToolbar(element)) return;\n let children = childElements(element);\n const verticalBars = inVerticalToolbarLayout(element);\n if (verticalBars ? !isVerticalBarsToolbarGroup(element) : !horizontalToolbarGroup(element, options)) return;\n if (children.length === 1) return menuButton.read(element, id, options);\n if (verticalBars) children = verticalBarsToolbarActions(element);\n if (\n !children.length ||\n children.some(\n (child) =>\n !child.matches(`${menuButton.tag}${verticalBars ? '' : '.ios'}`) &&\n (!child.matches(`ion-button${verticalBars ? '' : '.ios.button-clear'}`) ||\n (!verticalBars && (child as HTMLIonButtonElement).fill !== 'clear')),\n )\n )\n return;\n const candidate = createCandidate(element, tag, id, options);\n if (verticalBars && children.length !== childElements(element).length) candidate.sources = children;\n for (const child of children) {\n const supported = child.matches(menuButton.tag)\n ? menuButton.append(candidate, child as HTMLIonMenuButtonElement, id)\n : appendItem(candidate, child, id);\n if (!supported) return;\n }\n return candidate;\n};\n"],"mappings":";;;;;;;;;;;AAOA,MAAa,MAAM;AACnB,MAAa,eAAe;AAE5B,MAAa,QAAQ,SAAsB,IAAc,UAAsC,CAAC,MAA6B;CAC3H,IAAI,CAAC,eAAe,OAAO,GAAG;CAC9B,IAAI,WAAW,cAAc,OAAO;CACpC,MAAM,eAAe,wBAAwB,OAAO;CACpD,IAAI,eAAe,CAAC,2BAA2B,OAAO,IAAI,CAAC,uBAAuB,SAAS,OAAO,GAAG;CACrG,IAAI,SAAS,WAAW,GAAG,OAAOA,OAAgB,SAAS,IAAI,OAAO;CACtE,IAAI,cAAc,WAAW,2BAA2B,OAAO;CAC/D,IACE,CAAC,SAAS,UACV,SAAS,MACN,UACC,CAAC,MAAM,QAAQ,kBAAoB,eAAe,KAAK,QAAQ,MAC9D,CAAC,MAAM,QAAQ,aAAa,eAAe,KAAK,qBAAqB,KACnE,CAAC,gBAAiB,MAA+B,SAAS,QACjE,GAEA;CACF,MAAM,YAAY,gBAAgB,SAAS,KAAK,IAAI,OAAO;CAC3D,IAAI,gBAAgB,SAAS,WAAW,cAAc,OAAO,CAAC,CAAC,QAAQ,UAAU,UAAU;CAC3F,KAAK,MAAM,SAAS,UAIlB,IAAI,EAHc,MAAM,QAAQ,iBAAc,IAC1CC,OAAkB,WAAW,OAAmC,EAAE,IAClE,WAAW,WAAW,OAAO,EAAE,IACnB;CAElB,OAAO;AACT"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Candidate } from "../shared/candidate.js";
|
|
2
|
+
declare namespace ion_fab_d_exports {
|
|
3
|
+
export { read, shadowSelector, tag };
|
|
4
|
+
}
|
|
5
|
+
export declare const tag = "ion-fab";
|
|
6
|
+
export declare const shadowSelector = "ion-fab-button, ion-fab-list";
|
|
7
|
+
export declare const read: (fab: HTMLElement, id: (element: HTMLElement) => string) => Candidate | undefined;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { ion_fab_d_exports };
|
|
10
|
+
//# sourceMappingURL=ion-fab.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ion-fab.d.ts","names":[],"sources":["../../../src/native/components/ion-fab.ts"],"mappings":";;;;qBAKa;qBACA;qBAOA,OAAQ,KAAK,aAAa,KAAK,SAAS,2BAAyB"}
|