@stimulus-plumbers/controllers 0.3.1 → 0.3.3

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/README.md CHANGED
@@ -25,8 +25,8 @@ Register the controllers you need with your Stimulus application:
25
25
  import { Application } from '@hotwired/stimulus'
26
26
  import {
27
27
  InputComboboxController,
28
- InputFormatController,
29
- InputSearchController,
28
+ InputFormatterController,
29
+ InputClearableController,
30
30
  ComboboxDateController,
31
31
  ComboboxTimeController,
32
32
  ComboboxDropdownController,
@@ -43,8 +43,8 @@ import {
43
43
  const application = Application.start()
44
44
 
45
45
  application.register('input-combobox', InputComboboxController)
46
- application.register('input-format', InputFormatController)
47
- application.register('input-search', InputSearchController)
46
+ application.register('input-formatter', InputFormatterController)
47
+ application.register('input-clearable', InputClearableController)
48
48
  application.register('combobox-date', ComboboxDateController)
49
49
  application.register('combobox-time', ComboboxTimeController)
50
50
  application.register('combobox-dropdown', ComboboxDropdownController)
@@ -63,8 +63,8 @@ application.register('panner', PannerController)
63
63
  | Controller | Description | Docs |
64
64
  |-----------|-------------|------|
65
65
  | `input-combobox` | Wrapper: trigger, popover, hidden value | [docs/component/combobox.md](docs/component/combobox.md#input-combobox) |
66
- | `input-format` | Formats and displays values | [docs/component/combobox.md](docs/component/combobox.md#input-format) |
67
- | `input-search` | Search input with clear button | [docs/component/input-search.md](docs/component/input-search.md) |
66
+ | `input-formatter` | Formats and displays values | [docs/component/combobox.md](docs/component/combobox.md#input-formatter) |
67
+ | `input-clearable` | Input with clear button | [docs/component/input-clearable.md](docs/component/input-clearable.md) |
68
68
  | `combobox-date` | Calendar grid date picker | [docs/component/combobox.md](docs/component/combobox.md#combobox-date) |
69
69
  | `combobox-time` | Drum/scroll-wheel time picker | [docs/component/combobox.md](docs/component/combobox.md#combobox-time) |
70
70
  | `combobox-dropdown` | Listbox with fuzzy filter or server fetch | [docs/component/combobox.md](docs/component/combobox.md#combobox-dropdown) |
@@ -490,17 +490,22 @@ var de = /\D/g, fe = /^\d{13,19}$/, pe = /(.{4})(?=.)/g, me = {
490
490
  configurable: !0
491
491
  });
492
492
  }
493
- }, U = (e, t) => new H(e, t);
494
- //#endregion
495
- //#region src/plumbers/plumber/date.js
493
+ }, U = (e, t) => new H(e, t), xe = /^\d{4}-\d{2}-\d{2}$/;
496
494
  function W(e) {
497
495
  return e instanceof Date && !isNaN(e);
498
496
  }
499
497
  function G(...e) {
500
498
  if (e.length === 0) throw "Missing values to parse as date";
501
499
  if (e.length === 1) {
502
- let t = new Date(e[0]);
503
- if (e[0] && W(t)) return t;
500
+ let t = e[0];
501
+ if (!t) return;
502
+ if (typeof t == "string" && xe.test(t)) {
503
+ let [e, n, r] = t.split("-").map(Number), i = new Date(e, n - 1, r);
504
+ if (W(i)) return i;
505
+ } else {
506
+ let e = new Date(t);
507
+ if (W(e)) return e;
508
+ }
504
509
  } else {
505
510
  let t = new Date(...e);
506
511
  if (W(t)) return t;
@@ -523,7 +528,7 @@ var K = 7, q = {
523
528
  disabledYears: [],
524
529
  firstDayOfWeek: 0,
525
530
  onNavigated: "navigated"
526
- }, xe = class extends j {
531
+ }, Se = class extends j {
527
532
  constructor(e, t = {}) {
528
533
  super(e, t);
529
534
  let n = Object.assign({}, q, t), { onNavigated: r, since: i, till: a, firstDayOfWeek: o } = n;
@@ -593,8 +598,8 @@ var K = 7, q = {
593
598
  }
594
599
  set today(e) {
595
600
  if (!W(e)) return;
596
- let t = this.month ? this.month : e.getMonth(), n = this.year ? this.year : e.getFullYear(), r = t == e.getMonth() && n == e.getFullYear(), i = this.hasDayValue ? this.day : r ? e.getDate() : 1;
597
- this.now = new Date(n, t, i).toISOString();
601
+ let t = this.month ?? e.getMonth(), n = this.year ?? e.getFullYear(), r = t == e.getMonth() && n == e.getFullYear() ? e.getDate() : 1;
602
+ this.now = new Date(n, t, r);
598
603
  }
599
604
  get current() {
600
605
  return typeof this.year == "number" && typeof this.month == "number" && typeof this.day == "number" ? G(this.year, this.month, this.day) : null;
@@ -727,14 +732,14 @@ var K = 7, q = {
727
732
  };
728
733
  } });
729
734
  }
730
- }, Se = (e, t) => new xe(e, t), J = {
735
+ }, Ce = (e, t) => new Se(e, t), J = {
731
736
  content: null,
732
737
  url: "",
733
738
  reload: "never",
734
739
  stale: 3600,
735
740
  onLoad: "canLoad",
736
741
  onLoaded: "contentLoaded"
737
- }, Ce = class extends j {
742
+ }, we = class extends j {
738
743
  constructor(e, t = {}) {
739
744
  super(e, t);
740
745
  let n = Object.assign({}, J, t), { content: r, url: i, reload: a, stale: o } = n;
@@ -773,7 +778,7 @@ var K = 7, q = {
773
778
  let e = this;
774
779
  Object.assign(this.controller, { load: e.load.bind(e) });
775
780
  }
776
- }, we = (e, t) => new Ce(e, t), Y = class extends j {
781
+ }, Te = (e, t) => new we(e, t), Y = class extends j {
777
782
  observe(e) {
778
783
  this._handler = e, this.events.forEach((t) => window.addEventListener(t, e, !0));
779
784
  }
@@ -786,21 +791,21 @@ var K = 7, q = {
786
791
  e.unobserve(), t();
787
792
  };
788
793
  }
789
- }, Te = {
794
+ }, Ee = {
790
795
  trigger: null,
791
796
  events: ["click"],
792
797
  onDismissed: "dismissed"
793
- }, Ee = class extends Y {
798
+ }, De = class extends Y {
794
799
  constructor(e, t = {}) {
795
800
  super(e, t);
796
- let { trigger: n, events: r, onDismissed: i } = Object.assign({}, Te, t);
801
+ let { trigger: n, events: r, onDismissed: i } = Object.assign({}, Ee, t);
797
802
  this.onDismissed = i, this.trigger = n || this.element, this.events = r, this.enhance(), this.observe(this.dismiss);
798
803
  }
799
804
  dismiss = async (e) => {
800
805
  let { target: t } = e;
801
806
  t instanceof HTMLElement && (this.element.contains(t) || this.visible && (this.dispatch("dismiss"), await this.awaitCallback(this.onDismissed, { target: this.trigger }), this.dispatch("dismissed")));
802
807
  };
803
- }, X = (e, t) => new Ee(e, t), De = {
808
+ }, X = (e, t) => new De(e, t), Oe = {
804
809
  anchor: null,
805
810
  events: ["click"],
806
811
  placement: "bottom",
@@ -808,10 +813,10 @@ var K = 7, q = {
808
813
  onFlipped: "flipped",
809
814
  ariaRole: null,
810
815
  respectMotion: !0
811
- }, Oe = class extends Y {
816
+ }, ke = class extends Y {
812
817
  constructor(e, t = {}) {
813
818
  super(e, t);
814
- let { anchor: n, events: r, placement: i, alignment: a, onFlipped: o, ariaRole: s, respectMotion: c } = Object.assign({}, De, t);
819
+ let { anchor: n, events: r, placement: i, alignment: a, onFlipped: o, ariaRole: s, respectMotion: c } = Object.assign({}, Oe, t);
815
820
  this.anchor = n, this.events = r, this.placement = i, this.alignment = a, this.onFlipped = o, this.ariaRole = s, this.respectMotion = c, this.prefersReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches, this.anchor && this.element && S({
816
821
  trigger: this.anchor,
817
822
  target: this.element,
@@ -927,7 +932,7 @@ var K = 7, q = {
927
932
  enhance() {
928
933
  super.enhance(), this.controller.flip = this.flip;
929
934
  }
930
- }, ke = (e, t) => new Oe(e, t), Ae = {
935
+ }, Ae = (e, t) => new ke(e, t), je = {
931
936
  events: ["resize"],
932
937
  boundaries: [
933
938
  "top",
@@ -936,10 +941,10 @@ var K = 7, q = {
936
941
  ],
937
942
  onShifted: "shifted",
938
943
  respectMotion: !0
939
- }, je = class extends Y {
944
+ }, Me = class extends Y {
940
945
  constructor(e, t = {}) {
941
946
  super(e, t);
942
- let { onShifted: n, events: r, boundaries: i, respectMotion: a } = Object.assign({}, Ae, t);
947
+ let { onShifted: n, events: r, boundaries: i, respectMotion: a } = Object.assign({}, je, t);
943
948
  this.onShifted = n, this.events = r, this.boundaries = i, this.respectMotion = a, this.prefersReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches, this.enhance(), this.observe(this.shift);
944
949
  }
945
950
  shift = async () => {
@@ -988,11 +993,11 @@ var K = 7, q = {
988
993
  enhance() {
989
994
  super.enhance(), this.controller.shift = this.shift;
990
995
  }
991
- }, Me = (e, t) => new je(e, t), Z = {
996
+ }, Ne = (e, t) => new Me(e, t), Z = {
992
997
  visibility: "visibility",
993
998
  onShown: "shown",
994
999
  onHidden: "hidden"
995
- }, Ne = class extends j {
1000
+ }, Pe = class extends j {
996
1001
  constructor(e, t = {}) {
997
1002
  let { visibility: n, onShown: r, onHidden: i, activator: a } = Object.assign({}, Z, t), o = typeof n == "string" ? n : Z.namespace, s = typeof t.visible == "string" ? t.visible : "isVisible";
998
1003
  (typeof t.visible != "boolean" || t.visible) && (t.visible = `${o}.${s}`), super(e, t), this.visibility = o, this.visibilityResolver = s, this.onShown = r, this.onHidden = i, this.activator = a instanceof HTMLElement ? a : null, this.enhance(), this.element instanceof HTMLElement && this.activate(this.isVisible(this.element));
@@ -1027,7 +1032,7 @@ var K = 7, q = {
1027
1032
  return t;
1028
1033
  } });
1029
1034
  }
1030
- }, Q = (e, t) => new Ne(e, t), Pe = class extends e {
1035
+ }, Q = (e, t) => new Pe(e, t), $ = class extends e {
1031
1036
  static targets = ["daysOfWeek", "daysOfMonth"];
1032
1037
  static classes = [
1033
1038
  "dayOfWeek",
@@ -1050,10 +1055,18 @@ var K = 7, q = {
1050
1055
  daysOfOtherMonth: {
1051
1056
  type: Boolean,
1052
1057
  default: !1
1058
+ },
1059
+ today: {
1060
+ type: String,
1061
+ default: ""
1062
+ },
1063
+ selected: {
1064
+ type: String,
1065
+ default: ""
1053
1066
  }
1054
1067
  };
1055
1068
  initialize() {
1056
- Se(this);
1069
+ Ce(this, { today: this.todayValue });
1057
1070
  }
1058
1071
  connect() {
1059
1072
  this.draw();
@@ -1061,8 +1074,21 @@ var K = 7, q = {
1061
1074
  navigated() {
1062
1075
  this.draw();
1063
1076
  }
1077
+ selectedValueChanged() {
1078
+ if (!this.hasDaysOfMonthTarget || (this.daysOfMonthTarget.querySelectorAll("[aria-selected]").forEach((e) => {
1079
+ e.setAttribute("aria-selected", "false");
1080
+ }), !this.selectedValue)) return;
1081
+ let e = G(this.selectedValue);
1082
+ if (!e) return;
1083
+ let t = this.daysOfMonthTarget.querySelector(`time[datetime="${e.toISOString()}"]`);
1084
+ t && t.closest("[aria-selected]").setAttribute("aria-selected", "true");
1085
+ }
1086
+ onSelect(e) {
1087
+ let t = e.detail?.iso;
1088
+ t && (this.selectedValue = t);
1089
+ }
1064
1090
  draw() {
1065
- this.drawDaysOfWeek(), this.drawDaysOfMonth();
1091
+ this.drawDaysOfWeek(), this.drawDaysOfMonth(), this.selectedValueChanged();
1066
1092
  }
1067
1093
  createDayElement(e, { selectable: t = !1, disabled: n = !1 } = {}) {
1068
1094
  let r = document.createElement(t ? "button" : "div");
@@ -1086,7 +1112,7 @@ var K = 7, q = {
1086
1112
  selectable: e.current,
1087
1113
  disabled: r
1088
1114
  });
1089
- t === e.date.getTime() && a.setAttribute("aria-current", "date"), this.hasDayOfMonthClass && a.classList.add(...this.dayOfMonthClasses);
1115
+ t === e.date.getTime() && a.setAttribute("aria-current", "date"), (e.current || this.daysOfOtherMonthValue) && a.setAttribute("aria-selected", ""), this.hasDayOfMonthClass && a.classList.add(...this.dayOfMonthClasses);
1090
1116
  let o = document.createElement("time");
1091
1117
  o.dateTime = e.iso, a.appendChild(o), n.push(a);
1092
1118
  }
@@ -1121,12 +1147,12 @@ var K = 7, q = {
1121
1147
  }
1122
1148
  }, Ie = class extends e {
1123
1149
  static targets = ["source"];
1124
- static values = { type: {
1150
+ static values = { contentType: {
1125
1151
  type: String,
1126
1152
  default: "text/plain"
1127
1153
  } };
1128
1154
  onPaste(e) {
1129
- let t = e.clipboardData?.getData(this.typeValue) ?? "", n = Array.from(e.clipboardData?.types ?? []);
1155
+ let t = e.clipboardData?.getData(this.contentTypeValue) ?? "", n = Array.from(e.clipboardData?.types ?? []);
1130
1156
  e.preventDefault(), this.dispatch("pasted", {
1131
1157
  detail: {
1132
1158
  text: t,
@@ -1229,7 +1255,7 @@ var K = 7, q = {
1229
1255
  let { year: e } = this.calendarMonthOutlet.calendar;
1230
1256
  this.yearTarget.textContent = new Intl.DateTimeFormat(this.localesValue, { year: this.yearFormatValue }).format(new Date(e, 0));
1231
1257
  }
1232
- }, $ = class extends e {
1258
+ }, Re = class extends e {
1233
1259
  static targets = [
1234
1260
  "listbox",
1235
1261
  "loading",
@@ -1310,7 +1336,7 @@ var K = 7, q = {
1310
1336
  disconnect() {
1311
1337
  this._requestor.cancel();
1312
1338
  }
1313
- }, Re = class extends e {
1339
+ }, ze = class extends e {
1314
1340
  static targets = [
1315
1341
  "hour",
1316
1342
  "minute",
@@ -1346,12 +1372,12 @@ var K = 7, q = {
1346
1372
  selectedValue(e) {
1347
1373
  return e?.querySelector("[aria-selected=\"true\"]")?.dataset.value ?? null;
1348
1374
  }
1349
- }, ze = class extends e {
1375
+ }, Be = class extends e {
1350
1376
  static targets = ["trigger"];
1351
1377
  connect() {
1352
1378
  X(this, { trigger: this.hasTriggerTarget ? this.triggerTarget : null });
1353
1379
  }
1354
- }, Be = class extends e {
1380
+ }, Ve = class extends e {
1355
1381
  static targets = ["anchor", "reference"];
1356
1382
  static values = {
1357
1383
  placement: {
@@ -1376,7 +1402,7 @@ var K = 7, q = {
1376
1402
  console.error("FlipperController requires an anchor target. Add data-flipper-target=\"anchor\" to your element.");
1377
1403
  return;
1378
1404
  }
1379
- ke(this, {
1405
+ Ae(this, {
1380
1406
  element: this.referenceTarget,
1381
1407
  anchor: this.anchorTarget,
1382
1408
  placement: this.placementValue,
@@ -1384,11 +1410,11 @@ var K = 7, q = {
1384
1410
  ariaRole: this.roleValue
1385
1411
  });
1386
1412
  }
1387
- }, Ve = class extends e {
1413
+ }, He = class extends e {
1388
1414
  static targets = [
1389
1415
  "trigger",
1390
1416
  "popover",
1391
- "value"
1417
+ "input"
1392
1418
  ];
1393
1419
  static values = {
1394
1420
  value: String,
@@ -1435,12 +1461,12 @@ var K = 7, q = {
1435
1461
  this.hasComboboxDropdownOutlet && this.comboboxDropdownOutlet.filter(t);
1436
1462
  }
1437
1463
  valueValueChanged(e) {
1438
- this.hasValueTarget && (this.valueTarget.value = e), this.dispatch("changed", { detail: { value: e } });
1464
+ this.hasInputTarget && (this.inputTarget.value = e), this.dispatch("changed", { detail: { value: e } });
1439
1465
  }
1440
- }, He = class extends e {
1466
+ }, Ue = class extends e {
1441
1467
  static targets = ["input", "toggle"];
1442
1468
  static values = {
1443
- type: {
1469
+ format: {
1444
1470
  type: String,
1445
1471
  default: "plain"
1446
1472
  },
@@ -1455,19 +1481,19 @@ var K = 7, q = {
1455
1481
  };
1456
1482
  connect() {
1457
1483
  U(this, {
1458
- type: this.typeValue,
1484
+ type: this.formatValue,
1459
1485
  options: this.optionsValue
1460
1486
  }), this.format(this.readValue()), this.drawToggle();
1461
1487
  }
1462
- typeValueChanged() {
1488
+ formatValueChanged() {
1463
1489
  this.formatter && (U(this, {
1464
- type: this.typeValue,
1490
+ type: this.formatValue,
1465
1491
  options: this.optionsValue
1466
1492
  }), this.format(this.readValue()), this.drawToggle());
1467
1493
  }
1468
1494
  optionsValueChanged() {
1469
1495
  this.formatter && (U(this, {
1470
- type: this.typeValue,
1496
+ type: this.formatValue,
1471
1497
  options: this.optionsValue
1472
1498
  }), this.format(this.readValue()));
1473
1499
  }
@@ -1481,7 +1507,7 @@ var K = 7, q = {
1481
1507
  this.formatter && this.onFormatting(e);
1482
1508
  }
1483
1509
  toggle() {
1484
- !this.formatter.maskable() && this.typeValue !== "password" || (this.revealedValue = !this.revealedValue);
1510
+ !this.formatter.maskable() && this.formatValue !== "password" || (this.revealedValue = !this.revealedValue);
1485
1511
  }
1486
1512
  onPaste(e) {
1487
1513
  let t = e.detail?.text ?? "";
@@ -1491,7 +1517,7 @@ var K = 7, q = {
1491
1517
  }
1492
1518
  drawToggle() {
1493
1519
  if (!this.hasToggleTarget) return;
1494
- let e = this.formatter?.maskable() || this.typeValue === "password";
1520
+ let e = this.formatter?.maskable() || this.formatValue === "password";
1495
1521
  this.toggleTarget.hidden = !e, e && _(this.toggleTarget, this.revealedValue);
1496
1522
  }
1497
1523
  readValue() {
@@ -1499,14 +1525,14 @@ var K = 7, q = {
1499
1525
  }
1500
1526
  onFormatting(e) {
1501
1527
  if (!this.formatter) return;
1502
- if (this.typeValue === "password") {
1528
+ if (this.formatValue === "password") {
1503
1529
  this.hasInputTarget && (this.inputTarget.type = this.revealedValue ? "text" : "password");
1504
1530
  return;
1505
1531
  }
1506
1532
  let t = this.formatter.normalize(e), n = this.revealedValue || !this.formatter.maskable() ? this.formatter.format(t) : this.formatter.mask(t);
1507
1533
  this.hasInputTarget && (this.inputTarget instanceof HTMLInputElement ? this.inputTarget.value = n : this.inputTarget.textContent = n), this.dispatch("formatted", { detail: { value: n } });
1508
1534
  }
1509
- }, Ue = class extends e {
1535
+ }, We = class extends e {
1510
1536
  static targets = ["input", "clear"];
1511
1537
  initialize() {
1512
1538
  this.onInput = this.draw.bind(this), this.onEscape = this.handleEscape.bind(this);
@@ -1529,7 +1555,7 @@ var K = 7, q = {
1529
1555
  handleEscape(e) {
1530
1556
  e.key === "Escape" && this.inputTarget.value !== "" && (e.preventDefault(), this.clear());
1531
1557
  }
1532
- }, We = class extends e {
1558
+ }, Ge = class extends e {
1533
1559
  static targets = ["modal", "overlay"];
1534
1560
  initialize() {
1535
1561
  this.onCancel = this.close.bind(this);
@@ -1572,12 +1598,12 @@ var K = 7, q = {
1572
1598
  let t = this.modalTarget.getBoundingClientRect();
1573
1599
  (e.clientY < t.top || e.clientY > t.bottom || e.clientX < t.left || e.clientX > t.right) && this.close();
1574
1600
  };
1575
- }, Ge = class extends e {
1601
+ }, Ke = class extends e {
1576
1602
  static targets = ["content"];
1577
1603
  connect() {
1578
- Me(this, { element: this.hasContentTarget ? this.contentTarget : null });
1604
+ Ne(this, { element: this.hasContentTarget ? this.contentTarget : null });
1579
1605
  }
1580
- }, Ke = class extends e {
1606
+ }, qe = class extends e {
1581
1607
  static targets = [
1582
1608
  "content",
1583
1609
  "template",
@@ -1598,7 +1624,7 @@ var K = 7, q = {
1598
1624
  }
1599
1625
  };
1600
1626
  connect() {
1601
- we(this, {
1627
+ Te(this, {
1602
1628
  element: this.hasContentTarget ? this.contentTarget : null,
1603
1629
  url: this.hasUrlValue ? this.urlValue : null
1604
1630
  }), this.hasContentTarget && Q(this, {
@@ -1639,4 +1665,4 @@ var K = 7, q = {
1639
1665
  }
1640
1666
  };
1641
1667
  //#endregion
1642
- export { y as ARIA_HASPOPUP_VALUES, Pe as CalendarMonthController, Fe as CalendarMonthObserverController, Ie as ClipboardController, Le as ComboboxDateController, $ as ComboboxDropdownController, Re as ComboboxTimeController, ze as DismisserController, t as FOCUSABLE_SELECTOR, z as FORMATTER_TYPES, Be as FlipperController, o as FocusRestoration, a as FocusTrap, H as Formatter, Ve as InputComboboxController, He as InputFormatController, Ue as InputSearchController, We as ModalController, Ge as PannerController, Ke as PopoverController, w as Requestor, d as RovingTabIndex, p as announce, S as connectTriggerToTarget, ne as disconnectTriggerFromTarget, h as ensureId, E as filterOptions, i as focusFirst, T as fuzzyMatcher, m as generateId, n as getFocusableElements, c as isActivationKey, l as isArrowKey, s as isKey, r as isVisible, u as preventDefault, g as setAriaState, v as setChecked, te as setDisabled, ee as setExpanded, _ as setPressed };
1668
+ export { y as ARIA_HASPOPUP_VALUES, $ as CalendarMonthController, Fe as CalendarMonthObserverController, Ie as ClipboardController, Le as ComboboxDateController, Re as ComboboxDropdownController, ze as ComboboxTimeController, Be as DismisserController, t as FOCUSABLE_SELECTOR, z as FORMATTER_TYPES, Ve as FlipperController, o as FocusRestoration, a as FocusTrap, H as Formatter, We as InputClearableController, He as InputComboboxController, Ue as InputFormatterController, Ge as ModalController, Ke as PannerController, qe as PopoverController, w as Requestor, d as RovingTabIndex, p as announce, S as connectTriggerToTarget, ne as disconnectTriggerFromTarget, h as ensureId, E as filterOptions, i as focusFirst, T as fuzzyMatcher, m as generateId, n as getFocusableElements, c as isActivationKey, l as isArrowKey, s as isKey, r as isVisible, u as preventDefault, g as setAriaState, v as setChecked, te as setDisabled, ee as setExpanded, _ as setPressed };
@@ -1 +1 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`@hotwired/stimulus`)):typeof define==`function`&&define.amd?define([`exports`,`@hotwired/stimulus`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.StimulusPlumbersControllers={},e.Stimulus))})(this,function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var n=[`a[href]`,`area[href]`,`button:not([disabled])`,`input:not([disabled])`,`select:not([disabled])`,`textarea:not([disabled])`,`[tabindex]:not([tabindex="-1"])`,`audio[controls]`,`video[controls]`,`[contenteditable]:not([contenteditable="false"])`].join(`,`);function r(e){return Array.from(e.querySelectorAll(n)).filter(e=>i(e))}function i(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)}function a(e){let t=r(e);return t.length>0?(t[0].focus(),!0):!1}var o=class{constructor(e,t={}){this.container=e,this.previouslyFocused=null,this.options=t,this.isActive=!1}activate(){this.isActive||(this.previouslyFocused=document.activeElement,this.isActive=!0,this.options.initialFocus?this.options.initialFocus.focus():a(this.container),this.container.addEventListener(`keydown`,this.handleKeyDown))}deactivate(){if(!this.isActive)return;this.isActive=!1,this.container.removeEventListener(`keydown`,this.handleKeyDown);let e=this.options.returnFocus||this.previouslyFocused;e&&i(e)&&e.focus()}handleKeyDown=e=>{if(e.key===`Escape`&&this.options.escapeDeactivates){e.preventDefault(),this.deactivate();return}if(e.key!==`Tab`)return;let t=r(this.container);if(t.length===0)return;let n=t[0],i=t[t.length-1];e.shiftKey&&document.activeElement===n?(e.preventDefault(),i.focus()):!e.shiftKey&&document.activeElement===i&&(e.preventDefault(),n.focus())}},s=class{constructor(){this.savedElement=null}save(){this.savedElement=document.activeElement}restore(){this.savedElement&&i(this.savedElement)&&(this.savedElement.focus(),this.savedElement=null)}};function c(e,t){return e.key===t}function l(e){return e.key===`Enter`||e.key===` `}function u(e){return[`ArrowUp`,`ArrowDown`,`ArrowLeft`,`ArrowRight`].includes(e.key)}function d(e){e.preventDefault(),e.stopPropagation()}var f=class{constructor(e,t=0){this.items=e,this.currentIndex=t,this.updateTabIndex()}handleKeyDown(e){let t;switch(e.key){case`ArrowDown`:case`ArrowRight`:e.preventDefault(),t=(this.currentIndex+1)%this.items.length;break;case`ArrowUp`:case`ArrowLeft`:e.preventDefault(),t=this.currentIndex===0?this.items.length-1:this.currentIndex-1;break;case`Home`:e.preventDefault(),t=0;break;case`End`:e.preventDefault(),t=this.items.length-1;break;default:return}this.setCurrentIndex(t)}setCurrentIndex(e){e>=0&&e<this.items.length&&(this.currentIndex=e,this.updateTabIndex(),this.items[e].focus())}updateTabIndex(){this.items.forEach((e,t)=>{e.tabIndex=t===this.currentIndex?0:-1})}updateItems(e){this.items=e,this.currentIndex=Math.min(this.currentIndex,e.length-1),this.updateTabIndex()}},p=(e,t,n)=>{let r=document.querySelector(`[data-live-region="${e}"]`);return r||(r=document.createElement(`div`),r.className=`sr-only`,r.dataset.liveRegion=e,r.setAttribute(`aria-live`,e),r.setAttribute(`aria-atomic`,t.toString()),r.setAttribute(`aria-relevant`,n),document.body.appendChild(r)),r};function m(e,t={}){let{politeness:n=`polite`,atomic:r=!0,relevant:i=`additions text`}=t,a=p(n,r,i);a.textContent=``,setTimeout(()=>{a.textContent=e},100)}var h=(e=`a11y`)=>`${e}-${Math.random().toString(36).substr(2,9)}`,ee=(e,t=`element`)=>e.id||=h(t),g=(e,t,n)=>{e.setAttribute(t,n.toString())},te=(e,t)=>g(e,`aria-expanded`,t),_=(e,t)=>g(e,`aria-pressed`,t),ne=(e,t)=>g(e,`aria-checked`,t);function re(e,t){g(e,`aria-disabled`,t),t?e.setAttribute(`tabindex`,`-1`):e.removeAttribute(`tabindex`)}var v={menu:`menu`,listbox:`listbox`,tree:`tree`,grid:`grid`,dialog:`dialog`},y=(e,t,n)=>{Object.entries(t).forEach(([t,r])=>{e.setAttribute(t,r),n[t]=r})},b=(e,t,n)=>n||!e.hasAttribute(t);function x({trigger:e,target:t,role:n=null,override:r=!1}){let i={trigger:{},target:{}};if(!e||!t)return i;let a={},o={};if(n&&b(t,`role`,r)&&(o.role=n),t.id&&(b(e,`aria-controls`,r)&&(a[`aria-controls`]=t.id),n===`tooltip`&&b(e,`aria-describedby`,r)&&(a[`aria-describedby`]=t.id)),n&&b(e,`aria-haspopup`,r)){let e=v[n]||`true`;e&&(a[`aria-haspopup`]=e)}return y(t,o,i.target),y(e,a,i.trigger),i}var S=(e,t)=>{t.forEach(t=>{e.hasAttribute(t)&&e.removeAttribute(t)})};function ie({trigger:e,target:t,attributes:n=null}){!e||!t||(S(e,n||[`aria-controls`,`aria-haspopup`,`aria-describedby`]),(!n||n.includes(`role`))&&S(t,[`role`]))}var C=class{constructor(){this._abortController=null,this._timer=null}schedule(e,t){clearTimeout(this._timer),this._timer=setTimeout(e,t)}async request(e,t={}){this._abortController?.abort(),this._abortController=new AbortController;let n=await fetch(e,{...t,signal:this._abortController.signal});if(!n.ok)throw Error(`${n.status}`);return n}cancel(){clearTimeout(this._timer),this._abortController?.abort()}};function w(e,t){let n=0;for(let r=0;r<t.length&&n<e.length;r++)t[r]===e[n]&&n++;return n===e.length}function ae(e,t){return t.includes(e)}function oe(e,t){return t.startsWith(e)}function se(e){return e===`contains`?ae:e===`prefix`?oe:w}function ce(e,t){return t===`textContent`?e.textContent?.trim().toLowerCase()??``:(e.getAttribute(t)??``).toLowerCase()}function T(e,t,n={}){let{strategy:r=`fuzzy`,matcher:i,fields:a=[`textContent`]}=n,o=typeof i==`function`?i:se(r),s=t.toLowerCase(),c=0;return e.querySelectorAll(`[role="option"]`).forEach(e=>{let t=a.some(t=>o(s,ce(e,t)));e.hidden=!t,t&&c++}),c}var E={get top(){return`bottom`},get bottom(){return`top`},get left(){return`right`},get right(){return`left`}};function D({x:e,y:t,width:n,height:r}){return{x:e,y:t,width:n,height:r,left:e,right:e+n,top:t,bottom:t+r}}function O(){return D({x:0,y:0,width:window.innerWidth||document.documentElement.clientWidth,height:window.innerHeight||document.documentElement.clientHeight})}function le(e){if(!(e instanceof HTMLElement))return!1;let t=O(),n=e.getBoundingClientRect(),r=n.top<=t.height&&n.top+n.height>0,i=n.left<=t.width&&n.left+n.width>0;return r&&i}var k={get visibleOnly(){return!0},hiddenClass:null},ue={element:null,visible:null,dispatch:!0,prefix:``},A=class{constructor(e,t={}){this.controller=e;let{element:n,visible:r,dispatch:i,prefix:a}=Object.assign({},ue,t);this.element=n||e.element,this.visibleOnly=typeof r==`boolean`?r:k.visibleOnly,this.visibleCallback=typeof r==`string`?r:null,this.notify=!!i,this.prefix=typeof a==`string`&&a?a:e.identifier}get visible(){return this.element instanceof HTMLElement?this.visibleOnly?le(this.element)&&this.isVisible(this.element):!0:!1}isVisible(e){if(this.visibleCallback){let t=this.findCallback(this.visibleCallback);if(typeof t==`function`)return t(e)}return e instanceof HTMLElement?!e.hasAttribute(`hidden`):!1}dispatch(e,{target:t=null,prefix:n=null,detail:r=null}={}){if(this.notify)return this.controller.dispatch(e,{target:t||this.element,prefix:n||this.prefix,detail:r})}findCallback(e){if(typeof e!=`string`)return;let t=this,n=e.split(`.`).reduce((e,t)=>e&&e[t],t.controller);if(typeof n==`function`)return n.bind(t.controller);let r=e.split(`.`).reduce((e,t)=>e&&e[t],t);if(typeof r==`function`)return r.bind(t)}async awaitCallback(e,...t){if(typeof e==`string`&&(e=this.findCallback(e)),typeof e==`function`){let n=e(...t);return n instanceof Promise?await n:n}}},de={normalize(e){return typeof e==`string`?e:``},validate(){return!0}};function fe(e){let t=0,n=!1;for(let r=e.length-1;r>=0;r--){let i=parseInt(e[r],10);n&&(i*=2,i>9&&(i-=9)),t+=i,n=!n}return t%10==0}var pe=/\D/g,me=/^\d{13,19}$/,he=/(.{4})(?=.)/g,ge={normalize(e){return typeof e==`string`?e.replace(pe,``):``},validate(e){return typeof e!=`string`||!me.test(e)?!1:fe(e)},format(e){return typeof e==`string`?e.replace(he,`$1 `):``}},j={1:10},M=/\D/g,_e=/^\+\d{7,15}$/,ve={normalize(e){if(typeof e!=`string`)return``;let t=e.trimStart().startsWith(`+`),n=e.replace(M,``);return t?`+${n}`:n},validate(e){if(typeof e!=`string`)return!1;if(_e.test(e))return!0;let t=e.replace(M,``);return Object.values(j).includes(t.length)},format(e){if(typeof e!=`string`)return``;let t=e.replace(M,``);for(let[e,n]of Object.entries(j)){if(t.length===n)return`(${t.slice(0,3)}) ${t.slice(3,6)}-${t.slice(6)}`;let r=n+e.length;if(t.length===r&&t.startsWith(e)){let n=t.slice(e.length);return`+${e} (${n.slice(0,3)}) ${n.slice(3,6)}-${n.slice(6)}`}}return e}},N=/[^\d.,-]/g,P=/^-?\d+(\.\d+)?$/,F={normalize(e){if(typeof e!=`string`)return``;let t=e.replace(N,``);if(!t)return``;let n=t.lastIndexOf(`,`),r=t.lastIndexOf(`.`);return n>-1&&r>-1?n>r?t.replace(/\./g,``).replace(`,`,`.`):t.replace(/,/g,``):n>-1?t.slice(n+1).length<=2?t.replace(`,`,`.`):t.replace(/,/g,``):t},validate(e){return typeof e==`string`?P.test(e):!1},format(e,t={}){if(typeof e!=`string`)return``;let n=parseFloat(e);if(isNaN(n))return e;let r=t.locale||`en-US`,i=t.currency||`USD`,a=t.fractionDigits===void 0?{}:{minimumFractionDigits:t.fractionDigits,maximumFractionDigits:t.fractionDigits};try{return new Intl.NumberFormat(r,{style:`currency`,currency:i,...a}).format(n)}catch{return e}}},I=/^\d{4}-\d{2}-\d{2}$/,ye=/^(\d{1,4})[/\-.](\d{1,2})[/\-.](\d{1,4})$/,be=/\D/g,L={normalize(e){if(typeof e!=`string`)return``;let t=e.trim();if(I.test(t))return t;let n=t.match(ye);if(n){let[,e,t,r]=n;if(e.length===4)return`${e}-${t.padStart(2,`0`)}-${r.padStart(2,`0`)}`;if(r.length===4)return`${r}-${e.padStart(2,`0`)}-${t.padStart(2,`0`)}`}let r=t.replace(be,``);if(r.length===8){let e=parseInt(r.slice(0,4),10);return e>=1e3&&e<=9999?`${r.slice(0,4)}-${r.slice(4,6)}-${r.slice(6,8)}`:`${r.slice(4,8)}-${r.slice(0,2)}-${r.slice(2,4)}`}return t},validate(e){if(typeof e!=`string`)return!1;let t=L.normalize(e);if(!I.test(t))return!1;let n=new Date(`${t}T00:00:00Z`);return!isNaN(n.getTime())&&n.toISOString().startsWith(t)},format(e,t={}){if(typeof e!=`string`)return``;let n=new Date(`${e}T00:00:00Z`);if(isNaN(n.getTime()))return e;let r=t.locale||`en-US`;try{return new Intl.DateTimeFormat(r,{year:t.year||`numeric`,month:t.month||`2-digit`,day:t.day||`2-digit`,timeZone:t.timeZone||`UTC`}).format(n)}catch{return e}}},xe=/^([01]?\d|2[0-3]):([0-5]\d)$/,R={normalize(e){if(typeof e!=`string`)return``;let t=e.trim();if(xe.test(t)){let[e,n]=t.split(`:`);return`${String(parseInt(e,10)).padStart(2,`0`)}:${n}`}let n=t.match(/^(\d{1,2}):(\d{2})\s*(AM|PM)$/i);if(n){let e=parseInt(n[1],10),t=n[2];return e=n[3].toUpperCase()===`AM`?e===12?0:e:e===12?12:e+12,e>23||parseInt(t,10)>59?``:`${String(e).padStart(2,`0`)}:${t}`}return``},validate(e){return R.normalize(e)!==``},format(e,t={}){if(typeof e!=`string`)return``;let n=e.match(/^(\d{2}):(\d{2})$/);if(!n)return e;let r=parseInt(n[1],10),i=n[2];if(t.format===`h24`)return`${String(r).padStart(2,`0`)}:${i}`;let a=r<12?`AM`:`PM`;return`${r%12||12}:${i} ${a}`}},z={PLAIN:`plain`,CREDIT_CARD:`creditCard`,PHONE:`phone`,CURRENCY:`currency`,DATE:`date`,TIME:`time`},B=new Map([[z.PLAIN,de],[z.CREDIT_CARD,ge],[z.PHONE,ve],[z.CURRENCY,F],[z.DATE,L],[z.TIME,R]]),V={type:z.PLAIN,options:{}},H=class extends A{static register(e,t){B.set(e,t)}constructor(e,t={}){super(e,t),this.type=t.type??V.type,this.options=t.options??V.options,this.enhance()}enhance(){let e=this,t=B.get(e.type)??B.get(z.PLAIN),n={normalize:n=>t.normalize?.(n,e.options)??(typeof n==`string`?n:``),validate:n=>t.validate?.(n,e.options)??!0,format:n=>t.format?.(n,e.options)??(typeof n==`string`?n:``),mask:n=>t.mask?.(n,e.options)??null,maskable:()=>typeof t.mask==`function`};Object.defineProperty(this.controller,`formatter`,{get(){return n},configurable:!0})}},U=(e,t)=>new H(e,t);function W(e){return e instanceof Date&&!isNaN(e)}function G(...e){if(e.length===0)throw`Missing values to parse as date`;if(e.length===1){let t=new Date(e[0]);if(e[0]&&W(t))return t}else{let t=new Date(...e);if(W(t))return t}}var K=7,q={locales:[`default`],today:``,day:null,month:null,year:null,since:null,till:null,disabledDates:[],disabledWeekdays:[],disabledDays:[],disabledMonths:[],disabledYears:[],firstDayOfWeek:0,onNavigated:`navigated`},Se=class extends A{constructor(e,t={}){super(e,t);let n=Object.assign({},q,t),{onNavigated:r,since:i,till:a,firstDayOfWeek:o}=n;this.onNavigated=r,this.since=G(i),this.till=G(a),this.firstDayOfWeek=0<=o&&o<7?o:q.firstDayOfWeek;let{disabledDates:s,disabledWeekdays:c,disabledDays:l,disabledMonths:u,disabledYears:d}=n;this.disabledDates=Array.isArray(s)?s:[],this.disabledWeekdays=Array.isArray(c)?c:[],this.disabledDays=Array.isArray(l)?l:[],this.disabledMonths=Array.isArray(u)?u:[],this.disabledYears=Array.isArray(d)?d:[];let{today:f,day:p,month:m,year:h}=n;this.now=G(f)||new Date,typeof h==`number`&&typeof m==`number`&&typeof p==`number`?this.current=G(h,m,p):this.current=this.now,this.build(),this.enhance()}build(){this.daysOfWeek=this.buildDaysOfWeek(),this.daysOfMonth=this.buildDaysOfMonth(),this.monthsOfYear=this.buildMonthsOfYear()}buildDaysOfWeek(){let e=new Intl.DateTimeFormat(this.localesValue,{weekday:`long`}),t=new Intl.DateTimeFormat(this.localesValue,{weekday:`short`}),n=new Date(`2024-10-06`),r=[];for(let i=this.firstDayOfWeek,a=i+7;i<a;i++){let a=new Date(n);a.setDate(n.getDate()+i),r.push({date:a,value:a.getDay(),long:e.format(a),short:t.format(a)})}return r}buildDaysOfMonth(){let e=this.month,t=this.year,n=[],r=e=>({current:this.month===e.getMonth()&&this.year===e.getFullYear(),date:e,value:e.getDate(),month:e.getMonth(),year:e.getFullYear(),iso:e.toISOString()}),i=new Date(t,e).getDay(),a=this.firstDayOfWeek-i;for(let i=a>0?a-7:a;i<0;i++){let a=new Date(t,e,i+1);n.push(r(a))}let o=new Date(t,e+1,0).getDate();for(let i=1;i<=o;i++){let a=new Date(t,e,i);n.push(r(a))}let s=n.length%K,c=s===0?0:K-s;for(let i=1;i<=c;i++){let a=new Date(t,e+1,i);n.push(r(a))}return n}buildMonthsOfYear(){let e=new Intl.DateTimeFormat(this.localesValue,{month:`long`}),t=new Intl.DateTimeFormat(this.localesValue,{month:`short`}),n=new Intl.DateTimeFormat(this.localesValue,{month:`numeric`}),r=[];for(let i=0;i<12;i++){let a=new Date(this.year,i);r.push({date:a,value:a.getMonth(),long:e.format(a),short:t.format(a),numeric:n.format(a)})}return r}get today(){return this.now}set today(e){if(!W(e))return;let t=this.month?this.month:e.getMonth(),n=this.year?this.year:e.getFullYear(),r=t==e.getMonth()&&n==e.getFullYear(),i=this.hasDayValue?this.day:r?e.getDate():1;this.now=new Date(n,t,i).toISOString()}get current(){return typeof this.year==`number`&&typeof this.month==`number`&&typeof this.day==`number`?G(this.year,this.month,this.day):null}set current(e){W(e)&&(this.day=e.getDate(),this.month=e.getMonth(),this.year=e.getFullYear())}navigate=async e=>{if(!W(e))return;let t=this.current,n=e.toISOString(),r=t.toISOString();this.dispatch(`navigate`,{detail:{from:r,to:n}}),this.current=e,this.build(),await this.awaitCallback(this.onNavigated,{from:r,to:n}),this.dispatch(`navigated`,{detail:{from:r,to:n}})};step=async(e,t)=>{if(t===0)return;let n=this.current;switch(e){case`year`:n.setFullYear(n.getFullYear()+t);break;case`month`:n.setMonth(n.getMonth()+t);break;case`day`:n.setDate(n.getDate()+t);break;default:return}await this.navigate(n)};isDisabled=e=>{if(!W(e))return!1;if(this.disabledDates.length){let t=e.getTime();for(let e of this.disabledDates)if(t===new Date(e).getTime())return!0}if(this.disabledWeekdays.length){let t=e.getDay(),n=this.daysOfWeek,r=n.findIndex(e=>e.value===t);if(r>=0){let e=n[r];for(let t of this.disabledWeekdays)if(e.value==t||e.short===t||e.long===t)return!0}}if(this.disabledDays.length){let t=e.getDate();for(let e of this.disabledDays)if(t==e)return!0}if(this.disabledMonths.length){let t=e.getMonth(),n=this.monthsOfYear,r=n.findIndex(e=>e.value===t);if(r>=0){let e=n[r];for(let t of this.disabledMonths)if(e.value==t||e.short===t||e.long===t)return!0}}if(this.disabledYears.length){let t=e.getFullYear();for(let e of this.disabledYears)if(t==e)return!0}return!1};isWithinRange=e=>{if(!W(e))return!1;let t=!0;return this.since&&(t&&=e>=this.since),this.till&&(t&&=e<=this.till),t};enhance(){let e=this;Object.assign(this.controller,{get calendar(){return{get today(){return e.today},get current(){return e.current},get day(){return e.day},get month(){return e.month},get year(){return e.year},get since(){return e.since},get till(){return e.till},get firstDayOfWeek(){return e.firstDayOfWeek},get disabledDates(){return e.disabledDates},get disabledWeekdays(){return e.disabledWeekdays},get disabledDays(){return e.disabledDays},get disabledMonths(){return e.disabledMonths},get disabledYears(){return e.disabledYears},get daysOfWeek(){return e.daysOfWeek},get daysOfMonth(){return e.daysOfMonth},get monthsOfYear(){return e.monthsOfYear},navigate:async t=>await e.navigate(t),step:async(t,n)=>await e.step(t,n),isDisabled:t=>e.isDisabled(t),isWithinRange:t=>e.isWithinRange(t)}}})}},Ce=(e,t)=>new Se(e,t),J={content:null,url:``,reload:`never`,stale:3600,onLoad:`canLoad`,onLoaded:`contentLoaded`},we=class extends A{constructor(e,t={}){super(e,t);let n=Object.assign({},J,t),{content:r,url:i,reload:a,stale:o}=n;this.content=r,this.url=i,this.reload=typeof a==`string`?a:J.reload,this.stale=typeof o==`number`?o:J.stale;let{onLoad:s,onLoaded:c}=n;this.onLoad=s,this.onLoaded=c,this._requestor=new C,this.enhance()}get reloadable(){switch(this.reload){case`never`:return!1;case`always`:return!0;default:{let e=G(this.loadedAt);return e&&new Date-e>this.stale*1e3}}}contentLoadable=({url:e})=>!!e;contentLoader=async()=>``;remoteContentLoader=async e=>(await this._requestor.request(e)).text();load=async()=>{if(this.loadedAt&&!this.reloadable)return;let e=this.findCallback(this.onLoad),t=await this.awaitCallback(e||this.contentLoadable,{url:this.url});if(this.dispatch(`load`,{detail:{url:this.url}}),!t)return;this.dispatch(`loading`,{detail:{url:this.url}});let n=this.url?await this.remoteContentLoader(this.url):await this.contentLoader();n&&(await this.awaitCallback(this.onLoaded,{url:this.url,content:n}),this.loadedAt=new Date().getTime(),this.dispatch(`loaded`,{detail:{url:this.url,content:n}}))};enhance(){let e=this;Object.assign(this.controller,{load:e.load.bind(e)})}},Te=(e,t)=>new we(e,t),Y=class extends A{observe(e){this._handler=e,this.events.forEach(t=>window.addEventListener(t,e,!0))}unobserve(){this._handler&&this.events.forEach(e=>window.removeEventListener(e,this._handler,!0))}enhance(){let e=this,t=this.controller.disconnect?.bind(this.controller)||(()=>{});this.controller.disconnect=()=>{e.unobserve(),t()}}},Ee={trigger:null,events:[`click`],onDismissed:`dismissed`},De=class extends Y{constructor(e,t={}){super(e,t);let{trigger:n,events:r,onDismissed:i}=Object.assign({},Ee,t);this.onDismissed=i,this.trigger=n||this.element,this.events=r,this.enhance(),this.observe(this.dismiss)}dismiss=async e=>{let{target:t}=e;t instanceof HTMLElement&&(this.element.contains(t)||this.visible&&(this.dispatch(`dismiss`),await this.awaitCallback(this.onDismissed,{target:this.trigger}),this.dispatch(`dismissed`)))}},X=(e,t)=>new De(e,t),Oe={anchor:null,events:[`click`],placement:`bottom`,alignment:`start`,onFlipped:`flipped`,ariaRole:null,respectMotion:!0},ke=class extends Y{constructor(e,t={}){super(e,t);let{anchor:n,events:r,placement:i,alignment:a,onFlipped:o,ariaRole:s,respectMotion:c}=Object.assign({},Oe,t);this.anchor=n,this.events=r,this.placement=i,this.alignment=a,this.onFlipped=o,this.ariaRole=s,this.respectMotion=c,this.prefersReducedMotion=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches,this.anchor&&this.element&&x({trigger:this.anchor,target:this.element,role:this.ariaRole}),this.enhance(),this.observe(this.flip)}flip=async()=>{if(!this.visible)return;this.dispatch(`flip`),window.getComputedStyle(this.element).position!=`absolute`&&(this.element.style.position=`absolute`);let e=this.flippedRect(this.anchor.getBoundingClientRect(),this.element.getBoundingClientRect());this.element.style.transition=this.respectMotion&&this.prefersReducedMotion?`none`:``;for(let[t,n]of Object.entries(e))this.element.style[t]=n;await this.awaitCallback(this.onFlipped,{target:this.element,placement:e}),this.dispatch(`flipped`,{detail:{placement:e}})};flippedRect(e,t){let n=this.quadrumRect(e,O()),r=[this.placement,E[this.placement]],i={};for(;!Object.keys(i).length&&r.length>0;){let a=r.shift();if(!this.biggerRectThan(n[a],t))continue;let o=this.quadrumPlacement(e,a,t),s=this.quadrumAlignment(e,a,o);i.top=`${s.top+window.scrollY}px`,i.left=`${s.left+window.scrollX}px`}return Object.keys(i).length||(i.top=``,i.left=``),i}quadrumRect(e,t){return{left:D({x:t.x,y:t.y,width:e.x-t.x,height:t.height}),right:D({x:e.x+e.width,y:t.y,width:t.width-(e.x+e.width),height:t.height}),top:D({x:t.x,y:t.y,width:t.width,height:e.y-t.y}),bottom:D({x:t.x,y:e.y+e.height,width:t.width,height:t.height-(e.y+e.height)})}}quadrumPlacement(e,t,n){switch(t){case`top`:return D({x:n.x,y:e.y-n.height,width:n.width,height:n.height});case`bottom`:return D({x:n.x,y:e.y+e.height,width:n.width,height:n.height});case`left`:return D({x:e.x-n.width,y:n.y,width:n.width,height:n.height});case`right`:return D({x:e.x+e.width,y:n.y,width:n.width,height:n.height});default:throw`Unable place at the quadrum, ${t}`}}quadrumAlignment(e,t,n){switch(t){case`top`:case`bottom`:{let t=e.x;return this.alignment===`center`?t=e.x+e.width/2-n.width/2:this.alignment===`end`&&(t=e.x+e.width-n.width),D({x:t,y:n.y,width:n.width,height:n.height})}case`left`:case`right`:{let t=e.y;return this.alignment===`center`?t=e.y+e.height/2-n.height/2:this.alignment===`end`&&(t=e.y+e.height-n.height),D({x:n.x,y:t,width:n.width,height:n.height})}default:throw`Unable align at the quadrum, ${t}`}}biggerRectThan(e,t){return e.height>=t.height&&e.width>=t.width}enhance(){super.enhance(),this.controller.flip=this.flip}},Ae=(e,t)=>new ke(e,t),je={events:[`resize`],boundaries:[`top`,`left`,`right`],onShifted:`shifted`,respectMotion:!0},Me=class extends Y{constructor(e,t={}){super(e,t);let{onShifted:n,events:r,boundaries:i,respectMotion:a}=Object.assign({},je,t);this.onShifted=n,this.events=r,this.boundaries=i,this.respectMotion=a,this.prefersReducedMotion=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches,this.enhance(),this.observe(this.shift)}shift=async()=>{if(!this.visible)return;this.dispatch(`shift`);let e=this.overflowRect(this.element.getBoundingClientRect(),this.elementTranslations(this.element)),t=e.left||e.right||0,n=e.top||e.bottom||0;this.element.style.transition=this.respectMotion&&this.prefersReducedMotion?`none`:``,this.element.style.transform=`translate(${t}px, ${n}px)`,await this.awaitCallback(this.onShifted,e),this.dispatch(`shifted`,{detail:e})};overflowRect(e,t){let n={},r=O(),i=D({x:e.x-t.x,y:e.y-t.y,width:e.width,height:e.height});for(let e of this.boundaries){let t=this.directionDistance(i,e,r),a=E[e];t<0?i[a]+t>=r[a]&&!n[a]&&(n[e]=t):n[e]=``}return n}directionDistance(e,t,n){switch(t){case`top`:case`left`:return e[t]-n[t];case`bottom`:case`right`:return n[t]-e[t];default:throw`Invalid direction to calcuate distance, ${t}`}}elementTranslations(e){let t=window.getComputedStyle(e),n=t.transform||t.webkitTransform||t.mozTransform;if(n===`none`||n===void 0)return{x:0,y:0};let r=n.includes(`3d`)?`3d`:`2d`,i=n.match(/matrix.*\((.+)\)/)[1].split(`, `);return r===`2d`?{x:Number(i[4]),y:Number(i[5])}:{x:0,y:0}}enhance(){super.enhance(),this.controller.shift=this.shift}},Ne=(e,t)=>new Me(e,t),Z={visibility:`visibility`,onShown:`shown`,onHidden:`hidden`},Pe=class extends A{constructor(e,t={}){let{visibility:n,onShown:r,onHidden:i,activator:a}=Object.assign({},Z,t),o=typeof n==`string`?n:Z.namespace,s=typeof t.visible==`string`?t.visible:`isVisible`;(typeof t.visible!=`boolean`||t.visible)&&(t.visible=`${o}.${s}`),super(e,t),this.visibility=o,this.visibilityResolver=s,this.onShown=r,this.onHidden=i,this.activator=a instanceof HTMLElement?a:null,this.enhance(),this.element instanceof HTMLElement&&this.activate(this.isVisible(this.element))}isVisible(e){if(!(e instanceof HTMLElement))return!1;let t=k.hiddenClass;return t?!e.classList.contains(t):!e.hasAttribute(`hidden`)}toggle(e,t){if(!(e instanceof HTMLElement))return;let n=k.hiddenClass;n?t?e.classList.remove(n):e.classList.add(n):t?e.removeAttribute(`hidden`):e.setAttribute(`hidden`,!0)}activate(e){this.activator&&this.activator.setAttribute(`aria-expanded`,e?`true`:`false`)}async show(){!(this.element instanceof HTMLElement)||this.isVisible(this.element)||(this.dispatch(`show`),this.toggle(this.element,!0),this.activate(!0),await this.awaitCallback(this.onShown,{target:this.element}),this.dispatch(`shown`))}async hide(){!(this.element instanceof HTMLElement)||!this.isVisible(this.element)||(this.dispatch(`hide`),this.toggle(this.element,!1),this.activate(!1),await this.awaitCallback(this.onHidden,{target:this.element}),this.dispatch(`hidden`))}enhance(){let e=this,t={show:e.show.bind(e),hide:e.hide.bind(e)};Object.defineProperty(t,`visible`,{get(){return e.isVisible(e.element)}}),Object.defineProperty(t,this.visibilityResolver,{value:e.isVisible.bind(e)}),Object.defineProperty(this.controller,this.visibility,{get(){return t}})}},Q=(e,t)=>new Pe(e,t),Fe=class extends t.Controller{static targets=[`daysOfWeek`,`daysOfMonth`];static classes=[`dayOfWeek`,`dayOfMonth`,`week`];static values={locales:{type:Array,default:[`default`]},weekdayFormat:{type:String,default:`short`},dayFormat:{type:String,default:`numeric`},daysOfOtherMonth:{type:Boolean,default:!1}};initialize(){Ce(this)}connect(){this.draw()}navigated(){this.draw()}draw(){this.drawDaysOfWeek(),this.drawDaysOfMonth()}createDayElement(e,{selectable:t=!1,disabled:n=!1}={}){let r=document.createElement(t?`button`:`div`);return r.tabIndex=-1,e?r.textContent=e:r.setAttribute(`aria-hidden`,`true`),n&&(r instanceof HTMLButtonElement?r.disabled=!0:r.setAttribute(`aria-disabled`,`true`)),r}drawDaysOfWeek(){if(!this.hasDaysOfWeekTarget)return;let e=new Intl.DateTimeFormat(this.localesValue,{weekday:this.weekdayFormatValue}),t=[];for(let n of this.calendar.daysOfWeek){let r=this.createDayElement(e.format(n.date));r.setAttribute(`role`,`columnheader`),r.title=n.long,this.hasDayOfWeekClass&&r.classList.add(...this.dayOfWeekClasses),t.push(r)}let n=document.createElement(`div`);n.setAttribute(`role`,`row`),this.hasWeekClass&&n.classList.add(...this.weekClasses),n.replaceChildren(...t),this.daysOfWeekTarget.replaceChildren(n)}drawDaysOfMonth(){if(!this.hasDaysOfMonthTarget)return;let e=this.calendar.today,t=new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),n=[];for(let e of this.calendar.daysOfMonth){let r=!e.current||this.calendar.isDisabled(e.date)||!this.calendar.isWithinRange(e.date),i=e.current||this.daysOfOtherMonthValue?e.value:``,a=this.createDayElement(i,{selectable:e.current,disabled:r});t===e.date.getTime()&&a.setAttribute(`aria-current`,`date`),this.hasDayOfMonthClass&&a.classList.add(...this.dayOfMonthClasses);let o=document.createElement(`time`);o.dateTime=e.iso,a.appendChild(o),n.push(a)}let r=[];for(let e=0;e<n.length;e+=7){let t=document.createElement(`div`);t.setAttribute(`role`,`row`),this.hasWeekClass&&t.classList.add(...this.weekClasses);for(let r of n.slice(e,e+7))r.setAttribute(`role`,`gridcell`),t.appendChild(r);r.push(t)}this.daysOfMonthTarget.replaceChildren(...r)}},Ie=class extends t.Controller{onSelect(e){if(!(e.target instanceof HTMLElement))return;e.preventDefault();let t=e.target instanceof HTMLTimeElement?e.target.parentElement:e.target;if(t.disabled||t.getAttribute(`aria-disabled`)===`true`)return;this.dispatch(`selecting`,{target:t});let n=e.target instanceof HTMLTimeElement?e.target:e.target.querySelector(`time`);if(!n)return console.error(`unable to locate time element within ${t}`);let r=G(n.dateTime);if(!r)return console.error(`unable to parse ${n.dateTime} found within the time element`);this.select(r.toISOString())}select(e){let t=G(e);t&&this.dispatch(`selected`,{detail:{epoch:t.getTime(),iso:e}})}},Le=class extends t.Controller{static targets=[`source`];static values={type:{type:String,default:`text/plain`}};onPaste(e){let t=e.clipboardData?.getData(this.typeValue)??``,n=Array.from(e.clipboardData?.types??[]);e.preventDefault(),this.dispatch(`pasted`,{detail:{text:t,types:n},bubbles:!0})}async copy(e){let t=e.params?.text??(this.hasSourceTarget?this.sourceTarget.value??this.sourceTarget.textContent??``:``);try{await navigator.clipboard.writeText(t),this.dispatch(`copied`,{detail:{text:t},bubbles:!0})}catch(e){this.dispatch(`copy-failed`,{detail:{error:e},bubbles:!0})}}},Re=class extends t.Controller{static targets=[`previous`,`next`,`day`,`month`,`year`];static outlets=[`calendar-month`];static values={date:String,locales:{type:Array,default:[`default`]},dayFormat:{type:String,default:`numeric`},monthFormat:{type:String,default:`long`},yearFormat:{type:String,default:`numeric`}};initialize(){this.previous=this.previous.bind(this),this.next=this.next.bind(this)}async calendarMonthOutletConnected(){if(this.dateValue){let e=G(this.dateValue);e&&await this.calendarMonthOutlet.calendar.navigate(e)}this.draw()}onSelect(e){this.dateValue=e.detail.iso,this.draw(),this.dispatch(`selected`,{detail:{value:e.detail.iso},bubbles:!0})}previousTargetConnected(e){e.addEventListener(`click`,this.previous)}previousTargetDisconnected(e){e.removeEventListener(`click`,this.previous)}async previous(){await this.calendarMonthOutlet.calendar.step(`month`,-1),this.draw()}nextTargetConnected(e){e.addEventListener(`click`,this.next)}nextTargetDisconnected(e){e.removeEventListener(`click`,this.next)}async next(){await this.calendarMonthOutlet.calendar.step(`month`,1),this.draw()}draw(){this.drawDay(),this.drawMonth(),this.drawYear()}drawDay(){if(!this.hasDayTarget||!this.hasCalendarMonthOutlet)return;let{year:e,month:t,day:n}=this.calendarMonthOutlet.calendar;this.dayTarget.textContent=new Intl.DateTimeFormat(this.localesValue,{day:this.dayFormatValue}).format(new Date(e,t,n))}drawMonth(){if(!this.hasMonthTarget||!this.hasCalendarMonthOutlet)return;let{year:e,month:t}=this.calendarMonthOutlet.calendar;this.monthTarget.textContent=new Intl.DateTimeFormat(this.localesValue,{month:this.monthFormatValue}).format(new Date(e,t))}drawYear(){if(!this.hasYearTarget||!this.hasCalendarMonthOutlet)return;let{year:e}=this.calendarMonthOutlet.calendar;this.yearTarget.textContent=new Intl.DateTimeFormat(this.localesValue,{year:this.yearFormatValue}).format(new Date(e,0))}},ze=class extends t.Controller{static targets=[`listbox`,`loading`,`empty`];static values={url:{type:String,default:``},field:{type:String,default:`q`},delay:{type:Number,default:300}};initialize(){this._requestor=new C}onSelect(e){let t=e.target.closest(`[role="option"]`);!t||t.getAttribute(`aria-disabled`)===`true`||this.select(t.dataset.value??``)}select(e){let t=this.listboxTarget.querySelectorAll(`[role="option"]`);t.forEach(e=>e.setAttribute(`aria-selected`,`false`));let n=[...t].find(t=>t.dataset.value===e);n&&n.setAttribute(`aria-selected`,`true`),this.dispatch(`selected`,{detail:{value:e},bubbles:!0})}onNavigate(e){if([`ArrowUp`,`ArrowDown`,`Enter`,` `].includes(e.key)){if(e.preventDefault(),e.key===`Enter`||e.key===` `){this.listboxTarget.querySelector(`[aria-selected="true"]`)?.click();return}this.step(e.key===`ArrowDown`?1:-1)}}step(e){let t=[...this.listboxTarget.querySelectorAll(`[role="option"]:not([aria-disabled="true"]):not([hidden])`)];if(!t.length)return;let n=this.listboxTarget.querySelector(`[aria-selected="true"]`),r=t.indexOf(n),i=e>0?t[Math.min(r+1,t.length-1)]:t[Math.max(r-1,0)];!i||i===n||(t.forEach(e=>e.setAttribute(`aria-selected`,`false`)),i.setAttribute(`aria-selected`,`true`),i.scrollIntoView({block:`nearest`}))}filter(e){if(this.urlValue){let t=new URL(this.urlValue,window.location.href);t.searchParams.set(this.fieldValue,e),this.setLoading(!0),this._requestor.schedule(()=>this._requestor.request(t).then(e=>e.text()).then(e=>{this.listboxTarget.innerHTML=e,this.setEmpty(this.listboxTarget.querySelectorAll(`[role="option"]`).length===0)}).catch(e=>{e.name!==`AbortError`&&console.error(`[combobox-dropdown] fetch failed`,e)}).finally(()=>this.setLoading(!1)),this.delayValue)}else{let t=T(this.listboxTarget,e);this.setEmpty(t===0)}}showAll(){this.listboxTarget.querySelectorAll(`[role="option"]`).forEach(e=>e.hidden=!1),this.setEmpty(!1)}setLoading(e){this.hasLoadingTarget&&(this.loadingTarget.hidden=!e)}setEmpty(e){this.hasEmptyTarget&&(this.emptyTarget.hidden=!e)}disconnect(){this._requestor.cancel()}},$=class extends t.Controller{static targets=[`hour`,`minute`,`period`];connect(){this.select(this.toH24())}onSelect(e){let t=e.target.closest(`[role="option"]`);t&&(t.closest(`[role="listbox"]`).querySelectorAll(`[role="option"]`).forEach(e=>e.setAttribute(`aria-selected`,`false`)),t.setAttribute(`aria-selected`,`true`),this.select(this.toH24()))}select(e){e&&this.dispatch(`selected`,{detail:{value:e},bubbles:!0})}onNavigate(e){[`ArrowUp`,`ArrowDown`].includes(e.key)&&(e.preventDefault(),this.step(e.currentTarget,e.key===`ArrowDown`?1:-1))}step(e,t){let n=[...e.querySelectorAll(`[role="option"]`)],r=e.querySelector(`[aria-selected="true"]`),i=n.indexOf(r),a=t>0?n[Math.min(i+1,n.length-1)]:n[Math.max(i-1,0)];!a||a===r||(n.forEach(e=>e.setAttribute(`aria-selected`,`false`)),a.setAttribute(`aria-selected`,`true`),a.scrollIntoView({block:`nearest`}),this.select(this.toH24()))}toH24(){let e=this.selectedValue(this.hourTarget),t=this.selectedValue(this.minuteTarget);if(!e||!t)return null;if(!this.hasPeriodTarget)return`${e}:${t}`;let n=this.selectedValue(this.periodTarget),r=parseInt(e,10);return r=n===`AM`?r===12?0:r:r===12?12:r+12,`${String(r).padStart(2,`0`)}:${t}`}selectedValue(e){return e?.querySelector(`[aria-selected="true"]`)?.dataset.value??null}},Be=class extends t.Controller{static targets=[`trigger`];connect(){X(this,{trigger:this.hasTriggerTarget?this.triggerTarget:null})}},Ve=class extends t.Controller{static targets=[`anchor`,`reference`];static values={placement:{type:String,default:`bottom`},alignment:{type:String,default:`start`},role:{type:String,default:`tooltip`}};connect(){if(!this.hasReferenceTarget){console.error(`FlipperController requires a reference target. Add data-flipper-target="reference" to your element.`);return}if(!this.hasAnchorTarget){console.error(`FlipperController requires an anchor target. Add data-flipper-target="anchor" to your element.`);return}Ae(this,{element:this.referenceTarget,anchor:this.anchorTarget,placement:this.placementValue,alignment:this.alignmentValue,ariaRole:this.roleValue})}},He=class extends t.Controller{static targets=[`trigger`,`popover`,`value`];static values={value:String,minLength:{type:Number,default:1}};static outlets=[`combobox-dropdown`];connect(){X(this),this.hasPopoverTarget&&Q(this,{element:this.popoverTarget,activator:this.hasTriggerTarget?this.triggerTarget:null})}async dismissed(){await this.close()}async open(){this.hasPopoverTarget&&await this.visibility.show()}async close(){this.hasPopoverTarget&&await this.visibility.hide()}async toggle(){this.visibility?.visible?await this.close():await this.open()}async shown(){this.hasPopoverTarget&&a(this.popoverTarget)}async hidden(){this.hasTriggerTarget&&this.triggerTarget.focus()}async onSelect(e){e.detail?.value!==void 0&&(this.valueValue=e.detail.value),await this.close()}onInput(e){if(e.target!==this.triggerTarget)return;let t=e.target.value.trim();if(t.length<this.minLengthValue){this.hasComboboxDropdownOutlet&&this.comboboxDropdownOutlet.showAll();return}this.hasComboboxDropdownOutlet&&this.comboboxDropdownOutlet.filter(t)}valueValueChanged(e){this.hasValueTarget&&(this.valueTarget.value=e),this.dispatch(`changed`,{detail:{value:e}})}},Ue=class extends t.Controller{static targets=[`input`,`toggle`];static values={type:{type:String,default:`plain`},options:{type:Object,default:{}},revealed:{type:Boolean,default:!1}};connect(){U(this,{type:this.typeValue,options:this.optionsValue}),this.format(this.readValue()),this.drawToggle()}typeValueChanged(){this.formatter&&(U(this,{type:this.typeValue,options:this.optionsValue}),this.format(this.readValue()),this.drawToggle())}optionsValueChanged(){this.formatter&&(U(this,{type:this.typeValue,options:this.optionsValue}),this.format(this.readValue()))}revealedValueChanged(){this.formatter&&(this.format(this.readValue()),this.drawToggle())}onChange(e){this.format(e?.detail?.value??``)}format(e){this.formatter&&this.onFormatting(e)}toggle(){!this.formatter.maskable()&&this.typeValue!==`password`||(this.revealedValue=!this.revealedValue)}onPaste(e){let t=e.detail?.text??``;if(!this.formatter||!t)return;let n=this.formatter.normalize(t);this.formatter.validate(n)&&this.format(n)}drawToggle(){if(!this.hasToggleTarget)return;let e=this.formatter?.maskable()||this.typeValue===`password`;this.toggleTarget.hidden=!e,e&&_(this.toggleTarget,this.revealedValue)}readValue(){return this.hasInputTarget?this.inputTarget instanceof HTMLInputElement?this.inputTarget.value:this.inputTarget.textContent:``}onFormatting(e){if(!this.formatter)return;if(this.typeValue===`password`){this.hasInputTarget&&(this.inputTarget.type=this.revealedValue?`text`:`password`);return}let t=this.formatter.normalize(e),n=this.revealedValue||!this.formatter.maskable()?this.formatter.format(t):this.formatter.mask(t);this.hasInputTarget&&(this.inputTarget instanceof HTMLInputElement?this.inputTarget.value=n:this.inputTarget.textContent=n),this.dispatch(`formatted`,{detail:{value:n}})}},We=class extends t.Controller{static targets=[`input`,`clear`];initialize(){this.onInput=this.draw.bind(this),this.onEscape=this.handleEscape.bind(this)}connect(){this.draw()}inputTargetConnected(e){e.addEventListener(`input`,this.onInput),e.addEventListener(`keydown`,this.onEscape)}inputTargetDisconnected(e){e.removeEventListener(`input`,this.onInput),e.removeEventListener(`keydown`,this.onEscape)}clear(){this.hasInputTarget&&(this.inputTarget.value=``,this.draw(),this.inputTarget.focus(),this.inputTarget.dispatchEvent(new Event(`input`,{bubbles:!0})))}draw(){!this.hasInputTarget||!this.hasClearTarget||(this.clearTarget.hidden=this.inputTarget.value.length===0)}handleEscape(e){e.key===`Escape`&&this.inputTarget.value!==``&&(e.preventDefault(),this.clear())}},Ge=class extends t.Controller{static targets=[`modal`,`overlay`];initialize(){this.onCancel=this.close.bind(this)}connect(){this.hasModalTarget||console.error(`ModalController requires a modal target. Add data-modal-target="modal" to your element.`)}modalTargetConnected(e){this.isNativeDialog=e instanceof HTMLDialogElement,this.isNativeDialog?(e.addEventListener(`cancel`,this.onCancel),e.addEventListener(`click`,this.onBackdropClick)):(this.focusTrap=new o(e,{escapeDeactivates:!0}),X(this,{element:e}))}modalTargetDisconnected(e){this.isNativeDialog&&(e.removeEventListener(`cancel`,this.onCancel),e.removeEventListener(`click`,this.onBackdropClick))}dismissed=()=>{this.close()};open(e){if(e&&e.preventDefault(),this.hasModalTarget){if(this.isNativeDialog)this.previouslyFocused=document.activeElement,this.modalTarget.showModal();else{let e=this.hasOverlayTarget?this.overlayTarget:this.modalTarget;e.hidden=!1,document.body.style.overflow=`hidden`,this.focusTrap&&this.focusTrap.activate()}m(`Modal opened`)}}close(e){if(e&&e.preventDefault(),this.hasModalTarget){if(this.isNativeDialog)this.modalTarget.close(),this.previouslyFocused&&this.previouslyFocused.isConnected&&setTimeout(()=>{this.previouslyFocused.focus()},0);else{let e=this.hasOverlayTarget?this.overlayTarget:this.modalTarget;e.hidden=!0,document.body.style.overflow=``,this.focusTrap&&this.focusTrap.deactivate()}m(`Modal closed`)}}onBackdropClick=e=>{let t=this.modalTarget.getBoundingClientRect();(e.clientY<t.top||e.clientY>t.bottom||e.clientX<t.left||e.clientX>t.right)&&this.close()}},Ke=class extends t.Controller{static targets=[`content`];connect(){Ne(this,{element:this.hasContentTarget?this.contentTarget:null})}},qe=class extends t.Controller{static targets=[`content`,`template`,`loader`,`activator`];static classes=[`hidden`];static values={url:String,loadedAt:String,reload:{type:String,default:`never`},staleAfter:{type:Number,default:3600}};connect(){Te(this,{element:this.hasContentTarget?this.contentTarget:null,url:this.hasUrlValue?this.urlValue:null}),this.hasContentTarget&&Q(this,{element:this.contentTarget,activator:this.hasActivatorTarget?this.activatorTarget:null}),this.hasLoaderTarget&&Q(this,{element:this.loaderTarget,visibility:`contentLoaderVisibility`})}async show(){await this.visibility.show()}async hide(){await this.visibility.hide()}async shown(){await this.load()}canLoad(){return this.hasContentTarget&&this.contentTarget.tagName.toLowerCase()===`turbo-frame`?(this.hasUrlValue&&this.contentTarget.setAttribute(`src`,this.urlValue),!1):!0}async contentLoading(){this.hasLoaderTarget&&await this.contentLoaderVisibility.show()}async contentLoaded({content:e}){this.hasContentTarget&&this.contentTarget.replaceChildren(this.getContentNode(e)),this.hasLoaderTarget&&await this.contentLoaderVisibility.hide()}getContentNode(e){if(typeof e==`string`){let t=document.createElement(`template`);return t.innerHTML=e,document.importNode(t.content,!0)}return document.importNode(e,!0)}contentLoader(){if(this.hasTemplateTarget)return this.templateTarget instanceof HTMLTemplateElement?this.templateTarget.content:this.templateTarget.innerHTML}};e.ARIA_HASPOPUP_VALUES=v,e.CalendarMonthController=Fe,e.CalendarMonthObserverController=Ie,e.ClipboardController=Le,e.ComboboxDateController=Re,e.ComboboxDropdownController=ze,e.ComboboxTimeController=$,e.DismisserController=Be,e.FOCUSABLE_SELECTOR=n,e.FORMATTER_TYPES=z,e.FlipperController=Ve,e.FocusRestoration=s,e.FocusTrap=o,e.Formatter=H,e.InputComboboxController=He,e.InputFormatController=Ue,e.InputSearchController=We,e.ModalController=Ge,e.PannerController=Ke,e.PopoverController=qe,e.Requestor=C,e.RovingTabIndex=f,e.announce=m,e.connectTriggerToTarget=x,e.disconnectTriggerFromTarget=ie,e.ensureId=ee,e.filterOptions=T,e.focusFirst=a,e.fuzzyMatcher=w,e.generateId=h,e.getFocusableElements=r,e.isActivationKey=l,e.isArrowKey=u,e.isKey=c,e.isVisible=i,e.preventDefault=d,e.setAriaState=g,e.setChecked=ne,e.setDisabled=re,e.setExpanded=te,e.setPressed=_});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`@hotwired/stimulus`)):typeof define==`function`&&define.amd?define([`exports`,`@hotwired/stimulus`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.StimulusPlumbersControllers={},e.Stimulus))})(this,function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var n=[`a[href]`,`area[href]`,`button:not([disabled])`,`input:not([disabled])`,`select:not([disabled])`,`textarea:not([disabled])`,`[tabindex]:not([tabindex="-1"])`,`audio[controls]`,`video[controls]`,`[contenteditable]:not([contenteditable="false"])`].join(`,`);function r(e){return Array.from(e.querySelectorAll(n)).filter(e=>i(e))}function i(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)}function a(e){let t=r(e);return t.length>0?(t[0].focus(),!0):!1}var o=class{constructor(e,t={}){this.container=e,this.previouslyFocused=null,this.options=t,this.isActive=!1}activate(){this.isActive||(this.previouslyFocused=document.activeElement,this.isActive=!0,this.options.initialFocus?this.options.initialFocus.focus():a(this.container),this.container.addEventListener(`keydown`,this.handleKeyDown))}deactivate(){if(!this.isActive)return;this.isActive=!1,this.container.removeEventListener(`keydown`,this.handleKeyDown);let e=this.options.returnFocus||this.previouslyFocused;e&&i(e)&&e.focus()}handleKeyDown=e=>{if(e.key===`Escape`&&this.options.escapeDeactivates){e.preventDefault(),this.deactivate();return}if(e.key!==`Tab`)return;let t=r(this.container);if(t.length===0)return;let n=t[0],i=t[t.length-1];e.shiftKey&&document.activeElement===n?(e.preventDefault(),i.focus()):!e.shiftKey&&document.activeElement===i&&(e.preventDefault(),n.focus())}},s=class{constructor(){this.savedElement=null}save(){this.savedElement=document.activeElement}restore(){this.savedElement&&i(this.savedElement)&&(this.savedElement.focus(),this.savedElement=null)}};function c(e,t){return e.key===t}function l(e){return e.key===`Enter`||e.key===` `}function u(e){return[`ArrowUp`,`ArrowDown`,`ArrowLeft`,`ArrowRight`].includes(e.key)}function d(e){e.preventDefault(),e.stopPropagation()}var f=class{constructor(e,t=0){this.items=e,this.currentIndex=t,this.updateTabIndex()}handleKeyDown(e){let t;switch(e.key){case`ArrowDown`:case`ArrowRight`:e.preventDefault(),t=(this.currentIndex+1)%this.items.length;break;case`ArrowUp`:case`ArrowLeft`:e.preventDefault(),t=this.currentIndex===0?this.items.length-1:this.currentIndex-1;break;case`Home`:e.preventDefault(),t=0;break;case`End`:e.preventDefault(),t=this.items.length-1;break;default:return}this.setCurrentIndex(t)}setCurrentIndex(e){e>=0&&e<this.items.length&&(this.currentIndex=e,this.updateTabIndex(),this.items[e].focus())}updateTabIndex(){this.items.forEach((e,t)=>{e.tabIndex=t===this.currentIndex?0:-1})}updateItems(e){this.items=e,this.currentIndex=Math.min(this.currentIndex,e.length-1),this.updateTabIndex()}},p=(e,t,n)=>{let r=document.querySelector(`[data-live-region="${e}"]`);return r||(r=document.createElement(`div`),r.className=`sr-only`,r.dataset.liveRegion=e,r.setAttribute(`aria-live`,e),r.setAttribute(`aria-atomic`,t.toString()),r.setAttribute(`aria-relevant`,n),document.body.appendChild(r)),r};function m(e,t={}){let{politeness:n=`polite`,atomic:r=!0,relevant:i=`additions text`}=t,a=p(n,r,i);a.textContent=``,setTimeout(()=>{a.textContent=e},100)}var h=(e=`a11y`)=>`${e}-${Math.random().toString(36).substr(2,9)}`,ee=(e,t=`element`)=>e.id||=h(t),g=(e,t,n)=>{e.setAttribute(t,n.toString())},te=(e,t)=>g(e,`aria-expanded`,t),_=(e,t)=>g(e,`aria-pressed`,t),ne=(e,t)=>g(e,`aria-checked`,t);function re(e,t){g(e,`aria-disabled`,t),t?e.setAttribute(`tabindex`,`-1`):e.removeAttribute(`tabindex`)}var v={menu:`menu`,listbox:`listbox`,tree:`tree`,grid:`grid`,dialog:`dialog`},y=(e,t,n)=>{Object.entries(t).forEach(([t,r])=>{e.setAttribute(t,r),n[t]=r})},b=(e,t,n)=>n||!e.hasAttribute(t);function x({trigger:e,target:t,role:n=null,override:r=!1}){let i={trigger:{},target:{}};if(!e||!t)return i;let a={},o={};if(n&&b(t,`role`,r)&&(o.role=n),t.id&&(b(e,`aria-controls`,r)&&(a[`aria-controls`]=t.id),n===`tooltip`&&b(e,`aria-describedby`,r)&&(a[`aria-describedby`]=t.id)),n&&b(e,`aria-haspopup`,r)){let e=v[n]||`true`;e&&(a[`aria-haspopup`]=e)}return y(t,o,i.target),y(e,a,i.trigger),i}var S=(e,t)=>{t.forEach(t=>{e.hasAttribute(t)&&e.removeAttribute(t)})};function ie({trigger:e,target:t,attributes:n=null}){!e||!t||(S(e,n||[`aria-controls`,`aria-haspopup`,`aria-describedby`]),(!n||n.includes(`role`))&&S(t,[`role`]))}var C=class{constructor(){this._abortController=null,this._timer=null}schedule(e,t){clearTimeout(this._timer),this._timer=setTimeout(e,t)}async request(e,t={}){this._abortController?.abort(),this._abortController=new AbortController;let n=await fetch(e,{...t,signal:this._abortController.signal});if(!n.ok)throw Error(`${n.status}`);return n}cancel(){clearTimeout(this._timer),this._abortController?.abort()}};function w(e,t){let n=0;for(let r=0;r<t.length&&n<e.length;r++)t[r]===e[n]&&n++;return n===e.length}function ae(e,t){return t.includes(e)}function oe(e,t){return t.startsWith(e)}function se(e){return e===`contains`?ae:e===`prefix`?oe:w}function ce(e,t){return t===`textContent`?e.textContent?.trim().toLowerCase()??``:(e.getAttribute(t)??``).toLowerCase()}function T(e,t,n={}){let{strategy:r=`fuzzy`,matcher:i,fields:a=[`textContent`]}=n,o=typeof i==`function`?i:se(r),s=t.toLowerCase(),c=0;return e.querySelectorAll(`[role="option"]`).forEach(e=>{let t=a.some(t=>o(s,ce(e,t)));e.hidden=!t,t&&c++}),c}var E={get top(){return`bottom`},get bottom(){return`top`},get left(){return`right`},get right(){return`left`}};function D({x:e,y:t,width:n,height:r}){return{x:e,y:t,width:n,height:r,left:e,right:e+n,top:t,bottom:t+r}}function O(){return D({x:0,y:0,width:window.innerWidth||document.documentElement.clientWidth,height:window.innerHeight||document.documentElement.clientHeight})}function le(e){if(!(e instanceof HTMLElement))return!1;let t=O(),n=e.getBoundingClientRect(),r=n.top<=t.height&&n.top+n.height>0,i=n.left<=t.width&&n.left+n.width>0;return r&&i}var k={get visibleOnly(){return!0},hiddenClass:null},ue={element:null,visible:null,dispatch:!0,prefix:``},A=class{constructor(e,t={}){this.controller=e;let{element:n,visible:r,dispatch:i,prefix:a}=Object.assign({},ue,t);this.element=n||e.element,this.visibleOnly=typeof r==`boolean`?r:k.visibleOnly,this.visibleCallback=typeof r==`string`?r:null,this.notify=!!i,this.prefix=typeof a==`string`&&a?a:e.identifier}get visible(){return this.element instanceof HTMLElement?this.visibleOnly?le(this.element)&&this.isVisible(this.element):!0:!1}isVisible(e){if(this.visibleCallback){let t=this.findCallback(this.visibleCallback);if(typeof t==`function`)return t(e)}return e instanceof HTMLElement?!e.hasAttribute(`hidden`):!1}dispatch(e,{target:t=null,prefix:n=null,detail:r=null}={}){if(this.notify)return this.controller.dispatch(e,{target:t||this.element,prefix:n||this.prefix,detail:r})}findCallback(e){if(typeof e!=`string`)return;let t=this,n=e.split(`.`).reduce((e,t)=>e&&e[t],t.controller);if(typeof n==`function`)return n.bind(t.controller);let r=e.split(`.`).reduce((e,t)=>e&&e[t],t);if(typeof r==`function`)return r.bind(t)}async awaitCallback(e,...t){if(typeof e==`string`&&(e=this.findCallback(e)),typeof e==`function`){let n=e(...t);return n instanceof Promise?await n:n}}},de={normalize(e){return typeof e==`string`?e:``},validate(){return!0}};function fe(e){let t=0,n=!1;for(let r=e.length-1;r>=0;r--){let i=parseInt(e[r],10);n&&(i*=2,i>9&&(i-=9)),t+=i,n=!n}return t%10==0}var pe=/\D/g,me=/^\d{13,19}$/,he=/(.{4})(?=.)/g,ge={normalize(e){return typeof e==`string`?e.replace(pe,``):``},validate(e){return typeof e!=`string`||!me.test(e)?!1:fe(e)},format(e){return typeof e==`string`?e.replace(he,`$1 `):``}},j={1:10},M=/\D/g,_e=/^\+\d{7,15}$/,ve={normalize(e){if(typeof e!=`string`)return``;let t=e.trimStart().startsWith(`+`),n=e.replace(M,``);return t?`+${n}`:n},validate(e){if(typeof e!=`string`)return!1;if(_e.test(e))return!0;let t=e.replace(M,``);return Object.values(j).includes(t.length)},format(e){if(typeof e!=`string`)return``;let t=e.replace(M,``);for(let[e,n]of Object.entries(j)){if(t.length===n)return`(${t.slice(0,3)}) ${t.slice(3,6)}-${t.slice(6)}`;let r=n+e.length;if(t.length===r&&t.startsWith(e)){let n=t.slice(e.length);return`+${e} (${n.slice(0,3)}) ${n.slice(3,6)}-${n.slice(6)}`}}return e}},N=/[^\d.,-]/g,P=/^-?\d+(\.\d+)?$/,F={normalize(e){if(typeof e!=`string`)return``;let t=e.replace(N,``);if(!t)return``;let n=t.lastIndexOf(`,`),r=t.lastIndexOf(`.`);return n>-1&&r>-1?n>r?t.replace(/\./g,``).replace(`,`,`.`):t.replace(/,/g,``):n>-1?t.slice(n+1).length<=2?t.replace(`,`,`.`):t.replace(/,/g,``):t},validate(e){return typeof e==`string`?P.test(e):!1},format(e,t={}){if(typeof e!=`string`)return``;let n=parseFloat(e);if(isNaN(n))return e;let r=t.locale||`en-US`,i=t.currency||`USD`,a=t.fractionDigits===void 0?{}:{minimumFractionDigits:t.fractionDigits,maximumFractionDigits:t.fractionDigits};try{return new Intl.NumberFormat(r,{style:`currency`,currency:i,...a}).format(n)}catch{return e}}},I=/^\d{4}-\d{2}-\d{2}$/,ye=/^(\d{1,4})[/\-.](\d{1,2})[/\-.](\d{1,4})$/,be=/\D/g,L={normalize(e){if(typeof e!=`string`)return``;let t=e.trim();if(I.test(t))return t;let n=t.match(ye);if(n){let[,e,t,r]=n;if(e.length===4)return`${e}-${t.padStart(2,`0`)}-${r.padStart(2,`0`)}`;if(r.length===4)return`${r}-${e.padStart(2,`0`)}-${t.padStart(2,`0`)}`}let r=t.replace(be,``);if(r.length===8){let e=parseInt(r.slice(0,4),10);return e>=1e3&&e<=9999?`${r.slice(0,4)}-${r.slice(4,6)}-${r.slice(6,8)}`:`${r.slice(4,8)}-${r.slice(0,2)}-${r.slice(2,4)}`}return t},validate(e){if(typeof e!=`string`)return!1;let t=L.normalize(e);if(!I.test(t))return!1;let n=new Date(`${t}T00:00:00Z`);return!isNaN(n.getTime())&&n.toISOString().startsWith(t)},format(e,t={}){if(typeof e!=`string`)return``;let n=new Date(`${e}T00:00:00Z`);if(isNaN(n.getTime()))return e;let r=t.locale||`en-US`;try{return new Intl.DateTimeFormat(r,{year:t.year||`numeric`,month:t.month||`2-digit`,day:t.day||`2-digit`,timeZone:t.timeZone||`UTC`}).format(n)}catch{return e}}},xe=/^([01]?\d|2[0-3]):([0-5]\d)$/,R={normalize(e){if(typeof e!=`string`)return``;let t=e.trim();if(xe.test(t)){let[e,n]=t.split(`:`);return`${String(parseInt(e,10)).padStart(2,`0`)}:${n}`}let n=t.match(/^(\d{1,2}):(\d{2})\s*(AM|PM)$/i);if(n){let e=parseInt(n[1],10),t=n[2];return e=n[3].toUpperCase()===`AM`?e===12?0:e:e===12?12:e+12,e>23||parseInt(t,10)>59?``:`${String(e).padStart(2,`0`)}:${t}`}return``},validate(e){return R.normalize(e)!==``},format(e,t={}){if(typeof e!=`string`)return``;let n=e.match(/^(\d{2}):(\d{2})$/);if(!n)return e;let r=parseInt(n[1],10),i=n[2];if(t.format===`h24`)return`${String(r).padStart(2,`0`)}:${i}`;let a=r<12?`AM`:`PM`;return`${r%12||12}:${i} ${a}`}},z={PLAIN:`plain`,CREDIT_CARD:`creditCard`,PHONE:`phone`,CURRENCY:`currency`,DATE:`date`,TIME:`time`},B=new Map([[z.PLAIN,de],[z.CREDIT_CARD,ge],[z.PHONE,ve],[z.CURRENCY,F],[z.DATE,L],[z.TIME,R]]),V={type:z.PLAIN,options:{}},H=class extends A{static register(e,t){B.set(e,t)}constructor(e,t={}){super(e,t),this.type=t.type??V.type,this.options=t.options??V.options,this.enhance()}enhance(){let e=this,t=B.get(e.type)??B.get(z.PLAIN),n={normalize:n=>t.normalize?.(n,e.options)??(typeof n==`string`?n:``),validate:n=>t.validate?.(n,e.options)??!0,format:n=>t.format?.(n,e.options)??(typeof n==`string`?n:``),mask:n=>t.mask?.(n,e.options)??null,maskable:()=>typeof t.mask==`function`};Object.defineProperty(this.controller,`formatter`,{get(){return n},configurable:!0})}},U=(e,t)=>new H(e,t),Se=/^\d{4}-\d{2}-\d{2}$/;function W(e){return e instanceof Date&&!isNaN(e)}function G(...e){if(e.length===0)throw`Missing values to parse as date`;if(e.length===1){let t=e[0];if(!t)return;if(typeof t==`string`&&Se.test(t)){let[e,n,r]=t.split(`-`).map(Number),i=new Date(e,n-1,r);if(W(i))return i}else{let e=new Date(t);if(W(e))return e}}else{let t=new Date(...e);if(W(t))return t}}var K=7,q={locales:[`default`],today:``,day:null,month:null,year:null,since:null,till:null,disabledDates:[],disabledWeekdays:[],disabledDays:[],disabledMonths:[],disabledYears:[],firstDayOfWeek:0,onNavigated:`navigated`},Ce=class extends A{constructor(e,t={}){super(e,t);let n=Object.assign({},q,t),{onNavigated:r,since:i,till:a,firstDayOfWeek:o}=n;this.onNavigated=r,this.since=G(i),this.till=G(a),this.firstDayOfWeek=0<=o&&o<7?o:q.firstDayOfWeek;let{disabledDates:s,disabledWeekdays:c,disabledDays:l,disabledMonths:u,disabledYears:d}=n;this.disabledDates=Array.isArray(s)?s:[],this.disabledWeekdays=Array.isArray(c)?c:[],this.disabledDays=Array.isArray(l)?l:[],this.disabledMonths=Array.isArray(u)?u:[],this.disabledYears=Array.isArray(d)?d:[];let{today:f,day:p,month:m,year:h}=n;this.now=G(f)||new Date,typeof h==`number`&&typeof m==`number`&&typeof p==`number`?this.current=G(h,m,p):this.current=this.now,this.build(),this.enhance()}build(){this.daysOfWeek=this.buildDaysOfWeek(),this.daysOfMonth=this.buildDaysOfMonth(),this.monthsOfYear=this.buildMonthsOfYear()}buildDaysOfWeek(){let e=new Intl.DateTimeFormat(this.localesValue,{weekday:`long`}),t=new Intl.DateTimeFormat(this.localesValue,{weekday:`short`}),n=new Date(`2024-10-06`),r=[];for(let i=this.firstDayOfWeek,a=i+7;i<a;i++){let a=new Date(n);a.setDate(n.getDate()+i),r.push({date:a,value:a.getDay(),long:e.format(a),short:t.format(a)})}return r}buildDaysOfMonth(){let e=this.month,t=this.year,n=[],r=e=>({current:this.month===e.getMonth()&&this.year===e.getFullYear(),date:e,value:e.getDate(),month:e.getMonth(),year:e.getFullYear(),iso:e.toISOString()}),i=new Date(t,e).getDay(),a=this.firstDayOfWeek-i;for(let i=a>0?a-7:a;i<0;i++){let a=new Date(t,e,i+1);n.push(r(a))}let o=new Date(t,e+1,0).getDate();for(let i=1;i<=o;i++){let a=new Date(t,e,i);n.push(r(a))}let s=n.length%K,c=s===0?0:K-s;for(let i=1;i<=c;i++){let a=new Date(t,e+1,i);n.push(r(a))}return n}buildMonthsOfYear(){let e=new Intl.DateTimeFormat(this.localesValue,{month:`long`}),t=new Intl.DateTimeFormat(this.localesValue,{month:`short`}),n=new Intl.DateTimeFormat(this.localesValue,{month:`numeric`}),r=[];for(let i=0;i<12;i++){let a=new Date(this.year,i);r.push({date:a,value:a.getMonth(),long:e.format(a),short:t.format(a),numeric:n.format(a)})}return r}get today(){return this.now}set today(e){if(!W(e))return;let t=this.month??e.getMonth(),n=this.year??e.getFullYear(),r=t==e.getMonth()&&n==e.getFullYear()?e.getDate():1;this.now=new Date(n,t,r)}get current(){return typeof this.year==`number`&&typeof this.month==`number`&&typeof this.day==`number`?G(this.year,this.month,this.day):null}set current(e){W(e)&&(this.day=e.getDate(),this.month=e.getMonth(),this.year=e.getFullYear())}navigate=async e=>{if(!W(e))return;let t=this.current,n=e.toISOString(),r=t.toISOString();this.dispatch(`navigate`,{detail:{from:r,to:n}}),this.current=e,this.build(),await this.awaitCallback(this.onNavigated,{from:r,to:n}),this.dispatch(`navigated`,{detail:{from:r,to:n}})};step=async(e,t)=>{if(t===0)return;let n=this.current;switch(e){case`year`:n.setFullYear(n.getFullYear()+t);break;case`month`:n.setMonth(n.getMonth()+t);break;case`day`:n.setDate(n.getDate()+t);break;default:return}await this.navigate(n)};isDisabled=e=>{if(!W(e))return!1;if(this.disabledDates.length){let t=e.getTime();for(let e of this.disabledDates)if(t===new Date(e).getTime())return!0}if(this.disabledWeekdays.length){let t=e.getDay(),n=this.daysOfWeek,r=n.findIndex(e=>e.value===t);if(r>=0){let e=n[r];for(let t of this.disabledWeekdays)if(e.value==t||e.short===t||e.long===t)return!0}}if(this.disabledDays.length){let t=e.getDate();for(let e of this.disabledDays)if(t==e)return!0}if(this.disabledMonths.length){let t=e.getMonth(),n=this.monthsOfYear,r=n.findIndex(e=>e.value===t);if(r>=0){let e=n[r];for(let t of this.disabledMonths)if(e.value==t||e.short===t||e.long===t)return!0}}if(this.disabledYears.length){let t=e.getFullYear();for(let e of this.disabledYears)if(t==e)return!0}return!1};isWithinRange=e=>{if(!W(e))return!1;let t=!0;return this.since&&(t&&=e>=this.since),this.till&&(t&&=e<=this.till),t};enhance(){let e=this;Object.assign(this.controller,{get calendar(){return{get today(){return e.today},get current(){return e.current},get day(){return e.day},get month(){return e.month},get year(){return e.year},get since(){return e.since},get till(){return e.till},get firstDayOfWeek(){return e.firstDayOfWeek},get disabledDates(){return e.disabledDates},get disabledWeekdays(){return e.disabledWeekdays},get disabledDays(){return e.disabledDays},get disabledMonths(){return e.disabledMonths},get disabledYears(){return e.disabledYears},get daysOfWeek(){return e.daysOfWeek},get daysOfMonth(){return e.daysOfMonth},get monthsOfYear(){return e.monthsOfYear},navigate:async t=>await e.navigate(t),step:async(t,n)=>await e.step(t,n),isDisabled:t=>e.isDisabled(t),isWithinRange:t=>e.isWithinRange(t)}}})}},we=(e,t)=>new Ce(e,t),J={content:null,url:``,reload:`never`,stale:3600,onLoad:`canLoad`,onLoaded:`contentLoaded`},Te=class extends A{constructor(e,t={}){super(e,t);let n=Object.assign({},J,t),{content:r,url:i,reload:a,stale:o}=n;this.content=r,this.url=i,this.reload=typeof a==`string`?a:J.reload,this.stale=typeof o==`number`?o:J.stale;let{onLoad:s,onLoaded:c}=n;this.onLoad=s,this.onLoaded=c,this._requestor=new C,this.enhance()}get reloadable(){switch(this.reload){case`never`:return!1;case`always`:return!0;default:{let e=G(this.loadedAt);return e&&new Date-e>this.stale*1e3}}}contentLoadable=({url:e})=>!!e;contentLoader=async()=>``;remoteContentLoader=async e=>(await this._requestor.request(e)).text();load=async()=>{if(this.loadedAt&&!this.reloadable)return;let e=this.findCallback(this.onLoad),t=await this.awaitCallback(e||this.contentLoadable,{url:this.url});if(this.dispatch(`load`,{detail:{url:this.url}}),!t)return;this.dispatch(`loading`,{detail:{url:this.url}});let n=this.url?await this.remoteContentLoader(this.url):await this.contentLoader();n&&(await this.awaitCallback(this.onLoaded,{url:this.url,content:n}),this.loadedAt=new Date().getTime(),this.dispatch(`loaded`,{detail:{url:this.url,content:n}}))};enhance(){let e=this;Object.assign(this.controller,{load:e.load.bind(e)})}},Ee=(e,t)=>new Te(e,t),Y=class extends A{observe(e){this._handler=e,this.events.forEach(t=>window.addEventListener(t,e,!0))}unobserve(){this._handler&&this.events.forEach(e=>window.removeEventListener(e,this._handler,!0))}enhance(){let e=this,t=this.controller.disconnect?.bind(this.controller)||(()=>{});this.controller.disconnect=()=>{e.unobserve(),t()}}},De={trigger:null,events:[`click`],onDismissed:`dismissed`},Oe=class extends Y{constructor(e,t={}){super(e,t);let{trigger:n,events:r,onDismissed:i}=Object.assign({},De,t);this.onDismissed=i,this.trigger=n||this.element,this.events=r,this.enhance(),this.observe(this.dismiss)}dismiss=async e=>{let{target:t}=e;t instanceof HTMLElement&&(this.element.contains(t)||this.visible&&(this.dispatch(`dismiss`),await this.awaitCallback(this.onDismissed,{target:this.trigger}),this.dispatch(`dismissed`)))}},X=(e,t)=>new Oe(e,t),ke={anchor:null,events:[`click`],placement:`bottom`,alignment:`start`,onFlipped:`flipped`,ariaRole:null,respectMotion:!0},Ae=class extends Y{constructor(e,t={}){super(e,t);let{anchor:n,events:r,placement:i,alignment:a,onFlipped:o,ariaRole:s,respectMotion:c}=Object.assign({},ke,t);this.anchor=n,this.events=r,this.placement=i,this.alignment=a,this.onFlipped=o,this.ariaRole=s,this.respectMotion=c,this.prefersReducedMotion=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches,this.anchor&&this.element&&x({trigger:this.anchor,target:this.element,role:this.ariaRole}),this.enhance(),this.observe(this.flip)}flip=async()=>{if(!this.visible)return;this.dispatch(`flip`),window.getComputedStyle(this.element).position!=`absolute`&&(this.element.style.position=`absolute`);let e=this.flippedRect(this.anchor.getBoundingClientRect(),this.element.getBoundingClientRect());this.element.style.transition=this.respectMotion&&this.prefersReducedMotion?`none`:``;for(let[t,n]of Object.entries(e))this.element.style[t]=n;await this.awaitCallback(this.onFlipped,{target:this.element,placement:e}),this.dispatch(`flipped`,{detail:{placement:e}})};flippedRect(e,t){let n=this.quadrumRect(e,O()),r=[this.placement,E[this.placement]],i={};for(;!Object.keys(i).length&&r.length>0;){let a=r.shift();if(!this.biggerRectThan(n[a],t))continue;let o=this.quadrumPlacement(e,a,t),s=this.quadrumAlignment(e,a,o);i.top=`${s.top+window.scrollY}px`,i.left=`${s.left+window.scrollX}px`}return Object.keys(i).length||(i.top=``,i.left=``),i}quadrumRect(e,t){return{left:D({x:t.x,y:t.y,width:e.x-t.x,height:t.height}),right:D({x:e.x+e.width,y:t.y,width:t.width-(e.x+e.width),height:t.height}),top:D({x:t.x,y:t.y,width:t.width,height:e.y-t.y}),bottom:D({x:t.x,y:e.y+e.height,width:t.width,height:t.height-(e.y+e.height)})}}quadrumPlacement(e,t,n){switch(t){case`top`:return D({x:n.x,y:e.y-n.height,width:n.width,height:n.height});case`bottom`:return D({x:n.x,y:e.y+e.height,width:n.width,height:n.height});case`left`:return D({x:e.x-n.width,y:n.y,width:n.width,height:n.height});case`right`:return D({x:e.x+e.width,y:n.y,width:n.width,height:n.height});default:throw`Unable place at the quadrum, ${t}`}}quadrumAlignment(e,t,n){switch(t){case`top`:case`bottom`:{let t=e.x;return this.alignment===`center`?t=e.x+e.width/2-n.width/2:this.alignment===`end`&&(t=e.x+e.width-n.width),D({x:t,y:n.y,width:n.width,height:n.height})}case`left`:case`right`:{let t=e.y;return this.alignment===`center`?t=e.y+e.height/2-n.height/2:this.alignment===`end`&&(t=e.y+e.height-n.height),D({x:n.x,y:t,width:n.width,height:n.height})}default:throw`Unable align at the quadrum, ${t}`}}biggerRectThan(e,t){return e.height>=t.height&&e.width>=t.width}enhance(){super.enhance(),this.controller.flip=this.flip}},je=(e,t)=>new Ae(e,t),Me={events:[`resize`],boundaries:[`top`,`left`,`right`],onShifted:`shifted`,respectMotion:!0},Ne=class extends Y{constructor(e,t={}){super(e,t);let{onShifted:n,events:r,boundaries:i,respectMotion:a}=Object.assign({},Me,t);this.onShifted=n,this.events=r,this.boundaries=i,this.respectMotion=a,this.prefersReducedMotion=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches,this.enhance(),this.observe(this.shift)}shift=async()=>{if(!this.visible)return;this.dispatch(`shift`);let e=this.overflowRect(this.element.getBoundingClientRect(),this.elementTranslations(this.element)),t=e.left||e.right||0,n=e.top||e.bottom||0;this.element.style.transition=this.respectMotion&&this.prefersReducedMotion?`none`:``,this.element.style.transform=`translate(${t}px, ${n}px)`,await this.awaitCallback(this.onShifted,e),this.dispatch(`shifted`,{detail:e})};overflowRect(e,t){let n={},r=O(),i=D({x:e.x-t.x,y:e.y-t.y,width:e.width,height:e.height});for(let e of this.boundaries){let t=this.directionDistance(i,e,r),a=E[e];t<0?i[a]+t>=r[a]&&!n[a]&&(n[e]=t):n[e]=``}return n}directionDistance(e,t,n){switch(t){case`top`:case`left`:return e[t]-n[t];case`bottom`:case`right`:return n[t]-e[t];default:throw`Invalid direction to calcuate distance, ${t}`}}elementTranslations(e){let t=window.getComputedStyle(e),n=t.transform||t.webkitTransform||t.mozTransform;if(n===`none`||n===void 0)return{x:0,y:0};let r=n.includes(`3d`)?`3d`:`2d`,i=n.match(/matrix.*\((.+)\)/)[1].split(`, `);return r===`2d`?{x:Number(i[4]),y:Number(i[5])}:{x:0,y:0}}enhance(){super.enhance(),this.controller.shift=this.shift}},Pe=(e,t)=>new Ne(e,t),Z={visibility:`visibility`,onShown:`shown`,onHidden:`hidden`},Fe=class extends A{constructor(e,t={}){let{visibility:n,onShown:r,onHidden:i,activator:a}=Object.assign({},Z,t),o=typeof n==`string`?n:Z.namespace,s=typeof t.visible==`string`?t.visible:`isVisible`;(typeof t.visible!=`boolean`||t.visible)&&(t.visible=`${o}.${s}`),super(e,t),this.visibility=o,this.visibilityResolver=s,this.onShown=r,this.onHidden=i,this.activator=a instanceof HTMLElement?a:null,this.enhance(),this.element instanceof HTMLElement&&this.activate(this.isVisible(this.element))}isVisible(e){if(!(e instanceof HTMLElement))return!1;let t=k.hiddenClass;return t?!e.classList.contains(t):!e.hasAttribute(`hidden`)}toggle(e,t){if(!(e instanceof HTMLElement))return;let n=k.hiddenClass;n?t?e.classList.remove(n):e.classList.add(n):t?e.removeAttribute(`hidden`):e.setAttribute(`hidden`,!0)}activate(e){this.activator&&this.activator.setAttribute(`aria-expanded`,e?`true`:`false`)}async show(){!(this.element instanceof HTMLElement)||this.isVisible(this.element)||(this.dispatch(`show`),this.toggle(this.element,!0),this.activate(!0),await this.awaitCallback(this.onShown,{target:this.element}),this.dispatch(`shown`))}async hide(){!(this.element instanceof HTMLElement)||!this.isVisible(this.element)||(this.dispatch(`hide`),this.toggle(this.element,!1),this.activate(!1),await this.awaitCallback(this.onHidden,{target:this.element}),this.dispatch(`hidden`))}enhance(){let e=this,t={show:e.show.bind(e),hide:e.hide.bind(e)};Object.defineProperty(t,`visible`,{get(){return e.isVisible(e.element)}}),Object.defineProperty(t,this.visibilityResolver,{value:e.isVisible.bind(e)}),Object.defineProperty(this.controller,this.visibility,{get(){return t}})}},Q=(e,t)=>new Fe(e,t),Ie=class extends t.Controller{static targets=[`daysOfWeek`,`daysOfMonth`];static classes=[`dayOfWeek`,`dayOfMonth`,`week`];static values={locales:{type:Array,default:[`default`]},weekdayFormat:{type:String,default:`short`},dayFormat:{type:String,default:`numeric`},daysOfOtherMonth:{type:Boolean,default:!1},today:{type:String,default:``},selected:{type:String,default:``}};initialize(){we(this,{today:this.todayValue})}connect(){this.draw()}navigated(){this.draw()}selectedValueChanged(){if(!this.hasDaysOfMonthTarget||(this.daysOfMonthTarget.querySelectorAll(`[aria-selected]`).forEach(e=>{e.setAttribute(`aria-selected`,`false`)}),!this.selectedValue))return;let e=G(this.selectedValue);if(!e)return;let t=this.daysOfMonthTarget.querySelector(`time[datetime="${e.toISOString()}"]`);t&&t.closest(`[aria-selected]`).setAttribute(`aria-selected`,`true`)}onSelect(e){let t=e.detail?.iso;t&&(this.selectedValue=t)}draw(){this.drawDaysOfWeek(),this.drawDaysOfMonth(),this.selectedValueChanged()}createDayElement(e,{selectable:t=!1,disabled:n=!1}={}){let r=document.createElement(t?`button`:`div`);return r.tabIndex=-1,e?r.textContent=e:r.setAttribute(`aria-hidden`,`true`),n&&(r instanceof HTMLButtonElement?r.disabled=!0:r.setAttribute(`aria-disabled`,`true`)),r}drawDaysOfWeek(){if(!this.hasDaysOfWeekTarget)return;let e=new Intl.DateTimeFormat(this.localesValue,{weekday:this.weekdayFormatValue}),t=[];for(let n of this.calendar.daysOfWeek){let r=this.createDayElement(e.format(n.date));r.setAttribute(`role`,`columnheader`),r.title=n.long,this.hasDayOfWeekClass&&r.classList.add(...this.dayOfWeekClasses),t.push(r)}let n=document.createElement(`div`);n.setAttribute(`role`,`row`),this.hasWeekClass&&n.classList.add(...this.weekClasses),n.replaceChildren(...t),this.daysOfWeekTarget.replaceChildren(n)}drawDaysOfMonth(){if(!this.hasDaysOfMonthTarget)return;let e=this.calendar.today,t=new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),n=[];for(let e of this.calendar.daysOfMonth){let r=!e.current||this.calendar.isDisabled(e.date)||!this.calendar.isWithinRange(e.date),i=e.current||this.daysOfOtherMonthValue?e.value:``,a=this.createDayElement(i,{selectable:e.current,disabled:r});t===e.date.getTime()&&a.setAttribute(`aria-current`,`date`),(e.current||this.daysOfOtherMonthValue)&&a.setAttribute(`aria-selected`,``),this.hasDayOfMonthClass&&a.classList.add(...this.dayOfMonthClasses);let o=document.createElement(`time`);o.dateTime=e.iso,a.appendChild(o),n.push(a)}let r=[];for(let e=0;e<n.length;e+=7){let t=document.createElement(`div`);t.setAttribute(`role`,`row`),this.hasWeekClass&&t.classList.add(...this.weekClasses);for(let r of n.slice(e,e+7))r.setAttribute(`role`,`gridcell`),t.appendChild(r);r.push(t)}this.daysOfMonthTarget.replaceChildren(...r)}},Le=class extends t.Controller{onSelect(e){if(!(e.target instanceof HTMLElement))return;e.preventDefault();let t=e.target instanceof HTMLTimeElement?e.target.parentElement:e.target;if(t.disabled||t.getAttribute(`aria-disabled`)===`true`)return;this.dispatch(`selecting`,{target:t});let n=e.target instanceof HTMLTimeElement?e.target:e.target.querySelector(`time`);if(!n)return console.error(`unable to locate time element within ${t}`);let r=G(n.dateTime);if(!r)return console.error(`unable to parse ${n.dateTime} found within the time element`);this.select(r.toISOString())}select(e){let t=G(e);t&&this.dispatch(`selected`,{detail:{epoch:t.getTime(),iso:e}})}},Re=class extends t.Controller{static targets=[`source`];static values={contentType:{type:String,default:`text/plain`}};onPaste(e){let t=e.clipboardData?.getData(this.contentTypeValue)??``,n=Array.from(e.clipboardData?.types??[]);e.preventDefault(),this.dispatch(`pasted`,{detail:{text:t,types:n},bubbles:!0})}async copy(e){let t=e.params?.text??(this.hasSourceTarget?this.sourceTarget.value??this.sourceTarget.textContent??``:``);try{await navigator.clipboard.writeText(t),this.dispatch(`copied`,{detail:{text:t},bubbles:!0})}catch(e){this.dispatch(`copy-failed`,{detail:{error:e},bubbles:!0})}}},ze=class extends t.Controller{static targets=[`previous`,`next`,`day`,`month`,`year`];static outlets=[`calendar-month`];static values={date:String,locales:{type:Array,default:[`default`]},dayFormat:{type:String,default:`numeric`},monthFormat:{type:String,default:`long`},yearFormat:{type:String,default:`numeric`}};initialize(){this.previous=this.previous.bind(this),this.next=this.next.bind(this)}async calendarMonthOutletConnected(){if(this.dateValue){let e=G(this.dateValue);e&&await this.calendarMonthOutlet.calendar.navigate(e)}this.draw()}onSelect(e){this.dateValue=e.detail.iso,this.draw(),this.dispatch(`selected`,{detail:{value:e.detail.iso},bubbles:!0})}previousTargetConnected(e){e.addEventListener(`click`,this.previous)}previousTargetDisconnected(e){e.removeEventListener(`click`,this.previous)}async previous(){await this.calendarMonthOutlet.calendar.step(`month`,-1),this.draw()}nextTargetConnected(e){e.addEventListener(`click`,this.next)}nextTargetDisconnected(e){e.removeEventListener(`click`,this.next)}async next(){await this.calendarMonthOutlet.calendar.step(`month`,1),this.draw()}draw(){this.drawDay(),this.drawMonth(),this.drawYear()}drawDay(){if(!this.hasDayTarget||!this.hasCalendarMonthOutlet)return;let{year:e,month:t,day:n}=this.calendarMonthOutlet.calendar;this.dayTarget.textContent=new Intl.DateTimeFormat(this.localesValue,{day:this.dayFormatValue}).format(new Date(e,t,n))}drawMonth(){if(!this.hasMonthTarget||!this.hasCalendarMonthOutlet)return;let{year:e,month:t}=this.calendarMonthOutlet.calendar;this.monthTarget.textContent=new Intl.DateTimeFormat(this.localesValue,{month:this.monthFormatValue}).format(new Date(e,t))}drawYear(){if(!this.hasYearTarget||!this.hasCalendarMonthOutlet)return;let{year:e}=this.calendarMonthOutlet.calendar;this.yearTarget.textContent=new Intl.DateTimeFormat(this.localesValue,{year:this.yearFormatValue}).format(new Date(e,0))}},$=class extends t.Controller{static targets=[`listbox`,`loading`,`empty`];static values={url:{type:String,default:``},field:{type:String,default:`q`},delay:{type:Number,default:300}};initialize(){this._requestor=new C}onSelect(e){let t=e.target.closest(`[role="option"]`);!t||t.getAttribute(`aria-disabled`)===`true`||this.select(t.dataset.value??``)}select(e){let t=this.listboxTarget.querySelectorAll(`[role="option"]`);t.forEach(e=>e.setAttribute(`aria-selected`,`false`));let n=[...t].find(t=>t.dataset.value===e);n&&n.setAttribute(`aria-selected`,`true`),this.dispatch(`selected`,{detail:{value:e},bubbles:!0})}onNavigate(e){if([`ArrowUp`,`ArrowDown`,`Enter`,` `].includes(e.key)){if(e.preventDefault(),e.key===`Enter`||e.key===` `){this.listboxTarget.querySelector(`[aria-selected="true"]`)?.click();return}this.step(e.key===`ArrowDown`?1:-1)}}step(e){let t=[...this.listboxTarget.querySelectorAll(`[role="option"]:not([aria-disabled="true"]):not([hidden])`)];if(!t.length)return;let n=this.listboxTarget.querySelector(`[aria-selected="true"]`),r=t.indexOf(n),i=e>0?t[Math.min(r+1,t.length-1)]:t[Math.max(r-1,0)];!i||i===n||(t.forEach(e=>e.setAttribute(`aria-selected`,`false`)),i.setAttribute(`aria-selected`,`true`),i.scrollIntoView({block:`nearest`}))}filter(e){if(this.urlValue){let t=new URL(this.urlValue,window.location.href);t.searchParams.set(this.fieldValue,e),this.setLoading(!0),this._requestor.schedule(()=>this._requestor.request(t).then(e=>e.text()).then(e=>{this.listboxTarget.innerHTML=e,this.setEmpty(this.listboxTarget.querySelectorAll(`[role="option"]`).length===0)}).catch(e=>{e.name!==`AbortError`&&console.error(`[combobox-dropdown] fetch failed`,e)}).finally(()=>this.setLoading(!1)),this.delayValue)}else{let t=T(this.listboxTarget,e);this.setEmpty(t===0)}}showAll(){this.listboxTarget.querySelectorAll(`[role="option"]`).forEach(e=>e.hidden=!1),this.setEmpty(!1)}setLoading(e){this.hasLoadingTarget&&(this.loadingTarget.hidden=!e)}setEmpty(e){this.hasEmptyTarget&&(this.emptyTarget.hidden=!e)}disconnect(){this._requestor.cancel()}},Be=class extends t.Controller{static targets=[`hour`,`minute`,`period`];connect(){this.select(this.toH24())}onSelect(e){let t=e.target.closest(`[role="option"]`);t&&(t.closest(`[role="listbox"]`).querySelectorAll(`[role="option"]`).forEach(e=>e.setAttribute(`aria-selected`,`false`)),t.setAttribute(`aria-selected`,`true`),this.select(this.toH24()))}select(e){e&&this.dispatch(`selected`,{detail:{value:e},bubbles:!0})}onNavigate(e){[`ArrowUp`,`ArrowDown`].includes(e.key)&&(e.preventDefault(),this.step(e.currentTarget,e.key===`ArrowDown`?1:-1))}step(e,t){let n=[...e.querySelectorAll(`[role="option"]`)],r=e.querySelector(`[aria-selected="true"]`),i=n.indexOf(r),a=t>0?n[Math.min(i+1,n.length-1)]:n[Math.max(i-1,0)];!a||a===r||(n.forEach(e=>e.setAttribute(`aria-selected`,`false`)),a.setAttribute(`aria-selected`,`true`),a.scrollIntoView({block:`nearest`}),this.select(this.toH24()))}toH24(){let e=this.selectedValue(this.hourTarget),t=this.selectedValue(this.minuteTarget);if(!e||!t)return null;if(!this.hasPeriodTarget)return`${e}:${t}`;let n=this.selectedValue(this.periodTarget),r=parseInt(e,10);return r=n===`AM`?r===12?0:r:r===12?12:r+12,`${String(r).padStart(2,`0`)}:${t}`}selectedValue(e){return e?.querySelector(`[aria-selected="true"]`)?.dataset.value??null}},Ve=class extends t.Controller{static targets=[`trigger`];connect(){X(this,{trigger:this.hasTriggerTarget?this.triggerTarget:null})}},He=class extends t.Controller{static targets=[`anchor`,`reference`];static values={placement:{type:String,default:`bottom`},alignment:{type:String,default:`start`},role:{type:String,default:`tooltip`}};connect(){if(!this.hasReferenceTarget){console.error(`FlipperController requires a reference target. Add data-flipper-target="reference" to your element.`);return}if(!this.hasAnchorTarget){console.error(`FlipperController requires an anchor target. Add data-flipper-target="anchor" to your element.`);return}je(this,{element:this.referenceTarget,anchor:this.anchorTarget,placement:this.placementValue,alignment:this.alignmentValue,ariaRole:this.roleValue})}},Ue=class extends t.Controller{static targets=[`trigger`,`popover`,`input`];static values={value:String,minLength:{type:Number,default:1}};static outlets=[`combobox-dropdown`];connect(){X(this),this.hasPopoverTarget&&Q(this,{element:this.popoverTarget,activator:this.hasTriggerTarget?this.triggerTarget:null})}async dismissed(){await this.close()}async open(){this.hasPopoverTarget&&await this.visibility.show()}async close(){this.hasPopoverTarget&&await this.visibility.hide()}async toggle(){this.visibility?.visible?await this.close():await this.open()}async shown(){this.hasPopoverTarget&&a(this.popoverTarget)}async hidden(){this.hasTriggerTarget&&this.triggerTarget.focus()}async onSelect(e){e.detail?.value!==void 0&&(this.valueValue=e.detail.value),await this.close()}onInput(e){if(e.target!==this.triggerTarget)return;let t=e.target.value.trim();if(t.length<this.minLengthValue){this.hasComboboxDropdownOutlet&&this.comboboxDropdownOutlet.showAll();return}this.hasComboboxDropdownOutlet&&this.comboboxDropdownOutlet.filter(t)}valueValueChanged(e){this.hasInputTarget&&(this.inputTarget.value=e),this.dispatch(`changed`,{detail:{value:e}})}},We=class extends t.Controller{static targets=[`input`,`toggle`];static values={format:{type:String,default:`plain`},options:{type:Object,default:{}},revealed:{type:Boolean,default:!1}};connect(){U(this,{type:this.formatValue,options:this.optionsValue}),this.format(this.readValue()),this.drawToggle()}formatValueChanged(){this.formatter&&(U(this,{type:this.formatValue,options:this.optionsValue}),this.format(this.readValue()),this.drawToggle())}optionsValueChanged(){this.formatter&&(U(this,{type:this.formatValue,options:this.optionsValue}),this.format(this.readValue()))}revealedValueChanged(){this.formatter&&(this.format(this.readValue()),this.drawToggle())}onChange(e){this.format(e?.detail?.value??``)}format(e){this.formatter&&this.onFormatting(e)}toggle(){!this.formatter.maskable()&&this.formatValue!==`password`||(this.revealedValue=!this.revealedValue)}onPaste(e){let t=e.detail?.text??``;if(!this.formatter||!t)return;let n=this.formatter.normalize(t);this.formatter.validate(n)&&this.format(n)}drawToggle(){if(!this.hasToggleTarget)return;let e=this.formatter?.maskable()||this.formatValue===`password`;this.toggleTarget.hidden=!e,e&&_(this.toggleTarget,this.revealedValue)}readValue(){return this.hasInputTarget?this.inputTarget instanceof HTMLInputElement?this.inputTarget.value:this.inputTarget.textContent:``}onFormatting(e){if(!this.formatter)return;if(this.formatValue===`password`){this.hasInputTarget&&(this.inputTarget.type=this.revealedValue?`text`:`password`);return}let t=this.formatter.normalize(e),n=this.revealedValue||!this.formatter.maskable()?this.formatter.format(t):this.formatter.mask(t);this.hasInputTarget&&(this.inputTarget instanceof HTMLInputElement?this.inputTarget.value=n:this.inputTarget.textContent=n),this.dispatch(`formatted`,{detail:{value:n}})}},Ge=class extends t.Controller{static targets=[`input`,`clear`];initialize(){this.onInput=this.draw.bind(this),this.onEscape=this.handleEscape.bind(this)}connect(){this.draw()}inputTargetConnected(e){e.addEventListener(`input`,this.onInput),e.addEventListener(`keydown`,this.onEscape)}inputTargetDisconnected(e){e.removeEventListener(`input`,this.onInput),e.removeEventListener(`keydown`,this.onEscape)}clear(){this.hasInputTarget&&(this.inputTarget.value=``,this.draw(),this.inputTarget.focus(),this.inputTarget.dispatchEvent(new Event(`input`,{bubbles:!0})))}draw(){!this.hasInputTarget||!this.hasClearTarget||(this.clearTarget.hidden=this.inputTarget.value.length===0)}handleEscape(e){e.key===`Escape`&&this.inputTarget.value!==``&&(e.preventDefault(),this.clear())}},Ke=class extends t.Controller{static targets=[`modal`,`overlay`];initialize(){this.onCancel=this.close.bind(this)}connect(){this.hasModalTarget||console.error(`ModalController requires a modal target. Add data-modal-target="modal" to your element.`)}modalTargetConnected(e){this.isNativeDialog=e instanceof HTMLDialogElement,this.isNativeDialog?(e.addEventListener(`cancel`,this.onCancel),e.addEventListener(`click`,this.onBackdropClick)):(this.focusTrap=new o(e,{escapeDeactivates:!0}),X(this,{element:e}))}modalTargetDisconnected(e){this.isNativeDialog&&(e.removeEventListener(`cancel`,this.onCancel),e.removeEventListener(`click`,this.onBackdropClick))}dismissed=()=>{this.close()};open(e){if(e&&e.preventDefault(),this.hasModalTarget){if(this.isNativeDialog)this.previouslyFocused=document.activeElement,this.modalTarget.showModal();else{let e=this.hasOverlayTarget?this.overlayTarget:this.modalTarget;e.hidden=!1,document.body.style.overflow=`hidden`,this.focusTrap&&this.focusTrap.activate()}m(`Modal opened`)}}close(e){if(e&&e.preventDefault(),this.hasModalTarget){if(this.isNativeDialog)this.modalTarget.close(),this.previouslyFocused&&this.previouslyFocused.isConnected&&setTimeout(()=>{this.previouslyFocused.focus()},0);else{let e=this.hasOverlayTarget?this.overlayTarget:this.modalTarget;e.hidden=!0,document.body.style.overflow=``,this.focusTrap&&this.focusTrap.deactivate()}m(`Modal closed`)}}onBackdropClick=e=>{let t=this.modalTarget.getBoundingClientRect();(e.clientY<t.top||e.clientY>t.bottom||e.clientX<t.left||e.clientX>t.right)&&this.close()}},qe=class extends t.Controller{static targets=[`content`];connect(){Pe(this,{element:this.hasContentTarget?this.contentTarget:null})}},Je=class extends t.Controller{static targets=[`content`,`template`,`loader`,`activator`];static classes=[`hidden`];static values={url:String,loadedAt:String,reload:{type:String,default:`never`},staleAfter:{type:Number,default:3600}};connect(){Ee(this,{element:this.hasContentTarget?this.contentTarget:null,url:this.hasUrlValue?this.urlValue:null}),this.hasContentTarget&&Q(this,{element:this.contentTarget,activator:this.hasActivatorTarget?this.activatorTarget:null}),this.hasLoaderTarget&&Q(this,{element:this.loaderTarget,visibility:`contentLoaderVisibility`})}async show(){await this.visibility.show()}async hide(){await this.visibility.hide()}async shown(){await this.load()}canLoad(){return this.hasContentTarget&&this.contentTarget.tagName.toLowerCase()===`turbo-frame`?(this.hasUrlValue&&this.contentTarget.setAttribute(`src`,this.urlValue),!1):!0}async contentLoading(){this.hasLoaderTarget&&await this.contentLoaderVisibility.show()}async contentLoaded({content:e}){this.hasContentTarget&&this.contentTarget.replaceChildren(this.getContentNode(e)),this.hasLoaderTarget&&await this.contentLoaderVisibility.hide()}getContentNode(e){if(typeof e==`string`){let t=document.createElement(`template`);return t.innerHTML=e,document.importNode(t.content,!0)}return document.importNode(e,!0)}contentLoader(){if(this.hasTemplateTarget)return this.templateTarget instanceof HTMLTemplateElement?this.templateTarget.content:this.templateTarget.innerHTML}};e.ARIA_HASPOPUP_VALUES=v,e.CalendarMonthController=Ie,e.CalendarMonthObserverController=Le,e.ClipboardController=Re,e.ComboboxDateController=ze,e.ComboboxDropdownController=$,e.ComboboxTimeController=Be,e.DismisserController=Ve,e.FOCUSABLE_SELECTOR=n,e.FORMATTER_TYPES=z,e.FlipperController=He,e.FocusRestoration=s,e.FocusTrap=o,e.Formatter=H,e.InputClearableController=Ge,e.InputComboboxController=Ue,e.InputFormatterController=We,e.ModalController=Ke,e.PannerController=qe,e.PopoverController=Je,e.Requestor=C,e.RovingTabIndex=f,e.announce=m,e.connectTriggerToTarget=x,e.disconnectTriggerFromTarget=ie,e.ensureId=ee,e.filterOptions=T,e.focusFirst=a,e.fuzzyMatcher=w,e.generateId=h,e.getFocusableElements=r,e.isActivationKey=l,e.isArrowKey=u,e.isKey=c,e.isVisible=i,e.preventDefault=d,e.setAriaState=g,e.setChecked=ne,e.setDisabled=re,e.setExpanded=te,e.setPressed=_});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stimulus-plumbers/controllers",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "Stimulus controllers following WCAG standards",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,5 +1,6 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
  import { initCalendar } from '../plumbers';
3
+ import { tryParseDate } from '../plumbers/plumber/date';
3
4
 
4
5
  export default class extends Controller {
5
6
  static targets = ['daysOfWeek', 'daysOfMonth'];
@@ -9,10 +10,12 @@ export default class extends Controller {
9
10
  weekdayFormat: { type: String, default: 'short' },
10
11
  dayFormat: { type: String, default: 'numeric' },
11
12
  daysOfOtherMonth: { type: Boolean, default: false },
13
+ today: { type: String, default: '' },
14
+ selected: { type: String, default: '' },
12
15
  };
13
16
 
14
17
  initialize() {
15
- initCalendar(this);
18
+ initCalendar(this, { today: this.todayValue });
16
19
  }
17
20
 
18
21
  connect() {
@@ -23,9 +26,31 @@ export default class extends Controller {
23
26
  this.draw();
24
27
  }
25
28
 
29
+ selectedValueChanged() {
30
+ if (!this.hasDaysOfMonthTarget) return;
31
+
32
+ this.daysOfMonthTarget.querySelectorAll('[aria-selected]').forEach((el) => {
33
+ el.setAttribute('aria-selected', 'false');
34
+ });
35
+
36
+ if (!this.selectedValue) return;
37
+
38
+ const parsed = tryParseDate(this.selectedValue);
39
+ if (!parsed) return;
40
+
41
+ const time = this.daysOfMonthTarget.querySelector(`time[datetime="${parsed.toISOString()}"]`);
42
+ if (time) time.closest('[aria-selected]').setAttribute('aria-selected', 'true');
43
+ }
44
+
45
+ onSelect(event) {
46
+ const iso = event.detail?.iso;
47
+ if (iso) this.selectedValue = iso;
48
+ }
49
+
26
50
  draw() {
27
51
  this.drawDaysOfWeek();
28
52
  this.drawDaysOfMonth();
53
+ this.selectedValueChanged();
29
54
  }
30
55
 
31
56
  createDayElement(day, { selectable = false, disabled = false } = {}) {
@@ -77,6 +102,7 @@ export default class extends Controller {
77
102
  });
78
103
 
79
104
  if (today === date.date.getTime()) dayElement.setAttribute('aria-current', 'date');
105
+ if (date.current || this.daysOfOtherMonthValue) dayElement.setAttribute('aria-selected', '');
80
106
  if (this.hasDayOfMonthClass) dayElement.classList.add(...this.dayOfMonthClasses);
81
107
 
82
108
  const time = document.createElement('time');
@@ -3,11 +3,11 @@ import { Controller } from '@hotwired/stimulus';
3
3
  export default class extends Controller {
4
4
  static targets = ['source'];
5
5
  static values = {
6
- type: { type: String, default: 'text/plain' },
6
+ contentType: { type: String, default: 'text/plain' },
7
7
  };
8
8
 
9
9
  onPaste(event) {
10
- const text = event.clipboardData?.getData(this.typeValue) ?? '';
10
+ const text = event.clipboardData?.getData(this.contentTypeValue) ?? '';
11
11
  const types = Array.from(event.clipboardData?.types ?? []);
12
12
  event.preventDefault();
13
13
  this.dispatch('pasted', { detail: { text, types }, bubbles: true });
@@ -3,7 +3,7 @@ import { focusFirst } from '../accessibility/focus';
3
3
  import { attachDismisser, attachVisibility } from '../plumbers';
4
4
 
5
5
  export default class extends Controller {
6
- static targets = ['trigger', 'popover', 'value'];
6
+ static targets = ['trigger', 'popover', 'input'];
7
7
  static values = {
8
8
  value: String,
9
9
  minLength: { type: Number, default: 1 },
@@ -63,7 +63,7 @@ export default class extends Controller {
63
63
  }
64
64
 
65
65
  valueValueChanged(newVal) {
66
- if (this.hasValueTarget) this.valueTarget.value = newVal;
66
+ if (this.hasInputTarget) this.inputTarget.value = newVal;
67
67
  this.dispatch('changed', { detail: { value: newVal } });
68
68
  }
69
69
  }
@@ -5,27 +5,27 @@ import { attachFormatter } from '../plumbers';
5
5
  export default class extends Controller {
6
6
  static targets = ['input', 'toggle'];
7
7
  static values = {
8
- type: { type: String, default: 'plain' },
8
+ format: { type: String, default: 'plain' },
9
9
  options: { type: Object, default: {} },
10
10
  revealed: { type: Boolean, default: false },
11
11
  };
12
12
 
13
13
  connect() {
14
- attachFormatter(this, { type: this.typeValue, options: this.optionsValue });
14
+ attachFormatter(this, { type: this.formatValue, options: this.optionsValue });
15
15
  this.format(this.readValue());
16
16
  this.drawToggle();
17
17
  }
18
18
 
19
- typeValueChanged() {
19
+ formatValueChanged() {
20
20
  if (!this.formatter) return;
21
- attachFormatter(this, { type: this.typeValue, options: this.optionsValue });
21
+ attachFormatter(this, { type: this.formatValue, options: this.optionsValue });
22
22
  this.format(this.readValue());
23
23
  this.drawToggle();
24
24
  }
25
25
 
26
26
  optionsValueChanged() {
27
27
  if (!this.formatter) return;
28
- attachFormatter(this, { type: this.typeValue, options: this.optionsValue });
28
+ attachFormatter(this, { type: this.formatValue, options: this.optionsValue });
29
29
  this.format(this.readValue());
30
30
  }
31
31
 
@@ -45,7 +45,7 @@ export default class extends Controller {
45
45
  }
46
46
 
47
47
  toggle() {
48
- if (!this.formatter.maskable() && this.typeValue !== 'password') return;
48
+ if (!this.formatter.maskable() && this.formatValue !== 'password') return;
49
49
  this.revealedValue = !this.revealedValue;
50
50
  }
51
51
 
@@ -59,7 +59,7 @@ export default class extends Controller {
59
59
 
60
60
  drawToggle() {
61
61
  if (!this.hasToggleTarget) return;
62
- const hasToggleBehavior = this.formatter?.maskable() || this.typeValue === 'password';
62
+ const hasToggleBehavior = this.formatter?.maskable() || this.formatValue === 'password';
63
63
  this.toggleTarget.hidden = !hasToggleBehavior;
64
64
  if (hasToggleBehavior) setPressed(this.toggleTarget, this.revealedValue);
65
65
  }
@@ -72,7 +72,7 @@ export default class extends Controller {
72
72
  onFormatting(raw) {
73
73
  if (!this.formatter) return;
74
74
 
75
- if (this.typeValue === 'password') {
75
+ if (this.formatValue === 'password') {
76
76
  if (this.hasInputTarget) this.inputTarget.type = this.revealedValue ? 'text' : 'password';
77
77
  return;
78
78
  }
package/src/index.js CHANGED
@@ -26,8 +26,8 @@ export { default as ComboboxTimeController } from './controllers/combobox_time_c
26
26
  export { default as DismisserController } from './controllers/dismisser_controller.js';
27
27
  export { default as FlipperController } from './controllers/flipper_controller.js';
28
28
  export { default as InputComboboxController } from './controllers/input_combobox_controller.js';
29
- export { default as InputFormatController } from './controllers/input_format_controller.js';
30
- export { default as InputSearchController } from './controllers/input_search_controller.js';
29
+ export { default as InputFormatterController } from './controllers/input_formatter_controller.js';
30
+ export { default as InputClearableController } from './controllers/input_clearable_controller.js';
31
31
  export { default as ModalController } from './controllers/modal_controller.js';
32
32
  export { default as PannerController } from './controllers/panner_controller.js';
33
33
  export { default as PopoverController } from './controllers/popover_controller.js';
@@ -177,11 +177,11 @@ export class Calendar extends Plumber {
177
177
  set today(value) {
178
178
  if (!isValidDate(value)) return;
179
179
 
180
- const month = this.month ? this.month : value.getMonth();
181
- const year = this.year ? this.year : value.getFullYear();
180
+ const month = this.month ?? value.getMonth();
181
+ const year = this.year ?? value.getFullYear();
182
182
  const sameMonthYear = month == value.getMonth() && year == value.getFullYear();
183
- const day = this.hasDayValue ? this.day : sameMonthYear ? value.getDate() : 1;
184
- this.now = new Date(year, month, day).toISOString();
183
+ const day = sameMonthYear ? value.getDate() : 1;
184
+ this.now = new Date(year, month, day);
185
185
  }
186
186
 
187
187
  /**
@@ -1,3 +1,5 @@
1
+ const DATE_ONLY_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
2
+
1
3
  export function isValidDate(value) {
2
4
  return value instanceof Date && !isNaN(value);
3
5
  }
@@ -5,8 +7,17 @@ export function isValidDate(value) {
5
7
  export function tryParseDate(...values) {
6
8
  if (values.length === 0) throw 'Missing values to parse as date';
7
9
  if (values.length === 1) {
8
- const parsed = new Date(values[0]);
9
- if (values[0] && isValidDate(parsed)) return parsed;
10
+ const dateValue = values[0];
11
+ if (!dateValue) return undefined;
12
+ if (typeof dateValue === 'string' && DATE_ONLY_PATTERN.test(dateValue)) {
13
+ // YYYY-MM-DD strings are UTC by spec; use local constructor instead
14
+ const [year, month, day] = dateValue.split('-').map(Number);
15
+ const parsed = new Date(year, month - 1, day);
16
+ if (isValidDate(parsed)) return parsed;
17
+ } else {
18
+ const parsed = new Date(dateValue);
19
+ if (isValidDate(parsed)) return parsed;
20
+ }
10
21
  } else {
11
22
  const parsed = new Date(...values);
12
23
  if (isValidDate(parsed)) return parsed;