@topjoao/top-design-system 0.1.0-beta.6 → 0.1.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TopToast-CXhVkVWT.cjs","names":["$attrs"],"sources":["../src/components/TopButton.vue","../src/components/TopButton.vue","../src/tokens/colors.ts","../src/components/TopConfirmDialog.vue","../src/components/TopConfirmDialog.vue","../src/components/TopInputText.vue","../src/components/TopInputText.vue","../src/components/TopSelect.vue","../src/components/TopSelect.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'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\nconst slots = useSlots()\r\nconst outrosIcones = computed(() => Boolean(slots.icon))\r\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\r\n secondary?: boolean\r\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,\r\n secondary: false,\r\n disabled: false,\r\n unstyled: false,\r\n type: 'button',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n click: []\r\n}>()\r\n\r\nconst buttonClasses = computed(() => {\r\n const baseClasses = !props.unstyled\r\n ? props.secondary\r\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'\r\n : props.outlined\r\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'\r\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'\r\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 || secondary\"\r\n :severity=\"secondary ? 'secondary' : undefined\"\r\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'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\nconst slots = useSlots()\r\nconst outrosIcones = computed(() => Boolean(slots.icon))\r\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\r\n secondary?: boolean\r\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,\r\n secondary: false,\r\n disabled: false,\r\n unstyled: false,\r\n type: 'button',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n click: []\r\n}>()\r\n\r\nconst buttonClasses = computed(() => {\r\n const baseClasses = !props.unstyled\r\n ? props.secondary\r\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'\r\n : props.outlined\r\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'\r\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'\r\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 || secondary\"\r\n :severity=\"secondary ? 'secondary' : undefined\"\r\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' ? 'top-confirm-dialog__confirm--danger' : '',\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</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' ? 'top-confirm-dialog__confirm--danger' : '',\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</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=\"text-xs font-bold text-secondary-800 dark:text-zinc-200\"\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 h-[40px] w-full rounded-[10px] border border-secondary-600 px-3 py-2 text-xs text-secondary-900 enabled:hover:border-secondary-700 read-only:cursor-default read-only:bg-secondary-50 disabled:cursor-not-allowed dark:border-zinc-600 dark:bg-zinc-800 dark:text-zinc-100 dark:placeholder:text-zinc-400 dark:enabled:hover:border-zinc-500 dark:read-only:bg-zinc-800\"\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=\"text-xs font-bold text-secondary-800 dark:text-zinc-200\"\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 h-[40px] w-full rounded-[10px] border border-secondary-600 px-3 py-2 text-xs text-secondary-900 enabled:hover:border-secondary-700 read-only:cursor-default read-only:bg-secondary-50 disabled:cursor-not-allowed dark:border-zinc-600 dark:bg-zinc-800 dark:text-zinc-100 dark:placeholder:text-zinc-400 dark:enabled:hover:border-zinc-500 dark:read-only:bg-zinc-800\"\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, 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=\"pointer-events-none absolute left-3 top-2 iconetop z-10 text-primary-800 dark:text-primary-500\">\r\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: 'w-full h-auto text-xs dark:text-zinc-100 border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:!bg-zinc-800',\r\n },\r\n },\r\n input: { class: ['w-full h-auto text-xs dark:text-zinc-100', multiple ? 'border-0 bg-transparent py-1 !shadow-none outline-none ring-0 dark:!bg-transparent' : 'border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:!bg-zinc-600'].join(' ') },\r\n inputMultiple: { class: ['rounded-[10px] pl-9 min-h-[40px] dark:border-zinc-600 dark:text-zinc-100', disabled ? 'dark:!bg-zinc-700 dark:!text-zinc-400' : 'dark:!bg-zinc-800'].join(' ') },\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\"> - </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=\"pointer-events-none absolute left-3 top-2 iconetop z-10 text-primary-800 dark:text-primary-500\">\r\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: 'w-full h-auto text-xs dark:text-zinc-100 border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:!bg-zinc-800',\r\n },\r\n },\r\n input: { class: ['w-full h-auto text-xs dark:text-zinc-100', multiple ? 'border-0 bg-transparent py-1 !shadow-none outline-none ring-0 dark:!bg-transparent' : 'border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:!bg-zinc-600'].join(' ') },\r\n inputMultiple: { class: ['rounded-[10px] pl-9 min-h-[40px] dark:border-zinc-600 dark:text-zinc-100', disabled ? 'dark:!bg-zinc-700 dark:!text-zinc-400' : 'dark:!bg-zinc-800'].join(' ') },\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\"> - </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 Toast from 'primevue/toast'\r\nimport type { ToastMessageOptions } from 'primevue/toast'\r\n\r\nexport type TopToastFooter = string | number\r\n\r\nexport type TopToastAction = {\r\n label: string\r\n icon?: string\r\n onClick?: () => void\r\n}\r\n\r\nexport type TopToastData = {\r\n footer?: TopToastFooter\r\n action?: TopToastAction\r\n}\r\n\r\ntype TopToastMessage = ToastMessageOptions & {\r\n data?: TopToastData\r\n}\r\n\r\nwithDefaults(\r\n defineProps<{\r\n baseZIndex?: number\r\n }>(),\r\n {\r\n baseZIndex: 30000,\r\n },\r\n)\r\n\r\nfunction footerOf(message: TopToastMessage): TopToastFooter | undefined {\r\n return message.data?.footer\r\n}\r\n\r\nfunction actionOf(message: TopToastMessage) {\r\n return message.data?.action\r\n}\r\n\r\nfunction runAction(message: TopToastMessage) {\r\n actionOf(message)?.onClick?.()\r\n}\r\n\r\nfunction hasFooter(message: TopToastMessage) {\r\n return footerOf(message) !== undefined\r\n}\r\n\r\nfunction hasAction(message: TopToastMessage) {\r\n return Boolean(actionOf(message))\r\n}\r\n\r\nfunction severityClass(message: TopToastMessage, element: 'summary' | 'detail' | 'action') {\r\n const severity = message.severity ?? 'info'\r\n return `top-toast__${element}--${severity}`\r\n}\r\n</script>\r\n\r\n<template>\r\n <Toast position=\"top-right\" :base-z-index=\"baseZIndex\">\r\n <template #message=\"slotProps\">\r\n <div class=\"top-toast__content\">\r\n <div :class=\"['top-toast__summary', severityClass(slotProps.message, 'summary')]\">{{ slotProps.message.summary }}</div>\r\n <div class=\"top-toast__detail\">{{ slotProps.message.detail }}</div>\r\n <slot\r\n v-if=\"hasAction(slotProps.message)\"\r\n name=\"action\"\r\n :action=\"actionOf(slotProps.message)\"\r\n :message=\"slotProps.message\"\r\n :run=\"() => runAction(slotProps.message)\"\r\n >\r\n <button\r\n v-if=\"actionOf(slotProps.message)\"\r\n :class=\"['top-toast__action', severityClass(slotProps.message, 'action')]\"\r\n type=\"button\"\r\n @click=\"runAction(slotProps.message)\"\r\n >\r\n <i v-if=\"actionOf(slotProps.message)?.icon\" :class=\"actionOf(slotProps.message)?.icon\" aria-hidden=\"true\" />\r\n {{ actionOf(slotProps.message)?.label }}\r\n </button>\r\n </slot>\r\n <slot\r\n v-if=\"hasFooter(slotProps.message)\"\r\n name=\"footer\"\r\n :message=\"slotProps.message\"\r\n :footer=\"footerOf(slotProps.message)\"\r\n >\r\n <div v-if=\"footerOf(slotProps.message) !== undefined\" class=\"top-toast__footer\">\r\n {{ footerOf(slotProps.message) }}\r\n </div>\r\n </slot>\r\n </div>\r\n </template>\r\n </Toast>\r\n\r\n</template>\r\n\r\n<style>\r\n.top-toast__content { display: flex; width: 100%; flex-direction: column; gap: .5rem; }\r\n.top-toast__summary { font-weight: 600; }\r\n.top-toast__detail { font-size: .875rem; }\r\n.top-toast__footer { margin-top: .25rem; border-top: 1px solid #9ca3af; padding-top: .5rem; color: #6b7280; font-size: .75rem; }\r\n.top-toast__action { display: inline-flex; align-items: center; align-self: flex-start; gap: .5rem; border: 0; border-radius: 10px; padding: .25rem .75rem; color: #fff; font-size: .875rem; cursor: pointer; }\r\n.top-toast__summary--success, .top-toast__detail--success { color: #047857; }\r\n.top-toast__summary--error, .top-toast__detail--error { color: #dc2626; }\r\n.top-toast__summary--warn, .top-toast__detail--warn { color: #b45309; }\r\n.top-toast__summary--info, .top-toast__detail--info { color: #036da3; }\r\n.top-toast__summary--secondary, .top-toast__detail--secondary { color: #52525b; }\r\n.top-toast__summary--contrast, .top-toast__detail--contrast { color: #18181b; }\r\n.top-toast__action--success { background: #059669; }\r\n.top-toast__action--success:hover { background: #047857; }\r\n.top-toast__action--error { background: #dc2626; }\r\n.top-toast__action--error:hover { background: #b91c1c; }\r\n.top-toast__action--warn { background: #d97706; }\r\n.top-toast__action--warn:hover { background: #b45309; }\r\n.top-toast__action--info { background: #036da3; }\r\n.top-toast__action--info:hover { background: #02466b; }\r\n.top-toast__action--secondary { background: #52525b; }\r\n.top-toast__action--secondary:hover { background: #3f3f46; }\r\n.top-toast__action--contrast { background: #18181b; }\r\n.top-toast__action--contrast:hover { background: #000; }\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport Toast from 'primevue/toast'\r\nimport type { ToastMessageOptions } from 'primevue/toast'\r\n\r\nexport type TopToastFooter = string | number\r\n\r\nexport type TopToastAction = {\r\n label: string\r\n icon?: string\r\n onClick?: () => void\r\n}\r\n\r\nexport type TopToastData = {\r\n footer?: TopToastFooter\r\n action?: TopToastAction\r\n}\r\n\r\ntype TopToastMessage = ToastMessageOptions & {\r\n data?: TopToastData\r\n}\r\n\r\nwithDefaults(\r\n defineProps<{\r\n baseZIndex?: number\r\n }>(),\r\n {\r\n baseZIndex: 30000,\r\n },\r\n)\r\n\r\nfunction footerOf(message: TopToastMessage): TopToastFooter | undefined {\r\n return message.data?.footer\r\n}\r\n\r\nfunction actionOf(message: TopToastMessage) {\r\n return message.data?.action\r\n}\r\n\r\nfunction runAction(message: TopToastMessage) {\r\n actionOf(message)?.onClick?.()\r\n}\r\n\r\nfunction hasFooter(message: TopToastMessage) {\r\n return footerOf(message) !== undefined\r\n}\r\n\r\nfunction hasAction(message: TopToastMessage) {\r\n return Boolean(actionOf(message))\r\n}\r\n\r\nfunction severityClass(message: TopToastMessage, element: 'summary' | 'detail' | 'action') {\r\n const severity = message.severity ?? 'info'\r\n return `top-toast__${element}--${severity}`\r\n}\r\n</script>\r\n\r\n<template>\r\n <Toast position=\"top-right\" :base-z-index=\"baseZIndex\">\r\n <template #message=\"slotProps\">\r\n <div class=\"top-toast__content\">\r\n <div :class=\"['top-toast__summary', severityClass(slotProps.message, 'summary')]\">{{ slotProps.message.summary }}</div>\r\n <div class=\"top-toast__detail\">{{ slotProps.message.detail }}</div>\r\n <slot\r\n v-if=\"hasAction(slotProps.message)\"\r\n name=\"action\"\r\n :action=\"actionOf(slotProps.message)\"\r\n :message=\"slotProps.message\"\r\n :run=\"() => runAction(slotProps.message)\"\r\n >\r\n <button\r\n v-if=\"actionOf(slotProps.message)\"\r\n :class=\"['top-toast__action', severityClass(slotProps.message, 'action')]\"\r\n type=\"button\"\r\n @click=\"runAction(slotProps.message)\"\r\n >\r\n <i v-if=\"actionOf(slotProps.message)?.icon\" :class=\"actionOf(slotProps.message)?.icon\" aria-hidden=\"true\" />\r\n {{ actionOf(slotProps.message)?.label }}\r\n </button>\r\n </slot>\r\n <slot\r\n v-if=\"hasFooter(slotProps.message)\"\r\n name=\"footer\"\r\n :message=\"slotProps.message\"\r\n :footer=\"footerOf(slotProps.message)\"\r\n >\r\n <div v-if=\"footerOf(slotProps.message) !== undefined\" class=\"top-toast__footer\">\r\n {{ footerOf(slotProps.message) }}\r\n </div>\r\n </slot>\r\n </div>\r\n </template>\r\n </Toast>\r\n\r\n</template>\r\n\r\n<style>\r\n.top-toast__content { display: flex; width: 100%; flex-direction: column; gap: .5rem; }\r\n.top-toast__summary { font-weight: 600; }\r\n.top-toast__detail { font-size: .875rem; }\r\n.top-toast__footer { margin-top: .25rem; border-top: 1px solid #9ca3af; padding-top: .5rem; color: #6b7280; font-size: .75rem; }\r\n.top-toast__action { display: inline-flex; align-items: center; align-self: flex-start; gap: .5rem; border: 0; border-radius: 10px; padding: .25rem .75rem; color: #fff; font-size: .875rem; cursor: pointer; }\r\n.top-toast__summary--success, .top-toast__detail--success { color: #047857; }\r\n.top-toast__summary--error, .top-toast__detail--error { color: #dc2626; }\r\n.top-toast__summary--warn, .top-toast__detail--warn { color: #b45309; }\r\n.top-toast__summary--info, .top-toast__detail--info { color: #036da3; }\r\n.top-toast__summary--secondary, .top-toast__detail--secondary { color: #52525b; }\r\n.top-toast__summary--contrast, .top-toast__detail--contrast { color: #18181b; }\r\n.top-toast__action--success { background: #059669; }\r\n.top-toast__action--success:hover { background: #047857; }\r\n.top-toast__action--error { background: #dc2626; }\r\n.top-toast__action--error:hover { background: #b91c1c; }\r\n.top-toast__action--warn { background: #d97706; }\r\n.top-toast__action--warn:hover { background: #b45309; }\r\n.top-toast__action--info { background: #036da3; }\r\n.top-toast__action--info:hover { background: #02466b; }\r\n.top-toast__action--secondary { background: #52525b; }\r\n.top-toast__action--secondary:hover { background: #3f3f46; }\r\n.top-toast__action--contrast { background: #18181b; }\r\n.top-toast__action--contrast:hover { background: #000; }\r\n</style>\r\n"],"mappings":"8wCAMA,IAAM,GAAA,EAAQ,EAAA,SAAA,CAAS,EACjB,GAAA,EAAe,EAAA,SAAA,KAAe,EAAQ,EAAM,IAAK,EAEjD,EAAQ,EA6BR,EAAO,EAIP,GAAA,EAAgB,EAAA,SAAA,KAAe,CACnC,IAAM,EAAe,EAAM,SAMvB,GALA,EAAM,UACJ,gIACA,EAAM,SACJ,4LACA,mJAGR,OAAA,EAAO,EAAA,QAAA,CAAQ,EAAa,EAAM,KAAK,CACzC,CAAC,iBAIC,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAuBO,OAvBP,EAuBO,EAAA,EAtBL,EAAA,eAAA,GAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,YAAA,EAAA,EAqBS,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAhBN,KAAM,EAAA,KACN,MAAO,EAAA,MACP,SAAU,EAAA,UAAY,EAAA,QACtB,KAAM,EAAA,MAAe,IAAA,GAAY,EAAA,MAAQ,IAAA,GACzC,QAAS,EAAA,QACT,SAAU,EAAA,UAAY,EAAA,UACtB,SAAU,EAAA,UAAS,YAAiB,IAAA,GACpC,OAAA,EAAK,EAAA,eAAA,CAAE,EAAA,KAAa,EACpB,GAAE,CAA4B,KAAA,CAAA,MAAA,EAAA,KAAa,CAAA,EAG3C,QAAK,AAAA,EAAA,KAAA,GAAE,EAAI,OAAA,CAEI,GAAA,EAAA,EAAA,YAAA,CAAA,CAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,CAAe,KAAA,OAC7B,IAAA,EAAA,EAAA,QAAA,KAAoB,EAAA,EAApB,EAAA,WAAA,CAAoB,EAAA,OAAA,MAAA,CAAA,CAAA,qIAlBW,MAAA,EAAA,QAAyB,MAAA,EAAA,qBAAhD,CAAA,IAAV,EAGE,WE7DK,EAAS,CACpB,QAAS,CACP,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,SACP,EACA,UAAW,CACT,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,SACP,EACA,QAAS,CACP,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,SACP,EACA,KAAM,CACJ,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,SACP,EACA,OAAQ,CACN,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,SACP,CACF,ssBC1DA,IAAM,EAAQ,EAyBR,EAAO,EAOP,GAAA,EAAe,EAAA,SAAA,CAAS,CAC5B,QAAW,EAAM,WACjB,IAAM,GAAmB,CACnB,CAAC,GAAS,EAAM,SACpB,EAAK,oBAAqB,CAAK,CACjC,CACF,CAAC,EAEK,GAAA,EAAc,EAAA,SAAA,MAAwC,CAC1D,8BACE,EAAM,WAAa,SAAW,EAAO,OAAO,KAAO,EAAO,QAAQ,KACpE,oCACE,EAAM,WAAa,SAAW,EAAO,OAAO,KAAO,EAAO,QAAQ,IACtE,EAAE,EAEI,GAAA,EAAqB,EAAA,SAAA,KACzB,CACE,oBACA,EAAM,WAAa,SAAW,sCAAwC,EACxE,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,CACb,EAEA,SAAS,GAAU,CACb,EAAM,SACV,EAAK,SAAS,CAChB,CAEA,SAAS,GAAS,CACZ,EAAM,UACV,EAAK,QAAQ,EACb,EAAa,MAAQ,GACvB,CAEA,SAAS,GAAQ,CACX,EAAM,UACV,EAAa,MAAQ,GACvB,gBAIE,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,YAAA,EAAA,EA+DS,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CA9DC,QAAS,EAAA,MAAA,mBAAA,AAAA,EAAA,KAAA,GAAA,EAAY,MAAA,EAC7B,MAAA,GACC,SAAU,GACV,kBAAe,CAAG,EAAA,QAClB,mBAAkB,GAClB,UAAW,GACX,cAAa,GACb,MAAO,CAAA,MAAA,QAAA,SAAA,oBAAA,EACP,aAAY,EAAA,MACZ,GAAI,wGAIJ,EACA,OAAI,AAAA,EAAA,KAAA,GAAE,EAAI,OAAA,IAEX,SAAA,EAAA,EAAA,QAAA,KA6CM,EAAA,EA7CN,EAAA,mBAAA,CA6CM,MAAA,CA5CJ,MAAM,wDACL,OAAA,EAAK,EAAA,eAAA,CAAE,EAAA,KAAW,KAEnB,EAAA,EAAA,mBAAA,CAQS,SAAA,CAPP,KAAK,SACL,MAAM,8WACL,aAAY,EAAA,WACZ,SAAU,EAAA,QACV,QAAO,CAER,EAAA,CAAA,GAAA,AAAA,EAAA,KAAA,EAAA,EAAA,EAAA,mBAAA,CAAoD,IAAA,CAAjD,MAAM,sBAAsB,cAAY,yBAG7C,EAAA,EAAA,mBAAA,CAQM,MARN,EAQM,EAAA,EAPJ,EAAA,mBAAA,CAGE,IAAA,CAFC,OAAA,EAAK,EAAA,eAAA,CAAA,CAAG,EAAA,KAAI,sCAAA,CAAA,EACb,cAAY,MAEd,EAAA,KAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAEI,IAFJ,GAAA,EAEI,EAAA,gBAAA,CADC,EAAA,KAAK,EAAA,CAAA,CAAA,CAAA,GAIZ,EAAA,EAAA,mBAAA,CAIM,MAJN,EAIM,EAAA,EAHJ,EAAA,WAAA,CAEO,EAAA,OAAA,UAAA,CAAA,MAAA,EAAA,EADL,EAAA,WAAA,CAA0B,EAAA,OAAA,UAAA,CAAA,MAAA,EAAA,EAAjB,EAAA,gBAAA,EAAA,EAAA,EAAA,gBAAA,CAAA,EAAA,OAAO,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAIpB,EAAA,EAAA,mBAAA,CAcM,MAdN,EAcM,EAAA,EAbJ,EAAA,YAAA,CAME,EAAA,CALC,MAAO,EAAA,WACR,UAAA,GACC,SAAU,EAAA,QACX,MAAM,oBACL,QAAO,CAEV,EAAA,KAAA,EAAA,CAAA,QAAA,UAAA,CAAA,GAAA,EAAA,EAAA,YAAA,CAKE,EAAA,CAJC,MAAO,EAAA,QAAU,EAAA,YAAc,EAAA,YAC/B,QAAS,EAAA,QACT,OAAA,EAAK,EAAA,eAAA,CAAE,EAAA,KAAkB,EACzB,QAAO,kkBEvIlB,IAAM,EAAQ,EAqBR,EAAO,EAIP,GAAA,EAAQ,EAAA,SAAA,CAAS,EACjB,GAAA,EAAc,EAAA,MAAA,CAAM,EAEpB,GAAA,EAAU,EAAA,SAAA,KACd,EAAM,KAAO,IAAA,IAAa,EAAM,KAAO,MAAQ,EAAM,KAAO,GACxD,EACA,OAAO,EAAM,EAAE,CACrB,EACM,GAAA,EAAU,EAAA,SAAA,KAAe,GAAG,EAAQ,MAAM,OAAO,EACjD,GAAA,EAAc,EAAA,SAAA,KAEZ,CACN,GAAI,EAAM,MAAO,MAAO,GAExB,IAAM,EAAQ,EAAM,gBACpB,OAAO,OAAO,GAAU,WACtB,IAAU,QACV,IAAU,SACV,IAAU,WACV,IAAU,WACR,EACA,IAAA,EACN,CAAC,EACK,GAAA,EAAc,EAAA,SAAA,KAAe,CACjC,IAAM,EAAsB,EAAM,oBAC5B,EAAM,CACV,OAAO,GAAwB,SAAW,EAAsB,GAChE,EAAM,MAAQ,EAAQ,MAAQ,EAChC,CAAC,CAAC,OAAO,OAAO,EAEhB,OAAO,EAAI,OAAS,EAAI,KAAK,GAAG,EAAI,IAAA,EACtC,CAAC,EAED,SAAS,EAAiB,EAA2B,CACnD,EAAK,oBAAqB,GAAS,EAAE,CACvC,gBAIE,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAmCM,MAnCN,EAmCM,CAjCI,EAAA,QAAA,EADR,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAOQ,QAAA,OALL,IAAK,EAAA,MACN,MAAM,yDAEH,EAAA,EAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,gBAAA,CAAA,EAAA,KAAK,EAAG,IACX,CAAA,EAAY,EAAA,WAAA,EAAZ,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAAwF,OAAxF,EAAgF,GAAC,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,CAAA,EAAA,EAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,GAGnF,EAAA,EAAA,YAAA,EAAA,EAeE,EAAA,MAAA,CAAA,EAAA,OAAA,GAAA,EAfF,EAAA,WAAA,CACUA,EAcR,OAdc,CACb,GAAI,EAAA,MACJ,cAAa,EAAA,WACd,KAAK,OACJ,YAAa,EAAA,YACb,SAAU,EAAA,SACV,SAAU,EAAA,SACV,SAAU,EAAA,SACV,QAAS,EAAQ,EAAA,MACjB,eAAc,EAAA,MACd,mBAAkB,EAAA,MACnB,MAAA,GACA,MAAM,kYACL,sBAAoB,6HAIf,EAAA,QAAA,EADR,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAOO,OAAA,OALJ,GAAI,EAAA,MACL,MAAM,6CACN,KAAK,OAEF,GAAA,EAAA,EAAA,gBAAA,CAAA,EAAA,KAAK,EAAA,EAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,qiEEhGd,IAAM,EAAQ,EAqDR,EAAO,EASP,GAAA,EAAQ,EAAA,SAAA,CAAS,EAEjB,EAAkB,EAAA,QAClB,GAAA,EAAQ,EAAA,IAAA,CAAI,EAAE,EACd,GAAA,EAAU,EAAA,IAAA,CAAI,EAAK,EACnB,GAAA,EAAkB,EAAA,IAAA,CAAkC,IAAI,EACxD,EAAa,cAAc,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,IAC/D,EAAmD,KAEjD,GAAA,EAAa,EAAA,SAAA,CAAS,CAC1B,QAAW,EAAM,WACjB,IAAM,GAAU,EAAK,oBAAqB,CAAK,CACjD,CAAC,EAED,SAAS,EAAgB,EAAyC,EAAa,CAG7E,OAFI,GAAW,KAAqC,GAE7C,OADH,OAAO,GAAW,SACR,EAAO,IAAQ,GADiB,CAAM,CAEtD,CAEA,SAAS,EAAe,EAAyC,CAG/D,OAFI,GAAW,KAAqC,GAChD,OAAO,EAAM,aAAgB,WAAmB,EAAM,YAAY,CAAM,EACrE,EAAgB,EAAQ,EAAM,WAAW,CAClD,CAEA,SAAS,EAAgB,EAAyC,CAChE,OAAO,EAAM,aAAe,EAAgB,EAAQ,EAAM,YAAY,EAAI,EAC5E,CAEA,SAAS,EAAkB,EAAyC,EAAgB,EAAM,mBAAoB,CAC5G,IAAM,EAAQ,EAAe,CAAM,EAC7B,EAAS,EAAgB,CAAM,EACrC,OAAO,GAAiB,EAAS,GAAG,EAAO,KAAK,IAAU,CAC5D,CAEA,SAAS,EAAoB,EAAe,CAC1C,IAAM,EAAa,EAAM,MACzB,GAAI,CAAC,EAAY,MAAO,CAAC,CAAE,KAAM,EAAO,YAAa,EAAM,CAAC,EAE5D,IAAM,EAAe,EAAW,QAAQ,sBAAuB,MAAM,EAC/D,EAAY,OAAO,IAAI,EAAa,GAAI,IAAI,EAClD,OAAO,EAAM,MAAM,CAAK,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,IAAK,IAAU,CACvD,KAAM,EACN,YAAa,EAAK,YAAY,IAAM,EAAW,YAAY,CAC7D,EAAE,CACJ,CAEA,SAAS,GAAe,CACtB,EAAgB,OAAO,OAAO,CAChC,CAEA,SAAS,GAAsB,CACzB,OAAO,OAAW,KACtB,OAAO,cAAc,IAAI,YAAY,0BAA2B,CAAE,OAAQ,CAAE,YAAW,CAAE,CAAC,CAAC,CAC7F,CAEA,SAAS,EAA2B,EAAc,CAE5C,EAAY,QAAQ,aAAe,GAAY,EAAa,CAClE,CAEA,SAAS,GAAgB,CACvB,GAAI,EAAM,UAAY,EAAY,CAChC,EAAa,EACb,MACF,CACA,EAAQ,MAAQ,GAChB,EAAoB,CACtB,CAEA,SAAS,GAAsB,CACxB,EAAM,gBACX,EAAQ,MAAQ,GAChB,EAAa,GACb,EAAA,EAAA,SAAA,CAAS,CAAY,EACjB,GAAY,aAAa,CAAU,EACvC,EAAa,eAAiB,CAC5B,EAAa,EACb,EAAa,IACf,EAAG,GAAG,EACR,QAEA,EAAa,CAAE,cAAa,CAAC,GAE7B,EAAA,EAAA,UAAA,KAAgB,OAAO,iBAAiB,0BAA2B,CAA0B,CAAC,GAC9F,EAAA,EAAA,gBAAA,KAAsB,CACpB,OAAO,oBAAoB,0BAA2B,CAA0B,EAC5E,GAAY,aAAa,CAAU,CACzC,CAAC,GAED,EAAA,EAAA,MAAA,KAAY,EAAM,SAAW,GAAa,CACpC,IACF,EAAQ,MAAQ,GAChB,EAAa,EAEjB,CAAC,GAED,EAAA,EAAA,MAAA,KAAY,EAAM,YAAe,CAC1B,EAAQ,OAAO,EAAa,CACnC,CAAC,WAIC,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAwGM,MAAA,CAxGD,OAAA,EAAK,EAAA,eAAA,CAAA,CAAC,qDAAoD,CAAA,sBAAkC,EAAA,QAAQ,CAAA,CAAA,EAAK,UAAS,CACrH,EAAA,EAAA,EAAA,EAAA,mBAAA,CAKO,OALP,EAKO,EAAA,EAJL,EAAA,WAAA,CAGO,EAAA,OAAA,OAAA,CAHY,QAAS,EAAA,OAAO,MAG5B,CAFI,EAAA,UAAA,EAAT,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAAkD,IAAlD,CAAkD,KAAA,EAClD,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAAiC,IAAjC,CAAiC,EAAA,CAAA,CAAA,CAAA,GAAA,EAIrC,EAAA,YAAA,EAAA,EA+FkB,EAAA,MAAA,CAAA,CAAA,EAAA,CA9FZ,QAAA,kBAAJ,IAAI,EACK,WAAA,EAAA,MAAA,sBAAA,AAAA,EAAA,KAAA,GAAA,EAAU,MAAA,EAClB,qBAAoB,EAAA,kBAAoB,IAAA,GACxC,wBAAuB,EAAA,qBAAuB,IAAA,GAC9C,YAAa,EAAA,QACb,WAAU,EAAA,UACV,eAAe,GAAyB,EAAkB,CAAM,EAChE,YAAa,EAAA,YACb,SAAU,EAAA,SACV,aAAY,EAAA,eACZ,SAAU,EAAA,SACV,MAAO,IACP,aAAU,CAAG,EAAA,UAAQ,CAAK,EAAA,SAC3B,SAAA,GACA,gBAAc,UACb,oBAAmB,GACnB,QAAS,EAAA,QACV,MAAA,GACC,kBAAiB,EAAA,eAClB,cAAY,UACX,2BAAwB,SAA+C,WAAA,GAAmB,EAAI,WAAa,CAAK,4BAA8D,aAAA,EAAA,cAO9K,GAAE,CAA+C,KAAA,CAAA,MAAA,CAAA,iBAAA,EAAA,SAAQ,SAAA,UAAA,CAAA,CAA0B,KAAI,GAAA,CAAA,6KAAyT,MAAA,CAAA,MAAA,CAAA,2CAAA,EAAA,SAAQ,qFAAA,sGAAA,CAAA,CAAkM,KAAI,GAAA,CAAA,EAAuH,cAAA,CAAA,MAAA,CAAA,2EAAA,EAAA,SAAQ,wCAAA,mBAAA,CAAA,CAAkE,KAAI,GAAA,CAAA,8UAAsf,cAAA,CAAA,MAAA,+BAAA,MAAA,CAAA,UAAA,SAAA,SAAA,EAAA,YAAU,OAAA,GAAgB,EAAA,WAAU,CAAA,MAAY,EAAA,UAAU,EAAA,CAAA,CAAA,CAAA,uIAgBp1C,iBAAe,IACd,QAAK,AAAA,EAAA,KAAA,GAAA,CAAE,EAAA,MAAK,GAAO,EAAI,OAAA,CAAA,EACvB,aAAW,AAAA,EAAA,KAAG,GAAc,CAAO,EAAA,MAAK,GAAO,EAAI,SAAW,CAAK,EAAG,EAAmB,CAAA,EACzF,WAAQ,AAAA,EAAA,KAAG,GAA+C,CAAA,GAAW,EAAA,SAAQ,CAAI,EAAY,EAAA,MAAA,CAAc,EAAA,MAAQ,EAAM,OAAK,GAAQ,EAAmB,EAAI,EAAI,SAAA,CAAA,GAAgB,EAAK,MAAS,EAAA,KAAK,CAAA,CAAA,EACpM,SAAM,AAAA,EAAA,KAAG,GAAmB,EAAI,SAAW,CAAK,sBAEtC,MAAA,EAAI,EAAA,QAAA,CAAE,GAAS,EAAA,EACZ,EAAA,MAAA,CAAA,CAAA,CAAK,CAAC,MAAA,EAAlB,EAAA,WAAA,CAAyD,EAAA,OAAA,QAAA,EAAA,EAAA,eAAA,EAAA,EAAA,EAAA,mBAAA,CAAb,CAAS,CAAA,EAAA,IAAA,GAAA,IAAA,GAAA,CAAA,IAAA,EACrD,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAKM,MALN,EAKM,EAAA,EAJJ,EAAA,mBAAA,CAGM,MAHN,EAGM,EAAA,EAFJ,EAAA,mBAAA,CAAoI,IAAA,CAAjI,MAAM,+EAAgF,QAAK,GAAE,EAAU,eAAe,CAAM,CAC/H,EAAA,KAAA,EAAA,CAAA,GAAA,EAAA,EAAA,eAAA,GAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAAyK,OAAzK,EAAyK,EAAA,EAA5C,EAAA,gBAAA,EAAA,EAAA,EAAA,gBAAA,CAAA,EAAkB,EAAU,KAAK,CAAA,EAAA,CAAA,CAAA,CAAA,GAAA,CAAA,wBAAzI,EAAkB,EAAU,KAAK,SAAtC,CAAA,IAAV,EAAkD,YAKnD,OAAA,EAAK,EAAA,QAAA,KAC0B,EAAA,EAA5B,EAAA,MAAA,CAAA,CAAA,CAAK,CAAC,OAAA,EAAlB,EAAA,WAAA,CAAwC,EAAA,OAAA,QAAA,CAAA,EAAA,IAAA,GAAA,IAAA,GAAA,CAAA,EACxB,EAAA,UAAA,EAAhB,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAGM,MAHN,EAGM,CAFJ,AAAA,EAAA,MAAA,EAAA,EAAA,mBAAA,CAAgE,OAAA,CAA1D,MAAM,iDAAiD,EAAA,KAAA,EAAA,EACjD,EAAA,qBAAA,EAAZ,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAAwG,OAAxG,GAAA,EAAwG,EAAA,gBAAA,CAAxB,EAAA,cAAc,EAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,CAAA,CAAA,KAAA,EAEhG,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAAyE,OAAzE,GAAA,EAAyE,EAAA,gBAAA,CAAtB,EAAA,YAAY,EAAA,CAAA,EAAA,CAAA,EAGtD,iBAAA,EAAa,EAAA,QAAA,CAAE,GAAS,EAAA,EACrB,EAAA,MAAA,CAAA,CAAA,CAAK,CAAA,kBAAA,EAAjB,EAAA,WAAA,CAA8E,EAAA,OAAA,iBAAA,EAAA,EAAA,eAAA,EAAA,EAAA,EAAA,mBAAA,CAAb,CAAS,CAAA,EAAA,IAAA,GAAA,IAAA,GAAA,CAAA,EACzD,EAAU,OAAA,EAA3B,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAA+E,OAAA,GAAA,EAAA,EAAA,gBAAA,CAA3C,EAAkB,EAAU,IAAI,CAAA,EAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,CAAA,CAAA,EAG3D,aAAA,EAAW,EAAA,QAAA,CAAE,GAAS,EAAA,EACnB,EAAA,MAAA,CAAA,CAAA,CAAK,CAAA,iBAAA,EAAjB,EAAA,WAAA,CAA4E,EAAA,OAAA,gBAAA,EAAA,EAAA,eAAA,EAAA,EAAA,EAAA,mBAAA,CAAb,CAAS,CAAA,EAAA,IAAA,GAAA,IAAA,GAAA,CAAA,IAAA,EACxE,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAGM,MAHN,EAGM,CAFK,EAAU,OAAO,OAAA,EAA1B,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAAiE,IAAA,OAAhC,OAAA,EAAK,EAAA,eAAA,CAAE,EAAU,OAAO,IAAI,CAC7D,EAAA,KAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,GAAA,EAAA,EAAA,mBAAA,CAAgE,OAAA,MAAA,EAAA,EAAA,gBAAA,CAAvD,EAAU,OAAO,EAAA,kBAAgB,QAAA,EAAA,CAAA,CAAA,CAAA,EAAA,CAAA,EAInC,QAAA,EAAM,EAAA,QAAA,CAAE,GAAS,EAAA,EACd,EAAA,MAAA,CAAA,CAAA,CAAK,CAAC,QAAA,EAAlB,EAAA,WAAA,CAAkK,EAAA,OAAA,UAAA,EAAlK,EAAA,WAAA,CAAgD,EAAS,CAAG,MAAO,EAAe,EAAU,MAAM,EAAI,OAAQ,EAAgB,EAAU,MAAM,EAAI,MAAO,EAAA,KACzJ,CAAA,EAAA,IAAA,GAAA,IAAA,GAAA,CAAA,GAAA,EAAA,EAAA,eAAA,GAAA,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAOM,MAPN,EAOM,EAAA,EANJ,EAAA,mBAAA,CAKO,OAAA,CALD,MAAM,4FAA6F,MAAO,EAAe,EAAU,MAAM,CACjI,EAAA,CAAA,EAAA,kBAAoB,EAAgB,EAAU,MAAM,IAAA,EAAhE,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAEO,OAFP,EAEO,GAAA,EADL,EAAA,UAAA,CAAA,EAAA,GAAA,EAAA,EAAA,mBAAA,CAA6S,EAAA,SAAA,MAAA,EAAA,EAAA,WAAA,CAA3Q,EAAoB,EAAgB,EAAU,MAAM,CAAA,GAApE,EAAM,MAAwE,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAAA,EAAA,SAAA,CAAA,IAAA,CAAK,EAAA,CAAc,EAAK,cAAA,EAAjB,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAAgJ,OAAhJ,GAAA,EAAgJ,EAAA,gBAAA,CAAnB,EAAK,IAAI,EAAA,CAAA,KAAA,EAAU,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAA2C,EAAA,SAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAvB,EAAA,gBAAA,EAAA,EAAA,EAAA,gBAAA,CAAA,EAAK,IAAI,EAAA,CAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAyB,EAAA,GAAA,GAAA,AAAA,EAAA,MAAA,EAAA,EAAA,mBAAA,CAAkF,OAAA,CAA5E,MAAM,iDAAiD,EAAC,YAAa,EAAA,CAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,IAAA,EAE1X,EAAA,UAAA,CAAA,EAAA,GAAA,EAAA,EAAA,mBAAA,CAA4S,EAAA,SAAA,MAAA,EAAA,EAAA,WAAA,CAA1Q,EAAoB,EAAe,EAAU,MAAM,CAAA,GAAnE,EAAM,MAAuE,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAAA,EAAA,SAAA,CAAA,IAAA,CAAK,EAAA,CAAc,EAAK,cAAA,EAAjB,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAAgJ,OAAhJ,GAAA,EAAgJ,EAAA,gBAAA,CAAnB,EAAK,IAAI,EAAA,CAAA,KAAA,EAAU,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAA2C,EAAA,SAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAvB,EAAA,gBAAA,EAAA,EAAA,EAAA,gBAAA,CAAA,EAAK,IAAI,EAAA,CAAA,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,4CAL5P,EAAA,YAAc,EAAe,EAAU,MAAM,EAAA,YAAlD,CAAA,IAAV,EAAqE,UAUnE,EAAA,EAAA,EAAA,EAAA,MAAA,CAAA,CAAA,CAAK,CAAC,OAAA,CAAS,KAAA,SAAmB,IAAA,EAAA,EAAA,QAAA,CAAX,GAAS,EAAA,EAAE,EAAA,WAAA,CAAyC,EAAA,OAAA,UAAA,EAAA,EAAA,eAAA,EAAA,EAAA,EAAA,mBAAA,CAAb,CAAS,CAAA,CAAA,CAAA,CAAA,qcErP7F,SAAS,EAAS,EAAsD,CACtE,OAAO,EAAQ,MAAM,MACvB,CAEA,SAAS,EAAS,EAA0B,CAC1C,OAAO,EAAQ,MAAM,MACvB,CAEA,SAAS,EAAU,EAA0B,CAC3C,EAAS,CAAO,CAAC,EAAE,UAAU,CAC/B,CAEA,SAAS,EAAU,EAA0B,CAC3C,OAAO,EAAS,CAAO,IAAM,IAAA,EAC/B,CAEA,SAAS,EAAU,EAA0B,CAC3C,MAAO,EAAQ,EAAS,CAAO,CACjC,CAEA,SAAS,EAAc,EAA0B,EAA0C,CAEzF,MAAO,cAAc,EAAQ,IADZ,EAAQ,UAAY,QAEvC,gBAIE,EAAA,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,YAAA,EAAA,EAkCQ,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAlCD,SAAS,YAAa,eAAc,EAAA,aAC9B,SAAA,EAAO,EAAA,QAAA,CAAE,GAAS,EAAA,EAC3B,EAAA,mBAAA,CA8BM,MA9BN,EA8BM,EA7BJ,EAAA,EAAA,mBAAA,CAAuH,MAAA,CAAjH,OAAA,EAAK,EAAA,eAAA,CAAA,CAAA,qBAAyB,EAAc,EAAU,QAAO,SAAA,CAAA,CAAA,CAAkB,GAAA,EAAA,EAAA,gBAAA,CAAA,EAAU,QAAQ,OAAO,EAAA,CAAA,GAC9G,EAAA,EAAA,mBAAA,CAAmE,MAAnE,GAAA,EAAmE,EAAA,gBAAA,CAAjC,EAAU,QAAQ,MAAM,EAAA,CAAA,EAElD,EAAU,EAAU,OAAO,GAAA,EADnC,EAAA,WAAA,CAgBO,EAAA,OAAA,SAAA,CAbJ,OAAQ,EAAS,EAAU,OAAO,EAClC,QAAS,EAAU,QACnB,QAAW,EAAU,EAAU,OAAO,CALzC,MAgBO,CARG,EAAS,EAAU,OAAO,IAAA,EADlC,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAQS,SAAA,OANN,OAAA,EAAK,EAAA,eAAA,CAAA,CAAA,oBAAwB,EAAc,EAAU,QAAO,QAAA,CAAA,CAAA,EAC7D,KAAK,SACJ,QAAK,GAAE,EAAU,EAAU,OAAO,CAE1B,EAAA,CAAA,EAAS,EAAU,OAAO,CAAA,EAAG,OAAA,EAAtC,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAA4G,IAAA,OAA/D,OAAA,EAAK,EAAA,eAAA,CAAE,EAAS,EAAU,OAAO,CAAA,EAAG,IAAI,EAAE,cAAY,MAAS,EAAA,KAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,GAAA,EAAA,EAAA,gBAAA,CAAA,KAAA,EAC5G,EAAA,gBAAA,CAAG,EAAS,EAAU,OAAO,CAAA,EAAG,KAAK,EAAA,CAAA,CAAA,EAAA,GAAA,CAAA,IAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,CAAA,EAAA,IAAA,GAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,EAIjC,EAAU,EAAU,OAAO,GAAA,EADnC,EAAA,WAAA,CASO,EAAA,OAAA,SAAA,CANJ,QAAS,EAAU,QACnB,OAAQ,EAAS,EAAU,OAAO,CAJrC,MASO,CAHM,EAAS,EAAU,OAAO,IAAM,IAAA,IACZ,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA,IADY,EAA3C,EAAA,UAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAEM,MAFN,GAAA,EAEM,EAAA,gBAAA,CADD,EAAS,EAAU,OAAO,CAAA,EAAA,CAAA,EAAA,EAAA,IAAA,GAAA,CAAA,GAAA,EAAA,EAAA,mBAAA,CAAA,GAAA,EAAA"}
|
|
1
|
+
{"version":3,"file":"TopToast-CXhVkVWT.cjs","names":["$attrs"],"sources":["../src/components/TopButton.vue","../src/components/TopButton.vue","../src/tokens/colors.ts","../src/components/TopConfirmDialog.vue","../src/components/TopConfirmDialog.vue","../src/components/TopInputText.vue","../src/components/TopInputText.vue","../src/components/TopSelect.vue","../src/components/TopSelect.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'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\nconst slots = useSlots()\r\nconst outrosIcones = computed(() => Boolean(slots.icon))\r\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\r\n secondary?: boolean\r\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,\r\n secondary: false,\r\n disabled: false,\r\n unstyled: false,\r\n type: 'button',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n click: []\r\n}>()\r\n\r\nconst buttonClasses = computed(() => {\r\n const baseClasses = !props.unstyled\r\n ? props.secondary\r\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'\r\n : props.outlined\r\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'\r\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'\r\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 || secondary\"\r\n :severity=\"secondary ? 'secondary' : undefined\"\r\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'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\nconst slots = useSlots()\r\nconst outrosIcones = computed(() => Boolean(slots.icon))\r\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\r\n secondary?: boolean\r\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,\r\n secondary: false,\r\n disabled: false,\r\n unstyled: false,\r\n type: 'button',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n click: []\r\n}>()\r\n\r\nconst buttonClasses = computed(() => {\r\n const baseClasses = !props.unstyled\r\n ? props.secondary\r\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'\r\n : props.outlined\r\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'\r\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'\r\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 || secondary\"\r\n :severity=\"secondary ? 'secondary' : undefined\"\r\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' ? 'top-confirm-dialog__confirm--danger' : '',\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 {\n border-color: var(--top-confirm-dialog-accent-hover) !important;\n background-color: var(--top-confirm-dialog-accent-hover) !important;\n}\n\n.top-confirm-dialog__confirm--danger:focus {\n box-shadow: 0 0 0 0.2rem var(--top-confirm-dialog-accent) !important;\n}\n</style>\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' ? 'top-confirm-dialog__confirm--danger' : '',\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 {\n border-color: var(--top-confirm-dialog-accent-hover) !important;\n background-color: var(--top-confirm-dialog-accent-hover) !important;\n}\n\n.top-confirm-dialog__confirm--danger:focus {\n box-shadow: 0 0 0 0.2rem var(--top-confirm-dialog-accent) !important;\n}\n</style>\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=\"text-xs font-bold text-secondary-800 dark:text-zinc-200\"\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 h-[40px] w-full rounded-[10px] border border-secondary-600 px-3 py-2 text-xs text-secondary-900 enabled:hover:border-secondary-700 read-only:cursor-default read-only:bg-secondary-50 disabled:cursor-not-allowed dark:border-zinc-600 dark:bg-zinc-800 dark:text-zinc-100 dark:placeholder:text-zinc-400 dark:enabled:hover:border-zinc-500 dark:read-only:bg-zinc-800\"\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=\"text-xs font-bold text-secondary-800 dark:text-zinc-200\"\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 h-[40px] w-full rounded-[10px] border border-secondary-600 px-3 py-2 text-xs text-secondary-900 enabled:hover:border-secondary-700 read-only:cursor-default read-only:bg-secondary-50 disabled:cursor-not-allowed dark:border-zinc-600 dark:bg-zinc-800 dark:text-zinc-100 dark:placeholder:text-zinc-400 dark:enabled:hover:border-zinc-500 dark:read-only:bg-zinc-800\"\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, 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=\"pointer-events-none absolute left-3 top-2 iconetop z-10 text-primary-800 dark:text-primary-500\">\r\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: 'w-full h-auto text-xs dark:text-zinc-100 border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:!bg-zinc-800',\r\n },\r\n },\r\n input: { class: ['w-full h-auto text-xs dark:text-zinc-100', multiple ? 'border-0 bg-transparent py-1 !shadow-none outline-none ring-0 dark:!bg-transparent' : 'border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:!bg-zinc-600'].join(' ') },\r\n inputMultiple: { class: ['rounded-[10px] pl-9 min-h-[40px] dark:border-zinc-600 dark:text-zinc-100', disabled ? 'dark:!bg-zinc-700 dark:!text-zinc-400' : 'dark:!bg-zinc-800'].join(' ') },\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\"> - </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=\"pointer-events-none absolute left-3 top-2 iconetop z-10 text-primary-800 dark:text-primary-500\">\r\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: 'w-full h-auto text-xs dark:text-zinc-100 border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:!bg-zinc-800',\r\n },\r\n },\r\n input: { class: ['w-full h-auto text-xs dark:text-zinc-100', multiple ? 'border-0 bg-transparent py-1 !shadow-none outline-none ring-0 dark:!bg-transparent' : 'border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:!bg-zinc-600'].join(' ') },\r\n inputMultiple: { class: ['rounded-[10px] pl-9 min-h-[40px] dark:border-zinc-600 dark:text-zinc-100', disabled ? 'dark:!bg-zinc-700 dark:!text-zinc-400' : 'dark:!bg-zinc-800'].join(' ') },\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\"> - </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 Toast from 'primevue/toast'\r\nimport type { ToastMessageOptions } from 'primevue/toast'\r\n\r\nexport type TopToastFooter = string | number\r\n\r\nexport type TopToastAction = {\r\n label: string\r\n icon?: string\r\n onClick?: () => void\r\n}\r\n\r\nexport type TopToastData = {\r\n footer?: TopToastFooter\r\n action?: TopToastAction\r\n}\r\n\r\ntype TopToastMessage = ToastMessageOptions & {\r\n data?: TopToastData\r\n}\r\n\r\nwithDefaults(\r\n defineProps<{\r\n baseZIndex?: number\r\n }>(),\r\n {\r\n baseZIndex: 30000,\r\n },\r\n)\r\n\r\nfunction footerOf(message: TopToastMessage): TopToastFooter | undefined {\r\n return message.data?.footer\r\n}\r\n\r\nfunction actionOf(message: TopToastMessage) {\r\n return message.data?.action\r\n}\r\n\r\nfunction runAction(message: TopToastMessage) {\r\n actionOf(message)?.onClick?.()\r\n}\r\n\r\nfunction hasFooter(message: TopToastMessage) {\r\n return footerOf(message) !== undefined\r\n}\r\n\r\nfunction hasAction(message: TopToastMessage) {\r\n return Boolean(actionOf(message))\r\n}\r\n\r\nfunction severityClass(message: TopToastMessage, element: 'summary' | 'detail' | 'action') {\r\n const severity = message.severity ?? 'info'\r\n return `top-toast__${element}--${severity}`\r\n}\r\n</script>\r\n\r\n<template>\r\n <Toast position=\"top-right\" :base-z-index=\"baseZIndex\">\r\n <template #message=\"slotProps\">\r\n <div class=\"top-toast__content\">\r\n <div :class=\"['top-toast__summary', severityClass(slotProps.message, 'summary')]\">{{ slotProps.message.summary }}</div>\r\n <div class=\"top-toast__detail\">{{ slotProps.message.detail }}</div>\r\n <slot\r\n v-if=\"hasAction(slotProps.message)\"\r\n name=\"action\"\r\n :action=\"actionOf(slotProps.message)\"\r\n :message=\"slotProps.message\"\r\n :run=\"() => runAction(slotProps.message)\"\r\n >\r\n <button\r\n v-if=\"actionOf(slotProps.message)\"\r\n :class=\"['top-toast__action', severityClass(slotProps.message, 'action')]\"\r\n type=\"button\"\r\n @click=\"runAction(slotProps.message)\"\r\n >\r\n <i v-if=\"actionOf(slotProps.message)?.icon\" :class=\"actionOf(slotProps.message)?.icon\" aria-hidden=\"true\" />\r\n {{ actionOf(slotProps.message)?.label }}\r\n </button>\r\n </slot>\r\n <slot\r\n v-if=\"hasFooter(slotProps.message)\"\r\n name=\"footer\"\r\n :message=\"slotProps.message\"\r\n :footer=\"footerOf(slotProps.message)\"\r\n >\r\n <div v-if=\"footerOf(slotProps.message) !== undefined\" class=\"top-toast__footer\">\r\n {{ footerOf(slotProps.message) }}\r\n </div>\r\n </slot>\r\n </div>\r\n </template>\r\n </Toast>\r\n\r\n</template>\r\n\r\n<style>\r\n.top-toast__content { display: flex; width: 100%; flex-direction: column; gap: .5rem; }\r\n.top-toast__summary { font-weight: 600; }\r\n.top-toast__detail { font-size: .875rem; }\r\n.top-toast__footer { margin-top: .25rem; border-top: 1px solid #9ca3af; padding-top: .5rem; color: #6b7280; font-size: .75rem; }\r\n.top-toast__action { display: inline-flex; align-items: center; align-self: flex-start; gap: .5rem; border: 0; border-radius: 10px; padding: .25rem .75rem; color: #fff; font-size: .875rem; cursor: pointer; }\r\n.top-toast__summary--success, .top-toast__detail--success { color: #047857; }\r\n.top-toast__summary--error, .top-toast__detail--error { color: #dc2626; }\r\n.top-toast__summary--warn, .top-toast__detail--warn { color: #b45309; }\r\n.top-toast__summary--info, .top-toast__detail--info { color: #036da3; }\r\n.top-toast__summary--secondary, .top-toast__detail--secondary { color: #52525b; }\r\n.top-toast__summary--contrast, .top-toast__detail--contrast { color: #18181b; }\r\n.top-toast__action--success { background: #059669; }\r\n.top-toast__action--success:hover { background: #047857; }\r\n.top-toast__action--error { background: #dc2626; }\r\n.top-toast__action--error:hover { background: #b91c1c; }\r\n.top-toast__action--warn { background: #d97706; }\r\n.top-toast__action--warn:hover { background: #b45309; }\r\n.top-toast__action--info { background: #036da3; }\r\n.top-toast__action--info:hover { background: #02466b; }\r\n.top-toast__action--secondary { background: #52525b; }\r\n.top-toast__action--secondary:hover { background: #3f3f46; }\r\n.top-toast__action--contrast { background: #18181b; }\r\n.top-toast__action--contrast:hover { background: #000; }\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport Toast from 'primevue/toast'\r\nimport type { ToastMessageOptions } from 'primevue/toast'\r\n\r\nexport type TopToastFooter = string | number\r\n\r\nexport type TopToastAction = {\r\n label: string\r\n icon?: string\r\n onClick?: () => void\r\n}\r\n\r\nexport type TopToastData = {\r\n footer?: TopToastFooter\r\n action?: TopToastAction\r\n}\r\n\r\ntype TopToastMessage = ToastMessageOptions & {\r\n data?: TopToastData\r\n}\r\n\r\nwithDefaults(\r\n defineProps<{\r\n baseZIndex?: number\r\n }>(),\r\n {\r\n baseZIndex: 30000,\r\n },\r\n)\r\n\r\nfunction footerOf(message: TopToastMessage): TopToastFooter | undefined {\r\n return message.data?.footer\r\n}\r\n\r\nfunction actionOf(message: TopToastMessage) {\r\n return message.data?.action\r\n}\r\n\r\nfunction runAction(message: TopToastMessage) {\r\n actionOf(message)?.onClick?.()\r\n}\r\n\r\nfunction hasFooter(message: TopToastMessage) {\r\n return footerOf(message) !== undefined\r\n}\r\n\r\nfunction hasAction(message: TopToastMessage) {\r\n return Boolean(actionOf(message))\r\n}\r\n\r\nfunction severityClass(message: TopToastMessage, element: 'summary' | 'detail' | 'action') {\r\n const severity = message.severity ?? 'info'\r\n return `top-toast__${element}--${severity}`\r\n}\r\n</script>\r\n\r\n<template>\r\n <Toast position=\"top-right\" :base-z-index=\"baseZIndex\">\r\n <template #message=\"slotProps\">\r\n <div class=\"top-toast__content\">\r\n <div :class=\"['top-toast__summary', severityClass(slotProps.message, 'summary')]\">{{ slotProps.message.summary }}</div>\r\n <div class=\"top-toast__detail\">{{ slotProps.message.detail }}</div>\r\n <slot\r\n v-if=\"hasAction(slotProps.message)\"\r\n name=\"action\"\r\n :action=\"actionOf(slotProps.message)\"\r\n :message=\"slotProps.message\"\r\n :run=\"() => runAction(slotProps.message)\"\r\n >\r\n <button\r\n v-if=\"actionOf(slotProps.message)\"\r\n :class=\"['top-toast__action', severityClass(slotProps.message, 'action')]\"\r\n type=\"button\"\r\n @click=\"runAction(slotProps.message)\"\r\n >\r\n <i v-if=\"actionOf(slotProps.message)?.icon\" :class=\"actionOf(slotProps.message)?.icon\" aria-hidden=\"true\" />\r\n {{ actionOf(slotProps.message)?.label }}\r\n </button>\r\n </slot>\r\n <slot\r\n v-if=\"hasFooter(slotProps.message)\"\r\n name=\"footer\"\r\n :message=\"slotProps.message\"\r\n :footer=\"footerOf(slotProps.message)\"\r\n >\r\n <div v-if=\"footerOf(slotProps.message) !== undefined\" class=\"top-toast__footer\">\r\n {{ footerOf(slotProps.message) }}\r\n </div>\r\n </slot>\r\n </div>\r\n </template>\r\n </Toast>\r\n\r\n</template>\r\n\r\n<style>\r\n.top-toast__content { display: flex; width: 100%; flex-direction: column; gap: .5rem; }\r\n.top-toast__summary { font-weight: 600; }\r\n.top-toast__detail { font-size: .875rem; }\r\n.top-toast__footer { margin-top: .25rem; border-top: 1px solid #9ca3af; padding-top: .5rem; color: #6b7280; font-size: .75rem; }\r\n.top-toast__action { display: inline-flex; align-items: center; align-self: flex-start; gap: .5rem; border: 0; border-radius: 10px; padding: .25rem .75rem; color: #fff; font-size: .875rem; cursor: pointer; }\r\n.top-toast__summary--success, .top-toast__detail--success { color: #047857; }\r\n.top-toast__summary--error, .top-toast__detail--error { color: #dc2626; }\r\n.top-toast__summary--warn, .top-toast__detail--warn { color: #b45309; }\r\n.top-toast__summary--info, .top-toast__detail--info { color: #036da3; }\r\n.top-toast__summary--secondary, .top-toast__detail--secondary { color: #52525b; }\r\n.top-toast__summary--contrast, .top-toast__detail--contrast { color: #18181b; }\r\n.top-toast__action--success { background: #059669; }\r\n.top-toast__action--success:hover { background: #047857; }\r\n.top-toast__action--error { background: #dc2626; }\r\n.top-toast__action--error:hover { background: #b91c1c; }\r\n.top-toast__action--warn { background: #d97706; }\r\n.top-toast__action--warn:hover { background: #b45309; }\r\n.top-toast__action--info { background: #036da3; }\r\n.top-toast__action--info:hover { background: #02466b; }\r\n.top-toast__action--secondary { background: #52525b; }\r\n.top-toast__action--secondary:hover { background: #3f3f46; }\r\n.top-toast__action--contrast { background: #18181b; }\r\n.top-toast__action--contrast:hover { background: #000; }\r\n</style>\r\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TopToast-Dol0Bagg.js","names":["$attrs"],"sources":["../src/components/TopButton.vue","../src/components/TopButton.vue","../src/tokens/colors.ts","../src/components/TopConfirmDialog.vue","../src/components/TopConfirmDialog.vue","../src/components/TopInputText.vue","../src/components/TopInputText.vue","../src/components/TopSelect.vue","../src/components/TopSelect.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'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\nconst slots = useSlots()\r\nconst outrosIcones = computed(() => Boolean(slots.icon))\r\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\r\n secondary?: boolean\r\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,\r\n secondary: false,\r\n disabled: false,\r\n unstyled: false,\r\n type: 'button',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n click: []\r\n}>()\r\n\r\nconst buttonClasses = computed(() => {\r\n const baseClasses = !props.unstyled\r\n ? props.secondary\r\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'\r\n : props.outlined\r\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'\r\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'\r\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 || secondary\"\r\n :severity=\"secondary ? 'secondary' : undefined\"\r\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'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\nconst slots = useSlots()\r\nconst outrosIcones = computed(() => Boolean(slots.icon))\r\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\r\n secondary?: boolean\r\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,\r\n secondary: false,\r\n disabled: false,\r\n unstyled: false,\r\n type: 'button',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n click: []\r\n}>()\r\n\r\nconst buttonClasses = computed(() => {\r\n const baseClasses = !props.unstyled\r\n ? props.secondary\r\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'\r\n : props.outlined\r\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'\r\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'\r\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 || secondary\"\r\n :severity=\"secondary ? 'secondary' : undefined\"\r\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' ? 'top-confirm-dialog__confirm--danger' : '',\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</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' ? 'top-confirm-dialog__confirm--danger' : '',\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</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=\"text-xs font-bold text-secondary-800 dark:text-zinc-200\"\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 h-[40px] w-full rounded-[10px] border border-secondary-600 px-3 py-2 text-xs text-secondary-900 enabled:hover:border-secondary-700 read-only:cursor-default read-only:bg-secondary-50 disabled:cursor-not-allowed dark:border-zinc-600 dark:bg-zinc-800 dark:text-zinc-100 dark:placeholder:text-zinc-400 dark:enabled:hover:border-zinc-500 dark:read-only:bg-zinc-800\"\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=\"text-xs font-bold text-secondary-800 dark:text-zinc-200\"\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 h-[40px] w-full rounded-[10px] border border-secondary-600 px-3 py-2 text-xs text-secondary-900 enabled:hover:border-secondary-700 read-only:cursor-default read-only:bg-secondary-50 disabled:cursor-not-allowed dark:border-zinc-600 dark:bg-zinc-800 dark:text-zinc-100 dark:placeholder:text-zinc-400 dark:enabled:hover:border-zinc-500 dark:read-only:bg-zinc-800\"\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, 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=\"pointer-events-none absolute left-3 top-2 iconetop z-10 text-primary-800 dark:text-primary-500\">\r\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: 'w-full h-auto text-xs dark:text-zinc-100 border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:!bg-zinc-800',\r\n },\r\n },\r\n input: { class: ['w-full h-auto text-xs dark:text-zinc-100', multiple ? 'border-0 bg-transparent py-1 !shadow-none outline-none ring-0 dark:!bg-transparent' : 'border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:!bg-zinc-600'].join(' ') },\r\n inputMultiple: { class: ['rounded-[10px] pl-9 min-h-[40px] dark:border-zinc-600 dark:text-zinc-100', disabled ? 'dark:!bg-zinc-700 dark:!text-zinc-400' : 'dark:!bg-zinc-800'].join(' ') },\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\"> - </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=\"pointer-events-none absolute left-3 top-2 iconetop z-10 text-primary-800 dark:text-primary-500\">\r\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: 'w-full h-auto text-xs dark:text-zinc-100 border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:!bg-zinc-800',\r\n },\r\n },\r\n input: { class: ['w-full h-auto text-xs dark:text-zinc-100', multiple ? 'border-0 bg-transparent py-1 !shadow-none outline-none ring-0 dark:!bg-transparent' : 'border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:!bg-zinc-600'].join(' ') },\r\n inputMultiple: { class: ['rounded-[10px] pl-9 min-h-[40px] dark:border-zinc-600 dark:text-zinc-100', disabled ? 'dark:!bg-zinc-700 dark:!text-zinc-400' : 'dark:!bg-zinc-800'].join(' ') },\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\"> - </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 Toast from 'primevue/toast'\r\nimport type { ToastMessageOptions } from 'primevue/toast'\r\n\r\nexport type TopToastFooter = string | number\r\n\r\nexport type TopToastAction = {\r\n label: string\r\n icon?: string\r\n onClick?: () => void\r\n}\r\n\r\nexport type TopToastData = {\r\n footer?: TopToastFooter\r\n action?: TopToastAction\r\n}\r\n\r\ntype TopToastMessage = ToastMessageOptions & {\r\n data?: TopToastData\r\n}\r\n\r\nwithDefaults(\r\n defineProps<{\r\n baseZIndex?: number\r\n }>(),\r\n {\r\n baseZIndex: 30000,\r\n },\r\n)\r\n\r\nfunction footerOf(message: TopToastMessage): TopToastFooter | undefined {\r\n return message.data?.footer\r\n}\r\n\r\nfunction actionOf(message: TopToastMessage) {\r\n return message.data?.action\r\n}\r\n\r\nfunction runAction(message: TopToastMessage) {\r\n actionOf(message)?.onClick?.()\r\n}\r\n\r\nfunction hasFooter(message: TopToastMessage) {\r\n return footerOf(message) !== undefined\r\n}\r\n\r\nfunction hasAction(message: TopToastMessage) {\r\n return Boolean(actionOf(message))\r\n}\r\n\r\nfunction severityClass(message: TopToastMessage, element: 'summary' | 'detail' | 'action') {\r\n const severity = message.severity ?? 'info'\r\n return `top-toast__${element}--${severity}`\r\n}\r\n</script>\r\n\r\n<template>\r\n <Toast position=\"top-right\" :base-z-index=\"baseZIndex\">\r\n <template #message=\"slotProps\">\r\n <div class=\"top-toast__content\">\r\n <div :class=\"['top-toast__summary', severityClass(slotProps.message, 'summary')]\">{{ slotProps.message.summary }}</div>\r\n <div class=\"top-toast__detail\">{{ slotProps.message.detail }}</div>\r\n <slot\r\n v-if=\"hasAction(slotProps.message)\"\r\n name=\"action\"\r\n :action=\"actionOf(slotProps.message)\"\r\n :message=\"slotProps.message\"\r\n :run=\"() => runAction(slotProps.message)\"\r\n >\r\n <button\r\n v-if=\"actionOf(slotProps.message)\"\r\n :class=\"['top-toast__action', severityClass(slotProps.message, 'action')]\"\r\n type=\"button\"\r\n @click=\"runAction(slotProps.message)\"\r\n >\r\n <i v-if=\"actionOf(slotProps.message)?.icon\" :class=\"actionOf(slotProps.message)?.icon\" aria-hidden=\"true\" />\r\n {{ actionOf(slotProps.message)?.label }}\r\n </button>\r\n </slot>\r\n <slot\r\n v-if=\"hasFooter(slotProps.message)\"\r\n name=\"footer\"\r\n :message=\"slotProps.message\"\r\n :footer=\"footerOf(slotProps.message)\"\r\n >\r\n <div v-if=\"footerOf(slotProps.message) !== undefined\" class=\"top-toast__footer\">\r\n {{ footerOf(slotProps.message) }}\r\n </div>\r\n </slot>\r\n </div>\r\n </template>\r\n </Toast>\r\n\r\n</template>\r\n\r\n<style>\r\n.top-toast__content { display: flex; width: 100%; flex-direction: column; gap: .5rem; }\r\n.top-toast__summary { font-weight: 600; }\r\n.top-toast__detail { font-size: .875rem; }\r\n.top-toast__footer { margin-top: .25rem; border-top: 1px solid #9ca3af; padding-top: .5rem; color: #6b7280; font-size: .75rem; }\r\n.top-toast__action { display: inline-flex; align-items: center; align-self: flex-start; gap: .5rem; border: 0; border-radius: 10px; padding: .25rem .75rem; color: #fff; font-size: .875rem; cursor: pointer; }\r\n.top-toast__summary--success, .top-toast__detail--success { color: #047857; }\r\n.top-toast__summary--error, .top-toast__detail--error { color: #dc2626; }\r\n.top-toast__summary--warn, .top-toast__detail--warn { color: #b45309; }\r\n.top-toast__summary--info, .top-toast__detail--info { color: #036da3; }\r\n.top-toast__summary--secondary, .top-toast__detail--secondary { color: #52525b; }\r\n.top-toast__summary--contrast, .top-toast__detail--contrast { color: #18181b; }\r\n.top-toast__action--success { background: #059669; }\r\n.top-toast__action--success:hover { background: #047857; }\r\n.top-toast__action--error { background: #dc2626; }\r\n.top-toast__action--error:hover { background: #b91c1c; }\r\n.top-toast__action--warn { background: #d97706; }\r\n.top-toast__action--warn:hover { background: #b45309; }\r\n.top-toast__action--info { background: #036da3; }\r\n.top-toast__action--info:hover { background: #02466b; }\r\n.top-toast__action--secondary { background: #52525b; }\r\n.top-toast__action--secondary:hover { background: #3f3f46; }\r\n.top-toast__action--contrast { background: #18181b; }\r\n.top-toast__action--contrast:hover { background: #000; }\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport Toast from 'primevue/toast'\r\nimport type { ToastMessageOptions } from 'primevue/toast'\r\n\r\nexport type TopToastFooter = string | number\r\n\r\nexport type TopToastAction = {\r\n label: string\r\n icon?: string\r\n onClick?: () => void\r\n}\r\n\r\nexport type TopToastData = {\r\n footer?: TopToastFooter\r\n action?: TopToastAction\r\n}\r\n\r\ntype TopToastMessage = ToastMessageOptions & {\r\n data?: TopToastData\r\n}\r\n\r\nwithDefaults(\r\n defineProps<{\r\n baseZIndex?: number\r\n }>(),\r\n {\r\n baseZIndex: 30000,\r\n },\r\n)\r\n\r\nfunction footerOf(message: TopToastMessage): TopToastFooter | undefined {\r\n return message.data?.footer\r\n}\r\n\r\nfunction actionOf(message: TopToastMessage) {\r\n return message.data?.action\r\n}\r\n\r\nfunction runAction(message: TopToastMessage) {\r\n actionOf(message)?.onClick?.()\r\n}\r\n\r\nfunction hasFooter(message: TopToastMessage) {\r\n return footerOf(message) !== undefined\r\n}\r\n\r\nfunction hasAction(message: TopToastMessage) {\r\n return Boolean(actionOf(message))\r\n}\r\n\r\nfunction severityClass(message: TopToastMessage, element: 'summary' | 'detail' | 'action') {\r\n const severity = message.severity ?? 'info'\r\n return `top-toast__${element}--${severity}`\r\n}\r\n</script>\r\n\r\n<template>\r\n <Toast position=\"top-right\" :base-z-index=\"baseZIndex\">\r\n <template #message=\"slotProps\">\r\n <div class=\"top-toast__content\">\r\n <div :class=\"['top-toast__summary', severityClass(slotProps.message, 'summary')]\">{{ slotProps.message.summary }}</div>\r\n <div class=\"top-toast__detail\">{{ slotProps.message.detail }}</div>\r\n <slot\r\n v-if=\"hasAction(slotProps.message)\"\r\n name=\"action\"\r\n :action=\"actionOf(slotProps.message)\"\r\n :message=\"slotProps.message\"\r\n :run=\"() => runAction(slotProps.message)\"\r\n >\r\n <button\r\n v-if=\"actionOf(slotProps.message)\"\r\n :class=\"['top-toast__action', severityClass(slotProps.message, 'action')]\"\r\n type=\"button\"\r\n @click=\"runAction(slotProps.message)\"\r\n >\r\n <i v-if=\"actionOf(slotProps.message)?.icon\" :class=\"actionOf(slotProps.message)?.icon\" aria-hidden=\"true\" />\r\n {{ actionOf(slotProps.message)?.label }}\r\n </button>\r\n </slot>\r\n <slot\r\n v-if=\"hasFooter(slotProps.message)\"\r\n name=\"footer\"\r\n :message=\"slotProps.message\"\r\n :footer=\"footerOf(slotProps.message)\"\r\n >\r\n <div v-if=\"footerOf(slotProps.message) !== undefined\" class=\"top-toast__footer\">\r\n {{ footerOf(slotProps.message) }}\r\n </div>\r\n </slot>\r\n </div>\r\n </template>\r\n </Toast>\r\n\r\n</template>\r\n\r\n<style>\r\n.top-toast__content { display: flex; width: 100%; flex-direction: column; gap: .5rem; }\r\n.top-toast__summary { font-weight: 600; }\r\n.top-toast__detail { font-size: .875rem; }\r\n.top-toast__footer { margin-top: .25rem; border-top: 1px solid #9ca3af; padding-top: .5rem; color: #6b7280; font-size: .75rem; }\r\n.top-toast__action { display: inline-flex; align-items: center; align-self: flex-start; gap: .5rem; border: 0; border-radius: 10px; padding: .25rem .75rem; color: #fff; font-size: .875rem; cursor: pointer; }\r\n.top-toast__summary--success, .top-toast__detail--success { color: #047857; }\r\n.top-toast__summary--error, .top-toast__detail--error { color: #dc2626; }\r\n.top-toast__summary--warn, .top-toast__detail--warn { color: #b45309; }\r\n.top-toast__summary--info, .top-toast__detail--info { color: #036da3; }\r\n.top-toast__summary--secondary, .top-toast__detail--secondary { color: #52525b; }\r\n.top-toast__summary--contrast, .top-toast__detail--contrast { color: #18181b; }\r\n.top-toast__action--success { background: #059669; }\r\n.top-toast__action--success:hover { background: #047857; }\r\n.top-toast__action--error { background: #dc2626; }\r\n.top-toast__action--error:hover { background: #b91c1c; }\r\n.top-toast__action--warn { background: #d97706; }\r\n.top-toast__action--warn:hover { background: #b45309; }\r\n.top-toast__action--info { background: #036da3; }\r\n.top-toast__action--info:hover { background: #02466b; }\r\n.top-toast__action--secondary { background: #52525b; }\r\n.top-toast__action--secondary:hover { background: #3f3f46; }\r\n.top-toast__action--contrast { background: #18181b; }\r\n.top-toast__action--contrast:hover { background: #000; }\r\n</style>\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TopToast-Dol0Bagg.js","names":["$attrs"],"sources":["../src/components/TopButton.vue","../src/components/TopButton.vue","../src/tokens/colors.ts","../src/components/TopConfirmDialog.vue","../src/components/TopConfirmDialog.vue","../src/components/TopInputText.vue","../src/components/TopInputText.vue","../src/components/TopSelect.vue","../src/components/TopSelect.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'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\nconst slots = useSlots()\r\nconst outrosIcones = computed(() => Boolean(slots.icon))\r\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\r\n secondary?: boolean\r\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,\r\n secondary: false,\r\n disabled: false,\r\n unstyled: false,\r\n type: 'button',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n click: []\r\n}>()\r\n\r\nconst buttonClasses = computed(() => {\r\n const baseClasses = !props.unstyled\r\n ? props.secondary\r\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'\r\n : props.outlined\r\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'\r\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'\r\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 || secondary\"\r\n :severity=\"secondary ? 'secondary' : undefined\"\r\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'\r\nimport { twMerge } from 'tailwind-merge'\r\n\r\nconst slots = useSlots()\r\nconst outrosIcones = computed(() => Boolean(slots.icon))\r\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\r\n secondary?: boolean\r\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,\r\n secondary: false,\r\n disabled: false,\r\n unstyled: false,\r\n type: 'button',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n click: []\r\n}>()\r\n\r\nconst buttonClasses = computed(() => {\r\n const baseClasses = !props.unstyled\r\n ? props.secondary\r\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'\r\n : props.outlined\r\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'\r\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'\r\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 || secondary\"\r\n :severity=\"secondary ? 'secondary' : undefined\"\r\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' ? 'top-confirm-dialog__confirm--danger' : '',\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 {\n border-color: var(--top-confirm-dialog-accent-hover) !important;\n background-color: var(--top-confirm-dialog-accent-hover) !important;\n}\n\n.top-confirm-dialog__confirm--danger:focus {\n box-shadow: 0 0 0 0.2rem var(--top-confirm-dialog-accent) !important;\n}\n</style>\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' ? 'top-confirm-dialog__confirm--danger' : '',\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 {\n border-color: var(--top-confirm-dialog-accent-hover) !important;\n background-color: var(--top-confirm-dialog-accent-hover) !important;\n}\n\n.top-confirm-dialog__confirm--danger:focus {\n box-shadow: 0 0 0 0.2rem var(--top-confirm-dialog-accent) !important;\n}\n</style>\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=\"text-xs font-bold text-secondary-800 dark:text-zinc-200\"\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 h-[40px] w-full rounded-[10px] border border-secondary-600 px-3 py-2 text-xs text-secondary-900 enabled:hover:border-secondary-700 read-only:cursor-default read-only:bg-secondary-50 disabled:cursor-not-allowed dark:border-zinc-600 dark:bg-zinc-800 dark:text-zinc-100 dark:placeholder:text-zinc-400 dark:enabled:hover:border-zinc-500 dark:read-only:bg-zinc-800\"\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=\"text-xs font-bold text-secondary-800 dark:text-zinc-200\"\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 h-[40px] w-full rounded-[10px] border border-secondary-600 px-3 py-2 text-xs text-secondary-900 enabled:hover:border-secondary-700 read-only:cursor-default read-only:bg-secondary-50 disabled:cursor-not-allowed dark:border-zinc-600 dark:bg-zinc-800 dark:text-zinc-100 dark:placeholder:text-zinc-400 dark:enabled:hover:border-zinc-500 dark:read-only:bg-zinc-800\"\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, 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=\"pointer-events-none absolute left-3 top-2 iconetop z-10 text-primary-800 dark:text-primary-500\">\r\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: 'w-full h-auto text-xs dark:text-zinc-100 border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:!bg-zinc-800',\r\n },\r\n },\r\n input: { class: ['w-full h-auto text-xs dark:text-zinc-100', multiple ? 'border-0 bg-transparent py-1 !shadow-none outline-none ring-0 dark:!bg-transparent' : 'border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:!bg-zinc-600'].join(' ') },\r\n inputMultiple: { class: ['rounded-[10px] pl-9 min-h-[40px] dark:border-zinc-600 dark:text-zinc-100', disabled ? 'dark:!bg-zinc-700 dark:!text-zinc-400' : 'dark:!bg-zinc-800'].join(' ') },\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\"> - </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=\"pointer-events-none absolute left-3 top-2 iconetop z-10 text-primary-800 dark:text-primary-500\">\r\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: 'w-full h-auto text-xs dark:text-zinc-100 border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:!bg-zinc-800',\r\n },\r\n },\r\n input: { class: ['w-full h-auto text-xs dark:text-zinc-100', multiple ? 'border-0 bg-transparent py-1 !shadow-none outline-none ring-0 dark:!bg-transparent' : 'border border-secondary-600 rounded-[10px] !pl-9 min-h-[36px] dark:border-zinc-600 dark:!bg-zinc-600'].join(' ') },\r\n inputMultiple: { class: ['rounded-[10px] pl-9 min-h-[40px] dark:border-zinc-600 dark:text-zinc-100', disabled ? 'dark:!bg-zinc-700 dark:!text-zinc-400' : 'dark:!bg-zinc-800'].join(' ') },\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\"> - </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 Toast from 'primevue/toast'\r\nimport type { ToastMessageOptions } from 'primevue/toast'\r\n\r\nexport type TopToastFooter = string | number\r\n\r\nexport type TopToastAction = {\r\n label: string\r\n icon?: string\r\n onClick?: () => void\r\n}\r\n\r\nexport type TopToastData = {\r\n footer?: TopToastFooter\r\n action?: TopToastAction\r\n}\r\n\r\ntype TopToastMessage = ToastMessageOptions & {\r\n data?: TopToastData\r\n}\r\n\r\nwithDefaults(\r\n defineProps<{\r\n baseZIndex?: number\r\n }>(),\r\n {\r\n baseZIndex: 30000,\r\n },\r\n)\r\n\r\nfunction footerOf(message: TopToastMessage): TopToastFooter | undefined {\r\n return message.data?.footer\r\n}\r\n\r\nfunction actionOf(message: TopToastMessage) {\r\n return message.data?.action\r\n}\r\n\r\nfunction runAction(message: TopToastMessage) {\r\n actionOf(message)?.onClick?.()\r\n}\r\n\r\nfunction hasFooter(message: TopToastMessage) {\r\n return footerOf(message) !== undefined\r\n}\r\n\r\nfunction hasAction(message: TopToastMessage) {\r\n return Boolean(actionOf(message))\r\n}\r\n\r\nfunction severityClass(message: TopToastMessage, element: 'summary' | 'detail' | 'action') {\r\n const severity = message.severity ?? 'info'\r\n return `top-toast__${element}--${severity}`\r\n}\r\n</script>\r\n\r\n<template>\r\n <Toast position=\"top-right\" :base-z-index=\"baseZIndex\">\r\n <template #message=\"slotProps\">\r\n <div class=\"top-toast__content\">\r\n <div :class=\"['top-toast__summary', severityClass(slotProps.message, 'summary')]\">{{ slotProps.message.summary }}</div>\r\n <div class=\"top-toast__detail\">{{ slotProps.message.detail }}</div>\r\n <slot\r\n v-if=\"hasAction(slotProps.message)\"\r\n name=\"action\"\r\n :action=\"actionOf(slotProps.message)\"\r\n :message=\"slotProps.message\"\r\n :run=\"() => runAction(slotProps.message)\"\r\n >\r\n <button\r\n v-if=\"actionOf(slotProps.message)\"\r\n :class=\"['top-toast__action', severityClass(slotProps.message, 'action')]\"\r\n type=\"button\"\r\n @click=\"runAction(slotProps.message)\"\r\n >\r\n <i v-if=\"actionOf(slotProps.message)?.icon\" :class=\"actionOf(slotProps.message)?.icon\" aria-hidden=\"true\" />\r\n {{ actionOf(slotProps.message)?.label }}\r\n </button>\r\n </slot>\r\n <slot\r\n v-if=\"hasFooter(slotProps.message)\"\r\n name=\"footer\"\r\n :message=\"slotProps.message\"\r\n :footer=\"footerOf(slotProps.message)\"\r\n >\r\n <div v-if=\"footerOf(slotProps.message) !== undefined\" class=\"top-toast__footer\">\r\n {{ footerOf(slotProps.message) }}\r\n </div>\r\n </slot>\r\n </div>\r\n </template>\r\n </Toast>\r\n\r\n</template>\r\n\r\n<style>\r\n.top-toast__content { display: flex; width: 100%; flex-direction: column; gap: .5rem; }\r\n.top-toast__summary { font-weight: 600; }\r\n.top-toast__detail { font-size: .875rem; }\r\n.top-toast__footer { margin-top: .25rem; border-top: 1px solid #9ca3af; padding-top: .5rem; color: #6b7280; font-size: .75rem; }\r\n.top-toast__action { display: inline-flex; align-items: center; align-self: flex-start; gap: .5rem; border: 0; border-radius: 10px; padding: .25rem .75rem; color: #fff; font-size: .875rem; cursor: pointer; }\r\n.top-toast__summary--success, .top-toast__detail--success { color: #047857; }\r\n.top-toast__summary--error, .top-toast__detail--error { color: #dc2626; }\r\n.top-toast__summary--warn, .top-toast__detail--warn { color: #b45309; }\r\n.top-toast__summary--info, .top-toast__detail--info { color: #036da3; }\r\n.top-toast__summary--secondary, .top-toast__detail--secondary { color: #52525b; }\r\n.top-toast__summary--contrast, .top-toast__detail--contrast { color: #18181b; }\r\n.top-toast__action--success { background: #059669; }\r\n.top-toast__action--success:hover { background: #047857; }\r\n.top-toast__action--error { background: #dc2626; }\r\n.top-toast__action--error:hover { background: #b91c1c; }\r\n.top-toast__action--warn { background: #d97706; }\r\n.top-toast__action--warn:hover { background: #b45309; }\r\n.top-toast__action--info { background: #036da3; }\r\n.top-toast__action--info:hover { background: #02466b; }\r\n.top-toast__action--secondary { background: #52525b; }\r\n.top-toast__action--secondary:hover { background: #3f3f46; }\r\n.top-toast__action--contrast { background: #18181b; }\r\n.top-toast__action--contrast:hover { background: #000; }\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport Toast from 'primevue/toast'\r\nimport type { ToastMessageOptions } from 'primevue/toast'\r\n\r\nexport type TopToastFooter = string | number\r\n\r\nexport type TopToastAction = {\r\n label: string\r\n icon?: string\r\n onClick?: () => void\r\n}\r\n\r\nexport type TopToastData = {\r\n footer?: TopToastFooter\r\n action?: TopToastAction\r\n}\r\n\r\ntype TopToastMessage = ToastMessageOptions & {\r\n data?: TopToastData\r\n}\r\n\r\nwithDefaults(\r\n defineProps<{\r\n baseZIndex?: number\r\n }>(),\r\n {\r\n baseZIndex: 30000,\r\n },\r\n)\r\n\r\nfunction footerOf(message: TopToastMessage): TopToastFooter | undefined {\r\n return message.data?.footer\r\n}\r\n\r\nfunction actionOf(message: TopToastMessage) {\r\n return message.data?.action\r\n}\r\n\r\nfunction runAction(message: TopToastMessage) {\r\n actionOf(message)?.onClick?.()\r\n}\r\n\r\nfunction hasFooter(message: TopToastMessage) {\r\n return footerOf(message) !== undefined\r\n}\r\n\r\nfunction hasAction(message: TopToastMessage) {\r\n return Boolean(actionOf(message))\r\n}\r\n\r\nfunction severityClass(message: TopToastMessage, element: 'summary' | 'detail' | 'action') {\r\n const severity = message.severity ?? 'info'\r\n return `top-toast__${element}--${severity}`\r\n}\r\n</script>\r\n\r\n<template>\r\n <Toast position=\"top-right\" :base-z-index=\"baseZIndex\">\r\n <template #message=\"slotProps\">\r\n <div class=\"top-toast__content\">\r\n <div :class=\"['top-toast__summary', severityClass(slotProps.message, 'summary')]\">{{ slotProps.message.summary }}</div>\r\n <div class=\"top-toast__detail\">{{ slotProps.message.detail }}</div>\r\n <slot\r\n v-if=\"hasAction(slotProps.message)\"\r\n name=\"action\"\r\n :action=\"actionOf(slotProps.message)\"\r\n :message=\"slotProps.message\"\r\n :run=\"() => runAction(slotProps.message)\"\r\n >\r\n <button\r\n v-if=\"actionOf(slotProps.message)\"\r\n :class=\"['top-toast__action', severityClass(slotProps.message, 'action')]\"\r\n type=\"button\"\r\n @click=\"runAction(slotProps.message)\"\r\n >\r\n <i v-if=\"actionOf(slotProps.message)?.icon\" :class=\"actionOf(slotProps.message)?.icon\" aria-hidden=\"true\" />\r\n {{ actionOf(slotProps.message)?.label }}\r\n </button>\r\n </slot>\r\n <slot\r\n v-if=\"hasFooter(slotProps.message)\"\r\n name=\"footer\"\r\n :message=\"slotProps.message\"\r\n :footer=\"footerOf(slotProps.message)\"\r\n >\r\n <div v-if=\"footerOf(slotProps.message) !== undefined\" class=\"top-toast__footer\">\r\n {{ footerOf(slotProps.message) }}\r\n </div>\r\n </slot>\r\n </div>\r\n </template>\r\n </Toast>\r\n\r\n</template>\r\n\r\n<style>\r\n.top-toast__content { display: flex; width: 100%; flex-direction: column; gap: .5rem; }\r\n.top-toast__summary { font-weight: 600; }\r\n.top-toast__detail { font-size: .875rem; }\r\n.top-toast__footer { margin-top: .25rem; border-top: 1px solid #9ca3af; padding-top: .5rem; color: #6b7280; font-size: .75rem; }\r\n.top-toast__action { display: inline-flex; align-items: center; align-self: flex-start; gap: .5rem; border: 0; border-radius: 10px; padding: .25rem .75rem; color: #fff; font-size: .875rem; cursor: pointer; }\r\n.top-toast__summary--success, .top-toast__detail--success { color: #047857; }\r\n.top-toast__summary--error, .top-toast__detail--error { color: #dc2626; }\r\n.top-toast__summary--warn, .top-toast__detail--warn { color: #b45309; }\r\n.top-toast__summary--info, .top-toast__detail--info { color: #036da3; }\r\n.top-toast__summary--secondary, .top-toast__detail--secondary { color: #52525b; }\r\n.top-toast__summary--contrast, .top-toast__detail--contrast { color: #18181b; }\r\n.top-toast__action--success { background: #059669; }\r\n.top-toast__action--success:hover { background: #047857; }\r\n.top-toast__action--error { background: #dc2626; }\r\n.top-toast__action--error:hover { background: #b91c1c; }\r\n.top-toast__action--warn { background: #d97706; }\r\n.top-toast__action--warn:hover { background: #b45309; }\r\n.top-toast__action--info { background: #036da3; }\r\n.top-toast__action--info:hover { background: #02466b; }\r\n.top-toast__action--secondary { background: #52525b; }\r\n.top-toast__action--secondary:hover { background: #3f3f46; }\r\n.top-toast__action--contrast { background: #18181b; }\r\n.top-toast__action--contrast:hover { background: #000; }\r\n</style>\r\n"],"mappings":"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"}
|
package/dist/style.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
.top-button{background-color:#0000;border-radius:12px;width:fit-content;height:fit-content}.top-confirm-dialog{border-radius:10px;box-shadow:0 4px 4px #00000040}.top-confirm-dialog__icon{color:var(--top-confirm-dialog-accent)}.top-confirm-dialog__confirm--danger{border-color:var(--top-confirm-dialog-accent)!important;background-color:var(--top-confirm-dialog-accent)!important}.top-confirm-dialog__confirm--danger:hover{border-color:var(--top-confirm-dialog-accent-hover)!important;background-color:var(--top-confirm-dialog-accent-hover)!important}.top-select{width:100%;position:relative}.top-select .p-inputtext.p-component.p-inputtext-fluid.p-autocomplete-input{border-radius:10px 0 0 10px!important;padding-left:35px!important}.top-select .p-autocomplete-dropdown{border-radius:0 10px 10px 0!important}.top-select-option-prefix{color:var(--top-primary-800)!important}.dark .top-select-option-prefix{color:var(--top-primary-100)!important}.top-select-option-label{-webkit-line-clamp:2;line-clamp:2;overflow-wrap:anywhere;-webkit-box-orient:vertical;flex:1;min-width:0;display:-webkit-box;overflow:hidden}.top-select-panel,.top-select-panel .p-virtualscroller,.top-select-panel .p-autocomplete-list-container,.top-select-panel .p-autocomplete-list{overflow-x:hidden!important}.top-select-panel .p-autocomplete-option{max-width:100%}.top-toast__content{flex-direction:column;gap:.5rem;width:100%;display:flex}.top-toast__summary{font-weight:600}.top-toast__detail{font-size:.875rem}.top-toast__footer{color:#6b7280;border-top:1px solid #9ca3af;margin-top:.25rem;padding-top:.5rem;font-size:.75rem}.top-toast__action{color:#fff;cursor:pointer;border:0;border-radius:10px;align-self:flex-start;align-items:center;gap:.5rem;padding:.25rem .75rem;font-size:.875rem;display:inline-flex}.top-toast__summary--success,.top-toast__detail--success{color:#047857}.top-toast__summary--error,.top-toast__detail--error{color:#dc2626}.top-toast__summary--warn,.top-toast__detail--warn{color:#b45309}.top-toast__summary--info,.top-toast__detail--info{color:#036da3}.top-toast__summary--secondary,.top-toast__detail--secondary{color:#52525b}.top-toast__summary--contrast,.top-toast__detail--contrast{color:#18181b}.top-toast__action--success{background:#059669}.top-toast__action--success:hover{background:#047857}.top-toast__action--error{background:#dc2626}.top-toast__action--error:hover{background:#b91c1c}.top-toast__action--warn{background:#d97706}.top-toast__action--warn:hover{background:#b45309}.top-toast__action--info{background:#036da3}.top-toast__action--info:hover{background:#02466b}.top-toast__action--secondary{background:#52525b}.top-toast__action--secondary:hover{background:#3f3f46}.top-toast__action--contrast{background:#18181b}.top-toast__action--contrast:hover{background:#000}.top-solutions-component .pointer-events-none{pointer-events:none}.top-solutions-component .absolute{position:absolute}.top-solutions-component .relative{position:relative}.top-solutions-component .left-3{left:.75rem}.top-solutions-component .right-\[-0\.25rem\]{right:-.25rem}.top-solutions-component .top-2{top:.5rem}.top-solutions-component .top-\[-0\.5rem\]{top:-.5rem}.top-solutions-component .z-10{z-index:10}.top-solutions-component .my-1{margin-top:.25rem;margin-bottom:.25rem}.top-solutions-component .mt-2{margin-top:.5rem}.top-solutions-component .line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.top-solutions-component .line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.top-solutions-component .flex{display:flex}.top-solutions-component .hidden{display:none}.top-solutions-component .size-8{width:2rem;height:2rem}.top-solutions-component .h-3{height:.75rem}.top-solutions-component .h-\[40px\]{height:40px}.top-solutions-component .h-auto{height:auto}.top-solutions-component .h-fit{height:fit-content}.top-solutions-component .min-h-\[100px\]{min-height:100px}.top-solutions-component .min-h-\[36px\]{min-height:36px}.top-solutions-component .min-h-\[40px\]{min-height:40px}.top-solutions-component .min-h-\[84px\]{min-height:84px}.top-solutions-component .w-3{width:.75rem}.top-solutions-component .w-fit{width:fit-content}.top-solutions-component .w-full{width:100%}.top-solutions-component .min-w-0{min-width:0}.top-solutions-component .max-w-\[300px\]{max-width:300px}.top-solutions-component .max-w-\[85vw\]{max-width:85vw}.top-solutions-component .max-w-full{max-width:100%}.top-solutions-component .flex-1{flex:1}.top-solutions-component .shrink-0{flex-shrink:0}.top-solutions-component .cursor-pointer{cursor:pointer}.top-solutions-component .flex-col{flex-direction:column}.top-solutions-component .items-start{align-items:flex-start}.top-solutions-component .items-center{align-items:center}.top-solutions-component .justify-center{justify-content:center}.top-solutions-component .gap-1{gap:.25rem}.top-solutions-component .gap-2{gap:.5rem}.top-solutions-component .gap-3{gap:.75rem}.top-solutions-component .gap-4{gap:1rem}.top-solutions-component .overflow-hidden{overflow:hidden}.top-solutions-component .overflow-x-hidden{overflow-x:hidden}.top-solutions-component .text-ellipsis{text-overflow:ellipsis}.top-solutions-component .whitespace-nowrap{white-space:nowrap}.top-solutions-component .rounded-\[10px\]{border-radius:10px}.top-solutions-component .rounded-\[12px\]{border-radius:12px}.top-solutions-component .rounded-\[9px\]{border-radius:9px}.top-solutions-component .rounded-full{border-radius:9999px}.top-solutions-component .rounded-md{border-radius:.375rem}.top-solutions-component .rounded-sm{border-radius:.125rem}.top-solutions-component .border{border-width:1px}.top-solutions-component .border-0{border-width:0}.top-solutions-component .\!border-primary-900{border-color:var(--top-primary-900)!important}.top-solutions-component .border-primary-800{border-color:var(--top-primary-800)}.top-solutions-component .border-secondary-600{border-color:var(--top-secondary-600)}.top-solutions-component .bg-primary-100{background-color:var(--top-primary-100)}.top-solutions-component .bg-primary-200{background-color:var(--top-primary-200)}.top-solutions-component .bg-primary-500{background-color:var(--top-primary-500)}.top-solutions-component .bg-primary-900{background-color:var(--top-primary-900)}.top-solutions-component .bg-transparent{background-color:#0000}.top-solutions-component .p-0{padding:0}.top-solutions-component .p-6{padding:1.5rem}.top-solutions-component .px-2{padding-left:.5rem;padding-right:.5rem}.top-solutions-component .px-3{padding-left:.75rem;padding-right:.75rem}.top-solutions-component .py-0{padding-top:0;padding-bottom:0}.top-solutions-component .py-1{padding-top:.25rem;padding-bottom:.25rem}.top-solutions-component .py-2{padding-top:.5rem;padding-bottom:.5rem}.top-solutions-component .py-3{padding-top:.75rem;padding-bottom:.75rem}.top-solutions-component .\!pl-9{padding-left:2.25rem!important}.top-solutions-component .pl-9{padding-left:2.25rem}.top-solutions-component .pt-2{padding-top:.5rem}.top-solutions-component .text-center{text-align:center}.top-solutions-component .\!text-sm{font-size:.875rem!important;line-height:1.25rem!important}.top-solutions-component .\!text-xs{font-size:.75rem!important;line-height:1rem!important}.top-solutions-component .text-2xl{font-size:1.5rem;line-height:2rem}.top-solutions-component .text-\[11px\]{font-size:11px}.top-solutions-component .text-\[40px\]{font-size:40px}.top-solutions-component .text-base{font-size:1rem;line-height:1.5rem}.top-solutions-component .text-lg{font-size:1.125rem;line-height:1.75rem}.top-solutions-component .text-sm{font-size:.875rem;line-height:1.25rem}.top-solutions-component .text-xs{font-size:.75rem;line-height:1rem}.top-solutions-component .font-bold{font-weight:700}.top-solutions-component .font-medium{font-weight:500}.top-solutions-component .font-semibold{font-weight:600}.top-solutions-component .leading-5{line-height:1.25rem}.top-solutions-component .text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.top-solutions-component .text-primary-600{color:var(--top-primary-600)}.top-solutions-component .text-primary-800{color:var(--top-primary-800)}.top-solutions-component .text-primary-900{color:var(--top-primary-900)}.top-solutions-component .text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.top-solutions-component .text-secondary-500{color:var(--top-secondary-500)}.top-solutions-component .text-secondary-700{color:var(--top-secondary-700)}.top-solutions-component .text-secondary-800{color:var(--top-secondary-800)}.top-solutions-component .text-secondary-900{color:var(--top-secondary-900)}.top-solutions-component .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.top-solutions-component .\!shadow-none{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)!important}.top-solutions-component .shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.top-solutions-component .outline-none{outline-offset:2px;outline:2px solid #0000}.top-solutions-component .ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.top-solutions-component .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.top-solutions-component .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}:root{--top-primary-50:#eef9ff;--top-primary-100:#dff4ff;--top-primary-200:#c5e6f8;--top-primary-300:#8ec4df;--top-primary-400:#66acd1;--top-primary-500:#2488bc;--top-primary-600:#036da3;--top-primary-700:#1b5783;--top-primary-800:#02466b;--top-primary-900:#052f4a;--top-primary-950:#0c192d;--top-secondary-50:#fafafa;--top-secondary-100:#f4f4f5;--top-secondary-200:#e9e9e9;--top-secondary-300:#d8d8d8;--top-secondary-400:#b8b8b8;--top-secondary-500:#8e8e8e;--top-secondary-600:#676767;--top-secondary-700:#4b4b4b;--top-secondary-800:#343434;--top-secondary-900:#1c1917;--top-secondary-950:#0c0a09}.top-solutions-component .read-only\:cursor-default:read-only{cursor:default}.top-solutions-component .read-only\:bg-secondary-50:read-only{background-color:var(--top-secondary-50)}.top-solutions-component .hover\:\!border-primary-800:hover{border-color:var(--top-primary-800)!important}.top-solutions-component .hover\:bg-primary-50:hover{background-color:var(--top-primary-50)}.top-solutions-component .hover\:bg-primary-800:hover{background-color:var(--top-primary-800)}.top-solutions-component .hover\:bg-secondary-200:hover{background-color:var(--top-secondary-200)}.top-solutions-component .focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.top-solutions-component .focus-visible\:ring-primary-500:focus-visible{--tw-ring-color:var(--top-primary-500)}.top-solutions-component .focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.top-solutions-component .enabled\:hover\:border-secondary-700:hover:enabled{border-color:var(--top-secondary-700)}.top-solutions-component .disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.top-solutions-component .disabled\:opacity-50:disabled{opacity:.5}.top-solutions-component .dark\:\!border-primary-200:is(.dark *){border-color:var(--top-primary-200)!important}.top-solutions-component .dark\:\!border-zinc-500:is(.dark *){--tw-border-opacity:1!important;border-color:rgb(113 113 122/var(--tw-border-opacity,1))!important}.top-solutions-component .dark\:border-zinc-600:is(.dark *){--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity,1))}.top-solutions-component .dark\:\!bg-transparent:is(.dark *){background-color:#0000!important}.top-solutions-component .dark\:\!bg-zinc-600:is(.dark *){--tw-bg-opacity:1!important;background-color:rgb(82 82 91/var(--tw-bg-opacity,1))!important}.top-solutions-component .dark\:\!bg-zinc-700:is(.dark *){--tw-bg-opacity:1!important;background-color:rgb(63 63 70/var(--tw-bg-opacity,1))!important}.top-solutions-component .dark\:\!bg-zinc-800:is(.dark *){--tw-bg-opacity:1!important;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))!important}.top-solutions-component .dark\:bg-cyan-700:is(.dark *){--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity,1))}.top-solutions-component .dark\:bg-primary-900:is(.dark *){background-color:var(--top-primary-900)}.top-solutions-component .dark\:bg-zinc-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))}.top-solutions-component .dark\:\!text-primary-100:is(.dark *){color:var(--top-primary-100)!important}.top-solutions-component .dark\:\!text-white:is(.dark *){--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity,1))!important}.top-solutions-component .dark\:\!text-zinc-100:is(.dark *){--tw-text-opacity:1!important;color:rgb(244 244 245/var(--tw-text-opacity,1))!important}.top-solutions-component .dark\:\!text-zinc-400:is(.dark *){--tw-text-opacity:1!important;color:rgb(161 161 170/var(--tw-text-opacity,1))!important}.top-solutions-component .dark\:text-primary-100:is(.dark *){color:var(--top-primary-100)}.top-solutions-component .dark\:text-primary-500:is(.dark *){color:var(--top-primary-500)}.top-solutions-component .dark\:text-red-400:is(.dark *){--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.top-solutions-component .dark\:text-white:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.top-solutions-component .dark\:text-zinc-100:is(.dark *){--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity,1))}.top-solutions-component .dark\:text-zinc-200:is(.dark *){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity,1))}.top-solutions-component .dark\:text-zinc-300:is(.dark *){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity,1))}.top-solutions-component .dark\:text-zinc-400:is(.dark *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.top-solutions-component .dark\:placeholder\:text-zinc-400:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.top-solutions-component .dark\:placeholder\:text-zinc-400:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.top-solutions-component .dark\:-moz-read-only\:bg-zinc-800:-moz-read-only:is(.dark *){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))}.top-solutions-component .dark\:read-only\:bg-zinc-800:read-only:is(.dark *){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))}.top-solutions-component .dark\:hover\:\!bg-primary-900:hover:is(.dark *){background-color:var(--top-primary-900)!important}.top-solutions-component .dark\:hover\:\!bg-zinc-600:hover:is(.dark *){--tw-bg-opacity:1!important;background-color:rgb(82 82 91/var(--tw-bg-opacity,1))!important}.top-solutions-component .dark\:hover\:bg-zinc-700:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity,1))}.top-solutions-component .dark\:enabled\:hover\:border-zinc-500:hover:enabled:is(.dark *){--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity,1))}
|
|
1
|
+
.top-button{background-color:#0000;border-radius:12px;width:fit-content;height:fit-content}.top-confirm-dialog{border-radius:10px;box-shadow:0 4px 4px #00000040}.top-confirm-dialog__icon{color:var(--top-confirm-dialog-accent)}.top-confirm-dialog__confirm--danger{border-color:var(--top-confirm-dialog-accent)!important;background-color:var(--top-confirm-dialog-accent)!important}.top-confirm-dialog__confirm--danger:hover{border-color:var(--top-confirm-dialog-accent-hover)!important;background-color:var(--top-confirm-dialog-accent-hover)!important}.top-confirm-dialog__confirm--danger:focus{box-shadow:0 0 0 .2rem var(--top-confirm-dialog-accent)!important}.top-select{width:100%;position:relative}.top-select .p-inputtext.p-component.p-inputtext-fluid.p-autocomplete-input{border-radius:10px 0 0 10px!important;padding-left:35px!important}.top-select .p-autocomplete-dropdown{border-radius:0 10px 10px 0!important}.top-select-option-prefix{color:var(--top-primary-800)!important}.dark .top-select-option-prefix{color:var(--top-primary-100)!important}.top-select-option-label{-webkit-line-clamp:2;line-clamp:2;overflow-wrap:anywhere;-webkit-box-orient:vertical;flex:1;min-width:0;display:-webkit-box;overflow:hidden}.top-select-panel,.top-select-panel .p-virtualscroller,.top-select-panel .p-autocomplete-list-container,.top-select-panel .p-autocomplete-list{overflow-x:hidden!important}.top-select-panel .p-autocomplete-option{max-width:100%}.top-toast__content{flex-direction:column;gap:.5rem;width:100%;display:flex}.top-toast__summary{font-weight:600}.top-toast__detail{font-size:.875rem}.top-toast__footer{color:#6b7280;border-top:1px solid #9ca3af;margin-top:.25rem;padding-top:.5rem;font-size:.75rem}.top-toast__action{color:#fff;cursor:pointer;border:0;border-radius:10px;align-self:flex-start;align-items:center;gap:.5rem;padding:.25rem .75rem;font-size:.875rem;display:inline-flex}.top-toast__summary--success,.top-toast__detail--success{color:#047857}.top-toast__summary--error,.top-toast__detail--error{color:#dc2626}.top-toast__summary--warn,.top-toast__detail--warn{color:#b45309}.top-toast__summary--info,.top-toast__detail--info{color:#036da3}.top-toast__summary--secondary,.top-toast__detail--secondary{color:#52525b}.top-toast__summary--contrast,.top-toast__detail--contrast{color:#18181b}.top-toast__action--success{background:#059669}.top-toast__action--success:hover{background:#047857}.top-toast__action--error{background:#dc2626}.top-toast__action--error:hover{background:#b91c1c}.top-toast__action--warn{background:#d97706}.top-toast__action--warn:hover{background:#b45309}.top-toast__action--info{background:#036da3}.top-toast__action--info:hover{background:#02466b}.top-toast__action--secondary{background:#52525b}.top-toast__action--secondary:hover{background:#3f3f46}.top-toast__action--contrast{background:#18181b}.top-toast__action--contrast:hover{background:#000}.top-solutions-component .pointer-events-none{pointer-events:none}.top-solutions-component .absolute{position:absolute}.top-solutions-component .relative{position:relative}.top-solutions-component .left-3{left:.75rem}.top-solutions-component .right-\[-0\.25rem\]{right:-.25rem}.top-solutions-component .top-2{top:.5rem}.top-solutions-component .top-\[-0\.5rem\]{top:-.5rem}.top-solutions-component .z-10{z-index:10}.top-solutions-component .my-1{margin-top:.25rem;margin-bottom:.25rem}.top-solutions-component .mt-2{margin-top:.5rem}.top-solutions-component .line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.top-solutions-component .line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.top-solutions-component .flex{display:flex}.top-solutions-component .hidden{display:none}.top-solutions-component .size-8{width:2rem;height:2rem}.top-solutions-component .h-3{height:.75rem}.top-solutions-component .h-\[40px\]{height:40px}.top-solutions-component .h-auto{height:auto}.top-solutions-component .h-fit{height:fit-content}.top-solutions-component .min-h-\[100px\]{min-height:100px}.top-solutions-component .min-h-\[36px\]{min-height:36px}.top-solutions-component .min-h-\[40px\]{min-height:40px}.top-solutions-component .min-h-\[84px\]{min-height:84px}.top-solutions-component .w-3{width:.75rem}.top-solutions-component .w-fit{width:fit-content}.top-solutions-component .w-full{width:100%}.top-solutions-component .min-w-0{min-width:0}.top-solutions-component .max-w-\[300px\]{max-width:300px}.top-solutions-component .max-w-\[85vw\]{max-width:85vw}.top-solutions-component .max-w-full{max-width:100%}.top-solutions-component .flex-1{flex:1}.top-solutions-component .shrink-0{flex-shrink:0}.top-solutions-component .cursor-pointer{cursor:pointer}.top-solutions-component .flex-col{flex-direction:column}.top-solutions-component .items-start{align-items:flex-start}.top-solutions-component .items-center{align-items:center}.top-solutions-component .justify-center{justify-content:center}.top-solutions-component .gap-1{gap:.25rem}.top-solutions-component .gap-2{gap:.5rem}.top-solutions-component .gap-3{gap:.75rem}.top-solutions-component .gap-4{gap:1rem}.top-solutions-component .overflow-hidden{overflow:hidden}.top-solutions-component .overflow-x-hidden{overflow-x:hidden}.top-solutions-component .text-ellipsis{text-overflow:ellipsis}.top-solutions-component .whitespace-nowrap{white-space:nowrap}.top-solutions-component .rounded-\[10px\]{border-radius:10px}.top-solutions-component .rounded-\[12px\]{border-radius:12px}.top-solutions-component .rounded-\[9px\]{border-radius:9px}.top-solutions-component .rounded-full{border-radius:9999px}.top-solutions-component .rounded-md{border-radius:.375rem}.top-solutions-component .rounded-sm{border-radius:.125rem}.top-solutions-component .border{border-width:1px}.top-solutions-component .border-0{border-width:0}.top-solutions-component .\!border-primary-900{border-color:var(--top-primary-900)!important}.top-solutions-component .border-primary-800{border-color:var(--top-primary-800)}.top-solutions-component .border-secondary-600{border-color:var(--top-secondary-600)}.top-solutions-component .bg-primary-100{background-color:var(--top-primary-100)}.top-solutions-component .bg-primary-200{background-color:var(--top-primary-200)}.top-solutions-component .bg-primary-500{background-color:var(--top-primary-500)}.top-solutions-component .bg-primary-900{background-color:var(--top-primary-900)}.top-solutions-component .bg-transparent{background-color:#0000}.top-solutions-component .p-0{padding:0}.top-solutions-component .p-6{padding:1.5rem}.top-solutions-component .px-2{padding-left:.5rem;padding-right:.5rem}.top-solutions-component .px-3{padding-left:.75rem;padding-right:.75rem}.top-solutions-component .py-0{padding-top:0;padding-bottom:0}.top-solutions-component .py-1{padding-top:.25rem;padding-bottom:.25rem}.top-solutions-component .py-2{padding-top:.5rem;padding-bottom:.5rem}.top-solutions-component .py-3{padding-top:.75rem;padding-bottom:.75rem}.top-solutions-component .\!pl-9{padding-left:2.25rem!important}.top-solutions-component .pl-9{padding-left:2.25rem}.top-solutions-component .pt-2{padding-top:.5rem}.top-solutions-component .text-center{text-align:center}.top-solutions-component .\!text-sm{font-size:.875rem!important;line-height:1.25rem!important}.top-solutions-component .\!text-xs{font-size:.75rem!important;line-height:1rem!important}.top-solutions-component .text-2xl{font-size:1.5rem;line-height:2rem}.top-solutions-component .text-\[11px\]{font-size:11px}.top-solutions-component .text-\[40px\]{font-size:40px}.top-solutions-component .text-base{font-size:1rem;line-height:1.5rem}.top-solutions-component .text-lg{font-size:1.125rem;line-height:1.75rem}.top-solutions-component .text-sm{font-size:.875rem;line-height:1.25rem}.top-solutions-component .text-xs{font-size:.75rem;line-height:1rem}.top-solutions-component .font-bold{font-weight:700}.top-solutions-component .font-medium{font-weight:500}.top-solutions-component .font-semibold{font-weight:600}.top-solutions-component .leading-5{line-height:1.25rem}.top-solutions-component .text-black{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.top-solutions-component .text-primary-600{color:var(--top-primary-600)}.top-solutions-component .text-primary-800{color:var(--top-primary-800)}.top-solutions-component .text-primary-900{color:var(--top-primary-900)}.top-solutions-component .text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.top-solutions-component .text-secondary-500{color:var(--top-secondary-500)}.top-solutions-component .text-secondary-700{color:var(--top-secondary-700)}.top-solutions-component .text-secondary-800{color:var(--top-secondary-800)}.top-solutions-component .text-secondary-900{color:var(--top-secondary-900)}.top-solutions-component .text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.top-solutions-component .\!shadow-none{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)!important}.top-solutions-component .shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.top-solutions-component .outline-none{outline-offset:2px;outline:2px solid #0000}.top-solutions-component .ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.top-solutions-component .filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.top-solutions-component .transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}:root{--top-primary-50:#eef9ff;--top-primary-100:#dff4ff;--top-primary-200:#c5e6f8;--top-primary-300:#8ec4df;--top-primary-400:#66acd1;--top-primary-500:#2488bc;--top-primary-600:#036da3;--top-primary-700:#1b5783;--top-primary-800:#02466b;--top-primary-900:#052f4a;--top-primary-950:#0c192d;--top-secondary-50:#fafafa;--top-secondary-100:#f4f4f5;--top-secondary-200:#e9e9e9;--top-secondary-300:#d8d8d8;--top-secondary-400:#b8b8b8;--top-secondary-500:#8e8e8e;--top-secondary-600:#676767;--top-secondary-700:#4b4b4b;--top-secondary-800:#343434;--top-secondary-900:#1c1917;--top-secondary-950:#0c0a09}.top-solutions-component .read-only\:cursor-default:read-only{cursor:default}.top-solutions-component .read-only\:bg-secondary-50:read-only{background-color:var(--top-secondary-50)}.top-solutions-component .hover\:\!border-primary-800:hover{border-color:var(--top-primary-800)!important}.top-solutions-component .hover\:bg-primary-50:hover{background-color:var(--top-primary-50)}.top-solutions-component .hover\:bg-primary-800:hover{background-color:var(--top-primary-800)}.top-solutions-component .hover\:bg-secondary-200:hover{background-color:var(--top-secondary-200)}.top-solutions-component .focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.top-solutions-component .focus-visible\:ring-primary-500:focus-visible{--tw-ring-color:var(--top-primary-500)}.top-solutions-component .focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.top-solutions-component .enabled\:hover\:border-secondary-700:hover:enabled{border-color:var(--top-secondary-700)}.top-solutions-component .disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.top-solutions-component .disabled\:opacity-50:disabled{opacity:.5}.top-solutions-component .dark\:\!border-primary-200:is(.dark *){border-color:var(--top-primary-200)!important}.top-solutions-component .dark\:\!border-zinc-500:is(.dark *){--tw-border-opacity:1!important;border-color:rgb(113 113 122/var(--tw-border-opacity,1))!important}.top-solutions-component .dark\:border-zinc-600:is(.dark *){--tw-border-opacity:1;border-color:rgb(82 82 91/var(--tw-border-opacity,1))}.top-solutions-component .dark\:\!bg-transparent:is(.dark *){background-color:#0000!important}.top-solutions-component .dark\:\!bg-zinc-600:is(.dark *){--tw-bg-opacity:1!important;background-color:rgb(82 82 91/var(--tw-bg-opacity,1))!important}.top-solutions-component .dark\:\!bg-zinc-700:is(.dark *){--tw-bg-opacity:1!important;background-color:rgb(63 63 70/var(--tw-bg-opacity,1))!important}.top-solutions-component .dark\:\!bg-zinc-800:is(.dark *){--tw-bg-opacity:1!important;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))!important}.top-solutions-component .dark\:bg-cyan-700:is(.dark *){--tw-bg-opacity:1;background-color:rgb(14 116 144/var(--tw-bg-opacity,1))}.top-solutions-component .dark\:bg-primary-900:is(.dark *){background-color:var(--top-primary-900)}.top-solutions-component .dark\:bg-zinc-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))}.top-solutions-component .dark\:\!text-primary-100:is(.dark *){color:var(--top-primary-100)!important}.top-solutions-component .dark\:\!text-white:is(.dark *){--tw-text-opacity:1!important;color:rgb(255 255 255/var(--tw-text-opacity,1))!important}.top-solutions-component .dark\:\!text-zinc-100:is(.dark *){--tw-text-opacity:1!important;color:rgb(244 244 245/var(--tw-text-opacity,1))!important}.top-solutions-component .dark\:\!text-zinc-400:is(.dark *){--tw-text-opacity:1!important;color:rgb(161 161 170/var(--tw-text-opacity,1))!important}.top-solutions-component .dark\:text-primary-100:is(.dark *){color:var(--top-primary-100)}.top-solutions-component .dark\:text-primary-500:is(.dark *){color:var(--top-primary-500)}.top-solutions-component .dark\:text-red-400:is(.dark *){--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.top-solutions-component .dark\:text-white:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.top-solutions-component .dark\:text-zinc-100:is(.dark *){--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity,1))}.top-solutions-component .dark\:text-zinc-200:is(.dark *){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity,1))}.top-solutions-component .dark\:text-zinc-300:is(.dark *){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity,1))}.top-solutions-component .dark\:text-zinc-400:is(.dark *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.top-solutions-component .dark\:placeholder\:text-zinc-400:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.top-solutions-component .dark\:placeholder\:text-zinc-400:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.top-solutions-component .dark\:-moz-read-only\:bg-zinc-800:-moz-read-only:is(.dark *){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))}.top-solutions-component .dark\:read-only\:bg-zinc-800:read-only:is(.dark *){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))}.top-solutions-component .dark\:hover\:\!bg-primary-900:hover:is(.dark *){background-color:var(--top-primary-900)!important}.top-solutions-component .dark\:hover\:\!bg-zinc-600:hover:is(.dark *){--tw-bg-opacity:1!important;background-color:rgb(82 82 91/var(--tw-bg-opacity,1))!important}.top-solutions-component .dark\:hover\:bg-zinc-700:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity,1))}.top-solutions-component .dark\:enabled\:hover\:border-zinc-500:hover:enabled:is(.dark *){--tw-border-opacity:1;border-color:rgb(113 113 122/var(--tw-border-opacity,1))}
|
|
2
2
|
/*$vite$:1*/
|