@unabridged/midwest 0.24.3 → 0.24.4

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 +8 -0
  2. package/app/assets/javascript/midwest/map_providers.ts +61 -0
  3. package/app/assets/javascript/midwest.js +972 -6
  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 +6 -1
  7. package/dist/css/midwest.css +1 -1
  8. package/dist/javascript/collection/app/assets/javascript/midwest/index.js +8 -0
  9. package/dist/javascript/collection/app/assets/javascript/midwest/index.js.map +1 -1
  10. package/dist/javascript/collection/app/assets/javascript/midwest/map_providers.js +56 -0
  11. package/dist/javascript/collection/app/assets/javascript/midwest/map_providers.js.map +1 -0
  12. package/dist/javascript/collection/app/components/midwest/form/address_component/address_component_controller.js +441 -0
  13. package/dist/javascript/collection/app/components/midwest/form/address_component/address_component_controller.js.map +1 -0
  14. package/dist/javascript/collection/app/components/midwest/form/live_summary_component/live_summary_component_controller.js +55 -1
  15. package/dist/javascript/collection/app/components/midwest/form/live_summary_component/live_summary_component_controller.js.map +1 -1
  16. package/dist/javascript/collection/app/components/midwest/map_component/map_component_controller.js +297 -0
  17. package/dist/javascript/collection/app/components/midwest/map_component/map_component_controller.js.map +1 -0
  18. package/dist/javascript/collection/app/components/midwest/onboarding_component/onboarding_component_controller.js +34 -5
  19. package/dist/javascript/collection/app/components/midwest/onboarding_component/onboarding_component_controller.js.map +1 -1
  20. package/dist/javascript/collection/app/components/midwest/page_transition_component/page_transition_component_controller.js +38 -0
  21. package/dist/javascript/collection/app/components/midwest/page_transition_component/page_transition_component_controller.js.map +1 -0
  22. package/dist/javascript/collection/app/components/midwest/popover_component/popover_component_controller.js +67 -0
  23. package/dist/javascript/collection/app/components/midwest/popover_component/popover_component_controller.js.map +1 -0
  24. package/dist/javascript/midwest.js +972 -6
  25. package/dist/javascript/midwest.js.map +1 -1
  26. package/package.json +1 -1
@@ -39,6 +39,10 @@ import ThemeSwitch from '../../../components/midwest/form/switch_component/theme
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
41
  import Motion from '../../../components/midwest/motion_component/motion_component_controller.js';
42
+ import PageTransition from '../../../components/midwest/page_transition_component/page_transition_component_controller.js';
43
+ import Map from '../../../components/midwest/map_component/map_component_controller.js';
44
+ import Address from '../../../components/midwest/form/address_component/address_component_controller.js';
45
+ import Popover from '../../../components/midwest/popover_component/popover_component_controller.js';
42
46
 
43
47
  function registerMidwestControllers(application) {
44
48
  application.register("midwest-card", Card);
@@ -82,6 +86,10 @@ function registerMidwestControllers(application) {
82
86
  application.register("midwest-panorama", Panorama);
83
87
  application.register("midwest-playlist", Playlist);
84
88
  application.register("midwest-motion", Motion);
89
+ application.register("midwest-page-transition", PageTransition);
90
+ application.register("midwest-map", Map);
91
+ application.register("midwest-address", Address);
92
+ application.register("midwest-popover", Popover);
85
93
  }
86
94
 
87
95
  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'\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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"}
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'\nimport PageTransition from '../../../components/midwest/page_transition_component/page_transition_component_controller'\nimport Map from '../../../components/midwest/map_component/map_component_controller'\nimport Address from '../../../components/midwest/form/address_component/address_component_controller'\nimport Popover from '../../../components/midwest/popover_component/popover_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 application.register('midwest-page-transition', PageTransition)\n application.register('midwest-map', Map)\n application.register('midwest-address', Address)\n application.register('midwest-popover', Popover)\n /* EXPORTS */\n}\n"],"names":["Confirmation","IntersectionObserver"],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ let mapkitScriptPromise = null;
2
+ let googleMapsScriptPromise = null;
3
+ let leafletScriptPromise = null;
4
+ function loadMapKitScript() {
5
+ if (window.mapkit)
6
+ return Promise.resolve();
7
+ if (mapkitScriptPromise)
8
+ return mapkitScriptPromise;
9
+ mapkitScriptPromise = new Promise((resolve, reject) => {
10
+ const script = document.createElement("script");
11
+ script.src = "https://cdn.apple-mapkit.com/mk/5.x.x/mapkit.js";
12
+ script.crossOrigin = "anonymous";
13
+ script.addEventListener("load", () => resolve());
14
+ script.addEventListener("error", () => reject(new Error("Failed to load MapKit JS")));
15
+ document.head.appendChild(script);
16
+ });
17
+ return mapkitScriptPromise;
18
+ }
19
+ function loadLeafletScript() {
20
+ if (window.L)
21
+ return Promise.resolve();
22
+ if (leafletScriptPromise)
23
+ return leafletScriptPromise;
24
+ leafletScriptPromise = new Promise((resolve, reject) => {
25
+ if (!document.querySelector("link[data-midwest-leaflet]")) {
26
+ const link = document.createElement("link");
27
+ link.rel = "stylesheet";
28
+ link.href = "https://unpkg.com/leaflet@1.9.4/dist/leaflet.css";
29
+ link.dataset.midwestLeaflet = "";
30
+ document.head.appendChild(link);
31
+ }
32
+ const script = document.createElement("script");
33
+ script.src = "https://unpkg.com/leaflet@1.9.4/dist/leaflet.js";
34
+ script.addEventListener("load", () => resolve());
35
+ script.addEventListener("error", () => reject(new Error("Failed to load Leaflet")));
36
+ document.head.appendChild(script);
37
+ });
38
+ return leafletScriptPromise;
39
+ }
40
+ function loadGoogleMapsScript(apiKey) {
41
+ if (window.google?.maps)
42
+ return Promise.resolve();
43
+ if (googleMapsScriptPromise)
44
+ return googleMapsScriptPromise;
45
+ googleMapsScriptPromise = new Promise((resolve, reject) => {
46
+ window.__midwestGoogleMapsReady = resolve;
47
+ const script = document.createElement("script");
48
+ script.src = `https://maps.googleapis.com/maps/api/js?key=${encodeURIComponent(apiKey)}&callback=__midwestGoogleMapsReady&loading=async&libraries=places`;
49
+ script.addEventListener("error", () => reject(new Error("Failed to load Google Maps")));
50
+ document.head.appendChild(script);
51
+ });
52
+ return googleMapsScriptPromise;
53
+ }
54
+
55
+ export { loadGoogleMapsScript, loadLeafletScript, loadMapKitScript };
56
+ //# sourceMappingURL=map_providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map_providers.js","sources":["../../../../../../../app/assets/javascript/midwest/map_providers.ts"],"sourcesContent":["// Shared map provider script loaders. Module-level promises ensure the CDN\n// script is only injected once even when MapComponent and AddressComponent both\n// mount on the same page simultaneously.\n\nlet mapkitScriptPromise: Promise<void> | null = null\nlet googleMapsScriptPromise: Promise<void> | null = null\nlet leafletScriptPromise: Promise<void> | null = null\n\nexport function loadMapKitScript (): Promise<void> {\n if ((window as any).mapkit) return Promise.resolve()\n if (mapkitScriptPromise) return mapkitScriptPromise\n\n mapkitScriptPromise = new Promise<void>((resolve, reject) => {\n const script = document.createElement('script')\n script.src = 'https://cdn.apple-mapkit.com/mk/5.x.x/mapkit.js'\n script.crossOrigin = 'anonymous'\n script.addEventListener('load', () => resolve())\n script.addEventListener('error', () => reject(new Error('Failed to load MapKit JS')))\n document.head.appendChild(script)\n })\n return mapkitScriptPromise\n}\n\n// Leaflet: injects the CSS link then the JS. Both are deduplicated.\nexport function loadLeafletScript (): Promise<void> {\n if ((window as any).L) return Promise.resolve()\n if (leafletScriptPromise) return leafletScriptPromise\n\n leafletScriptPromise = new Promise<void>((resolve, reject) => {\n if (!document.querySelector('link[data-midwest-leaflet]')) {\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.href = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.css'\n link.dataset.midwestLeaflet = ''\n document.head.appendChild(link)\n }\n\n const script = document.createElement('script')\n script.src = 'https://unpkg.com/leaflet@1.9.4/dist/leaflet.js'\n script.addEventListener('load', () => resolve())\n script.addEventListener('error', () => reject(new Error('Failed to load Leaflet')))\n document.head.appendChild(script)\n })\n return leafletScriptPromise\n}\n\n// Always includes &libraries=places so that AddressComponent autocomplete works\n// whether or not a MapComponent also loads Google Maps on the same page.\nexport function loadGoogleMapsScript (apiKey: string): Promise<void> {\n if ((window as any).google?.maps) return Promise.resolve()\n if (googleMapsScriptPromise) return googleMapsScriptPromise\n\n googleMapsScriptPromise = new Promise<void>((resolve, reject) => {\n ;(window as any).__midwestGoogleMapsReady = resolve\n const script = document.createElement('script')\n script.src = `https://maps.googleapis.com/maps/api/js?key=${encodeURIComponent(apiKey)}&callback=__midwestGoogleMapsReady&loading=async&libraries=places`\n script.addEventListener('error', () => reject(new Error('Failed to load Google Maps')))\n document.head.appendChild(script)\n })\n return googleMapsScriptPromise\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,441 @@
1
+ import { Controller } from '@hotwired/stimulus';
2
+ import { loadMapKitScript, loadGoogleMapsScript, loadLeafletScript } from '../../../../assets/javascript/midwest/map_providers.js';
3
+
4
+ const DEBOUNCE_MS = 300;
5
+ const GOOGLE_PREVIEW_STYLES = [
6
+ { elementType: "geometry", stylers: [{ color: "#f5f5f5" }] },
7
+ { elementType: "labels.icon", stylers: [{ visibility: "off" }] },
8
+ { elementType: "labels.text.fill", stylers: [{ color: "#616161" }] },
9
+ { elementType: "labels.text.stroke", stylers: [{ color: "#f5f5f5" }] },
10
+ { featureType: "road", elementType: "geometry", stylers: [{ color: "#ffffff" }] },
11
+ { featureType: "road.highway", elementType: "geometry", stylers: [{ color: "#dadada" }] },
12
+ { featureType: "water", elementType: "geometry", stylers: [{ color: "#c9c9c9" }] },
13
+ { featureType: "poi", elementType: "geometry", stylers: [{ color: "#eeeeee" }] }
14
+ ];
15
+ class Address extends Controller {
16
+ static targets = [
17
+ "input",
18
+ "dropdown",
19
+ "suggestions",
20
+ "latInput",
21
+ "lngInput",
22
+ "placeIdInput",
23
+ "mapContainer"
24
+ ];
25
+ static values = {
26
+ provider: { type: String, default: "" },
27
+ mapProvider: { type: String, default: "" },
28
+ apiKey: { type: String, default: "" },
29
+ token: { type: String, default: "" },
30
+ tokenUrl: { type: String, default: "" },
31
+ countryCodes: { type: Array, default: [] },
32
+ showMap: { type: Boolean, default: false },
33
+ nominatimUrl: { type: String, default: "" }
34
+ };
35
+ searchTimer;
36
+ highlightedIndex = -1;
37
+ mapInstance = null;
38
+ mapMarker = null;
39
+ mkSearch = null;
40
+ autocompleteService = null;
41
+ placesService = null;
42
+ // ── Named handlers ────────────────────────────────────────────────────────
43
+ onToggle = (e) => {
44
+ const opened = e.newState === "open";
45
+ if (this.hasInputTarget) {
46
+ this.inputTarget.setAttribute("aria-expanded", String(opened));
47
+ }
48
+ if (!opened) {
49
+ this.highlightedIndex = -1;
50
+ }
51
+ };
52
+ onFocusOut = (e) => {
53
+ if (!this.element.contains(e.relatedTarget)) {
54
+ this.closeDropdown();
55
+ }
56
+ };
57
+ // ── Lifecycle ─────────────────────────────────────────────────────────────
58
+ async connect() {
59
+ this.element.addEventListener("focusout", this.onFocusOut);
60
+ const provider = this.providerValue;
61
+ const mapProv = this.effectiveMapProvider();
62
+ if (!provider && !mapProv)
63
+ return;
64
+ try {
65
+ if (provider === "mapkit") {
66
+ await loadMapKitScript();
67
+ this.initMapKit();
68
+ } else if (provider === "google") {
69
+ await loadGoogleMapsScript(this.apiKeyValue);
70
+ this.initGoogle();
71
+ }
72
+ if (this.showMapValue && mapProv === "leaflet") {
73
+ await loadLeafletScript();
74
+ }
75
+ } catch (err) {
76
+ console.error("[midwest-address] Failed to initialise:", err);
77
+ }
78
+ }
79
+ disconnect() {
80
+ clearTimeout(this.searchTimer);
81
+ this.element.removeEventListener("focusout", this.onFocusOut);
82
+ if (this.mapInstance) {
83
+ const mapProv = this.effectiveMapProvider();
84
+ if (mapProv === "mapkit")
85
+ this.mapInstance.destroy();
86
+ if (mapProv === "leaflet")
87
+ this.mapInstance.remove();
88
+ }
89
+ this.mapInstance = null;
90
+ }
91
+ dropdownTargetConnected(el) {
92
+ el.addEventListener("toggle", this.onToggle);
93
+ }
94
+ dropdownTargetDisconnected(el) {
95
+ el.removeEventListener("toggle", this.onToggle);
96
+ }
97
+ // ── Public Stimulus actions ───────────────────────────────────────────────
98
+ search() {
99
+ this.clearGeocode();
100
+ const query = this.inputTarget.value.trim();
101
+ if (query.length < 2) {
102
+ this.closeDropdown();
103
+ return;
104
+ }
105
+ clearTimeout(this.searchTimer);
106
+ this.searchTimer = setTimeout(() => {
107
+ if (this.providerValue === "mapkit") {
108
+ this.searchMapKit(query);
109
+ } else if (this.providerValue === "google") {
110
+ this.searchGoogle(query);
111
+ } else if (this.providerValue === "nominatim") {
112
+ this.searchNominatim(query);
113
+ }
114
+ }, DEBOUNCE_MS);
115
+ }
116
+ navigate(event) {
117
+ const items = this.suggestionElements();
118
+ if (!items.length)
119
+ return;
120
+ switch (event.key) {
121
+ case "ArrowDown":
122
+ event.preventDefault();
123
+ this.highlightedIndex = Math.min(this.highlightedIndex + 1, items.length - 1);
124
+ this.applyHighlight(items);
125
+ break;
126
+ case "ArrowUp":
127
+ event.preventDefault();
128
+ this.highlightedIndex = Math.max(this.highlightedIndex - 1, -1);
129
+ this.applyHighlight(items);
130
+ break;
131
+ case "Enter":
132
+ event.preventDefault();
133
+ if (this.highlightedIndex >= 0)
134
+ items[this.highlightedIndex].dispatchEvent(new MouseEvent("mousedown"));
135
+ break;
136
+ case "Escape":
137
+ this.closeDropdown();
138
+ break;
139
+ }
140
+ }
141
+ // ── Provider init ─────────────────────────────────────────────────────────
142
+ initMapKit() {
143
+ const mk = window.mapkit;
144
+ const { tokenValue: token, tokenUrlValue: tokenUrl } = this;
145
+ mk.init({
146
+ authorizationCallback: (done) => {
147
+ if (token) {
148
+ done(token);
149
+ } else if (tokenUrl) {
150
+ fetch(tokenUrl).then((r) => r.text()).then(done).catch((err) => console.error("[midwest-address] Token fetch failed:", err));
151
+ }
152
+ },
153
+ language: document.documentElement.lang || "en"
154
+ });
155
+ this.mkSearch = new mk.Search({ getsUserLocation: false });
156
+ }
157
+ initGoogle() {
158
+ const g = window.google;
159
+ this.autocompleteService = new g.maps.places.AutocompleteService();
160
+ this.placesService = new g.maps.places.PlacesService(document.createElement("div"));
161
+ }
162
+ // ── Search ────────────────────────────────────────────────────────────────
163
+ searchMapKit(query) {
164
+ if (!this.mkSearch)
165
+ return;
166
+ this.mkSearch.autocomplete(query, (err, data) => {
167
+ if (err || !data?.results?.length) {
168
+ this.closeDropdown();
169
+ return;
170
+ }
171
+ const results = data.results.map((r) => ({
172
+ id: r.completionURL ?? r.displayLines?.join(", ") ?? "",
173
+ label: r.displayLines?.[0] ?? "",
174
+ secondary: r.displayLines?.[1] ?? "",
175
+ payload: r
176
+ }));
177
+ this.renderSuggestions(results);
178
+ });
179
+ }
180
+ searchGoogle(query) {
181
+ if (!this.autocompleteService)
182
+ return;
183
+ const request = { input: query };
184
+ if (this.countryCodesValue.length) {
185
+ request.componentRestrictions = { country: this.countryCodesValue };
186
+ }
187
+ this.autocompleteService.getPlacePredictions(
188
+ request,
189
+ (predictions, status) => {
190
+ const g = window.google;
191
+ if (status !== g.maps.places.PlacesServiceStatus.OK || !predictions?.length) {
192
+ this.closeDropdown();
193
+ return;
194
+ }
195
+ const results = predictions.map((p) => ({
196
+ id: p.place_id,
197
+ label: p.structured_formatting?.main_text ?? p.description,
198
+ secondary: p.structured_formatting?.secondary_text ?? "",
199
+ payload: p
200
+ }));
201
+ this.renderSuggestions(results);
202
+ }
203
+ );
204
+ }
205
+ // ── Suggestions UI ────────────────────────────────────────────────────────
206
+ renderSuggestions(results) {
207
+ if (!this.hasSuggestionsTarget)
208
+ return;
209
+ const list = this.suggestionsTarget;
210
+ list.innerHTML = "";
211
+ results.forEach((r, i) => {
212
+ const li = document.createElement("li");
213
+ li.className = "midwest-address__suggestion";
214
+ li.setAttribute("role", "option");
215
+ li.setAttribute("id", `${this.element.id || "addr"}-s${i}`);
216
+ li.dataset.index = String(i);
217
+ const main = document.createElement("span");
218
+ main.className = "midwest-address__suggestion-main";
219
+ main.textContent = r.label;
220
+ li.appendChild(main);
221
+ if (r.secondary) {
222
+ const sec = document.createElement("span");
223
+ sec.className = "midwest-address__suggestion-secondary";
224
+ sec.textContent = r.secondary;
225
+ li.appendChild(sec);
226
+ }
227
+ li.addEventListener("mousedown", (e) => {
228
+ e.preventDefault();
229
+ this.pickSuggestion(r);
230
+ });
231
+ list.appendChild(li);
232
+ });
233
+ this.openDropdown();
234
+ this.highlightedIndex = -1;
235
+ }
236
+ openDropdown() {
237
+ if (!this.hasDropdownTarget)
238
+ return;
239
+ if (!this.dropdownTarget.matches(":popover-open"))
240
+ this.dropdownTarget.showPopover();
241
+ }
242
+ closeDropdown() {
243
+ if (this.hasDropdownTarget && this.dropdownTarget.matches(":popover-open")) {
244
+ this.dropdownTarget.hidePopover();
245
+ }
246
+ if (this.hasSuggestionsTarget)
247
+ this.suggestionsTarget.innerHTML = "";
248
+ this.highlightedIndex = -1;
249
+ }
250
+ suggestionElements() {
251
+ if (!this.hasSuggestionsTarget)
252
+ return [];
253
+ return Array.from(this.suggestionsTarget.querySelectorAll(".midwest-address__suggestion"));
254
+ }
255
+ applyHighlight(items) {
256
+ items.forEach((item, i) => {
257
+ const active = i === this.highlightedIndex;
258
+ item.classList.toggle("is-highlighted", active);
259
+ item.setAttribute("aria-selected", String(active));
260
+ if (active) {
261
+ this.inputTarget.setAttribute("aria-activedescendant", item.id);
262
+ item.scrollIntoView({ block: "nearest" });
263
+ }
264
+ });
265
+ if (this.highlightedIndex < 0) {
266
+ this.inputTarget.removeAttribute("aria-activedescendant");
267
+ }
268
+ }
269
+ // ── Pick a suggestion ─────────────────────────────────────────────────────
270
+ pickSuggestion(r) {
271
+ this.closeDropdown();
272
+ if (this.providerValue === "mapkit") {
273
+ this.pickMapKit(r);
274
+ } else if (this.providerValue === "google") {
275
+ this.pickGoogle(r);
276
+ } else if (this.providerValue === "nominatim") {
277
+ this.pickNominatim(r);
278
+ }
279
+ }
280
+ pickMapKit(r) {
281
+ if (!this.mkSearch)
282
+ return;
283
+ this.mkSearch.search(r.payload, (err, data) => {
284
+ if (err || !data?.places?.length)
285
+ return;
286
+ const place = data.places[0];
287
+ const coord = place.coordinate;
288
+ this.inputTarget.value = [r.label, r.secondary].filter(Boolean).join(", ");
289
+ this.fillGeocode(coord.latitude, coord.longitude, place.id ?? "");
290
+ this.updateMapPreview(coord.latitude, coord.longitude);
291
+ });
292
+ }
293
+ pickGoogle(r) {
294
+ if (!this.placesService || !r.id)
295
+ return;
296
+ const g = window.google;
297
+ this.placesService.getDetails(
298
+ { placeId: r.id, fields: ["geometry", "formatted_address", "place_id"] },
299
+ (place, status) => {
300
+ if (status !== g.maps.places.PlacesServiceStatus.OK || !place)
301
+ return;
302
+ const lat = place.geometry.location.lat();
303
+ const lng = place.geometry.location.lng();
304
+ this.inputTarget.value = place.formatted_address;
305
+ this.fillGeocode(lat, lng, place.place_id);
306
+ this.updateMapPreview(lat, lng);
307
+ }
308
+ );
309
+ }
310
+ // ── Geocode field management ──────────────────────────────────────────────
311
+ fillGeocode(lat, lng, placeId) {
312
+ if (this.hasLatInputTarget)
313
+ this.latInputTarget.value = String(lat);
314
+ if (this.hasLngInputTarget)
315
+ this.lngInputTarget.value = String(lng);
316
+ if (this.hasPlaceIdInputTarget)
317
+ this.placeIdInputTarget.value = placeId;
318
+ this.dispatch("geocode", { detail: { lat, lng, placeId } });
319
+ }
320
+ clearGeocode() {
321
+ if (this.hasLatInputTarget)
322
+ this.latInputTarget.value = "";
323
+ if (this.hasLngInputTarget)
324
+ this.lngInputTarget.value = "";
325
+ if (this.hasPlaceIdInputTarget)
326
+ this.placeIdInputTarget.value = "";
327
+ }
328
+ // ── Nominatim search (OpenStreetMap, no API key) ──────────────────────────
329
+ searchNominatim(query) {
330
+ const base = this.nominatimUrlValue || "https://nominatim.openstreetmap.org";
331
+ const url = `${base}/search?q=${encodeURIComponent(query)}&format=json&limit=5&addressdetails=1`;
332
+ fetch(url, { headers: { "Accept-Language": document.documentElement.lang || "en" } }).then((r) => r.json()).then((data) => {
333
+ if (!data?.length) {
334
+ this.closeDropdown();
335
+ return;
336
+ }
337
+ const results = data.map((r) => {
338
+ const parts = r.display_name.split(", ");
339
+ return {
340
+ id: String(r.place_id),
341
+ label: r.name || parts[0] || r.display_name,
342
+ secondary: parts.length > 1 ? parts.slice(1).join(", ") : "",
343
+ payload: r
344
+ };
345
+ });
346
+ this.renderSuggestions(results);
347
+ }).catch(() => this.closeDropdown());
348
+ }
349
+ pickNominatim(r) {
350
+ const place = r.payload;
351
+ const lat = parseFloat(place.lat);
352
+ const lng = parseFloat(place.lon);
353
+ this.inputTarget.value = place.display_name;
354
+ this.fillGeocode(lat, lng, `${place.osm_type}:${place.osm_id}`);
355
+ this.updateMapPreview(lat, lng);
356
+ }
357
+ // ── Map preview ───────────────────────────────────────────────────────────
358
+ // Returns the provider used for the map preview. `mapProviderValue` is set
359
+ // when the geocoder and map providers differ; falls back to `providerValue`
360
+ // so existing single-provider setups (mapkit/google) work without change.
361
+ effectiveMapProvider() {
362
+ return this.mapProviderValue || this.providerValue;
363
+ }
364
+ updateMapPreview(lat, lng) {
365
+ if (!this.hasMapContainerTarget || !this.showMapValue)
366
+ return;
367
+ this.mapContainerTarget.hidden = false;
368
+ const mapProv = this.effectiveMapProvider();
369
+ if (mapProv === "mapkit") {
370
+ this.updateMapKitPreview(lat, lng);
371
+ } else if (mapProv === "google") {
372
+ this.updateGooglePreview(lat, lng);
373
+ } else if (mapProv === "leaflet") {
374
+ this.updateLeafletPreview(lat, lng);
375
+ }
376
+ }
377
+ updateMapKitPreview(lat, lng) {
378
+ const mk = window.mapkit;
379
+ const coord = new mk.Coordinate(lat, lng);
380
+ if (!this.mapInstance) {
381
+ this.mapInstance = new mk.Map(this.mapContainerTarget, {
382
+ mapType: mk.Map.MapTypes.MutedStandard,
383
+ showsCompass: mk.FeatureVisibility.Hidden,
384
+ showsZoomControl: false,
385
+ showsMapTypeControl: false,
386
+ isScrollEnabled: false,
387
+ isZoomEnabled: false
388
+ });
389
+ }
390
+ this.mapInstance.setRegionAnimated(
391
+ new mk.CoordinateRegion(coord, new mk.CoordinateSpan(0.01, 0.01))
392
+ );
393
+ if (this.mapMarker)
394
+ this.mapInstance.removeAnnotation(this.mapMarker);
395
+ this.mapMarker = new mk.MarkerAnnotation(coord);
396
+ this.mapInstance.addAnnotation(this.mapMarker);
397
+ }
398
+ updateGooglePreview(lat, lng) {
399
+ const g = window.google;
400
+ const center = { lat, lng };
401
+ if (!this.mapInstance) {
402
+ this.mapInstance = new g.maps.Map(this.mapContainerTarget, {
403
+ center,
404
+ zoom: 15,
405
+ disableDefaultUI: true,
406
+ gestureHandling: "none",
407
+ styles: GOOGLE_PREVIEW_STYLES
408
+ });
409
+ } else {
410
+ this.mapInstance.setCenter(center);
411
+ this.mapInstance.setZoom(15);
412
+ }
413
+ if (this.mapMarker)
414
+ this.mapMarker.setMap(null);
415
+ this.mapMarker = new g.maps.Marker({ map: this.mapInstance, position: center });
416
+ }
417
+ updateLeafletPreview(lat, lng) {
418
+ const L = window.L;
419
+ if (!L)
420
+ return;
421
+ if (!this.mapInstance) {
422
+ this.mapInstance = L.map(this.mapContainerTarget, {
423
+ center: [lat, lng],
424
+ zoom: 15,
425
+ zoomControl: false,
426
+ attributionControl: false
427
+ });
428
+ L.tileLayer("https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png", {
429
+ maxZoom: 19
430
+ }).addTo(this.mapInstance);
431
+ } else {
432
+ this.mapInstance.setView([lat, lng], 15);
433
+ }
434
+ if (this.mapMarker)
435
+ this.mapMarker.remove();
436
+ this.mapMarker = L.marker([lat, lng]).addTo(this.mapInstance);
437
+ }
438
+ }
439
+
440
+ export { Address as default };
441
+ //# sourceMappingURL=address_component_controller.js.map