@oondemand/oon-core-front 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +56 -8
- package/dist/index.js.map +1 -1
- package/package.json +6 -1
package/dist/index.js
CHANGED
|
@@ -120,7 +120,7 @@ function captureTokenFromUrl(tokenParam = "code") {
|
|
|
120
120
|
|
|
121
121
|
// src/app/OonProviders.tsx
|
|
122
122
|
import { useMemo as useMemo2 } from "react";
|
|
123
|
-
import { ChakraProvider
|
|
123
|
+
import { ChakraProvider } from "@chakra-ui/react";
|
|
124
124
|
import { QueryClientProvider } from "@tanstack/react-query";
|
|
125
125
|
|
|
126
126
|
// src/config/queryClient.ts
|
|
@@ -140,6 +140,53 @@ function createOonQueryClient() {
|
|
|
140
140
|
});
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
+
// src/config/theme.ts
|
|
144
|
+
import { createSystem, defaultConfig, defineConfig, mergeConfigs } from "@chakra-ui/react";
|
|
145
|
+
var brandColors = {
|
|
146
|
+
brand: {
|
|
147
|
+
25: { value: "#F5FBFF" },
|
|
148
|
+
50: { value: "#F0F7FF" },
|
|
149
|
+
75: { value: "#E6F2FF" },
|
|
150
|
+
100: { value: "#C7E3FF" },
|
|
151
|
+
200: { value: "#6CBCE8" },
|
|
152
|
+
300: { value: "#3FA6E0" },
|
|
153
|
+
350: { value: "#0F8DD0" },
|
|
154
|
+
400: { value: "#0580B9" },
|
|
155
|
+
500: { value: "#0474AF" },
|
|
156
|
+
600: { value: "#036491" },
|
|
157
|
+
700: { value: "#014364" },
|
|
158
|
+
800: { value: "#034167" },
|
|
159
|
+
850: { value: "#021D42" },
|
|
160
|
+
900: { value: "#011225" }
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
var oonThemeConfig = defineConfig({
|
|
164
|
+
theme: {
|
|
165
|
+
tokens: {
|
|
166
|
+
colors: brandColors
|
|
167
|
+
},
|
|
168
|
+
semanticTokens: {
|
|
169
|
+
colors: {
|
|
170
|
+
brand: {
|
|
171
|
+
solid: { value: "{colors.brand.500}" },
|
|
172
|
+
contrast: { value: "white" },
|
|
173
|
+
fg: { value: "{colors.brand.700}" },
|
|
174
|
+
muted: { value: "{colors.brand.50}" },
|
|
175
|
+
subtle: { value: "{colors.brand.75}" },
|
|
176
|
+
emphasized: { value: "{colors.brand.600}" },
|
|
177
|
+
focusRing: { value: "{colors.brand.500}" }
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
function createOonSystem(themeOverride) {
|
|
184
|
+
const base = mergeConfigs(defaultConfig, oonThemeConfig);
|
|
185
|
+
const config = themeOverride ? mergeConfigs(base, defineConfig(themeOverride)) : base;
|
|
186
|
+
return createSystem(config);
|
|
187
|
+
}
|
|
188
|
+
var oonSystem = createOonSystem();
|
|
189
|
+
|
|
143
190
|
// src/api/ApiProvider.tsx
|
|
144
191
|
import { createContext, useContext, useMemo } from "react";
|
|
145
192
|
import { useQuery } from "@tanstack/react-query";
|
|
@@ -353,8 +400,9 @@ function useOonAuth() {
|
|
|
353
400
|
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
354
401
|
function OonProviders({ config, http, storage, children }) {
|
|
355
402
|
const queryClient = useMemo2(() => createOonQueryClient(), []);
|
|
403
|
+
const system = useMemo2(() => createOonSystem(config.theme), [config.theme]);
|
|
356
404
|
const loginUrl = config.auth?.loginUrl ?? config.api.meusAppsUrl;
|
|
357
|
-
return /* @__PURE__ */ jsx3(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsx3(ChakraProvider, { value:
|
|
405
|
+
return /* @__PURE__ */ jsx3(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsx3(ChakraProvider, { value: system, children: /* @__PURE__ */ jsx3(ApiProvider, { http, children: /* @__PURE__ */ jsx3(AuthProvider, { http, storage, auth: config.auth, loginUrl, children }) }) }) });
|
|
358
406
|
}
|
|
359
407
|
|
|
360
408
|
// src/components/CoreCollection.tsx
|
|
@@ -947,7 +995,7 @@ function Sidebar({ app, menu }) {
|
|
|
947
995
|
return /* @__PURE__ */ jsxs8(Box7, { as: "nav", w: "260px", minH: "100vh", borderRightWidth: "1px", borderColor: "gray.200", px: 4, py: 6, bg: "white", children: [
|
|
948
996
|
/* @__PURE__ */ jsxs8(Flex5, { align: "center", gap: 3, mb: 8, px: 2, children: [
|
|
949
997
|
app.logo ? /* @__PURE__ */ jsx13(Image, { src: app.logo, alt: app.name, maxH: "36px" }) : null,
|
|
950
|
-
/* @__PURE__ */ jsx13(Text7, { fontWeight: "bold", fontSize: "md", children: app.name })
|
|
998
|
+
/* @__PURE__ */ jsx13(Text7, { fontWeight: "bold", fontSize: "md", color: "brand.500", children: app.name })
|
|
951
999
|
] }),
|
|
952
1000
|
/* @__PURE__ */ jsx13(Stack5, { gap: 6, children: groupBySection(visible).map(([section, items]) => /* @__PURE__ */ jsxs8(Stack5, { gap: 1, children: [
|
|
953
1001
|
section ? /* @__PURE__ */ jsx13(Text7, { fontSize: "xs", fontWeight: "semibold", color: "gray.400", textTransform: "uppercase", px: 3, mb: 1, children: section }) : null,
|
|
@@ -961,9 +1009,9 @@ function Sidebar({ app, menu }) {
|
|
|
961
1009
|
borderRadius: "md",
|
|
962
1010
|
fontSize: "sm",
|
|
963
1011
|
fontWeight: isActive ? "semibold" : "normal",
|
|
964
|
-
bg: isActive ? "
|
|
965
|
-
color: isActive ? "
|
|
966
|
-
_hover: { bg: isActive ? "
|
|
1012
|
+
bg: isActive ? "brand.50" : "transparent",
|
|
1013
|
+
color: isActive ? "brand.700" : "gray.700",
|
|
1014
|
+
_hover: { bg: isActive ? "brand.50" : "gray.50" },
|
|
967
1015
|
children: [
|
|
968
1016
|
item.icon,
|
|
969
1017
|
/* @__PURE__ */ jsx13("span", { children: item.label })
|
|
@@ -986,7 +1034,7 @@ function AuthenticatedLayout({ app, menu }) {
|
|
|
986
1034
|
/* @__PURE__ */ jsx14(Spacer2, {}),
|
|
987
1035
|
user ? /* @__PURE__ */ jsxs9(Flex6, { align: "center", gap: 3, children: [
|
|
988
1036
|
/* @__PURE__ */ jsx14(Text8, { fontSize: "sm", color: "gray.700", children: user.nome }),
|
|
989
|
-
/* @__PURE__ */ jsx14(Button3, { size: "xs", variant: "outline", onClick: logout, children: "Sair" })
|
|
1037
|
+
/* @__PURE__ */ jsx14(Button3, { size: "xs", variant: "outline", colorPalette: "brand", onClick: logout, children: "Sair" })
|
|
990
1038
|
] }) : null
|
|
991
1039
|
] }),
|
|
992
1040
|
/* @__PURE__ */ jsx14(Box8, { as: "main", flex: "1", p: 6, minW: 0, children: /* @__PURE__ */ jsx14(Outlet, {}) })
|
|
@@ -1269,7 +1317,7 @@ function CoreAssistant({ assistantCode, label = "Assistente", entity, endpoint =
|
|
|
1269
1317
|
messages.length === 0 ? /* @__PURE__ */ jsx21(Text11, { color: "gray.400", fontSize: "sm", children: "Fa\xE7a uma pergunta ao assistente." }) : messages.map((m, idx) => /* @__PURE__ */ jsx21(Flex9, { justify: m.role === "user" ? "flex-end" : "flex-start", children: /* @__PURE__ */ jsx21(
|
|
1270
1318
|
Box10,
|
|
1271
1319
|
{
|
|
1272
|
-
bg: m.role === "user" ? "
|
|
1320
|
+
bg: m.role === "user" ? "brand.500" : "gray.100",
|
|
1273
1321
|
color: m.role === "user" ? "white" : "gray.800",
|
|
1274
1322
|
px: 3,
|
|
1275
1323
|
py: 2,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/start.tsx","../src/app/OonApp.tsx","../src/api/createRestClient.ts","../src/api/errorNormalizer.ts","../src/security/tokenStorage.ts","../src/app/OonProviders.tsx","../src/config/queryClient.ts","../src/api/ApiProvider.tsx","../src/api/coreClient.ts","../src/api/resourceClient.ts","../src/security/AuthProvider.tsx","../src/components/CoreCollection.tsx","../src/components/internal/fieldUtils.ts","../src/components/internal/DataGrid.tsx","../src/shell/LoadingScreen.tsx","../src/shell/ErrorState.tsx","../src/components/internal/DynamicForm.tsx","../src/components/CoreDocument.tsx","../src/components/CorePipeline.tsx","../src/components/CoreDashboard.tsx","../src/app/moduleRegistry.tsx","../src/app/createOonRouter.tsx","../src/shell/AuthenticatedLayout.tsx","../src/shell/Sidebar.tsx","../src/security/RouteGuard.tsx","../src/manifest.ts","../src/define/views.ts","../src/components/CoreIntegration.tsx","../src/components/CoreCurrency.tsx","../src/components/CoreAssistant.tsx","../src/security/PermissionGate.tsx"],"sourcesContent":["import { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport type { OonCoreFrontConfig } from \"./types\";\nimport { OonApp } from \"./app/OonApp\";\n\nfunction validateConfig(config: OonCoreFrontConfig) {\n if (!config?.app?.id) throw new Error(\"oonCoreFront.start: config.app.id é obrigatório.\");\n if (!config?.api?.baseUrl) throw new Error(\"oonCoreFront.start: config.api.baseUrl é obrigatório.\");\n}\n\nfunction applyDocumentMeta(config: OonCoreFrontConfig) {\n if (config.app.title) document.title = config.app.title;\n if (config.app.favicon) {\n let link = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]');\n if (!link) {\n link = document.createElement(\"link\");\n link.rel = \"icon\";\n document.head.appendChild(link);\n }\n link.href = config.app.favicon;\n }\n}\n\nfunction hardenConsole(config: OonCoreFrontConfig) {\n if (config.security?.disableConsoleInProduction && import.meta.env?.PROD) {\n const noop = () => {};\n console.log = noop;\n console.debug = noop;\n console.info = noop;\n }\n}\n\n/**\n * Ponto de entrada único de uma Central (Seção 3.2). O `main.tsx` da Central\n * só chama isto — não conhece providers, router, auth, layout nem serviços.\n *\n * import { start } from \"@oondemand/oon-core-front\";\n * import { appConfig } from \"./central.ui\";\n * start(appConfig);\n */\nexport function start(config: OonCoreFrontConfig) {\n validateConfig(config);\n applyDocumentMeta(config);\n hardenConsole(config);\n\n const rootId = config.rootElementId ?? \"root\";\n const el = document.getElementById(rootId);\n if (!el) throw new Error(`oonCoreFront.start: elemento #${rootId} não encontrado no DOM.`);\n\n createRoot(el).render(\n <StrictMode>\n <OonApp config={config} />\n </StrictMode>\n );\n}\n\n/** Alias namespaced, compatível com a doc (`oonCoreFront.start`). */\nexport const oonCoreFront = { start };\n","import { useMemo } from \"react\";\nimport { RouterProvider } from \"react-router-dom\";\nimport type { OonCoreFrontConfig } from \"../types\";\nimport { createRestClient } from \"../api/createRestClient\";\nimport { createTokenStorage } from \"../security/tokenStorage\";\nimport { OonProviders } from \"./OonProviders\";\nimport { resolveRegistry } from \"./moduleRegistry\";\nimport { createOonRouter } from \"./createOonRouter\";\n\n/**\n * Raiz da aplicação Core. Cria o cliente REST (com token storage + 401),\n * resolve o registry de rotas/menu e monta providers + router.\n */\nexport function OonApp({ config }: { config: OonCoreFrontConfig }) {\n const { http, storage, router } = useMemo(() => {\n const storage = createTokenStorage(config.app.id);\n const loginUrl = config.auth?.loginUrl ?? config.api.meusAppsUrl;\n\n const http = createRestClient({\n api: config.api,\n appId: config.app.id,\n getToken: () => storage.get(),\n onUnauthorized: () => {\n storage.clear();\n if (loginUrl) window.location.href = loginUrl;\n },\n });\n\n const { routes, menu } = resolveRegistry(config);\n const router = createOonRouter({ app: config.app, menu, routes, security: config.security });\n\n return { http, storage, router };\n }, [config]);\n\n return (\n <OonProviders config={config} http={http} storage={storage}>\n <RouterProvider router={router} />\n </OonProviders>\n );\n}\n","import axios, { type AxiosInstance } from \"axios\";\nimport type { AuditContext, OonApiConfig } from \"../types\";\nimport { normalizeError } from \"./errorNormalizer\";\n\nexport interface RestClientDeps {\n api: OonApiConfig;\n /** Lê o token atual (Bearer). Retorna null se não autenticado. */\n getToken: () => string | null;\n /** Chamado uma vez ao receber 401 (logout + redirect). */\n onUnauthorized?: () => void;\n /** Origem app id, vai no header x-oon-app. */\n appId?: string;\n}\n\n/**\n * Cliente REST único do Core (Seção 2.5). Centraliza:\n * - baseUrl + versionPrefix;\n * - injeção de Bearer token;\n * - headers de auditoria x-oon-* nas mutações;\n * - tratamento global de 401 e normalização de erro.\n *\n * Nenhuma página de domínio deve instanciar axios diretamente.\n */\nexport function createRestClient(deps: RestClientDeps): AxiosInstance {\n const { api, getToken, onUnauthorized, appId } = deps;\n const prefix = api.versionPrefix ?? \"\";\n\n const instance = axios.create({\n baseURL: `${api.baseUrl.replace(/\\/$/, \"\")}${prefix}`,\n timeout: api.timeout ?? 30000,\n });\n\n instance.interceptors.request.use((config) => {\n // Em interceptors do axios v1, config.headers já é um AxiosHeaders.\n const token = getToken();\n if (token) config.headers.Authorization = `Bearer ${token}`;\n if (appId) config.headers[\"x-oon-app\"] = appId;\n return config;\n });\n\n instance.interceptors.response.use(\n (res) => res,\n (error) => {\n const normalized = normalizeError(error);\n if (normalized.status === 401) onUnauthorized?.();\n return Promise.reject(normalized);\n }\n );\n\n return instance;\n}\n\n/** Monta os headers de auditoria x-oon-* a partir do contexto. */\nexport function auditHeaders(audit?: AuditContext): Record<string, string> {\n if (!audit) return {};\n const headers: Record<string, string> = {};\n if (audit.origem) headers[\"x-oon-origin\"] = audit.origem;\n if (audit.module) headers[\"x-oon-module\"] = audit.module;\n if (audit.entity) headers[\"x-oon-entity\"] = audit.entity;\n return headers;\n}\n","import axios from \"axios\";\nimport type { OonError } from \"../types\";\n\n/**\n * Normaliza qualquer erro de rede/axios para o formato `OonError`, lendo o\n * envelope de erro padrão do back (`{ message }` ou `{ error: {...} }`).\n */\nexport function normalizeError(err: unknown): OonError {\n if (axios.isAxiosError(err)) {\n const status = err.response?.status;\n const data = err.response?.data as\n | { message?: string; error?: { code?: string; message?: string; details?: unknown; requestId?: string } }\n | undefined;\n\n const envelope = data?.error;\n return {\n code: envelope?.code || codeFromStatus(status),\n message: envelope?.message || data?.message || err.message || \"Erro inesperado.\",\n status,\n details: envelope?.details,\n requestId: envelope?.requestId || (err.response?.headers?.[\"x-request-id\"] as string | undefined),\n };\n }\n\n if (err instanceof Error) {\n return { code: \"UNKNOWN\", message: err.message };\n }\n\n return { code: \"UNKNOWN\", message: \"Erro inesperado.\" };\n}\n\nfunction codeFromStatus(status?: number): string {\n switch (status) {\n case 400:\n return \"VALIDATION_ERROR\";\n case 401:\n return \"UNAUTHORIZED\";\n case 403:\n return \"FORBIDDEN\";\n case 404:\n return \"NOT_FOUND\";\n case 409:\n return \"CONFLICT\";\n default:\n return status && status >= 500 ? \"SERVER_ERROR\" : \"REQUEST_ERROR\";\n }\n}\n","/**\n * Armazenamento de token encapsulado (Seção 6.2). Toda leitura/escrita de\n * token passa por aqui — nada de `localStorage.getItem('token')` espalhado.\n * Tudo com try/catch para JSON/localStorage inválido não derrubar a tela.\n */\nconst STORAGE_KEY = \"oon.auth.token\";\n\nexport interface TokenStorage {\n get(): string | null;\n set(token: string): void;\n clear(): void;\n}\n\nexport function createTokenStorage(namespace?: string): TokenStorage {\n const key = namespace ? `${STORAGE_KEY}.${namespace}` : STORAGE_KEY;\n\n return {\n get() {\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n },\n set(token: string) {\n try {\n window.localStorage.setItem(key, token);\n } catch {\n /* storage indisponível (modo privado) — ignora silenciosamente. */\n }\n },\n clear() {\n try {\n window.localStorage.removeItem(key);\n } catch {\n /* noop */\n }\n },\n };\n}\n\n/**\n * Lê o token vindo do SSO via query string (?code=...) e remove da URL para\n * não vazar em histórico/logs. Retorna o token capturado, se houver.\n */\nexport function captureTokenFromUrl(tokenParam = \"code\"): string | null {\n try {\n const url = new URL(window.location.href);\n const token = url.searchParams.get(tokenParam);\n if (!token) return null;\n url.searchParams.delete(tokenParam);\n window.history.replaceState({}, document.title, url.pathname + url.search + url.hash);\n return token;\n } catch {\n return null;\n }\n}\n","import { type ReactNode, useMemo } from \"react\";\nimport { ChakraProvider, defaultSystem } from \"@chakra-ui/react\";\nimport { QueryClientProvider } from \"@tanstack/react-query\";\nimport type { AxiosInstance } from \"axios\";\nimport type { OonCoreFrontConfig } from \"../types\";\nimport { createOonQueryClient } from \"../config/queryClient\";\nimport { ApiProvider } from \"../api/ApiProvider\";\nimport { AuthProvider } from \"../security/AuthProvider\";\nimport type { TokenStorage } from \"../security/tokenStorage\";\n\nexport interface OonProvidersProps {\n config: OonCoreFrontConfig;\n http: AxiosInstance;\n storage: TokenStorage;\n children: ReactNode;\n}\n\n/**\n * Monta, em ordem (Seção 3.3), todos os providers globais. Nenhuma Central\n * cliente deve montar QueryClient/Chakra/Auth/Api manualmente.\n *\n * Ordem: QueryClient -> Chakra -> Api -> Auth -> (Router, montado fora).\n */\nexport function OonProviders({ config, http, storage, children }: OonProvidersProps) {\n const queryClient = useMemo(() => createOonQueryClient(), []);\n const loginUrl = config.auth?.loginUrl ?? config.api.meusAppsUrl;\n\n return (\n <QueryClientProvider client={queryClient}>\n <ChakraProvider value={defaultSystem}>\n <ApiProvider http={http}>\n <AuthProvider http={http} storage={storage} auth={config.auth} loginUrl={loginUrl}>\n {children}\n </AuthProvider>\n </ApiProvider>\n </ChakraProvider>\n </QueryClientProvider>\n );\n}\n","import { QueryClient } from \"@tanstack/react-query\";\n\n/** QueryClient padrão do Core, com defaults conservadores para telas admin. */\nexport function createOonQueryClient(): QueryClient {\n return new QueryClient({\n defaultOptions: {\n queries: {\n retry: 1,\n refetchOnWindowFocus: false,\n staleTime: 30 * 1000,\n },\n mutations: {\n retry: 0,\n },\n },\n });\n}\n","import { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport type { AxiosInstance } from \"axios\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { ModelSummary } from \"../types\";\nimport { createCoreClient, type CoreClient } from \"./coreClient\";\nimport { createResourceClient, type ResourceClient } from \"./resourceClient\";\n\ninterface ApiContextValue {\n http: AxiosInstance;\n core: CoreClient;\n resource: <T = Record<string, unknown>>(basePath: string) => ResourceClient<T>;\n}\n\nconst ApiContext = createContext<ApiContextValue | null>(null);\n\nexport function ApiProvider({ http, children }: { http: AxiosInstance; children: ReactNode }) {\n const value = useMemo<ApiContextValue>(() => {\n const cache = new Map<string, ResourceClient>();\n return {\n http,\n core: createCoreClient(http),\n resource<T = Record<string, unknown>>(basePath: string) {\n let client = cache.get(basePath);\n if (!client) {\n client = createResourceClient(http, basePath);\n cache.set(basePath, client);\n }\n return client as ResourceClient<T>;\n },\n };\n }, [http]);\n\n return <ApiContext.Provider value={value}>{children}</ApiContext.Provider>;\n}\n\nexport function useOonApi(): ApiContextValue {\n const ctx = useContext(ApiContext);\n if (!ctx) throw new Error(\"useOonApi deve ser usado dentro de <ApiProvider> (oonCoreFront.start).\");\n return ctx;\n}\n\n/** Cliente de um recurso, memoizado pelo basePath. */\nexport function useOonResource<T = Record<string, unknown>>(basePath: string): ResourceClient<T> {\n const { resource } = useOonApi();\n return useMemo(() => resource<T>(basePath), [resource, basePath]);\n}\n\n/** Metadata completa do back (cache de 5 min). */\nexport function useCoreMetadata() {\n const { core } = useOonApi();\n return useQuery({\n queryKey: [\"oon\", \"core\", \"metadata\"],\n queryFn: () => core.metadata(),\n staleTime: 5 * 60 * 1000,\n });\n}\n\n/** Descrição de uma model específica — base do modo \"dynamic\". */\nexport function useModelSchema(name: string) {\n const { core } = useOonApi();\n return useQuery<ModelSummary>({\n queryKey: [\"oon\", \"core\", \"model\", name],\n queryFn: () => core.model(name),\n staleTime: 5 * 60 * 1000,\n enabled: !!name,\n });\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { CoreMetadata, ModelSummary } from \"../types\";\n\n/**\n * SDK do contrato /core/* (introspecção dirigida por metadata). É o que\n * permite o modo \"dynamic\" das coleções: o front monta grid/form/rotas a\n * partir do que o back descreve, sem código de UI por entidade.\n */\nexport interface CoreClient {\n metadata(): Promise<CoreMetadata>;\n models(): Promise<ModelSummary[]>;\n model(name: string): Promise<ModelSummary>;\n permissions(): Promise<Array<{ resource: string; action: string; roles: string[] }>>;\n menus(): Promise<CoreMetadata[\"menus\"]>;\n}\n\nexport function createCoreClient(http: AxiosInstance): CoreClient {\n return {\n async metadata() {\n const { data } = await http.get<CoreMetadata>(\"/core/metadata\");\n return data;\n },\n async models() {\n const { data } = await http.get<{ results: ModelSummary[] }>(\"/core/models\");\n return data.results;\n },\n async model(name) {\n const { data } = await http.get<ModelSummary>(`/core/models/${name}`);\n return data;\n },\n async permissions() {\n const { data } = await http.get<{ results: Array<{ resource: string; action: string; roles: string[] }> }>(\n \"/core/permissions\"\n );\n return data.results;\n },\n async menus() {\n const { data } = await http.get<{ results: CoreMetadata[\"menus\"] }>(\"/core/menus\");\n return data.results;\n },\n };\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AuditContext, ListParams, PaginatedResult } from \"../types\";\nimport { auditHeaders } from \"./createRestClient\";\n\n/**\n * SDK por recurso (Seção 2.5). Espelha o CRUD gerado pelo back em `basePath`:\n * GET / -> list (paginado)\n * GET /:id -> get\n * POST / -> create\n * PUT /:id -> update\n * PATCH /:id -> patch\n * DELETE /:id -> delete\n * POST /import -> importMany\n * GET /export -> exportAll\n *\n * O back devolve registro único na chave do singular (`{ [singular]: {...} }`);\n * `unwrap` extrai o primeiro valor não-meta para o consumidor não precisar\n * conhecer o singular.\n */\nexport interface ResourceClient<T = Record<string, unknown>> {\n list(params?: ListParams): Promise<PaginatedResult<T>>;\n get(id: string): Promise<T>;\n create(body: Partial<T>, audit?: AuditContext): Promise<T>;\n update(id: string, body: Partial<T>, audit?: AuditContext): Promise<T>;\n patch(id: string, body: Partial<T>, audit?: AuditContext): Promise<T>;\n delete(id: string, audit?: AuditContext): Promise<T>;\n importMany(rows: unknown[], audit?: AuditContext): Promise<{ inserted?: number; [k: string]: unknown }>;\n exportAll(params?: ListParams): Promise<T[]>;\n}\n\nconst META_KEYS = new Set([\"pagination\", \"results\", \"message\", \"requestId\"]);\n\nfunction unwrap<T>(data: Record<string, unknown>): T {\n // resposta tipo { pessoa: {...} } — pega o primeiro valor de objeto.\n for (const [key, value] of Object.entries(data)) {\n if (!META_KEYS.has(key) && value && typeof value === \"object\") {\n return value as T;\n }\n }\n return data as T;\n}\n\nexport function createResourceClient<T = Record<string, unknown>>(\n http: AxiosInstance,\n basePath: string\n): ResourceClient<T> {\n const base = `/${basePath.replace(/^\\/+/, \"\")}`;\n\n return {\n async list(params) {\n const { data } = await http.get<PaginatedResult<T>>(base, { params });\n return data;\n },\n async get(id) {\n const { data } = await http.get<Record<string, unknown>>(`${base}/${id}`);\n return unwrap<T>(data);\n },\n async create(body, audit) {\n const { data } = await http.post<Record<string, unknown>>(base, body, {\n headers: auditHeaders(audit ?? { origem: \"form\" }),\n });\n return unwrap<T>(data);\n },\n async update(id, body, audit) {\n const { data } = await http.put<Record<string, unknown>>(`${base}/${id}`, body, {\n headers: auditHeaders(audit ?? { origem: \"form\" }),\n });\n return unwrap<T>(data);\n },\n async patch(id, body, audit) {\n const { data } = await http.patch<Record<string, unknown>>(`${base}/${id}`, body, {\n headers: auditHeaders(audit ?? { origem: \"datagrid\" }),\n });\n return unwrap<T>(data);\n },\n async delete(id, audit) {\n const { data } = await http.delete<Record<string, unknown>>(`${base}/${id}`, {\n headers: auditHeaders(audit ?? { origem: \"datagrid\" }),\n });\n return unwrap<T>(data);\n },\n async importMany(rows, audit) {\n const { data } = await http.post<{ inserted?: number }>(\n `${base}/import`,\n { rows },\n { headers: auditHeaders(audit ?? { origem: \"import\" }) }\n );\n return data;\n },\n async exportAll(params) {\n const { data } = await http.get<{ results: T[] } | T[]>(`${base}/export`, { params });\n return Array.isArray(data) ? data : data.results;\n },\n };\n}\n","import { createContext, useContext, useEffect, useState, useCallback, type ReactNode } from \"react\";\nimport type { AxiosInstance } from \"axios\";\nimport type { OonAuthConfig, OonUser } from \"../types\";\nimport { captureTokenFromUrl, type TokenStorage } from \"./tokenStorage\";\n\ninterface AuthContextValue {\n user: OonUser | null;\n roles: string[];\n status: \"loading\" | \"authenticated\" | \"unauthenticated\";\n isAuthenticated: boolean;\n hasPermission: (permission?: string | string[]) => boolean;\n logout: () => void;\n}\n\nconst AuthContext = createContext<AuthContextValue | null>(null);\n\nexport interface AuthProviderProps {\n http: AxiosInstance;\n storage: TokenStorage;\n auth?: OonAuthConfig;\n /** URL externa de login (Meus Apps) para redirecionar quando sem sessão. */\n loginUrl?: string;\n children: ReactNode;\n}\n\n/**\n * Provider de autenticação do Core. Fluxo (Seção 2.4 do back / 6.2 da doc):\n * 1. captura token do ?code= e guarda no tokenStorage;\n * 2. valida em GET /auth/validar-token e resolve `usuario`;\n * 3. sem token/ inválido => redireciona para o login externo.\n *\n * Backend continua sendo a autoridade final — o RBAC do front é só UX.\n */\nexport function AuthProvider({ http, storage, auth, loginUrl, children }: AuthProviderProps) {\n const tokenParam = auth?.tokenParam ?? \"code\";\n const [user, setUser] = useState<OonUser | null>(null);\n const [status, setStatus] = useState<AuthContextValue[\"status\"]>(\"loading\");\n\n const redirectToLogin = useCallback(() => {\n if (loginUrl) {\n window.location.href = loginUrl;\n } else {\n setStatus(\"unauthenticated\");\n }\n }, [loginUrl]);\n\n const logout = useCallback(() => {\n storage.clear();\n setUser(null);\n redirectToLogin();\n }, [storage, redirectToLogin]);\n\n useEffect(() => {\n let active = true;\n\n const incoming = captureTokenFromUrl(tokenParam);\n if (incoming) storage.set(incoming);\n\n const token = storage.get();\n if (!token) {\n redirectToLogin();\n return;\n }\n\n http\n .get<{ usuario: OonUser }>(\"/auth/validar-token\")\n .then((res) => {\n if (!active) return;\n setUser(res.data.usuario);\n setStatus(\"authenticated\");\n })\n .catch(() => {\n if (!active) return;\n storage.clear();\n redirectToLogin();\n });\n\n return () => {\n active = false;\n };\n }, [http, storage, tokenParam, redirectToLogin]);\n\n const roles = user?.tipo ? [user.tipo] : [];\n\n const hasPermission = useCallback(\n (permission?: string | string[]) => {\n if (!permission) return true;\n const required = Array.isArray(permission) ? permission : [permission];\n if (required.length === 0) return true;\n // admin/master sempre passa; demais checam interseção simples por papel.\n if (roles.includes(\"admin\") || roles.includes(\"master\")) return true;\n return required.some((p) => roles.includes(p) || roles.some((r) => p.startsWith(`${r}.`)));\n },\n [roles]\n );\n\n const value: AuthContextValue = {\n user,\n roles,\n status,\n isAuthenticated: status === \"authenticated\",\n hasPermission,\n logout,\n };\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n\nexport function useOonAuth(): AuthContextValue {\n const ctx = useContext(AuthContext);\n if (!ctx) throw new Error(\"useOonAuth deve ser usado dentro de <AuthProvider> (oonCoreFront.start).\");\n return ctx;\n}\n","import { useState } from \"react\";\nimport { Box, Heading, Stack } from \"@chakra-ui/react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { CollectionMode, OonColumnDef, OonFormFieldDef } from \"../types\";\nimport { useModelSchema, useOonResource } from \"../api/ApiProvider\";\nimport { columnsFromMeta, formFieldsFromMeta } from \"./internal/fieldUtils\";\nimport { DataGrid } from \"./internal/DataGrid\";\nimport { DynamicForm } from \"./internal/DynamicForm\";\nimport { LoadingScreen } from \"../shell/LoadingScreen\";\nimport { ErrorState } from \"../shell/ErrorState\";\n\nexport interface CoreCollectionProps {\n model: string;\n label?: string;\n /**\n * Três formas de declarar a coleção (Seção 4.4):\n * - \"full\" : colunas + form explícitos (passe `columns` e `form`).\n * - \"minimal\" : só `model`; Core busca a metadata e deriva tudo.\n * - \"dynamic\" : 100% dirigido por /core/models/:model (default).\n */\n mode?: CollectionMode;\n /** basePath do recurso; default vem da metadata da model. */\n endpoint?: string;\n columns?: OonColumnDef[];\n form?: OonFormFieldDef[];\n importExport?: boolean;\n}\n\ntype FormState = { open: false } | { open: true; row?: Record<string, unknown> };\n\n/**\n * Componente Core de coleção. Renderiza grid + form de qualquer model do back\n * sem código de UI por entidade. No modo dinâmico, lê /core/models/:model e\n * monta colunas, formulário e endpoint a partir da metadata — esse é o\n * critério de pronto da Fase 3.\n */\nexport function CoreCollection({ model, label, mode = \"dynamic\", endpoint, columns, form, importExport }: CoreCollectionProps) {\n const needsSchema = mode !== \"full\" || !columns || !form || !endpoint;\n const schemaQuery = useModelSchema(needsSchema ? model : \"\");\n\n // Resolve endpoint/colunas/form: props têm prioridade; metadata preenche o resto.\n const schema = schemaQuery.data;\n const basePath = endpoint ?? schema?.basePath ?? `/${model.toLowerCase()}s`;\n const resolvedColumns = columns ?? (schema ? columnsFromMeta(schema.fields) : []);\n const resolvedForm = form ?? (schema ? formFieldsFromMeta(schema.fields) : []);\n\n const resource = useOonResource(basePath);\n const queryClient = useQueryClient();\n const [formState, setFormState] = useState<FormState>({ open: false });\n const [formError, setFormError] = useState<string | null>(null);\n\n const invalidate = () => queryClient.invalidateQueries({ queryKey: [\"oon\", \"list\", basePath] });\n\n const saveMutation = useMutation({\n mutationFn: (values: Record<string, unknown>) => {\n const editingRow = formState.open ? formState.row : undefined;\n const id = editingRow?._id as string | undefined;\n return id ? resource.update(id, values) : resource.create(values);\n },\n onSuccess: () => {\n setFormState({ open: false });\n setFormError(null);\n invalidate();\n },\n onError: (err) => setFormError(err.message),\n });\n\n const deleteMutation = useMutation({\n mutationFn: (row: Record<string, unknown>) => resource.delete(row._id as string),\n onSuccess: invalidate,\n });\n\n if (needsSchema && schemaQuery.isLoading) return <LoadingScreen />;\n if (needsSchema && schemaQuery.isError) return <ErrorState error={schemaQuery.error} />;\n\n const title = label ?? schema?.name ?? model;\n\n return (\n <Stack gap={6}>\n <Heading size=\"lg\">{title}</Heading>\n\n {formState.open ? (\n <DynamicForm\n title={formState.row ? `Editar ${title}` : `Novo ${title}`}\n fields={resolvedForm}\n initialValues={formState.row}\n submitting={saveMutation.isPending}\n error={formError}\n onSubmit={(values) => saveMutation.mutate(values)}\n onCancel={() => {\n setFormState({ open: false });\n setFormError(null);\n }}\n />\n ) : (\n <Box>\n <DataGrid\n resource={resource}\n resourceKey={basePath}\n columns={resolvedColumns}\n onCreate={() => setFormState({ open: true })}\n onEdit={(row) => setFormState({ open: true, row })}\n onDelete={(row) => {\n if (window.confirm(\"Excluir este registro?\")) deleteMutation.mutate(row);\n }}\n />\n {importExport ? null /* hook de import/export entra aqui (resource.importMany/exportAll) */ : null}\n </Box>\n )}\n </Stack>\n );\n}\n","import type { FieldKind, FieldMeta, OonColumnDef, OonFormFieldDef } from \"../../types\";\n\n/** Campos que normalmente não fazem sentido em grid/form de CRUD. */\nconst HIDDEN_FIELDS = new Set([\"__v\", \"_id\", \"createdAt\", \"updatedAt\", \"criadoEm\", \"atualizadoEm\"]);\n\nexport function isEditableField(meta: FieldMeta): boolean {\n return !HIDDEN_FIELDS.has(meta.name) && meta.kind !== \"raw\";\n}\n\nexport function fieldLabel(meta: { name: string; label?: string }): string {\n if (meta.label) return meta.label;\n // humaniza: camelCase/snake_case -> \"Camel Case\".\n return meta.name\n .replace(/_/g, \" \")\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/^./, (c) => c.toUpperCase());\n}\n\n/** Deriva colunas de grid a partir da metadata da model (modo dynamic/minimal). */\nexport function columnsFromMeta(fields: FieldMeta[]): OonColumnDef[] {\n return fields\n .filter(isEditableField)\n .slice(0, 8)\n .map((f) => ({ field: f.name, label: fieldLabel(f), kind: f.kind, sortable: true }));\n}\n\n/** Deriva campos de formulário a partir da metadata da model. */\nexport function formFieldsFromMeta(fields: FieldMeta[]): OonFormFieldDef[] {\n return fields.filter(isEditableField).map((f) => ({\n field: f.name,\n label: fieldLabel(f),\n kind: f.kind,\n options: f.options,\n }));\n}\n\n/** Formata um valor de célula conforme o tipo declarado. */\nexport function formatCell(value: unknown, kind?: FieldKind): string {\n if (value == null || value === \"\") return \"—\";\n switch (kind) {\n case \"boolean\":\n return value ? \"Sim\" : \"Não\";\n case \"date\":\n try {\n return new Date(value as string).toLocaleDateString(\"pt-BR\");\n } catch {\n return String(value);\n }\n case \"currency\":\n case \"currencyConverted\":\n return new Intl.NumberFormat(\"pt-BR\", { style: \"currency\", currency: \"BRL\" }).format(Number(value));\n case \"ref\":\n // ref populada vem como objeto { _id, nome/label } ou string id.\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n return String(obj.nome ?? obj.label ?? obj.descricao ?? obj._id ?? \"—\");\n }\n return String(value);\n default:\n return String(value);\n }\n}\n","import { useState, type ReactNode } from \"react\";\nimport { Box, Button, Flex, Input, Spacer, Table, Text } from \"@chakra-ui/react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport type { OonColumnDef } from \"../../types\";\nimport type { ResourceClient } from \"../../api/resourceClient\";\nimport { formatCell } from \"./fieldUtils\";\nimport { LoadingScreen } from \"../../shell/LoadingScreen\";\nimport { ErrorState } from \"../../shell/ErrorState\";\n\nexport interface DataGridProps {\n resource: ResourceClient;\n resourceKey: string;\n columns: OonColumnDef[];\n search?: boolean;\n onCreate?: () => void;\n onEdit?: (row: Record<string, unknown>) => void;\n onDelete?: (row: Record<string, unknown>) => void;\n toolbarExtra?: ReactNode;\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Grid genérico dirigido pelo `ResourceClient`. Paginação/ordenação/busca são\n * server-side (contrato do back: pageIndex/pageSize/searchTerm/sort). Não\n * conhece nenhuma entidade específica.\n */\nexport function DataGrid({\n resource,\n resourceKey,\n columns,\n search = true,\n onCreate,\n onEdit,\n onDelete,\n toolbarExtra,\n}: DataGridProps) {\n const [pageIndex, setPageIndex] = useState(0);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [sort, setSort] = useState<string | undefined>(undefined);\n\n const query = useQuery({\n queryKey: [\"oon\", \"list\", resourceKey, { pageIndex, searchTerm, sort }],\n queryFn: () => resource.list({ pageIndex, pageSize: PAGE_SIZE, searchTerm: searchTerm || undefined, sort }),\n placeholderData: keepPreviousData,\n });\n\n const toggleSort = (field: string) => {\n setPageIndex(0);\n setSort((prev) => {\n if (prev === `${field}.asc`) return `${field}.desc`;\n if (prev === `${field}.desc`) return undefined;\n return `${field}.asc`;\n });\n };\n\n const pagination = query.data?.pagination;\n const rows = query.data?.results ?? [];\n\n return (\n <Box>\n <Flex mb={4} gap={3} align=\"center\">\n {search ? (\n <Input\n size=\"sm\"\n maxW=\"320px\"\n placeholder=\"Buscar...\"\n value={searchTerm}\n onChange={(e) => {\n setPageIndex(0);\n setSearchTerm(e.target.value);\n }}\n />\n ) : null}\n <Spacer />\n {toolbarExtra}\n {onCreate ? (\n <Button size=\"sm\" colorPalette=\"blue\" onClick={onCreate}>\n Novo\n </Button>\n ) : null}\n </Flex>\n\n {query.isLoading ? (\n <LoadingScreen />\n ) : query.isError ? (\n <ErrorState error={query.error} />\n ) : (\n <Box borderWidth=\"1px\" borderColor=\"gray.200\" borderRadius=\"md\" overflowX=\"auto\" bg=\"white\">\n <Table.Root size=\"sm\" interactive>\n <Table.Header>\n <Table.Row>\n {columns.map((col) => (\n <Table.ColumnHeader\n key={col.field}\n cursor={col.sortable ? \"pointer\" : undefined}\n onClick={col.sortable ? () => toggleSort(col.field) : undefined}\n >\n {col.label ?? col.field}\n {sort?.startsWith(`${col.field}.`) ? (sort.endsWith(\".asc\") ? \" ▲\" : \" ▼\") : \"\"}\n </Table.ColumnHeader>\n ))}\n {onEdit || onDelete ? <Table.ColumnHeader textAlign=\"end\">Ações</Table.ColumnHeader> : null}\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {rows.length === 0 ? (\n <Table.Row>\n <Table.Cell colSpan={columns.length + 1}>\n <Text color=\"gray.400\" py={6} textAlign=\"center\">\n Nenhum registro encontrado.\n </Text>\n </Table.Cell>\n </Table.Row>\n ) : (\n rows.map((row, idx) => (\n <Table.Row key={(row._id as string) ?? idx}>\n {columns.map((col) => (\n <Table.Cell key={col.field}>{formatCell(row[col.field], col.kind)}</Table.Cell>\n ))}\n {onEdit || onDelete ? (\n <Table.Cell textAlign=\"end\">\n <Flex gap={2} justify=\"end\">\n {onEdit ? (\n <Button size=\"xs\" variant=\"ghost\" onClick={() => onEdit(row)}>\n Editar\n </Button>\n ) : null}\n {onDelete ? (\n <Button size=\"xs\" variant=\"ghost\" colorPalette=\"red\" onClick={() => onDelete(row)}>\n Excluir\n </Button>\n ) : null}\n </Flex>\n </Table.Cell>\n ) : null}\n </Table.Row>\n ))\n )}\n </Table.Body>\n </Table.Root>\n </Box>\n )}\n\n {pagination ? (\n <Flex mt={4} align=\"center\" gap={3}>\n <Text fontSize=\"sm\" color=\"gray.500\">\n {pagination.totalItems} registro(s) · página {pagination.currentPage} de {pagination.totalPages}\n </Text>\n <Spacer />\n <Button size=\"xs\" variant=\"outline\" disabled={pageIndex <= 0} onClick={() => setPageIndex((p) => p - 1)}>\n Anterior\n </Button>\n <Button\n size=\"xs\"\n variant=\"outline\"\n disabled={pagination.currentPage >= pagination.totalPages}\n onClick={() => setPageIndex((p) => p + 1)}\n >\n Próxima\n </Button>\n </Flex>\n ) : null}\n </Box>\n );\n}\n","import { Flex, Spinner, Text } from \"@chakra-ui/react\";\n\n/** Tela de carregamento/estado neutro reutilizada por guards e Suspense. */\nexport function LoadingScreen({ message }: { message?: string }) {\n return (\n <Flex direction=\"column\" align=\"center\" justify=\"center\" minH=\"60vh\" gap={4}>\n <Spinner size=\"lg\" />\n {message ? (\n <Text color=\"gray.500\" fontSize=\"sm\">\n {message}\n </Text>\n ) : null}\n </Flex>\n );\n}\n","import { Box, Heading, Text } from \"@chakra-ui/react\";\n\n/**\n * Estado de erro padrão. Aceita tanto o `OonError` do client quanto um `Error`\n * cru (o que o React Query tipa em `query.error`) — só precisa de `message` e,\n * opcionalmente, `requestId`.\n */\nexport function ErrorState({\n error,\n title = \"Não foi possível carregar\",\n}: {\n error?: { message?: string; requestId?: string } | null;\n title?: string;\n}) {\n return (\n <Box borderWidth=\"1px\" borderColor=\"red.200\" bg=\"red.50\" borderRadius=\"md\" p={4}>\n <Heading size=\"sm\" color=\"red.700\">\n {title}\n </Heading>\n <Text mt={1} fontSize=\"sm\" color=\"red.600\">\n {error?.message ?? \"Erro inesperado.\"}\n </Text>\n {error?.requestId ? (\n <Text mt={2} fontSize=\"xs\" color=\"red.400\">\n requestId: {error.requestId}\n </Text>\n ) : null}\n </Box>\n );\n}\n","import { useState, type FormEvent } from \"react\";\nimport { Box, Button, Flex, Heading, Input, Stack, Text, NativeSelect } from \"@chakra-ui/react\";\nimport type { OonFormFieldDef } from \"../../types\";\nimport { fieldLabel } from \"./fieldUtils\";\n\nexport interface DynamicFormProps {\n title: string;\n fields: OonFormFieldDef[];\n initialValues?: Record<string, unknown>;\n submitting?: boolean;\n error?: string | null;\n onSubmit: (values: Record<string, unknown>) => void;\n onCancel: () => void;\n}\n\nfunction coerce(value: string, kind?: string): unknown {\n if (value === \"\") return undefined;\n if (kind === \"number\" || kind === \"currency\" || kind === \"currencyConverted\") return Number(value);\n if (kind === \"boolean\") return value === \"true\";\n return value;\n}\n\nfunction toInputValue(value: unknown, kind?: string): string {\n if (value == null) return \"\";\n if (kind === \"date\" && value) {\n try {\n return new Date(value as string).toISOString().slice(0, 10);\n } catch {\n return \"\";\n }\n }\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n return String(obj._id ?? \"\");\n }\n return String(value);\n}\n\n/**\n * Formulário gerado a partir das definições de campo (modo dynamic monta isto\n * direto da metadata). Render por `kind`: enum -> select; boolean -> select\n * Sim/Não; date -> input date; currency/number -> number; demais -> texto.\n */\nexport function DynamicForm({ title, fields, initialValues, submitting, error, onSubmit, onCancel }: DynamicFormProps) {\n const [values, setValues] = useState<Record<string, string>>(() => {\n const init: Record<string, string> = {};\n for (const f of fields) init[f.field] = toInputValue(initialValues?.[f.field], f.kind);\n return init;\n });\n\n const setField = (name: string, value: string) => setValues((prev) => ({ ...prev, [name]: value }));\n\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault();\n const payload: Record<string, unknown> = {};\n for (const f of fields) {\n const coerced = coerce(values[f.field] ?? \"\", f.kind);\n if (coerced !== undefined) payload[f.field] = coerced;\n }\n onSubmit(payload);\n };\n\n return (\n <Box borderWidth=\"1px\" borderColor=\"gray.200\" borderRadius=\"md\" bg=\"white\" p={6} maxW=\"640px\">\n <Heading size=\"md\" mb={4}>\n {title}\n </Heading>\n <form onSubmit={handleSubmit}>\n <Stack gap={4}>\n {fields.map((f) => {\n const label = fieldLabel({ name: f.field, label: f.label });\n if (f.kind === \"enum\" && f.options?.length) {\n return (\n <Box key={f.field}>\n <Text fontSize=\"sm\" mb={1} fontWeight=\"medium\">\n {label}\n </Text>\n <NativeSelect.Root size=\"sm\">\n <NativeSelect.Field\n value={values[f.field] ?? \"\"}\n onChange={(e) => setField(f.field, e.currentTarget.value)}\n >\n <option value=\"\">—</option>\n {f.options.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </NativeSelect.Field>\n <NativeSelect.Indicator />\n </NativeSelect.Root>\n </Box>\n );\n }\n if (f.kind === \"boolean\") {\n return (\n <Box key={f.field}>\n <Text fontSize=\"sm\" mb={1} fontWeight=\"medium\">\n {label}\n </Text>\n <NativeSelect.Root size=\"sm\">\n <NativeSelect.Field\n value={values[f.field] ?? \"\"}\n onChange={(e) => setField(f.field, e.currentTarget.value)}\n >\n <option value=\"\">—</option>\n <option value=\"true\">Sim</option>\n <option value=\"false\">Não</option>\n </NativeSelect.Field>\n <NativeSelect.Indicator />\n </NativeSelect.Root>\n </Box>\n );\n }\n const inputType =\n f.kind === \"date\"\n ? \"date\"\n : f.kind === \"number\" || f.kind === \"currency\" || f.kind === \"currencyConverted\"\n ? \"number\"\n : \"text\";\n return (\n <Box key={f.field}>\n <Text fontSize=\"sm\" mb={1} fontWeight=\"medium\">\n {label}\n {f.required ? \" *\" : \"\"}\n </Text>\n <Input\n size=\"sm\"\n type={inputType}\n required={f.required}\n value={values[f.field] ?? \"\"}\n onChange={(e) => setField(f.field, e.currentTarget.value)}\n />\n </Box>\n );\n })}\n\n {error ? (\n <Text fontSize=\"sm\" color=\"red.600\">\n {error}\n </Text>\n ) : null}\n\n <Flex gap={3} justify=\"end\" mt={2}>\n <Button size=\"sm\" variant=\"ghost\" type=\"button\" onClick={onCancel}>\n Cancelar\n </Button>\n <Button size=\"sm\" colorPalette=\"blue\" type=\"submit\" loading={submitting}>\n Salvar\n </Button>\n </Flex>\n </Stack>\n </form>\n </Box>\n );\n}\n","import type { OonColumnDef, OonFormFieldDef } from \"../types\";\nimport { useOonApi } from \"../api/ApiProvider\";\nimport { CoreCollection } from \"./CoreCollection\";\n\nexport interface CoreDocumentProps {\n model: string;\n label?: string;\n endpoint?: string;\n columns?: OonColumnDef[];\n form?: OonFormFieldDef[];\n /** liga ações de aprovar/reprovar (RESTful: /:id/actions/approve|reject). */\n approval?: boolean;\n /** liga gestão de anexos (futuro: /:id/files). */\n attachments?: boolean;\n}\n\n/**\n * Tipo documental. Hoje reusa a coleção genérica (list + CRUD). Quando\n * `approval` está ligado, expõe o helper `approveDocument` para as ações\n * RESTful do back (Seção 5.2) — documentos fiscais e cadastrais viram\n * configuração, não páginas escritas à mão.\n */\nexport function CoreDocument({ model, label, endpoint, columns, form }: CoreDocumentProps) {\n return (\n <CoreCollection\n model={model}\n label={label}\n mode={columns && form ? \"full\" : \"dynamic\"}\n endpoint={endpoint}\n columns={columns}\n form={form}\n />\n );\n}\n\n/**\n * Aciona uma ação RESTful de documento (approve/reject/archive). Exposto para\n * o domínio usar em botões de linha sem reimplementar a chamada.\n */\nexport function useDocumentAction(basePath: string) {\n const { http } = useOonApi();\n return (id: string, action: \"approve\" | \"reject\" | \"archive\") =>\n http.post(`${basePath}/${id}/actions/${action}`, {}, { headers: { \"x-oon-origin\": \"form\" } });\n}\n","import { Box, Flex, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useModelSchema, useOonResource } from \"../api/ApiProvider\";\nimport { LoadingScreen } from \"../shell/LoadingScreen\";\nimport { ErrorState } from \"../shell/ErrorState\";\nimport { formatCell } from \"./internal/fieldUtils\";\n\nexport interface CorePipelineProps {\n model: string;\n label?: string;\n endpoint?: string;\n /** campo do registro que define a coluna/etapa. Default: \"status\". */\n stageField?: string;\n /** etapas fixas; se omitido, derivadas do enum de `stageField`. */\n stages?: Array<{ id: string; label: string }>;\n /** campo exibido como título do card. Default: primeiro string. */\n titleField?: string;\n}\n\n/**\n * Esteira (kanban) genérica do Core. Agrupa registros por `stageField` em\n * colunas. As etapas vêm das props ou são derivadas do enum declarado na\n * metadata da model — nenhuma esteira específica hardcoded.\n */\nexport function CorePipeline({ model, label, endpoint, stageField = \"status\", stages, titleField }: CorePipelineProps) {\n const schemaQuery = useModelSchema(model);\n const schema = schemaQuery.data;\n const basePath = endpoint ?? schema?.basePath ?? `/${model.toLowerCase()}s`;\n const resource = useOonResource(basePath);\n\n const listQuery = useQuery({\n queryKey: [\"oon\", \"pipeline\", basePath],\n queryFn: () => resource.list({ pageSize: 200 }),\n enabled: !!schema,\n });\n\n if (schemaQuery.isLoading || listQuery.isLoading) return <LoadingScreen />;\n if (schemaQuery.isError) return <ErrorState error={schemaQuery.error} />;\n if (listQuery.isError) return <ErrorState error={listQuery.error} />;\n\n const stageFieldMeta = schema?.fields.find((f) => f.name === stageField);\n const resolvedStages =\n stages ??\n (stageFieldMeta?.options ?? []).map((opt) => ({ id: opt, label: opt })) ?? [];\n\n const title =\n titleField ?? schema?.fields.find((f) => f.kind === \"string\")?.name ?? schema?.searchable[0] ?? \"_id\";\n\n const rows = listQuery.data?.results ?? [];\n const byStage = new Map<string, Record<string, unknown>[]>();\n for (const stage of resolvedStages) byStage.set(stage.id, []);\n for (const row of rows) {\n const key = String(row[stageField] ?? \"\");\n if (!byStage.has(key)) byStage.set(key, []);\n byStage.get(key)!.push(row);\n }\n\n return (\n <Stack gap={6}>\n <Heading size=\"lg\">{label ?? schema?.name ?? model}</Heading>\n <Flex gap={4} align=\"stretch\" overflowX=\"auto\" pb={2}>\n {Array.from(byStage.entries()).map(([stageId, items]) => {\n const stageLabel = resolvedStages.find((s) => s.id === stageId)?.label ?? (stageId || \"—\");\n return (\n <Box key={stageId} minW=\"280px\" bg=\"gray.100\" borderRadius=\"md\" p={3}>\n <Flex align=\"center\" justify=\"space-between\" mb={3}>\n <Text fontWeight=\"semibold\" fontSize=\"sm\">\n {stageLabel}\n </Text>\n <Text fontSize=\"xs\" color=\"gray.500\">\n {items.length}\n </Text>\n </Flex>\n <Stack gap={2}>\n {items.map((row, idx) => (\n <Box key={(row._id as string) ?? idx} bg=\"white\" borderRadius=\"md\" p={3} borderWidth=\"1px\" borderColor=\"gray.200\">\n <Text fontSize=\"sm\" fontWeight=\"medium\">\n {formatCell(row[title], \"string\")}\n </Text>\n </Box>\n ))}\n </Stack>\n </Box>\n );\n })}\n </Flex>\n </Stack>\n );\n}\n","import { Box, Heading, SimpleGrid, Stack, Text } from \"@chakra-ui/react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport type { DashboardWidgetDef } from \"../types\";\nimport { useOonApi } from \"../api/ApiProvider\";\n\nexport interface CoreDashboardProps {\n label?: string;\n widgets?: DashboardWidgetDef[];\n}\n\n/**\n * Dashboard do Core: renderiza widgets registrados (count/sum por model ou\n * render custom). Cache, loading e erro ficam no Core; a Central só declara.\n */\nexport function CoreDashboard({ label = \"Dashboard\", widgets = [] }: CoreDashboardProps) {\n const { resource } = useOonApi();\n\n const queries = useQueries({\n queries: widgets\n .filter((w) => w.kind !== \"custom\" && w.model)\n .map((w) => ({\n queryKey: [\"oon\", \"widget\", w.id],\n queryFn: async () => {\n const r = await resource(`/${w.model!.toLowerCase()}s`).list({ pageSize: w.kind === \"sum\" ? 200 : 1 });\n if (w.kind === \"sum\" && w.field) {\n return r.results.reduce((acc, row) => acc + Number((row as Record<string, unknown>)[w.field!] ?? 0), 0);\n }\n return r.pagination.totalItems;\n },\n staleTime: 60 * 1000,\n })),\n });\n\n let queryIdx = 0;\n\n return (\n <Stack gap={6}>\n <Heading size=\"lg\">{label}</Heading>\n <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} gap={4}>\n {widgets.map((w) => {\n if (w.kind === \"custom\" && w.render) {\n return (\n <Box key={w.id} borderWidth=\"1px\" borderColor=\"gray.200\" borderRadius=\"md\" bg=\"white\" p={5}>\n {w.render()}\n </Box>\n );\n }\n const q = queries[queryIdx++];\n const value = q?.isLoading ? \"…\" : q?.isError ? \"—\" : formatWidget(q?.data, w.kind, w.field);\n return (\n <Box key={w.id} borderWidth=\"1px\" borderColor=\"gray.200\" borderRadius=\"md\" bg=\"white\" p={5}>\n <Text fontSize=\"sm\" color=\"gray.500\">\n {w.label}\n </Text>\n <Heading size=\"xl\" mt={1}>\n {value}\n </Heading>\n </Box>\n );\n })}\n </SimpleGrid>\n </Stack>\n );\n}\n\nfunction formatWidget(value: unknown, kind?: string, field?: string): string {\n if (value == null) return \"—\";\n if ((kind === \"sum\" && field?.toLowerCase().includes(\"valor\")) || kind === \"sum\") {\n return new Intl.NumberFormat(\"pt-BR\", { style: \"currency\", currency: \"BRL\" }).format(Number(value));\n }\n return String(value);\n}\n","import type {\n CollectionViewDef,\n DashboardViewDef,\n DocumentViewDef,\n OonCoreFrontConfig,\n OonMenuItem,\n OonRoute,\n OonViewDefinition,\n PipelineViewDef,\n} from \"../types\";\nimport { CoreCollection } from \"../components/CoreCollection\";\nimport { CoreDocument } from \"../components/CoreDocument\";\nimport { CorePipeline } from \"../components/CorePipeline\";\nimport { CoreDashboard } from \"../components/CoreDashboard\";\n\n/** Resultado da resolução de módulos + manifesto de UI em rotas e menu. */\nexport interface ResolvedRegistry {\n routes: OonRoute[];\n menu: OonMenuItem[];\n}\n\nfunction slug(value: string): string {\n return value\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nfunction viewId(view: OonViewDefinition): string {\n if (view.id) return view.id;\n if (view.type === \"dashboard\") return \"dashboard\";\n return slug(view.model);\n}\n\nfunction viewPath(view: OonViewDefinition): string {\n if (view.path) return view.path;\n if (view.type === \"dashboard\") return \"/\";\n return `/${viewId(view)}`;\n}\n\nfunction viewLabel(view: OonViewDefinition): string {\n if (view.label) return view.label;\n if (view.type === \"dashboard\") return \"Dashboard\";\n return view.model;\n}\n\n/** Converte uma view declarativa no componente Core correspondente. */\nfunction renderView(view: OonViewDefinition) {\n switch (view.type) {\n case \"collection\": {\n const v = view as CollectionViewDef;\n return (\n <CoreCollection\n model={v.model}\n mode={v.mode}\n columns={v.columns}\n form={v.form}\n label={viewLabel(v)}\n importExport={v.importExport}\n />\n );\n }\n case \"document\": {\n const v = view as DocumentViewDef;\n return <CoreDocument model={v.model} label={viewLabel(v)} approval={v.approval} attachments={v.attachments} />;\n }\n case \"pipeline\": {\n const v = view as PipelineViewDef;\n return (\n <CorePipeline\n model={v.model}\n label={viewLabel(v)}\n stageField={v.stageField}\n stages={v.stages}\n />\n );\n }\n case \"dashboard\": {\n const v = view as DashboardViewDef;\n return <CoreDashboard label={viewLabel(v)} widgets={v.widgets} />;\n }\n default:\n return null;\n }\n}\n\nfunction viewToRoute(view: OonViewDefinition): OonRoute {\n return {\n path: viewPath(view),\n element: renderView(view),\n permissions: \"permissions\" in view ? view.permissions : undefined,\n };\n}\n\nfunction viewToMenu(view: OonViewDefinition): OonMenuItem {\n return {\n label: viewLabel(view),\n href: viewPath(view),\n icon: view.icon,\n section: view.section,\n permissions: \"permissions\" in view ? view.permissions : undefined,\n };\n}\n\n/**\n * Resolve a config inteira (módulos + `ui.views`) em um registry plano de\n * rotas e menu. É o que substitui o `router.jsx` hardcoded por geração\n * dirigida por declaração/metadata.\n */\nexport function resolveRegistry(config: OonCoreFrontConfig): ResolvedRegistry {\n const routes: OonRoute[] = [];\n const menu: OonMenuItem[] = [];\n const seenPaths = new Set<string>();\n\n const pushRoute = (route: OonRoute) => {\n if (seenPaths.has(route.path)) return;\n seenPaths.add(route.path);\n routes.push(route);\n };\n\n for (const mod of config.modules ?? []) {\n for (const route of mod.routes ?? []) pushRoute(route);\n for (const item of mod.menu ?? []) menu.push(item);\n for (const view of mod.views ?? []) {\n pushRoute(viewToRoute(view));\n menu.push(viewToMenu(view));\n }\n }\n\n for (const view of config.ui?.views ?? []) {\n pushRoute(viewToRoute(view));\n menu.push(viewToMenu(view));\n }\n\n menu.sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n return { routes, menu };\n}\n","import { createBrowserRouter, type RouteObject } from \"react-router-dom\";\nimport type { OonAppConfig, OonMenuItem, OonRoute, OonSecurityConfig } from \"../types\";\nimport { AuthenticatedLayout } from \"../shell/AuthenticatedLayout\";\nimport { RouteGuard } from \"../security/RouteGuard\";\n\nexport interface RouterInput {\n app: OonAppConfig;\n menu: OonMenuItem[];\n routes: OonRoute[];\n security?: OonSecurityConfig;\n}\n\n/**\n * Constrói o router a partir do registry resolvido (rotas dos módulos/views).\n * Rotas privadas ficam sob o layout autenticado e passam pelo RouteGuard;\n * rotas `public: true` ficam fora do layout.\n */\nexport function createOonRouter({ app, menu, routes, security }: RouterInput) {\n const guardEnabled = security?.enableRouteGuard !== false;\n\n const publicRoutes: RouteObject[] = routes\n .filter((r) => r.public)\n .map((r) => ({ path: r.path, element: r.element }));\n\n const privateRoutes: RouteObject[] = routes\n .filter((r) => !r.public)\n .map((r) => {\n const element = guardEnabled ? <RouteGuard permission={r.permissions}>{r.element}</RouteGuard> : r.element;\n // Rota raiz vira index route; demais usam path relativo ao layout.\n return r.path === \"/\" ? { index: true, element } : { path: r.path.replace(/^\\//, \"\"), element };\n });\n\n const tree: RouteObject[] = [\n ...publicRoutes,\n {\n path: \"/\",\n element: <AuthenticatedLayout app={app} menu={menu} />,\n children: privateRoutes,\n },\n ];\n\n return createBrowserRouter(tree);\n}\n","import { Box, Button, Flex, Spacer, Text } from \"@chakra-ui/react\";\nimport { Outlet } from \"react-router-dom\";\nimport type { OonAppConfig, OonMenuItem } from \"../types\";\nimport { useOonAuth } from \"../security/AuthProvider\";\nimport { Sidebar } from \"./Sidebar\";\n\n/**\n * Layout autenticado do Core: sidebar + topbar com usuário e logout.\n * Totalmente orientado por `appConfig` e pelo menu resolvido do registry.\n */\nexport function AuthenticatedLayout({ app, menu }: { app: OonAppConfig; menu: OonMenuItem[] }) {\n const { user, logout } = useOonAuth();\n\n return (\n <Flex align=\"stretch\" minH=\"100vh\" bg=\"gray.50\">\n <Sidebar app={app} menu={menu} />\n <Flex direction=\"column\" flex=\"1\" minW={0}>\n <Flex as=\"header\" align=\"center\" px={6} py={3} borderBottomWidth=\"1px\" borderColor=\"gray.200\" bg=\"white\">\n <Text fontSize=\"sm\" color=\"gray.500\">\n {app.title ?? app.name}\n </Text>\n <Spacer />\n {user ? (\n <Flex align=\"center\" gap={3}>\n <Text fontSize=\"sm\" color=\"gray.700\">\n {user.nome}\n </Text>\n <Button size=\"xs\" variant=\"outline\" onClick={logout}>\n Sair\n </Button>\n </Flex>\n ) : null}\n </Flex>\n <Box as=\"main\" flex=\"1\" p={6} minW={0}>\n <Outlet />\n </Box>\n </Flex>\n </Flex>\n );\n}\n","import { Box, Flex, Image, Stack, Text } from \"@chakra-ui/react\";\nimport { NavLink } from \"react-router-dom\";\nimport type { OonAppConfig, OonMenuItem } from \"../types\";\nimport { useOonAuth } from \"../security/AuthProvider\";\n\n/** Agrupa itens de menu por seção, preservando ordem de inserção. */\nfunction groupBySection(items: OonMenuItem[]): Array<[string, OonMenuItem[]]> {\n const groups = new Map<string, OonMenuItem[]>();\n for (const item of items) {\n const section = item.section ?? \"\";\n if (!groups.has(section)) groups.set(section, []);\n groups.get(section)!.push(item);\n }\n return Array.from(groups.entries());\n}\n\n/**\n * Menu lateral dirigido pelo registry. Esconde itens sem permissão (UX).\n * Nada de label/itens hardcoded: tudo vem de `appConfig` e do menu resolvido.\n */\nexport function Sidebar({ app, menu }: { app: OonAppConfig; menu: OonMenuItem[] }) {\n const { hasPermission } = useOonAuth();\n const visible = menu.filter((item) => hasPermission(item.permissions));\n\n return (\n <Box as=\"nav\" w=\"260px\" minH=\"100vh\" borderRightWidth=\"1px\" borderColor=\"gray.200\" px={4} py={6} bg=\"white\">\n <Flex align=\"center\" gap={3} mb={8} px={2}>\n {app.logo ? <Image src={app.logo} alt={app.name} maxH=\"36px\" /> : null}\n <Text fontWeight=\"bold\" fontSize=\"md\">\n {app.name}\n </Text>\n </Flex>\n\n <Stack gap={6}>\n {groupBySection(visible).map(([section, items]) => (\n <Stack key={section || \"_\"} gap={1}>\n {section ? (\n <Text fontSize=\"xs\" fontWeight=\"semibold\" color=\"gray.400\" textTransform=\"uppercase\" px={3} mb={1}>\n {section}\n </Text>\n ) : null}\n {items.map((item) => (\n <NavLink key={item.href} to={item.href} end={item.href === \"/\"}>\n {({ isActive }) => (\n <Flex\n align=\"center\"\n gap={2}\n px={3}\n py={2}\n borderRadius=\"md\"\n fontSize=\"sm\"\n fontWeight={isActive ? \"semibold\" : \"normal\"}\n bg={isActive ? \"blue.50\" : \"transparent\"}\n color={isActive ? \"blue.700\" : \"gray.700\"}\n _hover={{ bg: isActive ? \"blue.50\" : \"gray.50\" }}\n >\n {item.icon}\n <span>{item.label}</span>\n </Flex>\n )}\n </NavLink>\n ))}\n </Stack>\n ))}\n </Stack>\n </Box>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { useOonAuth } from \"./AuthProvider\";\nimport { LoadingScreen } from \"../shell/LoadingScreen\";\n\n/**\n * Protege rotas privadas: enquanto valida o token mostra loading; sem sessão\n * o AuthProvider já redireciona para o login externo, então aqui só seguramos\n * o render. `permission` opcional bloqueia por papel (UX; back valida de novo).\n */\nexport function RouteGuard({\n permission,\n children,\n}: {\n permission?: string | string[];\n children: ReactNode;\n}) {\n const { status, hasPermission } = useOonAuth();\n\n if (status === \"loading\") return <LoadingScreen />;\n if (status === \"unauthenticated\") return <LoadingScreen message=\"Redirecionando para o login...\" />;\n if (!hasPermission(permission)) {\n return <LoadingScreen message=\"Você não tem acesso a esta tela.\" />;\n }\n return <>{children}</>;\n}\n","import type {\n CollectionMode,\n CollectionViewDef,\n DocumentViewDef,\n OonCoreFrontConfig,\n OonViewDefinition,\n PipelineViewDef,\n} from \"./types\";\nimport { start } from \"./start\";\n\n/**\n * Schema do `central.ui.json` (Seção 9 do escopo). É o que o frontend\n * consumidor gerado pelo `create-central-oon` carrega — declaração pura, sem\n * código de UI. O Core converte isto em `OonCoreFrontConfig`.\n */\nexport interface CentralUiManifest {\n name: string;\n slug: string;\n backend?: { metadataUrl?: string };\n navigation?: { mode?: \"auto\" | \"manual\" };\n collections?: Array<{\n model: string;\n mode?: CollectionMode;\n path?: string;\n label?: string;\n section?: string;\n }>;\n pipelines?: Array<{\n name?: string;\n model?: string;\n mode?: string;\n stageField?: string;\n path?: string;\n label?: string;\n section?: string;\n }>;\n documents?: Array<{\n model: string;\n mode?: string;\n path?: string;\n label?: string;\n section?: string;\n approval?: boolean;\n attachments?: boolean;\n }>;\n}\n\n/** Dados de runtime que o `central.ui.json` não carrega (vêm do .env). */\nexport interface ManifestRuntime {\n apiBaseUrl: string;\n meusAppsUrl?: string;\n assistantBaseUrl?: string;\n versionPrefix?: string;\n}\n\n/** Converte o manifesto declarativo + runtime em config do Core. */\nexport function manifestToConfig(manifest: CentralUiManifest, runtime: ManifestRuntime): OonCoreFrontConfig {\n const views: OonViewDefinition[] = [];\n\n for (const c of manifest.collections ?? []) {\n const view: CollectionViewDef = {\n type: \"collection\",\n model: c.model,\n mode: c.mode ?? \"dynamic\",\n path: c.path,\n label: c.label,\n section: c.section,\n };\n views.push(view);\n }\n\n for (const p of manifest.pipelines ?? []) {\n const model = p.model ?? p.name;\n if (!model) continue;\n const view: PipelineViewDef = {\n type: \"pipeline\",\n model,\n label: p.label ?? p.name,\n path: p.path,\n stageField: p.stageField,\n section: p.section,\n };\n views.push(view);\n }\n\n for (const d of manifest.documents ?? []) {\n const view: DocumentViewDef = {\n type: \"document\",\n model: d.model,\n label: d.label,\n path: d.path,\n section: d.section,\n approval: d.approval,\n attachments: d.attachments,\n };\n views.push(view);\n }\n\n return {\n app: {\n id: manifest.slug,\n name: manifest.name,\n title: manifest.name,\n },\n api: {\n baseUrl: runtime.apiBaseUrl,\n meusAppsUrl: runtime.meusAppsUrl,\n assistantBaseUrl: runtime.assistantBaseUrl,\n versionPrefix: runtime.versionPrefix ?? \"\",\n },\n auth: { mode: \"bearer\", tokenParam: \"code\" },\n security: {\n enableRouteGuard: true,\n enablePermissionGate: true,\n redactAssistantContext: true,\n disableConsoleInProduction: true,\n },\n ui: { views },\n };\n}\n\n/**\n * Bootstrap a partir do `central.ui.json`. É a única linha que o `main.tsx` de\n * uma Central gerada precisa:\n *\n * import manifest from \"../central.ui.json\";\n * startFromManifest(manifest, { apiBaseUrl: import.meta.env.VITE_API_URL });\n */\nexport function startFromManifest(manifest: CentralUiManifest, runtime: ManifestRuntime) {\n start(manifestToConfig(manifest, runtime));\n}\n","import type {\n CollectionViewDef,\n DashboardViewDef,\n DocumentViewDef,\n OonModule,\n PipelineViewDef,\n} from \"../types\";\n\n/**\n * Helpers declarativos (API pública da Seção 4.3). São identidades tipadas que\n * fixam o `type` da view — servem para o autocomplete e para registrar a view\n * num módulo ou no `ui.views` da config.\n */\n\nexport function defineCollectionView(def: Omit<CollectionViewDef, \"type\">): CollectionViewDef {\n return { type: \"collection\", ...def };\n}\n\nexport function defineDocumentView(def: Omit<DocumentViewDef, \"type\">): DocumentViewDef {\n return { type: \"document\", ...def };\n}\n\nexport function definePipelineView(def: Omit<PipelineViewDef, \"type\">): PipelineViewDef {\n return { type: \"pipeline\", ...def };\n}\n\nexport function defineDashboard(def: Omit<DashboardViewDef, \"type\">): DashboardViewDef {\n return { type: \"dashboard\", ...def };\n}\n\n/** Açúcar para declarar um módulo com tipagem. */\nexport function defineOonModule(mod: OonModule): OonModule {\n return mod;\n}\n","import { Badge, Box, Button, Flex, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { useCoreMetadata, useOonApi } from \"../api/ApiProvider\";\nimport { LoadingScreen } from \"../shell/LoadingScreen\";\nimport { ErrorState } from \"../shell/ErrorState\";\n\nexport interface CoreIntegrationProps {\n label?: string;\n}\n\ninterface IntegrationEntry {\n id?: string;\n name?: string;\n label?: string;\n status?: string;\n}\n\n/**\n * Painel de integrações: lista o que o back declarou em /core/integrations e\n * permite reprocessar via action RESTful (POST /integrations/actions/process-active).\n */\nexport function CoreIntegration({ label = \"Integrações\" }: CoreIntegrationProps) {\n const { http } = useOonApi();\n const metadata = useCoreMetadata();\n\n const reprocess = useMutation({\n mutationFn: () =>\n http.post(\"/integrations/actions/process-active\", {}, { headers: { \"x-oon-origin\": \"integration\" } }),\n });\n\n if (metadata.isLoading) return <LoadingScreen />;\n if (metadata.isError) return <ErrorState error={metadata.error} />;\n\n const integrations = (metadata.data?.integrations ?? []) as IntegrationEntry[];\n\n return (\n <Stack gap={6}>\n <Flex align=\"center\" justify=\"space-between\">\n <Heading size=\"lg\">{label}</Heading>\n <Button size=\"sm\" variant=\"outline\" loading={reprocess.isPending} onClick={() => reprocess.mutate()}>\n Reprocessar ativos\n </Button>\n </Flex>\n <Stack gap={3}>\n {integrations.length === 0 ? (\n <Text color=\"gray.400\">Nenhuma integração declarada.</Text>\n ) : (\n integrations.map((it, idx) => (\n <Box\n key={it.id ?? it.name ?? idx}\n borderWidth=\"1px\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n bg=\"white\"\n p={4}\n >\n <Flex align=\"center\" justify=\"space-between\">\n <Text fontWeight=\"medium\">{it.label ?? it.name ?? \"Integração\"}</Text>\n <Badge colorPalette={it.status === \"erro\" ? \"red\" : it.status === \"ativo\" ? \"green\" : \"gray\"}>\n {it.status ?? \"—\"}\n </Badge>\n </Flex>\n </Box>\n ))\n )}\n </Stack>\n </Stack>\n );\n}\n","import { Button, Flex, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { OonColumnDef } from \"../types\";\nimport { useOonApi } from \"../api/ApiProvider\";\nimport { CoreCollection } from \"./CoreCollection\";\n\nexport interface CoreCurrencyProps {\n /** model das moedas. Default: \"Moeda\". */\n model?: string;\n label?: string;\n endpoint?: string;\n columns?: OonColumnDef[];\n}\n\n/**\n * Multi-moedas (módulo de domínio, Seção 4.6/2.11). Lista as moedas e expõe a\n * ação RESTful de atualizar cotações (POST /<endpoint>/actions/update-rates).\n */\nexport function CoreCurrency({ model = \"Moeda\", label = \"Multi-moedas\", endpoint = \"/moedas\", columns }: CoreCurrencyProps) {\n const { http } = useOonApi();\n const queryClient = useQueryClient();\n\n const updateRates = useMutation({\n mutationFn: () => http.post(`${endpoint}/actions/update-rates`, {}, { headers: { \"x-oon-origin\": \"integration\" } }),\n onSuccess: () => queryClient.invalidateQueries({ queryKey: [\"oon\", \"list\", endpoint] }),\n });\n\n return (\n <Stack gap={6}>\n <Flex align=\"center\" justify=\"space-between\">\n <Heading size=\"lg\">{label}</Heading>\n <Button size=\"sm\" colorPalette=\"blue\" loading={updateRates.isPending} onClick={() => updateRates.mutate()}>\n Atualizar cotações\n </Button>\n </Flex>\n {updateRates.isError ? (\n <Text fontSize=\"sm\" color=\"red.600\">\n {updateRates.error?.message}\n </Text>\n ) : null}\n <CoreCollection model={model} label=\"\" mode={columns ? \"full\" : \"dynamic\"} endpoint={endpoint} columns={columns} />\n </Stack>\n );\n}\n","import { useState } from \"react\";\nimport { Box, Button, Flex, Heading, Input, Stack, Text } from \"@chakra-ui/react\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { useOonApi } from \"../api/ApiProvider\";\n\nexport interface AssistantMessage {\n role: \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface CoreAssistantProps {\n /** code do assistente registrado no back (ex.: \"servicos-tomados.revisao\"). */\n assistantCode: string;\n label?: string;\n /** entidade de contexto (apenas tipo + id; nada sensível). */\n entity?: { type: string; id: string };\n /** base de assistentes; default usa o mesmo client REST do Core. */\n endpoint?: string;\n}\n\n/**\n * Assistente IA do Core (Seção 2.12 / 6.2). Envia ao back apenas\n * assistantCode + entity + message — NUNCA chave de IA, modelo ou prompt.\n * O back resolve modelo, prompt, chave e políticas.\n */\nexport function CoreAssistant({ assistantCode, label = \"Assistente\", entity, endpoint = \"/assistant-runs\" }: CoreAssistantProps) {\n const { http } = useOonApi();\n const [messages, setMessages] = useState<AssistantMessage[]>([]);\n const [input, setInput] = useState(\"\");\n\n const ask = useMutation({\n mutationFn: async (message: string) => {\n const { data } = await http.post<{ reply?: string; message?: string }>(\n endpoint,\n {\n assistantCode,\n entity,\n message,\n // Contexto redigido: a Central pode enriquecer, mas o Core não envia PII por padrão.\n context: { redactionPolicy: \"default\" },\n },\n { headers: { \"x-oon-origin\": \"assistant\" } }\n );\n return data.reply ?? data.message ?? \"\";\n },\n onSuccess: (reply) => setMessages((prev) => [...prev, { role: \"assistant\", content: reply }]),\n });\n\n const send = () => {\n const text = input.trim();\n if (!text) return;\n setMessages((prev) => [...prev, { role: \"user\", content: text }]);\n setInput(\"\");\n ask.mutate(text);\n };\n\n return (\n <Stack gap={4} maxW=\"560px\">\n <Heading size=\"md\">{label}</Heading>\n <Box borderWidth=\"1px\" borderColor=\"gray.200\" borderRadius=\"md\" bg=\"white\" p={4} minH=\"240px\">\n <Stack gap={3}>\n {messages.length === 0 ? (\n <Text color=\"gray.400\" fontSize=\"sm\">\n Faça uma pergunta ao assistente.\n </Text>\n ) : (\n messages.map((m, idx) => (\n <Flex key={idx} justify={m.role === \"user\" ? \"flex-end\" : \"flex-start\"}>\n <Box\n bg={m.role === \"user\" ? \"blue.500\" : \"gray.100\"}\n color={m.role === \"user\" ? \"white\" : \"gray.800\"}\n px={3}\n py={2}\n borderRadius=\"md\"\n maxW=\"80%\"\n fontSize=\"sm\"\n >\n {m.content}\n </Box>\n </Flex>\n ))\n )}\n {ask.isPending ? (\n <Text color=\"gray.400\" fontSize=\"sm\">\n Pensando…\n </Text>\n ) : null}\n {ask.isError ? (\n <Text color=\"red.600\" fontSize=\"sm\">\n {ask.error?.message}\n </Text>\n ) : null}\n </Stack>\n </Box>\n <Flex gap={2}>\n <Input\n size=\"sm\"\n value={input}\n placeholder=\"Digite sua mensagem...\"\n onChange={(e) => setInput(e.currentTarget.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") send();\n }}\n />\n <Button size=\"sm\" colorPalette=\"blue\" onClick={send} loading={ask.isPending}>\n Enviar\n </Button>\n </Flex>\n </Stack>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { useOonAuth } from \"./AuthProvider\";\n\n/**\n * Esconde a UI quando o usuário não tem a permissão. NÃO é segurança real\n * (Seção 6.2, item 3) — o back é a autoridade. Serve apenas para não exibir\n * ações/menus que o usuário não pode usar.\n */\nexport function PermissionGate({\n permission,\n fallback = null,\n children,\n}: {\n permission?: string | string[];\n fallback?: ReactNode;\n children: ReactNode;\n}) {\n const { hasPermission } = useOonAuth();\n return <>{hasPermission(permission) ? children : fallback}</>;\n}\n"],"mappings":";AAAA,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;;;ACD3B,SAAS,WAAAA,gBAAe;AACxB,SAAS,sBAAsB;;;ACD/B,OAAOC,YAAmC;;;ACA1C,OAAO,WAAW;AAOX,SAAS,eAAe,KAAwB;AACrD,MAAI,MAAM,aAAa,GAAG,GAAG;AAC3B,UAAM,SAAS,IAAI,UAAU;AAC7B,UAAM,OAAO,IAAI,UAAU;AAI3B,UAAM,WAAW,MAAM;AACvB,WAAO;AAAA,MACL,MAAM,UAAU,QAAQ,eAAe,MAAM;AAAA,MAC7C,SAAS,UAAU,WAAW,MAAM,WAAW,IAAI,WAAW;AAAA,MAC9D;AAAA,MACA,SAAS,UAAU;AAAA,MACnB,WAAW,UAAU,aAAc,IAAI,UAAU,UAAU,cAAc;AAAA,IAC3E;AAAA,EACF;AAEA,MAAI,eAAe,OAAO;AACxB,WAAO,EAAE,MAAM,WAAW,SAAS,IAAI,QAAQ;AAAA,EACjD;AAEA,SAAO,EAAE,MAAM,WAAW,SAAS,mBAAmB;AACxD;AAEA,SAAS,eAAe,QAAyB;AAC/C,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,UAAU,UAAU,MAAM,iBAAiB;AAAA,EACtD;AACF;;;ADvBO,SAAS,iBAAiB,MAAqC;AACpE,QAAM,EAAE,KAAK,UAAU,gBAAgB,MAAM,IAAI;AACjD,QAAM,SAAS,IAAI,iBAAiB;AAEpC,QAAM,WAAWC,OAAM,OAAO;AAAA,IAC5B,SAAS,GAAG,IAAI,QAAQ,QAAQ,OAAO,EAAE,CAAC,GAAG,MAAM;AAAA,IACnD,SAAS,IAAI,WAAW;AAAA,EAC1B,CAAC;AAED,WAAS,aAAa,QAAQ,IAAI,CAAC,WAAW;AAE5C,UAAM,QAAQ,SAAS;AACvB,QAAI,MAAO,QAAO,QAAQ,gBAAgB,UAAU,KAAK;AACzD,QAAI,MAAO,QAAO,QAAQ,WAAW,IAAI;AACzC,WAAO;AAAA,EACT,CAAC;AAED,WAAS,aAAa,SAAS;AAAA,IAC7B,CAAC,QAAQ;AAAA,IACT,CAAC,UAAU;AACT,YAAM,aAAa,eAAe,KAAK;AACvC,UAAI,WAAW,WAAW,IAAK,kBAAiB;AAChD,aAAO,QAAQ,OAAO,UAAU;AAAA,IAClC;AAAA,EACF;AAEA,SAAO;AACT;AAGO,SAAS,aAAa,OAA8C;AACzE,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,QAAM,UAAkC,CAAC;AACzC,MAAI,MAAM,OAAQ,SAAQ,cAAc,IAAI,MAAM;AAClD,MAAI,MAAM,OAAQ,SAAQ,cAAc,IAAI,MAAM;AAClD,MAAI,MAAM,OAAQ,SAAQ,cAAc,IAAI,MAAM;AAClD,SAAO;AACT;;;AEvDA,IAAM,cAAc;AAQb,SAAS,mBAAmB,WAAkC;AACnE,QAAM,MAAM,YAAY,GAAG,WAAW,IAAI,SAAS,KAAK;AAExD,SAAO;AAAA,IACL,MAAM;AACJ,UAAI;AACF,eAAO,OAAO,aAAa,QAAQ,GAAG;AAAA,MACxC,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,IAAI,OAAe;AACjB,UAAI;AACF,eAAO,aAAa,QAAQ,KAAK,KAAK;AAAA,MACxC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,IACA,QAAQ;AACN,UAAI;AACF,eAAO,aAAa,WAAW,GAAG;AAAA,MACpC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,oBAAoB,aAAa,QAAuB;AACtE,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,UAAM,QAAQ,IAAI,aAAa,IAAI,UAAU;AAC7C,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,aAAa,OAAO,UAAU;AAClC,WAAO,QAAQ,aAAa,CAAC,GAAG,SAAS,OAAO,IAAI,WAAW,IAAI,SAAS,IAAI,IAAI;AACpF,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACxDA,SAAyB,WAAAC,gBAAe;AACxC,SAAS,gBAAgB,qBAAqB;AAC9C,SAAS,2BAA2B;;;ACFpC,SAAS,mBAAmB;AAGrB,SAAS,uBAAoC;AAClD,SAAO,IAAI,YAAY;AAAA,IACrB,gBAAgB;AAAA,MACd,SAAS;AAAA,QACP,OAAO;AAAA,QACP,sBAAsB;AAAA,QACtB,WAAW,KAAK;AAAA,MAClB;AAAA,MACA,WAAW;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AChBA,SAAS,eAAe,YAAY,eAA+B;AAEnE,SAAS,gBAAgB;;;ACclB,SAAS,iBAAiB,MAAiC;AAChE,SAAO;AAAA,IACL,MAAM,WAAW;AACf,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAAkB,gBAAgB;AAC9D,aAAO;AAAA,IACT;AAAA,IACA,MAAM,SAAS;AACb,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAAiC,cAAc;AAC3E,aAAO,KAAK;AAAA,IACd;AAAA,IACA,MAAM,MAAM,MAAM;AAChB,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAAkB,gBAAgB,IAAI,EAAE;AACpE,aAAO;AAAA,IACT;AAAA,IACA,MAAM,cAAc;AAClB,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK;AAAA,QAC1B;AAAA,MACF;AACA,aAAO,KAAK;AAAA,IACd;AAAA,IACA,MAAM,QAAQ;AACZ,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAAwC,aAAa;AACjF,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AACF;;;ACXA,IAAM,YAAY,oBAAI,IAAI,CAAC,cAAc,WAAW,WAAW,WAAW,CAAC;AAE3E,SAAS,OAAU,MAAkC;AAEnD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,QAAI,CAAC,UAAU,IAAI,GAAG,KAAK,SAAS,OAAO,UAAU,UAAU;AAC7D,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,qBACd,MACA,UACmB;AACnB,QAAM,OAAO,IAAI,SAAS,QAAQ,QAAQ,EAAE,CAAC;AAE7C,SAAO;AAAA,IACL,MAAM,KAAK,QAAQ;AACjB,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAAwB,MAAM,EAAE,OAAO,CAAC;AACpE,aAAO;AAAA,IACT;AAAA,IACA,MAAM,IAAI,IAAI;AACZ,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAA6B,GAAG,IAAI,IAAI,EAAE,EAAE;AACxE,aAAO,OAAU,IAAI;AAAA,IACvB;AAAA,IACA,MAAM,OAAO,MAAM,OAAO;AACxB,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAA8B,MAAM,MAAM;AAAA,QACpE,SAAS,aAAa,SAAS,EAAE,QAAQ,OAAO,CAAC;AAAA,MACnD,CAAC;AACD,aAAO,OAAU,IAAI;AAAA,IACvB;AAAA,IACA,MAAM,OAAO,IAAI,MAAM,OAAO;AAC5B,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAA6B,GAAG,IAAI,IAAI,EAAE,IAAI,MAAM;AAAA,QAC9E,SAAS,aAAa,SAAS,EAAE,QAAQ,OAAO,CAAC;AAAA,MACnD,CAAC;AACD,aAAO,OAAU,IAAI;AAAA,IACvB;AAAA,IACA,MAAM,MAAM,IAAI,MAAM,OAAO;AAC3B,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAA+B,GAAG,IAAI,IAAI,EAAE,IAAI,MAAM;AAAA,QAChF,SAAS,aAAa,SAAS,EAAE,QAAQ,WAAW,CAAC;AAAA,MACvD,CAAC;AACD,aAAO,OAAU,IAAI;AAAA,IACvB;AAAA,IACA,MAAM,OAAO,IAAI,OAAO;AACtB,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,OAAgC,GAAG,IAAI,IAAI,EAAE,IAAI;AAAA,QAC3E,SAAS,aAAa,SAAS,EAAE,QAAQ,WAAW,CAAC;AAAA,MACvD,CAAC;AACD,aAAO,OAAU,IAAI;AAAA,IACvB;AAAA,IACA,MAAM,WAAW,MAAM,OAAO;AAC5B,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK;AAAA,QAC1B,GAAG,IAAI;AAAA,QACP,EAAE,KAAK;AAAA,QACP,EAAE,SAAS,aAAa,SAAS,EAAE,QAAQ,SAAS,CAAC,EAAE;AAAA,MACzD;AACA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,UAAU,QAAQ;AACtB,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAA4B,GAAG,IAAI,WAAW,EAAE,OAAO,CAAC;AACpF,aAAO,MAAM,QAAQ,IAAI,IAAI,OAAO,KAAK;AAAA,IAC3C;AAAA,EACF;AACF;;;AF9DS;AAnBT,IAAM,aAAa,cAAsC,IAAI;AAEtD,SAAS,YAAY,EAAE,MAAM,SAAS,GAAiD;AAC5F,QAAM,QAAQ,QAAyB,MAAM;AAC3C,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,WAAO;AAAA,MACL;AAAA,MACA,MAAM,iBAAiB,IAAI;AAAA,MAC3B,SAAsC,UAAkB;AACtD,YAAI,SAAS,MAAM,IAAI,QAAQ;AAC/B,YAAI,CAAC,QAAQ;AACX,mBAAS,qBAAqB,MAAM,QAAQ;AAC5C,gBAAM,IAAI,UAAU,MAAM;AAAA,QAC5B;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,SAAO,oBAAC,WAAW,UAAX,EAAoB,OAAe,UAAS;AACtD;AAEO,SAAS,YAA6B;AAC3C,QAAM,MAAM,WAAW,UAAU;AACjC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,wEAAwE;AAClG,SAAO;AACT;AAGO,SAAS,eAA4C,UAAqC;AAC/F,QAAM,EAAE,SAAS,IAAI,UAAU;AAC/B,SAAO,QAAQ,MAAM,SAAY,QAAQ,GAAG,CAAC,UAAU,QAAQ,CAAC;AAClE;AAGO,SAAS,kBAAkB;AAChC,QAAM,EAAE,KAAK,IAAI,UAAU;AAC3B,SAAO,SAAS;AAAA,IACd,UAAU,CAAC,OAAO,QAAQ,UAAU;AAAA,IACpC,SAAS,MAAM,KAAK,SAAS;AAAA,IAC7B,WAAW,IAAI,KAAK;AAAA,EACtB,CAAC;AACH;AAGO,SAAS,eAAe,MAAc;AAC3C,QAAM,EAAE,KAAK,IAAI,UAAU;AAC3B,SAAO,SAAuB;AAAA,IAC5B,UAAU,CAAC,OAAO,QAAQ,SAAS,IAAI;AAAA,IACvC,SAAS,MAAM,KAAK,MAAM,IAAI;AAAA,IAC9B,WAAW,IAAI,KAAK;AAAA,IACpB,SAAS,CAAC,CAAC;AAAA,EACb,CAAC;AACH;;;AGlEA,SAAS,iBAAAC,gBAAe,cAAAC,aAAY,WAAW,UAAU,mBAAmC;AAyGnF,gBAAAC,YAAA;AA3FT,IAAM,cAAcC,eAAuC,IAAI;AAmBxD,SAAS,aAAa,EAAE,MAAM,SAAS,MAAM,UAAU,SAAS,GAAsB;AAC3F,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAyB,IAAI;AACrD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAqC,SAAS;AAE1E,QAAM,kBAAkB,YAAY,MAAM;AACxC,QAAI,UAAU;AACZ,aAAO,SAAS,OAAO;AAAA,IACzB,OAAO;AACL,gBAAU,iBAAiB;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,SAAS,YAAY,MAAM;AAC/B,YAAQ,MAAM;AACd,YAAQ,IAAI;AACZ,oBAAgB;AAAA,EAClB,GAAG,CAAC,SAAS,eAAe,CAAC;AAE7B,YAAU,MAAM;AACd,QAAI,SAAS;AAEb,UAAM,WAAW,oBAAoB,UAAU;AAC/C,QAAI,SAAU,SAAQ,IAAI,QAAQ;AAElC,UAAM,QAAQ,QAAQ,IAAI;AAC1B,QAAI,CAAC,OAAO;AACV,sBAAgB;AAChB;AAAA,IACF;AAEA,SACG,IAA0B,qBAAqB,EAC/C,KAAK,CAAC,QAAQ;AACb,UAAI,CAAC,OAAQ;AACb,cAAQ,IAAI,KAAK,OAAO;AACxB,gBAAU,eAAe;AAAA,IAC3B,CAAC,EACA,MAAM,MAAM;AACX,UAAI,CAAC,OAAQ;AACb,cAAQ,MAAM;AACd,sBAAgB;AAAA,IAClB,CAAC;AAEH,WAAO,MAAM;AACX,eAAS;AAAA,IACX;AAAA,EACF,GAAG,CAAC,MAAM,SAAS,YAAY,eAAe,CAAC;AAE/C,QAAM,QAAQ,MAAM,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC;AAE1C,QAAM,gBAAgB;AAAA,IACpB,CAAC,eAAmC;AAClC,UAAI,CAAC,WAAY,QAAO;AACxB,YAAM,WAAW,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU;AACrE,UAAI,SAAS,WAAW,EAAG,QAAO;AAElC,UAAI,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,QAAQ,EAAG,QAAO;AAChE,aAAO,SAAS,KAAK,CAAC,MAAM,MAAM,SAAS,CAAC,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC;AAAA,IAC3F;AAAA,IACA,CAAC,KAAK;AAAA,EACR;AAEA,QAAM,QAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,WAAW;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AAEA,SAAO,gBAAAD,KAAC,YAAY,UAAZ,EAAqB,OAAe,UAAS;AACvD;AAEO,SAAS,aAA+B;AAC7C,QAAM,MAAME,YAAW,WAAW;AAClC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,0EAA0E;AACpG,SAAO;AACT;;;ALjFU,gBAAAC,YAAA;AARH,SAAS,aAAa,EAAE,QAAQ,MAAM,SAAS,SAAS,GAAsB;AACnF,QAAM,cAAcC,SAAQ,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAC5D,QAAM,WAAW,OAAO,MAAM,YAAY,OAAO,IAAI;AAErD,SACE,gBAAAD,KAAC,uBAAoB,QAAQ,aAC3B,0BAAAA,KAAC,kBAAe,OAAO,eACrB,0BAAAA,KAAC,eAAY,MACX,0BAAAA,KAAC,gBAAa,MAAY,SAAkB,MAAM,OAAO,MAAM,UAC5D,UACH,GACF,GACF,GACF;AAEJ;;;AMtCA,SAAS,YAAAE,iBAAgB;AACzB,SAAS,OAAAC,MAAK,WAAAC,UAAS,SAAAC,cAAa;AACpC,SAAS,aAAa,sBAAsB;;;ACC5C,IAAM,gBAAgB,oBAAI,IAAI,CAAC,OAAO,OAAO,aAAa,aAAa,YAAY,cAAc,CAAC;AAE3F,SAAS,gBAAgB,MAA0B;AACxD,SAAO,CAAC,cAAc,IAAI,KAAK,IAAI,KAAK,KAAK,SAAS;AACxD;AAEO,SAAS,WAAW,MAAgD;AACzE,MAAI,KAAK,MAAO,QAAO,KAAK;AAE5B,SAAO,KAAK,KACT,QAAQ,MAAM,GAAG,EACjB,QAAQ,mBAAmB,OAAO,EAClC,QAAQ,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;AACzC;AAGO,SAAS,gBAAgB,QAAqC;AACnE,SAAO,OACJ,OAAO,eAAe,EACtB,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,WAAW,CAAC,GAAG,MAAM,EAAE,MAAM,UAAU,KAAK,EAAE;AACvF;AAGO,SAAS,mBAAmB,QAAwC;AACzE,SAAO,OAAO,OAAO,eAAe,EAAE,IAAI,CAAC,OAAO;AAAA,IAChD,OAAO,EAAE;AAAA,IACT,OAAO,WAAW,CAAC;AAAA,IACnB,MAAM,EAAE;AAAA,IACR,SAAS,EAAE;AAAA,EACb,EAAE;AACJ;AAGO,SAAS,WAAW,OAAgB,MAA0B;AACnE,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,QAAQ,QAAQ;AAAA,IACzB,KAAK;AACH,UAAI;AACF,eAAO,IAAI,KAAK,KAAe,EAAE,mBAAmB,OAAO;AAAA,MAC7D,QAAQ;AACN,eAAO,OAAO,KAAK;AAAA,MACrB;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO,IAAI,KAAK,aAAa,SAAS,EAAE,OAAO,YAAY,UAAU,MAAM,CAAC,EAAE,OAAO,OAAO,KAAK,CAAC;AAAA,IACpG,KAAK;AAEH,UAAI,SAAS,OAAO,UAAU,UAAU;AACtC,cAAM,MAAM;AACZ,eAAO,OAAO,IAAI,QAAQ,IAAI,SAAS,IAAI,aAAa,IAAI,OAAO,QAAG;AAAA,MACxE;AACA,aAAO,OAAO,KAAK;AAAA,IACrB;AACE,aAAO,OAAO,KAAK;AAAA,EACvB;AACF;;;AC7DA,SAAS,YAAAC,iBAAgC;AACzC,SAAS,OAAAC,MAAK,QAAQ,QAAAC,OAAM,OAAO,QAAQ,OAAO,QAAAC,aAAY;AAC9D,SAAS,kBAAkB,YAAAC,iBAAgB;;;ACF3C,SAAS,MAAM,SAAS,YAAY;AAKhC,SACE,OAAAC,MADF;AAFG,SAAS,cAAc,EAAE,QAAQ,GAAyB;AAC/D,SACE,qBAAC,QAAK,WAAU,UAAS,OAAM,UAAS,SAAQ,UAAS,MAAK,QAAO,KAAK,GACxE;AAAA,oBAAAA,KAAC,WAAQ,MAAK,MAAK;AAAA,IAClB,UACC,gBAAAA,KAAC,QAAK,OAAM,YAAW,UAAS,MAC7B,mBACH,IACE;AAAA,KACN;AAEJ;;;ACdA,SAAS,KAAK,SAAS,QAAAC,aAAY;AAgB7B,gBAAAC,MAOE,QAAAC,aAPF;AATC,SAAS,WAAW;AAAA,EACzB;AAAA,EACA,QAAQ;AACV,GAGG;AACD,SACE,gBAAAA,MAAC,OAAI,aAAY,OAAM,aAAY,WAAU,IAAG,UAAS,cAAa,MAAK,GAAG,GAC5E;AAAA,oBAAAD,KAAC,WAAQ,MAAK,MAAK,OAAM,WACtB,iBACH;AAAA,IACA,gBAAAA,KAACD,OAAA,EAAK,IAAI,GAAG,UAAS,MAAK,OAAM,WAC9B,iBAAO,WAAW,oBACrB;AAAA,IACC,OAAO,YACN,gBAAAE,MAACF,OAAA,EAAK,IAAI,GAAG,UAAS,MAAK,OAAM,WAAU;AAAA;AAAA,MAC7B,MAAM;AAAA,OACpB,IACE;AAAA,KACN;AAEJ;;;AFgCM,SAEI,OAAAG,MAFJ,QAAAC,aAAA;AAzCN,IAAM,YAAY;AAOX,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkB;AAChB,QAAM,CAAC,WAAW,YAAY,IAAIC,UAAS,CAAC;AAC5C,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,EAAE;AAC/C,QAAM,CAAC,MAAM,OAAO,IAAIA,UAA6B,MAAS;AAE9D,QAAM,QAAQC,UAAS;AAAA,IACrB,UAAU,CAAC,OAAO,QAAQ,aAAa,EAAE,WAAW,YAAY,KAAK,CAAC;AAAA,IACtE,SAAS,MAAM,SAAS,KAAK,EAAE,WAAW,UAAU,WAAW,YAAY,cAAc,QAAW,KAAK,CAAC;AAAA,IAC1G,iBAAiB;AAAA,EACnB,CAAC;AAED,QAAM,aAAa,CAAC,UAAkB;AACpC,iBAAa,CAAC;AACd,YAAQ,CAAC,SAAS;AAChB,UAAI,SAAS,GAAG,KAAK,OAAQ,QAAO,GAAG,KAAK;AAC5C,UAAI,SAAS,GAAG,KAAK,QAAS,QAAO;AACrC,aAAO,GAAG,KAAK;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,MAAM,MAAM;AAC/B,QAAM,OAAO,MAAM,MAAM,WAAW,CAAC;AAErC,SACE,gBAAAF,MAACG,MAAA,EACC;AAAA,oBAAAH,MAACI,OAAA,EAAK,IAAI,GAAG,KAAK,GAAG,OAAM,UACxB;AAAA,eACC,gBAAAL;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,MAAK;AAAA,UACL,aAAY;AAAA,UACZ,OAAO;AAAA,UACP,UAAU,CAAC,MAAM;AACf,yBAAa,CAAC;AACd,0BAAc,EAAE,OAAO,KAAK;AAAA,UAC9B;AAAA;AAAA,MACF,IACE;AAAA,MACJ,gBAAAA,KAAC,UAAO;AAAA,MACP;AAAA,MACA,WACC,gBAAAA,KAAC,UAAO,MAAK,MAAK,cAAa,QAAO,SAAS,UAAU,kBAEzD,IACE;AAAA,OACN;AAAA,IAEC,MAAM,YACL,gBAAAA,KAAC,iBAAc,IACb,MAAM,UACR,gBAAAA,KAAC,cAAW,OAAO,MAAM,OAAO,IAEhC,gBAAAA,KAACI,MAAA,EAAI,aAAY,OAAM,aAAY,YAAW,cAAa,MAAK,WAAU,QAAO,IAAG,SAClF,0BAAAH,MAAC,MAAM,MAAN,EAAW,MAAK,MAAK,aAAW,MAC/B;AAAA,sBAAAD,KAAC,MAAM,QAAN,EACC,0BAAAC,MAAC,MAAM,KAAN,EACE;AAAA,gBAAQ,IAAI,CAAC,QACZ,gBAAAA;AAAA,UAAC,MAAM;AAAA,UAAN;AAAA,YAEC,QAAQ,IAAI,WAAW,YAAY;AAAA,YACnC,SAAS,IAAI,WAAW,MAAM,WAAW,IAAI,KAAK,IAAI;AAAA,YAErD;AAAA,kBAAI,SAAS,IAAI;AAAA,cACjB,MAAM,WAAW,GAAG,IAAI,KAAK,GAAG,IAAK,KAAK,SAAS,MAAM,IAAI,YAAO,YAAQ;AAAA;AAAA;AAAA,UALxE,IAAI;AAAA,QAMX,CACD;AAAA,QACA,UAAU,WAAW,gBAAAD,KAAC,MAAM,cAAN,EAAmB,WAAU,OAAM,yBAAK,IAAwB;AAAA,SACzF,GACF;AAAA,MACA,gBAAAA,KAAC,MAAM,MAAN,EACE,eAAK,WAAW,IACf,gBAAAA,KAAC,MAAM,KAAN,EACC,0BAAAA,KAAC,MAAM,MAAN,EAAW,SAAS,QAAQ,SAAS,GACpC,0BAAAA,KAACM,OAAA,EAAK,OAAM,YAAW,IAAI,GAAG,WAAU,UAAS,yCAEjD,GACF,GACF,IAEA,KAAK,IAAI,CAAC,KAAK,QACb,gBAAAL,MAAC,MAAM,KAAN,EACE;AAAA,gBAAQ,IAAI,CAAC,QACZ,gBAAAD,KAAC,MAAM,MAAN,EAA4B,qBAAW,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAA/C,IAAI,KAA6C,CACnE;AAAA,QACA,UAAU,WACT,gBAAAA,KAAC,MAAM,MAAN,EAAW,WAAU,OACpB,0BAAAC,MAACI,OAAA,EAAK,KAAK,GAAG,SAAQ,OACnB;AAAA,mBACC,gBAAAL,KAAC,UAAO,MAAK,MAAK,SAAQ,SAAQ,SAAS,MAAM,OAAO,GAAG,GAAG,oBAE9D,IACE;AAAA,UACH,WACC,gBAAAA,KAAC,UAAO,MAAK,MAAK,SAAQ,SAAQ,cAAa,OAAM,SAAS,MAAM,SAAS,GAAG,GAAG,qBAEnF,IACE;AAAA,WACN,GACF,IACE;AAAA,WAnBW,IAAI,OAAkB,GAoBvC,CACD,GAEL;AAAA,OACF,GACF;AAAA,IAGD,aACC,gBAAAC,MAACI,OAAA,EAAK,IAAI,GAAG,OAAM,UAAS,KAAK,GAC/B;AAAA,sBAAAJ,MAACK,OAAA,EAAK,UAAS,MAAK,OAAM,YACvB;AAAA,mBAAW;AAAA,QAAW;AAAA,QAAuB,WAAW;AAAA,QAAY;AAAA,QAAK,WAAW;AAAA,SACvF;AAAA,MACA,gBAAAN,KAAC,UAAO;AAAA,MACR,gBAAAA,KAAC,UAAO,MAAK,MAAK,SAAQ,WAAU,UAAU,aAAa,GAAG,SAAS,MAAM,aAAa,CAAC,MAAM,IAAI,CAAC,GAAG,sBAEzG;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,UAAU,WAAW,eAAe,WAAW;AAAA,UAC/C,SAAS,MAAM,aAAa,CAAC,MAAM,IAAI,CAAC;AAAA,UACzC;AAAA;AAAA,MAED;AAAA,OACF,IACE;AAAA,KACN;AAEJ;;;AGrKA,SAAS,YAAAO,iBAAgC;AACzC,SAAS,OAAAC,MAAK,UAAAC,SAAQ,QAAAC,OAAM,WAAAC,UAAS,SAAAC,QAAO,OAAO,QAAAC,OAAM,oBAAoB;AA+DvE,gBAAAC,MAcc,QAAAC,aAdd;AAjDN,SAAS,OAAO,OAAe,MAAwB;AACrD,MAAI,UAAU,GAAI,QAAO;AACzB,MAAI,SAAS,YAAY,SAAS,cAAc,SAAS,oBAAqB,QAAO,OAAO,KAAK;AACjG,MAAI,SAAS,UAAW,QAAO,UAAU;AACzC,SAAO;AACT;AAEA,SAAS,aAAa,OAAgB,MAAuB;AAC3D,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,SAAS,UAAU,OAAO;AAC5B,QAAI;AACF,aAAO,IAAI,KAAK,KAAe,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,IAC5D,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,MAAM;AACZ,WAAO,OAAO,IAAI,OAAO,EAAE;AAAA,EAC7B;AACA,SAAO,OAAO,KAAK;AACrB;AAOO,SAAS,YAAY,EAAE,OAAO,QAAQ,eAAe,YAAY,OAAO,UAAU,SAAS,GAAqB;AACrH,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAiC,MAAM;AACjE,UAAM,OAA+B,CAAC;AACtC,eAAW,KAAK,OAAQ,MAAK,EAAE,KAAK,IAAI,aAAa,gBAAgB,EAAE,KAAK,GAAG,EAAE,IAAI;AACrF,WAAO;AAAA,EACT,CAAC;AAED,QAAM,WAAW,CAAC,MAAc,UAAkB,UAAU,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,EAAE;AAElG,QAAM,eAAe,CAAC,MAAiB;AACrC,MAAE,eAAe;AACjB,UAAM,UAAmC,CAAC;AAC1C,eAAW,KAAK,QAAQ;AACtB,YAAM,UAAU,OAAO,OAAO,EAAE,KAAK,KAAK,IAAI,EAAE,IAAI;AACpD,UAAI,YAAY,OAAW,SAAQ,EAAE,KAAK,IAAI;AAAA,IAChD;AACA,aAAS,OAAO;AAAA,EAClB;AAEA,SACE,gBAAAD,MAACE,MAAA,EAAI,aAAY,OAAM,aAAY,YAAW,cAAa,MAAK,IAAG,SAAQ,GAAG,GAAG,MAAK,SACpF;AAAA,oBAAAH,KAACI,UAAA,EAAQ,MAAK,MAAK,IAAI,GACpB,iBACH;AAAA,IACA,gBAAAJ,KAAC,UAAK,UAAU,cACd,0BAAAC,MAAC,SAAM,KAAK,GACT;AAAA,aAAO,IAAI,CAAC,MAAM;AACjB,cAAM,QAAQ,WAAW,EAAE,MAAM,EAAE,OAAO,OAAO,EAAE,MAAM,CAAC;AAC1D,YAAI,EAAE,SAAS,UAAU,EAAE,SAAS,QAAQ;AAC1C,iBACE,gBAAAA,MAACE,MAAA,EACC;AAAA,4BAAAH,KAACK,OAAA,EAAK,UAAS,MAAK,IAAI,GAAG,YAAW,UACnC,iBACH;AAAA,YACA,gBAAAJ,MAAC,aAAa,MAAb,EAAkB,MAAK,MACtB;AAAA,8BAAAA;AAAA,gBAAC,aAAa;AAAA,gBAAb;AAAA,kBACC,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,kBAC1B,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,EAAE,cAAc,KAAK;AAAA,kBAExD;AAAA,oCAAAD,KAAC,YAAO,OAAM,IAAG,oBAAC;AAAA,oBACjB,EAAE,QAAQ,IAAI,CAAC,QACd,gBAAAA,KAAC,YAAiB,OAAO,KACtB,iBADU,GAEb,CACD;AAAA;AAAA;AAAA,cACH;AAAA,cACA,gBAAAA,KAAC,aAAa,WAAb,EAAuB;AAAA,eAC1B;AAAA,eAjBQ,EAAE,KAkBZ;AAAA,QAEJ;AACA,YAAI,EAAE,SAAS,WAAW;AACxB,iBACE,gBAAAC,MAACE,MAAA,EACC;AAAA,4BAAAH,KAACK,OAAA,EAAK,UAAS,MAAK,IAAI,GAAG,YAAW,UACnC,iBACH;AAAA,YACA,gBAAAJ,MAAC,aAAa,MAAb,EAAkB,MAAK,MACtB;AAAA,8BAAAA;AAAA,gBAAC,aAAa;AAAA,gBAAb;AAAA,kBACC,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,kBAC1B,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,EAAE,cAAc,KAAK;AAAA,kBAExD;AAAA,oCAAAD,KAAC,YAAO,OAAM,IAAG,oBAAC;AAAA,oBAClB,gBAAAA,KAAC,YAAO,OAAM,QAAO,iBAAG;AAAA,oBACxB,gBAAAA,KAAC,YAAO,OAAM,SAAQ,oBAAG;AAAA;AAAA;AAAA,cAC3B;AAAA,cACA,gBAAAA,KAAC,aAAa,WAAb,EAAuB;AAAA,eAC1B;AAAA,eAdQ,EAAE,KAeZ;AAAA,QAEJ;AACA,cAAM,YACJ,EAAE,SAAS,SACP,SACA,EAAE,SAAS,YAAY,EAAE,SAAS,cAAc,EAAE,SAAS,sBACzD,WACA;AACR,eACE,gBAAAC,MAACE,MAAA,EACC;AAAA,0BAAAF,MAACI,OAAA,EAAK,UAAS,MAAK,IAAI,GAAG,YAAW,UACnC;AAAA;AAAA,YACA,EAAE,WAAW,OAAO;AAAA,aACvB;AAAA,UACA,gBAAAL;AAAA,YAACM;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,MAAM;AAAA,cACN,UAAU,EAAE;AAAA,cACZ,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,cAC1B,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,EAAE,cAAc,KAAK;AAAA;AAAA,UAC1D;AAAA,aAXQ,EAAE,KAYZ;AAAA,MAEJ,CAAC;AAAA,MAEA,QACC,gBAAAN,KAACK,OAAA,EAAK,UAAS,MAAK,OAAM,WACvB,iBACH,IACE;AAAA,MAEJ,gBAAAJ,MAACM,OAAA,EAAK,KAAK,GAAG,SAAQ,OAAM,IAAI,GAC9B;AAAA,wBAAAP,KAACQ,SAAA,EAAO,MAAK,MAAK,SAAQ,SAAQ,MAAK,UAAS,SAAS,UAAU,sBAEnE;AAAA,QACA,gBAAAR,KAACQ,SAAA,EAAO,MAAK,MAAK,cAAa,QAAO,MAAK,UAAS,SAAS,YAAY,oBAEzE;AAAA,SACF;AAAA,OACF,GACF;AAAA,KACF;AAEJ;;;ALnFmD,gBAAAC,MAuB3C,QAAAC,aAvB2C;AApC5C,SAAS,eAAe,EAAE,OAAO,OAAO,OAAO,WAAW,UAAU,SAAS,MAAM,aAAa,GAAwB;AAC7H,QAAM,cAAc,SAAS,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC;AAC7D,QAAM,cAAc,eAAe,cAAc,QAAQ,EAAE;AAG3D,QAAM,SAAS,YAAY;AAC3B,QAAM,WAAW,YAAY,QAAQ,YAAY,IAAI,MAAM,YAAY,CAAC;AACxE,QAAM,kBAAkB,YAAY,SAAS,gBAAgB,OAAO,MAAM,IAAI,CAAC;AAC/E,QAAM,eAAe,SAAS,SAAS,mBAAmB,OAAO,MAAM,IAAI,CAAC;AAE5E,QAAM,WAAW,eAAe,QAAQ;AACxC,QAAM,cAAc,eAAe;AACnC,QAAM,CAAC,WAAW,YAAY,IAAIC,UAAoB,EAAE,MAAM,MAAM,CAAC;AACrE,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAwB,IAAI;AAE9D,QAAM,aAAa,MAAM,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,QAAQ,EAAE,CAAC;AAE9F,QAAM,eAAe,YAAY;AAAA,IAC/B,YAAY,CAAC,WAAoC;AAC/C,YAAM,aAAa,UAAU,OAAO,UAAU,MAAM;AACpD,YAAM,KAAK,YAAY;AACvB,aAAO,KAAK,SAAS,OAAO,IAAI,MAAM,IAAI,SAAS,OAAO,MAAM;AAAA,IAClE;AAAA,IACA,WAAW,MAAM;AACf,mBAAa,EAAE,MAAM,MAAM,CAAC;AAC5B,mBAAa,IAAI;AACjB,iBAAW;AAAA,IACb;AAAA,IACA,SAAS,CAAC,QAAQ,aAAa,IAAI,OAAO;AAAA,EAC5C,CAAC;AAED,QAAM,iBAAiB,YAAY;AAAA,IACjC,YAAY,CAAC,QAAiC,SAAS,OAAO,IAAI,GAAa;AAAA,IAC/E,WAAW;AAAA,EACb,CAAC;AAED,MAAI,eAAe,YAAY,UAAW,QAAO,gBAAAF,KAAC,iBAAc;AAChE,MAAI,eAAe,YAAY,QAAS,QAAO,gBAAAA,KAAC,cAAW,OAAO,YAAY,OAAO;AAErF,QAAM,QAAQ,SAAS,QAAQ,QAAQ;AAEvC,SACE,gBAAAC,MAACE,QAAA,EAAM,KAAK,GACV;AAAA,oBAAAH,KAACI,UAAA,EAAQ,MAAK,MAAM,iBAAM;AAAA,IAEzB,UAAU,OACT,gBAAAJ;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,UAAU,MAAM,UAAU,KAAK,KAAK,QAAQ,KAAK;AAAA,QACxD,QAAQ;AAAA,QACR,eAAe,UAAU;AAAA,QACzB,YAAY,aAAa;AAAA,QACzB,OAAO;AAAA,QACP,UAAU,CAAC,WAAW,aAAa,OAAO,MAAM;AAAA,QAChD,UAAU,MAAM;AACd,uBAAa,EAAE,MAAM,MAAM,CAAC;AAC5B,uBAAa,IAAI;AAAA,QACnB;AAAA;AAAA,IACF,IAEA,gBAAAC,MAACI,MAAA,EACC;AAAA,sBAAAL;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,aAAa;AAAA,UACb,SAAS;AAAA,UACT,UAAU,MAAM,aAAa,EAAE,MAAM,KAAK,CAAC;AAAA,UAC3C,QAAQ,CAAC,QAAQ,aAAa,EAAE,MAAM,MAAM,IAAI,CAAC;AAAA,UACjD,UAAU,CAAC,QAAQ;AACjB,gBAAI,OAAO,QAAQ,wBAAwB,EAAG,gBAAe,OAAO,GAAG;AAAA,UACzE;AAAA;AAAA,MACF;AAAA,MACC,eAAe,OAA8E;AAAA,OAChG;AAAA,KAEJ;AAEJ;;;AMvFI,gBAAAM,YAAA;AAFG,SAAS,aAAa,EAAE,OAAO,OAAO,UAAU,SAAS,KAAK,GAAsB;AACzF,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,MAAM,WAAW,OAAO,SAAS;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;;;ACjCA,SAAS,OAAAC,MAAK,QAAAC,OAAM,WAAAC,UAAS,SAAAC,QAAO,QAAAC,aAAY;AAChD,SAAS,YAAAC,iBAAgB;AAmCkC,gBAAAC,OA6B7C,QAAAC,aA7B6C;AAZpD,SAAS,aAAa,EAAE,OAAO,OAAO,UAAU,aAAa,UAAU,QAAQ,WAAW,GAAsB;AACrH,QAAM,cAAc,eAAe,KAAK;AACxC,QAAM,SAAS,YAAY;AAC3B,QAAM,WAAW,YAAY,QAAQ,YAAY,IAAI,MAAM,YAAY,CAAC;AACxE,QAAM,WAAW,eAAe,QAAQ;AAExC,QAAM,YAAYC,UAAS;AAAA,IACzB,UAAU,CAAC,OAAO,YAAY,QAAQ;AAAA,IACtC,SAAS,MAAM,SAAS,KAAK,EAAE,UAAU,IAAI,CAAC;AAAA,IAC9C,SAAS,CAAC,CAAC;AAAA,EACb,CAAC;AAED,MAAI,YAAY,aAAa,UAAU,UAAW,QAAO,gBAAAF,MAAC,iBAAc;AACxE,MAAI,YAAY,QAAS,QAAO,gBAAAA,MAAC,cAAW,OAAO,YAAY,OAAO;AACtE,MAAI,UAAU,QAAS,QAAO,gBAAAA,MAAC,cAAW,OAAO,UAAU,OAAO;AAElE,QAAM,iBAAiB,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU;AACvE,QAAM,iBACJ,WACC,gBAAgB,WAAW,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,KAAK,OAAO,IAAI,EAAE,KAAK,CAAC;AAE9E,QAAM,QACJ,cAAc,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,GAAG,QAAQ,QAAQ,WAAW,CAAC,KAAK;AAElG,QAAM,OAAO,UAAU,MAAM,WAAW,CAAC;AACzC,QAAM,UAAU,oBAAI,IAAuC;AAC3D,aAAW,SAAS,eAAgB,SAAQ,IAAI,MAAM,IAAI,CAAC,CAAC;AAC5D,aAAW,OAAO,MAAM;AACtB,UAAM,MAAM,OAAO,IAAI,UAAU,KAAK,EAAE;AACxC,QAAI,CAAC,QAAQ,IAAI,GAAG,EAAG,SAAQ,IAAI,KAAK,CAAC,CAAC;AAC1C,YAAQ,IAAI,GAAG,EAAG,KAAK,GAAG;AAAA,EAC5B;AAEA,SACE,gBAAAC,MAACE,QAAA,EAAM,KAAK,GACV;AAAA,oBAAAH,MAACI,UAAA,EAAQ,MAAK,MAAM,mBAAS,QAAQ,QAAQ,OAAM;AAAA,IACnD,gBAAAJ,MAACK,OAAA,EAAK,KAAK,GAAG,OAAM,WAAU,WAAU,QAAO,IAAI,GAChD,gBAAM,KAAK,QAAQ,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM;AACvD,YAAM,aAAa,eAAe,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,GAAG,UAAU,WAAW;AACtF,aACE,gBAAAJ,MAACK,MAAA,EAAkB,MAAK,SAAQ,IAAG,YAAW,cAAa,MAAK,GAAG,GACjE;AAAA,wBAAAL,MAACI,OAAA,EAAK,OAAM,UAAS,SAAQ,iBAAgB,IAAI,GAC/C;AAAA,0BAAAL,MAACO,OAAA,EAAK,YAAW,YAAW,UAAS,MAClC,sBACH;AAAA,UACA,gBAAAP,MAACO,OAAA,EAAK,UAAS,MAAK,OAAM,YACvB,gBAAM,QACT;AAAA,WACF;AAAA,QACA,gBAAAP,MAACG,QAAA,EAAM,KAAK,GACT,gBAAM,IAAI,CAAC,KAAK,QACf,gBAAAH,MAACM,MAAA,EAAqC,IAAG,SAAQ,cAAa,MAAK,GAAG,GAAG,aAAY,OAAM,aAAY,YACrG,0BAAAN,MAACO,OAAA,EAAK,UAAS,MAAK,YAAW,UAC5B,qBAAW,IAAI,KAAK,GAAG,QAAQ,GAClC,KAHS,IAAI,OAAkB,GAIjC,CACD,GACH;AAAA,WAjBQ,OAkBV;AAAA,IAEJ,CAAC,GACH;AAAA,KACF;AAEJ;;;ACxFA,SAAS,OAAAC,MAAK,WAAAC,UAAS,YAAY,SAAAC,QAAO,QAAAC,aAAY;AACtD,SAAS,kBAAkB;AAoCrB,gBAAAC,OAaM,QAAAC,aAbN;AAvBC,SAAS,cAAc,EAAE,QAAQ,aAAa,UAAU,CAAC,EAAE,GAAuB;AACvF,QAAM,EAAE,SAAS,IAAI,UAAU;AAE/B,QAAM,UAAU,WAAW;AAAA,IACzB,SAAS,QACN,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,KAAK,EAC5C,IAAI,CAAC,OAAO;AAAA,MACX,UAAU,CAAC,OAAO,UAAU,EAAE,EAAE;AAAA,MAChC,SAAS,YAAY;AACnB,cAAM,IAAI,MAAM,SAAS,IAAI,EAAE,MAAO,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,QAAQ,MAAM,EAAE,CAAC;AACrG,YAAI,EAAE,SAAS,SAAS,EAAE,OAAO;AAC/B,iBAAO,EAAE,QAAQ,OAAO,CAAC,KAAK,QAAQ,MAAM,OAAQ,IAAgC,EAAE,KAAM,KAAK,CAAC,GAAG,CAAC;AAAA,QACxG;AACA,eAAO,EAAE,WAAW;AAAA,MACtB;AAAA,MACA,WAAW,KAAK;AAAA,IAClB,EAAE;AAAA,EACN,CAAC;AAED,MAAI,WAAW;AAEf,SACE,gBAAAA,MAACC,QAAA,EAAM,KAAK,GACV;AAAA,oBAAAF,MAACG,UAAA,EAAQ,MAAK,MAAM,iBAAM;AAAA,IAC1B,gBAAAH,MAAC,cAAW,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,EAAE,GAAG,KAAK,GAClD,kBAAQ,IAAI,CAAC,MAAM;AAClB,UAAI,EAAE,SAAS,YAAY,EAAE,QAAQ;AACnC,eACE,gBAAAA,MAACI,MAAA,EAAe,aAAY,OAAM,aAAY,YAAW,cAAa,MAAK,IAAG,SAAQ,GAAG,GACtF,YAAE,OAAO,KADF,EAAE,EAEZ;AAAA,MAEJ;AACA,YAAM,IAAI,QAAQ,UAAU;AAC5B,YAAM,QAAQ,GAAG,YAAY,WAAM,GAAG,UAAU,WAAM,aAAa,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK;AAC3F,aACE,gBAAAH,MAACG,MAAA,EAAe,aAAY,OAAM,aAAY,YAAW,cAAa,MAAK,IAAG,SAAQ,GAAG,GACvF;AAAA,wBAAAJ,MAACK,OAAA,EAAK,UAAS,MAAK,OAAM,YACvB,YAAE,OACL;AAAA,QACA,gBAAAL,MAACG,UAAA,EAAQ,MAAK,MAAK,IAAI,GACpB,iBACH;AAAA,WANQ,EAAE,EAOZ;AAAA,IAEJ,CAAC,GACH;AAAA,KACF;AAEJ;AAEA,SAAS,aAAa,OAAgB,MAAe,OAAwB;AAC3E,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAK,SAAS,SAAS,OAAO,YAAY,EAAE,SAAS,OAAO,KAAM,SAAS,OAAO;AAChF,WAAO,IAAI,KAAK,aAAa,SAAS,EAAE,OAAO,YAAY,UAAU,MAAM,CAAC,EAAE,OAAO,OAAO,KAAK,CAAC;AAAA,EACpG;AACA,SAAO,OAAO,KAAK;AACrB;;;ACjBQ,gBAAAG,aAAA;AAjCR,SAAS,KAAK,OAAuB;AACnC,SAAO,MACJ,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAC3B;AAEA,SAAS,OAAO,MAAiC;AAC/C,MAAI,KAAK,GAAI,QAAO,KAAK;AACzB,MAAI,KAAK,SAAS,YAAa,QAAO;AACtC,SAAO,KAAK,KAAK,KAAK;AACxB;AAEA,SAAS,SAAS,MAAiC;AACjD,MAAI,KAAK,KAAM,QAAO,KAAK;AAC3B,MAAI,KAAK,SAAS,YAAa,QAAO;AACtC,SAAO,IAAI,OAAO,IAAI,CAAC;AACzB;AAEA,SAAS,UAAU,MAAiC;AAClD,MAAI,KAAK,MAAO,QAAO,KAAK;AAC5B,MAAI,KAAK,SAAS,YAAa,QAAO;AACtC,SAAO,KAAK;AACd;AAGA,SAAS,WAAW,MAAyB;AAC3C,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK,cAAc;AACjB,YAAM,IAAI;AACV,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE;AAAA,UACT,MAAM,EAAE;AAAA,UACR,SAAS,EAAE;AAAA,UACX,MAAM,EAAE;AAAA,UACR,OAAO,UAAU,CAAC;AAAA,UAClB,cAAc,EAAE;AAAA;AAAA,MAClB;AAAA,IAEJ;AAAA,IACA,KAAK,YAAY;AACf,YAAM,IAAI;AACV,aAAO,gBAAAA,MAAC,gBAAa,OAAO,EAAE,OAAO,OAAO,UAAU,CAAC,GAAG,UAAU,EAAE,UAAU,aAAa,EAAE,aAAa;AAAA,IAC9G;AAAA,IACA,KAAK,YAAY;AACf,YAAM,IAAI;AACV,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,EAAE;AAAA,UACT,OAAO,UAAU,CAAC;AAAA,UAClB,YAAY,EAAE;AAAA,UACd,QAAQ,EAAE;AAAA;AAAA,MACZ;AAAA,IAEJ;AAAA,IACA,KAAK,aAAa;AAChB,YAAM,IAAI;AACV,aAAO,gBAAAA,MAAC,iBAAc,OAAO,UAAU,CAAC,GAAG,SAAS,EAAE,SAAS;AAAA,IACjE;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,YAAY,MAAmC;AACtD,SAAO;AAAA,IACL,MAAM,SAAS,IAAI;AAAA,IACnB,SAAS,WAAW,IAAI;AAAA,IACxB,aAAa,iBAAiB,OAAO,KAAK,cAAc;AAAA,EAC1D;AACF;AAEA,SAAS,WAAW,MAAsC;AACxD,SAAO;AAAA,IACL,OAAO,UAAU,IAAI;AAAA,IACrB,MAAM,SAAS,IAAI;AAAA,IACnB,MAAM,KAAK;AAAA,IACX,SAAS,KAAK;AAAA,IACd,aAAa,iBAAiB,OAAO,KAAK,cAAc;AAAA,EAC1D;AACF;AAOO,SAAS,gBAAgB,QAA8C;AAC5E,QAAM,SAAqB,CAAC;AAC5B,QAAM,OAAsB,CAAC;AAC7B,QAAM,YAAY,oBAAI,IAAY;AAElC,QAAM,YAAY,CAAC,UAAoB;AACrC,QAAI,UAAU,IAAI,MAAM,IAAI,EAAG;AAC/B,cAAU,IAAI,MAAM,IAAI;AACxB,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,aAAW,OAAO,OAAO,WAAW,CAAC,GAAG;AACtC,eAAW,SAAS,IAAI,UAAU,CAAC,EAAG,WAAU,KAAK;AACrD,eAAW,QAAQ,IAAI,QAAQ,CAAC,EAAG,MAAK,KAAK,IAAI;AACjD,eAAW,QAAQ,IAAI,SAAS,CAAC,GAAG;AAClC,gBAAU,YAAY,IAAI,CAAC;AAC3B,WAAK,KAAK,WAAW,IAAI,CAAC;AAAA,IAC5B;AAAA,EACF;AAEA,aAAW,QAAQ,OAAO,IAAI,SAAS,CAAC,GAAG;AACzC,cAAU,YAAY,IAAI,CAAC;AAC3B,SAAK,KAAK,WAAW,IAAI,CAAC;AAAA,EAC5B;AAEA,OAAK,KAAK,CAAC,GAAG,OAAO,EAAE,SAAS,QAAQ,EAAE,SAAS,IAAI;AACvD,SAAO,EAAE,QAAQ,KAAK;AACxB;;;AC1IA,SAAS,2BAA6C;;;ACAtD,SAAS,OAAAC,MAAK,UAAAC,SAAQ,QAAAC,OAAM,UAAAC,SAAQ,QAAAC,aAAY;AAChD,SAAS,cAAc;;;ACDvB,SAAS,OAAAC,MAAK,QAAAC,OAAM,OAAO,SAAAC,QAAO,QAAAC,aAAY;AAC9C,SAAS,eAAe;AAyBlB,SACc,OAAAC,OADd,QAAAC,aAAA;AApBN,SAAS,eAAe,OAAsD;AAC5E,QAAM,SAAS,oBAAI,IAA2B;AAC9C,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,WAAW;AAChC,QAAI,CAAC,OAAO,IAAI,OAAO,EAAG,QAAO,IAAI,SAAS,CAAC,CAAC;AAChD,WAAO,IAAI,OAAO,EAAG,KAAK,IAAI;AAAA,EAChC;AACA,SAAO,MAAM,KAAK,OAAO,QAAQ,CAAC;AACpC;AAMO,SAAS,QAAQ,EAAE,KAAK,KAAK,GAA+C;AACjF,QAAM,EAAE,cAAc,IAAI,WAAW;AACrC,QAAM,UAAU,KAAK,OAAO,CAAC,SAAS,cAAc,KAAK,WAAW,CAAC;AAErE,SACE,gBAAAA,MAACC,MAAA,EAAI,IAAG,OAAM,GAAE,SAAQ,MAAK,SAAQ,kBAAiB,OAAM,aAAY,YAAW,IAAI,GAAG,IAAI,GAAG,IAAG,SAClG;AAAA,oBAAAD,MAACE,OAAA,EAAK,OAAM,UAAS,KAAK,GAAG,IAAI,GAAG,IAAI,GACrC;AAAA,UAAI,OAAO,gBAAAH,MAAC,SAAM,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM,MAAK,QAAO,IAAK;AAAA,MAClE,gBAAAA,MAACI,OAAA,EAAK,YAAW,QAAO,UAAS,MAC9B,cAAI,MACP;AAAA,OACF;AAAA,IAEA,gBAAAJ,MAACK,QAAA,EAAM,KAAK,GACT,yBAAe,OAAO,EAAE,IAAI,CAAC,CAAC,SAAS,KAAK,MAC3C,gBAAAJ,MAACI,QAAA,EAA2B,KAAK,GAC9B;AAAA,gBACC,gBAAAL,MAACI,OAAA,EAAK,UAAS,MAAK,YAAW,YAAW,OAAM,YAAW,eAAc,aAAY,IAAI,GAAG,IAAI,GAC7F,mBACH,IACE;AAAA,MACH,MAAM,IAAI,CAAC,SACV,gBAAAJ,MAAC,WAAwB,IAAI,KAAK,MAAM,KAAK,KAAK,SAAS,KACxD,WAAC,EAAE,SAAS,MACX,gBAAAC;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,KAAK;AAAA,UACL,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,cAAa;AAAA,UACb,UAAS;AAAA,UACT,YAAY,WAAW,aAAa;AAAA,UACpC,IAAI,WAAW,YAAY;AAAA,UAC3B,OAAO,WAAW,aAAa;AAAA,UAC/B,QAAQ,EAAE,IAAI,WAAW,YAAY,UAAU;AAAA,UAE9C;AAAA,iBAAK;AAAA,YACN,gBAAAH,MAAC,UAAM,eAAK,OAAM;AAAA;AAAA;AAAA,MACpB,KAhBU,KAAK,IAkBnB,CACD;AAAA,SA1BS,WAAW,GA2BvB,CACD,GACH;AAAA,KACF;AAEJ;;;ADpDM,gBAAAM,OAQM,QAAAC,aARN;AALC,SAAS,oBAAoB,EAAE,KAAK,KAAK,GAA+C;AAC7F,QAAM,EAAE,MAAM,OAAO,IAAI,WAAW;AAEpC,SACE,gBAAAA,MAACC,OAAA,EAAK,OAAM,WAAU,MAAK,SAAQ,IAAG,WACpC;AAAA,oBAAAF,MAAC,WAAQ,KAAU,MAAY;AAAA,IAC/B,gBAAAC,MAACC,OAAA,EAAK,WAAU,UAAS,MAAK,KAAI,MAAM,GACtC;AAAA,sBAAAD,MAACC,OAAA,EAAK,IAAG,UAAS,OAAM,UAAS,IAAI,GAAG,IAAI,GAAG,mBAAkB,OAAM,aAAY,YAAW,IAAG,SAC/F;AAAA,wBAAAF,MAACG,OAAA,EAAK,UAAS,MAAK,OAAM,YACvB,cAAI,SAAS,IAAI,MACpB;AAAA,QACA,gBAAAH,MAACI,SAAA,EAAO;AAAA,QACP,OACC,gBAAAH,MAACC,OAAA,EAAK,OAAM,UAAS,KAAK,GACxB;AAAA,0BAAAF,MAACG,OAAA,EAAK,UAAS,MAAK,OAAM,YACvB,eAAK,MACR;AAAA,UACA,gBAAAH,MAACK,SAAA,EAAO,MAAK,MAAK,SAAQ,WAAU,SAAS,QAAQ,kBAErD;AAAA,WACF,IACE;AAAA,SACN;AAAA,MACA,gBAAAL,MAACM,MAAA,EAAI,IAAG,QAAO,MAAK,KAAI,GAAG,GAAG,MAAM,GAClC,0BAAAN,MAAC,UAAO,GACV;AAAA,OACF;AAAA,KACF;AAEJ;;;AErBmC,SAK1B,UAL0B,OAAAO,aAAA;AAT5B,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AACF,GAGG;AACD,QAAM,EAAE,QAAQ,cAAc,IAAI,WAAW;AAE7C,MAAI,WAAW,UAAW,QAAO,gBAAAA,MAAC,iBAAc;AAChD,MAAI,WAAW,kBAAmB,QAAO,gBAAAA,MAAC,iBAAc,SAAQ,kCAAiC;AACjG,MAAI,CAAC,cAAc,UAAU,GAAG;AAC9B,WAAO,gBAAAA,MAAC,iBAAc,SAAQ,0CAAmC;AAAA,EACnE;AACA,SAAO,gBAAAA,MAAA,YAAG,UAAS;AACrB;;;AHGqC,gBAAAC,aAAA;AAV9B,SAAS,gBAAgB,EAAE,KAAK,MAAM,QAAQ,SAAS,GAAgB;AAC5E,QAAM,eAAe,UAAU,qBAAqB;AAEpD,QAAM,eAA8B,OACjC,OAAO,CAAC,MAAM,EAAE,MAAM,EACtB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ,EAAE;AAEpD,QAAM,gBAA+B,OAClC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EACvB,IAAI,CAAC,MAAM;AACV,UAAM,UAAU,eAAe,gBAAAA,MAAC,cAAW,YAAY,EAAE,aAAc,YAAE,SAAQ,IAAgB,EAAE;AAEnG,WAAO,EAAE,SAAS,MAAM,EAAE,OAAO,MAAM,QAAQ,IAAI,EAAE,MAAM,EAAE,KAAK,QAAQ,OAAO,EAAE,GAAG,QAAQ;AAAA,EAChG,CAAC;AAEH,QAAM,OAAsB;AAAA,IAC1B,GAAG;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,SAAS,gBAAAA,MAAC,uBAAoB,KAAU,MAAY;AAAA,MACpD,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO,oBAAoB,IAAI;AACjC;;;ApBNM,gBAAAC,aAAA;AAvBC,SAAS,OAAO,EAAE,OAAO,GAAmC;AACjE,QAAM,EAAE,MAAM,SAAS,OAAO,IAAIC,SAAQ,MAAM;AAC9C,UAAMC,WAAU,mBAAmB,OAAO,IAAI,EAAE;AAChD,UAAM,WAAW,OAAO,MAAM,YAAY,OAAO,IAAI;AAErD,UAAMC,QAAO,iBAAiB;AAAA,MAC5B,KAAK,OAAO;AAAA,MACZ,OAAO,OAAO,IAAI;AAAA,MAClB,UAAU,MAAMD,SAAQ,IAAI;AAAA,MAC5B,gBAAgB,MAAM;AACpB,QAAAA,SAAQ,MAAM;AACd,YAAI,SAAU,QAAO,SAAS,OAAO;AAAA,MACvC;AAAA,IACF,CAAC;AAED,UAAM,EAAE,QAAQ,KAAK,IAAI,gBAAgB,MAAM;AAC/C,UAAME,UAAS,gBAAgB,EAAE,KAAK,OAAO,KAAK,MAAM,QAAQ,UAAU,OAAO,SAAS,CAAC;AAE3F,WAAO,EAAE,MAAAD,OAAM,SAAAD,UAAS,QAAAE,QAAO;AAAA,EACjC,GAAG,CAAC,MAAM,CAAC;AAEX,SACE,gBAAAJ,MAAC,gBAAa,QAAgB,MAAY,SACxC,0BAAAA,MAAC,kBAAe,QAAgB,GAClC;AAEJ;;;ADYM,gBAAAK,aAAA;AA9CN,SAAS,eAAe,QAA4B;AAClD,MAAI,CAAC,QAAQ,KAAK,GAAI,OAAM,IAAI,MAAM,wDAAkD;AACxF,MAAI,CAAC,QAAQ,KAAK,QAAS,OAAM,IAAI,MAAM,6DAAuD;AACpG;AAEA,SAAS,kBAAkB,QAA4B;AACrD,MAAI,OAAO,IAAI,MAAO,UAAS,QAAQ,OAAO,IAAI;AAClD,MAAI,OAAO,IAAI,SAAS;AACtB,QAAI,OAAO,SAAS,cAA+B,kBAAkB;AACrE,QAAI,CAAC,MAAM;AACT,aAAO,SAAS,cAAc,MAAM;AACpC,WAAK,MAAM;AACX,eAAS,KAAK,YAAY,IAAI;AAAA,IAChC;AACA,SAAK,OAAO,OAAO,IAAI;AAAA,EACzB;AACF;AAEA,SAAS,cAAc,QAA4B;AACjD,MAAI,OAAO,UAAU,8BAA8B,YAAY,KAAK,MAAM;AACxE,UAAM,OAAO,MAAM;AAAA,IAAC;AACpB,YAAQ,MAAM;AACd,YAAQ,QAAQ;AAChB,YAAQ,OAAO;AAAA,EACjB;AACF;AAUO,SAAS,MAAM,QAA4B;AAChD,iBAAe,MAAM;AACrB,oBAAkB,MAAM;AACxB,gBAAc,MAAM;AAEpB,QAAM,SAAS,OAAO,iBAAiB;AACvC,QAAM,KAAK,SAAS,eAAe,MAAM;AACzC,MAAI,CAAC,GAAI,OAAM,IAAI,MAAM,iCAAiC,MAAM,4BAAyB;AAEzF,aAAW,EAAE,EAAE;AAAA,IACb,gBAAAA,MAAC,cACC,0BAAAA,MAAC,UAAO,QAAgB,GAC1B;AAAA,EACF;AACF;AAGO,IAAM,eAAe,EAAE,MAAM;;;AyBD7B,SAAS,iBAAiB,UAA6B,SAA8C;AAC1G,QAAM,QAA6B,CAAC;AAEpC,aAAW,KAAK,SAAS,eAAe,CAAC,GAAG;AAC1C,UAAM,OAA0B;AAAA,MAC9B,MAAM;AAAA,MACN,OAAO,EAAE;AAAA,MACT,MAAM,EAAE,QAAQ;AAAA,MAChB,MAAM,EAAE;AAAA,MACR,OAAO,EAAE;AAAA,MACT,SAAS,EAAE;AAAA,IACb;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAEA,aAAW,KAAK,SAAS,aAAa,CAAC,GAAG;AACxC,UAAM,QAAQ,EAAE,SAAS,EAAE;AAC3B,QAAI,CAAC,MAAO;AACZ,UAAM,OAAwB;AAAA,MAC5B,MAAM;AAAA,MACN;AAAA,MACA,OAAO,EAAE,SAAS,EAAE;AAAA,MACpB,MAAM,EAAE;AAAA,MACR,YAAY,EAAE;AAAA,MACd,SAAS,EAAE;AAAA,IACb;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAEA,aAAW,KAAK,SAAS,aAAa,CAAC,GAAG;AACxC,UAAM,OAAwB;AAAA,MAC5B,MAAM;AAAA,MACN,OAAO,EAAE;AAAA,MACT,OAAO,EAAE;AAAA,MACT,MAAM,EAAE;AAAA,MACR,SAAS,EAAE;AAAA,MACX,UAAU,EAAE;AAAA,MACZ,aAAa,EAAE;AAAA,IACjB;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAEA,SAAO;AAAA,IACL,KAAK;AAAA,MACH,IAAI,SAAS;AAAA,MACb,MAAM,SAAS;AAAA,MACf,OAAO,SAAS;AAAA,IAClB;AAAA,IACA,KAAK;AAAA,MACH,SAAS,QAAQ;AAAA,MACjB,aAAa,QAAQ;AAAA,MACrB,kBAAkB,QAAQ;AAAA,MAC1B,eAAe,QAAQ,iBAAiB;AAAA,IAC1C;AAAA,IACA,MAAM,EAAE,MAAM,UAAU,YAAY,OAAO;AAAA,IAC3C,UAAU;AAAA,MACR,kBAAkB;AAAA,MAClB,sBAAsB;AAAA,MACtB,wBAAwB;AAAA,MACxB,4BAA4B;AAAA,IAC9B;AAAA,IACA,IAAI,EAAE,MAAM;AAAA,EACd;AACF;AASO,SAAS,kBAAkB,UAA6B,SAA0B;AACvF,QAAM,iBAAiB,UAAU,OAAO,CAAC;AAC3C;;;ACpHO,SAAS,qBAAqB,KAAyD;AAC5F,SAAO,EAAE,MAAM,cAAc,GAAG,IAAI;AACtC;AAEO,SAAS,mBAAmB,KAAqD;AACtF,SAAO,EAAE,MAAM,YAAY,GAAG,IAAI;AACpC;AAEO,SAAS,mBAAmB,KAAqD;AACtF,SAAO,EAAE,MAAM,YAAY,GAAG,IAAI;AACpC;AAEO,SAAS,gBAAgB,KAAuD;AACrF,SAAO,EAAE,MAAM,aAAa,GAAG,IAAI;AACrC;AAGO,SAAS,gBAAgB,KAA2B;AACzD,SAAO;AACT;;;ACjCA,SAAS,OAAO,OAAAC,MAAK,UAAAC,SAAQ,QAAAC,OAAM,WAAAC,UAAS,SAAAC,QAAO,QAAAC,aAAY;AAC/D,SAAS,eAAAC,oBAAmB;AA6BK,gBAAAC,OAO3B,QAAAC,cAP2B;AAT1B,SAAS,gBAAgB,EAAE,QAAQ,oBAAc,GAAyB;AAC/E,QAAM,EAAE,KAAK,IAAI,UAAU;AAC3B,QAAM,WAAW,gBAAgB;AAEjC,QAAM,YAAYC,aAAY;AAAA,IAC5B,YAAY,MACV,KAAK,KAAK,wCAAwC,CAAC,GAAG,EAAE,SAAS,EAAE,gBAAgB,cAAc,EAAE,CAAC;AAAA,EACxG,CAAC;AAED,MAAI,SAAS,UAAW,QAAO,gBAAAF,MAAC,iBAAc;AAC9C,MAAI,SAAS,QAAS,QAAO,gBAAAA,MAAC,cAAW,OAAO,SAAS,OAAO;AAEhE,QAAM,eAAgB,SAAS,MAAM,gBAAgB,CAAC;AAEtD,SACE,gBAAAC,OAACE,QAAA,EAAM,KAAK,GACV;AAAA,oBAAAF,OAACG,OAAA,EAAK,OAAM,UAAS,SAAQ,iBAC3B;AAAA,sBAAAJ,MAACK,UAAA,EAAQ,MAAK,MAAM,iBAAM;AAAA,MAC1B,gBAAAL,MAACM,SAAA,EAAO,MAAK,MAAK,SAAQ,WAAU,SAAS,UAAU,WAAW,SAAS,MAAM,UAAU,OAAO,GAAG,gCAErG;AAAA,OACF;AAAA,IACA,gBAAAN,MAACG,QAAA,EAAM,KAAK,GACT,uBAAa,WAAW,IACvB,gBAAAH,MAACO,OAAA,EAAK,OAAM,YAAW,iDAA6B,IAEpD,aAAa,IAAI,CAAC,IAAI,QACpB,gBAAAP;AAAA,MAACQ;AAAA,MAAA;AAAA,QAEC,aAAY;AAAA,QACZ,aAAY;AAAA,QACZ,cAAa;AAAA,QACb,IAAG;AAAA,QACH,GAAG;AAAA,QAEH,0BAAAP,OAACG,OAAA,EAAK,OAAM,UAAS,SAAQ,iBAC3B;AAAA,0BAAAJ,MAACO,OAAA,EAAK,YAAW,UAAU,aAAG,SAAS,GAAG,QAAQ,oBAAa;AAAA,UAC/D,gBAAAP,MAAC,SAAM,cAAc,GAAG,WAAW,SAAS,QAAQ,GAAG,WAAW,UAAU,UAAU,QACnF,aAAG,UAAU,UAChB;AAAA,WACF;AAAA;AAAA,MAZK,GAAG,MAAM,GAAG,QAAQ;AAAA,IAa3B,CACD,GAEL;AAAA,KACF;AAEJ;;;ACpEA,SAAS,UAAAS,SAAQ,QAAAC,OAAM,WAAAC,UAAS,SAAAC,QAAO,QAAAC,cAAY;AACnD,SAAS,eAAAC,cAAa,kBAAAC,uBAAsB;AA4BtC,SACE,OAAAC,OADF,QAAAC,cAAA;AAXC,SAAS,aAAa,EAAE,QAAQ,SAAS,QAAQ,gBAAgB,WAAW,WAAW,QAAQ,GAAsB;AAC1H,QAAM,EAAE,KAAK,IAAI,UAAU;AAC3B,QAAM,cAAcC,gBAAe;AAEnC,QAAM,cAAcC,aAAY;AAAA,IAC9B,YAAY,MAAM,KAAK,KAAK,GAAG,QAAQ,yBAAyB,CAAC,GAAG,EAAE,SAAS,EAAE,gBAAgB,cAAc,EAAE,CAAC;AAAA,IAClH,WAAW,MAAM,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,QAAQ,EAAE,CAAC;AAAA,EACxF,CAAC;AAED,SACE,gBAAAF,OAACG,QAAA,EAAM,KAAK,GACV;AAAA,oBAAAH,OAACI,OAAA,EAAK,OAAM,UAAS,SAAQ,iBAC3B;AAAA,sBAAAL,MAACM,UAAA,EAAQ,MAAK,MAAM,iBAAM;AAAA,MAC1B,gBAAAN,MAACO,SAAA,EAAO,MAAK,MAAK,cAAa,QAAO,SAAS,YAAY,WAAW,SAAS,MAAM,YAAY,OAAO,GAAG,sCAE3G;AAAA,OACF;AAAA,IACC,YAAY,UACX,gBAAAP,MAACQ,QAAA,EAAK,UAAS,MAAK,OAAM,WACvB,sBAAY,OAAO,SACtB,IACE;AAAA,IACJ,gBAAAR,MAAC,kBAAe,OAAc,OAAM,IAAG,MAAM,UAAU,SAAS,WAAW,UAAoB,SAAkB;AAAA,KACnH;AAEJ;;;AC3CA,SAAS,YAAAS,iBAAgB;AACzB,SAAS,OAAAC,OAAK,UAAAC,SAAQ,QAAAC,OAAM,WAAAC,UAAS,SAAAC,QAAO,SAAAC,QAAO,QAAAC,cAAY;AAC/D,SAAS,eAAAC,oBAAmB;AAwDtB,gBAAAC,OAEE,QAAAC,cAFF;AAjCC,SAAS,cAAc,EAAE,eAAe,QAAQ,cAAc,QAAQ,WAAW,kBAAkB,GAAuB;AAC/H,QAAM,EAAE,KAAK,IAAI,UAAU;AAC3B,QAAM,CAAC,UAAU,WAAW,IAAIC,UAA6B,CAAC,CAAC;AAC/D,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AAErC,QAAM,MAAMC,aAAY;AAAA,IACtB,YAAY,OAAO,YAAoB;AACrC,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK;AAAA,QAC1B;AAAA,QACA;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA,SAAS,EAAE,iBAAiB,UAAU;AAAA,QACxC;AAAA,QACA,EAAE,SAAS,EAAE,gBAAgB,YAAY,EAAE;AAAA,MAC7C;AACA,aAAO,KAAK,SAAS,KAAK,WAAW;AAAA,IACvC;AAAA,IACA,WAAW,CAAC,UAAU,YAAY,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,MAAM,aAAa,SAAS,MAAM,CAAC,CAAC;AAAA,EAC9F,CAAC;AAED,QAAM,OAAO,MAAM;AACjB,UAAM,OAAO,MAAM,KAAK;AACxB,QAAI,CAAC,KAAM;AACX,gBAAY,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC,CAAC;AAChE,aAAS,EAAE;AACX,QAAI,OAAO,IAAI;AAAA,EACjB;AAEA,SACE,gBAAAF,OAACG,QAAA,EAAM,KAAK,GAAG,MAAK,SAClB;AAAA,oBAAAJ,MAACK,UAAA,EAAQ,MAAK,MAAM,iBAAM;AAAA,IAC1B,gBAAAL,MAACM,OAAA,EAAI,aAAY,OAAM,aAAY,YAAW,cAAa,MAAK,IAAG,SAAQ,GAAG,GAAG,MAAK,SACpF,0BAAAL,OAACG,QAAA,EAAM,KAAK,GACT;AAAA,eAAS,WAAW,IACnB,gBAAAJ,MAACO,QAAA,EAAK,OAAM,YAAW,UAAS,MAAK,iDAErC,IAEA,SAAS,IAAI,CAAC,GAAG,QACf,gBAAAP,MAACQ,OAAA,EAAe,SAAS,EAAE,SAAS,SAAS,aAAa,cACxD,0BAAAR;AAAA,QAACM;AAAA,QAAA;AAAA,UACC,IAAI,EAAE,SAAS,SAAS,aAAa;AAAA,UACrC,OAAO,EAAE,SAAS,SAAS,UAAU;AAAA,UACrC,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,cAAa;AAAA,UACb,MAAK;AAAA,UACL,UAAS;AAAA,UAER,YAAE;AAAA;AAAA,MACL,KAXS,GAYX,CACD;AAAA,MAEF,IAAI,YACH,gBAAAN,MAACO,QAAA,EAAK,OAAM,YAAW,UAAS,MAAK,4BAErC,IACE;AAAA,MACH,IAAI,UACH,gBAAAP,MAACO,QAAA,EAAK,OAAM,WAAU,UAAS,MAC5B,cAAI,OAAO,SACd,IACE;AAAA,OACN,GACF;AAAA,IACA,gBAAAN,OAACO,OAAA,EAAK,KAAK,GACT;AAAA,sBAAAR;AAAA,QAACS;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO;AAAA,UACP,aAAY;AAAA,UACZ,UAAU,CAAC,MAAM,SAAS,EAAE,cAAc,KAAK;AAAA,UAC/C,WAAW,CAAC,MAAM;AAChB,gBAAI,EAAE,QAAQ,QAAS,MAAK;AAAA,UAC9B;AAAA;AAAA,MACF;AAAA,MACA,gBAAAT,MAACU,SAAA,EAAO,MAAK,MAAK,cAAa,QAAO,SAAS,MAAM,SAAS,IAAI,WAAW,oBAE7E;AAAA,OACF;AAAA,KACF;AAEJ;;;AC5FS,qBAAAC,WAAA,OAAAC,aAAA;AAVF,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,WAAW;AAAA,EACX;AACF,GAIG;AACD,QAAM,EAAE,cAAc,IAAI,WAAW;AACrC,SAAO,gBAAAA,MAAAD,WAAA,EAAG,wBAAc,UAAU,IAAI,WAAW,UAAS;AAC5D;","names":["useMemo","axios","axios","useMemo","createContext","useContext","jsx","createContext","useContext","jsx","useMemo","useState","Box","Heading","Stack","useState","Box","Flex","Text","useQuery","jsx","Text","jsx","jsxs","jsx","jsxs","useState","useQuery","Box","Flex","Text","useState","Box","Button","Flex","Heading","Input","Text","jsx","jsxs","useState","Box","Heading","Text","Input","Flex","Button","jsx","jsxs","useState","Stack","Heading","Box","jsx","Box","Flex","Heading","Stack","Text","useQuery","jsx","jsxs","useQuery","Stack","Heading","Flex","Box","Text","Box","Heading","Stack","Text","jsx","jsxs","Stack","Heading","Box","Text","jsx","Box","Button","Flex","Spacer","Text","Box","Flex","Stack","Text","jsx","jsxs","Box","Flex","Text","Stack","jsx","jsxs","Flex","Text","Spacer","Button","Box","jsx","jsx","jsx","useMemo","storage","http","router","jsx","Box","Button","Flex","Heading","Stack","Text","useMutation","jsx","jsxs","useMutation","Stack","Flex","Heading","Button","Text","Box","Button","Flex","Heading","Stack","Text","useMutation","useQueryClient","jsx","jsxs","useQueryClient","useMutation","Stack","Flex","Heading","Button","Text","useState","Box","Button","Flex","Heading","Input","Stack","Text","useMutation","jsx","jsxs","useState","useMutation","Stack","Heading","Box","Text","Flex","Input","Button","Fragment","jsx"]}
|
|
1
|
+
{"version":3,"sources":["../src/start.tsx","../src/app/OonApp.tsx","../src/api/createRestClient.ts","../src/api/errorNormalizer.ts","../src/security/tokenStorage.ts","../src/app/OonProviders.tsx","../src/config/queryClient.ts","../src/config/theme.ts","../src/api/ApiProvider.tsx","../src/api/coreClient.ts","../src/api/resourceClient.ts","../src/security/AuthProvider.tsx","../src/components/CoreCollection.tsx","../src/components/internal/fieldUtils.ts","../src/components/internal/DataGrid.tsx","../src/shell/LoadingScreen.tsx","../src/shell/ErrorState.tsx","../src/components/internal/DynamicForm.tsx","../src/components/CoreDocument.tsx","../src/components/CorePipeline.tsx","../src/components/CoreDashboard.tsx","../src/app/moduleRegistry.tsx","../src/app/createOonRouter.tsx","../src/shell/AuthenticatedLayout.tsx","../src/shell/Sidebar.tsx","../src/security/RouteGuard.tsx","../src/manifest.ts","../src/define/views.ts","../src/components/CoreIntegration.tsx","../src/components/CoreCurrency.tsx","../src/components/CoreAssistant.tsx","../src/security/PermissionGate.tsx"],"sourcesContent":["import { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport type { OonCoreFrontConfig } from \"./types\";\nimport { OonApp } from \"./app/OonApp\";\n\nfunction validateConfig(config: OonCoreFrontConfig) {\n if (!config?.app?.id) throw new Error(\"oonCoreFront.start: config.app.id é obrigatório.\");\n if (!config?.api?.baseUrl) throw new Error(\"oonCoreFront.start: config.api.baseUrl é obrigatório.\");\n}\n\nfunction applyDocumentMeta(config: OonCoreFrontConfig) {\n if (config.app.title) document.title = config.app.title;\n if (config.app.favicon) {\n let link = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]');\n if (!link) {\n link = document.createElement(\"link\");\n link.rel = \"icon\";\n document.head.appendChild(link);\n }\n link.href = config.app.favicon;\n }\n}\n\nfunction hardenConsole(config: OonCoreFrontConfig) {\n if (config.security?.disableConsoleInProduction && import.meta.env?.PROD) {\n const noop = () => {};\n console.log = noop;\n console.debug = noop;\n console.info = noop;\n }\n}\n\n/**\n * Ponto de entrada único de uma Central (Seção 3.2). O `main.tsx` da Central\n * só chama isto — não conhece providers, router, auth, layout nem serviços.\n *\n * import { start } from \"@oondemand/oon-core-front\";\n * import { appConfig } from \"./central.ui\";\n * start(appConfig);\n */\nexport function start(config: OonCoreFrontConfig) {\n validateConfig(config);\n applyDocumentMeta(config);\n hardenConsole(config);\n\n const rootId = config.rootElementId ?? \"root\";\n const el = document.getElementById(rootId);\n if (!el) throw new Error(`oonCoreFront.start: elemento #${rootId} não encontrado no DOM.`);\n\n createRoot(el).render(\n <StrictMode>\n <OonApp config={config} />\n </StrictMode>\n );\n}\n\n/** Alias namespaced, compatível com a doc (`oonCoreFront.start`). */\nexport const oonCoreFront = { start };\n","import { useMemo } from \"react\";\nimport { RouterProvider } from \"react-router-dom\";\nimport type { OonCoreFrontConfig } from \"../types\";\nimport { createRestClient } from \"../api/createRestClient\";\nimport { createTokenStorage } from \"../security/tokenStorage\";\nimport { OonProviders } from \"./OonProviders\";\nimport { resolveRegistry } from \"./moduleRegistry\";\nimport { createOonRouter } from \"./createOonRouter\";\n\n/**\n * Raiz da aplicação Core. Cria o cliente REST (com token storage + 401),\n * resolve o registry de rotas/menu e monta providers + router.\n */\nexport function OonApp({ config }: { config: OonCoreFrontConfig }) {\n const { http, storage, router } = useMemo(() => {\n const storage = createTokenStorage(config.app.id);\n const loginUrl = config.auth?.loginUrl ?? config.api.meusAppsUrl;\n\n const http = createRestClient({\n api: config.api,\n appId: config.app.id,\n getToken: () => storage.get(),\n onUnauthorized: () => {\n storage.clear();\n if (loginUrl) window.location.href = loginUrl;\n },\n });\n\n const { routes, menu } = resolveRegistry(config);\n const router = createOonRouter({ app: config.app, menu, routes, security: config.security });\n\n return { http, storage, router };\n }, [config]);\n\n return (\n <OonProviders config={config} http={http} storage={storage}>\n <RouterProvider router={router} />\n </OonProviders>\n );\n}\n","import axios, { type AxiosInstance } from \"axios\";\nimport type { AuditContext, OonApiConfig } from \"../types\";\nimport { normalizeError } from \"./errorNormalizer\";\n\nexport interface RestClientDeps {\n api: OonApiConfig;\n /** Lê o token atual (Bearer). Retorna null se não autenticado. */\n getToken: () => string | null;\n /** Chamado uma vez ao receber 401 (logout + redirect). */\n onUnauthorized?: () => void;\n /** Origem app id, vai no header x-oon-app. */\n appId?: string;\n}\n\n/**\n * Cliente REST único do Core (Seção 2.5). Centraliza:\n * - baseUrl + versionPrefix;\n * - injeção de Bearer token;\n * - headers de auditoria x-oon-* nas mutações;\n * - tratamento global de 401 e normalização de erro.\n *\n * Nenhuma página de domínio deve instanciar axios diretamente.\n */\nexport function createRestClient(deps: RestClientDeps): AxiosInstance {\n const { api, getToken, onUnauthorized, appId } = deps;\n const prefix = api.versionPrefix ?? \"\";\n\n const instance = axios.create({\n baseURL: `${api.baseUrl.replace(/\\/$/, \"\")}${prefix}`,\n timeout: api.timeout ?? 30000,\n });\n\n instance.interceptors.request.use((config) => {\n // Em interceptors do axios v1, config.headers já é um AxiosHeaders.\n const token = getToken();\n if (token) config.headers.Authorization = `Bearer ${token}`;\n if (appId) config.headers[\"x-oon-app\"] = appId;\n return config;\n });\n\n instance.interceptors.response.use(\n (res) => res,\n (error) => {\n const normalized = normalizeError(error);\n if (normalized.status === 401) onUnauthorized?.();\n return Promise.reject(normalized);\n }\n );\n\n return instance;\n}\n\n/** Monta os headers de auditoria x-oon-* a partir do contexto. */\nexport function auditHeaders(audit?: AuditContext): Record<string, string> {\n if (!audit) return {};\n const headers: Record<string, string> = {};\n if (audit.origem) headers[\"x-oon-origin\"] = audit.origem;\n if (audit.module) headers[\"x-oon-module\"] = audit.module;\n if (audit.entity) headers[\"x-oon-entity\"] = audit.entity;\n return headers;\n}\n","import axios from \"axios\";\nimport type { OonError } from \"../types\";\n\n/**\n * Normaliza qualquer erro de rede/axios para o formato `OonError`, lendo o\n * envelope de erro padrão do back (`{ message }` ou `{ error: {...} }`).\n */\nexport function normalizeError(err: unknown): OonError {\n if (axios.isAxiosError(err)) {\n const status = err.response?.status;\n const data = err.response?.data as\n | { message?: string; error?: { code?: string; message?: string; details?: unknown; requestId?: string } }\n | undefined;\n\n const envelope = data?.error;\n return {\n code: envelope?.code || codeFromStatus(status),\n message: envelope?.message || data?.message || err.message || \"Erro inesperado.\",\n status,\n details: envelope?.details,\n requestId: envelope?.requestId || (err.response?.headers?.[\"x-request-id\"] as string | undefined),\n };\n }\n\n if (err instanceof Error) {\n return { code: \"UNKNOWN\", message: err.message };\n }\n\n return { code: \"UNKNOWN\", message: \"Erro inesperado.\" };\n}\n\nfunction codeFromStatus(status?: number): string {\n switch (status) {\n case 400:\n return \"VALIDATION_ERROR\";\n case 401:\n return \"UNAUTHORIZED\";\n case 403:\n return \"FORBIDDEN\";\n case 404:\n return \"NOT_FOUND\";\n case 409:\n return \"CONFLICT\";\n default:\n return status && status >= 500 ? \"SERVER_ERROR\" : \"REQUEST_ERROR\";\n }\n}\n","/**\n * Armazenamento de token encapsulado (Seção 6.2). Toda leitura/escrita de\n * token passa por aqui — nada de `localStorage.getItem('token')` espalhado.\n * Tudo com try/catch para JSON/localStorage inválido não derrubar a tela.\n */\nconst STORAGE_KEY = \"oon.auth.token\";\n\nexport interface TokenStorage {\n get(): string | null;\n set(token: string): void;\n clear(): void;\n}\n\nexport function createTokenStorage(namespace?: string): TokenStorage {\n const key = namespace ? `${STORAGE_KEY}.${namespace}` : STORAGE_KEY;\n\n return {\n get() {\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n },\n set(token: string) {\n try {\n window.localStorage.setItem(key, token);\n } catch {\n /* storage indisponível (modo privado) — ignora silenciosamente. */\n }\n },\n clear() {\n try {\n window.localStorage.removeItem(key);\n } catch {\n /* noop */\n }\n },\n };\n}\n\n/**\n * Lê o token vindo do SSO via query string (?code=...) e remove da URL para\n * não vazar em histórico/logs. Retorna o token capturado, se houver.\n */\nexport function captureTokenFromUrl(tokenParam = \"code\"): string | null {\n try {\n const url = new URL(window.location.href);\n const token = url.searchParams.get(tokenParam);\n if (!token) return null;\n url.searchParams.delete(tokenParam);\n window.history.replaceState({}, document.title, url.pathname + url.search + url.hash);\n return token;\n } catch {\n return null;\n }\n}\n","import { type ReactNode, useMemo } from \"react\";\nimport { ChakraProvider } from \"@chakra-ui/react\";\nimport { QueryClientProvider } from \"@tanstack/react-query\";\nimport type { AxiosInstance } from \"axios\";\nimport type { OonCoreFrontConfig } from \"../types\";\nimport { createOonQueryClient } from \"../config/queryClient\";\nimport { createOonSystem } from \"../config/theme\";\nimport { ApiProvider } from \"../api/ApiProvider\";\nimport { AuthProvider } from \"../security/AuthProvider\";\nimport type { TokenStorage } from \"../security/tokenStorage\";\n\nexport interface OonProvidersProps {\n config: OonCoreFrontConfig;\n http: AxiosInstance;\n storage: TokenStorage;\n children: ReactNode;\n}\n\n/**\n * Monta, em ordem (Seção 3.3), todos os providers globais. Nenhuma Central\n * cliente deve montar QueryClient/Chakra/Auth/Api manualmente.\n *\n * Ordem: QueryClient -> Chakra -> Api -> Auth -> (Router, montado fora).\n */\nexport function OonProviders({ config, http, storage, children }: OonProvidersProps) {\n const queryClient = useMemo(() => createOonQueryClient(), []);\n const system = useMemo(() => createOonSystem(config.theme), [config.theme]);\n const loginUrl = config.auth?.loginUrl ?? config.api.meusAppsUrl;\n\n return (\n <QueryClientProvider client={queryClient}>\n <ChakraProvider value={system}>\n <ApiProvider http={http}>\n <AuthProvider http={http} storage={storage} auth={config.auth} loginUrl={loginUrl}>\n {children}\n </AuthProvider>\n </ApiProvider>\n </ChakraProvider>\n </QueryClientProvider>\n );\n}\n","import { QueryClient } from \"@tanstack/react-query\";\n\n/** QueryClient padrão do Core, com defaults conservadores para telas admin. */\nexport function createOonQueryClient(): QueryClient {\n return new QueryClient({\n defaultOptions: {\n queries: {\n retry: 1,\n refetchOnWindowFocus: false,\n staleTime: 30 * 1000,\n },\n mutations: {\n retry: 0,\n },\n },\n });\n}\n","import { createSystem, defaultConfig, defineConfig, mergeConfigs } from \"@chakra-ui/react\";\nimport type { OonCoreFrontConfig } from \"../types\";\n\n/**\n * Paleta `brand` oondemand (portada de cst-multimoedas-frontend/styles/theming.js).\n * É o que dá à Central gerada o mesmo visual do projeto raiz: azul oondemand no\n * sidebar, estados ativos, botões e acentos — em vez do azul padrão do Chakra.\n */\nexport const brandColors = {\n brand: {\n 25: { value: \"#F5FBFF\" },\n 50: { value: \"#F0F7FF\" },\n 75: { value: \"#E6F2FF\" },\n 100: { value: \"#C7E3FF\" },\n 200: { value: \"#6CBCE8\" },\n 300: { value: \"#3FA6E0\" },\n 350: { value: \"#0F8DD0\" },\n 400: { value: \"#0580B9\" },\n 500: { value: \"#0474AF\" },\n 600: { value: \"#036491\" },\n 700: { value: \"#014364\" },\n 800: { value: \"#034167\" },\n 850: { value: \"#021D42\" },\n 900: { value: \"#011225\" },\n },\n} as const;\n\n/** Config base do Core: paleta brand + `colorPalette` default = brand. */\nconst oonThemeConfig = defineConfig({\n theme: {\n tokens: {\n colors: brandColors,\n },\n semanticTokens: {\n colors: {\n brand: {\n solid: { value: \"{colors.brand.500}\" },\n contrast: { value: \"white\" },\n fg: { value: \"{colors.brand.700}\" },\n muted: { value: \"{colors.brand.50}\" },\n subtle: { value: \"{colors.brand.75}\" },\n emphasized: { value: \"{colors.brand.600}\" },\n focusRing: { value: \"{colors.brand.500}\" },\n },\n },\n },\n },\n});\n\n/**\n * Constrói o `system` do Chakra para o Core. Parte do `defaultConfig`, aplica a\n * identidade oondemand e, por último, mescla qualquer override vindo de\n * `config.theme` (uma Central pode trocar a paleta sem reescrever o shell).\n */\nexport function createOonSystem(themeOverride?: OonCoreFrontConfig[\"theme\"]) {\n const base = mergeConfigs(defaultConfig, oonThemeConfig);\n const config = themeOverride\n ? mergeConfigs(base, defineConfig(themeOverride as Parameters<typeof defineConfig>[0]))\n : base;\n return createSystem(config);\n}\n\n/** System pronto com a identidade padrão (sem overrides). */\nexport const oonSystem = createOonSystem();\n","import { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport type { AxiosInstance } from \"axios\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { ModelSummary } from \"../types\";\nimport { createCoreClient, type CoreClient } from \"./coreClient\";\nimport { createResourceClient, type ResourceClient } from \"./resourceClient\";\n\ninterface ApiContextValue {\n http: AxiosInstance;\n core: CoreClient;\n resource: <T = Record<string, unknown>>(basePath: string) => ResourceClient<T>;\n}\n\nconst ApiContext = createContext<ApiContextValue | null>(null);\n\nexport function ApiProvider({ http, children }: { http: AxiosInstance; children: ReactNode }) {\n const value = useMemo<ApiContextValue>(() => {\n const cache = new Map<string, ResourceClient>();\n return {\n http,\n core: createCoreClient(http),\n resource<T = Record<string, unknown>>(basePath: string) {\n let client = cache.get(basePath);\n if (!client) {\n client = createResourceClient(http, basePath);\n cache.set(basePath, client);\n }\n return client as ResourceClient<T>;\n },\n };\n }, [http]);\n\n return <ApiContext.Provider value={value}>{children}</ApiContext.Provider>;\n}\n\nexport function useOonApi(): ApiContextValue {\n const ctx = useContext(ApiContext);\n if (!ctx) throw new Error(\"useOonApi deve ser usado dentro de <ApiProvider> (oonCoreFront.start).\");\n return ctx;\n}\n\n/** Cliente de um recurso, memoizado pelo basePath. */\nexport function useOonResource<T = Record<string, unknown>>(basePath: string): ResourceClient<T> {\n const { resource } = useOonApi();\n return useMemo(() => resource<T>(basePath), [resource, basePath]);\n}\n\n/** Metadata completa do back (cache de 5 min). */\nexport function useCoreMetadata() {\n const { core } = useOonApi();\n return useQuery({\n queryKey: [\"oon\", \"core\", \"metadata\"],\n queryFn: () => core.metadata(),\n staleTime: 5 * 60 * 1000,\n });\n}\n\n/** Descrição de uma model específica — base do modo \"dynamic\". */\nexport function useModelSchema(name: string) {\n const { core } = useOonApi();\n return useQuery<ModelSummary>({\n queryKey: [\"oon\", \"core\", \"model\", name],\n queryFn: () => core.model(name),\n staleTime: 5 * 60 * 1000,\n enabled: !!name,\n });\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { CoreMetadata, ModelSummary } from \"../types\";\n\n/**\n * SDK do contrato /core/* (introspecção dirigida por metadata). É o que\n * permite o modo \"dynamic\" das coleções: o front monta grid/form/rotas a\n * partir do que o back descreve, sem código de UI por entidade.\n */\nexport interface CoreClient {\n metadata(): Promise<CoreMetadata>;\n models(): Promise<ModelSummary[]>;\n model(name: string): Promise<ModelSummary>;\n permissions(): Promise<Array<{ resource: string; action: string; roles: string[] }>>;\n menus(): Promise<CoreMetadata[\"menus\"]>;\n}\n\nexport function createCoreClient(http: AxiosInstance): CoreClient {\n return {\n async metadata() {\n const { data } = await http.get<CoreMetadata>(\"/core/metadata\");\n return data;\n },\n async models() {\n const { data } = await http.get<{ results: ModelSummary[] }>(\"/core/models\");\n return data.results;\n },\n async model(name) {\n const { data } = await http.get<ModelSummary>(`/core/models/${name}`);\n return data;\n },\n async permissions() {\n const { data } = await http.get<{ results: Array<{ resource: string; action: string; roles: string[] }> }>(\n \"/core/permissions\"\n );\n return data.results;\n },\n async menus() {\n const { data } = await http.get<{ results: CoreMetadata[\"menus\"] }>(\"/core/menus\");\n return data.results;\n },\n };\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AuditContext, ListParams, PaginatedResult } from \"../types\";\nimport { auditHeaders } from \"./createRestClient\";\n\n/**\n * SDK por recurso (Seção 2.5). Espelha o CRUD gerado pelo back em `basePath`:\n * GET / -> list (paginado)\n * GET /:id -> get\n * POST / -> create\n * PUT /:id -> update\n * PATCH /:id -> patch\n * DELETE /:id -> delete\n * POST /import -> importMany\n * GET /export -> exportAll\n *\n * O back devolve registro único na chave do singular (`{ [singular]: {...} }`);\n * `unwrap` extrai o primeiro valor não-meta para o consumidor não precisar\n * conhecer o singular.\n */\nexport interface ResourceClient<T = Record<string, unknown>> {\n list(params?: ListParams): Promise<PaginatedResult<T>>;\n get(id: string): Promise<T>;\n create(body: Partial<T>, audit?: AuditContext): Promise<T>;\n update(id: string, body: Partial<T>, audit?: AuditContext): Promise<T>;\n patch(id: string, body: Partial<T>, audit?: AuditContext): Promise<T>;\n delete(id: string, audit?: AuditContext): Promise<T>;\n importMany(rows: unknown[], audit?: AuditContext): Promise<{ inserted?: number; [k: string]: unknown }>;\n exportAll(params?: ListParams): Promise<T[]>;\n}\n\nconst META_KEYS = new Set([\"pagination\", \"results\", \"message\", \"requestId\"]);\n\nfunction unwrap<T>(data: Record<string, unknown>): T {\n // resposta tipo { pessoa: {...} } — pega o primeiro valor de objeto.\n for (const [key, value] of Object.entries(data)) {\n if (!META_KEYS.has(key) && value && typeof value === \"object\") {\n return value as T;\n }\n }\n return data as T;\n}\n\nexport function createResourceClient<T = Record<string, unknown>>(\n http: AxiosInstance,\n basePath: string\n): ResourceClient<T> {\n const base = `/${basePath.replace(/^\\/+/, \"\")}`;\n\n return {\n async list(params) {\n const { data } = await http.get<PaginatedResult<T>>(base, { params });\n return data;\n },\n async get(id) {\n const { data } = await http.get<Record<string, unknown>>(`${base}/${id}`);\n return unwrap<T>(data);\n },\n async create(body, audit) {\n const { data } = await http.post<Record<string, unknown>>(base, body, {\n headers: auditHeaders(audit ?? { origem: \"form\" }),\n });\n return unwrap<T>(data);\n },\n async update(id, body, audit) {\n const { data } = await http.put<Record<string, unknown>>(`${base}/${id}`, body, {\n headers: auditHeaders(audit ?? { origem: \"form\" }),\n });\n return unwrap<T>(data);\n },\n async patch(id, body, audit) {\n const { data } = await http.patch<Record<string, unknown>>(`${base}/${id}`, body, {\n headers: auditHeaders(audit ?? { origem: \"datagrid\" }),\n });\n return unwrap<T>(data);\n },\n async delete(id, audit) {\n const { data } = await http.delete<Record<string, unknown>>(`${base}/${id}`, {\n headers: auditHeaders(audit ?? { origem: \"datagrid\" }),\n });\n return unwrap<T>(data);\n },\n async importMany(rows, audit) {\n const { data } = await http.post<{ inserted?: number }>(\n `${base}/import`,\n { rows },\n { headers: auditHeaders(audit ?? { origem: \"import\" }) }\n );\n return data;\n },\n async exportAll(params) {\n const { data } = await http.get<{ results: T[] } | T[]>(`${base}/export`, { params });\n return Array.isArray(data) ? data : data.results;\n },\n };\n}\n","import { createContext, useContext, useEffect, useState, useCallback, type ReactNode } from \"react\";\nimport type { AxiosInstance } from \"axios\";\nimport type { OonAuthConfig, OonUser } from \"../types\";\nimport { captureTokenFromUrl, type TokenStorage } from \"./tokenStorage\";\n\ninterface AuthContextValue {\n user: OonUser | null;\n roles: string[];\n status: \"loading\" | \"authenticated\" | \"unauthenticated\";\n isAuthenticated: boolean;\n hasPermission: (permission?: string | string[]) => boolean;\n logout: () => void;\n}\n\nconst AuthContext = createContext<AuthContextValue | null>(null);\n\nexport interface AuthProviderProps {\n http: AxiosInstance;\n storage: TokenStorage;\n auth?: OonAuthConfig;\n /** URL externa de login (Meus Apps) para redirecionar quando sem sessão. */\n loginUrl?: string;\n children: ReactNode;\n}\n\n/**\n * Provider de autenticação do Core. Fluxo (Seção 2.4 do back / 6.2 da doc):\n * 1. captura token do ?code= e guarda no tokenStorage;\n * 2. valida em GET /auth/validar-token e resolve `usuario`;\n * 3. sem token/ inválido => redireciona para o login externo.\n *\n * Backend continua sendo a autoridade final — o RBAC do front é só UX.\n */\nexport function AuthProvider({ http, storage, auth, loginUrl, children }: AuthProviderProps) {\n const tokenParam = auth?.tokenParam ?? \"code\";\n const [user, setUser] = useState<OonUser | null>(null);\n const [status, setStatus] = useState<AuthContextValue[\"status\"]>(\"loading\");\n\n const redirectToLogin = useCallback(() => {\n if (loginUrl) {\n window.location.href = loginUrl;\n } else {\n setStatus(\"unauthenticated\");\n }\n }, [loginUrl]);\n\n const logout = useCallback(() => {\n storage.clear();\n setUser(null);\n redirectToLogin();\n }, [storage, redirectToLogin]);\n\n useEffect(() => {\n let active = true;\n\n const incoming = captureTokenFromUrl(tokenParam);\n if (incoming) storage.set(incoming);\n\n const token = storage.get();\n if (!token) {\n redirectToLogin();\n return;\n }\n\n http\n .get<{ usuario: OonUser }>(\"/auth/validar-token\")\n .then((res) => {\n if (!active) return;\n setUser(res.data.usuario);\n setStatus(\"authenticated\");\n })\n .catch(() => {\n if (!active) return;\n storage.clear();\n redirectToLogin();\n });\n\n return () => {\n active = false;\n };\n }, [http, storage, tokenParam, redirectToLogin]);\n\n const roles = user?.tipo ? [user.tipo] : [];\n\n const hasPermission = useCallback(\n (permission?: string | string[]) => {\n if (!permission) return true;\n const required = Array.isArray(permission) ? permission : [permission];\n if (required.length === 0) return true;\n // admin/master sempre passa; demais checam interseção simples por papel.\n if (roles.includes(\"admin\") || roles.includes(\"master\")) return true;\n return required.some((p) => roles.includes(p) || roles.some((r) => p.startsWith(`${r}.`)));\n },\n [roles]\n );\n\n const value: AuthContextValue = {\n user,\n roles,\n status,\n isAuthenticated: status === \"authenticated\",\n hasPermission,\n logout,\n };\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n\nexport function useOonAuth(): AuthContextValue {\n const ctx = useContext(AuthContext);\n if (!ctx) throw new Error(\"useOonAuth deve ser usado dentro de <AuthProvider> (oonCoreFront.start).\");\n return ctx;\n}\n","import { useState } from \"react\";\nimport { Box, Heading, Stack } from \"@chakra-ui/react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { CollectionMode, OonColumnDef, OonFormFieldDef } from \"../types\";\nimport { useModelSchema, useOonResource } from \"../api/ApiProvider\";\nimport { columnsFromMeta, formFieldsFromMeta } from \"./internal/fieldUtils\";\nimport { DataGrid } from \"./internal/DataGrid\";\nimport { DynamicForm } from \"./internal/DynamicForm\";\nimport { LoadingScreen } from \"../shell/LoadingScreen\";\nimport { ErrorState } from \"../shell/ErrorState\";\n\nexport interface CoreCollectionProps {\n model: string;\n label?: string;\n /**\n * Três formas de declarar a coleção (Seção 4.4):\n * - \"full\" : colunas + form explícitos (passe `columns` e `form`).\n * - \"minimal\" : só `model`; Core busca a metadata e deriva tudo.\n * - \"dynamic\" : 100% dirigido por /core/models/:model (default).\n */\n mode?: CollectionMode;\n /** basePath do recurso; default vem da metadata da model. */\n endpoint?: string;\n columns?: OonColumnDef[];\n form?: OonFormFieldDef[];\n importExport?: boolean;\n}\n\ntype FormState = { open: false } | { open: true; row?: Record<string, unknown> };\n\n/**\n * Componente Core de coleção. Renderiza grid + form de qualquer model do back\n * sem código de UI por entidade. No modo dinâmico, lê /core/models/:model e\n * monta colunas, formulário e endpoint a partir da metadata — esse é o\n * critério de pronto da Fase 3.\n */\nexport function CoreCollection({ model, label, mode = \"dynamic\", endpoint, columns, form, importExport }: CoreCollectionProps) {\n const needsSchema = mode !== \"full\" || !columns || !form || !endpoint;\n const schemaQuery = useModelSchema(needsSchema ? model : \"\");\n\n // Resolve endpoint/colunas/form: props têm prioridade; metadata preenche o resto.\n const schema = schemaQuery.data;\n const basePath = endpoint ?? schema?.basePath ?? `/${model.toLowerCase()}s`;\n const resolvedColumns = columns ?? (schema ? columnsFromMeta(schema.fields) : []);\n const resolvedForm = form ?? (schema ? formFieldsFromMeta(schema.fields) : []);\n\n const resource = useOonResource(basePath);\n const queryClient = useQueryClient();\n const [formState, setFormState] = useState<FormState>({ open: false });\n const [formError, setFormError] = useState<string | null>(null);\n\n const invalidate = () => queryClient.invalidateQueries({ queryKey: [\"oon\", \"list\", basePath] });\n\n const saveMutation = useMutation({\n mutationFn: (values: Record<string, unknown>) => {\n const editingRow = formState.open ? formState.row : undefined;\n const id = editingRow?._id as string | undefined;\n return id ? resource.update(id, values) : resource.create(values);\n },\n onSuccess: () => {\n setFormState({ open: false });\n setFormError(null);\n invalidate();\n },\n onError: (err) => setFormError(err.message),\n });\n\n const deleteMutation = useMutation({\n mutationFn: (row: Record<string, unknown>) => resource.delete(row._id as string),\n onSuccess: invalidate,\n });\n\n if (needsSchema && schemaQuery.isLoading) return <LoadingScreen />;\n if (needsSchema && schemaQuery.isError) return <ErrorState error={schemaQuery.error} />;\n\n const title = label ?? schema?.name ?? model;\n\n return (\n <Stack gap={6}>\n <Heading size=\"lg\">{title}</Heading>\n\n {formState.open ? (\n <DynamicForm\n title={formState.row ? `Editar ${title}` : `Novo ${title}`}\n fields={resolvedForm}\n initialValues={formState.row}\n submitting={saveMutation.isPending}\n error={formError}\n onSubmit={(values) => saveMutation.mutate(values)}\n onCancel={() => {\n setFormState({ open: false });\n setFormError(null);\n }}\n />\n ) : (\n <Box>\n <DataGrid\n resource={resource}\n resourceKey={basePath}\n columns={resolvedColumns}\n onCreate={() => setFormState({ open: true })}\n onEdit={(row) => setFormState({ open: true, row })}\n onDelete={(row) => {\n if (window.confirm(\"Excluir este registro?\")) deleteMutation.mutate(row);\n }}\n />\n {importExport ? null /* hook de import/export entra aqui (resource.importMany/exportAll) */ : null}\n </Box>\n )}\n </Stack>\n );\n}\n","import type { FieldKind, FieldMeta, OonColumnDef, OonFormFieldDef } from \"../../types\";\n\n/** Campos que normalmente não fazem sentido em grid/form de CRUD. */\nconst HIDDEN_FIELDS = new Set([\"__v\", \"_id\", \"createdAt\", \"updatedAt\", \"criadoEm\", \"atualizadoEm\"]);\n\nexport function isEditableField(meta: FieldMeta): boolean {\n return !HIDDEN_FIELDS.has(meta.name) && meta.kind !== \"raw\";\n}\n\nexport function fieldLabel(meta: { name: string; label?: string }): string {\n if (meta.label) return meta.label;\n // humaniza: camelCase/snake_case -> \"Camel Case\".\n return meta.name\n .replace(/_/g, \" \")\n .replace(/([a-z])([A-Z])/g, \"$1 $2\")\n .replace(/^./, (c) => c.toUpperCase());\n}\n\n/** Deriva colunas de grid a partir da metadata da model (modo dynamic/minimal). */\nexport function columnsFromMeta(fields: FieldMeta[]): OonColumnDef[] {\n return fields\n .filter(isEditableField)\n .slice(0, 8)\n .map((f) => ({ field: f.name, label: fieldLabel(f), kind: f.kind, sortable: true }));\n}\n\n/** Deriva campos de formulário a partir da metadata da model. */\nexport function formFieldsFromMeta(fields: FieldMeta[]): OonFormFieldDef[] {\n return fields.filter(isEditableField).map((f) => ({\n field: f.name,\n label: fieldLabel(f),\n kind: f.kind,\n options: f.options,\n }));\n}\n\n/** Formata um valor de célula conforme o tipo declarado. */\nexport function formatCell(value: unknown, kind?: FieldKind): string {\n if (value == null || value === \"\") return \"—\";\n switch (kind) {\n case \"boolean\":\n return value ? \"Sim\" : \"Não\";\n case \"date\":\n try {\n return new Date(value as string).toLocaleDateString(\"pt-BR\");\n } catch {\n return String(value);\n }\n case \"currency\":\n case \"currencyConverted\":\n return new Intl.NumberFormat(\"pt-BR\", { style: \"currency\", currency: \"BRL\" }).format(Number(value));\n case \"ref\":\n // ref populada vem como objeto { _id, nome/label } ou string id.\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n return String(obj.nome ?? obj.label ?? obj.descricao ?? obj._id ?? \"—\");\n }\n return String(value);\n default:\n return String(value);\n }\n}\n","import { useState, type ReactNode } from \"react\";\nimport { Box, Button, Flex, Input, Spacer, Table, Text } from \"@chakra-ui/react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport type { OonColumnDef } from \"../../types\";\nimport type { ResourceClient } from \"../../api/resourceClient\";\nimport { formatCell } from \"./fieldUtils\";\nimport { LoadingScreen } from \"../../shell/LoadingScreen\";\nimport { ErrorState } from \"../../shell/ErrorState\";\n\nexport interface DataGridProps {\n resource: ResourceClient;\n resourceKey: string;\n columns: OonColumnDef[];\n search?: boolean;\n onCreate?: () => void;\n onEdit?: (row: Record<string, unknown>) => void;\n onDelete?: (row: Record<string, unknown>) => void;\n toolbarExtra?: ReactNode;\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Grid genérico dirigido pelo `ResourceClient`. Paginação/ordenação/busca são\n * server-side (contrato do back: pageIndex/pageSize/searchTerm/sort). Não\n * conhece nenhuma entidade específica.\n */\nexport function DataGrid({\n resource,\n resourceKey,\n columns,\n search = true,\n onCreate,\n onEdit,\n onDelete,\n toolbarExtra,\n}: DataGridProps) {\n const [pageIndex, setPageIndex] = useState(0);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [sort, setSort] = useState<string | undefined>(undefined);\n\n const query = useQuery({\n queryKey: [\"oon\", \"list\", resourceKey, { pageIndex, searchTerm, sort }],\n queryFn: () => resource.list({ pageIndex, pageSize: PAGE_SIZE, searchTerm: searchTerm || undefined, sort }),\n placeholderData: keepPreviousData,\n });\n\n const toggleSort = (field: string) => {\n setPageIndex(0);\n setSort((prev) => {\n if (prev === `${field}.asc`) return `${field}.desc`;\n if (prev === `${field}.desc`) return undefined;\n return `${field}.asc`;\n });\n };\n\n const pagination = query.data?.pagination;\n const rows = query.data?.results ?? [];\n\n return (\n <Box>\n <Flex mb={4} gap={3} align=\"center\">\n {search ? (\n <Input\n size=\"sm\"\n maxW=\"320px\"\n placeholder=\"Buscar...\"\n value={searchTerm}\n onChange={(e) => {\n setPageIndex(0);\n setSearchTerm(e.target.value);\n }}\n />\n ) : null}\n <Spacer />\n {toolbarExtra}\n {onCreate ? (\n <Button size=\"sm\" colorPalette=\"blue\" onClick={onCreate}>\n Novo\n </Button>\n ) : null}\n </Flex>\n\n {query.isLoading ? (\n <LoadingScreen />\n ) : query.isError ? (\n <ErrorState error={query.error} />\n ) : (\n <Box borderWidth=\"1px\" borderColor=\"gray.200\" borderRadius=\"md\" overflowX=\"auto\" bg=\"white\">\n <Table.Root size=\"sm\" interactive>\n <Table.Header>\n <Table.Row>\n {columns.map((col) => (\n <Table.ColumnHeader\n key={col.field}\n cursor={col.sortable ? \"pointer\" : undefined}\n onClick={col.sortable ? () => toggleSort(col.field) : undefined}\n >\n {col.label ?? col.field}\n {sort?.startsWith(`${col.field}.`) ? (sort.endsWith(\".asc\") ? \" ▲\" : \" ▼\") : \"\"}\n </Table.ColumnHeader>\n ))}\n {onEdit || onDelete ? <Table.ColumnHeader textAlign=\"end\">Ações</Table.ColumnHeader> : null}\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {rows.length === 0 ? (\n <Table.Row>\n <Table.Cell colSpan={columns.length + 1}>\n <Text color=\"gray.400\" py={6} textAlign=\"center\">\n Nenhum registro encontrado.\n </Text>\n </Table.Cell>\n </Table.Row>\n ) : (\n rows.map((row, idx) => (\n <Table.Row key={(row._id as string) ?? idx}>\n {columns.map((col) => (\n <Table.Cell key={col.field}>{formatCell(row[col.field], col.kind)}</Table.Cell>\n ))}\n {onEdit || onDelete ? (\n <Table.Cell textAlign=\"end\">\n <Flex gap={2} justify=\"end\">\n {onEdit ? (\n <Button size=\"xs\" variant=\"ghost\" onClick={() => onEdit(row)}>\n Editar\n </Button>\n ) : null}\n {onDelete ? (\n <Button size=\"xs\" variant=\"ghost\" colorPalette=\"red\" onClick={() => onDelete(row)}>\n Excluir\n </Button>\n ) : null}\n </Flex>\n </Table.Cell>\n ) : null}\n </Table.Row>\n ))\n )}\n </Table.Body>\n </Table.Root>\n </Box>\n )}\n\n {pagination ? (\n <Flex mt={4} align=\"center\" gap={3}>\n <Text fontSize=\"sm\" color=\"gray.500\">\n {pagination.totalItems} registro(s) · página {pagination.currentPage} de {pagination.totalPages}\n </Text>\n <Spacer />\n <Button size=\"xs\" variant=\"outline\" disabled={pageIndex <= 0} onClick={() => setPageIndex((p) => p - 1)}>\n Anterior\n </Button>\n <Button\n size=\"xs\"\n variant=\"outline\"\n disabled={pagination.currentPage >= pagination.totalPages}\n onClick={() => setPageIndex((p) => p + 1)}\n >\n Próxima\n </Button>\n </Flex>\n ) : null}\n </Box>\n );\n}\n","import { Flex, Spinner, Text } from \"@chakra-ui/react\";\n\n/** Tela de carregamento/estado neutro reutilizada por guards e Suspense. */\nexport function LoadingScreen({ message }: { message?: string }) {\n return (\n <Flex direction=\"column\" align=\"center\" justify=\"center\" minH=\"60vh\" gap={4}>\n <Spinner size=\"lg\" />\n {message ? (\n <Text color=\"gray.500\" fontSize=\"sm\">\n {message}\n </Text>\n ) : null}\n </Flex>\n );\n}\n","import { Box, Heading, Text } from \"@chakra-ui/react\";\n\n/**\n * Estado de erro padrão. Aceita tanto o `OonError` do client quanto um `Error`\n * cru (o que o React Query tipa em `query.error`) — só precisa de `message` e,\n * opcionalmente, `requestId`.\n */\nexport function ErrorState({\n error,\n title = \"Não foi possível carregar\",\n}: {\n error?: { message?: string; requestId?: string } | null;\n title?: string;\n}) {\n return (\n <Box borderWidth=\"1px\" borderColor=\"red.200\" bg=\"red.50\" borderRadius=\"md\" p={4}>\n <Heading size=\"sm\" color=\"red.700\">\n {title}\n </Heading>\n <Text mt={1} fontSize=\"sm\" color=\"red.600\">\n {error?.message ?? \"Erro inesperado.\"}\n </Text>\n {error?.requestId ? (\n <Text mt={2} fontSize=\"xs\" color=\"red.400\">\n requestId: {error.requestId}\n </Text>\n ) : null}\n </Box>\n );\n}\n","import { useState, type FormEvent } from \"react\";\nimport { Box, Button, Flex, Heading, Input, Stack, Text, NativeSelect } from \"@chakra-ui/react\";\nimport type { OonFormFieldDef } from \"../../types\";\nimport { fieldLabel } from \"./fieldUtils\";\n\nexport interface DynamicFormProps {\n title: string;\n fields: OonFormFieldDef[];\n initialValues?: Record<string, unknown>;\n submitting?: boolean;\n error?: string | null;\n onSubmit: (values: Record<string, unknown>) => void;\n onCancel: () => void;\n}\n\nfunction coerce(value: string, kind?: string): unknown {\n if (value === \"\") return undefined;\n if (kind === \"number\" || kind === \"currency\" || kind === \"currencyConverted\") return Number(value);\n if (kind === \"boolean\") return value === \"true\";\n return value;\n}\n\nfunction toInputValue(value: unknown, kind?: string): string {\n if (value == null) return \"\";\n if (kind === \"date\" && value) {\n try {\n return new Date(value as string).toISOString().slice(0, 10);\n } catch {\n return \"\";\n }\n }\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n return String(obj._id ?? \"\");\n }\n return String(value);\n}\n\n/**\n * Formulário gerado a partir das definições de campo (modo dynamic monta isto\n * direto da metadata). Render por `kind`: enum -> select; boolean -> select\n * Sim/Não; date -> input date; currency/number -> number; demais -> texto.\n */\nexport function DynamicForm({ title, fields, initialValues, submitting, error, onSubmit, onCancel }: DynamicFormProps) {\n const [values, setValues] = useState<Record<string, string>>(() => {\n const init: Record<string, string> = {};\n for (const f of fields) init[f.field] = toInputValue(initialValues?.[f.field], f.kind);\n return init;\n });\n\n const setField = (name: string, value: string) => setValues((prev) => ({ ...prev, [name]: value }));\n\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault();\n const payload: Record<string, unknown> = {};\n for (const f of fields) {\n const coerced = coerce(values[f.field] ?? \"\", f.kind);\n if (coerced !== undefined) payload[f.field] = coerced;\n }\n onSubmit(payload);\n };\n\n return (\n <Box borderWidth=\"1px\" borderColor=\"gray.200\" borderRadius=\"md\" bg=\"white\" p={6} maxW=\"640px\">\n <Heading size=\"md\" mb={4}>\n {title}\n </Heading>\n <form onSubmit={handleSubmit}>\n <Stack gap={4}>\n {fields.map((f) => {\n const label = fieldLabel({ name: f.field, label: f.label });\n if (f.kind === \"enum\" && f.options?.length) {\n return (\n <Box key={f.field}>\n <Text fontSize=\"sm\" mb={1} fontWeight=\"medium\">\n {label}\n </Text>\n <NativeSelect.Root size=\"sm\">\n <NativeSelect.Field\n value={values[f.field] ?? \"\"}\n onChange={(e) => setField(f.field, e.currentTarget.value)}\n >\n <option value=\"\">—</option>\n {f.options.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </NativeSelect.Field>\n <NativeSelect.Indicator />\n </NativeSelect.Root>\n </Box>\n );\n }\n if (f.kind === \"boolean\") {\n return (\n <Box key={f.field}>\n <Text fontSize=\"sm\" mb={1} fontWeight=\"medium\">\n {label}\n </Text>\n <NativeSelect.Root size=\"sm\">\n <NativeSelect.Field\n value={values[f.field] ?? \"\"}\n onChange={(e) => setField(f.field, e.currentTarget.value)}\n >\n <option value=\"\">—</option>\n <option value=\"true\">Sim</option>\n <option value=\"false\">Não</option>\n </NativeSelect.Field>\n <NativeSelect.Indicator />\n </NativeSelect.Root>\n </Box>\n );\n }\n const inputType =\n f.kind === \"date\"\n ? \"date\"\n : f.kind === \"number\" || f.kind === \"currency\" || f.kind === \"currencyConverted\"\n ? \"number\"\n : \"text\";\n return (\n <Box key={f.field}>\n <Text fontSize=\"sm\" mb={1} fontWeight=\"medium\">\n {label}\n {f.required ? \" *\" : \"\"}\n </Text>\n <Input\n size=\"sm\"\n type={inputType}\n required={f.required}\n value={values[f.field] ?? \"\"}\n onChange={(e) => setField(f.field, e.currentTarget.value)}\n />\n </Box>\n );\n })}\n\n {error ? (\n <Text fontSize=\"sm\" color=\"red.600\">\n {error}\n </Text>\n ) : null}\n\n <Flex gap={3} justify=\"end\" mt={2}>\n <Button size=\"sm\" variant=\"ghost\" type=\"button\" onClick={onCancel}>\n Cancelar\n </Button>\n <Button size=\"sm\" colorPalette=\"blue\" type=\"submit\" loading={submitting}>\n Salvar\n </Button>\n </Flex>\n </Stack>\n </form>\n </Box>\n );\n}\n","import type { OonColumnDef, OonFormFieldDef } from \"../types\";\nimport { useOonApi } from \"../api/ApiProvider\";\nimport { CoreCollection } from \"./CoreCollection\";\n\nexport interface CoreDocumentProps {\n model: string;\n label?: string;\n endpoint?: string;\n columns?: OonColumnDef[];\n form?: OonFormFieldDef[];\n /** liga ações de aprovar/reprovar (RESTful: /:id/actions/approve|reject). */\n approval?: boolean;\n /** liga gestão de anexos (futuro: /:id/files). */\n attachments?: boolean;\n}\n\n/**\n * Tipo documental. Hoje reusa a coleção genérica (list + CRUD). Quando\n * `approval` está ligado, expõe o helper `approveDocument` para as ações\n * RESTful do back (Seção 5.2) — documentos fiscais e cadastrais viram\n * configuração, não páginas escritas à mão.\n */\nexport function CoreDocument({ model, label, endpoint, columns, form }: CoreDocumentProps) {\n return (\n <CoreCollection\n model={model}\n label={label}\n mode={columns && form ? \"full\" : \"dynamic\"}\n endpoint={endpoint}\n columns={columns}\n form={form}\n />\n );\n}\n\n/**\n * Aciona uma ação RESTful de documento (approve/reject/archive). Exposto para\n * o domínio usar em botões de linha sem reimplementar a chamada.\n */\nexport function useDocumentAction(basePath: string) {\n const { http } = useOonApi();\n return (id: string, action: \"approve\" | \"reject\" | \"archive\") =>\n http.post(`${basePath}/${id}/actions/${action}`, {}, { headers: { \"x-oon-origin\": \"form\" } });\n}\n","import { Box, Flex, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useModelSchema, useOonResource } from \"../api/ApiProvider\";\nimport { LoadingScreen } from \"../shell/LoadingScreen\";\nimport { ErrorState } from \"../shell/ErrorState\";\nimport { formatCell } from \"./internal/fieldUtils\";\n\nexport interface CorePipelineProps {\n model: string;\n label?: string;\n endpoint?: string;\n /** campo do registro que define a coluna/etapa. Default: \"status\". */\n stageField?: string;\n /** etapas fixas; se omitido, derivadas do enum de `stageField`. */\n stages?: Array<{ id: string; label: string }>;\n /** campo exibido como título do card. Default: primeiro string. */\n titleField?: string;\n}\n\n/**\n * Esteira (kanban) genérica do Core. Agrupa registros por `stageField` em\n * colunas. As etapas vêm das props ou são derivadas do enum declarado na\n * metadata da model — nenhuma esteira específica hardcoded.\n */\nexport function CorePipeline({ model, label, endpoint, stageField = \"status\", stages, titleField }: CorePipelineProps) {\n const schemaQuery = useModelSchema(model);\n const schema = schemaQuery.data;\n const basePath = endpoint ?? schema?.basePath ?? `/${model.toLowerCase()}s`;\n const resource = useOonResource(basePath);\n\n const listQuery = useQuery({\n queryKey: [\"oon\", \"pipeline\", basePath],\n queryFn: () => resource.list({ pageSize: 200 }),\n enabled: !!schema,\n });\n\n if (schemaQuery.isLoading || listQuery.isLoading) return <LoadingScreen />;\n if (schemaQuery.isError) return <ErrorState error={schemaQuery.error} />;\n if (listQuery.isError) return <ErrorState error={listQuery.error} />;\n\n const stageFieldMeta = schema?.fields.find((f) => f.name === stageField);\n const resolvedStages =\n stages ??\n (stageFieldMeta?.options ?? []).map((opt) => ({ id: opt, label: opt })) ?? [];\n\n const title =\n titleField ?? schema?.fields.find((f) => f.kind === \"string\")?.name ?? schema?.searchable[0] ?? \"_id\";\n\n const rows = listQuery.data?.results ?? [];\n const byStage = new Map<string, Record<string, unknown>[]>();\n for (const stage of resolvedStages) byStage.set(stage.id, []);\n for (const row of rows) {\n const key = String(row[stageField] ?? \"\");\n if (!byStage.has(key)) byStage.set(key, []);\n byStage.get(key)!.push(row);\n }\n\n return (\n <Stack gap={6}>\n <Heading size=\"lg\">{label ?? schema?.name ?? model}</Heading>\n <Flex gap={4} align=\"stretch\" overflowX=\"auto\" pb={2}>\n {Array.from(byStage.entries()).map(([stageId, items]) => {\n const stageLabel = resolvedStages.find((s) => s.id === stageId)?.label ?? (stageId || \"—\");\n return (\n <Box key={stageId} minW=\"280px\" bg=\"gray.100\" borderRadius=\"md\" p={3}>\n <Flex align=\"center\" justify=\"space-between\" mb={3}>\n <Text fontWeight=\"semibold\" fontSize=\"sm\">\n {stageLabel}\n </Text>\n <Text fontSize=\"xs\" color=\"gray.500\">\n {items.length}\n </Text>\n </Flex>\n <Stack gap={2}>\n {items.map((row, idx) => (\n <Box key={(row._id as string) ?? idx} bg=\"white\" borderRadius=\"md\" p={3} borderWidth=\"1px\" borderColor=\"gray.200\">\n <Text fontSize=\"sm\" fontWeight=\"medium\">\n {formatCell(row[title], \"string\")}\n </Text>\n </Box>\n ))}\n </Stack>\n </Box>\n );\n })}\n </Flex>\n </Stack>\n );\n}\n","import { Box, Heading, SimpleGrid, Stack, Text } from \"@chakra-ui/react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport type { DashboardWidgetDef } from \"../types\";\nimport { useOonApi } from \"../api/ApiProvider\";\n\nexport interface CoreDashboardProps {\n label?: string;\n widgets?: DashboardWidgetDef[];\n}\n\n/**\n * Dashboard do Core: renderiza widgets registrados (count/sum por model ou\n * render custom). Cache, loading e erro ficam no Core; a Central só declara.\n */\nexport function CoreDashboard({ label = \"Dashboard\", widgets = [] }: CoreDashboardProps) {\n const { resource } = useOonApi();\n\n const queries = useQueries({\n queries: widgets\n .filter((w) => w.kind !== \"custom\" && w.model)\n .map((w) => ({\n queryKey: [\"oon\", \"widget\", w.id],\n queryFn: async () => {\n const r = await resource(`/${w.model!.toLowerCase()}s`).list({ pageSize: w.kind === \"sum\" ? 200 : 1 });\n if (w.kind === \"sum\" && w.field) {\n return r.results.reduce((acc, row) => acc + Number((row as Record<string, unknown>)[w.field!] ?? 0), 0);\n }\n return r.pagination.totalItems;\n },\n staleTime: 60 * 1000,\n })),\n });\n\n let queryIdx = 0;\n\n return (\n <Stack gap={6}>\n <Heading size=\"lg\">{label}</Heading>\n <SimpleGrid columns={{ base: 1, md: 2, lg: 3 }} gap={4}>\n {widgets.map((w) => {\n if (w.kind === \"custom\" && w.render) {\n return (\n <Box key={w.id} borderWidth=\"1px\" borderColor=\"gray.200\" borderRadius=\"md\" bg=\"white\" p={5}>\n {w.render()}\n </Box>\n );\n }\n const q = queries[queryIdx++];\n const value = q?.isLoading ? \"…\" : q?.isError ? \"—\" : formatWidget(q?.data, w.kind, w.field);\n return (\n <Box key={w.id} borderWidth=\"1px\" borderColor=\"gray.200\" borderRadius=\"md\" bg=\"white\" p={5}>\n <Text fontSize=\"sm\" color=\"gray.500\">\n {w.label}\n </Text>\n <Heading size=\"xl\" mt={1}>\n {value}\n </Heading>\n </Box>\n );\n })}\n </SimpleGrid>\n </Stack>\n );\n}\n\nfunction formatWidget(value: unknown, kind?: string, field?: string): string {\n if (value == null) return \"—\";\n if ((kind === \"sum\" && field?.toLowerCase().includes(\"valor\")) || kind === \"sum\") {\n return new Intl.NumberFormat(\"pt-BR\", { style: \"currency\", currency: \"BRL\" }).format(Number(value));\n }\n return String(value);\n}\n","import type {\n CollectionViewDef,\n DashboardViewDef,\n DocumentViewDef,\n OonCoreFrontConfig,\n OonMenuItem,\n OonRoute,\n OonViewDefinition,\n PipelineViewDef,\n} from \"../types\";\nimport { CoreCollection } from \"../components/CoreCollection\";\nimport { CoreDocument } from \"../components/CoreDocument\";\nimport { CorePipeline } from \"../components/CorePipeline\";\nimport { CoreDashboard } from \"../components/CoreDashboard\";\n\n/** Resultado da resolução de módulos + manifesto de UI em rotas e menu. */\nexport interface ResolvedRegistry {\n routes: OonRoute[];\n menu: OonMenuItem[];\n}\n\nfunction slug(value: string): string {\n return value\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nfunction viewId(view: OonViewDefinition): string {\n if (view.id) return view.id;\n if (view.type === \"dashboard\") return \"dashboard\";\n return slug(view.model);\n}\n\nfunction viewPath(view: OonViewDefinition): string {\n if (view.path) return view.path;\n if (view.type === \"dashboard\") return \"/\";\n return `/${viewId(view)}`;\n}\n\nfunction viewLabel(view: OonViewDefinition): string {\n if (view.label) return view.label;\n if (view.type === \"dashboard\") return \"Dashboard\";\n return view.model;\n}\n\n/** Converte uma view declarativa no componente Core correspondente. */\nfunction renderView(view: OonViewDefinition) {\n switch (view.type) {\n case \"collection\": {\n const v = view as CollectionViewDef;\n return (\n <CoreCollection\n model={v.model}\n mode={v.mode}\n columns={v.columns}\n form={v.form}\n label={viewLabel(v)}\n importExport={v.importExport}\n />\n );\n }\n case \"document\": {\n const v = view as DocumentViewDef;\n return <CoreDocument model={v.model} label={viewLabel(v)} approval={v.approval} attachments={v.attachments} />;\n }\n case \"pipeline\": {\n const v = view as PipelineViewDef;\n return (\n <CorePipeline\n model={v.model}\n label={viewLabel(v)}\n stageField={v.stageField}\n stages={v.stages}\n />\n );\n }\n case \"dashboard\": {\n const v = view as DashboardViewDef;\n return <CoreDashboard label={viewLabel(v)} widgets={v.widgets} />;\n }\n default:\n return null;\n }\n}\n\nfunction viewToRoute(view: OonViewDefinition): OonRoute {\n return {\n path: viewPath(view),\n element: renderView(view),\n permissions: \"permissions\" in view ? view.permissions : undefined,\n };\n}\n\nfunction viewToMenu(view: OonViewDefinition): OonMenuItem {\n return {\n label: viewLabel(view),\n href: viewPath(view),\n icon: view.icon,\n section: view.section,\n permissions: \"permissions\" in view ? view.permissions : undefined,\n };\n}\n\n/**\n * Resolve a config inteira (módulos + `ui.views`) em um registry plano de\n * rotas e menu. É o que substitui o `router.jsx` hardcoded por geração\n * dirigida por declaração/metadata.\n */\nexport function resolveRegistry(config: OonCoreFrontConfig): ResolvedRegistry {\n const routes: OonRoute[] = [];\n const menu: OonMenuItem[] = [];\n const seenPaths = new Set<string>();\n\n const pushRoute = (route: OonRoute) => {\n if (seenPaths.has(route.path)) return;\n seenPaths.add(route.path);\n routes.push(route);\n };\n\n for (const mod of config.modules ?? []) {\n for (const route of mod.routes ?? []) pushRoute(route);\n for (const item of mod.menu ?? []) menu.push(item);\n for (const view of mod.views ?? []) {\n pushRoute(viewToRoute(view));\n menu.push(viewToMenu(view));\n }\n }\n\n for (const view of config.ui?.views ?? []) {\n pushRoute(viewToRoute(view));\n menu.push(viewToMenu(view));\n }\n\n menu.sort((a, b) => (a.order ?? 100) - (b.order ?? 100));\n return { routes, menu };\n}\n","import { createBrowserRouter, type RouteObject } from \"react-router-dom\";\nimport type { OonAppConfig, OonMenuItem, OonRoute, OonSecurityConfig } from \"../types\";\nimport { AuthenticatedLayout } from \"../shell/AuthenticatedLayout\";\nimport { RouteGuard } from \"../security/RouteGuard\";\n\nexport interface RouterInput {\n app: OonAppConfig;\n menu: OonMenuItem[];\n routes: OonRoute[];\n security?: OonSecurityConfig;\n}\n\n/**\n * Constrói o router a partir do registry resolvido (rotas dos módulos/views).\n * Rotas privadas ficam sob o layout autenticado e passam pelo RouteGuard;\n * rotas `public: true` ficam fora do layout.\n */\nexport function createOonRouter({ app, menu, routes, security }: RouterInput) {\n const guardEnabled = security?.enableRouteGuard !== false;\n\n const publicRoutes: RouteObject[] = routes\n .filter((r) => r.public)\n .map((r) => ({ path: r.path, element: r.element }));\n\n const privateRoutes: RouteObject[] = routes\n .filter((r) => !r.public)\n .map((r) => {\n const element = guardEnabled ? <RouteGuard permission={r.permissions}>{r.element}</RouteGuard> : r.element;\n // Rota raiz vira index route; demais usam path relativo ao layout.\n return r.path === \"/\" ? { index: true, element } : { path: r.path.replace(/^\\//, \"\"), element };\n });\n\n const tree: RouteObject[] = [\n ...publicRoutes,\n {\n path: \"/\",\n element: <AuthenticatedLayout app={app} menu={menu} />,\n children: privateRoutes,\n },\n ];\n\n return createBrowserRouter(tree);\n}\n","import { Box, Button, Flex, Spacer, Text } from \"@chakra-ui/react\";\nimport { Outlet } from \"react-router-dom\";\nimport type { OonAppConfig, OonMenuItem } from \"../types\";\nimport { useOonAuth } from \"../security/AuthProvider\";\nimport { Sidebar } from \"./Sidebar\";\n\n/**\n * Layout autenticado do Core: sidebar + topbar com usuário e logout.\n * Totalmente orientado por `appConfig` e pelo menu resolvido do registry.\n */\nexport function AuthenticatedLayout({ app, menu }: { app: OonAppConfig; menu: OonMenuItem[] }) {\n const { user, logout } = useOonAuth();\n\n return (\n <Flex align=\"stretch\" minH=\"100vh\" bg=\"gray.50\">\n <Sidebar app={app} menu={menu} />\n <Flex direction=\"column\" flex=\"1\" minW={0}>\n <Flex as=\"header\" align=\"center\" px={6} py={3} borderBottomWidth=\"1px\" borderColor=\"gray.200\" bg=\"white\">\n <Text fontSize=\"sm\" color=\"gray.500\">\n {app.title ?? app.name}\n </Text>\n <Spacer />\n {user ? (\n <Flex align=\"center\" gap={3}>\n <Text fontSize=\"sm\" color=\"gray.700\">\n {user.nome}\n </Text>\n <Button size=\"xs\" variant=\"outline\" colorPalette=\"brand\" onClick={logout}>\n Sair\n </Button>\n </Flex>\n ) : null}\n </Flex>\n <Box as=\"main\" flex=\"1\" p={6} minW={0}>\n <Outlet />\n </Box>\n </Flex>\n </Flex>\n );\n}\n","import { Box, Flex, Image, Stack, Text } from \"@chakra-ui/react\";\nimport { NavLink } from \"react-router-dom\";\nimport type { OonAppConfig, OonMenuItem } from \"../types\";\nimport { useOonAuth } from \"../security/AuthProvider\";\n\n/** Agrupa itens de menu por seção, preservando ordem de inserção. */\nfunction groupBySection(items: OonMenuItem[]): Array<[string, OonMenuItem[]]> {\n const groups = new Map<string, OonMenuItem[]>();\n for (const item of items) {\n const section = item.section ?? \"\";\n if (!groups.has(section)) groups.set(section, []);\n groups.get(section)!.push(item);\n }\n return Array.from(groups.entries());\n}\n\n/**\n * Menu lateral dirigido pelo registry. Esconde itens sem permissão (UX).\n * Nada de label/itens hardcoded: tudo vem de `appConfig` e do menu resolvido.\n */\nexport function Sidebar({ app, menu }: { app: OonAppConfig; menu: OonMenuItem[] }) {\n const { hasPermission } = useOonAuth();\n const visible = menu.filter((item) => hasPermission(item.permissions));\n\n return (\n <Box as=\"nav\" w=\"260px\" minH=\"100vh\" borderRightWidth=\"1px\" borderColor=\"gray.200\" px={4} py={6} bg=\"white\">\n <Flex align=\"center\" gap={3} mb={8} px={2}>\n {app.logo ? <Image src={app.logo} alt={app.name} maxH=\"36px\" /> : null}\n <Text fontWeight=\"bold\" fontSize=\"md\" color=\"brand.500\">\n {app.name}\n </Text>\n </Flex>\n\n <Stack gap={6}>\n {groupBySection(visible).map(([section, items]) => (\n <Stack key={section || \"_\"} gap={1}>\n {section ? (\n <Text fontSize=\"xs\" fontWeight=\"semibold\" color=\"gray.400\" textTransform=\"uppercase\" px={3} mb={1}>\n {section}\n </Text>\n ) : null}\n {items.map((item) => (\n <NavLink key={item.href} to={item.href} end={item.href === \"/\"}>\n {({ isActive }) => (\n <Flex\n align=\"center\"\n gap={2}\n px={3}\n py={2}\n borderRadius=\"md\"\n fontSize=\"sm\"\n fontWeight={isActive ? \"semibold\" : \"normal\"}\n bg={isActive ? \"brand.50\" : \"transparent\"}\n color={isActive ? \"brand.700\" : \"gray.700\"}\n _hover={{ bg: isActive ? \"brand.50\" : \"gray.50\" }}\n >\n {item.icon}\n <span>{item.label}</span>\n </Flex>\n )}\n </NavLink>\n ))}\n </Stack>\n ))}\n </Stack>\n </Box>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { useOonAuth } from \"./AuthProvider\";\nimport { LoadingScreen } from \"../shell/LoadingScreen\";\n\n/**\n * Protege rotas privadas: enquanto valida o token mostra loading; sem sessão\n * o AuthProvider já redireciona para o login externo, então aqui só seguramos\n * o render. `permission` opcional bloqueia por papel (UX; back valida de novo).\n */\nexport function RouteGuard({\n permission,\n children,\n}: {\n permission?: string | string[];\n children: ReactNode;\n}) {\n const { status, hasPermission } = useOonAuth();\n\n if (status === \"loading\") return <LoadingScreen />;\n if (status === \"unauthenticated\") return <LoadingScreen message=\"Redirecionando para o login...\" />;\n if (!hasPermission(permission)) {\n return <LoadingScreen message=\"Você não tem acesso a esta tela.\" />;\n }\n return <>{children}</>;\n}\n","import type {\n CollectionMode,\n CollectionViewDef,\n DocumentViewDef,\n OonCoreFrontConfig,\n OonViewDefinition,\n PipelineViewDef,\n} from \"./types\";\nimport { start } from \"./start\";\n\n/**\n * Schema do `central.ui.json` (Seção 9 do escopo). É o que o frontend\n * consumidor gerado pelo `create-central-oon` carrega — declaração pura, sem\n * código de UI. O Core converte isto em `OonCoreFrontConfig`.\n */\nexport interface CentralUiManifest {\n name: string;\n slug: string;\n backend?: { metadataUrl?: string };\n navigation?: { mode?: \"auto\" | \"manual\" };\n collections?: Array<{\n model: string;\n mode?: CollectionMode;\n path?: string;\n label?: string;\n section?: string;\n }>;\n pipelines?: Array<{\n name?: string;\n model?: string;\n mode?: string;\n stageField?: string;\n path?: string;\n label?: string;\n section?: string;\n }>;\n documents?: Array<{\n model: string;\n mode?: string;\n path?: string;\n label?: string;\n section?: string;\n approval?: boolean;\n attachments?: boolean;\n }>;\n}\n\n/** Dados de runtime que o `central.ui.json` não carrega (vêm do .env). */\nexport interface ManifestRuntime {\n apiBaseUrl: string;\n meusAppsUrl?: string;\n assistantBaseUrl?: string;\n versionPrefix?: string;\n}\n\n/** Converte o manifesto declarativo + runtime em config do Core. */\nexport function manifestToConfig(manifest: CentralUiManifest, runtime: ManifestRuntime): OonCoreFrontConfig {\n const views: OonViewDefinition[] = [];\n\n for (const c of manifest.collections ?? []) {\n const view: CollectionViewDef = {\n type: \"collection\",\n model: c.model,\n mode: c.mode ?? \"dynamic\",\n path: c.path,\n label: c.label,\n section: c.section,\n };\n views.push(view);\n }\n\n for (const p of manifest.pipelines ?? []) {\n const model = p.model ?? p.name;\n if (!model) continue;\n const view: PipelineViewDef = {\n type: \"pipeline\",\n model,\n label: p.label ?? p.name,\n path: p.path,\n stageField: p.stageField,\n section: p.section,\n };\n views.push(view);\n }\n\n for (const d of manifest.documents ?? []) {\n const view: DocumentViewDef = {\n type: \"document\",\n model: d.model,\n label: d.label,\n path: d.path,\n section: d.section,\n approval: d.approval,\n attachments: d.attachments,\n };\n views.push(view);\n }\n\n return {\n app: {\n id: manifest.slug,\n name: manifest.name,\n title: manifest.name,\n },\n api: {\n baseUrl: runtime.apiBaseUrl,\n meusAppsUrl: runtime.meusAppsUrl,\n assistantBaseUrl: runtime.assistantBaseUrl,\n versionPrefix: runtime.versionPrefix ?? \"\",\n },\n auth: { mode: \"bearer\", tokenParam: \"code\" },\n security: {\n enableRouteGuard: true,\n enablePermissionGate: true,\n redactAssistantContext: true,\n disableConsoleInProduction: true,\n },\n ui: { views },\n };\n}\n\n/**\n * Bootstrap a partir do `central.ui.json`. É a única linha que o `main.tsx` de\n * uma Central gerada precisa:\n *\n * import manifest from \"../central.ui.json\";\n * startFromManifest(manifest, { apiBaseUrl: import.meta.env.VITE_API_URL });\n */\nexport function startFromManifest(manifest: CentralUiManifest, runtime: ManifestRuntime) {\n start(manifestToConfig(manifest, runtime));\n}\n","import type {\n CollectionViewDef,\n DashboardViewDef,\n DocumentViewDef,\n OonModule,\n PipelineViewDef,\n} from \"../types\";\n\n/**\n * Helpers declarativos (API pública da Seção 4.3). São identidades tipadas que\n * fixam o `type` da view — servem para o autocomplete e para registrar a view\n * num módulo ou no `ui.views` da config.\n */\n\nexport function defineCollectionView(def: Omit<CollectionViewDef, \"type\">): CollectionViewDef {\n return { type: \"collection\", ...def };\n}\n\nexport function defineDocumentView(def: Omit<DocumentViewDef, \"type\">): DocumentViewDef {\n return { type: \"document\", ...def };\n}\n\nexport function definePipelineView(def: Omit<PipelineViewDef, \"type\">): PipelineViewDef {\n return { type: \"pipeline\", ...def };\n}\n\nexport function defineDashboard(def: Omit<DashboardViewDef, \"type\">): DashboardViewDef {\n return { type: \"dashboard\", ...def };\n}\n\n/** Açúcar para declarar um módulo com tipagem. */\nexport function defineOonModule(mod: OonModule): OonModule {\n return mod;\n}\n","import { Badge, Box, Button, Flex, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { useCoreMetadata, useOonApi } from \"../api/ApiProvider\";\nimport { LoadingScreen } from \"../shell/LoadingScreen\";\nimport { ErrorState } from \"../shell/ErrorState\";\n\nexport interface CoreIntegrationProps {\n label?: string;\n}\n\ninterface IntegrationEntry {\n id?: string;\n name?: string;\n label?: string;\n status?: string;\n}\n\n/**\n * Painel de integrações: lista o que o back declarou em /core/integrations e\n * permite reprocessar via action RESTful (POST /integrations/actions/process-active).\n */\nexport function CoreIntegration({ label = \"Integrações\" }: CoreIntegrationProps) {\n const { http } = useOonApi();\n const metadata = useCoreMetadata();\n\n const reprocess = useMutation({\n mutationFn: () =>\n http.post(\"/integrations/actions/process-active\", {}, { headers: { \"x-oon-origin\": \"integration\" } }),\n });\n\n if (metadata.isLoading) return <LoadingScreen />;\n if (metadata.isError) return <ErrorState error={metadata.error} />;\n\n const integrations = (metadata.data?.integrations ?? []) as IntegrationEntry[];\n\n return (\n <Stack gap={6}>\n <Flex align=\"center\" justify=\"space-between\">\n <Heading size=\"lg\">{label}</Heading>\n <Button size=\"sm\" variant=\"outline\" loading={reprocess.isPending} onClick={() => reprocess.mutate()}>\n Reprocessar ativos\n </Button>\n </Flex>\n <Stack gap={3}>\n {integrations.length === 0 ? (\n <Text color=\"gray.400\">Nenhuma integração declarada.</Text>\n ) : (\n integrations.map((it, idx) => (\n <Box\n key={it.id ?? it.name ?? idx}\n borderWidth=\"1px\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n bg=\"white\"\n p={4}\n >\n <Flex align=\"center\" justify=\"space-between\">\n <Text fontWeight=\"medium\">{it.label ?? it.name ?? \"Integração\"}</Text>\n <Badge colorPalette={it.status === \"erro\" ? \"red\" : it.status === \"ativo\" ? \"green\" : \"gray\"}>\n {it.status ?? \"—\"}\n </Badge>\n </Flex>\n </Box>\n ))\n )}\n </Stack>\n </Stack>\n );\n}\n","import { Button, Flex, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { OonColumnDef } from \"../types\";\nimport { useOonApi } from \"../api/ApiProvider\";\nimport { CoreCollection } from \"./CoreCollection\";\n\nexport interface CoreCurrencyProps {\n /** model das moedas. Default: \"Moeda\". */\n model?: string;\n label?: string;\n endpoint?: string;\n columns?: OonColumnDef[];\n}\n\n/**\n * Multi-moedas (módulo de domínio, Seção 4.6/2.11). Lista as moedas e expõe a\n * ação RESTful de atualizar cotações (POST /<endpoint>/actions/update-rates).\n */\nexport function CoreCurrency({ model = \"Moeda\", label = \"Multi-moedas\", endpoint = \"/moedas\", columns }: CoreCurrencyProps) {\n const { http } = useOonApi();\n const queryClient = useQueryClient();\n\n const updateRates = useMutation({\n mutationFn: () => http.post(`${endpoint}/actions/update-rates`, {}, { headers: { \"x-oon-origin\": \"integration\" } }),\n onSuccess: () => queryClient.invalidateQueries({ queryKey: [\"oon\", \"list\", endpoint] }),\n });\n\n return (\n <Stack gap={6}>\n <Flex align=\"center\" justify=\"space-between\">\n <Heading size=\"lg\">{label}</Heading>\n <Button size=\"sm\" colorPalette=\"blue\" loading={updateRates.isPending} onClick={() => updateRates.mutate()}>\n Atualizar cotações\n </Button>\n </Flex>\n {updateRates.isError ? (\n <Text fontSize=\"sm\" color=\"red.600\">\n {updateRates.error?.message}\n </Text>\n ) : null}\n <CoreCollection model={model} label=\"\" mode={columns ? \"full\" : \"dynamic\"} endpoint={endpoint} columns={columns} />\n </Stack>\n );\n}\n","import { useState } from \"react\";\nimport { Box, Button, Flex, Heading, Input, Stack, Text } from \"@chakra-ui/react\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { useOonApi } from \"../api/ApiProvider\";\n\nexport interface AssistantMessage {\n role: \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface CoreAssistantProps {\n /** code do assistente registrado no back (ex.: \"servicos-tomados.revisao\"). */\n assistantCode: string;\n label?: string;\n /** entidade de contexto (apenas tipo + id; nada sensível). */\n entity?: { type: string; id: string };\n /** base de assistentes; default usa o mesmo client REST do Core. */\n endpoint?: string;\n}\n\n/**\n * Assistente IA do Core (Seção 2.12 / 6.2). Envia ao back apenas\n * assistantCode + entity + message — NUNCA chave de IA, modelo ou prompt.\n * O back resolve modelo, prompt, chave e políticas.\n */\nexport function CoreAssistant({ assistantCode, label = \"Assistente\", entity, endpoint = \"/assistant-runs\" }: CoreAssistantProps) {\n const { http } = useOonApi();\n const [messages, setMessages] = useState<AssistantMessage[]>([]);\n const [input, setInput] = useState(\"\");\n\n const ask = useMutation({\n mutationFn: async (message: string) => {\n const { data } = await http.post<{ reply?: string; message?: string }>(\n endpoint,\n {\n assistantCode,\n entity,\n message,\n // Contexto redigido: a Central pode enriquecer, mas o Core não envia PII por padrão.\n context: { redactionPolicy: \"default\" },\n },\n { headers: { \"x-oon-origin\": \"assistant\" } }\n );\n return data.reply ?? data.message ?? \"\";\n },\n onSuccess: (reply) => setMessages((prev) => [...prev, { role: \"assistant\", content: reply }]),\n });\n\n const send = () => {\n const text = input.trim();\n if (!text) return;\n setMessages((prev) => [...prev, { role: \"user\", content: text }]);\n setInput(\"\");\n ask.mutate(text);\n };\n\n return (\n <Stack gap={4} maxW=\"560px\">\n <Heading size=\"md\">{label}</Heading>\n <Box borderWidth=\"1px\" borderColor=\"gray.200\" borderRadius=\"md\" bg=\"white\" p={4} minH=\"240px\">\n <Stack gap={3}>\n {messages.length === 0 ? (\n <Text color=\"gray.400\" fontSize=\"sm\">\n Faça uma pergunta ao assistente.\n </Text>\n ) : (\n messages.map((m, idx) => (\n <Flex key={idx} justify={m.role === \"user\" ? \"flex-end\" : \"flex-start\"}>\n <Box\n bg={m.role === \"user\" ? \"brand.500\" : \"gray.100\"}\n color={m.role === \"user\" ? \"white\" : \"gray.800\"}\n px={3}\n py={2}\n borderRadius=\"md\"\n maxW=\"80%\"\n fontSize=\"sm\"\n >\n {m.content}\n </Box>\n </Flex>\n ))\n )}\n {ask.isPending ? (\n <Text color=\"gray.400\" fontSize=\"sm\">\n Pensando…\n </Text>\n ) : null}\n {ask.isError ? (\n <Text color=\"red.600\" fontSize=\"sm\">\n {ask.error?.message}\n </Text>\n ) : null}\n </Stack>\n </Box>\n <Flex gap={2}>\n <Input\n size=\"sm\"\n value={input}\n placeholder=\"Digite sua mensagem...\"\n onChange={(e) => setInput(e.currentTarget.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") send();\n }}\n />\n <Button size=\"sm\" colorPalette=\"blue\" onClick={send} loading={ask.isPending}>\n Enviar\n </Button>\n </Flex>\n </Stack>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { useOonAuth } from \"./AuthProvider\";\n\n/**\n * Esconde a UI quando o usuário não tem a permissão. NÃO é segurança real\n * (Seção 6.2, item 3) — o back é a autoridade. Serve apenas para não exibir\n * ações/menus que o usuário não pode usar.\n */\nexport function PermissionGate({\n permission,\n fallback = null,\n children,\n}: {\n permission?: string | string[];\n fallback?: ReactNode;\n children: ReactNode;\n}) {\n const { hasPermission } = useOonAuth();\n return <>{hasPermission(permission) ? children : fallback}</>;\n}\n"],"mappings":"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","names":["useMemo","axios","axios","useMemo","createContext","useContext","jsx","createContext","useContext","jsx","useMemo","useState","Box","Heading","Stack","useState","Box","Flex","Text","useQuery","jsx","Text","jsx","jsxs","jsx","jsxs","useState","useQuery","Box","Flex","Text","useState","Box","Button","Flex","Heading","Input","Text","jsx","jsxs","useState","Box","Heading","Text","Input","Flex","Button","jsx","jsxs","useState","Stack","Heading","Box","jsx","Box","Flex","Heading","Stack","Text","useQuery","jsx","jsxs","useQuery","Stack","Heading","Flex","Box","Text","Box","Heading","Stack","Text","jsx","jsxs","Stack","Heading","Box","Text","jsx","Box","Button","Flex","Spacer","Text","Box","Flex","Stack","Text","jsx","jsxs","Box","Flex","Text","Stack","jsx","jsxs","Flex","Text","Spacer","Button","Box","jsx","jsx","jsx","useMemo","storage","http","router","jsx","Box","Button","Flex","Heading","Stack","Text","useMutation","jsx","jsxs","useMutation","Stack","Flex","Heading","Button","Text","Box","Button","Flex","Heading","Stack","Text","useMutation","useQueryClient","jsx","jsxs","useQueryClient","useMutation","Stack","Flex","Heading","Button","Text","useState","Box","Button","Flex","Heading","Input","Stack","Text","useMutation","jsx","jsxs","useState","useMutation","Stack","Heading","Box","Text","Flex","Input","Button","Fragment","jsx"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oondemand/oon-core-front",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "git+https://github.com/oondemand/oon-platform.git",
|
|
7
|
+
"directory": "packages/oonCore-front"
|
|
8
|
+
},
|
|
4
9
|
"description": "Core de frontend para Centrais Oon: shell, providers, roteamento por metadata, SDK REST do /core/*, RBAC e componentes Core* (Coleção, Documento, Esteira, Multi-moedas, Assistente, Dashboard).",
|
|
5
10
|
"type": "module",
|
|
6
11
|
"main": "dist/index.js",
|