@ionic/core 8.7.16-dev.11767019759.14b7f2fa → 8.7.16-dev.11767032989.1ae720d0
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-input.js +35 -6
- package/components/modal.js +11 -92
- package/dist/cjs/ion-input.cjs.entry.js +35 -6
- package/dist/cjs/ion-modal.cjs.entry.js +11 -92
- package/dist/collection/components/input/input.js +35 -6
- package/dist/collection/components/modal/gestures/sheet.js +1 -3
- package/dist/collection/components/modal/gestures/swipe-to-close.js +1 -3
- package/dist/collection/components/modal/modal.ios.css +4 -0
- package/dist/collection/components/modal/modal.js +7 -84
- package/dist/collection/components/modal/modal.md.css +4 -0
- package/dist/docs.json +1 -1
- package/dist/esm/ion-input.entry.js +35 -6
- package/dist/esm/ion-modal.entry.js +11 -92
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/p-b28af559.entry.js +4 -0
- package/dist/ionic/p-bf1578e9.entry.js +4 -0
- package/dist/types/components/input/input.d.ts +11 -0
- package/dist/types/components/modal/gestures/sheet.d.ts +1 -1
- package/dist/types/components/modal/gestures/swipe-to-close.d.ts +1 -1
- package/dist/types/components/modal/modal.d.ts +0 -12
- package/hydrate/index.js +45 -98
- package/hydrate/index.mjs +45 -98
- package/package.json +1 -1
- package/dist/ionic/p-40c261a3.entry.js +0 -4
- package/dist/ionic/p-88b087a9.entry.js +0 -4
package/components/ion-input.js
CHANGED
|
@@ -28,6 +28,7 @@ const Input = /*@__PURE__*/ proxyCustomElement(class Input extends HTMLElement {
|
|
|
28
28
|
this.inputId = `ion-input-${inputIds++}`;
|
|
29
29
|
this.helperTextId = `${this.inputId}-helper-text`;
|
|
30
30
|
this.errorTextId = `${this.inputId}-error-text`;
|
|
31
|
+
this.labelTextId = `${this.inputId}-label`;
|
|
31
32
|
this.inheritedAttributes = {};
|
|
32
33
|
this.isComposing = false;
|
|
33
34
|
/**
|
|
@@ -236,7 +237,11 @@ const Input = /*@__PURE__*/ proxyCustomElement(class Input extends HTMLElement {
|
|
|
236
237
|
}
|
|
237
238
|
connectedCallback() {
|
|
238
239
|
const { el } = this;
|
|
239
|
-
this.slotMutationController = createSlotMutationController(el, ['label', 'start', 'end'], () =>
|
|
240
|
+
this.slotMutationController = createSlotMutationController(el, ['label', 'start', 'end'], () => {
|
|
241
|
+
this.setSlottedLabelId();
|
|
242
|
+
forceUpdate(this);
|
|
243
|
+
});
|
|
244
|
+
this.setSlottedLabelId();
|
|
240
245
|
this.notchController = createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
|
|
241
246
|
// Watch for class changes to update validation state
|
|
242
247
|
if (Build.isBrowser && typeof MutationObserver !== 'undefined') {
|
|
@@ -439,11 +444,11 @@ const Input = /*@__PURE__*/ proxyCustomElement(class Input extends HTMLElement {
|
|
|
439
444
|
return (h("div", { class: "input-bottom" }, this.renderHintText(), this.renderCounter()));
|
|
440
445
|
}
|
|
441
446
|
renderLabel() {
|
|
442
|
-
const { label } = this;
|
|
447
|
+
const { label, labelTextId } = this;
|
|
443
448
|
return (h("div", { class: {
|
|
444
449
|
'label-text-wrapper': true,
|
|
445
450
|
'label-text-wrapper-hidden': !this.hasLabel,
|
|
446
|
-
} }, label === undefined ? h("slot", { name: "label" }) : h("div", { class: "label-text" }, label)));
|
|
451
|
+
}, "aria-hidden": this.hasLabel ? 'true' : null }, label === undefined ? (h("slot", { name: "label" })) : (h("div", { class: "label-text", id: labelTextId }, label))));
|
|
447
452
|
}
|
|
448
453
|
/**
|
|
449
454
|
* Gets any content passed into the `label` slot,
|
|
@@ -452,6 +457,30 @@ const Input = /*@__PURE__*/ proxyCustomElement(class Input extends HTMLElement {
|
|
|
452
457
|
get labelSlot() {
|
|
453
458
|
return this.el.querySelector('[slot="label"]');
|
|
454
459
|
}
|
|
460
|
+
/**
|
|
461
|
+
* Ensures the slotted label element has an ID for aria-labelledby.
|
|
462
|
+
* If no ID exists, we assign one using our generated labelTextId.
|
|
463
|
+
*/
|
|
464
|
+
setSlottedLabelId() {
|
|
465
|
+
const slottedLabel = this.labelSlot;
|
|
466
|
+
if (slottedLabel && !slottedLabel.id) {
|
|
467
|
+
slottedLabel.id = this.labelTextId;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Returns the ID to use for aria-labelledby on the native input,
|
|
472
|
+
* or undefined if aria-label is explicitly set (to avoid conflicts).
|
|
473
|
+
*/
|
|
474
|
+
getLabelledById() {
|
|
475
|
+
var _a;
|
|
476
|
+
if (this.inheritedAttributes['aria-label']) {
|
|
477
|
+
return undefined;
|
|
478
|
+
}
|
|
479
|
+
if (this.label !== undefined) {
|
|
480
|
+
return this.labelTextId;
|
|
481
|
+
}
|
|
482
|
+
return ((_a = this.labelSlot) === null || _a === void 0 ? void 0 : _a.id) || undefined;
|
|
483
|
+
}
|
|
455
484
|
/**
|
|
456
485
|
* Returns `true` if label content is provided
|
|
457
486
|
* either by a prop or a content. If you want
|
|
@@ -518,7 +547,7 @@ const Input = /*@__PURE__*/ proxyCustomElement(class Input extends HTMLElement {
|
|
|
518
547
|
* TODO(FW-5592): Remove hasStartEndSlots condition
|
|
519
548
|
*/
|
|
520
549
|
const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || hasStartEndSlots));
|
|
521
|
-
return (h(Host, { key: '
|
|
550
|
+
return (h(Host, { key: '9ba9cf425b573d2ca9ac34455a0e6b8474c4de6d', class: createColorClasses(this.color, {
|
|
522
551
|
[mode]: true,
|
|
523
552
|
'has-value': hasValue,
|
|
524
553
|
'has-focus': hasFocus,
|
|
@@ -529,14 +558,14 @@ const Input = /*@__PURE__*/ proxyCustomElement(class Input extends HTMLElement {
|
|
|
529
558
|
'in-item': inItem,
|
|
530
559
|
'in-item-color': hostContext('ion-item.ion-color', this.el),
|
|
531
560
|
'input-disabled': disabled,
|
|
532
|
-
}) }, h("label", { key: '
|
|
561
|
+
}) }, 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) => {
|
|
533
562
|
/**
|
|
534
563
|
* This prevents mobile browsers from
|
|
535
564
|
* blurring the input when the clear
|
|
536
565
|
* button is activated.
|
|
537
566
|
*/
|
|
538
567
|
ev.preventDefault();
|
|
539
|
-
}, onClick: this.clearTextInput }, h("ion-icon", { key: '
|
|
568
|
+
}, 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()));
|
|
540
569
|
}
|
|
541
570
|
get el() { return this; }
|
|
542
571
|
static get watchers() { return {
|
package/components/modal.js
CHANGED
|
@@ -246,7 +246,7 @@ const calculateSpringStep = (t) => {
|
|
|
246
246
|
const SwipeToCloseDefaults = {
|
|
247
247
|
MIN_PRESENTING_SCALE: 0.915,
|
|
248
248
|
};
|
|
249
|
-
const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss
|
|
249
|
+
const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss) => {
|
|
250
250
|
/**
|
|
251
251
|
* The step value at which a card modal
|
|
252
252
|
* is eligible for dismissing via gesture.
|
|
@@ -403,8 +403,6 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onG
|
|
|
403
403
|
const processedStep = isAttemptingDismissWithCanDismiss ? calculateSpringStep(step / maxStep) : step;
|
|
404
404
|
const clampedStep = clamp(0.0001, processedStep, maxStep);
|
|
405
405
|
animation.progressStep(clampedStep);
|
|
406
|
-
// Notify modal of position change for safe-area updates
|
|
407
|
-
onGestureMove === null || onGestureMove === void 0 ? void 0 : onGestureMove();
|
|
408
406
|
/**
|
|
409
407
|
* When swiping down half way, the status bar style
|
|
410
408
|
* should be reset to its default value.
|
|
@@ -948,7 +946,7 @@ const mdLeaveAnimation = (baseEl, opts) => {
|
|
|
948
946
|
return baseAnimation;
|
|
949
947
|
};
|
|
950
948
|
|
|
951
|
-
const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], expandToScroll, getCurrentBreakpoint, onDismiss, onBreakpointChange
|
|
949
|
+
const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], expandToScroll, getCurrentBreakpoint, onDismiss, onBreakpointChange) => {
|
|
952
950
|
// Defaults for the sheet swipe animation
|
|
953
951
|
const defaultBackdrop = [
|
|
954
952
|
{ offset: 0, opacity: 'var(--backdrop-opacity)' },
|
|
@@ -1279,8 +1277,6 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1279
1277
|
: step;
|
|
1280
1278
|
offset = clamp(0.0001, processedStep, maxStep);
|
|
1281
1279
|
animation.progressStep(offset);
|
|
1282
|
-
// Notify modal of position change for safe-area updates
|
|
1283
|
-
onGestureMove === null || onGestureMove === void 0 ? void 0 : onGestureMove();
|
|
1284
1280
|
};
|
|
1285
1281
|
const onEnd = (detail) => {
|
|
1286
1282
|
/**
|
|
@@ -1475,9 +1471,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1475
1471
|
};
|
|
1476
1472
|
};
|
|
1477
1473
|
|
|
1478
|
-
const modalIosCss = ":host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{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);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:\"\"}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.4)}:host(.modal-card),:host(.modal-sheet){--border-radius:10px}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:10px}}.modal-wrapper{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}@media screen and (max-width: 767px){@supports (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - max(30px, var(--ion-safe-area-top)) - 10px)}}@supports not (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - 40px)}}:host(.modal-card) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}:host(.modal-card){--backdrop-opacity:0;--width:100%;-ms-flex-align:end;align-items:flex-end}:host(.modal-card) .modal-shadow{display:none}:host(.modal-card) ion-backdrop{pointer-events:none}}@media screen and (min-width: 768px){:host(.modal-card){--width:calc(100% - 120px);--height:calc(100% - (120px + var(--ion-safe-area-top) + var(--ion-safe-area-bottom)));--max-width:720px;--max-height:1000px;--backdrop-opacity:0;--box-shadow:0px 0px 30px 10px rgba(0, 0, 0, 0.1);-webkit-transition:all 0.5s ease-in-out;transition:all 0.5s ease-in-out}:host(.modal-card) .modal-wrapper{-webkit-box-shadow:none;box-shadow:none}:host(.modal-card) .modal-shadow{-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}}:host(.modal-sheet) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}";
|
|
1474
|
+
const modalIosCss = ":host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{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);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px;--ion-safe-area-top:0px;--ion-safe-area-bottom:0px;--ion-safe-area-right:0px;--ion-safe-area-left:0px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:\"\"}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.4)}:host(.modal-card),:host(.modal-sheet){--border-radius:10px}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:10px}}.modal-wrapper{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}@media screen and (max-width: 767px){@supports (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - max(30px, var(--ion-safe-area-top)) - 10px)}}@supports not (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - 40px)}}:host(.modal-card) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}:host(.modal-card){--backdrop-opacity:0;--width:100%;-ms-flex-align:end;align-items:flex-end}:host(.modal-card) .modal-shadow{display:none}:host(.modal-card) ion-backdrop{pointer-events:none}}@media screen and (min-width: 768px){:host(.modal-card){--width:calc(100% - 120px);--height:calc(100% - (120px + var(--ion-safe-area-top) + var(--ion-safe-area-bottom)));--max-width:720px;--max-height:1000px;--backdrop-opacity:0;--box-shadow:0px 0px 30px 10px rgba(0, 0, 0, 0.1);-webkit-transition:all 0.5s ease-in-out;transition:all 0.5s ease-in-out}:host(.modal-card) .modal-wrapper{-webkit-box-shadow:none;box-shadow:none}:host(.modal-card) .modal-shadow{-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}}:host(.modal-sheet) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}";
|
|
1479
1475
|
|
|
1480
|
-
const modalMdCss = ":host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{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);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:\"\"}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.32)}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:2px;--box-shadow:0 28px 48px rgba(0, 0, 0, 0.4)}}.modal-wrapper{-webkit-transform:translate3d(0, 40px, 0);transform:translate3d(0, 40px, 0);opacity:0.01}";
|
|
1476
|
+
const modalMdCss = ":host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{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);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px;--ion-safe-area-top:0px;--ion-safe-area-bottom:0px;--ion-safe-area-right:0px;--ion-safe-area-left:0px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:\"\"}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + 10px))}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.32)}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:2px;--box-shadow:0 28px 48px rgba(0, 0, 0, 0.4)}}.modal-wrapper{-webkit-transform:translate3d(0, 40px, 0);transform:translate3d(0, 40px, 0);opacity:0.01}";
|
|
1481
1477
|
|
|
1482
1478
|
const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
|
|
1483
1479
|
constructor(registerHost) {
|
|
@@ -1694,9 +1690,7 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
|
|
|
1694
1690
|
}
|
|
1695
1691
|
}
|
|
1696
1692
|
onWindowResize() {
|
|
1697
|
-
//
|
|
1698
|
-
this.updateSafeAreaOverrides();
|
|
1699
|
-
// Only handle view transition for iOS card modals when no custom animations are provided
|
|
1693
|
+
// Only handle resize for iOS card modals when no custom animations are provided
|
|
1700
1694
|
if (getIonMode(this) !== 'ios' || !this.presentingElement || this.enterAnimation || this.leaveAnimation) {
|
|
1701
1695
|
return;
|
|
1702
1696
|
}
|
|
@@ -1878,8 +1872,6 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
|
|
|
1878
1872
|
else if (!this.keepContentsMounted) {
|
|
1879
1873
|
await waitForMount();
|
|
1880
1874
|
}
|
|
1881
|
-
// Predict safe-area needs based on modal configuration to avoid visual snap
|
|
1882
|
-
this.setInitialSafeAreaOverrides(presentingElement);
|
|
1883
1875
|
writeTask(() => this.el.classList.add('show-modal'));
|
|
1884
1876
|
const hasCardModal = presentingElement !== undefined;
|
|
1885
1877
|
/**
|
|
@@ -1941,8 +1933,6 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
|
|
|
1941
1933
|
else if (hasCardModal) {
|
|
1942
1934
|
this.initSwipeToClose();
|
|
1943
1935
|
}
|
|
1944
|
-
// Now that animation is complete, update safe-area based on actual position
|
|
1945
|
-
this.updateSafeAreaOverrides();
|
|
1946
1936
|
// Initialize view transition listener for iOS card modals
|
|
1947
1937
|
this.initViewTransitionListener();
|
|
1948
1938
|
// Initialize parent removal observer
|
|
@@ -1994,7 +1984,7 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
|
|
|
1994
1984
|
await this.dismiss(undefined, GESTURE);
|
|
1995
1985
|
this.gestureAnimationDismissing = false;
|
|
1996
1986
|
});
|
|
1997
|
-
}
|
|
1987
|
+
});
|
|
1998
1988
|
this.gesture.enable(true);
|
|
1999
1989
|
}
|
|
2000
1990
|
initSheetGesture() {
|
|
@@ -2015,8 +2005,7 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
|
|
|
2015
2005
|
this.currentBreakpoint = breakpoint;
|
|
2016
2006
|
this.ionBreakpointDidChange.emit({ breakpoint });
|
|
2017
2007
|
}
|
|
2018
|
-
|
|
2019
|
-
}, () => this.updateSafeAreaOverrides());
|
|
2008
|
+
});
|
|
2020
2009
|
this.gesture = gesture;
|
|
2021
2010
|
this.moveSheetToBreakpoint = moveSheetToBreakpoint;
|
|
2022
2011
|
this.gesture.enable(true);
|
|
@@ -2094,76 +2083,6 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
|
|
|
2094
2083
|
// Clear the cached reference
|
|
2095
2084
|
this.cachedPageParent = undefined;
|
|
2096
2085
|
}
|
|
2097
|
-
/**
|
|
2098
|
-
* Sets initial safe-area overrides based on modal configuration before
|
|
2099
|
-
* the modal becomes visible. This predicts whether the modal will touch
|
|
2100
|
-
* screen edges to avoid a visual snap after animation completes.
|
|
2101
|
-
*/
|
|
2102
|
-
setInitialSafeAreaOverrides(presentingElement) {
|
|
2103
|
-
const style = this.el.style;
|
|
2104
|
-
const isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
|
|
2105
|
-
const isCardModal = presentingElement !== undefined;
|
|
2106
|
-
const isTablet = window.innerWidth >= 768;
|
|
2107
|
-
// Sheet modals: always touch bottom, top depends on breakpoint
|
|
2108
|
-
if (isSheetModal) {
|
|
2109
|
-
style.setProperty('--ion-safe-area-top', '0px');
|
|
2110
|
-
// Don't override bottom - sheet always touches bottom
|
|
2111
|
-
style.setProperty('--ion-safe-area-left', '0px');
|
|
2112
|
-
style.setProperty('--ion-safe-area-right', '0px');
|
|
2113
|
-
return;
|
|
2114
|
-
}
|
|
2115
|
-
// Card modals are inset from edges (rounded corners), no safe areas needed
|
|
2116
|
-
if (isCardModal) {
|
|
2117
|
-
style.setProperty('--ion-safe-area-top', '0px');
|
|
2118
|
-
style.setProperty('--ion-safe-area-bottom', '0px');
|
|
2119
|
-
style.setProperty('--ion-safe-area-left', '0px');
|
|
2120
|
-
style.setProperty('--ion-safe-area-right', '0px');
|
|
2121
|
-
return;
|
|
2122
|
-
}
|
|
2123
|
-
// Phone modals are fullscreen, need all safe areas
|
|
2124
|
-
if (!isTablet) {
|
|
2125
|
-
// Don't set any overrides - inherit from :root
|
|
2126
|
-
return;
|
|
2127
|
-
}
|
|
2128
|
-
// Default tablet modal: centered dialog, no safe areas needed
|
|
2129
|
-
// Check for fullscreen override via CSS custom properties
|
|
2130
|
-
const computedStyle = getComputedStyle(this.el);
|
|
2131
|
-
const width = computedStyle.getPropertyValue('--width').trim();
|
|
2132
|
-
const height = computedStyle.getPropertyValue('--height').trim();
|
|
2133
|
-
if (width === '100%' && height === '100%') {
|
|
2134
|
-
// Fullscreen modal - need safe areas, don't override
|
|
2135
|
-
return;
|
|
2136
|
-
}
|
|
2137
|
-
// Centered dialog - zero out all safe areas
|
|
2138
|
-
style.setProperty('--ion-safe-area-top', '0px');
|
|
2139
|
-
style.setProperty('--ion-safe-area-bottom', '0px');
|
|
2140
|
-
style.setProperty('--ion-safe-area-left', '0px');
|
|
2141
|
-
style.setProperty('--ion-safe-area-right', '0px');
|
|
2142
|
-
}
|
|
2143
|
-
/**
|
|
2144
|
-
* Updates safe-area CSS variable overrides based on whether the modal
|
|
2145
|
-
* is touching each edge of the viewport. This is called after animation
|
|
2146
|
-
* and during gestures to handle dynamic position changes.
|
|
2147
|
-
*/
|
|
2148
|
-
updateSafeAreaOverrides() {
|
|
2149
|
-
const wrapper = this.wrapperEl;
|
|
2150
|
-
if (!wrapper)
|
|
2151
|
-
return;
|
|
2152
|
-
const rect = wrapper.getBoundingClientRect();
|
|
2153
|
-
const threshold = 2; // Account for subpixel rendering
|
|
2154
|
-
const touchingTop = rect.top <= threshold;
|
|
2155
|
-
const touchingBottom = rect.bottom >= window.innerHeight - threshold;
|
|
2156
|
-
const touchingLeft = rect.left <= threshold;
|
|
2157
|
-
const touchingRight = rect.right >= window.innerWidth - threshold;
|
|
2158
|
-
// Remove override when touching edge (allow inheritance), set to 0 when not touching
|
|
2159
|
-
const style = this.el.style;
|
|
2160
|
-
touchingTop ? style.removeProperty('--ion-safe-area-top') : style.setProperty('--ion-safe-area-top', '0px');
|
|
2161
|
-
touchingBottom
|
|
2162
|
-
? style.removeProperty('--ion-safe-area-bottom')
|
|
2163
|
-
: style.setProperty('--ion-safe-area-bottom', '0px');
|
|
2164
|
-
touchingLeft ? style.removeProperty('--ion-safe-area-left') : style.setProperty('--ion-safe-area-left', '0px');
|
|
2165
|
-
touchingRight ? style.removeProperty('--ion-safe-area-right') : style.setProperty('--ion-safe-area-right', '0px');
|
|
2166
|
-
}
|
|
2167
2086
|
sheetOnDismiss() {
|
|
2168
2087
|
/**
|
|
2169
2088
|
* While the gesture animation is finishing
|
|
@@ -2501,20 +2420,20 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
|
|
|
2501
2420
|
const isCardModal = presentingElement !== undefined && mode === 'ios';
|
|
2502
2421
|
const isHandleCycle = handleBehavior === 'cycle';
|
|
2503
2422
|
const isSheetModalWithHandle = isSheetModal && showHandle;
|
|
2504
|
-
return (h(Host, Object.assign({ key: '
|
|
2423
|
+
return (h(Host, Object.assign({ key: '9a75095a13de0cfc96f1fa69fd92777d25da8daa', "no-router": true,
|
|
2505
2424
|
// Allow the modal to be navigable when the handle is focusable
|
|
2506
2425
|
tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1 }, htmlAttributes, { style: {
|
|
2507
2426
|
zIndex: `${20000 + this.overlayIndex}`,
|
|
2508
|
-
}, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), h("ion-backdrop", { key: '
|
|
2427
|
+
}, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), h("ion-backdrop", { key: 'd02612d8063ef20f59f173ff47795f71cdaaf63e', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: '708761b70a93e34c08faae079569f444c7416a4c', class: "modal-shadow" }), h("div", Object.assign({ key: 'a72226ff1a98229f9bfd9207b98fc57e02baa430',
|
|
2509
2428
|
/*
|
|
2510
2429
|
role and aria-modal must be used on the
|
|
2511
2430
|
same element. They must also be set inside the
|
|
2512
2431
|
shadow DOM otherwise ion-button will not be highlighted
|
|
2513
2432
|
when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134
|
|
2514
2433
|
*/
|
|
2515
|
-
role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: '
|
|
2434
|
+
role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: '0547f32323882660221385d84d492929caa77c6b', class: "modal-handle",
|
|
2516
2435
|
// Prevents the handle from receiving keyboard focus when it does not cycle
|
|
2517
|
-
tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), h("slot", { key: '
|
|
2436
|
+
tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), h("slot", { key: 'fccbd64518b6fa22f9e874deb6b4ba55d8d89c3b', onSlotchange: this.onSlotChange }))));
|
|
2518
2437
|
}
|
|
2519
2438
|
get el() { return this; }
|
|
2520
2439
|
static get watchers() { return {
|
|
@@ -27,6 +27,7 @@ const Input = class {
|
|
|
27
27
|
this.inputId = `ion-input-${inputIds++}`;
|
|
28
28
|
this.helperTextId = `${this.inputId}-helper-text`;
|
|
29
29
|
this.errorTextId = `${this.inputId}-error-text`;
|
|
30
|
+
this.labelTextId = `${this.inputId}-label`;
|
|
30
31
|
this.inheritedAttributes = {};
|
|
31
32
|
this.isComposing = false;
|
|
32
33
|
/**
|
|
@@ -235,7 +236,11 @@ const Input = class {
|
|
|
235
236
|
}
|
|
236
237
|
connectedCallback() {
|
|
237
238
|
const { el } = this;
|
|
238
|
-
this.slotMutationController = input_utils.createSlotMutationController(el, ['label', 'start', 'end'], () =>
|
|
239
|
+
this.slotMutationController = input_utils.createSlotMutationController(el, ['label', 'start', 'end'], () => {
|
|
240
|
+
this.setSlottedLabelId();
|
|
241
|
+
index.forceUpdate(this);
|
|
242
|
+
});
|
|
243
|
+
this.setSlottedLabelId();
|
|
239
244
|
this.notchController = notchController.createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
|
|
240
245
|
// Watch for class changes to update validation state
|
|
241
246
|
if (typeof MutationObserver !== 'undefined') {
|
|
@@ -438,11 +443,11 @@ const Input = class {
|
|
|
438
443
|
return (index.h("div", { class: "input-bottom" }, this.renderHintText(), this.renderCounter()));
|
|
439
444
|
}
|
|
440
445
|
renderLabel() {
|
|
441
|
-
const { label } = this;
|
|
446
|
+
const { label, labelTextId } = this;
|
|
442
447
|
return (index.h("div", { class: {
|
|
443
448
|
'label-text-wrapper': true,
|
|
444
449
|
'label-text-wrapper-hidden': !this.hasLabel,
|
|
445
|
-
} }, label === undefined ? index.h("slot", { name: "label" }) : index.h("div", { class: "label-text" }, label)));
|
|
450
|
+
}, "aria-hidden": this.hasLabel ? 'true' : null }, label === undefined ? (index.h("slot", { name: "label" })) : (index.h("div", { class: "label-text", id: labelTextId }, label))));
|
|
446
451
|
}
|
|
447
452
|
/**
|
|
448
453
|
* Gets any content passed into the `label` slot,
|
|
@@ -451,6 +456,30 @@ const Input = class {
|
|
|
451
456
|
get labelSlot() {
|
|
452
457
|
return this.el.querySelector('[slot="label"]');
|
|
453
458
|
}
|
|
459
|
+
/**
|
|
460
|
+
* Ensures the slotted label element has an ID for aria-labelledby.
|
|
461
|
+
* If no ID exists, we assign one using our generated labelTextId.
|
|
462
|
+
*/
|
|
463
|
+
setSlottedLabelId() {
|
|
464
|
+
const slottedLabel = this.labelSlot;
|
|
465
|
+
if (slottedLabel && !slottedLabel.id) {
|
|
466
|
+
slottedLabel.id = this.labelTextId;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Returns the ID to use for aria-labelledby on the native input,
|
|
471
|
+
* or undefined if aria-label is explicitly set (to avoid conflicts).
|
|
472
|
+
*/
|
|
473
|
+
getLabelledById() {
|
|
474
|
+
var _a;
|
|
475
|
+
if (this.inheritedAttributes['aria-label']) {
|
|
476
|
+
return undefined;
|
|
477
|
+
}
|
|
478
|
+
if (this.label !== undefined) {
|
|
479
|
+
return this.labelTextId;
|
|
480
|
+
}
|
|
481
|
+
return ((_a = this.labelSlot) === null || _a === void 0 ? void 0 : _a.id) || undefined;
|
|
482
|
+
}
|
|
454
483
|
/**
|
|
455
484
|
* Returns `true` if label content is provided
|
|
456
485
|
* either by a prop or a content. If you want
|
|
@@ -517,7 +546,7 @@ const Input = class {
|
|
|
517
546
|
* TODO(FW-5592): Remove hasStartEndSlots condition
|
|
518
547
|
*/
|
|
519
548
|
const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || hasStartEndSlots));
|
|
520
|
-
return (index.h(index.Host, { key: '
|
|
549
|
+
return (index.h(index.Host, { key: '9ba9cf425b573d2ca9ac34455a0e6b8474c4de6d', class: theme.createColorClasses(this.color, {
|
|
521
550
|
[mode]: true,
|
|
522
551
|
'has-value': hasValue,
|
|
523
552
|
'has-focus': hasFocus,
|
|
@@ -528,14 +557,14 @@ const Input = class {
|
|
|
528
557
|
'in-item': inItem,
|
|
529
558
|
'in-item-color': theme.hostContext('ion-item.ion-color', this.el),
|
|
530
559
|
'input-disabled': disabled,
|
|
531
|
-
}) }, index.h("label", { key: '
|
|
560
|
+
}) }, index.h("label", { key: '74b989d0aa5ab38f29f952519868f05119df6005', class: "input-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, this.renderLabelContainer(), index.h("div", { key: '47f2b42e2f74ea866b4f871026e08ab375d7a726', class: "native-wrapper", onClick: this.onLabelClick }, index.h("slot", { key: 'eaabe5a4a329a356cac3294d15c087d0d131fff2', name: "start" }), index.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 && (index.h("button", { key: '62069c11016ee190dc46ab941372e1c4ad8a36ed', "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
|
|
532
561
|
/**
|
|
533
562
|
* This prevents mobile browsers from
|
|
534
563
|
* blurring the input when the clear
|
|
535
564
|
* button is activated.
|
|
536
565
|
*/
|
|
537
566
|
ev.preventDefault();
|
|
538
|
-
}, onClick: this.clearTextInput }, index.h("ion-icon", { key: '
|
|
567
|
+
}, onClick: this.clearTextInput }, index.h("ion-icon", { key: 'dd75a516d32110d85382b664c663bd41f177ce12', "aria-hidden": "true", icon: clearIconData }))), index.h("slot", { key: '330d4b9389f2c62223a5ee24003e96ef3e6b2473', name: "end" })), shouldRenderHighlight && index.h("div", { key: '8e442bed130ddc84976ab70fd3f8578d6bcc6316', class: "input-highlight" })), this.renderBottomContent()));
|
|
539
568
|
}
|
|
540
569
|
get el() { return index.getElement(this); }
|
|
541
570
|
static get watchers() { return {
|