@mtes-mct/monitor-ui 10.16.1 → 10.17.0

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/index.js CHANGED
@@ -65110,8 +65110,7 @@ function isString$1(str) {
65110
65110
 
65111
65111
  /** Checks if value is object */
65112
65112
  function isObject$3(obj) {
65113
- var _obj$constructor;
65114
- return typeof obj === 'object' && obj != null && (obj == null || (_obj$constructor = obj.constructor) == null ? void 0 : _obj$constructor.name) === 'Object';
65113
+ return typeof obj === 'object' && obj != null && obj?.constructor?.name === 'Object';
65115
65114
  }
65116
65115
  function pick(obj, keys) {
65117
65116
  if (Array.isArray(keys)) return pick(obj, (_, k) => keys.includes(k));
@@ -65199,6 +65198,11 @@ class ActionDetails {
65199
65198
  while (this.value.slice(0, this.startChangePos) !== this.oldValue.slice(0, this.startChangePos)) {
65200
65199
  --this.oldSelection.start;
65201
65200
  }
65201
+
65202
+ // double check right part
65203
+ while (this.value.slice(this.cursorPos) !== this.oldValue.slice(this.oldSelection.end)) {
65204
+ if (this.value.length - this.cursorPos < this.oldValue.length - this.oldSelection.end) ++this.oldSelection.end;else ++this.cursorPos;
65205
+ }
65202
65206
  }
65203
65207
 
65204
65208
  /** Start changing position */
@@ -65282,6 +65286,7 @@ function IMask(el, opts) {
65282
65286
  // export function maskedClass<Mask extends typeof Masked> (mask: Mask): Mask;
65283
65287
  // export function maskedClass(mask: RegExp): typeof MaskedRegExp;
65284
65288
  // export function maskedClass(mask: (value: string, ...args: any[]) => boolean): typeof MaskedFunction;
65289
+
65285
65290
  /** Get Masked class by mask type */
65286
65291
  function maskedClass(mask) /* TODO */{
65287
65292
  if (mask == null) throw new Error('mask property should be defined');
@@ -65362,7 +65367,7 @@ function createMask(opts) {
65362
65367
  if (IMask.Masked && opts instanceof IMask.Masked) return opts;
65363
65368
  const nOpts = normalizeOpts(opts);
65364
65369
  const MaskedClass = maskedClass(nOpts.mask);
65365
- if (!MaskedClass) throw new Error('Masked class is not found for provided mask, appropriate module needs to be imported manually before creating mask.');
65370
+ if (!MaskedClass) throw new Error(`Masked class is not found for provided mask ${nOpts.mask}, appropriate module needs to be imported manually before creating mask.`);
65366
65371
  if (nOpts.mask === MaskedClass) delete nOpts.mask;
65367
65372
  if (nOpts._mask) {
65368
65373
  nOpts.mask = nOpts._mask;
@@ -65416,9 +65421,11 @@ class MaskElement {
65416
65421
 
65417
65422
  /** */
65418
65423
  }
65419
-
65420
65424
  IMask.MaskElement = MaskElement;
65421
65425
 
65426
+ const KEY_Z = 90;
65427
+ const KEY_Y = 89;
65428
+
65422
65429
  /** Bridge between HTMLElement and {@link Masked} */
65423
65430
  class HTMLMaskElement extends MaskElement {
65424
65431
  /** HTMLElement to use mask on */
@@ -65426,53 +65433,73 @@ class HTMLMaskElement extends MaskElement {
65426
65433
  constructor(input) {
65427
65434
  super();
65428
65435
  this.input = input;
65429
- this._handlers = {};
65436
+ this._onKeydown = this._onKeydown.bind(this);
65437
+ this._onInput = this._onInput.bind(this);
65438
+ this._onBeforeinput = this._onBeforeinput.bind(this);
65439
+ this._onCompositionEnd = this._onCompositionEnd.bind(this);
65430
65440
  }
65431
65441
  get rootElement() {
65432
- var _this$input$getRootNo, _this$input$getRootNo2, _this$input;
65433
- return (_this$input$getRootNo = (_this$input$getRootNo2 = (_this$input = this.input).getRootNode) == null ? void 0 : _this$input$getRootNo2.call(_this$input)) != null ? _this$input$getRootNo : document;
65442
+ return this.input.getRootNode?.() ?? document;
65434
65443
  }
65435
65444
 
65436
- /**
65437
- Is element in focus
65438
- */
65445
+ /** Is element in focus */
65439
65446
  get isActive() {
65440
65447
  return this.input === this.rootElement.activeElement;
65441
65448
  }
65442
65449
 
65443
- /**
65444
- Binds HTMLElement events to mask internal events
65445
- */
65450
+ /** Binds HTMLElement events to mask internal events */
65446
65451
  bindEvents(handlers) {
65447
- Object.keys(handlers).forEach(event => this._toggleEventHandler(HTMLMaskElement.EVENTS_MAP[event], handlers[event]));
65452
+ this.input.addEventListener('keydown', this._onKeydown);
65453
+ this.input.addEventListener('input', this._onInput);
65454
+ this.input.addEventListener('beforeinput', this._onBeforeinput);
65455
+ this.input.addEventListener('compositionend', this._onCompositionEnd);
65456
+ this.input.addEventListener('drop', handlers.drop);
65457
+ this.input.addEventListener('click', handlers.click);
65458
+ this.input.addEventListener('focus', handlers.focus);
65459
+ this.input.addEventListener('blur', handlers.commit);
65460
+ this._handlers = handlers;
65448
65461
  }
65449
-
65450
- /**
65451
- Unbinds HTMLElement events to mask internal events
65452
- */
65453
- unbindEvents() {
65454
- Object.keys(this._handlers).forEach(event => this._toggleEventHandler(event));
65462
+ _onKeydown(e) {
65463
+ if (this._handlers.redo && (e.keyCode === KEY_Z && e.shiftKey && (e.metaKey || e.ctrlKey) || e.keyCode === KEY_Y && e.ctrlKey)) {
65464
+ e.preventDefault();
65465
+ return this._handlers.redo(e);
65466
+ }
65467
+ if (this._handlers.undo && e.keyCode === KEY_Z && (e.metaKey || e.ctrlKey)) {
65468
+ e.preventDefault();
65469
+ return this._handlers.undo(e);
65470
+ }
65471
+ if (!e.isComposing) this._handlers.selectionChange(e);
65455
65472
  }
65456
- _toggleEventHandler(event, handler) {
65457
- if (this._handlers[event]) {
65458
- this.input.removeEventListener(event, this._handlers[event]);
65459
- delete this._handlers[event];
65473
+ _onBeforeinput(e) {
65474
+ if (e.inputType === 'historyUndo' && this._handlers.undo) {
65475
+ e.preventDefault();
65476
+ return this._handlers.undo(e);
65460
65477
  }
65461
- if (handler) {
65462
- this.input.addEventListener(event, handler);
65463
- this._handlers[event] = handler;
65478
+ if (e.inputType === 'historyRedo' && this._handlers.redo) {
65479
+ e.preventDefault();
65480
+ return this._handlers.redo(e);
65464
65481
  }
65465
65482
  }
65483
+ _onCompositionEnd(e) {
65484
+ this._handlers.input(e);
65485
+ }
65486
+ _onInput(e) {
65487
+ if (!e.isComposing) this._handlers.input(e);
65488
+ }
65489
+
65490
+ /** Unbinds HTMLElement events to mask internal events */
65491
+ unbindEvents() {
65492
+ this.input.removeEventListener('keydown', this._onKeydown);
65493
+ this.input.removeEventListener('input', this._onInput);
65494
+ this.input.removeEventListener('beforeinput', this._onBeforeinput);
65495
+ this.input.removeEventListener('compositionend', this._onCompositionEnd);
65496
+ this.input.removeEventListener('drop', this._handlers.drop);
65497
+ this.input.removeEventListener('click', this._handlers.click);
65498
+ this.input.removeEventListener('focus', this._handlers.focus);
65499
+ this.input.removeEventListener('blur', this._handlers.commit);
65500
+ this._handlers = {};
65501
+ }
65466
65502
  }
65467
- /** Mapping between HTMLElement events and mask internal events */
65468
- HTMLMaskElement.EVENTS_MAP = {
65469
- selectionChange: 'keydown',
65470
- input: 'input',
65471
- drop: 'drop',
65472
- click: 'click',
65473
- focus: 'focus',
65474
- commit: 'blur'
65475
- };
65476
65503
  IMask.HTMLMaskElement = HTMLMaskElement;
65477
65504
 
65478
65505
  /** Bridge between InputElement and {@link Masked} */
@@ -65482,7 +65509,6 @@ class HTMLInputMaskElement extends HTMLMaskElement {
65482
65509
  constructor(input) {
65483
65510
  super(input);
65484
65511
  this.input = input;
65485
- this._handlers = {};
65486
65512
  }
65487
65513
 
65488
65514
  /** Returns InputElement selection start */
@@ -65557,6 +65583,39 @@ class HTMLContenteditableMaskElement extends HTMLMaskElement {
65557
65583
  }
65558
65584
  IMask.HTMLContenteditableMaskElement = HTMLContenteditableMaskElement;
65559
65585
 
65586
+ class InputHistory {
65587
+ static MAX_LENGTH = 100;
65588
+ states = [];
65589
+ currentIndex = 0;
65590
+ get currentState() {
65591
+ return this.states[this.currentIndex];
65592
+ }
65593
+ get isEmpty() {
65594
+ return this.states.length === 0;
65595
+ }
65596
+ push(state) {
65597
+ // if current index points before the last element then remove the future
65598
+ if (this.currentIndex < this.states.length - 1) this.states.length = this.currentIndex + 1;
65599
+ this.states.push(state);
65600
+ if (this.states.length > InputHistory.MAX_LENGTH) this.states.shift();
65601
+ this.currentIndex = this.states.length - 1;
65602
+ }
65603
+ go(steps) {
65604
+ this.currentIndex = Math.min(Math.max(this.currentIndex + steps, 0), this.states.length - 1);
65605
+ return this.currentState;
65606
+ }
65607
+ undo() {
65608
+ return this.go(-1);
65609
+ }
65610
+ redo() {
65611
+ return this.go(+1);
65612
+ }
65613
+ clear() {
65614
+ this.states.length = 0;
65615
+ this.currentIndex = 0;
65616
+ }
65617
+ }
65618
+
65560
65619
  /** Listens to element events and controls changes between element and {@link Masked} */
65561
65620
  class InputMask {
65562
65621
  /**
@@ -65571,12 +65630,16 @@ class InputMask {
65571
65630
  this._listeners = {};
65572
65631
  this._value = '';
65573
65632
  this._unmaskedValue = '';
65633
+ this._rawInputValue = '';
65634
+ this.history = new InputHistory();
65574
65635
  this._saveSelection = this._saveSelection.bind(this);
65575
65636
  this._onInput = this._onInput.bind(this);
65576
65637
  this._onChange = this._onChange.bind(this);
65577
65638
  this._onDrop = this._onDrop.bind(this);
65578
65639
  this._onFocus = this._onFocus.bind(this);
65579
65640
  this._onClick = this._onClick.bind(this);
65641
+ this._onUndo = this._onUndo.bind(this);
65642
+ this._onRedo = this._onRedo.bind(this);
65580
65643
  this.alignCursor = this.alignCursor.bind(this);
65581
65644
  this.alignCursorFriendly = this.alignCursorFriendly.bind(this);
65582
65645
  this._bindEvents();
@@ -65586,8 +65649,7 @@ class InputMask {
65586
65649
  this._onChange();
65587
65650
  }
65588
65651
  maskEquals(mask) {
65589
- var _this$masked;
65590
- return mask == null || ((_this$masked = this.masked) == null ? void 0 : _this$masked.maskEquals(mask));
65652
+ return mask == null || this.masked?.maskEquals(mask);
65591
65653
  }
65592
65654
 
65593
65655
  /** Masked */
@@ -65617,8 +65679,7 @@ class InputMask {
65617
65679
  set value(str) {
65618
65680
  if (this.value === str) return;
65619
65681
  this.masked.value = str;
65620
- this.updateControl();
65621
- this.alignCursor();
65682
+ this.updateControl('auto');
65622
65683
  }
65623
65684
 
65624
65685
  /** Unmasked value */
@@ -65628,6 +65689,16 @@ class InputMask {
65628
65689
  set unmaskedValue(str) {
65629
65690
  if (this.unmaskedValue === str) return;
65630
65691
  this.masked.unmaskedValue = str;
65692
+ this.updateControl('auto');
65693
+ }
65694
+
65695
+ /** Raw input value */
65696
+ get rawInputValue() {
65697
+ return this._rawInputValue;
65698
+ }
65699
+ set rawInputValue(str) {
65700
+ if (this.rawInputValue === str) return;
65701
+ this.masked.rawInputValue = str;
65631
65702
  this.updateControl();
65632
65703
  this.alignCursor();
65633
65704
  }
@@ -65639,8 +65710,7 @@ class InputMask {
65639
65710
  set typedValue(val) {
65640
65711
  if (this.masked.typedValueEquals(val)) return;
65641
65712
  this.masked.typedValue = val;
65642
- this.updateControl();
65643
- this.alignCursor();
65713
+ this.updateControl('auto');
65644
65714
  }
65645
65715
 
65646
65716
  /** Display value */
@@ -65656,7 +65726,9 @@ class InputMask {
65656
65726
  drop: this._onDrop,
65657
65727
  click: this._onClick,
65658
65728
  focus: this._onFocus,
65659
- commit: this._onChange
65729
+ commit: this._onChange,
65730
+ undo: this._onUndo,
65731
+ redo: this._onRedo
65660
65732
  });
65661
65733
  }
65662
65734
 
@@ -65693,7 +65765,6 @@ class InputMask {
65693
65765
  if (this.displayValue !== this.el.value) {
65694
65766
  console.warn('Element value was changed outside of mask. Syncronize mask using `mask.updateValue()` to work properly.'); // eslint-disable-line no-console
65695
65767
  }
65696
-
65697
65768
  this._selection = {
65698
65769
  start: this.selectionStart,
65699
65770
  end: this.cursorPos
@@ -65707,15 +65778,25 @@ class InputMask {
65707
65778
  }
65708
65779
 
65709
65780
  /** Syncronizes view from model value, fires change events */
65710
- updateControl() {
65781
+ updateControl(cursorPos) {
65711
65782
  const newUnmaskedValue = this.masked.unmaskedValue;
65712
65783
  const newValue = this.masked.value;
65784
+ const newRawInputValue = this.masked.rawInputValue;
65713
65785
  const newDisplayValue = this.displayValue;
65714
- const isChanged = this.unmaskedValue !== newUnmaskedValue || this.value !== newValue;
65786
+ const isChanged = this.unmaskedValue !== newUnmaskedValue || this.value !== newValue || this._rawInputValue !== newRawInputValue;
65715
65787
  this._unmaskedValue = newUnmaskedValue;
65716
65788
  this._value = newValue;
65789
+ this._rawInputValue = newRawInputValue;
65717
65790
  if (this.el.value !== newDisplayValue) this.el.value = newDisplayValue;
65791
+ if (cursorPos === 'auto') this.alignCursor();else if (cursorPos != null) this.cursorPos = cursorPos;
65718
65792
  if (isChanged) this._fireChangeEvents();
65793
+ if (!this._historyChanging && (isChanged || this.history.isEmpty)) this.history.push({
65794
+ unmaskedValue: newUnmaskedValue,
65795
+ selection: {
65796
+ start: this.selectionStart,
65797
+ end: this.cursorPos
65798
+ }
65799
+ });
65719
65800
  }
65720
65801
 
65721
65802
  /** Updates options with deep equal check, recreates {@link Masked} model if mask type changes */
@@ -65723,9 +65804,10 @@ class InputMask {
65723
65804
  const {
65724
65805
  mask,
65725
65806
  ...restOpts
65726
- } = opts;
65807
+ } = opts; // TODO types, yes, mask is optional
65808
+
65727
65809
  const updateMask = !this.maskEquals(mask);
65728
- const updateOpts = !objectIncludes(this.masked, restOpts);
65810
+ const updateOpts = this.masked.optionsIsChanged(restOpts);
65729
65811
  if (updateMask) this.mask = mask;
65730
65812
  if (updateOpts) this.masked.updateOptions(restOpts); // TODO
65731
65813
 
@@ -65800,9 +65882,6 @@ class InputMask {
65800
65882
  _onInput(e) {
65801
65883
  this._inputEvent = e;
65802
65884
  this._abortUpdateCursor();
65803
-
65804
- // fix strange IE behavior
65805
- if (!this._selection) return this.updateValue();
65806
65885
  const details = new ActionDetails({
65807
65886
  // new state
65808
65887
  value: this.el.value,
@@ -65822,8 +65901,7 @@ class InputMask {
65822
65901
  const removeDirection = oldRawValue === this.masked.rawInputValue ? details.removeDirection : DIRECTION.NONE;
65823
65902
  let cursorPos = this.masked.nearestInputPos(details.startChangePos + offset, removeDirection);
65824
65903
  if (removeDirection !== DIRECTION.NONE) cursorPos = this.masked.nearestInputPos(cursorPos, DIRECTION.NONE);
65825
- this.updateControl();
65826
- this.updateCursor(cursorPos);
65904
+ this.updateControl(cursorPos);
65827
65905
  delete this._inputEvent;
65828
65906
  }
65829
65907
 
@@ -65852,6 +65930,20 @@ class InputMask {
65852
65930
  _onClick(ev) {
65853
65931
  this.alignCursorFriendly();
65854
65932
  }
65933
+ _onUndo() {
65934
+ this._applyHistoryState(this.history.undo());
65935
+ }
65936
+ _onRedo() {
65937
+ this._applyHistoryState(this.history.redo());
65938
+ }
65939
+ _applyHistoryState(state) {
65940
+ if (!state) return;
65941
+ this._historyChanging = true;
65942
+ this.unmaskedValue = state.unmaskedValue;
65943
+ this.el.select(state.selection.start, state.selection.end);
65944
+ this._saveSelection();
65945
+ this._historyChanging = false;
65946
+ }
65855
65947
 
65856
65948
  /** Unbind view events and removes element reference */
65857
65949
  destroy() {
@@ -65962,6 +66054,11 @@ class ContinuousTailDetails {
65962
66054
 
65963
66055
  /** Provides common masking stuff */
65964
66056
  class Masked {
66057
+ static DEFAULTS = {
66058
+ skipInvalid: true
66059
+ };
66060
+ static EMPTY_VALUES = [undefined, null, ''];
66061
+
65965
66062
  /** */
65966
66063
 
65967
66064
  /** */
@@ -65997,7 +66094,7 @@ class Masked {
65997
66094
 
65998
66095
  /** Sets and applies new options */
65999
66096
  updateOptions(opts) {
66000
- if (!Object.keys(opts).length) return;
66097
+ if (!this.optionsIsChanged(opts)) return;
66001
66098
  this.withValueRefresh(this._update.bind(this, opts));
66002
66099
  }
66003
66100
 
@@ -66139,7 +66236,7 @@ class Masked {
66139
66236
  const consistentState = this.state;
66140
66237
  let details;
66141
66238
  [ch, details] = this.doPrepareChar(ch, flags);
66142
- details = details.aggregate(this._appendCharRaw(ch, flags));
66239
+ if (ch) details = details.aggregate(this._appendCharRaw(ch, flags));
66143
66240
  if (details.inserted) {
66144
66241
  let consistentTail;
66145
66242
  let appended = this.doValidate(flags) !== false;
@@ -66148,18 +66245,22 @@ class Masked {
66148
66245
  const beforeTailState = this.state;
66149
66246
  if (this.overwrite === true) {
66150
66247
  consistentTail = checkTail.state;
66151
- checkTail.unshift(this.displayValue.length - details.tailShift);
66248
+ for (let i = 0; i < details.rawInserted.length; ++i) {
66249
+ checkTail.unshift(this.displayValue.length - details.tailShift);
66250
+ }
66152
66251
  }
66153
66252
  let tailDetails = this.appendTail(checkTail);
66154
- appended = tailDetails.rawInserted === checkTail.toString();
66253
+ appended = tailDetails.rawInserted.length === checkTail.toString().length;
66155
66254
 
66156
66255
  // not ok, try shift
66157
66256
  if (!(appended && tailDetails.inserted) && this.overwrite === 'shift') {
66158
66257
  this.state = beforeTailState;
66159
66258
  consistentTail = checkTail.state;
66160
- checkTail.shift();
66259
+ for (let i = 0; i < details.rawInserted.length; ++i) {
66260
+ checkTail.shift();
66261
+ }
66161
66262
  tailDetails = this.appendTail(checkTail);
66162
- appended = tailDetails.rawInserted === checkTail.toString();
66263
+ appended = tailDetails.rawInserted.length === checkTail.toString().length;
66163
66264
  }
66164
66265
 
66165
66266
  // if ok, rollback state after tail
@@ -66190,7 +66291,7 @@ class Masked {
66190
66291
  append(str, flags, tail) {
66191
66292
  if (!isString$1(str)) throw new Error('value should be string');
66192
66293
  const checkTail = isString$1(tail) ? new ContinuousTailDetails(String(tail)) : tail;
66193
- if (flags != null && flags.tail) flags._beforeTailState = this.state;
66294
+ if (flags?.tail) flags._beforeTailState = this.state;
66194
66295
  let details;
66195
66296
  [str, details] = this.doPrepare(str, flags);
66196
66297
  for (let ci = 0; ci < str.length; ++ci) {
@@ -66198,7 +66299,7 @@ class Masked {
66198
66299
  if (!d.rawInserted && !this.doSkipInvalid(str[ci], flags, checkTail)) break;
66199
66300
  details.aggregate(d);
66200
66301
  }
66201
- if ((this.eager === true || this.eager === 'append') && flags != null && flags.input && str) {
66302
+ if ((this.eager === true || this.eager === 'append') && flags?.input && str) {
66202
66303
  details.aggregate(this._appendEager());
66203
66304
  }
66204
66305
 
@@ -66209,7 +66310,6 @@ class Masked {
66209
66310
  // but it causes bugs when one append calls another (when dynamic dispatch set rawInputValue)
66210
66311
  // this._resetBeforeTailState();
66211
66312
  }
66212
-
66213
66313
  return details;
66214
66314
  }
66215
66315
  remove(fromPos, toPos) {
@@ -66234,6 +66334,7 @@ class Masked {
66234
66334
  // append lost trailing chars at the end
66235
66335
  if (this.value && this.value !== value && value.indexOf(this.value) === 0) {
66236
66336
  this.append(value.slice(this.displayValue.length), {}, '');
66337
+ this.doCommit();
66237
66338
  }
66238
66339
  delete this._refreshing;
66239
66340
  return ret;
@@ -66323,15 +66424,14 @@ class Masked {
66323
66424
  maskEquals(mask) {
66324
66425
  return this.mask === mask;
66325
66426
  }
66427
+ optionsIsChanged(opts) {
66428
+ return !objectIncludes(this, opts);
66429
+ }
66326
66430
  typedValueEquals(value) {
66327
66431
  const tval = this.typedValue;
66328
66432
  return value === tval || Masked.EMPTY_VALUES.includes(value) && Masked.EMPTY_VALUES.includes(tval) || (this.format ? this.format(value, this) === this.format(this.typedValue, this) : false);
66329
66433
  }
66330
66434
  }
66331
- Masked.DEFAULTS = {
66332
- skipInvalid: true
66333
- };
66334
- Masked.EMPTY_VALUES = [undefined, null, ''];
66335
66435
  IMask.Masked = Masked;
66336
66436
 
66337
66437
  class ChunksTailDetails {
@@ -66546,11 +66646,9 @@ class PatternCursor {
66546
66646
  this.offset = this.block.displayValue.length; // TODO this is stupid type error, `block` depends on index that was changed above
66547
66647
  }
66548
66648
  }
66549
-
66550
66649
  _pushLeft(fn) {
66551
66650
  this.pushState();
66552
- for (this.bindBlock(); 0 <= this.index; --this.index, this.offset = ((_this$block = this.block) == null ? void 0 : _this$block.displayValue.length) || 0) {
66553
- var _this$block;
66651
+ for (this.bindBlock(); 0 <= this.index; --this.index, this.offset = this.block?.displayValue.length || 0) {
66554
66652
  if (fn()) return this.ok = true;
66555
66653
  }
66556
66654
  return this.ok = false;
@@ -66760,6 +66858,13 @@ class PatternFixedDefinition {
66760
66858
  }
66761
66859
 
66762
66860
  class PatternInputDefinition {
66861
+ static DEFAULT_DEFINITIONS = {
66862
+ '0': /\d/,
66863
+ 'a': /[\u0041-\u005A\u0061-\u007A\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,
66864
+ // http://stackoverflow.com/a/22075070
66865
+ '*': /./
66866
+ };
66867
+
66763
66868
  /** */
66764
66869
 
66765
66870
  /** */
@@ -66923,19 +67028,12 @@ class PatternInputDefinition {
66923
67028
  this.isFilled = state.isFilled;
66924
67029
  }
66925
67030
  currentMaskFlags(flags) {
66926
- var _flags$_beforeTailSta;
66927
67031
  return {
66928
67032
  ...flags,
66929
- _beforeTailState: (flags == null || (_flags$_beforeTailSta = flags._beforeTailState) == null ? void 0 : _flags$_beforeTailSta.masked) || (flags == null ? void 0 : flags._beforeTailState)
67033
+ _beforeTailState: flags?._beforeTailState?.masked || flags?._beforeTailState
66930
67034
  };
66931
67035
  }
66932
67036
  }
66933
- PatternInputDefinition.DEFAULT_DEFINITIONS = {
66934
- '0': /\d/,
66935
- 'a': /[\u0041-\u005A\u0061-\u007A\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,
66936
- // http://stackoverflow.com/a/22075070
66937
- '*': /./
66938
- };
66939
67037
 
66940
67038
  /** Masking by RegExp */
66941
67039
  class MaskedRegExp extends Masked {
@@ -66960,6 +67058,15 @@ IMask.MaskedRegExp = MaskedRegExp;
66960
67058
 
66961
67059
  /** Pattern mask */
66962
67060
  class MaskedPattern extends Masked {
67061
+ static DEFAULTS = {
67062
+ lazy: true,
67063
+ placeholderChar: '_'
67064
+ };
67065
+ static STOP_CHAR = '`';
67066
+ static ESCAPE_CHAR = '\\';
67067
+ static InputDefinition = PatternInputDefinition;
67068
+ static FixedDefinition = PatternFixedDefinition;
67069
+
66963
67070
  /** */
66964
67071
 
66965
67072
  /** */
@@ -66980,7 +67087,7 @@ class MaskedPattern extends Masked {
66980
67087
  super({
66981
67088
  ...MaskedPattern.DEFAULTS,
66982
67089
  ...opts,
66983
- definitions: Object.assign({}, PatternInputDefinition.DEFAULT_DEFINITIONS, opts == null ? void 0 : opts.definitions)
67090
+ definitions: Object.assign({}, PatternInputDefinition.DEFAULT_DEFINITIONS, opts?.definitions)
66984
67091
  });
66985
67092
  }
66986
67093
  updateOptions(opts) {
@@ -67012,17 +67119,20 @@ class MaskedPattern extends Masked {
67012
67119
  if (bName) {
67013
67120
  const {
67014
67121
  expose,
67015
- ...blockOpts
67016
- } = normalizeOpts(this.blocks[bName]);
67017
- const maskedBlock = createMask({
67122
+ repeat,
67123
+ ...bOpts
67124
+ } = normalizeOpts(this.blocks[bName]); // TODO type Opts<Arg & Extra>
67125
+ const blockOpts = {
67018
67126
  lazy: this.lazy,
67019
67127
  eager: this.eager,
67020
67128
  placeholderChar: this.placeholderChar,
67021
67129
  displayChar: this.displayChar,
67022
67130
  overwrite: this.overwrite,
67023
- ...blockOpts,
67131
+ ...bOpts,
67132
+ repeat,
67024
67133
  parent: this
67025
- });
67134
+ };
67135
+ const maskedBlock = repeat != null ? new IMask.RepeatBlock(blockOpts /* TODO */) : createMask(blockOpts);
67026
67136
  if (maskedBlock) {
67027
67137
  this._blocks.push(maskedBlock);
67028
67138
  if (expose) this.exposeBlock = maskedBlock;
@@ -67078,6 +67188,10 @@ class MaskedPattern extends Masked {
67078
67188
  };
67079
67189
  }
67080
67190
  set state(state) {
67191
+ if (!state) {
67192
+ this.reset();
67193
+ return;
67194
+ }
67081
67195
  const {
67082
67196
  _blocks,
67083
67197
  ...maskedState
@@ -67147,9 +67261,8 @@ class MaskedPattern extends Masked {
67147
67261
  return super.appendTail(tail).aggregate(this._appendPlaceholder());
67148
67262
  }
67149
67263
  _appendEager() {
67150
- var _this$_mapPosToBlock;
67151
67264
  const details = new ChangeDetails();
67152
- let startBlockIndex = (_this$_mapPosToBlock = this._mapPosToBlock(this.displayValue.length)) == null ? void 0 : _this$_mapPosToBlock.index;
67265
+ let startBlockIndex = this._mapPosToBlock(this.displayValue.length)?.index;
67153
67266
  if (startBlockIndex == null) return details;
67154
67267
 
67155
67268
  // TODO test if it works for nested pattern masks
@@ -67168,19 +67281,14 @@ class MaskedPattern extends Masked {
67168
67281
  const blockIter = this._mapPosToBlock(this.displayValue.length);
67169
67282
  const details = new ChangeDetails();
67170
67283
  if (!blockIter) return details;
67171
- for (let bi = blockIter.index;; ++bi) {
67172
- var _flags$_beforeTailSta;
67173
- const block = this._blocks[bi];
67174
- if (!block) break;
67284
+ for (let bi = blockIter.index, block; block = this._blocks[bi]; ++bi) {
67175
67285
  const blockDetails = block._appendChar(ch, {
67176
67286
  ...flags,
67177
- _beforeTailState: (_flags$_beforeTailSta = flags._beforeTailState) == null || (_flags$_beforeTailSta = _flags$_beforeTailSta._blocks) == null ? void 0 : _flags$_beforeTailSta[bi]
67287
+ _beforeTailState: flags._beforeTailState?._blocks?.[bi]
67178
67288
  });
67179
- const skip = blockDetails.skip;
67180
67289
  details.aggregate(blockDetails);
67181
- if (skip || blockDetails.rawInserted) break; // go next char
67290
+ if (blockDetails.skip || blockDetails.rawInserted) break; // go next char
67182
67291
  }
67183
-
67184
67292
  return details;
67185
67293
  }
67186
67294
  extractTail(fromPos, toPos) {
@@ -67237,8 +67345,7 @@ class MaskedPattern extends Masked {
67237
67345
  const endBlockIndex = toBlockIndex != null ? toBlockIndex : this._blocks.length;
67238
67346
  this._blocks.slice(startBlockIndex, endBlockIndex).forEach(b => {
67239
67347
  if (!b.lazy || toBlockIndex != null) {
67240
- var _blocks2;
67241
- const bDetails = b._appendPlaceholder((_blocks2 = b._blocks) == null ? void 0 : _blocks2.length);
67348
+ const bDetails = b._appendPlaceholder(b._blocks?.length);
67242
67349
  this._value += bDetails.inserted;
67243
67350
  details.aggregate(bDetails);
67244
67351
  }
@@ -67389,14 +67496,6 @@ class MaskedPattern extends Masked {
67389
67496
  return indices.map(gi => this._blocks[gi]);
67390
67497
  }
67391
67498
  }
67392
- MaskedPattern.DEFAULTS = {
67393
- lazy: true,
67394
- placeholderChar: '_'
67395
- };
67396
- MaskedPattern.STOP_CHAR = '`';
67397
- MaskedPattern.ESCAPE_CHAR = '\\';
67398
- MaskedPattern.InputDefinition = PatternInputDefinition;
67399
- MaskedPattern.FixedDefinition = PatternFixedDefinition;
67400
67499
  IMask.MaskedPattern = MaskedPattern;
67401
67500
 
67402
67501
  /** Pattern which accepts ranges */
@@ -67418,7 +67517,6 @@ class MaskedRange extends MaskedPattern {
67418
67517
  constructor(opts) {
67419
67518
  super(opts); // mask will be created in _update
67420
67519
  }
67421
-
67422
67520
  updateOptions(opts) {
67423
67521
  super.updateOptions(opts);
67424
67522
  }
@@ -67462,7 +67560,10 @@ class MaskedRange extends MaskedPattern {
67462
67560
  }
67463
67561
  let details;
67464
67562
  [ch, details] = super.doPrepareChar(ch.replace(/\D/g, ''), flags);
67465
- if (!this.autofix || !ch) return [ch, details];
67563
+ if (!this.autofix || !ch) {
67564
+ details.skip = !this.isComplete;
67565
+ return [ch, details];
67566
+ }
67466
67567
  const fromStr = String(this.from).padStart(this.maxLength, '0');
67467
67568
  const toStr = String(this.to).padStart(this.maxLength, '0');
67468
67569
  const nextVal = this.value + ch;
@@ -67489,6 +67590,52 @@ IMask.MaskedRange = MaskedRange;
67489
67590
 
67490
67591
  /** Date mask */
67491
67592
  class MaskedDate extends MaskedPattern {
67593
+ static GET_DEFAULT_BLOCKS = () => ({
67594
+ d: {
67595
+ mask: MaskedRange,
67596
+ from: 1,
67597
+ to: 31,
67598
+ maxLength: 2
67599
+ },
67600
+ m: {
67601
+ mask: MaskedRange,
67602
+ from: 1,
67603
+ to: 12,
67604
+ maxLength: 2
67605
+ },
67606
+ Y: {
67607
+ mask: MaskedRange,
67608
+ from: 1900,
67609
+ to: 9999
67610
+ }
67611
+ });
67612
+ static DEFAULTS = {
67613
+ mask: Date,
67614
+ pattern: 'd{.}`m{.}`Y',
67615
+ format: (date, masked) => {
67616
+ if (!date) return '';
67617
+ const day = String(date.getDate()).padStart(2, '0');
67618
+ const month = String(date.getMonth() + 1).padStart(2, '0');
67619
+ const year = date.getFullYear();
67620
+ return [day, month, year].join('.');
67621
+ },
67622
+ parse: (str, masked) => {
67623
+ const [day, month, year] = str.split('.').map(Number);
67624
+ return new Date(year, month - 1, day);
67625
+ }
67626
+ };
67627
+ static extractPatternOptions(opts) {
67628
+ const {
67629
+ mask,
67630
+ pattern,
67631
+ ...patternOpts
67632
+ } = opts;
67633
+ return {
67634
+ ...patternOpts,
67635
+ mask: isString$1(mask) ? mask : pattern
67636
+ };
67637
+ }
67638
+
67492
67639
  /** Pattern mask for date according to {@link MaskedDate#format} */
67493
67640
 
67494
67641
  /** Start date */
@@ -67502,18 +67649,10 @@ class MaskedDate extends MaskedPattern {
67502
67649
  /** Parse string to get typed value */
67503
67650
 
67504
67651
  constructor(opts) {
67505
- const {
67506
- mask,
67507
- pattern,
67508
- ...patternOpts
67509
- } = {
67652
+ super(MaskedDate.extractPatternOptions({
67510
67653
  ...MaskedDate.DEFAULTS,
67511
67654
  ...opts
67512
- };
67513
- super({
67514
- ...patternOpts,
67515
- mask: isString$1(mask) ? mask : pattern
67516
- });
67655
+ }));
67517
67656
  }
67518
67657
  updateOptions(opts) {
67519
67658
  super.updateOptions(opts);
@@ -67579,45 +67718,16 @@ class MaskedDate extends MaskedPattern {
67579
67718
  maskEquals(mask) {
67580
67719
  return mask === Date || super.maskEquals(mask);
67581
67720
  }
67582
- }
67583
- MaskedDate.GET_DEFAULT_BLOCKS = () => ({
67584
- d: {
67585
- mask: MaskedRange,
67586
- from: 1,
67587
- to: 31,
67588
- maxLength: 2
67589
- },
67590
- m: {
67591
- mask: MaskedRange,
67592
- from: 1,
67593
- to: 12,
67594
- maxLength: 2
67595
- },
67596
- Y: {
67597
- mask: MaskedRange,
67598
- from: 1900,
67599
- to: 9999
67600
- }
67601
- });
67602
- MaskedDate.DEFAULTS = {
67603
- mask: Date,
67604
- pattern: 'd{.}`m{.}`Y',
67605
- format: (date, masked) => {
67606
- if (!date) return '';
67607
- const day = String(date.getDate()).padStart(2, '0');
67608
- const month = String(date.getMonth() + 1).padStart(2, '0');
67609
- const year = date.getFullYear();
67610
- return [day, month, year].join('.');
67611
- },
67612
- parse: (str, masked) => {
67613
- const [day, month, year] = str.split('.').map(Number);
67614
- return new Date(year, month - 1, day);
67721
+ optionsIsChanged(opts) {
67722
+ return super.optionsIsChanged(MaskedDate.extractPatternOptions(opts));
67615
67723
  }
67616
- };
67724
+ }
67617
67725
  IMask.MaskedDate = MaskedDate;
67618
67726
 
67619
67727
  /** Dynamic mask for choosing appropriate mask in run-time */
67620
67728
  class MaskedDynamic extends Masked {
67729
+ static DEFAULTS;
67730
+
67621
67731
  /** Currently chosen mask */
67622
67732
 
67623
67733
  /** Currently chosen mask */
@@ -67659,7 +67769,6 @@ class MaskedDynamic extends Masked {
67659
67769
  // this.currentMask = this.doDispatch(''); // probably not needed but lets see
67660
67770
  }
67661
67771
  }
67662
-
67663
67772
  _appendCharRaw(ch, flags) {
67664
67773
  if (flags === void 0) {
67665
67774
  flags = {};
@@ -67686,7 +67795,7 @@ class MaskedDynamic extends Masked {
67686
67795
  const tailValue = inputValue.slice(insertValue.length);
67687
67796
  const prevMask = this.currentMask;
67688
67797
  const details = new ChangeDetails();
67689
- const prevMaskState = prevMask == null ? void 0 : prevMask.state;
67798
+ const prevMaskState = prevMask?.state;
67690
67799
 
67691
67800
  // clone flags to prevent overwriting `_beforeTailState`
67692
67801
  this.currentMask = this.doDispatch(appended, {
@@ -67738,10 +67847,9 @@ class MaskedDynamic extends Masked {
67738
67847
  return details.aggregate(this.currentMask ? this.currentMask.appendTail(tail) : super.appendTail(tail));
67739
67848
  }
67740
67849
  currentMaskFlags(flags) {
67741
- var _flags$_beforeTailSta, _flags$_beforeTailSta2;
67742
67850
  return {
67743
67851
  ...flags,
67744
- _beforeTailState: ((_flags$_beforeTailSta = flags._beforeTailState) == null ? void 0 : _flags$_beforeTailSta.currentMaskRef) === this.currentMask && ((_flags$_beforeTailSta2 = flags._beforeTailState) == null ? void 0 : _flags$_beforeTailSta2.currentMask) || flags._beforeTailState
67852
+ _beforeTailState: flags._beforeTailState?.currentMaskRef === this.currentMask && flags._beforeTailState?.currentMask || flags._beforeTailState
67745
67853
  };
67746
67854
  }
67747
67855
  doDispatch(appended, flags, tail) {
@@ -67781,8 +67889,7 @@ class MaskedDynamic extends Masked {
67781
67889
  return [s, details];
67782
67890
  }
67783
67891
  reset() {
67784
- var _this$currentMask;
67785
- (_this$currentMask = this.currentMask) == null ? void 0 : _this$currentMask.reset();
67892
+ this.currentMask?.reset();
67786
67893
  this.compiledMasks.forEach(m => m.reset());
67787
67894
  }
67788
67895
  get value() {
@@ -67828,12 +67935,10 @@ class MaskedDynamic extends Masked {
67828
67935
  return this.currentMask ? this.currentMask.displayValue : '';
67829
67936
  }
67830
67937
  get isComplete() {
67831
- var _this$currentMask2;
67832
- return Boolean((_this$currentMask2 = this.currentMask) == null ? void 0 : _this$currentMask2.isComplete);
67938
+ return Boolean(this.currentMask?.isComplete);
67833
67939
  }
67834
67940
  get isFilled() {
67835
- var _this$currentMask3;
67836
- return Boolean((_this$currentMask3 = this.currentMask) == null ? void 0 : _this$currentMask3.isFilled);
67941
+ return Boolean(this.currentMask?.isFilled);
67837
67942
  }
67838
67943
  remove(fromPos, toPos) {
67839
67944
  const details = new ChangeDetails();
@@ -67845,13 +67950,12 @@ class MaskedDynamic extends Masked {
67845
67950
  return details;
67846
67951
  }
67847
67952
  get state() {
67848
- var _this$currentMask4;
67849
67953
  return {
67850
67954
  ...super.state,
67851
67955
  _rawInputValue: this.rawInputValue,
67852
67956
  compiledMasks: this.compiledMasks.map(m => m.state),
67853
67957
  currentMaskRef: this.currentMask,
67854
- currentMask: (_this$currentMask4 = this.currentMask) == null ? void 0 : _this$currentMask4.state
67958
+ currentMask: this.currentMask?.state
67855
67959
  };
67856
67960
  }
67857
67961
  set state(state) {
@@ -67910,11 +68014,9 @@ class MaskedDynamic extends Masked {
67910
68014
  }) : super.maskEquals(mask);
67911
68015
  }
67912
68016
  typedValueEquals(value) {
67913
- var _this$currentMask5;
67914
- return Boolean((_this$currentMask5 = this.currentMask) == null ? void 0 : _this$currentMask5.typedValueEquals(value));
68017
+ return Boolean(this.currentMask?.typedValueEquals(value));
67915
68018
  }
67916
68019
  }
67917
- MaskedDynamic.DEFAULTS = void 0;
67918
68020
  MaskedDynamic.DEFAULTS = {
67919
68021
  dispatch: (appended, masked, flags, tail) => {
67920
68022
  if (!masked.compiledMasks.length) return;
@@ -67953,7 +68055,6 @@ class MaskedEnum extends MaskedPattern {
67953
68055
  constructor(opts) {
67954
68056
  super(opts); // mask will be created in _update
67955
68057
  }
67956
-
67957
68058
  updateOptions(opts) {
67958
68059
  super.updateOptions(opts);
67959
68060
  }
@@ -68002,6 +68103,25 @@ IMask.MaskedFunction = MaskedFunction;
68002
68103
 
68003
68104
  /** Number mask */
68004
68105
  class MaskedNumber extends Masked {
68106
+ static UNMASKED_RADIX = '.';
68107
+ static EMPTY_VALUES = [...Masked.EMPTY_VALUES, 0];
68108
+ static DEFAULTS = {
68109
+ mask: Number,
68110
+ radix: ',',
68111
+ thousandsSeparator: '',
68112
+ mapToRadix: [MaskedNumber.UNMASKED_RADIX],
68113
+ min: Number.MIN_SAFE_INTEGER,
68114
+ max: Number.MAX_SAFE_INTEGER,
68115
+ scale: 2,
68116
+ normalizeZeros: true,
68117
+ padFractionalZeros: false,
68118
+ parse: Number,
68119
+ format: n => n.toLocaleString('en-US', {
68120
+ useGrouping: false,
68121
+ maximumFractionDigits: 20
68122
+ })
68123
+ };
68124
+
68005
68125
  /** Single char */
68006
68126
 
68007
68127
  /** Single char */
@@ -68044,9 +68164,9 @@ class MaskedNumber extends Masked {
68044
68164
  _updateRegExps() {
68045
68165
  const start = '^' + (this.allowNegative ? '[+|\\-]?' : '');
68046
68166
  const mid = '\\d*';
68047
- const end = (this.scale ? "(" + escapeRegExp(this.radix) + "\\d{0," + this.scale + "})?" : '') + '$';
68167
+ const end = (this.scale ? `(${escapeRegExp(this.radix)}\\d{0,${this.scale}})?` : '') + '$';
68048
68168
  this._numberRegExp = new RegExp(start + mid + end);
68049
- this._mapToRadixRegExp = new RegExp("[" + this.mapToRadix.map(escapeRegExp).join('') + "]", 'g');
68169
+ this._mapToRadixRegExp = new RegExp(`[${this.mapToRadix.map(escapeRegExp).join('')}]`, 'g');
68050
68170
  this._thousandsSeparatorRegExp = new RegExp(escapeRegExp(this.thousandsSeparator), 'g');
68051
68171
  }
68052
68172
  _removeThousandsSeparators(value) {
@@ -68221,7 +68341,6 @@ class MaskedNumber extends Masked {
68221
68341
  parts[1] = parts[1].replace(/0*$/, ''); // remove trailing zeros
68222
68342
  if (!parts[1].length) parts.length = 1; // remove fractional
68223
68343
  }
68224
-
68225
68344
  return this._insertThousandsSeparators(parts.join(this.radix));
68226
68345
  }
68227
68346
  _padFractionalZeros(value) {
@@ -68258,17 +68377,9 @@ class MaskedNumber extends Masked {
68258
68377
  set number(number) {
68259
68378
  this.typedValue = number;
68260
68379
  }
68261
-
68262
- /**
68263
- Is negative allowed
68264
- */
68265
68380
  get allowNegative() {
68266
68381
  return this.min != null && this.min < 0 || this.max != null && this.max < 0;
68267
68382
  }
68268
-
68269
- /**
68270
- Is positive allowed
68271
- */
68272
68383
  get allowPositive() {
68273
68384
  return this.min != null && this.min > 0 || this.max != null && this.max > 0;
68274
68385
  }
@@ -68278,24 +68389,6 @@ class MaskedNumber extends Masked {
68278
68389
  return (super.typedValueEquals(value) || MaskedNumber.EMPTY_VALUES.includes(value) && MaskedNumber.EMPTY_VALUES.includes(this.typedValue)) && !(value === 0 && this.value === '');
68279
68390
  }
68280
68391
  }
68281
- MaskedNumber.UNMASKED_RADIX = '.';
68282
- MaskedNumber.EMPTY_VALUES = [...Masked.EMPTY_VALUES, 0];
68283
- MaskedNumber.DEFAULTS = {
68284
- mask: Number,
68285
- radix: ',',
68286
- thousandsSeparator: '',
68287
- mapToRadix: [MaskedNumber.UNMASKED_RADIX],
68288
- min: Number.MIN_SAFE_INTEGER,
68289
- max: Number.MAX_SAFE_INTEGER,
68290
- scale: 2,
68291
- normalizeZeros: true,
68292
- padFractionalZeros: false,
68293
- parse: Number,
68294
- format: n => n.toLocaleString('en-US', {
68295
- useGrouping: false,
68296
- maximumFractionDigits: 20
68297
- })
68298
- };
68299
68392
  IMask.MaskedNumber = MaskedNumber;
68300
68393
 
68301
68394
  /** Mask pipe source and destination types */
@@ -68327,6 +68420,124 @@ IMask.PIPE_TYPE = PIPE_TYPE;
68327
68420
  IMask.createPipe = createPipe;
68328
68421
  IMask.pipe = pipe;
68329
68422
 
68423
+ /** Pattern mask */
68424
+ class RepeatBlock extends MaskedPattern {
68425
+ get repeatFrom() {
68426
+ return (Array.isArray(this.repeat) ? this.repeat[0] : this.repeat === Infinity ? 0 : this.repeat) ?? 0;
68427
+ }
68428
+ get repeatTo() {
68429
+ return (Array.isArray(this.repeat) ? this.repeat[1] : this.repeat) ?? Infinity;
68430
+ }
68431
+ constructor(opts) {
68432
+ super(opts);
68433
+ }
68434
+ updateOptions(opts) {
68435
+ super.updateOptions(opts);
68436
+ }
68437
+ _update(opts) {
68438
+ const {
68439
+ repeat,
68440
+ ...blockOpts
68441
+ } = normalizeOpts(opts); // TODO type
68442
+ this._blockOpts = Object.assign({}, this._blockOpts, blockOpts);
68443
+ const block = createMask(this._blockOpts);
68444
+ this.repeat = repeat ?? block.repeat ?? this.repeat ?? Infinity; // TODO type
68445
+
68446
+ super._update({
68447
+ mask: 'm'.repeat(Math.max(this.repeatTo === Infinity && this._blocks?.length || 0, this.repeatFrom)),
68448
+ blocks: {
68449
+ m: block
68450
+ },
68451
+ eager: block.eager,
68452
+ overwrite: block.overwrite,
68453
+ skipInvalid: block.skipInvalid,
68454
+ lazy: block.lazy,
68455
+ placeholderChar: block.placeholderChar,
68456
+ displayChar: block.displayChar
68457
+ });
68458
+ }
68459
+ _allocateBlock(bi) {
68460
+ if (bi < this._blocks.length) return this._blocks[bi];
68461
+ if (this.repeatTo === Infinity || this._blocks.length < this.repeatTo) {
68462
+ this._blocks.push(createMask(this._blockOpts));
68463
+ this.mask += 'm';
68464
+ return this._blocks[this._blocks.length - 1];
68465
+ }
68466
+ }
68467
+ _appendCharRaw(ch, flags) {
68468
+ if (flags === void 0) {
68469
+ flags = {};
68470
+ }
68471
+ const details = new ChangeDetails();
68472
+ for (let bi = this._mapPosToBlock(this.displayValue.length)?.index ?? Math.max(this._blocks.length - 1, 0), block, allocated;
68473
+ // try to get a block or
68474
+ // try to allocate a new block if not allocated already
68475
+ block = this._blocks[bi] ?? (allocated = !allocated && this._allocateBlock(bi)); ++bi) {
68476
+ const blockDetails = block._appendChar(ch, {
68477
+ ...flags,
68478
+ _beforeTailState: flags._beforeTailState?._blocks?.[bi]
68479
+ });
68480
+ if (blockDetails.skip && allocated) {
68481
+ // remove the last allocated block and break
68482
+ this._blocks.pop();
68483
+ this.mask = this.mask.slice(1);
68484
+ break;
68485
+ }
68486
+ details.aggregate(blockDetails);
68487
+ if (blockDetails.skip || blockDetails.rawInserted) break; // go next char
68488
+ }
68489
+ return details;
68490
+ }
68491
+ _trimEmptyTail(fromPos, toPos) {
68492
+ if (fromPos === void 0) {
68493
+ fromPos = 0;
68494
+ }
68495
+ const firstBlockIndex = Math.max(this._mapPosToBlock(fromPos)?.index || 0, this.repeatFrom, 0);
68496
+ let lastBlockIndex;
68497
+ if (toPos != null) lastBlockIndex = this._mapPosToBlock(toPos)?.index;
68498
+ if (lastBlockIndex == null) lastBlockIndex = this._blocks.length - 1;
68499
+ let removeCount = 0;
68500
+ for (let blockIndex = lastBlockIndex; firstBlockIndex <= blockIndex; --blockIndex, ++removeCount) {
68501
+ if (this._blocks[blockIndex].unmaskedValue) break;
68502
+ }
68503
+ if (removeCount) {
68504
+ this._blocks.splice(lastBlockIndex - removeCount + 1, removeCount);
68505
+ this.mask = this.mask.slice(removeCount);
68506
+ }
68507
+ }
68508
+ reset() {
68509
+ super.reset();
68510
+ this._trimEmptyTail();
68511
+ }
68512
+ remove(fromPos, toPos) {
68513
+ if (fromPos === void 0) {
68514
+ fromPos = 0;
68515
+ }
68516
+ if (toPos === void 0) {
68517
+ toPos = this.displayValue.length;
68518
+ }
68519
+ const removeDetails = super.remove(fromPos, toPos);
68520
+ this._trimEmptyTail(fromPos, toPos);
68521
+ return removeDetails;
68522
+ }
68523
+ totalInputPositions(fromPos, toPos) {
68524
+ if (fromPos === void 0) {
68525
+ fromPos = 0;
68526
+ }
68527
+ if (toPos == null && this.repeatTo === Infinity) return Infinity;
68528
+ return super.totalInputPositions(fromPos, toPos);
68529
+ }
68530
+ get state() {
68531
+ return super.state;
68532
+ }
68533
+ set state(state) {
68534
+ this._blocks.length = state._blocks.length;
68535
+ this.mask = this.mask.slice(0, this._blocks.length);
68536
+ super.state = state;
68537
+ }
68538
+ }
68539
+ IMask.RepeatBlock = RepeatBlock;
68540
+
68330
68541
  try {
68331
68542
  globalThis.IMask = IMask;
68332
68543
  } catch {}
@@ -70420,6 +70631,15 @@ var Mission;
70420
70631
  })(Mission.MissionSourceEnum || (Mission.MissionSourceEnum = {}));
70421
70632
  })(Mission || (Mission = {}));
70422
70633
 
70634
+ function useDeepCompareEffect(effect, deps) {
70635
+ const previousValue = usePrevious(deps);
70636
+ const isDifferent = !fp.isEqual(previousValue, deps);
70637
+ // eslint-disable-next-line react-hooks/exhaustive-deps
70638
+ useEffect(effect, [
70639
+ isDifferent
70640
+ ]);
70641
+ }
70642
+
70423
70643
  function useFieldControl(value, onChange, defaultValueWhenUndefined) {
70424
70644
  const previousValue = usePrevious(value);
70425
70645
  const [internalValue, setInternalValue] = useState(value);
@@ -76443,5 +76663,5 @@ const undefineObjectPropPair = ([key, value])=>[
76443
76663
  return value;
76444
76664
  }
76445
76665
 
76446
- export { Accent, Button$1 as Button, CheckPicker, Checkbox, ControlUnit, CoordinatesFormat, CoordinatesInput, CustomSearch, DataTable, DatePicker, DateRangePicker, Dialog, Dropdown, ExclamationPoint, Field$2 as Field, FieldError, Fieldset, FormikCheckbox, FormikCoordinatesInput, FormikDatePicker, FormikDateRangePicker, FormikEffect, FormikMultiCheckbox, FormikMultiRadio, FormikMultiSelect, FormikNumberInput, FormikSearch, FormikSelect, FormikTextInput, FormikTextarea, GlobalStyle, index as Icon, IconButton, Label, Legend, Level, MapMenuDialog, Message, Mission, MultiCheckbox, MultiRadio, MultiSelect, MultiZoneEditor, NewWindow, NewWindowContext, NotificationEvent, Notifier, NumberInput, OPENLAYERS_PROJECTION, OnlyFontGlobalStyle, Search, Select, SideMenu, SimpleTable, SingleTag, Size, THEME, TableWithSelectableRows, Tag, TagBullet, TagGroup, TextInput, Textarea, ThemeProvider, WSG84_PROJECTION, cleanString, coordinatesAreDistinct, customDayjs, getCoordinates, getHashFromCollection, getLocalizedDayjs, getOptionsFromIdAndName, getOptionsFromLabelledEnum, getPseudoRandomString, getUtcizedDayjs, isArray, isDefined, isEmptyish, isNumeric, isObject, logSoftError, normalizeString, nullify, pluralize, sortCollectionByLocalizedProps, stopMouseEventPropagation, undefine, useClickOutsideEffect, useFieldControl, useForceUpdate, useKey, useNewWindow, usePrevious };
76666
+ export { Accent, Button$1 as Button, CheckPicker, Checkbox, ControlUnit, CoordinatesFormat, CoordinatesInput, CustomSearch, DataTable, DatePicker, DateRangePicker, Dialog, Dropdown, ExclamationPoint, Field$2 as Field, FieldError, Fieldset, FormikCheckbox, FormikCoordinatesInput, FormikDatePicker, FormikDateRangePicker, FormikEffect, FormikMultiCheckbox, FormikMultiRadio, FormikMultiSelect, FormikNumberInput, FormikSearch, FormikSelect, FormikTextInput, FormikTextarea, GlobalStyle, index as Icon, IconButton, Label, Legend, Level, MapMenuDialog, Message, Mission, MultiCheckbox, MultiRadio, MultiSelect, MultiZoneEditor, NewWindow, NewWindowContext, NotificationEvent, Notifier, NumberInput, OPENLAYERS_PROJECTION, OnlyFontGlobalStyle, Search, Select, SideMenu, SimpleTable, SingleTag, Size, THEME, TableWithSelectableRows, Tag, TagBullet, TagGroup, TextInput, Textarea, ThemeProvider, WSG84_PROJECTION, cleanString, coordinatesAreDistinct, customDayjs, getCoordinates, getHashFromCollection, getLocalizedDayjs, getOptionsFromIdAndName, getOptionsFromLabelledEnum, getPseudoRandomString, getUtcizedDayjs, isArray, isDefined, isEmptyish, isNumeric, isObject, logSoftError, normalizeString, nullify, pluralize, sortCollectionByLocalizedProps, stopMouseEventPropagation, undefine, useClickOutsideEffect, useDeepCompareEffect, useFieldControl, useForceUpdate, useKey, useNewWindow, usePrevious };
76447
76667
  //# sourceMappingURL=index.js.map