@swiftwc/ui 0.0.0-dev.11 → 0.0.0-dev.110
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/generated/buses/alert-dialog.d.ts +2 -0
- package/generated/buses/alert-dialog.js +1 -0
- package/generated/buses/confirmation-dialog.d.ts +2 -0
- package/generated/buses/confirmation-dialog.js +1 -0
- package/generated/buses/index.d.ts +6 -0
- package/generated/buses/index.js +6 -0
- package/generated/buses/lifecycle-observer.d.ts +2 -0
- package/generated/buses/lifecycle-observer.js +1 -0
- package/generated/client/index.d.ts +24 -10
- package/generated/client/index.js +179 -194
- package/generated/components/alert-dialog.d.ts +11 -0
- package/generated/components/alert-dialog.js +94 -0
- package/generated/components/body-view.d.ts +8 -0
- package/generated/components/body-view.js +6 -2
- package/generated/components/bordered-button.d.ts +10 -0
- package/generated/components/bordered-button.js +36 -3
- package/generated/components/bordered-prominent-button.d.ts +10 -0
- package/generated/components/bordered-prominent-button.js +36 -3
- package/generated/components/borderless-button.d.ts +9 -1
- package/generated/components/borderless-button.js +29 -11
- package/generated/components/color-scheme.d.ts +12 -0
- package/generated/components/color-scheme.js +51 -0
- package/generated/components/confirmation-dialog.d.ts +4 -1
- package/generated/components/confirmation-dialog.js +38 -32
- package/generated/components/content-unavailable.d.ts +30 -0
- package/generated/components/content-unavailable.js +79 -0
- package/generated/components/date-picker.d.ts +21 -15
- package/generated/components/date-picker.js +126 -88
- package/generated/components/detail-placeholder.d.ts +11 -0
- package/generated/components/detail-placeholder.js +15 -0
- package/generated/components/disclosure-group.d.ts +8 -0
- package/generated/components/disclosure-group.js +18 -7
- package/generated/components/fine-tooltip.d.ts +15 -0
- package/generated/components/fine-tooltip.js +108 -0
- package/generated/components/form-view.d.ts +10 -0
- package/generated/components/form-view.js +8 -3
- package/generated/components/glass-button.d.ts +10 -0
- package/generated/components/glass-button.js +36 -3
- package/generated/components/glass-prominent-button.d.ts +10 -0
- package/generated/components/glass-prominent-button.js +36 -3
- package/generated/components/h-divider.d.ts +11 -0
- package/generated/components/h-divider.js +15 -0
- package/generated/components/h-stack.d.ts +22 -0
- package/generated/components/h-stack.js +24 -0
- package/generated/components/image-view.d.ts +18 -0
- package/generated/components/image-view.js +65 -0
- package/generated/components/index.d.ts +15 -3
- package/generated/components/index.js +15 -3
- package/generated/components/label-view.d.ts +19 -1
- package/generated/components/label-view.js +63 -62
- package/generated/components/labeled-content.d.ts +33 -0
- package/generated/components/labeled-content.js +160 -0
- package/generated/components/list-view.d.ts +14 -0
- package/generated/components/list-view.js +12 -17
- package/generated/components/menu-view.d.ts +12 -1
- package/generated/components/menu-view.js +63 -65
- package/generated/components/navigation-large-title.d.ts +11 -0
- package/generated/components/navigation-large-title.js +11 -5
- package/generated/components/navigation-split-view.d.ts +9 -1
- package/generated/components/navigation-split-view.js +10 -6
- package/generated/components/navigation-stack.d.ts +9 -1
- package/generated/components/navigation-stack.js +13 -11
- package/generated/components/navigation-title.d.ts +11 -1
- package/generated/components/navigation-title.js +58 -55
- package/generated/components/picker-view.d.ts +48 -7
- package/generated/components/picker-view.js +971 -261
- package/generated/components/plain-button.js +3 -3
- package/generated/components/progress-view.d.ts +20 -0
- package/generated/components/progress-view.js +120 -0
- package/generated/components/screen-view.js +2 -1
- package/generated/components/scroll-view-proxy.d.ts +13 -0
- package/generated/components/scroll-view-proxy.js +15 -0
- package/generated/components/scroll-view.d.ts +13 -1
- package/generated/components/scroll-view.js +140 -97
- package/generated/components/search-view.d.ts +12 -0
- package/generated/components/search-view.js +24 -0
- package/generated/components/section-view.d.ts +13 -1
- package/generated/components/section-view.js +38 -58
- package/generated/components/sheet-view.d.ts +4 -2
- package/generated/components/sheet-view.js +10 -39
- package/generated/components/sidebar-toggle.d.ts +9 -1
- package/generated/components/sidebar-toggle.js +46 -69
- package/generated/components/sidebar-view.d.ts +3 -0
- package/generated/components/sidebar-view.js +16 -9
- package/generated/components/sticky-container.d.ts +6 -1
- package/generated/components/sticky-container.js +9 -7
- package/generated/components/tab-bar.d.ts +3 -0
- package/generated/components/tab-bar.js +17 -13
- package/generated/components/tab-item.d.ts +3 -0
- package/generated/components/tab-item.js +20 -13
- package/generated/components/tab-view.d.ts +13 -4
- package/generated/components/tab-view.js +25 -89
- package/generated/components/table-view.d.ts +19 -0
- package/generated/components/table-view.js +88 -107
- package/generated/components/text-field.d.ts +19 -6
- package/generated/components/text-field.js +127 -99
- package/generated/components/text-view.d.ts +11 -0
- package/generated/components/text-view.js +16 -0
- package/generated/components/toggle-view.d.ts +43 -0
- package/generated/components/toggle-view.js +366 -0
- package/generated/components/tool-bar-item-group.d.ts +8 -0
- package/generated/components/tool-bar-item-group.js +22 -4
- package/generated/components/tool-bar-item.d.ts +12 -1
- package/generated/components/tool-bar-item.js +57 -10
- package/generated/components/tool-bar.d.ts +19 -0
- package/generated/components/tool-bar.js +48 -33
- package/generated/components/v-divider.d.ts +11 -0
- package/generated/components/v-divider.js +15 -0
- package/generated/components/v-keyboard.d.ts +8 -1
- package/generated/components/v-keyboard.js +11 -9
- package/generated/components/v-stack.d.ts +20 -0
- package/generated/components/v-stack.js +18 -2
- package/generated/css/index.css +4617 -1266
- package/generated/events/alert-dialog.d.ts +13 -0
- package/generated/events/alert-dialog.js +1 -0
- package/generated/events/confirmation-dialog.d.ts +7 -2
- package/generated/events/date-picker.d.ts +6 -1
- package/generated/events/index.d.ts +2 -0
- package/generated/events/index.js +2 -0
- package/generated/events/lifecycle-observer.d.ts +10 -2
- package/generated/events/picker-view.d.ts +22 -1
- package/generated/events/scroll-view.d.ts +10 -2
- package/generated/events/tab-view.d.ts +38 -8
- package/generated/events/text-field.d.ts +6 -1
- package/generated/events/toggle-view.d.ts +14 -0
- package/generated/events/toggle-view.js +1 -0
- package/generated/i18n/index.d.ts +19 -10
- package/generated/i18n/index.js +79 -54
- package/generated/i18n/locales/el.d.ts +16 -0
- package/generated/i18n/locales/el.js +16 -0
- package/generated/i18n/locales/en.d.ts +16 -0
- package/generated/i18n/locales/en.js +16 -0
- package/generated/i18n/locales/index.d.ts +4 -0
- package/generated/i18n/locales/index.js +4 -0
- package/generated/internal/class/css-style-observer.js +2 -2
- package/generated/internal/class/form-associated-base.d.ts +0 -4
- package/generated/internal/class/form-associated-base.js +22 -39
- package/generated/internal/class/mutation-observer-set.d.ts +9 -0
- package/generated/internal/class/mutation-observer-set.js +42 -0
- package/generated/internal/class/mutation-observer-singleton.js +18 -0
- package/generated/internal/class/navigation-view.d.ts +1 -1
- package/generated/internal/class/navigation-view.js +36 -43
- package/generated/internal/decorators/adaptive-slot.d.ts +1 -0
- package/generated/internal/decorators/adaptive-slot.js +47 -0
- package/generated/internal/decorators/custom-element.d.ts +1 -1
- package/generated/internal/decorators/custom-element.js +2 -1
- package/generated/internal/decorators/index.d.ts +6 -0
- package/generated/internal/decorators/index.js +6 -0
- package/generated/internal/decorators/microtask-on-connected.d.ts +39 -0
- package/generated/internal/decorators/microtask-on-connected.js +67 -0
- package/generated/internal/flags.d.ts +4 -0
- package/generated/internal/flags.js +1 -0
- package/generated/internal/privateNamespace.d.ts +10 -0
- package/generated/internal/privateNamespace.js +159 -1
- package/generated/internal/utils/$.d.ts +9 -0
- package/generated/internal/utils/$.js +11 -0
- package/generated/internal/utils/compare-big-decimals.js +7 -17
- package/generated/internal/utils/debug.d.ts +1 -0
- package/generated/internal/utils/debug.js +4 -0
- package/generated/internal/utils/define-translations.d.ts +1 -0
- package/generated/internal/utils/define-translations.js +3 -0
- package/generated/internal/utils/ensure-placeholder.d.ts +1 -0
- package/generated/internal/utils/ensure-placeholder.js +41 -0
- package/generated/internal/utils/index.d.ts +39 -2
- package/generated/internal/utils/index.js +39 -3
- package/generated/internal/utils/is-inside.d.ts +1 -0
- package/generated/internal/utils/is-inside.js +4 -0
- package/generated/internal/utils/kebab-case.js +6 -9
- package/generated/internal/utils/list-active.js +67 -12
- package/generated/internal/utils/touch-glass.js +5 -5
- package/generated/internal/vendor/morphdom.d.ts +6 -0
- package/generated/internal/vendor/morphdom.js +720 -0
- package/generated/morphdom/index.d.ts +8 -0
- package/generated/morphdom/index.js +8 -0
- package/generated/morphdom/morph.d.ts +4 -0
- package/generated/morphdom/morph.js +10 -0
- package/generated/morphdom/query-morph.d.ts +5 -0
- package/generated/morphdom/query-morph.js +12 -0
- package/generated/morphdom/render-to-string.d.ts +12 -0
- package/generated/morphdom/render-to-string.js +48 -0
- package/generated/morphdom/unsafe-html.d.ts +2 -0
- package/generated/morphdom/unsafe-html.js +4 -0
- package/generated/namespace-browser/base.d.ts +12 -3
- package/generated/namespace-browser/base.js +41 -18
- package/generated/namespace-browser/event.d.ts +10 -0
- package/generated/namespace-browser/event.js +1 -0
- package/generated/snapshot/index.d.ts +3 -1
- package/generated/snapshot/index.js +23 -2
- package/generated/tpl/html.d.ts +5 -0
- package/generated/tpl/html.js +7 -0
- package/generated/tpl/index.d.ts +6 -0
- package/generated/tpl/index.js +6 -0
- package/generated/tpl/is-template-result.d.ts +3 -0
- package/generated/tpl/is-template-result.js +1 -0
- package/generated/tpl/render.d.ts +2 -0
- package/generated/tpl/render.js +132 -0
- package/package.json +32 -7
- package/scss/_components.scss +15 -0
- package/scss/_functions.scss +10 -0
- package/scss/_maps.scss +293 -0
- package/scss/_mixins.scss +4 -0
- package/scss/_transitions.scss +6 -1
- package/scss/_utils.scss +2 -0
- package/scss/_vars.scss +9 -115
- package/scss/base/_layout.scss +17 -7
- package/scss/base/_reboot.scss +34 -1
- package/scss/base/_root.scss +143 -124
- package/scss/colors/_index.scss +328 -88
- package/scss/components/_alert-dialog.scss +111 -0
- package/scss/components/_bordered-button.scss +37 -0
- package/scss/components/_bordered-prominent-button.scss +46 -0
- package/scss/components/_borderless-button.scss +26 -0
- package/scss/components/_confirmation-dialog.scss +41 -49
- package/scss/components/_content-unavailable.scss +57 -0
- package/scss/components/_date-picker.scss +15 -15
- package/scss/components/_detail-placeholder.scss +1 -3
- package/scss/components/_disclosure-group.scss +85 -34
- package/scss/components/_fine-tooltip.scss +84 -0
- package/scss/components/_form-view.scss +63 -24
- package/scss/components/_glass-button.scss +37 -0
- package/scss/components/_glass-prominent-button.scss +47 -0
- package/scss/components/_group-box.scss +27 -0
- package/scss/components/_h-flex-stack.scss +23 -0
- package/scss/components/_h-stack.scss +6 -17
- package/scss/components/_image-view.scss +20 -0
- package/scss/components/_index.scss +69 -36
- package/scss/components/_label-view copy.scss.txt +420 -0
- package/scss/components/_label-view.scss +105 -120
- package/scss/components/_label-view.scss.txt +536 -0
- package/scss/components/_labeled-content.scss +67 -1
- package/scss/components/_list-view.scss +70 -29
- package/scss/components/_menu-view.scss +96 -61
- package/scss/components/_navigation-large-title.scss +23 -0
- package/scss/components/_navigation-split-view.scss +3 -3
- package/scss/components/_navigation-title.scss +1 -1
- package/scss/components/_picker-view.scss +270 -63
- package/scss/components/_plain-button.scss +8 -0
- package/scss/components/_progress-view.scss +98 -0
- package/scss/components/_scroll-view-proxy.scss +24 -22
- package/scss/components/_scroll-view-toolbars.scss +8 -2
- package/scss/components/_scroll-view.scss +16 -0
- package/scss/components/_search-view.scss +23 -0
- package/scss/components/_section-view.scss +23 -22
- package/scss/components/_sheet-view.scss +16 -6
- package/scss/components/_sidebar-toggle.scss +1 -4
- package/scss/components/_sticky-container.scss +1 -1
- package/scss/components/_tab-bar.scss +17 -3
- package/scss/components/_tab-view.scss +12 -2
- package/scss/components/_table-column.scss +4 -2
- package/scss/components/_table-row.scss +71 -3
- package/scss/components/_table-view.scss +27 -18
- package/scss/components/_text-field.scss +37 -17
- package/scss/components/_text-view.scss +57 -0
- package/scss/components/_toggle-view.scss +171 -0
- package/scss/components/_tool-bar-item.scss +34 -82
- package/scss/components/_tool-bar.scss +77 -57
- package/scss/components/_v-stack.scss +8 -2
- package/scss/final/_touch-glass.scss +31 -0
- package/scss/mixins/_button.scss +44 -0
- package/scss/mixins/_color.scss +16 -0
- package/scss/mixins/_dialog.scss +1 -0
- package/scss/mixins/_index.scss +73 -5
- package/scss/placeholders/_buttons.scss +46 -11
- package/scss/placeholders/_lists.scss +159 -126
- package/scss/transitions/_alert-dialog.scss +18 -0
- package/scss/transitions/_confirmation-dialog.scss +8 -0
- package/scss/transitions/_fine-tooltip.scss +21 -0
- package/scss/transitions/_menu-view.scss +17 -15
- package/scss/transitions/_progress-view.scss +23 -0
- package/scss/transitions/_sheet-view.scss +30 -0
- package/scss/transitions/_tab-bar.scss +6 -5
- package/scss/utils/_background.scss +52 -0
- package/scss/utils/_frame.scss +59 -40
- package/scss/utils/_index.scss +45 -56
- package/scss/utils/_scroll-view.scss +1 -1
- package/scss/utils/_spacing.scss +1 -1
- package/scss/utils/_stacks.scss +34 -164
- package/web-components.css-data/en.json +28 -0
- package/web-components.html-data/en.json +2456 -166
- package/generated/confirmation-dialog/index.d.ts +0 -1
- package/generated/confirmation-dialog/index.js +0 -1
- package/generated/internal/utils/cash/index.d.ts +0 -22
- package/generated/internal/utils/cash/index.js +0 -23
- package/generated/lifecycle-observer/index.d.ts +0 -1
- package/generated/lifecycle-observer/index.js +0 -1
- package/scss/transitions/_dialog.scss +0 -28
- /package/generated/internal/utils/{cash/ancestors.d.ts → ancestors.d.ts} +0 -0
- /package/generated/internal/utils/{cash/ancestors.js → ancestors.js} +0 -0
- /package/generated/internal/utils/{cash/next-all.d.ts → next-all.d.ts} +0 -0
- /package/generated/internal/utils/{cash/next-all.js → next-all.js} +0 -0
- /package/generated/internal/utils/{cash/next.d.ts → next.d.ts} +0 -0
- /package/generated/internal/utils/{cash/next.js → next.js} +0 -0
- /package/generated/internal/utils/{cash/prev-all.d.ts → prev-all.d.ts} +0 -0
- /package/generated/internal/utils/{cash/prev-all.js → prev-all.js} +0 -0
- /package/generated/internal/utils/{cash/prev.d.ts → prev.d.ts} +0 -0
- /package/generated/internal/utils/{cash/prev.js → prev.js} +0 -0
- /package/generated/internal/utils/{cash/prop.d.ts → prop.d.ts} +0 -0
- /package/generated/internal/utils/{cash/prop.js → prop.js} +0 -0
- /package/generated/internal/utils/{cash/siblings.d.ts → siblings.d.ts} +0 -0
- /package/generated/internal/utils/{cash/siblings.js → siblings.js} +0 -0
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
var _a;
|
|
2
2
|
import { I18n } from '../i18n';
|
|
3
3
|
import { CleanupRegistry } from '../internal/class/cleanup-registry';
|
|
4
|
-
import { FormAssociatedBase, getInternals
|
|
5
|
-
import {
|
|
4
|
+
import { FormAssociatedBase, getInternals } from '../internal/class/form-associated-base';
|
|
5
|
+
import { MutationObserverSet } from '../internal/class/mutation-observer-set';
|
|
6
|
+
import { $, clamp, debug, kebabCase, onoff, set } from '../internal/utils';
|
|
7
|
+
import { queryMorph } from '../morphdom';
|
|
8
|
+
import { html } from '../tpl';
|
|
6
9
|
const datePickerStyles = ['graphical', 'field', 'automatic'];
|
|
10
|
+
/**
|
|
11
|
+
* @summary A control that selects an absolute date.
|
|
12
|
+
*/
|
|
7
13
|
export class DatePicker extends FormAssociatedBase {
|
|
8
14
|
static get observedAttributes() {
|
|
9
15
|
return [
|
|
@@ -12,11 +18,17 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
12
18
|
* @type {"graphical"|"field"|"automatic"}
|
|
13
19
|
*/
|
|
14
20
|
'date-picker-style',
|
|
21
|
+
/**
|
|
22
|
+
* @type {boolean}
|
|
23
|
+
*/
|
|
15
24
|
'required',
|
|
16
25
|
'prompt',
|
|
17
26
|
'label',
|
|
18
27
|
'name',
|
|
19
28
|
'selection',
|
|
29
|
+
/**
|
|
30
|
+
* @type {boolean}
|
|
31
|
+
*/
|
|
20
32
|
'disabled',
|
|
21
33
|
'minimum',
|
|
22
34
|
'maximum',
|
|
@@ -24,9 +36,15 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
24
36
|
}
|
|
25
37
|
static #templates = new Map();
|
|
26
38
|
// #lastRenderedStyle?: DatePickerStyle //string | null
|
|
39
|
+
#renderValidityMsgs = (entries) => {
|
|
40
|
+
debug(`${_a.name} ⚡️ mutation`);
|
|
41
|
+
this.setValidity(this.validity, this.validationMessage);
|
|
42
|
+
};
|
|
27
43
|
#shadowRoot;
|
|
28
44
|
#customValidity = '';
|
|
29
|
-
#
|
|
45
|
+
#slots = new Map();
|
|
46
|
+
#validityObservers = new MutationObserverSet(this.#renderValidityMsgs);
|
|
47
|
+
// #validitiesSlot?: HTMLSlotElement
|
|
30
48
|
#inputs = [];
|
|
31
49
|
get #internals() {
|
|
32
50
|
return getInternals(this);
|
|
@@ -35,20 +53,19 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
35
53
|
if (!_a.#templates.has(this.datePickerStyle))
|
|
36
54
|
switch (this.datePickerStyle) {
|
|
37
55
|
default:
|
|
38
|
-
_a.#templates.set(this.datePickerStyle, $(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
</label>`, ''));
|
|
56
|
+
_a.#templates.set(this.datePickerStyle, $(html `<label part="root date-picker-stack">
|
|
57
|
+
<div part="root date-picker-label-stack">
|
|
58
|
+
<slot name="label"></slot>
|
|
59
|
+
</div>
|
|
60
|
+
<div part="root date-picker-input-stack">
|
|
61
|
+
<input type="text" name="month" inputmode="numeric" pattern="d*" minlength="1" maxlength="2" min="1" max="12" part="root input date-picker-form-input" />
|
|
62
|
+
<span part="root date-picker-separator"></span>
|
|
63
|
+
<input type="text" name="day" inputmode="numeric" pattern="d*" minlength="1" maxlength="2" min="1" max="31" part="root input date-picker-form-input" />
|
|
64
|
+
<span part="root date-picker-separator"></span>
|
|
65
|
+
<input type="text" name="year" inputmode="numeric" pattern="d*" minlength="4" maxlength="4" min="0" max="9999" part="root input date-picker-form-input" />
|
|
66
|
+
</div>
|
|
67
|
+
<slot name="validity-options" hidden></slot>
|
|
68
|
+
</label>`));
|
|
52
69
|
break;
|
|
53
70
|
}
|
|
54
71
|
return _a.#templates.get(this.datePickerStyle);
|
|
@@ -57,29 +74,12 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
57
74
|
super();
|
|
58
75
|
this.#shadowRoot = this.attachShadow({ mode: 'closed' });
|
|
59
76
|
}
|
|
60
|
-
connectedCallback() {
|
|
61
|
-
super.connectedCallback();
|
|
62
|
-
CleanupRegistry.register(this, onoff('click', this.#handleClick, this).on());
|
|
63
|
-
this.#render();
|
|
64
|
-
CleanupRegistry.register(this, onoff('change', () => {
|
|
65
|
-
this.#render();
|
|
66
|
-
}, I18n.on).on());
|
|
67
|
-
// finally
|
|
68
|
-
if (!this.hasAttribute('selection'))
|
|
69
|
-
return;
|
|
70
|
-
const [y = '', m = '', d = ''] = (this.getAttribute('selection') ?? '').split(/\D+/);
|
|
71
|
-
this.selection = { year: y, month: m, day: d };
|
|
72
|
-
this.#sendValueToForm(false);
|
|
73
|
-
}
|
|
74
|
-
disconnectedCallback() {
|
|
75
|
-
super.disconnectedCallback();
|
|
76
|
-
}
|
|
77
77
|
attributeChangedCallback(name, oldValue, newValue) {
|
|
78
|
-
|
|
78
|
+
debug(`${_a.name} ⚡️ attr-change [${name}] ("${oldValue}" → "${newValue}")`);
|
|
79
79
|
switch (name) {
|
|
80
80
|
case 'selection':
|
|
81
|
-
const [y = '', m = '', d = ''] = (newValue ?? '').split(/\D+/)
|
|
82
|
-
this
|
|
81
|
+
// nothing happens// const [y = '', m = '', d = ''] = (newValue ?? '').split(/\D+/)
|
|
82
|
+
// this.#selectedDate = { year: y, month: m, day: d }
|
|
83
83
|
break;
|
|
84
84
|
case 'required':
|
|
85
85
|
for (const input of this.#inputs)
|
|
@@ -89,7 +89,7 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
89
89
|
case 'name':
|
|
90
90
|
case 'minimum':
|
|
91
91
|
case 'maximum':
|
|
92
|
-
this.#sendValueToForm();
|
|
92
|
+
this.#sendValueToForm(false);
|
|
93
93
|
break;
|
|
94
94
|
case 'prompt':
|
|
95
95
|
const [py = '', pm = '', pd = ''] = (newValue ?? '').split(/\D+/), map = { year: py, month: pm, day: pd };
|
|
@@ -97,14 +97,8 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
97
97
|
input.setAttribute('placeholder', map[input.name] ?? '');
|
|
98
98
|
break;
|
|
99
99
|
case 'label':
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
label ??= this.appendChild($(`<span slot="label"></span>`));
|
|
103
|
-
label.textContent = newValue;
|
|
104
|
-
}
|
|
105
|
-
else
|
|
106
|
-
label?.remove();
|
|
107
|
-
this.#sendValueToForm();
|
|
100
|
+
queryMorph('[slot=label]', html `<label-view slot="label" foreground="secondary">${newValue ? html `<span>${newValue}</span>` : null}</label-view>`, this);
|
|
101
|
+
// this.#sendValueToForm()
|
|
108
102
|
break;
|
|
109
103
|
case 'disabled':
|
|
110
104
|
for (const input of this.#inputs)
|
|
@@ -112,22 +106,41 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
112
106
|
break;
|
|
113
107
|
}
|
|
114
108
|
}
|
|
109
|
+
disconnectedCallback() {
|
|
110
|
+
super.disconnectedCallback();
|
|
111
|
+
this.#validityObservers.unobserveAll();
|
|
112
|
+
}
|
|
113
|
+
connectedCallback() {
|
|
114
|
+
super.connectedCallback();
|
|
115
|
+
CleanupRegistry.register(this, onoff('click', this.#handleClick, this).on());
|
|
116
|
+
this.#render();
|
|
117
|
+
CleanupRegistry.register(this, onoff('localechange', () => {
|
|
118
|
+
this.#render();
|
|
119
|
+
}, I18n.on).on());
|
|
120
|
+
// finally
|
|
121
|
+
if (!this.hasAttribute('selection'))
|
|
122
|
+
return;
|
|
123
|
+
const [y = '', m = '', d = ''] = (this.getAttribute('selection') ?? '').split(/\D+/);
|
|
124
|
+
this.#selectedDate = { year: y, month: m, day: d };
|
|
125
|
+
this.#sendValueToForm(false);
|
|
126
|
+
}
|
|
115
127
|
get datePickerStyle() {
|
|
116
|
-
return datePickerStyles.includes(this.getAttribute('date-picker-style') ?? '')
|
|
117
|
-
? this.getAttribute('date-picker-style')
|
|
118
|
-
: 'automatic';
|
|
128
|
+
return datePickerStyles.includes(this.getAttribute('date-picker-style') ?? '') ? this.getAttribute('date-picker-style') : 'automatic';
|
|
119
129
|
}
|
|
120
130
|
#render() {
|
|
121
|
-
|
|
122
|
-
if (!this.isConnected)
|
|
123
|
-
return;
|
|
131
|
+
debug(`${_a.name} ⚡️ #render (${this.datePickerStyle})`);
|
|
124
132
|
// if (this.#lastRenderedStyle === this.datePickerStyle) return // skip if already applied
|
|
125
133
|
// this.#lastRenderedStyle = this.datePickerStyle
|
|
126
134
|
// clear shadow DOM
|
|
127
135
|
this.#shadowRoot.replaceChildren(document.importNode(this.template, true));
|
|
128
|
-
this
|
|
136
|
+
CleanupRegistry.unregister(this, 'slots');
|
|
137
|
+
for (const slot of this.#shadowRoot.querySelectorAll('slot'))
|
|
138
|
+
this.#slots?.set(slot.name, slot);
|
|
139
|
+
CleanupRegistry.register(this, () => {
|
|
140
|
+
this.#slots = new Map();
|
|
141
|
+
}, 'slots');
|
|
129
142
|
CleanupRegistry.unregister(this, 'validities');
|
|
130
|
-
CleanupRegistry.register(this, onoff(
|
|
143
|
+
CleanupRegistry.register(this, onoff('slotchange', this.#handleValiditiesSlotchange, this.#slots?.get('validity-options')).on(), 'validities');
|
|
131
144
|
switch (this.datePickerStyle) {
|
|
132
145
|
default:
|
|
133
146
|
const [yyyy = '', mm = '', dd = ''] = new Date().toISOString().split('T').shift()?.split('-') ?? [], map = { year: yyyy, month: mm, day: dd };
|
|
@@ -158,7 +171,16 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
158
171
|
break;
|
|
159
172
|
}
|
|
160
173
|
}
|
|
161
|
-
|
|
174
|
+
#handleValiditiesSlotchange = ({ type, target: slot }) => {
|
|
175
|
+
debug(`${_a.name} ⚡️ ${type}`);
|
|
176
|
+
if (!(slot instanceof HTMLSlotElement))
|
|
177
|
+
return;
|
|
178
|
+
const assigned = slot.assignedElements();
|
|
179
|
+
this.#validityObservers.syncObservations(assigned, ['value', 'label']);
|
|
180
|
+
// if (0 < assigned.length)
|
|
181
|
+
this.#renderValidityMsgs([]);
|
|
182
|
+
};
|
|
183
|
+
get #selectedDate() {
|
|
162
184
|
const map = Object.fromEntries(this.#inputs.map(({ name, value }) => [name, value]));
|
|
163
185
|
return {
|
|
164
186
|
year: map.year ?? '',
|
|
@@ -166,7 +188,7 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
166
188
|
day: map.day ?? '',
|
|
167
189
|
};
|
|
168
190
|
}
|
|
169
|
-
set
|
|
191
|
+
set #selectedDate(v) {
|
|
170
192
|
for (const input of this.#inputs) {
|
|
171
193
|
const nv = v[input.name] ?? '', pattern = /^(\d+)?$/;
|
|
172
194
|
let finalValue = pattern.test(nv) ? nv : '', parsedValue = parseInt(finalValue);
|
|
@@ -178,8 +200,11 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
178
200
|
}
|
|
179
201
|
}
|
|
180
202
|
#handleClick = (evt) => {
|
|
181
|
-
|
|
182
|
-
const
|
|
203
|
+
debug(`${_a.name} ⚡️ ${evt?.type}`);
|
|
204
|
+
const { target } = evt;
|
|
205
|
+
if (!(target instanceof HTMLElement))
|
|
206
|
+
return;
|
|
207
|
+
const input = target.closest('input');
|
|
183
208
|
if (input)
|
|
184
209
|
return;
|
|
185
210
|
this.#shadowRoot.querySelector('input.focus')?.focus?.();
|
|
@@ -210,7 +235,7 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
210
235
|
else
|
|
211
236
|
this.setValidity({});
|
|
212
237
|
}
|
|
213
|
-
const selection = `${this.
|
|
238
|
+
const selection = `${this.#selectedDate.year}-${this.#selectedDate.month}-${this.#selectedDate.day}`;
|
|
214
239
|
const entries = new FormData();
|
|
215
240
|
entries.append(this.name, selection);
|
|
216
241
|
this.#internals.setFormValue(entries);
|
|
@@ -218,9 +243,9 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
218
243
|
this.dispatchEvent(new CustomEvent('selection', { detail: { selection }, bubbles: true, composed: true }));
|
|
219
244
|
};
|
|
220
245
|
#handleInputPaste = (evt) => {
|
|
221
|
-
|
|
222
|
-
const input = evt
|
|
223
|
-
if (!input)
|
|
246
|
+
debug(`${_a.name} ⚡️ ${evt?.type}`);
|
|
247
|
+
const { target: input } = evt;
|
|
248
|
+
if (!(input instanceof HTMLInputElement))
|
|
224
249
|
return;
|
|
225
250
|
evt.preventDefault();
|
|
226
251
|
const data = [...`${(evt.clipboardData?.getData('text') ?? '').trim()}`].reduce((acc, ch, i) => {
|
|
@@ -240,9 +265,9 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
240
265
|
this.#sendValueToForm();
|
|
241
266
|
};
|
|
242
267
|
#handleInputBeforeinput = (evt) => {
|
|
243
|
-
|
|
244
|
-
const input = evt
|
|
245
|
-
if (!input)
|
|
268
|
+
debug(`${_a.name} ⚡️ ${evt?.type}`);
|
|
269
|
+
const { target: input } = evt;
|
|
270
|
+
if (!(input instanceof HTMLInputElement))
|
|
246
271
|
return;
|
|
247
272
|
if ('insertText' !== evt.inputType)
|
|
248
273
|
return;
|
|
@@ -263,7 +288,9 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
263
288
|
}
|
|
264
289
|
};
|
|
265
290
|
#handleInputKeydown = ({ type, target, key }) => {
|
|
266
|
-
|
|
291
|
+
debug(`${_a.name} ⚡️ ${type}`);
|
|
292
|
+
if (!(target instanceof HTMLInputElement))
|
|
293
|
+
return;
|
|
267
294
|
const input = target;
|
|
268
295
|
if (!input)
|
|
269
296
|
return;
|
|
@@ -280,13 +307,15 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
280
307
|
this.#inputs[index]?.focus();
|
|
281
308
|
};
|
|
282
309
|
#handleInputFocus = (evt) => {
|
|
283
|
-
|
|
310
|
+
debug(`${_a.name} ⚡️ ${evt?.type}`);
|
|
284
311
|
for (const input of this.#inputs)
|
|
285
312
|
input.classList.toggle('focus', input === evt.target);
|
|
286
313
|
};
|
|
287
|
-
#handleInputBlur = (
|
|
288
|
-
|
|
289
|
-
|
|
314
|
+
#handleInputBlur = ({ target, type }) => {
|
|
315
|
+
debug(`${_a.name} ⚡️ ${type}`);
|
|
316
|
+
if (!(target instanceof HTMLInputElement))
|
|
317
|
+
return;
|
|
318
|
+
const input = target;
|
|
290
319
|
if (0 === input.value.length)
|
|
291
320
|
return;
|
|
292
321
|
const finalText = `${clamp(this.value[input.name] ?? '0', _a.#min(input), _a.#max(input))}`.padStart(parseInt(input.getAttribute('maxlength') ?? '0'), '0');
|
|
@@ -296,10 +325,12 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
296
325
|
this.#sendValueToForm();
|
|
297
326
|
};
|
|
298
327
|
#handleInputInput = (evt) => {
|
|
299
|
-
|
|
328
|
+
debug(`${_a.name} ⚡️ ${evt?.type}`);
|
|
300
329
|
this.#sendValueToForm();
|
|
301
330
|
};
|
|
302
|
-
|
|
331
|
+
/**
|
|
332
|
+
* Form participation property
|
|
333
|
+
*/
|
|
303
334
|
get name() {
|
|
304
335
|
return this.getAttribute('name') ?? this.getAttribute('label') ?? this.querySelector(':scope>[slot=label]')?.textContent ?? '';
|
|
305
336
|
}
|
|
@@ -313,6 +344,10 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
313
344
|
day: (map.day ?? '').padStart(2, '0'),
|
|
314
345
|
};
|
|
315
346
|
}
|
|
347
|
+
/**
|
|
348
|
+
* Returns the value as a Date object.
|
|
349
|
+
* @type {Date|null}
|
|
350
|
+
*/
|
|
316
351
|
get valueAsDate() {
|
|
317
352
|
try {
|
|
318
353
|
const d = new Date(`${this.value.year}-${this.value.month}-${this.value.day}`);
|
|
@@ -379,16 +414,16 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
379
414
|
const key = k; // ✅ type-safe cast
|
|
380
415
|
if (true !== flags[key])
|
|
381
416
|
continue;
|
|
382
|
-
for (const el of this.#
|
|
417
|
+
for (const el of this.#slots?.get('validity-options')?.assignedElements({ flatten: true }) ?? []) {
|
|
383
418
|
if (!el.matches('option'))
|
|
384
419
|
continue;
|
|
385
|
-
const
|
|
386
|
-
if (`${kebabCase(key)}` ===
|
|
387
|
-
message =
|
|
420
|
+
const { label, value } = el;
|
|
421
|
+
if (`${kebabCase(key)}` === value) {
|
|
422
|
+
message = label;
|
|
388
423
|
break;
|
|
389
424
|
}
|
|
390
|
-
else if (`${kebabCase(key)}:${message}` ===
|
|
391
|
-
message =
|
|
425
|
+
else if (`${kebabCase(key)}:${message}` === value) {
|
|
426
|
+
message = label;
|
|
392
427
|
break;
|
|
393
428
|
}
|
|
394
429
|
}
|
|
@@ -401,7 +436,7 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
401
436
|
message = kebabCase(key);
|
|
402
437
|
break;
|
|
403
438
|
}
|
|
404
|
-
|
|
439
|
+
debug(`${_a.name} ⚡️ validity-change`);
|
|
405
440
|
return this.#internals.setValidity(flags, this.#customValidity || message, anchor ?? this.#inputs.at(0));
|
|
406
441
|
};
|
|
407
442
|
setCustomValidity = (message) => {
|
|
@@ -411,20 +446,23 @@ export class DatePicker extends FormAssociatedBase {
|
|
|
411
446
|
else
|
|
412
447
|
this.#sendValueToForm(false);
|
|
413
448
|
};
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
}
|
|
417
|
-
|
|
449
|
+
formStateRestoreCallback(state, reason) {
|
|
450
|
+
//
|
|
451
|
+
}
|
|
452
|
+
formAssociatedCallback(form) {
|
|
453
|
+
this.#sendValueToForm(false);
|
|
454
|
+
}
|
|
455
|
+
formDisabledCallback(disabled) {
|
|
418
456
|
for (const input of this.#inputs)
|
|
419
457
|
input.toggleAttribute('disabled', !disabled);
|
|
420
|
-
}
|
|
421
|
-
formResetCallback
|
|
422
|
-
this
|
|
458
|
+
}
|
|
459
|
+
formResetCallback() {
|
|
460
|
+
this.#selectedDate = {
|
|
423
461
|
year: '',
|
|
424
462
|
month: '',
|
|
425
463
|
day: '',
|
|
426
464
|
};
|
|
427
|
-
this.#sendValueToForm();
|
|
428
|
-
}
|
|
465
|
+
this.#sendValueToForm(false);
|
|
466
|
+
}
|
|
429
467
|
}
|
|
430
468
|
_a = DatePicker;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class DetailPlaceholder extends HTMLElement {
|
|
2
|
+
constructor();
|
|
3
|
+
connectedCallback(): void;
|
|
4
|
+
disconnectedCallback(): void;
|
|
5
|
+
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
|
|
6
|
+
}
|
|
7
|
+
declare global {
|
|
8
|
+
interface HTMLElementTagNameMap {
|
|
9
|
+
'detail-placeholder': DetailPlaceholder;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { debug } from '../internal/utils';
|
|
2
|
+
export class DetailPlaceholder extends HTMLElement {
|
|
3
|
+
constructor() {
|
|
4
|
+
super();
|
|
5
|
+
}
|
|
6
|
+
connectedCallback() {
|
|
7
|
+
debug(`${DetailPlaceholder.name} ⚡️ connect`);
|
|
8
|
+
}
|
|
9
|
+
disconnectedCallback() {
|
|
10
|
+
debug(`${DetailPlaceholder.name} ⚡️ disconnect`);
|
|
11
|
+
}
|
|
12
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
13
|
+
debug(`${DetailPlaceholder.name} ⚡️ attr-change [${name}]`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import { DetailsBase } from '../namespace-browser/base';
|
|
2
|
+
/**
|
|
3
|
+
* @summary A view that shows or hides another view when the user opens or closes it.
|
|
4
|
+
*
|
|
5
|
+
* @example <details is="disclosure-group"><summary><label-view title="Items"></label-view></summary><label-view title="Item 1"></label-view><label-view title="Item 2"></label-view><details is="disclosure-group"><summary><label-view title="Sub-items"></label-view></summary><label-view title="Sub-item 1"></label-view></details></details>
|
|
6
|
+
*
|
|
7
|
+
* @fires is-expanded
|
|
8
|
+
* @fires is-collapsed
|
|
9
|
+
*/
|
|
2
10
|
export declare class DisclosureGroup extends DetailsBase {
|
|
3
11
|
#private;
|
|
4
12
|
static get observedAttributes(): string[];
|
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
import { CleanupRegistry } from '../internal/class/cleanup-registry';
|
|
2
|
-
import { cssTime, onoff, timeout } from '../internal/utils';
|
|
2
|
+
import { cssTime, debug, onoff, timeout } from '../internal/utils';
|
|
3
3
|
import { DetailsBase } from '../namespace-browser/base';
|
|
4
4
|
const toggleTimers = new WeakMap();
|
|
5
|
+
/**
|
|
6
|
+
* @summary A view that shows or hides another view when the user opens or closes it.
|
|
7
|
+
*
|
|
8
|
+
* @example <details is="disclosure-group"><summary><label-view title="Items"></label-view></summary><label-view title="Item 1"></label-view><label-view title="Item 2"></label-view><details is="disclosure-group"><summary><label-view title="Sub-items"></label-view></summary><label-view title="Sub-item 1"></label-view></details></details>
|
|
9
|
+
*
|
|
10
|
+
* @fires is-expanded
|
|
11
|
+
* @fires is-collapsed
|
|
12
|
+
*/
|
|
5
13
|
export class DisclosureGroup extends DetailsBase {
|
|
6
14
|
static get observedAttributes() {
|
|
7
15
|
return [
|
|
8
16
|
/**
|
|
9
17
|
* The status of this element
|
|
18
|
+
* @type {boolean}
|
|
10
19
|
*/
|
|
11
20
|
'open',
|
|
12
21
|
];
|
|
@@ -15,15 +24,15 @@ export class DisclosureGroup extends DetailsBase {
|
|
|
15
24
|
super();
|
|
16
25
|
}
|
|
17
26
|
attributeChangedCallback(name, oldValue, newValue) {
|
|
18
|
-
|
|
27
|
+
debug(`${DisclosureGroup.name} ⚡️ attr-change [${name}]`);
|
|
19
28
|
// if (CSS.supports('interpolate-size', 'allow-keywords')) return
|
|
20
29
|
}
|
|
21
30
|
static polyfillDisconnectedCallback(el) {
|
|
22
|
-
|
|
31
|
+
debug(`${DisclosureGroup.name} ⚡️ disconnect`);
|
|
23
32
|
CleanupRegistry.unregister(el);
|
|
24
33
|
}
|
|
25
34
|
static polyfillConnectedCallback(el) {
|
|
26
|
-
|
|
35
|
+
debug(`${DisclosureGroup.name} ⚡️ connect`);
|
|
27
36
|
const newValue = el.open ? 'open' : 'closed';
|
|
28
37
|
if (newValue !== el.dataset.state)
|
|
29
38
|
el.dataset.state = newValue;
|
|
@@ -33,9 +42,11 @@ export class DisclosureGroup extends DetailsBase {
|
|
|
33
42
|
toggleTimers.delete(el);
|
|
34
43
|
});
|
|
35
44
|
}
|
|
36
|
-
static #handleToggle = async (
|
|
37
|
-
|
|
38
|
-
|
|
45
|
+
static #handleToggle = async ({ type, currentTarget: details }) => {
|
|
46
|
+
debug(`${DisclosureGroup.name} ⚡️ ${type}`);
|
|
47
|
+
if (!(details instanceof HTMLDetailsElement))
|
|
48
|
+
return;
|
|
49
|
+
const newValue = details.open ? 'opening' : 'closing';
|
|
39
50
|
if (newValue !== details.dataset.state)
|
|
40
51
|
details.dataset.state = newValue;
|
|
41
52
|
if (!toggleTimers.has(details))
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @summary A tooltip that shows an unobtrusive helpful message on pointer:fine screens. Use it by adding a `help` attribute to any element.
|
|
3
|
+
*/
|
|
4
|
+
export declare class FineTooltip extends HTMLElement {
|
|
5
|
+
#private;
|
|
6
|
+
constructor();
|
|
7
|
+
connectedCallback(): void;
|
|
8
|
+
disconnectedCallback(): void;
|
|
9
|
+
hidePopover(): void;
|
|
10
|
+
}
|
|
11
|
+
declare global {
|
|
12
|
+
interface HTMLElementTagNameMap {
|
|
13
|
+
'fine-tooltip': FineTooltip;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
var _a;
|
|
2
|
+
import { CleanupRegistry } from '../internal/class/cleanup-registry';
|
|
3
|
+
import { $, debug, onoff } from '../internal/utils';
|
|
4
|
+
import { html } from '../tpl';
|
|
5
|
+
/**
|
|
6
|
+
* @summary A tooltip that shows an unobtrusive helpful message on pointer:fine screens. Use it by adding a `help` attribute to any element.
|
|
7
|
+
*/
|
|
8
|
+
export class FineTooltip extends HTMLElement {
|
|
9
|
+
constructor() {
|
|
10
|
+
super();
|
|
11
|
+
}
|
|
12
|
+
#handleTriggerRemovalMutation = (mutations) => {
|
|
13
|
+
if (this.#queryTrigger?.isConnected)
|
|
14
|
+
return;
|
|
15
|
+
this?.remove();
|
|
16
|
+
};
|
|
17
|
+
#handleTriggerAttrMutation = (mutations) => {
|
|
18
|
+
for (const { target, attributeName } of mutations)
|
|
19
|
+
if (target instanceof HTMLElement && attributeName)
|
|
20
|
+
this.#render(target.getAttribute(attributeName));
|
|
21
|
+
};
|
|
22
|
+
#handleMeasure = ([{ target, borderBoxSize }]) => {
|
|
23
|
+
debug(`${_a.name} ⚡️ measure`);
|
|
24
|
+
if (target.hasAttribute('closing'))
|
|
25
|
+
return;
|
|
26
|
+
if (!(target instanceof HTMLElement))
|
|
27
|
+
return;
|
|
28
|
+
const { top } = target.getBoundingClientRect();
|
|
29
|
+
const vpHeight = self.visualViewport?.height ?? 0, blockSize = borderBoxSize.at(0)?.blockSize ?? 0;
|
|
30
|
+
if (top > vpHeight - blockSize - 50) {
|
|
31
|
+
target.style.setProperty('position-area', 'top center');
|
|
32
|
+
target.style.setProperty('transform-origin', 'bottom');
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
#mutationObserver = new MutationObserver(this.#handleTriggerAttrMutation);
|
|
36
|
+
#mutationObserver2 = new MutationObserver(this.#handleTriggerRemovalMutation);
|
|
37
|
+
#resizeObserver = new ResizeObserver(this.#handleMeasure);
|
|
38
|
+
get #queryTrigger() {
|
|
39
|
+
const positionAnchor = this.style.positionAnchor;
|
|
40
|
+
if (!positionAnchor.startsWith('--help-'))
|
|
41
|
+
return;
|
|
42
|
+
const trigger = document.querySelector(`[style*="${CSS.escape(positionAnchor)}"][help]`);
|
|
43
|
+
return trigger ?? undefined;
|
|
44
|
+
}
|
|
45
|
+
#render = (str) => {
|
|
46
|
+
const label = this.querySelector(':scope>label-view') ?? this.appendChild($(html `<label-view></label-view>`, '>1'));
|
|
47
|
+
if (str)
|
|
48
|
+
label.setAttribute('title', str);
|
|
49
|
+
else
|
|
50
|
+
label.removeAttribute('title');
|
|
51
|
+
};
|
|
52
|
+
connectedCallback() {
|
|
53
|
+
debug(`${_a.name} ⚡️ connect`);
|
|
54
|
+
this.removeAttribute('closing');
|
|
55
|
+
this.popover = 'manual';
|
|
56
|
+
this.inert = true;
|
|
57
|
+
CleanupRegistry.register(this, onoff('toggle', this.#handleToggle, this).on());
|
|
58
|
+
CleanupRegistry.register(this, onoff('beforetoggle', this.#handleBeforetoggle, this).on());
|
|
59
|
+
this.showPopover();
|
|
60
|
+
}
|
|
61
|
+
disconnectedCallback() {
|
|
62
|
+
debug(`${_a.name} ⚡️ disconnect`);
|
|
63
|
+
this.#resizeObserver.unobserve(this);
|
|
64
|
+
this.#mutationObserver?.disconnect();
|
|
65
|
+
this.#mutationObserver2?.disconnect();
|
|
66
|
+
this.#queryTrigger?.style.removeProperty('anchor-name');
|
|
67
|
+
CleanupRegistry.unregister(this);
|
|
68
|
+
}
|
|
69
|
+
#handleToggle = ({ newState }) => {
|
|
70
|
+
if ('closed' !== newState)
|
|
71
|
+
return;
|
|
72
|
+
this.remove();
|
|
73
|
+
};
|
|
74
|
+
#handleBeforetoggle = (evt) => {
|
|
75
|
+
if ('open' !== evt.newState)
|
|
76
|
+
return;
|
|
77
|
+
const trigger = this.#queryTrigger;
|
|
78
|
+
if (!trigger) {
|
|
79
|
+
evt.preventDefault();
|
|
80
|
+
this.remove();
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
this.#render(trigger.getAttribute('help'));
|
|
85
|
+
this.#mutationObserver.observe(trigger, {
|
|
86
|
+
attributes: true,
|
|
87
|
+
attributeFilter: ['help'],
|
|
88
|
+
});
|
|
89
|
+
this.#mutationObserver2.observe(document.body, {
|
|
90
|
+
childList: true,
|
|
91
|
+
subtree: true,
|
|
92
|
+
});
|
|
93
|
+
this.#resizeObserver.observe(this);
|
|
94
|
+
}
|
|
95
|
+
this.toggleAttribute('open', 'open' === evt.newState);
|
|
96
|
+
};
|
|
97
|
+
hidePopover() {
|
|
98
|
+
if (this.hasAttribute('closing'))
|
|
99
|
+
return;
|
|
100
|
+
this.setAttribute('closing', '');
|
|
101
|
+
Promise.allSettled(this.getAnimations().map(({ finished }) => finished)).then(() => {
|
|
102
|
+
if (!this.hasAttribute('closing'))
|
|
103
|
+
return;
|
|
104
|
+
this?.remove();
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
_a = FineTooltip;
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import { FormBase } from '../namespace-browser/base';
|
|
2
|
+
/**
|
|
3
|
+
* @summary A container view that groups controls together for entering data, like a settings screen.
|
|
4
|
+
*
|
|
5
|
+
* @attr {hidden} navigation-link-indicator-visibility — Hides accessories like right-arrow-chevron on NavigationLink buttons inside.
|
|
6
|
+
*/
|
|
2
7
|
export declare class FormView extends FormBase {
|
|
3
8
|
constructor();
|
|
4
9
|
static polyfillDisconnectedCallback(el: HTMLFormElement): void;
|
|
5
10
|
static polyfillConnectedCallback(el: HTMLFormElement): void;
|
|
6
11
|
}
|
|
12
|
+
declare global {
|
|
13
|
+
interface HTMLElementTagNameMap {
|
|
14
|
+
'form-view': FormView;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
import { CleanupRegistry } from '../internal/class/cleanup-registry';
|
|
2
|
-
import { listActive, onoff } from '../internal/utils';
|
|
2
|
+
import { debug, listActive, onoff } from '../internal/utils';
|
|
3
3
|
import { FormBase } from '../namespace-browser/base';
|
|
4
|
+
/**
|
|
5
|
+
* @summary A container view that groups controls together for entering data, like a settings screen.
|
|
6
|
+
*
|
|
7
|
+
* @attr {hidden} navigation-link-indicator-visibility — Hides accessories like right-arrow-chevron on NavigationLink buttons inside.
|
|
8
|
+
*/
|
|
4
9
|
export class FormView extends FormBase {
|
|
5
10
|
constructor() {
|
|
6
11
|
super();
|
|
7
12
|
}
|
|
8
13
|
static polyfillDisconnectedCallback(el) {
|
|
9
|
-
|
|
14
|
+
debug(`${FormView.name} ⚡️ disconnect`);
|
|
10
15
|
// finally
|
|
11
16
|
CleanupRegistry.unregister(el);
|
|
12
17
|
}
|
|
13
18
|
static polyfillConnectedCallback(el) {
|
|
14
|
-
|
|
19
|
+
debug(`${FormView.name} ⚡️ connect`);
|
|
15
20
|
if (el.closest('[is=sidebar-view],[is=tab-bar]')) {
|
|
16
21
|
el.method = 'dialog';
|
|
17
22
|
el.noValidate = true;
|