shadcn_phlexcomponents 0.1.16 → 0.1.18

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/app/javascript/controllers/accordion_controller.js +90 -100
  3. data/app/javascript/controllers/alert_dialog_controller.js +4 -4
  4. data/app/javascript/controllers/avatar_controller.js +11 -11
  5. data/app/javascript/controllers/checkbox_controller.js +26 -25
  6. data/app/javascript/controllers/collapsible_controller.js +36 -34
  7. data/app/javascript/controllers/combobox_controller.js +231 -262
  8. data/app/javascript/controllers/command_controller.js +184 -204
  9. data/app/javascript/controllers/date_picker_controller.js +257 -240
  10. data/app/javascript/controllers/date_range_picker_controller.js +200 -188
  11. data/app/javascript/controllers/dialog_controller.js +78 -78
  12. data/app/javascript/controllers/dropdown_menu_controller.js +208 -228
  13. data/app/javascript/controllers/dropdown_menu_sub_controller.js +97 -110
  14. data/app/javascript/controllers/form_field_controller.js +16 -16
  15. data/app/javascript/controllers/hover_card_controller.js +71 -68
  16. data/app/javascript/controllers/loading_button_controller.js +10 -10
  17. data/app/javascript/controllers/popover_controller.js +78 -84
  18. data/app/javascript/controllers/progress_controller.js +11 -11
  19. data/app/javascript/controllers/radio_group_controller.js +74 -74
  20. data/app/javascript/controllers/select_controller.js +232 -246
  21. data/app/javascript/controllers/sidebar_controller.js +27 -26
  22. data/app/javascript/controllers/sidebar_trigger_controller.js +9 -12
  23. data/app/javascript/controllers/slider_controller.js +74 -73
  24. data/app/javascript/controllers/switch_controller.js +23 -22
  25. data/app/javascript/controllers/tabs_controller.js +61 -60
  26. data/app/javascript/controllers/theme_switcher_controller.js +27 -27
  27. data/app/javascript/controllers/toast_container_controller.js +31 -44
  28. data/app/javascript/controllers/toast_controller.js +18 -18
  29. data/app/javascript/controllers/toggle_controller.js +17 -16
  30. data/app/javascript/controllers/toggle_group_controller.js +17 -16
  31. data/app/javascript/controllers/tooltip_controller.js +77 -74
  32. data/app/javascript/shadcn_phlexcomponents.js +58 -58
  33. data/app/javascript/utils/command.js +334 -392
  34. data/app/javascript/utils/floating_ui.js +108 -147
  35. data/app/javascript/utils/index.js +190 -253
  36. data/app/stylesheets/date_picker.css +1 -1
  37. data/app/stylesheets/shadcn_phlexcomponents.css +173 -0
  38. data/app/typescript/controllers/combobox_controller.ts +0 -1
  39. data/app/typescript/controllers/date_picker_controller.ts +25 -7
  40. data/app/typescript/controllers/tooltip_controller.ts +1 -1
  41. data/app/typescript/utils/command.ts +0 -2
  42. data/app/typescript/utils/floating_ui.ts +11 -20
  43. data/app/typescript/utils/index.ts +0 -7
  44. data/lib/shadcn_phlexcomponents/components/accordion.rb +1 -1
  45. data/lib/shadcn_phlexcomponents/components/alert_dialog.rb +6 -6
  46. data/lib/shadcn_phlexcomponents/components/base.rb +2 -2
  47. data/lib/shadcn_phlexcomponents/components/combobox.rb +15 -19
  48. data/lib/shadcn_phlexcomponents/components/command.rb +13 -13
  49. data/lib/shadcn_phlexcomponents/components/date_picker.rb +18 -12
  50. data/lib/shadcn_phlexcomponents/components/date_range_picker.rb +7 -3
  51. data/lib/shadcn_phlexcomponents/components/dialog.rb +6 -6
  52. data/lib/shadcn_phlexcomponents/components/sheet.rb +7 -7
  53. data/lib/shadcn_phlexcomponents/components/toggle.rb +1 -1
  54. data/lib/shadcn_phlexcomponents/version.rb +1 -1
  55. metadata +2 -1
@@ -1,238 +1,218 @@
1
- import { Controller } from "@hotwired/stimulus";
2
- import { useClickOutside } from "stimulus-use";
3
- import { initFloatingUi } from "../utils/floating_ui";
4
- import {
5
- getSameLevelItems,
6
- focusTrigger,
7
- hideContent,
8
- showContent,
9
- lockScroll,
10
- unlockScroll,
11
- getStimulusInstance,
12
- onClickOutside,
13
- getNextEnabledIndex,
14
- getPreviousEnabledIndex,
15
- focusElement,
16
- } from "../utils";
1
+ import { Controller } from '@hotwired/stimulus';
2
+ import { useClickOutside } from 'stimulus-use';
3
+ import { initFloatingUi } from '../utils/floating_ui';
4
+ import { getSameLevelItems, focusTrigger, hideContent, showContent, lockScroll, unlockScroll, getStimulusInstance, onClickOutside, getNextEnabledIndex, getPreviousEnabledIndex, focusElement, } from '../utils';
17
5
  const onKeydown = (controller, event) => {
18
- const key = event.key;
19
- if (["Tab", "Enter", " "].includes(key)) event.preventDefault();
20
- if (key === "Home") {
21
- controller.focusItemByIndex(null, 0);
22
- } else if (key === "End") {
23
- controller.focusItemByIndex(null, controller.items.length - 1);
24
- } else if (key === "Escape") {
25
- controller.close();
26
- }
6
+ const key = event.key;
7
+ if (['Tab', 'Enter', ' '].includes(key))
8
+ event.preventDefault();
9
+ if (key === 'Home') {
10
+ controller.focusItemByIndex(null, 0);
11
+ }
12
+ else if (key === 'End') {
13
+ controller.focusItemByIndex(null, controller.items.length - 1);
14
+ }
15
+ else if (key === 'Escape') {
16
+ controller.close();
17
+ }
27
18
  };
28
19
  const focusItemByIndex = (controller, event = null, index = null) => {
29
- if (event !== null) {
30
- const key = event.key;
31
- if (key === "ArrowUp") {
32
- controller.items[controller.items.length - 1].focus();
33
- } else {
34
- controller.items[0].focus();
35
- }
36
- } else if (index !== null) {
37
- controller.items[index].focus();
38
- }
20
+ if (event !== null) {
21
+ const key = event.key;
22
+ if (key === 'ArrowUp') {
23
+ controller.items[controller.items.length - 1].focus();
24
+ }
25
+ else {
26
+ controller.items[0].focus();
27
+ }
28
+ }
29
+ else if (index !== null) {
30
+ controller.items[index].focus();
31
+ }
39
32
  };
40
33
  const DropdownMenuController = class extends Controller {
41
- // targets
42
- static targets = ["trigger", "contentContainer", "content", "item"];
43
- // values
44
- static values = {
45
- isOpen: Boolean,
46
- };
47
- connect() {
48
- this.closestContentSelector =
49
- '[data-dropdown-menu-target="content"], [data-dropdown-menu-sub-target="content"]';
50
- this.items = getSameLevelItems({
51
- content: this.contentTarget,
52
- items: this.itemTargets,
53
- closestContentSelector: this.closestContentSelector,
54
- });
55
- useClickOutside(this, {
56
- element: this.contentTarget,
57
- dispatchEvent: false,
58
- });
59
- this.DOMKeydownListener = this.onDOMKeydown.bind(this);
60
- }
61
- toggle(event) {
62
- if (this.isOpenValue) {
63
- this.close();
64
- } else {
65
- this.open(event);
66
- }
67
- }
68
- open(event) {
69
- this.isOpenValue = true;
70
- // Sub menus are not connected to the DOM yet when dropdown menu is connected.
71
- // So we initialize them here instead of in connect().
72
- if (this.subMenuControllers === undefined) {
73
- const subMenuControllers = [];
74
- const subMenus = Array.from(
75
- this.contentTarget.querySelectorAll(
76
- '[data-shadcn-phlexcomponents="dropdown-menu-sub"]',
77
- ),
78
- );
79
- subMenus.forEach((subMenu) => {
80
- const subMenuController = getStimulusInstance(
81
- "dropdown-menu-sub",
82
- subMenu,
83
- );
84
- if (subMenuController) {
85
- subMenuControllers.push(subMenuController);
34
+ // targets
35
+ static targets = ['trigger', 'contentContainer', 'content', 'item'];
36
+ // values
37
+ static values = {
38
+ isOpen: Boolean,
39
+ };
40
+ connect() {
41
+ this.closestContentSelector =
42
+ '[data-dropdown-menu-target="content"], [data-dropdown-menu-sub-target="content"]';
43
+ this.items = getSameLevelItems({
44
+ content: this.contentTarget,
45
+ items: this.itemTargets,
46
+ closestContentSelector: this.closestContentSelector,
47
+ });
48
+ useClickOutside(this, { element: this.contentTarget, dispatchEvent: false });
49
+ this.DOMKeydownListener = this.onDOMKeydown.bind(this);
50
+ }
51
+ toggle(event) {
52
+ if (this.isOpenValue) {
53
+ this.close();
54
+ }
55
+ else {
56
+ this.open(event);
57
+ }
58
+ }
59
+ open(event) {
60
+ this.isOpenValue = true;
61
+ // Sub menus are not connected to the DOM yet when dropdown menu is connected.
62
+ // So we initialize them here instead of in connect().
63
+ if (this.subMenuControllers === undefined) {
64
+ const subMenuControllers = [];
65
+ const subMenus = Array.from(this.contentTarget.querySelectorAll('[data-shadcn-phlexcomponents="dropdown-menu-sub"]'));
66
+ subMenus.forEach((subMenu) => {
67
+ const subMenuController = getStimulusInstance('dropdown-menu-sub', subMenu);
68
+ if (subMenuController) {
69
+ subMenuControllers.push(subMenuController);
70
+ }
71
+ });
72
+ this.subMenuControllers = subMenuControllers;
73
+ }
74
+ let elementToFocus = null;
75
+ if (event instanceof KeyboardEvent) {
76
+ const key = event.key;
77
+ if (['ArrowDown', 'Enter', ' '].includes(key)) {
78
+ elementToFocus = this.items[0];
79
+ }
86
80
  }
87
- });
88
- this.subMenuControllers = subMenuControllers;
89
- }
90
- let elementToFocus = null;
91
- if (event instanceof KeyboardEvent) {
92
- const key = event.key;
93
- if (["ArrowDown", "Enter", " "].includes(key)) {
94
- elementToFocus = this.items[0];
95
- }
96
- } else {
97
- elementToFocus = this.contentTarget;
98
- }
99
- focusElement(elementToFocus);
100
- }
101
- close() {
102
- this.isOpenValue = false;
103
- this.subMenuControllers.forEach((subMenuController) => {
104
- subMenuController.closeImmediately();
105
- });
106
- }
107
- focusItem(event) {
108
- const item = event.currentTarget;
109
- let items = [];
110
- const content = item.closest(this.closestContentSelector);
111
- const isSubMenu =
112
- content.dataset.shadcnPhlexcomponents === "dropdown-menu-sub-content";
113
- if (isSubMenu) {
114
- const subMenu = content.closest(
115
- '[data-shadcn-phlexcomponents="dropdown-menu-sub"]',
116
- );
117
- const subMenuController = this.subMenuControllers.find(
118
- (subMenuController) => subMenuController.element == subMenu,
119
- );
120
- if (subMenuController) {
121
- items = subMenuController.items;
122
- }
123
- } else {
124
- items = this.items;
125
- }
126
- const index = items.indexOf(item);
127
- if (event instanceof KeyboardEvent) {
128
- const key = event.key;
129
- let newIndex = 0;
130
- if (key === "ArrowUp") {
131
- newIndex = getPreviousEnabledIndex({
132
- items,
133
- currentIndex: index,
134
- wrapAround: false,
81
+ else {
82
+ elementToFocus = this.contentTarget;
83
+ }
84
+ focusElement(elementToFocus);
85
+ }
86
+ close() {
87
+ this.isOpenValue = false;
88
+ this.subMenuControllers.forEach((subMenuController) => {
89
+ subMenuController.closeImmediately();
135
90
  });
136
- } else {
137
- newIndex = getNextEnabledIndex({
138
- items,
139
- currentIndex: index,
140
- wrapAround: false,
91
+ }
92
+ focusItem(event) {
93
+ const item = event.currentTarget;
94
+ let items = [];
95
+ const content = item.closest(this.closestContentSelector);
96
+ const isSubMenu = content.dataset.shadcnPhlexcomponents === 'dropdown-menu-sub-content';
97
+ if (isSubMenu) {
98
+ const subMenu = content.closest('[data-shadcn-phlexcomponents="dropdown-menu-sub"]');
99
+ const subMenuController = this.subMenuControllers.find((subMenuController) => subMenuController.element == subMenu);
100
+ if (subMenuController) {
101
+ items = subMenuController.items;
102
+ }
103
+ }
104
+ else {
105
+ items = this.items;
106
+ }
107
+ const index = items.indexOf(item);
108
+ if (event instanceof KeyboardEvent) {
109
+ const key = event.key;
110
+ let newIndex = 0;
111
+ if (key === 'ArrowUp') {
112
+ newIndex = getPreviousEnabledIndex({
113
+ items,
114
+ currentIndex: index,
115
+ wrapAround: false,
116
+ });
117
+ }
118
+ else {
119
+ newIndex = getNextEnabledIndex({
120
+ items,
121
+ currentIndex: index,
122
+ wrapAround: false,
123
+ });
124
+ }
125
+ items[newIndex].focus();
126
+ }
127
+ else {
128
+ // item mouseover event
129
+ items[index].focus();
130
+ }
131
+ // Close submenus on the same level
132
+ const subMenusInContent = Array.from(content.querySelectorAll('[data-shadcn-phlexcomponents="dropdown-menu-sub"]'));
133
+ subMenusInContent.forEach((subMenu) => {
134
+ const subMenuController = this.subMenuControllers.find((subMenuController) => subMenuController.element == subMenu);
135
+ if (subMenuController) {
136
+ subMenuController.closeImmediately();
137
+ }
141
138
  });
142
- }
143
- items[newIndex].focus();
144
- } else {
145
- // item mouseover event
146
- items[index].focus();
147
- }
148
- // Close submenus on the same level
149
- const subMenusInContent = Array.from(
150
- content.querySelectorAll(
151
- '[data-shadcn-phlexcomponents="dropdown-menu-sub"]',
152
- ),
153
- );
154
- subMenusInContent.forEach((subMenu) => {
155
- const subMenuController = this.subMenuControllers.find(
156
- (subMenuController) => subMenuController.element == subMenu,
157
- );
158
- if (subMenuController) {
159
- subMenuController.closeImmediately();
160
- }
161
- });
162
- }
163
- onItemFocus(event) {
164
- const item = event.currentTarget;
165
- item.tabIndex = 0;
166
- }
167
- onItemBlur(event) {
168
- const item = event.currentTarget;
169
- item.tabIndex = -1;
170
- }
171
- focusItemByIndex(event = null, index = null) {
172
- focusItemByIndex(this, event, index);
173
- }
174
- focusContent(event) {
175
- const item = event.currentTarget;
176
- const content = item.closest(this.closestContentSelector);
177
- content.focus();
178
- }
179
- select(event) {
180
- if (event instanceof KeyboardEvent) {
181
- const key = event.key;
182
- const item = event.currentTarget || event.target;
183
- // For rails button_to
184
- if (item && (key === "Enter" || key === " ")) {
185
- item.click();
186
- }
187
- }
188
- this.close();
189
- }
190
- clickOutside(event) {
191
- onClickOutside(this, event);
192
- }
193
- isOpenValueChanged(isOpen, previousIsOpen) {
194
- if (isOpen) {
195
- lockScroll(this.contentTarget.id);
196
- showContent({
197
- trigger: this.triggerTarget,
198
- content: this.contentTarget,
199
- contentContainer: this.contentContainerTarget,
200
- setEqualWidth: false,
201
- });
202
- this.cleanup = initFloatingUi({
203
- referenceElement: this.triggerTarget,
204
- floatingElement: this.contentContainerTarget,
205
- side: this.contentTarget.dataset.side,
206
- align: this.contentTarget.dataset.align,
207
- sideOffset: 4,
208
- });
209
- this.setupEventListeners();
210
- } else {
211
- unlockScroll(this.contentTarget.id);
212
- hideContent({
213
- trigger: this.triggerTarget,
214
- content: this.contentTarget,
215
- contentContainer: this.contentContainerTarget,
216
- });
217
- if (previousIsOpen) {
218
- focusTrigger(this.triggerTarget);
219
- }
220
- this.cleanupEventListeners();
221
- }
222
- }
223
- disconnect() {
224
- this.cleanupEventListeners();
225
- }
226
- onDOMKeydown(event) {
227
- if (!this.isOpenValue) return;
228
- onKeydown(this, event);
229
- }
230
- setupEventListeners() {
231
- document.addEventListener("keydown", this.DOMKeydownListener);
232
- }
233
- cleanupEventListeners() {
234
- if (this.cleanup) this.cleanup();
235
- document.removeEventListener("keydown", this.DOMKeydownListener);
236
- }
139
+ }
140
+ onItemFocus(event) {
141
+ const item = event.currentTarget;
142
+ item.tabIndex = 0;
143
+ }
144
+ onItemBlur(event) {
145
+ const item = event.currentTarget;
146
+ item.tabIndex = -1;
147
+ }
148
+ focusItemByIndex(event = null, index = null) {
149
+ focusItemByIndex(this, event, index);
150
+ }
151
+ focusContent(event) {
152
+ const item = event.currentTarget;
153
+ const content = item.closest(this.closestContentSelector);
154
+ content.focus();
155
+ }
156
+ select(event) {
157
+ if (event instanceof KeyboardEvent) {
158
+ const key = event.key;
159
+ const item = (event.currentTarget || event.target);
160
+ // For rails button_to
161
+ if (item && (key === 'Enter' || key === ' ')) {
162
+ item.click();
163
+ }
164
+ }
165
+ this.close();
166
+ }
167
+ clickOutside(event) {
168
+ onClickOutside(this, event);
169
+ }
170
+ isOpenValueChanged(isOpen, previousIsOpen) {
171
+ if (isOpen) {
172
+ lockScroll(this.contentTarget.id);
173
+ showContent({
174
+ trigger: this.triggerTarget,
175
+ content: this.contentTarget,
176
+ contentContainer: this.contentContainerTarget,
177
+ setEqualWidth: false,
178
+ });
179
+ this.cleanup = initFloatingUi({
180
+ referenceElement: this.triggerTarget,
181
+ floatingElement: this.contentContainerTarget,
182
+ side: this.contentTarget.dataset.side,
183
+ align: this.contentTarget.dataset.align,
184
+ sideOffset: 4,
185
+ });
186
+ this.setupEventListeners();
187
+ }
188
+ else {
189
+ unlockScroll(this.contentTarget.id);
190
+ hideContent({
191
+ trigger: this.triggerTarget,
192
+ content: this.contentTarget,
193
+ contentContainer: this.contentContainerTarget,
194
+ });
195
+ if (previousIsOpen) {
196
+ focusTrigger(this.triggerTarget);
197
+ }
198
+ this.cleanupEventListeners();
199
+ }
200
+ }
201
+ disconnect() {
202
+ this.cleanupEventListeners();
203
+ }
204
+ onDOMKeydown(event) {
205
+ if (!this.isOpenValue)
206
+ return;
207
+ onKeydown(this, event);
208
+ }
209
+ setupEventListeners() {
210
+ document.addEventListener('keydown', this.DOMKeydownListener);
211
+ }
212
+ cleanupEventListeners() {
213
+ if (this.cleanup)
214
+ this.cleanup();
215
+ document.removeEventListener('keydown', this.DOMKeydownListener);
216
+ }
237
217
  };
238
218
  export { DropdownMenuController, onKeydown, focusItemByIndex };
@@ -1,118 +1,105 @@
1
- import { Controller } from "@hotwired/stimulus";
2
- import { initFloatingUi } from "../utils/floating_ui";
3
- import {
4
- ON_OPEN_FOCUS_DELAY,
5
- getSameLevelItems,
6
- showContent,
7
- hideContent,
8
- getStimulusInstance,
9
- } from "../utils";
1
+ import { Controller } from '@hotwired/stimulus';
2
+ import { initFloatingUi } from '../utils/floating_ui';
3
+ import { ON_OPEN_FOCUS_DELAY, getSameLevelItems, showContent, hideContent, getStimulusInstance, } from '../utils';
10
4
  const DropdownMenuSubController = class extends Controller {
11
- // targets
12
- static targets = ["trigger", "contentContainer", "content"];
13
- // values
14
- static values = {
15
- isOpen: Boolean,
16
- };
17
- connect() {
18
- this.items = getSameLevelItems({
19
- content: this.contentTarget,
20
- items: Array.from(
21
- this.contentTarget.querySelectorAll(
22
- '[data-dropdown-menu-target="item"], [data-dropdown-menu-sub-target="trigger"]',
23
- ),
24
- ),
25
- closestContentSelector: '[data-dropdown-menu-sub-target="content"]',
26
- });
27
- }
28
- open(event = null) {
29
- clearTimeout(this.closeTimeout);
30
- this.isOpenValue = true;
31
- setTimeout(() => {
32
- if (event instanceof KeyboardEvent) {
33
- const key = event.key;
34
- if (["ArrowRight", "Enter", " "].includes(key)) {
35
- this.focusItemByIndex(null, 0);
5
+ // targets
6
+ static targets = ['trigger', 'contentContainer', 'content'];
7
+ // values
8
+ static values = {
9
+ isOpen: Boolean,
10
+ };
11
+ connect() {
12
+ this.items = getSameLevelItems({
13
+ content: this.contentTarget,
14
+ items: Array.from(this.contentTarget.querySelectorAll('[data-dropdown-menu-target="item"], [data-dropdown-menu-sub-target="trigger"]')),
15
+ closestContentSelector: '[data-dropdown-menu-sub-target="content"]',
16
+ });
17
+ }
18
+ open(event = null) {
19
+ clearTimeout(this.closeTimeout);
20
+ this.isOpenValue = true;
21
+ setTimeout(() => {
22
+ if (event instanceof KeyboardEvent) {
23
+ const key = event.key;
24
+ if (['ArrowRight', 'Enter', ' '].includes(key)) {
25
+ this.focusItemByIndex(null, 0);
26
+ }
27
+ }
28
+ }, ON_OPEN_FOCUS_DELAY);
29
+ }
30
+ close() {
31
+ this.closeTimeout = window.setTimeout(() => {
32
+ this.isOpenValue = false;
33
+ }, 250);
34
+ }
35
+ closeOnLeftKeydown() {
36
+ this.closeImmediately();
37
+ this.triggerTarget.focus();
38
+ }
39
+ focusItemByIndex(event, index) {
40
+ if (event) {
41
+ const key = event.key;
42
+ if (key === 'ArrowUp') {
43
+ this.items[this.items.length - 1].focus();
44
+ }
45
+ else {
46
+ this.items[0].focus();
47
+ }
48
+ }
49
+ else if (index !== null) {
50
+ this.items[index].focus();
36
51
  }
37
- }
38
- }, ON_OPEN_FOCUS_DELAY);
39
- }
40
- close() {
41
- this.closeTimeout = window.setTimeout(() => {
42
- this.isOpenValue = false;
43
- }, 250);
44
- }
45
- closeOnLeftKeydown() {
46
- this.closeImmediately();
47
- this.triggerTarget.focus();
48
- }
49
- focusItemByIndex(event, index) {
50
- if (event) {
51
- const key = event.key;
52
- if (key === "ArrowUp") {
53
- this.items[this.items.length - 1].focus();
54
- } else {
55
- this.items[0].focus();
56
- }
57
- } else if (index !== null) {
58
- this.items[index].focus();
59
52
  }
60
- }
61
- closeParentSubMenu() {
62
- const parentContent = this.triggerTarget.closest(
63
- '[data-dropdown-menu-sub-target="content"]',
64
- );
65
- if (parentContent) {
66
- const subMenu = parentContent.closest(
67
- '[data-shadcn-phlexcomponents="dropdown-menu-sub"]',
68
- );
69
- if (subMenu) {
70
- const subMenuController = getStimulusInstance(
71
- "dropdown-menu-sub",
72
- subMenu,
73
- );
74
- if (subMenuController) {
75
- subMenuController.closeImmediately();
76
- setTimeout(() => {
77
- subMenuController.triggerTarget.focus();
78
- }, 100);
53
+ closeParentSubMenu() {
54
+ const parentContent = this.triggerTarget.closest('[data-dropdown-menu-sub-target="content"]');
55
+ if (parentContent) {
56
+ const subMenu = parentContent.closest('[data-shadcn-phlexcomponents="dropdown-menu-sub"]');
57
+ if (subMenu) {
58
+ const subMenuController = getStimulusInstance('dropdown-menu-sub', subMenu);
59
+ if (subMenuController) {
60
+ subMenuController.closeImmediately();
61
+ setTimeout(() => {
62
+ subMenuController.triggerTarget.focus();
63
+ }, 100);
64
+ }
65
+ }
79
66
  }
80
- }
81
67
  }
82
- }
83
- closeImmediately() {
84
- this.isOpenValue = false;
85
- }
86
- isOpenValueChanged(isOpen) {
87
- if (isOpen) {
88
- showContent({
89
- trigger: this.triggerTarget,
90
- content: this.contentTarget,
91
- contentContainer: this.contentContainerTarget,
92
- });
93
- this.cleanup = initFloatingUi({
94
- referenceElement: this.triggerTarget,
95
- floatingElement: this.contentContainerTarget,
96
- side: this.contentTarget.dataset.side,
97
- align: this.contentTarget.dataset.align,
98
- sideOffset: -2,
99
- });
100
- } else {
101
- this.closeTimeout = window.setTimeout(() => {
102
- hideContent({
103
- trigger: this.triggerTarget,
104
- content: this.contentTarget,
105
- contentContainer: this.contentContainerTarget,
106
- });
107
- });
108
- this.cleanupEventListeners();
68
+ closeImmediately() {
69
+ this.isOpenValue = false;
70
+ }
71
+ isOpenValueChanged(isOpen) {
72
+ if (isOpen) {
73
+ showContent({
74
+ trigger: this.triggerTarget,
75
+ content: this.contentTarget,
76
+ contentContainer: this.contentContainerTarget,
77
+ });
78
+ this.cleanup = initFloatingUi({
79
+ referenceElement: this.triggerTarget,
80
+ floatingElement: this.contentContainerTarget,
81
+ side: this.contentTarget.dataset.side,
82
+ align: this.contentTarget.dataset.align,
83
+ sideOffset: -2,
84
+ });
85
+ }
86
+ else {
87
+ this.closeTimeout = window.setTimeout(() => {
88
+ hideContent({
89
+ trigger: this.triggerTarget,
90
+ content: this.contentTarget,
91
+ contentContainer: this.contentContainerTarget,
92
+ });
93
+ });
94
+ this.cleanupEventListeners();
95
+ }
96
+ }
97
+ disconnect() {
98
+ this.cleanupEventListeners();
99
+ }
100
+ cleanupEventListeners() {
101
+ if (this.cleanup)
102
+ this.cleanup();
109
103
  }
110
- }
111
- disconnect() {
112
- this.cleanupEventListeners();
113
- }
114
- cleanupEventListeners() {
115
- if (this.cleanup) this.cleanup();
116
- }
117
104
  };
118
105
  export { DropdownMenuSubController };