@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
package/hydrate/index.js CHANGED
@@ -28717,28 +28717,13 @@ const rangeMdCss = ":host{--knob-handle-size:calc(var(--knob-size) * 2);display:
28717
28717
  * @slot start - Content is placed to the left of the range slider in LTR, and to the right in RTL.
28718
28718
  * @slot end - Content is placed to the right of the range slider in LTR, and to the left in RTL.
28719
28719
  *
28720
- * @part label - The label text describing the range.
28721
28720
  * @part tick - An inactive tick mark.
28722
28721
  * @part tick-active - An active tick mark.
28722
+ * @part pin - The counter that appears above a knob.
28723
+ * @part knob - The handle that is used to drag the range.
28723
28724
  * @part bar - The inactive part of the bar.
28724
28725
  * @part bar-active - The active part of the bar.
28725
- * @part knob-handle - The container element that wraps the knob and handles drag interactions.
28726
- * @part knob-handle-a - The container element for the first knob. Only available when `dualKnobs` is `true`.
28727
- * @part knob-handle-b - The container element for the second knob. Only available when `dualKnobs` is `true`.
28728
- * @part knob-handle-lower - The container element for the lower knob. Only available when `dualKnobs` is `true`.
28729
- * @part knob-handle-upper - The container element for the upper knob. Only available when `dualKnobs` is `true`.
28730
- * @part pin - The counter that appears above a knob.
28731
- * @part pin-a - The counter that appears above the first knob. Only available when `dualKnobs` is `true`.
28732
- * @part pin-b - The counter that appears above the second knob. Only available when `dualKnobs` is `true`.
28733
- * @part pin-lower - The counter that appears above the lower knob. Only available when `dualKnobs` is `true`.
28734
- * @part pin-upper - The counter that appears above the upper knob. Only available when `dualKnobs` is `true`.
28735
- * @part knob - The visual knob element that appears on the range track.
28736
- * @part knob-a - The visual knob element for the first knob. Only available when `dualKnobs` is `true`.
28737
- * @part knob-b - The visual knob element for the second knob. Only available when `dualKnobs` is `true`.
28738
- * @part knob-lower - The visual knob element for the lower knob. Only available when `dualKnobs` is `true`.
28739
- * @part knob-upper - The visual knob element for the upper knob. Only available when `dualKnobs` is `true`.
28740
- * @part pressed - Added to the knob-handle, knob, and pin that is currently being pressed to drag. Only one set has this part at a time.
28741
- * @part focused - Added to the knob-handle, knob, and pin that currently has focus. Only one set has this part at a time.
28726
+ * @part label - The label text describing the range.
28742
28727
  */
28743
28728
  class Range {
28744
28729
  constructor(hostRef) {
@@ -28756,7 +28741,6 @@ class Range {
28756
28741
  this.inheritedAttributes = {};
28757
28742
  this.contentEl = null;
28758
28743
  this.initialContentScrollY = true;
28759
- this.focusFromPointer = false;
28760
28744
  this.ratioA = 0;
28761
28745
  this.ratioB = 0;
28762
28746
  /**
@@ -28888,7 +28872,6 @@ class Range {
28888
28872
  this.onBlur = () => {
28889
28873
  if (this.hasFocus) {
28890
28874
  this.hasFocus = false;
28891
- this.focusedKnob = undefined;
28892
28875
  this.ionBlur.emit();
28893
28876
  }
28894
28877
  };
@@ -28899,20 +28882,21 @@ class Range {
28899
28882
  }
28900
28883
  };
28901
28884
  this.onKnobFocus = (knob) => {
28902
- // Clicking focuses the range which is needed for the keyboard,
28903
- // but we only want to add the ion-focused class when focused via Tab.
28904
- if (!this.focusFromPointer) {
28905
- this.focusedKnob = knob;
28906
- }
28907
- else {
28908
- this.focusFromPointer = false;
28909
- this.focusedKnob = undefined;
28910
- }
28911
- // If the knob was not already focused, emit the focus event
28912
28885
  if (!this.hasFocus) {
28913
28886
  this.hasFocus = true;
28914
28887
  this.ionFocus.emit();
28915
28888
  }
28889
+ // Manually manage ion-focused class for dual knobs
28890
+ if (this.dualKnobs && this.el.shadowRoot) {
28891
+ const knobA = this.el.shadowRoot.querySelector('.range-knob-a');
28892
+ const knobB = this.el.shadowRoot.querySelector('.range-knob-b');
28893
+ // Remove ion-focused from both knobs first
28894
+ knobA === null || knobA === void 0 ? void 0 : knobA.classList.remove('ion-focused');
28895
+ knobB === null || knobB === void 0 ? void 0 : knobB.classList.remove('ion-focused');
28896
+ // Add ion-focused only to the focused knob
28897
+ const focusedKnobEl = knob === 'A' ? knobA : knobB;
28898
+ focusedKnobEl === null || focusedKnobEl === void 0 ? void 0 : focusedKnobEl.classList.add('ion-focused');
28899
+ }
28916
28900
  };
28917
28901
  this.onKnobBlur = () => {
28918
28902
  // Check if focus is moving to another knob within the same range
@@ -28924,9 +28908,15 @@ class Range {
28924
28908
  if (!isStillFocusedOnKnob) {
28925
28909
  if (this.hasFocus) {
28926
28910
  this.hasFocus = false;
28927
- this.focusedKnob = undefined;
28928
28911
  this.ionBlur.emit();
28929
28912
  }
28913
+ // Remove ion-focused from both knobs when focus leaves the range
28914
+ if (this.dualKnobs && this.el.shadowRoot) {
28915
+ const knobA = this.el.shadowRoot.querySelector('.range-knob-a');
28916
+ const knobB = this.el.shadowRoot.querySelector('.range-knob-b');
28917
+ knobA === null || knobA === void 0 ? void 0 : knobA.classList.remove('ion-focused');
28918
+ knobB === null || knobB === void 0 ? void 0 : knobB.classList.remove('ion-focused');
28919
+ }
28930
28920
  }
28931
28921
  }, 0);
28932
28922
  };
@@ -29183,6 +29173,7 @@ class Range {
29183
29173
  ratio = 1 - ratio;
29184
29174
  }
29185
29175
  this.pressedKnob = !this.dualKnobs || Math.abs(this.ratioA - ratio) < Math.abs(this.ratioB - ratio) ? 'A' : 'B';
29176
+ this.setFocus(this.pressedKnob);
29186
29177
  }
29187
29178
  get valA() {
29188
29179
  return ratioToValue(this.ratioA, this.min, this.max, this.step);
@@ -29209,23 +29200,9 @@ class Range {
29209
29200
  updateRatio() {
29210
29201
  const value = this.getValue();
29211
29202
  const { min, max } = this;
29212
- /**
29213
- * For dual knobs, value gives lower/upper but not which is A vs B.
29214
- * Assign (lowerRatio, upperRatio) to (ratioA, ratioB) in the way that
29215
- * minimizes change from the current ratios so the knobs don't swap.
29216
- */
29217
29203
  if (this.dualKnobs) {
29218
- const lowerRatio = valueToRatio(value.lower, min, max);
29219
- const upperRatio = valueToRatio(value.upper, min, max);
29220
- if (Math.abs(this.ratioA - lowerRatio) + Math.abs(this.ratioB - upperRatio) <=
29221
- Math.abs(this.ratioA - upperRatio) + Math.abs(this.ratioB - lowerRatio)) {
29222
- this.ratioA = lowerRatio;
29223
- this.ratioB = upperRatio;
29224
- }
29225
- else {
29226
- this.ratioA = upperRatio;
29227
- this.ratioB = lowerRatio;
29228
- }
29204
+ this.ratioA = valueToRatio(value.lower, min, max);
29205
+ this.ratioB = valueToRatio(value.upper, min, max);
29229
29206
  }
29230
29207
  else {
29231
29208
  this.ratioA = valueToRatio(value, min, max);
@@ -29242,6 +29219,14 @@ class Range {
29242
29219
  };
29243
29220
  this.noUpdate = false;
29244
29221
  }
29222
+ setFocus(knob) {
29223
+ if (this.el.shadowRoot) {
29224
+ const knobEl = this.el.shadowRoot.querySelector(knob === 'A' ? '.range-knob-a' : '.range-knob-b');
29225
+ if (knobEl) {
29226
+ knobEl.focus();
29227
+ }
29228
+ }
29229
+ }
29245
29230
  /**
29246
29231
  * Returns true if content was passed to the "start" slot
29247
29232
  */
@@ -29259,7 +29244,7 @@ class Range {
29259
29244
  }
29260
29245
  renderRangeSlider() {
29261
29246
  var _a;
29262
- const { min, max, step, handleKeyboard, focusedKnob, pressedKnob, disabled, pin, ratioLower, ratioUpper, pinFormatter, inheritedAttributes, } = this;
29247
+ const { min, max, step, handleKeyboard, pressedKnob, disabled, pin, ratioLower, ratioUpper, pinFormatter, inheritedAttributes, } = this;
29263
29248
  let barStart = `${ratioLower * 100}%`;
29264
29249
  let barEnd = `${100 - ratioUpper * 100}%`;
29265
29250
  const rtl = isRTL$1(this.el);
@@ -29319,9 +29304,7 @@ class Range {
29319
29304
  ticks.push(tick);
29320
29305
  }
29321
29306
  }
29322
- return (hAsync("div", { class: "range-slider", ref: (rangeEl) => (this.rangeSlider = rangeEl), onPointerDown: () => {
29323
- this.focusFromPointer = true;
29324
- },
29307
+ return (hAsync("div", { class: "range-slider", ref: (rangeEl) => (this.rangeSlider = rangeEl),
29325
29308
  /**
29326
29309
  * Since the gesture has a threshold, the value
29327
29310
  * won't change until the user has dragged past
@@ -29334,7 +29317,6 @@ class Range {
29334
29317
  * we need to listen for the "pointerUp" event.
29335
29318
  */
29336
29319
  onPointerUp: (ev) => {
29337
- this.focusFromPointer = false;
29338
29320
  /**
29339
29321
  * If the user drags the knob on the web
29340
29322
  * version (does not occur on mobile),
@@ -29360,10 +29342,7 @@ class Range {
29360
29342
  'has-ticks': ticks.length > 0,
29361
29343
  }, role: "presentation", style: barStyle, part: "bar-active" })), renderKnob(rtl, {
29362
29344
  knob: 'A',
29363
- position: this.dualKnobs ? (this.ratioA <= this.ratioB ? 'lower' : 'upper') : 'lower',
29364
- dualKnobs: this.dualKnobs,
29365
29345
  pressed: pressedKnob === 'A',
29366
- focused: focusedKnob === 'A',
29367
29346
  value: this.valA,
29368
29347
  ratio: this.ratioA,
29369
29348
  pin,
@@ -29378,10 +29357,7 @@ class Range {
29378
29357
  }), this.dualKnobs &&
29379
29358
  renderKnob(rtl, {
29380
29359
  knob: 'B',
29381
- position: this.ratioB <= this.ratioA ? 'lower' : 'upper',
29382
- dualKnobs: this.dualKnobs,
29383
29360
  pressed: pressedKnob === 'B',
29384
- focused: focusedKnob === 'B',
29385
29361
  value: this.valB,
29386
29362
  ratio: this.ratioB,
29387
29363
  pin,
@@ -29418,11 +29394,10 @@ class Range {
29418
29394
  const valueAtMin = dualKnobs ? this.valA === min || this.valB === min : this.valA === min;
29419
29395
  const valueAtMax = dualKnobs ? this.valA === max || this.valB === max : this.valA === max;
29420
29396
  renderHiddenInput(true, el, this.name, JSON.stringify(this.getValue()), disabled);
29421
- return (hAsync(Host, { key: '6f3ac66d528c499f840afd31fa3958f2749c9ff5', onFocusin: this.onFocus, onFocusout: this.onBlur, id: rangeId, class: createColorClasses$1(this.color, {
29397
+ return (hAsync(Host, { key: 'ed646a42d51b8fe22012198c354cbcf5a389c108', onFocusin: this.onFocus, onFocusout: this.onBlur, id: rangeId, class: createColorClasses$1(this.color, {
29422
29398
  [mode]: true,
29423
29399
  'in-item': inItem,
29424
29400
  'range-disabled': disabled,
29425
- 'range-dual-knobs': dualKnobs,
29426
29401
  'range-pressed': pressedKnob !== undefined,
29427
29402
  'range-has-pin': pin,
29428
29403
  [`range-label-placement-${labelPlacement}`]: true,
@@ -29430,10 +29405,10 @@ class Range {
29430
29405
  'range-item-end-adjustment': needsEndAdjustment,
29431
29406
  'range-value-min': valueAtMin,
29432
29407
  'range-value-max': valueAtMax,
29433
- }) }, hAsync("label", { key: 'a33e928dc37228bd4e1c4d3f804a7bb49d484088', class: "range-wrapper", id: "range-label" }, hAsync("div", { key: '5d4b885fd1a87621734244701838f86d5145b914', class: {
29408
+ }) }, hAsync("label", { key: '3083e4f2a624e3b268396acb4415f7c6ac44d851', class: "range-wrapper", id: "range-label" }, hAsync("div", { key: '47b92f94d2a0381dd7c5cd3dda54ed2942096715', class: {
29434
29409
  'label-text-wrapper': true,
29435
29410
  'label-text-wrapper-hidden': !hasLabel,
29436
- }, part: "label" }, label !== undefined ? hAsync("div", { class: "label-text" }, label) : hAsync("slot", { name: "label" })), hAsync("div", { key: '335a10bdb191a179c426ecba3541adada6d6aeb8', class: "native-wrapper" }, hAsync("slot", { key: '57dc846d33d0e1b1f4f18fc8553dc7fa2cca70bf', name: "start" }), this.renderRangeSlider(), hAsync("slot", { key: '57f85044b4f507015d905a73dca9d13a224560b1', name: "end" })))));
29411
+ }, part: "label" }, label !== undefined ? hAsync("div", { class: "label-text" }, label) : hAsync("slot", { name: "label" })), hAsync("div", { key: '5341da8d19eb29091df680978a0e20cc8f2eec65', class: "native-wrapper" }, hAsync("slot", { key: '09f1437078032676695442d8c827a16faa7dffe2', name: "start" }), this.renderRangeSlider(), hAsync("slot", { key: '02b7781970ea4d44f10b5f4627a2ca36eca45f85', name: "end" })))));
29437
29412
  }
29438
29413
  get el() { return getElement(this); }
29439
29414
  static get watchers() { return {
@@ -29471,15 +29446,14 @@ class Range {
29471
29446
  "labelPlacement": [1, "label-placement"],
29472
29447
  "ratioA": [32],
29473
29448
  "ratioB": [32],
29474
- "pressedKnob": [32],
29475
- "focusedKnob": [32]
29449
+ "pressedKnob": [32]
29476
29450
  },
29477
29451
  "$listeners$": undefined,
29478
29452
  "$lazyBundleId$": "-",
29479
29453
  "$attrsToReflect$": [["color", "color"]]
29480
29454
  }; }
29481
29455
  }
29482
- const renderKnob = (rtl, { knob, position, dualKnobs, value, ratio, min, max, disabled, pressed, focused, pin, handleKeyboard, pinFormatter, inheritedAttributes, onKnobFocus, onKnobBlur, }) => {
29456
+ const renderKnob = (rtl, { knob, value, ratio, min, max, disabled, pressed, pin, handleKeyboard, pinFormatter, inheritedAttributes, onKnobFocus, onKnobBlur, }) => {
29483
29457
  const start = rtl ? 'right' : 'left';
29484
29458
  const knobStyle = () => {
29485
29459
  const style = {};
@@ -29502,45 +29476,14 @@ const renderKnob = (rtl, { knob, position, dualKnobs, value, ratio, min, max, di
29502
29476
  }
29503
29477
  }, onFocus: () => onKnobFocus(knob), onBlur: onKnobBlur, class: {
29504
29478
  'range-knob-handle': true,
29505
- 'range-knob-handle-a': knob === 'A',
29506
- 'range-knob-handle-b': knob === 'B',
29479
+ 'range-knob-a': knob === 'A',
29480
+ 'range-knob-b': knob === 'B',
29507
29481
  'range-knob-pressed': pressed,
29508
29482
  'range-knob-min': value === min,
29509
29483
  'range-knob-max': value === max,
29510
29484
  'ion-activatable': true,
29511
29485
  'ion-focusable': true,
29512
- 'ion-focused': focused,
29513
- }, part: [
29514
- 'knob-handle',
29515
- dualKnobs && knob === 'A' && 'knob-handle-a',
29516
- dualKnobs && knob === 'B' && 'knob-handle-b',
29517
- dualKnobs && position === 'lower' && 'knob-handle-lower',
29518
- dualKnobs && position === 'upper' && 'knob-handle-upper',
29519
- pressed && 'pressed',
29520
- focused && 'focused',
29521
- ]
29522
- .filter(Boolean)
29523
- .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 && (hAsync("div", { class: "range-pin", role: "presentation", part: [
29524
- 'pin',
29525
- dualKnobs && knob === 'A' && 'pin-a',
29526
- dualKnobs && knob === 'B' && 'pin-b',
29527
- dualKnobs && position === 'lower' && 'pin-lower',
29528
- dualKnobs && position === 'upper' && 'pin-upper',
29529
- pressed && 'pressed',
29530
- focused && 'focused',
29531
- ]
29532
- .filter(Boolean)
29533
- .join(' ') }, pinFormatter(value))), hAsync("div", { class: "range-knob", role: "presentation", part: [
29534
- 'knob',
29535
- dualKnobs && knob === 'A' && 'knob-a',
29536
- dualKnobs && knob === 'B' && 'knob-b',
29537
- dualKnobs && position === 'lower' && 'knob-lower',
29538
- dualKnobs && position === 'upper' && 'knob-upper',
29539
- pressed && 'pressed',
29540
- focused && 'focused',
29541
- ]
29542
- .filter(Boolean)
29543
- .join(' ') })));
29486
+ }, 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 && (hAsync("div", { class: "range-pin", role: "presentation", part: "pin" }, pinFormatter(value))), hAsync("div", { class: "range-knob", role: "presentation", part: "knob" })));
29544
29487
  };
29545
29488
  const ratioToValue = (ratio, min, max, step) => {
29546
29489
  let value = (max - min) * ratio;
@@ -29757,6 +29700,8 @@ class Refresher {
29757
29700
  this.ionRefresh = createEvent(this, "ionRefresh", 7);
29758
29701
  this.ionPull = createEvent(this, "ionPull", 7);
29759
29702
  this.ionStart = createEvent(this, "ionStart", 7);
29703
+ this.ionPullStart = createEvent(this, "ionPullStart", 7);
29704
+ this.ionPullEnd = createEvent(this, "ionPullEnd", 7);
29760
29705
  this.appliedStyles = false;
29761
29706
  this.didStart = false;
29762
29707
  this.progress = 0;
@@ -29811,8 +29756,8 @@ class Refresher {
29811
29756
  * than `1`. The default value is `1` which is equal to the speed of the cursor.
29812
29757
  * If a negative value is passed in, the factor will be `1` instead.
29813
29758
  *
29814
- * For example: If the value passed is `1.2` and the content is dragged by
29815
- * `10` pixels, instead of `10` pixels the content will be pulled by `12` pixels
29759
+ * For example, If the value passed is `1.2` and the content is dragged by
29760
+ * `10` pixels, instead of `10` pixels, the content will be pulled by `12` pixels
29816
29761
  * (an increase of 20 percent). If the value passed is `0.8`, the dragged amount
29817
29762
  * will be `8` pixels, less than the amount the cursor has moved.
29818
29763
  *
@@ -29862,6 +29807,9 @@ class Refresher {
29862
29807
  this.animations = [];
29863
29808
  this.progress = 0;
29864
29809
  this.state = 1 /* RefresherState.Inactive */;
29810
+ this.ionPullEnd.emit({
29811
+ reason: state === 32 /* RefresherState.Completing */ ? 'complete' : 'cancel',
29812
+ });
29865
29813
  }
29866
29814
  async setupiOSNativeRefresher(pullingSpinner, refreshingSpinner) {
29867
29815
  this.elementToTransform = this.scrollEl;
@@ -29894,6 +29842,7 @@ class Refresher {
29894
29842
  if (!this.didStart) {
29895
29843
  this.didStart = true;
29896
29844
  this.ionStart.emit();
29845
+ this.ionPullStart.emit();
29897
29846
  }
29898
29847
  // emit "pulling" on every move
29899
29848
  if (this.pointerDown) {
@@ -29969,6 +29918,7 @@ class Refresher {
29969
29918
  this.lastVelocityY = ev.velocityY;
29970
29919
  },
29971
29920
  onEnd: () => {
29921
+ const hadStarted = this.didStart;
29972
29922
  this.pointerDown = false;
29973
29923
  this.didStart = false;
29974
29924
  if (this.needsCompletion) {
@@ -29978,6 +29928,13 @@ class Refresher {
29978
29928
  else if (this.didRefresh) {
29979
29929
  readTask(() => translateElement(this.elementToTransform, `${this.el.clientHeight}px`));
29980
29930
  }
29931
+ else if (hadStarted) {
29932
+ /**
29933
+ * User started pulling but released before reaching the refresh threshold.
29934
+ * Emit ionPullEnd to complete the event pair.
29935
+ */
29936
+ this.ionPullEnd.emit({ reason: 'cancel' });
29937
+ }
29981
29938
  },
29982
29939
  });
29983
29940
  this.disabledChanged();
@@ -30024,6 +29981,7 @@ class Refresher {
30024
29981
  ev.data.animation = animation;
30025
29982
  animation.progressStart(false, 0);
30026
29983
  this.ionStart.emit();
29984
+ this.ionPullStart.emit();
30027
29985
  this.animations.push(animation);
30028
29986
  return;
30029
29987
  }
@@ -30046,6 +30004,7 @@ class Refresher {
30046
30004
  this.animations = [];
30047
30005
  this.gesture.enable(true);
30048
30006
  this.state = 1 /* RefresherState.Inactive */;
30007
+ this.ionPullEnd.emit({ reason: 'cancel' });
30049
30008
  });
30050
30009
  return;
30051
30010
  }
@@ -30290,6 +30249,7 @@ class Refresher {
30290
30249
  if (!this.didStart) {
30291
30250
  this.didStart = true;
30292
30251
  this.ionStart.emit();
30252
+ this.ionPullStart.emit();
30293
30253
  }
30294
30254
  // emit "pulling" on every move
30295
30255
  this.ionPull.emit();
@@ -30333,6 +30293,15 @@ class Refresher {
30333
30293
  * available right away.
30334
30294
  */
30335
30295
  this.restoreOverflowStyle();
30296
+ /**
30297
+ * If ionPullStart was emitted, we need to emit ionPullEnd
30298
+ * even though the gesture was aborted before reaching the
30299
+ * pulling threshold.
30300
+ */
30301
+ if (this.didStart) {
30302
+ this.didStart = false;
30303
+ this.ionPullEnd.emit({ reason: 'cancel' });
30304
+ }
30336
30305
  }
30337
30306
  }
30338
30307
  beginRefresh() {
@@ -30379,6 +30348,9 @@ class Refresher {
30379
30348
  if (this.contentFullscreen && this.backgroundContentEl) {
30380
30349
  (_a = this.backgroundContentEl) === null || _a === void 0 ? void 0 : _a.style.removeProperty('--offset-top');
30381
30350
  }
30351
+ this.ionPullEnd.emit({
30352
+ reason: state === 32 /* RefresherState.Completing */ ? 'complete' : 'cancel',
30353
+ });
30382
30354
  }, 600);
30383
30355
  // reset the styles on the scroll element
30384
30356
  // set that the refresh is actively cancelling/completing
@@ -30432,7 +30404,7 @@ class Refresher {
30432
30404
  }
30433
30405
  render() {
30434
30406
  const mode = getIonMode$1(this);
30435
- return (hAsync(Host, { key: '2d1bd880877b698604542ab2d602d38b9504d975', slot: "fixed", class: {
30407
+ return (hAsync(Host, { key: 'bed0c2f44c32ecac24b7d8326ac7c7ef1d12c44f', slot: "fixed", class: {
30436
30408
  [mode]: true,
30437
30409
  // Used internally for styling
30438
30410
  [`refresher-${mode}`]: true,
@@ -34164,6 +34136,7 @@ class Select {
34164
34136
  const mode = getIonMode$1(this);
34165
34137
  const modalOpts = Object.assign(Object.assign({}, interfaceOptions), { mode, cssClass: ['select-modal', interfaceOptions.cssClass], component: 'ion-select-modal', componentProps: {
34166
34138
  header: interfaceOptions.header,
34139
+ cancelText: this.cancelText,
34167
34140
  multiple,
34168
34141
  value,
34169
34142
  options: this.createOverlaySelectOptions(this.childOpts, value),
@@ -34413,7 +34386,7 @@ class Select {
34413
34386
  * TODO(FW-5592): Remove hasStartEndSlots condition
34414
34387
  */
34415
34388
  const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || isExpanded || hasStartEndSlots));
34416
- return (hAsync(Host, { key: 'd8026835993d0e6dce747098f741a06ae4e4f54d', onClick: this.onClick, class: createColorClasses$1(this.color, {
34389
+ return (hAsync(Host, { key: 'b7fa907f8fbc54fd63e2d07a9bb5156d94fd5057', onClick: this.onClick, class: createColorClasses$1(this.color, {
34417
34390
  [mode]: true,
34418
34391
  'in-item': inItem,
34419
34392
  'in-item-color': hostContext('ion-item.ion-color', el),
@@ -34431,7 +34404,7 @@ class Select {
34431
34404
  [`select-justify-${justify}`]: justifyEnabled,
34432
34405
  [`select-shape-${shape}`]: shape !== undefined,
34433
34406
  [`select-label-placement-${labelPlacement}`]: true,
34434
- }) }, hAsync("label", { key: 'fcfb40209d6d07d49c7fdca4884b31abf6ac2567', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick }, this.renderLabelContainer(), hAsync("div", { key: 'f191664f2290c3890bde1156157c83a6ff17dbe2', class: "select-wrapper-inner" }, hAsync("slot", { key: '317a28d1115b4214f291e228ce0fe6fc782e57d5', name: "start" }), hAsync("div", { key: 'db68e18abd5ca3a1023d7c7b58bf89893ae18073', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), hAsync("slot", { key: '4274e042267c2234a198b0f65c89477898d08130', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && hAsync("div", { key: '2e2eb1ee2b2791e0683d9afb186fde6e938ca59c', class: "select-highlight" })), this.renderBottomContent()));
34407
+ }) }, hAsync("label", { key: '11137e6a8b0374e93923ddb5a4629972ded5f43c', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick }, this.renderLabelContainer(), hAsync("div", { key: '99e3c09b5e6c2e7be493ed5834f991fffe45cfff', class: "select-wrapper-inner" }, hAsync("slot", { key: '740f0e5a913cb0209d5acae31c33a6ed8f672dfc', name: "start" }), hAsync("div", { key: 'b20e33c8b60915a5194948fcf8e22d7789f0b050', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), hAsync("slot", { key: '0199f338185d5fa2cdd977bb20516746bd9ddad5', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && hAsync("div", { key: '3b54de893cc8fc66df8588cee22e30d6f10850b3', class: "select-highlight" })), this.renderBottomContent()));
34435
34408
  }
34436
34409
  get el() { return getElement(this); }
34437
34410
  static get watchers() { return {
@@ -34526,6 +34499,10 @@ const selectModalMdCss = ".sc-ion-select-modal-md-h{height:100%}ion-list.sc-ion-
34526
34499
  class SelectModal {
34527
34500
  constructor(hostRef) {
34528
34501
  registerInstance(this, hostRef);
34502
+ /**
34503
+ * The text to display on the cancel button.
34504
+ */
34505
+ this.cancelText = 'Close';
34529
34506
  this.options = [];
34530
34507
  }
34531
34508
  closeModal() {
@@ -34592,7 +34569,7 @@ class SelectModal {
34592
34569
  } }, option.text))));
34593
34570
  }
34594
34571
  render() {
34595
- return (hAsync(Host, { key: 'b6c0dec240b2e41985b15fdf4e5a6d3a145c1567', class: getIonMode$1(this) }, hAsync("ion-header", { key: 'cd177e85ee0f62a60a3a708342d6ab6eb19a44dc' }, hAsync("ion-toolbar", { key: 'aee8222a5a4daa540ad202b2e4cac1ef93d9558c' }, this.header !== undefined && hAsync("ion-title", { key: '5f8fecc764d97bf840d3d4cfddeeccd118ab4436' }, this.header), hAsync("ion-buttons", { key: '919033950d7c2b0101f96a9c9698219de9f568ea', slot: "end" }, hAsync("ion-button", { key: '34b571cab6dced4bde555a077a21e91800829931', onClick: () => this.closeModal() }, "Close")))), hAsync("ion-content", { key: '3c9153d26ba7a5a03d3b20fcd628d0c3031661a7' }, hAsync("ion-list", { key: 'e00b222c071bc97c82ad1bba4db95a8a5c43ed6d' }, this.multiple === true ? this.renderCheckboxOptions() : this.renderRadioOptions()))));
34572
+ return (hAsync(Host, { key: '59ba79ffdbb69befe8e13745450c1071a1fe8c6c', class: getIonMode$1(this) }, hAsync("ion-header", { key: 'fa4d08ee43eec4b9add09d9ffabcba9ed13dd4af' }, hAsync("ion-toolbar", { key: 'b5e26cf092297c51c1dba3ce7963e7b03420393b' }, this.header !== undefined && hAsync("ion-title", { key: 'a8a93cdea4d119d3a17d8cef3878b8a1daa86e26' }, this.header), hAsync("ion-buttons", { key: 'bbc656713b41ef09099ed466f93a9cfbdaceecc1', slot: "end" }, hAsync("ion-button", { key: '80b8751fe4c96e06b620a0b9d17b2d9b3da2faa5', onClick: () => this.closeModal() }, this.cancelText)))), hAsync("ion-content", { key: 'a251fc00ae4cc7e6b3abe13caa10d95bb515558e' }, hAsync("ion-list", { key: 'bcaf38d6d91accfabb4a9d26783bc0e4801abe3c' }, this.multiple === true ? this.renderCheckboxOptions() : this.renderRadioOptions()))));
34596
34573
  }
34597
34574
  get el() { return getElement(this); }
34598
34575
  static get style() { return {
@@ -34605,6 +34582,7 @@ class SelectModal {
34605
34582
  "$tagName$": "ion-select-modal",
34606
34583
  "$members$": {
34607
34584
  "header": [1],
34585
+ "cancelText": [1, "cancel-text"],
34608
34586
  "multiple": [4],
34609
34587
  "options": [16]
34610
34588
  },