@wgalleti/primevue-components 0.12.0 → 0.13.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.
@@ -1 +1 @@
1
- {"version":3,"file":"WKanbanBoard.vue_vue_type_script_setup_true_lang-C2OIgPbM.cjs","sources":["../src/components/crud/WCrudColumnRenderer.vue","../node_modules/maska/dist/maska.mjs","../node_modules/maska/dist/vue.mjs","../src/utils/fieldMapper.ts","../src/components/form/WAutoCompleteFK.vue","../src/components/form/WDatePicker.vue","../src/components/form/WMoneyInput.vue","../src/components/form/WImageCropper.vue","../src/components/form/WTransferList.vue","../src/utils/cep.ts","../src/components/form/WFormRenderer.vue","../src/components/crud/WCrudFormDialog.vue","../src/utils/csv.ts","../src/components/crud/WCrudView.vue","../src/components/crud/WEditableTable.vue","../src/components/form/WDateRange.vue","../src/components/form/WFileUpload.vue","../src/utils/treeSelect.ts","../src/components/form/WTreeSelect.vue","../src/components/ui/WStatusTag.vue","../src/components/ui/WPageHeader.vue","../src/components/ui/WEmptyState.vue","../node_modules/vue-router/dist/devtools-EWN81iOl.mjs","../node_modules/vue-router/dist/vue-router.mjs","../src/components/ui/WDetailHeader.vue","../src/components/ui/WInfoCard.vue","../src/components/ui/WKpiCard.vue","../src/components/ui/WKpiGrid.vue","../src/components/ui/WSectionHeader.vue","../src/components/ui/WFormSection.vue","../src/components/ui/WActionBar.vue","../src/components/ui/WProgressFlow.vue","../src/utils/stepFlow.ts","../src/components/ui/WStepFlow.vue","../src/components/ui/WStepSection.vue","../src/components/ui/WCheckList.vue","../src/components/ui/WMapSelect.vue","../src/utils/markdown.ts","../src/utils/markdownEnhance.ts","../src/components/ui/WMarkdownView.vue","../src/components/form/WMarkdownEditor.vue","../src/components/ui/WMarkdownToc.vue","../src/components/ui/WTabBar.vue","../src/components/ui/WKanbanBoard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport Tag from 'primevue/tag'\nimport type { ColumnDef } from '@/types/column'\nimport { useFormatters } from '@/composables/useFormatters'\n\ndefineProps<{\n column: ColumnDef\n value: unknown\n rowData: Record<string, unknown>\n}>()\n\nconst { formatDate, formatDateTime, formatCurrency, formatNumber } = useFormatters()\n</script>\n\n<template>\n <span v-if=\"value == null\" class=\"text-muted-color text-xs\">&mdash;</span>\n\n <template v-else-if=\"column.type === 'image'\">\n <img\n :src=\"String(value)\"\n :alt=\"column.header\"\n class=\"size-9 rounded-lg object-cover ring-1 ring-surface-200 dark:ring-surface-700\"\n />\n </template>\n\n <template v-else-if=\"column.type === 'boolean'\">\n <Tag\n :value=\"column.tagValue ? column.tagValue(value, rowData) : value ? 'Ativo' : 'Inativo'\"\n :severity=\"\n (column.tagSeverity\n ? column.tagSeverity(value, rowData)\n : value\n ? 'success'\n : 'danger') as any\n \"\n class=\"text-xs\"\n />\n </template>\n\n <span v-else-if=\"column.type === 'date'\" class=\"text-muted-color tabular-nums text-[0.8125rem]\">\n {{ formatDate(value as string) }}\n </span>\n\n <span\n v-else-if=\"column.type === 'datetime'\"\n class=\"text-muted-color tabular-nums text-[0.8125rem]\"\n >\n {{ formatDateTime(value as string) }}\n </span>\n\n <span v-else-if=\"column.type === 'currency'\" class=\"font-semibold tabular-nums text-[0.8125rem]\">\n {{ formatCurrency(value as number) }}\n </span>\n\n <span v-else-if=\"column.type === 'number'\" class=\"font-semibold tabular-nums text-[0.8125rem]\">\n {{\n column.format\n ? column.format(value, rowData)\n : formatNumber(value as number, column.decimals ?? 0)\n }}\n </span>\n\n <span v-else class=\"text-[0.8125rem]\">\n {{ column.format ? column.format(value, rowData) : value }}\n </span>\n</template>\n","var S = Object.defineProperty;\nvar x = (n, t, e) => t in n ? S(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e;\nvar A = (n, t, e) => x(n, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst R = {\n \"#\": { pattern: /[0-9]/ },\n \"@\": { pattern: /[a-zA-Z]/ },\n \"*\": { pattern: /[a-zA-Z0-9]/ }\n}, N = (n, t, e) => n.replaceAll(t, \"\").replace(e, \".\").replace(\"..\", \".\").replace(/[^.\\d]/g, \"\"), w = (n, t, e) => {\n var s;\n return new Intl.NumberFormat(((s = e.number) == null ? void 0 : s.locale) ?? \"en\", {\n minimumFractionDigits: n,\n maximumFractionDigits: t,\n roundingMode: \"trunc\"\n });\n}, P = (n, t = !0, e) => {\n var k, g, b, d;\n const s = ((k = e.number) == null ? void 0 : k.unsigned) !== !0 && n.startsWith(\"-\") ? \"-\" : \"\", r = ((g = e.number) == null ? void 0 : g.fraction) ?? 0;\n let a = w(0, r, e);\n const u = a.formatToParts(1000.12), p = ((b = u.find((o) => o.type === \"group\")) == null ? void 0 : b.value) ?? \" \", f = ((d = u.find((o) => o.type === \"decimal\")) == null ? void 0 : d.value) ?? \".\", i = N(n, p, f);\n if (Number.isNaN(parseFloat(i))) return s;\n const h = i.split(\".\");\n if (h[1] != null && h[1].length >= 1) {\n const o = h[1].length <= r ? h[1].length : r;\n a = w(o, r, e);\n }\n let l = a.format(parseFloat(i));\n return t ? r > 0 && i.endsWith(\".\") && !i.slice(0, -1).includes(\".\") && (l += f) : l = N(l, p, f), s + l;\n}, C = (n) => JSON.parse(n.replaceAll(\"'\", '\"')), F = (n, t = {}) => {\n const e = { ...t };\n n.dataset.maska != null && n.dataset.maska !== \"\" && (e.mask = T(n.dataset.maska)), n.dataset.maskaEager != null && (e.eager = E(n.dataset.maskaEager)), n.dataset.maskaReversed != null && (e.reversed = E(n.dataset.maskaReversed)), n.dataset.maskaTokensReplace != null && (e.tokensReplace = E(n.dataset.maskaTokensReplace)), n.dataset.maskaTokens != null && (e.tokens = W(n.dataset.maskaTokens));\n const s = {};\n return n.dataset.maskaNumberLocale != null && (s.locale = n.dataset.maskaNumberLocale), n.dataset.maskaNumberFraction != null && (s.fraction = parseInt(n.dataset.maskaNumberFraction)), n.dataset.maskaNumberUnsigned != null && (s.unsigned = E(n.dataset.maskaNumberUnsigned)), (n.dataset.maskaNumber != null || Object.values(s).length > 0) && (e.number = s), e;\n}, E = (n) => n !== \"\" ? !!JSON.parse(n) : !0, T = (n) => n.startsWith(\"[\") && n.endsWith(\"]\") ? C(n) : n, W = (n) => {\n if (n.startsWith(\"{\") && n.endsWith(\"}\"))\n return C(n);\n const t = {};\n return n.split(\"|\").forEach((e) => {\n const s = e.split(\":\");\n t[s[0]] = {\n pattern: I() ? new RegExp(s[1], \"u\") : new RegExp(s[1]),\n optional: s[2] === \"optional\",\n multiple: s[2] === \"multiple\",\n repeated: s[2] === \"repeated\"\n };\n }), t;\n}, I = () => {\n try {\n return new RegExp(\"\\\\p{L}\", \"u\"), !0;\n } catch {\n return !1;\n }\n};\nclass O {\n constructor(t = {}) {\n A(this, \"opts\", {});\n A(this, \"memo\", /* @__PURE__ */ new Map());\n const e = { ...t };\n if (e.tokens != null) {\n e.tokens = e.tokensReplace ? { ...e.tokens } : { ...R, ...e.tokens };\n for (const s of Object.values(e.tokens))\n typeof s.pattern == \"string\" && (s.pattern = I() ? new RegExp(s.pattern, \"u\") : new RegExp(s.pattern));\n } else\n e.tokens = R;\n Array.isArray(e.mask) && (e.mask.length > 1 ? e.mask = [...e.mask].sort((s, r) => s.length - r.length) : e.mask = e.mask[0] ?? \"\"), e.mask === \"\" && (e.mask = null), this.opts = e;\n }\n masked(t) {\n return this.process(String(t), this.findMask(String(t)));\n }\n unmasked(t) {\n return this.process(String(t), this.findMask(String(t)), !1);\n }\n isEager() {\n return this.opts.eager === !0;\n }\n isReversed() {\n return this.opts.reversed === !0;\n }\n completed(t) {\n const e = this.findMask(String(t));\n if (this.opts.mask == null || e == null) return !1;\n const s = this.process(String(t), e).length;\n return typeof this.opts.mask == \"string\" ? s >= this.opts.mask.length : s >= e.length;\n }\n findMask(t) {\n const e = this.opts.mask;\n if (e == null)\n return null;\n if (typeof e == \"string\")\n return e;\n if (typeof e == \"function\")\n return e(t);\n const s = this.process(t, e.slice(-1).pop() ?? \"\", !1);\n return e.find((r) => this.process(t, r, !1).length >= s.length) ?? \"\";\n }\n escapeMask(t) {\n const e = [], s = [];\n return t.split(\"\").forEach((r, a) => {\n r === \"!\" && t[a - 1] !== \"!\" ? s.push(a - s.length) : e.push(r);\n }), { mask: e.join(\"\"), escaped: s };\n }\n process(t, e, s = !0) {\n if (this.opts.number != null) return P(t, s, this.opts);\n if (e == null) return t;\n const r = `v=${t},mr=${e},m=${s ? 1 : 0}`;\n if (this.memo.has(r)) return this.memo.get(r);\n const { mask: a, escaped: u } = this.escapeMask(e), p = [], f = this.opts.tokens != null ? this.opts.tokens : {}, i = this.isReversed() ? -1 : 1, h = this.isReversed() ? \"unshift\" : \"push\", l = this.isReversed() ? 0 : a.length - 1, k = this.isReversed() ? () => o > -1 && c > -1 : () => o < a.length && c < t.length, g = (v) => !this.isReversed() && v <= l || this.isReversed() && v >= l;\n let b, d = -1, o = this.isReversed() ? a.length - 1 : 0, c = this.isReversed() ? t.length - 1 : 0, M = !1;\n for (; k(); ) {\n const v = a.charAt(o), m = f[v], y = (m == null ? void 0 : m.transform) != null ? m.transform(t.charAt(c)) : t.charAt(c);\n if (!u.includes(o) && m != null ? (y.match(m.pattern) != null ? (p[h](y), m.repeated ? (d === -1 ? d = o : o === l && o !== d && (o = d - i), l === d && (o -= i)) : m.multiple && (M = !0, o -= i), o += i) : m.multiple ? M && (o += i, c -= i, M = !1) : y === b ? b = void 0 : m.optional && (o += i, c -= i), c += i) : (s && !this.isEager() && p[h](v), y === v && !this.isEager() ? c += i : b = v, this.isEager() || (o += i)), this.isEager())\n for (; g(o) && (f[a.charAt(o)] == null || u.includes(o)); ) {\n if (s) {\n if (p[h](a.charAt(o)), t.charAt(c) === a.charAt(o)) {\n o += i, c += i;\n continue;\n }\n } else a.charAt(o) === t.charAt(c) && (c += i);\n o += i;\n }\n }\n return this.memo.set(r, p.join(\"\")), this.memo.get(r);\n }\n}\nclass V {\n constructor(t, e = {}) {\n A(this, \"items\", /* @__PURE__ */ new Map());\n A(this, \"eventAbortController\");\n A(this, \"onInput\", (t) => {\n if (t instanceof CustomEvent && t.type === \"input\" && !t.isTrusted && !t.bubbles)\n return;\n const e = t.target, s = this.items.get(e);\n if (s === void 0) return;\n const r = \"inputType\" in t && t.inputType.startsWith(\"delete\"), a = s.isEager(), u = r && a && s.unmasked(e.value) === \"\" ? \"\" : e.value;\n this.fixCursor(e, r, () => this.setValue(e, u));\n });\n this.options = e, this.eventAbortController = new AbortController(), this.init(this.getInputs(t));\n }\n update(t = {}) {\n this.options = { ...t }, this.init(Array.from(this.items.keys()));\n }\n updateValue(t) {\n var e;\n t.value !== \"\" && t.value !== ((e = this.processInput(t)) == null ? void 0 : e.masked) && this.setValue(t, t.value);\n }\n destroy() {\n this.eventAbortController.abort(), this.items.clear();\n }\n init(t) {\n const e = this.getOptions(this.options);\n for (const s of t) {\n if (!this.items.has(s)) {\n const { signal: a } = this.eventAbortController;\n s.addEventListener(\"input\", this.onInput, { capture: !0, signal: a });\n }\n const r = new O(F(s, e));\n this.items.set(s, r), queueMicrotask(() => this.updateValue(s)), s.selectionStart === null && r.isEager() && console.warn(\"Maska: input of `%s` type is not supported\", s.type);\n }\n }\n getInputs(t) {\n return typeof t == \"string\" ? Array.from(document.querySelectorAll(t)) : \"length\" in t ? Array.from(t) : [t];\n }\n getOptions(t) {\n const { onMaska: e, preProcess: s, postProcess: r, ...a } = t;\n return a;\n }\n fixCursor(t, e, s) {\n var k, g;\n const r = t.selectionStart, a = t.value;\n if (s(), r === null || r === a.length && !e) return;\n const u = t.value, p = a.slice(0, r), f = u.slice(0, r), i = (k = this.processInput(t, p)) == null ? void 0 : k.unmasked, h = (g = this.processInput(t, f)) == null ? void 0 : g.unmasked;\n if (i === void 0 || h === void 0) return;\n let l = r;\n p !== f && (l += e ? u.length - a.length : i.length - h.length), t.setSelectionRange(l, l);\n }\n setValue(t, e) {\n const s = this.processInput(t, e);\n s !== void 0 && (t.value = s.masked, this.options.onMaska != null && (Array.isArray(this.options.onMaska) ? this.options.onMaska.forEach((r) => r(s)) : this.options.onMaska(s)), t.dispatchEvent(new CustomEvent(\"maska\", { detail: s })), t.dispatchEvent(new CustomEvent(\"input\", { detail: s.masked })));\n }\n processInput(t, e) {\n const s = this.items.get(t);\n if (s === void 0) return;\n let r = e ?? t.value;\n this.options.preProcess != null && (r = this.options.preProcess(r));\n let a = s.masked(r);\n return this.options.postProcess != null && (a = this.options.postProcess(a)), {\n masked: a,\n unmasked: s.unmasked(r),\n completed: s.completed(r)\n };\n }\n}\nexport {\n O as Mask,\n V as MaskInput,\n R as tokens\n};\n","import { MaskInput as n } from \"./maska.mjs\";\nconst l = /* @__PURE__ */ new WeakMap(), c = (e, s) => {\n if (e.arg == null || e.instance == null) return;\n const a = \"setup\" in e.instance.$.type;\n e.arg in e.instance ? e.instance[e.arg] = s : a && console.warn(\"Maska: please expose `%s` using defineExpose\", e.arg);\n}, k = (e, s) => {\n var u;\n const a = e instanceof HTMLInputElement ? e : e.querySelector(\"input\");\n if (a == null || (a == null ? void 0 : a.type) === \"file\") return;\n let t = {};\n if (s.value != null && (t = typeof s.value == \"string\" ? { mask: s.value } : { ...s.value }), s.arg != null) {\n const o = (r) => {\n const p = s.modifiers.unmasked ? r.unmasked : s.modifiers.completed ? r.completed : r.masked;\n c(s, p);\n };\n t.onMaska = t.onMaska == null ? o : Array.isArray(t.onMaska) ? [...t.onMaska, o] : [t.onMaska, o];\n }\n l.has(a) ? (u = l.get(a)) == null || u.update(t) : l.set(a, new n(a, t));\n};\nexport {\n k as vMaska\n};\n","import type { FieldDef, SelectOption } from '@/types/field'\nimport type { ColumnDef } from '@/types/column'\n\nexport interface ApiFieldMeta {\n name: string\n label: string\n type: string\n required?: boolean\n max_length?: number\n choices?: { value: string; label: string }[]\n read_only?: boolean\n endpoint?: string\n option_label?: string\n option_value?: string\n}\n\nconst TYPE_MAP: Record<string, FieldDef['type']> = {\n string: 'text',\n integer: 'number',\n decimal: 'number',\n float: 'number',\n boolean: 'switch',\n choice: 'select',\n fk: 'fk',\n date: 'date',\n datetime: 'datetime',\n email: 'email',\n url: 'text',\n slug: 'text',\n text: 'textarea',\n}\n\nexport function mapApiFieldToFieldDef(apiField: ApiFieldMeta): FieldDef {\n const fieldType = TYPE_MAP[apiField.type] ?? 'text'\n\n const def: FieldDef = {\n field: apiField.name,\n label: apiField.label,\n type: fieldType,\n required: apiField.required ?? false,\n }\n\n if (apiField.type === 'decimal' || apiField.type === 'float') {\n def.minFractionDigits = 2\n def.maxFractionDigits = 2\n }\n\n if (apiField.type === 'boolean') {\n def.defaultValue = false\n }\n\n if (apiField.type === 'choice' && apiField.choices?.length) {\n def.options = apiField.choices.map((c) => ({\n label: c.label,\n value: c.value,\n })) as SelectOption[]\n }\n\n if (apiField.type === 'fk') {\n def.endpoint = apiField.endpoint\n if (apiField.option_label) def.optionLabel = apiField.option_label\n if (apiField.option_value) def.optionValue = apiField.option_value\n }\n\n return def\n}\n\nexport function mapApiFieldsToFieldDefs(apiFields: ApiFieldMeta[]): FieldDef[] {\n return apiFields.filter((f) => !f.read_only && f.name !== 'id').map(mapApiFieldToFieldDef)\n}\n\nconst COLUMN_TYPE_MAP: Record<string, ColumnDef['type']> = {\n boolean: 'boolean',\n date: 'date',\n datetime: 'datetime',\n decimal: 'number',\n float: 'number',\n integer: 'number',\n}\n\nexport function mapApiFieldToColumnDef(apiField: ApiFieldMeta): ColumnDef {\n // Para FK, exibe o campo _nome (ex: marca → marca_nome)\n const field = apiField.type === 'fk' ? `${apiField.name}_nome` : apiField.name\n return {\n field,\n header: apiField.label,\n type: COLUMN_TYPE_MAP[apiField.type],\n sortable: true,\n }\n}\n\nexport function mapApiFieldsToColumnDefs(apiFields: ApiFieldMeta[], maxColumns = 6): ColumnDef[] {\n return apiFields\n .filter((f) => !f.read_only && f.name !== 'id')\n .slice(0, maxColumns)\n .map(mapApiFieldToColumnDef)\n}\n","<script setup lang=\"ts\">\nimport { ref, watch, computed, inject, reactive, nextTick, onMounted } from 'vue'\nimport AutoComplete from 'primevue/autocomplete'\nimport Chip from 'primevue/chip'\nimport Dialog from 'primevue/dialog'\nimport DataTable from 'primevue/datatable'\nimport Column from 'primevue/column'\nimport Button from 'primevue/button'\nimport InputText from 'primevue/inputtext'\nimport IconField from 'primevue/iconfield'\nimport InputIcon from 'primevue/inputicon'\nimport { W_DATA_PROVIDER_KEY } from '@/types/plugin'\nimport type { DataProvider } from '@/types/dataProvider'\nimport type { FieldDef, FieldSubRowsFetch } from '@/types/field'\nimport type { ColumnDef } from '@/types/column'\nimport type { ApiFieldMeta } from '@/utils/fieldMapper'\nimport { mapApiFieldsToFieldDefs, mapApiFieldsToColumnDefs } from '@/utils/fieldMapper'\nimport { useAppToast } from '@/composables/useAppToast'\nimport { useAppConfirm } from '@/composables/useAppConfirm'\nimport { extractApiError } from '@/composables/useApiError'\nimport WCrudFormDialog from '@/components/crud/WCrudFormDialog.vue'\nimport WCrudColumnRenderer from '@/components/crud/WCrudColumnRenderer.vue'\n\ninterface ColumnMeta {\n field: string\n header: string\n}\n\n/** Filtro em cascata já resolvido (nome do parâmetro + valor atual). */\ninterface DrilldownFilter {\n field: string\n value: unknown\n required?: boolean\n}\n\n/** Valor aceito no `v-model`: id, objeto ou — em `multiple` — lista de ids/objetos. */\ntype FKValue = string | number | Record<string, unknown>\n\nconst props = withDefaults(\n defineProps<{\n modelValue: FKValue | FKValue[] | null\n endpoint: string\n endpointParams?: Record<string, string | number | boolean>\n /** Filtro(s) em cascata resolvido(s): aplicado(s) como parâmetro na busca. Com\n * `required` (default true), a busca só ocorre quando o valor estiver preenchido. */\n drilldown?: DrilldownFilter | DrilldownFilter[]\n /** Seleção múltipla: o campo vira chips e o `v-model` passa a ser uma lista\n * de objetos. O modal de pesquisa ganha caixas de marcação. */\n multiple?: boolean\n /** Em `multiple`, quantos chips mostrar antes de resumir o resto em `+N`\n * (0 = mostrar todos). Útil em campo estreito, tipo filtro de painel. */\n maxChips?: number\n optionLabel?: string\n /** Chave de uma segunda linha, em texto de apoio, dentro de cada sugestão — para\n * o dado que **decide** a escolha aparecer antes dela (ex.: saldo em estoque).\n * Vazia ou ausente na linha, a sugestão volta a ter uma linha só. */\n optionDescription?: string\n optionValue?: string\n placeholder?: string\n /** Placeholder exibido enquanto uma cascata obrigatória não estiver preenchida. */\n blockedPlaceholder?: string\n disabled?: boolean\n showClear?: boolean\n forceSelection?: boolean\n columns?: ColumnMeta[]\n minLength?: number\n dialogHeader?: string\n // CRUD no modal\n canCreate?: boolean\n canEdit?: boolean\n canDelete?: boolean\n crudFields?: FieldDef[]\n crudColumns?: ColumnDef[]\n /** Sub-linhas do grid do modal: recebe as linhas da página e devolve o mapa\n * `id → sub-linhas` + as colunas (dinâmicas) do mini-grid. Linha com entrada\n * no mapa abre expandida — ex.: lote (linha) com suas análises (sub-linhas). */\n subRows?: FieldSubRowsFetch\n dialogWidth?: string\n /** Foca o campo ao montar. Marca o input com o atributo nativo `autofocus`\n * para que o `focus()` do PrimeVue Dialog (em onAfterEnter) o encontre e\n * não roube o foco para o botão de fechar. */\n autofocus?: boolean\n }>(),\n {\n multiple: false,\n maxChips: 0,\n optionLabel: 'nome',\n optionValue: 'id',\n placeholder: 'Buscar...',\n disabled: false,\n showClear: true,\n forceSelection: true,\n minLength: 0,\n canCreate: undefined,\n canEdit: undefined,\n canDelete: undefined,\n dialogWidth: '480px',\n autofocus: false,\n },\n)\n\nconst emit = defineEmits<{\n /** Objeto selecionado — ou a lista de objetos quando `multiple`. */\n 'update:modelValue': [value: Record<string, unknown> | Record<string, unknown>[] | null]\n}>()\n\n// O template tem múltiplos nós raiz (o campo + os overlays Dialog/WCrudFormDialog).\n// Sem isto, `class`/`id`/`style` do consumidor não têm onde herdar e o Vue emite\n// warning de \"extraneous non-props attributes\". Aplicamos os attrs no nó visível.\ndefineOptions({ inheritAttrs: false })\n\nconst dataProvider = inject<DataProvider>(W_DATA_PROVIDER_KEY)\nif (!dataProvider) {\n throw new Error('[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin.')\n}\nconst provider = dataProvider\n\nconst toast = useAppToast()\nconst { confirmDelete: confirmDeleteDialog } = useAppConfirm()\n\n// ---------------------------------------------------------------------------\n// Inline autocomplete\n// ---------------------------------------------------------------------------\n\nconst selectedItem = ref<Record<string, unknown> | null>(null)\n/** Seleção quando `multiple` — o campo mostra um chip por item. */\nconst selectedItems = ref<Record<string, unknown>[]>([])\nconst suggestions = ref<Record<string, unknown>[]>([])\nconst searching = ref(false)\n\n/** Valor entregue ao AutoComplete: objeto (single) ou lista (multiple). */\nconst acModel = computed(() => (props.multiple ? selectedItems.value : selectedItem.value))\n\n/** Identificador escalar de um valor do v-model (id cru ou objeto já resolvido). */\nfunction keyOf(v: unknown): unknown {\n if (v && typeof v === 'object') return (v as Record<string, unknown>)[props.optionValue]\n return v\n}\n\nfunction dedupeByKey(itens: Record<string, unknown>[]): Record<string, unknown>[] {\n const vistos = new Set<unknown>()\n const out: Record<string, unknown>[] = []\n for (const item of itens) {\n const k = keyOf(item)\n if (vistos.has(k)) continue\n vistos.add(k)\n out.push(item)\n }\n return out\n}\n\nfunction emitSelection() {\n emit('update:modelValue', props.multiple ? [...selectedItems.value] : selectedItem.value)\n}\n\nfunction labelOf(item: unknown): string {\n const v = (item as Record<string, unknown>)?.[props.optionLabel]\n return v == null ? '' : String(v)\n}\n\n/** Texto de apoio da sugestão. Vazio quando a linha não trouxe o campo. */\nfunction descriptionOf(item: unknown): string {\n if (!props.optionDescription) return ''\n const v = (item as Record<string, unknown>)?.[props.optionDescription]\n return v == null ? '' : String(v)\n}\n\n/** Quantos chips ficam escondidos atrás do `+N` (0 quando cabem todos). */\nconst chipsOcultos = computed(() =>\n props.maxChips > 0 ? Math.max(0, selectedItems.value.length - props.maxChips) : 0,\n)\n\n/** Nomes resumidos no `+N` — viram tooltip para não esconder informação. */\nconst chipsOcultosLabel = computed(() =>\n selectedItems.value.slice(props.maxChips).map(labelOf).join(', '),\n)\n\n/** O `x` do chip remove só aquele item — sem deixar o clique subir para o chip\n * (que abre a listagem). */\nfunction onChipRemove(event: Event, remove: (event: Event) => void) {\n event?.stopPropagation?.()\n remove(event)\n}\n\n/** Limpar tudo: em `multiple` a lista inteira; no simples, o valor. */\nfunction limparSelecao() {\n if (props.disabled) return\n if (props.multiple) {\n if (!selectedItems.value.length) return\n selectedItems.value = []\n } else {\n if (!selectedItem.value) return\n selectedItem.value = null\n }\n emitSelection()\n}\n\n/** Com `maxChips`, cada chip fica com uma fração da largura do campo — assim\n * eles dividem a linha (em vez de um por linha) e truncam o que não couber.\n * A reserva cobre o chip `+N` e a área de digitação; o piso de 7rem impede\n * chip ilegível em campo estreito (aí eles quebram para a linha de baixo). */\nconst chipStyle = computed(() =>\n props.multiple && props.maxChips > 0\n ? { '--w-fk-chip-max': `max(6rem, calc((100% - 6rem) / ${props.maxChips}))` }\n : undefined,\n)\n\n/** Mostra o \"limpar\" só quando há o que limpar (e o consumidor permite). */\nconst mostrarLimpar = computed(() => {\n if (!props.showClear || props.disabled) return false\n return props.multiple ? selectedItems.value.length > 0 : selectedItem.value !== null\n})\n\nlet debounceTimer: ReturnType<typeof setTimeout> | null = null\n\n// Referência ao AutoComplete para aplicar o autofocus no input nativo.\nconst acRef = ref<{ $el?: HTMLElement } | null>(null)\n\nonMounted(() => {\n if (!props.autofocus) return\n nextTick(() => {\n const input = acRef.value?.$el?.querySelector?.('input') as HTMLInputElement | null\n if (!input) return\n // O atributo nativo faz o Dialog.focus() (onAfterEnter) mirar este input\n // em vez do botão fechar; o focus() cobre o caso fora de Dialog.\n input.setAttribute('autofocus', '')\n input.focus()\n input.select?.()\n })\n})\n\n// ---------------------------------------------------------------------------\n// Filtro em cascata (drill-down)\n// ---------------------------------------------------------------------------\n\nfunction isEmptyValue(v: unknown): boolean {\n return v === null || v === undefined || v === ''\n}\n\n/** Um campo FK guarda o objeto inteiro; extrai o identificador escalar para o filtro. */\nfunction normalizeDrillValue(v: unknown): unknown {\n if (v && typeof v === 'object') {\n const o = v as Record<string, unknown>\n return o.id ?? o.value ?? o\n }\n return v\n}\n\nconst drilldownList = computed<DrilldownFilter[]>(() => {\n const d = props.drilldown\n if (!d) return []\n return Array.isArray(d) ? d : [d]\n})\n\n/** true quando alguma cascata obrigatória ainda não tem valor → não busca. */\nconst blockedByRequired = computed(() =>\n drilldownList.value.some(\n (d) => (d.required ?? true) && isEmptyValue(normalizeDrillValue(d.value)),\n ),\n)\n\n/** Parâmetros de filtro derivados das cascatas com valor preenchido. */\nfunction drilldownParams(): Record<string, unknown> {\n const params: Record<string, unknown> = {}\n for (const d of drilldownList.value) {\n const val = normalizeDrillValue(d.value)\n if (!isEmptyValue(val)) params[d.field] = val\n }\n return params\n}\n\nconst effectivePlaceholder = computed(() =>\n blockedByRequired.value && props.blockedPlaceholder\n ? props.blockedPlaceholder\n : props.placeholder,\n)\n\n/** Em `multiple` o placeholder some quando já há chips — ele descreve o estado\n * \"sem filtro\"; ao lado de uma seleção viraria informação contraditória. */\nconst placeholderVisivel = computed(() =>\n props.multiple && selectedItems.value.length ? undefined : effectivePlaceholder.value,\n)\n\nasync function fetchOne(id: string | number): Promise<Record<string, unknown> | null> {\n try {\n const response = await provider.get(props.endpoint, id)\n return response.data\n } catch {\n return null\n }\n}\n\nasync function fetchById(id: string | number) {\n selectedItem.value = await fetchOne(id)\n}\n\n/** Resolve a lista do v-model: objeto já resolvido passa direto, id vira GET. */\nasync function resolveMany(valores: FKValue[]): Promise<Record<string, unknown>[]> {\n const itens = await Promise.all(\n valores.map(async (v) => {\n if (v && typeof v === 'object') {\n const obj = v as Record<string, unknown>\n if (props.optionLabel in obj) return obj\n const id = obj[props.optionValue]\n return id != null ? await fetchOne(id as string | number) : null\n }\n // Reaproveita o que já está resolvido — evita GET a cada mudança da lista.\n const atual = selectedItems.value.find((i) => i[props.optionValue] === v)\n return atual ?? (await fetchOne(v as string | number))\n }),\n )\n return itens.filter((i): i is Record<string, unknown> => i !== null)\n}\n\nasync function search(query: string) {\n // Cascata obrigatória sem valor → não busca (evita listar tudo).\n if (blockedByRequired.value) {\n suggestions.value = []\n return\n }\n searching.value = true\n try {\n const params: Record<string, unknown> = {\n page_size: 20,\n ...props.endpointParams,\n ...drilldownParams(),\n }\n if (query) params.search = query\n const response = await provider.list(props.endpoint, params)\n suggestions.value = response.data\n } catch {\n suggestions.value = []\n } finally {\n searching.value = false\n }\n}\n\nfunction onSearch(event: { query: string }) {\n const query = event.query || ''\n if (query.length < props.minLength) {\n suggestions.value = []\n return\n }\n if (debounceTimer) clearTimeout(debounceTimer)\n debounceTimer = setTimeout(() => search(query), 300)\n}\n\nfunction onSelect(event: { value: Record<string, unknown> }) {\n // Em `multiple` o AutoComplete já mantém a lista — tratado em `onAcUpdate`.\n if (props.multiple) return\n selectedItem.value = event.value\n emit('update:modelValue', event.value)\n}\n\n/** Em `multiple`, o AutoComplete emite a lista inteira ao marcar/remover chip. */\nfunction onAcUpdate(value: unknown) {\n if (!props.multiple) return\n selectedItems.value = dedupeByKey(\n Array.isArray(value) ? (value as Record<string, unknown>[]) : [],\n )\n emitSelection()\n}\n\nfunction onClear() {\n // Em `multiple`, o AutoComplete emite `clear` também quando só descarta o texto\n // digitado (`forceSelection` sem correspondência) — limpar a lista aqui apagaria\n // a seleção inteira a cada busca sem match. O clear real chega como\n // `update:modelValue` (ícone de limpar), tratado em `onAcUpdate`.\n if (props.multiple) return\n selectedItem.value = null\n emitSelection()\n}\n\n// Resolve initial value\nwatch(\n () => props.modelValue,\n async (newVal) => {\n if (props.multiple) {\n const lista = newVal == null ? [] : Array.isArray(newVal) ? newVal : [newVal]\n const chaves = lista.map(keyOf)\n const atuais = selectedItems.value.map((i) => i[props.optionValue])\n // Mesma lista (na mesma ordem) → nada a resolver; evita loop com o emit.\n if (chaves.length === atuais.length && chaves.every((k, i) => k === atuais[i])) return\n selectedItems.value = await resolveMany(lista)\n return\n }\n if (newVal != null) {\n if (typeof newVal === 'object' && newVal !== null && props.optionLabel in newVal) {\n selectedItem.value = newVal as Record<string, unknown>\n return\n }\n if (!selectedItem.value || selectedItem.value[props.optionValue] !== newVal) {\n await fetchById(newVal as string | number)\n }\n } else {\n selectedItem.value = null\n }\n },\n { immediate: true },\n)\n\n// ---------------------------------------------------------------------------\n// Modal — State\n// ---------------------------------------------------------------------------\n\nconst modalVisible = ref(false)\nconst modalData = ref<Record<string, unknown>[]>([])\nconst modalLoading = ref(false)\nconst modalSearch = ref('')\nconst modalPage = ref(1)\nconst modalPageSize = ref(15)\nconst modalTotalRecords = ref(0)\nconst modalSelection = ref<Record<string, unknown> | Record<string, unknown>[] | null>(null)\n\n/** Itens marcados no modal, normalizados (single ou multiple). */\nconst modalSelecionados = computed<Record<string, unknown>[]>(() => {\n const sel = modalSelection.value\n if (!sel) return []\n return Array.isArray(sel) ? sel : [sel]\n})\nconst modalSortField = ref<string | null>(null)\nconst modalSortOrder = ref<1 | -1 | 0>(0)\nlet modalSearchTimer: ReturnType<typeof setTimeout> | null = null\n\n// --- Sub-linhas (expansão automática por linha com dados) ---\nconst subRowsMap = ref<Record<string, Record<string, unknown>[]>>({})\nconst subRowsColumns = ref<ColumnDef[]>([])\nconst expandedRows = ref<Record<string, boolean>>({})\n\n/** Busca as sub-linhas da página atual e abre as linhas que têm o que mostrar. */\nasync function fetchSubRows() {\n if (!props.subRows) return\n try {\n const { map, columns } = await props.subRows(modalData.value)\n subRowsMap.value = map || {}\n subRowsColumns.value = columns || []\n const abertos: Record<string, boolean> = {}\n for (const row of modalData.value) {\n const id = String(row[props.optionValue])\n if (subRowsMap.value[id]?.length) abertos[id] = true\n }\n expandedRows.value = abertos\n } catch {\n // Sub-linha é enriquecimento: falhou, o grid segue só com as linhas.\n subRowsMap.value = {}\n subRowsColumns.value = []\n expandedRows.value = {}\n }\n}\n\nfunction subRowsDe(row: Record<string, unknown>): Record<string, unknown>[] {\n return subRowsMap.value[String(row[props.optionValue])] || []\n}\n\n// Metadata from extras.fields\nconst apiFields = ref<ApiFieldMeta[]>([])\nconst crudAvailable = computed(() => {\n // Se o usuário forneceu crudFields, CRUD está habilitado\n if (props.crudFields?.length) return true\n // Se a API retornou extras.fields, CRUD está disponível\n return apiFields.value.length > 0\n})\n\n// Respeita props explícitas, senão auto-detecta\nconst showCreate = computed(() => props.canCreate ?? crudAvailable.value)\nconst showEdit = computed(() => props.canEdit ?? crudAvailable.value)\nconst showDelete = computed(() => props.canDelete ?? crudAvailable.value)\nconst hasRowActions = computed(() => showEdit.value || showDelete.value)\n\n// Campos do form — prioridade: props > auto-gerados do extras\nconst formFields = computed<FieldDef[]>(() => {\n if (props.crudFields?.length) return props.crudFields\n return mapApiFieldsToFieldDefs(apiFields.value)\n})\n\n// Colunas do modal — prioridade: crudColumns > props.columns > auto-geradas > fallback\nconst modalColumns = computed<ColumnDef[]>(() => {\n if (props.crudColumns?.length) return props.crudColumns\n if (props.columns?.length) {\n return props.columns.map((c) => ({\n field: c.field,\n header: c.header,\n sortable: true,\n }))\n }\n if (apiFields.value.length) {\n return mapApiFieldsToColumnDefs(apiFields.value)\n }\n return [{ field: props.optionLabel, header: props.optionLabel, sortable: true }]\n})\n\n// ---------------------------------------------------------------------------\n// Modal — Fetch\n// ---------------------------------------------------------------------------\n\nasync function fetchModalData() {\n // Cascata obrigatória sem valor → não lista (o modal mostra estado vazio).\n if (blockedByRequired.value) {\n modalData.value = []\n modalTotalRecords.value = 0\n return\n }\n modalLoading.value = true\n try {\n const params: Record<string, unknown> = {\n page: modalPage.value,\n page_size: modalPageSize.value,\n ...props.endpointParams,\n ...drilldownParams(),\n }\n if (modalSearch.value) params.search = modalSearch.value\n if (modalSortField.value && modalSortOrder.value !== 0) {\n params.ordering =\n modalSortOrder.value === -1 ? `-${modalSortField.value}` : modalSortField.value\n }\n const response = await provider.list(props.endpoint, params)\n modalData.value = response.data\n modalTotalRecords.value = response.rows\n void fetchSubRows()\n\n // Captura metadata de campos na primeira requisição\n if (response.extras?.fields && !props.columns?.length && !props.crudFields?.length) {\n apiFields.value = response.extras.fields as ApiFieldMeta[]\n }\n } catch {\n modalData.value = []\n modalTotalRecords.value = 0\n } finally {\n modalLoading.value = false\n }\n}\n\nfunction onInputKeydown(e: KeyboardEvent) {\n // F2 abre o modal de pesquisa (atalho estilo desktop).\n if (e.key === 'F2' && !props.disabled) {\n e.preventDefault()\n openModal()\n }\n}\n\nfunction openModal() {\n if (props.disabled) return\n modalSearch.value = ''\n modalPage.value = 1\n modalSortField.value = null\n modalSortOrder.value = 0\n // Em `multiple` o modal abre já com o que está selecionado no campo.\n modalSelection.value = props.multiple ? [...selectedItems.value] : null\n modalVisible.value = true\n fetchModalData()\n}\n\nfunction onModalPage(event: { page: number; rows: number }) {\n modalPage.value = event.page + 1\n modalPageSize.value = event.rows\n fetchModalData()\n}\n\nfunction onModalSort(event: { sortField?: string; sortOrder?: 1 | -1 | 0 }) {\n modalSortField.value = (event.sortField as string) ?? null\n modalSortOrder.value = event.sortOrder ?? 0\n modalPage.value = 1\n fetchModalData()\n}\n\nfunction confirmModalSelection() {\n if (props.multiple) {\n selectedItems.value = dedupeByKey(modalSelecionados.value)\n emitSelection()\n modalVisible.value = false\n return\n }\n const sel = modalSelecionados.value[0]\n if (!sel) return\n selectedItem.value = sel\n emit('update:modelValue', sel)\n modalVisible.value = false\n}\n\nfunction onRowDblClick(event: { data: Record<string, unknown> }) {\n // Em `multiple`, o duplo clique acrescenta à marcação e o modal continua\n // aberto — fechar a cada item tornaria a seleção de vários penosa.\n if (props.multiple) {\n modalSelection.value = dedupeByKey([...modalSelecionados.value, event.data])\n return\n }\n selectedItem.value = event.data\n emit('update:modelValue', event.data)\n modalVisible.value = false\n}\n\n// --- Modal: teclado (foco → pesquisa → grid) ---\nconst modalSearchInput = ref<{ $el?: HTMLElement } | null>(null)\nconst modalTableWrap = ref<HTMLElement | null>(null)\nlet lastSearched = ''\n\nfunction onModalShow() {\n lastSearched = ''\n nextTick(() => {\n const el = modalSearchInput.value?.$el as HTMLInputElement | undefined\n el?.focus?.()\n el?.select?.()\n })\n}\n\nfunction focusModalGrid() {\n nextTick(() => {\n const row = modalTableWrap.value?.querySelector<HTMLElement>('.p-datatable-tbody > tr')\n row?.focus()\n })\n}\n\nfunction onModalSearchKeydown(e: KeyboardEvent) {\n if (e.key !== 'Enter' || e.isComposing) return\n e.preventDefault()\n const q = modalSearch.value.trim()\n // Vazio ou já pesquisado → move o foco para o grid.\n if (q === '' || q === lastSearched) {\n focusModalGrid()\n return\n }\n // Texto novo → pesquisa imediata (cancela o debounce); o próximo Enter vai ao grid.\n if (modalSearchTimer) clearTimeout(modalSearchTimer)\n lastSearched = q\n modalPage.value = 1\n fetchModalData()\n}\n\nfunction onModalGridKeydown(e: KeyboardEvent) {\n // Enter no grid = confirmar a seleção (marcada com Espaço). Interceptado (capture)\n // antes do handler nativo do DataTable para não apenas alternar a marca.\n if (e.key === 'Enter') {\n e.preventDefault()\n e.stopPropagation()\n // Em `multiple` o Enter confirma a marcação atual, inclusive vazia (= limpar).\n if (props.multiple || modalSelecionados.value.length) confirmModalSelection()\n }\n // Espaço e setas: tratados nativamente pelo DataTable (marca/navega).\n}\n\nwatch(modalSearch, () => {\n if (modalSearchTimer) clearTimeout(modalSearchTimer)\n modalSearchTimer = setTimeout(() => {\n modalPage.value = 1\n lastSearched = modalSearch.value.trim()\n fetchModalData()\n }, 300)\n})\n\n// Reage à mudança das cascatas: rebusca (se o modal estiver aberto) e limpa a\n// seleção que ficou obsoleta ao trocar a origem — sem apagar na carga inicial.\nwatch(\n () => drilldownList.value.map((d) => normalizeDrillValue(d.value)),\n (novos, antigos) => {\n if (modalVisible.value) {\n modalPage.value = 1\n fetchModalData()\n }\n if (!antigos) return\n const mudou = novos.some((v, i) => v !== antigos[i])\n const tinhaValorAntes = antigos.some((v) => !isEmptyValue(v))\n if (!mudou || !tinhaValorAntes) return\n if (props.multiple) {\n if (!selectedItems.value.length) return\n selectedItems.value = []\n emitSelection()\n return\n }\n if (selectedItem.value) {\n selectedItem.value = null\n emit('update:modelValue', null)\n }\n },\n)\n\n// ---------------------------------------------------------------------------\n// Modal — CRUD\n// ---------------------------------------------------------------------------\n\nconst formDialogVisible = ref(false)\nconst formSaving = ref(false)\nconst editingItem = ref<Record<string, unknown> | null>(null)\nconst formData = reactive<Record<string, unknown>>({})\n\nconst isEditing = computed(() => editingItem.value !== null)\nconst formDialogTitle = computed(() => (isEditing.value ? 'Editar Registro' : 'Novo Registro'))\n\nfunction getDefaults(): Record<string, unknown> {\n const defaults: Record<string, unknown> = {}\n for (const f of formFields.value) {\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\nfunction resetForm() {\n const defs = getDefaults()\n for (const key of Object.keys(formData)) {\n delete formData[key]\n }\n for (const [key, val] of Object.entries(defs)) {\n formData[key] = val\n }\n}\n\nfunction openCreateForm() {\n editingItem.value = null\n resetForm()\n formDialogVisible.value = true\n}\n\nfunction openEditForm(item: Record<string, unknown>) {\n editingItem.value = item\n for (const f of formFields.value) {\n formData[f.field] = item[f.field] !== undefined ? item[f.field] : null\n }\n formDialogVisible.value = true\n}\n\nfunction setFormField(field: string, value: unknown) {\n formData[field] = value\n}\n\nasync function saveForm() {\n formSaving.value = true\n try {\n const payload = { ...formData }\n\n // FK — extrair ID de objetos selecionados\n for (const f of formFields.value) {\n const val = payload[f.field]\n if (f.type === 'fk' && val !== null && typeof val === 'object') {\n const key = f.optionValue || 'id'\n payload[f.field] = (val as Record<string, unknown>)[key] ?? val\n }\n }\n\n let response\n\n if (isEditing.value && editingItem.value) {\n const pk = editingItem.value[props.optionValue]\n response = await provider.update(props.endpoint, pk as string | number, payload)\n // Atualiza na lista do modal\n const idx = modalData.value.findIndex((i) => i[props.optionValue] === pk)\n if (idx !== -1) {\n modalData.value[idx] = response.data\n }\n toast.success('Registro atualizado com sucesso')\n } else {\n // Cria herdando o(s) pai(s) da cascata (dependsOn) — ex.: um novo lote nasce\n // no produto selecionado. Sem semear o pai o backend rejeitaria o filho órfão.\n // Só completa chaves ausentes: um campo do form com o mesmo nome prevalece.\n const parent = drilldownParams()\n for (const [key, value] of Object.entries(parent)) {\n const current = payload[key]\n if (current === undefined || current === null || current === '') {\n payload[key] = value\n }\n }\n response = await provider.create(props.endpoint, payload)\n // Adiciona na lista e seleciona automaticamente\n modalData.value.unshift(response.data)\n modalTotalRecords.value++\n toast.success('Registro criado com sucesso')\n }\n\n formDialogVisible.value = false\n editingItem.value = null\n\n // Auto-seleciona o registro criado/editado (em `multiple`, acrescenta)\n modalSelection.value = props.multiple\n ? dedupeByKey([...modalSelecionados.value, response.data])\n : response.data\n } catch (err) {\n toast.error(extractApiError(err, 'Erro ao salvar registro'))\n } finally {\n formSaving.value = false\n }\n}\n\nfunction confirmDelete(item: Record<string, unknown>) {\n confirmDeleteDialog(async () => {\n try {\n const pk = item[props.optionValue]\n await provider.delete(props.endpoint, pk as string | number)\n const idx = modalData.value.findIndex((i) => i[props.optionValue] === pk)\n if (idx !== -1) {\n modalData.value.splice(idx, 1)\n modalTotalRecords.value--\n }\n // Se o item deletado estava selecionado, sai da seleção\n if (props.multiple) {\n if (selectedItems.value.some((i) => i[props.optionValue] === pk)) {\n selectedItems.value = selectedItems.value.filter((i) => i[props.optionValue] !== pk)\n emitSelection()\n }\n modalSelection.value = modalSelecionados.value.filter((i) => i[props.optionValue] !== pk)\n } else {\n if (selectedItem.value && selectedItem.value[props.optionValue] === pk) {\n selectedItem.value = null\n emit('update:modelValue', null)\n }\n if (modalSelecionados.value[0]?.[props.optionValue] === pk) {\n modalSelection.value = null\n }\n }\n toast.success('Registro excluído com sucesso')\n } catch (err) {\n toast.error(extractApiError(err, 'Erro ao excluir registro'))\n }\n })\n}\n</script>\n\n<template>\n <div\n class=\"w-autocompletefk\"\n :class=\"{ 'w-autocompletefk-has-clear': mostrarLimpar }\"\n :style=\"chipStyle\"\n v-bind=\"$attrs\"\n >\n <AutoComplete\n ref=\"acRef\"\n :model-value=\"acModel\"\n :suggestions=\"suggestions\"\n :multiple=\"multiple\"\n :option-label=\"optionLabel\"\n :placeholder=\"placeholderVisivel\"\n :disabled=\"disabled\"\n :force-selection=\"forceSelection\"\n :loading=\"searching\"\n :show-clear=\"false\"\n fluid\n @complete=\"onSearch\"\n @item-select=\"onSelect\"\n @update:model-value=\"onAcUpdate\"\n @clear=\"onClear\"\n @keydown=\"onInputKeydown\"\n >\n <!-- Sugestão em duas linhas quando `optionDescription` aponta para algo\n preenchido. Sem ela o slot não é declarado, e o AutoComplete volta ao\n render padrão de uma linha — nada muda para quem não usa. -->\n <template v-if=\"optionDescription\" #option=\"{ option }\">\n <span class=\"w-fk-option\">\n <span class=\"w-fk-option__label\">{{ labelOf(option) }}</span>\n <span v-if=\"descriptionOf(option)\" class=\"w-fk-option__desc\">\n {{ descriptionOf(option) }}\n </span>\n </span>\n </template>\n\n <!-- Chip clicado abre a listagem já marcada com a seleção atual. Com\n `maxChips`, os excedentes viram um chip `+N` (somem do campo, mas\n continuam no tooltip) — chip nenhum pode esticar a caixa. -->\n <template v-if=\"multiple\" #chip=\"{ value, index, removeCallback }\">\n <Chip\n v-if=\"!maxChips || index < maxChips\"\n v-tooltip.top=\"labelOf(value)\"\n class=\"p-autocomplete-chip w-autocompletefk-chip\"\n :label=\"labelOf(value)\"\n removable\n @click=\"openModal\"\n @remove=\"onChipRemove($event, removeCallback)\"\n />\n <Chip\n v-else-if=\"index === maxChips\"\n v-tooltip.top=\"chipsOcultosLabel\"\n class=\"p-autocomplete-chip w-autocompletefk-chip w-autocompletefk-chip-more\"\n :label=\"`+${chipsOcultos}`\"\n @click=\"openModal\"\n />\n <span v-else class=\"w-autocompletefk-chip-hidden\" />\n </template>\n </AutoComplete>\n <button\n v-if=\"mostrarLimpar\"\n v-tooltip.top=\"'Limpar'\"\n type=\"button\"\n data-kbd-skip\n tabindex=\"-1\"\n class=\"w-autocompletefk-clear\"\n @click=\"limparSelecao\"\n >\n <i class=\"pi pi-times\" />\n </button>\n <button\n v-tooltip.top=\"'Pesquisar (F2)'\"\n type=\"button\"\n :disabled=\"disabled\"\n data-kbd-skip\n tabindex=\"-1\"\n class=\"w-autocompletefk-trigger\"\n @click=\"openModal\"\n >\n <i class=\"pi pi-search\" />\n </button>\n </div>\n\n <!-- Modal de Pesquisa + CRUD -->\n <Dialog\n v-model:visible=\"modalVisible\"\n :header=\"dialogHeader || 'Pesquisar'\"\n :style=\"{ width: '80vw' }\"\n modal\n :draggable=\"false\"\n class=\"w-autocompletefk-dialog\"\n @show=\"onModalShow\"\n >\n <div class=\"w-autocompletefk-toolbar\">\n <IconField class=\"w-autocompletefk-toolbar-search\">\n <InputIcon class=\"pi pi-search\" />\n <InputText\n ref=\"modalSearchInput\"\n v-model=\"modalSearch\"\n placeholder=\"Pesquisar...\"\n class=\"w-full\"\n autofocus\n @keydown=\"onModalSearchKeydown\"\n />\n </IconField>\n <div class=\"w-autocompletefk-toolbar-actions\">\n <Button\n v-if=\"showCreate\"\n label=\"Novo\"\n icon=\"pi pi-plus\"\n size=\"small\"\n @click=\"openCreateForm\"\n />\n </div>\n </div>\n\n <div ref=\"modalTableWrap\" @keydown.capture=\"onModalGridKeydown\">\n <DataTable\n v-model:selection=\"modalSelection\"\n v-model:expanded-rows=\"expandedRows\"\n :meta-key-selection=\"false\"\n :value=\"modalData\"\n :loading=\"modalLoading\"\n paginator\n lazy\n striped-rows\n removable-sort\n size=\"small\"\n :rows=\"modalPageSize\"\n :total-records=\"modalTotalRecords\"\n :sort-field=\"modalSortField ?? undefined\"\n :sort-order=\"modalSortOrder\"\n :selection-mode=\"multiple ? 'multiple' : 'single'\"\n :data-key=\"optionValue\"\n @page=\"onModalPage\"\n @sort=\"(e: any) => onModalSort({ sortField: e.sortField, sortOrder: e.sortOrder })\"\n @row-dblclick=\"onRowDblClick\"\n >\n <Column :selection-mode=\"multiple ? 'multiple' : 'single'\" header-style=\"width: 3rem\" />\n <Column\n v-for=\"col in modalColumns\"\n :key=\"col.field\"\n :field=\"col.field\"\n :header=\"col.header\"\n :sortable=\"(col as ColumnDef).sortable ?? true\"\n :style=\"(col as ColumnDef).style\"\n >\n <template #body=\"{ data }\">\n <WCrudColumnRenderer\n v-if=\"(col as ColumnDef).type\"\n :column=\"col as ColumnDef\"\n :value=\"data[col.field]\"\n :row-data=\"data\"\n />\n <template v-else>\n {{ data[col.field] }}\n </template>\n </template>\n </Column>\n\n <!-- Coluna de ações CRUD -->\n <Column v-if=\"hasRowActions\" header=\"\" :style=\"{ width: '6rem' }\">\n <template #body=\"{ data }\">\n <div class=\"flex items-center justify-end gap-1\">\n <Button\n v-if=\"showEdit\"\n v-tooltip.top=\"'Editar'\"\n icon=\"pi pi-pencil\"\n text\n rounded\n size=\"small\"\n @click=\"openEditForm(data)\"\n />\n <Button\n v-if=\"showDelete\"\n v-tooltip.top=\"'Excluir'\"\n icon=\"pi pi-trash\"\n text\n rounded\n size=\"small\"\n severity=\"danger\"\n @click=\"confirmDelete(data)\"\n />\n </div>\n </template>\n </Column>\n\n <!-- Sub-linhas: mini-grid por linha expandida (colunas vêm do `subRows`) -->\n <template v-if=\"subRows\" #expansion=\"{ data }\">\n <table class=\"w-fk-subrows\">\n <thead>\n <tr>\n <th v-for=\"col in subRowsColumns\" :key=\"col.field\">{{ col.header }}</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(sub, i) in subRowsDe(data)\" :key=\"i\">\n <td v-for=\"col in subRowsColumns\" :key=\"col.field\">\n {{ sub[col.field] ?? '—' }}\n </td>\n </tr>\n </tbody>\n </table>\n </template>\n\n <template #empty>\n <div class=\"w-autocompletefk-empty\">Nenhum registro encontrado</div>\n </template>\n </DataTable>\n </div>\n\n <template #footer>\n <div class=\"w-autocompletefk-footer\">\n <Button label=\"Cancelar\" severity=\"secondary\" text @click=\"modalVisible = false\" />\n <Button\n :label=\"\n multiple && modalSelecionados.length\n ? `Selecionar (${modalSelecionados.length})`\n : 'Selecionar'\n \"\n icon=\"pi pi-check\"\n :disabled=\"!multiple && !modalSelecionados.length\"\n @click=\"confirmModalSelection\"\n />\n </div>\n </template>\n </Dialog>\n\n <!-- Form Dialog (CRUD) — nested sobre o modal -->\n <WCrudFormDialog\n v-if=\"crudAvailable\"\n :visible=\"formDialogVisible\"\n :title=\"formDialogTitle\"\n :fields=\"formFields\"\n :form-data=\"formData\"\n :is-editing=\"isEditing\"\n :saving=\"formSaving\"\n :width=\"dialogWidth\"\n @update:visible=\"\n (v) => {\n formDialogVisible = v\n if (!v) editingItem = null\n }\n \"\n @update:field=\"setFormField\"\n @save=\"saveForm\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { ref, computed, watch, onMounted } from 'vue'\nimport DatePicker from 'primevue/datepicker'\nimport InputText from 'primevue/inputtext'\nimport IconField from 'primevue/iconfield'\nimport InputIcon from 'primevue/inputicon'\nimport Popover from 'primevue/popover'\nimport Button from 'primevue/button'\nimport { vMaska } from 'maska/vue'\nimport { useDateInput, type DateValueFormat } from '@/composables/useDateInput'\n\n/**\n * Campo de data pt-BR padronizado.\n * - Exibe `DD/MM/YYYY` (ou `DD/MM/YYYY HH:mm` com `showTime`) e salva `YYYY-MM-DD`.\n * - Digitação direta com máscara: `30051988` vira `30/05/1988`.\n * - Ícone de calendário abre o seletor (Hoje / Limpar).\n * - `F2` preenche a data de hoje.\n * - `autonow`: no mount, se o valor for `null`, preenche hoje; senão mantém.\n */\nconst props = withDefaults(\n defineProps<{\n modelValue?: string | Date | null\n /** Formato do valor emitido: `'iso'` (YYYY-MM-DD, default) ou `'date'` (Date). */\n valueFormat?: DateValueFormat\n showTime?: boolean\n /** No mount: se o valor for `null`, preenche a data de hoje. */\n autonow?: boolean\n minDate?: string | Date\n maxDate?: string | Date\n disabled?: boolean\n showClear?: boolean\n placeholder?: string\n invalid?: boolean\n inputId?: string\n }>(),\n {\n modelValue: null,\n valueFormat: 'iso',\n showTime: false,\n autonow: false,\n disabled: false,\n showClear: true,\n invalid: false,\n },\n)\n\nconst emit = defineEmits<{ 'update:modelValue': [value: string | Date | null] }>()\n\nconst di = useDateInput({\n showTime: () => props.showTime,\n valueFormat: () => props.valueFormat,\n})\n\nconst typed = ref('') // texto no input (DD/MM/YYYY[ HH:mm])\nconst panelDate = ref<Date | null>(null) // valor do calendário\nconst op = ref<InstanceType<typeof Popover> | null>(null)\n\nconst maskaOptions = computed(() => ({ mask: di.mask() }))\nconst minDateObj = computed(() => di.toDate(props.minDate) ?? undefined)\nconst maxDateObj = computed(() => di.toDate(props.maxDate) ?? undefined)\n\n// Única sincronização externo → interno (o resto é orientado a eventos, sem watchers).\nwatch(\n () => props.modelValue,\n (v) => {\n const d = di.toDate(v)\n panelDate.value = d\n typed.value = di.toDisplay(d)\n },\n { immediate: true },\n)\n\nfunction commit(date: Date | null) {\n emit('update:modelValue', di.toValue(date))\n}\n\nfunction onTypedInput() {\n if (typed.value === '') {\n commit(null)\n return\n }\n // Só comita quando o texto formar uma data completa e válida.\n const d = di.fromDisplay(typed.value)\n if (d) commit(d)\n}\n\nfunction onBlur() {\n // Ao sair, normaliza o texto para o último valor válido (descarta digitação incompleta).\n typed.value = di.toDisplay(di.toDate(props.modelValue))\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (e.key === 'F2' && !props.disabled) {\n e.preventDefault()\n setToday()\n }\n}\n\nfunction onPick(value: unknown) {\n const d = (value as Date | null) ?? null\n commit(d)\n if (!props.showTime) op.value?.hide()\n}\n\nfunction setToday() {\n commit(di.today())\n}\n\nfunction clearValue() {\n commit(null)\n op.value?.hide()\n}\n\nfunction toggle(e: Event) {\n if (props.disabled) return\n op.value?.toggle(e)\n}\n\nonMounted(() => {\n if (props.autonow && props.modelValue == null) setToday()\n})\n</script>\n\n<template>\n <div class=\"w-datepicker\">\n <IconField>\n <InputText\n :id=\"inputId\"\n v-model=\"typed\"\n v-maska=\"maskaOptions\"\n :placeholder=\"placeholder ?? di.placeholder()\"\n :disabled=\"disabled\"\n :invalid=\"invalid\"\n fluid\n autocomplete=\"off\"\n inputmode=\"numeric\"\n @input=\"onTypedInput\"\n @blur=\"onBlur\"\n @keydown=\"onKeydown\"\n />\n <InputIcon\n class=\"pi pi-calendar w-datepicker-icon\"\n :class=\"{ 'w-datepicker-icon-disabled': disabled }\"\n role=\"button\"\n tabindex=\"-1\"\n aria-label=\"Abrir calendário\"\n @click=\"toggle\"\n />\n </IconField>\n\n <Popover ref=\"op\">\n <div class=\"w-datepicker-panel\">\n <DatePicker\n :model-value=\"panelDate ?? undefined\"\n inline\n :show-time=\"showTime\"\n hour-format=\"24\"\n :min-date=\"minDateObj\"\n :max-date=\"maxDateObj\"\n @update:model-value=\"onPick\"\n />\n <div class=\"w-datepicker-actions\">\n <Button label=\"Hoje\" text size=\"small\" @click=\"setToday\" />\n <Button\n v-if=\"showClear\"\n label=\"Limpar\"\n text\n size=\"small\"\n severity=\"secondary\"\n @click=\"clearValue\"\n />\n </div>\n </div>\n </Popover>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport InputText from 'primevue/inputtext'\nimport InputGroup from 'primevue/inputgroup'\nimport InputGroupAddon from 'primevue/inputgroupaddon'\n\nconst props = withDefaults(\n defineProps<{\n /** Numeric model — the real value sent to the API (e.g. 1234.56). */\n modelValue: number | null\n /** Fixed decimal places (default: 2). */\n decimals?: number\n /** Show a \"R$\" prefix. Ignored when `prefix` is set. */\n currency?: boolean\n /** Custom leading addon (overrides `currency`). */\n prefix?: string\n /** Trailing addon. */\n suffix?: string\n /** Display locale for grouping/decimal separators (default: 'pt-BR'). */\n locale?: string\n disabled?: boolean\n placeholder?: string\n invalid?: boolean\n }>(),\n {\n decimals: 2,\n currency: false,\n locale: 'pt-BR',\n disabled: false,\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: number | null]\n}>()\n\nconst resolvedPrefix = computed(() => props.prefix ?? (props.currency ? 'R$' : undefined))\n\nconst hasAddon = computed(() => !!resolvedPrefix.value || !!props.suffix)\n\nconst display = computed(() => {\n const v = props.modelValue\n if (v === null || v === undefined || Number.isNaN(v)) return ''\n return new Intl.NumberFormat(props.locale, {\n minimumFractionDigits: props.decimals,\n maximumFractionDigits: props.decimals,\n }).format(v)\n})\n\nfunction onInput(event: Event) {\n const digits = (event.target as HTMLInputElement).value.replace(/\\D/g, '')\n if (!digits) {\n emit('update:modelValue', null)\n return\n }\n // Digits fill from the right: \"1000\" with decimals=2 -> 10.00\n const num = Number(digits) / Math.pow(10, props.decimals)\n emit('update:modelValue', num)\n}\n</script>\n\n<template>\n <InputGroup v-if=\"hasAddon\" class=\"w-money-input\">\n <InputGroupAddon v-if=\"resolvedPrefix\">{{ resolvedPrefix }}</InputGroupAddon>\n <InputText\n :model-value=\"display\"\n inputmode=\"numeric\"\n class=\"w-money-input__field\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :invalid=\"invalid\"\n @input=\"onInput\"\n />\n <InputGroupAddon v-if=\"suffix\">{{ suffix }}</InputGroupAddon>\n </InputGroup>\n <InputText\n v-else\n :model-value=\"display\"\n inputmode=\"numeric\"\n fluid\n class=\"w-money-input__field\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :invalid=\"invalid\"\n @input=\"onInput\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { ref, reactive, computed, watch, onBeforeUnmount } from 'vue'\nimport Dialog from 'primevue/dialog'\nimport Button from 'primevue/button'\nimport Slider from 'primevue/slider'\n\n/**\n * Upload de imagem com preview e crop (pan + zoom) integrado.\n * Sem dependência externa — o recorte é feito via <canvas>.\n * Emite um `File` recortado (ou `null`), consumível direto pelo\n * `useCrudManager`, que detecta campos de imagem e envia como multipart.\n */\nconst props = withDefaults(\n defineProps<{\n modelValue?: File | string | null\n accept?: string\n /** Tamanho máximo em bytes (default 5MB). */\n maxSize?: number\n /** Proporção do recorte (1 = quadrado). Ignorado quando `circular`. */\n aspectRatio?: number\n /** Stencil circular (avatar). Força proporção 1 e saída PNG com alpha. */\n circular?: boolean\n /** Dimensões do preview em px. */\n width?: number\n height?: number\n }>(),\n {\n modelValue: null,\n accept: 'image/*',\n maxSize: 5_242_880,\n aspectRatio: 1,\n circular: false,\n width: 200,\n height: 200,\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: File | null]\n error: [message: string]\n}>()\n\n// ---------------------------------------------------------------------------\n// Preview\n// ---------------------------------------------------------------------------\nconst objectUrl = ref<string | null>(null)\nwatch(\n () => props.modelValue,\n (v) => {\n if (objectUrl.value) {\n URL.revokeObjectURL(objectUrl.value)\n objectUrl.value = null\n }\n if (v instanceof File) objectUrl.value = URL.createObjectURL(v)\n },\n { immediate: true },\n)\nonBeforeUnmount(() => {\n if (objectUrl.value) URL.revokeObjectURL(objectUrl.value)\n})\n\nconst previewSrc = computed<string | null>(() => {\n if (props.modelValue instanceof File) return objectUrl.value\n if (typeof props.modelValue === 'string' && props.modelValue) return props.modelValue\n return null\n})\n\n// ---------------------------------------------------------------------------\n// File picking + validation\n// ---------------------------------------------------------------------------\nconst fileInput = ref<HTMLInputElement | null>(null)\nfunction openPicker() {\n fileInput.value?.click()\n}\n\nfunction acceptsFile(file: File): boolean {\n const acc = (props.accept || '').trim()\n if (!acc || acc === '*' || acc.includes('image/*')) return file.type.startsWith('image/')\n return acc\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n .some((t) => {\n if (t.endsWith('/*')) return file.type.startsWith(t.slice(0, -1))\n if (t.startsWith('.')) return file.name.toLowerCase().endsWith(t.toLowerCase())\n return file.type === t\n })\n}\n\nlet originalName = 'image.png'\nlet originalType = 'image/png'\nlet cropImage: HTMLImageElement | null = null\n\nfunction onFileChange(e: Event) {\n const input = e.target as HTMLInputElement\n const file = input.files?.[0]\n input.value = '' // permite re-selecionar o mesmo arquivo\n if (!file) return\n if (!acceptsFile(file)) {\n emit('error', 'Tipo de arquivo não suportado.')\n return\n }\n if (file.size > props.maxSize) {\n emit('error', `Imagem acima do limite de ${(props.maxSize / 1_048_576).toFixed(1)}MB.`)\n return\n }\n originalName = file.name\n originalType = file.type || 'image/png'\n const reader = new FileReader()\n reader.onload = () => {\n const img = new Image()\n img.onload = () => {\n cropImage = img\n naturalW.value = img.naturalWidth\n naturalH.value = img.naturalHeight\n zoom.value = 1\n imgSrc.value = img.src\n offset.x = (vpW.value - dispW.value) / 2\n offset.y = (vpH.value - dispH.value) / 2\n cropOpen.value = true\n }\n img.onerror = () => emit('error', 'Não foi possível carregar a imagem.')\n img.src = String(reader.result)\n }\n reader.onerror = () => emit('error', 'Falha ao ler o arquivo.')\n reader.readAsDataURL(file)\n}\n\nfunction remove() {\n emit('update:modelValue', null)\n}\n\n// ---------------------------------------------------------------------------\n// Crop stage (pan + zoom)\n// ---------------------------------------------------------------------------\nconst VP = 300 // maior lado do viewport de recorte, em px de tela\nconst cropOpen = ref(false)\nconst imgSrc = ref('')\nconst naturalW = ref(0)\nconst naturalH = ref(0)\nconst zoom = ref(1)\nconst offset = reactive({ x: 0, y: 0 })\n\nconst effAspect = computed(() => (props.circular ? 1 : props.aspectRatio || 1))\nconst vpW = computed(() => (effAspect.value >= 1 ? VP : Math.round(VP * effAspect.value)))\nconst vpH = computed(() => (effAspect.value >= 1 ? Math.round(VP / effAspect.value) : VP))\nconst baseScale = computed(() =>\n naturalW.value && naturalH.value\n ? Math.max(vpW.value / naturalW.value, vpH.value / naturalH.value)\n : 1,\n)\nconst dispScale = computed(() => baseScale.value * zoom.value)\nconst dispW = computed(() => naturalW.value * dispScale.value)\nconst dispH = computed(() => naturalH.value * dispScale.value)\n\nfunction clampOffset() {\n offset.x = Math.min(0, Math.max(vpW.value - dispW.value, offset.x))\n offset.y = Math.min(0, Math.max(vpH.value - dispH.value, offset.y))\n}\nwatch(zoom, clampOffset)\n\nconst imgStyle = computed(() => ({\n width: `${dispW.value}px`,\n height: `${dispH.value}px`,\n transform: `translate(${offset.x}px, ${offset.y}px)`,\n}))\n\n// drag to pan\nconst dragging = ref(false)\nlet dragStart = { x: 0, y: 0, ox: 0, oy: 0 }\nfunction onPointerDown(e: PointerEvent) {\n dragging.value = true\n ;(e.currentTarget as HTMLElement).setPointerCapture?.(e.pointerId)\n dragStart = { x: e.clientX, y: e.clientY, ox: offset.x, oy: offset.y }\n}\nfunction onPointerMove(e: PointerEvent) {\n if (!dragging.value) return\n offset.x = dragStart.ox + (e.clientX - dragStart.x)\n offset.y = dragStart.oy + (e.clientY - dragStart.y)\n clampOffset()\n}\nfunction onPointerUp() {\n dragging.value = false\n}\n\nfunction outputType(): string {\n if (props.circular) return 'image/png'\n return originalType === 'image/jpeg' ||\n originalType === 'image/png' ||\n originalType === 'image/webp'\n ? originalType\n : 'image/png'\n}\nfunction outputName(type: string): string {\n const ext = type === 'image/png' ? 'png' : type === 'image/webp' ? 'webp' : 'jpg'\n return `${originalName.replace(/\\.[^.]+$/, '') || 'image'}.${ext}`\n}\n\nfunction confirmCrop() {\n if (!cropImage) return\n const scale = dispScale.value\n const sx = -offset.x / scale\n const sy = -offset.y / scale\n const sw = vpW.value / scale\n const sh = vpH.value / scale\n const canvas = document.createElement('canvas')\n canvas.width = Math.max(1, Math.round(sw))\n canvas.height = Math.max(1, Math.round(sh))\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n emit('error', 'Canvas indisponível neste ambiente.')\n return\n }\n if (props.circular) {\n ctx.beginPath()\n ctx.ellipse(\n canvas.width / 2,\n canvas.height / 2,\n canvas.width / 2,\n canvas.height / 2,\n 0,\n 0,\n Math.PI * 2,\n )\n ctx.clip()\n }\n ctx.drawImage(cropImage, sx, sy, sw, sh, 0, 0, canvas.width, canvas.height)\n const type = outputType()\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n emit('error', 'Falha ao processar a imagem.')\n return\n }\n emit('update:modelValue', new File([blob], outputName(type), { type }))\n cropOpen.value = false\n },\n type,\n 0.92,\n )\n}\n</script>\n\n<template>\n <div class=\"w-imgcropper\">\n <div\n class=\"w-imgcropper-preview\"\n :class=\"{ 'is-circular': circular, 'is-empty': !previewSrc }\"\n :style=\"{ width: `${width}px`, height: `${height}px` }\"\n >\n <template v-if=\"previewSrc\">\n <img :src=\"previewSrc\" alt=\"\" class=\"w-imgcropper-img\" />\n <div class=\"w-imgcropper-actions\">\n <Button\n type=\"button\"\n icon=\"pi pi-pencil\"\n rounded\n text\n aria-label=\"Trocar imagem\"\n @click=\"openPicker\"\n />\n <Button\n type=\"button\"\n icon=\"pi pi-trash\"\n rounded\n text\n severity=\"danger\"\n aria-label=\"Remover imagem\"\n @click=\"remove\"\n />\n </div>\n </template>\n <slot v-else name=\"placeholder\" :open=\"openPicker\">\n <button type=\"button\" class=\"w-imgcropper-empty\" @click=\"openPicker\">\n <i class=\"pi pi-image\" />\n <span>Selecionar imagem</span>\n </button>\n </slot>\n </div>\n\n <input\n ref=\"fileInput\"\n type=\"file\"\n :accept=\"accept\"\n class=\"w-imgcropper-file\"\n @change=\"onFileChange\"\n />\n\n <Dialog\n v-model:visible=\"cropOpen\"\n modal\n header=\"Ajustar imagem\"\n :dismissable-mask=\"false\"\n :style=\"{ width: 'auto' }\"\n >\n <div class=\"w-imgcropper-stage\">\n <div\n class=\"w-imgcropper-viewport\"\n :class=\"{ 'is-circular': circular }\"\n :style=\"{ width: `${vpW}px`, height: `${vpH}px` }\"\n @pointerdown=\"onPointerDown\"\n @pointermove=\"onPointerMove\"\n @pointerup=\"onPointerUp\"\n @pointerleave=\"onPointerUp\"\n >\n <img\n v-if=\"imgSrc\"\n :src=\"imgSrc\"\n alt=\"\"\n class=\"w-imgcropper-cropimg\"\n :style=\"imgStyle\"\n draggable=\"false\"\n />\n <div class=\"w-imgcropper-stencil\" :class=\"{ 'is-circular': circular }\"></div>\n </div>\n <div class=\"w-imgcropper-zoom\">\n <i class=\"pi pi-search-minus\" />\n <Slider v-model=\"zoom\" :min=\"1\" :max=\"4\" :step=\"0.01\" class=\"w-imgcropper-slider\" />\n <i class=\"pi pi-search-plus\" />\n </div>\n </div>\n <template #footer>\n <Button type=\"button\" label=\"Cancelar\" text @click=\"cropOpen = false\" />\n <Button type=\"button\" label=\"Confirmar\" @click=\"confirmCrop\" />\n </template>\n </Dialog>\n </div>\n</template>\n\n<style scoped>\n.w-imgcropper-preview {\n position: relative;\n overflow: hidden;\n border-radius: 8px;\n border: 1px solid var(--p-content-border-color, #e2e8f0);\n background: var(--p-content-background, #f8fafc);\n}\n.w-imgcropper-preview.is-circular {\n border-radius: 50%;\n}\n.w-imgcropper-img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n.w-imgcropper-actions {\n position: absolute;\n inset: auto 0 0 0;\n display: flex;\n justify-content: center;\n gap: 4px;\n padding: 4px;\n background: color-mix(in srgb, #000 45%, transparent);\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n.w-imgcropper-preview:hover .w-imgcropper-actions,\n.w-imgcropper-preview:focus-within .w-imgcropper-actions {\n opacity: 1;\n}\n.w-imgcropper-empty {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 6px;\n cursor: pointer;\n border: none;\n background: transparent;\n color: var(--p-text-muted-color, #64748b);\n font-size: 0.85rem;\n}\n.w-imgcropper-empty i {\n font-size: 1.5rem;\n}\n.w-imgcropper-file {\n display: none;\n}\n.w-imgcropper-stage {\n display: flex;\n flex-direction: column;\n gap: 16px;\n align-items: center;\n}\n.w-imgcropper-viewport {\n position: relative;\n overflow: hidden;\n touch-action: none;\n cursor: grab;\n background: #1e1e1e;\n border-radius: 4px;\n}\n.w-imgcropper-viewport:active {\n cursor: grabbing;\n}\n.w-imgcropper-viewport.is-circular {\n border-radius: 50%;\n}\n.w-imgcropper-cropimg {\n position: absolute;\n top: 0;\n left: 0;\n max-width: none;\n user-select: none;\n -webkit-user-drag: none;\n}\n.w-imgcropper-stencil {\n position: absolute;\n inset: 0;\n pointer-events: none;\n box-shadow: 0 0 0 1px color-mix(in srgb, #fff 60%, transparent) inset;\n}\n.w-imgcropper-stencil.is-circular {\n border-radius: 50%;\n}\n.w-imgcropper-zoom {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n color: var(--p-text-muted-color, #64748b);\n}\n.w-imgcropper-slider {\n flex: 1;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport InputText from 'primevue/inputtext'\nimport IconField from 'primevue/iconfield'\nimport InputIcon from 'primevue/inputicon'\nimport Button from 'primevue/button'\n\ntype Id = string | number\ntype Item = Record<string, unknown>\n\nconst props = withDefaults(\n defineProps<{\n /** Full pool of available records. */\n source: Item[]\n /** Currently selected ids (v-model:selected). */\n selected: Id[]\n /** Field used as the record id (default: 'id'). */\n trackBy?: string\n /** Field used for the visible label (default: 'nome'). */\n optionLabel?: string\n /** Fields to match when searching (default: [optionLabel]). */\n searchFields?: string[]\n disabled?: boolean\n }>(),\n {\n trackBy: 'id',\n optionLabel: 'nome',\n selected: () => [],\n },\n)\n\nconst emit = defineEmits<{\n 'update:selected': [ids: Id[]]\n}>()\n\nconst leftSearch = ref('')\nconst rightSearch = ref('')\n\nconst selectedSet = computed(() => new Set(props.selected))\nconst fields = computed(() => props.searchFields ?? [props.optionLabel])\n\nfunction idOf(item: Item): Id {\n return item[props.trackBy] as Id\n}\n\nfunction labelOf(item: Item): string {\n return String(item[props.optionLabel] ?? '')\n}\n\nfunction matches(item: Item, term: string): boolean {\n if (!term) return true\n const q = term.toLowerCase()\n return fields.value.some((f) =>\n String(item[f] ?? '')\n .toLowerCase()\n .includes(q),\n )\n}\n\nconst available = computed(() =>\n props.source.filter((i) => !selectedSet.value.has(idOf(i)) && matches(i, leftSearch.value)),\n)\n\nconst chosen = computed(() =>\n props.source.filter((i) => selectedSet.value.has(idOf(i)) && matches(i, rightSearch.value)),\n)\n\nfunction add(item: Item) {\n if (props.disabled) return\n emit('update:selected', [...props.selected, idOf(item)])\n}\n\nfunction remove(item: Item) {\n if (props.disabled) return\n const id = idOf(item)\n emit(\n 'update:selected',\n props.selected.filter((s) => s !== id),\n )\n}\n\nfunction addAll() {\n if (props.disabled) return\n emit('update:selected', props.source.map(idOf))\n}\n\nfunction removeAll() {\n if (props.disabled) return\n emit('update:selected', [])\n}\n</script>\n\n<template>\n <div class=\"w-transfer\" :class=\"{ 'w-transfer--disabled': disabled }\">\n <!-- Available -->\n <div class=\"w-transfer__pane\">\n <div class=\"w-transfer__head\">\n <span class=\"w-transfer__title\">Disponíveis</span>\n <span class=\"w-transfer__count\">{{ available.length }}</span>\n </div>\n <IconField class=\"w-transfer__search\">\n <InputIcon class=\"pi pi-search\" />\n <InputText v-model=\"leftSearch\" placeholder=\"Buscar...\" fluid />\n </IconField>\n <ul class=\"w-transfer__list\">\n <li\n v-for=\"item in available\"\n :key=\"`a-${idOf(item)}`\"\n class=\"w-transfer__item\"\n @click=\"add(item)\"\n >\n <span>{{ labelOf(item) }}</span>\n <i class=\"pi pi-angle-right\" />\n </li>\n <li v-if=\"!available.length\" class=\"w-transfer__empty\">Nenhum item</li>\n </ul>\n </div>\n\n <!-- Controls -->\n <div class=\"w-transfer__controls\">\n <Button\n type=\"button\"\n icon=\"pi pi-angle-double-right\"\n text\n rounded\n :disabled=\"disabled || !available.length\"\n @click=\"addAll\"\n />\n <Button\n type=\"button\"\n icon=\"pi pi-angle-double-left\"\n text\n rounded\n :disabled=\"disabled || !selected.length\"\n @click=\"removeAll\"\n />\n </div>\n\n <!-- Selected -->\n <div class=\"w-transfer__pane\">\n <div class=\"w-transfer__head\">\n <span class=\"w-transfer__title\">Selecionados</span>\n <span class=\"w-transfer__count\">{{ chosen.length }}</span>\n </div>\n <IconField class=\"w-transfer__search\">\n <InputIcon class=\"pi pi-search\" />\n <InputText v-model=\"rightSearch\" placeholder=\"Buscar...\" fluid />\n </IconField>\n <ul class=\"w-transfer__list\">\n <li\n v-for=\"item in chosen\"\n :key=\"`s-${idOf(item)}`\"\n class=\"w-transfer__item\"\n @click=\"remove(item)\"\n >\n <i class=\"pi pi-angle-left\" />\n <span>{{ labelOf(item) }}</span>\n </li>\n <li v-if=\"!chosen.length\" class=\"w-transfer__empty\">Nenhum item</li>\n </ul>\n </div>\n </div>\n</template>\n","export interface ViaCepResponse {\n cep: string\n logradouro: string\n complemento: string\n bairro: string\n localidade: string\n uf: string\n ibge: string\n gia: string\n ddd: string\n siafi: string\n erro?: true\n}\n\nexport async function lookupCep(cep: string): Promise<ViaCepResponse | null> {\n const digits = cep.replace(/\\D/g, '')\n if (digits.length !== 8) return null\n try {\n const response = await fetch(`https://viacep.com.br/ws/${digits}/json/`)\n if (!response.ok) return null\n const data = (await response.json()) as ViaCepResponse\n if (data.erro) return null\n return data\n } catch {\n return null\n }\n}\n","<script setup lang=\"ts\">\nimport { computed, reactive, isRef, watch } from 'vue'\nimport { vMaska } from 'maska/vue'\nimport InputText from 'primevue/inputtext'\nimport InputNumber from 'primevue/inputnumber'\nimport Textarea from 'primevue/textarea'\nimport Select from 'primevue/select'\nimport AutoComplete from 'primevue/autocomplete'\nimport ToggleSwitch from 'primevue/toggleswitch'\nimport ColorPicker from 'primevue/colorpicker'\nimport Password from 'primevue/password'\nimport type { FieldDef, FieldSubRowsFetch } from '@/types/field'\nimport WAutoCompleteFK from '@/components/form/WAutoCompleteFK.vue'\nimport WDatePicker from '@/components/form/WDatePicker.vue'\nimport WMoneyInput from '@/components/form/WMoneyInput.vue'\nimport WImageCropper from '@/components/form/WImageCropper.vue'\nimport WTransferList from '@/components/form/WTransferList.vue'\nimport { lookupCep } from '@/utils/cep'\n\nconst props = withDefaults(\n defineProps<{\n fields: FieldDef[]\n formData: Record<string, unknown>\n isEditing: boolean\n disabled?: boolean\n /** Nº de colunas do grid (default 2). Campos ocupam frações via `colSpan`;\n * grupos podem sobrepor via `fieldGroup.columns`. */\n columns?: number\n }>(),\n {\n disabled: false,\n columns: 2,\n },\n)\n\nconst emit = defineEmits<{\n 'update:field': [field: string, value: unknown]\n}>()\n\nconst fieldErrors = reactive<Record<string, string | null>>({})\n\n// --- CEP state ---\nconst cepLoading = reactive<Record<string, boolean>>({})\nconst cepError = reactive<Record<string, string | null>>({})\nconst cepTimers = reactive<Record<string, ReturnType<typeof setTimeout> | null>>({})\n\nfunction onCepInput(field: FieldDef, event: Event) {\n const raw = (event.target as HTMLInputElement).value\n const digits = raw.replace(/\\D/g, '')\n emit('update:field', field.field, raw)\n\n // Clear previous error\n cepError[field.field] = null\n\n // Clear pending timer\n if (cepTimers[field.field]) {\n clearTimeout(cepTimers[field.field]!)\n cepTimers[field.field] = null\n }\n\n if (digits.length === 8) {\n cepTimers[field.field] = setTimeout(async () => {\n cepLoading[field.field] = true\n cepError[field.field] = null\n try {\n const result = await lookupCep(digits)\n if (!result) {\n cepError[field.field] = 'CEP não encontrado. Preencha os campos manualmente.'\n } else {\n // Fill mapped fields, but only when currently empty\n const mapping = field.cepFields || {}\n const keys = Object.keys(mapping) as Array<keyof typeof mapping>\n for (const key of keys) {\n const targetField = mapping[key]\n if (!targetField) continue\n const existing = props.formData[targetField]\n if (existing == null || existing === '') {\n emit('update:field', targetField, result[key] ?? '')\n }\n }\n }\n } finally {\n cepLoading[field.field] = false\n }\n }, 400)\n }\n}\n\n// --- Visibility & Disabled ---\n\nconst visibleFields = computed(() =>\n props.fields.filter((f) => {\n if (f.visible === undefined || f.visible === true) return true\n if (typeof f.visible === 'function') return f.visible(props.formData, props.isEditing)\n return f.visible\n }),\n)\n\nfunction isFieldDisabled(field: FieldDef): boolean {\n if (props.disabled) return true\n // Somente-leitura / calculado → sempre desabilitado (o valor ainda vai no payload).\n if (field.readonly || field.computed) return true\n if (field.disabledOnEdit && props.isEditing) return true\n if (typeof field.disabled === 'function') return field.disabled(props.formData, props.isEditing)\n return !!field.disabled\n}\n\n/** Indireção tipada do `subRows`: devolver a função direto no template fazia o\n * vue-tsc entrar no ciclo WFormRenderer → WAutoCompleteFK → WCrudFormDialog e\n * degradar tudo para `any`. */\nfunction subRowsFetchDe(field: FieldDef): FieldSubRowsFetch | undefined {\n return field.subRows\n}\n\n/** Resolve `endpointParams` estático ou por função (contexto do pai). */\nfunction resolveEndpointParams(field: FieldDef) {\n const ep = field.endpointParams\n return typeof ep === 'function' ? ep() : ep\n}\n\n// --- Campos calculados ---\n// Derivam o valor dos demais campos e o escrevem de volta no formData (para irem no\n// payload). O SOURCE do watch chama `calculate` — assim as dependências reativas exatas\n// (ex.: `formData.produto.unidade_medida`) são coletadas e o watch dispara quando elas\n// mudam. (Um `watch(() => formData, …, { deep })` não reage de forma confiável ao\n// `formData` que chega por prop no fluxo do WCrudFormDialog.) Só emite quando o valor\n// muda de fato (o `!==` evita laço). A função `calculate` deve cair no valor atual quando\n// não puder derivar (ex.: na edição, com a FK já como id).\nconst calculatedFields = computed(() =>\n props.fields.filter((f) => typeof f.calculate === 'function'),\n)\n\nwatch(\n () => calculatedFields.value.map((f) => f.calculate!(props.formData, props.isEditing)),\n (nexts) => {\n calculatedFields.value.forEach((f, i) => {\n if (props.formData[f.field] !== nexts[i]) emit('update:field', f.field, nexts[i])\n })\n },\n { immediate: true },\n)\n\nfunction unwrapRef<V>(val: V): V extends import('vue').Ref<infer U> ? U : V {\n return isRef(val) ? ((val as { value: unknown }).value as never) : (val as never)\n}\n\n// --- Autofocus ---\n\nconst autofocusField = computed(() => {\n const mode = props.isEditing ? 'edit' : 'create'\n const explicit = props.fields.find((f) => f.autofocus === true || f.autofocus === mode)\n if (explicit) return explicit.field\n const first = visibleFields.value.find((f) => {\n // Tipos sem campo de digitação não são candidatos a foco inicial.\n const semInput = ['switch', 'fk', 'select', 'image', 'segmented', 'choice', 'chips', 'transfer']\n if (f.type && semInput.includes(f.type)) return false\n if (f.disabled === true) return false\n if (f.disabledOnEdit && props.isEditing) return false\n return true\n })\n return first?.field ?? null\n})\n\nfunction shouldAutofocus(field: FieldDef): boolean {\n return field.field === autofocusField.value\n}\n\n// --- Mask format conversion (PrimeVue InputMask -> maska) ---\n\nfunction convertMask(mask?: string): string | undefined {\n if (!mask) return undefined\n return mask.replace(/9/g, '#').replace(/a/g, 'S').replace(/\\*/g, 'X')\n}\n\n// --- CPF/CNPJ inline mask ---\n\nfunction displayCpfCnpj(value: unknown): string {\n if (!value) return ''\n const digits = String(value).replace(/\\D/g, '').slice(0, 14)\n if (digits.length <= 11) {\n return digits\n .replace(/(\\d{3})(\\d)/, '$1.$2')\n .replace(/(\\d{3})(\\d)/, '$1.$2')\n .replace(/(\\d{3})(\\d{1,2})$/, '$1-$2')\n }\n return digits\n .replace(/(\\d{2})(\\d)/, '$1.$2')\n .replace(/(\\d{3})(\\d)/, '$1.$2')\n .replace(/(\\d{3})(\\d)/, '$1/$2')\n .replace(/(\\d{4})(\\d{1,2})$/, '$1-$2')\n}\n\nfunction onCpfCnpjInput(fieldName: string, event: Event) {\n const raw = (event.target as HTMLInputElement).value.replace(/\\D/g, '').slice(0, 14)\n emit('update:field', fieldName, raw)\n}\n\n// --- AutoComplete local (para type=autocomplete com options) ---\n\nconst autocompleteSuggestions = reactive<Record<string, unknown[]>>({})\n\nfunction getAutocompleteValue(field: FieldDef) {\n const val = props.formData[field.field]\n if (val == null) return null\n const optionValue = field.optionValue || 'value'\n const options = unwrapRef(field.options) || []\n return (options as Record<string, unknown>[]).find((o) => o[optionValue] === val) ?? null\n}\n\nfunction getFilteredSuggestions(field: FieldDef) {\n return autocompleteSuggestions[field.field] || []\n}\n\nfunction onAutocompleteSearch(field: FieldDef, event: { query: string }) {\n const query = (event.query || '').toLowerCase()\n const options = unwrapRef(field.options) || []\n const optionLabel = field.optionLabel || 'label'\n autocompleteSuggestions[field.field] = (options as Record<string, unknown>[]).filter((o) =>\n String(o[optionLabel] || '')\n .toLowerCase()\n .includes(query),\n )\n}\n\nfunction onAutocompleteSelect(field: FieldDef, event: { value: Record<string, unknown> }) {\n const optionValue = field.optionValue || 'value'\n emit('update:field', field.field, event.value[optionValue])\n}\n\n// --- Options (segmented / choice / chips) ---\n// Os três tipos leem a MESMA tripla `options`/`optionLabel`/`optionValue` do\n// select — quem troca um Select por pílulas não reescreve o FieldDef.\n\nfunction fieldOptions(field: FieldDef): Record<string, unknown>[] {\n return (unwrapRef(field.options) || []) as Record<string, unknown>[]\n}\n\nfunction optionLabelOf(field: FieldDef, option: Record<string, unknown>): string {\n return String(option[field.optionLabel || 'label'] ?? '')\n}\n\nfunction optionValueOf(field: FieldDef, option: Record<string, unknown>): unknown {\n return option[field.optionValue || 'value']\n}\n\nfunction isOptionSelected(field: FieldDef, option: Record<string, unknown>): boolean {\n return props.formData[field.field] === optionValueOf(field, option)\n}\n\n/** Escolha única: clicar na opção ativa mantém a escolha (não desmarca). */\nfunction pickOption(field: FieldDef, option: Record<string, unknown>) {\n if (isFieldDisabled(field)) return\n emit('update:field', field.field, optionValueOf(field, option))\n}\n\n// --- Chips (valor múltiplo, removível) ---\n// O valor é um ARRAY. Cada item pode ser o objeto inteiro (usa `optionLabel`) ou\n// só o id (procura o rótulo em `options`; sem match, mostra o próprio valor).\n\ninterface ChipEntry {\n key: string\n label: string\n}\n\nfunction chipEntries(field: FieldDef): ChipEntry[] {\n const raw = props.formData[field.field]\n if (!Array.isArray(raw)) return []\n const labelKey = field.optionLabel || 'nome'\n const valueKey = field.optionValue || 'id'\n const options = fieldOptions(field)\n\n return raw.map((item, index) => {\n if (item !== null && typeof item === 'object') {\n const obj = item as Record<string, unknown>\n return { key: String(obj[valueKey] ?? index), label: String(obj[labelKey] ?? '') }\n }\n const match = options.find((o) => o[valueKey] === item)\n return {\n key: String(item ?? index),\n label: match ? String(match[labelKey] ?? item) : String(item),\n }\n })\n}\n\nfunction removeChip(field: FieldDef, index: number) {\n if (isFieldDisabled(field)) return\n const raw = props.formData[field.field]\n if (!Array.isArray(raw)) return\n emit(\n 'update:field',\n field.field,\n raw.filter((_, i) => i !== index),\n )\n}\n\n// --- Color ---\n\nfunction getColorPickerValue(field: FieldDef): string {\n const val = props.formData[field.field]\n return val ? String(val).replace('#', '') : 'FFFFFF'\n}\n\nfunction onColorChange(field: FieldDef, value: string) {\n emit('update:field', field.field, `#${value}`)\n}\n\n// --- Drill-down (filtro em cascata das FKs) ---\n\n/** Resolve o `dependsOn` do campo em filtros já com o valor atual do formulário. */\nfunction resolveDrilldown(field: FieldDef) {\n const dep = field.dependsOn\n if (!dep) return undefined\n const list = Array.isArray(dep) ? dep : [dep]\n return list.map((d) => ({\n field: d.param || d.field,\n value: props.formData[d.field],\n required: d.required,\n }))\n}\n\n// --- Validation ---\n\nfunction validateField(field: FieldDef) {\n if (typeof field.validate === 'function') {\n const error = field.validate(props.formData[field.field])\n fieldErrors[field.field] = error || null\n }\n}\n\nfunction validateAll(): string[] {\n const errors: string[] = []\n for (const field of props.fields) {\n if (typeof field.validate === 'function') {\n const error = field.validate(props.formData[field.field])\n fieldErrors[field.field] = error || null\n if (error) errors.push(error)\n }\n }\n return errors\n}\n\nfunction clearErrors() {\n Object.keys(fieldErrors).forEach((k) => delete fieldErrors[k])\n}\n\n// --- Field Groups ---\n\ninterface FieldGroup {\n id: string\n title?: string\n description?: string\n columns?: number\n fields: FieldDef[]\n}\n\n// --- Grid columns / span ---\n\nfunction groupColumns(group: FieldGroup): number {\n return Math.max(1, Math.floor(group.columns ?? props.columns))\n}\n\n/** Resolve o colSpan do campo em nº de colunas do grid do grupo.\n * - omitido ou 'full' → linha inteira\n * - 0.5 → metade da linha (independe do nº de colunas)\n * - inteiro ≥ 1 → N colunas (limitado ao total) */\nfunction fieldSpan(field: FieldDef, cols: number): number {\n const span = field.colSpan\n if (span == null || span === 'full') return cols\n if (span === 0.5) return Math.max(1, Math.round(cols / 2))\n return Math.min(Math.max(1, Math.floor(span)), cols)\n}\n\nfunction fieldSpanStyle(field: FieldDef, group: FieldGroup) {\n return { '--w-col-span': fieldSpan(field, groupColumns(group)) }\n}\n\nfunction fieldSpanClass(field: FieldDef, group: FieldGroup): string {\n return fieldSpan(field, groupColumns(group)) === groupColumns(group)\n ? 'w-crud-form-col-full'\n : 'w-crud-form-col-half'\n}\n\nconst groupedFields = computed((): FieldGroup[] => {\n const groupMap = new Map<string, FieldGroup>()\n const groupOrder: string[] = []\n const groupExplicitOrder = new Map<string, number>()\n\n for (const field of visibleFields.value) {\n const groupId = field.fieldGroup?.id ?? '__default__'\n\n if (!groupMap.has(groupId)) {\n groupMap.set(groupId, {\n id: groupId,\n title: field.fieldGroup?.title,\n description: field.fieldGroup?.description,\n columns: field.fieldGroup?.columns,\n fields: [],\n })\n groupOrder.push(groupId)\n if (field.fieldGroup?.order != null) {\n groupExplicitOrder.set(groupId, field.fieldGroup.order)\n }\n }\n\n groupMap.get(groupId)!.fields.push(field)\n }\n\n return groupOrder\n .slice()\n .sort((a, b) => {\n const orderA = groupExplicitOrder.get(a)\n const orderB = groupExplicitOrder.get(b)\n if (orderA != null && orderB != null) return orderA - orderB\n if (orderA != null) return -1\n if (orderB != null) return 1\n return groupOrder.indexOf(a) - groupOrder.indexOf(b)\n })\n .map((id) => groupMap.get(id)!)\n})\n\ndefineExpose({ validateAll, clearErrors })\n</script>\n\n<template>\n <div class=\"w-crud-form\">\n <div v-for=\"group in groupedFields\" :key=\"group.id\" class=\"w-crud-form-group\">\n <div v-if=\"group.title\" class=\"w-crud-form-group-header\">\n <h3 class=\"w-crud-form-group-title\">{{ group.title }}</h3>\n <p v-if=\"group.description\" class=\"w-crud-form-group-desc\">{{ group.description }}</p>\n </div>\n <div class=\"w-crud-form-fields\" :style=\"{ '--w-form-cols': groupColumns(group) }\">\n <template v-for=\"field in group.fields\" :key=\"field.field\">\n <slot\n :name=\"`field-${field.field}`\"\n :field=\"field\"\n :form-data=\"formData\"\n :is-editing=\"isEditing\"\n :set-form-field=\"(f: string, v: unknown) => emit('update:field', f, v)\"\n >\n <!-- Switch -->\n <div\n v-if=\"field.type === 'switch'\"\n class=\"w-crud-form-switch\"\n :style=\"fieldSpanStyle(field, group)\"\n >\n <ToggleSwitch\n :model-value=\"formData[field.field] as boolean\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n <label class=\"w-crud-form-switch-label\">{{ field.switchLabel || field.label }}</label>\n </div>\n\n <!-- Color -->\n <div\n v-else-if=\"field.type === 'color'\"\n :class=\"fieldSpanClass(field, group)\"\n :style=\"fieldSpanStyle(field, group)\"\n >\n <label class=\"w-crud-form-label\">\n {{ field.label }}\n <span v-if=\"field.required\" class=\"w-crud-form-required\">*</span>\n </label>\n <div class=\"w-crud-form-color-row\">\n <ColorPicker\n :model-value=\"getColorPickerValue(field)\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"onColorChange(field, $event as string)\"\n />\n <InputText\n :model-value=\"formData[field.field] as string\"\n class=\"w-28\"\n maxlength=\"7\"\n placeholder=\"#000000\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n </div>\n </div>\n\n <!-- Image -->\n <div\n v-else-if=\"field.type === 'image'\"\n :class=\"fieldSpanClass(field, group)\"\n :style=\"fieldSpanStyle(field, group)\"\n >\n <label class=\"w-crud-form-label\">\n {{ field.label }}\n </label>\n <slot :name=\"`image-${field.field}`\" :field=\"field\" :form-data=\"formData\">\n <WImageCropper\n :model-value=\"formData[field.field] as File | string | null\"\n :accept=\"field.accept || 'image/*'\"\n @update:model-value=\"(file) => emit('update:field', field.field, file)\"\n @error=\"\n (msg) => {\n fieldErrors[field.field] = msg\n }\n \"\n />\n </slot>\n <small v-if=\"fieldErrors[field.field]\" class=\"w-crud-form-error\">\n {{ fieldErrors[field.field] }}\n </small>\n </div>\n\n <!-- Transfer (dual list) -->\n <div\n v-else-if=\"field.type === 'transfer'\"\n :class=\"fieldSpanClass(field, group)\"\n :style=\"fieldSpanStyle(field, group)\"\n >\n <label class=\"w-crud-form-label\">\n {{ field.label }}\n <span v-if=\"field.required\" class=\"w-crud-form-required\">*</span>\n </label>\n <WTransferList\n :source=\"(unwrapRef(field.options) as any[]) || []\"\n :selected=\"(formData[field.field] as any[]) || []\"\n :track-by=\"field.optionValue || 'id'\"\n :option-label=\"field.optionLabel || 'nome'\"\n :search-fields=\"field.searchFields\"\n :disabled=\"isFieldDisabled(field)\"\n @update:selected=\"(val) => emit('update:field', field.field, val)\"\n />\n </div>\n\n <!-- All other types -->\n <div v-else :class=\"fieldSpanClass(field, group)\" :style=\"fieldSpanStyle(field, group)\">\n <label class=\"w-crud-form-label\">\n {{ field.label }}\n <span v-if=\"field.required\" class=\"w-crud-form-required\">*</span>\n <i\n v-if=\"cepLoading[field.field]\"\n class=\"pi pi-spin pi-spinner w-crud-form-cep-spinner\"\n />\n </label>\n\n <!-- Text with mask (maska) -->\n <InputText\n v-if=\"(!field.type || field.type === 'text') && field.mask\"\n v-maska=\"{ mask: convertMask(field.mask) }\"\n :model-value=\"formData[field.field] as string\"\n fluid\n :autofocus=\"shouldAutofocus(field) || undefined\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Text -->\n <InputText\n v-else-if=\"!field.type || field.type === 'text'\"\n :model-value=\"formData[field.field] as string\"\n fluid\n :autofocus=\"shouldAutofocus(field) || undefined\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Email -->\n <InputText\n v-else-if=\"field.type === 'email'\"\n :model-value=\"formData[field.field] as string\"\n type=\"email\"\n fluid\n :autofocus=\"shouldAutofocus(field) || undefined\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Password -->\n <Password\n v-else-if=\"field.type === 'password'\"\n :model-value=\"formData[field.field] as string\"\n fluid\n toggle-mask\n :feedback=\"field.feedback !== false\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Number -->\n <InputNumber\n v-else-if=\"field.type === 'number'\"\n :model-value=\"formData[field.field] as number\"\n fluid\n locale=\"pt-BR\"\n :min=\"field.min\"\n :max=\"field.max\"\n :min-fraction-digits=\"field.minFractionDigits\"\n :max-fraction-digits=\"field.maxFractionDigits\"\n :suffix=\"field.suffix\"\n :prefix=\"field.prefix\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Currency (fill-from-right, calculator style) -->\n <WMoneyInput\n v-else-if=\"field.type === 'currency' && field.fillFromRight\"\n :model-value=\"formData[field.field] as number | null\"\n :decimals=\"field.decimals ?? 2\"\n currency\n :prefix=\"field.prefix\"\n :suffix=\"field.suffix\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Currency -->\n <InputNumber\n v-else-if=\"field.type === 'currency'\"\n :model-value=\"formData[field.field] as number\"\n fluid\n mode=\"currency\"\n currency=\"BRL\"\n locale=\"pt-BR\"\n :min=\"field.min\"\n :max=\"field.max\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Select -->\n <Select\n v-else-if=\"field.type === 'select'\"\n :model-value=\"formData[field.field]\"\n fluid\n :options=\"unwrapRef(field.options) as any[]\"\n :option-label=\"field.optionLabel || 'label'\"\n :option-value=\"field.optionValue || 'value'\"\n :show-clear=\"field.showClear !== false\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- AutoComplete (options locais) -->\n <AutoComplete\n v-else-if=\"field.type === 'autocomplete'\"\n :model-value=\"getAutocompleteValue(field)\"\n fluid\n :suggestions=\"getFilteredSuggestions(field) as any[]\"\n :option-label=\"field.optionLabel || 'label'\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @complete=\"onAutocompleteSearch(field, $event)\"\n @item-select=\"onAutocompleteSelect(field, $event)\"\n @clear=\"emit('update:field', field.field, null)\"\n />\n\n <!-- FK (busca na API) -->\n <WAutoCompleteFK\n v-else-if=\"field.type === 'fk'\"\n :model-value=\"formData[field.field] as any\"\n :autofocus=\"shouldAutofocus(field) || undefined\"\n :endpoint=\"field.endpoint!\"\n :endpoint-params=\"resolveEndpointParams(field)\"\n :drilldown=\"resolveDrilldown(field)\"\n :blocked-placeholder=\"field.blockedPlaceholder\"\n :option-label=\"field.optionLabel || 'nome'\"\n :option-description=\"field.optionDescription\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n :show-clear=\"field.showClear !== false\"\n :dialog-header=\"field.label\"\n :crud-fields=\"field.crudFields\"\n :crud-columns=\"field.crudColumns\"\n :sub-rows=\"subRowsFetchDe(field)\"\n :dialog-width=\"field.dialogWidth\"\n :can-create=\"field.canCreate\"\n :can-edit=\"field.canEdit\"\n :can-delete=\"field.canDelete\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Date -->\n <WDatePicker\n v-else-if=\"field.type === 'date'\"\n :model-value=\"formData[field.field] as Date | string | null\"\n value-format=\"date\"\n :autonow=\"field.autonow\"\n :min-date=\"field.minDate\"\n :max-date=\"field.maxDate\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Datetime -->\n <WDatePicker\n v-else-if=\"field.type === 'datetime'\"\n :model-value=\"formData[field.field] as Date | string | null\"\n value-format=\"date\"\n show-time\n :autonow=\"field.autonow\"\n :min-date=\"field.minDate\"\n :max-date=\"field.maxDate\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- CPF/CNPJ -->\n <InputText\n v-else-if=\"field.type === 'cpf_cnpj'\"\n :model-value=\"displayCpfCnpj(formData[field.field])\"\n fluid\n maxlength=\"18\"\n :placeholder=\"field.placeholder || '000.000.000-00'\"\n :disabled=\"isFieldDisabled(field)\"\n :invalid=\"!!fieldErrors[field.field]\"\n @input=\"onCpfCnpjInput(field.field, $event)\"\n @blur=\"validateField(field)\"\n />\n\n <!-- Mask (maska) -->\n <InputText\n v-else-if=\"field.type === 'mask'\"\n v-maska=\"{ mask: convertMask(field.mask) }\"\n :model-value=\"formData[field.field] as string\"\n fluid\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n :invalid=\"!!fieldErrors[field.field]\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n @blur=\"validateField(field)\"\n />\n\n <!-- CEP -->\n <InputText\n v-else-if=\"field.type === 'cep'\"\n v-maska=\"{ mask: '#####-###' }\"\n :model-value=\"formData[field.field] as string\"\n fluid\n :placeholder=\"field.placeholder || '00000-000'\"\n :disabled=\"isFieldDisabled(field)\"\n :invalid=\"!!cepError[field.field]\"\n @input=\"onCepInput(field, $event)\"\n />\n\n <!-- Textarea -->\n <Textarea\n v-else-if=\"field.type === 'textarea'\"\n :model-value=\"formData[field.field] as string\"\n fluid\n :autofocus=\"shouldAutofocus(field) || undefined\"\n :rows=\"field.rows || 3\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Segmented (escolha única, 2-3 opções curtas, num trilho) -->\n <div v-else-if=\"field.type === 'segmented'\" class=\"w-segmented\">\n <button\n v-for=\"option in fieldOptions(field)\"\n :key=\"String(optionValueOf(field, option))\"\n type=\"button\"\n class=\"w-segmented__option\"\n :class=\"{ 'w-segmented__option--on': isOptionSelected(field, option) }\"\n :aria-pressed=\"isOptionSelected(field, option)\"\n :disabled=\"isFieldDisabled(field)\"\n @click=\"pickOption(field, option)\"\n >\n {{ optionLabelOf(field, option) }}\n </button>\n </div>\n\n <!-- Choice (escolha única em chips, N opções) -->\n <div v-else-if=\"field.type === 'choice'\" class=\"w-choice\">\n <button\n v-for=\"option in fieldOptions(field)\"\n :key=\"String(optionValueOf(field, option))\"\n type=\"button\"\n class=\"w-choice__option\"\n :class=\"{ 'w-choice__option--on': isOptionSelected(field, option) }\"\n :aria-pressed=\"isOptionSelected(field, option)\"\n :disabled=\"isFieldDisabled(field)\"\n @click=\"pickOption(field, option)\"\n >\n <i\n v-if=\"isOptionSelected(field, option) && field.choiceIcon !== ''\"\n :class=\"field.choiceIcon || 'pi pi-check-circle'\"\n />\n {{ optionLabelOf(field, option) }}\n </button>\n </div>\n\n <!-- Chips (valor múltiplo removível + gatilho + resumo) -->\n <div v-else-if=\"field.type === 'chips'\" class=\"w-chips\">\n <span\n v-for=\"(chip, chipIndex) in chipEntries(field)\"\n :key=\"chip.key\"\n class=\"w-chips__chip\"\n >\n {{ chip.label }}\n <button\n type=\"button\"\n class=\"w-chips__remove\"\n :title=\"field.chipsRemoveLabel || 'Remover'\"\n :aria-label=\"field.chipsRemoveLabel || 'Remover'\"\n :disabled=\"isFieldDisabled(field)\"\n @click=\"removeChip(field, chipIndex)\"\n >\n <i class=\"pi pi-times\" />\n </button>\n </span>\n\n <span\n v-if=\"!chipEntries(field).length && field.chipsEmptyLabel\"\n class=\"w-chips__empty\"\n >\n {{ field.chipsEmptyLabel }}\n </span>\n\n <slot\n :name=\"`chips-trigger-${field.field}`\"\n :field=\"field\"\n :form-data=\"formData\"\n :disabled=\"isFieldDisabled(field)\"\n :set-form-field=\"(f: string, v: unknown) => emit('update:field', f, v)\"\n />\n\n <span class=\"w-chips__summary\">\n <slot\n :name=\"`chips-summary-${field.field}`\"\n :field=\"field\"\n :form-data=\"formData\"\n :items=\"chipEntries(field)\"\n />\n </span>\n </div>\n\n <small v-if=\"cepError[field.field]\" class=\"w-crud-form-cep-error\">\n {{ cepError[field.field] }}\n </small>\n <small v-else-if=\"fieldErrors[field.field]\" class=\"w-crud-form-error\">\n {{ fieldErrors[field.field] }}\n </small>\n </div>\n </slot>\n </template>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport Dialog from 'primevue/dialog'\nimport Button from 'primevue/button'\nimport type { FieldDef } from '@/types/field'\nimport WFormRenderer from '@/components/form/WFormRenderer.vue'\nimport { useFormKeyboardNav } from '@/composables/useFormKeyboardNav'\n\nconst props = withDefaults(\n defineProps<{\n visible: boolean\n title: string\n fields: FieldDef[]\n formData: Record<string, unknown>\n isEditing: boolean\n saving: boolean\n disabled?: boolean\n width?: string\n /** Nº de colunas do grid do form (repassado ao WFormRenderer; default 2). */\n formColumns?: number\n /** Navegação por teclado estilo desktop: foca o 1º campo ao abrir e o Enter\n * pula para o próximo campo até o botão de salvar. Opt-in. */\n keyboardNav?: boolean\n }>(),\n {\n width: '480px',\n disabled: false,\n formColumns: undefined,\n },\n)\n\nconst emit = defineEmits<{\n 'update:visible': [value: boolean]\n 'update:field': [field: string, value: unknown]\n save: []\n}>()\n\nconst rendererRef = ref<InstanceType<typeof WFormRenderer> | null>(null)\nconst formRef = ref<HTMLFormElement | null>(null)\n\nfunction onSave() {\n if (rendererRef.value) {\n const errors = rendererRef.value.validateAll()\n if (errors.length === 0) {\n emit('save')\n }\n } else {\n emit('save')\n }\n}\n\n// Navegação por teclado (opt-in) — sem watchers: @keydown no <form> + @show no Dialog.\nconst { focusFirst, handleKeydown } = useFormKeyboardNav(formRef, {\n enabled: () => props.keyboardNav === true,\n onSubmit: onSave,\n})\n\n// Clear errors when dialog opens\nwatch(\n () => props.visible,\n (val) => {\n if (val && rendererRef.value) {\n rendererRef.value.clearErrors()\n }\n },\n)\n</script>\n\n<template>\n <Dialog\n :visible=\"visible\"\n :header=\"title\"\n :style=\"{ width }\"\n modal\n :draggable=\"false\"\n class=\"w-crud-form-dialog\"\n @update:visible=\"emit('update:visible', $event)\"\n @show=\"focusFirst\"\n >\n <form ref=\"formRef\" class=\"w-crud-form\" @submit.prevent=\"onSave\" @keydown=\"handleKeydown\">\n <WFormRenderer\n ref=\"rendererRef\"\n :fields=\"fields\"\n :form-data=\"formData\"\n :is-editing=\"isEditing\"\n :disabled=\"disabled\"\n :columns=\"formColumns\"\n @update:field=\"(f, v) => emit('update:field', f, v)\"\n >\n <!-- Forward field-* slots from parent -->\n <template\n v-for=\"field in fields\"\n :key=\"`fwd-${field.field}`\"\n #[`field-${field.field}`]=\"slotData\"\n >\n <slot :name=\"`field-${field.field}`\" v-bind=\"slotData\" />\n </template>\n <!-- Forward image-* slots from parent -->\n <template\n v-for=\"field in fields.filter((f) => f.type === 'image')\"\n :key=\"`img-${field.field}`\"\n #[`image-${field.field}`]=\"slotData\"\n >\n <slot :name=\"`image-${field.field}`\" v-bind=\"slotData\" />\n </template>\n </WFormRenderer>\n\n <!-- Footer -->\n <div class=\"w-crud-form-footer\">\n <slot name=\"footer\" :saving=\"saving\" :disabled=\"disabled\">\n <Button\n type=\"button\"\n :label=\"disabled ? 'Fechar' : 'Cancelar'\"\n severity=\"secondary\"\n text\n :disabled=\"saving\"\n data-kbd-skip\n @click=\"emit('update:visible', false)\"\n />\n <Button\n v-if=\"!disabled\"\n type=\"submit\"\n :label=\"isEditing ? 'Atualizar' : 'Salvar'\"\n icon=\"pi pi-check\"\n :loading=\"saving\"\n />\n </slot>\n </div>\n </form>\n </Dialog>\n</template>\n","import type { ColumnDef } from '@/types/column'\n\nexport interface ToCsvOptions {\n /** Field separator (default: ';' — friendly to pt-BR Excel). */\n separator?: string\n}\n\nfunction cellValue(col: ColumnDef, row: Record<string, unknown>): string {\n const raw = row[col.field]\n if (col.format) return col.format(raw, row)\n if (raw === null || raw === undefined) return ''\n if (typeof raw === 'boolean') return raw ? 'Sim' : 'Não'\n return String(raw)\n}\n\nfunction escapeCell(value: string, separator: string): string {\n if (\n value.includes('\"') ||\n value.includes(separator) ||\n value.includes('\\n') ||\n value.includes('\\r')\n ) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`\n }\n return value\n}\n\n/**\n * Serialize rows into a CSV string respecting the given (visible) columns.\n * Uses the column `format` callback when present, prepends a UTF-8 BOM so\n * Excel renders accents correctly, and defaults to `;` as the separator.\n */\nexport function toCsv(\n rows: Record<string, unknown>[],\n columns: ColumnDef[],\n options: ToCsvOptions = {},\n): string {\n const sep = options.separator ?? ';'\n const header = columns.map((c) => escapeCell(c.header, sep)).join(sep)\n const lines = rows.map((row) => columns.map((c) => escapeCell(cellValue(c, row), sep)).join(sep))\n return '' + [header, ...lines].join('\\r\\n')\n}\n\n/** Trigger a browser download of a CSV string. */\nexport function downloadCsv(csv: string, filename = 'export.csv'): void {\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = filename\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n URL.revokeObjectURL(url)\n}\n","<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch, useSlots } from 'vue'\nimport DataTable from 'primevue/datatable'\nimport Column from 'primevue/column'\nimport Button from 'primevue/button'\nimport InputText from 'primevue/inputtext'\nimport InputNumber from 'primevue/inputnumber'\nimport Select from 'primevue/select'\nimport Popover from 'primevue/popover'\nimport Checkbox from 'primevue/checkbox'\nimport IconField from 'primevue/iconfield'\nimport InputIcon from 'primevue/inputicon'\nimport Paginator from 'primevue/paginator'\nimport ContextMenu from 'primevue/contextmenu'\nimport Dialog from 'primevue/dialog'\nimport WCrudColumnRenderer from './WCrudColumnRenderer.vue'\nimport WCrudFormDialog from './WCrudFormDialog.vue'\nimport type { CrudManagerReturn } from '@/types/manager'\nimport type { RowAction } from '@/types/action'\nimport type { ColumnDef } from '@/types/column'\nimport type { FieldDef } from '@/types/field'\nimport type { KpiItem } from '@/types/kpi'\nimport type { MenuItem } from 'primevue/menuitem'\nimport type { Slots } from 'vue'\nimport { useFormatters } from '@/composables/useFormatters'\nimport { toCsv, downloadCsv } from '@/utils/csv'\n\nconst props = withDefaults(\n defineProps<{\n // WCrudView é agnóstico ao tipo do registro (trata linhas como Record<string, unknown>\n // internamente); a prop aceita o CrudManagerReturn de qualquer T do consumidor.\n // TODO(tipagem): tornar o componente genérico <T> e tipar selectedRow/eventos.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n crud: CrudManagerReturn<any>\n title: string\n subtitle?: string\n showSearch?: boolean\n showHeader?: boolean\n dialogWidth?: string\n /** Nº de colunas do grid do form dialog (default: `formColumns` da config\n * do useCrudManager, senão 2). */\n formColumns?: number\n autoInit?: boolean\n showKpi?: boolean\n kpiIcon?: string\n kpiLabel?: string\n extraKpis?: KpiItem[]\n expandable?: boolean\n viewToggle?: boolean\n defaultView?: 'table' | 'cards'\n cardFields?: number\n /** Cards \"sem moldura\": remove o chrome padrão do card (borda/sombra/padding/\n * seleção) para o slot `#card` desenhar o card inteiro (ex.: um card de design\n * próprio). O wrapper vira só a célula do grid. */\n cardBare?: boolean\n actionRail?: boolean\n contextMenu?: boolean\n showPrint?: boolean\n exportCsv?: boolean\n csvFilename?: string\n csvScope?: 'all' | 'page'\n csvPageSize?: number\n /** Chave de persistência do estado de coluna (visibilidade) em localStorage.\n * Opt-in: quando definida, exibe o seletor de colunas e persiste o que foi ocultado. */\n persistState?: string\n }>(),\n {\n showSearch: true,\n showHeader: true,\n dialogWidth: '480px',\n autoInit: true,\n showKpi: false,\n kpiIcon: 'pi pi-list',\n kpiLabel: 'Total de Registros',\n extraKpis: () => [],\n expandable: false,\n viewToggle: true,\n defaultView: 'table',\n cardFields: 4,\n actionRail: true,\n contextMenu: true,\n showPrint: false,\n exportCsv: true,\n csvFilename: 'export.csv',\n csvScope: 'all',\n csvPageSize: 200,\n },\n)\n\nconst emit = defineEmits<{\n 'row-expand': [data: unknown]\n 'row-collapse': [data: unknown]\n print: [data: Record<string, unknown>]\n}>()\n\nconst slots: Slots = useSlots()\nconst { formatNumber } = useFormatters()\n\nconst expandedRows = ref({})\n\n// --- Display mode (table / cards) ---\n\n// Persistência do modo de visualização (opt-in via `persistState`): a escolha do\n// usuário fica em localStorage sob a MESMA chave base do grid (rota + grid, provida\n// pelo consumidor). Leitura síncrona no setup evita flash table→cards. Default =\n// `defaultView` (por padrão 'table' = linha).\nfunction viewKey(): string | null {\n return props.persistState ? `wcrud:view:${props.persistState}` : null\n}\nfunction loadView(): 'table' | 'cards' {\n const key = viewKey()\n if (key) {\n const stored = localStorage.getItem(key)\n if (stored === 'table' || stored === 'cards') return stored\n }\n return props.defaultView\n}\nconst displayMode = ref<'table' | 'cards'>(loadView())\nfunction isView(mode: 'table' | 'cards'): boolean {\n return displayMode.value === mode\n}\nfunction setView(mode: 'table' | 'cards'): void {\n displayMode.value = mode\n const key = viewKey()\n if (key) localStorage.setItem(key, mode)\n}\nconst paginatorFirst = computed(\n () => (props.crud.pagination.page - 1) * props.crud.pagination.pageSize,\n)\n\n// --- Columns ---\n\n// Estado de coluna (opt-in via persistState): visibilidade persistida em localStorage.\nconst columnState = reactive<{ hidden: string[] }>({ hidden: [] })\nconst chooser = ref<InstanceType<typeof Popover> | null>(null)\nfunction colStateKey(): string | null {\n return props.persistState ? `wcrud:cols:${props.persistState}` : null\n}\nfunction loadColumnState() {\n const key = colStateKey()\n if (!key) return\n try {\n const parsed = JSON.parse(localStorage.getItem(key) || '{}')\n if (Array.isArray(parsed.hidden)) columnState.hidden = parsed.hidden\n } catch {\n /* estado inválido — ignora */\n }\n}\nfunction saveColumnState() {\n const key = colStateKey()\n if (key) localStorage.setItem(key, JSON.stringify({ hidden: columnState.hidden }))\n}\n\n// Estado de FILTROS (opt-in via persistState): filtros de coluna + busca ficam em\n// localStorage sob a mesma chave base do grid (rota + grid). Restaurados ANTES do\n// primeiro fetch, então o F5 mantém os últimos filtros aplicados.\nfunction filtersKey(): string | null {\n return props.persistState ? `wcrud:filters:${props.persistState}` : null\n}\nfunction loadFilters() {\n const key = filtersKey()\n if (!key) return\n try {\n const parsed = JSON.parse(localStorage.getItem(key) || '{}')\n if (parsed && typeof parsed.columnFilters === 'object' && parsed.columnFilters) {\n for (const [k, v] of Object.entries(parsed.columnFilters)) {\n if (v !== null && v !== undefined && v !== '') props.crud.columnFilters[k] = v\n }\n }\n if (typeof parsed.search === 'string' && parsed.search) {\n props.crud.search.value = parsed.search\n }\n } catch {\n /* estado inválido — ignora */\n }\n}\nfunction saveFilters() {\n const key = filtersKey()\n if (!key) return\n localStorage.setItem(\n key,\n JSON.stringify({\n columnFilters: { ...props.crud.columnFilters },\n search: props.crud.search.value,\n }),\n )\n}\nwatch(props.crud.columnFilters, saveFilters, { deep: true })\nwatch(props.crud.search, saveFilters)\n// Colunas base (respeita visible:false do consumidor) — fonte do seletor de colunas.\nconst baseColumns = computed(() => props.crud.config.columns.filter((c) => c.visible !== false))\nfunction toggleColumn(field: string, visible: boolean) {\n columnState.hidden = visible\n ? columnState.hidden.filter((f) => f !== field)\n : [...new Set([...columnState.hidden, field])]\n saveColumnState()\n}\n\nconst visibleColumns = computed(() =>\n props.crud.config.columns\n .filter((c) => c.visible !== false && !columnState.hidden.includes(c.field))\n .map((c) => {\n if (c.type === 'number' && !c.align) return { ...c, align: 'right' as const }\n if (c.type === 'currency' && !c.align) return { ...c, align: 'right' as const }\n return c\n }),\n)\n\nfunction colAlignClass(col: { align?: string }) {\n if (col.align === 'right') return 'text-right'\n if (col.align === 'center') return 'text-center'\n return undefined\n}\n\nconst cardColumns = computed(() => visibleColumns.value.slice(0, props.cardFields))\n\n// --- Row Actions ---\n\nconst defaultActions = computed<RowAction[]>(() => {\n const actions: RowAction[] = []\n if (props.crud.config.canEdit !== false) {\n actions.push({ action: 'edit', icon: 'pi pi-pencil', tooltip: 'Editar' })\n }\n if (props.crud.config.canCreate !== false) {\n actions.push({\n action: 'duplicate',\n icon: 'pi pi-copy',\n tooltip: 'Duplicar',\n severity: 'info',\n })\n }\n if (props.crud.config.canDelete !== false) {\n actions.push({\n action: 'delete',\n icon: 'pi pi-trash',\n tooltip: 'Excluir',\n severity: 'danger',\n })\n }\n return actions\n})\n\nconst effectiveRowActions = computed<RowAction[]>(\n () => props.crud.config.rowActions ?? defaultActions.value,\n)\n\nconst hasActions = computed(\n () => effectiveRowActions.value.length > 0 || Boolean(slots['row-actions']),\n)\n\nfunction handleRowAction(action: RowAction, data: Record<string, unknown>) {\n // Custom handler tem prioridade — permite sobrescrever ações nomeadas.\n if (action.handler) {\n action.handler(data)\n return\n }\n if (action.action === 'edit') {\n props.crud.openEditDialog(data)\n } else if (action.action === 'view') {\n props.crud.openViewDialog(data)\n } else if (action.action === 'duplicate') {\n props.crud.openDuplicateDialog(data)\n } else if (action.action === 'delete') {\n // Com slot `delete-message`, usa o diálogo próprio (permite conteúdo rico,\n // ex.: avisos por registro); senão, o confirm de serviço padrão.\n if (slots['delete-message']) {\n deleteTarget.value = data\n deleteDialogVisible.value = true\n } else {\n props.crud.confirmDelete(data)\n }\n }\n}\n\n// --- Diálogo de exclusão próprio (só quando há slot `delete-message`) ---\nconst deleteTarget = ref<Record<string, unknown> | null>(null)\nconst deleteDialogVisible = ref(false)\nconst deleting = ref(false)\n\nasync function onConfirmDelete() {\n if (!deleteTarget.value) return\n deleting.value = true\n try {\n await props.crud.performDelete(deleteTarget.value)\n deleteDialogVisible.value = false\n deleteTarget.value = null\n } finally {\n deleting.value = false\n }\n}\n\nfunction isActionVisible(action: RowAction, data: Record<string, unknown>): boolean {\n if (action.visible) return action.visible(data)\n return true\n}\n\nfunction isActionDisabled(action: RowAction, data: Record<string, unknown>): boolean {\n if (action.disabled) return action.disabled(data)\n return false\n}\n\n// --- KPIs ---\n\nconst allKpis = computed<KpiItem[]>(() => {\n const kpis: KpiItem[] = []\n if (props.showKpi) {\n kpis.push({\n icon: props.kpiIcon,\n label: props.kpiLabel,\n value: formatNumber(props.crud.pagination.rows, 0),\n })\n }\n kpis.push(...props.extraKpis)\n return kpis\n})\n\nconst canCreate = computed(() => props.crud.config.canCreate !== false)\n\n// --- Selection (drives action rail + context menu) ---\n\nconst selectedRow = ref<Record<string, unknown> | null>(null)\n\n// Seleção múltipla — opt-in via config.selectionMode: 'multiple'.\nconst isMultiSelect = computed(() => props.crud.config.selectionMode === 'multiple')\n\n// Edição inline por célula — opt-in via config.editMode: 'cell'.\nconst isCellEdit = computed(() => props.crud.config.editMode === 'cell')\nconst formFieldMap = computed(() => new Map(props.crud.config.form.map((f) => [f.field, f])))\nconst INLINE_TYPES = ['text', 'email', 'number', 'currency']\nfunction inlineField(field: string): FieldDef | undefined {\n const f = formFieldMap.value.get(field)\n return f && INLINE_TYPES.includes(f.type || 'text') ? f : undefined\n}\nfunction onCellEditComplete(e: {\n data: Record<string, unknown>\n field: string\n value?: unknown\n newValue: unknown\n}) {\n if (e.newValue === (e.value ?? e.data[e.field])) return\n props.crud.updateField(e.data, e.field, e.newValue)\n}\n\n// Filtros declarativos de coluna.\nconst filterableColumns = computed<ColumnDef[]>(() =>\n props.crud.config.columns.filter((c) => c.filter),\n)\nconst booleanFilterOptions = [\n { label: 'Sim', value: true },\n { label: 'Não', value: false },\n]\nfunction fParam(col: ColumnDef): string {\n return col.filter?.param || col.field\n}\nconst filterTimers: Record<string, ReturnType<typeof setTimeout>> = {}\nfunction onTextFilter(col: ColumnDef, value: string) {\n const param = fParam(col)\n if (filterTimers[param]) clearTimeout(filterTimers[param])\n filterTimers[param] = setTimeout(() => props.crud.setColumnFilter(param, value || null), 300)\n}\nconst cm = ref<InstanceType<typeof ContextMenu> | null>(null)\n\nfunction selectRow(row: Record<string, unknown>) {\n selectedRow.value = row\n}\n\nfunction onRowContextMenu(event: { originalEvent: Event; data: Record<string, unknown> }) {\n if (!props.contextMenu) return\n selectedRow.value = event.data\n cm.value?.show(event.originalEvent)\n}\n\nfunction onCardContextMenu(event: MouseEvent, row: Record<string, unknown>) {\n if (!props.contextMenu) return\n event.preventDefault()\n selectedRow.value = row\n cm.value?.show(event)\n}\n\nconst contextMenuItems = computed<MenuItem[]>(() => {\n const row = selectedRow.value\n if (!row) return []\n const items: MenuItem[] = [\n {\n label: 'Ver detalhes',\n icon: 'pi pi-eye',\n command: () => props.crud.openViewDialog(row),\n },\n ]\n // Todas as actions (default + customizadas) entram aqui.\n for (const action of effectiveRowActions.value) {\n if (!isActionVisible(action, row)) continue\n items.push({\n label: action.tooltip ?? action.action,\n icon: action.icon,\n class: action.severity === 'danger' ? 'w-crud-ctx-danger' : undefined,\n disabled: isActionDisabled(action, row),\n command: () => handleRowAction(action, row),\n })\n }\n if (props.showPrint) {\n items.push({\n label: 'Imprimir',\n icon: 'pi pi-print',\n command: () => emit('print', row),\n })\n }\n if (props.exportCsv) {\n items.push({ separator: true })\n items.push({\n label: props.csvScope === 'all' ? 'Exportar tudo (CSV)' : 'Exportar página (CSV)',\n icon: 'pi pi-download',\n command: () => doExportCsv(),\n })\n }\n return items\n})\n\n// --- Action rail handlers ---\n\nfunction railPrint() {\n if (selectedRow.value) emit('print', selectedRow.value)\n}\n\n// --- CSV export (visible columns) ---\n\nconst exporting = ref(false)\n\nasync function doExportCsv() {\n if (exporting.value) return\n exporting.value = true\n try {\n const rows =\n props.csvScope === 'page'\n ? props.crud.items.value\n : await props.crud.fetchAll(props.csvPageSize)\n const csv = toCsv(rows, visibleColumns.value)\n downloadCsv(csv, props.csvFilename)\n } finally {\n exporting.value = false\n }\n}\n\n// --- Init ---\n\nonMounted(() => {\n loadColumnState()\n loadFilters() // restaura filtros/busca ANTES do init para o fetch já sair filtrado\n if (props.autoInit) {\n props.crud.init()\n }\n})\n</script>\n\n<template>\n <div class=\"w-crud\">\n <!-- Header -->\n <div v-if=\"showHeader\" class=\"w-crud-header\">\n <div class=\"w-crud-header-content\">\n <h1 class=\"w-crud-title\">{{ title }}</h1>\n <p v-if=\"subtitle\" class=\"w-crud-subtitle\">{{ subtitle }}</p>\n </div>\n <div class=\"w-crud-header-actions\">\n <slot name=\"header-actions\" />\n <Button\n v-if=\"canCreate && !actionRail\"\n label=\"Novo\"\n icon=\"pi pi-plus\"\n @click=\"crud.openCreateDialog()\"\n />\n </div>\n </div>\n\n <!-- KPIs -->\n <slot name=\"before-table\">\n <div v-if=\"allKpis.length\" class=\"w-crud-kpis\">\n <div v-for=\"(kpi, idx) in allKpis\" :key=\"idx\" class=\"w-crud-kpi\">\n <div :class=\"['w-crud-kpi-icon', kpi.severity ? `w-crud-kpi-icon--${kpi.severity}` : '']\">\n <i :class=\"[kpi.icon]\" :style=\"kpi.color ? `color: ${kpi.color}` : ''\" />\n </div>\n <div class=\"w-crud-kpi-content\">\n <div class=\"w-crud-kpi-label\">{{ kpi.label }}</div>\n <div class=\"w-crud-kpi-value\">{{ kpi.value }}</div>\n </div>\n </div>\n </div>\n </slot>\n\n <!-- Content (table/cards + optional action rail) -->\n <div class=\"w-crud-content\" :class=\"{ 'w-crud-content--rail': actionRail }\">\n <div class=\"w-crud-content-main\">\n <!-- Barra de filtros de coluna (declarativos, opt-in via ColumnDef.filter) -->\n <div\n v-if=\"filterableColumns.length\"\n class=\"w-crud-filters\"\n style=\"\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-items: center;\n margin-bottom: 0.75rem;\n \"\n >\n <template v-for=\"col in filterableColumns\" :key=\"col.field\">\n <InputText\n v-if=\"(col.filter?.type || 'text') === 'text'\"\n :model-value=\"(crud.columnFilters[fParam(col)] as string) ?? ''\"\n :placeholder=\"col.filter?.placeholder || col.header\"\n size=\"small\"\n @input=\"(e: Event) => onTextFilter(col, (e.target as HTMLInputElement).value)\"\n />\n <Select\n v-else-if=\"col.filter?.type === 'select'\"\n :model-value=\"crud.columnFilters[fParam(col)]\"\n :options=\"col.filter?.options\"\n option-label=\"label\"\n option-value=\"value\"\n :placeholder=\"col.filter?.placeholder || col.header\"\n show-clear\n size=\"small\"\n @update:model-value=\"(v: unknown) => crud.setColumnFilter(fParam(col), v)\"\n />\n <Select\n v-else-if=\"col.filter?.type === 'boolean'\"\n :model-value=\"crud.columnFilters[fParam(col)]\"\n :options=\"booleanFilterOptions\"\n option-label=\"label\"\n option-value=\"value\"\n :placeholder=\"col.filter?.placeholder || col.header\"\n show-clear\n size=\"small\"\n @update:model-value=\"(v: unknown) => crud.setColumnFilter(fParam(col), v)\"\n />\n <InputNumber\n v-else-if=\"col.filter?.type === 'numeric'\"\n :model-value=\"(crud.columnFilters[fParam(col)] as number) ?? null\"\n :placeholder=\"col.filter?.placeholder || col.header\"\n size=\"small\"\n @update:model-value=\"(v: number) => crud.setColumnFilter(fParam(col), v)\"\n />\n </template>\n <Button\n v-if=\"Object.keys(crud.columnFilters).length\"\n label=\"Limpar filtros\"\n icon=\"pi pi-filter-slash\"\n text\n size=\"small\"\n @click=\"crud.clearColumnFilters()\"\n />\n </div>\n\n <!-- Table -->\n <div v-if=\"displayMode === 'table'\" class=\"w-crud-table\">\n <!-- Barra de ações em lote (seleção múltipla) -->\n <div\n v-if=\"isMultiSelect && crud.selectedItems.value.length\"\n class=\"w-crud-bulkbar\"\n style=\"\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.5rem;\n padding: 0.5rem 0.75rem;\n border-radius: 8px;\n background: var(--p-primary-50, #eef2ff);\n color: var(--p-primary-700, #3730a3);\n \"\n >\n <span style=\"font-weight: 600; font-size: 0.85rem; margin-right: auto\">\n {{ crud.selectedItems.value.length }} selecionado(s)\n </span>\n <slot name=\"bulk-actions\" :selected=\"crud.selectedItems.value\" :crud=\"crud\">\n <Button\n v-for=\"ba in crud.config.bulkActions || []\"\n :key=\"ba.action\"\n :label=\"ba.label\"\n :icon=\"ba.icon\"\n :severity=\"ba.severity\"\n size=\"small\"\n :disabled=\"ba.disabled ? ba.disabled(crud.selectedItems.value) : false\"\n @click=\"ba.handler(crud.selectedItems.value)\"\n />\n </slot>\n <Button\n v-tooltip.top=\"'Limpar seleção'\"\n icon=\"pi pi-times\"\n text\n rounded\n size=\"small\"\n @click=\"crud.clearSelection()\"\n />\n </div>\n <DataTable\n v-model:expanded-rows=\"expandedRows\"\n :value=\"crud.items.value\"\n :loading=\"crud.loading.value\"\n paginator\n :rows=\"crud.pagination.pageSize\"\n :total-records=\"crud.pagination.rows\"\n :rows-per-page-options=\"[10, 20, 50]\"\n paginator-template=\"CurrentPageReport PrevPageLink NextPageLink\"\n current-page-report-template=\"Página {currentPage} de {totalPages}\"\n :pt=\"{ pcPaginator: { root: { class: 'w-crud-paginator' } } }\"\n lazy\n striped-rows\n removable-sort\n size=\"small\"\n :sort-field=\"crud.sort.field ?? undefined\"\n :sort-order=\"crud.sort.order\"\n :data-key=\"crud.config.pk || 'id'\"\n :edit-mode=\"isCellEdit ? 'cell' : undefined\"\n :selection=\"\n isMultiSelect\n ? crud.selectedItems.value\n : actionRail || contextMenu\n ? selectedRow\n : undefined\n \"\n :selection-mode=\"\n isMultiSelect ? undefined : actionRail || contextMenu ? 'single' : undefined\n \"\n :context-menu=\"contextMenu\"\n :context-menu-selection=\"contextMenu ? selectedRow : undefined\"\n @update:selection=\"\n (v: any) => (isMultiSelect ? (crud.selectedItems.value = v) : (selectedRow = v))\n \"\n @update:context-menu-selection=\"(v: any) => (selectedRow = v)\"\n @row-contextmenu=\"onRowContextMenu\"\n @page=\"crud.onPage\"\n @sort=\"(e: any) => crud.onSort({ sortField: e.sortField, sortOrder: e.sortOrder })\"\n @row-expand=\"(e) => emit('row-expand', e.data)\"\n @row-collapse=\"(e) => emit('row-collapse', e.data)\"\n @cell-edit-complete=\"onCellEditComplete\"\n >\n <template #header>\n <div class=\"w-crud-toolbar\">\n <div class=\"w-crud-toolbar-start\">\n <IconField v-if=\"showSearch\">\n <InputIcon class=\"pi pi-search\" />\n <InputText\n :model-value=\"crud.search.value\"\n placeholder=\"Buscar...\"\n class=\"w-72\"\n @input=\"crud.onSearch\"\n />\n </IconField>\n <slot name=\"toolbar-start\" />\n <slot name=\"toolbar-filters\" />\n </div>\n <div class=\"w-crud-toolbar-end\">\n <slot name=\"toolbar-actions\" />\n <template v-if=\"persistState\">\n <Button\n v-tooltip.top=\"'Colunas'\"\n icon=\"pi pi-sliders-h\"\n text\n size=\"small\"\n @click=\"(e) => chooser?.toggle(e)\"\n />\n <Popover ref=\"chooser\">\n <div\n style=\"\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n min-width: 180px;\n \"\n >\n <div\n v-for=\"col in baseColumns\"\n :key=\"col.field\"\n style=\"display: flex; align-items: center; gap: 0.5rem\"\n >\n <Checkbox\n :model-value=\"!columnState.hidden.includes(col.field)\"\n :input-id=\"`wcrud-col-${col.field}`\"\n binary\n @update:model-value=\"(v) => toggleColumn(col.field, !!v)\"\n />\n <label\n :for=\"`wcrud-col-${col.field}`\"\n style=\"font-size: 0.85rem; cursor: pointer\"\n >\n {{ col.header }}\n </label>\n </div>\n </div>\n </Popover>\n </template>\n <Button\n v-if=\"exportCsv\"\n v-tooltip.top=\"\n csvScope === 'all' ? 'Exportar tudo (CSV)' : 'Exportar página (CSV)'\n \"\n icon=\"pi pi-download\"\n text\n size=\"small\"\n :loading=\"exporting\"\n @click=\"doExportCsv\"\n />\n <div v-if=\"viewToggle\" class=\"w-crud-view-toggle\">\n <Button\n icon=\"pi pi-table\"\n size=\"small\"\n :text=\"!isView('table')\"\n :outlined=\"isView('table')\"\n @click=\"setView('table')\"\n />\n <Button\n icon=\"pi pi-th-large\"\n size=\"small\"\n :text=\"!isView('cards')\"\n :outlined=\"isView('cards')\"\n @click=\"setView('cards')\"\n />\n </div>\n <Button\n v-if=\"!showHeader && canCreate && !actionRail\"\n label=\"Novo\"\n icon=\"pi pi-plus\"\n @click=\"crud.openCreateDialog()\"\n />\n </div>\n </div>\n </template>\n\n <template #empty>\n <slot name=\"empty\">\n <div class=\"w-crud-empty\">\n <div class=\"w-crud-empty-icon\">\n <i class=\"pi pi-inbox\" />\n </div>\n <p class=\"w-crud-empty-title\">Nenhum registro encontrado</p>\n <p class=\"w-crud-empty-text\">Tente ajustar sua busca ou crie um novo registro</p>\n </div>\n </slot>\n </template>\n\n <!-- Seleção múltipla (checkbox) -->\n <Column v-if=\"isMultiSelect\" selection-mode=\"multiple\" style=\"width: 3rem\" />\n\n <!-- Expander -->\n <Column v-if=\"expandable\" expander style=\"width: 3rem\" />\n\n <!-- Data columns -->\n <Column\n v-for=\"col in visibleColumns\"\n :key=\"col.field\"\n :field=\"col.field\"\n :header=\"col.header\"\n :sortable=\"col.sortable\"\n :style=\"col.style\"\n :header-class=\"colAlignClass(col)\"\n :body-class=\"colAlignClass(col)\"\n >\n <template #body=\"{ data }\">\n <slot :name=\"`column-${col.field}`\" :data=\"data\" :value=\"data[col.field]\">\n <WCrudColumnRenderer :column=\"col\" :value=\"data[col.field]\" :row-data=\"data\" />\n </slot>\n </template>\n <template v-if=\"isCellEdit && inlineField(col.field)\" #editor=\"{ data }\">\n <InputNumber\n v-if=\"['number', 'currency'].includes(inlineField(col.field)?.type || '')\"\n :model-value=\"(data[col.field] as number) ?? null\"\n fluid\n @update:model-value=\"\n (v) => {\n data[col.field] = v\n }\n \"\n />\n <InputText\n v-else\n :model-value=\"(data[col.field] as string) ?? ''\"\n fluid\n @update:model-value=\"\n (v) => {\n data[col.field] = v\n }\n \"\n />\n </template>\n </Column>\n\n <!-- Actions column (oculta quando a action rail está ativa) -->\n <Column\n v-if=\"hasActions && !actionRail\"\n header-class=\"w-crud-actions-header\"\n :style=\"{\n width: `${(effectiveRowActions.length + (slots['row-actions'] ? 1 : 0)) * 2.5 + 1}rem`,\n }\"\n >\n <template #body=\"{ data }\">\n <div class=\"w-crud-actions\">\n <template v-for=\"action in effectiveRowActions\" :key=\"action.action\">\n <Button\n v-if=\"isActionVisible(action, data)\"\n v-tooltip.top=\"action.tooltip\"\n :icon=\"action.icon\"\n text\n rounded\n size=\"small\"\n :severity=\"action.severity as any\"\n :disabled=\"isActionDisabled(action, data)\"\n @click=\"handleRowAction(action, data)\"\n />\n </template>\n <slot name=\"row-actions\" :data=\"data\" :crud=\"crud\" />\n </div>\n </template>\n </Column>\n\n <!-- Expansion -->\n <template v-if=\"expandable\" #expansion=\"slotProps\">\n <slot name=\"expansion\" :data=\"slotProps.data\" />\n </template>\n </DataTable>\n </div>\n\n <!-- Cards view -->\n <div v-else class=\"w-crud-cards-wrap\">\n <div class=\"w-crud-toolbar w-crud-toolbar--standalone\">\n <div class=\"w-crud-toolbar-start\">\n <IconField v-if=\"showSearch\">\n <InputIcon class=\"pi pi-search\" />\n <InputText\n :model-value=\"crud.search.value\"\n placeholder=\"Buscar...\"\n class=\"w-72\"\n @input=\"crud.onSearch\"\n />\n </IconField>\n <slot name=\"toolbar-start\" />\n <slot name=\"toolbar-filters\" />\n </div>\n <div class=\"w-crud-toolbar-end\">\n <slot name=\"toolbar-actions\" />\n <Button\n v-if=\"exportCsv\"\n v-tooltip.top=\"csvScope === 'all' ? 'Exportar tudo (CSV)' : 'Exportar página (CSV)'\"\n icon=\"pi pi-download\"\n text\n size=\"small\"\n :loading=\"exporting\"\n @click=\"doExportCsv\"\n />\n <div v-if=\"viewToggle\" class=\"w-crud-view-toggle\">\n <Button\n icon=\"pi pi-table\"\n size=\"small\"\n :text=\"!isView('table')\"\n :outlined=\"isView('table')\"\n @click=\"setView('table')\"\n />\n <Button\n icon=\"pi pi-th-large\"\n size=\"small\"\n :text=\"!isView('cards')\"\n :outlined=\"isView('cards')\"\n @click=\"setView('cards')\"\n />\n </div>\n <Button\n v-if=\"!showHeader && canCreate && !actionRail\"\n label=\"Novo\"\n icon=\"pi pi-plus\"\n @click=\"crud.openCreateDialog()\"\n />\n </div>\n </div>\n\n <div v-if=\"crud.loading.value\" class=\"w-crud-cards-loading\">\n <i class=\"pi pi-spin pi-spinner\" />\n </div>\n\n <slot v-else-if=\"!crud.items.value.length\" name=\"empty\">\n <div class=\"w-crud-empty\">\n <div class=\"w-crud-empty-icon\">\n <i class=\"pi pi-inbox\" />\n </div>\n <p class=\"w-crud-empty-title\">Nenhum registro encontrado</p>\n <p class=\"w-crud-empty-text\">Tente ajustar sua busca ou crie um novo registro</p>\n </div>\n </slot>\n\n <div v-else class=\"w-crud-cards\" :class=\"{ 'w-crud-cards--bare': cardBare }\">\n <div\n v-for=\"(row, idx) in crud.items.value\"\n :key=\"(row[crud.config.pk || 'id'] as string | number) ?? idx\"\n :class=\"\n cardBare\n ? 'w-crud-card-bare'\n : ['w-crud-card', { 'w-crud-card--selected': selectedRow === row }]\n \"\n @click=\"!cardBare && selectRow(row)\"\n @dblclick=\"!cardBare && crud.config.canEdit !== false && crud.openEditDialog(row)\"\n @contextmenu=\"!cardBare && onCardContextMenu($event, row)\"\n >\n <!-- Slot `card`: assume o CONTEÚDO do card (corpo + ações), mantendo o\n wrapper do WCrudView (chrome, seleção, dblclick-editar, contextmenu,\n toolbar/loading/empty/paginação). Sem o slot, cai no card padrão\n (título + label:valor das `cardColumns` + ações de linha). -->\n <slot name=\"card\" :data=\"row\" :crud=\"crud\" :columns=\"cardColumns\" :index=\"idx\">\n <div class=\"w-crud-card-body\">\n <div\n v-for=\"(col, ci) in cardColumns\"\n :key=\"col.field\"\n class=\"w-crud-card-row\"\n :class=\"{ 'w-crud-card-row--title': ci === 0 }\"\n >\n <span v-if=\"ci !== 0\" class=\"w-crud-card-label\">{{ col.header }}</span>\n <span class=\"w-crud-card-value\">\n <slot :name=\"`column-${col.field}`\" :data=\"row\" :value=\"row[col.field]\">\n <WCrudColumnRenderer\n :column=\"col\"\n :value=\"row[col.field]\"\n :row-data=\"row\"\n />\n </slot>\n </span>\n </div>\n </div>\n <div v-if=\"hasActions && !actionRail\" class=\"w-crud-card-actions\">\n <template v-for=\"action in effectiveRowActions\" :key=\"action.action\">\n <Button\n v-if=\"isActionVisible(action, row)\"\n v-tooltip.top=\"action.tooltip\"\n :icon=\"action.icon\"\n text\n rounded\n size=\"small\"\n :severity=\"action.severity as any\"\n :disabled=\"isActionDisabled(action, row)\"\n @click=\"handleRowAction(action, row)\"\n />\n </template>\n <slot name=\"row-actions\" :data=\"row\" :crud=\"crud\" />\n </div>\n </slot>\n </div>\n </div>\n\n <Paginator\n v-if=\"crud.items.value.length\"\n :rows=\"crud.pagination.pageSize\"\n :total-records=\"crud.pagination.rows\"\n :first=\"paginatorFirst\"\n :rows-per-page-options=\"[10, 20, 50]\"\n template=\"CurrentPageReport PrevPageLink NextPageLink\"\n current-page-report-template=\"Página {currentPage} de {totalPages}\"\n class=\"w-crud-paginator\"\n @page=\"crud.onPage\"\n />\n </div>\n </div>\n <!-- /.w-crud-content-main -->\n\n <!-- Floating action rail (todas as actions vivem aqui) -->\n <aside v-if=\"actionRail\" class=\"w-crud-rail\">\n <Button\n v-if=\"canCreate\"\n v-tooltip.left=\"'Novo'\"\n icon=\"pi pi-plus\"\n rounded\n @click=\"crud.openCreateDialog()\"\n />\n <div v-if=\"canCreate && effectiveRowActions.length\" class=\"w-crud-rail-sep\" />\n <template v-for=\"action in effectiveRowActions\" :key=\"action.action\">\n <Button\n v-if=\"!selectedRow || isActionVisible(action, selectedRow)\"\n v-tooltip.left=\"action.tooltip\"\n :icon=\"action.icon\"\n text\n rounded\n :severity=\"action.severity as any\"\n :disabled=\"!selectedRow || isActionDisabled(action, selectedRow)\"\n @click=\"selectedRow && handleRowAction(action, selectedRow)\"\n />\n </template>\n <slot name=\"rail-actions\" :selected=\"selectedRow\" :crud=\"crud\" />\n <div v-if=\"showPrint || exportCsv\" class=\"w-crud-rail-sep\" />\n <Button\n v-if=\"showPrint\"\n v-tooltip.left=\"'Imprimir'\"\n icon=\"pi pi-print\"\n text\n rounded\n :disabled=\"!selectedRow\"\n @click=\"railPrint\"\n />\n <Button\n v-if=\"exportCsv\"\n v-tooltip.left=\"csvScope === 'all' ? 'Exportar tudo (CSV)' : 'Exportar página (CSV)'\"\n icon=\"pi pi-download\"\n text\n rounded\n :loading=\"exporting\"\n @click=\"doExportCsv\"\n />\n </aside>\n </div>\n <!-- /.w-crud-content -->\n\n <!-- Context menu -->\n <ContextMenu v-if=\"contextMenu\" ref=\"cm\" :model=\"contextMenuItems\" />\n\n <!-- Form Dialog -->\n <slot name=\"form-dialog\" :crud=\"crud\" :dialog-width=\"dialogWidth\">\n <WCrudFormDialog\n :visible=\"crud.dialogVisible.value\"\n :title=\"crud.dialogTitle.value\"\n :fields=\"crud.config.form\"\n :form-data=\"crud.formData\"\n :is-editing=\"crud.isEditing.value\"\n :saving=\"crud.saving.value\"\n :disabled=\"crud.viewMode?.value ?? false\"\n :width=\"dialogWidth\"\n :form-columns=\"formColumns ?? crud.config.formColumns\"\n :keyboard-nav=\"crud.config.keyboardNav\"\n @update:visible=\"\n (v) => {\n crud.dialogVisible.value = v\n if (!v) crud.editingItem.value = null\n }\n \"\n @update:field=\"(field, val) => crud.setFormField(field, val)\"\n @save=\"crud.save()\"\n >\n <template\n v-for=\"field in crud.config.form\"\n :key=\"field.field\"\n #[`field-${field.field}`]=\"scope\"\n >\n <slot :name=\"`field-${field.field}`\" v-bind=\"scope\" />\n </template>\n </WCrudFormDialog>\n </slot>\n\n <!-- Diálogo de exclusão próprio: renderizado só quando o consumidor fornece\n o slot `delete-message` (permite conteúdo rico por registro). -->\n <Dialog\n v-if=\"$slots['delete-message']\"\n v-model:visible=\"deleteDialogVisible\"\n header=\"Confirmar Exclusão\"\n modal\n :draggable=\"false\"\n class=\"w-crud-delete-dialog\"\n :style=\"{ width: '30rem' }\"\n >\n <slot name=\"delete-message\" :item=\"deleteTarget\" />\n <template #footer>\n <Button\n type=\"button\"\n label=\"Cancelar\"\n severity=\"secondary\"\n text\n :disabled=\"deleting\"\n @click=\"deleteDialogVisible = false\"\n />\n <Button\n type=\"button\"\n label=\"Excluir\"\n icon=\"pi pi-trash\"\n severity=\"danger\"\n :loading=\"deleting\"\n @click=\"onConfirmDelete\"\n />\n </template>\n </Dialog>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, isRef, ref } from 'vue'\nimport InputText from 'primevue/inputtext'\nimport InputNumber from 'primevue/inputnumber'\nimport Select from 'primevue/select'\nimport { useFormatters } from '@/composables/useFormatters'\nimport type { EditableColumnDef, EditableRow } from '@/types/editableTable'\n\n/**\n * Tabela editável sobre ESTADO LOCAL — o oposto do WCrudView, que conversa com a\n * API a cada operação. Aqui nada é persistido: o consumidor mantém o array e\n * salva em bloco quando quiser (o caso \"documento com filhos\", em que salvar\n * linha a linha criaria registro órfão).\n *\n * As linhas nunca são mutadas no lugar: toda edição emite um array NOVO com a\n * linha trocada (`update:modelValue`), então `v-model` funciona igual em `ref`,\n * `reactive` ou prop vinda de cima.\n *\n * A subtabela de insumos do design é este mesmo componente dentro do slot\n * `#expansion` — não existe componente separado para \"tabela filha\".\n */\nconst props = withDefaults(\n defineProps<{\n /** Linhas (`v-model`). */\n modelValue?: EditableRow[]\n columns?: EditableColumnDef[]\n /** Liga a coluna de expansão e o slot `#expansion`. */\n expandable?: boolean\n /** Rótulo do botão de adicionar. Omitido = sem botão (só o slot `#toolbar`). */\n addLabel?: string\n /** Liga a coluna da lixeira. */\n removable?: boolean\n emptyMessage?: string\n /** Rótulo da primeira célula do rodapé de totais. */\n footerLabel?: string\n /** Trava todos os editores (a tabela vira leitura). */\n disabled?: boolean\n /** Campo usado como `key` das linhas. Sem ele, a chave é o índice. */\n rowKey?: string\n }>(),\n {\n modelValue: () => [],\n columns: () => [],\n expandable: false,\n removable: false,\n emptyMessage: 'Nenhum item adicionado',\n footerLabel: 'Total',\n disabled: false,\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [rows: EditableRow[]]\n add: []\n remove: [row: EditableRow, index: number]\n}>()\n\nconst { formatNumber } = useFormatters()\n\n// --- Expansão --------------------------------------------------------------\n// Índice das linhas abertas. Várias podem ficar abertas ao mesmo tempo: a\n// expansão é detalhe de leitura, não navegação.\nconst expanded = ref<Set<number>>(new Set())\n\nfunction isExpanded(index: number): boolean {\n return expanded.value.has(index)\n}\n\nfunction toggleRow(index: number) {\n const next = new Set(expanded.value)\n if (next.has(index)) next.delete(index)\n else next.add(index)\n expanded.value = next\n}\n\n// --- Colunas ---------------------------------------------------------------\n\nfunction unwrapOptions(column: EditableColumnDef): Record<string, unknown>[] {\n const options = column.options\n if (!options) return []\n return (isRef(options) ? options.value : options) as Record<string, unknown>[]\n}\n\nfunction columnAlign(column: EditableColumnDef): 'left' | 'center' | 'right' {\n if (column.align) return column.align\n return column.editor === 'number' ? 'right' : 'left'\n}\n\nfunction isNumericColumn(column: EditableColumnDef): boolean {\n return column.editor === 'number' || column.footer === 'sum' || column.decimals != null\n}\n\nfunction columnClass(column: EditableColumnDef): string[] {\n return [\n `w-editable-table__cell--${columnAlign(column)}`,\n ...(isNumericColumn(column) ? ['w-editable-table__cell--num'] : []),\n ]\n}\n\nfunction columnStyle(column: EditableColumnDef) {\n if (column.width == null) return undefined\n return { width: typeof column.width === 'number' ? `${column.width}px` : column.width }\n}\n\nfunction isCellDisabled(column: EditableColumnDef, row: EditableRow, index: number): boolean {\n if (props.disabled) return true\n if (typeof column.disabled === 'function') return column.disabled(row, index)\n return !!column.disabled\n}\n\n// --- Leitura / escrita de célula -------------------------------------------\n\nfunction toNumber(value: unknown): number {\n if (typeof value === 'number') return Number.isFinite(value) ? value : 0\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number(value.replace(/\\./g, '').replace(',', '.'))\n return Number.isFinite(parsed) ? parsed : 0\n }\n return 0\n}\n\nfunction displayValue(column: EditableColumnDef, row: EditableRow): string {\n const value = row[column.field]\n if (column.format) return column.format(value, row)\n if (value == null || value === '') return '—'\n if (isNumericColumn(column)) {\n return `${formatNumber(toNumber(value), column.decimals ?? 2)}${column.suffix ?? ''}`\n }\n return `${String(value)}${column.suffix ?? ''}`\n}\n\nfunction setCell(index: number, field: string, value: unknown) {\n const next = props.modelValue.map((row, i) => (i === index ? { ...row, [field]: value } : row))\n emit('update:modelValue', next)\n}\n\nfunction removeRow(row: EditableRow, index: number) {\n if (props.disabled) return\n // Emite os dois: o array já sem a linha (para o v-model continuar sendo a\n // fonte da verdade) e o evento com a linha removida (para quem precisa dela).\n emit(\n 'update:modelValue',\n props.modelValue.filter((_, i) => i !== index),\n )\n expanded.value = new Set()\n emit('remove', row, index)\n}\n\nfunction rowKeyOf(row: EditableRow, index: number): string | number {\n if (props.rowKey) {\n const key = row[props.rowKey]\n if (typeof key === 'string' || typeof key === 'number') return key\n }\n return index\n}\n\n// --- Rodapé de totais ------------------------------------------------------\n\nconst hasFooter = computed(() =>\n props.columns.some((c) => typeof c.footer === 'function' || c.footer === 'sum'),\n)\n\nfunction footerValue(column: EditableColumnDef): string {\n if (typeof column.footer === 'function') return column.footer(props.modelValue)\n if (column.footer !== 'sum') return ''\n const total = props.modelValue.reduce((sum, row) => sum + toNumber(row[column.field]), 0)\n return `${formatNumber(total, column.decimals ?? 2)}${column.suffix ?? ''}`\n}\n\n/** A primeira coluna sem rodapé próprio carrega o rótulo \"Total\". */\nconst footerLabelField = computed(() => {\n const first = props.columns.find((c) => !c.footer || c.footer === 'none')\n return first?.field ?? null\n})\n\nconst columnCount = computed(\n () => props.columns.length + (props.expandable ? 1 : 0) + (props.removable ? 1 : 0),\n)\n</script>\n\n<template>\n <div class=\"w-editable-table\">\n <div v-if=\"$slots.toolbar || addLabel\" class=\"w-editable-table__toolbar\">\n <slot name=\"toolbar\">\n <button\n type=\"button\"\n class=\"w-editable-table__add\"\n :disabled=\"disabled\"\n @click=\"emit('add')\"\n >\n <i class=\"pi pi-plus\" />{{ addLabel }}\n </button>\n </slot>\n </div>\n\n <table class=\"w-editable-table__table\">\n <thead>\n <tr>\n <th v-if=\"expandable\" class=\"w-editable-table__toggle-col\" />\n <th\n v-for=\"column in columns\"\n :key=\"column.field\"\n :class=\"columnClass(column)\"\n :style=\"columnStyle(column)\"\n >\n {{ column.header }}\n </th>\n <th v-if=\"removable\" class=\"w-editable-table__action-col\" />\n </tr>\n </thead>\n\n <tbody v-if=\"!modelValue.length\">\n <tr>\n <td :colspan=\"columnCount\" class=\"w-editable-table__empty\">\n <slot name=\"empty\">{{ emptyMessage }}</slot>\n </td>\n </tr>\n </tbody>\n\n <tbody v-for=\"(row, index) in modelValue\" :key=\"rowKeyOf(row, index)\">\n <tr class=\"w-editable-table__row\">\n <td v-if=\"expandable\" class=\"w-editable-table__toggle-col\">\n <button\n type=\"button\"\n class=\"w-editable-table__toggle\"\n :aria-expanded=\"isExpanded(index)\"\n aria-label=\"Detalhes da linha\"\n @click=\"toggleRow(index)\"\n >\n <i :class=\"isExpanded(index) ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\" />\n </button>\n </td>\n\n <td\n v-for=\"column in columns\"\n :key=\"column.field\"\n :class=\"columnClass(column)\"\n :style=\"columnStyle(column)\"\n >\n <slot\n :name=\"`cell-${column.field}`\"\n :row=\"row\"\n :index=\"index\"\n :value=\"row[column.field]\"\n :column=\"column\"\n >\n <InputNumber\n v-if=\"column.editor === 'number'\"\n :model-value=\"row[column.field] as number\"\n fluid\n locale=\"pt-BR\"\n :min=\"column.min\"\n :max=\"column.max\"\n :min-fraction-digits=\"column.decimals != null ? column.decimals : undefined\"\n :max-fraction-digits=\"column.decimals != null ? column.decimals : undefined\"\n :suffix=\"column.suffix\"\n :placeholder=\"column.placeholder\"\n :disabled=\"isCellDisabled(column, row, index)\"\n :input-class=\"'w-editable-table__num'\"\n @update:model-value=\"(val) => setCell(index, column.field, val)\"\n />\n\n <InputText\n v-else-if=\"column.editor === 'text'\"\n :model-value=\"row[column.field] as string\"\n fluid\n :placeholder=\"column.placeholder\"\n :disabled=\"isCellDisabled(column, row, index)\"\n @update:model-value=\"(val) => setCell(index, column.field, val)\"\n />\n\n <Select\n v-else-if=\"column.editor === 'select'\"\n :model-value=\"row[column.field]\"\n fluid\n :options=\"unwrapOptions(column)\"\n :option-label=\"column.optionLabel || 'label'\"\n :option-value=\"column.optionValue || 'value'\"\n :placeholder=\"column.placeholder\"\n :disabled=\"isCellDisabled(column, row, index)\"\n @update:model-value=\"(val) => setCell(index, column.field, val)\"\n />\n\n <span v-else class=\"w-editable-table__text\">{{ displayValue(column, row) }}</span>\n </slot>\n </td>\n\n <td v-if=\"removable\" class=\"w-editable-table__action-col\">\n <button\n type=\"button\"\n class=\"w-editable-table__remove\"\n :disabled=\"disabled\"\n aria-label=\"Remover linha\"\n @click=\"removeRow(row, index)\"\n >\n <i class=\"pi pi-trash\" />\n </button>\n </td>\n </tr>\n\n <tr v-if=\"expandable && isExpanded(index)\" class=\"w-editable-table__expansion\">\n <td :colspan=\"columnCount\">\n <slot name=\"expansion\" :row=\"row\" :index=\"index\" />\n </td>\n </tr>\n </tbody>\n\n <tfoot v-if=\"hasFooter\">\n <tr class=\"w-editable-table__footer\">\n <td v-if=\"expandable\" class=\"w-editable-table__toggle-col\" />\n <td\n v-for=\"column in columns\"\n :key=\"column.field\"\n :class=\"columnClass(column)\"\n :style=\"columnStyle(column)\"\n >\n <slot :name=\"`footer-${column.field}`\" :rows=\"modelValue\" :column=\"column\">\n <span v-if=\"column.field === footerLabelField\" class=\"w-editable-table__footer-label\">\n {{ footerLabel }}\n </span>\n <span v-else>{{ footerValue(column) }}</span>\n </slot>\n </td>\n <td v-if=\"removable\" class=\"w-editable-table__action-col\" />\n </tr>\n </tfoot>\n </table>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport DatePicker from 'primevue/datepicker'\n\n/**\n * Seletor de intervalo de datas (período). Wrapper fino do DatePicker em modo\n * range com padrões pt-BR. O `v-model` guarda `[início, fim]` como `Date[]`.\n */\nwithDefaults(\n defineProps<{\n modelValue?: Date[] | null\n placeholder?: string\n minDate?: Date\n maxDate?: Date\n showButtonBar?: boolean\n disabled?: boolean\n }>(),\n {\n modelValue: null,\n placeholder: 'Selecione o período',\n showButtonBar: true,\n disabled: false,\n },\n)\n\nconst emit = defineEmits<{ 'update:modelValue': [value: Date[] | null] }>()\n\nfunction onUpdate(v: unknown) {\n emit('update:modelValue', (v as Date[] | null) ?? null)\n}\n</script>\n\n<template>\n <DatePicker\n :model-value=\"modelValue ?? undefined\"\n selection-mode=\"range\"\n :placeholder=\"placeholder\"\n :min-date=\"minDate\"\n :max-date=\"maxDate\"\n :show-button-bar=\"showButtonBar\"\n :disabled=\"disabled\"\n date-format=\"dd/mm/yy\"\n fluid\n @update:model-value=\"onUpdate\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\nimport Button from 'primevue/button'\n\n/**\n * Upload de arquivo(s) genérico (single ou multiple), sem dependência pesada.\n * O `v-model` guarda `File` (single) ou `File[]` (multiple). Valida tamanho por\n * arquivo e emite `error` para os que excederem.\n */\nconst props = withDefaults(\n defineProps<{\n modelValue?: File | File[] | null\n multiple?: boolean\n accept?: string\n /** Tamanho máximo por arquivo em bytes (default 10MB). */\n maxSize?: number\n disabled?: boolean\n chooseLabel?: string\n }>(),\n {\n modelValue: null,\n multiple: false,\n accept: undefined,\n maxSize: 10_485_760,\n disabled: false,\n chooseLabel: 'Selecionar arquivo',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: File | File[] | null]\n error: [message: string]\n}>()\n\nconst input = ref<HTMLInputElement | null>(null)\nconst files = computed<File[]>(() => {\n const v = props.modelValue\n if (!v) return []\n return Array.isArray(v) ? v : [v]\n})\n\nfunction open() {\n input.value?.click()\n}\n\nfunction onChange(e: Event) {\n const el = e.target as HTMLInputElement\n const picked = Array.from(el.files || [])\n el.value = ''\n const valid: File[] = []\n for (const f of picked) {\n if (f.size > props.maxSize) {\n emit('error', `\"${f.name}\" acima do limite de ${(props.maxSize / 1_048_576).toFixed(1)}MB.`)\n continue\n }\n valid.push(f)\n }\n if (!valid.length) return\n emit('update:modelValue', props.multiple ? [...files.value, ...valid] : valid[0])\n}\n\nfunction removeAt(i: number) {\n if (!props.multiple) {\n emit('update:modelValue', null)\n return\n }\n const next = files.value.slice()\n next.splice(i, 1)\n emit('update:modelValue', next.length ? next : null)\n}\n\nfunction fmtSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1_048_576) return `${(bytes / 1024).toFixed(0)} KB`\n return `${(bytes / 1_048_576).toFixed(1)} MB`\n}\n</script>\n\n<template>\n <div class=\"w-fileupload\" style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div>\n <Button\n type=\"button\"\n :label=\"chooseLabel\"\n icon=\"pi pi-upload\"\n outlined\n size=\"small\"\n :disabled=\"disabled\"\n @click=\"open\"\n />\n </div>\n <input\n ref=\"input\"\n type=\"file\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n style=\"display: none\"\n @change=\"onChange\"\n />\n <ul\n v-if=\"files.length\"\n style=\"\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n \"\n >\n <li\n v-for=\"(f, i) in files\"\n :key=\"`${f.name}-${i}`\"\n style=\"display: flex; align-items: center; gap: 0.5rem; font-size: 0.85rem\"\n >\n <i class=\"pi pi-file\" style=\"opacity: 0.6\" />\n <span style=\"flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap\">\n {{ f.name }}\n </span>\n <span style=\"opacity: 0.6\">{{ fmtSize(f.size) }}</span>\n <Button\n type=\"button\"\n icon=\"pi pi-times\"\n text\n rounded\n size=\"small\"\n severity=\"danger\"\n :disabled=\"disabled\"\n @click=\"removeAt(i)\"\n />\n </li>\n </ul>\n <slot v-else name=\"empty\">\n <span style=\"font-size: 0.8rem; opacity: 0.6\">Nenhum arquivo selecionado</span>\n </slot>\n </div>\n</template>\n","/**\n * Lógica pura por trás do `WTreeSelect` — sem Vue, sem PrimeVue, testável isolada.\n *\n * O componente NÃO delega a seleção ao `Tree` do PrimeVue (ver o comentário longo\n * em `WTreeSelect.vue`). Tudo o que a árvore precisa saber é derivado aqui, sempre\n * a partir da árvore INTEIRA e do array de ids selecionados.\n */\n\nexport type TreeSelectId = string | number\n\nexport type TreeSelectOption = Record<string, unknown>\n\n/** Nó no formato que o `Tree` do PrimeVue consome (`key`/`label`/`children`). */\nexport interface TreeSelectNode {\n /** Chave única e estável. Prefixada para não colidir grupo com folha. */\n key: string\n label: string\n /** Id da folha. Ausente em nó de grupo — grupo é visual, nunca entra no v-model. */\n value?: TreeSelectId\n children?: TreeSelectNode[]\n /** Registro original da lista plana, entregue aos slots. */\n data?: TreeSelectOption\n leaf: boolean\n}\n\n/** Estado de um nó no formato que o `Tree` lê (`checked` / `partialChecked`). */\nexport interface TreeSelectionState {\n checked: boolean\n partialChecked: boolean\n}\n\nexport type TreeSelectionKeys = Record<string, TreeSelectionState>\n\n/** Prefixo da chave de um nó de grupo. */\nexport const TREE_GROUP_PREFIX = 'g:'\n/** Prefixo da chave de um nó folha. */\nexport const TREE_LEAF_PREFIX = 'n:'\n\nexport interface BuildTreeOptions {\n /** Campo do id da folha (default: `id`). */\n optionValue?: string\n /** Campo do rótulo visível (default: `nome`). */\n optionLabel?: string\n /** Campo que agrupa. Sem ele, a árvore é rasa (só folhas na raiz). */\n groupBy?: string\n /** Rótulo do nó-pai a partir do valor bruto do agrupamento. */\n groupLabel?: (chave: string) => string\n}\n\n/** Normaliza para busca: minúsculas e sem acento (rótulos são pt-BR). */\nexport function normalizeTerm(value: unknown): string {\n return String(value ?? '')\n .normalize('NFD')\n .replace(/\\p{Diacritic}/gu, '')\n .toLocaleLowerCase()\n}\n\n/**\n * Converte a lista PLANA em árvore de dois níveis.\n *\n * - Sem `groupBy`, ou item com valor de grupo vazio/nulo → folha na raiz.\n * - Grupos saem na ordem da primeira ocorrência (nada de ordenação implícita,\n * quem manda na ordem é quem monta a lista).\n */\nexport function buildTree(\n options: readonly TreeSelectOption[],\n { optionValue = 'id', optionLabel = 'nome', groupBy, groupLabel }: BuildTreeOptions = {},\n): TreeSelectNode[] {\n const roots: TreeSelectNode[] = []\n const groups = new Map<string, TreeSelectNode>()\n\n for (const option of options ?? []) {\n const id = option[optionValue] as TreeSelectId | undefined\n if (id === undefined || id === null) continue\n\n const leaf: TreeSelectNode = {\n key: `${TREE_LEAF_PREFIX}${id}`,\n label: String(option[optionLabel] ?? id),\n value: id,\n data: option,\n leaf: true,\n }\n\n const rawGroup = groupBy ? option[groupBy] : undefined\n if (rawGroup === undefined || rawGroup === null || rawGroup === '') {\n roots.push(leaf)\n continue\n }\n\n const chave = String(rawGroup)\n let group = groups.get(chave)\n if (!group) {\n group = {\n key: `${TREE_GROUP_PREFIX}${chave}`,\n label: groupLabel ? groupLabel(chave) : chave,\n children: [],\n leaf: false,\n }\n groups.set(chave, group)\n roots.push(group)\n }\n group.children!.push(leaf)\n }\n\n return roots\n}\n\n/** Todos os ids de folha sob um nó (o próprio, se for folha). */\nexport function collectLeafValues(node: TreeSelectNode): TreeSelectId[] {\n if (!node.children?.length) {\n return node.value === undefined ? [] : [node.value]\n }\n return node.children.flatMap(collectLeafValues)\n}\n\n/** Todos os ids de folha da árvore, na ordem em que aparecem. */\nexport function allLeafValues(nodes: readonly TreeSelectNode[]): TreeSelectId[] {\n return nodes.flatMap(collectLeafValues)\n}\n\n/** Índice `key → nó` da árvore INTEIRA — é por aqui que um evento vira ids. */\nexport function indexByKey(nodes: readonly TreeSelectNode[]): Map<string, TreeSelectNode> {\n const index = new Map<string, TreeSelectNode>()\n const visit = (node: TreeSelectNode) => {\n index.set(node.key, node)\n node.children?.forEach(visit)\n }\n nodes.forEach(visit)\n return index\n}\n\n/**\n * Deriva o mapa `selectionKeys` a partir dos ids selecionados.\n *\n * Chame SEMPRE com a árvore inteira — nunca com a visão filtrada. Um grupo é\n * `checked` quando todas as folhas dele estão selecionadas e `partialChecked`\n * quando só algumas estão; como a conta é sobre o conjunto completo, o filtro\n * não tem como corromper o estado.\n */\nexport function deriveSelectionKeys(\n nodes: readonly TreeSelectNode[],\n selected: readonly TreeSelectId[],\n): TreeSelectionKeys {\n const chosen = new Set<TreeSelectId>(selected ?? [])\n const keys: TreeSelectionKeys = {}\n\n const visit = (node: TreeSelectNode): TreeSelectionState => {\n if (!node.children?.length) {\n const checked = node.value !== undefined && chosen.has(node.value)\n if (checked) keys[node.key] = { checked: true, partialChecked: false }\n return { checked, partialChecked: false }\n }\n\n let todas = true\n let alguma = false\n for (const child of node.children) {\n const estado = visit(child)\n if (estado.checked) alguma = true\n else todas = false\n if (estado.partialChecked) {\n alguma = true\n todas = false\n }\n }\n\n if (todas) keys[node.key] = { checked: true, partialChecked: false }\n else if (alguma) keys[node.key] = { checked: false, partialChecked: true }\n return { checked: todas, partialChecked: !todas && alguma }\n }\n\n nodes.forEach(visit)\n return keys\n}\n\n/**\n * Poda a árvore pelo termo de busca, devolvendo CÓPIAS que preservam a `key`.\n *\n * Grupo cujo rótulo casa é mantido inteiro; senão sobram só as folhas que casam.\n * A chave sobrevive à poda de propósito: é ela que reconecta um evento da árvore\n * visível ao nó correspondente da árvore inteira.\n */\nexport function filterTree(\n nodes: readonly TreeSelectNode[],\n term: string,\n extraFields: readonly string[] = [],\n): TreeSelectNode[] {\n const q = normalizeTerm(term).trim()\n if (!q) return [...nodes]\n\n const matches = (node: TreeSelectNode): boolean => {\n if (normalizeTerm(node.label).includes(q)) return true\n return extraFields.some((field) => normalizeTerm(node.data?.[field]).includes(q))\n }\n\n const out: TreeSelectNode[] = []\n for (const node of nodes) {\n if (!node.children?.length) {\n if (matches(node)) out.push(node)\n continue\n }\n if (matches(node)) {\n out.push(node)\n continue\n }\n const children = filterTree(node.children, term, extraFields)\n if (children.length) out.push({ ...node, children })\n }\n return out\n}\n\n/** Adiciona ou remove `ids` do array atual, preservando a ordem e sem duplicar. */\nexport function toggleIds(\n current: readonly TreeSelectId[],\n ids: readonly TreeSelectId[],\n check: boolean,\n): TreeSelectId[] {\n const alvo = new Set<TreeSelectId>(ids)\n if (!check) return (current ?? []).filter((id) => !alvo.has(id))\n\n const out = [...(current ?? [])]\n const existente = new Set<TreeSelectId>(out)\n for (const id of ids) {\n if (!existente.has(id)) {\n existente.add(id)\n out.push(id)\n }\n }\n return out\n}\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport Tree from 'primevue/tree'\nimport InputText from 'primevue/inputtext'\nimport IconField from 'primevue/iconfield'\nimport InputIcon from 'primevue/inputicon'\nimport Button from 'primevue/button'\nimport {\n allLeafValues,\n buildTree,\n collectLeafValues,\n deriveSelectionKeys,\n filterTree,\n indexByKey,\n toggleIds,\n type TreeSelectId,\n type TreeSelectNode,\n type TreeSelectOption,\n} from '@/utils/treeSelect'\n\n/**\n * Seleção múltipla em árvore com checkbox, alimentada por uma lista PLANA + um\n * campo de agrupamento. O `v-model` é um array de ids de FOLHA — nunca o mapa de\n * chaves do PrimeVue, e nunca com id de grupo dentro (grupo é só visual).\n *\n * ---------------------------------------------------------------------------\n * POR QUE A SELEÇÃO É DERIVADA AQUI E NÃO DELEGADA AO `Tree` — NÃO \"SIMPLIFIQUE\"\n * ---------------------------------------------------------------------------\n * O `Tree` com `selectionMode=\"checkbox\"` sabe manter sozinho o mapa\n * `{ chave: { checked, partialChecked } }`, propagando para pais e filhos. Trocar\n * o que está aqui por um `v-model:selectionKeys` parece uma simplificação óbvia.\n * Não é: existe um bug ABERTO que quebra exatamente a combinação que usamos\n * (checkbox + filtro).\n *\n * https://github.com/primefaces/primevue/issues/6928 (aberta, \"Help Wanted\")\n *\n * Com o filtro ativo, o `partialChecked` dos ancestrais passa a se referir à\n * árvore FILTRADA em vez da árvore inteira. O mecanismo está no código do\n * PrimeVue 4.5: `TreeNode.propagateUp()` conta `this.node.children`, e sob filtro\n * `this.node` é uma CÓPIA que o `findFilteredNodes()` produziu contendo só os\n * filhos que casaram com a busca. Um grupo com 12 telas, 3 marcadas e filtro\n * mostrando só essas 3 aparece como totalmente marcado — e ao salvar o usuário\n * marca o que não queria.\n *\n * O repositório do PrimeVue foi arquivado em junho/2026 e está read-only: não vai\n * ser corrigido upstream.\n *\n * Por isso, aqui:\n * 1. a fonte da verdade é o `modelValue` (ids de folha) — sem estado espelhado;\n * 2. o `selectionKeys` é DERIVADO sobre a árvore INTEIRA (`fullTree`), nunca\n * sobre a visão filtrada, então é correto por construção;\n * 3. o `Tree` recebe `:selection-keys` como prop CONTROLADA (não `v-model:`) —\n * o mapa que ele calcularia é simplesmente descartado.\n *\n * Escolha do evento: `node-select` / `node-unselect`, e não `update:selectionKeys`.\n * Os dois saem do mesmo `onCheckboxChange` do `Tree`, mas carregam coisas\n * diferentes: `update:selectionKeys` entrega o mapa JÁ PROPAGADO (o resultado do\n * `propagateUp` bugado), enquanto `node-select`/`node-unselect` entregam só o nó\n * clicado e a direção do clique — a intenção crua do usuário, que nenhuma conta\n * do PrimeVue tocou. É o único ponto estável da API para este caso.\n *\n * Detalhe que fecha o cerco: sob filtro o nó do evento é uma cópia podada, então\n * ler `event.node.children` alternaria só as folhas VISÍVEIS. Resolvemos o nó\n * pela `key` dentro do índice da árvore inteira (`fullIndex`) e alternamos todas\n * as folhas dele — o mesmo resultado com ou sem filtro na tela.\n */\nconst props = withDefaults(\n defineProps<{\n /** Ids das folhas selecionadas (`v-model`). Nunca contém id de grupo. */\n modelValue?: TreeSelectId[]\n /** Lista PLANA de registros. O agrupamento é feito aqui, por `groupBy`. */\n options?: TreeSelectOption[]\n /** Campo do id da folha (default: `id`). */\n optionValue?: string\n /** Campo do rótulo visível (default: `nome`). */\n optionLabel?: string\n /** Campo que agrupa os registros. Sem ele, a lista sai rasa. */\n groupBy?: string\n /** Rótulo do nó-pai a partir do valor bruto do agrupamento. */\n groupLabel?: (chave: string) => string\n /** Campo de busca interno. */\n filter?: boolean\n filterPlaceholder?: string\n /** Campos extras do registro considerados na busca (além do rótulo). */\n filterFields?: string[]\n loading?: boolean\n disabled?: boolean\n /** Texto quando não há nenhuma opção. */\n emptyMessage?: string\n /** Texto quando a busca não encontrou nada. */\n filterEmptyMessage?: string\n /** Contador `N de M selecionados` acima da árvore. */\n showCount?: boolean\n /** Atalhos \"Marcar todos\" / \"Limpar\". */\n showToggleAll?: boolean\n /** Abre todos os grupos na montagem. */\n defaultExpanded?: boolean\n ariaLabel?: string\n }>(),\n {\n modelValue: () => [],\n options: () => [],\n optionValue: 'id',\n optionLabel: 'nome',\n filter: false,\n filterPlaceholder: 'Buscar...',\n filterFields: () => [],\n loading: false,\n disabled: false,\n emptyMessage: 'Nenhum item disponível',\n filterEmptyMessage: 'Nenhum item encontrado',\n showCount: true,\n showToggleAll: true,\n defaultExpanded: false,\n },\n)\n\nconst emit = defineEmits<{ 'update:modelValue': [ids: TreeSelectId[]] }>()\n\nconst term = ref('')\nconst expandedKeys = ref<Record<string, boolean>>({})\n\n/** Árvore inteira — a única base válida para derivar estado. */\nconst fullTree = computed(() =>\n buildTree(props.options, {\n optionValue: props.optionValue,\n optionLabel: props.optionLabel,\n groupBy: props.groupBy,\n groupLabel: props.groupLabel,\n }),\n)\n\n/** Índice `key → nó` da árvore inteira; traduz evento da árvore visível em ids. */\nconst fullIndex = computed(() => indexByKey(fullTree.value))\n\nconst isFiltering = computed(() => props.filter && term.value.trim().length > 0)\n\n/** O que aparece na tela. Só isto é filtrado — o estado, nunca. */\nconst visibleTree = computed(() =>\n isFiltering.value ? filterTree(fullTree.value, term.value, props.filterFields) : fullTree.value,\n)\n\n/** Derivado sobre `fullTree`, de propósito. Ver o comentário no topo. */\nconst selectionKeys = computed(() => deriveSelectionKeys(fullTree.value, props.modelValue))\n\nconst totalLeaves = computed(() => allLeafValues(fullTree.value).length)\nconst selectedCount = computed(() => {\n const validos = new Set(allLeafValues(fullTree.value))\n return props.modelValue.filter((id) => validos.has(id)).length\n})\n\nconst showHeader = computed(\n () => (props.showCount || props.showToggleAll) && (totalLeaves.value > 0 || props.loading),\n)\nconst isEmpty = computed(() => !props.loading && visibleTree.value.length === 0)\nconst emptyText = computed(() =>\n isFiltering.value ? props.filterEmptyMessage : props.emptyMessage,\n)\n\nfunction expandFrom(nodes: readonly TreeSelectNode[]) {\n const next = { ...expandedKeys.value }\n for (const node of nodes) if (node.children?.length) next[node.key] = true\n expandedKeys.value = next\n}\n\n// `immediate` porque `options` costuma chegar de uma request DEPOIS da montagem:\n// expandir só no setup deixaria a árvore fechada justamente no caso mais comum.\n// Cada grupo é aberto no máximo uma vez, então grupo que o usuário fechou na mão\n// não reabre sozinho se a lista for recarregada.\nconst jaAbertos = new Set<string>()\nwatch(\n fullTree,\n (nodes) => {\n if (!props.defaultExpanded) return\n const novos = nodes.filter((n) => n.children?.length && !jaAbertos.has(n.key))\n if (!novos.length) return\n novos.forEach((n) => jaAbertos.add(n.key))\n expandFrom(novos)\n },\n { immediate: true },\n)\n\n// Buscar sem abrir os grupos que casaram esconderia o resultado atrás de um\n// nó fechado. Ao limpar, a expansão do usuário fica como estava.\nwatch(term, (valor) => {\n if (valor.trim()) expandFrom(visibleTree.value)\n})\n\n/**\n * Traduz o clique num nó (grupo ou folha) para ids de folha.\n * Resolve pela `key` no índice da árvore INTEIRA — `node` pode ser uma cópia\n * podada pelo filtro, com menos filhos do que o grupo realmente tem.\n */\nfunction onNodeToggle(node: TreeSelectNode, check: boolean) {\n if (props.disabled) return\n const completo = fullIndex.value.get(node.key)\n if (!completo) return\n emit('update:modelValue', toggleIds(props.modelValue, collectLeafValues(completo), check))\n}\n\nfunction selectAll() {\n if (props.disabled) return\n emit('update:modelValue', allLeafValues(fullTree.value))\n}\n\nfunction clearAll() {\n if (props.disabled) return\n emit('update:modelValue', [])\n}\n</script>\n\n<template>\n <div class=\"w-tree-select\" :class=\"{ 'w-tree-select--disabled': disabled }\">\n <slot name=\"header\" :selected-count=\"selectedCount\" :total=\"totalLeaves\">\n <div v-if=\"showHeader\" class=\"w-tree-select__head\">\n <span v-if=\"showCount\" class=\"w-tree-select__count\">\n {{ selectedCount }} de {{ totalLeaves }} selecionados\n </span>\n <span v-else />\n <div v-if=\"showToggleAll\" class=\"w-tree-select__actions\">\n <Button\n type=\"button\"\n label=\"Marcar todos\"\n text\n data-kbd-skip\n tabindex=\"-1\"\n :disabled=\"disabled || selectedCount === totalLeaves || !totalLeaves\"\n @click=\"selectAll\"\n />\n <Button\n type=\"button\"\n label=\"Limpar\"\n text\n data-kbd-skip\n tabindex=\"-1\"\n :disabled=\"disabled || !selectedCount\"\n @click=\"clearAll\"\n />\n </div>\n </div>\n </slot>\n\n <IconField v-if=\"filter\" class=\"w-tree-select__filter\">\n <InputIcon class=\"pi pi-search\" />\n <InputText\n v-model=\"term\"\n :placeholder=\"filterPlaceholder\"\n :disabled=\"disabled\"\n :aria-label=\"filterPlaceholder\"\n data-kbd-skip\n fluid\n />\n </IconField>\n\n <Tree\n v-if=\"!isEmpty\"\n :value=\"visibleTree\"\n selection-mode=\"checkbox\"\n :selection-keys=\"selectionKeys\"\n :expanded-keys=\"expandedKeys\"\n :loading=\"loading\"\n :aria-label=\"ariaLabel\"\n class=\"w-tree-select__tree\"\n @update:expanded-keys=\"expandedKeys = $event\"\n @node-select=\"onNodeToggle($event as TreeSelectNode, true)\"\n @node-unselect=\"onNodeToggle($event as TreeSelectNode, false)\"\n >\n <template #default=\"slotProps\">\n <slot name=\"node\" :node=\"slotProps.node as TreeSelectNode\">\n {{ (slotProps.node as TreeSelectNode).label }}\n </slot>\n </template>\n </Tree>\n\n <div v-else class=\"w-tree-select__empty\">\n <slot name=\"empty\" :filtering=\"isFiltering\">{{ emptyText }}</slot>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport Tag from 'primevue/tag'\n\nexport interface StatusMapping {\n label: string\n severity: string\n}\n\nconst props = withDefaults(\n defineProps<{\n value: string\n map?: Record<string, StatusMapping>\n }>(),\n {},\n)\n\nconst defaultMap: Record<string, StatusMapping> = {\n ativo: { label: 'Ativo', severity: 'success' },\n ativa: { label: 'Ativa', severity: 'success' },\n inativo: { label: 'Inativo', severity: 'danger' },\n inativa: { label: 'Inativa', severity: 'danger' },\n suspensa: { label: 'Suspensa', severity: 'warn' },\n suspenso: { label: 'Suspenso', severity: 'warn' },\n cancelada: { label: 'Cancelada', severity: 'danger' },\n cancelado: { label: 'Cancelado', severity: 'danger' },\n pendente: { label: 'Pendente', severity: 'warn' },\n confirmada: { label: 'Confirmada', severity: 'success' },\n confirmado: { label: 'Confirmado', severity: 'success' },\n vencida: { label: 'Vencida', severity: 'danger' },\n vencido: { label: 'Vencido', severity: 'danger' },\n concluido: { label: 'Concluído', severity: 'success' },\n concluida: { label: 'Concluída', severity: 'success' },\n em_progresso: { label: 'Em Progresso', severity: 'info' },\n em_andamento: { label: 'Em Andamento', severity: 'info' },\n expirado: { label: 'Expirado', severity: 'secondary' },\n expirada: { label: 'Expirada', severity: 'secondary' },\n aberto: { label: 'Aberto', severity: 'info' },\n aberta: { label: 'Aberta', severity: 'info' },\n fechado: { label: 'Fechado', severity: 'secondary' },\n fechada: { label: 'Fechada', severity: 'secondary' },\n pago: { label: 'Pago', severity: 'success' },\n paga: { label: 'Paga', severity: 'success' },\n inadimplente: { label: 'Inadimplente', severity: 'danger' },\n}\n\nconst statusInfo = computed(() => {\n const mapping = props.map ?? defaultMap\n return mapping[props.value] ?? { label: props.value, severity: 'secondary' }\n})\n</script>\n\n<template>\n <Tag :value=\"statusInfo.label\" :severity=\"statusInfo.severity as any\" />\n</template>\n","<script setup lang=\"ts\">\nimport Button from 'primevue/button'\n\ndefineProps<{\n title: string\n subtitle?: string\n actionLabel?: string\n actionIcon?: string\n}>()\n\nconst emit = defineEmits<{\n action: []\n}>()\n</script>\n\n<template>\n <div class=\"w-page-header\">\n <div class=\"w-page-header-content\">\n <h2 class=\"w-page-header-title\">{{ title }}</h2>\n <p v-if=\"subtitle\" class=\"w-page-header-subtitle\">{{ subtitle }}</p>\n </div>\n <div class=\"w-page-header-actions\">\n <slot name=\"actions\" />\n <Button v-if=\"actionLabel\" :label=\"actionLabel\" :icon=\"actionIcon\" @click=\"emit('action')\" />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport Button from 'primevue/button'\n\ndefineProps<{\n icon: string\n title: string\n description?: string\n actionLabel?: string\n actionIcon?: string\n}>()\n\nconst emit = defineEmits<{\n action: []\n}>()\n</script>\n\n<template>\n <div class=\"w-empty-state\">\n <div class=\"w-empty-state-icon\">\n <i :class=\"icon\" />\n </div>\n <p class=\"w-empty-state-title\">{{ title }}</p>\n <p v-if=\"description\" class=\"w-empty-state-description\">{{ description }}</p>\n <Button\n v-if=\"actionLabel\"\n :label=\"actionLabel\"\n :icon=\"actionIcon\"\n size=\"small\"\n class=\"mt-3\"\n @click=\"emit('action')\"\n />\n </div>\n</template>\n","/*!\n * vue-router v4.6.4\n * (c) 2025 Eduardo San Martin Morote\n * @license MIT\n */\nimport { getCurrentInstance, inject, onActivated, onDeactivated, onUnmounted, watch } from \"vue\";\nimport { setupDevtoolsPlugin } from \"@vue/devtools-api\";\n\n//#region src/utils/env.ts\nconst isBrowser = typeof document !== \"undefined\";\n\n//#endregion\n//#region src/utils/index.ts\n/**\n* Identity function that returns the value as is.\n*\n* @param v - the value to return\n*\n* @internal\n*/\nconst identityFn = (v) => v;\n/**\n* Allows differentiating lazy components from functional components and vue-class-component\n* @internal\n*\n* @param component\n*/\nfunction isRouteComponent(component) {\n\treturn typeof component === \"object\" || \"displayName\" in component || \"props\" in component || \"__vccOpts\" in component;\n}\nfunction isESModule(obj) {\n\treturn obj.__esModule || obj[Symbol.toStringTag] === \"Module\" || obj.default && isRouteComponent(obj.default);\n}\nconst assign = Object.assign;\nfunction applyToParams(fn, params) {\n\tconst newParams = {};\n\tfor (const key in params) {\n\t\tconst value = params[key];\n\t\tnewParams[key] = isArray(value) ? value.map(fn) : fn(value);\n\t}\n\treturn newParams;\n}\nconst noop = () => {};\n/**\n* Typesafe alternative to Array.isArray\n* https://github.com/microsoft/TypeScript/pull/48228\n*\n* @internal\n*/\nconst isArray = Array.isArray;\nfunction mergeOptions(defaults, partialOptions) {\n\tconst options = {};\n\tfor (const key in defaults) options[key] = key in partialOptions ? partialOptions[key] : defaults[key];\n\treturn options;\n}\n\n//#endregion\n//#region src/warning.ts\nfunction warn$1(msg) {\n\tconst args = Array.from(arguments).slice(1);\n\tconsole.warn.apply(console, [\"[Vue Router warn]: \" + msg].concat(args));\n}\n\n//#endregion\n//#region src/encoding.ts\n/**\n* Encoding Rules (␣ = Space)\n* - Path: ␣ \" < > # ? { }\n* - Query: ␣ \" < > # & =\n* - Hash: ␣ \" < > `\n*\n* On top of that, the RFC3986 (https://tools.ietf.org/html/rfc3986#section-2.2)\n* defines some extra characters to be encoded. Most browsers do not encode them\n* in encodeURI https://github.com/whatwg/url/issues/369, so it may be safer to\n* also encode `!'()*`. Leaving un-encoded only ASCII alphanumeric(`a-zA-Z0-9`)\n* plus `-._~`. This extra safety should be applied to query by patching the\n* string returned by encodeURIComponent encodeURI also encodes `[\\]^`. `\\`\n* should be encoded to avoid ambiguity. Browsers (IE, FF, C) transform a `\\`\n* into a `/` if directly typed in. The _backtick_ (`````) should also be\n* encoded everywhere because some browsers like FF encode it when directly\n* written while others don't. Safari and IE don't encode ``\"<>{}``` in hash.\n*/\nconst HASH_RE = /#/g;\nconst AMPERSAND_RE = /&/g;\nconst SLASH_RE = /\\//g;\nconst EQUAL_RE = /=/g;\nconst IM_RE = /\\?/g;\nconst PLUS_RE = /\\+/g;\n/**\n* NOTE: It's not clear to me if we should encode the + symbol in queries, it\n* seems to be less flexible than not doing so and I can't find out the legacy\n* systems requiring this for regular requests like text/html. In the standard,\n* the encoding of the plus character is only mentioned for\n* application/x-www-form-urlencoded\n* (https://url.spec.whatwg.org/#urlencoded-parsing) and most browsers seems lo\n* leave the plus character as is in queries. To be more flexible, we allow the\n* plus character on the query, but it can also be manually encoded by the user.\n*\n* Resources:\n* - https://url.spec.whatwg.org/#urlencoded-parsing\n* - https://stackoverflow.com/questions/1634271/url-encoding-the-space-character-or-20\n*/\nconst ENC_BRACKET_OPEN_RE = /%5B/g;\nconst ENC_BRACKET_CLOSE_RE = /%5D/g;\nconst ENC_CARET_RE = /%5E/g;\nconst ENC_BACKTICK_RE = /%60/g;\nconst ENC_CURLY_OPEN_RE = /%7B/g;\nconst ENC_PIPE_RE = /%7C/g;\nconst ENC_CURLY_CLOSE_RE = /%7D/g;\nconst ENC_SPACE_RE = /%20/g;\n/**\n* Encode characters that need to be encoded on the path, search and hash\n* sections of the URL.\n*\n* @internal\n* @param text - string to encode\n* @returns encoded string\n*/\nfunction commonEncode(text) {\n\treturn text == null ? \"\" : encodeURI(\"\" + text).replace(ENC_PIPE_RE, \"|\").replace(ENC_BRACKET_OPEN_RE, \"[\").replace(ENC_BRACKET_CLOSE_RE, \"]\");\n}\n/**\n* Encode characters that need to be encoded on the hash section of the URL.\n*\n* @param text - string to encode\n* @returns encoded string\n*/\nfunction encodeHash(text) {\n\treturn commonEncode(text).replace(ENC_CURLY_OPEN_RE, \"{\").replace(ENC_CURLY_CLOSE_RE, \"}\").replace(ENC_CARET_RE, \"^\");\n}\n/**\n* Encode characters that need to be encoded query values on the query\n* section of the URL.\n*\n* @param text - string to encode\n* @returns encoded string\n*/\nfunction encodeQueryValue(text) {\n\treturn commonEncode(text).replace(PLUS_RE, \"%2B\").replace(ENC_SPACE_RE, \"+\").replace(HASH_RE, \"%23\").replace(AMPERSAND_RE, \"%26\").replace(ENC_BACKTICK_RE, \"`\").replace(ENC_CURLY_OPEN_RE, \"{\").replace(ENC_CURLY_CLOSE_RE, \"}\").replace(ENC_CARET_RE, \"^\");\n}\n/**\n* Like `encodeQueryValue` but also encodes the `=` character.\n*\n* @param text - string to encode\n*/\nfunction encodeQueryKey(text) {\n\treturn encodeQueryValue(text).replace(EQUAL_RE, \"%3D\");\n}\n/**\n* Encode characters that need to be encoded on the path section of the URL.\n*\n* @param text - string to encode\n* @returns encoded string\n*/\nfunction encodePath(text) {\n\treturn commonEncode(text).replace(HASH_RE, \"%23\").replace(IM_RE, \"%3F\");\n}\n/**\n* Encode characters that need to be encoded on the path section of the URL as a\n* param. This function encodes everything {@link encodePath} does plus the\n* slash (`/`) character. If `text` is `null` or `undefined`, returns an empty\n* string instead.\n*\n* @param text - string to encode\n* @returns encoded string\n*/\nfunction encodeParam(text) {\n\treturn encodePath(text).replace(SLASH_RE, \"%2F\");\n}\nfunction decode(text) {\n\tif (text == null) return null;\n\ttry {\n\t\treturn decodeURIComponent(\"\" + text);\n\t} catch (err) {\n\t\tprocess.env.NODE_ENV !== \"production\" && warn$1(`Error decoding \"${text}\". Using original value`);\n\t}\n\treturn \"\" + text;\n}\n\n//#endregion\n//#region src/location.ts\nconst TRAILING_SLASH_RE = /\\/$/;\nconst removeTrailingSlash = (path) => path.replace(TRAILING_SLASH_RE, \"\");\n/**\n* Transforms a URI into a normalized history location\n*\n* @param parseQuery\n* @param location - URI to normalize\n* @param currentLocation - current absolute location. Allows resolving relative\n* paths. Must start with `/`. Defaults to `/`\n* @returns a normalized history location\n*/\nfunction parseURL(parseQuery$1, location, currentLocation = \"/\") {\n\tlet path, query = {}, searchString = \"\", hash = \"\";\n\tconst hashPos = location.indexOf(\"#\");\n\tlet searchPos = location.indexOf(\"?\");\n\tsearchPos = hashPos >= 0 && searchPos > hashPos ? -1 : searchPos;\n\tif (searchPos >= 0) {\n\t\tpath = location.slice(0, searchPos);\n\t\tsearchString = location.slice(searchPos, hashPos > 0 ? hashPos : location.length);\n\t\tquery = parseQuery$1(searchString.slice(1));\n\t}\n\tif (hashPos >= 0) {\n\t\tpath = path || location.slice(0, hashPos);\n\t\thash = location.slice(hashPos, location.length);\n\t}\n\tpath = resolveRelativePath(path != null ? path : location, currentLocation);\n\treturn {\n\t\tfullPath: path + searchString + hash,\n\t\tpath,\n\t\tquery,\n\t\thash: decode(hash)\n\t};\n}\nfunction NEW_stringifyURL(stringifyQuery$1, path, query, hash = \"\") {\n\tconst searchText = stringifyQuery$1(query);\n\treturn path + (searchText && \"?\") + searchText + encodeHash(hash);\n}\n/**\n* Stringifies a URL object\n*\n* @param stringifyQuery\n* @param location\n*/\nfunction stringifyURL(stringifyQuery$1, location) {\n\tconst query = location.query ? stringifyQuery$1(location.query) : \"\";\n\treturn location.path + (query && \"?\") + query + (location.hash || \"\");\n}\n/**\n* Strips off the base from the beginning of a location.pathname in a non-case-sensitive way.\n*\n* @param pathname - location.pathname\n* @param base - base to strip off\n*/\nfunction stripBase(pathname, base) {\n\tif (!base || !pathname.toLowerCase().startsWith(base.toLowerCase())) return pathname;\n\treturn pathname.slice(base.length) || \"/\";\n}\n/**\n* Checks if two RouteLocation are equal. This means that both locations are\n* pointing towards the same {@link RouteRecord} and that all `params`, `query`\n* parameters and `hash` are the same\n*\n* @param stringifyQuery - A function that takes a query object of type LocationQueryRaw and returns a string representation of it.\n* @param a - first {@link RouteLocation}\n* @param b - second {@link RouteLocation}\n*/\nfunction isSameRouteLocation(stringifyQuery$1, a, b) {\n\tconst aLastIndex = a.matched.length - 1;\n\tconst bLastIndex = b.matched.length - 1;\n\treturn aLastIndex > -1 && aLastIndex === bLastIndex && isSameRouteRecord(a.matched[aLastIndex], b.matched[bLastIndex]) && isSameRouteLocationParams(a.params, b.params) && stringifyQuery$1(a.query) === stringifyQuery$1(b.query) && a.hash === b.hash;\n}\n/**\n* Check if two `RouteRecords` are equal. Takes into account aliases: they are\n* considered equal to the `RouteRecord` they are aliasing.\n*\n* @param a - first {@link RouteRecord}\n* @param b - second {@link RouteRecord}\n*/\nfunction isSameRouteRecord(a, b) {\n\treturn (a.aliasOf || a) === (b.aliasOf || b);\n}\nfunction isSameRouteLocationParams(a, b) {\n\tif (Object.keys(a).length !== Object.keys(b).length) return false;\n\tfor (var key in a) if (!isSameRouteLocationParamsValue(a[key], b[key])) return false;\n\treturn true;\n}\nfunction isSameRouteLocationParamsValue(a, b) {\n\treturn isArray(a) ? isEquivalentArray(a, b) : isArray(b) ? isEquivalentArray(b, a) : a?.valueOf() === b?.valueOf();\n}\n/**\n* Check if two arrays are the same or if an array with one single entry is the\n* same as another primitive value. Used to check query and parameters\n*\n* @param a - array of values\n* @param b - array of values or a single value\n*/\nfunction isEquivalentArray(a, b) {\n\treturn isArray(b) ? a.length === b.length && a.every((value, i) => value === b[i]) : a.length === 1 && a[0] === b;\n}\n/**\n* Resolves a relative path that starts with `.`.\n*\n* @param to - path location we are resolving\n* @param from - currentLocation.path, should start with `/`\n*/\nfunction resolveRelativePath(to, from) {\n\tif (to.startsWith(\"/\")) return to;\n\tif (process.env.NODE_ENV !== \"production\" && !from.startsWith(\"/\")) {\n\t\twarn$1(`Cannot resolve a relative location without an absolute path. Trying to resolve \"${to}\" from \"${from}\". It should look like \"/${from}\".`);\n\t\treturn to;\n\t}\n\tif (!to) return from;\n\tconst fromSegments = from.split(\"/\");\n\tconst toSegments = to.split(\"/\");\n\tconst lastToSegment = toSegments[toSegments.length - 1];\n\tif (lastToSegment === \"..\" || lastToSegment === \".\") toSegments.push(\"\");\n\tlet position = fromSegments.length - 1;\n\tlet toPosition;\n\tlet segment;\n\tfor (toPosition = 0; toPosition < toSegments.length; toPosition++) {\n\t\tsegment = toSegments[toPosition];\n\t\tif (segment === \".\") continue;\n\t\tif (segment === \"..\") {\n\t\t\tif (position > 1) position--;\n\t\t} else break;\n\t}\n\treturn fromSegments.slice(0, position).join(\"/\") + \"/\" + toSegments.slice(toPosition).join(\"/\");\n}\n/**\n* Initial route location where the router is. Can be used in navigation guards\n* to differentiate the initial navigation.\n*\n* @example\n* ```js\n* import { START_LOCATION } from 'vue-router'\n*\n* router.beforeEach((to, from) => {\n* if (from === START_LOCATION) {\n* // initial navigation\n* }\n* })\n* ```\n*/\nconst START_LOCATION_NORMALIZED = {\n\tpath: \"/\",\n\tname: void 0,\n\tparams: {},\n\tquery: {},\n\thash: \"\",\n\tfullPath: \"/\",\n\tmatched: [],\n\tmeta: {},\n\tredirectedFrom: void 0\n};\n\n//#endregion\n//#region src/history/common.ts\nlet NavigationType = /* @__PURE__ */ function(NavigationType$1) {\n\tNavigationType$1[\"pop\"] = \"pop\";\n\tNavigationType$1[\"push\"] = \"push\";\n\treturn NavigationType$1;\n}({});\nlet NavigationDirection = /* @__PURE__ */ function(NavigationDirection$1) {\n\tNavigationDirection$1[\"back\"] = \"back\";\n\tNavigationDirection$1[\"forward\"] = \"forward\";\n\tNavigationDirection$1[\"unknown\"] = \"\";\n\treturn NavigationDirection$1;\n}({});\n/**\n* Starting location for Histories\n*/\nconst START = \"\";\n/**\n* Normalizes a base by removing any trailing slash and reading the base tag if\n* present.\n*\n* @param base - base to normalize\n*/\nfunction normalizeBase(base) {\n\tif (!base) if (isBrowser) {\n\t\tconst baseEl = document.querySelector(\"base\");\n\t\tbase = baseEl && baseEl.getAttribute(\"href\") || \"/\";\n\t\tbase = base.replace(/^\\w+:\\/\\/[^\\/]+/, \"\");\n\t} else base = \"/\";\n\tif (base[0] !== \"/\" && base[0] !== \"#\") base = \"/\" + base;\n\treturn removeTrailingSlash(base);\n}\nconst BEFORE_HASH_RE = /^[^#]+#/;\nfunction createHref(base, location) {\n\treturn base.replace(BEFORE_HASH_RE, \"#\") + location;\n}\n\n//#endregion\n//#region src/scrollBehavior.ts\nfunction getElementPosition(el, offset) {\n\tconst docRect = document.documentElement.getBoundingClientRect();\n\tconst elRect = el.getBoundingClientRect();\n\treturn {\n\t\tbehavior: offset.behavior,\n\t\tleft: elRect.left - docRect.left - (offset.left || 0),\n\t\ttop: elRect.top - docRect.top - (offset.top || 0)\n\t};\n}\nconst computeScrollPosition = () => ({\n\tleft: window.scrollX,\n\ttop: window.scrollY\n});\nfunction scrollToPosition(position) {\n\tlet scrollToOptions;\n\tif (\"el\" in position) {\n\t\tconst positionEl = position.el;\n\t\tconst isIdSelector = typeof positionEl === \"string\" && positionEl.startsWith(\"#\");\n\t\t/**\n\t\t* `id`s can accept pretty much any characters, including CSS combinators\n\t\t* like `>` or `~`. It's still possible to retrieve elements using\n\t\t* `document.getElementById('~')` but it needs to be escaped when using\n\t\t* `document.querySelector('#\\\\~')` for it to be valid. The only\n\t\t* requirements for `id`s are them to be unique on the page and to not be\n\t\t* empty (`id=\"\"`). Because of that, when passing an id selector, it should\n\t\t* be properly escaped for it to work with `querySelector`. We could check\n\t\t* for the id selector to be simple (no CSS combinators `+ >~`) but that\n\t\t* would make things inconsistent since they are valid characters for an\n\t\t* `id` but would need to be escaped when using `querySelector`, breaking\n\t\t* their usage and ending up in no selector returned. Selectors need to be\n\t\t* escaped:\n\t\t*\n\t\t* - `#1-thing` becomes `#\\31 -thing`\n\t\t* - `#with~symbols` becomes `#with\\\\~symbols`\n\t\t*\n\t\t* - More information about the topic can be found at\n\t\t* https://mathiasbynens.be/notes/html5-id-class.\n\t\t* - Practical example: https://mathiasbynens.be/demo/html5-id\n\t\t*/\n\t\tif (process.env.NODE_ENV !== \"production\" && typeof position.el === \"string\") {\n\t\t\tif (!isIdSelector || !document.getElementById(position.el.slice(1))) try {\n\t\t\t\tconst foundEl = document.querySelector(position.el);\n\t\t\t\tif (isIdSelector && foundEl) {\n\t\t\t\t\twarn$1(`The selector \"${position.el}\" should be passed as \"el: document.querySelector('${position.el}')\" because it starts with \"#\".`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\twarn$1(`The selector \"${position.el}\" is invalid. If you are using an id selector, make sure to escape it. You can find more information about escaping characters in selectors at https://mathiasbynens.be/notes/css-escapes or use CSS.escape (https://developer.mozilla.org/en-US/docs/Web/API/CSS/escape).`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tconst el = typeof positionEl === \"string\" ? isIdSelector ? document.getElementById(positionEl.slice(1)) : document.querySelector(positionEl) : positionEl;\n\t\tif (!el) {\n\t\t\tprocess.env.NODE_ENV !== \"production\" && warn$1(`Couldn't find element using selector \"${position.el}\" returned by scrollBehavior.`);\n\t\t\treturn;\n\t\t}\n\t\tscrollToOptions = getElementPosition(el, position);\n\t} else scrollToOptions = position;\n\tif (\"scrollBehavior\" in document.documentElement.style) window.scrollTo(scrollToOptions);\n\telse window.scrollTo(scrollToOptions.left != null ? scrollToOptions.left : window.scrollX, scrollToOptions.top != null ? scrollToOptions.top : window.scrollY);\n}\nfunction getScrollKey(path, delta) {\n\treturn (history.state ? history.state.position - delta : -1) + path;\n}\nconst scrollPositions = /* @__PURE__ */ new Map();\nfunction saveScrollPosition(key, scrollPosition) {\n\tscrollPositions.set(key, scrollPosition);\n}\nfunction getSavedScrollPosition(key) {\n\tconst scroll = scrollPositions.get(key);\n\tscrollPositions.delete(key);\n\treturn scroll;\n}\n/**\n* ScrollBehavior instance used by the router to compute and restore the scroll\n* position when navigating.\n*/\n\n//#endregion\n//#region src/types/typeGuards.ts\nfunction isRouteLocation(route) {\n\treturn typeof route === \"string\" || route && typeof route === \"object\";\n}\nfunction isRouteName(name) {\n\treturn typeof name === \"string\" || typeof name === \"symbol\";\n}\n\n//#endregion\n//#region src/errors.ts\n/**\n* Flags so we can combine them when checking for multiple errors. This is the internal version of\n* {@link NavigationFailureType}.\n*\n* @internal\n*/\nlet ErrorTypes = /* @__PURE__ */ function(ErrorTypes$1) {\n\tErrorTypes$1[ErrorTypes$1[\"MATCHER_NOT_FOUND\"] = 1] = \"MATCHER_NOT_FOUND\";\n\tErrorTypes$1[ErrorTypes$1[\"NAVIGATION_GUARD_REDIRECT\"] = 2] = \"NAVIGATION_GUARD_REDIRECT\";\n\tErrorTypes$1[ErrorTypes$1[\"NAVIGATION_ABORTED\"] = 4] = \"NAVIGATION_ABORTED\";\n\tErrorTypes$1[ErrorTypes$1[\"NAVIGATION_CANCELLED\"] = 8] = \"NAVIGATION_CANCELLED\";\n\tErrorTypes$1[ErrorTypes$1[\"NAVIGATION_DUPLICATED\"] = 16] = \"NAVIGATION_DUPLICATED\";\n\treturn ErrorTypes$1;\n}({});\nconst NavigationFailureSymbol = Symbol(process.env.NODE_ENV !== \"production\" ? \"navigation failure\" : \"\");\n/**\n* Enumeration with all possible types for navigation failures. Can be passed to\n* {@link isNavigationFailure} to check for specific failures.\n*/\nlet NavigationFailureType = /* @__PURE__ */ function(NavigationFailureType$1) {\n\t/**\n\t* An aborted navigation is a navigation that failed because a navigation\n\t* guard returned `false` or called `next(false)`\n\t*/\n\tNavigationFailureType$1[NavigationFailureType$1[\"aborted\"] = 4] = \"aborted\";\n\t/**\n\t* A cancelled navigation is a navigation that failed because a more recent\n\t* navigation finished started (not necessarily finished).\n\t*/\n\tNavigationFailureType$1[NavigationFailureType$1[\"cancelled\"] = 8] = \"cancelled\";\n\t/**\n\t* A duplicated navigation is a navigation that failed because it was\n\t* initiated while already being at the exact same location.\n\t*/\n\tNavigationFailureType$1[NavigationFailureType$1[\"duplicated\"] = 16] = \"duplicated\";\n\treturn NavigationFailureType$1;\n}({});\nconst ErrorTypeMessages = {\n\t[ErrorTypes.MATCHER_NOT_FOUND]({ location, currentLocation }) {\n\t\treturn `No match for\\n ${JSON.stringify(location)}${currentLocation ? \"\\nwhile being at\\n\" + JSON.stringify(currentLocation) : \"\"}`;\n\t},\n\t[ErrorTypes.NAVIGATION_GUARD_REDIRECT]({ from, to }) {\n\t\treturn `Redirected from \"${from.fullPath}\" to \"${stringifyRoute(to)}\" via a navigation guard.`;\n\t},\n\t[ErrorTypes.NAVIGATION_ABORTED]({ from, to }) {\n\t\treturn `Navigation aborted from \"${from.fullPath}\" to \"${to.fullPath}\" via a navigation guard.`;\n\t},\n\t[ErrorTypes.NAVIGATION_CANCELLED]({ from, to }) {\n\t\treturn `Navigation cancelled from \"${from.fullPath}\" to \"${to.fullPath}\" with a new navigation.`;\n\t},\n\t[ErrorTypes.NAVIGATION_DUPLICATED]({ from, to }) {\n\t\treturn `Avoided redundant navigation to current location: \"${from.fullPath}\".`;\n\t}\n};\n/**\n* Creates a typed NavigationFailure object.\n* @internal\n* @param type - NavigationFailureType\n* @param params - { from, to }\n*/\nfunction createRouterError(type, params) {\n\tif (process.env.NODE_ENV !== \"production\" || false) return assign(new Error(ErrorTypeMessages[type](params)), {\n\t\ttype,\n\t\t[NavigationFailureSymbol]: true\n\t}, params);\n\telse return assign(/* @__PURE__ */ new Error(), {\n\t\ttype,\n\t\t[NavigationFailureSymbol]: true\n\t}, params);\n}\nfunction isNavigationFailure(error, type) {\n\treturn error instanceof Error && NavigationFailureSymbol in error && (type == null || !!(error.type & type));\n}\nconst propertiesToLog = [\n\t\"params\",\n\t\"query\",\n\t\"hash\"\n];\nfunction stringifyRoute(to) {\n\tif (typeof to === \"string\") return to;\n\tif (to.path != null) return to.path;\n\tconst location = {};\n\tfor (const key of propertiesToLog) if (key in to) location[key] = to[key];\n\treturn JSON.stringify(location, null, 2);\n}\n\n//#endregion\n//#region src/query.ts\n/**\n* Transforms a queryString into a {@link LocationQuery} object. Accept both, a\n* version with the leading `?` and without Should work as URLSearchParams\n\n* @internal\n*\n* @param search - search string to parse\n* @returns a query object\n*/\nfunction parseQuery(search) {\n\tconst query = {};\n\tif (search === \"\" || search === \"?\") return query;\n\tconst searchParams = (search[0] === \"?\" ? search.slice(1) : search).split(\"&\");\n\tfor (let i = 0; i < searchParams.length; ++i) {\n\t\tconst searchParam = searchParams[i].replace(PLUS_RE, \" \");\n\t\tconst eqPos = searchParam.indexOf(\"=\");\n\t\tconst key = decode(eqPos < 0 ? searchParam : searchParam.slice(0, eqPos));\n\t\tconst value = eqPos < 0 ? null : decode(searchParam.slice(eqPos + 1));\n\t\tif (key in query) {\n\t\t\tlet currentValue = query[key];\n\t\t\tif (!isArray(currentValue)) currentValue = query[key] = [currentValue];\n\t\t\tcurrentValue.push(value);\n\t\t} else query[key] = value;\n\t}\n\treturn query;\n}\n/**\n* Stringifies a {@link LocationQueryRaw} object. Like `URLSearchParams`, it\n* doesn't prepend a `?`\n*\n* @internal\n*\n* @param query - query object to stringify\n* @returns string version of the query without the leading `?`\n*/\nfunction stringifyQuery(query) {\n\tlet search = \"\";\n\tfor (let key in query) {\n\t\tconst value = query[key];\n\t\tkey = encodeQueryKey(key);\n\t\tif (value == null) {\n\t\t\tif (value !== void 0) search += (search.length ? \"&\" : \"\") + key;\n\t\t\tcontinue;\n\t\t}\n\t\t(isArray(value) ? value.map((v) => v && encodeQueryValue(v)) : [value && encodeQueryValue(value)]).forEach((value$1) => {\n\t\t\tif (value$1 !== void 0) {\n\t\t\t\tsearch += (search.length ? \"&\" : \"\") + key;\n\t\t\t\tif (value$1 != null) search += \"=\" + value$1;\n\t\t\t}\n\t\t});\n\t}\n\treturn search;\n}\n/**\n* Transforms a {@link LocationQueryRaw} into a {@link LocationQuery} by casting\n* numbers into strings, removing keys with an undefined value and replacing\n* undefined with null in arrays\n*\n* @param query - query object to normalize\n* @returns a normalized query object\n*/\nfunction normalizeQuery(query) {\n\tconst normalizedQuery = {};\n\tfor (const key in query) {\n\t\tconst value = query[key];\n\t\tif (value !== void 0) normalizedQuery[key] = isArray(value) ? value.map((v) => v == null ? null : \"\" + v) : value == null ? value : \"\" + value;\n\t}\n\treturn normalizedQuery;\n}\n\n//#endregion\n//#region src/injectionSymbols.ts\n/**\n* RouteRecord being rendered by the closest ancestor Router View. Used for\n* `onBeforeRouteUpdate` and `onBeforeRouteLeave`. rvlm stands for Router View\n* Location Matched\n*\n* @internal\n*/\nconst matchedRouteKey = Symbol(process.env.NODE_ENV !== \"production\" ? \"router view location matched\" : \"\");\n/**\n* Allows overriding the router view depth to control which component in\n* `matched` is rendered. rvd stands for Router View Depth\n*\n* @internal\n*/\nconst viewDepthKey = Symbol(process.env.NODE_ENV !== \"production\" ? \"router view depth\" : \"\");\n/**\n* Allows overriding the router instance returned by `useRouter` in tests. r\n* stands for router\n*\n* @internal\n*/\nconst routerKey = Symbol(process.env.NODE_ENV !== \"production\" ? \"router\" : \"\");\n/**\n* Allows overriding the current route returned by `useRoute` in tests. rl\n* stands for route location\n*\n* @internal\n*/\nconst routeLocationKey = Symbol(process.env.NODE_ENV !== \"production\" ? \"route location\" : \"\");\n/**\n* Allows overriding the current route used by router-view. Internally this is\n* used when the `route` prop is passed.\n*\n* @internal\n*/\nconst routerViewLocationKey = Symbol(process.env.NODE_ENV !== \"production\" ? \"router view location\" : \"\");\n\n//#endregion\n//#region src/utils/callbacks.ts\n/**\n* Create a list of callbacks that can be reset. Used to create before and after navigation guards list\n*/\nfunction useCallbacks() {\n\tlet handlers = [];\n\tfunction add(handler) {\n\t\thandlers.push(handler);\n\t\treturn () => {\n\t\t\tconst i = handlers.indexOf(handler);\n\t\t\tif (i > -1) handlers.splice(i, 1);\n\t\t};\n\t}\n\tfunction reset() {\n\t\thandlers = [];\n\t}\n\treturn {\n\t\tadd,\n\t\tlist: () => handlers.slice(),\n\t\treset\n\t};\n}\n\n//#endregion\n//#region src/navigationGuards.ts\nfunction registerGuard(record, name, guard) {\n\tconst removeFromList = () => {\n\t\trecord[name].delete(guard);\n\t};\n\tonUnmounted(removeFromList);\n\tonDeactivated(removeFromList);\n\tonActivated(() => {\n\t\trecord[name].add(guard);\n\t});\n\trecord[name].add(guard);\n}\n/**\n* Add a navigation guard that triggers whenever the component for the current\n* location is about to be left. Similar to {@link beforeRouteLeave} but can be\n* used in any component. The guard is removed when the component is unmounted.\n*\n* @param leaveGuard - {@link NavigationGuard}\n*/\nfunction onBeforeRouteLeave(leaveGuard) {\n\tif (process.env.NODE_ENV !== \"production\" && !getCurrentInstance()) {\n\t\twarn$1(\"getCurrentInstance() returned null. onBeforeRouteLeave() must be called at the top of a setup function\");\n\t\treturn;\n\t}\n\tconst activeRecord = inject(matchedRouteKey, {}).value;\n\tif (!activeRecord) {\n\t\tprocess.env.NODE_ENV !== \"production\" && warn$1(\"No active route record was found when calling `onBeforeRouteLeave()`. Make sure you call this function inside a component child of <router-view>. Maybe you called it inside of App.vue?\");\n\t\treturn;\n\t}\n\tregisterGuard(activeRecord, \"leaveGuards\", leaveGuard);\n}\n/**\n* Add a navigation guard that triggers whenever the current location is about\n* to be updated. Similar to {@link beforeRouteUpdate} but can be used in any\n* component. The guard is removed when the component is unmounted.\n*\n* @param updateGuard - {@link NavigationGuard}\n*/\nfunction onBeforeRouteUpdate(updateGuard) {\n\tif (process.env.NODE_ENV !== \"production\" && !getCurrentInstance()) {\n\t\twarn$1(\"getCurrentInstance() returned null. onBeforeRouteUpdate() must be called at the top of a setup function\");\n\t\treturn;\n\t}\n\tconst activeRecord = inject(matchedRouteKey, {}).value;\n\tif (!activeRecord) {\n\t\tprocess.env.NODE_ENV !== \"production\" && warn$1(\"No active route record was found when calling `onBeforeRouteUpdate()`. Make sure you call this function inside a component child of <router-view>. Maybe you called it inside of App.vue?\");\n\t\treturn;\n\t}\n\tregisterGuard(activeRecord, \"updateGuards\", updateGuard);\n}\nfunction guardToPromiseFn(guard, to, from, record, name, runWithContext = (fn) => fn()) {\n\tconst enterCallbackArray = record && (record.enterCallbacks[name] = record.enterCallbacks[name] || []);\n\treturn () => new Promise((resolve, reject) => {\n\t\tconst next = (valid) => {\n\t\t\tif (valid === false) reject(createRouterError(ErrorTypes.NAVIGATION_ABORTED, {\n\t\t\t\tfrom,\n\t\t\t\tto\n\t\t\t}));\n\t\t\telse if (valid instanceof Error) reject(valid);\n\t\t\telse if (isRouteLocation(valid)) reject(createRouterError(ErrorTypes.NAVIGATION_GUARD_REDIRECT, {\n\t\t\t\tfrom: to,\n\t\t\t\tto: valid\n\t\t\t}));\n\t\t\telse {\n\t\t\t\tif (enterCallbackArray && record.enterCallbacks[name] === enterCallbackArray && typeof valid === \"function\") enterCallbackArray.push(valid);\n\t\t\t\tresolve();\n\t\t\t}\n\t\t};\n\t\tconst guardReturn = runWithContext(() => guard.call(record && record.instances[name], to, from, process.env.NODE_ENV !== \"production\" ? canOnlyBeCalledOnce(next, to, from) : next));\n\t\tlet guardCall = Promise.resolve(guardReturn);\n\t\tif (guard.length < 3) guardCall = guardCall.then(next);\n\t\tif (process.env.NODE_ENV !== \"production\" && guard.length > 2) {\n\t\t\tconst message = `The \"next\" callback was never called inside of ${guard.name ? \"\\\"\" + guard.name + \"\\\"\" : \"\"}:\\n${guard.toString()}\\n. If you are returning a value instead of calling \"next\", make sure to remove the \"next\" parameter from your function.`;\n\t\t\tif (typeof guardReturn === \"object\" && \"then\" in guardReturn) guardCall = guardCall.then((resolvedValue) => {\n\t\t\t\tif (!next._called) {\n\t\t\t\t\twarn$1(message);\n\t\t\t\t\treturn Promise.reject(/* @__PURE__ */ new Error(\"Invalid navigation guard\"));\n\t\t\t\t}\n\t\t\t\treturn resolvedValue;\n\t\t\t});\n\t\t\telse if (guardReturn !== void 0) {\n\t\t\t\tif (!next._called) {\n\t\t\t\t\twarn$1(message);\n\t\t\t\t\treject(/* @__PURE__ */ new Error(\"Invalid navigation guard\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tguardCall.catch((err) => reject(err));\n\t});\n}\nfunction canOnlyBeCalledOnce(next, to, from) {\n\tlet called = 0;\n\treturn function() {\n\t\tif (called++ === 1) warn$1(`The \"next\" callback was called more than once in one navigation guard when going from \"${from.fullPath}\" to \"${to.fullPath}\". It should be called exactly one time in each navigation guard. This will fail in production.`);\n\t\tnext._called = true;\n\t\tif (called === 1) next.apply(null, arguments);\n\t};\n}\nfunction extractComponentsGuards(matched, guardType, to, from, runWithContext = (fn) => fn()) {\n\tconst guards = [];\n\tfor (const record of matched) {\n\t\tif (process.env.NODE_ENV !== \"production\" && !record.components && record.children && !record.children.length) warn$1(`Record with path \"${record.path}\" is either missing a \"component(s)\" or \"children\" property.`);\n\t\tfor (const name in record.components) {\n\t\t\tlet rawComponent = record.components[name];\n\t\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\t\tif (!rawComponent || typeof rawComponent !== \"object\" && typeof rawComponent !== \"function\") {\n\t\t\t\t\twarn$1(`Component \"${name}\" in record with path \"${record.path}\" is not a valid component. Received \"${String(rawComponent)}\".`);\n\t\t\t\t\tthrow new Error(\"Invalid route component\");\n\t\t\t\t} else if (\"then\" in rawComponent) {\n\t\t\t\t\twarn$1(`Component \"${name}\" in record with path \"${record.path}\" is a Promise instead of a function that returns a Promise. Did you write \"import('./MyPage.vue')\" instead of \"() => import('./MyPage.vue')\" ? This will break in production if not fixed.`);\n\t\t\t\t\tconst promise = rawComponent;\n\t\t\t\t\trawComponent = () => promise;\n\t\t\t\t} else if (rawComponent.__asyncLoader && !rawComponent.__warnedDefineAsync) {\n\t\t\t\t\trawComponent.__warnedDefineAsync = true;\n\t\t\t\t\twarn$1(`Component \"${name}\" in record with path \"${record.path}\" is defined using \"defineAsyncComponent()\". Write \"() => import('./MyPage.vue')\" instead of \"defineAsyncComponent(() => import('./MyPage.vue'))\".`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (guardType !== \"beforeRouteEnter\" && !record.instances[name]) continue;\n\t\t\tif (isRouteComponent(rawComponent)) {\n\t\t\t\tconst guard = (rawComponent.__vccOpts || rawComponent)[guardType];\n\t\t\t\tguard && guards.push(guardToPromiseFn(guard, to, from, record, name, runWithContext));\n\t\t\t} else {\n\t\t\t\tlet componentPromise = rawComponent();\n\t\t\t\tif (process.env.NODE_ENV !== \"production\" && !(\"catch\" in componentPromise)) {\n\t\t\t\t\twarn$1(`Component \"${name}\" in record with path \"${record.path}\" is a function that does not return a Promise. If you were passing a functional component, make sure to add a \"displayName\" to the component. This will break in production if not fixed.`);\n\t\t\t\t\tcomponentPromise = Promise.resolve(componentPromise);\n\t\t\t\t}\n\t\t\t\tguards.push(() => componentPromise.then((resolved) => {\n\t\t\t\t\tif (!resolved) throw new Error(`Couldn't resolve component \"${name}\" at \"${record.path}\"`);\n\t\t\t\t\tconst resolvedComponent = isESModule(resolved) ? resolved.default : resolved;\n\t\t\t\t\trecord.mods[name] = resolved;\n\t\t\t\t\trecord.components[name] = resolvedComponent;\n\t\t\t\t\tconst guard = (resolvedComponent.__vccOpts || resolvedComponent)[guardType];\n\t\t\t\t\treturn guard && guardToPromiseFn(guard, to, from, record, name, runWithContext)();\n\t\t\t\t}));\n\t\t\t}\n\t\t}\n\t}\n\treturn guards;\n}\n/**\n* Ensures a route is loaded, so it can be passed as o prop to `<RouterView>`.\n*\n* @param route - resolved route to load\n*/\nfunction loadRouteLocation(route) {\n\treturn route.matched.every((record) => record.redirect) ? Promise.reject(/* @__PURE__ */ new Error(\"Cannot load a route that redirects.\")) : Promise.all(route.matched.map((record) => record.components && Promise.all(Object.keys(record.components).reduce((promises, name) => {\n\t\tconst rawComponent = record.components[name];\n\t\tif (typeof rawComponent === \"function\" && !(\"displayName\" in rawComponent)) promises.push(rawComponent().then((resolved) => {\n\t\t\tif (!resolved) return Promise.reject(/* @__PURE__ */ new Error(`Couldn't resolve component \"${name}\" at \"${record.path}\". Ensure you passed a function that returns a promise.`));\n\t\t\tconst resolvedComponent = isESModule(resolved) ? resolved.default : resolved;\n\t\t\trecord.mods[name] = resolved;\n\t\t\trecord.components[name] = resolvedComponent;\n\t\t}));\n\t\treturn promises;\n\t}, [])))).then(() => route);\n}\n/**\n* Split the leaving, updating, and entering records.\n* @internal\n*\n* @param to - Location we are navigating to\n* @param from - Location we are navigating from\n*/\nfunction extractChangingRecords(to, from) {\n\tconst leavingRecords = [];\n\tconst updatingRecords = [];\n\tconst enteringRecords = [];\n\tconst len = Math.max(from.matched.length, to.matched.length);\n\tfor (let i = 0; i < len; i++) {\n\t\tconst recordFrom = from.matched[i];\n\t\tif (recordFrom) if (to.matched.find((record) => isSameRouteRecord(record, recordFrom))) updatingRecords.push(recordFrom);\n\t\telse leavingRecords.push(recordFrom);\n\t\tconst recordTo = to.matched[i];\n\t\tif (recordTo) {\n\t\t\tif (!from.matched.find((record) => isSameRouteRecord(record, recordTo))) enteringRecords.push(recordTo);\n\t\t}\n\t}\n\treturn [\n\t\tleavingRecords,\n\t\tupdatingRecords,\n\t\tenteringRecords\n\t];\n}\n\n//#endregion\n//#region src/devtools.ts\n/**\n* Copies a route location and removes any problematic properties that cannot be shown in devtools (e.g. Vue instances).\n*\n* @param routeLocation - routeLocation to format\n* @param tooltip - optional tooltip\n* @returns a copy of the routeLocation\n*/\nfunction formatRouteLocation(routeLocation, tooltip) {\n\tconst copy = assign({}, routeLocation, { matched: routeLocation.matched.map((matched) => omit(matched, [\n\t\t\"instances\",\n\t\t\"children\",\n\t\t\"aliasOf\"\n\t])) });\n\treturn { _custom: {\n\t\ttype: null,\n\t\treadOnly: true,\n\t\tdisplay: routeLocation.fullPath,\n\t\ttooltip,\n\t\tvalue: copy\n\t} };\n}\nfunction formatDisplay(display) {\n\treturn { _custom: { display } };\n}\nlet routerId = 0;\nfunction addDevtools(app, router, matcher) {\n\tif (router.__hasDevtools) return;\n\trouter.__hasDevtools = true;\n\tconst id = routerId++;\n\tsetupDevtoolsPlugin({\n\t\tid: \"org.vuejs.router\" + (id ? \".\" + id : \"\"),\n\t\tlabel: \"Vue Router\",\n\t\tpackageName: \"vue-router\",\n\t\thomepage: \"https://router.vuejs.org\",\n\t\tlogo: \"https://router.vuejs.org/logo.png\",\n\t\tcomponentStateTypes: [\"Routing\"],\n\t\tapp\n\t}, (api) => {\n\t\tif (typeof api.now !== \"function\") warn$1(\"[Vue Router]: You seem to be using an outdated version of Vue Devtools. Are you still using the Beta release instead of the stable one? You can find the links at https://devtools.vuejs.org/guide/installation.html.\");\n\t\tapi.on.inspectComponent((payload, ctx) => {\n\t\t\tif (payload.instanceData) payload.instanceData.state.push({\n\t\t\t\ttype: \"Routing\",\n\t\t\t\tkey: \"$route\",\n\t\t\t\teditable: false,\n\t\t\t\tvalue: formatRouteLocation(router.currentRoute.value, \"Current Route\")\n\t\t\t});\n\t\t});\n\t\tapi.on.visitComponentTree(({ treeNode: node, componentInstance }) => {\n\t\t\tif (componentInstance.__vrv_devtools) {\n\t\t\t\tconst info = componentInstance.__vrv_devtools;\n\t\t\t\tnode.tags.push({\n\t\t\t\t\tlabel: (info.name ? `${info.name.toString()}: ` : \"\") + info.path,\n\t\t\t\t\ttextColor: 0,\n\t\t\t\t\ttooltip: \"This component is rendered by &lt;router-view&gt;\",\n\t\t\t\t\tbackgroundColor: PINK_500\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (isArray(componentInstance.__vrl_devtools)) {\n\t\t\t\tcomponentInstance.__devtoolsApi = api;\n\t\t\t\tcomponentInstance.__vrl_devtools.forEach((devtoolsData) => {\n\t\t\t\t\tlet label = devtoolsData.route.path;\n\t\t\t\t\tlet backgroundColor = ORANGE_400;\n\t\t\t\t\tlet tooltip = \"\";\n\t\t\t\t\tlet textColor = 0;\n\t\t\t\t\tif (devtoolsData.error) {\n\t\t\t\t\t\tlabel = devtoolsData.error;\n\t\t\t\t\t\tbackgroundColor = RED_100;\n\t\t\t\t\t\ttextColor = RED_700;\n\t\t\t\t\t} else if (devtoolsData.isExactActive) {\n\t\t\t\t\t\tbackgroundColor = LIME_500;\n\t\t\t\t\t\ttooltip = \"This is exactly active\";\n\t\t\t\t\t} else if (devtoolsData.isActive) {\n\t\t\t\t\t\tbackgroundColor = BLUE_600;\n\t\t\t\t\t\ttooltip = \"This link is active\";\n\t\t\t\t\t}\n\t\t\t\t\tnode.tags.push({\n\t\t\t\t\t\tlabel,\n\t\t\t\t\t\ttextColor,\n\t\t\t\t\t\ttooltip,\n\t\t\t\t\t\tbackgroundColor\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\twatch(router.currentRoute, () => {\n\t\t\trefreshRoutesView();\n\t\t\tapi.notifyComponentUpdate();\n\t\t\tapi.sendInspectorTree(routerInspectorId);\n\t\t\tapi.sendInspectorState(routerInspectorId);\n\t\t});\n\t\tconst navigationsLayerId = \"router:navigations:\" + id;\n\t\tapi.addTimelineLayer({\n\t\t\tid: navigationsLayerId,\n\t\t\tlabel: `Router${id ? \" \" + id : \"\"} Navigations`,\n\t\t\tcolor: 4237508\n\t\t});\n\t\trouter.onError((error, to) => {\n\t\t\tapi.addTimelineEvent({\n\t\t\t\tlayerId: navigationsLayerId,\n\t\t\t\tevent: {\n\t\t\t\t\ttitle: \"Error during Navigation\",\n\t\t\t\t\tsubtitle: to.fullPath,\n\t\t\t\t\tlogType: \"error\",\n\t\t\t\t\ttime: api.now(),\n\t\t\t\t\tdata: { error },\n\t\t\t\t\tgroupId: to.meta.__navigationId\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tlet navigationId = 0;\n\t\trouter.beforeEach((to, from) => {\n\t\t\tconst data = {\n\t\t\t\tguard: formatDisplay(\"beforeEach\"),\n\t\t\t\tfrom: formatRouteLocation(from, \"Current Location during this navigation\"),\n\t\t\t\tto: formatRouteLocation(to, \"Target location\")\n\t\t\t};\n\t\t\tObject.defineProperty(to.meta, \"__navigationId\", { value: navigationId++ });\n\t\t\tapi.addTimelineEvent({\n\t\t\t\tlayerId: navigationsLayerId,\n\t\t\t\tevent: {\n\t\t\t\t\ttime: api.now(),\n\t\t\t\t\ttitle: \"Start of navigation\",\n\t\t\t\t\tsubtitle: to.fullPath,\n\t\t\t\t\tdata,\n\t\t\t\t\tgroupId: to.meta.__navigationId\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\trouter.afterEach((to, from, failure) => {\n\t\t\tconst data = { guard: formatDisplay(\"afterEach\") };\n\t\t\tif (failure) {\n\t\t\t\tdata.failure = { _custom: {\n\t\t\t\t\ttype: Error,\n\t\t\t\t\treadOnly: true,\n\t\t\t\t\tdisplay: failure ? failure.message : \"\",\n\t\t\t\t\ttooltip: \"Navigation Failure\",\n\t\t\t\t\tvalue: failure\n\t\t\t\t} };\n\t\t\t\tdata.status = formatDisplay(\"❌\");\n\t\t\t} else data.status = formatDisplay(\"✅\");\n\t\t\tdata.from = formatRouteLocation(from, \"Current Location during this navigation\");\n\t\t\tdata.to = formatRouteLocation(to, \"Target location\");\n\t\t\tapi.addTimelineEvent({\n\t\t\t\tlayerId: navigationsLayerId,\n\t\t\t\tevent: {\n\t\t\t\t\ttitle: \"End of navigation\",\n\t\t\t\t\tsubtitle: to.fullPath,\n\t\t\t\t\ttime: api.now(),\n\t\t\t\t\tdata,\n\t\t\t\t\tlogType: failure ? \"warning\" : \"default\",\n\t\t\t\t\tgroupId: to.meta.__navigationId\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\t/**\n\t\t* Inspector of Existing routes\n\t\t*/\n\t\tconst routerInspectorId = \"router-inspector:\" + id;\n\t\tapi.addInspector({\n\t\t\tid: routerInspectorId,\n\t\t\tlabel: \"Routes\" + (id ? \" \" + id : \"\"),\n\t\t\ticon: \"book\",\n\t\t\ttreeFilterPlaceholder: \"Search routes\"\n\t\t});\n\t\tfunction refreshRoutesView() {\n\t\t\tif (!activeRoutesPayload) return;\n\t\t\tconst payload = activeRoutesPayload;\n\t\t\tlet routes = matcher.getRoutes().filter((route) => !route.parent || !route.parent.record.components);\n\t\t\troutes.forEach(resetMatchStateOnRouteRecord);\n\t\t\tif (payload.filter) routes = routes.filter((route) => isRouteMatching(route, payload.filter.toLowerCase()));\n\t\t\troutes.forEach((route) => markRouteRecordActive(route, router.currentRoute.value));\n\t\t\tpayload.rootNodes = routes.map(formatRouteRecordForInspector);\n\t\t}\n\t\tlet activeRoutesPayload;\n\t\tapi.on.getInspectorTree((payload) => {\n\t\t\tactiveRoutesPayload = payload;\n\t\t\tif (payload.app === app && payload.inspectorId === routerInspectorId) refreshRoutesView();\n\t\t});\n\t\t/**\n\t\t* Display information about the currently selected route record\n\t\t*/\n\t\tapi.on.getInspectorState((payload) => {\n\t\t\tif (payload.app === app && payload.inspectorId === routerInspectorId) {\n\t\t\t\tconst route = matcher.getRoutes().find((route$1) => route$1.record.__vd_id === payload.nodeId);\n\t\t\t\tif (route) payload.state = { options: formatRouteRecordMatcherForStateInspector(route) };\n\t\t\t}\n\t\t});\n\t\tapi.sendInspectorTree(routerInspectorId);\n\t\tapi.sendInspectorState(routerInspectorId);\n\t});\n}\nfunction modifierForKey(key) {\n\tif (key.optional) return key.repeatable ? \"*\" : \"?\";\n\telse return key.repeatable ? \"+\" : \"\";\n}\nfunction formatRouteRecordMatcherForStateInspector(route) {\n\tconst { record } = route;\n\tconst fields = [{\n\t\teditable: false,\n\t\tkey: \"path\",\n\t\tvalue: record.path\n\t}];\n\tif (record.name != null) fields.push({\n\t\teditable: false,\n\t\tkey: \"name\",\n\t\tvalue: record.name\n\t});\n\tfields.push({\n\t\teditable: false,\n\t\tkey: \"regexp\",\n\t\tvalue: route.re\n\t});\n\tif (route.keys.length) fields.push({\n\t\teditable: false,\n\t\tkey: \"keys\",\n\t\tvalue: { _custom: {\n\t\t\ttype: null,\n\t\t\treadOnly: true,\n\t\t\tdisplay: route.keys.map((key) => `${key.name}${modifierForKey(key)}`).join(\" \"),\n\t\t\ttooltip: \"Param keys\",\n\t\t\tvalue: route.keys\n\t\t} }\n\t});\n\tif (record.redirect != null) fields.push({\n\t\teditable: false,\n\t\tkey: \"redirect\",\n\t\tvalue: record.redirect\n\t});\n\tif (route.alias.length) fields.push({\n\t\teditable: false,\n\t\tkey: \"aliases\",\n\t\tvalue: route.alias.map((alias) => alias.record.path)\n\t});\n\tif (Object.keys(route.record.meta).length) fields.push({\n\t\teditable: false,\n\t\tkey: \"meta\",\n\t\tvalue: route.record.meta\n\t});\n\tfields.push({\n\t\tkey: \"score\",\n\t\teditable: false,\n\t\tvalue: { _custom: {\n\t\t\ttype: null,\n\t\t\treadOnly: true,\n\t\t\tdisplay: route.score.map((score) => score.join(\", \")).join(\" | \"),\n\t\t\ttooltip: \"Score used to sort routes\",\n\t\t\tvalue: route.score\n\t\t} }\n\t});\n\treturn fields;\n}\n/**\n* Extracted from tailwind palette\n*/\nconst PINK_500 = 15485081;\nconst BLUE_600 = 2450411;\nconst LIME_500 = 8702998;\nconst CYAN_400 = 2282478;\nconst ORANGE_400 = 16486972;\nconst DARK = 6710886;\nconst RED_100 = 16704226;\nconst RED_700 = 12131356;\nfunction formatRouteRecordForInspector(route) {\n\tconst tags = [];\n\tconst { record } = route;\n\tif (record.name != null) tags.push({\n\t\tlabel: String(record.name),\n\t\ttextColor: 0,\n\t\tbackgroundColor: CYAN_400\n\t});\n\tif (record.aliasOf) tags.push({\n\t\tlabel: \"alias\",\n\t\ttextColor: 0,\n\t\tbackgroundColor: ORANGE_400\n\t});\n\tif (route.__vd_match) tags.push({\n\t\tlabel: \"matches\",\n\t\ttextColor: 0,\n\t\tbackgroundColor: PINK_500\n\t});\n\tif (route.__vd_exactActive) tags.push({\n\t\tlabel: \"exact\",\n\t\ttextColor: 0,\n\t\tbackgroundColor: LIME_500\n\t});\n\tif (route.__vd_active) tags.push({\n\t\tlabel: \"active\",\n\t\ttextColor: 0,\n\t\tbackgroundColor: BLUE_600\n\t});\n\tif (record.redirect) tags.push({\n\t\tlabel: typeof record.redirect === \"string\" ? `redirect: ${record.redirect}` : \"redirects\",\n\t\ttextColor: 16777215,\n\t\tbackgroundColor: DARK\n\t});\n\tlet id = record.__vd_id;\n\tif (id == null) {\n\t\tid = String(routeRecordId++);\n\t\trecord.__vd_id = id;\n\t}\n\treturn {\n\t\tid,\n\t\tlabel: record.path,\n\t\ttags,\n\t\tchildren: route.children.map(formatRouteRecordForInspector)\n\t};\n}\nlet routeRecordId = 0;\nconst EXTRACT_REGEXP_RE = /^\\/(.*)\\/([a-z]*)$/;\nfunction markRouteRecordActive(route, currentRoute) {\n\tconst isExactActive = currentRoute.matched.length && isSameRouteRecord(currentRoute.matched[currentRoute.matched.length - 1], route.record);\n\troute.__vd_exactActive = route.__vd_active = isExactActive;\n\tif (!isExactActive) route.__vd_active = currentRoute.matched.some((match) => isSameRouteRecord(match, route.record));\n\troute.children.forEach((childRoute) => markRouteRecordActive(childRoute, currentRoute));\n}\nfunction resetMatchStateOnRouteRecord(route) {\n\troute.__vd_match = false;\n\troute.children.forEach(resetMatchStateOnRouteRecord);\n}\nfunction isRouteMatching(route, filter) {\n\tconst found = String(route.re).match(EXTRACT_REGEXP_RE);\n\troute.__vd_match = false;\n\tif (!found || found.length < 3) return false;\n\tif (new RegExp(found[1].replace(/\\$$/, \"\"), found[2]).test(filter)) {\n\t\troute.children.forEach((child) => isRouteMatching(child, filter));\n\t\tif (route.record.path !== \"/\" || filter === \"/\") {\n\t\t\troute.__vd_match = route.re.test(filter);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tconst path = route.record.path.toLowerCase();\n\tconst decodedPath = decode(path);\n\tif (!filter.startsWith(\"/\") && (decodedPath.includes(filter) || path.includes(filter))) return true;\n\tif (decodedPath.startsWith(filter) || path.startsWith(filter)) return true;\n\tif (route.record.name && String(route.record.name).includes(filter)) return true;\n\treturn route.children.some((child) => isRouteMatching(child, filter));\n}\nfunction omit(obj, keys) {\n\tconst ret = {};\n\tfor (const key in obj) if (!keys.includes(key)) ret[key] = obj[key];\n\treturn ret;\n}\n\n//#endregion\nexport { isBrowser as $, START as A, stringifyURL as B, computeScrollPosition as C, scrollToPosition as D, saveScrollPosition as E, isSameRouteLocation as F, encodePath as G, decode as H, isSameRouteLocationParams as I, assign as J, warn$1 as K, isSameRouteRecord as L, normalizeBase as M, NEW_stringifyURL as N, NavigationDirection as O, START_LOCATION_NORMALIZED as P, noop as Q, parseURL as R, isRouteName as S, getScrollKey as T, encodeHash as U, stripBase as V, encodeParam as W, isArray as X, identityFn as Y, mergeOptions as Z, ErrorTypes as _, loadRouteLocation as a, isNavigationFailure as b, useCallbacks as c, routerKey as d, routerViewLocationKey as f, stringifyQuery as g, parseQuery as h, guardToPromiseFn as i, createHref as j, NavigationType as k, matchedRouteKey as l, normalizeQuery as m, extractChangingRecords as n, onBeforeRouteLeave as o, viewDepthKey as p, applyToParams as q, extractComponentsGuards as r, onBeforeRouteUpdate as s, addDevtools as t, routeLocationKey as u, NavigationFailureType as v, getSavedScrollPosition as w, isRouteLocation as x, createRouterError as y, resolveRelativePath as z };","/*!\n * vue-router v4.6.4\n * (c) 2025 Eduardo San Martin Morote\n * @license MIT\n */\nimport { $ as isBrowser, A as START, B as stringifyURL, C as computeScrollPosition, D as scrollToPosition, E as saveScrollPosition, F as isSameRouteLocation, H as decode, I as isSameRouteLocationParams, J as assign, K as warn$1, L as isSameRouteRecord, M as normalizeBase, O as NavigationDirection, P as START_LOCATION_NORMALIZED, Q as noop, R as parseURL, S as isRouteName, T as getScrollKey, U as encodeHash, V as stripBase, W as encodeParam, X as isArray, Z as mergeOptions, _ as ErrorTypes, a as loadRouteLocation, b as isNavigationFailure, c as useCallbacks, d as routerKey, f as routerViewLocationKey, g as stringifyQuery, h as parseQuery, i as guardToPromiseFn, j as createHref, k as NavigationType, l as matchedRouteKey, m as normalizeQuery, n as extractChangingRecords, o as onBeforeRouteLeave, p as viewDepthKey, q as applyToParams, r as extractComponentsGuards, s as onBeforeRouteUpdate, t as addDevtools, u as routeLocationKey, v as NavigationFailureType, w as getSavedScrollPosition, x as isRouteLocation, y as createRouterError } from \"./devtools-EWN81iOl.mjs\";\nimport { computed, defineComponent, getCurrentInstance, h, inject, nextTick, provide, reactive, ref, shallowReactive, shallowRef, unref, watch, watchEffect } from \"vue\";\n\n//#region src/history/html5.ts\nlet createBaseLocation = () => location.protocol + \"//\" + location.host;\n/**\n* Creates a normalized history location from a window.location object\n* @param base - The base path\n* @param location - The window.location object\n*/\nfunction createCurrentLocation(base, location$1) {\n\tconst { pathname, search, hash } = location$1;\n\tconst hashPos = base.indexOf(\"#\");\n\tif (hashPos > -1) {\n\t\tlet slicePos = hash.includes(base.slice(hashPos)) ? base.slice(hashPos).length : 1;\n\t\tlet pathFromHash = hash.slice(slicePos);\n\t\tif (pathFromHash[0] !== \"/\") pathFromHash = \"/\" + pathFromHash;\n\t\treturn stripBase(pathFromHash, \"\");\n\t}\n\treturn stripBase(pathname, base) + search + hash;\n}\nfunction useHistoryListeners(base, historyState, currentLocation, replace) {\n\tlet listeners = [];\n\tlet teardowns = [];\n\tlet pauseState = null;\n\tconst popStateHandler = ({ state }) => {\n\t\tconst to = createCurrentLocation(base, location);\n\t\tconst from = currentLocation.value;\n\t\tconst fromState = historyState.value;\n\t\tlet delta = 0;\n\t\tif (state) {\n\t\t\tcurrentLocation.value = to;\n\t\t\thistoryState.value = state;\n\t\t\tif (pauseState && pauseState === from) {\n\t\t\t\tpauseState = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdelta = fromState ? state.position - fromState.position : 0;\n\t\t} else replace(to);\n\t\tlisteners.forEach((listener) => {\n\t\t\tlistener(currentLocation.value, from, {\n\t\t\t\tdelta,\n\t\t\t\ttype: NavigationType.pop,\n\t\t\t\tdirection: delta ? delta > 0 ? NavigationDirection.forward : NavigationDirection.back : NavigationDirection.unknown\n\t\t\t});\n\t\t});\n\t};\n\tfunction pauseListeners() {\n\t\tpauseState = currentLocation.value;\n\t}\n\tfunction listen(callback) {\n\t\tlisteners.push(callback);\n\t\tconst teardown = () => {\n\t\t\tconst index = listeners.indexOf(callback);\n\t\t\tif (index > -1) listeners.splice(index, 1);\n\t\t};\n\t\tteardowns.push(teardown);\n\t\treturn teardown;\n\t}\n\tfunction beforeUnloadListener() {\n\t\tif (document.visibilityState === \"hidden\") {\n\t\t\tconst { history: history$1 } = window;\n\t\t\tif (!history$1.state) return;\n\t\t\thistory$1.replaceState(assign({}, history$1.state, { scroll: computeScrollPosition() }), \"\");\n\t\t}\n\t}\n\tfunction destroy() {\n\t\tfor (const teardown of teardowns) teardown();\n\t\tteardowns = [];\n\t\twindow.removeEventListener(\"popstate\", popStateHandler);\n\t\twindow.removeEventListener(\"pagehide\", beforeUnloadListener);\n\t\tdocument.removeEventListener(\"visibilitychange\", beforeUnloadListener);\n\t}\n\twindow.addEventListener(\"popstate\", popStateHandler);\n\twindow.addEventListener(\"pagehide\", beforeUnloadListener);\n\tdocument.addEventListener(\"visibilitychange\", beforeUnloadListener);\n\treturn {\n\t\tpauseListeners,\n\t\tlisten,\n\t\tdestroy\n\t};\n}\n/**\n* Creates a state object\n*/\nfunction buildState(back, current, forward, replaced = false, computeScroll = false) {\n\treturn {\n\t\tback,\n\t\tcurrent,\n\t\tforward,\n\t\treplaced,\n\t\tposition: window.history.length,\n\t\tscroll: computeScroll ? computeScrollPosition() : null\n\t};\n}\nfunction useHistoryStateNavigation(base) {\n\tconst { history: history$1, location: location$1 } = window;\n\tconst currentLocation = { value: createCurrentLocation(base, location$1) };\n\tconst historyState = { value: history$1.state };\n\tif (!historyState.value) changeLocation(currentLocation.value, {\n\t\tback: null,\n\t\tcurrent: currentLocation.value,\n\t\tforward: null,\n\t\tposition: history$1.length - 1,\n\t\treplaced: true,\n\t\tscroll: null\n\t}, true);\n\tfunction changeLocation(to, state, replace$1) {\n\t\t/**\n\t\t* if a base tag is provided, and we are on a normal domain, we have to\n\t\t* respect the provided `base` attribute because pushState() will use it and\n\t\t* potentially erase anything before the `#` like at\n\t\t* https://github.com/vuejs/router/issues/685 where a base of\n\t\t* `/folder/#` but a base of `/` would erase the `/folder/` section. If\n\t\t* there is no host, the `<base>` tag makes no sense and if there isn't a\n\t\t* base tag we can just use everything after the `#`.\n\t\t*/\n\t\tconst hashIndex = base.indexOf(\"#\");\n\t\tconst url = hashIndex > -1 ? (location$1.host && document.querySelector(\"base\") ? base : base.slice(hashIndex)) + to : createBaseLocation() + base + to;\n\t\ttry {\n\t\t\thistory$1[replace$1 ? \"replaceState\" : \"pushState\"](state, \"\", url);\n\t\t\thistoryState.value = state;\n\t\t} catch (err) {\n\t\t\tif (process.env.NODE_ENV !== \"production\") warn$1(\"Error with push/replace State\", err);\n\t\t\telse console.error(err);\n\t\t\tlocation$1[replace$1 ? \"replace\" : \"assign\"](url);\n\t\t}\n\t}\n\tfunction replace(to, data) {\n\t\tchangeLocation(to, assign({}, history$1.state, buildState(historyState.value.back, to, historyState.value.forward, true), data, { position: historyState.value.position }), true);\n\t\tcurrentLocation.value = to;\n\t}\n\tfunction push(to, data) {\n\t\tconst currentState = assign({}, historyState.value, history$1.state, {\n\t\t\tforward: to,\n\t\t\tscroll: computeScrollPosition()\n\t\t});\n\t\tif (process.env.NODE_ENV !== \"production\" && !history$1.state) warn$1(\"history.state seems to have been manually replaced without preserving the necessary values. Make sure to preserve existing history state if you are manually calling history.replaceState:\\n\\nhistory.replaceState(history.state, '', url)\\n\\nYou can find more information at https://router.vuejs.org/guide/migration/#Usage-of-history-state\");\n\t\tchangeLocation(currentState.current, currentState, true);\n\t\tchangeLocation(to, assign({}, buildState(currentLocation.value, to, null), { position: currentState.position + 1 }, data), false);\n\t\tcurrentLocation.value = to;\n\t}\n\treturn {\n\t\tlocation: currentLocation,\n\t\tstate: historyState,\n\t\tpush,\n\t\treplace\n\t};\n}\n/**\n* Creates an HTML5 history. Most common history for single page applications.\n*\n* @param base -\n*/\nfunction createWebHistory(base) {\n\tbase = normalizeBase(base);\n\tconst historyNavigation = useHistoryStateNavigation(base);\n\tconst historyListeners = useHistoryListeners(base, historyNavigation.state, historyNavigation.location, historyNavigation.replace);\n\tfunction go(delta, triggerListeners = true) {\n\t\tif (!triggerListeners) historyListeners.pauseListeners();\n\t\thistory.go(delta);\n\t}\n\tconst routerHistory = assign({\n\t\tlocation: \"\",\n\t\tbase,\n\t\tgo,\n\t\tcreateHref: createHref.bind(null, base)\n\t}, historyNavigation, historyListeners);\n\tObject.defineProperty(routerHistory, \"location\", {\n\t\tenumerable: true,\n\t\tget: () => historyNavigation.location.value\n\t});\n\tObject.defineProperty(routerHistory, \"state\", {\n\t\tenumerable: true,\n\t\tget: () => historyNavigation.state.value\n\t});\n\treturn routerHistory;\n}\n\n//#endregion\n//#region src/history/memory.ts\n/**\n* Creates an in-memory based history. The main purpose of this history is to handle SSR. It starts in a special location that is nowhere.\n* It's up to the user to replace that location with the starter location by either calling `router.push` or `router.replace`.\n*\n* @param base - Base applied to all urls, defaults to '/'\n* @returns a history object that can be passed to the router constructor\n*/\nfunction createMemoryHistory(base = \"\") {\n\tlet listeners = [];\n\tlet queue = [[START, {}]];\n\tlet position = 0;\n\tbase = normalizeBase(base);\n\tfunction setLocation(location$1, state = {}) {\n\t\tposition++;\n\t\tif (position !== queue.length) queue.splice(position);\n\t\tqueue.push([location$1, state]);\n\t}\n\tfunction triggerListeners(to, from, { direction, delta }) {\n\t\tconst info = {\n\t\t\tdirection,\n\t\t\tdelta,\n\t\t\ttype: NavigationType.pop\n\t\t};\n\t\tfor (const callback of listeners) callback(to, from, info);\n\t}\n\tconst routerHistory = {\n\t\tlocation: START,\n\t\tstate: {},\n\t\tbase,\n\t\tcreateHref: createHref.bind(null, base),\n\t\treplace(to, state) {\n\t\t\tqueue.splice(position--, 1);\n\t\t\tsetLocation(to, state);\n\t\t},\n\t\tpush(to, state) {\n\t\t\tsetLocation(to, state);\n\t\t},\n\t\tlisten(callback) {\n\t\t\tlisteners.push(callback);\n\t\t\treturn () => {\n\t\t\t\tconst index = listeners.indexOf(callback);\n\t\t\t\tif (index > -1) listeners.splice(index, 1);\n\t\t\t};\n\t\t},\n\t\tdestroy() {\n\t\t\tlisteners = [];\n\t\t\tqueue = [[START, {}]];\n\t\t\tposition = 0;\n\t\t},\n\t\tgo(delta, shouldTrigger = true) {\n\t\t\tconst from = this.location;\n\t\t\tconst direction = delta < 0 ? NavigationDirection.back : NavigationDirection.forward;\n\t\t\tposition = Math.max(0, Math.min(position + delta, queue.length - 1));\n\t\t\tif (shouldTrigger) triggerListeners(this.location, from, {\n\t\t\t\tdirection,\n\t\t\t\tdelta\n\t\t\t});\n\t\t}\n\t};\n\tObject.defineProperty(routerHistory, \"location\", {\n\t\tenumerable: true,\n\t\tget: () => queue[position][0]\n\t});\n\tObject.defineProperty(routerHistory, \"state\", {\n\t\tenumerable: true,\n\t\tget: () => queue[position][1]\n\t});\n\treturn routerHistory;\n}\n\n//#endregion\n//#region src/history/hash.ts\n/**\n* Creates a hash history. Useful for web applications with no host (e.g. `file://`) or when configuring a server to\n* handle any URL is not possible.\n*\n* @param base - optional base to provide. Defaults to `location.pathname + location.search` If there is a `<base>` tag\n* in the `head`, its value will be ignored in favor of this parameter **but note it affects all the history.pushState()\n* calls**, meaning that if you use a `<base>` tag, it's `href` value **has to match this parameter** (ignoring anything\n* after the `#`).\n*\n* @example\n* ```js\n* // at https://example.com/folder\n* createWebHashHistory() // gives a url of `https://example.com/folder#`\n* createWebHashHistory('/folder/') // gives a url of `https://example.com/folder/#`\n* // if the `#` is provided in the base, it won't be added by `createWebHashHistory`\n* createWebHashHistory('/folder/#/app/') // gives a url of `https://example.com/folder/#/app/`\n* // you should avoid doing this because it changes the original url and breaks copying urls\n* createWebHashHistory('/other-folder/') // gives a url of `https://example.com/other-folder/#`\n*\n* // at file:///usr/etc/folder/index.html\n* // for locations with no `host`, the base is ignored\n* createWebHashHistory('/iAmIgnored') // gives a url of `file:///usr/etc/folder/index.html#`\n* ```\n*/\nfunction createWebHashHistory(base) {\n\tbase = location.host ? base || location.pathname + location.search : \"\";\n\tif (!base.includes(\"#\")) base += \"#\";\n\tif (process.env.NODE_ENV !== \"production\" && !base.endsWith(\"#/\") && !base.endsWith(\"#\")) warn$1(`A hash base must end with a \"#\":\\n\"${base}\" should be \"${base.replace(/#.*$/, \"#\")}\".`);\n\treturn createWebHistory(base);\n}\n\n//#endregion\n//#region src/matcher/pathTokenizer.ts\nlet TokenType = /* @__PURE__ */ function(TokenType$1) {\n\tTokenType$1[TokenType$1[\"Static\"] = 0] = \"Static\";\n\tTokenType$1[TokenType$1[\"Param\"] = 1] = \"Param\";\n\tTokenType$1[TokenType$1[\"Group\"] = 2] = \"Group\";\n\treturn TokenType$1;\n}({});\nvar TokenizerState = /* @__PURE__ */ function(TokenizerState$1) {\n\tTokenizerState$1[TokenizerState$1[\"Static\"] = 0] = \"Static\";\n\tTokenizerState$1[TokenizerState$1[\"Param\"] = 1] = \"Param\";\n\tTokenizerState$1[TokenizerState$1[\"ParamRegExp\"] = 2] = \"ParamRegExp\";\n\tTokenizerState$1[TokenizerState$1[\"ParamRegExpEnd\"] = 3] = \"ParamRegExpEnd\";\n\tTokenizerState$1[TokenizerState$1[\"EscapeNext\"] = 4] = \"EscapeNext\";\n\treturn TokenizerState$1;\n}(TokenizerState || {});\nconst ROOT_TOKEN = {\n\ttype: TokenType.Static,\n\tvalue: \"\"\n};\nconst VALID_PARAM_RE = /[a-zA-Z0-9_]/;\nfunction tokenizePath(path) {\n\tif (!path) return [[]];\n\tif (path === \"/\") return [[ROOT_TOKEN]];\n\tif (!path.startsWith(\"/\")) throw new Error(process.env.NODE_ENV !== \"production\" ? `Route paths should start with a \"/\": \"${path}\" should be \"/${path}\".` : `Invalid path \"${path}\"`);\n\tfunction crash(message) {\n\t\tthrow new Error(`ERR (${state})/\"${buffer}\": ${message}`);\n\t}\n\tlet state = TokenizerState.Static;\n\tlet previousState = state;\n\tconst tokens = [];\n\tlet segment;\n\tfunction finalizeSegment() {\n\t\tif (segment) tokens.push(segment);\n\t\tsegment = [];\n\t}\n\tlet i = 0;\n\tlet char;\n\tlet buffer = \"\";\n\tlet customRe = \"\";\n\tfunction consumeBuffer() {\n\t\tif (!buffer) return;\n\t\tif (state === TokenizerState.Static) segment.push({\n\t\t\ttype: TokenType.Static,\n\t\t\tvalue: buffer\n\t\t});\n\t\telse if (state === TokenizerState.Param || state === TokenizerState.ParamRegExp || state === TokenizerState.ParamRegExpEnd) {\n\t\t\tif (segment.length > 1 && (char === \"*\" || char === \"+\")) crash(`A repeatable param (${buffer}) must be alone in its segment. eg: '/:ids+.`);\n\t\t\tsegment.push({\n\t\t\t\ttype: TokenType.Param,\n\t\t\t\tvalue: buffer,\n\t\t\t\tregexp: customRe,\n\t\t\t\trepeatable: char === \"*\" || char === \"+\",\n\t\t\t\toptional: char === \"*\" || char === \"?\"\n\t\t\t});\n\t\t} else crash(\"Invalid state to consume buffer\");\n\t\tbuffer = \"\";\n\t}\n\tfunction addCharToBuffer() {\n\t\tbuffer += char;\n\t}\n\twhile (i < path.length) {\n\t\tchar = path[i++];\n\t\tif (char === \"\\\\\" && state !== TokenizerState.ParamRegExp) {\n\t\t\tpreviousState = state;\n\t\t\tstate = TokenizerState.EscapeNext;\n\t\t\tcontinue;\n\t\t}\n\t\tswitch (state) {\n\t\t\tcase TokenizerState.Static:\n\t\t\t\tif (char === \"/\") {\n\t\t\t\t\tif (buffer) consumeBuffer();\n\t\t\t\t\tfinalizeSegment();\n\t\t\t\t} else if (char === \":\") {\n\t\t\t\t\tconsumeBuffer();\n\t\t\t\t\tstate = TokenizerState.Param;\n\t\t\t\t} else addCharToBuffer();\n\t\t\t\tbreak;\n\t\t\tcase TokenizerState.EscapeNext:\n\t\t\t\taddCharToBuffer();\n\t\t\t\tstate = previousState;\n\t\t\t\tbreak;\n\t\t\tcase TokenizerState.Param:\n\t\t\t\tif (char === \"(\") state = TokenizerState.ParamRegExp;\n\t\t\t\telse if (VALID_PARAM_RE.test(char)) addCharToBuffer();\n\t\t\t\telse {\n\t\t\t\t\tconsumeBuffer();\n\t\t\t\t\tstate = TokenizerState.Static;\n\t\t\t\t\tif (char !== \"*\" && char !== \"?\" && char !== \"+\") i--;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase TokenizerState.ParamRegExp:\n\t\t\t\tif (char === \")\") if (customRe[customRe.length - 1] == \"\\\\\") customRe = customRe.slice(0, -1) + char;\n\t\t\t\telse state = TokenizerState.ParamRegExpEnd;\n\t\t\t\telse customRe += char;\n\t\t\t\tbreak;\n\t\t\tcase TokenizerState.ParamRegExpEnd:\n\t\t\t\tconsumeBuffer();\n\t\t\t\tstate = TokenizerState.Static;\n\t\t\t\tif (char !== \"*\" && char !== \"?\" && char !== \"+\") i--;\n\t\t\t\tcustomRe = \"\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tcrash(\"Unknown state\");\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tif (state === TokenizerState.ParamRegExp) crash(`Unfinished custom RegExp for param \"${buffer}\"`);\n\tconsumeBuffer();\n\tfinalizeSegment();\n\treturn tokens;\n}\n\n//#endregion\n//#region src/matcher/pathParserRanker.ts\nconst BASE_PARAM_PATTERN = \"[^/]+?\";\nconst BASE_PATH_PARSER_OPTIONS = {\n\tsensitive: false,\n\tstrict: false,\n\tstart: true,\n\tend: true\n};\nvar PathScore = /* @__PURE__ */ function(PathScore$1) {\n\tPathScore$1[PathScore$1[\"_multiplier\"] = 10] = \"_multiplier\";\n\tPathScore$1[PathScore$1[\"Root\"] = 90] = \"Root\";\n\tPathScore$1[PathScore$1[\"Segment\"] = 40] = \"Segment\";\n\tPathScore$1[PathScore$1[\"SubSegment\"] = 30] = \"SubSegment\";\n\tPathScore$1[PathScore$1[\"Static\"] = 40] = \"Static\";\n\tPathScore$1[PathScore$1[\"Dynamic\"] = 20] = \"Dynamic\";\n\tPathScore$1[PathScore$1[\"BonusCustomRegExp\"] = 10] = \"BonusCustomRegExp\";\n\tPathScore$1[PathScore$1[\"BonusWildcard\"] = -50] = \"BonusWildcard\";\n\tPathScore$1[PathScore$1[\"BonusRepeatable\"] = -20] = \"BonusRepeatable\";\n\tPathScore$1[PathScore$1[\"BonusOptional\"] = -8] = \"BonusOptional\";\n\tPathScore$1[PathScore$1[\"BonusStrict\"] = .7000000000000001] = \"BonusStrict\";\n\tPathScore$1[PathScore$1[\"BonusCaseSensitive\"] = .25] = \"BonusCaseSensitive\";\n\treturn PathScore$1;\n}(PathScore || {});\nconst REGEX_CHARS_RE = /[.+*?^${}()[\\]/\\\\]/g;\n/**\n* Creates a path parser from an array of Segments (a segment is an array of Tokens)\n*\n* @param segments - array of segments returned by tokenizePath\n* @param extraOptions - optional options for the regexp\n* @returns a PathParser\n*/\nfunction tokensToParser(segments, extraOptions) {\n\tconst options = assign({}, BASE_PATH_PARSER_OPTIONS, extraOptions);\n\tconst score = [];\n\tlet pattern = options.start ? \"^\" : \"\";\n\tconst keys = [];\n\tfor (const segment of segments) {\n\t\tconst segmentScores = segment.length ? [] : [PathScore.Root];\n\t\tif (options.strict && !segment.length) pattern += \"/\";\n\t\tfor (let tokenIndex = 0; tokenIndex < segment.length; tokenIndex++) {\n\t\t\tconst token = segment[tokenIndex];\n\t\t\tlet subSegmentScore = PathScore.Segment + (options.sensitive ? PathScore.BonusCaseSensitive : 0);\n\t\t\tif (token.type === TokenType.Static) {\n\t\t\t\tif (!tokenIndex) pattern += \"/\";\n\t\t\t\tpattern += token.value.replace(REGEX_CHARS_RE, \"\\\\$&\");\n\t\t\t\tsubSegmentScore += PathScore.Static;\n\t\t\t} else if (token.type === TokenType.Param) {\n\t\t\t\tconst { value, repeatable, optional, regexp } = token;\n\t\t\t\tkeys.push({\n\t\t\t\t\tname: value,\n\t\t\t\t\trepeatable,\n\t\t\t\t\toptional\n\t\t\t\t});\n\t\t\t\tconst re$1 = regexp ? regexp : BASE_PARAM_PATTERN;\n\t\t\t\tif (re$1 !== BASE_PARAM_PATTERN) {\n\t\t\t\t\tsubSegmentScore += PathScore.BonusCustomRegExp;\n\t\t\t\t\ttry {\n\t\t\t\t\t\t`${re$1}`;\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tthrow new Error(`Invalid custom RegExp for param \"${value}\" (${re$1}): ` + err.message);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlet subPattern = repeatable ? `((?:${re$1})(?:/(?:${re$1}))*)` : `(${re$1})`;\n\t\t\t\tif (!tokenIndex) subPattern = optional && segment.length < 2 ? `(?:/${subPattern})` : \"/\" + subPattern;\n\t\t\t\tif (optional) subPattern += \"?\";\n\t\t\t\tpattern += subPattern;\n\t\t\t\tsubSegmentScore += PathScore.Dynamic;\n\t\t\t\tif (optional) subSegmentScore += PathScore.BonusOptional;\n\t\t\t\tif (repeatable) subSegmentScore += PathScore.BonusRepeatable;\n\t\t\t\tif (re$1 === \".*\") subSegmentScore += PathScore.BonusWildcard;\n\t\t\t}\n\t\t\tsegmentScores.push(subSegmentScore);\n\t\t}\n\t\tscore.push(segmentScores);\n\t}\n\tif (options.strict && options.end) {\n\t\tconst i = score.length - 1;\n\t\tscore[i][score[i].length - 1] += PathScore.BonusStrict;\n\t}\n\tif (!options.strict) pattern += \"/?\";\n\tif (options.end) pattern += \"$\";\n\telse if (options.strict && !pattern.endsWith(\"/\")) pattern += \"(?:/|$)\";\n\tconst re = new RegExp(pattern, options.sensitive ? \"\" : \"i\");\n\tfunction parse(path) {\n\t\tconst match = path.match(re);\n\t\tconst params = {};\n\t\tif (!match) return null;\n\t\tfor (let i = 1; i < match.length; i++) {\n\t\t\tconst value = match[i] || \"\";\n\t\t\tconst key = keys[i - 1];\n\t\t\tparams[key.name] = value && key.repeatable ? value.split(\"/\") : value;\n\t\t}\n\t\treturn params;\n\t}\n\tfunction stringify(params) {\n\t\tlet path = \"\";\n\t\tlet avoidDuplicatedSlash = false;\n\t\tfor (const segment of segments) {\n\t\t\tif (!avoidDuplicatedSlash || !path.endsWith(\"/\")) path += \"/\";\n\t\t\tavoidDuplicatedSlash = false;\n\t\t\tfor (const token of segment) if (token.type === TokenType.Static) path += token.value;\n\t\t\telse if (token.type === TokenType.Param) {\n\t\t\t\tconst { value, repeatable, optional } = token;\n\t\t\t\tconst param = value in params ? params[value] : \"\";\n\t\t\t\tif (isArray(param) && !repeatable) throw new Error(`Provided param \"${value}\" is an array but it is not repeatable (* or + modifiers)`);\n\t\t\t\tconst text = isArray(param) ? param.join(\"/\") : param;\n\t\t\t\tif (!text) if (optional) {\n\t\t\t\t\tif (segment.length < 2) if (path.endsWith(\"/\")) path = path.slice(0, -1);\n\t\t\t\t\telse avoidDuplicatedSlash = true;\n\t\t\t\t} else throw new Error(`Missing required param \"${value}\"`);\n\t\t\t\tpath += text;\n\t\t\t}\n\t\t}\n\t\treturn path || \"/\";\n\t}\n\treturn {\n\t\tre,\n\t\tscore,\n\t\tkeys,\n\t\tparse,\n\t\tstringify\n\t};\n}\n/**\n* Compares an array of numbers as used in PathParser.score and returns a\n* number. This function can be used to `sort` an array\n*\n* @param a - first array of numbers\n* @param b - second array of numbers\n* @returns 0 if both are equal, < 0 if a should be sorted first, > 0 if b\n* should be sorted first\n*/\nfunction compareScoreArray(a, b) {\n\tlet i = 0;\n\twhile (i < a.length && i < b.length) {\n\t\tconst diff = b[i] - a[i];\n\t\tif (diff) return diff;\n\t\ti++;\n\t}\n\tif (a.length < b.length) return a.length === 1 && a[0] === PathScore.Static + PathScore.Segment ? -1 : 1;\n\telse if (a.length > b.length) return b.length === 1 && b[0] === PathScore.Static + PathScore.Segment ? 1 : -1;\n\treturn 0;\n}\n/**\n* Compare function that can be used with `sort` to sort an array of PathParser\n*\n* @param a - first PathParser\n* @param b - second PathParser\n* @returns 0 if both are equal, < 0 if a should be sorted first, > 0 if b\n*/\nfunction comparePathParserScore(a, b) {\n\tlet i = 0;\n\tconst aScore = a.score;\n\tconst bScore = b.score;\n\twhile (i < aScore.length && i < bScore.length) {\n\t\tconst comp = compareScoreArray(aScore[i], bScore[i]);\n\t\tif (comp) return comp;\n\t\ti++;\n\t}\n\tif (Math.abs(bScore.length - aScore.length) === 1) {\n\t\tif (isLastScoreNegative(aScore)) return 1;\n\t\tif (isLastScoreNegative(bScore)) return -1;\n\t}\n\treturn bScore.length - aScore.length;\n}\n/**\n* This allows detecting splats at the end of a path: /home/:id(.*)*\n*\n* @param score - score to check\n* @returns true if the last entry is negative\n*/\nfunction isLastScoreNegative(score) {\n\tconst last = score[score.length - 1];\n\treturn score.length > 0 && last[last.length - 1] < 0;\n}\nconst PATH_PARSER_OPTIONS_DEFAULTS = {\n\tstrict: false,\n\tend: true,\n\tsensitive: false\n};\n\n//#endregion\n//#region src/matcher/pathMatcher.ts\nfunction createRouteRecordMatcher(record, parent, options) {\n\tconst parser = tokensToParser(tokenizePath(record.path), options);\n\tif (process.env.NODE_ENV !== \"production\") {\n\t\tconst existingKeys = /* @__PURE__ */ new Set();\n\t\tfor (const key of parser.keys) {\n\t\t\tif (existingKeys.has(key.name)) warn$1(`Found duplicated params with name \"${key.name}\" for path \"${record.path}\". Only the last one will be available on \"$route.params\".`);\n\t\t\texistingKeys.add(key.name);\n\t\t}\n\t}\n\tconst matcher = assign(parser, {\n\t\trecord,\n\t\tparent,\n\t\tchildren: [],\n\t\talias: []\n\t});\n\tif (parent) {\n\t\tif (!matcher.record.aliasOf === !parent.record.aliasOf) parent.children.push(matcher);\n\t}\n\treturn matcher;\n}\n\n//#endregion\n//#region src/matcher/index.ts\n/**\n* Creates a Router Matcher.\n*\n* @internal\n* @param routes - array of initial routes\n* @param globalOptions - global route options\n*/\nfunction createRouterMatcher(routes, globalOptions) {\n\tconst matchers = [];\n\tconst matcherMap = /* @__PURE__ */ new Map();\n\tglobalOptions = mergeOptions(PATH_PARSER_OPTIONS_DEFAULTS, globalOptions);\n\tfunction getRecordMatcher(name) {\n\t\treturn matcherMap.get(name);\n\t}\n\tfunction addRoute(record, parent, originalRecord) {\n\t\tconst isRootAdd = !originalRecord;\n\t\tconst mainNormalizedRecord = normalizeRouteRecord(record);\n\t\tif (process.env.NODE_ENV !== \"production\") checkChildMissingNameWithEmptyPath(mainNormalizedRecord, parent);\n\t\tmainNormalizedRecord.aliasOf = originalRecord && originalRecord.record;\n\t\tconst options = mergeOptions(globalOptions, record);\n\t\tconst normalizedRecords = [mainNormalizedRecord];\n\t\tif (\"alias\" in record) {\n\t\t\tconst aliases = typeof record.alias === \"string\" ? [record.alias] : record.alias;\n\t\t\tfor (const alias of aliases) normalizedRecords.push(normalizeRouteRecord(assign({}, mainNormalizedRecord, {\n\t\t\t\tcomponents: originalRecord ? originalRecord.record.components : mainNormalizedRecord.components,\n\t\t\t\tpath: alias,\n\t\t\t\taliasOf: originalRecord ? originalRecord.record : mainNormalizedRecord\n\t\t\t})));\n\t\t}\n\t\tlet matcher;\n\t\tlet originalMatcher;\n\t\tfor (const normalizedRecord of normalizedRecords) {\n\t\t\tconst { path } = normalizedRecord;\n\t\t\tif (parent && path[0] !== \"/\") {\n\t\t\t\tconst parentPath = parent.record.path;\n\t\t\t\tconst connectingSlash = parentPath[parentPath.length - 1] === \"/\" ? \"\" : \"/\";\n\t\t\t\tnormalizedRecord.path = parent.record.path + (path && connectingSlash + path);\n\t\t\t}\n\t\t\tif (process.env.NODE_ENV !== \"production\" && normalizedRecord.path === \"*\") throw new Error(\"Catch all routes (\\\"*\\\") must now be defined using a param with a custom regexp.\\nSee more at https://router.vuejs.org/guide/migration/#Removed-star-or-catch-all-routes.\");\n\t\t\tmatcher = createRouteRecordMatcher(normalizedRecord, parent, options);\n\t\t\tif (process.env.NODE_ENV !== \"production\" && parent && path[0] === \"/\") checkMissingParamsInAbsolutePath(matcher, parent);\n\t\t\tif (originalRecord) {\n\t\t\t\toriginalRecord.alias.push(matcher);\n\t\t\t\tif (process.env.NODE_ENV !== \"production\") checkSameParams(originalRecord, matcher);\n\t\t\t} else {\n\t\t\t\toriginalMatcher = originalMatcher || matcher;\n\t\t\t\tif (originalMatcher !== matcher) originalMatcher.alias.push(matcher);\n\t\t\t\tif (isRootAdd && record.name && !isAliasRecord(matcher)) {\n\t\t\t\t\tif (process.env.NODE_ENV !== \"production\") checkSameNameAsAncestor(record, parent);\n\t\t\t\t\tremoveRoute(record.name);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (isMatchable(matcher)) insertMatcher(matcher);\n\t\t\tif (mainNormalizedRecord.children) {\n\t\t\t\tconst children = mainNormalizedRecord.children;\n\t\t\t\tfor (let i = 0; i < children.length; i++) addRoute(children[i], matcher, originalRecord && originalRecord.children[i]);\n\t\t\t}\n\t\t\toriginalRecord = originalRecord || matcher;\n\t\t}\n\t\treturn originalMatcher ? () => {\n\t\t\tremoveRoute(originalMatcher);\n\t\t} : noop;\n\t}\n\tfunction removeRoute(matcherRef) {\n\t\tif (isRouteName(matcherRef)) {\n\t\t\tconst matcher = matcherMap.get(matcherRef);\n\t\t\tif (matcher) {\n\t\t\t\tmatcherMap.delete(matcherRef);\n\t\t\t\tmatchers.splice(matchers.indexOf(matcher), 1);\n\t\t\t\tmatcher.children.forEach(removeRoute);\n\t\t\t\tmatcher.alias.forEach(removeRoute);\n\t\t\t}\n\t\t} else {\n\t\t\tconst index = matchers.indexOf(matcherRef);\n\t\t\tif (index > -1) {\n\t\t\t\tmatchers.splice(index, 1);\n\t\t\t\tif (matcherRef.record.name) matcherMap.delete(matcherRef.record.name);\n\t\t\t\tmatcherRef.children.forEach(removeRoute);\n\t\t\t\tmatcherRef.alias.forEach(removeRoute);\n\t\t\t}\n\t\t}\n\t}\n\tfunction getRoutes() {\n\t\treturn matchers;\n\t}\n\tfunction insertMatcher(matcher) {\n\t\tconst index = findInsertionIndex(matcher, matchers);\n\t\tmatchers.splice(index, 0, matcher);\n\t\tif (matcher.record.name && !isAliasRecord(matcher)) matcherMap.set(matcher.record.name, matcher);\n\t}\n\tfunction resolve(location$1, currentLocation) {\n\t\tlet matcher;\n\t\tlet params = {};\n\t\tlet path;\n\t\tlet name;\n\t\tif (\"name\" in location$1 && location$1.name) {\n\t\t\tmatcher = matcherMap.get(location$1.name);\n\t\t\tif (!matcher) throw createRouterError(ErrorTypes.MATCHER_NOT_FOUND, { location: location$1 });\n\t\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\t\tconst invalidParams = Object.keys(location$1.params || {}).filter((paramName) => !matcher.keys.find((k) => k.name === paramName));\n\t\t\t\tif (invalidParams.length) warn$1(`Discarded invalid param(s) \"${invalidParams.join(\"\\\", \\\"\")}\" when navigating. See https://github.com/vuejs/router/blob/main/packages/router/CHANGELOG.md#414-2022-08-22 for more details.`);\n\t\t\t}\n\t\t\tname = matcher.record.name;\n\t\t\tparams = assign(pickParams(currentLocation.params, matcher.keys.filter((k) => !k.optional).concat(matcher.parent ? matcher.parent.keys.filter((k) => k.optional) : []).map((k) => k.name)), location$1.params && pickParams(location$1.params, matcher.keys.map((k) => k.name)));\n\t\t\tpath = matcher.stringify(params);\n\t\t} else if (location$1.path != null) {\n\t\t\tpath = location$1.path;\n\t\t\tif (process.env.NODE_ENV !== \"production\" && !path.startsWith(\"/\")) warn$1(`The Matcher cannot resolve relative paths but received \"${path}\". Unless you directly called \\`matcher.resolve(\"${path}\")\\`, this is probably a bug in vue-router. Please open an issue at https://github.com/vuejs/router/issues/new/choose.`);\n\t\t\tmatcher = matchers.find((m) => m.re.test(path));\n\t\t\tif (matcher) {\n\t\t\t\tparams = matcher.parse(path);\n\t\t\t\tname = matcher.record.name;\n\t\t\t}\n\t\t} else {\n\t\t\tmatcher = currentLocation.name ? matcherMap.get(currentLocation.name) : matchers.find((m) => m.re.test(currentLocation.path));\n\t\t\tif (!matcher) throw createRouterError(ErrorTypes.MATCHER_NOT_FOUND, {\n\t\t\t\tlocation: location$1,\n\t\t\t\tcurrentLocation\n\t\t\t});\n\t\t\tname = matcher.record.name;\n\t\t\tparams = assign({}, currentLocation.params, location$1.params);\n\t\t\tpath = matcher.stringify(params);\n\t\t}\n\t\tconst matched = [];\n\t\tlet parentMatcher = matcher;\n\t\twhile (parentMatcher) {\n\t\t\tmatched.unshift(parentMatcher.record);\n\t\t\tparentMatcher = parentMatcher.parent;\n\t\t}\n\t\treturn {\n\t\t\tname,\n\t\t\tpath,\n\t\t\tparams,\n\t\t\tmatched,\n\t\t\tmeta: mergeMetaFields(matched)\n\t\t};\n\t}\n\troutes.forEach((route) => addRoute(route));\n\tfunction clearRoutes() {\n\t\tmatchers.length = 0;\n\t\tmatcherMap.clear();\n\t}\n\treturn {\n\t\taddRoute,\n\t\tresolve,\n\t\tremoveRoute,\n\t\tclearRoutes,\n\t\tgetRoutes,\n\t\tgetRecordMatcher\n\t};\n}\n/**\n* Picks an object param to contain only specified keys.\n*\n* @param params - params object to pick from\n* @param keys - keys to pick\n*/\nfunction pickParams(params, keys) {\n\tconst newParams = {};\n\tfor (const key of keys) if (key in params) newParams[key] = params[key];\n\treturn newParams;\n}\n/**\n* Normalizes a RouteRecordRaw. Creates a copy\n*\n* @param record\n* @returns the normalized version\n*/\nfunction normalizeRouteRecord(record) {\n\tconst normalized = {\n\t\tpath: record.path,\n\t\tredirect: record.redirect,\n\t\tname: record.name,\n\t\tmeta: record.meta || {},\n\t\taliasOf: record.aliasOf,\n\t\tbeforeEnter: record.beforeEnter,\n\t\tprops: normalizeRecordProps(record),\n\t\tchildren: record.children || [],\n\t\tinstances: {},\n\t\tleaveGuards: /* @__PURE__ */ new Set(),\n\t\tupdateGuards: /* @__PURE__ */ new Set(),\n\t\tenterCallbacks: {},\n\t\tcomponents: \"components\" in record ? record.components || null : record.component && { default: record.component }\n\t};\n\tObject.defineProperty(normalized, \"mods\", { value: {} });\n\treturn normalized;\n}\n/**\n* Normalize the optional `props` in a record to always be an object similar to\n* components. Also accept a boolean for components.\n* @param record\n*/\nfunction normalizeRecordProps(record) {\n\tconst propsObject = {};\n\tconst props = record.props || false;\n\tif (\"component\" in record) propsObject.default = props;\n\telse for (const name in record.components) propsObject[name] = typeof props === \"object\" ? props[name] : props;\n\treturn propsObject;\n}\n/**\n* Checks if a record or any of its parent is an alias\n* @param record\n*/\nfunction isAliasRecord(record) {\n\twhile (record) {\n\t\tif (record.record.aliasOf) return true;\n\t\trecord = record.parent;\n\t}\n\treturn false;\n}\n/**\n* Merge meta fields of an array of records\n*\n* @param matched - array of matched records\n*/\nfunction mergeMetaFields(matched) {\n\treturn matched.reduce((meta, record) => assign(meta, record.meta), {});\n}\nfunction isSameParam(a, b) {\n\treturn a.name === b.name && a.optional === b.optional && a.repeatable === b.repeatable;\n}\n/**\n* Check if a path and its alias have the same required params\n*\n* @param a - original record\n* @param b - alias record\n*/\nfunction checkSameParams(a, b) {\n\tfor (const key of a.keys) if (!key.optional && !b.keys.find(isSameParam.bind(null, key))) return warn$1(`Alias \"${b.record.path}\" and the original record: \"${a.record.path}\" must have the exact same param named \"${key.name}\"`);\n\tfor (const key of b.keys) if (!key.optional && !a.keys.find(isSameParam.bind(null, key))) return warn$1(`Alias \"${b.record.path}\" and the original record: \"${a.record.path}\" must have the exact same param named \"${key.name}\"`);\n}\n/**\n* A route with a name and a child with an empty path without a name should warn when adding the route\n*\n* @param mainNormalizedRecord - RouteRecordNormalized\n* @param parent - RouteRecordMatcher\n*/\nfunction checkChildMissingNameWithEmptyPath(mainNormalizedRecord, parent) {\n\tif (parent && parent.record.name && !mainNormalizedRecord.name && !mainNormalizedRecord.path) warn$1(`The route named \"${String(parent.record.name)}\" has a child without a name and an empty path. Using that name won't render the empty path child so you probably want to move the name to the child instead. If this is intentional, add a name to the child route to remove the warning.`);\n}\nfunction checkSameNameAsAncestor(record, parent) {\n\tfor (let ancestor = parent; ancestor; ancestor = ancestor.parent) if (ancestor.record.name === record.name) throw new Error(`A route named \"${String(record.name)}\" has been added as a ${parent === ancestor ? \"child\" : \"descendant\"} of a route with the same name. Route names must be unique and a nested route cannot use the same name as an ancestor.`);\n}\nfunction checkMissingParamsInAbsolutePath(record, parent) {\n\tfor (const key of parent.keys) if (!record.keys.find(isSameParam.bind(null, key))) return warn$1(`Absolute path \"${record.record.path}\" must have the exact same param named \"${key.name}\" as its parent \"${parent.record.path}\".`);\n}\n/**\n* Performs a binary search to find the correct insertion index for a new matcher.\n*\n* Matchers are primarily sorted by their score. If scores are tied then we also consider parent/child relationships,\n* with descendants coming before ancestors. If there's still a tie, new routes are inserted after existing routes.\n*\n* @param matcher - new matcher to be inserted\n* @param matchers - existing matchers\n*/\nfunction findInsertionIndex(matcher, matchers) {\n\tlet lower = 0;\n\tlet upper = matchers.length;\n\twhile (lower !== upper) {\n\t\tconst mid = lower + upper >> 1;\n\t\tif (comparePathParserScore(matcher, matchers[mid]) < 0) upper = mid;\n\t\telse lower = mid + 1;\n\t}\n\tconst insertionAncestor = getInsertionAncestor(matcher);\n\tif (insertionAncestor) {\n\t\tupper = matchers.lastIndexOf(insertionAncestor, upper - 1);\n\t\tif (process.env.NODE_ENV !== \"production\" && upper < 0) warn$1(`Finding ancestor route \"${insertionAncestor.record.path}\" failed for \"${matcher.record.path}\"`);\n\t}\n\treturn upper;\n}\nfunction getInsertionAncestor(matcher) {\n\tlet ancestor = matcher;\n\twhile (ancestor = ancestor.parent) if (isMatchable(ancestor) && comparePathParserScore(matcher, ancestor) === 0) return ancestor;\n}\n/**\n* Checks if a matcher can be reachable. This means if it's possible to reach it as a route. For example, routes without\n* a component, or name, or redirect, are just used to group other routes.\n* @param matcher\n* @param matcher.record record of the matcher\n* @returns\n*/\nfunction isMatchable({ record }) {\n\treturn !!(record.name || record.components && Object.keys(record.components).length || record.redirect);\n}\n\n//#endregion\n//#region src/RouterLink.ts\n/**\n* Returns the internal behavior of a {@link RouterLink} without the rendering part.\n*\n* @param props - a `to` location and an optional `replace` flag\n*/\nfunction useLink(props) {\n\tconst router = inject(routerKey);\n\tconst currentRoute = inject(routeLocationKey);\n\tlet hasPrevious = false;\n\tlet previousTo = null;\n\tconst route = computed(() => {\n\t\tconst to = unref(props.to);\n\t\tif (process.env.NODE_ENV !== \"production\" && (!hasPrevious || to !== previousTo)) {\n\t\t\tif (!isRouteLocation(to)) if (hasPrevious) warn$1(`Invalid value for prop \"to\" in useLink()\\n- to:`, to, `\\n- previous to:`, previousTo, `\\n- props:`, props);\n\t\t\telse warn$1(`Invalid value for prop \"to\" in useLink()\\n- to:`, to, `\\n- props:`, props);\n\t\t\tpreviousTo = to;\n\t\t\thasPrevious = true;\n\t\t}\n\t\treturn router.resolve(to);\n\t});\n\tconst activeRecordIndex = computed(() => {\n\t\tconst { matched } = route.value;\n\t\tconst { length } = matched;\n\t\tconst routeMatched = matched[length - 1];\n\t\tconst currentMatched = currentRoute.matched;\n\t\tif (!routeMatched || !currentMatched.length) return -1;\n\t\tconst index = currentMatched.findIndex(isSameRouteRecord.bind(null, routeMatched));\n\t\tif (index > -1) return index;\n\t\tconst parentRecordPath = getOriginalPath(matched[length - 2]);\n\t\treturn length > 1 && getOriginalPath(routeMatched) === parentRecordPath && currentMatched[currentMatched.length - 1].path !== parentRecordPath ? currentMatched.findIndex(isSameRouteRecord.bind(null, matched[length - 2])) : index;\n\t});\n\tconst isActive = computed(() => activeRecordIndex.value > -1 && includesParams(currentRoute.params, route.value.params));\n\tconst isExactActive = computed(() => activeRecordIndex.value > -1 && activeRecordIndex.value === currentRoute.matched.length - 1 && isSameRouteLocationParams(currentRoute.params, route.value.params));\n\tfunction navigate(e = {}) {\n\t\tif (guardEvent(e)) {\n\t\t\tconst p = router[unref(props.replace) ? \"replace\" : \"push\"](unref(props.to)).catch(noop);\n\t\t\tif (props.viewTransition && typeof document !== \"undefined\" && \"startViewTransition\" in document) document.startViewTransition(() => p);\n\t\t\treturn p;\n\t\t}\n\t\treturn Promise.resolve();\n\t}\n\tif ((process.env.NODE_ENV !== \"production\" || __VUE_PROD_DEVTOOLS__) && isBrowser) {\n\t\tconst instance = getCurrentInstance();\n\t\tif (instance) {\n\t\t\tconst linkContextDevtools = {\n\t\t\t\troute: route.value,\n\t\t\t\tisActive: isActive.value,\n\t\t\t\tisExactActive: isExactActive.value,\n\t\t\t\terror: null\n\t\t\t};\n\t\t\tinstance.__vrl_devtools = instance.__vrl_devtools || [];\n\t\t\tinstance.__vrl_devtools.push(linkContextDevtools);\n\t\t\twatchEffect(() => {\n\t\t\t\tlinkContextDevtools.route = route.value;\n\t\t\t\tlinkContextDevtools.isActive = isActive.value;\n\t\t\t\tlinkContextDevtools.isExactActive = isExactActive.value;\n\t\t\t\tlinkContextDevtools.error = isRouteLocation(unref(props.to)) ? null : \"Invalid \\\"to\\\" value\";\n\t\t\t}, { flush: \"post\" });\n\t\t}\n\t}\n\t/**\n\t* NOTE: update {@link _RouterLinkI}'s `$slots` type when updating this\n\t*/\n\treturn {\n\t\troute,\n\t\thref: computed(() => route.value.href),\n\t\tisActive,\n\t\tisExactActive,\n\t\tnavigate\n\t};\n}\nfunction preferSingleVNode(vnodes) {\n\treturn vnodes.length === 1 ? vnodes[0] : vnodes;\n}\nconst RouterLinkImpl = /* @__PURE__ */ defineComponent({\n\tname: \"RouterLink\",\n\tcompatConfig: { MODE: 3 },\n\tprops: {\n\t\tto: {\n\t\t\ttype: [String, Object],\n\t\t\trequired: true\n\t\t},\n\t\treplace: Boolean,\n\t\tactiveClass: String,\n\t\texactActiveClass: String,\n\t\tcustom: Boolean,\n\t\tariaCurrentValue: {\n\t\t\ttype: String,\n\t\t\tdefault: \"page\"\n\t\t},\n\t\tviewTransition: Boolean\n\t},\n\tuseLink,\n\tsetup(props, { slots }) {\n\t\tconst link = reactive(useLink(props));\n\t\tconst { options } = inject(routerKey);\n\t\tconst elClass = computed(() => ({\n\t\t\t[getLinkClass(props.activeClass, options.linkActiveClass, \"router-link-active\")]: link.isActive,\n\t\t\t[getLinkClass(props.exactActiveClass, options.linkExactActiveClass, \"router-link-exact-active\")]: link.isExactActive\n\t\t}));\n\t\treturn () => {\n\t\t\tconst children = slots.default && preferSingleVNode(slots.default(link));\n\t\t\treturn props.custom ? children : h(\"a\", {\n\t\t\t\t\"aria-current\": link.isExactActive ? props.ariaCurrentValue : null,\n\t\t\t\thref: link.href,\n\t\t\t\tonClick: link.navigate,\n\t\t\t\tclass: elClass.value\n\t\t\t}, children);\n\t\t};\n\t}\n});\n/**\n* Component to render a link that triggers a navigation on click.\n*/\nconst RouterLink = RouterLinkImpl;\nfunction guardEvent(e) {\n\tif (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) return;\n\tif (e.defaultPrevented) return;\n\tif (e.button !== void 0 && e.button !== 0) return;\n\tif (e.currentTarget && e.currentTarget.getAttribute) {\n\t\tconst target = e.currentTarget.getAttribute(\"target\");\n\t\tif (/\\b_blank\\b/i.test(target)) return;\n\t}\n\tif (e.preventDefault) e.preventDefault();\n\treturn true;\n}\nfunction includesParams(outer, inner) {\n\tfor (const key in inner) {\n\t\tconst innerValue = inner[key];\n\t\tconst outerValue = outer[key];\n\t\tif (typeof innerValue === \"string\") {\n\t\t\tif (innerValue !== outerValue) return false;\n\t\t} else if (!isArray(outerValue) || outerValue.length !== innerValue.length || innerValue.some((value, i) => value.valueOf() !== outerValue[i].valueOf())) return false;\n\t}\n\treturn true;\n}\n/**\n* Get the original path value of a record by following its aliasOf\n* @param record\n*/\nfunction getOriginalPath(record) {\n\treturn record ? record.aliasOf ? record.aliasOf.path : record.path : \"\";\n}\n/**\n* Utility class to get the active class based on defaults.\n* @param propClass\n* @param globalClass\n* @param defaultClass\n*/\nconst getLinkClass = (propClass, globalClass, defaultClass) => propClass != null ? propClass : globalClass != null ? globalClass : defaultClass;\n\n//#endregion\n//#region src/RouterView.ts\nconst RouterViewImpl = /* @__PURE__ */ defineComponent({\n\tname: \"RouterView\",\n\tinheritAttrs: false,\n\tprops: {\n\t\tname: {\n\t\t\ttype: String,\n\t\t\tdefault: \"default\"\n\t\t},\n\t\troute: Object\n\t},\n\tcompatConfig: { MODE: 3 },\n\tsetup(props, { attrs, slots }) {\n\t\tprocess.env.NODE_ENV !== \"production\" && warnDeprecatedUsage();\n\t\tconst injectedRoute = inject(routerViewLocationKey);\n\t\tconst routeToDisplay = computed(() => props.route || injectedRoute.value);\n\t\tconst injectedDepth = inject(viewDepthKey, 0);\n\t\tconst depth = computed(() => {\n\t\t\tlet initialDepth = unref(injectedDepth);\n\t\t\tconst { matched } = routeToDisplay.value;\n\t\t\tlet matchedRoute;\n\t\t\twhile ((matchedRoute = matched[initialDepth]) && !matchedRoute.components) initialDepth++;\n\t\t\treturn initialDepth;\n\t\t});\n\t\tconst matchedRouteRef = computed(() => routeToDisplay.value.matched[depth.value]);\n\t\tprovide(viewDepthKey, computed(() => depth.value + 1));\n\t\tprovide(matchedRouteKey, matchedRouteRef);\n\t\tprovide(routerViewLocationKey, routeToDisplay);\n\t\tconst viewRef = ref();\n\t\twatch(() => [\n\t\t\tviewRef.value,\n\t\t\tmatchedRouteRef.value,\n\t\t\tprops.name\n\t\t], ([instance, to, name], [oldInstance, from, oldName]) => {\n\t\t\tif (to) {\n\t\t\t\tto.instances[name] = instance;\n\t\t\t\tif (from && from !== to && instance && instance === oldInstance) {\n\t\t\t\t\tif (!to.leaveGuards.size) to.leaveGuards = from.leaveGuards;\n\t\t\t\t\tif (!to.updateGuards.size) to.updateGuards = from.updateGuards;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (instance && to && (!from || !isSameRouteRecord(to, from) || !oldInstance)) (to.enterCallbacks[name] || []).forEach((callback) => callback(instance));\n\t\t}, { flush: \"post\" });\n\t\treturn () => {\n\t\t\tconst route = routeToDisplay.value;\n\t\t\tconst currentName = props.name;\n\t\t\tconst matchedRoute = matchedRouteRef.value;\n\t\t\tconst ViewComponent = matchedRoute && matchedRoute.components[currentName];\n\t\t\tif (!ViewComponent) return normalizeSlot(slots.default, {\n\t\t\t\tComponent: ViewComponent,\n\t\t\t\troute\n\t\t\t});\n\t\t\tconst routePropsOption = matchedRoute.props[currentName];\n\t\t\tconst routeProps = routePropsOption ? routePropsOption === true ? route.params : typeof routePropsOption === \"function\" ? routePropsOption(route) : routePropsOption : null;\n\t\t\tconst onVnodeUnmounted = (vnode) => {\n\t\t\t\tif (vnode.component.isUnmounted) matchedRoute.instances[currentName] = null;\n\t\t\t};\n\t\t\tconst component = h(ViewComponent, assign({}, routeProps, attrs, {\n\t\t\t\tonVnodeUnmounted,\n\t\t\t\tref: viewRef\n\t\t\t}));\n\t\t\tif ((process.env.NODE_ENV !== \"production\" || __VUE_PROD_DEVTOOLS__) && isBrowser && component.ref) {\n\t\t\t\tconst info = {\n\t\t\t\t\tdepth: depth.value,\n\t\t\t\t\tname: matchedRoute.name,\n\t\t\t\t\tpath: matchedRoute.path,\n\t\t\t\t\tmeta: matchedRoute.meta\n\t\t\t\t};\n\t\t\t\t(isArray(component.ref) ? component.ref.map((r) => r.i) : [component.ref.i]).forEach((instance) => {\n\t\t\t\t\tinstance.__vrv_devtools = info;\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn normalizeSlot(slots.default, {\n\t\t\t\tComponent: component,\n\t\t\t\troute\n\t\t\t}) || component;\n\t\t};\n\t}\n});\nfunction normalizeSlot(slot, data) {\n\tif (!slot) return null;\n\tconst slotContent = slot(data);\n\treturn slotContent.length === 1 ? slotContent[0] : slotContent;\n}\n/**\n* Component to display the current route the user is at.\n*/\nconst RouterView = RouterViewImpl;\nfunction warnDeprecatedUsage() {\n\tconst instance = getCurrentInstance();\n\tconst parentName = instance.parent && instance.parent.type.name;\n\tconst parentSubTreeType = instance.parent && instance.parent.subTree && instance.parent.subTree.type;\n\tif (parentName && (parentName === \"KeepAlive\" || parentName.includes(\"Transition\")) && typeof parentSubTreeType === \"object\" && parentSubTreeType.name === \"RouterView\") {\n\t\tconst comp = parentName === \"KeepAlive\" ? \"keep-alive\" : \"transition\";\n\t\twarn$1(`<router-view> can no longer be used directly inside <transition> or <keep-alive>.\nUse slot props instead:\n\n<router-view v-slot=\"{ Component }\">\n <${comp}>\\n <component :is=\"Component\" />\\n </${comp}>\\n</router-view>`);\n\t}\n}\n\n//#endregion\n//#region src/router.ts\n/**\n* Creates a Router instance that can be used by a Vue app.\n*\n* @param options - {@link RouterOptions}\n*/\nfunction createRouter(options) {\n\tconst matcher = createRouterMatcher(options.routes, options);\n\tconst parseQuery$1 = options.parseQuery || parseQuery;\n\tconst stringifyQuery$1 = options.stringifyQuery || stringifyQuery;\n\tconst routerHistory = options.history;\n\tif (process.env.NODE_ENV !== \"production\" && !routerHistory) throw new Error(\"Provide the \\\"history\\\" option when calling \\\"createRouter()\\\": https://router.vuejs.org/api/interfaces/RouterOptions.html#history\");\n\tconst beforeGuards = useCallbacks();\n\tconst beforeResolveGuards = useCallbacks();\n\tconst afterGuards = useCallbacks();\n\tconst currentRoute = shallowRef(START_LOCATION_NORMALIZED);\n\tlet pendingLocation = START_LOCATION_NORMALIZED;\n\tif (isBrowser && options.scrollBehavior && \"scrollRestoration\" in history) history.scrollRestoration = \"manual\";\n\tconst normalizeParams = applyToParams.bind(null, (paramValue) => \"\" + paramValue);\n\tconst encodeParams = applyToParams.bind(null, encodeParam);\n\tconst decodeParams = applyToParams.bind(null, decode);\n\tfunction addRoute(parentOrRoute, route) {\n\t\tlet parent;\n\t\tlet record;\n\t\tif (isRouteName(parentOrRoute)) {\n\t\t\tparent = matcher.getRecordMatcher(parentOrRoute);\n\t\t\tif (process.env.NODE_ENV !== \"production\" && !parent) warn$1(`Parent route \"${String(parentOrRoute)}\" not found when adding child route`, route);\n\t\t\trecord = route;\n\t\t} else record = parentOrRoute;\n\t\treturn matcher.addRoute(record, parent);\n\t}\n\tfunction removeRoute(name) {\n\t\tconst recordMatcher = matcher.getRecordMatcher(name);\n\t\tif (recordMatcher) matcher.removeRoute(recordMatcher);\n\t\telse if (process.env.NODE_ENV !== \"production\") warn$1(`Cannot remove non-existent route \"${String(name)}\"`);\n\t}\n\tfunction getRoutes() {\n\t\treturn matcher.getRoutes().map((routeMatcher) => routeMatcher.record);\n\t}\n\tfunction hasRoute(name) {\n\t\treturn !!matcher.getRecordMatcher(name);\n\t}\n\tfunction resolve(rawLocation, currentLocation) {\n\t\tcurrentLocation = assign({}, currentLocation || currentRoute.value);\n\t\tif (typeof rawLocation === \"string\") {\n\t\t\tconst locationNormalized = parseURL(parseQuery$1, rawLocation, currentLocation.path);\n\t\t\tconst matchedRoute$1 = matcher.resolve({ path: locationNormalized.path }, currentLocation);\n\t\t\tconst href$1 = routerHistory.createHref(locationNormalized.fullPath);\n\t\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\t\tif (href$1.startsWith(\"//\")) warn$1(`Location \"${rawLocation}\" resolved to \"${href$1}\". A resolved location cannot start with multiple slashes.`);\n\t\t\t\telse if (!matchedRoute$1.matched.length) warn$1(`No match found for location with path \"${rawLocation}\"`);\n\t\t\t}\n\t\t\treturn assign(locationNormalized, matchedRoute$1, {\n\t\t\t\tparams: decodeParams(matchedRoute$1.params),\n\t\t\t\thash: decode(locationNormalized.hash),\n\t\t\t\tredirectedFrom: void 0,\n\t\t\t\thref: href$1\n\t\t\t});\n\t\t}\n\t\tif (process.env.NODE_ENV !== \"production\" && !isRouteLocation(rawLocation)) {\n\t\t\twarn$1(`router.resolve() was passed an invalid location. This will fail in production.\\n- Location:`, rawLocation);\n\t\t\treturn resolve({});\n\t\t}\n\t\tlet matcherLocation;\n\t\tif (rawLocation.path != null) {\n\t\t\tif (process.env.NODE_ENV !== \"production\" && \"params\" in rawLocation && !(\"name\" in rawLocation) && Object.keys(rawLocation.params).length) warn$1(`Path \"${rawLocation.path}\" was passed with params but they will be ignored. Use a named route alongside params instead.`);\n\t\t\tmatcherLocation = assign({}, rawLocation, { path: parseURL(parseQuery$1, rawLocation.path, currentLocation.path).path });\n\t\t} else {\n\t\t\tconst targetParams = assign({}, rawLocation.params);\n\t\t\tfor (const key in targetParams) if (targetParams[key] == null) delete targetParams[key];\n\t\t\tmatcherLocation = assign({}, rawLocation, { params: encodeParams(targetParams) });\n\t\t\tcurrentLocation.params = encodeParams(currentLocation.params);\n\t\t}\n\t\tconst matchedRoute = matcher.resolve(matcherLocation, currentLocation);\n\t\tconst hash = rawLocation.hash || \"\";\n\t\tif (process.env.NODE_ENV !== \"production\" && hash && !hash.startsWith(\"#\")) warn$1(`A \\`hash\\` should always start with the character \"#\". Replace \"${hash}\" with \"#${hash}\".`);\n\t\tmatchedRoute.params = normalizeParams(decodeParams(matchedRoute.params));\n\t\tconst fullPath = stringifyURL(stringifyQuery$1, assign({}, rawLocation, {\n\t\t\thash: encodeHash(hash),\n\t\t\tpath: matchedRoute.path\n\t\t}));\n\t\tconst href = routerHistory.createHref(fullPath);\n\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\tif (href.startsWith(\"//\")) warn$1(`Location \"${rawLocation}\" resolved to \"${href}\". A resolved location cannot start with multiple slashes.`);\n\t\t\telse if (!matchedRoute.matched.length) warn$1(`No match found for location with path \"${rawLocation.path != null ? rawLocation.path : rawLocation}\"`);\n\t\t}\n\t\treturn assign({\n\t\t\tfullPath,\n\t\t\thash,\n\t\t\tquery: stringifyQuery$1 === stringifyQuery ? normalizeQuery(rawLocation.query) : rawLocation.query || {}\n\t\t}, matchedRoute, {\n\t\t\tredirectedFrom: void 0,\n\t\t\thref\n\t\t});\n\t}\n\tfunction locationAsObject(to) {\n\t\treturn typeof to === \"string\" ? parseURL(parseQuery$1, to, currentRoute.value.path) : assign({}, to);\n\t}\n\tfunction checkCanceledNavigation(to, from) {\n\t\tif (pendingLocation !== to) return createRouterError(ErrorTypes.NAVIGATION_CANCELLED, {\n\t\t\tfrom,\n\t\t\tto\n\t\t});\n\t}\n\tfunction push(to) {\n\t\treturn pushWithRedirect(to);\n\t}\n\tfunction replace(to) {\n\t\treturn push(assign(locationAsObject(to), { replace: true }));\n\t}\n\tfunction handleRedirectRecord(to, from) {\n\t\tconst lastMatched = to.matched[to.matched.length - 1];\n\t\tif (lastMatched && lastMatched.redirect) {\n\t\t\tconst { redirect } = lastMatched;\n\t\t\tlet newTargetLocation = typeof redirect === \"function\" ? redirect(to, from) : redirect;\n\t\t\tif (typeof newTargetLocation === \"string\") {\n\t\t\t\tnewTargetLocation = newTargetLocation.includes(\"?\") || newTargetLocation.includes(\"#\") ? newTargetLocation = locationAsObject(newTargetLocation) : { path: newTargetLocation };\n\t\t\t\tnewTargetLocation.params = {};\n\t\t\t}\n\t\t\tif (process.env.NODE_ENV !== \"production\" && newTargetLocation.path == null && !(\"name\" in newTargetLocation)) {\n\t\t\t\twarn$1(`Invalid redirect found:\\n${JSON.stringify(newTargetLocation, null, 2)}\\n when navigating to \"${to.fullPath}\". A redirect must contain a name or path. This will break in production.`);\n\t\t\t\tthrow new Error(\"Invalid redirect\");\n\t\t\t}\n\t\t\treturn assign({\n\t\t\t\tquery: to.query,\n\t\t\t\thash: to.hash,\n\t\t\t\tparams: newTargetLocation.path != null ? {} : to.params\n\t\t\t}, newTargetLocation);\n\t\t}\n\t}\n\tfunction pushWithRedirect(to, redirectedFrom) {\n\t\tconst targetLocation = pendingLocation = resolve(to);\n\t\tconst from = currentRoute.value;\n\t\tconst data = to.state;\n\t\tconst force = to.force;\n\t\tconst replace$1 = to.replace === true;\n\t\tconst shouldRedirect = handleRedirectRecord(targetLocation, from);\n\t\tif (shouldRedirect) return pushWithRedirect(assign(locationAsObject(shouldRedirect), {\n\t\t\tstate: typeof shouldRedirect === \"object\" ? assign({}, data, shouldRedirect.state) : data,\n\t\t\tforce,\n\t\t\treplace: replace$1\n\t\t}), redirectedFrom || targetLocation);\n\t\tconst toLocation = targetLocation;\n\t\ttoLocation.redirectedFrom = redirectedFrom;\n\t\tlet failure;\n\t\tif (!force && isSameRouteLocation(stringifyQuery$1, from, targetLocation)) {\n\t\t\tfailure = createRouterError(ErrorTypes.NAVIGATION_DUPLICATED, {\n\t\t\t\tto: toLocation,\n\t\t\t\tfrom\n\t\t\t});\n\t\t\thandleScroll(from, from, true, false);\n\t\t}\n\t\treturn (failure ? Promise.resolve(failure) : navigate(toLocation, from)).catch((error) => isNavigationFailure(error) ? isNavigationFailure(error, ErrorTypes.NAVIGATION_GUARD_REDIRECT) ? error : markAsReady(error) : triggerError(error, toLocation, from)).then((failure$1) => {\n\t\t\tif (failure$1) {\n\t\t\t\tif (isNavigationFailure(failure$1, ErrorTypes.NAVIGATION_GUARD_REDIRECT)) {\n\t\t\t\t\tif (process.env.NODE_ENV !== \"production\" && isSameRouteLocation(stringifyQuery$1, resolve(failure$1.to), toLocation) && redirectedFrom && (redirectedFrom._count = redirectedFrom._count ? redirectedFrom._count + 1 : 1) > 30) {\n\t\t\t\t\t\twarn$1(`Detected a possibly infinite redirection in a navigation guard when going from \"${from.fullPath}\" to \"${toLocation.fullPath}\". Aborting to avoid a Stack Overflow.\\n Are you always returning a new location within a navigation guard? That would lead to this error. Only return when redirecting or aborting, that should fix this. This might break in production if not fixed.`);\n\t\t\t\t\t\treturn Promise.reject(/* @__PURE__ */ new Error(\"Infinite redirect in navigation guard\"));\n\t\t\t\t\t}\n\t\t\t\t\treturn pushWithRedirect(assign({ replace: replace$1 }, locationAsObject(failure$1.to), {\n\t\t\t\t\t\tstate: typeof failure$1.to === \"object\" ? assign({}, data, failure$1.to.state) : data,\n\t\t\t\t\t\tforce\n\t\t\t\t\t}), redirectedFrom || toLocation);\n\t\t\t\t}\n\t\t\t} else failure$1 = finalizeNavigation(toLocation, from, true, replace$1, data);\n\t\t\ttriggerAfterEach(toLocation, from, failure$1);\n\t\t\treturn failure$1;\n\t\t});\n\t}\n\t/**\n\t* Helper to reject and skip all navigation guards if a new navigation happened\n\t* @param to\n\t* @param from\n\t*/\n\tfunction checkCanceledNavigationAndReject(to, from) {\n\t\tconst error = checkCanceledNavigation(to, from);\n\t\treturn error ? Promise.reject(error) : Promise.resolve();\n\t}\n\tfunction runWithContext(fn) {\n\t\tconst app = installedApps.values().next().value;\n\t\treturn app && typeof app.runWithContext === \"function\" ? app.runWithContext(fn) : fn();\n\t}\n\tfunction navigate(to, from) {\n\t\tlet guards;\n\t\tconst [leavingRecords, updatingRecords, enteringRecords] = extractChangingRecords(to, from);\n\t\tguards = extractComponentsGuards(leavingRecords.reverse(), \"beforeRouteLeave\", to, from);\n\t\tfor (const record of leavingRecords) record.leaveGuards.forEach((guard) => {\n\t\t\tguards.push(guardToPromiseFn(guard, to, from));\n\t\t});\n\t\tconst canceledNavigationCheck = checkCanceledNavigationAndReject.bind(null, to, from);\n\t\tguards.push(canceledNavigationCheck);\n\t\treturn runGuardQueue(guards).then(() => {\n\t\t\tguards = [];\n\t\t\tfor (const guard of beforeGuards.list()) guards.push(guardToPromiseFn(guard, to, from));\n\t\t\tguards.push(canceledNavigationCheck);\n\t\t\treturn runGuardQueue(guards);\n\t\t}).then(() => {\n\t\t\tguards = extractComponentsGuards(updatingRecords, \"beforeRouteUpdate\", to, from);\n\t\t\tfor (const record of updatingRecords) record.updateGuards.forEach((guard) => {\n\t\t\t\tguards.push(guardToPromiseFn(guard, to, from));\n\t\t\t});\n\t\t\tguards.push(canceledNavigationCheck);\n\t\t\treturn runGuardQueue(guards);\n\t\t}).then(() => {\n\t\t\tguards = [];\n\t\t\tfor (const record of enteringRecords) if (record.beforeEnter) if (isArray(record.beforeEnter)) for (const beforeEnter of record.beforeEnter) guards.push(guardToPromiseFn(beforeEnter, to, from));\n\t\t\telse guards.push(guardToPromiseFn(record.beforeEnter, to, from));\n\t\t\tguards.push(canceledNavigationCheck);\n\t\t\treturn runGuardQueue(guards);\n\t\t}).then(() => {\n\t\t\tto.matched.forEach((record) => record.enterCallbacks = {});\n\t\t\tguards = extractComponentsGuards(enteringRecords, \"beforeRouteEnter\", to, from, runWithContext);\n\t\t\tguards.push(canceledNavigationCheck);\n\t\t\treturn runGuardQueue(guards);\n\t\t}).then(() => {\n\t\t\tguards = [];\n\t\t\tfor (const guard of beforeResolveGuards.list()) guards.push(guardToPromiseFn(guard, to, from));\n\t\t\tguards.push(canceledNavigationCheck);\n\t\t\treturn runGuardQueue(guards);\n\t\t}).catch((err) => isNavigationFailure(err, ErrorTypes.NAVIGATION_CANCELLED) ? err : Promise.reject(err));\n\t}\n\tfunction triggerAfterEach(to, from, failure) {\n\t\tafterGuards.list().forEach((guard) => runWithContext(() => guard(to, from, failure)));\n\t}\n\t/**\n\t* - Cleans up any navigation guards\n\t* - Changes the url if necessary\n\t* - Calls the scrollBehavior\n\t*/\n\tfunction finalizeNavigation(toLocation, from, isPush, replace$1, data) {\n\t\tconst error = checkCanceledNavigation(toLocation, from);\n\t\tif (error) return error;\n\t\tconst isFirstNavigation = from === START_LOCATION_NORMALIZED;\n\t\tconst state = !isBrowser ? {} : history.state;\n\t\tif (isPush) if (replace$1 || isFirstNavigation) routerHistory.replace(toLocation.fullPath, assign({ scroll: isFirstNavigation && state && state.scroll }, data));\n\t\telse routerHistory.push(toLocation.fullPath, data);\n\t\tcurrentRoute.value = toLocation;\n\t\thandleScroll(toLocation, from, isPush, isFirstNavigation);\n\t\tmarkAsReady();\n\t}\n\tlet removeHistoryListener;\n\tfunction setupListeners() {\n\t\tif (removeHistoryListener) return;\n\t\tremoveHistoryListener = routerHistory.listen((to, _from, info) => {\n\t\t\tif (!router.listening) return;\n\t\t\tconst toLocation = resolve(to);\n\t\t\tconst shouldRedirect = handleRedirectRecord(toLocation, router.currentRoute.value);\n\t\t\tif (shouldRedirect) {\n\t\t\t\tpushWithRedirect(assign(shouldRedirect, {\n\t\t\t\t\treplace: true,\n\t\t\t\t\tforce: true\n\t\t\t\t}), toLocation).catch(noop);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpendingLocation = toLocation;\n\t\t\tconst from = currentRoute.value;\n\t\t\tif (isBrowser) saveScrollPosition(getScrollKey(from.fullPath, info.delta), computeScrollPosition());\n\t\t\tnavigate(toLocation, from).catch((error) => {\n\t\t\t\tif (isNavigationFailure(error, ErrorTypes.NAVIGATION_ABORTED | ErrorTypes.NAVIGATION_CANCELLED)) return error;\n\t\t\t\tif (isNavigationFailure(error, ErrorTypes.NAVIGATION_GUARD_REDIRECT)) {\n\t\t\t\t\tpushWithRedirect(assign(locationAsObject(error.to), { force: true }), toLocation).then((failure) => {\n\t\t\t\t\t\tif (isNavigationFailure(failure, ErrorTypes.NAVIGATION_ABORTED | ErrorTypes.NAVIGATION_DUPLICATED) && !info.delta && info.type === NavigationType.pop) routerHistory.go(-1, false);\n\t\t\t\t\t}).catch(noop);\n\t\t\t\t\treturn Promise.reject();\n\t\t\t\t}\n\t\t\t\tif (info.delta) routerHistory.go(-info.delta, false);\n\t\t\t\treturn triggerError(error, toLocation, from);\n\t\t\t}).then((failure) => {\n\t\t\t\tfailure = failure || finalizeNavigation(toLocation, from, false);\n\t\t\t\tif (failure) {\n\t\t\t\t\tif (info.delta && !isNavigationFailure(failure, ErrorTypes.NAVIGATION_CANCELLED)) routerHistory.go(-info.delta, false);\n\t\t\t\t\telse if (info.type === NavigationType.pop && isNavigationFailure(failure, ErrorTypes.NAVIGATION_ABORTED | ErrorTypes.NAVIGATION_DUPLICATED)) routerHistory.go(-1, false);\n\t\t\t\t}\n\t\t\t\ttriggerAfterEach(toLocation, from, failure);\n\t\t\t}).catch(noop);\n\t\t});\n\t}\n\tlet readyHandlers = useCallbacks();\n\tlet errorListeners = useCallbacks();\n\tlet ready;\n\t/**\n\t* Trigger errorListeners added via onError and throws the error as well\n\t*\n\t* @param error - error to throw\n\t* @param to - location we were navigating to when the error happened\n\t* @param from - location we were navigating from when the error happened\n\t* @returns the error as a rejected promise\n\t*/\n\tfunction triggerError(error, to, from) {\n\t\tmarkAsReady(error);\n\t\tconst list = errorListeners.list();\n\t\tif (list.length) list.forEach((handler) => handler(error, to, from));\n\t\telse {\n\t\t\tif (process.env.NODE_ENV !== \"production\") warn$1(\"uncaught error during route navigation:\");\n\t\t\tconsole.error(error);\n\t\t}\n\t\treturn Promise.reject(error);\n\t}\n\tfunction isReady() {\n\t\tif (ready && currentRoute.value !== START_LOCATION_NORMALIZED) return Promise.resolve();\n\t\treturn new Promise((resolve$1, reject) => {\n\t\t\treadyHandlers.add([resolve$1, reject]);\n\t\t});\n\t}\n\tfunction markAsReady(err) {\n\t\tif (!ready) {\n\t\t\tready = !err;\n\t\t\tsetupListeners();\n\t\t\treadyHandlers.list().forEach(([resolve$1, reject]) => err ? reject(err) : resolve$1());\n\t\t\treadyHandlers.reset();\n\t\t}\n\t\treturn err;\n\t}\n\tfunction handleScroll(to, from, isPush, isFirstNavigation) {\n\t\tconst { scrollBehavior } = options;\n\t\tif (!isBrowser || !scrollBehavior) return Promise.resolve();\n\t\tconst scrollPosition = !isPush && getSavedScrollPosition(getScrollKey(to.fullPath, 0)) || (isFirstNavigation || !isPush) && history.state && history.state.scroll || null;\n\t\treturn nextTick().then(() => scrollBehavior(to, from, scrollPosition)).then((position) => position && scrollToPosition(position)).catch((err) => triggerError(err, to, from));\n\t}\n\tconst go = (delta) => routerHistory.go(delta);\n\tlet started;\n\tconst installedApps = /* @__PURE__ */ new Set();\n\tconst router = {\n\t\tcurrentRoute,\n\t\tlistening: true,\n\t\taddRoute,\n\t\tremoveRoute,\n\t\tclearRoutes: matcher.clearRoutes,\n\t\thasRoute,\n\t\tgetRoutes,\n\t\tresolve,\n\t\toptions,\n\t\tpush,\n\t\treplace,\n\t\tgo,\n\t\tback: () => go(-1),\n\t\tforward: () => go(1),\n\t\tbeforeEach: beforeGuards.add,\n\t\tbeforeResolve: beforeResolveGuards.add,\n\t\tafterEach: afterGuards.add,\n\t\tonError: errorListeners.add,\n\t\tisReady,\n\t\tinstall(app) {\n\t\t\tapp.component(\"RouterLink\", RouterLink);\n\t\t\tapp.component(\"RouterView\", RouterView);\n\t\t\tapp.config.globalProperties.$router = router;\n\t\t\tObject.defineProperty(app.config.globalProperties, \"$route\", {\n\t\t\t\tenumerable: true,\n\t\t\t\tget: () => unref(currentRoute)\n\t\t\t});\n\t\t\tif (isBrowser && !started && currentRoute.value === START_LOCATION_NORMALIZED) {\n\t\t\t\tstarted = true;\n\t\t\t\tpush(routerHistory.location).catch((err) => {\n\t\t\t\t\tif (process.env.NODE_ENV !== \"production\") warn$1(\"Unexpected error when starting the router:\", err);\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst reactiveRoute = {};\n\t\t\tfor (const key in START_LOCATION_NORMALIZED) Object.defineProperty(reactiveRoute, key, {\n\t\t\t\tget: () => currentRoute.value[key],\n\t\t\t\tenumerable: true\n\t\t\t});\n\t\t\tapp.provide(routerKey, router);\n\t\t\tapp.provide(routeLocationKey, shallowReactive(reactiveRoute));\n\t\t\tapp.provide(routerViewLocationKey, currentRoute);\n\t\t\tconst unmountApp = app.unmount;\n\t\t\tinstalledApps.add(app);\n\t\t\tapp.unmount = function() {\n\t\t\t\tinstalledApps.delete(app);\n\t\t\t\tif (installedApps.size < 1) {\n\t\t\t\t\tpendingLocation = START_LOCATION_NORMALIZED;\n\t\t\t\t\tremoveHistoryListener && removeHistoryListener();\n\t\t\t\t\tremoveHistoryListener = null;\n\t\t\t\t\tcurrentRoute.value = START_LOCATION_NORMALIZED;\n\t\t\t\t\tstarted = false;\n\t\t\t\t\tready = false;\n\t\t\t\t}\n\t\t\t\tunmountApp();\n\t\t\t};\n\t\t\tif ((process.env.NODE_ENV !== \"production\" || __VUE_PROD_DEVTOOLS__) && isBrowser) addDevtools(app, router, matcher);\n\t\t}\n\t};\n\tfunction runGuardQueue(guards) {\n\t\treturn guards.reduce((promise, guard) => promise.then(() => runWithContext(guard)), Promise.resolve());\n\t}\n\treturn router;\n}\n\n//#endregion\n//#region src/useApi.ts\n/**\n* Returns the router instance. Equivalent to using `$router` inside\n* templates.\n*/\nfunction useRouter() {\n\treturn inject(routerKey);\n}\n/**\n* Returns the current route location. Equivalent to using `$route` inside\n* templates.\n*/\nfunction useRoute(_name) {\n\treturn inject(routeLocationKey);\n}\n\n//#endregion\nexport { NavigationFailureType, RouterLink, RouterView, START_LOCATION_NORMALIZED as START_LOCATION, createMemoryHistory, createRouter, createRouterMatcher, createWebHashHistory, createWebHistory, isNavigationFailure, loadRouteLocation, matchedRouteKey, onBeforeRouteLeave, onBeforeRouteUpdate, parseQuery, routeLocationKey, routerKey, routerViewLocationKey, stringifyQuery, useLink, useRoute, useRouter, viewDepthKey };","<script setup lang=\"ts\">\nimport { useRouter } from 'vue-router'\nimport Button from 'primevue/button'\nimport WStatusTag from './WStatusTag.vue'\n\nconst props = defineProps<{\n title: string\n subtitle?: string\n icon?: string\n backRoute?: string\n backTo?: string | Record<string, unknown>\n status?: string\n statusMap?: Record<string, { label: string; severity: string }>\n}>()\n\nconst router = useRouter()\n\nfunction goBack() {\n if (props.backTo) {\n router.push(typeof props.backTo === 'string' ? { name: props.backTo } : props.backTo)\n } else if (props.backRoute) {\n router.push({ name: props.backRoute })\n } else {\n router.back()\n }\n}\n</script>\n\n<template>\n <div class=\"w-detail-header\">\n <div class=\"w-detail-header-left\">\n <Button icon=\"pi pi-arrow-left\" text rounded @click=\"goBack\" />\n <i v-if=\"icon\" :class=\"icon\" class=\"w-detail-header-icon\" />\n <div class=\"w-detail-header-content\">\n <h2 class=\"w-detail-header-title\">{{ title }}</h2>\n <p v-if=\"subtitle\" class=\"w-detail-header-subtitle\">{{ subtitle }}</p>\n </div>\n <WStatusTag v-if=\"status\" :value=\"status\" :map=\"statusMap\" />\n </div>\n <div class=\"w-detail-header-actions\">\n <slot name=\"actions\" />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useFormatters } from '@/composables/useFormatters'\n\nexport interface InfoField {\n label: string\n value: string | number | null | undefined\n format?: 'currency' | 'date' | 'datetime' | 'number' | 'text'\n /** Unidade colada ao valor — usada na variante `metric` (ex.: `ha`, `kg`, `L`). */\n suffix?: string\n /** Casas decimais do `format: 'number'` (default 2). */\n decimals?: number\n}\n\nwithDefaults(\n defineProps<{\n title?: string\n fields: InfoField[]\n /** `default`: grade de rótulo em cima e valor embaixo.\n * `metric`: uma linha por campo — rótulo à esquerda, número grande à\n * direita, divisória entre as linhas (o aside \"Resumo\" de um documento). */\n variant?: 'default' | 'metric'\n }>(),\n { variant: 'default' },\n)\n\nconst { formatCurrency, formatDate, formatNumber } = useFormatters()\n\nfunction formatValue(field: InfoField): string {\n const v = field.value\n if (v == null || v === '') return '-'\n if (field.format === 'currency') return formatCurrency(Number(v))\n if (field.format === 'date') return formatDate(String(v))\n if (field.format === 'datetime') return formatDate(String(v), 'DD/MM/YYYY HH:mm')\n if (field.format === 'number') return formatNumber(Number(v), field.decimals ?? 2)\n return String(v)\n}\n</script>\n\n<template>\n <div class=\"w-info-card\" :class=\"`w-info-card--${variant}`\">\n <h3 v-if=\"title\" class=\"w-info-card-title\">{{ title }}</h3>\n\n <div v-if=\"variant === 'metric'\" class=\"w-info-card-metrics\">\n <div v-for=\"field in fields\" :key=\"field.label\" class=\"w-info-card-metric\">\n <span class=\"w-info-card-metric-label\">{{ field.label }}</span>\n <span class=\"w-info-card-metric-value\">{{ formatValue(field) }}</span>\n <span v-if=\"field.suffix\" class=\"w-info-card-metric-suffix\">{{ field.suffix }}</span>\n </div>\n </div>\n\n <div v-else class=\"w-info-card-grid\">\n <div v-for=\"field in fields\" :key=\"field.label\" class=\"w-info-card-field\">\n <span class=\"w-info-card-label\">{{ field.label }}</span>\n <span class=\"w-info-card-value\">{{ formatValue(field) }}</span>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport Skeleton from 'primevue/skeleton'\n\ndefineProps<{\n label: string\n value: string | number\n icon?: string\n hint?: string\n severity?: 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'neutral'\n trend?: {\n value: string\n direction?: 'up' | 'down' | 'neutral'\n }\n loading?: boolean\n}>()\n</script>\n\n<template>\n <article class=\"w-kpi-card\" :class=\"severity ? `w-kpi-card--${severity}` : ''\">\n <template v-if=\"loading\">\n <div class=\"w-kpi-card__loading\">\n <Skeleton shape=\"circle\" size=\"2.75rem\" />\n <div class=\"w-kpi-card__loading-content\">\n <Skeleton width=\"6rem\" height=\"0.75rem\" />\n <Skeleton width=\"7.5rem\" height=\"1.5rem\" />\n <Skeleton width=\"5rem\" height=\"0.75rem\" />\n </div>\n </div>\n </template>\n\n <template v-else>\n <div class=\"w-kpi-card__header\">\n <div v-if=\"icon || $slots.icon\" class=\"w-kpi-card__icon\">\n <slot name=\"icon\">\n <i v-if=\"icon\" :class=\"icon\" />\n </slot>\n </div>\n <div v-if=\"trend || $slots.trend\" class=\"w-kpi-card__trend\">\n <slot name=\"trend\">\n <span\n v-if=\"trend\"\n class=\"w-kpi-card__trend-badge\"\n :class=\"trend.direction ? `w-kpi-card__trend-badge--${trend.direction}` : ''\"\n >\n {{ trend.value }}\n </span>\n </slot>\n </div>\n </div>\n\n <div class=\"w-kpi-card__content\">\n <p class=\"w-kpi-card__label\">{{ label }}</p>\n <div class=\"w-kpi-card__value\">\n <slot name=\"value\">{{ value }}</slot>\n </div>\n <p v-if=\"hint || $slots.hint\" class=\"w-kpi-card__hint\">\n <slot name=\"hint\">{{ hint }}</slot>\n </p>\n </div>\n\n <footer v-if=\"$slots.footer\" class=\"w-kpi-card__footer\">\n <slot name=\"footer\" />\n </footer>\n </template>\n </article>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport type { KpiItem } from '@/types/kpi'\nimport WKpiCard from './WKpiCard.vue'\n\nconst props = withDefaults(\n defineProps<{\n items?: KpiItem[]\n /**\n * Número fixo de colunas (2–6) ou 'auto' para preencher a largura com quantos\n * KPIs couberem (responsivo, sem overflow). Use 'auto' em dashboards que devem\n * aproveitar o máximo da tela.\n */\n columns?: 2 | 3 | 4 | 5 | 6 | 'auto'\n dense?: boolean\n }>(),\n {\n items: () => [],\n columns: 4,\n dense: false,\n },\n)\n\nconst gridClass = computed(() => [\n props.columns === 'auto' ? 'w-kpi-grid--auto' : `w-kpi-grid--cols-${props.columns}`,\n { 'w-kpi-grid--dense': props.dense },\n])\n</script>\n\n<template>\n <div class=\"w-kpi-grid\" :class=\"gridClass\">\n <template v-if=\"$slots.item\">\n <slot v-for=\"(item, index) in items\" :key=\"index\" name=\"item\" :item=\"item\" :index=\"index\" />\n </template>\n <template v-else>\n <WKpiCard\n v-for=\"(item, index) in items\"\n :key=\"index\"\n :label=\"item.label\"\n :value=\"item.value\"\n :icon=\"item.icon\"\n :severity=\"item.severity || 'primary'\"\n :hint=\"item.hint\"\n :trend=\"item.trend\"\n :loading=\"item.loading\"\n />\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\ndefineProps<{\n title: string\n subtitle?: string\n icon?: string\n compact?: boolean\n}>()\n</script>\n\n<template>\n <div class=\"w-section-header\" :class=\"{ 'w-section-header--compact': compact }\">\n <div class=\"w-section-header__main\">\n <div v-if=\"icon || $slots.icon\" class=\"w-section-header__icon\">\n <slot name=\"icon\">\n <i v-if=\"icon\" :class=\"icon\" />\n </slot>\n </div>\n <div class=\"w-section-header__content\">\n <div class=\"w-section-header__title-row\">\n <h3 class=\"w-section-header__title\">{{ title }}</h3>\n <slot name=\"meta\" />\n </div>\n <p v-if=\"subtitle\" class=\"w-section-header__subtitle\">{{ subtitle }}</p>\n </div>\n </div>\n <div v-if=\"$slots.actions\" class=\"w-section-header__actions\">\n <slot name=\"actions\" />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\ndefineProps<{\n title: string\n description?: string\n variant?: 'default' | 'muted' | 'outlined'\n}>()\n</script>\n\n<template>\n <section class=\"w-form-section\" :class=\"variant ? `w-form-section--${variant}` : ''\">\n <div v-if=\"title || description || $slots.actions\" class=\"w-form-section__header\">\n <div class=\"w-form-section__content\">\n <h3 class=\"w-form-section__title\">{{ title }}</h3>\n <p v-if=\"description\" class=\"w-form-section__description\">{{ description }}</p>\n </div>\n <div v-if=\"$slots.actions\" class=\"w-form-section__actions\">\n <slot name=\"actions\" />\n </div>\n </div>\n <div class=\"w-form-section__body\">\n <slot />\n </div>\n </section>\n</template>\n","<script setup lang=\"ts\">\nwithDefaults(\n defineProps<{\n align?: 'between' | 'start' | 'end'\n stackOnMobile?: boolean\n }>(),\n {\n align: 'between',\n stackOnMobile: true,\n },\n)\n</script>\n\n<template>\n <div\n class=\"w-action-bar\"\n :class=\"[`w-action-bar--${align}`, { 'w-action-bar--stack': stackOnMobile }]\"\n >\n <div v-if=\"$slots.primary || $slots.default\" class=\"w-action-bar__primary\">\n <slot name=\"primary\">\n <slot />\n </slot>\n </div>\n <div v-if=\"$slots.filters\" class=\"w-action-bar__filters\">\n <slot name=\"filters\" />\n </div>\n <div v-if=\"$slots.secondary\" class=\"w-action-bar__secondary\">\n <slot name=\"secondary\" />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface ProgressStep {\n key: string\n label: string\n description?: string\n}\n\nconst props = withDefaults(\n defineProps<{\n steps: ProgressStep[]\n currentStep: string\n orientation?: 'horizontal' | 'vertical'\n }>(),\n {\n orientation: 'horizontal',\n },\n)\n\nconst currentIndex = computed(() => props.steps.findIndex((step) => step.key === props.currentStep))\n\nfunction stepState(index: number) {\n if (index < currentIndex.value) return 'done'\n if (index === currentIndex.value) return 'current'\n return 'pending'\n}\n</script>\n\n<template>\n <div class=\"w-progress-flow\" :class=\"`w-progress-flow--${orientation}`\">\n <div\n v-for=\"(step, index) in steps\"\n :key=\"step.key\"\n class=\"w-progress-flow__step\"\n :class=\"`w-progress-flow__step--${stepState(index)}`\"\n >\n <slot name=\"step\" :step=\"step\" :index=\"index\" :state=\"stepState(index)\">\n <div class=\"w-progress-flow__marker\">\n <span>{{ index + 1 }}</span>\n </div>\n <div class=\"w-progress-flow__content\">\n <p class=\"w-progress-flow__label\">{{ step.label }}</p>\n <p v-if=\"step.description\" class=\"w-progress-flow__description\">{{ step.description }}</p>\n </div>\n </slot>\n </div>\n </div>\n</template>\n","import type { ComputedRef, InjectionKey } from 'vue'\n\n/**\n * Contrato entre WStepFlow (container) e WStepSection (etapa). Vive num módulo\n * próprio porque `<script setup>` não exporta valores — a chave precisa ser\n * importável pelos dois SFCs.\n *\n * Quem é a última etapa (a que não desenha linha conectora) NÃO passa por aqui:\n * é `:last-child` no CSS. Registrar as etapas em runtime só serviria para\n * descobrir, com um tick de atraso, algo que o seletor já sabe na primeira\n * pintura.\n */\n/** Como o flow arruma as etapas: coluna (padrão) ou régua no topo. */\nexport type StepFlowOrientation = 'vertical' | 'horizontal'\n\nexport interface StepFlowContext {\n /** Etapa aberta. `0` = todas fechadas. */\n active: ComputedRef<number>\n /** Alterna a etapa: abre a informada, ou fecha tudo se já era a aberta. */\n toggle: (step: number) => void\n disabled: ComputedRef<boolean>\n /**\n * Orientação do flow. Vem pelo contexto de propósito: a etapa se desenha\n * conforme o container, sem o consumidor repetir a prop em cada WStepSection.\n * Fora de um flow a etapa assume `vertical` (card colapsável avulso).\n */\n orientation: ComputedRef<StepFlowOrientation>\n}\n\nexport const W_STEP_FLOW_KEY: InjectionKey<StepFlowContext> = Symbol('w-step-flow')\n","<script setup lang=\"ts\">\nimport { computed, provide, ref } from 'vue'\nimport { W_STEP_FLOW_KEY, type StepFlowOrientation } from '@/utils/stepFlow'\n\n/**\n * Etapas numeradas e colapsáveis (a espinha do editor de documento).\n * Diferente do WProgressFlow, que só ILUSTRA o progresso: aqui cada etapa é um\n * bloco de conteúdo que abre e fecha, e o `v-model` diz qual está aberta.\n *\n * `0` = todas fechadas. É estado do consumidor de propósito: \"continuar para a\n * próxima etapa\" é uma decisão da tela, não do componente.\n */\nconst props = withDefaults(\n defineProps<{\n /** Número da etapa aberta (`v-model`). `0` fecha todas. */\n modelValue?: number\n /**\n * `vertical` empilha as etapas numa coluna (cada uma é um card).\n * `horizontal` põe os cabeçalhos lado a lado numa régua e abre só o corpo da\n * etapa ativa embaixo, na largura inteira — abaixo de 768px cai sozinho\n * para o empilhamento vertical (a régua não cabe).\n */\n orientation?: StepFlowOrientation\n /** Trava o clique no cabeçalho de todas as etapas. */\n disabled?: boolean\n }>(),\n {\n modelValue: 0,\n orientation: 'vertical',\n disabled: false,\n },\n)\n\nconst emit = defineEmits<{ 'update:modelValue': [step: number] }>()\n\nconst active = computed(() => props.modelValue)\nconst disabled = computed(() => props.disabled)\nconst orientation = computed(() => props.orientation)\n\nfunction toggle(step: number) {\n if (props.disabled) return\n emit('update:modelValue', props.modelValue === step ? 0 : step)\n}\n\nprovide(W_STEP_FLOW_KEY, { active, toggle, disabled, orientation })\n\nconst root = ref<HTMLElement | null>(null)\n\n/**\n * Setas / Home / End andam pela régua horizontal. Sem roving tabindex: os\n * cabeçalhos são botões e continuam todos no Tab — a seta é atalho, não a única\n * forma de chegar lá. Na vertical o Tab já resolve, então nem entra.\n */\nfunction onKeydown(event: KeyboardEvent) {\n if (props.orientation !== 'horizontal') return\n const passo = { ArrowRight: 1, ArrowLeft: -1, Home: 0, End: 0 }[event.key]\n if (passo === undefined) return\n\n const triggers = Array.from(\n root.value?.querySelectorAll<HTMLButtonElement>(\n '.w-step-section__head .w-step-section__trigger:not(:disabled)',\n ) ?? [],\n )\n const atual = triggers.indexOf(document.activeElement as HTMLButtonElement)\n if (atual < 0 || triggers.length === 0) return\n\n const alvo =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? triggers.length - 1\n : (atual + passo + triggers.length) % triggers.length\n\n event.preventDefault()\n triggers[alvo].focus()\n}\n</script>\n\n<template>\n <div ref=\"root\" class=\"w-step-flow\" :class=\"`w-step-flow--${orientation}`\" @keydown=\"onKeydown\">\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, ref } from 'vue'\nimport { W_STEP_FLOW_KEY } from '@/utils/stepFlow'\n\n/**\n * Uma etapa do WStepFlow: badge numerada + linha conectora, cabeçalho clicável\n * (título, contador e resumo) e corpo colapsável com rodapé de ação.\n *\n * A orientação NÃO é prop daqui: vem do contexto do flow. Na vertical a etapa é\n * um card na coluna; na horizontal o cabeçalho vira um trecho da régua e só o\n * corpo da etapa ativa é desenhado, embaixo, na largura inteira.\n *\n * Fora de um WStepFlow o componente ainda funciona: ele cai num estado local\n * aberto (e em vertical), para poder ser usado como card colapsável avulso.\n */\nconst props = withDefaults(\n defineProps<{\n /** Número da etapa (1-based) — é o valor que o `v-model` do flow carrega. */\n step: number\n title: string\n /** Texto à direita do título (o \"resumo\" da etapa fechada). */\n summary?: string\n /** Badge de contagem entre o título e o resumo. */\n count?: number | string\n disabled?: boolean\n }>(),\n { disabled: false },\n)\n\nconst flow = inject(W_STEP_FLOW_KEY, null)\n\n/** Sem flow o componente é dono do próprio estado (card colapsável avulso). */\nconst localOpen = ref(true)\n\nconst open = computed(() => (flow ? flow.active.value === props.step : localOpen.value))\nconst isDisabled = computed(() => props.disabled || (flow?.disabled.value ?? false))\nconst horizontal = computed(() => flow?.orientation.value === 'horizontal')\n/** Fora do flow não há próxima etapa, então não há linha para ligar. Dentro do\n * flow a linha existe sempre e o CSS a apaga na ponta (`:last-child` na\n * vertical, `:first-child` na horizontal, onde a linha vem antes da badge). */\nconst hasLine = computed(() => flow !== null)\n/**\n * \"Já passei por aqui\" — inferido da posição, não de validação: o componente não\n * conhece regra de negócio. Só a régua horizontal marca isso; a coluna vertical\n * continua exatamente como era.\n */\nconst done = computed(() => horizontal.value && flow != null && props.step < flow.active.value)\n\nfunction toggle() {\n if (isDisabled.value) return\n if (flow) flow.toggle(props.step)\n else localOpen.value = !localOpen.value\n}\n</script>\n\n<template>\n <div v-if=\"!horizontal\" class=\"w-step-section\" :class=\"{ 'w-step-section--open': open }\">\n <div class=\"w-step-section__rail\">\n <span\n class=\"w-step-section__badge\"\n :class=\"{ 'w-step-section__badge--on': open }\"\n aria-hidden=\"true\"\n >\n {{ step }}\n </span>\n <span v-if=\"hasLine\" class=\"w-step-section__line\" />\n </div>\n\n <div class=\"w-step-section__body\">\n <div class=\"w-step-section__card\">\n <div class=\"w-step-section__header\">\n <button\n type=\"button\"\n class=\"w-step-section__trigger\"\n :aria-expanded=\"open\"\n :aria-current=\"open ? 'step' : undefined\"\n :disabled=\"isDisabled\"\n @click=\"toggle\"\n >\n <i\n class=\"w-step-section__chevron\"\n :class=\"open ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\n />\n <h2 class=\"w-step-section__title\">{{ title }}</h2>\n <span v-if=\"count != null\" class=\"w-step-section__count\">{{ count }}</span>\n <span v-if=\"summary\" class=\"w-step-section__summary\">{{ summary }}</span>\n </button>\n <div v-if=\"$slots.actions\" class=\"w-step-section__actions\">\n <slot name=\"actions\" :open=\"open\" />\n </div>\n </div>\n\n <template v-if=\"open\">\n <div class=\"w-step-section__content\">\n <slot />\n </div>\n <div v-if=\"$slots.footer\" class=\"w-step-section__footer\">\n <slot name=\"footer\" />\n </div>\n </template>\n </div>\n </div>\n </div>\n\n <div\n v-else\n class=\"w-step-section w-step-section--horizontal\"\n :class=\"{ 'w-step-section--open': open, 'w-step-section--done': done }\"\n >\n <div class=\"w-step-section__head\">\n <span\n v-if=\"hasLine\"\n class=\"w-step-section__line\"\n :class=\"{ 'w-step-section__line--done': done || open }\"\n />\n <button\n type=\"button\"\n class=\"w-step-section__trigger\"\n :aria-expanded=\"open\"\n :aria-current=\"open ? 'step' : undefined\"\n :disabled=\"isDisabled\"\n @click=\"toggle\"\n >\n <span\n class=\"w-step-section__badge\"\n :class=\"{\n 'w-step-section__badge--on': open,\n 'w-step-section__badge--done': done,\n }\"\n aria-hidden=\"true\"\n >\n <i v-if=\"done\" class=\"pi pi-check\" />\n <template v-else>{{ step }}</template>\n </span>\n <h2 class=\"w-step-section__title\">{{ title }}</h2>\n <span v-if=\"count != null\" class=\"w-step-section__count\">{{ count }}</span>\n <span v-if=\"summary\" class=\"w-step-section__summary\">{{ summary }}</span>\n </button>\n <div v-if=\"$slots.actions\" class=\"w-step-section__actions\">\n <slot name=\"actions\" :open=\"open\" />\n </div>\n </div>\n\n <div v-if=\"open\" class=\"w-step-section__panel\">\n <div class=\"w-step-section__content\">\n <slot />\n </div>\n <div v-if=\"$slots.footer\" class=\"w-step-section__footer\">\n <slot name=\"footer\" />\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { CheckListItem, CheckListLevel } from '@/types/checkList'\n\n/**\n * Lista de verificações de um documento (o aside \"Verificações\"): um ícone por\n * nível e o contador `N/M` de quantas passaram, no cabeçalho.\n *\n * A avaliação é sempre do backend/serviço — o componente só desenha o que\n * recebe. Ele não conhece regra de negócio nenhuma.\n */\nconst props = withDefaults(\n defineProps<{\n title?: string\n items?: CheckListItem[]\n /** Esconde o contador `N/M` do cabeçalho. */\n showCount?: boolean\n emptyMessage?: string\n }>(),\n {\n items: () => [],\n showCount: true,\n emptyMessage: 'Nenhuma verificação',\n },\n)\n\nconst okCount = computed(() => props.items.filter((i) => i.nivel === 'ok').length)\nconst countLabel = computed(() => `${okCount.value}/${props.items.length}`)\n\nconst ICONS: Record<CheckListLevel, string> = {\n ok: 'pi pi-check-circle',\n warn: 'pi pi-exclamation-triangle',\n bad: 'pi pi-times-circle',\n}\n\nfunction iconOf(nivel: CheckListLevel): string {\n return ICONS[nivel] ?? ICONS.warn\n}\n</script>\n\n<template>\n <div class=\"w-check-list\">\n <div v-if=\"title || showCount\" class=\"w-check-list__header\">\n <span class=\"w-check-list__title\">{{ title }}</span>\n <span v-if=\"showCount\" class=\"w-check-list__count\">{{ countLabel }}</span>\n </div>\n\n <ul v-if=\"items.length\" class=\"w-check-list__items\">\n <li v-for=\"(item, index) in items\" :key=\"`${item.label}-${index}`\" class=\"w-check-list__item\">\n <i :class=\"[iconOf(item.nivel), `w-check-list__icon--${item.nivel}`]\" />\n <span class=\"w-check-list__label\">{{ item.label }}</span>\n </li>\n </ul>\n\n <div v-else class=\"w-check-list__empty\">\n <slot name=\"empty\">{{ emptyMessage }}</slot>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, readonly, ref, watch } from 'vue'\nimport IconField from 'primevue/iconfield'\nimport InputIcon from 'primevue/inputicon'\nimport InputText from 'primevue/inputtext'\nimport type { Geometry } from 'geojson'\nimport type { GeoJSON as LeafletGeoJSON, LatLng, Map as LeafletMap } from 'leaflet'\nimport 'leaflet/dist/leaflet.css'\nimport { useFormatters } from '@/composables/useFormatters'\nimport type {\n MapSelectFeature,\n MapSelectGeometry,\n MapSelectId,\n MapSelectPolygonStyle,\n} from '@/types/mapSelect'\n\n/**\n * Seleção múltipla de polígonos num mapa de satélite, com painel lateral de busca.\n *\n * O componente NÃO é dono da seleção: `modelValue` é a fonte da verdade e todo\n * clique (no polígono ou na lista) sai como `update:modelValue`. Isso mantém o\n * mapa e a lista sempre coerentes — os dois leem o mesmo array.\n *\n * O Leaflet entra por `import()` dinâmico: o mapa costuma viver dentro de um\n * Dialog, e carregar ~150 kB de biblioteca de mapa no bundle de quem só abre um\n * CRUD é desperdício. Se o `import()` falhar (offline, CSP), o mapa é substituído\n * por um aviso e o painel lateral continua funcionando — selecionar talhão pela\n * lista nunca depende do mapa ter subido.\n *\n * `layout` só troca POSICIONAMENTO (CSS): a marcação é a mesma nos dois modos.\n * No `'sobreposto'` o mapa ocupa tudo e o painel/rodapé flutuam por cima em\n * vidro. Eles continuam FORA do container do Leaflet (irmãos, não filhos), então\n * o mapa nunca vê os cliques do painel e o painel nunca precisa de\n * `L.DomEvent.disableClickPropagation` — arrastar/zoom por baixo segue intacto.\n */\nconst props = withDefaults(\n defineProps<{\n /** Ids selecionados (`v-model`). */\n modelValue?: MapSelectId[]\n /** Itens selecionáveis. Sem `geometria` o item some do mapa, não da lista. */\n features?: MapSelectFeature[]\n /** Geometria do escopo (ex.: o setor) usada no `fitBounds` inicial.\n * Sem ela, o enquadramento é a união das geometrias das `features`. */\n scopeGeometry?: MapSelectGeometry | null\n /** Tiles. Default: satélite World_Imagery (ArcGIS/Esri). */\n tileUrl?: string\n tileAttribution?: string\n /** Zoom máximo do tile layer (o World_Imagery vai até 19). */\n maxZoom?: number\n searchPlaceholder?: string\n /** Rótulo do rodapé, à esquerda da área somada. */\n areaLabel?: string\n /** Unidade da área, no rodapé e no tooltip do polígono. */\n areaSuffix?: string\n /** Casas decimais da área. */\n areaDecimals?: number\n /** Altura do mapa (qualquer unidade CSS). */\n height?: string\n /** Arranjo do componente.\n * - `'lado-a-lado'`: mapa à esquerda, painel de 300 px à direita, rodapé embaixo.\n * - `'sobreposto'`: o mapa ocupa tudo; painel e rodapé flutuam sobre ele em vidro. */\n layout?: 'lado-a-lado' | 'sobreposto'\n /** Texto do contador. Default em pt-BR: \"N talhões selecionados\". */\n selectionLabel?: (count: number) => string\n clearLabel?: string\n /** `layout=\"sobreposto\"`: rótulo acessível do botão que recolhe o painel. */\n collapseLabel?: string\n /** `layout=\"sobreposto\"`: rótulo acessível do botão que reabre o painel. */\n expandLabel?: string\n /** Selo sobre o mapa (canto superior direito). `''` esconde. */\n badgeLabel?: string\n emptyMessage?: string\n /** Mensagem quando o Leaflet não carregou. */\n mapErrorMessage?: string\n disabled?: boolean\n /** Estilo do polígono não selecionado. */\n polygonStyle?: MapSelectPolygonStyle\n /** Estilo do polígono selecionado. */\n polygonSelectedStyle?: MapSelectPolygonStyle\n }>(),\n {\n modelValue: () => [],\n features: () => [],\n scopeGeometry: null,\n tileUrl:\n 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',\n tileAttribution: 'Imagery © Esri, Maxar, Earthstar Geographics',\n maxZoom: 19,\n searchPlaceholder: 'Buscar talhão ou setor',\n areaLabel: 'Área selecionada',\n areaSuffix: 'ha',\n areaDecimals: 0,\n height: '460px',\n layout: 'lado-a-lado',\n selectionLabel: (count: number) =>\n count === 1 ? '1 talhão selecionado' : `${count} talhões selecionados`,\n clearLabel: 'Limpar seleção',\n collapseLabel: 'Recolher painel de seleção',\n expandLabel: 'Mostrar painel de seleção',\n badgeLabel: 'Satélite',\n emptyMessage: 'Nenhum talhão encontrado',\n mapErrorMessage: 'O mapa não pôde ser carregado. Selecione os talhões pela lista ao lado.',\n disabled: false,\n // Tinta de mapa, não cor de UI: estes valores são lidos sobre a imagem de\n // satélite, onde os tokens do tema (claro/escuro) não valem. São props para\n // quem tiver outro fundo poder trocar.\n polygonStyle: () => ({\n color: '#ffffff',\n weight: 2,\n opacity: 0.85,\n fillColor: '#ffffff',\n fillOpacity: 0.06,\n }),\n polygonSelectedStyle: () => ({\n color: '#8fb6e4',\n weight: 3,\n opacity: 1,\n fillColor: '#1f5092',\n fillOpacity: 0.48,\n }),\n },\n)\n\nconst emit = defineEmits<{ 'update:modelValue': [ids: MapSelectId[]] }>()\n\nconst { formatNumber } = useFormatters()\n\n// --- Arranjo e painel flutuante --------------------------------------------\n\nconst isOverlay = computed(() => props.layout === 'sobreposto')\n\n/** Estado do painel flutuante — interno de propósito: recolher é gesto de\n * visualização (\"quero ver o mapa\"), não dado do formulário. */\nconst collapsed = ref(false)\n\nfunction setCollapsed(value: boolean) {\n if (collapsed.value === value) return\n collapsed.value = value\n}\n\n/** Recolher devolve o mapa inteiro: o próprio painel vira a pílula (ícone +\n * contador) e cabeçalho/lista saem por `display:none` — somem junto da ordem\n * de tabulação e da árvore de acessibilidade, sem precisar de `inert`. */\nfunction toggleCollapsed() {\n setCollapsed(!collapsed.value)\n}\n\nconst collapseTitle = computed(() => (collapsed.value ? props.expandLabel : props.collapseLabel))\n\n// --- Seleção ---------------------------------------------------------------\n\nconst selected = computed(() => new Set(props.modelValue))\n\nfunction isSelected(id: MapSelectId): boolean {\n return selected.value.has(id)\n}\n\nfunction toggle(id: MapSelectId) {\n if (props.disabled) return\n const next = isSelected(id) ? props.modelValue.filter((x) => x !== id) : [...props.modelValue, id]\n emit('update:modelValue', next)\n}\n\nfunction clear() {\n if (props.disabled || !props.modelValue.length) return\n emit('update:modelValue', [])\n}\n\nconst selectedFeatures = computed(() => props.features.filter((f) => isSelected(f.id)))\n\nconst selectedArea = computed(() =>\n selectedFeatures.value.reduce((total, f) => total + (f.area ?? 0), 0),\n)\n\nconst countText = computed(() => props.selectionLabel(selectedFeatures.value.length))\n\n// --- Busca -----------------------------------------------------------------\n\nconst term = ref('')\n\nfunction normalize(value: string): string {\n return value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n}\n\nconst visibleFeatures = computed(() => {\n const needle = normalize(term.value.trim())\n if (!needle) return props.features\n return props.features.filter((f) => normalize(`${f.nome} ${f.subtitulo ?? ''}`).includes(needle))\n})\n\nfunction areaText(feature: MapSelectFeature): string {\n if (feature.area == null) return ''\n return `${formatNumber(feature.area, props.areaDecimals)} ${props.areaSuffix}`.trim()\n}\n\nconst areaTotalText = computed(() => formatNumber(selectedArea.value, props.areaDecimals))\n\n// --- Mapa ------------------------------------------------------------------\n\ntype Leaflet = typeof import('leaflet')\n\nconst container = ref<HTMLDivElement | null>(null)\nconst root = ref<HTMLDivElement | null>(null)\nconst footer = ref<HTMLDivElement | null>(null)\nconst mapError = ref(false)\n\nlet leaflet: Leaflet | null = null\nlet map: LeafletMap | null = null\nlet observer: ResizeObserver | null = null\nlet footerObserver: ResizeObserver | null = null\nconst layers = new Map<MapSelectId, LeafletGeoJSON>()\n\nfunction styleFor(id: MapSelectId): MapSelectPolygonStyle {\n return isSelected(id) ? props.polygonSelectedStyle : props.polygonStyle\n}\n\nfunction tooltipText(feature: MapSelectFeature): string {\n const area = areaText(feature)\n return area ? `${feature.nome} · ${area}` : feature.nome\n}\n\n/** Redesenha todos os polígonos a partir de `features`. */\nfunction drawFeatures() {\n if (!leaflet || !map) return\n layers.forEach((layer) => layer.remove())\n layers.clear()\n\n for (const feature of props.features) {\n if (!feature.geometria) continue\n const layer = leaflet.geoJSON(feature.geometria as unknown as Geometry, {\n style: () => styleFor(feature.id),\n })\n layer.on('click', () => toggle(feature.id))\n layer.bindTooltip(tooltipText(feature), {\n permanent: true,\n direction: 'center',\n className: 'w-map-select__tip',\n opacity: 1,\n })\n layer.addTo(map)\n layers.set(feature.id, layer)\n }\n\n syncStyles()\n fitToScope()\n}\n\n/** Reaplica o estilo (e a classe do tooltip) conforme a seleção atual. */\nfunction syncStyles() {\n layers.forEach((layer, id) => {\n const on = isSelected(id)\n layer.setStyle(styleFor(id))\n const element = layer.getTooltip()?.getElement()\n element?.classList.toggle('w-map-select__tip--on', on)\n })\n}\n\nfunction fitToScope() {\n if (!leaflet || !map) return\n const corners: LatLng[] = []\n\n if (props.scopeGeometry) {\n const scope = leaflet.geoJSON(props.scopeGeometry as unknown as Geometry).getBounds()\n if (scope.isValid()) corners.push(scope.getSouthWest(), scope.getNorthEast())\n }\n\n if (!corners.length) {\n layers.forEach((layer) => {\n const bounds = layer.getBounds()\n if (bounds.isValid()) corners.push(bounds.getSouthWest(), bounds.getNorthEast())\n })\n }\n\n if (corners.length) map.fitBounds(leaflet.latLngBounds(corners), { padding: [20, 20] })\n else map.setView([0, 0], 2)\n}\n\n/** O mapa costuma nascer escondido (dentro de um Dialog): sem isto o Leaflet\n * calcula 0×0 e desenha só um pedaço quando o container aparece. */\nfunction refreshSize() {\n if (!map || !container.value) return\n if (container.value.clientWidth > 0 && container.value.clientHeight > 0) map.invalidateSize()\n}\n\n/** No `sobreposto` o rodapé é uma barra flutuante: o painel precisa parar acima\n * dela e a atribuição do Leaflet precisa subir. Como a altura depende do que o\n * consumidor põe no `#footer`, ela é MEDIDA e publicada em `--w-map-foot-h` —\n * chutar um valor fixo quebraria com dois botões empilhados. */\nfunction measureFooter() {\n if (!root.value || !footer.value) return\n if (!isOverlay.value) {\n root.value.style.removeProperty('--w-map-foot-h')\n return\n }\n const h = footer.value.offsetHeight\n if (h > 0) root.value.style.setProperty('--w-map-foot-h', `${h}px`)\n}\n\nasync function setupMap() {\n if (!container.value) return\n try {\n const mod = (await import('leaflet')) as unknown as Leaflet & { default?: Leaflet }\n leaflet = mod.default ?? mod\n } catch {\n mapError.value = true\n return\n }\n\n // O componente pode ter sido desmontado durante o import().\n if (!container.value) return\n\n try {\n map = leaflet.map(container.value, { zoomControl: true, attributionControl: true })\n leaflet\n .tileLayer(props.tileUrl, {\n maxZoom: props.maxZoom,\n attribution: props.tileAttribution,\n })\n .addTo(map)\n drawFeatures()\n refreshSize()\n\n if (typeof ResizeObserver !== 'undefined') {\n observer = new ResizeObserver(() => refreshSize())\n observer.observe(container.value)\n }\n } catch {\n mapError.value = true\n }\n}\n\nonMounted(() => {\n void setupMap()\n measureFooter()\n if (typeof ResizeObserver !== 'undefined' && footer.value) {\n footerObserver = new ResizeObserver(() => measureFooter())\n footerObserver.observe(footer.value)\n }\n})\n\nonBeforeUnmount(() => {\n observer?.disconnect()\n observer = null\n footerObserver?.disconnect()\n footerObserver = null\n layers.clear()\n map?.remove()\n map = null\n})\n\nwatch(() => props.features, drawFeatures)\nwatch(() => props.modelValue, syncStyles, { deep: true })\n\n// Recolher/expandir e trocar de arranjo mexem na caixa do mapa. O\n// ResizeObserver do canvas já pegaria, mas ele dispara no frame seguinte: sem o\n// invalidateSize explícito o Leaflet chega a pintar um quadro com tile cortado.\nwatch([collapsed, isOverlay], () => {\n void nextTick(() => {\n measureFooter()\n refreshSize()\n })\n})\n\ndefineExpose({\n refreshSize,\n /** Painel flutuante recolhido? (só faz sentido no `layout=\"sobreposto\"`.) */\n collapsed: readonly(collapsed),\n setCollapsed,\n})\n</script>\n\n<template>\n <div\n ref=\"root\"\n class=\"w-map-select\"\n :class=\"{\n 'w-map-select--disabled': disabled,\n 'w-map-select--overlay': isOverlay,\n 'w-map-select--collapsed': isOverlay && collapsed,\n }\"\n >\n <div class=\"w-map-select__body\">\n <div class=\"w-map-select__map\" :style=\"{ '--w-map-h': height }\">\n <div ref=\"container\" class=\"w-map-select__canvas\" />\n <div v-if=\"mapError\" class=\"w-map-select__fallback\">\n <i class=\"pi pi-map\" />\n <span>{{ mapErrorMessage }}</span>\n </div>\n <span v-else-if=\"badgeLabel\" class=\"w-map-select__badge\">\n <i class=\"pi pi-globe\" />{{ badgeLabel }}\n </span>\n </div>\n\n <div class=\"w-map-select__panel\">\n <button\n v-if=\"isOverlay\"\n type=\"button\"\n class=\"w-map-select__collapse\"\n :aria-expanded=\"!collapsed\"\n :aria-label=\"collapseTitle\"\n :title=\"collapseTitle\"\n @click=\"toggleCollapsed\"\n >\n <i class=\"pi\" :class=\"collapsed ? 'pi-list' : 'pi-chevron-right'\" />\n <span v-if=\"modelValue.length\" class=\"w-map-select__collapse-count\">\n {{ modelValue.length }}\n </span>\n </button>\n\n <div class=\"w-map-select__panel-head\">\n <IconField>\n <InputIcon class=\"pi pi-search\" />\n <InputText\n v-model=\"term\"\n fluid\n data-kbd-skip\n :placeholder=\"searchPlaceholder\"\n :aria-label=\"searchPlaceholder\"\n />\n </IconField>\n <div class=\"w-map-select__meta\">\n <span class=\"w-map-select__count\">{{ countText }}</span>\n <button\n type=\"button\"\n class=\"w-map-select__clear\"\n :disabled=\"disabled || !modelValue.length\"\n @click=\"clear\"\n >\n {{ clearLabel }}\n </button>\n </div>\n </div>\n\n <ul class=\"w-map-select__list\">\n <li v-for=\"feature in visibleFeatures\" :key=\"feature.id\">\n <slot name=\"item\" :feature=\"feature\" :selected=\"isSelected(feature.id)\">\n <button\n type=\"button\"\n class=\"w-map-select__item\"\n :class=\"{ 'w-map-select__item--on': isSelected(feature.id) }\"\n :aria-pressed=\"isSelected(feature.id)\"\n :disabled=\"disabled\"\n @click=\"toggle(feature.id)\"\n >\n <span class=\"w-map-select__box\">\n <i v-if=\"isSelected(feature.id)\" class=\"pi pi-check\" />\n </span>\n <span class=\"w-map-select__item-text\">\n <span class=\"w-map-select__item-name\">{{ feature.nome }}</span>\n <span v-if=\"feature.subtitulo\" class=\"w-map-select__item-sub\">\n {{ feature.subtitulo }}\n </span>\n </span>\n <i\n v-if=\"!feature.geometria\"\n class=\"pi pi-exclamation-circle w-map-select__item-nogeo\"\n title=\"Talhão sem contorno cadastrado\"\n />\n <span v-if=\"feature.area != null\" class=\"w-map-select__item-area\">\n {{ areaText(feature) }}\n </span>\n </button>\n </slot>\n </li>\n <li v-if=\"!visibleFeatures.length\" class=\"w-map-select__empty\">\n <slot name=\"empty\">{{ emptyMessage }}</slot>\n </li>\n </ul>\n </div>\n </div>\n\n <div ref=\"footer\" class=\"w-map-select__footer\">\n <slot name=\"footer\" :area=\"selectedArea\" :features=\"selectedFeatures\">\n <span class=\"w-map-select__area\">\n {{ areaLabel }}\n <strong>{{ areaTotalText }}</strong>\n <span class=\"w-map-select__area-unit\">{{ areaSuffix }}</span>\n </span>\n </slot>\n </div>\n </div>\n</template>\n","/**\n * Renderer de markdown do design system — leitura em primeiro lugar.\n *\n * A referência é o Material for MkDocs: o texto puro continua legível, mas o\n * autor tem um vocabulário curto para DESTACAR (alertas), ORGANIZAR (passos,\n * cards, abas, detalhes) e ILUSTRAR (código com realce, diagramas mermaid).\n *\n * Duas sintaxes produzem o MESMO alerta, de propósito:\n * `> [!DICA]` — estilo GitHub, sobrevive em qualquer visualizador de markdown\n * `::: dica` — estilo VitePress/MkDocs, aceita título próprio e conteúdo longo\n *\n * Segurança: `html: false` (markdown cru nunca injeta HTML) e todo o output\n * passa pelo DOMPurify antes do `v-html` — defesa em profundidade, porque o\n * conteúdo é escrito por usuários.\n */\nimport MdIt from 'markdown-it'\nimport type { MarkdownIt, StateCore, Token } from 'markdown-it'\nimport DOMPurify from 'dompurify'\nimport anchor from 'markdown-it-anchor'\nimport container from 'markdown-it-container'\nimport abbr from 'markdown-it-abbr'\nimport deflist from 'markdown-it-deflist'\nimport footnote from 'markdown-it-footnote'\nimport ins from 'markdown-it-ins'\nimport mark from 'markdown-it-mark'\nimport sub from 'markdown-it-sub'\nimport sup from 'markdown-it-sup'\nimport type { MarkdownHeading, MarkdownRenderResult } from '@/types/markdown'\n\n/* ==========================================================\n Alertas — o vocabulário de destaque\n ========================================================== */\n\ninterface AlertSpec {\n /** Sufixo da classe CSS e do tom (`md-alert--dica`). */\n tone: string\n /** Título padrão, usado quando o autor não escreve um. */\n label: string\n icon: string\n}\n\nconst ALERTS: Record<string, AlertSpec> = {\n nota: { tone: 'nota', label: 'Nota', icon: 'pi pi-info-circle' },\n dica: { tone: 'dica', label: 'Dica', icon: 'pi pi-lightbulb' },\n importante: { tone: 'importante', label: 'Importante', icon: 'pi pi-bookmark-fill' },\n atencao: { tone: 'atencao', label: 'Atenção', icon: 'pi pi-exclamation-triangle' },\n cuidado: { tone: 'cuidado', label: 'Cuidado', icon: 'pi pi-times-circle' },\n sucesso: { tone: 'sucesso', label: 'Feito', icon: 'pi pi-check-circle' },\n exemplo: { tone: 'exemplo', label: 'Exemplo', icon: 'pi pi-code' },\n resumo: { tone: 'resumo', label: 'Resumo', icon: 'pi pi-align-left' },\n pergunta: { tone: 'pergunta', label: 'Em aberto', icon: 'pi pi-question-circle' },\n}\n\n/** Apelidos aceitos (GitHub, VitePress e MkDocs) → chave canônica. */\nconst ALERT_ALIASES: Record<string, string> = {\n note: 'nota',\n info: 'nota',\n observacao: 'nota',\n tip: 'dica',\n hint: 'dica',\n sugestao: 'dica',\n important: 'importante',\n warning: 'atencao',\n warn: 'atencao',\n attention: 'atencao',\n aviso: 'atencao',\n caution: 'cuidado',\n danger: 'cuidado',\n error: 'cuidado',\n perigo: 'cuidado',\n success: 'sucesso',\n done: 'sucesso',\n feito: 'sucesso',\n example: 'exemplo',\n summary: 'resumo',\n abstract: 'resumo',\n tldr: 'resumo',\n question: 'pergunta',\n help: 'pergunta',\n duvida: 'pergunta',\n}\n\n/** minúsculas + sem acento — `ATENÇÃO`, `Atencao` e `atenção` são o mesmo. */\nfunction normalizar(nome: string): string {\n return nome\n .trim()\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n}\n\nfunction resolverAlerta(nome: string): AlertSpec | null {\n const chave = normalizar(nome)\n return ALERTS[chave] ?? ALERTS[ALERT_ALIASES[chave]] ?? null\n}\n\nconst escapar = new MdIt().utils.escapeHtml\n\nfunction abrirAlerta(spec: AlertSpec, titulo?: string): string {\n const texto = titulo?.trim() || spec.label\n return (\n `<div class=\"md-alert md-alert--${spec.tone}\">` +\n `<p class=\"md-alert__head\"><i class=\"${spec.icon}\" aria-hidden=\"true\"></i>${escapar(texto)}</p>` +\n `<div class=\"md-alert__body\">`\n )\n}\n\nconst FECHAR_ALERTA = '</div></div>'\n\n/* ==========================================================\n Realce de sintaxe — highlight.js carregado sob demanda\n ========================================================== */\n\ntype FuncaoRealce = (codigo: string, linguagem: string) => string\n\n/** Só os idiomas que aparecem na documentação deste produto. */\nconst CARREGADORES: Record<string, () => Promise<{ default: unknown }>> = {\n bash: () => import('highlight.js/lib/languages/bash'),\n python: () => import('highlight.js/lib/languages/python'),\n javascript: () => import('highlight.js/lib/languages/javascript'),\n typescript: () => import('highlight.js/lib/languages/typescript'),\n json: () => import('highlight.js/lib/languages/json'),\n yaml: () => import('highlight.js/lib/languages/yaml'),\n sql: () => import('highlight.js/lib/languages/sql'),\n xml: () => import('highlight.js/lib/languages/xml'),\n css: () => import('highlight.js/lib/languages/css'),\n diff: () => import('highlight.js/lib/languages/diff'),\n ini: () => import('highlight.js/lib/languages/ini'),\n markdown: () => import('highlight.js/lib/languages/markdown'),\n dockerfile: () => import('highlight.js/lib/languages/dockerfile'),\n}\n\nconst APELIDOS_LINGUAGEM: Record<string, string> = {\n sh: 'bash',\n shell: 'bash',\n zsh: 'bash',\n console: 'bash',\n terminal: 'bash',\n js: 'javascript',\n jsx: 'javascript',\n mjs: 'javascript',\n ts: 'typescript',\n tsx: 'typescript',\n py: 'python',\n jsonc: 'json',\n json5: 'json',\n dotenv: 'ini',\n env: 'ini',\n toml: 'ini',\n cfg: 'ini',\n yml: 'yaml',\n html: 'xml',\n htm: 'xml',\n vue: 'xml',\n svg: 'xml',\n md: 'markdown',\n psql: 'sql',\n postgres: 'sql',\n postgresql: 'sql',\n docker: 'dockerfile',\n}\n\nlet realce: FuncaoRealce | null = null\nlet carregando: Promise<void> | null = null\n\n/** Já dá para realçar? (evita re-render inútil quando o pacote já veio) */\nexport function realceDisponivel(): boolean {\n return realce !== null\n}\n\n/**\n * Carrega o highlight.js e os idiomas — sob demanda, uma única vez.\n * Enquanto não chega, o código aparece sem cores (nunca quebrado).\n */\nexport async function carregarRealce(): Promise<void> {\n if (realce || carregando) return carregando ?? undefined\n carregando = (async () => {\n const nucleo = (await import('highlight.js/lib/core')).default\n await Promise.all(\n Object.entries(CARREGADORES).map(async ([nome, carregar]) => {\n const modulo = await carregar()\n nucleo.registerLanguage(nome, modulo.default as never)\n }),\n )\n realce = (codigo, linguagem) => nucleo.highlight(codigo, { language: linguagem }).value\n })()\n await carregando\n}\n\nfunction normalizarLinguagem(info: string): string {\n const bruta = normalizar(info)\n return APELIDOS_LINGUAGEM[bruta] ?? bruta\n}\n\n/* ==========================================================\n Instância markdown-it\n ========================================================== */\n\n/** Slug estável e sem acento para as âncoras (`## Não conformidade` → `nao-conformidade`). */\nfunction slug(texto: string): string {\n return (\n normalizar(texto)\n .replace(/[^\\w\\s-]/g, '')\n .trim()\n .replace(/\\s+/g, '-') || 'secao'\n )\n}\n\nconst NOMES_CONTAINER = new Set([\n 'detalhes',\n 'details',\n 'passos',\n 'steps',\n 'cards',\n 'grade',\n 'abas',\n 'tabs',\n 'aba',\n 'tab',\n])\n\nconst CONTAINER_RE = /^\\s*([^\\s]+)\\s*(.*)$/\n\nfunction criarRenderer(): MarkdownIt {\n const md = new MdIt({ html: false, linkify: true, typographer: false })\n\n md.use(abbr).use(deflist).use(footnote).use(ins).use(mark).use(sub).use(sup)\n\n md.use(anchor, {\n level: [2, 3, 4],\n slugify: slug,\n // Símbolo vazio de propósito: o \"#\" entra por CSS (`.md-anchor::after`),\n // então copiar o título não traz lixo junto.\n permalink: anchor.permalink.linkInsideHeader({\n symbol: '',\n class: 'md-anchor',\n placement: 'after',\n ariaHidden: true,\n }),\n })\n\n aplicarAlertas(md)\n aplicarContainers(md)\n aplicarTarefas(md)\n aplicarCodigo(md)\n aplicarTabelas(md)\n aplicarLinks(md)\n aplicarFiguras(md)\n\n return md\n}\n\n/** `> [!DICA] Título` — alerta com a sintaxe do GitHub (sobrevive fora do portal). */\nfunction aplicarAlertas(md: MarkdownIt): void {\n md.core.ruler.after('block', 'lz_alerta', (state: StateCore) => {\n const tokens = state.tokens\n for (let i = 0; i < tokens.length; i += 1) {\n const abre = tokens[i]\n if (abre.type !== 'blockquote_open') continue\n\n const paragrafo = tokens[i + 1]\n const inline = tokens[i + 2]\n if (paragrafo?.type !== 'paragraph_open' || inline?.type !== 'inline') continue\n\n const marcador = /^\\[!([^\\]\\n]+)\\][ \\t]*([^\\n]*)\\n?/.exec(inline.content)\n if (!marcador) continue\n\n const spec = resolverAlerta(marcador[1])\n if (!spec) continue\n\n const fecha = encontrarFechamento(tokens, i)\n if (!fecha) continue\n\n inline.content = inline.content.slice(marcador[0].length)\n abre.type = 'lz_alerta_open'\n abre.tag = 'div'\n abre.meta = { spec, titulo: marcador[2] }\n fecha.type = 'lz_alerta_close'\n fecha.tag = 'div'\n\n // `> [!DICA]` sozinho na primeira linha deixa um parágrafo vazio para trás.\n if (!inline.content.trim()) {\n tokens.splice(i + 1, 3)\n }\n }\n return true\n })\n\n md.renderer.rules.lz_alerta_open = (tokens, idx) => {\n const meta = tokens[idx].meta as { spec: AlertSpec; titulo?: string }\n return abrirAlerta(meta.spec, meta.titulo)\n }\n md.renderer.rules.lz_alerta_close = () => FECHAR_ALERTA\n}\n\n/** Fechamento do blockquote aberto em `inicio`, respeitando aninhamento. */\nfunction encontrarFechamento(tokens: Token[], inicio: number): Token | null {\n let profundidade = 0\n for (let i = inicio; i < tokens.length; i += 1) {\n const token = tokens[i]\n if (token.type === 'blockquote_open') profundidade += 1\n else if (token.type === 'blockquote_close') {\n profundidade -= 1\n if (profundidade === 0) return token\n }\n }\n return null\n}\n\n/** `::: dica`, `::: passos`, `::: cards`, `::: abas` + `::: aba`, `::: detalhes`. */\nfunction aplicarContainers(md: MarkdownIt): void {\n // A pilha casa o token de fechamento com o de abertura: o render roda em uma\n // passada síncrona, na ordem do documento.\n const pilha: string[] = []\n\n md.use(container, 'lz', {\n validate: (params: string) => {\n const partes = CONTAINER_RE.exec(params)\n if (!partes) return false\n const chave = normalizar(partes[1])\n return NOMES_CONTAINER.has(chave) || resolverAlerta(chave) !== null\n },\n render: (tokens: Token[], idx: number) => {\n const token = tokens[idx]\n if (token.nesting !== 1) {\n const chave = pilha.pop()\n if (chave === 'detalhes') return '</div></details>\\n'\n if (chave === 'aba') return '</section>\\n'\n if (chave === 'alerta') return `${FECHAR_ALERTA}\\n`\n return '</div>\\n'\n }\n\n const partes = CONTAINER_RE.exec(token.info) ?? ['', '', '']\n const chave = normalizar(partes[1])\n const titulo = partes[2]?.trim()\n\n if (chave === 'detalhes' || chave === 'details') {\n pilha.push('detalhes')\n return `<details class=\"md-details\"><summary>${escapar(titulo || 'Detalhes')}</summary><div class=\"md-details__body\">`\n }\n if (chave === 'passos' || chave === 'steps') {\n pilha.push('bloco')\n return '<div class=\"md-steps\">'\n }\n if (chave === 'cards' || chave === 'grade') {\n pilha.push('bloco')\n return '<div class=\"md-cards\">'\n }\n if (chave === 'abas' || chave === 'tabs') {\n pilha.push('bloco')\n return '<div class=\"md-tabs\" data-md-tabs>'\n }\n if (chave === 'aba' || chave === 'tab') {\n pilha.push('aba')\n return `<section class=\"md-tabs__panel\" data-md-tab=\"${escapar(titulo || 'Aba')}\">`\n }\n\n const spec = resolverAlerta(chave)\n if (spec) {\n pilha.push('alerta')\n return abrirAlerta(spec, titulo)\n }\n\n pilha.push('bloco')\n return '<div>'\n },\n })\n}\n\n/** `- [ ]` / `- [x]` viram checkbox desabilitado (leitura; quem marca é a tarefa do projeto). */\nfunction aplicarTarefas(md: MarkdownIt): void {\n md.core.ruler.after('inline', 'lz_tarefas', (state: StateCore) => {\n const tokens = state.tokens\n for (let i = 2; i < tokens.length; i += 1) {\n const inline = tokens[i]\n if (inline.type !== 'inline' || !inline.children?.length) continue\n if (tokens[i - 1].type !== 'paragraph_open' || tokens[i - 2].type !== 'list_item_open') continue\n const primeiro = inline.children[0]\n if (primeiro.type !== 'text') continue\n const marcado = /^\\[([ xX])\\]\\s+/.exec(primeiro.content)\n if (!marcado) continue\n\n primeiro.content = primeiro.content.slice(marcado[0].length)\n const checkbox = new state.Token('html_inline', '', 0)\n checkbox.content = `<input type=\"checkbox\" class=\"md-task__check\" disabled${marcado[1] === ' ' ? '' : ' checked'}> `\n inline.children.unshift(checkbox)\n tokens[i - 2].attrJoin('class', 'md-task')\n }\n return true\n })\n}\n\n/** Bloco de código com barra (título + linguagem) e o gancho do botão copiar. */\nfunction aplicarCodigo(md: MarkdownIt): void {\n md.renderer.rules.fence = (tokens, idx) => {\n const token = tokens[idx]\n const info = token.info.trim()\n const primeira = info.split(/\\s+/)[0] ?? ''\n const linguagem = normalizarLinguagem(primeira)\n const titulo = /title=\"([^\"]*)\"/.exec(info)?.[1]\n\n if (linguagem === 'mermaid') {\n return (\n `<figure class=\"md-mermaid\" data-md-mermaid>` +\n `<pre class=\"md-mermaid__fonte\">${escapar(token.content)}</pre>` +\n (titulo ? `<figcaption>${escapar(titulo)}</figcaption>` : '') +\n `</figure>\\n`\n )\n }\n\n const realcado =\n realce && CARREGADORES[linguagem]\n ? realce(token.content, linguagem)\n : escapar(token.content)\n\n const barra =\n titulo || primeira\n ? `<div class=\"md-code__bar\">` +\n `<span class=\"md-code__title\">${escapar(titulo ?? '')}</span>` +\n `<span class=\"md-code__lang\">${escapar(primeira)}</span>` +\n `</div>`\n : ''\n\n return (\n `<div class=\"md-code\" data-md-code>${barra}` +\n `<pre class=\"md-code__pre\"><code class=\"hljs language-${escapar(linguagem)}\">${realcado}</code></pre>` +\n `</div>\\n`\n )\n }\n}\n\n/** Tabela larga rola sozinha, sem empurrar a página. */\nfunction aplicarTabelas(md: MarkdownIt): void {\n const original = md.renderer.rules.table_open\n md.renderer.rules.table_open = (tokens, idx, options, env, self) =>\n `<div class=\"md-table\">${original ? original(tokens, idx, options, env, self) : self.renderToken(tokens, idx, options)}`\n md.renderer.rules.table_close = (tokens, idx, options, env, self) =>\n `${self.renderToken(tokens, idx, options)}</div>`\n}\n\n/** Link externo abre em nova aba e se anuncia como externo. */\nfunction aplicarLinks(md: MarkdownIt): void {\n const original = md.renderer.rules.link_open\n md.renderer.rules.link_open = (tokens, idx, options, env, self) => {\n const href = String(tokens[idx].attrGet('href') ?? '')\n if (/^https?:\\/\\//i.test(href)) {\n tokens[idx].attrSet('target', '_blank')\n tokens[idx].attrSet('rel', 'noopener noreferrer')\n tokens[idx].attrJoin('class', 'md-link-externo')\n }\n return original ? original(tokens, idx, options, env, self) : self.renderToken(tokens, idx, options)\n }\n}\n\n/** Imagem sozinha no parágrafo vira figura com legenda (o texto alternativo). */\nfunction aplicarFiguras(md: MarkdownIt): void {\n md.core.ruler.after('inline', 'lz_figuras', (state: StateCore) => {\n const tokens = state.tokens\n for (let i = 1; i < tokens.length - 1; i += 1) {\n const inline = tokens[i]\n if (inline.type !== 'inline' || tokens[i - 1].type !== 'paragraph_open') continue\n const filhos = (inline.children ?? []).filter((filho) => filho.type !== 'softbreak')\n if (filhos.length !== 1 || filhos[0].type !== 'image') continue\n\n tokens[i - 1].tag = 'figure'\n tokens[i - 1].attrJoin('class', 'md-figure')\n tokens[i + 1].tag = 'figure'\n filhos[0].meta = { figura: true }\n }\n return true\n })\n\n const original = md.renderer.rules.image\n md.renderer.rules.image = (tokens, idx, options, env, self) => {\n const html = original\n ? original(tokens, idx, options, env, self)\n : self.renderToken(tokens, idx, options)\n const meta = tokens[idx].meta as { figura?: boolean } | undefined\n if (!meta?.figura) return html\n const legenda = tokens[idx].content?.trim()\n return legenda ? `${html}<figcaption>${escapar(legenda)}</figcaption>` : html\n }\n}\n\n/* ==========================================================\n API pública\n ========================================================== */\n\nlet instancia: MarkdownIt | null = null\n\nfunction obterRenderer(): MarkdownIt {\n if (!instancia) instancia = criarRenderer()\n return instancia\n}\n\n/** Texto puro de um heading, para o índice (sem `**`, `` ` `` ou links). */\nfunction textoDoTitulo(inline: Token): string {\n return (inline.children ?? [])\n .filter((filho) => filho.type === 'text' || filho.type === 'code_inline')\n .map((filho) => filho.content)\n .join('')\n .trim()\n}\n\nfunction coletarTitulos(tokens: Token[]): MarkdownHeading[] {\n const titulos: MarkdownHeading[] = []\n for (let i = 0; i < tokens.length; i += 1) {\n const token = tokens[i]\n if (token.type !== 'heading_open') continue\n const nivel = Number(token.tag.slice(1))\n if (nivel < 2 || nivel > 3) continue\n const id = String(token.attrGet('id') ?? '')\n const inline = tokens[i + 1]\n if (!id || inline?.type !== 'inline') continue\n titulos.push({ id, text: textoDoTitulo(inline), level: nivel })\n }\n return titulos\n}\n\n/** Sanitiza o HTML do markdown (mantém âncoras, notas de rodapé e checkboxes). */\nexport function sanitizarMarkdown(html: string): string {\n return DOMPurify.sanitize(html, {\n ADD_ATTR: ['target', 'open', 'checked', 'disabled'],\n })\n}\n\n/**\n * Renderiza markdown para HTML sanitizado e devolve também o índice de títulos.\n *\n * O realce de sintaxe só aparece depois de `carregarRealce()` — chame antes (ou\n * re-renderize depois) para colorir o código.\n */\nexport function renderMarkdown(source: string): MarkdownRenderResult {\n const md = obterRenderer()\n const env: Record<string, unknown> = {}\n const tokens = md.parse(source ?? '', env)\n return {\n html: sanitizarMarkdown(md.renderer.render(tokens, md.options, env)),\n headings: coletarTitulos(tokens),\n }\n}\n","/**\n * Enriquecimento do markdown JÁ renderizado — o que precisa de DOM/JS.\n *\n * Roda depois do `v-html` (e depois do DOMPurify, por isso os botões nascem\n * aqui e não no HTML sanitizado): botão de copiar nos blocos de código, abas\n * clicáveis e diagramas mermaid (carregados sob demanda, na paleta do tema).\n */\n\n/* ==========================================================\n Copiar código\n ========================================================== */\n\nfunction aplicarCopiar(raiz: HTMLElement): void {\n raiz.querySelectorAll<HTMLElement>('[data-md-code]').forEach((bloco) => {\n if (bloco.dataset.mdPronto) return\n bloco.dataset.mdPronto = '1'\n\n const botao = document.createElement('button')\n botao.type = 'button'\n botao.className = 'md-code__copiar'\n botao.setAttribute('aria-label', 'Copiar código')\n botao.title = 'Copiar código'\n botao.innerHTML = '<i class=\"pi pi-copy\" aria-hidden=\"true\"></i>'\n botao.addEventListener('click', () => {\n const codigo = bloco.querySelector('code')?.textContent ?? ''\n void navigator.clipboard?.writeText(codigo).then(() => {\n botao.classList.add('md-code__copiar--feito')\n botao.innerHTML = '<i class=\"pi pi-check\" aria-hidden=\"true\"></i>'\n window.setTimeout(() => {\n botao.classList.remove('md-code__copiar--feito')\n botao.innerHTML = '<i class=\"pi pi-copy\" aria-hidden=\"true\"></i>'\n }, 1600)\n })\n })\n bloco.appendChild(botao)\n })\n}\n\n/* ==========================================================\n Abas\n ========================================================== */\n\n/**\n * Blocos `::: aba` seguidos viram um grupo de abas sozinhos — o autor não\n * precisa envolver tudo num `:::: abas` (aninhar marcador dentro de marcador é\n * a parte chata da sintaxe). O wrapper explícito continua funcionando.\n */\nfunction agruparAbasSoltas(raiz: HTMLElement): void {\n const soltos = Array.from(raiz.querySelectorAll<HTMLElement>('.md-tabs__panel')).filter(\n (painel) => !painel.parentElement?.hasAttribute('data-md-tabs'),\n )\n const vistos = new Set<HTMLElement>()\n\n soltos.forEach((primeiro) => {\n if (vistos.has(primeiro)) return\n const sequencia = [primeiro]\n let proximo = primeiro.nextElementSibling\n while (proximo instanceof HTMLElement && proximo.classList.contains('md-tabs__panel')) {\n sequencia.push(proximo)\n proximo = proximo.nextElementSibling\n }\n sequencia.forEach((painel) => vistos.add(painel))\n\n const grupo = document.createElement('div')\n grupo.className = 'md-tabs'\n grupo.setAttribute('data-md-tabs', '')\n primeiro.before(grupo)\n sequencia.forEach((painel) => grupo.appendChild(painel))\n })\n}\n\nfunction aplicarAbas(raiz: HTMLElement): void {\n agruparAbasSoltas(raiz)\n raiz.querySelectorAll<HTMLElement>('[data-md-tabs]').forEach((grupo, indiceGrupo) => {\n if (grupo.dataset.mdPronto) return\n const paineis = Array.from(\n grupo.querySelectorAll<HTMLElement>(':scope > .md-tabs__panel'),\n )\n if (!paineis.length) return\n grupo.dataset.mdPronto = '1'\n\n const barra = document.createElement('div')\n barra.className = 'md-tabs__bar'\n barra.setAttribute('role', 'tablist')\n\n const botoes = paineis.map((painel, indice) => {\n const id = `md-aba-${indiceGrupo}-${indice}`\n painel.id = `${id}-painel`\n painel.setAttribute('role', 'tabpanel')\n painel.setAttribute('aria-labelledby', id)\n\n const botao = document.createElement('button')\n botao.type = 'button'\n botao.id = id\n botao.className = 'md-tabs__botao'\n botao.setAttribute('role', 'tab')\n botao.setAttribute('aria-controls', painel.id)\n botao.textContent = painel.dataset.mdTab ?? `Aba ${indice + 1}`\n botao.addEventListener('click', () => selecionar(indice))\n barra.appendChild(botao)\n return botao\n })\n\n function selecionar(ativo: number): void {\n botoes.forEach((botao, indice) => {\n const selecionado = indice === ativo\n botao.setAttribute('aria-selected', String(selecionado))\n botao.tabIndex = selecionado ? 0 : -1\n paineis[indice].hidden = !selecionado\n })\n }\n\n grupo.prepend(barra)\n selecionar(0)\n })\n}\n\n/* ==========================================================\n Diagramas (mermaid)\n ========================================================== */\n\nlet mermaidPromise: Promise<typeof import('mermaid').default> | null = null\nlet sequencia = 0\n\nasync function carregarMermaid() {\n if (!mermaidPromise) {\n mermaidPromise = import('mermaid').then((modulo) => modulo.default)\n }\n return mermaidPromise\n}\n\n/** Elementos que nunca fazem parte de um diagrama — e que trazem execução junto. */\nconst TAGS_PROIBIDAS = new Set([\n 'script',\n 'iframe',\n 'object',\n 'embed',\n 'link',\n 'meta',\n 'base',\n 'form',\n 'input',\n 'button',\n 'audio',\n 'video',\n 'animate',\n 'set',\n])\n\n/** Remove tag executável, handler `on*` e URL `javascript:` — recursivo. */\nfunction limparNo(elemento: Element): void {\n for (const atributo of Array.from(elemento.attributes)) {\n const nome = atributo.name.toLowerCase()\n const valor = atributo.value.trim().toLowerCase()\n const ehLink = nome === 'href' || nome === 'xlink:href' || nome === 'src'\n if (nome.startsWith('on') || (ehLink && /^(javascript|data|vbscript):/.test(valor))) {\n elemento.removeAttribute(atributo.name)\n }\n }\n for (const filho of Array.from(elemento.children)) {\n if (TAGS_PROIBIDAS.has(filho.localName.toLowerCase())) filho.remove()\n else limparNo(filho)\n }\n}\n\n/**\n * Limpa o SVG do mermaid **sem perder os rótulos**.\n *\n * Os rótulos ficam dentro de `<foreignObject>` (HTML embutido no SVG), e o\n * DOMPurify genérico descarta esse conteúdo — o diagrama sairia com as caixas\n * vazias. Então a limpeza aqui é explícita e sobre o DOM já parseado como\n * `image/svg+xml`: fora tag executável, handler inline e URL de script.\n *\n * Isso é a **segunda** camada: o mermaid roda em `securityLevel: 'strict'`,\n * que escapa o texto do autor e já passa o SVG pelo próprio DOMPurify dele\n * (com a configuração que os rótulos exigem).\n *\n * @returns o nó limpo, ou `null` se o SVG vier malformado.\n */\nfunction sanitizarSvg(svg: string): Element | null {\n const documento = new DOMParser().parseFromString(svg, 'image/svg+xml')\n if (documento.querySelector('parsererror')) return null\n const raiz = documento.documentElement\n if (raiz.localName.toLowerCase() !== 'svg') return null\n limparNo(raiz)\n return raiz\n}\n\n/** Lê um token do tema atual do documento (o diagrama fica na paleta do portal). */\nfunction token(estilo: CSSStyleDeclaration, nome: string, padrao: string): string {\n return estilo.getPropertyValue(nome).trim() || padrao\n}\n\nfunction configurarMermaid(mermaid: Awaited<ReturnType<typeof carregarMermaid>>): void {\n const estilo = getComputedStyle(document.documentElement)\n const superficie = token(estilo, '--surface', '#ffffff')\n const texto = token(estilo, '--fg', '#141a22')\n const primaria = token(estilo, '--primary', '#1f5092')\n const suave = token(estilo, '--primary-soft', '#eef4fb')\n const borda = token(estilo, '--border-strong', '#cdd6e2')\n\n mermaid.initialize({\n startOnLoad: false,\n securityLevel: 'strict',\n theme: 'base',\n fontFamily: token(estilo, '--font-sans', 'inherit'),\n flowchart: { useMaxWidth: true },\n themeVariables: {\n background: superficie,\n primaryColor: suave,\n primaryTextColor: texto,\n primaryBorderColor: primaria,\n secondaryColor: token(estilo, '--surface-3', '#eef2f7'),\n tertiaryColor: token(estilo, '--surface-2', '#f8fafc'),\n lineColor: borda,\n textColor: texto,\n mainBkg: suave,\n nodeBorder: primaria,\n clusterBkg: token(estilo, '--surface-2', '#f8fafc'),\n clusterBorder: borda,\n fontSize: '13px',\n },\n })\n}\n\n/**\n * Renderiza os blocos ```mermaid do container.\n * @param forcar redesenha os que já estavam prontos (troca de tema).\n */\nexport async function renderizarDiagramas(raiz: HTMLElement, forcar = false): Promise<void> {\n const alvos = Array.from(raiz.querySelectorAll<HTMLElement>('[data-md-mermaid]')).filter(\n (figura) => forcar || !figura.dataset.mdEstado,\n )\n if (!alvos.length) return\n\n const mermaid = await carregarMermaid()\n configurarMermaid(mermaid)\n\n for (const figura of alvos) {\n const fonte = figura.querySelector<HTMLElement>('.md-mermaid__fonte')?.textContent ?? ''\n if (!fonte.trim()) continue\n figura.querySelector('.md-mermaid__svg')?.remove()\n try {\n sequencia += 1\n const { svg } = await mermaid.render(`md-diagrama-${sequencia}`, fonte)\n const limpo = sanitizarSvg(svg)\n if (!limpo) {\n figura.dataset.mdEstado = 'erro'\n continue\n }\n const caixa = document.createElement('div')\n caixa.className = 'md-mermaid__svg'\n caixa.appendChild(document.importNode(limpo, true))\n figura.prepend(caixa)\n figura.dataset.mdEstado = 'ok'\n } catch {\n // Diagrama inválido: mostra o código-fonte em vez de sumir com o conteúdo.\n figura.dataset.mdEstado = 'erro'\n }\n }\n}\n\n/* ==========================================================\n API\n ========================================================== */\n\n/** Aplica tudo. Idempotente — pode ser chamado a cada re-render. */\nexport async function enhanceMarkdown(raiz: HTMLElement | null): Promise<void> {\n if (!raiz) return\n aplicarCopiar(raiz)\n aplicarAbas(raiz)\n await renderizarDiagramas(raiz)\n}\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { carregarRealce, realceDisponivel, renderMarkdown } from '@/utils/markdown'\nimport { enhanceMarkdown, renderizarDiagramas } from '@/utils/markdownEnhance'\nimport type { MarkdownHeading } from '@/types/markdown'\n\n/**\n * Leitor de markdown rico — a tela de leitura do design system.\n *\n * Além do markdown padrão (títulos, listas, tabelas, citações), entende o\n * vocabulário de documentação do produto: alertas (`> [!DICA]` ou `::: dica`),\n * passos, cards, abas, blocos colapsáveis, notas de rodapé, código com realce e\n * botão de copiar, e diagramas ```mermaid.\n *\n * Sempre sanitizado (DOMPurify) antes do `v-html` — o conteúdo vem de usuários.\n */\nconst props = withDefaults(\n defineProps<{\n /** Markdown cru a renderizar. */\n source: string\n /** Mensagem exibida quando `source` está vazio. */\n emptyText?: string\n }>(),\n {\n emptyText: 'Sem conteúdo',\n },\n)\n\nconst emit = defineEmits<{\n /** Títulos (`##`/`###`) do documento — alimenta um índice lateral. */\n headings: [MarkdownHeading[]]\n}>()\n\nconst raiz = ref<HTMLElement | null>(null)\n/** Vira `true` quando o highlight.js termina de carregar — dispara o re-render. */\nconst realcePronto = ref(realceDisponivel())\n\nconst resultado = computed(() => {\n // Dependência proposital: o realce chega depois e o HTML precisa ser refeito.\n void realcePronto.value\n return renderMarkdown(props.source ?? '')\n})\n\nconst html = computed(() => resultado.value.html)\nconst isEmpty = computed(() => !props.source || !props.source.trim())\n\nwatch(resultado, (valor) => emit('headings', valor.headings), { immediate: true })\nwatch(html, () => void nextTick(() => enhanceMarkdown(raiz.value)))\n\n/** Diagramas usam as cores do tema — redesenha quando o portal troca claro/escuro. */\nlet observador: MutationObserver | null = null\n\nfunction observarTema(): void {\n if (typeof MutationObserver === 'undefined') return\n observador = new MutationObserver(() => void renderizarDiagramas(raiz.value!, true))\n observador.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] })\n}\n\nonMounted(async () => {\n await nextTick()\n await enhanceMarkdown(raiz.value)\n observarTema()\n if (!realcePronto.value) {\n await carregarRealce()\n realcePronto.value = true\n }\n})\n\nonBeforeUnmount(() => observador?.disconnect())\n</script>\n\n<template>\n <div v-if=\"isEmpty\" class=\"w-markdown-view w-markdown-view--empty\">{{ emptyText }}</div>\n <!-- eslint-disable-next-line vue/no-v-html — output sanitizado pelo DOMPurify -->\n <div v-else ref=\"raiz\" class=\"w-markdown-view\" v-html=\"html\" />\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref } from 'vue'\nimport WMarkdownView from '../ui/WMarkdownView.vue'\n\n/**\n * Editor de markdown com toolbar mínima e preview (reutiliza o WMarkdownView).\n * A área de edição é um `<textarea>` monospace nativo — Tab mantém o\n * comportamento de foco padrão (a11y). As ações da toolbar inserem a sintaxe\n * na posição do cursor/seleção.\n */\nconst props = withDefaults(\n defineProps<{\n /** Markdown cru (v-model). */\n modelValue: string\n disabled?: boolean\n placeholder?: string\n /** Altura mínima da área de edição/preview. */\n minHeight?: string\n /**\n * Altura máxima da área de edição/preview. Com valor, o editor vira moldura\n * fixa e cada painel rola por dentro — as ações do formulário seguem\n * visíveis por mais longo que fique o documento.\n */\n maxHeight?: string\n /** 'tab' alterna escrever/visualizar; 'split' mostra lado a lado. */\n previewMode?: 'tab' | 'split'\n }>(),\n {\n disabled: false,\n minHeight: '320px',\n maxHeight: 'none',\n previewMode: 'tab',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n}>()\n\nconst textareaRef = ref<HTMLTextAreaElement | null>(null)\nconst previewing = ref(false)\n\nconst isSplit = computed(() => props.previewMode === 'split')\nconst showTextarea = computed(() => isSplit.value || !previewing.value)\nconst showPreview = computed(() => isSplit.value || previewing.value)\n\nfunction onInput(event: Event) {\n emit('update:modelValue', (event.target as HTMLTextAreaElement).value)\n}\n\n/** Aplica `next` e restaura foco + seleção no textarea. */\nfunction apply(next: string, selectionStart: number, selectionEnd: number) {\n emit('update:modelValue', next)\n nextTick(() => {\n const el = textareaRef.value\n if (!el) return\n el.focus()\n el.setSelectionRange(selectionStart, selectionEnd)\n })\n}\n\n/** Envolve a seleção com `before`/`after` (ex.: negrito = **seleção**). */\nfunction surround(before: string, after = before, placeholder = 'texto') {\n const el = textareaRef.value\n if (!el || props.disabled) return\n const value = props.modelValue ?? ''\n const start = el.selectionStart\n const end = el.selectionEnd\n const selected = value.slice(start, end) || placeholder\n const next = value.slice(0, start) + before + selected + after + value.slice(end)\n apply(next, start + before.length, start + before.length + selected.length)\n}\n\n/** Prefixa cada linha da seleção (heading, listas). */\nfunction prefixLines(prefix: string | ((index: number) => string)) {\n const el = textareaRef.value\n if (!el || props.disabled) return\n const value = props.modelValue ?? ''\n const start = el.selectionStart\n const end = el.selectionEnd\n const lineStart = value.lastIndexOf('\\n', start - 1) + 1\n const lineEndRaw = value.indexOf('\\n', end)\n const lineEnd = lineEndRaw === -1 ? value.length : lineEndRaw\n const block = value.slice(lineStart, lineEnd)\n const prefixed = block\n .split('\\n')\n .map((line, i) => (typeof prefix === 'function' ? prefix(i) : prefix) + line)\n .join('\\n')\n const next = value.slice(0, lineStart) + prefixed + value.slice(lineEnd)\n apply(next, lineStart, lineStart + prefixed.length)\n}\n\nfunction actionBold() {\n surround('**')\n}\n\nfunction actionItalic() {\n surround('*')\n}\n\nfunction actionHeading() {\n prefixLines('## ')\n}\n\nfunction actionList() {\n prefixLines('- ')\n}\n\nfunction actionTaskList() {\n prefixLines('- [ ] ')\n}\n\nfunction actionLink() {\n const el = textareaRef.value\n if (!el || props.disabled) return\n const value = props.modelValue ?? ''\n const start = el.selectionStart\n const end = el.selectionEnd\n const selected = value.slice(start, end) || 'texto'\n const next = `${value.slice(0, start)}[${selected}](url)${value.slice(end)}`\n // Deixa \"url\" selecionado, pronto para colar o endereço.\n const urlStart = start + selected.length + 3\n apply(next, urlStart, urlStart + 3)\n}\n\nfunction actionCode() {\n const el = textareaRef.value\n if (!el || props.disabled) return\n const selected = (props.modelValue ?? '').slice(el.selectionStart, el.selectionEnd)\n if (selected.includes('\\n')) surround('```\\n', '\\n```', 'código')\n else surround('`', '`', 'código')\n}\n\n/**\n * Insere um bloco em linha própria. No modelo, `$` marca o trecho que fica\n * selecionado depois (ou onde entra o texto que já estava selecionado).\n */\nfunction inserirBloco(modelo: string, exemplo: string) {\n const el = textareaRef.value\n if (!el || props.disabled) return\n const value = props.modelValue ?? ''\n const start = el.selectionStart\n const end = el.selectionEnd\n const alvo = value.slice(start, end) || exemplo\n const corpo = modelo.replace('$', alvo)\n const antes = value.slice(0, start)\n // Bloco precisa de linha em branco antes para o markdown reconhecer.\n const respiro = !antes || antes.endsWith('\\n\\n') ? '' : antes.endsWith('\\n') ? '\\n' : '\\n\\n'\n const next = `${antes}${respiro}${corpo}\\n${value.slice(end)}`\n const posicao = antes.length + respiro.length + corpo.indexOf(alvo)\n apply(next, posicao, posicao + alvo.length)\n}\n\nfunction actionAlert() {\n inserirBloco('> [!DICA]\\n> $', 'Escreva aqui a sugestão')\n}\n\nfunction actionSteps() {\n inserirBloco('::: passos\\n1. $\\n2. Próximo passo\\n:::', 'Primeiro passo')\n}\n\nfunction actionTable() {\n inserirBloco('| Coluna | Coluna |\\n| --- | --- |\\n| $ | valor |', 'valor')\n}\n\nfunction actionHighlight() {\n surround('==', '==', 'destaque')\n}\n\nfunction togglePreview() {\n previewing.value = !previewing.value\n}\n\nconst ajudaAberta = ref(false)\n\n/** Cola rápida do vocabulário — o autor não precisa decorar a sintaxe. */\nconst ajuda: { sintaxe: string; efeito: string }[] = [\n { sintaxe: '## Título', efeito: 'Seção (entra no índice lateral)' },\n { sintaxe: '> [!DICA] Título', efeito: 'Destaque: dica, nota, importante, atenção, cuidado' },\n { sintaxe: '::: passos … :::', efeito: 'Procedimento numerado' },\n { sintaxe: '::: cards … :::', efeito: 'Lista em cartões' },\n { sintaxe: '::: aba Título', efeito: 'Conteúdo em abas (blocos seguidos)' },\n { sintaxe: '::: detalhes Título', efeito: 'Bloco que abre e fecha' },\n { sintaxe: '==destaque==', efeito: 'Texto marcado' },\n { sintaxe: '- [ ] tarefa', efeito: 'Checklist' },\n { sintaxe: '```python title=\"arquivo.py\"', efeito: 'Código com realce e cópia' },\n { sintaxe: '```mermaid', efeito: 'Diagrama de fluxo' },\n]\n\ninterface ToolDef {\n /** Ícone PrimeIcons OU glyph textual (PrimeIcons não tem bold/itálico). */\n icon?: string\n glyph?: string\n label: string\n run: () => void\n}\n\nconst tools: ToolDef[] = [\n { glyph: 'B', label: 'Negrito', run: actionBold },\n { glyph: 'I', label: 'Itálico', run: actionItalic },\n { icon: 'pi pi-hashtag', label: 'Título (H2)', run: actionHeading },\n { icon: 'pi pi-list', label: 'Lista', run: actionList },\n { icon: 'pi pi-check-square', label: 'Lista de tarefas', run: actionTaskList },\n { icon: 'pi pi-link', label: 'Link', run: actionLink },\n { icon: 'pi pi-code', label: 'Código', run: actionCode },\n { icon: 'pi pi-info-circle', label: 'Destaque', run: actionAlert },\n { icon: 'pi pi-sort-numeric-down', label: 'Passos', run: actionSteps },\n { icon: 'pi pi-table', label: 'Tabela', run: actionTable },\n { icon: 'pi pi-pencil', label: 'Marcar texto', run: actionHighlight },\n]\n</script>\n\n<template>\n <div class=\"w-markdown-editor\" :class=\"{ 'w-markdown-editor--split': isSplit }\">\n <div class=\"w-markdown-editor__toolbar\" role=\"toolbar\" aria-label=\"Formatação markdown\">\n <button\n v-for=\"tool in tools\"\n :key=\"tool.label\"\n type=\"button\"\n class=\"w-markdown-editor__tool\"\n :aria-label=\"tool.label\"\n :title=\"tool.label\"\n :disabled=\"disabled || (!isSplit && previewing)\"\n @click=\"tool.run()\"\n >\n <i v-if=\"tool.icon\" :class=\"tool.icon\" aria-hidden=\"true\" />\n <span\n v-else\n class=\"w-markdown-editor__glyph\"\n :class=\"{\n 'w-markdown-editor__glyph--bold': tool.glyph === 'B',\n 'w-markdown-editor__glyph--italic': tool.glyph === 'I',\n }\"\n aria-hidden=\"true\"\n >\n {{ tool.glyph }}\n </span>\n </button>\n\n <button\n type=\"button\"\n class=\"w-markdown-editor__tool w-markdown-editor__tool--ajuda\"\n :class=\"{ 'w-markdown-editor__tool--active': ajudaAberta }\"\n aria-label=\"Sintaxe disponível\"\n title=\"Sintaxe disponível\"\n :aria-pressed=\"ajudaAberta\"\n @click=\"ajudaAberta = !ajudaAberta\"\n >\n <i class=\"pi pi-question-circle\" aria-hidden=\"true\" />\n </button>\n\n <button\n v-if=\"!isSplit\"\n type=\"button\"\n class=\"w-markdown-editor__tool w-markdown-editor__tool--preview\"\n :class=\"{ 'w-markdown-editor__tool--active': previewing }\"\n aria-label=\"Visualizar\"\n title=\"Visualizar\"\n :aria-pressed=\"previewing\"\n @click=\"togglePreview\"\n >\n <i :class=\"previewing ? 'pi pi-pencil' : 'pi pi-eye'\" aria-hidden=\"true\" />\n </button>\n </div>\n\n <dl v-if=\"ajudaAberta\" class=\"w-markdown-editor__ajuda\">\n <template v-for=\"linha in ajuda\" :key=\"linha.sintaxe\">\n <dt>{{ linha.sintaxe }}</dt>\n <dd>{{ linha.efeito }}</dd>\n </template>\n </dl>\n\n <div class=\"w-markdown-editor__body\" :style=\"{ minHeight, maxHeight }\">\n <textarea\n v-if=\"showTextarea\"\n ref=\"textareaRef\"\n class=\"w-markdown-editor__textarea\"\n :value=\"modelValue\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n spellcheck=\"false\"\n @input=\"onInput\"\n />\n <WMarkdownView\n v-if=\"showPreview\"\n class=\"w-markdown-editor__preview\"\n :source=\"modelValue\"\n empty-text=\"Nada para visualizar\"\n />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue'\nimport type { MarkdownHeading } from '@/types/markdown'\n\n/**\n * Índice do documento (\"Nesta página\") com marcação da seção em leitura.\n *\n * Os títulos vêm do evento `headings` do WMarkdownView. Cada `##` vira um grupo\n * que **recolhe seus `###`** — assim o índice fica curto mesmo em documento\n * longo — e o grupo da seção que está sendo lida abre sozinho.\n *\n * A altura é presa à do contexto e a rolagem, quando sobra conteúdo, acontece\n * sem barra visível: o índice não pode competir com a rolagem da página.\n */\nconst props = withDefaults(\n defineProps<{\n /** Títulos do documento (evento `headings` do WMarkdownView). */\n headings: MarkdownHeading[]\n title?: string\n /** Abaixo disso o índice não aparece (documento curto não precisa). */\n minHeadings?: number\n /** Mostra o campo que filtra os títulos. */\n searchable?: boolean\n /** Teto da lista — o índice se ajusta à altura disponível. */\n maxHeight?: string\n }>(),\n {\n title: 'Nesta página',\n minHeadings: 2,\n searchable: false,\n maxHeight: 'calc(100vh - 14rem)',\n },\n)\n\ninterface Grupo {\n titulo: MarkdownHeading\n filhos: MarkdownHeading[]\n}\n\nconst ativo = ref('')\nconst termo = ref('')\n/**\n * Id do único `##` aberto — acordeão. Tudo começa fechado e nada abre sozinho:\n * abrir seção é decisão do leitor, não efeito colateral da rolagem.\n */\nconst aberto = ref<string | null>(null)\nlet observador: IntersectionObserver | null = null\n\n/** `##` viram grupos; `###` (e abaixo) entram como filhos do grupo anterior. */\nconst grupos = computed<Grupo[]>(() => {\n const saida: Grupo[] = []\n for (const titulo of props.headings) {\n if (titulo.level <= 2 || !saida.length) saida.push({ titulo, filhos: [] })\n else saida[saida.length - 1].filhos.push(titulo)\n }\n return saida\n})\n\nfunction normalizar(texto: string): string {\n return texto\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n}\n\n/** Com filtro, sobram os grupos que casam (ou que têm filho que casa). */\nconst visiveis = computed<Grupo[]>(() => {\n const busca = normalizar(termo.value.trim())\n if (!busca) return grupos.value\n return grupos.value\n .map((grupo) => ({\n titulo: grupo.titulo,\n filhos: grupo.filhos.filter((filho) => normalizar(filho.text).includes(busca)),\n }))\n .filter((grupo) => grupo.filhos.length || normalizar(grupo.titulo.text).includes(busca))\n})\n\nconst filtrando = computed(() => termo.value.trim().length > 0)\n\nfunction expandido(grupo: Grupo): boolean {\n return filtrando.value || aberto.value === grupo.titulo.id\n}\n\nfunction alternar(grupo: Grupo): void {\n aberto.value = aberto.value === grupo.titulo.id ? null : grupo.titulo.id\n}\n\nfunction observar(): void {\n observador?.disconnect()\n if (typeof IntersectionObserver === 'undefined') return\n observador = new IntersectionObserver(\n (entradas) => {\n const visivel = entradas.find((entrada) => entrada.isIntersecting)\n if (visivel) ativo.value = visivel.target.id\n },\n // Faixa de leitura: o título \"ativo\" é o que está no topo da tela.\n { rootMargin: '-88px 0px -70% 0px', threshold: 0 },\n )\n props.headings.forEach((titulo) => {\n const elemento = document.getElementById(titulo.id)\n if (elemento) observador?.observe(elemento)\n })\n}\n\nfunction ir(id: string): void {\n const elemento = document.getElementById(id)\n if (!elemento) return\n ativo.value = id\n elemento.scrollIntoView({ behavior: 'smooth', block: 'start' })\n}\n\nwatch(() => props.headings, () => void nextTick(observar), { immediate: true })\n\nonBeforeUnmount(() => observador?.disconnect())\n</script>\n\n<template>\n <nav v-if=\"headings.length >= minHeadings\" class=\"w-md-toc\" aria-label=\"Índice do documento\">\n <p class=\"w-md-toc__titulo\">{{ title }}</p>\n\n <div v-if=\"searchable\" class=\"w-md-toc__busca\">\n <i class=\"pi pi-search\" aria-hidden=\"true\" />\n <input v-model=\"termo\" type=\"search\" placeholder=\"Filtrar seções\" aria-label=\"Filtrar seções\" />\n </div>\n\n <div class=\"w-md-toc__corpo\" :style=\"{ maxHeight }\">\n <ul class=\"w-md-toc__lista\">\n <li v-for=\"grupo in visiveis\" :key=\"grupo.titulo.id\" class=\"w-md-toc__grupo\">\n <div\n class=\"w-md-toc__item w-md-toc__item--n2\"\n :class=\"{ 'w-md-toc__item--ativo': ativo === grupo.titulo.id }\"\n >\n <button\n v-if=\"grupo.filhos.length\"\n type=\"button\"\n class=\"w-md-toc__chevron\"\n :aria-expanded=\"expandido(grupo)\"\n :aria-label=\"`Mostrar seções de ${grupo.titulo.text}`\"\n @click=\"alternar(grupo)\"\n >\n <i\n :class=\"expandido(grupo) ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\n aria-hidden=\"true\"\n />\n </button>\n <span v-else class=\"w-md-toc__chevron w-md-toc__chevron--vazio\" aria-hidden=\"true\" />\n <a :href=\"`#${grupo.titulo.id}`\" @click.prevent=\"ir(grupo.titulo.id)\">\n {{ grupo.titulo.text }}\n </a>\n </div>\n\n <ul v-if=\"expandido(grupo)\" class=\"w-md-toc__lista\">\n <li\n v-for=\"filho in grupo.filhos\"\n :key=\"filho.id\"\n class=\"w-md-toc__item w-md-toc__item--n3\"\n :class=\"{ 'w-md-toc__item--ativo': ativo === filho.id }\"\n >\n <a :href=\"`#${filho.id}`\" @click.prevent=\"ir(filho.id)\">{{ filho.text }}</a>\n </li>\n </ul>\n </li>\n </ul>\n\n <p v-if=\"filtrando && !visiveis.length\" class=\"w-md-toc__vazio\">Nenhuma seção encontrada</p>\n </div>\n </nav>\n</template>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport type { TabItem } from '@/types/tabs'\n\n/**\n * Barra de abas de TELA (não confundir com as abas dentro de um markdown).\n *\n * Controlada: só emite `update:modelValue` — quem decide o que renderizar é a\n * página. Navegação por teclado com ←/→ (padrão ARIA de tablist).\n */\ndefineProps<{\n /** `value` da aba ativa. */\n modelValue: string\n items: TabItem[]\n /** Rótulo do grupo para leitores de tela. */\n ariaLabel?: string\n}>()\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n}>()\n\nconst botoes = ref<HTMLButtonElement[]>([])\n\nfunction registrar(el: unknown, indice: number): void {\n if (el instanceof HTMLButtonElement) botoes.value[indice] = el\n}\n\nfunction selecionar(item: TabItem): void {\n if (!item.disabled) emit('update:modelValue', item.value)\n}\n\n/** ←/→ andam entre as abas habilitadas, circulando nas pontas. */\nfunction navegar(items: TabItem[], indice: number, passo: number): void {\n const total = items.length\n for (let salto = 1; salto <= total; salto += 1) {\n const alvo = (indice + passo * salto + total * total) % total\n if (!items[alvo].disabled) {\n emit('update:modelValue', items[alvo].value)\n botoes.value[alvo]?.focus()\n return\n }\n }\n}\n</script>\n\n<template>\n <div class=\"w-tab-bar\" role=\"tablist\" :aria-label=\"ariaLabel\">\n <button\n v-for=\"(item, indice) in items\"\n :key=\"item.value\"\n :ref=\"(el) => registrar(el, indice)\"\n type=\"button\"\n role=\"tab\"\n class=\"w-tab-bar__item\"\n :class=\"{ 'w-tab-bar__item--ativa': item.value === modelValue }\"\n :aria-selected=\"item.value === modelValue\"\n :tabindex=\"item.value === modelValue ? 0 : -1\"\n :disabled=\"item.disabled\"\n @click=\"selecionar(item)\"\n @keydown.right.prevent=\"navegar(items, indice, 1)\"\n @keydown.left.prevent=\"navegar(items, indice, -1)\"\n >\n <i v-if=\"item.icon\" :class=\"item.icon\" aria-hidden=\"true\" />\n <span>{{ item.label }}</span>\n <span v-if=\"item.badge !== undefined && item.badge !== null\" class=\"w-tab-bar__badge\">\n {{ item.badge }}\n </span>\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport type { KanbanColumn, KanbanMoveEvent } from '@/types/kanban'\n\ntype Item = Record<string, unknown>\n\n/**\n * Board kanban controlado: as colunas e seus itens vêm de fora e o board NUNCA\n * muta os arrays — arrastar um card só emite `move`; o consumidor persiste e\n * atualiza `columns`. Drag and drop com HTML5 nativo (sem dependência).\n *\n * Mover programaticamente (ex.: botão \"mover para...\") é responsabilidade do\n * consumidor — basta aplicar a mesma mudança que faria ao receber um `move`.\n */\nconst props = withDefaults(\n defineProps<{\n /** Colunas na ordem de exibição. Itens pertencem ao consumidor. */\n columns: KanbanColumn[]\n /** Campo usado como key estável dos cards. */\n itemKey?: string\n /** Permite bloquear o arrasto de itens específicos. */\n canDrag?: (item: Item) => boolean\n loading?: boolean\n /** Altura máxima da lista de cards (a coluna rola por dentro). */\n maxHeight?: string\n /** Altura mínima da lista — dá área de drop mesmo com a coluna vazia. */\n minHeight?: string\n }>(),\n {\n itemKey: 'id',\n loading: false,\n maxHeight: '32rem',\n minHeight: '6rem',\n },\n)\n\nconst emit = defineEmits<{\n /** Card solto em outra posição (entre colunas ou reordenação na mesma). */\n move: [event: KanbanMoveEvent]\n /** Clique simples no card (sem drag). */\n 'item-click': [item: Item]\n}>()\n\ndefineSlots<{\n /** Conteúdo do card. Fallback: item.nome ?? item[itemKey]. */\n card?(props: { item: Item; column: KanbanColumn }): unknown\n /** Cabeçalho da coluna. Fallback: label + contador. */\n 'column-header'?(props: { column: KanbanColumn }): unknown\n /** Ação à direita do cabeçalho (ex.: criar nesta coluna). */\n 'column-action'?(props: { column: KanbanColumn }): unknown\n /** Coluna sem itens. */\n 'empty-column'?(props: { column: KanbanColumn }): unknown\n}>()\n\nconst dragging = ref<{ item: Item; from: string; key: unknown } | null>(null)\nconst dropTarget = ref<{ column: string; index: number } | null>(null)\n\nconst listRefs = new Map<string, HTMLElement>()\n\nfunction setListRef(value: string, el: unknown) {\n if (el instanceof HTMLElement) listRefs.set(value, el)\n else listRefs.delete(value)\n}\n\nfunction keyOf(item: Item): unknown {\n return item[props.itemKey]\n}\n\nfunction fallbackLabel(item: Item): string {\n return String(item.nome ?? keyOf(item) ?? '')\n}\n\nfunction isDraggable(item: Item): boolean {\n if (props.loading) return false\n return props.canDrag ? props.canDrag(item) : true\n}\n\nfunction isDragging(item: Item): boolean {\n return !!dragging.value && keyOf(item) === dragging.value.key\n}\n\n/** Índice de inserção na coluna: ponto médio vertical dos cards renderizados. */\nfunction computeIndex(colValue: string, event: DragEvent): number {\n const list = listRefs.get(colValue)\n if (!list) return 0\n const cards = Array.from(list.querySelectorAll(':scope > .w-kanban-board__card'))\n let index = cards.length\n for (let i = 0; i < cards.length; i++) {\n const rect = cards[i].getBoundingClientRect()\n if (event.clientY < rect.top + rect.height / 2) {\n index = i\n break\n }\n }\n return index\n}\n\nfunction onDragStart(item: Item, column: KanbanColumn, event: DragEvent) {\n if (!isDraggable(item)) {\n event.preventDefault()\n return\n }\n dragging.value = { item, from: column.value, key: keyOf(item) }\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', String(keyOf(item)))\n }\n}\n\nfunction onDragOver(column: KanbanColumn, event: DragEvent) {\n if (!dragging.value) return\n event.preventDefault()\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move'\n dropTarget.value = { column: column.value, index: computeIndex(column.value, event) }\n}\n\nfunction onDragLeave(column: KanbanColumn, event: DragEvent) {\n const list = listRefs.get(column.value)\n const related = event.relatedTarget\n if (list && related instanceof Node && list.contains(related)) return\n if (dropTarget.value?.column === column.value) dropTarget.value = null\n}\n\nfunction onDrop(column: KanbanColumn, event: DragEvent) {\n event.preventDefault()\n const drag = dragging.value\n clearDrag()\n if (!drag) return\n\n const rawIndex = computeIndex(column.value, event)\n let index = rawIndex\n\n if (drag.from === column.value) {\n const source = props.columns.find((c) => c.value === column.value)\n const oldIndex = source ? source.items.findIndex((i) => keyOf(i) === drag.key) : -1\n if (oldIndex !== -1 && rawIndex > oldIndex) index = rawIndex - 1\n // Soltou onde já estava: nada a persistir.\n if (index === oldIndex) return\n }\n\n emit('move', { item: drag.item, from: drag.from, to: column.value, index })\n}\n\nfunction onDragEnd() {\n clearDrag()\n}\n\nfunction clearDrag() {\n dragging.value = null\n dropTarget.value = null\n}\n\nfunction onCardClick(item: Item) {\n if (dragging.value) return\n emit('item-click', item)\n}\n\nfunction showIndicatorAt(column: KanbanColumn, index: number): boolean {\n return (\n !!dragging.value &&\n dropTarget.value?.column === column.value &&\n dropTarget.value.index === index\n )\n}\n</script>\n\n<template>\n <div\n class=\"w-kanban-board\"\n :class=\"{\n 'w-kanban-board--loading': loading,\n 'w-kanban-board--dragging': !!dragging,\n }\"\n :aria-busy=\"loading || undefined\"\n >\n <section\n v-for=\"column in columns\"\n :key=\"column.value\"\n class=\"w-kanban-board__column\"\n :class=\"{\n 'w-kanban-board__column--over': !!dragging && dropTarget?.column === column.value,\n }\"\n :style=\"column.accent ? { '--w-kanban-accent': column.accent } : undefined\"\n >\n <header class=\"w-kanban-board__header\">\n <slot name=\"column-header\" :column=\"column\">\n <span class=\"w-kanban-board__title\">{{ column.label }}</span>\n <span class=\"w-kanban-board__count\">{{ column.items.length }}</span>\n </slot>\n <slot name=\"column-action\" :column=\"column\" />\n </header>\n\n <div\n :ref=\"(el) => setListRef(column.value, el)\"\n class=\"w-kanban-board__list\"\n role=\"list\"\n :aria-label=\"column.label\"\n :style=\"{ maxHeight, minHeight }\"\n @dragover=\"onDragOver(column, $event)\"\n @dragleave=\"onDragLeave(column, $event)\"\n @drop=\"onDrop(column, $event)\"\n >\n <template v-for=\"(item, i) in column.items\" :key=\"String(keyOf(item))\">\n <div v-if=\"showIndicatorAt(column, i)\" class=\"w-kanban-board__indicator\" />\n <div\n class=\"w-kanban-board__card\"\n role=\"listitem\"\n tabindex=\"0\"\n :class=\"{\n 'w-kanban-board__card--dragging': isDragging(item),\n 'w-kanban-board__card--static': !isDraggable(item),\n }\"\n :draggable=\"isDraggable(item)\"\n @dragstart=\"onDragStart(item, column, $event)\"\n @dragend=\"onDragEnd\"\n @click=\"onCardClick(item)\"\n @keydown.enter.prevent=\"onCardClick(item)\"\n @keydown.space.prevent=\"onCardClick(item)\"\n >\n <slot name=\"card\" :item=\"item\" :column=\"column\">\n <span class=\"w-kanban-board__card-fallback\">{{ fallbackLabel(item) }}</span>\n </slot>\n </div>\n </template>\n <div\n v-if=\"showIndicatorAt(column, column.items.length)\"\n class=\"w-kanban-board__indicator\"\n />\n\n <div v-if=\"!column.items.length\" class=\"w-kanban-board__empty\">\n <slot name=\"empty-column\" :column=\"column\">Nenhum item</slot>\n </div>\n </div>\n </section>\n </div>\n</template>\n"],"names":["formatDate","formatDateTime","formatCurrency","formatNumber","useFormatters","__props","_createElementBlock","_hoisted_1","_createBlock","_unref","Tag","_openBlock","_hoisted_3","_toDisplayString","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","S","x","n","t","e","A","R","N","w","s","P","k","g","b","d","r","a","p","o","f","i","h","l","C","F","T","E","W","I","O","u","c","v","M","m","y","V","TYPE_MAP","mapApiFieldToFieldDef","apiField","fieldType","def","_a","mapApiFieldsToFieldDefs","apiFields","COLUMN_TYPE_MAP","mapApiFieldToColumnDef","mapApiFieldsToColumnDefs","maxColumns","props","emit","__emit","dataProvider","inject","W_DATA_PROVIDER_KEY","provider","toast","useAppToast","confirmDeleteDialog","useAppConfirm","selectedItem","ref","selectedItems","suggestions","searching","acModel","computed","keyOf","dedupeByKey","itens","vistos","out","item","emitSelection","labelOf","descriptionOf","chipsOcultos","chipsOcultosLabel","onChipRemove","event","remove","limparSelecao","chipStyle","mostrarLimpar","debounceTimer","acRef","onMounted","nextTick","input","_c","_b","_d","isEmptyValue","normalizeDrillValue","drilldownList","blockedByRequired","drilldownParams","params","val","effectivePlaceholder","placeholderVisivel","fetchOne","id","fetchById","resolveMany","valores","obj","search","query","response","onSearch","onSelect","onAcUpdate","value","onClear","watch","newVal","lista","chaves","atuais","modalVisible","modalData","modalLoading","modalSearch","modalPage","modalPageSize","modalTotalRecords","modalSelection","modalSelecionados","sel","modalSortField","modalSortOrder","modalSearchTimer","subRowsMap","subRowsColumns","expandedRows","fetchSubRows","map","columns","abertos","row","subRowsDe","crudAvailable","showCreate","showEdit","showDelete","hasRowActions","formFields","modalColumns","fetchModalData","onInputKeydown","openModal","onModalPage","onModalSort","confirmModalSelection","onRowDblClick","modalSearchInput","modalTableWrap","lastSearched","onModalShow","el","focusModalGrid","onModalSearchKeydown","q","onModalGridKeydown","novos","antigos","mudou","tinhaValorAntes","formDialogVisible","formSaving","editingItem","formData","reactive","isEditing","formDialogTitle","getDefaults","defaults","resetForm","defs","key","openCreateForm","openEditForm","setFormField","field","saveForm","payload","pk","idx","parent","current","err","extractApiError","confirmDelete","_createElementVNode","_mergeProps","$attrs","_createVNode","AutoComplete","_withCtx","option","_hoisted_2","index","removeCallback","Chip","$event","Dialog","_hoisted_10","Button","IconField","InputIcon","InputText","DataTable","_cache","Column","_Fragment","_renderList","col","_normalizeStyle","data","WCrudColumnRenderer","_hoisted_8","_hoisted_9","sub","WCrudFormDialog","di","useDateInput","typed","panelDate","op","maskaOptions","minDateObj","maxDateObj","commit","date","onTypedInput","onBlur","onKeydown","setToday","onPick","clearValue","toggle","_normalizeClass","Popover","DatePicker","resolvedPrefix","hasAddon","display","onInput","digits","num","InputGroup","InputGroupAddon","VP","objectUrl","onBeforeUnmount","previewSrc","fileInput","openPicker","acceptsFile","file","acc","originalName","originalType","cropImage","onFileChange","reader","img","naturalW","naturalH","zoom","imgSrc","offset","vpW","dispW","vpH","dispH","cropOpen","effAspect","baseScale","dispScale","clampOffset","imgStyle","dragging","dragStart","onPointerDown","onPointerMove","onPointerUp","outputType","outputName","type","ext","confirmCrop","scale","sx","sy","sw","sh","canvas","ctx","blob","_renderSlot","_ctx","Slider","leftSearch","rightSearch","selectedSet","fields","idOf","matches","term","available","chosen","add","addAll","removeAll","_hoisted_11","_hoisted_13","lookupCep","cep","fieldErrors","cepLoading","cepError","cepTimers","onCepInput","raw","result","mapping","keys","targetField","existing","visibleFields","isFieldDisabled","subRowsFetchDe","resolveEndpointParams","ep","calculatedFields","nexts","unwrapRef","isRef","autofocusField","mode","explicit","first","semInput","shouldAutofocus","convertMask","mask","displayCpfCnpj","onCpfCnpjInput","fieldName","autocompleteSuggestions","getAutocompleteValue","optionValue","getFilteredSuggestions","onAutocompleteSearch","options","optionLabel","onAutocompleteSelect","fieldOptions","optionLabelOf","optionValueOf","isOptionSelected","pickOption","chipEntries","labelKey","valueKey","match","removeChip","_","getColorPickerValue","onColorChange","resolveDrilldown","dep","validateField","error","validateAll","errors","clearErrors","groupColumns","group","fieldSpan","cols","span","fieldSpanStyle","fieldSpanClass","groupedFields","groupMap","groupOrder","groupExplicitOrder","groupId","_e","orderA","orderB","__expose","ToggleSwitch","ColorPicker","WImageCropper","msg","_hoisted_12","WTransferList","_hoisted_14","_hoisted_15","Password","InputNumber","WMoneyInput","Select","WAutoCompleteFK","WDatePicker","Textarea","_hoisted_16","_hoisted_17","_hoisted_18","_createTextVNode","_hoisted_20","chip","chipIndex","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","rendererRef","formRef","onSave","focusFirst","handleKeydown","useFormKeyboardNav","args","WFormRenderer","slotData","cellValue","escapeCell","separator","toCsv","rows","sep","header","lines","downloadCsv","csv","filename","url","link","slots","useSlots","viewKey","loadView","stored","displayMode","isView","setView","paginatorFirst","columnState","chooser","colStateKey","loadColumnState","parsed","saveColumnState","filtersKey","loadFilters","saveFilters","baseColumns","toggleColumn","visible","visibleColumns","colAlignClass","cardColumns","defaultActions","actions","effectiveRowActions","hasActions","handleRowAction","action","deleteTarget","deleteDialogVisible","deleting","onConfirmDelete","isActionVisible","isActionDisabled","allKpis","kpis","canCreate","selectedRow","isMultiSelect","isCellEdit","formFieldMap","INLINE_TYPES","inlineField","onCellEditComplete","filterableColumns","booleanFilterOptions","fParam","filterTimers","onTextFilter","param","cm","selectRow","onRowContextMenu","onCardContextMenu","contextMenuItems","items","doExportCsv","railPrint","exporting","kpi","_f","_g","_h","_i","ba","_hoisted_19","Checkbox","_hoisted_21","slotProps","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_30","ci","_hoisted_31","_hoisted_32","_hoisted_33","Paginator","_hoisted_34","_hoisted_35","_hoisted_36","ContextMenu","scope","$slots","expanded","isExpanded","toggleRow","next","unwrapOptions","column","columnAlign","isNumericColumn","columnClass","columnStyle","isCellDisabled","toNumber","displayValue","setCell","removeRow","rowKeyOf","hasFooter","footerValue","total","sum","footerLabelField","columnCount","onUpdate","files","open","onChange","picked","valid","removeAt","fmtSize","bytes","TREE_GROUP_PREFIX","TREE_LEAF_PREFIX","normalizeTerm","buildTree","groupBy","groupLabel","roots","groups","leaf","rawGroup","chave","collectLeafValues","node","allLeafValues","nodes","indexByKey","visit","deriveSelectionKeys","selected","checked","todas","alguma","child","estado","filterTree","extraFields","children","toggleIds","ids","check","alvo","existente","expandedKeys","fullTree","fullIndex","isFiltering","visibleTree","selectionKeys","totalLeaves","selectedCount","validos","showHeader","isEmpty","emptyText","expandFrom","jaAbertos","valor","onNodeToggle","completo","selectAll","clearAll","Tree","defaultMap","statusInfo","routerKey","useRouter","router","goBack","WStatusTag","formatValue","Skeleton","gridClass","WKpiCard","currentIndex","step","stepState","W_STEP_FLOW_KEY","active","disabled","orientation","provide","root","passo","triggers","atual","flow","localOpen","isDisabled","horizontal","hasLine","done","okCount","countLabel","ICONS","iconOf","nivel","isOverlay","collapsed","setCollapsed","toggleCollapsed","collapseTitle","isSelected","clear","selectedFeatures","selectedArea","countText","normalize","visibleFeatures","needle","areaText","feature","areaTotalText","container","footer","mapError","leaflet","observer","footerObserver","layers","styleFor","tooltipText","area","drawFeatures","layer","syncStyles","fitToScope","on","element","corners","bounds","refreshSize","measureFooter","setupMap","mod","readonly","ALERTS","ALERT_ALIASES","normalizar","nome","resolverAlerta","escapar","MdIt","abrirAlerta","spec","titulo","texto","FECHAR_ALERTA","CARREGADORES","APELIDOS_LINGUAGEM","realce","carregando","realceDisponivel","carregarRealce","nucleo","carregar","modulo","codigo","linguagem","normalizarLinguagem","info","bruta","slug","NOMES_CONTAINER","CONTAINER_RE","criarRenderer","md","abbr","deflist","footnote","ins","mark","sup","anchor","aplicarAlertas","aplicarContainers","aplicarTarefas","aplicarCodigo","aplicarTabelas","aplicarLinks","aplicarFiguras","state","tokens","abre","paragrafo","inline","marcador","fecha","encontrarFechamento","meta","inicio","profundidade","token","pilha","partes","primeiro","marcado","checkbox","primeira","realcado","original","env","self","href","filhos","filho","html","legenda","instancia","obterRenderer","textoDoTitulo","coletarTitulos","titulos","sanitizarMarkdown","DOMPurify","renderMarkdown","source","aplicarCopiar","raiz","bloco","botao","agruparAbasSoltas","soltos","painel","sequencia","proximo","grupo","aplicarAbas","indiceGrupo","paineis","barra","botoes","indice","selecionar","ativo","selecionado","mermaidPromise","carregarMermaid","TAGS_PROIBIDAS","limparNo","elemento","atributo","ehLink","sanitizarSvg","svg","documento","estilo","padrao","configurarMermaid","mermaid","superficie","primaria","suave","borda","renderizarDiagramas","forcar","alvos","figura","fonte","limpo","caixa","enhanceMarkdown","realcePronto","resultado","observador","observarTema","textareaRef","previewing","isSplit","showTextarea","showPreview","apply","selectionStart","selectionEnd","surround","before","after","placeholder","start","end","prefixLines","prefix","lineStart","lineEndRaw","lineEnd","prefixed","line","actionBold","actionItalic","actionHeading","actionList","actionTaskList","actionLink","urlStart","actionCode","inserirBloco","modelo","exemplo","corpo","antes","respiro","posicao","actionAlert","actionSteps","actionTable","actionHighlight","togglePreview","ajudaAberta","ajuda","tools","tool","linha","WMarkdownView","termo","aberto","grupos","saida","visiveis","busca","filtrando","expandido","alternar","observar","entradas","visivel","entrada","ir","_withModifiers","registrar","navegar","salto","dropTarget","listRefs","setListRef","fallbackLabel","isDraggable","isDragging","computeIndex","colValue","list","cards","rect","onDragStart","onDragOver","onDragLeave","related","onDrop","drag","clearDrag","rawIndex","oldIndex","onDragEnd","onCardClick","showIndicatorAt","_withKeys"],"mappings":"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","x_google_ignoreList":[1,2,22,23]}
1
+ {"version":3,"file":"WKanbanBoard.vue_vue_type_script_setup_true_lang-BsT2oBqn.cjs","sources":["../src/components/crud/WCrudColumnRenderer.vue","../node_modules/maska/dist/maska.mjs","../node_modules/maska/dist/vue.mjs","../src/utils/fieldMapper.ts","../src/components/form/WAutoCompleteFK.vue","../src/components/form/WDatePicker.vue","../src/components/form/WMoneyInput.vue","../src/components/form/WImageCropper.vue","../src/components/form/WTransferList.vue","../src/utils/cep.ts","../src/components/form/WFormRenderer.vue","../src/components/crud/WCrudFormDialog.vue","../src/utils/csv.ts","../src/components/crud/WCrudView.vue","../src/components/crud/WEditableTable.vue","../src/components/form/WDateRange.vue","../src/components/form/WFileUpload.vue","../src/utils/treeSelect.ts","../src/components/form/WTreeSelect.vue","../src/components/ui/WStatusTag.vue","../src/components/ui/WPageHeader.vue","../src/components/ui/WEmptyState.vue","../node_modules/vue-router/dist/devtools-EWN81iOl.mjs","../node_modules/vue-router/dist/vue-router.mjs","../src/components/ui/WDetailHeader.vue","../src/components/ui/WInfoCard.vue","../src/components/ui/WKpiCard.vue","../src/components/ui/WKpiGrid.vue","../src/components/ui/WSectionHeader.vue","../src/components/ui/WFormSection.vue","../src/components/ui/WActionBar.vue","../src/components/ui/WProgressFlow.vue","../src/utils/stepFlow.ts","../src/components/ui/WStepFlow.vue","../src/components/ui/WStepSection.vue","../src/components/ui/WCheckList.vue","../src/components/ui/WMapSelect.vue","../src/utils/markdown.ts","../src/utils/markdownEnhance.ts","../src/components/ui/WMarkdownView.vue","../src/components/form/WMarkdownEditor.vue","../src/components/ui/WMarkdownToc.vue","../src/components/ui/WTabBar.vue","../src/components/ui/WKanbanBoard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport Tag from 'primevue/tag'\nimport type { ColumnDef } from '@/types/column'\nimport { useFormatters } from '@/composables/useFormatters'\n\ndefineProps<{\n column: ColumnDef\n value: unknown\n rowData: Record<string, unknown>\n}>()\n\nconst { formatDate, formatDateTime, formatCurrency, formatNumber } = useFormatters()\n</script>\n\n<template>\n <span v-if=\"value == null\" class=\"text-muted-color text-xs\">&mdash;</span>\n\n <template v-else-if=\"column.type === 'image'\">\n <img\n :src=\"String(value)\"\n :alt=\"column.header\"\n class=\"size-9 rounded-lg object-cover ring-1 ring-surface-200 dark:ring-surface-700\"\n />\n </template>\n\n <template v-else-if=\"column.type === 'boolean'\">\n <Tag\n :value=\"column.tagValue ? column.tagValue(value, rowData) : value ? 'Ativo' : 'Inativo'\"\n :severity=\"\n (column.tagSeverity\n ? column.tagSeverity(value, rowData)\n : value\n ? 'success'\n : 'danger') as any\n \"\n class=\"text-xs\"\n />\n </template>\n\n <span v-else-if=\"column.type === 'date'\" class=\"text-muted-color tabular-nums text-[0.8125rem]\">\n {{ formatDate(value as string) }}\n </span>\n\n <span\n v-else-if=\"column.type === 'datetime'\"\n class=\"text-muted-color tabular-nums text-[0.8125rem]\"\n >\n {{ formatDateTime(value as string) }}\n </span>\n\n <span v-else-if=\"column.type === 'currency'\" class=\"font-semibold tabular-nums text-[0.8125rem]\">\n {{ formatCurrency(value as number) }}\n </span>\n\n <span v-else-if=\"column.type === 'number'\" class=\"font-semibold tabular-nums text-[0.8125rem]\">\n {{\n column.format\n ? column.format(value, rowData)\n : formatNumber(value as number, column.decimals ?? 0)\n }}\n </span>\n\n <span v-else class=\"text-[0.8125rem]\">\n {{ column.format ? column.format(value, rowData) : value }}\n </span>\n</template>\n","var S = Object.defineProperty;\nvar x = (n, t, e) => t in n ? S(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e;\nvar A = (n, t, e) => x(n, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst R = {\n \"#\": { pattern: /[0-9]/ },\n \"@\": { pattern: /[a-zA-Z]/ },\n \"*\": { pattern: /[a-zA-Z0-9]/ }\n}, N = (n, t, e) => n.replaceAll(t, \"\").replace(e, \".\").replace(\"..\", \".\").replace(/[^.\\d]/g, \"\"), w = (n, t, e) => {\n var s;\n return new Intl.NumberFormat(((s = e.number) == null ? void 0 : s.locale) ?? \"en\", {\n minimumFractionDigits: n,\n maximumFractionDigits: t,\n roundingMode: \"trunc\"\n });\n}, P = (n, t = !0, e) => {\n var k, g, b, d;\n const s = ((k = e.number) == null ? void 0 : k.unsigned) !== !0 && n.startsWith(\"-\") ? \"-\" : \"\", r = ((g = e.number) == null ? void 0 : g.fraction) ?? 0;\n let a = w(0, r, e);\n const u = a.formatToParts(1000.12), p = ((b = u.find((o) => o.type === \"group\")) == null ? void 0 : b.value) ?? \" \", f = ((d = u.find((o) => o.type === \"decimal\")) == null ? void 0 : d.value) ?? \".\", i = N(n, p, f);\n if (Number.isNaN(parseFloat(i))) return s;\n const h = i.split(\".\");\n if (h[1] != null && h[1].length >= 1) {\n const o = h[1].length <= r ? h[1].length : r;\n a = w(o, r, e);\n }\n let l = a.format(parseFloat(i));\n return t ? r > 0 && i.endsWith(\".\") && !i.slice(0, -1).includes(\".\") && (l += f) : l = N(l, p, f), s + l;\n}, C = (n) => JSON.parse(n.replaceAll(\"'\", '\"')), F = (n, t = {}) => {\n const e = { ...t };\n n.dataset.maska != null && n.dataset.maska !== \"\" && (e.mask = T(n.dataset.maska)), n.dataset.maskaEager != null && (e.eager = E(n.dataset.maskaEager)), n.dataset.maskaReversed != null && (e.reversed = E(n.dataset.maskaReversed)), n.dataset.maskaTokensReplace != null && (e.tokensReplace = E(n.dataset.maskaTokensReplace)), n.dataset.maskaTokens != null && (e.tokens = W(n.dataset.maskaTokens));\n const s = {};\n return n.dataset.maskaNumberLocale != null && (s.locale = n.dataset.maskaNumberLocale), n.dataset.maskaNumberFraction != null && (s.fraction = parseInt(n.dataset.maskaNumberFraction)), n.dataset.maskaNumberUnsigned != null && (s.unsigned = E(n.dataset.maskaNumberUnsigned)), (n.dataset.maskaNumber != null || Object.values(s).length > 0) && (e.number = s), e;\n}, E = (n) => n !== \"\" ? !!JSON.parse(n) : !0, T = (n) => n.startsWith(\"[\") && n.endsWith(\"]\") ? C(n) : n, W = (n) => {\n if (n.startsWith(\"{\") && n.endsWith(\"}\"))\n return C(n);\n const t = {};\n return n.split(\"|\").forEach((e) => {\n const s = e.split(\":\");\n t[s[0]] = {\n pattern: I() ? new RegExp(s[1], \"u\") : new RegExp(s[1]),\n optional: s[2] === \"optional\",\n multiple: s[2] === \"multiple\",\n repeated: s[2] === \"repeated\"\n };\n }), t;\n}, I = () => {\n try {\n return new RegExp(\"\\\\p{L}\", \"u\"), !0;\n } catch {\n return !1;\n }\n};\nclass O {\n constructor(t = {}) {\n A(this, \"opts\", {});\n A(this, \"memo\", /* @__PURE__ */ new Map());\n const e = { ...t };\n if (e.tokens != null) {\n e.tokens = e.tokensReplace ? { ...e.tokens } : { ...R, ...e.tokens };\n for (const s of Object.values(e.tokens))\n typeof s.pattern == \"string\" && (s.pattern = I() ? new RegExp(s.pattern, \"u\") : new RegExp(s.pattern));\n } else\n e.tokens = R;\n Array.isArray(e.mask) && (e.mask.length > 1 ? e.mask = [...e.mask].sort((s, r) => s.length - r.length) : e.mask = e.mask[0] ?? \"\"), e.mask === \"\" && (e.mask = null), this.opts = e;\n }\n masked(t) {\n return this.process(String(t), this.findMask(String(t)));\n }\n unmasked(t) {\n return this.process(String(t), this.findMask(String(t)), !1);\n }\n isEager() {\n return this.opts.eager === !0;\n }\n isReversed() {\n return this.opts.reversed === !0;\n }\n completed(t) {\n const e = this.findMask(String(t));\n if (this.opts.mask == null || e == null) return !1;\n const s = this.process(String(t), e).length;\n return typeof this.opts.mask == \"string\" ? s >= this.opts.mask.length : s >= e.length;\n }\n findMask(t) {\n const e = this.opts.mask;\n if (e == null)\n return null;\n if (typeof e == \"string\")\n return e;\n if (typeof e == \"function\")\n return e(t);\n const s = this.process(t, e.slice(-1).pop() ?? \"\", !1);\n return e.find((r) => this.process(t, r, !1).length >= s.length) ?? \"\";\n }\n escapeMask(t) {\n const e = [], s = [];\n return t.split(\"\").forEach((r, a) => {\n r === \"!\" && t[a - 1] !== \"!\" ? s.push(a - s.length) : e.push(r);\n }), { mask: e.join(\"\"), escaped: s };\n }\n process(t, e, s = !0) {\n if (this.opts.number != null) return P(t, s, this.opts);\n if (e == null) return t;\n const r = `v=${t},mr=${e},m=${s ? 1 : 0}`;\n if (this.memo.has(r)) return this.memo.get(r);\n const { mask: a, escaped: u } = this.escapeMask(e), p = [], f = this.opts.tokens != null ? this.opts.tokens : {}, i = this.isReversed() ? -1 : 1, h = this.isReversed() ? \"unshift\" : \"push\", l = this.isReversed() ? 0 : a.length - 1, k = this.isReversed() ? () => o > -1 && c > -1 : () => o < a.length && c < t.length, g = (v) => !this.isReversed() && v <= l || this.isReversed() && v >= l;\n let b, d = -1, o = this.isReversed() ? a.length - 1 : 0, c = this.isReversed() ? t.length - 1 : 0, M = !1;\n for (; k(); ) {\n const v = a.charAt(o), m = f[v], y = (m == null ? void 0 : m.transform) != null ? m.transform(t.charAt(c)) : t.charAt(c);\n if (!u.includes(o) && m != null ? (y.match(m.pattern) != null ? (p[h](y), m.repeated ? (d === -1 ? d = o : o === l && o !== d && (o = d - i), l === d && (o -= i)) : m.multiple && (M = !0, o -= i), o += i) : m.multiple ? M && (o += i, c -= i, M = !1) : y === b ? b = void 0 : m.optional && (o += i, c -= i), c += i) : (s && !this.isEager() && p[h](v), y === v && !this.isEager() ? c += i : b = v, this.isEager() || (o += i)), this.isEager())\n for (; g(o) && (f[a.charAt(o)] == null || u.includes(o)); ) {\n if (s) {\n if (p[h](a.charAt(o)), t.charAt(c) === a.charAt(o)) {\n o += i, c += i;\n continue;\n }\n } else a.charAt(o) === t.charAt(c) && (c += i);\n o += i;\n }\n }\n return this.memo.set(r, p.join(\"\")), this.memo.get(r);\n }\n}\nclass V {\n constructor(t, e = {}) {\n A(this, \"items\", /* @__PURE__ */ new Map());\n A(this, \"eventAbortController\");\n A(this, \"onInput\", (t) => {\n if (t instanceof CustomEvent && t.type === \"input\" && !t.isTrusted && !t.bubbles)\n return;\n const e = t.target, s = this.items.get(e);\n if (s === void 0) return;\n const r = \"inputType\" in t && t.inputType.startsWith(\"delete\"), a = s.isEager(), u = r && a && s.unmasked(e.value) === \"\" ? \"\" : e.value;\n this.fixCursor(e, r, () => this.setValue(e, u));\n });\n this.options = e, this.eventAbortController = new AbortController(), this.init(this.getInputs(t));\n }\n update(t = {}) {\n this.options = { ...t }, this.init(Array.from(this.items.keys()));\n }\n updateValue(t) {\n var e;\n t.value !== \"\" && t.value !== ((e = this.processInput(t)) == null ? void 0 : e.masked) && this.setValue(t, t.value);\n }\n destroy() {\n this.eventAbortController.abort(), this.items.clear();\n }\n init(t) {\n const e = this.getOptions(this.options);\n for (const s of t) {\n if (!this.items.has(s)) {\n const { signal: a } = this.eventAbortController;\n s.addEventListener(\"input\", this.onInput, { capture: !0, signal: a });\n }\n const r = new O(F(s, e));\n this.items.set(s, r), queueMicrotask(() => this.updateValue(s)), s.selectionStart === null && r.isEager() && console.warn(\"Maska: input of `%s` type is not supported\", s.type);\n }\n }\n getInputs(t) {\n return typeof t == \"string\" ? Array.from(document.querySelectorAll(t)) : \"length\" in t ? Array.from(t) : [t];\n }\n getOptions(t) {\n const { onMaska: e, preProcess: s, postProcess: r, ...a } = t;\n return a;\n }\n fixCursor(t, e, s) {\n var k, g;\n const r = t.selectionStart, a = t.value;\n if (s(), r === null || r === a.length && !e) return;\n const u = t.value, p = a.slice(0, r), f = u.slice(0, r), i = (k = this.processInput(t, p)) == null ? void 0 : k.unmasked, h = (g = this.processInput(t, f)) == null ? void 0 : g.unmasked;\n if (i === void 0 || h === void 0) return;\n let l = r;\n p !== f && (l += e ? u.length - a.length : i.length - h.length), t.setSelectionRange(l, l);\n }\n setValue(t, e) {\n const s = this.processInput(t, e);\n s !== void 0 && (t.value = s.masked, this.options.onMaska != null && (Array.isArray(this.options.onMaska) ? this.options.onMaska.forEach((r) => r(s)) : this.options.onMaska(s)), t.dispatchEvent(new CustomEvent(\"maska\", { detail: s })), t.dispatchEvent(new CustomEvent(\"input\", { detail: s.masked })));\n }\n processInput(t, e) {\n const s = this.items.get(t);\n if (s === void 0) return;\n let r = e ?? t.value;\n this.options.preProcess != null && (r = this.options.preProcess(r));\n let a = s.masked(r);\n return this.options.postProcess != null && (a = this.options.postProcess(a)), {\n masked: a,\n unmasked: s.unmasked(r),\n completed: s.completed(r)\n };\n }\n}\nexport {\n O as Mask,\n V as MaskInput,\n R as tokens\n};\n","import { MaskInput as n } from \"./maska.mjs\";\nconst l = /* @__PURE__ */ new WeakMap(), c = (e, s) => {\n if (e.arg == null || e.instance == null) return;\n const a = \"setup\" in e.instance.$.type;\n e.arg in e.instance ? e.instance[e.arg] = s : a && console.warn(\"Maska: please expose `%s` using defineExpose\", e.arg);\n}, k = (e, s) => {\n var u;\n const a = e instanceof HTMLInputElement ? e : e.querySelector(\"input\");\n if (a == null || (a == null ? void 0 : a.type) === \"file\") return;\n let t = {};\n if (s.value != null && (t = typeof s.value == \"string\" ? { mask: s.value } : { ...s.value }), s.arg != null) {\n const o = (r) => {\n const p = s.modifiers.unmasked ? r.unmasked : s.modifiers.completed ? r.completed : r.masked;\n c(s, p);\n };\n t.onMaska = t.onMaska == null ? o : Array.isArray(t.onMaska) ? [...t.onMaska, o] : [t.onMaska, o];\n }\n l.has(a) ? (u = l.get(a)) == null || u.update(t) : l.set(a, new n(a, t));\n};\nexport {\n k as vMaska\n};\n","import type { FieldDef, SelectOption } from '@/types/field'\nimport type { ColumnDef } from '@/types/column'\n\nexport interface ApiFieldMeta {\n name: string\n label: string\n type: string\n required?: boolean\n max_length?: number\n choices?: { value: string; label: string }[]\n read_only?: boolean\n endpoint?: string\n option_label?: string\n option_value?: string\n}\n\nconst TYPE_MAP: Record<string, FieldDef['type']> = {\n string: 'text',\n integer: 'number',\n decimal: 'number',\n float: 'number',\n boolean: 'switch',\n choice: 'select',\n fk: 'fk',\n date: 'date',\n datetime: 'datetime',\n email: 'email',\n url: 'text',\n slug: 'text',\n text: 'textarea',\n}\n\nexport function mapApiFieldToFieldDef(apiField: ApiFieldMeta): FieldDef {\n const fieldType = TYPE_MAP[apiField.type] ?? 'text'\n\n const def: FieldDef = {\n field: apiField.name,\n label: apiField.label,\n type: fieldType,\n required: apiField.required ?? false,\n }\n\n if (apiField.type === 'decimal' || apiField.type === 'float') {\n def.minFractionDigits = 2\n def.maxFractionDigits = 2\n }\n\n if (apiField.type === 'boolean') {\n def.defaultValue = false\n }\n\n if (apiField.type === 'choice' && apiField.choices?.length) {\n def.options = apiField.choices.map((c) => ({\n label: c.label,\n value: c.value,\n })) as SelectOption[]\n }\n\n if (apiField.type === 'fk') {\n def.endpoint = apiField.endpoint\n if (apiField.option_label) def.optionLabel = apiField.option_label\n if (apiField.option_value) def.optionValue = apiField.option_value\n }\n\n return def\n}\n\nexport function mapApiFieldsToFieldDefs(apiFields: ApiFieldMeta[]): FieldDef[] {\n return apiFields.filter((f) => !f.read_only && f.name !== 'id').map(mapApiFieldToFieldDef)\n}\n\nconst COLUMN_TYPE_MAP: Record<string, ColumnDef['type']> = {\n boolean: 'boolean',\n date: 'date',\n datetime: 'datetime',\n decimal: 'number',\n float: 'number',\n integer: 'number',\n}\n\nexport function mapApiFieldToColumnDef(apiField: ApiFieldMeta): ColumnDef {\n // Para FK, exibe o campo _nome (ex: marca → marca_nome)\n const field = apiField.type === 'fk' ? `${apiField.name}_nome` : apiField.name\n return {\n field,\n header: apiField.label,\n type: COLUMN_TYPE_MAP[apiField.type],\n sortable: true,\n }\n}\n\nexport function mapApiFieldsToColumnDefs(apiFields: ApiFieldMeta[], maxColumns = 6): ColumnDef[] {\n return apiFields\n .filter((f) => !f.read_only && f.name !== 'id')\n .slice(0, maxColumns)\n .map(mapApiFieldToColumnDef)\n}\n","<script setup lang=\"ts\">\nimport { ref, watch, computed, inject, reactive, nextTick, onMounted } from 'vue'\nimport AutoComplete from 'primevue/autocomplete'\nimport Chip from 'primevue/chip'\nimport Dialog from 'primevue/dialog'\nimport DataTable from 'primevue/datatable'\nimport Column from 'primevue/column'\nimport Button from 'primevue/button'\nimport InputText from 'primevue/inputtext'\nimport IconField from 'primevue/iconfield'\nimport InputIcon from 'primevue/inputicon'\nimport { W_DATA_PROVIDER_KEY } from '@/types/plugin'\nimport type { DataProvider } from '@/types/dataProvider'\nimport type { FieldDef, FieldSubRowsFetch } from '@/types/field'\nimport type { ColumnDef } from '@/types/column'\nimport type { ApiFieldMeta } from '@/utils/fieldMapper'\nimport { mapApiFieldsToFieldDefs, mapApiFieldsToColumnDefs } from '@/utils/fieldMapper'\nimport { useAppToast } from '@/composables/useAppToast'\nimport { useAppConfirm } from '@/composables/useAppConfirm'\nimport { extractApiError } from '@/composables/useApiError'\nimport WCrudFormDialog from '@/components/crud/WCrudFormDialog.vue'\nimport WCrudColumnRenderer from '@/components/crud/WCrudColumnRenderer.vue'\n\ninterface ColumnMeta {\n field: string\n header: string\n}\n\n/** Filtro em cascata já resolvido (nome do parâmetro + valor atual). */\ninterface DrilldownFilter {\n field: string\n value: unknown\n required?: boolean\n}\n\n/** Valor aceito no `v-model`: id, objeto ou — em `multiple` — lista de ids/objetos. */\ntype FKValue = string | number | Record<string, unknown>\n\nconst props = withDefaults(\n defineProps<{\n modelValue: FKValue | FKValue[] | null\n endpoint: string\n endpointParams?: Record<string, string | number | boolean>\n /** Filtro(s) em cascata resolvido(s): aplicado(s) como parâmetro na busca. Com\n * `required` (default true), a busca só ocorre quando o valor estiver preenchido. */\n drilldown?: DrilldownFilter | DrilldownFilter[]\n /** Seleção múltipla: o campo vira chips e o `v-model` passa a ser uma lista\n * de objetos. O modal de pesquisa ganha caixas de marcação. */\n multiple?: boolean\n /** Em `multiple`, quantos chips mostrar antes de resumir o resto em `+N`\n * (0 = mostrar todos). Útil em campo estreito, tipo filtro de painel. */\n maxChips?: number\n optionLabel?: string\n /** Chave de uma segunda linha, em texto de apoio, dentro de cada sugestão — para\n * o dado que **decide** a escolha aparecer antes dela (ex.: saldo em estoque).\n * Vazia ou ausente na linha, a sugestão volta a ter uma linha só. */\n optionDescription?: string\n optionValue?: string\n placeholder?: string\n /** Placeholder exibido enquanto uma cascata obrigatória não estiver preenchida. */\n blockedPlaceholder?: string\n disabled?: boolean\n showClear?: boolean\n forceSelection?: boolean\n columns?: ColumnMeta[]\n minLength?: number\n dialogHeader?: string\n // CRUD no modal\n canCreate?: boolean\n canEdit?: boolean\n canDelete?: boolean\n crudFields?: FieldDef[]\n crudColumns?: ColumnDef[]\n /** Sub-linhas do grid do modal: recebe as linhas da página e devolve o mapa\n * `id → sub-linhas` + as colunas (dinâmicas) do mini-grid. Linha com entrada\n * no mapa abre expandida — ex.: lote (linha) com suas análises (sub-linhas). */\n subRows?: FieldSubRowsFetch\n dialogWidth?: string\n /** Foca o campo ao montar. Marca o input com o atributo nativo `autofocus`\n * para que o `focus()` do PrimeVue Dialog (em onAfterEnter) o encontre e\n * não roube o foco para o botão de fechar. */\n autofocus?: boolean\n }>(),\n {\n multiple: false,\n maxChips: 0,\n optionLabel: 'nome',\n optionValue: 'id',\n placeholder: 'Buscar...',\n disabled: false,\n showClear: true,\n forceSelection: true,\n minLength: 0,\n canCreate: undefined,\n canEdit: undefined,\n canDelete: undefined,\n dialogWidth: '480px',\n autofocus: false,\n },\n)\n\nconst emit = defineEmits<{\n /** Objeto selecionado — ou a lista de objetos quando `multiple`. */\n 'update:modelValue': [value: Record<string, unknown> | Record<string, unknown>[] | null]\n}>()\n\n// O template tem múltiplos nós raiz (o campo + os overlays Dialog/WCrudFormDialog).\n// Sem isto, `class`/`id`/`style` do consumidor não têm onde herdar e o Vue emite\n// warning de \"extraneous non-props attributes\". Aplicamos os attrs no nó visível.\ndefineOptions({ inheritAttrs: false })\n\nconst dataProvider = inject<DataProvider>(W_DATA_PROVIDER_KEY)\nif (!dataProvider) {\n throw new Error('[wPrimeVueComponents] dataProvider não encontrado. Registre o WPrimeVuePlugin.')\n}\nconst provider = dataProvider\n\nconst toast = useAppToast()\nconst { confirmDelete: confirmDeleteDialog } = useAppConfirm()\n\n// ---------------------------------------------------------------------------\n// Inline autocomplete\n// ---------------------------------------------------------------------------\n\nconst selectedItem = ref<Record<string, unknown> | null>(null)\n/** Seleção quando `multiple` — o campo mostra um chip por item. */\nconst selectedItems = ref<Record<string, unknown>[]>([])\nconst suggestions = ref<Record<string, unknown>[]>([])\nconst searching = ref(false)\n\n/** Valor entregue ao AutoComplete: objeto (single) ou lista (multiple). */\nconst acModel = computed(() => (props.multiple ? selectedItems.value : selectedItem.value))\n\n/** Identificador escalar de um valor do v-model (id cru ou objeto já resolvido). */\nfunction keyOf(v: unknown): unknown {\n if (v && typeof v === 'object') return (v as Record<string, unknown>)[props.optionValue]\n return v\n}\n\nfunction dedupeByKey(itens: Record<string, unknown>[]): Record<string, unknown>[] {\n const vistos = new Set<unknown>()\n const out: Record<string, unknown>[] = []\n for (const item of itens) {\n const k = keyOf(item)\n if (vistos.has(k)) continue\n vistos.add(k)\n out.push(item)\n }\n return out\n}\n\nfunction emitSelection() {\n emit('update:modelValue', props.multiple ? [...selectedItems.value] : selectedItem.value)\n}\n\nfunction labelOf(item: unknown): string {\n const v = (item as Record<string, unknown>)?.[props.optionLabel]\n return v == null ? '' : String(v)\n}\n\n/** Texto de apoio da sugestão. Vazio quando a linha não trouxe o campo. */\nfunction descriptionOf(item: unknown): string {\n if (!props.optionDescription) return ''\n const v = (item as Record<string, unknown>)?.[props.optionDescription]\n return v == null ? '' : String(v)\n}\n\n/** Quantos chips ficam escondidos atrás do `+N` (0 quando cabem todos). */\nconst chipsOcultos = computed(() =>\n props.maxChips > 0 ? Math.max(0, selectedItems.value.length - props.maxChips) : 0,\n)\n\n/** Nomes resumidos no `+N` — viram tooltip para não esconder informação. */\nconst chipsOcultosLabel = computed(() =>\n selectedItems.value.slice(props.maxChips).map(labelOf).join(', '),\n)\n\n/** O `x` do chip remove só aquele item — sem deixar o clique subir para o chip\n * (que abre a listagem). */\nfunction onChipRemove(event: Event, remove: (event: Event) => void) {\n event?.stopPropagation?.()\n remove(event)\n}\n\n/** Limpar tudo: em `multiple` a lista inteira; no simples, o valor. */\nfunction limparSelecao() {\n if (props.disabled) return\n if (props.multiple) {\n if (!selectedItems.value.length) return\n selectedItems.value = []\n } else {\n if (!selectedItem.value) return\n selectedItem.value = null\n }\n emitSelection()\n}\n\n/** Com `maxChips`, cada chip fica com uma fração da largura do campo — assim\n * eles dividem a linha (em vez de um por linha) e truncam o que não couber.\n * A reserva cobre o chip `+N` e a área de digitação; o piso de 7rem impede\n * chip ilegível em campo estreito (aí eles quebram para a linha de baixo). */\nconst chipStyle = computed(() =>\n props.multiple && props.maxChips > 0\n ? { '--w-fk-chip-max': `max(6rem, calc((100% - 6rem) / ${props.maxChips}))` }\n : undefined,\n)\n\n/** Mostra o \"limpar\" só quando há o que limpar (e o consumidor permite). */\nconst mostrarLimpar = computed(() => {\n if (!props.showClear || props.disabled) return false\n return props.multiple ? selectedItems.value.length > 0 : selectedItem.value !== null\n})\n\nlet debounceTimer: ReturnType<typeof setTimeout> | null = null\n\n// Referência ao AutoComplete para aplicar o autofocus no input nativo.\nconst acRef = ref<{ $el?: HTMLElement } | null>(null)\n\nonMounted(() => {\n if (!props.autofocus) return\n nextTick(() => {\n const input = acRef.value?.$el?.querySelector?.('input') as HTMLInputElement | null\n if (!input) return\n // O atributo nativo faz o Dialog.focus() (onAfterEnter) mirar este input\n // em vez do botão fechar; o focus() cobre o caso fora de Dialog.\n input.setAttribute('autofocus', '')\n input.focus()\n input.select?.()\n })\n})\n\n// ---------------------------------------------------------------------------\n// Filtro em cascata (drill-down)\n// ---------------------------------------------------------------------------\n\nfunction isEmptyValue(v: unknown): boolean {\n return v === null || v === undefined || v === ''\n}\n\n/** Um campo FK guarda o objeto inteiro; extrai o identificador escalar para o filtro. */\nfunction normalizeDrillValue(v: unknown): unknown {\n if (v && typeof v === 'object') {\n const o = v as Record<string, unknown>\n return o.id ?? o.value ?? o\n }\n return v\n}\n\nconst drilldownList = computed<DrilldownFilter[]>(() => {\n const d = props.drilldown\n if (!d) return []\n return Array.isArray(d) ? d : [d]\n})\n\n/** true quando alguma cascata obrigatória ainda não tem valor → não busca. */\nconst blockedByRequired = computed(() =>\n drilldownList.value.some(\n (d) => (d.required ?? true) && isEmptyValue(normalizeDrillValue(d.value)),\n ),\n)\n\n/** Parâmetros de filtro derivados das cascatas com valor preenchido. */\nfunction drilldownParams(): Record<string, unknown> {\n const params: Record<string, unknown> = {}\n for (const d of drilldownList.value) {\n const val = normalizeDrillValue(d.value)\n if (!isEmptyValue(val)) params[d.field] = val\n }\n return params\n}\n\nconst effectivePlaceholder = computed(() =>\n blockedByRequired.value && props.blockedPlaceholder\n ? props.blockedPlaceholder\n : props.placeholder,\n)\n\n/** Em `multiple` o placeholder some quando já há chips — ele descreve o estado\n * \"sem filtro\"; ao lado de uma seleção viraria informação contraditória. */\nconst placeholderVisivel = computed(() =>\n props.multiple && selectedItems.value.length ? undefined : effectivePlaceholder.value,\n)\n\nasync function fetchOne(id: string | number): Promise<Record<string, unknown> | null> {\n try {\n const response = await provider.get(props.endpoint, id)\n return response.data\n } catch {\n return null\n }\n}\n\nasync function fetchById(id: string | number) {\n selectedItem.value = await fetchOne(id)\n}\n\n/** Resolve a lista do v-model: objeto já resolvido passa direto, id vira GET. */\nasync function resolveMany(valores: FKValue[]): Promise<Record<string, unknown>[]> {\n const itens = await Promise.all(\n valores.map(async (v) => {\n if (v && typeof v === 'object') {\n const obj = v as Record<string, unknown>\n if (props.optionLabel in obj) return obj\n const id = obj[props.optionValue]\n return id != null ? await fetchOne(id as string | number) : null\n }\n // Reaproveita o que já está resolvido — evita GET a cada mudança da lista.\n const atual = selectedItems.value.find((i) => i[props.optionValue] === v)\n return atual ?? (await fetchOne(v as string | number))\n }),\n )\n return itens.filter((i): i is Record<string, unknown> => i !== null)\n}\n\nasync function search(query: string) {\n // Cascata obrigatória sem valor → não busca (evita listar tudo).\n if (blockedByRequired.value) {\n suggestions.value = []\n return\n }\n searching.value = true\n try {\n const params: Record<string, unknown> = {\n page_size: 20,\n ...props.endpointParams,\n ...drilldownParams(),\n }\n if (query) params.search = query\n const response = await provider.list(props.endpoint, params)\n suggestions.value = response.data\n } catch {\n suggestions.value = []\n } finally {\n searching.value = false\n }\n}\n\nfunction onSearch(event: { query: string }) {\n const query = event.query || ''\n if (query.length < props.minLength) {\n suggestions.value = []\n return\n }\n if (debounceTimer) clearTimeout(debounceTimer)\n debounceTimer = setTimeout(() => search(query), 300)\n}\n\nfunction onSelect(event: { value: Record<string, unknown> }) {\n // Em `multiple` o AutoComplete já mantém a lista — tratado em `onAcUpdate`.\n if (props.multiple) return\n selectedItem.value = event.value\n emit('update:modelValue', event.value)\n}\n\n/** Em `multiple`, o AutoComplete emite a lista inteira ao marcar/remover chip. */\nfunction onAcUpdate(value: unknown) {\n if (!props.multiple) return\n selectedItems.value = dedupeByKey(\n Array.isArray(value) ? (value as Record<string, unknown>[]) : [],\n )\n emitSelection()\n}\n\nfunction onClear() {\n // Em `multiple`, o AutoComplete emite `clear` também quando só descarta o texto\n // digitado (`forceSelection` sem correspondência) — limpar a lista aqui apagaria\n // a seleção inteira a cada busca sem match. O clear real chega como\n // `update:modelValue` (ícone de limpar), tratado em `onAcUpdate`.\n if (props.multiple) return\n selectedItem.value = null\n emitSelection()\n}\n\n// Resolve initial value\nwatch(\n () => props.modelValue,\n async (newVal) => {\n if (props.multiple) {\n const lista = newVal == null ? [] : Array.isArray(newVal) ? newVal : [newVal]\n const chaves = lista.map(keyOf)\n const atuais = selectedItems.value.map((i) => i[props.optionValue])\n // Mesma lista (na mesma ordem) → nada a resolver; evita loop com o emit.\n if (chaves.length === atuais.length && chaves.every((k, i) => k === atuais[i])) return\n selectedItems.value = await resolveMany(lista)\n return\n }\n if (newVal != null) {\n if (typeof newVal === 'object' && newVal !== null && props.optionLabel in newVal) {\n selectedItem.value = newVal as Record<string, unknown>\n return\n }\n if (!selectedItem.value || selectedItem.value[props.optionValue] !== newVal) {\n await fetchById(newVal as string | number)\n }\n } else {\n selectedItem.value = null\n }\n },\n { immediate: true },\n)\n\n// ---------------------------------------------------------------------------\n// Modal — State\n// ---------------------------------------------------------------------------\n\nconst modalVisible = ref(false)\nconst modalData = ref<Record<string, unknown>[]>([])\nconst modalLoading = ref(false)\nconst modalSearch = ref('')\nconst modalPage = ref(1)\nconst modalPageSize = ref(15)\nconst modalTotalRecords = ref(0)\nconst modalSelection = ref<Record<string, unknown> | Record<string, unknown>[] | null>(null)\n\n/** Itens marcados no modal, normalizados (single ou multiple). */\nconst modalSelecionados = computed<Record<string, unknown>[]>(() => {\n const sel = modalSelection.value\n if (!sel) return []\n return Array.isArray(sel) ? sel : [sel]\n})\nconst modalSortField = ref<string | null>(null)\nconst modalSortOrder = ref<1 | -1 | 0>(0)\nlet modalSearchTimer: ReturnType<typeof setTimeout> | null = null\n\n// --- Sub-linhas (expansão automática por linha com dados) ---\nconst subRowsMap = ref<Record<string, Record<string, unknown>[]>>({})\nconst subRowsColumns = ref<ColumnDef[]>([])\nconst expandedRows = ref<Record<string, boolean>>({})\n\n/** Busca as sub-linhas da página atual e abre as linhas que têm o que mostrar. */\nasync function fetchSubRows() {\n if (!props.subRows) return\n try {\n const { map, columns } = await props.subRows(modalData.value)\n subRowsMap.value = map || {}\n subRowsColumns.value = columns || []\n const abertos: Record<string, boolean> = {}\n for (const row of modalData.value) {\n const id = String(row[props.optionValue])\n if (subRowsMap.value[id]?.length) abertos[id] = true\n }\n expandedRows.value = abertos\n } catch {\n // Sub-linha é enriquecimento: falhou, o grid segue só com as linhas.\n subRowsMap.value = {}\n subRowsColumns.value = []\n expandedRows.value = {}\n }\n}\n\nfunction subRowsDe(row: Record<string, unknown>): Record<string, unknown>[] {\n return subRowsMap.value[String(row[props.optionValue])] || []\n}\n\n// Metadata from extras.fields\nconst apiFields = ref<ApiFieldMeta[]>([])\nconst crudAvailable = computed(() => {\n // Se o usuário forneceu crudFields, CRUD está habilitado\n if (props.crudFields?.length) return true\n // Se a API retornou extras.fields, CRUD está disponível\n return apiFields.value.length > 0\n})\n\n// Respeita props explícitas, senão auto-detecta\nconst showCreate = computed(() => props.canCreate ?? crudAvailable.value)\nconst showEdit = computed(() => props.canEdit ?? crudAvailable.value)\nconst showDelete = computed(() => props.canDelete ?? crudAvailable.value)\nconst hasRowActions = computed(() => showEdit.value || showDelete.value)\n\n// Campos do form — prioridade: props > auto-gerados do extras\nconst formFields = computed<FieldDef[]>(() => {\n if (props.crudFields?.length) return props.crudFields\n return mapApiFieldsToFieldDefs(apiFields.value)\n})\n\n// Colunas do modal — prioridade: crudColumns > props.columns > auto-geradas > fallback\nconst modalColumns = computed<ColumnDef[]>(() => {\n if (props.crudColumns?.length) return props.crudColumns\n if (props.columns?.length) {\n return props.columns.map((c) => ({\n field: c.field,\n header: c.header,\n sortable: true,\n }))\n }\n if (apiFields.value.length) {\n return mapApiFieldsToColumnDefs(apiFields.value)\n }\n return [{ field: props.optionLabel, header: props.optionLabel, sortable: true }]\n})\n\n// ---------------------------------------------------------------------------\n// Modal — Fetch\n// ---------------------------------------------------------------------------\n\nasync function fetchModalData() {\n // Cascata obrigatória sem valor → não lista (o modal mostra estado vazio).\n if (blockedByRequired.value) {\n modalData.value = []\n modalTotalRecords.value = 0\n return\n }\n modalLoading.value = true\n try {\n const params: Record<string, unknown> = {\n page: modalPage.value,\n page_size: modalPageSize.value,\n ...props.endpointParams,\n ...drilldownParams(),\n }\n if (modalSearch.value) params.search = modalSearch.value\n if (modalSortField.value && modalSortOrder.value !== 0) {\n params.ordering =\n modalSortOrder.value === -1 ? `-${modalSortField.value}` : modalSortField.value\n }\n const response = await provider.list(props.endpoint, params)\n modalData.value = response.data\n modalTotalRecords.value = response.rows\n void fetchSubRows()\n\n // Captura metadata de campos na primeira requisição\n if (response.extras?.fields && !props.columns?.length && !props.crudFields?.length) {\n apiFields.value = response.extras.fields as ApiFieldMeta[]\n }\n } catch {\n modalData.value = []\n modalTotalRecords.value = 0\n } finally {\n modalLoading.value = false\n }\n}\n\nfunction onInputKeydown(e: KeyboardEvent) {\n // F2 abre o modal de pesquisa (atalho estilo desktop).\n if (e.key === 'F2' && !props.disabled) {\n e.preventDefault()\n openModal()\n }\n}\n\nfunction openModal() {\n if (props.disabled) return\n modalSearch.value = ''\n modalPage.value = 1\n modalSortField.value = null\n modalSortOrder.value = 0\n // Em `multiple` o modal abre já com o que está selecionado no campo.\n modalSelection.value = props.multiple ? [...selectedItems.value] : null\n modalVisible.value = true\n fetchModalData()\n}\n\nfunction onModalPage(event: { page: number; rows: number }) {\n modalPage.value = event.page + 1\n modalPageSize.value = event.rows\n fetchModalData()\n}\n\nfunction onModalSort(event: { sortField?: string; sortOrder?: 1 | -1 | 0 }) {\n modalSortField.value = (event.sortField as string) ?? null\n modalSortOrder.value = event.sortOrder ?? 0\n modalPage.value = 1\n fetchModalData()\n}\n\nfunction confirmModalSelection() {\n if (props.multiple) {\n selectedItems.value = dedupeByKey(modalSelecionados.value)\n emitSelection()\n modalVisible.value = false\n return\n }\n const sel = modalSelecionados.value[0]\n if (!sel) return\n selectedItem.value = sel\n emit('update:modelValue', sel)\n modalVisible.value = false\n}\n\nfunction onRowDblClick(event: { data: Record<string, unknown> }) {\n // Em `multiple`, o duplo clique acrescenta à marcação e o modal continua\n // aberto — fechar a cada item tornaria a seleção de vários penosa.\n if (props.multiple) {\n modalSelection.value = dedupeByKey([...modalSelecionados.value, event.data])\n return\n }\n selectedItem.value = event.data\n emit('update:modelValue', event.data)\n modalVisible.value = false\n}\n\n// --- Modal: teclado (foco → pesquisa → grid) ---\nconst modalSearchInput = ref<{ $el?: HTMLElement } | null>(null)\nconst modalTableWrap = ref<HTMLElement | null>(null)\nlet lastSearched = ''\n\nfunction onModalShow() {\n lastSearched = ''\n nextTick(() => {\n const el = modalSearchInput.value?.$el as HTMLInputElement | undefined\n el?.focus?.()\n el?.select?.()\n })\n}\n\nfunction focusModalGrid() {\n nextTick(() => {\n const row = modalTableWrap.value?.querySelector<HTMLElement>('.p-datatable-tbody > tr')\n row?.focus()\n })\n}\n\nfunction onModalSearchKeydown(e: KeyboardEvent) {\n if (e.key !== 'Enter' || e.isComposing) return\n e.preventDefault()\n const q = modalSearch.value.trim()\n // Vazio ou já pesquisado → move o foco para o grid.\n if (q === '' || q === lastSearched) {\n focusModalGrid()\n return\n }\n // Texto novo → pesquisa imediata (cancela o debounce); o próximo Enter vai ao grid.\n if (modalSearchTimer) clearTimeout(modalSearchTimer)\n lastSearched = q\n modalPage.value = 1\n fetchModalData()\n}\n\nfunction onModalGridKeydown(e: KeyboardEvent) {\n // Enter no grid = confirmar a seleção (marcada com Espaço). Interceptado (capture)\n // antes do handler nativo do DataTable para não apenas alternar a marca.\n if (e.key === 'Enter') {\n e.preventDefault()\n e.stopPropagation()\n // Em `multiple` o Enter confirma a marcação atual, inclusive vazia (= limpar).\n if (props.multiple || modalSelecionados.value.length) confirmModalSelection()\n }\n // Espaço e setas: tratados nativamente pelo DataTable (marca/navega).\n}\n\nwatch(modalSearch, () => {\n if (modalSearchTimer) clearTimeout(modalSearchTimer)\n modalSearchTimer = setTimeout(() => {\n modalPage.value = 1\n lastSearched = modalSearch.value.trim()\n fetchModalData()\n }, 300)\n})\n\n// Reage à mudança das cascatas: rebusca (se o modal estiver aberto) e limpa a\n// seleção que ficou obsoleta ao trocar a origem — sem apagar na carga inicial.\nwatch(\n () => drilldownList.value.map((d) => normalizeDrillValue(d.value)),\n (novos, antigos) => {\n if (modalVisible.value) {\n modalPage.value = 1\n fetchModalData()\n }\n if (!antigos) return\n const mudou = novos.some((v, i) => v !== antigos[i])\n const tinhaValorAntes = antigos.some((v) => !isEmptyValue(v))\n if (!mudou || !tinhaValorAntes) return\n if (props.multiple) {\n if (!selectedItems.value.length) return\n selectedItems.value = []\n emitSelection()\n return\n }\n if (selectedItem.value) {\n selectedItem.value = null\n emit('update:modelValue', null)\n }\n },\n)\n\n// ---------------------------------------------------------------------------\n// Modal — CRUD\n// ---------------------------------------------------------------------------\n\nconst formDialogVisible = ref(false)\nconst formSaving = ref(false)\nconst editingItem = ref<Record<string, unknown> | null>(null)\nconst formData = reactive<Record<string, unknown>>({})\n\nconst isEditing = computed(() => editingItem.value !== null)\nconst formDialogTitle = computed(() => (isEditing.value ? 'Editar Registro' : 'Novo Registro'))\n\nfunction getDefaults(): Record<string, unknown> {\n const defaults: Record<string, unknown> = {}\n for (const f of formFields.value) {\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\nfunction resetForm() {\n const defs = getDefaults()\n for (const key of Object.keys(formData)) {\n delete formData[key]\n }\n for (const [key, val] of Object.entries(defs)) {\n formData[key] = val\n }\n}\n\nfunction openCreateForm() {\n editingItem.value = null\n resetForm()\n formDialogVisible.value = true\n}\n\nfunction openEditForm(item: Record<string, unknown>) {\n editingItem.value = item\n for (const f of formFields.value) {\n formData[f.field] = item[f.field] !== undefined ? item[f.field] : null\n }\n formDialogVisible.value = true\n}\n\nfunction setFormField(field: string, value: unknown) {\n formData[field] = value\n}\n\nasync function saveForm() {\n formSaving.value = true\n try {\n const payload = { ...formData }\n\n // FK — extrair ID de objetos selecionados\n for (const f of formFields.value) {\n const val = payload[f.field]\n if (f.type === 'fk' && val !== null && typeof val === 'object') {\n const key = f.optionValue || 'id'\n payload[f.field] = (val as Record<string, unknown>)[key] ?? val\n }\n }\n\n let response\n\n if (isEditing.value && editingItem.value) {\n const pk = editingItem.value[props.optionValue]\n response = await provider.update(props.endpoint, pk as string | number, payload)\n // Atualiza na lista do modal\n const idx = modalData.value.findIndex((i) => i[props.optionValue] === pk)\n if (idx !== -1) {\n modalData.value[idx] = response.data\n }\n toast.success('Registro atualizado com sucesso')\n } else {\n // Cria herdando o(s) pai(s) da cascata (dependsOn) — ex.: um novo lote nasce\n // no produto selecionado. Sem semear o pai o backend rejeitaria o filho órfão.\n // Só completa chaves ausentes: um campo do form com o mesmo nome prevalece.\n const parent = drilldownParams()\n for (const [key, value] of Object.entries(parent)) {\n const current = payload[key]\n if (current === undefined || current === null || current === '') {\n payload[key] = value\n }\n }\n response = await provider.create(props.endpoint, payload)\n // Adiciona na lista e seleciona automaticamente\n modalData.value.unshift(response.data)\n modalTotalRecords.value++\n toast.success('Registro criado com sucesso')\n }\n\n formDialogVisible.value = false\n editingItem.value = null\n\n // Auto-seleciona o registro criado/editado (em `multiple`, acrescenta)\n modalSelection.value = props.multiple\n ? dedupeByKey([...modalSelecionados.value, response.data])\n : response.data\n } catch (err) {\n toast.error(extractApiError(err, 'Erro ao salvar registro'))\n } finally {\n formSaving.value = false\n }\n}\n\nfunction confirmDelete(item: Record<string, unknown>) {\n confirmDeleteDialog(async () => {\n try {\n const pk = item[props.optionValue]\n await provider.delete(props.endpoint, pk as string | number)\n const idx = modalData.value.findIndex((i) => i[props.optionValue] === pk)\n if (idx !== -1) {\n modalData.value.splice(idx, 1)\n modalTotalRecords.value--\n }\n // Se o item deletado estava selecionado, sai da seleção\n if (props.multiple) {\n if (selectedItems.value.some((i) => i[props.optionValue] === pk)) {\n selectedItems.value = selectedItems.value.filter((i) => i[props.optionValue] !== pk)\n emitSelection()\n }\n modalSelection.value = modalSelecionados.value.filter((i) => i[props.optionValue] !== pk)\n } else {\n if (selectedItem.value && selectedItem.value[props.optionValue] === pk) {\n selectedItem.value = null\n emit('update:modelValue', null)\n }\n if (modalSelecionados.value[0]?.[props.optionValue] === pk) {\n modalSelection.value = null\n }\n }\n toast.success('Registro excluído com sucesso')\n } catch (err) {\n toast.error(extractApiError(err, 'Erro ao excluir registro'))\n }\n })\n}\n</script>\n\n<template>\n <div\n class=\"w-autocompletefk\"\n :class=\"{ 'w-autocompletefk-has-clear': mostrarLimpar }\"\n :style=\"chipStyle\"\n v-bind=\"$attrs\"\n >\n <AutoComplete\n ref=\"acRef\"\n :model-value=\"acModel\"\n :suggestions=\"suggestions\"\n :multiple=\"multiple\"\n :option-label=\"optionLabel\"\n :placeholder=\"placeholderVisivel\"\n :disabled=\"disabled\"\n :force-selection=\"forceSelection\"\n :loading=\"searching\"\n :show-clear=\"false\"\n fluid\n @complete=\"onSearch\"\n @item-select=\"onSelect\"\n @update:model-value=\"onAcUpdate\"\n @clear=\"onClear\"\n @keydown=\"onInputKeydown\"\n >\n <!-- Sugestão em duas linhas quando `optionDescription` aponta para algo\n preenchido. Sem ela o slot não é declarado, e o AutoComplete volta ao\n render padrão de uma linha — nada muda para quem não usa. -->\n <template v-if=\"optionDescription\" #option=\"{ option }\">\n <span class=\"w-fk-option\">\n <span class=\"w-fk-option__label\">{{ labelOf(option) }}</span>\n <span v-if=\"descriptionOf(option)\" class=\"w-fk-option__desc\">\n {{ descriptionOf(option) }}\n </span>\n </span>\n </template>\n\n <!-- Chip clicado abre a listagem já marcada com a seleção atual. Com\n `maxChips`, os excedentes viram um chip `+N` (somem do campo, mas\n continuam no tooltip) — chip nenhum pode esticar a caixa. -->\n <template v-if=\"multiple\" #chip=\"{ value, index, removeCallback }\">\n <Chip\n v-if=\"!maxChips || index < maxChips\"\n v-tooltip.top=\"labelOf(value)\"\n class=\"p-autocomplete-chip w-autocompletefk-chip\"\n :label=\"labelOf(value)\"\n removable\n @click=\"openModal\"\n @remove=\"onChipRemove($event, removeCallback)\"\n />\n <Chip\n v-else-if=\"index === maxChips\"\n v-tooltip.top=\"chipsOcultosLabel\"\n class=\"p-autocomplete-chip w-autocompletefk-chip w-autocompletefk-chip-more\"\n :label=\"`+${chipsOcultos}`\"\n @click=\"openModal\"\n />\n <span v-else class=\"w-autocompletefk-chip-hidden\" />\n </template>\n </AutoComplete>\n <button\n v-if=\"mostrarLimpar\"\n v-tooltip.top=\"'Limpar'\"\n type=\"button\"\n data-kbd-skip\n tabindex=\"-1\"\n class=\"w-autocompletefk-clear\"\n @click=\"limparSelecao\"\n >\n <i class=\"pi pi-times\" />\n </button>\n <button\n v-tooltip.top=\"'Pesquisar (F2)'\"\n type=\"button\"\n :disabled=\"disabled\"\n data-kbd-skip\n tabindex=\"-1\"\n class=\"w-autocompletefk-trigger\"\n @click=\"openModal\"\n >\n <i class=\"pi pi-search\" />\n </button>\n </div>\n\n <!-- Modal de Pesquisa + CRUD -->\n <Dialog\n v-model:visible=\"modalVisible\"\n :header=\"dialogHeader || 'Pesquisar'\"\n :style=\"{ width: '80vw' }\"\n modal\n :draggable=\"false\"\n class=\"w-autocompletefk-dialog\"\n @show=\"onModalShow\"\n >\n <div class=\"w-autocompletefk-toolbar\">\n <IconField class=\"w-autocompletefk-toolbar-search\">\n <InputIcon class=\"pi pi-search\" />\n <InputText\n ref=\"modalSearchInput\"\n v-model=\"modalSearch\"\n placeholder=\"Pesquisar...\"\n class=\"w-full\"\n autofocus\n @keydown=\"onModalSearchKeydown\"\n />\n </IconField>\n <div class=\"w-autocompletefk-toolbar-actions\">\n <Button\n v-if=\"showCreate\"\n label=\"Novo\"\n icon=\"pi pi-plus\"\n size=\"small\"\n @click=\"openCreateForm\"\n />\n </div>\n </div>\n\n <div ref=\"modalTableWrap\" @keydown.capture=\"onModalGridKeydown\">\n <DataTable\n v-model:selection=\"modalSelection\"\n v-model:expanded-rows=\"expandedRows\"\n :meta-key-selection=\"false\"\n :value=\"modalData\"\n :loading=\"modalLoading\"\n paginator\n lazy\n striped-rows\n removable-sort\n size=\"small\"\n :rows=\"modalPageSize\"\n :total-records=\"modalTotalRecords\"\n :sort-field=\"modalSortField ?? undefined\"\n :sort-order=\"modalSortOrder\"\n :selection-mode=\"multiple ? 'multiple' : 'single'\"\n :data-key=\"optionValue\"\n @page=\"onModalPage\"\n @sort=\"(e: any) => onModalSort({ sortField: e.sortField, sortOrder: e.sortOrder })\"\n @row-dblclick=\"onRowDblClick\"\n >\n <Column :selection-mode=\"multiple ? 'multiple' : 'single'\" header-style=\"width: 3rem\" />\n <Column\n v-for=\"col in modalColumns\"\n :key=\"col.field\"\n :field=\"col.field\"\n :header=\"col.header\"\n :sortable=\"(col as ColumnDef).sortable ?? true\"\n :style=\"(col as ColumnDef).style\"\n >\n <template #body=\"{ data }\">\n <WCrudColumnRenderer\n v-if=\"(col as ColumnDef).type\"\n :column=\"col as ColumnDef\"\n :value=\"data[col.field]\"\n :row-data=\"data\"\n />\n <template v-else>\n {{ data[col.field] }}\n </template>\n </template>\n </Column>\n\n <!-- Coluna de ações CRUD -->\n <Column v-if=\"hasRowActions\" header=\"\" :style=\"{ width: '6rem' }\">\n <template #body=\"{ data }\">\n <div class=\"flex items-center justify-end gap-1\">\n <Button\n v-if=\"showEdit\"\n v-tooltip.top=\"'Editar'\"\n icon=\"pi pi-pencil\"\n text\n rounded\n size=\"small\"\n @click=\"openEditForm(data)\"\n />\n <Button\n v-if=\"showDelete\"\n v-tooltip.top=\"'Excluir'\"\n icon=\"pi pi-trash\"\n text\n rounded\n size=\"small\"\n severity=\"danger\"\n @click=\"confirmDelete(data)\"\n />\n </div>\n </template>\n </Column>\n\n <!-- Sub-linhas: mini-grid por linha expandida (colunas vêm do `subRows`) -->\n <template v-if=\"subRows\" #expansion=\"{ data }\">\n <table class=\"w-fk-subrows\">\n <thead>\n <tr>\n <th v-for=\"col in subRowsColumns\" :key=\"col.field\">{{ col.header }}</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(sub, i) in subRowsDe(data)\" :key=\"i\">\n <td v-for=\"col in subRowsColumns\" :key=\"col.field\">\n {{ sub[col.field] ?? '—' }}\n </td>\n </tr>\n </tbody>\n </table>\n </template>\n\n <template #empty>\n <div class=\"w-autocompletefk-empty\">Nenhum registro encontrado</div>\n </template>\n </DataTable>\n </div>\n\n <template #footer>\n <div class=\"w-autocompletefk-footer\">\n <Button label=\"Cancelar\" severity=\"secondary\" text @click=\"modalVisible = false\" />\n <Button\n :label=\"\n multiple && modalSelecionados.length\n ? `Selecionar (${modalSelecionados.length})`\n : 'Selecionar'\n \"\n icon=\"pi pi-check\"\n :disabled=\"!multiple && !modalSelecionados.length\"\n @click=\"confirmModalSelection\"\n />\n </div>\n </template>\n </Dialog>\n\n <!-- Form Dialog (CRUD) — nested sobre o modal -->\n <WCrudFormDialog\n v-if=\"crudAvailable\"\n :visible=\"formDialogVisible\"\n :title=\"formDialogTitle\"\n :fields=\"formFields\"\n :form-data=\"formData\"\n :is-editing=\"isEditing\"\n :saving=\"formSaving\"\n :width=\"dialogWidth\"\n @update:visible=\"\n (v) => {\n formDialogVisible = v\n if (!v) editingItem = null\n }\n \"\n @update:field=\"setFormField\"\n @save=\"saveForm\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { ref, computed, watch, onMounted } from 'vue'\nimport DatePicker from 'primevue/datepicker'\nimport InputText from 'primevue/inputtext'\nimport IconField from 'primevue/iconfield'\nimport InputIcon from 'primevue/inputicon'\nimport Popover from 'primevue/popover'\nimport Button from 'primevue/button'\nimport { vMaska } from 'maska/vue'\nimport { useDateInput, type DateValueFormat } from '@/composables/useDateInput'\n\n/**\n * Campo de data pt-BR padronizado.\n * - Exibe `DD/MM/YYYY` (ou `DD/MM/YYYY HH:mm` com `showTime`) e salva `YYYY-MM-DD`.\n * - Digitação direta com máscara: `30051988` vira `30/05/1988`.\n * - Ícone de calendário abre o seletor (Hoje / Limpar).\n * - `F2` preenche a data de hoje.\n * - `autonow`: no mount, se o valor for `null`, preenche hoje; senão mantém.\n */\nconst props = withDefaults(\n defineProps<{\n modelValue?: string | Date | null\n /** Formato do valor emitido: `'iso'` (YYYY-MM-DD, default) ou `'date'` (Date). */\n valueFormat?: DateValueFormat\n showTime?: boolean\n /** No mount: se o valor for `null`, preenche a data de hoje. */\n autonow?: boolean\n minDate?: string | Date\n maxDate?: string | Date\n disabled?: boolean\n showClear?: boolean\n placeholder?: string\n invalid?: boolean\n inputId?: string\n }>(),\n {\n modelValue: null,\n valueFormat: 'iso',\n showTime: false,\n autonow: false,\n disabled: false,\n showClear: true,\n invalid: false,\n },\n)\n\nconst emit = defineEmits<{ 'update:modelValue': [value: string | Date | null] }>()\n\nconst di = useDateInput({\n showTime: () => props.showTime,\n valueFormat: () => props.valueFormat,\n})\n\nconst typed = ref('') // texto no input (DD/MM/YYYY[ HH:mm])\nconst panelDate = ref<Date | null>(null) // valor do calendário\nconst op = ref<InstanceType<typeof Popover> | null>(null)\n\nconst maskaOptions = computed(() => ({ mask: di.mask() }))\nconst minDateObj = computed(() => di.toDate(props.minDate) ?? undefined)\nconst maxDateObj = computed(() => di.toDate(props.maxDate) ?? undefined)\n\n// Única sincronização externo → interno (o resto é orientado a eventos, sem watchers).\nwatch(\n () => props.modelValue,\n (v) => {\n const d = di.toDate(v)\n panelDate.value = d\n typed.value = di.toDisplay(d)\n },\n { immediate: true },\n)\n\nfunction commit(date: Date | null) {\n emit('update:modelValue', di.toValue(date))\n}\n\nfunction onTypedInput() {\n if (typed.value === '') {\n commit(null)\n return\n }\n // Só comita quando o texto formar uma data completa e válida.\n const d = di.fromDisplay(typed.value)\n if (d) commit(d)\n}\n\nfunction onBlur() {\n // Ao sair, normaliza o texto para o último valor válido (descarta digitação incompleta).\n typed.value = di.toDisplay(di.toDate(props.modelValue))\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (e.key === 'F2' && !props.disabled) {\n e.preventDefault()\n setToday()\n }\n}\n\nfunction onPick(value: unknown) {\n const d = (value as Date | null) ?? null\n commit(d)\n if (!props.showTime) op.value?.hide()\n}\n\nfunction setToday() {\n commit(di.today())\n}\n\nfunction clearValue() {\n commit(null)\n op.value?.hide()\n}\n\nfunction toggle(e: Event) {\n if (props.disabled) return\n op.value?.toggle(e)\n}\n\nonMounted(() => {\n if (props.autonow && props.modelValue == null) setToday()\n})\n</script>\n\n<template>\n <div class=\"w-datepicker\">\n <IconField>\n <InputText\n :id=\"inputId\"\n v-model=\"typed\"\n v-maska=\"maskaOptions\"\n :placeholder=\"placeholder ?? di.placeholder()\"\n :disabled=\"disabled\"\n :invalid=\"invalid\"\n fluid\n autocomplete=\"off\"\n inputmode=\"numeric\"\n @input=\"onTypedInput\"\n @blur=\"onBlur\"\n @keydown=\"onKeydown\"\n />\n <InputIcon\n class=\"pi pi-calendar w-datepicker-icon\"\n :class=\"{ 'w-datepicker-icon-disabled': disabled }\"\n role=\"button\"\n tabindex=\"-1\"\n aria-label=\"Abrir calendário\"\n @click=\"toggle\"\n />\n </IconField>\n\n <Popover ref=\"op\">\n <div class=\"w-datepicker-panel\">\n <DatePicker\n :model-value=\"panelDate ?? undefined\"\n inline\n :show-time=\"showTime\"\n hour-format=\"24\"\n :min-date=\"minDateObj\"\n :max-date=\"maxDateObj\"\n @update:model-value=\"onPick\"\n />\n <div class=\"w-datepicker-actions\">\n <Button label=\"Hoje\" text size=\"small\" @click=\"setToday\" />\n <Button\n v-if=\"showClear\"\n label=\"Limpar\"\n text\n size=\"small\"\n severity=\"secondary\"\n @click=\"clearValue\"\n />\n </div>\n </div>\n </Popover>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport InputText from 'primevue/inputtext'\nimport InputGroup from 'primevue/inputgroup'\nimport InputGroupAddon from 'primevue/inputgroupaddon'\n\nconst props = withDefaults(\n defineProps<{\n /** Numeric model — the real value sent to the API (e.g. 1234.56). */\n modelValue: number | null\n /** Fixed decimal places (default: 2). */\n decimals?: number\n /** Show a \"R$\" prefix. Ignored when `prefix` is set. */\n currency?: boolean\n /** Custom leading addon (overrides `currency`). */\n prefix?: string\n /** Trailing addon. */\n suffix?: string\n /** Display locale for grouping/decimal separators (default: 'pt-BR'). */\n locale?: string\n disabled?: boolean\n placeholder?: string\n invalid?: boolean\n }>(),\n {\n decimals: 2,\n currency: false,\n locale: 'pt-BR',\n disabled: false,\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: number | null]\n}>()\n\nconst resolvedPrefix = computed(() => props.prefix ?? (props.currency ? 'R$' : undefined))\n\nconst hasAddon = computed(() => !!resolvedPrefix.value || !!props.suffix)\n\nconst display = computed(() => {\n const v = props.modelValue\n if (v === null || v === undefined || Number.isNaN(v)) return ''\n return new Intl.NumberFormat(props.locale, {\n minimumFractionDigits: props.decimals,\n maximumFractionDigits: props.decimals,\n }).format(v)\n})\n\nfunction onInput(event: Event) {\n const digits = (event.target as HTMLInputElement).value.replace(/\\D/g, '')\n if (!digits) {\n emit('update:modelValue', null)\n return\n }\n // Digits fill from the right: \"1000\" with decimals=2 -> 10.00\n const num = Number(digits) / Math.pow(10, props.decimals)\n emit('update:modelValue', num)\n}\n</script>\n\n<template>\n <InputGroup v-if=\"hasAddon\" class=\"w-money-input\">\n <InputGroupAddon v-if=\"resolvedPrefix\">{{ resolvedPrefix }}</InputGroupAddon>\n <InputText\n :model-value=\"display\"\n inputmode=\"numeric\"\n class=\"w-money-input__field\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :invalid=\"invalid\"\n @input=\"onInput\"\n />\n <InputGroupAddon v-if=\"suffix\">{{ suffix }}</InputGroupAddon>\n </InputGroup>\n <InputText\n v-else\n :model-value=\"display\"\n inputmode=\"numeric\"\n fluid\n class=\"w-money-input__field\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :invalid=\"invalid\"\n @input=\"onInput\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { ref, reactive, computed, watch, onBeforeUnmount } from 'vue'\nimport Dialog from 'primevue/dialog'\nimport Button from 'primevue/button'\nimport Slider from 'primevue/slider'\n\n/**\n * Upload de imagem com preview e crop (pan + zoom) integrado.\n * Sem dependência externa — o recorte é feito via <canvas>.\n * Emite um `File` recortado (ou `null`), consumível direto pelo\n * `useCrudManager`, que detecta campos de imagem e envia como multipart.\n */\nconst props = withDefaults(\n defineProps<{\n modelValue?: File | string | null\n accept?: string\n /** Tamanho máximo em bytes (default 5MB). */\n maxSize?: number\n /** Proporção do recorte (1 = quadrado). Ignorado quando `circular`. */\n aspectRatio?: number\n /** Stencil circular (avatar). Força proporção 1 e saída PNG com alpha. */\n circular?: boolean\n /** Dimensões do preview em px. */\n width?: number\n height?: number\n }>(),\n {\n modelValue: null,\n accept: 'image/*',\n maxSize: 5_242_880,\n aspectRatio: 1,\n circular: false,\n width: 200,\n height: 200,\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: File | null]\n error: [message: string]\n}>()\n\n// ---------------------------------------------------------------------------\n// Preview\n// ---------------------------------------------------------------------------\nconst objectUrl = ref<string | null>(null)\nwatch(\n () => props.modelValue,\n (v) => {\n if (objectUrl.value) {\n URL.revokeObjectURL(objectUrl.value)\n objectUrl.value = null\n }\n if (v instanceof File) objectUrl.value = URL.createObjectURL(v)\n },\n { immediate: true },\n)\nonBeforeUnmount(() => {\n if (objectUrl.value) URL.revokeObjectURL(objectUrl.value)\n})\n\nconst previewSrc = computed<string | null>(() => {\n if (props.modelValue instanceof File) return objectUrl.value\n if (typeof props.modelValue === 'string' && props.modelValue) return props.modelValue\n return null\n})\n\n// ---------------------------------------------------------------------------\n// File picking + validation\n// ---------------------------------------------------------------------------\nconst fileInput = ref<HTMLInputElement | null>(null)\nfunction openPicker() {\n fileInput.value?.click()\n}\n\nfunction acceptsFile(file: File): boolean {\n const acc = (props.accept || '').trim()\n if (!acc || acc === '*' || acc.includes('image/*')) return file.type.startsWith('image/')\n return acc\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n .some((t) => {\n if (t.endsWith('/*')) return file.type.startsWith(t.slice(0, -1))\n if (t.startsWith('.')) return file.name.toLowerCase().endsWith(t.toLowerCase())\n return file.type === t\n })\n}\n\nlet originalName = 'image.png'\nlet originalType = 'image/png'\nlet cropImage: HTMLImageElement | null = null\n\nfunction onFileChange(e: Event) {\n const input = e.target as HTMLInputElement\n const file = input.files?.[0]\n input.value = '' // permite re-selecionar o mesmo arquivo\n if (!file) return\n if (!acceptsFile(file)) {\n emit('error', 'Tipo de arquivo não suportado.')\n return\n }\n if (file.size > props.maxSize) {\n emit('error', `Imagem acima do limite de ${(props.maxSize / 1_048_576).toFixed(1)}MB.`)\n return\n }\n originalName = file.name\n originalType = file.type || 'image/png'\n const reader = new FileReader()\n reader.onload = () => {\n const img = new Image()\n img.onload = () => {\n cropImage = img\n naturalW.value = img.naturalWidth\n naturalH.value = img.naturalHeight\n zoom.value = 1\n imgSrc.value = img.src\n offset.x = (vpW.value - dispW.value) / 2\n offset.y = (vpH.value - dispH.value) / 2\n cropOpen.value = true\n }\n img.onerror = () => emit('error', 'Não foi possível carregar a imagem.')\n img.src = String(reader.result)\n }\n reader.onerror = () => emit('error', 'Falha ao ler o arquivo.')\n reader.readAsDataURL(file)\n}\n\nfunction remove() {\n emit('update:modelValue', null)\n}\n\n// ---------------------------------------------------------------------------\n// Crop stage (pan + zoom)\n// ---------------------------------------------------------------------------\nconst VP = 300 // maior lado do viewport de recorte, em px de tela\nconst cropOpen = ref(false)\nconst imgSrc = ref('')\nconst naturalW = ref(0)\nconst naturalH = ref(0)\nconst zoom = ref(1)\nconst offset = reactive({ x: 0, y: 0 })\n\nconst effAspect = computed(() => (props.circular ? 1 : props.aspectRatio || 1))\nconst vpW = computed(() => (effAspect.value >= 1 ? VP : Math.round(VP * effAspect.value)))\nconst vpH = computed(() => (effAspect.value >= 1 ? Math.round(VP / effAspect.value) : VP))\nconst baseScale = computed(() =>\n naturalW.value && naturalH.value\n ? Math.max(vpW.value / naturalW.value, vpH.value / naturalH.value)\n : 1,\n)\nconst dispScale = computed(() => baseScale.value * zoom.value)\nconst dispW = computed(() => naturalW.value * dispScale.value)\nconst dispH = computed(() => naturalH.value * dispScale.value)\n\nfunction clampOffset() {\n offset.x = Math.min(0, Math.max(vpW.value - dispW.value, offset.x))\n offset.y = Math.min(0, Math.max(vpH.value - dispH.value, offset.y))\n}\nwatch(zoom, clampOffset)\n\nconst imgStyle = computed(() => ({\n width: `${dispW.value}px`,\n height: `${dispH.value}px`,\n transform: `translate(${offset.x}px, ${offset.y}px)`,\n}))\n\n// drag to pan\nconst dragging = ref(false)\nlet dragStart = { x: 0, y: 0, ox: 0, oy: 0 }\nfunction onPointerDown(e: PointerEvent) {\n dragging.value = true\n ;(e.currentTarget as HTMLElement).setPointerCapture?.(e.pointerId)\n dragStart = { x: e.clientX, y: e.clientY, ox: offset.x, oy: offset.y }\n}\nfunction onPointerMove(e: PointerEvent) {\n if (!dragging.value) return\n offset.x = dragStart.ox + (e.clientX - dragStart.x)\n offset.y = dragStart.oy + (e.clientY - dragStart.y)\n clampOffset()\n}\nfunction onPointerUp() {\n dragging.value = false\n}\n\nfunction outputType(): string {\n if (props.circular) return 'image/png'\n return originalType === 'image/jpeg' ||\n originalType === 'image/png' ||\n originalType === 'image/webp'\n ? originalType\n : 'image/png'\n}\nfunction outputName(type: string): string {\n const ext = type === 'image/png' ? 'png' : type === 'image/webp' ? 'webp' : 'jpg'\n return `${originalName.replace(/\\.[^.]+$/, '') || 'image'}.${ext}`\n}\n\nfunction confirmCrop() {\n if (!cropImage) return\n const scale = dispScale.value\n const sx = -offset.x / scale\n const sy = -offset.y / scale\n const sw = vpW.value / scale\n const sh = vpH.value / scale\n const canvas = document.createElement('canvas')\n canvas.width = Math.max(1, Math.round(sw))\n canvas.height = Math.max(1, Math.round(sh))\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n emit('error', 'Canvas indisponível neste ambiente.')\n return\n }\n if (props.circular) {\n ctx.beginPath()\n ctx.ellipse(\n canvas.width / 2,\n canvas.height / 2,\n canvas.width / 2,\n canvas.height / 2,\n 0,\n 0,\n Math.PI * 2,\n )\n ctx.clip()\n }\n ctx.drawImage(cropImage, sx, sy, sw, sh, 0, 0, canvas.width, canvas.height)\n const type = outputType()\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n emit('error', 'Falha ao processar a imagem.')\n return\n }\n emit('update:modelValue', new File([blob], outputName(type), { type }))\n cropOpen.value = false\n },\n type,\n 0.92,\n )\n}\n</script>\n\n<template>\n <div class=\"w-imgcropper\">\n <div\n class=\"w-imgcropper-preview\"\n :class=\"{ 'is-circular': circular, 'is-empty': !previewSrc }\"\n :style=\"{ width: `${width}px`, height: `${height}px` }\"\n >\n <template v-if=\"previewSrc\">\n <img :src=\"previewSrc\" alt=\"\" class=\"w-imgcropper-img\" />\n <div class=\"w-imgcropper-actions\">\n <Button\n type=\"button\"\n icon=\"pi pi-pencil\"\n rounded\n text\n aria-label=\"Trocar imagem\"\n @click=\"openPicker\"\n />\n <Button\n type=\"button\"\n icon=\"pi pi-trash\"\n rounded\n text\n severity=\"danger\"\n aria-label=\"Remover imagem\"\n @click=\"remove\"\n />\n </div>\n </template>\n <slot v-else name=\"placeholder\" :open=\"openPicker\">\n <button type=\"button\" class=\"w-imgcropper-empty\" @click=\"openPicker\">\n <i class=\"pi pi-image\" />\n <span>Selecionar imagem</span>\n </button>\n </slot>\n </div>\n\n <input\n ref=\"fileInput\"\n type=\"file\"\n :accept=\"accept\"\n class=\"w-imgcropper-file\"\n @change=\"onFileChange\"\n />\n\n <Dialog\n v-model:visible=\"cropOpen\"\n modal\n header=\"Ajustar imagem\"\n :dismissable-mask=\"false\"\n :style=\"{ width: 'auto' }\"\n >\n <div class=\"w-imgcropper-stage\">\n <div\n class=\"w-imgcropper-viewport\"\n :class=\"{ 'is-circular': circular }\"\n :style=\"{ width: `${vpW}px`, height: `${vpH}px` }\"\n @pointerdown=\"onPointerDown\"\n @pointermove=\"onPointerMove\"\n @pointerup=\"onPointerUp\"\n @pointerleave=\"onPointerUp\"\n >\n <img\n v-if=\"imgSrc\"\n :src=\"imgSrc\"\n alt=\"\"\n class=\"w-imgcropper-cropimg\"\n :style=\"imgStyle\"\n draggable=\"false\"\n />\n <div class=\"w-imgcropper-stencil\" :class=\"{ 'is-circular': circular }\"></div>\n </div>\n <div class=\"w-imgcropper-zoom\">\n <i class=\"pi pi-search-minus\" />\n <Slider v-model=\"zoom\" :min=\"1\" :max=\"4\" :step=\"0.01\" class=\"w-imgcropper-slider\" />\n <i class=\"pi pi-search-plus\" />\n </div>\n </div>\n <template #footer>\n <Button type=\"button\" label=\"Cancelar\" text @click=\"cropOpen = false\" />\n <Button type=\"button\" label=\"Confirmar\" @click=\"confirmCrop\" />\n </template>\n </Dialog>\n </div>\n</template>\n\n<style scoped>\n.w-imgcropper-preview {\n position: relative;\n overflow: hidden;\n border-radius: 8px;\n border: 1px solid var(--p-content-border-color, #e2e8f0);\n background: var(--p-content-background, #f8fafc);\n}\n.w-imgcropper-preview.is-circular {\n border-radius: 50%;\n}\n.w-imgcropper-img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n.w-imgcropper-actions {\n position: absolute;\n inset: auto 0 0 0;\n display: flex;\n justify-content: center;\n gap: 4px;\n padding: 4px;\n background: color-mix(in srgb, #000 45%, transparent);\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n.w-imgcropper-preview:hover .w-imgcropper-actions,\n.w-imgcropper-preview:focus-within .w-imgcropper-actions {\n opacity: 1;\n}\n.w-imgcropper-empty {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 6px;\n cursor: pointer;\n border: none;\n background: transparent;\n color: var(--p-text-muted-color, #64748b);\n font-size: 0.85rem;\n}\n.w-imgcropper-empty i {\n font-size: 1.5rem;\n}\n.w-imgcropper-file {\n display: none;\n}\n.w-imgcropper-stage {\n display: flex;\n flex-direction: column;\n gap: 16px;\n align-items: center;\n}\n.w-imgcropper-viewport {\n position: relative;\n overflow: hidden;\n touch-action: none;\n cursor: grab;\n background: #1e1e1e;\n border-radius: 4px;\n}\n.w-imgcropper-viewport:active {\n cursor: grabbing;\n}\n.w-imgcropper-viewport.is-circular {\n border-radius: 50%;\n}\n.w-imgcropper-cropimg {\n position: absolute;\n top: 0;\n left: 0;\n max-width: none;\n user-select: none;\n -webkit-user-drag: none;\n}\n.w-imgcropper-stencil {\n position: absolute;\n inset: 0;\n pointer-events: none;\n box-shadow: 0 0 0 1px color-mix(in srgb, #fff 60%, transparent) inset;\n}\n.w-imgcropper-stencil.is-circular {\n border-radius: 50%;\n}\n.w-imgcropper-zoom {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n color: var(--p-text-muted-color, #64748b);\n}\n.w-imgcropper-slider {\n flex: 1;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport InputText from 'primevue/inputtext'\nimport IconField from 'primevue/iconfield'\nimport InputIcon from 'primevue/inputicon'\nimport Button from 'primevue/button'\n\ntype Id = string | number\ntype Item = Record<string, unknown>\n\nconst props = withDefaults(\n defineProps<{\n /** Full pool of available records. */\n source: Item[]\n /** Currently selected ids (v-model:selected). */\n selected: Id[]\n /** Field used as the record id (default: 'id'). */\n trackBy?: string\n /** Field used for the visible label (default: 'nome'). */\n optionLabel?: string\n /** Fields to match when searching (default: [optionLabel]). */\n searchFields?: string[]\n disabled?: boolean\n }>(),\n {\n trackBy: 'id',\n optionLabel: 'nome',\n selected: () => [],\n },\n)\n\nconst emit = defineEmits<{\n 'update:selected': [ids: Id[]]\n}>()\n\nconst leftSearch = ref('')\nconst rightSearch = ref('')\n\nconst selectedSet = computed(() => new Set(props.selected))\nconst fields = computed(() => props.searchFields ?? [props.optionLabel])\n\nfunction idOf(item: Item): Id {\n return item[props.trackBy] as Id\n}\n\nfunction labelOf(item: Item): string {\n return String(item[props.optionLabel] ?? '')\n}\n\nfunction matches(item: Item, term: string): boolean {\n if (!term) return true\n const q = term.toLowerCase()\n return fields.value.some((f) =>\n String(item[f] ?? '')\n .toLowerCase()\n .includes(q),\n )\n}\n\nconst available = computed(() =>\n props.source.filter((i) => !selectedSet.value.has(idOf(i)) && matches(i, leftSearch.value)),\n)\n\nconst chosen = computed(() =>\n props.source.filter((i) => selectedSet.value.has(idOf(i)) && matches(i, rightSearch.value)),\n)\n\nfunction add(item: Item) {\n if (props.disabled) return\n emit('update:selected', [...props.selected, idOf(item)])\n}\n\nfunction remove(item: Item) {\n if (props.disabled) return\n const id = idOf(item)\n emit(\n 'update:selected',\n props.selected.filter((s) => s !== id),\n )\n}\n\nfunction addAll() {\n if (props.disabled) return\n emit('update:selected', props.source.map(idOf))\n}\n\nfunction removeAll() {\n if (props.disabled) return\n emit('update:selected', [])\n}\n</script>\n\n<template>\n <div class=\"w-transfer\" :class=\"{ 'w-transfer--disabled': disabled }\">\n <!-- Available -->\n <div class=\"w-transfer__pane\">\n <div class=\"w-transfer__head\">\n <span class=\"w-transfer__title\">Disponíveis</span>\n <span class=\"w-transfer__count\">{{ available.length }}</span>\n </div>\n <IconField class=\"w-transfer__search\">\n <InputIcon class=\"pi pi-search\" />\n <InputText v-model=\"leftSearch\" placeholder=\"Buscar...\" fluid />\n </IconField>\n <ul class=\"w-transfer__list\">\n <li\n v-for=\"item in available\"\n :key=\"`a-${idOf(item)}`\"\n class=\"w-transfer__item\"\n @click=\"add(item)\"\n >\n <span>{{ labelOf(item) }}</span>\n <i class=\"pi pi-angle-right\" />\n </li>\n <li v-if=\"!available.length\" class=\"w-transfer__empty\">Nenhum item</li>\n </ul>\n </div>\n\n <!-- Controls -->\n <div class=\"w-transfer__controls\">\n <Button\n type=\"button\"\n icon=\"pi pi-angle-double-right\"\n text\n rounded\n :disabled=\"disabled || !available.length\"\n @click=\"addAll\"\n />\n <Button\n type=\"button\"\n icon=\"pi pi-angle-double-left\"\n text\n rounded\n :disabled=\"disabled || !selected.length\"\n @click=\"removeAll\"\n />\n </div>\n\n <!-- Selected -->\n <div class=\"w-transfer__pane\">\n <div class=\"w-transfer__head\">\n <span class=\"w-transfer__title\">Selecionados</span>\n <span class=\"w-transfer__count\">{{ chosen.length }}</span>\n </div>\n <IconField class=\"w-transfer__search\">\n <InputIcon class=\"pi pi-search\" />\n <InputText v-model=\"rightSearch\" placeholder=\"Buscar...\" fluid />\n </IconField>\n <ul class=\"w-transfer__list\">\n <li\n v-for=\"item in chosen\"\n :key=\"`s-${idOf(item)}`\"\n class=\"w-transfer__item\"\n @click=\"remove(item)\"\n >\n <i class=\"pi pi-angle-left\" />\n <span>{{ labelOf(item) }}</span>\n </li>\n <li v-if=\"!chosen.length\" class=\"w-transfer__empty\">Nenhum item</li>\n </ul>\n </div>\n </div>\n</template>\n","export interface ViaCepResponse {\n cep: string\n logradouro: string\n complemento: string\n bairro: string\n localidade: string\n uf: string\n ibge: string\n gia: string\n ddd: string\n siafi: string\n erro?: true\n}\n\nexport async function lookupCep(cep: string): Promise<ViaCepResponse | null> {\n const digits = cep.replace(/\\D/g, '')\n if (digits.length !== 8) return null\n try {\n const response = await fetch(`https://viacep.com.br/ws/${digits}/json/`)\n if (!response.ok) return null\n const data = (await response.json()) as ViaCepResponse\n if (data.erro) return null\n return data\n } catch {\n return null\n }\n}\n","<script setup lang=\"ts\">\nimport { computed, reactive, isRef, watch } from 'vue'\nimport { vMaska } from 'maska/vue'\nimport InputText from 'primevue/inputtext'\nimport InputNumber from 'primevue/inputnumber'\nimport Textarea from 'primevue/textarea'\nimport Select from 'primevue/select'\nimport AutoComplete from 'primevue/autocomplete'\nimport ToggleSwitch from 'primevue/toggleswitch'\nimport ColorPicker from 'primevue/colorpicker'\nimport Password from 'primevue/password'\nimport type { FieldDef, FieldSubRowsFetch } from '@/types/field'\nimport WAutoCompleteFK from '@/components/form/WAutoCompleteFK.vue'\nimport WDatePicker from '@/components/form/WDatePicker.vue'\nimport WMoneyInput from '@/components/form/WMoneyInput.vue'\nimport WImageCropper from '@/components/form/WImageCropper.vue'\nimport WTransferList from '@/components/form/WTransferList.vue'\nimport { lookupCep } from '@/utils/cep'\n\nconst props = withDefaults(\n defineProps<{\n fields: FieldDef[]\n formData: Record<string, unknown>\n isEditing: boolean\n disabled?: boolean\n /** Nº de colunas do grid (default 2). Campos ocupam frações via `colSpan`;\n * grupos podem sobrepor via `fieldGroup.columns`. */\n columns?: number\n }>(),\n {\n disabled: false,\n columns: 2,\n },\n)\n\nconst emit = defineEmits<{\n 'update:field': [field: string, value: unknown]\n}>()\n\nconst fieldErrors = reactive<Record<string, string | null>>({})\n\n// --- CEP state ---\nconst cepLoading = reactive<Record<string, boolean>>({})\nconst cepError = reactive<Record<string, string | null>>({})\nconst cepTimers = reactive<Record<string, ReturnType<typeof setTimeout> | null>>({})\n\nfunction onCepInput(field: FieldDef, event: Event) {\n const raw = (event.target as HTMLInputElement).value\n const digits = raw.replace(/\\D/g, '')\n emit('update:field', field.field, raw)\n\n // Clear previous error\n cepError[field.field] = null\n\n // Clear pending timer\n if (cepTimers[field.field]) {\n clearTimeout(cepTimers[field.field]!)\n cepTimers[field.field] = null\n }\n\n if (digits.length === 8) {\n cepTimers[field.field] = setTimeout(async () => {\n cepLoading[field.field] = true\n cepError[field.field] = null\n try {\n const result = await lookupCep(digits)\n if (!result) {\n cepError[field.field] = 'CEP não encontrado. Preencha os campos manualmente.'\n } else {\n // Fill mapped fields, but only when currently empty\n const mapping = field.cepFields || {}\n const keys = Object.keys(mapping) as Array<keyof typeof mapping>\n for (const key of keys) {\n const targetField = mapping[key]\n if (!targetField) continue\n const existing = props.formData[targetField]\n if (existing == null || existing === '') {\n emit('update:field', targetField, result[key] ?? '')\n }\n }\n }\n } finally {\n cepLoading[field.field] = false\n }\n }, 400)\n }\n}\n\n// --- Visibility & Disabled ---\n\nconst visibleFields = computed(() =>\n props.fields.filter((f) => {\n if (f.visible === undefined || f.visible === true) return true\n if (typeof f.visible === 'function') return f.visible(props.formData, props.isEditing)\n return f.visible\n }),\n)\n\nfunction isFieldDisabled(field: FieldDef): boolean {\n if (props.disabled) return true\n // Somente-leitura / calculado → sempre desabilitado (o valor ainda vai no payload).\n if (field.readonly || field.computed) return true\n if (field.disabledOnEdit && props.isEditing) return true\n if (typeof field.disabled === 'function') return field.disabled(props.formData, props.isEditing)\n return !!field.disabled\n}\n\n/** Indireção tipada do `subRows`: devolver a função direto no template fazia o\n * vue-tsc entrar no ciclo WFormRenderer → WAutoCompleteFK → WCrudFormDialog e\n * degradar tudo para `any`. */\nfunction subRowsFetchDe(field: FieldDef): FieldSubRowsFetch | undefined {\n return field.subRows\n}\n\n/** Resolve `endpointParams` estático ou por função (contexto do pai). */\nfunction resolveEndpointParams(field: FieldDef) {\n const ep = field.endpointParams\n return typeof ep === 'function' ? ep() : ep\n}\n\n// --- Campos calculados ---\n// Derivam o valor dos demais campos e o escrevem de volta no formData (para irem no\n// payload). O SOURCE do watch chama `calculate` — assim as dependências reativas exatas\n// (ex.: `formData.produto.unidade_medida`) são coletadas e o watch dispara quando elas\n// mudam. (Um `watch(() => formData, …, { deep })` não reage de forma confiável ao\n// `formData` que chega por prop no fluxo do WCrudFormDialog.) Só emite quando o valor\n// muda de fato (o `!==` evita laço). A função `calculate` deve cair no valor atual quando\n// não puder derivar (ex.: na edição, com a FK já como id).\nconst calculatedFields = computed(() =>\n props.fields.filter((f) => typeof f.calculate === 'function'),\n)\n\nwatch(\n () => calculatedFields.value.map((f) => f.calculate!(props.formData, props.isEditing)),\n (nexts) => {\n calculatedFields.value.forEach((f, i) => {\n if (props.formData[f.field] !== nexts[i]) emit('update:field', f.field, nexts[i])\n })\n },\n { immediate: true },\n)\n\nfunction unwrapRef<V>(val: V): V extends import('vue').Ref<infer U> ? U : V {\n return isRef(val) ? ((val as { value: unknown }).value as never) : (val as never)\n}\n\n// --- Autofocus ---\n\nconst autofocusField = computed(() => {\n const mode = props.isEditing ? 'edit' : 'create'\n const explicit = props.fields.find((f) => f.autofocus === true || f.autofocus === mode)\n if (explicit) return explicit.field\n const first = visibleFields.value.find((f) => {\n // Tipos sem campo de digitação não são candidatos a foco inicial.\n const semInput = ['switch', 'fk', 'select', 'image', 'segmented', 'choice', 'chips', 'transfer']\n if (f.type && semInput.includes(f.type)) return false\n if (f.disabled === true) return false\n if (f.disabledOnEdit && props.isEditing) return false\n return true\n })\n return first?.field ?? null\n})\n\nfunction shouldAutofocus(field: FieldDef): boolean {\n return field.field === autofocusField.value\n}\n\n// --- Mask format conversion (PrimeVue InputMask -> maska) ---\n\nfunction convertMask(mask?: string): string | undefined {\n if (!mask) return undefined\n return mask.replace(/9/g, '#').replace(/a/g, 'S').replace(/\\*/g, 'X')\n}\n\n// --- CPF/CNPJ inline mask ---\n\nfunction displayCpfCnpj(value: unknown): string {\n if (!value) return ''\n const digits = String(value).replace(/\\D/g, '').slice(0, 14)\n if (digits.length <= 11) {\n return digits\n .replace(/(\\d{3})(\\d)/, '$1.$2')\n .replace(/(\\d{3})(\\d)/, '$1.$2')\n .replace(/(\\d{3})(\\d{1,2})$/, '$1-$2')\n }\n return digits\n .replace(/(\\d{2})(\\d)/, '$1.$2')\n .replace(/(\\d{3})(\\d)/, '$1.$2')\n .replace(/(\\d{3})(\\d)/, '$1/$2')\n .replace(/(\\d{4})(\\d{1,2})$/, '$1-$2')\n}\n\nfunction onCpfCnpjInput(fieldName: string, event: Event) {\n const raw = (event.target as HTMLInputElement).value.replace(/\\D/g, '').slice(0, 14)\n emit('update:field', fieldName, raw)\n}\n\n// --- AutoComplete local (para type=autocomplete com options) ---\n\nconst autocompleteSuggestions = reactive<Record<string, unknown[]>>({})\n\nfunction getAutocompleteValue(field: FieldDef) {\n const val = props.formData[field.field]\n if (val == null) return null\n const optionValue = field.optionValue || 'value'\n const options = unwrapRef(field.options) || []\n return (options as Record<string, unknown>[]).find((o) => o[optionValue] === val) ?? null\n}\n\nfunction getFilteredSuggestions(field: FieldDef) {\n return autocompleteSuggestions[field.field] || []\n}\n\nfunction onAutocompleteSearch(field: FieldDef, event: { query: string }) {\n const query = (event.query || '').toLowerCase()\n const options = unwrapRef(field.options) || []\n const optionLabel = field.optionLabel || 'label'\n autocompleteSuggestions[field.field] = (options as Record<string, unknown>[]).filter((o) =>\n String(o[optionLabel] || '')\n .toLowerCase()\n .includes(query),\n )\n}\n\nfunction onAutocompleteSelect(field: FieldDef, event: { value: Record<string, unknown> }) {\n const optionValue = field.optionValue || 'value'\n emit('update:field', field.field, event.value[optionValue])\n}\n\n// --- Options (segmented / choice / chips) ---\n// Os três tipos leem a MESMA tripla `options`/`optionLabel`/`optionValue` do\n// select — quem troca um Select por pílulas não reescreve o FieldDef.\n\nfunction fieldOptions(field: FieldDef): Record<string, unknown>[] {\n return (unwrapRef(field.options) || []) as Record<string, unknown>[]\n}\n\nfunction optionLabelOf(field: FieldDef, option: Record<string, unknown>): string {\n return String(option[field.optionLabel || 'label'] ?? '')\n}\n\nfunction optionValueOf(field: FieldDef, option: Record<string, unknown>): unknown {\n return option[field.optionValue || 'value']\n}\n\nfunction isOptionSelected(field: FieldDef, option: Record<string, unknown>): boolean {\n return props.formData[field.field] === optionValueOf(field, option)\n}\n\n/** Escolha única: clicar na opção ativa mantém a escolha (não desmarca). */\nfunction pickOption(field: FieldDef, option: Record<string, unknown>) {\n if (isFieldDisabled(field)) return\n emit('update:field', field.field, optionValueOf(field, option))\n}\n\n// --- Chips (valor múltiplo, removível) ---\n// O valor é um ARRAY. Cada item pode ser o objeto inteiro (usa `optionLabel`) ou\n// só o id (procura o rótulo em `options`; sem match, mostra o próprio valor).\n\ninterface ChipEntry {\n key: string\n label: string\n}\n\nfunction chipEntries(field: FieldDef): ChipEntry[] {\n const raw = props.formData[field.field]\n if (!Array.isArray(raw)) return []\n const labelKey = field.optionLabel || 'nome'\n const valueKey = field.optionValue || 'id'\n const options = fieldOptions(field)\n\n return raw.map((item, index) => {\n if (item !== null && typeof item === 'object') {\n const obj = item as Record<string, unknown>\n return { key: String(obj[valueKey] ?? index), label: String(obj[labelKey] ?? '') }\n }\n const match = options.find((o) => o[valueKey] === item)\n return {\n key: String(item ?? index),\n label: match ? String(match[labelKey] ?? item) : String(item),\n }\n })\n}\n\nfunction removeChip(field: FieldDef, index: number) {\n if (isFieldDisabled(field)) return\n const raw = props.formData[field.field]\n if (!Array.isArray(raw)) return\n emit(\n 'update:field',\n field.field,\n raw.filter((_, i) => i !== index),\n )\n}\n\n// --- Color ---\n\nfunction getColorPickerValue(field: FieldDef): string {\n const val = props.formData[field.field]\n return val ? String(val).replace('#', '') : 'FFFFFF'\n}\n\nfunction onColorChange(field: FieldDef, value: string) {\n emit('update:field', field.field, `#${value}`)\n}\n\n// --- Drill-down (filtro em cascata das FKs) ---\n\n/** Resolve o `dependsOn` do campo em filtros já com o valor atual do formulário. */\nfunction resolveDrilldown(field: FieldDef) {\n const dep = field.dependsOn\n if (!dep) return undefined\n const list = Array.isArray(dep) ? dep : [dep]\n return list.map((d) => ({\n field: d.param || d.field,\n value: props.formData[d.field],\n required: d.required,\n }))\n}\n\n// --- Validation ---\n\nfunction validateField(field: FieldDef) {\n if (typeof field.validate === 'function') {\n const error = field.validate(props.formData[field.field])\n fieldErrors[field.field] = error || null\n }\n}\n\nfunction validateAll(): string[] {\n const errors: string[] = []\n for (const field of props.fields) {\n if (typeof field.validate === 'function') {\n const error = field.validate(props.formData[field.field])\n fieldErrors[field.field] = error || null\n if (error) errors.push(error)\n }\n }\n return errors\n}\n\nfunction clearErrors() {\n Object.keys(fieldErrors).forEach((k) => delete fieldErrors[k])\n}\n\n// --- Field Groups ---\n\ninterface FieldGroup {\n id: string\n title?: string\n description?: string\n columns?: number\n fields: FieldDef[]\n}\n\n// --- Grid columns / span ---\n\nfunction groupColumns(group: FieldGroup): number {\n return Math.max(1, Math.floor(group.columns ?? props.columns))\n}\n\n/** Resolve o colSpan do campo em nº de colunas do grid do grupo.\n * - omitido ou 'full' → linha inteira\n * - 0.5 → metade da linha (independe do nº de colunas)\n * - inteiro ≥ 1 → N colunas (limitado ao total) */\nfunction fieldSpan(field: FieldDef, cols: number): number {\n const span = field.colSpan\n if (span == null || span === 'full') return cols\n if (span === 0.5) return Math.max(1, Math.round(cols / 2))\n return Math.min(Math.max(1, Math.floor(span)), cols)\n}\n\nfunction fieldSpanStyle(field: FieldDef, group: FieldGroup) {\n return { '--w-col-span': fieldSpan(field, groupColumns(group)) }\n}\n\nfunction fieldSpanClass(field: FieldDef, group: FieldGroup): string {\n return fieldSpan(field, groupColumns(group)) === groupColumns(group)\n ? 'w-crud-form-col-full'\n : 'w-crud-form-col-half'\n}\n\nconst groupedFields = computed((): FieldGroup[] => {\n const groupMap = new Map<string, FieldGroup>()\n const groupOrder: string[] = []\n const groupExplicitOrder = new Map<string, number>()\n\n for (const field of visibleFields.value) {\n const groupId = field.fieldGroup?.id ?? '__default__'\n\n if (!groupMap.has(groupId)) {\n groupMap.set(groupId, {\n id: groupId,\n title: field.fieldGroup?.title,\n description: field.fieldGroup?.description,\n columns: field.fieldGroup?.columns,\n fields: [],\n })\n groupOrder.push(groupId)\n if (field.fieldGroup?.order != null) {\n groupExplicitOrder.set(groupId, field.fieldGroup.order)\n }\n }\n\n groupMap.get(groupId)!.fields.push(field)\n }\n\n return groupOrder\n .slice()\n .sort((a, b) => {\n const orderA = groupExplicitOrder.get(a)\n const orderB = groupExplicitOrder.get(b)\n if (orderA != null && orderB != null) return orderA - orderB\n if (orderA != null) return -1\n if (orderB != null) return 1\n return groupOrder.indexOf(a) - groupOrder.indexOf(b)\n })\n .map((id) => groupMap.get(id)!)\n})\n\ndefineExpose({ validateAll, clearErrors })\n</script>\n\n<template>\n <div class=\"w-crud-form\">\n <div v-for=\"group in groupedFields\" :key=\"group.id\" class=\"w-crud-form-group\">\n <div v-if=\"group.title\" class=\"w-crud-form-group-header\">\n <h3 class=\"w-crud-form-group-title\">{{ group.title }}</h3>\n <p v-if=\"group.description\" class=\"w-crud-form-group-desc\">{{ group.description }}</p>\n </div>\n <div class=\"w-crud-form-fields\" :style=\"{ '--w-form-cols': groupColumns(group) }\">\n <template v-for=\"field in group.fields\" :key=\"field.field\">\n <slot\n :name=\"`field-${field.field}`\"\n :field=\"field\"\n :form-data=\"formData\"\n :is-editing=\"isEditing\"\n :set-form-field=\"(f: string, v: unknown) => emit('update:field', f, v)\"\n >\n <!-- Switch -->\n <div\n v-if=\"field.type === 'switch'\"\n class=\"w-crud-form-switch\"\n :style=\"fieldSpanStyle(field, group)\"\n >\n <ToggleSwitch\n :model-value=\"formData[field.field] as boolean\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n <label class=\"w-crud-form-switch-label\">{{ field.switchLabel || field.label }}</label>\n </div>\n\n <!-- Color -->\n <div\n v-else-if=\"field.type === 'color'\"\n :class=\"fieldSpanClass(field, group)\"\n :style=\"fieldSpanStyle(field, group)\"\n >\n <label class=\"w-crud-form-label\">\n {{ field.label }}\n <span v-if=\"field.required\" class=\"w-crud-form-required\">*</span>\n </label>\n <div class=\"w-crud-form-color-row\">\n <ColorPicker\n :model-value=\"getColorPickerValue(field)\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"onColorChange(field, $event as string)\"\n />\n <InputText\n :model-value=\"formData[field.field] as string\"\n class=\"w-28\"\n maxlength=\"7\"\n placeholder=\"#000000\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n </div>\n </div>\n\n <!-- Image -->\n <div\n v-else-if=\"field.type === 'image'\"\n :class=\"fieldSpanClass(field, group)\"\n :style=\"fieldSpanStyle(field, group)\"\n >\n <label class=\"w-crud-form-label\">\n {{ field.label }}\n </label>\n <slot :name=\"`image-${field.field}`\" :field=\"field\" :form-data=\"formData\">\n <WImageCropper\n :model-value=\"formData[field.field] as File | string | null\"\n :accept=\"field.accept || 'image/*'\"\n @update:model-value=\"(file) => emit('update:field', field.field, file)\"\n @error=\"\n (msg) => {\n fieldErrors[field.field] = msg\n }\n \"\n />\n </slot>\n <small v-if=\"fieldErrors[field.field]\" class=\"w-crud-form-error\">\n {{ fieldErrors[field.field] }}\n </small>\n </div>\n\n <!-- Transfer (dual list) -->\n <div\n v-else-if=\"field.type === 'transfer'\"\n :class=\"fieldSpanClass(field, group)\"\n :style=\"fieldSpanStyle(field, group)\"\n >\n <label class=\"w-crud-form-label\">\n {{ field.label }}\n <span v-if=\"field.required\" class=\"w-crud-form-required\">*</span>\n </label>\n <WTransferList\n :source=\"(unwrapRef(field.options) as any[]) || []\"\n :selected=\"(formData[field.field] as any[]) || []\"\n :track-by=\"field.optionValue || 'id'\"\n :option-label=\"field.optionLabel || 'nome'\"\n :search-fields=\"field.searchFields\"\n :disabled=\"isFieldDisabled(field)\"\n @update:selected=\"(val) => emit('update:field', field.field, val)\"\n />\n </div>\n\n <!-- All other types -->\n <div v-else :class=\"fieldSpanClass(field, group)\" :style=\"fieldSpanStyle(field, group)\">\n <label class=\"w-crud-form-label\">\n {{ field.label }}\n <span v-if=\"field.required\" class=\"w-crud-form-required\">*</span>\n <i\n v-if=\"cepLoading[field.field]\"\n class=\"pi pi-spin pi-spinner w-crud-form-cep-spinner\"\n />\n </label>\n\n <!-- Text with mask (maska) -->\n <InputText\n v-if=\"(!field.type || field.type === 'text') && field.mask\"\n v-maska=\"{ mask: convertMask(field.mask) }\"\n :model-value=\"formData[field.field] as string\"\n fluid\n :autofocus=\"shouldAutofocus(field) || undefined\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Text -->\n <InputText\n v-else-if=\"!field.type || field.type === 'text'\"\n :model-value=\"formData[field.field] as string\"\n fluid\n :autofocus=\"shouldAutofocus(field) || undefined\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Email -->\n <InputText\n v-else-if=\"field.type === 'email'\"\n :model-value=\"formData[field.field] as string\"\n type=\"email\"\n fluid\n :autofocus=\"shouldAutofocus(field) || undefined\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Password -->\n <Password\n v-else-if=\"field.type === 'password'\"\n :model-value=\"formData[field.field] as string\"\n fluid\n toggle-mask\n :feedback=\"field.feedback !== false\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Number -->\n <InputNumber\n v-else-if=\"field.type === 'number'\"\n :model-value=\"formData[field.field] as number\"\n fluid\n locale=\"pt-BR\"\n :min=\"field.min\"\n :max=\"field.max\"\n :min-fraction-digits=\"field.minFractionDigits\"\n :max-fraction-digits=\"field.maxFractionDigits\"\n :suffix=\"field.suffix\"\n :prefix=\"field.prefix\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Currency (fill-from-right, calculator style) -->\n <WMoneyInput\n v-else-if=\"field.type === 'currency' && field.fillFromRight\"\n :model-value=\"formData[field.field] as number | null\"\n :decimals=\"field.decimals ?? 2\"\n currency\n :prefix=\"field.prefix\"\n :suffix=\"field.suffix\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Currency -->\n <InputNumber\n v-else-if=\"field.type === 'currency'\"\n :model-value=\"formData[field.field] as number\"\n fluid\n mode=\"currency\"\n currency=\"BRL\"\n locale=\"pt-BR\"\n :min=\"field.min\"\n :max=\"field.max\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Select -->\n <Select\n v-else-if=\"field.type === 'select'\"\n :model-value=\"formData[field.field]\"\n fluid\n :options=\"unwrapRef(field.options) as any[]\"\n :option-label=\"field.optionLabel || 'label'\"\n :option-value=\"field.optionValue || 'value'\"\n :show-clear=\"field.showClear !== false\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- AutoComplete (options locais) -->\n <AutoComplete\n v-else-if=\"field.type === 'autocomplete'\"\n :model-value=\"getAutocompleteValue(field)\"\n fluid\n :suggestions=\"getFilteredSuggestions(field) as any[]\"\n :option-label=\"field.optionLabel || 'label'\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @complete=\"onAutocompleteSearch(field, $event)\"\n @item-select=\"onAutocompleteSelect(field, $event)\"\n @clear=\"emit('update:field', field.field, null)\"\n />\n\n <!-- FK (busca na API) -->\n <WAutoCompleteFK\n v-else-if=\"field.type === 'fk'\"\n :model-value=\"formData[field.field] as any\"\n :autofocus=\"shouldAutofocus(field) || undefined\"\n :endpoint=\"field.endpoint!\"\n :endpoint-params=\"resolveEndpointParams(field)\"\n :drilldown=\"resolveDrilldown(field)\"\n :blocked-placeholder=\"field.blockedPlaceholder\"\n :option-label=\"field.optionLabel || 'nome'\"\n :option-description=\"field.optionDescription\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n :show-clear=\"field.showClear !== false\"\n :dialog-header=\"field.label\"\n :crud-fields=\"field.crudFields\"\n :crud-columns=\"field.crudColumns\"\n :sub-rows=\"subRowsFetchDe(field)\"\n :dialog-width=\"field.dialogWidth\"\n :can-create=\"field.canCreate\"\n :can-edit=\"field.canEdit\"\n :can-delete=\"field.canDelete\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Date -->\n <WDatePicker\n v-else-if=\"field.type === 'date'\"\n :model-value=\"formData[field.field] as Date | string | null\"\n value-format=\"date\"\n :autonow=\"field.autonow\"\n :min-date=\"field.minDate\"\n :max-date=\"field.maxDate\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Datetime -->\n <WDatePicker\n v-else-if=\"field.type === 'datetime'\"\n :model-value=\"formData[field.field] as Date | string | null\"\n value-format=\"date\"\n show-time\n :autonow=\"field.autonow\"\n :min-date=\"field.minDate\"\n :max-date=\"field.maxDate\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- CPF/CNPJ -->\n <InputText\n v-else-if=\"field.type === 'cpf_cnpj'\"\n :model-value=\"displayCpfCnpj(formData[field.field])\"\n fluid\n maxlength=\"18\"\n :placeholder=\"field.placeholder || '000.000.000-00'\"\n :disabled=\"isFieldDisabled(field)\"\n :invalid=\"!!fieldErrors[field.field]\"\n @input=\"onCpfCnpjInput(field.field, $event)\"\n @blur=\"validateField(field)\"\n />\n\n <!-- Mask (maska) -->\n <InputText\n v-else-if=\"field.type === 'mask'\"\n v-maska=\"{ mask: convertMask(field.mask) }\"\n :model-value=\"formData[field.field] as string\"\n fluid\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n :invalid=\"!!fieldErrors[field.field]\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n @blur=\"validateField(field)\"\n />\n\n <!-- CEP -->\n <InputText\n v-else-if=\"field.type === 'cep'\"\n v-maska=\"{ mask: '#####-###' }\"\n :model-value=\"formData[field.field] as string\"\n fluid\n :placeholder=\"field.placeholder || '00000-000'\"\n :disabled=\"isFieldDisabled(field)\"\n :invalid=\"!!cepError[field.field]\"\n @input=\"onCepInput(field, $event)\"\n />\n\n <!-- Textarea -->\n <Textarea\n v-else-if=\"field.type === 'textarea'\"\n :model-value=\"formData[field.field] as string\"\n fluid\n :autofocus=\"shouldAutofocus(field) || undefined\"\n :rows=\"field.rows || 3\"\n :placeholder=\"field.placeholder\"\n :disabled=\"isFieldDisabled(field)\"\n @update:model-value=\"(val) => emit('update:field', field.field, val)\"\n />\n\n <!-- Segmented (escolha única, 2-3 opções curtas, num trilho) -->\n <div v-else-if=\"field.type === 'segmented'\" class=\"w-segmented\">\n <button\n v-for=\"option in fieldOptions(field)\"\n :key=\"String(optionValueOf(field, option))\"\n type=\"button\"\n class=\"w-segmented__option\"\n :class=\"{ 'w-segmented__option--on': isOptionSelected(field, option) }\"\n :aria-pressed=\"isOptionSelected(field, option)\"\n :disabled=\"isFieldDisabled(field)\"\n @click=\"pickOption(field, option)\"\n >\n {{ optionLabelOf(field, option) }}\n </button>\n </div>\n\n <!-- Choice (escolha única em chips, N opções) -->\n <div v-else-if=\"field.type === 'choice'\" class=\"w-choice\">\n <button\n v-for=\"option in fieldOptions(field)\"\n :key=\"String(optionValueOf(field, option))\"\n type=\"button\"\n class=\"w-choice__option\"\n :class=\"{ 'w-choice__option--on': isOptionSelected(field, option) }\"\n :aria-pressed=\"isOptionSelected(field, option)\"\n :disabled=\"isFieldDisabled(field)\"\n @click=\"pickOption(field, option)\"\n >\n <i\n v-if=\"isOptionSelected(field, option) && field.choiceIcon !== ''\"\n :class=\"field.choiceIcon || 'pi pi-check-circle'\"\n />\n {{ optionLabelOf(field, option) }}\n </button>\n </div>\n\n <!-- Chips (valor múltiplo removível + gatilho + resumo) -->\n <div v-else-if=\"field.type === 'chips'\" class=\"w-chips\">\n <span\n v-for=\"(chip, chipIndex) in chipEntries(field)\"\n :key=\"chip.key\"\n class=\"w-chips__chip\"\n >\n {{ chip.label }}\n <button\n type=\"button\"\n class=\"w-chips__remove\"\n :title=\"field.chipsRemoveLabel || 'Remover'\"\n :aria-label=\"field.chipsRemoveLabel || 'Remover'\"\n :disabled=\"isFieldDisabled(field)\"\n @click=\"removeChip(field, chipIndex)\"\n >\n <i class=\"pi pi-times\" />\n </button>\n </span>\n\n <span\n v-if=\"!chipEntries(field).length && field.chipsEmptyLabel\"\n class=\"w-chips__empty\"\n >\n {{ field.chipsEmptyLabel }}\n </span>\n\n <slot\n :name=\"`chips-trigger-${field.field}`\"\n :field=\"field\"\n :form-data=\"formData\"\n :disabled=\"isFieldDisabled(field)\"\n :set-form-field=\"(f: string, v: unknown) => emit('update:field', f, v)\"\n />\n\n <span class=\"w-chips__summary\">\n <slot\n :name=\"`chips-summary-${field.field}`\"\n :field=\"field\"\n :form-data=\"formData\"\n :items=\"chipEntries(field)\"\n />\n </span>\n </div>\n\n <small v-if=\"cepError[field.field]\" class=\"w-crud-form-cep-error\">\n {{ cepError[field.field] }}\n </small>\n <small v-else-if=\"fieldErrors[field.field]\" class=\"w-crud-form-error\">\n {{ fieldErrors[field.field] }}\n </small>\n </div>\n </slot>\n </template>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport Dialog from 'primevue/dialog'\nimport Button from 'primevue/button'\nimport type { FieldDef } from '@/types/field'\nimport WFormRenderer from '@/components/form/WFormRenderer.vue'\nimport { useFormKeyboardNav } from '@/composables/useFormKeyboardNav'\n\nconst props = withDefaults(\n defineProps<{\n visible: boolean\n title: string\n fields: FieldDef[]\n formData: Record<string, unknown>\n isEditing: boolean\n saving: boolean\n disabled?: boolean\n width?: string\n /** Nº de colunas do grid do form (repassado ao WFormRenderer; default 2). */\n formColumns?: number\n /** Navegação por teclado estilo desktop: foca o 1º campo ao abrir e o Enter\n * pula para o próximo campo até o botão de salvar. Opt-in. */\n keyboardNav?: boolean\n }>(),\n {\n width: '480px',\n disabled: false,\n formColumns: undefined,\n },\n)\n\nconst emit = defineEmits<{\n 'update:visible': [value: boolean]\n 'update:field': [field: string, value: unknown]\n save: []\n}>()\n\nconst rendererRef = ref<InstanceType<typeof WFormRenderer> | null>(null)\nconst formRef = ref<HTMLFormElement | null>(null)\n\nfunction onSave() {\n if (rendererRef.value) {\n const errors = rendererRef.value.validateAll()\n if (errors.length === 0) {\n emit('save')\n }\n } else {\n emit('save')\n }\n}\n\n// Navegação por teclado (opt-in) — sem watchers: @keydown no <form> + @show no Dialog.\nconst { focusFirst, handleKeydown } = useFormKeyboardNav(formRef, {\n enabled: () => props.keyboardNav === true,\n onSubmit: onSave,\n})\n\n// Clear errors when dialog opens\nwatch(\n () => props.visible,\n (val) => {\n if (val && rendererRef.value) {\n rendererRef.value.clearErrors()\n }\n },\n)\n</script>\n\n<template>\n <Dialog\n :visible=\"visible\"\n :header=\"title\"\n :style=\"{ width }\"\n modal\n :draggable=\"false\"\n class=\"w-crud-form-dialog\"\n @update:visible=\"emit('update:visible', $event)\"\n @show=\"focusFirst\"\n >\n <form ref=\"formRef\" class=\"w-crud-form\" @submit.prevent=\"onSave\" @keydown=\"handleKeydown\">\n <WFormRenderer\n ref=\"rendererRef\"\n :fields=\"fields\"\n :form-data=\"formData\"\n :is-editing=\"isEditing\"\n :disabled=\"disabled\"\n :columns=\"formColumns\"\n @update:field=\"(f, v) => emit('update:field', f, v)\"\n >\n <!-- Forward field-* slots from parent -->\n <template\n v-for=\"field in fields\"\n :key=\"`fwd-${field.field}`\"\n #[`field-${field.field}`]=\"slotData\"\n >\n <slot :name=\"`field-${field.field}`\" v-bind=\"slotData\" />\n </template>\n <!-- Forward image-* slots from parent -->\n <template\n v-for=\"field in fields.filter((f) => f.type === 'image')\"\n :key=\"`img-${field.field}`\"\n #[`image-${field.field}`]=\"slotData\"\n >\n <slot :name=\"`image-${field.field}`\" v-bind=\"slotData\" />\n </template>\n </WFormRenderer>\n\n <!-- Footer -->\n <div class=\"w-crud-form-footer\">\n <slot name=\"footer\" :saving=\"saving\" :disabled=\"disabled\">\n <Button\n type=\"button\"\n :label=\"disabled ? 'Fechar' : 'Cancelar'\"\n severity=\"secondary\"\n text\n :disabled=\"saving\"\n data-kbd-skip\n @click=\"emit('update:visible', false)\"\n />\n <Button\n v-if=\"!disabled\"\n type=\"submit\"\n :label=\"isEditing ? 'Atualizar' : 'Salvar'\"\n icon=\"pi pi-check\"\n :loading=\"saving\"\n />\n </slot>\n </div>\n </form>\n </Dialog>\n</template>\n","import type { ColumnDef } from '@/types/column'\n\nexport interface ToCsvOptions {\n /** Field separator (default: ';' — friendly to pt-BR Excel). */\n separator?: string\n}\n\nfunction cellValue(col: ColumnDef, row: Record<string, unknown>): string {\n const raw = row[col.field]\n if (col.format) return col.format(raw, row)\n if (raw === null || raw === undefined) return ''\n if (typeof raw === 'boolean') return raw ? 'Sim' : 'Não'\n return String(raw)\n}\n\nfunction escapeCell(value: string, separator: string): string {\n if (\n value.includes('\"') ||\n value.includes(separator) ||\n value.includes('\\n') ||\n value.includes('\\r')\n ) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`\n }\n return value\n}\n\n/**\n * Serialize rows into a CSV string respecting the given (visible) columns.\n * Uses the column `format` callback when present, prepends a UTF-8 BOM so\n * Excel renders accents correctly, and defaults to `;` as the separator.\n */\nexport function toCsv(\n rows: Record<string, unknown>[],\n columns: ColumnDef[],\n options: ToCsvOptions = {},\n): string {\n const sep = options.separator ?? ';'\n const header = columns.map((c) => escapeCell(c.header, sep)).join(sep)\n const lines = rows.map((row) => columns.map((c) => escapeCell(cellValue(c, row), sep)).join(sep))\n return '' + [header, ...lines].join('\\r\\n')\n}\n\n/** Trigger a browser download of a CSV string. */\nexport function downloadCsv(csv: string, filename = 'export.csv'): void {\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = filename\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n URL.revokeObjectURL(url)\n}\n","<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch, useSlots } from 'vue'\nimport DataTable from 'primevue/datatable'\nimport Column from 'primevue/column'\nimport Button from 'primevue/button'\nimport InputText from 'primevue/inputtext'\nimport InputNumber from 'primevue/inputnumber'\nimport Select from 'primevue/select'\nimport Popover from 'primevue/popover'\nimport Checkbox from 'primevue/checkbox'\nimport IconField from 'primevue/iconfield'\nimport InputIcon from 'primevue/inputicon'\nimport Paginator from 'primevue/paginator'\nimport ContextMenu from 'primevue/contextmenu'\nimport Dialog from 'primevue/dialog'\nimport WCrudColumnRenderer from './WCrudColumnRenderer.vue'\nimport WCrudFormDialog from './WCrudFormDialog.vue'\nimport type { CrudManagerReturn } from '@/types/manager'\nimport type { RowAction } from '@/types/action'\nimport type { ColumnDef } from '@/types/column'\nimport type { FieldDef } from '@/types/field'\nimport type { KpiItem } from '@/types/kpi'\nimport type { MenuItem } from 'primevue/menuitem'\nimport type { Slots } from 'vue'\nimport { useFormatters } from '@/composables/useFormatters'\nimport { toCsv, downloadCsv } from '@/utils/csv'\n\nconst props = withDefaults(\n defineProps<{\n // WCrudView é agnóstico ao tipo do registro (trata linhas como Record<string, unknown>\n // internamente); a prop aceita o CrudManagerReturn de qualquer T do consumidor.\n // TODO(tipagem): tornar o componente genérico <T> e tipar selectedRow/eventos.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n crud: CrudManagerReturn<any>\n title: string\n subtitle?: string\n showSearch?: boolean\n showHeader?: boolean\n dialogWidth?: string\n /** Nº de colunas do grid do form dialog (default: `formColumns` da config\n * do useCrudManager, senão 2). */\n formColumns?: number\n autoInit?: boolean\n showKpi?: boolean\n kpiIcon?: string\n kpiLabel?: string\n extraKpis?: KpiItem[]\n expandable?: boolean\n viewToggle?: boolean\n defaultView?: 'table' | 'cards'\n cardFields?: number\n /** Cards \"sem moldura\": remove o chrome padrão do card (borda/sombra/padding/\n * seleção) para o slot `#card` desenhar o card inteiro (ex.: um card de design\n * próprio). O wrapper vira só a célula do grid. */\n cardBare?: boolean\n actionRail?: boolean\n contextMenu?: boolean\n showPrint?: boolean\n exportCsv?: boolean\n csvFilename?: string\n csvScope?: 'all' | 'page'\n csvPageSize?: number\n /** Chave de persistência do estado de coluna (visibilidade) em localStorage.\n * Opt-in: quando definida, exibe o seletor de colunas e persiste o que foi ocultado. */\n persistState?: string\n }>(),\n {\n showSearch: true,\n showHeader: true,\n dialogWidth: '480px',\n autoInit: true,\n showKpi: false,\n kpiIcon: 'pi pi-list',\n kpiLabel: 'Total de Registros',\n extraKpis: () => [],\n expandable: false,\n viewToggle: true,\n defaultView: 'table',\n cardFields: 4,\n actionRail: true,\n contextMenu: true,\n showPrint: false,\n exportCsv: true,\n csvFilename: 'export.csv',\n csvScope: 'all',\n csvPageSize: 200,\n },\n)\n\nconst emit = defineEmits<{\n 'row-expand': [data: unknown]\n 'row-collapse': [data: unknown]\n print: [data: Record<string, unknown>]\n}>()\n\nconst slots: Slots = useSlots()\nconst { formatNumber } = useFormatters()\n\nconst expandedRows = ref({})\n\n// --- Display mode (table / cards) ---\n\n// Persistência do modo de visualização (opt-in via `persistState`): a escolha do\n// usuário fica em localStorage sob a MESMA chave base do grid (rota + grid, provida\n// pelo consumidor). Leitura síncrona no setup evita flash table→cards. Default =\n// `defaultView` (por padrão 'table' = linha).\nfunction viewKey(): string | null {\n return props.persistState ? `wcrud:view:${props.persistState}` : null\n}\nfunction loadView(): 'table' | 'cards' {\n const key = viewKey()\n if (key) {\n const stored = localStorage.getItem(key)\n if (stored === 'table' || stored === 'cards') return stored\n }\n return props.defaultView\n}\nconst displayMode = ref<'table' | 'cards'>(loadView())\nfunction isView(mode: 'table' | 'cards'): boolean {\n return displayMode.value === mode\n}\nfunction setView(mode: 'table' | 'cards'): void {\n displayMode.value = mode\n const key = viewKey()\n if (key) localStorage.setItem(key, mode)\n}\nconst paginatorFirst = computed(\n () => (props.crud.pagination.page - 1) * props.crud.pagination.pageSize,\n)\n\n// --- Columns ---\n\n// Estado de coluna (opt-in via persistState): visibilidade persistida em localStorage.\nconst columnState = reactive<{ hidden: string[] }>({ hidden: [] })\nconst chooser = ref<InstanceType<typeof Popover> | null>(null)\nfunction colStateKey(): string | null {\n return props.persistState ? `wcrud:cols:${props.persistState}` : null\n}\nfunction loadColumnState() {\n const key = colStateKey()\n if (!key) return\n try {\n const parsed = JSON.parse(localStorage.getItem(key) || '{}')\n if (Array.isArray(parsed.hidden)) columnState.hidden = parsed.hidden\n } catch {\n /* estado inválido — ignora */\n }\n}\nfunction saveColumnState() {\n const key = colStateKey()\n if (key) localStorage.setItem(key, JSON.stringify({ hidden: columnState.hidden }))\n}\n\n// Estado de FILTROS (opt-in via persistState): filtros de coluna + busca ficam em\n// localStorage sob a mesma chave base do grid (rota + grid). Restaurados ANTES do\n// primeiro fetch, então o F5 mantém os últimos filtros aplicados.\nfunction filtersKey(): string | null {\n return props.persistState ? `wcrud:filters:${props.persistState}` : null\n}\nfunction loadFilters() {\n const key = filtersKey()\n if (!key) return\n try {\n const parsed = JSON.parse(localStorage.getItem(key) || '{}')\n if (parsed && typeof parsed.columnFilters === 'object' && parsed.columnFilters) {\n for (const [k, v] of Object.entries(parsed.columnFilters)) {\n if (v !== null && v !== undefined && v !== '') props.crud.columnFilters[k] = v\n }\n }\n if (typeof parsed.search === 'string' && parsed.search) {\n props.crud.search.value = parsed.search\n }\n } catch {\n /* estado inválido — ignora */\n }\n}\nfunction saveFilters() {\n const key = filtersKey()\n if (!key) return\n localStorage.setItem(\n key,\n JSON.stringify({\n columnFilters: { ...props.crud.columnFilters },\n search: props.crud.search.value,\n }),\n )\n}\nwatch(props.crud.columnFilters, saveFilters, { deep: true })\nwatch(props.crud.search, saveFilters)\n// Colunas base (respeita visible:false do consumidor) — fonte do seletor de colunas.\nconst baseColumns = computed(() => props.crud.config.columns.filter((c) => c.visible !== false))\nfunction toggleColumn(field: string, visible: boolean) {\n columnState.hidden = visible\n ? columnState.hidden.filter((f) => f !== field)\n : [...new Set([...columnState.hidden, field])]\n saveColumnState()\n}\n\nconst visibleColumns = computed(() =>\n props.crud.config.columns\n .filter((c) => c.visible !== false && !columnState.hidden.includes(c.field))\n .map((c) => {\n if (c.type === 'number' && !c.align) return { ...c, align: 'right' as const }\n if (c.type === 'currency' && !c.align) return { ...c, align: 'right' as const }\n return c\n }),\n)\n\nfunction colAlignClass(col: { align?: string }) {\n if (col.align === 'right') return 'text-right'\n if (col.align === 'center') return 'text-center'\n return undefined\n}\n\nconst cardColumns = computed(() => visibleColumns.value.slice(0, props.cardFields))\n\n// --- Row Actions ---\n\nconst defaultActions = computed<RowAction[]>(() => {\n const actions: RowAction[] = []\n if (props.crud.config.canEdit !== false) {\n actions.push({ action: 'edit', icon: 'pi pi-pencil', tooltip: 'Editar' })\n }\n if (props.crud.config.canCreate !== false) {\n actions.push({\n action: 'duplicate',\n icon: 'pi pi-copy',\n tooltip: 'Duplicar',\n severity: 'info',\n })\n }\n if (props.crud.config.canDelete !== false) {\n actions.push({\n action: 'delete',\n icon: 'pi pi-trash',\n tooltip: 'Excluir',\n severity: 'danger',\n })\n }\n return actions\n})\n\nconst effectiveRowActions = computed<RowAction[]>(\n () => props.crud.config.rowActions ?? defaultActions.value,\n)\n\nconst hasActions = computed(\n () => effectiveRowActions.value.length > 0 || Boolean(slots['row-actions']),\n)\n\nfunction handleRowAction(action: RowAction, data: Record<string, unknown>) {\n // Custom handler tem prioridade — permite sobrescrever ações nomeadas.\n if (action.handler) {\n action.handler(data)\n return\n }\n if (action.action === 'edit') {\n props.crud.openEditDialog(data)\n } else if (action.action === 'view') {\n props.crud.openViewDialog(data)\n } else if (action.action === 'duplicate') {\n props.crud.openDuplicateDialog(data)\n } else if (action.action === 'delete') {\n // Com slot `delete-message`, usa o diálogo próprio (permite conteúdo rico,\n // ex.: avisos por registro); senão, o confirm de serviço padrão.\n if (slots['delete-message']) {\n deleteTarget.value = data\n deleteDialogVisible.value = true\n } else {\n props.crud.confirmDelete(data)\n }\n }\n}\n\n// --- Diálogo de exclusão próprio (só quando há slot `delete-message`) ---\nconst deleteTarget = ref<Record<string, unknown> | null>(null)\nconst deleteDialogVisible = ref(false)\nconst deleting = ref(false)\n\nasync function onConfirmDelete() {\n if (!deleteTarget.value) return\n deleting.value = true\n try {\n await props.crud.performDelete(deleteTarget.value)\n deleteDialogVisible.value = false\n deleteTarget.value = null\n } finally {\n deleting.value = false\n }\n}\n\nfunction isActionVisible(action: RowAction, data: Record<string, unknown>): boolean {\n if (action.visible) return action.visible(data)\n return true\n}\n\nfunction isActionDisabled(action: RowAction, data: Record<string, unknown>): boolean {\n if (action.disabled) return action.disabled(data)\n return false\n}\n\n// --- KPIs ---\n\nconst allKpis = computed<KpiItem[]>(() => {\n const kpis: KpiItem[] = []\n if (props.showKpi) {\n kpis.push({\n icon: props.kpiIcon,\n label: props.kpiLabel,\n value: formatNumber(props.crud.pagination.rows, 0),\n })\n }\n kpis.push(...props.extraKpis)\n return kpis\n})\n\nconst canCreate = computed(() => props.crud.config.canCreate !== false)\n\n// --- Selection (drives action rail + context menu) ---\n\nconst selectedRow = ref<Record<string, unknown> | null>(null)\n\n// Seleção múltipla — opt-in via config.selectionMode: 'multiple'.\nconst isMultiSelect = computed(() => props.crud.config.selectionMode === 'multiple')\n\n// Edição inline por célula — opt-in via config.editMode: 'cell'.\nconst isCellEdit = computed(() => props.crud.config.editMode === 'cell')\nconst formFieldMap = computed(() => new Map(props.crud.config.form.map((f) => [f.field, f])))\nconst INLINE_TYPES = ['text', 'email', 'number', 'currency']\nfunction inlineField(field: string): FieldDef | undefined {\n const f = formFieldMap.value.get(field)\n return f && INLINE_TYPES.includes(f.type || 'text') ? f : undefined\n}\nfunction onCellEditComplete(e: {\n data: Record<string, unknown>\n field: string\n value?: unknown\n newValue: unknown\n}) {\n if (e.newValue === (e.value ?? e.data[e.field])) return\n props.crud.updateField(e.data, e.field, e.newValue)\n}\n\n// Filtros declarativos de coluna.\nconst filterableColumns = computed<ColumnDef[]>(() =>\n props.crud.config.columns.filter((c) => c.filter),\n)\nconst booleanFilterOptions = [\n { label: 'Sim', value: true },\n { label: 'Não', value: false },\n]\nfunction fParam(col: ColumnDef): string {\n return col.filter?.param || col.field\n}\nconst filterTimers: Record<string, ReturnType<typeof setTimeout>> = {}\nfunction onTextFilter(col: ColumnDef, value: string) {\n const param = fParam(col)\n if (filterTimers[param]) clearTimeout(filterTimers[param])\n filterTimers[param] = setTimeout(() => props.crud.setColumnFilter(param, value || null), 300)\n}\nconst cm = ref<InstanceType<typeof ContextMenu> | null>(null)\n\nfunction selectRow(row: Record<string, unknown>) {\n selectedRow.value = row\n}\n\nfunction onRowContextMenu(event: { originalEvent: Event; data: Record<string, unknown> }) {\n if (!props.contextMenu) return\n selectedRow.value = event.data\n cm.value?.show(event.originalEvent)\n}\n\nfunction onCardContextMenu(event: MouseEvent, row: Record<string, unknown>) {\n if (!props.contextMenu) return\n event.preventDefault()\n selectedRow.value = row\n cm.value?.show(event)\n}\n\nconst contextMenuItems = computed<MenuItem[]>(() => {\n const row = selectedRow.value\n if (!row) return []\n const items: MenuItem[] = [\n {\n label: 'Ver detalhes',\n icon: 'pi pi-eye',\n command: () => props.crud.openViewDialog(row),\n },\n ]\n // Todas as actions (default + customizadas) entram aqui.\n for (const action of effectiveRowActions.value) {\n if (!isActionVisible(action, row)) continue\n items.push({\n label: action.tooltip ?? action.action,\n icon: action.icon,\n class: action.severity === 'danger' ? 'w-crud-ctx-danger' : undefined,\n disabled: isActionDisabled(action, row),\n command: () => handleRowAction(action, row),\n })\n }\n if (props.showPrint) {\n items.push({\n label: 'Imprimir',\n icon: 'pi pi-print',\n command: () => emit('print', row),\n })\n }\n if (props.exportCsv) {\n items.push({ separator: true })\n items.push({\n label: props.csvScope === 'all' ? 'Exportar tudo (CSV)' : 'Exportar página (CSV)',\n icon: 'pi pi-download',\n command: () => doExportCsv(),\n })\n }\n return items\n})\n\n// --- Action rail handlers ---\n\nfunction railPrint() {\n if (selectedRow.value) emit('print', selectedRow.value)\n}\n\n// --- CSV export (visible columns) ---\n\nconst exporting = ref(false)\n\nasync function doExportCsv() {\n if (exporting.value) return\n exporting.value = true\n try {\n const rows =\n props.csvScope === 'page'\n ? props.crud.items.value\n : await props.crud.fetchAll(props.csvPageSize)\n const csv = toCsv(rows, visibleColumns.value)\n downloadCsv(csv, props.csvFilename)\n } finally {\n exporting.value = false\n }\n}\n\n// --- Init ---\n\nonMounted(() => {\n loadColumnState()\n loadFilters() // restaura filtros/busca ANTES do init para o fetch já sair filtrado\n if (props.autoInit) {\n props.crud.init()\n }\n})\n</script>\n\n<template>\n <div class=\"w-crud\">\n <!-- Header -->\n <div v-if=\"showHeader\" class=\"w-crud-header\">\n <div class=\"w-crud-header-content\">\n <h1 class=\"w-crud-title\">{{ title }}</h1>\n <p v-if=\"subtitle\" class=\"w-crud-subtitle\">{{ subtitle }}</p>\n </div>\n <div class=\"w-crud-header-actions\">\n <slot name=\"header-actions\" />\n <Button\n v-if=\"canCreate && !actionRail\"\n label=\"Novo\"\n icon=\"pi pi-plus\"\n @click=\"crud.openCreateDialog()\"\n />\n </div>\n </div>\n\n <!-- KPIs -->\n <slot name=\"before-table\">\n <div v-if=\"allKpis.length\" class=\"w-crud-kpis\">\n <div v-for=\"(kpi, idx) in allKpis\" :key=\"idx\" class=\"w-crud-kpi\">\n <div :class=\"['w-crud-kpi-icon', kpi.severity ? `w-crud-kpi-icon--${kpi.severity}` : '']\">\n <i :class=\"[kpi.icon]\" :style=\"kpi.color ? `color: ${kpi.color}` : ''\" />\n </div>\n <div class=\"w-crud-kpi-content\">\n <div class=\"w-crud-kpi-label\">{{ kpi.label }}</div>\n <div class=\"w-crud-kpi-value\">{{ kpi.value }}</div>\n </div>\n </div>\n </div>\n </slot>\n\n <!-- Content (table/cards + optional action rail) -->\n <div class=\"w-crud-content\" :class=\"{ 'w-crud-content--rail': actionRail }\">\n <div class=\"w-crud-content-main\">\n <!-- Barra de filtros de coluna (declarativos, opt-in via ColumnDef.filter) -->\n <div\n v-if=\"filterableColumns.length\"\n class=\"w-crud-filters\"\n style=\"\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-items: center;\n margin-bottom: 0.75rem;\n \"\n >\n <template v-for=\"col in filterableColumns\" :key=\"col.field\">\n <InputText\n v-if=\"(col.filter?.type || 'text') === 'text'\"\n :model-value=\"(crud.columnFilters[fParam(col)] as string) ?? ''\"\n :placeholder=\"col.filter?.placeholder || col.header\"\n size=\"small\"\n @input=\"(e: Event) => onTextFilter(col, (e.target as HTMLInputElement).value)\"\n />\n <Select\n v-else-if=\"col.filter?.type === 'select'\"\n :model-value=\"crud.columnFilters[fParam(col)]\"\n :options=\"col.filter?.options\"\n option-label=\"label\"\n option-value=\"value\"\n :placeholder=\"col.filter?.placeholder || col.header\"\n show-clear\n size=\"small\"\n @update:model-value=\"(v: unknown) => crud.setColumnFilter(fParam(col), v)\"\n />\n <Select\n v-else-if=\"col.filter?.type === 'boolean'\"\n :model-value=\"crud.columnFilters[fParam(col)]\"\n :options=\"booleanFilterOptions\"\n option-label=\"label\"\n option-value=\"value\"\n :placeholder=\"col.filter?.placeholder || col.header\"\n show-clear\n size=\"small\"\n @update:model-value=\"(v: unknown) => crud.setColumnFilter(fParam(col), v)\"\n />\n <InputNumber\n v-else-if=\"col.filter?.type === 'numeric'\"\n :model-value=\"(crud.columnFilters[fParam(col)] as number) ?? null\"\n :placeholder=\"col.filter?.placeholder || col.header\"\n size=\"small\"\n @update:model-value=\"(v: number) => crud.setColumnFilter(fParam(col), v)\"\n />\n </template>\n <Button\n v-if=\"Object.keys(crud.columnFilters).length\"\n label=\"Limpar filtros\"\n icon=\"pi pi-filter-slash\"\n text\n size=\"small\"\n @click=\"crud.clearColumnFilters()\"\n />\n </div>\n\n <!-- Table -->\n <div v-if=\"displayMode === 'table'\" class=\"w-crud-table\">\n <!-- Barra de ações em lote (seleção múltipla) -->\n <div\n v-if=\"isMultiSelect && crud.selectedItems.value.length\"\n class=\"w-crud-bulkbar\"\n style=\"\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.5rem;\n padding: 0.5rem 0.75rem;\n border-radius: 8px;\n background: var(--p-primary-50, #eef2ff);\n color: var(--p-primary-700, #3730a3);\n \"\n >\n <span style=\"font-weight: 600; font-size: 0.85rem; margin-right: auto\">\n {{ crud.selectedItems.value.length }} selecionado(s)\n </span>\n <slot name=\"bulk-actions\" :selected=\"crud.selectedItems.value\" :crud=\"crud\">\n <Button\n v-for=\"ba in crud.config.bulkActions || []\"\n :key=\"ba.action\"\n :label=\"ba.label\"\n :icon=\"ba.icon\"\n :severity=\"ba.severity\"\n size=\"small\"\n :disabled=\"ba.disabled ? ba.disabled(crud.selectedItems.value) : false\"\n @click=\"ba.handler(crud.selectedItems.value)\"\n />\n </slot>\n <Button\n v-tooltip.top=\"'Limpar seleção'\"\n icon=\"pi pi-times\"\n text\n rounded\n size=\"small\"\n @click=\"crud.clearSelection()\"\n />\n </div>\n <DataTable\n v-model:expanded-rows=\"expandedRows\"\n :value=\"crud.items.value\"\n :loading=\"crud.loading.value\"\n paginator\n :rows=\"crud.pagination.pageSize\"\n :total-records=\"crud.pagination.rows\"\n :rows-per-page-options=\"[10, 20, 50]\"\n paginator-template=\"CurrentPageReport PrevPageLink NextPageLink\"\n current-page-report-template=\"Página {currentPage} de {totalPages}\"\n :pt=\"{ pcPaginator: { root: { class: 'w-crud-paginator' } } }\"\n lazy\n striped-rows\n removable-sort\n size=\"small\"\n :sort-field=\"crud.sort.field ?? undefined\"\n :sort-order=\"crud.sort.order\"\n :data-key=\"crud.config.pk || 'id'\"\n :edit-mode=\"isCellEdit ? 'cell' : undefined\"\n :selection=\"\n isMultiSelect\n ? crud.selectedItems.value\n : actionRail || contextMenu\n ? selectedRow\n : undefined\n \"\n :selection-mode=\"\n isMultiSelect ? undefined : actionRail || contextMenu ? 'single' : undefined\n \"\n :context-menu=\"contextMenu\"\n :context-menu-selection=\"contextMenu ? selectedRow : undefined\"\n @update:selection=\"\n (v: any) => (isMultiSelect ? (crud.selectedItems.value = v) : (selectedRow = v))\n \"\n @update:context-menu-selection=\"(v: any) => (selectedRow = v)\"\n @row-contextmenu=\"onRowContextMenu\"\n @page=\"crud.onPage\"\n @sort=\"(e: any) => crud.onSort({ sortField: e.sortField, sortOrder: e.sortOrder })\"\n @row-expand=\"(e) => emit('row-expand', e.data)\"\n @row-collapse=\"(e) => emit('row-collapse', e.data)\"\n @cell-edit-complete=\"onCellEditComplete\"\n >\n <template #header>\n <div class=\"w-crud-toolbar\">\n <div class=\"w-crud-toolbar-start\">\n <IconField v-if=\"showSearch\">\n <InputIcon class=\"pi pi-search\" />\n <InputText\n :model-value=\"crud.search.value\"\n placeholder=\"Buscar...\"\n class=\"w-72\"\n @input=\"crud.onSearch\"\n />\n </IconField>\n <slot name=\"toolbar-start\" />\n <slot name=\"toolbar-filters\" />\n </div>\n <div class=\"w-crud-toolbar-end\">\n <slot name=\"toolbar-actions\" />\n <template v-if=\"persistState\">\n <Button\n v-tooltip.top=\"'Colunas'\"\n icon=\"pi pi-sliders-h\"\n text\n size=\"small\"\n @click=\"(e) => chooser?.toggle(e)\"\n />\n <Popover ref=\"chooser\">\n <div\n style=\"\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n min-width: 180px;\n \"\n >\n <div\n v-for=\"col in baseColumns\"\n :key=\"col.field\"\n style=\"display: flex; align-items: center; gap: 0.5rem\"\n >\n <Checkbox\n :model-value=\"!columnState.hidden.includes(col.field)\"\n :input-id=\"`wcrud-col-${col.field}`\"\n binary\n @update:model-value=\"(v) => toggleColumn(col.field, !!v)\"\n />\n <label\n :for=\"`wcrud-col-${col.field}`\"\n style=\"font-size: 0.85rem; cursor: pointer\"\n >\n {{ col.header }}\n </label>\n </div>\n </div>\n </Popover>\n </template>\n <Button\n v-if=\"exportCsv\"\n v-tooltip.top=\"\n csvScope === 'all' ? 'Exportar tudo (CSV)' : 'Exportar página (CSV)'\n \"\n icon=\"pi pi-download\"\n text\n size=\"small\"\n :loading=\"exporting\"\n @click=\"doExportCsv\"\n />\n <div v-if=\"viewToggle\" class=\"w-crud-view-toggle\">\n <Button\n icon=\"pi pi-table\"\n size=\"small\"\n :text=\"!isView('table')\"\n :outlined=\"isView('table')\"\n @click=\"setView('table')\"\n />\n <Button\n icon=\"pi pi-th-large\"\n size=\"small\"\n :text=\"!isView('cards')\"\n :outlined=\"isView('cards')\"\n @click=\"setView('cards')\"\n />\n </div>\n <Button\n v-if=\"!showHeader && canCreate && !actionRail\"\n label=\"Novo\"\n icon=\"pi pi-plus\"\n @click=\"crud.openCreateDialog()\"\n />\n </div>\n </div>\n </template>\n\n <template #empty>\n <slot name=\"empty\">\n <div class=\"w-crud-empty\">\n <div class=\"w-crud-empty-icon\">\n <i class=\"pi pi-inbox\" />\n </div>\n <p class=\"w-crud-empty-title\">Nenhum registro encontrado</p>\n <p class=\"w-crud-empty-text\">Tente ajustar sua busca ou crie um novo registro</p>\n </div>\n </slot>\n </template>\n\n <!-- Seleção múltipla (checkbox) -->\n <Column v-if=\"isMultiSelect\" selection-mode=\"multiple\" style=\"width: 3rem\" />\n\n <!-- Expander -->\n <Column v-if=\"expandable\" expander style=\"width: 3rem\" />\n\n <!-- Data columns -->\n <Column\n v-for=\"col in visibleColumns\"\n :key=\"col.field\"\n :field=\"col.field\"\n :header=\"col.header\"\n :sortable=\"col.sortable\"\n :style=\"col.style\"\n :header-class=\"colAlignClass(col)\"\n :body-class=\"colAlignClass(col)\"\n >\n <template #body=\"{ data }\">\n <slot :name=\"`column-${col.field}`\" :data=\"data\" :value=\"data[col.field]\">\n <WCrudColumnRenderer :column=\"col\" :value=\"data[col.field]\" :row-data=\"data\" />\n </slot>\n </template>\n <template v-if=\"isCellEdit && inlineField(col.field)\" #editor=\"{ data }\">\n <InputNumber\n v-if=\"['number', 'currency'].includes(inlineField(col.field)?.type || '')\"\n :model-value=\"(data[col.field] as number) ?? null\"\n fluid\n @update:model-value=\"\n (v) => {\n data[col.field] = v\n }\n \"\n />\n <InputText\n v-else\n :model-value=\"(data[col.field] as string) ?? ''\"\n fluid\n @update:model-value=\"\n (v) => {\n data[col.field] = v\n }\n \"\n />\n </template>\n </Column>\n\n <!-- Actions column (oculta quando a action rail está ativa) -->\n <Column\n v-if=\"hasActions && !actionRail\"\n header-class=\"w-crud-actions-header\"\n :style=\"{\n width: `${(effectiveRowActions.length + (slots['row-actions'] ? 1 : 0)) * 2.5 + 1}rem`,\n }\"\n >\n <template #body=\"{ data }\">\n <div class=\"w-crud-actions\">\n <template v-for=\"action in effectiveRowActions\" :key=\"action.action\">\n <Button\n v-if=\"isActionVisible(action, data)\"\n v-tooltip.top=\"action.tooltip\"\n :icon=\"action.icon\"\n text\n rounded\n size=\"small\"\n :severity=\"action.severity as any\"\n :disabled=\"isActionDisabled(action, data)\"\n @click=\"handleRowAction(action, data)\"\n />\n </template>\n <slot name=\"row-actions\" :data=\"data\" :crud=\"crud\" />\n </div>\n </template>\n </Column>\n\n <!-- Expansion -->\n <template v-if=\"expandable\" #expansion=\"slotProps\">\n <slot name=\"expansion\" :data=\"slotProps.data\" />\n </template>\n </DataTable>\n </div>\n\n <!-- Cards view -->\n <div v-else class=\"w-crud-cards-wrap\">\n <div class=\"w-crud-toolbar w-crud-toolbar--standalone\">\n <div class=\"w-crud-toolbar-start\">\n <IconField v-if=\"showSearch\">\n <InputIcon class=\"pi pi-search\" />\n <InputText\n :model-value=\"crud.search.value\"\n placeholder=\"Buscar...\"\n class=\"w-72\"\n @input=\"crud.onSearch\"\n />\n </IconField>\n <slot name=\"toolbar-start\" />\n <slot name=\"toolbar-filters\" />\n </div>\n <div class=\"w-crud-toolbar-end\">\n <slot name=\"toolbar-actions\" />\n <Button\n v-if=\"exportCsv\"\n v-tooltip.top=\"csvScope === 'all' ? 'Exportar tudo (CSV)' : 'Exportar página (CSV)'\"\n icon=\"pi pi-download\"\n text\n size=\"small\"\n :loading=\"exporting\"\n @click=\"doExportCsv\"\n />\n <div v-if=\"viewToggle\" class=\"w-crud-view-toggle\">\n <Button\n icon=\"pi pi-table\"\n size=\"small\"\n :text=\"!isView('table')\"\n :outlined=\"isView('table')\"\n @click=\"setView('table')\"\n />\n <Button\n icon=\"pi pi-th-large\"\n size=\"small\"\n :text=\"!isView('cards')\"\n :outlined=\"isView('cards')\"\n @click=\"setView('cards')\"\n />\n </div>\n <Button\n v-if=\"!showHeader && canCreate && !actionRail\"\n label=\"Novo\"\n icon=\"pi pi-plus\"\n @click=\"crud.openCreateDialog()\"\n />\n </div>\n </div>\n\n <div v-if=\"crud.loading.value\" class=\"w-crud-cards-loading\">\n <i class=\"pi pi-spin pi-spinner\" />\n </div>\n\n <slot v-else-if=\"!crud.items.value.length\" name=\"empty\">\n <div class=\"w-crud-empty\">\n <div class=\"w-crud-empty-icon\">\n <i class=\"pi pi-inbox\" />\n </div>\n <p class=\"w-crud-empty-title\">Nenhum registro encontrado</p>\n <p class=\"w-crud-empty-text\">Tente ajustar sua busca ou crie um novo registro</p>\n </div>\n </slot>\n\n <div v-else class=\"w-crud-cards\" :class=\"{ 'w-crud-cards--bare': cardBare }\">\n <div\n v-for=\"(row, idx) in crud.items.value\"\n :key=\"(row[crud.config.pk || 'id'] as string | number) ?? idx\"\n :class=\"\n cardBare\n ? 'w-crud-card-bare'\n : ['w-crud-card', { 'w-crud-card--selected': selectedRow === row }]\n \"\n @click=\"!cardBare && selectRow(row)\"\n @dblclick=\"!cardBare && crud.config.canEdit !== false && crud.openEditDialog(row)\"\n @contextmenu=\"!cardBare && onCardContextMenu($event, row)\"\n >\n <!-- Slot `card`: assume o CONTEÚDO do card (corpo + ações), mantendo o\n wrapper do WCrudView (chrome, seleção, dblclick-editar, contextmenu,\n toolbar/loading/empty/paginação). Sem o slot, cai no card padrão\n (título + label:valor das `cardColumns` + ações de linha). -->\n <slot name=\"card\" :data=\"row\" :crud=\"crud\" :columns=\"cardColumns\" :index=\"idx\">\n <div class=\"w-crud-card-body\">\n <div\n v-for=\"(col, ci) in cardColumns\"\n :key=\"col.field\"\n class=\"w-crud-card-row\"\n :class=\"{ 'w-crud-card-row--title': ci === 0 }\"\n >\n <span v-if=\"ci !== 0\" class=\"w-crud-card-label\">{{ col.header }}</span>\n <span class=\"w-crud-card-value\">\n <slot :name=\"`column-${col.field}`\" :data=\"row\" :value=\"row[col.field]\">\n <WCrudColumnRenderer\n :column=\"col\"\n :value=\"row[col.field]\"\n :row-data=\"row\"\n />\n </slot>\n </span>\n </div>\n </div>\n <div v-if=\"hasActions && !actionRail\" class=\"w-crud-card-actions\">\n <template v-for=\"action in effectiveRowActions\" :key=\"action.action\">\n <Button\n v-if=\"isActionVisible(action, row)\"\n v-tooltip.top=\"action.tooltip\"\n :icon=\"action.icon\"\n text\n rounded\n size=\"small\"\n :severity=\"action.severity as any\"\n :disabled=\"isActionDisabled(action, row)\"\n @click=\"handleRowAction(action, row)\"\n />\n </template>\n <slot name=\"row-actions\" :data=\"row\" :crud=\"crud\" />\n </div>\n </slot>\n </div>\n </div>\n\n <Paginator\n v-if=\"crud.items.value.length\"\n :rows=\"crud.pagination.pageSize\"\n :total-records=\"crud.pagination.rows\"\n :first=\"paginatorFirst\"\n :rows-per-page-options=\"[10, 20, 50]\"\n template=\"CurrentPageReport PrevPageLink NextPageLink\"\n current-page-report-template=\"Página {currentPage} de {totalPages}\"\n class=\"w-crud-paginator\"\n @page=\"crud.onPage\"\n />\n </div>\n </div>\n <!-- /.w-crud-content-main -->\n\n <!-- Floating action rail (todas as actions vivem aqui) -->\n <aside v-if=\"actionRail\" class=\"w-crud-rail\">\n <Button\n v-if=\"canCreate\"\n v-tooltip.left=\"'Novo'\"\n icon=\"pi pi-plus\"\n rounded\n @click=\"crud.openCreateDialog()\"\n />\n <div v-if=\"canCreate && effectiveRowActions.length\" class=\"w-crud-rail-sep\" />\n <template v-for=\"action in effectiveRowActions\" :key=\"action.action\">\n <Button\n v-if=\"!selectedRow || isActionVisible(action, selectedRow)\"\n v-tooltip.left=\"action.tooltip\"\n :icon=\"action.icon\"\n text\n rounded\n :severity=\"action.severity as any\"\n :disabled=\"!selectedRow || isActionDisabled(action, selectedRow)\"\n @click=\"selectedRow && handleRowAction(action, selectedRow)\"\n />\n </template>\n <slot name=\"rail-actions\" :selected=\"selectedRow\" :crud=\"crud\" />\n <div v-if=\"showPrint || exportCsv\" class=\"w-crud-rail-sep\" />\n <Button\n v-if=\"showPrint\"\n v-tooltip.left=\"'Imprimir'\"\n icon=\"pi pi-print\"\n text\n rounded\n :disabled=\"!selectedRow\"\n @click=\"railPrint\"\n />\n <Button\n v-if=\"exportCsv\"\n v-tooltip.left=\"csvScope === 'all' ? 'Exportar tudo (CSV)' : 'Exportar página (CSV)'\"\n icon=\"pi pi-download\"\n text\n rounded\n :loading=\"exporting\"\n @click=\"doExportCsv\"\n />\n </aside>\n </div>\n <!-- /.w-crud-content -->\n\n <!-- Context menu -->\n <ContextMenu v-if=\"contextMenu\" ref=\"cm\" :model=\"contextMenuItems\" />\n\n <!-- Form Dialog -->\n <slot name=\"form-dialog\" :crud=\"crud\" :dialog-width=\"dialogWidth\">\n <WCrudFormDialog\n :visible=\"crud.dialogVisible.value\"\n :title=\"crud.dialogTitle.value\"\n :fields=\"crud.config.form\"\n :form-data=\"crud.formData\"\n :is-editing=\"crud.isEditing.value\"\n :saving=\"crud.saving.value\"\n :disabled=\"crud.viewMode?.value ?? false\"\n :width=\"dialogWidth\"\n :form-columns=\"formColumns ?? crud.config.formColumns\"\n :keyboard-nav=\"crud.config.keyboardNav\"\n @update:visible=\"\n (v) => {\n crud.dialogVisible.value = v\n if (!v) crud.editingItem.value = null\n }\n \"\n @update:field=\"(field, val) => crud.setFormField(field, val)\"\n @save=\"crud.save()\"\n >\n <template\n v-for=\"field in crud.config.form\"\n :key=\"field.field\"\n #[`field-${field.field}`]=\"scope\"\n >\n <slot :name=\"`field-${field.field}`\" v-bind=\"scope\" />\n </template>\n </WCrudFormDialog>\n </slot>\n\n <!-- Diálogo de exclusão próprio: renderizado só quando o consumidor fornece\n o slot `delete-message` (permite conteúdo rico por registro). -->\n <Dialog\n v-if=\"$slots['delete-message']\"\n v-model:visible=\"deleteDialogVisible\"\n header=\"Confirmar Exclusão\"\n modal\n :draggable=\"false\"\n class=\"w-crud-delete-dialog\"\n :style=\"{ width: '30rem' }\"\n >\n <slot name=\"delete-message\" :item=\"deleteTarget\" />\n <template #footer>\n <Button\n type=\"button\"\n label=\"Cancelar\"\n severity=\"secondary\"\n text\n :disabled=\"deleting\"\n @click=\"deleteDialogVisible = false\"\n />\n <Button\n type=\"button\"\n label=\"Excluir\"\n icon=\"pi pi-trash\"\n severity=\"danger\"\n :loading=\"deleting\"\n @click=\"onConfirmDelete\"\n />\n </template>\n </Dialog>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, isRef, ref } from 'vue'\nimport InputText from 'primevue/inputtext'\nimport InputNumber from 'primevue/inputnumber'\nimport Select from 'primevue/select'\nimport { useFormatters } from '@/composables/useFormatters'\nimport type { EditableColumnDef, EditableRow } from '@/types/editableTable'\n\n/**\n * Tabela editável sobre ESTADO LOCAL — o oposto do WCrudView, que conversa com a\n * API a cada operação. Aqui nada é persistido: o consumidor mantém o array e\n * salva em bloco quando quiser (o caso \"documento com filhos\", em que salvar\n * linha a linha criaria registro órfão).\n *\n * As linhas nunca são mutadas no lugar: toda edição emite um array NOVO com a\n * linha trocada (`update:modelValue`), então `v-model` funciona igual em `ref`,\n * `reactive` ou prop vinda de cima.\n *\n * A subtabela de insumos do design é este mesmo componente dentro do slot\n * `#expansion` — não existe componente separado para \"tabela filha\".\n */\nconst props = withDefaults(\n defineProps<{\n /** Linhas (`v-model`). */\n modelValue?: EditableRow[]\n columns?: EditableColumnDef[]\n /** Liga a coluna de expansão e o slot `#expansion`. */\n expandable?: boolean\n /** Rótulo do botão de adicionar. Omitido = sem botão (só o slot `#toolbar`). */\n addLabel?: string\n /** Liga a coluna da lixeira. */\n removable?: boolean\n emptyMessage?: string\n /** Rótulo da primeira célula do rodapé de totais. */\n footerLabel?: string\n /** Trava todos os editores (a tabela vira leitura). */\n disabled?: boolean\n /** Campo usado como `key` das linhas. Sem ele, a chave é o índice. */\n rowKey?: string\n }>(),\n {\n modelValue: () => [],\n columns: () => [],\n expandable: false,\n removable: false,\n emptyMessage: 'Nenhum item adicionado',\n footerLabel: 'Total',\n disabled: false,\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [rows: EditableRow[]]\n add: []\n remove: [row: EditableRow, index: number]\n}>()\n\nconst { formatNumber } = useFormatters()\n\n// --- Expansão --------------------------------------------------------------\n// Índice das linhas abertas. Várias podem ficar abertas ao mesmo tempo: a\n// expansão é detalhe de leitura, não navegação.\nconst expanded = ref<Set<number>>(new Set())\n\nfunction isExpanded(index: number): boolean {\n return expanded.value.has(index)\n}\n\nfunction toggleRow(index: number) {\n const next = new Set(expanded.value)\n if (next.has(index)) next.delete(index)\n else next.add(index)\n expanded.value = next\n}\n\n// --- Colunas ---------------------------------------------------------------\n\nfunction unwrapOptions(column: EditableColumnDef): Record<string, unknown>[] {\n const options = column.options\n if (!options) return []\n return (isRef(options) ? options.value : options) as Record<string, unknown>[]\n}\n\nfunction columnAlign(column: EditableColumnDef): 'left' | 'center' | 'right' {\n if (column.align) return column.align\n return column.editor === 'number' ? 'right' : 'left'\n}\n\nfunction isNumericColumn(column: EditableColumnDef): boolean {\n return column.editor === 'number' || column.footer === 'sum' || column.decimals != null\n}\n\nfunction columnClass(column: EditableColumnDef): string[] {\n return [\n `w-editable-table__cell--${columnAlign(column)}`,\n ...(isNumericColumn(column) ? ['w-editable-table__cell--num'] : []),\n ]\n}\n\nfunction columnStyle(column: EditableColumnDef) {\n if (column.width == null) return undefined\n return { width: typeof column.width === 'number' ? `${column.width}px` : column.width }\n}\n\nfunction isCellDisabled(column: EditableColumnDef, row: EditableRow, index: number): boolean {\n if (props.disabled) return true\n if (typeof column.disabled === 'function') return column.disabled(row, index)\n return !!column.disabled\n}\n\n// --- Leitura / escrita de célula -------------------------------------------\n\nfunction toNumber(value: unknown): number {\n if (typeof value === 'number') return Number.isFinite(value) ? value : 0\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number(value.replace(/\\./g, '').replace(',', '.'))\n return Number.isFinite(parsed) ? parsed : 0\n }\n return 0\n}\n\nfunction displayValue(column: EditableColumnDef, row: EditableRow): string {\n const value = row[column.field]\n if (column.format) return column.format(value, row)\n if (value == null || value === '') return '—'\n if (isNumericColumn(column)) {\n return `${formatNumber(toNumber(value), column.decimals ?? 2)}${column.suffix ?? ''}`\n }\n return `${String(value)}${column.suffix ?? ''}`\n}\n\nfunction setCell(index: number, field: string, value: unknown) {\n const next = props.modelValue.map((row, i) => (i === index ? { ...row, [field]: value } : row))\n emit('update:modelValue', next)\n}\n\nfunction removeRow(row: EditableRow, index: number) {\n if (props.disabled) return\n // Emite os dois: o array já sem a linha (para o v-model continuar sendo a\n // fonte da verdade) e o evento com a linha removida (para quem precisa dela).\n emit(\n 'update:modelValue',\n props.modelValue.filter((_, i) => i !== index),\n )\n expanded.value = new Set()\n emit('remove', row, index)\n}\n\nfunction rowKeyOf(row: EditableRow, index: number): string | number {\n if (props.rowKey) {\n const key = row[props.rowKey]\n if (typeof key === 'string' || typeof key === 'number') return key\n }\n return index\n}\n\n// --- Rodapé de totais ------------------------------------------------------\n\nconst hasFooter = computed(() =>\n props.columns.some((c) => typeof c.footer === 'function' || c.footer === 'sum'),\n)\n\nfunction footerValue(column: EditableColumnDef): string {\n if (typeof column.footer === 'function') return column.footer(props.modelValue)\n if (column.footer !== 'sum') return ''\n const total = props.modelValue.reduce((sum, row) => sum + toNumber(row[column.field]), 0)\n return `${formatNumber(total, column.decimals ?? 2)}${column.suffix ?? ''}`\n}\n\n/** A primeira coluna sem rodapé próprio carrega o rótulo \"Total\". */\nconst footerLabelField = computed(() => {\n const first = props.columns.find((c) => !c.footer || c.footer === 'none')\n return first?.field ?? null\n})\n\nconst columnCount = computed(\n () => props.columns.length + (props.expandable ? 1 : 0) + (props.removable ? 1 : 0),\n)\n</script>\n\n<template>\n <div class=\"w-editable-table\">\n <div v-if=\"$slots.toolbar || addLabel\" class=\"w-editable-table__toolbar\">\n <slot name=\"toolbar\">\n <button\n type=\"button\"\n class=\"w-editable-table__add\"\n :disabled=\"disabled\"\n @click=\"emit('add')\"\n >\n <i class=\"pi pi-plus\" />{{ addLabel }}\n </button>\n </slot>\n </div>\n\n <table class=\"w-editable-table__table\">\n <thead>\n <tr>\n <th v-if=\"expandable\" class=\"w-editable-table__toggle-col\" />\n <th\n v-for=\"column in columns\"\n :key=\"column.field\"\n :class=\"columnClass(column)\"\n :style=\"columnStyle(column)\"\n >\n {{ column.header }}\n </th>\n <th v-if=\"removable\" class=\"w-editable-table__action-col\" />\n </tr>\n </thead>\n\n <tbody v-if=\"!modelValue.length\">\n <tr>\n <td :colspan=\"columnCount\" class=\"w-editable-table__empty\">\n <slot name=\"empty\">{{ emptyMessage }}</slot>\n </td>\n </tr>\n </tbody>\n\n <tbody v-for=\"(row, index) in modelValue\" :key=\"rowKeyOf(row, index)\">\n <tr class=\"w-editable-table__row\">\n <td v-if=\"expandable\" class=\"w-editable-table__toggle-col\">\n <button\n type=\"button\"\n class=\"w-editable-table__toggle\"\n :aria-expanded=\"isExpanded(index)\"\n aria-label=\"Detalhes da linha\"\n @click=\"toggleRow(index)\"\n >\n <i :class=\"isExpanded(index) ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\" />\n </button>\n </td>\n\n <td\n v-for=\"column in columns\"\n :key=\"column.field\"\n :class=\"columnClass(column)\"\n :style=\"columnStyle(column)\"\n >\n <slot\n :name=\"`cell-${column.field}`\"\n :row=\"row\"\n :index=\"index\"\n :value=\"row[column.field]\"\n :column=\"column\"\n >\n <InputNumber\n v-if=\"column.editor === 'number'\"\n :model-value=\"row[column.field] as number\"\n fluid\n locale=\"pt-BR\"\n :min=\"column.min\"\n :max=\"column.max\"\n :min-fraction-digits=\"column.decimals != null ? column.decimals : undefined\"\n :max-fraction-digits=\"column.decimals != null ? column.decimals : undefined\"\n :suffix=\"column.suffix\"\n :placeholder=\"column.placeholder\"\n :disabled=\"isCellDisabled(column, row, index)\"\n :input-class=\"'w-editable-table__num'\"\n @update:model-value=\"(val) => setCell(index, column.field, val)\"\n />\n\n <InputText\n v-else-if=\"column.editor === 'text'\"\n :model-value=\"row[column.field] as string\"\n fluid\n :placeholder=\"column.placeholder\"\n :disabled=\"isCellDisabled(column, row, index)\"\n @update:model-value=\"(val) => setCell(index, column.field, val)\"\n />\n\n <Select\n v-else-if=\"column.editor === 'select'\"\n :model-value=\"row[column.field]\"\n fluid\n :options=\"unwrapOptions(column)\"\n :option-label=\"column.optionLabel || 'label'\"\n :option-value=\"column.optionValue || 'value'\"\n :placeholder=\"column.placeholder\"\n :disabled=\"isCellDisabled(column, row, index)\"\n @update:model-value=\"(val) => setCell(index, column.field, val)\"\n />\n\n <span v-else class=\"w-editable-table__text\">{{ displayValue(column, row) }}</span>\n </slot>\n </td>\n\n <td v-if=\"removable\" class=\"w-editable-table__action-col\">\n <button\n type=\"button\"\n class=\"w-editable-table__remove\"\n :disabled=\"disabled\"\n aria-label=\"Remover linha\"\n @click=\"removeRow(row, index)\"\n >\n <i class=\"pi pi-trash\" />\n </button>\n </td>\n </tr>\n\n <tr v-if=\"expandable && isExpanded(index)\" class=\"w-editable-table__expansion\">\n <td :colspan=\"columnCount\">\n <slot name=\"expansion\" :row=\"row\" :index=\"index\" />\n </td>\n </tr>\n </tbody>\n\n <tfoot v-if=\"hasFooter\">\n <tr class=\"w-editable-table__footer\">\n <td v-if=\"expandable\" class=\"w-editable-table__toggle-col\" />\n <td\n v-for=\"column in columns\"\n :key=\"column.field\"\n :class=\"columnClass(column)\"\n :style=\"columnStyle(column)\"\n >\n <slot :name=\"`footer-${column.field}`\" :rows=\"modelValue\" :column=\"column\">\n <span v-if=\"column.field === footerLabelField\" class=\"w-editable-table__footer-label\">\n {{ footerLabel }}\n </span>\n <span v-else>{{ footerValue(column) }}</span>\n </slot>\n </td>\n <td v-if=\"removable\" class=\"w-editable-table__action-col\" />\n </tr>\n </tfoot>\n </table>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport DatePicker from 'primevue/datepicker'\n\n/**\n * Seletor de intervalo de datas (período). Wrapper fino do DatePicker em modo\n * range com padrões pt-BR. O `v-model` guarda `[início, fim]` como `Date[]`.\n */\nwithDefaults(\n defineProps<{\n modelValue?: Date[] | null\n placeholder?: string\n minDate?: Date\n maxDate?: Date\n showButtonBar?: boolean\n disabled?: boolean\n }>(),\n {\n modelValue: null,\n placeholder: 'Selecione o período',\n showButtonBar: true,\n disabled: false,\n },\n)\n\nconst emit = defineEmits<{ 'update:modelValue': [value: Date[] | null] }>()\n\nfunction onUpdate(v: unknown) {\n emit('update:modelValue', (v as Date[] | null) ?? null)\n}\n</script>\n\n<template>\n <DatePicker\n :model-value=\"modelValue ?? undefined\"\n selection-mode=\"range\"\n :placeholder=\"placeholder\"\n :min-date=\"minDate\"\n :max-date=\"maxDate\"\n :show-button-bar=\"showButtonBar\"\n :disabled=\"disabled\"\n date-format=\"dd/mm/yy\"\n fluid\n @update:model-value=\"onUpdate\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\nimport Button from 'primevue/button'\n\n/**\n * Upload de arquivo(s) genérico (single ou multiple), sem dependência pesada.\n * O `v-model` guarda `File` (single) ou `File[]` (multiple). Valida tamanho por\n * arquivo e emite `error` para os que excederem.\n */\nconst props = withDefaults(\n defineProps<{\n modelValue?: File | File[] | null\n multiple?: boolean\n accept?: string\n /** Tamanho máximo por arquivo em bytes (default 10MB). */\n maxSize?: number\n disabled?: boolean\n chooseLabel?: string\n }>(),\n {\n modelValue: null,\n multiple: false,\n accept: undefined,\n maxSize: 10_485_760,\n disabled: false,\n chooseLabel: 'Selecionar arquivo',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: File | File[] | null]\n error: [message: string]\n}>()\n\nconst input = ref<HTMLInputElement | null>(null)\nconst files = computed<File[]>(() => {\n const v = props.modelValue\n if (!v) return []\n return Array.isArray(v) ? v : [v]\n})\n\nfunction open() {\n input.value?.click()\n}\n\nfunction onChange(e: Event) {\n const el = e.target as HTMLInputElement\n const picked = Array.from(el.files || [])\n el.value = ''\n const valid: File[] = []\n for (const f of picked) {\n if (f.size > props.maxSize) {\n emit('error', `\"${f.name}\" acima do limite de ${(props.maxSize / 1_048_576).toFixed(1)}MB.`)\n continue\n }\n valid.push(f)\n }\n if (!valid.length) return\n emit('update:modelValue', props.multiple ? [...files.value, ...valid] : valid[0])\n}\n\nfunction removeAt(i: number) {\n if (!props.multiple) {\n emit('update:modelValue', null)\n return\n }\n const next = files.value.slice()\n next.splice(i, 1)\n emit('update:modelValue', next.length ? next : null)\n}\n\nfunction fmtSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1_048_576) return `${(bytes / 1024).toFixed(0)} KB`\n return `${(bytes / 1_048_576).toFixed(1)} MB`\n}\n</script>\n\n<template>\n <div class=\"w-fileupload\" style=\"display: flex; flex-direction: column; gap: 0.5rem\">\n <div>\n <Button\n type=\"button\"\n :label=\"chooseLabel\"\n icon=\"pi pi-upload\"\n outlined\n size=\"small\"\n :disabled=\"disabled\"\n @click=\"open\"\n />\n </div>\n <input\n ref=\"input\"\n type=\"file\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n style=\"display: none\"\n @change=\"onChange\"\n />\n <ul\n v-if=\"files.length\"\n style=\"\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.35rem;\n \"\n >\n <li\n v-for=\"(f, i) in files\"\n :key=\"`${f.name}-${i}`\"\n style=\"display: flex; align-items: center; gap: 0.5rem; font-size: 0.85rem\"\n >\n <i class=\"pi pi-file\" style=\"opacity: 0.6\" />\n <span style=\"flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap\">\n {{ f.name }}\n </span>\n <span style=\"opacity: 0.6\">{{ fmtSize(f.size) }}</span>\n <Button\n type=\"button\"\n icon=\"pi pi-times\"\n text\n rounded\n size=\"small\"\n severity=\"danger\"\n :disabled=\"disabled\"\n @click=\"removeAt(i)\"\n />\n </li>\n </ul>\n <slot v-else name=\"empty\">\n <span style=\"font-size: 0.8rem; opacity: 0.6\">Nenhum arquivo selecionado</span>\n </slot>\n </div>\n</template>\n","/**\n * Lógica pura por trás do `WTreeSelect` — sem Vue, sem PrimeVue, testável isolada.\n *\n * O componente NÃO delega a seleção ao `Tree` do PrimeVue (ver o comentário longo\n * em `WTreeSelect.vue`). Tudo o que a árvore precisa saber é derivado aqui, sempre\n * a partir da árvore INTEIRA e do array de ids selecionados.\n */\n\nexport type TreeSelectId = string | number\n\nexport type TreeSelectOption = Record<string, unknown>\n\n/** Nó no formato que o `Tree` do PrimeVue consome (`key`/`label`/`children`). */\nexport interface TreeSelectNode {\n /** Chave única e estável. Prefixada para não colidir grupo com folha. */\n key: string\n label: string\n /** Id da folha. Ausente em nó de grupo — grupo é visual, nunca entra no v-model. */\n value?: TreeSelectId\n children?: TreeSelectNode[]\n /** Registro original da lista plana, entregue aos slots. */\n data?: TreeSelectOption\n leaf: boolean\n}\n\n/** Estado de um nó no formato que o `Tree` lê (`checked` / `partialChecked`). */\nexport interface TreeSelectionState {\n checked: boolean\n partialChecked: boolean\n}\n\nexport type TreeSelectionKeys = Record<string, TreeSelectionState>\n\n/** Prefixo da chave de um nó de grupo. */\nexport const TREE_GROUP_PREFIX = 'g:'\n/** Prefixo da chave de um nó folha. */\nexport const TREE_LEAF_PREFIX = 'n:'\n\nexport interface BuildTreeOptions {\n /** Campo do id da folha (default: `id`). */\n optionValue?: string\n /** Campo do rótulo visível (default: `nome`). */\n optionLabel?: string\n /** Campo que agrupa. Sem ele, a árvore é rasa (só folhas na raiz). */\n groupBy?: string\n /** Rótulo do nó-pai a partir do valor bruto do agrupamento. */\n groupLabel?: (chave: string) => string\n}\n\n/** Normaliza para busca: minúsculas e sem acento (rótulos são pt-BR). */\nexport function normalizeTerm(value: unknown): string {\n return String(value ?? '')\n .normalize('NFD')\n .replace(/\\p{Diacritic}/gu, '')\n .toLocaleLowerCase()\n}\n\n/**\n * Converte a lista PLANA em árvore de dois níveis.\n *\n * - Sem `groupBy`, ou item com valor de grupo vazio/nulo → folha na raiz.\n * - Grupos saem na ordem da primeira ocorrência (nada de ordenação implícita,\n * quem manda na ordem é quem monta a lista).\n */\nexport function buildTree(\n options: readonly TreeSelectOption[],\n { optionValue = 'id', optionLabel = 'nome', groupBy, groupLabel }: BuildTreeOptions = {},\n): TreeSelectNode[] {\n const roots: TreeSelectNode[] = []\n const groups = new Map<string, TreeSelectNode>()\n\n for (const option of options ?? []) {\n const id = option[optionValue] as TreeSelectId | undefined\n if (id === undefined || id === null) continue\n\n const leaf: TreeSelectNode = {\n key: `${TREE_LEAF_PREFIX}${id}`,\n label: String(option[optionLabel] ?? id),\n value: id,\n data: option,\n leaf: true,\n }\n\n const rawGroup = groupBy ? option[groupBy] : undefined\n if (rawGroup === undefined || rawGroup === null || rawGroup === '') {\n roots.push(leaf)\n continue\n }\n\n const chave = String(rawGroup)\n let group = groups.get(chave)\n if (!group) {\n group = {\n key: `${TREE_GROUP_PREFIX}${chave}`,\n label: groupLabel ? groupLabel(chave) : chave,\n children: [],\n leaf: false,\n }\n groups.set(chave, group)\n roots.push(group)\n }\n group.children!.push(leaf)\n }\n\n return roots\n}\n\n/** Todos os ids de folha sob um nó (o próprio, se for folha). */\nexport function collectLeafValues(node: TreeSelectNode): TreeSelectId[] {\n if (!node.children?.length) {\n return node.value === undefined ? [] : [node.value]\n }\n return node.children.flatMap(collectLeafValues)\n}\n\n/** Todos os ids de folha da árvore, na ordem em que aparecem. */\nexport function allLeafValues(nodes: readonly TreeSelectNode[]): TreeSelectId[] {\n return nodes.flatMap(collectLeafValues)\n}\n\n/** Índice `key → nó` da árvore INTEIRA — é por aqui que um evento vira ids. */\nexport function indexByKey(nodes: readonly TreeSelectNode[]): Map<string, TreeSelectNode> {\n const index = new Map<string, TreeSelectNode>()\n const visit = (node: TreeSelectNode) => {\n index.set(node.key, node)\n node.children?.forEach(visit)\n }\n nodes.forEach(visit)\n return index\n}\n\n/**\n * Deriva o mapa `selectionKeys` a partir dos ids selecionados.\n *\n * Chame SEMPRE com a árvore inteira — nunca com a visão filtrada. Um grupo é\n * `checked` quando todas as folhas dele estão selecionadas e `partialChecked`\n * quando só algumas estão; como a conta é sobre o conjunto completo, o filtro\n * não tem como corromper o estado.\n */\nexport function deriveSelectionKeys(\n nodes: readonly TreeSelectNode[],\n selected: readonly TreeSelectId[],\n): TreeSelectionKeys {\n const chosen = new Set<TreeSelectId>(selected ?? [])\n const keys: TreeSelectionKeys = {}\n\n const visit = (node: TreeSelectNode): TreeSelectionState => {\n if (!node.children?.length) {\n const checked = node.value !== undefined && chosen.has(node.value)\n if (checked) keys[node.key] = { checked: true, partialChecked: false }\n return { checked, partialChecked: false }\n }\n\n let todas = true\n let alguma = false\n for (const child of node.children) {\n const estado = visit(child)\n if (estado.checked) alguma = true\n else todas = false\n if (estado.partialChecked) {\n alguma = true\n todas = false\n }\n }\n\n if (todas) keys[node.key] = { checked: true, partialChecked: false }\n else if (alguma) keys[node.key] = { checked: false, partialChecked: true }\n return { checked: todas, partialChecked: !todas && alguma }\n }\n\n nodes.forEach(visit)\n return keys\n}\n\n/**\n * Poda a árvore pelo termo de busca, devolvendo CÓPIAS que preservam a `key`.\n *\n * Grupo cujo rótulo casa é mantido inteiro; senão sobram só as folhas que casam.\n * A chave sobrevive à poda de propósito: é ela que reconecta um evento da árvore\n * visível ao nó correspondente da árvore inteira.\n */\nexport function filterTree(\n nodes: readonly TreeSelectNode[],\n term: string,\n extraFields: readonly string[] = [],\n): TreeSelectNode[] {\n const q = normalizeTerm(term).trim()\n if (!q) return [...nodes]\n\n const matches = (node: TreeSelectNode): boolean => {\n if (normalizeTerm(node.label).includes(q)) return true\n return extraFields.some((field) => normalizeTerm(node.data?.[field]).includes(q))\n }\n\n const out: TreeSelectNode[] = []\n for (const node of nodes) {\n if (!node.children?.length) {\n if (matches(node)) out.push(node)\n continue\n }\n if (matches(node)) {\n out.push(node)\n continue\n }\n const children = filterTree(node.children, term, extraFields)\n if (children.length) out.push({ ...node, children })\n }\n return out\n}\n\n/** Adiciona ou remove `ids` do array atual, preservando a ordem e sem duplicar. */\nexport function toggleIds(\n current: readonly TreeSelectId[],\n ids: readonly TreeSelectId[],\n check: boolean,\n): TreeSelectId[] {\n const alvo = new Set<TreeSelectId>(ids)\n if (!check) return (current ?? []).filter((id) => !alvo.has(id))\n\n const out = [...(current ?? [])]\n const existente = new Set<TreeSelectId>(out)\n for (const id of ids) {\n if (!existente.has(id)) {\n existente.add(id)\n out.push(id)\n }\n }\n return out\n}\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport Tree from 'primevue/tree'\nimport InputText from 'primevue/inputtext'\nimport IconField from 'primevue/iconfield'\nimport InputIcon from 'primevue/inputicon'\nimport Button from 'primevue/button'\nimport {\n allLeafValues,\n buildTree,\n collectLeafValues,\n deriveSelectionKeys,\n filterTree,\n indexByKey,\n toggleIds,\n type TreeSelectId,\n type TreeSelectNode,\n type TreeSelectOption,\n} from '@/utils/treeSelect'\n\n/**\n * Seleção múltipla em árvore com checkbox, alimentada por uma lista PLANA + um\n * campo de agrupamento. O `v-model` é um array de ids de FOLHA — nunca o mapa de\n * chaves do PrimeVue, e nunca com id de grupo dentro (grupo é só visual).\n *\n * ---------------------------------------------------------------------------\n * POR QUE A SELEÇÃO É DERIVADA AQUI E NÃO DELEGADA AO `Tree` — NÃO \"SIMPLIFIQUE\"\n * ---------------------------------------------------------------------------\n * O `Tree` com `selectionMode=\"checkbox\"` sabe manter sozinho o mapa\n * `{ chave: { checked, partialChecked } }`, propagando para pais e filhos. Trocar\n * o que está aqui por um `v-model:selectionKeys` parece uma simplificação óbvia.\n * Não é: existe um bug ABERTO que quebra exatamente a combinação que usamos\n * (checkbox + filtro).\n *\n * https://github.com/primefaces/primevue/issues/6928 (aberta, \"Help Wanted\")\n *\n * Com o filtro ativo, o `partialChecked` dos ancestrais passa a se referir à\n * árvore FILTRADA em vez da árvore inteira. O mecanismo está no código do\n * PrimeVue 4.5: `TreeNode.propagateUp()` conta `this.node.children`, e sob filtro\n * `this.node` é uma CÓPIA que o `findFilteredNodes()` produziu contendo só os\n * filhos que casaram com a busca. Um grupo com 12 telas, 3 marcadas e filtro\n * mostrando só essas 3 aparece como totalmente marcado — e ao salvar o usuário\n * marca o que não queria.\n *\n * O repositório do PrimeVue foi arquivado em junho/2026 e está read-only: não vai\n * ser corrigido upstream.\n *\n * Por isso, aqui:\n * 1. a fonte da verdade é o `modelValue` (ids de folha) — sem estado espelhado;\n * 2. o `selectionKeys` é DERIVADO sobre a árvore INTEIRA (`fullTree`), nunca\n * sobre a visão filtrada, então é correto por construção;\n * 3. o `Tree` recebe `:selection-keys` como prop CONTROLADA (não `v-model:`) —\n * o mapa que ele calcularia é simplesmente descartado.\n *\n * Escolha do evento: `node-select` / `node-unselect`, e não `update:selectionKeys`.\n * Os dois saem do mesmo `onCheckboxChange` do `Tree`, mas carregam coisas\n * diferentes: `update:selectionKeys` entrega o mapa JÁ PROPAGADO (o resultado do\n * `propagateUp` bugado), enquanto `node-select`/`node-unselect` entregam só o nó\n * clicado e a direção do clique — a intenção crua do usuário, que nenhuma conta\n * do PrimeVue tocou. É o único ponto estável da API para este caso.\n *\n * Detalhe que fecha o cerco: sob filtro o nó do evento é uma cópia podada, então\n * ler `event.node.children` alternaria só as folhas VISÍVEIS. Resolvemos o nó\n * pela `key` dentro do índice da árvore inteira (`fullIndex`) e alternamos todas\n * as folhas dele — o mesmo resultado com ou sem filtro na tela.\n */\nconst props = withDefaults(\n defineProps<{\n /** Ids das folhas selecionadas (`v-model`). Nunca contém id de grupo. */\n modelValue?: TreeSelectId[]\n /** Lista PLANA de registros. O agrupamento é feito aqui, por `groupBy`. */\n options?: TreeSelectOption[]\n /** Campo do id da folha (default: `id`). */\n optionValue?: string\n /** Campo do rótulo visível (default: `nome`). */\n optionLabel?: string\n /** Campo que agrupa os registros. Sem ele, a lista sai rasa. */\n groupBy?: string\n /** Rótulo do nó-pai a partir do valor bruto do agrupamento. */\n groupLabel?: (chave: string) => string\n /** Campo de busca interno. */\n filter?: boolean\n filterPlaceholder?: string\n /** Campos extras do registro considerados na busca (além do rótulo). */\n filterFields?: string[]\n loading?: boolean\n disabled?: boolean\n /** Texto quando não há nenhuma opção. */\n emptyMessage?: string\n /** Texto quando a busca não encontrou nada. */\n filterEmptyMessage?: string\n /** Contador `N de M selecionados` acima da árvore. */\n showCount?: boolean\n /** Atalhos \"Marcar todos\" / \"Limpar\". */\n showToggleAll?: boolean\n /** Abre todos os grupos na montagem. */\n defaultExpanded?: boolean\n ariaLabel?: string\n }>(),\n {\n modelValue: () => [],\n options: () => [],\n optionValue: 'id',\n optionLabel: 'nome',\n filter: false,\n filterPlaceholder: 'Buscar...',\n filterFields: () => [],\n loading: false,\n disabled: false,\n emptyMessage: 'Nenhum item disponível',\n filterEmptyMessage: 'Nenhum item encontrado',\n showCount: true,\n showToggleAll: true,\n defaultExpanded: false,\n },\n)\n\nconst emit = defineEmits<{ 'update:modelValue': [ids: TreeSelectId[]] }>()\n\nconst term = ref('')\nconst expandedKeys = ref<Record<string, boolean>>({})\n\n/** Árvore inteira — a única base válida para derivar estado. */\nconst fullTree = computed(() =>\n buildTree(props.options, {\n optionValue: props.optionValue,\n optionLabel: props.optionLabel,\n groupBy: props.groupBy,\n groupLabel: props.groupLabel,\n }),\n)\n\n/** Índice `key → nó` da árvore inteira; traduz evento da árvore visível em ids. */\nconst fullIndex = computed(() => indexByKey(fullTree.value))\n\nconst isFiltering = computed(() => props.filter && term.value.trim().length > 0)\n\n/** O que aparece na tela. Só isto é filtrado — o estado, nunca. */\nconst visibleTree = computed(() =>\n isFiltering.value ? filterTree(fullTree.value, term.value, props.filterFields) : fullTree.value,\n)\n\n/** Derivado sobre `fullTree`, de propósito. Ver o comentário no topo. */\nconst selectionKeys = computed(() => deriveSelectionKeys(fullTree.value, props.modelValue))\n\nconst totalLeaves = computed(() => allLeafValues(fullTree.value).length)\nconst selectedCount = computed(() => {\n const validos = new Set(allLeafValues(fullTree.value))\n return props.modelValue.filter((id) => validos.has(id)).length\n})\n\nconst showHeader = computed(\n () => (props.showCount || props.showToggleAll) && (totalLeaves.value > 0 || props.loading),\n)\nconst isEmpty = computed(() => !props.loading && visibleTree.value.length === 0)\nconst emptyText = computed(() =>\n isFiltering.value ? props.filterEmptyMessage : props.emptyMessage,\n)\n\nfunction expandFrom(nodes: readonly TreeSelectNode[]) {\n const next = { ...expandedKeys.value }\n for (const node of nodes) if (node.children?.length) next[node.key] = true\n expandedKeys.value = next\n}\n\n// `immediate` porque `options` costuma chegar de uma request DEPOIS da montagem:\n// expandir só no setup deixaria a árvore fechada justamente no caso mais comum.\n// Cada grupo é aberto no máximo uma vez, então grupo que o usuário fechou na mão\n// não reabre sozinho se a lista for recarregada.\nconst jaAbertos = new Set<string>()\nwatch(\n fullTree,\n (nodes) => {\n if (!props.defaultExpanded) return\n const novos = nodes.filter((n) => n.children?.length && !jaAbertos.has(n.key))\n if (!novos.length) return\n novos.forEach((n) => jaAbertos.add(n.key))\n expandFrom(novos)\n },\n { immediate: true },\n)\n\n// Buscar sem abrir os grupos que casaram esconderia o resultado atrás de um\n// nó fechado. Ao limpar, a expansão do usuário fica como estava.\nwatch(term, (valor) => {\n if (valor.trim()) expandFrom(visibleTree.value)\n})\n\n/**\n * Traduz o clique num nó (grupo ou folha) para ids de folha.\n * Resolve pela `key` no índice da árvore INTEIRA — `node` pode ser uma cópia\n * podada pelo filtro, com menos filhos do que o grupo realmente tem.\n */\nfunction onNodeToggle(node: TreeSelectNode, check: boolean) {\n if (props.disabled) return\n const completo = fullIndex.value.get(node.key)\n if (!completo) return\n emit('update:modelValue', toggleIds(props.modelValue, collectLeafValues(completo), check))\n}\n\nfunction selectAll() {\n if (props.disabled) return\n emit('update:modelValue', allLeafValues(fullTree.value))\n}\n\nfunction clearAll() {\n if (props.disabled) return\n emit('update:modelValue', [])\n}\n</script>\n\n<template>\n <div class=\"w-tree-select\" :class=\"{ 'w-tree-select--disabled': disabled }\">\n <slot name=\"header\" :selected-count=\"selectedCount\" :total=\"totalLeaves\">\n <div v-if=\"showHeader\" class=\"w-tree-select__head\">\n <span v-if=\"showCount\" class=\"w-tree-select__count\">\n {{ selectedCount }} de {{ totalLeaves }} selecionados\n </span>\n <span v-else />\n <div v-if=\"showToggleAll\" class=\"w-tree-select__actions\">\n <Button\n type=\"button\"\n label=\"Marcar todos\"\n text\n data-kbd-skip\n tabindex=\"-1\"\n :disabled=\"disabled || selectedCount === totalLeaves || !totalLeaves\"\n @click=\"selectAll\"\n />\n <Button\n type=\"button\"\n label=\"Limpar\"\n text\n data-kbd-skip\n tabindex=\"-1\"\n :disabled=\"disabled || !selectedCount\"\n @click=\"clearAll\"\n />\n </div>\n </div>\n </slot>\n\n <IconField v-if=\"filter\" class=\"w-tree-select__filter\">\n <InputIcon class=\"pi pi-search\" />\n <InputText\n v-model=\"term\"\n :placeholder=\"filterPlaceholder\"\n :disabled=\"disabled\"\n :aria-label=\"filterPlaceholder\"\n data-kbd-skip\n fluid\n />\n </IconField>\n\n <Tree\n v-if=\"!isEmpty\"\n :value=\"visibleTree\"\n selection-mode=\"checkbox\"\n :selection-keys=\"selectionKeys\"\n :expanded-keys=\"expandedKeys\"\n :loading=\"loading\"\n :aria-label=\"ariaLabel\"\n class=\"w-tree-select__tree\"\n @update:expanded-keys=\"expandedKeys = $event\"\n @node-select=\"onNodeToggle($event as TreeSelectNode, true)\"\n @node-unselect=\"onNodeToggle($event as TreeSelectNode, false)\"\n >\n <template #default=\"slotProps\">\n <slot name=\"node\" :node=\"slotProps.node as TreeSelectNode\">\n {{ (slotProps.node as TreeSelectNode).label }}\n </slot>\n </template>\n </Tree>\n\n <div v-else class=\"w-tree-select__empty\">\n <slot name=\"empty\" :filtering=\"isFiltering\">{{ emptyText }}</slot>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport Tag from 'primevue/tag'\n\nexport interface StatusMapping {\n label: string\n severity: string\n}\n\nconst props = withDefaults(\n defineProps<{\n value: string\n map?: Record<string, StatusMapping>\n }>(),\n {},\n)\n\nconst defaultMap: Record<string, StatusMapping> = {\n ativo: { label: 'Ativo', severity: 'success' },\n ativa: { label: 'Ativa', severity: 'success' },\n inativo: { label: 'Inativo', severity: 'danger' },\n inativa: { label: 'Inativa', severity: 'danger' },\n suspensa: { label: 'Suspensa', severity: 'warn' },\n suspenso: { label: 'Suspenso', severity: 'warn' },\n cancelada: { label: 'Cancelada', severity: 'danger' },\n cancelado: { label: 'Cancelado', severity: 'danger' },\n pendente: { label: 'Pendente', severity: 'warn' },\n confirmada: { label: 'Confirmada', severity: 'success' },\n confirmado: { label: 'Confirmado', severity: 'success' },\n vencida: { label: 'Vencida', severity: 'danger' },\n vencido: { label: 'Vencido', severity: 'danger' },\n concluido: { label: 'Concluído', severity: 'success' },\n concluida: { label: 'Concluída', severity: 'success' },\n em_progresso: { label: 'Em Progresso', severity: 'info' },\n em_andamento: { label: 'Em Andamento', severity: 'info' },\n expirado: { label: 'Expirado', severity: 'secondary' },\n expirada: { label: 'Expirada', severity: 'secondary' },\n aberto: { label: 'Aberto', severity: 'info' },\n aberta: { label: 'Aberta', severity: 'info' },\n fechado: { label: 'Fechado', severity: 'secondary' },\n fechada: { label: 'Fechada', severity: 'secondary' },\n pago: { label: 'Pago', severity: 'success' },\n paga: { label: 'Paga', severity: 'success' },\n inadimplente: { label: 'Inadimplente', severity: 'danger' },\n}\n\nconst statusInfo = computed(() => {\n const mapping = props.map ?? defaultMap\n return mapping[props.value] ?? { label: props.value, severity: 'secondary' }\n})\n</script>\n\n<template>\n <Tag :value=\"statusInfo.label\" :severity=\"statusInfo.severity as any\" />\n</template>\n","<script setup lang=\"ts\">\nimport Button from 'primevue/button'\n\ndefineProps<{\n title: string\n subtitle?: string\n actionLabel?: string\n actionIcon?: string\n}>()\n\nconst emit = defineEmits<{\n action: []\n}>()\n</script>\n\n<template>\n <div class=\"w-page-header\">\n <div class=\"w-page-header-content\">\n <h2 class=\"w-page-header-title\">{{ title }}</h2>\n <p v-if=\"subtitle\" class=\"w-page-header-subtitle\">{{ subtitle }}</p>\n </div>\n <div class=\"w-page-header-actions\">\n <slot name=\"actions\" />\n <Button v-if=\"actionLabel\" :label=\"actionLabel\" :icon=\"actionIcon\" @click=\"emit('action')\" />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport Button from 'primevue/button'\n\ndefineProps<{\n icon: string\n title: string\n description?: string\n actionLabel?: string\n actionIcon?: string\n}>()\n\nconst emit = defineEmits<{\n action: []\n}>()\n</script>\n\n<template>\n <div class=\"w-empty-state\">\n <div class=\"w-empty-state-icon\">\n <i :class=\"icon\" />\n </div>\n <p class=\"w-empty-state-title\">{{ title }}</p>\n <p v-if=\"description\" class=\"w-empty-state-description\">{{ description }}</p>\n <Button\n v-if=\"actionLabel\"\n :label=\"actionLabel\"\n :icon=\"actionIcon\"\n size=\"small\"\n class=\"mt-3\"\n @click=\"emit('action')\"\n />\n </div>\n</template>\n","/*!\n * vue-router v4.6.4\n * (c) 2025 Eduardo San Martin Morote\n * @license MIT\n */\nimport { getCurrentInstance, inject, onActivated, onDeactivated, onUnmounted, watch } from \"vue\";\nimport { setupDevtoolsPlugin } from \"@vue/devtools-api\";\n\n//#region src/utils/env.ts\nconst isBrowser = typeof document !== \"undefined\";\n\n//#endregion\n//#region src/utils/index.ts\n/**\n* Identity function that returns the value as is.\n*\n* @param v - the value to return\n*\n* @internal\n*/\nconst identityFn = (v) => v;\n/**\n* Allows differentiating lazy components from functional components and vue-class-component\n* @internal\n*\n* @param component\n*/\nfunction isRouteComponent(component) {\n\treturn typeof component === \"object\" || \"displayName\" in component || \"props\" in component || \"__vccOpts\" in component;\n}\nfunction isESModule(obj) {\n\treturn obj.__esModule || obj[Symbol.toStringTag] === \"Module\" || obj.default && isRouteComponent(obj.default);\n}\nconst assign = Object.assign;\nfunction applyToParams(fn, params) {\n\tconst newParams = {};\n\tfor (const key in params) {\n\t\tconst value = params[key];\n\t\tnewParams[key] = isArray(value) ? value.map(fn) : fn(value);\n\t}\n\treturn newParams;\n}\nconst noop = () => {};\n/**\n* Typesafe alternative to Array.isArray\n* https://github.com/microsoft/TypeScript/pull/48228\n*\n* @internal\n*/\nconst isArray = Array.isArray;\nfunction mergeOptions(defaults, partialOptions) {\n\tconst options = {};\n\tfor (const key in defaults) options[key] = key in partialOptions ? partialOptions[key] : defaults[key];\n\treturn options;\n}\n\n//#endregion\n//#region src/warning.ts\nfunction warn$1(msg) {\n\tconst args = Array.from(arguments).slice(1);\n\tconsole.warn.apply(console, [\"[Vue Router warn]: \" + msg].concat(args));\n}\n\n//#endregion\n//#region src/encoding.ts\n/**\n* Encoding Rules (␣ = Space)\n* - Path: ␣ \" < > # ? { }\n* - Query: ␣ \" < > # & =\n* - Hash: ␣ \" < > `\n*\n* On top of that, the RFC3986 (https://tools.ietf.org/html/rfc3986#section-2.2)\n* defines some extra characters to be encoded. Most browsers do not encode them\n* in encodeURI https://github.com/whatwg/url/issues/369, so it may be safer to\n* also encode `!'()*`. Leaving un-encoded only ASCII alphanumeric(`a-zA-Z0-9`)\n* plus `-._~`. This extra safety should be applied to query by patching the\n* string returned by encodeURIComponent encodeURI also encodes `[\\]^`. `\\`\n* should be encoded to avoid ambiguity. Browsers (IE, FF, C) transform a `\\`\n* into a `/` if directly typed in. The _backtick_ (`````) should also be\n* encoded everywhere because some browsers like FF encode it when directly\n* written while others don't. Safari and IE don't encode ``\"<>{}``` in hash.\n*/\nconst HASH_RE = /#/g;\nconst AMPERSAND_RE = /&/g;\nconst SLASH_RE = /\\//g;\nconst EQUAL_RE = /=/g;\nconst IM_RE = /\\?/g;\nconst PLUS_RE = /\\+/g;\n/**\n* NOTE: It's not clear to me if we should encode the + symbol in queries, it\n* seems to be less flexible than not doing so and I can't find out the legacy\n* systems requiring this for regular requests like text/html. In the standard,\n* the encoding of the plus character is only mentioned for\n* application/x-www-form-urlencoded\n* (https://url.spec.whatwg.org/#urlencoded-parsing) and most browsers seems lo\n* leave the plus character as is in queries. To be more flexible, we allow the\n* plus character on the query, but it can also be manually encoded by the user.\n*\n* Resources:\n* - https://url.spec.whatwg.org/#urlencoded-parsing\n* - https://stackoverflow.com/questions/1634271/url-encoding-the-space-character-or-20\n*/\nconst ENC_BRACKET_OPEN_RE = /%5B/g;\nconst ENC_BRACKET_CLOSE_RE = /%5D/g;\nconst ENC_CARET_RE = /%5E/g;\nconst ENC_BACKTICK_RE = /%60/g;\nconst ENC_CURLY_OPEN_RE = /%7B/g;\nconst ENC_PIPE_RE = /%7C/g;\nconst ENC_CURLY_CLOSE_RE = /%7D/g;\nconst ENC_SPACE_RE = /%20/g;\n/**\n* Encode characters that need to be encoded on the path, search and hash\n* sections of the URL.\n*\n* @internal\n* @param text - string to encode\n* @returns encoded string\n*/\nfunction commonEncode(text) {\n\treturn text == null ? \"\" : encodeURI(\"\" + text).replace(ENC_PIPE_RE, \"|\").replace(ENC_BRACKET_OPEN_RE, \"[\").replace(ENC_BRACKET_CLOSE_RE, \"]\");\n}\n/**\n* Encode characters that need to be encoded on the hash section of the URL.\n*\n* @param text - string to encode\n* @returns encoded string\n*/\nfunction encodeHash(text) {\n\treturn commonEncode(text).replace(ENC_CURLY_OPEN_RE, \"{\").replace(ENC_CURLY_CLOSE_RE, \"}\").replace(ENC_CARET_RE, \"^\");\n}\n/**\n* Encode characters that need to be encoded query values on the query\n* section of the URL.\n*\n* @param text - string to encode\n* @returns encoded string\n*/\nfunction encodeQueryValue(text) {\n\treturn commonEncode(text).replace(PLUS_RE, \"%2B\").replace(ENC_SPACE_RE, \"+\").replace(HASH_RE, \"%23\").replace(AMPERSAND_RE, \"%26\").replace(ENC_BACKTICK_RE, \"`\").replace(ENC_CURLY_OPEN_RE, \"{\").replace(ENC_CURLY_CLOSE_RE, \"}\").replace(ENC_CARET_RE, \"^\");\n}\n/**\n* Like `encodeQueryValue` but also encodes the `=` character.\n*\n* @param text - string to encode\n*/\nfunction encodeQueryKey(text) {\n\treturn encodeQueryValue(text).replace(EQUAL_RE, \"%3D\");\n}\n/**\n* Encode characters that need to be encoded on the path section of the URL.\n*\n* @param text - string to encode\n* @returns encoded string\n*/\nfunction encodePath(text) {\n\treturn commonEncode(text).replace(HASH_RE, \"%23\").replace(IM_RE, \"%3F\");\n}\n/**\n* Encode characters that need to be encoded on the path section of the URL as a\n* param. This function encodes everything {@link encodePath} does plus the\n* slash (`/`) character. If `text` is `null` or `undefined`, returns an empty\n* string instead.\n*\n* @param text - string to encode\n* @returns encoded string\n*/\nfunction encodeParam(text) {\n\treturn encodePath(text).replace(SLASH_RE, \"%2F\");\n}\nfunction decode(text) {\n\tif (text == null) return null;\n\ttry {\n\t\treturn decodeURIComponent(\"\" + text);\n\t} catch (err) {\n\t\tprocess.env.NODE_ENV !== \"production\" && warn$1(`Error decoding \"${text}\". Using original value`);\n\t}\n\treturn \"\" + text;\n}\n\n//#endregion\n//#region src/location.ts\nconst TRAILING_SLASH_RE = /\\/$/;\nconst removeTrailingSlash = (path) => path.replace(TRAILING_SLASH_RE, \"\");\n/**\n* Transforms a URI into a normalized history location\n*\n* @param parseQuery\n* @param location - URI to normalize\n* @param currentLocation - current absolute location. Allows resolving relative\n* paths. Must start with `/`. Defaults to `/`\n* @returns a normalized history location\n*/\nfunction parseURL(parseQuery$1, location, currentLocation = \"/\") {\n\tlet path, query = {}, searchString = \"\", hash = \"\";\n\tconst hashPos = location.indexOf(\"#\");\n\tlet searchPos = location.indexOf(\"?\");\n\tsearchPos = hashPos >= 0 && searchPos > hashPos ? -1 : searchPos;\n\tif (searchPos >= 0) {\n\t\tpath = location.slice(0, searchPos);\n\t\tsearchString = location.slice(searchPos, hashPos > 0 ? hashPos : location.length);\n\t\tquery = parseQuery$1(searchString.slice(1));\n\t}\n\tif (hashPos >= 0) {\n\t\tpath = path || location.slice(0, hashPos);\n\t\thash = location.slice(hashPos, location.length);\n\t}\n\tpath = resolveRelativePath(path != null ? path : location, currentLocation);\n\treturn {\n\t\tfullPath: path + searchString + hash,\n\t\tpath,\n\t\tquery,\n\t\thash: decode(hash)\n\t};\n}\nfunction NEW_stringifyURL(stringifyQuery$1, path, query, hash = \"\") {\n\tconst searchText = stringifyQuery$1(query);\n\treturn path + (searchText && \"?\") + searchText + encodeHash(hash);\n}\n/**\n* Stringifies a URL object\n*\n* @param stringifyQuery\n* @param location\n*/\nfunction stringifyURL(stringifyQuery$1, location) {\n\tconst query = location.query ? stringifyQuery$1(location.query) : \"\";\n\treturn location.path + (query && \"?\") + query + (location.hash || \"\");\n}\n/**\n* Strips off the base from the beginning of a location.pathname in a non-case-sensitive way.\n*\n* @param pathname - location.pathname\n* @param base - base to strip off\n*/\nfunction stripBase(pathname, base) {\n\tif (!base || !pathname.toLowerCase().startsWith(base.toLowerCase())) return pathname;\n\treturn pathname.slice(base.length) || \"/\";\n}\n/**\n* Checks if two RouteLocation are equal. This means that both locations are\n* pointing towards the same {@link RouteRecord} and that all `params`, `query`\n* parameters and `hash` are the same\n*\n* @param stringifyQuery - A function that takes a query object of type LocationQueryRaw and returns a string representation of it.\n* @param a - first {@link RouteLocation}\n* @param b - second {@link RouteLocation}\n*/\nfunction isSameRouteLocation(stringifyQuery$1, a, b) {\n\tconst aLastIndex = a.matched.length - 1;\n\tconst bLastIndex = b.matched.length - 1;\n\treturn aLastIndex > -1 && aLastIndex === bLastIndex && isSameRouteRecord(a.matched[aLastIndex], b.matched[bLastIndex]) && isSameRouteLocationParams(a.params, b.params) && stringifyQuery$1(a.query) === stringifyQuery$1(b.query) && a.hash === b.hash;\n}\n/**\n* Check if two `RouteRecords` are equal. Takes into account aliases: they are\n* considered equal to the `RouteRecord` they are aliasing.\n*\n* @param a - first {@link RouteRecord}\n* @param b - second {@link RouteRecord}\n*/\nfunction isSameRouteRecord(a, b) {\n\treturn (a.aliasOf || a) === (b.aliasOf || b);\n}\nfunction isSameRouteLocationParams(a, b) {\n\tif (Object.keys(a).length !== Object.keys(b).length) return false;\n\tfor (var key in a) if (!isSameRouteLocationParamsValue(a[key], b[key])) return false;\n\treturn true;\n}\nfunction isSameRouteLocationParamsValue(a, b) {\n\treturn isArray(a) ? isEquivalentArray(a, b) : isArray(b) ? isEquivalentArray(b, a) : a?.valueOf() === b?.valueOf();\n}\n/**\n* Check if two arrays are the same or if an array with one single entry is the\n* same as another primitive value. Used to check query and parameters\n*\n* @param a - array of values\n* @param b - array of values or a single value\n*/\nfunction isEquivalentArray(a, b) {\n\treturn isArray(b) ? a.length === b.length && a.every((value, i) => value === b[i]) : a.length === 1 && a[0] === b;\n}\n/**\n* Resolves a relative path that starts with `.`.\n*\n* @param to - path location we are resolving\n* @param from - currentLocation.path, should start with `/`\n*/\nfunction resolveRelativePath(to, from) {\n\tif (to.startsWith(\"/\")) return to;\n\tif (process.env.NODE_ENV !== \"production\" && !from.startsWith(\"/\")) {\n\t\twarn$1(`Cannot resolve a relative location without an absolute path. Trying to resolve \"${to}\" from \"${from}\". It should look like \"/${from}\".`);\n\t\treturn to;\n\t}\n\tif (!to) return from;\n\tconst fromSegments = from.split(\"/\");\n\tconst toSegments = to.split(\"/\");\n\tconst lastToSegment = toSegments[toSegments.length - 1];\n\tif (lastToSegment === \"..\" || lastToSegment === \".\") toSegments.push(\"\");\n\tlet position = fromSegments.length - 1;\n\tlet toPosition;\n\tlet segment;\n\tfor (toPosition = 0; toPosition < toSegments.length; toPosition++) {\n\t\tsegment = toSegments[toPosition];\n\t\tif (segment === \".\") continue;\n\t\tif (segment === \"..\") {\n\t\t\tif (position > 1) position--;\n\t\t} else break;\n\t}\n\treturn fromSegments.slice(0, position).join(\"/\") + \"/\" + toSegments.slice(toPosition).join(\"/\");\n}\n/**\n* Initial route location where the router is. Can be used in navigation guards\n* to differentiate the initial navigation.\n*\n* @example\n* ```js\n* import { START_LOCATION } from 'vue-router'\n*\n* router.beforeEach((to, from) => {\n* if (from === START_LOCATION) {\n* // initial navigation\n* }\n* })\n* ```\n*/\nconst START_LOCATION_NORMALIZED = {\n\tpath: \"/\",\n\tname: void 0,\n\tparams: {},\n\tquery: {},\n\thash: \"\",\n\tfullPath: \"/\",\n\tmatched: [],\n\tmeta: {},\n\tredirectedFrom: void 0\n};\n\n//#endregion\n//#region src/history/common.ts\nlet NavigationType = /* @__PURE__ */ function(NavigationType$1) {\n\tNavigationType$1[\"pop\"] = \"pop\";\n\tNavigationType$1[\"push\"] = \"push\";\n\treturn NavigationType$1;\n}({});\nlet NavigationDirection = /* @__PURE__ */ function(NavigationDirection$1) {\n\tNavigationDirection$1[\"back\"] = \"back\";\n\tNavigationDirection$1[\"forward\"] = \"forward\";\n\tNavigationDirection$1[\"unknown\"] = \"\";\n\treturn NavigationDirection$1;\n}({});\n/**\n* Starting location for Histories\n*/\nconst START = \"\";\n/**\n* Normalizes a base by removing any trailing slash and reading the base tag if\n* present.\n*\n* @param base - base to normalize\n*/\nfunction normalizeBase(base) {\n\tif (!base) if (isBrowser) {\n\t\tconst baseEl = document.querySelector(\"base\");\n\t\tbase = baseEl && baseEl.getAttribute(\"href\") || \"/\";\n\t\tbase = base.replace(/^\\w+:\\/\\/[^\\/]+/, \"\");\n\t} else base = \"/\";\n\tif (base[0] !== \"/\" && base[0] !== \"#\") base = \"/\" + base;\n\treturn removeTrailingSlash(base);\n}\nconst BEFORE_HASH_RE = /^[^#]+#/;\nfunction createHref(base, location) {\n\treturn base.replace(BEFORE_HASH_RE, \"#\") + location;\n}\n\n//#endregion\n//#region src/scrollBehavior.ts\nfunction getElementPosition(el, offset) {\n\tconst docRect = document.documentElement.getBoundingClientRect();\n\tconst elRect = el.getBoundingClientRect();\n\treturn {\n\t\tbehavior: offset.behavior,\n\t\tleft: elRect.left - docRect.left - (offset.left || 0),\n\t\ttop: elRect.top - docRect.top - (offset.top || 0)\n\t};\n}\nconst computeScrollPosition = () => ({\n\tleft: window.scrollX,\n\ttop: window.scrollY\n});\nfunction scrollToPosition(position) {\n\tlet scrollToOptions;\n\tif (\"el\" in position) {\n\t\tconst positionEl = position.el;\n\t\tconst isIdSelector = typeof positionEl === \"string\" && positionEl.startsWith(\"#\");\n\t\t/**\n\t\t* `id`s can accept pretty much any characters, including CSS combinators\n\t\t* like `>` or `~`. It's still possible to retrieve elements using\n\t\t* `document.getElementById('~')` but it needs to be escaped when using\n\t\t* `document.querySelector('#\\\\~')` for it to be valid. The only\n\t\t* requirements for `id`s are them to be unique on the page and to not be\n\t\t* empty (`id=\"\"`). Because of that, when passing an id selector, it should\n\t\t* be properly escaped for it to work with `querySelector`. We could check\n\t\t* for the id selector to be simple (no CSS combinators `+ >~`) but that\n\t\t* would make things inconsistent since they are valid characters for an\n\t\t* `id` but would need to be escaped when using `querySelector`, breaking\n\t\t* their usage and ending up in no selector returned. Selectors need to be\n\t\t* escaped:\n\t\t*\n\t\t* - `#1-thing` becomes `#\\31 -thing`\n\t\t* - `#with~symbols` becomes `#with\\\\~symbols`\n\t\t*\n\t\t* - More information about the topic can be found at\n\t\t* https://mathiasbynens.be/notes/html5-id-class.\n\t\t* - Practical example: https://mathiasbynens.be/demo/html5-id\n\t\t*/\n\t\tif (process.env.NODE_ENV !== \"production\" && typeof position.el === \"string\") {\n\t\t\tif (!isIdSelector || !document.getElementById(position.el.slice(1))) try {\n\t\t\t\tconst foundEl = document.querySelector(position.el);\n\t\t\t\tif (isIdSelector && foundEl) {\n\t\t\t\t\twarn$1(`The selector \"${position.el}\" should be passed as \"el: document.querySelector('${position.el}')\" because it starts with \"#\".`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\twarn$1(`The selector \"${position.el}\" is invalid. If you are using an id selector, make sure to escape it. You can find more information about escaping characters in selectors at https://mathiasbynens.be/notes/css-escapes or use CSS.escape (https://developer.mozilla.org/en-US/docs/Web/API/CSS/escape).`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tconst el = typeof positionEl === \"string\" ? isIdSelector ? document.getElementById(positionEl.slice(1)) : document.querySelector(positionEl) : positionEl;\n\t\tif (!el) {\n\t\t\tprocess.env.NODE_ENV !== \"production\" && warn$1(`Couldn't find element using selector \"${position.el}\" returned by scrollBehavior.`);\n\t\t\treturn;\n\t\t}\n\t\tscrollToOptions = getElementPosition(el, position);\n\t} else scrollToOptions = position;\n\tif (\"scrollBehavior\" in document.documentElement.style) window.scrollTo(scrollToOptions);\n\telse window.scrollTo(scrollToOptions.left != null ? scrollToOptions.left : window.scrollX, scrollToOptions.top != null ? scrollToOptions.top : window.scrollY);\n}\nfunction getScrollKey(path, delta) {\n\treturn (history.state ? history.state.position - delta : -1) + path;\n}\nconst scrollPositions = /* @__PURE__ */ new Map();\nfunction saveScrollPosition(key, scrollPosition) {\n\tscrollPositions.set(key, scrollPosition);\n}\nfunction getSavedScrollPosition(key) {\n\tconst scroll = scrollPositions.get(key);\n\tscrollPositions.delete(key);\n\treturn scroll;\n}\n/**\n* ScrollBehavior instance used by the router to compute and restore the scroll\n* position when navigating.\n*/\n\n//#endregion\n//#region src/types/typeGuards.ts\nfunction isRouteLocation(route) {\n\treturn typeof route === \"string\" || route && typeof route === \"object\";\n}\nfunction isRouteName(name) {\n\treturn typeof name === \"string\" || typeof name === \"symbol\";\n}\n\n//#endregion\n//#region src/errors.ts\n/**\n* Flags so we can combine them when checking for multiple errors. This is the internal version of\n* {@link NavigationFailureType}.\n*\n* @internal\n*/\nlet ErrorTypes = /* @__PURE__ */ function(ErrorTypes$1) {\n\tErrorTypes$1[ErrorTypes$1[\"MATCHER_NOT_FOUND\"] = 1] = \"MATCHER_NOT_FOUND\";\n\tErrorTypes$1[ErrorTypes$1[\"NAVIGATION_GUARD_REDIRECT\"] = 2] = \"NAVIGATION_GUARD_REDIRECT\";\n\tErrorTypes$1[ErrorTypes$1[\"NAVIGATION_ABORTED\"] = 4] = \"NAVIGATION_ABORTED\";\n\tErrorTypes$1[ErrorTypes$1[\"NAVIGATION_CANCELLED\"] = 8] = \"NAVIGATION_CANCELLED\";\n\tErrorTypes$1[ErrorTypes$1[\"NAVIGATION_DUPLICATED\"] = 16] = \"NAVIGATION_DUPLICATED\";\n\treturn ErrorTypes$1;\n}({});\nconst NavigationFailureSymbol = Symbol(process.env.NODE_ENV !== \"production\" ? \"navigation failure\" : \"\");\n/**\n* Enumeration with all possible types for navigation failures. Can be passed to\n* {@link isNavigationFailure} to check for specific failures.\n*/\nlet NavigationFailureType = /* @__PURE__ */ function(NavigationFailureType$1) {\n\t/**\n\t* An aborted navigation is a navigation that failed because a navigation\n\t* guard returned `false` or called `next(false)`\n\t*/\n\tNavigationFailureType$1[NavigationFailureType$1[\"aborted\"] = 4] = \"aborted\";\n\t/**\n\t* A cancelled navigation is a navigation that failed because a more recent\n\t* navigation finished started (not necessarily finished).\n\t*/\n\tNavigationFailureType$1[NavigationFailureType$1[\"cancelled\"] = 8] = \"cancelled\";\n\t/**\n\t* A duplicated navigation is a navigation that failed because it was\n\t* initiated while already being at the exact same location.\n\t*/\n\tNavigationFailureType$1[NavigationFailureType$1[\"duplicated\"] = 16] = \"duplicated\";\n\treturn NavigationFailureType$1;\n}({});\nconst ErrorTypeMessages = {\n\t[ErrorTypes.MATCHER_NOT_FOUND]({ location, currentLocation }) {\n\t\treturn `No match for\\n ${JSON.stringify(location)}${currentLocation ? \"\\nwhile being at\\n\" + JSON.stringify(currentLocation) : \"\"}`;\n\t},\n\t[ErrorTypes.NAVIGATION_GUARD_REDIRECT]({ from, to }) {\n\t\treturn `Redirected from \"${from.fullPath}\" to \"${stringifyRoute(to)}\" via a navigation guard.`;\n\t},\n\t[ErrorTypes.NAVIGATION_ABORTED]({ from, to }) {\n\t\treturn `Navigation aborted from \"${from.fullPath}\" to \"${to.fullPath}\" via a navigation guard.`;\n\t},\n\t[ErrorTypes.NAVIGATION_CANCELLED]({ from, to }) {\n\t\treturn `Navigation cancelled from \"${from.fullPath}\" to \"${to.fullPath}\" with a new navigation.`;\n\t},\n\t[ErrorTypes.NAVIGATION_DUPLICATED]({ from, to }) {\n\t\treturn `Avoided redundant navigation to current location: \"${from.fullPath}\".`;\n\t}\n};\n/**\n* Creates a typed NavigationFailure object.\n* @internal\n* @param type - NavigationFailureType\n* @param params - { from, to }\n*/\nfunction createRouterError(type, params) {\n\tif (process.env.NODE_ENV !== \"production\" || false) return assign(new Error(ErrorTypeMessages[type](params)), {\n\t\ttype,\n\t\t[NavigationFailureSymbol]: true\n\t}, params);\n\telse return assign(/* @__PURE__ */ new Error(), {\n\t\ttype,\n\t\t[NavigationFailureSymbol]: true\n\t}, params);\n}\nfunction isNavigationFailure(error, type) {\n\treturn error instanceof Error && NavigationFailureSymbol in error && (type == null || !!(error.type & type));\n}\nconst propertiesToLog = [\n\t\"params\",\n\t\"query\",\n\t\"hash\"\n];\nfunction stringifyRoute(to) {\n\tif (typeof to === \"string\") return to;\n\tif (to.path != null) return to.path;\n\tconst location = {};\n\tfor (const key of propertiesToLog) if (key in to) location[key] = to[key];\n\treturn JSON.stringify(location, null, 2);\n}\n\n//#endregion\n//#region src/query.ts\n/**\n* Transforms a queryString into a {@link LocationQuery} object. Accept both, a\n* version with the leading `?` and without Should work as URLSearchParams\n\n* @internal\n*\n* @param search - search string to parse\n* @returns a query object\n*/\nfunction parseQuery(search) {\n\tconst query = {};\n\tif (search === \"\" || search === \"?\") return query;\n\tconst searchParams = (search[0] === \"?\" ? search.slice(1) : search).split(\"&\");\n\tfor (let i = 0; i < searchParams.length; ++i) {\n\t\tconst searchParam = searchParams[i].replace(PLUS_RE, \" \");\n\t\tconst eqPos = searchParam.indexOf(\"=\");\n\t\tconst key = decode(eqPos < 0 ? searchParam : searchParam.slice(0, eqPos));\n\t\tconst value = eqPos < 0 ? null : decode(searchParam.slice(eqPos + 1));\n\t\tif (key in query) {\n\t\t\tlet currentValue = query[key];\n\t\t\tif (!isArray(currentValue)) currentValue = query[key] = [currentValue];\n\t\t\tcurrentValue.push(value);\n\t\t} else query[key] = value;\n\t}\n\treturn query;\n}\n/**\n* Stringifies a {@link LocationQueryRaw} object. Like `URLSearchParams`, it\n* doesn't prepend a `?`\n*\n* @internal\n*\n* @param query - query object to stringify\n* @returns string version of the query without the leading `?`\n*/\nfunction stringifyQuery(query) {\n\tlet search = \"\";\n\tfor (let key in query) {\n\t\tconst value = query[key];\n\t\tkey = encodeQueryKey(key);\n\t\tif (value == null) {\n\t\t\tif (value !== void 0) search += (search.length ? \"&\" : \"\") + key;\n\t\t\tcontinue;\n\t\t}\n\t\t(isArray(value) ? value.map((v) => v && encodeQueryValue(v)) : [value && encodeQueryValue(value)]).forEach((value$1) => {\n\t\t\tif (value$1 !== void 0) {\n\t\t\t\tsearch += (search.length ? \"&\" : \"\") + key;\n\t\t\t\tif (value$1 != null) search += \"=\" + value$1;\n\t\t\t}\n\t\t});\n\t}\n\treturn search;\n}\n/**\n* Transforms a {@link LocationQueryRaw} into a {@link LocationQuery} by casting\n* numbers into strings, removing keys with an undefined value and replacing\n* undefined with null in arrays\n*\n* @param query - query object to normalize\n* @returns a normalized query object\n*/\nfunction normalizeQuery(query) {\n\tconst normalizedQuery = {};\n\tfor (const key in query) {\n\t\tconst value = query[key];\n\t\tif (value !== void 0) normalizedQuery[key] = isArray(value) ? value.map((v) => v == null ? null : \"\" + v) : value == null ? value : \"\" + value;\n\t}\n\treturn normalizedQuery;\n}\n\n//#endregion\n//#region src/injectionSymbols.ts\n/**\n* RouteRecord being rendered by the closest ancestor Router View. Used for\n* `onBeforeRouteUpdate` and `onBeforeRouteLeave`. rvlm stands for Router View\n* Location Matched\n*\n* @internal\n*/\nconst matchedRouteKey = Symbol(process.env.NODE_ENV !== \"production\" ? \"router view location matched\" : \"\");\n/**\n* Allows overriding the router view depth to control which component in\n* `matched` is rendered. rvd stands for Router View Depth\n*\n* @internal\n*/\nconst viewDepthKey = Symbol(process.env.NODE_ENV !== \"production\" ? \"router view depth\" : \"\");\n/**\n* Allows overriding the router instance returned by `useRouter` in tests. r\n* stands for router\n*\n* @internal\n*/\nconst routerKey = Symbol(process.env.NODE_ENV !== \"production\" ? \"router\" : \"\");\n/**\n* Allows overriding the current route returned by `useRoute` in tests. rl\n* stands for route location\n*\n* @internal\n*/\nconst routeLocationKey = Symbol(process.env.NODE_ENV !== \"production\" ? \"route location\" : \"\");\n/**\n* Allows overriding the current route used by router-view. Internally this is\n* used when the `route` prop is passed.\n*\n* @internal\n*/\nconst routerViewLocationKey = Symbol(process.env.NODE_ENV !== \"production\" ? \"router view location\" : \"\");\n\n//#endregion\n//#region src/utils/callbacks.ts\n/**\n* Create a list of callbacks that can be reset. Used to create before and after navigation guards list\n*/\nfunction useCallbacks() {\n\tlet handlers = [];\n\tfunction add(handler) {\n\t\thandlers.push(handler);\n\t\treturn () => {\n\t\t\tconst i = handlers.indexOf(handler);\n\t\t\tif (i > -1) handlers.splice(i, 1);\n\t\t};\n\t}\n\tfunction reset() {\n\t\thandlers = [];\n\t}\n\treturn {\n\t\tadd,\n\t\tlist: () => handlers.slice(),\n\t\treset\n\t};\n}\n\n//#endregion\n//#region src/navigationGuards.ts\nfunction registerGuard(record, name, guard) {\n\tconst removeFromList = () => {\n\t\trecord[name].delete(guard);\n\t};\n\tonUnmounted(removeFromList);\n\tonDeactivated(removeFromList);\n\tonActivated(() => {\n\t\trecord[name].add(guard);\n\t});\n\trecord[name].add(guard);\n}\n/**\n* Add a navigation guard that triggers whenever the component for the current\n* location is about to be left. Similar to {@link beforeRouteLeave} but can be\n* used in any component. The guard is removed when the component is unmounted.\n*\n* @param leaveGuard - {@link NavigationGuard}\n*/\nfunction onBeforeRouteLeave(leaveGuard) {\n\tif (process.env.NODE_ENV !== \"production\" && !getCurrentInstance()) {\n\t\twarn$1(\"getCurrentInstance() returned null. onBeforeRouteLeave() must be called at the top of a setup function\");\n\t\treturn;\n\t}\n\tconst activeRecord = inject(matchedRouteKey, {}).value;\n\tif (!activeRecord) {\n\t\tprocess.env.NODE_ENV !== \"production\" && warn$1(\"No active route record was found when calling `onBeforeRouteLeave()`. Make sure you call this function inside a component child of <router-view>. Maybe you called it inside of App.vue?\");\n\t\treturn;\n\t}\n\tregisterGuard(activeRecord, \"leaveGuards\", leaveGuard);\n}\n/**\n* Add a navigation guard that triggers whenever the current location is about\n* to be updated. Similar to {@link beforeRouteUpdate} but can be used in any\n* component. The guard is removed when the component is unmounted.\n*\n* @param updateGuard - {@link NavigationGuard}\n*/\nfunction onBeforeRouteUpdate(updateGuard) {\n\tif (process.env.NODE_ENV !== \"production\" && !getCurrentInstance()) {\n\t\twarn$1(\"getCurrentInstance() returned null. onBeforeRouteUpdate() must be called at the top of a setup function\");\n\t\treturn;\n\t}\n\tconst activeRecord = inject(matchedRouteKey, {}).value;\n\tif (!activeRecord) {\n\t\tprocess.env.NODE_ENV !== \"production\" && warn$1(\"No active route record was found when calling `onBeforeRouteUpdate()`. Make sure you call this function inside a component child of <router-view>. Maybe you called it inside of App.vue?\");\n\t\treturn;\n\t}\n\tregisterGuard(activeRecord, \"updateGuards\", updateGuard);\n}\nfunction guardToPromiseFn(guard, to, from, record, name, runWithContext = (fn) => fn()) {\n\tconst enterCallbackArray = record && (record.enterCallbacks[name] = record.enterCallbacks[name] || []);\n\treturn () => new Promise((resolve, reject) => {\n\t\tconst next = (valid) => {\n\t\t\tif (valid === false) reject(createRouterError(ErrorTypes.NAVIGATION_ABORTED, {\n\t\t\t\tfrom,\n\t\t\t\tto\n\t\t\t}));\n\t\t\telse if (valid instanceof Error) reject(valid);\n\t\t\telse if (isRouteLocation(valid)) reject(createRouterError(ErrorTypes.NAVIGATION_GUARD_REDIRECT, {\n\t\t\t\tfrom: to,\n\t\t\t\tto: valid\n\t\t\t}));\n\t\t\telse {\n\t\t\t\tif (enterCallbackArray && record.enterCallbacks[name] === enterCallbackArray && typeof valid === \"function\") enterCallbackArray.push(valid);\n\t\t\t\tresolve();\n\t\t\t}\n\t\t};\n\t\tconst guardReturn = runWithContext(() => guard.call(record && record.instances[name], to, from, process.env.NODE_ENV !== \"production\" ? canOnlyBeCalledOnce(next, to, from) : next));\n\t\tlet guardCall = Promise.resolve(guardReturn);\n\t\tif (guard.length < 3) guardCall = guardCall.then(next);\n\t\tif (process.env.NODE_ENV !== \"production\" && guard.length > 2) {\n\t\t\tconst message = `The \"next\" callback was never called inside of ${guard.name ? \"\\\"\" + guard.name + \"\\\"\" : \"\"}:\\n${guard.toString()}\\n. If you are returning a value instead of calling \"next\", make sure to remove the \"next\" parameter from your function.`;\n\t\t\tif (typeof guardReturn === \"object\" && \"then\" in guardReturn) guardCall = guardCall.then((resolvedValue) => {\n\t\t\t\tif (!next._called) {\n\t\t\t\t\twarn$1(message);\n\t\t\t\t\treturn Promise.reject(/* @__PURE__ */ new Error(\"Invalid navigation guard\"));\n\t\t\t\t}\n\t\t\t\treturn resolvedValue;\n\t\t\t});\n\t\t\telse if (guardReturn !== void 0) {\n\t\t\t\tif (!next._called) {\n\t\t\t\t\twarn$1(message);\n\t\t\t\t\treject(/* @__PURE__ */ new Error(\"Invalid navigation guard\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tguardCall.catch((err) => reject(err));\n\t});\n}\nfunction canOnlyBeCalledOnce(next, to, from) {\n\tlet called = 0;\n\treturn function() {\n\t\tif (called++ === 1) warn$1(`The \"next\" callback was called more than once in one navigation guard when going from \"${from.fullPath}\" to \"${to.fullPath}\". It should be called exactly one time in each navigation guard. This will fail in production.`);\n\t\tnext._called = true;\n\t\tif (called === 1) next.apply(null, arguments);\n\t};\n}\nfunction extractComponentsGuards(matched, guardType, to, from, runWithContext = (fn) => fn()) {\n\tconst guards = [];\n\tfor (const record of matched) {\n\t\tif (process.env.NODE_ENV !== \"production\" && !record.components && record.children && !record.children.length) warn$1(`Record with path \"${record.path}\" is either missing a \"component(s)\" or \"children\" property.`);\n\t\tfor (const name in record.components) {\n\t\t\tlet rawComponent = record.components[name];\n\t\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\t\tif (!rawComponent || typeof rawComponent !== \"object\" && typeof rawComponent !== \"function\") {\n\t\t\t\t\twarn$1(`Component \"${name}\" in record with path \"${record.path}\" is not a valid component. Received \"${String(rawComponent)}\".`);\n\t\t\t\t\tthrow new Error(\"Invalid route component\");\n\t\t\t\t} else if (\"then\" in rawComponent) {\n\t\t\t\t\twarn$1(`Component \"${name}\" in record with path \"${record.path}\" is a Promise instead of a function that returns a Promise. Did you write \"import('./MyPage.vue')\" instead of \"() => import('./MyPage.vue')\" ? This will break in production if not fixed.`);\n\t\t\t\t\tconst promise = rawComponent;\n\t\t\t\t\trawComponent = () => promise;\n\t\t\t\t} else if (rawComponent.__asyncLoader && !rawComponent.__warnedDefineAsync) {\n\t\t\t\t\trawComponent.__warnedDefineAsync = true;\n\t\t\t\t\twarn$1(`Component \"${name}\" in record with path \"${record.path}\" is defined using \"defineAsyncComponent()\". Write \"() => import('./MyPage.vue')\" instead of \"defineAsyncComponent(() => import('./MyPage.vue'))\".`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (guardType !== \"beforeRouteEnter\" && !record.instances[name]) continue;\n\t\t\tif (isRouteComponent(rawComponent)) {\n\t\t\t\tconst guard = (rawComponent.__vccOpts || rawComponent)[guardType];\n\t\t\t\tguard && guards.push(guardToPromiseFn(guard, to, from, record, name, runWithContext));\n\t\t\t} else {\n\t\t\t\tlet componentPromise = rawComponent();\n\t\t\t\tif (process.env.NODE_ENV !== \"production\" && !(\"catch\" in componentPromise)) {\n\t\t\t\t\twarn$1(`Component \"${name}\" in record with path \"${record.path}\" is a function that does not return a Promise. If you were passing a functional component, make sure to add a \"displayName\" to the component. This will break in production if not fixed.`);\n\t\t\t\t\tcomponentPromise = Promise.resolve(componentPromise);\n\t\t\t\t}\n\t\t\t\tguards.push(() => componentPromise.then((resolved) => {\n\t\t\t\t\tif (!resolved) throw new Error(`Couldn't resolve component \"${name}\" at \"${record.path}\"`);\n\t\t\t\t\tconst resolvedComponent = isESModule(resolved) ? resolved.default : resolved;\n\t\t\t\t\trecord.mods[name] = resolved;\n\t\t\t\t\trecord.components[name] = resolvedComponent;\n\t\t\t\t\tconst guard = (resolvedComponent.__vccOpts || resolvedComponent)[guardType];\n\t\t\t\t\treturn guard && guardToPromiseFn(guard, to, from, record, name, runWithContext)();\n\t\t\t\t}));\n\t\t\t}\n\t\t}\n\t}\n\treturn guards;\n}\n/**\n* Ensures a route is loaded, so it can be passed as o prop to `<RouterView>`.\n*\n* @param route - resolved route to load\n*/\nfunction loadRouteLocation(route) {\n\treturn route.matched.every((record) => record.redirect) ? Promise.reject(/* @__PURE__ */ new Error(\"Cannot load a route that redirects.\")) : Promise.all(route.matched.map((record) => record.components && Promise.all(Object.keys(record.components).reduce((promises, name) => {\n\t\tconst rawComponent = record.components[name];\n\t\tif (typeof rawComponent === \"function\" && !(\"displayName\" in rawComponent)) promises.push(rawComponent().then((resolved) => {\n\t\t\tif (!resolved) return Promise.reject(/* @__PURE__ */ new Error(`Couldn't resolve component \"${name}\" at \"${record.path}\". Ensure you passed a function that returns a promise.`));\n\t\t\tconst resolvedComponent = isESModule(resolved) ? resolved.default : resolved;\n\t\t\trecord.mods[name] = resolved;\n\t\t\trecord.components[name] = resolvedComponent;\n\t\t}));\n\t\treturn promises;\n\t}, [])))).then(() => route);\n}\n/**\n* Split the leaving, updating, and entering records.\n* @internal\n*\n* @param to - Location we are navigating to\n* @param from - Location we are navigating from\n*/\nfunction extractChangingRecords(to, from) {\n\tconst leavingRecords = [];\n\tconst updatingRecords = [];\n\tconst enteringRecords = [];\n\tconst len = Math.max(from.matched.length, to.matched.length);\n\tfor (let i = 0; i < len; i++) {\n\t\tconst recordFrom = from.matched[i];\n\t\tif (recordFrom) if (to.matched.find((record) => isSameRouteRecord(record, recordFrom))) updatingRecords.push(recordFrom);\n\t\telse leavingRecords.push(recordFrom);\n\t\tconst recordTo = to.matched[i];\n\t\tif (recordTo) {\n\t\t\tif (!from.matched.find((record) => isSameRouteRecord(record, recordTo))) enteringRecords.push(recordTo);\n\t\t}\n\t}\n\treturn [\n\t\tleavingRecords,\n\t\tupdatingRecords,\n\t\tenteringRecords\n\t];\n}\n\n//#endregion\n//#region src/devtools.ts\n/**\n* Copies a route location and removes any problematic properties that cannot be shown in devtools (e.g. Vue instances).\n*\n* @param routeLocation - routeLocation to format\n* @param tooltip - optional tooltip\n* @returns a copy of the routeLocation\n*/\nfunction formatRouteLocation(routeLocation, tooltip) {\n\tconst copy = assign({}, routeLocation, { matched: routeLocation.matched.map((matched) => omit(matched, [\n\t\t\"instances\",\n\t\t\"children\",\n\t\t\"aliasOf\"\n\t])) });\n\treturn { _custom: {\n\t\ttype: null,\n\t\treadOnly: true,\n\t\tdisplay: routeLocation.fullPath,\n\t\ttooltip,\n\t\tvalue: copy\n\t} };\n}\nfunction formatDisplay(display) {\n\treturn { _custom: { display } };\n}\nlet routerId = 0;\nfunction addDevtools(app, router, matcher) {\n\tif (router.__hasDevtools) return;\n\trouter.__hasDevtools = true;\n\tconst id = routerId++;\n\tsetupDevtoolsPlugin({\n\t\tid: \"org.vuejs.router\" + (id ? \".\" + id : \"\"),\n\t\tlabel: \"Vue Router\",\n\t\tpackageName: \"vue-router\",\n\t\thomepage: \"https://router.vuejs.org\",\n\t\tlogo: \"https://router.vuejs.org/logo.png\",\n\t\tcomponentStateTypes: [\"Routing\"],\n\t\tapp\n\t}, (api) => {\n\t\tif (typeof api.now !== \"function\") warn$1(\"[Vue Router]: You seem to be using an outdated version of Vue Devtools. Are you still using the Beta release instead of the stable one? You can find the links at https://devtools.vuejs.org/guide/installation.html.\");\n\t\tapi.on.inspectComponent((payload, ctx) => {\n\t\t\tif (payload.instanceData) payload.instanceData.state.push({\n\t\t\t\ttype: \"Routing\",\n\t\t\t\tkey: \"$route\",\n\t\t\t\teditable: false,\n\t\t\t\tvalue: formatRouteLocation(router.currentRoute.value, \"Current Route\")\n\t\t\t});\n\t\t});\n\t\tapi.on.visitComponentTree(({ treeNode: node, componentInstance }) => {\n\t\t\tif (componentInstance.__vrv_devtools) {\n\t\t\t\tconst info = componentInstance.__vrv_devtools;\n\t\t\t\tnode.tags.push({\n\t\t\t\t\tlabel: (info.name ? `${info.name.toString()}: ` : \"\") + info.path,\n\t\t\t\t\ttextColor: 0,\n\t\t\t\t\ttooltip: \"This component is rendered by &lt;router-view&gt;\",\n\t\t\t\t\tbackgroundColor: PINK_500\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (isArray(componentInstance.__vrl_devtools)) {\n\t\t\t\tcomponentInstance.__devtoolsApi = api;\n\t\t\t\tcomponentInstance.__vrl_devtools.forEach((devtoolsData) => {\n\t\t\t\t\tlet label = devtoolsData.route.path;\n\t\t\t\t\tlet backgroundColor = ORANGE_400;\n\t\t\t\t\tlet tooltip = \"\";\n\t\t\t\t\tlet textColor = 0;\n\t\t\t\t\tif (devtoolsData.error) {\n\t\t\t\t\t\tlabel = devtoolsData.error;\n\t\t\t\t\t\tbackgroundColor = RED_100;\n\t\t\t\t\t\ttextColor = RED_700;\n\t\t\t\t\t} else if (devtoolsData.isExactActive) {\n\t\t\t\t\t\tbackgroundColor = LIME_500;\n\t\t\t\t\t\ttooltip = \"This is exactly active\";\n\t\t\t\t\t} else if (devtoolsData.isActive) {\n\t\t\t\t\t\tbackgroundColor = BLUE_600;\n\t\t\t\t\t\ttooltip = \"This link is active\";\n\t\t\t\t\t}\n\t\t\t\t\tnode.tags.push({\n\t\t\t\t\t\tlabel,\n\t\t\t\t\t\ttextColor,\n\t\t\t\t\t\ttooltip,\n\t\t\t\t\t\tbackgroundColor\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\twatch(router.currentRoute, () => {\n\t\t\trefreshRoutesView();\n\t\t\tapi.notifyComponentUpdate();\n\t\t\tapi.sendInspectorTree(routerInspectorId);\n\t\t\tapi.sendInspectorState(routerInspectorId);\n\t\t});\n\t\tconst navigationsLayerId = \"router:navigations:\" + id;\n\t\tapi.addTimelineLayer({\n\t\t\tid: navigationsLayerId,\n\t\t\tlabel: `Router${id ? \" \" + id : \"\"} Navigations`,\n\t\t\tcolor: 4237508\n\t\t});\n\t\trouter.onError((error, to) => {\n\t\t\tapi.addTimelineEvent({\n\t\t\t\tlayerId: navigationsLayerId,\n\t\t\t\tevent: {\n\t\t\t\t\ttitle: \"Error during Navigation\",\n\t\t\t\t\tsubtitle: to.fullPath,\n\t\t\t\t\tlogType: \"error\",\n\t\t\t\t\ttime: api.now(),\n\t\t\t\t\tdata: { error },\n\t\t\t\t\tgroupId: to.meta.__navigationId\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tlet navigationId = 0;\n\t\trouter.beforeEach((to, from) => {\n\t\t\tconst data = {\n\t\t\t\tguard: formatDisplay(\"beforeEach\"),\n\t\t\t\tfrom: formatRouteLocation(from, \"Current Location during this navigation\"),\n\t\t\t\tto: formatRouteLocation(to, \"Target location\")\n\t\t\t};\n\t\t\tObject.defineProperty(to.meta, \"__navigationId\", { value: navigationId++ });\n\t\t\tapi.addTimelineEvent({\n\t\t\t\tlayerId: navigationsLayerId,\n\t\t\t\tevent: {\n\t\t\t\t\ttime: api.now(),\n\t\t\t\t\ttitle: \"Start of navigation\",\n\t\t\t\t\tsubtitle: to.fullPath,\n\t\t\t\t\tdata,\n\t\t\t\t\tgroupId: to.meta.__navigationId\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\trouter.afterEach((to, from, failure) => {\n\t\t\tconst data = { guard: formatDisplay(\"afterEach\") };\n\t\t\tif (failure) {\n\t\t\t\tdata.failure = { _custom: {\n\t\t\t\t\ttype: Error,\n\t\t\t\t\treadOnly: true,\n\t\t\t\t\tdisplay: failure ? failure.message : \"\",\n\t\t\t\t\ttooltip: \"Navigation Failure\",\n\t\t\t\t\tvalue: failure\n\t\t\t\t} };\n\t\t\t\tdata.status = formatDisplay(\"❌\");\n\t\t\t} else data.status = formatDisplay(\"✅\");\n\t\t\tdata.from = formatRouteLocation(from, \"Current Location during this navigation\");\n\t\t\tdata.to = formatRouteLocation(to, \"Target location\");\n\t\t\tapi.addTimelineEvent({\n\t\t\t\tlayerId: navigationsLayerId,\n\t\t\t\tevent: {\n\t\t\t\t\ttitle: \"End of navigation\",\n\t\t\t\t\tsubtitle: to.fullPath,\n\t\t\t\t\ttime: api.now(),\n\t\t\t\t\tdata,\n\t\t\t\t\tlogType: failure ? \"warning\" : \"default\",\n\t\t\t\t\tgroupId: to.meta.__navigationId\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\t/**\n\t\t* Inspector of Existing routes\n\t\t*/\n\t\tconst routerInspectorId = \"router-inspector:\" + id;\n\t\tapi.addInspector({\n\t\t\tid: routerInspectorId,\n\t\t\tlabel: \"Routes\" + (id ? \" \" + id : \"\"),\n\t\t\ticon: \"book\",\n\t\t\ttreeFilterPlaceholder: \"Search routes\"\n\t\t});\n\t\tfunction refreshRoutesView() {\n\t\t\tif (!activeRoutesPayload) return;\n\t\t\tconst payload = activeRoutesPayload;\n\t\t\tlet routes = matcher.getRoutes().filter((route) => !route.parent || !route.parent.record.components);\n\t\t\troutes.forEach(resetMatchStateOnRouteRecord);\n\t\t\tif (payload.filter) routes = routes.filter((route) => isRouteMatching(route, payload.filter.toLowerCase()));\n\t\t\troutes.forEach((route) => markRouteRecordActive(route, router.currentRoute.value));\n\t\t\tpayload.rootNodes = routes.map(formatRouteRecordForInspector);\n\t\t}\n\t\tlet activeRoutesPayload;\n\t\tapi.on.getInspectorTree((payload) => {\n\t\t\tactiveRoutesPayload = payload;\n\t\t\tif (payload.app === app && payload.inspectorId === routerInspectorId) refreshRoutesView();\n\t\t});\n\t\t/**\n\t\t* Display information about the currently selected route record\n\t\t*/\n\t\tapi.on.getInspectorState((payload) => {\n\t\t\tif (payload.app === app && payload.inspectorId === routerInspectorId) {\n\t\t\t\tconst route = matcher.getRoutes().find((route$1) => route$1.record.__vd_id === payload.nodeId);\n\t\t\t\tif (route) payload.state = { options: formatRouteRecordMatcherForStateInspector(route) };\n\t\t\t}\n\t\t});\n\t\tapi.sendInspectorTree(routerInspectorId);\n\t\tapi.sendInspectorState(routerInspectorId);\n\t});\n}\nfunction modifierForKey(key) {\n\tif (key.optional) return key.repeatable ? \"*\" : \"?\";\n\telse return key.repeatable ? \"+\" : \"\";\n}\nfunction formatRouteRecordMatcherForStateInspector(route) {\n\tconst { record } = route;\n\tconst fields = [{\n\t\teditable: false,\n\t\tkey: \"path\",\n\t\tvalue: record.path\n\t}];\n\tif (record.name != null) fields.push({\n\t\teditable: false,\n\t\tkey: \"name\",\n\t\tvalue: record.name\n\t});\n\tfields.push({\n\t\teditable: false,\n\t\tkey: \"regexp\",\n\t\tvalue: route.re\n\t});\n\tif (route.keys.length) fields.push({\n\t\teditable: false,\n\t\tkey: \"keys\",\n\t\tvalue: { _custom: {\n\t\t\ttype: null,\n\t\t\treadOnly: true,\n\t\t\tdisplay: route.keys.map((key) => `${key.name}${modifierForKey(key)}`).join(\" \"),\n\t\t\ttooltip: \"Param keys\",\n\t\t\tvalue: route.keys\n\t\t} }\n\t});\n\tif (record.redirect != null) fields.push({\n\t\teditable: false,\n\t\tkey: \"redirect\",\n\t\tvalue: record.redirect\n\t});\n\tif (route.alias.length) fields.push({\n\t\teditable: false,\n\t\tkey: \"aliases\",\n\t\tvalue: route.alias.map((alias) => alias.record.path)\n\t});\n\tif (Object.keys(route.record.meta).length) fields.push({\n\t\teditable: false,\n\t\tkey: \"meta\",\n\t\tvalue: route.record.meta\n\t});\n\tfields.push({\n\t\tkey: \"score\",\n\t\teditable: false,\n\t\tvalue: { _custom: {\n\t\t\ttype: null,\n\t\t\treadOnly: true,\n\t\t\tdisplay: route.score.map((score) => score.join(\", \")).join(\" | \"),\n\t\t\ttooltip: \"Score used to sort routes\",\n\t\t\tvalue: route.score\n\t\t} }\n\t});\n\treturn fields;\n}\n/**\n* Extracted from tailwind palette\n*/\nconst PINK_500 = 15485081;\nconst BLUE_600 = 2450411;\nconst LIME_500 = 8702998;\nconst CYAN_400 = 2282478;\nconst ORANGE_400 = 16486972;\nconst DARK = 6710886;\nconst RED_100 = 16704226;\nconst RED_700 = 12131356;\nfunction formatRouteRecordForInspector(route) {\n\tconst tags = [];\n\tconst { record } = route;\n\tif (record.name != null) tags.push({\n\t\tlabel: String(record.name),\n\t\ttextColor: 0,\n\t\tbackgroundColor: CYAN_400\n\t});\n\tif (record.aliasOf) tags.push({\n\t\tlabel: \"alias\",\n\t\ttextColor: 0,\n\t\tbackgroundColor: ORANGE_400\n\t});\n\tif (route.__vd_match) tags.push({\n\t\tlabel: \"matches\",\n\t\ttextColor: 0,\n\t\tbackgroundColor: PINK_500\n\t});\n\tif (route.__vd_exactActive) tags.push({\n\t\tlabel: \"exact\",\n\t\ttextColor: 0,\n\t\tbackgroundColor: LIME_500\n\t});\n\tif (route.__vd_active) tags.push({\n\t\tlabel: \"active\",\n\t\ttextColor: 0,\n\t\tbackgroundColor: BLUE_600\n\t});\n\tif (record.redirect) tags.push({\n\t\tlabel: typeof record.redirect === \"string\" ? `redirect: ${record.redirect}` : \"redirects\",\n\t\ttextColor: 16777215,\n\t\tbackgroundColor: DARK\n\t});\n\tlet id = record.__vd_id;\n\tif (id == null) {\n\t\tid = String(routeRecordId++);\n\t\trecord.__vd_id = id;\n\t}\n\treturn {\n\t\tid,\n\t\tlabel: record.path,\n\t\ttags,\n\t\tchildren: route.children.map(formatRouteRecordForInspector)\n\t};\n}\nlet routeRecordId = 0;\nconst EXTRACT_REGEXP_RE = /^\\/(.*)\\/([a-z]*)$/;\nfunction markRouteRecordActive(route, currentRoute) {\n\tconst isExactActive = currentRoute.matched.length && isSameRouteRecord(currentRoute.matched[currentRoute.matched.length - 1], route.record);\n\troute.__vd_exactActive = route.__vd_active = isExactActive;\n\tif (!isExactActive) route.__vd_active = currentRoute.matched.some((match) => isSameRouteRecord(match, route.record));\n\troute.children.forEach((childRoute) => markRouteRecordActive(childRoute, currentRoute));\n}\nfunction resetMatchStateOnRouteRecord(route) {\n\troute.__vd_match = false;\n\troute.children.forEach(resetMatchStateOnRouteRecord);\n}\nfunction isRouteMatching(route, filter) {\n\tconst found = String(route.re).match(EXTRACT_REGEXP_RE);\n\troute.__vd_match = false;\n\tif (!found || found.length < 3) return false;\n\tif (new RegExp(found[1].replace(/\\$$/, \"\"), found[2]).test(filter)) {\n\t\troute.children.forEach((child) => isRouteMatching(child, filter));\n\t\tif (route.record.path !== \"/\" || filter === \"/\") {\n\t\t\troute.__vd_match = route.re.test(filter);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tconst path = route.record.path.toLowerCase();\n\tconst decodedPath = decode(path);\n\tif (!filter.startsWith(\"/\") && (decodedPath.includes(filter) || path.includes(filter))) return true;\n\tif (decodedPath.startsWith(filter) || path.startsWith(filter)) return true;\n\tif (route.record.name && String(route.record.name).includes(filter)) return true;\n\treturn route.children.some((child) => isRouteMatching(child, filter));\n}\nfunction omit(obj, keys) {\n\tconst ret = {};\n\tfor (const key in obj) if (!keys.includes(key)) ret[key] = obj[key];\n\treturn ret;\n}\n\n//#endregion\nexport { isBrowser as $, START as A, stringifyURL as B, computeScrollPosition as C, scrollToPosition as D, saveScrollPosition as E, isSameRouteLocation as F, encodePath as G, decode as H, isSameRouteLocationParams as I, assign as J, warn$1 as K, isSameRouteRecord as L, normalizeBase as M, NEW_stringifyURL as N, NavigationDirection as O, START_LOCATION_NORMALIZED as P, noop as Q, parseURL as R, isRouteName as S, getScrollKey as T, encodeHash as U, stripBase as V, encodeParam as W, isArray as X, identityFn as Y, mergeOptions as Z, ErrorTypes as _, loadRouteLocation as a, isNavigationFailure as b, useCallbacks as c, routerKey as d, routerViewLocationKey as f, stringifyQuery as g, parseQuery as h, guardToPromiseFn as i, createHref as j, NavigationType as k, matchedRouteKey as l, normalizeQuery as m, extractChangingRecords as n, onBeforeRouteLeave as o, viewDepthKey as p, applyToParams as q, extractComponentsGuards as r, onBeforeRouteUpdate as s, addDevtools as t, routeLocationKey as u, NavigationFailureType as v, getSavedScrollPosition as w, isRouteLocation as x, createRouterError as y, resolveRelativePath as z };","/*!\n * vue-router v4.6.4\n * (c) 2025 Eduardo San Martin Morote\n * @license MIT\n */\nimport { $ as isBrowser, A as START, B as stringifyURL, C as computeScrollPosition, D as scrollToPosition, E as saveScrollPosition, F as isSameRouteLocation, H as decode, I as isSameRouteLocationParams, J as assign, K as warn$1, L as isSameRouteRecord, M as normalizeBase, O as NavigationDirection, P as START_LOCATION_NORMALIZED, Q as noop, R as parseURL, S as isRouteName, T as getScrollKey, U as encodeHash, V as stripBase, W as encodeParam, X as isArray, Z as mergeOptions, _ as ErrorTypes, a as loadRouteLocation, b as isNavigationFailure, c as useCallbacks, d as routerKey, f as routerViewLocationKey, g as stringifyQuery, h as parseQuery, i as guardToPromiseFn, j as createHref, k as NavigationType, l as matchedRouteKey, m as normalizeQuery, n as extractChangingRecords, o as onBeforeRouteLeave, p as viewDepthKey, q as applyToParams, r as extractComponentsGuards, s as onBeforeRouteUpdate, t as addDevtools, u as routeLocationKey, v as NavigationFailureType, w as getSavedScrollPosition, x as isRouteLocation, y as createRouterError } from \"./devtools-EWN81iOl.mjs\";\nimport { computed, defineComponent, getCurrentInstance, h, inject, nextTick, provide, reactive, ref, shallowReactive, shallowRef, unref, watch, watchEffect } from \"vue\";\n\n//#region src/history/html5.ts\nlet createBaseLocation = () => location.protocol + \"//\" + location.host;\n/**\n* Creates a normalized history location from a window.location object\n* @param base - The base path\n* @param location - The window.location object\n*/\nfunction createCurrentLocation(base, location$1) {\n\tconst { pathname, search, hash } = location$1;\n\tconst hashPos = base.indexOf(\"#\");\n\tif (hashPos > -1) {\n\t\tlet slicePos = hash.includes(base.slice(hashPos)) ? base.slice(hashPos).length : 1;\n\t\tlet pathFromHash = hash.slice(slicePos);\n\t\tif (pathFromHash[0] !== \"/\") pathFromHash = \"/\" + pathFromHash;\n\t\treturn stripBase(pathFromHash, \"\");\n\t}\n\treturn stripBase(pathname, base) + search + hash;\n}\nfunction useHistoryListeners(base, historyState, currentLocation, replace) {\n\tlet listeners = [];\n\tlet teardowns = [];\n\tlet pauseState = null;\n\tconst popStateHandler = ({ state }) => {\n\t\tconst to = createCurrentLocation(base, location);\n\t\tconst from = currentLocation.value;\n\t\tconst fromState = historyState.value;\n\t\tlet delta = 0;\n\t\tif (state) {\n\t\t\tcurrentLocation.value = to;\n\t\t\thistoryState.value = state;\n\t\t\tif (pauseState && pauseState === from) {\n\t\t\t\tpauseState = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdelta = fromState ? state.position - fromState.position : 0;\n\t\t} else replace(to);\n\t\tlisteners.forEach((listener) => {\n\t\t\tlistener(currentLocation.value, from, {\n\t\t\t\tdelta,\n\t\t\t\ttype: NavigationType.pop,\n\t\t\t\tdirection: delta ? delta > 0 ? NavigationDirection.forward : NavigationDirection.back : NavigationDirection.unknown\n\t\t\t});\n\t\t});\n\t};\n\tfunction pauseListeners() {\n\t\tpauseState = currentLocation.value;\n\t}\n\tfunction listen(callback) {\n\t\tlisteners.push(callback);\n\t\tconst teardown = () => {\n\t\t\tconst index = listeners.indexOf(callback);\n\t\t\tif (index > -1) listeners.splice(index, 1);\n\t\t};\n\t\tteardowns.push(teardown);\n\t\treturn teardown;\n\t}\n\tfunction beforeUnloadListener() {\n\t\tif (document.visibilityState === \"hidden\") {\n\t\t\tconst { history: history$1 } = window;\n\t\t\tif (!history$1.state) return;\n\t\t\thistory$1.replaceState(assign({}, history$1.state, { scroll: computeScrollPosition() }), \"\");\n\t\t}\n\t}\n\tfunction destroy() {\n\t\tfor (const teardown of teardowns) teardown();\n\t\tteardowns = [];\n\t\twindow.removeEventListener(\"popstate\", popStateHandler);\n\t\twindow.removeEventListener(\"pagehide\", beforeUnloadListener);\n\t\tdocument.removeEventListener(\"visibilitychange\", beforeUnloadListener);\n\t}\n\twindow.addEventListener(\"popstate\", popStateHandler);\n\twindow.addEventListener(\"pagehide\", beforeUnloadListener);\n\tdocument.addEventListener(\"visibilitychange\", beforeUnloadListener);\n\treturn {\n\t\tpauseListeners,\n\t\tlisten,\n\t\tdestroy\n\t};\n}\n/**\n* Creates a state object\n*/\nfunction buildState(back, current, forward, replaced = false, computeScroll = false) {\n\treturn {\n\t\tback,\n\t\tcurrent,\n\t\tforward,\n\t\treplaced,\n\t\tposition: window.history.length,\n\t\tscroll: computeScroll ? computeScrollPosition() : null\n\t};\n}\nfunction useHistoryStateNavigation(base) {\n\tconst { history: history$1, location: location$1 } = window;\n\tconst currentLocation = { value: createCurrentLocation(base, location$1) };\n\tconst historyState = { value: history$1.state };\n\tif (!historyState.value) changeLocation(currentLocation.value, {\n\t\tback: null,\n\t\tcurrent: currentLocation.value,\n\t\tforward: null,\n\t\tposition: history$1.length - 1,\n\t\treplaced: true,\n\t\tscroll: null\n\t}, true);\n\tfunction changeLocation(to, state, replace$1) {\n\t\t/**\n\t\t* if a base tag is provided, and we are on a normal domain, we have to\n\t\t* respect the provided `base` attribute because pushState() will use it and\n\t\t* potentially erase anything before the `#` like at\n\t\t* https://github.com/vuejs/router/issues/685 where a base of\n\t\t* `/folder/#` but a base of `/` would erase the `/folder/` section. If\n\t\t* there is no host, the `<base>` tag makes no sense and if there isn't a\n\t\t* base tag we can just use everything after the `#`.\n\t\t*/\n\t\tconst hashIndex = base.indexOf(\"#\");\n\t\tconst url = hashIndex > -1 ? (location$1.host && document.querySelector(\"base\") ? base : base.slice(hashIndex)) + to : createBaseLocation() + base + to;\n\t\ttry {\n\t\t\thistory$1[replace$1 ? \"replaceState\" : \"pushState\"](state, \"\", url);\n\t\t\thistoryState.value = state;\n\t\t} catch (err) {\n\t\t\tif (process.env.NODE_ENV !== \"production\") warn$1(\"Error with push/replace State\", err);\n\t\t\telse console.error(err);\n\t\t\tlocation$1[replace$1 ? \"replace\" : \"assign\"](url);\n\t\t}\n\t}\n\tfunction replace(to, data) {\n\t\tchangeLocation(to, assign({}, history$1.state, buildState(historyState.value.back, to, historyState.value.forward, true), data, { position: historyState.value.position }), true);\n\t\tcurrentLocation.value = to;\n\t}\n\tfunction push(to, data) {\n\t\tconst currentState = assign({}, historyState.value, history$1.state, {\n\t\t\tforward: to,\n\t\t\tscroll: computeScrollPosition()\n\t\t});\n\t\tif (process.env.NODE_ENV !== \"production\" && !history$1.state) warn$1(\"history.state seems to have been manually replaced without preserving the necessary values. Make sure to preserve existing history state if you are manually calling history.replaceState:\\n\\nhistory.replaceState(history.state, '', url)\\n\\nYou can find more information at https://router.vuejs.org/guide/migration/#Usage-of-history-state\");\n\t\tchangeLocation(currentState.current, currentState, true);\n\t\tchangeLocation(to, assign({}, buildState(currentLocation.value, to, null), { position: currentState.position + 1 }, data), false);\n\t\tcurrentLocation.value = to;\n\t}\n\treturn {\n\t\tlocation: currentLocation,\n\t\tstate: historyState,\n\t\tpush,\n\t\treplace\n\t};\n}\n/**\n* Creates an HTML5 history. Most common history for single page applications.\n*\n* @param base -\n*/\nfunction createWebHistory(base) {\n\tbase = normalizeBase(base);\n\tconst historyNavigation = useHistoryStateNavigation(base);\n\tconst historyListeners = useHistoryListeners(base, historyNavigation.state, historyNavigation.location, historyNavigation.replace);\n\tfunction go(delta, triggerListeners = true) {\n\t\tif (!triggerListeners) historyListeners.pauseListeners();\n\t\thistory.go(delta);\n\t}\n\tconst routerHistory = assign({\n\t\tlocation: \"\",\n\t\tbase,\n\t\tgo,\n\t\tcreateHref: createHref.bind(null, base)\n\t}, historyNavigation, historyListeners);\n\tObject.defineProperty(routerHistory, \"location\", {\n\t\tenumerable: true,\n\t\tget: () => historyNavigation.location.value\n\t});\n\tObject.defineProperty(routerHistory, \"state\", {\n\t\tenumerable: true,\n\t\tget: () => historyNavigation.state.value\n\t});\n\treturn routerHistory;\n}\n\n//#endregion\n//#region src/history/memory.ts\n/**\n* Creates an in-memory based history. The main purpose of this history is to handle SSR. It starts in a special location that is nowhere.\n* It's up to the user to replace that location with the starter location by either calling `router.push` or `router.replace`.\n*\n* @param base - Base applied to all urls, defaults to '/'\n* @returns a history object that can be passed to the router constructor\n*/\nfunction createMemoryHistory(base = \"\") {\n\tlet listeners = [];\n\tlet queue = [[START, {}]];\n\tlet position = 0;\n\tbase = normalizeBase(base);\n\tfunction setLocation(location$1, state = {}) {\n\t\tposition++;\n\t\tif (position !== queue.length) queue.splice(position);\n\t\tqueue.push([location$1, state]);\n\t}\n\tfunction triggerListeners(to, from, { direction, delta }) {\n\t\tconst info = {\n\t\t\tdirection,\n\t\t\tdelta,\n\t\t\ttype: NavigationType.pop\n\t\t};\n\t\tfor (const callback of listeners) callback(to, from, info);\n\t}\n\tconst routerHistory = {\n\t\tlocation: START,\n\t\tstate: {},\n\t\tbase,\n\t\tcreateHref: createHref.bind(null, base),\n\t\treplace(to, state) {\n\t\t\tqueue.splice(position--, 1);\n\t\t\tsetLocation(to, state);\n\t\t},\n\t\tpush(to, state) {\n\t\t\tsetLocation(to, state);\n\t\t},\n\t\tlisten(callback) {\n\t\t\tlisteners.push(callback);\n\t\t\treturn () => {\n\t\t\t\tconst index = listeners.indexOf(callback);\n\t\t\t\tif (index > -1) listeners.splice(index, 1);\n\t\t\t};\n\t\t},\n\t\tdestroy() {\n\t\t\tlisteners = [];\n\t\t\tqueue = [[START, {}]];\n\t\t\tposition = 0;\n\t\t},\n\t\tgo(delta, shouldTrigger = true) {\n\t\t\tconst from = this.location;\n\t\t\tconst direction = delta < 0 ? NavigationDirection.back : NavigationDirection.forward;\n\t\t\tposition = Math.max(0, Math.min(position + delta, queue.length - 1));\n\t\t\tif (shouldTrigger) triggerListeners(this.location, from, {\n\t\t\t\tdirection,\n\t\t\t\tdelta\n\t\t\t});\n\t\t}\n\t};\n\tObject.defineProperty(routerHistory, \"location\", {\n\t\tenumerable: true,\n\t\tget: () => queue[position][0]\n\t});\n\tObject.defineProperty(routerHistory, \"state\", {\n\t\tenumerable: true,\n\t\tget: () => queue[position][1]\n\t});\n\treturn routerHistory;\n}\n\n//#endregion\n//#region src/history/hash.ts\n/**\n* Creates a hash history. Useful for web applications with no host (e.g. `file://`) or when configuring a server to\n* handle any URL is not possible.\n*\n* @param base - optional base to provide. Defaults to `location.pathname + location.search` If there is a `<base>` tag\n* in the `head`, its value will be ignored in favor of this parameter **but note it affects all the history.pushState()\n* calls**, meaning that if you use a `<base>` tag, it's `href` value **has to match this parameter** (ignoring anything\n* after the `#`).\n*\n* @example\n* ```js\n* // at https://example.com/folder\n* createWebHashHistory() // gives a url of `https://example.com/folder#`\n* createWebHashHistory('/folder/') // gives a url of `https://example.com/folder/#`\n* // if the `#` is provided in the base, it won't be added by `createWebHashHistory`\n* createWebHashHistory('/folder/#/app/') // gives a url of `https://example.com/folder/#/app/`\n* // you should avoid doing this because it changes the original url and breaks copying urls\n* createWebHashHistory('/other-folder/') // gives a url of `https://example.com/other-folder/#`\n*\n* // at file:///usr/etc/folder/index.html\n* // for locations with no `host`, the base is ignored\n* createWebHashHistory('/iAmIgnored') // gives a url of `file:///usr/etc/folder/index.html#`\n* ```\n*/\nfunction createWebHashHistory(base) {\n\tbase = location.host ? base || location.pathname + location.search : \"\";\n\tif (!base.includes(\"#\")) base += \"#\";\n\tif (process.env.NODE_ENV !== \"production\" && !base.endsWith(\"#/\") && !base.endsWith(\"#\")) warn$1(`A hash base must end with a \"#\":\\n\"${base}\" should be \"${base.replace(/#.*$/, \"#\")}\".`);\n\treturn createWebHistory(base);\n}\n\n//#endregion\n//#region src/matcher/pathTokenizer.ts\nlet TokenType = /* @__PURE__ */ function(TokenType$1) {\n\tTokenType$1[TokenType$1[\"Static\"] = 0] = \"Static\";\n\tTokenType$1[TokenType$1[\"Param\"] = 1] = \"Param\";\n\tTokenType$1[TokenType$1[\"Group\"] = 2] = \"Group\";\n\treturn TokenType$1;\n}({});\nvar TokenizerState = /* @__PURE__ */ function(TokenizerState$1) {\n\tTokenizerState$1[TokenizerState$1[\"Static\"] = 0] = \"Static\";\n\tTokenizerState$1[TokenizerState$1[\"Param\"] = 1] = \"Param\";\n\tTokenizerState$1[TokenizerState$1[\"ParamRegExp\"] = 2] = \"ParamRegExp\";\n\tTokenizerState$1[TokenizerState$1[\"ParamRegExpEnd\"] = 3] = \"ParamRegExpEnd\";\n\tTokenizerState$1[TokenizerState$1[\"EscapeNext\"] = 4] = \"EscapeNext\";\n\treturn TokenizerState$1;\n}(TokenizerState || {});\nconst ROOT_TOKEN = {\n\ttype: TokenType.Static,\n\tvalue: \"\"\n};\nconst VALID_PARAM_RE = /[a-zA-Z0-9_]/;\nfunction tokenizePath(path) {\n\tif (!path) return [[]];\n\tif (path === \"/\") return [[ROOT_TOKEN]];\n\tif (!path.startsWith(\"/\")) throw new Error(process.env.NODE_ENV !== \"production\" ? `Route paths should start with a \"/\": \"${path}\" should be \"/${path}\".` : `Invalid path \"${path}\"`);\n\tfunction crash(message) {\n\t\tthrow new Error(`ERR (${state})/\"${buffer}\": ${message}`);\n\t}\n\tlet state = TokenizerState.Static;\n\tlet previousState = state;\n\tconst tokens = [];\n\tlet segment;\n\tfunction finalizeSegment() {\n\t\tif (segment) tokens.push(segment);\n\t\tsegment = [];\n\t}\n\tlet i = 0;\n\tlet char;\n\tlet buffer = \"\";\n\tlet customRe = \"\";\n\tfunction consumeBuffer() {\n\t\tif (!buffer) return;\n\t\tif (state === TokenizerState.Static) segment.push({\n\t\t\ttype: TokenType.Static,\n\t\t\tvalue: buffer\n\t\t});\n\t\telse if (state === TokenizerState.Param || state === TokenizerState.ParamRegExp || state === TokenizerState.ParamRegExpEnd) {\n\t\t\tif (segment.length > 1 && (char === \"*\" || char === \"+\")) crash(`A repeatable param (${buffer}) must be alone in its segment. eg: '/:ids+.`);\n\t\t\tsegment.push({\n\t\t\t\ttype: TokenType.Param,\n\t\t\t\tvalue: buffer,\n\t\t\t\tregexp: customRe,\n\t\t\t\trepeatable: char === \"*\" || char === \"+\",\n\t\t\t\toptional: char === \"*\" || char === \"?\"\n\t\t\t});\n\t\t} else crash(\"Invalid state to consume buffer\");\n\t\tbuffer = \"\";\n\t}\n\tfunction addCharToBuffer() {\n\t\tbuffer += char;\n\t}\n\twhile (i < path.length) {\n\t\tchar = path[i++];\n\t\tif (char === \"\\\\\" && state !== TokenizerState.ParamRegExp) {\n\t\t\tpreviousState = state;\n\t\t\tstate = TokenizerState.EscapeNext;\n\t\t\tcontinue;\n\t\t}\n\t\tswitch (state) {\n\t\t\tcase TokenizerState.Static:\n\t\t\t\tif (char === \"/\") {\n\t\t\t\t\tif (buffer) consumeBuffer();\n\t\t\t\t\tfinalizeSegment();\n\t\t\t\t} else if (char === \":\") {\n\t\t\t\t\tconsumeBuffer();\n\t\t\t\t\tstate = TokenizerState.Param;\n\t\t\t\t} else addCharToBuffer();\n\t\t\t\tbreak;\n\t\t\tcase TokenizerState.EscapeNext:\n\t\t\t\taddCharToBuffer();\n\t\t\t\tstate = previousState;\n\t\t\t\tbreak;\n\t\t\tcase TokenizerState.Param:\n\t\t\t\tif (char === \"(\") state = TokenizerState.ParamRegExp;\n\t\t\t\telse if (VALID_PARAM_RE.test(char)) addCharToBuffer();\n\t\t\t\telse {\n\t\t\t\t\tconsumeBuffer();\n\t\t\t\t\tstate = TokenizerState.Static;\n\t\t\t\t\tif (char !== \"*\" && char !== \"?\" && char !== \"+\") i--;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase TokenizerState.ParamRegExp:\n\t\t\t\tif (char === \")\") if (customRe[customRe.length - 1] == \"\\\\\") customRe = customRe.slice(0, -1) + char;\n\t\t\t\telse state = TokenizerState.ParamRegExpEnd;\n\t\t\t\telse customRe += char;\n\t\t\t\tbreak;\n\t\t\tcase TokenizerState.ParamRegExpEnd:\n\t\t\t\tconsumeBuffer();\n\t\t\t\tstate = TokenizerState.Static;\n\t\t\t\tif (char !== \"*\" && char !== \"?\" && char !== \"+\") i--;\n\t\t\t\tcustomRe = \"\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tcrash(\"Unknown state\");\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tif (state === TokenizerState.ParamRegExp) crash(`Unfinished custom RegExp for param \"${buffer}\"`);\n\tconsumeBuffer();\n\tfinalizeSegment();\n\treturn tokens;\n}\n\n//#endregion\n//#region src/matcher/pathParserRanker.ts\nconst BASE_PARAM_PATTERN = \"[^/]+?\";\nconst BASE_PATH_PARSER_OPTIONS = {\n\tsensitive: false,\n\tstrict: false,\n\tstart: true,\n\tend: true\n};\nvar PathScore = /* @__PURE__ */ function(PathScore$1) {\n\tPathScore$1[PathScore$1[\"_multiplier\"] = 10] = \"_multiplier\";\n\tPathScore$1[PathScore$1[\"Root\"] = 90] = \"Root\";\n\tPathScore$1[PathScore$1[\"Segment\"] = 40] = \"Segment\";\n\tPathScore$1[PathScore$1[\"SubSegment\"] = 30] = \"SubSegment\";\n\tPathScore$1[PathScore$1[\"Static\"] = 40] = \"Static\";\n\tPathScore$1[PathScore$1[\"Dynamic\"] = 20] = \"Dynamic\";\n\tPathScore$1[PathScore$1[\"BonusCustomRegExp\"] = 10] = \"BonusCustomRegExp\";\n\tPathScore$1[PathScore$1[\"BonusWildcard\"] = -50] = \"BonusWildcard\";\n\tPathScore$1[PathScore$1[\"BonusRepeatable\"] = -20] = \"BonusRepeatable\";\n\tPathScore$1[PathScore$1[\"BonusOptional\"] = -8] = \"BonusOptional\";\n\tPathScore$1[PathScore$1[\"BonusStrict\"] = .7000000000000001] = \"BonusStrict\";\n\tPathScore$1[PathScore$1[\"BonusCaseSensitive\"] = .25] = \"BonusCaseSensitive\";\n\treturn PathScore$1;\n}(PathScore || {});\nconst REGEX_CHARS_RE = /[.+*?^${}()[\\]/\\\\]/g;\n/**\n* Creates a path parser from an array of Segments (a segment is an array of Tokens)\n*\n* @param segments - array of segments returned by tokenizePath\n* @param extraOptions - optional options for the regexp\n* @returns a PathParser\n*/\nfunction tokensToParser(segments, extraOptions) {\n\tconst options = assign({}, BASE_PATH_PARSER_OPTIONS, extraOptions);\n\tconst score = [];\n\tlet pattern = options.start ? \"^\" : \"\";\n\tconst keys = [];\n\tfor (const segment of segments) {\n\t\tconst segmentScores = segment.length ? [] : [PathScore.Root];\n\t\tif (options.strict && !segment.length) pattern += \"/\";\n\t\tfor (let tokenIndex = 0; tokenIndex < segment.length; tokenIndex++) {\n\t\t\tconst token = segment[tokenIndex];\n\t\t\tlet subSegmentScore = PathScore.Segment + (options.sensitive ? PathScore.BonusCaseSensitive : 0);\n\t\t\tif (token.type === TokenType.Static) {\n\t\t\t\tif (!tokenIndex) pattern += \"/\";\n\t\t\t\tpattern += token.value.replace(REGEX_CHARS_RE, \"\\\\$&\");\n\t\t\t\tsubSegmentScore += PathScore.Static;\n\t\t\t} else if (token.type === TokenType.Param) {\n\t\t\t\tconst { value, repeatable, optional, regexp } = token;\n\t\t\t\tkeys.push({\n\t\t\t\t\tname: value,\n\t\t\t\t\trepeatable,\n\t\t\t\t\toptional\n\t\t\t\t});\n\t\t\t\tconst re$1 = regexp ? regexp : BASE_PARAM_PATTERN;\n\t\t\t\tif (re$1 !== BASE_PARAM_PATTERN) {\n\t\t\t\t\tsubSegmentScore += PathScore.BonusCustomRegExp;\n\t\t\t\t\ttry {\n\t\t\t\t\t\t`${re$1}`;\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\tthrow new Error(`Invalid custom RegExp for param \"${value}\" (${re$1}): ` + err.message);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlet subPattern = repeatable ? `((?:${re$1})(?:/(?:${re$1}))*)` : `(${re$1})`;\n\t\t\t\tif (!tokenIndex) subPattern = optional && segment.length < 2 ? `(?:/${subPattern})` : \"/\" + subPattern;\n\t\t\t\tif (optional) subPattern += \"?\";\n\t\t\t\tpattern += subPattern;\n\t\t\t\tsubSegmentScore += PathScore.Dynamic;\n\t\t\t\tif (optional) subSegmentScore += PathScore.BonusOptional;\n\t\t\t\tif (repeatable) subSegmentScore += PathScore.BonusRepeatable;\n\t\t\t\tif (re$1 === \".*\") subSegmentScore += PathScore.BonusWildcard;\n\t\t\t}\n\t\t\tsegmentScores.push(subSegmentScore);\n\t\t}\n\t\tscore.push(segmentScores);\n\t}\n\tif (options.strict && options.end) {\n\t\tconst i = score.length - 1;\n\t\tscore[i][score[i].length - 1] += PathScore.BonusStrict;\n\t}\n\tif (!options.strict) pattern += \"/?\";\n\tif (options.end) pattern += \"$\";\n\telse if (options.strict && !pattern.endsWith(\"/\")) pattern += \"(?:/|$)\";\n\tconst re = new RegExp(pattern, options.sensitive ? \"\" : \"i\");\n\tfunction parse(path) {\n\t\tconst match = path.match(re);\n\t\tconst params = {};\n\t\tif (!match) return null;\n\t\tfor (let i = 1; i < match.length; i++) {\n\t\t\tconst value = match[i] || \"\";\n\t\t\tconst key = keys[i - 1];\n\t\t\tparams[key.name] = value && key.repeatable ? value.split(\"/\") : value;\n\t\t}\n\t\treturn params;\n\t}\n\tfunction stringify(params) {\n\t\tlet path = \"\";\n\t\tlet avoidDuplicatedSlash = false;\n\t\tfor (const segment of segments) {\n\t\t\tif (!avoidDuplicatedSlash || !path.endsWith(\"/\")) path += \"/\";\n\t\t\tavoidDuplicatedSlash = false;\n\t\t\tfor (const token of segment) if (token.type === TokenType.Static) path += token.value;\n\t\t\telse if (token.type === TokenType.Param) {\n\t\t\t\tconst { value, repeatable, optional } = token;\n\t\t\t\tconst param = value in params ? params[value] : \"\";\n\t\t\t\tif (isArray(param) && !repeatable) throw new Error(`Provided param \"${value}\" is an array but it is not repeatable (* or + modifiers)`);\n\t\t\t\tconst text = isArray(param) ? param.join(\"/\") : param;\n\t\t\t\tif (!text) if (optional) {\n\t\t\t\t\tif (segment.length < 2) if (path.endsWith(\"/\")) path = path.slice(0, -1);\n\t\t\t\t\telse avoidDuplicatedSlash = true;\n\t\t\t\t} else throw new Error(`Missing required param \"${value}\"`);\n\t\t\t\tpath += text;\n\t\t\t}\n\t\t}\n\t\treturn path || \"/\";\n\t}\n\treturn {\n\t\tre,\n\t\tscore,\n\t\tkeys,\n\t\tparse,\n\t\tstringify\n\t};\n}\n/**\n* Compares an array of numbers as used in PathParser.score and returns a\n* number. This function can be used to `sort` an array\n*\n* @param a - first array of numbers\n* @param b - second array of numbers\n* @returns 0 if both are equal, < 0 if a should be sorted first, > 0 if b\n* should be sorted first\n*/\nfunction compareScoreArray(a, b) {\n\tlet i = 0;\n\twhile (i < a.length && i < b.length) {\n\t\tconst diff = b[i] - a[i];\n\t\tif (diff) return diff;\n\t\ti++;\n\t}\n\tif (a.length < b.length) return a.length === 1 && a[0] === PathScore.Static + PathScore.Segment ? -1 : 1;\n\telse if (a.length > b.length) return b.length === 1 && b[0] === PathScore.Static + PathScore.Segment ? 1 : -1;\n\treturn 0;\n}\n/**\n* Compare function that can be used with `sort` to sort an array of PathParser\n*\n* @param a - first PathParser\n* @param b - second PathParser\n* @returns 0 if both are equal, < 0 if a should be sorted first, > 0 if b\n*/\nfunction comparePathParserScore(a, b) {\n\tlet i = 0;\n\tconst aScore = a.score;\n\tconst bScore = b.score;\n\twhile (i < aScore.length && i < bScore.length) {\n\t\tconst comp = compareScoreArray(aScore[i], bScore[i]);\n\t\tif (comp) return comp;\n\t\ti++;\n\t}\n\tif (Math.abs(bScore.length - aScore.length) === 1) {\n\t\tif (isLastScoreNegative(aScore)) return 1;\n\t\tif (isLastScoreNegative(bScore)) return -1;\n\t}\n\treturn bScore.length - aScore.length;\n}\n/**\n* This allows detecting splats at the end of a path: /home/:id(.*)*\n*\n* @param score - score to check\n* @returns true if the last entry is negative\n*/\nfunction isLastScoreNegative(score) {\n\tconst last = score[score.length - 1];\n\treturn score.length > 0 && last[last.length - 1] < 0;\n}\nconst PATH_PARSER_OPTIONS_DEFAULTS = {\n\tstrict: false,\n\tend: true,\n\tsensitive: false\n};\n\n//#endregion\n//#region src/matcher/pathMatcher.ts\nfunction createRouteRecordMatcher(record, parent, options) {\n\tconst parser = tokensToParser(tokenizePath(record.path), options);\n\tif (process.env.NODE_ENV !== \"production\") {\n\t\tconst existingKeys = /* @__PURE__ */ new Set();\n\t\tfor (const key of parser.keys) {\n\t\t\tif (existingKeys.has(key.name)) warn$1(`Found duplicated params with name \"${key.name}\" for path \"${record.path}\". Only the last one will be available on \"$route.params\".`);\n\t\t\texistingKeys.add(key.name);\n\t\t}\n\t}\n\tconst matcher = assign(parser, {\n\t\trecord,\n\t\tparent,\n\t\tchildren: [],\n\t\talias: []\n\t});\n\tif (parent) {\n\t\tif (!matcher.record.aliasOf === !parent.record.aliasOf) parent.children.push(matcher);\n\t}\n\treturn matcher;\n}\n\n//#endregion\n//#region src/matcher/index.ts\n/**\n* Creates a Router Matcher.\n*\n* @internal\n* @param routes - array of initial routes\n* @param globalOptions - global route options\n*/\nfunction createRouterMatcher(routes, globalOptions) {\n\tconst matchers = [];\n\tconst matcherMap = /* @__PURE__ */ new Map();\n\tglobalOptions = mergeOptions(PATH_PARSER_OPTIONS_DEFAULTS, globalOptions);\n\tfunction getRecordMatcher(name) {\n\t\treturn matcherMap.get(name);\n\t}\n\tfunction addRoute(record, parent, originalRecord) {\n\t\tconst isRootAdd = !originalRecord;\n\t\tconst mainNormalizedRecord = normalizeRouteRecord(record);\n\t\tif (process.env.NODE_ENV !== \"production\") checkChildMissingNameWithEmptyPath(mainNormalizedRecord, parent);\n\t\tmainNormalizedRecord.aliasOf = originalRecord && originalRecord.record;\n\t\tconst options = mergeOptions(globalOptions, record);\n\t\tconst normalizedRecords = [mainNormalizedRecord];\n\t\tif (\"alias\" in record) {\n\t\t\tconst aliases = typeof record.alias === \"string\" ? [record.alias] : record.alias;\n\t\t\tfor (const alias of aliases) normalizedRecords.push(normalizeRouteRecord(assign({}, mainNormalizedRecord, {\n\t\t\t\tcomponents: originalRecord ? originalRecord.record.components : mainNormalizedRecord.components,\n\t\t\t\tpath: alias,\n\t\t\t\taliasOf: originalRecord ? originalRecord.record : mainNormalizedRecord\n\t\t\t})));\n\t\t}\n\t\tlet matcher;\n\t\tlet originalMatcher;\n\t\tfor (const normalizedRecord of normalizedRecords) {\n\t\t\tconst { path } = normalizedRecord;\n\t\t\tif (parent && path[0] !== \"/\") {\n\t\t\t\tconst parentPath = parent.record.path;\n\t\t\t\tconst connectingSlash = parentPath[parentPath.length - 1] === \"/\" ? \"\" : \"/\";\n\t\t\t\tnormalizedRecord.path = parent.record.path + (path && connectingSlash + path);\n\t\t\t}\n\t\t\tif (process.env.NODE_ENV !== \"production\" && normalizedRecord.path === \"*\") throw new Error(\"Catch all routes (\\\"*\\\") must now be defined using a param with a custom regexp.\\nSee more at https://router.vuejs.org/guide/migration/#Removed-star-or-catch-all-routes.\");\n\t\t\tmatcher = createRouteRecordMatcher(normalizedRecord, parent, options);\n\t\t\tif (process.env.NODE_ENV !== \"production\" && parent && path[0] === \"/\") checkMissingParamsInAbsolutePath(matcher, parent);\n\t\t\tif (originalRecord) {\n\t\t\t\toriginalRecord.alias.push(matcher);\n\t\t\t\tif (process.env.NODE_ENV !== \"production\") checkSameParams(originalRecord, matcher);\n\t\t\t} else {\n\t\t\t\toriginalMatcher = originalMatcher || matcher;\n\t\t\t\tif (originalMatcher !== matcher) originalMatcher.alias.push(matcher);\n\t\t\t\tif (isRootAdd && record.name && !isAliasRecord(matcher)) {\n\t\t\t\t\tif (process.env.NODE_ENV !== \"production\") checkSameNameAsAncestor(record, parent);\n\t\t\t\t\tremoveRoute(record.name);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (isMatchable(matcher)) insertMatcher(matcher);\n\t\t\tif (mainNormalizedRecord.children) {\n\t\t\t\tconst children = mainNormalizedRecord.children;\n\t\t\t\tfor (let i = 0; i < children.length; i++) addRoute(children[i], matcher, originalRecord && originalRecord.children[i]);\n\t\t\t}\n\t\t\toriginalRecord = originalRecord || matcher;\n\t\t}\n\t\treturn originalMatcher ? () => {\n\t\t\tremoveRoute(originalMatcher);\n\t\t} : noop;\n\t}\n\tfunction removeRoute(matcherRef) {\n\t\tif (isRouteName(matcherRef)) {\n\t\t\tconst matcher = matcherMap.get(matcherRef);\n\t\t\tif (matcher) {\n\t\t\t\tmatcherMap.delete(matcherRef);\n\t\t\t\tmatchers.splice(matchers.indexOf(matcher), 1);\n\t\t\t\tmatcher.children.forEach(removeRoute);\n\t\t\t\tmatcher.alias.forEach(removeRoute);\n\t\t\t}\n\t\t} else {\n\t\t\tconst index = matchers.indexOf(matcherRef);\n\t\t\tif (index > -1) {\n\t\t\t\tmatchers.splice(index, 1);\n\t\t\t\tif (matcherRef.record.name) matcherMap.delete(matcherRef.record.name);\n\t\t\t\tmatcherRef.children.forEach(removeRoute);\n\t\t\t\tmatcherRef.alias.forEach(removeRoute);\n\t\t\t}\n\t\t}\n\t}\n\tfunction getRoutes() {\n\t\treturn matchers;\n\t}\n\tfunction insertMatcher(matcher) {\n\t\tconst index = findInsertionIndex(matcher, matchers);\n\t\tmatchers.splice(index, 0, matcher);\n\t\tif (matcher.record.name && !isAliasRecord(matcher)) matcherMap.set(matcher.record.name, matcher);\n\t}\n\tfunction resolve(location$1, currentLocation) {\n\t\tlet matcher;\n\t\tlet params = {};\n\t\tlet path;\n\t\tlet name;\n\t\tif (\"name\" in location$1 && location$1.name) {\n\t\t\tmatcher = matcherMap.get(location$1.name);\n\t\t\tif (!matcher) throw createRouterError(ErrorTypes.MATCHER_NOT_FOUND, { location: location$1 });\n\t\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\t\tconst invalidParams = Object.keys(location$1.params || {}).filter((paramName) => !matcher.keys.find((k) => k.name === paramName));\n\t\t\t\tif (invalidParams.length) warn$1(`Discarded invalid param(s) \"${invalidParams.join(\"\\\", \\\"\")}\" when navigating. See https://github.com/vuejs/router/blob/main/packages/router/CHANGELOG.md#414-2022-08-22 for more details.`);\n\t\t\t}\n\t\t\tname = matcher.record.name;\n\t\t\tparams = assign(pickParams(currentLocation.params, matcher.keys.filter((k) => !k.optional).concat(matcher.parent ? matcher.parent.keys.filter((k) => k.optional) : []).map((k) => k.name)), location$1.params && pickParams(location$1.params, matcher.keys.map((k) => k.name)));\n\t\t\tpath = matcher.stringify(params);\n\t\t} else if (location$1.path != null) {\n\t\t\tpath = location$1.path;\n\t\t\tif (process.env.NODE_ENV !== \"production\" && !path.startsWith(\"/\")) warn$1(`The Matcher cannot resolve relative paths but received \"${path}\". Unless you directly called \\`matcher.resolve(\"${path}\")\\`, this is probably a bug in vue-router. Please open an issue at https://github.com/vuejs/router/issues/new/choose.`);\n\t\t\tmatcher = matchers.find((m) => m.re.test(path));\n\t\t\tif (matcher) {\n\t\t\t\tparams = matcher.parse(path);\n\t\t\t\tname = matcher.record.name;\n\t\t\t}\n\t\t} else {\n\t\t\tmatcher = currentLocation.name ? matcherMap.get(currentLocation.name) : matchers.find((m) => m.re.test(currentLocation.path));\n\t\t\tif (!matcher) throw createRouterError(ErrorTypes.MATCHER_NOT_FOUND, {\n\t\t\t\tlocation: location$1,\n\t\t\t\tcurrentLocation\n\t\t\t});\n\t\t\tname = matcher.record.name;\n\t\t\tparams = assign({}, currentLocation.params, location$1.params);\n\t\t\tpath = matcher.stringify(params);\n\t\t}\n\t\tconst matched = [];\n\t\tlet parentMatcher = matcher;\n\t\twhile (parentMatcher) {\n\t\t\tmatched.unshift(parentMatcher.record);\n\t\t\tparentMatcher = parentMatcher.parent;\n\t\t}\n\t\treturn {\n\t\t\tname,\n\t\t\tpath,\n\t\t\tparams,\n\t\t\tmatched,\n\t\t\tmeta: mergeMetaFields(matched)\n\t\t};\n\t}\n\troutes.forEach((route) => addRoute(route));\n\tfunction clearRoutes() {\n\t\tmatchers.length = 0;\n\t\tmatcherMap.clear();\n\t}\n\treturn {\n\t\taddRoute,\n\t\tresolve,\n\t\tremoveRoute,\n\t\tclearRoutes,\n\t\tgetRoutes,\n\t\tgetRecordMatcher\n\t};\n}\n/**\n* Picks an object param to contain only specified keys.\n*\n* @param params - params object to pick from\n* @param keys - keys to pick\n*/\nfunction pickParams(params, keys) {\n\tconst newParams = {};\n\tfor (const key of keys) if (key in params) newParams[key] = params[key];\n\treturn newParams;\n}\n/**\n* Normalizes a RouteRecordRaw. Creates a copy\n*\n* @param record\n* @returns the normalized version\n*/\nfunction normalizeRouteRecord(record) {\n\tconst normalized = {\n\t\tpath: record.path,\n\t\tredirect: record.redirect,\n\t\tname: record.name,\n\t\tmeta: record.meta || {},\n\t\taliasOf: record.aliasOf,\n\t\tbeforeEnter: record.beforeEnter,\n\t\tprops: normalizeRecordProps(record),\n\t\tchildren: record.children || [],\n\t\tinstances: {},\n\t\tleaveGuards: /* @__PURE__ */ new Set(),\n\t\tupdateGuards: /* @__PURE__ */ new Set(),\n\t\tenterCallbacks: {},\n\t\tcomponents: \"components\" in record ? record.components || null : record.component && { default: record.component }\n\t};\n\tObject.defineProperty(normalized, \"mods\", { value: {} });\n\treturn normalized;\n}\n/**\n* Normalize the optional `props` in a record to always be an object similar to\n* components. Also accept a boolean for components.\n* @param record\n*/\nfunction normalizeRecordProps(record) {\n\tconst propsObject = {};\n\tconst props = record.props || false;\n\tif (\"component\" in record) propsObject.default = props;\n\telse for (const name in record.components) propsObject[name] = typeof props === \"object\" ? props[name] : props;\n\treturn propsObject;\n}\n/**\n* Checks if a record or any of its parent is an alias\n* @param record\n*/\nfunction isAliasRecord(record) {\n\twhile (record) {\n\t\tif (record.record.aliasOf) return true;\n\t\trecord = record.parent;\n\t}\n\treturn false;\n}\n/**\n* Merge meta fields of an array of records\n*\n* @param matched - array of matched records\n*/\nfunction mergeMetaFields(matched) {\n\treturn matched.reduce((meta, record) => assign(meta, record.meta), {});\n}\nfunction isSameParam(a, b) {\n\treturn a.name === b.name && a.optional === b.optional && a.repeatable === b.repeatable;\n}\n/**\n* Check if a path and its alias have the same required params\n*\n* @param a - original record\n* @param b - alias record\n*/\nfunction checkSameParams(a, b) {\n\tfor (const key of a.keys) if (!key.optional && !b.keys.find(isSameParam.bind(null, key))) return warn$1(`Alias \"${b.record.path}\" and the original record: \"${a.record.path}\" must have the exact same param named \"${key.name}\"`);\n\tfor (const key of b.keys) if (!key.optional && !a.keys.find(isSameParam.bind(null, key))) return warn$1(`Alias \"${b.record.path}\" and the original record: \"${a.record.path}\" must have the exact same param named \"${key.name}\"`);\n}\n/**\n* A route with a name and a child with an empty path without a name should warn when adding the route\n*\n* @param mainNormalizedRecord - RouteRecordNormalized\n* @param parent - RouteRecordMatcher\n*/\nfunction checkChildMissingNameWithEmptyPath(mainNormalizedRecord, parent) {\n\tif (parent && parent.record.name && !mainNormalizedRecord.name && !mainNormalizedRecord.path) warn$1(`The route named \"${String(parent.record.name)}\" has a child without a name and an empty path. Using that name won't render the empty path child so you probably want to move the name to the child instead. If this is intentional, add a name to the child route to remove the warning.`);\n}\nfunction checkSameNameAsAncestor(record, parent) {\n\tfor (let ancestor = parent; ancestor; ancestor = ancestor.parent) if (ancestor.record.name === record.name) throw new Error(`A route named \"${String(record.name)}\" has been added as a ${parent === ancestor ? \"child\" : \"descendant\"} of a route with the same name. Route names must be unique and a nested route cannot use the same name as an ancestor.`);\n}\nfunction checkMissingParamsInAbsolutePath(record, parent) {\n\tfor (const key of parent.keys) if (!record.keys.find(isSameParam.bind(null, key))) return warn$1(`Absolute path \"${record.record.path}\" must have the exact same param named \"${key.name}\" as its parent \"${parent.record.path}\".`);\n}\n/**\n* Performs a binary search to find the correct insertion index for a new matcher.\n*\n* Matchers are primarily sorted by their score. If scores are tied then we also consider parent/child relationships,\n* with descendants coming before ancestors. If there's still a tie, new routes are inserted after existing routes.\n*\n* @param matcher - new matcher to be inserted\n* @param matchers - existing matchers\n*/\nfunction findInsertionIndex(matcher, matchers) {\n\tlet lower = 0;\n\tlet upper = matchers.length;\n\twhile (lower !== upper) {\n\t\tconst mid = lower + upper >> 1;\n\t\tif (comparePathParserScore(matcher, matchers[mid]) < 0) upper = mid;\n\t\telse lower = mid + 1;\n\t}\n\tconst insertionAncestor = getInsertionAncestor(matcher);\n\tif (insertionAncestor) {\n\t\tupper = matchers.lastIndexOf(insertionAncestor, upper - 1);\n\t\tif (process.env.NODE_ENV !== \"production\" && upper < 0) warn$1(`Finding ancestor route \"${insertionAncestor.record.path}\" failed for \"${matcher.record.path}\"`);\n\t}\n\treturn upper;\n}\nfunction getInsertionAncestor(matcher) {\n\tlet ancestor = matcher;\n\twhile (ancestor = ancestor.parent) if (isMatchable(ancestor) && comparePathParserScore(matcher, ancestor) === 0) return ancestor;\n}\n/**\n* Checks if a matcher can be reachable. This means if it's possible to reach it as a route. For example, routes without\n* a component, or name, or redirect, are just used to group other routes.\n* @param matcher\n* @param matcher.record record of the matcher\n* @returns\n*/\nfunction isMatchable({ record }) {\n\treturn !!(record.name || record.components && Object.keys(record.components).length || record.redirect);\n}\n\n//#endregion\n//#region src/RouterLink.ts\n/**\n* Returns the internal behavior of a {@link RouterLink} without the rendering part.\n*\n* @param props - a `to` location and an optional `replace` flag\n*/\nfunction useLink(props) {\n\tconst router = inject(routerKey);\n\tconst currentRoute = inject(routeLocationKey);\n\tlet hasPrevious = false;\n\tlet previousTo = null;\n\tconst route = computed(() => {\n\t\tconst to = unref(props.to);\n\t\tif (process.env.NODE_ENV !== \"production\" && (!hasPrevious || to !== previousTo)) {\n\t\t\tif (!isRouteLocation(to)) if (hasPrevious) warn$1(`Invalid value for prop \"to\" in useLink()\\n- to:`, to, `\\n- previous to:`, previousTo, `\\n- props:`, props);\n\t\t\telse warn$1(`Invalid value for prop \"to\" in useLink()\\n- to:`, to, `\\n- props:`, props);\n\t\t\tpreviousTo = to;\n\t\t\thasPrevious = true;\n\t\t}\n\t\treturn router.resolve(to);\n\t});\n\tconst activeRecordIndex = computed(() => {\n\t\tconst { matched } = route.value;\n\t\tconst { length } = matched;\n\t\tconst routeMatched = matched[length - 1];\n\t\tconst currentMatched = currentRoute.matched;\n\t\tif (!routeMatched || !currentMatched.length) return -1;\n\t\tconst index = currentMatched.findIndex(isSameRouteRecord.bind(null, routeMatched));\n\t\tif (index > -1) return index;\n\t\tconst parentRecordPath = getOriginalPath(matched[length - 2]);\n\t\treturn length > 1 && getOriginalPath(routeMatched) === parentRecordPath && currentMatched[currentMatched.length - 1].path !== parentRecordPath ? currentMatched.findIndex(isSameRouteRecord.bind(null, matched[length - 2])) : index;\n\t});\n\tconst isActive = computed(() => activeRecordIndex.value > -1 && includesParams(currentRoute.params, route.value.params));\n\tconst isExactActive = computed(() => activeRecordIndex.value > -1 && activeRecordIndex.value === currentRoute.matched.length - 1 && isSameRouteLocationParams(currentRoute.params, route.value.params));\n\tfunction navigate(e = {}) {\n\t\tif (guardEvent(e)) {\n\t\t\tconst p = router[unref(props.replace) ? \"replace\" : \"push\"](unref(props.to)).catch(noop);\n\t\t\tif (props.viewTransition && typeof document !== \"undefined\" && \"startViewTransition\" in document) document.startViewTransition(() => p);\n\t\t\treturn p;\n\t\t}\n\t\treturn Promise.resolve();\n\t}\n\tif ((process.env.NODE_ENV !== \"production\" || __VUE_PROD_DEVTOOLS__) && isBrowser) {\n\t\tconst instance = getCurrentInstance();\n\t\tif (instance) {\n\t\t\tconst linkContextDevtools = {\n\t\t\t\troute: route.value,\n\t\t\t\tisActive: isActive.value,\n\t\t\t\tisExactActive: isExactActive.value,\n\t\t\t\terror: null\n\t\t\t};\n\t\t\tinstance.__vrl_devtools = instance.__vrl_devtools || [];\n\t\t\tinstance.__vrl_devtools.push(linkContextDevtools);\n\t\t\twatchEffect(() => {\n\t\t\t\tlinkContextDevtools.route = route.value;\n\t\t\t\tlinkContextDevtools.isActive = isActive.value;\n\t\t\t\tlinkContextDevtools.isExactActive = isExactActive.value;\n\t\t\t\tlinkContextDevtools.error = isRouteLocation(unref(props.to)) ? null : \"Invalid \\\"to\\\" value\";\n\t\t\t}, { flush: \"post\" });\n\t\t}\n\t}\n\t/**\n\t* NOTE: update {@link _RouterLinkI}'s `$slots` type when updating this\n\t*/\n\treturn {\n\t\troute,\n\t\thref: computed(() => route.value.href),\n\t\tisActive,\n\t\tisExactActive,\n\t\tnavigate\n\t};\n}\nfunction preferSingleVNode(vnodes) {\n\treturn vnodes.length === 1 ? vnodes[0] : vnodes;\n}\nconst RouterLinkImpl = /* @__PURE__ */ defineComponent({\n\tname: \"RouterLink\",\n\tcompatConfig: { MODE: 3 },\n\tprops: {\n\t\tto: {\n\t\t\ttype: [String, Object],\n\t\t\trequired: true\n\t\t},\n\t\treplace: Boolean,\n\t\tactiveClass: String,\n\t\texactActiveClass: String,\n\t\tcustom: Boolean,\n\t\tariaCurrentValue: {\n\t\t\ttype: String,\n\t\t\tdefault: \"page\"\n\t\t},\n\t\tviewTransition: Boolean\n\t},\n\tuseLink,\n\tsetup(props, { slots }) {\n\t\tconst link = reactive(useLink(props));\n\t\tconst { options } = inject(routerKey);\n\t\tconst elClass = computed(() => ({\n\t\t\t[getLinkClass(props.activeClass, options.linkActiveClass, \"router-link-active\")]: link.isActive,\n\t\t\t[getLinkClass(props.exactActiveClass, options.linkExactActiveClass, \"router-link-exact-active\")]: link.isExactActive\n\t\t}));\n\t\treturn () => {\n\t\t\tconst children = slots.default && preferSingleVNode(slots.default(link));\n\t\t\treturn props.custom ? children : h(\"a\", {\n\t\t\t\t\"aria-current\": link.isExactActive ? props.ariaCurrentValue : null,\n\t\t\t\thref: link.href,\n\t\t\t\tonClick: link.navigate,\n\t\t\t\tclass: elClass.value\n\t\t\t}, children);\n\t\t};\n\t}\n});\n/**\n* Component to render a link that triggers a navigation on click.\n*/\nconst RouterLink = RouterLinkImpl;\nfunction guardEvent(e) {\n\tif (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) return;\n\tif (e.defaultPrevented) return;\n\tif (e.button !== void 0 && e.button !== 0) return;\n\tif (e.currentTarget && e.currentTarget.getAttribute) {\n\t\tconst target = e.currentTarget.getAttribute(\"target\");\n\t\tif (/\\b_blank\\b/i.test(target)) return;\n\t}\n\tif (e.preventDefault) e.preventDefault();\n\treturn true;\n}\nfunction includesParams(outer, inner) {\n\tfor (const key in inner) {\n\t\tconst innerValue = inner[key];\n\t\tconst outerValue = outer[key];\n\t\tif (typeof innerValue === \"string\") {\n\t\t\tif (innerValue !== outerValue) return false;\n\t\t} else if (!isArray(outerValue) || outerValue.length !== innerValue.length || innerValue.some((value, i) => value.valueOf() !== outerValue[i].valueOf())) return false;\n\t}\n\treturn true;\n}\n/**\n* Get the original path value of a record by following its aliasOf\n* @param record\n*/\nfunction getOriginalPath(record) {\n\treturn record ? record.aliasOf ? record.aliasOf.path : record.path : \"\";\n}\n/**\n* Utility class to get the active class based on defaults.\n* @param propClass\n* @param globalClass\n* @param defaultClass\n*/\nconst getLinkClass = (propClass, globalClass, defaultClass) => propClass != null ? propClass : globalClass != null ? globalClass : defaultClass;\n\n//#endregion\n//#region src/RouterView.ts\nconst RouterViewImpl = /* @__PURE__ */ defineComponent({\n\tname: \"RouterView\",\n\tinheritAttrs: false,\n\tprops: {\n\t\tname: {\n\t\t\ttype: String,\n\t\t\tdefault: \"default\"\n\t\t},\n\t\troute: Object\n\t},\n\tcompatConfig: { MODE: 3 },\n\tsetup(props, { attrs, slots }) {\n\t\tprocess.env.NODE_ENV !== \"production\" && warnDeprecatedUsage();\n\t\tconst injectedRoute = inject(routerViewLocationKey);\n\t\tconst routeToDisplay = computed(() => props.route || injectedRoute.value);\n\t\tconst injectedDepth = inject(viewDepthKey, 0);\n\t\tconst depth = computed(() => {\n\t\t\tlet initialDepth = unref(injectedDepth);\n\t\t\tconst { matched } = routeToDisplay.value;\n\t\t\tlet matchedRoute;\n\t\t\twhile ((matchedRoute = matched[initialDepth]) && !matchedRoute.components) initialDepth++;\n\t\t\treturn initialDepth;\n\t\t});\n\t\tconst matchedRouteRef = computed(() => routeToDisplay.value.matched[depth.value]);\n\t\tprovide(viewDepthKey, computed(() => depth.value + 1));\n\t\tprovide(matchedRouteKey, matchedRouteRef);\n\t\tprovide(routerViewLocationKey, routeToDisplay);\n\t\tconst viewRef = ref();\n\t\twatch(() => [\n\t\t\tviewRef.value,\n\t\t\tmatchedRouteRef.value,\n\t\t\tprops.name\n\t\t], ([instance, to, name], [oldInstance, from, oldName]) => {\n\t\t\tif (to) {\n\t\t\t\tto.instances[name] = instance;\n\t\t\t\tif (from && from !== to && instance && instance === oldInstance) {\n\t\t\t\t\tif (!to.leaveGuards.size) to.leaveGuards = from.leaveGuards;\n\t\t\t\t\tif (!to.updateGuards.size) to.updateGuards = from.updateGuards;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (instance && to && (!from || !isSameRouteRecord(to, from) || !oldInstance)) (to.enterCallbacks[name] || []).forEach((callback) => callback(instance));\n\t\t}, { flush: \"post\" });\n\t\treturn () => {\n\t\t\tconst route = routeToDisplay.value;\n\t\t\tconst currentName = props.name;\n\t\t\tconst matchedRoute = matchedRouteRef.value;\n\t\t\tconst ViewComponent = matchedRoute && matchedRoute.components[currentName];\n\t\t\tif (!ViewComponent) return normalizeSlot(slots.default, {\n\t\t\t\tComponent: ViewComponent,\n\t\t\t\troute\n\t\t\t});\n\t\t\tconst routePropsOption = matchedRoute.props[currentName];\n\t\t\tconst routeProps = routePropsOption ? routePropsOption === true ? route.params : typeof routePropsOption === \"function\" ? routePropsOption(route) : routePropsOption : null;\n\t\t\tconst onVnodeUnmounted = (vnode) => {\n\t\t\t\tif (vnode.component.isUnmounted) matchedRoute.instances[currentName] = null;\n\t\t\t};\n\t\t\tconst component = h(ViewComponent, assign({}, routeProps, attrs, {\n\t\t\t\tonVnodeUnmounted,\n\t\t\t\tref: viewRef\n\t\t\t}));\n\t\t\tif ((process.env.NODE_ENV !== \"production\" || __VUE_PROD_DEVTOOLS__) && isBrowser && component.ref) {\n\t\t\t\tconst info = {\n\t\t\t\t\tdepth: depth.value,\n\t\t\t\t\tname: matchedRoute.name,\n\t\t\t\t\tpath: matchedRoute.path,\n\t\t\t\t\tmeta: matchedRoute.meta\n\t\t\t\t};\n\t\t\t\t(isArray(component.ref) ? component.ref.map((r) => r.i) : [component.ref.i]).forEach((instance) => {\n\t\t\t\t\tinstance.__vrv_devtools = info;\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn normalizeSlot(slots.default, {\n\t\t\t\tComponent: component,\n\t\t\t\troute\n\t\t\t}) || component;\n\t\t};\n\t}\n});\nfunction normalizeSlot(slot, data) {\n\tif (!slot) return null;\n\tconst slotContent = slot(data);\n\treturn slotContent.length === 1 ? slotContent[0] : slotContent;\n}\n/**\n* Component to display the current route the user is at.\n*/\nconst RouterView = RouterViewImpl;\nfunction warnDeprecatedUsage() {\n\tconst instance = getCurrentInstance();\n\tconst parentName = instance.parent && instance.parent.type.name;\n\tconst parentSubTreeType = instance.parent && instance.parent.subTree && instance.parent.subTree.type;\n\tif (parentName && (parentName === \"KeepAlive\" || parentName.includes(\"Transition\")) && typeof parentSubTreeType === \"object\" && parentSubTreeType.name === \"RouterView\") {\n\t\tconst comp = parentName === \"KeepAlive\" ? \"keep-alive\" : \"transition\";\n\t\twarn$1(`<router-view> can no longer be used directly inside <transition> or <keep-alive>.\nUse slot props instead:\n\n<router-view v-slot=\"{ Component }\">\n <${comp}>\\n <component :is=\"Component\" />\\n </${comp}>\\n</router-view>`);\n\t}\n}\n\n//#endregion\n//#region src/router.ts\n/**\n* Creates a Router instance that can be used by a Vue app.\n*\n* @param options - {@link RouterOptions}\n*/\nfunction createRouter(options) {\n\tconst matcher = createRouterMatcher(options.routes, options);\n\tconst parseQuery$1 = options.parseQuery || parseQuery;\n\tconst stringifyQuery$1 = options.stringifyQuery || stringifyQuery;\n\tconst routerHistory = options.history;\n\tif (process.env.NODE_ENV !== \"production\" && !routerHistory) throw new Error(\"Provide the \\\"history\\\" option when calling \\\"createRouter()\\\": https://router.vuejs.org/api/interfaces/RouterOptions.html#history\");\n\tconst beforeGuards = useCallbacks();\n\tconst beforeResolveGuards = useCallbacks();\n\tconst afterGuards = useCallbacks();\n\tconst currentRoute = shallowRef(START_LOCATION_NORMALIZED);\n\tlet pendingLocation = START_LOCATION_NORMALIZED;\n\tif (isBrowser && options.scrollBehavior && \"scrollRestoration\" in history) history.scrollRestoration = \"manual\";\n\tconst normalizeParams = applyToParams.bind(null, (paramValue) => \"\" + paramValue);\n\tconst encodeParams = applyToParams.bind(null, encodeParam);\n\tconst decodeParams = applyToParams.bind(null, decode);\n\tfunction addRoute(parentOrRoute, route) {\n\t\tlet parent;\n\t\tlet record;\n\t\tif (isRouteName(parentOrRoute)) {\n\t\t\tparent = matcher.getRecordMatcher(parentOrRoute);\n\t\t\tif (process.env.NODE_ENV !== \"production\" && !parent) warn$1(`Parent route \"${String(parentOrRoute)}\" not found when adding child route`, route);\n\t\t\trecord = route;\n\t\t} else record = parentOrRoute;\n\t\treturn matcher.addRoute(record, parent);\n\t}\n\tfunction removeRoute(name) {\n\t\tconst recordMatcher = matcher.getRecordMatcher(name);\n\t\tif (recordMatcher) matcher.removeRoute(recordMatcher);\n\t\telse if (process.env.NODE_ENV !== \"production\") warn$1(`Cannot remove non-existent route \"${String(name)}\"`);\n\t}\n\tfunction getRoutes() {\n\t\treturn matcher.getRoutes().map((routeMatcher) => routeMatcher.record);\n\t}\n\tfunction hasRoute(name) {\n\t\treturn !!matcher.getRecordMatcher(name);\n\t}\n\tfunction resolve(rawLocation, currentLocation) {\n\t\tcurrentLocation = assign({}, currentLocation || currentRoute.value);\n\t\tif (typeof rawLocation === \"string\") {\n\t\t\tconst locationNormalized = parseURL(parseQuery$1, rawLocation, currentLocation.path);\n\t\t\tconst matchedRoute$1 = matcher.resolve({ path: locationNormalized.path }, currentLocation);\n\t\t\tconst href$1 = routerHistory.createHref(locationNormalized.fullPath);\n\t\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\t\tif (href$1.startsWith(\"//\")) warn$1(`Location \"${rawLocation}\" resolved to \"${href$1}\". A resolved location cannot start with multiple slashes.`);\n\t\t\t\telse if (!matchedRoute$1.matched.length) warn$1(`No match found for location with path \"${rawLocation}\"`);\n\t\t\t}\n\t\t\treturn assign(locationNormalized, matchedRoute$1, {\n\t\t\t\tparams: decodeParams(matchedRoute$1.params),\n\t\t\t\thash: decode(locationNormalized.hash),\n\t\t\t\tredirectedFrom: void 0,\n\t\t\t\thref: href$1\n\t\t\t});\n\t\t}\n\t\tif (process.env.NODE_ENV !== \"production\" && !isRouteLocation(rawLocation)) {\n\t\t\twarn$1(`router.resolve() was passed an invalid location. This will fail in production.\\n- Location:`, rawLocation);\n\t\t\treturn resolve({});\n\t\t}\n\t\tlet matcherLocation;\n\t\tif (rawLocation.path != null) {\n\t\t\tif (process.env.NODE_ENV !== \"production\" && \"params\" in rawLocation && !(\"name\" in rawLocation) && Object.keys(rawLocation.params).length) warn$1(`Path \"${rawLocation.path}\" was passed with params but they will be ignored. Use a named route alongside params instead.`);\n\t\t\tmatcherLocation = assign({}, rawLocation, { path: parseURL(parseQuery$1, rawLocation.path, currentLocation.path).path });\n\t\t} else {\n\t\t\tconst targetParams = assign({}, rawLocation.params);\n\t\t\tfor (const key in targetParams) if (targetParams[key] == null) delete targetParams[key];\n\t\t\tmatcherLocation = assign({}, rawLocation, { params: encodeParams(targetParams) });\n\t\t\tcurrentLocation.params = encodeParams(currentLocation.params);\n\t\t}\n\t\tconst matchedRoute = matcher.resolve(matcherLocation, currentLocation);\n\t\tconst hash = rawLocation.hash || \"\";\n\t\tif (process.env.NODE_ENV !== \"production\" && hash && !hash.startsWith(\"#\")) warn$1(`A \\`hash\\` should always start with the character \"#\". Replace \"${hash}\" with \"#${hash}\".`);\n\t\tmatchedRoute.params = normalizeParams(decodeParams(matchedRoute.params));\n\t\tconst fullPath = stringifyURL(stringifyQuery$1, assign({}, rawLocation, {\n\t\t\thash: encodeHash(hash),\n\t\t\tpath: matchedRoute.path\n\t\t}));\n\t\tconst href = routerHistory.createHref(fullPath);\n\t\tif (process.env.NODE_ENV !== \"production\") {\n\t\t\tif (href.startsWith(\"//\")) warn$1(`Location \"${rawLocation}\" resolved to \"${href}\". A resolved location cannot start with multiple slashes.`);\n\t\t\telse if (!matchedRoute.matched.length) warn$1(`No match found for location with path \"${rawLocation.path != null ? rawLocation.path : rawLocation}\"`);\n\t\t}\n\t\treturn assign({\n\t\t\tfullPath,\n\t\t\thash,\n\t\t\tquery: stringifyQuery$1 === stringifyQuery ? normalizeQuery(rawLocation.query) : rawLocation.query || {}\n\t\t}, matchedRoute, {\n\t\t\tredirectedFrom: void 0,\n\t\t\thref\n\t\t});\n\t}\n\tfunction locationAsObject(to) {\n\t\treturn typeof to === \"string\" ? parseURL(parseQuery$1, to, currentRoute.value.path) : assign({}, to);\n\t}\n\tfunction checkCanceledNavigation(to, from) {\n\t\tif (pendingLocation !== to) return createRouterError(ErrorTypes.NAVIGATION_CANCELLED, {\n\t\t\tfrom,\n\t\t\tto\n\t\t});\n\t}\n\tfunction push(to) {\n\t\treturn pushWithRedirect(to);\n\t}\n\tfunction replace(to) {\n\t\treturn push(assign(locationAsObject(to), { replace: true }));\n\t}\n\tfunction handleRedirectRecord(to, from) {\n\t\tconst lastMatched = to.matched[to.matched.length - 1];\n\t\tif (lastMatched && lastMatched.redirect) {\n\t\t\tconst { redirect } = lastMatched;\n\t\t\tlet newTargetLocation = typeof redirect === \"function\" ? redirect(to, from) : redirect;\n\t\t\tif (typeof newTargetLocation === \"string\") {\n\t\t\t\tnewTargetLocation = newTargetLocation.includes(\"?\") || newTargetLocation.includes(\"#\") ? newTargetLocation = locationAsObject(newTargetLocation) : { path: newTargetLocation };\n\t\t\t\tnewTargetLocation.params = {};\n\t\t\t}\n\t\t\tif (process.env.NODE_ENV !== \"production\" && newTargetLocation.path == null && !(\"name\" in newTargetLocation)) {\n\t\t\t\twarn$1(`Invalid redirect found:\\n${JSON.stringify(newTargetLocation, null, 2)}\\n when navigating to \"${to.fullPath}\". A redirect must contain a name or path. This will break in production.`);\n\t\t\t\tthrow new Error(\"Invalid redirect\");\n\t\t\t}\n\t\t\treturn assign({\n\t\t\t\tquery: to.query,\n\t\t\t\thash: to.hash,\n\t\t\t\tparams: newTargetLocation.path != null ? {} : to.params\n\t\t\t}, newTargetLocation);\n\t\t}\n\t}\n\tfunction pushWithRedirect(to, redirectedFrom) {\n\t\tconst targetLocation = pendingLocation = resolve(to);\n\t\tconst from = currentRoute.value;\n\t\tconst data = to.state;\n\t\tconst force = to.force;\n\t\tconst replace$1 = to.replace === true;\n\t\tconst shouldRedirect = handleRedirectRecord(targetLocation, from);\n\t\tif (shouldRedirect) return pushWithRedirect(assign(locationAsObject(shouldRedirect), {\n\t\t\tstate: typeof shouldRedirect === \"object\" ? assign({}, data, shouldRedirect.state) : data,\n\t\t\tforce,\n\t\t\treplace: replace$1\n\t\t}), redirectedFrom || targetLocation);\n\t\tconst toLocation = targetLocation;\n\t\ttoLocation.redirectedFrom = redirectedFrom;\n\t\tlet failure;\n\t\tif (!force && isSameRouteLocation(stringifyQuery$1, from, targetLocation)) {\n\t\t\tfailure = createRouterError(ErrorTypes.NAVIGATION_DUPLICATED, {\n\t\t\t\tto: toLocation,\n\t\t\t\tfrom\n\t\t\t});\n\t\t\thandleScroll(from, from, true, false);\n\t\t}\n\t\treturn (failure ? Promise.resolve(failure) : navigate(toLocation, from)).catch((error) => isNavigationFailure(error) ? isNavigationFailure(error, ErrorTypes.NAVIGATION_GUARD_REDIRECT) ? error : markAsReady(error) : triggerError(error, toLocation, from)).then((failure$1) => {\n\t\t\tif (failure$1) {\n\t\t\t\tif (isNavigationFailure(failure$1, ErrorTypes.NAVIGATION_GUARD_REDIRECT)) {\n\t\t\t\t\tif (process.env.NODE_ENV !== \"production\" && isSameRouteLocation(stringifyQuery$1, resolve(failure$1.to), toLocation) && redirectedFrom && (redirectedFrom._count = redirectedFrom._count ? redirectedFrom._count + 1 : 1) > 30) {\n\t\t\t\t\t\twarn$1(`Detected a possibly infinite redirection in a navigation guard when going from \"${from.fullPath}\" to \"${toLocation.fullPath}\". Aborting to avoid a Stack Overflow.\\n Are you always returning a new location within a navigation guard? That would lead to this error. Only return when redirecting or aborting, that should fix this. This might break in production if not fixed.`);\n\t\t\t\t\t\treturn Promise.reject(/* @__PURE__ */ new Error(\"Infinite redirect in navigation guard\"));\n\t\t\t\t\t}\n\t\t\t\t\treturn pushWithRedirect(assign({ replace: replace$1 }, locationAsObject(failure$1.to), {\n\t\t\t\t\t\tstate: typeof failure$1.to === \"object\" ? assign({}, data, failure$1.to.state) : data,\n\t\t\t\t\t\tforce\n\t\t\t\t\t}), redirectedFrom || toLocation);\n\t\t\t\t}\n\t\t\t} else failure$1 = finalizeNavigation(toLocation, from, true, replace$1, data);\n\t\t\ttriggerAfterEach(toLocation, from, failure$1);\n\t\t\treturn failure$1;\n\t\t});\n\t}\n\t/**\n\t* Helper to reject and skip all navigation guards if a new navigation happened\n\t* @param to\n\t* @param from\n\t*/\n\tfunction checkCanceledNavigationAndReject(to, from) {\n\t\tconst error = checkCanceledNavigation(to, from);\n\t\treturn error ? Promise.reject(error) : Promise.resolve();\n\t}\n\tfunction runWithContext(fn) {\n\t\tconst app = installedApps.values().next().value;\n\t\treturn app && typeof app.runWithContext === \"function\" ? app.runWithContext(fn) : fn();\n\t}\n\tfunction navigate(to, from) {\n\t\tlet guards;\n\t\tconst [leavingRecords, updatingRecords, enteringRecords] = extractChangingRecords(to, from);\n\t\tguards = extractComponentsGuards(leavingRecords.reverse(), \"beforeRouteLeave\", to, from);\n\t\tfor (const record of leavingRecords) record.leaveGuards.forEach((guard) => {\n\t\t\tguards.push(guardToPromiseFn(guard, to, from));\n\t\t});\n\t\tconst canceledNavigationCheck = checkCanceledNavigationAndReject.bind(null, to, from);\n\t\tguards.push(canceledNavigationCheck);\n\t\treturn runGuardQueue(guards).then(() => {\n\t\t\tguards = [];\n\t\t\tfor (const guard of beforeGuards.list()) guards.push(guardToPromiseFn(guard, to, from));\n\t\t\tguards.push(canceledNavigationCheck);\n\t\t\treturn runGuardQueue(guards);\n\t\t}).then(() => {\n\t\t\tguards = extractComponentsGuards(updatingRecords, \"beforeRouteUpdate\", to, from);\n\t\t\tfor (const record of updatingRecords) record.updateGuards.forEach((guard) => {\n\t\t\t\tguards.push(guardToPromiseFn(guard, to, from));\n\t\t\t});\n\t\t\tguards.push(canceledNavigationCheck);\n\t\t\treturn runGuardQueue(guards);\n\t\t}).then(() => {\n\t\t\tguards = [];\n\t\t\tfor (const record of enteringRecords) if (record.beforeEnter) if (isArray(record.beforeEnter)) for (const beforeEnter of record.beforeEnter) guards.push(guardToPromiseFn(beforeEnter, to, from));\n\t\t\telse guards.push(guardToPromiseFn(record.beforeEnter, to, from));\n\t\t\tguards.push(canceledNavigationCheck);\n\t\t\treturn runGuardQueue(guards);\n\t\t}).then(() => {\n\t\t\tto.matched.forEach((record) => record.enterCallbacks = {});\n\t\t\tguards = extractComponentsGuards(enteringRecords, \"beforeRouteEnter\", to, from, runWithContext);\n\t\t\tguards.push(canceledNavigationCheck);\n\t\t\treturn runGuardQueue(guards);\n\t\t}).then(() => {\n\t\t\tguards = [];\n\t\t\tfor (const guard of beforeResolveGuards.list()) guards.push(guardToPromiseFn(guard, to, from));\n\t\t\tguards.push(canceledNavigationCheck);\n\t\t\treturn runGuardQueue(guards);\n\t\t}).catch((err) => isNavigationFailure(err, ErrorTypes.NAVIGATION_CANCELLED) ? err : Promise.reject(err));\n\t}\n\tfunction triggerAfterEach(to, from, failure) {\n\t\tafterGuards.list().forEach((guard) => runWithContext(() => guard(to, from, failure)));\n\t}\n\t/**\n\t* - Cleans up any navigation guards\n\t* - Changes the url if necessary\n\t* - Calls the scrollBehavior\n\t*/\n\tfunction finalizeNavigation(toLocation, from, isPush, replace$1, data) {\n\t\tconst error = checkCanceledNavigation(toLocation, from);\n\t\tif (error) return error;\n\t\tconst isFirstNavigation = from === START_LOCATION_NORMALIZED;\n\t\tconst state = !isBrowser ? {} : history.state;\n\t\tif (isPush) if (replace$1 || isFirstNavigation) routerHistory.replace(toLocation.fullPath, assign({ scroll: isFirstNavigation && state && state.scroll }, data));\n\t\telse routerHistory.push(toLocation.fullPath, data);\n\t\tcurrentRoute.value = toLocation;\n\t\thandleScroll(toLocation, from, isPush, isFirstNavigation);\n\t\tmarkAsReady();\n\t}\n\tlet removeHistoryListener;\n\tfunction setupListeners() {\n\t\tif (removeHistoryListener) return;\n\t\tremoveHistoryListener = routerHistory.listen((to, _from, info) => {\n\t\t\tif (!router.listening) return;\n\t\t\tconst toLocation = resolve(to);\n\t\t\tconst shouldRedirect = handleRedirectRecord(toLocation, router.currentRoute.value);\n\t\t\tif (shouldRedirect) {\n\t\t\t\tpushWithRedirect(assign(shouldRedirect, {\n\t\t\t\t\treplace: true,\n\t\t\t\t\tforce: true\n\t\t\t\t}), toLocation).catch(noop);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpendingLocation = toLocation;\n\t\t\tconst from = currentRoute.value;\n\t\t\tif (isBrowser) saveScrollPosition(getScrollKey(from.fullPath, info.delta), computeScrollPosition());\n\t\t\tnavigate(toLocation, from).catch((error) => {\n\t\t\t\tif (isNavigationFailure(error, ErrorTypes.NAVIGATION_ABORTED | ErrorTypes.NAVIGATION_CANCELLED)) return error;\n\t\t\t\tif (isNavigationFailure(error, ErrorTypes.NAVIGATION_GUARD_REDIRECT)) {\n\t\t\t\t\tpushWithRedirect(assign(locationAsObject(error.to), { force: true }), toLocation).then((failure) => {\n\t\t\t\t\t\tif (isNavigationFailure(failure, ErrorTypes.NAVIGATION_ABORTED | ErrorTypes.NAVIGATION_DUPLICATED) && !info.delta && info.type === NavigationType.pop) routerHistory.go(-1, false);\n\t\t\t\t\t}).catch(noop);\n\t\t\t\t\treturn Promise.reject();\n\t\t\t\t}\n\t\t\t\tif (info.delta) routerHistory.go(-info.delta, false);\n\t\t\t\treturn triggerError(error, toLocation, from);\n\t\t\t}).then((failure) => {\n\t\t\t\tfailure = failure || finalizeNavigation(toLocation, from, false);\n\t\t\t\tif (failure) {\n\t\t\t\t\tif (info.delta && !isNavigationFailure(failure, ErrorTypes.NAVIGATION_CANCELLED)) routerHistory.go(-info.delta, false);\n\t\t\t\t\telse if (info.type === NavigationType.pop && isNavigationFailure(failure, ErrorTypes.NAVIGATION_ABORTED | ErrorTypes.NAVIGATION_DUPLICATED)) routerHistory.go(-1, false);\n\t\t\t\t}\n\t\t\t\ttriggerAfterEach(toLocation, from, failure);\n\t\t\t}).catch(noop);\n\t\t});\n\t}\n\tlet readyHandlers = useCallbacks();\n\tlet errorListeners = useCallbacks();\n\tlet ready;\n\t/**\n\t* Trigger errorListeners added via onError and throws the error as well\n\t*\n\t* @param error - error to throw\n\t* @param to - location we were navigating to when the error happened\n\t* @param from - location we were navigating from when the error happened\n\t* @returns the error as a rejected promise\n\t*/\n\tfunction triggerError(error, to, from) {\n\t\tmarkAsReady(error);\n\t\tconst list = errorListeners.list();\n\t\tif (list.length) list.forEach((handler) => handler(error, to, from));\n\t\telse {\n\t\t\tif (process.env.NODE_ENV !== \"production\") warn$1(\"uncaught error during route navigation:\");\n\t\t\tconsole.error(error);\n\t\t}\n\t\treturn Promise.reject(error);\n\t}\n\tfunction isReady() {\n\t\tif (ready && currentRoute.value !== START_LOCATION_NORMALIZED) return Promise.resolve();\n\t\treturn new Promise((resolve$1, reject) => {\n\t\t\treadyHandlers.add([resolve$1, reject]);\n\t\t});\n\t}\n\tfunction markAsReady(err) {\n\t\tif (!ready) {\n\t\t\tready = !err;\n\t\t\tsetupListeners();\n\t\t\treadyHandlers.list().forEach(([resolve$1, reject]) => err ? reject(err) : resolve$1());\n\t\t\treadyHandlers.reset();\n\t\t}\n\t\treturn err;\n\t}\n\tfunction handleScroll(to, from, isPush, isFirstNavigation) {\n\t\tconst { scrollBehavior } = options;\n\t\tif (!isBrowser || !scrollBehavior) return Promise.resolve();\n\t\tconst scrollPosition = !isPush && getSavedScrollPosition(getScrollKey(to.fullPath, 0)) || (isFirstNavigation || !isPush) && history.state && history.state.scroll || null;\n\t\treturn nextTick().then(() => scrollBehavior(to, from, scrollPosition)).then((position) => position && scrollToPosition(position)).catch((err) => triggerError(err, to, from));\n\t}\n\tconst go = (delta) => routerHistory.go(delta);\n\tlet started;\n\tconst installedApps = /* @__PURE__ */ new Set();\n\tconst router = {\n\t\tcurrentRoute,\n\t\tlistening: true,\n\t\taddRoute,\n\t\tremoveRoute,\n\t\tclearRoutes: matcher.clearRoutes,\n\t\thasRoute,\n\t\tgetRoutes,\n\t\tresolve,\n\t\toptions,\n\t\tpush,\n\t\treplace,\n\t\tgo,\n\t\tback: () => go(-1),\n\t\tforward: () => go(1),\n\t\tbeforeEach: beforeGuards.add,\n\t\tbeforeResolve: beforeResolveGuards.add,\n\t\tafterEach: afterGuards.add,\n\t\tonError: errorListeners.add,\n\t\tisReady,\n\t\tinstall(app) {\n\t\t\tapp.component(\"RouterLink\", RouterLink);\n\t\t\tapp.component(\"RouterView\", RouterView);\n\t\t\tapp.config.globalProperties.$router = router;\n\t\t\tObject.defineProperty(app.config.globalProperties, \"$route\", {\n\t\t\t\tenumerable: true,\n\t\t\t\tget: () => unref(currentRoute)\n\t\t\t});\n\t\t\tif (isBrowser && !started && currentRoute.value === START_LOCATION_NORMALIZED) {\n\t\t\t\tstarted = true;\n\t\t\t\tpush(routerHistory.location).catch((err) => {\n\t\t\t\t\tif (process.env.NODE_ENV !== \"production\") warn$1(\"Unexpected error when starting the router:\", err);\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst reactiveRoute = {};\n\t\t\tfor (const key in START_LOCATION_NORMALIZED) Object.defineProperty(reactiveRoute, key, {\n\t\t\t\tget: () => currentRoute.value[key],\n\t\t\t\tenumerable: true\n\t\t\t});\n\t\t\tapp.provide(routerKey, router);\n\t\t\tapp.provide(routeLocationKey, shallowReactive(reactiveRoute));\n\t\t\tapp.provide(routerViewLocationKey, currentRoute);\n\t\t\tconst unmountApp = app.unmount;\n\t\t\tinstalledApps.add(app);\n\t\t\tapp.unmount = function() {\n\t\t\t\tinstalledApps.delete(app);\n\t\t\t\tif (installedApps.size < 1) {\n\t\t\t\t\tpendingLocation = START_LOCATION_NORMALIZED;\n\t\t\t\t\tremoveHistoryListener && removeHistoryListener();\n\t\t\t\t\tremoveHistoryListener = null;\n\t\t\t\t\tcurrentRoute.value = START_LOCATION_NORMALIZED;\n\t\t\t\t\tstarted = false;\n\t\t\t\t\tready = false;\n\t\t\t\t}\n\t\t\t\tunmountApp();\n\t\t\t};\n\t\t\tif ((process.env.NODE_ENV !== \"production\" || __VUE_PROD_DEVTOOLS__) && isBrowser) addDevtools(app, router, matcher);\n\t\t}\n\t};\n\tfunction runGuardQueue(guards) {\n\t\treturn guards.reduce((promise, guard) => promise.then(() => runWithContext(guard)), Promise.resolve());\n\t}\n\treturn router;\n}\n\n//#endregion\n//#region src/useApi.ts\n/**\n* Returns the router instance. Equivalent to using `$router` inside\n* templates.\n*/\nfunction useRouter() {\n\treturn inject(routerKey);\n}\n/**\n* Returns the current route location. Equivalent to using `$route` inside\n* templates.\n*/\nfunction useRoute(_name) {\n\treturn inject(routeLocationKey);\n}\n\n//#endregion\nexport { NavigationFailureType, RouterLink, RouterView, START_LOCATION_NORMALIZED as START_LOCATION, createMemoryHistory, createRouter, createRouterMatcher, createWebHashHistory, createWebHistory, isNavigationFailure, loadRouteLocation, matchedRouteKey, onBeforeRouteLeave, onBeforeRouteUpdate, parseQuery, routeLocationKey, routerKey, routerViewLocationKey, stringifyQuery, useLink, useRoute, useRouter, viewDepthKey };","<script setup lang=\"ts\">\nimport { useRouter } from 'vue-router'\nimport Button from 'primevue/button'\nimport WStatusTag from './WStatusTag.vue'\n\nconst props = defineProps<{\n title: string\n subtitle?: string\n icon?: string\n backRoute?: string\n backTo?: string | Record<string, unknown>\n status?: string\n statusMap?: Record<string, { label: string; severity: string }>\n}>()\n\nconst router = useRouter()\n\nfunction goBack() {\n if (props.backTo) {\n router.push(typeof props.backTo === 'string' ? { name: props.backTo } : props.backTo)\n } else if (props.backRoute) {\n router.push({ name: props.backRoute })\n } else {\n router.back()\n }\n}\n</script>\n\n<template>\n <div class=\"w-detail-header\">\n <div class=\"w-detail-header-left\">\n <Button icon=\"pi pi-arrow-left\" text rounded @click=\"goBack\" />\n <i v-if=\"icon\" :class=\"icon\" class=\"w-detail-header-icon\" />\n <div class=\"w-detail-header-content\">\n <h2 class=\"w-detail-header-title\">{{ title }}</h2>\n <p v-if=\"subtitle\" class=\"w-detail-header-subtitle\">{{ subtitle }}</p>\n </div>\n <WStatusTag v-if=\"status\" :value=\"status\" :map=\"statusMap\" />\n </div>\n <div class=\"w-detail-header-actions\">\n <slot name=\"actions\" />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useFormatters } from '@/composables/useFormatters'\n\nexport interface InfoField {\n label: string\n value: string | number | null | undefined\n format?: 'currency' | 'date' | 'datetime' | 'number' | 'text'\n /** Unidade colada ao valor — usada na variante `metric` (ex.: `ha`, `kg`, `L`). */\n suffix?: string\n /** Casas decimais do `format: 'number'` (default 2). */\n decimals?: number\n}\n\nwithDefaults(\n defineProps<{\n title?: string\n fields: InfoField[]\n /** `default`: grade de rótulo em cima e valor embaixo.\n * `metric`: uma linha por campo — rótulo à esquerda, número grande à\n * direita, divisória entre as linhas (o aside \"Resumo\" de um documento). */\n variant?: 'default' | 'metric'\n }>(),\n { variant: 'default' },\n)\n\nconst { formatCurrency, formatDate, formatNumber } = useFormatters()\n\nfunction formatValue(field: InfoField): string {\n const v = field.value\n if (v == null || v === '') return '-'\n if (field.format === 'currency') return formatCurrency(Number(v))\n if (field.format === 'date') return formatDate(String(v))\n if (field.format === 'datetime') return formatDate(String(v), 'DD/MM/YYYY HH:mm')\n if (field.format === 'number') return formatNumber(Number(v), field.decimals ?? 2)\n return String(v)\n}\n</script>\n\n<template>\n <div class=\"w-info-card\" :class=\"`w-info-card--${variant}`\">\n <h3 v-if=\"title\" class=\"w-info-card-title\">{{ title }}</h3>\n\n <div v-if=\"variant === 'metric'\" class=\"w-info-card-metrics\">\n <div v-for=\"field in fields\" :key=\"field.label\" class=\"w-info-card-metric\">\n <span class=\"w-info-card-metric-label\">{{ field.label }}</span>\n <span class=\"w-info-card-metric-value\">{{ formatValue(field) }}</span>\n <span v-if=\"field.suffix\" class=\"w-info-card-metric-suffix\">{{ field.suffix }}</span>\n </div>\n </div>\n\n <div v-else class=\"w-info-card-grid\">\n <div v-for=\"field in fields\" :key=\"field.label\" class=\"w-info-card-field\">\n <span class=\"w-info-card-label\">{{ field.label }}</span>\n <span class=\"w-info-card-value\">{{ formatValue(field) }}</span>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport Skeleton from 'primevue/skeleton'\n\ndefineProps<{\n label: string\n value: string | number\n icon?: string\n hint?: string\n severity?: 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'neutral'\n trend?: {\n value: string\n direction?: 'up' | 'down' | 'neutral'\n }\n loading?: boolean\n}>()\n</script>\n\n<template>\n <article class=\"w-kpi-card\" :class=\"severity ? `w-kpi-card--${severity}` : ''\">\n <template v-if=\"loading\">\n <div class=\"w-kpi-card__loading\">\n <Skeleton shape=\"circle\" size=\"2.75rem\" />\n <div class=\"w-kpi-card__loading-content\">\n <Skeleton width=\"6rem\" height=\"0.75rem\" />\n <Skeleton width=\"7.5rem\" height=\"1.5rem\" />\n <Skeleton width=\"5rem\" height=\"0.75rem\" />\n </div>\n </div>\n </template>\n\n <template v-else>\n <div class=\"w-kpi-card__header\">\n <div v-if=\"icon || $slots.icon\" class=\"w-kpi-card__icon\">\n <slot name=\"icon\">\n <i v-if=\"icon\" :class=\"icon\" />\n </slot>\n </div>\n <div v-if=\"trend || $slots.trend\" class=\"w-kpi-card__trend\">\n <slot name=\"trend\">\n <span\n v-if=\"trend\"\n class=\"w-kpi-card__trend-badge\"\n :class=\"trend.direction ? `w-kpi-card__trend-badge--${trend.direction}` : ''\"\n >\n {{ trend.value }}\n </span>\n </slot>\n </div>\n </div>\n\n <div class=\"w-kpi-card__content\">\n <p class=\"w-kpi-card__label\">{{ label }}</p>\n <div class=\"w-kpi-card__value\">\n <slot name=\"value\">{{ value }}</slot>\n </div>\n <p v-if=\"hint || $slots.hint\" class=\"w-kpi-card__hint\">\n <slot name=\"hint\">{{ hint }}</slot>\n </p>\n </div>\n\n <footer v-if=\"$slots.footer\" class=\"w-kpi-card__footer\">\n <slot name=\"footer\" />\n </footer>\n </template>\n </article>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport type { KpiItem } from '@/types/kpi'\nimport WKpiCard from './WKpiCard.vue'\n\nconst props = withDefaults(\n defineProps<{\n items?: KpiItem[]\n /**\n * Número fixo de colunas (2–6) ou 'auto' para preencher a largura com quantos\n * KPIs couberem (responsivo, sem overflow). Use 'auto' em dashboards que devem\n * aproveitar o máximo da tela.\n */\n columns?: 2 | 3 | 4 | 5 | 6 | 'auto'\n dense?: boolean\n }>(),\n {\n items: () => [],\n columns: 4,\n dense: false,\n },\n)\n\nconst gridClass = computed(() => [\n props.columns === 'auto' ? 'w-kpi-grid--auto' : `w-kpi-grid--cols-${props.columns}`,\n { 'w-kpi-grid--dense': props.dense },\n])\n</script>\n\n<template>\n <div class=\"w-kpi-grid\" :class=\"gridClass\">\n <template v-if=\"$slots.item\">\n <slot v-for=\"(item, index) in items\" :key=\"index\" name=\"item\" :item=\"item\" :index=\"index\" />\n </template>\n <template v-else>\n <WKpiCard\n v-for=\"(item, index) in items\"\n :key=\"index\"\n :label=\"item.label\"\n :value=\"item.value\"\n :icon=\"item.icon\"\n :severity=\"item.severity || 'primary'\"\n :hint=\"item.hint\"\n :trend=\"item.trend\"\n :loading=\"item.loading\"\n />\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\ndefineProps<{\n title: string\n subtitle?: string\n icon?: string\n compact?: boolean\n}>()\n</script>\n\n<template>\n <div class=\"w-section-header\" :class=\"{ 'w-section-header--compact': compact }\">\n <div class=\"w-section-header__main\">\n <div v-if=\"icon || $slots.icon\" class=\"w-section-header__icon\">\n <slot name=\"icon\">\n <i v-if=\"icon\" :class=\"icon\" />\n </slot>\n </div>\n <div class=\"w-section-header__content\">\n <div class=\"w-section-header__title-row\">\n <h3 class=\"w-section-header__title\">{{ title }}</h3>\n <slot name=\"meta\" />\n </div>\n <p v-if=\"subtitle\" class=\"w-section-header__subtitle\">{{ subtitle }}</p>\n </div>\n </div>\n <div v-if=\"$slots.actions\" class=\"w-section-header__actions\">\n <slot name=\"actions\" />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\ndefineProps<{\n title: string\n description?: string\n variant?: 'default' | 'muted' | 'outlined'\n}>()\n</script>\n\n<template>\n <section class=\"w-form-section\" :class=\"variant ? `w-form-section--${variant}` : ''\">\n <div v-if=\"title || description || $slots.actions\" class=\"w-form-section__header\">\n <div class=\"w-form-section__content\">\n <h3 class=\"w-form-section__title\">{{ title }}</h3>\n <p v-if=\"description\" class=\"w-form-section__description\">{{ description }}</p>\n </div>\n <div v-if=\"$slots.actions\" class=\"w-form-section__actions\">\n <slot name=\"actions\" />\n </div>\n </div>\n <div class=\"w-form-section__body\">\n <slot />\n </div>\n </section>\n</template>\n","<script setup lang=\"ts\">\nwithDefaults(\n defineProps<{\n align?: 'between' | 'start' | 'end'\n stackOnMobile?: boolean\n }>(),\n {\n align: 'between',\n stackOnMobile: true,\n },\n)\n</script>\n\n<template>\n <div\n class=\"w-action-bar\"\n :class=\"[`w-action-bar--${align}`, { 'w-action-bar--stack': stackOnMobile }]\"\n >\n <div v-if=\"$slots.primary || $slots.default\" class=\"w-action-bar__primary\">\n <slot name=\"primary\">\n <slot />\n </slot>\n </div>\n <div v-if=\"$slots.filters\" class=\"w-action-bar__filters\">\n <slot name=\"filters\" />\n </div>\n <div v-if=\"$slots.secondary\" class=\"w-action-bar__secondary\">\n <slot name=\"secondary\" />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface ProgressStep {\n key: string\n label: string\n description?: string\n}\n\nconst props = withDefaults(\n defineProps<{\n steps: ProgressStep[]\n currentStep: string\n orientation?: 'horizontal' | 'vertical'\n }>(),\n {\n orientation: 'horizontal',\n },\n)\n\nconst currentIndex = computed(() => props.steps.findIndex((step) => step.key === props.currentStep))\n\nfunction stepState(index: number) {\n if (index < currentIndex.value) return 'done'\n if (index === currentIndex.value) return 'current'\n return 'pending'\n}\n</script>\n\n<template>\n <div class=\"w-progress-flow\" :class=\"`w-progress-flow--${orientation}`\">\n <div\n v-for=\"(step, index) in steps\"\n :key=\"step.key\"\n class=\"w-progress-flow__step\"\n :class=\"`w-progress-flow__step--${stepState(index)}`\"\n >\n <slot name=\"step\" :step=\"step\" :index=\"index\" :state=\"stepState(index)\">\n <div class=\"w-progress-flow__marker\">\n <span>{{ index + 1 }}</span>\n </div>\n <div class=\"w-progress-flow__content\">\n <p class=\"w-progress-flow__label\">{{ step.label }}</p>\n <p v-if=\"step.description\" class=\"w-progress-flow__description\">{{ step.description }}</p>\n </div>\n </slot>\n </div>\n </div>\n</template>\n","import type { ComputedRef, InjectionKey } from 'vue'\n\n/**\n * Contrato entre WStepFlow (container) e WStepSection (etapa). Vive num módulo\n * próprio porque `<script setup>` não exporta valores — a chave precisa ser\n * importável pelos dois SFCs.\n *\n * Quem é a última etapa (a que não desenha linha conectora) NÃO passa por aqui:\n * é `:last-child` no CSS. Registrar as etapas em runtime só serviria para\n * descobrir, com um tick de atraso, algo que o seletor já sabe na primeira\n * pintura.\n */\n/** Como o flow arruma as etapas: coluna (padrão) ou régua no topo. */\nexport type StepFlowOrientation = 'vertical' | 'horizontal'\n\nexport interface StepFlowContext {\n /** Etapa aberta. `0` = todas fechadas. */\n active: ComputedRef<number>\n /** Alterna a etapa: abre a informada, ou fecha tudo se já era a aberta. */\n toggle: (step: number) => void\n disabled: ComputedRef<boolean>\n /**\n * Orientação do flow. Vem pelo contexto de propósito: a etapa se desenha\n * conforme o container, sem o consumidor repetir a prop em cada WStepSection.\n * Fora de um flow a etapa assume `vertical` (card colapsável avulso).\n */\n orientation: ComputedRef<StepFlowOrientation>\n}\n\nexport const W_STEP_FLOW_KEY: InjectionKey<StepFlowContext> = Symbol('w-step-flow')\n","<script setup lang=\"ts\">\nimport { computed, provide, ref } from 'vue'\nimport { W_STEP_FLOW_KEY, type StepFlowOrientation } from '@/utils/stepFlow'\n\n/**\n * Etapas numeradas e colapsáveis (a espinha do editor de documento).\n * Diferente do WProgressFlow, que só ILUSTRA o progresso: aqui cada etapa é um\n * bloco de conteúdo que abre e fecha, e o `v-model` diz qual está aberta.\n *\n * `0` = todas fechadas. É estado do consumidor de propósito: \"continuar para a\n * próxima etapa\" é uma decisão da tela, não do componente.\n */\nconst props = withDefaults(\n defineProps<{\n /** Número da etapa aberta (`v-model`). `0` fecha todas. */\n modelValue?: number\n /**\n * `vertical` empilha as etapas numa coluna (cada uma é um card).\n * `horizontal` põe os cabeçalhos lado a lado numa régua e abre só o corpo da\n * etapa ativa embaixo, na largura inteira — abaixo de 768px cai sozinho\n * para o empilhamento vertical (a régua não cabe).\n */\n orientation?: StepFlowOrientation\n /** Trava o clique no cabeçalho de todas as etapas. */\n disabled?: boolean\n }>(),\n {\n modelValue: 0,\n orientation: 'vertical',\n disabled: false,\n },\n)\n\nconst emit = defineEmits<{ 'update:modelValue': [step: number] }>()\n\nconst active = computed(() => props.modelValue)\nconst disabled = computed(() => props.disabled)\nconst orientation = computed(() => props.orientation)\n\nfunction toggle(step: number) {\n if (props.disabled) return\n emit('update:modelValue', props.modelValue === step ? 0 : step)\n}\n\nprovide(W_STEP_FLOW_KEY, { active, toggle, disabled, orientation })\n\nconst root = ref<HTMLElement | null>(null)\n\n/**\n * Setas / Home / End andam pela régua horizontal. Sem roving tabindex: os\n * cabeçalhos são botões e continuam todos no Tab — a seta é atalho, não a única\n * forma de chegar lá. Na vertical o Tab já resolve, então nem entra.\n */\nfunction onKeydown(event: KeyboardEvent) {\n if (props.orientation !== 'horizontal') return\n const passo = { ArrowRight: 1, ArrowLeft: -1, Home: 0, End: 0 }[event.key]\n if (passo === undefined) return\n\n const triggers = Array.from(\n root.value?.querySelectorAll<HTMLButtonElement>(\n '.w-step-section__head .w-step-section__trigger:not(:disabled)',\n ) ?? [],\n )\n const atual = triggers.indexOf(document.activeElement as HTMLButtonElement)\n if (atual < 0 || triggers.length === 0) return\n\n const alvo =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? triggers.length - 1\n : (atual + passo + triggers.length) % triggers.length\n\n event.preventDefault()\n triggers[alvo].focus()\n}\n</script>\n\n<template>\n <div ref=\"root\" class=\"w-step-flow\" :class=\"`w-step-flow--${orientation}`\" @keydown=\"onKeydown\">\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, ref } from 'vue'\nimport { W_STEP_FLOW_KEY } from '@/utils/stepFlow'\n\n/**\n * Uma etapa do WStepFlow: badge numerada + linha conectora, cabeçalho clicável\n * (título, contador e resumo) e corpo colapsável com rodapé de ação.\n *\n * A orientação NÃO é prop daqui: vem do contexto do flow. Na vertical a etapa é\n * um card na coluna; na horizontal o cabeçalho vira um trecho da régua e só o\n * corpo da etapa ativa é desenhado, embaixo, na largura inteira.\n *\n * Fora de um WStepFlow o componente ainda funciona: ele cai num estado local\n * aberto (e em vertical), para poder ser usado como card colapsável avulso.\n */\nconst props = withDefaults(\n defineProps<{\n /** Número da etapa (1-based) — é o valor que o `v-model` do flow carrega. */\n step: number\n title: string\n /** Texto à direita do título (o \"resumo\" da etapa fechada). */\n summary?: string\n /** Badge de contagem entre o título e o resumo. */\n count?: number | string\n disabled?: boolean\n }>(),\n { disabled: false },\n)\n\nconst flow = inject(W_STEP_FLOW_KEY, null)\n\n/** Sem flow o componente é dono do próprio estado (card colapsável avulso). */\nconst localOpen = ref(true)\n\nconst open = computed(() => (flow ? flow.active.value === props.step : localOpen.value))\nconst isDisabled = computed(() => props.disabled || (flow?.disabled.value ?? false))\nconst horizontal = computed(() => flow?.orientation.value === 'horizontal')\n/** Fora do flow não há próxima etapa, então não há linha para ligar. Dentro do\n * flow a linha existe sempre e o CSS a apaga na ponta (`:last-child` na\n * vertical, `:first-child` na horizontal, onde a linha vem antes da badge). */\nconst hasLine = computed(() => flow !== null)\n/**\n * \"Já passei por aqui\" — inferido da posição, não de validação: o componente não\n * conhece regra de negócio. Só a régua horizontal marca isso; a coluna vertical\n * continua exatamente como era.\n */\nconst done = computed(() => horizontal.value && flow != null && props.step < flow.active.value)\n\nfunction toggle() {\n if (isDisabled.value) return\n if (flow) flow.toggle(props.step)\n else localOpen.value = !localOpen.value\n}\n</script>\n\n<template>\n <div v-if=\"!horizontal\" class=\"w-step-section\" :class=\"{ 'w-step-section--open': open }\">\n <div class=\"w-step-section__rail\">\n <span\n class=\"w-step-section__badge\"\n :class=\"{ 'w-step-section__badge--on': open }\"\n aria-hidden=\"true\"\n >\n {{ step }}\n </span>\n <span v-if=\"hasLine\" class=\"w-step-section__line\" />\n </div>\n\n <div class=\"w-step-section__body\">\n <div class=\"w-step-section__card\">\n <div class=\"w-step-section__header\">\n <button\n type=\"button\"\n class=\"w-step-section__trigger\"\n :aria-expanded=\"open\"\n :aria-current=\"open ? 'step' : undefined\"\n :disabled=\"isDisabled\"\n @click=\"toggle\"\n >\n <i\n class=\"w-step-section__chevron\"\n :class=\"open ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\n />\n <h2 class=\"w-step-section__title\">{{ title }}</h2>\n <span v-if=\"count != null\" class=\"w-step-section__count\">{{ count }}</span>\n <span v-if=\"summary\" class=\"w-step-section__summary\">{{ summary }}</span>\n </button>\n <div v-if=\"$slots.actions\" class=\"w-step-section__actions\">\n <slot name=\"actions\" :open=\"open\" />\n </div>\n </div>\n\n <template v-if=\"open\">\n <div class=\"w-step-section__content\">\n <slot />\n </div>\n <div v-if=\"$slots.footer\" class=\"w-step-section__footer\">\n <slot name=\"footer\" />\n </div>\n </template>\n </div>\n </div>\n </div>\n\n <div\n v-else\n class=\"w-step-section w-step-section--horizontal\"\n :class=\"{ 'w-step-section--open': open, 'w-step-section--done': done }\"\n >\n <div class=\"w-step-section__head\">\n <span\n v-if=\"hasLine\"\n class=\"w-step-section__line\"\n :class=\"{ 'w-step-section__line--done': done || open }\"\n />\n <button\n type=\"button\"\n class=\"w-step-section__trigger\"\n :aria-expanded=\"open\"\n :aria-current=\"open ? 'step' : undefined\"\n :disabled=\"isDisabled\"\n @click=\"toggle\"\n >\n <span\n class=\"w-step-section__badge\"\n :class=\"{\n 'w-step-section__badge--on': open,\n 'w-step-section__badge--done': done,\n }\"\n aria-hidden=\"true\"\n >\n <i v-if=\"done\" class=\"pi pi-check\" />\n <template v-else>{{ step }}</template>\n </span>\n <h2 class=\"w-step-section__title\">{{ title }}</h2>\n <span v-if=\"count != null\" class=\"w-step-section__count\">{{ count }}</span>\n <span v-if=\"summary\" class=\"w-step-section__summary\">{{ summary }}</span>\n </button>\n <div v-if=\"$slots.actions\" class=\"w-step-section__actions\">\n <slot name=\"actions\" :open=\"open\" />\n </div>\n </div>\n\n <div v-if=\"open\" class=\"w-step-section__panel\">\n <div class=\"w-step-section__content\">\n <slot />\n </div>\n <div v-if=\"$slots.footer\" class=\"w-step-section__footer\">\n <slot name=\"footer\" />\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { CheckListItem, CheckListLevel } from '@/types/checkList'\n\n/**\n * Lista de verificações de um documento (o aside \"Verificações\"): um ícone por\n * nível e o contador `N/M` de quantas passaram, no cabeçalho.\n *\n * A avaliação é sempre do backend/serviço — o componente só desenha o que\n * recebe. Ele não conhece regra de negócio nenhuma.\n */\nconst props = withDefaults(\n defineProps<{\n title?: string\n items?: CheckListItem[]\n /** Esconde o contador `N/M` do cabeçalho. */\n showCount?: boolean\n emptyMessage?: string\n }>(),\n {\n items: () => [],\n showCount: true,\n emptyMessage: 'Nenhuma verificação',\n },\n)\n\nconst okCount = computed(() => props.items.filter((i) => i.nivel === 'ok').length)\nconst countLabel = computed(() => `${okCount.value}/${props.items.length}`)\n\nconst ICONS: Record<CheckListLevel, string> = {\n ok: 'pi pi-check-circle',\n warn: 'pi pi-exclamation-triangle',\n bad: 'pi pi-times-circle',\n}\n\nfunction iconOf(nivel: CheckListLevel): string {\n return ICONS[nivel] ?? ICONS.warn\n}\n</script>\n\n<template>\n <div class=\"w-check-list\">\n <div v-if=\"title || showCount\" class=\"w-check-list__header\">\n <span class=\"w-check-list__title\">{{ title }}</span>\n <span v-if=\"showCount\" class=\"w-check-list__count\">{{ countLabel }}</span>\n </div>\n\n <ul v-if=\"items.length\" class=\"w-check-list__items\">\n <li v-for=\"(item, index) in items\" :key=\"`${item.label}-${index}`\" class=\"w-check-list__item\">\n <i :class=\"[iconOf(item.nivel), `w-check-list__icon--${item.nivel}`]\" />\n <span class=\"w-check-list__label\">{{ item.label }}</span>\n </li>\n </ul>\n\n <div v-else class=\"w-check-list__empty\">\n <slot name=\"empty\">{{ emptyMessage }}</slot>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n// `readonly` do Vue entra com apelido: existe uma PROP chamada `readonly`, e no\n// template o binding do import ganharia dela — a função é sempre truthy, então\n// `v-if=\"!readonly\"` nunca renderizaria painel nem rodapé.\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n readonly as somenteLeitura,\n ref,\n watch,\n} from 'vue'\nimport IconField from 'primevue/iconfield'\nimport InputIcon from 'primevue/inputicon'\nimport InputText from 'primevue/inputtext'\nimport type { Geometry } from 'geojson'\nimport type { GeoJSON as LeafletGeoJSON, LatLng, Map as LeafletMap } from 'leaflet'\nimport 'leaflet/dist/leaflet.css'\nimport { useFormatters } from '@/composables/useFormatters'\nimport type {\n MapSelectFeature,\n MapSelectGeometry,\n MapSelectId,\n MapSelectPolygonStyle,\n} from '@/types/mapSelect'\n\n/** Aviso de Leaflet fora do ar. Extraído porque o `readonly` precisa reconhecê-lo:\n * ali não existe lista ao lado para onde mandar o usuário. */\nconst ERRO_MAPA_PADRAO = 'O mapa não pôde ser carregado. Selecione os talhões pela lista ao lado.'\nconst ERRO_MAPA_READONLY = 'O mapa não pôde ser carregado.'\n\n/**\n * Seleção múltipla de polígonos num mapa de satélite, com painel lateral de busca.\n *\n * O componente NÃO é dono da seleção: `modelValue` é a fonte da verdade e todo\n * clique (no polígono ou na lista) sai como `update:modelValue`. Isso mantém o\n * mapa e a lista sempre coerentes — os dois leem o mesmo array.\n *\n * O Leaflet entra por `import()` dinâmico: o mapa costuma viver dentro de um\n * Dialog, e carregar ~150 kB de biblioteca de mapa no bundle de quem só abre um\n * CRUD é desperdício. Se o `import()` falhar (offline, CSP), o mapa é substituído\n * por um aviso e o painel lateral continua funcionando — selecionar talhão pela\n * lista nunca depende do mapa ter subido.\n *\n * `layout` só troca POSICIONAMENTO (CSS): a marcação é a mesma nos dois modos.\n * No `'sobreposto'` o mapa ocupa tudo e o painel/rodapé flutuam por cima em\n * vidro. Eles continuam FORA do container do Leaflet (irmãos, não filhos), então\n * o mapa nunca vê os cliques do painel e o painel nunca precisa de\n * `L.DomEvent.disableClickPropagation` — arrastar/zoom por baixo segue intacto.\n *\n * `readonly` é a via de EXIBIÇÃO: sem painel e sem rodapé, sobra o mapa. Diferente\n * de `disabled`, que mantém os controles à vista, só travados.\n */\nconst props = withDefaults(\n defineProps<{\n /** Ids selecionados (`v-model`). */\n modelValue?: MapSelectId[]\n /** Itens selecionáveis. Sem `geometria` o item some do mapa, não da lista. */\n features?: MapSelectFeature[]\n /** Geometria do escopo (ex.: o setor) usada no `fitBounds` inicial.\n * Sem ela, o enquadramento é a união das geometrias das `features`. */\n scopeGeometry?: MapSelectGeometry | null\n /** Tiles. Default: satélite World_Imagery (ArcGIS/Esri). */\n tileUrl?: string\n tileAttribution?: string\n /** Zoom máximo do tile layer (o World_Imagery vai até 19). */\n maxZoom?: number\n searchPlaceholder?: string\n /** Rótulo do rodapé, à esquerda da área somada. */\n areaLabel?: string\n /** Unidade da área, no rodapé e no tooltip do polígono. */\n areaSuffix?: string\n /** Casas decimais da área. */\n areaDecimals?: number\n /** Altura do mapa (qualquer unidade CSS). */\n height?: string\n /** Arranjo do componente.\n * - `'lado-a-lado'`: mapa à esquerda, painel de 300 px à direita, rodapé embaixo.\n * - `'sobreposto'`: o mapa ocupa tudo; painel e rodapé flutuam sobre ele em vidro. */\n layout?: 'lado-a-lado' | 'sobreposto'\n /** Texto do contador. Default em pt-BR: \"N talhões selecionados\". */\n selectionLabel?: (count: number) => string\n clearLabel?: string\n /** `layout=\"sobreposto\"`: rótulo acessível do botão que recolhe o painel. */\n collapseLabel?: string\n /** `layout=\"sobreposto\"`: rótulo acessível do botão que reabre o painel. */\n expandLabel?: string\n /** Selo sobre o mapa (canto superior direito). `''` esconde. */\n badgeLabel?: string\n emptyMessage?: string\n /** Mensagem quando o Leaflet não carregou. */\n mapErrorMessage?: string\n disabled?: boolean\n /** Só o desenho: esconde o painel de busca e a barra de área, e nenhum clique\n * seleciona. Para **exibir** geometrias (uma listagem, a conferência de um\n * cadastro) — quando o mapa não é o controle de escolha, o painel de busca\n * duplica a busca da própria tela e a área somada não tem o que somar.\n * `modelValue` continua valendo: dá para destacar um polígono de fora. */\n readonly?: boolean\n /** Estilo do polígono não selecionado. */\n polygonStyle?: MapSelectPolygonStyle\n /** Estilo do polígono selecionado. */\n polygonSelectedStyle?: MapSelectPolygonStyle\n }>(),\n {\n modelValue: () => [],\n features: () => [],\n scopeGeometry: null,\n tileUrl:\n 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',\n tileAttribution: 'Imagery © Esri, Maxar, Earthstar Geographics',\n maxZoom: 19,\n searchPlaceholder: 'Buscar talhão ou setor',\n areaLabel: 'Área selecionada',\n areaSuffix: 'ha',\n areaDecimals: 0,\n height: '460px',\n layout: 'lado-a-lado',\n selectionLabel: (count: number) =>\n count === 1 ? '1 talhão selecionado' : `${count} talhões selecionados`,\n clearLabel: 'Limpar seleção',\n collapseLabel: 'Recolher painel de seleção',\n expandLabel: 'Mostrar painel de seleção',\n badgeLabel: 'Satélite',\n emptyMessage: 'Nenhum talhão encontrado',\n mapErrorMessage: ERRO_MAPA_PADRAO,\n disabled: false,\n readonly: false,\n // Tinta de mapa, não cor de UI: estes valores são lidos sobre a imagem de\n // satélite, onde os tokens do tema (claro/escuro) não valem. São props para\n // quem tiver outro fundo poder trocar.\n polygonStyle: () => ({\n color: '#ffffff',\n weight: 2,\n opacity: 0.85,\n fillColor: '#ffffff',\n fillOpacity: 0.06,\n }),\n polygonSelectedStyle: () => ({\n color: '#8fb6e4',\n weight: 3,\n opacity: 1,\n fillColor: '#1f5092',\n fillOpacity: 0.48,\n }),\n },\n)\n\nconst emit = defineEmits<{ 'update:modelValue': [ids: MapSelectId[]] }>()\n\nconst { formatNumber } = useFormatters()\n\n// --- Arranjo e painel flutuante --------------------------------------------\n\nconst isOverlay = computed(() => props.layout === 'sobreposto')\n\n/** Texto customizado sempre vence; só o default é trocado no `readonly`. */\nconst mapErrorText = computed(() =>\n props.readonly && props.mapErrorMessage === ERRO_MAPA_PADRAO\n ? ERRO_MAPA_READONLY\n : props.mapErrorMessage,\n)\n\n/** Estado do painel flutuante — interno de propósito: recolher é gesto de\n * visualização (\"quero ver o mapa\"), não dado do formulário. */\nconst collapsed = ref(false)\n\nfunction setCollapsed(value: boolean) {\n if (collapsed.value === value) return\n collapsed.value = value\n}\n\n/** Recolher devolve o mapa inteiro: o próprio painel vira a pílula (ícone +\n * contador) e cabeçalho/lista saem por `display:none` — somem junto da ordem\n * de tabulação e da árvore de acessibilidade, sem precisar de `inert`. */\nfunction toggleCollapsed() {\n setCollapsed(!collapsed.value)\n}\n\nconst collapseTitle = computed(() => (collapsed.value ? props.expandLabel : props.collapseLabel))\n\n// --- Seleção ---------------------------------------------------------------\n\nconst selected = computed(() => new Set(props.modelValue))\n\nfunction isSelected(id: MapSelectId): boolean {\n return selected.value.has(id)\n}\n\nfunction toggle(id: MapSelectId) {\n if (props.disabled || props.readonly) return\n const next = isSelected(id) ? props.modelValue.filter((x) => x !== id) : [...props.modelValue, id]\n emit('update:modelValue', next)\n}\n\nfunction clear() {\n if (props.disabled || props.readonly || !props.modelValue.length) return\n emit('update:modelValue', [])\n}\n\nconst selectedFeatures = computed(() => props.features.filter((f) => isSelected(f.id)))\n\nconst selectedArea = computed(() =>\n selectedFeatures.value.reduce((total, f) => total + (f.area ?? 0), 0),\n)\n\nconst countText = computed(() => props.selectionLabel(selectedFeatures.value.length))\n\n// --- Busca -----------------------------------------------------------------\n\nconst term = ref('')\n\nfunction normalize(value: string): string {\n return value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n}\n\nconst visibleFeatures = computed(() => {\n const needle = normalize(term.value.trim())\n if (!needle) return props.features\n return props.features.filter((f) => normalize(`${f.nome} ${f.subtitulo ?? ''}`).includes(needle))\n})\n\nfunction areaText(feature: MapSelectFeature): string {\n if (feature.area == null) return ''\n return `${formatNumber(feature.area, props.areaDecimals)} ${props.areaSuffix}`.trim()\n}\n\nconst areaTotalText = computed(() => formatNumber(selectedArea.value, props.areaDecimals))\n\n// --- Mapa ------------------------------------------------------------------\n\ntype Leaflet = typeof import('leaflet')\n\nconst container = ref<HTMLDivElement | null>(null)\nconst root = ref<HTMLDivElement | null>(null)\nconst footer = ref<HTMLDivElement | null>(null)\nconst mapError = ref(false)\n\nlet leaflet: Leaflet | null = null\nlet map: LeafletMap | null = null\nlet observer: ResizeObserver | null = null\nlet footerObserver: ResizeObserver | null = null\nconst layers = new Map<MapSelectId, LeafletGeoJSON>()\n\nfunction styleFor(id: MapSelectId): MapSelectPolygonStyle {\n return isSelected(id) ? props.polygonSelectedStyle : props.polygonStyle\n}\n\nfunction tooltipText(feature: MapSelectFeature): string {\n const area = areaText(feature)\n return area ? `${feature.nome} · ${area}` : feature.nome\n}\n\n/** Redesenha todos os polígonos a partir de `features`. */\nfunction drawFeatures() {\n if (!leaflet || !map) return\n layers.forEach((layer) => layer.remove())\n layers.clear()\n\n for (const feature of props.features) {\n if (!feature.geometria) continue\n const layer = leaflet.geoJSON(feature.geometria as unknown as Geometry, {\n style: () => styleFor(feature.id),\n })\n layer.on('click', () => toggle(feature.id))\n layer.bindTooltip(tooltipText(feature), {\n permanent: true,\n direction: 'center',\n className: 'w-map-select__tip',\n opacity: 1,\n })\n layer.addTo(map)\n layers.set(feature.id, layer)\n }\n\n syncStyles()\n fitToScope()\n}\n\n/** Reaplica o estilo (e a classe do tooltip) conforme a seleção atual. */\nfunction syncStyles() {\n layers.forEach((layer, id) => {\n const on = isSelected(id)\n layer.setStyle(styleFor(id))\n const element = layer.getTooltip()?.getElement()\n element?.classList.toggle('w-map-select__tip--on', on)\n })\n}\n\nfunction fitToScope() {\n if (!leaflet || !map) return\n const corners: LatLng[] = []\n\n if (props.scopeGeometry) {\n const scope = leaflet.geoJSON(props.scopeGeometry as unknown as Geometry).getBounds()\n if (scope.isValid()) corners.push(scope.getSouthWest(), scope.getNorthEast())\n }\n\n if (!corners.length) {\n layers.forEach((layer) => {\n const bounds = layer.getBounds()\n if (bounds.isValid()) corners.push(bounds.getSouthWest(), bounds.getNorthEast())\n })\n }\n\n if (corners.length) map.fitBounds(leaflet.latLngBounds(corners), { padding: [20, 20] })\n else map.setView([0, 0], 2)\n}\n\n/** O mapa costuma nascer escondido (dentro de um Dialog): sem isto o Leaflet\n * calcula 0×0 e desenha só um pedaço quando o container aparece. */\nfunction refreshSize() {\n if (!map || !container.value) return\n if (container.value.clientWidth > 0 && container.value.clientHeight > 0) map.invalidateSize()\n}\n\n/** No `sobreposto` o rodapé é uma barra flutuante: o painel precisa parar acima\n * dela e a atribuição do Leaflet precisa subir. Como a altura depende do que o\n * consumidor põe no `#footer`, ela é MEDIDA e publicada em `--w-map-foot-h` —\n * chutar um valor fixo quebraria com dois botões empilhados. */\nfunction measureFooter() {\n if (!root.value || !footer.value) return\n if (!isOverlay.value) {\n root.value.style.removeProperty('--w-map-foot-h')\n return\n }\n const h = footer.value.offsetHeight\n if (h > 0) root.value.style.setProperty('--w-map-foot-h', `${h}px`)\n}\n\nasync function setupMap() {\n if (!container.value) return\n try {\n const mod = (await import('leaflet')) as unknown as Leaflet & { default?: Leaflet }\n leaflet = mod.default ?? mod\n } catch {\n mapError.value = true\n return\n }\n\n // O componente pode ter sido desmontado durante o import().\n if (!container.value) return\n\n try {\n map = leaflet.map(container.value, { zoomControl: true, attributionControl: true })\n leaflet\n .tileLayer(props.tileUrl, {\n maxZoom: props.maxZoom,\n attribution: props.tileAttribution,\n })\n .addTo(map)\n drawFeatures()\n refreshSize()\n\n if (typeof ResizeObserver !== 'undefined') {\n observer = new ResizeObserver(() => refreshSize())\n observer.observe(container.value)\n }\n } catch {\n mapError.value = true\n }\n}\n\nonMounted(() => {\n void setupMap()\n measureFooter()\n if (typeof ResizeObserver !== 'undefined' && footer.value) {\n footerObserver = new ResizeObserver(() => measureFooter())\n footerObserver.observe(footer.value)\n }\n})\n\nonBeforeUnmount(() => {\n observer?.disconnect()\n observer = null\n footerObserver?.disconnect()\n footerObserver = null\n layers.clear()\n map?.remove()\n map = null\n})\n\nwatch(() => props.features, drawFeatures)\nwatch(() => props.modelValue, syncStyles, { deep: true })\n\n// Recolher/expandir e trocar de arranjo mexem na caixa do mapa. O\n// ResizeObserver do canvas já pegaria, mas ele dispara no frame seguinte: sem o\n// invalidateSize explícito o Leaflet chega a pintar um quadro com tile cortado.\nwatch([collapsed, isOverlay], () => {\n void nextTick(() => {\n measureFooter()\n refreshSize()\n })\n})\n\ndefineExpose({\n refreshSize,\n /** Painel flutuante recolhido? (só faz sentido no `layout=\"sobreposto\"`.) */\n collapsed: somenteLeitura(collapsed),\n setCollapsed,\n})\n</script>\n\n<template>\n <div\n ref=\"root\"\n class=\"w-map-select\"\n :class=\"{\n 'w-map-select--disabled': disabled,\n 'w-map-select--readonly': readonly,\n 'w-map-select--overlay': isOverlay,\n 'w-map-select--collapsed': isOverlay && collapsed && !readonly,\n }\"\n >\n <div class=\"w-map-select__body\">\n <div class=\"w-map-select__map\" :style=\"{ '--w-map-h': height }\">\n <div ref=\"container\" class=\"w-map-select__canvas\" />\n <div v-if=\"mapError\" class=\"w-map-select__fallback\">\n <i class=\"pi pi-map\" />\n <span>{{ mapErrorText }}</span>\n </div>\n <span v-else-if=\"badgeLabel\" class=\"w-map-select__badge\">\n <i class=\"pi pi-globe\" />{{ badgeLabel }}\n </span>\n </div>\n\n <div v-if=\"!readonly\" class=\"w-map-select__panel\">\n <button\n v-if=\"isOverlay\"\n type=\"button\"\n class=\"w-map-select__collapse\"\n :aria-expanded=\"!collapsed\"\n :aria-label=\"collapseTitle\"\n :title=\"collapseTitle\"\n @click=\"toggleCollapsed\"\n >\n <i class=\"pi\" :class=\"collapsed ? 'pi-list' : 'pi-chevron-right'\" />\n <span v-if=\"modelValue.length\" class=\"w-map-select__collapse-count\">\n {{ modelValue.length }}\n </span>\n </button>\n\n <div class=\"w-map-select__panel-head\">\n <IconField>\n <InputIcon class=\"pi pi-search\" />\n <InputText\n v-model=\"term\"\n fluid\n data-kbd-skip\n :placeholder=\"searchPlaceholder\"\n :aria-label=\"searchPlaceholder\"\n />\n </IconField>\n <div class=\"w-map-select__meta\">\n <span class=\"w-map-select__count\">{{ countText }}</span>\n <button\n type=\"button\"\n class=\"w-map-select__clear\"\n :disabled=\"disabled || !modelValue.length\"\n @click=\"clear\"\n >\n {{ clearLabel }}\n </button>\n </div>\n </div>\n\n <ul class=\"w-map-select__list\">\n <li v-for=\"feature in visibleFeatures\" :key=\"feature.id\">\n <slot name=\"item\" :feature=\"feature\" :selected=\"isSelected(feature.id)\">\n <button\n type=\"button\"\n class=\"w-map-select__item\"\n :class=\"{ 'w-map-select__item--on': isSelected(feature.id) }\"\n :aria-pressed=\"isSelected(feature.id)\"\n :disabled=\"disabled\"\n @click=\"toggle(feature.id)\"\n >\n <span class=\"w-map-select__box\">\n <i v-if=\"isSelected(feature.id)\" class=\"pi pi-check\" />\n </span>\n <span class=\"w-map-select__item-text\">\n <span class=\"w-map-select__item-name\">{{ feature.nome }}</span>\n <span v-if=\"feature.subtitulo\" class=\"w-map-select__item-sub\">\n {{ feature.subtitulo }}\n </span>\n </span>\n <i\n v-if=\"!feature.geometria\"\n class=\"pi pi-exclamation-circle w-map-select__item-nogeo\"\n title=\"Talhão sem contorno cadastrado\"\n />\n <span v-if=\"feature.area != null\" class=\"w-map-select__item-area\">\n {{ areaText(feature) }}\n </span>\n </button>\n </slot>\n </li>\n <li v-if=\"!visibleFeatures.length\" class=\"w-map-select__empty\">\n <slot name=\"empty\">{{ emptyMessage }}</slot>\n </li>\n </ul>\n </div>\n </div>\n\n <div v-if=\"!readonly\" ref=\"footer\" class=\"w-map-select__footer\">\n <slot name=\"footer\" :area=\"selectedArea\" :features=\"selectedFeatures\">\n <span class=\"w-map-select__area\">\n {{ areaLabel }}\n <strong>{{ areaTotalText }}</strong>\n <span class=\"w-map-select__area-unit\">{{ areaSuffix }}</span>\n </span>\n </slot>\n </div>\n </div>\n</template>\n","/**\n * Renderer de markdown do design system — leitura em primeiro lugar.\n *\n * A referência é o Material for MkDocs: o texto puro continua legível, mas o\n * autor tem um vocabulário curto para DESTACAR (alertas), ORGANIZAR (passos,\n * cards, abas, detalhes) e ILUSTRAR (código com realce, diagramas mermaid).\n *\n * Duas sintaxes produzem o MESMO alerta, de propósito:\n * `> [!DICA]` — estilo GitHub, sobrevive em qualquer visualizador de markdown\n * `::: dica` — estilo VitePress/MkDocs, aceita título próprio e conteúdo longo\n *\n * Segurança: `html: false` (markdown cru nunca injeta HTML) e todo o output\n * passa pelo DOMPurify antes do `v-html` — defesa em profundidade, porque o\n * conteúdo é escrito por usuários.\n */\nimport MdIt from 'markdown-it'\nimport type { MarkdownIt, StateCore, Token } from 'markdown-it'\nimport DOMPurify from 'dompurify'\nimport anchor from 'markdown-it-anchor'\nimport container from 'markdown-it-container'\nimport abbr from 'markdown-it-abbr'\nimport deflist from 'markdown-it-deflist'\nimport footnote from 'markdown-it-footnote'\nimport ins from 'markdown-it-ins'\nimport mark from 'markdown-it-mark'\nimport sub from 'markdown-it-sub'\nimport sup from 'markdown-it-sup'\nimport type { MarkdownHeading, MarkdownRenderResult } from '@/types/markdown'\n\n/* ==========================================================\n Alertas — o vocabulário de destaque\n ========================================================== */\n\ninterface AlertSpec {\n /** Sufixo da classe CSS e do tom (`md-alert--dica`). */\n tone: string\n /** Título padrão, usado quando o autor não escreve um. */\n label: string\n icon: string\n}\n\nconst ALERTS: Record<string, AlertSpec> = {\n nota: { tone: 'nota', label: 'Nota', icon: 'pi pi-info-circle' },\n dica: { tone: 'dica', label: 'Dica', icon: 'pi pi-lightbulb' },\n importante: { tone: 'importante', label: 'Importante', icon: 'pi pi-bookmark-fill' },\n atencao: { tone: 'atencao', label: 'Atenção', icon: 'pi pi-exclamation-triangle' },\n cuidado: { tone: 'cuidado', label: 'Cuidado', icon: 'pi pi-times-circle' },\n sucesso: { tone: 'sucesso', label: 'Feito', icon: 'pi pi-check-circle' },\n exemplo: { tone: 'exemplo', label: 'Exemplo', icon: 'pi pi-code' },\n resumo: { tone: 'resumo', label: 'Resumo', icon: 'pi pi-align-left' },\n pergunta: { tone: 'pergunta', label: 'Em aberto', icon: 'pi pi-question-circle' },\n}\n\n/** Apelidos aceitos (GitHub, VitePress e MkDocs) → chave canônica. */\nconst ALERT_ALIASES: Record<string, string> = {\n note: 'nota',\n info: 'nota',\n observacao: 'nota',\n tip: 'dica',\n hint: 'dica',\n sugestao: 'dica',\n important: 'importante',\n warning: 'atencao',\n warn: 'atencao',\n attention: 'atencao',\n aviso: 'atencao',\n caution: 'cuidado',\n danger: 'cuidado',\n error: 'cuidado',\n perigo: 'cuidado',\n success: 'sucesso',\n done: 'sucesso',\n feito: 'sucesso',\n example: 'exemplo',\n summary: 'resumo',\n abstract: 'resumo',\n tldr: 'resumo',\n question: 'pergunta',\n help: 'pergunta',\n duvida: 'pergunta',\n}\n\n/** minúsculas + sem acento — `ATENÇÃO`, `Atencao` e `atenção` são o mesmo. */\nfunction normalizar(nome: string): string {\n return nome\n .trim()\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n}\n\nfunction resolverAlerta(nome: string): AlertSpec | null {\n const chave = normalizar(nome)\n return ALERTS[chave] ?? ALERTS[ALERT_ALIASES[chave]] ?? null\n}\n\nconst escapar = new MdIt().utils.escapeHtml\n\nfunction abrirAlerta(spec: AlertSpec, titulo?: string): string {\n const texto = titulo?.trim() || spec.label\n return (\n `<div class=\"md-alert md-alert--${spec.tone}\">` +\n `<p class=\"md-alert__head\"><i class=\"${spec.icon}\" aria-hidden=\"true\"></i>${escapar(texto)}</p>` +\n `<div class=\"md-alert__body\">`\n )\n}\n\nconst FECHAR_ALERTA = '</div></div>'\n\n/* ==========================================================\n Realce de sintaxe — highlight.js carregado sob demanda\n ========================================================== */\n\ntype FuncaoRealce = (codigo: string, linguagem: string) => string\n\n/** Só os idiomas que aparecem na documentação deste produto. */\nconst CARREGADORES: Record<string, () => Promise<{ default: unknown }>> = {\n bash: () => import('highlight.js/lib/languages/bash'),\n python: () => import('highlight.js/lib/languages/python'),\n javascript: () => import('highlight.js/lib/languages/javascript'),\n typescript: () => import('highlight.js/lib/languages/typescript'),\n json: () => import('highlight.js/lib/languages/json'),\n yaml: () => import('highlight.js/lib/languages/yaml'),\n sql: () => import('highlight.js/lib/languages/sql'),\n xml: () => import('highlight.js/lib/languages/xml'),\n css: () => import('highlight.js/lib/languages/css'),\n diff: () => import('highlight.js/lib/languages/diff'),\n ini: () => import('highlight.js/lib/languages/ini'),\n markdown: () => import('highlight.js/lib/languages/markdown'),\n dockerfile: () => import('highlight.js/lib/languages/dockerfile'),\n}\n\nconst APELIDOS_LINGUAGEM: Record<string, string> = {\n sh: 'bash',\n shell: 'bash',\n zsh: 'bash',\n console: 'bash',\n terminal: 'bash',\n js: 'javascript',\n jsx: 'javascript',\n mjs: 'javascript',\n ts: 'typescript',\n tsx: 'typescript',\n py: 'python',\n jsonc: 'json',\n json5: 'json',\n dotenv: 'ini',\n env: 'ini',\n toml: 'ini',\n cfg: 'ini',\n yml: 'yaml',\n html: 'xml',\n htm: 'xml',\n vue: 'xml',\n svg: 'xml',\n md: 'markdown',\n psql: 'sql',\n postgres: 'sql',\n postgresql: 'sql',\n docker: 'dockerfile',\n}\n\nlet realce: FuncaoRealce | null = null\nlet carregando: Promise<void> | null = null\n\n/** Já dá para realçar? (evita re-render inútil quando o pacote já veio) */\nexport function realceDisponivel(): boolean {\n return realce !== null\n}\n\n/**\n * Carrega o highlight.js e os idiomas — sob demanda, uma única vez.\n * Enquanto não chega, o código aparece sem cores (nunca quebrado).\n */\nexport async function carregarRealce(): Promise<void> {\n if (realce || carregando) return carregando ?? undefined\n carregando = (async () => {\n const nucleo = (await import('highlight.js/lib/core')).default\n await Promise.all(\n Object.entries(CARREGADORES).map(async ([nome, carregar]) => {\n const modulo = await carregar()\n nucleo.registerLanguage(nome, modulo.default as never)\n }),\n )\n realce = (codigo, linguagem) => nucleo.highlight(codigo, { language: linguagem }).value\n })()\n await carregando\n}\n\nfunction normalizarLinguagem(info: string): string {\n const bruta = normalizar(info)\n return APELIDOS_LINGUAGEM[bruta] ?? bruta\n}\n\n/* ==========================================================\n Instância markdown-it\n ========================================================== */\n\n/** Slug estável e sem acento para as âncoras (`## Não conformidade` → `nao-conformidade`). */\nfunction slug(texto: string): string {\n return (\n normalizar(texto)\n .replace(/[^\\w\\s-]/g, '')\n .trim()\n .replace(/\\s+/g, '-') || 'secao'\n )\n}\n\nconst NOMES_CONTAINER = new Set([\n 'detalhes',\n 'details',\n 'passos',\n 'steps',\n 'cards',\n 'grade',\n 'abas',\n 'tabs',\n 'aba',\n 'tab',\n])\n\nconst CONTAINER_RE = /^\\s*([^\\s]+)\\s*(.*)$/\n\nfunction criarRenderer(): MarkdownIt {\n const md = new MdIt({ html: false, linkify: true, typographer: false })\n\n md.use(abbr).use(deflist).use(footnote).use(ins).use(mark).use(sub).use(sup)\n\n md.use(anchor, {\n level: [2, 3, 4],\n slugify: slug,\n // Símbolo vazio de propósito: o \"#\" entra por CSS (`.md-anchor::after`),\n // então copiar o título não traz lixo junto.\n permalink: anchor.permalink.linkInsideHeader({\n symbol: '',\n class: 'md-anchor',\n placement: 'after',\n ariaHidden: true,\n }),\n })\n\n aplicarAlertas(md)\n aplicarContainers(md)\n aplicarTarefas(md)\n aplicarCodigo(md)\n aplicarTabelas(md)\n aplicarLinks(md)\n aplicarFiguras(md)\n\n return md\n}\n\n/** `> [!DICA] Título` — alerta com a sintaxe do GitHub (sobrevive fora do portal). */\nfunction aplicarAlertas(md: MarkdownIt): void {\n md.core.ruler.after('block', 'lz_alerta', (state: StateCore) => {\n const tokens = state.tokens\n for (let i = 0; i < tokens.length; i += 1) {\n const abre = tokens[i]\n if (abre.type !== 'blockquote_open') continue\n\n const paragrafo = tokens[i + 1]\n const inline = tokens[i + 2]\n if (paragrafo?.type !== 'paragraph_open' || inline?.type !== 'inline') continue\n\n const marcador = /^\\[!([^\\]\\n]+)\\][ \\t]*([^\\n]*)\\n?/.exec(inline.content)\n if (!marcador) continue\n\n const spec = resolverAlerta(marcador[1])\n if (!spec) continue\n\n const fecha = encontrarFechamento(tokens, i)\n if (!fecha) continue\n\n inline.content = inline.content.slice(marcador[0].length)\n abre.type = 'lz_alerta_open'\n abre.tag = 'div'\n abre.meta = { spec, titulo: marcador[2] }\n fecha.type = 'lz_alerta_close'\n fecha.tag = 'div'\n\n // `> [!DICA]` sozinho na primeira linha deixa um parágrafo vazio para trás.\n if (!inline.content.trim()) {\n tokens.splice(i + 1, 3)\n }\n }\n return true\n })\n\n md.renderer.rules.lz_alerta_open = (tokens, idx) => {\n const meta = tokens[idx].meta as { spec: AlertSpec; titulo?: string }\n return abrirAlerta(meta.spec, meta.titulo)\n }\n md.renderer.rules.lz_alerta_close = () => FECHAR_ALERTA\n}\n\n/** Fechamento do blockquote aberto em `inicio`, respeitando aninhamento. */\nfunction encontrarFechamento(tokens: Token[], inicio: number): Token | null {\n let profundidade = 0\n for (let i = inicio; i < tokens.length; i += 1) {\n const token = tokens[i]\n if (token.type === 'blockquote_open') profundidade += 1\n else if (token.type === 'blockquote_close') {\n profundidade -= 1\n if (profundidade === 0) return token\n }\n }\n return null\n}\n\n/** `::: dica`, `::: passos`, `::: cards`, `::: abas` + `::: aba`, `::: detalhes`. */\nfunction aplicarContainers(md: MarkdownIt): void {\n // A pilha casa o token de fechamento com o de abertura: o render roda em uma\n // passada síncrona, na ordem do documento.\n const pilha: string[] = []\n\n md.use(container, 'lz', {\n validate: (params: string) => {\n const partes = CONTAINER_RE.exec(params)\n if (!partes) return false\n const chave = normalizar(partes[1])\n return NOMES_CONTAINER.has(chave) || resolverAlerta(chave) !== null\n },\n render: (tokens: Token[], idx: number) => {\n const token = tokens[idx]\n if (token.nesting !== 1) {\n const chave = pilha.pop()\n if (chave === 'detalhes') return '</div></details>\\n'\n if (chave === 'aba') return '</section>\\n'\n if (chave === 'alerta') return `${FECHAR_ALERTA}\\n`\n return '</div>\\n'\n }\n\n const partes = CONTAINER_RE.exec(token.info) ?? ['', '', '']\n const chave = normalizar(partes[1])\n const titulo = partes[2]?.trim()\n\n if (chave === 'detalhes' || chave === 'details') {\n pilha.push('detalhes')\n return `<details class=\"md-details\"><summary>${escapar(titulo || 'Detalhes')}</summary><div class=\"md-details__body\">`\n }\n if (chave === 'passos' || chave === 'steps') {\n pilha.push('bloco')\n return '<div class=\"md-steps\">'\n }\n if (chave === 'cards' || chave === 'grade') {\n pilha.push('bloco')\n return '<div class=\"md-cards\">'\n }\n if (chave === 'abas' || chave === 'tabs') {\n pilha.push('bloco')\n return '<div class=\"md-tabs\" data-md-tabs>'\n }\n if (chave === 'aba' || chave === 'tab') {\n pilha.push('aba')\n return `<section class=\"md-tabs__panel\" data-md-tab=\"${escapar(titulo || 'Aba')}\">`\n }\n\n const spec = resolverAlerta(chave)\n if (spec) {\n pilha.push('alerta')\n return abrirAlerta(spec, titulo)\n }\n\n pilha.push('bloco')\n return '<div>'\n },\n })\n}\n\n/** `- [ ]` / `- [x]` viram checkbox desabilitado (leitura; quem marca é a tarefa do projeto). */\nfunction aplicarTarefas(md: MarkdownIt): void {\n md.core.ruler.after('inline', 'lz_tarefas', (state: StateCore) => {\n const tokens = state.tokens\n for (let i = 2; i < tokens.length; i += 1) {\n const inline = tokens[i]\n if (inline.type !== 'inline' || !inline.children?.length) continue\n if (tokens[i - 1].type !== 'paragraph_open' || tokens[i - 2].type !== 'list_item_open')\n continue\n const primeiro = inline.children[0]\n if (primeiro.type !== 'text') continue\n const marcado = /^\\[([ xX])\\]\\s+/.exec(primeiro.content)\n if (!marcado) continue\n\n primeiro.content = primeiro.content.slice(marcado[0].length)\n const checkbox = new state.Token('html_inline', '', 0)\n checkbox.content = `<input type=\"checkbox\" class=\"md-task__check\" disabled${marcado[1] === ' ' ? '' : ' checked'}> `\n inline.children.unshift(checkbox)\n tokens[i - 2].attrJoin('class', 'md-task')\n }\n return true\n })\n}\n\n/** Bloco de código com barra (título + linguagem) e o gancho do botão copiar. */\nfunction aplicarCodigo(md: MarkdownIt): void {\n md.renderer.rules.fence = (tokens, idx) => {\n const token = tokens[idx]\n const info = token.info.trim()\n const primeira = info.split(/\\s+/)[0] ?? ''\n const linguagem = normalizarLinguagem(primeira)\n const titulo = /title=\"([^\"]*)\"/.exec(info)?.[1]\n\n if (linguagem === 'mermaid') {\n return (\n `<figure class=\"md-mermaid\" data-md-mermaid>` +\n `<pre class=\"md-mermaid__fonte\">${escapar(token.content)}</pre>` +\n (titulo ? `<figcaption>${escapar(titulo)}</figcaption>` : '') +\n `</figure>\\n`\n )\n }\n\n const realcado =\n realce && CARREGADORES[linguagem] ? realce(token.content, linguagem) : escapar(token.content)\n\n const barra =\n titulo || primeira\n ? `<div class=\"md-code__bar\">` +\n `<span class=\"md-code__title\">${escapar(titulo ?? '')}</span>` +\n `<span class=\"md-code__lang\">${escapar(primeira)}</span>` +\n `</div>`\n : ''\n\n return (\n `<div class=\"md-code\" data-md-code>${barra}` +\n `<pre class=\"md-code__pre\"><code class=\"hljs language-${escapar(linguagem)}\">${realcado}</code></pre>` +\n `</div>\\n`\n )\n }\n}\n\n/** Tabela larga rola sozinha, sem empurrar a página. */\nfunction aplicarTabelas(md: MarkdownIt): void {\n const original = md.renderer.rules.table_open\n md.renderer.rules.table_open = (tokens, idx, options, env, self) =>\n `<div class=\"md-table\">${original ? original(tokens, idx, options, env, self) : self.renderToken(tokens, idx, options)}`\n md.renderer.rules.table_close = (tokens, idx, options, env, self) =>\n `${self.renderToken(tokens, idx, options)}</div>`\n}\n\n/** Link externo abre em nova aba e se anuncia como externo. */\nfunction aplicarLinks(md: MarkdownIt): void {\n const original = md.renderer.rules.link_open\n md.renderer.rules.link_open = (tokens, idx, options, env, self) => {\n const href = String(tokens[idx].attrGet('href') ?? '')\n if (/^https?:\\/\\//i.test(href)) {\n tokens[idx].attrSet('target', '_blank')\n tokens[idx].attrSet('rel', 'noopener noreferrer')\n tokens[idx].attrJoin('class', 'md-link-externo')\n }\n return original\n ? original(tokens, idx, options, env, self)\n : self.renderToken(tokens, idx, options)\n }\n}\n\n/** Imagem sozinha no parágrafo vira figura com legenda (o texto alternativo). */\nfunction aplicarFiguras(md: MarkdownIt): void {\n md.core.ruler.after('inline', 'lz_figuras', (state: StateCore) => {\n const tokens = state.tokens\n for (let i = 1; i < tokens.length - 1; i += 1) {\n const inline = tokens[i]\n if (inline.type !== 'inline' || tokens[i - 1].type !== 'paragraph_open') continue\n const filhos = (inline.children ?? []).filter((filho) => filho.type !== 'softbreak')\n if (filhos.length !== 1 || filhos[0].type !== 'image') continue\n\n tokens[i - 1].tag = 'figure'\n tokens[i - 1].attrJoin('class', 'md-figure')\n tokens[i + 1].tag = 'figure'\n filhos[0].meta = { figura: true }\n }\n return true\n })\n\n const original = md.renderer.rules.image\n md.renderer.rules.image = (tokens, idx, options, env, self) => {\n const html = original\n ? original(tokens, idx, options, env, self)\n : self.renderToken(tokens, idx, options)\n const meta = tokens[idx].meta as { figura?: boolean } | undefined\n if (!meta?.figura) return html\n const legenda = tokens[idx].content?.trim()\n return legenda ? `${html}<figcaption>${escapar(legenda)}</figcaption>` : html\n }\n}\n\n/* ==========================================================\n API pública\n ========================================================== */\n\nlet instancia: MarkdownIt | null = null\n\nfunction obterRenderer(): MarkdownIt {\n if (!instancia) instancia = criarRenderer()\n return instancia\n}\n\n/** Texto puro de um heading, para o índice (sem `**`, `` ` `` ou links). */\nfunction textoDoTitulo(inline: Token): string {\n return (inline.children ?? [])\n .filter((filho) => filho.type === 'text' || filho.type === 'code_inline')\n .map((filho) => filho.content)\n .join('')\n .trim()\n}\n\nfunction coletarTitulos(tokens: Token[]): MarkdownHeading[] {\n const titulos: MarkdownHeading[] = []\n for (let i = 0; i < tokens.length; i += 1) {\n const token = tokens[i]\n if (token.type !== 'heading_open') continue\n const nivel = Number(token.tag.slice(1))\n if (nivel < 2 || nivel > 3) continue\n const id = String(token.attrGet('id') ?? '')\n const inline = tokens[i + 1]\n if (!id || inline?.type !== 'inline') continue\n titulos.push({ id, text: textoDoTitulo(inline), level: nivel })\n }\n return titulos\n}\n\n/** Sanitiza o HTML do markdown (mantém âncoras, notas de rodapé e checkboxes). */\nexport function sanitizarMarkdown(html: string): string {\n return DOMPurify.sanitize(html, {\n ADD_ATTR: ['target', 'open', 'checked', 'disabled'],\n })\n}\n\n/**\n * Renderiza markdown para HTML sanitizado e devolve também o índice de títulos.\n *\n * O realce de sintaxe só aparece depois de `carregarRealce()` — chame antes (ou\n * re-renderize depois) para colorir o código.\n */\nexport function renderMarkdown(source: string): MarkdownRenderResult {\n const md = obterRenderer()\n const env: Record<string, unknown> = {}\n const tokens = md.parse(source ?? '', env)\n return {\n html: sanitizarMarkdown(md.renderer.render(tokens, md.options, env)),\n headings: coletarTitulos(tokens),\n }\n}\n","/**\n * Enriquecimento do markdown JÁ renderizado — o que precisa de DOM/JS.\n *\n * Roda depois do `v-html` (e depois do DOMPurify, por isso os botões nascem\n * aqui e não no HTML sanitizado): botão de copiar nos blocos de código, abas\n * clicáveis e diagramas mermaid (carregados sob demanda, na paleta do tema).\n */\n\n/* ==========================================================\n Copiar código\n ========================================================== */\n\nfunction aplicarCopiar(raiz: HTMLElement): void {\n raiz.querySelectorAll<HTMLElement>('[data-md-code]').forEach((bloco) => {\n if (bloco.dataset.mdPronto) return\n bloco.dataset.mdPronto = '1'\n\n const botao = document.createElement('button')\n botao.type = 'button'\n botao.className = 'md-code__copiar'\n botao.setAttribute('aria-label', 'Copiar código')\n botao.title = 'Copiar código'\n botao.innerHTML = '<i class=\"pi pi-copy\" aria-hidden=\"true\"></i>'\n botao.addEventListener('click', () => {\n const codigo = bloco.querySelector('code')?.textContent ?? ''\n void navigator.clipboard?.writeText(codigo).then(() => {\n botao.classList.add('md-code__copiar--feito')\n botao.innerHTML = '<i class=\"pi pi-check\" aria-hidden=\"true\"></i>'\n window.setTimeout(() => {\n botao.classList.remove('md-code__copiar--feito')\n botao.innerHTML = '<i class=\"pi pi-copy\" aria-hidden=\"true\"></i>'\n }, 1600)\n })\n })\n bloco.appendChild(botao)\n })\n}\n\n/* ==========================================================\n Abas\n ========================================================== */\n\n/**\n * Blocos `::: aba` seguidos viram um grupo de abas sozinhos — o autor não\n * precisa envolver tudo num `:::: abas` (aninhar marcador dentro de marcador é\n * a parte chata da sintaxe). O wrapper explícito continua funcionando.\n */\nfunction agruparAbasSoltas(raiz: HTMLElement): void {\n const soltos = Array.from(raiz.querySelectorAll<HTMLElement>('.md-tabs__panel')).filter(\n (painel) => !painel.parentElement?.hasAttribute('data-md-tabs'),\n )\n const vistos = new Set<HTMLElement>()\n\n soltos.forEach((primeiro) => {\n if (vistos.has(primeiro)) return\n const sequencia = [primeiro]\n let proximo = primeiro.nextElementSibling\n while (proximo instanceof HTMLElement && proximo.classList.contains('md-tabs__panel')) {\n sequencia.push(proximo)\n proximo = proximo.nextElementSibling\n }\n sequencia.forEach((painel) => vistos.add(painel))\n\n const grupo = document.createElement('div')\n grupo.className = 'md-tabs'\n grupo.setAttribute('data-md-tabs', '')\n primeiro.before(grupo)\n sequencia.forEach((painel) => grupo.appendChild(painel))\n })\n}\n\nfunction aplicarAbas(raiz: HTMLElement): void {\n agruparAbasSoltas(raiz)\n raiz.querySelectorAll<HTMLElement>('[data-md-tabs]').forEach((grupo, indiceGrupo) => {\n if (grupo.dataset.mdPronto) return\n const paineis = Array.from(grupo.querySelectorAll<HTMLElement>(':scope > .md-tabs__panel'))\n if (!paineis.length) return\n grupo.dataset.mdPronto = '1'\n\n const barra = document.createElement('div')\n barra.className = 'md-tabs__bar'\n barra.setAttribute('role', 'tablist')\n\n const botoes = paineis.map((painel, indice) => {\n const id = `md-aba-${indiceGrupo}-${indice}`\n painel.id = `${id}-painel`\n painel.setAttribute('role', 'tabpanel')\n painel.setAttribute('aria-labelledby', id)\n\n const botao = document.createElement('button')\n botao.type = 'button'\n botao.id = id\n botao.className = 'md-tabs__botao'\n botao.setAttribute('role', 'tab')\n botao.setAttribute('aria-controls', painel.id)\n botao.textContent = painel.dataset.mdTab ?? `Aba ${indice + 1}`\n botao.addEventListener('click', () => selecionar(indice))\n barra.appendChild(botao)\n return botao\n })\n\n function selecionar(ativo: number): void {\n botoes.forEach((botao, indice) => {\n const selecionado = indice === ativo\n botao.setAttribute('aria-selected', String(selecionado))\n botao.tabIndex = selecionado ? 0 : -1\n paineis[indice].hidden = !selecionado\n })\n }\n\n grupo.prepend(barra)\n selecionar(0)\n })\n}\n\n/* ==========================================================\n Diagramas (mermaid)\n ========================================================== */\n\nlet mermaidPromise: Promise<typeof import('mermaid').default> | null = null\nlet sequencia = 0\n\nasync function carregarMermaid() {\n if (!mermaidPromise) {\n mermaidPromise = import('mermaid').then((modulo) => modulo.default)\n }\n return mermaidPromise\n}\n\n/** Elementos que nunca fazem parte de um diagrama — e que trazem execução junto. */\nconst TAGS_PROIBIDAS = new Set([\n 'script',\n 'iframe',\n 'object',\n 'embed',\n 'link',\n 'meta',\n 'base',\n 'form',\n 'input',\n 'button',\n 'audio',\n 'video',\n 'animate',\n 'set',\n])\n\n/** Remove tag executável, handler `on*` e URL `javascript:` — recursivo. */\nfunction limparNo(elemento: Element): void {\n for (const atributo of Array.from(elemento.attributes)) {\n const nome = atributo.name.toLowerCase()\n const valor = atributo.value.trim().toLowerCase()\n const ehLink = nome === 'href' || nome === 'xlink:href' || nome === 'src'\n if (nome.startsWith('on') || (ehLink && /^(javascript|data|vbscript):/.test(valor))) {\n elemento.removeAttribute(atributo.name)\n }\n }\n for (const filho of Array.from(elemento.children)) {\n if (TAGS_PROIBIDAS.has(filho.localName.toLowerCase())) filho.remove()\n else limparNo(filho)\n }\n}\n\n/**\n * Limpa o SVG do mermaid **sem perder os rótulos**.\n *\n * Os rótulos ficam dentro de `<foreignObject>` (HTML embutido no SVG), e o\n * DOMPurify genérico descarta esse conteúdo — o diagrama sairia com as caixas\n * vazias. Então a limpeza aqui é explícita e sobre o DOM já parseado como\n * `image/svg+xml`: fora tag executável, handler inline e URL de script.\n *\n * Isso é a **segunda** camada: o mermaid roda em `securityLevel: 'strict'`,\n * que escapa o texto do autor e já passa o SVG pelo próprio DOMPurify dele\n * (com a configuração que os rótulos exigem).\n *\n * @returns o nó limpo, ou `null` se o SVG vier malformado.\n */\nfunction sanitizarSvg(svg: string): Element | null {\n const documento = new DOMParser().parseFromString(svg, 'image/svg+xml')\n if (documento.querySelector('parsererror')) return null\n const raiz = documento.documentElement\n if (raiz.localName.toLowerCase() !== 'svg') return null\n limparNo(raiz)\n return raiz\n}\n\n/** Lê um token do tema atual do documento (o diagrama fica na paleta do portal). */\nfunction token(estilo: CSSStyleDeclaration, nome: string, padrao: string): string {\n return estilo.getPropertyValue(nome).trim() || padrao\n}\n\nfunction configurarMermaid(mermaid: Awaited<ReturnType<typeof carregarMermaid>>): void {\n const estilo = getComputedStyle(document.documentElement)\n const superficie = token(estilo, '--surface', '#ffffff')\n const texto = token(estilo, '--fg', '#141a22')\n const primaria = token(estilo, '--primary', '#1f5092')\n const suave = token(estilo, '--primary-soft', '#eef4fb')\n const borda = token(estilo, '--border-strong', '#cdd6e2')\n\n mermaid.initialize({\n startOnLoad: false,\n securityLevel: 'strict',\n theme: 'base',\n fontFamily: token(estilo, '--font-sans', 'inherit'),\n flowchart: { useMaxWidth: true },\n themeVariables: {\n background: superficie,\n primaryColor: suave,\n primaryTextColor: texto,\n primaryBorderColor: primaria,\n secondaryColor: token(estilo, '--surface-3', '#eef2f7'),\n tertiaryColor: token(estilo, '--surface-2', '#f8fafc'),\n lineColor: borda,\n textColor: texto,\n mainBkg: suave,\n nodeBorder: primaria,\n clusterBkg: token(estilo, '--surface-2', '#f8fafc'),\n clusterBorder: borda,\n fontSize: '13px',\n },\n })\n}\n\n/**\n * Renderiza os blocos ```mermaid do container.\n * @param forcar redesenha os que já estavam prontos (troca de tema).\n */\nexport async function renderizarDiagramas(raiz: HTMLElement, forcar = false): Promise<void> {\n const alvos = Array.from(raiz.querySelectorAll<HTMLElement>('[data-md-mermaid]')).filter(\n (figura) => forcar || !figura.dataset.mdEstado,\n )\n if (!alvos.length) return\n\n const mermaid = await carregarMermaid()\n configurarMermaid(mermaid)\n\n for (const figura of alvos) {\n const fonte = figura.querySelector<HTMLElement>('.md-mermaid__fonte')?.textContent ?? ''\n if (!fonte.trim()) continue\n figura.querySelector('.md-mermaid__svg')?.remove()\n try {\n sequencia += 1\n const { svg } = await mermaid.render(`md-diagrama-${sequencia}`, fonte)\n const limpo = sanitizarSvg(svg)\n if (!limpo) {\n figura.dataset.mdEstado = 'erro'\n continue\n }\n const caixa = document.createElement('div')\n caixa.className = 'md-mermaid__svg'\n caixa.appendChild(document.importNode(limpo, true))\n figura.prepend(caixa)\n figura.dataset.mdEstado = 'ok'\n } catch {\n // Diagrama inválido: mostra o código-fonte em vez de sumir com o conteúdo.\n figura.dataset.mdEstado = 'erro'\n }\n }\n}\n\n/* ==========================================================\n API\n ========================================================== */\n\n/** Aplica tudo. Idempotente — pode ser chamado a cada re-render. */\nexport async function enhanceMarkdown(raiz: HTMLElement | null): Promise<void> {\n if (!raiz) return\n aplicarCopiar(raiz)\n aplicarAbas(raiz)\n await renderizarDiagramas(raiz)\n}\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { carregarRealce, realceDisponivel, renderMarkdown } from '@/utils/markdown'\nimport { enhanceMarkdown, renderizarDiagramas } from '@/utils/markdownEnhance'\nimport type { MarkdownHeading } from '@/types/markdown'\n\n/**\n * Leitor de markdown rico — a tela de leitura do design system.\n *\n * Além do markdown padrão (títulos, listas, tabelas, citações), entende o\n * vocabulário de documentação do produto: alertas (`> [!DICA]` ou `::: dica`),\n * passos, cards, abas, blocos colapsáveis, notas de rodapé, código com realce e\n * botão de copiar, e diagramas ```mermaid.\n *\n * Sempre sanitizado (DOMPurify) antes do `v-html` — o conteúdo vem de usuários.\n */\nconst props = withDefaults(\n defineProps<{\n /** Markdown cru a renderizar. */\n source: string\n /** Mensagem exibida quando `source` está vazio. */\n emptyText?: string\n }>(),\n {\n emptyText: 'Sem conteúdo',\n },\n)\n\nconst emit = defineEmits<{\n /** Títulos (`##`/`###`) do documento — alimenta um índice lateral. */\n headings: [MarkdownHeading[]]\n}>()\n\nconst raiz = ref<HTMLElement | null>(null)\n/** Vira `true` quando o highlight.js termina de carregar — dispara o re-render. */\nconst realcePronto = ref(realceDisponivel())\n\nconst resultado = computed(() => {\n // Dependência proposital: o realce chega depois e o HTML precisa ser refeito.\n void realcePronto.value\n return renderMarkdown(props.source ?? '')\n})\n\nconst html = computed(() => resultado.value.html)\nconst isEmpty = computed(() => !props.source || !props.source.trim())\n\nwatch(resultado, (valor) => emit('headings', valor.headings), { immediate: true })\nwatch(html, () => void nextTick(() => enhanceMarkdown(raiz.value)))\n\n/** Diagramas usam as cores do tema — redesenha quando o portal troca claro/escuro. */\nlet observador: MutationObserver | null = null\n\nfunction observarTema(): void {\n if (typeof MutationObserver === 'undefined') return\n observador = new MutationObserver(() => void renderizarDiagramas(raiz.value!, true))\n observador.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] })\n}\n\nonMounted(async () => {\n await nextTick()\n await enhanceMarkdown(raiz.value)\n observarTema()\n if (!realcePronto.value) {\n await carregarRealce()\n realcePronto.value = true\n }\n})\n\nonBeforeUnmount(() => observador?.disconnect())\n</script>\n\n<template>\n <div v-if=\"isEmpty\" class=\"w-markdown-view w-markdown-view--empty\">{{ emptyText }}</div>\n <!-- eslint-disable-next-line vue/no-v-html — output sanitizado pelo DOMPurify -->\n <div v-else ref=\"raiz\" class=\"w-markdown-view\" v-html=\"html\" />\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref } from 'vue'\nimport WMarkdownView from '../ui/WMarkdownView.vue'\n\n/**\n * Editor de markdown com toolbar mínima e preview (reutiliza o WMarkdownView).\n * A área de edição é um `<textarea>` monospace nativo — Tab mantém o\n * comportamento de foco padrão (a11y). As ações da toolbar inserem a sintaxe\n * na posição do cursor/seleção.\n */\nconst props = withDefaults(\n defineProps<{\n /** Markdown cru (v-model). */\n modelValue: string\n disabled?: boolean\n placeholder?: string\n /** Altura mínima da área de edição/preview. */\n minHeight?: string\n /**\n * Altura máxima da área de edição/preview. Com valor, o editor vira moldura\n * fixa e cada painel rola por dentro — as ações do formulário seguem\n * visíveis por mais longo que fique o documento.\n */\n maxHeight?: string\n /** 'tab' alterna escrever/visualizar; 'split' mostra lado a lado. */\n previewMode?: 'tab' | 'split'\n }>(),\n {\n disabled: false,\n minHeight: '320px',\n maxHeight: 'none',\n previewMode: 'tab',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n}>()\n\nconst textareaRef = ref<HTMLTextAreaElement | null>(null)\nconst previewing = ref(false)\n\nconst isSplit = computed(() => props.previewMode === 'split')\nconst showTextarea = computed(() => isSplit.value || !previewing.value)\nconst showPreview = computed(() => isSplit.value || previewing.value)\n\nfunction onInput(event: Event) {\n emit('update:modelValue', (event.target as HTMLTextAreaElement).value)\n}\n\n/** Aplica `next` e restaura foco + seleção no textarea. */\nfunction apply(next: string, selectionStart: number, selectionEnd: number) {\n emit('update:modelValue', next)\n nextTick(() => {\n const el = textareaRef.value\n if (!el) return\n el.focus()\n el.setSelectionRange(selectionStart, selectionEnd)\n })\n}\n\n/** Envolve a seleção com `before`/`after` (ex.: negrito = **seleção**). */\nfunction surround(before: string, after = before, placeholder = 'texto') {\n const el = textareaRef.value\n if (!el || props.disabled) return\n const value = props.modelValue ?? ''\n const start = el.selectionStart\n const end = el.selectionEnd\n const selected = value.slice(start, end) || placeholder\n const next = value.slice(0, start) + before + selected + after + value.slice(end)\n apply(next, start + before.length, start + before.length + selected.length)\n}\n\n/** Prefixa cada linha da seleção (heading, listas). */\nfunction prefixLines(prefix: string | ((index: number) => string)) {\n const el = textareaRef.value\n if (!el || props.disabled) return\n const value = props.modelValue ?? ''\n const start = el.selectionStart\n const end = el.selectionEnd\n const lineStart = value.lastIndexOf('\\n', start - 1) + 1\n const lineEndRaw = value.indexOf('\\n', end)\n const lineEnd = lineEndRaw === -1 ? value.length : lineEndRaw\n const block = value.slice(lineStart, lineEnd)\n const prefixed = block\n .split('\\n')\n .map((line, i) => (typeof prefix === 'function' ? prefix(i) : prefix) + line)\n .join('\\n')\n const next = value.slice(0, lineStart) + prefixed + value.slice(lineEnd)\n apply(next, lineStart, lineStart + prefixed.length)\n}\n\nfunction actionBold() {\n surround('**')\n}\n\nfunction actionItalic() {\n surround('*')\n}\n\nfunction actionHeading() {\n prefixLines('## ')\n}\n\nfunction actionList() {\n prefixLines('- ')\n}\n\nfunction actionTaskList() {\n prefixLines('- [ ] ')\n}\n\nfunction actionLink() {\n const el = textareaRef.value\n if (!el || props.disabled) return\n const value = props.modelValue ?? ''\n const start = el.selectionStart\n const end = el.selectionEnd\n const selected = value.slice(start, end) || 'texto'\n const next = `${value.slice(0, start)}[${selected}](url)${value.slice(end)}`\n // Deixa \"url\" selecionado, pronto para colar o endereço.\n const urlStart = start + selected.length + 3\n apply(next, urlStart, urlStart + 3)\n}\n\nfunction actionCode() {\n const el = textareaRef.value\n if (!el || props.disabled) return\n const selected = (props.modelValue ?? '').slice(el.selectionStart, el.selectionEnd)\n if (selected.includes('\\n')) surround('```\\n', '\\n```', 'código')\n else surround('`', '`', 'código')\n}\n\n/**\n * Insere um bloco em linha própria. No modelo, `$` marca o trecho que fica\n * selecionado depois (ou onde entra o texto que já estava selecionado).\n */\nfunction inserirBloco(modelo: string, exemplo: string) {\n const el = textareaRef.value\n if (!el || props.disabled) return\n const value = props.modelValue ?? ''\n const start = el.selectionStart\n const end = el.selectionEnd\n const alvo = value.slice(start, end) || exemplo\n const corpo = modelo.replace('$', alvo)\n const antes = value.slice(0, start)\n // Bloco precisa de linha em branco antes para o markdown reconhecer.\n const respiro = !antes || antes.endsWith('\\n\\n') ? '' : antes.endsWith('\\n') ? '\\n' : '\\n\\n'\n const next = `${antes}${respiro}${corpo}\\n${value.slice(end)}`\n const posicao = antes.length + respiro.length + corpo.indexOf(alvo)\n apply(next, posicao, posicao + alvo.length)\n}\n\nfunction actionAlert() {\n inserirBloco('> [!DICA]\\n> $', 'Escreva aqui a sugestão')\n}\n\nfunction actionSteps() {\n inserirBloco('::: passos\\n1. $\\n2. Próximo passo\\n:::', 'Primeiro passo')\n}\n\nfunction actionTable() {\n inserirBloco('| Coluna | Coluna |\\n| --- | --- |\\n| $ | valor |', 'valor')\n}\n\nfunction actionHighlight() {\n surround('==', '==', 'destaque')\n}\n\nfunction togglePreview() {\n previewing.value = !previewing.value\n}\n\nconst ajudaAberta = ref(false)\n\n/** Cola rápida do vocabulário — o autor não precisa decorar a sintaxe. */\nconst ajuda: { sintaxe: string; efeito: string }[] = [\n { sintaxe: '## Título', efeito: 'Seção (entra no índice lateral)' },\n { sintaxe: '> [!DICA] Título', efeito: 'Destaque: dica, nota, importante, atenção, cuidado' },\n { sintaxe: '::: passos … :::', efeito: 'Procedimento numerado' },\n { sintaxe: '::: cards … :::', efeito: 'Lista em cartões' },\n { sintaxe: '::: aba Título', efeito: 'Conteúdo em abas (blocos seguidos)' },\n { sintaxe: '::: detalhes Título', efeito: 'Bloco que abre e fecha' },\n { sintaxe: '==destaque==', efeito: 'Texto marcado' },\n { sintaxe: '- [ ] tarefa', efeito: 'Checklist' },\n { sintaxe: '```python title=\"arquivo.py\"', efeito: 'Código com realce e cópia' },\n { sintaxe: '```mermaid', efeito: 'Diagrama de fluxo' },\n]\n\ninterface ToolDef {\n /** Ícone PrimeIcons OU glyph textual (PrimeIcons não tem bold/itálico). */\n icon?: string\n glyph?: string\n label: string\n run: () => void\n}\n\nconst tools: ToolDef[] = [\n { glyph: 'B', label: 'Negrito', run: actionBold },\n { glyph: 'I', label: 'Itálico', run: actionItalic },\n { icon: 'pi pi-hashtag', label: 'Título (H2)', run: actionHeading },\n { icon: 'pi pi-list', label: 'Lista', run: actionList },\n { icon: 'pi pi-check-square', label: 'Lista de tarefas', run: actionTaskList },\n { icon: 'pi pi-link', label: 'Link', run: actionLink },\n { icon: 'pi pi-code', label: 'Código', run: actionCode },\n { icon: 'pi pi-info-circle', label: 'Destaque', run: actionAlert },\n { icon: 'pi pi-sort-numeric-down', label: 'Passos', run: actionSteps },\n { icon: 'pi pi-table', label: 'Tabela', run: actionTable },\n { icon: 'pi pi-pencil', label: 'Marcar texto', run: actionHighlight },\n]\n</script>\n\n<template>\n <div class=\"w-markdown-editor\" :class=\"{ 'w-markdown-editor--split': isSplit }\">\n <div class=\"w-markdown-editor__toolbar\" role=\"toolbar\" aria-label=\"Formatação markdown\">\n <button\n v-for=\"tool in tools\"\n :key=\"tool.label\"\n type=\"button\"\n class=\"w-markdown-editor__tool\"\n :aria-label=\"tool.label\"\n :title=\"tool.label\"\n :disabled=\"disabled || (!isSplit && previewing)\"\n @click=\"tool.run()\"\n >\n <i v-if=\"tool.icon\" :class=\"tool.icon\" aria-hidden=\"true\" />\n <span\n v-else\n class=\"w-markdown-editor__glyph\"\n :class=\"{\n 'w-markdown-editor__glyph--bold': tool.glyph === 'B',\n 'w-markdown-editor__glyph--italic': tool.glyph === 'I',\n }\"\n aria-hidden=\"true\"\n >\n {{ tool.glyph }}\n </span>\n </button>\n\n <button\n type=\"button\"\n class=\"w-markdown-editor__tool w-markdown-editor__tool--ajuda\"\n :class=\"{ 'w-markdown-editor__tool--active': ajudaAberta }\"\n aria-label=\"Sintaxe disponível\"\n title=\"Sintaxe disponível\"\n :aria-pressed=\"ajudaAberta\"\n @click=\"ajudaAberta = !ajudaAberta\"\n >\n <i class=\"pi pi-question-circle\" aria-hidden=\"true\" />\n </button>\n\n <button\n v-if=\"!isSplit\"\n type=\"button\"\n class=\"w-markdown-editor__tool w-markdown-editor__tool--preview\"\n :class=\"{ 'w-markdown-editor__tool--active': previewing }\"\n aria-label=\"Visualizar\"\n title=\"Visualizar\"\n :aria-pressed=\"previewing\"\n @click=\"togglePreview\"\n >\n <i :class=\"previewing ? 'pi pi-pencil' : 'pi pi-eye'\" aria-hidden=\"true\" />\n </button>\n </div>\n\n <dl v-if=\"ajudaAberta\" class=\"w-markdown-editor__ajuda\">\n <template v-for=\"linha in ajuda\" :key=\"linha.sintaxe\">\n <dt>{{ linha.sintaxe }}</dt>\n <dd>{{ linha.efeito }}</dd>\n </template>\n </dl>\n\n <div class=\"w-markdown-editor__body\" :style=\"{ minHeight, maxHeight }\">\n <textarea\n v-if=\"showTextarea\"\n ref=\"textareaRef\"\n class=\"w-markdown-editor__textarea\"\n :value=\"modelValue\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n spellcheck=\"false\"\n @input=\"onInput\"\n />\n <WMarkdownView\n v-if=\"showPreview\"\n class=\"w-markdown-editor__preview\"\n :source=\"modelValue\"\n empty-text=\"Nada para visualizar\"\n />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, ref, watch } from 'vue'\nimport type { MarkdownHeading } from '@/types/markdown'\n\n/**\n * Índice do documento (\"Nesta página\") com marcação da seção em leitura.\n *\n * Os títulos vêm do evento `headings` do WMarkdownView. Cada `##` vira um grupo\n * que **recolhe seus `###`** — assim o índice fica curto mesmo em documento\n * longo — e o grupo da seção que está sendo lida abre sozinho.\n *\n * A altura é presa à do contexto e a rolagem, quando sobra conteúdo, acontece\n * sem barra visível: o índice não pode competir com a rolagem da página.\n */\nconst props = withDefaults(\n defineProps<{\n /** Títulos do documento (evento `headings` do WMarkdownView). */\n headings: MarkdownHeading[]\n title?: string\n /** Abaixo disso o índice não aparece (documento curto não precisa). */\n minHeadings?: number\n /** Mostra o campo que filtra os títulos. */\n searchable?: boolean\n /** Teto da lista — o índice se ajusta à altura disponível. */\n maxHeight?: string\n }>(),\n {\n title: 'Nesta página',\n minHeadings: 2,\n searchable: false,\n maxHeight: 'calc(100vh - 14rem)',\n },\n)\n\ninterface Grupo {\n titulo: MarkdownHeading\n filhos: MarkdownHeading[]\n}\n\nconst ativo = ref('')\nconst termo = ref('')\n/**\n * Id do único `##` aberto — acordeão. Tudo começa fechado e nada abre sozinho:\n * abrir seção é decisão do leitor, não efeito colateral da rolagem.\n */\nconst aberto = ref<string | null>(null)\nlet observador: IntersectionObserver | null = null\n\n/** `##` viram grupos; `###` (e abaixo) entram como filhos do grupo anterior. */\nconst grupos = computed<Grupo[]>(() => {\n const saida: Grupo[] = []\n for (const titulo of props.headings) {\n if (titulo.level <= 2 || !saida.length) saida.push({ titulo, filhos: [] })\n else saida[saida.length - 1].filhos.push(titulo)\n }\n return saida\n})\n\nfunction normalizar(texto: string): string {\n return texto\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n}\n\n/** Com filtro, sobram os grupos que casam (ou que têm filho que casa). */\nconst visiveis = computed<Grupo[]>(() => {\n const busca = normalizar(termo.value.trim())\n if (!busca) return grupos.value\n return grupos.value\n .map((grupo) => ({\n titulo: grupo.titulo,\n filhos: grupo.filhos.filter((filho) => normalizar(filho.text).includes(busca)),\n }))\n .filter((grupo) => grupo.filhos.length || normalizar(grupo.titulo.text).includes(busca))\n})\n\nconst filtrando = computed(() => termo.value.trim().length > 0)\n\nfunction expandido(grupo: Grupo): boolean {\n return filtrando.value || aberto.value === grupo.titulo.id\n}\n\nfunction alternar(grupo: Grupo): void {\n aberto.value = aberto.value === grupo.titulo.id ? null : grupo.titulo.id\n}\n\nfunction observar(): void {\n observador?.disconnect()\n if (typeof IntersectionObserver === 'undefined') return\n observador = new IntersectionObserver(\n (entradas) => {\n const visivel = entradas.find((entrada) => entrada.isIntersecting)\n if (visivel) ativo.value = visivel.target.id\n },\n // Faixa de leitura: o título \"ativo\" é o que está no topo da tela.\n { rootMargin: '-88px 0px -70% 0px', threshold: 0 },\n )\n props.headings.forEach((titulo) => {\n const elemento = document.getElementById(titulo.id)\n if (elemento) observador?.observe(elemento)\n })\n}\n\nfunction ir(id: string): void {\n const elemento = document.getElementById(id)\n if (!elemento) return\n ativo.value = id\n elemento.scrollIntoView({ behavior: 'smooth', block: 'start' })\n}\n\nwatch(\n () => props.headings,\n () => void nextTick(observar),\n { immediate: true },\n)\n\nonBeforeUnmount(() => observador?.disconnect())\n</script>\n\n<template>\n <nav v-if=\"headings.length >= minHeadings\" class=\"w-md-toc\" aria-label=\"Índice do documento\">\n <p class=\"w-md-toc__titulo\">{{ title }}</p>\n\n <div v-if=\"searchable\" class=\"w-md-toc__busca\">\n <i class=\"pi pi-search\" aria-hidden=\"true\" />\n <input\n v-model=\"termo\"\n type=\"search\"\n placeholder=\"Filtrar seções\"\n aria-label=\"Filtrar seções\"\n />\n </div>\n\n <div class=\"w-md-toc__corpo\" :style=\"{ maxHeight }\">\n <ul class=\"w-md-toc__lista\">\n <li v-for=\"grupo in visiveis\" :key=\"grupo.titulo.id\" class=\"w-md-toc__grupo\">\n <div\n class=\"w-md-toc__item w-md-toc__item--n2\"\n :class=\"{ 'w-md-toc__item--ativo': ativo === grupo.titulo.id }\"\n >\n <button\n v-if=\"grupo.filhos.length\"\n type=\"button\"\n class=\"w-md-toc__chevron\"\n :aria-expanded=\"expandido(grupo)\"\n :aria-label=\"`Mostrar seções de ${grupo.titulo.text}`\"\n @click=\"alternar(grupo)\"\n >\n <i\n :class=\"expandido(grupo) ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"\n aria-hidden=\"true\"\n />\n </button>\n <span v-else class=\"w-md-toc__chevron w-md-toc__chevron--vazio\" aria-hidden=\"true\" />\n <a :href=\"`#${grupo.titulo.id}`\" @click.prevent=\"ir(grupo.titulo.id)\">\n {{ grupo.titulo.text }}\n </a>\n </div>\n\n <ul v-if=\"expandido(grupo)\" class=\"w-md-toc__lista\">\n <li\n v-for=\"filho in grupo.filhos\"\n :key=\"filho.id\"\n class=\"w-md-toc__item w-md-toc__item--n3\"\n :class=\"{ 'w-md-toc__item--ativo': ativo === filho.id }\"\n >\n <a :href=\"`#${filho.id}`\" @click.prevent=\"ir(filho.id)\">{{ filho.text }}</a>\n </li>\n </ul>\n </li>\n </ul>\n\n <p v-if=\"filtrando && !visiveis.length\" class=\"w-md-toc__vazio\">Nenhuma seção encontrada</p>\n </div>\n </nav>\n</template>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport type { TabItem } from '@/types/tabs'\n\n/**\n * Barra de abas de TELA (não confundir com as abas dentro de um markdown).\n *\n * Controlada: só emite `update:modelValue` — quem decide o que renderizar é a\n * página. Navegação por teclado com ←/→ (padrão ARIA de tablist).\n */\ndefineProps<{\n /** `value` da aba ativa. */\n modelValue: string\n items: TabItem[]\n /** Rótulo do grupo para leitores de tela. */\n ariaLabel?: string\n}>()\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n}>()\n\nconst botoes = ref<HTMLButtonElement[]>([])\n\nfunction registrar(el: unknown, indice: number): void {\n if (el instanceof HTMLButtonElement) botoes.value[indice] = el\n}\n\nfunction selecionar(item: TabItem): void {\n if (!item.disabled) emit('update:modelValue', item.value)\n}\n\n/** ←/→ andam entre as abas habilitadas, circulando nas pontas. */\nfunction navegar(items: TabItem[], indice: number, passo: number): void {\n const total = items.length\n for (let salto = 1; salto <= total; salto += 1) {\n const alvo = (indice + passo * salto + total * total) % total\n if (!items[alvo].disabled) {\n emit('update:modelValue', items[alvo].value)\n botoes.value[alvo]?.focus()\n return\n }\n }\n}\n</script>\n\n<template>\n <div class=\"w-tab-bar\" role=\"tablist\" :aria-label=\"ariaLabel\">\n <button\n v-for=\"(item, indice) in items\"\n :key=\"item.value\"\n :ref=\"(el) => registrar(el, indice)\"\n type=\"button\"\n role=\"tab\"\n class=\"w-tab-bar__item\"\n :class=\"{ 'w-tab-bar__item--ativa': item.value === modelValue }\"\n :aria-selected=\"item.value === modelValue\"\n :tabindex=\"item.value === modelValue ? 0 : -1\"\n :disabled=\"item.disabled\"\n @click=\"selecionar(item)\"\n @keydown.right.prevent=\"navegar(items, indice, 1)\"\n @keydown.left.prevent=\"navegar(items, indice, -1)\"\n >\n <i v-if=\"item.icon\" :class=\"item.icon\" aria-hidden=\"true\" />\n <span>{{ item.label }}</span>\n <span v-if=\"item.badge !== undefined && item.badge !== null\" class=\"w-tab-bar__badge\">\n {{ item.badge }}\n </span>\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport type { KanbanColumn, KanbanMoveEvent } from '@/types/kanban'\n\ntype Item = Record<string, unknown>\n\n/**\n * Board kanban controlado: as colunas e seus itens vêm de fora e o board NUNCA\n * muta os arrays — arrastar um card só emite `move`; o consumidor persiste e\n * atualiza `columns`. Drag and drop com HTML5 nativo (sem dependência).\n *\n * Mover programaticamente (ex.: botão \"mover para...\") é responsabilidade do\n * consumidor — basta aplicar a mesma mudança que faria ao receber um `move`.\n */\nconst props = withDefaults(\n defineProps<{\n /** Colunas na ordem de exibição. Itens pertencem ao consumidor. */\n columns: KanbanColumn[]\n /** Campo usado como key estável dos cards. */\n itemKey?: string\n /** Permite bloquear o arrasto de itens específicos. */\n canDrag?: (item: Item) => boolean\n loading?: boolean\n /** Altura máxima da lista de cards (a coluna rola por dentro). */\n maxHeight?: string\n /** Altura mínima da lista — dá área de drop mesmo com a coluna vazia. */\n minHeight?: string\n }>(),\n {\n itemKey: 'id',\n loading: false,\n maxHeight: '32rem',\n minHeight: '6rem',\n },\n)\n\nconst emit = defineEmits<{\n /** Card solto em outra posição (entre colunas ou reordenação na mesma). */\n move: [event: KanbanMoveEvent]\n /** Clique simples no card (sem drag). */\n 'item-click': [item: Item]\n}>()\n\ndefineSlots<{\n /** Conteúdo do card. Fallback: item.nome ?? item[itemKey]. */\n card?(props: { item: Item; column: KanbanColumn }): unknown\n /** Cabeçalho da coluna. Fallback: label + contador. */\n 'column-header'?(props: { column: KanbanColumn }): unknown\n /** Ação à direita do cabeçalho (ex.: criar nesta coluna). */\n 'column-action'?(props: { column: KanbanColumn }): unknown\n /** Coluna sem itens. */\n 'empty-column'?(props: { column: KanbanColumn }): unknown\n}>()\n\nconst dragging = ref<{ item: Item; from: string; key: unknown } | null>(null)\nconst dropTarget = ref<{ column: string; index: number } | null>(null)\n\nconst listRefs = new Map<string, HTMLElement>()\n\nfunction setListRef(value: string, el: unknown) {\n if (el instanceof HTMLElement) listRefs.set(value, el)\n else listRefs.delete(value)\n}\n\nfunction keyOf(item: Item): unknown {\n return item[props.itemKey]\n}\n\nfunction fallbackLabel(item: Item): string {\n return String(item.nome ?? keyOf(item) ?? '')\n}\n\nfunction isDraggable(item: Item): boolean {\n if (props.loading) return false\n return props.canDrag ? props.canDrag(item) : true\n}\n\nfunction isDragging(item: Item): boolean {\n return !!dragging.value && keyOf(item) === dragging.value.key\n}\n\n/** Índice de inserção na coluna: ponto médio vertical dos cards renderizados. */\nfunction computeIndex(colValue: string, event: DragEvent): number {\n const list = listRefs.get(colValue)\n if (!list) return 0\n const cards = Array.from(list.querySelectorAll(':scope > .w-kanban-board__card'))\n let index = cards.length\n for (let i = 0; i < cards.length; i++) {\n const rect = cards[i].getBoundingClientRect()\n if (event.clientY < rect.top + rect.height / 2) {\n index = i\n break\n }\n }\n return index\n}\n\nfunction onDragStart(item: Item, column: KanbanColumn, event: DragEvent) {\n if (!isDraggable(item)) {\n event.preventDefault()\n return\n }\n dragging.value = { item, from: column.value, key: keyOf(item) }\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move'\n event.dataTransfer.setData('text/plain', String(keyOf(item)))\n }\n}\n\nfunction onDragOver(column: KanbanColumn, event: DragEvent) {\n if (!dragging.value) return\n event.preventDefault()\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move'\n dropTarget.value = { column: column.value, index: computeIndex(column.value, event) }\n}\n\nfunction onDragLeave(column: KanbanColumn, event: DragEvent) {\n const list = listRefs.get(column.value)\n const related = event.relatedTarget\n if (list && related instanceof Node && list.contains(related)) return\n if (dropTarget.value?.column === column.value) dropTarget.value = null\n}\n\nfunction onDrop(column: KanbanColumn, event: DragEvent) {\n event.preventDefault()\n const drag = dragging.value\n clearDrag()\n if (!drag) return\n\n const rawIndex = computeIndex(column.value, event)\n let index = rawIndex\n\n if (drag.from === column.value) {\n const source = props.columns.find((c) => c.value === column.value)\n const oldIndex = source ? source.items.findIndex((i) => keyOf(i) === drag.key) : -1\n if (oldIndex !== -1 && rawIndex > oldIndex) index = rawIndex - 1\n // Soltou onde já estava: nada a persistir.\n if (index === oldIndex) return\n }\n\n emit('move', { item: drag.item, from: drag.from, to: column.value, index })\n}\n\nfunction onDragEnd() {\n clearDrag()\n}\n\nfunction clearDrag() {\n dragging.value = null\n dropTarget.value = null\n}\n\nfunction onCardClick(item: Item) {\n if (dragging.value) return\n emit('item-click', item)\n}\n\nfunction showIndicatorAt(column: KanbanColumn, index: number): boolean {\n return (\n !!dragging.value &&\n dropTarget.value?.column === column.value &&\n dropTarget.value.index === index\n )\n}\n</script>\n\n<template>\n <div\n class=\"w-kanban-board\"\n :class=\"{\n 'w-kanban-board--loading': loading,\n 'w-kanban-board--dragging': !!dragging,\n }\"\n :aria-busy=\"loading || undefined\"\n >\n <section\n v-for=\"column in columns\"\n :key=\"column.value\"\n class=\"w-kanban-board__column\"\n :class=\"{\n 'w-kanban-board__column--over': !!dragging && dropTarget?.column === column.value,\n }\"\n :style=\"column.accent ? { '--w-kanban-accent': column.accent } : undefined\"\n >\n <header class=\"w-kanban-board__header\">\n <slot name=\"column-header\" :column=\"column\">\n <span class=\"w-kanban-board__title\">{{ column.label }}</span>\n <span class=\"w-kanban-board__count\">{{ column.items.length }}</span>\n </slot>\n <slot name=\"column-action\" :column=\"column\" />\n </header>\n\n <div\n :ref=\"(el) => setListRef(column.value, el)\"\n class=\"w-kanban-board__list\"\n role=\"list\"\n :aria-label=\"column.label\"\n :style=\"{ maxHeight, minHeight }\"\n @dragover=\"onDragOver(column, $event)\"\n @dragleave=\"onDragLeave(column, $event)\"\n @drop=\"onDrop(column, $event)\"\n >\n <template v-for=\"(item, i) in column.items\" :key=\"String(keyOf(item))\">\n <div v-if=\"showIndicatorAt(column, i)\" class=\"w-kanban-board__indicator\" />\n <div\n class=\"w-kanban-board__card\"\n role=\"listitem\"\n tabindex=\"0\"\n :class=\"{\n 'w-kanban-board__card--dragging': isDragging(item),\n 'w-kanban-board__card--static': !isDraggable(item),\n }\"\n :draggable=\"isDraggable(item)\"\n @dragstart=\"onDragStart(item, column, $event)\"\n @dragend=\"onDragEnd\"\n @click=\"onCardClick(item)\"\n @keydown.enter.prevent=\"onCardClick(item)\"\n @keydown.space.prevent=\"onCardClick(item)\"\n >\n <slot name=\"card\" :item=\"item\" :column=\"column\">\n <span class=\"w-kanban-board__card-fallback\">{{ fallbackLabel(item) }}</span>\n </slot>\n </div>\n </template>\n <div\n v-if=\"showIndicatorAt(column, column.items.length)\"\n class=\"w-kanban-board__indicator\"\n />\n\n <div v-if=\"!column.items.length\" class=\"w-kanban-board__empty\">\n <slot name=\"empty-column\" :column=\"column\">Nenhum item</slot>\n </div>\n </div>\n </section>\n </div>\n</template>\n"],"names":["formatDate","formatDateTime","formatCurrency","formatNumber","useFormatters","__props","_createElementBlock","_hoisted_1","_createBlock","_unref","Tag","_openBlock","_hoisted_3","_toDisplayString","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","S","x","n","t","e","A","R","N","w","s","P","k","g","b","d","r","a","p","o","f","i","h","l","C","F","T","E","W","I","O","u","c","v","M","m","y","V","TYPE_MAP","mapApiFieldToFieldDef","apiField","fieldType","def","_a","mapApiFieldsToFieldDefs","apiFields","COLUMN_TYPE_MAP","mapApiFieldToColumnDef","mapApiFieldsToColumnDefs","maxColumns","props","emit","__emit","dataProvider","inject","W_DATA_PROVIDER_KEY","provider","toast","useAppToast","confirmDeleteDialog","useAppConfirm","selectedItem","ref","selectedItems","suggestions","searching","acModel","computed","keyOf","dedupeByKey","itens","vistos","out","item","emitSelection","labelOf","descriptionOf","chipsOcultos","chipsOcultosLabel","onChipRemove","event","remove","limparSelecao","chipStyle","mostrarLimpar","debounceTimer","acRef","onMounted","nextTick","input","_c","_b","_d","isEmptyValue","normalizeDrillValue","drilldownList","blockedByRequired","drilldownParams","params","val","effectivePlaceholder","placeholderVisivel","fetchOne","id","fetchById","resolveMany","valores","obj","search","query","response","onSearch","onSelect","onAcUpdate","value","onClear","watch","newVal","lista","chaves","atuais","modalVisible","modalData","modalLoading","modalSearch","modalPage","modalPageSize","modalTotalRecords","modalSelection","modalSelecionados","sel","modalSortField","modalSortOrder","modalSearchTimer","subRowsMap","subRowsColumns","expandedRows","fetchSubRows","map","columns","abertos","row","subRowsDe","crudAvailable","showCreate","showEdit","showDelete","hasRowActions","formFields","modalColumns","fetchModalData","onInputKeydown","openModal","onModalPage","onModalSort","confirmModalSelection","onRowDblClick","modalSearchInput","modalTableWrap","lastSearched","onModalShow","el","focusModalGrid","onModalSearchKeydown","q","onModalGridKeydown","novos","antigos","mudou","tinhaValorAntes","formDialogVisible","formSaving","editingItem","formData","reactive","isEditing","formDialogTitle","getDefaults","defaults","resetForm","defs","key","openCreateForm","openEditForm","setFormField","field","saveForm","payload","pk","idx","parent","current","err","extractApiError","confirmDelete","_createElementVNode","_mergeProps","$attrs","_createVNode","AutoComplete","_withCtx","option","_hoisted_2","index","removeCallback","Chip","$event","Dialog","_hoisted_10","Button","IconField","InputIcon","InputText","DataTable","_cache","Column","_Fragment","_renderList","col","_normalizeStyle","data","WCrudColumnRenderer","_hoisted_8","_hoisted_9","sub","WCrudFormDialog","di","useDateInput","typed","panelDate","op","maskaOptions","minDateObj","maxDateObj","commit","date","onTypedInput","onBlur","onKeydown","setToday","onPick","clearValue","toggle","_normalizeClass","Popover","DatePicker","resolvedPrefix","hasAddon","display","onInput","digits","num","InputGroup","InputGroupAddon","VP","objectUrl","onBeforeUnmount","previewSrc","fileInput","openPicker","acceptsFile","file","acc","originalName","originalType","cropImage","onFileChange","reader","img","naturalW","naturalH","zoom","imgSrc","offset","vpW","dispW","vpH","dispH","cropOpen","effAspect","baseScale","dispScale","clampOffset","imgStyle","dragging","dragStart","onPointerDown","onPointerMove","onPointerUp","outputType","outputName","type","ext","confirmCrop","scale","sx","sy","sw","sh","canvas","ctx","blob","_renderSlot","_ctx","Slider","leftSearch","rightSearch","selectedSet","fields","idOf","matches","term","available","chosen","add","addAll","removeAll","_hoisted_11","_hoisted_13","lookupCep","cep","fieldErrors","cepLoading","cepError","cepTimers","onCepInput","raw","result","mapping","keys","targetField","existing","visibleFields","isFieldDisabled","subRowsFetchDe","resolveEndpointParams","ep","calculatedFields","nexts","unwrapRef","isRef","autofocusField","mode","explicit","first","semInput","shouldAutofocus","convertMask","mask","displayCpfCnpj","onCpfCnpjInput","fieldName","autocompleteSuggestions","getAutocompleteValue","optionValue","getFilteredSuggestions","onAutocompleteSearch","options","optionLabel","onAutocompleteSelect","fieldOptions","optionLabelOf","optionValueOf","isOptionSelected","pickOption","chipEntries","labelKey","valueKey","match","removeChip","_","getColorPickerValue","onColorChange","resolveDrilldown","dep","validateField","error","validateAll","errors","clearErrors","groupColumns","group","fieldSpan","cols","span","fieldSpanStyle","fieldSpanClass","groupedFields","groupMap","groupOrder","groupExplicitOrder","groupId","_e","orderA","orderB","__expose","ToggleSwitch","ColorPicker","WImageCropper","msg","_hoisted_12","WTransferList","_hoisted_14","_hoisted_15","Password","InputNumber","WMoneyInput","Select","WAutoCompleteFK","WDatePicker","Textarea","_hoisted_16","_hoisted_17","_hoisted_18","_createTextVNode","_hoisted_20","chip","chipIndex","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","rendererRef","formRef","onSave","focusFirst","handleKeydown","useFormKeyboardNav","args","WFormRenderer","slotData","cellValue","escapeCell","separator","toCsv","rows","sep","header","lines","downloadCsv","csv","filename","url","link","slots","useSlots","viewKey","loadView","stored","displayMode","isView","setView","paginatorFirst","columnState","chooser","colStateKey","loadColumnState","parsed","saveColumnState","filtersKey","loadFilters","saveFilters","baseColumns","toggleColumn","visible","visibleColumns","colAlignClass","cardColumns","defaultActions","actions","effectiveRowActions","hasActions","handleRowAction","action","deleteTarget","deleteDialogVisible","deleting","onConfirmDelete","isActionVisible","isActionDisabled","allKpis","kpis","canCreate","selectedRow","isMultiSelect","isCellEdit","formFieldMap","INLINE_TYPES","inlineField","onCellEditComplete","filterableColumns","booleanFilterOptions","fParam","filterTimers","onTextFilter","param","cm","selectRow","onRowContextMenu","onCardContextMenu","contextMenuItems","items","doExportCsv","railPrint","exporting","kpi","_f","_g","_h","_i","ba","_hoisted_19","Checkbox","_hoisted_21","slotProps","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_30","ci","_hoisted_31","_hoisted_32","_hoisted_33","Paginator","_hoisted_34","_hoisted_35","_hoisted_36","ContextMenu","scope","$slots","expanded","isExpanded","toggleRow","next","unwrapOptions","column","columnAlign","isNumericColumn","columnClass","columnStyle","isCellDisabled","toNumber","displayValue","setCell","removeRow","rowKeyOf","hasFooter","footerValue","total","sum","footerLabelField","columnCount","onUpdate","files","open","onChange","picked","valid","removeAt","fmtSize","bytes","TREE_GROUP_PREFIX","TREE_LEAF_PREFIX","normalizeTerm","buildTree","groupBy","groupLabel","roots","groups","leaf","rawGroup","chave","collectLeafValues","node","allLeafValues","nodes","indexByKey","visit","deriveSelectionKeys","selected","checked","todas","alguma","child","estado","filterTree","extraFields","children","toggleIds","ids","check","alvo","existente","expandedKeys","fullTree","fullIndex","isFiltering","visibleTree","selectionKeys","totalLeaves","selectedCount","validos","showHeader","isEmpty","emptyText","expandFrom","jaAbertos","valor","onNodeToggle","completo","selectAll","clearAll","Tree","defaultMap","statusInfo","routerKey","useRouter","router","goBack","WStatusTag","formatValue","Skeleton","gridClass","WKpiCard","currentIndex","step","stepState","W_STEP_FLOW_KEY","active","disabled","orientation","provide","root","passo","triggers","atual","flow","localOpen","isDisabled","horizontal","hasLine","done","okCount","countLabel","ICONS","iconOf","nivel","ERRO_MAPA_PADRAO","ERRO_MAPA_READONLY","isOverlay","mapErrorText","collapsed","setCollapsed","toggleCollapsed","collapseTitle","isSelected","clear","selectedFeatures","selectedArea","countText","normalize","visibleFeatures","needle","areaText","feature","areaTotalText","container","footer","mapError","leaflet","observer","footerObserver","layers","styleFor","tooltipText","area","drawFeatures","layer","syncStyles","fitToScope","on","element","corners","bounds","refreshSize","measureFooter","setupMap","mod","somenteLeitura","ALERTS","ALERT_ALIASES","normalizar","nome","resolverAlerta","escapar","MdIt","abrirAlerta","spec","titulo","texto","FECHAR_ALERTA","CARREGADORES","APELIDOS_LINGUAGEM","realce","carregando","realceDisponivel","carregarRealce","nucleo","carregar","modulo","codigo","linguagem","normalizarLinguagem","info","bruta","slug","NOMES_CONTAINER","CONTAINER_RE","criarRenderer","md","abbr","deflist","footnote","ins","mark","sup","anchor","aplicarAlertas","aplicarContainers","aplicarTarefas","aplicarCodigo","aplicarTabelas","aplicarLinks","aplicarFiguras","state","tokens","abre","paragrafo","inline","marcador","fecha","encontrarFechamento","meta","inicio","profundidade","token","pilha","partes","primeiro","marcado","checkbox","primeira","realcado","original","env","self","href","filhos","filho","html","legenda","instancia","obterRenderer","textoDoTitulo","coletarTitulos","titulos","sanitizarMarkdown","DOMPurify","renderMarkdown","source","aplicarCopiar","raiz","bloco","botao","agruparAbasSoltas","soltos","painel","sequencia","proximo","grupo","aplicarAbas","indiceGrupo","paineis","barra","botoes","indice","selecionar","ativo","selecionado","mermaidPromise","carregarMermaid","TAGS_PROIBIDAS","limparNo","elemento","atributo","ehLink","sanitizarSvg","svg","documento","estilo","padrao","configurarMermaid","mermaid","superficie","primaria","suave","borda","renderizarDiagramas","forcar","alvos","figura","fonte","limpo","caixa","enhanceMarkdown","realcePronto","resultado","observador","observarTema","textareaRef","previewing","isSplit","showTextarea","showPreview","apply","selectionStart","selectionEnd","surround","before","after","placeholder","start","end","prefixLines","prefix","lineStart","lineEndRaw","lineEnd","prefixed","line","actionBold","actionItalic","actionHeading","actionList","actionTaskList","actionLink","urlStart","actionCode","inserirBloco","modelo","exemplo","corpo","antes","respiro","posicao","actionAlert","actionSteps","actionTable","actionHighlight","togglePreview","ajudaAberta","ajuda","tools","tool","linha","WMarkdownView","termo","aberto","grupos","saida","visiveis","busca","filtrando","expandido","alternar","observar","entradas","visivel","entrada","ir","_withModifiers","registrar","navegar","salto","dropTarget","listRefs","setListRef","fallbackLabel","isDraggable","isDragging","computeIndex","colValue","list","cards","rect","onDragStart","onDragOver","onDragLeave","related","onDrop","drag","clearDrag","rawIndex","oldIndex","onDragEnd","onCardClick","showIndicatorAt","_withKeys"],"mappings":"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","x_google_ignoreList":[1,2,22,23]}