@ionic/core 8.7.17-dev.11769813102.16c5bfac → 8.7.17-dev.11770319814.172b4f50

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.
Files changed (41) hide show
  1. package/components/ion-range.js +39 -81
  2. package/components/ion-refresher.js +32 -3
  3. package/components/ion-select.js +3 -2
  4. package/components/select-modal.js +6 -1
  5. package/dist/cjs/ion-range.cjs.entry.js +38 -79
  6. package/dist/cjs/ion-refresher_2.cjs.entry.js +32 -3
  7. package/dist/cjs/ion-select-modal.cjs.entry.js +5 -1
  8. package/dist/cjs/ion-select_3.cjs.entry.js +3 -2
  9. package/dist/cjs/ionic.cjs.js +1 -1
  10. package/dist/cjs/loader.cjs.js +1 -1
  11. package/dist/collection/components/range/range.js +42 -99
  12. package/dist/collection/components/refresher/refresher.js +70 -4
  13. package/dist/collection/components/select/select.js +3 -2
  14. package/dist/collection/components/select-modal/select-modal.js +25 -1
  15. package/dist/docs.json +83 -129
  16. package/dist/esm/ion-range.entry.js +38 -79
  17. package/dist/esm/ion-refresher_2.entry.js +32 -3
  18. package/dist/esm/ion-select-modal.entry.js +5 -1
  19. package/dist/esm/ion-select_3.entry.js +3 -2
  20. package/dist/esm/ionic.js +1 -1
  21. package/dist/esm/loader.js +1 -1
  22. package/dist/html.html-data.json +5 -1
  23. package/dist/ionic/ionic.esm.js +1 -1
  24. package/dist/ionic/p-012212e4.entry.js +4 -0
  25. package/dist/ionic/p-88367362.entry.js +4 -0
  26. package/dist/ionic/p-90f2d3ff.entry.js +4 -0
  27. package/dist/ionic/p-d2489bf2.entry.js +4 -0
  28. package/dist/types/components/range/range-interface.d.ts +0 -1
  29. package/dist/types/components/range/range.d.ts +4 -20
  30. package/dist/types/components/refresher/refresher-interface.d.ts +7 -0
  31. package/dist/types/components/refresher/refresher.d.ts +16 -3
  32. package/dist/types/components/select-modal/select-modal.d.ts +4 -0
  33. package/dist/types/components.d.ts +26 -5
  34. package/dist/types/interface.d.ts +1 -1
  35. package/hydrate/index.js +83 -105
  36. package/hydrate/index.mjs +83 -105
  37. package/package.json +1 -1
  38. package/dist/ionic/p-02d76786.entry.js +0 -4
  39. package/dist/ionic/p-639dd543.entry.js +0 -4
  40. package/dist/ionic/p-73ecefff.entry.js +0 -4
  41. package/dist/ionic/p-eb024a5b.entry.js +0 -4
@@ -79,7 +79,6 @@ const Range = /*@__PURE__*/ proxyCustomElement(class Range extends HTMLElement {
79
79
  this.inheritedAttributes = {};
80
80
  this.contentEl = null;
81
81
  this.initialContentScrollY = true;
82
- this.focusFromPointer = false;
83
82
  this.ratioA = 0;
84
83
  this.ratioB = 0;
85
84
  /**
@@ -211,7 +210,6 @@ const Range = /*@__PURE__*/ proxyCustomElement(class Range extends HTMLElement {
211
210
  this.onBlur = () => {
212
211
  if (this.hasFocus) {
213
212
  this.hasFocus = false;
214
- this.focusedKnob = undefined;
215
213
  this.ionBlur.emit();
216
214
  }
217
215
  };
@@ -222,20 +220,21 @@ const Range = /*@__PURE__*/ proxyCustomElement(class Range extends HTMLElement {
222
220
  }
223
221
  };
224
222
  this.onKnobFocus = (knob) => {
225
- // Clicking focuses the range which is needed for the keyboard,
226
- // but we only want to add the ion-focused class when focused via Tab.
227
- if (!this.focusFromPointer) {
228
- this.focusedKnob = knob;
229
- }
230
- else {
231
- this.focusFromPointer = false;
232
- this.focusedKnob = undefined;
233
- }
234
- // If the knob was not already focused, emit the focus event
235
223
  if (!this.hasFocus) {
236
224
  this.hasFocus = true;
237
225
  this.ionFocus.emit();
238
226
  }
227
+ // Manually manage ion-focused class for dual knobs
228
+ if (this.dualKnobs && this.el.shadowRoot) {
229
+ const knobA = this.el.shadowRoot.querySelector('.range-knob-a');
230
+ const knobB = this.el.shadowRoot.querySelector('.range-knob-b');
231
+ // Remove ion-focused from both knobs first
232
+ knobA === null || knobA === void 0 ? void 0 : knobA.classList.remove('ion-focused');
233
+ knobB === null || knobB === void 0 ? void 0 : knobB.classList.remove('ion-focused');
234
+ // Add ion-focused only to the focused knob
235
+ const focusedKnobEl = knob === 'A' ? knobA : knobB;
236
+ focusedKnobEl === null || focusedKnobEl === void 0 ? void 0 : focusedKnobEl.classList.add('ion-focused');
237
+ }
239
238
  };
240
239
  this.onKnobBlur = () => {
241
240
  // Check if focus is moving to another knob within the same range
@@ -247,9 +246,15 @@ const Range = /*@__PURE__*/ proxyCustomElement(class Range extends HTMLElement {
247
246
  if (!isStillFocusedOnKnob) {
248
247
  if (this.hasFocus) {
249
248
  this.hasFocus = false;
250
- this.focusedKnob = undefined;
251
249
  this.ionBlur.emit();
252
250
  }
251
+ // Remove ion-focused from both knobs when focus leaves the range
252
+ if (this.dualKnobs && this.el.shadowRoot) {
253
+ const knobA = this.el.shadowRoot.querySelector('.range-knob-a');
254
+ const knobB = this.el.shadowRoot.querySelector('.range-knob-b');
255
+ knobA === null || knobA === void 0 ? void 0 : knobA.classList.remove('ion-focused');
256
+ knobB === null || knobB === void 0 ? void 0 : knobB.classList.remove('ion-focused');
257
+ }
253
258
  }
254
259
  }, 0);
255
260
  };
@@ -506,6 +511,7 @@ const Range = /*@__PURE__*/ proxyCustomElement(class Range extends HTMLElement {
506
511
  ratio = 1 - ratio;
507
512
  }
508
513
  this.pressedKnob = !this.dualKnobs || Math.abs(this.ratioA - ratio) < Math.abs(this.ratioB - ratio) ? 'A' : 'B';
514
+ this.setFocus(this.pressedKnob);
509
515
  }
510
516
  get valA() {
511
517
  return ratioToValue(this.ratioA, this.min, this.max, this.step);
@@ -532,23 +538,9 @@ const Range = /*@__PURE__*/ proxyCustomElement(class Range extends HTMLElement {
532
538
  updateRatio() {
533
539
  const value = this.getValue();
534
540
  const { min, max } = this;
535
- /**
536
- * For dual knobs, value gives lower/upper but not which is A vs B.
537
- * Assign (lowerRatio, upperRatio) to (ratioA, ratioB) in the way that
538
- * minimizes change from the current ratios so the knobs don't swap.
539
- */
540
541
  if (this.dualKnobs) {
541
- const lowerRatio = valueToRatio(value.lower, min, max);
542
- const upperRatio = valueToRatio(value.upper, min, max);
543
- if (Math.abs(this.ratioA - lowerRatio) + Math.abs(this.ratioB - upperRatio) <=
544
- Math.abs(this.ratioA - upperRatio) + Math.abs(this.ratioB - lowerRatio)) {
545
- this.ratioA = lowerRatio;
546
- this.ratioB = upperRatio;
547
- }
548
- else {
549
- this.ratioA = upperRatio;
550
- this.ratioB = lowerRatio;
551
- }
542
+ this.ratioA = valueToRatio(value.lower, min, max);
543
+ this.ratioB = valueToRatio(value.upper, min, max);
552
544
  }
553
545
  else {
554
546
  this.ratioA = valueToRatio(value, min, max);
@@ -565,6 +557,14 @@ const Range = /*@__PURE__*/ proxyCustomElement(class Range extends HTMLElement {
565
557
  };
566
558
  this.noUpdate = false;
567
559
  }
560
+ setFocus(knob) {
561
+ if (this.el.shadowRoot) {
562
+ const knobEl = this.el.shadowRoot.querySelector(knob === 'A' ? '.range-knob-a' : '.range-knob-b');
563
+ if (knobEl) {
564
+ knobEl.focus();
565
+ }
566
+ }
567
+ }
568
568
  /**
569
569
  * Returns true if content was passed to the "start" slot
570
570
  */
@@ -582,7 +582,7 @@ const Range = /*@__PURE__*/ proxyCustomElement(class Range extends HTMLElement {
582
582
  }
583
583
  renderRangeSlider() {
584
584
  var _a;
585
- const { min, max, step, handleKeyboard, focusedKnob, pressedKnob, disabled, pin, ratioLower, ratioUpper, pinFormatter, inheritedAttributes, } = this;
585
+ const { min, max, step, handleKeyboard, pressedKnob, disabled, pin, ratioLower, ratioUpper, pinFormatter, inheritedAttributes, } = this;
586
586
  let barStart = `${ratioLower * 100}%`;
587
587
  let barEnd = `${100 - ratioUpper * 100}%`;
588
588
  const rtl = isRTL(this.el);
@@ -642,9 +642,7 @@ const Range = /*@__PURE__*/ proxyCustomElement(class Range extends HTMLElement {
642
642
  ticks.push(tick);
643
643
  }
644
644
  }
645
- return (h("div", { class: "range-slider", ref: (rangeEl) => (this.rangeSlider = rangeEl), onPointerDown: () => {
646
- this.focusFromPointer = true;
647
- },
645
+ return (h("div", { class: "range-slider", ref: (rangeEl) => (this.rangeSlider = rangeEl),
648
646
  /**
649
647
  * Since the gesture has a threshold, the value
650
648
  * won't change until the user has dragged past
@@ -657,7 +655,6 @@ const Range = /*@__PURE__*/ proxyCustomElement(class Range extends HTMLElement {
657
655
  * we need to listen for the "pointerUp" event.
658
656
  */
659
657
  onPointerUp: (ev) => {
660
- this.focusFromPointer = false;
661
658
  /**
662
659
  * If the user drags the knob on the web
663
660
  * version (does not occur on mobile),
@@ -683,10 +680,7 @@ const Range = /*@__PURE__*/ proxyCustomElement(class Range extends HTMLElement {
683
680
  'has-ticks': ticks.length > 0,
684
681
  }, role: "presentation", style: barStyle, part: "bar-active" })), renderKnob(rtl, {
685
682
  knob: 'A',
686
- position: this.dualKnobs ? (this.ratioA <= this.ratioB ? 'lower' : 'upper') : 'lower',
687
- dualKnobs: this.dualKnobs,
688
683
  pressed: pressedKnob === 'A',
689
- focused: focusedKnob === 'A',
690
684
  value: this.valA,
691
685
  ratio: this.ratioA,
692
686
  pin,
@@ -701,10 +695,7 @@ const Range = /*@__PURE__*/ proxyCustomElement(class Range extends HTMLElement {
701
695
  }), this.dualKnobs &&
702
696
  renderKnob(rtl, {
703
697
  knob: 'B',
704
- position: this.ratioB <= this.ratioA ? 'lower' : 'upper',
705
- dualKnobs: this.dualKnobs,
706
698
  pressed: pressedKnob === 'B',
707
- focused: focusedKnob === 'B',
708
699
  value: this.valB,
709
700
  ratio: this.ratioB,
710
701
  pin,
@@ -741,11 +732,10 @@ const Range = /*@__PURE__*/ proxyCustomElement(class Range extends HTMLElement {
741
732
  const valueAtMin = dualKnobs ? this.valA === min || this.valB === min : this.valA === min;
742
733
  const valueAtMax = dualKnobs ? this.valA === max || this.valB === max : this.valA === max;
743
734
  renderHiddenInput(true, el, this.name, JSON.stringify(this.getValue()), disabled);
744
- return (h(Host, { key: '6f3ac66d528c499f840afd31fa3958f2749c9ff5', onFocusin: this.onFocus, onFocusout: this.onBlur, id: rangeId, class: createColorClasses(this.color, {
735
+ return (h(Host, { key: 'ed646a42d51b8fe22012198c354cbcf5a389c108', onFocusin: this.onFocus, onFocusout: this.onBlur, id: rangeId, class: createColorClasses(this.color, {
745
736
  [mode]: true,
746
737
  'in-item': inItem,
747
738
  'range-disabled': disabled,
748
- 'range-dual-knobs': dualKnobs,
749
739
  'range-pressed': pressedKnob !== undefined,
750
740
  'range-has-pin': pin,
751
741
  [`range-label-placement-${labelPlacement}`]: true,
@@ -753,10 +743,10 @@ const Range = /*@__PURE__*/ proxyCustomElement(class Range extends HTMLElement {
753
743
  'range-item-end-adjustment': needsEndAdjustment,
754
744
  'range-value-min': valueAtMin,
755
745
  'range-value-max': valueAtMax,
756
- }) }, h("label", { key: 'a33e928dc37228bd4e1c4d3f804a7bb49d484088', class: "range-wrapper", id: "range-label" }, h("div", { key: '5d4b885fd1a87621734244701838f86d5145b914', class: {
746
+ }) }, h("label", { key: '3083e4f2a624e3b268396acb4415f7c6ac44d851', class: "range-wrapper", id: "range-label" }, h("div", { key: '47b92f94d2a0381dd7c5cd3dda54ed2942096715', class: {
757
747
  'label-text-wrapper': true,
758
748
  'label-text-wrapper-hidden': !hasLabel,
759
- }, part: "label" }, label !== undefined ? h("div", { class: "label-text" }, label) : h("slot", { name: "label" })), h("div", { key: '335a10bdb191a179c426ecba3541adada6d6aeb8', class: "native-wrapper" }, h("slot", { key: '57dc846d33d0e1b1f4f18fc8553dc7fa2cca70bf', name: "start" }), this.renderRangeSlider(), h("slot", { key: '57f85044b4f507015d905a73dca9d13a224560b1', name: "end" })))));
749
+ }, part: "label" }, label !== undefined ? h("div", { class: "label-text" }, label) : h("slot", { name: "label" })), h("div", { key: '5341da8d19eb29091df680978a0e20cc8f2eec65', class: "native-wrapper" }, h("slot", { key: '09f1437078032676695442d8c827a16faa7dffe2', name: "start" }), this.renderRangeSlider(), h("slot", { key: '02b7781970ea4d44f10b5f4627a2ca36eca45f85', name: "end" })))));
760
750
  }
761
751
  get el() { return this; }
762
752
  static get watchers() { return {
@@ -791,8 +781,7 @@ const Range = /*@__PURE__*/ proxyCustomElement(class Range extends HTMLElement {
791
781
  "labelPlacement": [1, "label-placement"],
792
782
  "ratioA": [32],
793
783
  "ratioB": [32],
794
- "pressedKnob": [32],
795
- "focusedKnob": [32]
784
+ "pressedKnob": [32]
796
785
  }, undefined, {
797
786
  "debounce": ["debounceChanged"],
798
787
  "min": ["minChanged"],
@@ -802,7 +791,7 @@ const Range = /*@__PURE__*/ proxyCustomElement(class Range extends HTMLElement {
802
791
  "disabled": ["disabledChanged"],
803
792
  "value": ["valueChanged"]
804
793
  }]);
805
- const renderKnob = (rtl, { knob, position, dualKnobs, value, ratio, min, max, disabled, pressed, focused, pin, handleKeyboard, pinFormatter, inheritedAttributes, onKnobFocus, onKnobBlur, }) => {
794
+ const renderKnob = (rtl, { knob, value, ratio, min, max, disabled, pressed, pin, handleKeyboard, pinFormatter, inheritedAttributes, onKnobFocus, onKnobBlur, }) => {
806
795
  const start = rtl ? 'right' : 'left';
807
796
  const knobStyle = () => {
808
797
  const style = {};
@@ -825,45 +814,14 @@ const renderKnob = (rtl, { knob, position, dualKnobs, value, ratio, min, max, di
825
814
  }
826
815
  }, onFocus: () => onKnobFocus(knob), onBlur: onKnobBlur, class: {
827
816
  'range-knob-handle': true,
828
- 'range-knob-handle-a': knob === 'A',
829
- 'range-knob-handle-b': knob === 'B',
817
+ 'range-knob-a': knob === 'A',
818
+ 'range-knob-b': knob === 'B',
830
819
  'range-knob-pressed': pressed,
831
820
  'range-knob-min': value === min,
832
821
  'range-knob-max': value === max,
833
822
  'ion-activatable': true,
834
823
  'ion-focusable': true,
835
- 'ion-focused': focused,
836
- }, part: [
837
- 'knob-handle',
838
- dualKnobs && knob === 'A' && 'knob-handle-a',
839
- dualKnobs && knob === 'B' && 'knob-handle-b',
840
- dualKnobs && position === 'lower' && 'knob-handle-lower',
841
- dualKnobs && position === 'upper' && 'knob-handle-upper',
842
- pressed && 'pressed',
843
- focused && 'focused',
844
- ]
845
- .filter(Boolean)
846
- .join(' '), style: knobStyle(), role: "slider", tabindex: disabled ? -1 : 0, "aria-label": ariaLabel !== undefined ? ariaLabel : null, "aria-labelledby": ariaLabel === undefined ? 'range-label' : null, "aria-valuemin": min, "aria-valuemax": max, "aria-disabled": disabled ? 'true' : null, "aria-valuenow": value }, pin && (h("div", { class: "range-pin", role: "presentation", part: [
847
- 'pin',
848
- dualKnobs && knob === 'A' && 'pin-a',
849
- dualKnobs && knob === 'B' && 'pin-b',
850
- dualKnobs && position === 'lower' && 'pin-lower',
851
- dualKnobs && position === 'upper' && 'pin-upper',
852
- pressed && 'pressed',
853
- focused && 'focused',
854
- ]
855
- .filter(Boolean)
856
- .join(' ') }, pinFormatter(value))), h("div", { class: "range-knob", role: "presentation", part: [
857
- 'knob',
858
- dualKnobs && knob === 'A' && 'knob-a',
859
- dualKnobs && knob === 'B' && 'knob-b',
860
- dualKnobs && position === 'lower' && 'knob-lower',
861
- dualKnobs && position === 'upper' && 'knob-upper',
862
- pressed && 'pressed',
863
- focused && 'focused',
864
- ]
865
- .filter(Boolean)
866
- .join(' ') })));
824
+ }, style: knobStyle(), role: "slider", tabindex: disabled ? -1 : 0, "aria-label": ariaLabel !== undefined ? ariaLabel : null, "aria-labelledby": ariaLabel === undefined ? 'range-label' : null, "aria-valuemin": min, "aria-valuemax": max, "aria-disabled": disabled ? 'true' : null, "aria-valuenow": value }, pin && (h("div", { class: "range-pin", role: "presentation", part: "pin" }, pinFormatter(value))), h("div", { class: "range-knob", role: "presentation", part: "knob" })));
867
825
  };
868
826
  const ratioToValue = (ratio, min, max, step) => {
869
827
  let value = (max - min) * ratio;
@@ -23,6 +23,8 @@ const Refresher = /*@__PURE__*/ proxyCustomElement(class Refresher extends HTMLE
23
23
  this.ionRefresh = createEvent(this, "ionRefresh", 7);
24
24
  this.ionPull = createEvent(this, "ionPull", 7);
25
25
  this.ionStart = createEvent(this, "ionStart", 7);
26
+ this.ionPullStart = createEvent(this, "ionPullStart", 7);
27
+ this.ionPullEnd = createEvent(this, "ionPullEnd", 7);
26
28
  this.appliedStyles = false;
27
29
  this.didStart = false;
28
30
  this.progress = 0;
@@ -77,8 +79,8 @@ const Refresher = /*@__PURE__*/ proxyCustomElement(class Refresher extends HTMLE
77
79
  * than `1`. The default value is `1` which is equal to the speed of the cursor.
78
80
  * If a negative value is passed in, the factor will be `1` instead.
79
81
  *
80
- * For example: If the value passed is `1.2` and the content is dragged by
81
- * `10` pixels, instead of `10` pixels the content will be pulled by `12` pixels
82
+ * For example, If the value passed is `1.2` and the content is dragged by
83
+ * `10` pixels, instead of `10` pixels, the content will be pulled by `12` pixels
82
84
  * (an increase of 20 percent). If the value passed is `0.8`, the dragged amount
83
85
  * will be `8` pixels, less than the amount the cursor has moved.
84
86
  *
@@ -128,6 +130,9 @@ const Refresher = /*@__PURE__*/ proxyCustomElement(class Refresher extends HTMLE
128
130
  this.animations = [];
129
131
  this.progress = 0;
130
132
  this.state = 1 /* RefresherState.Inactive */;
133
+ this.ionPullEnd.emit({
134
+ reason: state === 32 /* RefresherState.Completing */ ? 'complete' : 'cancel',
135
+ });
131
136
  }
132
137
  async setupiOSNativeRefresher(pullingSpinner, refreshingSpinner) {
133
138
  this.elementToTransform = this.scrollEl;
@@ -160,6 +165,7 @@ const Refresher = /*@__PURE__*/ proxyCustomElement(class Refresher extends HTMLE
160
165
  if (!this.didStart) {
161
166
  this.didStart = true;
162
167
  this.ionStart.emit();
168
+ this.ionPullStart.emit();
163
169
  }
164
170
  // emit "pulling" on every move
165
171
  if (this.pointerDown) {
@@ -235,6 +241,7 @@ const Refresher = /*@__PURE__*/ proxyCustomElement(class Refresher extends HTMLE
235
241
  this.lastVelocityY = ev.velocityY;
236
242
  },
237
243
  onEnd: () => {
244
+ const hadStarted = this.didStart;
238
245
  this.pointerDown = false;
239
246
  this.didStart = false;
240
247
  if (this.needsCompletion) {
@@ -244,6 +251,13 @@ const Refresher = /*@__PURE__*/ proxyCustomElement(class Refresher extends HTMLE
244
251
  else if (this.didRefresh) {
245
252
  readTask(() => translateElement(this.elementToTransform, `${this.el.clientHeight}px`));
246
253
  }
254
+ else if (hadStarted) {
255
+ /**
256
+ * User started pulling but released before reaching the refresh threshold.
257
+ * Emit ionPullEnd to complete the event pair.
258
+ */
259
+ this.ionPullEnd.emit({ reason: 'cancel' });
260
+ }
247
261
  },
248
262
  });
249
263
  this.disabledChanged();
@@ -290,6 +304,7 @@ const Refresher = /*@__PURE__*/ proxyCustomElement(class Refresher extends HTMLE
290
304
  ev.data.animation = animation;
291
305
  animation.progressStart(false, 0);
292
306
  this.ionStart.emit();
307
+ this.ionPullStart.emit();
293
308
  this.animations.push(animation);
294
309
  return;
295
310
  }
@@ -312,6 +327,7 @@ const Refresher = /*@__PURE__*/ proxyCustomElement(class Refresher extends HTMLE
312
327
  this.animations = [];
313
328
  this.gesture.enable(true);
314
329
  this.state = 1 /* RefresherState.Inactive */;
330
+ this.ionPullEnd.emit({ reason: 'cancel' });
315
331
  });
316
332
  return;
317
333
  }
@@ -556,6 +572,7 @@ const Refresher = /*@__PURE__*/ proxyCustomElement(class Refresher extends HTMLE
556
572
  if (!this.didStart) {
557
573
  this.didStart = true;
558
574
  this.ionStart.emit();
575
+ this.ionPullStart.emit();
559
576
  }
560
577
  // emit "pulling" on every move
561
578
  this.ionPull.emit();
@@ -599,6 +616,15 @@ const Refresher = /*@__PURE__*/ proxyCustomElement(class Refresher extends HTMLE
599
616
  * available right away.
600
617
  */
601
618
  this.restoreOverflowStyle();
619
+ /**
620
+ * If ionPullStart was emitted, we need to emit ionPullEnd
621
+ * even though the gesture was aborted before reaching the
622
+ * pulling threshold.
623
+ */
624
+ if (this.didStart) {
625
+ this.didStart = false;
626
+ this.ionPullEnd.emit({ reason: 'cancel' });
627
+ }
602
628
  }
603
629
  }
604
630
  beginRefresh() {
@@ -645,6 +671,9 @@ const Refresher = /*@__PURE__*/ proxyCustomElement(class Refresher extends HTMLE
645
671
  if (this.contentFullscreen && this.backgroundContentEl) {
646
672
  (_a = this.backgroundContentEl) === null || _a === void 0 ? void 0 : _a.style.removeProperty('--offset-top');
647
673
  }
674
+ this.ionPullEnd.emit({
675
+ reason: state === 32 /* RefresherState.Completing */ ? 'complete' : 'cancel',
676
+ });
648
677
  }, 600);
649
678
  // reset the styles on the scroll element
650
679
  // set that the refresh is actively cancelling/completing
@@ -698,7 +727,7 @@ const Refresher = /*@__PURE__*/ proxyCustomElement(class Refresher extends HTMLE
698
727
  }
699
728
  render() {
700
729
  const mode = getIonMode(this);
701
- return (h(Host, { key: '2d1bd880877b698604542ab2d602d38b9504d975', slot: "fixed", class: {
730
+ return (h(Host, { key: 'bed0c2f44c32ecac24b7d8326ac7c7ef1d12c44f', slot: "fixed", class: {
702
731
  [mode]: true,
703
732
  // Used internally for styling
704
733
  [`refresher-${mode}`]: true,
@@ -560,6 +560,7 @@ const Select = /*@__PURE__*/ proxyCustomElement(class Select extends HTMLElement
560
560
  const mode = getIonMode(this);
561
561
  const modalOpts = Object.assign(Object.assign({}, interfaceOptions), { mode, cssClass: ['select-modal', interfaceOptions.cssClass], component: 'ion-select-modal', componentProps: {
562
562
  header: interfaceOptions.header,
563
+ cancelText: this.cancelText,
563
564
  multiple,
564
565
  value,
565
566
  options: this.createOverlaySelectOptions(this.childOpts, value),
@@ -809,7 +810,7 @@ const Select = /*@__PURE__*/ proxyCustomElement(class Select extends HTMLElement
809
810
  * TODO(FW-5592): Remove hasStartEndSlots condition
810
811
  */
811
812
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || isExpanded || hasStartEndSlots));
812
- return (h(Host, { key: 'd8026835993d0e6dce747098f741a06ae4e4f54d', onClick: this.onClick, class: createColorClasses(this.color, {
813
+ return (h(Host, { key: 'b7fa907f8fbc54fd63e2d07a9bb5156d94fd5057', onClick: this.onClick, class: createColorClasses(this.color, {
813
814
  [mode]: true,
814
815
  'in-item': inItem,
815
816
  'in-item-color': hostContext('ion-item.ion-color', el),
@@ -827,7 +828,7 @@ const Select = /*@__PURE__*/ proxyCustomElement(class Select extends HTMLElement
827
828
  [`select-justify-${justify}`]: justifyEnabled,
828
829
  [`select-shape-${shape}`]: shape !== undefined,
829
830
  [`select-label-placement-${labelPlacement}`]: true,
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()));
831
+ }) }, h("label", { key: '11137e6a8b0374e93923ddb5a4629972ded5f43c', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick }, this.renderLabelContainer(), h("div", { key: '99e3c09b5e6c2e7be493ed5834f991fffe45cfff', class: "select-wrapper-inner" }, h("slot", { key: '740f0e5a913cb0209d5acae31c33a6ed8f672dfc', name: "start" }), h("div", { key: 'b20e33c8b60915a5194948fcf8e22d7789f0b050', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), h("slot", { key: '0199f338185d5fa2cdd977bb20516746bd9ddad5', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && h("div", { key: '3b54de893cc8fc66df8588cee22e30d6f10850b3', class: "select-highlight" })), this.renderBottomContent()));
831
832
  }
832
833
  get el() { return this; }
833
834
  static get watchers() { return {
@@ -31,6 +31,10 @@ const SelectModal = /*@__PURE__*/ proxyCustomElement(class SelectModal extends H
31
31
  if (registerHost !== false) {
32
32
  this.__registerHost();
33
33
  }
34
+ /**
35
+ * The text to display on the cancel button.
36
+ */
37
+ this.cancelText = 'Close';
34
38
  this.options = [];
35
39
  }
36
40
  closeModal() {
@@ -99,7 +103,7 @@ const SelectModal = /*@__PURE__*/ proxyCustomElement(class SelectModal extends H
99
103
  } }, option.text))));
100
104
  }
101
105
  render() {
102
- return (h(Host, { key: 'b6c0dec240b2e41985b15fdf4e5a6d3a145c1567', class: getIonMode(this) }, h("ion-header", { key: 'cd177e85ee0f62a60a3a708342d6ab6eb19a44dc' }, h("ion-toolbar", { key: 'aee8222a5a4daa540ad202b2e4cac1ef93d9558c' }, this.header !== undefined && h("ion-title", { key: '5f8fecc764d97bf840d3d4cfddeeccd118ab4436' }, this.header), h("ion-buttons", { key: '919033950d7c2b0101f96a9c9698219de9f568ea', slot: "end" }, h("ion-button", { key: '34b571cab6dced4bde555a077a21e91800829931', onClick: () => this.closeModal() }, "Close")))), h("ion-content", { key: '3c9153d26ba7a5a03d3b20fcd628d0c3031661a7' }, h("ion-list", { key: 'e00b222c071bc97c82ad1bba4db95a8a5c43ed6d' }, this.multiple === true ? this.renderCheckboxOptions() : this.renderRadioOptions()))));
106
+ return (h(Host, { key: '59ba79ffdbb69befe8e13745450c1071a1fe8c6c', class: getIonMode(this) }, h("ion-header", { key: 'fa4d08ee43eec4b9add09d9ffabcba9ed13dd4af' }, h("ion-toolbar", { key: 'b5e26cf092297c51c1dba3ce7963e7b03420393b' }, this.header !== undefined && h("ion-title", { key: 'a8a93cdea4d119d3a17d8cef3878b8a1daa86e26' }, this.header), h("ion-buttons", { key: 'bbc656713b41ef09099ed466f93a9cfbdaceecc1', slot: "end" }, h("ion-button", { key: '80b8751fe4c96e06b620a0b9d17b2d9b3da2faa5', onClick: () => this.closeModal() }, this.cancelText)))), h("ion-content", { key: 'a251fc00ae4cc7e6b3abe13caa10d95bb515558e' }, h("ion-list", { key: 'bcaf38d6d91accfabb4a9d26783bc0e4801abe3c' }, this.multiple === true ? this.renderCheckboxOptions() : this.renderRadioOptions()))));
103
107
  }
104
108
  get el() { return this; }
105
109
  static get style() { return {
@@ -109,6 +113,7 @@ const SelectModal = /*@__PURE__*/ proxyCustomElement(class SelectModal extends H
109
113
  }; }
110
114
  }, [290, "ion-select-modal", {
111
115
  "header": [1],
116
+ "cancelText": [1, "cancel-text"],
112
117
  "multiple": [4],
113
118
  "options": [16]
114
119
  }]);