@ffid-br/tailor-ui 0.5.0 → 0.6.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 +36 -0
- package/dist/index.es.js +660 -530
- package/dist/index.umd.js +1 -1
- package/dist/style.css +72 -0
- package/dist/types/components/MascoteVetor.d.ts +1 -1
- package/dist/types/components/TailorMarca.d.ts +86 -0
- package/dist/types/components/TailorPageHeader.d.ts +47 -0
- package/dist/types/index.d.ts +4 -0
- package/package.json +1 -1
package/dist/style.css
CHANGED
|
@@ -18,6 +18,78 @@
|
|
|
18
18
|
--tailor-ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
/*
|
|
22
|
+
* Marca do cliente: componentes que leem estas variáveis vestem a marca de quem
|
|
23
|
+
* usa. Padrão Tailor aqui, em :where() para qualquer CSS do app sobrescrever
|
|
24
|
+
* (ou o componente TailorMarca). Tema escuro: `.dark` ou `[data-theme="dark"]`.
|
|
25
|
+
*/
|
|
26
|
+
:where(:root) {
|
|
27
|
+
/* Seguem os tokens do Tailwind do app: quem já troca --color-tailor-green pela
|
|
28
|
+
cor do cliente (accounts, brandTheme) leva o cabeçalho junto. */
|
|
29
|
+
--tailor-marca-primaria: var(--color-tailor-green, var(--tailor-green));
|
|
30
|
+
--tailor-marca-primaria-texto: var(--color-tailor-ink, var(--tailor-ink));
|
|
31
|
+
--tailor-marca-texto: var(--tailor-black);
|
|
32
|
+
--tailor-marca-texto-suave: #666666;
|
|
33
|
+
--tailor-marca-borda: #E5E5E5;
|
|
34
|
+
--tailor-marca-fundo: transparent;
|
|
35
|
+
--tailor-marca-fonte-titulo: var(--tailor-font);
|
|
36
|
+
--tailor-marca-fonte-texto: var(--tailor-font);
|
|
37
|
+
--tailor-marca-peso-titulo: 500;
|
|
38
|
+
--tailor-marca-caixa-titulo: none;
|
|
39
|
+
--tailor-marca-raio: 0;
|
|
40
|
+
}
|
|
41
|
+
:where(.dark, [data-theme="dark"]) {
|
|
42
|
+
--tailor-marca-primaria-texto: var(--color-tailor-green, var(--tailor-green));
|
|
43
|
+
--tailor-marca-texto: var(--tailor-white);
|
|
44
|
+
--tailor-marca-texto-suave: #A3A3A3;
|
|
45
|
+
--tailor-marca-borda: rgba(255, 255, 255, 0.1);
|
|
46
|
+
}
|
|
47
|
+
.tailor-marca { display: contents; }
|
|
48
|
+
|
|
49
|
+
/* TailorPageHeader — cada medida tem a sua variável --tailor-cabecalho-*. */
|
|
50
|
+
.tailor-ph {
|
|
51
|
+
display: flex; flex-direction: column; gap: 21px;
|
|
52
|
+
padding: var(--tailor-cabecalho-padding, 0 0 21px);
|
|
53
|
+
background: var(--tailor-cabecalho-fundo, var(--tailor-marca-fundo));
|
|
54
|
+
border-bottom: var(--tailor-cabecalho-regua, 1px solid var(--tailor-marca-borda));
|
|
55
|
+
color: var(--tailor-marca-texto);
|
|
56
|
+
font-family: var(--tailor-marca-fonte-texto);
|
|
57
|
+
}
|
|
58
|
+
.tailor-ph__linha { display: flex; flex-direction: column; gap: 21px; }
|
|
59
|
+
@media (min-width: 640px) {
|
|
60
|
+
.tailor-ph__linha { flex-direction: row; align-items: flex-end; justify-content: space-between; }
|
|
61
|
+
}
|
|
62
|
+
.tailor-ph__principal { min-width: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 8px; }
|
|
63
|
+
.tailor-ph__voltar {
|
|
64
|
+
display: inline-flex; align-items: center; gap: 6px; padding: 0; border: 0; background: none; cursor: pointer;
|
|
65
|
+
font: inherit; font-size: 13px; color: var(--tailor-marca-texto-suave); text-decoration: none; border-radius: var(--tailor-marca-raio);
|
|
66
|
+
}
|
|
67
|
+
.tailor-ph__voltar:hover, .tailor-ph__trilha-link:hover { color: var(--tailor-marca-texto); }
|
|
68
|
+
.tailor-ph__trilha ol { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 0; padding: 0; list-style: none; font-size: 13px; color: var(--tailor-marca-texto-suave); }
|
|
69
|
+
.tailor-ph__trilha li { display: flex; align-items: center; gap: 6px; }
|
|
70
|
+
.tailor-ph__trilha-link { color: inherit; text-decoration: none; }
|
|
71
|
+
.tailor-ph__trilha [aria-current="page"] { color: var(--tailor-marca-texto); }
|
|
72
|
+
.tailor-ph__voltar:focus-visible, .tailor-ph__trilha-link:focus-visible { outline: 3px solid var(--tailor-marca-primaria); outline-offset: 2px; }
|
|
73
|
+
.tailor-ph__sobretitulo {
|
|
74
|
+
display: flex; align-items: center; gap: 8px; margin: 5px 0 0;
|
|
75
|
+
font-size: 11px; font-weight: 500; letter-spacing: 0.14em; text-transform: uppercase;
|
|
76
|
+
color: var(--tailor-marca-primaria-texto);
|
|
77
|
+
}
|
|
78
|
+
.tailor-ph__ponto { width: 8px; height: 8px; background: var(--tailor-marca-primaria); border-radius: var(--tailor-marca-raio); }
|
|
79
|
+
.tailor-ph__titulo-linha { display: flex; flex-wrap: wrap; align-items: center; gap: 13px; }
|
|
80
|
+
.tailor-ph__titulo {
|
|
81
|
+
margin: 0; line-height: 1.1;
|
|
82
|
+
font-family: var(--tailor-marca-fonte-titulo); font-weight: var(--tailor-marca-peso-titulo);
|
|
83
|
+
text-transform: var(--tailor-marca-caixa-titulo);
|
|
84
|
+
font-size: var(--tailor-cabecalho-tamanho-titulo, clamp(26px, 4vw, 42px));
|
|
85
|
+
}
|
|
86
|
+
.tailor-ph__descricao { margin: 0; max-width: 610px; font-size: 16px; line-height: 1.618; color: var(--tailor-marca-texto-suave); }
|
|
87
|
+
.tailor-ph__lateral { display: flex; flex-shrink: 0; flex-wrap: wrap; align-items: center; gap: 13px; }
|
|
88
|
+
.tailor-ph__indicador { text-align: right; }
|
|
89
|
+
.tailor-ph__indicador-valor { display: block; font-size: 26px; font-weight: 500; line-height: 1; font-variant-numeric: tabular-nums; font-family: var(--tailor-marca-fonte-titulo); }
|
|
90
|
+
.tailor-ph__indicador-rotulo { display: block; margin-top: 8px; font-size: 13px; color: var(--tailor-marca-texto-suave); }
|
|
91
|
+
.tailor-ph__extra { min-width: 0; }
|
|
92
|
+
|
|
21
93
|
/* TailorLoader — a malha pequena se desenha a partir do ponto e some, em 2φ (3,236s). */
|
|
22
94
|
.tailor-malha__linha {
|
|
23
95
|
stroke-dasharray: 1;
|
|
@@ -139,7 +139,7 @@ declare const EXPRESSOES: {
|
|
|
139
139
|
export type ExpressaoDoMascote = keyof typeof EXPRESSOES;
|
|
140
140
|
/** Pose do vetor: o movimento, o olhar padrão e os enfeites de cada estado. */
|
|
141
141
|
export type PoseDoMascote = 'parado' | 'cumprimentando' | 'pensando' | 'falando' | 'esperando' | 'comemorando' | 'erro' | 'dormindo';
|
|
142
|
-
/** Desenhados com o topo da cabeça em (0, 0). Só em tinta: o verde é do agente. */
|
|
142
|
+
/** Desenhados com o topo da cabeça em (0, 0). Só em tinta (exceto o gorro): o verde é do agente. */
|
|
143
143
|
declare const ACESSORIOS: {
|
|
144
144
|
gorro: React.JSX.Element;
|
|
145
145
|
orelhas: React.JSX.Element;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* A marca do cliente em variáveis CSS. Os componentes que leem `--tailor-marca-*`
|
|
4
|
+
* (por enquanto o `TailorPageHeader`) trocam de cor, fonte e cantos sem mudar uma
|
|
5
|
+
* linha de componente. Sem tema, valem os padrões Tailor do `style.css`.
|
|
6
|
+
*/
|
|
7
|
+
export type TailorTema = {
|
|
8
|
+
/** Cor de destaque: o ponto do sobretítulo, a barra de foco. */
|
|
9
|
+
primaria?: string;
|
|
10
|
+
/** Destaque como texto sobre o fundo (precisa de contraste; no Tailor é o verde-ink). */
|
|
11
|
+
primariaTexto?: string;
|
|
12
|
+
texto?: string;
|
|
13
|
+
textoSuave?: string;
|
|
14
|
+
borda?: string;
|
|
15
|
+
/** Fundo do cabeçalho. Padrão: transparente (o cabeçalho é o começo da página). */
|
|
16
|
+
fundo?: string;
|
|
17
|
+
fonteTitulo?: string;
|
|
18
|
+
fonteTexto?: string;
|
|
19
|
+
pesoTitulo?: string | number;
|
|
20
|
+
/** `uppercase` para marcas que pedem título em caixa alta. */
|
|
21
|
+
caixaTitulo?: 'none' | 'uppercase';
|
|
22
|
+
/** Cantos dos elementos com caixa (etiqueta, botão voltar). Tailor: 0. */
|
|
23
|
+
raio?: string;
|
|
24
|
+
};
|
|
25
|
+
/** O tema como objeto de variáveis, para `style` ou para montar um CSS do cliente. */
|
|
26
|
+
export declare function temaParaVariaveis(tema: TailorTema): Record<string, string>;
|
|
27
|
+
export type TailorMarcaProps = {
|
|
28
|
+
tema: TailorTema;
|
|
29
|
+
/** Ajustes do tema escuro (`.dark` ou `[data-theme="dark"]` num ancestral). */
|
|
30
|
+
escuro?: TailorTema;
|
|
31
|
+
children: React.ReactNode;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Aplica o tema a tudo que estiver dentro, sem mexer no layout (`display: contents`).
|
|
35
|
+
* As variáveis vão num `<style>` com seletor próprio, e não em `style`, para o
|
|
36
|
+
* tema escuro conseguir sobrescrever as do claro.
|
|
37
|
+
*/
|
|
38
|
+
export declare function TailorMarca({ tema, escuro, children }: TailorMarcaProps): React.JSX.Element;
|
|
39
|
+
/**
|
|
40
|
+
* `account_info.whitelabel` do cliente (Mongo `clients`). Os campos além de
|
|
41
|
+
* `colors.primary/secondary/background/text` e `logos.*` são a proposta para
|
|
42
|
+
* completar a marca; enquanto não existirem, ficam os padrões Tailor.
|
|
43
|
+
*/
|
|
44
|
+
export type WhitelabelDoCliente = {
|
|
45
|
+
colors?: {
|
|
46
|
+
primary?: string;
|
|
47
|
+
secondary?: string;
|
|
48
|
+
background?: string;
|
|
49
|
+
text?: string;
|
|
50
|
+
text_muted?: string;
|
|
51
|
+
border?: string;
|
|
52
|
+
dark?: {
|
|
53
|
+
primary?: string;
|
|
54
|
+
background?: string;
|
|
55
|
+
text?: string;
|
|
56
|
+
text_muted?: string;
|
|
57
|
+
border?: string;
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
fonts?: {
|
|
61
|
+
heading?: string;
|
|
62
|
+
body?: string;
|
|
63
|
+
heading_weight?: number | string;
|
|
64
|
+
heading_case?: 'none' | 'uppercase';
|
|
65
|
+
};
|
|
66
|
+
shape?: {
|
|
67
|
+
radius?: string;
|
|
68
|
+
};
|
|
69
|
+
logos?: {
|
|
70
|
+
rectangular_light?: string;
|
|
71
|
+
rectangular_dark?: string;
|
|
72
|
+
square_light?: string;
|
|
73
|
+
square_dark?: string;
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
/** Razão de contraste WCAG entre duas cores hex. */
|
|
77
|
+
export declare function contraste(a: string, b: string): number;
|
|
78
|
+
/**
|
|
79
|
+
* Traduz o whitelabel do Mongo para o tema. Ignora o azul padrão do cadastro e
|
|
80
|
+
* valores que não são hex. A primária só vira cor de texto se tiver contraste
|
|
81
|
+
* AA sobre o fundo; senão o texto de destaque usa a cor de texto da marca.
|
|
82
|
+
*/
|
|
83
|
+
export declare function temaDoWhitelabel(wl?: WhitelabelDoCliente | null): {
|
|
84
|
+
tema: TailorTema;
|
|
85
|
+
escuro?: TailorTema;
|
|
86
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export type TailorPageHeaderLink = {
|
|
3
|
+
href: string;
|
|
4
|
+
className: string;
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
'aria-current'?: 'page';
|
|
7
|
+
};
|
|
8
|
+
export type TailorPageHeaderProps = {
|
|
9
|
+
/** ReactNode para permitir um acento dentro do título. */
|
|
10
|
+
titulo: React.ReactNode;
|
|
11
|
+
/** Uma frase: o que se faz nesta tela. */
|
|
12
|
+
descricao?: React.ReactNode;
|
|
13
|
+
/** Seção ou contexto, com o ponto da marca. Sem ele, não aparece. */
|
|
14
|
+
sobretitulo?: string;
|
|
15
|
+
/** Trilha de navegação; o último item é a página atual. */
|
|
16
|
+
trilha?: Array<{
|
|
17
|
+
rotulo: string;
|
|
18
|
+
href?: string;
|
|
19
|
+
}>;
|
|
20
|
+
/** Link ou ação de voltar, acima de tudo. */
|
|
21
|
+
voltar?: {
|
|
22
|
+
rotulo: string;
|
|
23
|
+
href?: string;
|
|
24
|
+
onClick?: () => void;
|
|
25
|
+
};
|
|
26
|
+
/** Ao lado do título: status, plano, contagem. */
|
|
27
|
+
etiqueta?: React.ReactNode;
|
|
28
|
+
/** Números do topo, quando ajudam a decidir o que fazer aqui. */
|
|
29
|
+
indicadores?: Array<{
|
|
30
|
+
rotulo: string;
|
|
31
|
+
valor: React.ReactNode;
|
|
32
|
+
}>;
|
|
33
|
+
/** Botões e busca, à direita. */
|
|
34
|
+
acoes?: React.ReactNode;
|
|
35
|
+
/** Abaixo, na largura toda: abas, filtros, barra de busca. */
|
|
36
|
+
children?: React.ReactNode;
|
|
37
|
+
/** Link do roteador do app (ex.: `NavLink`). Repasse todas as props. Sem ele, sai um `<a href>`. */
|
|
38
|
+
renderLink?: (props: TailorPageHeaderLink) => React.ReactNode;
|
|
39
|
+
className?: string;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* O cabeçalho de página. Visual só por variáveis `--tailor-marca-*` e
|
|
43
|
+
* `--tailor-cabecalho-*` (ver `TailorMarca`), para vestir a marca do cliente:
|
|
44
|
+
* cor de destaque, fontes, peso e caixa do título, cantos, fundo.
|
|
45
|
+
* Padrão Tailor: sem card nem sombra, régua de 1px embaixo, título 26 → 42.
|
|
46
|
+
*/
|
|
47
|
+
export declare function TailorPageHeader({ titulo, descricao, sobretitulo, trilha, voltar, etiqueta, indicadores, acoes, children, renderLink, className, }: TailorPageHeaderProps): React.JSX.Element;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -16,3 +16,7 @@ export type { AgenteMascoteProps, ChaveDoMascote, ChaveDoAgente, EstadoDoMascote
|
|
|
16
16
|
export type { ExpressaoDoMascote, TemaDoMascote, AcessorioDoMascote, ObjetoDoMascote, } from './components/MascoteVetor';
|
|
17
17
|
export { EquipeDock } from './components/EquipeDock';
|
|
18
18
|
export type { EquipeDockProps, AgenteDaEquipe } from './components/EquipeDock';
|
|
19
|
+
export { TailorPageHeader } from './components/TailorPageHeader';
|
|
20
|
+
export type { TailorPageHeaderProps, TailorPageHeaderLink } from './components/TailorPageHeader';
|
|
21
|
+
export { TailorMarca, temaParaVariaveis, temaDoWhitelabel, contraste } from './components/TailorMarca';
|
|
22
|
+
export type { TailorMarcaProps, TailorTema, WhitelabelDoCliente } from './components/TailorMarca';
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ffid-br/tailor-ui",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.6.0",
|
|
5
5
|
"description": "Primitivos de marca Tailor.ia em React: loader, intro, transição de login, lockup e barra lateral.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "dist/index.umd.js",
|