@swiftwc/ui 0.0.0-dev.11 → 0.0.0-dev.111
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/css-data/en.json +28 -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 -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/html-data/en.json +2620 -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/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/web-components.html-data/en.json +0 -330
- /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,12 +1,19 @@
|
|
|
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 { $, compareBigDecimals, debug, kebabCase, onoff, set } from '../internal/utils';
|
|
7
|
+
import { queryMorph } from '../morphdom';
|
|
8
|
+
import { html } from '../tpl';
|
|
6
9
|
const keyboardTypes = ['decimal-pad', 'number-pad', 'default'];
|
|
7
10
|
/**
|
|
11
|
+
* @summary A control that displays an editable text area.
|
|
12
|
+
*
|
|
13
|
+
* @fires {{ detail: { text: string } }} commit — Triggered when user interacts with the input area
|
|
14
|
+
*
|
|
8
15
|
* @slot label
|
|
9
|
-
* @slot validity-options
|
|
16
|
+
* @slot {HTMLOptionElement[]} validity-options
|
|
10
17
|
*/
|
|
11
18
|
export class TextField extends FormAssociatedBase {
|
|
12
19
|
static get observedAttributes() {
|
|
@@ -20,29 +27,46 @@ export class TextField extends FormAssociatedBase {
|
|
|
20
27
|
'name',
|
|
21
28
|
'text',
|
|
22
29
|
'text-input-autocapitalization',
|
|
30
|
+
/**
|
|
31
|
+
* @type {boolean}
|
|
32
|
+
*/
|
|
23
33
|
'disable-autocorrection',
|
|
34
|
+
/**
|
|
35
|
+
* @type {decimal-pad|number-pad|default}
|
|
36
|
+
*/
|
|
24
37
|
'keyboard-type',
|
|
38
|
+
/**
|
|
39
|
+
* @type {boolean}
|
|
40
|
+
*/
|
|
25
41
|
'required',
|
|
42
|
+
/**
|
|
43
|
+
* @type {boolean}
|
|
44
|
+
*/
|
|
26
45
|
'disabled',
|
|
27
46
|
];
|
|
28
47
|
}
|
|
29
48
|
static #template;
|
|
30
49
|
static get template() {
|
|
31
|
-
return (this.#template ??= $(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
</label>`, ''));
|
|
50
|
+
return (this.#template ??= $(html `<label part="root text-field-stack">
|
|
51
|
+
<div part="root text-field-label-stack">
|
|
52
|
+
<slot name="label"></slot>
|
|
53
|
+
</div>
|
|
54
|
+
<div part="root text-field-input-stack">
|
|
55
|
+
<input type="text" part="root input text-field-form-input" />
|
|
56
|
+
</div>
|
|
57
|
+
<slot name="validity-options" hidden></slot>
|
|
58
|
+
</label>`));
|
|
41
59
|
}
|
|
60
|
+
#renderValidityMsgs = (entries) => {
|
|
61
|
+
debug(`${_a.name} ⚡️ mutation`);
|
|
62
|
+
this.setValidity(this.validity, this.validationMessage);
|
|
63
|
+
};
|
|
42
64
|
#shadowRoot;
|
|
43
65
|
// #internals: ElementInternals
|
|
44
66
|
#customValidity = '';
|
|
45
|
-
#validitiesSlot
|
|
67
|
+
// #validitiesSlot?: HTMLSlotElement
|
|
68
|
+
#slots = new Map();
|
|
69
|
+
#validityObservers = new MutationObserverSet(this.#renderValidityMsgs);
|
|
46
70
|
#input;
|
|
47
71
|
get #internals() {
|
|
48
72
|
return getInternals(this);
|
|
@@ -51,9 +75,13 @@ export class TextField extends FormAssociatedBase {
|
|
|
51
75
|
super();
|
|
52
76
|
this.#shadowRoot = this.attachShadow({ mode: 'closed' });
|
|
53
77
|
this.#shadowRoot.appendChild(document.importNode(this.constructor.template, true));
|
|
54
|
-
|
|
78
|
+
for (const slot of this.#shadowRoot.querySelectorAll('slot'))
|
|
79
|
+
this.#slots?.set(slot.name, slot);
|
|
80
|
+
CleanupRegistry.register(this, () => {
|
|
81
|
+
this.#slots = new Map();
|
|
82
|
+
});
|
|
55
83
|
CleanupRegistry.unregister(this, 'validities');
|
|
56
|
-
CleanupRegistry.register(this, onoff(
|
|
84
|
+
CleanupRegistry.register(this, onoff('slotchange', this.#handleValiditiesSlotchange, this.#slots?.get('validity-options')).on(), 'validities');
|
|
57
85
|
this.#input = this.#shadowRoot.querySelector('input') ?? undefined;
|
|
58
86
|
CleanupRegistry.register(this, onoff([{ types: 'focusin', listener: this.#handleFocusin }], this).on());
|
|
59
87
|
CleanupRegistry.register(this, onoff([
|
|
@@ -62,23 +90,12 @@ export class TextField extends FormAssociatedBase {
|
|
|
62
90
|
{ types: 'beforeinput', listener: this.#handleInputBeforeinput },
|
|
63
91
|
{ types: 'paste', listener: this.#handleInputPaste },
|
|
64
92
|
], this.#input).on());
|
|
65
|
-
CleanupRegistry.register(this, onoff('
|
|
93
|
+
CleanupRegistry.register(this, onoff('localechange', () => {
|
|
66
94
|
this.text = this.text;
|
|
67
95
|
}, I18n.on).on());
|
|
68
96
|
}
|
|
69
|
-
connectedCallback() {
|
|
70
|
-
super.connectedCallback();
|
|
71
|
-
// finally
|
|
72
|
-
if (!this.hasAttribute('text'))
|
|
73
|
-
return;
|
|
74
|
-
this.text = this.getAttribute('text') ?? ''; // this.#input.value = this.getAttribute('text') ?? ''
|
|
75
|
-
this.#sendValueToForm(false);
|
|
76
|
-
}
|
|
77
|
-
disconnectedCallback() {
|
|
78
|
-
super.disconnectedCallback();
|
|
79
|
-
}
|
|
80
97
|
attributeChangedCallback(name, oldValue, newValue) {
|
|
81
|
-
|
|
98
|
+
debug(`${_a.name} ⚡️ attr-change [${name}] ("${oldValue}" → "${newValue}")`);
|
|
82
99
|
switch (name) {
|
|
83
100
|
case 'keyboard-type':
|
|
84
101
|
switch (newValue) {
|
|
@@ -126,7 +143,7 @@ export class TextField extends FormAssociatedBase {
|
|
|
126
143
|
break;
|
|
127
144
|
case 'text':
|
|
128
145
|
// if (this.#input) this.#input.value = newValue ?? ''
|
|
129
|
-
this.text = newValue ?? ''
|
|
146
|
+
// nothing happens //this.text = newValue ?? ''
|
|
130
147
|
break;
|
|
131
148
|
case 'required':
|
|
132
149
|
this.#input?.setAttribute(name, newValue ?? ''); // else this.#input?.removeAttribute(name)
|
|
@@ -135,7 +152,7 @@ export class TextField extends FormAssociatedBase {
|
|
|
135
152
|
case 'name':
|
|
136
153
|
case 'minimum':
|
|
137
154
|
case 'maximum':
|
|
138
|
-
this.#sendValueToForm();
|
|
155
|
+
this.#sendValueToForm(false);
|
|
139
156
|
break;
|
|
140
157
|
case 'prompt':
|
|
141
158
|
this.#input?.setAttribute('placeholder', newValue ?? ''); // else this.#input?.removeAttribute(name)
|
|
@@ -149,14 +166,8 @@ export class TextField extends FormAssociatedBase {
|
|
|
149
166
|
this.#sendValueToForm();
|
|
150
167
|
break;
|
|
151
168
|
case 'label':
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
label ??= this.appendChild($(`<span slot="label" foreground="secondary"></span>`));
|
|
155
|
-
label.textContent = newValue;
|
|
156
|
-
}
|
|
157
|
-
else
|
|
158
|
-
label?.remove();
|
|
159
|
-
this.#sendValueToForm();
|
|
169
|
+
queryMorph('[slot=label]', html `<label-view slot="label" foreground="secondary">${newValue ? html `<span>${newValue}</span>` : null}</label-view>`, this);
|
|
170
|
+
// this.#sendValueToForm()
|
|
160
171
|
break;
|
|
161
172
|
case 'disabled':
|
|
162
173
|
for (const el of this.#shadowRoot.querySelectorAll('input'))
|
|
@@ -180,10 +191,20 @@ export class TextField extends FormAssociatedBase {
|
|
|
180
191
|
break;
|
|
181
192
|
}
|
|
182
193
|
}
|
|
194
|
+
disconnectedCallback() {
|
|
195
|
+
super.disconnectedCallback();
|
|
196
|
+
this.#validityObservers.unobserveAll();
|
|
197
|
+
}
|
|
198
|
+
connectedCallback() {
|
|
199
|
+
super.connectedCallback();
|
|
200
|
+
// finally
|
|
201
|
+
if (!this.hasAttribute('text'))
|
|
202
|
+
return;
|
|
203
|
+
this.text = this.getAttribute('text') ?? ''; // this.#input.value = this.getAttribute('text') ?? ''
|
|
204
|
+
this.#sendValueToForm(false);
|
|
205
|
+
}
|
|
183
206
|
get keyboardType() {
|
|
184
|
-
return keyboardTypes.includes(this.getAttribute('keyboard-type') ?? '')
|
|
185
|
-
? this.getAttribute('keyboard-type')
|
|
186
|
-
: 'default';
|
|
207
|
+
return keyboardTypes.includes(this.getAttribute('keyboard-type') ?? '') ? this.getAttribute('keyboard-type') : 'default';
|
|
187
208
|
}
|
|
188
209
|
get text() {
|
|
189
210
|
return this.#input?.value ?? '';
|
|
@@ -200,8 +221,17 @@ export class TextField extends FormAssociatedBase {
|
|
|
200
221
|
set(this.#input, 'value', finalText); // if (this.text !== finalText) this.#input.value = finalText
|
|
201
222
|
}
|
|
202
223
|
}
|
|
224
|
+
#handleValiditiesSlotchange = ({ type, target: slot }) => {
|
|
225
|
+
debug(`${_a.name} ⚡️ ${type}`);
|
|
226
|
+
if (!(slot instanceof HTMLSlotElement))
|
|
227
|
+
return;
|
|
228
|
+
const assigned = slot.assignedElements();
|
|
229
|
+
this.#validityObservers.syncObservations(assigned, ['value', 'label']);
|
|
230
|
+
// if (0 < assigned.length)
|
|
231
|
+
this.#renderValidityMsgs([]);
|
|
232
|
+
};
|
|
203
233
|
#handleFocusin = (evt) => {
|
|
204
|
-
|
|
234
|
+
debug(`${_a.name} ⚡️ ${evt?.type}`);
|
|
205
235
|
if (evt.target === this)
|
|
206
236
|
this.#input?.focus();
|
|
207
237
|
};
|
|
@@ -232,9 +262,9 @@ export class TextField extends FormAssociatedBase {
|
|
|
232
262
|
this.dispatchEvent(new CustomEvent('commit', { detail: { text: this.text }, bubbles: true, composed: true }));
|
|
233
263
|
};
|
|
234
264
|
#handleInputPaste = (evt) => {
|
|
235
|
-
|
|
236
|
-
const input = evt
|
|
237
|
-
if (!input)
|
|
265
|
+
debug(`${_a.name} ⚡️ ${evt?.type}`);
|
|
266
|
+
const { target: input } = evt;
|
|
267
|
+
if (!(input instanceof HTMLInputElement))
|
|
238
268
|
return;
|
|
239
269
|
evt.preventDefault();
|
|
240
270
|
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.
|
|
@@ -303,41 +333,41 @@ export class TextField extends FormAssociatedBase {
|
|
|
303
333
|
const allowedSignsRegex2 = /^[+-]?$|^[+-]?(\d+([.,]\d*)?|[.,]\d*)$/, // allow single '+' or '-', then allow only one ',' or '.' and finally only digits
|
|
304
334
|
digitsDecimalsOnlyRegex = /^(\d+([.,]\d*)?|[.,]\d*)?$/; // allow only one ',' or '.' and finally only digits
|
|
305
335
|
return (this.negativeNumbersAllowed ? allowedSignsRegex2 : digitsDecimalsOnlyRegex).test(str);
|
|
306
|
-
// //
|
|
307
|
-
// //
|
|
308
|
-
// //
|
|
309
|
-
// //
|
|
310
|
-
// //
|
|
311
|
-
// //
|
|
312
|
-
// //
|
|
313
|
-
// //
|
|
314
|
-
// //
|
|
315
|
-
// //
|
|
316
|
-
// //
|
|
317
|
-
// //
|
|
318
|
-
// //
|
|
319
|
-
// //
|
|
336
|
+
// // isValidDecimal(""); // true
|
|
337
|
+
// // isValidDecimal("+"); // true
|
|
338
|
+
// // isValidDecimal("-"); // true
|
|
339
|
+
// // isValidDecimal("123"); // true
|
|
340
|
+
// // isValidDecimal("+123"); // true
|
|
341
|
+
// // isValidDecimal("-456"); // true
|
|
342
|
+
// // isValidDecimal("12.34"); // true
|
|
343
|
+
// // isValidDecimal("-0,56"); // true
|
|
344
|
+
// // isValidDecimal(".78"); // true
|
|
345
|
+
// // isValidDecimal(",9"); // true
|
|
346
|
+
// // isValidDecimal("12.3.4"); // false
|
|
347
|
+
// // isValidDecimal("12,3,4"); // false
|
|
348
|
+
// // isValidDecimal("12-3"); // false
|
|
349
|
+
// // isValidDecimal("12a"); // false
|
|
320
350
|
case 'number-pad':
|
|
321
351
|
const allowedSignsRegex = /^([+-]|\d+|[+-]\d+)?$/, // allow single '+' or '-', then allow only digits
|
|
322
352
|
digitsOnlyRegex = /^(\d+)?$/; // allow only digits
|
|
323
353
|
return (this.negativeNumbersAllowed ? allowedSignsRegex : digitsOnlyRegex).test(str);
|
|
324
|
-
// //
|
|
325
|
-
// //
|
|
326
|
-
// //
|
|
327
|
-
// //
|
|
328
|
-
// //
|
|
329
|
-
// //
|
|
330
|
-
// //
|
|
331
|
-
// //
|
|
332
|
-
// //
|
|
354
|
+
// // isValidInteger(""); // true
|
|
355
|
+
// // isValidInteger("+"); // true
|
|
356
|
+
// // isValidInteger("-"); // true
|
|
357
|
+
// // isValidInteger("123"); // true
|
|
358
|
+
// // isValidInteger("+123"); // true
|
|
359
|
+
// // isValidInteger("-456"); // true
|
|
360
|
+
// // isValidInteger("12-3"); // false
|
|
361
|
+
// // isValidInteger("++123"); // false
|
|
362
|
+
// // isValidInteger("123a"); // false
|
|
333
363
|
default:
|
|
334
364
|
return true;
|
|
335
365
|
}
|
|
336
366
|
};
|
|
337
367
|
#handleInputBeforeinput = (evt) => {
|
|
338
|
-
|
|
339
|
-
const input = evt
|
|
340
|
-
if (!input)
|
|
368
|
+
debug(`${_a.name} ⚡️ ${evt?.type}`);
|
|
369
|
+
const { target: input } = evt;
|
|
370
|
+
if (!(input instanceof HTMLInputElement))
|
|
341
371
|
return;
|
|
342
372
|
if ('insertText' !== evt.inputType)
|
|
343
373
|
return;
|
|
@@ -369,10 +399,9 @@ export class TextField extends FormAssociatedBase {
|
|
|
369
399
|
// this.setValidity(prevValidity, prevValiditationMessage) // restore
|
|
370
400
|
}
|
|
371
401
|
};
|
|
372
|
-
#handleInputBlur = (
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
if (!input)
|
|
402
|
+
#handleInputBlur = ({ type, target: input }) => {
|
|
403
|
+
debug(`${_a.name} ⚡️ ${type}`);
|
|
404
|
+
if (!(input instanceof HTMLInputElement))
|
|
376
405
|
return;
|
|
377
406
|
if (0 === input.value.length)
|
|
378
407
|
return;
|
|
@@ -382,10 +411,12 @@ export class TextField extends FormAssociatedBase {
|
|
|
382
411
|
this.#sendValueToForm();
|
|
383
412
|
};
|
|
384
413
|
#handleInputInput = (evt) => {
|
|
385
|
-
|
|
414
|
+
debug(`${_a.name} ⚡️ ${evt?.type}`);
|
|
386
415
|
this.#sendValueToForm();
|
|
387
416
|
};
|
|
388
|
-
|
|
417
|
+
/**
|
|
418
|
+
* Form participation property
|
|
419
|
+
*/
|
|
389
420
|
get name() {
|
|
390
421
|
return this.getAttribute('name') ?? this.getAttribute('label') ?? this.querySelector(':scope>[slot=label]')?.textContent ?? '';
|
|
391
422
|
}
|
|
@@ -426,14 +457,8 @@ export class TextField extends FormAssociatedBase {
|
|
|
426
457
|
}
|
|
427
458
|
}
|
|
428
459
|
get negativeNumbersAllowed() {
|
|
429
|
-
// switch (this.keyboardType) {
|
|
430
|
-
// case 'decimal-pad':
|
|
431
|
-
// case 'number-pad':
|
|
432
460
|
const min = this.getAttribute('minimum') ?? '-Infinity', max = this.getAttribute('maximum') ?? 'Infinity';
|
|
433
461
|
return compareBigDecimals('0', min) >= 0 && compareBigDecimals('0', max) <= 0;
|
|
434
|
-
// default:
|
|
435
|
-
// return false
|
|
436
|
-
// }
|
|
437
462
|
}
|
|
438
463
|
setValidity = (flags, message, anchor) => {
|
|
439
464
|
// let msg
|
|
@@ -442,16 +467,16 @@ export class TextField extends FormAssociatedBase {
|
|
|
442
467
|
const key = k; // ✅ type-safe cast
|
|
443
468
|
if (true !== flags[key])
|
|
444
469
|
continue;
|
|
445
|
-
for (const el of this.#
|
|
470
|
+
for (const el of this.#slots?.get('validity-options')?.assignedElements({ flatten: true }) ?? []) {
|
|
446
471
|
if (!el.matches('option'))
|
|
447
472
|
continue;
|
|
448
|
-
const
|
|
449
|
-
if (`${kebabCase(key)}` ===
|
|
450
|
-
message =
|
|
473
|
+
const { label, value } = el;
|
|
474
|
+
if (`${kebabCase(key)}` === value) {
|
|
475
|
+
message = label;
|
|
451
476
|
break;
|
|
452
477
|
}
|
|
453
|
-
else if (`${kebabCase(key)}:${message}` ===
|
|
454
|
-
message =
|
|
478
|
+
else if (`${kebabCase(key)}:${message}` === value) {
|
|
479
|
+
message = label;
|
|
455
480
|
break;
|
|
456
481
|
}
|
|
457
482
|
}
|
|
@@ -464,7 +489,7 @@ export class TextField extends FormAssociatedBase {
|
|
|
464
489
|
message = kebabCase(key);
|
|
465
490
|
break;
|
|
466
491
|
}
|
|
467
|
-
|
|
492
|
+
debug(`${_a.name} ⚡️ validity-change`);
|
|
468
493
|
return this.#internals.setValidity(flags, this.#customValidity || message, anchor ?? this.#input);
|
|
469
494
|
};
|
|
470
495
|
setCustomValidity = (message) => {
|
|
@@ -474,16 +499,19 @@ export class TextField extends FormAssociatedBase {
|
|
|
474
499
|
else
|
|
475
500
|
this.#sendValueToForm(false);
|
|
476
501
|
};
|
|
477
|
-
|
|
478
|
-
this
|
|
479
|
-
}
|
|
480
|
-
|
|
502
|
+
formStateRestoreCallback(state, reason) {
|
|
503
|
+
this.text = state;
|
|
504
|
+
}
|
|
505
|
+
formAssociatedCallback(form) {
|
|
506
|
+
this.#sendValueToForm(false);
|
|
507
|
+
}
|
|
508
|
+
formDisabledCallback(disabled) {
|
|
481
509
|
for (const el of this.#shadowRoot.querySelectorAll('input'))
|
|
482
510
|
el.toggleAttribute('disabled', !disabled);
|
|
483
|
-
}
|
|
484
|
-
formResetCallback
|
|
511
|
+
}
|
|
512
|
+
formResetCallback() {
|
|
485
513
|
this.text = '';
|
|
486
|
-
this.#sendValueToForm();
|
|
487
|
-
}
|
|
514
|
+
this.#sendValueToForm(false);
|
|
515
|
+
}
|
|
488
516
|
}
|
|
489
517
|
_a = TextField;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class TextView 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
|
+
'text-view': TextView;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { debug } from '../internal/utils';
|
|
2
|
+
export class TextView extends HTMLElement {
|
|
3
|
+
constructor() {
|
|
4
|
+
super();
|
|
5
|
+
}
|
|
6
|
+
connectedCallback() {
|
|
7
|
+
debug(`${TextView.name} ⚡️ connect`);
|
|
8
|
+
}
|
|
9
|
+
disconnectedCallback() {
|
|
10
|
+
debug(`${TextView.name} ⚡️ disconnect`);
|
|
11
|
+
}
|
|
12
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
13
|
+
debug(`${TextView.name} ⚡️ attr-change [${name}]`);
|
|
14
|
+
//
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { FormAssociatedBase } from '../internal/class/form-associated-base';
|
|
2
|
+
declare const toggleStyles: readonly ["switch", "button"];
|
|
3
|
+
export type ToggleStyle = (typeof toggleStyles)[number];
|
|
4
|
+
/**
|
|
5
|
+
* @summary A control that switches between on and off states.
|
|
6
|
+
*
|
|
7
|
+
* @example <toggle-view label="Custom Label"></toggle-view> — Creates a toggle that displays a custom label
|
|
8
|
+
*
|
|
9
|
+
* @fires toggle:change — User toggled the control
|
|
10
|
+
*
|
|
11
|
+
* @slot label
|
|
12
|
+
* @slot {HTMLOptionElement[]} validity-options
|
|
13
|
+
*/
|
|
14
|
+
export declare class ToggleView extends FormAssociatedBase {
|
|
15
|
+
#private;
|
|
16
|
+
static get observedAttributes(): string[];
|
|
17
|
+
static get template(): DocumentFragment;
|
|
18
|
+
constructor();
|
|
19
|
+
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
|
|
20
|
+
disconnectedCallback(): void;
|
|
21
|
+
connectedCallback(): void;
|
|
22
|
+
get toggleStyle(): ToggleStyle;
|
|
23
|
+
get isOn(): boolean;
|
|
24
|
+
set isOn(v: boolean);
|
|
25
|
+
/**
|
|
26
|
+
* Form participation property
|
|
27
|
+
*/
|
|
28
|
+
get name(): string;
|
|
29
|
+
get value(): string | null;
|
|
30
|
+
set value(v: string | null);
|
|
31
|
+
setValidity: (flags?: ValidityStateFlags, message?: string, anchor?: HTMLElement) => void;
|
|
32
|
+
setCustomValidity: (message: string) => void;
|
|
33
|
+
formStateRestoreCallback(state: string, reason: string): void;
|
|
34
|
+
formAssociatedCallback(form: HTMLFormElement): void;
|
|
35
|
+
formDisabledCallback(disabled: boolean): void;
|
|
36
|
+
formResetCallback(): void;
|
|
37
|
+
}
|
|
38
|
+
declare global {
|
|
39
|
+
interface HTMLElementTagNameMap {
|
|
40
|
+
'toggle-view': ToggleView;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export {};
|