stimeo-ui 0.18.0 → 0.18.1

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 (33) hide show
  1. package/CHANGELOG.md +31 -2
  2. package/dist/cable/index.d.ts +2 -1
  3. package/dist/controllers/command_palette_controller.js +1 -0
  4. package/dist/controllers/command_palette_controller.js.map +1 -1
  5. package/dist/controllers/dismissible_controller.js +2 -0
  6. package/dist/controllers/dismissible_controller.js.map +1 -1
  7. package/dist/controllers/editable_controller.js +1 -0
  8. package/dist/controllers/editable_controller.js.map +1 -1
  9. package/dist/controllers/form_field_controller.d.ts +2 -1
  10. package/dist/controllers/input_mask_controller.d.ts +2 -1
  11. package/dist/controllers/input_mask_controller.js +23 -0
  12. package/dist/controllers/input_mask_controller.js.map +1 -1
  13. package/dist/controllers/multi_select_controller.d.ts +2 -1
  14. package/dist/controllers/multi_select_controller.js +21 -1
  15. package/dist/controllers/multi_select_controller.js.map +1 -1
  16. package/dist/controllers/pointer_drag_controller.d.ts +1 -0
  17. package/dist/controllers/pointer_drag_controller.js +6 -1
  18. package/dist/controllers/pointer_drag_controller.js.map +1 -1
  19. package/dist/controllers/popover_controller.d.ts +6 -2
  20. package/dist/controllers/popover_controller.js +9 -0
  21. package/dist/controllers/popover_controller.js.map +1 -1
  22. package/dist/index.d.ts +2 -1
  23. package/dist/index.js +63 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/inspector/cli.d.ts +10 -1
  26. package/dist/inspector/cli.js +5 -0
  27. package/dist/inspector/cli.js.map +1 -1
  28. package/dist/inspector/cli_bin.d.ts +1 -1
  29. package/dist/inspector/cli_bin.js +9 -0
  30. package/dist/inspector/cli_bin.js.map +1 -1
  31. package/dist/inspector/manifest.json +2 -2
  32. package/dist/positioning/index.d.ts +2 -1
  33. package/package.json +5 -5
package/dist/index.js CHANGED
@@ -5735,6 +5735,7 @@ var CommandPaletteController = class _CommandPaletteController extends Controlle
5735
5735
  return this.hasDialogTarget && !this.dialogTarget.hidden;
5736
5736
  }
5737
5737
  #onGlobalKeydown = (event) => {
5738
+ if (event.defaultPrevented) return;
5738
5739
  if (this.#composition.isComposing(event) || !this.#matchesHotkey(event)) return;
5739
5740
  event.preventDefault();
5740
5741
  this.toggle();
@@ -9037,6 +9038,8 @@ var DismissibleController = class extends Controller {
9037
9038
  if (document.activeElement === candidate) return;
9038
9039
  }
9039
9040
  document.body.focus();
9041
+ const remaining = document.activeElement;
9042
+ if (remaining instanceof HTMLElement && root.contains(remaining)) remaining.blur();
9040
9043
  }
9041
9044
  *#focusFallbacks(root) {
9042
9045
  const explicitFallback = this.hasFallbackTarget ? this.fallbackTarget : null;
@@ -9482,6 +9485,7 @@ var EditableController = class extends Controller {
9482
9485
  this.#revertValue = null;
9483
9486
  }
9484
9487
  onDisplayKeydown(event) {
9488
+ if (event.defaultPrevented) return;
9485
9489
  if (event.key === "F2") {
9486
9490
  event.preventDefault();
9487
9491
  this.edit();
@@ -11666,6 +11670,27 @@ var InputMaskController = class extends Controller {
11666
11670
  #textBeforeComposition = "";
11667
11671
  #formatted = null;
11668
11672
  #shown = { result: null, empty: true };
11673
+ #edits = new ListenerSet();
11674
+ #onBeforeInput = (event) => {
11675
+ const data = event.data;
11676
+ if (event.defaultPrevented || !event.cancelable || event.inputType !== "insertText" || data === null || Array.from(data).length !== 1 || !this.#started || this.#composition.isComposing(event))
11677
+ return;
11678
+ const input = this.element;
11679
+ const start = input.selectionStart;
11680
+ const end = input.selectionEnd;
11681
+ if (start === null || end === null || start === end || input.readOnly || input.disabled || inheritsFieldsetDisabled(input) || !input.isConnected || !this.application.element.contains(input) || !(input.getAttribute("data-controller") ?? "").split(/\s+/).includes(this.identifier) || this.patternValue === "" || this.#formatted !== this.#declared || input.value !== this.#lastValue)
11682
+ return;
11683
+ const prefix = applyMask(input.value.slice(0, start), this.patternValue, this.#tokens);
11684
+ for (const character of Array.from(this.patternValue).slice(prefix.tokenFlags.length)) {
11685
+ const token = this.#tokens.get(character);
11686
+ if (token) {
11687
+ if (acceptedForm(token, data) === null) event.preventDefault();
11688
+ return;
11689
+ }
11690
+ if (halfWidthChar(data) === halfWidthChar(character)) return;
11691
+ }
11692
+ event.preventDefault();
11693
+ };
11669
11694
  #composition = new CompositionTracker({
11670
11695
  onStart: () => {
11671
11696
  this.#textBeforeComposition = this.element.value;
@@ -11701,6 +11726,7 @@ var InputMaskController = class extends Controller {
11701
11726
  this.#morph.observe(this.element);
11702
11727
  this.#started = true;
11703
11728
  this.#composition.observe(this.element);
11729
+ this.#edits.add(this.element, "beforeinput", this.#onBeforeInput);
11704
11730
  if (!this.unmaskToHiddenValue) this.#withdraw();
11705
11731
  if (this.#composition.isComposing()) {
11706
11732
  this.#reformat("reconcile");
@@ -11715,6 +11741,7 @@ var InputMaskController = class extends Controller {
11715
11741
  disconnect() {
11716
11742
  this.#morph.disconnect();
11717
11743
  this.#started = false;
11744
+ this.#edits.dispose();
11718
11745
  this.#composition.disconnect();
11719
11746
  this.#adoption.clearAll();
11720
11747
  this.#gate.disconnected(this, () => this.#retractRaw());
@@ -13885,7 +13912,9 @@ var MultiSelectController = class _MultiSelectController extends Controller {
13885
13912
  focusAfterEnd: () => this.#focusInput()
13886
13913
  });
13887
13914
  #listeners = new ListenerSet();
13915
+ #tab = null;
13888
13916
  connect() {
13917
+ this.#tab = null;
13889
13918
  this.#tabindex.reclaim(this.element);
13890
13919
  this.#rows.connect();
13891
13920
  this.#normalizeSelection([]);
@@ -13897,6 +13926,9 @@ var MultiSelectController = class _MultiSelectController extends Controller {
13897
13926
  this.#selectionValues = this.#values;
13898
13927
  this.#syncFields();
13899
13928
  this.#listeners.add(document, "click", this.#onOutsideClick, { capture: true });
13929
+ this.#listeners.add(this.element, "keydown", this.#onTab);
13930
+ for (const type of ["focus", "keydown", "keyup", "pointerdown"])
13931
+ this.#listeners.add(document, type, this.#trackTab, { capture: true });
13900
13932
  this.#connected = true;
13901
13933
  this.#reconcile.observe(this.element);
13902
13934
  }
@@ -13918,6 +13950,7 @@ var MultiSelectController = class _MultiSelectController extends Controller {
13918
13950
  this.#composition.disconnect();
13919
13951
  this.#chipRow.disconnect();
13920
13952
  this.#listeners.dispose();
13953
+ this.#tab = null;
13921
13954
  this.#releaseTabindex();
13922
13955
  }
13923
13956
  optionTargetConnected() {
@@ -14087,7 +14120,11 @@ var MultiSelectController = class _MultiSelectController extends Controller {
14087
14120
  this.#setActive(visible[0] ?? null);
14088
14121
  this.dispatch("filter", { detail: { query } });
14089
14122
  }
14090
- open() {
14123
+ open(event) {
14124
+ if (event instanceof FocusEvent && event === this.#tab) {
14125
+ this.#tab = null;
14126
+ return;
14127
+ }
14091
14128
  if (!this.hasListTarget || !this.hasInputTarget) {
14092
14129
  this.#reflectEmpty();
14093
14130
  return;
@@ -14174,6 +14211,16 @@ var MultiSelectController = class _MultiSelectController extends Controller {
14174
14211
  break;
14175
14212
  }
14176
14213
  }
14214
+ #onTab = (event) => {
14215
+ if (event.key !== "Tab" || event.defaultPrevented || event.isComposing || !this.hasTagsTarget || !this.tagsTarget.contains(event.target))
14216
+ return;
14217
+ this.#tab = event;
14218
+ this.close();
14219
+ };
14220
+ #trackTab = (event) => {
14221
+ const key = this.#tab;
14222
+ this.#tab = event.type === "focus" && key instanceof KeyboardEvent && !key.defaultPrevented && event.target === this.inputTargets[0] ? event : null;
14223
+ };
14177
14224
  toggleOption(source) {
14178
14225
  const { event, host, origin, reason } = actionSource(source);
14179
14226
  if (origin && origin.closest(`[data-controller~="${this.identifier}"]`) !== this.element)
@@ -17986,6 +18033,7 @@ var PointerDragController = class _PointerDragController extends Controller {
17986
18033
  #tabindex = new TabindexLoan("0", this.identifier, { preserveFocus: true });
17987
18034
  #pointer = null;
17988
18035
  #keyboard = null;
18036
+ #connected = false;
17989
18037
  #keyboardFocusSession = null;
17990
18038
  #listeners = new ListenerSet();
17991
18039
  #shadowFocus = new ListenerSet();
@@ -17999,6 +18047,7 @@ var PointerDragController = class _PointerDragController extends Controller {
17999
18047
  this.#reflectSession();
18000
18048
  });
18001
18049
  connect() {
18050
+ this.#connected = true;
18002
18051
  this.#morphRender.observe(this.element);
18003
18052
  if (!this.#pointer && !this.#keyboard) this.#followOutput = null;
18004
18053
  this.#gate.cancel();
@@ -18016,6 +18065,7 @@ var PointerDragController = class _PointerDragController extends Controller {
18016
18065
  }
18017
18066
  }
18018
18067
  disconnect() {
18068
+ this.#connected = false;
18019
18069
  this.#morphRender.disconnect();
18020
18070
  this.#listeners.dispose();
18021
18071
  this.#shadowFocus.dispose();
@@ -18042,7 +18092,9 @@ var PointerDragController = class _PointerDragController extends Controller {
18042
18092
  }
18043
18093
  handleTargetDisconnected(handle) {
18044
18094
  this.#restoreHandle(handle);
18045
- if (this.element.contains(handle)) return;
18095
+ if (!this.#connected) return;
18096
+ if (this.element.contains(handle) && (this.handleTargets.includes(handle) || DetachGate.isDetached(this)))
18097
+ return;
18046
18098
  const interrupted = this.#pointer?.handle === handle && this.#pointer.started ? this.#pointer.pointerType : this.#keyboard?.handle === handle ? "keyboard" : null;
18047
18099
  if (this.#pointer?.handle === handle) this.#endPointerSession();
18048
18100
  if (this.#keyboard?.handle === handle) this.#clearKeyboardSession();
@@ -18397,6 +18449,7 @@ var PopoverController = class extends Controller {
18397
18449
  this.#close("api");
18398
18450
  this.#listeners.add(document, "click", this.#onOutsideClick, { capture: true });
18399
18451
  this.#listeners.add(this.element, "focusout", this.#onFocusOut);
18452
+ this.#listeners.add(document, "focusin", this.#onDocumentFocusIn, { capture: true });
18400
18453
  this.#connected = true;
18401
18454
  this.#reporting = true;
18402
18455
  }
@@ -18503,6 +18556,14 @@ var PopoverController = class extends Controller {
18503
18556
  if (!(next instanceof Node) || this.element.contains(next)) return;
18504
18557
  this.#close("focus");
18505
18558
  };
18559
+ #onDocumentFocusIn = (event) => {
18560
+ if (!this.#closable) return;
18561
+ const target = event.target;
18562
+ if (!(target instanceof Node) || target === document.body || this.element.contains(target)) {
18563
+ return;
18564
+ }
18565
+ this.#close("focus");
18566
+ };
18506
18567
  get #isOpen() {
18507
18568
  return this.hasPanelTarget && !this.panelTarget.hidden;
18508
18569
  }