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.
Files changed (61) hide show
  1. package/README.md +67 -1
  2. 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
  3. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-ClNZxjzF.cjs.map +1 -0
  4. package/dist/{CollapsibleCard.vue_vue_type_script_setup_true_lang-Cwn5A5CH.js → CollapsibleCard.vue_vue_type_script_setup_true_lang-Y1wvT4aS.js} +32 -95
  5. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-Y1wvT4aS.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/TableComponent.vue.d.ts +18 -2
  20. package/dist/components/core/index.cjs +2 -2
  21. package/dist/components/core/index.js +2 -2
  22. package/dist/components/form/index.cjs +1 -1
  23. package/dist/components/form/index.js +1 -1
  24. package/dist/components/index.cjs +4 -4
  25. package/dist/components/index.js +4 -4
  26. package/dist/components/layout/index.cjs +1 -1
  27. package/dist/components/layout/index.js +1 -1
  28. package/dist/composables/index.cjs +8 -4
  29. package/dist/composables/index.cjs.map +1 -1
  30. package/dist/composables/index.d.ts +2 -0
  31. package/dist/composables/index.js +5 -1
  32. package/dist/composables/index.js.map +1 -1
  33. package/dist/composables/useDropdown.d.ts +51 -0
  34. package/dist/composables/useModal.d.ts +60 -0
  35. package/dist/{index-9hTVj6LT.cjs → index-CCWZb44b.cjs} +5 -5
  36. package/dist/index-CCWZb44b.cjs.map +1 -0
  37. package/dist/{index-CWhT0eYI.js → index-RD8wq3O6.js} +5 -5
  38. package/dist/index-RD8wq3O6.js.map +1 -0
  39. package/dist/index.cjs +13 -9
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.js +10 -6
  42. package/dist/index.js.map +1 -1
  43. package/dist/useDropdown-DHFnd259.cjs +130 -0
  44. package/dist/useDropdown-DHFnd259.cjs.map +1 -0
  45. package/dist/useDropdown-iVu14E6s.js +131 -0
  46. package/dist/useDropdown-iVu14E6s.js.map +1 -0
  47. package/dist/{useExportCSV-B9o9lJ3D.js → useModal-Aq8hn152.js} +40 -1
  48. package/dist/useModal-Aq8hn152.js.map +1 -0
  49. package/dist/{useExportCSV-BPC_hd25.cjs → useModal-DDF_ZS8C.cjs} +40 -1
  50. package/dist/useModal-DDF_ZS8C.cjs.map +1 -0
  51. package/package.json +1 -1
  52. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-Cwn5A5CH.js.map +0 -1
  53. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-D_8YbCbl.cjs.map +0 -1
  54. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-D65uMijW.js.map +0 -1
  55. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-H6wsySqi.cjs.map +0 -1
  56. package/dist/Switch.vue_vue_type_script_setup_true_lang-C2_5u-HL.js.map +0 -1
  57. package/dist/Switch.vue_vue_type_script_setup_true_lang-V-FtNcTd.cjs.map +0 -1
  58. package/dist/index-9hTVj6LT.cjs.map +0 -1
  59. package/dist/index-CWhT0eYI.js.map +0 -1
  60. package/dist/useExportCSV-B9o9lJ3D.js.map +0 -1
  61. 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 dropdownPosition = vue.ref({ top: 0, left: 0, width: 0 });
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
- isOpen.value = false;
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
- if (!isOpen.value) return;
787
- switch (event.key) {
788
- case "ArrowDown":
789
- event.preventDefault();
790
- highlightedIndex.value = Math.min(
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
- const handleClickOutside = (event) => {
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.value,
873
- "border-primary ring-2 ring-primary/20": isOpen.value,
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.value ? closeDropdown() : openDropdown(), ["stop"]))
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.value }, "size-4 text-gray-400 transition"]),
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.value ? (vue.openBlock(), vue.createElementBlock("div", {
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.value),
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.value === index,
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-D_8YbCbl.cjs.map
1420
+ //# sourceMappingURL=CollapsibleCard.vue_vue_type_script_setup_true_lang-ClNZxjzF.cjs.map