@actionexec/dashboards 0.1.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,8 +1,7 @@
1
1
  # @actionexec/dashboards
2
2
 
3
- Biblioteca React para consumo de dashboards servidos pela API `action-data`.
4
- Exporta o componente top-level `<Dashboard>`, renderizadores de widgets individuais,
5
- tipos e utilitarios de paleta.
3
+ Biblioteca React para consumo de dashboards servidos pela plataforma Action.
4
+ Dedicada a API `/external/dashboards` zero configuracao, so passe o token.
6
5
 
7
6
  ## Instalacao
8
7
 
@@ -10,42 +9,40 @@ tipos e utilitarios de paleta.
10
9
  npm install @actionexec/dashboards
11
10
  ```
12
11
 
13
- Peer dependencies: `react`, `react-dom`, `recharts`, `react-datepicker`.
12
+ Peer deps: `react`, `react-dom`, `recharts`, `react-datepicker`.
14
13
 
15
- ## Uso basico
14
+ ## Uso
16
15
 
17
16
  ```tsx
18
17
  import { Dashboard } from '@actionexec/dashboards';
19
18
  import '@actionexec/dashboards/styles.css';
20
19
 
21
- function App() {
22
- return (
23
- <Dashboard
24
- apiUrl="https://action.example.com/api"
25
- token="token-de-acesso"
26
- />
27
- );
20
+ export function App() {
21
+ return <Dashboard token="seu-token-de-acesso" />;
28
22
  }
29
23
  ```
30
24
 
31
- ## Fetcher customizado (auth proprio)
25
+ E so. A lib gerencia fetch, filtros, variaveis, paleta e todas as atualizacoes
26
+ automaticamente.
32
27
 
33
- ```tsx
34
- import { Dashboard, type DashboardFetcher } from '@actionexec/dashboards';
28
+ ## API publica
35
29
 
36
- const fetcher: DashboardFetcher = {
37
- layout: async () => (await myClient.get('/dashboards/layout')).data,
38
- render: async (params) => (await myClient.get('/dashboards/render', { params })).data,
39
- };
30
+ ### `<Dashboard>`
40
31
 
41
- <Dashboard fetcher={fetcher} />
42
- ```
32
+ Unico componente exposto. Renderiza um dashboard completo com interatividade.
43
33
 
44
- ## API publica
34
+ | Prop | Tipo | Default | Descricao |
35
+ |---|---|---|---|
36
+ | `token` | `string` | — | Token Bearer do dashboard (obrigatorio) |
37
+ | `rowHeight` | `number` | `2.5` | Altura de cada linha do grid em rem |
38
+ | `gridGap` | `number` | `0.375` | Gap entre widgets em rem |
39
+ | `className` | `string` | — | Classe CSS adicional no container raiz |
40
+
41
+ ### `ApiError`
42
+
43
+ Erro lancado internamente quando a API retorna status != 2xx. Exposto para quem
44
+ quiser fazer error boundary customizada em torno do `<Dashboard>`.
45
+
46
+ ---
45
47
 
46
- - `<Dashboard>` orquestrador completo (token + fetcher)
47
- - `<WidgetRenderer>` — dispatch por tipo (consumo avancado)
48
- - Widgets individuais: `KPIWidget`, `GaugeWidget`, `ChartWidget`, `FilterWidget`, `VariableWidget`, `ColorPaletteWidget`
49
- - `<ColorPaletteSelector>` — seletor de paletas (presets + custom)
50
- - Utils: `getPaletteCssVars`, `getSeries`, `ensurePaletteShape`, `PALETTES`
51
- - Tipos: `WidgetDefinition`, `LayoutConfig`, `RenderResponse`, configs por tipo, etc.
48
+ Veja [EXAMPLE.md](./EXAMPLE.md) para exemplos end-to-end.
@@ -1,20 +1,12 @@
1
- import type { DashboardFetcher } from './api/fetcher';
2
- type AuthProps = {
3
- apiUrl: string;
1
+ interface DashboardProps {
2
+ /** Token Bearer de acesso ao dashboard. */
4
3
  token: string;
5
- fetcher?: never;
6
- } | {
7
- fetcher: DashboardFetcher;
8
- apiUrl?: never;
9
- token?: never;
10
- };
11
- type DashboardProps = AuthProps & {
12
- /** Altura de cada linha do grid em pixels. Default 40. */
4
+ /** Altura de cada linha do grid em rem. Default 2.5 (40px no base 16). */
13
5
  rowHeight?: number;
14
- /** Gap entre widgets em pixels. Default 6. */
6
+ /** Gap entre widgets em rem. Default 0.375 (6px no base 16). */
15
7
  gridGap?: number;
16
- /** Renderer customizado para cada widget (avancado). */
8
+ /** Classe CSS adicional no container raiz. */
17
9
  className?: string;
18
- };
19
- export declare function Dashboard(props: DashboardProps): import("react/jsx-runtime").JSX.Element;
10
+ }
11
+ export declare function Dashboard({ token, rowHeight, gridGap, className, }: DashboardProps): import("react/jsx-runtime").JSX.Element;
20
12
  export {};
@@ -1,25 +1,11 @@
1
1
  import type { LayoutResponse, RenderResponse } from '../types';
2
- export interface DashboardFetcher {
3
- /** Retorna estrutura do dashboard (widgets, paleta, grid, date bounds). */
4
- layout(): Promise<LayoutResponse>;
5
- /** Retorna dados computados aplicando filtros/variaveis via query params. */
6
- render(params?: Record<string, string>): Promise<RenderResponse>;
7
- }
2
+ /** Sobrescreve a URL base da API. Destinado ao builder da plataforma em dev —
3
+ * consumidores externos nao devem chamar (usam a URL de producao por default). */
4
+ export declare function setApiUrl(url: string): void;
8
5
  export declare class ApiError extends Error {
9
6
  status?: number | undefined;
10
7
  payload?: unknown | undefined;
11
8
  constructor(message: string, status?: number | undefined, payload?: unknown | undefined);
12
9
  }
13
- interface TokenFetcherOptions {
14
- /** URL base da API (ex: "https://action.example.com/api"). */
15
- apiUrl: string;
16
- /** Token de acesso do dashboard (Bearer). */
17
- token: string;
18
- /** Fetch customizado (default: globalThis.fetch). */
19
- fetch?: typeof fetch;
20
- /** Prefixo dos endpoints (default: "/external/dashboards"). */
21
- endpointPrefix?: string;
22
- }
23
- /** Cria um fetcher baseado em token Bearer, consumindo /external/dashboards. */
24
- export declare function createTokenFetcher(options: TokenFetcherOptions): DashboardFetcher;
25
- export {};
10
+ export declare const fetchLayout: (token: string) => Promise<LayoutResponse>;
11
+ export declare const fetchRender: (token: string, params?: Record<string, string>) => Promise<RenderResponse>;
@@ -1,4 +1,3 @@
1
- import type { DashboardFetcher } from '../api/fetcher';
2
1
  import type { LayoutResponse, RenderResponse } from '../types';
3
2
  export interface UseDashboardDataResult {
4
3
  layout: LayoutResponse | null;
@@ -15,4 +14,4 @@ export interface UseDashboardDataResult {
15
14
  setVariable(widgetId: string, value: number): void;
16
15
  setPalette(colors: string[]): void;
17
16
  }
18
- export declare function useDashboardData(fetcher: DashboardFetcher): UseDashboardDataResult;
17
+ export declare function useDashboardData(token: string): UseDashboardDataResult;
@@ -0,0 +1,519 @@
1
+ import { jsx as u, jsxs as h } from "react/jsx-runtime";
2
+ import N from "react-datepicker";
3
+ const A = "https://action-data-api.fly.dev/api", O = "/external/dashboards";
4
+ let E = A;
5
+ function j(e) {
6
+ E = e.replace(/\/$/, "");
7
+ }
8
+ class x extends Error {
9
+ constructor(t, r, a) {
10
+ super(t), this.status = r, this.payload = a, this.name = "ApiError";
11
+ }
12
+ }
13
+ async function y(e, t, r) {
14
+ const a = new URL(`${E}${O}${e}`);
15
+ if (r)
16
+ for (const [n, i] of Object.entries(r)) a.searchParams.set(n, i);
17
+ const s = await fetch(a.toString(), {
18
+ headers: { Authorization: `Bearer ${t}` }
19
+ });
20
+ if (!s.ok) {
21
+ let n;
22
+ try {
23
+ n = await s.json();
24
+ } catch {
25
+ }
26
+ throw new x(
27
+ `Requisicao falhou (${s.status}) em ${e}`,
28
+ s.status,
29
+ n
30
+ );
31
+ }
32
+ return await s.json();
33
+ }
34
+ const J = (e) => y("/layout", e), z = (e, t) => y("/render", e, t), o = {
35
+ series0: 0,
36
+ series1: 1,
37
+ series2: 2,
38
+ series3: 3,
39
+ series4: 4,
40
+ bgDark: 5,
41
+ bgPaper: 6,
42
+ bgElevated: 7,
43
+ textPrimary: 8,
44
+ textMuted: 9,
45
+ accent: 10,
46
+ success: 11,
47
+ error: 12
48
+ }, L = 5, T = 13, P = {
49
+ series0: "Série 1",
50
+ series1: "Série 2",
51
+ series2: "Série 3",
52
+ series3: "Série 4",
53
+ series4: "Série 5",
54
+ bgDark: "Fundo Escuro",
55
+ bgPaper: "Fundo Cartão",
56
+ bgElevated: "Fundo Elevado",
57
+ textPrimary: "Texto Primário",
58
+ textMuted: "Texto Secundário",
59
+ accent: "Destaque",
60
+ success: "Sucesso",
61
+ error: "Erro"
62
+ }, S = {
63
+ action: {
64
+ label: "Action",
65
+ colors: [
66
+ "#ff6b00",
67
+ "#a3e635",
68
+ "#e3f544",
69
+ "#65ffd1",
70
+ "#ff0404",
71
+ "#1a1a1a",
72
+ "#262626",
73
+ "#333333",
74
+ "#f5f5f5",
75
+ "#999999",
76
+ "#ff6b00",
77
+ "#a3e635",
78
+ "#ef4444"
79
+ ]
80
+ },
81
+ westCoast: {
82
+ label: "West Coast",
83
+ colors: [
84
+ "#a3b86c",
85
+ "#c89b3c",
86
+ "#8b6f47",
87
+ "#6b8e23",
88
+ "#d2691e",
89
+ "#1f1a14",
90
+ "#2a241b",
91
+ "#3a3225",
92
+ "#e8dcc4",
93
+ "#a89878",
94
+ "#c89b3c",
95
+ "#a3b86c",
96
+ "#c44536"
97
+ ]
98
+ },
99
+ mono: {
100
+ label: "Monocromático",
101
+ colors: [
102
+ "#f8fafc",
103
+ "#cbd5e1",
104
+ "#94a3b8",
105
+ "#64748b",
106
+ "#475569",
107
+ "#0a0a0a",
108
+ "#171717",
109
+ "#262626",
110
+ "#fafafa",
111
+ "#a3a3a3",
112
+ "#e5e5e5",
113
+ "#cbd5e1",
114
+ "#ef4444"
115
+ ]
116
+ },
117
+ ocean: {
118
+ label: "Ocean",
119
+ colors: [
120
+ "#0ea5e9",
121
+ "#06b6d4",
122
+ "#0891b2",
123
+ "#3b82f6",
124
+ "#22d3ee",
125
+ "#0a1929",
126
+ "#0f2740",
127
+ "#173554",
128
+ "#e0f2fe",
129
+ "#7dd3fc",
130
+ "#22d3ee",
131
+ "#10b981",
132
+ "#f43f5e"
133
+ ]
134
+ },
135
+ princess: {
136
+ label: "Cute Pink",
137
+ colors: [
138
+ "#ff79bc",
139
+ "#a855f7",
140
+ "#f472b6",
141
+ "#d946ef",
142
+ "#fb7185",
143
+ "#fff0f6",
144
+ "#ffe4ec",
145
+ "#ffffff",
146
+ "#ff4099",
147
+ "#ffadd5",
148
+ "#ec4899",
149
+ "#10b981",
150
+ "#e11d48"
151
+ ]
152
+ }
153
+ }, v = S.action.colors;
154
+ function _(e) {
155
+ const t = v;
156
+ if (!e || e.length === 0) return [...t];
157
+ if (e.length >= T) return e.slice(0, T);
158
+ const r = [...e];
159
+ for (let a = e.length; a < T; a++) r.push(t[a]);
160
+ return r;
161
+ }
162
+ function w(e) {
163
+ return _(e).slice(0, L);
164
+ }
165
+ function H(e) {
166
+ const t = _(e);
167
+ return {
168
+ "--bg-dark": t[o.bgDark],
169
+ "--bg-paper": t[o.bgPaper],
170
+ "--bg-elevated": t[o.bgElevated],
171
+ "--text-primary": t[o.textPrimary],
172
+ "--text-secondary": t[o.textMuted],
173
+ "--text-muted": t[o.textMuted],
174
+ "--action-orange": t[o.accent],
175
+ "--action-green": t[o.success],
176
+ "--color-success": t[o.success],
177
+ "--color-error": t[o.error],
178
+ "--color-info": t[o.series2],
179
+ "--color-warning": t[o.series3]
180
+ };
181
+ }
182
+ const V = [
183
+ "Jan",
184
+ "Fev",
185
+ "Mar",
186
+ "Abr",
187
+ "Mai",
188
+ "Jun",
189
+ "Jul",
190
+ "Ago",
191
+ "Set",
192
+ "Out",
193
+ "Nov",
194
+ "Dez"
195
+ ], K = [
196
+ "Janeiro",
197
+ "Fevereiro",
198
+ "Marco",
199
+ "Abril",
200
+ "Maio",
201
+ "Junho",
202
+ "Julho",
203
+ "Agosto",
204
+ "Setembro",
205
+ "Outubro",
206
+ "Novembro",
207
+ "Dezembro"
208
+ ];
209
+ function q(e) {
210
+ return { start: `${e}-01-01`, end: `${e}-12-31` };
211
+ }
212
+ function X(e) {
213
+ if (!e) return null;
214
+ const t = e.match(/^(\d{4})/);
215
+ return t ? { year: parseInt(t[1]) } : null;
216
+ }
217
+ function Q(e, t) {
218
+ const r = new Date(e, t, 0).getDate(), a = (s) => String(s).padStart(2, "0");
219
+ return {
220
+ start: `${e}-${a(t)}-01`,
221
+ end: `${e}-${a(t)}-${a(r)}`
222
+ };
223
+ }
224
+ function M(e) {
225
+ const t = new Date(Date.UTC(e.getFullYear(), e.getMonth(), e.getDate()));
226
+ t.setUTCDate(t.getUTCDate() + 4 - (t.getUTCDay() || 7));
227
+ const r = new Date(Date.UTC(t.getUTCFullYear(), 0, 1));
228
+ return Math.ceil(((t.getTime() - r.getTime()) / 864e5 + 1) / 7);
229
+ }
230
+ function Z(e, t) {
231
+ const r = new Date(e, 0, 4), a = (r.getDay() + 6) % 7, s = new Date(r.getTime() - a * 864e5), n = new Date(s.getTime() + (t - 1) * 7 * 864e5), i = new Date(n.getTime() + 6 * 864e5), f = (g) => String(g).padStart(2, "0"), d = (g) => `${g.getFullYear()}-${f(g.getMonth() + 1)}-${f(g.getDate())}`;
232
+ return { start: d(n), end: d(i) };
233
+ }
234
+ function B(e, t) {
235
+ const r = /* @__PURE__ */ new Set(), a = new Date(e, t, 0).getDate();
236
+ for (let s = 1; s <= a; s++)
237
+ r.add(M(new Date(e, t - 1, s)));
238
+ return Array.from(r).sort((s, n) => s - n);
239
+ }
240
+ function ee(e, t) {
241
+ const r = new Date(e, t, 0).getDate(), a = (f) => String(f).padStart(2, "0"), s = [];
242
+ let n = 1, i = 1;
243
+ for (; n <= r; ) {
244
+ const f = n, d = Math.min(n + 6, r), g = `${e}-${a(t)}-${a(f)}`, c = `${e}-${a(t)}-${a(d)}`, l = `${i}° Semana (${a(f)}/${a(t)} - ${a(d)}/${a(t)})`;
245
+ s.push({ index: i, startDay: f, endDay: d, start: g, end: c, label: l }), n = d + 1, i++;
246
+ }
247
+ return s;
248
+ }
249
+ function te(e, t, r) {
250
+ if (!e) return 1;
251
+ const a = (i) => String(i).padStart(2, "0"), s = e.match(new RegExp(`^${t}-${a(r)}-(\\d{2})`));
252
+ if (!s) return 1;
253
+ const n = parseInt(s[1]);
254
+ return Math.ceil(n / 7);
255
+ }
256
+ function ae(e) {
257
+ if (!e) return null;
258
+ const t = e.match(/^(\d{4})-(\d{2})/);
259
+ return t ? { year: parseInt(t[1]), month: parseInt(t[2]) } : null;
260
+ }
261
+ function re(e) {
262
+ if (!e) return null;
263
+ const t = /* @__PURE__ */ new Date(e + "T00:00:00");
264
+ return isNaN(t.getTime()) ? null : { year: t.getFullYear(), week: M(t) };
265
+ }
266
+ function se(e) {
267
+ const t = /* @__PURE__ */ new Date(), r = e != null && e.min ? parseInt(e.min.slice(0, 4)) : t.getFullYear() - 2, a = e != null && e.max ? parseInt(e.max.slice(0, 4)) : t.getFullYear(), s = [];
268
+ for (let n = a; n >= r; n--) s.push(n);
269
+ return s;
270
+ }
271
+ function m(e) {
272
+ if (!e) return null;
273
+ const [t, r, a] = e.split("-").map(Number);
274
+ return !t || !r || !a ? null : new Date(t, r - 1, a);
275
+ }
276
+ function C(e) {
277
+ if (!e) return "";
278
+ const t = e.getFullYear(), r = String(e.getMonth() + 1).padStart(2, "0"), a = String(e.getDate()).padStart(2, "0");
279
+ return `${t}-${r}-${a}`;
280
+ }
281
+ function ne({
282
+ value: e,
283
+ onChange: t,
284
+ minIso: r,
285
+ maxIso: a,
286
+ placeholder: s,
287
+ selectsStart: n,
288
+ selectsEnd: i,
289
+ startIso: f,
290
+ endIso: d,
291
+ className: g,
292
+ disabled: c
293
+ }) {
294
+ return /* @__PURE__ */ u("div", { className: `ddp-field ${g ?? ""}`, children: /* @__PURE__ */ u(
295
+ N,
296
+ {
297
+ selected: m(e),
298
+ onChange: (l) => t(C(l)),
299
+ selectsStart: n,
300
+ selectsEnd: i,
301
+ startDate: m(f) ?? void 0,
302
+ endDate: m(d) ?? void 0,
303
+ minDate: m(r) ?? void 0,
304
+ maxDate: m(a) ?? void 0,
305
+ dateFormat: "dd/MM/yyyy",
306
+ placeholderText: s ?? "Selecione...",
307
+ disabled: c,
308
+ portalId: "ddp-portal",
309
+ popperPlacement: "bottom-start",
310
+ popperModifiers: [
311
+ {
312
+ name: "flip",
313
+ options: { fallbackPlacements: ["bottom-end", "top-start", "top-end"] },
314
+ fn: (l) => l
315
+ }
316
+ ]
317
+ }
318
+ ) });
319
+ }
320
+ const $ = [
321
+ o.bgDark,
322
+ o.bgPaper,
323
+ o.bgElevated,
324
+ o.accent,
325
+ o.success
326
+ ];
327
+ function I(e) {
328
+ if (!e) return !0;
329
+ const t = _(e);
330
+ return Object.values(S).some(
331
+ (r) => JSON.stringify(r.colors) === JSON.stringify(t)
332
+ );
333
+ }
334
+ const k = [
335
+ { label: "Series", slots: ["series0", "series1", "series2", "series3", "series4"] },
336
+ { label: "Tema", slots: ["bgDark", "bgPaper", "bgElevated", "textPrimary", "textMuted"] },
337
+ { label: "Estados", slots: ["accent", "success", "error"] }
338
+ ];
339
+ function oe({
340
+ selected: e,
341
+ onSelect: t,
342
+ customMode: r,
343
+ onCustomModeChange: a,
344
+ disabled: s
345
+ }) {
346
+ var g;
347
+ const n = r ?? !I(e), i = _(e), f = n || (g = Object.entries(S).find(
348
+ ([, c]) => JSON.stringify(c.colors) === JSON.stringify(i)
349
+ )) == null ? void 0 : g[0], d = (c, l) => {
350
+ const p = [...i];
351
+ for (; p.length < T; ) p.push("#000000");
352
+ p[c] = l, t(p);
353
+ };
354
+ return /* @__PURE__ */ h("div", { className: `palette-selector ${s ? "palette-selector--disabled" : ""}`, children: [
355
+ a && /* @__PURE__ */ h("label", { className: "config-panel__checkbox", children: [
356
+ /* @__PURE__ */ u(
357
+ "input",
358
+ {
359
+ type: "checkbox",
360
+ checked: n,
361
+ onChange: (c) => a(c.target.checked),
362
+ disabled: s
363
+ }
364
+ ),
365
+ "Customizar"
366
+ ] }),
367
+ n ? /* @__PURE__ */ u("div", { className: "palette-selector__custom", children: k.map((c) => /* @__PURE__ */ h("div", { className: "palette-selector__row", children: [
368
+ /* @__PURE__ */ u("span", { className: "palette-selector__row-label", children: c.label }),
369
+ /* @__PURE__ */ u("div", { className: "palette-selector__row-slots", children: c.slots.map((l) => {
370
+ const p = o[l];
371
+ return /* @__PURE__ */ u(
372
+ "input",
373
+ {
374
+ type: "color",
375
+ className: "palette-selector__color-input",
376
+ value: i[p] || "#000000",
377
+ onChange: (b) => d(p, b.target.value),
378
+ disabled: s,
379
+ title: P[l]
380
+ },
381
+ l
382
+ );
383
+ }) })
384
+ ] }, c.label)) }) : /* @__PURE__ */ u("div", { className: "palette-selector__options", children: Object.entries(S).map(([c, l]) => {
385
+ const p = _(l.colors);
386
+ return /* @__PURE__ */ h(
387
+ "button",
388
+ {
389
+ className: `palette-selector__option ${f === c ? "palette-selector__option--active" : ""}`,
390
+ onClick: () => t(l.colors),
391
+ disabled: s,
392
+ children: [
393
+ /* @__PURE__ */ u("div", { className: "palette-selector__bar", children: w(l.colors).map((b, D) => /* @__PURE__ */ u(
394
+ "span",
395
+ {
396
+ className: "palette-selector__swatch",
397
+ style: { backgroundColor: b }
398
+ },
399
+ D
400
+ )) }),
401
+ /* @__PURE__ */ u("div", { className: "palette-selector__bar palette-selector__bar--theme", children: $.map((b, D) => /* @__PURE__ */ u(
402
+ "span",
403
+ {
404
+ className: "palette-selector__swatch",
405
+ style: { backgroundColor: p[b] }
406
+ },
407
+ D
408
+ )) }),
409
+ /* @__PURE__ */ u("span", { className: "palette-selector__label", children: l.label })
410
+ ]
411
+ },
412
+ c
413
+ );
414
+ }) })
415
+ ] });
416
+ }
417
+ const F = v, R = 30, U = 10, ce = {
418
+ gridColumns: R,
419
+ gridRows: U,
420
+ widgets: []
421
+ }, le = {
422
+ kpi_card: "KPI Card",
423
+ gauge: "Gauge",
424
+ chart: "Gráfico",
425
+ filter: "Filtro",
426
+ variable: "Variável",
427
+ color_palette: "Paleta de Cores"
428
+ }, ie = ["kpi_card", "gauge", "chart"], ue = ["filter", "variable", "color_palette"], fe = /* @__PURE__ */ new Set(["filter", "variable", "color_palette"]), ge = {
429
+ sum: "Soma",
430
+ avg: "Média",
431
+ count: "Contagem",
432
+ min: "Mínimo",
433
+ max: "Máximo",
434
+ count_distinct: "Contagem Distinta"
435
+ }, Y = {
436
+ currency: "Moeda (R$)",
437
+ number: "Número",
438
+ integer: "Inteiro",
439
+ percentage: "Porcentagem",
440
+ date: "Data",
441
+ text: "Texto"
442
+ }, de = Object.entries(Y).filter(([e]) => e !== "date" && e !== "text"), pe = {
443
+ yoy: "vs Ano Anterior",
444
+ mom: "vs Mês Anterior",
445
+ target: "vs Meta",
446
+ none: "Nenhuma"
447
+ }, be = {
448
+ bar: "Barras",
449
+ line: "Linhas",
450
+ area: "Área",
451
+ pie: "Pizza"
452
+ }, me = {
453
+ date_range: "Periodo",
454
+ select: "Seleção Única",
455
+ multi_select: "Seleção Múltipla"
456
+ }, _e = {
457
+ kpi_card: { x: 0, y: 0, w: 6, h: 3 },
458
+ gauge: { x: 0, y: 0, w: 6, h: 5 },
459
+ chart: { x: 0, y: 0, w: 6, h: 6 },
460
+ filter: { x: 0, y: 0, w: 4, h: 2 },
461
+ variable: { x: 0, y: 0, w: 4, h: 2 },
462
+ color_palette: { x: 0, y: 0, w: 4, h: 2 }
463
+ }, he = {
464
+ kpi_card: { label: "Novo KPI", aggregation: "sum", format: "number" },
465
+ gauge: { label: "Novo Gauge", aggregation: "sum" },
466
+ chart: { label: "Novo Grafico", chartType: "bar", xAxis: { column: "", granularity: "day" }, series: [] },
467
+ filter: { label: "Novo Filtro", filterType: "select" },
468
+ variable: { label: "Nova Variavel", variableValue: 0, variableFormat: "number", locked: !1 },
469
+ color_palette: { label: "Paleta de Cores", paletteColors: F, locked: !1 }
470
+ };
471
+ export {
472
+ ge as A,
473
+ m as B,
474
+ be as C,
475
+ ie as D,
476
+ ce as E,
477
+ me as F,
478
+ ae as G,
479
+ te as H,
480
+ re as I,
481
+ X as J,
482
+ j as K,
483
+ J as L,
484
+ K as M,
485
+ de as N,
486
+ z as O,
487
+ S as P,
488
+ x as Q,
489
+ L as S,
490
+ T,
491
+ le as W,
492
+ pe as a,
493
+ fe as b,
494
+ ue as c,
495
+ oe as d,
496
+ he as e,
497
+ _e as f,
498
+ R as g,
499
+ U as h,
500
+ F as i,
501
+ v as j,
502
+ ne as k,
503
+ Y as l,
504
+ V as m,
505
+ o as n,
506
+ P as o,
507
+ C as p,
508
+ _ as q,
509
+ q as r,
510
+ M as s,
511
+ Q as t,
512
+ ee as u,
513
+ H as v,
514
+ w,
515
+ Z as x,
516
+ B as y,
517
+ se as z
518
+ };
519
+ //# sourceMappingURL=index-C3jiurhg.js.map