@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
@@ -0,0 +1,343 @@
1
+ import { Meta } from '@storybook/addon-docs/blocks';
2
+
3
+ <Meta title="Brand Guidelines/Bordas & Sombras" />
4
+
5
+ # Raios de Borda & Sombras
6
+
7
+ Estes tokens definem o comportamento estrutural dos elementos do **Xetlingo**, moldando os cantos arredondados (raios de borda) e a elevação visual (sombras) das nossas interfaces.
8
+
9
+ ---
10
+
11
+ {/* Raios de Borda */}
12
+ <div style={{
13
+ backgroundColor: 'var(--bg-surface)',
14
+ border: '1px solid var(--border-color)',
15
+ borderRadius: '16px',
16
+ padding: '1.5rem',
17
+ boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03)',
18
+ marginBottom: '2.5rem',
19
+ marginTop: '1.5rem'
20
+ }}>
21
+ <h3 style={{
22
+ fontFamily: 'var(--font-title)',
23
+ fontSize: '1.25rem',
24
+ fontWeight: '700',
25
+ color: 'var(--text-primary)',
26
+ marginTop: 0,
27
+ marginBottom: '1.25rem',
28
+ }}>Raios de borda (Cantos Arredondados)</h3>
29
+
30
+ <p style={{ fontSize: '0.9rem', color: 'var(--text-secondary)', marginBottom: '1.5rem' }}>
31
+ O sistema Xetwa usa cantos generosamente arredondados — amigável e consistente com a marca.
32
+ </p>
33
+
34
+ <table style={{
35
+ width: '100%',
36
+ borderCollapse: 'collapse',
37
+ textAlign: 'left'
38
+ }}>
39
+ <thead>
40
+ <tr style={{
41
+ borderBottom: '2px solid var(--border-color)',
42
+ }}>
43
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Token</th>
44
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Valor</th>
45
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em', width: '90px' }}>Visual</th>
46
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Usado em</th>
47
+ </tr>
48
+ </thead>
49
+ <tbody>
50
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
51
+ <td style={{ padding: '12px 16px' }}>
52
+ <code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--radius-xs</code>
53
+ </td>
54
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>6px</td>
55
+ <td style={{ padding: '12px 16px' }}>
56
+ <div style={{ width: '40px', height: '24px', backgroundColor: '#f2974b', borderRadius: '6px' }} />
57
+ </td>
58
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
59
+ Etiquetas "EM CURSO", badges de estado
60
+ </td>
61
+ </tr>
62
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
63
+ <td style={{ padding: '12px 16px' }}>
64
+ <code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--radius-sm</code>
65
+ </td>
66
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>10px</td>
67
+ <td style={{ padding: '12px 16px' }}>
68
+ <div style={{ width: '40px', height: '24px', backgroundColor: '#f2974b', borderRadius: '10px' }} />
69
+ </td>
70
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
71
+ Chips/tags, chips de data, ícone de plano
72
+ </td>
73
+ </tr>
74
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
75
+ <td style={{ padding: '12px 16px' }}>
76
+ <code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--radius-md</code>
77
+ </td>
78
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>12px</td>
79
+ <td style={{ padding: '12px 16px' }}>
80
+ <div style={{ width: '40px', height: '24px', backgroundColor: '#f2974b', borderRadius: '12px' }} />
81
+ </td>
82
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
83
+ Inputs, botões pequenos, avatares quadrados
84
+ </td>
85
+ </tr>
86
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
87
+ <td style={{ padding: '12px 16px' }}>
88
+ <code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--radius-lg</code>
89
+ </td>
90
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>16px</td>
91
+ <td style={{ padding: '12px 16px' }}>
92
+ <div style={{ width: '40px', height: '24px', backgroundColor: '#f2974b', borderRadius: '16px' }} />
93
+ </td>
94
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
95
+ Botões primários, cards de opção, horários
96
+ </td>
97
+ </tr>
98
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
99
+ <td style={{ padding: '12px 16px' }}>
100
+ <code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--radius-xl</code>
101
+ </td>
102
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>20px</td>
103
+ <td style={{ padding: '12px 16px' }}>
104
+ <div style={{ width: '40px', height: '24px', backgroundColor: '#f2974b', borderRadius: '20px' }} />
105
+ </td>
106
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
107
+ Cards de módulo, bottom sheet, cartão de embarque
108
+ </td>
109
+ </tr>
110
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
111
+ <td style={{ padding: '12px 16px' }}>
112
+ <code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--radius-2xl</code>
113
+ </td>
114
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>24px</td>
115
+ <td style={{ padding: '12px 16px' }}>
116
+ <div style={{ width: '40px', height: '24px', backgroundColor: '#f2974b', borderRadius: '24px' }} />
117
+ </td>
118
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
119
+ Modals, cards de mascote, passaporte
120
+ </td>
121
+ </tr>
122
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
123
+ <td style={{ padding: '12px 16px' }}>
124
+ <code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--radius-screen</code>
125
+ </td>
126
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>34px</td>
127
+ <td style={{ padding: '12px 16px' }}>
128
+ <div style={{ width: '40px', height: '24px', backgroundColor: '#f2974b', borderRadius: '34px' }} />
129
+ </td>
130
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
131
+ Ecrã dentro do frame de telemóvel
132
+ </td>
133
+ </tr>
134
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
135
+ <td style={{ padding: '12px 16px' }}>
136
+ <code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--radius-phone</code>
137
+ </td>
138
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>42px</td>
139
+ <td style={{ padding: '12px 16px' }}>
140
+ <div style={{ width: '40px', height: '24px', backgroundColor: '#51332d', borderRadius: '42px' }} />
141
+ </td>
142
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
143
+ Frame exterior do telemóvel (mockups)
144
+ </td>
145
+ </tr>
146
+ <tr>
147
+ <td style={{ padding: '12px 16px' }}>
148
+ <code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--radius-full</code>
149
+ </td>
150
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>9999px</td>
151
+ <td style={{ padding: '12px 16px' }}>
152
+ <div style={{ width: '32px', height: '32px', backgroundColor: '#f2974b', borderRadius: '9999px' }} />
153
+ </td>
154
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
155
+ Avatares circulares, nós do mapa, chips de nível
156
+ </td>
157
+ </tr>
158
+ </tbody>
159
+ </table>
160
+ </div>
161
+
162
+ {/* Sombras */}
163
+ <div style={{
164
+ backgroundColor: 'var(--bg-surface)',
165
+ border: '1px solid var(--border-color)',
166
+ borderRadius: '16px',
167
+ padding: '1.5rem',
168
+ boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03)',
169
+ marginBottom: '2.5rem'
170
+ }}>
171
+ <h3 style={{
172
+ fontFamily: 'var(--font-title)',
173
+ fontSize: '1.25rem',
174
+ fontWeight: '700',
175
+ color: 'var(--text-primary)',
176
+ marginTop: 0,
177
+ marginBottom: '1.25rem',
178
+ }}>Sombras (Elevação & Efeito 3D)</h3>
179
+
180
+ <p style={{ fontSize: '0.9rem', color: 'var(--text-secondary)', marginBottom: '1.5rem' }}>
181
+ As sombras são suaves e usam o castanho da marca (<code style={{ fontSize: '0.8rem' }}>rgba(81,51,45, ...)</code>) para não quebrar a paleta.
182
+ Os botões usam **sombra rígida ("bottom shadow") estilo jogo** — não box-shadow difuso.
183
+ </p>
184
+
185
+ <table style={{
186
+ width: '100%',
187
+ borderCollapse: 'collapse',
188
+ textAlign: 'left'
189
+ }}>
190
+ <thead>
191
+ <tr style={{
192
+ borderBottom: '2px solid var(--border-color)',
193
+ }}>
194
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Token</th>
195
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Valor CSS</th>
196
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em', width: '80px' }}>Amostra</th>
197
+ <th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Usado em</th>
198
+ </tr>
199
+ </thead>
200
+ <tbody>
201
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
202
+ <td style={{ padding: '12px 16px' }}>
203
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-primary)', backgroundColor: 'var(--bg-app)', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--shadow-xs</code>
204
+ </td>
205
+ <td style={{ padding: '12px 16px' }}>
206
+ <code style={{ fontSize: '0.8rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>0 1px 3px rgba(81,51,45,.08)</code>
207
+ </td>
208
+ <td style={{ padding: '12px 16px' }}>
209
+ <div style={{ width: '40px', height: '24px', backgroundColor: 'var(--bg-surface)', border: '1px solid var(--border-color)', borderRadius: '6px', boxShadow: 'var(--shadow-xs)' }} />
210
+ </td>
211
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
212
+ Tags, chips, inputs em repouso
213
+ </td>
214
+ </tr>
215
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
216
+ <td style={{ padding: '12px 16px' }}>
217
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-primary)', backgroundColor: 'var(--bg-app)', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--shadow-sm</code>
218
+ </td>
219
+ <td style={{ padding: '12px 16px' }}>
220
+ <code style={{ fontSize: '0.8rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>0 2px 8px rgba(81,51,45,.10)</code>
221
+ </td>
222
+ <td style={{ padding: '12px 16px' }}>
223
+ <div style={{ width: '40px', height: '24px', backgroundColor: 'var(--bg-surface)', border: '1px solid var(--border-color)', borderRadius: '6px', boxShadow: 'var(--shadow-sm)' }} />
224
+ </td>
225
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
226
+ Cards simples, avatares
227
+ </td>
228
+ </tr>
229
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
230
+ <td style={{ padding: '12px 16px' }}>
231
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-primary)', backgroundColor: 'var(--bg-app)', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--shadow-md</code>
232
+ </td>
233
+ <td style={{ padding: '12px 16px' }}>
234
+ <code style={{ fontSize: '0.8rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>0 4px 14px rgba(81,51,45,.13)</code>
235
+ </td>
236
+ <td style={{ padding: '12px 16px' }}>
237
+ <div style={{ width: '40px', height: '24px', backgroundColor: 'var(--bg-surface)', border: '1px solid var(--border-color)', borderRadius: '6px', boxShadow: 'var(--shadow-md)' }} />
238
+ </td>
239
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
240
+ Cards de módulo, modals, passaporte
241
+ </td>
242
+ </tr>
243
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
244
+ <td style={{ padding: '12px 16px' }}>
245
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-primary)', backgroundColor: 'var(--bg-app)', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--shadow-lg</code>
246
+ </td>
247
+ <td style={{ padding: '12px 16px' }}>
248
+ <code style={{ fontSize: '0.8rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>0 8px 26px rgba(81,51,45,.18)</code>
249
+ </td>
250
+ <td style={{ padding: '12px 16px' }}>
251
+ <div style={{ width: '40px', height: '24px', backgroundColor: 'var(--bg-surface)', border: '1px solid var(--border-color)', borderRadius: '6px', boxShadow: 'var(--shadow-lg)' }} />
252
+ </td>
253
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
254
+ Bottom sheets, cards premium, boarding pass
255
+ </td>
256
+ </tr>
257
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
258
+ <td style={{ padding: '12px 16px' }}>
259
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-primary)', backgroundColor: 'var(--bg-app)', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--shadow-xl</code>
260
+ </td>
261
+ <td style={{ padding: '12px 16px' }}>
262
+ <code style={{ fontSize: '0.8rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>0 18px 40px rgba(81,51,45,.28)</code>
263
+ </td>
264
+ <td style={{ padding: '12px 16px' }}>
265
+ <div style={{ width: '40px', height: '24px', backgroundColor: 'var(--bg-surface)', border: '1px solid var(--border-color)', borderRadius: '6px', boxShadow: 'var(--shadow-xl)' }} />
266
+ </td>
267
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
268
+ Frame de telemóvel nos mockups
269
+ </td>
270
+ </tr>
271
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
272
+ <td style={{ padding: '12px 16px' }}>
273
+ <code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--shadow-btn-primary</code>
274
+ </td>
275
+ <td style={{ padding: '12px 16px' }}>
276
+ <code style={{ fontSize: '0.8rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>0 4px 0 #cf7a30</code>
277
+ </td>
278
+ <td style={{ padding: '12px 16px' }}>
279
+ <div style={{ width: '40px', height: '24px', backgroundColor: '#f2974b', borderBottom: '4px solid #cf7a30', borderRadius: '6px' }} />
280
+ </td>
281
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
282
+ Botão primário (laranja) — sombra rígida
283
+ </td>
284
+ </tr>
285
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
286
+ <td style={{ padding: '12px 16px' }}>
287
+ <code style={{ fontSize: '0.85rem', color: '#51332d', backgroundColor: '#efe2d6', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--shadow-btn-secondary</code>
288
+ </td>
289
+ <td style={{ padding: '12px 16px' }}>
290
+ <code style={{ fontSize: '0.8rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>0 4px 0 #efe2d6</code>
291
+ </td>
292
+ <td style={{ padding: '12px 16px' }}>
293
+ <div style={{ width: '40px', height: '24px', backgroundColor: '#fef6ee', borderBottom: '4px solid #efe2d6', borderLeft: '1px solid #efe2d6', borderRight: '1px solid #efe2d6', borderRadius: '6px' }} />
294
+ </td>
295
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
296
+ Botão secundário (branco) — sombra rígida
297
+ </td>
298
+ </tr>
299
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
300
+ <td style={{ padding: '12px 16px' }}>
301
+ <code style={{ fontSize: '0.85rem', color: '#ffffff', backgroundColor: '#51332d', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--shadow-btn-dark</code>
302
+ </td>
303
+ <td style={{ padding: '12px 16px' }}>
304
+ <code style={{ fontSize: '0.8rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>0 4px 0 #3a241f</code>
305
+ </td>
306
+ <td style={{ padding: '12px 16px' }}>
307
+ <div style={{ width: '40px', height: '24px', backgroundColor: '#51332d', borderBottom: '4px solid #3a241f', borderRadius: '6px' }} />
308
+ </td>
309
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
310
+ Botão dark (castanho) — sombra rígida
311
+ </td>
312
+ </tr>
313
+ <tr style={{ borderBottom: '1px solid var(--border-color)' }}>
314
+ <td style={{ padding: '12px 16px' }}>
315
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-primary)', backgroundColor: 'var(--bg-app)', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--shadow-focus</code>
316
+ </td>
317
+ <td style={{ padding: '12px 16px' }}>
318
+ <code style={{ fontSize: '0.8rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>0 0 0 3px rgba(242,151,75,.22)</code>
319
+ </td>
320
+ <td style={{ padding: '12px 16px' }}>
321
+ <div style={{ width: '36px', height: '20px', borderRadius: '6px', border: '3px solid rgba(242, 151, 75, 0.22)' }} />
322
+ </td>
323
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
324
+ Focus ring de inputs e botões
325
+ </td>
326
+ </tr>
327
+ <tr>
328
+ <td style={{ padding: '12px 16px' }}>
329
+ <code style={{ fontSize: '0.85rem', color: 'var(--text-primary)', backgroundColor: 'var(--bg-app)', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--shadow-ring-pulse</code>
330
+ </td>
331
+ <td style={{ padding: '12px 16px' }}>
332
+ <code style={{ fontSize: '0.8rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>Pulse animation</code>
333
+ </td>
334
+ <td style={{ padding: '12px 16px' }}>
335
+ <div style={{ width: '20px', height: '20px', borderRadius: '50%', backgroundColor: '#f2974b', boxShadow: '0 0 0 6px rgba(242, 151, 75, 0.25)' }} />
336
+ </td>
337
+ <td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
338
+ Animação de pulse no nó ativo do mapa
339
+ </td>
340
+ </tr>
341
+ </tbody>
342
+ </table>
343
+ </div>