@ionic/core 8.7.12-dev.11765060985.14ad27fb → 8.7.12-dev.11765231260.1def96ab
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/action-sheet.js +186 -5
- package/components/ion-select.js +8 -3
- package/components/modal.js +16 -86
- package/components/overlays.js +11 -15
- package/css/core.css +1 -1
- package/css/core.css.map +1 -1
- package/css/ionic.bundle.css +1 -1
- package/css/ionic.bundle.css.map +1 -1
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/ion-action-sheet.cjs.entry.js +184 -5
- package/dist/cjs/ion-alert.cjs.entry.js +1 -1
- package/dist/cjs/ion-datetime_3.cjs.entry.js +1 -1
- package/dist/cjs/ion-loading.cjs.entry.js +1 -1
- package/dist/cjs/ion-menu_3.cjs.entry.js +1 -1
- package/dist/cjs/ion-modal.cjs.entry.js +17 -86
- package/dist/cjs/ion-popover.cjs.entry.js +1 -1
- package/dist/cjs/ion-select-modal.cjs.entry.js +1 -1
- package/dist/cjs/ion-select_3.cjs.entry.js +9 -4
- package/dist/cjs/ion-toast.cjs.entry.js +1 -1
- package/dist/cjs/ionic.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/{overlays-D3xMmZCY.js → overlays-DxIZwUXI.js} +11 -15
- package/dist/collection/components/action-sheet/action-sheet.js +199 -4
- package/dist/collection/components/modal/modal.js +16 -86
- package/dist/collection/components/select/select.js +8 -3
- package/dist/collection/utils/overlays.js +11 -15
- package/dist/docs.json +14 -8
- package/dist/esm/index.js +1 -1
- package/dist/esm/ion-action-sheet.entry.js +184 -5
- package/dist/esm/ion-alert.entry.js +1 -1
- package/dist/esm/ion-datetime_3.entry.js +1 -1
- package/dist/esm/ion-loading.entry.js +1 -1
- package/dist/esm/ion-menu_3.entry.js +1 -1
- package/dist/esm/ion-modal.entry.js +17 -86
- package/dist/esm/ion-popover.entry.js +1 -1
- package/dist/esm/ion-select-modal.entry.js +1 -1
- package/dist/esm/ion-select_3.entry.js +9 -4
- package/dist/esm/ion-toast.entry.js +1 -1
- package/dist/esm/ionic.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/{overlays-DYKBVm6h.js → overlays-BymNv-BL.js} +11 -15
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/{p-3fad4ab5.entry.js → p-0b80d700.entry.js} +1 -1
- package/dist/ionic/{p-a480563a.entry.js → p-15193d01.entry.js} +1 -1
- package/dist/ionic/p-5837f29f.entry.js +4 -0
- package/dist/ionic/{p-b4b6513a.entry.js → p-7da39a4d.entry.js} +1 -1
- package/dist/ionic/{p-caa8efa1.entry.js → p-83be404e.entry.js} +1 -1
- package/dist/ionic/p-8edc7565.entry.js +4 -0
- package/dist/ionic/{p-7928cc4d.entry.js → p-98fc09eb.entry.js} +1 -1
- package/dist/ionic/p-D87hU-Ly.js +4 -0
- package/dist/ionic/p-c69ff6d8.entry.js +4 -0
- package/dist/ionic/{p-985f02a8.entry.js → p-cb93126d.entry.js} +1 -1
- package/dist/ionic/{p-038f3a87.entry.js → p-e16b69e1.entry.js} +1 -1
- package/dist/types/components/action-sheet/action-sheet.d.ts +37 -0
- package/dist/types/components/modal/modal.d.ts +0 -13
- package/hydrate/index.js +220 -109
- package/hydrate/index.mjs +220 -109
- package/package.json +4 -1
- package/dist/ionic/p-1cf19c5a.entry.js +0 -4
- package/dist/ionic/p-9084d52f.entry.js +0 -4
- package/dist/ionic/p-CHK505Co.js +0 -4
- package/dist/ionic/p-ede27a66.entry.js +0 -4
|
@@ -118,6 +118,7 @@ const ActionSheet = /*@__PURE__*/ proxyCustomElement(class ActionSheet extends H
|
|
|
118
118
|
this.delegateController = createDelegateController(this);
|
|
119
119
|
this.lockController = createLockController();
|
|
120
120
|
this.triggerController = createTriggerController();
|
|
121
|
+
this.hasRadioButtons = false;
|
|
121
122
|
this.presented = false;
|
|
122
123
|
/** @internal */
|
|
123
124
|
this.hasController = false;
|
|
@@ -162,6 +163,19 @@ const ActionSheet = /*@__PURE__*/ proxyCustomElement(class ActionSheet extends H
|
|
|
162
163
|
}
|
|
163
164
|
};
|
|
164
165
|
}
|
|
166
|
+
buttonsChanged() {
|
|
167
|
+
const radioButtons = this.getRadioButtons();
|
|
168
|
+
this.hasRadioButtons = radioButtons.length > 0;
|
|
169
|
+
// Initialize activeRadioId when buttons change
|
|
170
|
+
if (this.hasRadioButtons) {
|
|
171
|
+
const checkedButton = radioButtons.find((b) => { var _a; return ((_a = b.htmlAttributes) === null || _a === void 0 ? void 0 : _a['aria-checked']) === 'true'; });
|
|
172
|
+
if (checkedButton) {
|
|
173
|
+
const allButtons = this.getButtons();
|
|
174
|
+
const checkedIndex = allButtons.indexOf(checkedButton);
|
|
175
|
+
this.activeRadioId = this.getButtonId(checkedButton, checkedIndex);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
165
179
|
onIsOpenChange(newValue, oldValue) {
|
|
166
180
|
if (newValue === true && oldValue === false) {
|
|
167
181
|
this.present();
|
|
@@ -242,11 +256,122 @@ const ActionSheet = /*@__PURE__*/ proxyCustomElement(class ActionSheet extends H
|
|
|
242
256
|
}
|
|
243
257
|
return true;
|
|
244
258
|
}
|
|
259
|
+
/**
|
|
260
|
+
* Get all buttons regardless of role.
|
|
261
|
+
*/
|
|
245
262
|
getButtons() {
|
|
246
263
|
return this.buttons.map((b) => {
|
|
247
264
|
return typeof b === 'string' ? { text: b } : b;
|
|
248
265
|
});
|
|
249
266
|
}
|
|
267
|
+
/**
|
|
268
|
+
* Get all radio buttons (buttons with role="radio").
|
|
269
|
+
*/
|
|
270
|
+
getRadioButtons() {
|
|
271
|
+
return this.getButtons().filter((b) => {
|
|
272
|
+
var _a;
|
|
273
|
+
const role = (_a = b.htmlAttributes) === null || _a === void 0 ? void 0 : _a.role;
|
|
274
|
+
return role === 'radio' && !isCancel(role);
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Handle radio button selection and update aria-checked state.
|
|
279
|
+
*
|
|
280
|
+
* @param button The radio button that was selected.
|
|
281
|
+
*/
|
|
282
|
+
selectRadioButton(button) {
|
|
283
|
+
const buttonId = this.getButtonId(button);
|
|
284
|
+
// Set the active radio ID (this will trigger a re-render and update aria-checked)
|
|
285
|
+
this.activeRadioId = buttonId;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Get or generate an ID for a button.
|
|
289
|
+
*
|
|
290
|
+
* @param button The button for which to get the ID.
|
|
291
|
+
* @param index Optional index of the button in the buttons array.
|
|
292
|
+
* @returns The ID of the button.
|
|
293
|
+
*/
|
|
294
|
+
getButtonId(button, index) {
|
|
295
|
+
if (button.id) {
|
|
296
|
+
return button.id;
|
|
297
|
+
}
|
|
298
|
+
const allButtons = this.getButtons();
|
|
299
|
+
const buttonIndex = index !== undefined ? index : allButtons.indexOf(button);
|
|
300
|
+
return `action-sheet-button-${this.overlayIndex}-${buttonIndex}`;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* When the action sheet has radio buttons, we want to follow the
|
|
304
|
+
* keyboard navigation pattern for radio groups:
|
|
305
|
+
* - Arrow Down/Right: Move to the next radio button (wrap to first if at end)
|
|
306
|
+
* - Arrow Up/Left: Move to the previous radio button (wrap to last if at start)
|
|
307
|
+
* - Space/Enter: Select the focused radio button and trigger its handler
|
|
308
|
+
*/
|
|
309
|
+
onKeydown(ev) {
|
|
310
|
+
// Only handle keyboard navigation if we have radio buttons
|
|
311
|
+
if (!this.hasRadioButtons || !this.presented) {
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
const target = ev.target;
|
|
315
|
+
// Ignore if the target element is not within the action sheet or not a radio button
|
|
316
|
+
if (!this.el.contains(target) ||
|
|
317
|
+
!target.classList.contains('action-sheet-button') ||
|
|
318
|
+
target.getAttribute('role') !== 'radio') {
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
// Get all radio button elements and filter out disabled ones
|
|
322
|
+
const radios = Array.from(this.el.querySelectorAll('.action-sheet-button[role="radio"]')).filter((el) => !el.disabled);
|
|
323
|
+
const currentIndex = radios.findIndex((radio) => radio.id === target.id);
|
|
324
|
+
if (currentIndex === -1) {
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
const allButtons = this.getButtons();
|
|
328
|
+
const radioButtons = this.getRadioButtons();
|
|
329
|
+
/**
|
|
330
|
+
* Build a map of button element IDs to their ActionSheetButton
|
|
331
|
+
* config objects.
|
|
332
|
+
* This allows us to quickly look up which button config corresponds
|
|
333
|
+
* to a DOM element when handling keyboard navigation
|
|
334
|
+
* (e.g., whenuser presses Space/Enter or arrow keys).
|
|
335
|
+
* The key is the ID that was set on the DOM element during render,
|
|
336
|
+
* and the value is the ActionSheetButton config that contains the
|
|
337
|
+
* handler and other properties.
|
|
338
|
+
*/
|
|
339
|
+
const buttonIdMap = new Map();
|
|
340
|
+
radioButtons.forEach((b) => {
|
|
341
|
+
const allIndex = allButtons.indexOf(b);
|
|
342
|
+
const buttonId = this.getButtonId(b, allIndex);
|
|
343
|
+
buttonIdMap.set(buttonId, b);
|
|
344
|
+
});
|
|
345
|
+
let nextEl;
|
|
346
|
+
if (['ArrowDown', 'ArrowRight'].includes(ev.key)) {
|
|
347
|
+
ev.preventDefault();
|
|
348
|
+
ev.stopPropagation();
|
|
349
|
+
nextEl = currentIndex === radios.length - 1 ? radios[0] : radios[currentIndex + 1];
|
|
350
|
+
}
|
|
351
|
+
else if (['ArrowUp', 'ArrowLeft'].includes(ev.key)) {
|
|
352
|
+
ev.preventDefault();
|
|
353
|
+
ev.stopPropagation();
|
|
354
|
+
nextEl = currentIndex === 0 ? radios[radios.length - 1] : radios[currentIndex - 1];
|
|
355
|
+
}
|
|
356
|
+
else if (ev.key === ' ' || ev.key === 'Enter') {
|
|
357
|
+
ev.preventDefault();
|
|
358
|
+
ev.stopPropagation();
|
|
359
|
+
const button = buttonIdMap.get(target.id);
|
|
360
|
+
if (button) {
|
|
361
|
+
this.selectRadioButton(button);
|
|
362
|
+
this.buttonClick(button);
|
|
363
|
+
}
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
// Focus the next radio button
|
|
367
|
+
if (nextEl) {
|
|
368
|
+
const button = buttonIdMap.get(nextEl.id);
|
|
369
|
+
if (button) {
|
|
370
|
+
this.selectRadioButton(button);
|
|
371
|
+
nextEl.focus();
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
250
375
|
connectedCallback() {
|
|
251
376
|
prepareOverlay(this.el);
|
|
252
377
|
this.triggerChanged();
|
|
@@ -263,6 +388,8 @@ const ActionSheet = /*@__PURE__*/ proxyCustomElement(class ActionSheet extends H
|
|
|
263
388
|
if (!((_a = this.htmlAttributes) === null || _a === void 0 ? void 0 : _a.id)) {
|
|
264
389
|
setOverlayId(this.el);
|
|
265
390
|
}
|
|
391
|
+
// Initialize activeRadioId for radio buttons
|
|
392
|
+
this.buttonsChanged();
|
|
266
393
|
}
|
|
267
394
|
componentDidLoad() {
|
|
268
395
|
/**
|
|
@@ -300,22 +427,74 @@ const ActionSheet = /*@__PURE__*/ proxyCustomElement(class ActionSheet extends H
|
|
|
300
427
|
*/
|
|
301
428
|
this.triggerChanged();
|
|
302
429
|
}
|
|
430
|
+
renderActionSheetButtons(filteredButtons) {
|
|
431
|
+
const mode = getIonMode(this);
|
|
432
|
+
const { activeRadioId } = this;
|
|
433
|
+
return filteredButtons.map((b, index) => {
|
|
434
|
+
var _a;
|
|
435
|
+
const isRadio = ((_a = b.htmlAttributes) === null || _a === void 0 ? void 0 : _a.role) === 'radio';
|
|
436
|
+
const buttonId = this.getButtonId(b, index);
|
|
437
|
+
const radioButtons = this.getRadioButtons();
|
|
438
|
+
const isActiveRadio = isRadio && buttonId === activeRadioId;
|
|
439
|
+
const isFirstRadio = isRadio && b === radioButtons[0];
|
|
440
|
+
// For radio buttons, set tabindex: 0 for the active one, -1 for others
|
|
441
|
+
// For non-radio buttons, use default tabindex (undefined, which means 0)
|
|
442
|
+
/**
|
|
443
|
+
* For radio buttons, set tabindex based on activeRadioId
|
|
444
|
+
* - If the button is the active radio, tabindex is 0
|
|
445
|
+
* - If no radio is active, the first radio button should have tabindex 0
|
|
446
|
+
* - All other radio buttons have tabindex -1
|
|
447
|
+
* For non-radio buttons, use default tabindex (undefined, which means 0)
|
|
448
|
+
*/
|
|
449
|
+
let tabIndex;
|
|
450
|
+
if (isRadio) {
|
|
451
|
+
// Focus on the active radio button
|
|
452
|
+
if (isActiveRadio) {
|
|
453
|
+
tabIndex = 0;
|
|
454
|
+
}
|
|
455
|
+
else if (!activeRadioId && isFirstRadio) {
|
|
456
|
+
// No active radio, first radio gets focus
|
|
457
|
+
tabIndex = 0;
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
// All other radios are not focusable
|
|
461
|
+
tabIndex = -1;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
else {
|
|
465
|
+
tabIndex = undefined;
|
|
466
|
+
}
|
|
467
|
+
// For radio buttons, set aria-checked based on activeRadioId
|
|
468
|
+
// Otherwise, use the value from htmlAttributes if provided
|
|
469
|
+
const htmlAttrs = Object.assign({}, b.htmlAttributes);
|
|
470
|
+
if (isRadio) {
|
|
471
|
+
htmlAttrs['aria-checked'] = isActiveRadio ? 'true' : 'false';
|
|
472
|
+
}
|
|
473
|
+
return (h("button", Object.assign({}, htmlAttrs, { role: isRadio ? 'radio' : undefined, type: "button", id: buttonId, class: Object.assign(Object.assign({}, buttonClass(b)), { 'action-sheet-selected': isActiveRadio }), onClick: () => {
|
|
474
|
+
if (isRadio) {
|
|
475
|
+
this.selectRadioButton(b);
|
|
476
|
+
}
|
|
477
|
+
this.buttonClick(b);
|
|
478
|
+
}, disabled: b.disabled, tabIndex: tabIndex }), h("span", { class: "action-sheet-button-inner" }, b.icon && h("ion-icon", { icon: b.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" }), b.text), mode === 'md' && h("ion-ripple-effect", null)));
|
|
479
|
+
});
|
|
480
|
+
}
|
|
303
481
|
render() {
|
|
304
|
-
const { header, htmlAttributes, overlayIndex } = this;
|
|
482
|
+
const { header, htmlAttributes, overlayIndex, hasRadioButtons } = this;
|
|
305
483
|
const mode = getIonMode(this);
|
|
306
484
|
const allButtons = this.getButtons();
|
|
307
485
|
const cancelButton = allButtons.find((b) => b.role === 'cancel');
|
|
308
486
|
const buttons = allButtons.filter((b) => b.role !== 'cancel');
|
|
309
487
|
const headerID = `action-sheet-${overlayIndex}-header`;
|
|
310
|
-
return (h(Host, Object.assign({ key: '
|
|
488
|
+
return (h(Host, Object.assign({ key: '173fcff5b1da7c33c267de4667591c946b8c8d03', role: "dialog", "aria-modal": "true", "aria-labelledby": header !== undefined ? headerID : null, tabindex: "-1" }, htmlAttributes, { style: {
|
|
311
489
|
zIndex: `${20000 + this.overlayIndex}`,
|
|
312
|
-
}, class: Object.assign(Object.assign({ [mode]: true }, getClassMap(this.cssClass)), { 'overlay-hidden': true, 'action-sheet-translucent': this.translucent }), onIonActionSheetWillDismiss: this.dispatchCancelHandler, onIonBackdropTap: this.onBackdropTap }), h("ion-backdrop", { key: '
|
|
490
|
+
}, class: Object.assign(Object.assign({ [mode]: true }, getClassMap(this.cssClass)), { 'overlay-hidden': true, 'action-sheet-translucent': this.translucent }), onIonActionSheetWillDismiss: this.dispatchCancelHandler, onIonBackdropTap: this.onBackdropTap }), h("ion-backdrop", { key: '521ede659f747864f6c974e09016436eceb7158c', tappable: this.backdropDismiss }), h("div", { key: '7a7946fc434bc444f16a70638f5e948c69d33fcd', tabindex: "0", "aria-hidden": "true" }), h("div", { key: 'bcff39a580489dbafa255842e57aa8602c6d0f18', class: "action-sheet-wrapper ion-overlay-wrapper", ref: (el) => (this.wrapperEl = el) }, h("div", { key: '84bba13ce14261f0f0daa3f9c77648c9e7f36e0e', class: "action-sheet-container" }, h("div", { key: 'd9c8ac404fd6719a7adf8cb36549f67616f9a0c4', class: "action-sheet-group", ref: (el) => (this.groupEl = el), role: hasRadioButtons ? 'radiogroup' : undefined }, header !== undefined && (h("div", { key: '180433a8ad03ef5c54728a1a8f34715b6921d658', id: headerID, class: {
|
|
313
491
|
'action-sheet-title': true,
|
|
314
492
|
'action-sheet-has-sub-title': this.subHeader !== undefined,
|
|
315
|
-
} }, header, this.subHeader && h("div", { key: '
|
|
493
|
+
} }, header, this.subHeader && h("div", { key: '7138e79e61b1a8f42bc5a9175c57fa2f15d7ec5a', class: "action-sheet-sub-title" }, this.subHeader))), this.renderActionSheetButtons(buttons)), cancelButton && (h("div", { key: 'b617c722f5b8028d73ed34b69310f312c65f34a7', class: "action-sheet-group action-sheet-group-cancel" }, h("button", Object.assign({ key: 'd0dd876fc48815df3710413c201c0b445a8e16c0' }, cancelButton.htmlAttributes, { type: "button", class: buttonClass(cancelButton), onClick: () => this.buttonClick(cancelButton) }), h("span", { key: 'e7b960157cc6fc5fe92a12090b2be55e8ae072e4', class: "action-sheet-button-inner" }, cancelButton.icon && (h("ion-icon", { key: '05498ffc60cab911dbff0ecbc6168dea59ada9a5', icon: cancelButton.icon, "aria-hidden": "true", lazy: false, class: "action-sheet-icon" })), cancelButton.text), mode === 'md' && h("ion-ripple-effect", { key: '3d401346cea301be4ca03671f7370f6f4b0b6bde' })))))), h("div", { key: '971f3c5fcc07f36c28eb469a47ec0290c692e139', tabindex: "0", "aria-hidden": "true" })));
|
|
316
494
|
}
|
|
317
495
|
get el() { return this; }
|
|
318
496
|
static get watchers() { return {
|
|
497
|
+
"buttons": ["buttonsChanged"],
|
|
319
498
|
"isOpen": ["onIsOpenChange"],
|
|
320
499
|
"trigger": ["triggerChanged"]
|
|
321
500
|
}; }
|
|
@@ -340,11 +519,13 @@ const ActionSheet = /*@__PURE__*/ proxyCustomElement(class ActionSheet extends H
|
|
|
340
519
|
"htmlAttributes": [16],
|
|
341
520
|
"isOpen": [4, "is-open"],
|
|
342
521
|
"trigger": [1],
|
|
522
|
+
"activeRadioId": [32],
|
|
343
523
|
"present": [64],
|
|
344
524
|
"dismiss": [64],
|
|
345
525
|
"onDidDismiss": [64],
|
|
346
526
|
"onWillDismiss": [64]
|
|
347
|
-
},
|
|
527
|
+
}, [[0, "keydown", "onKeydown"]], {
|
|
528
|
+
"buttons": ["buttonsChanged"],
|
|
348
529
|
"isOpen": ["onIsOpenChange"],
|
|
349
530
|
"trigger": ["triggerChanged"]
|
|
350
531
|
}]);
|
package/components/ion-select.js
CHANGED
|
@@ -417,13 +417,18 @@ const Select = /*@__PURE__*/ proxyCustomElement(class Select extends HTMLElement
|
|
|
417
417
|
.filter((cls) => cls !== 'hydrated')
|
|
418
418
|
.join(' ');
|
|
419
419
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
420
|
+
const isSelected = isOptionSelected(selectValue, value, this.compareWith);
|
|
420
421
|
return {
|
|
421
|
-
role:
|
|
422
|
+
role: isSelected ? 'selected' : '',
|
|
422
423
|
text: option.textContent,
|
|
423
424
|
cssClass: optClass,
|
|
424
425
|
handler: () => {
|
|
425
426
|
this.setValue(value);
|
|
426
427
|
},
|
|
428
|
+
htmlAttributes: {
|
|
429
|
+
'aria-checked': isSelected ? 'true' : 'false',
|
|
430
|
+
role: 'radio',
|
|
431
|
+
},
|
|
427
432
|
};
|
|
428
433
|
});
|
|
429
434
|
// Add "cancel" button
|
|
@@ -804,7 +809,7 @@ const Select = /*@__PURE__*/ proxyCustomElement(class Select extends HTMLElement
|
|
|
804
809
|
* TODO(FW-5592): Remove hasStartEndSlots condition
|
|
805
810
|
*/
|
|
806
811
|
const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || isExpanded || hasStartEndSlots));
|
|
807
|
-
return (h(Host, { key: '
|
|
812
|
+
return (h(Host, { key: 'd8026835993d0e6dce747098f741a06ae4e4f54d', onClick: this.onClick, class: createColorClasses(this.color, {
|
|
808
813
|
[mode]: true,
|
|
809
814
|
'in-item': inItem,
|
|
810
815
|
'in-item-color': hostContext('ion-item.ion-color', el),
|
|
@@ -822,7 +827,7 @@ const Select = /*@__PURE__*/ proxyCustomElement(class Select extends HTMLElement
|
|
|
822
827
|
[`select-justify-${justify}`]: justifyEnabled,
|
|
823
828
|
[`select-shape-${shape}`]: shape !== undefined,
|
|
824
829
|
[`select-label-placement-${labelPlacement}`]: true,
|
|
825
|
-
}) }, h("label", { key: '
|
|
830
|
+
}) }, h("label", { key: 'fcfb40209d6d07d49c7fdca4884b31abf6ac2567', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick }, this.renderLabelContainer(), h("div", { key: 'f191664f2290c3890bde1156157c83a6ff17dbe2', class: "select-wrapper-inner" }, h("slot", { key: '317a28d1115b4214f291e228ce0fe6fc782e57d5', name: "start" }), h("div", { key: 'db68e18abd5ca3a1023d7c7b58bf89893ae18073', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), h("slot", { key: '4274e042267c2234a198b0f65c89477898d08130', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && h("div", { key: '2e2eb1ee2b2791e0683d9afb186fde6e938ca59c', class: "select-highlight" })), this.renderBottomContent()));
|
|
826
831
|
}
|
|
827
832
|
get el() { return this; }
|
|
828
833
|
static get watchers() { return {
|
package/components/modal.js
CHANGED
|
@@ -1921,13 +1921,7 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
|
|
|
1921
1921
|
};
|
|
1922
1922
|
window.addEventListener(KEYBOARD_DID_OPEN, this.keyboardOpenCallback);
|
|
1923
1923
|
}
|
|
1924
|
-
|
|
1925
|
-
* Recalculate isSheetModal because framework bindings (e.g., Angular)
|
|
1926
|
-
* may not have been applied when componentWillLoad ran.
|
|
1927
|
-
*/
|
|
1928
|
-
const isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
|
|
1929
|
-
this.isSheetModal = isSheetModal;
|
|
1930
|
-
if (isSheetModal) {
|
|
1924
|
+
if (this.isSheetModal) {
|
|
1931
1925
|
this.initSheetGesture();
|
|
1932
1926
|
}
|
|
1933
1927
|
else if (hasCardModal) {
|
|
@@ -2009,79 +2003,6 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
|
|
|
2009
2003
|
this.gesture = gesture;
|
|
2010
2004
|
this.moveSheetToBreakpoint = moveSheetToBreakpoint;
|
|
2011
2005
|
this.gesture.enable(true);
|
|
2012
|
-
/**
|
|
2013
|
-
* When backdrop interaction is allowed, nested router outlets from child routes
|
|
2014
|
-
* may block pointer events to parent content. Apply passthrough styles only when
|
|
2015
|
-
* the modal was the sole content of a child route page.
|
|
2016
|
-
* See https://github.com/ionic-team/ionic-framework/issues/30700
|
|
2017
|
-
*/
|
|
2018
|
-
const backdropNotBlocking = this.showBackdrop === false || this.focusTrap === false || backdropBreakpoint > 0;
|
|
2019
|
-
if (backdropNotBlocking) {
|
|
2020
|
-
this.setupChildRoutePassthrough();
|
|
2021
|
-
}
|
|
2022
|
-
}
|
|
2023
|
-
/**
|
|
2024
|
-
* For sheet modals that allow background interaction, sets up pointer-events
|
|
2025
|
-
* passthrough on child route page wrappers and nested router outlets.
|
|
2026
|
-
*/
|
|
2027
|
-
setupChildRoutePassthrough() {
|
|
2028
|
-
var _a;
|
|
2029
|
-
const pageParent = this.getOriginalPageParent();
|
|
2030
|
-
// Skip ion-app (controller modals) and pages with other content (inline modals)
|
|
2031
|
-
if (!pageParent || pageParent.tagName === 'ION-APP') {
|
|
2032
|
-
return;
|
|
2033
|
-
}
|
|
2034
|
-
const hasVisibleContent = Array.from(pageParent.children).some((child) => {
|
|
2035
|
-
var _a;
|
|
2036
|
-
if (child === this.el)
|
|
2037
|
-
return false;
|
|
2038
|
-
if (child instanceof HTMLElement && window.getComputedStyle(child).display === 'none')
|
|
2039
|
-
return false;
|
|
2040
|
-
if (child.tagName === 'TEMPLATE' || child.tagName === 'SLOT')
|
|
2041
|
-
return false;
|
|
2042
|
-
if (child.nodeType === Node.TEXT_NODE && !((_a = child.textContent) === null || _a === void 0 ? void 0 : _a.trim()))
|
|
2043
|
-
return false;
|
|
2044
|
-
return true;
|
|
2045
|
-
});
|
|
2046
|
-
if (hasVisibleContent) {
|
|
2047
|
-
return;
|
|
2048
|
-
}
|
|
2049
|
-
// Child route case: page only contained the modal
|
|
2050
|
-
pageParent.classList.add('ion-page-overlay-passthrough');
|
|
2051
|
-
// Also make nested router outlets passthrough
|
|
2052
|
-
const routerOutlet = pageParent.parentElement;
|
|
2053
|
-
if ((routerOutlet === null || routerOutlet === void 0 ? void 0 : routerOutlet.tagName) === 'ION-ROUTER-OUTLET' && ((_a = routerOutlet.parentElement) === null || _a === void 0 ? void 0 : _a.tagName) !== 'ION-APP') {
|
|
2054
|
-
routerOutlet.style.setProperty('pointer-events', 'none');
|
|
2055
|
-
routerOutlet.setAttribute('data-overlay-passthrough', 'true');
|
|
2056
|
-
}
|
|
2057
|
-
}
|
|
2058
|
-
/**
|
|
2059
|
-
* Finds the ion-page ancestor of the modal's original parent location.
|
|
2060
|
-
*/
|
|
2061
|
-
getOriginalPageParent() {
|
|
2062
|
-
if (!this.cachedOriginalParent) {
|
|
2063
|
-
return null;
|
|
2064
|
-
}
|
|
2065
|
-
let pageParent = this.cachedOriginalParent;
|
|
2066
|
-
while (pageParent && !pageParent.classList.contains('ion-page')) {
|
|
2067
|
-
pageParent = pageParent.parentElement;
|
|
2068
|
-
}
|
|
2069
|
-
return pageParent;
|
|
2070
|
-
}
|
|
2071
|
-
/**
|
|
2072
|
-
* Removes passthrough styles added by setupChildRoutePassthrough.
|
|
2073
|
-
*/
|
|
2074
|
-
cleanupChildRoutePassthrough() {
|
|
2075
|
-
const pageParent = this.getOriginalPageParent();
|
|
2076
|
-
if (!pageParent) {
|
|
2077
|
-
return;
|
|
2078
|
-
}
|
|
2079
|
-
pageParent.classList.remove('ion-page-overlay-passthrough');
|
|
2080
|
-
const routerOutlet = pageParent.parentElement;
|
|
2081
|
-
if (routerOutlet === null || routerOutlet === void 0 ? void 0 : routerOutlet.hasAttribute('data-overlay-passthrough')) {
|
|
2082
|
-
routerOutlet.style.removeProperty('pointer-events');
|
|
2083
|
-
routerOutlet.removeAttribute('data-overlay-passthrough');
|
|
2084
|
-
}
|
|
2085
2006
|
}
|
|
2086
2007
|
sheetOnDismiss() {
|
|
2087
2008
|
/**
|
|
@@ -2171,7 +2092,6 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
|
|
|
2171
2092
|
}
|
|
2172
2093
|
this.cleanupViewTransitionListener();
|
|
2173
2094
|
this.cleanupParentRemovalObserver();
|
|
2174
|
-
this.cleanupChildRoutePassthrough();
|
|
2175
2095
|
}
|
|
2176
2096
|
this.currentBreakpoint = undefined;
|
|
2177
2097
|
this.animation = undefined;
|
|
@@ -2368,6 +2288,17 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
|
|
|
2368
2288
|
this.cachedOriginalParent.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
|
|
2369
2289
|
return;
|
|
2370
2290
|
}
|
|
2291
|
+
/**
|
|
2292
|
+
* Don't observe for controller-based modals or when the parent is the
|
|
2293
|
+
* app root (document.body or ion-app). These parents won't be removed,
|
|
2294
|
+
* and observing document.body with subtree: true causes performance
|
|
2295
|
+
* issues with frameworks like Angular during change detection.
|
|
2296
|
+
*/
|
|
2297
|
+
if (this.hasController ||
|
|
2298
|
+
this.cachedOriginalParent === document.body ||
|
|
2299
|
+
this.cachedOriginalParent.tagName === 'ION-APP') {
|
|
2300
|
+
return;
|
|
2301
|
+
}
|
|
2371
2302
|
this.parentRemovalObserver = new MutationObserver((mutations) => {
|
|
2372
2303
|
mutations.forEach((mutation) => {
|
|
2373
2304
|
if (mutation.type === 'childList' && mutation.removedNodes.length > 0) {
|
|
@@ -2409,20 +2340,20 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
|
|
|
2409
2340
|
const isCardModal = presentingElement !== undefined && mode === 'ios';
|
|
2410
2341
|
const isHandleCycle = handleBehavior === 'cycle';
|
|
2411
2342
|
const isSheetModalWithHandle = isSheetModal && showHandle;
|
|
2412
|
-
return (h(Host, Object.assign({ key: '
|
|
2343
|
+
return (h(Host, Object.assign({ key: '5d8261a1a174d83642c0f7f2aa4f6c265f50fa57', "no-router": true,
|
|
2413
2344
|
// Allow the modal to be navigable when the handle is focusable
|
|
2414
2345
|
tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1 }, htmlAttributes, { style: {
|
|
2415
2346
|
zIndex: `${20000 + this.overlayIndex}`,
|
|
2416
|
-
}, 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: '
|
|
2347
|
+
}, 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: 'bc165dd344e752c13076ca5ae37ea7d68d618d55', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: '4a2f6edaeeec2978f0cd7b2b93a44c2f0da3ab54', class: "modal-shadow" }), h("div", Object.assign({ key: '13d662aa50871e97567270dbbce6825633c62bad',
|
|
2417
2348
|
/*
|
|
2418
2349
|
role and aria-modal must be used on the
|
|
2419
2350
|
same element. They must also be set inside the
|
|
2420
2351
|
shadow DOM otherwise ion-button will not be highlighted
|
|
2421
2352
|
when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134
|
|
2422
2353
|
*/
|
|
2423
|
-
role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: '
|
|
2354
|
+
role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: 'e678cd3c64a0ab56636f68f9fa416741589f783c', class: "modal-handle",
|
|
2424
2355
|
// Prevents the handle from receiving keyboard focus when it does not cycle
|
|
2425
|
-
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: '
|
|
2356
|
+
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: '1ebc3549c5c67ea286384b9917ed4dd8958ea2ae', onSlotchange: this.onSlotChange }))));
|
|
2426
2357
|
}
|
|
2427
2358
|
get el() { return this; }
|
|
2428
2359
|
static get watchers() { return {
|
|
@@ -2459,7 +2390,6 @@ const Modal = /*@__PURE__*/ proxyCustomElement(class Modal extends HTMLElement {
|
|
|
2459
2390
|
"keepContentsMounted": [4, "keep-contents-mounted"],
|
|
2460
2391
|
"focusTrap": [4, "focus-trap"],
|
|
2461
2392
|
"canDismiss": [4, "can-dismiss"],
|
|
2462
|
-
"isSheetModal": [32],
|
|
2463
2393
|
"presented": [32],
|
|
2464
2394
|
"present": [64],
|
|
2465
2395
|
"dismiss": [64],
|
package/components/overlays.js
CHANGED
|
@@ -502,7 +502,7 @@ const setRootAriaHidden = (hidden = false) => {
|
|
|
502
502
|
}
|
|
503
503
|
};
|
|
504
504
|
const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts) => {
|
|
505
|
-
var _a, _b
|
|
505
|
+
var _a, _b;
|
|
506
506
|
if (overlay.presented) {
|
|
507
507
|
return;
|
|
508
508
|
}
|
|
@@ -536,10 +536,9 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
|
|
|
536
536
|
*/
|
|
537
537
|
const overlayEl = overlay.el;
|
|
538
538
|
const shouldTrapFocus = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false;
|
|
539
|
-
// Only lock out root content when backdrop is
|
|
540
|
-
//
|
|
541
|
-
const
|
|
542
|
-
const shouldLockRoot = shouldTrapFocus && backdropAlwaysActive;
|
|
539
|
+
// Only lock out root content when backdrop is active. Developers relying on showBackdrop=false
|
|
540
|
+
// expect background interaction to remain enabled.
|
|
541
|
+
const shouldLockRoot = shouldTrapFocus && overlayEl.showBackdrop !== false;
|
|
543
542
|
overlay.presented = true;
|
|
544
543
|
overlay.willPresent.emit();
|
|
545
544
|
if (shouldLockRoot) {
|
|
@@ -551,7 +550,7 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
|
|
|
551
550
|
}
|
|
552
551
|
document.body.classList.add(BACKDROP_NO_SCROLL);
|
|
553
552
|
}
|
|
554
|
-
(
|
|
553
|
+
(_a = overlay.willPresentShorthand) === null || _a === void 0 ? void 0 : _a.emit();
|
|
555
554
|
const mode = getIonMode(overlay);
|
|
556
555
|
// get the user's animation fn if one was provided
|
|
557
556
|
const animationBuilder = overlay.enterAnimation
|
|
@@ -560,7 +559,7 @@ const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts)
|
|
|
560
559
|
const completed = await overlayAnimation(overlay, animationBuilder, overlay.el, opts);
|
|
561
560
|
if (completed) {
|
|
562
561
|
overlay.didPresent.emit();
|
|
563
|
-
(
|
|
562
|
+
(_b = overlay.didPresentShorthand) === null || _b === void 0 ? void 0 : _b.emit();
|
|
564
563
|
}
|
|
565
564
|
/**
|
|
566
565
|
* If the focused element is already
|
|
@@ -638,7 +637,7 @@ const restoreElementFocus = async (overlayEl) => {
|
|
|
638
637
|
}
|
|
639
638
|
};
|
|
640
639
|
const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnimation, opts) => {
|
|
641
|
-
var _a, _b
|
|
640
|
+
var _a, _b;
|
|
642
641
|
if (!overlay.presented) {
|
|
643
642
|
return false;
|
|
644
643
|
}
|
|
@@ -654,14 +653,11 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
|
|
|
654
653
|
* is dismissed.
|
|
655
654
|
*/
|
|
656
655
|
const overlaysLockingRoot = presentedOverlays.filter((o) => {
|
|
657
|
-
var _a;
|
|
658
656
|
const el = o;
|
|
659
|
-
|
|
660
|
-
return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && backdropAlwaysActive;
|
|
657
|
+
return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && el.showBackdrop !== false;
|
|
661
658
|
});
|
|
662
659
|
const overlayEl = overlay.el;
|
|
663
|
-
const
|
|
664
|
-
const locksRoot = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false && backdropAlwaysActive;
|
|
660
|
+
const locksRoot = overlayEl.tagName !== 'ION-TOAST' && overlayEl.focusTrap !== false && overlayEl.showBackdrop !== false;
|
|
665
661
|
/**
|
|
666
662
|
* If this is the last visible overlay that is trapping focus
|
|
667
663
|
* then we want to re-add the root to the accessibility tree.
|
|
@@ -676,7 +672,7 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
|
|
|
676
672
|
// Overlay contents should not be clickable during dismiss
|
|
677
673
|
overlay.el.style.setProperty('pointer-events', 'none');
|
|
678
674
|
overlay.willDismiss.emit({ data, role });
|
|
679
|
-
(
|
|
675
|
+
(_a = overlay.willDismissShorthand) === null || _a === void 0 ? void 0 : _a.emit({ data, role });
|
|
680
676
|
const mode = getIonMode(overlay);
|
|
681
677
|
const animationBuilder = overlay.leaveAnimation
|
|
682
678
|
? overlay.leaveAnimation
|
|
@@ -686,7 +682,7 @@ const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLeaveAnim
|
|
|
686
682
|
await overlayAnimation(overlay, animationBuilder, overlay.el, opts);
|
|
687
683
|
}
|
|
688
684
|
overlay.didDismiss.emit({ data, role });
|
|
689
|
-
(
|
|
685
|
+
(_b = overlay.didDismissShorthand) === null || _b === void 0 ? void 0 : _b.emit({ data, role });
|
|
690
686
|
// Get a reference to all animations currently assigned to this overlay
|
|
691
687
|
// Then tear them down to return the overlay to its initial visual state
|
|
692
688
|
const animations = activeAnimations.get(overlay) || [];
|
package/css/core.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
:root{--ion-color-primary: #0054e9;--ion-color-primary-rgb: 0, 84, 233;--ion-color-primary-contrast: #fff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #004acd;--ion-color-primary-tint: #1a65eb;--ion-color-secondary: #0163aa;--ion-color-secondary-rgb: 1, 99, 170;--ion-color-secondary-contrast: #fff;--ion-color-secondary-contrast-rgb: 255, 255, 255;--ion-color-secondary-shade: #015796;--ion-color-secondary-tint: #1a73b3;--ion-color-tertiary: #6030ff;--ion-color-tertiary-rgb: 96, 48, 255;--ion-color-tertiary-contrast: #fff;--ion-color-tertiary-contrast-rgb: 255, 255, 255;--ion-color-tertiary-shade: #542ae0;--ion-color-tertiary-tint: #7045ff;--ion-color-success: #2dd55b;--ion-color-success-rgb: 45, 213, 91;--ion-color-success-contrast: #000;--ion-color-success-contrast-rgb: 0, 0, 0;--ion-color-success-shade: #28bb50;--ion-color-success-tint: #42d96b;--ion-color-warning: #ffc409;--ion-color-warning-rgb: 255, 196, 9;--ion-color-warning-contrast: #000;--ion-color-warning-contrast-rgb: 0, 0, 0;--ion-color-warning-shade: #e0ac08;--ion-color-warning-tint: #ffca22;--ion-color-danger: #c5000f;--ion-color-danger-rgb: 197, 0, 15;--ion-color-danger-contrast: #fff;--ion-color-danger-contrast-rgb: 255, 255, 255;--ion-color-danger-shade: #ad000d;--ion-color-danger-tint: #cb1a27;--ion-color-light: #f4f5f8;--ion-color-light-rgb: 244, 245, 248;--ion-color-light-contrast: #000;--ion-color-light-contrast-rgb: 0, 0, 0;--ion-color-light-shade: #d7d8da;--ion-color-light-tint: #f5f6f9;--ion-color-medium: #636469;--ion-color-medium-rgb: 99, 100, 105;--ion-color-medium-contrast: #fff;--ion-color-medium-contrast-rgb: 255, 255, 255;--ion-color-medium-shade: #57585c;--ion-color-medium-tint: #737478;--ion-color-dark: #222428;--ion-color-dark-rgb: 34, 36, 40;--ion-color-dark-contrast: #fff;--ion-color-dark-contrast-rgb: 255, 255, 255;--ion-color-dark-shade: #1e2023;--ion-color-dark-tint: #383a3e}html.ios{--ion-default-font: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Roboto", sans-serif}html.md{--ion-default-font: "Roboto", "Helvetica Neue", sans-serif}html{--ion-dynamic-font: -apple-system-body;--ion-font-family: var(--ion-default-font)}body{background:var(--ion-background-color);color:var(--ion-text-color)}body.backdrop-no-scroll{overflow:hidden}html.ios ion-modal.modal-card ion-header ion-toolbar:first-of-type,html.ios ion-modal.modal-sheet ion-header ion-toolbar:first-of-type,html.ios ion-modal ion-footer ion-toolbar:first-of-type,html.ios ion-footer.modal-footer-moving ion-toolbar:first-of-type{padding-top:6px}html.ios ion-modal.modal-card ion-header ion-toolbar:last-of-type,html.ios ion-modal.modal-sheet ion-header ion-toolbar:last-of-type{padding-bottom:6px}html.ios ion-modal ion-toolbar,html.ios .modal-footer-moving ion-toolbar{padding-right:calc(var(--ion-safe-area-right) + 8px);padding-left:calc(var(--ion-safe-area-left) + 8px)}@media screen and (min-width: 768px){html.ios ion-modal.modal-card:first-of-type{--backdrop-opacity: 0.18}}ion-modal.modal-default.show-modal~ion-modal.modal-default{--backdrop-opacity: 0;--box-shadow: none}html.ios ion-modal.modal-card .ion-page{border-top-left-radius:var(--border-radius)}.ion-color-primary{--ion-color-base: var(--ion-color-primary, #0054e9) !important;--ion-color-base-rgb: var(--ion-color-primary-rgb, 0, 84, 233) !important;--ion-color-contrast: var(--ion-color-primary-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-primary-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-primary-shade, #004acd) !important;--ion-color-tint: var(--ion-color-primary-tint, #1a65eb) !important}.ion-color-secondary{--ion-color-base: var(--ion-color-secondary, #0163aa) !important;--ion-color-base-rgb: var(--ion-color-secondary-rgb, 1, 99, 170) !important;--ion-color-contrast: var(--ion-color-secondary-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-secondary-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-secondary-shade, #015796) !important;--ion-color-tint: var(--ion-color-secondary-tint, #1a73b3) !important}.ion-color-tertiary{--ion-color-base: var(--ion-color-tertiary, #6030ff) !important;--ion-color-base-rgb: var(--ion-color-tertiary-rgb, 96, 48, 255) !important;--ion-color-contrast: var(--ion-color-tertiary-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-tertiary-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-tertiary-shade, #542ae0) !important;--ion-color-tint: var(--ion-color-tertiary-tint, #7045ff) !important}.ion-color-success{--ion-color-base: var(--ion-color-success, #2dd55b) !important;--ion-color-base-rgb: var(--ion-color-success-rgb, 45, 213, 91) !important;--ion-color-contrast: var(--ion-color-success-contrast, #000) !important;--ion-color-contrast-rgb: var(--ion-color-success-contrast-rgb, 0, 0, 0) !important;--ion-color-shade: var(--ion-color-success-shade, #28bb50) !important;--ion-color-tint: var(--ion-color-success-tint, #42d96b) !important}.ion-color-warning{--ion-color-base: var(--ion-color-warning, #ffc409) !important;--ion-color-base-rgb: var(--ion-color-warning-rgb, 255, 196, 9) !important;--ion-color-contrast: var(--ion-color-warning-contrast, #000) !important;--ion-color-contrast-rgb: var(--ion-color-warning-contrast-rgb, 0, 0, 0) !important;--ion-color-shade: var(--ion-color-warning-shade, #e0ac08) !important;--ion-color-tint: var(--ion-color-warning-tint, #ffca22) !important}.ion-color-danger{--ion-color-base: var(--ion-color-danger, #c5000f) !important;--ion-color-base-rgb: var(--ion-color-danger-rgb, 197, 0, 15) !important;--ion-color-contrast: var(--ion-color-danger-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-danger-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-danger-shade, #ad000d) !important;--ion-color-tint: var(--ion-color-danger-tint, #cb1a27) !important}.ion-color-light{--ion-color-base: var(--ion-color-light, #f4f5f8) !important;--ion-color-base-rgb: var(--ion-color-light-rgb, 244, 245, 248) !important;--ion-color-contrast: var(--ion-color-light-contrast, #000) !important;--ion-color-contrast-rgb: var(--ion-color-light-contrast-rgb, 0, 0, 0) !important;--ion-color-shade: var(--ion-color-light-shade, #d7d8da) !important;--ion-color-tint: var(--ion-color-light-tint, #f5f6f9) !important}.ion-color-medium{--ion-color-base: var(--ion-color-medium, #636469) !important;--ion-color-base-rgb: var(--ion-color-medium-rgb, 99, 100, 105) !important;--ion-color-contrast: var(--ion-color-medium-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-medium-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-medium-shade, #57585c) !important;--ion-color-tint: var(--ion-color-medium-tint, #737478) !important}.ion-color-dark{--ion-color-base: var(--ion-color-dark, #222428) !important;--ion-color-base-rgb: var(--ion-color-dark-rgb, 34, 36, 40) !important;--ion-color-contrast: var(--ion-color-dark-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-dark-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-dark-shade, #1e2023) !important;--ion-color-tint: var(--ion-color-dark-tint, #383a3e) !important}.ion-page{left:0;right:0;top:0;bottom:0;display:flex;position:absolute;flex-direction:column;justify-content:space-between;contain:layout size style;z-index:0}.ion-page.ion-page-overlay-passthrough{pointer-events:none}ion-modal>.ion-page{position:relative;contain:layout style;height:100%}.split-pane-visible>.ion-page.split-pane-main{position:relative}ion-route,ion-route-redirect,ion-router,ion-select-option,ion-nav-controller,ion-menu-controller,ion-action-sheet-controller,ion-alert-controller,ion-loading-controller,ion-modal-controller,ion-picker-controller,ion-popover-controller,ion-toast-controller,.ion-page-hidden{display:none !important}.ion-page-invisible{opacity:0}.can-go-back>ion-header ion-back-button{display:block}html.plt-ios.plt-hybrid,html.plt-ios.plt-pwa{--ion-statusbar-padding: 20px}@supports(padding-top: 20px){html{--ion-safe-area-top: var(--ion-statusbar-padding)}}@supports(padding-top: env(safe-area-inset-top)){html{--ion-safe-area-top: env(safe-area-inset-top);--ion-safe-area-bottom: env(safe-area-inset-bottom);--ion-safe-area-left: env(safe-area-inset-left);--ion-safe-area-right: env(safe-area-inset-right)}}ion-card.ion-color .ion-inherit-color,ion-card-header.ion-color .ion-inherit-color{color:inherit}.menu-content{transform:translate3d(0, 0, 0)}.menu-content-open{cursor:pointer;touch-action:manipulation;pointer-events:none;overflow-y:hidden}.menu-content-open ion-content{--overflow: hidden}.menu-content-open .ion-content-scroll-host{overflow:hidden}.ios .menu-content-reveal{box-shadow:-8px 0 42px rgba(0,0,0,.08)}[dir=rtl].ios .menu-content-reveal{box-shadow:8px 0 42px rgba(0,0,0,.08)}.md .menu-content-reveal{box-shadow:4px 0px 16px rgba(0,0,0,.18)}.md .menu-content-push{box-shadow:4px 0px 16px rgba(0,0,0,.18)}ion-accordion-group.accordion-group-expand-inset>ion-accordion:first-of-type{border-top-left-radius:8px;border-top-right-radius:8px}ion-accordion-group.accordion-group-expand-inset>ion-accordion:last-of-type{border-bottom-left-radius:8px;border-bottom-right-radius:8px}ion-accordion-group>ion-accordion:last-of-type ion-item[slot=header]{--border-width: 0px}ion-accordion.accordion-animated>[slot=header] .ion-accordion-toggle-icon{transition:300ms transform cubic-bezier(0.25, 0.8, 0.5, 1)}@media(prefers-reduced-motion: reduce){ion-accordion .ion-accordion-toggle-icon{transition:none !important}}ion-accordion.accordion-expanding>[slot=header] .ion-accordion-toggle-icon,ion-accordion.accordion-expanded>[slot=header] .ion-accordion-toggle-icon{transform:rotate(180deg)}ion-accordion-group.accordion-group-expand-inset.md>ion-accordion.accordion-previous ion-item[slot=header]{--border-width: 0px;--inner-border-width: 0px}ion-accordion-group.accordion-group-expand-inset.md>ion-accordion.accordion-expanding:first-of-type,ion-accordion-group.accordion-group-expand-inset.md>ion-accordion.accordion-expanded:first-of-type{margin-top:0}ion-input input::-webkit-date-and-time-value{text-align:start}.ion-datetime-button-overlay{--width: fit-content;--height: fit-content}.ion-datetime-button-overlay ion-datetime.datetime-grid{width:320px;min-height:320px}[ion-last-focus],header[tabindex="-1"]:focus,[role=banner][tabindex="-1"]:focus,main[tabindex="-1"]:focus,[role=main][tabindex="-1"]:focus,h1[tabindex="-1"]:focus,[role=heading][aria-level="1"][tabindex="-1"]:focus{outline:none}.popover-viewport:has(>ion-content){overflow:hidden}@supports not selector(:has(> ion-content)){.popover-viewport{overflow:hidden}}/*# sourceMappingURL=core.css.map */
|
|
1
|
+
:root{--ion-color-primary: #0054e9;--ion-color-primary-rgb: 0, 84, 233;--ion-color-primary-contrast: #fff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #004acd;--ion-color-primary-tint: #1a65eb;--ion-color-secondary: #0163aa;--ion-color-secondary-rgb: 1, 99, 170;--ion-color-secondary-contrast: #fff;--ion-color-secondary-contrast-rgb: 255, 255, 255;--ion-color-secondary-shade: #015796;--ion-color-secondary-tint: #1a73b3;--ion-color-tertiary: #6030ff;--ion-color-tertiary-rgb: 96, 48, 255;--ion-color-tertiary-contrast: #fff;--ion-color-tertiary-contrast-rgb: 255, 255, 255;--ion-color-tertiary-shade: #542ae0;--ion-color-tertiary-tint: #7045ff;--ion-color-success: #2dd55b;--ion-color-success-rgb: 45, 213, 91;--ion-color-success-contrast: #000;--ion-color-success-contrast-rgb: 0, 0, 0;--ion-color-success-shade: #28bb50;--ion-color-success-tint: #42d96b;--ion-color-warning: #ffc409;--ion-color-warning-rgb: 255, 196, 9;--ion-color-warning-contrast: #000;--ion-color-warning-contrast-rgb: 0, 0, 0;--ion-color-warning-shade: #e0ac08;--ion-color-warning-tint: #ffca22;--ion-color-danger: #c5000f;--ion-color-danger-rgb: 197, 0, 15;--ion-color-danger-contrast: #fff;--ion-color-danger-contrast-rgb: 255, 255, 255;--ion-color-danger-shade: #ad000d;--ion-color-danger-tint: #cb1a27;--ion-color-light: #f4f5f8;--ion-color-light-rgb: 244, 245, 248;--ion-color-light-contrast: #000;--ion-color-light-contrast-rgb: 0, 0, 0;--ion-color-light-shade: #d7d8da;--ion-color-light-tint: #f5f6f9;--ion-color-medium: #636469;--ion-color-medium-rgb: 99, 100, 105;--ion-color-medium-contrast: #fff;--ion-color-medium-contrast-rgb: 255, 255, 255;--ion-color-medium-shade: #57585c;--ion-color-medium-tint: #737478;--ion-color-dark: #222428;--ion-color-dark-rgb: 34, 36, 40;--ion-color-dark-contrast: #fff;--ion-color-dark-contrast-rgb: 255, 255, 255;--ion-color-dark-shade: #1e2023;--ion-color-dark-tint: #383a3e}html.ios{--ion-default-font: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Roboto", sans-serif}html.md{--ion-default-font: "Roboto", "Helvetica Neue", sans-serif}html{--ion-dynamic-font: -apple-system-body;--ion-font-family: var(--ion-default-font)}body{background:var(--ion-background-color);color:var(--ion-text-color)}body.backdrop-no-scroll{overflow:hidden}html.ios ion-modal.modal-card ion-header ion-toolbar:first-of-type,html.ios ion-modal.modal-sheet ion-header ion-toolbar:first-of-type,html.ios ion-modal ion-footer ion-toolbar:first-of-type,html.ios ion-footer.modal-footer-moving ion-toolbar:first-of-type{padding-top:6px}html.ios ion-modal.modal-card ion-header ion-toolbar:last-of-type,html.ios ion-modal.modal-sheet ion-header ion-toolbar:last-of-type{padding-bottom:6px}html.ios ion-modal ion-toolbar,html.ios .modal-footer-moving ion-toolbar{padding-right:calc(var(--ion-safe-area-right) + 8px);padding-left:calc(var(--ion-safe-area-left) + 8px)}@media screen and (min-width: 768px){html.ios ion-modal.modal-card:first-of-type{--backdrop-opacity: 0.18}}ion-modal.modal-default.show-modal~ion-modal.modal-default{--backdrop-opacity: 0;--box-shadow: none}html.ios ion-modal.modal-card .ion-page{border-top-left-radius:var(--border-radius)}.ion-color-primary{--ion-color-base: var(--ion-color-primary, #0054e9) !important;--ion-color-base-rgb: var(--ion-color-primary-rgb, 0, 84, 233) !important;--ion-color-contrast: var(--ion-color-primary-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-primary-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-primary-shade, #004acd) !important;--ion-color-tint: var(--ion-color-primary-tint, #1a65eb) !important}.ion-color-secondary{--ion-color-base: var(--ion-color-secondary, #0163aa) !important;--ion-color-base-rgb: var(--ion-color-secondary-rgb, 1, 99, 170) !important;--ion-color-contrast: var(--ion-color-secondary-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-secondary-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-secondary-shade, #015796) !important;--ion-color-tint: var(--ion-color-secondary-tint, #1a73b3) !important}.ion-color-tertiary{--ion-color-base: var(--ion-color-tertiary, #6030ff) !important;--ion-color-base-rgb: var(--ion-color-tertiary-rgb, 96, 48, 255) !important;--ion-color-contrast: var(--ion-color-tertiary-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-tertiary-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-tertiary-shade, #542ae0) !important;--ion-color-tint: var(--ion-color-tertiary-tint, #7045ff) !important}.ion-color-success{--ion-color-base: var(--ion-color-success, #2dd55b) !important;--ion-color-base-rgb: var(--ion-color-success-rgb, 45, 213, 91) !important;--ion-color-contrast: var(--ion-color-success-contrast, #000) !important;--ion-color-contrast-rgb: var(--ion-color-success-contrast-rgb, 0, 0, 0) !important;--ion-color-shade: var(--ion-color-success-shade, #28bb50) !important;--ion-color-tint: var(--ion-color-success-tint, #42d96b) !important}.ion-color-warning{--ion-color-base: var(--ion-color-warning, #ffc409) !important;--ion-color-base-rgb: var(--ion-color-warning-rgb, 255, 196, 9) !important;--ion-color-contrast: var(--ion-color-warning-contrast, #000) !important;--ion-color-contrast-rgb: var(--ion-color-warning-contrast-rgb, 0, 0, 0) !important;--ion-color-shade: var(--ion-color-warning-shade, #e0ac08) !important;--ion-color-tint: var(--ion-color-warning-tint, #ffca22) !important}.ion-color-danger{--ion-color-base: var(--ion-color-danger, #c5000f) !important;--ion-color-base-rgb: var(--ion-color-danger-rgb, 197, 0, 15) !important;--ion-color-contrast: var(--ion-color-danger-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-danger-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-danger-shade, #ad000d) !important;--ion-color-tint: var(--ion-color-danger-tint, #cb1a27) !important}.ion-color-light{--ion-color-base: var(--ion-color-light, #f4f5f8) !important;--ion-color-base-rgb: var(--ion-color-light-rgb, 244, 245, 248) !important;--ion-color-contrast: var(--ion-color-light-contrast, #000) !important;--ion-color-contrast-rgb: var(--ion-color-light-contrast-rgb, 0, 0, 0) !important;--ion-color-shade: var(--ion-color-light-shade, #d7d8da) !important;--ion-color-tint: var(--ion-color-light-tint, #f5f6f9) !important}.ion-color-medium{--ion-color-base: var(--ion-color-medium, #636469) !important;--ion-color-base-rgb: var(--ion-color-medium-rgb, 99, 100, 105) !important;--ion-color-contrast: var(--ion-color-medium-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-medium-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-medium-shade, #57585c) !important;--ion-color-tint: var(--ion-color-medium-tint, #737478) !important}.ion-color-dark{--ion-color-base: var(--ion-color-dark, #222428) !important;--ion-color-base-rgb: var(--ion-color-dark-rgb, 34, 36, 40) !important;--ion-color-contrast: var(--ion-color-dark-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-dark-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-dark-shade, #1e2023) !important;--ion-color-tint: var(--ion-color-dark-tint, #383a3e) !important}.ion-page{left:0;right:0;top:0;bottom:0;display:flex;position:absolute;flex-direction:column;justify-content:space-between;contain:layout size style;z-index:0}ion-modal>.ion-page{position:relative;contain:layout style;height:100%}.split-pane-visible>.ion-page.split-pane-main{position:relative}ion-route,ion-route-redirect,ion-router,ion-select-option,ion-nav-controller,ion-menu-controller,ion-action-sheet-controller,ion-alert-controller,ion-loading-controller,ion-modal-controller,ion-picker-controller,ion-popover-controller,ion-toast-controller,.ion-page-hidden{display:none !important}.ion-page-invisible{opacity:0}.can-go-back>ion-header ion-back-button{display:block}html.plt-ios.plt-hybrid,html.plt-ios.plt-pwa{--ion-statusbar-padding: 20px}@supports(padding-top: 20px){html{--ion-safe-area-top: var(--ion-statusbar-padding)}}@supports(padding-top: env(safe-area-inset-top)){html{--ion-safe-area-top: env(safe-area-inset-top);--ion-safe-area-bottom: env(safe-area-inset-bottom);--ion-safe-area-left: env(safe-area-inset-left);--ion-safe-area-right: env(safe-area-inset-right)}}ion-card.ion-color .ion-inherit-color,ion-card-header.ion-color .ion-inherit-color{color:inherit}.menu-content{transform:translate3d(0, 0, 0)}.menu-content-open{cursor:pointer;touch-action:manipulation;pointer-events:none;overflow-y:hidden}.menu-content-open ion-content{--overflow: hidden}.menu-content-open .ion-content-scroll-host{overflow:hidden}.ios .menu-content-reveal{box-shadow:-8px 0 42px rgba(0,0,0,.08)}[dir=rtl].ios .menu-content-reveal{box-shadow:8px 0 42px rgba(0,0,0,.08)}.md .menu-content-reveal{box-shadow:4px 0px 16px rgba(0,0,0,.18)}.md .menu-content-push{box-shadow:4px 0px 16px rgba(0,0,0,.18)}ion-accordion-group.accordion-group-expand-inset>ion-accordion:first-of-type{border-top-left-radius:8px;border-top-right-radius:8px}ion-accordion-group.accordion-group-expand-inset>ion-accordion:last-of-type{border-bottom-left-radius:8px;border-bottom-right-radius:8px}ion-accordion-group>ion-accordion:last-of-type ion-item[slot=header]{--border-width: 0px}ion-accordion.accordion-animated>[slot=header] .ion-accordion-toggle-icon{transition:300ms transform cubic-bezier(0.25, 0.8, 0.5, 1)}@media(prefers-reduced-motion: reduce){ion-accordion .ion-accordion-toggle-icon{transition:none !important}}ion-accordion.accordion-expanding>[slot=header] .ion-accordion-toggle-icon,ion-accordion.accordion-expanded>[slot=header] .ion-accordion-toggle-icon{transform:rotate(180deg)}ion-accordion-group.accordion-group-expand-inset.md>ion-accordion.accordion-previous ion-item[slot=header]{--border-width: 0px;--inner-border-width: 0px}ion-accordion-group.accordion-group-expand-inset.md>ion-accordion.accordion-expanding:first-of-type,ion-accordion-group.accordion-group-expand-inset.md>ion-accordion.accordion-expanded:first-of-type{margin-top:0}ion-input input::-webkit-date-and-time-value{text-align:start}.ion-datetime-button-overlay{--width: fit-content;--height: fit-content}.ion-datetime-button-overlay ion-datetime.datetime-grid{width:320px;min-height:320px}[ion-last-focus],header[tabindex="-1"]:focus,[role=banner][tabindex="-1"]:focus,main[tabindex="-1"]:focus,[role=main][tabindex="-1"]:focus,h1[tabindex="-1"]:focus,[role=heading][aria-level="1"][tabindex="-1"]:focus{outline:none}.popover-viewport:has(>ion-content){overflow:hidden}@supports not selector(:has(> ion-content)){.popover-viewport{overflow:hidden}}/*# sourceMappingURL=core.css.map */
|