@swiftwc/ui 0.0.0-dev.4 → 0.0.0-dev.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -0
- 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 -0
- package/generated/client/index.js +272 -0
- package/generated/components/alert-dialog.d.ts +8 -0
- package/generated/components/alert-dialog.js +99 -0
- package/generated/components/body-view.d.ts +5 -0
- package/generated/components/body-view.js +14 -0
- package/generated/components/bordered-button.d.ts +13 -0
- package/generated/components/bordered-button.js +45 -0
- package/generated/components/bordered-prominent-button.d.ts +13 -0
- package/generated/components/bordered-prominent-button.js +45 -0
- package/generated/components/borderless-button.d.ts +13 -0
- package/generated/components/borderless-button.js +45 -0
- package/generated/components/confirmation-dialog.d.ts +9 -0
- package/generated/components/confirmation-dialog.js +113 -0
- package/generated/components/content-unavailable-view.d.ts +24 -0
- package/generated/components/content-unavailable-view.js +81 -0
- package/generated/components/date-picker.d.ts +36 -0
- package/generated/components/date-picker.js +468 -0
- package/generated/components/disclosure-group.d.ts +9 -0
- package/generated/components/disclosure-group.js +58 -0
- package/generated/components/fine-tooltip.d.ts +7 -0
- package/generated/components/fine-tooltip.js +107 -0
- package/generated/components/form-view.d.ts +6 -0
- package/generated/components/form-view.js +60 -0
- package/generated/components/glass-button.d.ts +12 -0
- package/generated/components/glass-button.js +42 -0
- package/generated/components/glass-prominent-button.d.ts +12 -0
- package/generated/components/glass-prominent-button.js +42 -0
- package/generated/components/index.d.ts +42 -0
- package/generated/components/index.js +42 -0
- package/generated/components/label-view.d.ts +9 -0
- package/generated/components/label-view.js +59 -0
- package/generated/components/list-view.d.ts +5 -0
- package/generated/components/list-view.js +29 -0
- package/generated/components/menu-view.d.ts +9 -0
- package/generated/components/menu-view.js +145 -0
- package/generated/components/navigation-large-title.d.ts +6 -0
- package/generated/components/navigation-large-title.js +181 -0
- package/generated/components/navigation-split-view.d.ts +10 -0
- package/generated/components/navigation-split-view.js +25 -0
- package/generated/components/navigation-stack.d.ts +10 -0
- package/generated/components/navigation-stack.js +31 -0
- package/generated/components/navigation-title.d.ts +8 -0
- package/generated/components/navigation-title.js +52 -0
- package/generated/components/picker-view.d.ts +28 -0
- package/generated/components/picker-view.js +697 -0
- package/generated/components/plain-button.d.ts +7 -0
- package/generated/components/plain-button.js +22 -0
- package/generated/components/progress-view.d.ts +13 -0
- package/generated/components/progress-view.js +125 -0
- package/generated/components/screen-view.d.ts +5 -0
- package/generated/components/screen-view.js +11 -0
- package/generated/components/scroll-view-proxy.d.ts +8 -0
- package/generated/components/scroll-view-proxy.js +17 -0
- package/generated/components/scroll-view.d.ts +10 -0
- package/generated/components/scroll-view.js +202 -0
- package/generated/components/search-view.d.ts +8 -0
- package/generated/components/search-view.js +30 -0
- package/generated/components/section-view.d.ts +9 -0
- package/generated/components/section-view.js +83 -0
- package/generated/components/sheet-view.d.ts +8 -0
- package/generated/components/sheet-view.js +62 -0
- package/generated/components/sidebar-toggle.d.ts +7 -0
- package/generated/components/sidebar-toggle.js +85 -0
- package/generated/components/sidebar-view.d.ts +7 -0
- package/generated/components/sidebar-view.js +34 -0
- package/generated/components/sticky-container.d.ts +6 -0
- package/generated/components/sticky-container.js +26 -0
- package/generated/components/tab-bar.d.ts +10 -0
- package/generated/components/tab-bar.js +43 -0
- package/generated/components/tab-item.d.ts +7 -0
- package/generated/components/tab-item.js +132 -0
- package/generated/components/tab-view.d.ts +22 -0
- package/generated/components/tab-view.js +264 -0
- package/generated/components/table-view.d.ts +7 -0
- package/generated/components/table-view.js +174 -0
- package/generated/components/text-field.d.ts +29 -0
- package/generated/components/text-field.js +503 -0
- package/generated/components/tool-bar-item-group.d.ts +5 -0
- package/generated/components/tool-bar-item-group.js +28 -0
- package/generated/components/tool-bar-item.d.ts +8 -0
- package/generated/components/tool-bar-item.js +66 -0
- package/generated/components/tool-bar.d.ts +19 -0
- package/generated/components/tool-bar.js +93 -0
- package/generated/components/v-keyboard.d.ts +15 -0
- package/generated/components/v-keyboard.js +89 -0
- package/generated/components/v-stack.d.ts +10 -0
- package/generated/components/v-stack.js +19 -0
- package/generated/css/index.css +8089 -0
- package/generated/events/alert-dialog.d.ts +8 -0
- package/generated/events/alert-dialog.js +1 -0
- package/generated/events/confirmation-dialog.d.ts +9 -0
- package/generated/events/confirmation-dialog.js +1 -0
- package/generated/events/date-picker.d.ts +8 -0
- package/generated/events/date-picker.js +1 -0
- package/generated/events/index.d.ts +8 -0
- package/generated/events/index.js +8 -0
- package/generated/events/lifecycle-observer.d.ts +10 -0
- package/generated/events/lifecycle-observer.js +1 -0
- package/generated/events/picker-view.d.ts +15 -0
- package/generated/events/picker-view.js +1 -0
- package/generated/events/scroll-view.d.ts +10 -0
- package/generated/events/scroll-view.js +1 -0
- package/generated/events/tab-view.d.ts +28 -0
- package/generated/events/tab-view.js +1 -0
- package/generated/events/text-field.d.ts +8 -0
- package/generated/events/text-field.js +1 -0
- package/generated/i18n/index.d.ts +34 -0
- package/generated/i18n/index.js +167 -0
- 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/index.d.ts +2 -0
- package/generated/index.js +3 -0
- package/generated/internal/class/cleanup-registry.d.ts +5 -0
- package/generated/internal/class/cleanup-registry.js +38 -0
- package/generated/internal/class/css-style-observer.d.ts +8 -0
- package/generated/internal/class/css-style-observer.js +26 -0
- package/generated/internal/class/form-associated-base.d.ts +16 -0
- package/generated/internal/class/form-associated-base.js +78 -0
- 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.d.ts +10 -0
- package/generated/internal/class/mutation-observer-singleton.js +64 -0
- package/generated/internal/class/navigation-path.d.ts +15 -0
- package/generated/internal/class/navigation-path.js +84 -0
- package/generated/internal/class/navigation-view.d.ts +8 -0
- package/generated/internal/class/navigation-view.js +79 -0
- package/generated/internal/class/resize-observer-singleton.d.ts +7 -0
- package/generated/internal/class/resize-observer-singleton.js +22 -0
- package/generated/internal/decorators/adaptive-slot.d.ts +1 -0
- package/generated/internal/decorators/adaptive-slot.js +50 -0
- package/generated/internal/decorators/custom-element.d.ts +5 -0
- package/generated/internal/decorators/custom-element.js +5 -0
- package/generated/internal/decorators/index.d.ts +4 -0
- package/generated/internal/decorators/index.js +4 -0
- package/generated/internal/privateNamespace.d.ts +14 -0
- package/generated/internal/privateNamespace.js +168 -0
- package/generated/internal/utils/add.d.ts +1 -0
- package/generated/internal/utils/add.js +7 -0
- package/generated/internal/utils/cash/ancestors.d.ts +1 -0
- package/generated/internal/utils/cash/ancestors.js +27 -0
- package/generated/internal/utils/cash/index.d.ts +23 -0
- package/generated/internal/utils/cash/index.js +25 -0
- package/generated/internal/utils/cash/next-all.d.ts +1 -0
- package/generated/internal/utils/cash/next-all.js +10 -0
- package/generated/internal/utils/cash/next.d.ts +1 -0
- package/generated/internal/utils/cash/next.js +9 -0
- package/generated/internal/utils/cash/prev-all.d.ts +1 -0
- package/generated/internal/utils/cash/prev-all.js +10 -0
- package/generated/internal/utils/cash/prev.d.ts +1 -0
- package/generated/internal/utils/cash/prev.js +9 -0
- package/generated/internal/utils/cash/prop.d.ts +18 -0
- package/generated/internal/utils/cash/prop.js +30 -0
- package/generated/internal/utils/cash/siblings.d.ts +1 -0
- package/generated/internal/utils/cash/siblings.js +10 -0
- package/generated/internal/utils/clamp.d.ts +1 -0
- package/generated/internal/utils/clamp.js +4 -0
- package/generated/internal/utils/compare-big-decimals.d.ts +1 -0
- package/generated/internal/utils/compare-big-decimals.js +90 -0
- package/generated/internal/utils/css-time.d.ts +1 -0
- package/generated/internal/utils/css-time.js +3 -0
- package/generated/internal/utils/debounce.d.ts +1 -0
- package/generated/internal/utils/debounce.js +13 -0
- package/generated/internal/utils/dev-flags.d.ts +3 -0
- package/generated/internal/utils/dev-flags.js +5 -0
- package/generated/internal/utils/ensure-placeholder.d.ts +1 -0
- package/generated/internal/utils/ensure-placeholder.js +55 -0
- package/generated/internal/utils/frame.d.ts +1 -0
- package/generated/internal/utils/frame.js +6 -0
- package/generated/internal/utils/index.d.ts +19 -0
- package/generated/internal/utils/index.js +22 -0
- 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.d.ts +1 -0
- package/generated/internal/utils/kebab-case.js +11 -0
- package/generated/internal/utils/list-active.d.ts +7 -0
- package/generated/internal/utils/list-active.js +83 -0
- package/generated/internal/utils/microtask.d.ts +1 -0
- package/generated/internal/utils/microtask.js +3 -0
- package/generated/internal/utils/onoff.d.ts +45 -0
- package/generated/internal/utils/onoff.js +31 -0
- package/generated/internal/utils/set.d.ts +1 -0
- package/generated/internal/utils/set.js +7 -0
- package/generated/internal/utils/sleep.d.ts +1 -0
- package/generated/internal/utils/sleep.js +3 -0
- package/generated/internal/utils/slow-hide-show.d.ts +1 -0
- package/generated/internal/utils/slow-hide-show.js +16 -0
- package/generated/internal/utils/timeout.d.ts +5 -0
- package/generated/internal/utils/timeout.js +16 -0
- package/generated/internal/utils/touch-glass.d.ts +7 -0
- package/generated/internal/utils/touch-glass.js +19 -0
- package/generated/namespace-browser/base.d.ts +45 -0
- package/generated/namespace-browser/base.js +115 -0
- package/generated/namespace-browser/index.d.ts +7 -0
- package/generated/namespace-browser/index.js +1 -0
- package/generated/snapshot/index.d.ts +9 -0
- package/generated/snapshot/index.js +60 -0
- package/package.json +35 -11
- package/scss/_components.scss +59 -14
- package/scss/_final.scss +1 -0
- package/scss/_functions.scss +10 -0
- package/scss/_mixins.scss +4 -169
- package/scss/_placeholders.scss +3 -0
- package/scss/_transitions.scss +22 -1
- package/scss/_utils.scss +9 -0
- package/scss/_vars.scss +142 -23
- package/scss/base/_layout.scss +31 -16
- package/scss/base/_reboot.scss +151 -15
- package/scss/base/_root.scss +355 -25
- package/scss/colors/_index.scss +672 -70
- package/scss/components/_alert-dialog.scss +111 -0
- package/scss/components/_body-view.scss +12 -3
- package/scss/components/_bordered-button.scss +57 -0
- package/scss/components/_bordered-prominent-button.scss +63 -0
- package/scss/components/_borderless-button.scss +36 -6
- package/scss/components/_confirmation-dialog.scss +84 -0
- package/scss/components/_content-unavailable-view.scss +45 -0
- package/scss/components/_date-picker.scss +30 -0
- package/scss/components/_detail-placeholder.scss +153 -0
- package/scss/components/_disclosure-group.scss +146 -51
- package/scss/components/_fine-tooltip.scss +82 -0
- package/scss/components/_form-view.scss +195 -0
- package/scss/components/_full-screen.scss +7 -5
- package/scss/components/_glass-button.scss +59 -0
- package/scss/components/_glass-prominent-button.scss +68 -0
- package/scss/components/_h-divider.scss +13 -0
- package/scss/components/_h-flex-stack.scss +23 -0
- package/scss/components/_h-stack.scss +29 -0
- package/scss/components/_index.scss +234 -7
- package/scss/components/_label-view copy.scss.txt +420 -0
- package/scss/components/_label-view.scss +355 -0
- package/scss/components/_label-view.scss.txt +536 -0
- package/scss/components/_labeled-content.scss +9 -0
- package/scss/components/_list-view.scss +229 -0
- package/scss/components/_menu-view.scss +211 -0
- package/scss/components/_navigation-large-title.scss +27 -0
- package/scss/components/_navigation-split-view.scss +329 -269
- package/scss/components/_navigation-stack.scss +6 -6
- package/scss/components/_navigation-title.scss +10 -0
- package/scss/components/_picker-view.scss +131 -0
- package/scss/components/_plain-button.scss +18 -0
- package/scss/components/_progress-view.scss +98 -0
- package/scss/components/_scroll-view-proxy.scss +79 -0
- package/scss/components/_scroll-view-toolbars.scss +126 -0
- package/scss/components/_scroll-view.scss +114 -66
- package/scss/components/_search-view.scss +18 -0
- package/scss/components/_section-view.scss +119 -0
- package/scss/components/_sheet-view.scss +78 -35
- package/scss/components/_sidebar-toggle.scss +87 -27
- package/scss/components/_sidebar-view.scss +30 -40
- package/scss/components/_sticky-container.scss +42 -0
- package/scss/components/_tab-bar.scss +207 -84
- package/scss/components/_tab-item.scss +25 -0
- package/scss/components/_tab-view.scss +270 -126
- package/scss/components/_table-column.scss +52 -0
- package/scss/components/_table-row.scss +172 -0
- package/scss/components/_table-view.scss +223 -0
- package/scss/components/_text-field.scss +37 -0
- package/scss/components/_tool-bar-item-group.scss +30 -19
- package/scss/components/_tool-bar-item.scss +81 -71
- package/scss/components/_tool-bar.scss +126 -63
- package/scss/components/_v-divider.scss +13 -0
- package/scss/components/_v-flex-stack.scss +29 -0
- package/scss/components/_v-keyboard.scss +6 -4
- package/scss/components/_v-stack.scss +15 -9
- package/scss/final/_touch-glass.scss +91 -0
- package/scss/index.scss +6 -2
- package/scss/mixins/_button.scss +44 -0
- package/scss/mixins/_color.scss +16 -0
- package/scss/mixins/_dialog.scss +89 -0
- package/scss/mixins/_index.scss +422 -0
- package/scss/placeholders/_buttons.scss +117 -0
- package/scss/placeholders/_lists.scss +571 -0
- package/scss/transitions/_alert-dialog.scss +18 -0
- package/scss/transitions/_bwd.navbar.scss +3 -13
- package/scss/transitions/_bwd.scss +4 -20
- package/scss/transitions/_confirmation-dialog.scss +22 -0
- package/scss/transitions/_disclosure-group.scss +35 -0
- package/scss/transitions/_fine-tooltip.scss +21 -0
- package/scss/transitions/_fwd.navbar.scss +4 -9
- package/scss/transitions/_fwd.scss +4 -34
- package/scss/transitions/_glass-button.scss +12 -0
- package/scss/transitions/_glass-prominent-button.scss +12 -0
- package/scss/transitions/_index.scss +35 -143
- package/scss/transitions/_menu-view.scss +26 -0
- package/scss/transitions/_navigation-split-view.scss +23 -0
- package/scss/transitions/_progress-view.scss +23 -0
- package/scss/transitions/_sheet-view.scss +30 -0
- package/scss/transitions/_sidebar-view.scss +36 -0
- package/scss/transitions/_tab-bar.scss +20 -0
- package/scss/utils/_frame.scss +91 -0
- package/scss/utils/_index.scss +91 -0
- package/scss/utils/_scroll-view.scss +14 -0
- package/scss/utils/_spacing.scss +25 -0
- package/scss/utils/_stacks.scss +209 -0
- package/web-components.html-data/en.json +500 -0
- package/generated/styles.css +0 -1305
- package/scss/_dev.scss +0 -68
- package/scss/components/_tab-bar-stack.scss +0 -101
- package/scss/components/_toolbars.scss +0 -100
- package/scss/transitions/_dialog.scss +0 -32
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
var _a;
|
|
2
|
+
import { I18n } from '../i18n';
|
|
3
|
+
import { CleanupRegistry } from '../internal/class/cleanup-registry';
|
|
4
|
+
import { FormAssociatedBase, getInternals } from '../internal/class/form-associated-base';
|
|
5
|
+
import { MutationObserverSet } from '../internal/class/mutation-observer-set';
|
|
6
|
+
import { $, compareBigDecimals, devFlags, kebabCase, onoff, set } from '../internal/utils';
|
|
7
|
+
const keyboardTypes = ['decimal-pad', 'number-pad', 'default'];
|
|
8
|
+
/**
|
|
9
|
+
* @slot label
|
|
10
|
+
* @slot validity-options
|
|
11
|
+
*/
|
|
12
|
+
export class TextField extends FormAssociatedBase {
|
|
13
|
+
static get observedAttributes() {
|
|
14
|
+
return ['prompt', 'minimum', 'maximum', 'min-length', 'max-length', 'label', 'name', 'text', 'text-input-autocapitalization', 'disable-autocorrection', 'keyboard-type', 'required', 'disabled'];
|
|
15
|
+
}
|
|
16
|
+
static #template;
|
|
17
|
+
static get template() {
|
|
18
|
+
return (this.#template ??= $(String.raw `
|
|
19
|
+
<label part="root text-field-stack">
|
|
20
|
+
<div part="root text-field-label-stack">
|
|
21
|
+
<slot name="label"></slot>
|
|
22
|
+
</div>
|
|
23
|
+
<div part="root text-field-input-stack">
|
|
24
|
+
<input type="text" part="root input text-field-form-input">
|
|
25
|
+
</div>
|
|
26
|
+
<slot name="validity-options" hidden></slot>
|
|
27
|
+
</label>`));
|
|
28
|
+
}
|
|
29
|
+
#renderValidityMsgs = (entries) => {
|
|
30
|
+
if (devFlags.debug)
|
|
31
|
+
console.debug(`${_a.name} ⚡️ mutation`);
|
|
32
|
+
this.setValidity(this.validity, this.validationMessage);
|
|
33
|
+
};
|
|
34
|
+
#shadowRoot;
|
|
35
|
+
// #internals: ElementInternals
|
|
36
|
+
#customValidity = '';
|
|
37
|
+
// #validitiesSlot?: HTMLSlotElement
|
|
38
|
+
#slots = new Map();
|
|
39
|
+
#validityObservers = new MutationObserverSet(this.#renderValidityMsgs);
|
|
40
|
+
#input;
|
|
41
|
+
get #internals() {
|
|
42
|
+
return getInternals(this);
|
|
43
|
+
}
|
|
44
|
+
constructor() {
|
|
45
|
+
super();
|
|
46
|
+
this.#shadowRoot = this.attachShadow({ mode: 'closed' });
|
|
47
|
+
this.#shadowRoot.appendChild(document.importNode(this.constructor.template, true));
|
|
48
|
+
for (const slot of this.#shadowRoot.querySelectorAll('slot'))
|
|
49
|
+
this.#slots?.set(slot.name, slot);
|
|
50
|
+
CleanupRegistry.register(this, () => {
|
|
51
|
+
this.#slots = new Map();
|
|
52
|
+
});
|
|
53
|
+
CleanupRegistry.unregister(this, 'validities');
|
|
54
|
+
CleanupRegistry.register(this, onoff('slotchange', this.#handleValiditiesSlotchange, this.#slots?.get('validity-options')).on(), 'validities');
|
|
55
|
+
this.#input = this.#shadowRoot.querySelector('input') ?? undefined;
|
|
56
|
+
CleanupRegistry.register(this, onoff([{ types: 'focusin', listener: this.#handleFocusin }], this).on());
|
|
57
|
+
CleanupRegistry.register(this, onoff([
|
|
58
|
+
{ types: 'blur', listener: this.#handleInputBlur },
|
|
59
|
+
{ types: 'input', listener: this.#handleInputInput },
|
|
60
|
+
{ types: 'beforeinput', listener: this.#handleInputBeforeinput },
|
|
61
|
+
{ types: 'paste', listener: this.#handleInputPaste },
|
|
62
|
+
], this.#input).on());
|
|
63
|
+
CleanupRegistry.register(this, onoff('localechange', () => {
|
|
64
|
+
this.text = this.text;
|
|
65
|
+
}, I18n.on).on());
|
|
66
|
+
}
|
|
67
|
+
connectedCallback() {
|
|
68
|
+
super.connectedCallback();
|
|
69
|
+
// finally
|
|
70
|
+
if (!this.hasAttribute('text'))
|
|
71
|
+
return;
|
|
72
|
+
this.text = this.getAttribute('text') ?? ''; // this.#input.value = this.getAttribute('text') ?? ''
|
|
73
|
+
this.#sendValueToForm(false);
|
|
74
|
+
}
|
|
75
|
+
disconnectedCallback() {
|
|
76
|
+
super.disconnectedCallback();
|
|
77
|
+
this.#validityObservers.unobserveAll();
|
|
78
|
+
}
|
|
79
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
80
|
+
if (devFlags.debug)
|
|
81
|
+
console.debug(`${_a.name} ⚡️ attr-change [${name}] ("${oldValue}" → "${newValue}")`);
|
|
82
|
+
switch (name) {
|
|
83
|
+
case 'keyboard-type':
|
|
84
|
+
switch (newValue) {
|
|
85
|
+
case 'decimal-pad':
|
|
86
|
+
this.#input?.setAttribute('inputmode', 'decimal');
|
|
87
|
+
break;
|
|
88
|
+
case 'number-pad':
|
|
89
|
+
this.#input?.setAttribute('inputmode', 'numeric');
|
|
90
|
+
break;
|
|
91
|
+
case 'default':
|
|
92
|
+
default:
|
|
93
|
+
this.#input?.removeAttribute('inputmode');
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
this.#sendValueToForm();
|
|
97
|
+
break;
|
|
98
|
+
case 'text-input-autocapitalization':
|
|
99
|
+
switch (newValue) {
|
|
100
|
+
case 'never':
|
|
101
|
+
this.#input?.setAttribute('autocapitalize', 'off');
|
|
102
|
+
break;
|
|
103
|
+
case 'characters':
|
|
104
|
+
this.#input?.setAttribute('autocapitalize', newValue);
|
|
105
|
+
break;
|
|
106
|
+
case 'words':
|
|
107
|
+
this.#input?.setAttribute('autocapitalize', newValue);
|
|
108
|
+
break;
|
|
109
|
+
default:
|
|
110
|
+
case 'sentences':
|
|
111
|
+
this.#input?.setAttribute('autocapitalize', 'on');
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
break;
|
|
115
|
+
case 'disable-autocorrection':
|
|
116
|
+
if ('' === newValue)
|
|
117
|
+
for (const [k, v] of [
|
|
118
|
+
['autocomplete', 'off'],
|
|
119
|
+
['autocorrect', 'off'],
|
|
120
|
+
['spellcheck', 'false'],
|
|
121
|
+
])
|
|
122
|
+
this.#input?.setAttribute(k, v);
|
|
123
|
+
else
|
|
124
|
+
for (const k of ['autocomplete', 'autocorrect', 'spellcheck'])
|
|
125
|
+
this.#input?.removeAttribute(k);
|
|
126
|
+
break;
|
|
127
|
+
case 'text':
|
|
128
|
+
// if (this.#input) this.#input.value = newValue ?? ''
|
|
129
|
+
// nothing happens //this.text = newValue ?? ''
|
|
130
|
+
break;
|
|
131
|
+
case 'required':
|
|
132
|
+
this.#input?.setAttribute(name, newValue ?? ''); // else this.#input?.removeAttribute(name)
|
|
133
|
+
this.#sendValueToForm();
|
|
134
|
+
break;
|
|
135
|
+
case 'name':
|
|
136
|
+
case 'minimum':
|
|
137
|
+
case 'maximum':
|
|
138
|
+
this.#sendValueToForm();
|
|
139
|
+
break;
|
|
140
|
+
case 'prompt':
|
|
141
|
+
this.#input?.setAttribute('placeholder', newValue ?? ''); // else this.#input?.removeAttribute(name)
|
|
142
|
+
break;
|
|
143
|
+
case 'min-length':
|
|
144
|
+
this.#input?.setAttribute('minlength', newValue ?? '');
|
|
145
|
+
this.#sendValueToForm();
|
|
146
|
+
break;
|
|
147
|
+
case 'max-length':
|
|
148
|
+
this.#input?.setAttribute('maxlength', newValue ?? '');
|
|
149
|
+
this.#sendValueToForm();
|
|
150
|
+
break;
|
|
151
|
+
case 'label':
|
|
152
|
+
let label = this.querySelector(':scope>label-view[slot=label]');
|
|
153
|
+
if (newValue) {
|
|
154
|
+
label ??= this.appendChild($(`<label-view slot="label"></label-view>`, '>1'));
|
|
155
|
+
label.setAttribute('foreground', 'secondary');
|
|
156
|
+
label.setAttribute('title', newValue);
|
|
157
|
+
}
|
|
158
|
+
else
|
|
159
|
+
label?.remove();
|
|
160
|
+
// this.#sendValueToForm()
|
|
161
|
+
break;
|
|
162
|
+
case 'disabled':
|
|
163
|
+
for (const el of this.#shadowRoot.querySelectorAll('input'))
|
|
164
|
+
el.toggleAttribute('disabled', !newValue);
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
// render pattern
|
|
168
|
+
switch (this.keyboardType) {
|
|
169
|
+
case 'decimal-pad':
|
|
170
|
+
const allowedSignsRegex2 = String.raw `[+\-]?|[+\-]?(\d+([.,]\d*)?|[.,]\d*)`, // allow single '+' or '-', then allow only one ',' or '.' and finally only digits
|
|
171
|
+
digitsDecimalsOnlyRegex = String.raw `(\d+([.,]\d*)?|[.,]\d*)?`; // allow only one ',' or '.' and finally only digits
|
|
172
|
+
this.#input?.setAttribute('pattern', this.negativeNumbersAllowed ? allowedSignsRegex2 : digitsDecimalsOnlyRegex);
|
|
173
|
+
break;
|
|
174
|
+
case 'number-pad':
|
|
175
|
+
const allowedSignsRegex = String.raw `([+\-]|\d+|[+\-]\d+)?`, // allow single '+' or '-', then allow only digits
|
|
176
|
+
digitsOnlyRegex = String.raw `\d*`; // allow only digits
|
|
177
|
+
this.#input?.setAttribute('pattern', this.negativeNumbersAllowed ? allowedSignsRegex : digitsOnlyRegex);
|
|
178
|
+
break;
|
|
179
|
+
default:
|
|
180
|
+
this.#input?.removeAttribute('pattern');
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
get keyboardType() {
|
|
185
|
+
return keyboardTypes.includes(this.getAttribute('keyboard-type') ?? '') ? this.getAttribute('keyboard-type') : 'default';
|
|
186
|
+
}
|
|
187
|
+
get text() {
|
|
188
|
+
return this.#input?.value ?? '';
|
|
189
|
+
}
|
|
190
|
+
set text(v) {
|
|
191
|
+
if (!this.#input)
|
|
192
|
+
return;
|
|
193
|
+
const nv = this.#patternTest(v) ? v : '';
|
|
194
|
+
set(this.#input, 'value', nv);
|
|
195
|
+
// this.text AND this.value have NOW been updated to new values
|
|
196
|
+
// if user is NOT interacting replace new-text/input.value with the formatted version of the new-text/input.value!
|
|
197
|
+
if (document.activeElement !== this && 0 < this.#input.value.length) {
|
|
198
|
+
const finalText = this.value.replace(/[.,]/g, I18n.decimalSeparator);
|
|
199
|
+
set(this.#input, 'value', finalText); // if (this.text !== finalText) this.#input.value = finalText
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
#handleValiditiesSlotchange = ({ type, target: slot }) => {
|
|
203
|
+
if (devFlags.debug)
|
|
204
|
+
console.debug(`${_a.name} ⚡️ ${type}`);
|
|
205
|
+
if (!(slot instanceof HTMLSlotElement && slot))
|
|
206
|
+
return;
|
|
207
|
+
const assigned = slot.assignedElements();
|
|
208
|
+
this.#validityObservers.syncObservations(assigned, ['value', 'label']);
|
|
209
|
+
// if (0 < assigned.length)
|
|
210
|
+
this.#renderValidityMsgs([]);
|
|
211
|
+
};
|
|
212
|
+
#handleFocusin = (evt) => {
|
|
213
|
+
if (devFlags.debug)
|
|
214
|
+
console.debug(`${_a.name} ⚡️ ${evt?.type}`);
|
|
215
|
+
if (evt.target === this)
|
|
216
|
+
this.#input?.focus();
|
|
217
|
+
};
|
|
218
|
+
#sendValueToForm = (dispatchEvent = true) => {
|
|
219
|
+
// input.value has already been updated/synced !!
|
|
220
|
+
if (this.matches(':disabled'))
|
|
221
|
+
return this.setValidity({});
|
|
222
|
+
// if (this.hasAttribute('required')) {
|
|
223
|
+
if (this.#input?.matches(':invalid')) {
|
|
224
|
+
this.setValidity(this.#input?.validity, this.#input?.validationMessage);
|
|
225
|
+
}
|
|
226
|
+
else if (['number-pad', 'decimal-pad'].includes(this.keyboardType) && (this.hasAttribute('minimum') || this.hasAttribute('maximum'))) {
|
|
227
|
+
const underflow = compareBigDecimals(this.value, this.getAttribute('minimum') ?? '-Infinity'), overflow = compareBigDecimals(this.value, this.getAttribute('maximum') ?? 'Infinity');
|
|
228
|
+
if (0 > underflow)
|
|
229
|
+
this.setValidity({ rangeUnderflow: true });
|
|
230
|
+
else if (0 < overflow)
|
|
231
|
+
this.setValidity({ rangeOverflow: true });
|
|
232
|
+
else
|
|
233
|
+
this.setValidity({});
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
this.setValidity({});
|
|
237
|
+
}
|
|
238
|
+
const entries = new FormData();
|
|
239
|
+
entries.append(this.name, this.text);
|
|
240
|
+
this.#internals.setFormValue(entries);
|
|
241
|
+
if (dispatchEvent)
|
|
242
|
+
this.dispatchEvent(new CustomEvent('commit', { detail: { text: this.text }, bubbles: true, composed: true }));
|
|
243
|
+
};
|
|
244
|
+
#handleInputPaste = (evt) => {
|
|
245
|
+
if (devFlags.debug)
|
|
246
|
+
console.debug(`${_a.name} ⚡️ ${evt?.type}`);
|
|
247
|
+
const { target: input } = evt;
|
|
248
|
+
if (!(input instanceof HTMLInputElement && input))
|
|
249
|
+
return;
|
|
250
|
+
evt.preventDefault();
|
|
251
|
+
const data = this.#identity(evt.clipboardData?.getData('text') ?? ''); // number is now sanitized but contains edge cases like '+' and also global one separator that could be wither dot or decimal.
|
|
252
|
+
if (0 === data.length)
|
|
253
|
+
return this.shake(); //.then(this.reportValidity) // nothing to paste
|
|
254
|
+
const start = input.selectionStart ?? 0, end = input.selectionEnd ?? 0, before = input.value.slice(0, start), after = input.value.slice(end), newText = `${before}${data}${after}`;
|
|
255
|
+
if (-1 < input.maxLength && input.maxLength < newText.length)
|
|
256
|
+
return this.shake(); //.then(this.reportValidity) // exceeding maxlength
|
|
257
|
+
input.value = newText;
|
|
258
|
+
const newCaret = start + data.length;
|
|
259
|
+
input.setSelectionRange(newCaret, newCaret); // move caret after inserted char
|
|
260
|
+
this.#sendValueToForm(); // input.dispatchEvent(new InputEvent('input', { bubbles: true })) // Manually trigger input event so listeners react
|
|
261
|
+
};
|
|
262
|
+
// NOTE: identity MUST always pass beforeinput checks
|
|
263
|
+
#identity = (str) => {
|
|
264
|
+
// 'ab-1.2.3.4x yz ' // "-1.234"
|
|
265
|
+
// '++12..34 ' // "+12.34"
|
|
266
|
+
// '-+5.6.7.8 ' // "-5.678"
|
|
267
|
+
// ' -+5.6,7.8 ' // "-5.678"
|
|
268
|
+
// 'foo123bar ' // "123"
|
|
269
|
+
// '.12.3 ' // ".123"
|
|
270
|
+
// ' http://localhost:5173/input.html' // "5173."
|
|
271
|
+
// ' http://localhost:51,73/input.html' // "51,73"
|
|
272
|
+
// ' +- 0000.' // "+0000."
|
|
273
|
+
// ' +' // "+"
|
|
274
|
+
// ' +0000234' // "+0000234"
|
|
275
|
+
// ' +-1.2.3.4x yz ' // "+1.234"
|
|
276
|
+
let seenSign = false;
|
|
277
|
+
switch (this.keyboardType) {
|
|
278
|
+
case 'decimal-pad': // allow only ^+- and then only one instance of ., finally remove all non digit rest appearances
|
|
279
|
+
let seenDot = false;
|
|
280
|
+
return [...`${str.trim()}`].reduce((acc, ch, i) => {
|
|
281
|
+
// +- signs are allowed
|
|
282
|
+
if (this.negativeNumbersAllowed)
|
|
283
|
+
if (!seenSign && (ch === '+' || ch === '-')) {
|
|
284
|
+
seenSign = true;
|
|
285
|
+
return `${acc}${ch}`;
|
|
286
|
+
}
|
|
287
|
+
if ((ch === '.' || ch === ',') && !seenDot) {
|
|
288
|
+
seenDot = true;
|
|
289
|
+
return `${acc}${ch}`;
|
|
290
|
+
}
|
|
291
|
+
if (/\d/.test(ch))
|
|
292
|
+
return `${acc}${ch}`;
|
|
293
|
+
return acc; // skip everything else
|
|
294
|
+
}, '');
|
|
295
|
+
case 'number-pad': // allow only ^+- finally remove all non digit rest appearances
|
|
296
|
+
return [...`${str.trim()}`].reduce((acc, ch, i) => {
|
|
297
|
+
// +- signs are allowed
|
|
298
|
+
if (this.negativeNumbersAllowed)
|
|
299
|
+
if (!seenSign && (ch === '+' || ch === '-')) {
|
|
300
|
+
seenSign = true;
|
|
301
|
+
return `${acc}${ch}`;
|
|
302
|
+
}
|
|
303
|
+
if (/\d/.test(ch))
|
|
304
|
+
return `${acc}${ch}`;
|
|
305
|
+
return acc; // skip everything else
|
|
306
|
+
}, '');
|
|
307
|
+
default:
|
|
308
|
+
return `${str}`;
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
#patternTest = (str) => {
|
|
312
|
+
switch (this.keyboardType) {
|
|
313
|
+
case 'decimal-pad':
|
|
314
|
+
const allowedSignsRegex2 = /^[+-]?$|^[+-]?(\d+([.,]\d*)?|[.,]\d*)$/, // allow single '+' or '-', then allow only one ',' or '.' and finally only digits
|
|
315
|
+
digitsDecimalsOnlyRegex = /^(\d+([.,]\d*)?|[.,]\d*)?$/; // allow only one ',' or '.' and finally only digits
|
|
316
|
+
return (this.negativeNumbersAllowed ? allowedSignsRegex2 : digitsDecimalsOnlyRegex).test(str);
|
|
317
|
+
// // isValidDecimal(""); // true
|
|
318
|
+
// // isValidDecimal("+"); // true
|
|
319
|
+
// // isValidDecimal("-"); // true
|
|
320
|
+
// // isValidDecimal("123"); // true
|
|
321
|
+
// // isValidDecimal("+123"); // true
|
|
322
|
+
// // isValidDecimal("-456"); // true
|
|
323
|
+
// // isValidDecimal("12.34"); // true
|
|
324
|
+
// // isValidDecimal("-0,56"); // true
|
|
325
|
+
// // isValidDecimal(".78"); // true
|
|
326
|
+
// // isValidDecimal(",9"); // true
|
|
327
|
+
// // isValidDecimal("12.3.4"); // false
|
|
328
|
+
// // isValidDecimal("12,3,4"); // false
|
|
329
|
+
// // isValidDecimal("12-3"); // false
|
|
330
|
+
// // isValidDecimal("12a"); // false
|
|
331
|
+
case 'number-pad':
|
|
332
|
+
const allowedSignsRegex = /^([+-]|\d+|[+-]\d+)?$/, // allow single '+' or '-', then allow only digits
|
|
333
|
+
digitsOnlyRegex = /^(\d+)?$/; // allow only digits
|
|
334
|
+
return (this.negativeNumbersAllowed ? allowedSignsRegex : digitsOnlyRegex).test(str);
|
|
335
|
+
// // isValidInteger(""); // true
|
|
336
|
+
// // isValidInteger("+"); // true
|
|
337
|
+
// // isValidInteger("-"); // true
|
|
338
|
+
// // isValidInteger("123"); // true
|
|
339
|
+
// // isValidInteger("+123"); // true
|
|
340
|
+
// // isValidInteger("-456"); // true
|
|
341
|
+
// // isValidInteger("12-3"); // false
|
|
342
|
+
// // isValidInteger("++123"); // false
|
|
343
|
+
// // isValidInteger("123a"); // false
|
|
344
|
+
default:
|
|
345
|
+
return true;
|
|
346
|
+
}
|
|
347
|
+
};
|
|
348
|
+
#handleInputBeforeinput = (evt) => {
|
|
349
|
+
if (devFlags.debug)
|
|
350
|
+
console.debug(`${_a.name} ⚡️ ${evt?.type}`);
|
|
351
|
+
const { target: input } = evt;
|
|
352
|
+
if (!(input instanceof HTMLInputElement && input))
|
|
353
|
+
return;
|
|
354
|
+
if ('insertText' !== evt.inputType)
|
|
355
|
+
return;
|
|
356
|
+
const data = evt.data ?? '';
|
|
357
|
+
if (-1 < input.maxLength && 0 === data.length) {
|
|
358
|
+
evt.preventDefault();
|
|
359
|
+
return this.shake(); //.then(this.reportValidity)
|
|
360
|
+
} // nothing to add
|
|
361
|
+
const start = input.selectionStart ?? 0, end = input.selectionEnd ?? 0, before = this.text.slice(0, start), after = this.text.slice(end), newText = `${before}${data}${after}`;
|
|
362
|
+
if (0 === newText.length)
|
|
363
|
+
return;
|
|
364
|
+
switch (input.getAttribute('inputmode')) {
|
|
365
|
+
case 'decimal':
|
|
366
|
+
// const allowedSignsRegex2 = /^[+-]?$|^[+-]?(\d+([.,]\d*)?|[.,]\d*)$/, // allow single '+' or '-', then allow only one ',' or '.' and finally only digits
|
|
367
|
+
// digitsDecimalsOnlyRegex = /^(\d+([.,]\d*)?|[.,]\d*)?$/ // allow only one ',' or '.' and finally only digits
|
|
368
|
+
// if ((this.min < 0 ? allowedSignsRegex2 : digitsDecimalsOnlyRegex).test(newText)) break
|
|
369
|
+
if (this.#patternTest(newText))
|
|
370
|
+
break;
|
|
371
|
+
evt.preventDefault();
|
|
372
|
+
return this.shake(); //.then(this.reportValidity)
|
|
373
|
+
case 'numeric':
|
|
374
|
+
// const allowedSignsRegex = /^([+-]|\d+|[+-]\d+)?$/, // allow single '+' or '-', then allow only digits
|
|
375
|
+
// digitsOnlyRegex = /^(\d+)?$/ // allow only digits
|
|
376
|
+
// if ((this.min < 0 ? allowedSignsRegex : digitsOnlyRegex).test(newText)) break
|
|
377
|
+
if (this.#patternTest(newText))
|
|
378
|
+
break;
|
|
379
|
+
evt.preventDefault();
|
|
380
|
+
return this.shake(); //.then(this.reportValidity)
|
|
381
|
+
// this.setValidity(prevValidity, prevValiditationMessage) // restore
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
#handleInputBlur = ({ type, target: input }) => {
|
|
385
|
+
if (devFlags.debug)
|
|
386
|
+
console.debug(`${_a.name} ⚡️ ${type}`);
|
|
387
|
+
if (!(input instanceof HTMLInputElement && input))
|
|
388
|
+
return;
|
|
389
|
+
if (0 === input.value.length)
|
|
390
|
+
return;
|
|
391
|
+
const finalText = this.value.replace(/[.,]/g, I18n.decimalSeparator);
|
|
392
|
+
if (!set(input, 'value', finalText))
|
|
393
|
+
return;
|
|
394
|
+
this.#sendValueToForm();
|
|
395
|
+
};
|
|
396
|
+
#handleInputInput = (evt) => {
|
|
397
|
+
if (devFlags.debug)
|
|
398
|
+
console.debug(`${_a.name} ⚡️ ${evt?.type}`);
|
|
399
|
+
this.#sendValueToForm();
|
|
400
|
+
};
|
|
401
|
+
// Optional: form participation properties
|
|
402
|
+
get name() {
|
|
403
|
+
return this.getAttribute('name') ?? this.getAttribute('label') ?? this.querySelector(':scope>[slot=label]')?.textContent ?? '';
|
|
404
|
+
}
|
|
405
|
+
get value() {
|
|
406
|
+
// text allows special edge cases, like '-.' or '+' and generally might be invalid number. It might also be localized and not US based.
|
|
407
|
+
// here we make sure it is number-like, to be used in number operations.
|
|
408
|
+
switch (this.keyboardType) {
|
|
409
|
+
case 'decimal-pad':
|
|
410
|
+
case 'number-pad':
|
|
411
|
+
if ('string' !== typeof this.text)
|
|
412
|
+
return '0';
|
|
413
|
+
const value = this.text.replace(/[.,]/g, '.');
|
|
414
|
+
// Capture optional leading sign
|
|
415
|
+
const sign = value.startsWith('-') ? '-' : '';
|
|
416
|
+
// Strip sign for processing
|
|
417
|
+
let s = value.replace(/^[+-]/, '');
|
|
418
|
+
// Split on dot (take only first two parts in case of multiple dots — though
|
|
419
|
+
// your input guarantees one, this is defensive)
|
|
420
|
+
const [intPart = '', fracPart = ''] = s.split('.'), hasDot = s.includes('.');
|
|
421
|
+
// Remove leading zeros from integer part, keep at least '0'
|
|
422
|
+
const cleanInt = intPart.replace(/^0+/, '') || '0';
|
|
423
|
+
// Remove trailing zeros from fractional part
|
|
424
|
+
const cleanFrac = fracPart.replace(/0+$/, '');
|
|
425
|
+
// Build result
|
|
426
|
+
const result = hasDot && cleanFrac.length > 0 ? `${sign}${cleanInt}.${cleanFrac}` : `${sign}${cleanInt}`;
|
|
427
|
+
return result.replace(/^-0(\.0+)?$/, '0');
|
|
428
|
+
default:
|
|
429
|
+
return this.text;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
get valueAsNumber() {
|
|
433
|
+
switch (this.keyboardType) {
|
|
434
|
+
case 'decimal-pad':
|
|
435
|
+
case 'number-pad':
|
|
436
|
+
return Number(this.value);
|
|
437
|
+
default:
|
|
438
|
+
return '';
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
get negativeNumbersAllowed() {
|
|
442
|
+
// switch (this.keyboardType) {
|
|
443
|
+
// case 'decimal-pad':
|
|
444
|
+
// case 'number-pad':
|
|
445
|
+
const min = this.getAttribute('minimum') ?? '-Infinity', max = this.getAttribute('maximum') ?? 'Infinity';
|
|
446
|
+
return compareBigDecimals('0', min) >= 0 && compareBigDecimals('0', max) <= 0;
|
|
447
|
+
// default:
|
|
448
|
+
// return false
|
|
449
|
+
// }
|
|
450
|
+
}
|
|
451
|
+
setValidity = (flags, message, anchor) => {
|
|
452
|
+
// let msg
|
|
453
|
+
// if (message)
|
|
454
|
+
for (const k in flags) {
|
|
455
|
+
const key = k; // ✅ type-safe cast
|
|
456
|
+
if (true !== flags[key])
|
|
457
|
+
continue;
|
|
458
|
+
for (const el of this.#slots?.get('validity-options')?.assignedElements({ flatten: true }) ?? []) {
|
|
459
|
+
if (!el.matches('option'))
|
|
460
|
+
continue;
|
|
461
|
+
const option = el;
|
|
462
|
+
if (`${kebabCase(key)}` === option.value) {
|
|
463
|
+
message = option.label;
|
|
464
|
+
break;
|
|
465
|
+
}
|
|
466
|
+
else if (`${kebabCase(key)}:${message}` === option.value) {
|
|
467
|
+
message = option.label;
|
|
468
|
+
break;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
if (!message)
|
|
473
|
+
for (const k in flags) {
|
|
474
|
+
const key = k; // ✅ type-safe cast
|
|
475
|
+
if (true !== flags[key])
|
|
476
|
+
continue;
|
|
477
|
+
message = kebabCase(key);
|
|
478
|
+
break;
|
|
479
|
+
}
|
|
480
|
+
if (devFlags.debug)
|
|
481
|
+
console.debug(`${_a.name} ⚡️ validity-change`);
|
|
482
|
+
return this.#internals.setValidity(flags, this.#customValidity || message, anchor ?? this.#input);
|
|
483
|
+
};
|
|
484
|
+
setCustomValidity = (message) => {
|
|
485
|
+
this.#customValidity = message;
|
|
486
|
+
if (this.#customValidity)
|
|
487
|
+
this.#internals.setValidity({ ...this.#internals.validity, customError: true }, message);
|
|
488
|
+
else
|
|
489
|
+
this.#sendValueToForm(false);
|
|
490
|
+
};
|
|
491
|
+
formAssociatedCallback = (form) => {
|
|
492
|
+
this.#sendValueToForm();
|
|
493
|
+
};
|
|
494
|
+
formDisabledCallback = (disabled) => {
|
|
495
|
+
for (const el of this.#shadowRoot.querySelectorAll('input'))
|
|
496
|
+
el.toggleAttribute('disabled', !disabled);
|
|
497
|
+
};
|
|
498
|
+
formResetCallback = () => {
|
|
499
|
+
this.text = '';
|
|
500
|
+
this.#sendValueToForm();
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
_a = TextField;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var ToolBarItemGroup_1;
|
|
8
|
+
import { CleanupRegistry } from '../internal/class/cleanup-registry';
|
|
9
|
+
import { adaptiveSlot } from '../internal/decorators';
|
|
10
|
+
import { devFlags } from '../internal/utils';
|
|
11
|
+
let ToolBarItemGroup = ToolBarItemGroup_1 = class ToolBarItemGroup extends HTMLElement {
|
|
12
|
+
constructor() {
|
|
13
|
+
super();
|
|
14
|
+
}
|
|
15
|
+
connectedCallback() {
|
|
16
|
+
if (devFlags.debug)
|
|
17
|
+
console.debug(`${ToolBarItemGroup_1.name} ⚡️ connect`);
|
|
18
|
+
}
|
|
19
|
+
disconnectedCallback() {
|
|
20
|
+
if (devFlags.debug)
|
|
21
|
+
console.debug(`${ToolBarItemGroup_1.name} ⚡️ disconnect`);
|
|
22
|
+
CleanupRegistry.unregister(this);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
ToolBarItemGroup = ToolBarItemGroup_1 = __decorate([
|
|
26
|
+
adaptiveSlot()
|
|
27
|
+
], ToolBarItemGroup);
|
|
28
|
+
export { ToolBarItemGroup };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare class ToolBarItem extends HTMLElement {
|
|
2
|
+
#private;
|
|
3
|
+
static get observedAttributes(): string[];
|
|
4
|
+
constructor();
|
|
5
|
+
disconnectedCallback(): void;
|
|
6
|
+
connectedCallback(): void;
|
|
7
|
+
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
|
|
8
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var ToolBarItem_1;
|
|
8
|
+
import { CleanupRegistry } from '../internal/class/cleanup-registry';
|
|
9
|
+
import { adaptiveSlot } from '../internal/decorators';
|
|
10
|
+
import { devFlags, ensurePlaceholder, onoff, touchGlass } from '../internal/utils';
|
|
11
|
+
import { Snapshot } from '../snapshot';
|
|
12
|
+
let ToolBarItem = ToolBarItem_1 = class ToolBarItem extends HTMLElement {
|
|
13
|
+
static get observedAttributes() {
|
|
14
|
+
return ['slot', 'data-previous-slot', 'title-key'];
|
|
15
|
+
}
|
|
16
|
+
#mutationObserver;
|
|
17
|
+
constructor() {
|
|
18
|
+
super();
|
|
19
|
+
}
|
|
20
|
+
disconnectedCallback() {
|
|
21
|
+
if (devFlags.debug)
|
|
22
|
+
console.debug(`${ToolBarItem_1.name} ⚡️ disconnect`);
|
|
23
|
+
this.#mutationObserver?.disconnect();
|
|
24
|
+
CleanupRegistry.unregister(this);
|
|
25
|
+
}
|
|
26
|
+
connectedCallback() {
|
|
27
|
+
if (devFlags.debug)
|
|
28
|
+
console.debug(`${ToolBarItem_1.name} ⚡️ connect`);
|
|
29
|
+
CleanupRegistry.register(this, onoff(touchGlass(this, (t) => t.closest('tool-bar-item-group') ?? t, ({ target }) => {
|
|
30
|
+
if (!(target instanceof HTMLElement && target))
|
|
31
|
+
return true;
|
|
32
|
+
if (target.closest('menu-view[open]'))
|
|
33
|
+
return false;
|
|
34
|
+
return true;
|
|
35
|
+
}), this).on());
|
|
36
|
+
}
|
|
37
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
38
|
+
if (devFlags.debug)
|
|
39
|
+
console.debug(`${ToolBarItem_1.name} ⚡️ attr-change [${name}] ("${oldValue}" → "${newValue}")`);
|
|
40
|
+
switch (name) {
|
|
41
|
+
case 'slot':
|
|
42
|
+
case 'data-previous-slot':
|
|
43
|
+
case 'title-key': {
|
|
44
|
+
this.#mutationObserver?.disconnect();
|
|
45
|
+
const role = this.getAttribute('data-previous-slot') ?? this.getAttribute('slot') ?? '', tKey = this.getAttribute('title-key');
|
|
46
|
+
if (['confirmation-action', 'cancellation-action'].includes(role))
|
|
47
|
+
Snapshot.waitReady.then(() => {
|
|
48
|
+
ensurePlaceholder(this.querySelector(':scope>button'), role, tKey);
|
|
49
|
+
this.#mutationObserver = new MutationObserver((mutations) => {
|
|
50
|
+
for (const { target } of mutations)
|
|
51
|
+
if (target instanceof HTMLElement && target)
|
|
52
|
+
ensurePlaceholder(this.querySelector(':scope>button'), role, tKey);
|
|
53
|
+
});
|
|
54
|
+
this.#mutationObserver.observe(this, {
|
|
55
|
+
childList: true,
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
ToolBarItem = ToolBarItem_1 = __decorate([
|
|
64
|
+
adaptiveSlot((el) => !el.closest('tool-bar-item-group'))
|
|
65
|
+
], ToolBarItem);
|
|
66
|
+
export { ToolBarItem };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @slot cancellation-action - The item represents a cancellation action for a modal interface. Places the item in the leading edge of the top bar and on the trailing edge of the bottom bar when fine modal
|
|
3
|
+
* @slot primary-action - The item represents a primary action. Places the item in the trailing edge of the top bar and on the trailing edge of the bottom bar when fine modal
|
|
4
|
+
* @slot confirmation-action - The item represents a confirmation action for a modal interface. Places the item in the trailing edge of the top bar and on the trailing edge of the bottom bar when fine modal
|
|
5
|
+
* @slot destructive-action - The item represents a destructive action for a modal interface. Places the item in the leading edge of the top bar and on the leading edge of the bottom bar when fine modal
|
|
6
|
+
* @slot top-bar-leading - Places the item in the leading edge of the top bar
|
|
7
|
+
* @slot top-bar-principal - Places the item in the middle of the top bar
|
|
8
|
+
* @slot top-bar-trailing - Places the item in the trailing edge of the top bar
|
|
9
|
+
* @slot bottom-bar-leading - Places the item in the leading edge of the bottom bar
|
|
10
|
+
* @slot bottom-bar-principal - Places the item in the middle of the bottom bar
|
|
11
|
+
* @slot bottom-bar-trailing - Places the item in the trailing edge of the bottom bar
|
|
12
|
+
*/
|
|
13
|
+
export declare class ToolBar extends HTMLElement {
|
|
14
|
+
#private;
|
|
15
|
+
static get template(): DocumentFragment;
|
|
16
|
+
constructor();
|
|
17
|
+
connectedCallback(): void;
|
|
18
|
+
disconnectedCallback(): void;
|
|
19
|
+
}
|