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.
- package/README.md +67 -1
- package/dist/{CollapsibleCard.vue_vue_type_script_setup_true_lang-Do0H2ZOe.cjs → CollapsibleCard.vue_vue_type_script_setup_true_lang-CPV2dtkO.cjs} +67 -125
- package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-CPV2dtkO.cjs.map +1 -0
- 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
- package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-D0eSGYea.js.map +1 -0
- package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-D65uMijW.js → Dropdown.vue_vue_type_script_setup_true_lang-B9DsCY8M.js} +26 -74
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-B9DsCY8M.js.map +1 -0
- package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-H6wsySqi.cjs → Dropdown.vue_vue_type_script_setup_true_lang-nMP2OxXp.cjs} +25 -73
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-nMP2OxXp.cjs.map +1 -0
- 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
- 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
- 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
- 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
- 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
- package/dist/Switch.vue_vue_type_script_setup_true_lang-dRPxDu8I.js.map +1 -0
- 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
- package/dist/Switch.vue_vue_type_script_setup_true_lang-wRTWorCd.cjs.map +1 -0
- package/dist/components/core/Dropdown.vue.d.ts +2 -4
- package/dist/components/core/index.cjs +2 -2
- package/dist/components/core/index.js +2 -2
- package/dist/components/form/index.cjs +1 -1
- package/dist/components/form/index.js +1 -1
- package/dist/components/index.cjs +4 -4
- package/dist/components/index.js +4 -4
- package/dist/components/layout/index.cjs +1 -1
- package/dist/components/layout/index.js +1 -1
- package/dist/composables/index.cjs +8 -4
- package/dist/composables/index.cjs.map +1 -1
- package/dist/composables/index.d.ts +2 -0
- package/dist/composables/index.js +5 -1
- package/dist/composables/index.js.map +1 -1
- package/dist/composables/useDropdown.d.ts +51 -0
- package/dist/composables/useModal.d.ts +60 -0
- package/dist/{index-D_7WQIhA.cjs → index-C-qIi_nO.cjs} +5 -5
- package/dist/index-C-qIi_nO.cjs.map +1 -0
- package/dist/{index-CNQJxtkC.js → index-DUVvDjHF.js} +5 -5
- package/dist/index-DUVvDjHF.js.map +1 -0
- package/dist/index.cjs +13 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +10 -6
- package/dist/index.js.map +1 -1
- package/dist/useDropdown-DHFnd259.cjs +130 -0
- package/dist/useDropdown-DHFnd259.cjs.map +1 -0
- package/dist/useDropdown-iVu14E6s.js +131 -0
- package/dist/useDropdown-iVu14E6s.js.map +1 -0
- package/dist/{useExportCSV-B9o9lJ3D.js → useModal-Aq8hn152.js} +40 -1
- package/dist/useModal-Aq8hn152.js.map +1 -0
- package/dist/{useExportCSV-BPC_hd25.cjs → useModal-DDF_ZS8C.cjs} +40 -1
- package/dist/useModal-DDF_ZS8C.cjs.map +1 -0
- package/package.json +1 -1
- package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-Cymj-zkh.js.map +0 -1
- package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-Do0H2ZOe.cjs.map +0 -1
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-D65uMijW.js.map +0 -1
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-H6wsySqi.cjs.map +0 -1
- package/dist/Switch.vue_vue_type_script_setup_true_lang-C2_5u-HL.js.map +0 -1
- package/dist/Switch.vue_vue_type_script_setup_true_lang-V-FtNcTd.cjs.map +0 -1
- package/dist/index-CNQJxtkC.js.map +0 -1
- package/dist/index-D_7WQIhA.cjs.map +0 -1
- package/dist/useExportCSV-B9o9lJ3D.js.map +0 -1
- 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-
|
|
4
|
-
const Dropdown_vue_vue_type_script_setup_true_lang = require("../../Dropdown.vue_vue_type_script_setup_true_lang-
|
|
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-
|
|
2
|
-
import { a as a2, _ as _2 } from "../../Dropdown.vue_vue_type_script_setup_true_lang-
|
|
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-
|
|
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-
|
|
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-
|
|
4
|
-
const Dropdown_vue_vue_type_script_setup_true_lang = require("../Dropdown.vue_vue_type_script_setup_true_lang-
|
|
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-
|
|
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-
|
|
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;
|
package/dist/components/index.js
CHANGED
|
@@ -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-
|
|
2
|
-
import { a as a2, _ as _2 } from "../Dropdown.vue_vue_type_script_setup_true_lang-
|
|
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-
|
|
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-
|
|
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-
|
|
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,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
exports.
|
|
6
|
-
exports.
|
|
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 "../
|
|
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-
|
|
3
|
-
const Dropdown_vue_vue_type_script_setup_true_lang = require("./Dropdown.vue_vue_type_script_setup_true_lang-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
2
|
-
import { a as _sfc_main$b, _ as _sfc_main$j } from "./Dropdown.vue_vue_type_script_setup_true_lang-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
4
|
-
const Dropdown_vue_vue_type_script_setup_true_lang = require("./Dropdown.vue_vue_type_script_setup_true_lang-
|
|
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-
|
|
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-
|
|
10
|
-
const
|
|
11
|
-
const
|
|
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 =
|
|
64
|
-
exports.useExportCSV =
|
|
65
|
-
exports.
|
|
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
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":"
|
|
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-
|
|
2
|
-
import { a as a2, _ as _2 } from "./Dropdown.vue_vue_type_script_setup_true_lang-
|
|
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-
|
|
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-
|
|
8
|
-
import { a as a7, b as b5, u } from "./
|
|
9
|
-
import {
|
|
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":"
|
|
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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"}
|