@webview-native-ui/engine 1.0.1 → 1.0.2-0
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 +14 -0
- package/WebViewNativeUIControls.podspec +17 -0
- package/dist/controls/activation.d.ts +15 -0
- package/dist/controls/activation.js +370 -0
- package/dist/controls/components/index.d.ts +16 -0
- package/dist/controls/components/index.js +38 -0
- package/dist/controls/components/ion-back-button.d.ts +4 -0
- package/dist/controls/components/ion-back-button.js +16 -0
- package/dist/controls/components/ion-button.d.ts +4 -0
- package/dist/controls/components/ion-button.js +26 -0
- package/dist/controls/components/ion-buttons.d.ts +5 -0
- package/dist/controls/components/ion-buttons.js +34 -0
- package/dist/controls/components/ion-fab.d.ts +4 -0
- package/dist/controls/components/ion-fab.js +164 -0
- package/dist/controls/components/ion-menu-button.d.ts +7 -0
- package/dist/controls/components/ion-menu-button.js +41 -0
- package/dist/controls/components/ion-segment.d.ts +5 -0
- package/dist/controls/components/ion-segment.js +24 -0
- package/dist/controls/components/ion-tab-bar.d.ts +5 -0
- package/dist/controls/components/ion-tab-bar.js +49 -0
- package/dist/controls/components/searchable-tabs.d.ts +20 -0
- package/dist/controls/components/searchable-tabs.js +525 -0
- package/dist/controls/definitions.d.ts +360 -0
- package/dist/controls/definitions.js +1 -0
- package/dist/controls/extensions.d.ts +44 -0
- package/dist/controls/extensions.js +164 -0
- package/dist/controls/foldable/fold-state.d.ts +4 -0
- package/dist/controls/foldable/fold-state.js +8 -0
- package/dist/controls/foldable/types.d.ts +9 -0
- package/dist/controls/foldable/types.js +1 -0
- package/dist/controls/html.d.ts +8 -0
- package/dist/controls/html.js +260 -0
- package/dist/controls/index.d.ts +7 -0
- package/dist/controls/index.js +4 -0
- package/dist/controls/ionic.d.ts +1 -0
- package/dist/controls/ionic.js +1 -0
- package/dist/controls/legacy-layout.d.ts +7 -0
- package/dist/controls/legacy-layout.js +23 -0
- package/dist/controls/overlays/content.d.ts +2 -0
- package/dist/controls/overlays/content.js +55 -0
- package/dist/controls/overlays/controller.d.ts +7 -0
- package/dist/controls/overlays/controller.js +369 -0
- package/dist/controls/overlays/covered-overlay.d.ts +4 -0
- package/dist/controls/overlays/covered-overlay.js +9 -0
- package/dist/controls/overlays/dialog-animation.d.ts +7 -0
- package/dist/controls/overlays/dialog-animation.js +49 -0
- package/dist/controls/overlays/dismiss-animation.d.ts +2 -0
- package/dist/controls/overlays/dismiss-animation.js +14 -0
- package/dist/controls/overlays/focus.d.ts +2 -0
- package/dist/controls/overlays/focus.js +67 -0
- package/dist/controls/overlays/popover.d.ts +10 -0
- package/dist/controls/overlays/popover.js +117 -0
- package/dist/controls/overlays/styles.d.ts +9 -0
- package/dist/controls/overlays/styles.js +194 -0
- package/dist/controls/prehide.d.ts +6 -0
- package/dist/controls/prehide.js +280 -0
- package/dist/controls/runtime.d.ts +5 -0
- package/dist/controls/runtime.js +1685 -0
- package/dist/controls/shared/bridge.d.ts +4 -0
- package/dist/controls/shared/bridge.js +15 -0
- package/dist/controls/shared/candidate.d.ts +23 -0
- package/dist/controls/shared/candidate.js +128 -0
- package/dist/controls/shared/clipping.d.ts +1 -0
- package/dist/controls/shared/clipping.js +1 -0
- package/dist/controls/shared/connection.d.ts +21 -0
- package/dist/controls/shared/connection.js +112 -0
- package/dist/controls/shared/control-options.d.ts +4 -0
- package/dist/controls/shared/control-options.js +14 -0
- package/dist/controls/shared/covered-snapshot.d.ts +35 -0
- package/dist/controls/shared/covered-snapshot.js +41 -0
- package/dist/controls/shared/covered-source.d.ts +22 -0
- package/dist/controls/shared/covered-source.js +72 -0
- package/dist/controls/shared/crossfade.d.ts +11 -0
- package/dist/controls/shared/crossfade.js +71 -0
- package/dist/controls/shared/diagnostics.d.ts +2 -0
- package/dist/controls/shared/diagnostics.js +16 -0
- package/dist/controls/shared/dom.d.ts +45 -0
- package/dist/controls/shared/dom.js +258 -0
- package/dist/controls/shared/events.d.ts +12 -0
- package/dist/controls/shared/events.js +13 -0
- package/dist/controls/shared/horizontal-navigation.d.ts +36 -0
- package/dist/controls/shared/horizontal-navigation.js +90 -0
- package/dist/controls/shared/icons.d.ts +5 -0
- package/dist/controls/shared/icons.js +66 -0
- package/dist/controls/shared/modal-animation.d.ts +21 -0
- package/dist/controls/shared/modal-animation.js +97 -0
- package/dist/controls/shared/modal.d.ts +26 -0
- package/dist/controls/shared/modal.js +261 -0
- package/dist/controls/shared/projection-id.d.ts +2 -0
- package/dist/controls/shared/projection-id.js +2 -0
- package/dist/controls/shared/scroll-placement.d.ts +1 -0
- package/dist/controls/shared/scroll-placement.js +1 -0
- package/dist/controls/shared/tab-bar-width.d.ts +7 -0
- package/dist/controls/shared/tab-bar-width.js +72 -0
- package/dist/controls/shared/toolbar-options.d.ts +10 -0
- package/dist/controls/shared/toolbar-options.js +38 -0
- package/dist/controls/shared/transition-identity.d.ts +3 -0
- package/dist/controls/shared/transition-identity.js +64 -0
- package/dist/controls/shared/vertical-bars-geometry.d.ts +8 -0
- package/dist/controls/shared/vertical-bars-geometry.js +82 -0
- package/dist/controls/shared/vertical-navigation.d.ts +5 -0
- package/dist/controls/shared/vertical-navigation.js +39 -0
- package/dist/controls/startup.d.ts +7 -0
- package/dist/controls/startup.js +72 -0
- package/dist/controls/transport.d.ts +10 -0
- package/dist/controls/transport.js +1 -0
- package/dist/controls/vertical-bars-web-search.d.ts +8 -0
- package/dist/controls/vertical-bars-web-search.js +83 -0
- package/dist/controls/vertical-bars-web.d.ts +2 -0
- package/dist/controls/vertical-bars-web.js +609 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/integration/index.d.ts +36 -0
- package/dist/integration/index.js +25 -0
- package/dist/native/session.js +14 -8
- package/dist/projection/pause.d.ts +10 -0
- package/dist/projection/pause.js +58 -0
- package/dist/projection/styles.d.ts +1 -1
- package/dist/projection/styles.js +0 -1
- package/dist/projection/surfaces.js +2 -1
- package/dist/projection/web.js +39 -5
- package/dist/types.d.ts +5 -1
- package/docs/README.md +1 -0
- package/docs/configuration/README.md +3 -1
- package/docs/configuration/ionic-overlays.md +36 -2
- package/docs/configuration/pause-resume.md +51 -0
- package/docs/controls.md +39 -0
- package/ios/Sources/WebViewNativeUIControls/Components/NativeUIButton.swift +98 -0
- package/ios/Sources/WebViewNativeUIControls/Components/NativeUIButtons.swift +24 -0
- package/ios/Sources/WebViewNativeUIControls/Components/NativeUIComponents.swift +19 -0
- package/ios/Sources/WebViewNativeUIControls/Components/NativeUIFab.swift +80 -0
- package/ios/Sources/WebViewNativeUIControls/Components/NativeUISearchController.swift +449 -0
- package/ios/Sources/WebViewNativeUIControls/Components/NativeUISegment.swift +91 -0
- package/ios/Sources/WebViewNativeUIControls/Components/NativeUITabBar.swift +213 -0
- package/ios/Sources/WebViewNativeUIControls/Components/NativeUIToolbarTransition.swift +186 -0
- package/ios/Sources/WebViewNativeUIControls/Components/NativeUIVerticalBars.swift +696 -0
- package/ios/Sources/WebViewNativeUIControls/Components/NativeUIVerticalSearch.swift +117 -0
- package/ios/Sources/WebViewNativeUIControls/Extensions/NativeUI.swift +180 -0
- package/ios/Sources/WebViewNativeUIControls/Extensions/NativeUIRendering.swift +38 -0
- package/ios/Sources/WebViewNativeUIControls/NativeUIController.swift +801 -0
- package/ios/Sources/WebViewNativeUIControls/Overlays/NativeUIOverlayController.swift +131 -0
- package/ios/Sources/WebViewNativeUIControls/Overlays/NativeUIOverlayHost.swift +85 -0
- package/ios/Sources/WebViewNativeUIControls/Shared/NativeUIControlRendering.swift +21 -0
- package/ios/Sources/WebViewNativeUIControls/Shared/NativeUICoveredSnapshots.swift +14 -0
- package/ios/Sources/WebViewNativeUIControls/Shared/NativeUICrossfade.swift +35 -0
- package/ios/Sources/WebViewNativeUIControls/Shared/NativeUIHost.swift +8 -0
- package/ios/Sources/WebViewNativeUIControls/Shared/NativeUIScrollTracker.swift +2 -0
- package/ios/Sources/WebViewNativeUIControls/Shared/NativeUISnapshot.swift +206 -0
- package/ios/Sources/WebViewNativeUIControls/Shared/NativeUIVerticalBarsGeometry.swift +93 -0
- package/ios/Sources/WebViewNativeUIEngine/CoveredSnapshots.swift +2 -2
- package/ios/Sources/WebViewNativeUIEngine/NativeUIProjection.swift +1 -1
- package/ios/Sources/WebViewNativeUIEngine/Resources/native-ui-engine.js +3 -4
- package/package.json +30 -5
- package/src/controls/activation.ts +427 -0
- package/src/controls/components/index.ts +45 -0
- package/src/controls/components/ion-back-button.ts +22 -0
- package/src/controls/components/ion-button.ts +28 -0
- package/src/controls/components/ion-buttons.ts +37 -0
- package/src/controls/components/ion-fab.ts +151 -0
- package/src/controls/components/ion-menu-button.ts +37 -0
- package/src/controls/components/ion-segment.ts +27 -0
- package/src/controls/components/ion-tab-bar.ts +55 -0
- package/src/controls/components/searchable-tabs.ts +534 -0
- package/src/controls/definitions.ts +338 -0
- package/src/controls/extensions.ts +198 -0
- package/src/controls/foldable/fold-state.ts +10 -0
- package/src/controls/foldable/types.ts +4 -0
- package/src/controls/html.ts +239 -0
- package/src/controls/index.ts +7 -0
- package/src/controls/ionic.ts +1 -0
- package/src/controls/legacy-layout.ts +21 -0
- package/src/controls/overlays/content.ts +51 -0
- package/src/controls/overlays/controller.ts +394 -0
- package/src/controls/overlays/covered-overlay.ts +11 -0
- package/src/controls/overlays/dialog-animation.ts +53 -0
- package/src/controls/overlays/dismiss-animation.ts +15 -0
- package/src/controls/overlays/focus.ts +64 -0
- package/src/controls/overlays/popover.ts +116 -0
- package/src/controls/overlays/styles.ts +195 -0
- package/src/controls/prehide.ts +285 -0
- package/src/controls/runtime.ts +1731 -0
- package/src/controls/shared/bridge.ts +18 -0
- package/src/controls/shared/candidate.ts +163 -0
- package/src/controls/shared/clipping.ts +1 -0
- package/src/controls/shared/connection.ts +105 -0
- package/src/controls/shared/control-options.ts +20 -0
- package/src/controls/shared/covered-snapshot.ts +52 -0
- package/src/controls/shared/covered-source.ts +78 -0
- package/src/controls/shared/crossfade.ts +70 -0
- package/src/controls/shared/diagnostics.ts +13 -0
- package/src/controls/shared/dom.ts +310 -0
- package/src/controls/shared/events.ts +14 -0
- package/src/controls/shared/horizontal-navigation.ts +106 -0
- package/src/controls/shared/icons.ts +64 -0
- package/src/controls/shared/modal-animation.ts +109 -0
- package/src/controls/shared/modal.ts +286 -0
- package/src/controls/shared/projection-id.ts +2 -0
- package/src/controls/shared/scroll-placement.ts +1 -0
- package/src/controls/shared/tab-bar-width.ts +66 -0
- package/src/controls/shared/toolbar-options.ts +51 -0
- package/src/controls/shared/transition-identity.ts +67 -0
- package/src/controls/shared/vertical-bars-geometry.ts +92 -0
- package/src/controls/shared/vertical-navigation.ts +34 -0
- package/src/controls/startup.ts +74 -0
- package/src/controls/transport.ts +11 -0
- package/src/controls/vertical-bars-web-search.ts +86 -0
- package/src/controls/vertical-bars-web.ts +674 -0
- package/src/dom/geometry.ts +24 -0
- package/src/dom/overlays.ts +196 -0
- package/src/dom/scroll-bindings.ts +66 -0
- package/src/dom/scroll-placement.ts +92 -0
- package/src/dom/visibility.ts +29 -0
- package/src/index.ts +19 -0
- package/src/integration/index.ts +64 -0
- package/src/ionic.ts +34 -0
- package/src/native/bootstrap.ts +132 -0
- package/src/native/bridge.ts +18 -0
- package/src/native/resource-url.ts +11 -0
- package/src/native/session.ts +708 -0
- package/src/native/updates.ts +103 -0
- package/src/native/values.ts +29 -0
- package/src/projection/events.ts +58 -0
- package/src/projection/pause.ts +58 -0
- package/src/projection/placement.ts +34 -0
- package/src/projection/scope.ts +13 -0
- package/src/projection/styles.ts +26 -0
- package/src/projection/surface.ts +88 -0
- package/src/projection/surfaces.ts +119 -0
- package/src/projection/web.ts +1013 -0
- package/src/types.ts +58 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createNativeUIActivation } from './activation.js';
|
|
2
|
+
export const createNativeUI = (transport) => {
|
|
3
|
+
const { enableNativeUI: activate, configureNativeTransition } = createNativeUIActivation(transport);
|
|
4
|
+
const handles = new WeakMap();
|
|
5
|
+
/** Start one shell. Partial options override defaults; markup owns individual placement. */
|
|
6
|
+
const startNativeUI = async (input = {}, overlayFactory) => {
|
|
7
|
+
const root = input.root ?? (typeof document === 'undefined' ? undefined : document.body);
|
|
8
|
+
const bars = { enabled: true, ...input.verticalBars };
|
|
9
|
+
const host = bars.placement?.webHost;
|
|
10
|
+
if (root && (!root.isConnected || root.ownerDocument !== document))
|
|
11
|
+
throw new Error('Native UI requires a connected root in the current document');
|
|
12
|
+
if (host && (!host.isConnected || host.ownerDocument !== document || root?.contains(host) || host.contains(root)))
|
|
13
|
+
throw new Error('The Web rail host must be connected in the current document and outside the source root');
|
|
14
|
+
const options = {
|
|
15
|
+
...input,
|
|
16
|
+
root,
|
|
17
|
+
source: 'auto',
|
|
18
|
+
verticalBars: bars,
|
|
19
|
+
rail: host ? { host, edge: bars.placement?.edge === 'leading' ? 'left' : 'right' } : undefined,
|
|
20
|
+
};
|
|
21
|
+
const runtime = await activate(options, overlayFactory);
|
|
22
|
+
const existing = handles.get(runtime);
|
|
23
|
+
if (existing)
|
|
24
|
+
return existing;
|
|
25
|
+
let stopped = false;
|
|
26
|
+
let queue = Promise.resolve();
|
|
27
|
+
const change = (enabled) => {
|
|
28
|
+
const operation = queue.then(async () => {
|
|
29
|
+
if (stopped)
|
|
30
|
+
throw new Error('Native UI has been destroyed');
|
|
31
|
+
if (bars.enabled === enabled)
|
|
32
|
+
return;
|
|
33
|
+
// Retire both surfaces before changing ownership. Resume also waits for native reconciliation.
|
|
34
|
+
const lease = await runtime.suspend();
|
|
35
|
+
try {
|
|
36
|
+
if (stopped)
|
|
37
|
+
throw new Error('Native UI has been destroyed');
|
|
38
|
+
bars.enabled = enabled;
|
|
39
|
+
root?.ownerDocument.defaultView?.dispatchEvent(new Event('nativeUIRefresh'));
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
await lease.resume();
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
queue = operation.catch(() => { });
|
|
46
|
+
return operation;
|
|
47
|
+
};
|
|
48
|
+
let destruction;
|
|
49
|
+
const destroy = runtime.destroy.bind(runtime);
|
|
50
|
+
const handle = {
|
|
51
|
+
markForCheck: runtime.markForCheck.bind(runtime),
|
|
52
|
+
getStatus: runtime.getStatus.bind(runtime),
|
|
53
|
+
suspend: runtime.suspend.bind(runtime),
|
|
54
|
+
enableVerticalControlArea: () => change(true),
|
|
55
|
+
disableVerticalControlArea: () => change(false),
|
|
56
|
+
destroy() {
|
|
57
|
+
if (!destruction) {
|
|
58
|
+
stopped = true;
|
|
59
|
+
// Reserve native teardown immediately, preserving the shared startup queue.
|
|
60
|
+
destruction = destroy();
|
|
61
|
+
}
|
|
62
|
+
return destruction;
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
const managed = Object.assign(runtime, handle);
|
|
66
|
+
handles.set(runtime, managed);
|
|
67
|
+
return managed;
|
|
68
|
+
};
|
|
69
|
+
/** Enable the shared standard shell without loading the optional Ionic overlay adapter. */
|
|
70
|
+
const enableNativeUI = (options = {}) => startNativeUI(options);
|
|
71
|
+
return { startNativeUI, enableNativeUI, configureNativeTransition };
|
|
72
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { NativeUIPlugin } from './definitions.js';
|
|
2
|
+
/** Host bridge supplied by Capacitor, Cordova, or another embedding runtime. */
|
|
3
|
+
export interface NativeUITransport {
|
|
4
|
+
readonly plugin: NativeUIPlugin;
|
|
5
|
+
getPlatform(): string;
|
|
6
|
+
isAvailable(): boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface NativeUIListenerHandle {
|
|
9
|
+
remove(): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const searchProjectionClass = "ios-theme-vertical-bars-search-projection";
|
|
2
|
+
/** Web counterpart of the system search button above the vertical tabs, or at the rail bottom without visible tabs. */
|
|
3
|
+
export declare const createVerticalBarsWebSearch: (doc: Document, eligible: (element: HTMLElement) => boolean, refresh: () => void) => {
|
|
4
|
+
restore: (retire?: (surface: HTMLElement) => void) => void;
|
|
5
|
+
readonly surface: HTMLIonFabElement | undefined;
|
|
6
|
+
readonly source: HTMLElement | undefined;
|
|
7
|
+
update(root: HTMLElement): void;
|
|
8
|
+
};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { getNativeSearchBindings } from '../integration/index.js';
|
|
2
|
+
import { activateProjectedElement, marker, unprojected } from './shared/dom.js';
|
|
3
|
+
export const searchProjectionClass = 'ios-theme-vertical-bars-search-projection';
|
|
4
|
+
/** Web counterpart of the system search button above the vertical tabs, or at the rail bottom without visible tabs. */
|
|
5
|
+
export const createVerticalBarsWebSearch = (doc, eligible, refresh) => {
|
|
6
|
+
let binding;
|
|
7
|
+
let projection;
|
|
8
|
+
let container;
|
|
9
|
+
const iconObserver = new MutationObserver(refresh);
|
|
10
|
+
let previousAriaHidden = null;
|
|
11
|
+
const restore = (retire) => {
|
|
12
|
+
iconObserver.disconnect();
|
|
13
|
+
if (container) {
|
|
14
|
+
if (retire)
|
|
15
|
+
retire(container);
|
|
16
|
+
else
|
|
17
|
+
container.remove();
|
|
18
|
+
}
|
|
19
|
+
container = undefined;
|
|
20
|
+
projection = undefined;
|
|
21
|
+
if (binding) {
|
|
22
|
+
binding.trigger.removeAttribute(marker);
|
|
23
|
+
if (previousAriaHidden === null)
|
|
24
|
+
binding.trigger.removeAttribute('aria-hidden');
|
|
25
|
+
else
|
|
26
|
+
binding.trigger.setAttribute('aria-hidden', previousAriaHidden);
|
|
27
|
+
}
|
|
28
|
+
binding = undefined;
|
|
29
|
+
};
|
|
30
|
+
return {
|
|
31
|
+
restore,
|
|
32
|
+
get surface() {
|
|
33
|
+
return container;
|
|
34
|
+
},
|
|
35
|
+
get source() {
|
|
36
|
+
return binding?.trigger;
|
|
37
|
+
},
|
|
38
|
+
update(root) {
|
|
39
|
+
const next = unprojected(binding ? [binding.trigger] : [], () => getNativeSearchBindings(doc).find(({ trigger, footer }) => eligible(trigger) && eligible(footer)));
|
|
40
|
+
if (next !== binding || container?.parentElement !== root)
|
|
41
|
+
restore();
|
|
42
|
+
if (!next)
|
|
43
|
+
return;
|
|
44
|
+
if (!projection) {
|
|
45
|
+
binding = next;
|
|
46
|
+
previousAriaHidden = next.trigger.getAttribute('aria-hidden');
|
|
47
|
+
projection = next.trigger.cloneNode(true);
|
|
48
|
+
for (const name of ['id', 'slot', marker, 'aria-hidden', 'style'])
|
|
49
|
+
projection.removeAttribute(name);
|
|
50
|
+
container = doc.createElement('ion-fab');
|
|
51
|
+
container.setAttribute('mode', next.trigger.mode ?? 'ios');
|
|
52
|
+
container.classList.add(searchProjectionClass, 'ion-cloned-element');
|
|
53
|
+
projection.addEventListener('click', (event) => {
|
|
54
|
+
event.preventDefault();
|
|
55
|
+
event.stopImmediatePropagation();
|
|
56
|
+
activateProjectedElement(next.trigger);
|
|
57
|
+
}, { capture: true });
|
|
58
|
+
container.append(projection);
|
|
59
|
+
root.append(container);
|
|
60
|
+
next.trigger.setAttribute(marker, '');
|
|
61
|
+
next.trigger.setAttribute('aria-hidden', 'true');
|
|
62
|
+
}
|
|
63
|
+
projection.setAttribute('aria-label', next.trigger.getAttribute('aria-label') ?? next.footer.querySelector('ion-searchbar')?.getAttribute('aria-label') ?? 'Search');
|
|
64
|
+
const sourceIcon = next.trigger.querySelector('ion-icon');
|
|
65
|
+
const icon = projection.querySelector('ion-icon');
|
|
66
|
+
if (sourceIcon?.shadowRoot)
|
|
67
|
+
iconObserver.observe(sourceIcon.shadowRoot, { subtree: true, childList: true, attributes: true });
|
|
68
|
+
if (sourceIcon && icon) {
|
|
69
|
+
icon.icon = sourceIcon.icon;
|
|
70
|
+
icon.name = sourceIcon.name;
|
|
71
|
+
icon.src = sourceIcon.src;
|
|
72
|
+
}
|
|
73
|
+
container.hidden = next.trigger.style.pointerEvents === 'none';
|
|
74
|
+
projection.disabled = next.trigger.disabled;
|
|
75
|
+
const bounds = next.tabBar.getBoundingClientRect();
|
|
76
|
+
const tabs = bounds.width > 0 && bounds.height > 0 && getComputedStyle(next.tabBar).visibility === 'visible' ? bounds : undefined;
|
|
77
|
+
container.style.left = tabs ? `${tabs.left + (tabs.width - 46) / 2}px` : '';
|
|
78
|
+
container.style.top = tabs ? `${tabs.top - 56}px` : '';
|
|
79
|
+
container.style.right = tabs ? 'auto' : '';
|
|
80
|
+
container.style.bottom = tabs ? 'auto' : '';
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
};
|