@ionic/core 8.7.17-nightly.20260114 → 8.7.18-dev.11768592717.14a59d2f
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/components/ion-footer.js +23 -3
- package/components/ion-input.js +35 -6
- package/components/ion-tab-bar.js +23 -3
- package/components/ion-toast.js +2 -2
- package/dist/cjs/ion-app_8.cjs.entry.js +23 -3
- package/dist/cjs/ion-input.cjs.entry.js +35 -6
- package/dist/cjs/ion-tab-bar_2.cjs.entry.js +23 -3
- package/dist/cjs/ion-toast.cjs.entry.js +2 -2
- package/dist/collection/components/footer/footer.js +23 -3
- package/dist/collection/components/input/input.js +35 -6
- package/dist/collection/components/tab-bar/tab-bar.js +23 -3
- package/dist/collection/components/toast/toast.ios.css +1 -1
- package/dist/collection/components/toast/toast.md.css +1 -1
- package/dist/docs.json +1 -1
- package/dist/esm/ion-app_8.entry.js +23 -3
- package/dist/esm/ion-input.entry.js +35 -6
- package/dist/esm/ion-tab-bar_2.entry.js +23 -3
- package/dist/esm/ion-toast.entry.js +2 -2
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/{p-b3d44509.entry.js → p-0e8c8a10.entry.js} +1 -1
- package/dist/ionic/p-172a579f.entry.js +4 -0
- package/dist/ionic/p-1ccd6829.entry.js +4 -0
- package/dist/ionic/p-66fbe052.entry.js +4 -0
- package/dist/types/components/footer/footer.d.ts +1 -0
- package/dist/types/components/input/input.d.ts +11 -0
- package/dist/types/components/tab-bar/tab-bar.d.ts +1 -0
- package/hydrate/index.js +82 -14
- package/hydrate/index.mjs +82 -14
- package/package.json +1 -1
- package/dist/ionic/p-7268efa5.entry.js +0 -4
- package/dist/ionic/p-9ab2d871.entry.js +0 -4
- package/dist/ionic/p-db8027bd.entry.js +0 -4
|
@@ -21,6 +21,7 @@ export class Input {
|
|
|
21
21
|
this.inputId = `ion-input-${inputIds++}`;
|
|
22
22
|
this.helperTextId = `${this.inputId}-helper-text`;
|
|
23
23
|
this.errorTextId = `${this.inputId}-error-text`;
|
|
24
|
+
this.labelTextId = `${this.inputId}-label`;
|
|
24
25
|
this.inheritedAttributes = {};
|
|
25
26
|
this.isComposing = false;
|
|
26
27
|
/**
|
|
@@ -229,7 +230,11 @@ export class Input {
|
|
|
229
230
|
}
|
|
230
231
|
connectedCallback() {
|
|
231
232
|
const { el } = this;
|
|
232
|
-
this.slotMutationController = createSlotMutationController(el, ['label', 'start', 'end'], () =>
|
|
233
|
+
this.slotMutationController = createSlotMutationController(el, ['label', 'start', 'end'], () => {
|
|
234
|
+
this.setSlottedLabelId();
|
|
235
|
+
forceUpdate(this);
|
|
236
|
+
});
|
|
237
|
+
this.setSlottedLabelId();
|
|
233
238
|
this.notchController = createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
|
|
234
239
|
// Watch for class changes to update validation state
|
|
235
240
|
if (Build.isBrowser && typeof MutationObserver !== 'undefined') {
|
|
@@ -432,11 +437,11 @@ export class Input {
|
|
|
432
437
|
return (h("div", { class: "input-bottom" }, this.renderHintText(), this.renderCounter()));
|
|
433
438
|
}
|
|
434
439
|
renderLabel() {
|
|
435
|
-
const { label } = this;
|
|
440
|
+
const { label, labelTextId } = this;
|
|
436
441
|
return (h("div", { class: {
|
|
437
442
|
'label-text-wrapper': true,
|
|
438
443
|
'label-text-wrapper-hidden': !this.hasLabel,
|
|
439
|
-
} }, label === undefined ? h("slot", { name: "label" }) : h("div", { class: "label-text" }, label)));
|
|
444
|
+
}, "aria-hidden": this.hasLabel ? 'true' : null }, label === undefined ? (h("slot", { name: "label" })) : (h("div", { class: "label-text", id: labelTextId }, label))));
|
|
440
445
|
}
|
|
441
446
|
/**
|
|
442
447
|
* Gets any content passed into the `label` slot,
|
|
@@ -445,6 +450,30 @@ export class Input {
|
|
|
445
450
|
get labelSlot() {
|
|
446
451
|
return this.el.querySelector('[slot="label"]');
|
|
447
452
|
}
|
|
453
|
+
/**
|
|
454
|
+
* Ensures the slotted label element has an ID for aria-labelledby.
|
|
455
|
+
* If no ID exists, we assign one using our generated labelTextId.
|
|
456
|
+
*/
|
|
457
|
+
setSlottedLabelId() {
|
|
458
|
+
const slottedLabel = this.labelSlot;
|
|
459
|
+
if (slottedLabel && !slottedLabel.id) {
|
|
460
|
+
slottedLabel.id = this.labelTextId;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Returns the ID to use for aria-labelledby on the native input,
|
|
465
|
+
* or undefined if aria-label is explicitly set (to avoid conflicts).
|
|
466
|
+
*/
|
|
467
|
+
getLabelledById() {
|
|
468
|
+
var _a;
|
|
469
|
+
if (this.inheritedAttributes['aria-label']) {
|
|
470
|
+
return undefined;
|
|
471
|
+
}
|
|
472
|
+
if (this.label !== undefined) {
|
|
473
|
+
return this.labelTextId;
|
|
474
|
+
}
|
|
475
|
+
return ((_a = this.labelSlot) === null || _a === void 0 ? void 0 : _a.id) || undefined;
|
|
476
|
+
}
|
|
448
477
|
/**
|
|
449
478
|
* Returns `true` if label content is provided
|
|
450
479
|
* either by a prop or a content. If you want
|
|
@@ -511,7 +540,7 @@ export class Input {
|
|
|
511
540
|
* TODO(FW-5592): Remove hasStartEndSlots condition
|
|
512
541
|
*/
|
|
513
542
|
const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || hasStartEndSlots));
|
|
514
|
-
return (h(Host, { key: '
|
|
543
|
+
return (h(Host, { key: '9ba9cf425b573d2ca9ac34455a0e6b8474c4de6d', class: createColorClasses(this.color, {
|
|
515
544
|
[mode]: true,
|
|
516
545
|
'has-value': hasValue,
|
|
517
546
|
'has-focus': hasFocus,
|
|
@@ -522,14 +551,14 @@ export class Input {
|
|
|
522
551
|
'in-item': inItem,
|
|
523
552
|
'in-item-color': hostContext('ion-item.ion-color', this.el),
|
|
524
553
|
'input-disabled': disabled,
|
|
525
|
-
}) }, h("label", { key: '
|
|
554
|
+
}) }, h("label", { key: '74b989d0aa5ab38f29f952519868f05119df6005', class: "input-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, this.renderLabelContainer(), h("div", { key: '47f2b42e2f74ea866b4f871026e08ab375d7a726', class: "native-wrapper", onClick: this.onLabelClick }, h("slot", { key: 'eaabe5a4a329a356cac3294d15c087d0d131fff2', name: "start" }), h("input", Object.assign({ key: 'c821a984a8a9b7f96f30892c06d8deda093ff24b', class: "native-input", ref: (input) => (this.nativeInput = input), id: inputId, disabled: disabled, autoCapitalize: this.autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect, autoFocus: this.autofocus, enterKeyHint: this.enterkeyhint, inputMode: this.inputmode, min: this.min, max: this.max, minLength: this.minlength, maxLength: this.maxlength, multiple: this.multiple, name: this.name, pattern: this.pattern, placeholder: this.placeholder || '', readOnly: readonly, required: this.required, spellcheck: this.spellcheck, step: this.step, type: this.type, value: value, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, onKeyDown: this.onKeydown, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd, "aria-describedby": this.getHintTextID(), "aria-invalid": this.isInvalid ? 'true' : undefined, "aria-labelledby": this.getLabelledById() }, this.inheritedAttributes)), this.clearInput && !readonly && !disabled && (h("button", { key: '62069c11016ee190dc46ab941372e1c4ad8a36ed', "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
|
|
526
555
|
/**
|
|
527
556
|
* This prevents mobile browsers from
|
|
528
557
|
* blurring the input when the clear
|
|
529
558
|
* button is activated.
|
|
530
559
|
*/
|
|
531
560
|
ev.preventDefault();
|
|
532
|
-
}, onClick: this.clearTextInput }, h("ion-icon", { key: '
|
|
561
|
+
}, onClick: this.clearTextInput }, h("ion-icon", { key: 'dd75a516d32110d85382b664c663bd41f177ce12', "aria-hidden": "true", icon: clearIconData }))), h("slot", { key: '330d4b9389f2c62223a5ee24003e96ef3e6b2473', name: "end" })), shouldRenderHighlight && h("div", { key: '8e442bed130ddc84976ab70fd3f8578d6bcc6316', class: "input-highlight" })), this.renderBottomContent()));
|
|
533
562
|
}
|
|
534
563
|
static get is() { return "ion-input"; }
|
|
535
564
|
static get encapsulation() { return "scoped"; }
|
|
@@ -11,6 +11,7 @@ import { getIonMode } from "../../global/ionic-global";
|
|
|
11
11
|
export class TabBar {
|
|
12
12
|
constructor() {
|
|
13
13
|
this.keyboardCtrl = null;
|
|
14
|
+
this.keyboardCtrlPromise = null;
|
|
14
15
|
this.didLoad = false;
|
|
15
16
|
this.keyboardVisible = false;
|
|
16
17
|
/**
|
|
@@ -46,7 +47,7 @@ export class TabBar {
|
|
|
46
47
|
}
|
|
47
48
|
}
|
|
48
49
|
async connectedCallback() {
|
|
49
|
-
|
|
50
|
+
const promise = createKeyboardController(async (keyboardOpen, waitForResize) => {
|
|
50
51
|
/**
|
|
51
52
|
* If the keyboard is hiding, then we need to wait
|
|
52
53
|
* for the webview to resize. Otherwise, the tab bar
|
|
@@ -57,21 +58,40 @@ export class TabBar {
|
|
|
57
58
|
}
|
|
58
59
|
this.keyboardVisible = keyboardOpen; // trigger re-render by updating state
|
|
59
60
|
});
|
|
61
|
+
this.keyboardCtrlPromise = promise;
|
|
62
|
+
const keyboardCtrl = await promise;
|
|
63
|
+
/**
|
|
64
|
+
* Only assign if this is still the current promise.
|
|
65
|
+
* Otherwise, a new connectedCallback has started or
|
|
66
|
+
* disconnectedCallback was called, so destroy this instance.
|
|
67
|
+
*/
|
|
68
|
+
if (this.keyboardCtrlPromise === promise) {
|
|
69
|
+
this.keyboardCtrl = keyboardCtrl;
|
|
70
|
+
this.keyboardCtrlPromise = null;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
keyboardCtrl.destroy();
|
|
74
|
+
}
|
|
60
75
|
}
|
|
61
76
|
disconnectedCallback() {
|
|
77
|
+
if (this.keyboardCtrlPromise) {
|
|
78
|
+
this.keyboardCtrlPromise.then((ctrl) => ctrl.destroy());
|
|
79
|
+
this.keyboardCtrlPromise = null;
|
|
80
|
+
}
|
|
62
81
|
if (this.keyboardCtrl) {
|
|
63
82
|
this.keyboardCtrl.destroy();
|
|
83
|
+
this.keyboardCtrl = null;
|
|
64
84
|
}
|
|
65
85
|
}
|
|
66
86
|
render() {
|
|
67
87
|
const { color, translucent, keyboardVisible } = this;
|
|
68
88
|
const mode = getIonMode(this);
|
|
69
89
|
const shouldHide = keyboardVisible && this.el.getAttribute('slot') !== 'top';
|
|
70
|
-
return (h(Host, { key: '
|
|
90
|
+
return (h(Host, { key: '9daf4e2acaff6e3ce3878cf9dd5109fb1afbbebe', role: "tablist", "aria-hidden": shouldHide ? 'true' : null, class: createColorClasses(color, {
|
|
71
91
|
[mode]: true,
|
|
72
92
|
'tab-bar-translucent': translucent,
|
|
73
93
|
'tab-bar-hidden': shouldHide,
|
|
74
|
-
}) }, h("slot", { key: '
|
|
94
|
+
}) }, h("slot", { key: '1d15aa2da8501e8e7eff11ad4a491478be845c43' })));
|
|
75
95
|
}
|
|
76
96
|
static get is() { return "ion-tab-bar"; }
|
|
77
97
|
static get encapsulation() { return "shadow"; }
|
|
@@ -168,7 +168,6 @@
|
|
|
168
168
|
|
|
169
169
|
.toast-layout-baseline .toast-content {
|
|
170
170
|
display: flex;
|
|
171
|
-
flex: 1;
|
|
172
171
|
flex-direction: column;
|
|
173
172
|
justify-content: center;
|
|
174
173
|
}
|
|
@@ -179,6 +178,7 @@
|
|
|
179
178
|
}
|
|
180
179
|
|
|
181
180
|
.toast-content {
|
|
181
|
+
flex: 1;
|
|
182
182
|
min-width: 0;
|
|
183
183
|
}
|
|
184
184
|
|
|
@@ -168,7 +168,6 @@
|
|
|
168
168
|
|
|
169
169
|
.toast-layout-baseline .toast-content {
|
|
170
170
|
display: flex;
|
|
171
|
-
flex: 1;
|
|
172
171
|
flex-direction: column;
|
|
173
172
|
justify-content: center;
|
|
174
173
|
}
|
|
@@ -179,6 +178,7 @@
|
|
|
179
178
|
}
|
|
180
179
|
|
|
181
180
|
.toast-content {
|
|
181
|
+
flex: 1;
|
|
182
182
|
min-width: 0;
|
|
183
183
|
}
|
|
184
184
|
|
package/dist/docs.json
CHANGED
|
@@ -624,6 +624,7 @@ const Footer = class {
|
|
|
624
624
|
constructor(hostRef) {
|
|
625
625
|
registerInstance(this, hostRef);
|
|
626
626
|
this.keyboardCtrl = null;
|
|
627
|
+
this.keyboardCtrlPromise = null;
|
|
627
628
|
this.keyboardVisible = false;
|
|
628
629
|
/**
|
|
629
630
|
* If `true`, the footer will be translucent.
|
|
@@ -671,7 +672,7 @@ const Footer = class {
|
|
|
671
672
|
this.checkCollapsibleFooter();
|
|
672
673
|
}
|
|
673
674
|
async connectedCallback() {
|
|
674
|
-
|
|
675
|
+
const promise = createKeyboardController(async (keyboardOpen, waitForResize) => {
|
|
675
676
|
/**
|
|
676
677
|
* If the keyboard is hiding, then we need to wait
|
|
677
678
|
* for the webview to resize. Otherwise, the footer
|
|
@@ -682,10 +683,29 @@ const Footer = class {
|
|
|
682
683
|
}
|
|
683
684
|
this.keyboardVisible = keyboardOpen; // trigger re-render by updating state
|
|
684
685
|
});
|
|
686
|
+
this.keyboardCtrlPromise = promise;
|
|
687
|
+
const keyboardCtrl = await promise;
|
|
688
|
+
/**
|
|
689
|
+
* Only assign if this is still the current promise.
|
|
690
|
+
* Otherwise, a new connectedCallback has started or
|
|
691
|
+
* disconnectedCallback was called, so destroy this instance.
|
|
692
|
+
*/
|
|
693
|
+
if (this.keyboardCtrlPromise === promise) {
|
|
694
|
+
this.keyboardCtrl = keyboardCtrl;
|
|
695
|
+
this.keyboardCtrlPromise = null;
|
|
696
|
+
}
|
|
697
|
+
else {
|
|
698
|
+
keyboardCtrl.destroy();
|
|
699
|
+
}
|
|
685
700
|
}
|
|
686
701
|
disconnectedCallback() {
|
|
702
|
+
if (this.keyboardCtrlPromise) {
|
|
703
|
+
this.keyboardCtrlPromise.then((ctrl) => ctrl.destroy());
|
|
704
|
+
this.keyboardCtrlPromise = null;
|
|
705
|
+
}
|
|
687
706
|
if (this.keyboardCtrl) {
|
|
688
707
|
this.keyboardCtrl.destroy();
|
|
708
|
+
this.keyboardCtrl = null;
|
|
689
709
|
}
|
|
690
710
|
}
|
|
691
711
|
destroyCollapsibleFooter() {
|
|
@@ -699,7 +719,7 @@ const Footer = class {
|
|
|
699
719
|
const mode = getIonMode(this);
|
|
700
720
|
const tabs = this.el.closest('ion-tabs');
|
|
701
721
|
const tabBar = tabs === null || tabs === void 0 ? void 0 : tabs.querySelector(':scope > ion-tab-bar');
|
|
702
|
-
return (h(Host, { key: '
|
|
722
|
+
return (h(Host, { key: '71939c4bbaef5062532a99ee2e33574102a9abad', role: "contentinfo", class: {
|
|
703
723
|
[mode]: true,
|
|
704
724
|
// Used internally for styling
|
|
705
725
|
[`footer-${mode}`]: true,
|
|
@@ -707,7 +727,7 @@ const Footer = class {
|
|
|
707
727
|
[`footer-translucent-${mode}`]: translucent,
|
|
708
728
|
['footer-toolbar-padding']: !this.keyboardVisible && (!tabBar || tabBar.slot !== 'bottom'),
|
|
709
729
|
[`footer-collapse-${collapse}`]: collapse !== undefined,
|
|
710
|
-
} }, mode === 'ios' && translucent && h("div", { key: '
|
|
730
|
+
} }, mode === 'ios' && translucent && h("div", { key: '2fa14f61661c47c661cecd696176728d6eafa74f', class: "footer-background" }), h("slot", { key: '8e63696e7c528d5c38201e546bf08135290d0945' })));
|
|
711
731
|
}
|
|
712
732
|
get el() { return getElement(this); }
|
|
713
733
|
};
|
|
@@ -25,6 +25,7 @@ const Input = class {
|
|
|
25
25
|
this.inputId = `ion-input-${inputIds++}`;
|
|
26
26
|
this.helperTextId = `${this.inputId}-helper-text`;
|
|
27
27
|
this.errorTextId = `${this.inputId}-error-text`;
|
|
28
|
+
this.labelTextId = `${this.inputId}-label`;
|
|
28
29
|
this.inheritedAttributes = {};
|
|
29
30
|
this.isComposing = false;
|
|
30
31
|
/**
|
|
@@ -233,7 +234,11 @@ const Input = class {
|
|
|
233
234
|
}
|
|
234
235
|
connectedCallback() {
|
|
235
236
|
const { el } = this;
|
|
236
|
-
this.slotMutationController = createSlotMutationController(el, ['label', 'start', 'end'], () =>
|
|
237
|
+
this.slotMutationController = createSlotMutationController(el, ['label', 'start', 'end'], () => {
|
|
238
|
+
this.setSlottedLabelId();
|
|
239
|
+
forceUpdate(this);
|
|
240
|
+
});
|
|
241
|
+
this.setSlottedLabelId();
|
|
237
242
|
this.notchController = createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
|
|
238
243
|
// Watch for class changes to update validation state
|
|
239
244
|
if (typeof MutationObserver !== 'undefined') {
|
|
@@ -436,11 +441,11 @@ const Input = class {
|
|
|
436
441
|
return (h("div", { class: "input-bottom" }, this.renderHintText(), this.renderCounter()));
|
|
437
442
|
}
|
|
438
443
|
renderLabel() {
|
|
439
|
-
const { label } = this;
|
|
444
|
+
const { label, labelTextId } = this;
|
|
440
445
|
return (h("div", { class: {
|
|
441
446
|
'label-text-wrapper': true,
|
|
442
447
|
'label-text-wrapper-hidden': !this.hasLabel,
|
|
443
|
-
} }, label === undefined ? h("slot", { name: "label" }) : h("div", { class: "label-text" }, label)));
|
|
448
|
+
}, "aria-hidden": this.hasLabel ? 'true' : null }, label === undefined ? (h("slot", { name: "label" })) : (h("div", { class: "label-text", id: labelTextId }, label))));
|
|
444
449
|
}
|
|
445
450
|
/**
|
|
446
451
|
* Gets any content passed into the `label` slot,
|
|
@@ -449,6 +454,30 @@ const Input = class {
|
|
|
449
454
|
get labelSlot() {
|
|
450
455
|
return this.el.querySelector('[slot="label"]');
|
|
451
456
|
}
|
|
457
|
+
/**
|
|
458
|
+
* Ensures the slotted label element has an ID for aria-labelledby.
|
|
459
|
+
* If no ID exists, we assign one using our generated labelTextId.
|
|
460
|
+
*/
|
|
461
|
+
setSlottedLabelId() {
|
|
462
|
+
const slottedLabel = this.labelSlot;
|
|
463
|
+
if (slottedLabel && !slottedLabel.id) {
|
|
464
|
+
slottedLabel.id = this.labelTextId;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Returns the ID to use for aria-labelledby on the native input,
|
|
469
|
+
* or undefined if aria-label is explicitly set (to avoid conflicts).
|
|
470
|
+
*/
|
|
471
|
+
getLabelledById() {
|
|
472
|
+
var _a;
|
|
473
|
+
if (this.inheritedAttributes['aria-label']) {
|
|
474
|
+
return undefined;
|
|
475
|
+
}
|
|
476
|
+
if (this.label !== undefined) {
|
|
477
|
+
return this.labelTextId;
|
|
478
|
+
}
|
|
479
|
+
return ((_a = this.labelSlot) === null || _a === void 0 ? void 0 : _a.id) || undefined;
|
|
480
|
+
}
|
|
452
481
|
/**
|
|
453
482
|
* Returns `true` if label content is provided
|
|
454
483
|
* either by a prop or a content. If you want
|
|
@@ -515,7 +544,7 @@ const Input = class {
|
|
|
515
544
|
* TODO(FW-5592): Remove hasStartEndSlots condition
|
|
516
545
|
*/
|
|
517
546
|
const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || hasStartEndSlots));
|
|
518
|
-
return (h(Host, { key: '
|
|
547
|
+
return (h(Host, { key: '9ba9cf425b573d2ca9ac34455a0e6b8474c4de6d', class: createColorClasses(this.color, {
|
|
519
548
|
[mode]: true,
|
|
520
549
|
'has-value': hasValue,
|
|
521
550
|
'has-focus': hasFocus,
|
|
@@ -526,14 +555,14 @@ const Input = class {
|
|
|
526
555
|
'in-item': inItem,
|
|
527
556
|
'in-item-color': hostContext('ion-item.ion-color', this.el),
|
|
528
557
|
'input-disabled': disabled,
|
|
529
|
-
}) }, h("label", { key: '
|
|
558
|
+
}) }, h("label", { key: '74b989d0aa5ab38f29f952519868f05119df6005', class: "input-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, this.renderLabelContainer(), h("div", { key: '47f2b42e2f74ea866b4f871026e08ab375d7a726', class: "native-wrapper", onClick: this.onLabelClick }, h("slot", { key: 'eaabe5a4a329a356cac3294d15c087d0d131fff2', name: "start" }), h("input", Object.assign({ key: 'c821a984a8a9b7f96f30892c06d8deda093ff24b', class: "native-input", ref: (input) => (this.nativeInput = input), id: inputId, disabled: disabled, autoCapitalize: this.autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect, autoFocus: this.autofocus, enterKeyHint: this.enterkeyhint, inputMode: this.inputmode, min: this.min, max: this.max, minLength: this.minlength, maxLength: this.maxlength, multiple: this.multiple, name: this.name, pattern: this.pattern, placeholder: this.placeholder || '', readOnly: readonly, required: this.required, spellcheck: this.spellcheck, step: this.step, type: this.type, value: value, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, onKeyDown: this.onKeydown, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd, "aria-describedby": this.getHintTextID(), "aria-invalid": this.isInvalid ? 'true' : undefined, "aria-labelledby": this.getLabelledById() }, this.inheritedAttributes)), this.clearInput && !readonly && !disabled && (h("button", { key: '62069c11016ee190dc46ab941372e1c4ad8a36ed', "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
|
|
530
559
|
/**
|
|
531
560
|
* This prevents mobile browsers from
|
|
532
561
|
* blurring the input when the clear
|
|
533
562
|
* button is activated.
|
|
534
563
|
*/
|
|
535
564
|
ev.preventDefault();
|
|
536
|
-
}, onClick: this.clearTextInput }, h("ion-icon", { key: '
|
|
565
|
+
}, onClick: this.clearTextInput }, h("ion-icon", { key: 'dd75a516d32110d85382b664c663bd41f177ce12', "aria-hidden": "true", icon: clearIconData }))), h("slot", { key: '330d4b9389f2c62223a5ee24003e96ef3e6b2473', name: "end" })), shouldRenderHighlight && h("div", { key: '8e442bed130ddc84976ab70fd3f8578d6bcc6316', class: "input-highlight" })), this.renderBottomContent()));
|
|
537
566
|
}
|
|
538
567
|
get el() { return getElement(this); }
|
|
539
568
|
static get watchers() { return {
|
|
@@ -20,6 +20,7 @@ const TabBar = class {
|
|
|
20
20
|
this.ionTabBarChanged = createEvent(this, "ionTabBarChanged", 7);
|
|
21
21
|
this.ionTabBarLoaded = createEvent(this, "ionTabBarLoaded", 7);
|
|
22
22
|
this.keyboardCtrl = null;
|
|
23
|
+
this.keyboardCtrlPromise = null;
|
|
23
24
|
this.didLoad = false;
|
|
24
25
|
this.keyboardVisible = false;
|
|
25
26
|
/**
|
|
@@ -55,7 +56,7 @@ const TabBar = class {
|
|
|
55
56
|
}
|
|
56
57
|
}
|
|
57
58
|
async connectedCallback() {
|
|
58
|
-
|
|
59
|
+
const promise = createKeyboardController(async (keyboardOpen, waitForResize) => {
|
|
59
60
|
/**
|
|
60
61
|
* If the keyboard is hiding, then we need to wait
|
|
61
62
|
* for the webview to resize. Otherwise, the tab bar
|
|
@@ -66,21 +67,40 @@ const TabBar = class {
|
|
|
66
67
|
}
|
|
67
68
|
this.keyboardVisible = keyboardOpen; // trigger re-render by updating state
|
|
68
69
|
});
|
|
70
|
+
this.keyboardCtrlPromise = promise;
|
|
71
|
+
const keyboardCtrl = await promise;
|
|
72
|
+
/**
|
|
73
|
+
* Only assign if this is still the current promise.
|
|
74
|
+
* Otherwise, a new connectedCallback has started or
|
|
75
|
+
* disconnectedCallback was called, so destroy this instance.
|
|
76
|
+
*/
|
|
77
|
+
if (this.keyboardCtrlPromise === promise) {
|
|
78
|
+
this.keyboardCtrl = keyboardCtrl;
|
|
79
|
+
this.keyboardCtrlPromise = null;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
keyboardCtrl.destroy();
|
|
83
|
+
}
|
|
69
84
|
}
|
|
70
85
|
disconnectedCallback() {
|
|
86
|
+
if (this.keyboardCtrlPromise) {
|
|
87
|
+
this.keyboardCtrlPromise.then((ctrl) => ctrl.destroy());
|
|
88
|
+
this.keyboardCtrlPromise = null;
|
|
89
|
+
}
|
|
71
90
|
if (this.keyboardCtrl) {
|
|
72
91
|
this.keyboardCtrl.destroy();
|
|
92
|
+
this.keyboardCtrl = null;
|
|
73
93
|
}
|
|
74
94
|
}
|
|
75
95
|
render() {
|
|
76
96
|
const { color, translucent, keyboardVisible } = this;
|
|
77
97
|
const mode = getIonMode(this);
|
|
78
98
|
const shouldHide = keyboardVisible && this.el.getAttribute('slot') !== 'top';
|
|
79
|
-
return (h(Host, { key: '
|
|
99
|
+
return (h(Host, { key: '9daf4e2acaff6e3ce3878cf9dd5109fb1afbbebe', role: "tablist", "aria-hidden": shouldHide ? 'true' : null, class: createColorClasses(color, {
|
|
80
100
|
[mode]: true,
|
|
81
101
|
'tab-bar-translucent': translucent,
|
|
82
102
|
'tab-bar-hidden': shouldHide,
|
|
83
|
-
}) }, h("slot", { key: '
|
|
103
|
+
}) }, h("slot", { key: '1d15aa2da8501e8e7eff11ad4a491478be845c43' })));
|
|
84
104
|
}
|
|
85
105
|
get el() { return getElement(this); }
|
|
86
106
|
static get watchers() { return {
|
|
@@ -449,9 +449,9 @@ const createSwipeToDismissGesture = (el, toastPosition, onDismiss) => {
|
|
|
449
449
|
return gesture;
|
|
450
450
|
};
|
|
451
451
|
|
|
452
|
-
const toastIosCss = ":host{--border-width:0;--border-style:none;--border-color:initial;--box-shadow:none;--min-width:auto;--width:auto;--min-height:auto;--height:auto;--max-height:auto;--white-space:normal;top:0;display:block;position:absolute;width:100%;height:100%;outline:none;color:var(--color);font-family:var(--ion-font-family, inherit);contain:strict;z-index:1001;pointer-events:none}:host{inset-inline-start:0}:host(.overlay-hidden){display:none}:host(.ion-color){--button-color:inherit;color:var(--ion-color-contrast)}:host(.ion-color) .toast-button-cancel{color:inherit}:host(.ion-color) .toast-wrapper{background:var(--ion-color-base)}.toast-wrapper{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);pointer-events:auto}.toast-wrapper{inset-inline-start:var(--start);inset-inline-end:var(--end)}.toast-wrapper.toast-top{-webkit-transform:translate3d(0, -100%, 0);transform:translate3d(0, -100%, 0);top:0}.toast-wrapper.toast-bottom{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0);bottom:0}.toast-container{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;height:inherit;min-height:inherit;max-height:inherit;contain:content}.toast-layout-stacked .toast-container{-ms-flex-wrap:wrap;flex-wrap:wrap}.toast-layout-baseline .toast-content{display:-ms-flexbox;display:flex;-ms-flex
|
|
452
|
+
const toastIosCss = ":host{--border-width:0;--border-style:none;--border-color:initial;--box-shadow:none;--min-width:auto;--width:auto;--min-height:auto;--height:auto;--max-height:auto;--white-space:normal;top:0;display:block;position:absolute;width:100%;height:100%;outline:none;color:var(--color);font-family:var(--ion-font-family, inherit);contain:strict;z-index:1001;pointer-events:none}:host{inset-inline-start:0}:host(.overlay-hidden){display:none}:host(.ion-color){--button-color:inherit;color:var(--ion-color-contrast)}:host(.ion-color) .toast-button-cancel{color:inherit}:host(.ion-color) .toast-wrapper{background:var(--ion-color-base)}.toast-wrapper{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);pointer-events:auto}.toast-wrapper{inset-inline-start:var(--start);inset-inline-end:var(--end)}.toast-wrapper.toast-top{-webkit-transform:translate3d(0, -100%, 0);transform:translate3d(0, -100%, 0);top:0}.toast-wrapper.toast-bottom{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0);bottom:0}.toast-container{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;height:inherit;min-height:inherit;max-height:inherit;contain:content}.toast-layout-stacked .toast-container{-ms-flex-wrap:wrap;flex-wrap:wrap}.toast-layout-baseline .toast-content{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.toast-icon{-webkit-margin-start:16px;margin-inline-start:16px}.toast-content{-ms-flex:1;flex:1;min-width:0}.toast-message{-ms-flex:1;flex:1;white-space:var(--white-space)}.toast-button-group{display:-ms-flexbox;display:flex}.toast-layout-stacked .toast-button-group{-ms-flex-pack:end;justify-content:end;width:100%}.toast-button{border:0;outline:none;color:var(--button-color);z-index:0}.toast-icon,.toast-button-icon{font-size:1.4em}.toast-button-inner{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}@media (any-hover: hover){.toast-button:hover{cursor:pointer}}:host{--background:var(--ion-color-step-50, var(--ion-background-color-step-50, #f2f2f2));--border-radius:14px;--button-color:var(--ion-color-primary, #0054e9);--color:var(--ion-color-step-850, var(--ion-text-color-step-150, #262626));--max-width:700px;--max-height:478px;--start:10px;--end:10px;font-size:clamp(14px, 0.875rem, 43.4px)}.toast-wrapper{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-top:auto;margin-bottom:auto;display:block;position:absolute;z-index:10}@supports ((-webkit-backdrop-filter: blur(0)) or (backdrop-filter: blur(0))){:host(.toast-translucent) .toast-wrapper{background:rgba(var(--ion-background-color-rgb, 255, 255, 255), 0.8);-webkit-backdrop-filter:saturate(180%) blur(20px);backdrop-filter:saturate(180%) blur(20px)}:host(.ion-color.toast-translucent) .toast-wrapper{background:rgba(var(--ion-color-base-rgb), 0.8)}}.toast-wrapper.toast-middle{opacity:0.01}.toast-content{-webkit-padding-start:15px;padding-inline-start:15px;-webkit-padding-end:15px;padding-inline-end:15px;padding-top:15px;padding-bottom:15px}.toast-header{margin-bottom:2px;font-weight:500}.toast-button{-webkit-padding-start:15px;padding-inline-start:15px;-webkit-padding-end:15px;padding-inline-end:15px;padding-top:10px;padding-bottom:10px;min-height:44px;-webkit-transition:background-color, opacity 100ms linear;transition:background-color, opacity 100ms linear;border:0;background-color:transparent;font-family:var(--ion-font-family);font-size:clamp(17px, 1.0625rem, 21.998px);font-weight:500;overflow:hidden}.toast-button.ion-activated{opacity:0.4}@media (any-hover: hover){.toast-button:hover{opacity:0.6}}";
|
|
453
453
|
|
|
454
|
-
const toastMdCss = ":host{--border-width:0;--border-style:none;--border-color:initial;--box-shadow:none;--min-width:auto;--width:auto;--min-height:auto;--height:auto;--max-height:auto;--white-space:normal;top:0;display:block;position:absolute;width:100%;height:100%;outline:none;color:var(--color);font-family:var(--ion-font-family, inherit);contain:strict;z-index:1001;pointer-events:none}:host{inset-inline-start:0}:host(.overlay-hidden){display:none}:host(.ion-color){--button-color:inherit;color:var(--ion-color-contrast)}:host(.ion-color) .toast-button-cancel{color:inherit}:host(.ion-color) .toast-wrapper{background:var(--ion-color-base)}.toast-wrapper{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);pointer-events:auto}.toast-wrapper{inset-inline-start:var(--start);inset-inline-end:var(--end)}.toast-wrapper.toast-top{-webkit-transform:translate3d(0, -100%, 0);transform:translate3d(0, -100%, 0);top:0}.toast-wrapper.toast-bottom{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0);bottom:0}.toast-container{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;height:inherit;min-height:inherit;max-height:inherit;contain:content}.toast-layout-stacked .toast-container{-ms-flex-wrap:wrap;flex-wrap:wrap}.toast-layout-baseline .toast-content{display:-ms-flexbox;display:flex;-ms-flex
|
|
454
|
+
const toastMdCss = ":host{--border-width:0;--border-style:none;--border-color:initial;--box-shadow:none;--min-width:auto;--width:auto;--min-height:auto;--height:auto;--max-height:auto;--white-space:normal;top:0;display:block;position:absolute;width:100%;height:100%;outline:none;color:var(--color);font-family:var(--ion-font-family, inherit);contain:strict;z-index:1001;pointer-events:none}:host{inset-inline-start:0}:host(.overlay-hidden){display:none}:host(.ion-color){--button-color:inherit;color:var(--ion-color-contrast)}:host(.ion-color) .toast-button-cancel{color:inherit}:host(.ion-color) .toast-wrapper{background:var(--ion-color-base)}.toast-wrapper{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);pointer-events:auto}.toast-wrapper{inset-inline-start:var(--start);inset-inline-end:var(--end)}.toast-wrapper.toast-top{-webkit-transform:translate3d(0, -100%, 0);transform:translate3d(0, -100%, 0);top:0}.toast-wrapper.toast-bottom{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0);bottom:0}.toast-container{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;height:inherit;min-height:inherit;max-height:inherit;contain:content}.toast-layout-stacked .toast-container{-ms-flex-wrap:wrap;flex-wrap:wrap}.toast-layout-baseline .toast-content{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.toast-icon{-webkit-margin-start:16px;margin-inline-start:16px}.toast-content{-ms-flex:1;flex:1;min-width:0}.toast-message{-ms-flex:1;flex:1;white-space:var(--white-space)}.toast-button-group{display:-ms-flexbox;display:flex}.toast-layout-stacked .toast-button-group{-ms-flex-pack:end;justify-content:end;width:100%}.toast-button{border:0;outline:none;color:var(--button-color);z-index:0}.toast-icon,.toast-button-icon{font-size:1.4em}.toast-button-inner{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}@media (any-hover: hover){.toast-button:hover{cursor:pointer}}:host{--background:var(--ion-color-step-800, var(--ion-background-color-step-800, #333333));--border-radius:4px;--box-shadow:0 3px 5px -1px rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12);--button-color:var(--ion-color-primary, #0054e9);--color:var(--ion-color-step-50, var(--ion-text-color-step-950, #f2f2f2));--max-width:700px;--start:8px;--end:8px;font-size:0.875rem}.toast-wrapper{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;margin-top:auto;margin-bottom:auto;display:block;position:absolute;opacity:0.01;z-index:10}.toast-content{-webkit-padding-start:16px;padding-inline-start:16px;-webkit-padding-end:16px;padding-inline-end:16px;padding-top:14px;padding-bottom:14px}.toast-header{margin-bottom:2px;font-weight:500;line-height:1.25rem}.toast-message{line-height:1.25rem}.toast-layout-baseline .toast-button-group-start{-webkit-margin-start:8px;margin-inline-start:8px}.toast-layout-stacked .toast-button-group-start{-webkit-margin-end:8px;margin-inline-end:8px;margin-top:8px}.toast-layout-baseline .toast-button-group-end{-webkit-margin-end:8px;margin-inline-end:8px}.toast-layout-stacked .toast-button-group-end{-webkit-margin-end:8px;margin-inline-end:8px;margin-bottom:8px}.toast-button{-webkit-padding-start:15px;padding-inline-start:15px;-webkit-padding-end:15px;padding-inline-end:15px;padding-top:10px;padding-bottom:10px;position:relative;background-color:transparent;font-family:var(--ion-font-family);font-size:0.875rem;font-weight:500;letter-spacing:0.84px;text-transform:uppercase;overflow:hidden}.toast-button-cancel{color:var(--ion-color-step-100, var(--ion-text-color-step-900, #e6e6e6))}.toast-button-icon-only{border-radius:50%;-webkit-padding-start:9px;padding-inline-start:9px;-webkit-padding-end:9px;padding-inline-end:9px;padding-top:9px;padding-bottom:9px;width:36px;height:36px}@media (any-hover: hover){.toast-button:hover{background-color:rgba(var(--ion-color-primary-rgb, 0, 84, 233), 0.08)}.toast-button-cancel:hover{background-color:rgba(var(--ion-background-color-rgb, 255, 255, 255), 0.08)}}";
|
|
455
455
|
|
|
456
456
|
const Toast = class {
|
|
457
457
|
constructor(hostRef) {
|