@gyramais/gyra-design 0.2.49 → 0.2.52

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 (56) hide show
  1. package/dist/components/ContextMenu/index.js +1 -1
  2. package/dist/components/ContextMenu/index.js.map +1 -1
  3. package/dist/components/Drawer/Drawer.d.ts +25 -1
  4. package/dist/components/Drawer/index.js +7 -7
  5. package/dist/components/Drawer/index.js.map +1 -1
  6. package/dist/components/DropdownMenu/index.js +1 -1
  7. package/dist/components/DropdownMenu/index.js.map +1 -1
  8. package/dist/components/Modal/Modal.d.ts +11 -1
  9. package/dist/components/Modal/index.js +9 -9
  10. package/dist/components/Modal/index.js.map +1 -1
  11. package/dist/components/MultiSelectPicker/index.js +7 -7
  12. package/dist/components/MultiSelectPicker/index.js.map +1 -1
  13. package/dist/components/OperatorPicker/index.js +1 -1
  14. package/dist/components/OperatorPicker/index.js.map +1 -1
  15. package/dist/components/PickerPopover/index.js +1 -1
  16. package/dist/components/PickerPopover/index.js.map +1 -1
  17. package/dist/components/Popover/Popover.d.ts +16 -1
  18. package/dist/components/Popover/index.js +1 -1
  19. package/dist/components/Popover/index.js.map +1 -1
  20. package/dist/components/Rail/Rail.d.ts +19 -5
  21. package/dist/components/Rail/RailInlineSelect.d.ts +44 -0
  22. package/dist/components/Rail/RailMini.d.ts +11 -7
  23. package/dist/components/Rail/RailStep.d.ts +8 -13
  24. package/dist/components/Rail/index.d.ts +1 -0
  25. package/dist/components/Rail/index.js +7 -7
  26. package/dist/components/Rail/index.js.map +1 -1
  27. package/dist/components/Rail/labels.d.ts +34 -5
  28. package/dist/components/Rail/types.d.ts +53 -8
  29. package/dist/components/RuleSearchPicker/index.js +1 -1
  30. package/dist/components/RuleSearchPicker/index.js.map +1 -1
  31. package/dist/components/SegmentedPicker/index.js +1 -1
  32. package/dist/components/SegmentedPicker/index.js.map +1 -1
  33. package/dist/emails/balance-sheet-finalized/components/Drawer/Drawer.d.ts +25 -1
  34. package/dist/emails/balance-sheet-finalized/components/Modal/Modal.d.ts +11 -1
  35. package/dist/emails/balance-sheet-finalized/components/Popover/Popover.d.ts +16 -1
  36. package/dist/emails/balance-sheet-finalized/components/Rail/Rail.d.ts +19 -5
  37. package/dist/emails/balance-sheet-finalized/components/Rail/RailInlineSelect.d.ts +44 -0
  38. package/dist/emails/balance-sheet-finalized/components/Rail/RailMini.d.ts +11 -7
  39. package/dist/emails/balance-sheet-finalized/components/Rail/RailStep.d.ts +8 -13
  40. package/dist/emails/balance-sheet-finalized/components/Rail/index.d.ts +1 -0
  41. package/dist/emails/balance-sheet-finalized/components/Rail/labels.d.ts +34 -5
  42. package/dist/emails/balance-sheet-finalized/components/Rail/types.d.ts +53 -8
  43. package/dist/emails/balance-sheet-finalized/index.d.ts +33 -64
  44. package/dist/emails/email/components/Drawer/Drawer.d.ts +25 -1
  45. package/dist/emails/email/components/Modal/Modal.d.ts +11 -1
  46. package/dist/emails/email/components/Popover/Popover.d.ts +16 -1
  47. package/dist/emails/email/components/Rail/Rail.d.ts +19 -5
  48. package/dist/emails/email/components/Rail/RailInlineSelect.d.ts +44 -0
  49. package/dist/emails/email/components/Rail/RailMini.d.ts +11 -7
  50. package/dist/emails/email/components/Rail/RailStep.d.ts +8 -13
  51. package/dist/emails/email/components/Rail/index.d.ts +1 -0
  52. package/dist/emails/email/components/Rail/labels.d.ts +34 -5
  53. package/dist/emails/email/components/Rail/types.d.ts +53 -8
  54. package/dist/emails/email/index.d.ts +94 -64
  55. package/dist/index.css +769 -249
  56. package/package.json +1 -1
@@ -2,12 +2,14 @@ import React from "react";
2
2
  import "./index.css";
3
3
  import type { RailGateCondition, RailLeaf, RailMode, RailStepData } from "./types";
4
4
  /**
5
- * Rail — a esteira Gyra+: uma lista ordenada e vertical de etapas, com um
5
+ * Rail, a esteira Gyra+: uma lista ordenada e vertical de etapas, com um
6
6
  * conector condicional entre elas.
7
7
  *
8
8
  * Uma linha, nao um grafo: le de cima para baixo na mesma ordem em que a
9
9
  * decisao acontece. A referencia e o Atalhos da Apple, nao um editor de
10
- * diagramas.
10
+ * diagramas. O rail e a unica fonte de verdade da esteira na UI: a primeira
11
+ * etapa de Analise E a politica principal, e o conector acima de cada etapa
12
+ * E a condicao para ela rodar. Nao existe conector acima da primeira etapa.
11
13
  *
12
14
  * Dois modos, uma arvore so:
13
15
  * - `edit`: inserir etapa entre etapas, trocar a condicao do conector,
@@ -28,7 +30,12 @@ type RailProps = {
28
30
  steps: Array<RailStepData>;
29
31
  /** Rotulo acessivel da lista. Default: "Esteira". */
30
32
  ariaLabel?: string;
31
- /** Etapa em foco na execucao ao vivo (modo run). */
33
+ /**
34
+ * Etapa em foco na execucao ao vivo (modo run). Sem ela, o proprio Rail
35
+ * assume a etapa que roda ou aguarda. Execucao encerrada nao tem etapa
36
+ * atual, e ninguem ganha elevacao: sombra que sobrevive ao fim da execucao
37
+ * aponta para nada.
38
+ */
32
39
  activeStepId?: string;
33
40
  /** Etapa selecionada no construtor (modo edit). */
34
41
  selectedStepId?: string;
@@ -40,14 +47,21 @@ type RailProps = {
40
47
  defaultExpandedStepIds?: Array<string>;
41
48
  /** Rotulo do botao que acrescenta etapa no fim. Default: "Adicionar etapa". */
42
49
  addLabel?: string;
43
- /** Texto da esteira vazia. */
50
+ /**
51
+ * Texto da esteira vazia. E AQUI que mora o tutorial ("Comece pela
52
+ * análise: a primeira etapa é a política principal"), nunca no cartao.
53
+ */
44
54
  emptyText?: string;
45
55
  onSelectStep?: (step: RailStepData) => void;
46
56
  onOpenStep?: (step: RailStepData) => void;
47
57
  onOpenLeaf?: (leaf: RailLeaf, step: RailStepData) => void;
48
58
  /** Trocar a condicao do conector que fica ACIMA da etapa `stepId`. */
49
59
  onChangeGate?: (stepId: string, condition: RailGateCondition) => void;
50
- /** Inserir etapa na posicao `index` (0 = antes da primeira). */
60
+ /**
61
+ * Inserir etapa na posicao `index`. O construtor oferece inserir ENTRE
62
+ * etapas (index >= 1, no conector) e no fim; a posicao 0 so acontece na
63
+ * esteira vazia, porque a primeira etapa e a politica principal.
64
+ */
51
65
  onInsertStep?: (index: number) => void;
52
66
  onRemoveStep?: (step: RailStepData) => void;
53
67
  /** Reordenar. `toIndex` ja vem calculado e dentro dos limites. */
@@ -0,0 +1,44 @@
1
+ import React from "react";
2
+ import "./index.css";
3
+ /**
4
+ * RailInlineSelect, o gatilho "inline select" da linha 2 do cartao: texto +
5
+ * chevron, sem borda, no corpo do texto. E o que a politica de uma etapa usa
6
+ * no modo edit (clicou, vira picker), no lugar de um Input de rotulo
7
+ * flutuante de 40px.
8
+ *
9
+ * Nao abre nada sozinho: e um botao. O consumer o usa como trigger de um
10
+ * Popover/Select (por isso o forwardRef e o repasse das props restantes,
11
+ * que o `asChild` do Radix precisa).
12
+ */
13
+ type RailInlineSelectProps = {
14
+ id?: string;
15
+ className?: string;
16
+ /** O valor escolhido. Sem valor, mostra o `placeholder` em tom terciario. */
17
+ label?: React.ReactNode;
18
+ /** Default: "Escolher política". */
19
+ placeholder?: string;
20
+ /** Avisa que o valor salvo nao esta disponivel (ex: politica desativada). */
21
+ tone?: "default" | "warning";
22
+ disabled?: boolean;
23
+ /** Estado do picker que este gatilho abre (aria-expanded). */
24
+ open?: boolean;
25
+ /** Rotulo acessivel. Default: "Política da etapa: {label ou placeholder}". */
26
+ ariaLabel?: string;
27
+ } & Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "id" | "className" | "disabled">;
28
+ declare const RailInlineSelect: React.ForwardRefExoticComponent<{
29
+ id?: string;
30
+ className?: string;
31
+ /** O valor escolhido. Sem valor, mostra o `placeholder` em tom terciario. */
32
+ label?: React.ReactNode;
33
+ /** Default: "Escolher política". */
34
+ placeholder?: string;
35
+ /** Avisa que o valor salvo nao esta disponivel (ex: politica desativada). */
36
+ tone?: "default" | "warning";
37
+ disabled?: boolean;
38
+ /** Estado do picker que este gatilho abre (aria-expanded). */
39
+ open?: boolean;
40
+ /** Rotulo acessivel. Default: "Política da etapa: {label ou placeholder}". */
41
+ ariaLabel?: string;
42
+ } & Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "className" | "id" | "disabled"> & React.RefAttributes<HTMLButtonElement>>;
43
+ export { RailInlineSelect };
44
+ export type { RailInlineSelectProps };
@@ -2,13 +2,13 @@ import React from "react";
2
2
  import "./index.css";
3
3
  import type { RailStepData } from "./types";
4
4
  /**
5
- * RailMini — a MESMA esteira, do tamanho de uma linha de lista.
5
+ * RailMini, a MESMA esteira, do tamanho de uma celula de lista.
6
6
  *
7
- * Existe porque o progresso da esteira e a informacao que a listagem de
8
- * execucoes precisa dar de graca: sem isto, saber que a esteira parou na
9
- * etapa 1 de 4 custa um clique e uma expansao. E uma miniatura, nao um
10
- * componente novo: le o mesmo `RailStepData` do `Rail`, so que como uma fila
11
- * de marcas horizontais.
7
+ * Uma bolinha de 6px por etapa, ligadas por um fio de 1px, no maximo ~120px
8
+ * de largura. O resumo ("Parou na etapa 2 de 4: reprovada") vai no
9
+ * `aria-label` e no `title`; na tela ele so aparece com `showSummary`,
10
+ * porque a linha da lista ja tem a coluna de status e nao precisa dizer a
11
+ * mesma coisa duas vezes.
12
12
  *
13
13
  * Nao e clicavel de proposito. Quem quer detalhe abre a linha; a miniatura e
14
14
  * um indicador, e um alvo de clique dentro de outro alvo de clique so cria
@@ -19,7 +19,11 @@ type RailMiniProps = {
19
19
  steps: Array<RailStepData>;
20
20
  /** Rotulo acessivel. Default: "Progresso da esteira". */
21
21
  ariaLabel?: string;
22
+ /** Mostra o resumo em texto ao lado das bolinhas. Default: false. */
23
+ showSummary?: boolean;
22
24
  };
23
- declare const RailMini: ({ className, steps, ariaLabel }: RailMiniProps) => React.JSX.Element | null;
25
+ /** O resumo em texto de uma execucao: exportado para a lista reutilizar. */
26
+ export declare const railMiniSummary: (steps: Array<RailStepData>) => string;
27
+ declare const RailMini: ({ className, steps, ariaLabel, showSummary }: RailMiniProps) => React.JSX.Element | null;
24
28
  export { RailMini };
25
29
  export type { RailMiniProps };
@@ -1,17 +1,6 @@
1
1
  import React from "react";
2
2
  import "./index.css";
3
- import type { RailLeaf, RailMode, RailStepData } from "./types";
4
- /**
5
- * RailStep — o cartao de uma etapa.
6
- *
7
- * E o mesmo cartao nos dois modos: no `edit` ele mostra a barra de ordenacao e
8
- * o slot de configuracao; no `run` ele mostra o estado e as acoes. Nada de
9
- * duas arvores: se construir e acompanhar exigissem componentes diferentes, o
10
- * desenho teria falhado.
11
- *
12
- * Etapa que nao disparou fica translucida, mas o MOTIVO fica fora do cartao,
13
- * em contraste cheio: e a informacao que o analista precisa ler.
14
- */
3
+ import type { RailLeaf, RailMode, RailStepData, RailTone } from "./types";
15
4
  type RailStepProps = {
16
5
  id?: string;
17
6
  className?: string;
@@ -40,6 +29,12 @@ type RailStepProps = {
40
29
  onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;
41
30
  onFocus?: (event: React.FocusEvent<HTMLDivElement>) => void;
42
31
  };
32
+ /** Ponto de 6px + texto: o unico jeito de dizer estado dentro do cartao. */
33
+ declare const StatusDot: ({ label, tone, className, }: {
34
+ label: string;
35
+ tone: RailTone;
36
+ className?: string;
37
+ }) => React.JSX.Element;
43
38
  declare const RailStep: React.ForwardRefExoticComponent<RailStepProps & React.RefAttributes<HTMLDivElement>>;
44
- export { RailStep };
39
+ export { RailStep, StatusDot as RailStatusDot };
45
40
  export type { RailStepProps };
@@ -2,5 +2,6 @@ export * from "./Rail";
2
2
  export * from "./RailStep";
3
3
  export * from "./RailMini";
4
4
  export * from "./RailGate";
5
+ export * from "./RailInlineSelect";
5
6
  export * from "./labels";
6
7
  export * from "./types";
@@ -1,25 +1,54 @@
1
- import type { RailDecision, RailGateCondition, RailStepKind, RailStepStatus } from "./types";
1
+ import type { RailDecision, RailGateCondition, RailStepData, RailStepKind, RailStepStatus, RailTone } from "./types";
2
2
  import type { StatusTagVariant } from "../StatusTag";
3
3
  /**
4
4
  * Vocabulario em portugues da esteira. Fica num arquivo so para que o rail, o
5
- * conector e o (futuro) modo frase leiam exatamente os mesmos rotulos: dois
6
- * vocabularios para o mesmo enum ja e um debito conhecido do gyra-operation.
5
+ * conector, a miniatura e o modo frase leiam exatamente os mesmos rotulos:
6
+ * dois vocabularios para o mesmo enum ja e um debito conhecido do
7
+ * gyra-operation.
7
8
  */
8
9
  export declare const KIND_LABEL: Record<RailStepKind, string>;
9
- /** Glifo do card GYR-1623: ◉ análise · ⊕ aprofundar · ✋ checkpoint · ⌘ vínculos. */
10
+ /** Glifo textual do card GYR-1623: ◉ análise · ⊕ aprofundar · ✋ checkpoint · ⌘ vínculos. */
10
11
  export declare const KIND_GLYPH: Record<RailStepKind, string>;
12
+ /**
13
+ * O que cada tipo FAZ, na voz da frase ("1. Analisa com X · 2. se aprovada,
14
+ * pede decisão do analista"). E o mesmo vocabulario do KIND_LABEL, conjugado.
15
+ */
16
+ export declare const KIND_SENTENCE: Record<RailStepKind, (subject?: string) => string>;
17
+ /** Frase curta da linha 2 do checkpoint quando o consumer nao manda `subtitle`. */
18
+ export declare const CHECKPOINT_HINT = "Pausa e pergunta ao analista";
11
19
  export declare const GATE_LABEL: Record<RailGateCondition, string>;
12
20
  export declare const GATE_DESCRIPTION: Record<RailGateCondition, string>;
13
21
  export declare const GATE_ORDER: Array<RailGateCondition>;
22
+ /** Estado da etapa, na voz do analista ("aguardando você", "não rodou"). */
14
23
  export declare const STATUS_LABEL: Record<RailStepStatus, string>;
15
24
  export declare const DECISION_LABEL: Record<RailDecision, string>;
25
+ export declare const DECISION_TONE: Record<RailDecision, RailTone>;
26
+ export declare const STATUS_TONE: Record<RailStepStatus, RailTone>;
27
+ /** Mantidos por compatibilidade com quem lia a pilula (StatusTag) da v1. */
16
28
  export declare const DECISION_VARIANT: Record<RailDecision, StatusTagVariant>;
17
29
  export declare const STATUS_VARIANT: Record<RailStepStatus, StatusTagVariant>;
18
30
  /**
19
- * O que a pilula de estado mostra: quando a etapa terminou e registrou uma
31
+ * O que o ponto de estado mostra: quando a etapa terminou e registrou uma
20
32
  * decisao, a decisao vence o "concluida" (e o que o analista quer ler).
21
33
  */
34
+ export declare const resolveStatusDot: (status?: RailStepStatus, decision?: RailDecision) => {
35
+ label: string;
36
+ tone: RailTone;
37
+ } | undefined;
38
+ /** Compatibilidade com a v1 (mesma regra, no formato do StatusTag). */
22
39
  export declare const resolveStatusTag: (status?: RailStepStatus, decision?: RailDecision) => {
23
40
  title: string;
24
41
  variant: StatusTagVariant;
25
42
  } | undefined;
43
+ /**
44
+ * Modo frase: a esteira lida em uma linha, para a pessoa confirmar o que vai
45
+ * disparar antes de gastar dinheiro.
46
+ *
47
+ * "1. Analisa com PJ Essencial v4 · 2. se aprovada, pede decisão do
48
+ * analista · 3. se aprovada, deriva para sócios"
49
+ *
50
+ * A primeira etapa nunca tem conector. Nas demais, o conector vem do
51
+ * GATE_LABEL: "sempre" entra sem virgula ("2. sempre deriva para sócios"),
52
+ * as condicoes entram com virgula ("2. se aprovada, deriva para sócios").
53
+ */
54
+ export declare const railToSentence: (steps: Array<RailStepData>) => string;
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  /**
3
- * Rail — vocabulario da esteira Gyra+.
3
+ * Rail, vocabulario da esteira Gyra+.
4
4
  *
5
5
  * O modelo espelha 1:1 o `OperationStep` do gyra-operation (kind + runIf +
6
6
  * order), de proposito: o construtor e o acompanhamento ao vivo leem o MESMO
@@ -9,7 +9,7 @@ import React from "react";
9
9
  /** edit = construtor. run = acompanhamento ao vivo. Mesma arvore. */
10
10
  export type RailMode = "edit" | "run";
11
11
  /** Os 4 tipos de etapa. Espelha `StepKind` do gyra-operation. */
12
- export type RailStepKind = "ANALYSIS" | "DEEPEN" | "CHECKPOINT" | "RELATIONSHIPS";
12
+ export type RailStepKind = "ANALYSIS" | "DEEPEN" | "CHECKPOINT" | "RELATIONSHIPS" | "RESULT" | "OFFER_REVIEW" | "COMMITTEE" | "AUTHORITY";
13
13
  /**
14
14
  * A condicao do conector: sempre avaliada contra a ULTIMA decisao registrada
15
15
  * na esteira. Espelha `Gate` do gyra-operation.
@@ -19,6 +19,8 @@ export type RailGateCondition = "ALWAYS" | "IF_APPROVED" | "IF_APPROVED_OR_ALERT
19
19
  export type RailStepStatus = "PENDING" | "RUNNING" | "WAITING" | "DONE" | "SKIPPED" | "ERROR";
20
20
  /** A decisao que a etapa registrou (nem toda etapa decide). */
21
21
  export type RailDecision = "APPROVED" | "ALERT" | "REPROVED";
22
+ /** Tom semantico de um ponto de estado (6px + texto). */
23
+ export type RailTone = "neutral" | "info" | "success" | "warning" | "danger";
22
24
  /**
23
25
  * Folha de uma etapa de Vinculos: um relatorio derivado (socio, 1o nivel,
24
26
  * filial...). Cada folha e linkavel.
@@ -28,7 +30,7 @@ export type RailLeaf = {
28
30
  title: string;
29
31
  /** Ex: "Socia · Socio PF v3". */
30
32
  subtitle?: string;
31
- /** CPF/CNPJ. Renderizado em IBM Plex Mono. */
33
+ /** CPF/CNPJ. Renderizado com tabular-nums. */
32
34
  document?: string;
33
35
  status?: RailStepStatus;
34
36
  decision?: RailDecision;
@@ -37,13 +39,52 @@ export type RailLeaf = {
37
39
  onOpen?: () => void;
38
40
  disabled?: boolean;
39
41
  };
40
- /** Uma etapa da esteira (o dado; o componente que a desenha se chama RailStep). */
42
+ /**
43
+ * Uma etapa da esteira (o dado; o componente que a desenha se chama RailStep).
44
+ *
45
+ * Anatomia do cartao, nas duas linhas que ele tem:
46
+ * linha 1: glifo do tipo (chip de 24px na cor do tipo, tooltip com o nome
47
+ * do tipo) + `title`
48
+ * + `meta` (chips pequenos) e, a direita, o estado (run) ou as
49
+ * acoes de ordenar/remover (edit, so no hover).
50
+ * linha 2: `policyControl` (edit) ou `policyName` (run) para Analise e
51
+ * Aprofundar; `subtitle` para Vinculos (o resumo dos niveis) e para
52
+ * o Checkpoint (uma frase curta; default "Pausa e pergunta ao
53
+ * analista").
54
+ * O tipo NUNCA aparece como texto no cartao: so como glifo com tooltip. Quem
55
+ * precisa do nome do tipo em texto usa `KIND_LABEL` ou `railToSentence`.
56
+ */
41
57
  export type RailStepData = {
42
58
  id: string;
43
59
  kind: RailStepKind;
60
+ /** O nome que o usuario deu a etapa (default no consumer: nome da politica, "Checkpoint" ou "Vinculos"). */
44
61
  title: string;
45
- /** Politica, camada, niveis de vinculo... */
62
+ /**
63
+ * Linha 2 quando a etapa nao e uma politica: o resumo dos vinculos
64
+ * ("Sócios · 1º nível · PF: Sócio PF v3") ou a frase do checkpoint. Em
65
+ * Analise/Aprofundar so aparece se nao houver `policyControl`/`policyName`.
66
+ */
46
67
  subtitle?: React.ReactNode;
68
+ /**
69
+ * O nome da politica desta etapa (Analise/Aprofundar). No modo run vira a
70
+ * linha 2; no modo frase (`railToSentence`) vira "analisa com {policyName}".
71
+ */
72
+ policyName?: string;
73
+ /**
74
+ * Seletor inline da politica, injetado pelo consumer no modo edit (ex: um
75
+ * `RailInlineSelect` abrindo o picker). Ocupa a linha 2 no lugar do
76
+ * `policyName`. Ignorado no modo run.
77
+ */
78
+ policyControl?: React.ReactNode;
79
+ /**
80
+ * O nome da etapa E o nome da politica (o caso default, e o mais comum).
81
+ * Nesse caso a politica NAO ganha uma linha propria: no modo edit o seletor
82
+ * inline sobe para a linha 1 e vira o proprio nome; no run, a linha 2 some.
83
+ * Sem isto o cartao imprimia a mesma string duas vezes, empilhada.
84
+ *
85
+ * Sem valor, o RailStep compara `title` com `policyName`.
86
+ */
87
+ policyIsTitle?: boolean;
47
88
  /**
48
89
  * A condicao do conector que fica ACIMA desta etapa. A primeira etapa da
49
90
  * esteira nao tem conector, entao o campo e ignorado nela.
@@ -56,11 +97,15 @@ export type RailStepData = {
56
97
  * contraste cheio: etapa pulada mostra o motivo a vista.
57
98
  */
58
99
  reason?: string;
59
- /** Chips/tags extras no header (camada, custo, tier...). */
100
+ /** Chips pequenos ao lado do nome (score, custo, camada...). */
60
101
  meta?: React.ReactNode;
61
- /** Acoes da etapa no modo run (ex: "Decidir agora"). */
102
+ /** Acoes da etapa no modo run (ex: o botao "Decidir" do checkpoint aguardando). */
62
103
  actions?: React.ReactNode;
63
- /** Slot livre de conteudo: seletor de politica, niveis, o que o consumer quiser. */
104
+ /**
105
+ * Slot livre abaixo das duas linhas. Mantido por compatibilidade; na v2 a
106
+ * configuracao da etapa mora na linha 2 (`policyControl`/`subtitle`), e
107
+ * este slot fica para o que nao cabe la.
108
+ */
64
109
  content?: React.ReactNode;
65
110
  /** Folhas (relatorios derivados). So faz sentido em RELATIONSHIPS. */
66
111
  leaves?: RailLeaf[];
@@ -1,64 +1,94 @@
1
- import "./index.css";
2
- import "react-toastify/dist/ReactToastify.css";
3
- import "react-modern-drawer/dist/index.css";
4
- import "react-draft-wysiwyg/dist/react-draft-wysiwyg.css";
5
- import "react-datepicker/dist/react-datepicker.css";
6
- import "react-circular-progressbar/dist/styles.css";
7
- import "./components/AiParecer/index.css";
8
- import "./components/Avatar/index.css";
9
- import "./components/Button/index.css";
10
- import "./components/Card/index.css";
11
- import "./components/Chart/index.css";
12
- import "./components/ChatWidget/index.css";
13
- import "./components/Checkbox/index.css";
14
- import "./components/Col/index.css";
15
- import "./components/Collapse/index.css";
16
- import "./components/Divider/index.css";
17
- import "./components/DistributionBar/index.css";
18
- import "./components/Drawer/index.css";
19
- import "./components/DropdownMenu/index.css";
20
- import "./components/Empty/index.css";
21
- import "./components/Filter/index.css";
22
- import "./components/FloatingCard/index.css";
23
- import "./components/Form/index.css";
24
- import "./components/Gauge/index.css";
25
- import "./components/HoverCard/index.css";
26
- import "./components/Icon/index.css";
27
- import "./components/IconDisplay/index.css";
28
- import "./components/Information/index.css";
29
- import "./components/Input/index.css";
30
- import "./components/Layout/index.css";
31
- import "./components/List/index.css";
32
- import "./components/Loading/index.css";
33
- import "./components/Logo/index.css";
34
- import "./components/Menubar/index.css";
35
- import "./components/Modal/index.css";
36
- import "./components/Popover/index.css";
37
- import "./components/ProcessingChip/index.css";
38
- import "./components/Progress/index.css";
39
- import "./components/RadioGroup/index.css";
40
- import "./components/Rail/index.css";
41
- import "./components/RichInput/index.css";
42
- import "./components/Row/index.css";
43
- import "./components/ScoreBar/index.css";
44
- import "./components/SegmentedPicker/index.css";
45
- import "./components/SegmentedToggle/index.css";
46
- import "./components/Select/index.css";
47
- import "./components/Selector/index.css";
48
- import "./components/SelectTree/index.css";
49
- import "./components/PickerPopover/index.css";
50
- import "./components/MultiSelectPicker/index.css";
51
- import "./components/RuleSearchPicker/index.css";
52
- import "./components/OperatorPicker/index.css";
53
- import "./components/ContextMenu/index.css";
54
- import "./components/StatusTag/index.css";
55
- import "./components/Switch/index.css";
56
- import "./components/SyncChip/index.css";
57
- import "./components/Table/index.css";
58
- import "./components/Tabs/index.css";
59
- import "./components/Tag/index.css";
60
- import "./components/Tooltip/index.css";
61
- import "./components/Stepper/index.css";
62
- import "./components/TourGuide/index.css";
63
- import theme from "./theme";
64
- export default theme;
1
+ /**
2
+ * Email transacional genérico — Gyra+ design system.
3
+ *
4
+ * **FONTE DA VERDADE** dos layouts de email transacional. Usado por
5
+ * qualquer fluxo que precise mandar email no padrão visual Gyra+:
6
+ * - reset de senha, confirmação de cadastro, alertas internos
7
+ * - finalização de processamento (Finsights, batch-report, etc)
8
+ * - notificações de operação/crédito
9
+ * - convites, mudança de plano, alerts de billing...
10
+ *
11
+ * **TS puro**: sem React, sem DOM, sem browser globals. Apenas funções que
12
+ * retornam string HTML. Funciona igual em qualquer runtime Node (Nest) ou
13
+ * bundle browser (Next).
14
+ *
15
+ * **Email-safe**: tabelas + inline-style (clients ignoram <style> externo,
16
+ * flexbox e Material Symbols). Gradientes têm fallback sólido.
17
+ *
18
+ * Tokens visuais alinhados com gyra-design: azul #1256FF (acao/primary),
19
+ * roxo #7C4EFF (IA/parecer), neutrals Apple-gray, fonte Inter.
20
+ *
21
+ * **Como usar:**
22
+ * ```ts
23
+ * import { buildEmail } from '@gyramais/gyra-design/dist/emails/email';
24
+ *
25
+ * const html = buildEmail({
26
+ * preheader: 'Senha redefinida com sucesso',
27
+ * greeting: 'Olá, Maria',
28
+ * title: 'Sua senha foi redefinida',
29
+ * paragraphs: ['Tudo certo. Você já pode entrar com a nova senha.'],
30
+ * buttons: [{ label: 'Entrar', url: 'https://app.gyramais.com/login' }],
31
+ * footerNote: 'Se não foi você, redefina novamente clicando em "Esqueci minha senha".',
32
+ * });
33
+ * ```
34
+ *
35
+ * Pra emails recorrentes (mesmo conteudo, payload variavel), criar um
36
+ * **preset** em `src/emails/<preset-name>/index.ts` que monta o
37
+ * `EmailLayoutInput` a partir de campos de dominio e delega aqui. Ver
38
+ * `balance-sheet-finalized` como exemplo.
39
+ */
40
+ export type EmailButton = {
41
+ label: string;
42
+ url: string;
43
+ /** primary = botão azul preenchido, secondary = outline. Default primary. */
44
+ variant?: 'primary' | 'secondary';
45
+ };
46
+ export type EmailHighlight = {
47
+ /** label pequeno em cima (ex: "Score", "Nivel de risco"). */
48
+ label: string;
49
+ /** valor grande em baixo (ex: "820", "Baixo"). */
50
+ value: string;
51
+ /** cor do valor (ex: cor do risco). Default: tinta padrao Apple-gray. */
52
+ color?: string;
53
+ };
54
+ /** Tom semantico do chip de veredito do bloco Parecer GYRA+IA. */
55
+ export type AiParecerTone = 'ok' | 'warn' | 'danger' | 'info';
56
+ export type EmailAiParecer = {
57
+ /** chip de veredito (ex: "Médio", "Consistente"). Opcional. */
58
+ verdict?: string;
59
+ verdictTone?: AiParecerTone;
60
+ /** corpo do parecer. */
61
+ text: string;
62
+ /** rodape do bloco (ex: "GYRA+IA · Confiança 96%"). Opcional. */
63
+ footer?: string;
64
+ };
65
+ export type EmailLayoutInput = {
66
+ /** Texto invisivel no preheader (preview no inbox). */
67
+ preheader?: string;
68
+ /** Linha curta acima do titulo (ex: "Olá, Maria"). */
69
+ greeting?: string;
70
+ /** Titulo principal (H1). */
71
+ title: string;
72
+ /** Paragrafos de corpo (sub-frases). */
73
+ paragraphs?: string[];
74
+ /** Cards lado-a-lado (1 a N). Largura dividida igualmente. */
75
+ highlights?: EmailHighlight[];
76
+ /** Bloco "Parecer GYRA+IA" (faixa roxa com chip + texto + rodape). */
77
+ aiParecer?: EmailAiParecer;
78
+ /** Botoes de acao. Multiplos viram lado-a-lado. */
79
+ buttons?: EmailButton[];
80
+ /** Texto pequeno no rodape do card (disclaimer, instrucoes extras). */
81
+ footerNote?: string;
82
+ };
83
+ /**
84
+ * Monta o HTML completo de um email no padrão Gyra+: logo no topo, card
85
+ * principal com greeting + título + parágrafos + highlights (chips lado a
86
+ * lado) + bloco "Parecer GYRA+IA" + botões, e rodapé padrão.
87
+ *
88
+ * Email-safe (tabelas + inline-style, sem flexbox, sem <style>). Funciona
89
+ * em Gmail, Outlook (Windows/Web/Mac), Apple Mail, Thunderbird, mobile.
90
+ *
91
+ * Todas as seções (greeting, paragraphs, highlights, aiParecer, buttons,
92
+ * footerNote) são **opcionais** — só `title` é obrigatório.
93
+ */
94
+ export declare function buildEmail(input: EmailLayoutInput): string;