@swiftwc/ui 0.0.0-dev.99 → 1.0.0-canary.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/{web-components.html-data → html-data}/en.json +155 -54
- package/package.json +14 -11
- package/scss/_components.scss +1 -1
- package/scss/_maps.scss +3 -1
- package/scss/_utils.scss +3 -1
- package/scss/_vars.scss +1 -0
- package/scss/base/_layout.scss +8 -8
- package/scss/base/_reboot.scss +4 -29
- package/scss/base/_root.scss +27 -12
- package/scss/colors/_index.scss +66 -1
- package/scss/components/_alert-dialog.scss +3 -3
- package/scss/components/_bordered-button.scss +2 -2
- package/scss/components/_bordered-prominent-button.scss +3 -3
- package/scss/components/_borderless-button.scss +2 -2
- package/scss/components/_confirmation-dialog.scss +1 -1
- package/scss/components/_content-unavailable.scss +1 -1
- package/scss/components/{_body-view.scss → _content-view.scss} +2 -2
- package/scss/components/_date-picker.scss +1 -1
- package/scss/components/_detail-placeholder.scss +5 -5
- package/scss/components/_disclosure-group.scss +2 -2
- package/scss/components/_fine-tooltip.scss +1 -1
- package/scss/components/_form-view.scss +3 -3
- package/scss/components/_full-screen.scss +1 -1
- package/scss/components/_glass-button.scss +2 -2
- package/scss/components/_glass-prominent-button.scss +3 -3
- package/scss/components/_group-box.scss +1 -1
- package/scss/components/_h-divider.scss +1 -1
- package/scss/components/_h-flex-stack.scss +3 -1
- package/scss/components/_h-stack.scss +1 -1
- package/scss/components/_image-view.scss +1 -1
- package/scss/components/_index.scss +34 -24
- package/scss/components/_label-view.scss +1 -1
- package/scss/components/_labeled-content.scss +1 -1
- package/scss/components/_list-view.scss +3 -3
- package/scss/components/_menu-view.scss +3 -3
- package/scss/components/_navigation-large-title.scss +15 -9
- package/scss/components/_navigation-split-view.scss +18 -18
- package/scss/components/_navigation-stack.scss +1 -1
- package/scss/components/_navigation-title.scss +1 -1
- package/scss/components/_picker-view.scss +159 -119
- package/scss/components/_plain-button.scss +2 -2
- package/scss/components/_progress-view.scss +1 -1
- package/scss/components/_scroll-view-proxy.scss +1 -1
- package/scss/components/_scroll-view-toolbars.scss +1 -1
- package/scss/components/_scroll-view.scss +2 -2
- package/scss/components/_search-view.scss +1 -1
- package/scss/components/_section-view.scss +1 -1
- package/scss/components/_sheet-view.scss +2 -2
- package/scss/components/_sidebar-toggle.scss +1 -1
- package/scss/components/_sidebar-view.scss +2 -2
- package/scss/components/_sticky-container.scss +1 -1
- package/scss/components/_tab-bar.scss +1 -1
- package/scss/components/_tab-item.scss +1 -1
- package/scss/components/_tab-view.scss +23 -15
- package/scss/components/_table-column.scss +1 -1
- package/scss/components/_table-row.scss +1 -1
- package/scss/components/_table-view.scss +1 -1
- package/scss/components/_text-field.scss +1 -1
- package/scss/components/_text-view.scss +1 -1
- package/scss/components/_toggle-view.scss +41 -21
- package/scss/components/_tool-bar-item-group.scss +1 -1
- package/scss/components/_tool-bar-item.scss +2 -2
- package/scss/components/_tool-bar.scss +2 -2
- package/scss/components/_v-divider.scss +1 -1
- package/scss/components/_v-flex-stack.scss +3 -1
- package/scss/components/_v-keyboard.scss +1 -1
- package/scss/components/_v-stack.scss +1 -1
- package/scss/final/_touch-glass.scss +2 -2
- package/scss/mixins/_index.scss +2 -2
- package/scss/placeholders/_buttons.scss +5 -5
- package/scss/placeholders/_lists.scss +3 -3
- package/scss/transitions/_alert-dialog.scss +1 -1
- package/scss/transitions/_bwd.navbar.scss +1 -1
- package/scss/transitions/_bwd.scss +3 -3
- package/scss/transitions/_confirmation-dialog.scss +1 -1
- package/scss/transitions/_disclosure-group.scss +1 -1
- package/scss/transitions/_fine-tooltip.scss +1 -1
- package/scss/transitions/_fwd.navbar.scss +1 -1
- package/scss/transitions/_fwd.scss +1 -1
- package/scss/transitions/_glass-button.scss +1 -1
- package/scss/transitions/_glass-prominent-button.scss +1 -1
- package/scss/transitions/_index.scss +1 -1
- package/scss/transitions/_menu-view.scss +1 -1
- package/scss/transitions/_navigation-split-view.scss +1 -1
- package/scss/transitions/_progress-view.scss +1 -1
- package/scss/transitions/_sheet-view.scss +1 -1
- package/scss/transitions/_sidebar-view.scss +1 -1
- package/scss/transitions/_tab-bar.scss +1 -1
- package/scss/utils/_background.scss +52 -0
- package/scss/utils/_frame.scss +2 -2
- package/scss/utils/_index.scss +33 -8
- package/scss/utils/_spacing.scss +1 -1
- package/scss/utils/_stacks.scss +5 -3
- package/generated/buses/alert-dialog.d.ts +0 -2
- package/generated/buses/alert-dialog.js +0 -1
- package/generated/buses/confirmation-dialog.d.ts +0 -2
- package/generated/buses/confirmation-dialog.js +0 -1
- package/generated/buses/index.d.ts +0 -6
- package/generated/buses/index.js +0 -6
- package/generated/buses/lifecycle-observer.d.ts +0 -2
- package/generated/buses/lifecycle-observer.js +0 -1
- package/generated/client/index.d.ts +0 -30
- package/generated/client/index.js +0 -279
- package/generated/components/alert-dialog.d.ts +0 -11
- package/generated/components/alert-dialog.js +0 -102
- package/generated/components/body-view.d.ts +0 -13
- package/generated/components/body-view.js +0 -17
- package/generated/components/bordered-button.d.ts +0 -17
- package/generated/components/bordered-button.js +0 -56
- package/generated/components/bordered-prominent-button.d.ts +0 -17
- package/generated/components/bordered-prominent-button.js +0 -56
- package/generated/components/borderless-button.d.ts +0 -17
- package/generated/components/borderless-button.js +0 -56
- package/generated/components/color-scheme.d.ts +0 -12
- package/generated/components/color-scheme.js +0 -54
- package/generated/components/confirmation-dialog.d.ts +0 -12
- package/generated/components/confirmation-dialog.js +0 -116
- package/generated/components/content-unavailable.d.ts +0 -30
- package/generated/components/content-unavailable.js +0 -82
- package/generated/components/date-picker.d.ts +0 -52
- package/generated/components/date-picker.js +0 -480
- package/generated/components/disclosure-group.d.ts +0 -17
- package/generated/components/disclosure-group.js +0 -66
- package/generated/components/fine-tooltip.d.ts +0 -15
- package/generated/components/fine-tooltip.js +0 -111
- package/generated/components/form-view.d.ts +0 -16
- package/generated/components/form-view.js +0 -65
- package/generated/components/glass-button.d.ts +0 -16
- package/generated/components/glass-button.js +0 -53
- package/generated/components/glass-prominent-button.d.ts +0 -16
- package/generated/components/glass-prominent-button.js +0 -53
- package/generated/components/h-stack.d.ts +0 -22
- package/generated/components/h-stack.js +0 -26
- package/generated/components/image-view.d.ts +0 -18
- package/generated/components/image-view.js +0 -68
- package/generated/components/index.d.ts +0 -47
- package/generated/components/index.js +0 -47
- package/generated/components/label-view.d.ts +0 -27
- package/generated/components/label-view.js +0 -87
- package/generated/components/labeled-content.d.ts +0 -27
- package/generated/components/labeled-content.js +0 -160
- package/generated/components/list-view.d.ts +0 -15
- package/generated/components/list-view.js +0 -22
- package/generated/components/menu-view.d.ts +0 -20
- package/generated/components/menu-view.js +0 -140
- package/generated/components/navigation-large-title.d.ts +0 -18
- package/generated/components/navigation-large-title.js +0 -188
- package/generated/components/navigation-split-view.d.ts +0 -15
- package/generated/components/navigation-split-view.js +0 -25
- package/generated/components/navigation-stack.d.ts +0 -15
- package/generated/components/navigation-stack.js +0 -29
- package/generated/components/navigation-title.d.ts +0 -18
- package/generated/components/navigation-title.js +0 -72
- package/generated/components/picker-view.d.ts +0 -68
- package/generated/components/picker-view.js +0 -1153
- package/generated/components/plain-button.d.ts +0 -7
- package/generated/components/plain-button.js +0 -22
- package/generated/components/progress-view.d.ts +0 -20
- package/generated/components/progress-view.js +0 -125
- package/generated/components/screen-view.d.ts +0 -5
- package/generated/components/screen-view.js +0 -11
- package/generated/components/scroll-view-proxy.d.ts +0 -13
- package/generated/components/scroll-view-proxy.js +0 -17
- package/generated/components/scroll-view.d.ts +0 -22
- package/generated/components/scroll-view.js +0 -237
- package/generated/components/search-view.d.ts +0 -12
- package/generated/components/search-view.js +0 -27
- package/generated/components/section-view.d.ts +0 -21
- package/generated/components/section-view.js +0 -64
- package/generated/components/sheet-view.d.ts +0 -11
- package/generated/components/sheet-view.js +0 -45
- package/generated/components/sidebar-toggle.d.ts +0 -15
- package/generated/components/sidebar-toggle.js +0 -88
- package/generated/components/sidebar-view.d.ts +0 -10
- package/generated/components/sidebar-view.js +0 -37
- package/generated/components/sticky-container.d.ts +0 -11
- package/generated/components/sticky-container.js +0 -26
- package/generated/components/tab-bar.d.ts +0 -10
- package/generated/components/tab-bar.js +0 -40
- package/generated/components/tab-item.d.ts +0 -10
- package/generated/components/tab-item.js +0 -134
- package/generated/components/tab-view.d.ts +0 -31
- package/generated/components/tab-view.js +0 -198
- package/generated/components/table-view.d.ts +0 -26
- package/generated/components/table-view.js +0 -161
- package/generated/components/text-field.d.ts +0 -42
- package/generated/components/text-field.js +0 -526
- package/generated/components/toggle-view.d.ts +0 -41
- package/generated/components/toggle-view.js +0 -370
- package/generated/components/tool-bar-item-group.d.ts +0 -13
- package/generated/components/tool-bar-item-group.js +0 -31
- package/generated/components/tool-bar-item.d.ts +0 -16
- package/generated/components/tool-bar-item.js +0 -69
- package/generated/components/tool-bar.d.ts +0 -26
- package/generated/components/tool-bar.js +0 -95
- package/generated/components/v-keyboard.d.ts +0 -20
- package/generated/components/v-keyboard.js +0 -89
- package/generated/components/v-stack.d.ts +0 -25
- package/generated/components/v-stack.js +0 -29
- package/generated/css/index.css +0 -10620
- package/generated/events/alert-dialog.d.ts +0 -13
- package/generated/events/alert-dialog.js +0 -1
- package/generated/events/confirmation-dialog.d.ts +0 -14
- package/generated/events/confirmation-dialog.js +0 -1
- package/generated/events/date-picker.d.ts +0 -13
- package/generated/events/date-picker.js +0 -1
- package/generated/events/index.d.ts +0 -9
- package/generated/events/index.js +0 -9
- package/generated/events/lifecycle-observer.d.ts +0 -18
- package/generated/events/lifecycle-observer.js +0 -1
- package/generated/events/picker-view.d.ts +0 -29
- package/generated/events/picker-view.js +0 -1
- package/generated/events/scroll-view.d.ts +0 -18
- package/generated/events/scroll-view.js +0 -1
- package/generated/events/tab-view.d.ts +0 -54
- package/generated/events/tab-view.js +0 -1
- package/generated/events/text-field.d.ts +0 -13
- package/generated/events/text-field.js +0 -1
- package/generated/events/toggle-view.d.ts +0 -14
- package/generated/events/toggle-view.js +0 -1
- package/generated/i18n/index.d.ts +0 -33
- package/generated/i18n/index.js +0 -164
- package/generated/i18n/locales/el.d.ts +0 -16
- package/generated/i18n/locales/el.js +0 -16
- package/generated/i18n/locales/en.d.ts +0 -16
- package/generated/i18n/locales/en.js +0 -16
- package/generated/i18n/locales/index.d.ts +0 -4
- package/generated/i18n/locales/index.js +0 -4
- package/generated/index.d.ts +0 -2
- package/generated/index.js +0 -3
- package/generated/internal/class/cleanup-registry.d.ts +0 -5
- package/generated/internal/class/cleanup-registry.js +0 -38
- package/generated/internal/class/css-style-observer.d.ts +0 -8
- package/generated/internal/class/css-style-observer.js +0 -26
- package/generated/internal/class/form-associated-base.d.ts +0 -16
- package/generated/internal/class/form-associated-base.js +0 -78
- package/generated/internal/class/mutation-observer-set.d.ts +0 -9
- package/generated/internal/class/mutation-observer-set.js +0 -42
- package/generated/internal/class/mutation-observer-singleton.d.ts +0 -10
- package/generated/internal/class/mutation-observer-singleton.js +0 -64
- package/generated/internal/class/navigation-path.d.ts +0 -15
- package/generated/internal/class/navigation-path.js +0 -84
- package/generated/internal/class/navigation-view.d.ts +0 -8
- package/generated/internal/class/navigation-view.js +0 -72
- package/generated/internal/class/resize-observer-singleton.d.ts +0 -7
- package/generated/internal/class/resize-observer-singleton.js +0 -22
- package/generated/internal/decorators/adaptive-slot.d.ts +0 -1
- package/generated/internal/decorators/adaptive-slot.js +0 -50
- package/generated/internal/decorators/custom-element.d.ts +0 -5
- package/generated/internal/decorators/custom-element.js +0 -5
- package/generated/internal/decorators/index.d.ts +0 -6
- package/generated/internal/decorators/index.js +0 -6
- package/generated/internal/decorators/microtask-on-connected.d.ts +0 -39
- package/generated/internal/decorators/microtask-on-connected.js +0 -67
- package/generated/internal/privateNamespace.d.ts +0 -14
- package/generated/internal/privateNamespace.js +0 -168
- package/generated/internal/utils/add.d.ts +0 -1
- package/generated/internal/utils/add.js +0 -7
- package/generated/internal/utils/cash/ancestors.d.ts +0 -1
- package/generated/internal/utils/cash/ancestors.js +0 -27
- package/generated/internal/utils/cash/index.d.ts +0 -24
- package/generated/internal/utils/cash/index.js +0 -27
- package/generated/internal/utils/cash/next-all.d.ts +0 -1
- package/generated/internal/utils/cash/next-all.js +0 -10
- package/generated/internal/utils/cash/next.d.ts +0 -1
- package/generated/internal/utils/cash/next.js +0 -9
- package/generated/internal/utils/cash/prev-all.d.ts +0 -1
- package/generated/internal/utils/cash/prev-all.js +0 -10
- package/generated/internal/utils/cash/prev.d.ts +0 -1
- package/generated/internal/utils/cash/prev.js +0 -9
- package/generated/internal/utils/cash/prop.d.ts +0 -18
- package/generated/internal/utils/cash/prop.js +0 -30
- package/generated/internal/utils/cash/siblings.d.ts +0 -1
- package/generated/internal/utils/cash/siblings.js +0 -10
- package/generated/internal/utils/clamp.d.ts +0 -1
- package/generated/internal/utils/clamp.js +0 -4
- package/generated/internal/utils/compare-big-decimals.d.ts +0 -1
- package/generated/internal/utils/compare-big-decimals.js +0 -80
- package/generated/internal/utils/css-time.d.ts +0 -1
- package/generated/internal/utils/css-time.js +0 -3
- package/generated/internal/utils/debounce.d.ts +0 -1
- package/generated/internal/utils/debounce.js +0 -13
- package/generated/internal/utils/define-translations.d.ts +0 -1
- package/generated/internal/utils/define-translations.js +0 -3
- package/generated/internal/utils/dev-flags.d.ts +0 -3
- package/generated/internal/utils/dev-flags.js +0 -5
- package/generated/internal/utils/ensure-placeholder.d.ts +0 -1
- package/generated/internal/utils/ensure-placeholder.js +0 -41
- package/generated/internal/utils/frame.d.ts +0 -1
- package/generated/internal/utils/frame.js +0 -6
- package/generated/internal/utils/index.d.ts +0 -20
- package/generated/internal/utils/index.js +0 -23
- package/generated/internal/utils/is-inside.d.ts +0 -1
- package/generated/internal/utils/is-inside.js +0 -4
- package/generated/internal/utils/kebab-case.d.ts +0 -1
- package/generated/internal/utils/kebab-case.js +0 -8
- package/generated/internal/utils/list-active.d.ts +0 -7
- package/generated/internal/utils/list-active.js +0 -83
- package/generated/internal/utils/microtask.d.ts +0 -1
- package/generated/internal/utils/microtask.js +0 -3
- package/generated/internal/utils/onoff.d.ts +0 -45
- package/generated/internal/utils/onoff.js +0 -31
- package/generated/internal/utils/set.d.ts +0 -1
- package/generated/internal/utils/set.js +0 -7
- package/generated/internal/utils/sleep.d.ts +0 -1
- package/generated/internal/utils/sleep.js +0 -3
- package/generated/internal/utils/slow-hide-show.d.ts +0 -1
- package/generated/internal/utils/slow-hide-show.js +0 -16
- package/generated/internal/utils/timeout.d.ts +0 -5
- package/generated/internal/utils/timeout.js +0 -16
- package/generated/internal/utils/touch-glass.d.ts +0 -7
- package/generated/internal/utils/touch-glass.js +0 -19
- package/generated/internal/vendor/morphdom.d.ts +0 -6
- package/generated/internal/vendor/morphdom.js +0 -720
- package/generated/morphdom/index.d.ts +0 -8
- package/generated/morphdom/index.js +0 -8
- package/generated/morphdom/morph.d.ts +0 -4
- package/generated/morphdom/morph.js +0 -10
- package/generated/morphdom/query-morph.d.ts +0 -5
- package/generated/morphdom/query-morph.js +0 -12
- package/generated/morphdom/render-to-string.d.ts +0 -12
- package/generated/morphdom/render-to-string.js +0 -48
- package/generated/morphdom/unsafe-html.d.ts +0 -2
- package/generated/morphdom/unsafe-html.js +0 -4
- package/generated/namespace-browser/base.d.ts +0 -45
- package/generated/namespace-browser/base.js +0 -115
- package/generated/namespace-browser/event.d.ts +0 -10
- package/generated/namespace-browser/event.js +0 -1
- package/generated/namespace-browser/index.d.ts +0 -7
- package/generated/namespace-browser/index.js +0 -1
- package/generated/snapshot/index.d.ts +0 -9
- package/generated/snapshot/index.js +0 -60
- package/generated/tpl/html.d.ts +0 -5
- package/generated/tpl/html.js +0 -7
- package/generated/tpl/index.d.ts +0 -6
- package/generated/tpl/index.js +0 -6
- package/generated/tpl/is-template-result.d.ts +0 -3
- package/generated/tpl/is-template-result.js +0 -1
- package/generated/tpl/render.d.ts +0 -2
- package/generated/tpl/render.js +0 -132
- /package/{web-components.css-data → css-data}/en.json +0 -0
- /package/scss/utils/{_scroll-view.scss → _scroll-view.scss.txt} +0 -0
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { CleanupRegistry } from '../internal/class/cleanup-registry';
|
|
2
|
-
import { devFlags, onoff } from '../internal/utils';
|
|
3
|
-
import { DialogBase } from '../namespace-browser/base';
|
|
4
|
-
/**
|
|
5
|
-
* @summary A dialog that slides up over the current screen.
|
|
6
|
-
*/
|
|
7
|
-
export class SheetView extends DialogBase {
|
|
8
|
-
constructor() {
|
|
9
|
-
super();
|
|
10
|
-
}
|
|
11
|
-
static polyfillDisconnectedCallback(el) {
|
|
12
|
-
if (devFlags.debug)
|
|
13
|
-
console.debug(`${SheetView.name} ⚡️ disconnect`);
|
|
14
|
-
CleanupRegistry.unregister(el);
|
|
15
|
-
}
|
|
16
|
-
static polyfillConnectedCallback(el) {
|
|
17
|
-
if (devFlags.debug)
|
|
18
|
-
console.debug(`${SheetView.name} ⚡️ connect`);
|
|
19
|
-
CleanupRegistry.register(el, onoff([
|
|
20
|
-
{ types: 'cancel', listener: this.#handleCancel },
|
|
21
|
-
{ types: 'keydown', listener: SheetView.#handleKeydown },
|
|
22
|
-
], el).on());
|
|
23
|
-
el.autofocus = true;
|
|
24
|
-
}
|
|
25
|
-
static polyfillAttributeChangedCallback([{ attributeName, target, oldValue }]) {
|
|
26
|
-
if (devFlags.debug)
|
|
27
|
-
console.debug(`${SheetView.name} ⚡️ attr-change [${attributeName}] ("${oldValue}" → "${target.getAttribute(attributeName ?? '')}")`);
|
|
28
|
-
}
|
|
29
|
-
static #handleKeydown = (evt) => {
|
|
30
|
-
if (devFlags.debug)
|
|
31
|
-
console.debug(`${SheetView.name} ⚡️ ${evt?.type} (${evt.key})`);
|
|
32
|
-
if ('Escape' !== evt.key)
|
|
33
|
-
return;
|
|
34
|
-
evt.preventDefault();
|
|
35
|
-
evt.stopImmediatePropagation();
|
|
36
|
-
evt.stopPropagation();
|
|
37
|
-
};
|
|
38
|
-
static #handleCancel = (evt) => {
|
|
39
|
-
if (devFlags.debug)
|
|
40
|
-
console.debug(`${SheetView.name} ⚡️ ${evt?.type} (${evt.cancelable})`);
|
|
41
|
-
if (!evt.cancelable)
|
|
42
|
-
return;
|
|
43
|
-
evt.preventDefault();
|
|
44
|
-
};
|
|
45
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @summary A control that shows or hides the sidebar view.
|
|
3
|
-
*/
|
|
4
|
-
export declare class SidebarToggle extends HTMLElement {
|
|
5
|
-
#private;
|
|
6
|
-
constructor();
|
|
7
|
-
disconnectedCallback(): void;
|
|
8
|
-
connectedCallback(): void;
|
|
9
|
-
private static query;
|
|
10
|
-
}
|
|
11
|
-
declare global {
|
|
12
|
-
interface HTMLElementTagNameMap {
|
|
13
|
-
'sidebar-toggle': SidebarToggle;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
var _a;
|
|
2
|
-
import { CleanupRegistry } from '../internal/class/cleanup-registry';
|
|
3
|
-
import { ResizeObserverSingleton } from '../internal/class/resize-observer-singleton';
|
|
4
|
-
import { debounce, devFlags, onoff } from '../internal/utils';
|
|
5
|
-
const observers = new ResizeObserverSingleton();
|
|
6
|
-
/**
|
|
7
|
-
* @summary A control that shows or hides the sidebar view.
|
|
8
|
-
*/
|
|
9
|
-
export class SidebarToggle extends HTMLElement {
|
|
10
|
-
constructor() {
|
|
11
|
-
super();
|
|
12
|
-
}
|
|
13
|
-
disconnectedCallback() {
|
|
14
|
-
if (devFlags.debug)
|
|
15
|
-
console.debug(`${_a.name} ⚡️ disconnect`);
|
|
16
|
-
observers.unobserve(this);
|
|
17
|
-
CleanupRegistry.unregister(this);
|
|
18
|
-
}
|
|
19
|
-
connectedCallback() {
|
|
20
|
-
if (devFlags.debug)
|
|
21
|
-
console.debug(`${_a.name} ⚡️ connect`);
|
|
22
|
-
CleanupRegistry.register(this, onoff('click', this.#handleClick, this).on());
|
|
23
|
-
const entry = {
|
|
24
|
-
target: this,
|
|
25
|
-
};
|
|
26
|
-
observers.observe(this, debounce(_a.#handleMeasure, 100, true)); //this.#ro?.observe(this)
|
|
27
|
-
// @ts-expect-error
|
|
28
|
-
_a.#handleMeasure([entry]);
|
|
29
|
-
}
|
|
30
|
-
static query(target) {
|
|
31
|
-
const container = target?.closest('navigation-split-view,tab-view'), sideBar = container?.querySelector(':scope>[is=sidebar-view]');
|
|
32
|
-
return { container, sideBar };
|
|
33
|
-
}
|
|
34
|
-
// This triggers on show/hide of any of sidebar-toggle elements
|
|
35
|
-
static #handleMeasure(entry) {
|
|
36
|
-
if (devFlags.debug)
|
|
37
|
-
console.debug(`${_a.name} ⚡️ measure`);
|
|
38
|
-
const { target } = entry ?? {};
|
|
39
|
-
if (!(target instanceof HTMLElement))
|
|
40
|
-
return;
|
|
41
|
-
// set/remove css var/prop to parent based on shown/hidden
|
|
42
|
-
const tv = target.parentElement;
|
|
43
|
-
// inlineSize = entry.borderBoxSize?.at(0)?.inlineSize ?? entry.contentRect?.width ?? 0,
|
|
44
|
-
// blockSize = entry.borderBoxSize?.at(0)?.blockSize ?? entry.contentRect?.height ?? 0
|
|
45
|
-
self.requestAnimationFrame(() => {
|
|
46
|
-
const inlineSize = target.offsetWidth ?? 0;
|
|
47
|
-
if (0 < inlineSize)
|
|
48
|
-
tv?.style?.setProperty?.('--sidebar-toggle-padding-inline-start', `${inlineSize}px`); //$.prop('--sidebar-toggle-padding-inline-start', `${inlineSize}px`, tv) //
|
|
49
|
-
else
|
|
50
|
-
tv?.style?.removeProperty?.('--sidebar-toggle-padding-inline-start'); //$.prop('--sidebar-toggle-padding-inline-start', null, tv) //
|
|
51
|
-
});
|
|
52
|
-
// auto close IF open
|
|
53
|
-
const { container, sideBar } = _a.query(target); //target?.closest('navigation-split-view,tab-view')
|
|
54
|
-
if (!sideBar?.open)
|
|
55
|
-
return;
|
|
56
|
-
self.requestAnimationFrame(() => {
|
|
57
|
-
switch (container?.tagName) {
|
|
58
|
-
case 'NAVIGATION-SPLIT-VIEW':
|
|
59
|
-
if (0 < target.offsetWidth && 0 < target.offsetHeight)
|
|
60
|
-
return;
|
|
61
|
-
break;
|
|
62
|
-
case 'TAB-VIEW':
|
|
63
|
-
// scan all toggles for anyone that is visible, sign that sidebar should stay open
|
|
64
|
-
if ([
|
|
65
|
-
...container.querySelectorAll(':scope > sidebar-toggle,:scope > [is=tab-bar] > sidebar-toggle' //,:scope > [is='sidebar-view'] > tool-bar > sidebar-toggle" ?? FIXME: removed this bc/ inside sidebar!
|
|
66
|
-
),
|
|
67
|
-
].some(({ offsetWidth, offsetHeight }) => 0 < offsetWidth && 0 < offsetHeight))
|
|
68
|
-
return;
|
|
69
|
-
break;
|
|
70
|
-
}
|
|
71
|
-
sideBar?.close?.();
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
#handleClick({ target, type }) {
|
|
75
|
-
if (devFlags.debug)
|
|
76
|
-
console.debug(`${_a.name} ⚡️ ${type}`);
|
|
77
|
-
if (!(target instanceof HTMLElement))
|
|
78
|
-
return;
|
|
79
|
-
if (!target?.closest('button'))
|
|
80
|
-
return;
|
|
81
|
-
const { sideBar } = _a.query(target);
|
|
82
|
-
if (!sideBar?.open)
|
|
83
|
-
sideBar?.showModal();
|
|
84
|
-
else
|
|
85
|
-
sideBar.close();
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
_a = SidebarToggle;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { DialogBase } from '../namespace-browser/base';
|
|
2
|
-
/**
|
|
3
|
-
* @summary A container view that arranges navigation destinations in a single column.
|
|
4
|
-
*/
|
|
5
|
-
export declare class SidebarView extends DialogBase {
|
|
6
|
-
#private;
|
|
7
|
-
constructor();
|
|
8
|
-
static polyfillDisconnectedCallback(el: HTMLDialogElement): void;
|
|
9
|
-
static polyfillConnectedCallback(el: HTMLDialogElement): void;
|
|
10
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { CleanupRegistry } from '../internal/class/cleanup-registry';
|
|
2
|
-
import { devFlags, onoff, touchGlass } from '../internal/utils';
|
|
3
|
-
import { DialogBase } from '../namespace-browser/base';
|
|
4
|
-
/**
|
|
5
|
-
* @summary A container view that arranges navigation destinations in a single column.
|
|
6
|
-
*/
|
|
7
|
-
export class SidebarView extends DialogBase {
|
|
8
|
-
constructor() {
|
|
9
|
-
super();
|
|
10
|
-
}
|
|
11
|
-
static polyfillDisconnectedCallback(el) {
|
|
12
|
-
el.removeEventListener('click', SidebarView.#handleClick);
|
|
13
|
-
CleanupRegistry.unregister(el);
|
|
14
|
-
}
|
|
15
|
-
static polyfillConnectedCallback(el) {
|
|
16
|
-
CleanupRegistry.register(el, onoff('click', SidebarView.#handleClick, el).on());
|
|
17
|
-
CleanupRegistry.register(el, onoff(touchGlass(el, (t) => t, ({ target }) => {
|
|
18
|
-
if (!(target instanceof HTMLElement))
|
|
19
|
-
return true;
|
|
20
|
-
if (target.matches('[is=sidebar-view]'))
|
|
21
|
-
return false;
|
|
22
|
-
if (target.closest('tool-bar-item'))
|
|
23
|
-
return false;
|
|
24
|
-
return true;
|
|
25
|
-
}), el).on());
|
|
26
|
-
el.autofocus = true;
|
|
27
|
-
}
|
|
28
|
-
// Autoclose on click outside.
|
|
29
|
-
static #handleClick = async ({ target, type }) => {
|
|
30
|
-
if (devFlags.debug)
|
|
31
|
-
console.debug(`${SidebarView.name} ⚡️ ${type}`);
|
|
32
|
-
if (!(target instanceof HTMLElement))
|
|
33
|
-
return;
|
|
34
|
-
if (target instanceof HTMLDialogElement && 'sidebar-view' === target.getAttribute('is'))
|
|
35
|
-
target.close?.();
|
|
36
|
-
};
|
|
37
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { CleanupRegistry } from '../internal/class/cleanup-registry';
|
|
2
|
-
import { devFlags, onoff } from '../internal/utils';
|
|
3
|
-
export class StickyContainer extends HTMLElement {
|
|
4
|
-
constructor() {
|
|
5
|
-
super();
|
|
6
|
-
}
|
|
7
|
-
disconnectedCallback() {
|
|
8
|
-
if (devFlags.debug)
|
|
9
|
-
console.debug(`${StickyContainer.name} ⚡️ disconnect`);
|
|
10
|
-
CleanupRegistry.unregister(this);
|
|
11
|
-
}
|
|
12
|
-
connectedCallback() {
|
|
13
|
-
if (devFlags.debug)
|
|
14
|
-
console.debug(`${StickyContainer.name} ⚡️ connect`);
|
|
15
|
-
// CleanupRegistry.register(this, onoff('transitionend transitionstart transitioncancel', this.#handleTransitionrun as unknown as EventListener, this).on())
|
|
16
|
-
CleanupRegistry.register(this, onoff('transitionrun', this.#handleTransitionrun, this).on());
|
|
17
|
-
}
|
|
18
|
-
#handleTransitionrun = ({ target, propertyName, pseudoElement }) => {
|
|
19
|
-
if (!(target instanceof HTMLElement))
|
|
20
|
-
return;
|
|
21
|
-
if ('--stuck' !== propertyName || '::before' !== pseudoElement || !target.matches('sticky-container'))
|
|
22
|
-
return;
|
|
23
|
-
const stuck = self.getComputedStyle(this, 'before').getPropertyValue('--stuck');
|
|
24
|
-
this.toggleAttribute('stuck', '1' === stuck);
|
|
25
|
-
};
|
|
26
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { DialogBase } from '../namespace-browser/base';
|
|
2
|
-
/**
|
|
3
|
-
* @summary A container view that groups tab-items together along the top or bottom of the screen.
|
|
4
|
-
*/
|
|
5
|
-
export declare class TabBar extends DialogBase {
|
|
6
|
-
#private;
|
|
7
|
-
constructor();
|
|
8
|
-
static polyfillDisconnectedCallback(el: HTMLDialogElement): void;
|
|
9
|
-
static polyfillConnectedCallback(el: HTMLDialogElement): void;
|
|
10
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { CleanupRegistry } from '../internal/class/cleanup-registry';
|
|
2
|
-
import { devFlags, onoff, touchGlass } from '../internal/utils';
|
|
3
|
-
import { DialogBase } from '../namespace-browser/base';
|
|
4
|
-
/**
|
|
5
|
-
* @summary A container view that groups tab-items together along the top or bottom of the screen.
|
|
6
|
-
*/
|
|
7
|
-
export class TabBar extends DialogBase {
|
|
8
|
-
constructor() {
|
|
9
|
-
super();
|
|
10
|
-
}
|
|
11
|
-
static polyfillDisconnectedCallback(el) {
|
|
12
|
-
if (devFlags.debug)
|
|
13
|
-
console.debug(`${TabBar.name} ⚡️ disconnect`);
|
|
14
|
-
el.removeEventListener('click', TabBar.#handleClick);
|
|
15
|
-
CleanupRegistry.unregister(el);
|
|
16
|
-
}
|
|
17
|
-
static polyfillConnectedCallback(el) {
|
|
18
|
-
if (devFlags.debug)
|
|
19
|
-
console.debug(`${TabBar.name} ⚡️ connect`);
|
|
20
|
-
el.autofocus = true;
|
|
21
|
-
CleanupRegistry.register(el, onoff('click', TabBar.#handleClick, el).on());
|
|
22
|
-
CleanupRegistry.register(el, onoff(touchGlass(el, (t) => t, ({ target }) => {
|
|
23
|
-
if (!(target instanceof HTMLElement))
|
|
24
|
-
return true;
|
|
25
|
-
if (target.matches('[is=tab-bar]'))
|
|
26
|
-
return false;
|
|
27
|
-
if (target.closest('tool-bar-item'))
|
|
28
|
-
return false;
|
|
29
|
-
return true;
|
|
30
|
-
}), el).on());
|
|
31
|
-
}
|
|
32
|
-
static #handleClick = async ({ target, type }) => {
|
|
33
|
-
if (devFlags.debug)
|
|
34
|
-
console.debug(`${TabBar.name} ⚡️ ${type}`);
|
|
35
|
-
if (!(target instanceof HTMLElement))
|
|
36
|
-
return;
|
|
37
|
-
if (target instanceof HTMLDialogElement && 'tab-bar' === target.getAttribute('is'))
|
|
38
|
-
target.close?.();
|
|
39
|
-
};
|
|
40
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { ButtonBase } from '../namespace-browser/base';
|
|
2
|
-
/**
|
|
3
|
-
* @summary A control that switches the tab view to this tab.
|
|
4
|
-
*/
|
|
5
|
-
export declare class TabItem extends ButtonBase {
|
|
6
|
-
#private;
|
|
7
|
-
constructor();
|
|
8
|
-
static polyfillDisconnectedCallback(btn: HTMLButtonElement): void;
|
|
9
|
-
static polyfillConnectedCallback(btn: TabItem): void;
|
|
10
|
-
}
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import { CleanupRegistry } from '../internal/class/cleanup-registry';
|
|
2
|
-
import { devFlags, onoff } from '../internal/utils';
|
|
3
|
-
import { ButtonBase } from '../namespace-browser/base';
|
|
4
|
-
import { TabView } from './tab-view';
|
|
5
|
-
/**
|
|
6
|
-
* @summary A control that switches the tab view to this tab.
|
|
7
|
-
*/
|
|
8
|
-
export class TabItem extends ButtonBase {
|
|
9
|
-
constructor() {
|
|
10
|
-
super();
|
|
11
|
-
}
|
|
12
|
-
static polyfillDisconnectedCallback(btn) {
|
|
13
|
-
if (devFlags.debug)
|
|
14
|
-
console.debug(`${TabItem.name} ⚡️ disconnect`);
|
|
15
|
-
CleanupRegistry.unregister(btn);
|
|
16
|
-
}
|
|
17
|
-
static polyfillConnectedCallback(btn) {
|
|
18
|
-
if (devFlags.debug)
|
|
19
|
-
console.debug(`${TabItem.name} ⚡️ connect`);
|
|
20
|
-
Object.assign(btn, {
|
|
21
|
-
tabIndex: 0,
|
|
22
|
-
ariaSelected: 'false',
|
|
23
|
-
});
|
|
24
|
-
CleanupRegistry.register(btn, onoff('click', TabItem.#handleClick, btn).on());
|
|
25
|
-
const handler1 = TabItem.#handleTabRevealOrSwap.bind(null, btn), handler2 = TabItem.#handleTabMoreStackAllowance.bind(null, btn), tv = btn.closest('tab-view') ?? undefined;
|
|
26
|
-
CleanupRegistry.register(btn, onoff('tabreveal tabswap', handler1, tv).on());
|
|
27
|
-
CleanupRegistry.register(btn, onoff('tab-view:adaptable-tab-bar-placement-change', handler2, tv).on());
|
|
28
|
-
// NOTE: Make sure before invoking props of TAB-VIEW
|
|
29
|
-
self.customElements.whenDefined('tab-view').then(() => {
|
|
30
|
-
if (!btn.isConnected)
|
|
31
|
-
return;
|
|
32
|
-
if (tv?.selectedTab?.map(({ id }) => id)?.includes(btn.value))
|
|
33
|
-
void this.#handleTabRevealOrSwap(btn, new CustomEvent('tabreveal', { detail: { tag: btn.value } }));
|
|
34
|
-
if (tv?.moreTab)
|
|
35
|
-
this.#handleTabMoreStackAllowance(btn, new CustomEvent('tab-view:adaptable-tab-bar-placement-change'));
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
static #handleTabMoreStackAllowance = async (btn, evt) => {
|
|
39
|
-
if (devFlags.debug)
|
|
40
|
-
console.debug(`${TabItem.name} ⚡️ ${evt?.type}`);
|
|
41
|
-
const tv = btn.closest('tab-view');
|
|
42
|
-
if (!tv)
|
|
43
|
-
return;
|
|
44
|
-
if (tv.moreTab?.id !== btn.value)
|
|
45
|
-
return;
|
|
46
|
-
btn.hidden = 'bottom-bar' !== tv.tabBarPlacement;
|
|
47
|
-
};
|
|
48
|
-
static #handleTabRevealOrSwap = async (btn, evt) => {
|
|
49
|
-
if (devFlags.debug)
|
|
50
|
-
console.debug(`${TabItem.name} ⚡️ ${evt?.type}`);
|
|
51
|
-
const tv = btn?.closest('tab-view');
|
|
52
|
-
if (!tv)
|
|
53
|
-
return;
|
|
54
|
-
// if (evt.detail?.tag !== btn.value) return
|
|
55
|
-
// await Snapshot.waitReady
|
|
56
|
-
const isSelected = tv.selectedTab.map(({ id }) => id).includes(btn.value); //'tabreveal' === evt?.type
|
|
57
|
-
if (`${isSelected}` !== btn.ariaSelected)
|
|
58
|
-
btn.ariaSelected = `${isSelected}`;
|
|
59
|
-
if (!isSelected)
|
|
60
|
-
return;
|
|
61
|
-
setTimeout(() => {
|
|
62
|
-
if (btn.ariaSelected !== 'true' || !btn.isConnected)
|
|
63
|
-
return;
|
|
64
|
-
btn.scrollIntoView({
|
|
65
|
-
behavior: self.matchMedia('(prefers-reduced-motion: no-preference)').matches ? 'smooth' : 'instant',
|
|
66
|
-
block: 'nearest',
|
|
67
|
-
inline: 'nearest',
|
|
68
|
-
});
|
|
69
|
-
}, 100);
|
|
70
|
-
};
|
|
71
|
-
static #handleClick = async ({ type, currentTarget: btn }) => {
|
|
72
|
-
if (devFlags.debug)
|
|
73
|
-
console.debug(`${TabItem.name} ⚡️ ${type}`);
|
|
74
|
-
if (!(btn instanceof HTMLElement))
|
|
75
|
-
return;
|
|
76
|
-
// const tag = btn.getAttribute('value')
|
|
77
|
-
// if (!tag) return // sidebartoggle > tab-item //throw new DOMException(`Attribute "tag" is set but invalid`, 'InvalidStateError')
|
|
78
|
-
const tv = btn.closest('tab-view');
|
|
79
|
-
if (!tv)
|
|
80
|
-
throw new Error('TabView not found');
|
|
81
|
-
const newTab = tv?.querySelector(`#${btn.getAttribute('value')}`);
|
|
82
|
-
if (!newTab)
|
|
83
|
-
return;
|
|
84
|
-
// console.log(99, TabView.gatherTab(newTab))
|
|
85
|
-
// const possibleParentNs = newTab?.parentElement?.closest<NavigationStack | NavigationSplitView>('navigation-stack,navigation-split-view')
|
|
86
|
-
const tabs = TabView.gatherTab(newTab); //[possibleParentNs, newTab].filter(Boolean) as (NavigationStack | NavigationSplitView)[]
|
|
87
|
-
// if (possibleParentNs) tabs.unshift(possibleParentNs)
|
|
88
|
-
// SECTION: before submitting new tabs, check for tabroot
|
|
89
|
-
// iphone cases:
|
|
90
|
-
// current -> new
|
|
91
|
-
// ns1 -> ns1 tabroot💡ns1 1 1 === ===
|
|
92
|
-
// more -> more tabroot💡more 1 1 === ===
|
|
93
|
-
// ns1 -> more tabroot💡more 1 1 !== ->
|
|
94
|
-
// more,settings -> more tabroot💡more 2 1 !== ↖
|
|
95
|
-
// more,settings -> ns1 2 1 !== <-
|
|
96
|
-
// ns1 -> more tabroot💡more 1 1 !== ->
|
|
97
|
-
// ipad cases:
|
|
98
|
-
// ns1 -> ns1 tabroot💡ns1 1 1 === ===
|
|
99
|
-
// more,settings -> more,settings tabroot💡settings 2 2 === ===
|
|
100
|
-
// more,settings -> more,ns3 2 2 !== <->
|
|
101
|
-
// more,ns3 -> more,settings 2 2 !== <->
|
|
102
|
-
// ns1 -> more,settings 1 2 !== ↘
|
|
103
|
-
const seed1 = tv.selectedTab.map((item) => item.id).join(','), seed2 = tabs.map((item) => item.id).join(',');
|
|
104
|
-
const dir = tv.selectedTab.length < tabs.length
|
|
105
|
-
? '↘'
|
|
106
|
-
: tv.selectedTab.length > tabs.length
|
|
107
|
-
? tv.selectedTab.at(0) === tabs.at(0)
|
|
108
|
-
? '↖'
|
|
109
|
-
: '<-'
|
|
110
|
-
: seed1 === seed2
|
|
111
|
-
? '==='
|
|
112
|
-
: tv.moreTab === tabs.at(-1)
|
|
113
|
-
? '->'
|
|
114
|
-
: '<->';
|
|
115
|
-
if (['===', '↖'].includes(dir)) {
|
|
116
|
-
for (const tab of tabs.reverse())
|
|
117
|
-
if (tv.selectedTab.includes(tab)) {
|
|
118
|
-
const eventType = 'tabroot';
|
|
119
|
-
if (devFlags.debug)
|
|
120
|
-
console.debug(`${TabItem.name} 💡 ${eventType}`);
|
|
121
|
-
tab?.dispatchEvent(new CustomEvent(eventType, { bubbles: true, composed: true }));
|
|
122
|
-
return; // skip rest no selection!
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
else if ('->' === dir) {
|
|
126
|
-
const eventType = 'tabroot';
|
|
127
|
-
if (devFlags.debug)
|
|
128
|
-
console.debug(`${TabItem.name} 💡 ${eventType}`);
|
|
129
|
-
tabs.at(0)?.dispatchEvent(new CustomEvent(eventType, { bubbles: true, composed: true }));
|
|
130
|
-
}
|
|
131
|
-
// SECTION: finally, submit new tabs
|
|
132
|
-
tv.selectedTab = tabs;
|
|
133
|
-
};
|
|
134
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { type NavigationSplitView } from './navigation-split-view';
|
|
2
|
-
import { type NavigationStack } from './navigation-stack';
|
|
3
|
-
declare const TAB_BAR_PLACEMENTS: readonly ["bottom-bar", "ornament", "sidebar", "top-bar"];
|
|
4
|
-
export type TabBarPlacement = (typeof TAB_BAR_PLACEMENTS)[number];
|
|
5
|
-
/**
|
|
6
|
-
* @summary A container view that switches between screens using tabs.
|
|
7
|
-
*
|
|
8
|
-
* @cssprop --adaptable-tab-bar-placement
|
|
9
|
-
*
|
|
10
|
-
* @fires tabshow — A Tab is shown
|
|
11
|
-
* @fires tabhide — A Tab is hidden
|
|
12
|
-
* @fires tab-view:toggle
|
|
13
|
-
* @fires tab-view:adaptable-tab-bar-placement-change
|
|
14
|
-
*/
|
|
15
|
-
export declare class TabView extends HTMLElement {
|
|
16
|
-
#private;
|
|
17
|
-
static gatherTab(newTab: NavigationStack | NavigationSplitView): (NavigationStack | NavigationSplitView)[];
|
|
18
|
-
constructor();
|
|
19
|
-
disconnectedCallback(): void;
|
|
20
|
-
get tabBarPlacement(): "bottom-bar" | "ornament" | "sidebar" | "top-bar" | undefined;
|
|
21
|
-
get moreTab(): NavigationStack | null;
|
|
22
|
-
connectedCallback(): void;
|
|
23
|
-
get selectedTab(): (NavigationSplitView | NavigationStack)[];
|
|
24
|
-
set selectedTab(tabs: (NavigationSplitView | NavigationStack)[]);
|
|
25
|
-
}
|
|
26
|
-
declare global {
|
|
27
|
-
interface HTMLElementTagNameMap {
|
|
28
|
-
'tab-view': TabView;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
export {};
|
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
var _a;
|
|
2
|
-
import { CleanupRegistry } from '../internal/class/cleanup-registry';
|
|
3
|
-
import { CSSStyleObserver } from '../internal/class/css-style-observer';
|
|
4
|
-
import { NavigationPath } from '../internal/class/navigation-path';
|
|
5
|
-
import { $, cssTime, debounce, devFlags, frame, onoff, timeout } from '../internal/utils';
|
|
6
|
-
import { Snapshot } from '../snapshot';
|
|
7
|
-
const TAB_BAR_PLACEMENTS = ['bottom-bar', 'ornament', 'sidebar', 'top-bar'];
|
|
8
|
-
/**
|
|
9
|
-
* @summary A container view that switches between screens using tabs.
|
|
10
|
-
*
|
|
11
|
-
* @cssprop --adaptable-tab-bar-placement
|
|
12
|
-
*
|
|
13
|
-
* @fires tabshow — A Tab is shown
|
|
14
|
-
* @fires tabhide — A Tab is hidden
|
|
15
|
-
* @fires tab-view:toggle
|
|
16
|
-
* @fires tab-view:adaptable-tab-bar-placement-change
|
|
17
|
-
*/
|
|
18
|
-
export class TabView extends HTMLElement {
|
|
19
|
-
#debouncedHandler;
|
|
20
|
-
#cssStyleObserver;
|
|
21
|
-
#afterTabRevealDelay = timeout();
|
|
22
|
-
#cachedAdaptableTabBarPlacement = 'bottom-bar';
|
|
23
|
-
static gatherTab(newTab) {
|
|
24
|
-
const possibleParentNs = newTab?.parentElement?.closest('navigation-stack,navigation-split-view');
|
|
25
|
-
return [possibleParentNs, newTab].filter(Boolean);
|
|
26
|
-
}
|
|
27
|
-
constructor() {
|
|
28
|
-
super();
|
|
29
|
-
this.#debouncedHandler = debounce(this.#handleSelectionChange, 1);
|
|
30
|
-
}
|
|
31
|
-
disconnectedCallback() {
|
|
32
|
-
if (devFlags.debug)
|
|
33
|
-
console.debug(`${_a.name} ⚡️ disconnect`);
|
|
34
|
-
this.#afterTabRevealDelay.cancel();
|
|
35
|
-
this.#cssStyleObserver?.disconnect();
|
|
36
|
-
CleanupRegistry.unregister(this);
|
|
37
|
-
}
|
|
38
|
-
get tabBarPlacement() {
|
|
39
|
-
return this.#cachedAdaptableTabBarPlacement;
|
|
40
|
-
}
|
|
41
|
-
get moreTab() {
|
|
42
|
-
return this.querySelector(':scope>navigation-stack:has(> navigation-stack,> navigation-split-view)');
|
|
43
|
-
}
|
|
44
|
-
connectedCallback() {
|
|
45
|
-
if (devFlags.debug)
|
|
46
|
-
console.debug(`${_a.name} ⚡️ connect`);
|
|
47
|
-
this.#cssStyleObserver = new CSSStyleObserver({
|
|
48
|
-
properties: ['--adaptable-tab-bar-placement-index'],
|
|
49
|
-
});
|
|
50
|
-
this.#cssStyleObserver.observe(this, this.#handleStyleChange);
|
|
51
|
-
Snapshot.waitReady.then(() => self.requestAnimationFrame(this.#handleStyleChange)); // Snapshot.waitReady.then(this.#handleStyleChange)
|
|
52
|
-
CleanupRegistry.register(this, onoff([
|
|
53
|
-
{ types: 'tabreveal tabswap', listener: this.#debouncedHandler },
|
|
54
|
-
{ types: 'beforetabreveal beforetabswap', listener: this.#addAnimations },
|
|
55
|
-
{ types: 'tab-view:adaptable-tab-bar-placement-change', listener: this.#handleAdaptableTabBarPlacementChange },
|
|
56
|
-
{ types: 'pagereveal', listener: this.#handleTabViewPagereveal },
|
|
57
|
-
{
|
|
58
|
-
types: 'click',
|
|
59
|
-
listener: this.#handleSummaryClick,
|
|
60
|
-
},
|
|
61
|
-
], this).on());
|
|
62
|
-
}
|
|
63
|
-
#handleSummaryClick = ({ target }) => {
|
|
64
|
-
if (!(target instanceof HTMLElement))
|
|
65
|
-
return;
|
|
66
|
-
const summary = target.closest('summary');
|
|
67
|
-
if (!summary)
|
|
68
|
-
return;
|
|
69
|
-
if (0 === $.siblings('[aria-selected=true]', summary).length)
|
|
70
|
-
return;
|
|
71
|
-
if (!summary.closest('scroll-view')?.matches('tab-view > [is=sidebar-view] > scroll-view'))
|
|
72
|
-
return;
|
|
73
|
-
const form = summary.closest('[is=form-view]');
|
|
74
|
-
if (!form)
|
|
75
|
-
return;
|
|
76
|
-
const style = self.getComputedStyle(form);
|
|
77
|
-
if ('sidebar' !== style.getPropertyValue('--list-style'))
|
|
78
|
-
return;
|
|
79
|
-
this.#addAnimations(new CustomEvent('beforetabreveal', { detail: { tag: '', ms: cssTime(`${this.computedStyleMap().get(`--tabbar-after-tabreveal-duration`)}`) }, bubbles: true, composed: true }));
|
|
80
|
-
};
|
|
81
|
-
#handleTabViewPagereveal = (evt) => {
|
|
82
|
-
if (devFlags.debug)
|
|
83
|
-
console.debug(`${_a.name} ⚡️ ${evt?.type}`);
|
|
84
|
-
void this.#syncBodyFace();
|
|
85
|
-
};
|
|
86
|
-
#handleStyleChange = () => {
|
|
87
|
-
if (devFlags.debug)
|
|
88
|
-
console.debug(`${_a.name} ⚡️ style`);
|
|
89
|
-
const style = self.getComputedStyle(this);
|
|
90
|
-
const placement = style.getPropertyValue('--adaptable-tab-bar-placement'), // or do it manually without any computedstyle
|
|
91
|
-
newValue = TAB_BAR_PLACEMENTS.includes(placement) ? placement : 'bottom-bar';
|
|
92
|
-
if (newValue !== this.#cachedAdaptableTabBarPlacement) {
|
|
93
|
-
const oldValue = this.#cachedAdaptableTabBarPlacement;
|
|
94
|
-
this.#cachedAdaptableTabBarPlacement = newValue;
|
|
95
|
-
this.dispatchEvent(new CustomEvent('tab-view:adaptable-tab-bar-placement-change', {
|
|
96
|
-
detail: { oldValue, newValue },
|
|
97
|
-
bubbles: true,
|
|
98
|
-
composed: true,
|
|
99
|
-
}));
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
#handleAdaptableTabBarPlacementChange = (evt) => {
|
|
103
|
-
if (devFlags.debug)
|
|
104
|
-
console.debug(`${_a.name} ⚡️ ${evt?.type}`);
|
|
105
|
-
if ('bottom-bar' !== evt.detail.oldValue)
|
|
106
|
-
return; // button triggers should happen, ONLY when going FROM bottom-bar TO anything else
|
|
107
|
-
const innerSelection = this.moreTab?.querySelector(':scope>navigation-stack:not([hidden]),:scope>navigation-split-view:not([hidden])')?.id;
|
|
108
|
-
if (innerSelection) {
|
|
109
|
-
const btn = this.querySelector(`[is="tab-item"][value="${CSS.escape(innerSelection)}"]`);
|
|
110
|
-
// NOTE: simulate btn click BU WITHOUT tabroot functionality!
|
|
111
|
-
if (btn) {
|
|
112
|
-
const newTab = this.querySelector(`#${btn.getAttribute('value')}`);
|
|
113
|
-
if (newTab) {
|
|
114
|
-
this.selectedTab = _a.gatherTab(newTab);
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
const outerSelection = this?.querySelector(':scope>navigation-stack:not([hidden]),:scope>navigation-split-view:not([hidden])')?.id;
|
|
120
|
-
if (outerSelection && outerSelection === this.moreTab?.id) {
|
|
121
|
-
const btn = this.querySelector(`[is="tab-item"]:not([value="${CSS.escape(outerSelection)}"])`);
|
|
122
|
-
// NOTE: simulate btn click BU WITHOUT tabroot functionality!
|
|
123
|
-
if (btn) {
|
|
124
|
-
const newTab = this.querySelector(`#${btn.getAttribute('value')}`);
|
|
125
|
-
if (newTab) {
|
|
126
|
-
this.selectedTab = _a.gatherTab(newTab);
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
};
|
|
132
|
-
get selectedTab() {
|
|
133
|
-
return [...this.querySelectorAll('navigation-stack:not([hidden]),navigation-split-view:not([hidden])')];
|
|
134
|
-
}
|
|
135
|
-
set selectedTab(tabs) {
|
|
136
|
-
const valid = [...tabs].every((el, i, arr) => !i || arr[i - 1].contains(el));
|
|
137
|
-
if (0 === tabs.length)
|
|
138
|
-
throw new Error('Element not found');
|
|
139
|
-
if (!valid)
|
|
140
|
-
throw new Error('selectedTab[] must be in order of parent>child. You provided an element that contains the previous sibling.');
|
|
141
|
-
//
|
|
142
|
-
const selectors = [':not(:is(:scope>{{tag}}))', ':is(:scope>{{tag}})']; // first nested ones, then root ones
|
|
143
|
-
const ms = cssTime(`${this.computedStyleMap().get(`--tabbar-after-tabreveal-duration`)}`);
|
|
144
|
-
for (const selector of selectors)
|
|
145
|
-
for (const ns of this.querySelectorAll(`navigation-stack:not([hidden])${selector.replace('{{tag}}', 'navigation-stack')},navigation-split-view:not([hidden])${selector.replace('{{tag}}', 'navigation-split-view')}`)) {
|
|
146
|
-
if (!tabs.some((tab) => !ns.contains(tab)))
|
|
147
|
-
continue; // shouldRun
|
|
148
|
-
ns.dispatchEvent(new CustomEvent('beforetabswap', { detail: { tag: ns.id, ms }, bubbles: true, composed: true }));
|
|
149
|
-
ns.hidden = true; // triggers
|
|
150
|
-
}
|
|
151
|
-
for (const selector of selectors.reverse())
|
|
152
|
-
for (const ns of this.querySelectorAll(`navigation-stack[hidden]${selector.replace('{{tag}}', 'navigation-stack')},navigation-split-view[hidden]${selector.replace('{{tag}}', 'navigation-split-view')}`)) {
|
|
153
|
-
if (!tabs.some((tab) => ns.contains(tab)))
|
|
154
|
-
continue; // shouldRun
|
|
155
|
-
ns.dispatchEvent(new CustomEvent('beforetabreveal', { detail: { tag: ns.id, ms }, bubbles: true, composed: true }));
|
|
156
|
-
ns.hidden = false; // triggers
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
#addAnimations = (evt) => {
|
|
160
|
-
this.setAttribute('js-aftertabreveal', '');
|
|
161
|
-
// const ms = cssTime(`${this.computedStyleMap().get(`--tabbar-after-tabreveal-duration`)}`)
|
|
162
|
-
this.#afterTabRevealDelay.next(() => {
|
|
163
|
-
this.removeAttribute('js-aftertabreveal');
|
|
164
|
-
}, evt.detail.ms);
|
|
165
|
-
};
|
|
166
|
-
#handleSelectionChange = (evt) => {
|
|
167
|
-
this.#triggerToggleEvent(evt);
|
|
168
|
-
};
|
|
169
|
-
#triggerToggleEvent = (evt) => {
|
|
170
|
-
const eventType = 'tab-view:toggle';
|
|
171
|
-
void this.#syncBodyFace();
|
|
172
|
-
if (devFlags.debug)
|
|
173
|
-
console.debug(`${_a.name} 💡 ${eventType}`);
|
|
174
|
-
this.dispatchEvent(new CustomEvent(eventType, { detail: { selection: this.selectedTab }, bubbles: true, composed: true }));
|
|
175
|
-
};
|
|
176
|
-
#syncBodyFace = async () => {
|
|
177
|
-
if (!(await frame(this)))
|
|
178
|
-
return;
|
|
179
|
-
const tab = this.selectedTab.at(-1), //event.detail.selection.at(-1), //document.querySelector(`#${}`),
|
|
180
|
-
path = new NavigationPath(tab), sv = [path, ...path.children()]
|
|
181
|
-
.filter((item) => item.component?.matches(':not(dialog)'))
|
|
182
|
-
.map((item) => item.body)
|
|
183
|
-
.filter(Boolean)
|
|
184
|
-
.at(-1); //queryBodyAll(tab).at(-1)
|
|
185
|
-
if (!sv)
|
|
186
|
-
return;
|
|
187
|
-
// const style = self.getComputedStyle(sv),
|
|
188
|
-
// hostStyle = self.getComputedStyle(document.documentElement)
|
|
189
|
-
// console.log(999, tab, style.getPropertyValue('--face'), hostStyle.getPropertyValue('--face'))
|
|
190
|
-
if (!sv.style.getPropertyValue('--face'))
|
|
191
|
-
return document.body.style.removeProperty('--face');
|
|
192
|
-
// if (style.getPropertyValue('--face') === hostStyle.getPropertyValue('--face'))
|
|
193
|
-
document.body.style.setProperty('--face', sv.style.getPropertyValue('--face'));
|
|
194
|
-
// if (tab?.matches('tab-view>navigation-stack>:scope')) return document.body.style.setProperty('--face', style.getPropertyValue('--face'))
|
|
195
|
-
// if (tab?.matches('tab-view>:scope')) return document.body.style.setProperty('--face', style.getPropertyValue('--face'))
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
_a = TabView;
|