@topjoao/top-design-system 0.1.0-beta.10 → 0.1.0-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -115,8 +115,9 @@ Exemplo
115
115
 
116
116
  ```vue
117
117
  <template>
118
- <TopButton label="Salvar" icon="pi pi-save" @click="salvar" />
119
- <TopButton label="Cancelar" secondary />
118
+ <TopButton label="Salvar" icon="pi pi-save" @click="salvar" />
119
+ <TopButton label="Cancelar" secondary />
120
+ <TopButton label="Excluir" severity="danger" />
120
121
 
121
122
  <TopButton label="Consultar" outlined>
122
123
  <template #icon>
@@ -134,13 +135,15 @@ Exemplo
134
135
  | `icon` | `string` | `''` |
135
136
  | `loading` | `boolean` | `false` |
136
137
  | `class` | `string` | `''` |
137
- | `outlined` | `boolean` | `false` |
138
- | `secondary` | `boolean` | `false` |
138
+ | `outlined` | `boolean` | `false` |
139
+ | `severity` | `'primary' \| 'secondary' \| 'success' \| 'warn' \| 'danger'` | `'primary'` |
140
+ | `secondary` | `boolean` | `false` |
139
141
  | `disabled` | `boolean` | `false` |
140
142
  | `unstyled` | `boolean` | `false` |
141
143
  | `type` | `'button' \| 'submit' \| 'reset'` | `'button'` |
142
144
 
143
- O componente emite `click` sem payload e oferece o slot nomeado `icon`.
145
+ O componente emite `click` sem payload e oferece o slot nomeado `icon`.
146
+ `secondary` permanece como atalho compatível para `severity="secondary"`.
144
147
 
145
148
  ## TopConfirmDialog
146
149
 
@@ -0,0 +1,2 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));let c=require("vue"),l=require("primevue/button");l=s(l,1);let u=require("primevue/tooltip");u=s(u,1);let d=require("tailwind-merge"),f=require("primevue/dialog");f=s(f,1);let p=require("primevue/datepicker");p=s(p,1);let m=require("primevue/fileupload");m=s(m,1);let h=require("primevue/inputtext");h=s(h,1);let g=require("primevue/autocomplete");g=s(g,1);let _=require("primevue/toast");_=s(_,1);var v={class:`top-button top-solutions-component h-fit w-fit rounded-[12px] bg-transparent`},y=(0,c.defineComponent)({__name:`TopButton`,props:{tooltip:{default:``},tooltipClass:{default:`text-xs`},label:{default:``},icon:{default:``},loading:{type:Boolean,default:!1},class:{default:``},outlined:{type:Boolean,default:!1},severity:{default:`primary`},secondary:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},unstyled:{type:Boolean,default:!1},type:{default:`button`}},emits:[`click`],setup(e,{emit:t}){let n=(0,c.useSlots)(),r=(0,c.computed)(()=>!!n.icon),i=e,a=t,o=(0,c.computed)(()=>i.secondary?`secondary`:i.severity),s=(0,c.computed)(()=>{let e=i.unstyled?``:o.value===`secondary`?`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`:i.outlined?o.value===`primary`?`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`:`shrink-0 rounded-[10px] border px-3 py-2 font-bold`:o.value===`primary`?`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`:`rounded-[10px] border px-3 py-2 font-bold`;return(0,d.twMerge)(e,i.class)});return(t,n)=>((0,c.openBlock)(),(0,c.createElementBlock)(`span`,v,[(0,c.withDirectives)(((0,c.openBlock)(),(0,c.createBlock)((0,c.unref)(l.default),{type:e.type,label:e.label,disabled:e.disabled||e.loading,icon:r.value?void 0:e.icon||void 0,loading:e.loading,outlined:e.outlined||o.value===`secondary`,severity:o.value===`primary`?void 0:o.value,class:(0,c.normalizeClass)(s.value),pt:{root:{class:s.value}},onClick:n[0]||=e=>a(`click`)},(0,c.createSlots)({_:2},[r.value?{name:`icon`,fn:(0,c.withCtx)(()=>[(0,c.renderSlot)(t.$slots,`icon`)]),key:`0`}:void 0]),1032,[`type`,`label`,`disabled`,`icon`,`loading`,`outlined`,`severity`,`class`,`pt`])),[[(0,c.unref)(u.default),{value:e.tooltip,class:e.tooltipClass},void 0,{top:!0}]])]))}}),b={primary:{50:`#EEF9FF`,100:`#DFF4FF`,200:`#C5E6F8`,300:`#8EC4DF`,400:`#66ACD1`,500:`#2488BC`,600:`#036DA3`,700:`#1B5783`,800:`#02466B`,900:`#052F4A`,950:`#0C192D`},secondary:{50:`#FAFAFA`,100:`#F4F4F5`,200:`#E9E9E9`,300:`#D8D8D8`,400:`#B8B8B8`,500:`#8E8E8E`,600:`#676767`,700:`#4B4B4B`,800:`#343434`,900:`#1C1917`,950:`#0C0A09`},success:{50:`#FAFFFA`,100:`#F4FBF6`,200:`#DFF6DE`,300:`#CBE3CA`,400:`#A3CCA1`,500:`#6BA968`,600:`#358F30`,700:`#2C7B27`,800:`#1E631A`,900:`#10430D`,950:`#062804`},warn:{50:`#FFF7ED`,100:`#FDF3D8`,200:`#FDE9B2`,300:`#FDD566`,400:`#FFB900`,500:`#FFA515`,600:`#FD9024`,700:`#DD781F`,800:`#BC4E00`,900:`#A42D02`,950:`#792202`},danger:{50:`#F8E6E4`,100:`#FFDDD9`,200:`#EEC1BC`,300:`#E3938C`,400:`#E3675C`,500:`#DC3F32`,600:`#CF150E`,700:`#B10404`,800:`#820907`,900:`#5D0803`,950:`#450501`}},x=[`aria-label`,`disabled`],S={class:`flex flex-col items-center gap-2 pt-2`},C={class:`text-base font-bold text-secondary-900 dark:text-zinc-100`},w={class:`text-sm leading-5 text-secondary-700 dark:text-zinc-300`},T={class:`mt-2 flex w-full items-center justify-center gap-3`},E=(0,c.defineComponent)({__name:`TopConfirmDialog`,props:{modelValue:{type:Boolean,default:!1},title:{default:`Confirmar`},message:{default:``},confirmText:{default:`Confirmar`},cancelText:{default:`Cancelar`},loading:{type:Boolean,default:!1},loadingText:{default:`Processando...`},severity:{default:`danger`},icon:{default:`pi pi-exclamation-triangle`}},emits:[`update:modelValue`,`confirm`,`cancel`,`close`],setup(e,{emit:t}){let n=e,r=t,i=(0,c.computed)({get:()=>n.modelValue,set:e=>{!e&&n.loading||r(`update:modelValue`,e)}}),a=(0,c.computed)(()=>({"--top-confirm-dialog-accent":n.severity===`danger`?b.danger[600]:b.primary[800],"--top-confirm-dialog-accent-hover":n.severity===`danger`?b.danger[700]:b.primary[700]})),o=(0,c.computed)(()=>[`px-3 py-2 text-sm`,n.severity===`danger`?`!border-red-600 !bg-red-600 hover:!border-red-700 hover:!bg-red-700`:``].filter(Boolean).join(` `));function s(){n.loading||r(`confirm`)}function l(){n.loading||(r(`cancel`),i.value=!1)}function u(){n.loading||(i.value=!1)}return(t,n)=>((0,c.openBlock)(),(0,c.createBlock)((0,c.unref)(f.default),{visible:i.value,"onUpdate:visible":n[0]||=e=>i.value=e,modal:``,closable:!1,"close-on-escape":!e.loading,"dismissable-mask":!1,draggable:!1,"show-header":!1,style:{width:`500px`,maxWidth:`calc(100vw - 2rem)`},"aria-label":e.title,pt:{root:{class:`top-confirm-dialog top-solutions-component`},content:{class:`p-6`},footer:{class:`hidden`}},onHide:n[1]||=e=>r(`close`)},{default:(0,c.withCtx)(()=>[(0,c.createElementVNode)(`div`,{class:`relative flex flex-col items-center gap-4 text-center`,style:(0,c.normalizeStyle)(a.value)},[(0,c.createElementVNode)(`button`,{type:`button`,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`,"aria-label":e.cancelText,disabled:e.loading,onClick:u},[...n[2]||=[(0,c.createElementVNode)(`i`,{class:`pi pi-times text-lg`,"aria-hidden":`true`},null,-1)]],8,x),(0,c.createElementVNode)(`div`,S,[(0,c.createElementVNode)(`i`,{class:(0,c.normalizeClass)([e.icon,`top-confirm-dialog__icon text-[40px]`]),"aria-hidden":`true`},null,2),(0,c.createElementVNode)(`p`,C,(0,c.toDisplayString)(e.title),1)]),(0,c.createElementVNode)(`div`,w,[(0,c.renderSlot)(t.$slots,`message`,{},()=>[(0,c.renderSlot)(t.$slots,`default`,{},()=>[(0,c.createTextVNode)((0,c.toDisplayString)(e.message),1)])])]),(0,c.createElementVNode)(`div`,T,[(0,c.createVNode)(y,{label:e.cancelText,secondary:``,disabled:e.loading,class:`px-3 py-2 text-sm`,onClick:l},null,8,[`label`,`disabled`]),(0,c.createVNode)(y,{label:e.loading?e.loadingText:e.confirmText,loading:e.loading,class:(0,c.normalizeClass)(o.value),onClick:s},null,8,[`label`,`loading`,`class`])])],4)]),_:3},8,[`visible`,`close-on-escape`,`aria-label`]))}}),D={class:`top-date-picker top-solutions-component flex w-full flex-col gap-1`},O=[`for`],k={key:0,"aria-hidden":`true`,class:`text-red-600 dark:text-red-400`},A=[`id`],j=(0,c.defineComponent)({inheritAttrs:!1,__name:`TopDatePicker`,props:{modelValue:{default:null},label:{default:``},placeholder:{default:`dd/mm/aaaa`},required:{type:Boolean,default:!1},error:{default:``},invalid:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},selectionMode:{default:`single`},dateFormat:{default:`dd/mm/yy`},minDate:{default:void 0},maxDate:{default:void 0},showIcon:{type:Boolean,default:!0},iconDisplay:{default:`input`},manualInput:{type:Boolean,default:!0},showButtonBar:{type:Boolean,default:!1},appendTo:{default:`body`}},emits:[`update:modelValue`,`input`,`change`,`date-select`,`show`,`hide`,`today-click`,`clear-click`,`month-change`,`year-change`,`focus`,`blur`,`keydown`],setup(e,{emit:t}){let n=e,r=t,i=(0,c.useAttrs)(),a=(0,c.useSlots)(),o=(0,c.useId)(),s=(0,c.computed)(()=>i.id===void 0||i.id===null||i.id===``?o:String(i.id)),l=(0,c.computed)(()=>`${s.value}-error`),u=(0,c.computed)(()=>n.invalid||!!n.error),d=(0,c.computed)(()=>n.manualInput&&!n.readonly&&!n.disabled&&n.selectionMode===`single`&&n.dateFormat===`dd/mm/yy`),f=(0,c.computed)(()=>{if(u.value)return!0;let e=i[`aria-invalid`];return typeof e==`boolean`||e===`true`||e===`false`||e===`grammar`||e===`spelling`?e:void 0}),m=(0,c.computed)(()=>{let e=i[`aria-describedby`],t=[typeof e==`string`?e:``,n.error?l.value:``].filter(Boolean);return t.length?t.join(` `):void 0}),h=(0,c.computed)(()=>{let{id:e,"aria-describedby":t,"aria-invalid":n,...r}=i;return r}),g=(0,c.computed)(()=>({pcInputText:{root:{"aria-describedby":m.value,"aria-invalid":f.value,onChange:e=>r(`change`,e),inputmode:d.value?`numeric`:void 0,maxlength:d.value?10:void 0}}}));function _(e){r(`update:modelValue`,e??null)}function v(e){let t=e.target;if(d.value&&t instanceof HTMLInputElement&&!e.isComposing){let e=t.value.replace(/\D/g,``).slice(0,8);t.value=[e.slice(0,2),e.slice(2,4),e.slice(4,8)].filter(Boolean).join(`/`)}r(`input`,e)}return(t,n)=>((0,c.openBlock)(),(0,c.createElementBlock)(`div`,D,[e.label?((0,c.openBlock)(),(0,c.createElementBlock)(`label`,{key:0,for:s.value,class:`top-field-label text-xs font-bold`},[(0,c.createTextVNode)((0,c.toDisplayString)(e.label)+` `,1),e.required?((0,c.openBlock)(),(0,c.createElementBlock)(`span`,k,`*`)):(0,c.createCommentVNode)(``,!0)],8,O)):(0,c.createCommentVNode)(``,!0),(0,c.createVNode)((0,c.unref)(p.default),(0,c.mergeProps)(h.value,{"model-value":e.modelValue,"input-id":s.value,placeholder:e.placeholder,required:e.required,invalid:u.value,disabled:e.disabled,readonly:e.readonly,"selection-mode":e.selectionMode,"date-format":e.dateFormat,"update-model-type":`date`,"min-date":e.minDate,"max-date":e.maxDate,"show-icon":e.showIcon,"icon-display":e.iconDisplay,"manual-input":e.manualInput,"show-button-bar":e.showButtonBar,"append-to":e.appendTo,pt:g.value,"input-class":`top-date-picker__input top-field-control h-[40px] w-full rounded-[10px] border px-3 py-2 text-xs read-only:cursor-default disabled:cursor-not-allowed`,"panel-class":`top-date-picker-panel top-solutions-component`,fluid:``,"onUpdate:modelValue":_,onInput:v,onDateSelect:n[0]||=e=>r(`date-select`,e),onShow:n[1]||=e=>r(`show`),onHide:n[2]||=e=>r(`hide`),onTodayClick:n[3]||=e=>r(`today-click`,e),onClearClick:n[4]||=e=>r(`clear-click`,e),onMonthChange:n[5]||=e=>r(`month-change`,e),onYearChange:n[6]||=e=>r(`year-change`,e),onFocus:n[7]||=e=>r(`focus`,e),onBlur:n[8]||=e=>r(`blur`,e),onKeydown:n[9]||=e=>r(`keydown`,e)}),(0,c.createSlots)({_:2},[(0,c.renderList)((0,c.unref)(a),(e,n)=>({name:n,fn:(0,c.withCtx)(e=>[(0,c.renderSlot)(t.$slots,n,(0,c.normalizeProps)((0,c.guardReactiveProps)(e??{})))])}))]),1040,[`model-value`,`input-id`,`placeholder`,`required`,`invalid`,`disabled`,`readonly`,`selection-mode`,`date-format`,`min-date`,`max-date`,`show-icon`,`icon-display`,`manual-input`,`show-button-bar`,`append-to`,`pt`]),e.error?((0,c.openBlock)(),(0,c.createElementBlock)(`span`,{key:1,id:l.value,class:`text-[11px] text-red-600 dark:text-red-400`,role:`alert`},(0,c.toDisplayString)(e.error),9,A)):(0,c.createCommentVNode)(``,!0)]))}}),M={class:`top-file-upload top-solutions-component flex w-full flex-col gap-1`},N=[`for`],P={key:0,"aria-hidden":`true`,class:`text-red-600 dark:text-red-400`},F={class:`flex min-h-[130px] w-full flex-col items-center justify-center gap-3`},ee={class:`m-0 text-center text-xs text-secondary-600 dark:text-zinc-300`},I={key:1,class:`flex w-full flex-col gap-2`},L=[`src`,`alt`],R={key:1,class:`flex size-12 shrink-0 items-center justify-center rounded-lg bg-primary-50 text-primary-800 dark:bg-primary-950 dark:text-primary-200`},z={class:`min-w-0 flex-1`},B={class:`m-0 truncate text-xs font-bold text-secondary-900 dark:text-zinc-100`},V={class:`text-[11px] text-secondary-500 dark:text-zinc-400`},H=[`aria-label`,`disabled`,`onClick`],U=[`id`],W=(0,c.defineComponent)({inheritAttrs:!1,__name:`TopFileUpload`,props:{modelValue:{default:null},label:{default:``},placeholder:{default:`Arraste e solte o arquivo aqui`},required:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},accept:{default:``},multiple:{type:Boolean,default:!1},maxFileSize:{default:null},maxFiles:{default:null},error:{default:``},selectLabel:{default:`Selecionar arquivo`},removeLabel:{default:`Remover`},loading:{type:Boolean,default:!1}},emits:[`update:modelValue`,`select`,`change`,`remove`,`clear`,`error`],setup(e,{expose:t,emit:n}){let r=e,i=n,a=(0,c.useAttrs)(),o=(0,c.useId)(),s=(0,c.ref)(null),l=(0,c.ref)(b(r.modelValue)),u=(0,c.ref)([]),d=new Map,f=(0,c.computed)(()=>a.id===void 0||a.id===null||a.id===``?o:String(a.id)),p=(0,c.computed)(()=>`${f.value}-error`),h=(0,c.computed)(()=>r.error||u.value[0]?.message||``),g=(0,c.computed)(()=>r.disabled||r.loading),_=(0,c.computed)(()=>{let e=a[`aria-describedby`],t=[typeof e==`string`?e:``,h.value?p.value:``].filter(Boolean);return t.length?t.join(` `):void 0}),v=(0,c.computed)(()=>({...a,id:f.value,required:r.required,"aria-invalid":h.value?!0:a[`aria-invalid`],"aria-describedby":_.value,"aria-label":a[`aria-label`]||(r.label?void 0:r.selectLabel)}));function b(e){return e?Array.isArray(e)?r.multiple?[...e]:e.slice(0,1):[e]:[]}function x(e,t){return e.name===t.name&&e.type===t.type&&e.size===t.size}function S(e){return!r.accept.trim()||r.accept.split(`,`).some(t=>{let n=t.trim().toLowerCase(),r=e.type.toLowerCase();return n?n.startsWith(`.`)?e.name.toLowerCase().endsWith(n):n.endsWith(`/*`)?r.startsWith(n.slice(0,-1)):r===n:!1})}function C(e){return e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(1)} KB`:`${(e/1048576).toFixed(2)} MB`}function w(e){let t=[];return{errors:t,validFiles:e.filter(e=>S(e)?r.maxFileSize&&e.size>r.maxFileSize?(t.push({code:`file-size`,file:e,message:`O arquivo "${e.name}" excede o tamanho máximo de ${C(r.maxFileSize)}.`}),!1):!0:(t.push({code:`file-type`,file:e,message:`O arquivo "${e.name}" não possui um tipo aceito.`}),!1))}}function T(e){let t=e.originalEvent;return Array.from(t.dataTransfer?.files??t.target?.files??[])}function E(e){return r.multiple?[...e]:e[0]??null}function D(){s.value&&(s.value.files=[...l.value])}function O(e,t){l.value=e,u.value=[],q(),(0,c.nextTick)(D);let n=E(e);i(`update:modelValue`,n),i(`change`,n),t===`select`&&i(`select`,[...e]),t===`clear`&&i(`clear`)}function k(e){let{errors:t,validFiles:n}=w(T(e)),a=r.multiple?[...l.value,...n.filter(e=>!l.value.some(t=>x(t,e)))]:n.slice(-1);if(r.maxFiles&&a.length>r.maxFiles){let e=a.slice(r.maxFiles);t.push(...e.map(e=>({code:`file-limit`,file:e,message:`O limite máximo é de ${r.maxFiles} arquivo(s).`}))),a=a.slice(0,r.maxFiles)}if(t.length?(u.value=t,i(`error`,t)):u.value=[],D(),n.length&&!A(a,l.value)){l.value=a,q(),(0,c.nextTick)(D);let e=E(a);i(`update:modelValue`,e),i(`change`,e),i(`select`,[...a])}}function A(e,t){return e.length===t.length&&e.every((e,n)=>x(e,t[n]))}function j(){g.value||s.value?.choose()}function W(e,t){if(g.value)return;let n=l.value[t];if(!n)return;e(t);let r=l.value.filter((e,n)=>n!==t);O(r,`remove`),i(`remove`,n,t),r.length||i(`clear`)}function G(){g.value||!l.value.length||O([],`clear`)}function K(e){if(!e.type.startsWith(`image/`)||typeof URL.createObjectURL!=`function`)return``;let t=d.get(e);if(t)return t;let n=URL.createObjectURL(e);return d.set(e,n),n}function q(){for(let[e,t]of d)l.value.includes(e)||(URL.revokeObjectURL(t),d.delete(e))}return(0,c.watch)(()=>r.modelValue,e=>{let t=b(e);A(t,l.value)||(l.value=t,u.value=[],q(),(0,c.nextTick)(D))}),(0,c.watch)(()=>r.multiple,()=>{let e=b(r.modelValue);l.value=e,q(),(0,c.nextTick)(D)}),(0,c.onMounted)(D),(0,c.onBeforeUnmount)(()=>{for(let e of d.values())URL.revokeObjectURL(e);d.clear()}),t({choose:j,clear:G}),(t,n)=>((0,c.openBlock)(),(0,c.createElementBlock)(`div`,M,[e.label?((0,c.openBlock)(),(0,c.createElementBlock)(`label`,{key:0,for:f.value,class:`text-xs font-bold text-secondary-800 dark:text-zinc-200`},[(0,c.createTextVNode)((0,c.toDisplayString)(e.label)+` `,1),e.required?((0,c.openBlock)(),(0,c.createElementBlock)(`span`,P,`*`)):(0,c.createCommentVNode)(``,!0)],8,N)):(0,c.createCommentVNode)(``,!0),(0,c.createVNode)((0,c.unref)(m.default),{ref_key:`fileUploadRef`,ref:s,mode:`advanced`,accept:e.accept||void 0,multiple:e.multiple,disabled:g.value,"custom-upload":!0,"show-upload-button":!1,"show-cancel-button":!1,pt:{root:{class:`top-file-upload__root w-full`},header:{class:`hidden`},input:v.value,content:{class:[`top-file-upload__dropzone min-h-[164px] rounded-[10px] border border-dashed p-4 transition-colors`,h.value?`border-red-600 bg-red-50 dark:border-red-400 dark:bg-red-950/20`:`border-secondary-400 bg-secondary-50 hover:border-primary-600 hover:bg-primary-50 dark:border-zinc-600 dark:bg-zinc-800 dark:hover:border-primary-400 dark:hover:bg-zinc-700`,g.value?`cursor-not-allowed opacity-60`:``].join(` `)}},onSelect:k},{content:(0,c.withCtx)(({removeFileCallback:r})=>[(0,c.createElementVNode)(`div`,F,[l.value.length?((0,c.openBlock)(),(0,c.createElementBlock)(`div`,I,[((0,c.openBlock)(!0),(0,c.createElementBlock)(c.Fragment,null,(0,c.renderList)(l.value,(i,a)=>((0,c.openBlock)(),(0,c.createElementBlock)(`div`,{key:`${i.name}-${i.size}-${i.lastModified}`,class:`flex min-w-0 items-center gap-3 rounded-[10px] border border-secondary-300 bg-white p-3 dark:border-zinc-600 dark:bg-zinc-900`},[(0,c.renderSlot)(t.$slots,`preview`,{file:i,index:a,url:K(i)},()=>[K(i)?((0,c.openBlock)(),(0,c.createElementBlock)(`img`,{key:0,src:K(i),alt:`Pré-visualização de ${i.name}`,class:`size-12 shrink-0 rounded-lg object-cover`},null,8,L)):((0,c.openBlock)(),(0,c.createElementBlock)(`span`,R,[...n[0]||=[(0,c.createElementVNode)(`i`,{class:`pi pi-file text-2xl`,"aria-hidden":`true`},null,-1)]]))]),(0,c.createElementVNode)(`div`,z,[(0,c.createElementVNode)(`p`,B,(0,c.toDisplayString)(i.name),1),(0,c.createElementVNode)(`span`,V,(0,c.toDisplayString)(C(i.size)),1)]),(0,c.createElementVNode)(`button`,{type:`button`,class:`flex size-8 shrink-0 items-center justify-center rounded-full border-0 bg-transparent p-0 text-red-600 transition-colors hover:bg-red-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:text-red-400 dark:hover:bg-red-950/40 dark:focus-visible:ring-offset-zinc-900`,"aria-label":`${e.removeLabel}: ${i.name}`,disabled:g.value,onClick:e=>W(r,a)},[...n[1]||=[(0,c.createElementVNode)(`i`,{class:`pi pi-times`,"aria-hidden":`true`},null,-1)]],8,H)]))),128)),e.multiple&&(!e.maxFiles||l.value.length<e.maxFiles)?((0,c.openBlock)(),(0,c.createBlock)(y,{key:0,label:e.selectLabel,icon:`pi pi-plus-circle`,outlined:``,disabled:e.disabled,loading:e.loading,class:`mt-1 px-3 py-2 text-xs`,onClick:j},null,8,[`label`,`disabled`,`loading`])):(0,c.createCommentVNode)(``,!0)])):(0,c.renderSlot)(t.$slots,`empty`,{choose:j,disabled:g.value},()=>[(0,c.createElementVNode)(`i`,{class:(0,c.normalizeClass)([e.loading?`pi pi-spin pi-spinner`:`pi pi-cloud-upload`,`text-4xl text-primary-800 dark:text-primary-300`]),"aria-hidden":`true`},null,2),(0,c.createElementVNode)(`p`,ee,(0,c.toDisplayString)(e.placeholder),1),(0,c.createVNode)(y,{label:e.selectLabel,icon:`pi pi-plus-circle`,disabled:e.disabled,loading:e.loading,class:`px-3 py-2 text-xs`,onClick:j},null,8,[`label`,`disabled`,`loading`])],void 0,0)])]),_:3},8,[`accept`,`multiple`,`disabled`,`pt`]),h.value?((0,c.openBlock)(),(0,c.createElementBlock)(`span`,{key:1,id:p.value,class:`text-[11px] text-red-600 dark:text-red-400`,role:`alert`},(0,c.toDisplayString)(h.value),9,U)):(0,c.createCommentVNode)(``,!0)]))}}),G={class:`top-input-text top-solutions-component flex w-full flex-col gap-1`},K=[`for`],q={key:0,"aria-hidden":`true`,class:`text-red-600 dark:text-red-400`},J=[`id`],Y=(0,c.defineComponent)({inheritAttrs:!1,__name:`TopInputText`,props:{modelValue:{default:``},label:{default:``},placeholder:{default:``},required:{type:Boolean,default:!1},error:{default:``},disabled:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1}},emits:[`update:modelValue`],setup(e,{emit:t}){let n=e,r=t,i=(0,c.useAttrs)(),a=(0,c.useId)(),o=(0,c.computed)(()=>i.id===void 0||i.id===null||i.id===``?a:String(i.id)),s=(0,c.computed)(()=>`${o.value}-error`),l=(0,c.computed)(()=>{if(n.error)return!0;let e=i[`aria-invalid`];return typeof e==`boolean`||e===`true`||e===`false`||e===`grammar`||e===`spelling`?e:void 0}),u=(0,c.computed)(()=>{let e=i[`aria-describedby`],t=[typeof e==`string`?e:``,n.error?s.value:``].filter(Boolean);return t.length?t.join(` `):void 0});function d(e){r(`update:modelValue`,e??``)}return(t,n)=>((0,c.openBlock)(),(0,c.createElementBlock)(`div`,G,[e.label?((0,c.openBlock)(),(0,c.createElementBlock)(`label`,{key:0,for:o.value,class:`top-field-label text-xs font-bold`},[(0,c.createTextVNode)((0,c.toDisplayString)(e.label)+` `,1),e.required?((0,c.openBlock)(),(0,c.createElementBlock)(`span`,q,`*`)):(0,c.createCommentVNode)(``,!0)],8,K)):(0,c.createCommentVNode)(``,!0),(0,c.createVNode)((0,c.unref)(h.default),(0,c.mergeProps)(t.$attrs,{id:o.value,"model-value":e.modelValue,type:`text`,placeholder:e.placeholder,required:e.required,disabled:e.disabled,readonly:e.readonly,invalid:!!e.error,"aria-invalid":l.value,"aria-describedby":u.value,fluid:``,class:`top-input-text__control top-field-control h-[40px] w-full rounded-[10px] border px-3 py-2 text-xs read-only:cursor-default disabled:cursor-not-allowed`,"onUpdate:modelValue":d}),null,16,[`id`,`model-value`,`placeholder`,`required`,`disabled`,`readonly`,`invalid`,`aria-invalid`,`aria-describedby`]),e.error?((0,c.openBlock)(),(0,c.createElementBlock)(`span`,{key:1,id:s.value,class:`text-[11px] text-red-600 dark:text-red-400`,role:`alert`},(0,c.toDisplayString)(e.error),9,J)):(0,c.createCommentVNode)(``,!0)]))}}),X={class:`top-field-icon pointer-events-none absolute left-3 top-1/2 z-10 -translate-y-1/2`},Z={key:0,class:`pi pi-spin pi-spinner`},te={key:1,class:`pi pi-search`},Q={key:1,class:`flex items-center gap-1 !text-sm`},ne={class:`flex items-center gap-2 rounded-[9px] bg-primary-500 px-2 py-1 text-white`},re=[`onClick`],ie={class:`line-clamp-1 max-w-[300px] overflow-hidden text-ellipsis`},ae={key:1,class:`flex min-h-[100px] flex-col items-center justify-center gap-2 py-2`},oe={key:0,class:`text-xs font-medium text-primary-600`},se={key:2,class:`text-xs text-secondary-500`},ce={key:1},le={key:1,class:`flex items-center gap-2 font-semibold`},ue={key:1,class:`flex w-full min-w-0 items-start gap-2 overflow-hidden px-2 py-3 text-sm`,style:{"white-space":`normal`}},de=[`title`],fe={key:0,class:`top-select-option-prefix whitespace-nowrap font-bold text-primary-800 dark:text-primary-100`},pe={key:0,class:`rounded-sm bg-primary-200 p-0 font-bold text-black dark:bg-cyan-700 dark:text-white`},$={key:0,class:`rounded-sm bg-primary-200 p-0 font-bold text-black dark:bg-cyan-700 dark:text-white`},me=(0,c.defineComponent)({__name:`TopSelect`,props:{modelValue:{default:null},options:{default:()=>[]},loading:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},placeholder:{default:`Pesquisar...`},optionLabel:{type:[String,Function],default:`label`},optionKey:{default:`id`},optionPrefix:{default:``},showOptionPrefix:{type:Boolean,default:!1},showSelectedPrefix:{type:Boolean,default:!1},panelWidth:{default:null},scrollHeight:{default:`250px`},invalid:{type:Boolean,default:!1},showTooltip:{type:Boolean,default:!0},optionGroupLabel:{default:null},optionGroupChildren:{default:null},minQueryLength:{default:1},emptyMessage:{default:`Nenhum resultado encontrado.`},loadingMessage:{default:`Carregando...`},showLoadingMessage:{type:Boolean,default:!0},multiple:{type:Boolean,default:!1},forceSelection:{type:Boolean,default:!0},closeOnSelect:{type:Boolean,default:!1}},emits:[`update:modelValue`,`search`,`loadMore`,`clear`,`select`,`change`],setup(e,{expose:t,emit:n}){let r=e,i=n,a=(0,c.useSlots)(),o=g.default,s=(0,c.ref)(``),l=(0,c.ref)(!1),d=(0,c.ref)(null),f=`top-select-${Math.random().toString(36).slice(2)}`,p=null,m=(0,c.computed)({get:()=>r.modelValue,set:e=>i(`update:modelValue`,e)});function h(e,t){return e==null?``:String(typeof e==`object`?e[t]??``:e)}function _(e){return e==null?``:typeof r.optionLabel==`function`?r.optionLabel(e):h(e,r.optionLabel)}function v(e){return r.optionPrefix?h(e,r.optionPrefix):``}function y(e,t=r.showSelectedPrefix){let n=_(e),i=v(e);return t&&i?`${i} - ${n}`:n}function b(e){let t=s.value;if(!t)return[{text:e,highlighted:!1}];let n=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),r=RegExp(`(${n})`,`gi`);return e.split(r).filter(Boolean).map(e=>({text:e,highlighted:e.toLowerCase()===t.toLowerCase()}))}function x(){d.value?.hide?.()}function S(){typeof window>`u`||window.dispatchEvent(new CustomEvent(`top-select:close-others`,{detail:{instanceId:f}}))}function C(e){e.detail?.instanceId!==f&&x()}function w(){if(r.disabled||p){x();return}l.value=!0,S()}function T(){r.closeOnSelect&&(l.value=!1,x(),(0,c.nextTick)(x),p&&clearTimeout(p),p=setTimeout(()=>{x(),p=null},200))}return t({hideDropdown:x}),(0,c.onMounted)(()=>window.addEventListener(`top-select:close-others`,C)),(0,c.onBeforeUnmount)(()=>{window.removeEventListener(`top-select:close-others`,C),p&&clearTimeout(p)}),(0,c.watch)(()=>r.disabled,e=>{e&&(l.value=!1,x())}),(0,c.watch)(()=>r.options,()=>{l.value||x()}),(t,n)=>((0,c.openBlock)(),(0,c.createElementBlock)(`div`,{class:(0,c.normalizeClass)([`top-select top-solutions-component relative w-full`,{"pointer-events-none":e.disabled}]),onFocusin:w},[(0,c.createElementVNode)(`span`,X,[(0,c.renderSlot)(t.$slots,`icon`,{loading:e.loading},()=>[e.loading?((0,c.openBlock)(),(0,c.createElementBlock)(`i`,Z)):((0,c.openBlock)(),(0,c.createElementBlock)(`i`,te))])]),(0,c.createVNode)((0,c.unref)(o),{ref_key:`autocompleteRef`,ref:d,modelValue:m.value,"onUpdate:modelValue":n[0]||=e=>m.value=e,"option-group-label":e.optionGroupLabel??void 0,"option-group-children":e.optionGroupChildren??void 0,suggestions:e.options,"data-key":e.optionKey,"option-label":e=>y(e),placeholder:e.placeholder,multiple:e.multiple,"min-length":e.minQueryLength,disabled:e.disabled,delay:500,"show-clear":!e.multiple&&!e.disabled,dropdown:``,"dropdown-mode":`current`,"complete-on-focus":!1,invalid:e.invalid,fluid:``,"force-selection":e.forceSelection,"input-class":`text-xs`,"virtual-scroller-options":{lazy:!0,onLazyLoad:e=>i(`loadMore`,e),itemSize:84,showLoader:!0,scrollHeight:e.scrollHeight},pt:{root:{class:[`w-full text-xs`,e.multiple?`h-auto`:`h-[40px]`].join(` `)},pcInputText:{root:{class:`top-field-control w-full h-auto text-xs border rounded-[10px] !pl-9 min-h-[36px]`}},input:{class:[`top-field-control w-full h-auto text-xs`,e.multiple?`border-0 py-1 !shadow-none outline-none ring-0`:`border rounded-[10px] !pl-9 min-h-[36px]`].join(` `)},inputMultiple:{class:`top-field-control rounded-[10px] pl-9 min-h-[40px]`},inputChip:{class:`py-0`},token:{class:`bg-primary-100 text-primary-900 rounded-md gap-2 px-2 my-1 dark:bg-primary-900 dark:text-primary-100`},removeTokenIcon:{class:`text-primary-900 w-3 h-3 cursor-pointer dark:text-primary-100`},panel:{class:`top-select-panel top-solutions-component max-w-[85vw] overflow-hidden h-fit shadow-xl`},listContainer:{class:`max-w-full overflow-x-hidden`,style:{overflowX:`hidden`,maxWidth:e.panelWidth??`85vw`,...e.panelWidth?{width:e.panelWidth}:{}}},list:{class:`max-w-full overflow-x-hidden`},option:{class:`max-w-full overflow-hidden min-h-[84px]`},placeholder:{class:`!text-xs`}},"search-message":` `,onClear:n[1]||=e=>{s.value=``,i(`clear`)},onItemSelect:n[2]||=e=>{s.value=``,i(`select`,e),T()},onComplete:n[3]||=t=>{if(e.disabled){x();return}s.value=t.query??``,S(),i(`search`,{...t,query:s.value})},onChange:n[4]||=e=>i(`change`,e)},(0,c.createSlots)({chip:(0,c.withCtx)(e=>[(0,c.unref)(a).chip?(0,c.renderSlot)(t.$slots,`chip`,(0,c.normalizeProps)((0,c.guardReactiveProps)(e)),void 0,void 0,0):((0,c.openBlock)(),(0,c.createElementBlock)(`div`,Q,[(0,c.createElementVNode)(`div`,ne,[(0,c.createElementVNode)(`i`,{class:`pi pi-times-circle shrink-0 cursor-pointer rounded-full hover:bg-primary-800`,onClick:t=>e.removeCallback(t)},null,8,re),(0,c.withDirectives)(((0,c.openBlock)(),(0,c.createElementBlock)(`span`,ie,[(0,c.createTextVNode)((0,c.toDisplayString)(y(e.value)),1)])),[[(0,c.unref)(u.default),y(e.value),void 0,{top:!0}]])])]))]),empty:(0,c.withCtx)(()=>[(0,c.unref)(a).empty?(0,c.renderSlot)(t.$slots,`empty`,{},void 0,void 0,0):e.loading?((0,c.openBlock)(),(0,c.createElementBlock)(`div`,ae,[n[5]||=(0,c.createElementVNode)(`span`,{class:`pi pi-spin pi-spinner text-2xl text-primary-600`},null,-1),e.showLoadingMessage?((0,c.openBlock)(),(0,c.createElementBlock)(`span`,oe,(0,c.toDisplayString)(e.loadingMessage),1)):(0,c.createCommentVNode)(``,!0)])):((0,c.openBlock)(),(0,c.createElementBlock)(`span`,se,(0,c.toDisplayString)(e.emptyMessage),1))]),"selected-item":(0,c.withCtx)(e=>[(0,c.unref)(a)[`selected-item`]?(0,c.renderSlot)(t.$slots,`selected-item`,(0,c.normalizeProps)((0,c.guardReactiveProps)(e)),void 0,void 0,0):e.item?((0,c.openBlock)(),(0,c.createElementBlock)(`span`,ce,(0,c.toDisplayString)(y(e.item)),1)):(0,c.createCommentVNode)(``,!0)]),optiongroup:(0,c.withCtx)(n=>[(0,c.unref)(a)[`option-group`]?(0,c.renderSlot)(t.$slots,`option-group`,(0,c.normalizeProps)((0,c.guardReactiveProps)(n)),void 0,void 0,0):((0,c.openBlock)(),(0,c.createElementBlock)(`div`,le,[n.option.icon?((0,c.openBlock)(),(0,c.createElementBlock)(`i`,{key:0,class:(0,c.normalizeClass)(n.option.icon)},null,2)):(0,c.createCommentVNode)(``,!0),(0,c.createElementVNode)(`span`,null,(0,c.toDisplayString)(n.option[e.optionGroupLabel??`label`]),1)]))]),option:(0,c.withCtx)(r=>[(0,c.unref)(a).option?(0,c.renderSlot)(t.$slots,`option`,(0,c.mergeProps)(r,{label:_(r.option),prefix:v(r.option),query:s.value}),void 0,void 0,0):(0,c.withDirectives)(((0,c.openBlock)(),(0,c.createElementBlock)(`div`,ue,[(0,c.createElementVNode)(`span`,{class:`top-select-option-label line-clamp-2 min-w-0 flex-1 text-secondary-700 dark:text-zinc-200`,title:_(r.option)},[e.showOptionPrefix&&v(r.option)?((0,c.openBlock)(),(0,c.createElementBlock)(`span`,fe,[((0,c.openBlock)(!0),(0,c.createElementBlock)(c.Fragment,null,(0,c.renderList)(b(v(r.option)),(e,t)=>((0,c.openBlock)(),(0,c.createElementBlock)(c.Fragment,{key:t},[e.highlighted?((0,c.openBlock)(),(0,c.createElementBlock)(`mark`,pe,(0,c.toDisplayString)(e.text),1)):((0,c.openBlock)(),(0,c.createElementBlock)(c.Fragment,{key:1},[(0,c.createTextVNode)((0,c.toDisplayString)(e.text),1)],64))],64))),128)),n[6]||=(0,c.createElementVNode)(`span`,{class:`font-bold text-secondary-500 dark:text-zinc-400`},`\xA0-\xA0`,-1)])):(0,c.createCommentVNode)(``,!0),((0,c.openBlock)(!0),(0,c.createElementBlock)(c.Fragment,null,(0,c.renderList)(b(_(r.option)),(e,t)=>((0,c.openBlock)(),(0,c.createElementBlock)(c.Fragment,{key:t},[e.highlighted?((0,c.openBlock)(),(0,c.createElementBlock)(`mark`,$,(0,c.toDisplayString)(e.text),1)):((0,c.openBlock)(),(0,c.createElementBlock)(c.Fragment,{key:1},[(0,c.createTextVNode)((0,c.toDisplayString)(e.text),1)],64))],64))),128))],8,de)])),[[(0,c.unref)(u.default),e.showTooltip?_(r.option):null,void 0,{top:!0}]])]),_:2},[(0,c.unref)(a).footer?{name:`footer`,fn:(0,c.withCtx)(e=>[(0,c.renderSlot)(t.$slots,`footer`,(0,c.normalizeProps)((0,c.guardReactiveProps)(e)))]),key:`0`}:void 0]),1032,[`modelValue`,`option-group-label`,`option-group-children`,`suggestions`,`data-key`,`option-label`,`placeholder`,`multiple`,`min-length`,`disabled`,`show-clear`,`invalid`,`force-selection`,`virtual-scroller-options`,`pt`])],34))}}),he={class:`top-toast__content`},ge={class:`top-toast__detail`},_e=[`onClick`],ve={key:0,class:`top-toast__footer`},ye=(0,c.defineComponent)({__name:`TopToast`,props:{baseZIndex:{default:3e4}},setup(e){function t(e){return e.data?.footer}function n(e){return e.data?.action}function r(e){n(e)?.onClick?.()}function i(e){return t(e)!==void 0}function a(e){return!!n(e)}function o(e,t){return`top-toast__${t}--${e.severity??`info`}`}return(s,l)=>((0,c.openBlock)(),(0,c.createBlock)((0,c.unref)(_.default),{position:`top-right`,"base-z-index":e.baseZIndex},{message:(0,c.withCtx)(e=>[(0,c.createElementVNode)(`div`,he,[(0,c.createElementVNode)(`div`,{class:(0,c.normalizeClass)([`top-toast__summary`,o(e.message,`summary`)])},(0,c.toDisplayString)(e.message.summary),3),(0,c.createElementVNode)(`div`,ge,(0,c.toDisplayString)(e.message.detail),1),a(e.message)?(0,c.renderSlot)(s.$slots,`action`,{action:n(e.message),message:e.message,run:()=>r(e.message)},()=>[n(e.message)?((0,c.openBlock)(),(0,c.createElementBlock)(`button`,{key:0,class:(0,c.normalizeClass)([`top-toast__action`,o(e.message,`action`)]),type:`button`,onClick:t=>r(e.message)},[n(e.message)?.icon?((0,c.openBlock)(),(0,c.createElementBlock)(`i`,{key:0,class:(0,c.normalizeClass)(n(e.message)?.icon),"aria-hidden":`true`},null,2)):(0,c.createCommentVNode)(``,!0),(0,c.createTextVNode)(` `+(0,c.toDisplayString)(n(e.message)?.label),1)],10,_e)):(0,c.createCommentVNode)(``,!0)],void 0,0):(0,c.createCommentVNode)(``,!0),i(e.message)?(0,c.renderSlot)(s.$slots,`footer`,{message:e.message,footer:t(e.message)},()=>[t(e.message)===void 0?(0,c.createCommentVNode)(``,!0):((0,c.openBlock)(),(0,c.createElementBlock)(`div`,ve,(0,c.toDisplayString)(t(e.message)),1))],void 0,1):(0,c.createCommentVNode)(``,!0)])]),_:3},8,[`base-z-index`]))}});Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return me}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return ye}});
2
+ //# sourceMappingURL=TopToast-BjKkubxq.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TopToast-BjKkubxq.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/TopDatePicker.vue","../src/components/TopDatePicker.vue","../src/components/TopFileUpload.vue","../src/components/TopFileUpload.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'\nimport { twMerge } from 'tailwind-merge'\n\nexport type TopButtonSeverity = 'primary' | 'secondary' | 'success' | 'warn' | 'danger'\n\nconst slots = useSlots()\nconst outrosIcones = computed(() => Boolean(slots.icon))\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n tooltip?: string\r\n tooltipClass?: string\r\n label?: string\r\n icon?: string\r\n loading?: boolean\r\n class?: string\r\n outlined?: boolean\n severity?: TopButtonSeverity\n secondary?: boolean\n disabled?: boolean\r\n unstyled?: boolean\r\n type?: 'button' | 'submit' | 'reset'\r\n }>(),\r\n {\r\n tooltip: '',\r\n tooltipClass: 'text-xs',\r\n label: '',\r\n icon: '',\r\n loading: false,\r\n class: '',\r\n outlined: false,\n severity: 'primary',\n secondary: false,\n disabled: false,\r\n unstyled: false,\r\n type: 'button',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\n click: []\n}>()\n\nconst resolvedSeverity = computed<TopButtonSeverity>(() =>\n props.secondary ? 'secondary' : props.severity,\n)\n\nconst buttonClasses = computed(() => {\n const baseClasses = !props.unstyled\n ? resolvedSeverity.value === 'secondary'\n ? 'rounded-[10px] border px-3 py-2 font-bold dark:!border-zinc-500 dark:!bg-zinc-700 dark:!text-zinc-100 dark:hover:!bg-zinc-600'\n : props.outlined\n ? resolvedSeverity.value === 'primary'\n ? 'shrink-0 rounded-[10px] border-primary-800 px-3 py-2 text-primary-800 hover:bg-primary-50 dark:border-primary-200 dark:bg-transparent dark:text-primary-100 dark:hover:bg-primary-900'\n : 'shrink-0 rounded-[10px] border px-3 py-2 font-bold'\n : resolvedSeverity.value === 'primary'\n ? 'rounded-[10px] !border-primary-900 bg-primary-900 px-3 py-2 font-bold text-white hover:!border-primary-800 hover:bg-primary-800 dark:!text-white'\n : 'rounded-[10px] border px-3 py-2 font-bold'\n : ''\r\n\r\n return twMerge(baseClasses, props.class)\r\n})\r\n</script>\r\n\r\n<template>\r\n <span class=\"top-button top-solutions-component h-fit w-fit rounded-[12px] bg-transparent\">\r\n <Button\r\n v-tooltip.top=\"{\r\n value: tooltip,\r\n class: tooltipClass,\r\n }\"\r\n :type=\"type\"\r\n :label=\"label\"\r\n :disabled=\"disabled || loading\"\r\n :icon=\"outrosIcones ? undefined : icon || undefined\"\r\n :loading=\"loading\"\r\n :outlined=\"outlined || resolvedSeverity === 'secondary'\"\n :severity=\"resolvedSeverity === 'primary' ? undefined : resolvedSeverity\"\n :class=\"buttonClasses\"\r\n :pt=\"{\r\n root: { class: buttonClasses },\r\n }\"\r\n @click=\"emit('click')\"\r\n >\r\n <template v-if=\"outrosIcones\" #icon>\r\n <slot name=\"icon\" />\r\n </template>\r\n </Button>\r\n </span>\r\n</template>\r\n\r\n<style>\r\n.top-button {\r\n width: fit-content;\r\n height: fit-content;\r\n border-radius: 12px;\r\n background-color: transparent;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed, useSlots } from 'vue'\r\nimport Button from 'primevue/button'\r\nimport vTooltip from 'primevue/tooltip'\nimport { twMerge } from 'tailwind-merge'\n\nexport type TopButtonSeverity = 'primary' | 'secondary' | 'success' | 'warn' | 'danger'\n\nconst slots = useSlots()\nconst outrosIcones = computed(() => Boolean(slots.icon))\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n tooltip?: string\r\n tooltipClass?: string\r\n label?: string\r\n icon?: string\r\n loading?: boolean\r\n class?: string\r\n outlined?: boolean\n severity?: TopButtonSeverity\n secondary?: boolean\n disabled?: boolean\r\n unstyled?: boolean\r\n type?: 'button' | 'submit' | 'reset'\r\n }>(),\r\n {\r\n tooltip: '',\r\n tooltipClass: 'text-xs',\r\n label: '',\r\n icon: '',\r\n loading: false,\r\n class: '',\r\n outlined: false,\n severity: 'primary',\n secondary: false,\n disabled: false,\r\n unstyled: false,\r\n type: 'button',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\n click: []\n}>()\n\nconst resolvedSeverity = computed<TopButtonSeverity>(() =>\n props.secondary ? 'secondary' : props.severity,\n)\n\nconst buttonClasses = computed(() => {\n const baseClasses = !props.unstyled\n ? resolvedSeverity.value === 'secondary'\n ? 'rounded-[10px] border px-3 py-2 font-bold dark:!border-zinc-500 dark:!bg-zinc-700 dark:!text-zinc-100 dark:hover:!bg-zinc-600'\n : props.outlined\n ? resolvedSeverity.value === 'primary'\n ? 'shrink-0 rounded-[10px] border-primary-800 px-3 py-2 text-primary-800 hover:bg-primary-50 dark:border-primary-200 dark:bg-transparent dark:text-primary-100 dark:hover:bg-primary-900'\n : 'shrink-0 rounded-[10px] border px-3 py-2 font-bold'\n : resolvedSeverity.value === 'primary'\n ? 'rounded-[10px] !border-primary-900 bg-primary-900 px-3 py-2 font-bold text-white hover:!border-primary-800 hover:bg-primary-800 dark:!text-white'\n : 'rounded-[10px] border px-3 py-2 font-bold'\n : ''\r\n\r\n return twMerge(baseClasses, props.class)\r\n})\r\n</script>\r\n\r\n<template>\r\n <span class=\"top-button top-solutions-component h-fit w-fit rounded-[12px] bg-transparent\">\r\n <Button\r\n v-tooltip.top=\"{\r\n value: tooltip,\r\n class: tooltipClass,\r\n }\"\r\n :type=\"type\"\r\n :label=\"label\"\r\n :disabled=\"disabled || loading\"\r\n :icon=\"outrosIcones ? undefined : icon || undefined\"\r\n :loading=\"loading\"\r\n :outlined=\"outlined || resolvedSeverity === 'secondary'\"\n :severity=\"resolvedSeverity === 'primary' ? undefined : resolvedSeverity\"\n :class=\"buttonClasses\"\r\n :pt=\"{\r\n root: { class: buttonClasses },\r\n }\"\r\n @click=\"emit('click')\"\r\n >\r\n <template v-if=\"outrosIcones\" #icon>\r\n <slot name=\"icon\" />\r\n </template>\r\n </Button>\r\n </span>\r\n</template>\r\n\r\n<style>\r\n.top-button {\r\n width: fit-content;\r\n height: fit-content;\r\n border-radius: 12px;\r\n background-color: transparent;\r\n}\r\n</style>\r\n","export const colors = {\n primary: {\n 50: '#EEF9FF',\n 100: '#DFF4FF',\n 200: '#C5E6F8',\n 300: '#8EC4DF',\n 400: '#66ACD1',\n 500: '#2488BC',\n 600: '#036DA3',\n 700: '#1B5783',\n 800: '#02466B',\n 900: '#052F4A',\n 950: '#0C192D',\n },\n secondary: {\n 50: '#FAFAFA',\n 100: '#F4F4F5',\n 200: '#E9E9E9',\n 300: '#D8D8D8',\n 400: '#B8B8B8',\n 500: '#8E8E8E',\n 600: '#676767',\n 700: '#4B4B4B',\n 800: '#343434',\n 900: '#1C1917',\n 950: '#0C0A09',\n },\n success: {\n 50: '#FAFFFA',\n 100: '#F4FBF6',\n 200: '#DFF6DE',\n 300: '#CBE3CA',\n 400: '#A3CCA1',\n 500: '#6BA968',\n 600: '#358F30',\n 700: '#2C7B27',\n 800: '#1E631A',\n 900: '#10430D',\n 950: '#062804',\n },\n warn: {\n 50: '#FFF7ED',\n 100: '#FDF3D8',\n 200: '#FDE9B2',\n 300: '#FDD566',\n 400: '#FFB900',\n 500: '#FFA515',\n 600: '#FD9024',\n 700: '#DD781F',\n 800: '#BC4E00',\n 900: '#A42D02',\n 950: '#792202',\n },\n danger: {\n 50: '#F8E6E4',\n 100: '#FFDDD9',\n 200: '#EEC1BC',\n 300: '#E3938C',\n 400: '#E3675C',\n 500: '#DC3F32',\n 600: '#CF150E',\n 700: '#B10404',\n 800: '#820907',\n 900: '#5D0803',\n 950: '#450501',\n },\n} as const\n","<script setup lang=\"ts\">\r\nimport { computed } from \"vue\";\r\nimport Dialog from \"primevue/dialog\";\r\nimport { colors } from \"../tokens/colors\";\r\nimport TopButton from \"./TopButton.vue\";\r\n\r\ntype ConfirmDialogSeverity = \"primary\" | \"danger\";\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: boolean;\r\n title?: string;\r\n message?: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n loading?: boolean;\r\n loadingText?: string;\r\n severity?: ConfirmDialogSeverity;\r\n icon?: string;\r\n }>(),\r\n {\r\n modelValue: false,\r\n title: \"Confirmar\",\r\n message: \"\",\r\n confirmText: \"Confirmar\",\r\n cancelText: \"Cancelar\",\r\n loading: false,\r\n loadingText: \"Processando...\",\r\n severity: \"danger\",\r\n icon: \"pi pi-exclamation-triangle\",\r\n }\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:modelValue\": [value: boolean];\r\n confirm: [];\r\n cancel: [];\r\n close: [];\r\n}>();\r\n\r\nconst visibleProxy = computed({\r\n get: () => props.modelValue,\r\n set: (value: boolean) => {\r\n if (!value && props.loading) return;\r\n emit(\"update:modelValue\", value);\r\n },\r\n});\r\n\r\nconst accentStyle = computed<Record<string, string>>(() => ({\r\n \"--top-confirm-dialog-accent\":\r\n props.severity === \"danger\" ? colors.danger[600] : colors.primary[800],\r\n \"--top-confirm-dialog-accent-hover\":\r\n props.severity === \"danger\" ? colors.danger[700] : colors.primary[700],\r\n}));\r\n\r\nconst confirmButtonClass = computed(() =>\r\n [\r\n \"px-3 py-2 text-sm\",\r\n props.severity === \"danger\" ? \"!border-red-600 !bg-red-600 hover:!border-red-700 hover:!bg-red-700\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")\r\n);\r\n\r\nfunction confirm() {\r\n if (props.loading) return;\r\n emit(\"confirm\");\r\n}\r\n\r\nfunction cancel() {\r\n if (props.loading) return;\r\n emit(\"cancel\");\r\n visibleProxy.value = false;\r\n}\r\n\r\nfunction close() {\r\n if (props.loading) return;\r\n visibleProxy.value = false;\r\n}\r\n</script>\r\n\r\n<template>\r\n <Dialog\r\n v-model:visible=\"visibleProxy\"\r\n modal\r\n :closable=\"false\"\r\n :close-on-escape=\"!loading\"\r\n :dismissable-mask=\"false\"\r\n :draggable=\"false\"\r\n :show-header=\"false\"\r\n :style=\"{ width: '500px', maxWidth: 'calc(100vw - 2rem)' }\"\r\n :aria-label=\"title\"\r\n :pt=\"{\r\n root: { class: 'top-confirm-dialog top-solutions-component' },\r\n content: { class: 'p-6' },\r\n footer: { class: 'hidden' },\r\n }\"\r\n @hide=\"emit('close')\"\r\n >\r\n <div\r\n class=\"relative flex flex-col items-center gap-4 text-center\"\r\n :style=\"accentStyle\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"absolute right-[-0.25rem] top-[-0.5rem] flex size-8 items-center justify-center rounded-full border-0 bg-transparent p-0 text-secondary-700 outline-none transition-colors hover:bg-secondary-200 focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:text-zinc-200 dark:hover:bg-zinc-700\"\r\n :aria-label=\"cancelText\"\r\n :disabled=\"loading\"\r\n @click=\"close\"\r\n >\r\n <i class=\"pi pi-times text-lg\" aria-hidden=\"true\" />\r\n </button>\r\n\r\n <div class=\"flex flex-col items-center gap-2 pt-2\">\r\n <i\r\n :class=\"[icon, 'top-confirm-dialog__icon text-[40px]']\"\r\n aria-hidden=\"true\"\r\n />\r\n <p class=\"text-base font-bold text-secondary-900 dark:text-zinc-100\">\r\n {{ title }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"text-sm leading-5 text-secondary-700 dark:text-zinc-300\">\r\n <slot name=\"message\">\r\n <slot>{{ message }}</slot>\r\n </slot>\r\n </div>\r\n\r\n <div class=\"mt-2 flex w-full items-center justify-center gap-3\">\r\n <TopButton\r\n :label=\"cancelText\"\r\n secondary\r\n :disabled=\"loading\"\r\n class=\"px-3 py-2 text-sm\"\r\n @click=\"cancel\"\r\n />\r\n <TopButton\r\n :label=\"loading ? loadingText : confirmText\"\r\n :loading=\"loading\"\r\n :class=\"confirmButtonClass\"\r\n @click=\"confirm\"\r\n />\r\n </div>\r\n </div>\r\n </Dialog>\r\n</template>\r\n\r\n<style>\r\n.top-confirm-dialog {\r\n border-radius: 10px;\r\n box-shadow: 0 4px 4px rgb(0 0 0 / 25%);\r\n}\r\n\r\n.top-confirm-dialog__icon {\r\n color: var(--top-confirm-dialog-accent);\r\n}\r\n\r\n.top-confirm-dialog__confirm--danger {\r\n border-color: var(--top-confirm-dialog-accent) !important;\r\n background-color: var(--top-confirm-dialog-accent) !important;\r\n}\r\n\r\n.top-confirm-dialog__confirm--danger:hover {\r\n border-color: var(--top-confirm-dialog-accent-hover) !important;\r\n background-color: var(--top-confirm-dialog-accent-hover) !important;\r\n}\r\n\r\n.top-confirm-dialog__confirm--danger:focus {\r\n box-shadow: 0 0 0 0.2rem var(--top-confirm-dialog-accent) !important;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed } from \"vue\";\r\nimport Dialog from \"primevue/dialog\";\r\nimport { colors } from \"../tokens/colors\";\r\nimport TopButton from \"./TopButton.vue\";\r\n\r\ntype ConfirmDialogSeverity = \"primary\" | \"danger\";\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: boolean;\r\n title?: string;\r\n message?: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n loading?: boolean;\r\n loadingText?: string;\r\n severity?: ConfirmDialogSeverity;\r\n icon?: string;\r\n }>(),\r\n {\r\n modelValue: false,\r\n title: \"Confirmar\",\r\n message: \"\",\r\n confirmText: \"Confirmar\",\r\n cancelText: \"Cancelar\",\r\n loading: false,\r\n loadingText: \"Processando...\",\r\n severity: \"danger\",\r\n icon: \"pi pi-exclamation-triangle\",\r\n }\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:modelValue\": [value: boolean];\r\n confirm: [];\r\n cancel: [];\r\n close: [];\r\n}>();\r\n\r\nconst visibleProxy = computed({\r\n get: () => props.modelValue,\r\n set: (value: boolean) => {\r\n if (!value && props.loading) return;\r\n emit(\"update:modelValue\", value);\r\n },\r\n});\r\n\r\nconst accentStyle = computed<Record<string, string>>(() => ({\r\n \"--top-confirm-dialog-accent\":\r\n props.severity === \"danger\" ? colors.danger[600] : colors.primary[800],\r\n \"--top-confirm-dialog-accent-hover\":\r\n props.severity === \"danger\" ? colors.danger[700] : colors.primary[700],\r\n}));\r\n\r\nconst confirmButtonClass = computed(() =>\r\n [\r\n \"px-3 py-2 text-sm\",\r\n props.severity === \"danger\" ? \"!border-red-600 !bg-red-600 hover:!border-red-700 hover:!bg-red-700\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")\r\n);\r\n\r\nfunction confirm() {\r\n if (props.loading) return;\r\n emit(\"confirm\");\r\n}\r\n\r\nfunction cancel() {\r\n if (props.loading) return;\r\n emit(\"cancel\");\r\n visibleProxy.value = false;\r\n}\r\n\r\nfunction close() {\r\n if (props.loading) return;\r\n visibleProxy.value = false;\r\n}\r\n</script>\r\n\r\n<template>\r\n <Dialog\r\n v-model:visible=\"visibleProxy\"\r\n modal\r\n :closable=\"false\"\r\n :close-on-escape=\"!loading\"\r\n :dismissable-mask=\"false\"\r\n :draggable=\"false\"\r\n :show-header=\"false\"\r\n :style=\"{ width: '500px', maxWidth: 'calc(100vw - 2rem)' }\"\r\n :aria-label=\"title\"\r\n :pt=\"{\r\n root: { class: 'top-confirm-dialog top-solutions-component' },\r\n content: { class: 'p-6' },\r\n footer: { class: 'hidden' },\r\n }\"\r\n @hide=\"emit('close')\"\r\n >\r\n <div\r\n class=\"relative flex flex-col items-center gap-4 text-center\"\r\n :style=\"accentStyle\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"absolute right-[-0.25rem] top-[-0.5rem] flex size-8 items-center justify-center rounded-full border-0 bg-transparent p-0 text-secondary-700 outline-none transition-colors hover:bg-secondary-200 focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:text-zinc-200 dark:hover:bg-zinc-700\"\r\n :aria-label=\"cancelText\"\r\n :disabled=\"loading\"\r\n @click=\"close\"\r\n >\r\n <i class=\"pi pi-times text-lg\" aria-hidden=\"true\" />\r\n </button>\r\n\r\n <div class=\"flex flex-col items-center gap-2 pt-2\">\r\n <i\r\n :class=\"[icon, 'top-confirm-dialog__icon text-[40px]']\"\r\n aria-hidden=\"true\"\r\n />\r\n <p class=\"text-base font-bold text-secondary-900 dark:text-zinc-100\">\r\n {{ title }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"text-sm leading-5 text-secondary-700 dark:text-zinc-300\">\r\n <slot name=\"message\">\r\n <slot>{{ message }}</slot>\r\n </slot>\r\n </div>\r\n\r\n <div class=\"mt-2 flex w-full items-center justify-center gap-3\">\r\n <TopButton\r\n :label=\"cancelText\"\r\n secondary\r\n :disabled=\"loading\"\r\n class=\"px-3 py-2 text-sm\"\r\n @click=\"cancel\"\r\n />\r\n <TopButton\r\n :label=\"loading ? loadingText : confirmText\"\r\n :loading=\"loading\"\r\n :class=\"confirmButtonClass\"\r\n @click=\"confirm\"\r\n />\r\n </div>\r\n </div>\r\n </Dialog>\r\n</template>\r\n\r\n<style>\r\n.top-confirm-dialog {\r\n border-radius: 10px;\r\n box-shadow: 0 4px 4px rgb(0 0 0 / 25%);\r\n}\r\n\r\n.top-confirm-dialog__icon {\r\n color: var(--top-confirm-dialog-accent);\r\n}\r\n\r\n.top-confirm-dialog__confirm--danger {\r\n border-color: var(--top-confirm-dialog-accent) !important;\r\n background-color: var(--top-confirm-dialog-accent) !important;\r\n}\r\n\r\n.top-confirm-dialog__confirm--danger:hover {\r\n border-color: var(--top-confirm-dialog-accent-hover) !important;\r\n background-color: var(--top-confirm-dialog-accent-hover) !important;\r\n}\r\n\r\n.top-confirm-dialog__confirm--danger:focus {\r\n box-shadow: 0 0 0 0.2rem var(--top-confirm-dialog-accent) !important;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed, useAttrs, useId, useSlots } from 'vue'\r\nimport DatePicker from 'primevue/datepicker'\r\nimport type {\r\n DatePickerBlurEvent,\r\n DatePickerMonthChangeEvent,\r\n DatePickerYearChangeEvent,\r\n} from 'primevue/datepicker'\r\n\r\nexport type TopDatePickerSelectionMode = 'single' | 'multiple' | 'range'\r\nexport type TopDatePickerValue = Date | Date[] | Array<Date | null> | null\r\n\r\ndefineOptions({ inheritAttrs: false })\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: TopDatePickerValue\r\n label?: string\r\n placeholder?: string\r\n required?: boolean\r\n error?: string\r\n invalid?: boolean\r\n disabled?: boolean\r\n readonly?: boolean\r\n selectionMode?: TopDatePickerSelectionMode\r\n dateFormat?: string\r\n minDate?: Date\r\n maxDate?: Date\r\n showIcon?: boolean\r\n iconDisplay?: 'button' | 'input'\r\n manualInput?: boolean\r\n showButtonBar?: boolean\r\n appendTo?: 'body' | 'self' | HTMLElement\r\n }>(),\r\n {\r\n modelValue: null,\r\n label: '',\r\n placeholder: 'dd/mm/aaaa',\r\n required: false,\r\n error: '',\r\n invalid: false,\r\n disabled: false,\r\n readonly: false,\r\n selectionMode: 'single',\r\n dateFormat: 'dd/mm/yy',\r\n minDate: undefined,\r\n maxDate: undefined,\r\n showIcon: true,\r\n iconDisplay: 'input',\r\n manualInput: true,\r\n showButtonBar: false,\r\n appendTo: 'body',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TopDatePickerValue]\r\n input: [event: Event]\r\n change: [event: Event]\r\n 'date-select': [value: Date]\r\n show: []\r\n hide: []\r\n 'today-click': [date: Date]\r\n 'clear-click': [event: Event]\r\n 'month-change': [event: DatePickerMonthChangeEvent]\r\n 'year-change': [event: DatePickerYearChangeEvent]\r\n focus: [event: Event]\r\n blur: [event: DatePickerBlurEvent]\r\n keydown: [event: Event]\r\n}>()\r\n\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst generatedId = useId()\r\n\r\nconst inputId = computed(() =>\r\n attrs.id === undefined || attrs.id === null || attrs.id === ''\r\n ? generatedId\r\n : String(attrs.id),\r\n)\r\nconst errorId = computed(() => `${inputId.value}-error`)\r\nconst isInvalid = computed(() => props.invalid || Boolean(props.error))\r\nconst usesBrazilianDateMask = computed(() =>\r\n props.manualInput &&\r\n !props.readonly &&\r\n !props.disabled &&\r\n props.selectionMode === 'single' &&\r\n props.dateFormat === 'dd/mm/yy',\r\n)\r\nconst ariaInvalid = computed<\r\n boolean | 'true' | 'false' | 'grammar' | 'spelling' | undefined\r\n>(() => {\r\n if (isInvalid.value) return true\r\n\r\n const value = attrs['aria-invalid']\r\n return typeof value === 'boolean' ||\r\n value === 'true' ||\r\n value === 'false' ||\r\n value === 'grammar' ||\r\n value === 'spelling'\r\n ? value\r\n : undefined\r\n})\r\nconst describedBy = computed(() => {\r\n const externalDescription = attrs['aria-describedby']\r\n const ids = [\r\n typeof externalDescription === 'string' ? externalDescription : '',\r\n props.error ? errorId.value : '',\r\n ].filter(Boolean)\r\n\r\n return ids.length ? ids.join(' ') : undefined\r\n})\r\nconst forwardedAttrs = computed(() => {\r\n const {\r\n id: _id,\r\n 'aria-describedby': _ariaDescribedby,\r\n 'aria-invalid': _ariaInvalid,\r\n ...rest\r\n } = attrs\r\n\r\n return rest\r\n})\r\nconst datePickerPt = computed(() => ({\r\n pcInputText: {\r\n root: {\r\n 'aria-describedby': describedBy.value,\r\n 'aria-invalid': ariaInvalid.value,\r\n onChange: (event: Event) => emit('change', event),\r\n inputmode: usesBrazilianDateMask.value ? 'numeric' : undefined,\r\n maxlength: usesBrazilianDateMask.value ? 10 : undefined,\r\n },\r\n },\r\n}))\r\n\r\nfunction updateModelValue(value: TopDatePickerValue | undefined) {\r\n emit('update:modelValue', value ?? null)\r\n}\r\n\r\nfunction handleInput(event: Event) {\r\n const input = event.target\r\n\r\n if (usesBrazilianDateMask.value && input instanceof HTMLInputElement && !(event as InputEvent).isComposing) {\r\n const digits = input.value.replace(/\\D/g, '').slice(0, 8)\r\n const formatted = [digits.slice(0, 2), digits.slice(2, 4), digits.slice(4, 8)]\r\n .filter(Boolean)\r\n .join('/')\r\n\r\n input.value = formatted\r\n }\r\n\r\n emit('input', event)\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"top-date-picker top-solutions-component flex w-full flex-col gap-1\">\r\n <label\r\n v-if=\"label\"\r\n :for=\"inputId\"\r\n class=\"top-field-label text-xs font-bold\"\r\n >\r\n {{ label }}\r\n <span v-if=\"required\" aria-hidden=\"true\" class=\"text-red-600 dark:text-red-400\">*</span>\r\n </label>\r\n\r\n <DatePicker\r\n v-bind=\"forwardedAttrs\"\r\n :model-value=\"modelValue\"\r\n :input-id=\"inputId\"\r\n :placeholder=\"placeholder\"\r\n :required=\"required\"\r\n :invalid=\"isInvalid\"\r\n :disabled=\"disabled\"\r\n :readonly=\"readonly\"\r\n :selection-mode=\"selectionMode\"\r\n :date-format=\"dateFormat\"\r\n update-model-type=\"date\"\r\n :min-date=\"minDate\"\r\n :max-date=\"maxDate\"\r\n :show-icon=\"showIcon\"\r\n :icon-display=\"iconDisplay\"\r\n :manual-input=\"manualInput\"\r\n :show-button-bar=\"showButtonBar\"\r\n :append-to=\"appendTo\"\r\n :pt=\"datePickerPt\"\r\n input-class=\"top-date-picker__input top-field-control h-[40px] w-full rounded-[10px] border px-3 py-2 text-xs read-only:cursor-default disabled:cursor-not-allowed\"\r\n panel-class=\"top-date-picker-panel top-solutions-component\"\r\n fluid\r\n @update:model-value=\"updateModelValue\"\r\n @input=\"handleInput\"\r\n @date-select=\"emit('date-select', $event)\"\r\n @show=\"emit('show')\"\r\n @hide=\"emit('hide')\"\r\n @today-click=\"emit('today-click', $event)\"\r\n @clear-click=\"emit('clear-click', $event)\"\r\n @month-change=\"emit('month-change', $event)\"\r\n @year-change=\"emit('year-change', $event)\"\r\n @focus=\"emit('focus', $event)\"\r\n @blur=\"emit('blur', $event)\"\r\n @keydown=\"emit('keydown', $event)\"\r\n >\r\n <template v-for=\"(_, name) in slots\" #[name]=\"slotProps\">\r\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\r\n </template>\r\n </DatePicker>\r\n\r\n <span\r\n v-if=\"error\"\r\n :id=\"errorId\"\r\n class=\"text-[11px] text-red-600 dark:text-red-400\"\r\n role=\"alert\"\r\n >\r\n {{ error }}\r\n </span>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.top-date-picker .p-datepicker {\r\n width: 100%;\r\n}\r\n\r\n.top-date-picker .p-datepicker-input-icon-container {\r\n color: var(--top-field-icon);\r\n}\r\n\r\n.top-date-picker-panel {\r\n border-radius: 10px;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed, useAttrs, useId, useSlots } from 'vue'\r\nimport DatePicker from 'primevue/datepicker'\r\nimport type {\r\n DatePickerBlurEvent,\r\n DatePickerMonthChangeEvent,\r\n DatePickerYearChangeEvent,\r\n} from 'primevue/datepicker'\r\n\r\nexport type TopDatePickerSelectionMode = 'single' | 'multiple' | 'range'\r\nexport type TopDatePickerValue = Date | Date[] | Array<Date | null> | null\r\n\r\ndefineOptions({ inheritAttrs: false })\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: TopDatePickerValue\r\n label?: string\r\n placeholder?: string\r\n required?: boolean\r\n error?: string\r\n invalid?: boolean\r\n disabled?: boolean\r\n readonly?: boolean\r\n selectionMode?: TopDatePickerSelectionMode\r\n dateFormat?: string\r\n minDate?: Date\r\n maxDate?: Date\r\n showIcon?: boolean\r\n iconDisplay?: 'button' | 'input'\r\n manualInput?: boolean\r\n showButtonBar?: boolean\r\n appendTo?: 'body' | 'self' | HTMLElement\r\n }>(),\r\n {\r\n modelValue: null,\r\n label: '',\r\n placeholder: 'dd/mm/aaaa',\r\n required: false,\r\n error: '',\r\n invalid: false,\r\n disabled: false,\r\n readonly: false,\r\n selectionMode: 'single',\r\n dateFormat: 'dd/mm/yy',\r\n minDate: undefined,\r\n maxDate: undefined,\r\n showIcon: true,\r\n iconDisplay: 'input',\r\n manualInput: true,\r\n showButtonBar: false,\r\n appendTo: 'body',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TopDatePickerValue]\r\n input: [event: Event]\r\n change: [event: Event]\r\n 'date-select': [value: Date]\r\n show: []\r\n hide: []\r\n 'today-click': [date: Date]\r\n 'clear-click': [event: Event]\r\n 'month-change': [event: DatePickerMonthChangeEvent]\r\n 'year-change': [event: DatePickerYearChangeEvent]\r\n focus: [event: Event]\r\n blur: [event: DatePickerBlurEvent]\r\n keydown: [event: Event]\r\n}>()\r\n\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst generatedId = useId()\r\n\r\nconst inputId = computed(() =>\r\n attrs.id === undefined || attrs.id === null || attrs.id === ''\r\n ? generatedId\r\n : String(attrs.id),\r\n)\r\nconst errorId = computed(() => `${inputId.value}-error`)\r\nconst isInvalid = computed(() => props.invalid || Boolean(props.error))\r\nconst usesBrazilianDateMask = computed(() =>\r\n props.manualInput &&\r\n !props.readonly &&\r\n !props.disabled &&\r\n props.selectionMode === 'single' &&\r\n props.dateFormat === 'dd/mm/yy',\r\n)\r\nconst ariaInvalid = computed<\r\n boolean | 'true' | 'false' | 'grammar' | 'spelling' | undefined\r\n>(() => {\r\n if (isInvalid.value) return true\r\n\r\n const value = attrs['aria-invalid']\r\n return typeof value === 'boolean' ||\r\n value === 'true' ||\r\n value === 'false' ||\r\n value === 'grammar' ||\r\n value === 'spelling'\r\n ? value\r\n : undefined\r\n})\r\nconst describedBy = computed(() => {\r\n const externalDescription = attrs['aria-describedby']\r\n const ids = [\r\n typeof externalDescription === 'string' ? externalDescription : '',\r\n props.error ? errorId.value : '',\r\n ].filter(Boolean)\r\n\r\n return ids.length ? ids.join(' ') : undefined\r\n})\r\nconst forwardedAttrs = computed(() => {\r\n const {\r\n id: _id,\r\n 'aria-describedby': _ariaDescribedby,\r\n 'aria-invalid': _ariaInvalid,\r\n ...rest\r\n } = attrs\r\n\r\n return rest\r\n})\r\nconst datePickerPt = computed(() => ({\r\n pcInputText: {\r\n root: {\r\n 'aria-describedby': describedBy.value,\r\n 'aria-invalid': ariaInvalid.value,\r\n onChange: (event: Event) => emit('change', event),\r\n inputmode: usesBrazilianDateMask.value ? 'numeric' : undefined,\r\n maxlength: usesBrazilianDateMask.value ? 10 : undefined,\r\n },\r\n },\r\n}))\r\n\r\nfunction updateModelValue(value: TopDatePickerValue | undefined) {\r\n emit('update:modelValue', value ?? null)\r\n}\r\n\r\nfunction handleInput(event: Event) {\r\n const input = event.target\r\n\r\n if (usesBrazilianDateMask.value && input instanceof HTMLInputElement && !(event as InputEvent).isComposing) {\r\n const digits = input.value.replace(/\\D/g, '').slice(0, 8)\r\n const formatted = [digits.slice(0, 2), digits.slice(2, 4), digits.slice(4, 8)]\r\n .filter(Boolean)\r\n .join('/')\r\n\r\n input.value = formatted\r\n }\r\n\r\n emit('input', event)\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"top-date-picker top-solutions-component flex w-full flex-col gap-1\">\r\n <label\r\n v-if=\"label\"\r\n :for=\"inputId\"\r\n class=\"top-field-label text-xs font-bold\"\r\n >\r\n {{ label }}\r\n <span v-if=\"required\" aria-hidden=\"true\" class=\"text-red-600 dark:text-red-400\">*</span>\r\n </label>\r\n\r\n <DatePicker\r\n v-bind=\"forwardedAttrs\"\r\n :model-value=\"modelValue\"\r\n :input-id=\"inputId\"\r\n :placeholder=\"placeholder\"\r\n :required=\"required\"\r\n :invalid=\"isInvalid\"\r\n :disabled=\"disabled\"\r\n :readonly=\"readonly\"\r\n :selection-mode=\"selectionMode\"\r\n :date-format=\"dateFormat\"\r\n update-model-type=\"date\"\r\n :min-date=\"minDate\"\r\n :max-date=\"maxDate\"\r\n :show-icon=\"showIcon\"\r\n :icon-display=\"iconDisplay\"\r\n :manual-input=\"manualInput\"\r\n :show-button-bar=\"showButtonBar\"\r\n :append-to=\"appendTo\"\r\n :pt=\"datePickerPt\"\r\n input-class=\"top-date-picker__input top-field-control h-[40px] w-full rounded-[10px] border px-3 py-2 text-xs read-only:cursor-default disabled:cursor-not-allowed\"\r\n panel-class=\"top-date-picker-panel top-solutions-component\"\r\n fluid\r\n @update:model-value=\"updateModelValue\"\r\n @input=\"handleInput\"\r\n @date-select=\"emit('date-select', $event)\"\r\n @show=\"emit('show')\"\r\n @hide=\"emit('hide')\"\r\n @today-click=\"emit('today-click', $event)\"\r\n @clear-click=\"emit('clear-click', $event)\"\r\n @month-change=\"emit('month-change', $event)\"\r\n @year-change=\"emit('year-change', $event)\"\r\n @focus=\"emit('focus', $event)\"\r\n @blur=\"emit('blur', $event)\"\r\n @keydown=\"emit('keydown', $event)\"\r\n >\r\n <template v-for=\"(_, name) in slots\" #[name]=\"slotProps\">\r\n <slot :name=\"name\" v-bind=\"slotProps ?? {}\" />\r\n </template>\r\n </DatePicker>\r\n\r\n <span\r\n v-if=\"error\"\r\n :id=\"errorId\"\r\n class=\"text-[11px] text-red-600 dark:text-red-400\"\r\n role=\"alert\"\r\n >\r\n {{ error }}\r\n </span>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.top-date-picker .p-datepicker {\r\n width: 100%;\r\n}\r\n\r\n.top-date-picker .p-datepicker-input-icon-container {\r\n color: var(--top-field-icon);\r\n}\r\n\r\n.top-date-picker-panel {\r\n border-radius: 10px;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useAttrs, useId, watch } from 'vue'\r\nimport FileUpload from 'primevue/fileupload'\r\nimport type { FileUploadSelectEvent } from 'primevue/fileupload'\r\nimport TopButton from './TopButton.vue'\r\n\r\nexport type TopFileUploadValue = File | File[] | null\r\n\r\nexport type TopFileUploadErrorCode = 'file-type' | 'file-size' | 'file-limit'\r\n\r\nexport type TopFileUploadError = {\r\n code: TopFileUploadErrorCode\r\n message: string\r\n file?: File\r\n}\r\n\r\ntype FileUploadInstance = {\r\n choose: () => void\r\n files: File[]\r\n}\r\n\r\ndefineOptions({ inheritAttrs: false })\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: TopFileUploadValue\r\n label?: string\r\n placeholder?: string\r\n required?: boolean\r\n disabled?: boolean\r\n accept?: string\r\n multiple?: boolean\r\n maxFileSize?: number | null\r\n maxFiles?: number | null\r\n error?: string\r\n selectLabel?: string\r\n removeLabel?: string\r\n loading?: boolean\r\n }>(),\r\n {\r\n modelValue: null,\r\n label: '',\r\n placeholder: 'Arraste e solte o arquivo aqui',\r\n required: false,\r\n disabled: false,\r\n accept: '',\r\n multiple: false,\r\n maxFileSize: null,\r\n maxFiles: null,\r\n error: '',\r\n selectLabel: 'Selecionar arquivo',\r\n removeLabel: 'Remover',\r\n loading: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TopFileUploadValue]\r\n select: [files: File[]]\r\n change: [value: TopFileUploadValue]\r\n remove: [file: File, index: number]\r\n clear: []\r\n error: [errors: TopFileUploadError[]]\r\n}>()\r\n\r\nconst attrs = useAttrs()\r\nconst generatedId = useId()\r\nconst fileUploadRef = ref<FileUploadInstance | null>(null)\r\nconst internalFiles = ref<File[]>(normalizeValue(props.modelValue))\r\nconst validationErrors = ref<TopFileUploadError[]>([])\r\nconst previewUrls = new Map<File, string>()\r\n\r\nconst inputId = computed(() =>\r\n attrs.id === undefined || attrs.id === null || attrs.id === ''\r\n ? generatedId\r\n : String(attrs.id),\r\n)\r\nconst errorId = computed(() => `${inputId.value}-error`)\r\nconst effectiveError = computed(() => props.error || validationErrors.value[0]?.message || '')\r\nconst isInteractionDisabled = computed(() => props.disabled || props.loading)\r\nconst describedBy = computed(() => {\r\n const externalDescription = attrs['aria-describedby']\r\n const ids = [\r\n typeof externalDescription === 'string' ? externalDescription : '',\r\n effectiveError.value ? errorId.value : '',\r\n ].filter(Boolean)\r\n\r\n return ids.length ? ids.join(' ') : undefined\r\n})\r\nconst inputAttrs = computed(() => ({\r\n ...attrs,\r\n id: inputId.value,\r\n required: props.required,\r\n 'aria-invalid': effectiveError.value ? true : attrs['aria-invalid'],\r\n 'aria-describedby': describedBy.value,\r\n 'aria-label': attrs['aria-label'] || (!props.label ? props.selectLabel : undefined),\r\n}))\r\n\r\nfunction normalizeValue(value: TopFileUploadValue | undefined) {\r\n if (!value) return []\r\n if (Array.isArray(value)) return props.multiple ? [...value] : value.slice(0, 1)\r\n return [value]\r\n}\r\n\r\nfunction sameFile(left: File, right: File) {\r\n return left.name === right.name && left.type === right.type && left.size === right.size\r\n}\r\n\r\nfunction fileTypeIsAccepted(file: File) {\r\n if (!props.accept.trim()) return true\r\n\r\n return props.accept.split(',').some((acceptedType) => {\r\n const accepted = acceptedType.trim().toLowerCase()\r\n const fileType = file.type.toLowerCase()\r\n\r\n if (!accepted) return false\r\n if (accepted.startsWith('.')) return file.name.toLowerCase().endsWith(accepted)\r\n if (accepted.endsWith('/*')) return fileType.startsWith(accepted.slice(0, -1))\r\n return fileType === accepted\r\n })\r\n}\r\n\r\nfunction formatFileSize(size: number) {\r\n if (size < 1024) return `${size} B`\r\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`\r\n return `${(size / (1024 * 1024)).toFixed(2)} MB`\r\n}\r\n\r\nfunction validateFiles(files: File[]) {\r\n const errors: TopFileUploadError[] = []\r\n const validFiles = files.filter((file) => {\r\n if (!fileTypeIsAccepted(file)) {\r\n errors.push({\r\n code: 'file-type',\r\n file,\r\n message: `O arquivo \"${file.name}\" não possui um tipo aceito.`,\r\n })\r\n return false\r\n }\r\n\r\n if (props.maxFileSize && file.size > props.maxFileSize) {\r\n errors.push({\r\n code: 'file-size',\r\n file,\r\n message: `O arquivo \"${file.name}\" excede o tamanho máximo de ${formatFileSize(props.maxFileSize)}.`,\r\n })\r\n return false\r\n }\r\n\r\n return true\r\n })\r\n\r\n return { errors, validFiles }\r\n}\r\n\r\nfunction selectedFilesFrom(event: FileUploadSelectEvent) {\r\n const originalEvent = event.originalEvent as Event & {\r\n dataTransfer?: DataTransfer\r\n target: (EventTarget & { files?: FileList }) | null\r\n }\r\n return Array.from(originalEvent.dataTransfer?.files ?? originalEvent.target?.files ?? [])\r\n}\r\n\r\nfunction valueFrom(files: File[]): TopFileUploadValue {\r\n return props.multiple ? [...files] : files[0] ?? null\r\n}\r\n\r\nfunction syncPrimeVueFiles() {\r\n if (fileUploadRef.value) fileUploadRef.value.files = [...internalFiles.value]\r\n}\r\n\r\nfunction updateFiles(files: File[], eventName: 'select' | 'remove' | 'clear') {\r\n internalFiles.value = files\r\n validationErrors.value = []\r\n cleanUnusedPreviewUrls()\r\n nextTick(syncPrimeVueFiles)\r\n\r\n const value = valueFrom(files)\r\n emit('update:modelValue', value)\r\n emit('change', value)\r\n\r\n if (eventName === 'select') emit('select', [...files])\r\n if (eventName === 'clear') emit('clear')\r\n}\r\n\r\nfunction onSelect(event: FileUploadSelectEvent) {\r\n const selected = selectedFilesFrom(event)\r\n const { errors, validFiles } = validateFiles(selected)\r\n let nextFiles = props.multiple\r\n ? [...internalFiles.value, ...validFiles.filter((file) => !internalFiles.value.some((current) => sameFile(current, file)))]\r\n : validFiles.slice(-1)\r\n\r\n if (props.maxFiles && nextFiles.length > props.maxFiles) {\r\n const rejectedFiles = nextFiles.slice(props.maxFiles)\r\n errors.push(...rejectedFiles.map((file) => ({\r\n code: 'file-limit' as const,\r\n file,\r\n message: `O limite máximo é de ${props.maxFiles} arquivo(s).`,\r\n })))\r\n nextFiles = nextFiles.slice(0, props.maxFiles)\r\n }\r\n\r\n if (errors.length) {\r\n validationErrors.value = errors\r\n emit('error', errors)\r\n } else {\r\n validationErrors.value = []\r\n }\r\n\r\n syncPrimeVueFiles()\r\n if (validFiles.length && !sameFileList(nextFiles, internalFiles.value)) {\r\n internalFiles.value = nextFiles\r\n cleanUnusedPreviewUrls()\r\n nextTick(syncPrimeVueFiles)\r\n const value = valueFrom(nextFiles)\r\n emit('update:modelValue', value)\r\n emit('change', value)\r\n emit('select', [...nextFiles])\r\n }\r\n}\r\n\r\nfunction sameFileList(left: File[], right: File[]) {\r\n return left.length === right.length && left.every((file, index) => sameFile(file, right[index]))\r\n}\r\n\r\nfunction choose() {\r\n if (!isInteractionDisabled.value) fileUploadRef.value?.choose()\r\n}\r\n\r\nfunction removeFile(removeFileCallback: (index: number) => void, index: number) {\r\n if (isInteractionDisabled.value) return\r\n const removedFile = internalFiles.value[index]\r\n if (!removedFile) return\r\n\r\n removeFileCallback(index)\r\n const nextFiles = internalFiles.value.filter((_, fileIndex) => fileIndex !== index)\r\n updateFiles(nextFiles, 'remove')\r\n emit('remove', removedFile, index)\r\n if (!nextFiles.length) emit('clear')\r\n}\r\n\r\nfunction clear() {\r\n if (isInteractionDisabled.value || !internalFiles.value.length) return\r\n updateFiles([], 'clear')\r\n}\r\n\r\nfunction previewUrl(file: File) {\r\n if (!file.type.startsWith('image/') || typeof URL.createObjectURL !== 'function') return ''\r\n const currentUrl = previewUrls.get(file)\r\n if (currentUrl) return currentUrl\r\n\r\n const url = URL.createObjectURL(file)\r\n previewUrls.set(file, url)\r\n return url\r\n}\r\n\r\nfunction cleanUnusedPreviewUrls() {\r\n for (const [file, url] of previewUrls) {\r\n if (!internalFiles.value.includes(file)) {\r\n URL.revokeObjectURL(url)\r\n previewUrls.delete(file)\r\n }\r\n }\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (value) => {\r\n const nextFiles = normalizeValue(value)\r\n if (sameFileList(nextFiles, internalFiles.value)) return\r\n internalFiles.value = nextFiles\r\n validationErrors.value = []\r\n cleanUnusedPreviewUrls()\r\n nextTick(syncPrimeVueFiles)\r\n },\r\n)\r\n\r\nwatch(() => props.multiple, () => {\r\n const nextFiles = normalizeValue(props.modelValue)\r\n internalFiles.value = nextFiles\r\n cleanUnusedPreviewUrls()\r\n nextTick(syncPrimeVueFiles)\r\n})\r\n\r\nonMounted(syncPrimeVueFiles)\r\n\r\nonBeforeUnmount(() => {\r\n for (const url of previewUrls.values()) URL.revokeObjectURL(url)\r\n previewUrls.clear()\r\n})\r\n\r\ndefineExpose({ choose, clear })\r\n</script>\r\n\r\n<template>\r\n <div class=\"top-file-upload 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 <FileUpload\r\n ref=\"fileUploadRef\"\r\n mode=\"advanced\"\r\n :accept=\"accept || undefined\"\r\n :multiple=\"multiple\"\r\n :disabled=\"isInteractionDisabled\"\r\n :custom-upload=\"true\"\r\n :show-upload-button=\"false\"\r\n :show-cancel-button=\"false\"\r\n :pt=\"{\r\n root: { class: 'top-file-upload__root w-full' },\r\n header: { class: 'hidden' },\r\n input: inputAttrs,\r\n content: {\r\n class: [\r\n 'top-file-upload__dropzone min-h-[164px] rounded-[10px] border border-dashed p-4 transition-colors',\r\n effectiveError\r\n ? 'border-red-600 bg-red-50 dark:border-red-400 dark:bg-red-950/20'\r\n : 'border-secondary-400 bg-secondary-50 hover:border-primary-600 hover:bg-primary-50 dark:border-zinc-600 dark:bg-zinc-800 dark:hover:border-primary-400 dark:hover:bg-zinc-700',\r\n isInteractionDisabled ? 'cursor-not-allowed opacity-60' : '',\r\n ].join(' '),\r\n },\r\n }\"\r\n @select=\"onSelect\"\r\n >\r\n <template #content=\"{ removeFileCallback }\">\r\n <div class=\"flex min-h-[130px] w-full flex-col items-center justify-center gap-3\">\r\n <slot\r\n v-if=\"!internalFiles.length\"\r\n name=\"empty\"\r\n :choose=\"choose\"\r\n :disabled=\"isInteractionDisabled\"\r\n >\r\n <i\r\n :class=\"[\r\n loading ? 'pi pi-spin pi-spinner' : 'pi pi-cloud-upload',\r\n 'text-4xl text-primary-800 dark:text-primary-300',\r\n ]\"\r\n aria-hidden=\"true\"\r\n />\r\n <p class=\"m-0 text-center text-xs text-secondary-600 dark:text-zinc-300\">\r\n {{ placeholder }}\r\n </p>\r\n <TopButton\r\n :label=\"selectLabel\"\r\n icon=\"pi pi-plus-circle\"\r\n :disabled=\"disabled\"\r\n :loading=\"loading\"\r\n class=\"px-3 py-2 text-xs\"\r\n @click=\"choose\"\r\n />\r\n </slot>\r\n\r\n <div v-else class=\"flex w-full flex-col gap-2\">\r\n <div\r\n v-for=\"(file, index) in internalFiles\"\r\n :key=\"`${file.name}-${file.size}-${file.lastModified}`\"\r\n class=\"flex min-w-0 items-center gap-3 rounded-[10px] border border-secondary-300 bg-white p-3 dark:border-zinc-600 dark:bg-zinc-900\"\r\n >\r\n <slot name=\"preview\" :file=\"file\" :index=\"index\" :url=\"previewUrl(file)\">\r\n <img\r\n v-if=\"previewUrl(file)\"\r\n :src=\"previewUrl(file)\"\r\n :alt=\"`Pré-visualização de ${file.name}`\"\r\n class=\"size-12 shrink-0 rounded-lg object-cover\"\r\n />\r\n <span\r\n v-else\r\n class=\"flex size-12 shrink-0 items-center justify-center rounded-lg bg-primary-50 text-primary-800 dark:bg-primary-950 dark:text-primary-200\"\r\n >\r\n <i class=\"pi pi-file text-2xl\" aria-hidden=\"true\" />\r\n </span>\r\n </slot>\r\n\r\n <div class=\"min-w-0 flex-1\">\r\n <p class=\"m-0 truncate text-xs font-bold text-secondary-900 dark:text-zinc-100\">\r\n {{ file.name }}\r\n </p>\r\n <span class=\"text-[11px] text-secondary-500 dark:text-zinc-400\">\r\n {{ formatFileSize(file.size) }}\r\n </span>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"flex size-8 shrink-0 items-center justify-center rounded-full border-0 bg-transparent p-0 text-red-600 transition-colors hover:bg-red-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:text-red-400 dark:hover:bg-red-950/40 dark:focus-visible:ring-offset-zinc-900\"\r\n :aria-label=\"`${removeLabel}: ${file.name}`\"\r\n :disabled=\"isInteractionDisabled\"\r\n @click=\"removeFile(removeFileCallback, index)\"\r\n >\r\n <i class=\"pi pi-times\" aria-hidden=\"true\" />\r\n </button>\r\n </div>\r\n\r\n <TopButton\r\n v-if=\"multiple && (!maxFiles || internalFiles.length < maxFiles)\"\r\n :label=\"selectLabel\"\r\n icon=\"pi pi-plus-circle\"\r\n outlined\r\n :disabled=\"disabled\"\r\n :loading=\"loading\"\r\n class=\"mt-1 px-3 py-2 text-xs\"\r\n @click=\"choose\"\r\n />\r\n </div>\r\n </div>\r\n </template>\r\n </FileUpload>\r\n\r\n <span\r\n v-if=\"effectiveError\"\r\n :id=\"errorId\"\r\n class=\"text-[11px] text-red-600 dark:text-red-400\"\r\n role=\"alert\"\r\n >\r\n {{ effectiveError }}\r\n </span>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.top-file-upload__root,\r\n.top-file-upload__dropzone {\r\n width: 100%;\r\n}\r\n\r\n.top-file-upload__root {\r\n border: 0;\r\n background: transparent;\r\n}\r\n\r\n.top-file-upload__dropzone[data-p-highlight='true'] {\r\n border-color: var(--top-primary-600) !important;\r\n background: var(--top-primary-100) !important;\r\n}\r\n\r\n.dark .top-file-upload__dropzone[data-p-highlight='true'] {\r\n border-color: var(--top-primary-400) !important;\r\n background: var(--top-primary-950) !important;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useAttrs, useId, watch } from 'vue'\r\nimport FileUpload from 'primevue/fileupload'\r\nimport type { FileUploadSelectEvent } from 'primevue/fileupload'\r\nimport TopButton from './TopButton.vue'\r\n\r\nexport type TopFileUploadValue = File | File[] | null\r\n\r\nexport type TopFileUploadErrorCode = 'file-type' | 'file-size' | 'file-limit'\r\n\r\nexport type TopFileUploadError = {\r\n code: TopFileUploadErrorCode\r\n message: string\r\n file?: File\r\n}\r\n\r\ntype FileUploadInstance = {\r\n choose: () => void\r\n files: File[]\r\n}\r\n\r\ndefineOptions({ inheritAttrs: false })\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: TopFileUploadValue\r\n label?: string\r\n placeholder?: string\r\n required?: boolean\r\n disabled?: boolean\r\n accept?: string\r\n multiple?: boolean\r\n maxFileSize?: number | null\r\n maxFiles?: number | null\r\n error?: string\r\n selectLabel?: string\r\n removeLabel?: string\r\n loading?: boolean\r\n }>(),\r\n {\r\n modelValue: null,\r\n label: '',\r\n placeholder: 'Arraste e solte o arquivo aqui',\r\n required: false,\r\n disabled: false,\r\n accept: '',\r\n multiple: false,\r\n maxFileSize: null,\r\n maxFiles: null,\r\n error: '',\r\n selectLabel: 'Selecionar arquivo',\r\n removeLabel: 'Remover',\r\n loading: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: TopFileUploadValue]\r\n select: [files: File[]]\r\n change: [value: TopFileUploadValue]\r\n remove: [file: File, index: number]\r\n clear: []\r\n error: [errors: TopFileUploadError[]]\r\n}>()\r\n\r\nconst attrs = useAttrs()\r\nconst generatedId = useId()\r\nconst fileUploadRef = ref<FileUploadInstance | null>(null)\r\nconst internalFiles = ref<File[]>(normalizeValue(props.modelValue))\r\nconst validationErrors = ref<TopFileUploadError[]>([])\r\nconst previewUrls = new Map<File, string>()\r\n\r\nconst inputId = computed(() =>\r\n attrs.id === undefined || attrs.id === null || attrs.id === ''\r\n ? generatedId\r\n : String(attrs.id),\r\n)\r\nconst errorId = computed(() => `${inputId.value}-error`)\r\nconst effectiveError = computed(() => props.error || validationErrors.value[0]?.message || '')\r\nconst isInteractionDisabled = computed(() => props.disabled || props.loading)\r\nconst describedBy = computed(() => {\r\n const externalDescription = attrs['aria-describedby']\r\n const ids = [\r\n typeof externalDescription === 'string' ? externalDescription : '',\r\n effectiveError.value ? errorId.value : '',\r\n ].filter(Boolean)\r\n\r\n return ids.length ? ids.join(' ') : undefined\r\n})\r\nconst inputAttrs = computed(() => ({\r\n ...attrs,\r\n id: inputId.value,\r\n required: props.required,\r\n 'aria-invalid': effectiveError.value ? true : attrs['aria-invalid'],\r\n 'aria-describedby': describedBy.value,\r\n 'aria-label': attrs['aria-label'] || (!props.label ? props.selectLabel : undefined),\r\n}))\r\n\r\nfunction normalizeValue(value: TopFileUploadValue | undefined) {\r\n if (!value) return []\r\n if (Array.isArray(value)) return props.multiple ? [...value] : value.slice(0, 1)\r\n return [value]\r\n}\r\n\r\nfunction sameFile(left: File, right: File) {\r\n return left.name === right.name && left.type === right.type && left.size === right.size\r\n}\r\n\r\nfunction fileTypeIsAccepted(file: File) {\r\n if (!props.accept.trim()) return true\r\n\r\n return props.accept.split(',').some((acceptedType) => {\r\n const accepted = acceptedType.trim().toLowerCase()\r\n const fileType = file.type.toLowerCase()\r\n\r\n if (!accepted) return false\r\n if (accepted.startsWith('.')) return file.name.toLowerCase().endsWith(accepted)\r\n if (accepted.endsWith('/*')) return fileType.startsWith(accepted.slice(0, -1))\r\n return fileType === accepted\r\n })\r\n}\r\n\r\nfunction formatFileSize(size: number) {\r\n if (size < 1024) return `${size} B`\r\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`\r\n return `${(size / (1024 * 1024)).toFixed(2)} MB`\r\n}\r\n\r\nfunction validateFiles(files: File[]) {\r\n const errors: TopFileUploadError[] = []\r\n const validFiles = files.filter((file) => {\r\n if (!fileTypeIsAccepted(file)) {\r\n errors.push({\r\n code: 'file-type',\r\n file,\r\n message: `O arquivo \"${file.name}\" não possui um tipo aceito.`,\r\n })\r\n return false\r\n }\r\n\r\n if (props.maxFileSize && file.size > props.maxFileSize) {\r\n errors.push({\r\n code: 'file-size',\r\n file,\r\n message: `O arquivo \"${file.name}\" excede o tamanho máximo de ${formatFileSize(props.maxFileSize)}.`,\r\n })\r\n return false\r\n }\r\n\r\n return true\r\n })\r\n\r\n return { errors, validFiles }\r\n}\r\n\r\nfunction selectedFilesFrom(event: FileUploadSelectEvent) {\r\n const originalEvent = event.originalEvent as Event & {\r\n dataTransfer?: DataTransfer\r\n target: (EventTarget & { files?: FileList }) | null\r\n }\r\n return Array.from(originalEvent.dataTransfer?.files ?? originalEvent.target?.files ?? [])\r\n}\r\n\r\nfunction valueFrom(files: File[]): TopFileUploadValue {\r\n return props.multiple ? [...files] : files[0] ?? null\r\n}\r\n\r\nfunction syncPrimeVueFiles() {\r\n if (fileUploadRef.value) fileUploadRef.value.files = [...internalFiles.value]\r\n}\r\n\r\nfunction updateFiles(files: File[], eventName: 'select' | 'remove' | 'clear') {\r\n internalFiles.value = files\r\n validationErrors.value = []\r\n cleanUnusedPreviewUrls()\r\n nextTick(syncPrimeVueFiles)\r\n\r\n const value = valueFrom(files)\r\n emit('update:modelValue', value)\r\n emit('change', value)\r\n\r\n if (eventName === 'select') emit('select', [...files])\r\n if (eventName === 'clear') emit('clear')\r\n}\r\n\r\nfunction onSelect(event: FileUploadSelectEvent) {\r\n const selected = selectedFilesFrom(event)\r\n const { errors, validFiles } = validateFiles(selected)\r\n let nextFiles = props.multiple\r\n ? [...internalFiles.value, ...validFiles.filter((file) => !internalFiles.value.some((current) => sameFile(current, file)))]\r\n : validFiles.slice(-1)\r\n\r\n if (props.maxFiles && nextFiles.length > props.maxFiles) {\r\n const rejectedFiles = nextFiles.slice(props.maxFiles)\r\n errors.push(...rejectedFiles.map((file) => ({\r\n code: 'file-limit' as const,\r\n file,\r\n message: `O limite máximo é de ${props.maxFiles} arquivo(s).`,\r\n })))\r\n nextFiles = nextFiles.slice(0, props.maxFiles)\r\n }\r\n\r\n if (errors.length) {\r\n validationErrors.value = errors\r\n emit('error', errors)\r\n } else {\r\n validationErrors.value = []\r\n }\r\n\r\n syncPrimeVueFiles()\r\n if (validFiles.length && !sameFileList(nextFiles, internalFiles.value)) {\r\n internalFiles.value = nextFiles\r\n cleanUnusedPreviewUrls()\r\n nextTick(syncPrimeVueFiles)\r\n const value = valueFrom(nextFiles)\r\n emit('update:modelValue', value)\r\n emit('change', value)\r\n emit('select', [...nextFiles])\r\n }\r\n}\r\n\r\nfunction sameFileList(left: File[], right: File[]) {\r\n return left.length === right.length && left.every((file, index) => sameFile(file, right[index]))\r\n}\r\n\r\nfunction choose() {\r\n if (!isInteractionDisabled.value) fileUploadRef.value?.choose()\r\n}\r\n\r\nfunction removeFile(removeFileCallback: (index: number) => void, index: number) {\r\n if (isInteractionDisabled.value) return\r\n const removedFile = internalFiles.value[index]\r\n if (!removedFile) return\r\n\r\n removeFileCallback(index)\r\n const nextFiles = internalFiles.value.filter((_, fileIndex) => fileIndex !== index)\r\n updateFiles(nextFiles, 'remove')\r\n emit('remove', removedFile, index)\r\n if (!nextFiles.length) emit('clear')\r\n}\r\n\r\nfunction clear() {\r\n if (isInteractionDisabled.value || !internalFiles.value.length) return\r\n updateFiles([], 'clear')\r\n}\r\n\r\nfunction previewUrl(file: File) {\r\n if (!file.type.startsWith('image/') || typeof URL.createObjectURL !== 'function') return ''\r\n const currentUrl = previewUrls.get(file)\r\n if (currentUrl) return currentUrl\r\n\r\n const url = URL.createObjectURL(file)\r\n previewUrls.set(file, url)\r\n return url\r\n}\r\n\r\nfunction cleanUnusedPreviewUrls() {\r\n for (const [file, url] of previewUrls) {\r\n if (!internalFiles.value.includes(file)) {\r\n URL.revokeObjectURL(url)\r\n previewUrls.delete(file)\r\n }\r\n }\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (value) => {\r\n const nextFiles = normalizeValue(value)\r\n if (sameFileList(nextFiles, internalFiles.value)) return\r\n internalFiles.value = nextFiles\r\n validationErrors.value = []\r\n cleanUnusedPreviewUrls()\r\n nextTick(syncPrimeVueFiles)\r\n },\r\n)\r\n\r\nwatch(() => props.multiple, () => {\r\n const nextFiles = normalizeValue(props.modelValue)\r\n internalFiles.value = nextFiles\r\n cleanUnusedPreviewUrls()\r\n nextTick(syncPrimeVueFiles)\r\n})\r\n\r\nonMounted(syncPrimeVueFiles)\r\n\r\nonBeforeUnmount(() => {\r\n for (const url of previewUrls.values()) URL.revokeObjectURL(url)\r\n previewUrls.clear()\r\n})\r\n\r\ndefineExpose({ choose, clear })\r\n</script>\r\n\r\n<template>\r\n <div class=\"top-file-upload 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 <FileUpload\r\n ref=\"fileUploadRef\"\r\n mode=\"advanced\"\r\n :accept=\"accept || undefined\"\r\n :multiple=\"multiple\"\r\n :disabled=\"isInteractionDisabled\"\r\n :custom-upload=\"true\"\r\n :show-upload-button=\"false\"\r\n :show-cancel-button=\"false\"\r\n :pt=\"{\r\n root: { class: 'top-file-upload__root w-full' },\r\n header: { class: 'hidden' },\r\n input: inputAttrs,\r\n content: {\r\n class: [\r\n 'top-file-upload__dropzone min-h-[164px] rounded-[10px] border border-dashed p-4 transition-colors',\r\n effectiveError\r\n ? 'border-red-600 bg-red-50 dark:border-red-400 dark:bg-red-950/20'\r\n : 'border-secondary-400 bg-secondary-50 hover:border-primary-600 hover:bg-primary-50 dark:border-zinc-600 dark:bg-zinc-800 dark:hover:border-primary-400 dark:hover:bg-zinc-700',\r\n isInteractionDisabled ? 'cursor-not-allowed opacity-60' : '',\r\n ].join(' '),\r\n },\r\n }\"\r\n @select=\"onSelect\"\r\n >\r\n <template #content=\"{ removeFileCallback }\">\r\n <div class=\"flex min-h-[130px] w-full flex-col items-center justify-center gap-3\">\r\n <slot\r\n v-if=\"!internalFiles.length\"\r\n name=\"empty\"\r\n :choose=\"choose\"\r\n :disabled=\"isInteractionDisabled\"\r\n >\r\n <i\r\n :class=\"[\r\n loading ? 'pi pi-spin pi-spinner' : 'pi pi-cloud-upload',\r\n 'text-4xl text-primary-800 dark:text-primary-300',\r\n ]\"\r\n aria-hidden=\"true\"\r\n />\r\n <p class=\"m-0 text-center text-xs text-secondary-600 dark:text-zinc-300\">\r\n {{ placeholder }}\r\n </p>\r\n <TopButton\r\n :label=\"selectLabel\"\r\n icon=\"pi pi-plus-circle\"\r\n :disabled=\"disabled\"\r\n :loading=\"loading\"\r\n class=\"px-3 py-2 text-xs\"\r\n @click=\"choose\"\r\n />\r\n </slot>\r\n\r\n <div v-else class=\"flex w-full flex-col gap-2\">\r\n <div\r\n v-for=\"(file, index) in internalFiles\"\r\n :key=\"`${file.name}-${file.size}-${file.lastModified}`\"\r\n class=\"flex min-w-0 items-center gap-3 rounded-[10px] border border-secondary-300 bg-white p-3 dark:border-zinc-600 dark:bg-zinc-900\"\r\n >\r\n <slot name=\"preview\" :file=\"file\" :index=\"index\" :url=\"previewUrl(file)\">\r\n <img\r\n v-if=\"previewUrl(file)\"\r\n :src=\"previewUrl(file)\"\r\n :alt=\"`Pré-visualização de ${file.name}`\"\r\n class=\"size-12 shrink-0 rounded-lg object-cover\"\r\n />\r\n <span\r\n v-else\r\n class=\"flex size-12 shrink-0 items-center justify-center rounded-lg bg-primary-50 text-primary-800 dark:bg-primary-950 dark:text-primary-200\"\r\n >\r\n <i class=\"pi pi-file text-2xl\" aria-hidden=\"true\" />\r\n </span>\r\n </slot>\r\n\r\n <div class=\"min-w-0 flex-1\">\r\n <p class=\"m-0 truncate text-xs font-bold text-secondary-900 dark:text-zinc-100\">\r\n {{ file.name }}\r\n </p>\r\n <span class=\"text-[11px] text-secondary-500 dark:text-zinc-400\">\r\n {{ formatFileSize(file.size) }}\r\n </span>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"flex size-8 shrink-0 items-center justify-center rounded-full border-0 bg-transparent p-0 text-red-600 transition-colors hover:bg-red-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:text-red-400 dark:hover:bg-red-950/40 dark:focus-visible:ring-offset-zinc-900\"\r\n :aria-label=\"`${removeLabel}: ${file.name}`\"\r\n :disabled=\"isInteractionDisabled\"\r\n @click=\"removeFile(removeFileCallback, index)\"\r\n >\r\n <i class=\"pi pi-times\" aria-hidden=\"true\" />\r\n </button>\r\n </div>\r\n\r\n <TopButton\r\n v-if=\"multiple && (!maxFiles || internalFiles.length < maxFiles)\"\r\n :label=\"selectLabel\"\r\n icon=\"pi pi-plus-circle\"\r\n outlined\r\n :disabled=\"disabled\"\r\n :loading=\"loading\"\r\n class=\"mt-1 px-3 py-2 text-xs\"\r\n @click=\"choose\"\r\n />\r\n </div>\r\n </div>\r\n </template>\r\n </FileUpload>\r\n\r\n <span\r\n v-if=\"effectiveError\"\r\n :id=\"errorId\"\r\n class=\"text-[11px] text-red-600 dark:text-red-400\"\r\n role=\"alert\"\r\n >\r\n {{ effectiveError }}\r\n </span>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.top-file-upload__root,\r\n.top-file-upload__dropzone {\r\n width: 100%;\r\n}\r\n\r\n.top-file-upload__root {\r\n border: 0;\r\n background: transparent;\r\n}\r\n\r\n.top-file-upload__dropzone[data-p-highlight='true'] {\r\n border-color: var(--top-primary-600) !important;\r\n background: var(--top-primary-100) !important;\r\n}\r\n\r\n.dark .top-file-upload__dropzone[data-p-highlight='true'] {\r\n border-color: var(--top-primary-400) !important;\r\n background: var(--top-primary-950) !important;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed, useAttrs, useId } from 'vue'\r\nimport InputText from 'primevue/inputtext'\r\n\r\ndefineOptions({ inheritAttrs: false })\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: string\r\n label?: string\r\n placeholder?: string\r\n required?: boolean\r\n error?: string\r\n disabled?: boolean\r\n readonly?: boolean\r\n }>(),\r\n {\r\n modelValue: '',\r\n label: '',\r\n placeholder: '',\r\n required: false,\r\n error: '',\r\n disabled: false,\r\n readonly: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string]\r\n}>()\r\n\r\nconst attrs = useAttrs()\r\nconst generatedId = useId()\r\n\r\nconst inputId = computed(() =>\r\n attrs.id === undefined || attrs.id === null || attrs.id === ''\r\n ? generatedId\r\n : String(attrs.id),\r\n)\r\nconst errorId = computed(() => `${inputId.value}-error`)\r\nconst ariaInvalid = computed<\r\n boolean | 'true' | 'false' | 'grammar' | 'spelling' | undefined\r\n>(() => {\r\n if (props.error) return true\r\n\r\n const value = attrs['aria-invalid']\r\n return typeof value === 'boolean' ||\r\n value === 'true' ||\r\n value === 'false' ||\r\n value === 'grammar' ||\r\n value === 'spelling'\r\n ? value\r\n : undefined\r\n})\r\nconst describedBy = computed(() => {\r\n const externalDescription = attrs['aria-describedby']\r\n const ids = [\r\n typeof externalDescription === 'string' ? externalDescription : '',\r\n props.error ? errorId.value : '',\r\n ].filter(Boolean)\r\n\r\n return ids.length ? ids.join(' ') : undefined\r\n})\r\n\r\nfunction updateModelValue(value: string | undefined) {\r\n emit('update:modelValue', value ?? '')\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"top-input-text top-solutions-component flex w-full flex-col gap-1\">\r\n <label\r\n v-if=\"label\"\r\n :for=\"inputId\"\r\n class=\"top-field-label text-xs font-bold\"\r\n >\r\n {{ label }}\r\n <span v-if=\"required\" aria-hidden=\"true\" class=\"text-red-600 dark:text-red-400\">*</span>\r\n </label>\r\n\r\n <InputText\r\n v-bind=\"$attrs\"\r\n :id=\"inputId\"\r\n :model-value=\"modelValue\"\r\n type=\"text\"\r\n :placeholder=\"placeholder\"\r\n :required=\"required\"\r\n :disabled=\"disabled\"\r\n :readonly=\"readonly\"\r\n :invalid=\"Boolean(error)\"\r\n :aria-invalid=\"ariaInvalid\"\r\n :aria-describedby=\"describedBy\"\r\n fluid\r\n class=\"top-input-text__control top-field-control h-[40px] w-full rounded-[10px] border px-3 py-2 text-xs read-only:cursor-default disabled:cursor-not-allowed\"\r\n @update:model-value=\"updateModelValue\"\r\n />\r\n\r\n <span\r\n v-if=\"error\"\r\n :id=\"errorId\"\r\n class=\"text-[11px] text-red-600 dark:text-red-400\"\r\n role=\"alert\"\r\n >\r\n {{ error }}\r\n </span>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed, useAttrs, useId } from 'vue'\r\nimport InputText from 'primevue/inputtext'\r\n\r\ndefineOptions({ inheritAttrs: false })\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: string\r\n label?: string\r\n placeholder?: string\r\n required?: boolean\r\n error?: string\r\n disabled?: boolean\r\n readonly?: boolean\r\n }>(),\r\n {\r\n modelValue: '',\r\n label: '',\r\n placeholder: '',\r\n required: false,\r\n error: '',\r\n disabled: false,\r\n readonly: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string]\r\n}>()\r\n\r\nconst attrs = useAttrs()\r\nconst generatedId = useId()\r\n\r\nconst inputId = computed(() =>\r\n attrs.id === undefined || attrs.id === null || attrs.id === ''\r\n ? generatedId\r\n : String(attrs.id),\r\n)\r\nconst errorId = computed(() => `${inputId.value}-error`)\r\nconst ariaInvalid = computed<\r\n boolean | 'true' | 'false' | 'grammar' | 'spelling' | undefined\r\n>(() => {\r\n if (props.error) return true\r\n\r\n const value = attrs['aria-invalid']\r\n return typeof value === 'boolean' ||\r\n value === 'true' ||\r\n value === 'false' ||\r\n value === 'grammar' ||\r\n value === 'spelling'\r\n ? value\r\n : undefined\r\n})\r\nconst describedBy = computed(() => {\r\n const externalDescription = attrs['aria-describedby']\r\n const ids = [\r\n typeof externalDescription === 'string' ? externalDescription : '',\r\n props.error ? errorId.value : '',\r\n ].filter(Boolean)\r\n\r\n return ids.length ? ids.join(' ') : undefined\r\n})\r\n\r\nfunction updateModelValue(value: string | undefined) {\r\n emit('update:modelValue', value ?? '')\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"top-input-text top-solutions-component flex w-full flex-col gap-1\">\r\n <label\r\n v-if=\"label\"\r\n :for=\"inputId\"\r\n class=\"top-field-label text-xs font-bold\"\r\n >\r\n {{ label }}\r\n <span v-if=\"required\" aria-hidden=\"true\" class=\"text-red-600 dark:text-red-400\">*</span>\r\n </label>\r\n\r\n <InputText\r\n v-bind=\"$attrs\"\r\n :id=\"inputId\"\r\n :model-value=\"modelValue\"\r\n type=\"text\"\r\n :placeholder=\"placeholder\"\r\n :required=\"required\"\r\n :disabled=\"disabled\"\r\n :readonly=\"readonly\"\r\n :invalid=\"Boolean(error)\"\r\n :aria-invalid=\"ariaInvalid\"\r\n :aria-describedby=\"describedBy\"\r\n fluid\r\n class=\"top-input-text__control top-field-control h-[40px] w-full rounded-[10px] border px-3 py-2 text-xs read-only:cursor-default disabled:cursor-not-allowed\"\r\n @update:model-value=\"updateModelValue\"\r\n />\r\n\r\n <span\r\n v-if=\"error\"\r\n :id=\"errorId\"\r\n class=\"text-[11px] text-red-600 dark:text-red-400\"\r\n role=\"alert\"\r\n >\r\n {{ error }}\r\n </span>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useSlots, watch } from 'vue'\r\nimport AutoComplete from 'primevue/autocomplete'\r\nimport vTooltip from 'primevue/tooltip'\r\n\r\ntype SelectOption = Record<string, unknown> | string | number\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: SelectOption | SelectOption[] | null\r\n options?: SelectOption[]\r\n loading?: boolean\r\n disabled?: boolean\r\n placeholder?: string\r\n optionLabel?: string | ((option: SelectOption) => string)\r\n optionKey?: string\r\n optionPrefix?: string\r\n showOptionPrefix?: boolean\r\n showSelectedPrefix?: boolean\r\n panelWidth?: string | null\r\n scrollHeight?: string\r\n invalid?: boolean\r\n showTooltip?: boolean\r\n optionGroupLabel?: string | null\r\n optionGroupChildren?: string | null\r\n minQueryLength?: number\r\n emptyMessage?: string\r\n loadingMessage?: string\r\n showLoadingMessage?: boolean\r\n multiple?: boolean\r\n forceSelection?: boolean\r\n closeOnSelect?: boolean\r\n }>(),\r\n {\r\n modelValue: null,\r\n options: () => [],\r\n loading: false,\r\n disabled: false,\r\n placeholder: 'Pesquisar...',\r\n optionLabel: 'label',\r\n optionKey: 'id',\r\n optionPrefix: '',\r\n showOptionPrefix: false,\r\n showSelectedPrefix: false,\r\n panelWidth: null,\r\n scrollHeight: '250px',\r\n invalid: false,\r\n showTooltip: true,\r\n optionGroupLabel: null,\r\n optionGroupChildren: null,\r\n minQueryLength: 1,\r\n emptyMessage: 'Nenhum resultado encontrado.',\r\n loadingMessage: 'Carregando...',\r\n showLoadingMessage: true,\r\n multiple: false,\r\n forceSelection: true,\r\n closeOnSelect: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: SelectOption | SelectOption[] | null]\r\n search: [event: { originalEvent: Event; query: string }]\r\n loadMore: [event: unknown]\r\n clear: []\r\n select: [event: unknown]\r\n change: [event: unknown]\r\n}>()\r\n\r\nconst slots = useSlots()\r\n// PrimeVue's slot types omit selected-item even though the runtime component supports it.\r\nconst TopAutoComplete = AutoComplete as any\r\nconst query = ref('')\r\nconst focused = ref(false)\r\nconst autocompleteRef = ref<{ hide?: () => void } | null>(null)\r\nconst instanceId = `top-select-${Math.random().toString(36).slice(2)}`\r\nlet closeTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\nconst valueProxy = computed({\r\n get: () => props.modelValue,\r\n set: (value) => emit('update:modelValue', value),\r\n})\r\n\r\nfunction readOptionValue(option: SelectOption | null | undefined, key: string) {\r\n if (option === null || option === undefined) return ''\r\n if (typeof option !== 'object') return String(option)\r\n return String(option[key] ?? '')\r\n}\r\n\r\nfunction getOptionLabel(option: SelectOption | null | undefined) {\r\n if (option === null || option === undefined) return ''\r\n if (typeof props.optionLabel === 'function') return props.optionLabel(option)\r\n return readOptionValue(option, props.optionLabel)\r\n}\r\n\r\nfunction getOptionPrefix(option: SelectOption | null | undefined) {\r\n return props.optionPrefix ? readOptionValue(option, props.optionPrefix) : ''\r\n}\r\n\r\nfunction formatOptionLabel(option: SelectOption | null | undefined, includePrefix = props.showSelectedPrefix) {\r\n const label = getOptionLabel(option)\r\n const prefix = getOptionPrefix(option)\r\n return includePrefix && prefix ? `${prefix} - ${label}` : label\r\n}\r\n\r\nfunction getHighlightedParts(value: string) {\r\n const searchTerm = query.value\r\n if (!searchTerm) return [{ text: value, highlighted: false }]\r\n\r\n const escapedQuery = searchTerm.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n const regex = new RegExp(`(${escapedQuery})`, 'gi')\r\n return value.split(regex).filter(Boolean).map((part) => ({\r\n text: part,\r\n highlighted: part.toLowerCase() === searchTerm.toLowerCase(),\r\n }))\r\n}\r\n\r\nfunction hideDropdown() {\r\n autocompleteRef.value?.hide?.()\r\n}\r\n\r\nfunction closeOtherDropdowns() {\r\n if (typeof window === 'undefined') return\r\n window.dispatchEvent(new CustomEvent('top-select:close-others', { detail: { instanceId } }))\r\n}\r\n\r\nfunction handleOtherDropdownClosing(event: Event) {\r\n const customEvent = event as CustomEvent<{ instanceId?: string }>\r\n if (customEvent.detail?.instanceId !== instanceId) hideDropdown()\r\n}\r\n\r\nfunction handleFocusIn() {\r\n if (props.disabled || closeTimer) {\r\n hideDropdown()\r\n return\r\n }\r\n focused.value = true\r\n closeOtherDropdowns()\r\n}\r\n\r\nfunction closeAfterSelection() {\r\n if (!props.closeOnSelect) return\r\n focused.value = false\r\n hideDropdown()\r\n nextTick(hideDropdown)\r\n if (closeTimer) clearTimeout(closeTimer)\r\n closeTimer = setTimeout(() => {\r\n hideDropdown()\r\n closeTimer = null\r\n }, 200)\r\n}\r\n\r\ndefineExpose({ hideDropdown })\r\n\r\nonMounted(() => window.addEventListener('top-select:close-others', handleOtherDropdownClosing))\r\nonBeforeUnmount(() => {\r\n window.removeEventListener('top-select:close-others', handleOtherDropdownClosing)\r\n if (closeTimer) clearTimeout(closeTimer)\r\n})\r\n\r\nwatch(() => props.disabled, (disabled) => {\r\n if (disabled) {\r\n focused.value = false\r\n hideDropdown()\r\n }\r\n})\r\n\r\nwatch(() => props.options, () => {\r\n if (!focused.value) hideDropdown()\r\n})\r\n</script>\r\n\r\n<template>\r\n <div class=\"top-select top-solutions-component relative w-full\" :class=\"{ 'pointer-events-none': disabled }\" @focusin=\"handleFocusIn\">\r\n <span class=\"top-field-icon pointer-events-none absolute left-3 top-1/2 z-10 -translate-y-1/2\">\n <slot name=\"icon\" :loading=\"loading\">\r\n <i v-if=\"loading\" class=\"pi pi-spin pi-spinner\" />\r\n <i v-else class=\"pi pi-search\" />\r\n </slot>\r\n </span>\r\n\r\n <TopAutoComplete\r\n ref=\"autocompleteRef\"\r\n v-model=\"valueProxy\"\r\n :option-group-label=\"optionGroupLabel ?? undefined\"\r\n :option-group-children=\"optionGroupChildren ?? undefined\"\r\n :suggestions=\"options\"\r\n :data-key=\"optionKey\"\r\n :option-label=\"(option: SelectOption) => formatOptionLabel(option)\"\r\n :placeholder=\"placeholder\"\r\n :multiple=\"multiple\"\r\n :min-length=\"minQueryLength\"\r\n :disabled=\"disabled\"\r\n :delay=\"500\"\r\n :show-clear=\"!multiple && !disabled\"\r\n dropdown\r\n dropdown-mode=\"current\"\r\n :complete-on-focus=\"false\"\r\n :invalid=\"invalid\"\r\n fluid\r\n :force-selection=\"forceSelection\"\r\n input-class=\"text-xs\"\r\n :virtual-scroller-options=\"{\r\n lazy: true,\r\n onLazyLoad: (event: unknown) => emit('loadMore', event),\r\n itemSize: 84,\r\n showLoader: true,\r\n scrollHeight,\r\n }\"\r\n :pt=\"{\r\n root: { class: ['w-full text-xs', multiple ? 'h-auto' : 'h-[40px]'].join(' ') },\r\n pcInputText: {\r\n root: {\r\n class: 'top-field-control w-full h-auto text-xs border rounded-[10px] !pl-9 min-h-[36px]',\r\n },\r\n },\r\n input: { class: ['top-field-control w-full h-auto text-xs', multiple ? 'border-0 py-1 !shadow-none outline-none ring-0' : 'border rounded-[10px] !pl-9 min-h-[36px]'].join(' ') },\r\n inputMultiple: { class: 'top-field-control rounded-[10px] pl-9 min-h-[40px]' },\r\n inputChip: { class: 'py-0' },\r\n token: { class: 'bg-primary-100 text-primary-900 rounded-md gap-2 px-2 my-1 dark:bg-primary-900 dark:text-primary-100' },\r\n removeTokenIcon: { class: 'text-primary-900 w-3 h-3 cursor-pointer dark:text-primary-100' },\r\n panel: { class: 'top-select-panel top-solutions-component max-w-[85vw] overflow-hidden h-fit shadow-xl' },\r\n listContainer: { class: 'max-w-full overflow-x-hidden', style: { overflowX: 'hidden', maxWidth: panelWidth ?? '85vw', ...(panelWidth ? { width: panelWidth } : {}) } },\r\n list: { class: 'max-w-full overflow-x-hidden' }, option: { class: 'max-w-full overflow-hidden min-h-[84px]' }, placeholder: { class: '!text-xs' },\r\n }\"\r\n search-message=\" \"\r\n @clear=\"query = ''; emit('clear')\"\r\n @item-select=\"(event: unknown) => { query = ''; emit('select', event); closeAfterSelection() }\"\r\n @complete=\"(event: { originalEvent: Event; query?: string }) => { if (disabled) { hideDropdown(); return }; query = event.query ?? ''; closeOtherDropdowns(); emit('search', { ...event, query: query }) }\"\r\n @change=\"(event: unknown) => emit('change', event)\"\r\n >\r\n <template #chip=\"slotProps\">\r\n <slot v-if=\"slots.chip\" name=\"chip\" v-bind=\"slotProps\" />\r\n <div v-else class=\"flex items-center gap-1 !text-sm\">\r\n <div class=\"flex items-center gap-2 rounded-[9px] bg-primary-500 px-2 py-1 text-white\">\r\n <i class=\"pi pi-times-circle shrink-0 cursor-pointer rounded-full hover:bg-primary-800\" @click=\"slotProps.removeCallback($event)\" />\r\n <span v-tooltip.top=\"formatOptionLabel(slotProps.value)\" class=\"line-clamp-1 max-w-[300px] overflow-hidden text-ellipsis\">{{ formatOptionLabel(slotProps.value) }}</span>\r\n </div>\r\n </div>\r\n </template>\r\n\r\n <template #empty>\r\n <slot v-if=\"slots.empty\" name=\"empty\" />\r\n <div v-else-if=\"loading\" class=\"flex min-h-[100px] flex-col items-center justify-center gap-2 py-2\">\r\n <span class=\"pi pi-spin pi-spinner text-2xl text-primary-600\" />\r\n <span v-if=\"showLoadingMessage\" class=\"text-xs font-medium text-primary-600\">{{ loadingMessage }}</span>\r\n </div>\r\n <span v-else class=\"text-xs text-secondary-500\">{{ emptyMessage }}</span>\r\n </template>\r\n\r\n <template #selected-item=\"slotProps\">\r\n <slot v-if=\"slots['selected-item']\" name=\"selected-item\" v-bind=\"slotProps\" />\r\n <span v-else-if=\"slotProps.item\">{{ formatOptionLabel(slotProps.item) }}</span>\r\n </template>\r\n\r\n <template #optiongroup=\"slotProps\">\r\n <slot v-if=\"slots['option-group']\" name=\"option-group\" v-bind=\"slotProps\" />\r\n <div v-else class=\"flex items-center gap-2 font-semibold\">\r\n <i v-if=\"slotProps.option.icon\" :class=\"slotProps.option.icon\" />\r\n <span>{{ slotProps.option[optionGroupLabel ?? 'label'] }}</span>\r\n </div>\r\n </template>\r\n\r\n <template #option=\"slotProps\">\r\n <slot v-if=\"slots.option\" name=\"option\" v-bind=\"slotProps\" :label=\"getOptionLabel(slotProps.option)\" :prefix=\"getOptionPrefix(slotProps.option)\" :query=\"query\" />\r\n <div v-else v-tooltip.top=\"showTooltip ? getOptionLabel(slotProps.option) : null\" class=\"flex w-full min-w-0 items-start gap-2 overflow-hidden px-2 py-3 text-sm\" style=\"white-space: normal\">\r\n <span class=\"top-select-option-label line-clamp-2 min-w-0 flex-1 text-secondary-700 dark:text-zinc-200\" :title=\"getOptionLabel(slotProps.option)\">\r\n <span v-if=\"showOptionPrefix && getOptionPrefix(slotProps.option)\" class=\"top-select-option-prefix whitespace-nowrap font-bold text-primary-800 dark:text-primary-100\">\r\n <template v-for=\"(part, index) in getHighlightedParts(getOptionPrefix(slotProps.option))\" :key=\"index\"><mark v-if=\"part.highlighted\" class=\"rounded-sm bg-primary-200 p-0 font-bold text-black dark:bg-cyan-700 dark:text-white\">{{ part.text }}</mark><template v-else>{{ part.text }}</template></template><span class=\"font-bold text-secondary-500 dark:text-zinc-400\">&nbsp;-&nbsp;</span>\r\n </span>\r\n <template v-for=\"(part, index) in getHighlightedParts(getOptionLabel(slotProps.option))\" :key=\"index\"><mark v-if=\"part.highlighted\" class=\"rounded-sm bg-primary-200 p-0 font-bold text-black dark:bg-cyan-700 dark:text-white\">{{ part.text }}</mark><template v-else>{{ part.text }}</template></template>\r\n </span>\r\n </div>\r\n </template>\r\n\r\n <template v-if=\"slots.footer\" #footer=\"slotProps\"><slot name=\"footer\" v-bind=\"slotProps\" /></template>\r\n </TopAutoComplete>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.top-select {\r\n position: relative;\r\n width: 100%;\r\n}\r\n\r\n.top-select .p-inputtext.p-component.p-inputtext-fluid.p-autocomplete-input {\r\n padding-left: 35px !important;\r\n border-radius: 10px 0 0 10px !important;\r\n}\r\n\r\n.top-select .p-autocomplete-dropdown {\r\n border-radius: 0 10px 10px 0 !important;\r\n}\r\n\r\n.top-select-option-prefix {\r\n color: var(--top-primary-800) !important;\r\n}\r\n\r\n.dark .top-select-option-prefix {\r\n color: var(--top-primary-100) !important;\r\n}\r\n\r\n.top-select-option-label {\r\n min-width: 0;\r\n flex: 1;\r\n display: -webkit-box;\r\n -webkit-box-orient: vertical;\r\n -webkit-line-clamp: 2;\r\n line-clamp: 2;\r\n overflow: hidden;\r\n overflow-wrap: anywhere;\r\n}\r\n\r\n.top-select-panel,\r\n.top-select-panel .p-virtualscroller,\r\n.top-select-panel .p-autocomplete-list-container,\r\n.top-select-panel .p-autocomplete-list { overflow-x: hidden !important; }\r\n.top-select-panel .p-autocomplete-option { max-width: 100%; }\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useSlots, watch } from 'vue'\r\nimport AutoComplete from 'primevue/autocomplete'\r\nimport vTooltip from 'primevue/tooltip'\r\n\r\ntype SelectOption = Record<string, unknown> | string | number\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: SelectOption | SelectOption[] | null\r\n options?: SelectOption[]\r\n loading?: boolean\r\n disabled?: boolean\r\n placeholder?: string\r\n optionLabel?: string | ((option: SelectOption) => string)\r\n optionKey?: string\r\n optionPrefix?: string\r\n showOptionPrefix?: boolean\r\n showSelectedPrefix?: boolean\r\n panelWidth?: string | null\r\n scrollHeight?: string\r\n invalid?: boolean\r\n showTooltip?: boolean\r\n optionGroupLabel?: string | null\r\n optionGroupChildren?: string | null\r\n minQueryLength?: number\r\n emptyMessage?: string\r\n loadingMessage?: string\r\n showLoadingMessage?: boolean\r\n multiple?: boolean\r\n forceSelection?: boolean\r\n closeOnSelect?: boolean\r\n }>(),\r\n {\r\n modelValue: null,\r\n options: () => [],\r\n loading: false,\r\n disabled: false,\r\n placeholder: 'Pesquisar...',\r\n optionLabel: 'label',\r\n optionKey: 'id',\r\n optionPrefix: '',\r\n showOptionPrefix: false,\r\n showSelectedPrefix: false,\r\n panelWidth: null,\r\n scrollHeight: '250px',\r\n invalid: false,\r\n showTooltip: true,\r\n optionGroupLabel: null,\r\n optionGroupChildren: null,\r\n minQueryLength: 1,\r\n emptyMessage: 'Nenhum resultado encontrado.',\r\n loadingMessage: 'Carregando...',\r\n showLoadingMessage: true,\r\n multiple: false,\r\n forceSelection: true,\r\n closeOnSelect: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: SelectOption | SelectOption[] | null]\r\n search: [event: { originalEvent: Event; query: string }]\r\n loadMore: [event: unknown]\r\n clear: []\r\n select: [event: unknown]\r\n change: [event: unknown]\r\n}>()\r\n\r\nconst slots = useSlots()\r\n// PrimeVue's slot types omit selected-item even though the runtime component supports it.\r\nconst TopAutoComplete = AutoComplete as any\r\nconst query = ref('')\r\nconst focused = ref(false)\r\nconst autocompleteRef = ref<{ hide?: () => void } | null>(null)\r\nconst instanceId = `top-select-${Math.random().toString(36).slice(2)}`\r\nlet closeTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\nconst valueProxy = computed({\r\n get: () => props.modelValue,\r\n set: (value) => emit('update:modelValue', value),\r\n})\r\n\r\nfunction readOptionValue(option: SelectOption | null | undefined, key: string) {\r\n if (option === null || option === undefined) return ''\r\n if (typeof option !== 'object') return String(option)\r\n return String(option[key] ?? '')\r\n}\r\n\r\nfunction getOptionLabel(option: SelectOption | null | undefined) {\r\n if (option === null || option === undefined) return ''\r\n if (typeof props.optionLabel === 'function') return props.optionLabel(option)\r\n return readOptionValue(option, props.optionLabel)\r\n}\r\n\r\nfunction getOptionPrefix(option: SelectOption | null | undefined) {\r\n return props.optionPrefix ? readOptionValue(option, props.optionPrefix) : ''\r\n}\r\n\r\nfunction formatOptionLabel(option: SelectOption | null | undefined, includePrefix = props.showSelectedPrefix) {\r\n const label = getOptionLabel(option)\r\n const prefix = getOptionPrefix(option)\r\n return includePrefix && prefix ? `${prefix} - ${label}` : label\r\n}\r\n\r\nfunction getHighlightedParts(value: string) {\r\n const searchTerm = query.value\r\n if (!searchTerm) return [{ text: value, highlighted: false }]\r\n\r\n const escapedQuery = searchTerm.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\r\n const regex = new RegExp(`(${escapedQuery})`, 'gi')\r\n return value.split(regex).filter(Boolean).map((part) => ({\r\n text: part,\r\n highlighted: part.toLowerCase() === searchTerm.toLowerCase(),\r\n }))\r\n}\r\n\r\nfunction hideDropdown() {\r\n autocompleteRef.value?.hide?.()\r\n}\r\n\r\nfunction closeOtherDropdowns() {\r\n if (typeof window === 'undefined') return\r\n window.dispatchEvent(new CustomEvent('top-select:close-others', { detail: { instanceId } }))\r\n}\r\n\r\nfunction handleOtherDropdownClosing(event: Event) {\r\n const customEvent = event as CustomEvent<{ instanceId?: string }>\r\n if (customEvent.detail?.instanceId !== instanceId) hideDropdown()\r\n}\r\n\r\nfunction handleFocusIn() {\r\n if (props.disabled || closeTimer) {\r\n hideDropdown()\r\n return\r\n }\r\n focused.value = true\r\n closeOtherDropdowns()\r\n}\r\n\r\nfunction closeAfterSelection() {\r\n if (!props.closeOnSelect) return\r\n focused.value = false\r\n hideDropdown()\r\n nextTick(hideDropdown)\r\n if (closeTimer) clearTimeout(closeTimer)\r\n closeTimer = setTimeout(() => {\r\n hideDropdown()\r\n closeTimer = null\r\n }, 200)\r\n}\r\n\r\ndefineExpose({ hideDropdown })\r\n\r\nonMounted(() => window.addEventListener('top-select:close-others', handleOtherDropdownClosing))\r\nonBeforeUnmount(() => {\r\n window.removeEventListener('top-select:close-others', handleOtherDropdownClosing)\r\n if (closeTimer) clearTimeout(closeTimer)\r\n})\r\n\r\nwatch(() => props.disabled, (disabled) => {\r\n if (disabled) {\r\n focused.value = false\r\n hideDropdown()\r\n }\r\n})\r\n\r\nwatch(() => props.options, () => {\r\n if (!focused.value) hideDropdown()\r\n})\r\n</script>\r\n\r\n<template>\r\n <div class=\"top-select top-solutions-component relative w-full\" :class=\"{ 'pointer-events-none': disabled }\" @focusin=\"handleFocusIn\">\r\n <span class=\"top-field-icon pointer-events-none absolute left-3 top-1/2 z-10 -translate-y-1/2\">\n <slot name=\"icon\" :loading=\"loading\">\r\n <i v-if=\"loading\" class=\"pi pi-spin pi-spinner\" />\r\n <i v-else class=\"pi pi-search\" />\r\n </slot>\r\n </span>\r\n\r\n <TopAutoComplete\r\n ref=\"autocompleteRef\"\r\n v-model=\"valueProxy\"\r\n :option-group-label=\"optionGroupLabel ?? undefined\"\r\n :option-group-children=\"optionGroupChildren ?? undefined\"\r\n :suggestions=\"options\"\r\n :data-key=\"optionKey\"\r\n :option-label=\"(option: SelectOption) => formatOptionLabel(option)\"\r\n :placeholder=\"placeholder\"\r\n :multiple=\"multiple\"\r\n :min-length=\"minQueryLength\"\r\n :disabled=\"disabled\"\r\n :delay=\"500\"\r\n :show-clear=\"!multiple && !disabled\"\r\n dropdown\r\n dropdown-mode=\"current\"\r\n :complete-on-focus=\"false\"\r\n :invalid=\"invalid\"\r\n fluid\r\n :force-selection=\"forceSelection\"\r\n input-class=\"text-xs\"\r\n :virtual-scroller-options=\"{\r\n lazy: true,\r\n onLazyLoad: (event: unknown) => emit('loadMore', event),\r\n itemSize: 84,\r\n showLoader: true,\r\n scrollHeight,\r\n }\"\r\n :pt=\"{\r\n root: { class: ['w-full text-xs', multiple ? 'h-auto' : 'h-[40px]'].join(' ') },\r\n pcInputText: {\r\n root: {\r\n class: 'top-field-control w-full h-auto text-xs border rounded-[10px] !pl-9 min-h-[36px]',\r\n },\r\n },\r\n input: { class: ['top-field-control w-full h-auto text-xs', multiple ? 'border-0 py-1 !shadow-none outline-none ring-0' : 'border rounded-[10px] !pl-9 min-h-[36px]'].join(' ') },\r\n inputMultiple: { class: 'top-field-control rounded-[10px] pl-9 min-h-[40px]' },\r\n inputChip: { class: 'py-0' },\r\n token: { class: 'bg-primary-100 text-primary-900 rounded-md gap-2 px-2 my-1 dark:bg-primary-900 dark:text-primary-100' },\r\n removeTokenIcon: { class: 'text-primary-900 w-3 h-3 cursor-pointer dark:text-primary-100' },\r\n panel: { class: 'top-select-panel top-solutions-component max-w-[85vw] overflow-hidden h-fit shadow-xl' },\r\n listContainer: { class: 'max-w-full overflow-x-hidden', style: { overflowX: 'hidden', maxWidth: panelWidth ?? '85vw', ...(panelWidth ? { width: panelWidth } : {}) } },\r\n list: { class: 'max-w-full overflow-x-hidden' }, option: { class: 'max-w-full overflow-hidden min-h-[84px]' }, placeholder: { class: '!text-xs' },\r\n }\"\r\n search-message=\" \"\r\n @clear=\"query = ''; emit('clear')\"\r\n @item-select=\"(event: unknown) => { query = ''; emit('select', event); closeAfterSelection() }\"\r\n @complete=\"(event: { originalEvent: Event; query?: string }) => { if (disabled) { hideDropdown(); return }; query = event.query ?? ''; closeOtherDropdowns(); emit('search', { ...event, query: query }) }\"\r\n @change=\"(event: unknown) => emit('change', event)\"\r\n >\r\n <template #chip=\"slotProps\">\r\n <slot v-if=\"slots.chip\" name=\"chip\" v-bind=\"slotProps\" />\r\n <div v-else class=\"flex items-center gap-1 !text-sm\">\r\n <div class=\"flex items-center gap-2 rounded-[9px] bg-primary-500 px-2 py-1 text-white\">\r\n <i class=\"pi pi-times-circle shrink-0 cursor-pointer rounded-full hover:bg-primary-800\" @click=\"slotProps.removeCallback($event)\" />\r\n <span v-tooltip.top=\"formatOptionLabel(slotProps.value)\" class=\"line-clamp-1 max-w-[300px] overflow-hidden text-ellipsis\">{{ formatOptionLabel(slotProps.value) }}</span>\r\n </div>\r\n </div>\r\n </template>\r\n\r\n <template #empty>\r\n <slot v-if=\"slots.empty\" name=\"empty\" />\r\n <div v-else-if=\"loading\" class=\"flex min-h-[100px] flex-col items-center justify-center gap-2 py-2\">\r\n <span class=\"pi pi-spin pi-spinner text-2xl text-primary-600\" />\r\n <span v-if=\"showLoadingMessage\" class=\"text-xs font-medium text-primary-600\">{{ loadingMessage }}</span>\r\n </div>\r\n <span v-else class=\"text-xs text-secondary-500\">{{ emptyMessage }}</span>\r\n </template>\r\n\r\n <template #selected-item=\"slotProps\">\r\n <slot v-if=\"slots['selected-item']\" name=\"selected-item\" v-bind=\"slotProps\" />\r\n <span v-else-if=\"slotProps.item\">{{ formatOptionLabel(slotProps.item) }}</span>\r\n </template>\r\n\r\n <template #optiongroup=\"slotProps\">\r\n <slot v-if=\"slots['option-group']\" name=\"option-group\" v-bind=\"slotProps\" />\r\n <div v-else class=\"flex items-center gap-2 font-semibold\">\r\n <i v-if=\"slotProps.option.icon\" :class=\"slotProps.option.icon\" />\r\n <span>{{ slotProps.option[optionGroupLabel ?? 'label'] }}</span>\r\n </div>\r\n </template>\r\n\r\n <template #option=\"slotProps\">\r\n <slot v-if=\"slots.option\" name=\"option\" v-bind=\"slotProps\" :label=\"getOptionLabel(slotProps.option)\" :prefix=\"getOptionPrefix(slotProps.option)\" :query=\"query\" />\r\n <div v-else v-tooltip.top=\"showTooltip ? getOptionLabel(slotProps.option) : null\" class=\"flex w-full min-w-0 items-start gap-2 overflow-hidden px-2 py-3 text-sm\" style=\"white-space: normal\">\r\n <span class=\"top-select-option-label line-clamp-2 min-w-0 flex-1 text-secondary-700 dark:text-zinc-200\" :title=\"getOptionLabel(slotProps.option)\">\r\n <span v-if=\"showOptionPrefix && getOptionPrefix(slotProps.option)\" class=\"top-select-option-prefix whitespace-nowrap font-bold text-primary-800 dark:text-primary-100\">\r\n <template v-for=\"(part, index) in getHighlightedParts(getOptionPrefix(slotProps.option))\" :key=\"index\"><mark v-if=\"part.highlighted\" class=\"rounded-sm bg-primary-200 p-0 font-bold text-black dark:bg-cyan-700 dark:text-white\">{{ part.text }}</mark><template v-else>{{ part.text }}</template></template><span class=\"font-bold text-secondary-500 dark:text-zinc-400\">&nbsp;-&nbsp;</span>\r\n </span>\r\n <template v-for=\"(part, index) in getHighlightedParts(getOptionLabel(slotProps.option))\" :key=\"index\"><mark v-if=\"part.highlighted\" class=\"rounded-sm bg-primary-200 p-0 font-bold text-black dark:bg-cyan-700 dark:text-white\">{{ part.text }}</mark><template v-else>{{ part.text }}</template></template>\r\n </span>\r\n </div>\r\n </template>\r\n\r\n <template v-if=\"slots.footer\" #footer=\"slotProps\"><slot name=\"footer\" v-bind=\"slotProps\" /></template>\r\n </TopAutoComplete>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.top-select {\r\n position: relative;\r\n width: 100%;\r\n}\r\n\r\n.top-select .p-inputtext.p-component.p-inputtext-fluid.p-autocomplete-input {\r\n padding-left: 35px !important;\r\n border-radius: 10px 0 0 10px !important;\r\n}\r\n\r\n.top-select .p-autocomplete-dropdown {\r\n border-radius: 0 10px 10px 0 !important;\r\n}\r\n\r\n.top-select-option-prefix {\r\n color: var(--top-primary-800) !important;\r\n}\r\n\r\n.dark .top-select-option-prefix {\r\n color: var(--top-primary-100) !important;\r\n}\r\n\r\n.top-select-option-label {\r\n min-width: 0;\r\n flex: 1;\r\n display: -webkit-box;\r\n -webkit-box-orient: vertical;\r\n -webkit-line-clamp: 2;\r\n line-clamp: 2;\r\n overflow: hidden;\r\n overflow-wrap: anywhere;\r\n}\r\n\r\n.top-select-panel,\r\n.top-select-panel .p-virtualscroller,\r\n.top-select-panel .p-autocomplete-list-container,\r\n.top-select-panel .p-autocomplete-list { overflow-x: hidden !important; }\r\n.top-select-panel .p-autocomplete-option { max-width: 100%; }\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport 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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"}
@@ -25,6 +25,7 @@ var z = { class: "top-button top-solutions-component h-fit w-fit rounded-[12px]
25
25
  type: Boolean,
26
26
  default: !1
27
27
  },
28
+ severity: { default: "primary" },
28
29
  secondary: {
29
30
  type: Boolean,
30
31
  default: !1
@@ -41,8 +42,8 @@ var z = { class: "top-button top-solutions-component h-fit w-fit rounded-[12px]
41
42
  },
42
43
  emits: ["click"],
43
44
  setup(e, { emit: r }) {
44
- let a = E(), s = t(() => !!a.icon), c = e, l = r, u = t(() => {
45
- let e = c.unstyled ? "" : c.secondary ? "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" : c.outlined ? "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" : "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";
45
+ let a = E(), s = t(() => !!a.icon), c = e, l = r, u = t(() => c.secondary ? "secondary" : c.severity), d = t(() => {
46
+ let e = c.unstyled ? "" : u.value === "secondary" ? "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" : c.outlined ? u.value === "primary" ? "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" : "shrink-0 rounded-[10px] border px-3 py-2 font-bold" : u.value === "primary" ? "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" : "rounded-[10px] border px-3 py-2 font-bold";
46
47
  return M(e, c.class);
47
48
  });
48
49
  return (t, r) => (v(), i("span", z, [k((v(), n(C(A), {
@@ -51,10 +52,10 @@ var z = { class: "top-button top-solutions-component h-fit w-fit rounded-[12px]
51
52
  disabled: e.disabled || e.loading,
52
53
  icon: s.value ? void 0 : e.icon || void 0,
53
54
  loading: e.loading,
54
- outlined: e.outlined || e.secondary,
55
- severity: e.secondary ? "secondary" : void 0,
56
- class: p(u.value),
57
- pt: { root: { class: u.value } },
55
+ outlined: e.outlined || u.value === "secondary",
56
+ severity: u.value === "primary" ? void 0 : u.value,
57
+ class: p(d.value),
58
+ pt: { root: { class: d.value } },
58
59
  onClick: r[0] ||= (e) => l("click")
59
60
  }, o({ _: 2 }, [s.value ? {
60
61
  name: "icon",
@@ -1107,4 +1108,4 @@ var z = { class: "top-button top-solutions-component h-fit w-fit rounded-[12px]
1107
1108
  //#endregion
1108
1109
  export { Z as a, B as c, me as i, Fe as n, q as o, _e as r, V as s, Be as t };
1109
1110
 
1110
- //# sourceMappingURL=TopToast-D6e-pFlr.js.map
1111
+ //# sourceMappingURL=TopToast-Bp0e2ch-.js.map