cisse-vue-ui 0.2.4 → 0.2.6

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 (60) hide show
  1. package/README.md +67 -1
  2. package/dist/{CollapsibleCard.vue_vue_type_script_setup_true_lang-Do0H2ZOe.cjs → CollapsibleCard.vue_vue_type_script_setup_true_lang-CPV2dtkO.cjs} +67 -125
  3. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-CPV2dtkO.cjs.map +1 -0
  4. package/dist/{CollapsibleCard.vue_vue_type_script_setup_true_lang-Cymj-zkh.js → CollapsibleCard.vue_vue_type_script_setup_true_lang-D0eSGYea.js} +68 -126
  5. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-D0eSGYea.js.map +1 -0
  6. package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-D65uMijW.js → Dropdown.vue_vue_type_script_setup_true_lang-B9DsCY8M.js} +26 -74
  7. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-B9DsCY8M.js.map +1 -0
  8. package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-H6wsySqi.cjs → Dropdown.vue_vue_type_script_setup_true_lang-nMP2OxXp.cjs} +25 -73
  9. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-nMP2OxXp.cjs.map +1 -0
  10. package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-DoawksKc.cjs → PageLayout.vue_vue_type_script_setup_true_lang-Bnw5L-xO.cjs} +2 -2
  11. package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-DoawksKc.cjs.map → PageLayout.vue_vue_type_script_setup_true_lang-Bnw5L-xO.cjs.map} +1 -1
  12. package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-J1I-WjM-.js → PageLayout.vue_vue_type_script_setup_true_lang-D8uD3-Fe.js} +2 -2
  13. package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-J1I-WjM-.js.map → PageLayout.vue_vue_type_script_setup_true_lang-D8uD3-Fe.js.map} +1 -1
  14. package/dist/{Switch.vue_vue_type_script_setup_true_lang-C2_5u-HL.js → Switch.vue_vue_type_script_setup_true_lang-dRPxDu8I.js} +33 -103
  15. package/dist/Switch.vue_vue_type_script_setup_true_lang-dRPxDu8I.js.map +1 -0
  16. package/dist/{Switch.vue_vue_type_script_setup_true_lang-V-FtNcTd.cjs → Switch.vue_vue_type_script_setup_true_lang-wRTWorCd.cjs} +32 -102
  17. package/dist/Switch.vue_vue_type_script_setup_true_lang-wRTWorCd.cjs.map +1 -0
  18. package/dist/components/core/Dropdown.vue.d.ts +2 -4
  19. package/dist/components/core/index.cjs +2 -2
  20. package/dist/components/core/index.js +2 -2
  21. package/dist/components/form/index.cjs +1 -1
  22. package/dist/components/form/index.js +1 -1
  23. package/dist/components/index.cjs +4 -4
  24. package/dist/components/index.js +4 -4
  25. package/dist/components/layout/index.cjs +1 -1
  26. package/dist/components/layout/index.js +1 -1
  27. package/dist/composables/index.cjs +8 -4
  28. package/dist/composables/index.cjs.map +1 -1
  29. package/dist/composables/index.d.ts +2 -0
  30. package/dist/composables/index.js +5 -1
  31. package/dist/composables/index.js.map +1 -1
  32. package/dist/composables/useDropdown.d.ts +51 -0
  33. package/dist/composables/useModal.d.ts +60 -0
  34. package/dist/{index-D_7WQIhA.cjs → index-C-qIi_nO.cjs} +5 -5
  35. package/dist/index-C-qIi_nO.cjs.map +1 -0
  36. package/dist/{index-CNQJxtkC.js → index-DUVvDjHF.js} +5 -5
  37. package/dist/index-DUVvDjHF.js.map +1 -0
  38. package/dist/index.cjs +13 -9
  39. package/dist/index.cjs.map +1 -1
  40. package/dist/index.js +10 -6
  41. package/dist/index.js.map +1 -1
  42. package/dist/useDropdown-DHFnd259.cjs +130 -0
  43. package/dist/useDropdown-DHFnd259.cjs.map +1 -0
  44. package/dist/useDropdown-iVu14E6s.js +131 -0
  45. package/dist/useDropdown-iVu14E6s.js.map +1 -0
  46. package/dist/{useExportCSV-B9o9lJ3D.js → useModal-Aq8hn152.js} +40 -1
  47. package/dist/useModal-Aq8hn152.js.map +1 -0
  48. package/dist/{useExportCSV-BPC_hd25.cjs → useModal-DDF_ZS8C.cjs} +40 -1
  49. package/dist/useModal-DDF_ZS8C.cjs.map +1 -0
  50. package/package.json +1 -1
  51. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-Cymj-zkh.js.map +0 -1
  52. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-Do0H2ZOe.cjs.map +0 -1
  53. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-D65uMijW.js.map +0 -1
  54. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-H6wsySqi.cjs.map +0 -1
  55. package/dist/Switch.vue_vue_type_script_setup_true_lang-C2_5u-HL.js.map +0 -1
  56. package/dist/Switch.vue_vue_type_script_setup_true_lang-V-FtNcTd.cjs.map +0 -1
  57. package/dist/index-CNQJxtkC.js.map +0 -1
  58. package/dist/index-D_7WQIhA.cjs.map +0 -1
  59. package/dist/useExportCSV-B9o9lJ3D.js.map +0 -1
  60. package/dist/useExportCSV-BPC_hd25.cjs.map +0 -1
@@ -26,7 +26,6 @@ declare function __VLS_template(): {
26
26
  }): any;
27
27
  };
28
28
  refs: {
29
- dropdownRef: HTMLDivElement;
30
29
  triggerRef: HTMLDivElement;
31
30
  menuRef: HTMLDivElement;
32
31
  };
@@ -39,11 +38,10 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
39
38
  onSelect?: ((item: DropdownItem) => any) | undefined;
40
39
  }>, {
41
40
  width: "auto" | "full" | "sm" | "md" | "lg";
42
- items: DropdownItem[];
43
- align: "left" | "right";
44
41
  teleport: boolean;
42
+ align: "left" | "right";
43
+ items: DropdownItem[];
45
44
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
46
- dropdownRef: HTMLDivElement;
47
45
  triggerRef: HTMLDivElement;
48
46
  menuRef: HTMLDivElement;
49
47
  }, HTMLDivElement>;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const CollapsibleCard_vue_vue_type_script_setup_true_lang = require("../../CollapsibleCard.vue_vue_type_script_setup_true_lang-Do0H2ZOe.cjs");
4
- const Dropdown_vue_vue_type_script_setup_true_lang = require("../../Dropdown.vue_vue_type_script_setup_true_lang-H6wsySqi.cjs");
3
+ const CollapsibleCard_vue_vue_type_script_setup_true_lang = require("../../CollapsibleCard.vue_vue_type_script_setup_true_lang-CPV2dtkO.cjs");
4
+ const Dropdown_vue_vue_type_script_setup_true_lang = require("../../Dropdown.vue_vue_type_script_setup_true_lang-nMP2OxXp.cjs");
5
5
  const BadgeType_vue_vue_type_script_setup_true_lang = require("../../BadgeType.vue_vue_type_script_setup_true_lang-CJb63H1I.cjs");
6
6
  exports.AutocompleteComponent = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$4;
7
7
  exports.Avatar = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$7;
@@ -1,5 +1,5 @@
1
- import { d, g, f, _, k, b, c, j, i, e, a, h } from "../../CollapsibleCard.vue_vue_type_script_setup_true_lang-Cymj-zkh.js";
2
- import { a as a2, _ as _2 } from "../../Dropdown.vue_vue_type_script_setup_true_lang-D65uMijW.js";
1
+ import { d, g, f, _, k, b, c, j, i, e, a, h } from "../../CollapsibleCard.vue_vue_type_script_setup_true_lang-D0eSGYea.js";
2
+ import { a as a2, _ as _2 } from "../../Dropdown.vue_vue_type_script_setup_true_lang-B9DsCY8M.js";
3
3
  import { _ as _3 } from "../../BadgeType.vue_vue_type_script_setup_true_lang-CnB5eNEM.js";
4
4
  export {
5
5
  d as AutocompleteComponent,
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const Switch_vue_vue_type_script_setup_true_lang = require("../../Switch.vue_vue_type_script_setup_true_lang-V-FtNcTd.cjs");
3
+ const Switch_vue_vue_type_script_setup_true_lang = require("../../Switch.vue_vue_type_script_setup_true_lang-wRTWorCd.cjs");
4
4
  const Checkbox_vue_vue_type_script_setup_true_lang = require("../../Checkbox.vue_vue_type_script_setup_true_lang-DIoHDji4.cjs");
5
5
  exports.FormGroup = Switch_vue_vue_type_script_setup_true_lang._sfc_main$4;
6
6
  exports.FormHelp = Switch_vue_vue_type_script_setup_true_lang._sfc_main$1;
@@ -1,4 +1,4 @@
1
- import { d, a, b, _, c, e, f } from "../../Switch.vue_vue_type_script_setup_true_lang-C2_5u-HL.js";
1
+ import { d, a, b, _, c, e, f } from "../../Switch.vue_vue_type_script_setup_true_lang-dRPxDu8I.js";
2
2
  import { _ as _2 } from "../../Checkbox.vue_vue_type_script_setup_true_lang-B-nLCCNY.js";
3
3
  export {
4
4
  _2 as Checkbox,
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const CollapsibleCard_vue_vue_type_script_setup_true_lang = require("../CollapsibleCard.vue_vue_type_script_setup_true_lang-Do0H2ZOe.cjs");
4
- const Dropdown_vue_vue_type_script_setup_true_lang = require("../Dropdown.vue_vue_type_script_setup_true_lang-H6wsySqi.cjs");
3
+ const CollapsibleCard_vue_vue_type_script_setup_true_lang = require("../CollapsibleCard.vue_vue_type_script_setup_true_lang-CPV2dtkO.cjs");
4
+ const Dropdown_vue_vue_type_script_setup_true_lang = require("../Dropdown.vue_vue_type_script_setup_true_lang-nMP2OxXp.cjs");
5
5
  const BadgeType_vue_vue_type_script_setup_true_lang = require("../BadgeType.vue_vue_type_script_setup_true_lang-CJb63H1I.cjs");
6
- const Switch_vue_vue_type_script_setup_true_lang = require("../Switch.vue_vue_type_script_setup_true_lang-V-FtNcTd.cjs");
6
+ const Switch_vue_vue_type_script_setup_true_lang = require("../Switch.vue_vue_type_script_setup_true_lang-wRTWorCd.cjs");
7
7
  const Checkbox_vue_vue_type_script_setup_true_lang = require("../Checkbox.vue_vue_type_script_setup_true_lang-DIoHDji4.cjs");
8
8
  const EmptyState_vue_vue_type_script_setup_true_lang = require("../EmptyState.vue_vue_type_script_setup_true_lang-mlqLBP5W.cjs");
9
- const PageLayout_vue_vue_type_script_setup_true_lang = require("../PageLayout.vue_vue_type_script_setup_true_lang-DoawksKc.cjs");
9
+ const PageLayout_vue_vue_type_script_setup_true_lang = require("../PageLayout.vue_vue_type_script_setup_true_lang-Bnw5L-xO.cjs");
10
10
  exports.AutocompleteComponent = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$4;
11
11
  exports.Avatar = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$7;
12
12
  exports.Button = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$6;
@@ -1,10 +1,10 @@
1
- import { d, g, f, _, k, b, c, j, i, e, a, h } from "../CollapsibleCard.vue_vue_type_script_setup_true_lang-Cymj-zkh.js";
2
- import { a as a2, _ as _2 } from "../Dropdown.vue_vue_type_script_setup_true_lang-D65uMijW.js";
1
+ import { d, g, f, _, k, b, c, j, i, e, a, h } from "../CollapsibleCard.vue_vue_type_script_setup_true_lang-D0eSGYea.js";
2
+ import { a as a2, _ as _2 } from "../Dropdown.vue_vue_type_script_setup_true_lang-B9DsCY8M.js";
3
3
  import { e as e2, d as d2, c as c2, b as b2, _ as _3, a as a3 } from "../BadgeType.vue_vue_type_script_setup_true_lang-CnB5eNEM.js";
4
- import { d as d3, a as a4, b as b3, _ as _4, c as c3, e as e3, f as f2 } from "../Switch.vue_vue_type_script_setup_true_lang-C2_5u-HL.js";
4
+ import { d as d3, a as a4, b as b3, _ as _4, c as c3, e as e3, f as f2 } from "../Switch.vue_vue_type_script_setup_true_lang-dRPxDu8I.js";
5
5
  import { _ as _5 } from "../Checkbox.vue_vue_type_script_setup_true_lang-B-nLCCNY.js";
6
6
  import { e as e4, f as f3, _ as _6, a as a5, c as c4, d as d4, b as b4 } from "../EmptyState.vue_vue_type_script_setup_true_lang-CrVvFwXA.js";
7
- import { _ as _7, a as a6 } from "../PageLayout.vue_vue_type_script_setup_true_lang-J1I-WjM-.js";
7
+ import { _ as _7, a as a6 } from "../PageLayout.vue_vue_type_script_setup_true_lang-D8uD3-Fe.js";
8
8
  export {
9
9
  e4 as Alert,
10
10
  d as AutocompleteComponent,
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const PageLayout_vue_vue_type_script_setup_true_lang = require("../../PageLayout.vue_vue_type_script_setup_true_lang-DoawksKc.cjs");
3
+ const PageLayout_vue_vue_type_script_setup_true_lang = require("../../PageLayout.vue_vue_type_script_setup_true_lang-Bnw5L-xO.cjs");
4
4
  exports.BaseLayout = PageLayout_vue_vue_type_script_setup_true_lang._sfc_main;
5
5
  exports.PageLayout = PageLayout_vue_vue_type_script_setup_true_lang._sfc_main$1;
6
6
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { _, a } from "../../PageLayout.vue_vue_type_script_setup_true_lang-J1I-WjM-.js";
1
+ import { _, a } from "../../PageLayout.vue_vue_type_script_setup_true_lang-D8uD3-Fe.js";
2
2
  export {
3
3
  _ as BaseLayout,
4
4
  a as PageLayout
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const useExportCSV = require("../useExportCSV-BPC_hd25.cjs");
4
- exports.useDarkMode = useExportCSV.useDarkMode;
5
- exports.useExportCSV = useExportCSV.useExportCSV;
6
- exports.useNotifications = useExportCSV.useNotifications;
3
+ const useModal = require("../useModal-DDF_ZS8C.cjs");
4
+ const useDropdown = require("../useDropdown-DHFnd259.cjs");
5
+ exports.useDarkMode = useModal.useDarkMode;
6
+ exports.useExportCSV = useModal.useExportCSV;
7
+ exports.useModal = useModal.useModal;
8
+ exports.useModals = useModal.useModals;
9
+ exports.useNotifications = useModal.useNotifications;
10
+ exports.useDropdown = useDropdown.useDropdown;
7
11
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
@@ -1,3 +1,5 @@
1
1
  export { useNotifications } from './useNotifications';
2
2
  export { useDarkMode, type DarkModeOptions } from './useDarkMode';
3
3
  export { useExportCSV } from './useExportCSV';
4
+ export { useDropdown, type UseDropdownOptions, type UseDropdownReturn, type KeyboardNavigationOptions } from './useDropdown';
5
+ export { useModal, useModals, type UseModalReturn } from './useModal';
@@ -1,7 +1,11 @@
1
- import { a, b, u } from "../useExportCSV-B9o9lJ3D.js";
1
+ import { a, b, c, d, u } from "../useModal-Aq8hn152.js";
2
+ import { u as u2 } from "../useDropdown-iVu14E6s.js";
2
3
  export {
3
4
  a as useDarkMode,
5
+ u2 as useDropdown,
4
6
  b as useExportCSV,
7
+ c as useModal,
8
+ d as useModals,
5
9
  u as useNotifications
6
10
  };
7
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -0,0 +1,51 @@
1
+ import { Ref, ComputedRef } from 'vue';
2
+ export interface UseDropdownOptions {
3
+ /** Whether teleport is enabled (affects position calculation) */
4
+ teleport?: boolean;
5
+ /** Alignment for position calculation */
6
+ align?: 'left' | 'right';
7
+ /** Gap between trigger and dropdown in pixels */
8
+ gap?: number;
9
+ /** Callback when dropdown opens */
10
+ onOpen?: () => void;
11
+ /** Callback when dropdown closes */
12
+ onClose?: () => void;
13
+ }
14
+ export interface UseDropdownReturn {
15
+ /** Whether the dropdown is currently open */
16
+ isOpen: Ref<boolean>;
17
+ /** Current highlighted index for keyboard navigation */
18
+ highlightedIndex: Ref<number>;
19
+ /** Calculated position for teleported dropdown */
20
+ dropdownPosition: Ref<{
21
+ top: number;
22
+ left: number;
23
+ right: number;
24
+ width: number;
25
+ }>;
26
+ /** Computed style object for teleported dropdown */
27
+ dropdownStyle: ComputedRef<Record<string, string>>;
28
+ /** Open the dropdown */
29
+ open: () => void;
30
+ /** Close the dropdown */
31
+ close: () => void;
32
+ /** Toggle the dropdown */
33
+ toggle: () => void;
34
+ /** Update position (call after DOM changes) */
35
+ updatePosition: () => void;
36
+ /** Handle keyboard navigation */
37
+ handleKeydown: (event: KeyboardEvent, options: KeyboardNavigationOptions) => void;
38
+ /** Scroll to highlighted item */
39
+ scrollToHighlighted: (dropdownEl: HTMLElement | null) => void;
40
+ }
41
+ export interface KeyboardNavigationOptions {
42
+ /** Total number of items to navigate */
43
+ itemCount: number;
44
+ /** Called when Enter is pressed on a highlighted item */
45
+ onSelect?: (index: number) => void;
46
+ /** Called when the dropdown should open (Space/Enter/ArrowDown when closed) */
47
+ onOpen?: () => void;
48
+ /** Whether to handle open keys (Space/Enter/ArrowDown) when closed */
49
+ handleOpenKeys?: boolean;
50
+ }
51
+ export declare function useDropdown(triggerRef: Ref<HTMLElement | null | undefined>, dropdownRef: Ref<HTMLElement | null | undefined>, options?: UseDropdownOptions): UseDropdownReturn;
@@ -0,0 +1,60 @@
1
+ import { Ref } from 'vue';
2
+ export interface UseModalReturn<T = unknown> {
3
+ /** Whether the modal is currently open */
4
+ isOpen: Ref<boolean>;
5
+ /** Data associated with the modal (e.g., item being edited) */
6
+ data: Ref<T | null>;
7
+ /** Open the modal, optionally with data */
8
+ open: (newData?: T) => void;
9
+ /** Close the modal and clear data */
10
+ close: () => void;
11
+ /** Toggle the modal state */
12
+ toggle: () => void;
13
+ }
14
+ /**
15
+ * Composable for managing modal state
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * // Simple modal
20
+ * const createModal = useModal()
21
+ * createModal.open()
22
+ * createModal.close()
23
+ *
24
+ * // Modal with data (e.g., for editing)
25
+ * const editModal = useModal<User>()
26
+ * editModal.open(selectedUser)
27
+ * // Access editModal.data.value in modal
28
+ *
29
+ * // With onClose callback
30
+ * const deleteModal = useModal<Item>({ onClose: () => refetch() })
31
+ * ```
32
+ */
33
+ export declare function useModal<T = unknown>(options?: {
34
+ /** Initial open state */
35
+ initialOpen?: boolean;
36
+ /** Initial data */
37
+ initialData?: T | null;
38
+ /** Callback when modal opens */
39
+ onOpen?: (data: T | null) => void;
40
+ /** Callback when modal closes */
41
+ onClose?: () => void;
42
+ }): UseModalReturn<T>;
43
+ /**
44
+ * Create multiple related modals at once
45
+ * Useful when a page has several modals (create, edit, delete, etc.)
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * const modals = useModals({
50
+ * create: useModal(),
51
+ * edit: useModal<User>(),
52
+ * delete: useModal<User>(),
53
+ * })
54
+ *
55
+ * modals.create.open()
56
+ * modals.edit.open(user)
57
+ * modals.delete.close()
58
+ * ```
59
+ */
60
+ export declare function useModals<T extends Record<string, UseModalReturn<unknown>>>(modals: T): T;
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
- const CollapsibleCard_vue_vue_type_script_setup_true_lang = require("./CollapsibleCard.vue_vue_type_script_setup_true_lang-Do0H2ZOe.cjs");
3
- const Dropdown_vue_vue_type_script_setup_true_lang = require("./Dropdown.vue_vue_type_script_setup_true_lang-H6wsySqi.cjs");
2
+ const CollapsibleCard_vue_vue_type_script_setup_true_lang = require("./CollapsibleCard.vue_vue_type_script_setup_true_lang-CPV2dtkO.cjs");
3
+ const Dropdown_vue_vue_type_script_setup_true_lang = require("./Dropdown.vue_vue_type_script_setup_true_lang-nMP2OxXp.cjs");
4
4
  const BadgeType_vue_vue_type_script_setup_true_lang = require("./BadgeType.vue_vue_type_script_setup_true_lang-CJb63H1I.cjs");
5
- const Switch_vue_vue_type_script_setup_true_lang = require("./Switch.vue_vue_type_script_setup_true_lang-V-FtNcTd.cjs");
5
+ const Switch_vue_vue_type_script_setup_true_lang = require("./Switch.vue_vue_type_script_setup_true_lang-wRTWorCd.cjs");
6
6
  const Checkbox_vue_vue_type_script_setup_true_lang = require("./Checkbox.vue_vue_type_script_setup_true_lang-DIoHDji4.cjs");
7
7
  const EmptyState_vue_vue_type_script_setup_true_lang = require("./EmptyState.vue_vue_type_script_setup_true_lang-mlqLBP5W.cjs");
8
- const PageLayout_vue_vue_type_script_setup_true_lang = require("./PageLayout.vue_vue_type_script_setup_true_lang-DoawksKc.cjs");
8
+ const PageLayout_vue_vue_type_script_setup_true_lang = require("./PageLayout.vue_vue_type_script_setup_true_lang-Bnw5L-xO.cjs");
9
9
  const components = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
10
10
  __proto__: null,
11
11
  Alert: EmptyState_vue_vue_type_script_setup_true_lang._sfc_main$5,
@@ -47,4 +47,4 @@ const components = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePr
47
47
  TextType: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$1
48
48
  }, Symbol.toStringTag, { value: "Module" }));
49
49
  exports.components = components;
50
- //# sourceMappingURL=index-D_7WQIhA.cjs.map
50
+ //# sourceMappingURL=index-C-qIi_nO.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-C-qIi_nO.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,10 +1,10 @@
1
- import { d as _sfc_main$1, g as _sfc_main$2, f as _sfc_main$6, _ as _sfc_main$7, k as _sfc_main$9, b as _sfc_main$k, c as _sfc_main$r, j as _sfc_main$u, i as _sfc_main$w, e as _sfc_main$x, a as _sfc_main$y, h as _sfc_main$z } from "./CollapsibleCard.vue_vue_type_script_setup_true_lang-Cymj-zkh.js";
2
- import { a as _sfc_main$b, _ as _sfc_main$j } from "./Dropdown.vue_vue_type_script_setup_true_lang-D65uMijW.js";
1
+ import { d as _sfc_main$1, g as _sfc_main$2, f as _sfc_main$6, _ as _sfc_main$7, k as _sfc_main$9, b as _sfc_main$k, c as _sfc_main$r, j as _sfc_main$u, i as _sfc_main$w, e as _sfc_main$x, a as _sfc_main$y, h as _sfc_main$z } from "./CollapsibleCard.vue_vue_type_script_setup_true_lang-D0eSGYea.js";
2
+ import { a as _sfc_main$b, _ as _sfc_main$j } from "./Dropdown.vue_vue_type_script_setup_true_lang-B9DsCY8M.js";
3
3
  import { e as _sfc_main$3, d as _sfc_main$5, c as _sfc_main$a, b as _sfc_main$o, _ as _sfc_main$t, a as _sfc_main$A } from "./BadgeType.vue_vue_type_script_setup_true_lang-CnB5eNEM.js";
4
- import { d as _sfc_main$d, a as _sfc_main$e, b as _sfc_main$f, _ as _sfc_main$g, c as _sfc_main$h, e as _sfc_main$s, f as _sfc_main$v } from "./Switch.vue_vue_type_script_setup_true_lang-C2_5u-HL.js";
4
+ import { d as _sfc_main$d, a as _sfc_main$e, b as _sfc_main$f, _ as _sfc_main$g, c as _sfc_main$h, e as _sfc_main$s, f as _sfc_main$v } from "./Switch.vue_vue_type_script_setup_true_lang-dRPxDu8I.js";
5
5
  import { _ as _sfc_main$8 } from "./Checkbox.vue_vue_type_script_setup_true_lang-B-nLCCNY.js";
6
6
  import { e as _sfc_main, f as _sfc_main$c, _ as _sfc_main$i, a as _sfc_main$l, c as _sfc_main$m, d as _sfc_main$n, b as _sfc_main$q } from "./EmptyState.vue_vue_type_script_setup_true_lang-CrVvFwXA.js";
7
- import { _ as _sfc_main$4, a as _sfc_main$p } from "./PageLayout.vue_vue_type_script_setup_true_lang-J1I-WjM-.js";
7
+ import { _ as _sfc_main$4, a as _sfc_main$p } from "./PageLayout.vue_vue_type_script_setup_true_lang-D8uD3-Fe.js";
8
8
  const components = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
9
9
  __proto__: null,
10
10
  Alert: _sfc_main,
@@ -48,4 +48,4 @@ const components = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePr
48
48
  export {
49
49
  components as c
50
50
  };
51
- //# sourceMappingURL=index-CNQJxtkC.js.map
51
+ //# sourceMappingURL=index-DUVvDjHF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-DUVvDjHF.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.cjs CHANGED
@@ -1,14 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const CollapsibleCard_vue_vue_type_script_setup_true_lang = require("./CollapsibleCard.vue_vue_type_script_setup_true_lang-Do0H2ZOe.cjs");
4
- const Dropdown_vue_vue_type_script_setup_true_lang = require("./Dropdown.vue_vue_type_script_setup_true_lang-H6wsySqi.cjs");
3
+ const CollapsibleCard_vue_vue_type_script_setup_true_lang = require("./CollapsibleCard.vue_vue_type_script_setup_true_lang-CPV2dtkO.cjs");
4
+ const Dropdown_vue_vue_type_script_setup_true_lang = require("./Dropdown.vue_vue_type_script_setup_true_lang-nMP2OxXp.cjs");
5
5
  const BadgeType_vue_vue_type_script_setup_true_lang = require("./BadgeType.vue_vue_type_script_setup_true_lang-CJb63H1I.cjs");
6
- const Switch_vue_vue_type_script_setup_true_lang = require("./Switch.vue_vue_type_script_setup_true_lang-V-FtNcTd.cjs");
6
+ const Switch_vue_vue_type_script_setup_true_lang = require("./Switch.vue_vue_type_script_setup_true_lang-wRTWorCd.cjs");
7
7
  const Checkbox_vue_vue_type_script_setup_true_lang = require("./Checkbox.vue_vue_type_script_setup_true_lang-DIoHDji4.cjs");
8
8
  const EmptyState_vue_vue_type_script_setup_true_lang = require("./EmptyState.vue_vue_type_script_setup_true_lang-mlqLBP5W.cjs");
9
- const PageLayout_vue_vue_type_script_setup_true_lang = require("./PageLayout.vue_vue_type_script_setup_true_lang-DoawksKc.cjs");
10
- const useExportCSV = require("./useExportCSV-BPC_hd25.cjs");
11
- const components_index = require("./index-D_7WQIhA.cjs");
9
+ const PageLayout_vue_vue_type_script_setup_true_lang = require("./PageLayout.vue_vue_type_script_setup_true_lang-Bnw5L-xO.cjs");
10
+ const useModal = require("./useModal-DDF_ZS8C.cjs");
11
+ const useDropdown = require("./useDropdown-DHFnd259.cjs");
12
+ const components_index = require("./index-C-qIi_nO.cjs");
12
13
  const VueTailwindUI = {
13
14
  install(app, options = {}) {
14
15
  const { prefix = "", components: selectedComponents } = options;
@@ -60,8 +61,11 @@ exports.NotificationList = EmptyState_vue_vue_type_script_setup_true_lang._sfc_m
60
61
  exports.PaginationControls = EmptyState_vue_vue_type_script_setup_true_lang._sfc_main$2;
61
62
  exports.BaseLayout = PageLayout_vue_vue_type_script_setup_true_lang._sfc_main;
62
63
  exports.PageLayout = PageLayout_vue_vue_type_script_setup_true_lang._sfc_main$1;
63
- exports.useDarkMode = useExportCSV.useDarkMode;
64
- exports.useExportCSV = useExportCSV.useExportCSV;
65
- exports.useNotifications = useExportCSV.useNotifications;
64
+ exports.useDarkMode = useModal.useDarkMode;
65
+ exports.useExportCSV = useModal.useExportCSV;
66
+ exports.useModal = useModal.useModal;
67
+ exports.useModals = useModal.useModals;
68
+ exports.useNotifications = useModal.useNotifications;
69
+ exports.useDropdown = useDropdown.useDropdown;
66
70
  exports.VueTailwindUI = VueTailwindUI;
67
71
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/plugin.ts"],"sourcesContent":["import type { App, Plugin, Component } from 'vue'\nimport * as components from './components'\n\nexport interface PluginOptions {\n /** Optional prefix for component names (e.g., 'Ui' makes CardComponent -> UiCardComponent) */\n prefix?: string\n /** List of specific components to register. If not provided, all components are registered */\n components?: string[]\n}\n\n/**\n * Vue plugin for global component registration\n *\n * @example\n * // Register all components\n * app.use(VueTailwindUI)\n *\n * @example\n * // Register with prefix\n * app.use(VueTailwindUI, { prefix: 'Ui' })\n *\n * @example\n * // Register specific components only\n * app.use(VueTailwindUI, { components: ['CardComponent', 'TableComponent'] })\n */\nconst VueTailwindUI: Plugin = {\n install(app: App, options: PluginOptions = {}) {\n const { prefix = '', components: selectedComponents } = options\n\n const allComponents = components as Record<string, Component>\n\n const componentsToRegister = selectedComponents\n ? Object.fromEntries(\n Object.entries(allComponents).filter(([name]) =>\n selectedComponents.includes(name),\n ),\n )\n : allComponents\n\n for (const [name, component] of Object.entries(componentsToRegister)) {\n app.component(`${prefix}${name}`, component)\n }\n },\n}\n\nexport default VueTailwindUI\n"],"names":["components"],"mappings":";;;;;;;;;;;AAyBA,MAAM,gBAAwB;AAAA,EAC5B,QAAQ,KAAU,UAAyB,IAAI;AAC7C,UAAM,EAAE,SAAS,IAAI,YAAY,uBAAuB;AAExD,UAAM,gBAAgBA,iBAAAA;AAEtB,UAAM,uBAAuB,qBACzB,OAAO;AAAA,MACL,OAAO,QAAQ,aAAa,EAAE;AAAA,QAAO,CAAC,CAAC,IAAI,MACzC,mBAAmB,SAAS,IAAI;AAAA,MAAA;AAAA,IAClC,IAEF;AAEJ,eAAW,CAAC,MAAM,SAAS,KAAK,OAAO,QAAQ,oBAAoB,GAAG;AACpE,UAAI,UAAU,GAAG,MAAM,GAAG,IAAI,IAAI,SAAS;AAAA,IAC7C;AAAA,EACF;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/plugin.ts"],"sourcesContent":["import type { App, Plugin, Component } from 'vue'\nimport * as components from './components'\n\nexport interface PluginOptions {\n /** Optional prefix for component names (e.g., 'Ui' makes CardComponent -> UiCardComponent) */\n prefix?: string\n /** List of specific components to register. If not provided, all components are registered */\n components?: string[]\n}\n\n/**\n * Vue plugin for global component registration\n *\n * @example\n * // Register all components\n * app.use(VueTailwindUI)\n *\n * @example\n * // Register with prefix\n * app.use(VueTailwindUI, { prefix: 'Ui' })\n *\n * @example\n * // Register specific components only\n * app.use(VueTailwindUI, { components: ['CardComponent', 'TableComponent'] })\n */\nconst VueTailwindUI: Plugin = {\n install(app: App, options: PluginOptions = {}) {\n const { prefix = '', components: selectedComponents } = options\n\n const allComponents = components as Record<string, Component>\n\n const componentsToRegister = selectedComponents\n ? Object.fromEntries(\n Object.entries(allComponents).filter(([name]) =>\n selectedComponents.includes(name),\n ),\n )\n : allComponents\n\n for (const [name, component] of Object.entries(componentsToRegister)) {\n app.component(`${prefix}${name}`, component)\n }\n },\n}\n\nexport default VueTailwindUI\n"],"names":["components"],"mappings":";;;;;;;;;;;;AAyBA,MAAM,gBAAwB;AAAA,EAC5B,QAAQ,KAAU,UAAyB,IAAI;AAC7C,UAAM,EAAE,SAAS,IAAI,YAAY,uBAAuB;AAExD,UAAM,gBAAgBA,iBAAAA;AAEtB,UAAM,uBAAuB,qBACzB,OAAO;AAAA,MACL,OAAO,QAAQ,aAAa,EAAE;AAAA,QAAO,CAAC,CAAC,IAAI,MACzC,mBAAmB,SAAS,IAAI;AAAA,MAAA;AAAA,IAClC,IAEF;AAEJ,eAAW,CAAC,MAAM,SAAS,KAAK,OAAO,QAAQ,oBAAoB,GAAG;AACpE,UAAI,UAAU,GAAG,MAAM,GAAG,IAAI,IAAI,SAAS;AAAA,IAC7C;AAAA,EACF;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.js CHANGED
@@ -1,12 +1,13 @@
1
- import { d, g, f, _, k, b, c, j, i, e, a, h } from "./CollapsibleCard.vue_vue_type_script_setup_true_lang-Cymj-zkh.js";
2
- import { a as a2, _ as _2 } from "./Dropdown.vue_vue_type_script_setup_true_lang-D65uMijW.js";
1
+ import { d, g, f, _, k, b, c, j, i, e, a, h } from "./CollapsibleCard.vue_vue_type_script_setup_true_lang-D0eSGYea.js";
2
+ import { a as a2, _ as _2 } from "./Dropdown.vue_vue_type_script_setup_true_lang-B9DsCY8M.js";
3
3
  import { e as e2, d as d2, c as c2, b as b2, _ as _3, a as a3 } from "./BadgeType.vue_vue_type_script_setup_true_lang-CnB5eNEM.js";
4
- import { d as d3, a as a4, b as b3, _ as _4, c as c3, e as e3, f as f2 } from "./Switch.vue_vue_type_script_setup_true_lang-C2_5u-HL.js";
4
+ import { d as d3, a as a4, b as b3, _ as _4, c as c3, e as e3, f as f2 } from "./Switch.vue_vue_type_script_setup_true_lang-dRPxDu8I.js";
5
5
  import { _ as _5 } from "./Checkbox.vue_vue_type_script_setup_true_lang-B-nLCCNY.js";
6
6
  import { e as e4, f as f3, _ as _6, a as a5, c as c4, d as d4, b as b4 } from "./EmptyState.vue_vue_type_script_setup_true_lang-CrVvFwXA.js";
7
- import { _ as _7, a as a6 } from "./PageLayout.vue_vue_type_script_setup_true_lang-J1I-WjM-.js";
8
- import { a as a7, b as b5, u } from "./useExportCSV-B9o9lJ3D.js";
9
- import { c as components } from "./index-CNQJxtkC.js";
7
+ import { _ as _7, a as a6 } from "./PageLayout.vue_vue_type_script_setup_true_lang-D8uD3-Fe.js";
8
+ import { a as a7, b as b5, c as c5, d as d5, u } from "./useModal-Aq8hn152.js";
9
+ import { u as u2 } from "./useDropdown-iVu14E6s.js";
10
+ import { c as components } from "./index-DUVvDjHF.js";
10
11
  const VueTailwindUI = {
11
12
  install(app, options = {}) {
12
13
  const { prefix = "", components: selectedComponents } = options;
@@ -61,7 +62,10 @@ export {
61
62
  a3 as TextType,
62
63
  VueTailwindUI,
63
64
  a7 as useDarkMode,
65
+ u2 as useDropdown,
64
66
  b5 as useExportCSV,
67
+ c5 as useModal,
68
+ d5 as useModals,
65
69
  u as useNotifications
66
70
  };
67
71
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/plugin.ts"],"sourcesContent":["import type { App, Plugin, Component } from 'vue'\nimport * as components from './components'\n\nexport interface PluginOptions {\n /** Optional prefix for component names (e.g., 'Ui' makes CardComponent -> UiCardComponent) */\n prefix?: string\n /** List of specific components to register. If not provided, all components are registered */\n components?: string[]\n}\n\n/**\n * Vue plugin for global component registration\n *\n * @example\n * // Register all components\n * app.use(VueTailwindUI)\n *\n * @example\n * // Register with prefix\n * app.use(VueTailwindUI, { prefix: 'Ui' })\n *\n * @example\n * // Register specific components only\n * app.use(VueTailwindUI, { components: ['CardComponent', 'TableComponent'] })\n */\nconst VueTailwindUI: Plugin = {\n install(app: App, options: PluginOptions = {}) {\n const { prefix = '', components: selectedComponents } = options\n\n const allComponents = components as Record<string, Component>\n\n const componentsToRegister = selectedComponents\n ? Object.fromEntries(\n Object.entries(allComponents).filter(([name]) =>\n selectedComponents.includes(name),\n ),\n )\n : allComponents\n\n for (const [name, component] of Object.entries(componentsToRegister)) {\n app.component(`${prefix}${name}`, component)\n }\n },\n}\n\nexport default VueTailwindUI\n"],"names":[],"mappings":";;;;;;;;;AAyBA,MAAM,gBAAwB;AAAA,EAC5B,QAAQ,KAAU,UAAyB,IAAI;AAC7C,UAAM,EAAE,SAAS,IAAI,YAAY,uBAAuB;AAExD,UAAM,gBAAgB;AAEtB,UAAM,uBAAuB,qBACzB,OAAO;AAAA,MACL,OAAO,QAAQ,aAAa,EAAE;AAAA,QAAO,CAAC,CAAC,IAAI,MACzC,mBAAmB,SAAS,IAAI;AAAA,MAAA;AAAA,IAClC,IAEF;AAEJ,eAAW,CAAC,MAAM,SAAS,KAAK,OAAO,QAAQ,oBAAoB,GAAG;AACpE,UAAI,UAAU,GAAG,MAAM,GAAG,IAAI,IAAI,SAAS;AAAA,IAC7C;AAAA,EACF;AACF;"}
1
+ {"version":3,"file":"index.js","sources":["../src/plugin.ts"],"sourcesContent":["import type { App, Plugin, Component } from 'vue'\nimport * as components from './components'\n\nexport interface PluginOptions {\n /** Optional prefix for component names (e.g., 'Ui' makes CardComponent -> UiCardComponent) */\n prefix?: string\n /** List of specific components to register. If not provided, all components are registered */\n components?: string[]\n}\n\n/**\n * Vue plugin for global component registration\n *\n * @example\n * // Register all components\n * app.use(VueTailwindUI)\n *\n * @example\n * // Register with prefix\n * app.use(VueTailwindUI, { prefix: 'Ui' })\n *\n * @example\n * // Register specific components only\n * app.use(VueTailwindUI, { components: ['CardComponent', 'TableComponent'] })\n */\nconst VueTailwindUI: Plugin = {\n install(app: App, options: PluginOptions = {}) {\n const { prefix = '', components: selectedComponents } = options\n\n const allComponents = components as Record<string, Component>\n\n const componentsToRegister = selectedComponents\n ? Object.fromEntries(\n Object.entries(allComponents).filter(([name]) =>\n selectedComponents.includes(name),\n ),\n )\n : allComponents\n\n for (const [name, component] of Object.entries(componentsToRegister)) {\n app.component(`${prefix}${name}`, component)\n }\n },\n}\n\nexport default VueTailwindUI\n"],"names":[],"mappings":";;;;;;;;;;AAyBA,MAAM,gBAAwB;AAAA,EAC5B,QAAQ,KAAU,UAAyB,IAAI;AAC7C,UAAM,EAAE,SAAS,IAAI,YAAY,uBAAuB;AAExD,UAAM,gBAAgB;AAEtB,UAAM,uBAAuB,qBACzB,OAAO;AAAA,MACL,OAAO,QAAQ,aAAa,EAAE;AAAA,QAAO,CAAC,CAAC,IAAI,MACzC,mBAAmB,SAAS,IAAI;AAAA,MAAA;AAAA,IAClC,IAEF;AAEJ,eAAW,CAAC,MAAM,SAAS,KAAK,OAAO,QAAQ,oBAAoB,GAAG;AACpE,UAAI,UAAU,GAAG,MAAM,GAAG,IAAI,IAAI,SAAS;AAAA,IAC7C;AAAA,EACF;AACF;"}
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ const vue = require("vue");
3
+ function useDropdown(triggerRef, dropdownRef, options = {}) {
4
+ const { teleport = true, align = "left", gap = 8, onOpen, onClose } = options;
5
+ const isOpen = vue.ref(false);
6
+ const highlightedIndex = vue.ref(-1);
7
+ const dropdownPosition = vue.ref({ top: 0, left: 0, right: 0, width: 0 });
8
+ const updatePosition = () => {
9
+ if (!triggerRef.value || !teleport) return;
10
+ const rect = triggerRef.value.getBoundingClientRect();
11
+ dropdownPosition.value = {
12
+ top: rect.bottom + window.scrollY + gap,
13
+ left: rect.left + window.scrollX,
14
+ right: window.innerWidth - rect.right - window.scrollX,
15
+ width: rect.width
16
+ };
17
+ };
18
+ const open = () => {
19
+ isOpen.value = true;
20
+ vue.nextTick(updatePosition);
21
+ onOpen == null ? void 0 : onOpen();
22
+ };
23
+ const close = () => {
24
+ isOpen.value = false;
25
+ highlightedIndex.value = -1;
26
+ onClose == null ? void 0 : onClose();
27
+ };
28
+ const toggle = () => {
29
+ if (isOpen.value) {
30
+ close();
31
+ } else {
32
+ open();
33
+ }
34
+ };
35
+ const handleClickOutside = (event) => {
36
+ var _a, _b;
37
+ const target = event.target;
38
+ const isInsideTrigger = (_a = triggerRef.value) == null ? void 0 : _a.contains(target);
39
+ const isInsideDropdown = (_b = dropdownRef.value) == null ? void 0 : _b.contains(target);
40
+ if (!isInsideTrigger && !isInsideDropdown) {
41
+ close();
42
+ }
43
+ };
44
+ const scrollToHighlighted = (dropdownEl) => {
45
+ vue.nextTick(() => {
46
+ if (dropdownEl) {
47
+ const highlighted = dropdownEl.querySelector(
48
+ `[data-index="${highlightedIndex.value}"]`
49
+ );
50
+ if (highlighted) {
51
+ highlighted.scrollIntoView({ block: "nearest" });
52
+ }
53
+ }
54
+ });
55
+ };
56
+ const handleKeydown = (event, navOptions) => {
57
+ const { itemCount, onSelect, onOpen: onOpenNav, handleOpenKeys = false } = navOptions;
58
+ if (!isOpen.value) {
59
+ if (handleOpenKeys && (event.key === "Enter" || event.key === " " || event.key === "ArrowDown")) {
60
+ event.preventDefault();
61
+ onOpenNav == null ? void 0 : onOpenNav();
62
+ open();
63
+ }
64
+ return;
65
+ }
66
+ switch (event.key) {
67
+ case "ArrowDown":
68
+ event.preventDefault();
69
+ highlightedIndex.value = Math.min(highlightedIndex.value + 1, itemCount - 1);
70
+ break;
71
+ case "ArrowUp":
72
+ event.preventDefault();
73
+ highlightedIndex.value = Math.max(highlightedIndex.value - 1, 0);
74
+ break;
75
+ case "Enter":
76
+ event.preventDefault();
77
+ if (highlightedIndex.value >= 0) {
78
+ onSelect == null ? void 0 : onSelect(highlightedIndex.value);
79
+ }
80
+ break;
81
+ case "Escape":
82
+ event.preventDefault();
83
+ close();
84
+ break;
85
+ case "Tab":
86
+ close();
87
+ break;
88
+ }
89
+ };
90
+ const dropdownStyle = vue.computed(() => {
91
+ if (!teleport) return {};
92
+ return {
93
+ position: "absolute",
94
+ top: `${dropdownPosition.value.top}px`,
95
+ left: align === "right" ? "auto" : `${dropdownPosition.value.left}px`,
96
+ right: align === "right" ? `${dropdownPosition.value.right}px` : "auto",
97
+ width: `${dropdownPosition.value.width}px`
98
+ };
99
+ });
100
+ vue.watch(isOpen, (newValue) => {
101
+ if (newValue) {
102
+ document.addEventListener("click", handleClickOutside);
103
+ window.addEventListener("scroll", updatePosition, true);
104
+ window.addEventListener("resize", updatePosition);
105
+ } else {
106
+ document.removeEventListener("click", handleClickOutside);
107
+ window.removeEventListener("scroll", updatePosition, true);
108
+ window.removeEventListener("resize", updatePosition);
109
+ }
110
+ });
111
+ vue.onUnmounted(() => {
112
+ document.removeEventListener("click", handleClickOutside);
113
+ window.removeEventListener("scroll", updatePosition, true);
114
+ window.removeEventListener("resize", updatePosition);
115
+ });
116
+ return {
117
+ isOpen,
118
+ highlightedIndex,
119
+ dropdownPosition,
120
+ dropdownStyle,
121
+ open,
122
+ close,
123
+ toggle,
124
+ updatePosition,
125
+ handleKeydown,
126
+ scrollToHighlighted
127
+ };
128
+ }
129
+ exports.useDropdown = useDropdown;
130
+ //# sourceMappingURL=useDropdown-DHFnd259.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDropdown-DHFnd259.cjs","sources":["../src/composables/useDropdown.ts"],"sourcesContent":["import { ref, computed, watch, onUnmounted, nextTick, type Ref, type ComputedRef } from 'vue'\n\nexport interface UseDropdownOptions {\n /** Whether teleport is enabled (affects position calculation) */\n teleport?: boolean\n /** Alignment for position calculation */\n align?: 'left' | 'right'\n /** Gap between trigger and dropdown in pixels */\n gap?: number\n /** Callback when dropdown opens */\n onOpen?: () => void\n /** Callback when dropdown closes */\n onClose?: () => void\n}\n\nexport interface UseDropdownReturn {\n /** Whether the dropdown is currently open */\n isOpen: Ref<boolean>\n /** Current highlighted index for keyboard navigation */\n highlightedIndex: Ref<number>\n /** Calculated position for teleported dropdown */\n dropdownPosition: Ref<{ top: number; left: number; right: number; width: number }>\n /** Computed style object for teleported dropdown */\n dropdownStyle: ComputedRef<Record<string, string>>\n /** Open the dropdown */\n open: () => void\n /** Close the dropdown */\n close: () => void\n /** Toggle the dropdown */\n toggle: () => void\n /** Update position (call after DOM changes) */\n updatePosition: () => void\n /** Handle keyboard navigation */\n handleKeydown: (event: KeyboardEvent, options: KeyboardNavigationOptions) => void\n /** Scroll to highlighted item */\n scrollToHighlighted: (dropdownEl: HTMLElement | null) => void\n}\n\nexport interface KeyboardNavigationOptions {\n /** Total number of items to navigate */\n itemCount: number\n /** Called when Enter is pressed on a highlighted item */\n onSelect?: (index: number) => void\n /** Called when the dropdown should open (Space/Enter/ArrowDown when closed) */\n onOpen?: () => void\n /** Whether to handle open keys (Space/Enter/ArrowDown) when closed */\n handleOpenKeys?: boolean\n}\n\nexport function useDropdown(\n triggerRef: Ref<HTMLElement | null | undefined>,\n dropdownRef: Ref<HTMLElement | null | undefined>,\n options: UseDropdownOptions = {}\n): UseDropdownReturn {\n const { teleport = true, align = 'left', gap = 8, onOpen, onClose } = options\n\n const isOpen = ref(false)\n const highlightedIndex = ref(-1)\n const dropdownPosition = ref({ top: 0, left: 0, right: 0, width: 0 })\n\n const updatePosition = () => {\n if (!triggerRef.value || !teleport) return\n const rect = triggerRef.value.getBoundingClientRect()\n dropdownPosition.value = {\n top: rect.bottom + window.scrollY + gap,\n left: rect.left + window.scrollX,\n right: window.innerWidth - rect.right - window.scrollX,\n width: rect.width,\n }\n }\n\n const open = () => {\n isOpen.value = true\n nextTick(updatePosition)\n onOpen?.()\n }\n\n const close = () => {\n isOpen.value = false\n highlightedIndex.value = -1\n onClose?.()\n }\n\n const toggle = () => {\n if (isOpen.value) {\n close()\n } else {\n open()\n }\n }\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node\n const isInsideTrigger = triggerRef.value?.contains(target)\n const isInsideDropdown = dropdownRef.value?.contains(target)\n if (!isInsideTrigger && !isInsideDropdown) {\n close()\n }\n }\n\n const scrollToHighlighted = (dropdownEl: HTMLElement | null) => {\n nextTick(() => {\n if (dropdownEl) {\n const highlighted = dropdownEl.querySelector(\n `[data-index=\"${highlightedIndex.value}\"]`\n ) as HTMLElement\n if (highlighted) {\n highlighted.scrollIntoView({ block: 'nearest' })\n }\n }\n })\n }\n\n const handleKeydown = (event: KeyboardEvent, navOptions: KeyboardNavigationOptions) => {\n const { itemCount, onSelect, onOpen: onOpenNav, handleOpenKeys = false } = navOptions\n\n if (!isOpen.value) {\n if (handleOpenKeys && (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown')) {\n event.preventDefault()\n onOpenNav?.()\n open()\n }\n return\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n highlightedIndex.value = Math.min(highlightedIndex.value + 1, itemCount - 1)\n break\n case 'ArrowUp':\n event.preventDefault()\n highlightedIndex.value = Math.max(highlightedIndex.value - 1, 0)\n break\n case 'Enter':\n event.preventDefault()\n if (highlightedIndex.value >= 0) {\n onSelect?.(highlightedIndex.value)\n }\n break\n case 'Escape':\n event.preventDefault()\n close()\n break\n case 'Tab':\n close()\n break\n }\n }\n\n const dropdownStyle = computed(() => {\n if (!teleport) return {} as Record<string, string>\n return {\n position: 'absolute',\n top: `${dropdownPosition.value.top}px`,\n left: align === 'right' ? 'auto' : `${dropdownPosition.value.left}px`,\n right: align === 'right' ? `${dropdownPosition.value.right}px` : 'auto',\n width: `${dropdownPosition.value.width}px`,\n } as Record<string, string>\n })\n\n // Event listener management\n watch(isOpen, (newValue) => {\n if (newValue) {\n document.addEventListener('click', handleClickOutside)\n window.addEventListener('scroll', updatePosition, true)\n window.addEventListener('resize', updatePosition)\n } else {\n document.removeEventListener('click', handleClickOutside)\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n }\n })\n\n onUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n })\n\n return {\n isOpen,\n highlightedIndex,\n dropdownPosition,\n dropdownStyle,\n open,\n close,\n toggle,\n updatePosition,\n handleKeydown,\n scrollToHighlighted,\n }\n}\n"],"names":["ref","nextTick","computed","watch","onUnmounted"],"mappings":"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"}