cisse-vue-ui 0.1.8 → 0.1.10
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/dist/{Checkbox.vue_vue_type_script_setup_true_lang-DVkcMcSN.js → Checkbox.vue_vue_type_script_setup_true_lang-CMq22Cg1.js} +3 -2
- package/dist/Checkbox.vue_vue_type_script_setup_true_lang-CMq22Cg1.js.map +1 -0
- package/dist/{Checkbox.vue_vue_type_script_setup_true_lang-DQD2I1Wk.cjs → Checkbox.vue_vue_type_script_setup_true_lang-CgLR8V21.cjs} +3 -2
- package/dist/Checkbox.vue_vue_type_script_setup_true_lang-CgLR8V21.cjs.map +1 -0
- package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-CfyqlT_n.js → Dropdown.vue_vue_type_script_setup_true_lang-D65uMijW.js} +5 -4
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-D65uMijW.js.map +1 -0
- package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-CZQ5Ci8K.cjs → Dropdown.vue_vue_type_script_setup_true_lang-H6wsySqi.cjs} +5 -4
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-H6wsySqi.cjs.map +1 -0
- package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-HxuODTiQ.cjs → PageLayout.vue_vue_type_script_setup_true_lang-DoawksKc.cjs} +2 -2
- package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-HxuODTiQ.cjs.map → PageLayout.vue_vue_type_script_setup_true_lang-DoawksKc.cjs.map} +1 -1
- package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-BoFiqN42.js → PageLayout.vue_vue_type_script_setup_true_lang-J1I-WjM-.js} +2 -2
- package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-BoFiqN42.js.map → PageLayout.vue_vue_type_script_setup_true_lang-J1I-WjM-.js.map} +1 -1
- package/dist/components/core/index.cjs +1 -1
- package/dist/components/core/index.js +1 -1
- package/dist/components/form/index.cjs +1 -1
- package/dist/components/form/index.js +1 -1
- package/dist/components/index.cjs +3 -3
- package/dist/components/index.js +3 -3
- package/dist/components/layout/index.cjs +1 -1
- package/dist/components/layout/index.js +1 -1
- package/dist/{index-3tIGVZX9.js → index-DacstXRp.js} +4 -4
- package/dist/index-DacstXRp.js.map +1 -0
- package/dist/{index-CjRzry8D.cjs → index-m8Oi-7YC.cjs} +4 -4
- package/dist/index-m8Oi-7YC.cjs.map +1 -0
- package/dist/index.cjs +4 -4
- package/dist/index.js +4 -4
- package/dist/types/form.d.ts +2 -0
- package/package.json +1 -1
- package/dist/Checkbox.vue_vue_type_script_setup_true_lang-DQD2I1Wk.cjs.map +0 -1
- package/dist/Checkbox.vue_vue_type_script_setup_true_lang-DVkcMcSN.js.map +0 -1
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-CZQ5Ci8K.cjs.map +0 -1
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-CfyqlT_n.js.map +0 -1
- package/dist/index-3tIGVZX9.js.map +0 -1
- package/dist/index-CjRzry8D.cjs.map +0 -1
|
@@ -387,6 +387,7 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
|
|
|
387
387
|
cols: { default: 6 },
|
|
388
388
|
hidden: { type: Boolean },
|
|
389
389
|
error: { type: [String, Boolean] },
|
|
390
|
+
select: { type: Boolean },
|
|
390
391
|
type: {},
|
|
391
392
|
value: {},
|
|
392
393
|
placeholder: {},
|
|
@@ -404,7 +405,7 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
|
|
|
404
405
|
const props = __props;
|
|
405
406
|
const modelValue = useModel(__props, "modelValue");
|
|
406
407
|
const computedCols = computed(() => `span ${props.cols} / span ${props.cols}`);
|
|
407
|
-
const isSelect = computed(() => props.
|
|
408
|
+
const isSelect = computed(() => props.select === true);
|
|
408
409
|
return (_ctx, _cache) => {
|
|
409
410
|
return openBlock(), createElementBlock("div", {
|
|
410
411
|
style: normalizeStyle({ gridColumn: computedCols.value }),
|
|
@@ -619,4 +620,4 @@ export {
|
|
|
619
620
|
_sfc_main$1 as f,
|
|
620
621
|
_sfc_main as g
|
|
621
622
|
};
|
|
622
|
-
//# sourceMappingURL=Checkbox.vue_vue_type_script_setup_true_lang-
|
|
623
|
+
//# sourceMappingURL=Checkbox.vue_vue_type_script_setup_true_lang-CMq22Cg1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox.vue_vue_type_script_setup_true_lang-CMq22Cg1.js","sources":["../src/components/form/FormLabel.vue","../src/components/form/FormHelp.vue","../src/components/form/FormInput.vue","../src/components/form/FormSelect.vue","../src/components/form/FormGroup.vue","../src/components/form/SearchInput.vue","../src/components/form/Switch.vue","../src/components/form/Checkbox.vue"],"sourcesContent":["<script lang=\"ts\" setup>\ndefineProps<{\n error?: string | boolean\n htmlFor?: string\n}>()\n</script>\n\n<template>\n <label\n :data-error=\"!!error\"\n :for=\"htmlFor ?? ''\"\n class=\"block text-sm font-medium text-gray-700 data-[error=true]:text-red-500 dark:text-gray-300\"\n >\n <slot />\n </label>\n</template>\n","<script lang=\"ts\" setup>\ndefineProps<{\n error?: boolean\n text?: string\n}>()\n</script>\n\n<template>\n <p\n :data-error=\"error\"\n class=\"mt-2 text-sm text-gray-400 peer-invalid:visible data-[error=true]:text-red-500 dark:text-gray-500\"\n >\n <slot>{{ text ?? '' }}</slot>\n </p>\n</template>\n","<script lang=\"ts\" setup>\nimport type { InputProps } from '@/types'\n\nwithDefaults(defineProps<InputProps>(), {\n type: 'text',\n})\n\nconst modelValue = defineModel<string>()\n</script>\n\n<template>\n <input\n :id=\"id ?? name ?? ''\"\n v-model=\"modelValue\"\n :disabled=\"disabled\"\n :name=\"name ?? ''\"\n :placeholder=\"placeholder\"\n :type=\"type\"\n class=\"mt-1 block w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-800 placeholder-gray-400 shadow-sm invalid:border-pink-500 invalid:text-pink-600 focus:border-primary focus:ring-1 focus:ring-primary focus:outline-none focus:invalid:border-pink-500 focus:invalid:ring-pink-500 disabled:border-gray-200 disabled:bg-gray-50 disabled:text-gray-500 disabled:shadow-none dark:border-gray-700 dark:bg-gray-900 dark:text-gray-200 dark:placeholder-gray-500 dark:focus:border-primary dark:focus:ring-primary dark:disabled:border-gray-800 dark:disabled:bg-gray-950 dark:disabled:text-gray-500\"\n v-bind=\"$attrs\"\n />\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, ref, watch, nextTick, onUnmounted } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport type { SelectProps, SelectOption } from '@/types'\n\nconst props = withDefaults(\n defineProps<\n SelectProps & {\n /** Use teleport to body to avoid overflow clipping */\n teleport?: boolean\n /** Show search input in dropdown */\n searchable?: boolean\n /** Text shown when no results match search */\n noResultsText?: string\n /** Custom class for the trigger button */\n triggerClass?: string\n }\n >(),\n {\n teleport: true,\n searchable: false,\n noResultsText: 'No results found',\n },\n)\n\nconst modelValue = defineModel<string | number | boolean | null>()\n\nconst isOpen = ref(false)\nconst searchQuery = ref('')\nconst highlightedIndex = ref(-1)\nconst triggerRef = ref<HTMLElement>()\nconst dropdownRef = ref<HTMLElement>()\nconst searchInputRef = ref<HTMLInputElement>()\nconst dropdownPosition = ref({ top: 0, left: 0, width: 0 })\n\nconst visibleOptions = computed(() => {\n return (props.options ?? []).filter((opt) => !opt.hidden)\n})\n\nconst filteredOptions = computed(() => {\n if (!props.searchable || !searchQuery.value) {\n return visibleOptions.value\n }\n const query = searchQuery.value.toLowerCase()\n return visibleOptions.value.filter((opt) =>\n opt.label.toLowerCase().includes(query) ||\n String(opt.value).toLowerCase().includes(query)\n )\n})\n\nconst selectedOption = computed(() => {\n return visibleOptions.value.find((opt) => opt.value === modelValue.value)\n})\n\nconst displayValue = computed(() => {\n if (selectedOption.value) {\n return selectedOption.value.label\n }\n return props.placeholder || 'Select...'\n})\n\nconst updatePosition = () => {\n if (!triggerRef.value || !props.teleport) return\n const rect = triggerRef.value.getBoundingClientRect()\n dropdownPosition.value = {\n top: rect.bottom + window.scrollY + 4,\n left: rect.left + window.scrollX,\n width: rect.width,\n }\n}\n\nconst open = () => {\n if (props.disabled) return\n isOpen.value = true\n searchQuery.value = ''\n highlightedIndex.value = filteredOptions.value.findIndex(\n (opt) => opt.value === modelValue.value\n )\n nextTick(() => {\n updatePosition()\n if (props.searchable) {\n searchInputRef.value?.focus()\n }\n })\n}\n\nconst close = () => {\n isOpen.value = false\n searchQuery.value = ''\n highlightedIndex.value = -1\n}\n\nconst toggle = () => {\n if (isOpen.value) {\n close()\n } else {\n open()\n }\n}\n\nconst selectOption = (option: SelectOption) => {\n modelValue.value = option.value\n close()\n}\n\nconst handleKeydown = (event: KeyboardEvent) => {\n if (!isOpen.value) {\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') {\n event.preventDefault()\n open()\n }\n return\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n highlightedIndex.value = Math.min(\n highlightedIndex.value + 1,\n filteredOptions.value.length - 1\n )\n scrollToHighlighted()\n break\n case 'ArrowUp':\n event.preventDefault()\n highlightedIndex.value = Math.max(highlightedIndex.value - 1, 0)\n scrollToHighlighted()\n break\n case 'Enter':\n event.preventDefault()\n if (highlightedIndex.value >= 0 && filteredOptions.value[highlightedIndex.value]) {\n selectOption(filteredOptions.value[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\nconst scrollToHighlighted = () => {\n nextTick(() => {\n if (dropdownRef.value) {\n const highlighted = dropdownRef.value.querySelector(\n `[data-index=\"${highlightedIndex.value}\"]`\n ) as HTMLElement\n if (highlighted) {\n highlighted.scrollIntoView({ block: 'nearest' })\n }\n }\n })\n}\n\nconst 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\nwatch(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\nwatch(searchQuery, () => {\n highlightedIndex.value = 0\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n})\n\nconst dropdownStyle = computed(() => {\n if (!props.teleport) return {}\n return {\n position: 'absolute' as const,\n top: `${dropdownPosition.value.top}px`,\n left: `${dropdownPosition.value.left}px`,\n width: `${dropdownPosition.value.width}px`,\n }\n})\n\nconst triggerClasses = computed(() => {\n const base = 'flex w-full items-center justify-between gap-2 rounded-md border px-3 py-2 text-sm text-left transition'\n const state = props.disabled\n ? 'cursor-not-allowed border-gray-200 bg-gray-50 text-gray-500 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-500'\n : isOpen.value\n ? 'border-primary ring-2 ring-primary/20 bg-white dark:bg-gray-900'\n : 'border-gray-300 bg-white hover:border-gray-400 dark:border-gray-700 dark:bg-gray-900 dark:hover:border-gray-600'\n const text = selectedOption.value\n ? 'text-gray-800 dark:text-gray-200'\n : 'text-gray-400 dark:text-gray-500'\n return [base, state, text, props.triggerClass]\n})\n</script>\n\n<template>\n <div class=\"relative\">\n <!-- Trigger -->\n <button\n ref=\"triggerRef\"\n type=\"button\"\n :id=\"id ?? name ?? undefined\"\n :disabled=\"disabled\"\n :class=\"triggerClasses\"\n @click=\"toggle\"\n @keydown=\"handleKeydown\"\n >\n <slot name=\"selected\" :option=\"selectedOption\" :placeholder=\"placeholder\">\n <span class=\"flex-1 truncate\">{{ displayValue }}</span>\n </slot>\n <Icon\n icon=\"lucide:chevron-down\"\n :class=\"['size-4 shrink-0 text-gray-400 transition-transform', isOpen && 'rotate-180']\"\n />\n </button>\n\n <!-- Dropdown -->\n <Teleport to=\"body\" :disabled=\"!teleport\">\n <Transition\n enter-active-class=\"transition duration-100 ease-out\"\n enter-from-class=\"opacity-0 scale-95\"\n enter-to-class=\"opacity-100 scale-100\"\n leave-active-class=\"transition duration-75 ease-in\"\n leave-from-class=\"opacity-100 scale-100\"\n leave-to-class=\"opacity-0 scale-95\"\n >\n <div\n v-if=\"isOpen\"\n ref=\"dropdownRef\"\n :style=\"dropdownStyle\"\n :class=\"[\n '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',\n !teleport && 'absolute mt-1 w-full',\n ]\"\n >\n <!-- Search input -->\n <div v-if=\"searchable\" class=\"sticky top-0 border-b border-gray-200 bg-white p-2 dark:border-gray-700 dark:bg-gray-800\">\n <div class=\"flex items-center gap-2 rounded-md border border-gray-300 bg-gray-50 px-2 py-1.5 dark:border-gray-600 dark:bg-gray-900\">\n <Icon icon=\"lucide:search\" class=\"size-4 text-gray-400\" />\n <input\n ref=\"searchInputRef\"\n v-model=\"searchQuery\"\n type=\"text\"\n class=\"flex-1 bg-transparent text-sm outline-none dark:text-white\"\n placeholder=\"Search...\"\n @keydown=\"handleKeydown\"\n />\n </div>\n </div>\n\n <!-- Empty state -->\n <div\n v-if=\"filteredOptions.length === 0\"\n class=\"px-4 py-3 text-sm text-gray-500 dark:text-gray-400\"\n >\n {{ noResultsText }}\n </div>\n\n <!-- Options -->\n <div class=\"py-1\">\n <button\n v-for=\"(option, index) in filteredOptions\"\n :key=\"String(option.value)\"\n type=\"button\"\n :data-index=\"index\"\n :class=\"[\n 'flex w-full items-center gap-2 px-3 py-2 text-left text-sm transition-colors',\n highlightedIndex === index && 'bg-gray-100 dark:bg-gray-700',\n modelValue === option.value && 'bg-primary/10 text-primary',\n modelValue !== option.value && 'text-gray-700 dark:text-gray-200',\n ]\"\n @click=\"selectOption(option)\"\n @mouseenter=\"highlightedIndex = index\"\n >\n <slot name=\"option\" :option=\"option\" :selected=\"modelValue === option.value\" :index=\"index\">\n <Icon\n v-if=\"modelValue === option.value\"\n icon=\"lucide:check\"\n class=\"size-4 shrink-0 text-primary\"\n />\n <span v-else class=\"size-4 shrink-0\" />\n <span class=\"flex-1\">{{ option.label }}</span>\n </slot>\n </button>\n </div>\n </div>\n </Transition>\n </Teleport>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport type { FormGroupProps } from '@/types'\nimport FormLabel from './FormLabel.vue'\nimport FormInput from './FormInput.vue'\nimport FormSelect from './FormSelect.vue'\nimport FormHelp from './FormHelp.vue'\n\nconst props = withDefaults(defineProps<FormGroupProps>(), {\n cols: 6,\n})\n\nconst modelValue = defineModel()\n\nconst computedCols = computed(() => `span ${props.cols} / span ${props.cols}`)\n\nconst isSelect = computed(() => props.select === true)\n</script>\n\n<template>\n <div :style=\"{ gridColumn: computedCols }\" :hidden=\"hidden\">\n <slot>\n <slot name=\"label\">\n <FormLabel v-if=\"label\" :html-for=\"id ?? name\" :error=\"error\">\n {{ label }}\n </FormLabel>\n </slot>\n\n <slot name=\"input\">\n <FormSelect\n v-if=\"isSelect\"\n v-model=\"modelValue\"\n v-bind=\"{ ...$attrs, ...$props }\"\n />\n <FormInput\n v-else\n v-model=\"modelValue\"\n v-bind=\"{ ...$attrs, ...$props }\"\n />\n </slot>\n\n <FormHelp v-if=\"error && typeof error === 'string'\" :error=\"true\">\n {{ error }}\n </FormHelp>\n </slot>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nconst {\n placeholder = 'Search...',\n icon = 'lucide:search',\n disabled = false,\n} = defineProps<{\n modelValue?: string\n placeholder?: string\n icon?: string\n disabled?: boolean\n}>()\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n}>()\n\nconst handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.value)\n}\n</script>\n\n<template>\n <div class=\"relative\">\n <Icon :icon=\"icon\" class=\"absolute top-1/2 left-3 h-5 w-5 -translate-y-1/2 text-gray-400\" />\n <input\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :value=\"modelValue\"\n class=\"focus:border-primary focus:ring-primary w-full rounded-lg border border-gray-300 bg-white py-2 pr-4 pl-10 text-gray-900 placeholder-gray-400 transition-colors disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-500\"\n type=\"text\"\n @input=\"handleInput\"\n />\n </div>\n</template>\n","<script lang=\"ts\" setup>\n\nconst props = withDefaults(\n defineProps<{\n /** v-model value */\n modelValue?: boolean\n /** Label text */\n label?: string\n /** Description text */\n description?: string\n /** Disabled state */\n disabled?: boolean\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n }>(),\n {\n modelValue: false,\n size: 'md',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n}>()\n\nconst toggle = () => {\n if (props.disabled) return\n emit('update:modelValue', !props.modelValue)\n}\n\nconst switchSizes = {\n sm: 'h-5 w-9',\n md: 'h-6 w-11',\n lg: 'h-7 w-14',\n}\n\nconst dotSizes = {\n sm: 'size-3',\n md: 'size-4',\n lg: 'size-5',\n}\n\nconst translateSizes = {\n sm: 'translate-x-5',\n md: 'translate-x-6',\n lg: 'translate-x-8',\n}\n</script>\n\n<template>\n <label\n class=\"inline-flex items-start gap-3\"\n :class=\"disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'\"\n >\n <button\n type=\"button\"\n role=\"switch\"\n :aria-checked=\"modelValue\"\n :disabled=\"disabled\"\n :class=\"[\n 'relative inline-flex shrink-0 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2',\n switchSizes[size],\n modelValue ? 'bg-primary' : 'bg-gray-300 dark:bg-gray-600',\n ]\"\n @click=\"toggle\"\n >\n <span\n :class=\"[\n 'inline-block transform rounded-full bg-white shadow-sm transition-transform',\n dotSizes[size],\n modelValue ? translateSizes[size] : 'translate-x-1',\n ]\"\n />\n </button>\n <div v-if=\"label || description\" class=\"flex flex-col\">\n <span v-if=\"label\" class=\"text-sm font-medium text-gray-900 dark:text-white\">\n {{ label }}\n </span>\n <span v-if=\"description\" class=\"text-sm text-gray-500 dark:text-gray-400\">\n {{ description }}\n </span>\n </div>\n </label>\n</template>\n","<script lang=\"ts\" setup>\nwithDefaults(\n defineProps<{\n /** v-model value */\n modelValue?: boolean\n /** Label text */\n label?: string\n /** Description text */\n description?: string\n /** Disabled state */\n disabled?: boolean\n /** Indeterminate state */\n indeterminate?: boolean\n }>(),\n {\n modelValue: false,\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n}>()\n\nconst toggle = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.checked)\n}\n</script>\n\n<template>\n <label\n class=\"inline-flex items-start gap-3\"\n :class=\"disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'\"\n >\n <input\n type=\"checkbox\"\n :checked=\"modelValue\"\n :disabled=\"disabled\"\n :indeterminate=\"indeterminate\"\n class=\"mt-0.5 size-4 rounded border-gray-300 text-primary/90 focus:ring-2 focus:ring-primary focus:ring-offset-2 disabled:cursor-not-allowed dark:border-gray-600 dark:bg-gray-800 dark:focus:ring-offset-gray-900\"\n @change=\"toggle\"\n />\n <div v-if=\"label || description\" class=\"flex flex-col\">\n <span v-if=\"label\" class=\"text-sm font-medium text-gray-900 dark:text-white\">\n {{ label }}\n </span>\n <span v-if=\"description\" class=\"text-sm text-gray-500 dark:text-gray-400\">\n {{ description }}\n </span>\n </div>\n </label>\n</template>\n"],"names":["_createElementBlock","_renderSlot","_useModel","_withDirectives","_openBlock","_mergeProps","$attrs","_hoisted_1","_createElementVNode","_hoisted_3","_toDisplayString","_createVNode","_unref","_createBlock","_Teleport","_Transition","_normalizeClass","_hoisted_4","_Fragment","_renderList","FormLabel","FormSelect","$props","FormInput","FormHelp","_hoisted_2"],"mappings":"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"}
|
|
@@ -388,6 +388,7 @@ const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
|
|
|
388
388
|
cols: { default: 6 },
|
|
389
389
|
hidden: { type: Boolean },
|
|
390
390
|
error: { type: [String, Boolean] },
|
|
391
|
+
select: { type: Boolean },
|
|
391
392
|
type: {},
|
|
392
393
|
value: {},
|
|
393
394
|
placeholder: {},
|
|
@@ -405,7 +406,7 @@ const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
|
|
|
405
406
|
const props = __props;
|
|
406
407
|
const modelValue = vue.useModel(__props, "modelValue");
|
|
407
408
|
const computedCols = vue.computed(() => `span ${props.cols} / span ${props.cols}`);
|
|
408
|
-
const isSelect = vue.computed(() => props.
|
|
409
|
+
const isSelect = vue.computed(() => props.select === true);
|
|
409
410
|
return (_ctx, _cache) => {
|
|
410
411
|
return vue.openBlock(), vue.createElementBlock("div", {
|
|
411
412
|
style: vue.normalizeStyle({ gridColumn: computedCols.value }),
|
|
@@ -618,4 +619,4 @@ exports._sfc_main$4 = _sfc_main$3;
|
|
|
618
619
|
exports._sfc_main$5 = _sfc_main$2;
|
|
619
620
|
exports._sfc_main$6 = _sfc_main$1;
|
|
620
621
|
exports._sfc_main$7 = _sfc_main;
|
|
621
|
-
//# sourceMappingURL=Checkbox.vue_vue_type_script_setup_true_lang-
|
|
622
|
+
//# sourceMappingURL=Checkbox.vue_vue_type_script_setup_true_lang-CgLR8V21.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox.vue_vue_type_script_setup_true_lang-CgLR8V21.cjs","sources":["../src/components/form/FormLabel.vue","../src/components/form/FormHelp.vue","../src/components/form/FormInput.vue","../src/components/form/FormSelect.vue","../src/components/form/FormGroup.vue","../src/components/form/SearchInput.vue","../src/components/form/Switch.vue","../src/components/form/Checkbox.vue"],"sourcesContent":["<script lang=\"ts\" setup>\ndefineProps<{\n error?: string | boolean\n htmlFor?: string\n}>()\n</script>\n\n<template>\n <label\n :data-error=\"!!error\"\n :for=\"htmlFor ?? ''\"\n class=\"block text-sm font-medium text-gray-700 data-[error=true]:text-red-500 dark:text-gray-300\"\n >\n <slot />\n </label>\n</template>\n","<script lang=\"ts\" setup>\ndefineProps<{\n error?: boolean\n text?: string\n}>()\n</script>\n\n<template>\n <p\n :data-error=\"error\"\n class=\"mt-2 text-sm text-gray-400 peer-invalid:visible data-[error=true]:text-red-500 dark:text-gray-500\"\n >\n <slot>{{ text ?? '' }}</slot>\n </p>\n</template>\n","<script lang=\"ts\" setup>\nimport type { InputProps } from '@/types'\n\nwithDefaults(defineProps<InputProps>(), {\n type: 'text',\n})\n\nconst modelValue = defineModel<string>()\n</script>\n\n<template>\n <input\n :id=\"id ?? name ?? ''\"\n v-model=\"modelValue\"\n :disabled=\"disabled\"\n :name=\"name ?? ''\"\n :placeholder=\"placeholder\"\n :type=\"type\"\n class=\"mt-1 block w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-800 placeholder-gray-400 shadow-sm invalid:border-pink-500 invalid:text-pink-600 focus:border-primary focus:ring-1 focus:ring-primary focus:outline-none focus:invalid:border-pink-500 focus:invalid:ring-pink-500 disabled:border-gray-200 disabled:bg-gray-50 disabled:text-gray-500 disabled:shadow-none dark:border-gray-700 dark:bg-gray-900 dark:text-gray-200 dark:placeholder-gray-500 dark:focus:border-primary dark:focus:ring-primary dark:disabled:border-gray-800 dark:disabled:bg-gray-950 dark:disabled:text-gray-500\"\n v-bind=\"$attrs\"\n />\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, ref, watch, nextTick, onUnmounted } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport type { SelectProps, SelectOption } from '@/types'\n\nconst props = withDefaults(\n defineProps<\n SelectProps & {\n /** Use teleport to body to avoid overflow clipping */\n teleport?: boolean\n /** Show search input in dropdown */\n searchable?: boolean\n /** Text shown when no results match search */\n noResultsText?: string\n /** Custom class for the trigger button */\n triggerClass?: string\n }\n >(),\n {\n teleport: true,\n searchable: false,\n noResultsText: 'No results found',\n },\n)\n\nconst modelValue = defineModel<string | number | boolean | null>()\n\nconst isOpen = ref(false)\nconst searchQuery = ref('')\nconst highlightedIndex = ref(-1)\nconst triggerRef = ref<HTMLElement>()\nconst dropdownRef = ref<HTMLElement>()\nconst searchInputRef = ref<HTMLInputElement>()\nconst dropdownPosition = ref({ top: 0, left: 0, width: 0 })\n\nconst visibleOptions = computed(() => {\n return (props.options ?? []).filter((opt) => !opt.hidden)\n})\n\nconst filteredOptions = computed(() => {\n if (!props.searchable || !searchQuery.value) {\n return visibleOptions.value\n }\n const query = searchQuery.value.toLowerCase()\n return visibleOptions.value.filter((opt) =>\n opt.label.toLowerCase().includes(query) ||\n String(opt.value).toLowerCase().includes(query)\n )\n})\n\nconst selectedOption = computed(() => {\n return visibleOptions.value.find((opt) => opt.value === modelValue.value)\n})\n\nconst displayValue = computed(() => {\n if (selectedOption.value) {\n return selectedOption.value.label\n }\n return props.placeholder || 'Select...'\n})\n\nconst updatePosition = () => {\n if (!triggerRef.value || !props.teleport) return\n const rect = triggerRef.value.getBoundingClientRect()\n dropdownPosition.value = {\n top: rect.bottom + window.scrollY + 4,\n left: rect.left + window.scrollX,\n width: rect.width,\n }\n}\n\nconst open = () => {\n if (props.disabled) return\n isOpen.value = true\n searchQuery.value = ''\n highlightedIndex.value = filteredOptions.value.findIndex(\n (opt) => opt.value === modelValue.value\n )\n nextTick(() => {\n updatePosition()\n if (props.searchable) {\n searchInputRef.value?.focus()\n }\n })\n}\n\nconst close = () => {\n isOpen.value = false\n searchQuery.value = ''\n highlightedIndex.value = -1\n}\n\nconst toggle = () => {\n if (isOpen.value) {\n close()\n } else {\n open()\n }\n}\n\nconst selectOption = (option: SelectOption) => {\n modelValue.value = option.value\n close()\n}\n\nconst handleKeydown = (event: KeyboardEvent) => {\n if (!isOpen.value) {\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') {\n event.preventDefault()\n open()\n }\n return\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n highlightedIndex.value = Math.min(\n highlightedIndex.value + 1,\n filteredOptions.value.length - 1\n )\n scrollToHighlighted()\n break\n case 'ArrowUp':\n event.preventDefault()\n highlightedIndex.value = Math.max(highlightedIndex.value - 1, 0)\n scrollToHighlighted()\n break\n case 'Enter':\n event.preventDefault()\n if (highlightedIndex.value >= 0 && filteredOptions.value[highlightedIndex.value]) {\n selectOption(filteredOptions.value[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\nconst scrollToHighlighted = () => {\n nextTick(() => {\n if (dropdownRef.value) {\n const highlighted = dropdownRef.value.querySelector(\n `[data-index=\"${highlightedIndex.value}\"]`\n ) as HTMLElement\n if (highlighted) {\n highlighted.scrollIntoView({ block: 'nearest' })\n }\n }\n })\n}\n\nconst 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\nwatch(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\nwatch(searchQuery, () => {\n highlightedIndex.value = 0\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n})\n\nconst dropdownStyle = computed(() => {\n if (!props.teleport) return {}\n return {\n position: 'absolute' as const,\n top: `${dropdownPosition.value.top}px`,\n left: `${dropdownPosition.value.left}px`,\n width: `${dropdownPosition.value.width}px`,\n }\n})\n\nconst triggerClasses = computed(() => {\n const base = 'flex w-full items-center justify-between gap-2 rounded-md border px-3 py-2 text-sm text-left transition'\n const state = props.disabled\n ? 'cursor-not-allowed border-gray-200 bg-gray-50 text-gray-500 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-500'\n : isOpen.value\n ? 'border-primary ring-2 ring-primary/20 bg-white dark:bg-gray-900'\n : 'border-gray-300 bg-white hover:border-gray-400 dark:border-gray-700 dark:bg-gray-900 dark:hover:border-gray-600'\n const text = selectedOption.value\n ? 'text-gray-800 dark:text-gray-200'\n : 'text-gray-400 dark:text-gray-500'\n return [base, state, text, props.triggerClass]\n})\n</script>\n\n<template>\n <div class=\"relative\">\n <!-- Trigger -->\n <button\n ref=\"triggerRef\"\n type=\"button\"\n :id=\"id ?? name ?? undefined\"\n :disabled=\"disabled\"\n :class=\"triggerClasses\"\n @click=\"toggle\"\n @keydown=\"handleKeydown\"\n >\n <slot name=\"selected\" :option=\"selectedOption\" :placeholder=\"placeholder\">\n <span class=\"flex-1 truncate\">{{ displayValue }}</span>\n </slot>\n <Icon\n icon=\"lucide:chevron-down\"\n :class=\"['size-4 shrink-0 text-gray-400 transition-transform', isOpen && 'rotate-180']\"\n />\n </button>\n\n <!-- Dropdown -->\n <Teleport to=\"body\" :disabled=\"!teleport\">\n <Transition\n enter-active-class=\"transition duration-100 ease-out\"\n enter-from-class=\"opacity-0 scale-95\"\n enter-to-class=\"opacity-100 scale-100\"\n leave-active-class=\"transition duration-75 ease-in\"\n leave-from-class=\"opacity-100 scale-100\"\n leave-to-class=\"opacity-0 scale-95\"\n >\n <div\n v-if=\"isOpen\"\n ref=\"dropdownRef\"\n :style=\"dropdownStyle\"\n :class=\"[\n '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',\n !teleport && 'absolute mt-1 w-full',\n ]\"\n >\n <!-- Search input -->\n <div v-if=\"searchable\" class=\"sticky top-0 border-b border-gray-200 bg-white p-2 dark:border-gray-700 dark:bg-gray-800\">\n <div class=\"flex items-center gap-2 rounded-md border border-gray-300 bg-gray-50 px-2 py-1.5 dark:border-gray-600 dark:bg-gray-900\">\n <Icon icon=\"lucide:search\" class=\"size-4 text-gray-400\" />\n <input\n ref=\"searchInputRef\"\n v-model=\"searchQuery\"\n type=\"text\"\n class=\"flex-1 bg-transparent text-sm outline-none dark:text-white\"\n placeholder=\"Search...\"\n @keydown=\"handleKeydown\"\n />\n </div>\n </div>\n\n <!-- Empty state -->\n <div\n v-if=\"filteredOptions.length === 0\"\n class=\"px-4 py-3 text-sm text-gray-500 dark:text-gray-400\"\n >\n {{ noResultsText }}\n </div>\n\n <!-- Options -->\n <div class=\"py-1\">\n <button\n v-for=\"(option, index) in filteredOptions\"\n :key=\"String(option.value)\"\n type=\"button\"\n :data-index=\"index\"\n :class=\"[\n 'flex w-full items-center gap-2 px-3 py-2 text-left text-sm transition-colors',\n highlightedIndex === index && 'bg-gray-100 dark:bg-gray-700',\n modelValue === option.value && 'bg-primary/10 text-primary',\n modelValue !== option.value && 'text-gray-700 dark:text-gray-200',\n ]\"\n @click=\"selectOption(option)\"\n @mouseenter=\"highlightedIndex = index\"\n >\n <slot name=\"option\" :option=\"option\" :selected=\"modelValue === option.value\" :index=\"index\">\n <Icon\n v-if=\"modelValue === option.value\"\n icon=\"lucide:check\"\n class=\"size-4 shrink-0 text-primary\"\n />\n <span v-else class=\"size-4 shrink-0\" />\n <span class=\"flex-1\">{{ option.label }}</span>\n </slot>\n </button>\n </div>\n </div>\n </Transition>\n </Teleport>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport type { FormGroupProps } from '@/types'\nimport FormLabel from './FormLabel.vue'\nimport FormInput from './FormInput.vue'\nimport FormSelect from './FormSelect.vue'\nimport FormHelp from './FormHelp.vue'\n\nconst props = withDefaults(defineProps<FormGroupProps>(), {\n cols: 6,\n})\n\nconst modelValue = defineModel()\n\nconst computedCols = computed(() => `span ${props.cols} / span ${props.cols}`)\n\nconst isSelect = computed(() => props.select === true)\n</script>\n\n<template>\n <div :style=\"{ gridColumn: computedCols }\" :hidden=\"hidden\">\n <slot>\n <slot name=\"label\">\n <FormLabel v-if=\"label\" :html-for=\"id ?? name\" :error=\"error\">\n {{ label }}\n </FormLabel>\n </slot>\n\n <slot name=\"input\">\n <FormSelect\n v-if=\"isSelect\"\n v-model=\"modelValue\"\n v-bind=\"{ ...$attrs, ...$props }\"\n />\n <FormInput\n v-else\n v-model=\"modelValue\"\n v-bind=\"{ ...$attrs, ...$props }\"\n />\n </slot>\n\n <FormHelp v-if=\"error && typeof error === 'string'\" :error=\"true\">\n {{ error }}\n </FormHelp>\n </slot>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nconst {\n placeholder = 'Search...',\n icon = 'lucide:search',\n disabled = false,\n} = defineProps<{\n modelValue?: string\n placeholder?: string\n icon?: string\n disabled?: boolean\n}>()\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n}>()\n\nconst handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.value)\n}\n</script>\n\n<template>\n <div class=\"relative\">\n <Icon :icon=\"icon\" class=\"absolute top-1/2 left-3 h-5 w-5 -translate-y-1/2 text-gray-400\" />\n <input\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :value=\"modelValue\"\n class=\"focus:border-primary focus:ring-primary w-full rounded-lg border border-gray-300 bg-white py-2 pr-4 pl-10 text-gray-900 placeholder-gray-400 transition-colors disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-500\"\n type=\"text\"\n @input=\"handleInput\"\n />\n </div>\n</template>\n","<script lang=\"ts\" setup>\n\nconst props = withDefaults(\n defineProps<{\n /** v-model value */\n modelValue?: boolean\n /** Label text */\n label?: string\n /** Description text */\n description?: string\n /** Disabled state */\n disabled?: boolean\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n }>(),\n {\n modelValue: false,\n size: 'md',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n}>()\n\nconst toggle = () => {\n if (props.disabled) return\n emit('update:modelValue', !props.modelValue)\n}\n\nconst switchSizes = {\n sm: 'h-5 w-9',\n md: 'h-6 w-11',\n lg: 'h-7 w-14',\n}\n\nconst dotSizes = {\n sm: 'size-3',\n md: 'size-4',\n lg: 'size-5',\n}\n\nconst translateSizes = {\n sm: 'translate-x-5',\n md: 'translate-x-6',\n lg: 'translate-x-8',\n}\n</script>\n\n<template>\n <label\n class=\"inline-flex items-start gap-3\"\n :class=\"disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'\"\n >\n <button\n type=\"button\"\n role=\"switch\"\n :aria-checked=\"modelValue\"\n :disabled=\"disabled\"\n :class=\"[\n 'relative inline-flex shrink-0 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2',\n switchSizes[size],\n modelValue ? 'bg-primary' : 'bg-gray-300 dark:bg-gray-600',\n ]\"\n @click=\"toggle\"\n >\n <span\n :class=\"[\n 'inline-block transform rounded-full bg-white shadow-sm transition-transform',\n dotSizes[size],\n modelValue ? translateSizes[size] : 'translate-x-1',\n ]\"\n />\n </button>\n <div v-if=\"label || description\" class=\"flex flex-col\">\n <span v-if=\"label\" class=\"text-sm font-medium text-gray-900 dark:text-white\">\n {{ label }}\n </span>\n <span v-if=\"description\" class=\"text-sm text-gray-500 dark:text-gray-400\">\n {{ description }}\n </span>\n </div>\n </label>\n</template>\n","<script lang=\"ts\" setup>\nwithDefaults(\n defineProps<{\n /** v-model value */\n modelValue?: boolean\n /** Label text */\n label?: string\n /** Description text */\n description?: string\n /** Disabled state */\n disabled?: boolean\n /** Indeterminate state */\n indeterminate?: boolean\n }>(),\n {\n modelValue: false,\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n}>()\n\nconst toggle = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.checked)\n}\n</script>\n\n<template>\n <label\n class=\"inline-flex items-start gap-3\"\n :class=\"disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'\"\n >\n <input\n type=\"checkbox\"\n :checked=\"modelValue\"\n :disabled=\"disabled\"\n :indeterminate=\"indeterminate\"\n class=\"mt-0.5 size-4 rounded border-gray-300 text-primary/90 focus:ring-2 focus:ring-primary focus:ring-offset-2 disabled:cursor-not-allowed dark:border-gray-600 dark:bg-gray-800 dark:focus:ring-offset-gray-900\"\n @change=\"toggle\"\n />\n <div v-if=\"label || description\" class=\"flex flex-col\">\n <span v-if=\"label\" class=\"text-sm font-medium text-gray-900 dark:text-white\">\n {{ label }}\n </span>\n <span v-if=\"description\" class=\"text-sm text-gray-500 dark:text-gray-400\">\n {{ description }}\n </span>\n </div>\n </label>\n</template>\n"],"names":["_createElementBlock","_renderSlot","_useModel","_withDirectives","_openBlock","_mergeProps","$attrs","_hoisted_1","ref","computed","nextTick","watch","onUnmounted","_createElementVNode","_hoisted_3","_toDisplayString","_createVNode","_unref","Icon","_createBlock","_Teleport","_Transition","_normalizeClass","_hoisted_4","_Fragment","_renderList","FormLabel","FormSelect","$props","FormInput","FormHelp","_hoisted_2"],"mappings":";;;;;;;;;;;;8BAQEA,IAAAA,mBAMQ,SAAA;AAAA,QALL,gBAAc,QAAA;AAAA,QACd,KAAK,QAAA,WAAO;AAAA,QACb,OAAM;AAAA,MAAA;QAENC,eAAQ,KAAA,QAAA,SAAA;AAAA,MAAA;;;;;;;;;;;;;8BCLVD,IAAAA,mBAKI,KAAA;AAAA,QAJD,cAAY,QAAA;AAAA,QACb,OAAM;AAAA,MAAA;QAENC,IAAAA,WAA6B,4BAA7B,MAA6B;AAAA,kDAApB,QAAA,QAAI,EAAA,GAAA,CAAA;AAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;ACLjB,UAAM,aAAaC,IAAAA,SAAmB,SAAA,YAAC;;AAIrC,aAAAC,IAAAA,gBAAAC,IAAAA,UAAA,GAAAJ,IAAAA,mBASE,SATFK,IAAAA,WASE;AAAA,QARC,IAAI,QAAA,MAAM,QAAA,QAAI;AAAA,qEACN,WAAU,QAAA;AAAA,QAClB,UAAU,QAAA;AAAA,QACV,MAAM,QAAA,QAAI;AAAA,QACV,aAAa,QAAA;AAAA,QACb,MAAM,QAAA;AAAA,QACP,OAAM;AAAA,MAAA,GACEC,KAAAA,MAAM,GAAA,MAAA,IAAAC,YAAA,IAAA;AAAA,4BANL,WAAA,KAAU;AAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACRvB,UAAM,QAAQ;AAoBd,UAAM,aAAaL,IAAAA,SAA6C,SAAA,YAAC;AAEjE,UAAM,SAASM,IAAAA,IAAI,KAAK;AACxB,UAAM,cAAcA,IAAAA,IAAI,EAAE;AAC1B,UAAM,mBAAmBA,IAAAA,IAAI,EAAE;AAC/B,UAAM,aAAaA,IAAAA,IAAA;AACnB,UAAM,cAAcA,IAAAA,IAAA;AACpB,UAAM,iBAAiBA,IAAAA,IAAA;AACvB,UAAM,mBAAmBA,QAAI,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG;AAE1D,UAAM,iBAAiBC,IAAAA,SAAS,MAAM;AACpC,cAAQ,MAAM,WAAW,CAAA,GAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,MAAM;AAAA,IAC1D,CAAC;AAED,UAAM,kBAAkBA,IAAAA,SAAS,MAAM;AACrC,UAAI,CAAC,MAAM,cAAc,CAAC,YAAY,OAAO;AAC3C,eAAO,eAAe;AAAA,MACxB;AACA,YAAM,QAAQ,YAAY,MAAM,YAAA;AAChC,aAAO,eAAe,MAAM;AAAA,QAAO,CAAC,QAClC,IAAI,MAAM,YAAA,EAAc,SAAS,KAAK,KACtC,OAAO,IAAI,KAAK,EAAE,YAAA,EAAc,SAAS,KAAK;AAAA,MAAA;AAAA,IAElD,CAAC;AAED,UAAM,iBAAiBA,IAAAA,SAAS,MAAM;AACpC,aAAO,eAAe,MAAM,KAAK,CAAC,QAAQ,IAAI,UAAU,WAAW,KAAK;AAAA,IAC1E,CAAC;AAED,UAAM,eAAeA,IAAAA,SAAS,MAAM;AAClC,UAAI,eAAe,OAAO;AACxB,eAAO,eAAe,MAAM;AAAA,MAC9B;AACA,aAAO,MAAM,eAAe;AAAA,IAC9B,CAAC;AAED,UAAM,iBAAiB,MAAM;AAC3B,UAAI,CAAC,WAAW,SAAS,CAAC,MAAM,SAAU;AAC1C,YAAM,OAAO,WAAW,MAAM,sBAAA;AAC9B,uBAAiB,QAAQ;AAAA,QACvB,KAAK,KAAK,SAAS,OAAO,UAAU;AAAA,QACpC,MAAM,KAAK,OAAO,OAAO;AAAA,QACzB,OAAO,KAAK;AAAA,MAAA;AAAA,IAEhB;AAEA,UAAM,OAAO,MAAM;AACjB,UAAI,MAAM,SAAU;AACpB,aAAO,QAAQ;AACf,kBAAY,QAAQ;AACpB,uBAAiB,QAAQ,gBAAgB,MAAM;AAAA,QAC7C,CAAC,QAAQ,IAAI,UAAU,WAAW;AAAA,MAAA;AAEpCC,UAAAA,SAAS,MAAM;;AACb,uBAAA;AACA,YAAI,MAAM,YAAY;AACpB,+BAAe,UAAf,mBAAsB;AAAA,QACxB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,QAAQ,MAAM;AAClB,aAAO,QAAQ;AACf,kBAAY,QAAQ;AACpB,uBAAiB,QAAQ;AAAA,IAC3B;AAEA,UAAM,SAAS,MAAM;AACnB,UAAI,OAAO,OAAO;AAChB,cAAA;AAAA,MACF,OAAO;AACL,aAAA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAAe,CAAC,WAAyB;AAC7C,iBAAW,QAAQ,OAAO;AAC1B,YAAA;AAAA,IACF;AAEA,UAAM,gBAAgB,CAAC,UAAyB;AAC9C,UAAI,CAAC,OAAO,OAAO;AACjB,YAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,OAAO,MAAM,QAAQ,aAAa;AAC3E,gBAAM,eAAA;AACN,eAAA;AAAA,QACF;AACA;AAAA,MACF;AAEA,cAAQ,MAAM,KAAA;AAAA,QACZ,KAAK;AACH,gBAAM,eAAA;AACN,2BAAiB,QAAQ,KAAK;AAAA,YAC5B,iBAAiB,QAAQ;AAAA,YACzB,gBAAgB,MAAM,SAAS;AAAA,UAAA;AAEjC,8BAAA;AACA;AAAA,QACF,KAAK;AACH,gBAAM,eAAA;AACN,2BAAiB,QAAQ,KAAK,IAAI,iBAAiB,QAAQ,GAAG,CAAC;AAC/D,8BAAA;AACA;AAAA,QACF,KAAK;AACH,gBAAM,eAAA;AACN,cAAI,iBAAiB,SAAS,KAAK,gBAAgB,MAAM,iBAAiB,KAAK,GAAG;AAChF,yBAAa,gBAAgB,MAAM,iBAAiB,KAAK,CAAC;AAAA,UAC5D;AACA;AAAA,QACF,KAAK;AACH,gBAAM,eAAA;AACN,gBAAA;AACA;AAAA,QACF,KAAK;AACH,gBAAA;AACA;AAAA,MAAA;AAAA,IAEN;AAEA,UAAM,sBAAsB,MAAM;AAChCA,UAAAA,SAAS,MAAM;AACb,YAAI,YAAY,OAAO;AACrB,gBAAM,cAAc,YAAY,MAAM;AAAA,YACpC,gBAAgB,iBAAiB,KAAK;AAAA,UAAA;AAExC,cAAI,aAAa;AACf,wBAAY,eAAe,EAAE,OAAO,UAAA,CAAW;AAAA,UACjD;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,qBAAqB,CAAC,UAAsB;;AAChD,YAAM,SAAS,MAAM;AACrB,YAAM,mBAAkB,gBAAW,UAAX,mBAAkB,SAAS;AACnD,YAAM,oBAAmB,iBAAY,UAAZ,mBAAmB,SAAS;AACrD,UAAI,CAAC,mBAAmB,CAAC,kBAAkB;AACzC,cAAA;AAAA,MACF;AAAA,IACF;AAEAC,cAAM,QAAQ,CAAC,aAAa;AAC1B,UAAI,UAAU;AACZ,iBAAS,iBAAiB,SAAS,kBAAkB;AACrD,eAAO,iBAAiB,UAAU,gBAAgB,IAAI;AACtD,eAAO,iBAAiB,UAAU,cAAc;AAAA,MAClD,OAAO;AACL,iBAAS,oBAAoB,SAAS,kBAAkB;AACxD,eAAO,oBAAoB,UAAU,gBAAgB,IAAI;AACzD,eAAO,oBAAoB,UAAU,cAAc;AAAA,MACrD;AAAA,IACF,CAAC;AAEDA,QAAAA,MAAM,aAAa,MAAM;AACvB,uBAAiB,QAAQ;AAAA,IAC3B,CAAC;AAEDC,QAAAA,YAAY,MAAM;AAChB,eAAS,oBAAoB,SAAS,kBAAkB;AACxD,aAAO,oBAAoB,UAAU,gBAAgB,IAAI;AACzD,aAAO,oBAAoB,UAAU,cAAc;AAAA,IACrD,CAAC;AAED,UAAM,gBAAgBH,IAAAA,SAAS,MAAM;AACnC,UAAI,CAAC,MAAM,SAAU,QAAO,CAAA;AAC5B,aAAO;AAAA,QACL,UAAU;AAAA,QACV,KAAK,GAAG,iBAAiB,MAAM,GAAG;AAAA,QAClC,MAAM,GAAG,iBAAiB,MAAM,IAAI;AAAA,QACpC,OAAO,GAAG,iBAAiB,MAAM,KAAK;AAAA,MAAA;AAAA,IAE1C,CAAC;AAED,UAAM,iBAAiBA,IAAAA,SAAS,MAAM;AACpC,YAAM,OAAO;AACb,YAAM,QAAQ,MAAM,WAChB,yHACA,OAAO,QACL,oEACA;AACN,YAAM,OAAO,eAAe,QACxB,qCACA;AACJ,aAAO,CAAC,MAAM,OAAO,MAAM,MAAM,YAAY;AAAA,IAC/C,CAAC;;AAIC,aAAAL,cAAA,GAAAJ,uBA4FM,OA5FNO,cA4FM;AAAA,QA1FJM,IAAAA,mBAgBS,UAAA;AAAA,mBAfH;AAAA,UAAJ,KAAI;AAAA,UACJ,MAAK;AAAA,UACJ,IAAI,QAAA,MAAM,QAAA,QAAQ;AAAA,UAClB,UAAU,QAAA;AAAA,UACV,0BAAO,eAAA,KAAc;AAAA,UACrB,SAAO;AAAA,UACP,WAAS;AAAA,QAAA;UAEVZ,eAEO,KAAA,QAAA,YAAA;AAAA,YAFgB,QAAQ,eAAA;AAAA,YAAiB,aAAa,QAAA;AAAA,UAAA,GAA7D,MAEO;AAAA,YADLY,IAAAA,mBAAuD,QAAvDC,cAAuDC,IAAAA,gBAAtB,aAAA,KAAY,GAAA,CAAA;AAAA,UAAA;UAE/CC,gBAGEC,IAAAA,MAAAC,MAAAA,IAAA,GAAA;AAAA,YAFA,MAAK;AAAA,YACJ,iFAA8D,OAAA,SAAM,YAAA,CAAA;AAAA,UAAA;;0BAKzEC,IAAAA,YAsEWC,cAAA;AAAA,UAtED,IAAG;AAAA,UAAQ,WAAW,QAAA;AAAA,QAAA;UAC9BJ,IAAAA,YAoEaK,IAAAA,YAAA;AAAA,YAnEX,sBAAmB;AAAA,YACnB,oBAAiB;AAAA,YACjB,kBAAe;AAAA,YACf,sBAAmB;AAAA,YACnB,oBAAiB;AAAA,YACjB,kBAAe;AAAA,UAAA;iCAEf,MA2DM;AAAA,cA1DE,OAAA,0BADRrB,IAAAA,mBA2DM,OAAA;AAAA;yBAzDA;AAAA,gBAAJ,KAAI;AAAA,gBACH,0BAAO,cAAA,KAAa;AAAA,gBACpB,OAAKsB,IAAAA,eAAA;AAAA;mBAA2J,QAAA,YAAQ;AAAA,gBAAA;;gBAM9J,QAAA,cAAXlB,IAAAA,UAAA,GAAAJ,IAAAA,mBAYM,OAZNuB,cAYM;AAAA,kBAXJV,IAAAA,mBAUM,OAVN,YAUM;AAAA,oBATJG,gBAA0DC,IAAAA,MAAAC,MAAAA,IAAA,GAAA;AAAA,sBAApD,MAAK;AAAA,sBAAgB,OAAM;AAAA,oBAAA;uCACjCL,IAAAA,mBAOE,SAAA;AAAA,+BANI;AAAA,sBAAJ,KAAI;AAAA,mFACK,YAAW,QAAA;AAAA,sBACpB,MAAK;AAAA,sBACL,OAAM;AAAA,sBACN,aAAY;AAAA,sBACX,WAAS;AAAA,oBAAA;uCAJD,YAAA,KAAW;AAAA,oBAAA;;;gBAWlB,gBAAA,MAAgB,WAAM,sBAD9Bb,IAAAA,mBAKM,OALN,YAKMe,IAAAA,gBADD,QAAA,aAAa,GAAA,CAAA;gBAIlBF,IAAAA,mBAyBM,OAzBN,YAyBM;AAAA,mBAxBJT,IAAAA,UAAA,IAAA,GAAAJ,IAAAA,mBAuBSwB,cAAA,MAAAC,IAAAA,WAtBmB,gBAAA,OAAe,CAAjC,QAAQ,UAAK;4CADvBzB,IAAAA,mBAuBS,UAAA;AAAA,sBArBN,KAAK,OAAO,OAAO,KAAK;AAAA,sBACzB,MAAK;AAAA,sBACJ,cAAY;AAAA,sBACZ,OAAKsB,IAAAA,eAAA;AAAA;wBAAoH,iBAAA,UAAqB,SAAK;AAAA,wBAAoD,WAAA,UAAe,OAAO,SAAK;AAAA,wBAAkD,WAAA,UAAe,OAAO,SAAK;AAAA,sBAAA;sBAM/S,SAAK,CAAA,WAAE,aAAa,MAAM;AAAA,sBAC1B,cAAU,CAAA,WAAE,iBAAA,QAAmB;AAAA,oBAAA;sBAEhCrB,eAQO,KAAA,QAAA,UAAA;AAAA,wBARc;AAAA,wBAAiB,UAAU,WAAA,UAAe,OAAO;AAAA,wBAAQ;AAAA,sBAAA,GAA9E,MAQO;AAAA,wBANG,WAAA,UAAe,OAAO,0BAD9BkB,IAAAA,YAIEF,UAAAC,MAAAA,IAAA,GAAA;AAAA;0BAFA,MAAK;AAAA,0BACL,OAAM;AAAA,wBAAA,OAERd,IAAAA,UAAA,GAAAJ,IAAAA,mBAAuC,QAAvC,UAAuC;AAAA,wBACvCa,IAAAA,mBAA8C,QAA9C,aAA8CE,IAAAA,gBAAtB,OAAO,KAAK,GAAA,CAAA;AAAA,sBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClSpD,UAAM,QAAQ;AAId,UAAM,aAAab,IAAAA,SAAW,SAAA,YAAC;AAE/B,UAAM,eAAeO,IAAAA,SAAS,MAAM,QAAQ,MAAM,IAAI,WAAW,MAAM,IAAI,EAAE;AAE7E,UAAM,WAAWA,IAAAA,SAAS,MAAM,MAAM,WAAW,IAAI;;8BAInDT,IAAAA,mBAyBM,OAAA;AAAA,QAzBA,wCAAqB,aAAA,OAAY;AAAA,QAAK,QAAQ,QAAA;AAAA,MAAA;QAClDC,IAAAA,WAuBO,4BAvBP,MAuBO;AAAA,UAtBLA,IAAAA,WAIO,0BAJP,MAIO;AAAA,YAHY,QAAA,0BAAjBkB,IAAAA,YAEYO,aAAA;AAAA;cAFa,YAAU,QAAA,MAAM,QAAA;AAAA,cAAO,OAAO,QAAA;AAAA,YAAA;mCACrD,MAAW;AAAA,wDAAR,QAAA,KAAK,GAAA,CAAA;AAAA,cAAA;;;;UAIZzB,IAAAA,WAWO,0BAXP,MAWO;AAAA,YATG,SAAA,SADRG,IAAAA,UAAA,GAAAe,IAAAA,YAIEQ,aAJFtB,IAAAA,WAIE;AAAA;0BAFS,WAAA;AAAA,2EAAA,WAAU,QAAA;AAAA,YAAA,GACNC,EAAAA,GAAAA,KAAAA,WAAWsB,KAAAA,QAAM,GAAA,MAAA,IAAA,CAAA,YAAA,CAAA,MAEhCxB,IAAAA,aAAAe,IAAAA,YAIEU,aAJFxB,eAIE;AAAA;0BAFS,WAAA;AAAA,2EAAA,WAAU,QAAA;AAAA,YAAA,GACNC,EAAAA,GAAAA,KAAAA,WAAWsB,KAAAA,OAAAA,CAAM,GAAA,MAAA,IAAA,CAAA,YAAA,CAAA;AAAA,UAAA;UAIlB,QAAA,gBAAgB,QAAA,UAAK,6BAArCT,IAAAA,YAEWW,aAAA;AAAA;YAF0C,OAAO;AAAA,UAAA;iCAC1D,MAAW;AAAA,sDAAR,QAAA,KAAK,GAAA,CAAA;AAAA,YAAA;;;;;;;;;;;;;;;;;;;;AC5BhB,UAAM,OAAO;AAIb,UAAM,cAAc,CAAC,UAAiB;AACpC,YAAM,SAAS,MAAM;AACrB,WAAK,qBAAqB,OAAO,KAAK;AAAA,IACxC;;AAIE,aAAA1B,cAAA,GAAAJ,uBAUM,OAVNO,cAUM;AAAA,QATJS,gBAA4FC,IAAAA,MAAAC,MAAAA,IAAA,GAAA;AAAA,UAArF,MAAM,QAAA;AAAA,UAAM,OAAM;AAAA,QAAA;QACzBL,IAAAA,mBAOE,SAAA;AAAA,UANC,UAAU,QAAA;AAAA,UACV,aAAa,QAAA;AAAA,UACb,OAAO,QAAA;AAAA,UACR,OAAM;AAAA,UACN,MAAK;AAAA,UACJ,SAAO;AAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/Bd,UAAM,QAAQ;AAmBd,UAAM,OAAO;AAIb,UAAM,SAAS,MAAM;AACnB,UAAI,MAAM,SAAU;AACpB,WAAK,qBAAqB,CAAC,MAAM,UAAU;AAAA,IAC7C;AAEA,UAAM,cAAc;AAAA,MAClB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAGN,UAAM,WAAW;AAAA,MACf,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAGN,UAAM,iBAAiB;AAAA,MACrB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;;8BAKJb,IAAAA,mBAgCQ,SAAA;AAAA,QA/BN,OAAKsB,IAAAA,eAAA,CAAC,iCACE,QAAA,WAAQ,kCAAA,gBAAA,CAAA;AAAA,MAAA;QAEhBT,IAAAA,mBAmBS,UAAA;AAAA,UAlBP,MAAK;AAAA,UACL,MAAK;AAAA,UACJ,gBAAc,QAAA;AAAA,UACd,UAAU,QAAA;AAAA,UACV,OAAKS,IAAAA,eAAA;AAAA;YAAwK,YAAY,QAAA,IAAI;AAAA,YAAW,QAAA,aAAU,eAAA;AAAA,UAAA;UAKlN,SAAO;AAAA,QAAA;UAERT,IAAAA,mBAME,QAAA;AAAA,YALC,OAAKS,IAAAA,eAAA;AAAA;cAAuG,SAAS,QAAA,IAAI;AAAA,cAAa,QAAA,aAAa,eAAe,QAAA,IAAI,IAAA;AAAA,YAAA;;;QAOhK,QAAA,SAAS,QAAA,eAApBlB,IAAAA,aAAAJ,IAAAA,mBAOM,OAPN+B,cAOM;AAAA,UANQ,QAAA,0BAAZ/B,IAAAA,mBAEO,QAFPc,cAEOC,IAAAA,gBADF,QAAA,KAAK,GAAA,CAAA;UAEE,QAAA,gCAAZf,IAAAA,mBAEO,QAFPuB,cAEOR,IAAAA,gBADF,QAAA,WAAW,GAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5DtB,UAAM,OAAO;AAIb,UAAM,SAAS,CAAC,UAAiB;AAC/B,YAAM,SAAS,MAAM;AACrB,WAAK,qBAAqB,OAAO,OAAO;AAAA,IAC1C;;8BAIEf,IAAAA,mBAoBQ,SAAA;AAAA,QAnBN,OAAKsB,IAAAA,eAAA,CAAC,iCACE,QAAA,WAAQ,kCAAA,gBAAA,CAAA;AAAA,MAAA;QAEhBT,IAAAA,mBAOE,SAAA;AAAA,UANA,MAAK;AAAA,UACJ,SAAS,QAAA;AAAA,UACT,UAAU,QAAA;AAAA,UACV,eAAe,QAAA;AAAA,UAChB,OAAM;AAAA,UACL,UAAQ;AAAA,QAAA;QAEA,QAAA,SAAS,QAAA,eAApBT,IAAAA,aAAAJ,IAAAA,mBAOM,OAPN,YAOM;AAAA,UANQ,QAAA,0BAAZA,IAAAA,mBAEO,QAFP,YAEOe,IAAAA,gBADF,QAAA,KAAK,GAAA,CAAA;UAEE,QAAA,gCAAZf,IAAAA,mBAEO,QAFP,YAEOe,IAAAA,gBADF,QAAA,WAAW,GAAA,CAAA;;;;;;;;;;;;;;"}
|
|
@@ -106,13 +106,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
106
106
|
const dropdownRef = ref();
|
|
107
107
|
const triggerRef = ref();
|
|
108
108
|
const menuRef = ref();
|
|
109
|
-
const dropdownPosition = ref({ top: 0, left: 0, width: 0 });
|
|
109
|
+
const dropdownPosition = ref({ top: 0, left: 0, right: 0, width: 0 });
|
|
110
110
|
const updatePosition = () => {
|
|
111
111
|
if (!triggerRef.value || !props.teleport) return;
|
|
112
112
|
const rect = triggerRef.value.getBoundingClientRect();
|
|
113
113
|
dropdownPosition.value = {
|
|
114
114
|
top: rect.bottom + window.scrollY + 8,
|
|
115
|
-
left:
|
|
115
|
+
left: rect.left + window.scrollX,
|
|
116
|
+
right: window.innerWidth - rect.right - window.scrollX,
|
|
116
117
|
width: rect.width
|
|
117
118
|
};
|
|
118
119
|
};
|
|
@@ -168,7 +169,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
168
169
|
position: "absolute",
|
|
169
170
|
top: `${dropdownPosition.value.top}px`,
|
|
170
171
|
left: props.align === "right" ? "auto" : `${dropdownPosition.value.left}px`,
|
|
171
|
-
right: props.align === "right" ? `${
|
|
172
|
+
right: props.align === "right" ? `${dropdownPosition.value.right}px` : "auto"
|
|
172
173
|
};
|
|
173
174
|
});
|
|
174
175
|
return (_ctx, _cache) => {
|
|
@@ -256,4 +257,4 @@ export {
|
|
|
256
257
|
_sfc_main$1 as _,
|
|
257
258
|
_sfc_main as a
|
|
258
259
|
};
|
|
259
|
-
//# sourceMappingURL=Dropdown.vue_vue_type_script_setup_true_lang-
|
|
260
|
+
//# sourceMappingURL=Dropdown.vue_vue_type_script_setup_true_lang-D65uMijW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dropdown.vue_vue_type_script_setup_true_lang-D65uMijW.js","sources":["../src/components/core/MenuItem.vue","../src/components/core/Dropdown.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport type { MenuItemProps } from '@/types'\n\nconst props = withDefaults(\n defineProps<{\n menuItem: MenuItemProps\n /** Whether sidebar is expanded (shows labels) */\n expanded?: boolean\n /** Override active state directly */\n active?: boolean\n /** Current route path (pass from parent using useRoute().path) */\n currentPath?: string\n }>(),\n {\n expanded: true,\n active: undefined,\n currentPath: undefined,\n },\n)\n\nconst isRouteActive = computed(() => {\n // If active prop is explicitly set, use it\n if (props.active !== undefined) {\n return props.active\n }\n\n // Use currentPath prop if provided, otherwise fall back to window.location\n const path = props.currentPath ?? (typeof window !== 'undefined' ? window.location.pathname : '/')\n\n if (props.menuItem.link === '/') {\n return path === '/'\n }\n return path === props.menuItem.link || path.startsWith(props.menuItem.link + '/')\n})\n\n// Try to resolve RouterLink, fallback to 'a' tag\nconst linkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst linkProps = computed(() => {\n if (linkComponent.value === 'a') {\n return { href: props.menuItem.link }\n }\n return { to: props.menuItem.link }\n})\n</script>\n\n<template>\n <component\n :is=\"linkComponent\"\n v-bind=\"linkProps\"\n :class=\"expanded ? 'flex-row' : 'flex-col'\"\n class=\"group relative flex items-center justify-center gap-2 px-5\"\n >\n <div class=\"relative\">\n <Icon\n :class=\"[\n isRouteActive\n ? 'text-white'\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500',\n expanded ? 'size-6' : 'size-8',\n ]\"\n class=\"transition-all duration-300\"\n :icon=\"menuItem.icon\"\n />\n\n <span\n v-if=\"menuItem.notification\"\n class=\"absolute top-0.25 right-0.25 size-1.5 rounded-full bg-red-600\"\n ></span>\n </div>\n\n <Transition\n enter-active-class=\"transition-all duration-300 ease-out\"\n enter-from-class=\"opacity-0 -translate-x-2\"\n enter-to-class=\"opacity-100 translate-x-0\"\n leave-active-class=\"transition-all duration-200 ease-in\"\n leave-from-class=\"opacity-100 translate-x-0\"\n leave-to-class=\"opacity-0 -translate-x-2\"\n >\n <span\n v-if=\"expanded\"\n :class=\"\n isRouteActive\n ? 'text-white'\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500'\n \"\n class=\"text-sm font-semibold whitespace-nowrap\"\n >{{ menuItem.label }}</span\n >\n </Transition>\n </component>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, computed, onUnmounted, nextTick, watch } from 'vue'\nimport { Icon } from '@iconify/vue'\n\nexport interface DropdownItem {\n key: string\n label: string\n icon?: string\n disabled?: boolean\n danger?: boolean\n divider?: boolean\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Dropdown items (optional if using default slot) */\n items?: DropdownItem[]\n /** Align dropdown */\n align?: 'left' | 'right'\n /** Dropdown width */\n width?: 'auto' | 'full' | 'sm' | 'md' | 'lg'\n /** Use teleport to body to avoid overflow clipping */\n teleport?: boolean\n }>(),\n {\n items: () => [],\n align: 'left',\n width: 'auto',\n teleport: true,\n },\n)\n\nconst emit = defineEmits<{\n select: [item: DropdownItem]\n}>()\n\nconst isOpen = ref(false)\nconst dropdownRef = ref<HTMLElement>()\nconst triggerRef = ref<HTMLElement>()\nconst menuRef = ref<HTMLElement>()\nconst dropdownPosition = ref({ top: 0, left: 0, right: 0, width: 0 })\n\nconst updatePosition = () => {\n if (!triggerRef.value || !props.teleport) return\n const rect = triggerRef.value.getBoundingClientRect()\n dropdownPosition.value = {\n top: rect.bottom + window.scrollY + 8,\n left: rect.left + window.scrollX,\n right: window.innerWidth - rect.right - window.scrollX,\n width: rect.width,\n }\n}\n\nconst toggle = () => {\n isOpen.value = !isOpen.value\n if (isOpen.value) {\n nextTick(updatePosition)\n }\n}\n\nconst close = () => {\n isOpen.value = false\n}\n\nconst selectItem = (item: DropdownItem) => {\n if (item.disabled || item.divider) return\n emit('select', item)\n close()\n}\n\nconst handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node\n const isInsideTrigger = triggerRef.value?.contains(target)\n const isInsideMenu = menuRef.value?.contains(target)\n if (!isInsideTrigger && !isInsideMenu) {\n close()\n }\n}\n\nwatch(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\nonUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n})\n\nconst widthClasses = {\n auto: 'w-auto min-w-[10rem]',\n full: 'w-full',\n sm: 'w-32',\n md: 'w-48',\n lg: 'w-64',\n}\n\nconst dropdownStyle = computed(() => {\n if (!props.teleport) return {}\n return {\n position: 'absolute' as const,\n top: `${dropdownPosition.value.top}px`,\n left: props.align === 'right' ? 'auto' : `${dropdownPosition.value.left}px`,\n right: props.align === 'right' ? `${dropdownPosition.value.right}px` : 'auto',\n }\n})\n</script>\n\n<template>\n <div ref=\"dropdownRef\" class=\"relative inline-block\">\n <div ref=\"triggerRef\" @click=\"toggle\">\n <slot name=\"trigger\">\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700\"\n >\n <slot name=\"trigger-label\">Options</slot>\n <Icon\n icon=\"lucide:chevron-down\"\n :class=\"['size-4 transition-transform', isOpen && 'rotate-180']\"\n />\n </button>\n </slot>\n </div>\n\n <Teleport to=\"body\" :disabled=\"!teleport\">\n <Transition\n enter-active-class=\"transition ease-out duration-100\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-in duration-75\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-if=\"isOpen\"\n ref=\"menuRef\"\n :style=\"dropdownStyle\"\n :class=\"[\n 'z-[9999] rounded-lg border border-gray-200 bg-white py-1 shadow-lg dark:border-gray-700 dark:bg-gray-800',\n widthClasses[width],\n !teleport && (align === 'right' ? 'absolute mt-2 right-0' : 'absolute mt-2 left-0'),\n ]\"\n >\n <!-- Custom content via default slot -->\n <slot :close=\"close\">\n <!-- Default items rendering -->\n <template v-for=\"item in items\" :key=\"item.key\">\n <div\n v-if=\"item.divider\"\n class=\"my-1 border-t border-gray-200 dark:border-gray-700\"\n />\n <button\n v-else\n type=\"button\"\n :disabled=\"item.disabled\"\n :class=\"[\n 'flex w-full items-center gap-2 px-4 py-2 text-left text-sm transition-colors',\n item.disabled\n ? 'cursor-not-allowed opacity-50'\n : item.danger\n ? 'text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-900/20'\n : 'text-gray-700 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-gray-700',\n ]\"\n @click=\"selectItem(item)\"\n >\n <Icon v-if=\"item.icon\" :icon=\"item.icon\" class=\"size-4\" />\n {{ item.label }}\n </button>\n </template>\n </slot>\n </div>\n </Transition>\n </Teleport>\n </div>\n</template>\n"],"names":["_openBlock","_createBlock","_resolveDynamicComponent","_mergeProps","_createElementVNode","_hoisted_1","_createVNode","_unref","_normalizeClass","_createElementBlock","_hoisted_2","_Transition","_toDisplayString","_renderSlot","_Teleport","_Fragment","_renderList"],"mappings":"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"}
|
|
@@ -107,13 +107,14 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
107
107
|
const dropdownRef = vue.ref();
|
|
108
108
|
const triggerRef = vue.ref();
|
|
109
109
|
const menuRef = vue.ref();
|
|
110
|
-
const dropdownPosition = vue.ref({ top: 0, left: 0, width: 0 });
|
|
110
|
+
const dropdownPosition = vue.ref({ top: 0, left: 0, right: 0, width: 0 });
|
|
111
111
|
const updatePosition = () => {
|
|
112
112
|
if (!triggerRef.value || !props.teleport) return;
|
|
113
113
|
const rect = triggerRef.value.getBoundingClientRect();
|
|
114
114
|
dropdownPosition.value = {
|
|
115
115
|
top: rect.bottom + window.scrollY + 8,
|
|
116
|
-
left:
|
|
116
|
+
left: rect.left + window.scrollX,
|
|
117
|
+
right: window.innerWidth - rect.right - window.scrollX,
|
|
117
118
|
width: rect.width
|
|
118
119
|
};
|
|
119
120
|
};
|
|
@@ -169,7 +170,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
169
170
|
position: "absolute",
|
|
170
171
|
top: `${dropdownPosition.value.top}px`,
|
|
171
172
|
left: props.align === "right" ? "auto" : `${dropdownPosition.value.left}px`,
|
|
172
|
-
right: props.align === "right" ? `${
|
|
173
|
+
right: props.align === "right" ? `${dropdownPosition.value.right}px` : "auto"
|
|
173
174
|
};
|
|
174
175
|
});
|
|
175
176
|
return (_ctx, _cache) => {
|
|
@@ -255,4 +256,4 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
255
256
|
});
|
|
256
257
|
exports._sfc_main = _sfc_main$1;
|
|
257
258
|
exports._sfc_main$1 = _sfc_main;
|
|
258
|
-
//# sourceMappingURL=Dropdown.vue_vue_type_script_setup_true_lang-
|
|
259
|
+
//# sourceMappingURL=Dropdown.vue_vue_type_script_setup_true_lang-H6wsySqi.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dropdown.vue_vue_type_script_setup_true_lang-H6wsySqi.cjs","sources":["../src/components/core/MenuItem.vue","../src/components/core/Dropdown.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport type { MenuItemProps } from '@/types'\n\nconst props = withDefaults(\n defineProps<{\n menuItem: MenuItemProps\n /** Whether sidebar is expanded (shows labels) */\n expanded?: boolean\n /** Override active state directly */\n active?: boolean\n /** Current route path (pass from parent using useRoute().path) */\n currentPath?: string\n }>(),\n {\n expanded: true,\n active: undefined,\n currentPath: undefined,\n },\n)\n\nconst isRouteActive = computed(() => {\n // If active prop is explicitly set, use it\n if (props.active !== undefined) {\n return props.active\n }\n\n // Use currentPath prop if provided, otherwise fall back to window.location\n const path = props.currentPath ?? (typeof window !== 'undefined' ? window.location.pathname : '/')\n\n if (props.menuItem.link === '/') {\n return path === '/'\n }\n return path === props.menuItem.link || path.startsWith(props.menuItem.link + '/')\n})\n\n// Try to resolve RouterLink, fallback to 'a' tag\nconst linkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst linkProps = computed(() => {\n if (linkComponent.value === 'a') {\n return { href: props.menuItem.link }\n }\n return { to: props.menuItem.link }\n})\n</script>\n\n<template>\n <component\n :is=\"linkComponent\"\n v-bind=\"linkProps\"\n :class=\"expanded ? 'flex-row' : 'flex-col'\"\n class=\"group relative flex items-center justify-center gap-2 px-5\"\n >\n <div class=\"relative\">\n <Icon\n :class=\"[\n isRouteActive\n ? 'text-white'\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500',\n expanded ? 'size-6' : 'size-8',\n ]\"\n class=\"transition-all duration-300\"\n :icon=\"menuItem.icon\"\n />\n\n <span\n v-if=\"menuItem.notification\"\n class=\"absolute top-0.25 right-0.25 size-1.5 rounded-full bg-red-600\"\n ></span>\n </div>\n\n <Transition\n enter-active-class=\"transition-all duration-300 ease-out\"\n enter-from-class=\"opacity-0 -translate-x-2\"\n enter-to-class=\"opacity-100 translate-x-0\"\n leave-active-class=\"transition-all duration-200 ease-in\"\n leave-from-class=\"opacity-100 translate-x-0\"\n leave-to-class=\"opacity-0 -translate-x-2\"\n >\n <span\n v-if=\"expanded\"\n :class=\"\n isRouteActive\n ? 'text-white'\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500'\n \"\n class=\"text-sm font-semibold whitespace-nowrap\"\n >{{ menuItem.label }}</span\n >\n </Transition>\n </component>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, computed, onUnmounted, nextTick, watch } from 'vue'\nimport { Icon } from '@iconify/vue'\n\nexport interface DropdownItem {\n key: string\n label: string\n icon?: string\n disabled?: boolean\n danger?: boolean\n divider?: boolean\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Dropdown items (optional if using default slot) */\n items?: DropdownItem[]\n /** Align dropdown */\n align?: 'left' | 'right'\n /** Dropdown width */\n width?: 'auto' | 'full' | 'sm' | 'md' | 'lg'\n /** Use teleport to body to avoid overflow clipping */\n teleport?: boolean\n }>(),\n {\n items: () => [],\n align: 'left',\n width: 'auto',\n teleport: true,\n },\n)\n\nconst emit = defineEmits<{\n select: [item: DropdownItem]\n}>()\n\nconst isOpen = ref(false)\nconst dropdownRef = ref<HTMLElement>()\nconst triggerRef = ref<HTMLElement>()\nconst menuRef = ref<HTMLElement>()\nconst dropdownPosition = ref({ top: 0, left: 0, right: 0, width: 0 })\n\nconst updatePosition = () => {\n if (!triggerRef.value || !props.teleport) return\n const rect = triggerRef.value.getBoundingClientRect()\n dropdownPosition.value = {\n top: rect.bottom + window.scrollY + 8,\n left: rect.left + window.scrollX,\n right: window.innerWidth - rect.right - window.scrollX,\n width: rect.width,\n }\n}\n\nconst toggle = () => {\n isOpen.value = !isOpen.value\n if (isOpen.value) {\n nextTick(updatePosition)\n }\n}\n\nconst close = () => {\n isOpen.value = false\n}\n\nconst selectItem = (item: DropdownItem) => {\n if (item.disabled || item.divider) return\n emit('select', item)\n close()\n}\n\nconst handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node\n const isInsideTrigger = triggerRef.value?.contains(target)\n const isInsideMenu = menuRef.value?.contains(target)\n if (!isInsideTrigger && !isInsideMenu) {\n close()\n }\n}\n\nwatch(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\nonUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n})\n\nconst widthClasses = {\n auto: 'w-auto min-w-[10rem]',\n full: 'w-full',\n sm: 'w-32',\n md: 'w-48',\n lg: 'w-64',\n}\n\nconst dropdownStyle = computed(() => {\n if (!props.teleport) return {}\n return {\n position: 'absolute' as const,\n top: `${dropdownPosition.value.top}px`,\n left: props.align === 'right' ? 'auto' : `${dropdownPosition.value.left}px`,\n right: props.align === 'right' ? `${dropdownPosition.value.right}px` : 'auto',\n }\n})\n</script>\n\n<template>\n <div ref=\"dropdownRef\" class=\"relative inline-block\">\n <div ref=\"triggerRef\" @click=\"toggle\">\n <slot name=\"trigger\">\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700\"\n >\n <slot name=\"trigger-label\">Options</slot>\n <Icon\n icon=\"lucide:chevron-down\"\n :class=\"['size-4 transition-transform', isOpen && 'rotate-180']\"\n />\n </button>\n </slot>\n </div>\n\n <Teleport to=\"body\" :disabled=\"!teleport\">\n <Transition\n enter-active-class=\"transition ease-out duration-100\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-in duration-75\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-if=\"isOpen\"\n ref=\"menuRef\"\n :style=\"dropdownStyle\"\n :class=\"[\n 'z-[9999] rounded-lg border border-gray-200 bg-white py-1 shadow-lg dark:border-gray-700 dark:bg-gray-800',\n widthClasses[width],\n !teleport && (align === 'right' ? 'absolute mt-2 right-0' : 'absolute mt-2 left-0'),\n ]\"\n >\n <!-- Custom content via default slot -->\n <slot :close=\"close\">\n <!-- Default items rendering -->\n <template v-for=\"item in items\" :key=\"item.key\">\n <div\n v-if=\"item.divider\"\n class=\"my-1 border-t border-gray-200 dark:border-gray-700\"\n />\n <button\n v-else\n type=\"button\"\n :disabled=\"item.disabled\"\n :class=\"[\n 'flex w-full items-center gap-2 px-4 py-2 text-left text-sm transition-colors',\n item.disabled\n ? 'cursor-not-allowed opacity-50'\n : item.danger\n ? 'text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-900/20'\n : 'text-gray-700 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-gray-700',\n ]\"\n @click=\"selectItem(item)\"\n >\n <Icon v-if=\"item.icon\" :icon=\"item.icon\" class=\"size-4\" />\n {{ item.label }}\n </button>\n </template>\n </slot>\n </div>\n </Transition>\n </Teleport>\n </div>\n</template>\n"],"names":["computed","resolveComponent","_openBlock","_createBlock","_resolveDynamicComponent","_mergeProps","_createElementVNode","_hoisted_1","_createVNode","_unref","Icon","_normalizeClass","_createElementBlock","_hoisted_2","_Transition","_toDisplayString","ref","nextTick","watch","onUnmounted","_renderSlot","_Teleport","_Fragment","_renderList"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const vue = require("vue");
|
|
3
3
|
const vue$1 = require("@iconify/vue");
|
|
4
|
-
const Dropdown_vue_vue_type_script_setup_true_lang = require("./Dropdown.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-H6wsySqi.cjs");
|
|
5
5
|
const _hoisted_1$1 = { class: "font-inter relative flex h-dvh bg-gray-100 dark:bg-slate-900" };
|
|
6
6
|
const _hoisted_2$1 = { class: "flex h-16 items-center px-3" };
|
|
7
7
|
const _hoisted_3$1 = { class: "flex flex-1 items-center justify-center gap-3" };
|
|
@@ -330,4 +330,4 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
330
330
|
});
|
|
331
331
|
exports._sfc_main = _sfc_main$1;
|
|
332
332
|
exports._sfc_main$1 = _sfc_main;
|
|
333
|
-
//# sourceMappingURL=PageLayout.vue_vue_type_script_setup_true_lang-
|
|
333
|
+
//# sourceMappingURL=PageLayout.vue_vue_type_script_setup_true_lang-DoawksKc.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageLayout.vue_vue_type_script_setup_true_lang-HxuODTiQ.cjs","sources":["../src/components/layout/BaseLayout.vue","../src/components/layout/PageLayout.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { ref, computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport MenuItem from '@/components/core/MenuItem.vue'\nimport Dropdown from '@/components/core/Dropdown.vue'\nimport type { MenuItemProps } from '@/types'\n\nexport interface UserMenuItem {\n label: string\n icon?: string\n link?: string\n action?: () => void\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Menu items for the sidebar */\n menuItems?: MenuItemProps[]\n /** App/brand name displayed in sidebar */\n appName?: string\n /** App icon (iconify icon name) */\n appIcon?: string\n /** Whether sidebar is open (v-model:sidebarOpen) */\n sidebarOpen?: boolean\n /** Whether dark mode is enabled (v-model:dark) */\n dark?: boolean\n /** Show dark mode toggle in header */\n showDarkToggle?: boolean\n /** Primary color class for sidebar background */\n sidebarClass?: string\n /** Current route path for menu active state (pass useRoute().path) */\n currentPath?: string\n /** User display name */\n userName?: string\n /** User avatar (initials or image URL) */\n userAvatar?: string\n /** User menu items (dropdown) */\n userMenuItems?: UserMenuItem[]\n }>(),\n {\n menuItems: () => [],\n appName: 'App',\n appIcon: 'lucide:box',\n sidebarOpen: true,\n dark: false,\n showDarkToggle: true,\n sidebarClass: 'bg-[#172b4c] dark:bg-slate-950',\n currentPath: undefined,\n userName: undefined,\n userAvatar: undefined,\n userMenuItems: () => [],\n },\n)\n\nconst emit = defineEmits<{\n 'update:sidebarOpen': [value: boolean]\n 'update:dark': [value: boolean]\n}>()\n\nconst internalSidebarOpen = ref(props.sidebarOpen)\nconst internalDark = ref(props.dark)\n\nconst sidebarOpenModel = computed({\n get: () => props.sidebarOpen ?? internalSidebarOpen.value,\n set: (value: boolean) => {\n internalSidebarOpen.value = value\n emit('update:sidebarOpen', value)\n },\n})\n\nconst darkModel = computed({\n get: () => props.dark ?? internalDark.value,\n set: (value: boolean) => {\n internalDark.value = value\n emit('update:dark', value)\n },\n})\n\nconst toggleSidebar = () => {\n sidebarOpenModel.value = !sidebarOpenModel.value\n}\n\nconst toggleDark = () => {\n darkModel.value = !darkModel.value\n}\n\n// Try to resolve RouterView\nconst routerViewComponent = computed(() => {\n try {\n const RouterView = resolveComponent('RouterView')\n if (typeof RouterView !== 'string') {\n return RouterView\n }\n } catch {\n // RouterView not available\n }\n return null\n})\n\n// Try to resolve RouterLink\nconst routerLinkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst getLinkProps = (link: string) => {\n if (routerLinkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n\nconst handleUserMenuClick = (item: UserMenuItem) => {\n if (item.action) {\n item.action()\n }\n}\n</script>\n\n<template>\n <div class=\"font-inter relative flex h-dvh bg-gray-100 dark:bg-slate-900\">\n <!-- Backdrop for mobile -->\n <div\n v-if=\"sidebarOpenModel\"\n class=\"absolute z-40 h-full w-full bg-slate-950/20 lg:hidden dark:bg-white/20\"\n @click=\"sidebarOpenModel = false\"\n ></div>\n\n <!-- Sidebar -->\n <aside\n :class=\"[\n sidebarOpenModel ? 'lg:w-60' : '-translate-x-76 lg:w-16 lg:translate-x-0',\n sidebarClass,\n ]\"\n class=\"@container absolute z-50 flex h-full w-76 flex-col justify-between gap-10 transition-all duration-1000 ease-in-out lg:relative\"\n >\n <!-- Sidebar Header -->\n <div class=\"flex h-16 items-center px-3\">\n <div class=\"flex flex-1 items-center justify-center gap-3\">\n <slot name=\"logo\">\n <div\n class=\"bg-primary text-primary-foreground flex size-8 items-center justify-center rounded-lg bg-white/20\"\n >\n <Icon class=\"size-5 text-white\" :icon=\"appIcon\" />\n </div>\n <span\n :class=\"sidebarOpenModel ? 'block' : 'hidden'\"\n class=\"font-outfit flex-1 text-lg font-semibold text-white\"\n >\n {{ appName }}\n </span>\n </slot>\n </div>\n\n <button\n class=\"rounded-lg bg-white/10 p-1 transition hover:bg-white/20 lg:hidden\"\n @click=\"toggleSidebar\"\n >\n <Icon class=\"size-6 text-white\" icon=\"lucide:menu\" />\n </button>\n </div>\n\n <!-- Menu Items -->\n <div\n :class=\"sidebarOpenModel ? 'items-start' : 'items-center'\"\n class=\"flex flex-1 flex-col gap-8 px-2 lg:justify-center\"\n >\n <slot name=\"menu\" :current-path=\"currentPath\">\n <MenuItem\n v-for=\"(item, index) in menuItems\"\n :key=\"index\"\n :menu-item=\"item\"\n :expanded=\"sidebarOpenModel\"\n :current-path=\"currentPath\"\n />\n </slot>\n </div>\n\n <!-- Sidebar Footer -->\n <div class=\"flex flex-col gap-3 px-3 pb-3\">\n <slot name=\"sidebar-footer\" />\n </div>\n </aside>\n\n <!-- Main Content Area -->\n <div class=\"flex flex-1 flex-col\">\n <!-- Header -->\n <header\n class=\"flex h-16 items-center justify-between border-b border-slate-200 bg-white px-4 dark:border-slate-800 dark:bg-slate-950\"\n >\n <div>\n <button\n class=\"rounded-lg bg-gray-100 p-1 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleSidebar\"\n >\n <Icon\n class=\"size-6 text-gray-900 hover:text-gray-800 dark:text-gray-100\"\n icon=\"lucide:menu\"\n />\n </button>\n </div>\n\n <div class=\"flex-1\">\n <slot name=\"header-center\" />\n </div>\n\n <div class=\"flex items-center gap-3\">\n <slot name=\"header-actions\" />\n\n <button\n v-if=\"showDarkToggle\"\n class=\"flex items-center justify-center rounded-lg bg-gray-100 p-2 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleDark\"\n >\n <Icon\n :icon=\"darkModel ? 'lucide:sun' : 'lucide:moon'\"\n class=\"size-5 text-gray-900 dark:text-gray-100\"\n />\n </button>\n\n <!-- User Menu -->\n <Dropdown v-if=\"userName || userAvatar\" align=\"right\">\n <template #trigger>\n <button\n class=\"flex items-center gap-2 rounded-lg p-1.5 transition hover:bg-gray-100 dark:hover:bg-gray-800\"\n >\n <div\n class=\"flex size-8 items-center justify-center rounded-full bg-primary text-sm font-medium text-white\"\n >\n {{ userAvatar || '?' }}\n </div>\n <span class=\"hidden text-sm font-medium text-gray-700 dark:text-gray-300 md:block\">\n {{ userName }}\n </span>\n <Icon icon=\"lucide:chevron-down\" class=\"size-4 text-gray-500\" />\n </button>\n </template>\n\n <template #default=\"{ close }\">\n <div class=\"min-w-48 py-1\">\n <component\n :is=\"item.link ? routerLinkComponent : 'button'\"\n v-for=\"item in userMenuItems\"\n :key=\"item.label\"\n v-bind=\"item.link ? getLinkProps(item.link) : {}\"\n class=\"flex w-full items-center gap-2 px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800\"\n @click=\"handleUserMenuClick(item); close()\"\n >\n <Icon v-if=\"item.icon\" :icon=\"item.icon\" class=\"size-4\" />\n {{ item.label }}\n </component>\n </div>\n </template>\n </Dropdown>\n </div>\n </header>\n\n <!-- Page Content -->\n <div class=\"flex flex-1 flex-col overflow-y-auto\">\n <main class=\"container mx-auto flex flex-1 flex-col gap-5 p-5\">\n <slot>\n <component :is=\"routerViewComponent\" v-if=\"routerViewComponent\" />\n </slot>\n </main>\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\n\nexport interface Breadcrumb {\n label: string\n link: string\n}\n\ndefineProps<{\n /** Page title */\n title?: string\n /** Page description */\n description?: string\n /** Breadcrumb navigation items */\n breadcrumbs?: Breadcrumb[]\n}>()\n\n// Try to resolve RouterLink\nconst linkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst getLinkProps = (link: string) => {\n if (linkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n</script>\n\n<template>\n <div class=\"flex flex-col gap-4\">\n <!-- Breadcrumbs -->\n <nav v-if=\"breadcrumbs && breadcrumbs.length > 0\" aria-label=\"Breadcrumb\">\n <ol class=\"flex items-center\">\n <li\n v-for=\"(breadcrumb, index) in breadcrumbs\"\n :key=\"index\"\n class=\"flex items-center\"\n >\n <span\n v-if=\"index > 0\"\n class=\"mx-3 text-sm font-semibold text-gray-400 dark:text-gray-600\"\n >\n /\n </span>\n\n <slot name=\"breadcrumb\" :breadcrumb=\"breadcrumb\" :index=\"index\" :isLast=\"index === breadcrumbs.length - 1\">\n <component\n :is=\"linkComponent\"\n v-bind=\"getLinkProps(breadcrumb.link)\"\n :class=\"[\n 'text-sm transition-colors',\n index < breadcrumbs.length - 1\n ? 'font-semibold text-gray-900 hover:text-primary/90 hover:underline dark:text-gray-100'\n : 'text-gray-400 dark:text-gray-600',\n ]\"\n >\n {{ breadcrumb.label }}\n </component>\n </slot>\n </li>\n </ol>\n </nav>\n\n <!-- Page Header -->\n <div class=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div class=\"flex flex-col gap-1\">\n <h1\n v-if=\"title\"\n class=\"text-2xl font-bold text-gray-900 dark:text-gray-100\"\n >\n <slot name=\"title\">{{ title }}</slot>\n </h1>\n\n <p\n v-if=\"description\"\n class=\"text-sm text-gray-600 dark:text-gray-400\"\n >\n <slot name=\"description\">{{ description }}</slot>\n </p>\n </div>\n\n <div class=\"flex items-center gap-2\">\n <slot name=\"actions\" />\n </div>\n </div>\n\n <!-- Page Content -->\n <div class=\"flex-1\">\n <slot />\n </div>\n </div>\n</template>\n"],"names":["ref","computed","resolveComponent","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_normalizeClass","_hoisted_2","_hoisted_3","_renderSlot","_hoisted_4","_createVNode","_unref","Icon","_Fragment","_renderList","_createBlock","MenuItem","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","Dropdown","_hoisted_10","_toDisplayString","_withCtx","_resolveDynamicComponent","_mergeProps","_createTextVNode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PageLayout.vue_vue_type_script_setup_true_lang-DoawksKc.cjs","sources":["../src/components/layout/BaseLayout.vue","../src/components/layout/PageLayout.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { ref, computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport MenuItem from '@/components/core/MenuItem.vue'\nimport Dropdown from '@/components/core/Dropdown.vue'\nimport type { MenuItemProps } from '@/types'\n\nexport interface UserMenuItem {\n label: string\n icon?: string\n link?: string\n action?: () => void\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Menu items for the sidebar */\n menuItems?: MenuItemProps[]\n /** App/brand name displayed in sidebar */\n appName?: string\n /** App icon (iconify icon name) */\n appIcon?: string\n /** Whether sidebar is open (v-model:sidebarOpen) */\n sidebarOpen?: boolean\n /** Whether dark mode is enabled (v-model:dark) */\n dark?: boolean\n /** Show dark mode toggle in header */\n showDarkToggle?: boolean\n /** Primary color class for sidebar background */\n sidebarClass?: string\n /** Current route path for menu active state (pass useRoute().path) */\n currentPath?: string\n /** User display name */\n userName?: string\n /** User avatar (initials or image URL) */\n userAvatar?: string\n /** User menu items (dropdown) */\n userMenuItems?: UserMenuItem[]\n }>(),\n {\n menuItems: () => [],\n appName: 'App',\n appIcon: 'lucide:box',\n sidebarOpen: true,\n dark: false,\n showDarkToggle: true,\n sidebarClass: 'bg-[#172b4c] dark:bg-slate-950',\n currentPath: undefined,\n userName: undefined,\n userAvatar: undefined,\n userMenuItems: () => [],\n },\n)\n\nconst emit = defineEmits<{\n 'update:sidebarOpen': [value: boolean]\n 'update:dark': [value: boolean]\n}>()\n\nconst internalSidebarOpen = ref(props.sidebarOpen)\nconst internalDark = ref(props.dark)\n\nconst sidebarOpenModel = computed({\n get: () => props.sidebarOpen ?? internalSidebarOpen.value,\n set: (value: boolean) => {\n internalSidebarOpen.value = value\n emit('update:sidebarOpen', value)\n },\n})\n\nconst darkModel = computed({\n get: () => props.dark ?? internalDark.value,\n set: (value: boolean) => {\n internalDark.value = value\n emit('update:dark', value)\n },\n})\n\nconst toggleSidebar = () => {\n sidebarOpenModel.value = !sidebarOpenModel.value\n}\n\nconst toggleDark = () => {\n darkModel.value = !darkModel.value\n}\n\n// Try to resolve RouterView\nconst routerViewComponent = computed(() => {\n try {\n const RouterView = resolveComponent('RouterView')\n if (typeof RouterView !== 'string') {\n return RouterView\n }\n } catch {\n // RouterView not available\n }\n return null\n})\n\n// Try to resolve RouterLink\nconst routerLinkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst getLinkProps = (link: string) => {\n if (routerLinkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n\nconst handleUserMenuClick = (item: UserMenuItem) => {\n if (item.action) {\n item.action()\n }\n}\n</script>\n\n<template>\n <div class=\"font-inter relative flex h-dvh bg-gray-100 dark:bg-slate-900\">\n <!-- Backdrop for mobile -->\n <div\n v-if=\"sidebarOpenModel\"\n class=\"absolute z-40 h-full w-full bg-slate-950/20 lg:hidden dark:bg-white/20\"\n @click=\"sidebarOpenModel = false\"\n ></div>\n\n <!-- Sidebar -->\n <aside\n :class=\"[\n sidebarOpenModel ? 'lg:w-60' : '-translate-x-76 lg:w-16 lg:translate-x-0',\n sidebarClass,\n ]\"\n class=\"@container absolute z-50 flex h-full w-76 flex-col justify-between gap-10 transition-all duration-1000 ease-in-out lg:relative\"\n >\n <!-- Sidebar Header -->\n <div class=\"flex h-16 items-center px-3\">\n <div class=\"flex flex-1 items-center justify-center gap-3\">\n <slot name=\"logo\">\n <div\n class=\"bg-primary text-primary-foreground flex size-8 items-center justify-center rounded-lg bg-white/20\"\n >\n <Icon class=\"size-5 text-white\" :icon=\"appIcon\" />\n </div>\n <span\n :class=\"sidebarOpenModel ? 'block' : 'hidden'\"\n class=\"font-outfit flex-1 text-lg font-semibold text-white\"\n >\n {{ appName }}\n </span>\n </slot>\n </div>\n\n <button\n class=\"rounded-lg bg-white/10 p-1 transition hover:bg-white/20 lg:hidden\"\n @click=\"toggleSidebar\"\n >\n <Icon class=\"size-6 text-white\" icon=\"lucide:menu\" />\n </button>\n </div>\n\n <!-- Menu Items -->\n <div\n :class=\"sidebarOpenModel ? 'items-start' : 'items-center'\"\n class=\"flex flex-1 flex-col gap-8 px-2 lg:justify-center\"\n >\n <slot name=\"menu\" :current-path=\"currentPath\">\n <MenuItem\n v-for=\"(item, index) in menuItems\"\n :key=\"index\"\n :menu-item=\"item\"\n :expanded=\"sidebarOpenModel\"\n :current-path=\"currentPath\"\n />\n </slot>\n </div>\n\n <!-- Sidebar Footer -->\n <div class=\"flex flex-col gap-3 px-3 pb-3\">\n <slot name=\"sidebar-footer\" />\n </div>\n </aside>\n\n <!-- Main Content Area -->\n <div class=\"flex flex-1 flex-col\">\n <!-- Header -->\n <header\n class=\"flex h-16 items-center justify-between border-b border-slate-200 bg-white px-4 dark:border-slate-800 dark:bg-slate-950\"\n >\n <div>\n <button\n class=\"rounded-lg bg-gray-100 p-1 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleSidebar\"\n >\n <Icon\n class=\"size-6 text-gray-900 hover:text-gray-800 dark:text-gray-100\"\n icon=\"lucide:menu\"\n />\n </button>\n </div>\n\n <div class=\"flex-1\">\n <slot name=\"header-center\" />\n </div>\n\n <div class=\"flex items-center gap-3\">\n <slot name=\"header-actions\" />\n\n <button\n v-if=\"showDarkToggle\"\n class=\"flex items-center justify-center rounded-lg bg-gray-100 p-2 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleDark\"\n >\n <Icon\n :icon=\"darkModel ? 'lucide:sun' : 'lucide:moon'\"\n class=\"size-5 text-gray-900 dark:text-gray-100\"\n />\n </button>\n\n <!-- User Menu -->\n <Dropdown v-if=\"userName || userAvatar\" align=\"right\">\n <template #trigger>\n <button\n class=\"flex items-center gap-2 rounded-lg p-1.5 transition hover:bg-gray-100 dark:hover:bg-gray-800\"\n >\n <div\n class=\"flex size-8 items-center justify-center rounded-full bg-primary text-sm font-medium text-white\"\n >\n {{ userAvatar || '?' }}\n </div>\n <span class=\"hidden text-sm font-medium text-gray-700 dark:text-gray-300 md:block\">\n {{ userName }}\n </span>\n <Icon icon=\"lucide:chevron-down\" class=\"size-4 text-gray-500\" />\n </button>\n </template>\n\n <template #default=\"{ close }\">\n <div class=\"min-w-48 py-1\">\n <component\n :is=\"item.link ? routerLinkComponent : 'button'\"\n v-for=\"item in userMenuItems\"\n :key=\"item.label\"\n v-bind=\"item.link ? getLinkProps(item.link) : {}\"\n class=\"flex w-full items-center gap-2 px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800\"\n @click=\"handleUserMenuClick(item); close()\"\n >\n <Icon v-if=\"item.icon\" :icon=\"item.icon\" class=\"size-4\" />\n {{ item.label }}\n </component>\n </div>\n </template>\n </Dropdown>\n </div>\n </header>\n\n <!-- Page Content -->\n <div class=\"flex flex-1 flex-col overflow-y-auto\">\n <main class=\"container mx-auto flex flex-1 flex-col gap-5 p-5\">\n <slot>\n <component :is=\"routerViewComponent\" v-if=\"routerViewComponent\" />\n </slot>\n </main>\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\n\nexport interface Breadcrumb {\n label: string\n link: string\n}\n\ndefineProps<{\n /** Page title */\n title?: string\n /** Page description */\n description?: string\n /** Breadcrumb navigation items */\n breadcrumbs?: Breadcrumb[]\n}>()\n\n// Try to resolve RouterLink\nconst linkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst getLinkProps = (link: string) => {\n if (linkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n</script>\n\n<template>\n <div class=\"flex flex-col gap-4\">\n <!-- Breadcrumbs -->\n <nav v-if=\"breadcrumbs && breadcrumbs.length > 0\" aria-label=\"Breadcrumb\">\n <ol class=\"flex items-center\">\n <li\n v-for=\"(breadcrumb, index) in breadcrumbs\"\n :key=\"index\"\n class=\"flex items-center\"\n >\n <span\n v-if=\"index > 0\"\n class=\"mx-3 text-sm font-semibold text-gray-400 dark:text-gray-600\"\n >\n /\n </span>\n\n <slot name=\"breadcrumb\" :breadcrumb=\"breadcrumb\" :index=\"index\" :isLast=\"index === breadcrumbs.length - 1\">\n <component\n :is=\"linkComponent\"\n v-bind=\"getLinkProps(breadcrumb.link)\"\n :class=\"[\n 'text-sm transition-colors',\n index < breadcrumbs.length - 1\n ? 'font-semibold text-gray-900 hover:text-primary/90 hover:underline dark:text-gray-100'\n : 'text-gray-400 dark:text-gray-600',\n ]\"\n >\n {{ breadcrumb.label }}\n </component>\n </slot>\n </li>\n </ol>\n </nav>\n\n <!-- Page Header -->\n <div class=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div class=\"flex flex-col gap-1\">\n <h1\n v-if=\"title\"\n class=\"text-2xl font-bold text-gray-900 dark:text-gray-100\"\n >\n <slot name=\"title\">{{ title }}</slot>\n </h1>\n\n <p\n v-if=\"description\"\n class=\"text-sm text-gray-600 dark:text-gray-400\"\n >\n <slot name=\"description\">{{ description }}</slot>\n </p>\n </div>\n\n <div class=\"flex items-center gap-2\">\n <slot name=\"actions\" />\n </div>\n </div>\n\n <!-- Page Content -->\n <div class=\"flex-1\">\n <slot />\n </div>\n </div>\n</template>\n"],"names":["ref","computed","resolveComponent","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_normalizeClass","_hoisted_2","_hoisted_3","_renderSlot","_hoisted_4","_createVNode","_unref","Icon","_Fragment","_renderList","_createBlock","MenuItem","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","Dropdown","_hoisted_10","_toDisplayString","_withCtx","_resolveDynamicComponent","_mergeProps","_createTextVNode"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineComponent, ref, computed, resolveComponent, createElementBlock, openBlock, createCommentVNode, createElementVNode, normalizeClass, renderSlot, createVNode, unref, toDisplayString, Fragment, renderList, createBlock, withCtx, resolveDynamicComponent, mergeProps, createTextVNode } from "vue";
|
|
2
2
|
import { Icon } from "@iconify/vue";
|
|
3
|
-
import { _ as _sfc_main$2, a as _sfc_main$3 } from "./Dropdown.vue_vue_type_script_setup_true_lang-
|
|
3
|
+
import { _ as _sfc_main$2, a as _sfc_main$3 } from "./Dropdown.vue_vue_type_script_setup_true_lang-D65uMijW.js";
|
|
4
4
|
const _hoisted_1$1 = { class: "font-inter relative flex h-dvh bg-gray-100 dark:bg-slate-900" };
|
|
5
5
|
const _hoisted_2$1 = { class: "flex h-16 items-center px-3" };
|
|
6
6
|
const _hoisted_3$1 = { class: "flex flex-1 items-center justify-center gap-3" };
|
|
@@ -331,4 +331,4 @@ export {
|
|
|
331
331
|
_sfc_main$1 as _,
|
|
332
332
|
_sfc_main as a
|
|
333
333
|
};
|
|
334
|
-
//# sourceMappingURL=PageLayout.vue_vue_type_script_setup_true_lang-
|
|
334
|
+
//# sourceMappingURL=PageLayout.vue_vue_type_script_setup_true_lang-J1I-WjM-.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageLayout.vue_vue_type_script_setup_true_lang-BoFiqN42.js","sources":["../src/components/layout/BaseLayout.vue","../src/components/layout/PageLayout.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { ref, computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport MenuItem from '@/components/core/MenuItem.vue'\nimport Dropdown from '@/components/core/Dropdown.vue'\nimport type { MenuItemProps } from '@/types'\n\nexport interface UserMenuItem {\n label: string\n icon?: string\n link?: string\n action?: () => void\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Menu items for the sidebar */\n menuItems?: MenuItemProps[]\n /** App/brand name displayed in sidebar */\n appName?: string\n /** App icon (iconify icon name) */\n appIcon?: string\n /** Whether sidebar is open (v-model:sidebarOpen) */\n sidebarOpen?: boolean\n /** Whether dark mode is enabled (v-model:dark) */\n dark?: boolean\n /** Show dark mode toggle in header */\n showDarkToggle?: boolean\n /** Primary color class for sidebar background */\n sidebarClass?: string\n /** Current route path for menu active state (pass useRoute().path) */\n currentPath?: string\n /** User display name */\n userName?: string\n /** User avatar (initials or image URL) */\n userAvatar?: string\n /** User menu items (dropdown) */\n userMenuItems?: UserMenuItem[]\n }>(),\n {\n menuItems: () => [],\n appName: 'App',\n appIcon: 'lucide:box',\n sidebarOpen: true,\n dark: false,\n showDarkToggle: true,\n sidebarClass: 'bg-[#172b4c] dark:bg-slate-950',\n currentPath: undefined,\n userName: undefined,\n userAvatar: undefined,\n userMenuItems: () => [],\n },\n)\n\nconst emit = defineEmits<{\n 'update:sidebarOpen': [value: boolean]\n 'update:dark': [value: boolean]\n}>()\n\nconst internalSidebarOpen = ref(props.sidebarOpen)\nconst internalDark = ref(props.dark)\n\nconst sidebarOpenModel = computed({\n get: () => props.sidebarOpen ?? internalSidebarOpen.value,\n set: (value: boolean) => {\n internalSidebarOpen.value = value\n emit('update:sidebarOpen', value)\n },\n})\n\nconst darkModel = computed({\n get: () => props.dark ?? internalDark.value,\n set: (value: boolean) => {\n internalDark.value = value\n emit('update:dark', value)\n },\n})\n\nconst toggleSidebar = () => {\n sidebarOpenModel.value = !sidebarOpenModel.value\n}\n\nconst toggleDark = () => {\n darkModel.value = !darkModel.value\n}\n\n// Try to resolve RouterView\nconst routerViewComponent = computed(() => {\n try {\n const RouterView = resolveComponent('RouterView')\n if (typeof RouterView !== 'string') {\n return RouterView\n }\n } catch {\n // RouterView not available\n }\n return null\n})\n\n// Try to resolve RouterLink\nconst routerLinkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst getLinkProps = (link: string) => {\n if (routerLinkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n\nconst handleUserMenuClick = (item: UserMenuItem) => {\n if (item.action) {\n item.action()\n }\n}\n</script>\n\n<template>\n <div class=\"font-inter relative flex h-dvh bg-gray-100 dark:bg-slate-900\">\n <!-- Backdrop for mobile -->\n <div\n v-if=\"sidebarOpenModel\"\n class=\"absolute z-40 h-full w-full bg-slate-950/20 lg:hidden dark:bg-white/20\"\n @click=\"sidebarOpenModel = false\"\n ></div>\n\n <!-- Sidebar -->\n <aside\n :class=\"[\n sidebarOpenModel ? 'lg:w-60' : '-translate-x-76 lg:w-16 lg:translate-x-0',\n sidebarClass,\n ]\"\n class=\"@container absolute z-50 flex h-full w-76 flex-col justify-between gap-10 transition-all duration-1000 ease-in-out lg:relative\"\n >\n <!-- Sidebar Header -->\n <div class=\"flex h-16 items-center px-3\">\n <div class=\"flex flex-1 items-center justify-center gap-3\">\n <slot name=\"logo\">\n <div\n class=\"bg-primary text-primary-foreground flex size-8 items-center justify-center rounded-lg bg-white/20\"\n >\n <Icon class=\"size-5 text-white\" :icon=\"appIcon\" />\n </div>\n <span\n :class=\"sidebarOpenModel ? 'block' : 'hidden'\"\n class=\"font-outfit flex-1 text-lg font-semibold text-white\"\n >\n {{ appName }}\n </span>\n </slot>\n </div>\n\n <button\n class=\"rounded-lg bg-white/10 p-1 transition hover:bg-white/20 lg:hidden\"\n @click=\"toggleSidebar\"\n >\n <Icon class=\"size-6 text-white\" icon=\"lucide:menu\" />\n </button>\n </div>\n\n <!-- Menu Items -->\n <div\n :class=\"sidebarOpenModel ? 'items-start' : 'items-center'\"\n class=\"flex flex-1 flex-col gap-8 px-2 lg:justify-center\"\n >\n <slot name=\"menu\" :current-path=\"currentPath\">\n <MenuItem\n v-for=\"(item, index) in menuItems\"\n :key=\"index\"\n :menu-item=\"item\"\n :expanded=\"sidebarOpenModel\"\n :current-path=\"currentPath\"\n />\n </slot>\n </div>\n\n <!-- Sidebar Footer -->\n <div class=\"flex flex-col gap-3 px-3 pb-3\">\n <slot name=\"sidebar-footer\" />\n </div>\n </aside>\n\n <!-- Main Content Area -->\n <div class=\"flex flex-1 flex-col\">\n <!-- Header -->\n <header\n class=\"flex h-16 items-center justify-between border-b border-slate-200 bg-white px-4 dark:border-slate-800 dark:bg-slate-950\"\n >\n <div>\n <button\n class=\"rounded-lg bg-gray-100 p-1 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleSidebar\"\n >\n <Icon\n class=\"size-6 text-gray-900 hover:text-gray-800 dark:text-gray-100\"\n icon=\"lucide:menu\"\n />\n </button>\n </div>\n\n <div class=\"flex-1\">\n <slot name=\"header-center\" />\n </div>\n\n <div class=\"flex items-center gap-3\">\n <slot name=\"header-actions\" />\n\n <button\n v-if=\"showDarkToggle\"\n class=\"flex items-center justify-center rounded-lg bg-gray-100 p-2 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleDark\"\n >\n <Icon\n :icon=\"darkModel ? 'lucide:sun' : 'lucide:moon'\"\n class=\"size-5 text-gray-900 dark:text-gray-100\"\n />\n </button>\n\n <!-- User Menu -->\n <Dropdown v-if=\"userName || userAvatar\" align=\"right\">\n <template #trigger>\n <button\n class=\"flex items-center gap-2 rounded-lg p-1.5 transition hover:bg-gray-100 dark:hover:bg-gray-800\"\n >\n <div\n class=\"flex size-8 items-center justify-center rounded-full bg-primary text-sm font-medium text-white\"\n >\n {{ userAvatar || '?' }}\n </div>\n <span class=\"hidden text-sm font-medium text-gray-700 dark:text-gray-300 md:block\">\n {{ userName }}\n </span>\n <Icon icon=\"lucide:chevron-down\" class=\"size-4 text-gray-500\" />\n </button>\n </template>\n\n <template #default=\"{ close }\">\n <div class=\"min-w-48 py-1\">\n <component\n :is=\"item.link ? routerLinkComponent : 'button'\"\n v-for=\"item in userMenuItems\"\n :key=\"item.label\"\n v-bind=\"item.link ? getLinkProps(item.link) : {}\"\n class=\"flex w-full items-center gap-2 px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800\"\n @click=\"handleUserMenuClick(item); close()\"\n >\n <Icon v-if=\"item.icon\" :icon=\"item.icon\" class=\"size-4\" />\n {{ item.label }}\n </component>\n </div>\n </template>\n </Dropdown>\n </div>\n </header>\n\n <!-- Page Content -->\n <div class=\"flex flex-1 flex-col overflow-y-auto\">\n <main class=\"container mx-auto flex flex-1 flex-col gap-5 p-5\">\n <slot>\n <component :is=\"routerViewComponent\" v-if=\"routerViewComponent\" />\n </slot>\n </main>\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\n\nexport interface Breadcrumb {\n label: string\n link: string\n}\n\ndefineProps<{\n /** Page title */\n title?: string\n /** Page description */\n description?: string\n /** Breadcrumb navigation items */\n breadcrumbs?: Breadcrumb[]\n}>()\n\n// Try to resolve RouterLink\nconst linkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst getLinkProps = (link: string) => {\n if (linkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n</script>\n\n<template>\n <div class=\"flex flex-col gap-4\">\n <!-- Breadcrumbs -->\n <nav v-if=\"breadcrumbs && breadcrumbs.length > 0\" aria-label=\"Breadcrumb\">\n <ol class=\"flex items-center\">\n <li\n v-for=\"(breadcrumb, index) in breadcrumbs\"\n :key=\"index\"\n class=\"flex items-center\"\n >\n <span\n v-if=\"index > 0\"\n class=\"mx-3 text-sm font-semibold text-gray-400 dark:text-gray-600\"\n >\n /\n </span>\n\n <slot name=\"breadcrumb\" :breadcrumb=\"breadcrumb\" :index=\"index\" :isLast=\"index === breadcrumbs.length - 1\">\n <component\n :is=\"linkComponent\"\n v-bind=\"getLinkProps(breadcrumb.link)\"\n :class=\"[\n 'text-sm transition-colors',\n index < breadcrumbs.length - 1\n ? 'font-semibold text-gray-900 hover:text-primary/90 hover:underline dark:text-gray-100'\n : 'text-gray-400 dark:text-gray-600',\n ]\"\n >\n {{ breadcrumb.label }}\n </component>\n </slot>\n </li>\n </ol>\n </nav>\n\n <!-- Page Header -->\n <div class=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div class=\"flex flex-col gap-1\">\n <h1\n v-if=\"title\"\n class=\"text-2xl font-bold text-gray-900 dark:text-gray-100\"\n >\n <slot name=\"title\">{{ title }}</slot>\n </h1>\n\n <p\n v-if=\"description\"\n class=\"text-sm text-gray-600 dark:text-gray-400\"\n >\n <slot name=\"description\">{{ description }}</slot>\n </p>\n </div>\n\n <div class=\"flex items-center gap-2\">\n <slot name=\"actions\" />\n </div>\n </div>\n\n <!-- Page Content -->\n <div class=\"flex-1\">\n <slot />\n </div>\n </div>\n</template>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_normalizeClass","_hoisted_2","_hoisted_3","_renderSlot","_hoisted_4","_createVNode","_unref","_Fragment","_renderList","_createBlock","MenuItem","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","Dropdown","_hoisted_10","_toDisplayString","_withCtx","_resolveDynamicComponent","_mergeProps","_createTextVNode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PageLayout.vue_vue_type_script_setup_true_lang-J1I-WjM-.js","sources":["../src/components/layout/BaseLayout.vue","../src/components/layout/PageLayout.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { ref, computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport MenuItem from '@/components/core/MenuItem.vue'\nimport Dropdown from '@/components/core/Dropdown.vue'\nimport type { MenuItemProps } from '@/types'\n\nexport interface UserMenuItem {\n label: string\n icon?: string\n link?: string\n action?: () => void\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Menu items for the sidebar */\n menuItems?: MenuItemProps[]\n /** App/brand name displayed in sidebar */\n appName?: string\n /** App icon (iconify icon name) */\n appIcon?: string\n /** Whether sidebar is open (v-model:sidebarOpen) */\n sidebarOpen?: boolean\n /** Whether dark mode is enabled (v-model:dark) */\n dark?: boolean\n /** Show dark mode toggle in header */\n showDarkToggle?: boolean\n /** Primary color class for sidebar background */\n sidebarClass?: string\n /** Current route path for menu active state (pass useRoute().path) */\n currentPath?: string\n /** User display name */\n userName?: string\n /** User avatar (initials or image URL) */\n userAvatar?: string\n /** User menu items (dropdown) */\n userMenuItems?: UserMenuItem[]\n }>(),\n {\n menuItems: () => [],\n appName: 'App',\n appIcon: 'lucide:box',\n sidebarOpen: true,\n dark: false,\n showDarkToggle: true,\n sidebarClass: 'bg-[#172b4c] dark:bg-slate-950',\n currentPath: undefined,\n userName: undefined,\n userAvatar: undefined,\n userMenuItems: () => [],\n },\n)\n\nconst emit = defineEmits<{\n 'update:sidebarOpen': [value: boolean]\n 'update:dark': [value: boolean]\n}>()\n\nconst internalSidebarOpen = ref(props.sidebarOpen)\nconst internalDark = ref(props.dark)\n\nconst sidebarOpenModel = computed({\n get: () => props.sidebarOpen ?? internalSidebarOpen.value,\n set: (value: boolean) => {\n internalSidebarOpen.value = value\n emit('update:sidebarOpen', value)\n },\n})\n\nconst darkModel = computed({\n get: () => props.dark ?? internalDark.value,\n set: (value: boolean) => {\n internalDark.value = value\n emit('update:dark', value)\n },\n})\n\nconst toggleSidebar = () => {\n sidebarOpenModel.value = !sidebarOpenModel.value\n}\n\nconst toggleDark = () => {\n darkModel.value = !darkModel.value\n}\n\n// Try to resolve RouterView\nconst routerViewComponent = computed(() => {\n try {\n const RouterView = resolveComponent('RouterView')\n if (typeof RouterView !== 'string') {\n return RouterView\n }\n } catch {\n // RouterView not available\n }\n return null\n})\n\n// Try to resolve RouterLink\nconst routerLinkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst getLinkProps = (link: string) => {\n if (routerLinkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n\nconst handleUserMenuClick = (item: UserMenuItem) => {\n if (item.action) {\n item.action()\n }\n}\n</script>\n\n<template>\n <div class=\"font-inter relative flex h-dvh bg-gray-100 dark:bg-slate-900\">\n <!-- Backdrop for mobile -->\n <div\n v-if=\"sidebarOpenModel\"\n class=\"absolute z-40 h-full w-full bg-slate-950/20 lg:hidden dark:bg-white/20\"\n @click=\"sidebarOpenModel = false\"\n ></div>\n\n <!-- Sidebar -->\n <aside\n :class=\"[\n sidebarOpenModel ? 'lg:w-60' : '-translate-x-76 lg:w-16 lg:translate-x-0',\n sidebarClass,\n ]\"\n class=\"@container absolute z-50 flex h-full w-76 flex-col justify-between gap-10 transition-all duration-1000 ease-in-out lg:relative\"\n >\n <!-- Sidebar Header -->\n <div class=\"flex h-16 items-center px-3\">\n <div class=\"flex flex-1 items-center justify-center gap-3\">\n <slot name=\"logo\">\n <div\n class=\"bg-primary text-primary-foreground flex size-8 items-center justify-center rounded-lg bg-white/20\"\n >\n <Icon class=\"size-5 text-white\" :icon=\"appIcon\" />\n </div>\n <span\n :class=\"sidebarOpenModel ? 'block' : 'hidden'\"\n class=\"font-outfit flex-1 text-lg font-semibold text-white\"\n >\n {{ appName }}\n </span>\n </slot>\n </div>\n\n <button\n class=\"rounded-lg bg-white/10 p-1 transition hover:bg-white/20 lg:hidden\"\n @click=\"toggleSidebar\"\n >\n <Icon class=\"size-6 text-white\" icon=\"lucide:menu\" />\n </button>\n </div>\n\n <!-- Menu Items -->\n <div\n :class=\"sidebarOpenModel ? 'items-start' : 'items-center'\"\n class=\"flex flex-1 flex-col gap-8 px-2 lg:justify-center\"\n >\n <slot name=\"menu\" :current-path=\"currentPath\">\n <MenuItem\n v-for=\"(item, index) in menuItems\"\n :key=\"index\"\n :menu-item=\"item\"\n :expanded=\"sidebarOpenModel\"\n :current-path=\"currentPath\"\n />\n </slot>\n </div>\n\n <!-- Sidebar Footer -->\n <div class=\"flex flex-col gap-3 px-3 pb-3\">\n <slot name=\"sidebar-footer\" />\n </div>\n </aside>\n\n <!-- Main Content Area -->\n <div class=\"flex flex-1 flex-col\">\n <!-- Header -->\n <header\n class=\"flex h-16 items-center justify-between border-b border-slate-200 bg-white px-4 dark:border-slate-800 dark:bg-slate-950\"\n >\n <div>\n <button\n class=\"rounded-lg bg-gray-100 p-1 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleSidebar\"\n >\n <Icon\n class=\"size-6 text-gray-900 hover:text-gray-800 dark:text-gray-100\"\n icon=\"lucide:menu\"\n />\n </button>\n </div>\n\n <div class=\"flex-1\">\n <slot name=\"header-center\" />\n </div>\n\n <div class=\"flex items-center gap-3\">\n <slot name=\"header-actions\" />\n\n <button\n v-if=\"showDarkToggle\"\n class=\"flex items-center justify-center rounded-lg bg-gray-100 p-2 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleDark\"\n >\n <Icon\n :icon=\"darkModel ? 'lucide:sun' : 'lucide:moon'\"\n class=\"size-5 text-gray-900 dark:text-gray-100\"\n />\n </button>\n\n <!-- User Menu -->\n <Dropdown v-if=\"userName || userAvatar\" align=\"right\">\n <template #trigger>\n <button\n class=\"flex items-center gap-2 rounded-lg p-1.5 transition hover:bg-gray-100 dark:hover:bg-gray-800\"\n >\n <div\n class=\"flex size-8 items-center justify-center rounded-full bg-primary text-sm font-medium text-white\"\n >\n {{ userAvatar || '?' }}\n </div>\n <span class=\"hidden text-sm font-medium text-gray-700 dark:text-gray-300 md:block\">\n {{ userName }}\n </span>\n <Icon icon=\"lucide:chevron-down\" class=\"size-4 text-gray-500\" />\n </button>\n </template>\n\n <template #default=\"{ close }\">\n <div class=\"min-w-48 py-1\">\n <component\n :is=\"item.link ? routerLinkComponent : 'button'\"\n v-for=\"item in userMenuItems\"\n :key=\"item.label\"\n v-bind=\"item.link ? getLinkProps(item.link) : {}\"\n class=\"flex w-full items-center gap-2 px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800\"\n @click=\"handleUserMenuClick(item); close()\"\n >\n <Icon v-if=\"item.icon\" :icon=\"item.icon\" class=\"size-4\" />\n {{ item.label }}\n </component>\n </div>\n </template>\n </Dropdown>\n </div>\n </header>\n\n <!-- Page Content -->\n <div class=\"flex flex-1 flex-col overflow-y-auto\">\n <main class=\"container mx-auto flex flex-1 flex-col gap-5 p-5\">\n <slot>\n <component :is=\"routerViewComponent\" v-if=\"routerViewComponent\" />\n </slot>\n </main>\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\n\nexport interface Breadcrumb {\n label: string\n link: string\n}\n\ndefineProps<{\n /** Page title */\n title?: string\n /** Page description */\n description?: string\n /** Breadcrumb navigation items */\n breadcrumbs?: Breadcrumb[]\n}>()\n\n// Try to resolve RouterLink\nconst linkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst getLinkProps = (link: string) => {\n if (linkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n</script>\n\n<template>\n <div class=\"flex flex-col gap-4\">\n <!-- Breadcrumbs -->\n <nav v-if=\"breadcrumbs && breadcrumbs.length > 0\" aria-label=\"Breadcrumb\">\n <ol class=\"flex items-center\">\n <li\n v-for=\"(breadcrumb, index) in breadcrumbs\"\n :key=\"index\"\n class=\"flex items-center\"\n >\n <span\n v-if=\"index > 0\"\n class=\"mx-3 text-sm font-semibold text-gray-400 dark:text-gray-600\"\n >\n /\n </span>\n\n <slot name=\"breadcrumb\" :breadcrumb=\"breadcrumb\" :index=\"index\" :isLast=\"index === breadcrumbs.length - 1\">\n <component\n :is=\"linkComponent\"\n v-bind=\"getLinkProps(breadcrumb.link)\"\n :class=\"[\n 'text-sm transition-colors',\n index < breadcrumbs.length - 1\n ? 'font-semibold text-gray-900 hover:text-primary/90 hover:underline dark:text-gray-100'\n : 'text-gray-400 dark:text-gray-600',\n ]\"\n >\n {{ breadcrumb.label }}\n </component>\n </slot>\n </li>\n </ol>\n </nav>\n\n <!-- Page Header -->\n <div class=\"flex flex-col gap-4 md:flex-row md:items-center md:justify-between\">\n <div class=\"flex flex-col gap-1\">\n <h1\n v-if=\"title\"\n class=\"text-2xl font-bold text-gray-900 dark:text-gray-100\"\n >\n <slot name=\"title\">{{ title }}</slot>\n </h1>\n\n <p\n v-if=\"description\"\n class=\"text-sm text-gray-600 dark:text-gray-400\"\n >\n <slot name=\"description\">{{ description }}</slot>\n </p>\n </div>\n\n <div class=\"flex items-center gap-2\">\n <slot name=\"actions\" />\n </div>\n </div>\n\n <!-- Page Content -->\n <div class=\"flex-1\">\n <slot />\n </div>\n </div>\n</template>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_normalizeClass","_hoisted_2","_hoisted_3","_renderSlot","_hoisted_4","_createVNode","_unref","_Fragment","_renderList","_createBlock","MenuItem","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","Dropdown","_hoisted_10","_toDisplayString","_withCtx","_resolveDynamicComponent","_mergeProps","_createTextVNode"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const CollapsibleCard_vue_vue_type_script_setup_true_lang = require("../../CollapsibleCard.vue_vue_type_script_setup_true_lang-Bd6TPEpH.cjs");
|
|
4
|
-
const Dropdown_vue_vue_type_script_setup_true_lang = require("../../Dropdown.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-H6wsySqi.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$2;
|
|
7
7
|
exports.Avatar = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$5;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { b, e, d, _, i, h, g, c, a, f } from "../../CollapsibleCard.vue_vue_type_script_setup_true_lang-l4KQ8HX8.js";
|
|
2
|
-
import { a as a2, _ as _2 } from "../../Dropdown.vue_vue_type_script_setup_true_lang-
|
|
2
|
+
import { a as a2, _ as _2 } from "../../Dropdown.vue_vue_type_script_setup_true_lang-D65uMijW.js";
|
|
3
3
|
import { _ as _3 } from "../../BadgeType.vue_vue_type_script_setup_true_lang-CnB5eNEM.js";
|
|
4
4
|
export {
|
|
5
5
|
b as AutocompleteComponent,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const Checkbox_vue_vue_type_script_setup_true_lang = require("../../Checkbox.vue_vue_type_script_setup_true_lang-
|
|
3
|
+
const Checkbox_vue_vue_type_script_setup_true_lang = require("../../Checkbox.vue_vue_type_script_setup_true_lang-CgLR8V21.cjs");
|
|
4
4
|
exports.Checkbox = Checkbox_vue_vue_type_script_setup_true_lang._sfc_main$7;
|
|
5
5
|
exports.FormGroup = Checkbox_vue_vue_type_script_setup_true_lang._sfc_main$4;
|
|
6
6
|
exports.FormHelp = Checkbox_vue_vue_type_script_setup_true_lang._sfc_main$1;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const CollapsibleCard_vue_vue_type_script_setup_true_lang = require("../CollapsibleCard.vue_vue_type_script_setup_true_lang-Bd6TPEpH.cjs");
|
|
4
|
-
const Dropdown_vue_vue_type_script_setup_true_lang = require("../Dropdown.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-H6wsySqi.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 Checkbox_vue_vue_type_script_setup_true_lang = require("../Checkbox.vue_vue_type_script_setup_true_lang-
|
|
6
|
+
const Checkbox_vue_vue_type_script_setup_true_lang = require("../Checkbox.vue_vue_type_script_setup_true_lang-CgLR8V21.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-DoawksKc.cjs");
|
|
9
9
|
exports.AutocompleteComponent = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$2;
|
|
10
10
|
exports.Avatar = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$5;
|
|
11
11
|
exports.Button = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$4;
|
package/dist/components/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { b, e, d, _, i, h, g, c, a, f } from "../CollapsibleCard.vue_vue_type_script_setup_true_lang-l4KQ8HX8.js";
|
|
2
|
-
import { a as a2, _ as _2 } from "../Dropdown.vue_vue_type_script_setup_true_lang-
|
|
2
|
+
import { a as a2, _ as _2 } from "../Dropdown.vue_vue_type_script_setup_true_lang-D65uMijW.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 { g as g2, d as d3, a as a4, b as b3, _ as _4, c as c3, e as e3, f as f2 } from "../Checkbox.vue_vue_type_script_setup_true_lang-
|
|
4
|
+
import { g as g2, d as d3, a as a4, b as b3, _ as _4, c as c3, e as e3, f as f2 } from "../Checkbox.vue_vue_type_script_setup_true_lang-CMq22Cg1.js";
|
|
5
5
|
import { e as e4, f as f3, _ as _5, a as a5, c as c4, d as d4, b as b4 } from "../EmptyState.vue_vue_type_script_setup_true_lang-CrVvFwXA.js";
|
|
6
|
-
import { _ as _6, a as a6 } from "../PageLayout.vue_vue_type_script_setup_true_lang-
|
|
6
|
+
import { _ as _6, a as a6 } from "../PageLayout.vue_vue_type_script_setup_true_lang-J1I-WjM-.js";
|
|
7
7
|
export {
|
|
8
8
|
e4 as Alert,
|
|
9
9
|
b 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-DoawksKc.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,9 +1,9 @@
|
|
|
1
1
|
import { b as _sfc_main$1, e as _sfc_main$2, d as _sfc_main$6, _ as _sfc_main$7, i as _sfc_main$9, h as _sfc_main$s, g as _sfc_main$u, c as _sfc_main$v, a as _sfc_main$w, f as _sfc_main$x } from "./CollapsibleCard.vue_vue_type_script_setup_true_lang-l4KQ8HX8.js";
|
|
2
|
-
import { a as _sfc_main$b, _ as _sfc_main$j } from "./Dropdown.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-D65uMijW.js";
|
|
3
3
|
import { e as _sfc_main$3, d as _sfc_main$5, c as _sfc_main$a, b as _sfc_main$n, _ as _sfc_main$r, a as _sfc_main$y } from "./BadgeType.vue_vue_type_script_setup_true_lang-CnB5eNEM.js";
|
|
4
|
-
import { g as _sfc_main$8, 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$q, f as _sfc_main$t } from "./Checkbox.vue_vue_type_script_setup_true_lang-
|
|
4
|
+
import { g as _sfc_main$8, 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$q, f as _sfc_main$t } from "./Checkbox.vue_vue_type_script_setup_true_lang-CMq22Cg1.js";
|
|
5
5
|
import { e as _sfc_main, f as _sfc_main$c, _ as _sfc_main$i, a as _sfc_main$k, c as _sfc_main$l, d as _sfc_main$m, b as _sfc_main$p } from "./EmptyState.vue_vue_type_script_setup_true_lang-CrVvFwXA.js";
|
|
6
|
-
import { _ as _sfc_main$4, a as _sfc_main$o } from "./PageLayout.vue_vue_type_script_setup_true_lang-
|
|
6
|
+
import { _ as _sfc_main$4, a as _sfc_main$o } from "./PageLayout.vue_vue_type_script_setup_true_lang-J1I-WjM-.js";
|
|
7
7
|
const components = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
8
8
|
__proto__: null,
|
|
9
9
|
Alert: _sfc_main,
|
|
@@ -45,4 +45,4 @@ const components = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePr
|
|
|
45
45
|
export {
|
|
46
46
|
components as c
|
|
47
47
|
};
|
|
48
|
-
//# sourceMappingURL=index-
|
|
48
|
+
//# sourceMappingURL=index-DacstXRp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-DacstXRp.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const CollapsibleCard_vue_vue_type_script_setup_true_lang = require("./CollapsibleCard.vue_vue_type_script_setup_true_lang-Bd6TPEpH.cjs");
|
|
3
|
-
const Dropdown_vue_vue_type_script_setup_true_lang = require("./Dropdown.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-H6wsySqi.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 Checkbox_vue_vue_type_script_setup_true_lang = require("./Checkbox.vue_vue_type_script_setup_true_lang-
|
|
5
|
+
const Checkbox_vue_vue_type_script_setup_true_lang = require("./Checkbox.vue_vue_type_script_setup_true_lang-CgLR8V21.cjs");
|
|
6
6
|
const EmptyState_vue_vue_type_script_setup_true_lang = require("./EmptyState.vue_vue_type_script_setup_true_lang-mlqLBP5W.cjs");
|
|
7
|
-
const PageLayout_vue_vue_type_script_setup_true_lang = require("./PageLayout.vue_vue_type_script_setup_true_lang-
|
|
7
|
+
const PageLayout_vue_vue_type_script_setup_true_lang = require("./PageLayout.vue_vue_type_script_setup_true_lang-DoawksKc.cjs");
|
|
8
8
|
const components = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
9
9
|
__proto__: null,
|
|
10
10
|
Alert: EmptyState_vue_vue_type_script_setup_true_lang._sfc_main$5,
|
|
@@ -44,4 +44,4 @@ const components = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePr
|
|
|
44
44
|
TextType: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$1
|
|
45
45
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
46
46
|
exports.components = components;
|
|
47
|
-
//# sourceMappingURL=index-
|
|
47
|
+
//# sourceMappingURL=index-m8Oi-7YC.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-m8Oi-7YC.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const CollapsibleCard_vue_vue_type_script_setup_true_lang = require("./CollapsibleCard.vue_vue_type_script_setup_true_lang-Bd6TPEpH.cjs");
|
|
4
|
-
const Dropdown_vue_vue_type_script_setup_true_lang = require("./Dropdown.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-H6wsySqi.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 Checkbox_vue_vue_type_script_setup_true_lang = require("./Checkbox.vue_vue_type_script_setup_true_lang-
|
|
6
|
+
const Checkbox_vue_vue_type_script_setup_true_lang = require("./Checkbox.vue_vue_type_script_setup_true_lang-CgLR8V21.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-DoawksKc.cjs");
|
|
9
9
|
const useExportCSV = require("./useExportCSV-BPC_hd25.cjs");
|
|
10
|
-
const components_index = require("./index-
|
|
10
|
+
const components_index = require("./index-m8Oi-7YC.cjs");
|
|
11
11
|
const VueTailwindUI = {
|
|
12
12
|
install(app, options = {}) {
|
|
13
13
|
const { prefix = "", components: selectedComponents } = options;
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { b, e, d, _, i, h, g, c, a, f } from "./CollapsibleCard.vue_vue_type_script_setup_true_lang-l4KQ8HX8.js";
|
|
2
|
-
import { a as a2, _ as _2 } from "./Dropdown.vue_vue_type_script_setup_true_lang-
|
|
2
|
+
import { a as a2, _ as _2 } from "./Dropdown.vue_vue_type_script_setup_true_lang-D65uMijW.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 { g as g2, d as d3, a as a4, b as b3, _ as _4, c as c3, e as e3, f as f2 } from "./Checkbox.vue_vue_type_script_setup_true_lang-
|
|
4
|
+
import { g as g2, d as d3, a as a4, b as b3, _ as _4, c as c3, e as e3, f as f2 } from "./Checkbox.vue_vue_type_script_setup_true_lang-CMq22Cg1.js";
|
|
5
5
|
import { e as e4, f as f3, _ as _5, a as a5, c as c4, d as d4, b as b4 } from "./EmptyState.vue_vue_type_script_setup_true_lang-CrVvFwXA.js";
|
|
6
|
-
import { _ as _6, a as a6 } from "./PageLayout.vue_vue_type_script_setup_true_lang-
|
|
6
|
+
import { _ as _6, a as a6 } from "./PageLayout.vue_vue_type_script_setup_true_lang-J1I-WjM-.js";
|
|
7
7
|
import { a as a7, b as b5, u } from "./useExportCSV-B9o9lJ3D.js";
|
|
8
|
-
import { c as components } from "./index-
|
|
8
|
+
import { c as components } from "./index-DacstXRp.js";
|
|
9
9
|
const VueTailwindUI = {
|
|
10
10
|
install(app, options = {}) {
|
|
11
11
|
const { prefix = "", components: selectedComponents } = options;
|
package/dist/types/form.d.ts
CHANGED
|
@@ -20,6 +20,8 @@ export interface FormGroupProps extends InputProps, SelectProps {
|
|
|
20
20
|
cols?: number;
|
|
21
21
|
hidden?: boolean;
|
|
22
22
|
error?: string | boolean;
|
|
23
|
+
/** Set to true to render a select instead of input */
|
|
24
|
+
select?: boolean;
|
|
23
25
|
}
|
|
24
26
|
export interface AutocompleteOption {
|
|
25
27
|
value: string;
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Checkbox.vue_vue_type_script_setup_true_lang-DQD2I1Wk.cjs","sources":["../src/components/form/FormLabel.vue","../src/components/form/FormHelp.vue","../src/components/form/FormInput.vue","../src/components/form/FormSelect.vue","../src/components/form/FormGroup.vue","../src/components/form/SearchInput.vue","../src/components/form/Switch.vue","../src/components/form/Checkbox.vue"],"sourcesContent":["<script lang=\"ts\" setup>\ndefineProps<{\n error?: string | boolean\n htmlFor?: string\n}>()\n</script>\n\n<template>\n <label\n :data-error=\"!!error\"\n :for=\"htmlFor ?? ''\"\n class=\"block text-sm font-medium text-gray-700 data-[error=true]:text-red-500 dark:text-gray-300\"\n >\n <slot />\n </label>\n</template>\n","<script lang=\"ts\" setup>\ndefineProps<{\n error?: boolean\n text?: string\n}>()\n</script>\n\n<template>\n <p\n :data-error=\"error\"\n class=\"mt-2 text-sm text-gray-400 peer-invalid:visible data-[error=true]:text-red-500 dark:text-gray-500\"\n >\n <slot>{{ text ?? '' }}</slot>\n </p>\n</template>\n","<script lang=\"ts\" setup>\nimport type { InputProps } from '@/types'\n\nwithDefaults(defineProps<InputProps>(), {\n type: 'text',\n})\n\nconst modelValue = defineModel<string>()\n</script>\n\n<template>\n <input\n :id=\"id ?? name ?? ''\"\n v-model=\"modelValue\"\n :disabled=\"disabled\"\n :name=\"name ?? ''\"\n :placeholder=\"placeholder\"\n :type=\"type\"\n class=\"mt-1 block w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-800 placeholder-gray-400 shadow-sm invalid:border-pink-500 invalid:text-pink-600 focus:border-primary focus:ring-1 focus:ring-primary focus:outline-none focus:invalid:border-pink-500 focus:invalid:ring-pink-500 disabled:border-gray-200 disabled:bg-gray-50 disabled:text-gray-500 disabled:shadow-none dark:border-gray-700 dark:bg-gray-900 dark:text-gray-200 dark:placeholder-gray-500 dark:focus:border-primary dark:focus:ring-primary dark:disabled:border-gray-800 dark:disabled:bg-gray-950 dark:disabled:text-gray-500\"\n v-bind=\"$attrs\"\n />\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, ref, watch, nextTick, onUnmounted } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport type { SelectProps, SelectOption } from '@/types'\n\nconst props = withDefaults(\n defineProps<\n SelectProps & {\n /** Use teleport to body to avoid overflow clipping */\n teleport?: boolean\n /** Show search input in dropdown */\n searchable?: boolean\n /** Text shown when no results match search */\n noResultsText?: string\n /** Custom class for the trigger button */\n triggerClass?: string\n }\n >(),\n {\n teleport: true,\n searchable: false,\n noResultsText: 'No results found',\n },\n)\n\nconst modelValue = defineModel<string | number | boolean | null>()\n\nconst isOpen = ref(false)\nconst searchQuery = ref('')\nconst highlightedIndex = ref(-1)\nconst triggerRef = ref<HTMLElement>()\nconst dropdownRef = ref<HTMLElement>()\nconst searchInputRef = ref<HTMLInputElement>()\nconst dropdownPosition = ref({ top: 0, left: 0, width: 0 })\n\nconst visibleOptions = computed(() => {\n return (props.options ?? []).filter((opt) => !opt.hidden)\n})\n\nconst filteredOptions = computed(() => {\n if (!props.searchable || !searchQuery.value) {\n return visibleOptions.value\n }\n const query = searchQuery.value.toLowerCase()\n return visibleOptions.value.filter((opt) =>\n opt.label.toLowerCase().includes(query) ||\n String(opt.value).toLowerCase().includes(query)\n )\n})\n\nconst selectedOption = computed(() => {\n return visibleOptions.value.find((opt) => opt.value === modelValue.value)\n})\n\nconst displayValue = computed(() => {\n if (selectedOption.value) {\n return selectedOption.value.label\n }\n return props.placeholder || 'Select...'\n})\n\nconst updatePosition = () => {\n if (!triggerRef.value || !props.teleport) return\n const rect = triggerRef.value.getBoundingClientRect()\n dropdownPosition.value = {\n top: rect.bottom + window.scrollY + 4,\n left: rect.left + window.scrollX,\n width: rect.width,\n }\n}\n\nconst open = () => {\n if (props.disabled) return\n isOpen.value = true\n searchQuery.value = ''\n highlightedIndex.value = filteredOptions.value.findIndex(\n (opt) => opt.value === modelValue.value\n )\n nextTick(() => {\n updatePosition()\n if (props.searchable) {\n searchInputRef.value?.focus()\n }\n })\n}\n\nconst close = () => {\n isOpen.value = false\n searchQuery.value = ''\n highlightedIndex.value = -1\n}\n\nconst toggle = () => {\n if (isOpen.value) {\n close()\n } else {\n open()\n }\n}\n\nconst selectOption = (option: SelectOption) => {\n modelValue.value = option.value\n close()\n}\n\nconst handleKeydown = (event: KeyboardEvent) => {\n if (!isOpen.value) {\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') {\n event.preventDefault()\n open()\n }\n return\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n highlightedIndex.value = Math.min(\n highlightedIndex.value + 1,\n filteredOptions.value.length - 1\n )\n scrollToHighlighted()\n break\n case 'ArrowUp':\n event.preventDefault()\n highlightedIndex.value = Math.max(highlightedIndex.value - 1, 0)\n scrollToHighlighted()\n break\n case 'Enter':\n event.preventDefault()\n if (highlightedIndex.value >= 0 && filteredOptions.value[highlightedIndex.value]) {\n selectOption(filteredOptions.value[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\nconst scrollToHighlighted = () => {\n nextTick(() => {\n if (dropdownRef.value) {\n const highlighted = dropdownRef.value.querySelector(\n `[data-index=\"${highlightedIndex.value}\"]`\n ) as HTMLElement\n if (highlighted) {\n highlighted.scrollIntoView({ block: 'nearest' })\n }\n }\n })\n}\n\nconst 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\nwatch(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\nwatch(searchQuery, () => {\n highlightedIndex.value = 0\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n})\n\nconst dropdownStyle = computed(() => {\n if (!props.teleport) return {}\n return {\n position: 'absolute' as const,\n top: `${dropdownPosition.value.top}px`,\n left: `${dropdownPosition.value.left}px`,\n width: `${dropdownPosition.value.width}px`,\n }\n})\n\nconst triggerClasses = computed(() => {\n const base = 'flex w-full items-center justify-between gap-2 rounded-md border px-3 py-2 text-sm text-left transition'\n const state = props.disabled\n ? 'cursor-not-allowed border-gray-200 bg-gray-50 text-gray-500 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-500'\n : isOpen.value\n ? 'border-primary ring-2 ring-primary/20 bg-white dark:bg-gray-900'\n : 'border-gray-300 bg-white hover:border-gray-400 dark:border-gray-700 dark:bg-gray-900 dark:hover:border-gray-600'\n const text = selectedOption.value\n ? 'text-gray-800 dark:text-gray-200'\n : 'text-gray-400 dark:text-gray-500'\n return [base, state, text, props.triggerClass]\n})\n</script>\n\n<template>\n <div class=\"relative\">\n <!-- Trigger -->\n <button\n ref=\"triggerRef\"\n type=\"button\"\n :id=\"id ?? name ?? undefined\"\n :disabled=\"disabled\"\n :class=\"triggerClasses\"\n @click=\"toggle\"\n @keydown=\"handleKeydown\"\n >\n <slot name=\"selected\" :option=\"selectedOption\" :placeholder=\"placeholder\">\n <span class=\"flex-1 truncate\">{{ displayValue }}</span>\n </slot>\n <Icon\n icon=\"lucide:chevron-down\"\n :class=\"['size-4 shrink-0 text-gray-400 transition-transform', isOpen && 'rotate-180']\"\n />\n </button>\n\n <!-- Dropdown -->\n <Teleport to=\"body\" :disabled=\"!teleport\">\n <Transition\n enter-active-class=\"transition duration-100 ease-out\"\n enter-from-class=\"opacity-0 scale-95\"\n enter-to-class=\"opacity-100 scale-100\"\n leave-active-class=\"transition duration-75 ease-in\"\n leave-from-class=\"opacity-100 scale-100\"\n leave-to-class=\"opacity-0 scale-95\"\n >\n <div\n v-if=\"isOpen\"\n ref=\"dropdownRef\"\n :style=\"dropdownStyle\"\n :class=\"[\n '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',\n !teleport && 'absolute mt-1 w-full',\n ]\"\n >\n <!-- Search input -->\n <div v-if=\"searchable\" class=\"sticky top-0 border-b border-gray-200 bg-white p-2 dark:border-gray-700 dark:bg-gray-800\">\n <div class=\"flex items-center gap-2 rounded-md border border-gray-300 bg-gray-50 px-2 py-1.5 dark:border-gray-600 dark:bg-gray-900\">\n <Icon icon=\"lucide:search\" class=\"size-4 text-gray-400\" />\n <input\n ref=\"searchInputRef\"\n v-model=\"searchQuery\"\n type=\"text\"\n class=\"flex-1 bg-transparent text-sm outline-none dark:text-white\"\n placeholder=\"Search...\"\n @keydown=\"handleKeydown\"\n />\n </div>\n </div>\n\n <!-- Empty state -->\n <div\n v-if=\"filteredOptions.length === 0\"\n class=\"px-4 py-3 text-sm text-gray-500 dark:text-gray-400\"\n >\n {{ noResultsText }}\n </div>\n\n <!-- Options -->\n <div class=\"py-1\">\n <button\n v-for=\"(option, index) in filteredOptions\"\n :key=\"String(option.value)\"\n type=\"button\"\n :data-index=\"index\"\n :class=\"[\n 'flex w-full items-center gap-2 px-3 py-2 text-left text-sm transition-colors',\n highlightedIndex === index && 'bg-gray-100 dark:bg-gray-700',\n modelValue === option.value && 'bg-primary/10 text-primary',\n modelValue !== option.value && 'text-gray-700 dark:text-gray-200',\n ]\"\n @click=\"selectOption(option)\"\n @mouseenter=\"highlightedIndex = index\"\n >\n <slot name=\"option\" :option=\"option\" :selected=\"modelValue === option.value\" :index=\"index\">\n <Icon\n v-if=\"modelValue === option.value\"\n icon=\"lucide:check\"\n class=\"size-4 shrink-0 text-primary\"\n />\n <span v-else class=\"size-4 shrink-0\" />\n <span class=\"flex-1\">{{ option.label }}</span>\n </slot>\n </button>\n </div>\n </div>\n </Transition>\n </Teleport>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport type { FormGroupProps } from '@/types'\nimport FormLabel from './FormLabel.vue'\nimport FormInput from './FormInput.vue'\nimport FormSelect from './FormSelect.vue'\nimport FormHelp from './FormHelp.vue'\n\nconst props = withDefaults(defineProps<FormGroupProps>(), {\n cols: 6,\n})\n\nconst modelValue = defineModel()\n\nconst computedCols = computed(() => `span ${props.cols} / span ${props.cols}`)\n\nconst isSelect = computed(() => props.type === 'select')\n</script>\n\n<template>\n <div :style=\"{ gridColumn: computedCols }\" :hidden=\"hidden\">\n <slot>\n <slot name=\"label\">\n <FormLabel v-if=\"label\" :html-for=\"id ?? name\" :error=\"error\">\n {{ label }}\n </FormLabel>\n </slot>\n\n <slot name=\"input\">\n <FormSelect\n v-if=\"isSelect\"\n v-model=\"modelValue\"\n v-bind=\"{ ...$attrs, ...$props }\"\n />\n <FormInput\n v-else\n v-model=\"modelValue\"\n v-bind=\"{ ...$attrs, ...$props }\"\n />\n </slot>\n\n <FormHelp v-if=\"error && typeof error === 'string'\" :error=\"true\">\n {{ error }}\n </FormHelp>\n </slot>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nconst {\n placeholder = 'Search...',\n icon = 'lucide:search',\n disabled = false,\n} = defineProps<{\n modelValue?: string\n placeholder?: string\n icon?: string\n disabled?: boolean\n}>()\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n}>()\n\nconst handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.value)\n}\n</script>\n\n<template>\n <div class=\"relative\">\n <Icon :icon=\"icon\" class=\"absolute top-1/2 left-3 h-5 w-5 -translate-y-1/2 text-gray-400\" />\n <input\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :value=\"modelValue\"\n class=\"focus:border-primary focus:ring-primary w-full rounded-lg border border-gray-300 bg-white py-2 pr-4 pl-10 text-gray-900 placeholder-gray-400 transition-colors disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-500\"\n type=\"text\"\n @input=\"handleInput\"\n />\n </div>\n</template>\n","<script lang=\"ts\" setup>\n\nconst props = withDefaults(\n defineProps<{\n /** v-model value */\n modelValue?: boolean\n /** Label text */\n label?: string\n /** Description text */\n description?: string\n /** Disabled state */\n disabled?: boolean\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n }>(),\n {\n modelValue: false,\n size: 'md',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n}>()\n\nconst toggle = () => {\n if (props.disabled) return\n emit('update:modelValue', !props.modelValue)\n}\n\nconst switchSizes = {\n sm: 'h-5 w-9',\n md: 'h-6 w-11',\n lg: 'h-7 w-14',\n}\n\nconst dotSizes = {\n sm: 'size-3',\n md: 'size-4',\n lg: 'size-5',\n}\n\nconst translateSizes = {\n sm: 'translate-x-5',\n md: 'translate-x-6',\n lg: 'translate-x-8',\n}\n</script>\n\n<template>\n <label\n class=\"inline-flex items-start gap-3\"\n :class=\"disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'\"\n >\n <button\n type=\"button\"\n role=\"switch\"\n :aria-checked=\"modelValue\"\n :disabled=\"disabled\"\n :class=\"[\n 'relative inline-flex shrink-0 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2',\n switchSizes[size],\n modelValue ? 'bg-primary' : 'bg-gray-300 dark:bg-gray-600',\n ]\"\n @click=\"toggle\"\n >\n <span\n :class=\"[\n 'inline-block transform rounded-full bg-white shadow-sm transition-transform',\n dotSizes[size],\n modelValue ? translateSizes[size] : 'translate-x-1',\n ]\"\n />\n </button>\n <div v-if=\"label || description\" class=\"flex flex-col\">\n <span v-if=\"label\" class=\"text-sm font-medium text-gray-900 dark:text-white\">\n {{ label }}\n </span>\n <span v-if=\"description\" class=\"text-sm text-gray-500 dark:text-gray-400\">\n {{ description }}\n </span>\n </div>\n </label>\n</template>\n","<script lang=\"ts\" setup>\nwithDefaults(\n defineProps<{\n /** v-model value */\n modelValue?: boolean\n /** Label text */\n label?: string\n /** Description text */\n description?: string\n /** Disabled state */\n disabled?: boolean\n /** Indeterminate state */\n indeterminate?: boolean\n }>(),\n {\n modelValue: false,\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n}>()\n\nconst toggle = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.checked)\n}\n</script>\n\n<template>\n <label\n class=\"inline-flex items-start gap-3\"\n :class=\"disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'\"\n >\n <input\n type=\"checkbox\"\n :checked=\"modelValue\"\n :disabled=\"disabled\"\n :indeterminate=\"indeterminate\"\n class=\"mt-0.5 size-4 rounded border-gray-300 text-primary/90 focus:ring-2 focus:ring-primary focus:ring-offset-2 disabled:cursor-not-allowed dark:border-gray-600 dark:bg-gray-800 dark:focus:ring-offset-gray-900\"\n @change=\"toggle\"\n />\n <div v-if=\"label || description\" class=\"flex flex-col\">\n <span v-if=\"label\" class=\"text-sm font-medium text-gray-900 dark:text-white\">\n {{ label }}\n </span>\n <span v-if=\"description\" class=\"text-sm text-gray-500 dark:text-gray-400\">\n {{ description }}\n </span>\n </div>\n </label>\n</template>\n"],"names":["_createElementBlock","_renderSlot","_useModel","_withDirectives","_openBlock","_mergeProps","$attrs","_hoisted_1","ref","computed","nextTick","watch","onUnmounted","_createElementVNode","_hoisted_3","_toDisplayString","_createVNode","_unref","Icon","_createBlock","_Teleport","_Transition","_normalizeClass","_hoisted_4","_Fragment","_renderList","FormLabel","FormSelect","$props","FormInput","FormHelp","_hoisted_2"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Checkbox.vue_vue_type_script_setup_true_lang-DVkcMcSN.js","sources":["../src/components/form/FormLabel.vue","../src/components/form/FormHelp.vue","../src/components/form/FormInput.vue","../src/components/form/FormSelect.vue","../src/components/form/FormGroup.vue","../src/components/form/SearchInput.vue","../src/components/form/Switch.vue","../src/components/form/Checkbox.vue"],"sourcesContent":["<script lang=\"ts\" setup>\ndefineProps<{\n error?: string | boolean\n htmlFor?: string\n}>()\n</script>\n\n<template>\n <label\n :data-error=\"!!error\"\n :for=\"htmlFor ?? ''\"\n class=\"block text-sm font-medium text-gray-700 data-[error=true]:text-red-500 dark:text-gray-300\"\n >\n <slot />\n </label>\n</template>\n","<script lang=\"ts\" setup>\ndefineProps<{\n error?: boolean\n text?: string\n}>()\n</script>\n\n<template>\n <p\n :data-error=\"error\"\n class=\"mt-2 text-sm text-gray-400 peer-invalid:visible data-[error=true]:text-red-500 dark:text-gray-500\"\n >\n <slot>{{ text ?? '' }}</slot>\n </p>\n</template>\n","<script lang=\"ts\" setup>\nimport type { InputProps } from '@/types'\n\nwithDefaults(defineProps<InputProps>(), {\n type: 'text',\n})\n\nconst modelValue = defineModel<string>()\n</script>\n\n<template>\n <input\n :id=\"id ?? name ?? ''\"\n v-model=\"modelValue\"\n :disabled=\"disabled\"\n :name=\"name ?? ''\"\n :placeholder=\"placeholder\"\n :type=\"type\"\n class=\"mt-1 block w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-800 placeholder-gray-400 shadow-sm invalid:border-pink-500 invalid:text-pink-600 focus:border-primary focus:ring-1 focus:ring-primary focus:outline-none focus:invalid:border-pink-500 focus:invalid:ring-pink-500 disabled:border-gray-200 disabled:bg-gray-50 disabled:text-gray-500 disabled:shadow-none dark:border-gray-700 dark:bg-gray-900 dark:text-gray-200 dark:placeholder-gray-500 dark:focus:border-primary dark:focus:ring-primary dark:disabled:border-gray-800 dark:disabled:bg-gray-950 dark:disabled:text-gray-500\"\n v-bind=\"$attrs\"\n />\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, ref, watch, nextTick, onUnmounted } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport type { SelectProps, SelectOption } from '@/types'\n\nconst props = withDefaults(\n defineProps<\n SelectProps & {\n /** Use teleport to body to avoid overflow clipping */\n teleport?: boolean\n /** Show search input in dropdown */\n searchable?: boolean\n /** Text shown when no results match search */\n noResultsText?: string\n /** Custom class for the trigger button */\n triggerClass?: string\n }\n >(),\n {\n teleport: true,\n searchable: false,\n noResultsText: 'No results found',\n },\n)\n\nconst modelValue = defineModel<string | number | boolean | null>()\n\nconst isOpen = ref(false)\nconst searchQuery = ref('')\nconst highlightedIndex = ref(-1)\nconst triggerRef = ref<HTMLElement>()\nconst dropdownRef = ref<HTMLElement>()\nconst searchInputRef = ref<HTMLInputElement>()\nconst dropdownPosition = ref({ top: 0, left: 0, width: 0 })\n\nconst visibleOptions = computed(() => {\n return (props.options ?? []).filter((opt) => !opt.hidden)\n})\n\nconst filteredOptions = computed(() => {\n if (!props.searchable || !searchQuery.value) {\n return visibleOptions.value\n }\n const query = searchQuery.value.toLowerCase()\n return visibleOptions.value.filter((opt) =>\n opt.label.toLowerCase().includes(query) ||\n String(opt.value).toLowerCase().includes(query)\n )\n})\n\nconst selectedOption = computed(() => {\n return visibleOptions.value.find((opt) => opt.value === modelValue.value)\n})\n\nconst displayValue = computed(() => {\n if (selectedOption.value) {\n return selectedOption.value.label\n }\n return props.placeholder || 'Select...'\n})\n\nconst updatePosition = () => {\n if (!triggerRef.value || !props.teleport) return\n const rect = triggerRef.value.getBoundingClientRect()\n dropdownPosition.value = {\n top: rect.bottom + window.scrollY + 4,\n left: rect.left + window.scrollX,\n width: rect.width,\n }\n}\n\nconst open = () => {\n if (props.disabled) return\n isOpen.value = true\n searchQuery.value = ''\n highlightedIndex.value = filteredOptions.value.findIndex(\n (opt) => opt.value === modelValue.value\n )\n nextTick(() => {\n updatePosition()\n if (props.searchable) {\n searchInputRef.value?.focus()\n }\n })\n}\n\nconst close = () => {\n isOpen.value = false\n searchQuery.value = ''\n highlightedIndex.value = -1\n}\n\nconst toggle = () => {\n if (isOpen.value) {\n close()\n } else {\n open()\n }\n}\n\nconst selectOption = (option: SelectOption) => {\n modelValue.value = option.value\n close()\n}\n\nconst handleKeydown = (event: KeyboardEvent) => {\n if (!isOpen.value) {\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') {\n event.preventDefault()\n open()\n }\n return\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n highlightedIndex.value = Math.min(\n highlightedIndex.value + 1,\n filteredOptions.value.length - 1\n )\n scrollToHighlighted()\n break\n case 'ArrowUp':\n event.preventDefault()\n highlightedIndex.value = Math.max(highlightedIndex.value - 1, 0)\n scrollToHighlighted()\n break\n case 'Enter':\n event.preventDefault()\n if (highlightedIndex.value >= 0 && filteredOptions.value[highlightedIndex.value]) {\n selectOption(filteredOptions.value[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\nconst scrollToHighlighted = () => {\n nextTick(() => {\n if (dropdownRef.value) {\n const highlighted = dropdownRef.value.querySelector(\n `[data-index=\"${highlightedIndex.value}\"]`\n ) as HTMLElement\n if (highlighted) {\n highlighted.scrollIntoView({ block: 'nearest' })\n }\n }\n })\n}\n\nconst 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\nwatch(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\nwatch(searchQuery, () => {\n highlightedIndex.value = 0\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n})\n\nconst dropdownStyle = computed(() => {\n if (!props.teleport) return {}\n return {\n position: 'absolute' as const,\n top: `${dropdownPosition.value.top}px`,\n left: `${dropdownPosition.value.left}px`,\n width: `${dropdownPosition.value.width}px`,\n }\n})\n\nconst triggerClasses = computed(() => {\n const base = 'flex w-full items-center justify-between gap-2 rounded-md border px-3 py-2 text-sm text-left transition'\n const state = props.disabled\n ? 'cursor-not-allowed border-gray-200 bg-gray-50 text-gray-500 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-500'\n : isOpen.value\n ? 'border-primary ring-2 ring-primary/20 bg-white dark:bg-gray-900'\n : 'border-gray-300 bg-white hover:border-gray-400 dark:border-gray-700 dark:bg-gray-900 dark:hover:border-gray-600'\n const text = selectedOption.value\n ? 'text-gray-800 dark:text-gray-200'\n : 'text-gray-400 dark:text-gray-500'\n return [base, state, text, props.triggerClass]\n})\n</script>\n\n<template>\n <div class=\"relative\">\n <!-- Trigger -->\n <button\n ref=\"triggerRef\"\n type=\"button\"\n :id=\"id ?? name ?? undefined\"\n :disabled=\"disabled\"\n :class=\"triggerClasses\"\n @click=\"toggle\"\n @keydown=\"handleKeydown\"\n >\n <slot name=\"selected\" :option=\"selectedOption\" :placeholder=\"placeholder\">\n <span class=\"flex-1 truncate\">{{ displayValue }}</span>\n </slot>\n <Icon\n icon=\"lucide:chevron-down\"\n :class=\"['size-4 shrink-0 text-gray-400 transition-transform', isOpen && 'rotate-180']\"\n />\n </button>\n\n <!-- Dropdown -->\n <Teleport to=\"body\" :disabled=\"!teleport\">\n <Transition\n enter-active-class=\"transition duration-100 ease-out\"\n enter-from-class=\"opacity-0 scale-95\"\n enter-to-class=\"opacity-100 scale-100\"\n leave-active-class=\"transition duration-75 ease-in\"\n leave-from-class=\"opacity-100 scale-100\"\n leave-to-class=\"opacity-0 scale-95\"\n >\n <div\n v-if=\"isOpen\"\n ref=\"dropdownRef\"\n :style=\"dropdownStyle\"\n :class=\"[\n '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',\n !teleport && 'absolute mt-1 w-full',\n ]\"\n >\n <!-- Search input -->\n <div v-if=\"searchable\" class=\"sticky top-0 border-b border-gray-200 bg-white p-2 dark:border-gray-700 dark:bg-gray-800\">\n <div class=\"flex items-center gap-2 rounded-md border border-gray-300 bg-gray-50 px-2 py-1.5 dark:border-gray-600 dark:bg-gray-900\">\n <Icon icon=\"lucide:search\" class=\"size-4 text-gray-400\" />\n <input\n ref=\"searchInputRef\"\n v-model=\"searchQuery\"\n type=\"text\"\n class=\"flex-1 bg-transparent text-sm outline-none dark:text-white\"\n placeholder=\"Search...\"\n @keydown=\"handleKeydown\"\n />\n </div>\n </div>\n\n <!-- Empty state -->\n <div\n v-if=\"filteredOptions.length === 0\"\n class=\"px-4 py-3 text-sm text-gray-500 dark:text-gray-400\"\n >\n {{ noResultsText }}\n </div>\n\n <!-- Options -->\n <div class=\"py-1\">\n <button\n v-for=\"(option, index) in filteredOptions\"\n :key=\"String(option.value)\"\n type=\"button\"\n :data-index=\"index\"\n :class=\"[\n 'flex w-full items-center gap-2 px-3 py-2 text-left text-sm transition-colors',\n highlightedIndex === index && 'bg-gray-100 dark:bg-gray-700',\n modelValue === option.value && 'bg-primary/10 text-primary',\n modelValue !== option.value && 'text-gray-700 dark:text-gray-200',\n ]\"\n @click=\"selectOption(option)\"\n @mouseenter=\"highlightedIndex = index\"\n >\n <slot name=\"option\" :option=\"option\" :selected=\"modelValue === option.value\" :index=\"index\">\n <Icon\n v-if=\"modelValue === option.value\"\n icon=\"lucide:check\"\n class=\"size-4 shrink-0 text-primary\"\n />\n <span v-else class=\"size-4 shrink-0\" />\n <span class=\"flex-1\">{{ option.label }}</span>\n </slot>\n </button>\n </div>\n </div>\n </Transition>\n </Teleport>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport type { FormGroupProps } from '@/types'\nimport FormLabel from './FormLabel.vue'\nimport FormInput from './FormInput.vue'\nimport FormSelect from './FormSelect.vue'\nimport FormHelp from './FormHelp.vue'\n\nconst props = withDefaults(defineProps<FormGroupProps>(), {\n cols: 6,\n})\n\nconst modelValue = defineModel()\n\nconst computedCols = computed(() => `span ${props.cols} / span ${props.cols}`)\n\nconst isSelect = computed(() => props.type === 'select')\n</script>\n\n<template>\n <div :style=\"{ gridColumn: computedCols }\" :hidden=\"hidden\">\n <slot>\n <slot name=\"label\">\n <FormLabel v-if=\"label\" :html-for=\"id ?? name\" :error=\"error\">\n {{ label }}\n </FormLabel>\n </slot>\n\n <slot name=\"input\">\n <FormSelect\n v-if=\"isSelect\"\n v-model=\"modelValue\"\n v-bind=\"{ ...$attrs, ...$props }\"\n />\n <FormInput\n v-else\n v-model=\"modelValue\"\n v-bind=\"{ ...$attrs, ...$props }\"\n />\n </slot>\n\n <FormHelp v-if=\"error && typeof error === 'string'\" :error=\"true\">\n {{ error }}\n </FormHelp>\n </slot>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nconst {\n placeholder = 'Search...',\n icon = 'lucide:search',\n disabled = false,\n} = defineProps<{\n modelValue?: string\n placeholder?: string\n icon?: string\n disabled?: boolean\n}>()\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n}>()\n\nconst handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.value)\n}\n</script>\n\n<template>\n <div class=\"relative\">\n <Icon :icon=\"icon\" class=\"absolute top-1/2 left-3 h-5 w-5 -translate-y-1/2 text-gray-400\" />\n <input\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :value=\"modelValue\"\n class=\"focus:border-primary focus:ring-primary w-full rounded-lg border border-gray-300 bg-white py-2 pr-4 pl-10 text-gray-900 placeholder-gray-400 transition-colors disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-500\"\n type=\"text\"\n @input=\"handleInput\"\n />\n </div>\n</template>\n","<script lang=\"ts\" setup>\n\nconst props = withDefaults(\n defineProps<{\n /** v-model value */\n modelValue?: boolean\n /** Label text */\n label?: string\n /** Description text */\n description?: string\n /** Disabled state */\n disabled?: boolean\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n }>(),\n {\n modelValue: false,\n size: 'md',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n}>()\n\nconst toggle = () => {\n if (props.disabled) return\n emit('update:modelValue', !props.modelValue)\n}\n\nconst switchSizes = {\n sm: 'h-5 w-9',\n md: 'h-6 w-11',\n lg: 'h-7 w-14',\n}\n\nconst dotSizes = {\n sm: 'size-3',\n md: 'size-4',\n lg: 'size-5',\n}\n\nconst translateSizes = {\n sm: 'translate-x-5',\n md: 'translate-x-6',\n lg: 'translate-x-8',\n}\n</script>\n\n<template>\n <label\n class=\"inline-flex items-start gap-3\"\n :class=\"disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'\"\n >\n <button\n type=\"button\"\n role=\"switch\"\n :aria-checked=\"modelValue\"\n :disabled=\"disabled\"\n :class=\"[\n 'relative inline-flex shrink-0 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2',\n switchSizes[size],\n modelValue ? 'bg-primary' : 'bg-gray-300 dark:bg-gray-600',\n ]\"\n @click=\"toggle\"\n >\n <span\n :class=\"[\n 'inline-block transform rounded-full bg-white shadow-sm transition-transform',\n dotSizes[size],\n modelValue ? translateSizes[size] : 'translate-x-1',\n ]\"\n />\n </button>\n <div v-if=\"label || description\" class=\"flex flex-col\">\n <span v-if=\"label\" class=\"text-sm font-medium text-gray-900 dark:text-white\">\n {{ label }}\n </span>\n <span v-if=\"description\" class=\"text-sm text-gray-500 dark:text-gray-400\">\n {{ description }}\n </span>\n </div>\n </label>\n</template>\n","<script lang=\"ts\" setup>\nwithDefaults(\n defineProps<{\n /** v-model value */\n modelValue?: boolean\n /** Label text */\n label?: string\n /** Description text */\n description?: string\n /** Disabled state */\n disabled?: boolean\n /** Indeterminate state */\n indeterminate?: boolean\n }>(),\n {\n modelValue: false,\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n}>()\n\nconst toggle = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.checked)\n}\n</script>\n\n<template>\n <label\n class=\"inline-flex items-start gap-3\"\n :class=\"disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'\"\n >\n <input\n type=\"checkbox\"\n :checked=\"modelValue\"\n :disabled=\"disabled\"\n :indeterminate=\"indeterminate\"\n class=\"mt-0.5 size-4 rounded border-gray-300 text-primary/90 focus:ring-2 focus:ring-primary focus:ring-offset-2 disabled:cursor-not-allowed dark:border-gray-600 dark:bg-gray-800 dark:focus:ring-offset-gray-900\"\n @change=\"toggle\"\n />\n <div v-if=\"label || description\" class=\"flex flex-col\">\n <span v-if=\"label\" class=\"text-sm font-medium text-gray-900 dark:text-white\">\n {{ label }}\n </span>\n <span v-if=\"description\" class=\"text-sm text-gray-500 dark:text-gray-400\">\n {{ description }}\n </span>\n </div>\n </label>\n</template>\n"],"names":["_createElementBlock","_renderSlot","_useModel","_withDirectives","_openBlock","_mergeProps","$attrs","_hoisted_1","_createElementVNode","_hoisted_3","_toDisplayString","_createVNode","_unref","_createBlock","_Teleport","_Transition","_normalizeClass","_hoisted_4","_Fragment","_renderList","FormLabel","FormSelect","$props","FormInput","FormHelp","_hoisted_2"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.vue_vue_type_script_setup_true_lang-CZQ5Ci8K.cjs","sources":["../src/components/core/MenuItem.vue","../src/components/core/Dropdown.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport type { MenuItemProps } from '@/types'\n\nconst props = withDefaults(\n defineProps<{\n menuItem: MenuItemProps\n /** Whether sidebar is expanded (shows labels) */\n expanded?: boolean\n /** Override active state directly */\n active?: boolean\n /** Current route path (pass from parent using useRoute().path) */\n currentPath?: string\n }>(),\n {\n expanded: true,\n active: undefined,\n currentPath: undefined,\n },\n)\n\nconst isRouteActive = computed(() => {\n // If active prop is explicitly set, use it\n if (props.active !== undefined) {\n return props.active\n }\n\n // Use currentPath prop if provided, otherwise fall back to window.location\n const path = props.currentPath ?? (typeof window !== 'undefined' ? window.location.pathname : '/')\n\n if (props.menuItem.link === '/') {\n return path === '/'\n }\n return path === props.menuItem.link || path.startsWith(props.menuItem.link + '/')\n})\n\n// Try to resolve RouterLink, fallback to 'a' tag\nconst linkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst linkProps = computed(() => {\n if (linkComponent.value === 'a') {\n return { href: props.menuItem.link }\n }\n return { to: props.menuItem.link }\n})\n</script>\n\n<template>\n <component\n :is=\"linkComponent\"\n v-bind=\"linkProps\"\n :class=\"expanded ? 'flex-row' : 'flex-col'\"\n class=\"group relative flex items-center justify-center gap-2 px-5\"\n >\n <div class=\"relative\">\n <Icon\n :class=\"[\n isRouteActive\n ? 'text-white'\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500',\n expanded ? 'size-6' : 'size-8',\n ]\"\n class=\"transition-all duration-300\"\n :icon=\"menuItem.icon\"\n />\n\n <span\n v-if=\"menuItem.notification\"\n class=\"absolute top-0.25 right-0.25 size-1.5 rounded-full bg-red-600\"\n ></span>\n </div>\n\n <Transition\n enter-active-class=\"transition-all duration-300 ease-out\"\n enter-from-class=\"opacity-0 -translate-x-2\"\n enter-to-class=\"opacity-100 translate-x-0\"\n leave-active-class=\"transition-all duration-200 ease-in\"\n leave-from-class=\"opacity-100 translate-x-0\"\n leave-to-class=\"opacity-0 -translate-x-2\"\n >\n <span\n v-if=\"expanded\"\n :class=\"\n isRouteActive\n ? 'text-white'\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500'\n \"\n class=\"text-sm font-semibold whitespace-nowrap\"\n >{{ menuItem.label }}</span\n >\n </Transition>\n </component>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, computed, onUnmounted, nextTick, watch } from 'vue'\nimport { Icon } from '@iconify/vue'\n\nexport interface DropdownItem {\n key: string\n label: string\n icon?: string\n disabled?: boolean\n danger?: boolean\n divider?: boolean\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Dropdown items (optional if using default slot) */\n items?: DropdownItem[]\n /** Align dropdown */\n align?: 'left' | 'right'\n /** Dropdown width */\n width?: 'auto' | 'full' | 'sm' | 'md' | 'lg'\n /** Use teleport to body to avoid overflow clipping */\n teleport?: boolean\n }>(),\n {\n items: () => [],\n align: 'left',\n width: 'auto',\n teleport: true,\n },\n)\n\nconst emit = defineEmits<{\n select: [item: DropdownItem]\n}>()\n\nconst isOpen = ref(false)\nconst dropdownRef = ref<HTMLElement>()\nconst triggerRef = ref<HTMLElement>()\nconst menuRef = ref<HTMLElement>()\nconst dropdownPosition = ref({ top: 0, left: 0, width: 0 })\n\nconst updatePosition = () => {\n if (!triggerRef.value || !props.teleport) return\n const rect = triggerRef.value.getBoundingClientRect()\n dropdownPosition.value = {\n top: rect.bottom + window.scrollY + 8,\n left: props.align === 'right' ? rect.right + window.scrollX : rect.left + window.scrollX,\n width: rect.width,\n }\n}\n\nconst toggle = () => {\n isOpen.value = !isOpen.value\n if (isOpen.value) {\n nextTick(updatePosition)\n }\n}\n\nconst close = () => {\n isOpen.value = false\n}\n\nconst selectItem = (item: DropdownItem) => {\n if (item.disabled || item.divider) return\n emit('select', item)\n close()\n}\n\nconst handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node\n const isInsideTrigger = triggerRef.value?.contains(target)\n const isInsideMenu = menuRef.value?.contains(target)\n if (!isInsideTrigger && !isInsideMenu) {\n close()\n }\n}\n\nwatch(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\nonUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n})\n\nconst widthClasses = {\n auto: 'w-auto min-w-[10rem]',\n full: 'w-full',\n sm: 'w-32',\n md: 'w-48',\n lg: 'w-64',\n}\n\nconst dropdownStyle = computed(() => {\n if (!props.teleport) return {}\n return {\n position: 'absolute' as const,\n top: `${dropdownPosition.value.top}px`,\n left: props.align === 'right' ? 'auto' : `${dropdownPosition.value.left}px`,\n right: props.align === 'right' ? `${window.innerWidth - dropdownPosition.value.left - dropdownPosition.value.width}px` : 'auto',\n }\n})\n</script>\n\n<template>\n <div ref=\"dropdownRef\" class=\"relative inline-block\">\n <div ref=\"triggerRef\" @click=\"toggle\">\n <slot name=\"trigger\">\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700\"\n >\n <slot name=\"trigger-label\">Options</slot>\n <Icon\n icon=\"lucide:chevron-down\"\n :class=\"['size-4 transition-transform', isOpen && 'rotate-180']\"\n />\n </button>\n </slot>\n </div>\n\n <Teleport to=\"body\" :disabled=\"!teleport\">\n <Transition\n enter-active-class=\"transition ease-out duration-100\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-in duration-75\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-if=\"isOpen\"\n ref=\"menuRef\"\n :style=\"dropdownStyle\"\n :class=\"[\n 'z-[9999] rounded-lg border border-gray-200 bg-white py-1 shadow-lg dark:border-gray-700 dark:bg-gray-800',\n widthClasses[width],\n !teleport && (align === 'right' ? 'absolute mt-2 right-0' : 'absolute mt-2 left-0'),\n ]\"\n >\n <!-- Custom content via default slot -->\n <slot :close=\"close\">\n <!-- Default items rendering -->\n <template v-for=\"item in items\" :key=\"item.key\">\n <div\n v-if=\"item.divider\"\n class=\"my-1 border-t border-gray-200 dark:border-gray-700\"\n />\n <button\n v-else\n type=\"button\"\n :disabled=\"item.disabled\"\n :class=\"[\n 'flex w-full items-center gap-2 px-4 py-2 text-left text-sm transition-colors',\n item.disabled\n ? 'cursor-not-allowed opacity-50'\n : item.danger\n ? 'text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-900/20'\n : 'text-gray-700 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-gray-700',\n ]\"\n @click=\"selectItem(item)\"\n >\n <Icon v-if=\"item.icon\" :icon=\"item.icon\" class=\"size-4\" />\n {{ item.label }}\n </button>\n </template>\n </slot>\n </div>\n </Transition>\n </Teleport>\n </div>\n</template>\n"],"names":["computed","resolveComponent","_openBlock","_createBlock","_resolveDynamicComponent","_mergeProps","_createElementVNode","_hoisted_1","_createVNode","_unref","Icon","_normalizeClass","_createElementBlock","_hoisted_2","_Transition","_toDisplayString","ref","nextTick","watch","onUnmounted","_renderSlot","_Teleport","_Fragment","_renderList"],"mappings":";;;;;;;;;;;;;;;;;AAKA,UAAM,QAAQ;AAiBd,UAAM,gBAAgBA,IAAAA,SAAS,MAAM;AAEnC,UAAI,MAAM,WAAW,QAAW;AAC9B,eAAO,MAAM;AAAA,MACf;AAGA,YAAM,OAAO,MAAM,gBAAgB,OAAO,WAAW,cAAc,OAAO,SAAS,WAAW;AAE9F,UAAI,MAAM,SAAS,SAAS,KAAK;AAC/B,eAAO,SAAS;AAAA,MAClB;AACA,aAAO,SAAS,MAAM,SAAS,QAAQ,KAAK,WAAW,MAAM,SAAS,OAAO,GAAG;AAAA,IAClF,CAAC;AAGD,UAAM,gBAAgBA,IAAAA,SAAS,MAAM;AACnC,UAAI;AACF,cAAM,aAAaC,IAAAA,iBAAiB,YAAY;AAChD,YAAI,OAAO,eAAe,UAAU;AAClC,iBAAO;AAAA,QACT;AAAA,MACF,QAAQ;AAAA,MAER;AACA,aAAO;AAAA,IACT,CAAC;AAED,UAAM,YAAYD,IAAAA,SAAS,MAAM;AAC/B,UAAI,cAAc,UAAU,KAAK;AAC/B,eAAO,EAAE,MAAM,MAAM,SAAS,KAAA;AAAA,MAChC;AACA,aAAO,EAAE,IAAI,MAAM,SAAS,KAAA;AAAA,IAC9B,CAAC;;AAIC,aAAAE,IAAAA,UAAA,GAAAC,IAAAA,YA2CYC,4BA1CL,cAAA,KAAa,GADpBC,IAAAA,WAEU,UAyCE,OAzCO;AAAA,QAChB,OAAK,CAAE,QAAA,WAAQ,aAAA,YACV,4DAA4D;AAAA,MAAA;6BAElE,MAgBM;AAAA,UAhBNC,IAAAA,mBAgBM,OAhBNC,cAgBM;AAAA,YAfJC,gBASEC,IAAAA,MAAAC,MAAAA,IAAA,GAAA;AAAA,cARC,OAAKC,IAAAA,eAAA,CAAA;AAAA,gBAAc,cAAA;gBAA8J,QAAA,WAAQ,WAAA;AAAA,cAAA,GAMpL,6BAA6B,CAAA;AAAA,cAClC,MAAM,QAAA,SAAS;AAAA,YAAA;YAIV,QAAA,SAAS,gBADjBT,IAAAA,aAAAU,IAAAA,mBAGQ,QAHRC,YAGQ;;UAGVL,IAAAA,YAkBaM,IAAAA,YAAA;AAAA,YAjBX,sBAAmB;AAAA,YACnB,oBAAiB;AAAA,YACjB,kBAAe;AAAA,YACf,sBAAmB;AAAA,YACnB,oBAAiB;AAAA,YACjB,kBAAe;AAAA,UAAA;iCAEf,MASC;AAAA,cARO,QAAA,6BADRF,IAAAA,mBASC,QAAA;AAAA;gBAPE,OAAKD,IAAAA,eAAA;AAAA,kBAAa,cAAA;kBAKb;AAAA,gBAAA,CAAyC;AAAA,cAAA,GAC3CI,IAAAA,gBAAA,QAAA,SAAS,KAAK,GAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtF1B,UAAM,QAAQ;AAmBd,UAAM,OAAO;AAIb,UAAM,SAASC,IAAAA,IAAI,KAAK;AACxB,UAAM,cAAcA,IAAAA,IAAA;AACpB,UAAM,aAAaA,IAAAA,IAAA;AACnB,UAAM,UAAUA,IAAAA,IAAA;AAChB,UAAM,mBAAmBA,QAAI,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG;AAE1D,UAAM,iBAAiB,MAAM;AAC3B,UAAI,CAAC,WAAW,SAAS,CAAC,MAAM,SAAU;AAC1C,YAAM,OAAO,WAAW,MAAM,sBAAA;AAC9B,uBAAiB,QAAQ;AAAA,QACvB,KAAK,KAAK,SAAS,OAAO,UAAU;AAAA,QACpC,MAAM,MAAM,UAAU,UAAU,KAAK,QAAQ,OAAO,UAAU,KAAK,OAAO,OAAO;AAAA,QACjF,OAAO,KAAK;AAAA,MAAA;AAAA,IAEhB;AAEA,UAAM,SAAS,MAAM;AACnB,aAAO,QAAQ,CAAC,OAAO;AACvB,UAAI,OAAO,OAAO;AAChBC,YAAAA,SAAS,cAAc;AAAA,MACzB;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM;AAClB,aAAO,QAAQ;AAAA,IACjB;AAEA,UAAM,aAAa,CAAC,SAAuB;AACzC,UAAI,KAAK,YAAY,KAAK,QAAS;AACnC,WAAK,UAAU,IAAI;AACnB,YAAA;AAAA,IACF;AAEA,UAAM,qBAAqB,CAAC,UAAsB;;AAChD,YAAM,SAAS,MAAM;AACrB,YAAM,mBAAkB,gBAAW,UAAX,mBAAkB,SAAS;AACnD,YAAM,gBAAe,aAAQ,UAAR,mBAAe,SAAS;AAC7C,UAAI,CAAC,mBAAmB,CAAC,cAAc;AACrC,cAAA;AAAA,MACF;AAAA,IACF;AAEAC,cAAM,QAAQ,CAAC,aAAa;AAC1B,UAAI,UAAU;AACZ,iBAAS,iBAAiB,SAAS,kBAAkB;AACrD,eAAO,iBAAiB,UAAU,gBAAgB,IAAI;AACtD,eAAO,iBAAiB,UAAU,cAAc;AAAA,MAClD,OAAO;AACL,iBAAS,oBAAoB,SAAS,kBAAkB;AACxD,eAAO,oBAAoB,UAAU,gBAAgB,IAAI;AACzD,eAAO,oBAAoB,UAAU,cAAc;AAAA,MACrD;AAAA,IACF,CAAC;AAEDC,QAAAA,YAAY,MAAM;AAChB,eAAS,oBAAoB,SAAS,kBAAkB;AACxD,aAAO,oBAAoB,UAAU,gBAAgB,IAAI;AACzD,aAAO,oBAAoB,UAAU,cAAc;AAAA,IACrD,CAAC;AAED,UAAM,eAAe;AAAA,MACnB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAGN,UAAM,gBAAgBnB,IAAAA,SAAS,MAAM;AACnC,UAAI,CAAC,MAAM,SAAU,QAAO,CAAA;AAC5B,aAAO;AAAA,QACL,UAAU;AAAA,QACV,KAAK,GAAG,iBAAiB,MAAM,GAAG;AAAA,QAClC,MAAM,MAAM,UAAU,UAAU,SAAS,GAAG,iBAAiB,MAAM,IAAI;AAAA,QACvE,OAAO,MAAM,UAAU,UAAU,GAAG,OAAO,aAAa,iBAAiB,MAAM,OAAO,iBAAiB,MAAM,KAAK,OAAO;AAAA,MAAA;AAAA,IAE7H,CAAC;;8BAICY,IAAAA,mBAiEM,OAAA;AAAA,iBAjEG;AAAA,QAAJ,KAAI;AAAA,QAAc,OAAM;AAAA,MAAA;QAC3BN,IAAAA,mBAaM,OAAA;AAAA,mBAbG;AAAA,UAAJ,KAAI;AAAA,UAAc,SAAO;AAAA,QAAA;UAC5Bc,IAAAA,WAWO,4BAXP,MAWO;AAAA,YAVLd,IAAAA,mBASS,UATT,YASS;AAAA,cALPc,IAAAA,WAAyC,kCAAzC,MAAyC;AAAA,8DAAd,WAAO,EAAA;AAAA,cAAA;cAClCZ,gBAGEC,IAAAA,MAAAC,MAAAA,IAAA,GAAA;AAAA,gBAFA,MAAK;AAAA,gBACJ,0DAAuC,OAAA,SAAM,YAAA,CAAA;AAAA,cAAA;;;;0BAMtDP,IAAAA,YAgDWkB,cAAA;AAAA,UAhDD,IAAG;AAAA,UAAQ,WAAW,QAAA;AAAA,QAAA;UAC9Bb,IAAAA,YA8CaM,IAAAA,YAAA;AAAA,YA7CX,sBAAmB;AAAA,YACnB,oBAAiB;AAAA,YACjB,kBAAe;AAAA,YACf,sBAAmB;AAAA,YACnB,oBAAiB;AAAA,YACjB,kBAAe;AAAA,UAAA;iCAEf,MAqCM;AAAA,cApCE,OAAA,0BADRF,IAAAA,mBAqCM,OAAA;AAAA;yBAnCA;AAAA,gBAAJ,KAAI;AAAA,gBACH,0BAAO,cAAA,KAAa;AAAA,gBACpB,OAAKD,IAAAA,eAAA;AAAA;kBAAwI,aAAa,QAAA,KAAK;AAAA,kBAAgB,CAAA,QAAA,aAAa,QAAA,UAAK,UAAA,0BAAA;AAAA,gBAAA;;gBAOlMS,IAAAA,WAyBO,KAAA,QAAA,WAAA,EAzBA,MAAA,GAAP,MAyBO;AAAA,wCAvBLR,IAAAA,mBAsBWU,IAAAA,UAAA,MAAAC,IAAAA,WAtBc,QAAA,OAAK,CAAb,SAAI;;sBAAiB,KAAA,KAAK;AAAA,oBAAA;sBAEjC,KAAK,WADbrB,cAAA,GAAAU,uBAGE,OAHF,UAGE,uBACFA,IAAAA,mBAgBS,UAAA;AAAA;wBAdP,MAAK;AAAA,wBACJ,UAAU,KAAK;AAAA,wBACf,OAAKD,IAAAA,eAAA;AAAA;0BAAwH,KAAK,6CAAqF,KAAK;;wBAQ5N,SAAK,CAAA,WAAE,WAAW,IAAI;AAAA,sBAAA;wBAEX,KAAK,yBAAjBR,IAAAA,YAA0DM,IAAAA,MAAAC,MAAAA,IAAA,GAAA;AAAA;0BAAlC,MAAM,KAAK;AAAA,0BAAM,OAAM;AAAA,wBAAA;4CAAW,MAC1DK,IAAAA,gBAAG,KAAK,KAAK,GAAA,CAAA;AAAA,sBAAA;;;;;;;;;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.vue_vue_type_script_setup_true_lang-CfyqlT_n.js","sources":["../src/components/core/MenuItem.vue","../src/components/core/Dropdown.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport type { MenuItemProps } from '@/types'\n\nconst props = withDefaults(\n defineProps<{\n menuItem: MenuItemProps\n /** Whether sidebar is expanded (shows labels) */\n expanded?: boolean\n /** Override active state directly */\n active?: boolean\n /** Current route path (pass from parent using useRoute().path) */\n currentPath?: string\n }>(),\n {\n expanded: true,\n active: undefined,\n currentPath: undefined,\n },\n)\n\nconst isRouteActive = computed(() => {\n // If active prop is explicitly set, use it\n if (props.active !== undefined) {\n return props.active\n }\n\n // Use currentPath prop if provided, otherwise fall back to window.location\n const path = props.currentPath ?? (typeof window !== 'undefined' ? window.location.pathname : '/')\n\n if (props.menuItem.link === '/') {\n return path === '/'\n }\n return path === props.menuItem.link || path.startsWith(props.menuItem.link + '/')\n})\n\n// Try to resolve RouterLink, fallback to 'a' tag\nconst linkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst linkProps = computed(() => {\n if (linkComponent.value === 'a') {\n return { href: props.menuItem.link }\n }\n return { to: props.menuItem.link }\n})\n</script>\n\n<template>\n <component\n :is=\"linkComponent\"\n v-bind=\"linkProps\"\n :class=\"expanded ? 'flex-row' : 'flex-col'\"\n class=\"group relative flex items-center justify-center gap-2 px-5\"\n >\n <div class=\"relative\">\n <Icon\n :class=\"[\n isRouteActive\n ? 'text-white'\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500',\n expanded ? 'size-6' : 'size-8',\n ]\"\n class=\"transition-all duration-300\"\n :icon=\"menuItem.icon\"\n />\n\n <span\n v-if=\"menuItem.notification\"\n class=\"absolute top-0.25 right-0.25 size-1.5 rounded-full bg-red-600\"\n ></span>\n </div>\n\n <Transition\n enter-active-class=\"transition-all duration-300 ease-out\"\n enter-from-class=\"opacity-0 -translate-x-2\"\n enter-to-class=\"opacity-100 translate-x-0\"\n leave-active-class=\"transition-all duration-200 ease-in\"\n leave-from-class=\"opacity-100 translate-x-0\"\n leave-to-class=\"opacity-0 -translate-x-2\"\n >\n <span\n v-if=\"expanded\"\n :class=\"\n isRouteActive\n ? 'text-white'\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500'\n \"\n class=\"text-sm font-semibold whitespace-nowrap\"\n >{{ menuItem.label }}</span\n >\n </Transition>\n </component>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, computed, onUnmounted, nextTick, watch } from 'vue'\nimport { Icon } from '@iconify/vue'\n\nexport interface DropdownItem {\n key: string\n label: string\n icon?: string\n disabled?: boolean\n danger?: boolean\n divider?: boolean\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Dropdown items (optional if using default slot) */\n items?: DropdownItem[]\n /** Align dropdown */\n align?: 'left' | 'right'\n /** Dropdown width */\n width?: 'auto' | 'full' | 'sm' | 'md' | 'lg'\n /** Use teleport to body to avoid overflow clipping */\n teleport?: boolean\n }>(),\n {\n items: () => [],\n align: 'left',\n width: 'auto',\n teleport: true,\n },\n)\n\nconst emit = defineEmits<{\n select: [item: DropdownItem]\n}>()\n\nconst isOpen = ref(false)\nconst dropdownRef = ref<HTMLElement>()\nconst triggerRef = ref<HTMLElement>()\nconst menuRef = ref<HTMLElement>()\nconst dropdownPosition = ref({ top: 0, left: 0, width: 0 })\n\nconst updatePosition = () => {\n if (!triggerRef.value || !props.teleport) return\n const rect = triggerRef.value.getBoundingClientRect()\n dropdownPosition.value = {\n top: rect.bottom + window.scrollY + 8,\n left: props.align === 'right' ? rect.right + window.scrollX : rect.left + window.scrollX,\n width: rect.width,\n }\n}\n\nconst toggle = () => {\n isOpen.value = !isOpen.value\n if (isOpen.value) {\n nextTick(updatePosition)\n }\n}\n\nconst close = () => {\n isOpen.value = false\n}\n\nconst selectItem = (item: DropdownItem) => {\n if (item.disabled || item.divider) return\n emit('select', item)\n close()\n}\n\nconst handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node\n const isInsideTrigger = triggerRef.value?.contains(target)\n const isInsideMenu = menuRef.value?.contains(target)\n if (!isInsideTrigger && !isInsideMenu) {\n close()\n }\n}\n\nwatch(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\nonUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n})\n\nconst widthClasses = {\n auto: 'w-auto min-w-[10rem]',\n full: 'w-full',\n sm: 'w-32',\n md: 'w-48',\n lg: 'w-64',\n}\n\nconst dropdownStyle = computed(() => {\n if (!props.teleport) return {}\n return {\n position: 'absolute' as const,\n top: `${dropdownPosition.value.top}px`,\n left: props.align === 'right' ? 'auto' : `${dropdownPosition.value.left}px`,\n right: props.align === 'right' ? `${window.innerWidth - dropdownPosition.value.left - dropdownPosition.value.width}px` : 'auto',\n }\n})\n</script>\n\n<template>\n <div ref=\"dropdownRef\" class=\"relative inline-block\">\n <div ref=\"triggerRef\" @click=\"toggle\">\n <slot name=\"trigger\">\n <button\n type=\"button\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700\"\n >\n <slot name=\"trigger-label\">Options</slot>\n <Icon\n icon=\"lucide:chevron-down\"\n :class=\"['size-4 transition-transform', isOpen && 'rotate-180']\"\n />\n </button>\n </slot>\n </div>\n\n <Teleport to=\"body\" :disabled=\"!teleport\">\n <Transition\n enter-active-class=\"transition ease-out duration-100\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-in duration-75\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-if=\"isOpen\"\n ref=\"menuRef\"\n :style=\"dropdownStyle\"\n :class=\"[\n 'z-[9999] rounded-lg border border-gray-200 bg-white py-1 shadow-lg dark:border-gray-700 dark:bg-gray-800',\n widthClasses[width],\n !teleport && (align === 'right' ? 'absolute mt-2 right-0' : 'absolute mt-2 left-0'),\n ]\"\n >\n <!-- Custom content via default slot -->\n <slot :close=\"close\">\n <!-- Default items rendering -->\n <template v-for=\"item in items\" :key=\"item.key\">\n <div\n v-if=\"item.divider\"\n class=\"my-1 border-t border-gray-200 dark:border-gray-700\"\n />\n <button\n v-else\n type=\"button\"\n :disabled=\"item.disabled\"\n :class=\"[\n 'flex w-full items-center gap-2 px-4 py-2 text-left text-sm transition-colors',\n item.disabled\n ? 'cursor-not-allowed opacity-50'\n : item.danger\n ? 'text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-900/20'\n : 'text-gray-700 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-gray-700',\n ]\"\n @click=\"selectItem(item)\"\n >\n <Icon v-if=\"item.icon\" :icon=\"item.icon\" class=\"size-4\" />\n {{ item.label }}\n </button>\n </template>\n </slot>\n </div>\n </Transition>\n </Teleport>\n </div>\n</template>\n"],"names":["_openBlock","_createBlock","_resolveDynamicComponent","_mergeProps","_createElementVNode","_hoisted_1","_createVNode","_unref","_normalizeClass","_createElementBlock","_hoisted_2","_Transition","_toDisplayString","_renderSlot","_Teleport","_Fragment","_renderList"],"mappings":";;;;;;;;;;;;;;;;AAKA,UAAM,QAAQ;AAiBd,UAAM,gBAAgB,SAAS,MAAM;AAEnC,UAAI,MAAM,WAAW,QAAW;AAC9B,eAAO,MAAM;AAAA,MACf;AAGA,YAAM,OAAO,MAAM,gBAAgB,OAAO,WAAW,cAAc,OAAO,SAAS,WAAW;AAE9F,UAAI,MAAM,SAAS,SAAS,KAAK;AAC/B,eAAO,SAAS;AAAA,MAClB;AACA,aAAO,SAAS,MAAM,SAAS,QAAQ,KAAK,WAAW,MAAM,SAAS,OAAO,GAAG;AAAA,IAClF,CAAC;AAGD,UAAM,gBAAgB,SAAS,MAAM;AACnC,UAAI;AACF,cAAM,aAAa,iBAAiB,YAAY;AAChD,YAAI,OAAO,eAAe,UAAU;AAClC,iBAAO;AAAA,QACT;AAAA,MACF,QAAQ;AAAA,MAER;AACA,aAAO;AAAA,IACT,CAAC;AAED,UAAM,YAAY,SAAS,MAAM;AAC/B,UAAI,cAAc,UAAU,KAAK;AAC/B,eAAO,EAAE,MAAM,MAAM,SAAS,KAAA;AAAA,MAChC;AACA,aAAO,EAAE,IAAI,MAAM,SAAS,KAAA;AAAA,IAC9B,CAAC;;AAIC,aAAAA,UAAA,GAAAC,YA2CYC,wBA1CL,cAAA,KAAa,GADpBC,WAEU,UAyCE,OAzCO;AAAA,QAChB,OAAK,CAAE,QAAA,WAAQ,aAAA,YACV,4DAA4D;AAAA,MAAA;yBAElE,MAgBM;AAAA,UAhBNC,mBAgBM,OAhBNC,cAgBM;AAAA,YAfJC,YASEC,MAAA,IAAA,GAAA;AAAA,cARC,OAAKC,eAAA,CAAA;AAAA,gBAAc,cAAA;gBAA8J,QAAA,WAAQ,WAAA;AAAA,cAAA,GAMpL,6BAA6B,CAAA;AAAA,cAClC,MAAM,QAAA,SAAS;AAAA,YAAA;YAIV,QAAA,SAAS,gBADjBR,aAAAS,mBAGQ,QAHRC,YAGQ;;UAGVJ,YAkBaK,YAAA;AAAA,YAjBX,sBAAmB;AAAA,YACnB,oBAAiB;AAAA,YACjB,kBAAe;AAAA,YACf,sBAAmB;AAAA,YACnB,oBAAiB;AAAA,YACjB,kBAAe;AAAA,UAAA;6BAEf,MASC;AAAA,cARO,QAAA,yBADRF,mBASC,QAAA;AAAA;gBAPE,OAAKD,eAAA;AAAA,kBAAa,cAAA;kBAKb;AAAA,gBAAA,CAAyC;AAAA,cAAA,GAC3CI,gBAAA,QAAA,SAAS,KAAK,GAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtF1B,UAAM,QAAQ;AAmBd,UAAM,OAAO;AAIb,UAAM,SAAS,IAAI,KAAK;AACxB,UAAM,cAAc,IAAA;AACpB,UAAM,aAAa,IAAA;AACnB,UAAM,UAAU,IAAA;AAChB,UAAM,mBAAmB,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG;AAE1D,UAAM,iBAAiB,MAAM;AAC3B,UAAI,CAAC,WAAW,SAAS,CAAC,MAAM,SAAU;AAC1C,YAAM,OAAO,WAAW,MAAM,sBAAA;AAC9B,uBAAiB,QAAQ;AAAA,QACvB,KAAK,KAAK,SAAS,OAAO,UAAU;AAAA,QACpC,MAAM,MAAM,UAAU,UAAU,KAAK,QAAQ,OAAO,UAAU,KAAK,OAAO,OAAO;AAAA,QACjF,OAAO,KAAK;AAAA,MAAA;AAAA,IAEhB;AAEA,UAAM,SAAS,MAAM;AACnB,aAAO,QAAQ,CAAC,OAAO;AACvB,UAAI,OAAO,OAAO;AAChB,iBAAS,cAAc;AAAA,MACzB;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM;AAClB,aAAO,QAAQ;AAAA,IACjB;AAEA,UAAM,aAAa,CAAC,SAAuB;AACzC,UAAI,KAAK,YAAY,KAAK,QAAS;AACnC,WAAK,UAAU,IAAI;AACnB,YAAA;AAAA,IACF;AAEA,UAAM,qBAAqB,CAAC,UAAsB;;AAChD,YAAM,SAAS,MAAM;AACrB,YAAM,mBAAkB,gBAAW,UAAX,mBAAkB,SAAS;AACnD,YAAM,gBAAe,aAAQ,UAAR,mBAAe,SAAS;AAC7C,UAAI,CAAC,mBAAmB,CAAC,cAAc;AACrC,cAAA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,CAAC,aAAa;AAC1B,UAAI,UAAU;AACZ,iBAAS,iBAAiB,SAAS,kBAAkB;AACrD,eAAO,iBAAiB,UAAU,gBAAgB,IAAI;AACtD,eAAO,iBAAiB,UAAU,cAAc;AAAA,MAClD,OAAO;AACL,iBAAS,oBAAoB,SAAS,kBAAkB;AACxD,eAAO,oBAAoB,UAAU,gBAAgB,IAAI;AACzD,eAAO,oBAAoB,UAAU,cAAc;AAAA,MACrD;AAAA,IACF,CAAC;AAED,gBAAY,MAAM;AAChB,eAAS,oBAAoB,SAAS,kBAAkB;AACxD,aAAO,oBAAoB,UAAU,gBAAgB,IAAI;AACzD,aAAO,oBAAoB,UAAU,cAAc;AAAA,IACrD,CAAC;AAED,UAAM,eAAe;AAAA,MACnB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAGN,UAAM,gBAAgB,SAAS,MAAM;AACnC,UAAI,CAAC,MAAM,SAAU,QAAO,CAAA;AAC5B,aAAO;AAAA,QACL,UAAU;AAAA,QACV,KAAK,GAAG,iBAAiB,MAAM,GAAG;AAAA,QAClC,MAAM,MAAM,UAAU,UAAU,SAAS,GAAG,iBAAiB,MAAM,IAAI;AAAA,QACvE,OAAO,MAAM,UAAU,UAAU,GAAG,OAAO,aAAa,iBAAiB,MAAM,OAAO,iBAAiB,MAAM,KAAK,OAAO;AAAA,MAAA;AAAA,IAE7H,CAAC;;0BAICH,mBAiEM,OAAA;AAAA,iBAjEG;AAAA,QAAJ,KAAI;AAAA,QAAc,OAAM;AAAA,MAAA;QAC3BL,mBAaM,OAAA;AAAA,mBAbG;AAAA,UAAJ,KAAI;AAAA,UAAc,SAAO;AAAA,QAAA;UAC5BS,WAWO,4BAXP,MAWO;AAAA,YAVLT,mBASS,UATT,YASS;AAAA,cALPS,WAAyC,kCAAzC,MAAyC;AAAA,0DAAd,WAAO,EAAA;AAAA,cAAA;cAClCP,YAGEC,MAAA,IAAA,GAAA;AAAA,gBAFA,MAAK;AAAA,gBACJ,sDAAuC,OAAA,SAAM,YAAA,CAAA;AAAA,cAAA;;;;sBAMtDN,YAgDWa,UAAA;AAAA,UAhDD,IAAG;AAAA,UAAQ,WAAW,QAAA;AAAA,QAAA;UAC9BR,YA8CaK,YAAA;AAAA,YA7CX,sBAAmB;AAAA,YACnB,oBAAiB;AAAA,YACjB,kBAAe;AAAA,YACf,sBAAmB;AAAA,YACnB,oBAAiB;AAAA,YACjB,kBAAe;AAAA,UAAA;6BAEf,MAqCM;AAAA,cApCE,OAAA,sBADRF,mBAqCM,OAAA;AAAA;yBAnCA;AAAA,gBAAJ,KAAI;AAAA,gBACH,sBAAO,cAAA,KAAa;AAAA,gBACpB,OAAKD,eAAA;AAAA;kBAAwI,aAAa,QAAA,KAAK;AAAA,kBAAgB,CAAA,QAAA,aAAa,QAAA,UAAK,UAAA,0BAAA;AAAA,gBAAA;;gBAOlMK,WAyBO,KAAA,QAAA,WAAA,EAzBA,MAAA,GAAP,MAyBO;AAAA,oCAvBLJ,mBAsBWM,UAAA,MAAAC,WAtBc,QAAA,OAAK,CAAb,SAAI;;sBAAiB,KAAA,KAAK;AAAA,oBAAA;sBAEjC,KAAK,WADbhB,UAAA,GAAAS,mBAGE,OAHF,UAGE,mBACFA,mBAgBS,UAAA;AAAA;wBAdP,MAAK;AAAA,wBACJ,UAAU,KAAK;AAAA,wBACf,OAAKD,eAAA;AAAA;0BAAwH,KAAK,6CAAqF,KAAK;;wBAQ5N,SAAK,CAAA,WAAE,WAAW,IAAI;AAAA,sBAAA;wBAEX,KAAK,qBAAjBP,YAA0DM,MAAA,IAAA,GAAA;AAAA;0BAAlC,MAAM,KAAK;AAAA,0BAAM,OAAM;AAAA,wBAAA;wCAAW,MAC1DK,gBAAG,KAAK,KAAK,GAAA,CAAA;AAAA,sBAAA;;;;;;;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-3tIGVZX9.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-CjRzry8D.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|