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
@@ -0,0 +1,286 @@
1
+ <!DOCTYPE html>
2
+ <html lang="pt">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Login — Design System</title>
7
+ <link rel="stylesheet" href="../../css/design-system.css">
8
+ <link rel="stylesheet" href="../layout.css">
9
+ <script>
10
+ (function(){var l=localStorage.getItem('ds-lang');if(l)document.documentElement.setAttribute('lang',l)})();
11
+ </script>
12
+ </head>
13
+ <body>
14
+
15
+ <header class="ds-site-header">
16
+ <div style="display:flex;align-items:center;gap:var(--ds-dimension-16)">
17
+ <button class="ds-menu-toggle" id="menu-toggle" aria-label="Toggle navigation" aria-expanded="false">
18
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="18" x2="21" y2="18"></line></svg>
19
+ </button>
20
+ <a href="../../index.html" class="ds-site-header__brand" aria-label="TIS Design System">
21
+ <img class="ds-site-header__logo" src="../assets/logo-tis-mark.svg" alt="TIS" width="36" height="36">
22
+ <span class="ds-site-header__title ds-site-header__title--brand">TIS</span>
23
+ <span class="ds-site-header__brand-separator" aria-hidden="true"></span>
24
+ <span class="ds-site-header__title ds-site-header__title--product">Design System</span>
25
+ </a>
26
+ </div>
27
+ <div class="ds-site-header__actions">
28
+ <select class="ds-theme-switcher__select" id="lang-switcher" aria-label="Language">
29
+ <option value="pt">PT</option>
30
+ <option value="en">EN</option>
31
+ </select>
32
+ <button class="ds-button ds-button--ghost ds-button--sm" id="mode-toggle" aria-pressed="false" aria-label="Toggle dark mode"><svg class="ds-button__icon ds-site-header__mode-icon" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"></path></svg><span class="ds-button__label">Dark</span></button>
33
+ </div>
34
+ </header>
35
+ <div class="ds-sidebar-overlay" id="sidebar-overlay"></div>
36
+
37
+ <nav class="ds-sidebar" id="sidebar" aria-label="Main navigation"></nav>
38
+
39
+ <main class="ds-main">
40
+
41
+ <!-- 1. HEADER -->
42
+ <div class="ds-section">
43
+ <h1 class="ds-section__title">Login</h1>
44
+ <p class="ds-section__subtitle">
45
+ <span data-lang="pt">Autenticação simples com email e senha, recuperação de acesso e link para cadastro. Ideal para produtos SaaS e apps internos.</span>
46
+ <span data-lang="en">Simple email-and-password authentication with account recovery and sign-up link. Ideal for SaaS products and internal apps.</span>
47
+ </p>
48
+ <div style="display:flex;flex-wrap:wrap;gap:var(--ds-dimension-8);margin-top:var(--ds-dimension-16)">
49
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Input</span>
50
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Button</span>
51
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Form Field</span>
52
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Link</span>
53
+ </div>
54
+ </div>
55
+
56
+ <!-- 2. PREVIEW -->
57
+ <div class="ds-subsection">
58
+ <h2 class="ds-subsection__title">Preview</h2>
59
+ <div class="ds-preview">
60
+ <div class="ds-preview__tabs">
61
+ <button class="ds-preview__tab ds-preview__tab--active" data-tab="preview">Preview</button>
62
+ <button class="ds-preview__tab" data-tab="code">Code</button>
63
+ <button type="button" class="ds-button ds-button--ghost ds-button--sm ds-preview__action" onclick="openPreviewInNewTab()" aria-label="Abrir preview em nova aba"><svg class="ds-button__icon" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg><span class="ds-button__label">Abrir em nova aba</span></button>
64
+ </div>
65
+ <div class="ds-preview__canvas" style="padding:0;display:block">
66
+ <div style="min-height:540px;display:flex;align-items:center;justify-content:center;background:var(--ds-background-subtle);padding:var(--ds-dimension-40)">
67
+ <div style="background:var(--ds-surface-default);border-radius:var(--ds-radius-lg);padding:var(--ds-dimension-40);width:100%;max-width:400px;box-shadow:0 8px 32px rgba(0,0,0,.08)">
68
+
69
+ <div style="text-align:center;margin-bottom:var(--ds-dimension-32)">
70
+ <div style="width:48px;height:48px;background:var(--ds-brand-background-default);border-radius:var(--ds-radius-md);display:inline-flex;align-items:center;justify-content:center;margin-bottom:var(--ds-dimension-16)">
71
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" aria-hidden="true">
72
+ <rect x="3" y="3" width="8" height="8" rx="1.5" fill="var(--ds-brand-content-default)"/>
73
+ <rect x="13" y="3" width="8" height="8" rx="1.5" fill="var(--ds-brand-content-default)" opacity=".55"/>
74
+ <rect x="3" y="13" width="8" height="8" rx="1.5" fill="var(--ds-brand-content-default)" opacity=".55"/>
75
+ <rect x="13" y="13" width="8" height="8" rx="1.5" fill="var(--ds-brand-content-default)"/>
76
+ </svg>
77
+ </div>
78
+ <h2 style="font-size:var(--ds-body-font-size-xl);font-weight:var(--ds-body-font-weight-bold);color:var(--ds-content-strong);margin:0 0 var(--ds-dimension-4)">
79
+ <span data-lang="pt">Bem-vindo de volta</span><span data-lang="en">Welcome back</span>
80
+ </h2>
81
+ <p style="font-size:var(--ds-body-font-size-md);color:var(--ds-content-default);margin:0">
82
+ <span data-lang="pt">Faça login para continuar</span><span data-lang="en">Sign in to continue</span>
83
+ </p>
84
+ </div>
85
+
86
+ <form novalidate>
87
+ <div class="ds-field" style="margin-bottom:var(--ds-dimension-16)">
88
+ <div class="ds-field__label-row">
89
+ <label class="ds-field__label" for="prev-email">E-mail</label>
90
+ </div>
91
+ <div class="ds-input ds-input--lg">
92
+ <input class="ds-input__field" type="email" id="prev-email" placeholder="seu@email.com" autocomplete="email">
93
+ </div>
94
+ </div>
95
+
96
+ <div class="ds-field" style="margin-bottom:var(--ds-dimension-8)">
97
+ <div class="ds-field__label-row">
98
+ <label class="ds-field__label" for="prev-password"><span data-lang="pt">Senha</span><span data-lang="en">Password</span></label>
99
+ </div>
100
+ <div class="ds-input ds-input--lg">
101
+ <input class="ds-input__field" type="password" id="prev-password" placeholder="••••••••" autocomplete="current-password">
102
+ </div>
103
+ </div>
104
+
105
+ <div style="text-align:right;margin-bottom:var(--ds-dimension-24)">
106
+ <a class="ds-link" href="#" style="font-size:var(--ds-body-font-size-sm)">
107
+ <span data-lang="pt">Esqueci minha senha</span><span data-lang="en">Forgot password?</span>
108
+ </a>
109
+ </div>
110
+
111
+ <button class="ds-button ds-button--brand ds-button--lg ds-button--full" type="submit">
112
+ <span class="ds-button__label"><span data-lang="pt">Entrar</span><span data-lang="en">Sign in</span></span>
113
+ </button>
114
+ </form>
115
+
116
+ <div style="display:flex;align-items:center;gap:var(--ds-dimension-12);margin:var(--ds-dimension-24) 0">
117
+ <span aria-hidden="true" style="flex:1;height:1px;background:var(--ds-border-default)"></span>
118
+ <span style="font-size:var(--ds-body-font-size-sm);color:var(--ds-content-subtle)">ou</span>
119
+ <span aria-hidden="true" style="flex:1;height:1px;background:var(--ds-border-default)"></span>
120
+ </div>
121
+
122
+ <a class="ds-button ds-button--outline ds-button--lg ds-button--full" href="#">
123
+ <span class="ds-button__label"><span data-lang="pt">Criar conta</span><span data-lang="en">Create account</span></span>
124
+ </a>
125
+
126
+ <p style="text-align:center;font-size:var(--ds-body-font-size-xs);color:var(--ds-content-subtle);margin:var(--ds-dimension-24) 0 0">
127
+ <span data-lang="pt">Ao entrar, você concorda com os <a class="ds-link" href="#">Termos de uso</a></span>
128
+ <span data-lang="en">By signing in, you agree to our <a class="ds-link" href="#">Terms of use</a></span>
129
+ </p>
130
+
131
+ </div>
132
+ </div>
133
+ </div>
134
+ <div class="ds-preview__code" style="display:none">
135
+ <button class="ds-preview__copy">Copy</button>
136
+ <pre tabindex="0"><code>&lt;!DOCTYPE html&gt;
137
+ &lt;html lang="pt-BR"&gt;
138
+ &lt;head&gt;
139
+ &lt;meta charset="UTF-8"&gt;
140
+ &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
141
+ &lt;title&gt;Login&lt;/title&gt;
142
+ &lt;link rel="stylesheet" href="css/design-system.css"&gt;
143
+ &lt;style&gt;
144
+ *, *::before, *::after { box-sizing: border-box; }
145
+ body {
146
+ min-height: 100vh;
147
+ display: flex;
148
+ align-items: center;
149
+ justify-content: center;
150
+ background: var(--ds-background-subtle);
151
+ padding: var(--ds-dimension-40);
152
+ }
153
+ .login-card {
154
+ background: var(--ds-surface-default);
155
+ border-radius: var(--ds-radius-lg);
156
+ padding: var(--ds-dimension-40);
157
+ width: 100%;
158
+ max-width: 400px;
159
+ box-shadow: 0 8px 32px rgba(0, 0, 0, .08);
160
+ }
161
+ .login-logo {
162
+ width: 48px; height: 48px;
163
+ background: var(--ds-brand-background-default);
164
+ border-radius: var(--ds-radius-md);
165
+ display: inline-flex;
166
+ align-items: center;
167
+ justify-content: center;
168
+ }
169
+ .login-divider {
170
+ display: flex;
171
+ align-items: center;
172
+ gap: var(--ds-dimension-12);
173
+ margin: var(--ds-dimension-24) 0;
174
+ }
175
+ .login-divider span { flex: 1; height: 1px; background: var(--ds-border-default); }
176
+ &lt;/style&gt;
177
+ &lt;/head&gt;
178
+ &lt;body&gt;
179
+
180
+ &lt;div class="login-card"&gt;
181
+
182
+ &lt;div style="text-align:center;margin-bottom:var(--ds-dimension-32)"&gt;
183
+ &lt;div class="login-logo" style="margin:0 auto var(--ds-dimension-16)"&gt;
184
+ &lt;svg width="24" height="24" viewBox="0 0 24 24" fill="none" aria-hidden="true"&gt;
185
+ &lt;rect x="3" y="3" width="8" height="8" rx="1.5" fill="var(--ds-brand-content-default)"/&gt;
186
+ &lt;rect x="13" y="3" width="8" height="8" rx="1.5" fill="var(--ds-brand-content-default)" opacity=".55"/&gt;
187
+ &lt;rect x="3" y="13" width="8" height="8" rx="1.5" fill="var(--ds-brand-content-default)" opacity=".55"/&gt;
188
+ &lt;rect x="13" y="13" width="8" height="8" rx="1.5" fill="var(--ds-brand-content-default)"/&gt;
189
+ &lt;/svg&gt;
190
+ &lt;/div&gt;
191
+ &lt;h1 style="font-size:var(--ds-body-font-size-xl);font-weight:var(--ds-body-font-weight-bold);color:var(--ds-content-strong);margin:0 0 var(--ds-dimension-4)"&gt;Bem-vindo de volta&lt;/h1&gt;
192
+ &lt;p style="font-size:var(--ds-body-font-size-md);color:var(--ds-content-default);margin:0"&gt;Faça login para continuar&lt;/p&gt;
193
+ &lt;/div&gt;
194
+
195
+ &lt;form novalidate&gt;
196
+ &lt;div class="ds-field" style="margin-bottom:var(--ds-dimension-16)"&gt;
197
+ &lt;div class="ds-field__label-row"&gt;
198
+ &lt;label class="ds-field__label" for="email"&gt;E-mail&lt;/label&gt;
199
+ &lt;/div&gt;
200
+ &lt;div class="ds-input ds-input--lg"&gt;
201
+ &lt;input class="ds-input__field" type="email" id="email"
202
+ placeholder="seu@email.com" autocomplete="email" required&gt;
203
+ &lt;/div&gt;
204
+ &lt;/div&gt;
205
+
206
+ &lt;div class="ds-field" style="margin-bottom:var(--ds-dimension-8)"&gt;
207
+ &lt;div class="ds-field__label-row"&gt;
208
+ &lt;label class="ds-field__label" for="password"&gt;Senha&lt;/label&gt;
209
+ &lt;/div&gt;
210
+ &lt;div class="ds-input ds-input--lg"&gt;
211
+ &lt;input class="ds-input__field" type="password" id="password"
212
+ placeholder="••••••••" autocomplete="current-password" required&gt;
213
+ &lt;/div&gt;
214
+ &lt;/div&gt;
215
+
216
+ &lt;div style="text-align:right;margin-bottom:var(--ds-dimension-24)"&gt;
217
+ &lt;a class="ds-link" href="/forgot-password"
218
+ style="font-size:var(--ds-body-font-size-sm)"&gt;Esqueci minha senha&lt;/a&gt;
219
+ &lt;/div&gt;
220
+
221
+ &lt;button class="ds-button ds-button--brand ds-button--lg ds-button--full" type="submit"&gt;
222
+ &lt;span class="ds-button__label"&gt;Entrar&lt;/span&gt;
223
+ &lt;/button&gt;
224
+ &lt;/form&gt;
225
+
226
+ &lt;div class="login-divider"&gt;
227
+ &lt;span aria-hidden="true"&gt;&lt;/span&gt;
228
+ &lt;span style="font-size:var(--ds-body-font-size-sm);color:var(--ds-content-subtle)"&gt;ou&lt;/span&gt;
229
+ &lt;span aria-hidden="true"&gt;&lt;/span&gt;
230
+ &lt;/div&gt;
231
+
232
+ &lt;a class="ds-button ds-button--outline ds-button--lg ds-button--full" href="/signup"&gt;
233
+ &lt;span class="ds-button__label"&gt;Criar conta&lt;/span&gt;
234
+ &lt;/a&gt;
235
+
236
+ &lt;p style="text-align:center;font-size:var(--ds-body-font-size-xs);color:var(--ds-content-subtle);margin:var(--ds-dimension-24) 0 0"&gt;
237
+ Ao entrar, você concorda com os &lt;a class="ds-link" href="/terms"&gt;Termos de uso&lt;/a&gt;
238
+ &lt;/p&gt;
239
+
240
+ &lt;/div&gt;
241
+
242
+ &lt;/body&gt;
243
+ &lt;/html&gt;</code></pre>
244
+ </div>
245
+ </div>
246
+ </div>
247
+
248
+ <!-- 3. USAGE -->
249
+ <div class="ds-subsection">
250
+ <h2 class="ds-subsection__title"><span data-lang="pt">Notas de uso</span><span data-lang="en">Usage notes</span></h2>
251
+ <table class="ds-token-table">
252
+ <thead><tr><th><span data-lang="pt">Decisão</span><span data-lang="en">Decision</span></th><th><span data-lang="pt">Por quê</span><span data-lang="en">Why</span></th></tr></thead>
253
+ <tbody>
254
+ <tr><td><code>autocomplete="email"</code> e <code>autocomplete="current-password"</code></td><td><span data-lang="pt">Habilita preenchimento automático do gerenciador de senhas do browser — obrigatório por WCAG 1.3.5.</span><span data-lang="en">Enables browser/password-manager autofill — required by WCAG 1.3.5.</span></td></tr>
255
+ <tr><td><code>type="email"</code></td><td><span data-lang="pt">Abre teclado numérico/email no mobile e valida formato nativamente.</span><span data-lang="en">Opens numeric/email keyboard on mobile and validates format natively.</span></td></tr>
256
+ <tr><td><code>novalidate</code> no <code>&lt;form&gt;</code></td><td><span data-lang="pt">Desativa a validação nativa do browser para que você controle as mensagens de erro via DS Form Field.</span><span data-lang="en">Disables native browser validation so you control error messages via DS Form Field.</span></td></tr>
257
+ <tr><td><span data-lang="pt">Um único <code>ds-button--brand</code></span><span data-lang="en">Single <code>ds-button--brand</code></span></td><td><span data-lang="pt">Ação primária única por formulário. O botão de cadastro usa <code>--outline</code> para hierarquia clara.</span><span data-lang="en">Single primary action per form. Sign-up button uses <code>--outline</code> for clear hierarchy.</span></td></tr>
258
+ </tbody>
259
+ </table>
260
+ </div>
261
+
262
+ <!-- 4. RELATED -->
263
+ <div class="ds-subsection">
264
+ <h2 class="ds-subsection__title"><span data-lang="pt">Templates relacionados</span><span data-lang="en">Related templates</span></h2>
265
+ <div class="ds-related">
266
+ <a href="signup.html" class="ds-related__link"><span data-lang="pt">Cadastro</span><span data-lang="en">Sign Up</span></a>
267
+ <a href="index.html" class="ds-related__link"><span data-lang="pt">Ver todos os templates</span><span data-lang="en">All templates</span></a>
268
+ </div>
269
+ </div>
270
+
271
+ </main>
272
+
273
+ <script src="../../js/main.js"></script>
274
+ <script>
275
+ function openPreviewInNewTab() {
276
+ var code = document.querySelector('.ds-preview__code pre code').textContent;
277
+ var cssUrl = new URL('../../css/design-system.css', window.location.href).href;
278
+ var html = code.replace(/"css\/design-system\.css"/, '"' + cssUrl + '"');
279
+ var blob = new Blob([html], { type: 'text/html' });
280
+ var url = URL.createObjectURL(blob);
281
+ window.open(url, '_blank');
282
+ setTimeout(function() { URL.revokeObjectURL(url); }, 30000);
283
+ }
284
+ </script>
285
+ </body>
286
+ </html>