@wgalleti/primevue-components 0.9.6 → 0.11.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.
Files changed (37) hide show
  1. package/README.md +4 -0
  2. package/dist/WMapSelect.vue_vue_type_script_setup_true_lang-BOhO1F9v.js +4991 -0
  3. package/dist/WMapSelect.vue_vue_type_script_setup_true_lang-BOhO1F9v.js.map +1 -0
  4. package/dist/WMapSelect.vue_vue_type_script_setup_true_lang-BkZhQ_LO.cjs +12 -0
  5. package/dist/WMapSelect.vue_vue_type_script_setup_true_lang-BkZhQ_LO.cjs.map +1 -0
  6. package/dist/components/crud/WEditableTable.vue.d.ts +78 -0
  7. package/dist/components/form/WAutoCompleteFK.vue.d.ts +9 -1
  8. package/dist/components/form/WTreeSelect.vue.d.ts +124 -0
  9. package/dist/components/index.d.ts +6 -0
  10. package/dist/components/ui/WCheckList.vue.d.ts +36 -0
  11. package/dist/components/ui/WInfoCard.vue.d.ts +11 -1
  12. package/dist/components/ui/WMapSelect.vue.d.ts +133 -0
  13. package/dist/components/ui/WStepFlow.vue.d.ts +51 -0
  14. package/dist/components/ui/WStepSection.vue.d.ts +49 -0
  15. package/dist/components.cjs +1 -1
  16. package/dist/components.cjs.map +1 -1
  17. package/dist/components.js +29 -124
  18. package/dist/components.js.map +1 -1
  19. package/dist/index.cjs +1 -1
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.d.ts +5 -2
  22. package/dist/index.js +79 -70
  23. package/dist/index.js.map +1 -1
  24. package/dist/primevue-components.css +1 -1
  25. package/dist/types/checkList.d.ts +7 -0
  26. package/dist/types/editableTable.d.ts +39 -0
  27. package/dist/types/field.d.ts +27 -1
  28. package/dist/types/index.d.ts +3 -0
  29. package/dist/types/mapSelect.d.ts +31 -0
  30. package/dist/utils/stepFlow.d.ts +27 -0
  31. package/dist/utils/treeSelect.d.ts +76 -0
  32. package/package.json +5 -1
  33. package/skill/references/components.md +7 -0
  34. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-Cc0DJRIy.cjs +0 -12
  35. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-Cc0DJRIy.cjs.map +0 -1
  36. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-DVjJq8Bs.js +0 -3632
  37. package/dist/WProgressFlow.vue_vue_type_script_setup_true_lang-DVjJq8Bs.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/data-providers/axiosDataProvider.ts","../src/plugin.ts","../src/data-providers/supabaseDataProvider.ts"],"sourcesContent":["import type { AxiosInstance } from 'axios'\nimport type {\n DataProvider,\n DataProviderListParams,\n DataProviderListResponse,\n DataProviderRequestConfig,\n DataProviderResponse,\n} from '@/types/dataProvider'\n\nfunction normalizeListResponse<T>(\n responseData: unknown,\n fallbackPage: number,\n fallbackPageSize: number,\n): DataProviderListResponse<T> {\n const data = responseData as Record<string, unknown>\n\n if (Array.isArray(data.results)) {\n return {\n data: data.results as T[],\n page: (data.page as number) ?? fallbackPage,\n page_size: (data.page_size as number) ?? fallbackPageSize,\n rows: (data.count as number) ?? 0,\n extras: (data.extras as Record<string, unknown>) ?? {},\n }\n }\n\n if (Array.isArray(data.data)) {\n return {\n data: data.data as T[],\n page: (data.page as number) ?? fallbackPage,\n page_size: (data.page_size as number) ?? fallbackPageSize,\n rows: (data.rows as number) ?? 0,\n extras: (data.extras as Record<string, unknown>) ?? {},\n }\n }\n\n return {\n data: Array.isArray(responseData) ? (responseData as T[]) : [],\n page: fallbackPage,\n page_size: fallbackPageSize,\n rows: Array.isArray(responseData) ? responseData.length : 0,\n extras: {},\n }\n}\n\nexport function createAxiosDataProvider(axios: AxiosInstance): DataProvider {\n return {\n async list<T = Record<string, unknown>>(\n endpoint: string,\n params: DataProviderListParams = {},\n ): Promise<DataProviderListResponse<T>> {\n const response = await axios.get(endpoint, { params })\n return normalizeListResponse<T>(\n response.data,\n Number(params.page ?? 1),\n Number(params.page_size ?? 20),\n )\n },\n\n async get<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.get<T>(`${endpoint}${id}/`, config)\n return { data: response.data }\n },\n\n async create<T = Record<string, unknown>>(\n endpoint: string,\n payload: Record<string, unknown> | FormData,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.post<T>(endpoint, payload, config)\n return { data: response.data }\n },\n\n async update<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n payload: Record<string, unknown> | FormData,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.patch<T>(`${endpoint}${id}/`, payload, config)\n return { data: response.data }\n },\n\n async delete(endpoint: string, id: string | number): Promise<void> {\n await axios.delete(`${endpoint}${id}/`)\n },\n }\n}\n","import type { App, Plugin } from 'vue'\nimport type { WPluginOptions, WPluginConfig } from './types/plugin'\nimport { W_AXIOS_KEY, W_CONFIG_KEY, W_DATA_PROVIDER_KEY } from './types/plugin'\nimport {\n WCrudView,\n WCrudFormDialog,\n WCrudColumnRenderer,\n WAutoCompleteFK,\n WMoneyInput,\n WTransferList,\n} from './components'\nimport { createAxiosDataProvider } from './data-providers/axiosDataProvider'\n\nexport const WPrimeVuePlugin: Plugin = {\n install(app: App, options: WPluginOptions) {\n if (!options?.axios && !options?.dataProvider) {\n throw new Error(\n '[wPrimeVueComponents] Informe \"axios\" ou \"dataProvider\" ao registrar o WPrimeVuePlugin.',\n )\n }\n\n const dataProvider = options.dataProvider ?? createAxiosDataProvider(options.axios!)\n\n const config: WPluginConfig = {\n axios: options.axios,\n dataProvider,\n defaultPageSize: options.defaultPageSize ?? 20,\n dateFormat: options.dateFormat ?? 'DD/MM/YYYY',\n dateTimeFormat: options.dateTimeFormat ?? 'DD/MM/YYYY HH:mm',\n locale: options.locale ?? 'pt-BR',\n currency: options.currency ?? 'BRL',\n }\n\n if (options.axios) {\n app.provide(W_AXIOS_KEY, options.axios)\n }\n app.provide(W_DATA_PROVIDER_KEY, dataProvider)\n app.provide(W_CONFIG_KEY, config)\n\n if (options.registerComponents !== false) {\n app.component('WCrudView', WCrudView)\n app.component('WCrudFormDialog', WCrudFormDialog)\n app.component('WCrudColumnRenderer', WCrudColumnRenderer)\n app.component('WAutoCompleteFK', WAutoCompleteFK)\n app.component('WMoneyInput', WMoneyInput)\n app.component('WTransferList', WTransferList)\n }\n },\n}\n","import type {\n DataProvider,\n DataProviderListParams,\n DataProviderListResponse,\n DataProviderRequestConfig,\n DataProviderResponse,\n} from '@/types/dataProvider'\n\ntype SupabaseResult<T> = {\n data: T | null\n error: {\n message: string\n code?: string\n details?: string\n hint?: string\n } | null\n count?: number | null\n}\n\ntype SupabaseFilterBuilder<T> = PromiseLike<SupabaseResult<T>> & {\n select(\n columns?: string,\n options?: { count?: 'exact' | 'planned' | 'estimated' },\n ): SupabaseFilterBuilder<T>\n eq(column: string, value: unknown): SupabaseFilterBuilder<T>\n ilike(column: string, pattern: string): SupabaseFilterBuilder<T>\n or(filters: string): SupabaseFilterBuilder<T>\n order(column: string, options?: { ascending?: boolean }): SupabaseFilterBuilder<T>\n range(from: number, to: number): SupabaseFilterBuilder<T>\n single(): Promise<SupabaseResult<T>>\n}\n\ntype SupabaseTable = {\n select<T = unknown>(\n columns?: string,\n options?: { count?: 'exact' | 'planned' | 'estimated' },\n ): SupabaseFilterBuilder<T>\n insert<T = unknown>(payload: unknown): SupabaseFilterBuilder<T>\n update<T = unknown>(payload: unknown): SupabaseFilterBuilder<T>\n delete<T = unknown>(): SupabaseFilterBuilder<T>\n}\n\nexport interface SupabaseDataProviderClient {\n from(table: string): SupabaseTable\n}\n\nexport interface SupabaseResourceConfig {\n table: string\n pk?: string\n select?: string\n searchFields?: string[]\n defaultOrdering?: string\n defaultFilters?: Record<string, unknown>\n softDelete?: boolean | Record<string, unknown>\n mapListItem?: (item: Record<string, unknown>) => Record<string, unknown>\n mapPayload?: (\n payload: Record<string, unknown>,\n operation: 'create' | 'update',\n ) => Record<string, unknown>\n}\n\nexport interface CreateSupabaseDataProviderOptions {\n client: SupabaseDataProviderClient\n resources?: Record<string, SupabaseResourceConfig | string>\n defaultSelect?: string\n allowedTables?: string[]\n}\n\nfunction normalizeEndpoint(endpoint: string): string {\n return endpoint\n .split('?')[0]\n .replace(/^\\/+|\\/+$/g, '')\n .replace(/^api\\/v\\d+\\//, '')\n}\n\nfunction toResourceConfig(resource: SupabaseResourceConfig | string): SupabaseResourceConfig {\n return typeof resource === 'string' ? { table: resource } : resource\n}\n\nfunction createProviderError(message: string, status = 400) {\n return {\n response: {\n status,\n data: { detail: message },\n },\n message,\n }\n}\n\nfunction assertPlainPayload(payload: Record<string, unknown> | FormData): Record<string, unknown> {\n if (payload instanceof FormData) {\n throw createProviderError(\n 'SupabaseDataProvider nao envia FormData diretamente. Faça upload do arquivo no Storage e envie a URL/caminho no payload.',\n )\n }\n\n return payload\n}\n\nfunction normalizeSupabaseError(error: SupabaseResult<unknown>['error']): never {\n throw {\n response: {\n data: {\n detail: error?.message ?? 'Erro ao consultar Supabase',\n code: error?.code,\n details: error?.details,\n hint: error?.hint,\n },\n },\n message: error?.message ?? 'Erro ao consultar Supabase',\n }\n}\n\nfunction resolveResource(\n endpoint: string,\n options: CreateSupabaseDataProviderOptions,\n): SupabaseResourceConfig {\n const resourceName = normalizeEndpoint(endpoint)\n const configuredResource = options.resources?.[resourceName]\n\n if (configuredResource) {\n return toResourceConfig(configuredResource)\n }\n\n if (options.allowedTables?.includes(resourceName)) {\n return { table: resourceName }\n }\n\n throw createProviderError(`Recurso Supabase nao registrado para o endpoint \"${endpoint}\".`, 404)\n}\n\nfunction applyFilters<T>(\n query: SupabaseFilterBuilder<T>,\n params: DataProviderListParams,\n resource: SupabaseResourceConfig,\n): SupabaseFilterBuilder<T> {\n const reservedKeys = new Set(['page', 'page_size', 'search', 'ordering'])\n const filters = { ...resource.defaultFilters, ...params }\n\n for (const [key, value] of Object.entries(filters)) {\n if (reservedKeys.has(key) || value === null || value === undefined || value === '') {\n continue\n }\n query = query.eq(key, value)\n }\n\n return query\n}\n\nfunction applySearch<T>(\n query: SupabaseFilterBuilder<T>,\n search: unknown,\n searchFields?: string[],\n): SupabaseFilterBuilder<T> {\n if (typeof search !== 'string' || !search.trim() || !searchFields?.length) {\n return query\n }\n\n const escapedSearch = search.trim().replace(/,/g, '\\\\,')\n const expression = searchFields.map((field) => `${field}.ilike.%${escapedSearch}%`).join(',')\n\n return query.or(expression)\n}\n\nfunction parseOrdering(ordering: unknown, fallback?: string) {\n const value = typeof ordering === 'string' && ordering ? ordering : fallback\n if (!value) return null\n\n return {\n field: value.startsWith('-') ? value.slice(1) : value,\n ascending: !value.startsWith('-'),\n }\n}\n\nfunction mapList<T>(data: T[] | null, resource: SupabaseResourceConfig): T[] {\n if (!data) return []\n if (!resource.mapListItem) return data\n\n return data.map((item) => resource.mapListItem?.(item as Record<string, unknown>)) as T[]\n}\n\nexport function createSupabaseDataProvider(\n options: CreateSupabaseDataProviderOptions,\n): DataProvider {\n const defaultSelect = options.defaultSelect ?? '*'\n\n return {\n async list<T = Record<string, unknown>>(\n endpoint: string,\n params: DataProviderListParams = {},\n ): Promise<DataProviderListResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const page = Math.max(Number(params.page ?? 1), 1)\n const pageSize = Math.max(Number(params.page_size ?? 20), 1)\n const from = (page - 1) * pageSize\n const to = from + pageSize - 1\n\n let query = options.client\n .from(resource.table)\n .select<T[]>(resource.select ?? defaultSelect, { count: 'exact' })\n\n query = applyFilters(query, params, resource)\n query = applySearch(query, params.search, resource.searchFields)\n\n const ordering = parseOrdering(params.ordering, resource.defaultOrdering)\n if (ordering) {\n query = query.order(ordering.field, { ascending: ordering.ascending })\n }\n\n const result = await query.range(from, to)\n if (result.error) normalizeSupabaseError(result.error)\n\n return {\n data: mapList(result.data, resource),\n page,\n page_size: pageSize,\n rows: result.count ?? result.data?.length ?? 0,\n extras: {},\n }\n },\n\n async get<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const result = await options.client\n .from(resource.table)\n .select<T>(resource.select ?? defaultSelect)\n .eq(pk, id)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async create<T = Record<string, unknown>>(\n endpoint: string,\n payload: Record<string, unknown> | FormData,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const plainPayload = assertPlainPayload(payload)\n const mappedPayload = resource.mapPayload\n ? resource.mapPayload(plainPayload, 'create')\n : plainPayload\n const result = await options.client\n .from(resource.table)\n .insert<T>(mappedPayload)\n .select(resource.select ?? defaultSelect)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async update<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n payload: Record<string, unknown> | FormData,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const plainPayload = assertPlainPayload(payload)\n const mappedPayload = resource.mapPayload\n ? resource.mapPayload(plainPayload, 'update')\n : plainPayload\n const result = await options.client\n .from(resource.table)\n .update<T>(mappedPayload)\n .eq(pk, id)\n .select(resource.select ?? defaultSelect)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async delete(endpoint: string, id: string | number): Promise<void> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const softDeletePayload =\n resource.softDelete === true\n ? { is_active: false }\n : typeof resource.softDelete === 'object'\n ? resource.softDelete\n : null\n\n const result = softDeletePayload\n ? await options.client.from(resource.table).update(softDeletePayload).eq(pk, id)\n : await options.client.from(resource.table).delete().eq(pk, id)\n\n if (result.error) normalizeSupabaseError(result.error)\n },\n }\n}\n"],"names":["normalizeListResponse","responseData","fallbackPage","fallbackPageSize","data","createAxiosDataProvider","axios","endpoint","params","response","id","config","payload","WPrimeVuePlugin","app","options","dataProvider","W_AXIOS_KEY","W_DATA_PROVIDER_KEY","W_CONFIG_KEY","WCrudView","WCrudFormDialog","WCrudColumnRenderer","WAutoCompleteFK","WMoneyInput","WTransferList","normalizeEndpoint","toResourceConfig","resource","createProviderError","message","status","assertPlainPayload","normalizeSupabaseError","error","resolveResource","resourceName","configuredResource","_a","_b","applyFilters","query","reservedKeys","filters","key","value","applySearch","search","searchFields","escapedSearch","expression","field","parseOrdering","ordering","fallback","mapList","item","createSupabaseDataProvider","defaultSelect","page","pageSize","from","to","result","_config","pk","plainPayload","mappedPayload","softDeletePayload"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/data-providers/axiosDataProvider.ts","../src/plugin.ts","../src/data-providers/supabaseDataProvider.ts"],"sourcesContent":["import type { AxiosInstance } from 'axios'\nimport type {\n DataProvider,\n DataProviderListParams,\n DataProviderListResponse,\n DataProviderRequestConfig,\n DataProviderResponse,\n} from '@/types/dataProvider'\n\nfunction normalizeListResponse<T>(\n responseData: unknown,\n fallbackPage: number,\n fallbackPageSize: number,\n): DataProviderListResponse<T> {\n const data = responseData as Record<string, unknown>\n\n if (Array.isArray(data.results)) {\n return {\n data: data.results as T[],\n page: (data.page as number) ?? fallbackPage,\n page_size: (data.page_size as number) ?? fallbackPageSize,\n rows: (data.count as number) ?? 0,\n extras: (data.extras as Record<string, unknown>) ?? {},\n }\n }\n\n if (Array.isArray(data.data)) {\n return {\n data: data.data as T[],\n page: (data.page as number) ?? fallbackPage,\n page_size: (data.page_size as number) ?? fallbackPageSize,\n rows: (data.rows as number) ?? 0,\n extras: (data.extras as Record<string, unknown>) ?? {},\n }\n }\n\n return {\n data: Array.isArray(responseData) ? (responseData as T[]) : [],\n page: fallbackPage,\n page_size: fallbackPageSize,\n rows: Array.isArray(responseData) ? responseData.length : 0,\n extras: {},\n }\n}\n\nexport function createAxiosDataProvider(axios: AxiosInstance): DataProvider {\n return {\n async list<T = Record<string, unknown>>(\n endpoint: string,\n params: DataProviderListParams = {},\n ): Promise<DataProviderListResponse<T>> {\n const response = await axios.get(endpoint, { params })\n return normalizeListResponse<T>(\n response.data,\n Number(params.page ?? 1),\n Number(params.page_size ?? 20),\n )\n },\n\n async get<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.get<T>(`${endpoint}${id}/`, config)\n return { data: response.data }\n },\n\n async create<T = Record<string, unknown>>(\n endpoint: string,\n payload: Record<string, unknown> | FormData,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.post<T>(endpoint, payload, config)\n return { data: response.data }\n },\n\n async update<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n payload: Record<string, unknown> | FormData,\n config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const response = await axios.patch<T>(`${endpoint}${id}/`, payload, config)\n return { data: response.data }\n },\n\n async delete(endpoint: string, id: string | number): Promise<void> {\n await axios.delete(`${endpoint}${id}/`)\n },\n }\n}\n","import type { App, Plugin } from 'vue'\nimport type { WPluginOptions, WPluginConfig } from './types/plugin'\nimport { W_AXIOS_KEY, W_CONFIG_KEY, W_DATA_PROVIDER_KEY } from './types/plugin'\nimport {\n WCrudView,\n WCrudFormDialog,\n WCrudColumnRenderer,\n WAutoCompleteFK,\n WMoneyInput,\n WTransferList,\n WTreeSelect,\n} from './components'\nimport { createAxiosDataProvider } from './data-providers/axiosDataProvider'\n\nexport const WPrimeVuePlugin: Plugin = {\n install(app: App, options: WPluginOptions) {\n if (!options?.axios && !options?.dataProvider) {\n throw new Error(\n '[wPrimeVueComponents] Informe \"axios\" ou \"dataProvider\" ao registrar o WPrimeVuePlugin.',\n )\n }\n\n const dataProvider = options.dataProvider ?? createAxiosDataProvider(options.axios!)\n\n const config: WPluginConfig = {\n axios: options.axios,\n dataProvider,\n defaultPageSize: options.defaultPageSize ?? 20,\n dateFormat: options.dateFormat ?? 'DD/MM/YYYY',\n dateTimeFormat: options.dateTimeFormat ?? 'DD/MM/YYYY HH:mm',\n locale: options.locale ?? 'pt-BR',\n currency: options.currency ?? 'BRL',\n }\n\n if (options.axios) {\n app.provide(W_AXIOS_KEY, options.axios)\n }\n app.provide(W_DATA_PROVIDER_KEY, dataProvider)\n app.provide(W_CONFIG_KEY, config)\n\n if (options.registerComponents !== false) {\n app.component('WCrudView', WCrudView)\n app.component('WCrudFormDialog', WCrudFormDialog)\n app.component('WCrudColumnRenderer', WCrudColumnRenderer)\n app.component('WAutoCompleteFK', WAutoCompleteFK)\n app.component('WMoneyInput', WMoneyInput)\n app.component('WTransferList', WTransferList)\n app.component('WTreeSelect', WTreeSelect)\n }\n },\n}\n","import type {\n DataProvider,\n DataProviderListParams,\n DataProviderListResponse,\n DataProviderRequestConfig,\n DataProviderResponse,\n} from '@/types/dataProvider'\n\ntype SupabaseResult<T> = {\n data: T | null\n error: {\n message: string\n code?: string\n details?: string\n hint?: string\n } | null\n count?: number | null\n}\n\ntype SupabaseFilterBuilder<T> = PromiseLike<SupabaseResult<T>> & {\n select(\n columns?: string,\n options?: { count?: 'exact' | 'planned' | 'estimated' },\n ): SupabaseFilterBuilder<T>\n eq(column: string, value: unknown): SupabaseFilterBuilder<T>\n ilike(column: string, pattern: string): SupabaseFilterBuilder<T>\n or(filters: string): SupabaseFilterBuilder<T>\n order(column: string, options?: { ascending?: boolean }): SupabaseFilterBuilder<T>\n range(from: number, to: number): SupabaseFilterBuilder<T>\n single(): Promise<SupabaseResult<T>>\n}\n\ntype SupabaseTable = {\n select<T = unknown>(\n columns?: string,\n options?: { count?: 'exact' | 'planned' | 'estimated' },\n ): SupabaseFilterBuilder<T>\n insert<T = unknown>(payload: unknown): SupabaseFilterBuilder<T>\n update<T = unknown>(payload: unknown): SupabaseFilterBuilder<T>\n delete<T = unknown>(): SupabaseFilterBuilder<T>\n}\n\nexport interface SupabaseDataProviderClient {\n from(table: string): SupabaseTable\n}\n\nexport interface SupabaseResourceConfig {\n table: string\n pk?: string\n select?: string\n searchFields?: string[]\n defaultOrdering?: string\n defaultFilters?: Record<string, unknown>\n softDelete?: boolean | Record<string, unknown>\n mapListItem?: (item: Record<string, unknown>) => Record<string, unknown>\n mapPayload?: (\n payload: Record<string, unknown>,\n operation: 'create' | 'update',\n ) => Record<string, unknown>\n}\n\nexport interface CreateSupabaseDataProviderOptions {\n client: SupabaseDataProviderClient\n resources?: Record<string, SupabaseResourceConfig | string>\n defaultSelect?: string\n allowedTables?: string[]\n}\n\nfunction normalizeEndpoint(endpoint: string): string {\n return endpoint\n .split('?')[0]\n .replace(/^\\/+|\\/+$/g, '')\n .replace(/^api\\/v\\d+\\//, '')\n}\n\nfunction toResourceConfig(resource: SupabaseResourceConfig | string): SupabaseResourceConfig {\n return typeof resource === 'string' ? { table: resource } : resource\n}\n\nfunction createProviderError(message: string, status = 400) {\n return {\n response: {\n status,\n data: { detail: message },\n },\n message,\n }\n}\n\nfunction assertPlainPayload(payload: Record<string, unknown> | FormData): Record<string, unknown> {\n if (payload instanceof FormData) {\n throw createProviderError(\n 'SupabaseDataProvider nao envia FormData diretamente. Faça upload do arquivo no Storage e envie a URL/caminho no payload.',\n )\n }\n\n return payload\n}\n\nfunction normalizeSupabaseError(error: SupabaseResult<unknown>['error']): never {\n throw {\n response: {\n data: {\n detail: error?.message ?? 'Erro ao consultar Supabase',\n code: error?.code,\n details: error?.details,\n hint: error?.hint,\n },\n },\n message: error?.message ?? 'Erro ao consultar Supabase',\n }\n}\n\nfunction resolveResource(\n endpoint: string,\n options: CreateSupabaseDataProviderOptions,\n): SupabaseResourceConfig {\n const resourceName = normalizeEndpoint(endpoint)\n const configuredResource = options.resources?.[resourceName]\n\n if (configuredResource) {\n return toResourceConfig(configuredResource)\n }\n\n if (options.allowedTables?.includes(resourceName)) {\n return { table: resourceName }\n }\n\n throw createProviderError(`Recurso Supabase nao registrado para o endpoint \"${endpoint}\".`, 404)\n}\n\nfunction applyFilters<T>(\n query: SupabaseFilterBuilder<T>,\n params: DataProviderListParams,\n resource: SupabaseResourceConfig,\n): SupabaseFilterBuilder<T> {\n const reservedKeys = new Set(['page', 'page_size', 'search', 'ordering'])\n const filters = { ...resource.defaultFilters, ...params }\n\n for (const [key, value] of Object.entries(filters)) {\n if (reservedKeys.has(key) || value === null || value === undefined || value === '') {\n continue\n }\n query = query.eq(key, value)\n }\n\n return query\n}\n\nfunction applySearch<T>(\n query: SupabaseFilterBuilder<T>,\n search: unknown,\n searchFields?: string[],\n): SupabaseFilterBuilder<T> {\n if (typeof search !== 'string' || !search.trim() || !searchFields?.length) {\n return query\n }\n\n const escapedSearch = search.trim().replace(/,/g, '\\\\,')\n const expression = searchFields.map((field) => `${field}.ilike.%${escapedSearch}%`).join(',')\n\n return query.or(expression)\n}\n\nfunction parseOrdering(ordering: unknown, fallback?: string) {\n const value = typeof ordering === 'string' && ordering ? ordering : fallback\n if (!value) return null\n\n return {\n field: value.startsWith('-') ? value.slice(1) : value,\n ascending: !value.startsWith('-'),\n }\n}\n\nfunction mapList<T>(data: T[] | null, resource: SupabaseResourceConfig): T[] {\n if (!data) return []\n if (!resource.mapListItem) return data\n\n return data.map((item) => resource.mapListItem?.(item as Record<string, unknown>)) as T[]\n}\n\nexport function createSupabaseDataProvider(\n options: CreateSupabaseDataProviderOptions,\n): DataProvider {\n const defaultSelect = options.defaultSelect ?? '*'\n\n return {\n async list<T = Record<string, unknown>>(\n endpoint: string,\n params: DataProviderListParams = {},\n ): Promise<DataProviderListResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const page = Math.max(Number(params.page ?? 1), 1)\n const pageSize = Math.max(Number(params.page_size ?? 20), 1)\n const from = (page - 1) * pageSize\n const to = from + pageSize - 1\n\n let query = options.client\n .from(resource.table)\n .select<T[]>(resource.select ?? defaultSelect, { count: 'exact' })\n\n query = applyFilters(query, params, resource)\n query = applySearch(query, params.search, resource.searchFields)\n\n const ordering = parseOrdering(params.ordering, resource.defaultOrdering)\n if (ordering) {\n query = query.order(ordering.field, { ascending: ordering.ascending })\n }\n\n const result = await query.range(from, to)\n if (result.error) normalizeSupabaseError(result.error)\n\n return {\n data: mapList(result.data, resource),\n page,\n page_size: pageSize,\n rows: result.count ?? result.data?.length ?? 0,\n extras: {},\n }\n },\n\n async get<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const result = await options.client\n .from(resource.table)\n .select<T>(resource.select ?? defaultSelect)\n .eq(pk, id)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async create<T = Record<string, unknown>>(\n endpoint: string,\n payload: Record<string, unknown> | FormData,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const plainPayload = assertPlainPayload(payload)\n const mappedPayload = resource.mapPayload\n ? resource.mapPayload(plainPayload, 'create')\n : plainPayload\n const result = await options.client\n .from(resource.table)\n .insert<T>(mappedPayload)\n .select(resource.select ?? defaultSelect)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async update<T = Record<string, unknown>>(\n endpoint: string,\n id: string | number,\n payload: Record<string, unknown> | FormData,\n _config?: DataProviderRequestConfig,\n ): Promise<DataProviderResponse<T>> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const plainPayload = assertPlainPayload(payload)\n const mappedPayload = resource.mapPayload\n ? resource.mapPayload(plainPayload, 'update')\n : plainPayload\n const result = await options.client\n .from(resource.table)\n .update<T>(mappedPayload)\n .eq(pk, id)\n .select(resource.select ?? defaultSelect)\n .single()\n\n if (result.error) normalizeSupabaseError(result.error)\n return { data: result.data as T }\n },\n\n async delete(endpoint: string, id: string | number): Promise<void> {\n const resource = resolveResource(endpoint, options)\n const pk = resource.pk ?? 'id'\n const softDeletePayload =\n resource.softDelete === true\n ? { is_active: false }\n : typeof resource.softDelete === 'object'\n ? resource.softDelete\n : null\n\n const result = softDeletePayload\n ? await options.client.from(resource.table).update(softDeletePayload).eq(pk, id)\n : await options.client.from(resource.table).delete().eq(pk, id)\n\n if (result.error) normalizeSupabaseError(result.error)\n },\n }\n}\n"],"names":["normalizeListResponse","responseData","fallbackPage","fallbackPageSize","data","createAxiosDataProvider","axios","endpoint","params","response","id","config","payload","WPrimeVuePlugin","app","options","dataProvider","W_AXIOS_KEY","W_DATA_PROVIDER_KEY","W_CONFIG_KEY","WCrudView","WCrudFormDialog","WCrudColumnRenderer","WAutoCompleteFK","WMoneyInput","WTransferList","WTreeSelect","normalizeEndpoint","toResourceConfig","resource","createProviderError","message","status","assertPlainPayload","normalizeSupabaseError","error","resolveResource","resourceName","configuredResource","_a","_b","applyFilters","query","reservedKeys","filters","key","value","applySearch","search","searchFields","escapedSearch","expression","field","parseOrdering","ordering","fallback","mapList","item","createSupabaseDataProvider","defaultSelect","page","pageSize","from","to","result","_config","pk","plainPayload","mappedPayload","softDeletePayload"],"mappings":"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"}
@@ -1 +1 @@
1
- .w-imgcropper-preview[data-v-95684d2d]{position:relative;overflow:hidden;border-radius:8px;border:1px solid var(--p-content-border-color, #e2e8f0);background:var(--p-content-background, #f8fafc)}.w-imgcropper-preview.is-circular[data-v-95684d2d]{border-radius:50%}.w-imgcropper-img[data-v-95684d2d]{width:100%;height:100%;object-fit:cover;display:block}.w-imgcropper-actions[data-v-95684d2d]{position:absolute;inset:auto 0 0 0;display:flex;justify-content:center;gap:4px;padding:4px;background:color-mix(in srgb,#000 45%,transparent);opacity:0;transition:opacity .15s ease}.w-imgcropper-preview:hover .w-imgcropper-actions[data-v-95684d2d],.w-imgcropper-preview:focus-within .w-imgcropper-actions[data-v-95684d2d]{opacity:1}.w-imgcropper-empty[data-v-95684d2d]{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;cursor:pointer;border:none;background:transparent;color:var(--p-text-muted-color, #64748b);font-size:.85rem}.w-imgcropper-empty i[data-v-95684d2d]{font-size:1.5rem}.w-imgcropper-file[data-v-95684d2d]{display:none}.w-imgcropper-stage[data-v-95684d2d]{display:flex;flex-direction:column;gap:16px;align-items:center}.w-imgcropper-viewport[data-v-95684d2d]{position:relative;overflow:hidden;touch-action:none;cursor:grab;background:#1e1e1e;border-radius:4px}.w-imgcropper-viewport[data-v-95684d2d]:active{cursor:grabbing}.w-imgcropper-viewport.is-circular[data-v-95684d2d]{border-radius:50%}.w-imgcropper-cropimg[data-v-95684d2d]{position:absolute;top:0;left:0;max-width:none;-webkit-user-select:none;user-select:none;-webkit-user-drag:none}.w-imgcropper-stencil[data-v-95684d2d]{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;box-shadow:0 0 0 1px color-mix(in srgb,#fff 60%,transparent) inset}.w-imgcropper-stencil.is-circular[data-v-95684d2d]{border-radius:50%}.w-imgcropper-zoom[data-v-95684d2d]{display:flex;align-items:center;gap:10px;width:100%;color:var(--p-text-muted-color, #64748b)}.w-imgcropper-slider[data-v-95684d2d]{flex:1}.w-crud-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1.5rem}.w-crud-header-content{min-width:0}.w-crud-title{font-size:1.25rem;font-weight:600;letter-spacing:-.015em;color:var(--p-text-color);line-height:1.3}.w-crud-subtitle{margin-top:.125rem;font-size:.8125rem;color:var(--p-text-muted-color)}.w-crud-header-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-crud-kpis{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:.75rem;margin-bottom:1.25rem}.w-crud-kpi{display:flex;align-items:center;gap:.75rem;padding:1rem 1.25rem;border-radius:.75rem;border:1px solid var(--p-content-border-color);background:var(--p-content-background)}.w-crud-kpi-icon{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;border-radius:.75rem;background:color-mix(in srgb,var(--p-primary-color) 10%,transparent);color:var(--p-primary-color);flex-shrink:0;font-size:1.125rem}.w-crud-kpi-icon--primary{background:color-mix(in srgb,var(--p-primary-color) 10%,transparent);color:var(--p-primary-color)}.w-crud-kpi-icon--success{background:color-mix(in srgb,var(--p-green-500, #22c55e) 10%,transparent);color:var(--p-green-500, #22c55e)}.w-crud-kpi-icon--warning{background:color-mix(in srgb,var(--p-yellow-500, #eab308) 10%,transparent);color:var(--p-yellow-500, #eab308)}.w-crud-kpi-icon--danger{background:color-mix(in srgb,var(--p-red-500, #ef4444) 10%,transparent);color:var(--p-red-500, #ef4444)}.w-crud-kpi-icon--info{background:color-mix(in srgb,var(--p-blue-500, #3b82f6) 10%,transparent);color:var(--p-blue-500, #3b82f6)}.w-crud-kpi-content{min-width:0}.w-crud-kpi-label{font-size:.6875rem;font-weight:500;color:var(--p-text-muted-color);text-transform:uppercase;letter-spacing:.05em;line-height:1;margin-bottom:.25rem}.w-crud-kpi-value{font-size:1.25rem;font-weight:700;color:var(--p-text-color);letter-spacing:-.02em;line-height:1}.w-crud-table{border-radius:.75rem;border:1px solid var(--p-content-border-color);background:var(--p-content-background);overflow:hidden}.w-crud-table .p-datatable{font-size:.8125rem}.w-crud-table .p-datatable-header{background:transparent;border-bottom:1px solid var(--p-content-border-color);padding:.75rem 1rem}.w-crud-table .p-datatable-thead>tr>th{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--p-text-muted-color);background:var(--p-content-background)}.w-crud-table .p-datatable-tbody>tr>td{padding-top:.625rem;padding-bottom:.625rem}.w-crud-table .p-datatable-paginator-bottom{border-top:1px solid var(--p-content-border-color)}.w-crud-paginator .p-paginator-content{justify-content:flex-end}.w-crud-paginator .p-paginator-current{font-size:.75rem;color:var(--p-text-muted-color);margin-right:auto!important}.w-crud-toolbar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.75rem;padding:.25rem 0}.w-crud-toolbar-start{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem;min-width:0;flex:1 1 auto}.w-crud-toolbar-end{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem}.w-crud-actions-header .p-datatable-column-header-content{justify-content:center}.w-crud-actions{display:flex;align-items:center;justify-content:center;gap:.125rem}.w-crud-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:4rem 1rem}.w-crud-empty-icon{display:flex;align-items:center;justify-content:center;width:4rem;height:4rem;border-radius:1rem;margin-bottom:1rem;background:var(--p-content-hover-background);color:var(--p-text-muted-color);font-size:1.5rem}.w-crud-empty-title{font-size:.875rem;font-weight:600;color:var(--p-text-color)}.w-crud-empty-text{font-size:.75rem;color:var(--p-text-muted-color);margin-top:.25rem}.p-datatable-header-cell.text-right .p-datatable-column-header-content{justify-content:flex-end}.p-datatable-header-cell.text-center .p-datatable-column-header-content{justify-content:center}.p-dialog.w-crud-form-dialog>.p-dialog-header{padding-bottom:.5rem}.p-dialog.w-crud-form-dialog>.p-dialog-content{padding-bottom:.75rem}.w-crud-form{display:flex;flex-direction:column;gap:1.5rem}.w-crud-form-group-header{margin-bottom:.75rem;padding-bottom:.5rem;border-bottom:1px solid var(--p-surface-200)}.dark .w-crud-form-group-header{border-bottom-color:var(--p-surface-700)}.w-crud-form-group-title{font-size:.875rem;font-weight:600;color:var(--p-text-color);margin:0}.w-crud-form-group-desc{font-size:.75rem;color:var(--p-text-muted-color);margin:.25rem 0 0}.w-crud-form-cep-error{display:block;font-size:.75rem;color:var(--p-red-500);margin-top:.25rem}.w-crud-form-cep-spinner{margin-left:.375rem;font-size:.75rem;color:var(--p-text-muted-color)}.w-crud-form-fields{display:grid;grid-template-columns:repeat(var(--w-form-cols, 2),1fr);gap:1rem 1rem}.w-crud-form-col-full{grid-column:span var(--w-col-span, 2)}.w-crud-form-col-half{grid-column:span var(--w-col-span, 1)}@media(max-width:640px){.w-crud-form-fields{grid-template-columns:1fr}.w-crud-form-col-full,.w-crud-form-col-half,.w-crud-form-switch{grid-column:1 / -1}}.w-crud-form-field{display:flex;flex-direction:column}.w-crud-form-required{color:var(--p-red-400, #f87171);margin-left:.125rem}.w-crud-form-label{display:block;font-weight:500;margin-bottom:.375rem;color:var(--p-text-color);font-size:.75rem}.w-crud-form-color-row{display:flex;align-items:center;gap:.5rem}.w-crud-form-switch{grid-column:span var(--w-col-span, 2);display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;border-radius:.5rem;background:var(--p-content-hover-background)}.w-crud-form-switch-label{font-size:.875rem;font-weight:500;color:var(--p-text-color);-webkit-user-select:none;user-select:none}.w-crud-form-error{display:block;font-size:.75rem;color:var(--p-red-400, #f87171);margin-top:.25rem}.w-crud-form-footer{display:flex;justify-content:space-between;gap:.5rem;padding-top:1rem;padding-bottom:.5rem;border-top:1px solid var(--p-content-border-color);margin-top:.25rem}.w-autocompletefk{position:relative;display:flex;align-items:stretch;width:100%}.w-autocompletefk .p-autocomplete{flex:1;min-width:0}.w-autocompletefk .p-autocomplete-input{padding-right:2.5rem}.w-autocompletefk .p-autocomplete-input-multiple{padding-right:2.5rem;min-width:0;max-height:7rem;overflow-y:auto}.w-autocompletefk .p-autocomplete-chip-item{max-width:var(--w-fk-chip-max, 100%);min-width:min(100%,6rem)}.w-autocompletefk .p-autocomplete-chip{max-width:100%;min-width:0}.w-autocompletefk .p-autocomplete-chip .p-chip-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.w-autocompletefk .p-autocomplete-input-chip{flex:1 1 2rem;min-width:2rem}.w-autocompletefk .w-autocompletefk-chip{cursor:pointer}.w-autocompletefk .p-autocomplete-chip-item:has(>.w-autocompletefk-chip-hidden){display:none}.w-autocompletefk .w-autocompletefk-chip-more{font-variant-numeric:tabular-nums}.w-autocompletefk .p-autocomplete-chip-item:has(>.w-autocompletefk-chip-more){min-width:0;flex:0 0 auto}.w-autocompletefk-clear{position:absolute;right:2.25rem;top:0;bottom:0;width:1.75rem;display:flex;align-items:center;justify-content:center;color:var(--p-text-muted-color);cursor:pointer;border:none;background:transparent;transition:color .15s;font-size:.75rem}.w-autocompletefk-clear:hover{color:var(--p-primary-color)}.w-autocompletefk-clear i{font-size:.75rem}.w-autocompletefk-has-clear .p-autocomplete-input,.w-autocompletefk-has-clear .p-autocomplete-input-multiple{padding-right:4.25rem}.w-autocompletefk-trigger{position:absolute;right:0;top:0;bottom:0;width:2.5rem;display:flex;align-items:center;justify-content:center;color:var(--p-text-muted-color);cursor:pointer;border:none;background:transparent;transition:color .15s;font-size:.875rem}.w-autocompletefk-trigger:hover{color:var(--p-primary-color)}.w-autocompletefk-trigger:disabled{opacity:.4;cursor:default}.w-autocompletefk-trigger i{font-size:.875rem}.w-autocompletefk-toolbar{display:flex;align-items:center;gap:.75rem;margin-bottom:.75rem}.w-autocompletefk-toolbar-search{flex:1}.w-autocompletefk-toolbar-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-autocompletefk-empty{text-align:center;padding:1.5rem;color:var(--p-text-muted-color);font-size:.875rem}.w-autocompletefk-footer{display:flex;justify-content:flex-end;gap:.5rem}.w-page-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1.5rem}.w-page-header-content{min-width:0}.w-page-header-title{font-size:1.25rem;font-weight:600;letter-spacing:-.015em;color:var(--p-text-color);line-height:1.3}.w-page-header-subtitle{margin-top:.125rem;font-size:.8125rem;color:var(--p-text-muted-color)}.w-page-header-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-detail-header{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:1rem}.w-detail-header-left{display:flex;align-items:center;gap:.75rem;min-width:0}.w-detail-header-icon{font-size:1.25rem;color:var(--p-primary-color)}.w-detail-header-content{min-width:0}.w-detail-header-title{font-size:1.125rem;font-weight:600;color:var(--p-text-color);line-height:1.3}.w-detail-header-subtitle{font-size:.75rem;color:var(--p-text-muted-color);margin-top:.125rem}.w-detail-header-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:3rem 1rem;text-align:center}.w-empty-state-icon{display:flex;align-items:center;justify-content:center;width:4rem;height:4rem;border-radius:1rem;margin-bottom:1rem;background:var(--p-content-hover-background);color:var(--p-text-muted-color);font-size:1.5rem}.w-empty-state-title{font-size:.9375rem;font-weight:600;color:var(--p-text-color)}.w-empty-state-description{font-size:.8125rem;color:var(--p-text-muted-color);margin-top:.25rem;max-width:24rem}.w-info-card{padding:1.25rem;border-radius:.75rem;border:1px solid var(--p-content-border-color);background:var(--p-content-background);margin-bottom:1rem}.w-info-card-title{font-size:.9375rem;font-weight:600;color:var(--p-text-color);margin-bottom:.75rem}.w-info-card-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:.75rem 1.5rem}.w-info-card-field{display:flex;flex-direction:column;gap:.125rem}.w-info-card-label{font-size:.6875rem;font-weight:500;color:var(--p-text-muted-color);text-transform:uppercase;letter-spacing:.05em}.w-info-card-value{font-size:.875rem;font-weight:500;color:var(--p-text-color)}.w-section-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.w-section-header--compact{margin-bottom:.75rem}.w-section-header__main{display:flex;align-items:flex-start;gap:.75rem;min-width:0}.w-section-header__icon{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;flex-shrink:0;border-radius:.75rem;background:color-mix(in srgb,var(--p-primary-color) 10%,transparent);color:var(--p-primary-color)}.w-section-header__content{min-width:0}.w-section-header__title-row{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.w-section-header__title{font-size:1rem;font-weight:600;color:var(--p-text-color);line-height:1.3}.w-section-header__subtitle{margin-top:.125rem;font-size:.8125rem;color:var(--p-text-muted-color)}.w-section-header__actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-form-section{border:1px solid var(--p-content-border-color);border-radius:1rem;background:var(--p-content-background);padding:1rem}.w-form-section--muted{background:color-mix(in srgb,var(--p-content-background) 88%,var(--p-primary-color) 2%)}.w-form-section--outlined{background:transparent}.w-form-section__header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.w-form-section__content{min-width:0}.w-form-section__title{font-size:.9375rem;font-weight:600;color:var(--p-text-color)}.w-form-section__description{margin-top:.125rem;font-size:.8125rem;color:var(--p-text-muted-color)}.w-form-section__actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-form-section__body{display:flex;flex-direction:column;gap:1rem}.w-action-bar{display:flex;align-items:center;gap:.75rem}.w-action-bar--between{justify-content:space-between}.w-action-bar--start{justify-content:flex-start}.w-action-bar--end{justify-content:flex-end}.w-action-bar__primary,.w-action-bar__secondary,.w-action-bar__filters{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.w-action-bar__primary{min-width:0}.w-action-bar__secondary{justify-content:flex-end}.w-kpi-grid{display:grid;gap:.75rem}.w-kpi-grid--cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.w-kpi-grid--cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.w-kpi-grid--cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.w-kpi-grid--cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.w-kpi-grid--cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.w-kpi-grid--auto{grid-template-columns:repeat(auto-fit,minmax(min(100%,170px),1fr))}.w-kpi-grid--dense{gap:.5rem}.w-kpi-card{display:flex;flex-direction:column;gap:.875rem;min-height:100%;padding:1rem 1.125rem;border:1px solid var(--p-content-border-color);border-radius:1rem;background:var(--p-content-background)}.w-kpi-card__header{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem}.w-kpi-card__icon{display:flex;align-items:center;justify-content:center;width:2.75rem;height:2.75rem;border-radius:.875rem;background:color-mix(in srgb,var(--p-primary-color) 10%,transparent);color:var(--p-primary-color);font-size:1.125rem}.w-kpi-card__content{display:flex;flex-direction:column;gap:.25rem}.w-kpi-card__label{font-size:.75rem;text-transform:uppercase;letter-spacing:.04em;color:var(--p-text-muted-color);font-weight:600}.w-kpi-card__value{font-size:1.5rem;font-weight:700;line-height:1.1;letter-spacing:-.02em;color:var(--p-text-color)}.w-kpi-card__hint{font-size:.8125rem;color:var(--p-text-muted-color)}.w-kpi-card__footer{margin-top:auto}.w-kpi-card__trend{display:flex;justify-content:flex-end}.w-kpi-card__trend-badge{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .5rem;border-radius:999px;font-size:.75rem;font-weight:600;background:var(--p-content-hover-background);color:var(--p-text-muted-color)}.w-kpi-card__trend-badge--up{background:color-mix(in srgb,var(--p-green-500, #22c55e) 10%,transparent);color:var(--p-green-500, #22c55e)}.w-kpi-card__trend-badge--down{background:color-mix(in srgb,var(--p-red-500, #ef4444) 10%,transparent);color:var(--p-red-500, #ef4444)}.w-kpi-card__loading{display:flex;align-items:center;gap:.875rem}.w-kpi-card__loading-content{display:flex;flex:1;flex-direction:column;gap:.5rem}.w-kpi-card--success .w-kpi-card__icon{background:color-mix(in srgb,var(--p-green-500, #22c55e) 10%,transparent);color:var(--p-green-500, #22c55e)}.w-kpi-card--warning .w-kpi-card__icon{background:color-mix(in srgb,var(--p-yellow-500, #eab308) 10%,transparent);color:var(--p-yellow-500, #eab308)}.w-kpi-card--danger .w-kpi-card__icon{background:color-mix(in srgb,var(--p-red-500, #ef4444) 10%,transparent);color:var(--p-red-500, #ef4444)}.w-kpi-card--info .w-kpi-card__icon{background:color-mix(in srgb,var(--p-blue-500, #3b82f6) 10%,transparent);color:var(--p-blue-500, #3b82f6)}.w-kpi-card--neutral .w-kpi-card__icon{background:var(--p-content-hover-background);color:var(--p-text-muted-color)}.w-progress-flow{display:flex;gap:.75rem}.w-progress-flow--horizontal{align-items:stretch;flex-wrap:wrap}.w-progress-flow--vertical{flex-direction:column}.w-progress-flow__step{display:flex;align-items:flex-start;gap:.75rem;min-width:0}.w-progress-flow--horizontal .w-progress-flow__step{flex:1 1 0;min-width:12rem;padding:.875rem 1rem;border:1px solid var(--p-content-border-color);border-radius:1rem;background:var(--p-content-background)}.w-progress-flow__marker{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;flex-shrink:0;border-radius:999px;border:1px solid var(--p-content-border-color);color:var(--p-text-muted-color);background:transparent;font-size:.8125rem;font-weight:700}.w-progress-flow__content{min-width:0}.w-progress-flow__label{font-size:.875rem;font-weight:600;color:var(--p-text-color)}.w-progress-flow__description{margin-top:.125rem;font-size:.75rem;color:var(--p-text-muted-color)}.w-progress-flow__step--current .w-progress-flow__marker{border-color:var(--p-primary-color);background:color-mix(in srgb,var(--p-primary-color) 12%,transparent);color:var(--p-primary-color)}.w-progress-flow__step--done .w-progress-flow__marker{border-color:var(--p-green-500, #22c55e);background:color-mix(in srgb,var(--p-green-500, #22c55e) 12%,transparent);color:var(--p-green-500, #22c55e)}.w-crud-view-toggle{display:inline-flex;align-items:center;gap:.125rem}.w-crud-toolbar--standalone{border:1px solid var(--p-content-border-color);background:var(--p-content-background);border-radius:.75rem;padding:.625rem .75rem;margin-bottom:.75rem}.w-crud-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:1rem;align-items:start}.w-crud-cards--bare{grid-template-columns:repeat(auto-fill,minmax(360px,1fr))}.w-crud-card-bare{min-width:0}.w-crud-card{display:flex;flex-direction:column;gap:.625rem;padding:1.25rem;border:1px solid var(--p-content-border-color);border-radius:.75rem;background:var(--p-content-background);cursor:default;transition:border-color .15s,box-shadow .15s}.w-crud-card:hover{border-color:color-mix(in srgb,var(--p-primary-color) 40%,var(--p-content-border-color))}.w-crud-card-body{display:flex;flex-direction:column;gap:.375rem;min-width:0}.w-crud-card-row{display:flex;align-items:baseline;justify-content:space-between;gap:.75rem;font-size:.8125rem;min-width:0}.w-crud-card-row--title{font-size:.9375rem;font-weight:600;color:var(--p-text-color);margin-bottom:.125rem}.w-crud-card-label{font-size:.6875rem;font-weight:500;text-transform:uppercase;letter-spacing:.04em;color:var(--p-text-muted-color);flex-shrink:0}.w-crud-card-value{min-width:0;text-align:right;color:var(--p-text-color)}.w-crud-card-row--title .w-crud-card-value{text-align:left}.w-crud-card-actions{display:flex;align-items:center;justify-content:flex-end;gap:.125rem;margin-top:.25rem;padding-top:.5rem;border-top:1px solid var(--p-content-border-color)}.w-crud-cards-loading{display:flex;align-items:center;justify-content:center;padding:3rem 1rem;color:var(--p-text-muted-color);font-size:1.5rem}.w-crud-cards-wrap .w-crud-paginator{margin-top:.75rem}.w-crud-card--selected{border-color:var(--p-primary-color);box-shadow:0 0 0 1px var(--p-primary-color)}.w-crud-content--rail{display:flex;align-items:flex-start;gap:.75rem}.w-crud-content-main{min-width:0}.w-crud-content--rail .w-crud-content-main{flex:1}.w-crud-rail{position:sticky;top:1rem;display:flex;flex-direction:column;align-items:center;gap:.375rem;flex-shrink:0;width:52px;padding:.5rem 0;border:1px solid var(--p-content-border-color);border-radius:15px;background:var(--p-content-background);box-shadow:var(--p-overlay-popover-shadow, 0 6px 20px rgba(15, 23, 42, .09))}.w-crud-rail-sep{width:60%;height:1px;background:var(--p-content-border-color);margin:.125rem 0}.w-crud-ctx-danger .p-contextmenu-item-link,.w-crud-ctx-danger .p-contextmenu-item-link .p-contextmenu-item-icon{color:var(--p-red-500, #ef4444)}.w-money-input__field{text-align:right}.w-transfer{display:grid;grid-template-columns:1fr auto 1fr;gap:.75rem;align-items:stretch}.w-transfer--disabled{opacity:.6;pointer-events:none}.w-transfer__pane{display:flex;flex-direction:column;gap:.5rem;border:1px solid var(--p-content-border-color);border-radius:.75rem;background:var(--p-content-background);padding:.625rem;min-width:0}.w-transfer__head{display:flex;align-items:center;justify-content:space-between;gap:.5rem}.w-transfer__title{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--p-text-muted-color)}.w-transfer__count{font-size:.6875rem;font-weight:600;color:var(--p-text-muted-color);background:var(--p-content-hover-background);border-radius:999px;padding:.0625rem .5rem}.w-transfer__list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.125rem;max-height:14rem;overflow-y:auto}.w-transfer__item{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.375rem .5rem;border-radius:.5rem;font-size:.8125rem;color:var(--p-text-color);cursor:pointer;transition:background-color .12s}.w-transfer__item:hover{background:var(--p-content-hover-background)}.w-transfer__item i{color:var(--p-text-muted-color);font-size:.75rem}.w-transfer__empty{padding:.75rem .5rem;text-align:center;font-size:.75rem;color:var(--p-text-muted-color)}.w-transfer__controls{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.375rem}@media(max-width:768px){.w-section-header,.w-form-section__header,.w-action-bar--stack{flex-direction:column;align-items:stretch}.w-action-bar__primary,.w-action-bar__secondary,.w-action-bar__filters{justify-content:flex-start}.w-kpi-grid--cols-2,.w-kpi-grid--cols-3,.w-kpi-grid--cols-4,.w-transfer{grid-template-columns:1fr}.w-transfer__controls{flex-direction:row}}.w-datepicker,.w-datepicker .p-iconfield{width:100%}.w-datepicker-icon{cursor:pointer;color:var(--p-text-muted-color);transition:color .15s}.w-datepicker-icon:hover{color:var(--p-primary-color)}.w-datepicker-icon-disabled{opacity:.4;cursor:default;pointer-events:none}.w-datepicker-panel{display:flex;flex-direction:column;gap:.5rem}.w-datepicker-actions{display:flex;justify-content:space-between;gap:.5rem;border-top:1px solid var(--p-content-border-color);padding-top:.5rem}
1
+ .w-imgcropper-preview[data-v-95684d2d]{position:relative;overflow:hidden;border-radius:8px;border:1px solid var(--p-content-border-color, #e2e8f0);background:var(--p-content-background, #f8fafc)}.w-imgcropper-preview.is-circular[data-v-95684d2d]{border-radius:50%}.w-imgcropper-img[data-v-95684d2d]{width:100%;height:100%;object-fit:cover;display:block}.w-imgcropper-actions[data-v-95684d2d]{position:absolute;inset:auto 0 0 0;display:flex;justify-content:center;gap:4px;padding:4px;background:color-mix(in srgb,#000 45%,transparent);opacity:0;transition:opacity .15s ease}.w-imgcropper-preview:hover .w-imgcropper-actions[data-v-95684d2d],.w-imgcropper-preview:focus-within .w-imgcropper-actions[data-v-95684d2d]{opacity:1}.w-imgcropper-empty[data-v-95684d2d]{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;cursor:pointer;border:none;background:transparent;color:var(--p-text-muted-color, #64748b);font-size:.85rem}.w-imgcropper-empty i[data-v-95684d2d]{font-size:1.5rem}.w-imgcropper-file[data-v-95684d2d]{display:none}.w-imgcropper-stage[data-v-95684d2d]{display:flex;flex-direction:column;gap:16px;align-items:center}.w-imgcropper-viewport[data-v-95684d2d]{position:relative;overflow:hidden;touch-action:none;cursor:grab;background:#1e1e1e;border-radius:4px}.w-imgcropper-viewport[data-v-95684d2d]:active{cursor:grabbing}.w-imgcropper-viewport.is-circular[data-v-95684d2d]{border-radius:50%}.w-imgcropper-cropimg[data-v-95684d2d]{position:absolute;top:0;left:0;max-width:none;-webkit-user-select:none;user-select:none;-webkit-user-drag:none}.w-imgcropper-stencil[data-v-95684d2d]{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;box-shadow:0 0 0 1px color-mix(in srgb,#fff 60%,transparent) inset}.w-imgcropper-stencil.is-circular[data-v-95684d2d]{border-radius:50%}.w-imgcropper-zoom[data-v-95684d2d]{display:flex;align-items:center;gap:10px;width:100%;color:var(--p-text-muted-color, #64748b)}.w-imgcropper-slider[data-v-95684d2d]{flex:1}.leaflet-pane,.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile-container,.leaflet-pane>svg,.leaflet-pane>canvas,.leaflet-zoom-box,.leaflet-image-layer,.leaflet-layer{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-tile::selection{background:transparent}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-overlay-pane svg{max-width:none!important;max-height:none!important}.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer,.leaflet-container .leaflet-tile{max-width:none!important;max-height:none!important;width:auto;padding:0}.leaflet-container img.leaflet-tile{mix-blend-mode:plus-lighter}.leaflet-container.leaflet-touch-zoom{-ms-touch-action:pan-x pan-y;touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{-ms-touch-action:pinch-zoom;touch-action:none;touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{-ms-touch-action:none;touch-action:none}.leaflet-container{-webkit-tap-highlight-color:transparent}.leaflet-container a{-webkit-tap-highlight-color:rgba(51,181,229,.4)}.leaflet-tile{filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;-moz-box-sizing:border-box;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-top,.leaflet-bottom{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-popup{opacity:0;-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}svg.leaflet-zoom-animated{will-change:transform}.leaflet-zoom-anim .leaflet-zoom-animated{-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1);-moz-transition:-moz-transform .25s cubic-bezier(0,0,.25,1);transition:transform .25s cubic-bezier(0,0,.25,1)}.leaflet-zoom-anim .leaflet-tile,.leaflet-pan-anim .leaflet-tile{-webkit-transition:none;-moz-transition:none;transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-popup-pane,.leaflet-control{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-image-layer,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-marker-icon.leaflet-interactive,.leaflet-image-layer.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive,svg.leaflet-image-layer.leaflet-interactive path{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline-offset:1px}.leaflet-container a{color:#0078a8}.leaflet-zoom-box{border:2px dotted #38f;background:#ffffff80}.leaflet-container{font-family:Helvetica Neue,Arial,Helvetica,sans-serif;font-size:12px;font-size:.75rem;line-height:1.5}.leaflet-bar{box-shadow:0 1px 5px #000000a6;border-radius:4px}.leaflet-bar a{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:hover,.leaflet-bar a:focus{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-touch .leaflet-bar a:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.leaflet-touch .leaflet-bar a:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:700 18px Lucida Console,Monaco,monospace;text-indent:1px}.leaflet-touch .leaflet-control-zoom-in,.leaflet-touch .leaflet-control-zoom-out{font-size:22px}.leaflet-control-layers{box-shadow:0 1px 5px #0006;background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAQAAAADQ4RFAAACf0lEQVR4AY1UM3gkARTePdvdoTxXKc+qTl3aU5U6b2Kbkz3Gtq3Zw6ziLGNPzrYx7946Tr6/ee/XeCQ4D3ykPtL5tHno4n0d/h3+xfuWHGLX81cn7r0iTNzjr7LrlxCqPtkbTQEHeqOrTy4Yyt3VCi/IOB0v7rVC7q45Q3Gr5K6jt+3Gl5nCoDD4MtO+j96Wu8atmhGqcNGHObuf8OM/x3AMx38+4Z2sPqzCxRFK2aF2e5Jol56XTLyggAMTL56XOMoS1W4pOyjUcGGQdZxU6qRh7B9Zp+PfpOFlqt0zyDZckPi1ttmIp03jX8gyJ8a/PG2yutpS/Vol7peZIbZcKBAEEheEIAgFbDkz5H6Zrkm2hVWGiXKiF4Ycw0RWKdtC16Q7qe3X4iOMxruonzegJzWaXFrU9utOSsLUmrc0YjeWYjCW4PDMADElpJSSQ0vQvA1Tm6/JlKnqFs1EGyZiFCqnRZTEJJJiKRYzVYzJck2Rm6P4iH+cmSY0YzimYa8l0EtTODFWhcMIMVqdsI2uiTvKmTisIDHJ3od5GILVhBCarCfVRmo4uTjkhrhzkiBV7SsaqS+TzrzM1qpGGUFt28pIySQHR6h7F6KSwGWm97ay+Z+ZqMcEjEWebE7wxCSQwpkhJqoZA5ivCdZDjJepuJ9IQjGGUmuXJdBFUygxVqVsxFsLMbDe8ZbDYVCGKxs+W080max1hFCarCfV+C1KATwcnvE9gRRuMP2prdbWGowm1KB1y+zwMMENkM755cJ2yPDtqhTI6ED1M/82yIDtC/4j4BijjeObflpO9I9MwXTCsSX8jWAFeHr05WoLTJ5G8IQVS/7vwR6ohirYM7f6HzYpogfS3R2OAAAAAElFTkSuQmCC);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAQAAABvcdNgAAAEsklEQVR4AWL4TydIhpZK1kpWOlg0w3ZXP6D2soBtG42jeI6ZmQTHzAxiTbSJsYLjO9HhP+WOmcuhciVnmHVQcJnp7DFvScowZorad/+V/fVzMdMT2g9Cv9guXGv/7pYOrXh2U+RRR3dSd9JRx6bIFc/ekqHI29JC6pJ5ZEh1yWkhkbcFeSjxgx3L2m1cb1C7bceyxA+CNjT/Ifff+/kDk2u/w/33/IeCMOSaWZ4glosqT3DNnNZQ7Cs58/3Ce5HL78iZH/vKVIaYlqzfdLu8Vi7dnvUbEza5Idt36tquZFldl6N5Z/POLof0XLK61mZCmJSWjVF9tEjUluu74IUXvgttuVIHE7YxSkaYhJZam7yiM9Pv82JYfl9nptxZaxMJE4YSPty+vF0+Y2up9d3wwijfjZbabqm/3bZ9ecKHsiGmRflnn1MW4pjHf9oLufyn2z3y1D6n8g8TZhxyzipLNPnAUpsOiuWimg52psrTZYnOWYNDTMuWBWa0tJb4rgq1UvmutpaYEbZlwU3CLJm/ayYjHW5/h7xWLn9Hh1vepDkyf7dE7MtT5LR4e7yYpHrkhOUpEfssBLq2pPhAqoSWKUkk7EDqkmK6RrCEzqDjhNDWNE+XSMvkJRDWlZTmCW0l0PHQGRZY5t1L83kT0Y3l2SItk5JAWHl2dCOBm+fPu3fo5/3v61RMCO9Jx2EEYYhb0rmNQMX/vm7gqOEJLcXTGw3CAuRNeyaPWwjR8PRqKQ1PDA/dpv+on9Shox52WFnx0KY8onHayrJzm87i5h9xGw/tfkev0jGsQizqezUKjk12hBMKJ4kbCqGPVNXudyyrShovGw5CgxsRICxF6aRmSjlBnHRzg7Gx8fKqEubI2rahQYdR1YgDIRQO7JvQyD52hoIQx0mxa0ODtW2Iozn1le2iIRdzwWewedyZzewidueOGqlsn1MvcnQpuVwLGG3/IR1hIKxCjelIDZ8ldqWz25jWAsnldEnK0Zxro19TGVb2ffIZEsIO89EIEDvKMPrzmBOQcKQ+rroye6NgRRxqR4U8EAkz0CL6uSGOm6KQCdWjvjRiSP1BPalCRS5iQYiEIvxuBMJEWgzSoHADcVMuN7IuqqTeyUPq22qFimFtxDyBBJEwNyt6TM88blFHao/6tWWhuuOM4SAK4EI4QmFHA+SEyWlp4EQoJ13cYGzMu7yszEIBOm2rVmHUNqwAIQabISNMRstmdhNWcFLsSm+0tjJH1MdRxO5Nx0WDMhCtgD6OKgZeljJqJKc9po8juskR9XN0Y1lZ3mWjLR9JCO1jRDMd0fpYC2VnvjBSEFg7wBENc0R9HFlb0xvF1+TBEpF68d+DHR6IOWVv2BECtxo46hOFUBd/APU57WIoEwJhIi2CdpyZX0m93BZicktMj1AS9dClteUFAUNUIEygRZCtik5zSxI9MubTBH1GOiHsiLJ3OCoSZkILa9PxiN0EbvhsAo8tdAf9Seepd36lGWHmtNANTv5Jd0z4QYyeo/UEJqxKRpg5LZx6btLPsOaEmdMyxYdlc8LMaJnikDlhclqmPiQnTEpLUIZEwkRagjYkEibQErwhkTAKCLQEbUgkzJQWc/0PstHHcfEdQ+UAAAAASUVORK5CYII=);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;overflow-x:hidden;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block;font-size:13px;font-size:1.08333em}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq/bXZtrp/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq/RBpykd8oZUb/kaJutow8r1aP9II0WmLKLIsJyv1w/kqw9Ch2MYdB++12Onxee/QMwvf4/Dk/Lfp/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7/XZKNH+9+hBLOHYozuKQPxyMPUKkrX/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue/uDivd3fkWRbS6/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk/4kggu40ZTvIEm5g24qtU4KjBrx/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+/FrIjweHQS4/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=)}.leaflet-container .leaflet-control-attribution{background:#fff;background:#fffc;margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333;line-height:1.4}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:hover,.leaflet-control-attribution a:focus{text-decoration:underline}.leaflet-attribution-flag{display:inline!important;vertical-align:baseline!important;width:1em;height:.6669em}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;white-space:nowrap;-moz-box-sizing:border-box;box-sizing:border-box;background:#fffc;text-shadow:1px 1px #fff}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{box-shadow:none}.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{border:2px solid rgba(0,0,0,.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 24px 13px 20px;line-height:1.3;font-size:13px;font-size:1.08333em;min-height:1px}.leaflet-popup-content p{margin:1.3em 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-top:-1px;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;pointer-events:auto;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px #0006}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;border:none;text-align:center;width:24px;height:24px;font:16px/24px Tahoma,Verdana,sans-serif;color:#757575;text-decoration:none;background:transparent}.leaflet-container a.leaflet-popup-close-button:hover,.leaflet-container a.leaflet-popup-close-button:focus{color:#585858}.leaflet-popup-scrolled{overflow:auto}.leaflet-oldie .leaflet-popup-content-wrapper{-ms-zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto;-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";filter:progid:DXImageTransform.Microsoft.Matrix(M11=.70710678,M12=.70710678,M21=-.70710678,M22=.70710678)}.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px #0006}.leaflet-tooltip.leaflet-interactive{cursor:pointer;pointer-events:auto}.leaflet-tooltip-top:before,.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{position:absolute;pointer-events:none;border:6px solid transparent;background:transparent;content:""}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff}@media print{.leaflet-control{-webkit-print-color-adjust:exact;print-color-adjust:exact}}.w-crud-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1.5rem}.w-crud-header-content{min-width:0}.w-crud-title{font-size:1.25rem;font-weight:600;letter-spacing:-.015em;color:var(--p-text-color);line-height:1.3}.w-crud-subtitle{margin-top:.125rem;font-size:.8125rem;color:var(--p-text-muted-color)}.w-crud-header-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-crud-kpis{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:.75rem;margin-bottom:1.25rem}.w-crud-kpi{display:flex;align-items:center;gap:.75rem;padding:1rem 1.25rem;border-radius:.75rem;border:1px solid var(--p-content-border-color);background:var(--p-content-background)}.w-crud-kpi-icon{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;border-radius:.75rem;background:color-mix(in srgb,var(--p-primary-color) 10%,transparent);color:var(--p-primary-color);flex-shrink:0;font-size:1.125rem}.w-crud-kpi-icon--primary{background:color-mix(in srgb,var(--p-primary-color) 10%,transparent);color:var(--p-primary-color)}.w-crud-kpi-icon--success{background:color-mix(in srgb,var(--p-green-500, #22c55e) 10%,transparent);color:var(--p-green-500, #22c55e)}.w-crud-kpi-icon--warning{background:color-mix(in srgb,var(--p-yellow-500, #eab308) 10%,transparent);color:var(--p-yellow-500, #eab308)}.w-crud-kpi-icon--danger{background:color-mix(in srgb,var(--p-red-500, #ef4444) 10%,transparent);color:var(--p-red-500, #ef4444)}.w-crud-kpi-icon--info{background:color-mix(in srgb,var(--p-blue-500, #3b82f6) 10%,transparent);color:var(--p-blue-500, #3b82f6)}.w-crud-kpi-content{min-width:0}.w-crud-kpi-label{font-size:.6875rem;font-weight:500;color:var(--p-text-muted-color);text-transform:uppercase;letter-spacing:.05em;line-height:1;margin-bottom:.25rem}.w-crud-kpi-value{font-size:1.25rem;font-weight:700;color:var(--p-text-color);letter-spacing:-.02em;line-height:1}.w-crud-table{border-radius:.75rem;border:1px solid var(--p-content-border-color);background:var(--p-content-background);overflow:hidden}.w-crud-table .p-datatable{font-size:.8125rem}.w-crud-table .p-datatable-header{background:transparent;border-bottom:1px solid var(--p-content-border-color);padding:.75rem 1rem}.w-crud-table .p-datatable-thead>tr>th{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--p-text-muted-color);background:var(--p-content-background)}.w-crud-table .p-datatable-tbody>tr>td{padding-top:.625rem;padding-bottom:.625rem}.w-crud-table .p-datatable-paginator-bottom{border-top:1px solid var(--p-content-border-color)}.w-crud-paginator .p-paginator-content{justify-content:flex-end}.w-crud-paginator .p-paginator-current{font-size:.75rem;color:var(--p-text-muted-color);margin-right:auto!important}.w-crud-toolbar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.75rem;padding:.25rem 0}.w-crud-toolbar-start{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem;min-width:0;flex:1 1 auto}.w-crud-toolbar-end{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem}.w-crud-actions-header .p-datatable-column-header-content{justify-content:center}.w-crud-actions{display:flex;align-items:center;justify-content:center;gap:.125rem}.w-crud-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:4rem 1rem}.w-crud-empty-icon{display:flex;align-items:center;justify-content:center;width:4rem;height:4rem;border-radius:1rem;margin-bottom:1rem;background:var(--p-content-hover-background);color:var(--p-text-muted-color);font-size:1.5rem}.w-crud-empty-title{font-size:.875rem;font-weight:600;color:var(--p-text-color)}.w-crud-empty-text{font-size:.75rem;color:var(--p-text-muted-color);margin-top:.25rem}.p-datatable-header-cell.text-right .p-datatable-column-header-content{justify-content:flex-end}.p-datatable-header-cell.text-center .p-datatable-column-header-content{justify-content:center}.p-dialog.w-crud-form-dialog>.p-dialog-header{padding-bottom:.5rem}.p-dialog.w-crud-form-dialog>.p-dialog-content{padding-bottom:.75rem}.w-crud-form{display:flex;flex-direction:column;gap:1.5rem}.w-crud-form-group-header{margin-bottom:.75rem;padding-bottom:.5rem;border-bottom:1px solid var(--p-surface-200)}.dark .w-crud-form-group-header{border-bottom-color:var(--p-surface-700)}.w-crud-form-group-title{font-size:.875rem;font-weight:600;color:var(--p-text-color);margin:0}.w-crud-form-group-desc{font-size:.75rem;color:var(--p-text-muted-color);margin:.25rem 0 0}.w-crud-form-cep-error{display:block;font-size:.75rem;color:var(--p-red-500);margin-top:.25rem}.w-crud-form-cep-spinner{margin-left:.375rem;font-size:.75rem;color:var(--p-text-muted-color)}.w-crud-form-fields{display:grid;grid-template-columns:repeat(var(--w-form-cols, 2),1fr);gap:1rem 1rem}.w-crud-form-col-full{grid-column:span var(--w-col-span, 2)}.w-crud-form-col-half{grid-column:span var(--w-col-span, 1)}@media(max-width:640px){.w-crud-form-fields{grid-template-columns:1fr}.w-crud-form-col-full,.w-crud-form-col-half,.w-crud-form-switch{grid-column:1 / -1}}.w-crud-form-field{display:flex;flex-direction:column}.w-crud-form-required{color:var(--p-red-400, #f87171);margin-left:.125rem}.w-crud-form-label{display:block;font-weight:500;margin-bottom:.375rem;color:var(--p-text-color);font-size:.75rem}.w-crud-form-color-row{display:flex;align-items:center;gap:.5rem}.w-crud-form-switch{grid-column:span var(--w-col-span, 2);display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;border-radius:.5rem;background:var(--p-content-hover-background)}.w-crud-form-switch-label{font-size:.875rem;font-weight:500;color:var(--p-text-color);-webkit-user-select:none;user-select:none}.w-crud-form-error{display:block;font-size:.75rem;color:var(--p-red-400, #f87171);margin-top:.25rem}.w-crud-form-footer{display:flex;justify-content:space-between;gap:.5rem;padding-top:1rem;padding-bottom:.5rem;border-top:1px solid var(--p-content-border-color);margin-top:.25rem}.w-autocompletefk{position:relative;display:flex;align-items:stretch;width:100%}.w-autocompletefk .p-autocomplete{flex:1;min-width:0}.w-autocompletefk .p-autocomplete-input{padding-right:2.5rem}.w-autocompletefk .p-autocomplete-input-multiple{padding-right:2.5rem;min-width:0;max-height:7rem;overflow-y:auto}.w-autocompletefk .p-autocomplete-chip-item{max-width:var(--w-fk-chip-max, 100%);min-width:min(100%,6rem)}.w-autocompletefk .p-autocomplete-chip{max-width:100%;min-width:0}.w-fk-option{display:flex;flex-direction:column;gap:.125rem;min-width:0}.w-fk-option__label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.w-fk-option__desc{font-size:var(--text-xs, .75rem);color:var(--fg-muted, #64748b);font-variant-numeric:tabular-nums}.w-autocompletefk .p-autocomplete-chip .p-chip-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.w-autocompletefk .p-autocomplete-input-chip{flex:1 1 2rem;min-width:2rem}.w-autocompletefk .w-autocompletefk-chip{cursor:pointer}.w-autocompletefk .p-autocomplete-chip-item:has(>.w-autocompletefk-chip-hidden){display:none}.w-autocompletefk .w-autocompletefk-chip-more{font-variant-numeric:tabular-nums}.w-autocompletefk .p-autocomplete-chip-item:has(>.w-autocompletefk-chip-more){min-width:0;flex:0 0 auto}.w-autocompletefk-clear{position:absolute;right:2.25rem;top:0;bottom:0;width:1.75rem;display:flex;align-items:center;justify-content:center;color:var(--p-text-muted-color);cursor:pointer;border:none;background:transparent;transition:color .15s;font-size:.75rem}.w-autocompletefk-clear:hover{color:var(--p-primary-color)}.w-autocompletefk-clear i{font-size:.75rem}.w-autocompletefk-has-clear .p-autocomplete-input,.w-autocompletefk-has-clear .p-autocomplete-input-multiple{padding-right:4.25rem}.w-autocompletefk-trigger{position:absolute;right:0;top:0;bottom:0;width:2.5rem;display:flex;align-items:center;justify-content:center;color:var(--p-text-muted-color);cursor:pointer;border:none;background:transparent;transition:color .15s;font-size:.875rem}.w-autocompletefk-trigger:hover{color:var(--p-primary-color)}.w-autocompletefk-trigger:disabled{opacity:.4;cursor:default}.w-autocompletefk-trigger i{font-size:.875rem}.w-autocompletefk-toolbar{display:flex;align-items:center;gap:.75rem;margin-bottom:.75rem}.w-autocompletefk-toolbar-search{flex:1}.w-autocompletefk-toolbar-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-autocompletefk-empty{text-align:center;padding:1.5rem;color:var(--p-text-muted-color);font-size:.875rem}.w-autocompletefk-footer{display:flex;justify-content:flex-end;gap:.5rem}.w-page-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1.5rem}.w-page-header-content{min-width:0}.w-page-header-title{font-size:1.25rem;font-weight:600;letter-spacing:-.015em;color:var(--p-text-color);line-height:1.3}.w-page-header-subtitle{margin-top:.125rem;font-size:.8125rem;color:var(--p-text-muted-color)}.w-page-header-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-detail-header{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:1rem}.w-detail-header-left{display:flex;align-items:center;gap:.75rem;min-width:0}.w-detail-header-icon{font-size:1.25rem;color:var(--p-primary-color)}.w-detail-header-content{min-width:0}.w-detail-header-title{font-size:1.125rem;font-weight:600;color:var(--p-text-color);line-height:1.3}.w-detail-header-subtitle{font-size:.75rem;color:var(--p-text-muted-color);margin-top:.125rem}.w-detail-header-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:3rem 1rem;text-align:center}.w-empty-state-icon{display:flex;align-items:center;justify-content:center;width:4rem;height:4rem;border-radius:1rem;margin-bottom:1rem;background:var(--p-content-hover-background);color:var(--p-text-muted-color);font-size:1.5rem}.w-empty-state-title{font-size:.9375rem;font-weight:600;color:var(--p-text-color)}.w-empty-state-description{font-size:.8125rem;color:var(--p-text-muted-color);margin-top:.25rem;max-width:24rem}.w-info-card{padding:1.25rem;border-radius:.75rem;border:1px solid var(--p-content-border-color);background:var(--p-content-background);margin-bottom:1rem}.w-info-card-title{font-size:.9375rem;font-weight:600;color:var(--p-text-color);margin-bottom:.75rem}.w-info-card-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:.75rem 1.5rem}.w-info-card-field{display:flex;flex-direction:column;gap:.125rem}.w-info-card-label{font-size:.6875rem;font-weight:500;color:var(--p-text-muted-color);text-transform:uppercase;letter-spacing:.05em}.w-info-card-value{font-size:.875rem;font-weight:500;color:var(--p-text-color)}.w-section-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.w-section-header--compact{margin-bottom:.75rem}.w-section-header__main{display:flex;align-items:flex-start;gap:.75rem;min-width:0}.w-section-header__icon{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;flex-shrink:0;border-radius:.75rem;background:color-mix(in srgb,var(--p-primary-color) 10%,transparent);color:var(--p-primary-color)}.w-section-header__content{min-width:0}.w-section-header__title-row{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.w-section-header__title{font-size:1rem;font-weight:600;color:var(--p-text-color);line-height:1.3}.w-section-header__subtitle{margin-top:.125rem;font-size:.8125rem;color:var(--p-text-muted-color)}.w-section-header__actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-form-section{border:1px solid var(--p-content-border-color);border-radius:1rem;background:var(--p-content-background);padding:1rem}.w-form-section--muted{background:color-mix(in srgb,var(--p-content-background) 88%,var(--p-primary-color) 2%)}.w-form-section--outlined{background:transparent}.w-form-section__header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.w-form-section__content{min-width:0}.w-form-section__title{font-size:.9375rem;font-weight:600;color:var(--p-text-color)}.w-form-section__description{margin-top:.125rem;font-size:.8125rem;color:var(--p-text-muted-color)}.w-form-section__actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.w-form-section__body{display:flex;flex-direction:column;gap:1rem}.w-action-bar{display:flex;align-items:center;gap:.75rem}.w-action-bar--between{justify-content:space-between}.w-action-bar--start{justify-content:flex-start}.w-action-bar--end{justify-content:flex-end}.w-action-bar__primary,.w-action-bar__secondary,.w-action-bar__filters{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.w-action-bar__primary{min-width:0}.w-action-bar__secondary{justify-content:flex-end}.w-kpi-grid{display:grid;gap:.75rem}.w-kpi-grid--cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.w-kpi-grid--cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.w-kpi-grid--cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.w-kpi-grid--cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.w-kpi-grid--cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.w-kpi-grid--auto{grid-template-columns:repeat(auto-fit,minmax(min(100%,170px),1fr))}.w-kpi-grid--dense{gap:.5rem}.w-kpi-card{display:flex;flex-direction:column;gap:.875rem;min-height:100%;padding:1rem 1.125rem;border:1px solid var(--p-content-border-color);border-radius:1rem;background:var(--p-content-background)}.w-kpi-card__header{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem}.w-kpi-card__icon{display:flex;align-items:center;justify-content:center;width:2.75rem;height:2.75rem;border-radius:.875rem;background:color-mix(in srgb,var(--p-primary-color) 10%,transparent);color:var(--p-primary-color);font-size:1.125rem}.w-kpi-card__content{display:flex;flex-direction:column;gap:.25rem}.w-kpi-card__label{font-size:.75rem;text-transform:uppercase;letter-spacing:.04em;color:var(--p-text-muted-color);font-weight:600}.w-kpi-card__value{font-size:1.5rem;font-weight:700;line-height:1.1;letter-spacing:-.02em;color:var(--p-text-color)}.w-kpi-card__hint{font-size:.8125rem;color:var(--p-text-muted-color)}.w-kpi-card__footer{margin-top:auto}.w-kpi-card__trend{display:flex;justify-content:flex-end}.w-kpi-card__trend-badge{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .5rem;border-radius:999px;font-size:.75rem;font-weight:600;background:var(--p-content-hover-background);color:var(--p-text-muted-color)}.w-kpi-card__trend-badge--up{background:color-mix(in srgb,var(--p-green-500, #22c55e) 10%,transparent);color:var(--p-green-500, #22c55e)}.w-kpi-card__trend-badge--down{background:color-mix(in srgb,var(--p-red-500, #ef4444) 10%,transparent);color:var(--p-red-500, #ef4444)}.w-kpi-card__loading{display:flex;align-items:center;gap:.875rem}.w-kpi-card__loading-content{display:flex;flex:1;flex-direction:column;gap:.5rem}.w-kpi-card--success .w-kpi-card__icon{background:color-mix(in srgb,var(--p-green-500, #22c55e) 10%,transparent);color:var(--p-green-500, #22c55e)}.w-kpi-card--warning .w-kpi-card__icon{background:color-mix(in srgb,var(--p-yellow-500, #eab308) 10%,transparent);color:var(--p-yellow-500, #eab308)}.w-kpi-card--danger .w-kpi-card__icon{background:color-mix(in srgb,var(--p-red-500, #ef4444) 10%,transparent);color:var(--p-red-500, #ef4444)}.w-kpi-card--info .w-kpi-card__icon{background:color-mix(in srgb,var(--p-blue-500, #3b82f6) 10%,transparent);color:var(--p-blue-500, #3b82f6)}.w-kpi-card--neutral .w-kpi-card__icon{background:var(--p-content-hover-background);color:var(--p-text-muted-color)}.w-progress-flow{display:flex;gap:.75rem}.w-progress-flow--horizontal{align-items:stretch;flex-wrap:wrap}.w-progress-flow--vertical{flex-direction:column}.w-progress-flow__step{display:flex;align-items:flex-start;gap:.75rem;min-width:0}.w-progress-flow--horizontal .w-progress-flow__step{flex:1 1 0;min-width:12rem;padding:.875rem 1rem;border:1px solid var(--p-content-border-color);border-radius:1rem;background:var(--p-content-background)}.w-progress-flow__marker{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;flex-shrink:0;border-radius:999px;border:1px solid var(--p-content-border-color);color:var(--p-text-muted-color);background:transparent;font-size:.8125rem;font-weight:700}.w-progress-flow__content{min-width:0}.w-progress-flow__label{font-size:.875rem;font-weight:600;color:var(--p-text-color)}.w-progress-flow__description{margin-top:.125rem;font-size:.75rem;color:var(--p-text-muted-color)}.w-progress-flow__step--current .w-progress-flow__marker{border-color:var(--p-primary-color);background:color-mix(in srgb,var(--p-primary-color) 12%,transparent);color:var(--p-primary-color)}.w-progress-flow__step--done .w-progress-flow__marker{border-color:var(--p-green-500, #22c55e);background:color-mix(in srgb,var(--p-green-500, #22c55e) 12%,transparent);color:var(--p-green-500, #22c55e)}.w-crud-view-toggle{display:inline-flex;align-items:center;gap:.125rem}.w-crud-toolbar--standalone{border:1px solid var(--p-content-border-color);background:var(--p-content-background);border-radius:.75rem;padding:.625rem .75rem;margin-bottom:.75rem}.w-crud-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:1rem;align-items:start}.w-crud-cards--bare{grid-template-columns:repeat(auto-fill,minmax(360px,1fr))}.w-crud-card-bare{min-width:0}.w-crud-card{display:flex;flex-direction:column;gap:.625rem;padding:1.25rem;border:1px solid var(--p-content-border-color);border-radius:.75rem;background:var(--p-content-background);cursor:default;transition:border-color .15s,box-shadow .15s}.w-crud-card:hover{border-color:color-mix(in srgb,var(--p-primary-color) 40%,var(--p-content-border-color))}.w-crud-card-body{display:flex;flex-direction:column;gap:.375rem;min-width:0}.w-crud-card-row{display:flex;align-items:baseline;justify-content:space-between;gap:.75rem;font-size:.8125rem;min-width:0}.w-crud-card-row--title{font-size:.9375rem;font-weight:600;color:var(--p-text-color);margin-bottom:.125rem}.w-crud-card-label{font-size:.6875rem;font-weight:500;text-transform:uppercase;letter-spacing:.04em;color:var(--p-text-muted-color);flex-shrink:0}.w-crud-card-value{min-width:0;text-align:right;color:var(--p-text-color)}.w-crud-card-row--title .w-crud-card-value{text-align:left}.w-crud-card-actions{display:flex;align-items:center;justify-content:flex-end;gap:.125rem;margin-top:.25rem;padding-top:.5rem;border-top:1px solid var(--p-content-border-color)}.w-crud-cards-loading{display:flex;align-items:center;justify-content:center;padding:3rem 1rem;color:var(--p-text-muted-color);font-size:1.5rem}.w-crud-cards-wrap .w-crud-paginator{margin-top:.75rem}.w-crud-card--selected{border-color:var(--p-primary-color);box-shadow:0 0 0 1px var(--p-primary-color)}.w-crud-content--rail{display:flex;align-items:flex-start;gap:.75rem}.w-crud-content-main{min-width:0}.w-crud-content--rail .w-crud-content-main{flex:1}.w-crud-rail{position:sticky;top:1rem;display:flex;flex-direction:column;align-items:center;gap:.375rem;flex-shrink:0;width:52px;padding:.5rem 0;border:1px solid var(--p-content-border-color);border-radius:15px;background:var(--p-content-background);box-shadow:var(--p-overlay-popover-shadow, 0 6px 20px rgba(15, 23, 42, .09))}.w-crud-rail-sep{width:60%;height:1px;background:var(--p-content-border-color);margin:.125rem 0}.w-crud-ctx-danger .p-contextmenu-item-link,.w-crud-ctx-danger .p-contextmenu-item-link .p-contextmenu-item-icon{color:var(--p-red-500, #ef4444)}.w-money-input__field{text-align:right}.w-transfer{display:grid;grid-template-columns:1fr auto 1fr;gap:.75rem;align-items:stretch}.w-transfer--disabled{opacity:.6;pointer-events:none}.w-transfer__pane{display:flex;flex-direction:column;gap:.5rem;border:1px solid var(--p-content-border-color);border-radius:.75rem;background:var(--p-content-background);padding:.625rem;min-width:0}.w-transfer__head{display:flex;align-items:center;justify-content:space-between;gap:.5rem}.w-transfer__title{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--p-text-muted-color)}.w-transfer__count{font-size:.6875rem;font-weight:600;color:var(--p-text-muted-color);background:var(--p-content-hover-background);border-radius:999px;padding:.0625rem .5rem}.w-transfer__list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.125rem;max-height:14rem;overflow-y:auto}.w-transfer__item{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.375rem .5rem;border-radius:.5rem;font-size:.8125rem;color:var(--p-text-color);cursor:pointer;transition:background-color .12s}.w-transfer__item:hover{background:var(--p-content-hover-background)}.w-transfer__item i{color:var(--p-text-muted-color);font-size:.75rem}.w-transfer__empty{padding:.75rem .5rem;text-align:center;font-size:.75rem;color:var(--p-text-muted-color)}.w-transfer__controls{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.375rem}.w-tree-select{display:flex;flex-direction:column;gap:var(--field-gap, .375rem);border:1px solid var(--border, var(--p-content-border-color));border-radius:var(--radius-lg, .75rem);background:var(--surface, var(--p-content-background));padding:var(--control-px, .625rem);min-width:0}.w-tree-select--disabled{opacity:.6;pointer-events:none}.w-tree-select__head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2, .5rem);min-height:var(--control-h-sm, 2rem)}.w-tree-select__count{font-size:var(--text-2xs, .6875rem);font-weight:var(--fw-medium, 600);text-transform:uppercase;letter-spacing:.04em;color:var(--fg-muted, var(--p-text-muted-color))}.w-tree-select__actions{display:flex;align-items:center;gap:var(--space-1, .25rem);flex-shrink:0}.w-tree-select__actions .p-button{padding:0 var(--space-2, .5rem);height:var(--control-h-sm, 2rem);font-size:var(--text-xs, .75rem);font-weight:var(--fw-medium, 500)}.w-tree-select__filter{width:100%}.w-tree-select__tree{max-height:var(--w-tree-select-max-h, 18rem);overflow-y:auto;padding:0;border:0;background:transparent;font-size:var(--ui-font, .8125rem)}.w-tree-select__tree.p-tree{border:0;background:transparent;padding:0}.w-tree-select__tree .p-tree-node-content{border-radius:var(--radius-sm, .5rem);padding:var(--space-1, .25rem) var(--space-2, .5rem);transition:background-color var(--motion-fast, .12s) var(--ease, ease)}.w-tree-select__tree .p-tree-node-content:hover{background:var(--surface-2, var(--p-content-hover-background))}.w-tree-select__tree .p-tree-node-label{color:var(--fg, var(--p-text-color));min-width:0;overflow-wrap:anywhere}.w-tree-select__tree .p-tree-node[aria-level="1"]>.p-tree-node-content .p-tree-node-label{font-weight:var(--fw-medium, 500)}.w-tree-select__empty{padding:var(--space-3, .75rem) var(--space-2, .5rem);text-align:center;font-size:var(--text-xs, .75rem);color:var(--fg-muted, var(--p-text-muted-color))}@media(max-width:768px){.w-section-header,.w-form-section__header,.w-action-bar--stack{flex-direction:column;align-items:stretch}.w-action-bar__primary,.w-action-bar__secondary,.w-action-bar__filters{justify-content:flex-start}.w-kpi-grid--cols-2,.w-kpi-grid--cols-3,.w-kpi-grid--cols-4,.w-transfer{grid-template-columns:1fr}.w-transfer__controls{flex-direction:row}}.w-info-card-metrics{display:flex;flex-direction:column}.w-info-card-metric{display:flex;align-items:baseline;gap:var(--space-2, .625rem);padding:var(--space-3, .75rem) 0;border-top:1px solid var(--border, var(--p-content-border-color))}.w-info-card-metric:first-child{border-top:0;padding-top:0}.w-info-card-metric:last-child{padding-bottom:0}.w-info-card-metric-label{font-size:var(--text-sm, .8125rem);font-weight:var(--fw-regular, 400);color:var(--fg-muted, var(--p-text-muted-color));min-width:0}.w-info-card-metric-value{margin-left:auto;font-size:var(--text-xl, 1.25rem);font-weight:var(--fw-bold, 700);line-height:1;color:var(--fg, var(--p-text-color));font-variant-numeric:tabular-nums}.w-info-card-metric-suffix{font-size:var(--text-sm, .8125rem);color:var(--fg-muted, var(--p-text-muted-color))}.w-check-list{border:1px solid var(--border, var(--p-content-border-color));border-radius:var(--radius-lg, .75rem);background:var(--surface, var(--p-content-background));overflow:hidden}.w-check-list__header{display:flex;align-items:center;gap:var(--space-2, .5rem);padding:var(--space-3, .8125rem) var(--space-4, 1rem);border-bottom:1px solid var(--border, var(--p-content-border-color))}.w-check-list__title{font-size:var(--text-2xs, .6875rem);font-weight:var(--fw-bold, 700);text-transform:uppercase;letter-spacing:.05em;color:var(--fg-muted, var(--p-text-muted-color))}.w-check-list__count{margin-left:auto;display:inline-flex;align-items:center;height:1.25rem;padding:0 var(--space-2, .5rem);border-radius:var(--radius-full, 999px);background:var(--surface-3, var(--p-content-hover-background));color:var(--fg-muted, var(--p-text-muted-color));font-size:var(--text-2xs, .6875rem);font-weight:var(--fw-bold, 700);font-variant-numeric:tabular-nums}.w-check-list__items{list-style:none;margin:0;padding:var(--space-2, .5rem) 0}.w-check-list__item{display:flex;align-items:flex-start;gap:var(--space-2, .5625rem);padding:var(--space-2, .5rem) var(--space-4, 1rem)}.w-check-list__item i{font-size:var(--text-sm, .8125rem);margin-top:.125rem;flex-shrink:0}.w-check-list__icon--ok{color:var(--success, var(--p-green-500, #22c55e))}.w-check-list__icon--warn{color:var(--warning, var(--p-yellow-500, #eab308))}.w-check-list__icon--bad{color:var(--danger, var(--p-red-500, #ef4444))}.w-check-list__label{min-width:0;font-size:var(--text-sm, .8125rem);line-height:1.4;color:var(--fg, var(--p-text-color))}.w-check-list__empty{padding:var(--space-4, 1rem);font-size:var(--text-xs, .75rem);color:var(--fg-muted, var(--p-text-muted-color))}.w-step-flow,.w-step-flow--vertical{display:flex;flex-direction:column}.w-step-section{display:flex;align-items:stretch;gap:var(--space-4, 1rem);min-width:0}.w-step-section__rail{flex:none;width:1.875rem;display:flex;flex-direction:column;align-items:center;gap:var(--space-2, .5rem)}.w-step-section__badge{display:grid;place-items:center;width:1.875rem;height:1.875rem;flex:none;border-radius:var(--radius-full, 999px);border:1px solid var(--border-strong, var(--p-content-border-color));background:var(--surface, var(--p-content-background));color:var(--fg-subtle, var(--p-text-muted-color));font-size:var(--text-xs, .75rem);font-weight:var(--fw-bold, 700);font-variant-numeric:tabular-nums}.w-step-section__badge--on{border-color:transparent;background:var(--primary, var(--p-primary-color));color:var(--primary-fg, var(--p-primary-contrast-color, #fff))}.w-step-section__line{flex:1;width:2px;border-radius:2px;background:var(--border, var(--p-content-border-color))}.w-step-section__body{flex:1;min-width:0;padding-bottom:var(--space-5, 1.25rem)}.w-step-flow--vertical>.w-step-section:last-child .w-step-section__line{display:none}.w-step-flow--vertical>.w-step-section:last-child .w-step-section__body{padding-bottom:0}.w-step-section__card{border:1px solid var(--border, var(--p-content-border-color));border-radius:var(--radius-lg, .75rem);background:var(--surface, var(--p-content-background));overflow:hidden}.w-step-section__header{display:flex;align-items:center;gap:var(--space-3, .75rem);padding:var(--space-3, .875rem) var(--card-pad, 1.25rem)}.w-step-section__trigger{display:flex;align-items:center;gap:var(--space-2, .625rem);flex:1;min-width:0;padding:0;border:0;background:transparent;font-family:inherit;text-align:left;cursor:pointer}.w-step-section__trigger:disabled{cursor:default;opacity:.6}.w-step-section__chevron{flex:none;font-size:var(--text-xs, .6875rem);color:var(--fg-subtle, var(--p-text-muted-color))}.w-step-section__title{margin:0;font-size:var(--text-lg, 1.0625rem);font-weight:var(--fw-medium, 600);letter-spacing:-.01em;color:var(--fg, var(--p-text-color))}.w-step-section__count{display:inline-flex;align-items:center;height:1.375rem;flex:none;padding:0 var(--space-2, .5625rem);border-radius:var(--radius-full, 999px);background:var(--surface-3, var(--p-content-hover-background));color:var(--fg-muted, var(--p-text-muted-color));font-size:var(--text-2xs, .6875rem);font-weight:var(--fw-bold, 700);font-variant-numeric:tabular-nums}.w-step-section__summary{min-width:0;font-size:var(--text-sm, .8125rem);color:var(--fg-muted, var(--p-text-muted-color));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.w-step-section__actions{display:flex;align-items:center;gap:var(--space-2, .5rem);flex-shrink:0}.w-step-section__content{padding:0 var(--card-pad, 1.25rem) var(--space-3, .875rem);display:flex;flex-direction:column;gap:var(--space-3, .75rem)}.w-step-section__content>.w-editable-table{margin:0 calc(-1 * var(--card-pad, 1.25rem))}.w-step-section__footer{display:flex;justify-content:flex-end;gap:var(--space-2, .5rem);padding:var(--space-3, .875rem) var(--card-pad, 1.25rem);border-top:1px solid var(--border, var(--p-content-border-color))}@media(max-width:640px){.w-step-section{gap:var(--space-2, .5rem)}}.w-step-flow--horizontal{gap:var(--space-2, .5rem)}.w-step-section--horizontal{display:flex;flex-direction:column;align-items:stretch;gap:var(--space-2, .5rem)}.w-step-section--horizontal .w-step-section__head{display:flex;align-items:center;gap:var(--space-2, .5rem);min-width:0}.w-step-section--horizontal .w-step-section__line{display:none}.w-step-section--horizontal .w-step-section__trigger{padding:var(--space-2, .5rem);border-radius:var(--radius-md, .5rem)}.w-step-section--horizontal .w-step-section__trigger:hover:not(:disabled){background:var(--surface-3, var(--p-content-hover-background))}.w-step-section--horizontal .w-step-section__title{flex:0 1 auto;min-width:0;font-size:var(--text-base, .9375rem);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.w-step-section--horizontal .w-step-section__summary{flex:0 20 auto}.w-step-section__badge--done{border-color:transparent;background:var(--surface-3, var(--p-content-hover-background));color:var(--fg-muted, var(--p-text-muted-color))}.w-step-section__badge--done .pi{font-size:var(--text-2xs, .6875rem)}.w-step-section__panel{min-width:0;border:1px solid var(--border, var(--p-content-border-color));border-radius:var(--radius-lg, .75rem);background:var(--surface, var(--p-content-background));overflow:hidden}.w-step-section--horizontal .w-step-section__content{padding-top:var(--space-4, 1rem)}@media(min-width:768px){.w-step-flow--horizontal{flex-direction:row;flex-wrap:wrap;align-items:center;column-gap:var(--space-3, .75rem);row-gap:var(--space-4, 1rem)}.w-step-flow--horizontal>.w-step-section--horizontal{display:contents}.w-step-flow--horizontal>.w-step-section--horizontal>.w-step-section__head{order:1;flex:1 1 0}.w-step-flow--horizontal>.w-step-section--horizontal>.w-step-section__panel{order:2;flex:0 0 100%}.w-step-flow--horizontal .w-step-section__line{display:block;flex:none;width:var(--space-5, 1.25rem);height:2px}.w-step-flow--horizontal>.w-step-section:first-child .w-step-section__line{display:none}.w-step-section__line--done{background:var(--border-strong, var(--p-content-border-color))}}@media(min-width:768px)and (max-width:1279px){.w-step-section--horizontal .w-step-section__summary{display:none}}.w-editable-table{min-width:0}.w-editable-table__toolbar{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-2, .5rem);padding:0 var(--card-pad, 1.25rem) var(--space-3, .875rem)}.w-editable-table__add{display:inline-flex;align-items:center;gap:var(--space-2, .4375rem);height:var(--control-h-sm, 2rem);padding:0 var(--control-px, .75rem);border:1px solid var(--border-strong, var(--p-content-border-color));border-radius:var(--radius, .5rem);background:var(--surface, var(--p-content-background));color:var(--fg, var(--p-text-color));font-family:inherit;font-size:var(--text-sm, .8125rem);font-weight:var(--fw-medium, 500);cursor:pointer;transition:background-color var(--motion-fast, .14s) var(--ease, ease)}.w-editable-table__add:hover:not(:disabled){background:var(--surface-3, var(--p-content-hover-background))}.w-editable-table__add:disabled{opacity:.5;cursor:default}.w-editable-table__add i{font-size:var(--text-xs, .6875rem)}.w-editable-table__table{width:100%;border-collapse:collapse;table-layout:fixed}.w-editable-table__table thead tr{background:var(--surface-2, var(--p-content-hover-background));border-top:1px solid var(--border, var(--p-content-border-color));border-bottom:1px solid var(--border, var(--p-content-border-color))}.w-editable-table__table th{padding:var(--space-2, .5625rem) var(--space-2, .625rem);text-align:left;font-size:var(--text-2xs, .6875rem);font-weight:var(--fw-bold, 700);text-transform:uppercase;letter-spacing:.05em;color:var(--fg-muted, var(--p-text-muted-color));white-space:nowrap}.w-editable-table__table td{padding:var(--cell-py, .625rem) var(--space-2, .625rem);font-size:var(--ui-font, .875rem);color:var(--fg, var(--p-text-color));vertical-align:middle}.w-editable-table__row{border-bottom:1px solid var(--border, var(--p-content-border-color))}.w-editable-table__cell--right{text-align:right}.w-editable-table__cell--center{text-align:center}.w-editable-table__cell--num,.w-editable-table__num{font-variant-numeric:tabular-nums}.w-editable-table__cell--num .p-inputtext,.w-editable-table__cell--right .p-inputtext{text-align:right}.w-editable-table__text{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.w-editable-table__toggle-col{width:2.5rem}.w-editable-table__action-col{width:2.75rem;text-align:right}.w-editable-table__toggle{display:grid;place-items:center;width:1.625rem;height:1.625rem;border:1px solid var(--border, var(--p-content-border-color));border-radius:var(--radius-sm, .375rem);background:var(--surface, var(--p-content-background));color:var(--fg-muted, var(--p-text-muted-color));cursor:pointer;transition:background-color var(--motion-fast, .14s) var(--ease, ease)}.w-editable-table__toggle:hover{background:var(--surface-3, var(--p-content-hover-background));color:var(--fg, var(--p-text-color))}.w-editable-table__toggle i{font-size:var(--text-2xs, .625rem)}.w-editable-table__remove{display:grid;place-items:center;width:1.75rem;height:1.75rem;margin-left:auto;border:1px solid transparent;border-radius:var(--radius-sm, .375rem);background:transparent;color:var(--fg-subtle, var(--p-text-muted-color));cursor:pointer;transition:background-color var(--motion-fast, .14s) var(--ease, ease),color var(--motion-fast, .14s) var(--ease, ease)}.w-editable-table__remove:hover:not(:disabled){background:var(--danger-soft, color-mix(in srgb, var(--p-red-500, #ef4444) 12%, transparent));color:var(--danger, var(--p-red-500, #ef4444))}.w-editable-table__remove:disabled{opacity:.4;cursor:default}.w-editable-table__remove i{font-size:var(--text-xs, .75rem)}.w-editable-table__expansion>td{padding:0 var(--space-3, .875rem) var(--space-4, 1rem);background:var(--surface-2, var(--p-content-hover-background));border-bottom:1px solid var(--border, var(--p-content-border-color))}.w-editable-table__empty{padding:var(--space-6, 1.5rem) var(--space-4, 1rem)!important;text-align:center;font-size:var(--text-sm, .8125rem);color:var(--fg-muted, var(--p-text-muted-color))}.w-editable-table__footer{background:var(--surface-2, var(--p-content-hover-background));border-top:2px solid var(--primary, var(--p-primary-color))}.w-editable-table__footer td{font-weight:var(--fw-bold, 700);font-variant-numeric:tabular-nums}.w-editable-table__footer-label{font-size:var(--text-sm, .8125rem);font-weight:var(--fw-medium, 600);color:var(--fg-muted, var(--p-text-muted-color))}.w-segmented{display:inline-flex;gap:var(--space-1, .25rem);padding:3px;height:var(--control-h, 2.375rem);border-radius:var(--radius, .5rem);background:var(--surface-3, var(--p-content-hover-background))}.w-segmented__option{flex:1 0 auto;padding:0 var(--control-px, .75rem);border:0;border-radius:var(--radius-sm, .375rem);background:transparent;color:var(--fg-muted, var(--p-text-muted-color));font-family:inherit;font-size:var(--text-sm, .8125rem);font-weight:var(--fw-medium, 500);white-space:nowrap;cursor:pointer;transition:color var(--motion-fast, .14s) var(--ease, ease)}.w-segmented__option:hover:not(:disabled){color:var(--fg, var(--p-text-color))}.w-segmented__option--on{background:var(--surface, var(--p-content-background));color:var(--fg, var(--p-text-color));font-weight:var(--fw-medium, 600);box-shadow:var(--shadow-xs, 0 1px 2px rgba(16, 30, 24, .06))}.w-segmented__option:disabled{opacity:.6;cursor:default}.w-choice{display:flex;flex-wrap:wrap;gap:var(--space-1, .3125rem)}.w-choice__option{display:inline-flex;align-items:center;gap:var(--space-2, .375rem);height:var(--control-h, 2.125rem);padding:0 var(--control-px, .75rem);border:1px solid var(--border-strong, var(--p-content-border-color));border-radius:var(--radius, .5rem);background:var(--surface, var(--p-content-background));color:var(--fg-muted, var(--p-text-muted-color));font-family:inherit;font-size:var(--text-sm, .8125rem);font-weight:var(--fw-medium, 500);white-space:nowrap;cursor:pointer;transition:background-color var(--motion-fast, .14s) var(--ease, ease),border-color var(--motion-fast, .14s) var(--ease, ease)}.w-choice__option:hover:not(:disabled):not(.w-choice__option--on){background:var(--surface-3, var(--p-content-hover-background));color:var(--fg, var(--p-text-color))}.w-choice__option--on{border-color:var(--primary, var(--p-primary-color));background:var(--primary-soft, color-mix(in srgb, var(--p-primary-color) 10%, transparent));color:var(--primary, var(--p-primary-color));font-weight:var(--fw-medium, 600)}.w-choice__option:disabled{opacity:.6;cursor:default}.w-choice__option i{font-size:var(--text-xs, .6875rem)}.w-chips{display:flex;align-items:center;gap:var(--space-1, .375rem);flex-wrap:wrap;min-height:var(--control-h, 2.125rem);padding:3px var(--space-1, .375rem);border:1px solid var(--border-strong, var(--p-content-border-color));border-radius:var(--radius, .5rem);background:var(--surface, var(--p-content-background))}.w-chips__chip{display:inline-flex;align-items:center;gap:var(--space-1, .25rem);height:1.5rem;padding:0 3px 0 var(--space-2, .5625rem);border-radius:var(--radius-full, 999px);background:var(--primary-soft, color-mix(in srgb, var(--p-primary-color) 10%, transparent));color:var(--primary, var(--p-primary-color));font-size:var(--text-sm, .8125rem);font-weight:var(--fw-medium, 500);white-space:nowrap}.w-chips__remove{display:grid;place-items:center;width:1.0625rem;height:1.0625rem;border:0;border-radius:var(--radius-full, 999px);background:transparent;color:inherit;opacity:.55;cursor:pointer}.w-chips__remove:hover:not(:disabled){opacity:1}.w-chips__remove:disabled{opacity:.3;cursor:default}.w-chips__remove i{font-size:.5625rem}.w-chips__empty{font-size:var(--text-sm, .8125rem);color:var(--fg-subtle, var(--p-text-muted-color));padding-left:var(--space-1, .25rem)}.w-chips__summary{margin-left:auto;padding-right:var(--space-1, .25rem);font-size:var(--text-sm, .8125rem);color:var(--fg-muted, var(--p-text-muted-color));white-space:nowrap}.w-chips__summary:empty{display:none}.w-map-select{display:flex;flex-direction:column;min-width:0}.w-map-select--disabled{opacity:.7}.w-map-select__body{display:flex;align-items:stretch;min-height:0;min-width:0}.w-map-select__map{flex:1;min-width:0;position:relative;border:1px solid var(--border, var(--p-content-border-color));border-radius:var(--radius-md, .625rem);background:var(--surface-3, var(--p-content-hover-background));overflow:hidden}.w-map-select__canvas{width:100%;height:var(--w-map-h, 460px)}.w-map-select__fallback{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-2, .5rem);padding:var(--space-6, 1.5rem);text-align:center;background:var(--surface-2, var(--p-content-hover-background));color:var(--fg-muted, var(--p-text-muted-color));font-size:var(--text-sm, .8125rem)}.w-map-select__fallback i{font-size:1.25rem;color:var(--fg-subtle, var(--p-text-muted-color))}.w-map-select__badge{position:absolute;right:.75rem;top:.75rem;z-index:500;display:inline-flex;align-items:center;gap:var(--space-2, .5rem);height:1.75rem;padding:0 var(--space-2, .625rem);border-radius:var(--radius-full, 999px);background:#0f1f30b8;color:#fff;font-size:var(--text-2xs, .6875rem);font-weight:var(--fw-bold, 700);text-transform:uppercase;letter-spacing:.05em;pointer-events:none}.w-map-select__badge i{font-size:.6875rem}.w-map-select__panel{width:300px;flex:none;display:flex;flex-direction:column;border-left:1px solid var(--border, var(--p-content-border-color));margin-left:var(--space-4, 1rem);padding-left:var(--space-4, 1rem)}.w-map-select__panel-head{display:flex;flex-direction:column;gap:var(--space-2, .625rem);padding-bottom:var(--space-3, .75rem)}.w-map-select__meta{display:flex;align-items:center;gap:var(--space-2, .625rem)}.w-map-select__count{font-size:var(--text-2xs, .6875rem);font-weight:var(--fw-bold, 700);text-transform:uppercase;letter-spacing:.05em;color:var(--fg-muted, var(--p-text-muted-color));font-variant-numeric:tabular-nums}.w-map-select__clear{margin-left:auto;border:0;padding:0;background:transparent;color:var(--primary, var(--p-primary-color));font-family:inherit;font-size:var(--text-sm, .8125rem);font-weight:var(--fw-medium, 500);cursor:pointer}.w-map-select__clear:disabled{color:var(--fg-subtle, var(--p-text-muted-color));cursor:default}.w-map-select__list{flex:1;min-height:0;max-height:var(--w-map-list-h, 23.75rem);overflow-y:auto;list-style:none;margin:0;padding:0 0 var(--space-3, .75rem)}.w-map-select__item{width:100%;display:flex;align-items:center;gap:var(--space-2, .6875rem);padding:var(--space-2, .5625rem) var(--space-2, .625rem);border:1px solid transparent;border-radius:var(--radius, .5rem);background:transparent;font-family:inherit;text-align:left;cursor:pointer;transition:background-color var(--motion-fast, .14s) var(--ease, ease)}.w-map-select__item:hover:not(:disabled){background:var(--surface-3, var(--p-content-hover-background))}.w-map-select__item:disabled{cursor:default;opacity:.6}.w-map-select__box{display:grid;place-items:center;width:1.125rem;height:1.125rem;flex:none;border:1px solid var(--border-strong, var(--p-content-border-color));border-radius:var(--radius-xs, .25rem);background:var(--surface, var(--p-content-background))}.w-map-select__item--on .w-map-select__box{border-color:transparent;background:var(--primary, var(--p-primary-color));color:var(--primary-fg, var(--p-primary-contrast-color, #fff))}.w-map-select__box i{font-size:.5625rem}.w-map-select__item-text{min-width:0;flex:1}.w-map-select__item-name{display:block;font-size:var(--ui-font, .875rem);font-weight:var(--fw-medium, 600);color:var(--fg, var(--p-text-color))}.w-map-select__item-sub{display:block;font-size:var(--text-xs, .75rem);color:var(--fg-muted, var(--p-text-muted-color));white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.w-map-select__item-nogeo{flex:none;font-size:var(--text-xs, .75rem);color:var(--fg-subtle, var(--p-text-muted-color))}.w-map-select__item-area{font-size:var(--text-sm, .8125rem);color:var(--fg-muted, var(--p-text-muted-color));font-variant-numeric:tabular-nums;white-space:nowrap}.w-map-select__empty{padding:var(--space-4, 1rem) var(--space-2, .625rem);text-align:center;font-size:var(--text-xs, .75rem);color:var(--fg-muted, var(--p-text-muted-color))}.w-map-select__footer{display:flex;align-items:center;gap:var(--space-3, .875rem);margin-top:var(--space-3, .875rem);padding-top:var(--space-3, .875rem);border-top:1px solid var(--border, var(--p-content-border-color))}.w-map-select__area{display:inline-flex;align-items:baseline;gap:var(--space-2, .5rem);font-size:var(--text-sm, .8125rem);color:var(--fg-muted, var(--p-text-muted-color))}.w-map-select__area strong{font-size:var(--text-xl, 1.25rem);font-weight:var(--fw-bold, 700);line-height:1;color:var(--fg, var(--p-text-color));font-variant-numeric:tabular-nums}.leaflet-tooltip.w-map-select__tip{background:transparent;border:0;box-shadow:none;padding:0;white-space:nowrap;pointer-events:none;font-family:inherit;font-size:var(--text-sm, .8125rem);font-weight:var(--fw-bold, 700);color:#ffffffdb;text-shadow:0 1px 4px rgba(0,0,0,.92)}.leaflet-tooltip.w-map-select__tip:before{display:none}.leaflet-tooltip.w-map-select__tip--on{color:#fff}@media(max-width:900px){.w-map-select__body{flex-direction:column}.w-map-select__panel{width:100%;border-left:0;border-top:1px solid var(--border, var(--p-content-border-color));margin-left:0;margin-top:var(--space-3, .875rem);padding-left:0;padding-top:var(--space-3, .875rem)}}.w-map-select--overlay{--w-map-panel-w: 20rem;--w-map-inset: .75rem;--w-map-foot-h: 3.25rem;position:relative}.w-map-select--overlay .w-map-select__body{position:relative;flex-direction:row}.w-map-select--overlay .w-map-select__panel,.w-map-select--overlay .w-map-select__footer{--fg-muted: color-mix(in srgb, var(--fg, var(--p-text-color)) 74%, transparent);--fg-subtle: color-mix(in srgb, var(--fg, var(--p-text-color)) 56%, transparent);position:absolute;z-index:900;margin:0;border:1px solid var(--border, var(--p-content-border-color));border-radius:var(--radius-md, .625rem);box-shadow:var(--shadow-lg, 0 12px 32px rgba(15, 31, 48, .28));color:var(--fg, var(--p-text-color));background:var(--surface, var(--p-content-background));background:color-mix(in srgb,var(--surface, var(--p-content-background)) 92%,transparent);-webkit-backdrop-filter:blur(14px) saturate(140%);backdrop-filter:blur(14px) saturate(140%)}@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))){.w-map-select--overlay .w-map-select__panel,.w-map-select--overlay .w-map-select__footer{background:var(--surface, var(--p-content-background))}}.w-map-select--overlay .w-map-select__panel{top:var(--w-map-inset);right:var(--w-map-inset);bottom:calc(var(--w-map-inset) * 2 + var(--w-map-foot-h));width:var(--w-map-panel-w);max-width:calc(100% - var(--w-map-inset) * 2);padding:var(--space-2, .5rem) var(--space-3, .75rem) var(--space-3, .75rem)}.w-map-select--overlay .w-map-select__footer{left:var(--w-map-inset);right:var(--w-map-inset);bottom:var(--w-map-inset);padding:var(--space-2, .625rem) var(--space-3, .875rem)}.w-map-select--overlay .w-map-select__list{max-height:none;padding-bottom:0;overscroll-behavior:contain;scrollbar-width:thin}.w-map-select__collapse{align-self:flex-end;display:inline-flex;align-items:center;gap:var(--space-1, .375rem);height:1.5rem;min-width:1.5rem;justify-content:center;margin-bottom:var(--space-1, .25rem);padding:0;border:0;border-radius:var(--radius-full, 999px);background:transparent;color:var(--fg-muted, var(--p-text-muted-color));font-family:inherit;cursor:pointer;transition:color var(--motion-fast, .14s) var(--ease, ease)}.w-map-select__collapse:hover{color:var(--fg, var(--p-text-color))}.w-map-select__collapse:focus-visible{outline:2px solid var(--primary, var(--p-primary-color));outline-offset:2px}.w-map-select__collapse i{font-size:.8125rem}.w-map-select--collapsed .w-map-select__panel{bottom:auto;width:auto;padding:0;border-radius:var(--radius-full, 999px)}.w-map-select--collapsed .w-map-select__panel-head,.w-map-select--collapsed .w-map-select__list{display:none}.w-map-select--collapsed .w-map-select__collapse{height:2.25rem;margin:0;padding:0 var(--space-3, .75rem);color:var(--fg, var(--p-text-color))}.w-map-select__collapse-count{display:inline-flex;align-items:center;justify-content:center;min-width:1.25rem;height:1.25rem;padding:0 var(--space-1, .3125rem);border-radius:var(--radius-full, 999px);background:var(--primary, var(--p-primary-color));color:var(--primary-fg, var(--p-primary-contrast-color, #fff));font-size:var(--text-2xs, .6875rem);font-weight:var(--fw-bold, 700);font-variant-numeric:tabular-nums}.w-map-select--overlay:not(.w-map-select--collapsed) .w-map-select__collapse-count{display:none}.w-map-select--overlay .w-map-select__badge{right:auto;left:3.5rem}.w-map-select--overlay .leaflet-bottom{margin-bottom:calc(var(--w-map-foot-h) + var(--w-map-inset) + .25rem)}.w-map-select--overlay .leaflet-bottom.leaflet-right{right:auto;left:0}@media(max-width:768px){.w-map-select--overlay{--w-map-inset: .5rem}.w-map-select--overlay .w-map-select__panel{top:auto;left:var(--w-map-inset);right:var(--w-map-inset);width:auto;max-width:none;max-height:55%}.w-map-select--overlay.w-map-select--collapsed .w-map-select__panel{left:auto}}.w-datepicker,.w-datepicker .p-iconfield{width:100%}.w-datepicker-icon{cursor:pointer;color:var(--p-text-muted-color);transition:color .15s}.w-datepicker-icon:hover{color:var(--p-primary-color)}.w-datepicker-icon-disabled{opacity:.4;cursor:default;pointer-events:none}.w-datepicker-panel{display:flex;flex-direction:column;gap:.5rem}.w-datepicker-actions{display:flex;justify-content:space-between;gap:.5rem;border-top:1px solid var(--p-content-border-color);padding-top:.5rem}.w-fk-subrows{width:100%;border-collapse:collapse;font-size:var(--text-sm, .8125rem)}.w-fk-subrows th{padding:.25rem .625rem;text-align:right;font-weight:var(--fw-medium, 500);color:var(--fg-muted, var(--p-text-muted-color));white-space:nowrap}.w-fk-subrows th:first-child,.w-fk-subrows td:first-child{text-align:left}.w-fk-subrows td{padding:.3rem .625rem;text-align:right;border-top:1px solid var(--border, var(--p-content-border-color));font-variant-numeric:tabular-nums;white-space:nowrap}
@@ -0,0 +1,7 @@
1
+ /** Nível de uma verificação: aprovado, aviso, impeditivo. */
2
+ export type CheckListLevel = 'ok' | 'warn' | 'bad';
3
+ /** Uma linha do WCheckList. */
4
+ export interface CheckListItem {
5
+ nivel: CheckListLevel;
6
+ label: string;
7
+ }
@@ -0,0 +1,39 @@
1
+ import { Ref } from 'vue';
2
+ import { SelectOption } from './field';
3
+ /** Uma linha da tabela editável — estado local do consumidor, sem manager. */
4
+ export type EditableRow = Record<string, unknown>;
5
+ /** Editor da célula. `none` (default) só exibe o valor formatado. */
6
+ export type EditableColumnEditor = 'number' | 'text' | 'select' | 'none';
7
+ /**
8
+ * Coluna do WEditableTable. Diferente do `ColumnDef` (que descreve uma coluna de
9
+ * listagem vinda da API), aqui a coluna também descreve COMO se edita a célula e
10
+ * o que aparece no rodapé de totais.
11
+ */
12
+ export interface EditableColumnDef {
13
+ field: string;
14
+ header: string;
15
+ /** Largura fixa da coluna (`'120px'`, `120` → px, `'12rem'`). Sem isso a coluna é fluida. */
16
+ width?: string | number;
17
+ /** Alinhamento do conteúdo. Default: `right` para `editor: 'number'`, senão `left`. */
18
+ align?: 'left' | 'center' | 'right';
19
+ editor?: EditableColumnEditor;
20
+ /** Opções do `editor: 'select'`. */
21
+ options?: SelectOption[] | Ref<SelectOption[]>;
22
+ /** Campo do rótulo das `options` (default `label`). */
23
+ optionLabel?: string;
24
+ /** Campo do valor das `options` (default `value`). */
25
+ optionValue?: string;
26
+ /** Formatação da célula somente-leitura. Vence `decimals`/`suffix`. */
27
+ format?: (value: unknown, row: EditableRow) => string;
28
+ /** Rodapé da coluna: soma (pt-BR, com `decimals`/`suffix`), nada, ou texto livre. */
29
+ footer?: 'sum' | 'none' | ((rows: EditableRow[]) => string);
30
+ /** Casas decimais na exibição e na soma do rodapé (default 2 quando numérico). */
31
+ decimals?: number;
32
+ /** Sufixo colado ao valor formatado (ex.: `' L'`, `' kg'`). */
33
+ suffix?: string;
34
+ placeholder?: string;
35
+ min?: number;
36
+ max?: number;
37
+ /** Trava a célula (a coluna inteira ou linha a linha). */
38
+ disabled?: boolean | ((row: EditableRow, index: number) => boolean);
39
+ }
@@ -1,6 +1,6 @@
1
1
  import { Ref } from 'vue';
2
2
  import { ColumnDef } from './column';
3
- export type FieldType = 'text' | 'email' | 'password' | 'number' | 'currency' | 'date' | 'datetime' | 'select' | 'autocomplete' | 'fk' | 'switch' | 'textarea' | 'color' | 'cpf_cnpj' | 'mask' | 'image' | 'cep' | 'transfer';
3
+ export type FieldType = 'text' | 'email' | 'password' | 'number' | 'currency' | 'date' | 'datetime' | 'select' | 'autocomplete' | 'fk' | 'switch' | 'textarea' | 'color' | 'cpf_cnpj' | 'mask' | 'image' | 'cep' | 'transfer' | 'segmented' | 'choice' | 'chips';
4
4
  export interface SelectOption {
5
5
  [key: string]: unknown;
6
6
  }
@@ -17,6 +17,13 @@ export interface FieldDependency {
17
17
  * (cascata obrigatória). Default: true. */
18
18
  required?: boolean;
19
19
  }
20
+ /** Resultado do `subRows` da FK: mapa `id → sub-linhas` + colunas do mini-grid. */
21
+ export interface FieldSubRowsResult {
22
+ map: Record<string, Record<string, unknown>[]>;
23
+ columns: ColumnDef[];
24
+ }
25
+ /** Busca as sub-linhas de uma página do modal da FK. */
26
+ export type FieldSubRowsFetch = (rows: Record<string, unknown>[]) => Promise<FieldSubRowsResult>;
20
27
  export interface FieldDef {
21
28
  field: string;
22
29
  label: string;
@@ -45,6 +52,11 @@ export interface FieldDef {
45
52
  calculate?: (formData: Record<string, unknown>, isEditing: boolean) => unknown;
46
53
  options?: SelectOption[] | Ref<SelectOption[]>;
47
54
  optionLabel?: string;
55
+ /** Segunda linha da opção, em texto de apoio — para o dado que **decide** a escolha
56
+ * aparecer antes dela, não depois (ex.: o saldo em estoque de um lote).
57
+ * É uma **chave** do registro; formate no backend, como já se faz com `{fk}_nome`.
58
+ * Só afeta a lista de sugestões: escolhido o item, o campo mostra `optionLabel`. */
59
+ optionDescription?: string;
48
60
  optionValue?: string;
49
61
  showClear?: boolean;
50
62
  /** For 'transfer' fields — option keys to match against when searching
@@ -65,6 +77,13 @@ export interface FieldDef {
65
77
  blockedPlaceholder?: string;
66
78
  crudFields?: FieldDef[];
67
79
  crudColumns?: ColumnDef[];
80
+ /** Sub-linhas do grid do modal da FK: recebe as linhas da página e devolve o mapa
81
+ * `id → sub-linhas` + as colunas (dinâmicas) do mini-grid. Linha com entrada no
82
+ * mapa abre expandida — ex.: lote (linha) com as análises dele (sub-linhas). */
83
+ subRows?: FieldSubRowsFetch;
84
+ /** Largura do modal de pesquisa da FK (default do componente: 480px). Útil quando
85
+ * há sub-linhas/colunas dinâmicas que precisam de espaço. */
86
+ dialogWidth?: string;
68
87
  /** Controla o CRUD inline da FK (criar/editar/excluir no modal de busca). Omitido =
69
88
  * auto-detecta (há `crudFields` ou a API expõe `extras.fields`). Use `false` para
70
89
  * forçar desligado (ex.: lote que não pode ser criado sem semear o produto irmão). */
@@ -91,6 +110,13 @@ export interface FieldDef {
91
110
  maxDate?: string | Date;
92
111
  mask?: string;
93
112
  rows?: number;
113
+ /** Ícone no chip selecionado do `type: 'choice'` (default `pi pi-check-circle`).
114
+ * `''` desliga o ícone. */
115
+ choiceIcon?: string;
116
+ /** `type: 'chips'` — mensagem no lugar dos chips quando o valor está vazio. */
117
+ chipsEmptyLabel?: string;
118
+ /** `type: 'chips'` — `aria-label`/`title` do botão de remover do chip. */
119
+ chipsRemoveLabel?: string;
94
120
  switchLabel?: string;
95
121
  feedback?: boolean;
96
122
  accept?: string;
@@ -1,6 +1,9 @@
1
1
  export type { PaginatedResponse, PaginationState, SortState, UseApiOptions, UseApiReturn, } from './api';
2
2
  export type { ColumnDef, ColumnType } from './column';
3
3
  export type { FieldDef, FieldType, SelectOption, FieldDependency } from './field';
4
+ export type { EditableColumnDef, EditableColumnEditor, EditableRow } from './editableTable';
5
+ export type { CheckListItem, CheckListLevel } from './checkList';
6
+ export type { MapSelectFeature, MapSelectGeometry, MapSelectId, MapSelectPolygonStyle, MapSelectPosition, } from './mapSelect';
4
7
  export type { RowAction } from './action';
5
8
  export type { CrudLabels } from './labels';
6
9
  export { DEFAULT_CRUD_LABELS } from './labels';
@@ -0,0 +1,31 @@
1
+ /** Id de uma feature do mapa (o que entra/sai no `v-model` do WMapSelect). */
2
+ export type MapSelectId = string | number;
3
+ /** Anel de coordenadas GeoJSON — `[longitude, latitude]`, WGS84 (EPSG:4326). */
4
+ export type MapSelectPosition = [number, number];
5
+ /**
6
+ * Geometry GeoJSON aceita pelo WMapSelect. É a `geometry` pura (o que o backend
7
+ * devolve num campo `GeometryField`), não a `Feature` nem a `FeatureCollection`.
8
+ */
9
+ export interface MapSelectGeometry {
10
+ type: 'Polygon' | 'MultiPolygon';
11
+ coordinates: MapSelectPosition[][] | MapSelectPosition[][][];
12
+ }
13
+ /** Um item selecionável: aparece na lista e, quando tem `geometria`, no mapa. */
14
+ export interface MapSelectFeature {
15
+ id: MapSelectId;
16
+ nome: string;
17
+ /** Linha de apoio na lista (ex.: o setor do talhão). Entra também na busca. */
18
+ subtitulo?: string;
19
+ /** Área em hectares — somada no rodapé e mostrada no tooltip do polígono. */
20
+ area?: number;
21
+ /** Sem geometria o item continua na lista, só não é desenhado no mapa. */
22
+ geometria?: MapSelectGeometry | null;
23
+ }
24
+ /** Estilo de um polígono no mapa (subconjunto do `L.PathOptions`). */
25
+ export interface MapSelectPolygonStyle {
26
+ color?: string;
27
+ weight?: number;
28
+ opacity?: number;
29
+ fillColor?: string;
30
+ fillOpacity?: number;
31
+ }
@@ -0,0 +1,27 @@
1
+ import { ComputedRef, InjectionKey } from 'vue';
2
+ /**
3
+ * Contrato entre WStepFlow (container) e WStepSection (etapa). Vive num módulo
4
+ * próprio porque `<script setup>` não exporta valores — a chave precisa ser
5
+ * importável pelos dois SFCs.
6
+ *
7
+ * Quem é a última etapa (a que não desenha linha conectora) NÃO passa por aqui:
8
+ * é `:last-child` no CSS. Registrar as etapas em runtime só serviria para
9
+ * descobrir, com um tick de atraso, algo que o seletor já sabe na primeira
10
+ * pintura.
11
+ */
12
+ /** Como o flow arruma as etapas: coluna (padrão) ou régua no topo. */
13
+ export type StepFlowOrientation = 'vertical' | 'horizontal';
14
+ export interface StepFlowContext {
15
+ /** Etapa aberta. `0` = todas fechadas. */
16
+ active: ComputedRef<number>;
17
+ /** Alterna a etapa: abre a informada, ou fecha tudo se já era a aberta. */
18
+ toggle: (step: number) => void;
19
+ disabled: ComputedRef<boolean>;
20
+ /**
21
+ * Orientação do flow. Vem pelo contexto de propósito: a etapa se desenha
22
+ * conforme o container, sem o consumidor repetir a prop em cada WStepSection.
23
+ * Fora de um flow a etapa assume `vertical` (card colapsável avulso).
24
+ */
25
+ orientation: ComputedRef<StepFlowOrientation>;
26
+ }
27
+ export declare const W_STEP_FLOW_KEY: InjectionKey<StepFlowContext>;
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Lógica pura por trás do `WTreeSelect` — sem Vue, sem PrimeVue, testável isolada.
3
+ *
4
+ * O componente NÃO delega a seleção ao `Tree` do PrimeVue (ver o comentário longo
5
+ * em `WTreeSelect.vue`). Tudo o que a árvore precisa saber é derivado aqui, sempre
6
+ * a partir da árvore INTEIRA e do array de ids selecionados.
7
+ */
8
+ export type TreeSelectId = string | number;
9
+ export type TreeSelectOption = Record<string, unknown>;
10
+ /** Nó no formato que o `Tree` do PrimeVue consome (`key`/`label`/`children`). */
11
+ export interface TreeSelectNode {
12
+ /** Chave única e estável. Prefixada para não colidir grupo com folha. */
13
+ key: string;
14
+ label: string;
15
+ /** Id da folha. Ausente em nó de grupo — grupo é visual, nunca entra no v-model. */
16
+ value?: TreeSelectId;
17
+ children?: TreeSelectNode[];
18
+ /** Registro original da lista plana, entregue aos slots. */
19
+ data?: TreeSelectOption;
20
+ leaf: boolean;
21
+ }
22
+ /** Estado de um nó no formato que o `Tree` lê (`checked` / `partialChecked`). */
23
+ export interface TreeSelectionState {
24
+ checked: boolean;
25
+ partialChecked: boolean;
26
+ }
27
+ export type TreeSelectionKeys = Record<string, TreeSelectionState>;
28
+ /** Prefixo da chave de um nó de grupo. */
29
+ export declare const TREE_GROUP_PREFIX = "g:";
30
+ /** Prefixo da chave de um nó folha. */
31
+ export declare const TREE_LEAF_PREFIX = "n:";
32
+ export interface BuildTreeOptions {
33
+ /** Campo do id da folha (default: `id`). */
34
+ optionValue?: string;
35
+ /** Campo do rótulo visível (default: `nome`). */
36
+ optionLabel?: string;
37
+ /** Campo que agrupa. Sem ele, a árvore é rasa (só folhas na raiz). */
38
+ groupBy?: string;
39
+ /** Rótulo do nó-pai a partir do valor bruto do agrupamento. */
40
+ groupLabel?: (chave: string) => string;
41
+ }
42
+ /** Normaliza para busca: minúsculas e sem acento (rótulos são pt-BR). */
43
+ export declare function normalizeTerm(value: unknown): string;
44
+ /**
45
+ * Converte a lista PLANA em árvore de dois níveis.
46
+ *
47
+ * - Sem `groupBy`, ou item com valor de grupo vazio/nulo → folha na raiz.
48
+ * - Grupos saem na ordem da primeira ocorrência (nada de ordenação implícita,
49
+ * quem manda na ordem é quem monta a lista).
50
+ */
51
+ export declare function buildTree(options: readonly TreeSelectOption[], { optionValue, optionLabel, groupBy, groupLabel }?: BuildTreeOptions): TreeSelectNode[];
52
+ /** Todos os ids de folha sob um nó (o próprio, se for folha). */
53
+ export declare function collectLeafValues(node: TreeSelectNode): TreeSelectId[];
54
+ /** Todos os ids de folha da árvore, na ordem em que aparecem. */
55
+ export declare function allLeafValues(nodes: readonly TreeSelectNode[]): TreeSelectId[];
56
+ /** Índice `key → nó` da árvore INTEIRA — é por aqui que um evento vira ids. */
57
+ export declare function indexByKey(nodes: readonly TreeSelectNode[]): Map<string, TreeSelectNode>;
58
+ /**
59
+ * Deriva o mapa `selectionKeys` a partir dos ids selecionados.
60
+ *
61
+ * Chame SEMPRE com a árvore inteira — nunca com a visão filtrada. Um grupo é
62
+ * `checked` quando todas as folhas dele estão selecionadas e `partialChecked`
63
+ * quando só algumas estão; como a conta é sobre o conjunto completo, o filtro
64
+ * não tem como corromper o estado.
65
+ */
66
+ export declare function deriveSelectionKeys(nodes: readonly TreeSelectNode[], selected: readonly TreeSelectId[]): TreeSelectionKeys;
67
+ /**
68
+ * Poda a árvore pelo termo de busca, devolvendo CÓPIAS que preservam a `key`.
69
+ *
70
+ * Grupo cujo rótulo casa é mantido inteiro; senão sobram só as folhas que casam.
71
+ * A chave sobrevive à poda de propósito: é ela que reconecta um evento da árvore
72
+ * visível ao nó correspondente da árvore inteira.
73
+ */
74
+ export declare function filterTree(nodes: readonly TreeSelectNode[], term: string, extraFields?: readonly string[]): TreeSelectNode[];
75
+ /** Adiciona ou remove `ids` do array atual, preservando a ordem e sem duplicar. */
76
+ export declare function toggleIds(current: readonly TreeSelectId[], ids: readonly TreeSelectId[], check: boolean): TreeSelectId[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wgalleti/primevue-components",
3
- "version": "0.9.6",
3
+ "version": "0.11.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -87,12 +87,15 @@
87
87
  }
88
88
  },
89
89
  "dependencies": {
90
+ "leaflet": "^1.9.4",
90
91
  "maska": "^3.2.0"
91
92
  },
92
93
  "devDependencies": {
93
94
  "@eslint/js": "^9.17.0",
94
95
  "@primevue/themes": "^4.2.0",
96
+ "@types/leaflet": "^1.9.22",
95
97
  "@vitejs/plugin-vue": "^5.2.0",
98
+ "@vue/test-utils": "^2.4.6",
96
99
  "axios": "^1.7.0",
97
100
  "commit-and-tag-version": "^13.1.2",
98
101
  "dayjs": "^1.11.0",
@@ -100,6 +103,7 @@
100
103
  "eslint-config-prettier": "^9.1.0",
101
104
  "eslint-plugin-vue": "^9.32.0",
102
105
  "globals": "^15.14.0",
106
+ "jsdom": "^25.0.0",
103
107
  "prettier": "^3.4.0",
104
108
  "primeicons": "^7.0.0",
105
109
  "primevue": "^4.2.0",