@xetwa/design-system 1.0.2

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 (168) hide show
  1. package/.github/workflows/publish.yml +30 -0
  2. package/.storybook/main.ts +17 -0
  3. package/.storybook/preview.tsx +65 -0
  4. package/eslint.config.js +22 -0
  5. package/index.html +13 -0
  6. package/package.json +55 -0
  7. package/public/favicon.svg +1 -0
  8. package/public/icons.svg +24 -0
  9. package/src/App.css +184 -0
  10. package/src/App.tsx +122 -0
  11. package/src/BordasSombras.mdx +343 -0
  12. package/src/Colors.mdx +393 -0
  13. package/src/GrelhaLayout.mdx +375 -0
  14. package/src/Icons.mdx +42 -0
  15. package/src/MovimentoBreakpoints.mdx +379 -0
  16. package/src/Spacing.mdx +231 -0
  17. package/src/Typography.mdx +321 -0
  18. package/src/assets/Mascots/vava/estaticos/vava-acenar.svg +3 -0
  19. package/src/assets/Mascots/vava/estaticos/vava-acertou.svg +3 -0
  20. package/src/assets/Mascots/vava/estaticos/vava-celebrar.svg +3 -0
  21. package/src/assets/Mascots/vava/estaticos/vava-com-autocolantes.svg +3 -0
  22. package/src/assets/Mascots/vava/estaticos/vava-dormir.svg +3 -0
  23. package/src/assets/Mascots/vava/estaticos/vava-errou.svg +3 -0
  24. package/src/assets/Mascots/vava/estaticos/vava-feliz.svg +3 -0
  25. package/src/assets/Mascots/vava/estaticos/vava-neutra.svg +3 -0
  26. package/src/assets/Mascots/vava/estaticos/vava-original.svg +3 -0
  27. package/src/assets/Mascots/vava/estaticos/vava-pensar.svg +3 -0
  28. package/src/assets/Mascots/vava/estaticos/vava-surpresa.svg +3 -0
  29. package/src/assets/Mascots/yaya/avatar/yaya-avatar-falar.svg +7 -0
  30. package/src/assets/Mascots/yaya/avatar/yaya-avatar-feliz.svg +7 -0
  31. package/src/assets/Mascots/yaya/avatar/yaya-avatar-transparente.svg +6 -0
  32. package/src/assets/Mascots/yaya/estaticos/yaya-acertou.svg +13 -0
  33. package/src/assets/Mascots/yaya/estaticos/yaya-celebrar.svg +13 -0
  34. package/src/assets/Mascots/yaya/estaticos/yaya-dormir.svg +13 -0
  35. package/src/assets/Mascots/yaya/estaticos/yaya-errou.svg +13 -0
  36. package/src/assets/Mascots/yaya/estaticos/yaya-falar.svg +13 -0
  37. package/src/assets/Mascots/yaya/estaticos/yaya-feliz.svg +13 -0
  38. package/src/assets/Mascots/yaya/estaticos/yaya-neutra.svg +13 -0
  39. package/src/assets/Mascots/yaya/estaticos/yaya-pensar.svg +13 -0
  40. package/src/assets/Mascots/yaya/estaticos/yaya-surpresa.svg +13 -0
  41. package/src/assets/hero.png +0 -0
  42. package/src/assets/react.svg +1 -0
  43. package/src/assets/vite.svg +1 -0
  44. package/src/components/Buttons/BackButton/BackButton.stories.tsx +86 -0
  45. package/src/components/Buttons/BackButton/BackButton.tsx +107 -0
  46. package/src/components/Buttons/FabButton/FabButton.stories.tsx +74 -0
  47. package/src/components/Buttons/FabButton/FabButton.tsx +161 -0
  48. package/src/components/Buttons/IconButton/IconButton.stories.tsx +99 -0
  49. package/src/components/Buttons/IconButton/IconButton.tsx +189 -0
  50. package/src/components/Buttons/JourneyButton/JourneyButton.stories.tsx +80 -0
  51. package/src/components/Buttons/JourneyButton/JourneyButton.tsx +194 -0
  52. package/src/components/Buttons/MainButton/MainButton.stories.tsx +144 -0
  53. package/src/components/Buttons/MainButton/MainButton.tsx +258 -0
  54. package/src/components/Buttons/WordChip/WordChip.stories.tsx +84 -0
  55. package/src/components/Buttons/WordChip/WordChip.tsx +157 -0
  56. package/src/components/Buttons/WordChip/index.ts +1 -0
  57. package/src/components/Cards/AnswerOptionCard/AnswerOptionCard.stories.tsx +181 -0
  58. package/src/components/Cards/AnswerOptionCard/AnswerOptionCard.tsx +201 -0
  59. package/src/components/Cards/BaseCard/BaseCard.stories.tsx +148 -0
  60. package/src/components/Cards/BaseCard/BaseCard.tsx +181 -0
  61. package/src/components/Cards/BoardingPassCard/BoardingPassCard.stories.tsx +205 -0
  62. package/src/components/Cards/BoardingPassCard/BoardingPassCard.tsx +384 -0
  63. package/src/components/Cards/BoardingPassCard/FlightIcon.tsx +21 -0
  64. package/src/components/Cards/BoardingPassCard/FlightIcon.web.tsx +18 -0
  65. package/src/components/Cards/CountryCard/CountryCard.stories.tsx +97 -0
  66. package/src/components/Cards/CountryCard/CountryCard.tsx +185 -0
  67. package/src/components/Cards/LevelProgressCard/LevelProgressCard.stories.tsx +61 -0
  68. package/src/components/Cards/LevelProgressCard/LevelProgressCard.tsx +143 -0
  69. package/src/components/Cards/ModuleCard/ModuleCard.stories.tsx +108 -0
  70. package/src/components/Cards/ModuleCard/ModuleCard.tsx +304 -0
  71. package/src/components/Cards/ModuleCompletionCard/ModuleCompletionCard.stories.tsx +53 -0
  72. package/src/components/Cards/ModuleCompletionCard/ModuleCompletionCard.tsx +167 -0
  73. package/src/components/Cards/Passport/PassportCover.tsx +114 -0
  74. package/src/components/Cards/Passport/PassportIDPage.tsx +217 -0
  75. package/src/components/Cards/Passport/PassportStampPage.tsx +253 -0
  76. package/src/components/Cards/Passport/PassportViewer.stories.tsx +95 -0
  77. package/src/components/Cards/Passport/PassportViewer.tsx +328 -0
  78. package/src/components/Cards/PlanCard/PlanCard.stories.tsx +159 -0
  79. package/src/components/Cards/PlanCard/PlanCard.tsx +317 -0
  80. package/src/components/Cards/PricingCard/PricingCard.stories.tsx +83 -0
  81. package/src/components/Cards/PricingCard/PricingCard.tsx +144 -0
  82. package/src/components/Cards/SelectionCard/SelectionCard.stories.tsx +77 -0
  83. package/src/components/Cards/SelectionCard/SelectionCard.tsx +111 -0
  84. package/src/components/Cards/TeacherCard/TeacherCard.stories.tsx +126 -0
  85. package/src/components/Cards/TeacherCard/TeacherCard.tsx +236 -0
  86. package/src/components/Charts/WeeklyProgressChart/WeeklyProgressChart.stories.tsx +89 -0
  87. package/src/components/Charts/WeeklyProgressChart/WeeklyProgressChart.tsx +179 -0
  88. package/src/components/Charts/WeeklyProgressChart/index.ts +1 -0
  89. package/src/components/DataDisplay/Avatar/Avatar.stories.tsx +85 -0
  90. package/src/components/DataDisplay/Avatar/Avatar.tsx +118 -0
  91. package/src/components/DataDisplay/Avatar/index.ts +1 -0
  92. package/src/components/DataDisplay/Badge/Badge.stories.tsx +62 -0
  93. package/src/components/DataDisplay/Badge/Badge.tsx +146 -0
  94. package/src/components/DataDisplay/Flag/Flag.stories.tsx +98 -0
  95. package/src/components/DataDisplay/Flag/Flag.tsx +347 -0
  96. package/src/components/DataDisplay/Flag/Flag.web.tsx +334 -0
  97. package/src/components/DataDisplay/InstructionBubble/InstructionBubble.stories.tsx +80 -0
  98. package/src/components/DataDisplay/InstructionBubble/InstructionBubble.tsx +86 -0
  99. package/src/components/DataDisplay/LevelBadge/LevelBadge.stories.tsx +99 -0
  100. package/src/components/DataDisplay/LevelBadge/LevelBadge.tsx +118 -0
  101. package/src/components/DataDisplay/ProgressBar/ProgressBar.stories.tsx +95 -0
  102. package/src/components/DataDisplay/ProgressBar/ProgressBar.tsx +117 -0
  103. package/src/components/DataDisplay/StatBadge/StatBadge.stories.tsx +82 -0
  104. package/src/components/DataDisplay/StatBadge/StatBadge.tsx +135 -0
  105. package/src/components/DataDisplay/StatBadge/index.ts +1 -0
  106. package/src/components/DataDisplay/Tag/Tag.stories.tsx +63 -0
  107. package/src/components/DataDisplay/Tag/Tag.tsx +148 -0
  108. package/src/components/Feedback/FeedbackBottomSheet/FeedbackBottomSheet.stories.tsx +74 -0
  109. package/src/components/Feedback/FeedbackBottomSheet/FeedbackBottomSheet.tsx +200 -0
  110. package/src/components/Forms/Checkbox/Checkbox.stories.tsx +60 -0
  111. package/src/components/Forms/Checkbox/Checkbox.tsx +127 -0
  112. package/src/components/Forms/Checkbox/index.ts +1 -0
  113. package/src/components/Forms/DaySelector/DaySelector.stories.tsx +62 -0
  114. package/src/components/Forms/DaySelector/DaySelector.tsx +133 -0
  115. package/src/components/Forms/Radio/Radio.stories.tsx +61 -0
  116. package/src/components/Forms/Radio/Radio.tsx +141 -0
  117. package/src/components/Forms/Radio/index.ts +1 -0
  118. package/src/components/Forms/SegmentedToggle/SegmentedToggle.stories.tsx +67 -0
  119. package/src/components/Forms/SegmentedToggle/SegmentedToggle.tsx +150 -0
  120. package/src/components/Forms/SegmentedToggle/index.ts +1 -0
  121. package/src/components/Forms/Select/Select.stories.tsx +59 -0
  122. package/src/components/Forms/Select/Select.tsx +255 -0
  123. package/src/components/Forms/Select/index.ts +1 -0
  124. package/src/components/Forms/Switch/Switch.stories.tsx +57 -0
  125. package/src/components/Forms/Switch/Switch.tsx +120 -0
  126. package/src/components/Forms/Switch/index.ts +1 -0
  127. package/src/components/Forms/TimeSlot/TimeSlot.stories.tsx +62 -0
  128. package/src/components/Forms/TimeSlot/TimeSlot.tsx +116 -0
  129. package/src/components/Headers/CountryHeader/CountryHeader.stories.tsx +114 -0
  130. package/src/components/Headers/CountryHeader/CountryHeader.tsx +147 -0
  131. package/src/components/Headers/ProfileHeader/ProfileHeader.stories.tsx +141 -0
  132. package/src/components/Headers/ProfileHeader/ProfileHeader.tsx +233 -0
  133. package/src/components/Inputs/FillInTheBlank/FillInTheBlank.stories.tsx +333 -0
  134. package/src/components/Inputs/FillInTheBlank/FillInTheBlank.tsx +287 -0
  135. package/src/components/Inputs/FillInTheBlank/index.ts +1 -0
  136. package/src/components/Inputs/TextInput/TextInput.stories.tsx +103 -0
  137. package/src/components/Inputs/TextInput/TextInput.tsx +187 -0
  138. package/src/components/Mascots/Vava/Vava.stories.tsx +114 -0
  139. package/src/components/Mascots/Vava/Vava.tsx +276 -0
  140. package/src/components/Mascots/Yaya/Yaya.stories.tsx +98 -0
  141. package/src/components/Mascots/Yaya/Yaya.tsx +233 -0
  142. package/src/components/Navigation/BottomTabBar/BottomTabBar.stories.tsx +68 -0
  143. package/src/components/Navigation/BottomTabBar/BottomTabBar.tsx +85 -0
  144. package/src/components/Navigation/BottomTabBar/BottomTabBarItem.tsx +68 -0
  145. package/src/components/Navigation/BottomTabBar/index.ts +2 -0
  146. package/src/components/Navigation/PaginationDots/PaginationDots.stories.tsx +62 -0
  147. package/src/components/Navigation/PaginationDots/PaginationDots.tsx +81 -0
  148. package/src/components/Navigation/PaginationDots/index.ts +1 -0
  149. package/src/components/Navigation/ProgressMap/ProgressMap.stories.tsx +116 -0
  150. package/src/components/Navigation/ProgressMap/ProgressMap.tsx +827 -0
  151. package/src/components/Navigation/WorldProgressMap/WorldProgressMap.stories.tsx +169 -0
  152. package/src/components/Navigation/WorldProgressMap/WorldProgressMap.tsx +790 -0
  153. package/src/components/Typography/Typography.stories.tsx +127 -0
  154. package/src/components/Typography/Typography.tsx +53 -0
  155. package/src/hooks/useResponsive.ts +41 -0
  156. package/src/hooks/useTheme.ts +32 -0
  157. package/src/index.css +355 -0
  158. package/src/index.ts +28 -0
  159. package/src/main.tsx +10 -0
  160. package/src/mocks/codegenNativeComponent.ts +5 -0
  161. package/src/styles/countryThemes.ts +79 -0
  162. package/src/styles/theme.ts +297 -0
  163. package/src/utils/iconMap.ts +23 -0
  164. package/tsconfig.app.json +25 -0
  165. package/tsconfig.json +7 -0
  166. package/tsconfig.node.json +24 -0
  167. package/vite.config.ts +51 -0
  168. package/vitest.shims.d.ts +1 -0
package/src/Colors.mdx ADDED
@@ -0,0 +1,393 @@
1
+ import { Meta } from '@storybook/addon-docs/blocks';
2
+
3
+ <Meta title="Brand Guidelines/Cores" />
4
+
5
+ # Paleta de Cores
6
+
7
+ Toda a paleta de cores do **Xetlingo** está definida em tokens de CSS custom properties e mapeada no tema TypeScript para o aplicativo.
8
+
9
+ > [!IMPORTANT]
10
+ > **Regra de Uso:** Nunca usar valores hexadecimais soltos no código do aplicativo ou nos componentes do design system. Utilize sempre as variáveis CSS ou o objeto do `theme` em TypeScript.
11
+
12
+ ---
13
+
14
+ {/* Paleta Primária */}
15
+ <div style={{
16
+ backgroundColor: 'var(--bg-surface)',
17
+ border: '1px solid var(--border-color)',
18
+ borderRadius: '16px',
19
+ padding: '1.5rem',
20
+ boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03)',
21
+ marginBottom: '2.5rem',
22
+ marginTop: '1.5rem'
23
+ }}>
24
+ <h3 style={{
25
+ fontFamily: 'var(--font-title)',
26
+ fontSize: '1.25rem',
27
+ fontWeight: '700',
28
+ color: 'var(--text-primary)',
29
+ marginTop: 0,
30
+ marginBottom: '1.25rem',
31
+ }}>Paleta primária</h3>
32
+
33
+ <table style={{
34
+ width: '100%',
35
+ borderCollapse: 'collapse',
36
+ textAlign: 'left'
37
+ }}>
38
+ <thead>
39
+ <tr style={{
40
+ borderBottom: '2px solid var(--border-color)',
41
+ }}>
42
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Token</th>
43
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Valor</th>
44
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em', width: '80px' }}>Swatch</th>
45
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Uso</th>
46
+ </tr>
47
+ </thead>
48
+ <tbody>
49
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
50
+ <td style={{ padding: '12px 16px' }}>
51
+ <code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-primary</code>
52
+ </td>
53
+ <td style={{ padding: '12px 16px' }}>
54
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#f2974b</code>
55
+ </td>
56
+ <td style={{ padding: '12px 16px' }}>
57
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#f2974b', border: '1px solid rgba(0, 0, 0, 0.1)' }} />
58
+ </td>
59
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
60
+ CTAs, botão primário, destaque, progresso
61
+ </td>
62
+ </tr>
63
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
64
+ <td style={{ padding: '12px 16px' }}>
65
+ <code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-primary-dark</code>
66
+ </td>
67
+ <td style={{ padding: '12px 16px' }}>
68
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#cf7a30</code>
69
+ </td>
70
+ <td style={{ padding: '12px 16px' }}>
71
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#cf7a30', border: '1px solid rgba(0, 0, 0, 0.1)' }} />
72
+ </td>
73
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
74
+ Sombra do botão primário, ícone selecionado, hover
75
+ </td>
76
+ </tr>
77
+ <tr>
78
+ <td style={{ padding: '12px 16px' }}>
79
+ <code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-primary-light</code>
80
+ </td>
81
+ <td style={{ padding: '12px 16px' }}>
82
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#fef6ee</code>
83
+ </td>
84
+ <td style={{ padding: '12px 16px' }}>
85
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#fef6ee', border: '1px solid var(--border-color)' }} />
86
+ </td>
87
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
88
+ Fundo de item selecionado, chip ativo
89
+ </td>
90
+ </tr>
91
+ </tbody>
92
+ </table>
93
+ </div>
94
+
95
+ {/* Escala de Castanho (Neutros) */}
96
+ <div style={{
97
+ backgroundColor: 'var(--bg-surface)',
98
+ border: '1px solid var(--border-color)',
99
+ borderRadius: '16px',
100
+ padding: '1.5rem',
101
+ boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03)',
102
+ marginBottom: '2.5rem'
103
+ }}>
104
+ <h3 style={{
105
+ fontFamily: 'var(--font-title)',
106
+ fontSize: '1.25rem',
107
+ fontWeight: '700',
108
+ color: 'var(--text-primary)',
109
+ marginTop: 0,
110
+ marginBottom: '1.25rem',
111
+ }}>Escala de castanho (neutros)</h3>
112
+
113
+ <table style={{
114
+ width: '100%',
115
+ borderCollapse: 'collapse',
116
+ textAlign: 'left'
117
+ }}>
118
+ <thead>
119
+ <tr style={{
120
+ borderBottom: '2px solid var(--border-color)',
121
+ }}>
122
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Token</th>
123
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Valor</th>
124
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em', width: '80px' }}>Swatch</th>
125
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Uso</th>
126
+ </tr>
127
+ </thead>
128
+ <tbody>
129
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
130
+ <td style={{ padding: '12px 16px' }}>
131
+ <code style={{ fontSize: '0.85rem', color: '#51332d', backgroundColor: '#efe2d6', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-brown-900</code>
132
+ </td>
133
+ <td style={{ padding: '12px 16px' }}>
134
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#15100d</code>
135
+ </td>
136
+ <td style={{ padding: '12px 16px' }}>
137
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#15100d', border: '1px solid rgba(0, 0, 0, 0.1)' }} />
138
+ </td>
139
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
140
+ Cor máxima de contraste, textos ou superfícies em modo escuro
141
+ </td>
142
+ </tr>
143
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
144
+ <td style={{ padding: '12px 16px' }}>
145
+ <code style={{ fontSize: '0.85rem', color: '#51332d', backgroundColor: '#efe2d6', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-brown-800</code>
146
+ </td>
147
+ <td style={{ padding: '12px 16px' }}>
148
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#51332d</code>
149
+ </td>
150
+ <td style={{ padding: '12px 16px' }}>
151
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#51332d', border: '1px solid rgba(0, 0, 0, 0.1)' }} />
152
+ </td>
153
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
154
+ Texto principal, cabeçalhos e botões na variante invertida
155
+ </td>
156
+ </tr>
157
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
158
+ <td style={{ padding: '12px 16px' }}>
159
+ <code style={{ fontSize: '0.85rem', color: '#51332d', backgroundColor: '#efe2d6', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-brown-700</code>
160
+ </td>
161
+ <td style={{ padding: '12px 16px' }}>
162
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#3f2620</code>
163
+ </td>
164
+ <td style={{ padding: '12px 16px' }}>
165
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#3f2620', border: '1px solid rgba(0, 0, 0, 0.1)' }} />
166
+ </td>
167
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
168
+ Bordas internas e sombras profundas
169
+ </td>
170
+ </tr>
171
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
172
+ <td style={{ padding: '12px 16px' }}>
173
+ <code style={{ fontSize: '0.85rem', color: '#51332d', backgroundColor: '#efe2d6', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-brown-600</code>
174
+ </td>
175
+ <td style={{ padding: '12px 16px' }}>
176
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#6e5a4f</code>
177
+ </td>
178
+ <td style={{ padding: '12px 16px' }}>
179
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#6e5a4f', border: '1px solid rgba(0, 0, 0, 0.1)' }} />
180
+ </td>
181
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
182
+ Texto de apoio escuro, iconografia
183
+ </td>
184
+ </tr>
185
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
186
+ <td style={{ padding: '12px 16px' }}>
187
+ <code style={{ fontSize: '0.85rem', color: '#51332d', backgroundColor: '#efe2d6', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-brown-500</code>
188
+ </td>
189
+ <td style={{ padding: '12px 16px' }}>
190
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#9a8478</code>
191
+ </td>
192
+ <td style={{ padding: '12px 16px' }}>
193
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#9a8478', border: '1px solid rgba(0, 0, 0, 0.1)' }} />
194
+ </td>
195
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
196
+ Texto secundário, labels, placeholders
197
+ </td>
198
+ </tr>
199
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
200
+ <td style={{ padding: '12px 16px' }}>
201
+ <code style={{ fontSize: '0.85rem', color: '#51332d', backgroundColor: '#efe2d6', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-brown-400</code>
202
+ </td>
203
+ <td style={{ padding: '12px 16px' }}>
204
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#b9a392</code>
205
+ </td>
206
+ <td style={{ padding: '12px 16px' }}>
207
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#b9a392', border: '1px solid rgba(0, 0, 0, 0.1)' }} />
208
+ </td>
209
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
210
+ Ícones desativados, texto terciário
211
+ </td>
212
+ </tr>
213
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
214
+ <td style={{ padding: '12px 16px' }}>
215
+ <code style={{ fontSize: '0.85rem', color: '#51332d', backgroundColor: '#efe2d6', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-brown-300</code>
216
+ </td>
217
+ <td style={{ padding: '12px 16px' }}>
218
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#c3b1a4</code>
219
+ </td>
220
+ <td style={{ padding: '12px 16px' }}>
221
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#c3b1a4', border: '1px solid rgba(0, 0, 0, 0.1)' }} />
222
+ </td>
223
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
224
+ Ícones de navegação não selecionada
225
+ </td>
226
+ </tr>
227
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
228
+ <td style={{ padding: '12px 16px' }}>
229
+ <code style={{ fontSize: '0.85rem', color: '#51332d', backgroundColor: '#efe2d6', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-brown-100</code>
230
+ </td>
231
+ <td style={{ padding: '12px 16px' }}>
232
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#efe2d6</code>
233
+ </td>
234
+ <td style={{ padding: '12px 16px' }}>
235
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#efe2d6', border: '1px solid var(--border-color)' }} />
236
+ </td>
237
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
238
+ Bordas, separadores e sombra do botão secundário
239
+ </td>
240
+ </tr>
241
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
242
+ <td style={{ padding: '12px 16px' }}>
243
+ <code style={{ fontSize: '0.85rem', color: '#51332d', backgroundColor: '#efe2d6', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-brown-50</code>
244
+ </td>
245
+ <td style={{ padding: '12px 16px' }}>
246
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#fdf3ea</code>
247
+ </td>
248
+ <td style={{ padding: '12px 16px' }}>
249
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#fdf3ea', border: '1px solid var(--border-color)' }} />
250
+ </td>
251
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
252
+ Fundo de cards, chips neutros, áreas de destaque leve
253
+ </td>
254
+ </tr>
255
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
256
+ <td style={{ padding: '12px 16px' }}>
257
+ <code style={{ fontSize: '0.85rem', color: '#51332d', backgroundColor: '#efe2d6', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-cream</code>
258
+ </td>
259
+ <td style={{ padding: '12px 16px' }}>
260
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#fbf6f0</code>
261
+ </td>
262
+ <td style={{ padding: '12px 16px' }}>
263
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#fbf6f0', border: '1px solid var(--border-color)' }} />
264
+ </td>
265
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
266
+ Fundo de ecrãs secundários
267
+ </td>
268
+ </tr>
269
+ <tr>
270
+ <td style={{ padding: '12px 16px' }}>
271
+ <code style={{ fontSize: '0.85rem', color: '#51332d', backgroundColor: '#efe2d6', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-canvas</code>
272
+ </td>
273
+ <td style={{ padding: '12px 16px' }}>
274
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#e7e5df</code>
275
+ </td>
276
+ <td style={{ padding: '12px 16px' }}>
277
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#e7e5df', border: '1px solid var(--border-color)' }} />
278
+ </td>
279
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-secondary)', fontStyle: 'italic' }}>
280
+ Fundo do arquivo de design no Figma (não usado na app)
281
+ </td>
282
+ </tr>
283
+ </tbody>
284
+ </table>
285
+ </div>
286
+
287
+ {/* Semânticas & Base */}
288
+ <div style={{
289
+ backgroundColor: 'var(--bg-surface)',
290
+ border: '1px solid var(--border-color)',
291
+ borderRadius: '16px',
292
+ padding: '1.5rem',
293
+ boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03)',
294
+ marginBottom: '2.5rem'
295
+ }}>
296
+ <h3 style={{
297
+ fontFamily: 'var(--font-title)',
298
+ fontSize: '1.25rem',
299
+ fontWeight: '700',
300
+ color: 'var(--text-primary)',
301
+ marginTop: 0,
302
+ marginBottom: '1.25rem',
303
+ }}>Semânticas & Base</h3>
304
+
305
+ <table style={{
306
+ width: '100%',
307
+ borderCollapse: 'collapse',
308
+ textAlign: 'left'
309
+ }}>
310
+ <thead>
311
+ <tr style={{
312
+ borderBottom: '2px solid var(--border-color)',
313
+ }}>
314
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Token</th>
315
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Valor</th>
316
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em', width: '80px' }}>Swatch</th>
317
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Uso</th>
318
+ </tr>
319
+ </thead>
320
+ <tbody>
321
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
322
+ <td style={{ padding: '12px 16px' }}>
323
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-primary)', backgroundColor: 'var(--bg-app)', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-success</code>
324
+ </td>
325
+ <td style={{ padding: '12px 16px' }}>
326
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#16915a</code>
327
+ </td>
328
+ <td style={{ padding: '12px 16px' }}>
329
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#16915a', border: '1px solid rgba(0, 0, 0, 0.1)' }} />
330
+ </td>
331
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
332
+ Sucesso, acertos, módulos concluídos
333
+ </td>
334
+ </tr>
335
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
336
+ <td style={{ padding: '12px 16px' }}>
337
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-primary)', backgroundColor: 'var(--bg-app)', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-error</code>
338
+ </td>
339
+ <td style={{ padding: '12px 16px' }}>
340
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#cf5b48</code>
341
+ </td>
342
+ <td style={{ padding: '12px 16px' }}>
343
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#cf5b48', border: '1px solid rgba(0, 0, 0, 0.1)' }} />
344
+ </td>
345
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
346
+ Erro, campo inválido
347
+ </td>
348
+ </tr>
349
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
350
+ <td style={{ padding: '12px 16px' }}>
351
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-primary)', backgroundColor: 'var(--bg-app)', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-info</code>
352
+ </td>
353
+ <td style={{ padding: '12px 16px' }}>
354
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#2a6fc2</code>
355
+ </td>
356
+ <td style={{ padding: '12px 16px' }}>
357
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#2a6fc2', border: '1px solid rgba(0, 0, 0, 0.1)' }} />
358
+ </td>
359
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
360
+ Informação, link
361
+ </td>
362
+ </tr>
363
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
364
+ <td style={{ padding: '12px 16px' }}>
365
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-primary)', backgroundColor: 'var(--bg-app)', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-black</code>
366
+ </td>
367
+ <td style={{ padding: '12px 16px' }}>
368
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#000000</code>
369
+ </td>
370
+ <td style={{ padding: '12px 16px' }}>
371
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#000000', border: '1px solid rgba(0, 0, 0, 0.1)' }} />
372
+ </td>
373
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
374
+ Preto Xetwa
375
+ </td>
376
+ </tr>
377
+ <tr>
378
+ <td style={{ padding: '12px 16px' }}>
379
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-primary)', backgroundColor: 'var(--bg-app)', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--color-white</code>
380
+ </td>
381
+ <td style={{ padding: '12px 16px' }}>
382
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>#ffffff</code>
383
+ </td>
384
+ <td style={{ padding: '12px 16px' }}>
385
+ <div style={{ width: '36px', height: '20px', borderRadius: '4px', backgroundColor: '#ffffff', border: '1px solid var(--border-color)' }} />
386
+ </td>
387
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
388
+ Fundo principal de ecrãs, cards
389
+ </td>
390
+ </tr>
391
+ </tbody>
392
+ </table>
393
+ </div>