@wgalleti/primevue-components 1.2.0 → 1.4.0
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 +1 -0
- package/dist/components/charts/WChart.vue.d.ts +12 -2
- package/dist/components/index.d.ts +1 -0
- package/dist/components/ui/WKanbanBoard.vue.d.ts +2 -2
- package/dist/components/ui/WKpiCard.vue.d.ts +27 -7
- package/dist/components/ui/WKpiGrid.vue.d.ts +15 -2
- package/dist/components/ui/WMeter.vue.d.ts +49 -0
- package/dist/components/ui/WStepFlow.vue.d.ts +9 -1
- package/dist/components-BRNk60nY.cjs +25 -0
- package/dist/components-BRNk60nY.cjs.map +1 -0
- package/dist/{components-D5eeRtRP.js → components-DsMEndfN.js} +1825 -1589
- package/dist/components-DsMEndfN.js.map +1 -0
- package/dist/components.cjs +1 -1
- package/dist/components.js +2 -2
- package/dist/composables/useFormatters.d.ts +2 -0
- package/dist/{composables-DEPrDTmn.js → composables-B9ywPF1T.js} +89 -81
- package/dist/{composables-DEPrDTmn.js.map → composables-B9ywPF1T.js.map} +1 -1
- package/dist/{composables-COb8tdOP.cjs → composables-BpUFAr7n.cjs} +2 -2
- package/dist/{composables-COb8tdOP.cjs.map → composables-BpUFAr7n.cjs.map} +1 -1
- package/dist/composables.cjs +1 -1
- package/dist/composables.js +2 -2
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.js +39 -39
- package/dist/index.js.map +1 -1
- package/dist/primevue-components.css +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/kpi.d.ts +13 -1
- package/dist/{useFormKeyboardNav-CzKY9ZV2.cjs → useFormKeyboardNav-BTGDH0gB.cjs} +3 -3
- package/dist/useFormKeyboardNav-BTGDH0gB.cjs.map +1 -0
- package/dist/{useFormKeyboardNav-DuxPdAeK.js → useFormKeyboardNav-TqhfyJIg.js} +47 -28
- package/dist/useFormKeyboardNav-TqhfyJIg.js.map +1 -0
- package/dist/utils/chart.d.ts +26 -0
- package/dist/utils/interactiveCard.d.ts +24 -0
- package/dist/utils/meter.d.ts +15 -0
- package/dist/utils/sparkline.d.ts +15 -0
- package/dist/utils/stepFlow.d.ts +7 -0
- package/package.json +1 -1
- package/skill/references/components.md +1 -1
- package/dist/components-C1xO2mrc.cjs +0 -25
- package/dist/components-C1xO2mrc.cjs.map +0 -1
- package/dist/components-D5eeRtRP.js.map +0 -1
- package/dist/useFormKeyboardNav-CzKY9ZV2.cjs.map +0 -1
- package/dist/useFormKeyboardNav-DuxPdAeK.js.map +0 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(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},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));const l=require("./routeTabs-BnVpnSeJ.cjs");let u=require("vue"),d=require("dayjs");d=c(d,1);let f=require("primevue/usetoast"),p=require("primevue/useconfirm");var m={celular:600,retrato:840,desktop:1200};function h(e){let t=(0,u.ref)(!1);if(typeof window>`u`||typeof window.matchMedia!=`function`)return t;let n=window.matchMedia(e);t.value=n.matches;let r=e=>{t.value=e.matches};return n.addEventListener(`change`,r),(0,u.onScopeDispose)(()=>n.removeEventListener(`change`,r)),t}function g(){let e=h(`(max-width: ${m.celular-1}px)`),t=h(`(max-width: ${m.retrato-1}px)`),n=h(`(min-width: ${m.retrato}px)`),r=h(`(min-width: ${m.desktop}px)`),i=h(`(pointer: coarse)`);return{isCelular:(0,u.readonly)(e),isRetrato:(0,u.readonly)(t),isPaisagem:(0,u.readonly)(n),isDesktop:(0,u.readonly)(r),isToque:(0,u.readonly)(i)}}var _=c(o(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):(n=typeof globalThis<`u`?globalThis:n||self).dayjs_plugin_customParseFormat=r()})(e,(function(){"use strict";var e={LTS:`h:mm:ss A`,LT:`h:mm A`,L:`MM/DD/YYYY`,LL:`MMMM D, YYYY`,LLL:`MMMM D, YYYY h:mm A`,LLLL:`dddd, MMMM D, YYYY h:mm A`},t=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\d/,r=/\d\d/,i=/\d\d?/,a=/\d*[^-_:/,()\s\d]+/,o={},s=function(e){return(e=+e)+(e>68?1900:2e3)},c=function(e){return function(t){this[e]=+t}},l=[/[+-]\d\d:?(\d\d)?|Z/,function(e){(this.zone||={}).offset=function(e){if(!e||e===`Z`)return 0;var t=e.match(/([+-]|\d\d)/g),n=60*t[1]+(+t[2]||0);return n===0?0:t[0]===`+`?-n:n}(e)}],u=function(e){var t=o[e];return t&&(t.indexOf?t:t.s.concat(t.f))},d=function(e,t){var n,r=o.meridiem;if(r){for(var i=1;i<=24;i+=1)if(e.indexOf(r(i,0,t))>-1){n=i>12;break}}else n=e===(t?`pm`:`PM`);return n},f={A:[a,function(e){this.afternoon=d(e,!1)}],a:[a,function(e){this.afternoon=d(e,!0)}],Q:[n,function(e){this.month=3*(e-1)+1}],S:[n,function(e){this.milliseconds=100*e}],SS:[r,function(e){this.milliseconds=10*e}],SSS:[/\d{3}/,function(e){this.milliseconds=+e}],s:[i,c(`seconds`)],ss:[i,c(`seconds`)],m:[i,c(`minutes`)],mm:[i,c(`minutes`)],H:[i,c(`hours`)],h:[i,c(`hours`)],HH:[i,c(`hours`)],hh:[i,c(`hours`)],D:[i,c(`day`)],DD:[r,c(`day`)],Do:[a,function(e){var t=o.ordinal,n=e.match(/\d+/);if(this.day=n[0],t)for(var r=1;r<=31;r+=1)t(r).replace(/\[|\]/g,``)===e&&(this.day=r)}],w:[i,c(`week`)],ww:[r,c(`week`)],M:[i,c(`month`)],MM:[r,c(`month`)],MMM:[a,function(e){var t=u(`months`),n=(u(`monthsShort`)||t.map((function(e){return e.slice(0,3)}))).indexOf(e)+1;if(n<1)throw Error();this.month=n%12||n}],MMMM:[a,function(e){var t=u(`months`).indexOf(e)+1;if(t<1)throw Error();this.month=t%12||t}],Y:[/[+-]?\d+/,c(`year`)],YY:[r,function(e){this.year=s(e)}],YYYY:[/\d{4}/,c(`year`)],Z:l,ZZ:l};function p(n){for(var r=n,i=o&&o.formats,a=(n=r.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(t,n,r){var a=r&&r.toUpperCase();return n||i[r]||e[r]||i[a].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(e,t,n){return t||n.slice(1)}))}))).match(t),s=a.length,c=0;c<s;c+=1){var l=a[c],u=f[l],d=u&&u[0],p=u&&u[1];a[c]=p?{regex:d,parser:p}:l.replace(/^\[|\]$/g,``)}return function(e){for(var t={},n=0,r=0;n<s;n+=1){var i=a[n];if(typeof i==`string`)r+=i.length;else{var o=i.regex,c=i.parser,l=e.slice(r),u=o.exec(l)[0];c.call(t,u),e=e.replace(u,``)}}return function(e){var t=e.afternoon;if(t!==void 0){var n=e.hours;t?n<12&&(e.hours+=12):n===12&&(e.hours=0),delete e.afternoon}}(t),t}}return function(e,t,n){n.p.customParseFormat=!0,e&&e.parseTwoDigitYear&&(s=e.parseTwoDigitYear);var r=t.prototype,i=r.parse;r.parse=function(e){var t=e.date,r=e.utc,a=e.args;this.$u=r;var s=a[1];if(typeof s==`string`){var c=!0===a[2],l=!0===a[3],u=c||l,d=a[2];l&&(d=a[2]),o=this.$locale(),!c&&d&&(o=n.Ls[d]),this.$d=function(e,t,n,r){try{if([`x`,`X`].indexOf(t)>-1)return new Date((t===`X`?1e3:1)*e);var i=p(t)(e),a=i.year,o=i.month,s=i.day,c=i.hours,l=i.minutes,u=i.seconds,d=i.milliseconds,f=i.zone,m=i.week,h=new Date,g=s||(a||o?1:h.getDate()),_=a||h.getFullYear(),v=0;a&&!o||(v=o>0?o-1:h.getMonth());var y,b=c||0,x=l||0,S=u||0,C=d||0;return f?new Date(Date.UTC(_,v,g,b,x,S,C+60*f.offset*1e3)):n?new Date(Date.UTC(_,v,g,b,x,S,C)):(y=new Date(_,v,g,b,x,S,C),m&&(y=r(y).week(m).toDate()),y)}catch{return new Date(``)}}(t,s,r,n),this.init(),d&&!0!==d&&(this.$L=this.locale(d).$L),u&&t!=this.format(s)&&(this.$d=new Date(``)),o={}}else if(s instanceof Array)for(var f=s.length,m=1;m<=f;m+=1){a[1]=s[m-1];var h=n.apply(this,a);if(h.isValid()){this.$d=h.$d,this.$L=h.$L,this.init();break}m===f&&(this.$d=new Date(``))}else i.call(this,e)}}}))}))(),1);d.default.extend(_.default);function v(e){if(!e)return null;if(e instanceof Date)return e;let t=(0,d.default)(e,`YYYY-MM-DD`,!0);return t.isValid()?t.toDate():(0,d.default)(e).toDate()}function y(e){return e?typeof e==`string`?e:(0,d.default)(e).format(`YYYY-MM-DD`):null}function b(e){return e?typeof e==`string`?e:(0,d.default)(e).toISOString():null}function x(e,t=`DD/MM/YYYY`){return e?(0,d.default)(e).format(t):`—`}function S(e){return e?(0,d.default)(e).format(`DD/MM/YYYY HH:mm`):`—`}function C(e){return e.replace(/\D/g,``)}function w(e){if(!e)return`—`;let t=C(e);return t.length===11?t.replace(/^(\d{3})(\d{3})(\d{3})(\d{2})$/,`$1.$2.$3-$4`):e}function T(e){if(!e)return`—`;let t=C(e);return t.length===14?t.replace(/^(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})$/,`$1.$2.$3/$4-$5`):e}function E(e){if(!e)return`—`;let t=C(e);return t.length===11?w(e):t.length===14?T(e):e}function D(e){if(!e)return`—`;let t=C(e);return t.length===11?t.replace(/^(\d{2})(\d{5})(\d{4})$/,`($1) $2-$3`):t.length===10?t.replace(/^(\d{2})(\d{4})(\d{4})$/,`($1) $2-$3`):e}function O(e){if(!e)return null;let t=C(e);if(t.length!==11)return`CPF deve ter 11 dígitos.`;if(/^(\d)\1{10}$/.test(t))return`CPF inválido.`;let n=0;for(let e=0;e<9;e++)n+=parseInt(t[e])*(10-e);let r=n%11,i=r<2?0:11-r;if(parseInt(t[9])!==i)return`CPF inválido.`;n=0;for(let e=0;e<10;e++)n+=parseInt(t[e])*(11-e);r=n%11;let a=r<2?0:11-r;return parseInt(t[10])===a?null:`CPF inválido.`}function k(e){if(!e)return null;let t=C(e);if(t.length!==14)return`CNPJ deve ter 14 dígitos.`;if(/^(\d)\1{13}$/.test(t))return`CNPJ inválido.`;let n=[5,4,3,2,9,8,7,6,5,4,3,2],r=0;for(let e=0;e<12;e++)r+=parseInt(t[e])*n[e];let i=r%11,a=i<2?0:11-i;if(parseInt(t[12])!==a)return`CNPJ inválido.`;let o=[6,5,4,3,2,9,8,7,6,5,4,3,2];r=0;for(let e=0;e<13;e++)r+=parseInt(t[e])*o[e];i=r%11;let s=i<2?0:11-i;return parseInt(t[13])===s?null:`CNPJ inválido.`}function A(e){if(!e)return null;let t=C(e);return t.length===11?O(e):t.length===14?k(e):`CPF deve ter 11 dígitos ou CNPJ deve ter 14 dígitos.`}var j=new Map;function M(e,t){let n=`${e}-${t}`,r=j.get(n);return r||(r=new Intl.NumberFormat(e,{minimumFractionDigits:t,maximumFractionDigits:t}),j.set(n,r)),r}function N(e,t){let n=`${e}-${t}`,r=j.get(n);return r||(r=new Intl.NumberFormat(e,{style:`currency`,currency:t}),j.set(n,r)),r}function P(){let e=(0,u.inject)(l.i,{defaultPageSize:20,dateFormat:`DD/MM/YYYY`,dateTimeFormat:`DD/MM/YYYY HH:mm`,locale:`pt-BR`,currency:`BRL`}),t=e?.locale??`pt-BR`,n=e?.currency??`BRL`;function r(e){return e==null?`—`:N(t,n).format(e)}function i(e,n=2){return e==null?`—`:M(t,n).format(e)}function a(t,n){return x(t,n??e?.dateFormat??`DD/MM/YYYY`)}function o(e){return S(e)}function s(e){return e==null?`—`:`${M(t,2).format(e)}%`}return{formatCurrency:r,formatNumber:i,formatDate:a,formatDateTime:o,formatPercent:s,formatCpf:w,formatCnpj:T,formatCpfCnpj:E,formatTelefone:D,validateCpf:O,validateCnpj:k,validateCpfCnpj:A,parseDate:v,toDateString:y,toDateTimeString:b}}function F(e){let t={};for(let n of e)t[n.field]=n.defaultValue===void 0?null:typeof n.defaultValue==`function`?n.defaultValue():n.defaultValue;return t}function I(e,t,n){let r={};for(let i of t){let t=e[i.field]===void 0?null:e[i.field];t&&(i.type===`date`||i.type===`datetime`)&&typeof t==`string`&&(t=v(t)),n[i.field]=t,r[i.field]=t}return r}function L(e,t){let n={...e};for(let e of t){let t=n[e.field];if(e.type===`date`&&t instanceof Date?n[e.field]=y(t):e.type===`datetime`&&t instanceof Date&&(n[e.field]=b(t)),e.type===`fk`&&typeof t==`object`&&t){let r=e.optionValue||`id`;n[e.field]=t[r]??t}(e.type===`mask`||e.type===`cpf_cnpj`)&&typeof t==`string`&&(n[e.field]=C(t))}return n}function R(e,t,n=!1){return e.visible===void 0||e.visible===!0?!0:typeof e.visible==`function`?e.visible(t,n):e.visible}function z(e,t,n=!1){for(let r of e)if(R(r,t,n)){if(r.validate){let e=r.validate(t[r.field],{formData:t,isEditing:n});if(e)return e}if(r.required){let e=t[r.field];if(e==null||e===``)return`${r.label} é obrigatório`}}return null}function B(){let e=(0,f.useToast)();function t(t,n=`Sucesso`){e.add({severity:`success`,summary:n,detail:t,life:3e3})}function n(t,n=`Erro`){e.add({severity:`error`,summary:n,detail:t,life:5e3})}function r(t,n=`Atenção`){e.add({severity:`warn`,summary:n,detail:t,life:4e3})}function i(t,n=`Info`){e.add({severity:`info`,summary:n,detail:t,life:3e3})}return{success:t,error:n,warn:r,info:i}}function V(){let e=(0,p.useConfirm)(),t=l.n(),n=()=>t?.hostEl.value??`body`;function r(t,r=`Deseja realmente excluir este registro?`){e.require({appendTo:n(),message:r,header:`Confirmar Exclusão`,icon:`pi pi-trash`,rejectLabel:`Cancelar`,rejectProps:{severity:`secondary`,text:!0},acceptLabel:`Excluir`,acceptProps:{severity:`danger`},accept:t})}function i(t,r,i=`Confirmação`){e.require({appendTo:n(),message:t,header:i,icon:`pi pi-question-circle`,rejectLabel:`Cancelar`,rejectProps:{severity:`secondary`,text:!0},acceptLabel:`Confirmar`,accept:r})}return{confirmDelete:r,confirmAction:i}}function H(e){return e.replace(/_/g,` `).replace(/^\w/,e=>e.toUpperCase())}function U(e){if(typeof e==`string`)return e;if(Array.isArray(e)){let t=e.filter(e=>typeof e==`string`);return t.length>0?t.join(` `):null}if(typeof e==`object`&&e){let t=e;if(Array.isArray(t.non_field_errors)&&t.non_field_errors.length>0)return t.non_field_errors.filter(e=>typeof e==`string`).join(` `);let n=[];for(let[e,r]of Object.entries(t)){if(e===`non_field_errors`)continue;let t=H(e);if(Array.isArray(r)){let e=r.filter(e=>typeof e==`string`);e.length>0&&n.push(`${t}: ${e.join(` `)}`)}else typeof r==`string`&&n.push(`${t}: ${r}`)}return n.length>0?n.join(`
|
|
2
|
-
`):null}return null}function
|
|
3
|
-
//# sourceMappingURL=useFormKeyboardNav-
|
|
1
|
+
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(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},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));const l=require("./routeTabs-BnVpnSeJ.cjs");let u=require("vue"),d=require("dayjs");d=c(d,1);let f=require("primevue/usetoast"),p=require("primevue/useconfirm");var m={celular:600,retrato:840,desktop:1200};function h(e){let t=(0,u.ref)(!1);if(typeof window>`u`||typeof window.matchMedia!=`function`)return t;let n=window.matchMedia(e);t.value=n.matches;let r=e=>{t.value=e.matches};return n.addEventListener(`change`,r),(0,u.onScopeDispose)(()=>n.removeEventListener(`change`,r)),t}function g(){let e=h(`(max-width: ${m.celular-1}px)`),t=h(`(max-width: ${m.retrato-1}px)`),n=h(`(min-width: ${m.retrato}px)`),r=h(`(min-width: ${m.desktop}px)`),i=h(`(pointer: coarse)`);return{isCelular:(0,u.readonly)(e),isRetrato:(0,u.readonly)(t),isPaisagem:(0,u.readonly)(n),isDesktop:(0,u.readonly)(r),isToque:(0,u.readonly)(i)}}var _=c(o(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):(n=typeof globalThis<`u`?globalThis:n||self).dayjs_plugin_customParseFormat=r()})(e,(function(){"use strict";var e={LTS:`h:mm:ss A`,LT:`h:mm A`,L:`MM/DD/YYYY`,LL:`MMMM D, YYYY`,LLL:`MMMM D, YYYY h:mm A`,LLLL:`dddd, MMMM D, YYYY h:mm A`},t=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\d/,r=/\d\d/,i=/\d\d?/,a=/\d*[^-_:/,()\s\d]+/,o={},s=function(e){return(e=+e)+(e>68?1900:2e3)},c=function(e){return function(t){this[e]=+t}},l=[/[+-]\d\d:?(\d\d)?|Z/,function(e){(this.zone||={}).offset=function(e){if(!e||e===`Z`)return 0;var t=e.match(/([+-]|\d\d)/g),n=60*t[1]+(+t[2]||0);return n===0?0:t[0]===`+`?-n:n}(e)}],u=function(e){var t=o[e];return t&&(t.indexOf?t:t.s.concat(t.f))},d=function(e,t){var n,r=o.meridiem;if(r){for(var i=1;i<=24;i+=1)if(e.indexOf(r(i,0,t))>-1){n=i>12;break}}else n=e===(t?`pm`:`PM`);return n},f={A:[a,function(e){this.afternoon=d(e,!1)}],a:[a,function(e){this.afternoon=d(e,!0)}],Q:[n,function(e){this.month=3*(e-1)+1}],S:[n,function(e){this.milliseconds=100*e}],SS:[r,function(e){this.milliseconds=10*e}],SSS:[/\d{3}/,function(e){this.milliseconds=+e}],s:[i,c(`seconds`)],ss:[i,c(`seconds`)],m:[i,c(`minutes`)],mm:[i,c(`minutes`)],H:[i,c(`hours`)],h:[i,c(`hours`)],HH:[i,c(`hours`)],hh:[i,c(`hours`)],D:[i,c(`day`)],DD:[r,c(`day`)],Do:[a,function(e){var t=o.ordinal,n=e.match(/\d+/);if(this.day=n[0],t)for(var r=1;r<=31;r+=1)t(r).replace(/\[|\]/g,``)===e&&(this.day=r)}],w:[i,c(`week`)],ww:[r,c(`week`)],M:[i,c(`month`)],MM:[r,c(`month`)],MMM:[a,function(e){var t=u(`months`),n=(u(`monthsShort`)||t.map((function(e){return e.slice(0,3)}))).indexOf(e)+1;if(n<1)throw Error();this.month=n%12||n}],MMMM:[a,function(e){var t=u(`months`).indexOf(e)+1;if(t<1)throw Error();this.month=t%12||t}],Y:[/[+-]?\d+/,c(`year`)],YY:[r,function(e){this.year=s(e)}],YYYY:[/\d{4}/,c(`year`)],Z:l,ZZ:l};function p(n){for(var r=n,i=o&&o.formats,a=(n=r.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(t,n,r){var a=r&&r.toUpperCase();return n||i[r]||e[r]||i[a].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(e,t,n){return t||n.slice(1)}))}))).match(t),s=a.length,c=0;c<s;c+=1){var l=a[c],u=f[l],d=u&&u[0],p=u&&u[1];a[c]=p?{regex:d,parser:p}:l.replace(/^\[|\]$/g,``)}return function(e){for(var t={},n=0,r=0;n<s;n+=1){var i=a[n];if(typeof i==`string`)r+=i.length;else{var o=i.regex,c=i.parser,l=e.slice(r),u=o.exec(l)[0];c.call(t,u),e=e.replace(u,``)}}return function(e){var t=e.afternoon;if(t!==void 0){var n=e.hours;t?n<12&&(e.hours+=12):n===12&&(e.hours=0),delete e.afternoon}}(t),t}}return function(e,t,n){n.p.customParseFormat=!0,e&&e.parseTwoDigitYear&&(s=e.parseTwoDigitYear);var r=t.prototype,i=r.parse;r.parse=function(e){var t=e.date,r=e.utc,a=e.args;this.$u=r;var s=a[1];if(typeof s==`string`){var c=!0===a[2],l=!0===a[3],u=c||l,d=a[2];l&&(d=a[2]),o=this.$locale(),!c&&d&&(o=n.Ls[d]),this.$d=function(e,t,n,r){try{if([`x`,`X`].indexOf(t)>-1)return new Date((t===`X`?1e3:1)*e);var i=p(t)(e),a=i.year,o=i.month,s=i.day,c=i.hours,l=i.minutes,u=i.seconds,d=i.milliseconds,f=i.zone,m=i.week,h=new Date,g=s||(a||o?1:h.getDate()),_=a||h.getFullYear(),v=0;a&&!o||(v=o>0?o-1:h.getMonth());var y,b=c||0,x=l||0,S=u||0,C=d||0;return f?new Date(Date.UTC(_,v,g,b,x,S,C+60*f.offset*1e3)):n?new Date(Date.UTC(_,v,g,b,x,S,C)):(y=new Date(_,v,g,b,x,S,C),m&&(y=r(y).week(m).toDate()),y)}catch{return new Date(``)}}(t,s,r,n),this.init(),d&&!0!==d&&(this.$L=this.locale(d).$L),u&&t!=this.format(s)&&(this.$d=new Date(``)),o={}}else if(s instanceof Array)for(var f=s.length,m=1;m<=f;m+=1){a[1]=s[m-1];var h=n.apply(this,a);if(h.isValid()){this.$d=h.$d,this.$L=h.$L,this.init();break}m===f&&(this.$d=new Date(``))}else i.call(this,e)}}}))}))(),1);d.default.extend(_.default);function v(e){if(!e)return null;if(e instanceof Date)return e;let t=(0,d.default)(e,`YYYY-MM-DD`,!0);return t.isValid()?t.toDate():(0,d.default)(e).toDate()}function y(e){return e?typeof e==`string`?e:(0,d.default)(e).format(`YYYY-MM-DD`):null}function b(e){return e?typeof e==`string`?e:(0,d.default)(e).toISOString():null}function x(e,t=`DD/MM/YYYY`){return e?(0,d.default)(e).format(t):`—`}function S(e){return e?(0,d.default)(e).format(`DD/MM/YYYY HH:mm`):`—`}function C(e){return e.replace(/\D/g,``)}function w(e){if(!e)return`—`;let t=C(e);return t.length===11?t.replace(/^(\d{3})(\d{3})(\d{3})(\d{2})$/,`$1.$2.$3-$4`):e}function T(e){if(!e)return`—`;let t=C(e);return t.length===14?t.replace(/^(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})$/,`$1.$2.$3/$4-$5`):e}function E(e){if(!e)return`—`;let t=C(e);return t.length===11?w(e):t.length===14?T(e):e}function D(e){if(!e)return`—`;let t=C(e);return t.length===11?t.replace(/^(\d{2})(\d{5})(\d{4})$/,`($1) $2-$3`):t.length===10?t.replace(/^(\d{2})(\d{4})(\d{4})$/,`($1) $2-$3`):e}function O(e){if(!e)return null;let t=C(e);if(t.length!==11)return`CPF deve ter 11 dígitos.`;if(/^(\d)\1{10}$/.test(t))return`CPF inválido.`;let n=0;for(let e=0;e<9;e++)n+=parseInt(t[e])*(10-e);let r=n%11,i=r<2?0:11-r;if(parseInt(t[9])!==i)return`CPF inválido.`;n=0;for(let e=0;e<10;e++)n+=parseInt(t[e])*(11-e);r=n%11;let a=r<2?0:11-r;return parseInt(t[10])===a?null:`CPF inválido.`}function k(e){if(!e)return null;let t=C(e);if(t.length!==14)return`CNPJ deve ter 14 dígitos.`;if(/^(\d)\1{13}$/.test(t))return`CNPJ inválido.`;let n=[5,4,3,2,9,8,7,6,5,4,3,2],r=0;for(let e=0;e<12;e++)r+=parseInt(t[e])*n[e];let i=r%11,a=i<2?0:11-i;if(parseInt(t[12])!==a)return`CNPJ inválido.`;let o=[6,5,4,3,2,9,8,7,6,5,4,3,2];r=0;for(let e=0;e<13;e++)r+=parseInt(t[e])*o[e];i=r%11;let s=i<2?0:11-i;return parseInt(t[13])===s?null:`CNPJ inválido.`}function A(e){if(!e)return null;let t=C(e);return t.length===11?O(e):t.length===14?k(e):`CPF deve ter 11 dígitos ou CNPJ deve ter 14 dígitos.`}var j=new Map;function M(e,t){let n=`${e}-${t}`,r=j.get(n);return r||(r=new Intl.NumberFormat(e,{minimumFractionDigits:t,maximumFractionDigits:t}),j.set(n,r)),r}function N(e,t){let n=`${e}-${t}`,r=j.get(n);return r||(r=new Intl.NumberFormat(e,{style:`currency`,currency:t}),j.set(n,r)),r}function P(e,t){let n=`${e}-compact-${t??``}`,r=j.get(n);return r||(r=new Intl.NumberFormat(e,{notation:`compact`,maximumFractionDigits:1,...t?{style:`currency`,currency:t}:{}}),j.set(n,r)),r}function F(){let e=(0,u.inject)(l.i,{defaultPageSize:20,dateFormat:`DD/MM/YYYY`,dateTimeFormat:`DD/MM/YYYY HH:mm`,locale:`pt-BR`,currency:`BRL`}),t=e?.locale??`pt-BR`,n=e?.currency??`BRL`;function r(e){return e==null?`—`:N(t,n).format(e)}function i(e,n=2){return e==null?`—`:M(t,n).format(e)}function a(t,n){return x(t,n??e?.dateFormat??`DD/MM/YYYY`)}function o(e){return S(e)}function s(e){return e==null?`—`:`${M(t,2).format(e)}%`}function c(e){return e==null?`—`:Math.abs(e)<1e3?r(e):P(t,n).format(e)}function d(e){return e==null?`—`:P(t).format(e)}return{formatCurrency:r,formatCurrencyCompact:c,formatNumberCompact:d,formatNumber:i,formatDate:a,formatDateTime:o,formatPercent:s,formatCpf:w,formatCnpj:T,formatCpfCnpj:E,formatTelefone:D,validateCpf:O,validateCnpj:k,validateCpfCnpj:A,parseDate:v,toDateString:y,toDateTimeString:b}}function I(e){let t={};for(let n of e)t[n.field]=n.defaultValue===void 0?null:typeof n.defaultValue==`function`?n.defaultValue():n.defaultValue;return t}function L(e,t,n){let r={};for(let i of t){let t=e[i.field]===void 0?null:e[i.field];t&&(i.type===`date`||i.type===`datetime`)&&typeof t==`string`&&(t=v(t)),n[i.field]=t,r[i.field]=t}return r}function R(e,t){let n={...e};for(let e of t){let t=n[e.field];if(e.type===`date`&&t instanceof Date?n[e.field]=y(t):e.type===`datetime`&&t instanceof Date&&(n[e.field]=b(t)),e.type===`fk`&&typeof t==`object`&&t){let r=e.optionValue||`id`;n[e.field]=t[r]??t}(e.type===`mask`||e.type===`cpf_cnpj`)&&typeof t==`string`&&(n[e.field]=C(t))}return n}function z(e,t,n=!1){return e.visible===void 0||e.visible===!0?!0:typeof e.visible==`function`?e.visible(t,n):e.visible}function B(e,t,n=!1){for(let r of e)if(z(r,t,n)){if(r.validate){let e=r.validate(t[r.field],{formData:t,isEditing:n});if(e)return e}if(r.required){let e=t[r.field];if(e==null||e===``)return`${r.label} é obrigatório`}}return null}function V(){let e=(0,f.useToast)();function t(t,n=`Sucesso`){e.add({severity:`success`,summary:n,detail:t,life:3e3})}function n(t,n=`Erro`){e.add({severity:`error`,summary:n,detail:t,life:5e3})}function r(t,n=`Atenção`){e.add({severity:`warn`,summary:n,detail:t,life:4e3})}function i(t,n=`Info`){e.add({severity:`info`,summary:n,detail:t,life:3e3})}return{success:t,error:n,warn:r,info:i}}function H(){let e=(0,p.useConfirm)(),t=l.n(),n=()=>t?.hostEl.value??`body`;function r(t,r=`Deseja realmente excluir este registro?`){e.require({appendTo:n(),message:r,header:`Confirmar Exclusão`,icon:`pi pi-trash`,rejectLabel:`Cancelar`,rejectProps:{severity:`secondary`,text:!0},acceptLabel:`Excluir`,acceptProps:{severity:`danger`},accept:t})}function i(t,r,i=`Confirmação`){e.require({appendTo:n(),message:t,header:i,icon:`pi pi-question-circle`,rejectLabel:`Cancelar`,rejectProps:{severity:`secondary`,text:!0},acceptLabel:`Confirmar`,accept:r})}return{confirmDelete:r,confirmAction:i}}function U(e){return e.replace(/_/g,` `).replace(/^\w/,e=>e.toUpperCase())}function W(e){if(typeof e==`string`)return e;if(Array.isArray(e)){let t=e.filter(e=>typeof e==`string`);return t.length>0?t.join(` `):null}if(typeof e==`object`&&e){let t=e;if(Array.isArray(t.non_field_errors)&&t.non_field_errors.length>0)return t.non_field_errors.filter(e=>typeof e==`string`).join(` `);let n=[];for(let[e,r]of Object.entries(t)){if(e===`non_field_errors`)continue;let t=U(e);if(Array.isArray(r)){let e=r.filter(e=>typeof e==`string`);e.length>0&&n.push(`${t}: ${e.join(` `)}`)}else typeof r==`string`&&n.push(`${t}: ${r}`)}return n.length>0?n.join(`
|
|
2
|
+
`):null}return null}function G(e,t=`Erro inesperado`){if(!e||typeof e!=`object`)return t;let n=e,r=n.response?.data;return!r||typeof r!=`object`?n.message||t:W(r.detail??r)||t}function K(){return{extractApiError:G}}d.default.extend(_.default);var q=`DD/MM/YYYY`,J=`DD/MM/YYYY HH:mm`,Y=`YYYY-MM-DD`,X=`YYYY-MM-DDTHH:mm:ss`;function Z(e={}){let t=()=>e.showTime?.()??!1,n=()=>t()?J:q,r=()=>t()?`##/##/#### ##:##`:`##/##/####`,i=()=>t()?`dd/mm/aaaa hh:mm`:`dd/mm/aaaa`;function a(e){if(e==null||e===``)return null;if(e instanceof Date)return isNaN(e.getTime())?null:e;if(typeof e==`string`){let t=(0,d.default)(e,Y,!0);if(t.isValid())return t.toDate();let n=(0,d.default)(e);return n.isValid()?n.toDate():null}return null}function o(n){return n?(e.valueFormat?.()??`iso`)===`date`?n:(0,d.default)(n).format(t()?X:Y):null}function s(e){return e?(0,d.default)(e).format(n()):``}function c(e){if(!e)return null;let t=(0,d.default)(e,n(),!0);return t.isValid()?t.toDate():null}function l(){return t()?new Date:(0,d.default)().startOf(`day`).toDate()}return{toDate:a,toValue:o,toDisplay:s,fromDisplay:c,today:l,mask:r,placeholder:i,displayFormat:n}}var Q=[`input:not([type="hidden"]):not([disabled])`,`textarea:not([disabled])`,`select:not([disabled])`,`button:not([disabled])`,`[tabindex]:not([tabindex="-1"])`,`[contenteditable="true"]`].join(`, `),$=`.p-select, .p-multiselect, .p-cascadeselect, .p-treeselect`,ee=`.w-segmented, .w-choice, .p-selectbutton, [role="radiogroup"]`;function te(e,t={}){let n=()=>!t.enabled||t.enabled();function r(){let t=e.value;return t?Array.from(t.querySelectorAll(Q)).filter(e=>e.getClientRects().length>0&&!e.hasAttribute(`data-kbd-skip`)):[]}function i(){n()&&(0,u.nextTick)(()=>{let e=r(),t=e.find(e=>e.tagName!==`BUTTON`)??e[0];if(!t)return;t.focus();let n=t;if(typeof n.select==`function`)try{n.select()}catch{}})}function a(e){if(!n()||e.key!==`Enter`||e.isComposing)return;let i=e.target;if(i.tagName===`TEXTAREA`)return;let a=i.closest(ee);if(i.tagName===`BUTTON`&&!a||(e.preventDefault(),i.closest(`[data-kbd-hold]`))||i.closest(`[aria-expanded="true"]`))return;i.closest($)&&e.stopPropagation();let o=r(),s=o.indexOf(i);if(s===-1)return;let c=o.slice(s+1).find(e=>!a||!a.contains(e));c?c.focus():t.onSubmit?.()}return{focusFirst:i,handleKeydown:a}}Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return te}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return c}});
|
|
3
|
+
//# sourceMappingURL=useFormKeyboardNav-BTGDH0gB.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFormKeyboardNav-BTGDH0gB.cjs","names":[],"sources":["../src/composables/useBreakpoint.ts","../node_modules/dayjs/plugin/customParseFormat.js","../src/utils/dates.ts","../src/utils/masks.ts","../src/composables/useFormatters.ts","../src/utils/formRecord.ts","../src/composables/useAppToast.ts","../src/composables/useAppConfirm.ts","../src/composables/useApiError.ts","../src/composables/useDateInput.ts","../src/composables/useFormKeyboardNav.ts"],"sourcesContent":["import { onScopeDispose, readonly, ref, type Ref } from 'vue'\n\n/**\n * Faixas de largura da suite — a régua de layout.\n *\n * ```\n * < 600px celular 1 coluna, navegação colapsada\n * 600-839px tablet RETRATO 1 painel por vez, drill-in com voltar\n * 840-1199px tablet PAISAGEM 2 painéis lado a lado\n * >= 1200px desktop 2-3 painéis, densidade de mesa\n * ```\n *\n * 840px é a fronteira medium/expanded do Material — a única com dado de parque\n * (93,7% dos tablets em retrato abaixo dela, 97,2% em paisagem acima). Todo\n * tablet de 10-11\" em retrato mede 768-876 CSS px; em paisagem, >= 1024.\n *\n * **Largura, nunca `orientation`**: travar ou ramificar por orientação é falha de\n * acessibilidade (WCAG 1.3.4), e um tablet de 12,9\" em retrato tem largura de\n * laptop — ele deve receber o layout de duas colunas.\n */\nexport const BREAKPOINTS = {\n /** Acima disto é tablet ou maior. */\n celular: 600,\n /** Acima disto cabem dois painéis lado a lado. */\n retrato: 840,\n /** Acima disto é mesa: densidade e três painéis liberados. */\n desktop: 1200,\n} as const\n\n/** Uma media query reativa, com limpeza automática ao sair do escopo. */\nfunction useMediaQuery(query: string): Ref<boolean> {\n const matches = ref(false)\n\n // Sem `window` (SSR, teste em ambiente node) a resposta é `false` — o layout\n // de mesa é o default e o cliente corrige na hidratação.\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return matches\n }\n\n const mql = window.matchMedia(query)\n matches.value = mql.matches\n\n const onChange = (event: MediaQueryListEvent) => {\n matches.value = event.matches\n }\n mql.addEventListener('change', onChange)\n onScopeDispose(() => mql.removeEventListener('change', onChange))\n\n return matches\n}\n\n/**\n * Em qual faixa a janela está, e se o ponteiro primário é o dedo.\n *\n * `isToque` vem de `pointer: coarse` — o ponteiro **primário**, então notebook\n * com tela sensível continua reportando `fine` e não é afetado.\n *\n * ```ts\n * const { isRetrato, isToque } = useBreakpoint()\n * // isRetrato: uma coluna, drill-in, tabela vira card\n * ```\n */\nexport function useBreakpoint() {\n const isCelular = useMediaQuery(`(max-width: ${BREAKPOINTS.celular - 1}px)`)\n /** Tablet em pé ou menor: um painel por vez. */\n const isRetrato = useMediaQuery(`(max-width: ${BREAKPOINTS.retrato - 1}px)`)\n /** Tablet deitado ou maior: cabem dois painéis. */\n const isPaisagem = useMediaQuery(`(min-width: ${BREAKPOINTS.retrato}px)`)\n const isDesktop = useMediaQuery(`(min-width: ${BREAKPOINTS.desktop}px)`)\n /** O dedo é o ponteiro: alvos maiores, sem hover. */\n const isToque = useMediaQuery('(pointer: coarse)')\n\n return {\n isCelular: readonly(isCelular),\n isRetrato: readonly(isRetrato),\n isPaisagem: readonly(isPaisagem),\n isDesktop: readonly(isDesktop),\n isToque: readonly(isToque),\n }\n}\n","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_customParseFormat=t()}(this,(function(){\"use strict\";var e={LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"},t=/(\\[[^[]*\\])|([-_:/.,()\\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\\d/,r=/\\d\\d/,i=/\\d\\d?/,o=/\\d*[^-_:/,()\\s\\d]+/,s={},a=function(e){return(e=+e)+(e>68?1900:2e3)};var f=function(e){return function(t){this[e]=+t}},h=[/[+-]\\d\\d:?(\\d\\d)?|Z/,function(e){(this.zone||(this.zone={})).offset=function(e){if(!e)return 0;if(\"Z\"===e)return 0;var t=e.match(/([+-]|\\d\\d)/g),n=60*t[1]+(+t[2]||0);return 0===n?0:\"+\"===t[0]?-n:n}(e)}],u=function(e){var t=s[e];return t&&(t.indexOf?t:t.s.concat(t.f))},d=function(e,t){var n,r=s.meridiem;if(r){for(var i=1;i<=24;i+=1)if(e.indexOf(r(i,0,t))>-1){n=i>12;break}}else n=e===(t?\"pm\":\"PM\");return n},c={A:[o,function(e){this.afternoon=d(e,!1)}],a:[o,function(e){this.afternoon=d(e,!0)}],Q:[n,function(e){this.month=3*(e-1)+1}],S:[n,function(e){this.milliseconds=100*+e}],SS:[r,function(e){this.milliseconds=10*+e}],SSS:[/\\d{3}/,function(e){this.milliseconds=+e}],s:[i,f(\"seconds\")],ss:[i,f(\"seconds\")],m:[i,f(\"minutes\")],mm:[i,f(\"minutes\")],H:[i,f(\"hours\")],h:[i,f(\"hours\")],HH:[i,f(\"hours\")],hh:[i,f(\"hours\")],D:[i,f(\"day\")],DD:[r,f(\"day\")],Do:[o,function(e){var t=s.ordinal,n=e.match(/\\d+/);if(this.day=n[0],t)for(var r=1;r<=31;r+=1)t(r).replace(/\\[|\\]/g,\"\")===e&&(this.day=r)}],w:[i,f(\"week\")],ww:[r,f(\"week\")],M:[i,f(\"month\")],MM:[r,f(\"month\")],MMM:[o,function(e){var t=u(\"months\"),n=(u(\"monthsShort\")||t.map((function(e){return e.slice(0,3)}))).indexOf(e)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[o,function(e){var t=u(\"months\").indexOf(e)+1;if(t<1)throw new Error;this.month=t%12||t}],Y:[/[+-]?\\d+/,f(\"year\")],YY:[r,function(e){this.year=a(e)}],YYYY:[/\\d{4}/,f(\"year\")],Z:h,ZZ:h};function l(n){var r,i;r=n,i=s&&s.formats;for(var o=(n=r.replace(/(\\[[^\\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(t,n,r){var o=r&&r.toUpperCase();return n||i[r]||e[r]||i[o].replace(/(\\[[^\\]]+])|(MMMM|MM|DD|dddd)/g,(function(e,t,n){return t||n.slice(1)}))}))).match(t),a=o.length,f=0;f<a;f+=1){var h=o[f],u=c[h],d=u&&u[0],l=u&&u[1];o[f]=l?{regex:d,parser:l}:h.replace(/^\\[|\\]$/g,\"\")}return function(e){for(var t={},n=0,r=0;n<a;n+=1){var i=o[n];if(\"string\"==typeof i)r+=i.length;else{var s=i.regex,f=i.parser,h=e.slice(r),u=s.exec(h)[0];f.call(t,u),e=e.replace(u,\"\")}}return function(e){var t=e.afternoon;if(void 0!==t){var n=e.hours;t?n<12&&(e.hours+=12):12===n&&(e.hours=0),delete e.afternoon}}(t),t}}return function(e,t,n){n.p.customParseFormat=!0,e&&e.parseTwoDigitYear&&(a=e.parseTwoDigitYear);var r=t.prototype,i=r.parse;r.parse=function(e){var t=e.date,r=e.utc,o=e.args;this.$u=r;var a=o[1];if(\"string\"==typeof a){var f=!0===o[2],h=!0===o[3],u=f||h,d=o[2];h&&(d=o[2]),s=this.$locale(),!f&&d&&(s=n.Ls[d]),this.$d=function(e,t,n,r){try{if([\"x\",\"X\"].indexOf(t)>-1)return new Date((\"X\"===t?1e3:1)*e);var i=l(t)(e),o=i.year,s=i.month,a=i.day,f=i.hours,h=i.minutes,u=i.seconds,d=i.milliseconds,c=i.zone,m=i.week,M=new Date,Y=a||(o||s?1:M.getDate()),p=o||M.getFullYear(),v=0;o&&!s||(v=s>0?s-1:M.getMonth());var D,w=f||0,g=h||0,y=u||0,L=d||0;return c?new Date(Date.UTC(p,v,Y,w,g,y,L+60*c.offset*1e3)):n?new Date(Date.UTC(p,v,Y,w,g,y,L)):(D=new Date(p,v,Y,w,g,y,L),m&&(D=r(D).week(m).toDate()),D)}catch(e){return new Date(\"\")}}(t,a,r,n),this.init(),d&&!0!==d&&(this.$L=this.locale(d).$L),u&&t!=this.format(a)&&(this.$d=new Date(\"\")),s={}}else if(a instanceof Array)for(var c=a.length,m=1;m<=c;m+=1){o[1]=a[m-1];var M=n.apply(this,o);if(M.isValid()){this.$d=M.$d,this.$L=M.$L,this.init();break}m===c&&(this.$d=new Date(\"\"))}else i.call(this,e)}}}));","import dayjs from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\n\ndayjs.extend(customParseFormat)\n\nexport function parseDate(value: string | Date | null | undefined): Date | null {\n if (!value) return null\n if (value instanceof Date) return value\n const d = dayjs(value, 'YYYY-MM-DD', true)\n return d.isValid() ? d.toDate() : dayjs(value).toDate()\n}\n\nexport function toDateString(value: Date | string | null | undefined): string | null {\n if (!value) return null\n if (typeof value === 'string') return value\n return dayjs(value).format('YYYY-MM-DD')\n}\n\nexport function toDateTimeString(value: Date | string | null | undefined): string | null {\n if (!value) return null\n if (typeof value === 'string') return value\n return dayjs(value).toISOString()\n}\n\nexport function formatDateValue(\n value: string | Date | null | undefined,\n format = 'DD/MM/YYYY',\n): string {\n if (!value) return '—'\n return dayjs(value).format(format)\n}\n\nexport function formatDateTimeValue(value: string | Date | null | undefined): string {\n if (!value) return '—'\n return dayjs(value).format('DD/MM/YYYY HH:mm')\n}\n","export function stripMask(value: string): string {\n return value.replace(/\\D/g, '')\n}\n\nexport function formatCpf(value: string | null | undefined): string {\n if (!value) return '—'\n const digits = stripMask(value)\n if (digits.length !== 11) return value\n return digits.replace(/^(\\d{3})(\\d{3})(\\d{3})(\\d{2})$/, '$1.$2.$3-$4')\n}\n\nexport function formatCnpj(value: string | null | undefined): string {\n if (!value) return '—'\n const digits = stripMask(value)\n if (digits.length !== 14) return value\n return digits.replace(/^(\\d{2})(\\d{3})(\\d{3})(\\d{4})(\\d{2})$/, '$1.$2.$3/$4-$5')\n}\n\nexport function formatCpfCnpj(value: string | null | undefined): string {\n if (!value) return '—'\n const digits = stripMask(value)\n if (digits.length === 11) return formatCpf(value)\n if (digits.length === 14) return formatCnpj(value)\n return value\n}\n\nexport function formatTelefone(value: string | null | undefined): string {\n if (!value) return '—'\n const digits = stripMask(value)\n if (digits.length === 11) return digits.replace(/^(\\d{2})(\\d{5})(\\d{4})$/, '($1) $2-$3')\n if (digits.length === 10) return digits.replace(/^(\\d{2})(\\d{4})(\\d{4})$/, '($1) $2-$3')\n return value\n}\n\nexport function validateCpf(value: string | null | undefined): string | null {\n if (!value) return null\n const cpf = stripMask(value)\n if (cpf.length !== 11) return 'CPF deve ter 11 dígitos.'\n if (/^(\\d)\\1{10}$/.test(cpf)) return 'CPF inválido.'\n let soma = 0\n for (let i = 0; i < 9; i++) soma += parseInt(cpf[i]) * (10 - i)\n let resto = soma % 11\n const d1 = resto < 2 ? 0 : 11 - resto\n if (parseInt(cpf[9]) !== d1) return 'CPF inválido.'\n soma = 0\n for (let i = 0; i < 10; i++) soma += parseInt(cpf[i]) * (11 - i)\n resto = soma % 11\n const d2 = resto < 2 ? 0 : 11 - resto\n if (parseInt(cpf[10]) !== d2) return 'CPF inválido.'\n return null\n}\n\nexport function validateCnpj(value: string | null | undefined): string | null {\n if (!value) return null\n const cnpj = stripMask(value)\n if (cnpj.length !== 14) return 'CNPJ deve ter 14 dígitos.'\n if (/^(\\d)\\1{13}$/.test(cnpj)) return 'CNPJ inválido.'\n const pesos1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]\n let soma = 0\n for (let i = 0; i < 12; i++) soma += parseInt(cnpj[i]) * pesos1[i]\n let resto = soma % 11\n const d1 = resto < 2 ? 0 : 11 - resto\n if (parseInt(cnpj[12]) !== d1) return 'CNPJ inválido.'\n const pesos2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]\n soma = 0\n for (let i = 0; i < 13; i++) soma += parseInt(cnpj[i]) * pesos2[i]\n resto = soma % 11\n const d2 = resto < 2 ? 0 : 11 - resto\n if (parseInt(cnpj[13]) !== d2) return 'CNPJ inválido.'\n return null\n}\n\nexport function validateCpfCnpj(value: string | null | undefined): string | null {\n if (!value) return null\n const digits = stripMask(value)\n if (digits.length === 11) return validateCpf(value)\n if (digits.length === 14) return validateCnpj(value)\n return 'CPF deve ter 11 dígitos ou CNPJ deve ter 14 dígitos.'\n}\n","import { inject } from 'vue'\nimport { W_CONFIG_KEY } from '@/types/plugin'\nimport type { WPluginConfig } from '@/types/plugin'\nimport {\n formatDateValue,\n formatDateTimeValue,\n parseDate,\n toDateString,\n toDateTimeString,\n} from '@/utils/dates'\nimport {\n formatCpf,\n formatCnpj,\n formatCpfCnpj,\n formatTelefone,\n validateCpf,\n validateCnpj,\n validateCpfCnpj,\n} from '@/utils/masks'\n\nconst numberFormatters = new Map<string, Intl.NumberFormat>()\n\nfunction getNumberFormatter(locale: string, decimals: number): Intl.NumberFormat {\n const key = `${locale}-${decimals}`\n let fmt = numberFormatters.get(key)\n if (!fmt) {\n fmt = new Intl.NumberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n })\n numberFormatters.set(key, fmt)\n }\n return fmt\n}\n\nfunction getCurrencyFormatter(locale: string, currency: string): Intl.NumberFormat {\n const key = `${locale}-${currency}`\n let fmt = numberFormatters.get(key)\n if (!fmt) {\n fmt = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n })\n numberFormatters.set(key, fmt)\n }\n return fmt\n}\n\nfunction getCompactFormatter(locale: string, currency?: string): Intl.NumberFormat {\n const key = `${locale}-compact-${currency ?? ''}`\n let fmt = numberFormatters.get(key)\n if (!fmt) {\n fmt = new Intl.NumberFormat(locale, {\n notation: 'compact',\n maximumFractionDigits: 1,\n ...(currency ? { style: 'currency' as const, currency } : {}),\n })\n numberFormatters.set(key, fmt)\n }\n return fmt\n}\n\nexport function useFormatters() {\n const config = inject<WPluginConfig>(W_CONFIG_KEY, {\n defaultPageSize: 20,\n dateFormat: 'DD/MM/YYYY',\n dateTimeFormat: 'DD/MM/YYYY HH:mm',\n locale: 'pt-BR',\n currency: 'BRL',\n } as WPluginConfig)\n\n const locale = config?.locale ?? 'pt-BR'\n const currencyCode = config?.currency ?? 'BRL'\n\n function formatCurrency(value: number | null | undefined): string {\n if (value == null) return '—'\n return getCurrencyFormatter(locale, currencyCode).format(value)\n }\n\n function formatNumber(value: number | null | undefined, decimals = 2): string {\n if (value == null) return '—'\n return getNumberFormatter(locale, decimals).format(value)\n }\n\n function formatDate(value: string | Date | null | undefined, format?: string): string {\n return formatDateValue(value, format ?? config?.dateFormat ?? 'DD/MM/YYYY')\n }\n\n function formatDateTime(value: string | Date | null | undefined): string {\n return formatDateTimeValue(value)\n }\n\n function formatPercent(value: number | null | undefined): string {\n if (value == null) return '—'\n return `${getNumberFormatter(locale, 2).format(value)}%`\n }\n\n /** Moeda em notação compacta: `R$ 1,2 mi`, `R$ 350 mil`. Abaixo de mil, o formato cheio. */\n function formatCurrencyCompact(value: number | null | undefined): string {\n if (value == null) return '—'\n if (Math.abs(value) < 1000) return formatCurrency(value)\n return getCompactFormatter(locale, currencyCode).format(value)\n }\n\n /** Número em notação compacta: `12,5 mil`, `1,2 mi`. Abaixo de mil, até uma casa. */\n function formatNumberCompact(value: number | null | undefined): string {\n if (value == null) return '—'\n return getCompactFormatter(locale).format(value)\n }\n\n return {\n formatCurrency,\n formatCurrencyCompact,\n formatNumberCompact,\n formatNumber,\n formatDate,\n formatDateTime,\n formatPercent,\n formatCpf,\n formatCnpj,\n formatCpfCnpj,\n formatTelefone,\n validateCpf,\n validateCnpj,\n validateCpfCnpj,\n parseDate,\n toDateString,\n toDateTimeString,\n }\n}\n","/**\n * Regras de formulário que independem de onde o registro é gravado.\n *\n * Nasceram dentro do `useCrudManager` (que grava numa API) e saíram para cá quando o\n * `useSubviewCrud` passou a precisar das mesmas: um form é um form, o destino do\n * payload é que muda. Manter uma cópia em cada manager faria as duas divergirem no\n * primeiro `FieldType` novo.\n */\nimport type { FieldDef } from '@/types/field'\nimport { parseDate, toDateString, toDateTimeString } from './dates'\nimport { stripMask } from './masks'\n\n/** Valor inicial de cada campo: `defaultValue` (avaliado, se função) ou `null`. */\nexport function getFieldDefaults(fields: FieldDef[]): Record<string, unknown> {\n const defaults: Record<string, unknown> = {}\n for (const f of fields) {\n defaults[f.field] =\n f.defaultValue !== undefined\n ? typeof f.defaultValue === 'function'\n ? (f.defaultValue as () => unknown)()\n : f.defaultValue\n : null\n }\n return defaults\n}\n\n/**\n * Lê um registro existente para dentro do form.\n *\n * Data vem do servidor como string e o `WDatePicker` trabalha com `Date` — por isso a\n * volta por `parseDate`. Devolve o snapshot dos valores carregados, que o chamador usa\n * como base do diff quando quiser mandar só o que mudou.\n */\nexport function loadItemIntoRecord(\n item: Record<string, unknown>,\n fields: FieldDef[],\n target: Record<string, unknown>,\n): Record<string, unknown> {\n const snapshot: Record<string, unknown> = {}\n for (const f of fields) {\n let value = item[f.field] !== undefined ? item[f.field] : null\n if (value && (f.type === 'date' || f.type === 'datetime') && typeof value === 'string') {\n value = parseDate(value)\n }\n target[f.field] = value\n snapshot[f.field] = value\n }\n return snapshot\n}\n\n/**\n * Converte o form no registro que vai ser gravado: data vira string, FK vira id, campo\n * mascarado perde a máscara. Devolve objeto novo — o form não é tocado.\n */\nexport function convertFormRecord(\n record: Record<string, unknown>,\n fields: FieldDef[],\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...record }\n for (const f of fields) {\n const val = out[f.field]\n\n // Datas\n if (f.type === 'date' && val instanceof Date) {\n out[f.field] = toDateString(val)\n } else if (f.type === 'datetime' && val instanceof Date) {\n out[f.field] = toDateTimeString(val)\n }\n\n // FK — extrair o ID do objeto selecionado\n if (f.type === 'fk' && val !== null && typeof val === 'object') {\n const key = f.optionValue || 'id'\n out[f.field] = (val as Record<string, unknown>)[key] ?? val\n }\n\n // Máscaras — strip para gravar só dígitos\n if ((f.type === 'mask' || f.type === 'cpf_cnpj') && typeof val === 'string') {\n out[f.field] = stripMask(val)\n }\n }\n return out\n}\n\n/** Resolve `visible` do campo (boolean ou função) para o estado atual do form. */\nexport function isFieldVisible(\n field: FieldDef,\n formData: Record<string, unknown>,\n isEditing = false,\n): boolean {\n if (field.visible === undefined || field.visible === true) return true\n if (typeof field.visible === 'function') return field.visible(formData, isEditing)\n return field.visible\n}\n\n/**\n * Primeira mensagem de erro do form, ou `null` se está tudo certo.\n *\n * Campo oculto (`visible` falso para o form atual) não é validado: o usuário não\n * tem como preenchê-lo, então `required`/`validate` dele não podem barrar o save.\n *\n * A ordem importa: o `validate` do campo vence a obrigatoriedade, para a mensagem\n * específica (\"CNPJ inválido\") aparecer no lugar da genérica.\n */\nexport function validateFormRecord(\n fields: FieldDef[],\n formData: Record<string, unknown>,\n isEditing = false,\n): string | null {\n for (const f of fields) {\n if (!isFieldVisible(f, formData, isEditing)) continue\n if (f.validate) {\n const result = f.validate(formData[f.field], { formData, isEditing })\n if (result) return result\n }\n if (f.required) {\n const val = formData[f.field]\n if (val === null || val === undefined || val === '') {\n return `${f.label} é obrigatório`\n }\n }\n }\n return null\n}\n","import { useToast } from 'primevue/usetoast'\n\nexport function useAppToast() {\n const toast = useToast()\n\n function success(message: string, title = 'Sucesso') {\n toast.add({ severity: 'success', summary: title, detail: message, life: 3000 })\n }\n\n function error(message: string, title = 'Erro') {\n toast.add({ severity: 'error', summary: title, detail: message, life: 5000 })\n }\n\n function warn(message: string, title = 'Atenção') {\n toast.add({ severity: 'warn', summary: title, detail: message, life: 4000 })\n }\n\n function info(message: string, title = 'Info') {\n toast.add({ severity: 'info', summary: title, detail: message, life: 3000 })\n }\n\n return { success, error, warn, info }\n}\n","import { useConfirm } from 'primevue/useconfirm'\nimport { useTabHost } from '@/types/routeTabs'\n\nexport function useAppConfirm() {\n const confirm = useConfirm()\n // Dentro da navegação por abas, o confirm pendura no pane da própria aba\n // (some e volta com ela); fora de abas, o body de sempre. O ConfirmDialog\n // global continua único — só a âncora muda, por confirmação.\n const tabHost = useTabHost()\n const appendTo = () => tabHost?.hostEl.value ?? 'body'\n\n function confirmDelete(\n onAccept: () => void,\n message = 'Deseja realmente excluir este registro?',\n ) {\n confirm.require({\n appendTo: appendTo(),\n message,\n header: 'Confirmar Exclusão',\n icon: 'pi pi-trash',\n rejectLabel: 'Cancelar',\n rejectProps: {\n severity: 'secondary',\n text: true,\n },\n acceptLabel: 'Excluir',\n acceptProps: {\n severity: 'danger',\n },\n accept: onAccept,\n })\n }\n\n function confirmAction(message: string, onAccept: () => void, header = 'Confirmação') {\n confirm.require({\n appendTo: appendTo(),\n message,\n header,\n icon: 'pi pi-question-circle',\n rejectLabel: 'Cancelar',\n rejectProps: {\n severity: 'secondary',\n text: true,\n },\n acceptLabel: 'Confirmar',\n accept: onAccept,\n })\n }\n\n return { confirmDelete, confirmAction }\n}\n","function formatFieldName(field: string): string {\n return field.replace(/_/g, ' ').replace(/^\\w/, (c) => c.toUpperCase())\n}\n\nfunction extractMessage(detail: unknown): string | null {\n if (typeof detail === 'string') {\n return detail\n }\n\n if (Array.isArray(detail)) {\n const messages = detail.filter((item) => typeof item === 'string')\n return messages.length > 0 ? messages.join(' ') : null\n }\n\n if (typeof detail === 'object' && detail !== null) {\n const obj = detail as Record<string, unknown>\n\n if (Array.isArray(obj.non_field_errors) && obj.non_field_errors.length > 0) {\n return obj.non_field_errors.filter((item: unknown) => typeof item === 'string').join(' ')\n }\n\n const messages: string[] = []\n for (const [key, value] of Object.entries(obj)) {\n if (key === 'non_field_errors') continue\n const label = formatFieldName(key)\n if (Array.isArray(value)) {\n const strs = value.filter((item: unknown) => typeof item === 'string')\n if (strs.length > 0) messages.push(`${label}: ${strs.join(' ')}`)\n } else if (typeof value === 'string') {\n messages.push(`${label}: ${value}`)\n }\n }\n return messages.length > 0 ? messages.join('\\n') : null\n }\n\n return null\n}\n\nexport function extractApiError(error: unknown, fallback = 'Erro inesperado'): string {\n if (!error || typeof error !== 'object') return fallback\n\n const axiosError = error as {\n response?: { data?: Record<string, unknown> }\n message?: string\n }\n const data = axiosError.response?.data\n\n if (!data || typeof data !== 'object') {\n return axiosError.message || fallback\n }\n\n const detail = data.detail ?? data\n return extractMessage(detail) || fallback\n}\n\nexport function useApiError() {\n return { extractApiError }\n}\n","import dayjs from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\n\ndayjs.extend(customParseFormat)\n\n/**\n * Formato do valor emitido pelo WDatePicker:\n * - `'iso'` → string `YYYY-MM-DD` (ou `YYYY-MM-DDTHH:mm:ss` com hora). Ideal p/ API.\n * - `'date'` → objeto `Date` (compatível com o contrato atual do useCrudManager).\n */\nexport type DateValueFormat = 'iso' | 'date'\n\nconst DISPLAY_DATE = 'DD/MM/YYYY'\nconst DISPLAY_DATETIME = 'DD/MM/YYYY HH:mm'\nconst ISO_DATE = 'YYYY-MM-DD'\nconst ISO_DATETIME = 'YYYY-MM-DDTHH:mm:ss'\n\nexport interface UseDateInputOptions {\n /** Reativo: se o campo inclui hora (datetime). */\n showTime?: () => boolean\n /** Reativo: formato do valor emitido (default `'iso'`). */\n valueFormat?: () => DateValueFormat\n}\n\n/**\n * Lógica pura de parse/format/máscara para inputs de data em pt-BR.\n *\n * Timezone-safe: parse e format usam sempre os componentes LOCAIS via dayjs\n * (nunca `toISOString`, que converte p/ UTC e causa off-by-one em fusos negativos).\n * Sem estado reativo próprio — apenas funções; o componente cuida da reatividade.\n */\nexport function useDateInput(opts: UseDateInputOptions = {}) {\n const withTime = () => opts.showTime?.() ?? false\n const displayFormat = () => (withTime() ? DISPLAY_DATETIME : DISPLAY_DATE)\n const mask = () => (withTime() ? '##/##/#### ##:##' : '##/##/####')\n const placeholder = () => (withTime() ? 'dd/mm/aaaa hh:mm' : 'dd/mm/aaaa')\n\n /** Valor de entrada (string ISO ou Date) → `Date` local, ou `null` se inválido. */\n function toDate(value: unknown): Date | null {\n if (value == null || value === '') return null\n if (value instanceof Date) return isNaN(value.getTime()) ? null : value\n if (typeof value === 'string') {\n // Aceita YYYY-MM-DD estrito primeiro (data pura, meia-noite local)…\n const dateOnly = dayjs(value, ISO_DATE, true)\n if (dateOnly.isValid()) return dateOnly.toDate()\n // …senão qualquer ISO datetime válido (dayjs interpreta como local).\n const any = dayjs(value)\n return any.isValid() ? any.toDate() : null\n }\n return null\n }\n\n /** `Date` → valor emitido, respeitando `valueFormat` (default string ISO). */\n function toValue(date: Date | null): string | Date | null {\n if (!date) return null\n if ((opts.valueFormat?.() ?? 'iso') === 'date') return date\n return dayjs(date).format(withTime() ? ISO_DATETIME : ISO_DATE)\n }\n\n /** `Date` → texto de exibição `DD/MM/YYYY[ HH:mm]`. */\n function toDisplay(date: Date | null): string {\n if (!date) return ''\n return dayjs(date).format(displayFormat())\n }\n\n /** Texto digitado (`30/05/1988`) → `Date`, ou `null` se incompleto/inválido. */\n function fromDisplay(text: string): Date | null {\n if (!text) return null\n const d = dayjs(text, displayFormat(), true)\n return d.isValid() ? d.toDate() : null\n }\n\n /** Hoje: date-only zera a hora; datetime mantém a hora atual. */\n function today(): Date {\n return withTime() ? new Date() : dayjs().startOf('day').toDate()\n }\n\n return { toDate, toValue, toDisplay, fromDisplay, today, mask, placeholder, displayFormat }\n}\n","import { nextTick, type Ref } from 'vue'\n\n/**\n * Navegação por teclado em formulários, estilo aplicação desktop (DevExpress):\n * - `focusFirst()` posiciona o foco no primeiro campo ativo (e seleciona o texto).\n * - `handleKeydown` faz o Enter pular para o próximo campo, até o botão de salvar.\n *\n * Sem watchers nem addEventListener manual: o `handleKeydown` é bindado via\n * `@keydown.capture` no container (o Vue gerencia o listener) e `focusFirst` é\n * chamado no `@show` do Dialog. Shift+Tab / Tab continuam nativos.\n *\n * Por que **capture**: o Select do PrimeVue abre o painel no Enter e o Vue\n * re-renderiza entre o listener dele e o do container — no bubble, o handler\n * já encontra o painel aberto e deixa passar, e o Enter vira \"abrir, escolher,\n * avançar\": três teclas para um campo já preenchido. No capture o handler vê o\n * Select ainda fechado e trata o Enter como Tab antes de o componente agir.\n * Quem binda em bubble (`@keydown`) continua funcionando, só sem esse ganho.\n *\n * Regras do Enter (para não atrapalhar a semântica de cada componente):\n * - `textarea` → Enter é quebra de linha (não pula).\n * - `button` → Enter é o clique/submit nativo (não pula). Exceção: opção de\n * segmented/choice/SelectButton é campo, não ação — Enter pula o grupo\n * inteiro (Espaço e clique escolhem).\n * - Select/MultiSelect FECHADO → Enter é Tab (o painel abre com Espaço ou seta).\n * - painel do PRÓPRIO campo aberto (`aria-expanded`: Select, AutoComplete,\n * DatePicker, MultiSelect…) → Enter seleciona o item; só o Enter seguinte\n * pula o foco. Painel aberto de outro campo (um filtro da página, por\n * exemplo) não interfere.\n * - Enter num `input` nunca é o submit implícito do `<form>`: quem submete é o\n * Enter no último campo (`onSubmit`) ou o botão de salvar.\n * - marque um elemento com `data-kbd-skip` para excluí-lo da sequência (ex.: o\n * botão Cancelar, para o Enter ir direto ao Salvar).\n * - `data-kbd-hold` (no alvo ou num ancestral) segura o Enter no campo: o handler\n * só faz `preventDefault()` e não avança — para o componente tratar o Enter\n * ele mesmo (ex.: FK com texto novo, que abre o cadastro). Marque só enquanto\n * valer; com o atributo fora, o campo volta a pular.\n */\n\n// Elementos que recebem foco por tabulação.\nconst FOCUSABLE = [\n 'input:not([type=\"hidden\"]):not([disabled])',\n 'textarea:not([disabled])',\n 'select:not([disabled])',\n 'button:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n].join(', ')\n\n// Componentes cujo Enter nativo, com o painel fechado, ABRE o painel. Para eles\n// o Enter é Tab: o handler do componente não chega a rodar (ver capture acima).\nconst OPENS_ON_ENTER = '.p-select, .p-multiselect, .p-cascadeselect, .p-treeselect'\n\n// Grupos de escolha única feitos de botões: o Enter numa opção pula o grupo\n// inteiro, como se fosse um campo só.\nconst OPTION_GROUP = '.w-segmented, .w-choice, .p-selectbutton, [role=\"radiogroup\"]'\n\nexport interface FormKeyboardNavOptions {\n /** Liga/desliga a navegação (default: sempre ligada). */\n enabled?: () => boolean\n /** Chamado quando o Enter passa do último elemento sem próximo foco. */\n onSubmit?: () => void\n}\n\nexport function useFormKeyboardNav(\n container: Ref<HTMLElement | null>,\n options: FormKeyboardNavOptions = {},\n) {\n const isEnabled = () => (options.enabled ? options.enabled() : true)\n\n function focusables(): HTMLElement[] {\n const root = container.value\n if (!root) return []\n return Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (el) => el.getClientRects().length > 0 && !el.hasAttribute('data-kbd-skip'),\n )\n }\n\n function focusFirst(): void {\n if (!isEnabled()) return\n nextTick(() => {\n const els = focusables()\n const first = els.find((el) => el.tagName !== 'BUTTON') ?? els[0]\n if (!first) return\n first.focus()\n // Seleciona o conteúdo de inputs de texto para facilitar sobrescrever.\n const input = first as HTMLInputElement\n if (typeof input.select === 'function') {\n try {\n input.select()\n } catch {\n /* nem todo input suporta select() */\n }\n }\n })\n }\n\n function handleKeydown(e: KeyboardEvent): void {\n if (!isEnabled() || e.key !== 'Enter' || e.isComposing) return\n const target = e.target as HTMLElement\n if (target.tagName === 'TEXTAREA') return\n const group = target.closest<HTMLElement>(OPTION_GROUP)\n if (target.tagName === 'BUTTON' && !group) return\n\n // Nada de submit implícito: o form só submete pelo `onSubmit` ou pelo botão.\n e.preventDefault()\n\n // O campo pediu para segurar o Enter (`data-kbd-hold`) → ele mesmo trata.\n if (target.closest('[data-kbd-hold]')) return\n\n // Painel do próprio campo aberto → o componente trata o Enter (seleciona).\n if (target.closest('[aria-expanded=\"true\"]')) return\n\n // Fechado, o Enter abriria o painel; aqui ele só avança. Só faz diferença\n // quando bindado em capture — em bubble o componente já rodou.\n if (target.closest(OPENS_ON_ENTER)) e.stopPropagation()\n\n const els = focusables()\n const i = els.indexOf(target)\n if (i === -1) return\n const next = els.slice(i + 1).find((el) => !group || !group.contains(el))\n if (next) next.focus()\n else options.onSubmit?.()\n }\n\n return { focusFirst, handleKeydown }\n}\n"],"x_google_ignoreList":[1],"mappings":"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"}
|
|
@@ -321,7 +321,18 @@ function R(e, t) {
|
|
|
321
321
|
currency: t
|
|
322
322
|
}), I.set(n, r)), r;
|
|
323
323
|
}
|
|
324
|
-
function z() {
|
|
324
|
+
function z(e, t) {
|
|
325
|
+
let n = `${e}-compact-${t ?? ""}`, r = I.get(n);
|
|
326
|
+
return r || (r = new Intl.NumberFormat(e, {
|
|
327
|
+
notation: "compact",
|
|
328
|
+
maximumFractionDigits: 1,
|
|
329
|
+
...t ? {
|
|
330
|
+
style: "currency",
|
|
331
|
+
currency: t
|
|
332
|
+
} : {}
|
|
333
|
+
}), I.set(n, r)), r;
|
|
334
|
+
}
|
|
335
|
+
function B() {
|
|
325
336
|
let t = n(e, {
|
|
326
337
|
defaultPageSize: 20,
|
|
327
338
|
dateFormat: "DD/MM/YYYY",
|
|
@@ -344,8 +355,16 @@ function z() {
|
|
|
344
355
|
function l(e) {
|
|
345
356
|
return e == null ? "—" : `${L(r, 2).format(e)}%`;
|
|
346
357
|
}
|
|
358
|
+
function u(e) {
|
|
359
|
+
return e == null ? "—" : Math.abs(e) < 1e3 ? a(e) : z(r, i).format(e);
|
|
360
|
+
}
|
|
361
|
+
function d(e) {
|
|
362
|
+
return e == null ? "—" : z(r).format(e);
|
|
363
|
+
}
|
|
347
364
|
return {
|
|
348
365
|
formatCurrency: a,
|
|
366
|
+
formatCurrencyCompact: u,
|
|
367
|
+
formatNumberCompact: d,
|
|
349
368
|
formatNumber: o,
|
|
350
369
|
formatDate: s,
|
|
351
370
|
formatDateTime: c,
|
|
@@ -364,12 +383,12 @@ function z() {
|
|
|
364
383
|
}
|
|
365
384
|
//#endregion
|
|
366
385
|
//#region src/utils/formRecord.ts
|
|
367
|
-
function
|
|
386
|
+
function V(e) {
|
|
368
387
|
let t = {};
|
|
369
388
|
for (let n of e) t[n.field] = n.defaultValue === void 0 ? null : typeof n.defaultValue == "function" ? n.defaultValue() : n.defaultValue;
|
|
370
389
|
return t;
|
|
371
390
|
}
|
|
372
|
-
function
|
|
391
|
+
function H(e, t, n) {
|
|
373
392
|
let r = {};
|
|
374
393
|
for (let i of t) {
|
|
375
394
|
let t = e[i.field] === void 0 ? null : e[i.field];
|
|
@@ -377,7 +396,7 @@ function V(e, t, n) {
|
|
|
377
396
|
}
|
|
378
397
|
return r;
|
|
379
398
|
}
|
|
380
|
-
function
|
|
399
|
+
function U(e, t) {
|
|
381
400
|
let n = { ...e };
|
|
382
401
|
for (let e of t) {
|
|
383
402
|
let t = n[e.field];
|
|
@@ -389,11 +408,11 @@ function H(e, t) {
|
|
|
389
408
|
}
|
|
390
409
|
return n;
|
|
391
410
|
}
|
|
392
|
-
function
|
|
411
|
+
function W(e, t, n = !1) {
|
|
393
412
|
return e.visible === void 0 || e.visible === !0 ? !0 : typeof e.visible == "function" ? e.visible(t, n) : e.visible;
|
|
394
413
|
}
|
|
395
|
-
function
|
|
396
|
-
for (let r of e) if (
|
|
414
|
+
function G(e, t, n = !1) {
|
|
415
|
+
for (let r of e) if (W(r, t, n)) {
|
|
397
416
|
if (r.validate) {
|
|
398
417
|
let e = r.validate(t[r.field], {
|
|
399
418
|
formData: t,
|
|
@@ -410,7 +429,7 @@ function W(e, t, n = !1) {
|
|
|
410
429
|
}
|
|
411
430
|
//#endregion
|
|
412
431
|
//#region src/composables/useAppToast.ts
|
|
413
|
-
function
|
|
432
|
+
function K() {
|
|
414
433
|
let e = c();
|
|
415
434
|
function t(t, n = "Sucesso") {
|
|
416
435
|
e.add({
|
|
@@ -453,7 +472,7 @@ function G() {
|
|
|
453
472
|
}
|
|
454
473
|
//#endregion
|
|
455
474
|
//#region src/composables/useAppConfirm.ts
|
|
456
|
-
function
|
|
475
|
+
function q() {
|
|
457
476
|
let e = l(), n = t(), r = () => n?.hostEl.value ?? "body";
|
|
458
477
|
function i(t, n = "Deseja realmente excluir este registro?") {
|
|
459
478
|
e.require({
|
|
@@ -493,10 +512,10 @@ function K() {
|
|
|
493
512
|
}
|
|
494
513
|
//#endregion
|
|
495
514
|
//#region src/composables/useApiError.ts
|
|
496
|
-
function
|
|
515
|
+
function J(e) {
|
|
497
516
|
return e.replace(/_/g, " ").replace(/^\w/, (e) => e.toUpperCase());
|
|
498
517
|
}
|
|
499
|
-
function
|
|
518
|
+
function Y(e) {
|
|
500
519
|
if (typeof e == "string") return e;
|
|
501
520
|
if (Array.isArray(e)) {
|
|
502
521
|
let t = e.filter((e) => typeof e == "string");
|
|
@@ -508,7 +527,7 @@ function J(e) {
|
|
|
508
527
|
let n = [];
|
|
509
528
|
for (let [e, r] of Object.entries(t)) {
|
|
510
529
|
if (e === "non_field_errors") continue;
|
|
511
|
-
let t =
|
|
530
|
+
let t = J(e);
|
|
512
531
|
if (Array.isArray(r)) {
|
|
513
532
|
let e = r.filter((e) => typeof e == "string");
|
|
514
533
|
e.length > 0 && n.push(`${t}: ${e.join(" ")}`);
|
|
@@ -518,20 +537,20 @@ function J(e) {
|
|
|
518
537
|
}
|
|
519
538
|
return null;
|
|
520
539
|
}
|
|
521
|
-
function
|
|
540
|
+
function X(e, t = "Erro inesperado") {
|
|
522
541
|
if (!e || typeof e != "object") return t;
|
|
523
542
|
let n = e, r = n.response?.data;
|
|
524
|
-
return !r || typeof r != "object" ? n.message || t :
|
|
543
|
+
return !r || typeof r != "object" ? n.message || t : Y(r.detail ?? r) || t;
|
|
525
544
|
}
|
|
526
|
-
function
|
|
527
|
-
return { extractApiError:
|
|
545
|
+
function Z() {
|
|
546
|
+
return { extractApiError: X };
|
|
528
547
|
}
|
|
529
548
|
//#endregion
|
|
530
549
|
//#region src/composables/useDateInput.ts
|
|
531
550
|
s.extend(S.default);
|
|
532
|
-
var
|
|
533
|
-
function
|
|
534
|
-
let t = () => e.showTime?.() ?? !1, n = () => t() ?
|
|
551
|
+
var Q = "DD/MM/YYYY", ee = "DD/MM/YYYY HH:mm", $ = "YYYY-MM-DD", te = "YYYY-MM-DDTHH:mm:ss";
|
|
552
|
+
function ne(e = {}) {
|
|
553
|
+
let t = () => e.showTime?.() ?? !1, n = () => t() ? ee : Q, r = () => t() ? "##/##/#### ##:##" : "##/##/####", i = () => t() ? "dd/mm/aaaa hh:mm" : "dd/mm/aaaa";
|
|
535
554
|
function a(e) {
|
|
536
555
|
if (e == null || e === "") return null;
|
|
537
556
|
if (e instanceof Date) return isNaN(e.getTime()) ? null : e;
|
|
@@ -544,7 +563,7 @@ function te(e = {}) {
|
|
|
544
563
|
return null;
|
|
545
564
|
}
|
|
546
565
|
function o(n) {
|
|
547
|
-
return n ? (e.valueFormat?.() ?? "iso") === "date" ? n : s(n).format(t() ?
|
|
566
|
+
return n ? (e.valueFormat?.() ?? "iso") === "date" ? n : s(n).format(t() ? te : $) : null;
|
|
548
567
|
}
|
|
549
568
|
function c(e) {
|
|
550
569
|
return e ? s(e).format(n()) : "";
|
|
@@ -570,19 +589,19 @@ function te(e = {}) {
|
|
|
570
589
|
}
|
|
571
590
|
//#endregion
|
|
572
591
|
//#region src/composables/useFormKeyboardNav.ts
|
|
573
|
-
var
|
|
592
|
+
var re = [
|
|
574
593
|
"input:not([type=\"hidden\"]):not([disabled])",
|
|
575
594
|
"textarea:not([disabled])",
|
|
576
595
|
"select:not([disabled])",
|
|
577
596
|
"button:not([disabled])",
|
|
578
597
|
"[tabindex]:not([tabindex=\"-1\"])",
|
|
579
598
|
"[contenteditable=\"true\"]"
|
|
580
|
-
].join(", "),
|
|
581
|
-
function
|
|
599
|
+
].join(", "), ie = ".p-select, .p-multiselect, .p-cascadeselect, .p-treeselect", ae = ".w-segmented, .w-choice, .p-selectbutton, [role=\"radiogroup\"]";
|
|
600
|
+
function oe(e, t = {}) {
|
|
582
601
|
let n = () => !t.enabled || t.enabled();
|
|
583
602
|
function i() {
|
|
584
603
|
let t = e.value;
|
|
585
|
-
return t ? Array.from(t.querySelectorAll(
|
|
604
|
+
return t ? Array.from(t.querySelectorAll(re)).filter((e) => e.getClientRects().length > 0 && !e.hasAttribute("data-kbd-skip")) : [];
|
|
586
605
|
}
|
|
587
606
|
function a() {
|
|
588
607
|
n() && r(() => {
|
|
@@ -599,9 +618,9 @@ function ae(e, t = {}) {
|
|
|
599
618
|
if (!n() || e.key !== "Enter" || e.isComposing) return;
|
|
600
619
|
let r = e.target;
|
|
601
620
|
if (r.tagName === "TEXTAREA") return;
|
|
602
|
-
let a = r.closest(
|
|
621
|
+
let a = r.closest(ae);
|
|
603
622
|
if (r.tagName === "BUTTON" && !a || (e.preventDefault(), r.closest("[data-kbd-hold]")) || r.closest("[aria-expanded=\"true\"]")) return;
|
|
604
|
-
r.closest(
|
|
623
|
+
r.closest(ie) && e.stopPropagation();
|
|
605
624
|
let o = i(), s = o.indexOf(r);
|
|
606
625
|
if (s === -1) return;
|
|
607
626
|
let c = o.slice(s + 1).find((e) => !a || !a.contains(e));
|
|
@@ -613,6 +632,6 @@ function ae(e, t = {}) {
|
|
|
613
632
|
};
|
|
614
633
|
}
|
|
615
634
|
//#endregion
|
|
616
|
-
export { x as _,
|
|
635
|
+
export { x as _, q as a, V as c, G as d, B as f, y as g, T as h, Z as i, W as l, w as m, ne as n, K as o, C as p, X as r, U as s, oe as t, H as u };
|
|
617
636
|
|
|
618
|
-
//# sourceMappingURL=useFormKeyboardNav-
|
|
637
|
+
//# sourceMappingURL=useFormKeyboardNav-TqhfyJIg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFormKeyboardNav-TqhfyJIg.js","names":[],"sources":["../src/composables/useBreakpoint.ts","../node_modules/dayjs/plugin/customParseFormat.js","../src/utils/dates.ts","../src/utils/masks.ts","../src/composables/useFormatters.ts","../src/utils/formRecord.ts","../src/composables/useAppToast.ts","../src/composables/useAppConfirm.ts","../src/composables/useApiError.ts","../src/composables/useDateInput.ts","../src/composables/useFormKeyboardNav.ts"],"sourcesContent":["import { onScopeDispose, readonly, ref, type Ref } from 'vue'\n\n/**\n * Faixas de largura da suite — a régua de layout.\n *\n * ```\n * < 600px celular 1 coluna, navegação colapsada\n * 600-839px tablet RETRATO 1 painel por vez, drill-in com voltar\n * 840-1199px tablet PAISAGEM 2 painéis lado a lado\n * >= 1200px desktop 2-3 painéis, densidade de mesa\n * ```\n *\n * 840px é a fronteira medium/expanded do Material — a única com dado de parque\n * (93,7% dos tablets em retrato abaixo dela, 97,2% em paisagem acima). Todo\n * tablet de 10-11\" em retrato mede 768-876 CSS px; em paisagem, >= 1024.\n *\n * **Largura, nunca `orientation`**: travar ou ramificar por orientação é falha de\n * acessibilidade (WCAG 1.3.4), e um tablet de 12,9\" em retrato tem largura de\n * laptop — ele deve receber o layout de duas colunas.\n */\nexport const BREAKPOINTS = {\n /** Acima disto é tablet ou maior. */\n celular: 600,\n /** Acima disto cabem dois painéis lado a lado. */\n retrato: 840,\n /** Acima disto é mesa: densidade e três painéis liberados. */\n desktop: 1200,\n} as const\n\n/** Uma media query reativa, com limpeza automática ao sair do escopo. */\nfunction useMediaQuery(query: string): Ref<boolean> {\n const matches = ref(false)\n\n // Sem `window` (SSR, teste em ambiente node) a resposta é `false` — o layout\n // de mesa é o default e o cliente corrige na hidratação.\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return matches\n }\n\n const mql = window.matchMedia(query)\n matches.value = mql.matches\n\n const onChange = (event: MediaQueryListEvent) => {\n matches.value = event.matches\n }\n mql.addEventListener('change', onChange)\n onScopeDispose(() => mql.removeEventListener('change', onChange))\n\n return matches\n}\n\n/**\n * Em qual faixa a janela está, e se o ponteiro primário é o dedo.\n *\n * `isToque` vem de `pointer: coarse` — o ponteiro **primário**, então notebook\n * com tela sensível continua reportando `fine` e não é afetado.\n *\n * ```ts\n * const { isRetrato, isToque } = useBreakpoint()\n * // isRetrato: uma coluna, drill-in, tabela vira card\n * ```\n */\nexport function useBreakpoint() {\n const isCelular = useMediaQuery(`(max-width: ${BREAKPOINTS.celular - 1}px)`)\n /** Tablet em pé ou menor: um painel por vez. */\n const isRetrato = useMediaQuery(`(max-width: ${BREAKPOINTS.retrato - 1}px)`)\n /** Tablet deitado ou maior: cabem dois painéis. */\n const isPaisagem = useMediaQuery(`(min-width: ${BREAKPOINTS.retrato}px)`)\n const isDesktop = useMediaQuery(`(min-width: ${BREAKPOINTS.desktop}px)`)\n /** O dedo é o ponteiro: alvos maiores, sem hover. */\n const isToque = useMediaQuery('(pointer: coarse)')\n\n return {\n isCelular: readonly(isCelular),\n isRetrato: readonly(isRetrato),\n isPaisagem: readonly(isPaisagem),\n isDesktop: readonly(isDesktop),\n isToque: readonly(isToque),\n }\n}\n","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_customParseFormat=t()}(this,(function(){\"use strict\";var e={LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"},t=/(\\[[^[]*\\])|([-_:/.,()\\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\\d/,r=/\\d\\d/,i=/\\d\\d?/,o=/\\d*[^-_:/,()\\s\\d]+/,s={},a=function(e){return(e=+e)+(e>68?1900:2e3)};var f=function(e){return function(t){this[e]=+t}},h=[/[+-]\\d\\d:?(\\d\\d)?|Z/,function(e){(this.zone||(this.zone={})).offset=function(e){if(!e)return 0;if(\"Z\"===e)return 0;var t=e.match(/([+-]|\\d\\d)/g),n=60*t[1]+(+t[2]||0);return 0===n?0:\"+\"===t[0]?-n:n}(e)}],u=function(e){var t=s[e];return t&&(t.indexOf?t:t.s.concat(t.f))},d=function(e,t){var n,r=s.meridiem;if(r){for(var i=1;i<=24;i+=1)if(e.indexOf(r(i,0,t))>-1){n=i>12;break}}else n=e===(t?\"pm\":\"PM\");return n},c={A:[o,function(e){this.afternoon=d(e,!1)}],a:[o,function(e){this.afternoon=d(e,!0)}],Q:[n,function(e){this.month=3*(e-1)+1}],S:[n,function(e){this.milliseconds=100*+e}],SS:[r,function(e){this.milliseconds=10*+e}],SSS:[/\\d{3}/,function(e){this.milliseconds=+e}],s:[i,f(\"seconds\")],ss:[i,f(\"seconds\")],m:[i,f(\"minutes\")],mm:[i,f(\"minutes\")],H:[i,f(\"hours\")],h:[i,f(\"hours\")],HH:[i,f(\"hours\")],hh:[i,f(\"hours\")],D:[i,f(\"day\")],DD:[r,f(\"day\")],Do:[o,function(e){var t=s.ordinal,n=e.match(/\\d+/);if(this.day=n[0],t)for(var r=1;r<=31;r+=1)t(r).replace(/\\[|\\]/g,\"\")===e&&(this.day=r)}],w:[i,f(\"week\")],ww:[r,f(\"week\")],M:[i,f(\"month\")],MM:[r,f(\"month\")],MMM:[o,function(e){var t=u(\"months\"),n=(u(\"monthsShort\")||t.map((function(e){return e.slice(0,3)}))).indexOf(e)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[o,function(e){var t=u(\"months\").indexOf(e)+1;if(t<1)throw new Error;this.month=t%12||t}],Y:[/[+-]?\\d+/,f(\"year\")],YY:[r,function(e){this.year=a(e)}],YYYY:[/\\d{4}/,f(\"year\")],Z:h,ZZ:h};function l(n){var r,i;r=n,i=s&&s.formats;for(var o=(n=r.replace(/(\\[[^\\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(t,n,r){var o=r&&r.toUpperCase();return n||i[r]||e[r]||i[o].replace(/(\\[[^\\]]+])|(MMMM|MM|DD|dddd)/g,(function(e,t,n){return t||n.slice(1)}))}))).match(t),a=o.length,f=0;f<a;f+=1){var h=o[f],u=c[h],d=u&&u[0],l=u&&u[1];o[f]=l?{regex:d,parser:l}:h.replace(/^\\[|\\]$/g,\"\")}return function(e){for(var t={},n=0,r=0;n<a;n+=1){var i=o[n];if(\"string\"==typeof i)r+=i.length;else{var s=i.regex,f=i.parser,h=e.slice(r),u=s.exec(h)[0];f.call(t,u),e=e.replace(u,\"\")}}return function(e){var t=e.afternoon;if(void 0!==t){var n=e.hours;t?n<12&&(e.hours+=12):12===n&&(e.hours=0),delete e.afternoon}}(t),t}}return function(e,t,n){n.p.customParseFormat=!0,e&&e.parseTwoDigitYear&&(a=e.parseTwoDigitYear);var r=t.prototype,i=r.parse;r.parse=function(e){var t=e.date,r=e.utc,o=e.args;this.$u=r;var a=o[1];if(\"string\"==typeof a){var f=!0===o[2],h=!0===o[3],u=f||h,d=o[2];h&&(d=o[2]),s=this.$locale(),!f&&d&&(s=n.Ls[d]),this.$d=function(e,t,n,r){try{if([\"x\",\"X\"].indexOf(t)>-1)return new Date((\"X\"===t?1e3:1)*e);var i=l(t)(e),o=i.year,s=i.month,a=i.day,f=i.hours,h=i.minutes,u=i.seconds,d=i.milliseconds,c=i.zone,m=i.week,M=new Date,Y=a||(o||s?1:M.getDate()),p=o||M.getFullYear(),v=0;o&&!s||(v=s>0?s-1:M.getMonth());var D,w=f||0,g=h||0,y=u||0,L=d||0;return c?new Date(Date.UTC(p,v,Y,w,g,y,L+60*c.offset*1e3)):n?new Date(Date.UTC(p,v,Y,w,g,y,L)):(D=new Date(p,v,Y,w,g,y,L),m&&(D=r(D).week(m).toDate()),D)}catch(e){return new Date(\"\")}}(t,a,r,n),this.init(),d&&!0!==d&&(this.$L=this.locale(d).$L),u&&t!=this.format(a)&&(this.$d=new Date(\"\")),s={}}else if(a instanceof Array)for(var c=a.length,m=1;m<=c;m+=1){o[1]=a[m-1];var M=n.apply(this,o);if(M.isValid()){this.$d=M.$d,this.$L=M.$L,this.init();break}m===c&&(this.$d=new Date(\"\"))}else i.call(this,e)}}}));","import dayjs from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\n\ndayjs.extend(customParseFormat)\n\nexport function parseDate(value: string | Date | null | undefined): Date | null {\n if (!value) return null\n if (value instanceof Date) return value\n const d = dayjs(value, 'YYYY-MM-DD', true)\n return d.isValid() ? d.toDate() : dayjs(value).toDate()\n}\n\nexport function toDateString(value: Date | string | null | undefined): string | null {\n if (!value) return null\n if (typeof value === 'string') return value\n return dayjs(value).format('YYYY-MM-DD')\n}\n\nexport function toDateTimeString(value: Date | string | null | undefined): string | null {\n if (!value) return null\n if (typeof value === 'string') return value\n return dayjs(value).toISOString()\n}\n\nexport function formatDateValue(\n value: string | Date | null | undefined,\n format = 'DD/MM/YYYY',\n): string {\n if (!value) return '—'\n return dayjs(value).format(format)\n}\n\nexport function formatDateTimeValue(value: string | Date | null | undefined): string {\n if (!value) return '—'\n return dayjs(value).format('DD/MM/YYYY HH:mm')\n}\n","export function stripMask(value: string): string {\n return value.replace(/\\D/g, '')\n}\n\nexport function formatCpf(value: string | null | undefined): string {\n if (!value) return '—'\n const digits = stripMask(value)\n if (digits.length !== 11) return value\n return digits.replace(/^(\\d{3})(\\d{3})(\\d{3})(\\d{2})$/, '$1.$2.$3-$4')\n}\n\nexport function formatCnpj(value: string | null | undefined): string {\n if (!value) return '—'\n const digits = stripMask(value)\n if (digits.length !== 14) return value\n return digits.replace(/^(\\d{2})(\\d{3})(\\d{3})(\\d{4})(\\d{2})$/, '$1.$2.$3/$4-$5')\n}\n\nexport function formatCpfCnpj(value: string | null | undefined): string {\n if (!value) return '—'\n const digits = stripMask(value)\n if (digits.length === 11) return formatCpf(value)\n if (digits.length === 14) return formatCnpj(value)\n return value\n}\n\nexport function formatTelefone(value: string | null | undefined): string {\n if (!value) return '—'\n const digits = stripMask(value)\n if (digits.length === 11) return digits.replace(/^(\\d{2})(\\d{5})(\\d{4})$/, '($1) $2-$3')\n if (digits.length === 10) return digits.replace(/^(\\d{2})(\\d{4})(\\d{4})$/, '($1) $2-$3')\n return value\n}\n\nexport function validateCpf(value: string | null | undefined): string | null {\n if (!value) return null\n const cpf = stripMask(value)\n if (cpf.length !== 11) return 'CPF deve ter 11 dígitos.'\n if (/^(\\d)\\1{10}$/.test(cpf)) return 'CPF inválido.'\n let soma = 0\n for (let i = 0; i < 9; i++) soma += parseInt(cpf[i]) * (10 - i)\n let resto = soma % 11\n const d1 = resto < 2 ? 0 : 11 - resto\n if (parseInt(cpf[9]) !== d1) return 'CPF inválido.'\n soma = 0\n for (let i = 0; i < 10; i++) soma += parseInt(cpf[i]) * (11 - i)\n resto = soma % 11\n const d2 = resto < 2 ? 0 : 11 - resto\n if (parseInt(cpf[10]) !== d2) return 'CPF inválido.'\n return null\n}\n\nexport function validateCnpj(value: string | null | undefined): string | null {\n if (!value) return null\n const cnpj = stripMask(value)\n if (cnpj.length !== 14) return 'CNPJ deve ter 14 dígitos.'\n if (/^(\\d)\\1{13}$/.test(cnpj)) return 'CNPJ inválido.'\n const pesos1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]\n let soma = 0\n for (let i = 0; i < 12; i++) soma += parseInt(cnpj[i]) * pesos1[i]\n let resto = soma % 11\n const d1 = resto < 2 ? 0 : 11 - resto\n if (parseInt(cnpj[12]) !== d1) return 'CNPJ inválido.'\n const pesos2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]\n soma = 0\n for (let i = 0; i < 13; i++) soma += parseInt(cnpj[i]) * pesos2[i]\n resto = soma % 11\n const d2 = resto < 2 ? 0 : 11 - resto\n if (parseInt(cnpj[13]) !== d2) return 'CNPJ inválido.'\n return null\n}\n\nexport function validateCpfCnpj(value: string | null | undefined): string | null {\n if (!value) return null\n const digits = stripMask(value)\n if (digits.length === 11) return validateCpf(value)\n if (digits.length === 14) return validateCnpj(value)\n return 'CPF deve ter 11 dígitos ou CNPJ deve ter 14 dígitos.'\n}\n","import { inject } from 'vue'\nimport { W_CONFIG_KEY } from '@/types/plugin'\nimport type { WPluginConfig } from '@/types/plugin'\nimport {\n formatDateValue,\n formatDateTimeValue,\n parseDate,\n toDateString,\n toDateTimeString,\n} from '@/utils/dates'\nimport {\n formatCpf,\n formatCnpj,\n formatCpfCnpj,\n formatTelefone,\n validateCpf,\n validateCnpj,\n validateCpfCnpj,\n} from '@/utils/masks'\n\nconst numberFormatters = new Map<string, Intl.NumberFormat>()\n\nfunction getNumberFormatter(locale: string, decimals: number): Intl.NumberFormat {\n const key = `${locale}-${decimals}`\n let fmt = numberFormatters.get(key)\n if (!fmt) {\n fmt = new Intl.NumberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n })\n numberFormatters.set(key, fmt)\n }\n return fmt\n}\n\nfunction getCurrencyFormatter(locale: string, currency: string): Intl.NumberFormat {\n const key = `${locale}-${currency}`\n let fmt = numberFormatters.get(key)\n if (!fmt) {\n fmt = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n })\n numberFormatters.set(key, fmt)\n }\n return fmt\n}\n\nfunction getCompactFormatter(locale: string, currency?: string): Intl.NumberFormat {\n const key = `${locale}-compact-${currency ?? ''}`\n let fmt = numberFormatters.get(key)\n if (!fmt) {\n fmt = new Intl.NumberFormat(locale, {\n notation: 'compact',\n maximumFractionDigits: 1,\n ...(currency ? { style: 'currency' as const, currency } : {}),\n })\n numberFormatters.set(key, fmt)\n }\n return fmt\n}\n\nexport function useFormatters() {\n const config = inject<WPluginConfig>(W_CONFIG_KEY, {\n defaultPageSize: 20,\n dateFormat: 'DD/MM/YYYY',\n dateTimeFormat: 'DD/MM/YYYY HH:mm',\n locale: 'pt-BR',\n currency: 'BRL',\n } as WPluginConfig)\n\n const locale = config?.locale ?? 'pt-BR'\n const currencyCode = config?.currency ?? 'BRL'\n\n function formatCurrency(value: number | null | undefined): string {\n if (value == null) return '—'\n return getCurrencyFormatter(locale, currencyCode).format(value)\n }\n\n function formatNumber(value: number | null | undefined, decimals = 2): string {\n if (value == null) return '—'\n return getNumberFormatter(locale, decimals).format(value)\n }\n\n function formatDate(value: string | Date | null | undefined, format?: string): string {\n return formatDateValue(value, format ?? config?.dateFormat ?? 'DD/MM/YYYY')\n }\n\n function formatDateTime(value: string | Date | null | undefined): string {\n return formatDateTimeValue(value)\n }\n\n function formatPercent(value: number | null | undefined): string {\n if (value == null) return '—'\n return `${getNumberFormatter(locale, 2).format(value)}%`\n }\n\n /** Moeda em notação compacta: `R$ 1,2 mi`, `R$ 350 mil`. Abaixo de mil, o formato cheio. */\n function formatCurrencyCompact(value: number | null | undefined): string {\n if (value == null) return '—'\n if (Math.abs(value) < 1000) return formatCurrency(value)\n return getCompactFormatter(locale, currencyCode).format(value)\n }\n\n /** Número em notação compacta: `12,5 mil`, `1,2 mi`. Abaixo de mil, até uma casa. */\n function formatNumberCompact(value: number | null | undefined): string {\n if (value == null) return '—'\n return getCompactFormatter(locale).format(value)\n }\n\n return {\n formatCurrency,\n formatCurrencyCompact,\n formatNumberCompact,\n formatNumber,\n formatDate,\n formatDateTime,\n formatPercent,\n formatCpf,\n formatCnpj,\n formatCpfCnpj,\n formatTelefone,\n validateCpf,\n validateCnpj,\n validateCpfCnpj,\n parseDate,\n toDateString,\n toDateTimeString,\n }\n}\n","/**\n * Regras de formulário que independem de onde o registro é gravado.\n *\n * Nasceram dentro do `useCrudManager` (que grava numa API) e saíram para cá quando o\n * `useSubviewCrud` passou a precisar das mesmas: um form é um form, o destino do\n * payload é que muda. Manter uma cópia em cada manager faria as duas divergirem no\n * primeiro `FieldType` novo.\n */\nimport type { FieldDef } from '@/types/field'\nimport { parseDate, toDateString, toDateTimeString } from './dates'\nimport { stripMask } from './masks'\n\n/** Valor inicial de cada campo: `defaultValue` (avaliado, se função) ou `null`. */\nexport function getFieldDefaults(fields: FieldDef[]): Record<string, unknown> {\n const defaults: Record<string, unknown> = {}\n for (const f of fields) {\n defaults[f.field] =\n f.defaultValue !== undefined\n ? typeof f.defaultValue === 'function'\n ? (f.defaultValue as () => unknown)()\n : f.defaultValue\n : null\n }\n return defaults\n}\n\n/**\n * Lê um registro existente para dentro do form.\n *\n * Data vem do servidor como string e o `WDatePicker` trabalha com `Date` — por isso a\n * volta por `parseDate`. Devolve o snapshot dos valores carregados, que o chamador usa\n * como base do diff quando quiser mandar só o que mudou.\n */\nexport function loadItemIntoRecord(\n item: Record<string, unknown>,\n fields: FieldDef[],\n target: Record<string, unknown>,\n): Record<string, unknown> {\n const snapshot: Record<string, unknown> = {}\n for (const f of fields) {\n let value = item[f.field] !== undefined ? item[f.field] : null\n if (value && (f.type === 'date' || f.type === 'datetime') && typeof value === 'string') {\n value = parseDate(value)\n }\n target[f.field] = value\n snapshot[f.field] = value\n }\n return snapshot\n}\n\n/**\n * Converte o form no registro que vai ser gravado: data vira string, FK vira id, campo\n * mascarado perde a máscara. Devolve objeto novo — o form não é tocado.\n */\nexport function convertFormRecord(\n record: Record<string, unknown>,\n fields: FieldDef[],\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...record }\n for (const f of fields) {\n const val = out[f.field]\n\n // Datas\n if (f.type === 'date' && val instanceof Date) {\n out[f.field] = toDateString(val)\n } else if (f.type === 'datetime' && val instanceof Date) {\n out[f.field] = toDateTimeString(val)\n }\n\n // FK — extrair o ID do objeto selecionado\n if (f.type === 'fk' && val !== null && typeof val === 'object') {\n const key = f.optionValue || 'id'\n out[f.field] = (val as Record<string, unknown>)[key] ?? val\n }\n\n // Máscaras — strip para gravar só dígitos\n if ((f.type === 'mask' || f.type === 'cpf_cnpj') && typeof val === 'string') {\n out[f.field] = stripMask(val)\n }\n }\n return out\n}\n\n/** Resolve `visible` do campo (boolean ou função) para o estado atual do form. */\nexport function isFieldVisible(\n field: FieldDef,\n formData: Record<string, unknown>,\n isEditing = false,\n): boolean {\n if (field.visible === undefined || field.visible === true) return true\n if (typeof field.visible === 'function') return field.visible(formData, isEditing)\n return field.visible\n}\n\n/**\n * Primeira mensagem de erro do form, ou `null` se está tudo certo.\n *\n * Campo oculto (`visible` falso para o form atual) não é validado: o usuário não\n * tem como preenchê-lo, então `required`/`validate` dele não podem barrar o save.\n *\n * A ordem importa: o `validate` do campo vence a obrigatoriedade, para a mensagem\n * específica (\"CNPJ inválido\") aparecer no lugar da genérica.\n */\nexport function validateFormRecord(\n fields: FieldDef[],\n formData: Record<string, unknown>,\n isEditing = false,\n): string | null {\n for (const f of fields) {\n if (!isFieldVisible(f, formData, isEditing)) continue\n if (f.validate) {\n const result = f.validate(formData[f.field], { formData, isEditing })\n if (result) return result\n }\n if (f.required) {\n const val = formData[f.field]\n if (val === null || val === undefined || val === '') {\n return `${f.label} é obrigatório`\n }\n }\n }\n return null\n}\n","import { useToast } from 'primevue/usetoast'\n\nexport function useAppToast() {\n const toast = useToast()\n\n function success(message: string, title = 'Sucesso') {\n toast.add({ severity: 'success', summary: title, detail: message, life: 3000 })\n }\n\n function error(message: string, title = 'Erro') {\n toast.add({ severity: 'error', summary: title, detail: message, life: 5000 })\n }\n\n function warn(message: string, title = 'Atenção') {\n toast.add({ severity: 'warn', summary: title, detail: message, life: 4000 })\n }\n\n function info(message: string, title = 'Info') {\n toast.add({ severity: 'info', summary: title, detail: message, life: 3000 })\n }\n\n return { success, error, warn, info }\n}\n","import { useConfirm } from 'primevue/useconfirm'\nimport { useTabHost } from '@/types/routeTabs'\n\nexport function useAppConfirm() {\n const confirm = useConfirm()\n // Dentro da navegação por abas, o confirm pendura no pane da própria aba\n // (some e volta com ela); fora de abas, o body de sempre. O ConfirmDialog\n // global continua único — só a âncora muda, por confirmação.\n const tabHost = useTabHost()\n const appendTo = () => tabHost?.hostEl.value ?? 'body'\n\n function confirmDelete(\n onAccept: () => void,\n message = 'Deseja realmente excluir este registro?',\n ) {\n confirm.require({\n appendTo: appendTo(),\n message,\n header: 'Confirmar Exclusão',\n icon: 'pi pi-trash',\n rejectLabel: 'Cancelar',\n rejectProps: {\n severity: 'secondary',\n text: true,\n },\n acceptLabel: 'Excluir',\n acceptProps: {\n severity: 'danger',\n },\n accept: onAccept,\n })\n }\n\n function confirmAction(message: string, onAccept: () => void, header = 'Confirmação') {\n confirm.require({\n appendTo: appendTo(),\n message,\n header,\n icon: 'pi pi-question-circle',\n rejectLabel: 'Cancelar',\n rejectProps: {\n severity: 'secondary',\n text: true,\n },\n acceptLabel: 'Confirmar',\n accept: onAccept,\n })\n }\n\n return { confirmDelete, confirmAction }\n}\n","function formatFieldName(field: string): string {\n return field.replace(/_/g, ' ').replace(/^\\w/, (c) => c.toUpperCase())\n}\n\nfunction extractMessage(detail: unknown): string | null {\n if (typeof detail === 'string') {\n return detail\n }\n\n if (Array.isArray(detail)) {\n const messages = detail.filter((item) => typeof item === 'string')\n return messages.length > 0 ? messages.join(' ') : null\n }\n\n if (typeof detail === 'object' && detail !== null) {\n const obj = detail as Record<string, unknown>\n\n if (Array.isArray(obj.non_field_errors) && obj.non_field_errors.length > 0) {\n return obj.non_field_errors.filter((item: unknown) => typeof item === 'string').join(' ')\n }\n\n const messages: string[] = []\n for (const [key, value] of Object.entries(obj)) {\n if (key === 'non_field_errors') continue\n const label = formatFieldName(key)\n if (Array.isArray(value)) {\n const strs = value.filter((item: unknown) => typeof item === 'string')\n if (strs.length > 0) messages.push(`${label}: ${strs.join(' ')}`)\n } else if (typeof value === 'string') {\n messages.push(`${label}: ${value}`)\n }\n }\n return messages.length > 0 ? messages.join('\\n') : null\n }\n\n return null\n}\n\nexport function extractApiError(error: unknown, fallback = 'Erro inesperado'): string {\n if (!error || typeof error !== 'object') return fallback\n\n const axiosError = error as {\n response?: { data?: Record<string, unknown> }\n message?: string\n }\n const data = axiosError.response?.data\n\n if (!data || typeof data !== 'object') {\n return axiosError.message || fallback\n }\n\n const detail = data.detail ?? data\n return extractMessage(detail) || fallback\n}\n\nexport function useApiError() {\n return { extractApiError }\n}\n","import dayjs from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\n\ndayjs.extend(customParseFormat)\n\n/**\n * Formato do valor emitido pelo WDatePicker:\n * - `'iso'` → string `YYYY-MM-DD` (ou `YYYY-MM-DDTHH:mm:ss` com hora). Ideal p/ API.\n * - `'date'` → objeto `Date` (compatível com o contrato atual do useCrudManager).\n */\nexport type DateValueFormat = 'iso' | 'date'\n\nconst DISPLAY_DATE = 'DD/MM/YYYY'\nconst DISPLAY_DATETIME = 'DD/MM/YYYY HH:mm'\nconst ISO_DATE = 'YYYY-MM-DD'\nconst ISO_DATETIME = 'YYYY-MM-DDTHH:mm:ss'\n\nexport interface UseDateInputOptions {\n /** Reativo: se o campo inclui hora (datetime). */\n showTime?: () => boolean\n /** Reativo: formato do valor emitido (default `'iso'`). */\n valueFormat?: () => DateValueFormat\n}\n\n/**\n * Lógica pura de parse/format/máscara para inputs de data em pt-BR.\n *\n * Timezone-safe: parse e format usam sempre os componentes LOCAIS via dayjs\n * (nunca `toISOString`, que converte p/ UTC e causa off-by-one em fusos negativos).\n * Sem estado reativo próprio — apenas funções; o componente cuida da reatividade.\n */\nexport function useDateInput(opts: UseDateInputOptions = {}) {\n const withTime = () => opts.showTime?.() ?? false\n const displayFormat = () => (withTime() ? DISPLAY_DATETIME : DISPLAY_DATE)\n const mask = () => (withTime() ? '##/##/#### ##:##' : '##/##/####')\n const placeholder = () => (withTime() ? 'dd/mm/aaaa hh:mm' : 'dd/mm/aaaa')\n\n /** Valor de entrada (string ISO ou Date) → `Date` local, ou `null` se inválido. */\n function toDate(value: unknown): Date | null {\n if (value == null || value === '') return null\n if (value instanceof Date) return isNaN(value.getTime()) ? null : value\n if (typeof value === 'string') {\n // Aceita YYYY-MM-DD estrito primeiro (data pura, meia-noite local)…\n const dateOnly = dayjs(value, ISO_DATE, true)\n if (dateOnly.isValid()) return dateOnly.toDate()\n // …senão qualquer ISO datetime válido (dayjs interpreta como local).\n const any = dayjs(value)\n return any.isValid() ? any.toDate() : null\n }\n return null\n }\n\n /** `Date` → valor emitido, respeitando `valueFormat` (default string ISO). */\n function toValue(date: Date | null): string | Date | null {\n if (!date) return null\n if ((opts.valueFormat?.() ?? 'iso') === 'date') return date\n return dayjs(date).format(withTime() ? ISO_DATETIME : ISO_DATE)\n }\n\n /** `Date` → texto de exibição `DD/MM/YYYY[ HH:mm]`. */\n function toDisplay(date: Date | null): string {\n if (!date) return ''\n return dayjs(date).format(displayFormat())\n }\n\n /** Texto digitado (`30/05/1988`) → `Date`, ou `null` se incompleto/inválido. */\n function fromDisplay(text: string): Date | null {\n if (!text) return null\n const d = dayjs(text, displayFormat(), true)\n return d.isValid() ? d.toDate() : null\n }\n\n /** Hoje: date-only zera a hora; datetime mantém a hora atual. */\n function today(): Date {\n return withTime() ? new Date() : dayjs().startOf('day').toDate()\n }\n\n return { toDate, toValue, toDisplay, fromDisplay, today, mask, placeholder, displayFormat }\n}\n","import { nextTick, type Ref } from 'vue'\n\n/**\n * Navegação por teclado em formulários, estilo aplicação desktop (DevExpress):\n * - `focusFirst()` posiciona o foco no primeiro campo ativo (e seleciona o texto).\n * - `handleKeydown` faz o Enter pular para o próximo campo, até o botão de salvar.\n *\n * Sem watchers nem addEventListener manual: o `handleKeydown` é bindado via\n * `@keydown.capture` no container (o Vue gerencia o listener) e `focusFirst` é\n * chamado no `@show` do Dialog. Shift+Tab / Tab continuam nativos.\n *\n * Por que **capture**: o Select do PrimeVue abre o painel no Enter e o Vue\n * re-renderiza entre o listener dele e o do container — no bubble, o handler\n * já encontra o painel aberto e deixa passar, e o Enter vira \"abrir, escolher,\n * avançar\": três teclas para um campo já preenchido. No capture o handler vê o\n * Select ainda fechado e trata o Enter como Tab antes de o componente agir.\n * Quem binda em bubble (`@keydown`) continua funcionando, só sem esse ganho.\n *\n * Regras do Enter (para não atrapalhar a semântica de cada componente):\n * - `textarea` → Enter é quebra de linha (não pula).\n * - `button` → Enter é o clique/submit nativo (não pula). Exceção: opção de\n * segmented/choice/SelectButton é campo, não ação — Enter pula o grupo\n * inteiro (Espaço e clique escolhem).\n * - Select/MultiSelect FECHADO → Enter é Tab (o painel abre com Espaço ou seta).\n * - painel do PRÓPRIO campo aberto (`aria-expanded`: Select, AutoComplete,\n * DatePicker, MultiSelect…) → Enter seleciona o item; só o Enter seguinte\n * pula o foco. Painel aberto de outro campo (um filtro da página, por\n * exemplo) não interfere.\n * - Enter num `input` nunca é o submit implícito do `<form>`: quem submete é o\n * Enter no último campo (`onSubmit`) ou o botão de salvar.\n * - marque um elemento com `data-kbd-skip` para excluí-lo da sequência (ex.: o\n * botão Cancelar, para o Enter ir direto ao Salvar).\n * - `data-kbd-hold` (no alvo ou num ancestral) segura o Enter no campo: o handler\n * só faz `preventDefault()` e não avança — para o componente tratar o Enter\n * ele mesmo (ex.: FK com texto novo, que abre o cadastro). Marque só enquanto\n * valer; com o atributo fora, o campo volta a pular.\n */\n\n// Elementos que recebem foco por tabulação.\nconst FOCUSABLE = [\n 'input:not([type=\"hidden\"]):not([disabled])',\n 'textarea:not([disabled])',\n 'select:not([disabled])',\n 'button:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n].join(', ')\n\n// Componentes cujo Enter nativo, com o painel fechado, ABRE o painel. Para eles\n// o Enter é Tab: o handler do componente não chega a rodar (ver capture acima).\nconst OPENS_ON_ENTER = '.p-select, .p-multiselect, .p-cascadeselect, .p-treeselect'\n\n// Grupos de escolha única feitos de botões: o Enter numa opção pula o grupo\n// inteiro, como se fosse um campo só.\nconst OPTION_GROUP = '.w-segmented, .w-choice, .p-selectbutton, [role=\"radiogroup\"]'\n\nexport interface FormKeyboardNavOptions {\n /** Liga/desliga a navegação (default: sempre ligada). */\n enabled?: () => boolean\n /** Chamado quando o Enter passa do último elemento sem próximo foco. */\n onSubmit?: () => void\n}\n\nexport function useFormKeyboardNav(\n container: Ref<HTMLElement | null>,\n options: FormKeyboardNavOptions = {},\n) {\n const isEnabled = () => (options.enabled ? options.enabled() : true)\n\n function focusables(): HTMLElement[] {\n const root = container.value\n if (!root) return []\n return Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (el) => el.getClientRects().length > 0 && !el.hasAttribute('data-kbd-skip'),\n )\n }\n\n function focusFirst(): void {\n if (!isEnabled()) return\n nextTick(() => {\n const els = focusables()\n const first = els.find((el) => el.tagName !== 'BUTTON') ?? els[0]\n if (!first) return\n first.focus()\n // Seleciona o conteúdo de inputs de texto para facilitar sobrescrever.\n const input = first as HTMLInputElement\n if (typeof input.select === 'function') {\n try {\n input.select()\n } catch {\n /* nem todo input suporta select() */\n }\n }\n })\n }\n\n function handleKeydown(e: KeyboardEvent): void {\n if (!isEnabled() || e.key !== 'Enter' || e.isComposing) return\n const target = e.target as HTMLElement\n if (target.tagName === 'TEXTAREA') return\n const group = target.closest<HTMLElement>(OPTION_GROUP)\n if (target.tagName === 'BUTTON' && !group) return\n\n // Nada de submit implícito: o form só submete pelo `onSubmit` ou pelo botão.\n e.preventDefault()\n\n // O campo pediu para segurar o Enter (`data-kbd-hold`) → ele mesmo trata.\n if (target.closest('[data-kbd-hold]')) return\n\n // Painel do próprio campo aberto → o componente trata o Enter (seleciona).\n if (target.closest('[aria-expanded=\"true\"]')) return\n\n // Fechado, o Enter abriria o painel; aqui ele só avança. Só faz diferença\n // quando bindado em capture — em bubble o componente já rodou.\n if (target.closest(OPENS_ON_ENTER)) e.stopPropagation()\n\n const els = focusables()\n const i = els.indexOf(target)\n if (i === -1) return\n const next = els.slice(i + 1).find((el) => !group || !group.contains(el))\n if (next) next.focus()\n else options.onSubmit?.()\n }\n\n return { focusFirst, handleKeydown }\n}\n"],"x_google_ignoreList":[1],"mappings":"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"}
|
package/dist/utils/chart.d.ts
CHANGED
|
@@ -39,4 +39,30 @@ export interface DonutOptionInput {
|
|
|
39
39
|
* formatador dos valores.
|
|
40
40
|
*/
|
|
41
41
|
export declare function donutOption({ data, format, centerLabel, centerSub, }: DonutOptionInput): WChartOption;
|
|
42
|
+
/** Payload do evento `select` do WChart — o item de dado clicado. */
|
|
43
|
+
export interface ChartSelectEvent {
|
|
44
|
+
/** Nome da série (`series[i].name`). */
|
|
45
|
+
seriesName?: string;
|
|
46
|
+
/** Índice da série na option. */
|
|
47
|
+
seriesIndex?: number;
|
|
48
|
+
/** Nome do item — a categoria do eixo ou o `name` da fatia. */
|
|
49
|
+
name: string;
|
|
50
|
+
/** Índice do item dentro da série. */
|
|
51
|
+
dataIndex: number;
|
|
52
|
+
/** Valor do item (número, ou array em séries com mais de uma dimensão). */
|
|
53
|
+
value: unknown;
|
|
54
|
+
/** O item de dado como veio na option (objeto com campos próprios, se for o caso). */
|
|
55
|
+
data: unknown;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Traduz o clique do ECharts no payload do `select`. Só item de série conta —
|
|
59
|
+
* clique em marcador (markPoint/markLine), legenda ou título devolve `null`.
|
|
60
|
+
*/
|
|
61
|
+
export declare function toChartSelectEvent(params: unknown): ChartSelectEvent | null;
|
|
62
|
+
/**
|
|
63
|
+
* Option com a afordância de clique: cursor de mão e realce do item sob o
|
|
64
|
+
* mouse (`emphasis.focus: 'self'` esmaece os outros). O que a série já declara
|
|
65
|
+
* vence — só completa o que falta. Não muta a option recebida.
|
|
66
|
+
*/
|
|
67
|
+
export declare function withClickable(option: WChartOption): WChartOption;
|
|
42
68
|
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Component } from 'vue';
|
|
2
|
+
import { RouteLocationRaw } from 'vue-router';
|
|
3
|
+
export interface InteractiveCardBinding {
|
|
4
|
+
/** Elemento raiz: RouterLink, 'div' (botão) ou 'article' (estático). */
|
|
5
|
+
is: Component | string;
|
|
6
|
+
/** true quando o cartão responde a clique/teclado (liga o estado de hover/foco). */
|
|
7
|
+
interactive: boolean;
|
|
8
|
+
/** Atributos e listeners do elemento raiz. */
|
|
9
|
+
attrs: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* O pai ouve `event`? Lê as props cruas do vnode, onde o listener continua
|
|
13
|
+
* mesmo com o evento declarado em defineEmits. Cobre as formas que o
|
|
14
|
+
* compilador gera: `onItemClick`, `onItem-click` e as variantes `.once`.
|
|
15
|
+
*/
|
|
16
|
+
export declare function hasListener(rawProps: Record<string, unknown> | null | undefined, event: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Chame no `setup` do cartão; `emitClick` é o `emit('click', event)` dele.
|
|
19
|
+
* `binding(to)` deve ser chamado NO RENDER (não num computed): as props cruas
|
|
20
|
+
* do vnode não são reativas, e o listener pode entrar ou sair depois do mount.
|
|
21
|
+
*/
|
|
22
|
+
export declare function useInteractiveCard(emitClick: (event: MouseEvent | KeyboardEvent) => void): {
|
|
23
|
+
binding: (to: RouteLocationRaw | undefined) => InteractiveCardBinding;
|
|
24
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type MeterSeverity = 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'neutral';
|
|
2
|
+
/** Tolerância abaixo do ritmo que ainda é "atenção" (warning), não "atrasado". */
|
|
3
|
+
export declare const METER_WARNING_BAND = 0.1;
|
|
4
|
+
/**
|
|
5
|
+
* - sem meta (null/0): `neutral`;
|
|
6
|
+
* - com ritmo (`expected`): `success` no ritmo ou acima, `warning` até 10%
|
|
7
|
+
* abaixo, `danger` abaixo disso;
|
|
8
|
+
* - sem ritmo: `success` com a meta batida, senão `primary` (em andamento —
|
|
9
|
+
* sem ritmo não há como dizer que está atrasado).
|
|
10
|
+
*/
|
|
11
|
+
export declare function meterSeverity({ value, goal, expected, }: {
|
|
12
|
+
value: number;
|
|
13
|
+
goal?: number | null;
|
|
14
|
+
expected?: number | null;
|
|
15
|
+
}): MeterSeverity;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Caixa de desenho da sparkline (unidades do viewBox, não pixels). */
|
|
2
|
+
export declare const SPARK_W = 100;
|
|
3
|
+
export declare const SPARK_H = 24;
|
|
4
|
+
export interface SparklineGeometry {
|
|
5
|
+
/** `points` da polyline. */
|
|
6
|
+
line: string;
|
|
7
|
+
/** `points` do polígono da área (a linha fechada até a base). */
|
|
8
|
+
area: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Pontos da sparkline. Valores não finitos são descartados; nenhum valor
|
|
12
|
+
* devolve `null` (o card não desenha nada); um valor ou todos iguais viram uma
|
|
13
|
+
* linha reta no meio da altura.
|
|
14
|
+
*/
|
|
15
|
+
export declare function sparklineGeometry(values: readonly number[] | null | undefined): SparklineGeometry | null;
|