cisse-vue-ui 0.2.5 → 0.2.7
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-D_8YbCbl.cjs → CollapsibleCard.vue_vue_type_script_setup_true_lang-ClNZxjzF.cjs} +31 -94
- package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-ClNZxjzF.cjs.map +1 -0
- package/dist/{CollapsibleCard.vue_vue_type_script_setup_true_lang-Cwn5A5CH.js → CollapsibleCard.vue_vue_type_script_setup_true_lang-Y1wvT4aS.js} +32 -95
- package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-Y1wvT4aS.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/TableComponent.vue.d.ts +18 -2
- 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-9hTVj6LT.cjs → index-CCWZb44b.cjs} +5 -5
- package/dist/index-CCWZb44b.cjs.map +1 -0
- package/dist/{index-CWhT0eYI.js → index-RD8wq3O6.js} +5 -5
- package/dist/index-RD8wq3O6.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-Cwn5A5CH.js.map +0 -1
- package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-D_8YbCbl.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-9hTVj6LT.cjs.map +0 -1
- package/dist/index-CWhT0eYI.js.map +0 -1
- package/dist/useExportCSV-B9o9lJ3D.js.map +0 -1
- package/dist/useExportCSV-BPC_hd25.cjs.map +0 -1
package/README.md
CHANGED
|
@@ -151,7 +151,73 @@ app.use(VueTailwindUI, { components: ['Button', 'CardComponent'] })
|
|
|
151
151
|
## Composables
|
|
152
152
|
|
|
153
153
|
```typescript
|
|
154
|
-
import { useNotifications, useDarkMode, useExportCSV } from 'cisse-vue-ui/composables'
|
|
154
|
+
import { useNotifications, useDarkMode, useExportCSV, useDropdown, useModal } from 'cisse-vue-ui/composables'
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### useModal
|
|
158
|
+
|
|
159
|
+
Manage modal state with data support:
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
import { useModal } from 'cisse-vue-ui/composables'
|
|
163
|
+
|
|
164
|
+
// Simple modal
|
|
165
|
+
const createModal = useModal()
|
|
166
|
+
createModal.open()
|
|
167
|
+
createModal.close()
|
|
168
|
+
|
|
169
|
+
// Modal with data (e.g., for editing)
|
|
170
|
+
const editModal = useModal<User>()
|
|
171
|
+
editModal.open(selectedUser)
|
|
172
|
+
// Access editModal.data.value in template
|
|
173
|
+
|
|
174
|
+
// With callbacks
|
|
175
|
+
const deleteModal = useModal<Item>({
|
|
176
|
+
onOpen: (data) => console.log('Opening with:', data),
|
|
177
|
+
onClose: () => refetchData()
|
|
178
|
+
})
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
```vue
|
|
182
|
+
<template>
|
|
183
|
+
<!-- Use isOpen for v-model binding -->
|
|
184
|
+
<Modal v-model="editModal.isOpen.value" title="Edit User">
|
|
185
|
+
<FormInput v-model="editModal.data.value.name" label="Name" />
|
|
186
|
+
<template #footer>
|
|
187
|
+
<Button @click="editModal.close()">Cancel</Button>
|
|
188
|
+
<Button variant="primary" @click="save">Save</Button>
|
|
189
|
+
</template>
|
|
190
|
+
</Modal>
|
|
191
|
+
</template>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### useDropdown
|
|
195
|
+
|
|
196
|
+
Shared dropdown logic for custom dropdown components (used internally by Dropdown, FormSelect, AutocompleteComponent):
|
|
197
|
+
|
|
198
|
+
```typescript
|
|
199
|
+
import { useDropdown } from 'cisse-vue-ui/composables'
|
|
200
|
+
import { ref } from 'vue'
|
|
201
|
+
|
|
202
|
+
const triggerRef = ref<HTMLElement>()
|
|
203
|
+
const dropdownRef = ref<HTMLElement>()
|
|
204
|
+
|
|
205
|
+
const {
|
|
206
|
+
isOpen,
|
|
207
|
+
highlightedIndex,
|
|
208
|
+
dropdownStyle,
|
|
209
|
+
open,
|
|
210
|
+
close,
|
|
211
|
+
toggle,
|
|
212
|
+
handleKeydown,
|
|
213
|
+
scrollToHighlighted,
|
|
214
|
+
} = useDropdown(triggerRef, dropdownRef, {
|
|
215
|
+
teleport: true,
|
|
216
|
+
align: 'left',
|
|
217
|
+
gap: 8,
|
|
218
|
+
onOpen: () => console.log('Opened'),
|
|
219
|
+
onClose: () => console.log('Closed'),
|
|
220
|
+
})
|
|
155
221
|
```
|
|
156
222
|
|
|
157
223
|
### useNotifications
|
|
@@ -3,6 +3,7 @@ const vue = require("vue");
|
|
|
3
3
|
const Checkbox_vue_vue_type_script_setup_true_lang = require("./Checkbox.vue_vue_type_script_setup_true_lang-DIoHDji4.cjs");
|
|
4
4
|
const BadgeType_vue_vue_type_script_setup_true_lang = require("./BadgeType.vue_vue_type_script_setup_true_lang-CJb63H1I.cjs");
|
|
5
5
|
const vue$1 = require("@iconify/vue");
|
|
6
|
+
const useDropdown = require("./useDropdown-DHFnd259.cjs");
|
|
6
7
|
const _hoisted_1$8 = { class: "flex flex-col overflow-hidden rounded-lg bg-white shadow-md dark:bg-slate-950" };
|
|
7
8
|
const _hoisted_2$6 = {
|
|
8
9
|
key: 0,
|
|
@@ -83,9 +84,9 @@ const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
|
|
|
83
84
|
},
|
|
84
85
|
emits: ["select", "selectAll"],
|
|
85
86
|
setup(__props, { emit: __emit }) {
|
|
87
|
+
const slots = vue.useSlots();
|
|
86
88
|
const props = __props;
|
|
87
89
|
const emit = __emit;
|
|
88
|
-
const slots = vue.useSlots();
|
|
89
90
|
const typeComponents = {
|
|
90
91
|
text: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$1,
|
|
91
92
|
number: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$2,
|
|
@@ -713,13 +714,21 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
|
|
|
713
714
|
const props = __props;
|
|
714
715
|
const emit = __emit;
|
|
715
716
|
const searchQuery = vue.ref("");
|
|
716
|
-
const isOpen = vue.ref(false);
|
|
717
|
-
const highlightedIndex = vue.ref(-1);
|
|
718
717
|
const inputRef = vue.ref(null);
|
|
719
|
-
const dropdownRef = vue.ref(null);
|
|
720
718
|
const containerRef = vue.ref(null);
|
|
719
|
+
const dropdownRef = vue.ref(null);
|
|
721
720
|
const inputWrapperRef = vue.ref(null);
|
|
722
|
-
const
|
|
721
|
+
const {
|
|
722
|
+
isOpen,
|
|
723
|
+
highlightedIndex,
|
|
724
|
+
dropdownStyle,
|
|
725
|
+
open: openBase,
|
|
726
|
+
close: closeBase,
|
|
727
|
+
handleKeydown: baseHandleKeydown,
|
|
728
|
+
scrollToHighlighted
|
|
729
|
+
} = useDropdown.useDropdown(inputWrapperRef, dropdownRef, {
|
|
730
|
+
teleport: props.teleport
|
|
731
|
+
});
|
|
723
732
|
const filteredOptions = vue.computed(() => {
|
|
724
733
|
if (!searchQuery.value) {
|
|
725
734
|
return props.options;
|
|
@@ -743,30 +752,19 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
|
|
|
743
752
|
},
|
|
744
753
|
{ immediate: true }
|
|
745
754
|
);
|
|
746
|
-
const updatePosition = () => {
|
|
747
|
-
if (!inputWrapperRef.value || !props.teleport) return;
|
|
748
|
-
const rect = inputWrapperRef.value.getBoundingClientRect();
|
|
749
|
-
dropdownPosition.value = {
|
|
750
|
-
top: rect.bottom + window.scrollY + 8,
|
|
751
|
-
left: rect.left + window.scrollX,
|
|
752
|
-
width: rect.width
|
|
753
|
-
};
|
|
754
|
-
};
|
|
755
755
|
const openDropdown = () => {
|
|
756
756
|
if (props.disabled) return;
|
|
757
|
-
isOpen.value = true;
|
|
758
757
|
searchQuery.value = "";
|
|
759
758
|
highlightedIndex.value = -1;
|
|
759
|
+
openBase();
|
|
760
760
|
vue.nextTick(() => {
|
|
761
761
|
var _a;
|
|
762
762
|
(_a = inputRef.value) == null ? void 0 : _a.focus();
|
|
763
|
-
updatePosition();
|
|
764
763
|
});
|
|
765
764
|
};
|
|
766
765
|
const closeDropdown = () => {
|
|
767
|
-
|
|
766
|
+
closeBase();
|
|
768
767
|
searchQuery.value = selectedLabel.value;
|
|
769
|
-
highlightedIndex.value = -1;
|
|
770
768
|
};
|
|
771
769
|
const selectOption = (option) => {
|
|
772
770
|
emit("update:modelValue", option.value);
|
|
@@ -783,79 +781,18 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
|
|
|
783
781
|
});
|
|
784
782
|
};
|
|
785
783
|
const handleKeydown = (event) => {
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
highlightedIndex.value + 1,
|
|
792
|
-
filteredOptions.value.length - 1
|
|
793
|
-
);
|
|
794
|
-
scrollToHighlighted();
|
|
795
|
-
break;
|
|
796
|
-
case "ArrowUp":
|
|
797
|
-
event.preventDefault();
|
|
798
|
-
highlightedIndex.value = Math.max(highlightedIndex.value - 1, 0);
|
|
799
|
-
scrollToHighlighted();
|
|
800
|
-
break;
|
|
801
|
-
case "Enter":
|
|
802
|
-
event.preventDefault();
|
|
803
|
-
if (highlightedIndex.value >= 0 && filteredOptions.value[highlightedIndex.value]) {
|
|
804
|
-
selectOption(filteredOptions.value[highlightedIndex.value]);
|
|
805
|
-
}
|
|
806
|
-
break;
|
|
807
|
-
case "Escape":
|
|
808
|
-
event.preventDefault();
|
|
809
|
-
closeDropdown();
|
|
810
|
-
break;
|
|
811
|
-
}
|
|
812
|
-
};
|
|
813
|
-
const scrollToHighlighted = () => {
|
|
814
|
-
vue.nextTick(() => {
|
|
815
|
-
if (dropdownRef.value) {
|
|
816
|
-
const highlightedElement = dropdownRef.value.querySelector(
|
|
817
|
-
`[data-index="${highlightedIndex.value}"]`
|
|
818
|
-
);
|
|
819
|
-
if (highlightedElement) {
|
|
820
|
-
highlightedElement.scrollIntoView({ block: "nearest" });
|
|
784
|
+
baseHandleKeydown(event, {
|
|
785
|
+
itemCount: filteredOptions.value.length,
|
|
786
|
+
onSelect: (index) => {
|
|
787
|
+
if (filteredOptions.value[index]) {
|
|
788
|
+
selectOption(filteredOptions.value[index]);
|
|
821
789
|
}
|
|
822
790
|
}
|
|
823
791
|
});
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
var _a, _b;
|
|
827
|
-
const target = event.target;
|
|
828
|
-
const isInsideContainer = (_a = containerRef.value) == null ? void 0 : _a.contains(target);
|
|
829
|
-
const isInsideDropdown = (_b = dropdownRef.value) == null ? void 0 : _b.contains(target);
|
|
830
|
-
if (!isInsideContainer && !isInsideDropdown) {
|
|
831
|
-
closeDropdown();
|
|
792
|
+
if (isOpen.value) {
|
|
793
|
+
scrollToHighlighted(dropdownRef.value);
|
|
832
794
|
}
|
|
833
795
|
};
|
|
834
|
-
vue.watch(isOpen, (newValue) => {
|
|
835
|
-
if (newValue) {
|
|
836
|
-
document.addEventListener("click", handleClickOutside);
|
|
837
|
-
window.addEventListener("scroll", updatePosition, true);
|
|
838
|
-
window.addEventListener("resize", updatePosition);
|
|
839
|
-
} else {
|
|
840
|
-
document.removeEventListener("click", handleClickOutside);
|
|
841
|
-
window.removeEventListener("scroll", updatePosition, true);
|
|
842
|
-
window.removeEventListener("resize", updatePosition);
|
|
843
|
-
}
|
|
844
|
-
});
|
|
845
|
-
vue.onUnmounted(() => {
|
|
846
|
-
document.removeEventListener("click", handleClickOutside);
|
|
847
|
-
window.removeEventListener("scroll", updatePosition, true);
|
|
848
|
-
window.removeEventListener("resize", updatePosition);
|
|
849
|
-
});
|
|
850
|
-
const dropdownStyle = vue.computed(() => {
|
|
851
|
-
if (!props.teleport) return {};
|
|
852
|
-
return {
|
|
853
|
-
position: "absolute",
|
|
854
|
-
top: `${dropdownPosition.value.top}px`,
|
|
855
|
-
left: `${dropdownPosition.value.left}px`,
|
|
856
|
-
width: `${dropdownPosition.value.width}px`
|
|
857
|
-
};
|
|
858
|
-
});
|
|
859
796
|
return (_ctx, _cache) => {
|
|
860
797
|
return vue.openBlock(), vue.createElementBlock("div", {
|
|
861
798
|
ref_key: "containerRef",
|
|
@@ -869,8 +806,8 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
|
|
|
869
806
|
ref: inputWrapperRef,
|
|
870
807
|
class: vue.normalizeClass([{
|
|
871
808
|
"border-red-500": __props.error,
|
|
872
|
-
"border-gray-300 dark:border-gray-600": !__props.error && !isOpen
|
|
873
|
-
"border-primary ring-2 ring-primary/20": isOpen
|
|
809
|
+
"border-gray-300 dark:border-gray-600": !__props.error && !vue.unref(isOpen),
|
|
810
|
+
"border-primary ring-2 ring-primary/20": vue.unref(isOpen),
|
|
874
811
|
"cursor-not-allowed opacity-50": __props.disabled
|
|
875
812
|
}, "flex items-center gap-2 rounded-lg border bg-white px-3 py-2 transition dark:bg-gray-800"])
|
|
876
813
|
}, [
|
|
@@ -906,10 +843,10 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
|
|
|
906
843
|
disabled: __props.disabled,
|
|
907
844
|
class: "rounded p-1 transition hover:bg-gray-100 dark:hover:bg-gray-700",
|
|
908
845
|
type: "button",
|
|
909
|
-
onClick: _cache[1] || (_cache[1] = vue.withModifiers(($event) => isOpen
|
|
846
|
+
onClick: _cache[1] || (_cache[1] = vue.withModifiers(($event) => vue.unref(isOpen) ? closeDropdown() : openDropdown(), ["stop"]))
|
|
910
847
|
}, [
|
|
911
848
|
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
912
|
-
class: vue.normalizeClass([{ "rotate-180": isOpen
|
|
849
|
+
class: vue.normalizeClass([{ "rotate-180": vue.unref(isOpen) }, "size-4 text-gray-400 transition"]),
|
|
913
850
|
icon: "lucide:chevron-down"
|
|
914
851
|
}, null, 8, ["class"])
|
|
915
852
|
], 8, _hoisted_4)
|
|
@@ -927,11 +864,11 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
|
|
|
927
864
|
"leave-to-class": "opacity-0 scale-95"
|
|
928
865
|
}, {
|
|
929
866
|
default: vue.withCtx(() => [
|
|
930
|
-
isOpen
|
|
867
|
+
vue.unref(isOpen) ? (vue.openBlock(), vue.createElementBlock("div", {
|
|
931
868
|
key: 0,
|
|
932
869
|
ref_key: "dropdownRef",
|
|
933
870
|
ref: dropdownRef,
|
|
934
|
-
style: vue.normalizeStyle(dropdownStyle
|
|
871
|
+
style: vue.normalizeStyle(vue.unref(dropdownStyle)),
|
|
935
872
|
class: vue.normalizeClass([
|
|
936
873
|
"autocomplete-dropdown z-[9999] max-h-60 overflow-auto rounded-lg border border-gray-200 bg-white shadow-lg dark:border-gray-700 dark:bg-gray-800",
|
|
937
874
|
!__props.teleport && "absolute mt-2 w-full"
|
|
@@ -942,7 +879,7 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
|
|
|
942
879
|
return vue.openBlock(), vue.createElementBlock("button", {
|
|
943
880
|
key: option.value,
|
|
944
881
|
class: vue.normalizeClass([{
|
|
945
|
-
"bg-gray-100 dark:bg-gray-700": highlightedIndex
|
|
882
|
+
"bg-gray-100 dark:bg-gray-700": vue.unref(highlightedIndex) === index,
|
|
946
883
|
"bg-primary/10": __props.modelValue === option.value
|
|
947
884
|
}, "flex w-full items-center gap-2 px-4 py-2 text-left text-sm transition hover:bg-gray-100 dark:hover:bg-gray-700"]),
|
|
948
885
|
"data-index": index,
|
|
@@ -1480,4 +1417,4 @@ exports._sfc_main$6 = _sfc_main$5;
|
|
|
1480
1417
|
exports._sfc_main$7 = _sfc_main$4;
|
|
1481
1418
|
exports._sfc_main$8 = _sfc_main$3;
|
|
1482
1419
|
exports._sfc_main$9 = _sfc_main$2;
|
|
1483
|
-
//# sourceMappingURL=CollapsibleCard.vue_vue_type_script_setup_true_lang-
|
|
1420
|
+
//# sourceMappingURL=CollapsibleCard.vue_vue_type_script_setup_true_lang-ClNZxjzF.cjs.map
|