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,318 @@
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>Dashboard — 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">Dashboard</h1>
44
+ <p class="ds-section__subtitle">
45
+ <span data-lang="pt">Painel de controle com métricas em cards, abas de conteúdo, estado de carregamento via Skeleton e alert contextual. Base para produtos SaaS e apps de gestão.</span>
46
+ <span data-lang="en">Control panel with metric cards, content tabs, Skeleton loading state, and contextual alert. Foundation for SaaS products and management 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">Card</span>
50
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Tabs</span>
51
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Badge</span>
52
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Avatar</span>
53
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Skeleton</span>
54
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Alert</span>
55
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Button</span>
56
+ </div>
57
+ </div>
58
+
59
+ <!-- 2. PREVIEW -->
60
+ <div class="ds-subsection">
61
+ <h2 class="ds-subsection__title">Preview</h2>
62
+ <div class="ds-preview">
63
+ <div class="ds-preview__tabs">
64
+ <button class="ds-preview__tab ds-preview__tab--active" data-tab="preview">Preview</button>
65
+ <button class="ds-preview__tab" data-tab="code">Code</button>
66
+ <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>
67
+ </div>
68
+ <div class="ds-preview__canvas" style="padding:0;display:block">
69
+ <div style="background:var(--ds-background-subtle);padding:var(--ds-dimension-32);min-height:640px">
70
+
71
+ <!-- App header row -->
72
+ <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--ds-dimension-32)">
73
+ <div>
74
+ <h2 style="font-size:var(--ds-body-font-size-2xl);font-weight:var(--ds-body-font-weight-bold);color:var(--ds-content-strong);margin:0 0 var(--ds-dimension-4)">
75
+ <span data-lang="pt">Visão geral</span><span data-lang="en">Overview</span>
76
+ </h2>
77
+ <p style="font-size:var(--ds-body-font-size-sm);color:var(--ds-content-default);margin:0">
78
+ <span data-lang="pt">Período: últimos 30 dias</span><span data-lang="en">Period: last 30 days</span>
79
+ </p>
80
+ </div>
81
+ <div style="display:flex;align-items:center;gap:var(--ds-dimension-12)">
82
+ <button class="ds-button ds-button--outline ds-button--sm">
83
+ <span class="ds-button__label"><span data-lang="pt">Exportar</span><span data-lang="en">Export</span></span>
84
+ </button>
85
+ <div class="ds-avatar" aria-label="Ana Lima" title="Ana Lima">AL</div>
86
+ </div>
87
+ </div>
88
+
89
+ <!-- Alert -->
90
+ <div class="ds-alert ds-alert--info ds-alert--subtle" style="margin-bottom:var(--ds-dimension-24)" role="status">
91
+ <div class="ds-alert__content">
92
+ <p class="ds-alert__title">
93
+ <span data-lang="pt">Novo relatório disponível</span><span data-lang="en">New report available</span>
94
+ </p>
95
+ <span class="ds-alert__description">
96
+ <span data-lang="pt">O relatório mensal de maio foi gerado. <a class="ds-link" href="#">Ver relatório</a></span>
97
+ <span data-lang="en">The May monthly report has been generated. <a class="ds-link" href="#">View report</a></span>
98
+ </span>
99
+ </div>
100
+ </div>
101
+
102
+ <!-- Metric cards -->
103
+ <div style="display:grid;grid-template-columns:repeat(3,1fr);gap:var(--ds-dimension-16);margin-bottom:var(--ds-dimension-32)">
104
+
105
+ <div class="ds-card ds-card--outlined" style="padding:var(--ds-dimension-20)">
106
+ <p style="font-size:var(--ds-body-font-size-sm);color:var(--ds-content-default);margin:0 0 var(--ds-dimension-8)">
107
+ <span data-lang="pt">Receita total</span><span data-lang="en">Total revenue</span>
108
+ </p>
109
+ <p style="font-size:var(--ds-body-font-size-2xl);font-weight:var(--ds-body-font-weight-bold);color:var(--ds-content-strong);margin:0 0 var(--ds-dimension-8)">R$ 48.320</p>
110
+ <span class="ds-badge ds-badge--success ds-badge--subtle">
111
+ <span data-lang="pt">↑ 12% vs mês anterior</span><span data-lang="en">↑ 12% vs last month</span>
112
+ </span>
113
+ </div>
114
+
115
+ <div class="ds-card ds-card--outlined" style="padding:var(--ds-dimension-20)">
116
+ <p style="font-size:var(--ds-body-font-size-sm);color:var(--ds-content-default);margin:0 0 var(--ds-dimension-8)">
117
+ <span data-lang="pt">Novos clientes</span><span data-lang="en">New clients</span>
118
+ </p>
119
+ <p style="font-size:var(--ds-body-font-size-2xl);font-weight:var(--ds-body-font-weight-bold);color:var(--ds-content-strong);margin:0 0 var(--ds-dimension-8)">1.284</p>
120
+ <span class="ds-badge ds-badge--success ds-badge--subtle">
121
+ <span data-lang="pt">↑ 8% vs mês anterior</span><span data-lang="en">↑ 8% vs last month</span>
122
+ </span>
123
+ </div>
124
+
125
+ <div class="ds-card ds-card--outlined" style="padding:var(--ds-dimension-20)">
126
+ <p style="font-size:var(--ds-body-font-size-sm);color:var(--ds-content-default);margin:0 0 var(--ds-dimension-8)">
127
+ <span data-lang="pt">Taxa de churn</span><span data-lang="en">Churn rate</span>
128
+ </p>
129
+ <p style="font-size:var(--ds-body-font-size-2xl);font-weight:var(--ds-body-font-weight-bold);color:var(--ds-content-strong);margin:0 0 var(--ds-dimension-8)">2,4%</p>
130
+ <span class="ds-badge ds-badge--warning ds-badge--subtle">
131
+ <span data-lang="pt">↑ 0,3% vs mês anterior</span><span data-lang="en">↑ 0.3% vs last month</span>
132
+ </span>
133
+ </div>
134
+
135
+ </div>
136
+
137
+ <!-- Tabs + content -->
138
+ <div class="ds-card ds-card--outlined" style="padding:var(--ds-dimension-24)">
139
+ <div class="ds-tabs" role="tablist" aria-label="Dashboard sections" style="margin-bottom:var(--ds-dimension-24)">
140
+ <button class="ds-tab ds-tab--active" role="tab" aria-selected="true">
141
+ <span data-lang="pt">Transações</span><span data-lang="en">Transactions</span>
142
+ </button>
143
+ <button class="ds-tab" role="tab" aria-selected="false">
144
+ <span data-lang="pt">Clientes</span><span data-lang="en">Clients</span>
145
+ </button>
146
+ <button class="ds-tab" role="tab" aria-selected="false">
147
+ <span data-lang="pt">Produtos</span><span data-lang="en">Products</span>
148
+ </button>
149
+ </div>
150
+
151
+ <!-- Skeleton loading rows -->
152
+ <div style="display:flex;flex-direction:column;gap:var(--ds-dimension-12)">
153
+ <div style="display:flex;align-items:center;gap:var(--ds-dimension-12)">
154
+ <div class="ds-skeleton ds-skeleton--circle" style="width:32px;height:32px;flex-shrink:0"></div>
155
+ <div style="flex:1;display:flex;flex-direction:column;gap:var(--ds-dimension-6)">
156
+ <div class="ds-skeleton ds-skeleton--text" style="width:55%"></div>
157
+ <div class="ds-skeleton ds-skeleton--text" style="width:35%"></div>
158
+ </div>
159
+ <div class="ds-skeleton ds-skeleton--text" style="width:80px"></div>
160
+ </div>
161
+ <div style="display:flex;align-items:center;gap:var(--ds-dimension-12)">
162
+ <div class="ds-skeleton ds-skeleton--circle" style="width:32px;height:32px;flex-shrink:0"></div>
163
+ <div style="flex:1;display:flex;flex-direction:column;gap:var(--ds-dimension-6)">
164
+ <div class="ds-skeleton ds-skeleton--text" style="width:45%"></div>
165
+ <div class="ds-skeleton ds-skeleton--text" style="width:30%"></div>
166
+ </div>
167
+ <div class="ds-skeleton ds-skeleton--text" style="width:80px"></div>
168
+ </div>
169
+ <div style="display:flex;align-items:center;gap:var(--ds-dimension-12)">
170
+ <div class="ds-skeleton ds-skeleton--circle" style="width:32px;height:32px;flex-shrink:0"></div>
171
+ <div style="flex:1;display:flex;flex-direction:column;gap:var(--ds-dimension-6)">
172
+ <div class="ds-skeleton ds-skeleton--text" style="width:60%"></div>
173
+ <div class="ds-skeleton ds-skeleton--text" style="width:25%"></div>
174
+ </div>
175
+ <div class="ds-skeleton ds-skeleton--text" style="width:80px"></div>
176
+ </div>
177
+ <div style="display:flex;align-items:center;gap:var(--ds-dimension-12)">
178
+ <div class="ds-skeleton ds-skeleton--circle" style="width:32px;height:32px;flex-shrink:0"></div>
179
+ <div style="flex:1;display:flex;flex-direction:column;gap:var(--ds-dimension-6)">
180
+ <div class="ds-skeleton ds-skeleton--text" style="width:40%"></div>
181
+ <div class="ds-skeleton ds-skeleton--text" style="width:20%"></div>
182
+ </div>
183
+ <div class="ds-skeleton ds-skeleton--text" style="width:80px"></div>
184
+ </div>
185
+ </div>
186
+
187
+ </div>
188
+
189
+ </div>
190
+ </div>
191
+ <div class="ds-preview__code" style="display:none">
192
+ <button class="ds-preview__copy">Copy</button>
193
+ <pre tabindex="0"><code>&lt;!DOCTYPE html&gt;
194
+ &lt;html lang="pt-BR"&gt;
195
+ &lt;head&gt;
196
+ &lt;meta charset="UTF-8"&gt;
197
+ &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
198
+ &lt;title&gt;Dashboard&lt;/title&gt;
199
+ &lt;link rel="stylesheet" href="css/design-system.css"&gt;
200
+ &lt;style&gt;
201
+ *, *::before, *::after { box-sizing: border-box; }
202
+ body { background: var(--ds-background-subtle); min-height: 100vh; margin: 0; padding: var(--ds-dimension-32); }
203
+ .dash-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--ds-dimension-16); margin-bottom: var(--ds-dimension-32); }
204
+ .dash-row { display: flex; align-items: center; gap: var(--ds-dimension-12); margin-bottom: var(--ds-dimension-12); }
205
+ .dash-row-meta { flex: 1; display: flex; flex-direction: column; gap: var(--ds-dimension-6); }
206
+ @media (max-width: 768px) { .dash-grid { grid-template-columns: 1fr; } }
207
+ &lt;/style&gt;
208
+ &lt;/head&gt;
209
+ &lt;body&gt;
210
+
211
+ &lt;!-- App header --&gt;
212
+ &lt;div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--ds-dimension-32)"&gt;
213
+ &lt;div&gt;
214
+ &lt;h1 style="font-size:var(--ds-body-font-size-2xl);font-weight:var(--ds-body-font-weight-bold);color:var(--ds-content-strong);margin:0 0 var(--ds-dimension-4)"&gt;Visão geral&lt;/h1&gt;
215
+ &lt;p style="font-size:var(--ds-body-font-size-sm);color:var(--ds-content-default);margin:0"&gt;Período: últimos 30 dias&lt;/p&gt;
216
+ &lt;/div&gt;
217
+ &lt;div style="display:flex;align-items:center;gap:var(--ds-dimension-12)"&gt;
218
+ &lt;button class="ds-button ds-button--outline ds-button--sm"&gt;
219
+ &lt;span class="ds-button__label"&gt;Exportar&lt;/span&gt;
220
+ &lt;/button&gt;
221
+ &lt;div class="ds-avatar" aria-label="Ana Lima" title="Ana Lima"&gt;AL&lt;/div&gt;
222
+ &lt;/div&gt;
223
+ &lt;/div&gt;
224
+
225
+ &lt;!-- Alert --&gt;
226
+ &lt;div class="ds-alert ds-alert--info ds-alert--subtle" style="margin-bottom:var(--ds-dimension-24)" role="status"&gt;
227
+ &lt;div class="ds-alert__content"&gt;
228
+ &lt;p class="ds-alert__title"&gt;Novo relatório disponível&lt;/p&gt;
229
+ &lt;span class="ds-alert__description"&gt;O relatório mensal de maio foi gerado. &lt;a class="ds-link" href="#"&gt;Ver relatório&lt;/a&gt;&lt;/span&gt;
230
+ &lt;/div&gt;
231
+ &lt;/div&gt;
232
+
233
+ &lt;!-- Metric cards --&gt;
234
+ &lt;div class="dash-grid"&gt;
235
+ &lt;div class="ds-card ds-card--outlined" style="padding:var(--ds-dimension-20)"&gt;
236
+ &lt;p style="font-size:var(--ds-body-font-size-sm);color:var(--ds-content-default);margin:0 0 var(--ds-dimension-8)"&gt;Receita total&lt;/p&gt;
237
+ &lt;p style="font-size:var(--ds-body-font-size-2xl);font-weight:var(--ds-body-font-weight-bold);color:var(--ds-content-strong);margin:0 0 var(--ds-dimension-8)"&gt;R$ 48.320&lt;/p&gt;
238
+ &lt;span class="ds-badge ds-badge--success ds-badge--subtle"&gt;↑ 12% vs mês anterior&lt;/span&gt;
239
+ &lt;/div&gt;
240
+ &lt;div class="ds-card ds-card--outlined" style="padding:var(--ds-dimension-20)"&gt;
241
+ &lt;p style="font-size:var(--ds-body-font-size-sm);color:var(--ds-content-default);margin:0 0 var(--ds-dimension-8)"&gt;Novos clientes&lt;/p&gt;
242
+ &lt;p style="font-size:var(--ds-body-font-size-2xl);font-weight:var(--ds-body-font-weight-bold);color:var(--ds-content-strong);margin:0 0 var(--ds-dimension-8)"&gt;1.284&lt;/p&gt;
243
+ &lt;span class="ds-badge ds-badge--success ds-badge--subtle"&gt;↑ 8% vs mês anterior&lt;/span&gt;
244
+ &lt;/div&gt;
245
+ &lt;div class="ds-card ds-card--outlined" style="padding:var(--ds-dimension-20)"&gt;
246
+ &lt;p style="font-size:var(--ds-body-font-size-sm);color:var(--ds-content-default);margin:0 0 var(--ds-dimension-8)"&gt;Taxa de churn&lt;/p&gt;
247
+ &lt;p style="font-size:var(--ds-body-font-size-2xl);font-weight:var(--ds-body-font-weight-bold);color:var(--ds-content-strong);margin:0 0 var(--ds-dimension-8)"&gt;2,4%&lt;/p&gt;
248
+ &lt;span class="ds-badge ds-badge--warning ds-badge--subtle"&gt;↑ 0,3% vs mês anterior&lt;/span&gt;
249
+ &lt;/div&gt;
250
+ &lt;/div&gt;
251
+
252
+ &lt;!-- Table card with tabs --&gt;
253
+ &lt;div class="ds-card ds-card--outlined" style="padding:var(--ds-dimension-24)"&gt;
254
+ &lt;div class="ds-tabs" role="tablist" aria-label="Dashboard sections" style="margin-bottom:var(--ds-dimension-24)"&gt;
255
+ &lt;button class="ds-tab ds-tab--active" role="tab" aria-selected="true" id="tab-tx" aria-controls="panel-tx"&gt;Transações&lt;/button&gt;
256
+ &lt;button class="ds-tab" role="tab" aria-selected="false" id="tab-cl" aria-controls="panel-cl"&gt;Clientes&lt;/button&gt;
257
+ &lt;button class="ds-tab" role="tab" aria-selected="false" id="tab-pr" aria-controls="panel-pr"&gt;Produtos&lt;/button&gt;
258
+ &lt;/div&gt;
259
+
260
+ &lt;!-- Replace skeleton rows with real data once loaded --&gt;
261
+ &lt;div id="panel-tx" role="tabpanel" aria-labelledby="tab-tx"&gt;
262
+ &lt;div class="dash-row"&gt;
263
+ &lt;div class="ds-skeleton ds-skeleton--circle" style="width:32px;height:32px;flex-shrink:0"&gt;&lt;/div&gt;
264
+ &lt;div class="dash-row-meta"&gt;
265
+ &lt;div class="ds-skeleton ds-skeleton--text" style="width:55%"&gt;&lt;/div&gt;
266
+ &lt;div class="ds-skeleton ds-skeleton--text" style="width:35%"&gt;&lt;/div&gt;
267
+ &lt;/div&gt;
268
+ &lt;div class="ds-skeleton ds-skeleton--text" style="width:80px"&gt;&lt;/div&gt;
269
+ &lt;/div&gt;
270
+ &lt;!-- Repeat rows as needed --&gt;
271
+ &lt;/div&gt;
272
+ &lt;/div&gt;
273
+
274
+ &lt;/body&gt;
275
+ &lt;/html&gt;</code></pre>
276
+ </div>
277
+ </div>
278
+ </div>
279
+
280
+ <!-- 3. USAGE -->
281
+ <div class="ds-subsection">
282
+ <h2 class="ds-subsection__title"><span data-lang="pt">Notas de uso</span><span data-lang="en">Usage notes</span></h2>
283
+ <table class="ds-token-table">
284
+ <thead><tr><th><span data-lang="pt">Padrão</span><span data-lang="en">Pattern</span></th><th><span data-lang="pt">Decisão</span><span data-lang="en">Decision</span></th></tr></thead>
285
+ <tbody>
286
+ <tr><td>Skeleton <span data-lang="pt">como estado inicial</span><span data-lang="en">as initial state</span></td><td><span data-lang="pt">Substitua as linhas de Skeleton pelos dados reais ao receber a resposta da API. Skeleton evita layout shift (CLS) e comunica que há conteúdo chegando.</span><span data-lang="en">Replace Skeleton rows with real data once the API responds. Skeleton prevents layout shift (CLS) and communicates that content is incoming.</span></td></tr>
287
+ <tr><td><code>ds-card--outlined</code></td><td><span data-lang="pt">Cards de métrica usam <code>--outlined</code> (borda, sem sombra) pois estão sobre fundo sutil — sombra acumularia visualmente.</span><span data-lang="en">Metric cards use <code>--outlined</code> (border, no shadow) since they sit on a subtle background — shadows would stack visually.</span></td></tr>
288
+ <tr><td><code>ds-badge--success/warning</code></td><td><span data-lang="pt">Cor semântica comunica variação positiva/negativa sem depender só de ícone ou texto — atende WCAG 1.4.1 (uso de cor).</span><span data-lang="en">Semantic color communicates positive/negative variation without relying solely on icon or text — meets WCAG 1.4.1 (use of color).</span></td></tr>
289
+ <tr><td>Grid <span data-lang="pt">responsivo</span><span data-lang="en">responsive</span></td><td><span data-lang="pt">Colapse de 3 para 1 coluna via media query no mobile — os cards de métrica são igualmente importantes em telas pequenas.</span><span data-lang="en">Collapse from 3 to 1 column via media query on mobile — metric cards are equally important on small screens.</span></td></tr>
290
+ </tbody>
291
+ </table>
292
+ </div>
293
+
294
+ <!-- 4. RELATED -->
295
+ <div class="ds-subsection">
296
+ <h2 class="ds-subsection__title"><span data-lang="pt">Templates relacionados</span><span data-lang="en">Related templates</span></h2>
297
+ <div class="ds-related">
298
+ <a href="settings.html" class="ds-related__link"><span data-lang="pt">Configurações</span><span data-lang="en">Settings</span></a>
299
+ <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>
300
+ </div>
301
+ </div>
302
+
303
+ </main>
304
+
305
+ <script src="../../js/main.js"></script>
306
+ <script>
307
+ function openPreviewInNewTab() {
308
+ var code = document.querySelector('.ds-preview__code pre code').textContent;
309
+ var cssUrl = new URL('../../css/design-system.css', window.location.href).href;
310
+ var html = code.replace(/"css\/design-system\.css"/, '"' + cssUrl + '"');
311
+ var blob = new Blob([html], { type: 'text/html' });
312
+ var url = URL.createObjectURL(blob);
313
+ window.open(url, '_blank');
314
+ setTimeout(function() { URL.revokeObjectURL(url); }, 30000);
315
+ }
316
+ </script>
317
+ </body>
318
+ </html>
@@ -0,0 +1,232 @@
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>Templates — 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
+ <style>
13
+ .ds-template-grid {
14
+ display: grid;
15
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
16
+ gap: var(--ds-dimension-20);
17
+ }
18
+ .ds-template-card {
19
+ border: var(--ds-border-width-1) solid var(--ds-border-default);
20
+ border-radius: var(--ds-radius-8);
21
+ background: var(--ds-surface-default);
22
+ display: flex;
23
+ flex-direction: column;
24
+ overflow: hidden;
25
+ }
26
+ .ds-template-card__body {
27
+ padding: var(--ds-dimension-20);
28
+ display: flex;
29
+ flex-direction: column;
30
+ gap: var(--ds-dimension-8);
31
+ flex: 1;
32
+ }
33
+ .ds-template-card__title {
34
+ font-size: var(--ds-font-size-16);
35
+ font-weight: var(--ds-font-weight-semibold);
36
+ color: var(--ds-content-strong);
37
+ margin: 0;
38
+ }
39
+ .ds-template-card__desc {
40
+ font-size: var(--ds-font-size-14);
41
+ color: var(--ds-content-default);
42
+ margin: 0;
43
+ line-height: var(--ds-line-height-relaxed);
44
+ }
45
+ .ds-template-card__tags {
46
+ display: flex;
47
+ flex-wrap: wrap;
48
+ gap: var(--ds-dimension-4);
49
+ }
50
+ .ds-template-card__cta {
51
+ margin-top: auto;
52
+ padding-top: var(--ds-dimension-12);
53
+ display: flex;
54
+ gap: var(--ds-dimension-8);
55
+ align-items: center;
56
+ }
57
+ </style>
58
+ </head>
59
+ <body>
60
+
61
+ <header class="ds-site-header">
62
+ <div style="display:flex;align-items:center;gap:var(--ds-dimension-16)">
63
+ <button class="ds-menu-toggle" id="menu-toggle" aria-label="Toggle navigation" aria-expanded="false">
64
+ <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>
65
+ </button>
66
+ <a href="../../index.html" class="ds-site-header__brand" aria-label="TIS Design System">
67
+ <img class="ds-site-header__logo" src="../assets/logo-tis-mark.svg" alt="TIS" width="36" height="36">
68
+ <span class="ds-site-header__title ds-site-header__title--brand">TIS</span>
69
+ <span class="ds-site-header__brand-separator" aria-hidden="true"></span>
70
+ <span class="ds-site-header__title ds-site-header__title--product">Design System</span>
71
+ </a>
72
+ </div>
73
+ <div class="ds-site-header__actions">
74
+ <select class="ds-theme-switcher__select" id="lang-switcher" aria-label="Language">
75
+ <option value="pt">PT</option>
76
+ <option value="en">EN</option>
77
+ </select>
78
+ <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>
79
+ </div>
80
+ </header>
81
+ <div class="ds-sidebar-overlay" id="sidebar-overlay"></div>
82
+
83
+ <nav class="ds-sidebar" id="sidebar" aria-label="Main navigation"></nav>
84
+
85
+ <main class="ds-main">
86
+
87
+ <div class="ds-section">
88
+ <h1 class="ds-section__title"><span data-lang="pt">Galeria de Templates</span><span data-lang="en">Template Gallery</span></h1>
89
+ <p class="ds-section__subtitle">
90
+ <span data-lang="pt">Páginas completas construídas exclusivamente com componentes e tokens do Design System Core. Copie, adapte e implemente em minutos.</span>
91
+ <span data-lang="en">Complete pages built exclusively with Design System Core components and tokens. Copy, adapt, and ship in minutes.</span>
92
+ </p>
93
+ </div>
94
+
95
+ <div class="ds-subsection">
96
+ <div class="ds-callout ds-callout--info">
97
+ <div class="ds-callout__title"><span data-lang="pt">Como usar</span><span data-lang="en">How to use</span></div>
98
+ <span data-lang="pt">Cada template é uma página HTML autocontida que importa apenas <code>css/design-system.css</code>. Abra a aba <strong>Código</strong> em qualquer template, copie o HTML e hospede com os assets do DS.</span>
99
+ <span data-lang="en">Each template is a self-contained HTML page that only imports <code>css/design-system.css</code>. Open the <strong>Code</strong> tab in any template, copy the HTML, and host it with the DS assets.</span>
100
+ </div>
101
+ </div>
102
+
103
+ <div class="ds-subsection">
104
+ <div class="ds-template-grid">
105
+
106
+ <!-- Login -->
107
+ <div class="ds-template-card">
108
+ <div class="ds-template-card__body">
109
+ <h3 class="ds-template-card__title"><span data-lang="pt">Login</span><span data-lang="en">Login</span></h3>
110
+ <p class="ds-template-card__desc">
111
+ <span data-lang="pt">Autenticação com email e senha, link de recuperação e acesso ao cadastro.</span>
112
+ <span data-lang="en">Email and password authentication with recovery link and sign-up access.</span>
113
+ </p>
114
+ <div class="ds-template-card__tags">
115
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Input</span>
116
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Button</span>
117
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Form Field</span>
118
+ </div>
119
+ <div class="ds-template-card__cta">
120
+ <a class="ds-button ds-button--brand ds-button--sm" href="login.html"><span class="ds-button__label"><span data-lang="pt">Documentação</span><span data-lang="en">Documentation</span></span></a>
121
+ <button type="button" class="ds-button ds-button--ghost ds-button--sm" onclick="openTemplate('login.html')"><span class="ds-button__label"><span data-lang="pt">Template</span><span data-lang="en">Template</span></span><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></button>
122
+ </div>
123
+ </div>
124
+ </div>
125
+
126
+ <!-- Sign Up -->
127
+ <div class="ds-template-card">
128
+ <div class="ds-template-card__body">
129
+ <h3 class="ds-template-card__title"><span data-lang="pt">Cadastro</span><span data-lang="en">Sign Up</span></h3>
130
+ <p class="ds-template-card__desc">
131
+ <span data-lang="pt">Criação de conta com validação em linha, aceite de termos e feedback de erro.</span>
132
+ <span data-lang="en">Account creation with inline validation, terms acceptance, and error feedback.</span>
133
+ </p>
134
+ <div class="ds-template-card__tags">
135
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Input</span>
136
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Select</span>
137
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Checkbox</span>
138
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Alert</span>
139
+ </div>
140
+ <div class="ds-template-card__cta">
141
+ <a class="ds-button ds-button--brand ds-button--sm" href="signup.html"><span class="ds-button__label"><span data-lang="pt">Documentação</span><span data-lang="en">Documentation</span></span></a>
142
+ <button type="button" class="ds-button ds-button--ghost ds-button--sm" onclick="openTemplate('signup.html')"><span class="ds-button__label"><span data-lang="pt">Template</span><span data-lang="en">Template</span></span><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></button>
143
+ </div>
144
+ </div>
145
+ </div>
146
+
147
+ <!-- Dashboard -->
148
+ <div class="ds-template-card">
149
+ <div class="ds-template-card__body">
150
+ <h3 class="ds-template-card__title">Dashboard</h3>
151
+ <p class="ds-template-card__desc">
152
+ <span data-lang="pt">Painel com métricas, abas de conteúdo e estado de carregamento com Skeleton.</span>
153
+ <span data-lang="en">Panel with metrics, content tabs, and Skeleton loading state.</span>
154
+ </p>
155
+ <div class="ds-template-card__tags">
156
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Card</span>
157
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Tabs</span>
158
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Badge</span>
159
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Skeleton</span>
160
+ </div>
161
+ <div class="ds-template-card__cta">
162
+ <a class="ds-button ds-button--brand ds-button--sm" href="dashboard.html"><span class="ds-button__label"><span data-lang="pt">Documentação</span><span data-lang="en">Documentation</span></span></a>
163
+ <button type="button" class="ds-button ds-button--ghost ds-button--sm" onclick="openTemplate('dashboard.html')"><span class="ds-button__label"><span data-lang="pt">Template</span><span data-lang="en">Template</span></span><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></button>
164
+ </div>
165
+ </div>
166
+ </div>
167
+
168
+ <!-- Settings -->
169
+ <div class="ds-template-card">
170
+ <div class="ds-template-card__body">
171
+ <h3 class="ds-template-card__title"><span data-lang="pt">Configurações</span><span data-lang="en">Settings</span></h3>
172
+ <p class="ds-template-card__desc">
173
+ <span data-lang="pt">Página de preferências com abas, campos de perfil e toggles de notificação.</span>
174
+ <span data-lang="en">Preferences page with tabs, profile fields, and notification toggles.</span>
175
+ </p>
176
+ <div class="ds-template-card__tags">
177
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Tabs</span>
178
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Toggle</span>
179
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Input</span>
180
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Avatar</span>
181
+ </div>
182
+ <div class="ds-template-card__cta">
183
+ <a class="ds-button ds-button--brand ds-button--sm" href="settings.html"><span class="ds-button__label"><span data-lang="pt">Documentação</span><span data-lang="en">Documentation</span></span></a>
184
+ <button type="button" class="ds-button ds-button--ghost ds-button--sm" onclick="openTemplate('settings.html')"><span class="ds-button__label"><span data-lang="pt">Template</span><span data-lang="en">Template</span></span><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></button>
185
+ </div>
186
+ </div>
187
+ </div>
188
+
189
+ <!-- Contact -->
190
+ <div class="ds-template-card">
191
+ <div class="ds-template-card__body">
192
+ <h3 class="ds-template-card__title"><span data-lang="pt">Contato</span><span data-lang="en">Contact</span></h3>
193
+ <p class="ds-template-card__desc">
194
+ <span data-lang="pt">Formulário completo com seleção de assunto, validação e confirmação de envio.</span>
195
+ <span data-lang="en">Complete form with subject selection, validation, and submission confirmation.</span>
196
+ </p>
197
+ <div class="ds-template-card__tags">
198
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Input</span>
199
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Textarea</span>
200
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Select</span>
201
+ <span class="ds-badge ds-badge--neutral ds-badge--subtle">Radio</span>
202
+ </div>
203
+ <div class="ds-template-card__cta">
204
+ <a class="ds-button ds-button--brand ds-button--sm" href="contact.html"><span class="ds-button__label"><span data-lang="pt">Documentação</span><span data-lang="en">Documentation</span></span></a>
205
+ <button type="button" class="ds-button ds-button--ghost ds-button--sm" onclick="openTemplate('contact.html')"><span class="ds-button__label"><span data-lang="pt">Template</span><span data-lang="en">Template</span></span><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></button>
206
+ </div>
207
+ </div>
208
+ </div>
209
+
210
+ </div>
211
+ </div>
212
+
213
+ </main>
214
+
215
+ <script src="../../js/main.js"></script>
216
+ <script>
217
+ async function openTemplate(url) {
218
+ var resp = await fetch(url);
219
+ var html = await resp.text();
220
+ var parser = new DOMParser();
221
+ var doc = parser.parseFromString(html, 'text/html');
222
+ var code = doc.querySelector('.ds-preview__code pre code').textContent;
223
+ var cssUrl = new URL('../../css/design-system.css', window.location.href).href;
224
+ var resolved = code.replace(/"css\/design-system\.css"/, '"' + cssUrl + '"');
225
+ var blob = new Blob([resolved], { type: 'text/html' });
226
+ var blobUrl = URL.createObjectURL(blob);
227
+ window.open(blobUrl, '_blank');
228
+ setTimeout(function() { URL.revokeObjectURL(blobUrl); }, 30000);
229
+ }
230
+ </script>
231
+ </body>
232
+ </html>