@unabridged/midwest 0.21.1 → 0.22.0

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 -2
  2. package/app/assets/javascript/midwest.js +725 -20
  3. package/app/assets/javascript/midwest.js.map +1 -1
  4. package/app/assets/stylesheets/midwest.css +1 -1
  5. package/app/assets/stylesheets/midwest.tailwind.css +6 -1
  6. package/dist/css/midwest.css +1 -1
  7. package/dist/javascript/collection/app/assets/javascript/midwest/index.js +8 -2
  8. package/dist/javascript/collection/app/assets/javascript/midwest/index.js.map +1 -1
  9. package/dist/javascript/collection/app/components/midwest/code_block_component/code_block_component_controller.js +17 -0
  10. package/dist/javascript/collection/app/components/midwest/code_block_component/code_block_component_controller.js.map +1 -0
  11. package/dist/javascript/collection/app/components/midwest/dialog_component/dialog_component_controller.js.map +1 -1
  12. package/dist/javascript/collection/app/components/midwest/form/date_picker_component/date_picker_component_controller.js +243 -0
  13. package/dist/javascript/collection/app/components/midwest/form/date_picker_component/date_picker_component_controller.js.map +1 -0
  14. package/dist/javascript/collection/app/components/midwest/form/file_component/file_component_controller.js +35 -1
  15. package/dist/javascript/collection/app/components/midwest/form/file_component/file_component_controller.js.map +1 -1
  16. package/dist/javascript/collection/app/components/midwest/form/input_component/input_component_controller.js +72 -2
  17. package/dist/javascript/collection/app/components/midwest/form/input_component/input_component_controller.js.map +1 -1
  18. package/dist/javascript/collection/app/components/midwest/form/live_summary_component/live_summary_component_controller.js +12 -0
  19. package/dist/javascript/collection/app/components/midwest/form/live_summary_component/live_summary_component_controller.js.map +1 -1
  20. package/dist/javascript/collection/app/components/midwest/form/time_picker_component/time_picker_component_controller.js +164 -0
  21. package/dist/javascript/collection/app/components/midwest/form/time_picker_component/time_picker_component_controller.js.map +1 -0
  22. package/dist/javascript/collection/app/components/midwest/password_requirements_component/password_requirements_component_controller.js +194 -0
  23. package/dist/javascript/collection/app/components/midwest/password_requirements_component/password_requirements_component_controller.js.map +1 -0
  24. package/dist/javascript/midwest.js +725 -20
  25. package/dist/javascript/midwest.js.map +1 -1
  26. package/package.json +1 -1
@@ -13,7 +13,6 @@ import Form from '../../../components/midwest/form/form_controller.js';
13
13
  import CountdownTimer from '../../../components/midwest/countdown_timer_component/countdown_timer_component_controller.js';
14
14
  import Badge from '../../../components/midwest/badge_component/badge_component_controller.js';
15
15
  import ConfirmationController from '../../../components/midwest/confirmation_component/confirmation_component_controller.js';
16
- import AvatarGroup from '../../../components/midwest/avatar_group_component/avatar_group_component_controller.js';
17
16
  import Chart from '../../../components/midwest/chart_component/chart_component_controller.js';
18
17
  import Range from '../../../components/midwest/form/range_component/range_component_controller.js';
19
18
  import Rating from '../../../components/midwest/rating_component/rating_component_controller.js';
@@ -29,6 +28,10 @@ import ShowIf from '../../../components/midwest/show_if_component/show_if_compon
29
28
  import TreeView from '../../../components/midwest/tree_view_component/tree_view_component_controller.js';
30
29
  import CommandPalette from '../../../components/midwest/command_palette_component/command_palette_component_controller.js';
31
30
  import Repeatable from '../../../components/midwest/form/repeatable_component/repeatable_component_controller.js';
31
+ import PasswordRequirements from '../../../components/midwest/password_requirements_component/password_requirements_component_controller.js';
32
+ import CodeBlock from '../../../components/midwest/code_block_component/code_block_component_controller.js';
33
+ import DatePicker from '../../../components/midwest/form/date_picker_component/date_picker_component_controller.js';
34
+ import TimePicker from '../../../components/midwest/form/time_picker_component/time_picker_component_controller.js';
32
35
 
33
36
  function registerMidwestControllers(application) {
34
37
  application.register("midwest-card", Card);
@@ -46,7 +49,6 @@ function registerMidwestControllers(application) {
46
49
  application.register("midwest-form", Form);
47
50
  application.register("midwest-badge", Badge);
48
51
  application.register("midwest-confirmation", ConfirmationController);
49
- application.register("midwest-avatar-group", AvatarGroup);
50
52
  application.register("midwest-chart", Chart);
51
53
  application.register("midwest-range", Range);
52
54
  application.register("midwest-rating", Rating);
@@ -62,6 +64,10 @@ function registerMidwestControllers(application) {
62
64
  application.register("midwest-tree-view", TreeView);
63
65
  application.register("midwest-command-palette", CommandPalette);
64
66
  application.register("midwest-repeatable", Repeatable);
67
+ application.register("midwest-password-requirements", PasswordRequirements);
68
+ application.register("midwest-code-block", CodeBlock);
69
+ application.register("midwest-date-picker", DatePicker);
70
+ application.register("midwest-time-picker", TimePicker);
65
71
  }
66
72
 
67
73
  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 AvatarGroup from '../../../components/midwest/avatar_group_component/avatar_group_component_controller'\nimport Chart from '../../../components/midwest/chart_component/chart_component_controller'\nimport Range from '../../../components/midwest/form/range_component/range_component_controller'\nimport Rating from '../../../components/midwest/rating_component/rating_component_controller'\nimport Autocomplete from '../../../components/midwest/form/autocomplete_component/autocomplete_component_controller'\nimport Image from '../../../components/midwest/image_component/image_component_controller'\nimport ColorPicker from '../../../components/midwest/form/color_picker_component/color_picker_component_controller'\nimport Notification from '../../../components/midwest/notification_component/notification_component_controller'\nimport HorizontalScroll from '../../../components/midwest/horizontal_scroll_component/horizontal_scroll_component_controller'\nimport Table from '../../../components/midwest/table_component/table_component_controller'\nimport LoadMore from '../../../components/midwest/table_component/load_more_controller'\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'\n/* IMPORTS */\n\nexport { Card, Banner, CountdownTimer, Chart }\n\nexport function registerMidwestControllers (application: any) {\n application.register('midwest-card', Card)\n application.register('midwest-banner', Banner)\n application.register('midwest-countdown-timer', CountdownTimer)\n application.register('midwest-input', Input)\n application.register('midwest-file', File)\n application.register('midwest-dropdown', Dropdown)\n application.register('midwest-prose', Prose)\n application.register('midwest-dialog', Dialog)\n application.register('midwest-tabs', Tabs)\n application.register('midwest-tooltip', Tooltip)\n application.register('midwest-carousel', Carousel)\n application.register('midwest-form-live-summary', FormLiveSummary)\n application.register('midwest-form', Form)\n application.register('midwest-badge', Badge)\n application.register('midwest-confirmation', Confirmation)\n application.register('midwest-avatar-group', AvatarGroup)\n application.register('midwest-chart', Chart)\n application.register('midwest-range', Range)\n application.register('midwest-rating', Rating)\n application.register('midwest-autocomplete', Autocomplete)\n application.register('midwest-image', Image)\n application.register('midwest-color-picker', ColorPicker)\n application.register('midwest-notification', Notification)\n application.register('midwest-horizontal-scroll', HorizontalScroll)\n application.register('midwest-table', Table)\n application.register('midwest-load-more', LoadMore)\n 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 /* EXPORTS */\n}\n"],"names":["Confirmation"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCO,SAAS,2BAA4B,WAAkB,EAAA;AAC5D,EAAY,WAAA,CAAA,QAAA,CAAS,gBAAgB,IAAI,CAAA,CAAA;AACzC,EAAY,WAAA,CAAA,QAAA,CAAS,kBAAkB,MAAM,CAAA,CAAA;AAC7C,EAAY,WAAA,CAAA,QAAA,CAAS,2BAA2B,cAAc,CAAA,CAAA;AAC9D,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,gBAAgB,IAAI,CAAA,CAAA;AACzC,EAAY,WAAA,CAAA,QAAA,CAAS,oBAAoB,QAAQ,CAAA,CAAA;AACjD,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,kBAAkB,MAAM,CAAA,CAAA;AAC7C,EAAY,WAAA,CAAA,QAAA,CAAS,gBAAgB,IAAI,CAAA,CAAA;AACzC,EAAY,WAAA,CAAA,QAAA,CAAS,mBAAmB,OAAO,CAAA,CAAA;AAC/C,EAAY,WAAA,CAAA,QAAA,CAAS,oBAAoB,QAAQ,CAAA,CAAA;AACjD,EAAY,WAAA,CAAA,QAAA,CAAS,6BAA6B,eAAe,CAAA,CAAA;AACjE,EAAY,WAAA,CAAA,QAAA,CAAS,gBAAgB,IAAI,CAAA,CAAA;AACzC,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwBA,sBAAY,CAAA,CAAA;AACzD,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwB,WAAW,CAAA,CAAA;AACxD,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,kBAAkB,MAAM,CAAA,CAAA;AAC7C,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwB,YAAY,CAAA,CAAA;AACzD,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwB,WAAW,CAAA,CAAA;AACxD,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwB,YAAY,CAAA,CAAA;AACzD,EAAY,WAAA,CAAA,QAAA,CAAS,6BAA6B,gBAAgB,CAAA,CAAA;AAClE,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,qBAAqB,QAAQ,CAAA,CAAA;AAClD,EAAY,WAAA,CAAA,QAAA,CAAS,sBAAsB,UAAU,CAAA,CAAA;AACrD,EAAY,WAAA,CAAA,QAAA,CAAS,mBAAmB,MAAM,CAAA,CAAA;AAC9C,EAAY,WAAA,CAAA,QAAA,CAAS,qBAAqB,QAAQ,CAAA,CAAA;AAClD,EAAY,WAAA,CAAA,QAAA,CAAS,2BAA2B,cAAc,CAAA,CAAA;AAC9D,EAAY,WAAA,CAAA,QAAA,CAAS,sBAAsB,UAAU,CAAA,CAAA;AAEvD;;;;"}
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'\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 /* EXPORTS */\n}\n"],"names":["Confirmation"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCO,SAAS,2BAA4B,WAAkB,EAAA;AAC5D,EAAY,WAAA,CAAA,QAAA,CAAS,gBAAgB,IAAI,CAAA,CAAA;AACzC,EAAY,WAAA,CAAA,QAAA,CAAS,kBAAkB,MAAM,CAAA,CAAA;AAC7C,EAAY,WAAA,CAAA,QAAA,CAAS,2BAA2B,cAAc,CAAA,CAAA;AAC9D,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,gBAAgB,IAAI,CAAA,CAAA;AACzC,EAAY,WAAA,CAAA,QAAA,CAAS,oBAAoB,QAAQ,CAAA,CAAA;AACjD,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,kBAAkB,MAAM,CAAA,CAAA;AAC7C,EAAY,WAAA,CAAA,QAAA,CAAS,gBAAgB,IAAI,CAAA,CAAA;AACzC,EAAY,WAAA,CAAA,QAAA,CAAS,mBAAmB,OAAO,CAAA,CAAA;AAC/C,EAAY,WAAA,CAAA,QAAA,CAAS,oBAAoB,QAAQ,CAAA,CAAA;AACjD,EAAY,WAAA,CAAA,QAAA,CAAS,6BAA6B,eAAe,CAAA,CAAA;AACjE,EAAY,WAAA,CAAA,QAAA,CAAS,gBAAgB,IAAI,CAAA,CAAA;AACzC,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwBA,sBAAY,CAAA,CAAA;AACzD,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,kBAAkB,MAAM,CAAA,CAAA;AAC7C,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwB,YAAY,CAAA,CAAA;AACzD,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwB,WAAW,CAAA,CAAA;AACxD,EAAY,WAAA,CAAA,QAAA,CAAS,wBAAwB,YAAY,CAAA,CAAA;AACzD,EAAY,WAAA,CAAA,QAAA,CAAS,6BAA6B,gBAAgB,CAAA,CAAA;AAClE,EAAY,WAAA,CAAA,QAAA,CAAS,iBAAiB,KAAK,CAAA,CAAA;AAC3C,EAAY,WAAA,CAAA,QAAA,CAAS,qBAAqB,QAAQ,CAAA,CAAA;AAClD,EAAY,WAAA,CAAA,QAAA,CAAS,sBAAsB,UAAU,CAAA,CAAA;AACrD,EAAY,WAAA,CAAA,QAAA,CAAS,mBAAmB,MAAM,CAAA,CAAA;AAC9C,EAAY,WAAA,CAAA,QAAA,CAAS,qBAAqB,QAAQ,CAAA,CAAA;AAClD,EAAY,WAAA,CAAA,QAAA,CAAS,2BAA2B,cAAc,CAAA,CAAA;AAC9D,EAAY,WAAA,CAAA,QAAA,CAAS,sBAAsB,UAAU,CAAA,CAAA;AACrD,EAAY,WAAA,CAAA,QAAA,CAAS,iCAAiC,oBAAoB,CAAA,CAAA;AAC1E,EAAY,WAAA,CAAA,QAAA,CAAS,sBAAsB,SAAS,CAAA,CAAA;AACpD,EAAY,WAAA,CAAA,QAAA,CAAS,uBAAuB,UAAU,CAAA,CAAA;AACtD,EAAY,WAAA,CAAA,QAAA,CAAS,uBAAuB,UAAU,CAAA,CAAA;AAExD;;;;"}
@@ -0,0 +1,17 @@
1
+ import { Controller } from '@hotwired/stimulus';
2
+
3
+ class CodeBlock extends Controller {
4
+ static targets = ["source"];
5
+ async copy() {
6
+ const text = this.sourceTarget.textContent || "";
7
+ await navigator.clipboard.writeText(text.trim());
8
+ const button = this.element.querySelector(".code-block-copy");
9
+ if (!button)
10
+ return;
11
+ button.classList.add("is-copied");
12
+ setTimeout(() => button.classList.remove("is-copied"), 2e3);
13
+ }
14
+ }
15
+
16
+ export { CodeBlock as default };
17
+ //# sourceMappingURL=code_block_component_controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code_block_component_controller.js","sources":["../../../../../../../app/components/midwest/code_block_component/code_block_component_controller.ts"],"sourcesContent":["import { Controller } from '@hotwired/stimulus'\n\nexport default class CodeBlock extends Controller<HTMLElement> {\n static targets = ['source']\n\n declare readonly sourceTarget: HTMLElement\n\n async copy () {\n const text = this.sourceTarget.textContent || ''\n await navigator.clipboard.writeText(text.trim())\n\n const button = this.element.querySelector('.code-block-copy')\n if (!button) return\n\n button.classList.add('is-copied')\n setTimeout(() => button.classList.remove('is-copied'), 2000)\n }\n}\n"],"names":[],"mappings":";;AAEA,MAAqB,kBAAkB,UAAwB,CAAA;AAAA,EAC7D,OAAO,OAAU,GAAA,CAAC,QAAQ,CAAA,CAAA;AAAA,EAI1B,MAAM,IAAQ,GAAA;AACZ,IAAM,MAAA,IAAA,GAAO,IAAK,CAAA,YAAA,CAAa,WAAe,IAAA,EAAA,CAAA;AAC9C,IAAA,MAAM,SAAU,CAAA,SAAA,CAAU,SAAU,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAE/C,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,OAAQ,CAAA,aAAA,CAAc,kBAAkB,CAAA,CAAA;AAC5D,IAAA,IAAI,CAAC,MAAA;AAAQ,MAAA,OAAA;AAEb,IAAO,MAAA,CAAA,SAAA,CAAU,IAAI,WAAW,CAAA,CAAA;AAChC,IAAA,UAAA,CAAW,MAAM,MAAO,CAAA,SAAA,CAAU,MAAO,CAAA,WAAW,GAAG,GAAI,CAAA,CAAA;AAAA,GAC7D;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"dialog_component_controller.js","sources":["../../../../../../../app/components/midwest/dialog_component/dialog_component_controller.ts"],"sourcesContent":["\nimport { Controller } from '@hotwired/stimulus'\n\ndeclare global {\n interface Window {\n Turbo?: { visit(url: string): void }\n }\n}\n\nexport default class Dialog extends Controller<HTMLFormElement> {\n static targets = ['remoteContent', 'clearableForm']\n\n declare readonly hasRemoteContentTarget: boolean\n declare readonly remoteContentTarget: HTMLInputElement\n declare readonly remoteContentTargets: HTMLInputElement[]\n\n declare readonly hasClearableFormTarget: boolean\n declare readonly clearableFormTarget: HTMLFormElement\n declare readonly clearableFormTargets: HTMLFormElement[]\n\n static values = {\n resetFrame: { type: Boolean, default: false }\n }\n\n declare resetFrameValue: boolean\n declare readonly hasResetFrameValue: boolean\n\n private _previousFocus: HTMLElement | null = null\n\n connect () {\n document.addEventListener('turbo:frame-load', this.bindToggleEls)\n document.addEventListener('turbo:before-visit', this.dismiss)\n document.addEventListener('click', this.handleClickOutside)\n this.dialog.addEventListener('close', this.onClose)\n this.bindToggleEls()\n }\n\n disconnect () {\n document.removeEventListener('turbo:frame-load', this.bindToggleEls)\n document.removeEventListener('turbo:before-visit', this.dismiss)\n document.removeEventListener('click', this.handleClickOutside)\n this.dialog.removeEventListener('close', this.onClose)\n }\n\n get dialog () {\n return this.element\n }\n\n get htmlEl () {\n return document.documentElement\n }\n\n get toggleEls () {\n return document.querySelectorAll(`[data-toggle-dialog=\"${this.dialog.id}\"]`)\n }\n\n get frameEl () {\n return this.dialog.querySelector('turbo-frame')\n }\n\n // Arrow function so `this` is stable for add/removeEventListener pairing.\n private handleClickOutside = (event: Event) => {\n if (event.target !== this.dialog) return\n this.dismiss()\n }\n\n // Arrow function so `this` is stable for add/removeEventListener pairing.\n private bindToggleEls = () => {\n this.toggleEls.forEach((el) => {\n el.addEventListener('click', this.toggle.bind(this))\n })\n }\n\n remoteContentTargetConnected () {\n this.show()\n }\n\n toggle (e: any = undefined) {\n // if clicked elem is a link, prevent default behavior.\n if (e instanceof Event) e.preventDefault()\n this.htmlEl.classList.toggle('overflow-hidden', true)\n\n if (this.dialog.open) {\n this.dialog.close()\n } else {\n this._previousFocus = document.activeElement as HTMLElement\n this.dialog.showModal()\n this.dialog.addEventListener('keydown', this.handleFocusTrap)\n }\n }\n\n show (e: any = undefined) {\n // if clicked elem is a link, prevent default behavior.\n if (e instanceof Event) e.preventDefault()\n this.htmlEl.classList.toggle('overflow-hidden', true)\n this._previousFocus = document.activeElement as HTMLElement\n this.dialog.showModal()\n this.dialog.addEventListener('keydown', this.handleFocusTrap)\n }\n\n hide ({ detail }: { detail: { success: boolean; fetchResponse?: { location: URL } } }) {\n if (!detail.success) return\n const redirectUrl = detail.fetchResponse?.location?.href\n this.dismiss()\n if (redirectUrl) window.Turbo?.visit(redirectUrl)\n }\n\n // Arrow function so `this` is stable for add/removeEventListener pairing.\n dismiss = () => {\n this.dialog.close()\n }\n\n reloadPage () {\n window.location.reload()\n }\n\n private handleFocusTrap = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return\n\n const focusable = Array.from(\n this.dialog.querySelectorAll<HTMLElement>(\n 'a[href], button:not([disabled]), textarea, input, select, [tabindex]:not([tabindex=\"-1\"])'\n )\n ).filter(el => !el.closest('[inert]'))\n\n if (focusable.length === 0) return\n\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n\n if (event.shiftKey) {\n if (document.activeElement === first) {\n event.preventDefault()\n last.focus()\n }\n } else {\n if (document.activeElement === last) {\n event.preventDefault()\n first.focus()\n }\n }\n }\n\n // Arrow function so `this` is stable for add/removeEventListener pairing.\n private onClose = async () => {\n this.dialog.removeEventListener('keydown', this.handleFocusTrap)\n this._previousFocus?.focus()\n this._previousFocus = null\n this.htmlEl.classList.toggle('overflow-hidden', false)\n await this.delay(500)\n this.resetForm()\n this.resetFrame()\n }\n\n private resetFrame () {\n if (!this.resetFrameValue || (this.frameEl == null)) return\n\n this.frameEl.innerHTML = ''\n this.frameEl.removeAttribute('src')\n }\n\n private resetForm () {\n if (!this.hasClearableFormTarget) return\n this.clearableFormTarget.reset()\n }\n\n async delay (time = 500) {\n return await new Promise((resolve) => {\n setTimeout(resolve, time)\n })\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dialog_component_controller.js","sources":["../../../../../../../app/components/midwest/dialog_component/dialog_component_controller.ts"],"sourcesContent":["import { Controller } from '@hotwired/stimulus'\n\ndeclare global {\n interface Window {\n Turbo?: { visit(url: string): void }\n }\n}\n\nexport default class Dialog extends Controller<HTMLFormElement> {\n static targets = ['remoteContent', 'clearableForm']\n\n declare readonly hasRemoteContentTarget: boolean\n declare readonly remoteContentTarget: HTMLInputElement\n declare readonly remoteContentTargets: HTMLInputElement[]\n\n declare readonly hasClearableFormTarget: boolean\n declare readonly clearableFormTarget: HTMLFormElement\n declare readonly clearableFormTargets: HTMLFormElement[]\n\n static values = {\n resetFrame: { type: Boolean, default: false }\n }\n\n declare resetFrameValue: boolean\n declare readonly hasResetFrameValue: boolean\n\n private _previousFocus: HTMLElement | null = null\n\n connect () {\n document.addEventListener('turbo:frame-load', this.bindToggleEls)\n document.addEventListener('turbo:before-visit', this.dismiss)\n document.addEventListener('click', this.handleClickOutside)\n this.dialog.addEventListener('close', this.onClose)\n this.bindToggleEls()\n }\n\n disconnect () {\n document.removeEventListener('turbo:frame-load', this.bindToggleEls)\n document.removeEventListener('turbo:before-visit', this.dismiss)\n document.removeEventListener('click', this.handleClickOutside)\n this.dialog.removeEventListener('close', this.onClose)\n }\n\n get dialog () {\n return this.element\n }\n\n get htmlEl () {\n return document.documentElement\n }\n\n get toggleEls () {\n return document.querySelectorAll(`[data-toggle-dialog=\"${this.dialog.id}\"]`)\n }\n\n get frameEl () {\n return this.dialog.querySelector('turbo-frame')\n }\n\n // Arrow function so `this` is stable for add/removeEventListener pairing.\n private handleClickOutside = (event: Event) => {\n if (event.target !== this.dialog) return\n this.dismiss()\n }\n\n // Arrow function so `this` is stable for add/removeEventListener pairing.\n private bindToggleEls = () => {\n this.toggleEls.forEach((el) => {\n el.addEventListener('click', this.toggle.bind(this))\n })\n }\n\n remoteContentTargetConnected () {\n this.show()\n }\n\n toggle (e: any = undefined) {\n // if clicked elem is a link, prevent default behavior.\n if (e instanceof Event) e.preventDefault()\n this.htmlEl.classList.toggle('overflow-hidden', true)\n\n if (this.dialog.open) {\n this.dialog.close()\n } else {\n this._previousFocus = document.activeElement as HTMLElement\n this.dialog.showModal()\n this.dialog.addEventListener('keydown', this.handleFocusTrap)\n }\n }\n\n show (e: any = undefined) {\n // if clicked elem is a link, prevent default behavior.\n if (e instanceof Event) e.preventDefault()\n this.htmlEl.classList.toggle('overflow-hidden', true)\n this._previousFocus = document.activeElement as HTMLElement\n this.dialog.showModal()\n this.dialog.addEventListener('keydown', this.handleFocusTrap)\n }\n\n hide ({ detail }: { detail: { success: boolean; fetchResponse?: { location: URL } } }) {\n if (!detail.success) return\n const redirectUrl = detail.fetchResponse?.location?.href\n this.dismiss()\n if (redirectUrl) window.Turbo?.visit(redirectUrl)\n }\n\n // Arrow function so `this` is stable for add/removeEventListener pairing.\n dismiss = () => {\n this.dialog.close()\n }\n\n reloadPage () {\n window.location.reload()\n }\n\n private handleFocusTrap = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return\n\n const focusable = Array.from(\n this.dialog.querySelectorAll<HTMLElement>(\n 'a[href], button:not([disabled]), textarea, input, select, [tabindex]:not([tabindex=\"-1\"])'\n )\n ).filter(el => !el.closest('[inert]'))\n\n if (focusable.length === 0) return\n\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n\n if (event.shiftKey) {\n if (document.activeElement === first) {\n event.preventDefault()\n last.focus()\n }\n } else {\n if (document.activeElement === last) {\n event.preventDefault()\n first.focus()\n }\n }\n }\n\n // Arrow function so `this` is stable for add/removeEventListener pairing.\n private onClose = async () => {\n this.dialog.removeEventListener('keydown', this.handleFocusTrap)\n this._previousFocus?.focus()\n this._previousFocus = null\n this.htmlEl.classList.toggle('overflow-hidden', false)\n await this.delay(500)\n this.resetForm()\n this.resetFrame()\n }\n\n private resetFrame () {\n if (!this.resetFrameValue || (this.frameEl == null)) return\n\n this.frameEl.innerHTML = ''\n this.frameEl.removeAttribute('src')\n }\n\n private resetForm () {\n if (!this.hasClearableFormTarget) return\n this.clearableFormTarget.reset()\n }\n\n async delay (time = 500) {\n return await new Promise((resolve) => {\n setTimeout(resolve, time)\n })\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,243 @@
1
+ import { Controller } from '@hotwired/stimulus';
2
+
3
+ class DatePicker extends Controller {
4
+ static targets = ["input", "display", "trigger", "popover", "grid", "monthLabel"];
5
+ static values = {
6
+ month: String,
7
+ min: String,
8
+ max: String
9
+ };
10
+ currentMonth = /* @__PURE__ */ new Date();
11
+ connect() {
12
+ if (this.monthValue) {
13
+ this.currentMonth = this.parseDate(this.monthValue) || /* @__PURE__ */ new Date();
14
+ }
15
+ this.popoverTarget.addEventListener("toggle", this.handleToggle);
16
+ this.gridTarget.addEventListener("keydown", this.handleGridKeydown);
17
+ }
18
+ disconnect() {
19
+ this.popoverTarget.removeEventListener("toggle", this.handleToggle);
20
+ this.gridTarget.removeEventListener("keydown", this.handleGridKeydown);
21
+ }
22
+ toggle() {
23
+ this.popoverTarget.togglePopover();
24
+ }
25
+ handleToggle = (event) => {
26
+ const popover = event.target;
27
+ const open = popover.matches(":popover-open");
28
+ this.triggerTarget.setAttribute("aria-expanded", String(open));
29
+ if (open) {
30
+ requestAnimationFrame(() => this.focusGridDate());
31
+ } else {
32
+ this.triggerTarget.focus();
33
+ }
34
+ };
35
+ selectDate(event) {
36
+ const button = event.currentTarget;
37
+ const dateStr = button.dataset.date;
38
+ if (!dateStr)
39
+ return;
40
+ this.inputTarget.value = dateStr;
41
+ const date = this.parseDate(dateStr);
42
+ if (date) {
43
+ this.updateDisplayText(this.formatDisplay(date));
44
+ this.currentMonth = new Date(date.getFullYear(), date.getMonth(), 1);
45
+ this.monthValue = this.formatISO(this.currentMonth);
46
+ }
47
+ this.inputTarget.dispatchEvent(new Event("change", { bubbles: true }));
48
+ this.renderCalendar();
49
+ this.popoverTarget.hidePopover();
50
+ }
51
+ selectToday() {
52
+ const today = /* @__PURE__ */ new Date();
53
+ const dateStr = this.formatISO(today);
54
+ if (this.isDisabledDate(today))
55
+ return;
56
+ this.inputTarget.value = dateStr;
57
+ this.updateDisplayText(this.formatDisplay(today));
58
+ this.currentMonth = new Date(today.getFullYear(), today.getMonth(), 1);
59
+ this.monthValue = this.formatISO(this.currentMonth);
60
+ this.inputTarget.dispatchEvent(new Event("change", { bubbles: true }));
61
+ this.renderCalendar();
62
+ this.popoverTarget.hidePopover();
63
+ }
64
+ clear() {
65
+ this.inputTarget.value = "";
66
+ this.updateDisplayText(this.element.dataset.placeholder || "Select a date");
67
+ this.inputTarget.dispatchEvent(new Event("change", { bubbles: true }));
68
+ this.renderCalendar();
69
+ this.popoverTarget.hidePopover();
70
+ }
71
+ prevMonth() {
72
+ this.currentMonth = new Date(this.currentMonth.getFullYear(), this.currentMonth.getMonth() - 1, 1);
73
+ this.monthValue = this.formatISO(this.currentMonth);
74
+ this.renderCalendar();
75
+ }
76
+ nextMonth() {
77
+ this.currentMonth = new Date(this.currentMonth.getFullYear(), this.currentMonth.getMonth() + 1, 1);
78
+ this.monthValue = this.formatISO(this.currentMonth);
79
+ this.renderCalendar();
80
+ }
81
+ // -- Keyboard navigation (WAI-ARIA grid pattern) --
82
+ handleGridKeydown = (event) => {
83
+ const button = event.target;
84
+ if (!button.dataset?.date)
85
+ return;
86
+ const current = this.parseDate(button.dataset.date);
87
+ if (!current)
88
+ return;
89
+ const next = this.nextDateForKey(event.key, current, event.shiftKey);
90
+ if (!next)
91
+ return;
92
+ event.preventDefault();
93
+ if (this.isDisabledDate(next))
94
+ return;
95
+ if (next.getMonth() !== this.currentMonth.getMonth() || next.getFullYear() !== this.currentMonth.getFullYear()) {
96
+ this.currentMonth = new Date(next.getFullYear(), next.getMonth(), 1);
97
+ this.monthValue = this.formatISO(this.currentMonth);
98
+ this.renderCalendar();
99
+ }
100
+ this.focusButton(next);
101
+ };
102
+ // -- Calendar rendering --
103
+ renderCalendar() {
104
+ const year = this.currentMonth.getFullYear();
105
+ const month = this.currentMonth.getMonth();
106
+ this.monthLabelTarget.textContent = new Intl.DateTimeFormat("en-US", { month: "long", year: "numeric" }).format(this.currentMonth);
107
+ const firstDay = new Date(year, month, 1);
108
+ const startDate = new Date(firstDay);
109
+ startDate.setDate(startDate.getDate() - startDate.getDay());
110
+ const lastDay = new Date(year, month + 1, 0);
111
+ const endDate = new Date(lastDay);
112
+ endDate.setDate(endDate.getDate() + (6 - endDate.getDay()));
113
+ const selectedValue = this.inputTarget.value;
114
+ const today = this.formatISO(/* @__PURE__ */ new Date());
115
+ let html = "";
116
+ const cursor = new Date(startDate);
117
+ while (cursor <= endDate) {
118
+ html += "<tr>";
119
+ for (let i = 0; i < 7; i++) {
120
+ const dateStr = this.formatISO(cursor);
121
+ const isOutside = cursor.getMonth() !== month;
122
+ const isSelected = dateStr === selectedValue;
123
+ const isToday = dateStr === today;
124
+ const isDisabled = this.isDisabledDate(cursor);
125
+ const classes = ["date-picker-day"];
126
+ if (isOutside)
127
+ classes.push("is-outside");
128
+ if (isSelected)
129
+ classes.push("is-selected");
130
+ if (isToday)
131
+ classes.push("is-today");
132
+ if (isDisabled)
133
+ classes.push("is-disabled");
134
+ const ariaLabel = new Intl.DateTimeFormat("en-US", { month: "long", day: "numeric", year: "numeric" }).format(cursor);
135
+ html += `<td role="gridcell">`;
136
+ html += `<button type="button" class="${classes.join(" ")}"${isDisabled ? " disabled" : ""}`;
137
+ html += ` tabindex="-1"`;
138
+ html += ` data-date="${dateStr}" data-action="midwest-date-picker#selectDate"`;
139
+ html += ` aria-label="${ariaLabel}"${isSelected ? ' aria-selected="true"' : ""}>`;
140
+ html += `${cursor.getDate()}</button></td>`;
141
+ cursor.setDate(cursor.getDate() + 1);
142
+ }
143
+ html += "</tr>";
144
+ }
145
+ this.gridTarget.innerHTML = html;
146
+ this.setRovingTabindex();
147
+ }
148
+ // -- Focus helpers --
149
+ focusGridDate() {
150
+ this.setRovingTabindex();
151
+ const target = this.gridTarget.querySelector('.date-picker-day[tabindex="0"]');
152
+ target?.focus();
153
+ }
154
+ focusButton(date) {
155
+ const dateStr = this.formatISO(date);
156
+ const button = this.gridTarget.querySelector(`[data-date="${dateStr}"]`);
157
+ if (!button)
158
+ return;
159
+ this.gridTarget.querySelectorAll('.date-picker-day[tabindex="0"]').forEach((b) => {
160
+ b.tabIndex = -1;
161
+ });
162
+ button.tabIndex = 0;
163
+ button.focus();
164
+ }
165
+ setRovingTabindex() {
166
+ const selected = this.gridTarget.querySelector(".is-selected");
167
+ const today = this.gridTarget.querySelector(".is-today:not(.is-outside)");
168
+ const firstDay = this.gridTarget.querySelector(".date-picker-day:not(.is-outside):not(:disabled)");
169
+ const target = selected || today || firstDay;
170
+ if (target)
171
+ target.tabIndex = 0;
172
+ }
173
+ nextDateForKey(key, current, shift) {
174
+ switch (key) {
175
+ case "ArrowRight":
176
+ return this.addDays(current, 1);
177
+ case "ArrowLeft":
178
+ return this.addDays(current, -1);
179
+ case "ArrowDown":
180
+ return this.addDays(current, 7);
181
+ case "ArrowUp":
182
+ return this.addDays(current, -7);
183
+ case "Home":
184
+ return this.addDays(current, -current.getDay());
185
+ case "End":
186
+ return this.addDays(current, 6 - current.getDay());
187
+ case "PageUp":
188
+ return this.shiftMonth(current, shift ? -12 : -1);
189
+ case "PageDown":
190
+ return this.shiftMonth(current, shift ? 12 : 1);
191
+ default:
192
+ return null;
193
+ }
194
+ }
195
+ // -- Date arithmetic --
196
+ addDays(date, days) {
197
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days);
198
+ }
199
+ shiftMonth(date, delta) {
200
+ const target = new Date(date.getFullYear(), date.getMonth() + delta, 1);
201
+ const lastDay = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();
202
+ const day = Math.min(date.getDate(), lastDay);
203
+ return new Date(target.getFullYear(), target.getMonth(), day);
204
+ }
205
+ // -- Utilities --
206
+ isDisabledDate(date) {
207
+ if (this.hasMinValue) {
208
+ const min = this.parseDate(this.minValue);
209
+ if (min && date < min)
210
+ return true;
211
+ }
212
+ if (this.hasMaxValue) {
213
+ const max = this.parseDate(this.maxValue);
214
+ if (max && date > max)
215
+ return true;
216
+ }
217
+ return false;
218
+ }
219
+ parseDate(str) {
220
+ const parts = str.split("-").map(Number);
221
+ if (parts.length < 3)
222
+ return null;
223
+ return new Date(parts[0], parts[1] - 1, parts[2]);
224
+ }
225
+ formatISO(date) {
226
+ const y = date.getFullYear();
227
+ const m = String(date.getMonth() + 1).padStart(2, "0");
228
+ const d = String(date.getDate()).padStart(2, "0");
229
+ return `${y}-${m}-${d}`;
230
+ }
231
+ updateDisplayText(text) {
232
+ const valueEl = this.displayTarget.querySelector(".value");
233
+ if (valueEl) {
234
+ valueEl.textContent = text;
235
+ }
236
+ }
237
+ formatDisplay(date) {
238
+ return new Intl.DateTimeFormat("en-US", { month: "long", day: "numeric", year: "numeric" }).format(date);
239
+ }
240
+ }
241
+
242
+ export { DatePicker as default };
243
+ //# sourceMappingURL=date_picker_component_controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date_picker_component_controller.js","sources":["../../../../../../../../app/components/midwest/form/date_picker_component/date_picker_component_controller.ts"],"sourcesContent":["import { Controller } from '@hotwired/stimulus'\n\nexport default class DatePicker extends Controller<HTMLElement> {\n static targets = ['input', 'display', 'trigger', 'popover', 'grid', 'monthLabel']\n static values = {\n month: String,\n min: String,\n max: String\n }\n\n declare readonly inputTarget: HTMLInputElement\n declare readonly displayTarget: HTMLElement\n declare readonly triggerTarget: HTMLElement\n declare readonly popoverTarget: HTMLElement\n declare readonly gridTarget: HTMLElement\n declare readonly monthLabelTarget: HTMLElement\n declare monthValue: string\n declare minValue: string\n declare maxValue: string\n declare readonly hasMinValue: boolean\n declare readonly hasMaxValue: boolean\n\n private currentMonth: Date = new Date()\n\n connect () {\n if (this.monthValue) {\n this.currentMonth = this.parseDate(this.monthValue) || new Date()\n }\n this.popoverTarget.addEventListener('toggle', this.handleToggle)\n this.gridTarget.addEventListener('keydown', this.handleGridKeydown)\n }\n\n disconnect () {\n this.popoverTarget.removeEventListener('toggle', this.handleToggle)\n this.gridTarget.removeEventListener('keydown', this.handleGridKeydown)\n }\n\n toggle () {\n this.popoverTarget.togglePopover()\n }\n\n private handleToggle = (event: Event) => {\n const popover = event.target as HTMLElement\n const open = popover.matches(':popover-open')\n this.triggerTarget.setAttribute('aria-expanded', String(open))\n\n if (open) {\n requestAnimationFrame(() => this.focusGridDate())\n } else {\n this.triggerTarget.focus()\n }\n }\n\n selectDate (event: Event) {\n const button = event.currentTarget as HTMLButtonElement\n const dateStr = button.dataset.date\n if (!dateStr) return\n\n this.inputTarget.value = dateStr\n\n const date = this.parseDate(dateStr)\n if (date) {\n this.updateDisplayText(this.formatDisplay(date))\n this.currentMonth = new Date(date.getFullYear(), date.getMonth(), 1)\n this.monthValue = this.formatISO(this.currentMonth)\n }\n\n this.inputTarget.dispatchEvent(new Event('change', { bubbles: true }))\n this.renderCalendar()\n this.popoverTarget.hidePopover()\n }\n\n selectToday () {\n const today = new Date()\n const dateStr = this.formatISO(today)\n\n if (this.isDisabledDate(today)) return\n\n this.inputTarget.value = dateStr\n this.updateDisplayText(this.formatDisplay(today))\n this.currentMonth = new Date(today.getFullYear(), today.getMonth(), 1)\n this.monthValue = this.formatISO(this.currentMonth)\n this.inputTarget.dispatchEvent(new Event('change', { bubbles: true }))\n this.renderCalendar()\n this.popoverTarget.hidePopover()\n }\n\n clear () {\n this.inputTarget.value = ''\n this.updateDisplayText(this.element.dataset.placeholder || 'Select a date')\n this.inputTarget.dispatchEvent(new Event('change', { bubbles: true }))\n this.renderCalendar()\n this.popoverTarget.hidePopover()\n }\n\n prevMonth () {\n this.currentMonth = new Date(this.currentMonth.getFullYear(), this.currentMonth.getMonth() - 1, 1)\n this.monthValue = this.formatISO(this.currentMonth)\n this.renderCalendar()\n }\n\n nextMonth () {\n this.currentMonth = new Date(this.currentMonth.getFullYear(), this.currentMonth.getMonth() + 1, 1)\n this.monthValue = this.formatISO(this.currentMonth)\n this.renderCalendar()\n }\n\n // -- Keyboard navigation (WAI-ARIA grid pattern) --\n\n private handleGridKeydown = (event: KeyboardEvent) => {\n const button = event.target as HTMLButtonElement\n if (!button.dataset?.date) return\n\n const current = this.parseDate(button.dataset.date)\n if (!current) return\n\n const next = this.nextDateForKey(event.key, current, event.shiftKey)\n if (!next) return\n\n event.preventDefault()\n\n if (this.isDisabledDate(next)) return\n\n if (next.getMonth() !== this.currentMonth.getMonth() ||\n next.getFullYear() !== this.currentMonth.getFullYear()) {\n this.currentMonth = new Date(next.getFullYear(), next.getMonth(), 1)\n this.monthValue = this.formatISO(this.currentMonth)\n this.renderCalendar()\n }\n\n this.focusButton(next)\n }\n\n // -- Calendar rendering --\n\n private renderCalendar () {\n const year = this.currentMonth.getFullYear()\n const month = this.currentMonth.getMonth()\n\n this.monthLabelTarget.textContent = new Intl.DateTimeFormat('en-US', { month: 'long', year: 'numeric' }).format(this.currentMonth)\n\n const firstDay = new Date(year, month, 1)\n const startDate = new Date(firstDay)\n startDate.setDate(startDate.getDate() - startDate.getDay())\n\n const lastDay = new Date(year, month + 1, 0)\n const endDate = new Date(lastDay)\n endDate.setDate(endDate.getDate() + (6 - endDate.getDay()))\n\n const selectedValue = this.inputTarget.value\n const today = this.formatISO(new Date())\n let html = ''\n const cursor = new Date(startDate)\n\n while (cursor <= endDate) {\n html += '<tr>'\n for (let i = 0; i < 7; i++) {\n const dateStr = this.formatISO(cursor)\n const isOutside = cursor.getMonth() !== month\n const isSelected = dateStr === selectedValue\n const isToday = dateStr === today\n const isDisabled = this.isDisabledDate(cursor)\n\n const classes = ['date-picker-day']\n if (isOutside) classes.push('is-outside')\n if (isSelected) classes.push('is-selected')\n if (isToday) classes.push('is-today')\n if (isDisabled) classes.push('is-disabled')\n\n const ariaLabel = new Intl.DateTimeFormat('en-US', { month: 'long', day: 'numeric', year: 'numeric' }).format(cursor)\n\n html += `<td role=\"gridcell\">`\n html += `<button type=\"button\" class=\"${classes.join(' ')}\"${isDisabled ? ' disabled' : ''}`\n html += ` tabindex=\"-1\"`\n html += ` data-date=\"${dateStr}\" data-action=\"midwest-date-picker#selectDate\"`\n html += ` aria-label=\"${ariaLabel}\"${isSelected ? ' aria-selected=\"true\"' : ''}>`\n html += `${cursor.getDate()}</button></td>`\n\n cursor.setDate(cursor.getDate() + 1)\n }\n html += '</tr>'\n }\n\n this.gridTarget.innerHTML = html\n this.setRovingTabindex()\n }\n\n // -- Focus helpers --\n\n private focusGridDate () {\n this.setRovingTabindex()\n const target = this.gridTarget.querySelector<HTMLButtonElement>('.date-picker-day[tabindex=\"0\"]')\n target?.focus()\n }\n\n private focusButton (date: Date) {\n const dateStr = this.formatISO(date)\n const button = this.gridTarget.querySelector<HTMLButtonElement>(`[data-date=\"${dateStr}\"]`)\n if (!button) return\n\n this.gridTarget.querySelectorAll<HTMLButtonElement>('.date-picker-day[tabindex=\"0\"]').forEach(b => {\n b.tabIndex = -1\n })\n button.tabIndex = 0\n button.focus()\n }\n\n private setRovingTabindex () {\n const selected = this.gridTarget.querySelector<HTMLButtonElement>('.is-selected')\n const today = this.gridTarget.querySelector<HTMLButtonElement>('.is-today:not(.is-outside)')\n const firstDay = this.gridTarget.querySelector<HTMLButtonElement>('.date-picker-day:not(.is-outside):not(:disabled)')\n const target = selected || today || firstDay\n if (target) target.tabIndex = 0\n }\n\n private nextDateForKey (key: string, current: Date, shift: boolean): Date | null {\n switch (key) {\n case 'ArrowRight': return this.addDays(current, 1)\n case 'ArrowLeft': return this.addDays(current, -1)\n case 'ArrowDown': return this.addDays(current, 7)\n case 'ArrowUp': return this.addDays(current, -7)\n case 'Home': return this.addDays(current, -current.getDay())\n case 'End': return this.addDays(current, 6 - current.getDay())\n case 'PageUp': return this.shiftMonth(current, shift ? -12 : -1)\n case 'PageDown': return this.shiftMonth(current, shift ? 12 : 1)\n default: return null\n }\n }\n\n // -- Date arithmetic --\n\n private addDays (date: Date, days: number): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days)\n }\n\n private shiftMonth (date: Date, delta: number): Date {\n const target = new Date(date.getFullYear(), date.getMonth() + delta, 1)\n const lastDay = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate()\n const day = Math.min(date.getDate(), lastDay)\n return new Date(target.getFullYear(), target.getMonth(), day)\n }\n\n // -- Utilities --\n\n private isDisabledDate (date: Date): boolean {\n if (this.hasMinValue) {\n const min = this.parseDate(this.minValue)\n if (min && date < min) return true\n }\n if (this.hasMaxValue) {\n const max = this.parseDate(this.maxValue)\n if (max && date > max) return true\n }\n return false\n }\n\n private parseDate (str: string): Date | null {\n const parts = str.split('-').map(Number)\n if (parts.length < 3) return null\n return new Date(parts[0], parts[1] - 1, parts[2])\n }\n\n private formatISO (date: Date): string {\n const y = date.getFullYear()\n const m = String(date.getMonth() + 1).padStart(2, '0')\n const d = String(date.getDate()).padStart(2, '0')\n return `${y}-${m}-${d}`\n }\n\n private updateDisplayText (text: string) {\n const valueEl = this.displayTarget.querySelector('.value')\n if (valueEl) {\n valueEl.textContent = text\n }\n }\n\n private formatDisplay (date: Date): string {\n return new Intl.DateTimeFormat('en-US', { month: 'long', day: 'numeric', year: 'numeric' }).format(date)\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
3
3
  class File extends Controller {
4
- static targets = ["input", "output"];
4
+ static targets = ["input", "output", "dropzone"];
5
+ dragCounter = 0;
5
6
  // Arrow function so `this` is stable for add/removeEventListener pairing.
6
7
  handleChange = () => {
7
8
  this.renderPreviews();
@@ -11,8 +12,41 @@ class File extends Controller {
11
12
  }
12
13
  disconnect() {
13
14
  this.inputTarget.removeEventListener("change", this.handleChange);
15
+ this.dragCounter = 0;
14
16
  }
17
+ // --- Drag-and-drop ---
18
+ dragenter(e) {
19
+ e.preventDefault();
20
+ this.dragCounter++;
21
+ this.dropzoneTarget.classList.add("is-dragover");
22
+ }
23
+ dragover(e) {
24
+ e.preventDefault();
25
+ }
26
+ dragleave(e) {
27
+ e.preventDefault();
28
+ this.dragCounter--;
29
+ if (this.dragCounter <= 0) {
30
+ this.dragCounter = 0;
31
+ this.dropzoneTarget.classList.remove("is-dragover");
32
+ }
33
+ }
34
+ drop(e) {
35
+ e.preventDefault();
36
+ this.dragCounter = 0;
37
+ this.dropzoneTarget.classList.remove("is-dragover");
38
+ if (!e.dataTransfer?.files.length)
39
+ return;
40
+ this.inputTarget.files = e.dataTransfer.files;
41
+ this.inputTarget.dispatchEvent(new Event("change", { bubbles: true }));
42
+ }
43
+ browse() {
44
+ this.inputTarget.click();
45
+ }
46
+ // --- Preview rendering ---
15
47
  renderPreviews() {
48
+ if (!this.hasOutputTarget)
49
+ return;
16
50
  this.outputTarget.innerHTML = "";
17
51
  this.files.forEach((file) => {
18
52
  this.outputTarget.appendChild(this.buildPreview(file));
@@ -1 +1 @@
1
- {"version":3,"file":"file_component_controller.js","sources":["../../../../../../../../app/components/midwest/form/file_component/file_component_controller.ts"],"sourcesContent":["\nimport { Controller } from '@hotwired/stimulus'\n\nexport default class File extends Controller<HTMLFormElement> {\n static targets = ['input', 'output']\n\n declare readonly hasInputTarget: boolean\n declare readonly inputTarget: HTMLInputElement\n declare readonly inputTargets: HTMLInputElement[]\n\n declare readonly hasOutputTarget: boolean\n declare readonly outputTarget: HTMLInputElement\n declare readonly outputTargets: HTMLInputElement[]\n\n // Arrow function so `this` is stable for add/removeEventListener pairing.\n private handleChange = () => {\n this.renderPreviews()\n }\n\n connect () {\n this.inputTarget.addEventListener('change', this.handleChange)\n }\n\n disconnect () {\n this.inputTarget.removeEventListener('change', this.handleChange)\n }\n\n private renderPreviews () {\n this.outputTarget.innerHTML = ''\n this.files.forEach(file => {\n this.outputTarget.appendChild(this.buildPreview(file))\n })\n }\n\n private buildPreview (file: globalThis.File): HTMLElement {\n // Replace slash in MIME type (e.g. \"image/png\") with dash for a valid CSS class name.\n const safeType = file.type ? file.type.replace('/', '-') : 'unknown'\n\n const div = document.createElement('div')\n div.className = `file-preview file-preview-${safeType} layer-children`\n\n const typeBadge = document.createElement('span')\n typeBadge.className = 'midwest-badge size-default theme-primary'\n const typeValue = document.createElement('span')\n typeValue.className = 'value'\n typeValue.textContent = file.type || 'Unknown'\n typeBadge.appendChild(typeValue)\n div.appendChild(typeBadge)\n\n const sizeBadge = document.createElement('span')\n sizeBadge.className = 'midwest-badge size-default theme-gray ml-auto'\n const sizeValue = document.createElement('span')\n sizeValue.className = 'value'\n sizeValue.textContent = new Intl.NumberFormat(undefined, {\n notation: 'compact',\n style: 'unit',\n unit: 'byte',\n unitDisplay: 'narrow'\n }).format(file.size)\n sizeBadge.appendChild(sizeValue)\n div.appendChild(sizeBadge)\n\n if (file.type.startsWith('image/')) {\n const img = document.createElement('img')\n img.src = window.URL.createObjectURL(file)\n div.appendChild(img)\n } else {\n const placeholder = document.createElement('div')\n placeholder.className = 'placeholder-file'\n placeholder.innerHTML = file.type.startsWith('video/') ? this.videoIcon : this.fileIcon\n div.appendChild(placeholder)\n }\n\n return div\n }\n\n private readonly fileIcon = '<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"ionicon\" viewBox=\"0 0 512 512\" aria-hidden=\"true\"><path d=\"M416 221.25V416a48 48 0 01-48 48H144a48 48 0 01-48-48V96a48 48 0 0148-48h98.75a32 32 0 0122.62 9.37l141.26 141.26a32 32 0 019.37 22.62z\" fill=\"none\" stroke=\"currentColor\" stroke-linejoin=\"round\" stroke-width=\"32\"/><path d=\"M256 56v120a32 32 0 0032 32h120\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"32\"/></svg>'\n\n private readonly videoIcon = '<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"ionicon\" viewBox=\"0 0 512 512\" aria-hidden=\"true\"><path d=\"M374.79 308.78L457.5 367a16 16 0 0022.5-14.62V159.62A16 16 0 00457.5 145l-82.71 58.22A16 16 0 00368 216.3v79.4a16 16 0 006.79 13.08z\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"32\"/><path d=\"M268 384H84a52.15 52.15 0 01-52-52V180a52.15 52.15 0 0152-52h184.48A51.68 51.68 0 01320 179.52V332a52.15 52.15 0 01-52 52z\" fill=\"none\" stroke=\"currentColor\" stroke-miterlimit=\"10\" stroke-width=\"32\"/></svg>'\n\n get files () {\n if (this.inputTarget.files == null) {\n return []\n }\n return Array.from(this.inputTarget.files)\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file_component_controller.js","sources":["../../../../../../../../app/components/midwest/form/file_component/file_component_controller.ts"],"sourcesContent":["\nimport { Controller } from '@hotwired/stimulus'\n\nexport default class File extends Controller<HTMLFormElement> {\n static targets = ['input', 'output', 'dropzone']\n\n declare readonly hasInputTarget: boolean\n declare readonly inputTarget: HTMLInputElement\n declare readonly inputTargets: HTMLInputElement[]\n\n declare readonly hasOutputTarget: boolean\n declare readonly outputTarget: HTMLInputElement\n declare readonly outputTargets: HTMLInputElement[]\n\n declare readonly hasDropzoneTarget: boolean\n declare readonly dropzoneTarget: HTMLElement\n\n private dragCounter = 0\n\n // Arrow function so `this` is stable for add/removeEventListener pairing.\n private handleChange = () => {\n this.renderPreviews()\n }\n\n connect () {\n this.inputTarget.addEventListener('change', this.handleChange)\n }\n\n disconnect () {\n this.inputTarget.removeEventListener('change', this.handleChange)\n this.dragCounter = 0\n }\n\n // --- Drag-and-drop ---\n\n dragenter (e: DragEvent) {\n e.preventDefault()\n this.dragCounter++\n this.dropzoneTarget.classList.add('is-dragover')\n }\n\n dragover (e: DragEvent) {\n e.preventDefault()\n }\n\n dragleave (e: DragEvent) {\n e.preventDefault()\n this.dragCounter--\n if (this.dragCounter <= 0) {\n this.dragCounter = 0\n this.dropzoneTarget.classList.remove('is-dragover')\n }\n }\n\n drop (e: DragEvent) {\n e.preventDefault()\n this.dragCounter = 0\n this.dropzoneTarget.classList.remove('is-dragover')\n\n if (!e.dataTransfer?.files.length) return\n\n this.inputTarget.files = e.dataTransfer.files\n this.inputTarget.dispatchEvent(new Event('change', { bubbles: true }))\n }\n\n browse () {\n this.inputTarget.click()\n }\n\n // --- Preview rendering ---\n\n private renderPreviews () {\n if (!this.hasOutputTarget) return\n\n this.outputTarget.innerHTML = ''\n this.files.forEach(file => {\n this.outputTarget.appendChild(this.buildPreview(file))\n })\n }\n\n private buildPreview (file: globalThis.File): HTMLElement {\n // Replace slash in MIME type (e.g. \"image/png\") with dash for a valid CSS class name.\n const safeType = file.type ? file.type.replace('/', '-') : 'unknown'\n\n const div = document.createElement('div')\n div.className = `file-preview file-preview-${safeType} layer-children`\n\n const typeBadge = document.createElement('span')\n typeBadge.className = 'midwest-badge size-default theme-primary'\n const typeValue = document.createElement('span')\n typeValue.className = 'value'\n typeValue.textContent = file.type || 'Unknown'\n typeBadge.appendChild(typeValue)\n div.appendChild(typeBadge)\n\n const sizeBadge = document.createElement('span')\n sizeBadge.className = 'midwest-badge size-default theme-gray ml-auto'\n const sizeValue = document.createElement('span')\n sizeValue.className = 'value'\n sizeValue.textContent = new Intl.NumberFormat(undefined, {\n notation: 'compact',\n style: 'unit',\n unit: 'byte',\n unitDisplay: 'narrow'\n }).format(file.size)\n sizeBadge.appendChild(sizeValue)\n div.appendChild(sizeBadge)\n\n if (file.type.startsWith('image/')) {\n const img = document.createElement('img')\n img.src = window.URL.createObjectURL(file)\n div.appendChild(img)\n } else {\n const placeholder = document.createElement('div')\n placeholder.className = 'placeholder-file'\n placeholder.innerHTML = file.type.startsWith('video/') ? this.videoIcon : this.fileIcon\n div.appendChild(placeholder)\n }\n\n return div\n }\n\n private readonly fileIcon = '<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"ionicon\" viewBox=\"0 0 512 512\" aria-hidden=\"true\"><path d=\"M416 221.25V416a48 48 0 01-48 48H144a48 48 0 01-48-48V96a48 48 0 0148-48h98.75a32 32 0 0122.62 9.37l141.26 141.26a32 32 0 019.37 22.62z\" fill=\"none\" stroke=\"currentColor\" stroke-linejoin=\"round\" stroke-width=\"32\"/><path d=\"M256 56v120a32 32 0 0032 32h120\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"32\"/></svg>'\n\n private readonly videoIcon = '<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"ionicon\" viewBox=\"0 0 512 512\" aria-hidden=\"true\"><path d=\"M374.79 308.78L457.5 367a16 16 0 0022.5-14.62V159.62A16 16 0 00457.5 145l-82.71 58.22A16 16 0 00368 216.3v79.4a16 16 0 006.79 13.08z\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"32\"/><path d=\"M268 384H84a52.15 52.15 0 01-52-52V180a52.15 52.15 0 0152-52h184.48A51.68 51.68 0 01320 179.52V332a52.15 52.15 0 01-52 52z\" fill=\"none\" stroke=\"currentColor\" stroke-miterlimit=\"10\" stroke-width=\"32\"/></svg>'\n\n get files () {\n if (this.inputTarget.files == null) {\n return []\n }\n return Array.from(this.inputTarget.files)\n }\n}\n"],"names":[],"mappings":"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"}