@snksergio/design-system 0.63.0 → 0.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist-lib/ai/componentes/AppShell.md +10 -0
  2. package/dist-lib/ai/componentes/DataTable.md +2 -1
  3. package/dist-lib/ai/componentes/TableToolbar.md +1 -1
  4. package/dist-lib/ai/global/componentes.md +7 -0
  5. package/dist-lib/ai/manifest.json +3 -3
  6. package/dist-lib/ai/regras-por-componente.json +1 -0
  7. package/dist-lib/ai/roteiros/crud-builder/entrevista.md +8 -1
  8. package/dist-lib/ai/roteiros/list-builder/entrevista.md +5 -0
  9. package/dist-lib/chunks/{kpi-delta-DyJRQjWb.cjs → kpi-delta-BDrsKM-f.cjs} +2 -2
  10. package/dist-lib/chunks/{kpi-delta-DyJRQjWb.cjs.map → kpi-delta-BDrsKM-f.cjs.map} +1 -1
  11. package/dist-lib/chunks/{kpi-delta-Df6C70_5.mjs → kpi-delta-iKhYhdD1.mjs} +2 -2
  12. package/dist-lib/chunks/{kpi-delta-Df6C70_5.mjs.map → kpi-delta-iKhYhdD1.mjs.map} +1 -1
  13. package/dist-lib/chunks/{panel-B-liPlxr.mjs → panel-B7uZTYVh.mjs} +6 -3
  14. package/dist-lib/chunks/{panel-B-liPlxr.mjs.map → panel-B7uZTYVh.mjs.map} +1 -1
  15. package/dist-lib/chunks/{panel-DoNbjeqX.cjs → panel-BihHQ-sP.cjs} +6 -3
  16. package/dist-lib/chunks/{panel-DoNbjeqX.cjs.map → panel-BihHQ-sP.cjs.map} +1 -1
  17. package/dist-lib/chunks/{useTheme-BwxTDdqf.mjs → useTheme-DwhMIlTr.mjs} +5 -1
  18. package/dist-lib/chunks/{useTheme-BwxTDdqf.mjs.map → useTheme-DwhMIlTr.mjs.map} +1 -1
  19. package/dist-lib/chunks/{useTheme-DUupiWzC.cjs → useTheme-N5Nc0jdR.cjs} +5 -1
  20. package/dist-lib/chunks/{useTheme-DUupiWzC.cjs.map → useTheme-N5Nc0jdR.cjs.map} +1 -1
  21. package/dist-lib/index.cjs +3 -3
  22. package/dist-lib/index.mjs +5 -5
  23. package/dist-lib/preview/chat.cjs +1 -1
  24. package/dist-lib/preview/chat.mjs +1 -1
  25. package/dist-lib/preview/clientes.cjs +2 -2
  26. package/dist-lib/preview/clientes.mjs +2 -2
  27. package/dist-lib/preview/dashboard.cjs +2 -2
  28. package/dist-lib/preview/dashboard.mjs +2 -2
  29. package/dist-lib/src/components/ui/AppShell/app-shell.d.ts.map +1 -1
  30. package/dist-lib/src/components/ui/AppShell/app-shell.types.d.ts +20 -1
  31. package/dist-lib/src/components/ui/AppShell/app-shell.types.d.ts.map +1 -1
  32. package/dist-lib/src/components/ui/DataTable/data-table.d.ts.map +1 -1
  33. package/dist-lib/src/components/ui/DataTable/data-table.types.d.ts +20 -2
  34. package/dist-lib/src/components/ui/DataTable/data-table.types.d.ts.map +1 -1
  35. package/package.json +1 -1
@@ -2,6 +2,7 @@
2
2
 
3
3
  <!-- ds:regras
4
4
  - tem áreas separadas (Comercial, Financeiro…)? → `sidebar="menu"` + `contexts`. Não tem? → `"single"` + `categories`, sem `sidebarModules` nem `sidebarShowSearch`
5
+ - **exceção: o app tem ESCOPO global** (empresa/unidade que recorta TODAS as páginas)? → `sidebarModule` (seletor, não troca menu) + `sidebarShowSearch` + `sidebarSearchCommand` (a paleta vira a seleção das unidades). NÃO é `sidebarModules`: aquele troca as `categories`
5
6
  - NÃO passe `sidebarLogo`: o default é a marca iGreen. Só com marca própria pedida explicitamente
6
7
  - `sidebarTitle` = nome do projeto (vai à direita da logo) — pergunte, não invente
7
8
  -->
@@ -65,8 +66,17 @@ sem erro nenhum.
65
66
  | `activeItemId` | string | — | Item ativo da single (a variante `menu` usa `activeItemHref`) |
66
67
  | `onSidebarItemClick` | (id: string) => void | — | Clique em item da single |
67
68
  | `sidebarModules` | SingleMenuModuleConfig[] | — | Módulos com menu próprio — o seletor troca o conjunto de categorias |
69
+ | `sidebarModule` | SingleMenuModule | — | **Seletor de ESCOPO** (empresa, workspace, unidade): ícone + título + subtítulo e, com `options`, dropdown. **Não troca o menu** — é a diferença com o plural acima. Use quando o menu é o mesmo em todas as opções; o plural, quando cada uma tem o seu. Passar os dois é erro: o seletor é um só |
68
70
  | `sidebarShowSearch` | boolean | — | Busca no topo da sidebar (é um botão que abre command palette, não um input) |
69
71
  | `sidebarSearchPlaceholder` | string | — | Placeholder da busca **da sidebar** — distinto do `searchPlaceholder`, que é do Header |
72
+ | `sidebarSearchCommand` | ReactNode | itens do menu | Conteúdo do `CommandList` da paleta da busca. Com ele o campo deixa de ser busca de menu e vira **seleção de escopo** (locais, filiais, safras). Exige `sidebarShowSearch`; pareie com `sidebarSearchPlaceholder` pra renomear o gatilho |
73
+
74
+ > **`sidebarModule` + `sidebarSearchCommand` = escopo global sem componente novo.** É o
75
+ > padrão "empresa no seletor, unidades na paleta" de CMS multi-tenant: o topo da sidebar
76
+ > vira o recorte que todas as páginas obedecem. As duas props existiam no
77
+ > `SingleMenuSidebar` desde sempre e **não eram repassadas** pelo shell até 2026-09-16 —
78
+ > quem precisava era empurrado pro `sidebarModules` com N entradas de categorias
79
+ > idênticas, que funciona por acidente. Gate: `sidebar-single-escopo.test.tsx`.
70
80
  | `defaultActiveContextId` | string | primeiro do array | Workspace inicial (uncontrolled) |
71
81
  | `activeContextId` | string | — | Workspace ativo (controlled) |
72
82
  | `onContextChange` | (id: string) => void | — | Callback de troca de workspace |
@@ -703,7 +703,8 @@ tableRef.current?.collapseAllTree(); // tree-data: recolhe todos os nós (n
703
703
  - `enableExport?` (false) — `true` = dropdown Exportar com CSV default; objeto `{ formats?, items? }` pra formatos custom
704
704
  - `enableFullscreen?` (false) — botão ⤢ na toolbar (entre Filtros e Configurações) que expande a tabela pra viewport inteira; Esc volta
705
705
  - `moreMenu?` — `{ items: DataTableMoreMenuItem[] }` — MoreMenu (⋯) no canto direito
706
- - `customLeft?` — ReactNode livre após search/refresh (controls custom)
706
+ - `customLeft?` — **ReactNode livre**, entre o refresh e a busca (mesma posição das `actions`, e antes delas quando as duas vêm juntas). É o único caminho pra um **componente** no toolbar: `actions` só aceita `ToolbarAction[]`, cujos kinds são `button`/`dropdown`/`input` e nenhum recebe componente. Use pra `DatePicker` de período, `Select` composto, segmented custom. ⚠️ Era **inerte** até 2026-09-16 (declarada, documentada, lida por nada — o TS aceitava e nada renderizava); gate: `datatable-toolbar-slots.test.tsx`
707
+ - `customActions?` — ⛔ **@deprecated e sem efeito** — nunca foi lida. Use `customLeft` (componente) ou `moreMenu.items` (itens de menu)
707
708
  - `viewToggle?` — override/esconde o segmented table/kanban auto-renderizado
708
709
 
709
710
  > Bulk actions vão em `selectionConfig.actions` (não no toolbar). Preset views vão na prop
@@ -27,7 +27,7 @@ Em `< md`: o `refresh` some (o menu Configurações cobre o resto).
27
27
  | `refresh` | Botão atualizar (`<ToolbarToolButton>`) |
28
28
  | `search` | Campo de busca (`<ToolbarSearch>`) |
29
29
  | `filter` | Filtro simples: use `<ToolbarFilterButton onClick isActive hasIndicator />` (funil, icon-only — **mesmo botão** no DataTable e DataList) → abre `<ToolbarSimpleFilterDrawer>` |
30
- | `actions` | Ações custom: `<ToolbarActions actions={[...]} />` (`button`/`dropdown`/`input`). Inline no desktop; **colapsam no ⋯ no mobile** (passe `extraItems` p/ absorver o ⋯ existente) |
30
+ | `actions` | Ações custom: `<ToolbarActions actions={[...]} />` (`button`/`dropdown`/`input`). Inline no desktop; **colapsam no ⋯ no mobile** (passe `extraItems` p/ absorver o ⋯ existente).<br><br>⚠️ **Este slot aceita qualquer nó** — `<ToolbarActions>` é só o uso comum. Pra um **componente** (um `DatePicker mode="range"` de período, um `Select` composto), passe-o direto aqui. Pelo `DataTable` o caminho é a prop `toolbar.customLeft`, que cai neste mesmo slot antes das `actions` — ela era **inerte até a v0.64.0** (declarada e lida por nada) |
31
31
  | `settings` | Configurações: sliders → drill-down (`<ToolbarSettingsMenu>` com Ordenação · Colunas · Filtros avançados · Densidade) |
32
32
  | `more` | Menu "⋯" (`<MoreMenu>`) — export + ações |
33
33
  | `bulkBar` | Substitui a toolbar inteira pela barra de ações em massa |
@@ -131,6 +131,13 @@ sem passar pela entrevista guiada** (é justamente aí que o erro aparece):
131
131
  (`defaultViews`, ex.: "Ativos", "Pendentes"; `allowCreateView={false}` se forem fixas).
132
132
  2. **X não é coluna, pequeno e simples** (período/mês, um toggle) → `toolbar.actions`
133
133
  (máx ~2, label curta). Período que afeta a página toda → `PageHeader.actions` (dropdown).
134
+ **Precisa de um COMPONENTE na barra** (um `DatePicker mode="range"` de período)? →
135
+ `toolbar.customLeft` do `data-table`, que renderiza entre o refresh e a busca —
136
+ `toolbar.actions` não serve, seus kinds são `button/dropdown/input` e nenhum recebe
137
+ componente. ⚠️ **Exige o DS `0.64.0` ou mais novo**: em `0.63.0` e anteriores a
138
+ prop existe no tipo, o TS aceita e **nada renderiza** (era declarada e lida por nada).
139
+ Confira sua versão antes de prometer o controle — e note que o `data-list` **não tem**
140
+ esse slot, só `toolbarActions`.
134
141
  3. **Muitos filtros, ou muito grandes** → drawer "Filtros" **nativo** do `data-table` + chips
135
142
  pré-aplicados. Nunca empilhar selects soltos.
136
143
 
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "pacote": "@snksergio/design-system",
3
- "versao": "0.63.0",
4
- "commit": "d9db4cd",
5
- "gerado": "2026-09-15",
3
+ "versao": "0.65.0",
4
+ "commit": "956f38c",
5
+ "gerado": "2026-09-16",
6
6
  "conteudo": {
7
7
  "roteiros": [
8
8
  "app-builder",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "AppShell": [
3
3
  "tem áreas separadas (Comercial, Financeiro…)? → `sidebar=\"menu\"` + `contexts`. Não tem? → `\"single\"` + `categories`, sem `sidebarModules` nem `sidebarShowSearch`",
4
+ "**exceção: o app tem ESCOPO global** (empresa/unidade que recorta TODAS as páginas)? → `sidebarModule` (seletor, não troca menu) + `sidebarShowSearch` + `sidebarSearchCommand` (a paleta vira a seleção das unidades). NÃO é `sidebarModules`: aquele troca as `categories`",
4
5
  "NÃO passe `sidebarLogo`: o default é a marca iGreen. Só com marca própria pedida explicitamente",
5
6
  "`sidebarTitle` = nome do projeto (vai à direita da logo) — pergunte, não invente"
6
7
  ],
@@ -90,6 +90,12 @@ em lote ("CNPJ sem copyable"). Critério completo e limites: `generate.md` item
90
90
  > `filterType`. Quer abrir já filtrado? **pré-aplique** (`defaultViews`/`presetView`
91
91
  > ou `filterModel`) → abre com o **chip aplicado**, editável, reativo. Pode pré-setar
92
92
  > **vários** (id/período/status/…), sem campos.
93
+ > - **Componente na barra → `toolbar.customLeft`, não `actions`.** Os kinds de
94
+ > `ToolbarAction` são `button`/`dropdown`/`input` e nenhum recebe componente; pra um
95
+ > `DatePicker mode="range"` de período use `customLeft`, que renderiza entre o refresh e
96
+ > a busca. ⚠️ **Exige o DS `0.64.0` ou mais novo** — em `0.63.0` e anteriores a
97
+ > prop existe no tipo, o TS aceita e **nada renderiza**. Confira a versão antes de
98
+ > prometer o controle.
93
99
  > - **toolbar.actions é SÓ pra caso pequeno e simples que NÃO reage com coluna** (ex.:
94
100
  > data/período, escopo) — **label curta**, **máx ~2**. Se mexe com coluna, é grande, ou
95
101
  > são muitos → **NÃO use o toolbar.**
@@ -105,7 +111,8 @@ em lote ("CNPJ sem copyable"). Critério completo e limites: `generate.md` item
105
111
  deletar direto). Pergunte o texto do confirm.
106
112
  - Seleção + ações em massa (exportar, etc.)? (`selectionConfig` + bulk actions).
107
113
  - Export: escopo (tudo / filtrado / selecionado) + formato (csv)? (`toolbar.enableExport`).
108
- - Ação custom no toolbar (ex.: seletor de período/mês, botão extra)? `toolbar.actions: ToolbarAction[]` (`button`/`dropdown`/`input`) — inline no desktop, colapsa no ⋯ no mobile. Oferecer só se o usuário pedir.
114
+ - Ação custom no toolbar (ex.: seletor de período por dropdown de meses, botão extra)? `toolbar.actions: ToolbarAction[]` (`button`/`dropdown`/`input`) — inline no desktop, colapsa no ⋯ no mobile. Oferecer só se o usuário pedir.
115
+ - **Componente** na barra (calendário de período, `Select` composto)? `toolbar.customLeft: ReactNode` — entre o refresh e a busca, antes das `actions`. É o único caminho: `ToolbarAction` não tem kind que receba componente. ⚠️ Exige o DS `0.64.0`+; antes dele a prop é inerte e falha em silêncio.
109
116
 
110
117
  ## Fase 4 — Views, paginação & densidade
111
118
 
@@ -132,6 +132,11 @@ refresh · busca · filtro(drawer) · ⋯. Sem colunas/toggle de visão.
132
132
  > - **Filtro por campo** (status/categoria/tipo/data…) → declare em `filterFields`. Quer
133
133
  > abrir já filtrado? **pré-aplique** via `views` ou `filterModel` → abre com o **chip
134
134
  > aplicado**, editável, reativo. Pode pré-setar **vários** de uma vez.
135
+ > - ⛔ **O `data-list` NÃO tem slot pra componente no toolbar.** O `data-table` ganhou
136
+ > `toolbar.customLeft` (`0.64.0`+); o `data-list` só tem `toolbarActions`, cujos kinds são
137
+ > `button`/`dropdown`/`input`. Seletor de período com calendário numa lista vai **fora**
138
+ > do componente (`PageHeader` ou linha própria). Não tente `customLeft` aqui — não
139
+ > existe e o TS reprova.
135
140
  > - **toolbarActions é SÓ pra caso pequeno e simples que NÃO reage com campo** (ex.:
136
141
  > data/período, escopo) — **label curta**, **máx ~2**. Se mexe com os campos, é grande,
137
142
  > ou são muitos → **NÃO use o toolbar.**
@@ -3,7 +3,7 @@ const jsxRuntime = require("react/jsx-runtime");
3
3
  const React = require("react");
4
4
  const avatar = require("./avatar-CMWPg3A3.cjs");
5
5
  const lucideReact = require("lucide-react");
6
- const useTheme = require("./useTheme-DUupiWzC.cjs");
6
+ const useTheme = require("./useTheme-N5Nc0jdR.cjs");
7
7
  const kpi = avatar.tv({
8
8
  slots: {
9
9
  root: "flex flex-col gap-gp-lg",
@@ -146,4 +146,4 @@ KpiDelta.displayName = "KpiDelta";
146
146
  exports.Kpi = Kpi;
147
147
  exports.KpiDelta = KpiDelta;
148
148
  exports.KpiGroup = KpiGroup;
149
- //# sourceMappingURL=kpi-delta-DyJRQjWb.cjs.map
149
+ //# sourceMappingURL=kpi-delta-BDrsKM-f.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"kpi-delta-DyJRQjWb.cjs","sources":["../../src/components/ui/Kpi/kpi.styles.ts","../../src/components/ui/Kpi/kpi-group.tsx","../../src/components/ui/Kpi/kpi.tsx","../../src/components/ui/Kpi/kpi-delta.tsx"],"sourcesContent":["import { tv } from \"@/utils/tv\";\r\n\r\n/* ══════════════════════════════════════════════════════════════════════════\r\n Kpi — estilos (tv). 100% sobre tokens do DS, theme-aware.\r\n ══════════════════════════════════════════════════════════════════════════ */\r\n\r\nexport const kpi = tv({\r\n slots: {\r\n root: \"flex flex-col gap-gp-lg\",\r\n header: \"flex items-start justify-between gap-gp-md\",\r\n label: \"m-0 text-body-md font-semibold text-fg-default\",\r\n iconBox:\r\n \"grid size-form-lg shrink-0 place-items-center rounded-radius-lg [&>svg]:size-icon-md\",\r\n main: \"flex flex-col gap-gp-xs\",\r\n valueRow: \"flex flex-wrap items-center gap-gp-md\",\r\n value:\r\n \"leading-none text-fg-default [font-variant-numeric:tabular-nums]\",\r\n hint: \"text-caption-sm text-fg-subtle\",\r\n chart: \"mt-gp-xs\",\r\n footnote:\r\n \"mt-pad-md border-t border-border-subtle pt-pad-lg text-caption-md text-fg-muted\",\r\n },\r\n variants: {\r\n // Tamanho do valor de destaque — presets `stat-*` (número de métrica).\r\n // Default `md` (24px) = idêntico ao antigo `body-2xl`. Weight/leading tight\r\n // vêm do preset + slot; pareado com tabular-nums.\r\n size: {\r\n sm: { value: \"text-stat-sm\" },\r\n md: { value: \"text-stat-md\" },\r\n lg: { value: \"text-stat-lg\" },\r\n xl: { value: \"text-stat-xl\" },\r\n },\r\n surface: {\r\n card: {\r\n root: \"rounded-radius-xl border border-border-subtle bg-bg-surface p-pad-3xl shadow-sh-sm\",\r\n },\r\n plain: { root: \"p-pad-3xl\" },\r\n },\r\n tone: {\r\n brand: { iconBox: \"bg-bg-brand-subtle text-fg-brand\" },\r\n success: { iconBox: \"bg-bg-success-muted text-fg-success\" },\r\n warning: { iconBox: \"bg-bg-warning-muted text-fg-warning\" },\r\n info: { iconBox: \"bg-bg-info-muted text-fg-info\" },\r\n danger: { iconBox: \"bg-bg-danger-muted text-fg-danger\" },\r\n neutral: { iconBox: \"bg-bg-muted text-fg-muted\" },\r\n },\r\n },\r\n defaultVariants: {\r\n size: \"md\",\r\n surface: \"card\",\r\n tone: \"neutral\",\r\n },\r\n});\r\n\r\nexport const kpiGroup = tv({\r\n base: \"grid w-full\",\r\n variants: {\r\n columns: {\r\n 2: \"grid-cols-1 sm:grid-cols-2\",\r\n 3: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\",\r\n 4: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-4\",\r\n 5: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-5\",\r\n 6: \"grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-6\",\r\n },\r\n divided: {\r\n // 1 card único com divisórias (linha no mobile, coluna no sm+)\r\n true: \"overflow-hidden rounded-radius-xl border border-border-subtle bg-bg-surface shadow-sh-sm divide-y divide-border-subtle sm:divide-y-0 sm:divide-x\",\r\n false: \"gap-gp-2xl\",\r\n },\r\n },\r\n defaultVariants: {\r\n columns: 4,\r\n divided: false,\r\n },\r\n});\r\n","\"use client\";\r\n\r\nimport { createContext } from \"react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { kpiGroup } from \"./kpi.styles\";\r\nimport type { KpiGroupProps } from \"./kpi.types\";\r\n\r\n/** Superfície herdada pelos `Kpi` filhos (card normal vs plain dentro de divided). */\r\nexport const KpiSurfaceContext = createContext<\"card\" | \"plain\">(\"card\");\r\n\r\n/**\r\n * KpiGroup — layout de composição pros `Kpi`. `columns` (responsivo) e\r\n * `divided` (vira 1 card único com divisórias entre os KPIs).\r\n */\r\nexport function KpiGroup({\r\n columns = 4,\r\n divided = false,\r\n children,\r\n className,\r\n}: KpiGroupProps) {\r\n return (\r\n <KpiSurfaceContext.Provider value={divided ? \"plain\" : \"card\"}>\r\n <div className={cn(kpiGroup({ columns, divided }), className)}>\r\n {children}\r\n </div>\r\n </KpiSurfaceContext.Provider>\r\n );\r\n}\r\n\r\nKpiGroup.displayName = \"KpiGroup\";\r\n","\"use client\";\r\n\r\nimport { useContext } from \"react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { kpi } from \"./kpi.styles\";\r\nimport { KpiSurfaceContext } from \"./kpi-group\";\r\nimport type { KpiProps } from \"./kpi.types\";\r\n\r\n/**\r\n * Kpi — card de KPI composável: header (label + ícone por tone), valor +\r\n * delta, hint, slot livre (sparkline/chart) e footnote. Use dentro de\r\n * `KpiGroup` pra rows/grids; dentro de `KpiGroup divided` ele vira \"plain\".\r\n */\r\nexport function Kpi({\r\n label,\r\n value,\r\n delta,\r\n hint,\r\n icon,\r\n tone = \"neutral\",\r\n size = \"md\",\r\n footnote,\r\n children,\r\n surface,\r\n className,\r\n}: KpiProps) {\r\n const inherited = useContext(KpiSurfaceContext);\r\n const s = kpi({ size, surface: surface ?? inherited, tone });\r\n\r\n return (\r\n <article className={cn(s.root(), className)}>\r\n <header className={s.header()}>\r\n <h3 className={s.label()}>{label}</h3>\r\n {icon && (\r\n <span className={s.iconBox()} aria-hidden>\r\n {icon}\r\n </span>\r\n )}\r\n </header>\r\n <div className={s.main()}>\r\n <div className={s.valueRow()}>\r\n <span className={s.value()}>{value}</span>\r\n {delta}\r\n </div>\r\n {hint && <span className={s.hint()}>{hint}</span>}\r\n </div>\r\n {children && <div className={s.chart()}>{children}</div>}\r\n {footnote && <div className={s.footnote()}>{footnote}</div>}\r\n </article>\r\n );\r\n}\r\n\r\nKpi.displayName = \"Kpi\";\r\n","\"use client\";\r\n\r\nimport { TrendingUp } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { Chip } from \"@/components/ui/Chip\";\r\nimport type { KpiDeltaProps } from \"./kpi.types\";\r\n\r\n/**\r\n * KpiDelta — pílula de variação (sobre o Chip). Tom semântico explícito\r\n * (success/danger/neutral) + seta opcional. O tom é decisão do consumidor —\r\n * \"subir\" nem sempre é positivo (ex.: tempo de espera).\r\n *\r\n * `signed` deriva tom+seta do sinal do `value` (\"-\" → danger/down; senão\r\n * success/up). `tone`/`direction` explícitos sempre vencem.\r\n */\r\nexport function KpiDelta({\r\n value,\r\n tone,\r\n direction,\r\n signed = false,\r\n className,\r\n}: KpiDeltaProps) {\r\n const isNegative =\r\n signed && typeof value === \"string\" && value.trim().startsWith(\"-\");\r\n const resolvedTone = tone ?? (signed ? (isNegative ? \"danger\" : \"success\") : \"success\");\r\n const resolvedDirection = direction ?? (signed ? (isNegative ? \"down\" : \"up\") : undefined);\r\n\r\n return (\r\n <Chip\r\n color={resolvedTone}\r\n variant=\"soft\"\r\n size=\"sm\"\r\n shape=\"pill\"\r\n className={className}\r\n >\r\n {resolvedDirection && (\r\n <TrendingUp\r\n className={cn(\"size-[12px]\", resolvedDirection === \"down\" && \"rotate-180\")}\r\n aria-hidden\r\n />\r\n )}\r\n {value}\r\n </Chip>\r\n );\r\n}\r\n\r\nKpiDelta.displayName = \"KpiDelta\";\r\n"],"names":["tv","createContext","jsx","cn","useContext","jsxs","Chip","TrendingUp"],"mappings":"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"}
1
+ {"version":3,"file":"kpi-delta-BDrsKM-f.cjs","sources":["../../src/components/ui/Kpi/kpi.styles.ts","../../src/components/ui/Kpi/kpi-group.tsx","../../src/components/ui/Kpi/kpi.tsx","../../src/components/ui/Kpi/kpi-delta.tsx"],"sourcesContent":["import { tv } from \"@/utils/tv\";\r\n\r\n/* ══════════════════════════════════════════════════════════════════════════\r\n Kpi — estilos (tv). 100% sobre tokens do DS, theme-aware.\r\n ══════════════════════════════════════════════════════════════════════════ */\r\n\r\nexport const kpi = tv({\r\n slots: {\r\n root: \"flex flex-col gap-gp-lg\",\r\n header: \"flex items-start justify-between gap-gp-md\",\r\n label: \"m-0 text-body-md font-semibold text-fg-default\",\r\n iconBox:\r\n \"grid size-form-lg shrink-0 place-items-center rounded-radius-lg [&>svg]:size-icon-md\",\r\n main: \"flex flex-col gap-gp-xs\",\r\n valueRow: \"flex flex-wrap items-center gap-gp-md\",\r\n value:\r\n \"leading-none text-fg-default [font-variant-numeric:tabular-nums]\",\r\n hint: \"text-caption-sm text-fg-subtle\",\r\n chart: \"mt-gp-xs\",\r\n footnote:\r\n \"mt-pad-md border-t border-border-subtle pt-pad-lg text-caption-md text-fg-muted\",\r\n },\r\n variants: {\r\n // Tamanho do valor de destaque — presets `stat-*` (número de métrica).\r\n // Default `md` (24px) = idêntico ao antigo `body-2xl`. Weight/leading tight\r\n // vêm do preset + slot; pareado com tabular-nums.\r\n size: {\r\n sm: { value: \"text-stat-sm\" },\r\n md: { value: \"text-stat-md\" },\r\n lg: { value: \"text-stat-lg\" },\r\n xl: { value: \"text-stat-xl\" },\r\n },\r\n surface: {\r\n card: {\r\n root: \"rounded-radius-xl border border-border-subtle bg-bg-surface p-pad-3xl shadow-sh-sm\",\r\n },\r\n plain: { root: \"p-pad-3xl\" },\r\n },\r\n tone: {\r\n brand: { iconBox: \"bg-bg-brand-subtle text-fg-brand\" },\r\n success: { iconBox: \"bg-bg-success-muted text-fg-success\" },\r\n warning: { iconBox: \"bg-bg-warning-muted text-fg-warning\" },\r\n info: { iconBox: \"bg-bg-info-muted text-fg-info\" },\r\n danger: { iconBox: \"bg-bg-danger-muted text-fg-danger\" },\r\n neutral: { iconBox: \"bg-bg-muted text-fg-muted\" },\r\n },\r\n },\r\n defaultVariants: {\r\n size: \"md\",\r\n surface: \"card\",\r\n tone: \"neutral\",\r\n },\r\n});\r\n\r\nexport const kpiGroup = tv({\r\n base: \"grid w-full\",\r\n variants: {\r\n columns: {\r\n 2: \"grid-cols-1 sm:grid-cols-2\",\r\n 3: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\",\r\n 4: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-4\",\r\n 5: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-5\",\r\n 6: \"grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-6\",\r\n },\r\n divided: {\r\n // 1 card único com divisórias (linha no mobile, coluna no sm+)\r\n true: \"overflow-hidden rounded-radius-xl border border-border-subtle bg-bg-surface shadow-sh-sm divide-y divide-border-subtle sm:divide-y-0 sm:divide-x\",\r\n false: \"gap-gp-2xl\",\r\n },\r\n },\r\n defaultVariants: {\r\n columns: 4,\r\n divided: false,\r\n },\r\n});\r\n","\"use client\";\r\n\r\nimport { createContext } from \"react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { kpiGroup } from \"./kpi.styles\";\r\nimport type { KpiGroupProps } from \"./kpi.types\";\r\n\r\n/** Superfície herdada pelos `Kpi` filhos (card normal vs plain dentro de divided). */\r\nexport const KpiSurfaceContext = createContext<\"card\" | \"plain\">(\"card\");\r\n\r\n/**\r\n * KpiGroup — layout de composição pros `Kpi`. `columns` (responsivo) e\r\n * `divided` (vira 1 card único com divisórias entre os KPIs).\r\n */\r\nexport function KpiGroup({\r\n columns = 4,\r\n divided = false,\r\n children,\r\n className,\r\n}: KpiGroupProps) {\r\n return (\r\n <KpiSurfaceContext.Provider value={divided ? \"plain\" : \"card\"}>\r\n <div className={cn(kpiGroup({ columns, divided }), className)}>\r\n {children}\r\n </div>\r\n </KpiSurfaceContext.Provider>\r\n );\r\n}\r\n\r\nKpiGroup.displayName = \"KpiGroup\";\r\n","\"use client\";\r\n\r\nimport { useContext } from \"react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { kpi } from \"./kpi.styles\";\r\nimport { KpiSurfaceContext } from \"./kpi-group\";\r\nimport type { KpiProps } from \"./kpi.types\";\r\n\r\n/**\r\n * Kpi — card de KPI composável: header (label + ícone por tone), valor +\r\n * delta, hint, slot livre (sparkline/chart) e footnote. Use dentro de\r\n * `KpiGroup` pra rows/grids; dentro de `KpiGroup divided` ele vira \"plain\".\r\n */\r\nexport function Kpi({\r\n label,\r\n value,\r\n delta,\r\n hint,\r\n icon,\r\n tone = \"neutral\",\r\n size = \"md\",\r\n footnote,\r\n children,\r\n surface,\r\n className,\r\n}: KpiProps) {\r\n const inherited = useContext(KpiSurfaceContext);\r\n const s = kpi({ size, surface: surface ?? inherited, tone });\r\n\r\n return (\r\n <article className={cn(s.root(), className)}>\r\n <header className={s.header()}>\r\n <h3 className={s.label()}>{label}</h3>\r\n {icon && (\r\n <span className={s.iconBox()} aria-hidden>\r\n {icon}\r\n </span>\r\n )}\r\n </header>\r\n <div className={s.main()}>\r\n <div className={s.valueRow()}>\r\n <span className={s.value()}>{value}</span>\r\n {delta}\r\n </div>\r\n {hint && <span className={s.hint()}>{hint}</span>}\r\n </div>\r\n {children && <div className={s.chart()}>{children}</div>}\r\n {footnote && <div className={s.footnote()}>{footnote}</div>}\r\n </article>\r\n );\r\n}\r\n\r\nKpi.displayName = \"Kpi\";\r\n","\"use client\";\r\n\r\nimport { TrendingUp } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { Chip } from \"@/components/ui/Chip\";\r\nimport type { KpiDeltaProps } from \"./kpi.types\";\r\n\r\n/**\r\n * KpiDelta — pílula de variação (sobre o Chip). Tom semântico explícito\r\n * (success/danger/neutral) + seta opcional. O tom é decisão do consumidor —\r\n * \"subir\" nem sempre é positivo (ex.: tempo de espera).\r\n *\r\n * `signed` deriva tom+seta do sinal do `value` (\"-\" → danger/down; senão\r\n * success/up). `tone`/`direction` explícitos sempre vencem.\r\n */\r\nexport function KpiDelta({\r\n value,\r\n tone,\r\n direction,\r\n signed = false,\r\n className,\r\n}: KpiDeltaProps) {\r\n const isNegative =\r\n signed && typeof value === \"string\" && value.trim().startsWith(\"-\");\r\n const resolvedTone = tone ?? (signed ? (isNegative ? \"danger\" : \"success\") : \"success\");\r\n const resolvedDirection = direction ?? (signed ? (isNegative ? \"down\" : \"up\") : undefined);\r\n\r\n return (\r\n <Chip\r\n color={resolvedTone}\r\n variant=\"soft\"\r\n size=\"sm\"\r\n shape=\"pill\"\r\n className={className}\r\n >\r\n {resolvedDirection && (\r\n <TrendingUp\r\n className={cn(\"size-[12px]\", resolvedDirection === \"down\" && \"rotate-180\")}\r\n aria-hidden\r\n />\r\n )}\r\n {value}\r\n </Chip>\r\n );\r\n}\r\n\r\nKpiDelta.displayName = \"KpiDelta\";\r\n"],"names":["tv","createContext","jsx","cn","useContext","jsxs","Chip","TrendingUp"],"mappings":";;;;;;AAMO,MAAM,MAAMA,OAAAA,GAAG;AAAA,EACpB,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SACE;AAAA,IACF,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OACE;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UACE;AAAA,EAAA;AAAA,EAEJ,UAAU;AAAA;AAAA;AAAA;AAAA,IAIR,MAAM;AAAA,MACJ,IAAI,EAAE,OAAO,eAAA;AAAA,MACb,IAAI,EAAE,OAAO,eAAA;AAAA,MACb,IAAI,EAAE,OAAO,eAAA;AAAA,MACb,IAAI,EAAE,OAAO,eAAA;AAAA,IAAe;AAAA,IAE9B,SAAS;AAAA,MACP,MAAM;AAAA,QACJ,MAAM;AAAA,MAAA;AAAA,MAER,OAAO,EAAE,MAAM,YAAA;AAAA,IAAY;AAAA,IAE7B,MAAM;AAAA,MACJ,OAAO,EAAE,SAAS,mCAAA;AAAA,MAClB,SAAS,EAAE,SAAS,sCAAA;AAAA,MACpB,SAAS,EAAE,SAAS,sCAAA;AAAA,MACpB,MAAM,EAAE,SAAS,gCAAA;AAAA,MACjB,QAAQ,EAAE,SAAS,oCAAA;AAAA,MACnB,SAAS,EAAE,SAAS,4BAAA;AAAA,IAA4B;AAAA,EAClD;AAAA,EAEF,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,EAAA;AAEV,CAAC;AAEM,MAAM,WAAWA,OAAAA,GAAG;AAAA,EACzB,MAAM;AAAA,EACN,UAAU;AAAA,IACR,SAAS;AAAA,MACP,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,IAAA;AAAA,IAEL,SAAS;AAAA;AAAA,MAEP,MAAM;AAAA,MACN,OAAO;AAAA,IAAA;AAAA,EACT;AAAA,EAEF,iBAAiB;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,EAAA;AAEb,CAAC;AClEM,MAAM,oBAAoBC,MAAAA,cAAgC,MAAM;AAMhE,SAAS,SAAS;AAAA,EACvB,UAAU;AAAA,EACV,UAAU;AAAA,EACV;AAAA,EACA;AACF,GAAkB;AAChB,SACEC,2BAAAA,IAAC,kBAAkB,UAAlB,EAA2B,OAAO,UAAU,UAAU,QACrD,UAAAA,+BAAC,OAAA,EAAI,WAAWC,OAAAA,GAAG,SAAS,EAAE,SAAS,SAAS,GAAG,SAAS,GACzD,SAAA,CACH,GACF;AAEJ;AAEA,SAAS,cAAc;AChBhB,SAAS,IAAI;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAa;AACX,QAAM,YAAYC,MAAAA,WAAW,iBAAiB;AAC9C,QAAM,IAAI,IAAI,EAAE,MAAM,SAAS,WAAW,WAAW,MAAM;AAE3D,SACEC,2BAAAA,KAAC,aAAQ,WAAWF,OAAAA,GAAG,EAAE,KAAA,GAAQ,SAAS,GACxC,UAAA;AAAA,IAAAE,2BAAAA,KAAC,UAAA,EAAO,WAAW,EAAE,OAAA,GACnB,UAAA;AAAA,MAAAH,+BAAC,MAAA,EAAG,WAAW,EAAE,SAAU,UAAA,OAAM;AAAA,MAChC,uCACE,QAAA,EAAK,WAAW,EAAE,QAAA,GAAW,eAAW,MACtC,UAAA,KAAA,CACH;AAAA,IAAA,GAEJ;AAAA,IACAG,2BAAAA,KAAC,OAAA,EAAI,WAAW,EAAE,QAChB,UAAA;AAAA,MAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAW,EAAE,SAAA,GAChB,UAAA;AAAA,QAAAH,+BAAC,QAAA,EAAK,WAAW,EAAE,SAAU,UAAA,OAAM;AAAA,QAClC;AAAA,MAAA,GACH;AAAA,MACC,QAAQA,2BAAAA,IAAC,QAAA,EAAK,WAAW,EAAE,KAAA,GAAS,UAAA,KAAA,CAAK;AAAA,IAAA,GAC5C;AAAA,IACC,YAAYA,2BAAAA,IAAC,OAAA,EAAI,WAAW,EAAE,MAAA,GAAU,UAAS;AAAA,IACjD,YAAYA,2BAAAA,IAAC,OAAA,EAAI,WAAW,EAAE,SAAA,GAAa,UAAA,SAAA,CAAS;AAAA,EAAA,GACvD;AAEJ;AAEA,IAAI,cAAc;ACrCX,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AACF,GAAkB;AAChB,QAAM,aACJ,UAAU,OAAO,UAAU,YAAY,MAAM,KAAA,EAAO,WAAW,GAAG;AACpE,QAAM,eAAe,SAAS,SAAU,aAAa,WAAW,YAAa;AAC7E,QAAM,oBAAoB,cAAc,SAAU,aAAa,SAAS,OAAQ;AAEhF,SACEG,2BAAAA;AAAAA,IAACC,SAAAA;AAAAA,IAAA;AAAA,MACC,OAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MACN;AAAA,MAEC,UAAA;AAAA,QAAA,qBACCJ,2BAAAA;AAAAA,UAACK,YAAAA;AAAAA,UAAA;AAAA,YACC,WAAWJ,OAAAA,GAAG,eAAe,sBAAsB,UAAU,YAAY;AAAA,YACzE,eAAW;AAAA,UAAA;AAAA,QAAA;AAAA,QAGd;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAAS,cAAc;;;;"}
@@ -2,7 +2,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { createContext, useContext } from "react";
3
3
  import { af as tv, c as cn } from "./avatar-CZRLkTxt.mjs";
4
4
  import { TrendingUp } from "lucide-react";
5
- import { C as Chip } from "./useTheme-BwxTDdqf.mjs";
5
+ import { C as Chip } from "./useTheme-DwhMIlTr.mjs";
6
6
  const kpi = tv({
7
7
  slots: {
8
8
  root: "flex flex-col gap-gp-lg",
@@ -147,4 +147,4 @@ export {
147
147
  Kpi as a,
148
148
  KpiDelta as b
149
149
  };
150
- //# sourceMappingURL=kpi-delta-Df6C70_5.mjs.map
150
+ //# sourceMappingURL=kpi-delta-iKhYhdD1.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"kpi-delta-Df6C70_5.mjs","sources":["../../src/components/ui/Kpi/kpi.styles.ts","../../src/components/ui/Kpi/kpi-group.tsx","../../src/components/ui/Kpi/kpi.tsx","../../src/components/ui/Kpi/kpi-delta.tsx"],"sourcesContent":["import { tv } from \"@/utils/tv\";\r\n\r\n/* ══════════════════════════════════════════════════════════════════════════\r\n Kpi — estilos (tv). 100% sobre tokens do DS, theme-aware.\r\n ══════════════════════════════════════════════════════════════════════════ */\r\n\r\nexport const kpi = tv({\r\n slots: {\r\n root: \"flex flex-col gap-gp-lg\",\r\n header: \"flex items-start justify-between gap-gp-md\",\r\n label: \"m-0 text-body-md font-semibold text-fg-default\",\r\n iconBox:\r\n \"grid size-form-lg shrink-0 place-items-center rounded-radius-lg [&>svg]:size-icon-md\",\r\n main: \"flex flex-col gap-gp-xs\",\r\n valueRow: \"flex flex-wrap items-center gap-gp-md\",\r\n value:\r\n \"leading-none text-fg-default [font-variant-numeric:tabular-nums]\",\r\n hint: \"text-caption-sm text-fg-subtle\",\r\n chart: \"mt-gp-xs\",\r\n footnote:\r\n \"mt-pad-md border-t border-border-subtle pt-pad-lg text-caption-md text-fg-muted\",\r\n },\r\n variants: {\r\n // Tamanho do valor de destaque — presets `stat-*` (número de métrica).\r\n // Default `md` (24px) = idêntico ao antigo `body-2xl`. Weight/leading tight\r\n // vêm do preset + slot; pareado com tabular-nums.\r\n size: {\r\n sm: { value: \"text-stat-sm\" },\r\n md: { value: \"text-stat-md\" },\r\n lg: { value: \"text-stat-lg\" },\r\n xl: { value: \"text-stat-xl\" },\r\n },\r\n surface: {\r\n card: {\r\n root: \"rounded-radius-xl border border-border-subtle bg-bg-surface p-pad-3xl shadow-sh-sm\",\r\n },\r\n plain: { root: \"p-pad-3xl\" },\r\n },\r\n tone: {\r\n brand: { iconBox: \"bg-bg-brand-subtle text-fg-brand\" },\r\n success: { iconBox: \"bg-bg-success-muted text-fg-success\" },\r\n warning: { iconBox: \"bg-bg-warning-muted text-fg-warning\" },\r\n info: { iconBox: \"bg-bg-info-muted text-fg-info\" },\r\n danger: { iconBox: \"bg-bg-danger-muted text-fg-danger\" },\r\n neutral: { iconBox: \"bg-bg-muted text-fg-muted\" },\r\n },\r\n },\r\n defaultVariants: {\r\n size: \"md\",\r\n surface: \"card\",\r\n tone: \"neutral\",\r\n },\r\n});\r\n\r\nexport const kpiGroup = tv({\r\n base: \"grid w-full\",\r\n variants: {\r\n columns: {\r\n 2: \"grid-cols-1 sm:grid-cols-2\",\r\n 3: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\",\r\n 4: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-4\",\r\n 5: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-5\",\r\n 6: \"grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-6\",\r\n },\r\n divided: {\r\n // 1 card único com divisórias (linha no mobile, coluna no sm+)\r\n true: \"overflow-hidden rounded-radius-xl border border-border-subtle bg-bg-surface shadow-sh-sm divide-y divide-border-subtle sm:divide-y-0 sm:divide-x\",\r\n false: \"gap-gp-2xl\",\r\n },\r\n },\r\n defaultVariants: {\r\n columns: 4,\r\n divided: false,\r\n },\r\n});\r\n","\"use client\";\r\n\r\nimport { createContext } from \"react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { kpiGroup } from \"./kpi.styles\";\r\nimport type { KpiGroupProps } from \"./kpi.types\";\r\n\r\n/** Superfície herdada pelos `Kpi` filhos (card normal vs plain dentro de divided). */\r\nexport const KpiSurfaceContext = createContext<\"card\" | \"plain\">(\"card\");\r\n\r\n/**\r\n * KpiGroup — layout de composição pros `Kpi`. `columns` (responsivo) e\r\n * `divided` (vira 1 card único com divisórias entre os KPIs).\r\n */\r\nexport function KpiGroup({\r\n columns = 4,\r\n divided = false,\r\n children,\r\n className,\r\n}: KpiGroupProps) {\r\n return (\r\n <KpiSurfaceContext.Provider value={divided ? \"plain\" : \"card\"}>\r\n <div className={cn(kpiGroup({ columns, divided }), className)}>\r\n {children}\r\n </div>\r\n </KpiSurfaceContext.Provider>\r\n );\r\n}\r\n\r\nKpiGroup.displayName = \"KpiGroup\";\r\n","\"use client\";\r\n\r\nimport { useContext } from \"react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { kpi } from \"./kpi.styles\";\r\nimport { KpiSurfaceContext } from \"./kpi-group\";\r\nimport type { KpiProps } from \"./kpi.types\";\r\n\r\n/**\r\n * Kpi — card de KPI composável: header (label + ícone por tone), valor +\r\n * delta, hint, slot livre (sparkline/chart) e footnote. Use dentro de\r\n * `KpiGroup` pra rows/grids; dentro de `KpiGroup divided` ele vira \"plain\".\r\n */\r\nexport function Kpi({\r\n label,\r\n value,\r\n delta,\r\n hint,\r\n icon,\r\n tone = \"neutral\",\r\n size = \"md\",\r\n footnote,\r\n children,\r\n surface,\r\n className,\r\n}: KpiProps) {\r\n const inherited = useContext(KpiSurfaceContext);\r\n const s = kpi({ size, surface: surface ?? inherited, tone });\r\n\r\n return (\r\n <article className={cn(s.root(), className)}>\r\n <header className={s.header()}>\r\n <h3 className={s.label()}>{label}</h3>\r\n {icon && (\r\n <span className={s.iconBox()} aria-hidden>\r\n {icon}\r\n </span>\r\n )}\r\n </header>\r\n <div className={s.main()}>\r\n <div className={s.valueRow()}>\r\n <span className={s.value()}>{value}</span>\r\n {delta}\r\n </div>\r\n {hint && <span className={s.hint()}>{hint}</span>}\r\n </div>\r\n {children && <div className={s.chart()}>{children}</div>}\r\n {footnote && <div className={s.footnote()}>{footnote}</div>}\r\n </article>\r\n );\r\n}\r\n\r\nKpi.displayName = \"Kpi\";\r\n","\"use client\";\r\n\r\nimport { TrendingUp } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { Chip } from \"@/components/ui/Chip\";\r\nimport type { KpiDeltaProps } from \"./kpi.types\";\r\n\r\n/**\r\n * KpiDelta — pílula de variação (sobre o Chip). Tom semântico explícito\r\n * (success/danger/neutral) + seta opcional. O tom é decisão do consumidor —\r\n * \"subir\" nem sempre é positivo (ex.: tempo de espera).\r\n *\r\n * `signed` deriva tom+seta do sinal do `value` (\"-\" → danger/down; senão\r\n * success/up). `tone`/`direction` explícitos sempre vencem.\r\n */\r\nexport function KpiDelta({\r\n value,\r\n tone,\r\n direction,\r\n signed = false,\r\n className,\r\n}: KpiDeltaProps) {\r\n const isNegative =\r\n signed && typeof value === \"string\" && value.trim().startsWith(\"-\");\r\n const resolvedTone = tone ?? (signed ? (isNegative ? \"danger\" : \"success\") : \"success\");\r\n const resolvedDirection = direction ?? (signed ? (isNegative ? \"down\" : \"up\") : undefined);\r\n\r\n return (\r\n <Chip\r\n color={resolvedTone}\r\n variant=\"soft\"\r\n size=\"sm\"\r\n shape=\"pill\"\r\n className={className}\r\n >\r\n {resolvedDirection && (\r\n <TrendingUp\r\n className={cn(\"size-[12px]\", resolvedDirection === \"down\" && \"rotate-180\")}\r\n aria-hidden\r\n />\r\n )}\r\n {value}\r\n </Chip>\r\n );\r\n}\r\n\r\nKpiDelta.displayName = \"KpiDelta\";\r\n"],"names":[],"mappings":";;;;;AAMO,MAAM,MAAM,GAAG;AAAA,EACpB,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SACE;AAAA,IACF,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OACE;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UACE;AAAA,EAAA;AAAA,EAEJ,UAAU;AAAA;AAAA;AAAA;AAAA,IAIR,MAAM;AAAA,MACJ,IAAI,EAAE,OAAO,eAAA;AAAA,MACb,IAAI,EAAE,OAAO,eAAA;AAAA,MACb,IAAI,EAAE,OAAO,eAAA;AAAA,MACb,IAAI,EAAE,OAAO,eAAA;AAAA,IAAe;AAAA,IAE9B,SAAS;AAAA,MACP,MAAM;AAAA,QACJ,MAAM;AAAA,MAAA;AAAA,MAER,OAAO,EAAE,MAAM,YAAA;AAAA,IAAY;AAAA,IAE7B,MAAM;AAAA,MACJ,OAAO,EAAE,SAAS,mCAAA;AAAA,MAClB,SAAS,EAAE,SAAS,sCAAA;AAAA,MACpB,SAAS,EAAE,SAAS,sCAAA;AAAA,MACpB,MAAM,EAAE,SAAS,gCAAA;AAAA,MACjB,QAAQ,EAAE,SAAS,oCAAA;AAAA,MACnB,SAAS,EAAE,SAAS,4BAAA;AAAA,IAA4B;AAAA,EAClD;AAAA,EAEF,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,EAAA;AAEV,CAAC;AAEM,MAAM,WAAW,GAAG;AAAA,EACzB,MAAM;AAAA,EACN,UAAU;AAAA,IACR,SAAS;AAAA,MACP,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,IAAA;AAAA,IAEL,SAAS;AAAA;AAAA,MAEP,MAAM;AAAA,MACN,OAAO;AAAA,IAAA;AAAA,EACT;AAAA,EAEF,iBAAiB;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,EAAA;AAEb,CAAC;AClEM,MAAM,oBAAoB,cAAgC,MAAM;AAMhE,SAAS,SAAS;AAAA,EACvB,UAAU;AAAA,EACV,UAAU;AAAA,EACV;AAAA,EACA;AACF,GAAkB;AAChB,SACE,oBAAC,kBAAkB,UAAlB,EAA2B,OAAO,UAAU,UAAU,QACrD,UAAA,oBAAC,OAAA,EAAI,WAAW,GAAG,SAAS,EAAE,SAAS,SAAS,GAAG,SAAS,GACzD,SAAA,CACH,GACF;AAEJ;AAEA,SAAS,cAAc;AChBhB,SAAS,IAAI;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAa;AACX,QAAM,YAAY,WAAW,iBAAiB;AAC9C,QAAM,IAAI,IAAI,EAAE,MAAM,SAAS,WAAW,WAAW,MAAM;AAE3D,SACE,qBAAC,aAAQ,WAAW,GAAG,EAAE,KAAA,GAAQ,SAAS,GACxC,UAAA;AAAA,IAAA,qBAAC,UAAA,EAAO,WAAW,EAAE,OAAA,GACnB,UAAA;AAAA,MAAA,oBAAC,MAAA,EAAG,WAAW,EAAE,SAAU,UAAA,OAAM;AAAA,MAChC,4BACE,QAAA,EAAK,WAAW,EAAE,QAAA,GAAW,eAAW,MACtC,UAAA,KAAA,CACH;AAAA,IAAA,GAEJ;AAAA,IACA,qBAAC,OAAA,EAAI,WAAW,EAAE,QAChB,UAAA;AAAA,MAAA,qBAAC,OAAA,EAAI,WAAW,EAAE,SAAA,GAChB,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,WAAW,EAAE,SAAU,UAAA,OAAM;AAAA,QAClC;AAAA,MAAA,GACH;AAAA,MACC,QAAQ,oBAAC,QAAA,EAAK,WAAW,EAAE,KAAA,GAAS,UAAA,KAAA,CAAK;AAAA,IAAA,GAC5C;AAAA,IACC,YAAY,oBAAC,OAAA,EAAI,WAAW,EAAE,MAAA,GAAU,UAAS;AAAA,IACjD,YAAY,oBAAC,OAAA,EAAI,WAAW,EAAE,SAAA,GAAa,UAAA,SAAA,CAAS;AAAA,EAAA,GACvD;AAEJ;AAEA,IAAI,cAAc;ACrCX,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AACF,GAAkB;AAChB,QAAM,aACJ,UAAU,OAAO,UAAU,YAAY,MAAM,KAAA,EAAO,WAAW,GAAG;AACpE,QAAM,eAAe,SAAS,SAAU,aAAa,WAAW,YAAa;AAC7E,QAAM,oBAAoB,cAAc,SAAU,aAAa,SAAS,OAAQ;AAEhF,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MACN;AAAA,MAEC,UAAA;AAAA,QAAA,qBACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW,GAAG,eAAe,sBAAsB,UAAU,YAAY;AAAA,YACzE,eAAW;AAAA,UAAA;AAAA,QAAA;AAAA,QAGd;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAAS,cAAc;"}
1
+ {"version":3,"file":"kpi-delta-iKhYhdD1.mjs","sources":["../../src/components/ui/Kpi/kpi.styles.ts","../../src/components/ui/Kpi/kpi-group.tsx","../../src/components/ui/Kpi/kpi.tsx","../../src/components/ui/Kpi/kpi-delta.tsx"],"sourcesContent":["import { tv } from \"@/utils/tv\";\r\n\r\n/* ══════════════════════════════════════════════════════════════════════════\r\n Kpi — estilos (tv). 100% sobre tokens do DS, theme-aware.\r\n ══════════════════════════════════════════════════════════════════════════ */\r\n\r\nexport const kpi = tv({\r\n slots: {\r\n root: \"flex flex-col gap-gp-lg\",\r\n header: \"flex items-start justify-between gap-gp-md\",\r\n label: \"m-0 text-body-md font-semibold text-fg-default\",\r\n iconBox:\r\n \"grid size-form-lg shrink-0 place-items-center rounded-radius-lg [&>svg]:size-icon-md\",\r\n main: \"flex flex-col gap-gp-xs\",\r\n valueRow: \"flex flex-wrap items-center gap-gp-md\",\r\n value:\r\n \"leading-none text-fg-default [font-variant-numeric:tabular-nums]\",\r\n hint: \"text-caption-sm text-fg-subtle\",\r\n chart: \"mt-gp-xs\",\r\n footnote:\r\n \"mt-pad-md border-t border-border-subtle pt-pad-lg text-caption-md text-fg-muted\",\r\n },\r\n variants: {\r\n // Tamanho do valor de destaque — presets `stat-*` (número de métrica).\r\n // Default `md` (24px) = idêntico ao antigo `body-2xl`. Weight/leading tight\r\n // vêm do preset + slot; pareado com tabular-nums.\r\n size: {\r\n sm: { value: \"text-stat-sm\" },\r\n md: { value: \"text-stat-md\" },\r\n lg: { value: \"text-stat-lg\" },\r\n xl: { value: \"text-stat-xl\" },\r\n },\r\n surface: {\r\n card: {\r\n root: \"rounded-radius-xl border border-border-subtle bg-bg-surface p-pad-3xl shadow-sh-sm\",\r\n },\r\n plain: { root: \"p-pad-3xl\" },\r\n },\r\n tone: {\r\n brand: { iconBox: \"bg-bg-brand-subtle text-fg-brand\" },\r\n success: { iconBox: \"bg-bg-success-muted text-fg-success\" },\r\n warning: { iconBox: \"bg-bg-warning-muted text-fg-warning\" },\r\n info: { iconBox: \"bg-bg-info-muted text-fg-info\" },\r\n danger: { iconBox: \"bg-bg-danger-muted text-fg-danger\" },\r\n neutral: { iconBox: \"bg-bg-muted text-fg-muted\" },\r\n },\r\n },\r\n defaultVariants: {\r\n size: \"md\",\r\n surface: \"card\",\r\n tone: \"neutral\",\r\n },\r\n});\r\n\r\nexport const kpiGroup = tv({\r\n base: \"grid w-full\",\r\n variants: {\r\n columns: {\r\n 2: \"grid-cols-1 sm:grid-cols-2\",\r\n 3: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\",\r\n 4: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-4\",\r\n 5: \"grid-cols-1 sm:grid-cols-2 lg:grid-cols-5\",\r\n 6: \"grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-6\",\r\n },\r\n divided: {\r\n // 1 card único com divisórias (linha no mobile, coluna no sm+)\r\n true: \"overflow-hidden rounded-radius-xl border border-border-subtle bg-bg-surface shadow-sh-sm divide-y divide-border-subtle sm:divide-y-0 sm:divide-x\",\r\n false: \"gap-gp-2xl\",\r\n },\r\n },\r\n defaultVariants: {\r\n columns: 4,\r\n divided: false,\r\n },\r\n});\r\n","\"use client\";\r\n\r\nimport { createContext } from \"react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { kpiGroup } from \"./kpi.styles\";\r\nimport type { KpiGroupProps } from \"./kpi.types\";\r\n\r\n/** Superfície herdada pelos `Kpi` filhos (card normal vs plain dentro de divided). */\r\nexport const KpiSurfaceContext = createContext<\"card\" | \"plain\">(\"card\");\r\n\r\n/**\r\n * KpiGroup — layout de composição pros `Kpi`. `columns` (responsivo) e\r\n * `divided` (vira 1 card único com divisórias entre os KPIs).\r\n */\r\nexport function KpiGroup({\r\n columns = 4,\r\n divided = false,\r\n children,\r\n className,\r\n}: KpiGroupProps) {\r\n return (\r\n <KpiSurfaceContext.Provider value={divided ? \"plain\" : \"card\"}>\r\n <div className={cn(kpiGroup({ columns, divided }), className)}>\r\n {children}\r\n </div>\r\n </KpiSurfaceContext.Provider>\r\n );\r\n}\r\n\r\nKpiGroup.displayName = \"KpiGroup\";\r\n","\"use client\";\r\n\r\nimport { useContext } from \"react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { kpi } from \"./kpi.styles\";\r\nimport { KpiSurfaceContext } from \"./kpi-group\";\r\nimport type { KpiProps } from \"./kpi.types\";\r\n\r\n/**\r\n * Kpi — card de KPI composável: header (label + ícone por tone), valor +\r\n * delta, hint, slot livre (sparkline/chart) e footnote. Use dentro de\r\n * `KpiGroup` pra rows/grids; dentro de `KpiGroup divided` ele vira \"plain\".\r\n */\r\nexport function Kpi({\r\n label,\r\n value,\r\n delta,\r\n hint,\r\n icon,\r\n tone = \"neutral\",\r\n size = \"md\",\r\n footnote,\r\n children,\r\n surface,\r\n className,\r\n}: KpiProps) {\r\n const inherited = useContext(KpiSurfaceContext);\r\n const s = kpi({ size, surface: surface ?? inherited, tone });\r\n\r\n return (\r\n <article className={cn(s.root(), className)}>\r\n <header className={s.header()}>\r\n <h3 className={s.label()}>{label}</h3>\r\n {icon && (\r\n <span className={s.iconBox()} aria-hidden>\r\n {icon}\r\n </span>\r\n )}\r\n </header>\r\n <div className={s.main()}>\r\n <div className={s.valueRow()}>\r\n <span className={s.value()}>{value}</span>\r\n {delta}\r\n </div>\r\n {hint && <span className={s.hint()}>{hint}</span>}\r\n </div>\r\n {children && <div className={s.chart()}>{children}</div>}\r\n {footnote && <div className={s.footnote()}>{footnote}</div>}\r\n </article>\r\n );\r\n}\r\n\r\nKpi.displayName = \"Kpi\";\r\n","\"use client\";\r\n\r\nimport { TrendingUp } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\nimport { Chip } from \"@/components/ui/Chip\";\r\nimport type { KpiDeltaProps } from \"./kpi.types\";\r\n\r\n/**\r\n * KpiDelta — pílula de variação (sobre o Chip). Tom semântico explícito\r\n * (success/danger/neutral) + seta opcional. O tom é decisão do consumidor —\r\n * \"subir\" nem sempre é positivo (ex.: tempo de espera).\r\n *\r\n * `signed` deriva tom+seta do sinal do `value` (\"-\" → danger/down; senão\r\n * success/up). `tone`/`direction` explícitos sempre vencem.\r\n */\r\nexport function KpiDelta({\r\n value,\r\n tone,\r\n direction,\r\n signed = false,\r\n className,\r\n}: KpiDeltaProps) {\r\n const isNegative =\r\n signed && typeof value === \"string\" && value.trim().startsWith(\"-\");\r\n const resolvedTone = tone ?? (signed ? (isNegative ? \"danger\" : \"success\") : \"success\");\r\n const resolvedDirection = direction ?? (signed ? (isNegative ? \"down\" : \"up\") : undefined);\r\n\r\n return (\r\n <Chip\r\n color={resolvedTone}\r\n variant=\"soft\"\r\n size=\"sm\"\r\n shape=\"pill\"\r\n className={className}\r\n >\r\n {resolvedDirection && (\r\n <TrendingUp\r\n className={cn(\"size-[12px]\", resolvedDirection === \"down\" && \"rotate-180\")}\r\n aria-hidden\r\n />\r\n )}\r\n {value}\r\n </Chip>\r\n );\r\n}\r\n\r\nKpiDelta.displayName = \"KpiDelta\";\r\n"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ import { useSortable, sortableKeyboardCoordinates, SortableContext, horizontalLi
9
9
  import { useVirtualizer } from "@tanstack/react-virtual";
10
10
  import { af as tv, ae as Button, c as cn, W as InputGroup, Z as InputGroupInput, X as InputGroupAddon, _ as InputGroupText, a0 as Popover, a4 as PopoverTrigger, a3 as PopoverContent, l as Command, p as CommandInput, r as CommandList, n as CommandEmpty, o as CommandGroup, q as CommandItem, H as DropdownMenu, V as DropdownMenuTrigger, J as DropdownMenuContent, M as DropdownMenuLabel, Q as DropdownMenuSeparator, L as DropdownMenuItem, D as Dialog, v as DialogContent, u as DialogClose, F as DialogTitle, w as DialogDescription, a1 as PopoverAnchor } from "./avatar-CZRLkTxt.mjs";
11
11
  import { X, CheckCircle2, AlertCircle, AlertTriangle, Info, ChevronDown, Check, ArrowUp, ArrowDown, ArrowUpDown, Search, CircleX, MoreHorizontal, Filter, ChevronLeft, GripVertical, Pin, PinOff, Plus, Trash2, Eye, Users, ChevronRight, Columns, SlidersHorizontal, Minimize2, Maximize2, Type, Hash, Calendar, ToggleLeft, DollarSign, Percent, AtSign, Phone, Link, ExternalLink, User, Tag, Tags, CalendarClock, Inbox, SearchX, FilterX, PinIcon, EyeOff, Loader2, Copy, Rows3, LayoutGrid, Settings2, RefreshCw, Table as Table$1, FileText, List as List$1, Rows4, Rows2 } from "lucide-react";
12
- import { C as Chip, z as useMediaQuery } from "./useTheme-BwxTDdqf.mjs";
12
+ import { C as Chip, z as useMediaQuery } from "./useTheme-DwhMIlTr.mjs";
13
13
  import { I as Input } from "./input-BQABJR2N.mjs";
14
14
  import { createPortal } from "react-dom";
15
15
  import { Draggable, Droppable, DragDropContext } from "@hello-pangea/dnd";
@@ -12416,7 +12416,10 @@ function DataTableInternal(props, ref) {
12416
12416
  }
12417
12417
  )
12418
12418
  ) : void 0,
12419
- actions: toolbarConfig.actions && toolbarConfig.actions.length > 0 ? /* @__PURE__ */ jsx(ToolbarActions, { actions: toolbarConfig.actions }) : void 0,
12419
+ actions: toolbarConfig.customLeft || toolbarConfig.actions && toolbarConfig.actions.length > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
12420
+ toolbarConfig.customLeft,
12421
+ toolbarConfig.actions && toolbarConfig.actions.length > 0 ? /* @__PURE__ */ jsx(ToolbarActions, { actions: toolbarConfig.actions }) : null
12422
+ ] }) : void 0,
12420
12423
  fullscreen: enableFullscreen ? /* @__PURE__ */ jsx(
12421
12424
  ToolbarToolButton,
12422
12425
  {
@@ -13167,4 +13170,4 @@ export {
13167
13170
  DEFAULT_FILTER_OPERATORS as y,
13168
13171
  DataTableActionsCell as z
13169
13172
  };
13170
- //# sourceMappingURL=panel-B-liPlxr.mjs.map
13173
+ //# sourceMappingURL=panel-B7uZTYVh.mjs.map