ds-tis 1.0.0-beta.10
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/LICENSE +49 -0
- package/README.md +125 -0
- package/css/base/forced-colors.css +62 -0
- package/css/base/icons.css +73 -0
- package/css/base/index.css +4 -0
- package/css/base/reset.css +80 -0
- package/css/base/typography.css +211 -0
- package/css/components/accordion.css +153 -0
- package/css/components/alert.css +161 -0
- package/css/components/avatar.css +76 -0
- package/css/components/badge.css +83 -0
- package/css/components/breadcrumb.css +58 -0
- package/css/components/button.css +364 -0
- package/css/components/card.css +159 -0
- package/css/components/checkbox.css +296 -0
- package/css/components/combobox.css +330 -0
- package/css/components/divider.css +20 -0
- package/css/components/form-field.css +137 -0
- package/css/components/index.css +28 -0
- package/css/components/input.css +356 -0
- package/css/components/link.css +67 -0
- package/css/components/menu.css +246 -0
- package/css/components/modal.css +236 -0
- package/css/components/pagination.css +132 -0
- package/css/components/radio.css +280 -0
- package/css/components/select.css +399 -0
- package/css/components/skeleton.css +52 -0
- package/css/components/spinner.css +59 -0
- package/css/components/tabs.css +79 -0
- package/css/components/textarea.css +218 -0
- package/css/components/toggle.css +202 -0
- package/css/components/tooltip.css +116 -0
- package/css/design-system.css +13 -0
- package/css/tokens/generated/component.css +720 -0
- package/css/tokens/generated/foundation.css +282 -0
- package/css/tokens/generated/index.css +5 -0
- package/css/tokens/generated/theme-dark.css +243 -0
- package/css/tokens/generated/theme-light.css +244 -0
- package/css/tokens/index.css +6 -0
- package/css/utilities/elevation.css +24 -0
- package/css/utilities/index.css +2 -0
- package/css/utilities/layout.css +132 -0
- package/docs/agent-consumer-usage.en.md +322 -0
- package/docs/agent-consumer-usage.md +294 -0
- package/docs/api/adrs.json +186 -0
- package/docs/api/components.json +2071 -0
- package/docs/api/consumer-context.json +66 -0
- package/docs/api/foundations.json +94 -0
- package/docs/api/tokens.json +6839 -0
- package/docs/llms-full.txt +23699 -0
- package/docs/llms.txt +109 -0
- package/docs/templates/contact.html +364 -0
- package/docs/templates/dashboard.html +318 -0
- package/docs/templates/index.html +232 -0
- package/docs/templates/login.html +286 -0
- package/docs/templates/settings.html +365 -0
- package/docs/templates/signup.html +350 -0
- package/js/accordion.js +192 -0
- package/js/combobox.js +263 -0
- package/js/menu.js +301 -0
- package/js/modal.js +256 -0
- package/js/package.json +3 -0
- package/js/tabs.js +200 -0
- package/js/theme/apply.js +75 -0
- package/js/theme/brand-contrast-audit.js +133 -0
- package/js/theme/color.js +149 -0
- package/js/theme/config-schema.js +40 -0
- package/js/theme/contrast.js +76 -0
- package/js/theme/export.js +118 -0
- package/js/theme/index.js +21 -0
- package/js/theme/overlay.js +29 -0
- package/js/theme/package.json +3 -0
- package/js/theme/palette.js +103 -0
- package/js/theme/radius.js +76 -0
- package/js/theme/semantic-mapper.js +138 -0
- package/js/theme/typography.js +33 -0
- package/js/theme/url-state.js +52 -0
- package/js/tooltip.js +227 -0
- package/package.json +139 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
Proprietary Software License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026. Todos os direitos reservados.
|
|
4
|
+
CNPJ: 41.422.344/0001-76. All rights reserved.
|
|
5
|
+
|
|
6
|
+
This software and associated documentation files (the "Software") are the
|
|
7
|
+
exclusive property of the copyright holder. The Software is provided solely
|
|
8
|
+
for use under a separate written agreement between the copyright holder and
|
|
9
|
+
the authorized licensee.
|
|
10
|
+
|
|
11
|
+
RESTRICTIONS
|
|
12
|
+
|
|
13
|
+
Unless expressly authorized in writing by the copyright holder, you may not:
|
|
14
|
+
|
|
15
|
+
1. Copy, reproduce, or duplicate the Software in whole or in part.
|
|
16
|
+
2. Modify, adapt, translate, or create derivative works based on the Software.
|
|
17
|
+
3. Distribute, sublicense, sell, rent, lease, or otherwise transfer the
|
|
18
|
+
Software or any rights in the Software to any third party.
|
|
19
|
+
4. Reverse engineer, disassemble, decompile, or otherwise attempt to derive
|
|
20
|
+
the source code of the Software.
|
|
21
|
+
5. Remove or alter any proprietary notices, labels, or marks on the Software.
|
|
22
|
+
6. Use the Software for any commercial purpose without a valid license
|
|
23
|
+
agreement issued by the copyright holder.
|
|
24
|
+
|
|
25
|
+
PERMITTED USE
|
|
26
|
+
|
|
27
|
+
Viewing the source code for evaluation purposes is permitted solely to
|
|
28
|
+
assess whether to enter into a license agreement with the copyright holder.
|
|
29
|
+
No other use is granted by this permission.
|
|
30
|
+
|
|
31
|
+
INTELLECTUAL PROPERTY
|
|
32
|
+
|
|
33
|
+
All title, ownership rights, and intellectual property rights in and to the
|
|
34
|
+
Software remain with the copyright holder. No rights are granted other than
|
|
35
|
+
those expressly stated in a separate written license agreement.
|
|
36
|
+
|
|
37
|
+
DISCLAIMER OF WARRANTIES
|
|
38
|
+
|
|
39
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
40
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
41
|
+
FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
|
42
|
+
THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY,
|
|
43
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF,
|
|
44
|
+
OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
45
|
+
SOFTWARE.
|
|
46
|
+
|
|
47
|
+
CONTACT
|
|
48
|
+
|
|
49
|
+
To inquire about licensing, contact the copyright holder directly.
|
package/README.md
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Design System Core
|
|
2
|
+
|
|
3
|
+
[](./CHANGELOG.md) [](./LICENSE)
|
|
4
|
+
|
|
5
|
+
Design system white-label em CSS puro, com tokens DTCG em arquitetura 3-layer (Foundation/Core → Semantic/System → Component), componentes documentados, modos light/dark e paleta brand única customizável.
|
|
6
|
+
|
|
7
|
+
## Instalação
|
|
8
|
+
|
|
9
|
+
O pacote beta é distribuído pelo npm registry. Instale a versão corrente com:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install ds-tis
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Durante a fase beta, as dist-tags npm `latest` e `beta` apontam para a mesma
|
|
16
|
+
pré-release. Use `npm install ds-tis@beta` quando quiser explicitar o canal.
|
|
17
|
+
|
|
18
|
+
Em produção, prefira o pin exato:
|
|
19
|
+
|
|
20
|
+
```json
|
|
21
|
+
{
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"ds-tis": "1.0.0-beta.10"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Como fallback, o mesmo release pode ser instalado pela tag GitHub: `npm install github:tis-experience/ds-tis#v1.0.0-beta.10`.
|
|
29
|
+
|
|
30
|
+
Import principal (o nome do pacote continua `ds-tis`):
|
|
31
|
+
|
|
32
|
+
```js
|
|
33
|
+
import 'ds-tis/css';
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
HTML estático ou protótipo sem bundler:
|
|
37
|
+
|
|
38
|
+
```html
|
|
39
|
+
<link rel="stylesheet" href="./node_modules/ds-tis/css/design-system.css">
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Componentes interativos mantêm CSS puro para a anatomia visual. Quando
|
|
43
|
+
`runtime.level` é `required` em `docs/api/components.json`, o módulo público é
|
|
44
|
+
**obrigatório** para cumprir o contrato interativo e acessível. Os runtimes atuais
|
|
45
|
+
são Accordion, Combobox, Modal, Action Menu, Tabs e Tooltip:
|
|
46
|
+
|
|
47
|
+
```js
|
|
48
|
+
import { initAccordions, destroyAccordions } from 'ds-tis/accordion';
|
|
49
|
+
import { initComboboxes, destroyComboboxes } from 'ds-tis/combobox';
|
|
50
|
+
import { initModals, destroyModals } from 'ds-tis/modal';
|
|
51
|
+
import { initActionMenus, destroyActionMenus } from 'ds-tis/menu';
|
|
52
|
+
import { initTabs, destroyTabs } from 'ds-tis/tabs';
|
|
53
|
+
import { initTooltips, destroyTooltips } from 'ds-tis/tooltip';
|
|
54
|
+
|
|
55
|
+
initAccordions();
|
|
56
|
+
initComboboxes();
|
|
57
|
+
initModals();
|
|
58
|
+
initActionMenus();
|
|
59
|
+
initTabs();
|
|
60
|
+
initTooltips();
|
|
61
|
+
|
|
62
|
+
// ao desmontar a view/subtree:
|
|
63
|
+
destroyAccordions();
|
|
64
|
+
destroyComboboxes();
|
|
65
|
+
destroyModals();
|
|
66
|
+
destroyActionMenus();
|
|
67
|
+
destroyTabs();
|
|
68
|
+
destroyTooltips();
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Accordion, Combobox, Modal, Action Menu, Tabs e Tooltip concluíram o gate
|
|
72
|
+
executável da ADR-020 e estão **App-ready**. Seus módulos continuam obrigatórios
|
|
73
|
+
quando os componentes forem usados, pois mantêm o contrato interativo e
|
|
74
|
+
acessível publicado.
|
|
75
|
+
|
|
76
|
+
O pacote também exporta o theme engine e templates HTML:
|
|
77
|
+
|
|
78
|
+
```js
|
|
79
|
+
import { applyTheme, toCssSnippet } from 'ds-tis/theme';
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Desenvolvimento local do próprio DS:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
git clone https://github.com/tis-experience/ds-tis.git
|
|
86
|
+
cd ds-tis
|
|
87
|
+
npm install
|
|
88
|
+
npm run build:all
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Depois sirva o diretório estático (`python3 -m http.server` ou equivalente). Docs públicas: [GitHub Pages](https://tis-experience.github.io/ds-tis/).
|
|
92
|
+
|
|
93
|
+
## Documentação completa
|
|
94
|
+
|
|
95
|
+
Toda a documentação vive em `docs/` e pode ser servida como site estático. Lá estão: componentes com preview ao vivo, foundations, guias de tema, acessibilidade e documentação, ADRs navegáveis, inventário de tokens, e consumo por IA em `docs/llms.txt`.
|
|
96
|
+
|
|
97
|
+
O pacote também distribui contexto machine-readable para ferramentas e agents:
|
|
98
|
+
`ds-tis/metadata` (manifesto de consumo), `ds-tis/metadata/components`,
|
|
99
|
+
`ds-tis/metadata/tokens`, `ds-tis/agent-guide`, `ds-tis/llms` e
|
|
100
|
+
`ds-tis/llms-full`. O manifesto declara a estratégia responsiva
|
|
101
|
+
`intrinsic-first`: não há breakpoints públicos automáticos; layout, densidade e
|
|
102
|
+
troca de composição pertencem ao app consumidor.
|
|
103
|
+
|
|
104
|
+
Antes de usar um componente em fluxo crítico, consulte seu `readiness` na
|
|
105
|
+
[API pública de componentes](https://tis-experience.github.io/ds-tis/docs/api/components.json)
|
|
106
|
+
ou no inventário: `app-ready` é recomendado para aplicações, `composition`
|
|
107
|
+
mantém orquestração no app e `experimental` ainda possui gaps declarados em
|
|
108
|
+
`readinessNotes`.
|
|
109
|
+
|
|
110
|
+
Links rápidos:
|
|
111
|
+
|
|
112
|
+
- [Getting Started](./index.html)
|
|
113
|
+
- [Token Architecture](./docs/token-architecture.html)
|
|
114
|
+
- [Documentation Guidelines](./docs/documentation-guidelines.html)
|
|
115
|
+
- [Guia para agents consumidores](./docs/agent-consumer-usage.html) — como implementar telas em projetos consumidores usando o DS TIS
|
|
116
|
+
- [Component Inventory](./docs/component-inventory.md)
|
|
117
|
+
- [Decisões (ADRs)](./docs/decisions/)
|
|
118
|
+
- [Changelog](./CHANGELOG.md)
|
|
119
|
+
- [Como contribuir](./CONTRIBUTING.md)
|
|
120
|
+
- [Instruções para agentes IA](./AGENTS.md) — canônico (Claude Code, Codex, Gemini, Cursor, etc.)
|
|
121
|
+
- [Integrações para agentes IA](./docs/agent-integrations.md) — Figma, GitHub, MCPs e adapters locais
|
|
122
|
+
|
|
123
|
+
## Licença
|
|
124
|
+
|
|
125
|
+
Licença proprietária. Todos os direitos reservados. Ver [LICENSE](./LICENSE).
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/* ============================================================
|
|
2
|
+
Forced colors (Windows High Contrast) — WCAG 1.4.11 support
|
|
3
|
+
Usa system colors para preservar contraste quando o SO
|
|
4
|
+
substitui paletas customizadas.
|
|
5
|
+
============================================================ */
|
|
6
|
+
|
|
7
|
+
@media (forced-colors: active) {
|
|
8
|
+
.ds-button:focus-visible,
|
|
9
|
+
.ds-link:focus-visible,
|
|
10
|
+
.ds-input__field:focus-visible,
|
|
11
|
+
.ds-select__field:focus-visible,
|
|
12
|
+
.ds-textarea__field:focus-visible,
|
|
13
|
+
.ds-combobox__input:focus-visible,
|
|
14
|
+
.ds-checkbox:focus-visible,
|
|
15
|
+
.ds-radio:focus-visible,
|
|
16
|
+
.ds-toggle:focus-visible,
|
|
17
|
+
.ds-breadcrumb__item:focus-visible,
|
|
18
|
+
.ds-menu__item:focus-visible,
|
|
19
|
+
.ds-modal__close:focus-visible,
|
|
20
|
+
.ds-tabs__tab:focus-visible,
|
|
21
|
+
.ds-accordion__trigger:focus-visible,
|
|
22
|
+
.ds-pagination__item:focus-visible {
|
|
23
|
+
outline: 2px solid CanvasText;
|
|
24
|
+
outline-offset: 2px;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.ds-checkbox:checked,
|
|
28
|
+
.ds-checkbox:indeterminate {
|
|
29
|
+
background-color: Highlight;
|
|
30
|
+
border-color: Highlight;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.ds-checkbox:checked::after,
|
|
34
|
+
.ds-checkbox:indeterminate::after {
|
|
35
|
+
background-color: HighlightText;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.ds-radio:checked {
|
|
39
|
+
border-color: Highlight;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.ds-radio:checked::after {
|
|
43
|
+
background-color: Highlight;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.ds-toggle:checked {
|
|
47
|
+
background-color: Highlight;
|
|
48
|
+
border-color: Highlight;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.ds-toggle__thumb {
|
|
52
|
+
background-color: Canvas;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.ds-modal-overlay {
|
|
56
|
+
background-color: Canvas;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.ds-modal {
|
|
60
|
+
border: 1px solid CanvasText;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/* ============================================================
|
|
2
|
+
Iconography helpers
|
|
3
|
+
============================================================ */
|
|
4
|
+
|
|
5
|
+
.ds-icon {
|
|
6
|
+
width: var(--ds-size-md);
|
|
7
|
+
height: var(--ds-size-md);
|
|
8
|
+
color: var(--ds-icon-color-default);
|
|
9
|
+
stroke: currentColor;
|
|
10
|
+
stroke-width: var(--ds-icon-stroke-width-regular-24);
|
|
11
|
+
fill: none;
|
|
12
|
+
flex-shrink: 0;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.ds-icon--16 {
|
|
16
|
+
width: var(--ds-size-xs);
|
|
17
|
+
height: var(--ds-size-xs);
|
|
18
|
+
stroke-width: var(--ds-icon-stroke-width-regular-16);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.ds-icon--20 {
|
|
22
|
+
width: var(--ds-size-sm);
|
|
23
|
+
height: var(--ds-size-sm);
|
|
24
|
+
stroke-width: var(--ds-icon-stroke-width-regular-20);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.ds-icon--24 {
|
|
28
|
+
width: var(--ds-size-md);
|
|
29
|
+
height: var(--ds-size-md);
|
|
30
|
+
stroke-width: var(--ds-icon-stroke-width-regular-24);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.ds-icon--32 {
|
|
34
|
+
width: var(--ds-size-lg);
|
|
35
|
+
height: var(--ds-size-lg);
|
|
36
|
+
stroke-width: var(--ds-icon-stroke-width-regular-32);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.ds-icon--strong.ds-icon--16 {
|
|
40
|
+
stroke-width: var(--ds-icon-stroke-width-strong-16);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.ds-icon--strong.ds-icon--20 {
|
|
44
|
+
stroke-width: var(--ds-icon-stroke-width-strong-20);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.ds-icon--strong.ds-icon--24 {
|
|
48
|
+
stroke-width: var(--ds-icon-stroke-width-strong-24);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.ds-icon--subtle {
|
|
52
|
+
color: var(--ds-icon-color-subtle);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.ds-icon--inverse {
|
|
56
|
+
color: var(--ds-icon-color-inverse);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.ds-icon--success {
|
|
60
|
+
color: var(--ds-icon-color-success);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.ds-icon--warning {
|
|
64
|
+
color: var(--ds-icon-color-warning);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.ds-icon--error {
|
|
68
|
+
color: var(--ds-icon-color-error);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.ds-icon--disabled {
|
|
72
|
+
color: var(--ds-icon-color-disabled);
|
|
73
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/* Google Fonts — Inter + DM Mono */
|
|
2
|
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=DM+Mono:wght@400;500&display=swap');
|
|
3
|
+
|
|
4
|
+
*, *::before, *::after { box-sizing: border-box; }
|
|
5
|
+
* { margin: 0; padding: 0; }
|
|
6
|
+
html {
|
|
7
|
+
-webkit-font-smoothing: antialiased;
|
|
8
|
+
-moz-osx-font-smoothing: grayscale;
|
|
9
|
+
scroll-behavior: smooth;
|
|
10
|
+
}
|
|
11
|
+
body {
|
|
12
|
+
font-family: var(--ds-body-font-family-sans);
|
|
13
|
+
font-size: var(--ds-body-font-size-md);
|
|
14
|
+
line-height: var(--ds-body-line-height-md);
|
|
15
|
+
color: var(--ds-content-strong);
|
|
16
|
+
background-color: var(--ds-background-default);
|
|
17
|
+
}
|
|
18
|
+
img, picture, video, canvas, svg { display: block; max-width: 100%; }
|
|
19
|
+
input, button, textarea, select { font: inherit; }
|
|
20
|
+
p, h1, h2, h3, h4, h5, h6 { overflow-wrap: break-word; }
|
|
21
|
+
|
|
22
|
+
/* ---------------------------------------------------------
|
|
23
|
+
Code / Pre
|
|
24
|
+
--------------------------------------------------------- */
|
|
25
|
+
code, pre {
|
|
26
|
+
font-family: var(--ds-body-font-family-mono);
|
|
27
|
+
font-size: var(--ds-body-font-size-sm);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
code {
|
|
31
|
+
background-color: var(--ds-background-subtle);
|
|
32
|
+
padding: var(--ds-space-2xs) var(--ds-space-xs);
|
|
33
|
+
border-radius: var(--ds-radius-sm);
|
|
34
|
+
color: var(--ds-link-content-default);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
pre {
|
|
38
|
+
background-color: var(--ds-background-inverse);
|
|
39
|
+
color: var(--ds-content-inverse);
|
|
40
|
+
padding: var(--ds-space-lg);
|
|
41
|
+
border-radius: var(--ds-radius-lg);
|
|
42
|
+
overflow-x: auto;
|
|
43
|
+
margin-bottom: var(--ds-space-lg);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
pre code {
|
|
47
|
+
background: none;
|
|
48
|
+
padding: 0;
|
|
49
|
+
color: inherit;
|
|
50
|
+
font-size: var(--ds-body-font-size-sm);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* ---------------------------------------------------------
|
|
54
|
+
Tables
|
|
55
|
+
--------------------------------------------------------- */
|
|
56
|
+
table {
|
|
57
|
+
border-collapse: collapse;
|
|
58
|
+
width: 100%;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
th, td {
|
|
62
|
+
padding: var(--ds-space-md) var(--ds-space-lg);
|
|
63
|
+
text-align: left;
|
|
64
|
+
border-bottom: var(--ds-border-width-default) solid var(--ds-border-default);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
th {
|
|
68
|
+
font-weight: var(--ds-body-font-weight-semibold);
|
|
69
|
+
font-size: var(--ds-body-font-size-sm);
|
|
70
|
+
color: var(--ds-content-default);
|
|
71
|
+
text-transform: uppercase;
|
|
72
|
+
letter-spacing: var(--ds-body-letter-spacing-normal);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@media (prefers-reduced-motion: reduce) {
|
|
76
|
+
*, *::before, *::after {
|
|
77
|
+
animation-duration: 0.01ms !important;
|
|
78
|
+
transition-duration: 0.01ms !important;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
Typography utility classes — alinhadas 1:1 com Text Styles do Figma
|
|
3
|
+
Naming: .ds-text-{category}-{size}
|
|
4
|
+
Cada utility espelha um Text Style equivalente em Figma:
|
|
5
|
+
display/2xl..sm → .ds-text-display-{2xl..sm}
|
|
6
|
+
heading/xl..xs → .ds-text-heading-{xl..xs}
|
|
7
|
+
body/lg..xs → .ds-text-body-{lg..xs}
|
|
8
|
+
label/lg, md, xs → .ds-text-label-{lg, md, xs}
|
|
9
|
+
overline/md, sm → .ds-text-overline-{md, sm}
|
|
10
|
+
code/md, sm → .ds-text-code-{md, sm}
|
|
11
|
+
Tokens consumidos exclusivamente da camada Semantic (body.*).
|
|
12
|
+
========================================================================== */
|
|
13
|
+
|
|
14
|
+
/* --------------------------------------------------------------------------
|
|
15
|
+
Display — Inter Bold, line-height pareado, letter-spacing tight (sm: normal)
|
|
16
|
+
-------------------------------------------------------------------------- */
|
|
17
|
+
|
|
18
|
+
.ds-text-display-2xl {
|
|
19
|
+
font-family: var(--ds-body-font-family-sans);
|
|
20
|
+
font-weight: var(--ds-body-font-weight-bold);
|
|
21
|
+
font-size: var(--ds-body-font-size-9xl); /* 72px */
|
|
22
|
+
line-height: var(--ds-body-line-height-9xl); /* 90px */
|
|
23
|
+
letter-spacing: var(--ds-body-letter-spacing-tight);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.ds-text-display-xl {
|
|
27
|
+
font-family: var(--ds-body-font-family-sans);
|
|
28
|
+
font-weight: var(--ds-body-font-weight-bold);
|
|
29
|
+
font-size: var(--ds-body-font-size-8xl); /* 64px */
|
|
30
|
+
line-height: var(--ds-body-line-height-8xl); /* 80px */
|
|
31
|
+
letter-spacing: var(--ds-body-letter-spacing-tight);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.ds-text-display-lg {
|
|
35
|
+
font-family: var(--ds-body-font-family-sans);
|
|
36
|
+
font-weight: var(--ds-body-font-weight-bold);
|
|
37
|
+
font-size: var(--ds-body-font-size-7xl); /* 56px */
|
|
38
|
+
line-height: var(--ds-body-line-height-7xl); /* 72px */
|
|
39
|
+
letter-spacing: var(--ds-body-letter-spacing-tight);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.ds-text-display-md {
|
|
43
|
+
font-family: var(--ds-body-font-family-sans);
|
|
44
|
+
font-weight: var(--ds-body-font-weight-bold);
|
|
45
|
+
font-size: var(--ds-body-font-size-6xl); /* 48px */
|
|
46
|
+
line-height: var(--ds-body-line-height-6xl); /* 64px */
|
|
47
|
+
letter-spacing: var(--ds-body-letter-spacing-tight);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.ds-text-display-sm {
|
|
51
|
+
font-family: var(--ds-body-font-family-sans);
|
|
52
|
+
font-weight: var(--ds-body-font-weight-bold);
|
|
53
|
+
font-size: var(--ds-body-font-size-5xl); /* 40px */
|
|
54
|
+
line-height: var(--ds-body-line-height-5xl); /* 48px */
|
|
55
|
+
letter-spacing: var(--ds-body-letter-spacing-normal);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/* --------------------------------------------------------------------------
|
|
59
|
+
Heading — Inter, xl bold, lg–xs semibold; letter-spacing tight em xl/lg, normal demais
|
|
60
|
+
-------------------------------------------------------------------------- */
|
|
61
|
+
|
|
62
|
+
.ds-text-heading-xl {
|
|
63
|
+
font-family: var(--ds-body-font-family-sans);
|
|
64
|
+
font-weight: var(--ds-body-font-weight-bold);
|
|
65
|
+
font-size: var(--ds-body-font-size-4xl); /* 32px */
|
|
66
|
+
line-height: var(--ds-body-line-height-4xl); /* 44px */
|
|
67
|
+
letter-spacing: var(--ds-body-letter-spacing-tight);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.ds-text-heading-lg {
|
|
71
|
+
font-family: var(--ds-body-font-family-sans);
|
|
72
|
+
font-weight: var(--ds-body-font-weight-semibold);
|
|
73
|
+
font-size: var(--ds-body-font-size-3xl); /* 28px */
|
|
74
|
+
line-height: var(--ds-body-line-height-3xl); /* 40px */
|
|
75
|
+
letter-spacing: var(--ds-body-letter-spacing-tight);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.ds-text-heading-md {
|
|
79
|
+
font-family: var(--ds-body-font-family-sans);
|
|
80
|
+
font-weight: var(--ds-body-font-weight-semibold);
|
|
81
|
+
font-size: var(--ds-body-font-size-2xl); /* 24px */
|
|
82
|
+
line-height: var(--ds-body-line-height-2xl); /* 34px */
|
|
83
|
+
letter-spacing: var(--ds-body-letter-spacing-normal);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.ds-text-heading-sm {
|
|
87
|
+
font-family: var(--ds-body-font-family-sans);
|
|
88
|
+
font-weight: var(--ds-body-font-weight-semibold);
|
|
89
|
+
font-size: var(--ds-body-font-size-xl); /* 20px */
|
|
90
|
+
line-height: var(--ds-body-line-height-xl); /* 32px */
|
|
91
|
+
letter-spacing: var(--ds-body-letter-spacing-normal);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.ds-text-heading-xs {
|
|
95
|
+
font-family: var(--ds-body-font-family-sans);
|
|
96
|
+
font-weight: var(--ds-body-font-weight-semibold);
|
|
97
|
+
font-size: var(--ds-body-font-size-lg); /* 18px */
|
|
98
|
+
line-height: var(--ds-body-line-height-lg); /* 28px */
|
|
99
|
+
letter-spacing: var(--ds-body-letter-spacing-normal);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* --------------------------------------------------------------------------
|
|
103
|
+
Body — Inter Regular, line-height pareado conforme Text Style do Figma
|
|
104
|
+
(body/lg usa line-height/xl em Figma — não lg)
|
|
105
|
+
-------------------------------------------------------------------------- */
|
|
106
|
+
|
|
107
|
+
.ds-text-body-lg {
|
|
108
|
+
font-family: var(--ds-body-font-family-sans);
|
|
109
|
+
font-weight: var(--ds-body-font-weight-regular);
|
|
110
|
+
font-size: var(--ds-body-font-size-lg); /* 18px */
|
|
111
|
+
line-height: var(--ds-body-line-height-xl); /* 32px (Figma body/lg = lh xl) */
|
|
112
|
+
letter-spacing: var(--ds-body-letter-spacing-normal);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.ds-text-body-md {
|
|
116
|
+
font-family: var(--ds-body-font-family-sans);
|
|
117
|
+
font-weight: var(--ds-body-font-weight-regular);
|
|
118
|
+
font-size: var(--ds-body-font-size-md); /* 16px */
|
|
119
|
+
line-height: var(--ds-body-line-height-md); /* 24px */
|
|
120
|
+
letter-spacing: var(--ds-body-letter-spacing-normal);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.ds-text-body-sm {
|
|
124
|
+
font-family: var(--ds-body-font-family-sans);
|
|
125
|
+
font-weight: var(--ds-body-font-weight-regular);
|
|
126
|
+
font-size: var(--ds-body-font-size-sm); /* 14px */
|
|
127
|
+
line-height: var(--ds-body-line-height-sm); /* 20px */
|
|
128
|
+
letter-spacing: var(--ds-body-letter-spacing-normal);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.ds-text-body-xs {
|
|
132
|
+
font-family: var(--ds-body-font-family-sans);
|
|
133
|
+
font-weight: var(--ds-body-font-weight-regular);
|
|
134
|
+
font-size: var(--ds-body-font-size-xs); /* 12px */
|
|
135
|
+
line-height: var(--ds-body-line-height-xs); /* 18px */
|
|
136
|
+
letter-spacing: var(--ds-body-letter-spacing-normal);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/* --------------------------------------------------------------------------
|
|
140
|
+
Label — Inter Bold (Figma: label/* é Bold). Letter-spacing normal (zero).
|
|
141
|
+
.ds-text-label-sm removido (Text Style label/sm deletado em Figma)
|
|
142
|
+
-------------------------------------------------------------------------- */
|
|
143
|
+
|
|
144
|
+
.ds-text-label-lg {
|
|
145
|
+
font-family: var(--ds-body-font-family-sans);
|
|
146
|
+
font-weight: var(--ds-body-font-weight-bold);
|
|
147
|
+
font-size: var(--ds-body-font-size-md); /* 16px */
|
|
148
|
+
line-height: var(--ds-body-line-height-md); /* 24px */
|
|
149
|
+
letter-spacing: var(--ds-body-letter-spacing-normal);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.ds-text-label-md {
|
|
153
|
+
font-family: var(--ds-body-font-family-sans);
|
|
154
|
+
font-weight: var(--ds-body-font-weight-bold);
|
|
155
|
+
font-size: var(--ds-body-font-size-sm); /* 14px */
|
|
156
|
+
line-height: var(--ds-body-line-height-sm); /* 20px */
|
|
157
|
+
letter-spacing: var(--ds-body-letter-spacing-normal);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* label-xs: Figma label/xs = 12px (Bump de 11→12 nesta migração) */
|
|
161
|
+
.ds-text-label-xs {
|
|
162
|
+
font-family: var(--ds-body-font-family-sans);
|
|
163
|
+
font-weight: var(--ds-body-font-weight-bold);
|
|
164
|
+
font-size: var(--ds-body-font-size-xs); /* 12px */
|
|
165
|
+
line-height: var(--ds-body-line-height-xs); /* 18px */
|
|
166
|
+
letter-spacing: var(--ds-body-letter-spacing-normal);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/* --------------------------------------------------------------------------
|
|
170
|
+
Overline — Inter Semibold, letter-spacing wider (1.5px), uppercase
|
|
171
|
+
.ds-text-overline-sm bump de 11→12 (alinhando com Figma overline/sm)
|
|
172
|
+
-------------------------------------------------------------------------- */
|
|
173
|
+
|
|
174
|
+
.ds-text-overline-md {
|
|
175
|
+
font-family: var(--ds-body-font-family-sans);
|
|
176
|
+
font-weight: var(--ds-body-font-weight-semibold);
|
|
177
|
+
font-size: var(--ds-body-font-size-sm); /* 14px */
|
|
178
|
+
line-height: var(--ds-body-line-height-sm); /* 20px */
|
|
179
|
+
letter-spacing: var(--ds-body-letter-spacing-wider);
|
|
180
|
+
text-transform: uppercase;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.ds-text-overline-sm {
|
|
184
|
+
font-family: var(--ds-body-font-family-sans);
|
|
185
|
+
font-weight: var(--ds-body-font-weight-semibold);
|
|
186
|
+
font-size: var(--ds-body-font-size-xs); /* 12px */
|
|
187
|
+
line-height: var(--ds-body-line-height-xs); /* 18px */
|
|
188
|
+
letter-spacing: var(--ds-body-letter-spacing-wider);
|
|
189
|
+
text-transform: uppercase;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* --------------------------------------------------------------------------
|
|
193
|
+
Code — DM Mono Regular
|
|
194
|
+
.ds-text-caption-{md,sm} removidos (Text Styles caption/* deletados em Figma)
|
|
195
|
+
-------------------------------------------------------------------------- */
|
|
196
|
+
|
|
197
|
+
.ds-text-code-md {
|
|
198
|
+
font-family: var(--ds-body-font-family-mono);
|
|
199
|
+
font-weight: var(--ds-body-font-weight-regular);
|
|
200
|
+
font-size: var(--ds-body-font-size-sm); /* 14px */
|
|
201
|
+
line-height: var(--ds-body-line-height-md); /* 24px (Figma code/md = lh md) */
|
|
202
|
+
letter-spacing: var(--ds-body-letter-spacing-normal);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.ds-text-code-sm {
|
|
206
|
+
font-family: var(--ds-body-font-family-mono);
|
|
207
|
+
font-weight: var(--ds-body-font-weight-regular);
|
|
208
|
+
font-size: var(--ds-body-font-size-sm); /* 14px (Figma code/sm = sm igual code/md, só lh diferente) */
|
|
209
|
+
line-height: var(--ds-body-line-height-sm); /* 20px */
|
|
210
|
+
letter-spacing: var(--ds-body-letter-spacing-normal);
|
|
211
|
+
}
|