@topjoao/top-design-system 0.1.0-beta.2 → 0.1.0-beta.21

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TopToast-Dkz2oCA0.cjs","names":["defineComponent","computed","_hoisted_1","openBlock","createElementBlock","mergeProps","Fragment","renderList","createBlock","resolveDynamicComponent","$attrs","$slots","$attrs"],"sources":["../src/components/TopButton.vue","../src/components/TopButton.vue","../src/tokens/colors.ts","../src/components/TopConfirmDialog.vue","../src/components/TopConfirmDialog.vue","../src/components/TopDatePicker.vue","../src/components/TopDatePicker.vue","../node_modules/@hugeicons/core-free-icons/dist/esm/CloudUploadIcon.js","../node_modules/@hugeicons/core-free-icons/dist/esm/Home07Icon.js","../node_modules/@hugeicons/vue/dist/esm/components/HugeiconsIcon.vue2.js","../node_modules/@hugeicons/vue/dist/esm/_virtual/_plugin-vue_export-helper.js","../node_modules/@hugeicons/vue/dist/esm/components/HugeiconsIcon.vue.js","../src/components/TopFileUpload.vue","../src/components/TopFileUpload.vue","../src/components/TopInputText.vue","../src/components/TopInputText.vue","../src/components/internal/TopNavMobileTree.vue","../src/components/internal/TopNavMobileTree.vue","../src/components/TopNavBar.vue","../src/components/TopNavBar.vue","../src/components/TopSelect.vue","../src/components/TopSelect.vue","../src/components/TopTabs.vue","../src/components/TopTabs.vue","../src/components/TopToast.vue","../src/components/TopToast.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, useSlots } from 'vue'\r\nimport Button from 'primevue/button'\r\nimport vTooltip from 'primevue/tooltip'\nimport { twMerge } from 'tailwind-merge'\n\nexport type TopButtonSeverity = 'primary' | 'secondary' | 'success' | 'warn' | 'danger'\n\nconst slots = useSlots()\nconst outrosIcones = computed(() => Boolean(slots.icon))\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n tooltip?: string\r\n tooltipClass?: string\r\n label?: string\r\n icon?: string\r\n loading?: boolean\r\n class?: string\r\n outlined?: boolean\n severity?: TopButtonSeverity\n secondary?: boolean\n disabled?: boolean\r\n unstyled?: boolean\r\n type?: 'button' | 'submit' | 'reset'\r\n }>(),\r\n {\r\n tooltip: '',\r\n tooltipClass: 'text-xs',\r\n label: '',\r\n icon: '',\r\n loading: false,\r\n class: '',\r\n outlined: false,\n severity: 'primary',\n secondary: false,\n disabled: false,\r\n unstyled: false,\r\n type: 'button',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\n click: []\n}>()\n\nconst resolvedSeverity = computed<TopButtonSeverity>(() =>\n props.secondary ? 'secondary' : props.severity,\n)\n\nconst buttonClasses = computed(() => {\n const baseClasses = !props.unstyled\n ? resolvedSeverity.value === 'secondary'\n ? 'rounded-[10px] border px-3 py-2 font-bold dark:!border-zinc-500 dark:!bg-zinc-700 dark:!text-zinc-100 dark:hover:!bg-zinc-600'\n : props.outlined\n ? resolvedSeverity.value === 'primary'\n ? 'shrink-0 rounded-[10px] border-primary-800 px-3 py-2 text-primary-800 hover:bg-primary-50 dark:border-primary-200 dark:bg-transparent dark:text-primary-100 dark:hover:bg-primary-900'\n : 'shrink-0 rounded-[10px] border px-3 py-2 font-bold'\n : resolvedSeverity.value === 'primary'\n ? 'rounded-[10px] !border-primary-900 bg-primary-900 px-3 py-2 font-bold text-white hover:!border-primary-800 hover:bg-primary-800 dark:!text-white'\n : 'rounded-[10px] border px-3 py-2 font-bold'\n : ''\r\n\r\n return twMerge(baseClasses, props.class)\r\n})\r\n</script>\r\n\r\n<template>\r\n <span class=\"top-button top-solutions-component h-fit w-fit rounded-[12px] bg-transparent\">\r\n <Button\r\n v-tooltip.top=\"{\r\n value: tooltip,\r\n class: tooltipClass,\r\n }\"\r\n :type=\"type\"\r\n :label=\"label\"\r\n :disabled=\"disabled || loading\"\r\n :icon=\"outrosIcones ? undefined : icon || undefined\"\r\n :loading=\"loading\"\r\n :outlined=\"outlined || resolvedSeverity === 'secondary'\"\n :severity=\"resolvedSeverity === 'primary' ? undefined : resolvedSeverity\"\n :class=\"buttonClasses\"\r\n :pt=\"{\r\n root: { class: buttonClasses },\r\n }\"\r\n @click=\"emit('click')\"\r\n >\r\n <template v-if=\"outrosIcones\" #icon>\r\n <slot name=\"icon\" />\r\n </template>\r\n </Button>\r\n </span>\r\n</template>\r\n\r\n<style>\r\n.top-button {\r\n width: fit-content;\r\n height: fit-content;\r\n border-radius: 12px;\r\n background-color: transparent;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed, useSlots } from 'vue'\r\nimport Button from 'primevue/button'\r\nimport vTooltip from 'primevue/tooltip'\nimport { twMerge } from 'tailwind-merge'\n\nexport type TopButtonSeverity = 'primary' | 'secondary' | 'success' | 'warn' | 'danger'\n\nconst slots = useSlots()\nconst outrosIcones = computed(() => Boolean(slots.icon))\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n tooltip?: string\r\n tooltipClass?: string\r\n label?: string\r\n icon?: string\r\n loading?: boolean\r\n class?: string\r\n outlined?: boolean\n severity?: TopButtonSeverity\n secondary?: boolean\n disabled?: boolean\r\n unstyled?: boolean\r\n type?: 'button' | 'submit' | 'reset'\r\n }>(),\r\n {\r\n tooltip: '',\r\n tooltipClass: 'text-xs',\r\n label: '',\r\n icon: '',\r\n loading: false,\r\n class: '',\r\n outlined: false,\n severity: 'primary',\n secondary: false,\n disabled: false,\r\n unstyled: false,\r\n type: 'button',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\n click: []\n}>()\n\nconst resolvedSeverity = computed<TopButtonSeverity>(() =>\n props.secondary ? 'secondary' : props.severity,\n)\n\nconst buttonClasses = computed(() => {\n const baseClasses = !props.unstyled\n ? resolvedSeverity.value === 'secondary'\n ? 'rounded-[10px] border px-3 py-2 font-bold dark:!border-zinc-500 dark:!bg-zinc-700 dark:!text-zinc-100 dark:hover:!bg-zinc-600'\n : props.outlined\n ? resolvedSeverity.value === 'primary'\n ? 'shrink-0 rounded-[10px] border-primary-800 px-3 py-2 text-primary-800 hover:bg-primary-50 dark:border-primary-200 dark:bg-transparent dark:text-primary-100 dark:hover:bg-primary-900'\n : 'shrink-0 rounded-[10px] border px-3 py-2 font-bold'\n : resolvedSeverity.value === 'primary'\n ? 'rounded-[10px] !border-primary-900 bg-primary-900 px-3 py-2 font-bold text-white hover:!border-primary-800 hover:bg-primary-800 dark:!text-white'\n : 'rounded-[10px] border px-3 py-2 font-bold'\n : ''\r\n\r\n return twMerge(baseClasses, props.class)\r\n})\r\n</script>\r\n\r\n<template>\r\n <span class=\"top-button top-solutions-component h-fit w-fit rounded-[12px] bg-transparent\">\r\n <Button\r\n v-tooltip.top=\"{\r\n value: tooltip,\r\n class: tooltipClass,\r\n }\"\r\n :type=\"type\"\r\n :label=\"label\"\r\n :disabled=\"disabled || loading\"\r\n :icon=\"outrosIcones ? undefined : icon || undefined\"\r\n :loading=\"loading\"\r\n :outlined=\"outlined || resolvedSeverity === 'secondary'\"\n :severity=\"resolvedSeverity === 'primary' ? undefined : resolvedSeverity\"\n :class=\"buttonClasses\"\r\n :pt=\"{\r\n root: { class: buttonClasses },\r\n }\"\r\n @click=\"emit('click')\"\r\n >\r\n <template v-if=\"outrosIcones\" #icon>\r\n <slot name=\"icon\" />\r\n </template>\r\n </Button>\r\n </span>\r\n</template>\r\n\r\n<style>\r\n.top-button {\r\n width: fit-content;\r\n height: fit-content;\r\n border-radius: 12px;\r\n background-color: transparent;\r\n}\r\n</style>\r\n","export const colors = {\n primary: {\n 50: '#EEF9FF',\n 100: '#DFF4FF',\n 200: '#C5E6F8',\n 300: '#8EC4DF',\n 400: '#66ACD1',\n 500: '#2488BC',\n 600: '#036DA3',\n 700: '#1B5783',\n 800: '#02466B',\n 900: '#052F4A',\n 950: '#0C192D',\n },\n secondary: {\n 50: '#FAFAFA',\n 100: '#F4F4F5',\n 200: '#E9E9E9',\n 300: '#D8D8D8',\n 400: '#B8B8B8',\n 500: '#8E8E8E',\n 600: '#676767',\n 700: '#4B4B4B',\n 800: '#343434',\n 900: '#1C1917',\n 950: '#0C0A09',\n },\n success: {\n 50: '#FAFFFA',\n 100: '#F4FBF6',\n 200: '#DFF6DE',\n 300: '#CBE3CA',\n 400: '#A3CCA1',\n 500: '#6BA968',\n 600: '#358F30',\n 700: '#2C7B27',\n 800: '#1E631A',\n 900: '#10430D',\n 950: '#062804',\n },\n warn: {\n 50: '#FFF7ED',\n 100: '#FDF3D8',\n 200: '#FDE9B2',\n 300: '#FDD566',\n 400: '#FFB900',\n 500: '#FFA515',\n 600: '#FD9024',\n 700: '#DD781F',\n 800: '#BC4E00',\n 900: '#A42D02',\n 950: '#792202',\n },\n danger: {\n 50: '#F8E6E4',\n 100: '#FFDDD9',\n 200: '#EEC1BC',\n 300: '#E3938C',\n 400: '#E3675C',\n 500: '#DC3F32',\n 600: '#CF150E',\n 700: '#B10404',\n 800: '#820907',\n 900: '#5D0803',\n 950: '#450501',\n },\n} as const\n","<script setup lang=\"ts\">\r\nimport { computed } from \"vue\";\r\nimport Dialog from \"primevue/dialog\";\r\nimport { colors } from \"../tokens/colors\";\r\nimport TopButton from \"./TopButton.vue\";\r\n\r\ntype ConfirmDialogSeverity = \"primary\" | \"danger\";\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: boolean;\r\n title?: string;\r\n message?: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n loading?: boolean;\r\n loadingText?: string;\r\n severity?: ConfirmDialogSeverity;\r\n icon?: string;\r\n }>(),\r\n {\r\n modelValue: false,\r\n title: \"Confirmar\",\r\n message: \"\",\r\n confirmText: \"Confirmar\",\r\n cancelText: \"Cancelar\",\r\n loading: false,\r\n loadingText: \"Processando...\",\r\n severity: \"danger\",\r\n icon: \"pi pi-exclamation-triangle\",\r\n }\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:modelValue\": [value: boolean];\r\n confirm: [];\r\n cancel: [];\r\n close: [];\r\n}>();\r\n\r\nconst visibleProxy = computed({\r\n get: () => props.modelValue,\r\n set: (value: boolean) => {\r\n if (!value && props.loading) return;\r\n emit(\"update:modelValue\", value);\r\n },\r\n});\r\n\r\nconst accentStyle = computed<Record<string, string>>(() => ({\r\n \"--top-confirm-dialog-accent\":\r\n props.severity === \"danger\" ? colors.danger[600] : colors.primary[800],\r\n \"--top-confirm-dialog-accent-hover\":\r\n props.severity === \"danger\" ? colors.danger[700] : colors.primary[700],\r\n}));\r\n\r\nconst confirmButtonClass = computed(() =>\r\n [\r\n \"px-3 py-2 text-sm\",\r\n props.severity === \"danger\" ? \"!border-red-600 !bg-red-600 hover:!border-red-700 hover:!bg-red-700\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")\r\n);\r\n\r\nfunction confirm() {\r\n if (props.loading) return;\r\n emit(\"confirm\");\r\n}\r\n\r\nfunction cancel() {\r\n if (props.loading) return;\r\n emit(\"cancel\");\r\n visibleProxy.value = false;\r\n}\r\n\r\nfunction close() {\r\n if (props.loading) return;\r\n visibleProxy.value = false;\r\n}\r\n</script>\r\n\r\n<template>\r\n <Dialog\r\n v-model:visible=\"visibleProxy\"\r\n modal\r\n :closable=\"false\"\r\n :close-on-escape=\"!loading\"\r\n :dismissable-mask=\"false\"\r\n :draggable=\"false\"\r\n :show-header=\"false\"\r\n :style=\"{ width: '500px', maxWidth: 'calc(100vw - 2rem)' }\"\r\n :aria-label=\"title\"\r\n :pt=\"{\r\n root: { class: 'top-confirm-dialog top-solutions-component' },\r\n content: { class: 'p-6' },\r\n footer: { class: 'hidden' },\r\n }\"\r\n @hide=\"emit('close')\"\r\n >\r\n <div\r\n class=\"relative flex flex-col items-center gap-4 text-center\"\r\n :style=\"accentStyle\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"absolute right-[-0.25rem] top-[-0.5rem] flex size-8 items-center justify-center rounded-full border-0 bg-transparent p-0 text-secondary-700 outline-none transition-colors hover:bg-secondary-200 focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:text-zinc-200 dark:hover:bg-zinc-700\"\r\n :aria-label=\"cancelText\"\r\n :disabled=\"loading\"\r\n @click=\"close\"\r\n >\r\n <i class=\"pi pi-times text-lg\" aria-hidden=\"true\" />\r\n </button>\r\n\r\n <div class=\"flex flex-col items-center gap-2 pt-2\">\r\n <i\r\n :class=\"[icon, 'top-confirm-dialog__icon text-[40px]']\"\r\n aria-hidden=\"true\"\r\n />\r\n <p class=\"text-base font-bold text-secondary-900 dark:text-zinc-100\">\r\n {{ title }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"text-sm leading-5 text-secondary-700 dark:text-zinc-300\">\r\n <slot name=\"message\">\r\n <slot>{{ message }}</slot>\r\n </slot>\r\n </div>\r\n\r\n <div class=\"mt-2 flex w-full items-center justify-center gap-3\">\r\n <TopButton\r\n :label=\"cancelText\"\r\n secondary\r\n :disabled=\"loading\"\r\n class=\"px-3 py-2 text-sm\"\r\n @click=\"cancel\"\r\n />\r\n <TopButton\r\n :label=\"loading ? loadingText : confirmText\"\r\n :loading=\"loading\"\r\n :class=\"confirmButtonClass\"\r\n @click=\"confirm\"\r\n />\r\n </div>\r\n </div>\r\n </Dialog>\r\n</template>\r\n\r\n<style>\r\n.top-confirm-dialog {\r\n border-radius: 10px;\r\n box-shadow: 0 4px 4px rgb(0 0 0 / 25%);\r\n}\r\n\r\n.top-confirm-dialog__icon {\r\n color: var(--top-confirm-dialog-accent);\r\n}\r\n\r\n.top-confirm-dialog__confirm--danger {\r\n border-color: var(--top-confirm-dialog-accent) !important;\r\n background-color: var(--top-confirm-dialog-accent) !important;\r\n}\r\n\r\n.top-confirm-dialog__confirm--danger:hover {\r\n border-color: var(--top-confirm-dialog-accent-hover) !important;\r\n background-color: var(--top-confirm-dialog-accent-hover) !important;\r\n}\r\n\r\n.top-confirm-dialog__confirm--danger:focus {\r\n box-shadow: 0 0 0 0.2rem var(--top-confirm-dialog-accent) !important;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed } from \"vue\";\r\nimport Dialog from \"primevue/dialog\";\r\nimport { colors } from \"../tokens/colors\";\r\nimport TopButton from \"./TopButton.vue\";\r\n\r\ntype ConfirmDialogSeverity = \"primary\" | \"danger\";\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: boolean;\r\n title?: string;\r\n message?: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n loading?: boolean;\r\n loadingText?: string;\r\n severity?: ConfirmDialogSeverity;\r\n icon?: string;\r\n }>(),\r\n {\r\n modelValue: false,\r\n title: \"Confirmar\",\r\n message: \"\",\r\n confirmText: \"Confirmar\",\r\n cancelText: \"Cancelar\",\r\n loading: false,\r\n loadingText: \"Processando...\",\r\n severity: \"danger\",\r\n icon: \"pi pi-exclamation-triangle\",\r\n }\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:modelValue\": [value: boolean];\r\n confirm: [];\r\n cancel: [];\r\n close: [];\r\n}>();\r\n\r\nconst visibleProxy = computed({\r\n get: () => props.modelValue,\r\n set: (value: boolean) => {\r\n if (!value && props.loading) return;\r\n emit(\"update:modelValue\", value);\r\n },\r\n});\r\n\r\nconst accentStyle = computed<Record<string, string>>(() => ({\r\n \"--top-confirm-dialog-accent\":\r\n props.severity === \"danger\" ? colors.danger[600] : colors.primary[800],\r\n \"--top-confirm-dialog-accent-hover\":\r\n props.severity === \"danger\" ? colors.danger[700] : colors.primary[700],\r\n}));\r\n\r\nconst confirmButtonClass = computed(() =>\r\n [\r\n \"px-3 py-2 text-sm\",\r\n props.severity === \"danger\" ? \"!border-red-600 !bg-red-600 hover:!border-red-700 hover:!bg-red-700\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")\r\n);\r\n\r\nfunction confirm() {\r\n if (props.loading) return;\r\n emit(\"confirm\");\r\n}\r\n\r\nfunction cancel() {\r\n if (props.loading) return;\r\n emit(\"cancel\");\r\n visibleProxy.value = false;\r\n}\r\n\r\nfunction close() {\r\n if (props.loading) return;\r\n visibleProxy.value = false;\r\n}\r\n</script>\r\n\r\n<template>\r\n <Dialog\r\n v-model:visible=\"visibleProxy\"\r\n modal\r\n :closable=\"false\"\r\n :close-on-escape=\"!loading\"\r\n :dismissable-mask=\"false\"\r\n :draggable=\"false\"\r\n :show-header=\"false\"\r\n :style=\"{ width: '500px', maxWidth: 'calc(100vw - 2rem)' }\"\r\n :aria-label=\"title\"\r\n :pt=\"{\r\n root: { class: 'top-confirm-dialog top-solutions-component' },\r\n content: { class: 'p-6' },\r\n footer: { class: 'hidden' },\r\n }\"\r\n @hide=\"emit('close')\"\r\n >\r\n <div\r\n class=\"relative flex flex-col items-center gap-4 text-center\"\r\n :style=\"accentStyle\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"absolute right-[-0.25rem] top-[-0.5rem] flex size-8 items-center justify-center rounded-full border-0 bg-transparent p-0 text-secondary-700 outline-none transition-colors hover:bg-secondary-200 focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:text-zinc-200 dark:hover:bg-zinc-700\"\r\n :aria-label=\"cancelText\"\r\n :disabled=\"loading\"\r\n @click=\"close\"\r\n >\r\n <i class=\"pi pi-times text-lg\" aria-hidden=\"true\" />\r\n </button>\r\n\r\n <div class=\"flex flex-col items-center gap-2 pt-2\">\r\n <i\r\n :class=\"[icon, 'top-confirm-dialog__icon text-[40px]']\"\r\n aria-hidden=\"true\"\r\n />\r\n <p class=\"text-base font-bold text-secondary-900 dark:text-zinc-100\">\r\n {{ title }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"text-sm leading-5 text-secondary-700 dark:text-zinc-300\">\r\n <slot name=\"message\">\r\n <slot>{{ message }}</slot>\r\n </slot>\r\n </div>\r\n\r\n <div class=\"mt-2 flex w-full items-center justify-center gap-3\">\r\n <TopButton\r\n :label=\"cancelText\"\r\n secondary\r\n :disabled=\"loading\"\r\n class=\"px-3 py-2 text-sm\"\r\n @click=\"cancel\"\r\n />\r\n <TopButton\r\n :label=\"loading ? loadingText : confirmText\"\r\n :loading=\"loading\"\r\n :class=\"confirmButtonClass\"\r\n @click=\"confirm\"\r\n />\r\n </div>\r\n </div>\r\n </Dialog>\r\n</template>\r\n\r\n<style>\r\n.top-confirm-dialog {\r\n border-radius: 10px;\r\n box-shadow: 0 4px 4px rgb(0 0 0 / 25%);\r\n}\r\n\r\n.top-confirm-dialog__icon {\r\n color: var(--top-confirm-dialog-accent);\r\n}\r\n\r\n.top-confirm-dialog__confirm--danger {\r\n border-color: var(--top-confirm-dialog-accent) !important;\r\n background-color: var(--top-confirm-dialog-accent) !important;\r\n}\r\n\r\n.top-confirm-dialog__confirm--danger:hover {\r\n border-color: var(--top-confirm-dialog-accent-hover) !important;\r\n background-color: var(--top-confirm-dialog-accent-hover) !important;\r\n}\r\n\r\n.top-confirm-dialog__confirm--danger:focus {\r\n box-shadow: 0 0 0 0.2rem var(--top-confirm-dialog-accent) !important;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed, useAttrs, useId, useSlots } from 'vue'\r\nimport DatePicker from 'primevue/datepicker'\r\nimport type {\r\n DatePickerBlurEvent,\r\n DatePickerMonthChangeEvent,\r\n DatePickerYearChangeEvent,\r\n} from 'primevue/datepicker'\r\n\r\nexport type TopDatePickerSelectionMode = 'single' | 'multiple' | 'range'\r\nexport type TopDatePickerValue = Date | Date[] | Array<Date | null> | null\r\n\r\ndefineOptions({ inheritAttrs: false })\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: TopDatePickerValue\r\n label?: string\r\n placeholder?: string\r\n required?: boolean\r\n error?: string\r\n invalid?: boolean\r\n disabled?: boolean\r\n readonly?: boolean\r\n selectionMode?: TopDatePickerSelectionMode\r\n dateFormat?: string\r\n minDate?: Date\r\n maxDate?: Date\r\n showIcon?: boolean\r\n iconDisplay?: 'button' | 'input'\r\n manualInput?: boolean\r\n showButtonBar?: boolean\r\n appendTo?: 'body' | 'self' | HTMLElement\r\n }>(),\r\n {\r\n modelValue: null,\r\n label: '',\r\n placeholder: 'dd/mm/aaaa',\r\n required: false,\r\n error: '',\r\n invalid: false,\r\n disabled: false,\r\n readonly: false,\r\n selectionMode: 'single',\r\n dateFormat: 'dd/mm/yy',\r\n minDate: undefined,\r\n maxDate: undefined,\r\n showIcon: true,\r\n iconDisplay: 'input',\r\n manualInput: true,\r\n showButtonBar: false,\r\n appendTo: 'body',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TopDatePickerValue]\r\n input: [event: Event]\r\n change: [event: Event]\r\n 'date-select': [value: Date]\r\n show: []\r\n hide: []\r\n 'today-click': [date: Date]\r\n 'clear-click': [event: Event]\r\n 'month-change': [event: DatePickerMonthChangeEvent]\r\n 'year-change': [event: DatePickerYearChangeEvent]\r\n focus: [event: Event]\r\n blur: [event: DatePickerBlurEvent]\r\n keydown: [event: Event]\r\n}>()\r\n\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst generatedId = useId()\r\n\r\nconst inputId = computed(() =>\r\n attrs.id === undefined || attrs.id === null || attrs.id === ''\r\n ? generatedId\r\n : String(attrs.id),\r\n)\r\nconst errorId = computed(() => `${inputId.value}-error`)\r\nconst isInvalid = computed(() => props.invalid || Boolean(props.error))\r\nconst usesBrazilianDateMask = computed(() =>\r\n props.manualInput &&\r\n !props.readonly &&\r\n !props.disabled &&\r\n props.selectionMode === 'single' &&\r\n props.dateFormat === 'dd/mm/yy',\r\n)\r\nconst ariaInvalid = computed<\r\n boolean | 'true' | 'false' | 'grammar' | 'spelling' | undefined\r\n>(() => {\r\n if (isInvalid.value) return true\r\n\r\n const value = attrs['aria-invalid']\r\n return typeof value === 'boolean' ||\r\n value === 'true' ||\r\n value === 'false' ||\r\n value === 'grammar' ||\r\n value === 'spelling'\r\n ? value\r\n : undefined\r\n})\r\nconst describedBy = computed(() => {\r\n const externalDescription = attrs['aria-describedby']\r\n const ids = [\r\n typeof externalDescription === 'string' ? externalDescription : '',\r\n props.error ? errorId.value : '',\r\n ].filter(Boolean)\r\n\r\n return ids.length ? ids.join(' ') : undefined\r\n})\r\nconst forwardedAttrs = computed(() => {\r\n const {\r\n id: _id,\r\n 'aria-describedby': _ariaDescribedby,\r\n 'aria-invalid': _ariaInvalid,\r\n ...rest\r\n } = attrs\r\n\r\n return rest\r\n})\r\nconst datePickerPt = computed(() => ({\r\n pcInputText: {\r\n root: {\r\n 'aria-describedby': describedBy.value,\r\n 'aria-invalid': ariaInvalid.value,\r\n onChange: (event: Event) => emit('change', event),\r\n inputmode: usesBrazilianDateMask.value ? 'numeric' : undefined,\r\n maxlength: usesBrazilianDateMask.value ? 10 : undefined,\r\n },\r\n },\r\n}))\r\n\r\nfunction updateModelValue(value: TopDatePickerValue | undefined) {\r\n emit('update:modelValue', value ?? null)\r\n}\r\n\r\nfunction handleInput(event: Event) {\r\n const input = event.target\r\n\r\n if (usesBrazilianDateMask.value && input instanceof HTMLInputElement && !(event as InputEvent).isComposing) {\r\n const digits = input.value.replace(/\\D/g, '').slice(0, 8)\r\n const formatted = [digits.slice(0, 2), digits.slice(2, 4), digits.slice(4, 8)]\r\n .filter(Boolean)\r\n .join('/')\r\n\r\n input.value = formatted\r\n }\r\n\r\n emit('input', event)\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"top-date-picker top-solutions-component flex w-full flex-col gap-1\">\r\n <label\r\n v-if=\"label\"\r\n :for=\"inputId\"\r\n class=\"top-field-label text-xs font-bold\"\r\n >\r\n {{ label }}\r\n <span v-if=\"required\" aria-hidden=\"true\" class=\"text-red-600 dark:text-red-400\">*</span>\r\n </label>\r\n\r\n <DatePicker\r\n v-bind=\"forwardedAttrs\"\r\n :model-value=\"modelValue\"\r\n :input-id=\"inputId\"\r\n :placeholder=\"placeholder\"\r\n :required=\"required\"\r\n :invalid=\"isInvalid\"\r\n :disabled=\"disabled\"\r\n :readonly=\"readonly\"\r\n :selection-mode=\"selectionMode\"\r\n :date-format=\"dateFormat\"\r\n update-model-type=\"date\"\r\n :min-date=\"minDate\"\r\n :max-date=\"maxDate\"\r\n :show-icon=\"showIcon\"\r\n :icon-display=\"iconDisplay\"\r\n :manual-input=\"manualInput\"\r\n :show-button-bar=\"showButtonBar\"\r\n :append-to=\"appendTo\"\r\n :pt=\"datePickerPt\"\r\n input-class=\"top-date-picker__input top-field-control h-[40px] w-full rounded-[10px] border px-3 py-2 text-xs read-only:cursor-default disabled:cursor-not-allowed\"\r\n panel-class=\"top-date-picker-panel top-solutions-component\"\r\n fluid\r\n @update:model-value=\"updateModelValue\"\r\n @input=\"handleInput\"\r\n @date-select=\"emit('date-select', $event)\"\r\n @show=\"emit('show')\"\r\n @hide=\"emit('hide')\"\r\n @today-click=\"emit('today-click', $event)\"\r\n @clear-click=\"emit('clear-click', $event)\"\r\n @month-change=\"emit('month-change', $event)\"\r\n @year-change=\"emit('year-change', $event)\"\r\n @focus=\"emit('focus', $event)\"\r\n @blur=\"emit('blur', $event)\"\r\n @keydown=\"emit('keydown', $event)\"\r\n >\r\n <template v-for=\"(_, name) in slots\" #[name]=\"slotProps\">\r\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\r\n </template>\r\n </DatePicker>\r\n\r\n <span\r\n v-if=\"error\"\r\n :id=\"errorId\"\r\n class=\"text-[11px] text-red-600 dark:text-red-400\"\r\n role=\"alert\"\r\n >\r\n {{ error }}\r\n </span>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.top-date-picker .p-datepicker {\r\n width: 100%;\r\n}\r\n\r\n.top-date-picker .p-datepicker-input-icon-container {\r\n color: var(--top-field-icon);\r\n}\r\n\r\n.top-date-picker-panel {\r\n border-radius: 10px;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed, useAttrs, useId, useSlots } from 'vue'\r\nimport DatePicker from 'primevue/datepicker'\r\nimport type {\r\n DatePickerBlurEvent,\r\n DatePickerMonthChangeEvent,\r\n DatePickerYearChangeEvent,\r\n} from 'primevue/datepicker'\r\n\r\nexport type TopDatePickerSelectionMode = 'single' | 'multiple' | 'range'\r\nexport type TopDatePickerValue = Date | Date[] | Array<Date | null> | null\r\n\r\ndefineOptions({ inheritAttrs: false })\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: TopDatePickerValue\r\n label?: string\r\n placeholder?: string\r\n required?: boolean\r\n error?: string\r\n invalid?: boolean\r\n disabled?: boolean\r\n readonly?: boolean\r\n selectionMode?: TopDatePickerSelectionMode\r\n dateFormat?: string\r\n minDate?: Date\r\n maxDate?: Date\r\n showIcon?: boolean\r\n iconDisplay?: 'button' | 'input'\r\n manualInput?: boolean\r\n showButtonBar?: boolean\r\n appendTo?: 'body' | 'self' | HTMLElement\r\n }>(),\r\n {\r\n modelValue: null,\r\n label: '',\r\n placeholder: 'dd/mm/aaaa',\r\n required: false,\r\n error: '',\r\n invalid: false,\r\n disabled: false,\r\n readonly: false,\r\n selectionMode: 'single',\r\n dateFormat: 'dd/mm/yy',\r\n minDate: undefined,\r\n maxDate: undefined,\r\n showIcon: true,\r\n iconDisplay: 'input',\r\n manualInput: true,\r\n showButtonBar: false,\r\n appendTo: 'body',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TopDatePickerValue]\r\n input: [event: Event]\r\n change: [event: Event]\r\n 'date-select': [value: Date]\r\n show: []\r\n hide: []\r\n 'today-click': [date: Date]\r\n 'clear-click': [event: Event]\r\n 'month-change': [event: DatePickerMonthChangeEvent]\r\n 'year-change': [event: DatePickerYearChangeEvent]\r\n focus: [event: Event]\r\n blur: [event: DatePickerBlurEvent]\r\n keydown: [event: Event]\r\n}>()\r\n\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst generatedId = useId()\r\n\r\nconst inputId = computed(() =>\r\n attrs.id === undefined || attrs.id === null || attrs.id === ''\r\n ? generatedId\r\n : String(attrs.id),\r\n)\r\nconst errorId = computed(() => `${inputId.value}-error`)\r\nconst isInvalid = computed(() => props.invalid || Boolean(props.error))\r\nconst usesBrazilianDateMask = computed(() =>\r\n props.manualInput &&\r\n !props.readonly &&\r\n !props.disabled &&\r\n props.selectionMode === 'single' &&\r\n props.dateFormat === 'dd/mm/yy',\r\n)\r\nconst ariaInvalid = computed<\r\n boolean | 'true' | 'false' | 'grammar' | 'spelling' | undefined\r\n>(() => {\r\n if (isInvalid.value) return true\r\n\r\n const value = attrs['aria-invalid']\r\n return typeof value === 'boolean' ||\r\n value === 'true' ||\r\n value === 'false' ||\r\n value === 'grammar' ||\r\n value === 'spelling'\r\n ? value\r\n : undefined\r\n})\r\nconst describedBy = computed(() => {\r\n const externalDescription = attrs['aria-describedby']\r\n const ids = [\r\n typeof externalDescription === 'string' ? externalDescription : '',\r\n props.error ? errorId.value : '',\r\n ].filter(Boolean)\r\n\r\n return ids.length ? ids.join(' ') : undefined\r\n})\r\nconst forwardedAttrs = computed(() => {\r\n const {\r\n id: _id,\r\n 'aria-describedby': _ariaDescribedby,\r\n 'aria-invalid': _ariaInvalid,\r\n ...rest\r\n } = attrs\r\n\r\n return rest\r\n})\r\nconst datePickerPt = computed(() => ({\r\n pcInputText: {\r\n root: {\r\n 'aria-describedby': describedBy.value,\r\n 'aria-invalid': ariaInvalid.value,\r\n onChange: (event: Event) => emit('change', event),\r\n inputmode: usesBrazilianDateMask.value ? 'numeric' : undefined,\r\n maxlength: usesBrazilianDateMask.value ? 10 : undefined,\r\n },\r\n },\r\n}))\r\n\r\nfunction updateModelValue(value: TopDatePickerValue | undefined) {\r\n emit('update:modelValue', value ?? null)\r\n}\r\n\r\nfunction handleInput(event: Event) {\r\n const input = event.target\r\n\r\n if (usesBrazilianDateMask.value && input instanceof HTMLInputElement && !(event as InputEvent).isComposing) {\r\n const digits = input.value.replace(/\\D/g, '').slice(0, 8)\r\n const formatted = [digits.slice(0, 2), digits.slice(2, 4), digits.slice(4, 8)]\r\n .filter(Boolean)\r\n .join('/')\r\n\r\n input.value = formatted\r\n }\r\n\r\n emit('input', event)\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"top-date-picker top-solutions-component flex w-full flex-col gap-1\">\r\n <label\r\n v-if=\"label\"\r\n :for=\"inputId\"\r\n class=\"top-field-label text-xs font-bold\"\r\n >\r\n {{ label }}\r\n <span v-if=\"required\" aria-hidden=\"true\" class=\"text-red-600 dark:text-red-400\">*</span>\r\n </label>\r\n\r\n <DatePicker\r\n v-bind=\"forwardedAttrs\"\r\n :model-value=\"modelValue\"\r\n :input-id=\"inputId\"\r\n :placeholder=\"placeholder\"\r\n :required=\"required\"\r\n :invalid=\"isInvalid\"\r\n :disabled=\"disabled\"\r\n :readonly=\"readonly\"\r\n :selection-mode=\"selectionMode\"\r\n :date-format=\"dateFormat\"\r\n update-model-type=\"date\"\r\n :min-date=\"minDate\"\r\n :max-date=\"maxDate\"\r\n :show-icon=\"showIcon\"\r\n :icon-display=\"iconDisplay\"\r\n :manual-input=\"manualInput\"\r\n :show-button-bar=\"showButtonBar\"\r\n :append-to=\"appendTo\"\r\n :pt=\"datePickerPt\"\r\n input-class=\"top-date-picker__input top-field-control h-[40px] w-full rounded-[10px] border px-3 py-2 text-xs read-only:cursor-default disabled:cursor-not-allowed\"\r\n panel-class=\"top-date-picker-panel top-solutions-component\"\r\n fluid\r\n @update:model-value=\"updateModelValue\"\r\n @input=\"handleInput\"\r\n @date-select=\"emit('date-select', $event)\"\r\n @show=\"emit('show')\"\r\n @hide=\"emit('hide')\"\r\n @today-click=\"emit('today-click', $event)\"\r\n @clear-click=\"emit('clear-click', $event)\"\r\n @month-change=\"emit('month-change', $event)\"\r\n @year-change=\"emit('year-change', $event)\"\r\n @focus=\"emit('focus', $event)\"\r\n @blur=\"emit('blur', $event)\"\r\n @keydown=\"emit('keydown', $event)\"\r\n >\r\n <template v-for=\"(_, name) in slots\" #[name]=\"slotProps\">\r\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\r\n </template>\r\n </DatePicker>\r\n\r\n <span\r\n v-if=\"error\"\r\n :id=\"errorId\"\r\n class=\"text-[11px] text-red-600 dark:text-red-400\"\r\n role=\"alert\"\r\n >\r\n {{ error }}\r\n </span>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.top-date-picker .p-datepicker {\r\n width: 100%;\r\n}\r\n\r\n.top-date-picker .p-datepicker-input-icon-container {\r\n color: var(--top-field-icon);\r\n}\r\n\r\n.top-date-picker-panel {\r\n border-radius: 10px;\r\n}\r\n</style>\r\n","\nconst CloudUploadIcon = [\n [\"path\", { d: \"M17.4776 9.01106C17.485 9.01102 17.4925 9.01101 17.5 9.01101C19.9853 9.01101 22 11.0294 22 13.5193C22 15.8398 20.25 17.7508 18 18M17.4776 9.01106C17.4924 8.84606 17.5 8.67896 17.5 8.51009C17.5 5.46695 15.0376 3 12 3C9.12324 3 6.76233 5.21267 6.52042 8.03192M17.4776 9.01106C17.3753 10.1476 16.9286 11.1846 16.2428 12.0165M6.52042 8.03192C3.98398 8.27373 2 10.4139 2 13.0183C2 15.4417 3.71776 17.4632 6 17.9273M6.52042 8.03192C6.67826 8.01687 6.83823 8.00917 7 8.00917C8.12582 8.00917 9.16474 8.38194 10.0005 9.01101\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\", strokeWidth: \"1.5\", key: \"0\" }],\n [\"path\", { d: \"M12 13L12 21M12 13C11.2998 13 9.99153 14.9943 9.5 15.5M12 13C12.7002 13 14.0085 14.9943 14.5 15.5\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\", strokeWidth: \"1.5\", key: \"1\" }]\n];\n\nexport default CloudUploadIcon;\n","\nconst Home07Icon = [\n [\"path\", { d: \"M12.8924 2.80982L21.4876 9.59547C21.8112 9.85095 22 10.2405 22 10.6528C22 11.3969 21.3969 12 20.6528 12H20V15.5C20 18.3284 20 19.7426 19.1213 20.6213C18.2426 21.5 16.8284 21.5 14 21.5H10C7.17157 21.5 5.75736 21.5 4.87868 20.6213C4 19.7426 4 18.3284 4 15.5V12H3.34716C2.60315 12 2 11.3969 2 10.6528C2 10.2405 2.1888 9.85095 2.5124 9.59547L11.1076 2.80982C11.3617 2.60915 11.6761 2.5 12 2.5C12.3239 2.5 12.6383 2.60915 12.8924 2.80982Z\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\", strokeWidth: \"1.5\", key: \"0\" }],\n [\"path\", { d: \"M14.5 21.5V17C14.5 16.0654 14.5 15.5981 14.299 15.25C14.1674 15.022 13.978 14.8326 13.75 14.701C13.4019 14.5 12.9346 14.5 12 14.5C11.0654 14.5 10.5981 14.5 10.25 14.701C10.022 14.8326 9.83261 15.022 9.70096 15.25C9.5 15.5981 9.5 16.0654 9.5 17V21.5\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\", strokeWidth: \"1.5\", key: \"1\" }]\n];\n\nexport default Home07Icon;\n","import { defineComponent, computed } from 'vue';\n\nvar _sfc_main = defineComponent({\n name: 'HugeiconsIcon',\n inheritAttrs: false,\n props: {\n icon: {\n type: Array ,\n required: true\n },\n size: {\n type: [Number, String],\n default: 24,\n validator(value) {\n const size = typeof value === 'string' ? parseInt(value, 10) : value;\n return !isNaN(size) && size > 0;\n }\n },\n strokeWidth: {\n type: Number,\n default: undefined\n },\n absoluteStrokeWidth: {\n type: Boolean,\n default: false\n },\n altIcon: {\n type: Array ,\n default: undefined\n },\n showAlt: {\n type: Boolean,\n default: false\n },\n color: {\n type: String,\n default: 'currentColor'\n }\n },\n setup(props) {\n const computedSize = computed(() => {\n const size = typeof props.size === 'string' ? parseInt(props.size, 10) : props.size;\n return !isNaN(size) && size > 0 ? size : 24;\n });\n\n const calculatedStrokeWidth = computed(() => {\n if (props.strokeWidth === undefined) return undefined;\n return props.absoluteStrokeWidth \n ? (props.strokeWidth * 24) / computedSize.value \n : props.strokeWidth;\n });\n\n const currentIcon = computed(() => {\n return props.altIcon && props.showAlt ? props.altIcon : props.icon;\n });\n\n const transformAttrs = (attrs, strokeWidth) => {\n const result = {};\n for (const [key, value] of Object.entries(attrs)) {\n const kebabKey = key.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n result[kebabKey] = value;\n }\n\n // Add stroke properties to child elements if strokeWidth is defined\n if (strokeWidth !== undefined) {\n result['stroke-width'] = strokeWidth;\n result['stroke'] = 'currentColor';\n }\n\n return result;\n };\n\n return {\n computedSize,\n calculatedStrokeWidth,\n transformAttrs,\n currentIcon\n };\n }\n});\n\nexport { _sfc_main as default };\n//# sourceMappingURL=HugeiconsIcon.vue2.js.map\n","var _export_sfc = (sfc, props) => {\n const target = sfc.__vccOpts || sfc;\n for (const [key, val] of props) {\n target[key] = val;\n }\n return target;\n};\n\nexport { _export_sfc as default };\n//# sourceMappingURL=_plugin-vue_export-helper.js.map\n","import _sfc_main from './HugeiconsIcon.vue2.js';\nimport { openBlock, createElementBlock, mergeProps, Fragment, renderList, createBlock, resolveDynamicComponent } from 'vue';\nimport _export_sfc from '../_virtual/_plugin-vue_export-helper.js';\n\nconst _hoisted_1 = [\"width\", \"height\", \"color\"];\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", mergeProps({\n width: _ctx.computedSize,\n height: _ctx.computedSize,\n viewBox: `0 0 24 24`,\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n color: _ctx.color\n }, _ctx.$attrs), [\n (openBlock(true), createElementBlock(\n Fragment,\n null,\n renderList(_ctx.currentIcon, (element, index) => {\n return openBlock(), createBlock(\n resolveDynamicComponent(element[0]),\n mergeProps({\n key: index,\n ref_for: true\n }, _ctx.transformAttrs(element[1], _ctx.calculatedStrokeWidth)),\n null,\n 16\n /* FULL_PROPS */\n );\n }),\n 128\n /* KEYED_FRAGMENT */\n ))\n ], 16, _hoisted_1);\n}\nvar HugeiconsIcon = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render], [\"__file\", \"/Users/mahmudulhasan/Desktop/Projects/Hugeicons/hugeicons-monorepo/packages/vue/src/components/HugeiconsIcon.vue\"]]);\n\nexport { HugeiconsIcon as default };\n//# sourceMappingURL=HugeiconsIcon.vue.js.map\n","<script setup lang=\"ts\">\r\nimport {\r\n computed,\r\n nextTick,\r\n onBeforeUnmount,\r\n onMounted,\r\n ref,\r\n useAttrs,\r\n useId,\r\n watch,\r\n} from \"vue\";\r\nimport FileUpload from \"primevue/fileupload\";\nimport type { FileUploadSelectEvent } from \"primevue/fileupload\";\nimport { CloudUploadIcon } from \"@hugeicons/core-free-icons\";\nimport { HugeiconsIcon } from \"@hugeicons/vue\";\nimport TopButton from \"./TopButton.vue\";\n\r\nexport type TopFileUploadValue = File | File[] | null;\r\n\r\nexport type TopFileUploadErrorCode = \"file-type\" | \"file-size\" | \"file-limit\";\r\n\r\nexport type TopFileUploadError = {\r\n code: TopFileUploadErrorCode;\r\n message: string;\r\n file?: File;\r\n};\r\n\r\ntype FileUploadInstance = {\r\n choose: () => void;\r\n files: File[];\r\n};\r\n\r\ndefineOptions({ inheritAttrs: false });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: TopFileUploadValue;\r\n label?: string;\r\n placeholder?: string;\r\n required?: boolean;\r\n disabled?: boolean;\r\n accept?: string;\r\n multiple?: boolean;\r\n maxFileSize?: number | null;\r\n maxFiles?: number | null;\r\n error?: string;\r\n selectLabel?: string;\r\n removeLabel?: string;\r\n loading?: boolean;\r\n }>(),\r\n {\r\n modelValue: null,\r\n label: \"\",\r\n placeholder: \"Arraste e solte o arquivo aqui\",\r\n required: false,\r\n disabled: false,\r\n accept: \"\",\r\n multiple: false,\r\n maxFileSize: null,\r\n maxFiles: null,\r\n error: \"\",\r\n selectLabel: \"Selecionar arquivo\",\r\n removeLabel: \"Remover\",\r\n loading: false,\r\n }\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:modelValue\": [value: TopFileUploadValue];\r\n select: [files: File[]];\r\n change: [value: TopFileUploadValue];\r\n remove: [file: File, index: number];\r\n clear: [];\r\n error: [errors: TopFileUploadError[]];\r\n}>();\r\n\r\nconst attrs = useAttrs();\r\nconst generatedId = useId();\r\nconst fileUploadRef = ref<FileUploadInstance | null>(null);\r\nconst internalFiles = ref<File[]>(normalizeValue(props.modelValue));\r\nconst validationErrors = ref<TopFileUploadError[]>([]);\r\nconst previewUrls = new Map<File, string>();\r\n\r\nconst inputId = computed(() =>\r\n attrs.id === undefined || attrs.id === null || attrs.id === \"\"\r\n ? generatedId\r\n : String(attrs.id)\r\n);\r\nconst errorId = computed(() => `${inputId.value}-error`);\r\nconst effectiveError = computed(\r\n () => props.error || validationErrors.value[0]?.message || \"\"\r\n);\r\nconst isInteractionDisabled = computed(() => props.disabled || props.loading);\r\nconst describedBy = computed(() => {\r\n const externalDescription = attrs[\"aria-describedby\"];\r\n const ids = [\r\n typeof externalDescription === \"string\" ? externalDescription : \"\",\r\n effectiveError.value ? errorId.value : \"\",\r\n ].filter(Boolean);\r\n\r\n return ids.length ? ids.join(\" \") : undefined;\r\n});\r\nconst inputAttrs = computed(() => ({\r\n ...attrs,\r\n id: inputId.value,\r\n required: props.required,\r\n \"aria-invalid\": effectiveError.value ? true : attrs[\"aria-invalid\"],\r\n \"aria-describedby\": describedBy.value,\r\n \"aria-label\":\r\n attrs[\"aria-label\"] || (!props.label ? props.selectLabel : undefined),\r\n}));\r\n\r\nfunction normalizeValue(value: TopFileUploadValue | undefined) {\r\n if (!value) return [];\r\n if (Array.isArray(value))\r\n return props.multiple ? [...value] : value.slice(0, 1);\r\n return [value];\r\n}\r\n\r\nfunction sameFile(left: File, right: File) {\r\n return (\r\n left.name === right.name &&\r\n left.type === right.type &&\r\n left.size === right.size\r\n );\r\n}\r\n\r\nfunction fileTypeIsAccepted(file: File) {\r\n if (!props.accept.trim()) return true;\r\n\r\n return props.accept.split(\",\").some((acceptedType) => {\r\n const accepted = acceptedType.trim().toLowerCase();\r\n const fileType = file.type.toLowerCase();\r\n\r\n if (!accepted) return false;\r\n if (accepted.startsWith(\".\"))\r\n return file.name.toLowerCase().endsWith(accepted);\r\n if (accepted.endsWith(\"/*\"))\r\n return fileType.startsWith(accepted.slice(0, -1));\r\n return fileType === accepted;\r\n });\r\n}\r\n\r\nfunction formatFileSize(size: number) {\r\n if (size < 1024) return `${size} B`;\r\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`;\r\n return `${(size / (1024 * 1024)).toFixed(2)} MB`;\r\n}\r\n\r\nfunction validateFiles(files: File[]) {\r\n const errors: TopFileUploadError[] = [];\r\n const validFiles = files.filter((file) => {\r\n if (!fileTypeIsAccepted(file)) {\r\n errors.push({\r\n code: \"file-type\",\r\n file,\r\n message: `O arquivo \"${file.name}\" não possui um tipo aceito.`,\r\n });\r\n return false;\r\n }\r\n\r\n if (props.maxFileSize && file.size > props.maxFileSize) {\r\n errors.push({\r\n code: \"file-size\",\r\n file,\r\n message: `O arquivo \"${\r\n file.name\r\n }\" excede o tamanho máximo de ${formatFileSize(props.maxFileSize)}.`,\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n\r\n return { errors, validFiles };\r\n}\r\n\r\nfunction selectedFilesFrom(event: FileUploadSelectEvent) {\r\n const originalEvent = event.originalEvent as Event & {\r\n dataTransfer?: DataTransfer;\r\n target: (EventTarget & { files?: FileList }) | null;\r\n };\r\n return Array.from(\r\n originalEvent.dataTransfer?.files ?? originalEvent.target?.files ?? []\r\n );\r\n}\r\n\r\nfunction valueFrom(files: File[]): TopFileUploadValue {\r\n return props.multiple ? [...files] : files[0] ?? null;\r\n}\r\n\r\nfunction syncPrimeVueFiles() {\r\n if (fileUploadRef.value) fileUploadRef.value.files = [...internalFiles.value];\r\n}\r\n\r\nfunction updateFiles(files: File[], eventName: \"select\" | \"remove\" | \"clear\") {\r\n internalFiles.value = files;\r\n validationErrors.value = [];\r\n cleanUnusedPreviewUrls();\r\n nextTick(syncPrimeVueFiles);\r\n\r\n const value = valueFrom(files);\r\n emit(\"update:modelValue\", value);\r\n emit(\"change\", value);\r\n\r\n if (eventName === \"select\") emit(\"select\", [...files]);\r\n if (eventName === \"clear\") emit(\"clear\");\r\n}\r\n\r\nfunction onSelect(event: FileUploadSelectEvent) {\r\n const selected = selectedFilesFrom(event);\r\n const { errors, validFiles } = validateFiles(selected);\r\n let nextFiles = props.multiple\r\n ? [\r\n ...internalFiles.value,\r\n ...validFiles.filter(\r\n (file) =>\r\n !internalFiles.value.some((current) => sameFile(current, file))\r\n ),\r\n ]\r\n : validFiles.slice(-1);\r\n\r\n if (props.maxFiles && nextFiles.length > props.maxFiles) {\r\n const rejectedFiles = nextFiles.slice(props.maxFiles);\r\n errors.push(\r\n ...rejectedFiles.map((file) => ({\r\n code: \"file-limit\" as const,\r\n file,\r\n message: `O limite máximo é de ${props.maxFiles} arquivo(s).`,\r\n }))\r\n );\r\n nextFiles = nextFiles.slice(0, props.maxFiles);\r\n }\r\n\r\n if (errors.length) {\r\n validationErrors.value = errors;\r\n emit(\"error\", errors);\r\n } else {\r\n validationErrors.value = [];\r\n }\r\n\r\n syncPrimeVueFiles();\r\n if (validFiles.length && !sameFileList(nextFiles, internalFiles.value)) {\r\n internalFiles.value = nextFiles;\r\n cleanUnusedPreviewUrls();\r\n nextTick(syncPrimeVueFiles);\r\n const value = valueFrom(nextFiles);\r\n emit(\"update:modelValue\", value);\r\n emit(\"change\", value);\r\n emit(\"select\", [...nextFiles]);\r\n }\r\n}\r\n\r\nfunction sameFileList(left: File[], right: File[]) {\r\n return (\r\n left.length === right.length &&\r\n left.every((file, index) => sameFile(file, right[index]))\r\n );\r\n}\r\n\r\nfunction choose() {\r\n if (!isInteractionDisabled.value) fileUploadRef.value?.choose();\r\n}\r\n\r\nfunction removeFile(\r\n removeFileCallback: (index: number) => void,\r\n index: number\r\n) {\r\n if (isInteractionDisabled.value) return;\r\n const removedFile = internalFiles.value[index];\r\n if (!removedFile) return;\r\n\r\n removeFileCallback(index);\r\n const nextFiles = internalFiles.value.filter(\r\n (_, fileIndex) => fileIndex !== index\r\n );\r\n updateFiles(nextFiles, \"remove\");\r\n emit(\"remove\", removedFile, index);\r\n if (!nextFiles.length) emit(\"clear\");\r\n}\r\n\r\nfunction clear() {\r\n if (isInteractionDisabled.value || !internalFiles.value.length) return;\r\n updateFiles([], \"clear\");\r\n}\r\n\r\nfunction previewUrl(file: File) {\r\n if (\r\n !file.type.startsWith(\"image/\") ||\r\n typeof URL.createObjectURL !== \"function\"\r\n )\r\n return \"\";\r\n const currentUrl = previewUrls.get(file);\r\n if (currentUrl) return currentUrl;\r\n\r\n const url = URL.createObjectURL(file);\r\n previewUrls.set(file, url);\r\n return url;\r\n}\r\n\r\nfunction cleanUnusedPreviewUrls() {\r\n for (const [file, url] of previewUrls) {\r\n if (!internalFiles.value.includes(file)) {\r\n URL.revokeObjectURL(url);\r\n previewUrls.delete(file);\r\n }\r\n }\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (value) => {\r\n const nextFiles = normalizeValue(value);\r\n if (sameFileList(nextFiles, internalFiles.value)) return;\r\n internalFiles.value = nextFiles;\r\n validationErrors.value = [];\r\n cleanUnusedPreviewUrls();\r\n nextTick(syncPrimeVueFiles);\r\n }\r\n);\r\n\r\nwatch(\r\n () => props.multiple,\r\n () => {\r\n const nextFiles = normalizeValue(props.modelValue);\r\n internalFiles.value = nextFiles;\r\n cleanUnusedPreviewUrls();\r\n nextTick(syncPrimeVueFiles);\r\n }\r\n);\r\n\r\nonMounted(syncPrimeVueFiles);\r\n\r\nonBeforeUnmount(() => {\r\n for (const url of previewUrls.values()) URL.revokeObjectURL(url);\r\n previewUrls.clear();\r\n});\r\n\r\ndefineExpose({ choose, clear });\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"top-file-upload top-solutions-component flex w-full flex-col gap-1\"\r\n >\r\n <label\r\n v-if=\"label\"\r\n :for=\"inputId\"\r\n class=\"text-xs font-bold text-secondary-800 dark:text-zinc-200\"\r\n >\r\n {{ label }}\r\n <span\r\n v-if=\"required\"\r\n aria-hidden=\"true\"\r\n class=\"text-red-600 dark:text-red-400\"\r\n >*</span\r\n >\r\n </label>\r\n\r\n <FileUpload\r\n ref=\"fileUploadRef\"\r\n mode=\"advanced\"\r\n :accept=\"accept || undefined\"\r\n :multiple=\"multiple\"\r\n :disabled=\"isInteractionDisabled\"\r\n :custom-upload=\"true\"\r\n :show-upload-button=\"false\"\r\n :show-cancel-button=\"false\"\r\n :pt=\"{\r\n root: { class: 'top-file-upload__root w-full' },\r\n header: { class: 'hidden' },\r\n input: inputAttrs,\r\n content: {\r\n class: [\r\n 'top-file-upload__dropzone min-h-[224px] rounded-[10px] border p-4 transition-colors',\r\n effectiveError\r\n ? 'border-red-600 bg-red-50 dark:border-red-400 dark:bg-red-950/20'\r\n : 'border-secondary-300 bg-white hover:border-primary-600 hover:bg-primary-50 dark:border-zinc-600 dark:bg-zinc-800 dark:hover:border-primary-400 dark:hover:bg-zinc-700',\r\n isInteractionDisabled ? 'cursor-not-allowed opacity-60' : '',\r\n ].join(' '),\r\n },\r\n }\"\r\n @select=\"onSelect\"\r\n >\r\n <template #content=\"{ removeFileCallback }\">\r\n <div\r\n class=\"flex min-h-[130px] w-full flex-col items-center justify-center gap-3\"\r\n >\r\n <slot\r\n v-if=\"!internalFiles.length\"\r\n name=\"empty\"\r\n :choose=\"choose\"\r\n :disabled=\"isInteractionDisabled\"\r\n >\r\n <span class=\"top-file-upload__empty-icon\" aria-hidden=\"true\">\r\n <i\r\n v-if=\"loading\"\r\n :aria-label=\"`Carregando...`\"\r\n class=\"pi pi-spin pi-spinner text-5xl\"\r\n />\r\n <HugeiconsIcon\n v-else\n :icon=\"CloudUploadIcon\"\n :size=\"72\"\n :stroke-width=\"1.5\"\n class=\"text-primary-800 dark:text-primary-300\"\n />\n </span>\r\n <p\r\n class=\"m-0 text-center text-xs text-secondary-600 dark:text-zinc-300\"\r\n >\r\n {{ placeholder }}\r\n </p>\r\n <TopButton\r\n :label=\"selectLabel\"\r\n icon=\"pi pi-plus-circle\"\r\n :disabled=\"disabled\"\r\n :loading=\"loading\"\r\n class=\"px-3 py-2 text-xs\"\r\n @click=\"choose\"\r\n />\r\n </slot>\r\n\r\n <div v-else class=\"flex w-full flex-col gap-2\">\r\n <div\r\n v-for=\"(file, index) in internalFiles\"\r\n :key=\"`${file.name}-${file.size}-${file.lastModified}`\"\r\n class=\"flex min-w-0 items-center gap-3 rounded-[10px] border border-secondary-300 bg-white p-3 dark:border-zinc-600 dark:bg-zinc-900\"\r\n >\r\n <slot\r\n name=\"preview\"\r\n :file=\"file\"\r\n :index=\"index\"\r\n :url=\"previewUrl(file)\"\r\n >\r\n <img\r\n v-if=\"previewUrl(file)\"\r\n :src=\"previewUrl(file)\"\r\n :alt=\"`Pré-visualização de ${file.name}`\"\r\n class=\"size-12 shrink-0 rounded-lg object-cover\"\r\n />\r\n <span\r\n v-else\r\n class=\"flex size-12 shrink-0 items-center justify-center rounded-lg bg-primary-50 text-primary-800 dark:bg-primary-950 dark:text-primary-200\"\r\n >\r\n <i class=\"pi pi-file text-2xl\" aria-hidden=\"true\" />\r\n </span>\r\n </slot>\r\n\r\n <div class=\"min-w-0 flex-1\">\r\n <p\r\n class=\"m-0 truncate text-xs font-bold text-secondary-900 dark:text-zinc-100\"\r\n >\r\n {{ file.name }}\r\n </p>\r\n <span class=\"text-[11px] text-secondary-500 dark:text-zinc-400\">\r\n {{ formatFileSize(file.size) }}\r\n </span>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"flex size-8 shrink-0 items-center justify-center rounded-full border-0 bg-transparent p-0 text-red-600 transition-colors hover:bg-red-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:text-red-400 dark:hover:bg-red-950/40 dark:focus-visible:ring-offset-zinc-900\"\r\n :aria-label=\"`${removeLabel}: ${file.name}`\"\r\n :disabled=\"isInteractionDisabled\"\r\n @click=\"removeFile(removeFileCallback, index)\"\r\n >\r\n <i class=\"pi pi-times\" aria-hidden=\"true\" />\r\n </button>\r\n </div>\r\n\r\n <TopButton\r\n v-if=\"multiple && (!maxFiles || internalFiles.length < maxFiles)\"\r\n :label=\"selectLabel\"\r\n icon=\"pi pi-plus-circle\"\r\n outlined\r\n :disabled=\"disabled\"\r\n :loading=\"loading\"\r\n class=\"mt-1 px-3 py-2 text-xs\"\r\n @click=\"choose\"\r\n />\r\n </div>\r\n </div>\r\n </template>\r\n </FileUpload>\r\n\r\n <span\r\n v-if=\"effectiveError\"\r\n :id=\"errorId\"\r\n class=\"text-[11px] text-red-600 dark:text-red-400\"\r\n role=\"alert\"\r\n >\r\n {{ effectiveError }}\r\n </span>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.top-file-upload__root,\r\n.top-file-upload__dropzone {\r\n width: 100%;\r\n}\r\n\r\n.top-file-upload__root {\r\n border: 0;\r\n background: transparent;\r\n}\r\n\r\n.top-file-upload__empty-icon {\r\n display: inline-flex;\r\n width: 6rem;\r\n height: 6rem;\r\n align-items: center;\r\n justify-content: center;\r\n border: 1px solid var(--top-secondary-300);\r\n border-radius: 9999px;\r\n color: var(--top-primary-800);\r\n}\r\n\r\n.dark .top-file-upload__empty-icon {\r\n border-color: var(--top-secondary-600);\r\n color: var(--top-primary-300);\r\n}\r\n\r\n.top-file-upload__dropzone[data-p-highlight=\"true\"] {\r\n border-color: var(--top-primary-600) !important;\r\n background: var(--top-primary-100) !important;\r\n}\r\n\r\n.dark .top-file-upload__dropzone[data-p-highlight=\"true\"] {\r\n border-color: var(--top-primary-400) !important;\r\n background: var(--top-primary-950) !important;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport {\r\n computed,\r\n nextTick,\r\n onBeforeUnmount,\r\n onMounted,\r\n ref,\r\n useAttrs,\r\n useId,\r\n watch,\r\n} from \"vue\";\r\nimport FileUpload from \"primevue/fileupload\";\nimport type { FileUploadSelectEvent } from \"primevue/fileupload\";\nimport { CloudUploadIcon } from \"@hugeicons/core-free-icons\";\nimport { HugeiconsIcon } from \"@hugeicons/vue\";\nimport TopButton from \"./TopButton.vue\";\n\r\nexport type TopFileUploadValue = File | File[] | null;\r\n\r\nexport type TopFileUploadErrorCode = \"file-type\" | \"file-size\" | \"file-limit\";\r\n\r\nexport type TopFileUploadError = {\r\n code: TopFileUploadErrorCode;\r\n message: string;\r\n file?: File;\r\n};\r\n\r\ntype FileUploadInstance = {\r\n choose: () => void;\r\n files: File[];\r\n};\r\n\r\ndefineOptions({ inheritAttrs: false });\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: TopFileUploadValue;\r\n label?: string;\r\n placeholder?: string;\r\n required?: boolean;\r\n disabled?: boolean;\r\n accept?: string;\r\n multiple?: boolean;\r\n maxFileSize?: number | null;\r\n maxFiles?: number | null;\r\n error?: string;\r\n selectLabel?: string;\r\n removeLabel?: string;\r\n loading?: boolean;\r\n }>(),\r\n {\r\n modelValue: null,\r\n label: \"\",\r\n placeholder: \"Arraste e solte o arquivo aqui\",\r\n required: false,\r\n disabled: false,\r\n accept: \"\",\r\n multiple: false,\r\n maxFileSize: null,\r\n maxFiles: null,\r\n error: \"\",\r\n selectLabel: \"Selecionar arquivo\",\r\n removeLabel: \"Remover\",\r\n loading: false,\r\n }\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:modelValue\": [value: TopFileUploadValue];\r\n select: [files: File[]];\r\n change: [value: TopFileUploadValue];\r\n remove: [file: File, index: number];\r\n clear: [];\r\n error: [errors: TopFileUploadError[]];\r\n}>();\r\n\r\nconst attrs = useAttrs();\r\nconst generatedId = useId();\r\nconst fileUploadRef = ref<FileUploadInstance | null>(null);\r\nconst internalFiles = ref<File[]>(normalizeValue(props.modelValue));\r\nconst validationErrors = ref<TopFileUploadError[]>([]);\r\nconst previewUrls = new Map<File, string>();\r\n\r\nconst inputId = computed(() =>\r\n attrs.id === undefined || attrs.id === null || attrs.id === \"\"\r\n ? generatedId\r\n : String(attrs.id)\r\n);\r\nconst errorId = computed(() => `${inputId.value}-error`);\r\nconst effectiveError = computed(\r\n () => props.error || validationErrors.value[0]?.message || \"\"\r\n);\r\nconst isInteractionDisabled = computed(() => props.disabled || props.loading);\r\nconst describedBy = computed(() => {\r\n const externalDescription = attrs[\"aria-describedby\"];\r\n const ids = [\r\n typeof externalDescription === \"string\" ? externalDescription : \"\",\r\n effectiveError.value ? errorId.value : \"\",\r\n ].filter(Boolean);\r\n\r\n return ids.length ? ids.join(\" \") : undefined;\r\n});\r\nconst inputAttrs = computed(() => ({\r\n ...attrs,\r\n id: inputId.value,\r\n required: props.required,\r\n \"aria-invalid\": effectiveError.value ? true : attrs[\"aria-invalid\"],\r\n \"aria-describedby\": describedBy.value,\r\n \"aria-label\":\r\n attrs[\"aria-label\"] || (!props.label ? props.selectLabel : undefined),\r\n}));\r\n\r\nfunction normalizeValue(value: TopFileUploadValue | undefined) {\r\n if (!value) return [];\r\n if (Array.isArray(value))\r\n return props.multiple ? [...value] : value.slice(0, 1);\r\n return [value];\r\n}\r\n\r\nfunction sameFile(left: File, right: File) {\r\n return (\r\n left.name === right.name &&\r\n left.type === right.type &&\r\n left.size === right.size\r\n );\r\n}\r\n\r\nfunction fileTypeIsAccepted(file: File) {\r\n if (!props.accept.trim()) return true;\r\n\r\n return props.accept.split(\",\").some((acceptedType) => {\r\n const accepted = acceptedType.trim().toLowerCase();\r\n const fileType = file.type.toLowerCase();\r\n\r\n if (!accepted) return false;\r\n if (accepted.startsWith(\".\"))\r\n return file.name.toLowerCase().endsWith(accepted);\r\n if (accepted.endsWith(\"/*\"))\r\n return fileType.startsWith(accepted.slice(0, -1));\r\n return fileType === accepted;\r\n });\r\n}\r\n\r\nfunction formatFileSize(size: number) {\r\n if (size < 1024) return `${size} B`;\r\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`;\r\n return `${(size / (1024 * 1024)).toFixed(2)} MB`;\r\n}\r\n\r\nfunction validateFiles(files: File[]) {\r\n const errors: TopFileUploadError[] = [];\r\n const validFiles = files.filter((file) => {\r\n if (!fileTypeIsAccepted(file)) {\r\n errors.push({\r\n code: \"file-type\",\r\n file,\r\n message: `O arquivo \"${file.name}\" não possui um tipo aceito.`,\r\n });\r\n return false;\r\n }\r\n\r\n if (props.maxFileSize && file.size > props.maxFileSize) {\r\n errors.push({\r\n code: \"file-size\",\r\n file,\r\n message: `O arquivo \"${\r\n file.name\r\n }\" excede o tamanho máximo de ${formatFileSize(props.maxFileSize)}.`,\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n\r\n return { errors, validFiles };\r\n}\r\n\r\nfunction selectedFilesFrom(event: FileUploadSelectEvent) {\r\n const originalEvent = event.originalEvent as Event & {\r\n dataTransfer?: DataTransfer;\r\n target: (EventTarget & { files?: FileList }) | null;\r\n };\r\n return Array.from(\r\n originalEvent.dataTransfer?.files ?? originalEvent.target?.files ?? []\r\n );\r\n}\r\n\r\nfunction valueFrom(files: File[]): TopFileUploadValue {\r\n return props.multiple ? [...files] : files[0] ?? null;\r\n}\r\n\r\nfunction syncPrimeVueFiles() {\r\n if (fileUploadRef.value) fileUploadRef.value.files = [...internalFiles.value];\r\n}\r\n\r\nfunction updateFiles(files: File[], eventName: \"select\" | \"remove\" | \"clear\") {\r\n internalFiles.value = files;\r\n validationErrors.value = [];\r\n cleanUnusedPreviewUrls();\r\n nextTick(syncPrimeVueFiles);\r\n\r\n const value = valueFrom(files);\r\n emit(\"update:modelValue\", value);\r\n emit(\"change\", value);\r\n\r\n if (eventName === \"select\") emit(\"select\", [...files]);\r\n if (eventName === \"clear\") emit(\"clear\");\r\n}\r\n\r\nfunction onSelect(event: FileUploadSelectEvent) {\r\n const selected = selectedFilesFrom(event);\r\n const { errors, validFiles } = validateFiles(selected);\r\n let nextFiles = props.multiple\r\n ? [\r\n ...internalFiles.value,\r\n ...validFiles.filter(\r\n (file) =>\r\n !internalFiles.value.some((current) => sameFile(current, file))\r\n ),\r\n ]\r\n : validFiles.slice(-1);\r\n\r\n if (props.maxFiles && nextFiles.length > props.maxFiles) {\r\n const rejectedFiles = nextFiles.slice(props.maxFiles);\r\n errors.push(\r\n ...rejectedFiles.map((file) => ({\r\n code: \"file-limit\" as const,\r\n file,\r\n message: `O limite máximo é de ${props.maxFiles} arquivo(s).`,\r\n }))\r\n );\r\n nextFiles = nextFiles.slice(0, props.maxFiles);\r\n }\r\n\r\n if (errors.length) {\r\n validationErrors.value = errors;\r\n emit(\"error\", errors);\r\n } else {\r\n validationErrors.value = [];\r\n }\r\n\r\n syncPrimeVueFiles();\r\n if (validFiles.length && !sameFileList(nextFiles, internalFiles.value)) {\r\n internalFiles.value = nextFiles;\r\n cleanUnusedPreviewUrls();\r\n nextTick(syncPrimeVueFiles);\r\n const value = valueFrom(nextFiles);\r\n emit(\"update:modelValue\", value);\r\n emit(\"change\", value);\r\n emit(\"select\", [...nextFiles]);\r\n }\r\n}\r\n\r\nfunction sameFileList(left: File[], right: File[]) {\r\n return (\r\n left.length === right.length &&\r\n left.every((file, index) => sameFile(file, right[index]))\r\n );\r\n}\r\n\r\nfunction choose() {\r\n if (!isInteractionDisabled.value) fileUploadRef.value?.choose();\r\n}\r\n\r\nfunction removeFile(\r\n removeFileCallback: (index: number) => void,\r\n index: number\r\n) {\r\n if (isInteractionDisabled.value) return;\r\n const removedFile = internalFiles.value[index];\r\n if (!removedFile) return;\r\n\r\n removeFileCallback(index);\r\n const nextFiles = internalFiles.value.filter(\r\n (_, fileIndex) => fileIndex !== index\r\n );\r\n updateFiles(nextFiles, \"remove\");\r\n emit(\"remove\", removedFile, index);\r\n if (!nextFiles.length) emit(\"clear\");\r\n}\r\n\r\nfunction clear() {\r\n if (isInteractionDisabled.value || !internalFiles.value.length) return;\r\n updateFiles([], \"clear\");\r\n}\r\n\r\nfunction previewUrl(file: File) {\r\n if (\r\n !file.type.startsWith(\"image/\") ||\r\n typeof URL.createObjectURL !== \"function\"\r\n )\r\n return \"\";\r\n const currentUrl = previewUrls.get(file);\r\n if (currentUrl) return currentUrl;\r\n\r\n const url = URL.createObjectURL(file);\r\n previewUrls.set(file, url);\r\n return url;\r\n}\r\n\r\nfunction cleanUnusedPreviewUrls() {\r\n for (const [file, url] of previewUrls) {\r\n if (!internalFiles.value.includes(file)) {\r\n URL.revokeObjectURL(url);\r\n previewUrls.delete(file);\r\n }\r\n }\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (value) => {\r\n const nextFiles = normalizeValue(value);\r\n if (sameFileList(nextFiles, internalFiles.value)) return;\r\n internalFiles.value = nextFiles;\r\n validationErrors.value = [];\r\n cleanUnusedPreviewUrls();\r\n nextTick(syncPrimeVueFiles);\r\n }\r\n);\r\n\r\nwatch(\r\n () => props.multiple,\r\n () => {\r\n const nextFiles = normalizeValue(props.modelValue);\r\n internalFiles.value = nextFiles;\r\n cleanUnusedPreviewUrls();\r\n nextTick(syncPrimeVueFiles);\r\n }\r\n);\r\n\r\nonMounted(syncPrimeVueFiles);\r\n\r\nonBeforeUnmount(() => {\r\n for (const url of previewUrls.values()) URL.revokeObjectURL(url);\r\n previewUrls.clear();\r\n});\r\n\r\ndefineExpose({ choose, clear });\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"top-file-upload top-solutions-component flex w-full flex-col gap-1\"\r\n >\r\n <label\r\n v-if=\"label\"\r\n :for=\"inputId\"\r\n class=\"text-xs font-bold text-secondary-800 dark:text-zinc-200\"\r\n >\r\n {{ label }}\r\n <span\r\n v-if=\"required\"\r\n aria-hidden=\"true\"\r\n class=\"text-red-600 dark:text-red-400\"\r\n >*</span\r\n >\r\n </label>\r\n\r\n <FileUpload\r\n ref=\"fileUploadRef\"\r\n mode=\"advanced\"\r\n :accept=\"accept || undefined\"\r\n :multiple=\"multiple\"\r\n :disabled=\"isInteractionDisabled\"\r\n :custom-upload=\"true\"\r\n :show-upload-button=\"false\"\r\n :show-cancel-button=\"false\"\r\n :pt=\"{\r\n root: { class: 'top-file-upload__root w-full' },\r\n header: { class: 'hidden' },\r\n input: inputAttrs,\r\n content: {\r\n class: [\r\n 'top-file-upload__dropzone min-h-[224px] rounded-[10px] border p-4 transition-colors',\r\n effectiveError\r\n ? 'border-red-600 bg-red-50 dark:border-red-400 dark:bg-red-950/20'\r\n : 'border-secondary-300 bg-white hover:border-primary-600 hover:bg-primary-50 dark:border-zinc-600 dark:bg-zinc-800 dark:hover:border-primary-400 dark:hover:bg-zinc-700',\r\n isInteractionDisabled ? 'cursor-not-allowed opacity-60' : '',\r\n ].join(' '),\r\n },\r\n }\"\r\n @select=\"onSelect\"\r\n >\r\n <template #content=\"{ removeFileCallback }\">\r\n <div\r\n class=\"flex min-h-[130px] w-full flex-col items-center justify-center gap-3\"\r\n >\r\n <slot\r\n v-if=\"!internalFiles.length\"\r\n name=\"empty\"\r\n :choose=\"choose\"\r\n :disabled=\"isInteractionDisabled\"\r\n >\r\n <span class=\"top-file-upload__empty-icon\" aria-hidden=\"true\">\r\n <i\r\n v-if=\"loading\"\r\n :aria-label=\"`Carregando...`\"\r\n class=\"pi pi-spin pi-spinner text-5xl\"\r\n />\r\n <HugeiconsIcon\n v-else\n :icon=\"CloudUploadIcon\"\n :size=\"72\"\n :stroke-width=\"1.5\"\n class=\"text-primary-800 dark:text-primary-300\"\n />\n </span>\r\n <p\r\n class=\"m-0 text-center text-xs text-secondary-600 dark:text-zinc-300\"\r\n >\r\n {{ placeholder }}\r\n </p>\r\n <TopButton\r\n :label=\"selectLabel\"\r\n icon=\"pi pi-plus-circle\"\r\n :disabled=\"disabled\"\r\n :loading=\"loading\"\r\n class=\"px-3 py-2 text-xs\"\r\n @click=\"choose\"\r\n />\r\n </slot>\r\n\r\n <div v-else class=\"flex w-full flex-col gap-2\">\r\n <div\r\n v-for=\"(file, index) in internalFiles\"\r\n :key=\"`${file.name}-${file.size}-${file.lastModified}`\"\r\n class=\"flex min-w-0 items-center gap-3 rounded-[10px] border border-secondary-300 bg-white p-3 dark:border-zinc-600 dark:bg-zinc-900\"\r\n >\r\n <slot\r\n name=\"preview\"\r\n :file=\"file\"\r\n :index=\"index\"\r\n :url=\"previewUrl(file)\"\r\n >\r\n <img\r\n v-if=\"previewUrl(file)\"\r\n :src=\"previewUrl(file)\"\r\n :alt=\"`Pré-visualização de ${file.name}`\"\r\n class=\"size-12 shrink-0 rounded-lg object-cover\"\r\n />\r\n <span\r\n v-else\r\n class=\"flex size-12 shrink-0 items-center justify-center rounded-lg bg-primary-50 text-primary-800 dark:bg-primary-950 dark:text-primary-200\"\r\n >\r\n <i class=\"pi pi-file text-2xl\" aria-hidden=\"true\" />\r\n </span>\r\n </slot>\r\n\r\n <div class=\"min-w-0 flex-1\">\r\n <p\r\n class=\"m-0 truncate text-xs font-bold text-secondary-900 dark:text-zinc-100\"\r\n >\r\n {{ file.name }}\r\n </p>\r\n <span class=\"text-[11px] text-secondary-500 dark:text-zinc-400\">\r\n {{ formatFileSize(file.size) }}\r\n </span>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"flex size-8 shrink-0 items-center justify-center rounded-full border-0 bg-transparent p-0 text-red-600 transition-colors hover:bg-red-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:text-red-400 dark:hover:bg-red-950/40 dark:focus-visible:ring-offset-zinc-900\"\r\n :aria-label=\"`${removeLabel}: ${file.name}`\"\r\n :disabled=\"isInteractionDisabled\"\r\n @click=\"removeFile(removeFileCallback, index)\"\r\n >\r\n <i class=\"pi pi-times\" aria-hidden=\"true\" />\r\n </button>\r\n </div>\r\n\r\n <TopButton\r\n v-if=\"multiple && (!maxFiles || internalFiles.length < maxFiles)\"\r\n :label=\"selectLabel\"\r\n icon=\"pi pi-plus-circle\"\r\n outlined\r\n :disabled=\"disabled\"\r\n :loading=\"loading\"\r\n class=\"mt-1 px-3 py-2 text-xs\"\r\n @click=\"choose\"\r\n />\r\n </div>\r\n </div>\r\n </template>\r\n </FileUpload>\r\n\r\n <span\r\n v-if=\"effectiveError\"\r\n :id=\"errorId\"\r\n class=\"text-[11px] text-red-600 dark:text-red-400\"\r\n role=\"alert\"\r\n >\r\n {{ effectiveError }}\r\n </span>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.top-file-upload__root,\r\n.top-file-upload__dropzone {\r\n width: 100%;\r\n}\r\n\r\n.top-file-upload__root {\r\n border: 0;\r\n background: transparent;\r\n}\r\n\r\n.top-file-upload__empty-icon {\r\n display: inline-flex;\r\n width: 6rem;\r\n height: 6rem;\r\n align-items: center;\r\n justify-content: center;\r\n border: 1px solid var(--top-secondary-300);\r\n border-radius: 9999px;\r\n color: var(--top-primary-800);\r\n}\r\n\r\n.dark .top-file-upload__empty-icon {\r\n border-color: var(--top-secondary-600);\r\n color: var(--top-primary-300);\r\n}\r\n\r\n.top-file-upload__dropzone[data-p-highlight=\"true\"] {\r\n border-color: var(--top-primary-600) !important;\r\n background: var(--top-primary-100) !important;\r\n}\r\n\r\n.dark .top-file-upload__dropzone[data-p-highlight=\"true\"] {\r\n border-color: var(--top-primary-400) !important;\r\n background: var(--top-primary-950) !important;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed, useAttrs, useId } from 'vue'\r\nimport InputText from 'primevue/inputtext'\r\n\r\ndefineOptions({ inheritAttrs: false })\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: string\r\n label?: string\r\n placeholder?: string\r\n required?: boolean\r\n error?: string\r\n disabled?: boolean\r\n readonly?: boolean\r\n }>(),\r\n {\r\n modelValue: '',\r\n label: '',\r\n placeholder: '',\r\n required: false,\r\n error: '',\r\n disabled: false,\r\n readonly: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string]\r\n}>()\r\n\r\nconst attrs = useAttrs()\r\nconst generatedId = useId()\r\n\r\nconst inputId = computed(() =>\r\n attrs.id === undefined || attrs.id === null || attrs.id === ''\r\n ? generatedId\r\n : String(attrs.id),\r\n)\r\nconst errorId = computed(() => `${inputId.value}-error`)\r\nconst ariaInvalid = computed<\r\n boolean | 'true' | 'false' | 'grammar' | 'spelling' | undefined\r\n>(() => {\r\n if (props.error) return true\r\n\r\n const value = attrs['aria-invalid']\r\n return typeof value === 'boolean' ||\r\n value === 'true' ||\r\n value === 'false' ||\r\n value === 'grammar' ||\r\n value === 'spelling'\r\n ? value\r\n : undefined\r\n})\r\nconst describedBy = computed(() => {\r\n const externalDescription = attrs['aria-describedby']\r\n const ids = [\r\n typeof externalDescription === 'string' ? externalDescription : '',\r\n props.error ? errorId.value : '',\r\n ].filter(Boolean)\r\n\r\n return ids.length ? ids.join(' ') : undefined\r\n})\r\n\r\nfunction updateModelValue(value: string | undefined) {\r\n emit('update:modelValue', value ?? '')\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"top-input-text top-solutions-component flex w-full flex-col gap-1\">\r\n <label\r\n v-if=\"label\"\r\n :for=\"inputId\"\r\n class=\"top-field-label text-xs font-bold\"\r\n >\r\n {{ label }}\r\n <span v-if=\"required\" aria-hidden=\"true\" class=\"text-red-600 dark:text-red-400\">*</span>\r\n </label>\r\n\r\n <InputText\r\n v-bind=\"$attrs\"\r\n :id=\"inputId\"\r\n :model-value=\"modelValue\"\r\n type=\"text\"\r\n :placeholder=\"placeholder\"\r\n :required=\"required\"\r\n :disabled=\"disabled\"\r\n :readonly=\"readonly\"\r\n :invalid=\"Boolean(error)\"\r\n :aria-invalid=\"ariaInvalid\"\r\n :aria-describedby=\"describedBy\"\r\n fluid\r\n class=\"top-input-text__control top-field-control h-[40px] w-full rounded-[10px] border px-3 py-2 text-xs read-only:cursor-default disabled:cursor-not-allowed\"\r\n @update:model-value=\"updateModelValue\"\r\n />\r\n\r\n <span\r\n v-if=\"error\"\r\n :id=\"errorId\"\r\n class=\"text-[11px] text-red-600 dark:text-red-400\"\r\n role=\"alert\"\r\n >\r\n {{ error }}\r\n </span>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed, useAttrs, useId } from 'vue'\r\nimport InputText from 'primevue/inputtext'\r\n\r\ndefineOptions({ inheritAttrs: false })\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: string\r\n label?: string\r\n placeholder?: string\r\n required?: boolean\r\n error?: string\r\n disabled?: boolean\r\n readonly?: boolean\r\n }>(),\r\n {\r\n modelValue: '',\r\n label: '',\r\n placeholder: '',\r\n required: false,\r\n error: '',\r\n disabled: false,\r\n readonly: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string]\r\n}>()\r\n\r\nconst attrs = useAttrs()\r\nconst generatedId = useId()\r\n\r\nconst inputId = computed(() =>\r\n attrs.id === undefined || attrs.id === null || attrs.id === ''\r\n ? generatedId\r\n : String(attrs.id),\r\n)\r\nconst errorId = computed(() => `${inputId.value}-error`)\r\nconst ariaInvalid = computed<\r\n boolean | 'true' | 'false' | 'grammar' | 'spelling' | undefined\r\n>(() => {\r\n if (props.error) return true\r\n\r\n const value = attrs['aria-invalid']\r\n return typeof value === 'boolean' ||\r\n value === 'true' ||\r\n value === 'false' ||\r\n value === 'grammar' ||\r\n value === 'spelling'\r\n ? value\r\n : undefined\r\n})\r\nconst describedBy = computed(() => {\r\n const externalDescription = attrs['aria-describedby']\r\n const ids = [\r\n typeof externalDescription === 'string' ? externalDescription : '',\r\n props.error ? errorId.value : '',\r\n ].filter(Boolean)\r\n\r\n return ids.length ? ids.join(' ') : undefined\r\n})\r\n\r\nfunction updateModelValue(value: string | undefined) {\r\n emit('update:modelValue', value ?? '')\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"top-input-text top-solutions-component flex w-full flex-col gap-1\">\r\n <label\r\n v-if=\"label\"\r\n :for=\"inputId\"\r\n class=\"top-field-label text-xs font-bold\"\r\n >\r\n {{ label }}\r\n <span v-if=\"required\" aria-hidden=\"true\" class=\"text-red-600 dark:text-red-400\">*</span>\r\n </label>\r\n\r\n <InputText\r\n v-bind=\"$attrs\"\r\n :id=\"inputId\"\r\n :model-value=\"modelValue\"\r\n type=\"text\"\r\n :placeholder=\"placeholder\"\r\n :required=\"required\"\r\n :disabled=\"disabled\"\r\n :readonly=\"readonly\"\r\n :invalid=\"Boolean(error)\"\r\n :aria-invalid=\"ariaInvalid\"\r\n :aria-describedby=\"describedBy\"\r\n fluid\r\n class=\"top-input-text__control top-field-control h-[40px] w-full rounded-[10px] border px-3 py-2 text-xs read-only:cursor-default disabled:cursor-not-allowed\"\r\n @update:model-value=\"updateModelValue\"\r\n />\r\n\r\n <span\r\n v-if=\"error\"\r\n :id=\"errorId\"\r\n class=\"text-[11px] text-red-600 dark:text-red-400\"\r\n role=\"alert\"\r\n >\r\n {{ error }}\r\n </span>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\nimport type { TopNavItem } from '../TopNavBar.vue'\r\n\r\ndefineOptions({ name: 'TopNavMobileTree' })\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n items: TopNavItem[]\r\n activeItemId?: string\r\n level?: number\r\n forceOpen?: boolean\r\n showSectionDividers?: boolean\r\n }>(),\r\n {\r\n activeItemId: '',\r\n level: 0,\r\n forceOpen: false,\r\n showSectionDividers: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n select: [item: TopNavItem]\r\n}>()\r\n\r\nconst openIds = ref<Set<string>>(new Set())\r\n\r\nfunction childrenOf(item: TopNavItem) {\r\n return item.children?.filter(Boolean) ?? []\r\n}\r\n\r\nfunction containsActive(item: TopNavItem): boolean {\r\n if (item.id === props.activeItemId) return true\r\n return childrenOf(item).some(containsActive)\r\n}\r\n\r\nfunction isOpen(item: TopNavItem) {\r\n return props.forceOpen || openIds.value.has(item.id)\r\n}\r\n\r\nfunction toggle(item: TopNavItem) {\r\n if (item.disabled) return\r\n const children = childrenOf(item)\r\n if (!children.length) {\r\n emit('select', item)\r\n return\r\n }\r\n\r\n const next = new Set(openIds.value)\r\n if (next.has(item.id)) next.delete(item.id)\r\n else next.add(item.id)\r\n openIds.value = next\r\n}\r\n\r\nwatch(\r\n () => [props.activeItemId, props.items] as const,\r\n () => {\r\n const next = new Set(openIds.value)\r\n props.items.forEach((item) => {\r\n if (childrenOf(item).length && containsActive(item)) next.add(item.id)\r\n })\r\n openIds.value = next\r\n },\r\n { immediate: true, deep: true },\r\n)\r\n\r\nconst levelStyle = computed(() =>\r\n props.level > 0 ? { '--top-nav-tree-level': String(props.level) } : undefined,\r\n)\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"top-nav-bar__mobile-tree\"\r\n :class=\"{\r\n 'top-nav-bar__mobile-tree--nested': level > 0,\r\n 'top-nav-bar__mobile-tree--sections': showSectionDividers && level === 0,\r\n }\"\r\n :style=\"levelStyle\"\r\n >\r\n <div\r\n v-for=\"(item, index) in items\"\r\n :key=\"item.id\"\r\n class=\"top-nav-bar__mobile-node\"\r\n :class=\"{ 'top-nav-bar__mobile-node--section': showSectionDividers && level === 0 && index > 0 }\"\r\n >\r\n <button\r\n class=\"top-nav-bar__mobile-item\"\r\n :class=\"{\r\n 'top-nav-bar__mobile-item--active': item.id === activeItemId,\r\n 'top-nav-bar__mobile-item--ancestor': item.id !== activeItemId && containsActive(item),\r\n }\"\r\n type=\"button\"\r\n :disabled=\"item.disabled\"\r\n :aria-expanded=\"childrenOf(item).length ? isOpen(item) : undefined\"\r\n @click=\"toggle(item)\"\r\n >\r\n <i v-if=\"item.icon\" :class=\"item.icon\" aria-hidden=\"true\" />\r\n <span class=\"top-nav-bar__mobile-item-label\">{{ item.label }}</span>\r\n <span\r\n v-if=\"childrenOf(item).length\"\r\n class=\"top-nav-bar__mobile-count\"\r\n aria-hidden=\"true\"\r\n >{{ childrenOf(item).length }}</span>\r\n <i\r\n v-if=\"childrenOf(item).length\"\r\n class=\"pi pi-chevron-down top-nav-bar__mobile-chevron\"\r\n :class=\"{ 'top-nav-bar__mobile-chevron--open': isOpen(item) }\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n\r\n <Transition name=\"top-nav-bar-menu-expand\">\r\n <TopNavMobileTree\r\n v-if=\"childrenOf(item).length && isOpen(item)\"\r\n :items=\"childrenOf(item)\"\r\n :active-item-id=\"activeItemId\"\r\n :level=\"level + 1\"\r\n :force-open=\"forceOpen\"\r\n @select=\"emit('select', $event)\"\r\n />\r\n </Transition>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\nimport type { TopNavItem } from '../TopNavBar.vue'\r\n\r\ndefineOptions({ name: 'TopNavMobileTree' })\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n items: TopNavItem[]\r\n activeItemId?: string\r\n level?: number\r\n forceOpen?: boolean\r\n showSectionDividers?: boolean\r\n }>(),\r\n {\r\n activeItemId: '',\r\n level: 0,\r\n forceOpen: false,\r\n showSectionDividers: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n select: [item: TopNavItem]\r\n}>()\r\n\r\nconst openIds = ref<Set<string>>(new Set())\r\n\r\nfunction childrenOf(item: TopNavItem) {\r\n return item.children?.filter(Boolean) ?? []\r\n}\r\n\r\nfunction containsActive(item: TopNavItem): boolean {\r\n if (item.id === props.activeItemId) return true\r\n return childrenOf(item).some(containsActive)\r\n}\r\n\r\nfunction isOpen(item: TopNavItem) {\r\n return props.forceOpen || openIds.value.has(item.id)\r\n}\r\n\r\nfunction toggle(item: TopNavItem) {\r\n if (item.disabled) return\r\n const children = childrenOf(item)\r\n if (!children.length) {\r\n emit('select', item)\r\n return\r\n }\r\n\r\n const next = new Set(openIds.value)\r\n if (next.has(item.id)) next.delete(item.id)\r\n else next.add(item.id)\r\n openIds.value = next\r\n}\r\n\r\nwatch(\r\n () => [props.activeItemId, props.items] as const,\r\n () => {\r\n const next = new Set(openIds.value)\r\n props.items.forEach((item) => {\r\n if (childrenOf(item).length && containsActive(item)) next.add(item.id)\r\n })\r\n openIds.value = next\r\n },\r\n { immediate: true, deep: true },\r\n)\r\n\r\nconst levelStyle = computed(() =>\r\n props.level > 0 ? { '--top-nav-tree-level': String(props.level) } : undefined,\r\n)\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"top-nav-bar__mobile-tree\"\r\n :class=\"{\r\n 'top-nav-bar__mobile-tree--nested': level > 0,\r\n 'top-nav-bar__mobile-tree--sections': showSectionDividers && level === 0,\r\n }\"\r\n :style=\"levelStyle\"\r\n >\r\n <div\r\n v-for=\"(item, index) in items\"\r\n :key=\"item.id\"\r\n class=\"top-nav-bar__mobile-node\"\r\n :class=\"{ 'top-nav-bar__mobile-node--section': showSectionDividers && level === 0 && index > 0 }\"\r\n >\r\n <button\r\n class=\"top-nav-bar__mobile-item\"\r\n :class=\"{\r\n 'top-nav-bar__mobile-item--active': item.id === activeItemId,\r\n 'top-nav-bar__mobile-item--ancestor': item.id !== activeItemId && containsActive(item),\r\n }\"\r\n type=\"button\"\r\n :disabled=\"item.disabled\"\r\n :aria-expanded=\"childrenOf(item).length ? isOpen(item) : undefined\"\r\n @click=\"toggle(item)\"\r\n >\r\n <i v-if=\"item.icon\" :class=\"item.icon\" aria-hidden=\"true\" />\r\n <span class=\"top-nav-bar__mobile-item-label\">{{ item.label }}</span>\r\n <span\r\n v-if=\"childrenOf(item).length\"\r\n class=\"top-nav-bar__mobile-count\"\r\n aria-hidden=\"true\"\r\n >{{ childrenOf(item).length }}</span>\r\n <i\r\n v-if=\"childrenOf(item).length\"\r\n class=\"pi pi-chevron-down top-nav-bar__mobile-chevron\"\r\n :class=\"{ 'top-nav-bar__mobile-chevron--open': isOpen(item) }\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n\r\n <Transition name=\"top-nav-bar-menu-expand\">\r\n <TopNavMobileTree\r\n v-if=\"childrenOf(item).length && isOpen(item)\"\r\n :items=\"childrenOf(item)\"\r\n :active-item-id=\"activeItemId\"\r\n :level=\"level + 1\"\r\n :force-open=\"forceOpen\"\r\n @select=\"emit('select', $event)\"\r\n />\r\n </Transition>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { Home07Icon } from '@hugeicons/core-free-icons'\r\nimport { HugeiconsIcon } from '@hugeicons/vue'\r\nimport Drawer from 'primevue/drawer'\r\nimport Menu from 'primevue/menu'\r\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useSlots, watch } from 'vue'\r\nimport TopNavMobileTree from './internal/TopNavMobileTree.vue'\r\n\r\nexport type TopNavItem = {\r\n id: string\r\n label: string\r\n to?: string\r\n icon?: string\r\n disabled?: boolean\r\n children?: TopNavItem[]\r\n data?: unknown\r\n}\r\n\r\nexport type TopNavSection = TopNavItem & { children: TopNavItem[] }\r\n\r\nexport type TopNavBreadcrumb = {\r\n id: string\r\n label: string\r\n to?: string\r\n sectionId?: string\r\n menuId?: string\r\n}\r\n\r\nexport type TopNavAction = {\r\n id: string\r\n label: string\r\n icon?: string\r\n disabled?: boolean\r\n data?: unknown\r\n}\r\n\r\nexport type TopNavBarColors = {\n navigation?: string\n text?: string\n mutedText?: string\n accent?: string\n border?: string\n menuText?: string\n mobileActiveText?: string\n favoritesText?: string\n}\n\nexport type TopNavBarSurfaces = {\n breadcrumb?: string\n drawer?: string\n drawerFooter?: string\n menu?: string\n menuHover?: string\n menuExplored?: string\n mobileActive?: string\n favorites?: string\n currentPage?: string\n}\n\nexport type TopNavBarBorders = {\n menu?: string\n menuOutline?: string\n mobileDivider?: string\n favorites?: string\n currentPage?: string\n}\n\nexport type TopNavBarShape = {\n radius?: string\n drawerRadius?: string\n shadow?: string\n favoritesShadow?: string\n}\n\nexport type TopNavBarFocus = {\n onDark?: string\n onLight?: string\n}\n\nexport type TopNavBarAppearance = {\n colors?: TopNavBarColors\n surfaces?: TopNavBarSurfaces\n borders?: TopNavBarBorders\n shape?: TopNavBarShape\n focus?: TopNavBarFocus\n}\n\r\nexport type TopNavUser = {\r\n name: string\r\n subtitle?: string\r\n avatarUrl?: string\r\n initials?: string\r\n data?: unknown\r\n}\r\n\r\nexport type TopNavUserMenuItem = {\r\n id: string\r\n label: string\r\n icon?: string\r\n disabled?: boolean\r\n separator?: boolean\r\n data?: unknown\r\n}\r\n\r\ntype CompactState = {\r\n collapseActions: boolean\r\n searchIconOnly: boolean\r\n hideUserName: boolean\r\n hideContextDetails: boolean\r\n}\r\n\r\ntype RenderAction = TopNavAction & { kind: 'aia' | 'support' | 'action' }\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n sections?: TopNavSection[]\r\n breadcrumbs?: TopNavBreadcrumb[]\r\n homeItem?: TopNavItem\r\n navigationLabel?: string\r\n activeItemId?: string\r\n searchable?: boolean\r\n searchValue?: string\r\n searchPlaceholder?: string\r\n searchResults?: TopNavItem[]\r\n showAia?: boolean\r\n aiaActive?: boolean\r\n aiaLabel?: string\r\n showSupport?: boolean\r\n supportLabel?: string\r\n actions?: TopNavAction[]\r\n user?: TopNavUser\r\n userMenuItems?: TopNavUserMenuItem[]\r\n favoriteItems?: TopNavItem[]\r\n showFavoriteToggle?: boolean\r\n favoriteActive?: boolean\r\n favoriteLabel?: string\r\n mobileOpen?: boolean\r\n appearance?: TopNavBarAppearance\r\n }>(),\r\n {\r\n sections: () => [],\r\n breadcrumbs: () => [],\r\n homeItem: () => ({ id: 'home', label: 'Início', to: '/' }),\r\n navigationLabel: 'Navegação',\r\n activeItemId: '',\r\n searchable: false,\r\n searchValue: undefined,\r\n searchPlaceholder: 'Pesquisar no menu...',\r\n searchResults: undefined,\r\n showAia: false,\r\n aiaActive: false,\r\n aiaLabel: 'Aia',\r\n showSupport: false,\r\n supportLabel: 'Central de Suporte',\r\n actions: () => [],\r\n user: undefined,\r\n userMenuItems: () => [],\r\n favoriteItems: () => [],\r\n showFavoriteToggle: false,\r\n favoriteActive: false,\r\n favoriteLabel: 'Favoritos',\r\n mobileOpen: undefined,\r\n appearance: () => ({}),\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n navigate: [item: TopNavItem]\r\n search: [query: string]\r\n 'update:searchValue': [query: string]\r\n 'update:mobileOpen': [open: boolean]\r\n 'toggle-aia': []\r\n 'open-support': []\r\n 'toggle-favorite': []\r\n action: [action: TopNavAction]\r\n 'user-action': [item: TopNavUserMenuItem]\r\n 'user-click': [user: TopNavUser | undefined]\r\n}>()\r\n\r\nconst slots = useSlots()\r\nconst rootRef = ref<HTMLElement | null>(null)\nconst headerRef = ref<HTMLElement | null>(null)\nconst favoritesMeasureContainerRef = ref<HTMLElement | null>(null)\nconst favoritesMeasureContentRef = ref<HTMLElement | null>(null)\nconst searchInputRef = ref<HTMLInputElement | null>(null)\r\nconst mobileSearchInputRef = ref<HTMLInputElement | null>(null)\r\nconst mobileMenuOpen = ref(props.mobileOpen ?? false)\r\nconst navigationMenuOpen = ref(false)\r\nconst navigationSectionOpenId = ref<string | null>(null)\r\nconst navigationPath = ref<string[]>([])\r\nconst breadcrumbMenuOpenId = ref<string | null>(null)\r\nconst breadcrumbPath = ref<string[]>([])\r\nconst compactActionsOpen = ref(false)\r\nconst userMenuOpen = ref(false)\r\nconst drawerUserOpen = ref(false)\r\nconst drawerUserMenuRef = ref<{ toggle: (event: Event) => void; hide: () => void } | null>(null)\r\nconst favoritesMenuOpen = ref(false)\nconst drawerFavoritesOpen = ref(false)\nconst pageScrolled = ref(false)\nconst favoritesFitInline = ref(true)\nconst favoritesAnimationsEnabled = ref(false)\nconst searchQuery = ref(props.searchValue ?? '')\r\nconst searchFocused = ref(false)\r\nconst searchExpanded = ref(false)\r\nconst isMobileViewport = ref(false)\r\nconst headerCompact = ref<CompactState>({\r\n collapseActions: false,\r\n searchIconOnly: false,\r\n hideUserName: false,\r\n hideContextDetails: false,\r\n})\r\n\r\nlet headerResizeObserver: ResizeObserver | undefined\nlet favoritesResizeObserver: ResizeObserver | undefined\nlet resizeFrame: number | undefined\nlet favoritesAnimationFrame: number | undefined\nlet compactCalculation = 0\n\nconst FAVORITES_COLLAPSE_SCROLL = 120\nconst FAVORITES_RESTORE_SCROLL = 24\n\r\nfunction normalizedChildren(item: TopNavItem): TopNavItem[] {\r\n return (item.children ?? []).filter(Boolean).map((child) => {\r\n const children = normalizedChildren(child)\r\n if (!children.length) {\r\n const { children: _discarded, ...leaf } = child\r\n return leaf\r\n }\r\n return { ...child, children }\r\n })\r\n}\r\n\r\nconst visibleSections = computed<TopNavSection[]>(() =>\r\n props.sections\r\n .map((section) => ({ ...section, children: normalizedChildren(section) }))\r\n .filter((section) => section.children.length > 0),\r\n)\r\n\r\nfunction flattenLeaves(items: TopNavItem[], result: TopNavItem[] = []) {\r\n items.forEach((item) => {\r\n const children = item.children ?? []\r\n if (children.length) flattenLeaves(children, result)\r\n else result.push(item)\r\n })\r\n return result\r\n}\r\n\r\nconst allSearchItems = computed(() =>\r\n visibleSections.value.flatMap((section) => flattenLeaves(section.children)),\r\n)\r\n\r\nfunction normalizeText(value: string) {\r\n return value\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '')\r\n .toLocaleLowerCase('pt-BR')\r\n}\r\n\r\nconst visibleSearchResults = computed(() => {\r\n if (props.searchResults !== undefined) return props.searchResults\r\n const query = normalizeText(searchQuery.value.trim())\r\n if (!query) return allSearchItems.value\r\n return allSearchItems.value.filter((item) => normalizeText(item.label).includes(query))\r\n})\r\n\r\nfunction filterTree(items: TopNavItem[], query: string): TopNavItem[] {\r\n if (!query) return items\r\n return items.flatMap((item) => {\r\n const ownMatch = normalizeText(item.label).includes(query)\r\n const children = filterTree(item.children ?? [], query)\r\n if (!ownMatch && !children.length) return []\r\n return [{ ...item, children: ownMatch ? item.children : children }]\r\n })\r\n}\r\n\r\nconst drawerSections = computed(() =>\r\n filterTree(visibleSections.value, normalizeText(searchQuery.value.trim())),\r\n)\r\n\r\nfunction findItemPath(items: TopNavItem[], targetId: string, path: TopNavItem[] = []): TopNavItem[] | null {\r\n for (const item of items) {\r\n const nextPath = [...path, item]\r\n if (item.id === targetId) return nextPath\r\n const found = findItemPath(item.children ?? [], targetId, nextPath)\r\n if (found) return found\r\n }\r\n return null\r\n}\r\n\r\nfunction findItem(items: TopNavItem[], targetId: string): TopNavItem | null {\r\n for (const item of items) {\r\n if (item.id === targetId) return item\r\n const found = findItem(item.children ?? [], targetId)\r\n if (found) return found\r\n }\r\n return null\r\n}\r\n\r\nconst activeMenuPath = computed(() => {\r\n if (!props.activeItemId) return null\r\n for (const section of visibleSections.value) {\r\n if (section.id === props.activeItemId) return [section]\r\n const path = findItemPath(section.children, props.activeItemId)\r\n if (path) return [section, ...path]\r\n }\r\n return null\r\n})\r\n\r\nconst displayedBreadcrumbs = computed<TopNavBreadcrumb[]>(() => {\r\n if (props.breadcrumbs.length) return props.breadcrumbs\r\n const path = activeMenuPath.value\r\n if (!path?.length) return []\r\n const lastIndex = path.length - 1\r\n return path.map((item, index) => ({\r\n id: item.id,\r\n label: item.label,\r\n to: index === lastIndex ? undefined : item.to,\r\n sectionId: index === 0 ? item.id : undefined,\r\n menuId: index > 0 && item.children?.length ? item.id : undefined,\r\n }))\r\n})\r\n\r\nfunction menuForBreadcrumb(item: TopNavBreadcrumb): TopNavItem | null {\r\n if (item.menuId) return findItem(visibleSections.value, item.menuId)\r\n if (item.sectionId) {\r\n return visibleSections.value.find((section) => section.id === item.sectionId) ?? null\r\n }\r\n return null\r\n}\r\n\r\nconst selectedNavigationSection = computed(() =>\r\n visibleSections.value.find((section) => section.id === navigationSectionOpenId.value) ?? null,\r\n)\r\n\r\nfunction cascadeLevels(items: TopNavItem[], path: string[]) {\r\n const levels: TopNavItem[][] = []\r\n let current = items\r\n let depth = 0\r\n while (current.length) {\r\n levels.push(current)\r\n const openItemId = path[depth]\r\n if (!openItemId) break\r\n const openItem = current.find((item) => item.id === openItemId)\r\n if (!openItem?.children?.length) break\r\n current = openItem.children\r\n depth += 1\r\n }\r\n return levels\r\n}\r\n\r\nconst navigationLevels = computed(() =>\r\n selectedNavigationSection.value\r\n ? cascadeLevels(selectedNavigationSection.value.children, navigationPath.value)\r\n : [],\r\n)\r\n\r\nfunction chunkItems(items: TopNavItem[], size = 10) {\r\n const chunks: TopNavItem[][] = []\r\n for (let index = 0; index < items.length; index += size) chunks.push(items.slice(index, index + size))\r\n return chunks\r\n}\r\n\r\nconst quickActions = computed<RenderAction[]>(() => {\r\n const actions: RenderAction[] = []\r\n if (props.showAia) actions.push({ id: '__aia', label: props.aiaLabel, icon: 'pi pi-comments', kind: 'aia' })\r\n if (props.showSupport) actions.push({ id: '__support', label: props.supportLabel, icon: 'pi pi-headphones', kind: 'support' })\r\n props.actions.forEach((action) => actions.push({ ...action, kind: 'action' }))\r\n return actions\r\n})\r\n\r\nconst cleanUserMenuItems = computed(() => {\r\n const result: TopNavUserMenuItem[] = []\r\n props.userMenuItems.forEach((item) => {\r\n if (item.separator) {\r\n if (result.length && !result.at(-1)?.separator) result.push(item)\r\n return\r\n }\r\n result.push(item)\r\n })\r\n if (result.at(-1)?.separator) result.pop()\r\n return result\r\n})\r\n\r\nconst hasUserMenu = computed(() =>\r\n Boolean(slots['user-menu']) || cleanUserMenuItems.value.some((item) => !item.separator),\r\n)\r\nconst hasUser = computed(() => Boolean(props.user) || Boolean(slots.user))\r\nconst hasContext = computed(() => Boolean(slots.context || slots.scope || slots.client || slots['context-compact']))\r\nconst favoriteItems = computed(() => props.favoriteItems.filter(Boolean))\nconst favoritesGrouped = computed(() => pageScrolled.value || !favoritesFitInline.value)\nconst showFavoritesRow = computed(() => favoriteItems.value.length > 0 && !favoritesGrouped.value)\nconst hasDrawerContent = computed(() =>\r\n visibleSections.value.length > 0 || props.searchable || quickActions.value.length > 0 || hasUser.value ||\r\n Boolean(slots['drawer-menu'] || slots['drawer-actions'] || slots['drawer-footer']),\r\n)\r\nconst userInitials = computed(() => {\r\n if (!props.user) return ''\r\n if (props.user.initials) return props.user.initials\r\n return props.user.name.split(/\\s+/).filter(Boolean).slice(0, 2)\r\n .map((part) => part[0]?.toLocaleUpperCase('pt-BR')).join('')\r\n})\r\n\r\nconst drawerUserMenuItems = computed(() => cleanUserMenuItems.value.map((item) => {\r\n if (item.separator) return { separator: true }\r\n return {\r\n label: item.label,\r\n icon: item.icon,\r\n disabled: item.disabled,\r\n command: () => selectUserAction(item),\r\n }\r\n}))\r\n\r\nconst cssVariables = computed<Record<string, string>>(() => {\r\n const appearance = props.appearance\r\n const variables: Record<string, string> = {}\r\n const set = (name: string, value?: string) => {\r\n if (value !== undefined && value !== '') variables[name] = value\r\n }\r\n\r\n set('--top-nav-bg', appearance.colors?.navigation)\n set('--top-nav-breadcrumb-bg', appearance.surfaces?.breadcrumb ?? appearance.colors?.navigation)\n set('--top-nav-drawer-bg', appearance.surfaces?.drawer ?? appearance.colors?.navigation)\n set('--top-nav-drawer-footer-bg', appearance.surfaces?.drawerFooter)\n set('--top-nav-fg', appearance.colors?.text)\n set('--top-nav-muted-fg', appearance.colors?.mutedText)\n set('--top-nav-accent', appearance.colors?.accent)\n set('--top-nav-menu-bg', appearance.surfaces?.menu)\n set('--top-nav-menu-fg', appearance.colors?.menuText)\n set('--top-nav-menu-hover', appearance.surfaces?.menuHover)\n set('--top-nav-menu-explored', appearance.surfaces?.menuExplored)\n set('--top-nav-border', appearance.colors?.border)\n set('--top-nav-menu-border', appearance.borders?.menu)\n set('--top-nav-menu-outline', appearance.borders?.menuOutline)\n set('--top-nav-radius', appearance.shape?.radius)\n set('--top-nav-drawer-radius', appearance.shape?.drawerRadius)\n set('--top-nav-shadow', appearance.shape?.shadow)\n set('--top-nav-mobile-active-bg', appearance.surfaces?.mobileActive)\n set('--top-nav-mobile-active-fg', appearance.colors?.mobileActiveText)\n set('--top-nav-mobile-divider', appearance.borders?.mobileDivider)\n set('--top-nav-favorites-bg', appearance.surfaces?.favorites)\n set('--top-nav-favorites-fg', appearance.colors?.favoritesText)\n set('--top-nav-favorites-border', appearance.borders?.favorites)\n set('--top-nav-favorites-shadow', appearance.shape?.favoritesShadow)\n set('--top-nav-focus-ring', appearance.focus?.onDark)\n set('--top-nav-focus-ring-light', appearance.focus?.onLight)\n set('--top-nav-current-bg', appearance.surfaces?.currentPage)\n set('--top-nav-current-border', appearance.borders?.currentPage)\n return variables\n})\n\nfunction updateFavoritesScrollState() {\n const position = Math.max(0, window.scrollY)\n if (!pageScrolled.value && position >= FAVORITES_COLLAPSE_SCROLL) {\n pageScrolled.value = true\n return\n }\n if (pageScrolled.value && position <= FAVORITES_RESTORE_SCROLL) pageScrolled.value = false\n}\n\nfunction recalculateFavoriteSpace() {\n const container = favoritesMeasureContainerRef.value\n const content = favoritesMeasureContentRef.value\n if (!container || !content) return\n favoritesFitInline.value = content.scrollWidth <= container.clientWidth + 1\n}\n\nfunction enableFavoriteAnimations() {\n favoritesAnimationFrame = window.requestAnimationFrame(() => {\n favoritesAnimationFrame = window.requestAnimationFrame(() => {\n favoritesAnimationsEnabled.value = true\n })\n })\n}\n\r\nfunction supportsHover() {\r\n return typeof window !== 'undefined' && window.matchMedia?.('(hover: hover) and (pointer: fine)').matches\r\n}\r\n\r\nfunction selectItem(item: TopNavItem) {\r\n if (item.disabled) return\r\n emit('navigate', item)\r\n mobileMenuOpen.value = false\r\n closeDesktopPopovers()\r\n}\r\n\r\nfunction performQuickAction(action: RenderAction, closeDrawer = false) {\r\n if (action.disabled) return\r\n if (action.kind === 'aia') emit('toggle-aia')\r\n else if (action.kind === 'support') emit('open-support')\r\n else emit('action', action)\r\n compactActionsOpen.value = false\r\n if (closeDrawer) mobileMenuOpen.value = false\r\n}\r\n\r\nfunction selectUserAction(item: TopNavUserMenuItem, closeDrawer = false) {\r\n if (item.disabled || item.separator) return\r\n emit('user-action', item)\r\n userMenuOpen.value = false\r\n drawerUserOpen.value = false\r\n if (closeDrawer) mobileMenuOpen.value = false\r\n}\r\n\r\nfunction toggleDrawerUserMenu(event: MouseEvent) {\r\n if (!hasUserMenu.value) {\r\n emit('user-click', props.user)\r\n return\r\n }\r\n drawerUserMenuRef.value?.toggle(event)\r\n}\r\n\r\nfunction updateSearch(query: string) {\r\n searchQuery.value = query\r\n emit('update:searchValue', query)\r\n emit('search', query)\r\n}\r\n\r\nfunction clearSearch() {\r\n updateSearch('')\r\n nextTick(() => mobileMenuOpen.value ? mobileSearchInputRef.value?.focus() : searchInputRef.value?.focus())\r\n}\r\n\r\nfunction openNavigationByHover() {\r\n if (supportsHover()) navigationMenuOpen.value = true\r\n}\r\n\r\nfunction closeNavigationByLeave() {\r\n if (!supportsHover() || window.innerWidth < 1024) return\r\n navigationMenuOpen.value = false\r\n navigationSectionOpenId.value = null\r\n navigationPath.value = []\r\n}\r\n\r\nfunction toggleNavigation() {\r\n if (supportsHover()) {\r\n navigationMenuOpen.value = true\r\n return\r\n }\r\n navigationMenuOpen.value = !navigationMenuOpen.value\r\n if (!navigationMenuOpen.value) {\r\n navigationSectionOpenId.value = null\r\n navigationPath.value = []\r\n }\r\n}\r\n\r\nfunction exploreNavigationSection(sectionId: string) {\r\n if (!supportsHover()) return\r\n navigationSectionOpenId.value = sectionId\r\n navigationPath.value = []\r\n}\r\n\r\nfunction toggleNavigationSection(sectionId: string) {\r\n if (supportsHover()) {\r\n navigationSectionOpenId.value = sectionId\r\n navigationPath.value = []\r\n return\r\n }\r\n const closing = navigationSectionOpenId.value === sectionId\r\n navigationSectionOpenId.value = closing ? null : sectionId\r\n navigationPath.value = []\r\n}\r\n\r\nfunction setCascadeItem(path: typeof navigationPath, item: TopNavItem, level: number, hover: boolean) {\r\n if (hover && !supportsHover()) return\r\n const current = path.value[level]\r\n if (!item.children?.length) {\r\n path.value = path.value.slice(0, level)\r\n if (!hover) selectItem(item)\r\n return\r\n }\r\n if (!hover && supportsHover()) {\r\n path.value = [...path.value.slice(0, level), item.id]\r\n return\r\n }\r\n path.value = current === item.id && !hover\r\n ? path.value.slice(0, level)\r\n : [...path.value.slice(0, level), item.id]\r\n}\r\n\r\nfunction setNavigationCascadeItem(item: TopNavItem, level: number, hover: boolean) {\r\n setCascadeItem(navigationPath, item, level, hover)\r\n}\r\n\r\nfunction setBreadcrumbCascadeItem(item: TopNavItem, level: number, hover: boolean) {\r\n setCascadeItem(breadcrumbPath, item, level, hover)\r\n}\r\n\r\nfunction openBreadcrumbByHover(id: string) {\r\n if (!supportsHover()) return\r\n breadcrumbMenuOpenId.value = id\r\n breadcrumbPath.value = []\r\n}\r\n\r\nfunction closeBreadcrumbByLeave() {\r\n if (!supportsHover() || window.innerWidth < 1024) return\r\n breadcrumbMenuOpenId.value = null\r\n breadcrumbPath.value = []\r\n}\r\n\r\nfunction toggleBreadcrumb(id: string) {\r\n if (supportsHover()) {\r\n breadcrumbMenuOpenId.value = id\r\n return\r\n }\r\n breadcrumbMenuOpenId.value = breadcrumbMenuOpenId.value === id ? null : id\r\n breadcrumbPath.value = []\r\n}\r\n\r\nfunction closeDesktopPopovers() {\r\n navigationMenuOpen.value = false\r\n navigationSectionOpenId.value = null\r\n navigationPath.value = []\r\n breadcrumbMenuOpenId.value = null\r\n breadcrumbPath.value = []\r\n compactActionsOpen.value = false\r\n userMenuOpen.value = false\r\n favoritesMenuOpen.value = false\r\n searchFocused.value = false\r\n}\r\n\r\nasync function openSearch() {\r\n if (typeof window !== 'undefined' && window.innerWidth < 1024) {\r\n mobileMenuOpen.value = true\r\n await nextTick()\r\n mobileSearchInputRef.value?.focus()\r\n return\r\n }\r\n searchExpanded.value = true\r\n searchFocused.value = true\r\n await nextTick()\r\n searchInputRef.value?.focus()\r\n scheduleHeaderCalculation()\r\n}\r\n\r\nfunction handleSearchBlur() {\r\n window.setTimeout(() => {\r\n searchFocused.value = false\r\n if (headerCompact.value.searchIconOnly && !searchQuery.value.trim()) {\r\n searchExpanded.value = false\r\n scheduleHeaderCalculation()\r\n }\r\n }, 150)\r\n}\r\n\r\nfunction viewportWidth() {\r\n return Math.round(window.visualViewport?.width ?? window.innerWidth)\r\n}\r\n\r\nasync function recalculateHeaderCompactness() {\r\n if (typeof window === 'undefined' || !headerRef.value) return\r\n const calculation = ++compactCalculation\r\n const width = viewportWidth()\r\n isMobileViewport.value = width < 1024\r\n const normal: CompactState = { collapseActions: false, searchIconOnly: false, hideUserName: false, hideContextDetails: false }\r\n if (width < 1024) {\r\n headerCompact.value = normal\r\n searchExpanded.value = false\r\n return\r\n }\r\n headerCompact.value = {\r\n collapseActions: width < 1440,\r\n searchIconOnly: width < 1320,\r\n hideUserName: width < 1180,\r\n hideContextDetails: false,\r\n }\r\n await nextTick()\r\n if (calculation !== compactCalculation) return\r\n const steps: Array<keyof CompactState> = ['collapseActions', 'searchIconOnly', 'hideUserName', 'hideContextDetails']\r\n for (const step of steps) {\r\n const header = headerRef.value\r\n if (!header || header.scrollWidth <= header.clientWidth + 1) break\r\n headerCompact.value = { ...headerCompact.value, [step]: true }\r\n await nextTick()\r\n if (calculation !== compactCalculation) return\r\n }\r\n}\r\n\r\nfunction scheduleHeaderCalculation() {\r\n if (typeof window === 'undefined') return\r\n if (resizeFrame !== undefined) window.cancelAnimationFrame(resizeFrame)\r\n resizeFrame = window.requestAnimationFrame(() => {\r\n resizeFrame = undefined\r\n void recalculateHeaderCompactness()\r\n })\r\n}\r\n\r\nfunction handlePointerDown(event: PointerEvent) {\r\n const target = event.target\r\n if (!(target instanceof Element)) return\r\n if (target.closest('.top-nav-bar__mobile-menu')) return\r\n if (!rootRef.value?.contains(target)) {\r\n closeDesktopPopovers()\r\n return\r\n }\r\n if (!target.closest('[data-top-nav-navigation]')) {\r\n navigationMenuOpen.value = false\r\n navigationSectionOpenId.value = null\r\n navigationPath.value = []\r\n }\r\n if (!target.closest('[data-top-nav-breadcrumb]')) {\r\n breadcrumbMenuOpenId.value = null\r\n breadcrumbPath.value = []\r\n }\r\n if (!target.closest('[data-top-nav-actions]')) compactActionsOpen.value = false\r\n if (!target.closest('[data-top-nav-user]')) userMenuOpen.value = false\r\n if (!target.closest('[data-top-nav-favorites]')) favoritesMenuOpen.value = false\r\n if (!target.closest('[data-top-nav-search]')) searchFocused.value = false\r\n}\r\n\r\nfunction handleKeydown(event: KeyboardEvent) {\r\n if ((event.ctrlKey || event.metaKey) && event.key.toLocaleLowerCase() === 'k' && props.searchable) {\r\n event.preventDefault()\r\n void openSearch()\r\n return\r\n }\r\n if (event.key !== 'Escape') return\r\n if (drawerUserOpen.value) {\r\n drawerUserMenuRef.value?.hide()\r\n return\r\n }\r\n if (mobileMenuOpen.value) mobileMenuOpen.value = false\r\n closeDesktopPopovers()\r\n if (headerCompact.value.searchIconOnly && !searchQuery.value.trim()) searchExpanded.value = false\r\n}\r\n\r\nfunction toggleUserMenu() {\r\n if (!hasUserMenu.value) {\r\n emit('user-click', props.user)\r\n return\r\n }\r\n if (supportsHover()) {\r\n userMenuOpen.value = true\r\n return\r\n }\r\n userMenuOpen.value = !userMenuOpen.value\r\n}\r\n\r\nfunction toggleFavoritesMenu() {\r\n if (supportsHover()) {\r\n favoritesMenuOpen.value = true\r\n return\r\n }\r\n favoritesMenuOpen.value = !favoritesMenuOpen.value\r\n}\r\n\r\nwatch(() => props.searchValue, (value) => {\r\n if (value !== undefined && value !== searchQuery.value) searchQuery.value = value\r\n})\r\nwatch(() => props.mobileOpen, (value) => {\r\n if (value !== undefined && value !== mobileMenuOpen.value) mobileMenuOpen.value = value\r\n})\r\nwatch(mobileMenuOpen, (value) => emit('update:mobileOpen', value))\nwatch([visibleSections, () => props.user, quickActions], () => nextTick(scheduleHeaderCalculation), { deep: true })\nwatch(favoriteItems, () => nextTick(recalculateFavoriteSpace), { deep: true })\n\r\nonMounted(() => {\r\n document.addEventListener('keydown', handleKeydown)\r\n document.addEventListener('pointerdown', handlePointerDown)\r\n window.addEventListener('resize', scheduleHeaderCalculation)\n window.visualViewport?.addEventListener('resize', scheduleHeaderCalculation)\n window.addEventListener('resize', recalculateFavoriteSpace)\n window.addEventListener('scroll', updateFavoritesScrollState, { passive: true })\n if (typeof ResizeObserver !== 'undefined') {\n headerResizeObserver = new ResizeObserver(scheduleHeaderCalculation)\r\n if (headerRef.value) headerResizeObserver.observe(headerRef.value)\n favoritesResizeObserver = new ResizeObserver(recalculateFavoriteSpace)\n if (favoritesMeasureContainerRef.value) favoritesResizeObserver.observe(favoritesMeasureContainerRef.value)\n }\n scheduleHeaderCalculation()\n nextTick(() => {\n recalculateFavoriteSpace()\n updateFavoritesScrollState()\n enableFavoriteAnimations()\n })\n})\r\n\r\nonBeforeUnmount(() => {\r\n document.removeEventListener('keydown', handleKeydown)\r\n document.removeEventListener('pointerdown', handlePointerDown)\r\n window.removeEventListener('resize', scheduleHeaderCalculation)\n window.visualViewport?.removeEventListener('resize', scheduleHeaderCalculation)\n window.removeEventListener('resize', recalculateFavoriteSpace)\n window.removeEventListener('scroll', updateFavoritesScrollState)\n headerResizeObserver?.disconnect()\n favoritesResizeObserver?.disconnect()\n if (resizeFrame !== undefined) window.cancelAnimationFrame(resizeFrame)\n if (favoritesAnimationFrame !== undefined) window.cancelAnimationFrame(favoritesAnimationFrame)\n})\r\n\r\ndefineExpose({\r\n close: closeDesktopPopovers,\r\n closeDrawer: () => { mobileMenuOpen.value = false },\r\n focusSearch: openSearch,\r\n openDrawer: () => { mobileMenuOpen.value = true },\r\n})\r\n</script>\r\n\r\n<template>\r\n <nav ref=\"rootRef\" class=\"top-nav-bar top-solutions-component\" :style=\"cssVariables\" aria-label=\"Navegação principal\">\r\n <header ref=\"headerRef\" class=\"top-nav-bar__header\" :class=\"{ 'top-nav-bar__header--context-compact': headerCompact.hideContextDetails }\">\r\n <button v-if=\"hasDrawerContent\" class=\"top-nav-bar__mobile-trigger top-nav-bar__square-button\" type=\"button\" aria-label=\"Abrir navegação\" :aria-expanded=\"mobileMenuOpen\" @click=\"mobileMenuOpen = !mobileMenuOpen\">\r\n <i class=\"pi pi-bars\" aria-hidden=\"true\" />\r\n </button>\r\n\r\n <div class=\"top-nav-bar__brand\"><slot name=\"brand\" :compact=\"headerCompact.hideContextDetails\" /></div>\r\n <div v-if=\"hasContext\" class=\"top-nav-bar__context\">\r\n <slot v-if=\"headerCompact.hideContextDetails && $slots['context-compact']\" name=\"context-compact\" />\r\n <slot v-else-if=\"$slots.context\" name=\"context\" :compact=\"headerCompact.hideContextDetails\" />\r\n <slot v-else-if=\"$slots.scope\" name=\"scope\" :compact=\"headerCompact.hideContextDetails\" />\r\n <slot v-else name=\"client\" :compact=\"headerCompact.hideContextDetails\" />\r\n </div>\r\n <div class=\"top-nav-bar__spacer\" aria-hidden=\"true\" />\r\n\r\n <div class=\"top-nav-bar__desktop-tools\">\r\n <div v-if=\"searchable\" class=\"top-nav-bar__search-shell\" data-top-nav-search>\r\n <button v-if=\"headerCompact.searchIconOnly && !searchExpanded\" class=\"top-nav-bar__square-button\" type=\"button\" aria-label=\"Pesquisar no menu\" title=\"Pesquisar no menu (Ctrl+K)\" @click=\"openSearch\">\r\n <i class=\"pi pi-search\" aria-hidden=\"true\" />\r\n </button>\r\n <div v-else class=\"top-nav-bar__search\" :class=\"{ 'top-nav-bar__search--expanded': searchExpanded }\">\r\n <i class=\"pi pi-search\" aria-hidden=\"true\" />\r\n <input ref=\"searchInputRef\" :value=\"searchQuery\" type=\"text\" role=\"searchbox\" :placeholder=\"searchPlaceholder\" aria-label=\"Pesquisar no menu\" @focus=\"searchFocused = true\" @blur=\"handleSearchBlur\" @input=\"updateSearch(($event.target as HTMLInputElement).value)\" />\n <button v-if=\"searchQuery || (headerCompact.searchIconOnly && searchExpanded)\" class=\"top-nav-bar__search-clear\" type=\"button\" :aria-label=\"searchQuery ? 'Limpar pesquisa' : 'Fechar pesquisa'\" @mousedown.prevent @click=\"searchQuery ? clearSearch() : (searchExpanded = false)\">\r\n <i class=\"pi pi-times\" aria-hidden=\"true\" />\r\n </button>\r\n <div v-if=\"searchFocused\" class=\"top-nav-bar__search-results\" role=\"menu\">\n <div class=\"top-nav-bar__search-results-scroll\">\n <slot name=\"search-results\" :items=\"visibleSearchResults\" :select=\"selectItem\">\n <button v-for=\"item in visibleSearchResults\" :key=\"item.id\" class=\"top-nav-bar__menu-item\" type=\"button\" role=\"menuitem\" :disabled=\"item.disabled\" @mousedown.prevent @click=\"selectItem(item)\">\n <i v-if=\"item.icon\" :class=\"item.icon\" aria-hidden=\"true\" /><span>{{ item.label }}</span>\n </button>\n <span v-if=\"!visibleSearchResults.length\" class=\"top-nav-bar__empty\">Nenhum item encontrado.</span>\n </slot>\n </div>\n </div>\n </div>\r\n </div>\r\n\r\n <div v-if=\"quickActions.length\" class=\"top-nav-bar__quick-actions\" data-top-nav-actions>\r\n <template v-if=\"!headerCompact.collapseActions\">\r\n <button v-for=\"actionItem in quickActions\" :key=\"actionItem.id\" class=\"top-nav-bar__square-button\" :class=\"{ 'top-nav-bar__square-button--active': actionItem.kind === 'aia' && aiaActive }\" type=\"button\" :disabled=\"actionItem.disabled\" :aria-label=\"actionItem.label\" :aria-pressed=\"actionItem.kind === 'aia' ? aiaActive : undefined\" :title=\"actionItem.label\" @click=\"performQuickAction(actionItem)\">\r\n <slot v-if=\"actionItem.kind === 'aia'\" name=\"aia-icon\"><i :class=\"actionItem.icon\" aria-hidden=\"true\" /></slot>\r\n <slot v-else-if=\"actionItem.kind === 'support'\" name=\"support-icon\"><i :class=\"actionItem.icon\" aria-hidden=\"true\" /></slot>\r\n <i v-else :class=\"actionItem.icon\" aria-hidden=\"true\" />\r\n </button>\r\n </template>\r\n <template v-else>\r\n <button class=\"top-nav-bar__square-button\" type=\"button\" aria-label=\"Mais ações\" :aria-expanded=\"compactActionsOpen\" @click=\"compactActionsOpen = !compactActionsOpen\"><i class=\"pi pi-ellipsis-h\" aria-hidden=\"true\" /></button>\r\n <div v-if=\"compactActionsOpen\" class=\"top-nav-bar__popover-layer top-nav-bar__actions-layer\">\r\n <div class=\"top-nav-bar__small-panel\" role=\"menu\">\r\n <button v-for=\"actionItem in quickActions\" :key=\"actionItem.id\" class=\"top-nav-bar__menu-item\" type=\"button\" role=\"menuitem\" :disabled=\"actionItem.disabled\" @click=\"performQuickAction(actionItem)\">\r\n <i :class=\"actionItem.icon\" aria-hidden=\"true\" /><span>{{ actionItem.label }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <div v-if=\"$slots.actions\" class=\"top-nav-bar__custom-actions\"><slot name=\"actions\" :compact=\"headerCompact.collapseActions\" :close=\"closeDesktopPopovers\" /></div>\r\n\r\n <div v-if=\"hasUser\" class=\"top-nav-bar__user-menu\" data-top-nav-user @mouseenter=\"hasUserMenu && supportsHover() && (userMenuOpen = true)\" @mouseleave=\"supportsHover() && (userMenuOpen = false)\">\r\n <button class=\"top-nav-bar__user-trigger\" type=\"button\" :aria-haspopup=\"hasUserMenu ? 'menu' : undefined\" :aria-expanded=\"hasUserMenu ? userMenuOpen : undefined\" @click=\"toggleUserMenu\">\r\n <slot name=\"user\" :user=\"user\" :compact=\"headerCompact.hideUserName\">\r\n <img v-if=\"user?.avatarUrl\" :src=\"user.avatarUrl\" alt=\"\" class=\"top-nav-bar__user-avatar\" />\r\n <span v-else class=\"top-nav-bar__user-avatar\">{{ userInitials }}</span>\r\n <span v-if=\"user && !headerCompact.hideUserName\" class=\"top-nav-bar__user-details\"><span class=\"top-nav-bar__user-name\">{{ user.name }}</span><span v-if=\"user.subtitle\" class=\"top-nav-bar__user-subtitle\">{{ user.subtitle }}</span></span>\r\n </slot>\r\n <i v-if=\"hasUserMenu\" class=\"pi pi-chevron-down top-nav-bar__chevron\" aria-hidden=\"true\" />\r\n </button>\r\n <div v-if=\"hasUserMenu && userMenuOpen\" class=\"top-nav-bar__popover-layer top-nav-bar__user-layer\">\r\n <div class=\"top-nav-bar__small-panel top-nav-bar__user-dropdown\" role=\"menu\">\r\n <slot name=\"user-menu\" :items=\"cleanUserMenuItems\" :select=\"selectUserAction\">\r\n <template v-for=\"item in cleanUserMenuItems\" :key=\"item.id\">\r\n <div v-if=\"item.separator\" class=\"top-nav-bar__user-separator\" role=\"separator\" />\r\n <button v-else class=\"top-nav-bar__menu-item\" type=\"button\" role=\"menuitem\" :disabled=\"item.disabled\" @click=\"selectUserAction(item)\"><i v-if=\"item.icon\" :class=\"item.icon\" aria-hidden=\"true\" /><span>{{ item.label }}</span></button>\r\n </template>\r\n </slot>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </header>\r\n\r\n <div class=\"top-nav-bar__breadcrumbs\" aria-label=\"Breadcrumb\">\r\n <button class=\"top-nav-bar__crumb\" type=\"button\" @click=\"selectItem(homeItem)\"><HugeiconsIcon :icon=\"Home07Icon\" /><span>{{ homeItem.label }}</span></button>\r\n <span v-if=\"visibleSections.length\" class=\"top-nav-bar__separator top-nav-bar__desktop-navigation-separator\" aria-hidden=\"true\">/</span>\r\n\r\n <div v-if=\"visibleSections.length\" class=\"top-nav-bar__dropdown top-nav-bar__desktop-navigation\" data-top-nav-navigation @mouseenter=\"openNavigationByHover\" @mouseleave=\"closeNavigationByLeave\">\r\n <button class=\"top-nav-bar__crumb\" type=\"button\" aria-haspopup=\"menu\" :aria-expanded=\"navigationMenuOpen\" @click=\"toggleNavigation\"><i class=\"pi pi-bars\" aria-hidden=\"true\" /><span>{{ navigationLabel }}</span><i class=\"pi pi-chevron-down top-nav-bar__chevron\" aria-hidden=\"true\" /></button>\r\n <div v-if=\"navigationMenuOpen\" class=\"top-nav-bar__menu-layer\">\r\n <div class=\"top-nav-bar__menu-panel\" role=\"menu\">\r\n <div class=\"top-nav-bar__section-list\">\r\n <button v-for=\"section in visibleSections\" :key=\"section.id\" class=\"top-nav-bar__menu-item\" :class=\"{ 'top-nav-bar__menu-item--explored': navigationSectionOpenId === section.id }\" type=\"button\" role=\"menuitem\" aria-haspopup=\"menu\" :aria-expanded=\"navigationSectionOpenId === section.id\" @mouseenter=\"exploreNavigationSection(section.id)\" @click=\"toggleNavigationSection(section.id)\">\r\n <i v-if=\"section.icon\" :class=\"section.icon\" aria-hidden=\"true\" /><span class=\"top-nav-bar__menu-label\">{{ section.label }}</span><span class=\"top-nav-bar__item-count\">{{ section.children.length }}</span><i class=\"pi pi-chevron-right top-nav-bar__menu-arrow\" aria-hidden=\"true\" />\r\n </button>\r\n </div>\r\n <div v-if=\"selectedNavigationSection\" class=\"top-nav-bar__submenu-region\">\r\n <div v-for=\"(levelItems, levelIndex) in navigationLevels\" :key=\"`navigation-level-${levelIndex}`\" class=\"top-nav-bar__cascade-level\" :class=\"{ 'top-nav-bar__section-items': levelIndex === 0 }\" role=\"menu\">\r\n <div v-for=\"(column, columnIndex) in chunkItems(levelItems)\" :key=\"`navigation-${levelIndex}-${columnIndex}`\" class=\"top-nav-bar__menu-column\">\r\n <button v-for=\"item in column\" :key=\"item.id\" class=\"top-nav-bar__menu-item\" :class=\"{ 'top-nav-bar__menu-item--explored': navigationPath[levelIndex] === item.id }\" type=\"button\" role=\"menuitem\" :disabled=\"item.disabled\" :aria-haspopup=\"item.children?.length ? 'menu' : undefined\" :aria-expanded=\"item.children?.length ? navigationPath[levelIndex] === item.id : undefined\" @mouseenter=\"setNavigationCascadeItem(item, levelIndex, true)\" @click=\"setNavigationCascadeItem(item, levelIndex, false)\">\r\n <i v-if=\"item.icon\" :class=\"item.icon\" aria-hidden=\"true\" /><span class=\"top-nav-bar__menu-label\">{{ item.label }}</span><i v-if=\"item.children?.length\" class=\"pi pi-chevron-right top-nav-bar__menu-arrow\" aria-hidden=\"true\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <template v-for=\"(breadcrumb, index) in displayedBreadcrumbs\" :key=\"breadcrumb.id\">\r\n <span class=\"top-nav-bar__separator\" :class=\"{ 'top-nav-bar__separator--current': !breadcrumb.to && index === displayedBreadcrumbs.length - 1 }\" aria-hidden=\"true\">/</span>\r\n <div v-if=\"menuForBreadcrumb(breadcrumb)?.children?.length\" class=\"top-nav-bar__dropdown top-nav-bar__breadcrumb-dropdown\" data-top-nav-breadcrumb @mouseenter=\"!isMobileViewport && openBreadcrumbByHover(breadcrumb.id)\" @mouseleave=\"!isMobileViewport && closeBreadcrumbByLeave()\">\r\n <span v-if=\"isMobileViewport\" class=\"top-nav-bar__crumb top-nav-bar__crumb--static\">{{ breadcrumb.label }}</span>\r\n <button v-else class=\"top-nav-bar__crumb\" type=\"button\" aria-haspopup=\"menu\" :aria-expanded=\"breadcrumbMenuOpenId === breadcrumb.id\" @click=\"toggleBreadcrumb(breadcrumb.id)\"><span>{{ breadcrumb.label }}</span><i class=\"pi pi-chevron-down top-nav-bar__chevron\" aria-hidden=\"true\" /></button>\r\n <div v-if=\"!isMobileViewport && breadcrumbMenuOpenId === breadcrumb.id\" class=\"top-nav-bar__menu-layer\">\r\n <div class=\"top-nav-bar__menu-panel top-nav-bar__breadcrumb-panel\" role=\"menu\">\r\n <div v-for=\"(levelItems, levelIndex) in cascadeLevels(menuForBreadcrumb(breadcrumb)?.children ?? [], breadcrumbPath)\" :key=\"`breadcrumb-${breadcrumb.id}-${levelIndex}`\" class=\"top-nav-bar__cascade-level\" :class=\"{ 'top-nav-bar__breadcrumb-main-items': levelIndex === 0 }\">\r\n <div v-for=\"(column, columnIndex) in chunkItems(levelItems)\" :key=\"`breadcrumb-${breadcrumb.id}-${levelIndex}-${columnIndex}`\" class=\"top-nav-bar__menu-column\">\r\n <button v-for=\"item in column\" :key=\"item.id\" class=\"top-nav-bar__menu-item\" :class=\"{ 'top-nav-bar__menu-item--explored': breadcrumbPath[levelIndex] === item.id }\" type=\"button\" role=\"menuitem\" :disabled=\"item.disabled\" @mouseenter=\"setBreadcrumbCascadeItem(item, levelIndex, true)\" @click=\"setBreadcrumbCascadeItem(item, levelIndex, false)\">\r\n <i v-if=\"item.icon\" :class=\"item.icon\" aria-hidden=\"true\" /><span class=\"top-nav-bar__menu-label\">{{ item.label }}</span><i v-if=\"item.children?.length\" class=\"pi pi-chevron-right top-nav-bar__menu-arrow\" aria-hidden=\"true\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button v-else-if=\"breadcrumb.to\" class=\"top-nav-bar__crumb\" type=\"button\" @click=\"selectItem(breadcrumb)\">{{ breadcrumb.label }}</button>\r\n <span v-else class=\"top-nav-bar__current\" :title=\"breadcrumb.label\"><span class=\"top-nav-bar__current-label\">{{ breadcrumb.label }}</span><button v-if=\"showFavoriteToggle\" class=\"top-nav-bar__favorite-toggle\" type=\"button\" :aria-label=\"favoriteActive ? 'Remover dos favoritos' : 'Adicionar aos favoritos'\" :aria-pressed=\"favoriteActive\" @click.stop=\"emit('toggle-favorite')\"><i :class=\"favoriteActive ? 'pi pi-star-fill' : 'pi pi-star'\" aria-hidden=\"true\" /></button></span>\r\n </template>\r\n\r\n <div class=\"top-nav-bar__breadcrumb-actions\">\n <Transition name=\"top-nav-bar-favorites-trigger\" :css=\"favoritesAnimationsEnabled\"><div v-if=\"favoritesGrouped && favoriteItems.length\" class=\"top-nav-bar__favorites-menu top-nav-bar__desktop-only\" data-top-nav-favorites @mouseenter=\"supportsHover() && (favoritesMenuOpen = true)\" @mouseleave=\"supportsHover() && (favoritesMenuOpen = false)\">\n <button class=\"top-nav-bar__crumb\" type=\"button\" aria-haspopup=\"menu\" :aria-expanded=\"favoritesMenuOpen\" @click=\"toggleFavoritesMenu\"><i class=\"pi pi-star-fill top-nav-bar__accent\" aria-hidden=\"true\" /><span>{{ favoriteLabel }}</span><i class=\"pi pi-chevron-down top-nav-bar__chevron\" aria-hidden=\"true\" /></button>\n <div v-if=\"favoritesMenuOpen\" class=\"top-nav-bar__popover-layer top-nav-bar__favorites-layer\"><div class=\"top-nav-bar__small-panel top-nav-bar__favorites-panel\" role=\"menu\">\n <button v-for=\"item in favoriteItems\" :key=\"item.id\" class=\"top-nav-bar__menu-item\" type=\"button\" role=\"menuitem\" :disabled=\"item.disabled\" @click=\"selectItem(item)\"><i v-if=\"item.icon\" :class=\"item.icon\" aria-hidden=\"true\" /><span>{{ item.label }}</span></button>\n </div></div>\n </div></Transition>\n <slot name=\"breadcrumb-actions\" />\n </div>\n </div>\n\n <div ref=\"favoritesMeasureContainerRef\" class=\"top-nav-bar__favorites-measure\" aria-hidden=\"true\"><div ref=\"favoritesMeasureContentRef\" class=\"top-nav-bar__favorites-measure-content\"><span class=\"top-nav-bar__favorites-title\"><i class=\"pi pi-star-fill top-nav-bar__favorites-icon\" aria-hidden=\"true\" /><span>{{ favoriteLabel }}</span></span><span v-for=\"(item, index) in favoriteItems\" :key=\"`measure-${item.id}`\" class=\"top-nav-bar__favorites-measure-item\"><span v-if=\"index > 0\" class=\"top-nav-bar__favorites-separator\">|</span><span><i v-if=\"item.icon\" :class=\"item.icon\" aria-hidden=\"true\" /> {{ item.label }}</span></span></div></div>\n\n <Transition name=\"top-nav-bar-favorites-row\" :css=\"favoritesAnimationsEnabled\"><div v-if=\"showFavoritesRow\" class=\"top-nav-bar__favorites-row top-nav-bar__desktop-only\"><span class=\"top-nav-bar__favorites-title\"><i class=\"pi pi-star-fill top-nav-bar__favorites-icon\" aria-hidden=\"true\" /><span>{{ favoriteLabel }}</span></span><div class=\"top-nav-bar__favorites-list\"><template v-for=\"(item, index) in favoriteItems\" :key=\"`row-${item.id}`\"><span v-if=\"index > 0\" class=\"top-nav-bar__favorites-separator\" aria-hidden=\"true\">|</span><button class=\"top-nav-bar__favorites-row-item\" type=\"button\" :disabled=\"item.disabled\" @click=\"selectItem(item)\"><i v-if=\"item.icon\" :class=\"item.icon\" aria-hidden=\"true\" /><span>{{ item.label }}</span></button></template></div></div></Transition>\n\n <Drawer v-model:visible=\"mobileMenuOpen\" position=\"left\" class=\"top-nav-bar__mobile-drawer\" :style=\"[cssVariables, { width: 'var(--top-nav-drawer-width, min(22rem, calc(100vw - 1.5rem)))' }]\">\n <template #container=\"{ closeCallback }\">\r\n <div class=\"top-nav-bar__mobile-menu\">\r\n <header class=\"top-nav-bar__mobile-menu-header\">\r\n <slot name=\"drawer-header\" :close=\"closeCallback\">\r\n <div class=\"top-nav-bar__drawer-brand\"><slot name=\"drawer-brand\"><slot name=\"brand\" :compact=\"false\" /></slot></div>\r\n <button class=\"top-nav-bar__drawer-close top-nav-bar__square-button\" type=\"button\" aria-label=\"Fechar navegação\" @click=\"closeCallback\"><i class=\"pi pi-times\" aria-hidden=\"true\" /></button>\r\n </slot>\r\n </header>\r\n\r\n <div v-if=\"searchable || quickActions.length || $slots['drawer-actions']\" class=\"top-nav-bar__drawer-tools\">\r\n <slot v-if=\"searchable\" name=\"drawer-search\" :query=\"searchQuery\" :update=\"updateSearch\" :clear=\"clearSearch\">\r\n <div class=\"top-nav-bar__drawer-search\"><i class=\"pi pi-search\" aria-hidden=\"true\" /><input ref=\"mobileSearchInputRef\" :value=\"searchQuery\" type=\"text\" role=\"searchbox\" :placeholder=\"searchPlaceholder\" aria-label=\"Pesquisar no menu\" @input=\"updateSearch(($event.target as HTMLInputElement).value)\" /><button v-if=\"searchQuery\" class=\"top-nav-bar__search-clear\" type=\"button\" aria-label=\"Limpar pesquisa\" @click=\"clearSearch\"><i class=\"pi pi-times\" aria-hidden=\"true\" /></button></div>\n </slot>\r\n <slot name=\"drawer-actions\" :actions=\"quickActions\" :select=\"(actionItem: RenderAction) => performQuickAction(actionItem, true)\" :close=\"closeCallback\">\r\n <button v-for=\"actionItem in quickActions\" :key=\"`drawer-${actionItem.id}`\" class=\"top-nav-bar__drawer-action\" :class=\"{ 'top-nav-bar__drawer-action--active': actionItem.kind === 'aia' && aiaActive }\" type=\"button\" :disabled=\"actionItem.disabled\" @click=\"performQuickAction(actionItem, true)\"><i :class=\"actionItem.icon\" aria-hidden=\"true\" /><span>{{ actionItem.label }}</span></button>\r\n </slot>\r\n </div>\r\n\r\n <div class=\"top-nav-bar__mobile-menu-scroll\">\r\n <slot name=\"drawer-before-menu\" :close=\"closeCallback\" />\r\n <div class=\"top-nav-bar__mobile-menu-track\">\r\n <section v-if=\"favoriteItems.length\" class=\"top-nav-bar__mobile-favorites\">\r\n <button class=\"top-nav-bar__mobile-item\" type=\"button\" :aria-expanded=\"drawerFavoritesOpen\" @click=\"drawerFavoritesOpen = !drawerFavoritesOpen\"><i class=\"pi pi-star-fill top-nav-bar__accent\" aria-hidden=\"true\" /><span class=\"top-nav-bar__mobile-item-label\">{{ favoriteLabel }}</span><span class=\"top-nav-bar__mobile-count\">{{ favoriteItems.length }}</span><i class=\"pi pi-chevron-down top-nav-bar__mobile-chevron\" :class=\"{ 'top-nav-bar__mobile-chevron--open': drawerFavoritesOpen }\" aria-hidden=\"true\" /></button>\r\n <Transition name=\"top-nav-bar-menu-expand\"><TopNavMobileTree v-if=\"drawerFavoritesOpen\" :items=\"favoriteItems\" :active-item-id=\"activeItemId\" :level=\"1\" @select=\"selectItem\" /></Transition>\r\n </section>\r\n <slot name=\"drawer-menu\" :sections=\"drawerSections\" :select=\"selectItem\" :close=\"closeCallback\">\r\n <TopNavMobileTree v-if=\"drawerSections.length\" :items=\"drawerSections\" :active-item-id=\"activeItemId\" :force-open=\"Boolean(searchQuery.trim())\" show-section-dividers @select=\"selectItem\" />\r\n <div v-else class=\"top-nav-bar__drawer-empty\">Nenhum menu encontrado.</div>\r\n </slot>\r\n </div>\r\n <slot name=\"drawer-after-menu\" :close=\"closeCallback\" />\r\n </div>\r\n\r\n <footer v-if=\"hasUser || $slots['drawer-footer']\" class=\"top-nav-bar__mobile-footer\">\r\n <slot v-if=\"hasUser\" name=\"drawer-user\" :user=\"user\" :open=\"drawerUserOpen\" :toggle=\"() => (drawerUserOpen = !drawerUserOpen)\">\r\n <button class=\"top-nav-bar__drawer-user\" type=\"button\" :aria-haspopup=\"hasUserMenu ? 'menu' : undefined\" :aria-expanded=\"hasUserMenu ? drawerUserOpen : undefined\" @click=\"toggleDrawerUserMenu\">\r\n <img v-if=\"user?.avatarUrl\" :src=\"user.avatarUrl\" alt=\"\" class=\"top-nav-bar__user-avatar\" /><span v-else class=\"top-nav-bar__user-avatar\">{{ userInitials }}</span><span v-if=\"user\" class=\"top-nav-bar__user-details\"><span class=\"top-nav-bar__user-name\">{{ user.name }}</span><span v-if=\"user.subtitle\" class=\"top-nav-bar__user-subtitle\">{{ user.subtitle }}</span></span><i v-if=\"hasUserMenu\" class=\"pi pi-chevron-down top-nav-bar__mobile-chevron\" aria-hidden=\"true\" />\r\n </button>\r\n </slot>\r\n <slot name=\"drawer-footer\" :close=\"closeCallback\" />\r\n </footer>\r\n </div>\r\n </template>\r\n </Drawer>\r\n <Menu ref=\"drawerUserMenuRef\" class=\"top-nav-bar__drawer-user-popup\" :model=\"drawerUserMenuItems\" :popup=\"true\" append-to=\"body\" :base-z-index=\"10001\" @show=\"drawerUserOpen = true\" @hide=\"drawerUserOpen = false\" />\r\n </nav>\r\n</template>\r\n\r\n<style>\r\n.top-nav-bar, .top-nav-bar *, .top-nav-bar__mobile-drawer, .top-nav-bar__mobile-drawer * { box-sizing: border-box; }\r\n.top-nav-bar { position: relative; z-index: 1000; width: 100%; color: var(--top-nav-fg, #fff); font-family: var(--top-nav-font-family, inherit); font-size: var(--top-nav-font-size, inherit); font-weight: var(--top-nav-font-weight, inherit); line-height: var(--top-nav-line-height, normal); }\r\n.top-nav-bar button, .top-nav-bar input, .top-nav-bar__mobile-drawer button, .top-nav-bar__mobile-drawer input, .top-nav-bar__drawer-user-popup button { font: inherit; }\n.top-nav-bar button, .top-nav-bar__mobile-drawer button, .top-nav-bar__drawer-user-popup button { -webkit-appearance: none; appearance: none; -webkit-tap-highlight-color: transparent; }\n.top-nav-bar button:focus, .top-nav-bar__mobile-drawer button:focus, .top-nav-bar__drawer-user-popup button:focus { outline: 0; }\n.top-nav-bar button:focus-visible, .top-nav-bar__mobile-drawer button:focus-visible, .top-nav-bar__drawer-user-popup button:focus-visible { outline: 2px solid var(--top-nav-focus-ring, rgb(255 255 255 / 75%)); outline-offset: 2px; }\n.top-nav-bar__small-panel button:focus-visible, .top-nav-bar__menu-panel button:focus-visible, .top-nav-bar__search-results button:focus-visible, .top-nav-bar__favorites-row button:focus-visible, .top-nav-bar__drawer-user-popup button:focus-visible { outline-color: var(--top-nav-focus-ring-light, #025a84); }\n.top-nav-bar__header { position: relative; z-index: 4; display: flex; min-width: 0; min-height: var(--top-nav-header-height, 4.75rem); align-items: center; gap: .75rem; overflow: visible; padding: var(--top-nav-header-padding, .625rem 1.5rem); background: var(--top-nav-bg, #013a59); }\r\n.top-nav-bar__brand, .top-nav-bar__context, .top-nav-bar__desktop-tools, .top-nav-bar__quick-actions, .top-nav-bar__custom-actions { display: flex; min-width: 0; align-items: center; }\r\n.top-nav-bar__brand { flex: 0 1 auto; overflow: hidden; }\r\n.top-nav-bar__context { flex: 0 1 auto; overflow: hidden; transition: max-width .15s ease; }\r\n.top-nav-bar__header--context-compact .top-nav-bar__context { max-width: var(--top-nav-context-compact-width, 3.25rem); }\r\n.top-nav-bar__spacer { min-width: 0; flex: 1 1 auto; }\r\n.top-nav-bar__desktop-tools { flex: 0 0 auto; gap: .5rem; }\r\n.top-nav-bar__quick-actions, .top-nav-bar__custom-actions { gap: .5rem; }\r\n.top-nav-bar__square-button, .top-nav-bar__mobile-trigger { display: inline-flex; width: var(--top-nav-action-size, 2.5rem); height: var(--top-nav-action-size, 2.5rem); flex: 0 0 var(--top-nav-action-size, 2.5rem); align-items: center; justify-content: center; border: 1px solid var(--top-nav-border, rgb(255 255 255 / 20%)); border-radius: var(--top-nav-radius, 8px); background: rgb(255 255 255 / 10%); color: var(--top-nav-fg, #fff); cursor: pointer; padding: 0; transition: border-color .15s ease, background-color .15s ease; }\r\n.top-nav-bar__square-button:hover, .top-nav-bar__mobile-trigger:hover, .top-nav-bar__square-button--active { border-color: rgb(255 255 255 / 45%); background: rgb(255 255 255 / 18%); }\r\n.top-nav-bar button:disabled { cursor: not-allowed; opacity: .5; }\r\n.top-nav-bar__mobile-trigger { display: none; }\r\n.top-nav-bar__search-shell, .top-nav-bar__search, .top-nav-bar__user-menu, .top-nav-bar__quick-actions, .top-nav-bar__favorites-menu { position: relative; }\r\n.top-nav-bar__search { width: clamp(8.5rem, 15vw, 15rem); height: var(--top-nav-action-size, 2.5rem); }\r\n.top-nav-bar__search--expanded { width: 16rem; }\r\n.top-nav-bar__search > i, .top-nav-bar__drawer-search > i { position: absolute; top: 50%; left: .75rem; z-index: 1; transform: translateY(-50%); color: var(--top-nav-muted-fg, #bfdbfe); pointer-events: none; }\r\n.top-nav-bar__search input, .top-nav-bar__drawer-search input { width: 100%; height: var(--top-nav-action-size, 2.5rem); border: 1px solid var(--top-nav-border, rgb(255 255 255 / 20%)); border-radius: var(--top-nav-radius, 8px); outline: 0; background: rgb(255 255 255 / 10%); color: var(--top-nav-fg, #fff); padding: .5rem 2.25rem; transition: border-color .15s ease, background-color .15s ease, box-shadow .15s ease; }\r\n.top-nav-bar__search input::placeholder, .top-nav-bar__drawer-search input::placeholder { color: var(--top-nav-muted-fg, #bfdbfe); }\r\n.top-nav-bar__search input:focus, .top-nav-bar__drawer-search input:focus { border-color: rgb(255 255 255 / 70%); background: rgb(255 255 255 / 15%); box-shadow: 0 0 0 2px rgb(255 255 255 / 20%); }\r\n.top-nav-bar__search-clear { position: absolute; top: 50%; right: .45rem; z-index: 1; display: inline-flex; width: 1.75rem; height: 1.75rem; align-items: center; justify-content: center; transform: translateY(-50%); border: 0; border-radius: calc(var(--top-nav-radius, 8px) - 2px); background: transparent; color: var(--top-nav-muted-fg, #bfdbfe); cursor: pointer; }\r\n.top-nav-bar__search-clear:hover { background: rgb(255 255 255 / 10%); color: var(--top-nav-fg, #fff); }\r\n.top-nav-bar__search-results { position: absolute; top: calc(100% + .5rem); left: 0; z-index: 8; width: max-content; min-width: 100%; max-width: min(24rem, calc(100vw - 2rem)); max-height: 70vh; overflow: hidden; border: 1px solid var(--top-nav-menu-outline, #d7dde6); border-radius: var(--top-nav-radius, 8px); background: var(--top-nav-menu-bg, #f1f5f9); box-shadow: var(--top-nav-shadow, 0 12px 30px rgb(15 23 42 / 18%)); color: var(--top-nav-menu-fg, #0f172a); padding: .5rem; }\n.top-nav-bar__search-results-scroll { max-height: calc(70vh - 1rem); overflow-x: hidden; overflow-y: auto; overscroll-behavior: contain; scrollbar-color: var(--top-nav-menu-scrollbar-thumb, #94a3b8) transparent; scrollbar-width: thin; }\n.top-nav-bar__search-results-scroll::-webkit-scrollbar { width: .45rem; }\n.top-nav-bar__search-results-scroll::-webkit-scrollbar-track { background: transparent; }\n.top-nav-bar__search-results-scroll::-webkit-scrollbar-thumb { border: 2px solid transparent; border-radius: 999px; background: var(--top-nav-menu-scrollbar-thumb, #94a3b8); background-clip: padding-box; }\n.top-nav-bar__user-trigger { display: inline-flex; max-width: 18rem; height: var(--top-nav-action-size, 2.5rem); align-items: center; gap: .65rem; border: 1px solid var(--top-nav-border, rgb(255 255 255 / 20%)); border-radius: var(--top-nav-radius, 8px); background: rgb(255 255 255 / 10%); color: inherit; cursor: pointer; padding: .3rem .5rem; text-align: left; transition: border-color .15s ease, background-color .15s ease; }\r\n.top-nav-bar__user-trigger:hover { border-color: rgb(255 255 255 / 40%); background: rgb(255 255 255 / 15%); }\r\n.top-nav-bar__user-avatar { display: inline-flex; width: 1.75rem; height: 1.75rem; flex: 0 0 1.75rem; align-items: center; justify-content: center; overflow: hidden; border-radius: 50%; background: #fff; color: var(--top-nav-bg, #013a59); font-size: var(--top-nav-caption-font-size, .75em); font-weight: var(--top-nav-strong-font-weight, 700); object-fit: cover; }\r\n.top-nav-bar__user-details { display: flex; min-width: 0; flex-direction: column; }\r\n.top-nav-bar__user-name, .top-nav-bar__user-subtitle { max-width: 13rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n.top-nav-bar__user-name { font-size: var(--top-nav-secondary-font-size, .875em); font-weight: var(--top-nav-strong-font-weight, 700); }\r\n.top-nav-bar__user-subtitle { color: var(--top-nav-muted-fg, #bfdbfe); font-size: var(--top-nav-caption-font-size, .75em); }\r\n.top-nav-bar__chevron { margin-left: .15rem; font-size: .7em; }\r\n.top-nav-bar__popover-layer { position: absolute; top: 100%; z-index: 9; padding-top: .5rem; }\r\n.top-nav-bar__actions-layer, .top-nav-bar__user-layer, .top-nav-bar__favorites-layer { right: 0; }\r\n.top-nav-bar__small-panel { min-width: 13rem; border: 1px solid var(--top-nav-menu-outline, #d7dde6); border-radius: var(--top-nav-radius, 8px); background: var(--top-nav-menu-bg, #f1f5f9); box-shadow: var(--top-nav-shadow, 0 12px 30px rgb(15 23 42 / 18%)); color: var(--top-nav-menu-fg, #0f172a); padding: .5rem; }\r\n.top-nav-bar__user-dropdown { width: max-content; min-width: 16rem; }\r\n.top-nav-bar__user-separator { height: 1px; margin: .35rem 0; background: var(--top-nav-menu-outline, #d7dde6); }\r\n.top-nav-bar__breadcrumbs { position: relative; z-index: 3; display: flex; min-width: 0; min-height: 2.5rem; flex-wrap: wrap; align-items: center; gap: .25rem; border-top: 1px solid var(--top-nav-border, rgb(255 255 255 / 20%)); background: var(--top-nav-breadcrumb-bg, var(--top-nav-bg, #013a59)); padding: var(--top-nav-breadcrumb-padding, .25rem 1.5rem); }\r\n.top-nav-bar__crumb, .top-nav-bar__favorite-toggle { display: inline-flex; min-height: 2rem; flex: 0 0 auto; align-items: center; justify-content: center; gap: .4rem; border: 0; border-radius: calc(var(--top-nav-radius, 8px) - 2px); background: transparent; color: inherit; cursor: pointer; padding: .35rem .5rem; font-size: 1em; font-weight: var(--top-nav-strong-font-weight, 600); }\r\n.top-nav-bar__crumb:hover, .top-nav-bar__favorite-toggle:hover { background: rgb(255 255 255 / 10%); }\r\n.top-nav-bar__crumb--static { cursor: default; }\r\n.top-nav-bar__crumb--static:hover { background: transparent; }\r\n.top-nav-bar__crumb > svg { width: 1.125rem; height: 1.125rem; flex: 0 0 auto; }\r\n.top-nav-bar__separator { flex: 0 0 auto; color: var(--top-nav-muted-fg, #bfdbfe); }\r\n.top-nav-bar__dropdown { position: relative; flex: 0 0 auto; }\r\n.top-nav-bar__menu-layer { position: absolute; top: 100%; left: 0; z-index: 10; padding-top: .25rem; }\r\n.top-nav-bar__menu-panel { display: flex; max-width: calc(100vw - 1.5rem); max-height: min(70vh, 38rem); align-items: flex-start; overflow: auto; border: 6px solid var(--top-nav-menu-border, #fff); border-radius: var(--top-nav-radius, 8px); outline: 1px solid var(--top-nav-menu-outline, #d7dde6); background: var(--top-nav-menu-bg, #f1f5f9); box-shadow: var(--top-nav-shadow, 0 12px 30px rgb(15 23 42 / 18%)); color: var(--top-nav-menu-fg, #0f172a); padding: .25rem; }\r\n.top-nav-bar__section-list { width: var(--top-nav-section-width, 16rem); flex: 0 0 var(--top-nav-section-width, 16rem); padding: .25rem; }\r\n.top-nav-bar__submenu-region, .top-nav-bar__cascade-level { display: flex; align-items: flex-start; }\r\n.top-nav-bar__cascade-level { flex: 0 0 auto; padding: .25rem; }\r\n.top-nav-bar__menu-column { width: var(--top-nav-column-width, 18rem); flex: 0 0 var(--top-nav-column-width, 18rem); }\r\n.top-nav-bar__menu-item { display: flex; width: 100%; min-height: 2.25rem; align-items: center; gap: .6rem; border: 0; border-radius: calc(var(--top-nav-radius, 8px) - 2px); background: transparent; color: inherit; cursor: pointer; padding: var(--top-nav-menu-item-padding, .5rem .75rem); font-size: 1em; text-align: left; }\r\n.top-nav-bar__menu-item:hover { background: var(--top-nav-menu-hover, #e2e8f0); }\r\n.top-nav-bar__menu-item--explored { background: var(--top-nav-menu-explored, #e2e8f0); }\r\n.top-nav-bar__menu-item > i:first-child { width: 1.125rem; flex: 0 0 1.125rem; text-align: center; }\r\n.top-nav-bar__menu-label { min-width: 0; flex: 1 1 auto; line-height: var(--top-nav-item-line-height, 1.25); }\r\n.top-nav-bar__menu-arrow { margin-left: auto; flex: 0 0 auto; font-size: .7em; }\r\n.top-nav-bar__item-count, .top-nav-bar__mobile-count { color: #64748b; font-size: var(--top-nav-caption-font-size, .75em); }\r\n.top-nav-bar__current { display: inline-flex; min-width: 0; max-width: 32rem; flex: 0 1 auto; align-items: center; gap: .15rem; overflow: hidden; border-radius: calc(var(--top-nav-radius, 8px) - 2px); background: var(--top-nav-current-bg, rgb(255 255 255 / 10%)); box-shadow: inset 0 0 0 1px var(--top-nav-current-border, rgb(255 255 255 / 15%)); padding: .25rem .3rem .25rem .45rem; font-size: 1em; font-weight: var(--top-nav-strong-font-weight, 700); white-space: nowrap; }\n.top-nav-bar__current-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }\r\n.top-nav-bar__breadcrumb-actions { display: flex; min-width: 0; align-items: center; gap: .25rem; margin-left: auto; }\r\n.top-nav-bar__favorite-toggle { width: 1.5rem; min-height: 1.5rem; padding: 0; color: var(--top-nav-accent, #fbbf24); }\n.top-nav-bar__accent { color: var(--top-nav-accent, #fbbf24); }\n.top-nav-bar__favorites-panel { width: min(22rem, calc(100vw - 1.5rem)); max-height: 70vh; overflow-y: auto; }\n.top-nav-bar__favorites-measure { position: absolute; top: 0; right: 1.5rem; left: 1.5rem; z-index: -1; overflow: hidden; visibility: hidden; pointer-events: none; }\n.top-nav-bar__favorites-measure-content, .top-nav-bar__favorites-row, .top-nav-bar__favorites-list, .top-nav-bar__favorites-title, .top-nav-bar__favorites-row-item, .top-nav-bar__favorites-measure-item { display: flex; align-items: center; }\n.top-nav-bar__favorites-measure-content { width: max-content; gap: .75rem; padding: .625rem .5rem; }\n.top-nav-bar__favorites-title { flex: 0 0 auto; gap: .5rem; font-size: var(--top-nav-secondary-font-size, .875em); font-weight: var(--top-nav-strong-font-weight, 700); }\n.top-nav-bar__favorites-icon { color: var(--top-nav-accent, #fbbf24); font-size: 1.125em; }\n.top-nav-bar__favorites-measure-item { flex: 0 0 auto; gap: .25rem; font-size: var(--top-nav-secondary-font-size, .875em); font-weight: var(--top-nav-strong-font-weight, 600); }\n.top-nav-bar__favorites-separator { flex: 0 0 auto; color: #cbd5e1; font-size: var(--top-nav-secondary-font-size, .875em); }\n.top-nav-bar__favorites-row { min-height: 2.75rem; gap: .75rem; overflow: hidden; background: var(--top-nav-favorites-bg, #f8fafc); color: var(--top-nav-favorites-fg, var(--top-nav-menu-fg, #0f172a)); border-bottom: 1px solid var(--top-nav-favorites-border, #e2e8f0); box-shadow: var(--top-nav-favorites-shadow, 0 1px 2px rgb(15 23 42 / 6%)); padding: .25rem 1.5rem; }\n.top-nav-bar__favorites-list { min-width: 0; flex: 0 0 auto; gap: .25rem; }\n.top-nav-bar__favorites-row-item { flex: 0 0 auto; gap: .5rem; border: 0; background: transparent; color: inherit; cursor: pointer; padding: .25rem; font-size: var(--top-nav-secondary-font-size, .875em); font-weight: var(--top-nav-strong-font-weight, 600); }\n.top-nav-bar__favorites-row-item:hover { color: var(--top-nav-accent, #025a84); text-decoration: underline; }\n.top-nav-bar-favorites-row-enter-active, .top-nav-bar-favorites-row-leave-active { overflow: hidden; transition: max-height .22s cubic-bezier(.4, 0, .2, 1), min-height .22s cubic-bezier(.4, 0, .2, 1); }\n.top-nav-bar-favorites-row-enter-active > *, .top-nav-bar-favorites-row-leave-active > * { transition: opacity .12s ease; }\n.top-nav-bar-favorites-row-enter-from, .top-nav-bar-favorites-row-leave-to { min-height: 0; max-height: 0; }\n.top-nav-bar-favorites-row-enter-from > *, .top-nav-bar-favorites-row-leave-to > * { opacity: 0; }\n.top-nav-bar-favorites-row-enter-to, .top-nav-bar-favorites-row-leave-from { min-height: 2.75rem; max-height: 2.75rem; }\n.top-nav-bar-favorites-row-enter-to > *, .top-nav-bar-favorites-row-leave-from > * { opacity: 1; }\n.top-nav-bar-favorites-trigger-enter-active, .top-nav-bar-favorites-trigger-leave-active { overflow: hidden; transition: max-width .4s cubic-bezier(.4, 0, .2, 1), opacity .45s ease-in-out; }\n.top-nav-bar-favorites-trigger-enter-from, .top-nav-bar-favorites-trigger-leave-to { max-width: 0; opacity: 0; }\n.top-nav-bar-favorites-trigger-enter-to, .top-nav-bar-favorites-trigger-leave-from { max-width: 10rem; opacity: 1; }\n.top-nav-bar__empty, .top-nav-bar__drawer-empty { display: block; color: #64748b; padding: .75rem; font-size: var(--top-nav-secondary-font-size, .875em); }\n.top-nav-bar__mobile-drawer.p-drawer { width: var(--top-nav-drawer-width, min(22rem, calc(100vw - 1.5rem))) !important; border: 0; font-family: var(--top-nav-font-family, inherit); font-size: var(--top-nav-font-size, inherit); font-weight: var(--top-nav-font-weight, inherit); line-height: var(--top-nav-line-height, normal); }\r\n.top-nav-bar__mobile-drawer .p-drawer-content { padding: 0; }\r\n.top-nav-bar__mobile-menu { display: flex; width: 100%; height: 100%; min-height: 100%; flex-direction: column; overflow: hidden; background: var(--top-nav-drawer-bg, var(--top-nav-bg, #013a59)); color: var(--top-nav-fg, #fff); }\r\n.top-nav-bar__mobile-menu-header { display: flex; min-height: 4.75rem; flex: 0 0 auto; align-items: center; justify-content: space-between; gap: .75rem; border-bottom: 1px solid var(--top-nav-border, rgb(255 255 255 / 20%)); padding: .875rem 1rem; }\r\n.top-nav-bar__drawer-brand { min-width: 0; flex: 1 1 auto; }\r\n.top-nav-bar__drawer-tools { flex: 0 0 auto; border-bottom: 1px solid var(--top-nav-border, rgb(255 255 255 / 20%)); padding: .75rem; }\r\n.top-nav-bar__drawer-search { position: relative; }\r\n.top-nav-bar__drawer-search input { height: 2.5rem; }\r\n.top-nav-bar__drawer-action { display: flex; width: 100%; min-height: 2.75rem; align-items: center; gap: .75rem; border: 1px solid var(--top-nav-border, rgb(255 255 255 / 20%)); border-radius: var(--top-nav-radius, 8px); background: rgb(255 255 255 / 10%); color: inherit; cursor: pointer; margin-top: .625rem; padding: .65rem .75rem; font-weight: var(--top-nav-strong-font-weight, 700); text-align: left; }\r\n.top-nav-bar__drawer-action:hover, .top-nav-bar__drawer-action--active { background: rgb(255 255 255 / 18%); }\r\n.top-nav-bar__mobile-menu-scroll { min-height: 0; flex: 1 1 auto; overflow-y: auto; overscroll-behavior: contain; padding: .75rem; scrollbar-color: rgb(255 255 255 / 30%) transparent; scrollbar-width: thin; }\r\n.top-nav-bar__mobile-menu-track { min-height: 100%; border-radius: var(--top-nav-drawer-radius, 16px); background: rgb(255 255 255 / 8%); padding: .375rem; }\r\n.top-nav-bar__mobile-favorites { border-bottom: 1px solid var(--top-nav-mobile-divider, var(--top-nav-border, rgb(255 255 255 / 20%))); margin-bottom: .35rem; padding-bottom: .35rem; }\r\n.top-nav-bar__mobile-node--section { margin-top: .5rem; border-top: 1px solid var(--top-nav-mobile-divider, var(--top-nav-border, rgb(255 255 255 / 20%))); padding-top: .5rem; }\r\n.top-nav-bar__mobile-tree--nested { margin-left: .85rem; padding: var(--top-nav-mobile-submenu-padding, .5rem 0 .375rem .35rem); }\r\n.top-nav-bar__mobile-node + .top-nav-bar__mobile-node { margin-top: var(--top-nav-mobile-item-gap, .25rem); }\r\n.top-nav-bar__mobile-item { display: flex; width: 100%; min-height: 2.75rem; align-items: center; gap: .7rem; border: 0; border-radius: calc(var(--top-nav-drawer-radius, 16px) - 4px); -webkit-appearance: none; appearance: none; -webkit-tap-highlight-color: transparent; background: transparent; color: inherit; cursor: pointer; padding: var(--top-nav-menu-item-padding, .65rem .75rem); text-align: left; transition: color .2s ease, background-color .2s ease, box-shadow .2s ease; }\r\n.top-nav-bar__mobile-item:focus { background: transparent; outline: 0; }\r\n.top-nav-bar__mobile-item:focus-visible { outline: 2px solid rgb(255 255 255 / 75%); outline-offset: 2px; }\r\n.top-nav-bar__mobile-item:hover, .top-nav-bar__mobile-item:active { background: rgb(255 255 255 / 10%); }\r\n.top-nav-bar__mobile-item--active, .top-nav-bar__mobile-item--ancestor { background: var(--top-nav-mobile-active-bg, #fff); box-shadow: 0 2px 10px rgb(0 0 0 / 12%); color: var(--top-nav-mobile-active-fg, #025a84); font-weight: var(--top-nav-strong-font-weight, 700); }\r\n.top-nav-bar__mobile-item--active:hover, .top-nav-bar__mobile-item--active:active, .top-nav-bar__mobile-item--active:focus, .top-nav-bar__mobile-item--ancestor:hover, .top-nav-bar__mobile-item--ancestor:active, .top-nav-bar__mobile-item--ancestor:focus { background: var(--top-nav-mobile-active-bg, #fff); color: var(--top-nav-mobile-active-fg, #025a84); }\r\n.top-nav-bar__mobile-item > i:first-child { width: 1.125rem; flex: 0 0 1.125rem; text-align: center; }\r\n.top-nav-bar__mobile-item-label { min-width: 0; flex: 1 1 auto; line-height: var(--top-nav-item-line-height, 1.25); }\r\n.top-nav-bar__mobile-chevron { margin-left: auto; flex: 0 0 auto; font-size: .75em; transition: transform .2s ease; }\r\n.top-nav-bar__mobile-chevron--open { transform: rotate(180deg); }\r\n.top-nav-bar__mobile-footer { flex: 0 0 auto; border-top: 1px solid var(--top-nav-border, rgb(255 255 255 / 20%)); background: var(--top-nav-drawer-footer-bg, #012d47); padding: .75rem; }\r\n.top-nav-bar__drawer-user { display: flex; width: 100%; align-items: center; gap: .75rem; border: 0; border-radius: var(--top-nav-radius, 8px); -webkit-appearance: none; appearance: none; -webkit-tap-highlight-color: transparent; background: transparent; color: inherit; cursor: pointer; padding: .5rem; text-align: left; }\r\n.top-nav-bar__drawer-user:focus { background: transparent; outline: 0; }\r\n.top-nav-bar__drawer-user:focus-visible { outline: 2px solid rgb(255 255 255 / 75%); outline-offset: 2px; }\r\n.top-nav-bar__drawer-user .top-nav-bar__user-details { flex: 1 1 auto; }\r\n.top-nav-bar-menu-expand-enter-active, .top-nav-bar-menu-expand-leave-active { max-height: 60rem; overflow: hidden; transition: max-height .3s cubic-bezier(.4, 0, .2, 1), opacity .3s cubic-bezier(.4, 0, .2, 1), transform .3s cubic-bezier(.4, 0, .2, 1); }\r\n.top-nav-bar-menu-expand-enter-from, .top-nav-bar-menu-expand-leave-to { max-height: 0; opacity: 0; transform: translateY(-10px); }\r\n\r\n@media (max-width: 1023px) {\r\n .top-nav-bar__header { min-height: 3.75rem; gap: .5rem; padding: var(--top-nav-header-padding-mobile, .625rem .75rem); }\r\n .top-nav-bar__mobile-trigger { display: inline-flex; }\r\n .top-nav-bar__desktop-tools, .top-nav-bar__desktop-navigation, .top-nav-bar__desktop-navigation-separator, .top-nav-bar__desktop-only { display: none !important; }\r\n .top-nav-bar__brand { flex: 0 1 auto; }\r\n .top-nav-bar__context { flex: 1 1 auto; }\r\n .top-nav-bar__spacer { display: none; }\r\n .top-nav-bar__breadcrumbs { min-height: 2.5rem; flex-wrap: wrap; overflow-x: visible; padding: var(--top-nav-breadcrumb-padding-mobile, .25rem .75rem); }\n .top-nav-bar__favorites-measure { display: none; }\n .top-nav-bar__breadcrumb-dropdown .top-nav-bar__menu-layer { display: none; }\r\n .top-nav-bar__separator--current { display: none; }\r\n .top-nav-bar__current { width: 100%; max-width: 100%; flex: 1 1 14rem; }\r\n .top-nav-bar__breadcrumb-actions { margin-left: 0; }\r\n}\r\n\r\n@media (max-width: 639px) {\r\n .top-nav-bar__context { display: none; }\r\n .top-nav-bar__brand { flex: 1 1 auto; }\r\n .top-nav-bar__crumb, .top-nav-bar__current { font-size: var(--top-nav-caption-font-size, .75em); }\r\n .top-nav-bar__breadcrumbs { gap: .125rem; padding-inline: .5rem; }\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .top-nav-bar *, .top-nav-bar *::before, .top-nav-bar *::after { scroll-behavior: auto !important; transition-duration: .01ms !important; }\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { Home07Icon } from '@hugeicons/core-free-icons'\r\nimport { HugeiconsIcon } from '@hugeicons/vue'\r\nimport Drawer from 'primevue/drawer'\r\nimport Menu from 'primevue/menu'\r\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useSlots, watch } from 'vue'\r\nimport TopNavMobileTree from './internal/TopNavMobileTree.vue'\r\n\r\nexport type TopNavItem = {\r\n id: string\r\n label: string\r\n to?: string\r\n icon?: string\r\n disabled?: boolean\r\n children?: TopNavItem[]\r\n data?: unknown\r\n}\r\n\r\nexport type TopNavSection = TopNavItem & { children: TopNavItem[] }\r\n\r\nexport type TopNavBreadcrumb = {\r\n id: string\r\n label: string\r\n to?: string\r\n sectionId?: string\r\n menuId?: string\r\n}\r\n\r\nexport type TopNavAction = {\r\n id: string\r\n label: string\r\n icon?: string\r\n disabled?: boolean\r\n data?: unknown\r\n}\r\n\r\nexport type TopNavBarColors = {\n navigation?: string\n text?: string\n mutedText?: string\n accent?: string\n border?: string\n menuText?: string\n mobileActiveText?: string\n favoritesText?: string\n}\n\nexport type TopNavBarSurfaces = {\n breadcrumb?: string\n drawer?: string\n drawerFooter?: string\n menu?: string\n menuHover?: string\n menuExplored?: string\n mobileActive?: string\n favorites?: string\n currentPage?: string\n}\n\nexport type TopNavBarBorders = {\n menu?: string\n menuOutline?: string\n mobileDivider?: string\n favorites?: string\n currentPage?: string\n}\n\nexport type TopNavBarShape = {\n radius?: string\n drawerRadius?: string\n shadow?: string\n favoritesShadow?: string\n}\n\nexport type TopNavBarFocus = {\n onDark?: string\n onLight?: string\n}\n\nexport type TopNavBarAppearance = {\n colors?: TopNavBarColors\n surfaces?: TopNavBarSurfaces\n borders?: TopNavBarBorders\n shape?: TopNavBarShape\n focus?: TopNavBarFocus\n}\n\r\nexport type TopNavUser = {\r\n name: string\r\n subtitle?: string\r\n avatarUrl?: string\r\n initials?: string\r\n data?: unknown\r\n}\r\n\r\nexport type TopNavUserMenuItem = {\r\n id: string\r\n label: string\r\n icon?: string\r\n disabled?: boolean\r\n separator?: boolean\r\n data?: unknown\r\n}\r\n\r\ntype CompactState = {\r\n collapseActions: boolean\r\n searchIconOnly: boolean\r\n hideUserName: boolean\r\n hideContextDetails: boolean\r\n}\r\n\r\ntype RenderAction = TopNavAction & { kind: 'aia' | 'support' | 'action' }\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n sections?: TopNavSection[]\r\n breadcrumbs?: TopNavBreadcrumb[]\r\n homeItem?: TopNavItem\r\n navigationLabel?: string\r\n activeItemId?: string\r\n searchable?: boolean\r\n searchValue?: string\r\n searchPlaceholder?: string\r\n searchResults?: TopNavItem[]\r\n showAia?: boolean\r\n aiaActive?: boolean\r\n aiaLabel?: string\r\n showSupport?: boolean\r\n supportLabel?: string\r\n actions?: TopNavAction[]\r\n user?: TopNavUser\r\n userMenuItems?: TopNavUserMenuItem[]\r\n favoriteItems?: TopNavItem[]\r\n showFavoriteToggle?: boolean\r\n favoriteActive?: boolean\r\n favoriteLabel?: string\r\n mobileOpen?: boolean\r\n appearance?: TopNavBarAppearance\r\n }>(),\r\n {\r\n sections: () => [],\r\n breadcrumbs: () => [],\r\n homeItem: () => ({ id: 'home', label: 'Início', to: '/' }),\r\n navigationLabel: 'Navegação',\r\n activeItemId: '',\r\n searchable: false,\r\n searchValue: undefined,\r\n searchPlaceholder: 'Pesquisar no menu...',\r\n searchResults: undefined,\r\n showAia: false,\r\n aiaActive: false,\r\n aiaLabel: 'Aia',\r\n showSupport: false,\r\n supportLabel: 'Central de Suporte',\r\n actions: () => [],\r\n user: undefined,\r\n userMenuItems: () => [],\r\n favoriteItems: () => [],\r\n showFavoriteToggle: false,\r\n favoriteActive: false,\r\n favoriteLabel: 'Favoritos',\r\n mobileOpen: undefined,\r\n appearance: () => ({}),\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n navigate: [item: TopNavItem]\r\n search: [query: string]\r\n 'update:searchValue': [query: string]\r\n 'update:mobileOpen': [open: boolean]\r\n 'toggle-aia': []\r\n 'open-support': []\r\n 'toggle-favorite': []\r\n action: [action: TopNavAction]\r\n 'user-action': [item: TopNavUserMenuItem]\r\n 'user-click': [user: TopNavUser | undefined]\r\n}>()\r\n\r\nconst slots = useSlots()\r\nconst rootRef = ref<HTMLElement | null>(null)\nconst headerRef = ref<HTMLElement | null>(null)\nconst favoritesMeasureContainerRef = ref<HTMLElement | null>(null)\nconst favoritesMeasureContentRef = ref<HTMLElement | null>(null)\nconst searchInputRef = ref<HTMLInputElement | null>(null)\r\nconst mobileSearchInputRef = ref<HTMLInputElement | null>(null)\r\nconst mobileMenuOpen = ref(props.mobileOpen ?? false)\r\nconst navigationMenuOpen = ref(false)\r\nconst navigationSectionOpenId = ref<string | null>(null)\r\nconst navigationPath = ref<string[]>([])\r\nconst breadcrumbMenuOpenId = ref<string | null>(null)\r\nconst breadcrumbPath = ref<string[]>([])\r\nconst compactActionsOpen = ref(false)\r\nconst userMenuOpen = ref(false)\r\nconst drawerUserOpen = ref(false)\r\nconst drawerUserMenuRef = ref<{ toggle: (event: Event) => void; hide: () => void } | null>(null)\r\nconst favoritesMenuOpen = ref(false)\nconst drawerFavoritesOpen = ref(false)\nconst pageScrolled = ref(false)\nconst favoritesFitInline = ref(true)\nconst favoritesAnimationsEnabled = ref(false)\nconst searchQuery = ref(props.searchValue ?? '')\r\nconst searchFocused = ref(false)\r\nconst searchExpanded = ref(false)\r\nconst isMobileViewport = ref(false)\r\nconst headerCompact = ref<CompactState>({\r\n collapseActions: false,\r\n searchIconOnly: false,\r\n hideUserName: false,\r\n hideContextDetails: false,\r\n})\r\n\r\nlet headerResizeObserver: ResizeObserver | undefined\nlet favoritesResizeObserver: ResizeObserver | undefined\nlet resizeFrame: number | undefined\nlet favoritesAnimationFrame: number | undefined\nlet compactCalculation = 0\n\nconst FAVORITES_COLLAPSE_SCROLL = 120\nconst FAVORITES_RESTORE_SCROLL = 24\n\r\nfunction normalizedChildren(item: TopNavItem): TopNavItem[] {\r\n return (item.children ?? []).filter(Boolean).map((child) => {\r\n const children = normalizedChildren(child)\r\n if (!children.length) {\r\n const { children: _discarded, ...leaf } = child\r\n return leaf\r\n }\r\n return { ...child, children }\r\n })\r\n}\r\n\r\nconst visibleSections = computed<TopNavSection[]>(() =>\r\n props.sections\r\n .map((section) => ({ ...section, children: normalizedChildren(section) }))\r\n .filter((section) => section.children.length > 0),\r\n)\r\n\r\nfunction flattenLeaves(items: TopNavItem[], result: TopNavItem[] = []) {\r\n items.forEach((item) => {\r\n const children = item.children ?? []\r\n if (children.length) flattenLeaves(children, result)\r\n else result.push(item)\r\n })\r\n return result\r\n}\r\n\r\nconst allSearchItems = computed(() =>\r\n visibleSections.value.flatMap((section) => flattenLeaves(section.children)),\r\n)\r\n\r\nfunction normalizeText(value: string) {\r\n return value\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '')\r\n .toLocaleLowerCase('pt-BR')\r\n}\r\n\r\nconst visibleSearchResults = computed(() => {\r\n if (props.searchResults !== undefined) return props.searchResults\r\n const query = normalizeText(searchQuery.value.trim())\r\n if (!query) return allSearchItems.value\r\n return allSearchItems.value.filter((item) => normalizeText(item.label).includes(query))\r\n})\r\n\r\nfunction filterTree(items: TopNavItem[], query: string): TopNavItem[] {\r\n if (!query) return items\r\n return items.flatMap((item) => {\r\n const ownMatch = normalizeText(item.label).includes(query)\r\n const children = filterTree(item.children ?? [], query)\r\n if (!ownMatch && !children.length) return []\r\n return [{ ...item, children: ownMatch ? item.children : children }]\r\n })\r\n}\r\n\r\nconst drawerSections = computed(() =>\r\n filterTree(visibleSections.value, normalizeText(searchQuery.value.trim())),\r\n)\r\n\r\nfunction findItemPath(items: TopNavItem[], targetId: string, path: TopNavItem[] = []): TopNavItem[] | null {\r\n for (const item of items) {\r\n const nextPath = [...path, item]\r\n if (item.id === targetId) return nextPath\r\n const found = findItemPath(item.children ?? [], targetId, nextPath)\r\n if (found) return found\r\n }\r\n return null\r\n}\r\n\r\nfunction findItem(items: TopNavItem[], targetId: string): TopNavItem | null {\r\n for (const item of items) {\r\n if (item.id === targetId) return item\r\n const found = findItem(item.children ?? [], targetId)\r\n if (found) return found\r\n }\r\n return null\r\n}\r\n\r\nconst activeMenuPath = computed(() => {\r\n if (!props.activeItemId) return null\r\n for (const section of visibleSections.value) {\r\n if (section.id === props.activeItemId) return [section]\r\n const path = findItemPath(section.children, props.activeItemId)\r\n if (path) return [section, ...path]\r\n }\r\n return null\r\n})\r\n\r\nconst displayedBreadcrumbs = computed<TopNavBreadcrumb[]>(() => {\r\n if (props.breadcrumbs.length) return props.breadcrumbs\r\n const path = activeMenuPath.value\r\n if (!path?.length) return []\r\n const lastIndex = path.length - 1\r\n return path.map((item, index) => ({\r\n id: item.id,\r\n label: item.label,\r\n to: index === lastIndex ? undefined : item.to,\r\n sectionId: index === 0 ? item.id : undefined,\r\n menuId: index > 0 && item.children?.length ? item.id : undefined,\r\n }))\r\n})\r\n\r\nfunction menuForBreadcrumb(item: TopNavBreadcrumb): TopNavItem | null {\r\n if (item.menuId) return findItem(visibleSections.value, item.menuId)\r\n if (item.sectionId) {\r\n return visibleSections.value.find((section) => section.id === item.sectionId) ?? null\r\n }\r\n return null\r\n}\r\n\r\nconst selectedNavigationSection = computed(() =>\r\n visibleSections.value.find((section) => section.id === navigationSectionOpenId.value) ?? null,\r\n)\r\n\r\nfunction cascadeLevels(items: TopNavItem[], path: string[]) {\r\n const levels: TopNavItem[][] = []\r\n let current = items\r\n let depth = 0\r\n while (current.length) {\r\n levels.push(current)\r\n const openItemId = path[depth]\r\n if (!openItemId) break\r\n const openItem = current.find((item) => item.id === openItemId)\r\n if (!openItem?.children?.length) break\r\n current = openItem.children\r\n depth += 1\r\n }\r\n return levels\r\n}\r\n\r\nconst navigationLevels = computed(() =>\r\n selectedNavigationSection.value\r\n ? cascadeLevels(selectedNavigationSection.value.children, navigationPath.value)\r\n : [],\r\n)\r\n\r\nfunction chunkItems(items: TopNavItem[], size = 10) {\r\n const chunks: TopNavItem[][] = []\r\n for (let index = 0; index < items.length; index += size) chunks.push(items.slice(index, index + size))\r\n return chunks\r\n}\r\n\r\nconst quickActions = computed<RenderAction[]>(() => {\r\n const actions: RenderAction[] = []\r\n if (props.showAia) actions.push({ id: '__aia', label: props.aiaLabel, icon: 'pi pi-comments', kind: 'aia' })\r\n if (props.showSupport) actions.push({ id: '__support', label: props.supportLabel, icon: 'pi pi-headphones', kind: 'support' })\r\n props.actions.forEach((action) => actions.push({ ...action, kind: 'action' }))\r\n return actions\r\n})\r\n\r\nconst cleanUserMenuItems = computed(() => {\r\n const result: TopNavUserMenuItem[] = []\r\n props.userMenuItems.forEach((item) => {\r\n if (item.separator) {\r\n if (result.length && !result.at(-1)?.separator) result.push(item)\r\n return\r\n }\r\n result.push(item)\r\n })\r\n if (result.at(-1)?.separator) result.pop()\r\n return result\r\n})\r\n\r\nconst hasUserMenu = computed(() =>\r\n Boolean(slots['user-menu']) || cleanUserMenuItems.value.some((item) => !item.separator),\r\n)\r\nconst hasUser = computed(() => Boolean(props.user) || Boolean(slots.user))\r\nconst hasContext = computed(() => Boolean(slots.context || slots.scope || slots.client || slots['context-compact']))\r\nconst favoriteItems = computed(() => props.favoriteItems.filter(Boolean))\nconst favoritesGrouped = computed(() => pageScrolled.value || !favoritesFitInline.value)\nconst showFavoritesRow = computed(() => favoriteItems.value.length > 0 && !favoritesGrouped.value)\nconst hasDrawerContent = computed(() =>\r\n visibleSections.value.length > 0 || props.searchable || quickActions.value.length > 0 || hasUser.value ||\r\n Boolean(slots['drawer-menu'] || slots['drawer-actions'] || slots['drawer-footer']),\r\n)\r\nconst userInitials = computed(() => {\r\n if (!props.user) return ''\r\n if (props.user.initials) return props.user.initials\r\n return props.user.name.split(/\\s+/).filter(Boolean).slice(0, 2)\r\n .map((part) => part[0]?.toLocaleUpperCase('pt-BR')).join('')\r\n})\r\n\r\nconst drawerUserMenuItems = computed(() => cleanUserMenuItems.value.map((item) => {\r\n if (item.separator) return { separator: true }\r\n return {\r\n label: item.label,\r\n icon: item.icon,\r\n disabled: item.disabled,\r\n command: () => selectUserAction(item),\r\n }\r\n}))\r\n\r\nconst cssVariables = computed<Record<string, string>>(() => {\r\n const appearance = props.appearance\r\n const variables: Record<string, string> = {}\r\n const set = (name: string, value?: string) => {\r\n if (value !== undefined && value !== '') variables[name] = value\r\n }\r\n\r\n set('--top-nav-bg', appearance.colors?.navigation)\n set('--top-nav-breadcrumb-bg', appearance.surfaces?.breadcrumb ?? appearance.colors?.navigation)\n set('--top-nav-drawer-bg', appearance.surfaces?.drawer ?? appearance.colors?.navigation)\n set('--top-nav-drawer-footer-bg', appearance.surfaces?.drawerFooter)\n set('--top-nav-fg', appearance.colors?.text)\n set('--top-nav-muted-fg', appearance.colors?.mutedText)\n set('--top-nav-accent', appearance.colors?.accent)\n set('--top-nav-menu-bg', appearance.surfaces?.menu)\n set('--top-nav-menu-fg', appearance.colors?.menuText)\n set('--top-nav-menu-hover', appearance.surfaces?.menuHover)\n set('--top-nav-menu-explored', appearance.surfaces?.menuExplored)\n set('--top-nav-border', appearance.colors?.border)\n set('--top-nav-menu-border', appearance.borders?.menu)\n set('--top-nav-menu-outline', appearance.borders?.menuOutline)\n set('--top-nav-radius', appearance.shape?.radius)\n set('--top-nav-drawer-radius', appearance.shape?.drawerRadius)\n set('--top-nav-shadow', appearance.shape?.shadow)\n set('--top-nav-mobile-active-bg', appearance.surfaces?.mobileActive)\n set('--top-nav-mobile-active-fg', appearance.colors?.mobileActiveText)\n set('--top-nav-mobile-divider', appearance.borders?.mobileDivider)\n set('--top-nav-favorites-bg', appearance.surfaces?.favorites)\n set('--top-nav-favorites-fg', appearance.colors?.favoritesText)\n set('--top-nav-favorites-border', appearance.borders?.favorites)\n set('--top-nav-favorites-shadow', appearance.shape?.favoritesShadow)\n set('--top-nav-focus-ring', appearance.focus?.onDark)\n set('--top-nav-focus-ring-light', appearance.focus?.onLight)\n set('--top-nav-current-bg', appearance.surfaces?.currentPage)\n set('--top-nav-current-border', appearance.borders?.currentPage)\n return variables\n})\n\nfunction updateFavoritesScrollState() {\n const position = Math.max(0, window.scrollY)\n if (!pageScrolled.value && position >= FAVORITES_COLLAPSE_SCROLL) {\n pageScrolled.value = true\n return\n }\n if (pageScrolled.value && position <= FAVORITES_RESTORE_SCROLL) pageScrolled.value = false\n}\n\nfunction recalculateFavoriteSpace() {\n const container = favoritesMeasureContainerRef.value\n const content = favoritesMeasureContentRef.value\n if (!container || !content) return\n favoritesFitInline.value = content.scrollWidth <= container.clientWidth + 1\n}\n\nfunction enableFavoriteAnimations() {\n favoritesAnimationFrame = window.requestAnimationFrame(() => {\n favoritesAnimationFrame = window.requestAnimationFrame(() => {\n favoritesAnimationsEnabled.value = true\n })\n })\n}\n\r\nfunction supportsHover() {\r\n return typeof window !== 'undefined' && window.matchMedia?.('(hover: hover) and (pointer: fine)').matches\r\n}\r\n\r\nfunction selectItem(item: TopNavItem) {\r\n if (item.disabled) return\r\n emit('navigate', item)\r\n mobileMenuOpen.value = false\r\n closeDesktopPopovers()\r\n}\r\n\r\nfunction performQuickAction(action: RenderAction, closeDrawer = false) {\r\n if (action.disabled) return\r\n if (action.kind === 'aia') emit('toggle-aia')\r\n else if (action.kind === 'support') emit('open-support')\r\n else emit('action', action)\r\n compactActionsOpen.value = false\r\n if (closeDrawer) mobileMenuOpen.value = false\r\n}\r\n\r\nfunction selectUserAction(item: TopNavUserMenuItem, closeDrawer = false) {\r\n if (item.disabled || item.separator) return\r\n emit('user-action', item)\r\n userMenuOpen.value = false\r\n drawerUserOpen.value = false\r\n if (closeDrawer) mobileMenuOpen.value = false\r\n}\r\n\r\nfunction toggleDrawerUserMenu(event: MouseEvent) {\r\n if (!hasUserMenu.value) {\r\n emit('user-click', props.user)\r\n return\r\n }\r\n drawerUserMenuRef.value?.toggle(event)\r\n}\r\n\r\nfunction updateSearch(query: string) {\r\n searchQuery.value = query\r\n emit('update:searchValue', query)\r\n emit('search', query)\r\n}\r\n\r\nfunction clearSearch() {\r\n updateSearch('')\r\n nextTick(() => mobileMenuOpen.value ? mobileSearchInputRef.value?.focus() : searchInputRef.value?.focus())\r\n}\r\n\r\nfunction openNavigationByHover() {\r\n if (supportsHover()) navigationMenuOpen.value = true\r\n}\r\n\r\nfunction closeNavigationByLeave() {\r\n if (!supportsHover() || window.innerWidth < 1024) return\r\n navigationMenuOpen.value = false\r\n navigationSectionOpenId.value = null\r\n navigationPath.value = []\r\n}\r\n\r\nfunction toggleNavigation() {\r\n if (supportsHover()) {\r\n navigationMenuOpen.value = true\r\n return\r\n }\r\n navigationMenuOpen.value = !navigationMenuOpen.value\r\n if (!navigationMenuOpen.value) {\r\n navigationSectionOpenId.value = null\r\n navigationPath.value = []\r\n }\r\n}\r\n\r\nfunction exploreNavigationSection(sectionId: string) {\r\n if (!supportsHover()) return\r\n navigationSectionOpenId.value = sectionId\r\n navigationPath.value = []\r\n}\r\n\r\nfunction toggleNavigationSection(sectionId: string) {\r\n if (supportsHover()) {\r\n navigationSectionOpenId.value = sectionId\r\n navigationPath.value = []\r\n return\r\n }\r\n const closing = navigationSectionOpenId.value === sectionId\r\n navigationSectionOpenId.value = closing ? null : sectionId\r\n navigationPath.value = []\r\n}\r\n\r\nfunction setCascadeItem(path: typeof navigationPath, item: TopNavItem, level: number, hover: boolean) {\r\n if (hover && !supportsHover()) return\r\n const current = path.value[level]\r\n if (!item.children?.length) {\r\n path.value = path.value.slice(0, level)\r\n if (!hover) selectItem(item)\r\n return\r\n }\r\n if (!hover && supportsHover()) {\r\n path.value = [...path.value.slice(0, level), item.id]\r\n return\r\n }\r\n path.value = current === item.id && !hover\r\n ? path.value.slice(0, level)\r\n : [...path.value.slice(0, level), item.id]\r\n}\r\n\r\nfunction setNavigationCascadeItem(item: TopNavItem, level: number, hover: boolean) {\r\n setCascadeItem(navigationPath, item, level, hover)\r\n}\r\n\r\nfunction setBreadcrumbCascadeItem(item: TopNavItem, level: number, hover: boolean) {\r\n setCascadeItem(breadcrumbPath, item, level, hover)\r\n}\r\n\r\nfunction openBreadcrumbByHover(id: string) {\r\n if (!supportsHover()) return\r\n breadcrumbMenuOpenId.value = id\r\n breadcrumbPath.value = []\r\n}\r\n\r\nfunction closeBreadcrumbByLeave() {\r\n if (!supportsHover() || window.innerWidth < 1024) return\r\n breadcrumbMenuOpenId.value = null\r\n breadcrumbPath.value = []\r\n}\r\n\r\nfunction toggleBreadcrumb(id: string) {\r\n if (supportsHover()) {\r\n breadcrumbMenuOpenId.value = id\r\n return\r\n }\r\n breadcrumbMenuOpenId.value = breadcrumbMenuOpenId.value === id ? null : id\r\n breadcrumbPath.value = []\r\n}\r\n\r\nfunction closeDesktopPopovers() {\r\n navigationMenuOpen.value = false\r\n navigationSectionOpenId.value = null\r\n navigationPath.value = []\r\n breadcrumbMenuOpenId.value = null\r\n breadcrumbPath.value = []\r\n compactActionsOpen.value = false\r\n userMenuOpen.value = false\r\n favoritesMenuOpen.value = false\r\n searchFocused.value = false\r\n}\r\n\r\nasync function openSearch() {\r\n if (typeof window !== 'undefined' && window.innerWidth < 1024) {\r\n mobileMenuOpen.value = true\r\n await nextTick()\r\n mobileSearchInputRef.value?.focus()\r\n return\r\n }\r\n searchExpanded.value = true\r\n searchFocused.value = true\r\n await nextTick()\r\n searchInputRef.value?.focus()\r\n scheduleHeaderCalculation()\r\n}\r\n\r\nfunction handleSearchBlur() {\r\n window.setTimeout(() => {\r\n searchFocused.value = false\r\n if (headerCompact.value.searchIconOnly && !searchQuery.value.trim()) {\r\n searchExpanded.value = false\r\n scheduleHeaderCalculation()\r\n }\r\n }, 150)\r\n}\r\n\r\nfunction viewportWidth() {\r\n return Math.round(window.visualViewport?.width ?? window.innerWidth)\r\n}\r\n\r\nasync function recalculateHeaderCompactness() {\r\n if (typeof window === 'undefined' || !headerRef.value) return\r\n const calculation = ++compactCalculation\r\n const width = viewportWidth()\r\n isMobileViewport.value = width < 1024\r\n const normal: CompactState = { collapseActions: false, searchIconOnly: false, hideUserName: false, hideContextDetails: false }\r\n if (width < 1024) {\r\n headerCompact.value = normal\r\n searchExpanded.value = false\r\n return\r\n }\r\n headerCompact.value = {\r\n collapseActions: width < 1440,\r\n searchIconOnly: width < 1320,\r\n hideUserName: width < 1180,\r\n hideContextDetails: false,\r\n }\r\n await nextTick()\r\n if (calculation !== compactCalculation) return\r\n const steps: Array<keyof CompactState> = ['collapseActions', 'searchIconOnly', 'hideUserName', 'hideContextDetails']\r\n for (const step of steps) {\r\n const header = headerRef.value\r\n if (!header || header.scrollWidth <= header.clientWidth + 1) break\r\n headerCompact.value = { ...headerCompact.value, [step]: true }\r\n await nextTick()\r\n if (calculation !== compactCalculation) return\r\n }\r\n}\r\n\r\nfunction scheduleHeaderCalculation() {\r\n if (typeof window === 'undefined') return\r\n if (resizeFrame !== undefined) window.cancelAnimationFrame(resizeFrame)\r\n resizeFrame = window.requestAnimationFrame(() => {\r\n resizeFrame = undefined\r\n void recalculateHeaderCompactness()\r\n })\r\n}\r\n\r\nfunction handlePointerDown(event: PointerEvent) {\r\n const target = event.target\r\n if (!(target instanceof Element)) return\r\n if (target.closest('.top-nav-bar__mobile-menu')) return\r\n if (!rootRef.value?.contains(target)) {\r\n closeDesktopPopovers()\r\n return\r\n }\r\n if (!target.closest('[data-top-nav-navigation]')) {\r\n navigationMenuOpen.value = false\r\n navigationSectionOpenId.value = null\r\n navigationPath.value = []\r\n }\r\n if (!target.closest('[data-top-nav-breadcrumb]')) {\r\n breadcrumbMenuOpenId.value = null\r\n breadcrumbPath.value = []\r\n }\r\n if (!target.closest('[data-top-nav-actions]')) compactActionsOpen.value = false\r\n if (!target.closest('[data-top-nav-user]')) userMenuOpen.value = false\r\n if (!target.closest('[data-top-nav-favorites]')) favoritesMenuOpen.value = false\r\n if (!target.closest('[data-top-nav-search]')) searchFocused.value = false\r\n}\r\n\r\nfunction handleKeydown(event: KeyboardEvent) {\r\n if ((event.ctrlKey || event.metaKey) && event.key.toLocaleLowerCase() === 'k' && props.searchable) {\r\n event.preventDefault()\r\n void openSearch()\r\n return\r\n }\r\n if (event.key !== 'Escape') return\r\n if (drawerUserOpen.value) {\r\n drawerUserMenuRef.value?.hide()\r\n return\r\n }\r\n if (mobileMenuOpen.value) mobileMenuOpen.value = false\r\n closeDesktopPopovers()\r\n if (headerCompact.value.searchIconOnly && !searchQuery.value.trim()) searchExpanded.value = false\r\n}\r\n\r\nfunction toggleUserMenu() {\r\n if (!hasUserMenu.value) {\r\n emit('user-click', props.user)\r\n return\r\n }\r\n if (supportsHover()) {\r\n userMenuOpen.value = true\r\n return\r\n }\r\n userMenuOpen.value = !userMenuOpen.value\r\n}\r\n\r\nfunction toggleFavoritesMenu() {\r\n if (supportsHover()) {\r\n favoritesMenuOpen.value = true\r\n return\r\n }\r\n favoritesMenuOpen.value = !favoritesMenuOpen.value\r\n}\r\n\r\nwatch(() => props.searchValue, (value) => {\r\n if (value !== undefined && value !== searchQuery.value) searchQuery.value = value\r\n})\r\nwatch(() => props.mobileOpen, (value) => {\r\n if (value !== undefined && value !== mobileMenuOpen.value) mobileMenuOpen.value = value\r\n})\r\nwatch(mobileMenuOpen, (value) => emit('update:mobileOpen', value))\nwatch([visibleSections, () => props.user, quickActions], () => nextTick(scheduleHeaderCalculation), { deep: true })\nwatch(favoriteItems, () => nextTick(recalculateFavoriteSpace), { deep: true })\n\r\nonMounted(() => {\r\n document.addEventListener('keydown', handleKeydown)\r\n document.addEventListener('pointerdown', handlePointerDown)\r\n window.addEventListener('resize', scheduleHeaderCalculation)\n window.visualViewport?.addEventListener('resize', scheduleHeaderCalculation)\n window.addEventListener('resize', recalculateFavoriteSpace)\n window.addEventListener('scroll', updateFavoritesScrollState, { passive: true })\n if (typeof ResizeObserver !== 'undefined') {\n headerResizeObserver = new ResizeObserver(scheduleHeaderCalculation)\r\n if (headerRef.value) headerResizeObserver.observe(headerRef.value)\n favoritesResizeObserver = new ResizeObserver(recalculateFavoriteSpace)\n if (favoritesMeasureContainerRef.value) favoritesResizeObserver.observe(favoritesMeasureContainerRef.value)\n }\n scheduleHeaderCalculation()\n nextTick(() => {\n recalculateFavoriteSpace()\n updateFavoritesScrollState()\n enableFavoriteAnimations()\n })\n})\r\n\r\nonBeforeUnmount(() => {\r\n document.removeEventListener('keydown', handleKeydown)\r\n document.removeEventListener('pointerdown', handlePointerDown)\r\n window.removeEventListener('resize', scheduleHeaderCalculation)\n window.visualViewport?.removeEventListener('resize', scheduleHeaderCalculation)\n window.removeEventListener('resize', recalculateFavoriteSpace)\n window.removeEventListener('scroll', updateFavoritesScrollState)\n headerResizeObserver?.disconnect()\n favoritesResizeObserver?.disconnect()\n if (resizeFrame !== undefined) window.cancelAnimationFrame(resizeFrame)\n if (favoritesAnimationFrame !== undefined) window.cancelAnimationFrame(favoritesAnimationFrame)\n})\r\n\r\ndefineExpose({\r\n close: closeDesktopPopovers,\r\n closeDrawer: () => { mobileMenuOpen.value = false },\r\n focusSearch: openSearch,\r\n openDrawer: () => { mobileMenuOpen.value = true },\r\n})\r\n</script>\r\n\r\n<template>\r\n <nav ref=\"rootRef\" class=\"top-nav-bar top-solutions-component\" :style=\"cssVariables\" aria-label=\"Navegação principal\">\r\n <header ref=\"headerRef\" class=\"top-nav-bar__header\" :class=\"{ 'top-nav-bar__header--context-compact': headerCompact.hideContextDetails }\">\r\n <button v-if=\"hasDrawerContent\" class=\"top-nav-bar__mobile-trigger top-nav-bar__square-button\" type=\"button\" aria-label=\"Abrir navegação\" :aria-expanded=\"mobileMenuOpen\" @click=\"mobileMenuOpen = !mobileMenuOpen\">\r\n <i class=\"pi pi-bars\" aria-hidden=\"true\" />\r\n </button>\r\n\r\n <div class=\"top-nav-bar__brand\"><slot name=\"brand\" :compact=\"headerCompact.hideContextDetails\" /></div>\r\n <div v-if=\"hasContext\" class=\"top-nav-bar__context\">\r\n <slot v-if=\"headerCompact.hideContextDetails && $slots['context-compact']\" name=\"context-compact\" />\r\n <slot v-else-if=\"$slots.context\" name=\"context\" :compact=\"headerCompact.hideContextDetails\" />\r\n <slot v-else-if=\"$slots.scope\" name=\"scope\" :compact=\"headerCompact.hideContextDetails\" />\r\n <slot v-else name=\"client\" :compact=\"headerCompact.hideContextDetails\" />\r\n </div>\r\n <div class=\"top-nav-bar__spacer\" aria-hidden=\"true\" />\r\n\r\n <div class=\"top-nav-bar__desktop-tools\">\r\n <div v-if=\"searchable\" class=\"top-nav-bar__search-shell\" data-top-nav-search>\r\n <button v-if=\"headerCompact.searchIconOnly && !searchExpanded\" class=\"top-nav-bar__square-button\" type=\"button\" aria-label=\"Pesquisar no menu\" title=\"Pesquisar no menu (Ctrl+K)\" @click=\"openSearch\">\r\n <i class=\"pi pi-search\" aria-hidden=\"true\" />\r\n </button>\r\n <div v-else class=\"top-nav-bar__search\" :class=\"{ 'top-nav-bar__search--expanded': searchExpanded }\">\r\n <i class=\"pi pi-search\" aria-hidden=\"true\" />\r\n <input ref=\"searchInputRef\" :value=\"searchQuery\" type=\"text\" role=\"searchbox\" :placeholder=\"searchPlaceholder\" aria-label=\"Pesquisar no menu\" @focus=\"searchFocused = true\" @blur=\"handleSearchBlur\" @input=\"updateSearch(($event.target as HTMLInputElement).value)\" />\n <button v-if=\"searchQuery || (headerCompact.searchIconOnly && searchExpanded)\" class=\"top-nav-bar__search-clear\" type=\"button\" :aria-label=\"searchQuery ? 'Limpar pesquisa' : 'Fechar pesquisa'\" @mousedown.prevent @click=\"searchQuery ? clearSearch() : (searchExpanded = false)\">\r\n <i class=\"pi pi-times\" aria-hidden=\"true\" />\r\n </button>\r\n <div v-if=\"searchFocused\" class=\"top-nav-bar__search-results\" role=\"menu\">\n <div class=\"top-nav-bar__search-results-scroll\">\n <slot name=\"search-results\" :items=\"visibleSearchResults\" :select=\"selectItem\">\n <button v-for=\"item in visibleSearchResults\" :key=\"item.id\" class=\"top-nav-bar__menu-item\" type=\"button\" role=\"menuitem\" :disabled=\"item.disabled\" @mousedown.prevent @click=\"selectItem(item)\">\n <i v-if=\"item.icon\" :class=\"item.icon\" aria-hidden=\"true\" /><span>{{ item.label }}</span>\n </button>\n <span v-if=\"!visibleSearchResults.length\" class=\"top-nav-bar__empty\">Nenhum item encontrado.</span>\n </slot>\n </div>\n </div>\n </div>\r\n </div>\r\n\r\n <div v-if=\"quickActions.length\" class=\"top-nav-bar__quick-actions\" data-top-nav-actions>\r\n <template v-if=\"!headerCompact.collapseActions\">\r\n <button v-for=\"actionItem in quickActions\" :key=\"actionItem.id\" class=\"top-nav-bar__square-button\" :class=\"{ 'top-nav-bar__square-button--active': actionItem.kind === 'aia' && aiaActive }\" type=\"button\" :disabled=\"actionItem.disabled\" :aria-label=\"actionItem.label\" :aria-pressed=\"actionItem.kind === 'aia' ? aiaActive : undefined\" :title=\"actionItem.label\" @click=\"performQuickAction(actionItem)\">\r\n <slot v-if=\"actionItem.kind === 'aia'\" name=\"aia-icon\"><i :class=\"actionItem.icon\" aria-hidden=\"true\" /></slot>\r\n <slot v-else-if=\"actionItem.kind === 'support'\" name=\"support-icon\"><i :class=\"actionItem.icon\" aria-hidden=\"true\" /></slot>\r\n <i v-else :class=\"actionItem.icon\" aria-hidden=\"true\" />\r\n </button>\r\n </template>\r\n <template v-else>\r\n <button class=\"top-nav-bar__square-button\" type=\"button\" aria-label=\"Mais ações\" :aria-expanded=\"compactActionsOpen\" @click=\"compactActionsOpen = !compactActionsOpen\"><i class=\"pi pi-ellipsis-h\" aria-hidden=\"true\" /></button>\r\n <div v-if=\"compactActionsOpen\" class=\"top-nav-bar__popover-layer top-nav-bar__actions-layer\">\r\n <div class=\"top-nav-bar__small-panel\" role=\"menu\">\r\n <button v-for=\"actionItem in quickActions\" :key=\"actionItem.id\" class=\"top-nav-bar__menu-item\" type=\"button\" role=\"menuitem\" :disabled=\"actionItem.disabled\" @click=\"performQuickAction(actionItem)\">\r\n <i :class=\"actionItem.icon\" aria-hidden=\"true\" /><span>{{ actionItem.label }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <div v-if=\"$slots.actions\" class=\"top-nav-bar__custom-actions\"><slot name=\"actions\" :compact=\"headerCompact.collapseActions\" :close=\"closeDesktopPopovers\" /></div>\r\n\r\n <div v-if=\"hasUser\" class=\"top-nav-bar__user-menu\" data-top-nav-user @mouseenter=\"hasUserMenu && supportsHover() && (userMenuOpen = true)\" @mouseleave=\"supportsHover() && (userMenuOpen = false)\">\r\n <button class=\"top-nav-bar__user-trigger\" type=\"button\" :aria-haspopup=\"hasUserMenu ? 'menu' : undefined\" :aria-expanded=\"hasUserMenu ? userMenuOpen : undefined\" @click=\"toggleUserMenu\">\r\n <slot name=\"user\" :user=\"user\" :compact=\"headerCompact.hideUserName\">\r\n <img v-if=\"user?.avatarUrl\" :src=\"user.avatarUrl\" alt=\"\" class=\"top-nav-bar__user-avatar\" />\r\n <span v-else class=\"top-nav-bar__user-avatar\">{{ userInitials }}</span>\r\n <span v-if=\"user && !headerCompact.hideUserName\" class=\"top-nav-bar__user-details\"><span class=\"top-nav-bar__user-name\">{{ user.name }}</span><span v-if=\"user.subtitle\" class=\"top-nav-bar__user-subtitle\">{{ user.subtitle }}</span></span>\r\n </slot>\r\n <i v-if=\"hasUserMenu\" class=\"pi pi-chevron-down top-nav-bar__chevron\" aria-hidden=\"true\" />\r\n </button>\r\n <div v-if=\"hasUserMenu && userMenuOpen\" class=\"top-nav-bar__popover-layer top-nav-bar__user-layer\">\r\n <div class=\"top-nav-bar__small-panel top-nav-bar__user-dropdown\" role=\"menu\">\r\n <slot name=\"user-menu\" :items=\"cleanUserMenuItems\" :select=\"selectUserAction\">\r\n <template v-for=\"item in cleanUserMenuItems\" :key=\"item.id\">\r\n <div v-if=\"item.separator\" class=\"top-nav-bar__user-separator\" role=\"separator\" />\r\n <button v-else class=\"top-nav-bar__menu-item\" type=\"button\" role=\"menuitem\" :disabled=\"item.disabled\" @click=\"selectUserAction(item)\"><i v-if=\"item.icon\" :class=\"item.icon\" aria-hidden=\"true\" /><span>{{ item.label }}</span></button>\r\n </template>\r\n </slot>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </header>\r\n\r\n <div class=\"top-nav-bar__breadcrumbs\" aria-label=\"Breadcrumb\">\r\n <button class=\"top-nav-bar__crumb\" type=\"button\" @click=\"selectItem(homeItem)\"><HugeiconsIcon :icon=\"Home07Icon\" /><span>{{ homeItem.label }}</span></button>\r\n <span v-if=\"visibleSections.length\" class=\"top-nav-bar__separator top-nav-bar__desktop-navigation-separator\" aria-hidden=\"true\">/</span>\r\n\r\n <div v-if=\"visibleSections.length\" class=\"top-nav-bar__dropdown top-nav-bar__desktop-navigation\" data-top-nav-navigation @mouseenter=\"openNavigationByHover\" @mouseleave=\"closeNavigationByLeave\">\r\n <button class=\"top-nav-bar__crumb\" type=\"button\" aria-haspopup=\"menu\" :aria-expanded=\"navigationMenuOpen\" @click=\"toggleNavigation\"><i class=\"pi pi-bars\" aria-hidden=\"true\" /><span>{{ navigationLabel }}</span><i class=\"pi pi-chevron-down top-nav-bar__chevron\" aria-hidden=\"true\" /></button>\r\n <div v-if=\"navigationMenuOpen\" class=\"top-nav-bar__menu-layer\">\r\n <div class=\"top-nav-bar__menu-panel\" role=\"menu\">\r\n <div class=\"top-nav-bar__section-list\">\r\n <button v-for=\"section in visibleSections\" :key=\"section.id\" class=\"top-nav-bar__menu-item\" :class=\"{ 'top-nav-bar__menu-item--explored': navigationSectionOpenId === section.id }\" type=\"button\" role=\"menuitem\" aria-haspopup=\"menu\" :aria-expanded=\"navigationSectionOpenId === section.id\" @mouseenter=\"exploreNavigationSection(section.id)\" @click=\"toggleNavigationSection(section.id)\">\r\n <i v-if=\"section.icon\" :class=\"section.icon\" aria-hidden=\"true\" /><span class=\"top-nav-bar__menu-label\">{{ section.label }}</span><span class=\"top-nav-bar__item-count\">{{ section.children.length }}</span><i class=\"pi pi-chevron-right top-nav-bar__menu-arrow\" aria-hidden=\"true\" />\r\n </button>\r\n </div>\r\n <div v-if=\"selectedNavigationSection\" class=\"top-nav-bar__submenu-region\">\r\n <div v-for=\"(levelItems, levelIndex) in navigationLevels\" :key=\"`navigation-level-${levelIndex}`\" class=\"top-nav-bar__cascade-level\" :class=\"{ 'top-nav-bar__section-items': levelIndex === 0 }\" role=\"menu\">\r\n <div v-for=\"(column, columnIndex) in chunkItems(levelItems)\" :key=\"`navigation-${levelIndex}-${columnIndex}`\" class=\"top-nav-bar__menu-column\">\r\n <button v-for=\"item in column\" :key=\"item.id\" class=\"top-nav-bar__menu-item\" :class=\"{ 'top-nav-bar__menu-item--explored': navigationPath[levelIndex] === item.id }\" type=\"button\" role=\"menuitem\" :disabled=\"item.disabled\" :aria-haspopup=\"item.children?.length ? 'menu' : undefined\" :aria-expanded=\"item.children?.length ? navigationPath[levelIndex] === item.id : undefined\" @mouseenter=\"setNavigationCascadeItem(item, levelIndex, true)\" @click=\"setNavigationCascadeItem(item, levelIndex, false)\">\r\n <i v-if=\"item.icon\" :class=\"item.icon\" aria-hidden=\"true\" /><span class=\"top-nav-bar__menu-label\">{{ item.label }}</span><i v-if=\"item.children?.length\" class=\"pi pi-chevron-right top-nav-bar__menu-arrow\" aria-hidden=\"true\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <template v-for=\"(breadcrumb, index) in displayedBreadcrumbs\" :key=\"breadcrumb.id\">\r\n <span class=\"top-nav-bar__separator\" :class=\"{ 'top-nav-bar__separator--current': !breadcrumb.to && index === displayedBreadcrumbs.length - 1 }\" aria-hidden=\"true\">/</span>\r\n <div v-if=\"menuForBreadcrumb(breadcrumb)?.children?.length\" class=\"top-nav-bar__dropdown top-nav-bar__breadcrumb-dropdown\" data-top-nav-breadcrumb @mouseenter=\"!isMobileViewport && openBreadcrumbByHover(breadcrumb.id)\" @mouseleave=\"!isMobileViewport && closeBreadcrumbByLeave()\">\r\n <span v-if=\"isMobileViewport\" class=\"top-nav-bar__crumb top-nav-bar__crumb--static\">{{ breadcrumb.label }}</span>\r\n <button v-else class=\"top-nav-bar__crumb\" type=\"button\" aria-haspopup=\"menu\" :aria-expanded=\"breadcrumbMenuOpenId === breadcrumb.id\" @click=\"toggleBreadcrumb(breadcrumb.id)\"><span>{{ breadcrumb.label }}</span><i class=\"pi pi-chevron-down top-nav-bar__chevron\" aria-hidden=\"true\" /></button>\r\n <div v-if=\"!isMobileViewport && breadcrumbMenuOpenId === breadcrumb.id\" class=\"top-nav-bar__menu-layer\">\r\n <div class=\"top-nav-bar__menu-panel top-nav-bar__breadcrumb-panel\" role=\"menu\">\r\n <div v-for=\"(levelItems, levelIndex) in cascadeLevels(menuForBreadcrumb(breadcrumb)?.children ?? [], breadcrumbPath)\" :key=\"`breadcrumb-${breadcrumb.id}-${levelIndex}`\" class=\"top-nav-bar__cascade-level\" :class=\"{ 'top-nav-bar__breadcrumb-main-items': levelIndex === 0 }\">\r\n <div v-for=\"(column, columnIndex) in chunkItems(levelItems)\" :key=\"`breadcrumb-${breadcrumb.id}-${levelIndex}-${columnIndex}`\" class=\"top-nav-bar__menu-column\">\r\n <button v-for=\"item in column\" :key=\"item.id\" class=\"top-nav-bar__menu-item\" :class=\"{ 'top-nav-bar__menu-item--explored': breadcrumbPath[levelIndex] === item.id }\" type=\"button\" role=\"menuitem\" :disabled=\"item.disabled\" @mouseenter=\"setBreadcrumbCascadeItem(item, levelIndex, true)\" @click=\"setBreadcrumbCascadeItem(item, levelIndex, false)\">\r\n <i v-if=\"item.icon\" :class=\"item.icon\" aria-hidden=\"true\" /><span class=\"top-nav-bar__menu-label\">{{ item.label }}</span><i v-if=\"item.children?.length\" class=\"pi pi-chevron-right top-nav-bar__menu-arrow\" aria-hidden=\"true\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button v-else-if=\"breadcrumb.to\" class=\"top-nav-bar__crumb\" type=\"button\" @click=\"selectItem(breadcrumb)\">{{ breadcrumb.label }}</button>\r\n <span v-else class=\"top-nav-bar__current\" :title=\"breadcrumb.label\"><span class=\"top-nav-bar__current-label\">{{ breadcrumb.label }}</span><button v-if=\"showFavoriteToggle\" class=\"top-nav-bar__favorite-toggle\" type=\"button\" :aria-label=\"favoriteActive ? 'Remover dos favoritos' : 'Adicionar aos favoritos'\" :aria-pressed=\"favoriteActive\" @click.stop=\"emit('toggle-favorite')\"><i :class=\"favoriteActive ? 'pi pi-star-fill' : 'pi pi-star'\" aria-hidden=\"true\" /></button></span>\r\n </template>\r\n\r\n <div class=\"top-nav-bar__breadcrumb-actions\">\n <Transition name=\"top-nav-bar-favorites-trigger\" :css=\"favoritesAnimationsEnabled\"><div v-if=\"favoritesGrouped && favoriteItems.length\" class=\"top-nav-bar__favorites-menu top-nav-bar__desktop-only\" data-top-nav-favorites @mouseenter=\"supportsHover() && (favoritesMenuOpen = true)\" @mouseleave=\"supportsHover() && (favoritesMenuOpen = false)\">\n <button class=\"top-nav-bar__crumb\" type=\"button\" aria-haspopup=\"menu\" :aria-expanded=\"favoritesMenuOpen\" @click=\"toggleFavoritesMenu\"><i class=\"pi pi-star-fill top-nav-bar__accent\" aria-hidden=\"true\" /><span>{{ favoriteLabel }}</span><i class=\"pi pi-chevron-down top-nav-bar__chevron\" aria-hidden=\"true\" /></button>\n <div v-if=\"favoritesMenuOpen\" class=\"top-nav-bar__popover-layer top-nav-bar__favorites-layer\"><div class=\"top-nav-bar__small-panel top-nav-bar__favorites-panel\" role=\"menu\">\n <button v-for=\"item in favoriteItems\" :key=\"item.id\" class=\"top-nav-bar__menu-item\" type=\"button\" role=\"menuitem\" :disabled=\"item.disabled\" @click=\"selectItem(item)\"><i v-if=\"item.icon\" :class=\"item.icon\" aria-hidden=\"true\" /><span>{{ item.label }}</span></button>\n </div></div>\n </div></Transition>\n <slot name=\"breadcrumb-actions\" />\n </div>\n </div>\n\n <div ref=\"favoritesMeasureContainerRef\" class=\"top-nav-bar__favorites-measure\" aria-hidden=\"true\"><div ref=\"favoritesMeasureContentRef\" class=\"top-nav-bar__favorites-measure-content\"><span class=\"top-nav-bar__favorites-title\"><i class=\"pi pi-star-fill top-nav-bar__favorites-icon\" aria-hidden=\"true\" /><span>{{ favoriteLabel }}</span></span><span v-for=\"(item, index) in favoriteItems\" :key=\"`measure-${item.id}`\" class=\"top-nav-bar__favorites-measure-item\"><span v-if=\"index > 0\" class=\"top-nav-bar__favorites-separator\">|</span><span><i v-if=\"item.icon\" :class=\"item.icon\" aria-hidden=\"true\" /> {{ item.label }}</span></span></div></div>\n\n <Transition name=\"top-nav-bar-favorites-row\" :css=\"favoritesAnimationsEnabled\"><div v-if=\"showFavoritesRow\" class=\"top-nav-bar__favorites-row top-nav-bar__desktop-only\"><span class=\"top-nav-bar__favorites-title\"><i class=\"pi pi-star-fill top-nav-bar__favorites-icon\" aria-hidden=\"true\" /><span>{{ favoriteLabel }}</span></span><div class=\"top-nav-bar__favorites-list\"><template v-for=\"(item, index) in favoriteItems\" :key=\"`row-${item.id}`\"><span v-if=\"index > 0\" class=\"top-nav-bar__favorites-separator\" aria-hidden=\"true\">|</span><button class=\"top-nav-bar__favorites-row-item\" type=\"button\" :disabled=\"item.disabled\" @click=\"selectItem(item)\"><i v-if=\"item.icon\" :class=\"item.icon\" aria-hidden=\"true\" /><span>{{ item.label }}</span></button></template></div></div></Transition>\n\n <Drawer v-model:visible=\"mobileMenuOpen\" position=\"left\" class=\"top-nav-bar__mobile-drawer\" :style=\"[cssVariables, { width: 'var(--top-nav-drawer-width, min(22rem, calc(100vw - 1.5rem)))' }]\">\n <template #container=\"{ closeCallback }\">\r\n <div class=\"top-nav-bar__mobile-menu\">\r\n <header class=\"top-nav-bar__mobile-menu-header\">\r\n <slot name=\"drawer-header\" :close=\"closeCallback\">\r\n <div class=\"top-nav-bar__drawer-brand\"><slot name=\"drawer-brand\"><slot name=\"brand\" :compact=\"false\" /></slot></div>\r\n <button class=\"top-nav-bar__drawer-close top-nav-bar__square-button\" type=\"button\" aria-label=\"Fechar navegação\" @click=\"closeCallback\"><i class=\"pi pi-times\" aria-hidden=\"true\" /></button>\r\n </slot>\r\n </header>\r\n\r\n <div v-if=\"searchable || quickActions.length || $slots['drawer-actions']\" class=\"top-nav-bar__drawer-tools\">\r\n <slot v-if=\"searchable\" name=\"drawer-search\" :query=\"searchQuery\" :update=\"updateSearch\" :clear=\"clearSearch\">\r\n <div class=\"top-nav-bar__drawer-search\"><i class=\"pi pi-search\" aria-hidden=\"true\" /><input ref=\"mobileSearchInputRef\" :value=\"searchQuery\" type=\"text\" role=\"searchbox\" :placeholder=\"searchPlaceholder\" aria-label=\"Pesquisar no menu\" @input=\"updateSearch(($event.target as HTMLInputElement).value)\" /><button v-if=\"searchQuery\" class=\"top-nav-bar__search-clear\" type=\"button\" aria-label=\"Limpar pesquisa\" @click=\"clearSearch\"><i class=\"pi pi-times\" aria-hidden=\"true\" /></button></div>\n </slot>\r\n <slot name=\"drawer-actions\" :actions=\"quickActions\" :select=\"(actionItem: RenderAction) => performQuickAction(actionItem, true)\" :close=\"closeCallback\">\r\n <button v-for=\"actionItem in quickActions\" :key=\"`drawer-${actionItem.id}`\" class=\"top-nav-bar__drawer-action\" :class=\"{ 'top-nav-bar__drawer-action--active': actionItem.kind === 'aia' && aiaActive }\" type=\"button\" :disabled=\"actionItem.disabled\" @click=\"performQuickAction(actionItem, true)\"><i :class=\"actionItem.icon\" aria-hidden=\"true\" /><span>{{ actionItem.label }}</span></button>\r\n </slot>\r\n </div>\r\n\r\n <div class=\"top-nav-bar__mobile-menu-scroll\">\r\n <slot name=\"drawer-before-menu\" :close=\"closeCallback\" />\r\n <div class=\"top-nav-bar__mobile-menu-track\">\r\n <section v-if=\"favoriteItems.length\" class=\"top-nav-bar__mobile-favorites\">\r\n <button class=\"top-nav-bar__mobile-item\" type=\"button\" :aria-expanded=\"drawerFavoritesOpen\" @click=\"drawerFavoritesOpen = !drawerFavoritesOpen\"><i class=\"pi pi-star-fill top-nav-bar__accent\" aria-hidden=\"true\" /><span class=\"top-nav-bar__mobile-item-label\">{{ favoriteLabel }}</span><span class=\"top-nav-bar__mobile-count\">{{ favoriteItems.length }}</span><i class=\"pi pi-chevron-down top-nav-bar__mobile-chevron\" :class=\"{ 'top-nav-bar__mobile-chevron--open': drawerFavoritesOpen }\" aria-hidden=\"true\" /></button>\r\n <Transition name=\"top-nav-bar-menu-expand\"><TopNavMobileTree v-if=\"drawerFavoritesOpen\" :items=\"favoriteItems\" :active-item-id=\"activeItemId\" :level=\"1\" @select=\"selectItem\" /></Transition>\r\n </section>\r\n <slot name=\"drawer-menu\" :sections=\"drawerSections\" :select=\"selectItem\" :close=\"closeCallback\">\r\n <TopNavMobileTree v-if=\"drawerSections.length\" :items=\"drawerSections\" :active-item-id=\"activeItemId\" :force-open=\"Boolean(searchQuery.trim())\" show-section-dividers @select=\"selectItem\" />\r\n <div v-else class=\"top-nav-bar__drawer-empty\">Nenhum menu encontrado.</div>\r\n </slot>\r\n </div>\r\n <slot name=\"drawer-after-menu\" :close=\"closeCallback\" />\r\n </div>\r\n\r\n <footer v-if=\"hasUser || $slots['drawer-footer']\" class=\"top-nav-bar__mobile-footer\">\r\n <slot v-if=\"hasUser\" name=\"drawer-user\" :user=\"user\" :open=\"drawerUserOpen\" :toggle=\"() => (drawerUserOpen = !drawerUserOpen)\">\r\n <button class=\"top-nav-bar__drawer-user\" type=\"button\" :aria-haspopup=\"hasUserMenu ? 'menu' : undefined\" :aria-expanded=\"hasUserMenu ? drawerUserOpen : undefined\" @click=\"toggleDrawerUserMenu\">\r\n <img v-if=\"user?.avatarUrl\" :src=\"user.avatarUrl\" alt=\"\" class=\"top-nav-bar__user-avatar\" /><span v-else class=\"top-nav-bar__user-avatar\">{{ userInitials }}</span><span v-if=\"user\" class=\"top-nav-bar__user-details\"><span class=\"top-nav-bar__user-name\">{{ user.name }}</span><span v-if=\"user.subtitle\" class=\"top-nav-bar__user-subtitle\">{{ user.subtitle }}</span></span><i v-if=\"hasUserMenu\" class=\"pi pi-chevron-down top-nav-bar__mobile-chevron\" aria-hidden=\"true\" />\r\n </button>\r\n </slot>\r\n <slot name=\"drawer-footer\" :close=\"closeCallback\" />\r\n </footer>\r\n </div>\r\n </template>\r\n </Drawer>\r\n <Menu ref=\"drawerUserMenuRef\" class=\"top-nav-bar__drawer-user-popup\" :model=\"drawerUserMenuItems\" :popup=\"true\" append-to=\"body\" :base-z-index=\"10001\" @show=\"drawerUserOpen = true\" @hide=\"drawerUserOpen = false\" />\r\n </nav>\r\n</template>\r\n\r\n<style>\r\n.top-nav-bar, .top-nav-bar *, .top-nav-bar__mobile-drawer, .top-nav-bar__mobile-drawer * { box-sizing: border-box; }\r\n.top-nav-bar { position: relative; z-index: 1000; width: 100%; color: var(--top-nav-fg, #fff); font-family: var(--top-nav-font-family, inherit); font-size: var(--top-nav-font-size, inherit); font-weight: var(--top-nav-font-weight, inherit); line-height: var(--top-nav-line-height, normal); }\r\n.top-nav-bar button, .top-nav-bar input, .top-nav-bar__mobile-drawer button, .top-nav-bar__mobile-drawer input, .top-nav-bar__drawer-user-popup button { font: inherit; }\n.top-nav-bar button, .top-nav-bar__mobile-drawer button, .top-nav-bar__drawer-user-popup button { -webkit-appearance: none; appearance: none; -webkit-tap-highlight-color: transparent; }\n.top-nav-bar button:focus, .top-nav-bar__mobile-drawer button:focus, .top-nav-bar__drawer-user-popup button:focus { outline: 0; }\n.top-nav-bar button:focus-visible, .top-nav-bar__mobile-drawer button:focus-visible, .top-nav-bar__drawer-user-popup button:focus-visible { outline: 2px solid var(--top-nav-focus-ring, rgb(255 255 255 / 75%)); outline-offset: 2px; }\n.top-nav-bar__small-panel button:focus-visible, .top-nav-bar__menu-panel button:focus-visible, .top-nav-bar__search-results button:focus-visible, .top-nav-bar__favorites-row button:focus-visible, .top-nav-bar__drawer-user-popup button:focus-visible { outline-color: var(--top-nav-focus-ring-light, #025a84); }\n.top-nav-bar__header { position: relative; z-index: 4; display: flex; min-width: 0; min-height: var(--top-nav-header-height, 4.75rem); align-items: center; gap: .75rem; overflow: visible; padding: var(--top-nav-header-padding, .625rem 1.5rem); background: var(--top-nav-bg, #013a59); }\r\n.top-nav-bar__brand, .top-nav-bar__context, .top-nav-bar__desktop-tools, .top-nav-bar__quick-actions, .top-nav-bar__custom-actions { display: flex; min-width: 0; align-items: center; }\r\n.top-nav-bar__brand { flex: 0 1 auto; overflow: hidden; }\r\n.top-nav-bar__context { flex: 0 1 auto; overflow: hidden; transition: max-width .15s ease; }\r\n.top-nav-bar__header--context-compact .top-nav-bar__context { max-width: var(--top-nav-context-compact-width, 3.25rem); }\r\n.top-nav-bar__spacer { min-width: 0; flex: 1 1 auto; }\r\n.top-nav-bar__desktop-tools { flex: 0 0 auto; gap: .5rem; }\r\n.top-nav-bar__quick-actions, .top-nav-bar__custom-actions { gap: .5rem; }\r\n.top-nav-bar__square-button, .top-nav-bar__mobile-trigger { display: inline-flex; width: var(--top-nav-action-size, 2.5rem); height: var(--top-nav-action-size, 2.5rem); flex: 0 0 var(--top-nav-action-size, 2.5rem); align-items: center; justify-content: center; border: 1px solid var(--top-nav-border, rgb(255 255 255 / 20%)); border-radius: var(--top-nav-radius, 8px); background: rgb(255 255 255 / 10%); color: var(--top-nav-fg, #fff); cursor: pointer; padding: 0; transition: border-color .15s ease, background-color .15s ease; }\r\n.top-nav-bar__square-button:hover, .top-nav-bar__mobile-trigger:hover, .top-nav-bar__square-button--active { border-color: rgb(255 255 255 / 45%); background: rgb(255 255 255 / 18%); }\r\n.top-nav-bar button:disabled { cursor: not-allowed; opacity: .5; }\r\n.top-nav-bar__mobile-trigger { display: none; }\r\n.top-nav-bar__search-shell, .top-nav-bar__search, .top-nav-bar__user-menu, .top-nav-bar__quick-actions, .top-nav-bar__favorites-menu { position: relative; }\r\n.top-nav-bar__search { width: clamp(8.5rem, 15vw, 15rem); height: var(--top-nav-action-size, 2.5rem); }\r\n.top-nav-bar__search--expanded { width: 16rem; }\r\n.top-nav-bar__search > i, .top-nav-bar__drawer-search > i { position: absolute; top: 50%; left: .75rem; z-index: 1; transform: translateY(-50%); color: var(--top-nav-muted-fg, #bfdbfe); pointer-events: none; }\r\n.top-nav-bar__search input, .top-nav-bar__drawer-search input { width: 100%; height: var(--top-nav-action-size, 2.5rem); border: 1px solid var(--top-nav-border, rgb(255 255 255 / 20%)); border-radius: var(--top-nav-radius, 8px); outline: 0; background: rgb(255 255 255 / 10%); color: var(--top-nav-fg, #fff); padding: .5rem 2.25rem; transition: border-color .15s ease, background-color .15s ease, box-shadow .15s ease; }\r\n.top-nav-bar__search input::placeholder, .top-nav-bar__drawer-search input::placeholder { color: var(--top-nav-muted-fg, #bfdbfe); }\r\n.top-nav-bar__search input:focus, .top-nav-bar__drawer-search input:focus { border-color: rgb(255 255 255 / 70%); background: rgb(255 255 255 / 15%); box-shadow: 0 0 0 2px rgb(255 255 255 / 20%); }\r\n.top-nav-bar__search-clear { position: absolute; top: 50%; right: .45rem; z-index: 1; display: inline-flex; width: 1.75rem; height: 1.75rem; align-items: center; justify-content: center; transform: translateY(-50%); border: 0; border-radius: calc(var(--top-nav-radius, 8px) - 2px); background: transparent; color: var(--top-nav-muted-fg, #bfdbfe); cursor: pointer; }\r\n.top-nav-bar__search-clear:hover { background: rgb(255 255 255 / 10%); color: var(--top-nav-fg, #fff); }\r\n.top-nav-bar__search-results { position: absolute; top: calc(100% + .5rem); left: 0; z-index: 8; width: max-content; min-width: 100%; max-width: min(24rem, calc(100vw - 2rem)); max-height: 70vh; overflow: hidden; border: 1px solid var(--top-nav-menu-outline, #d7dde6); border-radius: var(--top-nav-radius, 8px); background: var(--top-nav-menu-bg, #f1f5f9); box-shadow: var(--top-nav-shadow, 0 12px 30px rgb(15 23 42 / 18%)); color: var(--top-nav-menu-fg, #0f172a); padding: .5rem; }\n.top-nav-bar__search-results-scroll { max-height: calc(70vh - 1rem); overflow-x: hidden; overflow-y: auto; overscroll-behavior: contain; scrollbar-color: var(--top-nav-menu-scrollbar-thumb, #94a3b8) transparent; scrollbar-width: thin; }\n.top-nav-bar__search-results-scroll::-webkit-scrollbar { width: .45rem; }\n.top-nav-bar__search-results-scroll::-webkit-scrollbar-track { background: transparent; }\n.top-nav-bar__search-results-scroll::-webkit-scrollbar-thumb { border: 2px solid transparent; border-radius: 999px; background: var(--top-nav-menu-scrollbar-thumb, #94a3b8); background-clip: padding-box; }\n.top-nav-bar__user-trigger { display: inline-flex; max-width: 18rem; height: var(--top-nav-action-size, 2.5rem); align-items: center; gap: .65rem; border: 1px solid var(--top-nav-border, rgb(255 255 255 / 20%)); border-radius: var(--top-nav-radius, 8px); background: rgb(255 255 255 / 10%); color: inherit; cursor: pointer; padding: .3rem .5rem; text-align: left; transition: border-color .15s ease, background-color .15s ease; }\r\n.top-nav-bar__user-trigger:hover { border-color: rgb(255 255 255 / 40%); background: rgb(255 255 255 / 15%); }\r\n.top-nav-bar__user-avatar { display: inline-flex; width: 1.75rem; height: 1.75rem; flex: 0 0 1.75rem; align-items: center; justify-content: center; overflow: hidden; border-radius: 50%; background: #fff; color: var(--top-nav-bg, #013a59); font-size: var(--top-nav-caption-font-size, .75em); font-weight: var(--top-nav-strong-font-weight, 700); object-fit: cover; }\r\n.top-nav-bar__user-details { display: flex; min-width: 0; flex-direction: column; }\r\n.top-nav-bar__user-name, .top-nav-bar__user-subtitle { max-width: 13rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n.top-nav-bar__user-name { font-size: var(--top-nav-secondary-font-size, .875em); font-weight: var(--top-nav-strong-font-weight, 700); }\r\n.top-nav-bar__user-subtitle { color: var(--top-nav-muted-fg, #bfdbfe); font-size: var(--top-nav-caption-font-size, .75em); }\r\n.top-nav-bar__chevron { margin-left: .15rem; font-size: .7em; }\r\n.top-nav-bar__popover-layer { position: absolute; top: 100%; z-index: 9; padding-top: .5rem; }\r\n.top-nav-bar__actions-layer, .top-nav-bar__user-layer, .top-nav-bar__favorites-layer { right: 0; }\r\n.top-nav-bar__small-panel { min-width: 13rem; border: 1px solid var(--top-nav-menu-outline, #d7dde6); border-radius: var(--top-nav-radius, 8px); background: var(--top-nav-menu-bg, #f1f5f9); box-shadow: var(--top-nav-shadow, 0 12px 30px rgb(15 23 42 / 18%)); color: var(--top-nav-menu-fg, #0f172a); padding: .5rem; }\r\n.top-nav-bar__user-dropdown { width: max-content; min-width: 16rem; }\r\n.top-nav-bar__user-separator { height: 1px; margin: .35rem 0; background: var(--top-nav-menu-outline, #d7dde6); }\r\n.top-nav-bar__breadcrumbs { position: relative; z-index: 3; display: flex; min-width: 0; min-height: 2.5rem; flex-wrap: wrap; align-items: center; gap: .25rem; border-top: 1px solid var(--top-nav-border, rgb(255 255 255 / 20%)); background: var(--top-nav-breadcrumb-bg, var(--top-nav-bg, #013a59)); padding: var(--top-nav-breadcrumb-padding, .25rem 1.5rem); }\r\n.top-nav-bar__crumb, .top-nav-bar__favorite-toggle { display: inline-flex; min-height: 2rem; flex: 0 0 auto; align-items: center; justify-content: center; gap: .4rem; border: 0; border-radius: calc(var(--top-nav-radius, 8px) - 2px); background: transparent; color: inherit; cursor: pointer; padding: .35rem .5rem; font-size: 1em; font-weight: var(--top-nav-strong-font-weight, 600); }\r\n.top-nav-bar__crumb:hover, .top-nav-bar__favorite-toggle:hover { background: rgb(255 255 255 / 10%); }\r\n.top-nav-bar__crumb--static { cursor: default; }\r\n.top-nav-bar__crumb--static:hover { background: transparent; }\r\n.top-nav-bar__crumb > svg { width: 1.125rem; height: 1.125rem; flex: 0 0 auto; }\r\n.top-nav-bar__separator { flex: 0 0 auto; color: var(--top-nav-muted-fg, #bfdbfe); }\r\n.top-nav-bar__dropdown { position: relative; flex: 0 0 auto; }\r\n.top-nav-bar__menu-layer { position: absolute; top: 100%; left: 0; z-index: 10; padding-top: .25rem; }\r\n.top-nav-bar__menu-panel { display: flex; max-width: calc(100vw - 1.5rem); max-height: min(70vh, 38rem); align-items: flex-start; overflow: auto; border: 6px solid var(--top-nav-menu-border, #fff); border-radius: var(--top-nav-radius, 8px); outline: 1px solid var(--top-nav-menu-outline, #d7dde6); background: var(--top-nav-menu-bg, #f1f5f9); box-shadow: var(--top-nav-shadow, 0 12px 30px rgb(15 23 42 / 18%)); color: var(--top-nav-menu-fg, #0f172a); padding: .25rem; }\r\n.top-nav-bar__section-list { width: var(--top-nav-section-width, 16rem); flex: 0 0 var(--top-nav-section-width, 16rem); padding: .25rem; }\r\n.top-nav-bar__submenu-region, .top-nav-bar__cascade-level { display: flex; align-items: flex-start; }\r\n.top-nav-bar__cascade-level { flex: 0 0 auto; padding: .25rem; }\r\n.top-nav-bar__menu-column { width: var(--top-nav-column-width, 18rem); flex: 0 0 var(--top-nav-column-width, 18rem); }\r\n.top-nav-bar__menu-item { display: flex; width: 100%; min-height: 2.25rem; align-items: center; gap: .6rem; border: 0; border-radius: calc(var(--top-nav-radius, 8px) - 2px); background: transparent; color: inherit; cursor: pointer; padding: var(--top-nav-menu-item-padding, .5rem .75rem); font-size: 1em; text-align: left; }\r\n.top-nav-bar__menu-item:hover { background: var(--top-nav-menu-hover, #e2e8f0); }\r\n.top-nav-bar__menu-item--explored { background: var(--top-nav-menu-explored, #e2e8f0); }\r\n.top-nav-bar__menu-item > i:first-child { width: 1.125rem; flex: 0 0 1.125rem; text-align: center; }\r\n.top-nav-bar__menu-label { min-width: 0; flex: 1 1 auto; line-height: var(--top-nav-item-line-height, 1.25); }\r\n.top-nav-bar__menu-arrow { margin-left: auto; flex: 0 0 auto; font-size: .7em; }\r\n.top-nav-bar__item-count, .top-nav-bar__mobile-count { color: #64748b; font-size: var(--top-nav-caption-font-size, .75em); }\r\n.top-nav-bar__current { display: inline-flex; min-width: 0; max-width: 32rem; flex: 0 1 auto; align-items: center; gap: .15rem; overflow: hidden; border-radius: calc(var(--top-nav-radius, 8px) - 2px); background: var(--top-nav-current-bg, rgb(255 255 255 / 10%)); box-shadow: inset 0 0 0 1px var(--top-nav-current-border, rgb(255 255 255 / 15%)); padding: .25rem .3rem .25rem .45rem; font-size: 1em; font-weight: var(--top-nav-strong-font-weight, 700); white-space: nowrap; }\n.top-nav-bar__current-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }\r\n.top-nav-bar__breadcrumb-actions { display: flex; min-width: 0; align-items: center; gap: .25rem; margin-left: auto; }\r\n.top-nav-bar__favorite-toggle { width: 1.5rem; min-height: 1.5rem; padding: 0; color: var(--top-nav-accent, #fbbf24); }\n.top-nav-bar__accent { color: var(--top-nav-accent, #fbbf24); }\n.top-nav-bar__favorites-panel { width: min(22rem, calc(100vw - 1.5rem)); max-height: 70vh; overflow-y: auto; }\n.top-nav-bar__favorites-measure { position: absolute; top: 0; right: 1.5rem; left: 1.5rem; z-index: -1; overflow: hidden; visibility: hidden; pointer-events: none; }\n.top-nav-bar__favorites-measure-content, .top-nav-bar__favorites-row, .top-nav-bar__favorites-list, .top-nav-bar__favorites-title, .top-nav-bar__favorites-row-item, .top-nav-bar__favorites-measure-item { display: flex; align-items: center; }\n.top-nav-bar__favorites-measure-content { width: max-content; gap: .75rem; padding: .625rem .5rem; }\n.top-nav-bar__favorites-title { flex: 0 0 auto; gap: .5rem; font-size: var(--top-nav-secondary-font-size, .875em); font-weight: var(--top-nav-strong-font-weight, 700); }\n.top-nav-bar__favorites-icon { color: var(--top-nav-accent, #fbbf24); font-size: 1.125em; }\n.top-nav-bar__favorites-measure-item { flex: 0 0 auto; gap: .25rem; font-size: var(--top-nav-secondary-font-size, .875em); font-weight: var(--top-nav-strong-font-weight, 600); }\n.top-nav-bar__favorites-separator { flex: 0 0 auto; color: #cbd5e1; font-size: var(--top-nav-secondary-font-size, .875em); }\n.top-nav-bar__favorites-row { min-height: 2.75rem; gap: .75rem; overflow: hidden; background: var(--top-nav-favorites-bg, #f8fafc); color: var(--top-nav-favorites-fg, var(--top-nav-menu-fg, #0f172a)); border-bottom: 1px solid var(--top-nav-favorites-border, #e2e8f0); box-shadow: var(--top-nav-favorites-shadow, 0 1px 2px rgb(15 23 42 / 6%)); padding: .25rem 1.5rem; }\n.top-nav-bar__favorites-list { min-width: 0; flex: 0 0 auto; gap: .25rem; }\n.top-nav-bar__favorites-row-item { flex: 0 0 auto; gap: .5rem; border: 0; background: transparent; color: inherit; cursor: pointer; padding: .25rem; font-size: var(--top-nav-secondary-font-size, .875em); font-weight: var(--top-nav-strong-font-weight, 600); }\n.top-nav-bar__favorites-row-item:hover { color: var(--top-nav-accent, #025a84); text-decoration: underline; }\n.top-nav-bar-favorites-row-enter-active, .top-nav-bar-favorites-row-leave-active { overflow: hidden; transition: max-height .22s cubic-bezier(.4, 0, .2, 1), min-height .22s cubic-bezier(.4, 0, .2, 1); }\n.top-nav-bar-favorites-row-enter-active > *, .top-nav-bar-favorites-row-leave-active > * { transition: opacity .12s ease; }\n.top-nav-bar-favorites-row-enter-from, .top-nav-bar-favorites-row-leave-to { min-height: 0; max-height: 0; }\n.top-nav-bar-favorites-row-enter-from > *, .top-nav-bar-favorites-row-leave-to > * { opacity: 0; }\n.top-nav-bar-favorites-row-enter-to, .top-nav-bar-favorites-row-leave-from { min-height: 2.75rem; max-height: 2.75rem; }\n.top-nav-bar-favorites-row-enter-to > *, .top-nav-bar-favorites-row-leave-from > * { opacity: 1; }\n.top-nav-bar-favorites-trigger-enter-active, .top-nav-bar-favorites-trigger-leave-active { overflow: hidden; transition: max-width .4s cubic-bezier(.4, 0, .2, 1), opacity .45s ease-in-out; }\n.top-nav-bar-favorites-trigger-enter-from, .top-nav-bar-favorites-trigger-leave-to { max-width: 0; opacity: 0; }\n.top-nav-bar-favorites-trigger-enter-to, .top-nav-bar-favorites-trigger-leave-from { max-width: 10rem; opacity: 1; }\n.top-nav-bar__empty, .top-nav-bar__drawer-empty { display: block; color: #64748b; padding: .75rem; font-size: var(--top-nav-secondary-font-size, .875em); }\n.top-nav-bar__mobile-drawer.p-drawer { width: var(--top-nav-drawer-width, min(22rem, calc(100vw - 1.5rem))) !important; border: 0; font-family: var(--top-nav-font-family, inherit); font-size: var(--top-nav-font-size, inherit); font-weight: var(--top-nav-font-weight, inherit); line-height: var(--top-nav-line-height, normal); }\r\n.top-nav-bar__mobile-drawer .p-drawer-content { padding: 0; }\r\n.top-nav-bar__mobile-menu { display: flex; width: 100%; height: 100%; min-height: 100%; flex-direction: column; overflow: hidden; background: var(--top-nav-drawer-bg, var(--top-nav-bg, #013a59)); color: var(--top-nav-fg, #fff); }\r\n.top-nav-bar__mobile-menu-header { display: flex; min-height: 4.75rem; flex: 0 0 auto; align-items: center; justify-content: space-between; gap: .75rem; border-bottom: 1px solid var(--top-nav-border, rgb(255 255 255 / 20%)); padding: .875rem 1rem; }\r\n.top-nav-bar__drawer-brand { min-width: 0; flex: 1 1 auto; }\r\n.top-nav-bar__drawer-tools { flex: 0 0 auto; border-bottom: 1px solid var(--top-nav-border, rgb(255 255 255 / 20%)); padding: .75rem; }\r\n.top-nav-bar__drawer-search { position: relative; }\r\n.top-nav-bar__drawer-search input { height: 2.5rem; }\r\n.top-nav-bar__drawer-action { display: flex; width: 100%; min-height: 2.75rem; align-items: center; gap: .75rem; border: 1px solid var(--top-nav-border, rgb(255 255 255 / 20%)); border-radius: var(--top-nav-radius, 8px); background: rgb(255 255 255 / 10%); color: inherit; cursor: pointer; margin-top: .625rem; padding: .65rem .75rem; font-weight: var(--top-nav-strong-font-weight, 700); text-align: left; }\r\n.top-nav-bar__drawer-action:hover, .top-nav-bar__drawer-action--active { background: rgb(255 255 255 / 18%); }\r\n.top-nav-bar__mobile-menu-scroll { min-height: 0; flex: 1 1 auto; overflow-y: auto; overscroll-behavior: contain; padding: .75rem; scrollbar-color: rgb(255 255 255 / 30%) transparent; scrollbar-width: thin; }\r\n.top-nav-bar__mobile-menu-track { min-height: 100%; border-radius: var(--top-nav-drawer-radius, 16px); background: rgb(255 255 255 / 8%); padding: .375rem; }\r\n.top-nav-bar__mobile-favorites { border-bottom: 1px solid var(--top-nav-mobile-divider, var(--top-nav-border, rgb(255 255 255 / 20%))); margin-bottom: .35rem; padding-bottom: .35rem; }\r\n.top-nav-bar__mobile-node--section { margin-top: .5rem; border-top: 1px solid var(--top-nav-mobile-divider, var(--top-nav-border, rgb(255 255 255 / 20%))); padding-top: .5rem; }\r\n.top-nav-bar__mobile-tree--nested { margin-left: .85rem; padding: var(--top-nav-mobile-submenu-padding, .5rem 0 .375rem .35rem); }\r\n.top-nav-bar__mobile-node + .top-nav-bar__mobile-node { margin-top: var(--top-nav-mobile-item-gap, .25rem); }\r\n.top-nav-bar__mobile-item { display: flex; width: 100%; min-height: 2.75rem; align-items: center; gap: .7rem; border: 0; border-radius: calc(var(--top-nav-drawer-radius, 16px) - 4px); -webkit-appearance: none; appearance: none; -webkit-tap-highlight-color: transparent; background: transparent; color: inherit; cursor: pointer; padding: var(--top-nav-menu-item-padding, .65rem .75rem); text-align: left; transition: color .2s ease, background-color .2s ease, box-shadow .2s ease; }\r\n.top-nav-bar__mobile-item:focus { background: transparent; outline: 0; }\r\n.top-nav-bar__mobile-item:focus-visible { outline: 2px solid rgb(255 255 255 / 75%); outline-offset: 2px; }\r\n.top-nav-bar__mobile-item:hover, .top-nav-bar__mobile-item:active { background: rgb(255 255 255 / 10%); }\r\n.top-nav-bar__mobile-item--active, .top-nav-bar__mobile-item--ancestor { background: var(--top-nav-mobile-active-bg, #fff); box-shadow: 0 2px 10px rgb(0 0 0 / 12%); color: var(--top-nav-mobile-active-fg, #025a84); font-weight: var(--top-nav-strong-font-weight, 700); }\r\n.top-nav-bar__mobile-item--active:hover, .top-nav-bar__mobile-item--active:active, .top-nav-bar__mobile-item--active:focus, .top-nav-bar__mobile-item--ancestor:hover, .top-nav-bar__mobile-item--ancestor:active, .top-nav-bar__mobile-item--ancestor:focus { background: var(--top-nav-mobile-active-bg, #fff); color: var(--top-nav-mobile-active-fg, #025a84); }\r\n.top-nav-bar__mobile-item > i:first-child { width: 1.125rem; flex: 0 0 1.125rem; text-align: center; }\r\n.top-nav-bar__mobile-item-label { min-width: 0; flex: 1 1 auto; line-height: var(--top-nav-item-line-height, 1.25); }\r\n.top-nav-bar__mobile-chevron { margin-left: auto; flex: 0 0 auto; font-size: .75em; transition: transform .2s ease; }\r\n.top-nav-bar__mobile-chevron--open { transform: rotate(180deg); }\r\n.top-nav-bar__mobile-footer { flex: 0 0 auto; border-top: 1px solid var(--top-nav-border, rgb(255 255 255 / 20%)); background: var(--top-nav-drawer-footer-bg, #012d47); padding: .75rem; }\r\n.top-nav-bar__drawer-user { display: flex; width: 100%; align-items: center; gap: .75rem; border: 0; border-radius: var(--top-nav-radius, 8px); -webkit-appearance: none; appearance: none; -webkit-tap-highlight-color: transparent; background: transparent; color: inherit; cursor: pointer; padding: .5rem; text-align: left; }\r\n.top-nav-bar__drawer-user:focus { background: transparent; outline: 0; }\r\n.top-nav-bar__drawer-user:focus-visible { outline: 2px solid rgb(255 255 255 / 75%); outline-offset: 2px; }\r\n.top-nav-bar__drawer-user .top-nav-bar__user-details { flex: 1 1 auto; }\r\n.top-nav-bar-menu-expand-enter-active, .top-nav-bar-menu-expand-leave-active { max-height: 60rem; overflow: hidden; transition: max-height .3s cubic-bezier(.4, 0, .2, 1), opacity .3s cubic-bezier(.4, 0, .2, 1), transform .3s cubic-bezier(.4, 0, .2, 1); }\r\n.top-nav-bar-menu-expand-enter-from, .top-nav-bar-menu-expand-leave-to { max-height: 0; opacity: 0; transform: translateY(-10px); }\r\n\r\n@media (max-width: 1023px) {\r\n .top-nav-bar__header { min-height: 3.75rem; gap: .5rem; padding: var(--top-nav-header-padding-mobile, .625rem .75rem); }\r\n .top-nav-bar__mobile-trigger { display: inline-flex; }\r\n .top-nav-bar__desktop-tools, .top-nav-bar__desktop-navigation, .top-nav-bar__desktop-navigation-separator, .top-nav-bar__desktop-only { display: none !important; }\r\n .top-nav-bar__brand { flex: 0 1 auto; }\r\n .top-nav-bar__context { flex: 1 1 auto; }\r\n .top-nav-bar__spacer { display: none; }\r\n .top-nav-bar__breadcrumbs { min-height: 2.5rem; flex-wrap: wrap; overflow-x: visible; padding: var(--top-nav-breadcrumb-padding-mobile, .25rem .75rem); }\n .top-nav-bar__favorites-measure { display: none; }\n .top-nav-bar__breadcrumb-dropdown .top-nav-bar__menu-layer { display: none; }\r\n .top-nav-bar__separator--current { display: none; }\r\n .top-nav-bar__current { width: 100%; max-width: 100%; flex: 1 1 14rem; }\r\n .top-nav-bar__breadcrumb-actions { margin-left: 0; }\r\n}\r\n\r\n@media (max-width: 639px) {\r\n .top-nav-bar__context { display: none; }\r\n .top-nav-bar__brand { flex: 1 1 auto; }\r\n .top-nav-bar__crumb, .top-nav-bar__current { font-size: var(--top-nav-caption-font-size, .75em); }\r\n .top-nav-bar__breadcrumbs { gap: .125rem; padding-inline: .5rem; }\r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .top-nav-bar *, .top-nav-bar *::before, .top-nav-bar *::after { scroll-behavior: auto !important; transition-duration: .01ms !important; }\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useSlots, watch } from 'vue'\r\nimport AutoComplete from 'primevue/autocomplete'\r\nimport vTooltip from 'primevue/tooltip'\r\n\r\ntype SelectOption = Record<string, unknown> | string | number\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: SelectOption | SelectOption[] | null\r\n options?: SelectOption[]\r\n loading?: boolean\r\n disabled?: boolean\r\n placeholder?: string\r\n optionLabel?: string | ((option: SelectOption) => string)\r\n optionKey?: string\r\n optionPrefix?: string\r\n showOptionPrefix?: boolean\r\n showSelectedPrefix?: boolean\r\n panelWidth?: string | null\r\n scrollHeight?: string\r\n invalid?: boolean\r\n showTooltip?: boolean\r\n optionGroupLabel?: string | null\r\n optionGroupChildren?: string | null\r\n minQueryLength?: number\r\n emptyMessage?: string\r\n loadingMessage?: string\r\n showLoadingMessage?: boolean\r\n multiple?: boolean\r\n forceSelection?: boolean\r\n closeOnSelect?: boolean\r\n }>(),\r\n {\r\n modelValue: null,\r\n options: () => [],\r\n loading: false,\r\n disabled: false,\r\n placeholder: 'Pesquisar...',\r\n optionLabel: 'label',\r\n optionKey: 'id',\r\n optionPrefix: '',\r\n showOptionPrefix: false,\r\n showSelectedPrefix: false,\r\n panelWidth: null,\r\n scrollHeight: '250px',\r\n invalid: false,\r\n showTooltip: true,\r\n optionGroupLabel: null,\r\n optionGroupChildren: null,\r\n minQueryLength: 1,\r\n emptyMessage: 'Nenhum resultado encontrado.',\r\n loadingMessage: 'Carregando...',\r\n showLoadingMessage: true,\r\n multiple: false,\r\n forceSelection: true,\r\n closeOnSelect: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: SelectOption | SelectOption[] | null]\r\n search: [event: { originalEvent: Event; query: string }]\r\n loadMore: [event: unknown]\r\n clear: []\r\n select: [event: unknown]\r\n change: [event: unknown]\r\n}>()\r\n\r\nconst slots = useSlots()\r\n// PrimeVue's slot types omit selected-item even though the runtime component supports it.\r\nconst TopAutoComplete = AutoComplete as any\r\nconst query = ref('')\r\nconst focused = ref(false)\r\nconst autocompleteRef = ref<{ hide?: () => void } | null>(null)\r\nconst instanceId = `top-select-${Math.random().toString(36).slice(2)}`\r\nlet closeTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\nconst valueProxy = computed({\r\n get: () => props.modelValue,\r\n set: (value) => emit('update:modelValue', value),\r\n})\r\n\r\nfunction readOptionValue(option: SelectOption | null | undefined, key: string) {\r\n if (option === null || option === undefined) return ''\r\n if (typeof option !== 'object') return String(option)\r\n return String(option[key] ?? '')\r\n}\r\n\r\nfunction getOptionLabel(option: SelectOption | null | undefined) {\r\n if (option === null || option === undefined) return ''\r\n if (typeof props.optionLabel === 'function') return props.optionLabel(option)\r\n return readOptionValue(option, props.optionLabel)\r\n}\r\n\r\nfunction getOptionPrefix(option: SelectOption | null | undefined) {\r\n return props.optionPrefix ? readOptionValue(option, props.optionPrefix) : ''\r\n}\r\n\r\nfunction formatOptionLabel(option: SelectOption | null | undefined, includePrefix = props.showSelectedPrefix) {\r\n const label = getOptionLabel(option)\r\n const prefix = getOptionPrefix(option)\r\n return includePrefix && prefix ? `${prefix} - ${label}` : label\r\n}\r\n\r\nfunction getHighlightedParts(value: string) {\r\n const searchTerm = query.value\r\n if (!searchTerm) return [{ text: value, highlighted: false }]\r\n\r\n const escapedQuery = searchTerm.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n const regex = new RegExp(`(${escapedQuery})`, 'gi')\r\n return value.split(regex).filter(Boolean).map((part) => ({\r\n text: part,\r\n highlighted: part.toLowerCase() === searchTerm.toLowerCase(),\r\n }))\r\n}\r\n\r\nfunction hideDropdown() {\r\n autocompleteRef.value?.hide?.()\r\n}\r\n\r\nfunction closeOtherDropdowns() {\r\n if (typeof window === 'undefined') return\r\n window.dispatchEvent(new CustomEvent('top-select:close-others', { detail: { instanceId } }))\r\n}\r\n\r\nfunction handleOtherDropdownClosing(event: Event) {\r\n const customEvent = event as CustomEvent<{ instanceId?: string }>\r\n if (customEvent.detail?.instanceId !== instanceId) hideDropdown()\r\n}\r\n\r\nfunction handleFocusIn() {\r\n if (props.disabled || closeTimer) {\r\n hideDropdown()\r\n return\r\n }\r\n focused.value = true\r\n closeOtherDropdowns()\r\n}\r\n\r\nfunction closeAfterSelection() {\r\n if (!props.closeOnSelect) return\r\n focused.value = false\r\n hideDropdown()\r\n nextTick(hideDropdown)\r\n if (closeTimer) clearTimeout(closeTimer)\r\n closeTimer = setTimeout(() => {\r\n hideDropdown()\r\n closeTimer = null\r\n }, 200)\r\n}\r\n\r\ndefineExpose({ hideDropdown })\r\n\r\nonMounted(() => window.addEventListener('top-select:close-others', handleOtherDropdownClosing))\r\nonBeforeUnmount(() => {\r\n window.removeEventListener('top-select:close-others', handleOtherDropdownClosing)\r\n if (closeTimer) clearTimeout(closeTimer)\r\n})\r\n\r\nwatch(() => props.disabled, (disabled) => {\r\n if (disabled) {\r\n focused.value = false\r\n hideDropdown()\r\n }\r\n})\r\n\r\nwatch(() => props.options, () => {\r\n if (!focused.value) hideDropdown()\r\n})\r\n</script>\r\n\r\n<template>\r\n <div class=\"top-select top-solutions-component relative w-full\" :class=\"{ 'pointer-events-none': disabled }\" @focusin=\"handleFocusIn\">\r\n <span class=\"top-field-icon pointer-events-none absolute left-3 top-1/2 z-10 -translate-y-1/2\">\n <slot name=\"icon\" :loading=\"loading\">\r\n <i v-if=\"loading\" class=\"pi pi-spin pi-spinner\" />\r\n <i v-else class=\"pi pi-search\" />\r\n </slot>\r\n </span>\r\n\r\n <TopAutoComplete\r\n ref=\"autocompleteRef\"\r\n v-model=\"valueProxy\"\r\n :option-group-label=\"optionGroupLabel ?? undefined\"\r\n :option-group-children=\"optionGroupChildren ?? undefined\"\r\n :suggestions=\"options\"\r\n :data-key=\"optionKey\"\r\n :option-label=\"(option: SelectOption) => formatOptionLabel(option)\"\r\n :placeholder=\"placeholder\"\r\n :multiple=\"multiple\"\r\n :min-length=\"minQueryLength\"\r\n :disabled=\"disabled\"\r\n :delay=\"500\"\r\n :show-clear=\"!multiple && !disabled\"\r\n dropdown\r\n dropdown-mode=\"current\"\r\n :complete-on-focus=\"false\"\r\n :invalid=\"invalid\"\r\n fluid\r\n :force-selection=\"forceSelection\"\r\n input-class=\"text-xs\"\r\n :virtual-scroller-options=\"{\r\n lazy: true,\r\n onLazyLoad: (event: unknown) => emit('loadMore', event),\r\n itemSize: 84,\r\n showLoader: true,\r\n scrollHeight,\r\n }\"\r\n :pt=\"{\r\n root: { class: ['w-full text-xs', multiple ? 'h-auto' : 'h-[40px]'].join(' ') },\r\n pcInputText: {\r\n root: {\r\n class: 'top-field-control w-full h-auto text-xs border rounded-[10px] !pl-9 min-h-[36px]',\r\n },\r\n },\r\n input: { class: ['top-field-control w-full h-auto text-xs', multiple ? 'border-0 py-1 !shadow-none outline-none ring-0' : 'border rounded-[10px] !pl-9 min-h-[36px]'].join(' ') },\r\n inputMultiple: { class: 'top-field-control rounded-[10px] pl-9 min-h-[40px]' },\r\n inputChip: { class: 'py-0' },\r\n token: { class: 'bg-primary-100 text-primary-900 rounded-md gap-2 px-2 my-1 dark:bg-primary-900 dark:text-primary-100' },\r\n removeTokenIcon: { class: 'text-primary-900 w-3 h-3 cursor-pointer dark:text-primary-100' },\r\n panel: { class: 'top-select-panel top-solutions-component max-w-[85vw] overflow-hidden h-fit shadow-xl' },\r\n listContainer: { class: 'max-w-full overflow-x-hidden', style: { overflowX: 'hidden', maxWidth: panelWidth ?? '85vw', ...(panelWidth ? { width: panelWidth } : {}) } },\r\n list: { class: 'max-w-full overflow-x-hidden' }, option: { class: 'max-w-full overflow-hidden min-h-[84px]' }, placeholder: { class: '!text-xs' },\r\n }\"\r\n search-message=\" \"\r\n @clear=\"query = ''; emit('clear')\"\r\n @item-select=\"(event: unknown) => { query = ''; emit('select', event); closeAfterSelection() }\"\r\n @complete=\"(event: { originalEvent: Event; query?: string }) => { if (disabled) { hideDropdown(); return }; query = event.query ?? ''; closeOtherDropdowns(); emit('search', { ...event, query: query }) }\"\r\n @change=\"(event: unknown) => emit('change', event)\"\r\n >\r\n <template #chip=\"slotProps\">\r\n <slot v-if=\"slots.chip\" name=\"chip\" v-bind=\"slotProps\" />\r\n <div v-else class=\"flex items-center gap-1 !text-sm\">\r\n <div class=\"flex items-center gap-2 rounded-[9px] bg-primary-500 px-2 py-1 text-white\">\r\n <i class=\"pi pi-times-circle shrink-0 cursor-pointer rounded-full hover:bg-primary-800\" @click=\"slotProps.removeCallback($event)\" />\r\n <span v-tooltip.top=\"formatOptionLabel(slotProps.value)\" class=\"line-clamp-1 max-w-[300px] overflow-hidden text-ellipsis\">{{ formatOptionLabel(slotProps.value) }}</span>\r\n </div>\r\n </div>\r\n </template>\r\n\r\n <template #empty>\r\n <slot v-if=\"slots.empty\" name=\"empty\" />\r\n <div v-else-if=\"loading\" class=\"flex min-h-[100px] flex-col items-center justify-center gap-2 py-2\">\r\n <span class=\"pi pi-spin pi-spinner text-2xl text-primary-600\" />\r\n <span v-if=\"showLoadingMessage\" class=\"text-xs font-medium text-primary-600\">{{ loadingMessage }}</span>\r\n </div>\r\n <span v-else class=\"text-xs text-secondary-500\">{{ emptyMessage }}</span>\r\n </template>\r\n\r\n <template #selected-item=\"slotProps\">\r\n <slot v-if=\"slots['selected-item']\" name=\"selected-item\" v-bind=\"slotProps\" />\r\n <span v-else-if=\"slotProps.item\">{{ formatOptionLabel(slotProps.item) }}</span>\r\n </template>\r\n\r\n <template #optiongroup=\"slotProps\">\r\n <slot v-if=\"slots['option-group']\" name=\"option-group\" v-bind=\"slotProps\" />\r\n <div v-else class=\"flex items-center gap-2 font-semibold\">\r\n <i v-if=\"slotProps.option.icon\" :class=\"slotProps.option.icon\" />\r\n <span>{{ slotProps.option[optionGroupLabel ?? 'label'] }}</span>\r\n </div>\r\n </template>\r\n\r\n <template #option=\"slotProps\">\r\n <slot v-if=\"slots.option\" name=\"option\" v-bind=\"slotProps\" :label=\"getOptionLabel(slotProps.option)\" :prefix=\"getOptionPrefix(slotProps.option)\" :query=\"query\" />\r\n <div v-else v-tooltip.top=\"showTooltip ? getOptionLabel(slotProps.option) : null\" class=\"flex w-full min-w-0 items-start gap-2 overflow-hidden px-2 py-3 text-sm\" style=\"white-space: normal\">\r\n <span class=\"top-select-option-label line-clamp-2 min-w-0 flex-1 text-secondary-700 dark:text-zinc-200\" :title=\"getOptionLabel(slotProps.option)\">\r\n <span v-if=\"showOptionPrefix && getOptionPrefix(slotProps.option)\" class=\"top-select-option-prefix whitespace-nowrap font-bold text-primary-800 dark:text-primary-100\">\r\n <template v-for=\"(part, index) in getHighlightedParts(getOptionPrefix(slotProps.option))\" :key=\"index\"><mark v-if=\"part.highlighted\" class=\"rounded-sm bg-primary-200 p-0 font-bold text-black dark:bg-cyan-700 dark:text-white\">{{ part.text }}</mark><template v-else>{{ part.text }}</template></template><span class=\"font-bold text-secondary-500 dark:text-zinc-400\">&nbsp;-&nbsp;</span>\r\n </span>\r\n <template v-for=\"(part, index) in getHighlightedParts(getOptionLabel(slotProps.option))\" :key=\"index\"><mark v-if=\"part.highlighted\" class=\"rounded-sm bg-primary-200 p-0 font-bold text-black dark:bg-cyan-700 dark:text-white\">{{ part.text }}</mark><template v-else>{{ part.text }}</template></template>\r\n </span>\r\n </div>\r\n </template>\r\n\r\n <template v-if=\"slots.footer\" #footer=\"slotProps\"><slot name=\"footer\" v-bind=\"slotProps\" /></template>\r\n </TopAutoComplete>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.top-select {\r\n position: relative;\r\n width: 100%;\r\n}\r\n\r\n.top-select .p-inputtext.p-component.p-inputtext-fluid.p-autocomplete-input {\r\n padding-left: 35px !important;\r\n border-radius: 10px 0 0 10px !important;\r\n}\r\n\r\n.top-select .p-autocomplete-dropdown {\r\n border-radius: 0 10px 10px 0 !important;\r\n}\r\n\r\n.top-select-option-prefix {\r\n color: var(--top-primary-800) !important;\r\n}\r\n\r\n.dark .top-select-option-prefix {\r\n color: var(--top-primary-100) !important;\r\n}\r\n\r\n.top-select-option-label {\r\n min-width: 0;\r\n flex: 1;\r\n display: -webkit-box;\r\n -webkit-box-orient: vertical;\r\n -webkit-line-clamp: 2;\r\n line-clamp: 2;\r\n overflow: hidden;\r\n overflow-wrap: anywhere;\r\n}\r\n\r\n.top-select-panel,\r\n.top-select-panel .p-virtualscroller,\r\n.top-select-panel .p-autocomplete-list-container,\r\n.top-select-panel .p-autocomplete-list { overflow-x: hidden !important; }\r\n.top-select-panel .p-autocomplete-option { max-width: 100%; }\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useSlots, watch } from 'vue'\r\nimport AutoComplete from 'primevue/autocomplete'\r\nimport vTooltip from 'primevue/tooltip'\r\n\r\ntype SelectOption = Record<string, unknown> | string | number\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: SelectOption | SelectOption[] | null\r\n options?: SelectOption[]\r\n loading?: boolean\r\n disabled?: boolean\r\n placeholder?: string\r\n optionLabel?: string | ((option: SelectOption) => string)\r\n optionKey?: string\r\n optionPrefix?: string\r\n showOptionPrefix?: boolean\r\n showSelectedPrefix?: boolean\r\n panelWidth?: string | null\r\n scrollHeight?: string\r\n invalid?: boolean\r\n showTooltip?: boolean\r\n optionGroupLabel?: string | null\r\n optionGroupChildren?: string | null\r\n minQueryLength?: number\r\n emptyMessage?: string\r\n loadingMessage?: string\r\n showLoadingMessage?: boolean\r\n multiple?: boolean\r\n forceSelection?: boolean\r\n closeOnSelect?: boolean\r\n }>(),\r\n {\r\n modelValue: null,\r\n options: () => [],\r\n loading: false,\r\n disabled: false,\r\n placeholder: 'Pesquisar...',\r\n optionLabel: 'label',\r\n optionKey: 'id',\r\n optionPrefix: '',\r\n showOptionPrefix: false,\r\n showSelectedPrefix: false,\r\n panelWidth: null,\r\n scrollHeight: '250px',\r\n invalid: false,\r\n showTooltip: true,\r\n optionGroupLabel: null,\r\n optionGroupChildren: null,\r\n minQueryLength: 1,\r\n emptyMessage: 'Nenhum resultado encontrado.',\r\n loadingMessage: 'Carregando...',\r\n showLoadingMessage: true,\r\n multiple: false,\r\n forceSelection: true,\r\n closeOnSelect: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: SelectOption | SelectOption[] | null]\r\n search: [event: { originalEvent: Event; query: string }]\r\n loadMore: [event: unknown]\r\n clear: []\r\n select: [event: unknown]\r\n change: [event: unknown]\r\n}>()\r\n\r\nconst slots = useSlots()\r\n// PrimeVue's slot types omit selected-item even though the runtime component supports it.\r\nconst TopAutoComplete = AutoComplete as any\r\nconst query = ref('')\r\nconst focused = ref(false)\r\nconst autocompleteRef = ref<{ hide?: () => void } | null>(null)\r\nconst instanceId = `top-select-${Math.random().toString(36).slice(2)}`\r\nlet closeTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\nconst valueProxy = computed({\r\n get: () => props.modelValue,\r\n set: (value) => emit('update:modelValue', value),\r\n})\r\n\r\nfunction readOptionValue(option: SelectOption | null | undefined, key: string) {\r\n if (option === null || option === undefined) return ''\r\n if (typeof option !== 'object') return String(option)\r\n return String(option[key] ?? '')\r\n}\r\n\r\nfunction getOptionLabel(option: SelectOption | null | undefined) {\r\n if (option === null || option === undefined) return ''\r\n if (typeof props.optionLabel === 'function') return props.optionLabel(option)\r\n return readOptionValue(option, props.optionLabel)\r\n}\r\n\r\nfunction getOptionPrefix(option: SelectOption | null | undefined) {\r\n return props.optionPrefix ? readOptionValue(option, props.optionPrefix) : ''\r\n}\r\n\r\nfunction formatOptionLabel(option: SelectOption | null | undefined, includePrefix = props.showSelectedPrefix) {\r\n const label = getOptionLabel(option)\r\n const prefix = getOptionPrefix(option)\r\n return includePrefix && prefix ? `${prefix} - ${label}` : label\r\n}\r\n\r\nfunction getHighlightedParts(value: string) {\r\n const searchTerm = query.value\r\n if (!searchTerm) return [{ text: value, highlighted: false }]\r\n\r\n const escapedQuery = searchTerm.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n const regex = new RegExp(`(${escapedQuery})`, 'gi')\r\n return value.split(regex).filter(Boolean).map((part) => ({\r\n text: part,\r\n highlighted: part.toLowerCase() === searchTerm.toLowerCase(),\r\n }))\r\n}\r\n\r\nfunction hideDropdown() {\r\n autocompleteRef.value?.hide?.()\r\n}\r\n\r\nfunction closeOtherDropdowns() {\r\n if (typeof window === 'undefined') return\r\n window.dispatchEvent(new CustomEvent('top-select:close-others', { detail: { instanceId } }))\r\n}\r\n\r\nfunction handleOtherDropdownClosing(event: Event) {\r\n const customEvent = event as CustomEvent<{ instanceId?: string }>\r\n if (customEvent.detail?.instanceId !== instanceId) hideDropdown()\r\n}\r\n\r\nfunction handleFocusIn() {\r\n if (props.disabled || closeTimer) {\r\n hideDropdown()\r\n return\r\n }\r\n focused.value = true\r\n closeOtherDropdowns()\r\n}\r\n\r\nfunction closeAfterSelection() {\r\n if (!props.closeOnSelect) return\r\n focused.value = false\r\n hideDropdown()\r\n nextTick(hideDropdown)\r\n if (closeTimer) clearTimeout(closeTimer)\r\n closeTimer = setTimeout(() => {\r\n hideDropdown()\r\n closeTimer = null\r\n }, 200)\r\n}\r\n\r\ndefineExpose({ hideDropdown })\r\n\r\nonMounted(() => window.addEventListener('top-select:close-others', handleOtherDropdownClosing))\r\nonBeforeUnmount(() => {\r\n window.removeEventListener('top-select:close-others', handleOtherDropdownClosing)\r\n if (closeTimer) clearTimeout(closeTimer)\r\n})\r\n\r\nwatch(() => props.disabled, (disabled) => {\r\n if (disabled) {\r\n focused.value = false\r\n hideDropdown()\r\n }\r\n})\r\n\r\nwatch(() => props.options, () => {\r\n if (!focused.value) hideDropdown()\r\n})\r\n</script>\r\n\r\n<template>\r\n <div class=\"top-select top-solutions-component relative w-full\" :class=\"{ 'pointer-events-none': disabled }\" @focusin=\"handleFocusIn\">\r\n <span class=\"top-field-icon pointer-events-none absolute left-3 top-1/2 z-10 -translate-y-1/2\">\n <slot name=\"icon\" :loading=\"loading\">\r\n <i v-if=\"loading\" class=\"pi pi-spin pi-spinner\" />\r\n <i v-else class=\"pi pi-search\" />\r\n </slot>\r\n </span>\r\n\r\n <TopAutoComplete\r\n ref=\"autocompleteRef\"\r\n v-model=\"valueProxy\"\r\n :option-group-label=\"optionGroupLabel ?? undefined\"\r\n :option-group-children=\"optionGroupChildren ?? undefined\"\r\n :suggestions=\"options\"\r\n :data-key=\"optionKey\"\r\n :option-label=\"(option: SelectOption) => formatOptionLabel(option)\"\r\n :placeholder=\"placeholder\"\r\n :multiple=\"multiple\"\r\n :min-length=\"minQueryLength\"\r\n :disabled=\"disabled\"\r\n :delay=\"500\"\r\n :show-clear=\"!multiple && !disabled\"\r\n dropdown\r\n dropdown-mode=\"current\"\r\n :complete-on-focus=\"false\"\r\n :invalid=\"invalid\"\r\n fluid\r\n :force-selection=\"forceSelection\"\r\n input-class=\"text-xs\"\r\n :virtual-scroller-options=\"{\r\n lazy: true,\r\n onLazyLoad: (event: unknown) => emit('loadMore', event),\r\n itemSize: 84,\r\n showLoader: true,\r\n scrollHeight,\r\n }\"\r\n :pt=\"{\r\n root: { class: ['w-full text-xs', multiple ? 'h-auto' : 'h-[40px]'].join(' ') },\r\n pcInputText: {\r\n root: {\r\n class: 'top-field-control w-full h-auto text-xs border rounded-[10px] !pl-9 min-h-[36px]',\r\n },\r\n },\r\n input: { class: ['top-field-control w-full h-auto text-xs', multiple ? 'border-0 py-1 !shadow-none outline-none ring-0' : 'border rounded-[10px] !pl-9 min-h-[36px]'].join(' ') },\r\n inputMultiple: { class: 'top-field-control rounded-[10px] pl-9 min-h-[40px]' },\r\n inputChip: { class: 'py-0' },\r\n token: { class: 'bg-primary-100 text-primary-900 rounded-md gap-2 px-2 my-1 dark:bg-primary-900 dark:text-primary-100' },\r\n removeTokenIcon: { class: 'text-primary-900 w-3 h-3 cursor-pointer dark:text-primary-100' },\r\n panel: { class: 'top-select-panel top-solutions-component max-w-[85vw] overflow-hidden h-fit shadow-xl' },\r\n listContainer: { class: 'max-w-full overflow-x-hidden', style: { overflowX: 'hidden', maxWidth: panelWidth ?? '85vw', ...(panelWidth ? { width: panelWidth } : {}) } },\r\n list: { class: 'max-w-full overflow-x-hidden' }, option: { class: 'max-w-full overflow-hidden min-h-[84px]' }, placeholder: { class: '!text-xs' },\r\n }\"\r\n search-message=\" \"\r\n @clear=\"query = ''; emit('clear')\"\r\n @item-select=\"(event: unknown) => { query = ''; emit('select', event); closeAfterSelection() }\"\r\n @complete=\"(event: { originalEvent: Event; query?: string }) => { if (disabled) { hideDropdown(); return }; query = event.query ?? ''; closeOtherDropdowns(); emit('search', { ...event, query: query }) }\"\r\n @change=\"(event: unknown) => emit('change', event)\"\r\n >\r\n <template #chip=\"slotProps\">\r\n <slot v-if=\"slots.chip\" name=\"chip\" v-bind=\"slotProps\" />\r\n <div v-else class=\"flex items-center gap-1 !text-sm\">\r\n <div class=\"flex items-center gap-2 rounded-[9px] bg-primary-500 px-2 py-1 text-white\">\r\n <i class=\"pi pi-times-circle shrink-0 cursor-pointer rounded-full hover:bg-primary-800\" @click=\"slotProps.removeCallback($event)\" />\r\n <span v-tooltip.top=\"formatOptionLabel(slotProps.value)\" class=\"line-clamp-1 max-w-[300px] overflow-hidden text-ellipsis\">{{ formatOptionLabel(slotProps.value) }}</span>\r\n </div>\r\n </div>\r\n </template>\r\n\r\n <template #empty>\r\n <slot v-if=\"slots.empty\" name=\"empty\" />\r\n <div v-else-if=\"loading\" class=\"flex min-h-[100px] flex-col items-center justify-center gap-2 py-2\">\r\n <span class=\"pi pi-spin pi-spinner text-2xl text-primary-600\" />\r\n <span v-if=\"showLoadingMessage\" class=\"text-xs font-medium text-primary-600\">{{ loadingMessage }}</span>\r\n </div>\r\n <span v-else class=\"text-xs text-secondary-500\">{{ emptyMessage }}</span>\r\n </template>\r\n\r\n <template #selected-item=\"slotProps\">\r\n <slot v-if=\"slots['selected-item']\" name=\"selected-item\" v-bind=\"slotProps\" />\r\n <span v-else-if=\"slotProps.item\">{{ formatOptionLabel(slotProps.item) }}</span>\r\n </template>\r\n\r\n <template #optiongroup=\"slotProps\">\r\n <slot v-if=\"slots['option-group']\" name=\"option-group\" v-bind=\"slotProps\" />\r\n <div v-else class=\"flex items-center gap-2 font-semibold\">\r\n <i v-if=\"slotProps.option.icon\" :class=\"slotProps.option.icon\" />\r\n <span>{{ slotProps.option[optionGroupLabel ?? 'label'] }}</span>\r\n </div>\r\n </template>\r\n\r\n <template #option=\"slotProps\">\r\n <slot v-if=\"slots.option\" name=\"option\" v-bind=\"slotProps\" :label=\"getOptionLabel(slotProps.option)\" :prefix=\"getOptionPrefix(slotProps.option)\" :query=\"query\" />\r\n <div v-else v-tooltip.top=\"showTooltip ? getOptionLabel(slotProps.option) : null\" class=\"flex w-full min-w-0 items-start gap-2 overflow-hidden px-2 py-3 text-sm\" style=\"white-space: normal\">\r\n <span class=\"top-select-option-label line-clamp-2 min-w-0 flex-1 text-secondary-700 dark:text-zinc-200\" :title=\"getOptionLabel(slotProps.option)\">\r\n <span v-if=\"showOptionPrefix && getOptionPrefix(slotProps.option)\" class=\"top-select-option-prefix whitespace-nowrap font-bold text-primary-800 dark:text-primary-100\">\r\n <template v-for=\"(part, index) in getHighlightedParts(getOptionPrefix(slotProps.option))\" :key=\"index\"><mark v-if=\"part.highlighted\" class=\"rounded-sm bg-primary-200 p-0 font-bold text-black dark:bg-cyan-700 dark:text-white\">{{ part.text }}</mark><template v-else>{{ part.text }}</template></template><span class=\"font-bold text-secondary-500 dark:text-zinc-400\">&nbsp;-&nbsp;</span>\r\n </span>\r\n <template v-for=\"(part, index) in getHighlightedParts(getOptionLabel(slotProps.option))\" :key=\"index\"><mark v-if=\"part.highlighted\" class=\"rounded-sm bg-primary-200 p-0 font-bold text-black dark:bg-cyan-700 dark:text-white\">{{ part.text }}</mark><template v-else>{{ part.text }}</template></template>\r\n </span>\r\n </div>\r\n </template>\r\n\r\n <template v-if=\"slots.footer\" #footer=\"slotProps\"><slot name=\"footer\" v-bind=\"slotProps\" /></template>\r\n </TopAutoComplete>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.top-select {\r\n position: relative;\r\n width: 100%;\r\n}\r\n\r\n.top-select .p-inputtext.p-component.p-inputtext-fluid.p-autocomplete-input {\r\n padding-left: 35px !important;\r\n border-radius: 10px 0 0 10px !important;\r\n}\r\n\r\n.top-select .p-autocomplete-dropdown {\r\n border-radius: 0 10px 10px 0 !important;\r\n}\r\n\r\n.top-select-option-prefix {\r\n color: var(--top-primary-800) !important;\r\n}\r\n\r\n.dark .top-select-option-prefix {\r\n color: var(--top-primary-100) !important;\r\n}\r\n\r\n.top-select-option-label {\r\n min-width: 0;\r\n flex: 1;\r\n display: -webkit-box;\r\n -webkit-box-orient: vertical;\r\n -webkit-line-clamp: 2;\r\n line-clamp: 2;\r\n overflow: hidden;\r\n overflow-wrap: anywhere;\r\n}\r\n\r\n.top-select-panel,\r\n.top-select-panel .p-virtualscroller,\r\n.top-select-panel .p-autocomplete-list-container,\r\n.top-select-panel .p-autocomplete-list { overflow-x: hidden !important; }\r\n.top-select-panel .p-autocomplete-option { max-width: 100%; }\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport Tab from 'primevue/tab'\r\nimport TabList from 'primevue/tablist'\r\nimport TabPanel from 'primevue/tabpanel'\r\nimport TabPanels from 'primevue/tabpanels'\r\nimport Tabs from 'primevue/tabs'\r\n\r\nexport type TopTabValue = string | number\r\n\r\nexport interface TopTabItem {\r\n value: TopTabValue\r\n label: string\r\n disabled?: boolean\r\n}\r\n\r\ndefineOptions({ inheritAttrs: false })\r\n\r\nwithDefaults(\r\n defineProps<{\r\n modelValue: TopTabValue\r\n tabs: TopTabItem[]\r\n lazy?: boolean\r\n scrollable?: boolean\r\n }>(),\r\n {\r\n lazy: false,\r\n scrollable: true,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TopTabValue]\r\n}>()\r\n\r\ndefineSlots<{\r\n [name: string]: (props: { tab: TopTabItem; active: boolean }) => unknown\r\n}>()\r\n\r\nfunction slotName(tab: TopTabItem) {\r\n return String(tab.value)\r\n}\r\n</script>\r\n\r\n<template>\r\n <Tabs\r\n v-bind=\"$attrs\"\r\n class=\"top-tabs top-solutions-component w-full min-w-0\"\r\n :value=\"modelValue\"\r\n :lazy=\"lazy\"\r\n :scrollable=\"scrollable\"\r\n @update:value=\"emit('update:modelValue', $event)\"\r\n >\r\n <TabList>\r\n <Tab\r\n v-for=\"tab in tabs\"\r\n :key=\"tab.value\"\r\n :value=\"tab.value\"\r\n :disabled=\"tab.disabled\"\r\n >\r\n {{ tab.label }}\r\n </Tab>\r\n </TabList>\r\n\r\n <TabPanels>\r\n <TabPanel v-for=\"tab in tabs\" :key=\"tab.value\" :value=\"tab.value\">\r\n <slot\r\n :name=\"slotName(tab)\"\r\n :tab=\"tab\"\r\n :active=\"modelValue === tab.value\"\r\n />\r\n </TabPanel>\r\n </TabPanels>\r\n </Tabs>\r\n</template>\r\n\r\n<style>\r\n.top-tabs {\r\n --top-tabs-surface: #ffffff;\r\n --top-tabs-separator: #e2e8f0;\r\n --top-tabs-tab-background: #f3f4f6;\r\n --top-tabs-tab-active-background: #ffffff;\r\n --top-tabs-tab-border: #d1d5db;\r\n --top-tabs-tab-text: #6b7280;\r\n --top-tabs-tab-active-text: var(--top-primary-800);\r\n --top-tabs-panel-text: #334155;\r\n --top-tabs-indicator: var(--top-primary-500);\r\n\r\n min-width: 0;\r\n color: var(--top-tabs-panel-text);\r\n}\r\n\r\n.top-tabs .p-tablist {\r\n min-width: 0;\r\n background: var(--top-tabs-surface);\r\n}\r\n\r\n.top-tabs .p-tablist-content {\r\n min-width: 0;\r\n}\r\n\r\n.top-tabs .p-tablist-tab-list {\r\n width: max-content;\r\n min-width: 100%;\r\n background: var(--top-tabs-surface);\r\n border: 0;\r\n border-bottom: 1px solid var(--top-tabs-separator);\r\n}\r\n\r\n.top-tabs .p-tab {\r\n display: flex;\r\n flex: 0 0 auto;\r\n align-items: center;\r\n gap: 0.25rem;\r\n margin: 0 0.25rem -1px 0;\r\n padding: 1rem 1.125rem;\r\n border: 1px solid var(--top-tabs-tab-border);\r\n border-radius: 0.75rem 0.75rem 0 0;\r\n background: var(--top-tabs-tab-background);\r\n color: var(--top-tabs-tab-text);\r\n font-size: 1rem;\r\n font-weight: 600;\r\n line-height: normal;\r\n white-space: nowrap;\r\n transition:\r\n background-color 0.2s,\r\n border-color 0.2s,\r\n color 0.2s;\r\n}\r\n\r\n.top-tabs .p-tab:not(.p-disabled):hover {\r\n background: var(--top-tabs-tab-background);\r\n color: var(--top-tabs-tab-text);\r\n}\r\n\r\n.top-tabs .p-tab.p-tab-active {\r\n background: var(--top-tabs-tab-active-background);\r\n color: var(--top-tabs-tab-active-text);\r\n}\r\n\r\n.top-tabs .p-tab.p-tab-active:hover {\r\n background: var(--top-tabs-tab-active-background);\r\n color: var(--top-tabs-tab-active-text);\r\n}\r\n\r\n.top-tabs .p-tab.p-disabled {\r\n background: var(--top-tabs-tab-background);\r\n color: var(--top-tabs-tab-text);\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n}\r\n\r\n.top-tabs .p-tab:focus-visible,\r\n.top-tabs .p-tablist-nav-button:focus-visible {\r\n outline: 1px solid var(--top-tabs-indicator);\r\n outline-offset: -1px;\r\n}\r\n\r\n.top-tabs .p-tablist-active-bar {\r\n height: 3px;\r\n border-radius: 10px;\r\n background: var(--top-tabs-indicator);\r\n}\r\n\r\n.top-tabs .p-tablist-nav-button {\r\n border: 0;\r\n background: var(--top-tabs-surface);\r\n color: var(--top-tabs-tab-text);\r\n}\r\n\r\n.top-tabs .p-tabpanels {\r\n background: var(--top-tabs-surface);\r\n color: var(--top-tabs-panel-text);\r\n}\r\n\r\n.top-tabs .p-tabpanel {\r\n padding: 0.875rem 1.125rem 1.125rem;\r\n background: var(--top-tabs-surface);\r\n color: var(--top-tabs-panel-text);\r\n}\r\n\r\n.dark .top-tabs {\r\n --top-tabs-surface: #18181b;\r\n --top-tabs-separator: #3f3f46;\r\n --top-tabs-tab-background: #27272a;\r\n --top-tabs-tab-active-background: #3f3f46;\r\n --top-tabs-tab-border: #52525b;\r\n --top-tabs-tab-text: #d4d4d8;\r\n --top-tabs-tab-active-text: #fafafa;\r\n --top-tabs-panel-text: #ffffff;\r\n --top-tabs-indicator: var(--top-primary-400);\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport Tab from 'primevue/tab'\r\nimport TabList from 'primevue/tablist'\r\nimport TabPanel from 'primevue/tabpanel'\r\nimport TabPanels from 'primevue/tabpanels'\r\nimport Tabs from 'primevue/tabs'\r\n\r\nexport type TopTabValue = string | number\r\n\r\nexport interface TopTabItem {\r\n value: TopTabValue\r\n label: string\r\n disabled?: boolean\r\n}\r\n\r\ndefineOptions({ inheritAttrs: false })\r\n\r\nwithDefaults(\r\n defineProps<{\r\n modelValue: TopTabValue\r\n tabs: TopTabItem[]\r\n lazy?: boolean\r\n scrollable?: boolean\r\n }>(),\r\n {\r\n lazy: false,\r\n scrollable: true,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TopTabValue]\r\n}>()\r\n\r\ndefineSlots<{\r\n [name: string]: (props: { tab: TopTabItem; active: boolean }) => unknown\r\n}>()\r\n\r\nfunction slotName(tab: TopTabItem) {\r\n return String(tab.value)\r\n}\r\n</script>\r\n\r\n<template>\r\n <Tabs\r\n v-bind=\"$attrs\"\r\n class=\"top-tabs top-solutions-component w-full min-w-0\"\r\n :value=\"modelValue\"\r\n :lazy=\"lazy\"\r\n :scrollable=\"scrollable\"\r\n @update:value=\"emit('update:modelValue', $event)\"\r\n >\r\n <TabList>\r\n <Tab\r\n v-for=\"tab in tabs\"\r\n :key=\"tab.value\"\r\n :value=\"tab.value\"\r\n :disabled=\"tab.disabled\"\r\n >\r\n {{ tab.label }}\r\n </Tab>\r\n </TabList>\r\n\r\n <TabPanels>\r\n <TabPanel v-for=\"tab in tabs\" :key=\"tab.value\" :value=\"tab.value\">\r\n <slot\r\n :name=\"slotName(tab)\"\r\n :tab=\"tab\"\r\n :active=\"modelValue === tab.value\"\r\n />\r\n </TabPanel>\r\n </TabPanels>\r\n </Tabs>\r\n</template>\r\n\r\n<style>\r\n.top-tabs {\r\n --top-tabs-surface: #ffffff;\r\n --top-tabs-separator: #e2e8f0;\r\n --top-tabs-tab-background: #f3f4f6;\r\n --top-tabs-tab-active-background: #ffffff;\r\n --top-tabs-tab-border: #d1d5db;\r\n --top-tabs-tab-text: #6b7280;\r\n --top-tabs-tab-active-text: var(--top-primary-800);\r\n --top-tabs-panel-text: #334155;\r\n --top-tabs-indicator: var(--top-primary-500);\r\n\r\n min-width: 0;\r\n color: var(--top-tabs-panel-text);\r\n}\r\n\r\n.top-tabs .p-tablist {\r\n min-width: 0;\r\n background: var(--top-tabs-surface);\r\n}\r\n\r\n.top-tabs .p-tablist-content {\r\n min-width: 0;\r\n}\r\n\r\n.top-tabs .p-tablist-tab-list {\r\n width: max-content;\r\n min-width: 100%;\r\n background: var(--top-tabs-surface);\r\n border: 0;\r\n border-bottom: 1px solid var(--top-tabs-separator);\r\n}\r\n\r\n.top-tabs .p-tab {\r\n display: flex;\r\n flex: 0 0 auto;\r\n align-items: center;\r\n gap: 0.25rem;\r\n margin: 0 0.25rem -1px 0;\r\n padding: 1rem 1.125rem;\r\n border: 1px solid var(--top-tabs-tab-border);\r\n border-radius: 0.75rem 0.75rem 0 0;\r\n background: var(--top-tabs-tab-background);\r\n color: var(--top-tabs-tab-text);\r\n font-size: 1rem;\r\n font-weight: 600;\r\n line-height: normal;\r\n white-space: nowrap;\r\n transition:\r\n background-color 0.2s,\r\n border-color 0.2s,\r\n color 0.2s;\r\n}\r\n\r\n.top-tabs .p-tab:not(.p-disabled):hover {\r\n background: var(--top-tabs-tab-background);\r\n color: var(--top-tabs-tab-text);\r\n}\r\n\r\n.top-tabs .p-tab.p-tab-active {\r\n background: var(--top-tabs-tab-active-background);\r\n color: var(--top-tabs-tab-active-text);\r\n}\r\n\r\n.top-tabs .p-tab.p-tab-active:hover {\r\n background: var(--top-tabs-tab-active-background);\r\n color: var(--top-tabs-tab-active-text);\r\n}\r\n\r\n.top-tabs .p-tab.p-disabled {\r\n background: var(--top-tabs-tab-background);\r\n color: var(--top-tabs-tab-text);\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n}\r\n\r\n.top-tabs .p-tab:focus-visible,\r\n.top-tabs .p-tablist-nav-button:focus-visible {\r\n outline: 1px solid var(--top-tabs-indicator);\r\n outline-offset: -1px;\r\n}\r\n\r\n.top-tabs .p-tablist-active-bar {\r\n height: 3px;\r\n border-radius: 10px;\r\n background: var(--top-tabs-indicator);\r\n}\r\n\r\n.top-tabs .p-tablist-nav-button {\r\n border: 0;\r\n background: var(--top-tabs-surface);\r\n color: var(--top-tabs-tab-text);\r\n}\r\n\r\n.top-tabs .p-tabpanels {\r\n background: var(--top-tabs-surface);\r\n color: var(--top-tabs-panel-text);\r\n}\r\n\r\n.top-tabs .p-tabpanel {\r\n padding: 0.875rem 1.125rem 1.125rem;\r\n background: var(--top-tabs-surface);\r\n color: var(--top-tabs-panel-text);\r\n}\r\n\r\n.dark .top-tabs {\r\n --top-tabs-surface: #18181b;\r\n --top-tabs-separator: #3f3f46;\r\n --top-tabs-tab-background: #27272a;\r\n --top-tabs-tab-active-background: #3f3f46;\r\n --top-tabs-tab-border: #52525b;\r\n --top-tabs-tab-text: #d4d4d8;\r\n --top-tabs-tab-active-text: #fafafa;\r\n --top-tabs-panel-text: #ffffff;\r\n --top-tabs-indicator: var(--top-primary-400);\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport Toast from 'primevue/toast'\r\nimport type { ToastMessageOptions } from 'primevue/toast'\r\n\r\nexport type TopToastFooter = string | number\r\n\r\nexport type TopToastAction = {\r\n label: string\r\n icon?: string\r\n onClick?: () => void\r\n}\r\n\r\nexport type TopToastData = {\r\n footer?: TopToastFooter\r\n action?: TopToastAction\r\n}\r\n\r\ntype TopToastMessage = ToastMessageOptions & {\r\n data?: TopToastData\r\n}\r\n\r\nwithDefaults(\r\n defineProps<{\r\n baseZIndex?: number\r\n }>(),\r\n {\r\n baseZIndex: 30000,\r\n },\r\n)\r\n\r\nfunction footerOf(message: TopToastMessage): TopToastFooter | undefined {\r\n return message.data?.footer\r\n}\r\n\r\nfunction actionOf(message: TopToastMessage) {\r\n return message.data?.action\r\n}\r\n\r\nfunction runAction(message: TopToastMessage) {\r\n actionOf(message)?.onClick?.()\r\n}\r\n\r\nfunction hasFooter(message: TopToastMessage) {\r\n return footerOf(message) !== undefined\r\n}\r\n\r\nfunction hasAction(message: TopToastMessage) {\r\n return Boolean(actionOf(message))\r\n}\r\n\r\nfunction severityClass(message: TopToastMessage, element: 'summary' | 'detail' | 'action') {\r\n const severity = message.severity ?? 'info'\r\n return `top-toast__${element}--${severity}`\r\n}\r\n</script>\r\n\r\n<template>\r\n <Toast position=\"top-right\" :base-z-index=\"baseZIndex\">\r\n <template #message=\"slotProps\">\r\n <div class=\"top-toast__content\">\r\n <div :class=\"['top-toast__summary', severityClass(slotProps.message, 'summary')]\">{{ slotProps.message.summary }}</div>\r\n <div class=\"top-toast__detail\">{{ slotProps.message.detail }}</div>\r\n <slot\r\n v-if=\"hasAction(slotProps.message)\"\r\n name=\"action\"\r\n :action=\"actionOf(slotProps.message)\"\r\n :message=\"slotProps.message\"\r\n :run=\"() => runAction(slotProps.message)\"\r\n >\r\n <button\r\n v-if=\"actionOf(slotProps.message)\"\r\n :class=\"['top-toast__action', severityClass(slotProps.message, 'action')]\"\r\n type=\"button\"\r\n @click=\"runAction(slotProps.message)\"\r\n >\r\n <i v-if=\"actionOf(slotProps.message)?.icon\" :class=\"actionOf(slotProps.message)?.icon\" aria-hidden=\"true\" />\r\n {{ actionOf(slotProps.message)?.label }}\r\n </button>\r\n </slot>\r\n <slot\r\n v-if=\"hasFooter(slotProps.message)\"\r\n name=\"footer\"\r\n :message=\"slotProps.message\"\r\n :footer=\"footerOf(slotProps.message)\"\r\n >\r\n <div v-if=\"footerOf(slotProps.message) !== undefined\" class=\"top-toast__footer\">\r\n {{ footerOf(slotProps.message) }}\r\n </div>\r\n </slot>\r\n </div>\r\n </template>\r\n </Toast>\r\n\r\n</template>\r\n\r\n<style>\r\n.top-toast__content { display: flex; width: 100%; flex-direction: column; gap: .5rem; }\r\n.top-toast__summary { font-weight: 600; }\r\n.top-toast__detail { font-size: .875rem; }\r\n.top-toast__footer { margin-top: .25rem; border-top: 1px solid #9ca3af; padding-top: .5rem; color: #6b7280; font-size: .75rem; }\r\n.top-toast__action { display: inline-flex; align-items: center; align-self: flex-start; gap: .5rem; border: 0; border-radius: 10px; padding: .25rem .75rem; color: #fff; font-size: .875rem; cursor: pointer; }\r\n.top-toast__summary--success, .top-toast__detail--success { color: #047857; }\r\n.top-toast__summary--error, .top-toast__detail--error { color: #dc2626; }\r\n.top-toast__summary--warn, .top-toast__detail--warn { color: #b45309; }\r\n.top-toast__summary--info, .top-toast__detail--info { color: #036da3; }\r\n.top-toast__summary--secondary, .top-toast__detail--secondary { color: #52525b; }\r\n.top-toast__summary--contrast, .top-toast__detail--contrast { color: #18181b; }\r\n.top-toast__action--success { background: #059669; }\r\n.top-toast__action--success:hover { background: #047857; }\r\n.top-toast__action--error { background: #dc2626; }\r\n.top-toast__action--error:hover { background: #b91c1c; }\r\n.top-toast__action--warn { background: #d97706; }\r\n.top-toast__action--warn:hover { background: #b45309; }\r\n.top-toast__action--info { background: #036da3; }\r\n.top-toast__action--info:hover { background: #02466b; }\r\n.top-toast__action--secondary { background: #52525b; }\r\n.top-toast__action--secondary:hover { background: #3f3f46; }\r\n.top-toast__action--contrast { background: #18181b; }\r\n.top-toast__action--contrast:hover { background: #000; }\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport Toast from 'primevue/toast'\r\nimport type { ToastMessageOptions } from 'primevue/toast'\r\n\r\nexport type TopToastFooter = string | number\r\n\r\nexport type TopToastAction = {\r\n label: string\r\n icon?: string\r\n onClick?: () => void\r\n}\r\n\r\nexport type TopToastData = {\r\n footer?: TopToastFooter\r\n action?: TopToastAction\r\n}\r\n\r\ntype TopToastMessage = ToastMessageOptions & {\r\n data?: TopToastData\r\n}\r\n\r\nwithDefaults(\r\n defineProps<{\r\n baseZIndex?: number\r\n }>(),\r\n {\r\n baseZIndex: 30000,\r\n },\r\n)\r\n\r\nfunction footerOf(message: TopToastMessage): TopToastFooter | undefined {\r\n return message.data?.footer\r\n}\r\n\r\nfunction actionOf(message: TopToastMessage) {\r\n return message.data?.action\r\n}\r\n\r\nfunction runAction(message: TopToastMessage) {\r\n actionOf(message)?.onClick?.()\r\n}\r\n\r\nfunction hasFooter(message: TopToastMessage) {\r\n return footerOf(message) !== undefined\r\n}\r\n\r\nfunction hasAction(message: TopToastMessage) {\r\n return Boolean(actionOf(message))\r\n}\r\n\r\nfunction severityClass(message: TopToastMessage, element: 'summary' | 'detail' | 'action') {\r\n const severity = message.severity ?? 'info'\r\n return `top-toast__${element}--${severity}`\r\n}\r\n</script>\r\n\r\n<template>\r\n <Toast position=\"top-right\" :base-z-index=\"baseZIndex\">\r\n <template #message=\"slotProps\">\r\n <div class=\"top-toast__content\">\r\n <div :class=\"['top-toast__summary', severityClass(slotProps.message, 'summary')]\">{{ slotProps.message.summary }}</div>\r\n <div class=\"top-toast__detail\">{{ slotProps.message.detail }}</div>\r\n <slot\r\n v-if=\"hasAction(slotProps.message)\"\r\n name=\"action\"\r\n :action=\"actionOf(slotProps.message)\"\r\n :message=\"slotProps.message\"\r\n :run=\"() => runAction(slotProps.message)\"\r\n >\r\n <button\r\n v-if=\"actionOf(slotProps.message)\"\r\n :class=\"['top-toast__action', severityClass(slotProps.message, 'action')]\"\r\n type=\"button\"\r\n @click=\"runAction(slotProps.message)\"\r\n >\r\n <i v-if=\"actionOf(slotProps.message)?.icon\" :class=\"actionOf(slotProps.message)?.icon\" aria-hidden=\"true\" />\r\n {{ actionOf(slotProps.message)?.label }}\r\n </button>\r\n </slot>\r\n <slot\r\n v-if=\"hasFooter(slotProps.message)\"\r\n name=\"footer\"\r\n :message=\"slotProps.message\"\r\n :footer=\"footerOf(slotProps.message)\"\r\n >\r\n <div v-if=\"footerOf(slotProps.message) !== undefined\" class=\"top-toast__footer\">\r\n {{ footerOf(slotProps.message) }}\r\n </div>\r\n </slot>\r\n </div>\r\n </template>\r\n </Toast>\r\n\r\n</template>\r\n\r\n<style>\r\n.top-toast__content { display: flex; width: 100%; flex-direction: column; gap: .5rem; }\r\n.top-toast__summary { font-weight: 600; }\r\n.top-toast__detail { font-size: .875rem; }\r\n.top-toast__footer { margin-top: .25rem; border-top: 1px solid #9ca3af; padding-top: .5rem; color: #6b7280; font-size: .75rem; }\r\n.top-toast__action { display: inline-flex; align-items: center; align-self: flex-start; gap: .5rem; border: 0; border-radius: 10px; padding: .25rem .75rem; color: #fff; font-size: .875rem; cursor: pointer; }\r\n.top-toast__summary--success, .top-toast__detail--success { color: #047857; }\r\n.top-toast__summary--error, .top-toast__detail--error { color: #dc2626; }\r\n.top-toast__summary--warn, .top-toast__detail--warn { color: #b45309; }\r\n.top-toast__summary--info, .top-toast__detail--info { color: #036da3; }\r\n.top-toast__summary--secondary, .top-toast__detail--secondary { color: #52525b; }\r\n.top-toast__summary--contrast, .top-toast__detail--contrast { color: #18181b; }\r\n.top-toast__action--success { background: #059669; }\r\n.top-toast__action--success:hover { background: #047857; }\r\n.top-toast__action--error { background: #dc2626; }\r\n.top-toast__action--error:hover { background: #b91c1c; }\r\n.top-toast__action--warn { background: #d97706; }\r\n.top-toast__action--warn:hover { background: #b45309; }\r\n.top-toast__action--info { background: #036da3; }\r\n.top-toast__action--info:hover { background: #02466b; }\r\n.top-toast__action--secondary { background: #52525b; }\r\n.top-toast__action--secondary:hover { background: #3f3f46; }\r\n.top-toast__action--contrast { background: #18181b; }\r\n.top-toast__action--contrast:hover { background: #000; }\r\n</style>\r\n"],"x_google_ignoreList":[7,8,9,10,11],"mappings":"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"}