@unabridged/midwest 0.18.0 → 0.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +4 -2
  2. package/app/assets/javascript/midwest/index.ts +6 -0
  3. package/app/assets/javascript/midwest.js +327 -571
  4. package/app/assets/javascript/midwest.js.map +1 -1
  5. package/app/assets/stylesheets/midwest/form-group.css +4 -0
  6. package/app/assets/stylesheets/midwest.css +1 -1
  7. package/app/assets/stylesheets/midwest.tailwind.css +4 -1
  8. package/dist/css/midwest.css +1 -1
  9. package/dist/javascript/collection/app/assets/javascript/midwest/index.js +7 -5
  10. package/dist/javascript/collection/app/assets/javascript/midwest/index.js.map +1 -1
  11. package/dist/javascript/collection/app/components/midwest/carousel_component/carousel_component_controller.js +106 -6
  12. package/dist/javascript/collection/app/components/midwest/carousel_component/carousel_component_controller.js.map +1 -1
  13. package/dist/javascript/collection/app/components/midwest/dropdown_component/dropdown_component_controller.js +1 -1
  14. package/dist/javascript/collection/app/components/midwest/form/input_component/input_component_controller.js +116 -1
  15. package/dist/javascript/collection/app/components/midwest/form/input_component/input_component_controller.js.map +1 -1
  16. package/dist/javascript/collection/app/components/midwest/horizontal_scroll_component/horizontal_scroll_component_controller.js +24 -0
  17. package/dist/javascript/collection/app/components/midwest/horizontal_scroll_component/horizontal_scroll_component_controller.js.map +1 -0
  18. package/dist/javascript/collection/app/components/midwest/table_component/load_more_controller.js +60 -0
  19. package/dist/javascript/collection/app/components/midwest/table_component/load_more_controller.js.map +1 -0
  20. package/dist/javascript/collection/app/components/midwest/table_component/table_component_controller.js +30 -0
  21. package/dist/javascript/collection/app/components/midwest/table_component/table_component_controller.js.map +1 -0
  22. package/dist/javascript/collection/node_modules/@floating-ui/core/dist/floating-ui.core.js +561 -0
  23. package/dist/javascript/collection/node_modules/@floating-ui/core/dist/floating-ui.core.js.map +1 -0
  24. package/dist/javascript/collection/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +736 -0
  25. package/dist/javascript/collection/node_modules/@floating-ui/dom/dist/floating-ui.dom.js.map +1 -0
  26. package/dist/javascript/collection/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js +166 -0
  27. package/dist/javascript/collection/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js.map +1 -0
  28. package/dist/javascript/collection/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +105 -0
  29. package/dist/javascript/collection/node_modules/@floating-ui/utils/dist/floating-ui.utils.js.map +1 -0
  30. package/dist/javascript/midwest.js +327 -571
  31. package/dist/javascript/midwest.js.map +1 -1
  32. package/package.json +3 -4
@@ -1,7 +1,5 @@
1
1
  import Card from '../../../components/midwest/card_component/card_component_controller.js';
2
- export { default as Card } from '../../../components/midwest/card_component/card_component_controller.js';
3
2
  import Banner from '../../../components/midwest/banner_component/banner_component_controller.js';
4
- export { default as Banner } from '../../../components/midwest/banner_component/banner_component_controller.js';
5
3
  import Input from '../../../components/midwest/form/input_component/input_component_controller.js';
6
4
  import File from '../../../components/midwest/form/file_component/file_component_controller.js';
7
5
  import Dropdown from '../../../components/midwest/dropdown_component/dropdown_component_controller.js';
@@ -13,18 +11,19 @@ import Carousel from '../../../components/midwest/carousel_component/carousel_co
13
11
  import FormLiveSummary from '../../../components/midwest/form/live_summary_component/live_summary_component_controller.js';
14
12
  import Form from '../../../components/midwest/form/form_controller.js';
15
13
  import CountdownTimer from '../../../components/midwest/countdown_timer_component/countdown_timer_component_controller.js';
16
- export { default as CountdownTimer } from '../../../components/midwest/countdown_timer_component/countdown_timer_component_controller.js';
17
14
  import Badge from '../../../components/midwest/badge_component/badge_component_controller.js';
18
15
  import ConfirmationController from '../../../components/midwest/confirmation_component/confirmation_component_controller.js';
19
16
  import AvatarGroup from '../../../components/midwest/avatar_group_component/avatar_group_component_controller.js';
20
17
  import Chart from '../../../components/midwest/chart_component/chart_component_controller.js';
21
- export { default as Chart } from '../../../components/midwest/chart_component/chart_component_controller.js';
22
18
  import Range from '../../../components/midwest/form/range_component/range_component_controller.js';
23
19
  import Rating from '../../../components/midwest/rating_component/rating_component_controller.js';
24
20
  import Autocomplete from '../../../components/midwest/form/autocomplete_component/autocomplete_component_controller.js';
25
21
  import Image from '../../../components/midwest/image_component/image_component_controller.js';
26
22
  import ColorPicker from '../../../components/midwest/form/color_picker_component/color_picker_component_controller.js';
27
23
  import Notification from '../../../components/midwest/notification_component/notification_component_controller.js';
24
+ import HorizontalScroll from '../../../components/midwest/horizontal_scroll_component/horizontal_scroll_component_controller.js';
25
+ import Table from '../../../components/midwest/table_component/table_component_controller.js';
26
+ import LoadMore from '../../../components/midwest/table_component/load_more_controller.js';
28
27
 
29
28
  function registerMidwestControllers(application) {
30
29
  application.register("midwest-card", Card);
@@ -50,7 +49,10 @@ function registerMidwestControllers(application) {
50
49
  application.register("midwest-image", Image);
51
50
  application.register("midwest-color-picker", ColorPicker);
52
51
  application.register("midwest-notification", Notification);
52
+ application.register("midwest-horizontal-scroll", HorizontalScroll);
53
+ application.register("midwest-table", Table);
54
+ application.register("midwest-load-more", LoadMore);
53
55
  }
54
56
 
55
- export { registerMidwestControllers };
57
+ export { Banner, Card, Chart, CountdownTimer, registerMidwestControllers };
56
58
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../../app/assets/javascript/midwest/index.ts"],"sourcesContent":["import Card from '../../../components/midwest/card_component/card_component_controller'\nimport Banner from '../../../components/midwest/banner_component/banner_component_controller'\nimport Input from '../../../components/midwest/form/input_component/input_component_controller'\nimport File from '../../../components/midwest/form/file_component/file_component_controller'\nimport Dropdown from '../../../components/midwest/dropdown_component/dropdown_component_controller'\nimport Prose from '../../../components/midwest/prose_component/prose_component_controller'\nimport Dialog from '../../../components/midwest/dialog_component/dialog_component_controller'\nimport Tabs from '../../../components/midwest/tabs_component/tabs_component_controller'\nimport Tooltip from '../../../components/midwest/tooltip_component/tooltip_component_controller'\nimport Carousel from '../../../components/midwest/carousel_component/carousel_component_controller'\nimport FormLiveSummary from '../../../components/midwest/form/live_summary_component/live_summary_component_controller'\nimport Form from '../../../components/midwest/form/form_controller'\nimport CountdownTimer from '../../../components/midwest/countdown_timer_component/countdown_timer_component_controller'\nimport Badge from '../../../components/midwest/badge_component/badge_component_controller'\nimport Confirmation from '../../../components/midwest/confirmation_component/confirmation_component_controller'\nimport AvatarGroup from '../../../components/midwest/avatar_group_component/avatar_group_component_controller'\nimport Chart from '../../../components/midwest/chart_component/chart_component_controller'\nimport Range from '../../../components/midwest/form/range_component/range_component_controller'\nimport Rating from '../../../components/midwest/rating_component/rating_component_controller'\nimport Autocomplete from '../../../components/midwest/form/autocomplete_component/autocomplete_component_controller'\nimport Image from '../../../components/midwest/image_component/image_component_controller'\nimport ColorPicker from '../../../components/midwest/form/color_picker_component/color_picker_component_controller'\nimport Notification from '../../../components/midwest/notification_component/notification_component_controller'\n/* IMPORTS */\n\nexport { Card, Banner, CountdownTimer, Chart }\n\nexport function registerMidwestControllers (application: any) {\n application.register('midwest-card', Card)\n application.register('midwest-banner', Banner)\n application.register('midwest-countdown-timer', CountdownTimer)\n application.register('midwest-input', Input)\n application.register('midwest-file', File)\n application.register('midwest-dropdown', Dropdown)\n application.register('midwest-prose', Prose)\n application.register('midwest-dialog', Dialog)\n application.register('midwest-tabs', Tabs)\n application.register('midwest-tooltip', Tooltip)\n application.register('midwest-carousel', Carousel)\n application.register('midwest-form-live-summary', FormLiveSummary)\n application.register('midwest-form', Form)\n application.register('midwest-badge', Badge)\n application.register('midwest-confirmation', Confirmation)\n application.register('midwest-avatar-group', AvatarGroup)\n application.register('midwest-chart', Chart)\n application.register('midwest-range', Range)\n application.register('midwest-rating', Rating)\n application.register('midwest-autocomplete', Autocomplete)\n application.register('midwest-image', Image)\n application.register('midwest-color-picker', ColorPicker)\n application.register('midwest-notification', Notification)\n /* EXPORTS */\n}\n"],"names":["Confirmation"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BO,SAAS,2BAA4B,WAAkB,EAAA;AAC5D,EAAY,WAAA,CAAA,QAAA,CAAS,gBAAgB,IAAI,CAAA,CAAA;AACzC,EAAY,WAAA,CAAA,QAAA,CAAS,kBAAkB,MAAM,CAAA,CAAA;AAC7C,EAAY,WAAA,CAAA,QAAA,CAAS,2BAA2B,cAAc,CAAA,CAAA;AAC9D,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,gBAAgB,IAAI,CAAA,CAAA;AACzC,EAAY,WAAA,CAAA,QAAA,CAAS,oBAAoB,QAAQ,CAAA,CAAA;AACjD,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,kBAAkB,MAAM,CAAA,CAAA;AAC7C,EAAY,WAAA,CAAA,QAAA,CAAS,gBAAgB,IAAI,CAAA,CAAA;AACzC,EAAY,WAAA,CAAA,QAAA,CAAS,mBAAmB,OAAO,CAAA,CAAA;AAC/C,EAAY,WAAA,CAAA,QAAA,CAAS,oBAAoB,QAAQ,CAAA,CAAA;AACjD,EAAY,WAAA,CAAA,QAAA,CAAS,6BAA6B,eAAe,CAAA,CAAA;AACjE,EAAY,WAAA,CAAA,QAAA,CAAS,gBAAgB,IAAI,CAAA,CAAA;AACzC,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwBA,sBAAY,CAAA,CAAA;AACzD,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwB,WAAW,CAAA,CAAA;AACxD,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,kBAAkB,MAAM,CAAA,CAAA;AAC7C,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwB,YAAY,CAAA,CAAA;AACzD,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwB,WAAW,CAAA,CAAA;AACxD,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwB,YAAY,CAAA,CAAA;AAE3D;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../../app/assets/javascript/midwest/index.ts"],"sourcesContent":["import Card from '../../../components/midwest/card_component/card_component_controller'\nimport Banner from '../../../components/midwest/banner_component/banner_component_controller'\nimport Input from '../../../components/midwest/form/input_component/input_component_controller'\nimport File from '../../../components/midwest/form/file_component/file_component_controller'\nimport Dropdown from '../../../components/midwest/dropdown_component/dropdown_component_controller'\nimport Prose from '../../../components/midwest/prose_component/prose_component_controller'\nimport Dialog from '../../../components/midwest/dialog_component/dialog_component_controller'\nimport Tabs from '../../../components/midwest/tabs_component/tabs_component_controller'\nimport Tooltip from '../../../components/midwest/tooltip_component/tooltip_component_controller'\nimport Carousel from '../../../components/midwest/carousel_component/carousel_component_controller'\nimport FormLiveSummary from '../../../components/midwest/form/live_summary_component/live_summary_component_controller'\nimport Form from '../../../components/midwest/form/form_controller'\nimport CountdownTimer from '../../../components/midwest/countdown_timer_component/countdown_timer_component_controller'\nimport Badge from '../../../components/midwest/badge_component/badge_component_controller'\nimport Confirmation from '../../../components/midwest/confirmation_component/confirmation_component_controller'\nimport AvatarGroup from '../../../components/midwest/avatar_group_component/avatar_group_component_controller'\nimport Chart from '../../../components/midwest/chart_component/chart_component_controller'\nimport Range from '../../../components/midwest/form/range_component/range_component_controller'\nimport Rating from '../../../components/midwest/rating_component/rating_component_controller'\nimport Autocomplete from '../../../components/midwest/form/autocomplete_component/autocomplete_component_controller'\nimport Image from '../../../components/midwest/image_component/image_component_controller'\nimport ColorPicker from '../../../components/midwest/form/color_picker_component/color_picker_component_controller'\nimport Notification from '../../../components/midwest/notification_component/notification_component_controller'\nimport HorizontalScroll from '../../../components/midwest/horizontal_scroll_component/horizontal_scroll_component_controller'\nimport Table from '../../../components/midwest/table_component/table_component_controller'\nimport LoadMore from '../../../components/midwest/table_component/load_more_controller'\n/* IMPORTS */\n\nexport { Card, Banner, CountdownTimer, Chart }\n\nexport function registerMidwestControllers (application: any) {\n application.register('midwest-card', Card)\n application.register('midwest-banner', Banner)\n application.register('midwest-countdown-timer', CountdownTimer)\n application.register('midwest-input', Input)\n application.register('midwest-file', File)\n application.register('midwest-dropdown', Dropdown)\n application.register('midwest-prose', Prose)\n application.register('midwest-dialog', Dialog)\n application.register('midwest-tabs', Tabs)\n application.register('midwest-tooltip', Tooltip)\n application.register('midwest-carousel', Carousel)\n application.register('midwest-form-live-summary', FormLiveSummary)\n application.register('midwest-form', Form)\n application.register('midwest-badge', Badge)\n application.register('midwest-confirmation', Confirmation)\n application.register('midwest-avatar-group', AvatarGroup)\n application.register('midwest-chart', Chart)\n application.register('midwest-range', Range)\n application.register('midwest-rating', Rating)\n application.register('midwest-autocomplete', Autocomplete)\n application.register('midwest-image', Image)\n application.register('midwest-color-picker', ColorPicker)\n application.register('midwest-notification', Notification)\n application.register('midwest-horizontal-scroll', HorizontalScroll)\n application.register('midwest-table', Table)\n application.register('midwest-load-more', LoadMore)\n /* EXPORTS */\n}\n"],"names":["Confirmation"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BO,SAAS,2BAA4B,WAAkB,EAAA;AAC5D,EAAY,WAAA,CAAA,QAAA,CAAS,gBAAgB,IAAI,CAAA,CAAA;AACzC,EAAY,WAAA,CAAA,QAAA,CAAS,kBAAkB,MAAM,CAAA,CAAA;AAC7C,EAAY,WAAA,CAAA,QAAA,CAAS,2BAA2B,cAAc,CAAA,CAAA;AAC9D,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,gBAAgB,IAAI,CAAA,CAAA;AACzC,EAAY,WAAA,CAAA,QAAA,CAAS,oBAAoB,QAAQ,CAAA,CAAA;AACjD,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,kBAAkB,MAAM,CAAA,CAAA;AAC7C,EAAY,WAAA,CAAA,QAAA,CAAS,gBAAgB,IAAI,CAAA,CAAA;AACzC,EAAY,WAAA,CAAA,QAAA,CAAS,mBAAmB,OAAO,CAAA,CAAA;AAC/C,EAAY,WAAA,CAAA,QAAA,CAAS,oBAAoB,QAAQ,CAAA,CAAA;AACjD,EAAY,WAAA,CAAA,QAAA,CAAS,6BAA6B,eAAe,CAAA,CAAA;AACjE,EAAY,WAAA,CAAA,QAAA,CAAS,gBAAgB,IAAI,CAAA,CAAA;AACzC,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwBA,sBAAY,CAAA,CAAA;AACzD,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwB,WAAW,CAAA,CAAA;AACxD,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,kBAAkB,MAAM,CAAA,CAAA;AAC7C,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwB,YAAY,CAAA,CAAA;AACzD,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwB,WAAW,CAAA,CAAA;AACxD,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwB,YAAY,CAAA,CAAA;AACzD,EAAY,WAAA,CAAA,QAAA,CAAS,6BAA6B,gBAAgB,CAAA,CAAA;AAClE,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,qBAAqB,QAAQ,CAAA,CAAA;AAEpD;;;;"}
@@ -14,11 +14,12 @@ const NON_SUBMITTING_INPUT_TYPES = /* @__PURE__ */ new Set([
14
14
  ]);
15
15
  const FORM_ELEMENT_TAGS = /* @__PURE__ */ new Set(["INPUT", "TEXTAREA", "SELECT"]);
16
16
  class Carousel extends Controller {
17
- static targets = ["track", "prev", "next", "dot"];
17
+ static targets = ["track", "prev", "next", "dot", "status"];
18
18
  static values = {
19
19
  wizard: { type: Boolean, default: false },
20
20
  autoplay: { type: Number, default: 0 },
21
- loop: { type: Boolean, default: false }
21
+ loop: { type: Boolean, default: false },
22
+ fade: { type: Boolean, default: false }
22
23
  };
23
24
  observer = null;
24
25
  _currentIndex = 0;
@@ -26,7 +27,11 @@ class Carousel extends Controller {
26
27
  _lastTouchX = 0;
27
28
  _autoplayTimer = null;
28
29
  connect() {
29
- this.setupObserver();
30
+ if (this.fadeValue) {
31
+ this.initFade();
32
+ } else {
33
+ this.setupObserver();
34
+ }
30
35
  this.updateNavigation();
31
36
  this.element.addEventListener("keydown", this.handleArrowKeys);
32
37
  if (this.wizardValue) {
@@ -40,6 +45,8 @@ class Carousel extends Controller {
40
45
  this.startAutoplay();
41
46
  this.element.addEventListener("mouseenter", this.pauseAutoplay);
42
47
  this.element.addEventListener("mouseleave", this.resumeAutoplay);
48
+ this.element.addEventListener("focusin", this.pauseAutoplay);
49
+ this.element.addEventListener("focusout", this.resumeAutoplay);
43
50
  }
44
51
  }
45
52
  disconnect() {
@@ -48,12 +55,20 @@ class Carousel extends Controller {
48
55
  this.element.removeEventListener("keydown", this.handleKeydown);
49
56
  this.element.removeEventListener("mouseenter", this.pauseAutoplay);
50
57
  this.element.removeEventListener("mouseleave", this.resumeAutoplay);
58
+ this.element.removeEventListener("focusin", this.pauseAutoplay);
59
+ this.element.removeEventListener("focusout", this.resumeAutoplay);
51
60
  this.trackTarget.removeEventListener("wheel", this.handleWheel);
52
61
  this.trackTarget.removeEventListener("touchstart", this.handleTouchStart);
53
62
  this.trackTarget.removeEventListener("touchmove", this.handleTouchMove);
54
63
  this.stopAutoplay();
55
64
  }
56
65
  next() {
66
+ if (this.fadeValue) {
67
+ const atEnd2 = this._currentIndex >= this.slides.length - 1;
68
+ const nextIndex = this.loopValue && atEnd2 ? 0 : Math.min(this._currentIndex + 1, this.slides.length - 1);
69
+ this.activateSlide(nextIndex);
70
+ return;
71
+ }
57
72
  const atEnd = this._currentIndex >= this.slides.length - 1;
58
73
  if (this.loopValue && atEnd) {
59
74
  this.slides[0]?.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "nearest" });
@@ -62,6 +77,12 @@ class Carousel extends Controller {
62
77
  }
63
78
  }
64
79
  previous() {
80
+ if (this.fadeValue) {
81
+ const atStart2 = this._currentIndex <= 0;
82
+ const prevIndex = this.loopValue && atStart2 ? this.slides.length - 1 : Math.max(this._currentIndex - 1, 0);
83
+ this.activateSlide(prevIndex);
84
+ return;
85
+ }
65
86
  const atStart = this._currentIndex <= 0;
66
87
  if (this.loopValue && atStart) {
67
88
  const last = this.slides[this.slides.length - 1];
@@ -73,6 +94,10 @@ class Carousel extends Controller {
73
94
  goto(event) {
74
95
  const button = event.currentTarget;
75
96
  const index = parseInt(button.dataset.index ?? "0", 10);
97
+ if (this.fadeValue) {
98
+ this.activateSlide(index);
99
+ return;
100
+ }
76
101
  const slide = this.slides[index];
77
102
  slide?.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "nearest" });
78
103
  }
@@ -92,10 +117,13 @@ class Carousel extends Controller {
92
117
  this.next();
93
118
  }
94
119
  scrolled() {
120
+ if (this.fadeValue)
121
+ return;
95
122
  if (this.wizardValue)
96
123
  this.clampToFrontier();
97
124
  this.updateCurrentIndex();
98
125
  this.updateNavigation();
126
+ this.announceSlide();
99
127
  }
100
128
  // Arrow function so `this` is stable for add/removeEventListener pairing.
101
129
  // Handles ArrowLeft/ArrowRight for keyboard slide navigation. Skips form
@@ -168,6 +196,11 @@ class Carousel extends Controller {
168
196
  this._autoplayTimer = null;
169
197
  }
170
198
  autoplayAdvance() {
199
+ if (this.fadeValue) {
200
+ const nextIndex = (this._currentIndex + 1) % this.slides.length;
201
+ this.activateSlide(nextIndex);
202
+ return;
203
+ }
171
204
  const atEnd = this._currentIndex >= this.slides.length - 1;
172
205
  if (atEnd) {
173
206
  const firstSlide = this.slides[0];
@@ -179,6 +212,53 @@ class Carousel extends Controller {
179
212
  get slides() {
180
213
  return Array.from(this.trackTarget.children);
181
214
  }
215
+ // Sets up the fade mode initial state. Marks the first slide active, hides
216
+ // all others from the accessibility tree, and adds .fade-ready so CSS hands
217
+ // control over to .is-active.
218
+ initFade() {
219
+ this.slides.forEach((slide, i) => {
220
+ const active = i === 0;
221
+ slide.classList.toggle("is-active", active);
222
+ slide.toggleAttribute("inert", !active);
223
+ slide.setAttribute("aria-hidden", String(!active));
224
+ });
225
+ this.element.classList.add("fade-ready");
226
+ this.syncPagerDots();
227
+ }
228
+ // Transitions to the slide at `index` in fade mode by swapping .is-active and
229
+ // hiding non-active slides from the accessibility tree.
230
+ activateSlide(index) {
231
+ this.slides.forEach((slide, i) => {
232
+ const active = i === index;
233
+ slide.classList.toggle("is-active", active);
234
+ slide.toggleAttribute("inert", !active);
235
+ slide.setAttribute("aria-hidden", String(!active));
236
+ });
237
+ this._currentIndex = index;
238
+ this.updateNavigation();
239
+ this.syncPagerDots();
240
+ this.announceSlide();
241
+ }
242
+ // Syncs pager dot active state from _currentIndex. Used in fade mode where
243
+ // IntersectionObserver is not set up (the track doesn't scroll).
244
+ syncPagerDots() {
245
+ if (!this.hasDotTarget)
246
+ return;
247
+ this.dotTargets.forEach((dot, i) => {
248
+ dot.classList.toggle("active", i === this._currentIndex);
249
+ if (i === this._currentIndex) {
250
+ dot.setAttribute("aria-current", "true");
251
+ } else {
252
+ dot.removeAttribute("aria-current");
253
+ }
254
+ });
255
+ }
256
+ // Updates the sr-only live region so screen readers announce the new slide.
257
+ announceSlide() {
258
+ if (!this.hasStatusTarget)
259
+ return;
260
+ this.statusTarget.textContent = `Slide ${this._currentIndex + 1} of ${this.slides.length}`;
261
+ }
182
262
  // Snaps scroll position back to the frontier if the user somehow scrolled
183
263
  // past it (e.g. momentum after a partially-blocked gesture).
184
264
  clampToFrontier() {
@@ -231,15 +311,35 @@ class Carousel extends Controller {
231
311
  this.slides.forEach((slide) => this.observer?.observe(slide));
232
312
  }
233
313
  updateNavigation() {
314
+ if (this.fadeValue) {
315
+ const atStart2 = this._currentIndex <= 0;
316
+ const atEnd2 = this._currentIndex >= this.slides.length - 1;
317
+ if (this.hasPrevTarget) {
318
+ const hide = atStart2 && !this.loopValue;
319
+ this.prevTarget.classList.toggle("hide", hide);
320
+ this.prevTarget.disabled = hide;
321
+ }
322
+ if (this.hasNextTarget) {
323
+ const hide = atEnd2 && !this.loopValue;
324
+ this.nextTarget.classList.toggle("hide", hide);
325
+ this.nextTarget.disabled = hide;
326
+ }
327
+ return;
328
+ }
234
329
  const track = this.trackTarget;
235
330
  const atStart = track.scrollLeft <= 0;
236
331
  const atEnd = track.scrollLeft >= track.scrollWidth - track.clientWidth - 1;
237
- if (this.hasPrevTarget)
238
- this.prevTarget.classList.toggle("hide", atStart && !this.loopValue);
332
+ if (this.hasPrevTarget) {
333
+ const hide = atStart && !this.loopValue;
334
+ this.prevTarget.classList.toggle("hide", hide);
335
+ this.prevTarget.disabled = hide;
336
+ }
239
337
  if (this.hasNextTarget) {
240
338
  const atLastSlide = this._currentIndex >= this.slides.length - 1;
241
339
  const frontierReached = this.wizardValue && this._currentIndex >= this._maxUnlocked;
242
- this.nextTarget.classList.toggle("hide", (atEnd || atLastSlide || frontierReached) && !this.loopValue);
340
+ const hide = (atEnd || atLastSlide || frontierReached) && !this.loopValue;
341
+ this.nextTarget.classList.toggle("hide", hide);
342
+ this.nextTarget.disabled = hide;
243
343
  }
244
344
  if (this.wizardValue && this.hasDotTarget) {
245
345
  this.dotTargets.forEach((dot, i) => {
@@ -1 +1 @@
1
- {"version":3,"file":"carousel_component_controller.js","sources":["../../../../../../../app/components/midwest/carousel_component/carousel_component_controller.ts"],"sourcesContent":["import { Controller } from '@hotwired/stimulus'\n\n// Input types where pressing Enter in a form does NOT normally submit it.\n// For all other input types, Enter submits — so wizard mode intercepts it.\nconst NON_SUBMITTING_INPUT_TYPES = new Set([\n 'button', 'checkbox', 'color', 'file', 'hidden', 'image', 'radio', 'range', 'reset', 'submit'\n])\n\n// Tags that should receive arrow key events without carousel interception.\nconst FORM_ELEMENT_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT'])\n\nexport default class Carousel extends Controller<HTMLElement> {\n static targets = ['track', 'prev', 'next', 'dot']\n static values = {\n wizard: { type: Boolean, default: false },\n autoplay: { type: Number, default: 0 },\n loop: { type: Boolean, default: false }\n }\n\n declare readonly trackTarget: HTMLElement\n declare readonly prevTarget: HTMLButtonElement\n declare readonly nextTarget: HTMLButtonElement\n declare readonly dotTargets: HTMLButtonElement[]\n declare readonly hasPrevTarget: boolean\n declare readonly hasNextTarget: boolean\n declare readonly hasDotTarget: boolean\n declare wizardValue: boolean\n declare autoplayValue: number\n declare loopValue: boolean\n\n private observer: IntersectionObserver | null = null\n private _currentIndex = 0\n private _maxUnlocked = 0\n private _lastTouchX = 0\n private _autoplayTimer: ReturnType<typeof setInterval> | null = null\n\n connect () {\n this.setupObserver()\n this.updateNavigation()\n this.element.addEventListener('keydown', this.handleArrowKeys)\n if (this.wizardValue) {\n this.element.addEventListener('keydown', this.handleKeydown)\n this.trackTarget.addEventListener('wheel', this.handleWheel, { passive: false })\n this.trackTarget.addEventListener('touchstart', this.handleTouchStart, { passive: true })\n this.trackTarget.addEventListener('touchmove', this.handleTouchMove, { passive: false })\n this.updateSlideAccessibility()\n }\n if (this.autoplayValue > 0) {\n this.startAutoplay()\n this.element.addEventListener('mouseenter', this.pauseAutoplay)\n this.element.addEventListener('mouseleave', this.resumeAutoplay)\n }\n }\n\n disconnect () {\n this.observer?.disconnect()\n this.element.removeEventListener('keydown', this.handleArrowKeys)\n this.element.removeEventListener('keydown', this.handleKeydown)\n this.element.removeEventListener('mouseenter', this.pauseAutoplay)\n this.element.removeEventListener('mouseleave', this.resumeAutoplay)\n this.trackTarget.removeEventListener('wheel', this.handleWheel)\n this.trackTarget.removeEventListener('touchstart', this.handleTouchStart)\n this.trackTarget.removeEventListener('touchmove', this.handleTouchMove)\n this.stopAutoplay()\n }\n\n next () {\n const atEnd = this._currentIndex >= this.slides.length - 1\n if (this.loopValue && atEnd) {\n this.slides[0]?.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' })\n } else {\n this.trackTarget.scrollBy({ left: this.trackTarget.clientWidth, behavior: 'smooth' })\n }\n }\n\n previous () {\n const atStart = this._currentIndex <= 0\n if (this.loopValue && atStart) {\n const last = this.slides[this.slides.length - 1]\n last?.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' })\n } else {\n this.trackTarget.scrollBy({ left: -this.trackTarget.clientWidth, behavior: 'smooth' })\n }\n }\n\n goto (event: Event) {\n const button = event.currentTarget as HTMLButtonElement\n const index = parseInt(button.dataset.index ?? '0', 10)\n const slide = this.slides[index]\n slide?.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' })\n }\n\n // Unlocks the next slide and advances to it. Intended for wizard mode: wire\n // a \"Continue\" button inside a slide to this action so users progress\n // linearly through steps before the carousel nav becomes available.\n //\n // <button type=\"button\" data-action=\"click->midwest-carousel#unlockNext\">\n // Continue\n // </button>\n unlockNext () {\n const nextIndex = this._currentIndex + 1\n if (nextIndex > this._maxUnlocked) {\n this._maxUnlocked = nextIndex\n this.updateSlideAccessibility()\n }\n this.next()\n }\n\n scrolled () {\n if (this.wizardValue) this.clampToFrontier()\n this.updateCurrentIndex()\n this.updateNavigation()\n }\n\n // Arrow function so `this` is stable for add/removeEventListener pairing.\n // Handles ArrowLeft/ArrowRight for keyboard slide navigation. Skips form\n // elements so arrow keys continue to work normally inside inputs and selects.\n private handleArrowKeys = (event: KeyboardEvent) => {\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return\n\n const target = event.target as HTMLElement\n if (FORM_ELEMENT_TAGS.has(target.tagName) || target.isContentEditable) return\n\n event.preventDefault()\n if (event.key === 'ArrowLeft') {\n this.previous()\n } else {\n this.next()\n }\n }\n\n // Arrow function so `this` is stable for add/removeEventListener pairing.\n private handleKeydown = (event: KeyboardEvent) => {\n if (event.key !== 'Enter') return\n\n const target = event.target as HTMLElement\n // Only intercept Enter on text-like inputs; textarea newlines and button\n // activations should pass through untouched.\n if (target.tagName === 'TEXTAREA' || target.tagName !== 'INPUT') return\n if (NON_SUBMITTING_INPUT_TYPES.has((target as HTMLInputElement).type)) return\n\n // On the final step let Enter submit the form normally.\n if (this._currentIndex >= this.slides.length - 1) return\n\n event.preventDefault()\n this.unlockNext()\n }\n\n // Blocks wheel-based horizontal scrolling past the wizard frontier.\n private handleWheel = (event: WheelEvent) => {\n const maxLeft = this._maxUnlocked * this.trackTarget.clientWidth\n if (event.deltaX > 0 && this.trackTarget.scrollLeft >= maxLeft - 2) {\n event.preventDefault()\n }\n }\n\n private handleTouchStart = (event: TouchEvent) => {\n this._lastTouchX = event.touches[0].clientX\n }\n\n // Blocks touch-swipe scrolling past the wizard frontier. Tracks incremental\n // delta per move event so direction is accurate mid-gesture.\n private handleTouchMove = (event: TouchEvent) => {\n const currentX = event.touches[0].clientX\n const delta = currentX - this._lastTouchX // positive = swiping right (going back)\n this._lastTouchX = currentX\n\n const maxLeft = this._maxUnlocked * this.trackTarget.clientWidth\n if (delta < 0 && this.trackTarget.scrollLeft >= maxLeft - 2) {\n event.preventDefault()\n }\n }\n\n private pauseAutoplay = () => {\n this.stopAutoplay()\n }\n\n private resumeAutoplay = () => {\n this.startAutoplay()\n }\n\n private startAutoplay () {\n if (this.autoplayValue <= 0 || this._autoplayTimer !== null) return\n this._autoplayTimer = setInterval(() => { this.autoplayAdvance() }, this.autoplayValue)\n }\n\n private stopAutoplay () {\n if (this._autoplayTimer === null) return\n clearInterval(this._autoplayTimer)\n this._autoplayTimer = null\n }\n\n private autoplayAdvance () {\n const atEnd = this._currentIndex >= this.slides.length - 1\n if (atEnd) {\n const firstSlide = this.slides[0]\n firstSlide?.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' })\n } else {\n this.next()\n }\n }\n\n private get slides (): HTMLElement[] {\n return Array.from(this.trackTarget.children) as HTMLElement[]\n }\n\n // Snaps scroll position back to the frontier if the user somehow scrolled\n // past it (e.g. momentum after a partially-blocked gesture).\n private clampToFrontier () {\n const maxLeft = this._maxUnlocked * this.trackTarget.clientWidth\n if (this.trackTarget.scrollLeft > maxLeft + 2) {\n this.trackTarget.scrollLeft = maxLeft\n }\n }\n\n // Applies/removes `inert` on each slide based on the wizard frontier,\n // removing locked slides from the tab order and accessibility tree.\n private updateSlideAccessibility () {\n this.slides.forEach((slide, i) => {\n if (i > this._maxUnlocked) {\n slide.setAttribute('inert', '')\n } else {\n slide.removeAttribute('inert')\n }\n })\n }\n\n private updateCurrentIndex () {\n const track = this.trackTarget\n if (track.clientWidth > 0) {\n this._currentIndex = Math.round(track.scrollLeft / track.clientWidth)\n }\n }\n\n private setupObserver () {\n if (!this.hasDotTarget) return\n if (!('IntersectionObserver' in window)) return\n\n this.observer = new IntersectionObserver(\n (entries) => {\n entries.forEach(entry => {\n const index = this.slides.indexOf(entry.target as HTMLElement)\n if (index >= 0) {\n const dot = this.dotTargets[index]\n if (!dot) return\n dot.classList.toggle('active', entry.isIntersecting)\n if (entry.isIntersecting) {\n dot.setAttribute('aria-current', 'true')\n } else {\n dot.removeAttribute('aria-current')\n }\n }\n })\n },\n { root: this.trackTarget, threshold: 0.5 }\n )\n\n this.slides.forEach(slide => this.observer?.observe(slide))\n }\n\n private updateNavigation () {\n const track = this.trackTarget\n const atStart = track.scrollLeft <= 0\n const atEnd = track.scrollLeft >= track.scrollWidth - track.clientWidth - 1\n\n if (this.hasPrevTarget) this.prevTarget.classList.toggle('hide', atStart && !this.loopValue)\n\n if (this.hasNextTarget) {\n const atLastSlide = this._currentIndex >= this.slides.length - 1\n const frontierReached = this.wizardValue && this._currentIndex >= this._maxUnlocked\n this.nextTarget.classList.toggle('hide', (atEnd || atLastSlide || frontierReached) && !this.loopValue)\n }\n\n if (this.wizardValue && this.hasDotTarget) {\n this.dotTargets.forEach((dot, i) => {\n const locked = i > this._maxUnlocked\n dot.disabled = locked\n dot.classList.toggle('locked', locked)\n })\n }\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"carousel_component_controller.js","sources":["../../../../../../../app/components/midwest/carousel_component/carousel_component_controller.ts"],"sourcesContent":["import { Controller } from '@hotwired/stimulus'\n\n// Input types where pressing Enter in a form does NOT normally submit it.\n// For all other input types, Enter submits — so wizard mode intercepts it.\nconst NON_SUBMITTING_INPUT_TYPES = new Set([\n 'button', 'checkbox', 'color', 'file', 'hidden', 'image', 'radio', 'range', 'reset', 'submit'\n])\n\n// Tags that should receive arrow key events without carousel interception.\nconst FORM_ELEMENT_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT'])\n\nexport default class Carousel extends Controller<HTMLElement> {\n static targets = ['track', 'prev', 'next', 'dot', 'status']\n static values = {\n wizard: { type: Boolean, default: false },\n autoplay: { type: Number, default: 0 },\n loop: { type: Boolean, default: false },\n fade: { type: Boolean, default: false }\n }\n\n declare readonly trackTarget: HTMLElement\n declare readonly prevTarget: HTMLButtonElement\n declare readonly nextTarget: HTMLButtonElement\n declare readonly dotTargets: HTMLButtonElement[]\n declare readonly statusTarget: HTMLElement\n declare readonly hasPrevTarget: boolean\n declare readonly hasNextTarget: boolean\n declare readonly hasDotTarget: boolean\n declare readonly hasStatusTarget: boolean\n declare wizardValue: boolean\n declare autoplayValue: number\n declare loopValue: boolean\n declare fadeValue: boolean\n\n private observer: IntersectionObserver | null = null\n private _currentIndex = 0\n private _maxUnlocked = 0\n private _lastTouchX = 0\n private _autoplayTimer: ReturnType<typeof setInterval> | null = null\n\n connect () {\n if (this.fadeValue) {\n this.initFade()\n } else {\n this.setupObserver()\n }\n this.updateNavigation()\n this.element.addEventListener('keydown', this.handleArrowKeys)\n if (this.wizardValue) {\n this.element.addEventListener('keydown', this.handleKeydown)\n this.trackTarget.addEventListener('wheel', this.handleWheel, { passive: false })\n this.trackTarget.addEventListener('touchstart', this.handleTouchStart, { passive: true })\n this.trackTarget.addEventListener('touchmove', this.handleTouchMove, { passive: false })\n this.updateSlideAccessibility()\n }\n if (this.autoplayValue > 0) {\n this.startAutoplay()\n this.element.addEventListener('mouseenter', this.pauseAutoplay)\n this.element.addEventListener('mouseleave', this.resumeAutoplay)\n // Pause when keyboard focus enters the carousel (WCAG 2.2.2)\n this.element.addEventListener('focusin', this.pauseAutoplay)\n this.element.addEventListener('focusout', this.resumeAutoplay)\n }\n }\n\n disconnect () {\n this.observer?.disconnect()\n this.element.removeEventListener('keydown', this.handleArrowKeys)\n this.element.removeEventListener('keydown', this.handleKeydown)\n this.element.removeEventListener('mouseenter', this.pauseAutoplay)\n this.element.removeEventListener('mouseleave', this.resumeAutoplay)\n this.element.removeEventListener('focusin', this.pauseAutoplay)\n this.element.removeEventListener('focusout', this.resumeAutoplay)\n this.trackTarget.removeEventListener('wheel', this.handleWheel)\n this.trackTarget.removeEventListener('touchstart', this.handleTouchStart)\n this.trackTarget.removeEventListener('touchmove', this.handleTouchMove)\n this.stopAutoplay()\n }\n\n next () {\n if (this.fadeValue) {\n const atEnd = this._currentIndex >= this.slides.length - 1\n const nextIndex = this.loopValue && atEnd ? 0 : Math.min(this._currentIndex + 1, this.slides.length - 1)\n this.activateSlide(nextIndex)\n return\n }\n const atEnd = this._currentIndex >= this.slides.length - 1\n if (this.loopValue && atEnd) {\n this.slides[0]?.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' })\n } else {\n this.trackTarget.scrollBy({ left: this.trackTarget.clientWidth, behavior: 'smooth' })\n }\n }\n\n previous () {\n if (this.fadeValue) {\n const atStart = this._currentIndex <= 0\n const prevIndex = this.loopValue && atStart ? this.slides.length - 1 : Math.max(this._currentIndex - 1, 0)\n this.activateSlide(prevIndex)\n return\n }\n const atStart = this._currentIndex <= 0\n if (this.loopValue && atStart) {\n const last = this.slides[this.slides.length - 1]\n last?.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' })\n } else {\n this.trackTarget.scrollBy({ left: -this.trackTarget.clientWidth, behavior: 'smooth' })\n }\n }\n\n goto (event: Event) {\n const button = event.currentTarget as HTMLButtonElement\n const index = parseInt(button.dataset.index ?? '0', 10)\n if (this.fadeValue) {\n this.activateSlide(index)\n return\n }\n const slide = this.slides[index]\n slide?.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' })\n }\n\n // Unlocks the next slide and advances to it. Intended for wizard mode: wire\n // a \"Continue\" button inside a slide to this action so users progress\n // linearly through steps before the carousel nav becomes available.\n //\n // <button type=\"button\" data-action=\"click->midwest-carousel#unlockNext\">\n // Continue\n // </button>\n unlockNext () {\n const nextIndex = this._currentIndex + 1\n if (nextIndex > this._maxUnlocked) {\n this._maxUnlocked = nextIndex\n this.updateSlideAccessibility()\n }\n this.next()\n }\n\n scrolled () {\n if (this.fadeValue) return\n if (this.wizardValue) this.clampToFrontier()\n this.updateCurrentIndex()\n this.updateNavigation()\n this.announceSlide()\n }\n\n // Arrow function so `this` is stable for add/removeEventListener pairing.\n // Handles ArrowLeft/ArrowRight for keyboard slide navigation. Skips form\n // elements so arrow keys continue to work normally inside inputs and selects.\n private handleArrowKeys = (event: KeyboardEvent) => {\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return\n\n const target = event.target as HTMLElement\n if (FORM_ELEMENT_TAGS.has(target.tagName) || target.isContentEditable) return\n\n event.preventDefault()\n if (event.key === 'ArrowLeft') {\n this.previous()\n } else {\n this.next()\n }\n }\n\n // Arrow function so `this` is stable for add/removeEventListener pairing.\n private handleKeydown = (event: KeyboardEvent) => {\n if (event.key !== 'Enter') return\n\n const target = event.target as HTMLElement\n // Only intercept Enter on text-like inputs; textarea newlines and button\n // activations should pass through untouched.\n if (target.tagName === 'TEXTAREA' || target.tagName !== 'INPUT') return\n if (NON_SUBMITTING_INPUT_TYPES.has((target as HTMLInputElement).type)) return\n\n // On the final step let Enter submit the form normally.\n if (this._currentIndex >= this.slides.length - 1) return\n\n event.preventDefault()\n this.unlockNext()\n }\n\n // Blocks wheel-based horizontal scrolling past the wizard frontier.\n private handleWheel = (event: WheelEvent) => {\n const maxLeft = this._maxUnlocked * this.trackTarget.clientWidth\n if (event.deltaX > 0 && this.trackTarget.scrollLeft >= maxLeft - 2) {\n event.preventDefault()\n }\n }\n\n private handleTouchStart = (event: TouchEvent) => {\n this._lastTouchX = event.touches[0].clientX\n }\n\n // Blocks touch-swipe scrolling past the wizard frontier. Tracks incremental\n // delta per move event so direction is accurate mid-gesture.\n private handleTouchMove = (event: TouchEvent) => {\n const currentX = event.touches[0].clientX\n const delta = currentX - this._lastTouchX // positive = swiping right (going back)\n this._lastTouchX = currentX\n\n const maxLeft = this._maxUnlocked * this.trackTarget.clientWidth\n if (delta < 0 && this.trackTarget.scrollLeft >= maxLeft - 2) {\n event.preventDefault()\n }\n }\n\n private pauseAutoplay = () => {\n this.stopAutoplay()\n }\n\n private resumeAutoplay = () => {\n this.startAutoplay()\n }\n\n private startAutoplay () {\n if (this.autoplayValue <= 0 || this._autoplayTimer !== null) return\n this._autoplayTimer = setInterval(() => { this.autoplayAdvance() }, this.autoplayValue)\n }\n\n private stopAutoplay () {\n if (this._autoplayTimer === null) return\n clearInterval(this._autoplayTimer)\n this._autoplayTimer = null\n }\n\n private autoplayAdvance () {\n if (this.fadeValue) {\n const nextIndex = (this._currentIndex + 1) % this.slides.length\n this.activateSlide(nextIndex)\n return\n }\n const atEnd = this._currentIndex >= this.slides.length - 1\n if (atEnd) {\n const firstSlide = this.slides[0]\n firstSlide?.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' })\n } else {\n this.next()\n }\n }\n\n private get slides (): HTMLElement[] {\n return Array.from(this.trackTarget.children) as HTMLElement[]\n }\n\n // Sets up the fade mode initial state. Marks the first slide active, hides\n // all others from the accessibility tree, and adds .fade-ready so CSS hands\n // control over to .is-active.\n private initFade () {\n this.slides.forEach((slide, i) => {\n const active = i === 0\n slide.classList.toggle('is-active', active)\n slide.toggleAttribute('inert', !active)\n slide.setAttribute('aria-hidden', String(!active))\n })\n this.element.classList.add('fade-ready')\n this.syncPagerDots()\n }\n\n // Transitions to the slide at `index` in fade mode by swapping .is-active and\n // hiding non-active slides from the accessibility tree.\n private activateSlide (index: number) {\n this.slides.forEach((slide, i) => {\n const active = i === index\n slide.classList.toggle('is-active', active)\n slide.toggleAttribute('inert', !active)\n slide.setAttribute('aria-hidden', String(!active))\n })\n this._currentIndex = index\n this.updateNavigation()\n this.syncPagerDots()\n this.announceSlide()\n }\n\n // Syncs pager dot active state from _currentIndex. Used in fade mode where\n // IntersectionObserver is not set up (the track doesn't scroll).\n private syncPagerDots () {\n if (!this.hasDotTarget) return\n this.dotTargets.forEach((dot, i) => {\n dot.classList.toggle('active', i === this._currentIndex)\n if (i === this._currentIndex) {\n dot.setAttribute('aria-current', 'true')\n } else {\n dot.removeAttribute('aria-current')\n }\n })\n }\n\n // Updates the sr-only live region so screen readers announce the new slide.\n private announceSlide () {\n if (!this.hasStatusTarget) return\n this.statusTarget.textContent = `Slide ${this._currentIndex + 1} of ${this.slides.length}`\n }\n\n // Snaps scroll position back to the frontier if the user somehow scrolled\n // past it (e.g. momentum after a partially-blocked gesture).\n private clampToFrontier () {\n const maxLeft = this._maxUnlocked * this.trackTarget.clientWidth\n if (this.trackTarget.scrollLeft > maxLeft + 2) {\n this.trackTarget.scrollLeft = maxLeft\n }\n }\n\n // Applies/removes `inert` on each slide based on the wizard frontier,\n // removing locked slides from the tab order and accessibility tree.\n private updateSlideAccessibility () {\n this.slides.forEach((slide, i) => {\n if (i > this._maxUnlocked) {\n slide.setAttribute('inert', '')\n } else {\n slide.removeAttribute('inert')\n }\n })\n }\n\n private updateCurrentIndex () {\n const track = this.trackTarget\n if (track.clientWidth > 0) {\n this._currentIndex = Math.round(track.scrollLeft / track.clientWidth)\n }\n }\n\n private setupObserver () {\n if (!this.hasDotTarget) return\n if (!('IntersectionObserver' in window)) return\n\n this.observer = new IntersectionObserver(\n (entries) => {\n entries.forEach(entry => {\n const index = this.slides.indexOf(entry.target as HTMLElement)\n if (index >= 0) {\n const dot = this.dotTargets[index]\n if (!dot) return\n dot.classList.toggle('active', entry.isIntersecting)\n if (entry.isIntersecting) {\n dot.setAttribute('aria-current', 'true')\n } else {\n dot.removeAttribute('aria-current')\n }\n }\n })\n },\n { root: this.trackTarget, threshold: 0.5 }\n )\n\n this.slides.forEach(slide => this.observer?.observe(slide))\n }\n\n private updateNavigation () {\n if (this.fadeValue) {\n const atStart = this._currentIndex <= 0\n const atEnd = this._currentIndex >= this.slides.length - 1\n if (this.hasPrevTarget) {\n const hide = atStart && !this.loopValue\n this.prevTarget.classList.toggle('hide', hide)\n this.prevTarget.disabled = hide\n }\n if (this.hasNextTarget) {\n const hide = atEnd && !this.loopValue\n this.nextTarget.classList.toggle('hide', hide)\n this.nextTarget.disabled = hide\n }\n return\n }\n\n const track = this.trackTarget\n const atStart = track.scrollLeft <= 0\n const atEnd = track.scrollLeft >= track.scrollWidth - track.clientWidth - 1\n\n if (this.hasPrevTarget) {\n const hide = atStart && !this.loopValue\n this.prevTarget.classList.toggle('hide', hide)\n this.prevTarget.disabled = hide\n }\n\n if (this.hasNextTarget) {\n const atLastSlide = this._currentIndex >= this.slides.length - 1\n const frontierReached = this.wizardValue && this._currentIndex >= this._maxUnlocked\n const hide = (atEnd || atLastSlide || frontierReached) && !this.loopValue\n this.nextTarget.classList.toggle('hide', hide)\n this.nextTarget.disabled = hide\n }\n\n if (this.wizardValue && this.hasDotTarget) {\n this.dotTargets.forEach((dot, i) => {\n const locked = i > this._maxUnlocked\n dot.disabled = locked\n dot.classList.toggle('locked', locked)\n })\n }\n }\n}\n"],"names":["atEnd","atStart"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
- import { autoUpdate, computePosition, hide, offset, autoPlacement, shift } from '../../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs.js';
2
+ import { autoUpdate, computePosition, hide, offset, autoPlacement, shift } from '../../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.js';
3
3
 
4
4
  class Dropdown extends Controller {
5
5
  static values = {
@@ -1,16 +1,47 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
3
+ const FORMATTERS = {
4
+ phone: (v) => {
5
+ const d = v.replace(/\D/g, "").slice(0, 10);
6
+ if (d.length <= 3)
7
+ return d;
8
+ if (d.length <= 6)
9
+ return `(${d.slice(0, 3)}) ${d.slice(3)}`;
10
+ return `(${d.slice(0, 3)}) ${d.slice(3, 6)}-${d.slice(6)}`;
11
+ },
12
+ credit_card: (v) => {
13
+ const d = v.replace(/\D/g, "").slice(0, 16);
14
+ return d.match(/.{1,4}/g)?.join(" ") ?? d;
15
+ },
16
+ zip: (v) => {
17
+ const d = v.replace(/\D/g, "");
18
+ if (d.length <= 5)
19
+ return d;
20
+ return `${d.slice(0, 5)}-${d.slice(5, 9)}`;
21
+ }
22
+ };
3
23
  class Input extends Controller {
4
- static targets = ["input", "counter", "capsLockWarning"];
24
+ static targets = ["input", "counter", "capsLockWarning", "matchError"];
25
+ static values = {
26
+ match: { type: String, default: "" },
27
+ autoformat: { type: String, default: "" }
28
+ };
5
29
  updateClearButton = null;
6
30
  updateCounter = null;
7
31
  updateCapsLock = null;
8
32
  hideCapsLock = null;
33
+ matchListener = null;
34
+ matchInvalidListener = null;
35
+ matchSourceListener = null;
36
+ matchSourceElement = null;
37
+ autoformatListener = null;
9
38
  connect() {
10
39
  this.applyColor();
11
40
  this.applySearchClear();
12
41
  this.applyCounter();
13
42
  this.applyPassword();
43
+ this.applyMatch();
44
+ this.applyAutoformat();
14
45
  }
15
46
  disconnect() {
16
47
  if (this.updateClearButton) {
@@ -31,6 +62,24 @@ class Input extends Controller {
31
62
  this.inputTarget.removeEventListener("blur", this.hideCapsLock);
32
63
  this.hideCapsLock = null;
33
64
  }
65
+ if (this.matchListener) {
66
+ this.inputTarget.removeEventListener("input", this.matchListener);
67
+ this.inputTarget.removeEventListener("blur", this.matchListener);
68
+ this.matchListener = null;
69
+ }
70
+ if (this.matchInvalidListener) {
71
+ this.inputTarget.removeEventListener("invalid", this.matchInvalidListener);
72
+ this.matchInvalidListener = null;
73
+ }
74
+ if (this.matchSourceListener && this.matchSourceElement) {
75
+ this.matchSourceElement.removeEventListener("input", this.matchSourceListener);
76
+ this.matchSourceListener = null;
77
+ this.matchSourceElement = null;
78
+ }
79
+ if (this.autoformatListener) {
80
+ this.inputTarget.removeEventListener("blur", this.autoformatListener);
81
+ this.autoformatListener = null;
82
+ }
34
83
  }
35
84
  increment() {
36
85
  const input = this.inputTarget;
@@ -125,6 +174,72 @@ class Input extends Controller {
125
174
  this.inputTarget.focus();
126
175
  });
127
176
  }
177
+ // Validates that this field's value matches the value of the element
178
+ // identified by matchValue (a CSS selector). Uses setCustomValidity to
179
+ // block form submission. Shows the error inline via the matchError target
180
+ // rather than the browser's native tooltip (invalid event is suppressed).
181
+ applyMatch() {
182
+ if (!this.matchValue)
183
+ return;
184
+ const showError = () => {
185
+ this.element.classList.add("has-error", "theme-red");
186
+ if (this.hasMatchErrorTarget)
187
+ this.matchErrorTarget.hidden = false;
188
+ };
189
+ const clearError = () => {
190
+ this.element.classList.remove("has-error", "theme-red");
191
+ if (this.hasMatchErrorTarget)
192
+ this.matchErrorTarget.hidden = true;
193
+ };
194
+ const validate = () => {
195
+ const other2 = document.querySelector(this.matchValue);
196
+ if (!this.inputTarget.value) {
197
+ this.inputTarget.setCustomValidity("");
198
+ clearError();
199
+ return;
200
+ }
201
+ if (!other2 || this.inputTarget.value === other2.value) {
202
+ this.inputTarget.setCustomValidity("");
203
+ clearError();
204
+ } else {
205
+ this.inputTarget.setCustomValidity("Values do not match");
206
+ showError();
207
+ }
208
+ };
209
+ this.matchListener = validate;
210
+ this.inputTarget.addEventListener("input", validate);
211
+ this.inputTarget.addEventListener("blur", validate);
212
+ this.matchInvalidListener = (e) => {
213
+ e.preventDefault();
214
+ showError();
215
+ };
216
+ this.inputTarget.addEventListener("invalid", this.matchInvalidListener);
217
+ const other = document.querySelector(this.matchValue);
218
+ if (other) {
219
+ this.matchSourceElement = other;
220
+ this.matchSourceListener = validate;
221
+ other.addEventListener("input", validate);
222
+ }
223
+ }
224
+ // Reformats the input value on blur using a named formatter from FORMATTERS.
225
+ // Dispatches input + change events after reformatting so downstream
226
+ // listeners (counters, form state) stay in sync.
227
+ applyAutoformat() {
228
+ if (!this.autoformatValue)
229
+ return;
230
+ const fmt = FORMATTERS[this.autoformatValue];
231
+ if (!fmt)
232
+ return;
233
+ this.autoformatListener = () => {
234
+ const formatted = fmt(this.inputTarget.value);
235
+ if (formatted !== this.inputTarget.value) {
236
+ this.inputTarget.value = formatted;
237
+ this.inputTarget.dispatchEvent(new Event("input", { bubbles: true }));
238
+ this.inputTarget.dispatchEvent(new Event("change", { bubbles: true }));
239
+ }
240
+ };
241
+ this.inputTarget.addEventListener("blur", this.autoformatListener);
242
+ }
128
243
  }
129
244
 
130
245
  export { Input as default };
@@ -1 +1 @@
1
- {"version":3,"file":"input_component_controller.js","sources":["../../../../../../../../app/components/midwest/form/input_component/input_component_controller.ts"],"sourcesContent":["\nimport { Controller } from '@hotwired/stimulus'\n\nexport default class Input extends Controller<HTMLFormElement> {\n static targets = ['input', 'counter', 'capsLockWarning']\n\n declare readonly hasInputTarget: boolean\n declare readonly inputTarget: HTMLInputElement\n declare readonly inputTargets: HTMLInputElement[]\n declare readonly hasCounterTarget: boolean\n declare readonly counterTarget: HTMLElement\n declare readonly hasCapsLockWarningTarget: boolean\n declare readonly capsLockWarningTarget: HTMLElement\n\n private updateClearButton: (() => void) | null = null\n private updateCounter: (() => void) | null = null\n private updateCapsLock: ((e: KeyboardEvent | MouseEvent) => void) | null = null\n private hideCapsLock: (() => void) | null = null\n\n connect () {\n this.applyColor()\n this.applySearchClear()\n this.applyCounter()\n this.applyPassword()\n }\n\n disconnect () {\n if (this.updateClearButton) {\n this.inputTarget.removeEventListener('input', this.updateClearButton)\n this.updateClearButton = null\n }\n if (this.updateCounter) {\n this.inputTarget.removeEventListener('input', this.updateCounter)\n this.updateCounter = null\n }\n if (this.updateCapsLock) {\n this.inputTarget.removeEventListener('keydown', this.updateCapsLock)\n this.inputTarget.removeEventListener('keyup', this.updateCapsLock)\n this.inputTarget.removeEventListener('mousedown', this.updateCapsLock)\n this.updateCapsLock = null\n }\n if (this.hideCapsLock) {\n this.inputTarget.removeEventListener('blur', this.hideCapsLock)\n this.hideCapsLock = null\n }\n }\n\n increment () {\n const input = this.inputTarget\n const step = parseFloat(input.step) || 1\n const max = input.max !== '' ? parseFloat(input.max) : Infinity\n const newValue = (parseFloat(input.value) || 0) + step\n if (newValue <= max) {\n input.value = String(newValue)\n input.dispatchEvent(new Event('input', { bubbles: true }))\n input.dispatchEvent(new Event('change', { bubbles: true }))\n }\n }\n\n decrement () {\n const input = this.inputTarget\n const step = parseFloat(input.step) || 1\n const min = input.min !== '' ? parseFloat(input.min) : -Infinity\n const newValue = (parseFloat(input.value) || 0) - step\n if (newValue >= min) {\n input.value = String(newValue)\n input.dispatchEvent(new Event('input', { bubbles: true }))\n input.dispatchEvent(new Event('change', { bubbles: true }))\n }\n }\n\n applyColor () {\n if (this.inputTarget.type !== 'color') {\n return\n }\n\n this.inputTarget.addEventListener('input', () => {\n this.inputTarget.setAttribute('value', this.inputTarget.value)\n })\n }\n\n private applyCounter () {\n if (!this.hasCounterTarget) return\n\n this.counterTarget.textContent = String(this.inputTarget.value.length)\n\n this.updateCounter = () => {\n this.counterTarget.textContent = String(this.inputTarget.value.length)\n }\n\n this.inputTarget.addEventListener('input', this.updateCounter)\n }\n\n private applyPassword () {\n if (!this.hasCapsLockWarningTarget) return\n\n this.updateCapsLock = (e: KeyboardEvent | MouseEvent) => {\n this.capsLockWarningTarget.hidden = !e.getModifierState('CapsLock')\n }\n\n this.hideCapsLock = () => {\n this.capsLockWarningTarget.hidden = true\n }\n\n this.inputTarget.addEventListener('keydown', this.updateCapsLock)\n this.inputTarget.addEventListener('keyup', this.updateCapsLock)\n this.inputTarget.addEventListener('mousedown', this.updateCapsLock)\n this.inputTarget.addEventListener('blur', this.hideCapsLock)\n }\n\n private applySearchClear () {\n if (this.inputTarget.type !== 'search') return\n // Browsers that natively render a cancel button (Chrome, Safari, Edge)\n // already handle clearing. Only inject for browsers that don't (Firefox).\n if (CSS.supports('selector(::-webkit-search-cancel-button)')) return\n\n const button = document.createElement('button')\n button.type = 'button'\n button.setAttribute('aria-label', 'Clear search')\n button.classList.add('midwest-input-search-clear')\n button.hidden = this.inputTarget.value.length === 0\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 24 24')\n svg.setAttribute('fill', 'none')\n svg.setAttribute('stroke', 'currentColor')\n svg.setAttribute('stroke-width', '2')\n svg.setAttribute('aria-hidden', 'true')\n svg.setAttribute('width', '16')\n svg.setAttribute('height', '16')\n\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n path.setAttribute('stroke-linecap', 'round')\n path.setAttribute('stroke-linejoin', 'round')\n path.setAttribute('d', 'M6 18L18 6M6 6l12 12')\n svg.appendChild(path)\n button.appendChild(svg)\n\n const wrapper = document.createElement('div')\n wrapper.classList.add('midwest-input-search-wrapper')\n this.inputTarget.parentElement?.insertBefore(wrapper, this.inputTarget)\n wrapper.appendChild(this.inputTarget)\n wrapper.appendChild(button)\n\n this.updateClearButton = () => {\n button.hidden = this.inputTarget.value.length === 0\n }\n\n this.inputTarget.addEventListener('input', this.updateClearButton)\n\n button.addEventListener('click', () => {\n this.inputTarget.value = ''\n button.hidden = true\n this.inputTarget.dispatchEvent(new Event('input', { bubbles: true }))\n this.inputTarget.focus()\n })\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"input_component_controller.js","sources":["../../../../../../../../app/components/midwest/form/input_component/input_component_controller.ts"],"sourcesContent":["\nimport { Controller } from '@hotwired/stimulus'\n\n// Named formatters applied on blur when autoformat is set.\nconst FORMATTERS: Record<string, (value: string) => string> = {\n phone: (v: string) => {\n const d = v.replace(/\\D/g, '').slice(0, 10)\n if (d.length <= 3) return d\n if (d.length <= 6) return `(${d.slice(0, 3)}) ${d.slice(3)}`\n return `(${d.slice(0, 3)}) ${d.slice(3, 6)}-${d.slice(6)}`\n },\n credit_card: (v: string) => {\n const d = v.replace(/\\D/g, '').slice(0, 16)\n return d.match(/.{1,4}/g)?.join(' ') ?? d\n },\n zip: (v: string) => {\n const d = v.replace(/\\D/g, '')\n if (d.length <= 5) return d\n return `${d.slice(0, 5)}-${d.slice(5, 9)}`\n }\n}\n\nexport default class Input extends Controller<HTMLFormElement> {\n static targets = ['input', 'counter', 'capsLockWarning', 'matchError']\n static values = {\n match: { type: String, default: '' },\n autoformat: { type: String, default: '' }\n }\n\n declare readonly hasInputTarget: boolean\n declare readonly inputTarget: HTMLInputElement\n declare readonly inputTargets: HTMLInputElement[]\n declare readonly hasCounterTarget: boolean\n declare readonly counterTarget: HTMLElement\n declare readonly hasCapsLockWarningTarget: boolean\n declare readonly capsLockWarningTarget: HTMLElement\n declare readonly hasMatchErrorTarget: boolean\n declare readonly matchErrorTarget: HTMLElement\n declare matchValue: string\n declare autoformatValue: string\n\n private updateClearButton: (() => void) | null = null\n private updateCounter: (() => void) | null = null\n private updateCapsLock: ((e: KeyboardEvent | MouseEvent) => void) | null = null\n private hideCapsLock: (() => void) | null = null\n private matchListener: (() => void) | null = null\n private matchInvalidListener: ((e: Event) => void) | null = null\n private matchSourceListener: (() => void) | null = null\n private matchSourceElement: HTMLInputElement | null = null\n private autoformatListener: (() => void) | null = null\n\n connect () {\n this.applyColor()\n this.applySearchClear()\n this.applyCounter()\n this.applyPassword()\n this.applyMatch()\n this.applyAutoformat()\n }\n\n disconnect () {\n if (this.updateClearButton) {\n this.inputTarget.removeEventListener('input', this.updateClearButton)\n this.updateClearButton = null\n }\n if (this.updateCounter) {\n this.inputTarget.removeEventListener('input', this.updateCounter)\n this.updateCounter = null\n }\n if (this.updateCapsLock) {\n this.inputTarget.removeEventListener('keydown', this.updateCapsLock)\n this.inputTarget.removeEventListener('keyup', this.updateCapsLock)\n this.inputTarget.removeEventListener('mousedown', this.updateCapsLock)\n this.updateCapsLock = null\n }\n if (this.hideCapsLock) {\n this.inputTarget.removeEventListener('blur', this.hideCapsLock)\n this.hideCapsLock = null\n }\n if (this.matchListener) {\n this.inputTarget.removeEventListener('input', this.matchListener)\n this.inputTarget.removeEventListener('blur', this.matchListener)\n this.matchListener = null\n }\n if (this.matchInvalidListener) {\n this.inputTarget.removeEventListener('invalid', this.matchInvalidListener)\n this.matchInvalidListener = null\n }\n if (this.matchSourceListener && this.matchSourceElement) {\n this.matchSourceElement.removeEventListener('input', this.matchSourceListener)\n this.matchSourceListener = null\n this.matchSourceElement = null\n }\n if (this.autoformatListener) {\n this.inputTarget.removeEventListener('blur', this.autoformatListener)\n this.autoformatListener = null\n }\n }\n\n increment () {\n const input = this.inputTarget\n const step = parseFloat(input.step) || 1\n const max = input.max !== '' ? parseFloat(input.max) : Infinity\n const newValue = (parseFloat(input.value) || 0) + step\n if (newValue <= max) {\n input.value = String(newValue)\n input.dispatchEvent(new Event('input', { bubbles: true }))\n input.dispatchEvent(new Event('change', { bubbles: true }))\n }\n }\n\n decrement () {\n const input = this.inputTarget\n const step = parseFloat(input.step) || 1\n const min = input.min !== '' ? parseFloat(input.min) : -Infinity\n const newValue = (parseFloat(input.value) || 0) - step\n if (newValue >= min) {\n input.value = String(newValue)\n input.dispatchEvent(new Event('input', { bubbles: true }))\n input.dispatchEvent(new Event('change', { bubbles: true }))\n }\n }\n\n applyColor () {\n if (this.inputTarget.type !== 'color') {\n return\n }\n\n this.inputTarget.addEventListener('input', () => {\n this.inputTarget.setAttribute('value', this.inputTarget.value)\n })\n }\n\n private applyCounter () {\n if (!this.hasCounterTarget) return\n\n this.counterTarget.textContent = String(this.inputTarget.value.length)\n\n this.updateCounter = () => {\n this.counterTarget.textContent = String(this.inputTarget.value.length)\n }\n\n this.inputTarget.addEventListener('input', this.updateCounter)\n }\n\n private applyPassword () {\n if (!this.hasCapsLockWarningTarget) return\n\n this.updateCapsLock = (e: KeyboardEvent | MouseEvent) => {\n this.capsLockWarningTarget.hidden = !e.getModifierState('CapsLock')\n }\n\n this.hideCapsLock = () => {\n this.capsLockWarningTarget.hidden = true\n }\n\n this.inputTarget.addEventListener('keydown', this.updateCapsLock)\n this.inputTarget.addEventListener('keyup', this.updateCapsLock)\n this.inputTarget.addEventListener('mousedown', this.updateCapsLock)\n this.inputTarget.addEventListener('blur', this.hideCapsLock)\n }\n\n private applySearchClear () {\n if (this.inputTarget.type !== 'search') return\n // Browsers that natively render a cancel button (Chrome, Safari, Edge)\n // already handle clearing. Only inject for browsers that don't (Firefox).\n if (CSS.supports('selector(::-webkit-search-cancel-button)')) return\n\n const button = document.createElement('button')\n button.type = 'button'\n button.setAttribute('aria-label', 'Clear search')\n button.classList.add('midwest-input-search-clear')\n button.hidden = this.inputTarget.value.length === 0\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 24 24')\n svg.setAttribute('fill', 'none')\n svg.setAttribute('stroke', 'currentColor')\n svg.setAttribute('stroke-width', '2')\n svg.setAttribute('aria-hidden', 'true')\n svg.setAttribute('width', '16')\n svg.setAttribute('height', '16')\n\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n path.setAttribute('stroke-linecap', 'round')\n path.setAttribute('stroke-linejoin', 'round')\n path.setAttribute('d', 'M6 18L18 6M6 6l12 12')\n svg.appendChild(path)\n button.appendChild(svg)\n\n const wrapper = document.createElement('div')\n wrapper.classList.add('midwest-input-search-wrapper')\n this.inputTarget.parentElement?.insertBefore(wrapper, this.inputTarget)\n wrapper.appendChild(this.inputTarget)\n wrapper.appendChild(button)\n\n this.updateClearButton = () => {\n button.hidden = this.inputTarget.value.length === 0\n }\n\n this.inputTarget.addEventListener('input', this.updateClearButton)\n\n button.addEventListener('click', () => {\n this.inputTarget.value = ''\n button.hidden = true\n this.inputTarget.dispatchEvent(new Event('input', { bubbles: true }))\n this.inputTarget.focus()\n })\n }\n\n // Validates that this field's value matches the value of the element\n // identified by matchValue (a CSS selector). Uses setCustomValidity to\n // block form submission. Shows the error inline via the matchError target\n // rather than the browser's native tooltip (invalid event is suppressed).\n private applyMatch () {\n if (!this.matchValue) return\n\n const showError = () => {\n this.element.classList.add('has-error', 'theme-red')\n if (this.hasMatchErrorTarget) this.matchErrorTarget.hidden = false\n }\n\n const clearError = () => {\n this.element.classList.remove('has-error', 'theme-red')\n if (this.hasMatchErrorTarget) this.matchErrorTarget.hidden = true\n }\n\n const validate = () => {\n const other = document.querySelector<HTMLInputElement>(this.matchValue)\n if (!this.inputTarget.value) {\n this.inputTarget.setCustomValidity('')\n clearError()\n return\n }\n if (!other || this.inputTarget.value === other.value) {\n this.inputTarget.setCustomValidity('')\n clearError()\n } else {\n this.inputTarget.setCustomValidity('Values do not match')\n showError()\n }\n }\n\n this.matchListener = validate\n this.inputTarget.addEventListener('input', validate)\n this.inputTarget.addEventListener('blur', validate)\n\n // Suppress the browser's native validation tooltip on form submission;\n // our inline error element already shows the message.\n this.matchInvalidListener = (e: Event) => {\n e.preventDefault()\n showError()\n }\n this.inputTarget.addEventListener('invalid', this.matchInvalidListener)\n\n // Re-validate when the source field changes so the confirmation stays\n // in sync even if the user goes back and edits the original value.\n const other = document.querySelector<HTMLInputElement>(this.matchValue)\n if (other) {\n this.matchSourceElement = other\n this.matchSourceListener = validate\n other.addEventListener('input', validate)\n }\n }\n\n // Reformats the input value on blur using a named formatter from FORMATTERS.\n // Dispatches input + change events after reformatting so downstream\n // listeners (counters, form state) stay in sync.\n private applyAutoformat () {\n if (!this.autoformatValue) return\n const fmt = FORMATTERS[this.autoformatValue]\n if (!fmt) return\n\n this.autoformatListener = () => {\n const formatted = fmt(this.inputTarget.value)\n if (formatted !== this.inputTarget.value) {\n this.inputTarget.value = formatted\n this.inputTarget.dispatchEvent(new Event('input', { bubbles: true }))\n this.inputTarget.dispatchEvent(new Event('change', { bubbles: true }))\n }\n }\n\n this.inputTarget.addEventListener('blur', this.autoformatListener)\n }\n}\n"],"names":["other"],"mappings":"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"}