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.
Files changed (79) hide show
  1. package/LICENSE +49 -0
  2. package/README.md +125 -0
  3. package/css/base/forced-colors.css +62 -0
  4. package/css/base/icons.css +73 -0
  5. package/css/base/index.css +4 -0
  6. package/css/base/reset.css +80 -0
  7. package/css/base/typography.css +211 -0
  8. package/css/components/accordion.css +153 -0
  9. package/css/components/alert.css +161 -0
  10. package/css/components/avatar.css +76 -0
  11. package/css/components/badge.css +83 -0
  12. package/css/components/breadcrumb.css +58 -0
  13. package/css/components/button.css +364 -0
  14. package/css/components/card.css +159 -0
  15. package/css/components/checkbox.css +296 -0
  16. package/css/components/combobox.css +330 -0
  17. package/css/components/divider.css +20 -0
  18. package/css/components/form-field.css +137 -0
  19. package/css/components/index.css +28 -0
  20. package/css/components/input.css +356 -0
  21. package/css/components/link.css +67 -0
  22. package/css/components/menu.css +246 -0
  23. package/css/components/modal.css +236 -0
  24. package/css/components/pagination.css +132 -0
  25. package/css/components/radio.css +280 -0
  26. package/css/components/select.css +399 -0
  27. package/css/components/skeleton.css +52 -0
  28. package/css/components/spinner.css +59 -0
  29. package/css/components/tabs.css +79 -0
  30. package/css/components/textarea.css +218 -0
  31. package/css/components/toggle.css +202 -0
  32. package/css/components/tooltip.css +116 -0
  33. package/css/design-system.css +13 -0
  34. package/css/tokens/generated/component.css +720 -0
  35. package/css/tokens/generated/foundation.css +282 -0
  36. package/css/tokens/generated/index.css +5 -0
  37. package/css/tokens/generated/theme-dark.css +243 -0
  38. package/css/tokens/generated/theme-light.css +244 -0
  39. package/css/tokens/index.css +6 -0
  40. package/css/utilities/elevation.css +24 -0
  41. package/css/utilities/index.css +2 -0
  42. package/css/utilities/layout.css +132 -0
  43. package/docs/agent-consumer-usage.en.md +322 -0
  44. package/docs/agent-consumer-usage.md +294 -0
  45. package/docs/api/adrs.json +186 -0
  46. package/docs/api/components.json +2071 -0
  47. package/docs/api/consumer-context.json +66 -0
  48. package/docs/api/foundations.json +94 -0
  49. package/docs/api/tokens.json +6839 -0
  50. package/docs/llms-full.txt +23699 -0
  51. package/docs/llms.txt +109 -0
  52. package/docs/templates/contact.html +364 -0
  53. package/docs/templates/dashboard.html +318 -0
  54. package/docs/templates/index.html +232 -0
  55. package/docs/templates/login.html +286 -0
  56. package/docs/templates/settings.html +365 -0
  57. package/docs/templates/signup.html +350 -0
  58. package/js/accordion.js +192 -0
  59. package/js/combobox.js +263 -0
  60. package/js/menu.js +301 -0
  61. package/js/modal.js +256 -0
  62. package/js/package.json +3 -0
  63. package/js/tabs.js +200 -0
  64. package/js/theme/apply.js +75 -0
  65. package/js/theme/brand-contrast-audit.js +133 -0
  66. package/js/theme/color.js +149 -0
  67. package/js/theme/config-schema.js +40 -0
  68. package/js/theme/contrast.js +76 -0
  69. package/js/theme/export.js +118 -0
  70. package/js/theme/index.js +21 -0
  71. package/js/theme/overlay.js +29 -0
  72. package/js/theme/package.json +3 -0
  73. package/js/theme/palette.js +103 -0
  74. package/js/theme/radius.js +76 -0
  75. package/js/theme/semantic-mapper.js +138 -0
  76. package/js/theme/typography.js +33 -0
  77. package/js/theme/url-state.js +52 -0
  78. package/js/tooltip.js +227 -0
  79. 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
+ [![Versão](https://img.shields.io/badge/vers%C3%A3o-1.0.0--beta.10-blue)](./CHANGELOG.md) [![Licença](https://img.shields.io/badge/licen%C3%A7a-Propriet%C3%A1ria-red)](./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,4 @@
1
+ @import 'reset.css';
2
+ @import 'typography.css';
3
+ @import 'icons.css';
4
+ @import 'forced-colors.css';
@@ -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
+ }