@unabridged/midwest 0.24.0 → 0.24.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.
Files changed (26) hide show
  1. package/app/assets/javascript/midwest/index.ts +2 -0
  2. package/app/assets/javascript/midwest/viewport_observer.ts +49 -0
  3. package/app/assets/javascript/midwest.js +84 -64
  4. package/app/assets/javascript/midwest.js.map +1 -1
  5. package/app/assets/stylesheets/midwest.css +1 -1
  6. package/app/assets/stylesheets/midwest.tailwind.css +2 -1
  7. package/dist/css/midwest.css +1 -1
  8. package/dist/javascript/collection/app/assets/javascript/midwest/index.js +2 -0
  9. package/dist/javascript/collection/app/assets/javascript/midwest/index.js.map +1 -1
  10. package/dist/javascript/collection/app/assets/javascript/midwest/viewport_observer.js +22 -0
  11. package/dist/javascript/collection/app/assets/javascript/midwest/viewport_observer.js.map +1 -0
  12. package/dist/javascript/collection/app/components/midwest/carousel_component/carousel_component_controller.js +4 -7
  13. package/dist/javascript/collection/app/components/midwest/carousel_component/carousel_component_controller.js.map +1 -1
  14. package/dist/javascript/collection/app/components/midwest/dropdown_component/dropdown_component_controller.js +0 -6
  15. package/dist/javascript/collection/app/components/midwest/dropdown_component/dropdown_component_controller.js.map +1 -1
  16. package/dist/javascript/collection/app/components/midwest/intersection_observer_component/intersection_observer_component_controller.js +20 -25
  17. package/dist/javascript/collection/app/components/midwest/intersection_observer_component/intersection_observer_component_controller.js.map +1 -1
  18. package/dist/javascript/collection/app/components/midwest/motion_component/motion_component_controller.js +32 -0
  19. package/dist/javascript/collection/app/components/midwest/motion_component/motion_component_controller.js.map +1 -0
  20. package/dist/javascript/collection/app/components/midwest/notification_component/notification_component_controller.js +4 -12
  21. package/dist/javascript/collection/app/components/midwest/notification_component/notification_component_controller.js.map +1 -1
  22. package/dist/javascript/collection/app/components/midwest/table_component/load_more_controller.js +10 -14
  23. package/dist/javascript/collection/app/components/midwest/table_component/load_more_controller.js.map +1 -1
  24. package/dist/javascript/midwest.js +84 -64
  25. package/dist/javascript/midwest.js.map +1 -1
  26. package/package.json +1 -1
@@ -38,6 +38,7 @@ import Onboarding from '../../../components/midwest/onboarding_component/onboard
38
38
  import ThemeSwitch from '../../../components/midwest/form/switch_component/theme_switch_controller.js';
39
39
  import Panorama from '../../../components/midwest/panorama_component/panorama_component_controller.js';
40
40
  import Playlist from '../../../components/midwest/playlist_component/playlist_component_controller.js';
41
+ import Motion from '../../../components/midwest/motion_component/motion_component_controller.js';
41
42
 
42
43
  function registerMidwestControllers(application) {
43
44
  application.register("midwest-card", Card);
@@ -80,6 +81,7 @@ function registerMidwestControllers(application) {
80
81
  application.register("midwest-theme-switch", ThemeSwitch);
81
82
  application.register("midwest-panorama", Panorama);
82
83
  application.register("midwest-playlist", Playlist);
84
+ application.register("midwest-motion", Motion);
83
85
  }
84
86
 
85
87
  export { Banner, Card, Chart, CountdownTimer, registerMidwestControllers };
@@ -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 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'\nimport Pagination from '../../../components/midwest/pagination_component/pagination_component_controller'\nimport ShowIf from '../../../components/midwest/show_if_component/show_if_component_controller'\nimport TreeView from '../../../components/midwest/tree_view_component/tree_view_component_controller'\nimport CommandPalette from '../../../components/midwest/command_palette_component/command_palette_component_controller'\nimport Repeatable from '../../../components/midwest/form/repeatable_component/repeatable_component_controller'\nimport PasswordRequirements from '../../../components/midwest/password_requirements_component/password_requirements_component_controller'\nimport CodeBlock from '../../../components/midwest/code_block_component/code_block_component_controller'\nimport DatePicker from '../../../components/midwest/form/date_picker_component/date_picker_component_controller'\nimport TimePicker from '../../../components/midwest/form/time_picker_component/time_picker_component_controller'\nimport IntersectionObserver from '../../../components/midwest/intersection_observer_component/intersection_observer_component_controller'\nimport FocusTrap from '../../../components/midwest/focus_trap_component/focus_trap_component_controller'\nimport Onboarding from '../../../components/midwest/onboarding_component/onboarding_component_controller'\nimport ThemeSwitch from '../../../components/midwest/form/switch_component/theme_switch_controller'\nimport Panorama from '../../../components/midwest/panorama_component/panorama_component_controller'\nimport Playlist from '../../../components/midwest/playlist_component/playlist_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-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 application.register('midwest-pagination', Pagination)\n application.register('midwest-show-if', ShowIf)\n application.register('midwest-tree-view', TreeView)\n application.register('midwest-command-palette', CommandPalette)\n application.register('midwest-repeatable', Repeatable)\n application.register('midwest-password-requirements', PasswordRequirements)\n application.register('midwest-code-block', CodeBlock)\n application.register('midwest-date-picker', DatePicker)\n application.register('midwest-time-picker', TimePicker)\n application.register('midwest-intersection-observer', IntersectionObserver)\n application.register('midwest-focus-trap', FocusTrap)\n application.register('midwest-onboarding', Onboarding)\n application.register('midwest-theme-switch', ThemeSwitch)\n application.register('midwest-panorama', Panorama)\n application.register('midwest-playlist', Playlist)\n /* EXPORTS */\n}\n"],"names":["Confirmation","IntersectionObserver"],"mappings":"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"}
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 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'\nimport Pagination from '../../../components/midwest/pagination_component/pagination_component_controller'\nimport ShowIf from '../../../components/midwest/show_if_component/show_if_component_controller'\nimport TreeView from '../../../components/midwest/tree_view_component/tree_view_component_controller'\nimport CommandPalette from '../../../components/midwest/command_palette_component/command_palette_component_controller'\nimport Repeatable from '../../../components/midwest/form/repeatable_component/repeatable_component_controller'\nimport PasswordRequirements from '../../../components/midwest/password_requirements_component/password_requirements_component_controller'\nimport CodeBlock from '../../../components/midwest/code_block_component/code_block_component_controller'\nimport DatePicker from '../../../components/midwest/form/date_picker_component/date_picker_component_controller'\nimport TimePicker from '../../../components/midwest/form/time_picker_component/time_picker_component_controller'\nimport IntersectionObserver from '../../../components/midwest/intersection_observer_component/intersection_observer_component_controller'\nimport FocusTrap from '../../../components/midwest/focus_trap_component/focus_trap_component_controller'\nimport Onboarding from '../../../components/midwest/onboarding_component/onboarding_component_controller'\nimport ThemeSwitch from '../../../components/midwest/form/switch_component/theme_switch_controller'\nimport Panorama from '../../../components/midwest/panorama_component/panorama_component_controller'\nimport Playlist from '../../../components/midwest/playlist_component/playlist_component_controller'\nimport Motion from '../../../components/midwest/motion_component/motion_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-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 application.register('midwest-pagination', Pagination)\n application.register('midwest-show-if', ShowIf)\n application.register('midwest-tree-view', TreeView)\n application.register('midwest-command-palette', CommandPalette)\n application.register('midwest-repeatable', Repeatable)\n application.register('midwest-password-requirements', PasswordRequirements)\n application.register('midwest-code-block', CodeBlock)\n application.register('midwest-date-picker', DatePicker)\n application.register('midwest-time-picker', TimePicker)\n application.register('midwest-intersection-observer', IntersectionObserver)\n application.register('midwest-focus-trap', FocusTrap)\n application.register('midwest-onboarding', Onboarding)\n application.register('midwest-theme-switch', ThemeSwitch)\n application.register('midwest-panorama', Panorama)\n application.register('midwest-playlist', Playlist)\n application.register('midwest-motion', Motion)\n /* EXPORTS */\n}\n"],"names":["Confirmation","IntersectionObserver"],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ function observeViewport(element, options = {}) {
2
+ const { threshold = 0, rootMargin = "0px", once = false, onEnter, onLeave } = options;
3
+ const observer = new IntersectionObserver(
4
+ (entries) => {
5
+ for (const entry of entries) {
6
+ if (entry.isIntersecting) {
7
+ onEnter?.(entry);
8
+ if (once)
9
+ observer.disconnect();
10
+ } else {
11
+ onLeave?.(entry);
12
+ }
13
+ }
14
+ },
15
+ { threshold, rootMargin }
16
+ );
17
+ observer.observe(element);
18
+ return () => observer.disconnect();
19
+ }
20
+
21
+ export { observeViewport };
22
+ //# sourceMappingURL=viewport_observer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewport_observer.js","sources":["../../../../../../../app/assets/javascript/midwest/viewport_observer.ts"],"sourcesContent":["// Shared viewport-detection helper for components that react to scrolling into\n// and out of view (IntersectionObserverComponent, MotionComponent, …).\n//\n// Wraps the IntersectionObserver API so controllers only describe *what* to do\n// on enter/leave, not the observer plumbing. Components own the reaction (toggle\n// a class, dispatch an event, reveal an animation); this module owns creating,\n// observing, and tearing down the observer so the behavior stays consistent.\n\nexport interface ViewportObserverOptions {\n // Fraction(s) of the element that must be visible to count as intersecting.\n threshold?: number | number[]\n // Margin around the viewport root (CSS shorthand string).\n rootMargin?: string\n // Stop observing after the first time the element enters the viewport.\n once?: boolean\n // Called each time the element enters the viewport.\n onEnter?: (entry: IntersectionObserverEntry) => void\n // Called each time the element leaves the viewport. Never called after the\n // first enter when `once` is true (the observer has disconnected by then).\n onLeave?: (entry: IntersectionObserverEntry) => void\n}\n\n// Observe `element` crossing the viewport threshold, invoking the callbacks as\n// it enters and leaves. Returns a teardown function that disconnects the\n// observer; callers should invoke it from their controller's `disconnect()`.\nexport function observeViewport (\n element: Element,\n options: ViewportObserverOptions = {}\n): () => void {\n const { threshold = 0, rootMargin = '0px', once = false, onEnter, onLeave } = options\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n onEnter?.(entry)\n if (once) observer.disconnect()\n } else {\n onLeave?.(entry)\n }\n }\n },\n { threshold, rootMargin }\n )\n\n observer.observe(element)\n\n return () => observer.disconnect()\n}\n"],"names":[],"mappings":"AAyBO,SAAS,eACd,CAAA,OAAA,EACA,OAAmC,GAAA,EACvB,EAAA;AACZ,EAAM,MAAA,EAAE,YAAY,CAAG,EAAA,UAAA,GAAa,OAAO,IAAO,GAAA,KAAA,EAAO,OAAS,EAAA,OAAA,EAAY,GAAA,OAAA,CAAA;AAE9E,EAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,IACnB,CAAC,OAAY,KAAA;AACX,MAAA,KAAA,MAAW,SAAS,OAAS,EAAA;AAC3B,QAAA,IAAI,MAAM,cAAgB,EAAA;AACxB,UAAA,OAAA,GAAU,KAAK,CAAA,CAAA;AACf,UAAI,IAAA,IAAA;AAAM,YAAA,QAAA,CAAS,UAAW,EAAA,CAAA;AAAA,SACzB,MAAA;AACL,UAAA,OAAA,GAAU,KAAK,CAAA,CAAA;AAAA,SACjB;AAAA,OACF;AAAA,KACF;AAAA,IACA,EAAE,WAAW,UAAW,EAAA;AAAA,GAC1B,CAAA;AAEA,EAAA,QAAA,CAAS,QAAQ,OAAO,CAAA,CAAA;AAExB,EAAO,OAAA,MAAM,SAAS,UAAW,EAAA,CAAA;AACnC;;;;"}
@@ -71,7 +71,7 @@ class Carousel extends Controller {
71
71
  }
72
72
  const atEnd = this._currentIndex >= this.slides.length - 1;
73
73
  if (this.loopValue && atEnd) {
74
- this.slides[0]?.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "nearest" });
74
+ this.trackTarget.scrollTo({ left: 0, behavior: "smooth" });
75
75
  } else {
76
76
  this.trackTarget.scrollBy({ left: this.trackTarget.clientWidth, behavior: "smooth" });
77
77
  }
@@ -85,8 +85,7 @@ class Carousel extends Controller {
85
85
  }
86
86
  const atStart = this._currentIndex <= 0;
87
87
  if (this.loopValue && atStart) {
88
- const last = this.slides[this.slides.length - 1];
89
- last?.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "nearest" });
88
+ this.trackTarget.scrollTo({ left: (this.slides.length - 1) * this.trackTarget.clientWidth, behavior: "smooth" });
90
89
  } else {
91
90
  this.trackTarget.scrollBy({ left: -this.trackTarget.clientWidth, behavior: "smooth" });
92
91
  }
@@ -98,8 +97,7 @@ class Carousel extends Controller {
98
97
  this.activateSlide(index);
99
98
  return;
100
99
  }
101
- const slide = this.slides[index];
102
- slide?.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "nearest" });
100
+ this.trackTarget.scrollTo({ left: index * this.trackTarget.clientWidth, behavior: "smooth" });
103
101
  }
104
102
  // Unlocks the next slide and advances to it. Intended for wizard mode: wire
105
103
  // a "Continue" button inside a slide to this action so users progress
@@ -203,8 +201,7 @@ class Carousel extends Controller {
203
201
  }
204
202
  const atEnd = this._currentIndex >= this.slides.length - 1;
205
203
  if (atEnd) {
206
- const firstSlide = this.slides[0];
207
- firstSlide?.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "nearest" });
204
+ this.trackTarget.scrollTo({ left: 0, behavior: "smooth" });
208
205
  } else {
209
206
  this.next();
210
207
  }
@@ -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', '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
+ {"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.trackTarget.scrollTo({ left: 0, behavior: 'smooth' })\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 this.trackTarget.scrollTo({ left: (this.slides.length - 1) * this.trackTarget.clientWidth, behavior: 'smooth' })\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 this.trackTarget.scrollTo({ left: index * this.trackTarget.clientWidth, behavior: 'smooth' })\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 this.trackTarget.scrollTo({ left: 0, behavior: 'smooth' })\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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"}
@@ -8,7 +8,6 @@ class Dropdown extends Controller {
8
8
  supported: { type: Boolean, default: true },
9
9
  align: { type: String, default: "right" }
10
10
  };
11
- observer = new IntersectionObserver(this.computedCB.bind(this), { threshold: 1 });
12
11
  cleanup;
13
12
  connect() {
14
13
  this.supportedValue = CSS.supports("anchor-name: --myanchor");
@@ -74,11 +73,6 @@ class Dropdown extends Controller {
74
73
  (item) => item.closest('[data-controller~="midwest-dropdown"]') === this.element && getComputedStyle(item).display !== "none"
75
74
  );
76
75
  }
77
- computedCB(entries) {
78
- entries.forEach(async () => {
79
- this.computation();
80
- });
81
- }
82
76
  closeIfOpen = () => {
83
77
  this.element.hidePopover();
84
78
  };
@@ -1 +1 @@
1
- {"version":3,"file":"dropdown_component_controller.js","sources":["../../../../../../../app/components/midwest/dropdown_component/dropdown_component_controller.ts"],"sourcesContent":["\nimport { Controller } from '@hotwired/stimulus'\n\nimport {\n computePosition,\n autoPlacement,\n shift,\n offset,\n autoUpdate,\n hide,\n Placement\n} from '@floating-ui/dom'\n\nimport { handleRovingFocusKeydown } from '../../../assets/javascript/midwest/keyboard_navigation'\n\nexport default class Dropdown extends Controller<HTMLFormElement> {\n static values = {\n computed: { type: Boolean, default: false },\n supported: { type: Boolean, default: true },\n align: { type: String, default: 'right' }\n }\n\n declare computedValue: boolean\n declare supportedValue: boolean\n declare alignValue: Placement\n declare readonly hasComputedValue: boolean\n declare readonly hasSupportedValue: boolean\n declare readonly hasAlignValue: boolean\n\n observer = new IntersectionObserver(this.computedCB.bind(this), { threshold: 1 })\n\n cleanup: any\n\n connect () {\n this.supportedValue = CSS.supports('anchor-name: --myanchor')\n\n if (this.isComputed) {\n this.buttonEl.addEventListener('click', this.unsupportedClickCB)\n this.cleanup = autoUpdate(this.buttonEl, this.element, async () => await this.computation())\n }\n\n this.element.addEventListener('toggle', this.addOpenedClass)\n this.element.addEventListener('turbo:click', this.closeIfOpen)\n this.element.addEventListener('popover:close', this.closeIfOpen)\n }\n\n disconnect () {\n if (this.isComputed) {\n this.cleanup()\n }\n\n this.buttonEl.removeEventListener('click', this.unsupportedClickCB)\n this.element.removeEventListener('toggle', this.addOpenedClass)\n this.element.removeEventListener('keydown', this.handleKeydown)\n this.element.removeEventListener('turbo:click', this.closeIfOpen)\n this.element.removeEventListener('popover:close', this.closeIfOpen)\n }\n\n unsupportedClickCB = (event: MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n this.element.togglePopover()\n }\n\n get buttonEl () {\n return this.element.parentElement?.querySelector(\n `[popovertarget=\"${this.element.id}\"]:not([popovertargetaction=\"hide\"])`\n ) as HTMLButtonElement\n }\n\n get isComputed () {\n return this.computedValue || !this.supportedValue\n }\n\n addOpenedClass = (event: any) => {\n const isOpen = event.newState === 'open'\n this.buttonEl.classList.toggle('opened', isOpen)\n this.buttonEl.setAttribute('aria-expanded', String(isOpen))\n\n if (isOpen) {\n this.element.addEventListener('keydown', this.handleKeydown)\n requestAnimationFrame(() => this.menuItems[0]?.focus())\n } else {\n this.element.removeEventListener('keydown', this.handleKeydown)\n }\n }\n\n private handleKeydown = (event: KeyboardEvent) => {\n const handled = handleRovingFocusKeydown(event, this.menuItems, {\n onEscape: () => {\n this.element.hidePopover()\n requestAnimationFrame(() => this.buttonEl?.focus())\n },\n onTab: () => this.element.hidePopover()\n })\n\n if (handled) event.stopPropagation()\n }\n\n private get menuItems (): HTMLElement[] {\n return Array.from(\n this.element.querySelectorAll<HTMLElement>(\n '[role=\"menuitem\"]:not([disabled]):not([aria-disabled=\"true\"])'\n )\n ).filter(item =>\n item.closest('[data-controller~=\"midwest-dropdown\"]') === this.element &&\n getComputedStyle(item).display !== 'none'\n )\n }\n\n computedCB (entries: IntersectionObserverEntry[]) {\n entries.forEach(async () => {\n this.computation()\n })\n }\n\n closeIfOpen = () => {\n this.element.hidePopover()\n }\n\n async computation () {\n if (!this.buttonEl) return\n if (!this.isComputed) return\n\n const { x, y, middlewareData } = await computePosition(this.buttonEl, this.element, {\n strategy: 'fixed',\n placement: this.alignValue,\n middleware: [\n hide(),\n offset(6),\n autoPlacement({\n allowedPlacements: [\n 'left-start',\n 'left-end',\n 'right-start',\n 'right-end',\n 'bottom-end',\n 'bottom-start'\n ],\n crossAxis: true\n }),\n shift({ padding: 24 })\n ]\n })\n\n if (!middlewareData || (middlewareData.hide == null)) return\n\n Object.assign(this.element.style, {\n left: `${x}px`,\n top: `${y}px`,\n visibility: middlewareData.hide.referenceHidden ? 'hidden' : 'visible'\n })\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dropdown_component_controller.js","sources":["../../../../../../../app/components/midwest/dropdown_component/dropdown_component_controller.ts"],"sourcesContent":["\nimport { Controller } from '@hotwired/stimulus'\n\nimport {\n computePosition,\n autoPlacement,\n shift,\n offset,\n autoUpdate,\n hide,\n Placement\n} from '@floating-ui/dom'\n\nimport { handleRovingFocusKeydown } from '../../../assets/javascript/midwest/keyboard_navigation'\n\nexport default class Dropdown extends Controller<HTMLFormElement> {\n static values = {\n computed: { type: Boolean, default: false },\n supported: { type: Boolean, default: true },\n align: { type: String, default: 'right' }\n }\n\n declare computedValue: boolean\n declare supportedValue: boolean\n declare alignValue: Placement\n declare readonly hasComputedValue: boolean\n declare readonly hasSupportedValue: boolean\n declare readonly hasAlignValue: boolean\n\n cleanup: any\n\n connect () {\n this.supportedValue = CSS.supports('anchor-name: --myanchor')\n\n if (this.isComputed) {\n this.buttonEl.addEventListener('click', this.unsupportedClickCB)\n this.cleanup = autoUpdate(this.buttonEl, this.element, async () => await this.computation())\n }\n\n this.element.addEventListener('toggle', this.addOpenedClass)\n this.element.addEventListener('turbo:click', this.closeIfOpen)\n this.element.addEventListener('popover:close', this.closeIfOpen)\n }\n\n disconnect () {\n if (this.isComputed) {\n this.cleanup()\n }\n\n this.buttonEl.removeEventListener('click', this.unsupportedClickCB)\n this.element.removeEventListener('toggle', this.addOpenedClass)\n this.element.removeEventListener('keydown', this.handleKeydown)\n this.element.removeEventListener('turbo:click', this.closeIfOpen)\n this.element.removeEventListener('popover:close', this.closeIfOpen)\n }\n\n unsupportedClickCB = (event: MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n this.element.togglePopover()\n }\n\n get buttonEl () {\n return this.element.parentElement?.querySelector(\n `[popovertarget=\"${this.element.id}\"]:not([popovertargetaction=\"hide\"])`\n ) as HTMLButtonElement\n }\n\n get isComputed () {\n return this.computedValue || !this.supportedValue\n }\n\n addOpenedClass = (event: any) => {\n const isOpen = event.newState === 'open'\n this.buttonEl.classList.toggle('opened', isOpen)\n this.buttonEl.setAttribute('aria-expanded', String(isOpen))\n\n if (isOpen) {\n this.element.addEventListener('keydown', this.handleKeydown)\n requestAnimationFrame(() => this.menuItems[0]?.focus())\n } else {\n this.element.removeEventListener('keydown', this.handleKeydown)\n }\n }\n\n private handleKeydown = (event: KeyboardEvent) => {\n const handled = handleRovingFocusKeydown(event, this.menuItems, {\n onEscape: () => {\n this.element.hidePopover()\n requestAnimationFrame(() => this.buttonEl?.focus())\n },\n onTab: () => this.element.hidePopover()\n })\n\n if (handled) event.stopPropagation()\n }\n\n private get menuItems (): HTMLElement[] {\n return Array.from(\n this.element.querySelectorAll<HTMLElement>(\n '[role=\"menuitem\"]:not([disabled]):not([aria-disabled=\"true\"])'\n )\n ).filter(item =>\n item.closest('[data-controller~=\"midwest-dropdown\"]') === this.element &&\n getComputedStyle(item).display !== 'none'\n )\n }\n\n closeIfOpen = () => {\n this.element.hidePopover()\n }\n\n async computation () {\n if (!this.buttonEl) return\n if (!this.isComputed) return\n\n const { x, y, middlewareData } = await computePosition(this.buttonEl, this.element, {\n strategy: 'fixed',\n placement: this.alignValue,\n middleware: [\n hide(),\n offset(6),\n autoPlacement({\n allowedPlacements: [\n 'left-start',\n 'left-end',\n 'right-start',\n 'right-end',\n 'bottom-end',\n 'bottom-start'\n ],\n crossAxis: true\n }),\n shift({ padding: 24 })\n ]\n })\n\n if (!middlewareData || (middlewareData.hide == null)) return\n\n Object.assign(this.element.style, {\n left: `${x}px`,\n top: `${y}px`,\n visibility: middlewareData.hide.referenceHidden ? 'hidden' : 'visible'\n })\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
+ import { observeViewport } from '../../../assets/javascript/midwest/viewport_observer.js';
2
3
 
3
4
  class ViewportObserver extends Controller {
4
5
  static values = {
@@ -7,35 +8,29 @@ class ViewportObserver extends Controller {
7
8
  once: { type: Boolean, default: false },
8
9
  visibleClass: { type: String, default: "" }
9
10
  };
10
- observer = null;
11
+ teardown = null;
11
12
  connect() {
12
- this.observer = new IntersectionObserver(
13
- (entries) => {
14
- for (const entry of entries)
15
- this.handle(entry);
13
+ this.teardown = observeViewport(this.element, {
14
+ threshold: this.thresholdValue,
15
+ rootMargin: this.rootMarginValue,
16
+ once: this.onceValue,
17
+ onEnter: (entry) => {
18
+ this.element.setAttribute("data-intersecting", "true");
19
+ if (this.visibleClassValue)
20
+ this.element.classList.add(this.visibleClassValue);
21
+ this.dispatch("enter", { detail: { entry }, bubbles: true });
16
22
  },
17
- { threshold: this.thresholdValue, rootMargin: this.rootMarginValue }
18
- );
19
- this.observer.observe(this.element);
23
+ onLeave: (entry) => {
24
+ this.element.setAttribute("data-intersecting", "false");
25
+ if (this.visibleClassValue)
26
+ this.element.classList.remove(this.visibleClassValue);
27
+ this.dispatch("leave", { detail: { entry }, bubbles: true });
28
+ }
29
+ });
20
30
  }
21
31
  disconnect() {
22
- this.observer?.disconnect();
23
- this.observer = null;
24
- }
25
- handle(entry) {
26
- if (entry.isIntersecting) {
27
- this.element.setAttribute("data-intersecting", "true");
28
- if (this.visibleClassValue)
29
- this.element.classList.add(this.visibleClassValue);
30
- this.dispatch("enter", { detail: { entry }, bubbles: true });
31
- if (this.onceValue)
32
- this.disconnect();
33
- } else {
34
- this.element.setAttribute("data-intersecting", "false");
35
- if (this.visibleClassValue)
36
- this.element.classList.remove(this.visibleClassValue);
37
- this.dispatch("leave", { detail: { entry }, bubbles: true });
38
- }
32
+ this.teardown?.();
33
+ this.teardown = null;
39
34
  }
40
35
  }
41
36
 
@@ -1 +1 @@
1
- {"version":3,"file":"intersection_observer_component_controller.js","sources":["../../../../../../../app/components/midwest/intersection_observer_component/intersection_observer_component_controller.ts"],"sourcesContent":["import { Controller } from '@hotwired/stimulus'\n\n// Declarative viewport detection. Wraps the IntersectionObserver API so markup\n// can react to entering/leaving the viewport with no bespoke JavaScript:\n// - reflects state via a `data-intersecting` attribute (a CSS styling hook)\n// - toggles an optional `visibleClass` while the element is intersecting\n// - dispatches `midwest-intersection-observer:enter` / `:leave` events\n//\n// Values\n// threshold — fraction of the element that must be visible to trigger (0–1)\n// rootMargin — margin around the viewport root (CSS shorthand string)\n// once — stop observing after the first time it enters the viewport\n// visibleClass — class name toggled on the element while intersecting\nexport default class ViewportObserver extends Controller<HTMLElement> {\n static values = {\n threshold: { type: Number, default: 0 },\n rootMargin: { type: String, default: '0px' },\n once: { type: Boolean, default: false },\n visibleClass: { type: String, default: '' }\n }\n\n declare thresholdValue: number\n declare rootMarginValue: string\n declare onceValue: boolean\n declare visibleClassValue: string\n\n private observer: IntersectionObserver | null = null\n\n connect () {\n this.observer = new IntersectionObserver(\n (entries) => { for (const entry of entries) this.handle(entry) },\n { threshold: this.thresholdValue, rootMargin: this.rootMarginValue }\n )\n this.observer.observe(this.element)\n }\n\n disconnect () {\n this.observer?.disconnect()\n this.observer = null\n }\n\n private handle (entry: IntersectionObserverEntry) {\n if (entry.isIntersecting) {\n this.element.setAttribute('data-intersecting', 'true')\n if (this.visibleClassValue) this.element.classList.add(this.visibleClassValue)\n this.dispatch('enter', { detail: { entry }, bubbles: true })\n\n if (this.onceValue) this.disconnect()\n } else {\n this.element.setAttribute('data-intersecting', 'false')\n if (this.visibleClassValue) this.element.classList.remove(this.visibleClassValue)\n this.dispatch('leave', { detail: { entry }, bubbles: true })\n }\n }\n}\n"],"names":[],"mappings":";;AAaA,MAAqB,yBAAyB,UAAwB,CAAA;AAAA,EACpE,OAAO,MAAS,GAAA;AAAA,IACd,SAAW,EAAA,EAAE,IAAM,EAAA,MAAA,EAAQ,SAAS,CAAE,EAAA;AAAA,IACtC,UAAY,EAAA,EAAE,IAAM,EAAA,MAAA,EAAQ,SAAS,KAAM,EAAA;AAAA,IAC3C,IAAM,EAAA,EAAE,IAAM,EAAA,OAAA,EAAS,SAAS,KAAM,EAAA;AAAA,IACtC,YAAc,EAAA,EAAE,IAAM,EAAA,MAAA,EAAQ,SAAS,EAAG,EAAA;AAAA,GAC5C,CAAA;AAAA,EAOQ,QAAwC,GAAA,IAAA,CAAA;AAAA,EAEhD,OAAW,GAAA;AACT,IAAA,IAAA,CAAK,WAAW,IAAI,oBAAA;AAAA,MAClB,CAAC,OAAY,KAAA;AAAE,QAAA,KAAA,MAAW,KAAS,IAAA,OAAA;AAAS,UAAA,IAAA,CAAK,OAAO,KAAK,CAAA,CAAA;AAAA,OAAE;AAAA,MAC/D,EAAE,SAAW,EAAA,IAAA,CAAK,cAAgB,EAAA,UAAA,EAAY,KAAK,eAAgB,EAAA;AAAA,KACrE,CAAA;AACA,IAAK,IAAA,CAAA,QAAA,CAAS,OAAQ,CAAA,IAAA,CAAK,OAAO,CAAA,CAAA;AAAA,GACpC;AAAA,EAEA,UAAc,GAAA;AACZ,IAAA,IAAA,CAAK,UAAU,UAAW,EAAA,CAAA;AAC1B,IAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAAA,GAClB;AAAA,EAEQ,OAAQ,KAAkC,EAAA;AAChD,IAAA,IAAI,MAAM,cAAgB,EAAA;AACxB,MAAK,IAAA,CAAA,OAAA,CAAQ,YAAa,CAAA,mBAAA,EAAqB,MAAM,CAAA,CAAA;AACrD,MAAA,IAAI,IAAK,CAAA,iBAAA;AAAmB,QAAA,IAAA,CAAK,OAAQ,CAAA,SAAA,CAAU,GAAI,CAAA,IAAA,CAAK,iBAAiB,CAAA,CAAA;AAC7E,MAAK,IAAA,CAAA,QAAA,CAAS,SAAS,EAAE,MAAA,EAAQ,EAAE,KAAM,EAAA,EAAG,OAAS,EAAA,IAAA,EAAM,CAAA,CAAA;AAE3D,MAAA,IAAI,IAAK,CAAA,SAAA;AAAW,QAAA,IAAA,CAAK,UAAW,EAAA,CAAA;AAAA,KAC/B,MAAA;AACL,MAAK,IAAA,CAAA,OAAA,CAAQ,YAAa,CAAA,mBAAA,EAAqB,OAAO,CAAA,CAAA;AACtD,MAAA,IAAI,IAAK,CAAA,iBAAA;AAAmB,QAAA,IAAA,CAAK,OAAQ,CAAA,SAAA,CAAU,MAAO,CAAA,IAAA,CAAK,iBAAiB,CAAA,CAAA;AAChF,MAAK,IAAA,CAAA,QAAA,CAAS,SAAS,EAAE,MAAA,EAAQ,EAAE,KAAM,EAAA,EAAG,OAAS,EAAA,IAAA,EAAM,CAAA,CAAA;AAAA,KAC7D;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"intersection_observer_component_controller.js","sources":["../../../../../../../app/components/midwest/intersection_observer_component/intersection_observer_component_controller.ts"],"sourcesContent":["import { Controller } from '@hotwired/stimulus'\nimport { observeViewport } from '../../../assets/javascript/midwest/viewport_observer'\n\n// Declarative viewport detection. Wraps the shared viewport observer so markup\n// can react to entering/leaving the viewport with no bespoke JavaScript:\n// - reflects state via a `data-intersecting` attribute (a CSS styling hook)\n// - toggles an optional `visibleClass` while the element is intersecting\n// - dispatches `midwest-intersection-observer:enter` / `:leave` events\n//\n// Values\n// threshold — fraction of the element that must be visible to trigger (0–1)\n// rootMargin — margin around the viewport root (CSS shorthand string)\n// once — stop observing after the first time it enters the viewport\n// visibleClass — class name toggled on the element while intersecting\nexport default class ViewportObserver extends Controller<HTMLElement> {\n static values = {\n threshold: { type: Number, default: 0 },\n rootMargin: { type: String, default: '0px' },\n once: { type: Boolean, default: false },\n visibleClass: { type: String, default: '' }\n }\n\n declare thresholdValue: number\n declare rootMarginValue: string\n declare onceValue: boolean\n declare visibleClassValue: string\n\n private teardown: (() => void) | null = null\n\n connect () {\n this.teardown = observeViewport(this.element, {\n threshold: this.thresholdValue,\n rootMargin: this.rootMarginValue,\n once: this.onceValue,\n onEnter: (entry) => {\n this.element.setAttribute('data-intersecting', 'true')\n if (this.visibleClassValue) this.element.classList.add(this.visibleClassValue)\n this.dispatch('enter', { detail: { entry }, bubbles: true })\n },\n onLeave: (entry) => {\n this.element.setAttribute('data-intersecting', 'false')\n if (this.visibleClassValue) this.element.classList.remove(this.visibleClassValue)\n this.dispatch('leave', { detail: { entry }, bubbles: true })\n }\n })\n }\n\n disconnect () {\n this.teardown?.()\n this.teardown = null\n }\n}\n"],"names":[],"mappings":";;;AAcA,MAAqB,yBAAyB,UAAwB,CAAA;AAAA,EACpE,OAAO,MAAS,GAAA;AAAA,IACd,SAAW,EAAA,EAAE,IAAM,EAAA,MAAA,EAAQ,SAAS,CAAE,EAAA;AAAA,IACtC,UAAY,EAAA,EAAE,IAAM,EAAA,MAAA,EAAQ,SAAS,KAAM,EAAA;AAAA,IAC3C,IAAM,EAAA,EAAE,IAAM,EAAA,OAAA,EAAS,SAAS,KAAM,EAAA;AAAA,IACtC,YAAc,EAAA,EAAE,IAAM,EAAA,MAAA,EAAQ,SAAS,EAAG,EAAA;AAAA,GAC5C,CAAA;AAAA,EAOQ,QAAgC,GAAA,IAAA,CAAA;AAAA,EAExC,OAAW,GAAA;AACT,IAAK,IAAA,CAAA,QAAA,GAAW,eAAgB,CAAA,IAAA,CAAK,OAAS,EAAA;AAAA,MAC5C,WAAW,IAAK,CAAA,cAAA;AAAA,MAChB,YAAY,IAAK,CAAA,eAAA;AAAA,MACjB,MAAM,IAAK,CAAA,SAAA;AAAA,MACX,OAAA,EAAS,CAAC,KAAU,KAAA;AAClB,QAAK,IAAA,CAAA,OAAA,CAAQ,YAAa,CAAA,mBAAA,EAAqB,MAAM,CAAA,CAAA;AACrD,QAAA,IAAI,IAAK,CAAA,iBAAA;AAAmB,UAAA,IAAA,CAAK,OAAQ,CAAA,SAAA,CAAU,GAAI,CAAA,IAAA,CAAK,iBAAiB,CAAA,CAAA;AAC7E,QAAK,IAAA,CAAA,QAAA,CAAS,SAAS,EAAE,MAAA,EAAQ,EAAE,KAAM,EAAA,EAAG,OAAS,EAAA,IAAA,EAAM,CAAA,CAAA;AAAA,OAC7D;AAAA,MACA,OAAA,EAAS,CAAC,KAAU,KAAA;AAClB,QAAK,IAAA,CAAA,OAAA,CAAQ,YAAa,CAAA,mBAAA,EAAqB,OAAO,CAAA,CAAA;AACtD,QAAA,IAAI,IAAK,CAAA,iBAAA;AAAmB,UAAA,IAAA,CAAK,OAAQ,CAAA,SAAA,CAAU,MAAO,CAAA,IAAA,CAAK,iBAAiB,CAAA,CAAA;AAChF,QAAK,IAAA,CAAA,QAAA,CAAS,SAAS,EAAE,MAAA,EAAQ,EAAE,KAAM,EAAA,EAAG,OAAS,EAAA,IAAA,EAAM,CAAA,CAAA;AAAA,OAC7D;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,UAAc,GAAA;AACZ,IAAA,IAAA,CAAK,QAAW,IAAA,CAAA;AAChB,IAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAAA,GAClB;AACF;;;;"}
@@ -0,0 +1,32 @@
1
+ import { Controller } from '@hotwired/stimulus';
2
+ import { observeViewport } from '../../../assets/javascript/midwest/viewport_observer.js';
3
+
4
+ class Motion extends Controller {
5
+ static values = {
6
+ threshold: { type: Number, default: 0.15 },
7
+ once: { type: Boolean, default: true }
8
+ };
9
+ teardown = null;
10
+ connect() {
11
+ this.teardown = observeViewport(this.element, {
12
+ threshold: this.thresholdValue,
13
+ once: this.onceValue,
14
+ onEnter: () => this.reveal(),
15
+ onLeave: this.onceValue ? void 0 : () => this.reset()
16
+ });
17
+ }
18
+ disconnect() {
19
+ this.teardown?.();
20
+ this.teardown = null;
21
+ }
22
+ reveal() {
23
+ this.element.setAttribute("data-motion-visible", "");
24
+ this.dispatch("reveal", { bubbles: true });
25
+ }
26
+ reset() {
27
+ this.element.removeAttribute("data-motion-visible");
28
+ }
29
+ }
30
+
31
+ export { Motion as default };
32
+ //# sourceMappingURL=motion_component_controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion_component_controller.js","sources":["../../../../../../../app/components/midwest/motion_component/motion_component_controller.ts"],"sourcesContent":["import { Controller } from '@hotwired/stimulus'\nimport { observeViewport } from '../../../assets/javascript/midwest/viewport_observer'\n\n// Reveal motion primitives — the `trigger: :reveal` path. Reveals the element\n// when it scrolls into view by flipping a single `data-motion-visible` attribute\n// that CSS transitions animate against; no bespoke JavaScript in the host app.\n//\n// The `trigger: :load` path needs no controller at all — it animates in via a\n// pure-CSS `@starting-style` entry — so this controller is only attached to\n// `:reveal` elements.\n//\n// Values\n// threshold — fraction of the element that must be visible to reveal (0–1)\n// once — stop observing after the first reveal; when false, the element\n// resets as it leaves the viewport so the motion can replay\nexport default class Motion extends Controller<HTMLElement> {\n static values = {\n threshold: { type: Number, default: 0.15 },\n once: { type: Boolean, default: true }\n }\n\n declare thresholdValue: number\n declare onceValue: boolean\n\n private teardown: (() => void) | null = null\n\n connect () {\n this.teardown = observeViewport(this.element, {\n threshold: this.thresholdValue,\n once: this.onceValue,\n onEnter: () => this.reveal(),\n onLeave: this.onceValue ? undefined : () => this.reset()\n })\n }\n\n disconnect () {\n this.teardown?.()\n this.teardown = null\n }\n\n private reveal () {\n this.element.setAttribute('data-motion-visible', '')\n this.dispatch('reveal', { bubbles: true })\n }\n\n private reset () {\n this.element.removeAttribute('data-motion-visible')\n }\n}\n"],"names":[],"mappings":";;;AAeA,MAAqB,eAAe,UAAwB,CAAA;AAAA,EAC1D,OAAO,MAAS,GAAA;AAAA,IACd,SAAW,EAAA,EAAE,IAAM,EAAA,MAAA,EAAQ,SAAS,IAAK,EAAA;AAAA,IACzC,IAAM,EAAA,EAAE,IAAM,EAAA,OAAA,EAAS,SAAS,IAAK,EAAA;AAAA,GACvC,CAAA;AAAA,EAKQ,QAAgC,GAAA,IAAA,CAAA;AAAA,EAExC,OAAW,GAAA;AACT,IAAK,IAAA,CAAA,QAAA,GAAW,eAAgB,CAAA,IAAA,CAAK,OAAS,EAAA;AAAA,MAC5C,WAAW,IAAK,CAAA,cAAA;AAAA,MAChB,MAAM,IAAK,CAAA,SAAA;AAAA,MACX,OAAA,EAAS,MAAM,IAAA,CAAK,MAAO,EAAA;AAAA,MAC3B,SAAS,IAAK,CAAA,SAAA,GAAY,KAAY,CAAA,GAAA,MAAM,KAAK,KAAM,EAAA;AAAA,KACxD,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,UAAc,GAAA;AACZ,IAAA,IAAA,CAAK,QAAW,IAAA,CAAA;AAChB,IAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAAA,GAClB;AAAA,EAEQ,MAAU,GAAA;AAChB,IAAK,IAAA,CAAA,OAAA,CAAQ,YAAa,CAAA,qBAAA,EAAuB,EAAE,CAAA,CAAA;AACnD,IAAA,IAAA,CAAK,QAAS,CAAA,QAAA,EAAU,EAAE,OAAA,EAAS,MAAM,CAAA,CAAA;AAAA,GAC3C;AAAA,EAEQ,KAAS,GAAA;AACf,IAAK,IAAA,CAAA,OAAA,CAAQ,gBAAgB,qBAAqB,CAAA,CAAA;AAAA,GACpD;AACF;;;;"}
@@ -6,10 +6,7 @@ class Notification extends Controller {
6
6
  connect() {
7
7
  this.container = this.element.closest("[popover]");
8
8
  this.container?.showPopover?.();
9
- requestAnimationFrame(() => {
10
- this.element.classList.add("visible");
11
- });
12
- const frame = this.element.parentElement;
9
+ const frame = this.element.closest("turbo-frame");
13
10
  if (frame) {
14
11
  this.observer = new MutationObserver(() => this.syncCountdown());
15
12
  this.observer.observe(frame, { childList: true });
@@ -28,14 +25,8 @@ class Notification extends Controller {
28
25
  }
29
26
  }
30
27
  close() {
31
- if (!this.element.classList.contains("animated")) {
32
- this.element.remove();
33
- return;
34
- }
35
28
  this.element.classList.add("closing");
36
- setTimeout(() => {
37
- this.element.remove();
38
- }, 350);
29
+ setTimeout(() => (this.element.parentElement ?? this.element).remove(), 350);
39
30
  }
40
31
  syncCountdown() {
41
32
  const timerEl = this.element.querySelector('[data-controller~="midwest-countdown-timer"]');
@@ -47,7 +38,8 @@ class Notification extends Controller {
47
38
  );
48
39
  if (!timer)
49
40
  return;
50
- const isTop = this.element === this.element.parentElement?.firstElementChild;
41
+ const wrapper = this.element.parentElement ?? this.element;
42
+ const isTop = wrapper === wrapper.parentElement?.firstElementChild;
51
43
  if (isTop) {
52
44
  timer.resume();
53
45
  } else {
@@ -1 +1 @@
1
- {"version":3,"file":"notification_component_controller.js","sources":["../../../../../../../app/components/midwest/notification_component/notification_component_controller.ts"],"sourcesContent":["import { Controller } from '@hotwired/stimulus'\n\ntype PopoverElement = HTMLElement & { showPopover?(): void; hidePopover?(): void }\n\ninterface PausableTimer {\n pause(): void\n resume(): void\n}\n\nexport default class Notification extends Controller<HTMLElement> {\n private container: PopoverElement | null = null\n private observer: MutationObserver | null = null\n\n connect () {\n this.container = this.element.closest<PopoverElement>('[popover]')\n this.container?.showPopover?.()\n\n requestAnimationFrame(() => {\n this.element.classList.add('visible')\n })\n\n const frame = this.element.parentElement\n if (frame) {\n this.observer = new MutationObserver(() => this.syncCountdown())\n this.observer.observe(frame, { childList: true })\n // Defer until nested controllers (e.g. CountdownTimer) have connected\n setTimeout(() => this.syncCountdown())\n }\n }\n\n disconnect () {\n this.observer?.disconnect()\n this.observer = null\n\n if (this.container) {\n const frame = this.container.querySelector('turbo-frame')\n if (frame?.children.length === 0 && this.container.matches(':popover-open')) {\n this.container.hidePopover?.()\n }\n this.container = null\n }\n }\n\n close () {\n if (!this.element.classList.contains('animated')) {\n this.element.remove()\n return\n }\n\n this.element.classList.add('closing')\n setTimeout(() => {\n this.element.remove()\n }, 350)\n }\n\n private syncCountdown (): void {\n const timerEl = this.element.querySelector<HTMLElement>('[data-controller~=\"midwest-countdown-timer\"]')\n if (!timerEl) return\n\n const timer = this.application.getControllerForElementAndIdentifier(\n timerEl, 'midwest-countdown-timer'\n ) as PausableTimer | null\n if (!timer) return\n\n const isTop = this.element === this.element.parentElement?.firstElementChild\n if (isTop) { timer.resume() } else { timer.pause() }\n }\n}\n"],"names":[],"mappings":";;AASA,MAAqB,qBAAqB,UAAwB,CAAA;AAAA,EACxD,SAAmC,GAAA,IAAA,CAAA;AAAA,EACnC,QAAoC,GAAA,IAAA,CAAA;AAAA,EAE5C,OAAW,GAAA;AACT,IAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAK,OAAQ,CAAA,OAAA,CAAwB,WAAW,CAAA,CAAA;AACjE,IAAA,IAAA,CAAK,WAAW,WAAc,IAAA,CAAA;AAE9B,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAK,IAAA,CAAA,OAAA,CAAQ,SAAU,CAAA,GAAA,CAAI,SAAS,CAAA,CAAA;AAAA,KACrC,CAAA,CAAA;AAED,IAAM,MAAA,KAAA,GAAQ,KAAK,OAAQ,CAAA,aAAA,CAAA;AAC3B,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,IAAA,CAAK,WAAW,IAAI,gBAAA,CAAiB,MAAM,IAAA,CAAK,eAAe,CAAA,CAAA;AAC/D,MAAA,IAAA,CAAK,SAAS,OAAQ,CAAA,KAAA,EAAO,EAAE,SAAA,EAAW,MAAM,CAAA,CAAA;AAEhD,MAAW,UAAA,CAAA,MAAM,IAAK,CAAA,aAAA,EAAe,CAAA,CAAA;AAAA,KACvC;AAAA,GACF;AAAA,EAEA,UAAc,GAAA;AACZ,IAAA,IAAA,CAAK,UAAU,UAAW,EAAA,CAAA;AAC1B,IAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAEhB,IAAA,IAAI,KAAK,SAAW,EAAA;AAClB,MAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,SAAU,CAAA,aAAA,CAAc,aAAa,CAAA,CAAA;AACxD,MAAI,IAAA,KAAA,EAAO,SAAS,MAAW,KAAA,CAAA,IAAK,KAAK,SAAU,CAAA,OAAA,CAAQ,eAAe,CAAG,EAAA;AAC3E,QAAA,IAAA,CAAK,UAAU,WAAc,IAAA,CAAA;AAAA,OAC/B;AACA,MAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAA;AAAA,KACnB;AAAA,GACF;AAAA,EAEA,KAAS,GAAA;AACP,IAAA,IAAI,CAAC,IAAK,CAAA,OAAA,CAAQ,SAAU,CAAA,QAAA,CAAS,UAAU,CAAG,EAAA;AAChD,MAAA,IAAA,CAAK,QAAQ,MAAO,EAAA,CAAA;AACpB,MAAA,OAAA;AAAA,KACF;AAEA,IAAK,IAAA,CAAA,OAAA,CAAQ,SAAU,CAAA,GAAA,CAAI,SAAS,CAAA,CAAA;AACpC,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,IAAA,CAAK,QAAQ,MAAO,EAAA,CAAA;AAAA,OACnB,GAAG,CAAA,CAAA;AAAA,GACR;AAAA,EAEQ,aAAuB,GAAA;AAC7B,IAAA,MAAM,OAAU,GAAA,IAAA,CAAK,OAAQ,CAAA,aAAA,CAA2B,8CAA8C,CAAA,CAAA;AACtG,IAAA,IAAI,CAAC,OAAA;AAAS,MAAA,OAAA;AAEd,IAAM,MAAA,KAAA,GAAQ,KAAK,WAAY,CAAA,oCAAA;AAAA,MAC7B,OAAA;AAAA,MAAS,yBAAA;AAAA,KACX,CAAA;AACA,IAAA,IAAI,CAAC,KAAA;AAAO,MAAA,OAAA;AAEZ,IAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,OAAY,KAAA,IAAA,CAAK,QAAQ,aAAe,EAAA,iBAAA,CAAA;AAC3D,IAAA,IAAI,KAAO,EAAA;AAAE,MAAA,KAAA,CAAM,MAAO,EAAA,CAAA;AAAA,KAAS,MAAA;AAAE,MAAA,KAAA,CAAM,KAAM,EAAA,CAAA;AAAA,KAAE;AAAA,GACrD;AACF;;;;"}
1
+ {"version":3,"file":"notification_component_controller.js","sources":["../../../../../../../app/components/midwest/notification_component/notification_component_controller.ts"],"sourcesContent":["import { Controller } from '@hotwired/stimulus'\n\ntype PopoverElement = HTMLElement & { showPopover?(): void; hidePopover?(): void }\n\ninterface PausableTimer {\n pause(): void\n resume(): void\n}\n\nexport default class Notification extends Controller<HTMLElement> {\n private container: PopoverElement | null = null\n private observer: MutationObserver | null = null\n\n connect () {\n this.container = this.element.closest<PopoverElement>('[popover]')\n this.container?.showPopover?.()\n\n const frame = this.element.closest('turbo-frame')\n if (frame) {\n this.observer = new MutationObserver(() => this.syncCountdown())\n this.observer.observe(frame, { childList: true })\n // Defer until nested controllers (e.g. CountdownTimer) have connected\n setTimeout(() => this.syncCountdown())\n }\n }\n\n disconnect () {\n this.observer?.disconnect()\n this.observer = null\n\n if (this.container) {\n const frame = this.container.querySelector('turbo-frame')\n if (frame?.children.length === 0 && this.container.matches(':popover-open')) {\n this.container.hidePopover?.()\n }\n this.container = null\n }\n }\n\n close () {\n this.element.classList.add('closing')\n setTimeout(() => (this.element.parentElement ?? this.element).remove(), 350)\n }\n\n private syncCountdown (): void {\n const timerEl = this.element.querySelector<HTMLElement>('[data-controller~=\"midwest-countdown-timer\"]')\n if (!timerEl) return\n\n const timer = this.application.getControllerForElementAndIdentifier(\n timerEl, 'midwest-countdown-timer'\n ) as PausableTimer | null\n if (!timer) return\n\n // Position is measured on the motion wrapper (the direct turbo-frame child),\n // not on this.element which is always the sole child of its wrapper.\n const wrapper = this.element.parentElement ?? this.element\n const isTop = wrapper === wrapper.parentElement?.firstElementChild\n if (isTop) { timer.resume() } else { timer.pause() }\n }\n}\n"],"names":[],"mappings":";;AASA,MAAqB,qBAAqB,UAAwB,CAAA;AAAA,EACxD,SAAmC,GAAA,IAAA,CAAA;AAAA,EACnC,QAAoC,GAAA,IAAA,CAAA;AAAA,EAE5C,OAAW,GAAA;AACT,IAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAK,OAAQ,CAAA,OAAA,CAAwB,WAAW,CAAA,CAAA;AACjE,IAAA,IAAA,CAAK,WAAW,WAAc,IAAA,CAAA;AAE9B,IAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,OAAQ,CAAA,OAAA,CAAQ,aAAa,CAAA,CAAA;AAChD,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,IAAA,CAAK,WAAW,IAAI,gBAAA,CAAiB,MAAM,IAAA,CAAK,eAAe,CAAA,CAAA;AAC/D,MAAA,IAAA,CAAK,SAAS,OAAQ,CAAA,KAAA,EAAO,EAAE,SAAA,EAAW,MAAM,CAAA,CAAA;AAEhD,MAAW,UAAA,CAAA,MAAM,IAAK,CAAA,aAAA,EAAe,CAAA,CAAA;AAAA,KACvC;AAAA,GACF;AAAA,EAEA,UAAc,GAAA;AACZ,IAAA,IAAA,CAAK,UAAU,UAAW,EAAA,CAAA;AAC1B,IAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAEhB,IAAA,IAAI,KAAK,SAAW,EAAA;AAClB,MAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,SAAU,CAAA,aAAA,CAAc,aAAa,CAAA,CAAA;AACxD,MAAI,IAAA,KAAA,EAAO,SAAS,MAAW,KAAA,CAAA,IAAK,KAAK,SAAU,CAAA,OAAA,CAAQ,eAAe,CAAG,EAAA;AAC3E,QAAA,IAAA,CAAK,UAAU,WAAc,IAAA,CAAA;AAAA,OAC/B;AACA,MAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAA;AAAA,KACnB;AAAA,GACF;AAAA,EAEA,KAAS,GAAA;AACP,IAAK,IAAA,CAAA,OAAA,CAAQ,SAAU,CAAA,GAAA,CAAI,SAAS,CAAA,CAAA;AACpC,IAAW,UAAA,CAAA,MAAA,CAAO,KAAK,OAAQ,CAAA,aAAA,IAAiB,KAAK,OAAS,EAAA,MAAA,IAAU,GAAG,CAAA,CAAA;AAAA,GAC7E;AAAA,EAEQ,aAAuB,GAAA;AAC7B,IAAA,MAAM,OAAU,GAAA,IAAA,CAAK,OAAQ,CAAA,aAAA,CAA2B,8CAA8C,CAAA,CAAA;AACtG,IAAA,IAAI,CAAC,OAAA;AAAS,MAAA,OAAA;AAEd,IAAM,MAAA,KAAA,GAAQ,KAAK,WAAY,CAAA,oCAAA;AAAA,MAC7B,OAAA;AAAA,MAAS,yBAAA;AAAA,KACX,CAAA;AACA,IAAA,IAAI,CAAC,KAAA;AAAO,MAAA,OAAA;AAIZ,IAAA,MAAM,OAAU,GAAA,IAAA,CAAK,OAAQ,CAAA,aAAA,IAAiB,IAAK,CAAA,OAAA,CAAA;AACnD,IAAM,MAAA,KAAA,GAAQ,OAAY,KAAA,OAAA,CAAQ,aAAe,EAAA,iBAAA,CAAA;AACjD,IAAA,IAAI,KAAO,EAAA;AAAE,MAAA,KAAA,CAAM,MAAO,EAAA,CAAA;AAAA,KAAS,MAAA;AAAE,MAAA,KAAA,CAAM,KAAM,EAAA,CAAA;AAAA,KAAE;AAAA,GACrD;AACF;;;;"}
@@ -1,35 +1,31 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
+ import { observeViewport } from '../../../assets/javascript/midwest/viewport_observer.js';
2
3
 
3
4
  class LoadMore extends Controller {
4
5
  static values = {
5
6
  url: String,
6
7
  tbodyId: String
7
8
  };
8
- observer = null;
9
+ teardown = null;
9
10
  loading = false;
10
11
  connect() {
11
12
  if (!this.urlValue)
12
13
  return;
13
- this.observer = new IntersectionObserver(
14
- (entries) => {
15
- if (entries[0].isIntersecting)
16
- this.load();
17
- },
18
- // Start fetching 300px before the sentinel enters the viewport so rows
19
- // appear before the user actually reaches the bottom.
20
- { rootMargin: "0px 0px 300px 0px" }
21
- );
22
- this.observer.observe(this.element);
14
+ this.teardown = observeViewport(this.element, {
15
+ rootMargin: "0px 0px 300px 0px",
16
+ once: true,
17
+ onEnter: () => this.load()
18
+ });
23
19
  }
24
20
  disconnect() {
25
- this.observer?.disconnect();
26
- this.observer = null;
21
+ this.teardown?.();
22
+ this.teardown = null;
27
23
  }
28
24
  async load() {
29
25
  if (this.loading)
30
26
  return;
31
27
  this.loading = true;
32
- this.observer?.disconnect();
28
+ this.teardown?.();
33
29
  try {
34
30
  const response = await fetch(this.urlValue, {
35
31
  headers: {