@topjoao/top-design-system 0.1.1-beta.0 → 0.1.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"TopToast-BI4cWWtd.js","names":["_hoisted_1","$attrs","$slots","$attrs","$attrs","$slots","$attrs","$slots"],"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/TopInputNumber.vue","../src/components/TopInputNumber.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/internal/topAccordion.ts","../src/components/TopAccordion.vue","../src/components/TopAccordion.vue","../src/components/TopAccordionSummary.vue","../src/components/TopAccordionSummary.vue","../src/components/TopAccordionPanel.vue","../src/components/TopAccordionPanel.vue","../src/components/TopAccordionNavigator.vue","../src/components/TopAccordionNavigator.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\">\nimport { computed, nextTick, useAttrs, useId, useSlots } from 'vue'\nimport InputNumber from 'primevue/inputnumber'\nimport InputText from 'primevue/inputtext'\nimport type { InputNumberBlurEvent, InputNumberInputEvent } from 'primevue/inputnumber'\n\nexport type TopInputNumberValue = number | null\nexport type TopInputNumberMode = 'decimal' | 'currency'\nexport type TopInputNumberButtonLayout = 'stacked' | 'horizontal' | 'vertical'\nexport type TopInputNumberCurrencyInputMode = 'decimal' | 'cents'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: TopInputNumberValue\n label?: string\n placeholder?: string\n required?: boolean\n error?: string\n invalid?: boolean\n disabled?: boolean\n readonly?: boolean\n format?: boolean\n showButtons?: boolean\n buttonLayout?: TopInputNumberButtonLayout\n locale?: string\n mode?: TopInputNumberMode\n currency?: string\n currencyDisplay?: 'symbol' | 'code' | 'name'\n currencyInputMode?: TopInputNumberCurrencyInputMode\n currencyFractionDigits?: number\n cents?: boolean\n centsFractionDigits?: number\n useGrouping?: boolean\n minFractionDigits?: number\n maxFractionDigits?: number\n min?: number\n max?: number\n step?: number\n allowEmpty?: boolean\n highlightOnFocus?: boolean\n showClear?: boolean\n }>(),\n {\n modelValue: null,\n label: '',\n placeholder: '',\n required: false,\n error: '',\n invalid: false,\n disabled: false,\n readonly: false,\n format: true,\n showButtons: false,\n buttonLayout: 'stacked',\n locale: 'pt-BR',\n mode: 'decimal',\n currency: undefined,\n currencyDisplay: 'symbol',\n currencyInputMode: 'cents',\n currencyFractionDigits: undefined,\n cents: true,\n centsFractionDigits: undefined,\n useGrouping: true,\n minFractionDigits: undefined,\n maxFractionDigits: undefined,\n min: undefined,\n max: undefined,\n step: 1,\n allowEmpty: true,\n highlightOnFocus: false,\n showClear: false,\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TopInputNumberValue]\n 'value-change': [value: TopInputNumberValue]\n input: [event: InputNumberInputEvent]\n focus: [event: Event]\n blur: [event: InputNumberBlurEvent]\n}>()\n\nconst attrs = useAttrs()\nconst slots = useSlots()\nconst generatedId = useId()\n\nconst inputId = computed(() =>\n attrs.id === undefined || attrs.id === null || attrs.id === ''\n ? generatedId\n : String(attrs.id),\n)\nconst errorId = computed(() => `${inputId.value}-error`)\nconst isInvalid = computed(() => props.invalid || Boolean(props.error))\nconst ariaInvalid = computed<\n boolean | 'true' | 'false' | 'grammar' | 'spelling' | undefined\n>(() => {\n if (isInvalid.value) return true\n\n const value = attrs['aria-invalid']\n return typeof value === 'boolean' ||\n value === 'true' ||\n value === 'false' ||\n value === 'grammar' ||\n value === 'spelling'\n ? value\n : undefined\n})\nconst describedBy = computed(() => {\n const externalDescription = attrs['aria-describedby']\n const ids = [\n typeof externalDescription === 'string' ? externalDescription : '',\n props.error ? errorId.value : '',\n ].filter(Boolean)\n\n return ids.length ? ids.join(' ') : undefined\n})\n\n// O modo caixa eletrônico (máscara de centavos) só pode ser ativado no modo 'currency'\nconst currencyMaskEnabled = computed(() =>\n props.mode === 'currency' &&\n props.cents &&\n props.currencyInputMode !== 'decimal',\n)\n\n// No modo decimal, permite a digitação de vírgula liberando até 20 casas se maxFractionDigits for undefined\nconst resolvedMaxFractionDigits = computed(() => {\n if (props.maxFractionDigits !== undefined) return props.maxFractionDigits\n return props.mode === 'decimal' ? 20 : undefined\n})\n\nconst resolvedCurrencyFractionDigits = computed(() => {\n const digits = props.centsFractionDigits ?? props.currencyFractionDigits ?? props.maxFractionDigits ?? 2\n return Math.min(20, Math.max(0, digits))\n})\n\nconst forwardedAttrs = computed(() => {\n const {\n id: _id,\n 'aria-describedby': _ariaDescribedby,\n 'aria-invalid': _ariaInvalid,\n ...rest\n } = attrs\n\n return rest\n})\n\nconst inputNumberPt = computed(() => {\n const customPt = attrs.pt\n const pt = customPt && typeof customPt === 'object'\n ? customPt as Record<string, unknown>\n : {}\n const inputTextPt = pt.pcInputText && typeof pt.pcInputText === 'object'\n ? pt.pcInputText as Record<string, unknown>\n : {}\n const inputRootPt = inputTextPt.root && typeof inputTextPt.root === 'object'\n ? inputTextPt.root as Record<string, unknown>\n : {}\n\n return {\n ...pt,\n pcInputText: {\n ...inputTextPt,\n root: {\n ...inputRootPt,\n 'aria-invalid': ariaInvalid.value,\n 'aria-describedby': describedBy.value,\n },\n },\n }\n})\n\nfunction updateModelValue(value: number | null | undefined) {\n emit('update:modelValue', value ?? null)\n}\n\nfunction normalizeCurrencyValue(value: number) {\n if (props.min !== undefined && value < props.min) return props.min\n if (props.max !== undefined && value > props.max) return props.max\n return value\n}\n\nfunction formatCurrencyCents(value: TopInputNumberValue) {\n if (value === null) return ''\n\n return new Intl.NumberFormat(props.locale, {\n style: 'currency',\n currency: props.currency || 'BRL',\n currencyDisplay: props.currencyDisplay,\n useGrouping: props.useGrouping,\n minimumFractionDigits: resolvedCurrencyFractionDigits.value,\n maximumFractionDigits: resolvedCurrencyFractionDigits.value,\n }).format(value)\n}\n\nfunction updateCurrencyCents(event: Event) {\n const input = event.target\n if (!(input instanceof HTMLInputElement)) return\n\n const digits = input.value.replace(/\\D/g, '')\n const divisor = 10 ** resolvedCurrencyFractionDigits.value\n const value = digits\n ? normalizeCurrencyValue(Number(digits) / divisor)\n : props.allowEmpty ? null : 0\n\n const formattedValue = formatCurrencyCents(value)\n input.value = formattedValue\n emit('update:modelValue', value)\n emit('input', {\n originalEvent: event,\n value: value ?? undefined,\n formattedValue,\n })\n nextTick(() => {\n input.value = formattedValue\n })\n}\n\nfunction handleCurrencyBlur(event: Event) {\n const input = event.target\n emit('blur', {\n originalEvent: event,\n value: input instanceof HTMLInputElement ? input.value : '',\n })\n}\n</script>\n\n<template>\n <div class=\"top-input-number top-solutions-component flex w-full flex-col gap-1\">\n <label\n v-if=\"label\"\n :for=\"inputId\"\n class=\"top-field-label text-xs font-bold\"\n >\n {{ label }}\n <span v-if=\"required\" aria-hidden=\"true\" class=\"text-red-600 dark:text-red-400\">*</span>\n </label>\n\n <InputText\n v-if=\"currencyMaskEnabled\"\n v-bind=\"forwardedAttrs\"\n :id=\"inputId\"\n :model-value=\"formatCurrencyCents(modelValue)\"\n type=\"text\"\n inputmode=\"numeric\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :invalid=\"isInvalid\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :aria-invalid=\"ariaInvalid\"\n :aria-describedby=\"describedBy\"\n fluid\n class=\"top-input-number__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\"\n @input=\"updateCurrencyCents\"\n @focus=\"emit('focus', $event)\"\n @blur=\"handleCurrencyBlur\"\n />\n\n <InputNumber\n v-else\n v-bind=\"forwardedAttrs\"\n :model-value=\"modelValue\"\n :input-id=\"inputId\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :invalid=\"isInvalid\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :format=\"format\"\n :show-buttons=\"showButtons\"\n :button-layout=\"buttonLayout\"\n :locale=\"locale\"\n :mode=\"mode\"\n :currency=\"currency\"\n :currency-display=\"currencyDisplay\"\n :use-grouping=\"useGrouping\"\n :min-fraction-digits=\"minFractionDigits\"\n :max-fraction-digits=\"resolvedMaxFractionDigits\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :allow-empty=\"allowEmpty\"\n :highlight-on-focus=\"highlightOnFocus\"\n :show-clear=\"showClear\"\n :aria-invalid=\"ariaInvalid\"\n :aria-describedby=\"describedBy\"\n :pt=\"inputNumberPt\"\n input-class=\"top-input-number__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\"\n fluid\n @update:model-value=\"updateModelValue\"\n @value-change=\"emit('value-change', $event ?? null)\"\n @input=\"emit('input', $event)\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n >\n <template v-for=\"(_, name) in slots\" #[name]=\"slotProps\">\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\n </template>\n </InputNumber>\n\n <span\n v-if=\"error\"\n :id=\"errorId\"\n class=\"text-[11px] text-red-600 dark:text-red-400\"\n role=\"alert\"\n >\n {{ error }}\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, useAttrs, useId, useSlots } from 'vue'\nimport InputNumber from 'primevue/inputnumber'\nimport InputText from 'primevue/inputtext'\nimport type { InputNumberBlurEvent, InputNumberInputEvent } from 'primevue/inputnumber'\n\nexport type TopInputNumberValue = number | null\nexport type TopInputNumberMode = 'decimal' | 'currency'\nexport type TopInputNumberButtonLayout = 'stacked' | 'horizontal' | 'vertical'\nexport type TopInputNumberCurrencyInputMode = 'decimal' | 'cents'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: TopInputNumberValue\n label?: string\n placeholder?: string\n required?: boolean\n error?: string\n invalid?: boolean\n disabled?: boolean\n readonly?: boolean\n format?: boolean\n showButtons?: boolean\n buttonLayout?: TopInputNumberButtonLayout\n locale?: string\n mode?: TopInputNumberMode\n currency?: string\n currencyDisplay?: 'symbol' | 'code' | 'name'\n currencyInputMode?: TopInputNumberCurrencyInputMode\n currencyFractionDigits?: number\n cents?: boolean\n centsFractionDigits?: number\n useGrouping?: boolean\n minFractionDigits?: number\n maxFractionDigits?: number\n min?: number\n max?: number\n step?: number\n allowEmpty?: boolean\n highlightOnFocus?: boolean\n showClear?: boolean\n }>(),\n {\n modelValue: null,\n label: '',\n placeholder: '',\n required: false,\n error: '',\n invalid: false,\n disabled: false,\n readonly: false,\n format: true,\n showButtons: false,\n buttonLayout: 'stacked',\n locale: 'pt-BR',\n mode: 'decimal',\n currency: undefined,\n currencyDisplay: 'symbol',\n currencyInputMode: 'cents',\n currencyFractionDigits: undefined,\n cents: true,\n centsFractionDigits: undefined,\n useGrouping: true,\n minFractionDigits: undefined,\n maxFractionDigits: undefined,\n min: undefined,\n max: undefined,\n step: 1,\n allowEmpty: true,\n highlightOnFocus: false,\n showClear: false,\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TopInputNumberValue]\n 'value-change': [value: TopInputNumberValue]\n input: [event: InputNumberInputEvent]\n focus: [event: Event]\n blur: [event: InputNumberBlurEvent]\n}>()\n\nconst attrs = useAttrs()\nconst slots = useSlots()\nconst generatedId = useId()\n\nconst inputId = computed(() =>\n attrs.id === undefined || attrs.id === null || attrs.id === ''\n ? generatedId\n : String(attrs.id),\n)\nconst errorId = computed(() => `${inputId.value}-error`)\nconst isInvalid = computed(() => props.invalid || Boolean(props.error))\nconst ariaInvalid = computed<\n boolean | 'true' | 'false' | 'grammar' | 'spelling' | undefined\n>(() => {\n if (isInvalid.value) return true\n\n const value = attrs['aria-invalid']\n return typeof value === 'boolean' ||\n value === 'true' ||\n value === 'false' ||\n value === 'grammar' ||\n value === 'spelling'\n ? value\n : undefined\n})\nconst describedBy = computed(() => {\n const externalDescription = attrs['aria-describedby']\n const ids = [\n typeof externalDescription === 'string' ? externalDescription : '',\n props.error ? errorId.value : '',\n ].filter(Boolean)\n\n return ids.length ? ids.join(' ') : undefined\n})\n\n// O modo caixa eletrônico (máscara de centavos) só pode ser ativado no modo 'currency'\nconst currencyMaskEnabled = computed(() =>\n props.mode === 'currency' &&\n props.cents &&\n props.currencyInputMode !== 'decimal',\n)\n\n// No modo decimal, permite a digitação de vírgula liberando até 20 casas se maxFractionDigits for undefined\nconst resolvedMaxFractionDigits = computed(() => {\n if (props.maxFractionDigits !== undefined) return props.maxFractionDigits\n return props.mode === 'decimal' ? 20 : undefined\n})\n\nconst resolvedCurrencyFractionDigits = computed(() => {\n const digits = props.centsFractionDigits ?? props.currencyFractionDigits ?? props.maxFractionDigits ?? 2\n return Math.min(20, Math.max(0, digits))\n})\n\nconst forwardedAttrs = computed(() => {\n const {\n id: _id,\n 'aria-describedby': _ariaDescribedby,\n 'aria-invalid': _ariaInvalid,\n ...rest\n } = attrs\n\n return rest\n})\n\nconst inputNumberPt = computed(() => {\n const customPt = attrs.pt\n const pt = customPt && typeof customPt === 'object'\n ? customPt as Record<string, unknown>\n : {}\n const inputTextPt = pt.pcInputText && typeof pt.pcInputText === 'object'\n ? pt.pcInputText as Record<string, unknown>\n : {}\n const inputRootPt = inputTextPt.root && typeof inputTextPt.root === 'object'\n ? inputTextPt.root as Record<string, unknown>\n : {}\n\n return {\n ...pt,\n pcInputText: {\n ...inputTextPt,\n root: {\n ...inputRootPt,\n 'aria-invalid': ariaInvalid.value,\n 'aria-describedby': describedBy.value,\n },\n },\n }\n})\n\nfunction updateModelValue(value: number | null | undefined) {\n emit('update:modelValue', value ?? null)\n}\n\nfunction normalizeCurrencyValue(value: number) {\n if (props.min !== undefined && value < props.min) return props.min\n if (props.max !== undefined && value > props.max) return props.max\n return value\n}\n\nfunction formatCurrencyCents(value: TopInputNumberValue) {\n if (value === null) return ''\n\n return new Intl.NumberFormat(props.locale, {\n style: 'currency',\n currency: props.currency || 'BRL',\n currencyDisplay: props.currencyDisplay,\n useGrouping: props.useGrouping,\n minimumFractionDigits: resolvedCurrencyFractionDigits.value,\n maximumFractionDigits: resolvedCurrencyFractionDigits.value,\n }).format(value)\n}\n\nfunction updateCurrencyCents(event: Event) {\n const input = event.target\n if (!(input instanceof HTMLInputElement)) return\n\n const digits = input.value.replace(/\\D/g, '')\n const divisor = 10 ** resolvedCurrencyFractionDigits.value\n const value = digits\n ? normalizeCurrencyValue(Number(digits) / divisor)\n : props.allowEmpty ? null : 0\n\n const formattedValue = formatCurrencyCents(value)\n input.value = formattedValue\n emit('update:modelValue', value)\n emit('input', {\n originalEvent: event,\n value: value ?? undefined,\n formattedValue,\n })\n nextTick(() => {\n input.value = formattedValue\n })\n}\n\nfunction handleCurrencyBlur(event: Event) {\n const input = event.target\n emit('blur', {\n originalEvent: event,\n value: input instanceof HTMLInputElement ? input.value : '',\n })\n}\n</script>\n\n<template>\n <div class=\"top-input-number top-solutions-component flex w-full flex-col gap-1\">\n <label\n v-if=\"label\"\n :for=\"inputId\"\n class=\"top-field-label text-xs font-bold\"\n >\n {{ label }}\n <span v-if=\"required\" aria-hidden=\"true\" class=\"text-red-600 dark:text-red-400\">*</span>\n </label>\n\n <InputText\n v-if=\"currencyMaskEnabled\"\n v-bind=\"forwardedAttrs\"\n :id=\"inputId\"\n :model-value=\"formatCurrencyCents(modelValue)\"\n type=\"text\"\n inputmode=\"numeric\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :invalid=\"isInvalid\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :aria-invalid=\"ariaInvalid\"\n :aria-describedby=\"describedBy\"\n fluid\n class=\"top-input-number__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\"\n @input=\"updateCurrencyCents\"\n @focus=\"emit('focus', $event)\"\n @blur=\"handleCurrencyBlur\"\n />\n\n <InputNumber\n v-else\n v-bind=\"forwardedAttrs\"\n :model-value=\"modelValue\"\n :input-id=\"inputId\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :invalid=\"isInvalid\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :format=\"format\"\n :show-buttons=\"showButtons\"\n :button-layout=\"buttonLayout\"\n :locale=\"locale\"\n :mode=\"mode\"\n :currency=\"currency\"\n :currency-display=\"currencyDisplay\"\n :use-grouping=\"useGrouping\"\n :min-fraction-digits=\"minFractionDigits\"\n :max-fraction-digits=\"resolvedMaxFractionDigits\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :allow-empty=\"allowEmpty\"\n :highlight-on-focus=\"highlightOnFocus\"\n :show-clear=\"showClear\"\n :aria-invalid=\"ariaInvalid\"\n :aria-describedby=\"describedBy\"\n :pt=\"inputNumberPt\"\n input-class=\"top-input-number__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\"\n fluid\n @update:model-value=\"updateModelValue\"\n @value-change=\"emit('value-change', $event ?? null)\"\n @input=\"emit('input', $event)\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n >\n <template v-for=\"(_, name) in slots\" #[name]=\"slotProps\">\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\n </template>\n </InputNumber>\n\n <span\n v-if=\"error\"\n :id=\"errorId\"\n class=\"text-[11px] text-red-600 dark:text-red-400\"\n role=\"alert\"\n >\n {{ error }}\n </span>\n </div>\n</template>\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 = {\n name: string\r\n subtitle?: string\r\n avatarUrl?: string\r\n initials?: string\r\n data?: unknown\n}\n\n/** Contexto visual da organização, cliente ou escopo ativo. Não possui ação própria. */\nexport type TopNavClient = {\n name: string\n subtitle?: string\n logoUrl?: string\n initials?: string\n data?: unknown\n}\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[]\n client?: TopNavClient\n user?: TopNavUser\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(() =>\n Boolean(slots['user-menu']) || cleanUserMenuItems.value.some((item) => !item.separator),\n)\nconst hasUser = computed(() => Boolean(props.user) || Boolean(slots.user))\nconst hasContext = computed(() => Boolean(props.client || slots.context || slots.scope || slots.client || slots['context-compact']))\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(() =>\n visibleSections.value.length > 0 || props.searchable || quickActions.value.length > 0 || hasUser.value ||\n Boolean(slots['drawer-menu'] || slots['drawer-actions'] || slots['drawer-footer']),\r\n)\r\nconst userInitials = computed(() => {\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})\nconst clientInitials = computed(() => {\n if (!props.client) return ''\n if (props.client.initials) return props.client.initials\n return props.client.name.split(/\\s+/).filter(Boolean).slice(0, 2)\n .map((part) => part[0]?.toLocaleUpperCase('pt-BR')).join('')\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>\n\n <div class=\"top-nav-bar__brand\"><slot name=\"brand\" :compact=\"headerCompact.hideContextDetails\" /></div>\n <div v-if=\"hasContext\" class=\"top-nav-bar__brand-context-divider\" aria-hidden=\"true\" />\n <div v-if=\"hasContext\" class=\"top-nav-bar__context\">\n <slot v-if=\"headerCompact.hideContextDetails && $slots['context-compact']\" name=\"context-compact\" :client=\"client\" :compact=\"true\" />\n <slot v-else-if=\"$slots.context\" name=\"context\" :client=\"client\" :compact=\"headerCompact.hideContextDetails\" />\n <slot v-else-if=\"$slots.scope\" name=\"scope\" :client=\"client\" :compact=\"headerCompact.hideContextDetails\" />\n <slot v-else name=\"client\" :client=\"client\" :compact=\"headerCompact.hideContextDetails\">\n <div v-if=\"client\" class=\"top-nav-bar__client\">\n <img v-if=\"client.logoUrl\" :src=\"client.logoUrl\" alt=\"\" class=\"top-nav-bar__client-logo\" />\n <span v-else class=\"top-nav-bar__client-logo\">{{ clientInitials }}</span>\n <span v-if=\"!headerCompact.hideContextDetails\" class=\"top-nav-bar__client-details\">\n <span class=\"top-nav-bar__client-name\">{{ client.name }}</span>\n <span v-if=\"client.subtitle\" class=\"top-nav-bar__client-subtitle\">{{ client.subtitle }}</span>\n </span>\n </div>\n </slot>\n </div>\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\">\n <slot v-if=\"hasUser\" name=\"drawer-user\" :user=\"user\" :client=\"client\" :open=\"drawerUserOpen\" :toggle=\"() => (drawerUserOpen = !drawerUserOpen)\">\n <button class=\"top-nav-bar__drawer-user\" type=\"button\" :aria-haspopup=\"hasUserMenu ? 'menu' : undefined\" :aria-expanded=\"hasUserMenu ? drawerUserOpen : undefined\" @click=\"toggleDrawerUserMenu\">\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=\"client\" class=\"top-nav-bar__drawer-user-context\"><span class=\"top-nav-bar__drawer-user-client\"><i class=\"pi pi-building\" aria-hidden=\"true\" />{{ client.name }}</span><span v-if=\"client.subtitle\" class=\"top-nav-bar__drawer-user-client-subtitle\">{{ client.subtitle }}</span></span></span><i v-if=\"hasUserMenu\" class=\"pi pi-chevron-down top-nav-bar__mobile-chevron\" aria-hidden=\"true\" />\n </button>\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; }\n.top-nav-bar__brand { flex: 0 1 auto; overflow: hidden; }\n.top-nav-bar__brand-context-divider { display: none; width: 1px; height: 2.5rem; flex: 0 0 1px; background: var(--top-nav-border, rgb(255 255 255 / 20%)); }\n.top-nav-bar__context { flex: 0 1 auto; overflow: hidden; transition: max-width .15s ease; }\n.top-nav-bar__header--context-compact .top-nav-bar__context { max-width: var(--top-nav-context-compact-width, 3.25rem); }\n.top-nav-bar__client { display: inline-flex; max-width: 22rem; min-width: 0; 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; padding: .3rem .5rem; }\n.top-nav-bar__client-logo { display: inline-flex; width: 2rem; height: 2rem; flex: 0 0 2rem; align-items: center; justify-content: center; overflow: hidden; border-radius: calc(var(--top-nav-radius, 8px) - 2px); 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); }\nimg.top-nav-bar__client-logo { display: block; object-fit: contain; padding: .125rem; }\n.top-nav-bar__client-details { display: flex; min-width: 0; flex-direction: column; }\n.top-nav-bar__client-name, .top-nav-bar__client-subtitle { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.top-nav-bar__client-name { font-size: var(--top-nav-secondary-font-size, .875em); font-weight: var(--top-nav-strong-font-weight, 700); }\n.top-nav-bar__client-subtitle { color: var(--top-nav-muted-fg, #bfdbfe); font-size: var(--top-nav-caption-font-size, .75em); }\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; padding-bottom: max(.75rem, env(safe-area-inset-bottom, 0px)); }\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; }\n.top-nav-bar__drawer-user:focus { background: transparent; outline: 0; }\n.top-nav-bar__drawer-user:focus-visible { outline: 2px solid rgb(255 255 255 / 75%); outline-offset: 2px; }\n.top-nav-bar__drawer-user .top-nav-bar__user-details { flex: 1 1 auto; }\n.top-nav-bar__drawer-user .top-nav-bar__user-name { max-width: none; overflow: visible; white-space: normal; overflow-wrap: anywhere; }\n.top-nav-bar__drawer-user-context { display: flex; min-width: 0; flex-wrap: wrap; align-items: center; gap: .35rem .5rem; margin-top: .25rem; }\n.top-nav-bar__drawer-user-client { display: inline-flex; min-width: 0; align-items: center; gap: .3rem; color: var(--top-nav-muted-fg, #bfdbfe); font-size: var(--top-nav-caption-font-size, .75em); line-height: 1.2; overflow-wrap: anywhere; }\n.top-nav-bar__drawer-user-client-subtitle { min-width: 0; border-radius: .25rem; background: var(--top-nav-accent, #facc15); color: var(--top-nav-accent-contrast, #4a3300); padding: .15rem .35rem; font-size: var(--top-nav-caption-font-size, .75em); font-weight: var(--top-nav-strong-font-weight, 700); line-height: 1.2; overflow-wrap: anywhere; }\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) {\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}\n\n@media (min-width: 1536px) {\n .top-nav-bar__brand-context-divider { display: block; }\n}\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 = {\n name: string\r\n subtitle?: string\r\n avatarUrl?: string\r\n initials?: string\r\n data?: unknown\n}\n\n/** Contexto visual da organização, cliente ou escopo ativo. Não possui ação própria. */\nexport type TopNavClient = {\n name: string\n subtitle?: string\n logoUrl?: string\n initials?: string\n data?: unknown\n}\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[]\n client?: TopNavClient\n user?: TopNavUser\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(() =>\n Boolean(slots['user-menu']) || cleanUserMenuItems.value.some((item) => !item.separator),\n)\nconst hasUser = computed(() => Boolean(props.user) || Boolean(slots.user))\nconst hasContext = computed(() => Boolean(props.client || slots.context || slots.scope || slots.client || slots['context-compact']))\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(() =>\n visibleSections.value.length > 0 || props.searchable || quickActions.value.length > 0 || hasUser.value ||\n Boolean(slots['drawer-menu'] || slots['drawer-actions'] || slots['drawer-footer']),\r\n)\r\nconst userInitials = computed(() => {\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})\nconst clientInitials = computed(() => {\n if (!props.client) return ''\n if (props.client.initials) return props.client.initials\n return props.client.name.split(/\\s+/).filter(Boolean).slice(0, 2)\n .map((part) => part[0]?.toLocaleUpperCase('pt-BR')).join('')\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>\n\n <div class=\"top-nav-bar__brand\"><slot name=\"brand\" :compact=\"headerCompact.hideContextDetails\" /></div>\n <div v-if=\"hasContext\" class=\"top-nav-bar__brand-context-divider\" aria-hidden=\"true\" />\n <div v-if=\"hasContext\" class=\"top-nav-bar__context\">\n <slot v-if=\"headerCompact.hideContextDetails && $slots['context-compact']\" name=\"context-compact\" :client=\"client\" :compact=\"true\" />\n <slot v-else-if=\"$slots.context\" name=\"context\" :client=\"client\" :compact=\"headerCompact.hideContextDetails\" />\n <slot v-else-if=\"$slots.scope\" name=\"scope\" :client=\"client\" :compact=\"headerCompact.hideContextDetails\" />\n <slot v-else name=\"client\" :client=\"client\" :compact=\"headerCompact.hideContextDetails\">\n <div v-if=\"client\" class=\"top-nav-bar__client\">\n <img v-if=\"client.logoUrl\" :src=\"client.logoUrl\" alt=\"\" class=\"top-nav-bar__client-logo\" />\n <span v-else class=\"top-nav-bar__client-logo\">{{ clientInitials }}</span>\n <span v-if=\"!headerCompact.hideContextDetails\" class=\"top-nav-bar__client-details\">\n <span class=\"top-nav-bar__client-name\">{{ client.name }}</span>\n <span v-if=\"client.subtitle\" class=\"top-nav-bar__client-subtitle\">{{ client.subtitle }}</span>\n </span>\n </div>\n </slot>\n </div>\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\">\n <slot v-if=\"hasUser\" name=\"drawer-user\" :user=\"user\" :client=\"client\" :open=\"drawerUserOpen\" :toggle=\"() => (drawerUserOpen = !drawerUserOpen)\">\n <button class=\"top-nav-bar__drawer-user\" type=\"button\" :aria-haspopup=\"hasUserMenu ? 'menu' : undefined\" :aria-expanded=\"hasUserMenu ? drawerUserOpen : undefined\" @click=\"toggleDrawerUserMenu\">\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=\"client\" class=\"top-nav-bar__drawer-user-context\"><span class=\"top-nav-bar__drawer-user-client\"><i class=\"pi pi-building\" aria-hidden=\"true\" />{{ client.name }}</span><span v-if=\"client.subtitle\" class=\"top-nav-bar__drawer-user-client-subtitle\">{{ client.subtitle }}</span></span></span><i v-if=\"hasUserMenu\" class=\"pi pi-chevron-down top-nav-bar__mobile-chevron\" aria-hidden=\"true\" />\n </button>\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; }\n.top-nav-bar__brand { flex: 0 1 auto; overflow: hidden; }\n.top-nav-bar__brand-context-divider { display: none; width: 1px; height: 2.5rem; flex: 0 0 1px; background: var(--top-nav-border, rgb(255 255 255 / 20%)); }\n.top-nav-bar__context { flex: 0 1 auto; overflow: hidden; transition: max-width .15s ease; }\n.top-nav-bar__header--context-compact .top-nav-bar__context { max-width: var(--top-nav-context-compact-width, 3.25rem); }\n.top-nav-bar__client { display: inline-flex; max-width: 22rem; min-width: 0; 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; padding: .3rem .5rem; }\n.top-nav-bar__client-logo { display: inline-flex; width: 2rem; height: 2rem; flex: 0 0 2rem; align-items: center; justify-content: center; overflow: hidden; border-radius: calc(var(--top-nav-radius, 8px) - 2px); 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); }\nimg.top-nav-bar__client-logo { display: block; object-fit: contain; padding: .125rem; }\n.top-nav-bar__client-details { display: flex; min-width: 0; flex-direction: column; }\n.top-nav-bar__client-name, .top-nav-bar__client-subtitle { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.top-nav-bar__client-name { font-size: var(--top-nav-secondary-font-size, .875em); font-weight: var(--top-nav-strong-font-weight, 700); }\n.top-nav-bar__client-subtitle { color: var(--top-nav-muted-fg, #bfdbfe); font-size: var(--top-nav-caption-font-size, .75em); }\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; padding-bottom: max(.75rem, env(safe-area-inset-bottom, 0px)); }\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; }\n.top-nav-bar__drawer-user:focus { background: transparent; outline: 0; }\n.top-nav-bar__drawer-user:focus-visible { outline: 2px solid rgb(255 255 255 / 75%); outline-offset: 2px; }\n.top-nav-bar__drawer-user .top-nav-bar__user-details { flex: 1 1 auto; }\n.top-nav-bar__drawer-user .top-nav-bar__user-name { max-width: none; overflow: visible; white-space: normal; overflow-wrap: anywhere; }\n.top-nav-bar__drawer-user-context { display: flex; min-width: 0; flex-wrap: wrap; align-items: center; gap: .35rem .5rem; margin-top: .25rem; }\n.top-nav-bar__drawer-user-client { display: inline-flex; min-width: 0; align-items: center; gap: .3rem; color: var(--top-nav-muted-fg, #bfdbfe); font-size: var(--top-nav-caption-font-size, .75em); line-height: 1.2; overflow-wrap: anywhere; }\n.top-nav-bar__drawer-user-client-subtitle { min-width: 0; border-radius: .25rem; background: var(--top-nav-accent, #facc15); color: var(--top-nav-accent-contrast, #4a3300); padding: .15rem .35rem; font-size: var(--top-nav-caption-font-size, .75em); font-weight: var(--top-nav-strong-font-weight, 700); line-height: 1.2; overflow-wrap: anywhere; }\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) {\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}\n\n@media (min-width: 1536px) {\n .top-nav-bar__brand-context-divider { display: block; }\n}\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","export type TopAccordionValue = string | number\n\nexport type TopAccordionSummaryItem = {\n label: string\n value?: unknown\n valor?: unknown\n}\n\nexport type TopAccordionSection = {\n value: TopAccordionValue\n label: string\n /** Classe de ícone, por exemplo `pi pi-file`. Para SVGs, use o slot `icon`. */\n icon?: string\n disabled?: boolean\n}\n\nexport function getTopAccordionAnchorId(accordionId: string, value: TopAccordionValue) {\n return `${accordionId}--section-${encodeURIComponent(String(value))}`\n}\n","<script lang=\"ts\">\nimport type { ComputedRef, Ref } from 'vue'\nimport type { TopAccordionSection, TopAccordionValue } from './internal/topAccordion'\nexport type { TopAccordionSection, TopAccordionSummaryItem, TopAccordionValue } from './internal/topAccordion'\n\nexport const topAccordionContextKey = Symbol('top-accordion-context')\n\nexport type TopAccordionContext = {\n accordionId: string\n sections: ComputedRef<TopAccordionSection[]>\n openSections: Ref<TopAccordionValue[]>\n isOpen: (value: TopAccordionValue) => boolean\n getSection: (value: TopAccordionValue) => TopAccordionSection | undefined\n getAnchorId: (value: TopAccordionValue) => string\n}\n</script>\n\n<script setup lang=\"ts\">\nimport Accordion from 'primevue/accordion'\nimport { computed, nextTick, provide, ref } from 'vue'\nimport { getTopAccordionAnchorId } from './internal/topAccordion'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(\n defineProps<{\n /** Identificador estável compartilhado com TopAccordionNavigator. */\n id: string\n modelValue: TopAccordionValue[]\n sections?: TopAccordionSection[]\n multiple?: boolean\n }>(),\n { sections: () => [], multiple: true },\n)\n\nconst emit = defineEmits<{ 'update:modelValue': [value: TopAccordionValue[]] }>()\n\nconst openSections = computed({\n get: () => props.modelValue ?? [],\n set: (value: TopAccordionValue[]) => emit('update:modelValue', value),\n})\nconst sections = computed(() => props.sections)\nconst rootRef = ref<HTMLElement | null>(null)\nconst primeValue = computed(() => openSections.value as string[] | number[])\n\nfunction getSection(value: TopAccordionValue) {\n return sections.value.find((section) => section.value === value)\n}\n\nfunction isOpen(value: TopAccordionValue) {\n return openSections.value.includes(value)\n}\n\nfunction getAnchorId(value: TopAccordionValue) {\n return getTopAccordionAnchorId(props.id, value)\n}\n\nfunction updatePrimeValue(value: string | string[] | null | undefined) {\n openSections.value = Array.isArray(value) ? value : value === null || value === undefined ? [] : [value]\n}\n\nasync function reveal(value: TopAccordionValue, options: { behavior?: ScrollBehavior; offset?: number } = {}) {\n const section = getSection(value)\n if (section?.disabled) return false\n\n if (!isOpen(value)) openSections.value = [...openSections.value, value]\n await nextTick()\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()))\n\n const element = document.getElementById(getAnchorId(value))\n if (!element) return false\n\n const offset = options.offset ?? 0\n window.scrollTo({\n top: element.getBoundingClientRect().top + window.scrollY - offset,\n behavior: options.behavior ?? 'smooth',\n })\n return true\n}\n\nprovide<TopAccordionContext>(topAccordionContextKey, {\n accordionId: props.id,\n sections,\n openSections,\n isOpen,\n getSection,\n getAnchorId,\n})\n\ndefineExpose({ reveal, getAnchorId, root: rootRef })\n</script>\n\n<template>\n <div ref=\"rootRef\" class=\"top-accordion top-solutions-component\">\n <Accordion\n v-bind=\"$attrs\"\n :value=\"primeValue\"\n :multiple=\"multiple\"\n expand-icon=\"pi pi-chevron-down\"\n collapse-icon=\"pi pi-chevron-up\"\n class=\"top-accordion__root\"\n @update:value=\"updatePrimeValue\"\n >\n <slot />\n </Accordion>\n </div>\n</template>\n\n<style>\n.top-accordion { --top-accordion-border: var(--top-secondary-200); --top-accordion-surface: #fff; --top-accordion-header: var(--top-secondary-100); --top-accordion-title: var(--top-primary-800); --top-accordion-badge: var(--top-primary-900); --top-accordion-content: #fff; }\n.top-accordion__root { display: flex; flex-direction: column; gap: 1rem; }\n.top-accordion .p-accordionpanel { overflow: hidden; border: 1px solid var(--top-accordion-border); border-radius: .625rem; background: var(--top-accordion-surface); box-shadow: 0 2px 8px rgb(15 23 42 / 8%); }\n.top-accordion .p-accordionheader,\n.top-accordion .p-accordionheader[aria-expanded='true'],\n.top-accordion .p-accordionheader:not([data-p-disabled='true']):hover,\n.top-accordion .p-accordionheader:not([data-p-disabled='true']):focus,\n.top-accordion .p-accordionheader:not([data-p-disabled='true']):active { border: 0; border-radius: .625rem; background-color: var(--top-accordion-header) !important; padding: 1rem; }\n.top-accordion .p-accordionheader[aria-expanded='true'] { border-bottom-right-radius: 0; border-bottom-left-radius: 0; }\n.top-accordion .p-accordioncontent-content { border: 0; background: var(--top-accordion-content); padding: 0; }\n.top-accordion .p-accordionpanel[data-p-disabled='true'] { opacity: .6; }\n.top-accordion .p-accordionheader[data-p-disabled='true'] { cursor: not-allowed; }\n.dark .top-accordion { --top-accordion-border: #3f3f46; --top-accordion-surface: #18181b; --top-accordion-header: #27272a; --top-accordion-title: var(--top-primary-100); --top-accordion-badge: var(--top-primary-700); --top-accordion-content: #18181b; }\n</style>\n","<script lang=\"ts\">\nimport type { ComputedRef, Ref } from 'vue'\nimport type { TopAccordionSection, TopAccordionValue } from './internal/topAccordion'\nexport type { TopAccordionSection, TopAccordionSummaryItem, TopAccordionValue } from './internal/topAccordion'\n\nexport const topAccordionContextKey = Symbol('top-accordion-context')\n\nexport type TopAccordionContext = {\n accordionId: string\n sections: ComputedRef<TopAccordionSection[]>\n openSections: Ref<TopAccordionValue[]>\n isOpen: (value: TopAccordionValue) => boolean\n getSection: (value: TopAccordionValue) => TopAccordionSection | undefined\n getAnchorId: (value: TopAccordionValue) => string\n}\n</script>\n\n<script setup lang=\"ts\">\nimport Accordion from 'primevue/accordion'\nimport { computed, nextTick, provide, ref } from 'vue'\nimport { getTopAccordionAnchorId } from './internal/topAccordion'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(\n defineProps<{\n /** Identificador estável compartilhado com TopAccordionNavigator. */\n id: string\n modelValue: TopAccordionValue[]\n sections?: TopAccordionSection[]\n multiple?: boolean\n }>(),\n { sections: () => [], multiple: true },\n)\n\nconst emit = defineEmits<{ 'update:modelValue': [value: TopAccordionValue[]] }>()\n\nconst openSections = computed({\n get: () => props.modelValue ?? [],\n set: (value: TopAccordionValue[]) => emit('update:modelValue', value),\n})\nconst sections = computed(() => props.sections)\nconst rootRef = ref<HTMLElement | null>(null)\nconst primeValue = computed(() => openSections.value as string[] | number[])\n\nfunction getSection(value: TopAccordionValue) {\n return sections.value.find((section) => section.value === value)\n}\n\nfunction isOpen(value: TopAccordionValue) {\n return openSections.value.includes(value)\n}\n\nfunction getAnchorId(value: TopAccordionValue) {\n return getTopAccordionAnchorId(props.id, value)\n}\n\nfunction updatePrimeValue(value: string | string[] | null | undefined) {\n openSections.value = Array.isArray(value) ? value : value === null || value === undefined ? [] : [value]\n}\n\nasync function reveal(value: TopAccordionValue, options: { behavior?: ScrollBehavior; offset?: number } = {}) {\n const section = getSection(value)\n if (section?.disabled) return false\n\n if (!isOpen(value)) openSections.value = [...openSections.value, value]\n await nextTick()\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()))\n\n const element = document.getElementById(getAnchorId(value))\n if (!element) return false\n\n const offset = options.offset ?? 0\n window.scrollTo({\n top: element.getBoundingClientRect().top + window.scrollY - offset,\n behavior: options.behavior ?? 'smooth',\n })\n return true\n}\n\nprovide<TopAccordionContext>(topAccordionContextKey, {\n accordionId: props.id,\n sections,\n openSections,\n isOpen,\n getSection,\n getAnchorId,\n})\n\ndefineExpose({ reveal, getAnchorId, root: rootRef })\n</script>\n\n<template>\n <div ref=\"rootRef\" class=\"top-accordion top-solutions-component\">\n <Accordion\n v-bind=\"$attrs\"\n :value=\"primeValue\"\n :multiple=\"multiple\"\n expand-icon=\"pi pi-chevron-down\"\n collapse-icon=\"pi pi-chevron-up\"\n class=\"top-accordion__root\"\n @update:value=\"updatePrimeValue\"\n >\n <slot />\n </Accordion>\n </div>\n</template>\n\n<style>\n.top-accordion { --top-accordion-border: var(--top-secondary-200); --top-accordion-surface: #fff; --top-accordion-header: var(--top-secondary-100); --top-accordion-title: var(--top-primary-800); --top-accordion-badge: var(--top-primary-900); --top-accordion-content: #fff; }\n.top-accordion__root { display: flex; flex-direction: column; gap: 1rem; }\n.top-accordion .p-accordionpanel { overflow: hidden; border: 1px solid var(--top-accordion-border); border-radius: .625rem; background: var(--top-accordion-surface); box-shadow: 0 2px 8px rgb(15 23 42 / 8%); }\n.top-accordion .p-accordionheader,\n.top-accordion .p-accordionheader[aria-expanded='true'],\n.top-accordion .p-accordionheader:not([data-p-disabled='true']):hover,\n.top-accordion .p-accordionheader:not([data-p-disabled='true']):focus,\n.top-accordion .p-accordionheader:not([data-p-disabled='true']):active { border: 0; border-radius: .625rem; background-color: var(--top-accordion-header) !important; padding: 1rem; }\n.top-accordion .p-accordionheader[aria-expanded='true'] { border-bottom-right-radius: 0; border-bottom-left-radius: 0; }\n.top-accordion .p-accordioncontent-content { border: 0; background: var(--top-accordion-content); padding: 0; }\n.top-accordion .p-accordionpanel[data-p-disabled='true'] { opacity: .6; }\n.top-accordion .p-accordionheader[data-p-disabled='true'] { cursor: not-allowed; }\n.dark .top-accordion { --top-accordion-border: #3f3f46; --top-accordion-surface: #18181b; --top-accordion-header: #27272a; --top-accordion-title: var(--top-primary-100); --top-accordion-badge: var(--top-primary-700); --top-accordion-content: #18181b; }\n</style>\n","<script setup lang=\"ts\">\nimport type { TopAccordionSummaryItem } from './internal/topAccordion'\n\nwithDefaults(\n defineProps<{\n items?: TopAccordionSummaryItem[]\n visible?: boolean\n nowrap?: boolean\n }>(),\n {\n items: () => [],\n visible: true,\n nowrap: false,\n },\n)\n\nfunction getValue(item: TopAccordionSummaryItem) {\n const value = item.value ?? item.valor\n return value === null || value === undefined || value === '' ? '--' : value\n}\n</script>\n\n<template>\n <div\n v-if=\"visible && (items.length || $slots.default)\"\n class=\"top-accordion-summary\"\n :class=\"{ 'top-accordion-summary--nowrap': nowrap }\"\n >\n <template v-for=\"(item, index) in items\" :key=\"`${item.label}-${index}`\">\n <span v-if=\"index > 0\" class=\"top-accordion-summary__separator\" aria-hidden=\"true\" />\n <span class=\"top-accordion-summary__item\"><strong>{{ item.label }}:</strong> {{ getValue(item) }}</span>\n </template>\n <slot />\n </div>\n</template>\n\n<style>\n.top-accordion-summary { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin-left: 2rem; color: var(--top-accordion-summary-text, var(--top-secondary-600)); font-size: .75rem; }\n.top-accordion-summary--nowrap { flex-wrap: nowrap; overflow: hidden; }\n.top-accordion-summary__item { min-width: 0; padding: .125rem 0; }\n.top-accordion-summary__separator { display: inline-block; width: .25rem; height: .25rem; flex: 0 0 auto; border-radius: 50%; background: var(--top-accordion-summary-separator, var(--top-secondary-400)); }\n.dark .top-accordion-summary { --top-accordion-summary-text: #d4d4d8; --top-accordion-summary-separator: #71717a; }\n@media (max-width: 639px) { .top-accordion-summary__separator { display: none; } }\n</style>\n","<script setup lang=\"ts\">\nimport type { TopAccordionSummaryItem } from './internal/topAccordion'\n\nwithDefaults(\n defineProps<{\n items?: TopAccordionSummaryItem[]\n visible?: boolean\n nowrap?: boolean\n }>(),\n {\n items: () => [],\n visible: true,\n nowrap: false,\n },\n)\n\nfunction getValue(item: TopAccordionSummaryItem) {\n const value = item.value ?? item.valor\n return value === null || value === undefined || value === '' ? '--' : value\n}\n</script>\n\n<template>\n <div\n v-if=\"visible && (items.length || $slots.default)\"\n class=\"top-accordion-summary\"\n :class=\"{ 'top-accordion-summary--nowrap': nowrap }\"\n >\n <template v-for=\"(item, index) in items\" :key=\"`${item.label}-${index}`\">\n <span v-if=\"index > 0\" class=\"top-accordion-summary__separator\" aria-hidden=\"true\" />\n <span class=\"top-accordion-summary__item\"><strong>{{ item.label }}:</strong> {{ getValue(item) }}</span>\n </template>\n <slot />\n </div>\n</template>\n\n<style>\n.top-accordion-summary { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin-left: 2rem; color: var(--top-accordion-summary-text, var(--top-secondary-600)); font-size: .75rem; }\n.top-accordion-summary--nowrap { flex-wrap: nowrap; overflow: hidden; }\n.top-accordion-summary__item { min-width: 0; padding: .125rem 0; }\n.top-accordion-summary__separator { display: inline-block; width: .25rem; height: .25rem; flex: 0 0 auto; border-radius: 50%; background: var(--top-accordion-summary-separator, var(--top-secondary-400)); }\n.dark .top-accordion-summary { --top-accordion-summary-text: #d4d4d8; --top-accordion-summary-separator: #71717a; }\n@media (max-width: 639px) { .top-accordion-summary__separator { display: none; } }\n</style>\n","<script setup lang=\"ts\">\nimport AccordionContent from 'primevue/accordioncontent'\nimport AccordionHeader from 'primevue/accordionheader'\nimport AccordionPanel from 'primevue/accordionpanel'\nimport { computed, inject } from 'vue'\nimport TopAccordionSummary from './TopAccordionSummary.vue'\nimport { topAccordionContextKey, type TopAccordionContext } from './TopAccordion.vue'\nimport type { TopAccordionSummaryItem, TopAccordionValue } from './internal/topAccordion'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(\n defineProps<{\n value: TopAccordionValue\n title?: string\n icon?: string\n summary?: TopAccordionSummaryItem[]\n status?: 'valid' | 'error'\n statusLabel?: string\n }>(),\n { title: '', icon: '', summary: () => [], status: undefined, statusLabel: '' },\n)\n\nconst context = inject<TopAccordionContext>(topAccordionContextKey)\nif (!context) throw new Error('TopAccordionPanel deve ser usado dentro de TopAccordion.')\n\nconst section = computed(() => context.getSection(props.value))\nconst title = computed(() => props.title || section.value?.label || String(props.value))\nconst icon = computed(() => props.icon || section.value?.icon || '')\nconst disabled = computed(() => Boolean(section.value?.disabled))\nconst index = computed(() => context.sections.value.findIndex((item) => item.value === props.value) + 1)\nconst isOpen = computed(() => context.isOpen(props.value))\nconst anchorId = computed(() => context.getAnchorId(props.value))\nconst statusIcon = computed(() => props.status === 'valid' ? 'pi pi-check-circle' : 'pi pi-times-circle')\nconst statusClass = computed(() => props.status === 'valid' ? 'top-accordion-panel__status--valid' : 'top-accordion-panel__status--error')\n</script>\n\n<template>\n <div :id=\"anchorId\" class=\"top-accordion-panel-anchor\">\n <AccordionPanel v-bind=\"$attrs\" :value=\"value\" :disabled=\"disabled\" class=\"top-accordion-panel\">\n <AccordionHeader class=\"top-accordion-panel__header\">\n <div class=\"top-accordion-panel__heading\">\n <div class=\"top-accordion-panel__title-row\">\n <span class=\"top-accordion-panel__badge\" aria-hidden=\"true\">\n <slot name=\"icon\"><i v-if=\"icon\" :class=\"icon\" /><span v-else>{{ index }}</span></slot>\n </span>\n <span class=\"top-accordion-panel__title\"><slot name=\"title\">{{ title }}</slot></span>\n <slot name=\"status\">\n <i\n v-if=\"status\"\n :class=\"['top-accordion-panel__status', statusClass, statusIcon]\"\n :aria-label=\"statusLabel || (status === 'valid' ? 'Seção válida' : 'Existem erros na seção')\"\n role=\"img\"\n />\n </slot>\n </div>\n <slot v-if=\"$slots.preview\" name=\"preview\" :open=\"isOpen\" />\n <slot v-else name=\"summary\" :open=\"isOpen\">\n <TopAccordionSummary :items=\"summary\" :visible=\"!isOpen\" />\n </slot>\n </div>\n </AccordionHeader>\n <AccordionContent><div class=\"top-accordion-panel__content\"><slot /></div></AccordionContent>\n </AccordionPanel>\n </div>\n</template>\n\n<style>\n.top-accordion-panel-anchor { scroll-margin-top: var(--top-accordion-scroll-margin-top, 0px); }\n.top-accordion-panel__header { width: 100%; }\n.top-accordion-panel__heading { display: flex; width: 100%; min-width: 0; flex-direction: column; gap: .25rem; }\n.top-accordion-panel__title-row { display: flex; min-width: 0; align-items: center; gap: .5rem; }\n.top-accordion-panel__badge { display: inline-flex; width: 1.5rem; height: 1.5rem; flex: 0 0 1.5rem; align-items: center; justify-content: center; border-radius: 50%; background: var(--top-accordion-badge); color: #fff; font-size: .75rem; font-weight: 700; }\n.top-accordion-panel__badge > i { font-size: .875rem; }\n.top-accordion-panel__title { min-width: 0; flex: 0 1 auto; color: var(--top-accordion-title); font-size: .875rem; font-weight: 700; text-align: left; }\n.top-accordion-panel__status { flex: 0 0 auto; font-size: 1rem; }\n.top-accordion-panel__status--valid { color: #16a34a; }.top-accordion-panel__status--error { color: #dc2626; }\n.top-accordion-panel__content { padding: 1rem; }\n</style>\n","<script setup lang=\"ts\">\nimport AccordionContent from 'primevue/accordioncontent'\nimport AccordionHeader from 'primevue/accordionheader'\nimport AccordionPanel from 'primevue/accordionpanel'\nimport { computed, inject } from 'vue'\nimport TopAccordionSummary from './TopAccordionSummary.vue'\nimport { topAccordionContextKey, type TopAccordionContext } from './TopAccordion.vue'\nimport type { TopAccordionSummaryItem, TopAccordionValue } from './internal/topAccordion'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(\n defineProps<{\n value: TopAccordionValue\n title?: string\n icon?: string\n summary?: TopAccordionSummaryItem[]\n status?: 'valid' | 'error'\n statusLabel?: string\n }>(),\n { title: '', icon: '', summary: () => [], status: undefined, statusLabel: '' },\n)\n\nconst context = inject<TopAccordionContext>(topAccordionContextKey)\nif (!context) throw new Error('TopAccordionPanel deve ser usado dentro de TopAccordion.')\n\nconst section = computed(() => context.getSection(props.value))\nconst title = computed(() => props.title || section.value?.label || String(props.value))\nconst icon = computed(() => props.icon || section.value?.icon || '')\nconst disabled = computed(() => Boolean(section.value?.disabled))\nconst index = computed(() => context.sections.value.findIndex((item) => item.value === props.value) + 1)\nconst isOpen = computed(() => context.isOpen(props.value))\nconst anchorId = computed(() => context.getAnchorId(props.value))\nconst statusIcon = computed(() => props.status === 'valid' ? 'pi pi-check-circle' : 'pi pi-times-circle')\nconst statusClass = computed(() => props.status === 'valid' ? 'top-accordion-panel__status--valid' : 'top-accordion-panel__status--error')\n</script>\n\n<template>\n <div :id=\"anchorId\" class=\"top-accordion-panel-anchor\">\n <AccordionPanel v-bind=\"$attrs\" :value=\"value\" :disabled=\"disabled\" class=\"top-accordion-panel\">\n <AccordionHeader class=\"top-accordion-panel__header\">\n <div class=\"top-accordion-panel__heading\">\n <div class=\"top-accordion-panel__title-row\">\n <span class=\"top-accordion-panel__badge\" aria-hidden=\"true\">\n <slot name=\"icon\"><i v-if=\"icon\" :class=\"icon\" /><span v-else>{{ index }}</span></slot>\n </span>\n <span class=\"top-accordion-panel__title\"><slot name=\"title\">{{ title }}</slot></span>\n <slot name=\"status\">\n <i\n v-if=\"status\"\n :class=\"['top-accordion-panel__status', statusClass, statusIcon]\"\n :aria-label=\"statusLabel || (status === 'valid' ? 'Seção válida' : 'Existem erros na seção')\"\n role=\"img\"\n />\n </slot>\n </div>\n <slot v-if=\"$slots.preview\" name=\"preview\" :open=\"isOpen\" />\n <slot v-else name=\"summary\" :open=\"isOpen\">\n <TopAccordionSummary :items=\"summary\" :visible=\"!isOpen\" />\n </slot>\n </div>\n </AccordionHeader>\n <AccordionContent><div class=\"top-accordion-panel__content\"><slot /></div></AccordionContent>\n </AccordionPanel>\n </div>\n</template>\n\n<style>\n.top-accordion-panel-anchor { scroll-margin-top: var(--top-accordion-scroll-margin-top, 0px); }\n.top-accordion-panel__header { width: 100%; }\n.top-accordion-panel__heading { display: flex; width: 100%; min-width: 0; flex-direction: column; gap: .25rem; }\n.top-accordion-panel__title-row { display: flex; min-width: 0; align-items: center; gap: .5rem; }\n.top-accordion-panel__badge { display: inline-flex; width: 1.5rem; height: 1.5rem; flex: 0 0 1.5rem; align-items: center; justify-content: center; border-radius: 50%; background: var(--top-accordion-badge); color: #fff; font-size: .75rem; font-weight: 700; }\n.top-accordion-panel__badge > i { font-size: .875rem; }\n.top-accordion-panel__title { min-width: 0; flex: 0 1 auto; color: var(--top-accordion-title); font-size: .875rem; font-weight: 700; text-align: left; }\n.top-accordion-panel__status { flex: 0 0 auto; font-size: 1rem; }\n.top-accordion-panel__status--valid { color: #16a34a; }.top-accordion-panel__status--error { color: #dc2626; }\n.top-accordion-panel__content { padding: 1rem; }\n</style>\n","<script lang=\"ts\">\nexport type TopAccordionNavigatorColorMode = 'inherit' | 'light' | 'dark'\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport type { TopAccordionSection, TopAccordionValue } from './internal/topAccordion'\nimport { getTopAccordionAnchorId } from './internal/topAccordion'\n\nconst props = withDefaults(\n defineProps<{\n accordionId: string\n modelValue: TopAccordionValue[]\n sections?: TopAccordionSection[]\n scrollOffset?: number\n sticky?: boolean\n stickyTop?: string\n /** Por padrão, herda o tema do consumidor. Use light ou dark para forçar a instância. */\n colorMode?: TopAccordionNavigatorColorMode\n }>(),\n { sections: () => [], scrollOffset: 0, sticky: false, stickyTop: '0px', colorMode: 'inherit' },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TopAccordionValue[]]\n navigate: [section: TopAccordionSection]\n}>()\n\nconst containerRef = ref<HTMLElement | null>(null)\nconst hasOverflow = ref(false)\nconst canScrollLeft = ref(false)\nconst canScrollRight = ref(false)\nlet resizeObserver: ResizeObserver | undefined\n\nconst openSections = computed({\n get: () => props.modelValue ?? [],\n set: (value: TopAccordionValue[]) => emit('update:modelValue', value),\n})\n\nfunction isOpen(value: TopAccordionValue) { return openSections.value.includes(value) }\nfunction updateScrollState() {\n const element = containerRef.value\n if (!element) return\n hasOverflow.value = element.scrollWidth > element.clientWidth + 1\n canScrollLeft.value = hasOverflow.value && element.scrollLeft > 1\n canScrollRight.value = hasOverflow.value && element.scrollLeft + element.clientWidth < element.scrollWidth - 1\n}\nfunction scrollByAmount(left: number) { containerRef.value?.scrollBy({ left, behavior: 'smooth' }) }\n\nasync function navigate(section: TopAccordionSection) {\n if (section.disabled) return\n if (!isOpen(section.value)) openSections.value = [...openSections.value, section.value]\n emit('navigate', section)\n await nextTick()\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()))\n const target = document.getElementById(getTopAccordionAnchorId(props.accordionId, section.value))\n if (!target) return\n window.scrollTo({\n top: target.getBoundingClientRect().top + window.scrollY - props.scrollOffset,\n behavior: 'smooth',\n })\n}\n\nonMounted(() => {\n updateScrollState()\n const element = containerRef.value\n element?.addEventListener('scroll', updateScrollState, { passive: true })\n if (typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(updateScrollState)\n if (element) resizeObserver.observe(element)\n }\n})\nonBeforeUnmount(() => { containerRef.value?.removeEventListener('scroll', updateScrollState); resizeObserver?.disconnect() })\nwatch(() => props.sections, () => nextTick(updateScrollState), { deep: true })\n</script>\n\n<template>\n <nav\n class=\"top-accordion-navigator top-solutions-component\"\n :class=\"{\n 'top-accordion-navigator--sticky': sticky,\n 'top-accordion-navigator--dark': colorMode === 'dark',\n 'top-accordion-navigator--light': colorMode === 'light',\n }\"\n :style=\"{ '--top-accordion-navigator-top': stickyTop }\"\n aria-label=\"Sumário das seções do formulário\"\n >\n <button v-if=\"hasOverflow && canScrollLeft\" class=\"top-accordion-navigator__scroll top-accordion-navigator__scroll--left\" type=\"button\" aria-label=\"Rolar seções para a esquerda\" @click=\"scrollByAmount(-240)\"><i class=\"pi pi-chevron-left\" /></button>\n <button v-if=\"hasOverflow && canScrollRight\" class=\"top-accordion-navigator__scroll top-accordion-navigator__scroll--right\" type=\"button\" aria-label=\"Rolar seções para a direita\" @click=\"scrollByAmount(240)\"><i class=\"pi pi-chevron-right\" /></button>\n <div ref=\"containerRef\" class=\"top-accordion-navigator__scroll-area\">\n <div class=\"top-accordion-navigator__items\">\n <template v-for=\"(section, index) in sections\" :key=\"section.value\">\n <button\n class=\"top-accordion-navigator__item\"\n :class=\"{ 'top-accordion-navigator__item--open': isOpen(section.value), 'top-accordion-navigator__item--disabled': section.disabled }\"\n :disabled=\"section.disabled\"\n type=\"button\"\n :aria-current=\"isOpen(section.value) ? 'step' : undefined\"\n @click=\"navigate(section)\"\n >\n <span class=\"top-accordion-navigator__badge\"><i v-if=\"section.disabled\" class=\"pi pi-lock\" /><i v-else-if=\"section.icon\" :class=\"section.icon\" /><span v-else>{{ index + 1 }}</span></span>\n <span class=\"top-accordion-navigator__label\">{{ section.label }}</span>\n </button>\n <span v-if=\"index < sections.length - 1\" class=\"top-accordion-navigator__connector\" :class=\"{ 'top-accordion-navigator__connector--open': isOpen(section.value) && isOpen(sections[index + 1]!.value) }\" aria-hidden=\"true\" />\n </template>\n </div>\n </div>\n </nav>\n</template>\n\n<style>\n.top-accordion-navigator { --top-accordion-nav-border: var(--top-secondary-200); --top-accordion-nav-surface: #f8fafc; --top-accordion-nav-accent: var(--top-primary-800); position: relative; z-index: 2; width: 100%; border-bottom: 2px solid var(--top-accordion-nav-border); background: var(--top-accordion-nav-surface); padding: .5rem 0; }\n.top-accordion-navigator--sticky { position: sticky; top: var(--top-accordion-navigator-top); }\n.top-accordion-navigator__scroll-area { overflow-x: auto; scrollbar-width: none; padding: 0 2.5rem; }.top-accordion-navigator__scroll-area::-webkit-scrollbar { display: none; }\n.top-accordion-navigator__items { display: flex; width: max-content; min-width: 100%; align-items: center; justify-content: space-evenly; gap: .5rem; }\n.top-accordion-navigator__item { display: flex; min-width: 0; flex: 0 0 auto; flex-direction: column; align-items: center; gap: .25rem; border: 0; border-radius: .5rem; background: transparent; color: var(--top-accordion-nav-accent); cursor: pointer; padding: .25rem; }\n.top-accordion-navigator__item:focus-visible { outline: 2px solid var(--top-accordion-nav-accent); outline-offset: 2px; }\n.top-accordion-navigator__badge { display: inline-flex; width: 1.75rem; height: 1.75rem; align-items: center; justify-content: center; border: 1px solid currentColor; border-radius: 50%; font-size: .75rem; font-weight: 700; transition: background-color .18s ease, color .18s ease, border-color .18s ease; }.top-accordion-navigator__badge > i { font-size: .875rem; }\n.top-accordion-navigator__item:not(:disabled):hover .top-accordion-navigator__badge { background: color-mix(in srgb, var(--top-accordion-nav-accent), transparent 90%); }\n.top-accordion-navigator__item--open .top-accordion-navigator__badge { background: var(--top-accordion-nav-accent); border-color: var(--top-accordion-nav-accent); color: #fff; box-shadow: 0 2px 5px rgb(15 23 42 / 18%); }.top-accordion-navigator__item--open:not(:disabled):hover .top-accordion-navigator__badge { background: var(--top-primary-700); border-color: var(--top-primary-700); }\n.top-accordion-navigator__item--disabled { color: var(--top-secondary-400); cursor: not-allowed; }.top-accordion-navigator__item--disabled .top-accordion-navigator__badge { border-color: var(--top-secondary-300); background: var(--top-secondary-100); }\n.top-accordion-navigator__label { max-width: 7.5rem; overflow: hidden; color: inherit; font-size: .75rem; font-weight: 700; text-align: center; text-overflow: ellipsis; white-space: nowrap; }\n.top-accordion-navigator__connector { width: 2rem; height: 1px; flex: 1 0 2rem; background: var(--top-secondary-300); }.top-accordion-navigator__connector--open { background: var(--top-primary-600); }\n.top-accordion-navigator__scroll { position: absolute; top: 50%; z-index: 1; display: inline-flex; width: 1.75rem; height: 1.75rem; align-items: center; justify-content: center; border: 1px solid color-mix(in srgb, var(--top-accordion-nav-accent), transparent 70%); border-radius: 50%; background: #fff; color: var(--top-accordion-nav-accent); box-shadow: 0 1px 3px rgb(15 23 42 / 15%); cursor: pointer; transform: translateY(-50%); }.top-accordion-navigator__scroll--left { left: .25rem; }.top-accordion-navigator__scroll--right { right: .25rem; }\n.dark .top-accordion-navigator, .top-accordion-navigator--dark { --top-accordion-nav-border: #3f3f46; --top-accordion-nav-surface: #18181b; --top-accordion-nav-accent: var(--top-primary-600); }.dark .top-accordion-navigator__item--disabled, .top-accordion-navigator--dark .top-accordion-navigator__item--disabled { color: #71717a; }.dark .top-accordion-navigator__item--disabled .top-accordion-navigator__badge, .top-accordion-navigator--dark .top-accordion-navigator__item--disabled .top-accordion-navigator__badge { border-color: #52525b; background: #27272a; }.dark .top-accordion-navigator__connector, .top-accordion-navigator--dark .top-accordion-navigator__connector { background: #52525b; }.dark .top-accordion-navigator__connector--open, .top-accordion-navigator--dark .top-accordion-navigator__connector--open { background: var(--top-primary-600); }.dark .top-accordion-navigator__scroll, .top-accordion-navigator--dark .top-accordion-navigator__scroll { background: #27272a; }\n.top-accordion-navigator--light { --top-accordion-nav-border: var(--top-secondary-200); --top-accordion-nav-surface: #f8fafc; --top-accordion-nav-accent: var(--top-primary-800); }.top-accordion-navigator--light .top-accordion-navigator__item--disabled { color: var(--top-secondary-400); }.top-accordion-navigator--light .top-accordion-navigator__item--disabled .top-accordion-navigator__badge { border-color: var(--top-secondary-300); background: var(--top-secondary-100); }.top-accordion-navigator--light .top-accordion-navigator__connector { background: var(--top-secondary-300); }.top-accordion-navigator--light .top-accordion-navigator__connector--open { background: var(--top-primary-600); }.top-accordion-navigator--light .top-accordion-navigator__scroll { background: #fff; }\n</style>\n","<script lang=\"ts\">\nexport type TopAccordionNavigatorColorMode = 'inherit' | 'light' | 'dark'\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport type { TopAccordionSection, TopAccordionValue } from './internal/topAccordion'\nimport { getTopAccordionAnchorId } from './internal/topAccordion'\n\nconst props = withDefaults(\n defineProps<{\n accordionId: string\n modelValue: TopAccordionValue[]\n sections?: TopAccordionSection[]\n scrollOffset?: number\n sticky?: boolean\n stickyTop?: string\n /** Por padrão, herda o tema do consumidor. Use light ou dark para forçar a instância. */\n colorMode?: TopAccordionNavigatorColorMode\n }>(),\n { sections: () => [], scrollOffset: 0, sticky: false, stickyTop: '0px', colorMode: 'inherit' },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TopAccordionValue[]]\n navigate: [section: TopAccordionSection]\n}>()\n\nconst containerRef = ref<HTMLElement | null>(null)\nconst hasOverflow = ref(false)\nconst canScrollLeft = ref(false)\nconst canScrollRight = ref(false)\nlet resizeObserver: ResizeObserver | undefined\n\nconst openSections = computed({\n get: () => props.modelValue ?? [],\n set: (value: TopAccordionValue[]) => emit('update:modelValue', value),\n})\n\nfunction isOpen(value: TopAccordionValue) { return openSections.value.includes(value) }\nfunction updateScrollState() {\n const element = containerRef.value\n if (!element) return\n hasOverflow.value = element.scrollWidth > element.clientWidth + 1\n canScrollLeft.value = hasOverflow.value && element.scrollLeft > 1\n canScrollRight.value = hasOverflow.value && element.scrollLeft + element.clientWidth < element.scrollWidth - 1\n}\nfunction scrollByAmount(left: number) { containerRef.value?.scrollBy({ left, behavior: 'smooth' }) }\n\nasync function navigate(section: TopAccordionSection) {\n if (section.disabled) return\n if (!isOpen(section.value)) openSections.value = [...openSections.value, section.value]\n emit('navigate', section)\n await nextTick()\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()))\n const target = document.getElementById(getTopAccordionAnchorId(props.accordionId, section.value))\n if (!target) return\n window.scrollTo({\n top: target.getBoundingClientRect().top + window.scrollY - props.scrollOffset,\n behavior: 'smooth',\n })\n}\n\nonMounted(() => {\n updateScrollState()\n const element = containerRef.value\n element?.addEventListener('scroll', updateScrollState, { passive: true })\n if (typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(updateScrollState)\n if (element) resizeObserver.observe(element)\n }\n})\nonBeforeUnmount(() => { containerRef.value?.removeEventListener('scroll', updateScrollState); resizeObserver?.disconnect() })\nwatch(() => props.sections, () => nextTick(updateScrollState), { deep: true })\n</script>\n\n<template>\n <nav\n class=\"top-accordion-navigator top-solutions-component\"\n :class=\"{\n 'top-accordion-navigator--sticky': sticky,\n 'top-accordion-navigator--dark': colorMode === 'dark',\n 'top-accordion-navigator--light': colorMode === 'light',\n }\"\n :style=\"{ '--top-accordion-navigator-top': stickyTop }\"\n aria-label=\"Sumário das seções do formulário\"\n >\n <button v-if=\"hasOverflow && canScrollLeft\" class=\"top-accordion-navigator__scroll top-accordion-navigator__scroll--left\" type=\"button\" aria-label=\"Rolar seções para a esquerda\" @click=\"scrollByAmount(-240)\"><i class=\"pi pi-chevron-left\" /></button>\n <button v-if=\"hasOverflow && canScrollRight\" class=\"top-accordion-navigator__scroll top-accordion-navigator__scroll--right\" type=\"button\" aria-label=\"Rolar seções para a direita\" @click=\"scrollByAmount(240)\"><i class=\"pi pi-chevron-right\" /></button>\n <div ref=\"containerRef\" class=\"top-accordion-navigator__scroll-area\">\n <div class=\"top-accordion-navigator__items\">\n <template v-for=\"(section, index) in sections\" :key=\"section.value\">\n <button\n class=\"top-accordion-navigator__item\"\n :class=\"{ 'top-accordion-navigator__item--open': isOpen(section.value), 'top-accordion-navigator__item--disabled': section.disabled }\"\n :disabled=\"section.disabled\"\n type=\"button\"\n :aria-current=\"isOpen(section.value) ? 'step' : undefined\"\n @click=\"navigate(section)\"\n >\n <span class=\"top-accordion-navigator__badge\"><i v-if=\"section.disabled\" class=\"pi pi-lock\" /><i v-else-if=\"section.icon\" :class=\"section.icon\" /><span v-else>{{ index + 1 }}</span></span>\n <span class=\"top-accordion-navigator__label\">{{ section.label }}</span>\n </button>\n <span v-if=\"index < sections.length - 1\" class=\"top-accordion-navigator__connector\" :class=\"{ 'top-accordion-navigator__connector--open': isOpen(section.value) && isOpen(sections[index + 1]!.value) }\" aria-hidden=\"true\" />\n </template>\n </div>\n </div>\n </nav>\n</template>\n\n<style>\n.top-accordion-navigator { --top-accordion-nav-border: var(--top-secondary-200); --top-accordion-nav-surface: #f8fafc; --top-accordion-nav-accent: var(--top-primary-800); position: relative; z-index: 2; width: 100%; border-bottom: 2px solid var(--top-accordion-nav-border); background: var(--top-accordion-nav-surface); padding: .5rem 0; }\n.top-accordion-navigator--sticky { position: sticky; top: var(--top-accordion-navigator-top); }\n.top-accordion-navigator__scroll-area { overflow-x: auto; scrollbar-width: none; padding: 0 2.5rem; }.top-accordion-navigator__scroll-area::-webkit-scrollbar { display: none; }\n.top-accordion-navigator__items { display: flex; width: max-content; min-width: 100%; align-items: center; justify-content: space-evenly; gap: .5rem; }\n.top-accordion-navigator__item { display: flex; min-width: 0; flex: 0 0 auto; flex-direction: column; align-items: center; gap: .25rem; border: 0; border-radius: .5rem; background: transparent; color: var(--top-accordion-nav-accent); cursor: pointer; padding: .25rem; }\n.top-accordion-navigator__item:focus-visible { outline: 2px solid var(--top-accordion-nav-accent); outline-offset: 2px; }\n.top-accordion-navigator__badge { display: inline-flex; width: 1.75rem; height: 1.75rem; align-items: center; justify-content: center; border: 1px solid currentColor; border-radius: 50%; font-size: .75rem; font-weight: 700; transition: background-color .18s ease, color .18s ease, border-color .18s ease; }.top-accordion-navigator__badge > i { font-size: .875rem; }\n.top-accordion-navigator__item:not(:disabled):hover .top-accordion-navigator__badge { background: color-mix(in srgb, var(--top-accordion-nav-accent), transparent 90%); }\n.top-accordion-navigator__item--open .top-accordion-navigator__badge { background: var(--top-accordion-nav-accent); border-color: var(--top-accordion-nav-accent); color: #fff; box-shadow: 0 2px 5px rgb(15 23 42 / 18%); }.top-accordion-navigator__item--open:not(:disabled):hover .top-accordion-navigator__badge { background: var(--top-primary-700); border-color: var(--top-primary-700); }\n.top-accordion-navigator__item--disabled { color: var(--top-secondary-400); cursor: not-allowed; }.top-accordion-navigator__item--disabled .top-accordion-navigator__badge { border-color: var(--top-secondary-300); background: var(--top-secondary-100); }\n.top-accordion-navigator__label { max-width: 7.5rem; overflow: hidden; color: inherit; font-size: .75rem; font-weight: 700; text-align: center; text-overflow: ellipsis; white-space: nowrap; }\n.top-accordion-navigator__connector { width: 2rem; height: 1px; flex: 1 0 2rem; background: var(--top-secondary-300); }.top-accordion-navigator__connector--open { background: var(--top-primary-600); }\n.top-accordion-navigator__scroll { position: absolute; top: 50%; z-index: 1; display: inline-flex; width: 1.75rem; height: 1.75rem; align-items: center; justify-content: center; border: 1px solid color-mix(in srgb, var(--top-accordion-nav-accent), transparent 70%); border-radius: 50%; background: #fff; color: var(--top-accordion-nav-accent); box-shadow: 0 1px 3px rgb(15 23 42 / 15%); cursor: pointer; transform: translateY(-50%); }.top-accordion-navigator__scroll--left { left: .25rem; }.top-accordion-navigator__scroll--right { right: .25rem; }\n.dark .top-accordion-navigator, .top-accordion-navigator--dark { --top-accordion-nav-border: #3f3f46; --top-accordion-nav-surface: #18181b; --top-accordion-nav-accent: var(--top-primary-600); }.dark .top-accordion-navigator__item--disabled, .top-accordion-navigator--dark .top-accordion-navigator__item--disabled { color: #71717a; }.dark .top-accordion-navigator__item--disabled .top-accordion-navigator__badge, .top-accordion-navigator--dark .top-accordion-navigator__item--disabled .top-accordion-navigator__badge { border-color: #52525b; background: #27272a; }.dark .top-accordion-navigator__connector, .top-accordion-navigator--dark .top-accordion-navigator__connector { background: #52525b; }.dark .top-accordion-navigator__connector--open, .top-accordion-navigator--dark .top-accordion-navigator__connector--open { background: var(--top-primary-600); }.dark .top-accordion-navigator__scroll, .top-accordion-navigator--dark .top-accordion-navigator__scroll { background: #27272a; }\n.top-accordion-navigator--light { --top-accordion-nav-border: var(--top-secondary-200); --top-accordion-nav-surface: #f8fafc; --top-accordion-nav-accent: var(--top-primary-800); }.top-accordion-navigator--light .top-accordion-navigator__item--disabled { color: var(--top-secondary-400); }.top-accordion-navigator--light .top-accordion-navigator__item--disabled .top-accordion-navigator__badge { border-color: var(--top-secondary-300); background: var(--top-secondary-100); }.top-accordion-navigator--light .top-accordion-navigator__connector { background: var(--top-secondary-300); }.top-accordion-navigator--light .top-accordion-navigator__connector--open { background: var(--top-primary-600); }.top-accordion-navigator--light .top-accordion-navigator__scroll { background: #fff; }\n</style>\n","<script setup lang=\"ts\">\nimport Toast from 'primevue/toast'\nimport type { ToastMessageOptions } from 'primevue/toast'\nimport type {\n TopToastAction,\n TopToastData,\n TopToastFooter,\n} from '../types/toast'\n\nexport type { TopToastAction, TopToastData, TopToastFooter }\n\ntype TopToastMessage = ToastMessageOptions\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\">\nimport Toast from 'primevue/toast'\nimport type { ToastMessageOptions } from 'primevue/toast'\nimport type {\n TopToastAction,\n TopToastData,\n TopToastFooter,\n} from '../types/toast'\n\nexport type { TopToastAction, TopToastData, TopToastFooter }\n\ntype TopToastMessage = ToastMessageOptions\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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"}
1
+ {"version":3,"file":"TopToast-BI4cWWtd.js","names":["_hoisted_1","$attrs","$slots","$attrs","$attrs","$slots","$attrs","$slots"],"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/TopInputNumber.vue","../src/components/TopInputNumber.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/internal/topAccordion.ts","../src/components/TopAccordion.vue","../src/components/TopAccordion.vue","../src/components/TopAccordionSummary.vue","../src/components/TopAccordionSummary.vue","../src/components/TopAccordionPanel.vue","../src/components/TopAccordionPanel.vue","../src/components/TopAccordionNavigator.vue","../src/components/TopAccordionNavigator.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\">\nimport { computed, nextTick, useAttrs, useId, useSlots } from 'vue'\nimport InputNumber from 'primevue/inputnumber'\nimport InputText from 'primevue/inputtext'\nimport type { InputNumberBlurEvent, InputNumberInputEvent } from 'primevue/inputnumber'\n\nexport type TopInputNumberValue = number | null\nexport type TopInputNumberMode = 'decimal' | 'currency'\nexport type TopInputNumberButtonLayout = 'stacked' | 'horizontal' | 'vertical'\nexport type TopInputNumberCurrencyInputMode = 'decimal' | 'cents'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: TopInputNumberValue\n label?: string\n placeholder?: string\n required?: boolean\n error?: string\n invalid?: boolean\n disabled?: boolean\n readonly?: boolean\n format?: boolean\n showButtons?: boolean\n buttonLayout?: TopInputNumberButtonLayout\n locale?: string\n mode?: TopInputNumberMode\n currency?: string\n currencyDisplay?: 'symbol' | 'code' | 'name'\n currencyInputMode?: TopInputNumberCurrencyInputMode\n currencyFractionDigits?: number\n cents?: boolean\n centsFractionDigits?: number\n useGrouping?: boolean\n minFractionDigits?: number\n maxFractionDigits?: number\n min?: number\n max?: number\n step?: number\n allowEmpty?: boolean\n highlightOnFocus?: boolean\n showClear?: boolean\n }>(),\n {\n modelValue: null,\n label: '',\n placeholder: '',\n required: false,\n error: '',\n invalid: false,\n disabled: false,\n readonly: false,\n format: true,\n showButtons: false,\n buttonLayout: 'stacked',\n locale: 'pt-BR',\n mode: 'decimal',\n currency: undefined,\n currencyDisplay: 'symbol',\n currencyInputMode: 'cents',\n currencyFractionDigits: undefined,\n cents: true,\n centsFractionDigits: undefined,\n useGrouping: true,\n minFractionDigits: undefined,\n maxFractionDigits: undefined,\n min: undefined,\n max: undefined,\n step: 1,\n allowEmpty: true,\n highlightOnFocus: false,\n showClear: false,\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TopInputNumberValue]\n 'value-change': [value: TopInputNumberValue]\n input: [event: InputNumberInputEvent]\n focus: [event: Event]\n blur: [event: InputNumberBlurEvent]\n}>()\n\nconst attrs = useAttrs()\nconst slots = useSlots()\nconst generatedId = useId()\n\nconst inputId = computed(() =>\n attrs.id === undefined || attrs.id === null || attrs.id === ''\n ? generatedId\n : String(attrs.id),\n)\nconst errorId = computed(() => `${inputId.value}-error`)\nconst isInvalid = computed(() => props.invalid || Boolean(props.error))\nconst ariaInvalid = computed<\n boolean | 'true' | 'false' | 'grammar' | 'spelling' | undefined\n>(() => {\n if (isInvalid.value) return true\n\n const value = attrs['aria-invalid']\n return typeof value === 'boolean' ||\n value === 'true' ||\n value === 'false' ||\n value === 'grammar' ||\n value === 'spelling'\n ? value\n : undefined\n})\nconst describedBy = computed(() => {\n const externalDescription = attrs['aria-describedby']\n const ids = [\n typeof externalDescription === 'string' ? externalDescription : '',\n props.error ? errorId.value : '',\n ].filter(Boolean)\n\n return ids.length ? ids.join(' ') : undefined\n})\n\n// O modo caixa eletrônico (máscara de centavos) só pode ser ativado no modo 'currency'\nconst currencyMaskEnabled = computed(() =>\n props.mode === 'currency' &&\n props.cents &&\n props.currencyInputMode !== 'decimal',\n)\n\n// No modo decimal, permite a digitação de vírgula liberando até 20 casas se maxFractionDigits for undefined\nconst resolvedMaxFractionDigits = computed(() => {\n if (props.maxFractionDigits !== undefined) return props.maxFractionDigits\n return props.mode === 'decimal' ? 20 : undefined\n})\n\nconst resolvedCurrencyFractionDigits = computed(() => {\n const digits = props.centsFractionDigits ?? props.currencyFractionDigits ?? props.maxFractionDigits ?? 2\n return Math.min(20, Math.max(0, digits))\n})\n\nconst forwardedAttrs = computed(() => {\n const {\n id: _id,\n 'aria-describedby': _ariaDescribedby,\n 'aria-invalid': _ariaInvalid,\n ...rest\n } = attrs\n\n return rest\n})\n\nconst inputNumberPt = computed(() => {\n const customPt = attrs.pt\n const pt = customPt && typeof customPt === 'object'\n ? customPt as Record<string, unknown>\n : {}\n const inputTextPt = pt.pcInputText && typeof pt.pcInputText === 'object'\n ? pt.pcInputText as Record<string, unknown>\n : {}\n const inputRootPt = inputTextPt.root && typeof inputTextPt.root === 'object'\n ? inputTextPt.root as Record<string, unknown>\n : {}\n\n return {\n ...pt,\n pcInputText: {\n ...inputTextPt,\n root: {\n ...inputRootPt,\n 'aria-invalid': ariaInvalid.value,\n 'aria-describedby': describedBy.value,\n },\n },\n }\n})\n\nfunction updateModelValue(value: number | null | undefined) {\n emit('update:modelValue', value ?? null)\n}\n\nfunction normalizeCurrencyValue(value: number) {\n if (props.min !== undefined && value < props.min) return props.min\n if (props.max !== undefined && value > props.max) return props.max\n return value\n}\n\nfunction formatCurrencyCents(value: TopInputNumberValue) {\n if (value === null) return ''\n\n return new Intl.NumberFormat(props.locale, {\n style: 'currency',\n currency: props.currency || 'BRL',\n currencyDisplay: props.currencyDisplay,\n useGrouping: props.useGrouping,\n minimumFractionDigits: resolvedCurrencyFractionDigits.value,\n maximumFractionDigits: resolvedCurrencyFractionDigits.value,\n }).format(value)\n}\n\nfunction updateCurrencyCents(event: Event) {\n const input = event.target\n if (!(input instanceof HTMLInputElement)) return\n\n const digits = input.value.replace(/\\D/g, '')\n const divisor = 10 ** resolvedCurrencyFractionDigits.value\n const value = digits\n ? normalizeCurrencyValue(Number(digits) / divisor)\n : props.allowEmpty ? null : 0\n\n const formattedValue = formatCurrencyCents(value)\n input.value = formattedValue\n emit('update:modelValue', value)\n emit('input', {\n originalEvent: event,\n value: value ?? undefined,\n formattedValue,\n })\n nextTick(() => {\n input.value = formattedValue\n })\n}\n\nfunction handleCurrencyBlur(event: Event) {\n const input = event.target\n emit('blur', {\n originalEvent: event,\n value: input instanceof HTMLInputElement ? input.value : '',\n })\n}\n</script>\n\n<template>\n <div class=\"top-input-number top-solutions-component flex w-full flex-col gap-1\">\n <label\n v-if=\"label\"\n :for=\"inputId\"\n class=\"top-field-label text-xs font-bold\"\n >\n {{ label }}\n <span v-if=\"required\" aria-hidden=\"true\" class=\"text-red-600 dark:text-red-400\">*</span>\n </label>\n\n <InputText\n v-if=\"currencyMaskEnabled\"\n v-bind=\"forwardedAttrs\"\n :id=\"inputId\"\n :model-value=\"formatCurrencyCents(modelValue)\"\n type=\"text\"\n inputmode=\"numeric\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :invalid=\"isInvalid\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :aria-invalid=\"ariaInvalid\"\n :aria-describedby=\"describedBy\"\n fluid\n class=\"top-input-number__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\"\n @input=\"updateCurrencyCents\"\n @focus=\"emit('focus', $event)\"\n @blur=\"handleCurrencyBlur\"\n />\n\n <InputNumber\n v-else\n v-bind=\"forwardedAttrs\"\n :model-value=\"modelValue\"\n :input-id=\"inputId\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :invalid=\"isInvalid\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :format=\"format\"\n :show-buttons=\"showButtons\"\n :button-layout=\"buttonLayout\"\n :locale=\"locale\"\n :mode=\"mode\"\n :currency=\"currency\"\n :currency-display=\"currencyDisplay\"\n :use-grouping=\"useGrouping\"\n :min-fraction-digits=\"minFractionDigits\"\n :max-fraction-digits=\"resolvedMaxFractionDigits\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :allow-empty=\"allowEmpty\"\n :highlight-on-focus=\"highlightOnFocus\"\n :show-clear=\"showClear\"\n :aria-invalid=\"ariaInvalid\"\n :aria-describedby=\"describedBy\"\n :pt=\"inputNumberPt\"\n input-class=\"top-input-number__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\"\n fluid\n @update:model-value=\"updateModelValue\"\n @value-change=\"emit('value-change', $event ?? null)\"\n @input=\"emit('input', $event)\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n >\n <template v-for=\"(_, name) in slots\" #[name]=\"slotProps\">\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\n </template>\n </InputNumber>\n\n <span\n v-if=\"error\"\n :id=\"errorId\"\n class=\"text-[11px] text-red-600 dark:text-red-400\"\n role=\"alert\"\n >\n {{ error }}\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, useAttrs, useId, useSlots } from 'vue'\nimport InputNumber from 'primevue/inputnumber'\nimport InputText from 'primevue/inputtext'\nimport type { InputNumberBlurEvent, InputNumberInputEvent } from 'primevue/inputnumber'\n\nexport type TopInputNumberValue = number | null\nexport type TopInputNumberMode = 'decimal' | 'currency'\nexport type TopInputNumberButtonLayout = 'stacked' | 'horizontal' | 'vertical'\nexport type TopInputNumberCurrencyInputMode = 'decimal' | 'cents'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(\n defineProps<{\n modelValue?: TopInputNumberValue\n label?: string\n placeholder?: string\n required?: boolean\n error?: string\n invalid?: boolean\n disabled?: boolean\n readonly?: boolean\n format?: boolean\n showButtons?: boolean\n buttonLayout?: TopInputNumberButtonLayout\n locale?: string\n mode?: TopInputNumberMode\n currency?: string\n currencyDisplay?: 'symbol' | 'code' | 'name'\n currencyInputMode?: TopInputNumberCurrencyInputMode\n currencyFractionDigits?: number\n cents?: boolean\n centsFractionDigits?: number\n useGrouping?: boolean\n minFractionDigits?: number\n maxFractionDigits?: number\n min?: number\n max?: number\n step?: number\n allowEmpty?: boolean\n highlightOnFocus?: boolean\n showClear?: boolean\n }>(),\n {\n modelValue: null,\n label: '',\n placeholder: '',\n required: false,\n error: '',\n invalid: false,\n disabled: false,\n readonly: false,\n format: true,\n showButtons: false,\n buttonLayout: 'stacked',\n locale: 'pt-BR',\n mode: 'decimal',\n currency: undefined,\n currencyDisplay: 'symbol',\n currencyInputMode: 'cents',\n currencyFractionDigits: undefined,\n cents: true,\n centsFractionDigits: undefined,\n useGrouping: true,\n minFractionDigits: undefined,\n maxFractionDigits: undefined,\n min: undefined,\n max: undefined,\n step: 1,\n allowEmpty: true,\n highlightOnFocus: false,\n showClear: false,\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TopInputNumberValue]\n 'value-change': [value: TopInputNumberValue]\n input: [event: InputNumberInputEvent]\n focus: [event: Event]\n blur: [event: InputNumberBlurEvent]\n}>()\n\nconst attrs = useAttrs()\nconst slots = useSlots()\nconst generatedId = useId()\n\nconst inputId = computed(() =>\n attrs.id === undefined || attrs.id === null || attrs.id === ''\n ? generatedId\n : String(attrs.id),\n)\nconst errorId = computed(() => `${inputId.value}-error`)\nconst isInvalid = computed(() => props.invalid || Boolean(props.error))\nconst ariaInvalid = computed<\n boolean | 'true' | 'false' | 'grammar' | 'spelling' | undefined\n>(() => {\n if (isInvalid.value) return true\n\n const value = attrs['aria-invalid']\n return typeof value === 'boolean' ||\n value === 'true' ||\n value === 'false' ||\n value === 'grammar' ||\n value === 'spelling'\n ? value\n : undefined\n})\nconst describedBy = computed(() => {\n const externalDescription = attrs['aria-describedby']\n const ids = [\n typeof externalDescription === 'string' ? externalDescription : '',\n props.error ? errorId.value : '',\n ].filter(Boolean)\n\n return ids.length ? ids.join(' ') : undefined\n})\n\n// O modo caixa eletrônico (máscara de centavos) só pode ser ativado no modo 'currency'\nconst currencyMaskEnabled = computed(() =>\n props.mode === 'currency' &&\n props.cents &&\n props.currencyInputMode !== 'decimal',\n)\n\n// No modo decimal, permite a digitação de vírgula liberando até 20 casas se maxFractionDigits for undefined\nconst resolvedMaxFractionDigits = computed(() => {\n if (props.maxFractionDigits !== undefined) return props.maxFractionDigits\n return props.mode === 'decimal' ? 20 : undefined\n})\n\nconst resolvedCurrencyFractionDigits = computed(() => {\n const digits = props.centsFractionDigits ?? props.currencyFractionDigits ?? props.maxFractionDigits ?? 2\n return Math.min(20, Math.max(0, digits))\n})\n\nconst forwardedAttrs = computed(() => {\n const {\n id: _id,\n 'aria-describedby': _ariaDescribedby,\n 'aria-invalid': _ariaInvalid,\n ...rest\n } = attrs\n\n return rest\n})\n\nconst inputNumberPt = computed(() => {\n const customPt = attrs.pt\n const pt = customPt && typeof customPt === 'object'\n ? customPt as Record<string, unknown>\n : {}\n const inputTextPt = pt.pcInputText && typeof pt.pcInputText === 'object'\n ? pt.pcInputText as Record<string, unknown>\n : {}\n const inputRootPt = inputTextPt.root && typeof inputTextPt.root === 'object'\n ? inputTextPt.root as Record<string, unknown>\n : {}\n\n return {\n ...pt,\n pcInputText: {\n ...inputTextPt,\n root: {\n ...inputRootPt,\n 'aria-invalid': ariaInvalid.value,\n 'aria-describedby': describedBy.value,\n },\n },\n }\n})\n\nfunction updateModelValue(value: number | null | undefined) {\n emit('update:modelValue', value ?? null)\n}\n\nfunction normalizeCurrencyValue(value: number) {\n if (props.min !== undefined && value < props.min) return props.min\n if (props.max !== undefined && value > props.max) return props.max\n return value\n}\n\nfunction formatCurrencyCents(value: TopInputNumberValue) {\n if (value === null) return ''\n\n return new Intl.NumberFormat(props.locale, {\n style: 'currency',\n currency: props.currency || 'BRL',\n currencyDisplay: props.currencyDisplay,\n useGrouping: props.useGrouping,\n minimumFractionDigits: resolvedCurrencyFractionDigits.value,\n maximumFractionDigits: resolvedCurrencyFractionDigits.value,\n }).format(value)\n}\n\nfunction updateCurrencyCents(event: Event) {\n const input = event.target\n if (!(input instanceof HTMLInputElement)) return\n\n const digits = input.value.replace(/\\D/g, '')\n const divisor = 10 ** resolvedCurrencyFractionDigits.value\n const value = digits\n ? normalizeCurrencyValue(Number(digits) / divisor)\n : props.allowEmpty ? null : 0\n\n const formattedValue = formatCurrencyCents(value)\n input.value = formattedValue\n emit('update:modelValue', value)\n emit('input', {\n originalEvent: event,\n value: value ?? undefined,\n formattedValue,\n })\n nextTick(() => {\n input.value = formattedValue\n })\n}\n\nfunction handleCurrencyBlur(event: Event) {\n const input = event.target\n emit('blur', {\n originalEvent: event,\n value: input instanceof HTMLInputElement ? input.value : '',\n })\n}\n</script>\n\n<template>\n <div class=\"top-input-number top-solutions-component flex w-full flex-col gap-1\">\n <label\n v-if=\"label\"\n :for=\"inputId\"\n class=\"top-field-label text-xs font-bold\"\n >\n {{ label }}\n <span v-if=\"required\" aria-hidden=\"true\" class=\"text-red-600 dark:text-red-400\">*</span>\n </label>\n\n <InputText\n v-if=\"currencyMaskEnabled\"\n v-bind=\"forwardedAttrs\"\n :id=\"inputId\"\n :model-value=\"formatCurrencyCents(modelValue)\"\n type=\"text\"\n inputmode=\"numeric\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :invalid=\"isInvalid\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :aria-invalid=\"ariaInvalid\"\n :aria-describedby=\"describedBy\"\n fluid\n class=\"top-input-number__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\"\n @input=\"updateCurrencyCents\"\n @focus=\"emit('focus', $event)\"\n @blur=\"handleCurrencyBlur\"\n />\n\n <InputNumber\n v-else\n v-bind=\"forwardedAttrs\"\n :model-value=\"modelValue\"\n :input-id=\"inputId\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :invalid=\"isInvalid\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :format=\"format\"\n :show-buttons=\"showButtons\"\n :button-layout=\"buttonLayout\"\n :locale=\"locale\"\n :mode=\"mode\"\n :currency=\"currency\"\n :currency-display=\"currencyDisplay\"\n :use-grouping=\"useGrouping\"\n :min-fraction-digits=\"minFractionDigits\"\n :max-fraction-digits=\"resolvedMaxFractionDigits\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :allow-empty=\"allowEmpty\"\n :highlight-on-focus=\"highlightOnFocus\"\n :show-clear=\"showClear\"\n :aria-invalid=\"ariaInvalid\"\n :aria-describedby=\"describedBy\"\n :pt=\"inputNumberPt\"\n input-class=\"top-input-number__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\"\n fluid\n @update:model-value=\"updateModelValue\"\n @value-change=\"emit('value-change', $event ?? null)\"\n @input=\"emit('input', $event)\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n >\n <template v-for=\"(_, name) in slots\" #[name]=\"slotProps\">\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\n </template>\n </InputNumber>\n\n <span\n v-if=\"error\"\n :id=\"errorId\"\n class=\"text-[11px] text-red-600 dark:text-red-400\"\n role=\"alert\"\n >\n {{ error }}\n </span>\n </div>\n</template>\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 = {\n name: string\r\n subtitle?: string\r\n avatarUrl?: string\r\n initials?: string\r\n data?: unknown\n}\n\n/** Contexto visual da organização, cliente ou escopo ativo. Não possui ação própria. */\nexport type TopNavClient = {\n name: string\n subtitle?: string\n logoUrl?: string\n initials?: string\n data?: unknown\n}\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[]\n client?: TopNavClient\n user?: TopNavUser\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(() =>\n Boolean(slots['user-menu']) || cleanUserMenuItems.value.some((item) => !item.separator),\n)\nconst hasUser = computed(() => Boolean(props.user) || Boolean(slots.user))\nconst hasContext = computed(() => Boolean(props.client || slots.context || slots.scope || slots.client || slots['context-compact']))\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(() =>\n visibleSections.value.length > 0 || props.searchable || quickActions.value.length > 0 || hasUser.value ||\n Boolean(slots['drawer-menu'] || slots['drawer-actions'] || slots['drawer-footer']),\r\n)\r\nconst userInitials = computed(() => {\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})\nconst clientInitials = computed(() => {\n if (!props.client) return ''\n if (props.client.initials) return props.client.initials\n return props.client.name.split(/\\s+/).filter(Boolean).slice(0, 2)\n .map((part) => part[0]?.toLocaleUpperCase('pt-BR')).join('')\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>\n\n <div class=\"top-nav-bar__brand\"><slot name=\"brand\" :compact=\"headerCompact.hideContextDetails\" /></div>\n <div v-if=\"hasContext\" class=\"top-nav-bar__brand-context-divider\" aria-hidden=\"true\" />\n <div v-if=\"hasContext\" class=\"top-nav-bar__context\">\n <slot v-if=\"headerCompact.hideContextDetails && $slots['context-compact']\" name=\"context-compact\" :client=\"client\" :compact=\"true\" />\n <slot v-else-if=\"$slots.context\" name=\"context\" :client=\"client\" :compact=\"headerCompact.hideContextDetails\" />\n <slot v-else-if=\"$slots.scope\" name=\"scope\" :client=\"client\" :compact=\"headerCompact.hideContextDetails\" />\n <slot v-else name=\"client\" :client=\"client\" :compact=\"headerCompact.hideContextDetails\">\n <div v-if=\"client\" class=\"top-nav-bar__client\">\n <img v-if=\"client.logoUrl\" :src=\"client.logoUrl\" alt=\"\" class=\"top-nav-bar__client-logo\" />\n <span v-else class=\"top-nav-bar__client-logo\">{{ clientInitials }}</span>\n <span v-if=\"!headerCompact.hideContextDetails\" class=\"top-nav-bar__client-details\">\n <span class=\"top-nav-bar__client-name\">{{ client.name }}</span>\n <span v-if=\"client.subtitle\" class=\"top-nav-bar__client-subtitle\">{{ client.subtitle }}</span>\n </span>\n </div>\n </slot>\n </div>\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\">\n <slot v-if=\"hasUser\" name=\"drawer-user\" :user=\"user\" :client=\"client\" :open=\"drawerUserOpen\" :toggle=\"() => (drawerUserOpen = !drawerUserOpen)\">\n <button class=\"top-nav-bar__drawer-user\" type=\"button\" :aria-haspopup=\"hasUserMenu ? 'menu' : undefined\" :aria-expanded=\"hasUserMenu ? drawerUserOpen : undefined\" @click=\"toggleDrawerUserMenu\">\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=\"client\" class=\"top-nav-bar__drawer-user-context\"><span class=\"top-nav-bar__drawer-user-client\"><i class=\"pi pi-building\" aria-hidden=\"true\" />{{ client.name }}</span><span v-if=\"client.subtitle\" class=\"top-nav-bar__drawer-user-client-subtitle\">{{ client.subtitle }}</span></span></span><i v-if=\"hasUserMenu\" class=\"pi pi-chevron-down top-nav-bar__mobile-chevron\" aria-hidden=\"true\" />\n </button>\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; }\n.top-nav-bar__brand { flex: 0 1 auto; overflow: hidden; }\n.top-nav-bar__brand-context-divider { display: none; width: 1px; height: 2.5rem; flex: 0 0 1px; background: var(--top-nav-border, rgb(255 255 255 / 20%)); }\n.top-nav-bar__context { flex: 0 1 auto; overflow: hidden; transition: max-width .15s ease; }\n.top-nav-bar__header--context-compact .top-nav-bar__context { max-width: var(--top-nav-context-compact-width, 3.25rem); }\n.top-nav-bar__client { display: inline-flex; max-width: 22rem; min-width: 0; 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; padding: .3rem .5rem; }\n.top-nav-bar__client-logo { display: inline-flex; width: 2rem; height: 2rem; flex: 0 0 2rem; align-items: center; justify-content: center; overflow: hidden; border-radius: calc(var(--top-nav-radius, 8px) - 2px); 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); }\nimg.top-nav-bar__client-logo { display: block; object-fit: contain; padding: .125rem; }\n.top-nav-bar__client-details { display: flex; min-width: 0; flex-direction: column; }\n.top-nav-bar__client-name, .top-nav-bar__client-subtitle { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.top-nav-bar__client-name { font-size: var(--top-nav-secondary-font-size, .875em); font-weight: var(--top-nav-strong-font-weight, 700); }\n.top-nav-bar__client-subtitle { color: var(--top-nav-muted-fg, #bfdbfe); font-size: var(--top-nav-caption-font-size, .75em); }\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; padding-bottom: max(.75rem, env(safe-area-inset-bottom, 0px)); }\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; }\n.top-nav-bar__drawer-user:focus { background: transparent; outline: 0; }\n.top-nav-bar__drawer-user:focus-visible { outline: 2px solid rgb(255 255 255 / 75%); outline-offset: 2px; }\n.top-nav-bar__drawer-user .top-nav-bar__user-details { flex: 1 1 auto; }\n.top-nav-bar__drawer-user .top-nav-bar__user-name { max-width: none; overflow: visible; white-space: normal; overflow-wrap: anywhere; }\n.top-nav-bar__drawer-user-context { display: flex; min-width: 0; flex-wrap: wrap; align-items: center; gap: .35rem .5rem; margin-top: .25rem; }\n.top-nav-bar__drawer-user-client { display: inline-flex; min-width: 0; align-items: center; gap: .3rem; color: var(--top-nav-muted-fg, #bfdbfe); font-size: var(--top-nav-caption-font-size, .75em); line-height: 1.2; overflow-wrap: anywhere; }\n.top-nav-bar__drawer-user-client-subtitle { min-width: 0; border-radius: .25rem; background: var(--top-nav-accent, #facc15); color: var(--top-nav-accent-contrast, #4a3300); padding: .15rem .35rem; font-size: var(--top-nav-caption-font-size, .75em); font-weight: var(--top-nav-strong-font-weight, 700); line-height: 1.2; overflow-wrap: anywhere; }\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) {\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}\n\n@media (min-width: 1536px) {\n .top-nav-bar__brand-context-divider { display: block; }\n}\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 = {\n name: string\r\n subtitle?: string\r\n avatarUrl?: string\r\n initials?: string\r\n data?: unknown\n}\n\n/** Contexto visual da organização, cliente ou escopo ativo. Não possui ação própria. */\nexport type TopNavClient = {\n name: string\n subtitle?: string\n logoUrl?: string\n initials?: string\n data?: unknown\n}\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[]\n client?: TopNavClient\n user?: TopNavUser\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(() =>\n Boolean(slots['user-menu']) || cleanUserMenuItems.value.some((item) => !item.separator),\n)\nconst hasUser = computed(() => Boolean(props.user) || Boolean(slots.user))\nconst hasContext = computed(() => Boolean(props.client || slots.context || slots.scope || slots.client || slots['context-compact']))\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(() =>\n visibleSections.value.length > 0 || props.searchable || quickActions.value.length > 0 || hasUser.value ||\n Boolean(slots['drawer-menu'] || slots['drawer-actions'] || slots['drawer-footer']),\r\n)\r\nconst userInitials = computed(() => {\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})\nconst clientInitials = computed(() => {\n if (!props.client) return ''\n if (props.client.initials) return props.client.initials\n return props.client.name.split(/\\s+/).filter(Boolean).slice(0, 2)\n .map((part) => part[0]?.toLocaleUpperCase('pt-BR')).join('')\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>\n\n <div class=\"top-nav-bar__brand\"><slot name=\"brand\" :compact=\"headerCompact.hideContextDetails\" /></div>\n <div v-if=\"hasContext\" class=\"top-nav-bar__brand-context-divider\" aria-hidden=\"true\" />\n <div v-if=\"hasContext\" class=\"top-nav-bar__context\">\n <slot v-if=\"headerCompact.hideContextDetails && $slots['context-compact']\" name=\"context-compact\" :client=\"client\" :compact=\"true\" />\n <slot v-else-if=\"$slots.context\" name=\"context\" :client=\"client\" :compact=\"headerCompact.hideContextDetails\" />\n <slot v-else-if=\"$slots.scope\" name=\"scope\" :client=\"client\" :compact=\"headerCompact.hideContextDetails\" />\n <slot v-else name=\"client\" :client=\"client\" :compact=\"headerCompact.hideContextDetails\">\n <div v-if=\"client\" class=\"top-nav-bar__client\">\n <img v-if=\"client.logoUrl\" :src=\"client.logoUrl\" alt=\"\" class=\"top-nav-bar__client-logo\" />\n <span v-else class=\"top-nav-bar__client-logo\">{{ clientInitials }}</span>\n <span v-if=\"!headerCompact.hideContextDetails\" class=\"top-nav-bar__client-details\">\n <span class=\"top-nav-bar__client-name\">{{ client.name }}</span>\n <span v-if=\"client.subtitle\" class=\"top-nav-bar__client-subtitle\">{{ client.subtitle }}</span>\n </span>\n </div>\n </slot>\n </div>\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\">\n <slot v-if=\"hasUser\" name=\"drawer-user\" :user=\"user\" :client=\"client\" :open=\"drawerUserOpen\" :toggle=\"() => (drawerUserOpen = !drawerUserOpen)\">\n <button class=\"top-nav-bar__drawer-user\" type=\"button\" :aria-haspopup=\"hasUserMenu ? 'menu' : undefined\" :aria-expanded=\"hasUserMenu ? drawerUserOpen : undefined\" @click=\"toggleDrawerUserMenu\">\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=\"client\" class=\"top-nav-bar__drawer-user-context\"><span class=\"top-nav-bar__drawer-user-client\"><i class=\"pi pi-building\" aria-hidden=\"true\" />{{ client.name }}</span><span v-if=\"client.subtitle\" class=\"top-nav-bar__drawer-user-client-subtitle\">{{ client.subtitle }}</span></span></span><i v-if=\"hasUserMenu\" class=\"pi pi-chevron-down top-nav-bar__mobile-chevron\" aria-hidden=\"true\" />\n </button>\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; }\n.top-nav-bar__brand { flex: 0 1 auto; overflow: hidden; }\n.top-nav-bar__brand-context-divider { display: none; width: 1px; height: 2.5rem; flex: 0 0 1px; background: var(--top-nav-border, rgb(255 255 255 / 20%)); }\n.top-nav-bar__context { flex: 0 1 auto; overflow: hidden; transition: max-width .15s ease; }\n.top-nav-bar__header--context-compact .top-nav-bar__context { max-width: var(--top-nav-context-compact-width, 3.25rem); }\n.top-nav-bar__client { display: inline-flex; max-width: 22rem; min-width: 0; 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; padding: .3rem .5rem; }\n.top-nav-bar__client-logo { display: inline-flex; width: 2rem; height: 2rem; flex: 0 0 2rem; align-items: center; justify-content: center; overflow: hidden; border-radius: calc(var(--top-nav-radius, 8px) - 2px); 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); }\nimg.top-nav-bar__client-logo { display: block; object-fit: contain; padding: .125rem; }\n.top-nav-bar__client-details { display: flex; min-width: 0; flex-direction: column; }\n.top-nav-bar__client-name, .top-nav-bar__client-subtitle { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.top-nav-bar__client-name { font-size: var(--top-nav-secondary-font-size, .875em); font-weight: var(--top-nav-strong-font-weight, 700); }\n.top-nav-bar__client-subtitle { color: var(--top-nav-muted-fg, #bfdbfe); font-size: var(--top-nav-caption-font-size, .75em); }\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; padding-bottom: max(.75rem, env(safe-area-inset-bottom, 0px)); }\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; }\n.top-nav-bar__drawer-user:focus { background: transparent; outline: 0; }\n.top-nav-bar__drawer-user:focus-visible { outline: 2px solid rgb(255 255 255 / 75%); outline-offset: 2px; }\n.top-nav-bar__drawer-user .top-nav-bar__user-details { flex: 1 1 auto; }\n.top-nav-bar__drawer-user .top-nav-bar__user-name { max-width: none; overflow: visible; white-space: normal; overflow-wrap: anywhere; }\n.top-nav-bar__drawer-user-context { display: flex; min-width: 0; flex-wrap: wrap; align-items: center; gap: .35rem .5rem; margin-top: .25rem; }\n.top-nav-bar__drawer-user-client { display: inline-flex; min-width: 0; align-items: center; gap: .3rem; color: var(--top-nav-muted-fg, #bfdbfe); font-size: var(--top-nav-caption-font-size, .75em); line-height: 1.2; overflow-wrap: anywhere; }\n.top-nav-bar__drawer-user-client-subtitle { min-width: 0; border-radius: .25rem; background: var(--top-nav-accent, #facc15); color: var(--top-nav-accent-contrast, #4a3300); padding: .15rem .35rem; font-size: var(--top-nav-caption-font-size, .75em); font-weight: var(--top-nav-strong-font-weight, 700); line-height: 1.2; overflow-wrap: anywhere; }\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) {\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}\n\n@media (min-width: 1536px) {\n .top-nav-bar__brand-context-divider { display: block; }\n}\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","export type TopAccordionValue = string | number\n\nexport type TopAccordionSummaryItem = {\n label: string\n value?: unknown\n valor?: unknown\n}\n\nexport type TopAccordionSection = {\n value: TopAccordionValue\n label: string\n /** Classe de ícone, por exemplo `pi pi-file`. Para SVGs, use o slot `icon`. */\n icon?: string\n disabled?: boolean\n}\n\nexport function getTopAccordionAnchorId(accordionId: string, value: TopAccordionValue) {\n return `${accordionId}--section-${encodeURIComponent(String(value))}`\n}\n","<script lang=\"ts\">\nimport type { ComputedRef, Ref } from 'vue'\nimport type { TopAccordionSection, TopAccordionValue } from './internal/topAccordion'\nexport type { TopAccordionSection, TopAccordionSummaryItem, TopAccordionValue } from './internal/topAccordion'\n\nexport const topAccordionContextKey = Symbol('top-accordion-context')\n\nexport type TopAccordionContext = {\n accordionId: string\n sections: ComputedRef<TopAccordionSection[]>\n openSections: Ref<TopAccordionValue[]>\n isOpen: (value: TopAccordionValue) => boolean\n getSection: (value: TopAccordionValue) => TopAccordionSection | undefined\n getAnchorId: (value: TopAccordionValue) => string\n}\n</script>\n\n<script setup lang=\"ts\">\nimport Accordion from 'primevue/accordion'\nimport { computed, nextTick, provide, ref } from 'vue'\nimport { getTopAccordionAnchorId } from './internal/topAccordion'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(\n defineProps<{\n /** Identificador estável compartilhado com TopAccordionNavigator. */\n id: string\n modelValue: TopAccordionValue[]\n sections?: TopAccordionSection[]\n multiple?: boolean\n }>(),\n { sections: () => [], multiple: true },\n)\n\nconst emit = defineEmits<{ 'update:modelValue': [value: TopAccordionValue[]] }>()\n\nconst openSections = computed({\n get: () => props.modelValue ?? [],\n set: (value: TopAccordionValue[]) => emit('update:modelValue', value),\n})\nconst sections = computed(() => props.sections)\nconst rootRef = ref<HTMLElement | null>(null)\nconst primeValue = computed(() => openSections.value as string[] | number[])\n\nfunction getSection(value: TopAccordionValue) {\n return sections.value.find((section) => section.value === value)\n}\n\nfunction isOpen(value: TopAccordionValue) {\n return openSections.value.includes(value)\n}\n\nfunction getAnchorId(value: TopAccordionValue) {\n return getTopAccordionAnchorId(props.id, value)\n}\n\nfunction updatePrimeValue(value: string | string[] | null | undefined) {\n openSections.value = Array.isArray(value) ? value : value === null || value === undefined ? [] : [value]\n}\n\nasync function reveal(value: TopAccordionValue, options: { behavior?: ScrollBehavior; offset?: number } = {}) {\n const section = getSection(value)\n if (section?.disabled) return false\n\n if (!isOpen(value)) openSections.value = [...openSections.value, value]\n await nextTick()\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()))\n\n const element = document.getElementById(getAnchorId(value))\n if (!element) return false\n\n const offset = options.offset ?? 0\n window.scrollTo({\n top: element.getBoundingClientRect().top + window.scrollY - offset,\n behavior: options.behavior ?? 'smooth',\n })\n return true\n}\n\nprovide<TopAccordionContext>(topAccordionContextKey, {\n accordionId: props.id,\n sections,\n openSections,\n isOpen,\n getSection,\n getAnchorId,\n})\n\ndefineExpose({ reveal, getAnchorId, root: rootRef })\n</script>\n\n<template>\n <div ref=\"rootRef\" class=\"top-accordion top-solutions-component\">\n <Accordion\n v-bind=\"$attrs\"\n :value=\"primeValue\"\n :multiple=\"multiple\"\n expand-icon=\"pi pi-chevron-down\"\n collapse-icon=\"pi pi-chevron-up\"\n class=\"top-accordion__root\"\n @update:value=\"updatePrimeValue\"\n >\n <slot />\n </Accordion>\n </div>\n</template>\n\n<style>\n.top-accordion { --top-accordion-border: var(--top-secondary-200); --top-accordion-surface: #fff; --top-accordion-header: var(--top-secondary-100); --top-accordion-title: var(--top-primary-800); --top-accordion-badge: var(--top-primary-900); --top-accordion-content: #fff; }\n.top-accordion__root { display: flex; flex-direction: column; gap: 1rem; }\n.top-accordion .p-accordionpanel { overflow: hidden; border: 1px solid var(--top-accordion-border); border-radius: .625rem; background: var(--top-accordion-surface); box-shadow: 0 2px 8px rgb(15 23 42 / 8%); }\n.top-accordion .p-accordionheader,\n.top-accordion .p-accordionheader[aria-expanded='true'],\n.top-accordion .p-accordionheader:not([data-p-disabled='true']):hover,\n.top-accordion .p-accordionheader:not([data-p-disabled='true']):focus,\n.top-accordion .p-accordionheader:not([data-p-disabled='true']):active { border: 0; border-radius: .625rem; background-color: var(--top-accordion-header) !important; padding: 1rem; }\n.top-accordion .p-accordionheader[aria-expanded='true'],\n.top-accordion .p-accordionheader[data-p-active='true'] { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; }\n.top-accordion .p-accordioncontent-content { border: 0; background: var(--top-accordion-content); padding: 0; }\n.top-accordion .p-accordionpanel[data-p-disabled='true'] { opacity: .6; }\n.top-accordion .p-accordionheader[data-p-disabled='true'] { cursor: not-allowed; }\n.dark .top-accordion { --top-accordion-border: #3f3f46; --top-accordion-surface: #18181b; --top-accordion-header: #27272a; --top-accordion-title: var(--top-primary-100); --top-accordion-badge: var(--top-primary-700); --top-accordion-content: #18181b; }\n</style>\n","<script lang=\"ts\">\nimport type { ComputedRef, Ref } from 'vue'\nimport type { TopAccordionSection, TopAccordionValue } from './internal/topAccordion'\nexport type { TopAccordionSection, TopAccordionSummaryItem, TopAccordionValue } from './internal/topAccordion'\n\nexport const topAccordionContextKey = Symbol('top-accordion-context')\n\nexport type TopAccordionContext = {\n accordionId: string\n sections: ComputedRef<TopAccordionSection[]>\n openSections: Ref<TopAccordionValue[]>\n isOpen: (value: TopAccordionValue) => boolean\n getSection: (value: TopAccordionValue) => TopAccordionSection | undefined\n getAnchorId: (value: TopAccordionValue) => string\n}\n</script>\n\n<script setup lang=\"ts\">\nimport Accordion from 'primevue/accordion'\nimport { computed, nextTick, provide, ref } from 'vue'\nimport { getTopAccordionAnchorId } from './internal/topAccordion'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(\n defineProps<{\n /** Identificador estável compartilhado com TopAccordionNavigator. */\n id: string\n modelValue: TopAccordionValue[]\n sections?: TopAccordionSection[]\n multiple?: boolean\n }>(),\n { sections: () => [], multiple: true },\n)\n\nconst emit = defineEmits<{ 'update:modelValue': [value: TopAccordionValue[]] }>()\n\nconst openSections = computed({\n get: () => props.modelValue ?? [],\n set: (value: TopAccordionValue[]) => emit('update:modelValue', value),\n})\nconst sections = computed(() => props.sections)\nconst rootRef = ref<HTMLElement | null>(null)\nconst primeValue = computed(() => openSections.value as string[] | number[])\n\nfunction getSection(value: TopAccordionValue) {\n return sections.value.find((section) => section.value === value)\n}\n\nfunction isOpen(value: TopAccordionValue) {\n return openSections.value.includes(value)\n}\n\nfunction getAnchorId(value: TopAccordionValue) {\n return getTopAccordionAnchorId(props.id, value)\n}\n\nfunction updatePrimeValue(value: string | string[] | null | undefined) {\n openSections.value = Array.isArray(value) ? value : value === null || value === undefined ? [] : [value]\n}\n\nasync function reveal(value: TopAccordionValue, options: { behavior?: ScrollBehavior; offset?: number } = {}) {\n const section = getSection(value)\n if (section?.disabled) return false\n\n if (!isOpen(value)) openSections.value = [...openSections.value, value]\n await nextTick()\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()))\n\n const element = document.getElementById(getAnchorId(value))\n if (!element) return false\n\n const offset = options.offset ?? 0\n window.scrollTo({\n top: element.getBoundingClientRect().top + window.scrollY - offset,\n behavior: options.behavior ?? 'smooth',\n })\n return true\n}\n\nprovide<TopAccordionContext>(topAccordionContextKey, {\n accordionId: props.id,\n sections,\n openSections,\n isOpen,\n getSection,\n getAnchorId,\n})\n\ndefineExpose({ reveal, getAnchorId, root: rootRef })\n</script>\n\n<template>\n <div ref=\"rootRef\" class=\"top-accordion top-solutions-component\">\n <Accordion\n v-bind=\"$attrs\"\n :value=\"primeValue\"\n :multiple=\"multiple\"\n expand-icon=\"pi pi-chevron-down\"\n collapse-icon=\"pi pi-chevron-up\"\n class=\"top-accordion__root\"\n @update:value=\"updatePrimeValue\"\n >\n <slot />\n </Accordion>\n </div>\n</template>\n\n<style>\n.top-accordion { --top-accordion-border: var(--top-secondary-200); --top-accordion-surface: #fff; --top-accordion-header: var(--top-secondary-100); --top-accordion-title: var(--top-primary-800); --top-accordion-badge: var(--top-primary-900); --top-accordion-content: #fff; }\n.top-accordion__root { display: flex; flex-direction: column; gap: 1rem; }\n.top-accordion .p-accordionpanel { overflow: hidden; border: 1px solid var(--top-accordion-border); border-radius: .625rem; background: var(--top-accordion-surface); box-shadow: 0 2px 8px rgb(15 23 42 / 8%); }\n.top-accordion .p-accordionheader,\n.top-accordion .p-accordionheader[aria-expanded='true'],\n.top-accordion .p-accordionheader:not([data-p-disabled='true']):hover,\n.top-accordion .p-accordionheader:not([data-p-disabled='true']):focus,\n.top-accordion .p-accordionheader:not([data-p-disabled='true']):active { border: 0; border-radius: .625rem; background-color: var(--top-accordion-header) !important; padding: 1rem; }\n.top-accordion .p-accordionheader[aria-expanded='true'],\n.top-accordion .p-accordionheader[data-p-active='true'] { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; }\n.top-accordion .p-accordioncontent-content { border: 0; background: var(--top-accordion-content); padding: 0; }\n.top-accordion .p-accordionpanel[data-p-disabled='true'] { opacity: .6; }\n.top-accordion .p-accordionheader[data-p-disabled='true'] { cursor: not-allowed; }\n.dark .top-accordion { --top-accordion-border: #3f3f46; --top-accordion-surface: #18181b; --top-accordion-header: #27272a; --top-accordion-title: var(--top-primary-100); --top-accordion-badge: var(--top-primary-700); --top-accordion-content: #18181b; }\n</style>\n","<script setup lang=\"ts\">\nimport type { TopAccordionSummaryItem } from './internal/topAccordion'\n\nwithDefaults(\n defineProps<{\n items?: TopAccordionSummaryItem[]\n visible?: boolean\n nowrap?: boolean\n }>(),\n {\n items: () => [],\n visible: true,\n nowrap: false,\n },\n)\n\nfunction getValue(item: TopAccordionSummaryItem) {\n const value = item.value ?? item.valor\n return value === null || value === undefined || value === '' ? '--' : value\n}\n</script>\n\n<template>\n <div\n v-if=\"visible && (items.length || $slots.default)\"\n class=\"top-accordion-summary\"\n :class=\"{ 'top-accordion-summary--nowrap': nowrap }\"\n >\n <template v-for=\"(item, index) in items\" :key=\"`${item.label}-${index}`\">\n <span v-if=\"index > 0\" class=\"top-accordion-summary__separator\" aria-hidden=\"true\" />\n <span class=\"top-accordion-summary__item\"><strong>{{ item.label }}:</strong> {{ getValue(item) }}</span>\n </template>\n <slot />\n </div>\n</template>\n\n<style>\n.top-accordion-summary { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin-left: 2rem; color: var(--top-accordion-summary-text, var(--top-secondary-600)); font-size: .75rem; }\n.top-accordion-summary--nowrap { flex-wrap: nowrap; overflow: hidden; }\n.top-accordion-summary__item { min-width: 0; padding: .125rem 0; }\n.top-accordion-summary__separator { display: inline-block; width: .25rem; height: .25rem; flex: 0 0 auto; border-radius: 50%; background: var(--top-accordion-summary-separator, var(--top-secondary-400)); }\n.dark .top-accordion-summary { --top-accordion-summary-text: #d4d4d8; --top-accordion-summary-separator: #71717a; }\n@media (max-width: 639px) { .top-accordion-summary__separator { display: none; } }\n</style>\n","<script setup lang=\"ts\">\nimport type { TopAccordionSummaryItem } from './internal/topAccordion'\n\nwithDefaults(\n defineProps<{\n items?: TopAccordionSummaryItem[]\n visible?: boolean\n nowrap?: boolean\n }>(),\n {\n items: () => [],\n visible: true,\n nowrap: false,\n },\n)\n\nfunction getValue(item: TopAccordionSummaryItem) {\n const value = item.value ?? item.valor\n return value === null || value === undefined || value === '' ? '--' : value\n}\n</script>\n\n<template>\n <div\n v-if=\"visible && (items.length || $slots.default)\"\n class=\"top-accordion-summary\"\n :class=\"{ 'top-accordion-summary--nowrap': nowrap }\"\n >\n <template v-for=\"(item, index) in items\" :key=\"`${item.label}-${index}`\">\n <span v-if=\"index > 0\" class=\"top-accordion-summary__separator\" aria-hidden=\"true\" />\n <span class=\"top-accordion-summary__item\"><strong>{{ item.label }}:</strong> {{ getValue(item) }}</span>\n </template>\n <slot />\n </div>\n</template>\n\n<style>\n.top-accordion-summary { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin-left: 2rem; color: var(--top-accordion-summary-text, var(--top-secondary-600)); font-size: .75rem; }\n.top-accordion-summary--nowrap { flex-wrap: nowrap; overflow: hidden; }\n.top-accordion-summary__item { min-width: 0; padding: .125rem 0; }\n.top-accordion-summary__separator { display: inline-block; width: .25rem; height: .25rem; flex: 0 0 auto; border-radius: 50%; background: var(--top-accordion-summary-separator, var(--top-secondary-400)); }\n.dark .top-accordion-summary { --top-accordion-summary-text: #d4d4d8; --top-accordion-summary-separator: #71717a; }\n@media (max-width: 639px) { .top-accordion-summary__separator { display: none; } }\n</style>\n","<script setup lang=\"ts\">\nimport AccordionContent from 'primevue/accordioncontent'\nimport AccordionHeader from 'primevue/accordionheader'\nimport AccordionPanel from 'primevue/accordionpanel'\nimport { computed, inject } from 'vue'\nimport TopAccordionSummary from './TopAccordionSummary.vue'\nimport { topAccordionContextKey, type TopAccordionContext } from './TopAccordion.vue'\nimport type { TopAccordionSummaryItem, TopAccordionValue } from './internal/topAccordion'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(\n defineProps<{\n value: TopAccordionValue\n title?: string\n icon?: string\n summary?: TopAccordionSummaryItem[]\n status?: 'valid' | 'error'\n statusLabel?: string\n }>(),\n { title: '', icon: '', summary: () => [], status: undefined, statusLabel: '' },\n)\n\nconst context = inject<TopAccordionContext>(topAccordionContextKey)\nif (!context) throw new Error('TopAccordionPanel deve ser usado dentro de TopAccordion.')\n\nconst section = computed(() => context.getSection(props.value))\nconst title = computed(() => props.title || section.value?.label || String(props.value))\nconst icon = computed(() => props.icon || section.value?.icon || '')\nconst disabled = computed(() => Boolean(section.value?.disabled))\nconst index = computed(() => context.sections.value.findIndex((item) => item.value === props.value) + 1)\nconst isOpen = computed(() => context.isOpen(props.value))\nconst anchorId = computed(() => context.getAnchorId(props.value))\nconst statusIcon = computed(() => props.status === 'valid' ? 'pi pi-check-circle' : 'pi pi-times-circle')\nconst statusClass = computed(() => props.status === 'valid' ? 'top-accordion-panel__status--valid' : 'top-accordion-panel__status--error')\n</script>\n\n<template>\n <div :id=\"anchorId\" class=\"top-accordion-panel-anchor\">\n <AccordionPanel v-bind=\"$attrs\" :value=\"value\" :disabled=\"disabled\" class=\"top-accordion-panel\">\n <AccordionHeader class=\"top-accordion-panel__header\">\n <div class=\"top-accordion-panel__heading\">\n <div class=\"top-accordion-panel__title-row\">\n <span class=\"top-accordion-panel__badge\" aria-hidden=\"true\">\n <slot name=\"icon\"><i v-if=\"icon\" :class=\"icon\" /><span v-else>{{ index }}</span></slot>\n </span>\n <span class=\"top-accordion-panel__title\"><slot name=\"title\">{{ title }}</slot></span>\n <slot name=\"status\">\n <i\n v-if=\"status\"\n :class=\"['top-accordion-panel__status', statusClass, statusIcon]\"\n :aria-label=\"statusLabel || (status === 'valid' ? 'Seção válida' : 'Existem erros na seção')\"\n role=\"img\"\n />\n </slot>\n </div>\n <slot v-if=\"$slots.preview\" name=\"preview\" :open=\"isOpen\" />\n <slot v-else name=\"summary\" :open=\"isOpen\">\n <TopAccordionSummary :items=\"summary\" :visible=\"!isOpen\" />\n </slot>\n </div>\n </AccordionHeader>\n <AccordionContent><div class=\"top-accordion-panel__content\"><slot /></div></AccordionContent>\n </AccordionPanel>\n </div>\n</template>\n\n<style>\n.top-accordion-panel-anchor { scroll-margin-top: var(--top-accordion-scroll-margin-top, 0px); }\n.top-accordion-panel__header { width: 100%; box-sizing: border-box; }\n.top-accordion-panel__heading { display: flex; width: 100%; min-width: 0; flex-direction: column; gap: .25rem; }\n.top-accordion-panel__title-row { display: flex; min-width: 0; align-items: center; gap: .5rem; }\n.top-accordion-panel__badge { display: inline-flex; width: 1.5rem; height: 1.5rem; flex: 0 0 1.5rem; align-items: center; justify-content: center; border-radius: 50%; background: var(--top-accordion-badge); color: #fff; font-size: .75rem; font-weight: 700; }\n.top-accordion-panel__badge > i { font-size: .875rem; }\n.top-accordion-panel__title { min-width: 0; flex: 0 1 auto; color: var(--top-accordion-title); font-size: .875rem; font-weight: 700; text-align: left; }\n.top-accordion-panel__status { flex: 0 0 auto; font-size: 1rem; }\n.top-accordion-panel__status--valid { color: #16a34a; }.top-accordion-panel__status--error { color: #dc2626; }\n.top-accordion-panel__content { padding: 1rem; }\n</style>\n","<script setup lang=\"ts\">\nimport AccordionContent from 'primevue/accordioncontent'\nimport AccordionHeader from 'primevue/accordionheader'\nimport AccordionPanel from 'primevue/accordionpanel'\nimport { computed, inject } from 'vue'\nimport TopAccordionSummary from './TopAccordionSummary.vue'\nimport { topAccordionContextKey, type TopAccordionContext } from './TopAccordion.vue'\nimport type { TopAccordionSummaryItem, TopAccordionValue } from './internal/topAccordion'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(\n defineProps<{\n value: TopAccordionValue\n title?: string\n icon?: string\n summary?: TopAccordionSummaryItem[]\n status?: 'valid' | 'error'\n statusLabel?: string\n }>(),\n { title: '', icon: '', summary: () => [], status: undefined, statusLabel: '' },\n)\n\nconst context = inject<TopAccordionContext>(topAccordionContextKey)\nif (!context) throw new Error('TopAccordionPanel deve ser usado dentro de TopAccordion.')\n\nconst section = computed(() => context.getSection(props.value))\nconst title = computed(() => props.title || section.value?.label || String(props.value))\nconst icon = computed(() => props.icon || section.value?.icon || '')\nconst disabled = computed(() => Boolean(section.value?.disabled))\nconst index = computed(() => context.sections.value.findIndex((item) => item.value === props.value) + 1)\nconst isOpen = computed(() => context.isOpen(props.value))\nconst anchorId = computed(() => context.getAnchorId(props.value))\nconst statusIcon = computed(() => props.status === 'valid' ? 'pi pi-check-circle' : 'pi pi-times-circle')\nconst statusClass = computed(() => props.status === 'valid' ? 'top-accordion-panel__status--valid' : 'top-accordion-panel__status--error')\n</script>\n\n<template>\n <div :id=\"anchorId\" class=\"top-accordion-panel-anchor\">\n <AccordionPanel v-bind=\"$attrs\" :value=\"value\" :disabled=\"disabled\" class=\"top-accordion-panel\">\n <AccordionHeader class=\"top-accordion-panel__header\">\n <div class=\"top-accordion-panel__heading\">\n <div class=\"top-accordion-panel__title-row\">\n <span class=\"top-accordion-panel__badge\" aria-hidden=\"true\">\n <slot name=\"icon\"><i v-if=\"icon\" :class=\"icon\" /><span v-else>{{ index }}</span></slot>\n </span>\n <span class=\"top-accordion-panel__title\"><slot name=\"title\">{{ title }}</slot></span>\n <slot name=\"status\">\n <i\n v-if=\"status\"\n :class=\"['top-accordion-panel__status', statusClass, statusIcon]\"\n :aria-label=\"statusLabel || (status === 'valid' ? 'Seção válida' : 'Existem erros na seção')\"\n role=\"img\"\n />\n </slot>\n </div>\n <slot v-if=\"$slots.preview\" name=\"preview\" :open=\"isOpen\" />\n <slot v-else name=\"summary\" :open=\"isOpen\">\n <TopAccordionSummary :items=\"summary\" :visible=\"!isOpen\" />\n </slot>\n </div>\n </AccordionHeader>\n <AccordionContent><div class=\"top-accordion-panel__content\"><slot /></div></AccordionContent>\n </AccordionPanel>\n </div>\n</template>\n\n<style>\n.top-accordion-panel-anchor { scroll-margin-top: var(--top-accordion-scroll-margin-top, 0px); }\n.top-accordion-panel__header { width: 100%; box-sizing: border-box; }\n.top-accordion-panel__heading { display: flex; width: 100%; min-width: 0; flex-direction: column; gap: .25rem; }\n.top-accordion-panel__title-row { display: flex; min-width: 0; align-items: center; gap: .5rem; }\n.top-accordion-panel__badge { display: inline-flex; width: 1.5rem; height: 1.5rem; flex: 0 0 1.5rem; align-items: center; justify-content: center; border-radius: 50%; background: var(--top-accordion-badge); color: #fff; font-size: .75rem; font-weight: 700; }\n.top-accordion-panel__badge > i { font-size: .875rem; }\n.top-accordion-panel__title { min-width: 0; flex: 0 1 auto; color: var(--top-accordion-title); font-size: .875rem; font-weight: 700; text-align: left; }\n.top-accordion-panel__status { flex: 0 0 auto; font-size: 1rem; }\n.top-accordion-panel__status--valid { color: #16a34a; }.top-accordion-panel__status--error { color: #dc2626; }\n.top-accordion-panel__content { padding: 1rem; }\n</style>\n","<script lang=\"ts\">\nexport type TopAccordionNavigatorColorMode = 'inherit' | 'light' | 'dark'\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport type { TopAccordionSection, TopAccordionValue } from './internal/topAccordion'\nimport { getTopAccordionAnchorId } from './internal/topAccordion'\n\nconst props = withDefaults(\n defineProps<{\n accordionId: string\n modelValue: TopAccordionValue[]\n sections?: TopAccordionSection[]\n scrollOffset?: number\n sticky?: boolean\n stickyTop?: string\n /** Por padrão, herda o tema do consumidor. Use light ou dark para forçar a instância. */\n colorMode?: TopAccordionNavigatorColorMode\n }>(),\n { sections: () => [], scrollOffset: 0, sticky: false, stickyTop: '0px', colorMode: 'inherit' },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TopAccordionValue[]]\n navigate: [section: TopAccordionSection]\n}>()\n\nconst containerRef = ref<HTMLElement | null>(null)\nconst hasOverflow = ref(false)\nconst canScrollLeft = ref(false)\nconst canScrollRight = ref(false)\nlet resizeObserver: ResizeObserver | undefined\n\nconst openSections = computed({\n get: () => props.modelValue ?? [],\n set: (value: TopAccordionValue[]) => emit('update:modelValue', value),\n})\n\nfunction isOpen(value: TopAccordionValue) { return openSections.value.includes(value) }\nfunction updateScrollState() {\n const element = containerRef.value\n if (!element) return\n hasOverflow.value = element.scrollWidth > element.clientWidth + 1\n canScrollLeft.value = hasOverflow.value && element.scrollLeft > 1\n canScrollRight.value = hasOverflow.value && element.scrollLeft + element.clientWidth < element.scrollWidth - 1\n}\nfunction scrollByAmount(left: number) { containerRef.value?.scrollBy({ left, behavior: 'smooth' }) }\n\nasync function navigate(section: TopAccordionSection) {\n if (section.disabled) return\n if (!isOpen(section.value)) openSections.value = [...openSections.value, section.value]\n emit('navigate', section)\n await nextTick()\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()))\n const target = document.getElementById(getTopAccordionAnchorId(props.accordionId, section.value))\n if (!target) return\n window.scrollTo({\n top: target.getBoundingClientRect().top + window.scrollY - props.scrollOffset,\n behavior: 'smooth',\n })\n}\n\nonMounted(() => {\n updateScrollState()\n const element = containerRef.value\n element?.addEventListener('scroll', updateScrollState, { passive: true })\n if (typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(updateScrollState)\n if (element) resizeObserver.observe(element)\n }\n})\nonBeforeUnmount(() => { containerRef.value?.removeEventListener('scroll', updateScrollState); resizeObserver?.disconnect() })\nwatch(() => props.sections, () => nextTick(updateScrollState), { deep: true })\n</script>\n\n<template>\n <nav\n class=\"top-accordion-navigator top-solutions-component\"\n :class=\"{\n 'top-accordion-navigator--sticky': sticky,\n 'top-accordion-navigator--dark': colorMode === 'dark',\n 'top-accordion-navigator--light': colorMode === 'light',\n }\"\n :style=\"{ '--top-accordion-navigator-top': stickyTop }\"\n aria-label=\"Sumário das seções do formulário\"\n >\n <button v-if=\"hasOverflow && canScrollLeft\" class=\"top-accordion-navigator__scroll top-accordion-navigator__scroll--left\" type=\"button\" aria-label=\"Rolar seções para a esquerda\" @click=\"scrollByAmount(-240)\"><i class=\"pi pi-chevron-left\" /></button>\n <button v-if=\"hasOverflow && canScrollRight\" class=\"top-accordion-navigator__scroll top-accordion-navigator__scroll--right\" type=\"button\" aria-label=\"Rolar seções para a direita\" @click=\"scrollByAmount(240)\"><i class=\"pi pi-chevron-right\" /></button>\n <div ref=\"containerRef\" class=\"top-accordion-navigator__scroll-area\">\n <div class=\"top-accordion-navigator__items\">\n <template v-for=\"(section, index) in sections\" :key=\"section.value\">\n <button\n class=\"top-accordion-navigator__item\"\n :class=\"{ 'top-accordion-navigator__item--open': isOpen(section.value), 'top-accordion-navigator__item--disabled': section.disabled }\"\n :disabled=\"section.disabled\"\n type=\"button\"\n :aria-current=\"isOpen(section.value) ? 'step' : undefined\"\n @click=\"navigate(section)\"\n >\n <span class=\"top-accordion-navigator__badge\"><i v-if=\"section.disabled\" class=\"pi pi-lock\" /><i v-else-if=\"section.icon\" :class=\"section.icon\" /><span v-else>{{ index + 1 }}</span></span>\n <span class=\"top-accordion-navigator__label\">{{ section.label }}</span>\n </button>\n <span v-if=\"index < sections.length - 1\" class=\"top-accordion-navigator__connector\" :class=\"{ 'top-accordion-navigator__connector--open': isOpen(section.value) && isOpen(sections[index + 1]!.value) }\" aria-hidden=\"true\" />\n </template>\n </div>\n </div>\n </nav>\n</template>\n\n<style>\n.top-accordion-navigator { --top-accordion-nav-border: var(--top-secondary-200); --top-accordion-nav-surface: #f8fafc; --top-accordion-nav-accent: var(--top-primary-800); position: relative; z-index: 2; width: 100%; border-bottom: 2px solid var(--top-accordion-nav-border); background: var(--top-accordion-nav-surface); padding: .5rem 0; }\n.top-accordion-navigator--sticky { position: sticky; top: var(--top-accordion-navigator-top); }\n.top-accordion-navigator__scroll-area { overflow-x: auto; scrollbar-width: none; padding: 0 2.5rem; }.top-accordion-navigator__scroll-area::-webkit-scrollbar { display: none; }\n.top-accordion-navigator__items { display: flex; width: max-content; min-width: 100%; align-items: center; justify-content: space-evenly; gap: .5rem; }\n.top-accordion-navigator__item { display: flex; min-width: 0; flex: 0 0 auto; flex-direction: column; align-items: center; gap: .25rem; border: 0; border-radius: .5rem; background: transparent; color: var(--top-accordion-nav-accent); cursor: pointer; padding: .25rem; }\n.top-accordion-navigator__item:focus-visible { outline: 2px solid var(--top-accordion-nav-accent); outline-offset: 2px; }\n.top-accordion-navigator__badge { display: inline-flex; width: 1.75rem; height: 1.75rem; align-items: center; justify-content: center; border: 1px solid currentColor; border-radius: 50%; font-size: .75rem; font-weight: 700; transition: background-color .18s ease, color .18s ease, border-color .18s ease; }.top-accordion-navigator__badge > i { font-size: .875rem; }\n.top-accordion-navigator__item:not(:disabled):hover .top-accordion-navigator__badge { background: color-mix(in srgb, var(--top-accordion-nav-accent), transparent 90%); }\n.top-accordion-navigator__item--open .top-accordion-navigator__badge { background: var(--top-accordion-nav-accent); border-color: var(--top-accordion-nav-accent); color: #fff; box-shadow: 0 2px 5px rgb(15 23 42 / 18%); }.top-accordion-navigator__item--open:not(:disabled):hover .top-accordion-navigator__badge { background: var(--top-primary-700); border-color: var(--top-primary-700); }\n.top-accordion-navigator__item--disabled { color: var(--top-secondary-400); cursor: not-allowed; }.top-accordion-navigator__item--disabled .top-accordion-navigator__badge { border-color: var(--top-secondary-300); background: var(--top-secondary-100); }\n.top-accordion-navigator__label { max-width: 7.5rem; overflow: hidden; color: inherit; font-size: .75rem; font-weight: 700; text-align: center; text-overflow: ellipsis; white-space: nowrap; }\n.top-accordion-navigator__connector { width: 2rem; height: 1px; flex: 1 0 2rem; background: var(--top-secondary-300); }.top-accordion-navigator__connector--open { background: var(--top-primary-600); }\n.top-accordion-navigator__scroll { position: absolute; top: 50%; z-index: 1; display: inline-flex; width: 1.75rem; height: 1.75rem; align-items: center; justify-content: center; border: 1px solid color-mix(in srgb, var(--top-accordion-nav-accent), transparent 70%); border-radius: 50%; background: #fff; color: var(--top-accordion-nav-accent); box-shadow: 0 1px 3px rgb(15 23 42 / 15%); cursor: pointer; transform: translateY(-50%); }.top-accordion-navigator__scroll--left { left: .25rem; }.top-accordion-navigator__scroll--right { right: .25rem; }\n.dark .top-accordion-navigator, .top-accordion-navigator--dark { --top-accordion-nav-border: #3f3f46; --top-accordion-nav-surface: #18181b; --top-accordion-nav-accent: var(--top-primary-600); }.dark .top-accordion-navigator__item--disabled, .top-accordion-navigator--dark .top-accordion-navigator__item--disabled { color: #71717a; }.dark .top-accordion-navigator__item--disabled .top-accordion-navigator__badge, .top-accordion-navigator--dark .top-accordion-navigator__item--disabled .top-accordion-navigator__badge { border-color: #52525b; background: #27272a; }.dark .top-accordion-navigator__connector, .top-accordion-navigator--dark .top-accordion-navigator__connector { background: #52525b; }.dark .top-accordion-navigator__connector--open, .top-accordion-navigator--dark .top-accordion-navigator__connector--open { background: var(--top-primary-600); }.dark .top-accordion-navigator__scroll, .top-accordion-navigator--dark .top-accordion-navigator__scroll { background: #27272a; }\n.top-accordion-navigator--light { --top-accordion-nav-border: var(--top-secondary-200); --top-accordion-nav-surface: #f8fafc; --top-accordion-nav-accent: var(--top-primary-800); }.top-accordion-navigator--light .top-accordion-navigator__item--disabled { color: var(--top-secondary-400); }.top-accordion-navigator--light .top-accordion-navigator__item--disabled .top-accordion-navigator__badge { border-color: var(--top-secondary-300); background: var(--top-secondary-100); }.top-accordion-navigator--light .top-accordion-navigator__connector { background: var(--top-secondary-300); }.top-accordion-navigator--light .top-accordion-navigator__connector--open { background: var(--top-primary-600); }.top-accordion-navigator--light .top-accordion-navigator__scroll { background: #fff; }\n</style>\n","<script lang=\"ts\">\nexport type TopAccordionNavigatorColorMode = 'inherit' | 'light' | 'dark'\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport type { TopAccordionSection, TopAccordionValue } from './internal/topAccordion'\nimport { getTopAccordionAnchorId } from './internal/topAccordion'\n\nconst props = withDefaults(\n defineProps<{\n accordionId: string\n modelValue: TopAccordionValue[]\n sections?: TopAccordionSection[]\n scrollOffset?: number\n sticky?: boolean\n stickyTop?: string\n /** Por padrão, herda o tema do consumidor. Use light ou dark para forçar a instância. */\n colorMode?: TopAccordionNavigatorColorMode\n }>(),\n { sections: () => [], scrollOffset: 0, sticky: false, stickyTop: '0px', colorMode: 'inherit' },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: TopAccordionValue[]]\n navigate: [section: TopAccordionSection]\n}>()\n\nconst containerRef = ref<HTMLElement | null>(null)\nconst hasOverflow = ref(false)\nconst canScrollLeft = ref(false)\nconst canScrollRight = ref(false)\nlet resizeObserver: ResizeObserver | undefined\n\nconst openSections = computed({\n get: () => props.modelValue ?? [],\n set: (value: TopAccordionValue[]) => emit('update:modelValue', value),\n})\n\nfunction isOpen(value: TopAccordionValue) { return openSections.value.includes(value) }\nfunction updateScrollState() {\n const element = containerRef.value\n if (!element) return\n hasOverflow.value = element.scrollWidth > element.clientWidth + 1\n canScrollLeft.value = hasOverflow.value && element.scrollLeft > 1\n canScrollRight.value = hasOverflow.value && element.scrollLeft + element.clientWidth < element.scrollWidth - 1\n}\nfunction scrollByAmount(left: number) { containerRef.value?.scrollBy({ left, behavior: 'smooth' }) }\n\nasync function navigate(section: TopAccordionSection) {\n if (section.disabled) return\n if (!isOpen(section.value)) openSections.value = [...openSections.value, section.value]\n emit('navigate', section)\n await nextTick()\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()))\n const target = document.getElementById(getTopAccordionAnchorId(props.accordionId, section.value))\n if (!target) return\n window.scrollTo({\n top: target.getBoundingClientRect().top + window.scrollY - props.scrollOffset,\n behavior: 'smooth',\n })\n}\n\nonMounted(() => {\n updateScrollState()\n const element = containerRef.value\n element?.addEventListener('scroll', updateScrollState, { passive: true })\n if (typeof ResizeObserver !== 'undefined') {\n resizeObserver = new ResizeObserver(updateScrollState)\n if (element) resizeObserver.observe(element)\n }\n})\nonBeforeUnmount(() => { containerRef.value?.removeEventListener('scroll', updateScrollState); resizeObserver?.disconnect() })\nwatch(() => props.sections, () => nextTick(updateScrollState), { deep: true })\n</script>\n\n<template>\n <nav\n class=\"top-accordion-navigator top-solutions-component\"\n :class=\"{\n 'top-accordion-navigator--sticky': sticky,\n 'top-accordion-navigator--dark': colorMode === 'dark',\n 'top-accordion-navigator--light': colorMode === 'light',\n }\"\n :style=\"{ '--top-accordion-navigator-top': stickyTop }\"\n aria-label=\"Sumário das seções do formulário\"\n >\n <button v-if=\"hasOverflow && canScrollLeft\" class=\"top-accordion-navigator__scroll top-accordion-navigator__scroll--left\" type=\"button\" aria-label=\"Rolar seções para a esquerda\" @click=\"scrollByAmount(-240)\"><i class=\"pi pi-chevron-left\" /></button>\n <button v-if=\"hasOverflow && canScrollRight\" class=\"top-accordion-navigator__scroll top-accordion-navigator__scroll--right\" type=\"button\" aria-label=\"Rolar seções para a direita\" @click=\"scrollByAmount(240)\"><i class=\"pi pi-chevron-right\" /></button>\n <div ref=\"containerRef\" class=\"top-accordion-navigator__scroll-area\">\n <div class=\"top-accordion-navigator__items\">\n <template v-for=\"(section, index) in sections\" :key=\"section.value\">\n <button\n class=\"top-accordion-navigator__item\"\n :class=\"{ 'top-accordion-navigator__item--open': isOpen(section.value), 'top-accordion-navigator__item--disabled': section.disabled }\"\n :disabled=\"section.disabled\"\n type=\"button\"\n :aria-current=\"isOpen(section.value) ? 'step' : undefined\"\n @click=\"navigate(section)\"\n >\n <span class=\"top-accordion-navigator__badge\"><i v-if=\"section.disabled\" class=\"pi pi-lock\" /><i v-else-if=\"section.icon\" :class=\"section.icon\" /><span v-else>{{ index + 1 }}</span></span>\n <span class=\"top-accordion-navigator__label\">{{ section.label }}</span>\n </button>\n <span v-if=\"index < sections.length - 1\" class=\"top-accordion-navigator__connector\" :class=\"{ 'top-accordion-navigator__connector--open': isOpen(section.value) && isOpen(sections[index + 1]!.value) }\" aria-hidden=\"true\" />\n </template>\n </div>\n </div>\n </nav>\n</template>\n\n<style>\n.top-accordion-navigator { --top-accordion-nav-border: var(--top-secondary-200); --top-accordion-nav-surface: #f8fafc; --top-accordion-nav-accent: var(--top-primary-800); position: relative; z-index: 2; width: 100%; border-bottom: 2px solid var(--top-accordion-nav-border); background: var(--top-accordion-nav-surface); padding: .5rem 0; }\n.top-accordion-navigator--sticky { position: sticky; top: var(--top-accordion-navigator-top); }\n.top-accordion-navigator__scroll-area { overflow-x: auto; scrollbar-width: none; padding: 0 2.5rem; }.top-accordion-navigator__scroll-area::-webkit-scrollbar { display: none; }\n.top-accordion-navigator__items { display: flex; width: max-content; min-width: 100%; align-items: center; justify-content: space-evenly; gap: .5rem; }\n.top-accordion-navigator__item { display: flex; min-width: 0; flex: 0 0 auto; flex-direction: column; align-items: center; gap: .25rem; border: 0; border-radius: .5rem; background: transparent; color: var(--top-accordion-nav-accent); cursor: pointer; padding: .25rem; }\n.top-accordion-navigator__item:focus-visible { outline: 2px solid var(--top-accordion-nav-accent); outline-offset: 2px; }\n.top-accordion-navigator__badge { display: inline-flex; width: 1.75rem; height: 1.75rem; align-items: center; justify-content: center; border: 1px solid currentColor; border-radius: 50%; font-size: .75rem; font-weight: 700; transition: background-color .18s ease, color .18s ease, border-color .18s ease; }.top-accordion-navigator__badge > i { font-size: .875rem; }\n.top-accordion-navigator__item:not(:disabled):hover .top-accordion-navigator__badge { background: color-mix(in srgb, var(--top-accordion-nav-accent), transparent 90%); }\n.top-accordion-navigator__item--open .top-accordion-navigator__badge { background: var(--top-accordion-nav-accent); border-color: var(--top-accordion-nav-accent); color: #fff; box-shadow: 0 2px 5px rgb(15 23 42 / 18%); }.top-accordion-navigator__item--open:not(:disabled):hover .top-accordion-navigator__badge { background: var(--top-primary-700); border-color: var(--top-primary-700); }\n.top-accordion-navigator__item--disabled { color: var(--top-secondary-400); cursor: not-allowed; }.top-accordion-navigator__item--disabled .top-accordion-navigator__badge { border-color: var(--top-secondary-300); background: var(--top-secondary-100); }\n.top-accordion-navigator__label { max-width: 7.5rem; overflow: hidden; color: inherit; font-size: .75rem; font-weight: 700; text-align: center; text-overflow: ellipsis; white-space: nowrap; }\n.top-accordion-navigator__connector { width: 2rem; height: 1px; flex: 1 0 2rem; background: var(--top-secondary-300); }.top-accordion-navigator__connector--open { background: var(--top-primary-600); }\n.top-accordion-navigator__scroll { position: absolute; top: 50%; z-index: 1; display: inline-flex; width: 1.75rem; height: 1.75rem; align-items: center; justify-content: center; border: 1px solid color-mix(in srgb, var(--top-accordion-nav-accent), transparent 70%); border-radius: 50%; background: #fff; color: var(--top-accordion-nav-accent); box-shadow: 0 1px 3px rgb(15 23 42 / 15%); cursor: pointer; transform: translateY(-50%); }.top-accordion-navigator__scroll--left { left: .25rem; }.top-accordion-navigator__scroll--right { right: .25rem; }\n.dark .top-accordion-navigator, .top-accordion-navigator--dark { --top-accordion-nav-border: #3f3f46; --top-accordion-nav-surface: #18181b; --top-accordion-nav-accent: var(--top-primary-600); }.dark .top-accordion-navigator__item--disabled, .top-accordion-navigator--dark .top-accordion-navigator__item--disabled { color: #71717a; }.dark .top-accordion-navigator__item--disabled .top-accordion-navigator__badge, .top-accordion-navigator--dark .top-accordion-navigator__item--disabled .top-accordion-navigator__badge { border-color: #52525b; background: #27272a; }.dark .top-accordion-navigator__connector, .top-accordion-navigator--dark .top-accordion-navigator__connector { background: #52525b; }.dark .top-accordion-navigator__connector--open, .top-accordion-navigator--dark .top-accordion-navigator__connector--open { background: var(--top-primary-600); }.dark .top-accordion-navigator__scroll, .top-accordion-navigator--dark .top-accordion-navigator__scroll { background: #27272a; }\n.top-accordion-navigator--light { --top-accordion-nav-border: var(--top-secondary-200); --top-accordion-nav-surface: #f8fafc; --top-accordion-nav-accent: var(--top-primary-800); }.top-accordion-navigator--light .top-accordion-navigator__item--disabled { color: var(--top-secondary-400); }.top-accordion-navigator--light .top-accordion-navigator__item--disabled .top-accordion-navigator__badge { border-color: var(--top-secondary-300); background: var(--top-secondary-100); }.top-accordion-navigator--light .top-accordion-navigator__connector { background: var(--top-secondary-300); }.top-accordion-navigator--light .top-accordion-navigator__connector--open { background: var(--top-primary-600); }.top-accordion-navigator--light .top-accordion-navigator__scroll { background: #fff; }\n</style>\n","<script setup lang=\"ts\">\nimport Toast from 'primevue/toast'\nimport type { ToastMessageOptions } from 'primevue/toast'\nimport type {\n TopToastAction,\n TopToastData,\n TopToastFooter,\n} from '../types/toast'\n\nexport type { TopToastAction, TopToastData, TopToastFooter }\n\ntype TopToastMessage = ToastMessageOptions\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\">\nimport Toast from 'primevue/toast'\nimport type { ToastMessageOptions } from 'primevue/toast'\nimport type {\n TopToastAction,\n TopToastData,\n TopToastFooter,\n} from '../types/toast'\n\nexport type { TopToastAction, TopToastData, TopToastFooter }\n\ntype TopToastMessage = ToastMessageOptions\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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"}