@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.
- package/.github/workflows/publish.yml +30 -0
- package/.storybook/main.ts +17 -0
- package/.storybook/preview.tsx +65 -0
- package/eslint.config.js +22 -0
- package/index.html +13 -0
- package/package.json +55 -0
- package/public/favicon.svg +1 -0
- package/public/icons.svg +24 -0
- package/src/App.css +184 -0
- package/src/App.tsx +122 -0
- package/src/BordasSombras.mdx +343 -0
- package/src/Colors.mdx +393 -0
- package/src/GrelhaLayout.mdx +375 -0
- package/src/Icons.mdx +42 -0
- package/src/MovimentoBreakpoints.mdx +379 -0
- package/src/Spacing.mdx +231 -0
- package/src/Typography.mdx +321 -0
- package/src/assets/Mascots/vava/estaticos/vava-acenar.svg +3 -0
- package/src/assets/Mascots/vava/estaticos/vava-acertou.svg +3 -0
- package/src/assets/Mascots/vava/estaticos/vava-celebrar.svg +3 -0
- package/src/assets/Mascots/vava/estaticos/vava-com-autocolantes.svg +3 -0
- package/src/assets/Mascots/vava/estaticos/vava-dormir.svg +3 -0
- package/src/assets/Mascots/vava/estaticos/vava-errou.svg +3 -0
- package/src/assets/Mascots/vava/estaticos/vava-feliz.svg +3 -0
- package/src/assets/Mascots/vava/estaticos/vava-neutra.svg +3 -0
- package/src/assets/Mascots/vava/estaticos/vava-original.svg +3 -0
- package/src/assets/Mascots/vava/estaticos/vava-pensar.svg +3 -0
- package/src/assets/Mascots/vava/estaticos/vava-surpresa.svg +3 -0
- package/src/assets/Mascots/yaya/avatar/yaya-avatar-falar.svg +7 -0
- package/src/assets/Mascots/yaya/avatar/yaya-avatar-feliz.svg +7 -0
- package/src/assets/Mascots/yaya/avatar/yaya-avatar-transparente.svg +6 -0
- package/src/assets/Mascots/yaya/estaticos/yaya-acertou.svg +13 -0
- package/src/assets/Mascots/yaya/estaticos/yaya-celebrar.svg +13 -0
- package/src/assets/Mascots/yaya/estaticos/yaya-dormir.svg +13 -0
- package/src/assets/Mascots/yaya/estaticos/yaya-errou.svg +13 -0
- package/src/assets/Mascots/yaya/estaticos/yaya-falar.svg +13 -0
- package/src/assets/Mascots/yaya/estaticos/yaya-feliz.svg +13 -0
- package/src/assets/Mascots/yaya/estaticos/yaya-neutra.svg +13 -0
- package/src/assets/Mascots/yaya/estaticos/yaya-pensar.svg +13 -0
- package/src/assets/Mascots/yaya/estaticos/yaya-surpresa.svg +13 -0
- package/src/assets/hero.png +0 -0
- package/src/assets/react.svg +1 -0
- package/src/assets/vite.svg +1 -0
- package/src/components/Buttons/BackButton/BackButton.stories.tsx +86 -0
- package/src/components/Buttons/BackButton/BackButton.tsx +107 -0
- package/src/components/Buttons/FabButton/FabButton.stories.tsx +74 -0
- package/src/components/Buttons/FabButton/FabButton.tsx +161 -0
- package/src/components/Buttons/IconButton/IconButton.stories.tsx +99 -0
- package/src/components/Buttons/IconButton/IconButton.tsx +189 -0
- package/src/components/Buttons/JourneyButton/JourneyButton.stories.tsx +80 -0
- package/src/components/Buttons/JourneyButton/JourneyButton.tsx +194 -0
- package/src/components/Buttons/MainButton/MainButton.stories.tsx +144 -0
- package/src/components/Buttons/MainButton/MainButton.tsx +258 -0
- package/src/components/Buttons/WordChip/WordChip.stories.tsx +84 -0
- package/src/components/Buttons/WordChip/WordChip.tsx +157 -0
- package/src/components/Buttons/WordChip/index.ts +1 -0
- package/src/components/Cards/AnswerOptionCard/AnswerOptionCard.stories.tsx +181 -0
- package/src/components/Cards/AnswerOptionCard/AnswerOptionCard.tsx +201 -0
- package/src/components/Cards/BaseCard/BaseCard.stories.tsx +148 -0
- package/src/components/Cards/BaseCard/BaseCard.tsx +181 -0
- package/src/components/Cards/BoardingPassCard/BoardingPassCard.stories.tsx +205 -0
- package/src/components/Cards/BoardingPassCard/BoardingPassCard.tsx +384 -0
- package/src/components/Cards/BoardingPassCard/FlightIcon.tsx +21 -0
- package/src/components/Cards/BoardingPassCard/FlightIcon.web.tsx +18 -0
- package/src/components/Cards/CountryCard/CountryCard.stories.tsx +97 -0
- package/src/components/Cards/CountryCard/CountryCard.tsx +185 -0
- package/src/components/Cards/LevelProgressCard/LevelProgressCard.stories.tsx +61 -0
- package/src/components/Cards/LevelProgressCard/LevelProgressCard.tsx +143 -0
- package/src/components/Cards/ModuleCard/ModuleCard.stories.tsx +108 -0
- package/src/components/Cards/ModuleCard/ModuleCard.tsx +304 -0
- package/src/components/Cards/ModuleCompletionCard/ModuleCompletionCard.stories.tsx +53 -0
- package/src/components/Cards/ModuleCompletionCard/ModuleCompletionCard.tsx +167 -0
- package/src/components/Cards/Passport/PassportCover.tsx +114 -0
- package/src/components/Cards/Passport/PassportIDPage.tsx +217 -0
- package/src/components/Cards/Passport/PassportStampPage.tsx +253 -0
- package/src/components/Cards/Passport/PassportViewer.stories.tsx +95 -0
- package/src/components/Cards/Passport/PassportViewer.tsx +328 -0
- package/src/components/Cards/PlanCard/PlanCard.stories.tsx +159 -0
- package/src/components/Cards/PlanCard/PlanCard.tsx +317 -0
- package/src/components/Cards/PricingCard/PricingCard.stories.tsx +83 -0
- package/src/components/Cards/PricingCard/PricingCard.tsx +144 -0
- package/src/components/Cards/SelectionCard/SelectionCard.stories.tsx +77 -0
- package/src/components/Cards/SelectionCard/SelectionCard.tsx +111 -0
- package/src/components/Cards/TeacherCard/TeacherCard.stories.tsx +126 -0
- package/src/components/Cards/TeacherCard/TeacherCard.tsx +236 -0
- package/src/components/Charts/WeeklyProgressChart/WeeklyProgressChart.stories.tsx +89 -0
- package/src/components/Charts/WeeklyProgressChart/WeeklyProgressChart.tsx +179 -0
- package/src/components/Charts/WeeklyProgressChart/index.ts +1 -0
- package/src/components/DataDisplay/Avatar/Avatar.stories.tsx +85 -0
- package/src/components/DataDisplay/Avatar/Avatar.tsx +118 -0
- package/src/components/DataDisplay/Avatar/index.ts +1 -0
- package/src/components/DataDisplay/Badge/Badge.stories.tsx +62 -0
- package/src/components/DataDisplay/Badge/Badge.tsx +146 -0
- package/src/components/DataDisplay/Flag/Flag.stories.tsx +98 -0
- package/src/components/DataDisplay/Flag/Flag.tsx +347 -0
- package/src/components/DataDisplay/Flag/Flag.web.tsx +334 -0
- package/src/components/DataDisplay/InstructionBubble/InstructionBubble.stories.tsx +80 -0
- package/src/components/DataDisplay/InstructionBubble/InstructionBubble.tsx +86 -0
- package/src/components/DataDisplay/LevelBadge/LevelBadge.stories.tsx +99 -0
- package/src/components/DataDisplay/LevelBadge/LevelBadge.tsx +118 -0
- package/src/components/DataDisplay/ProgressBar/ProgressBar.stories.tsx +95 -0
- package/src/components/DataDisplay/ProgressBar/ProgressBar.tsx +117 -0
- package/src/components/DataDisplay/StatBadge/StatBadge.stories.tsx +82 -0
- package/src/components/DataDisplay/StatBadge/StatBadge.tsx +135 -0
- package/src/components/DataDisplay/StatBadge/index.ts +1 -0
- package/src/components/DataDisplay/Tag/Tag.stories.tsx +63 -0
- package/src/components/DataDisplay/Tag/Tag.tsx +148 -0
- package/src/components/Feedback/FeedbackBottomSheet/FeedbackBottomSheet.stories.tsx +74 -0
- package/src/components/Feedback/FeedbackBottomSheet/FeedbackBottomSheet.tsx +200 -0
- package/src/components/Forms/Checkbox/Checkbox.stories.tsx +60 -0
- package/src/components/Forms/Checkbox/Checkbox.tsx +127 -0
- package/src/components/Forms/Checkbox/index.ts +1 -0
- package/src/components/Forms/DaySelector/DaySelector.stories.tsx +62 -0
- package/src/components/Forms/DaySelector/DaySelector.tsx +133 -0
- package/src/components/Forms/Radio/Radio.stories.tsx +61 -0
- package/src/components/Forms/Radio/Radio.tsx +141 -0
- package/src/components/Forms/Radio/index.ts +1 -0
- package/src/components/Forms/SegmentedToggle/SegmentedToggle.stories.tsx +67 -0
- package/src/components/Forms/SegmentedToggle/SegmentedToggle.tsx +150 -0
- package/src/components/Forms/SegmentedToggle/index.ts +1 -0
- package/src/components/Forms/Select/Select.stories.tsx +59 -0
- package/src/components/Forms/Select/Select.tsx +255 -0
- package/src/components/Forms/Select/index.ts +1 -0
- package/src/components/Forms/Switch/Switch.stories.tsx +57 -0
- package/src/components/Forms/Switch/Switch.tsx +120 -0
- package/src/components/Forms/Switch/index.ts +1 -0
- package/src/components/Forms/TimeSlot/TimeSlot.stories.tsx +62 -0
- package/src/components/Forms/TimeSlot/TimeSlot.tsx +116 -0
- package/src/components/Headers/CountryHeader/CountryHeader.stories.tsx +114 -0
- package/src/components/Headers/CountryHeader/CountryHeader.tsx +147 -0
- package/src/components/Headers/ProfileHeader/ProfileHeader.stories.tsx +141 -0
- package/src/components/Headers/ProfileHeader/ProfileHeader.tsx +233 -0
- package/src/components/Inputs/FillInTheBlank/FillInTheBlank.stories.tsx +333 -0
- package/src/components/Inputs/FillInTheBlank/FillInTheBlank.tsx +287 -0
- package/src/components/Inputs/FillInTheBlank/index.ts +1 -0
- package/src/components/Inputs/TextInput/TextInput.stories.tsx +103 -0
- package/src/components/Inputs/TextInput/TextInput.tsx +187 -0
- package/src/components/Mascots/Vava/Vava.stories.tsx +114 -0
- package/src/components/Mascots/Vava/Vava.tsx +276 -0
- package/src/components/Mascots/Yaya/Yaya.stories.tsx +98 -0
- package/src/components/Mascots/Yaya/Yaya.tsx +233 -0
- package/src/components/Navigation/BottomTabBar/BottomTabBar.stories.tsx +68 -0
- package/src/components/Navigation/BottomTabBar/BottomTabBar.tsx +85 -0
- package/src/components/Navigation/BottomTabBar/BottomTabBarItem.tsx +68 -0
- package/src/components/Navigation/BottomTabBar/index.ts +2 -0
- package/src/components/Navigation/PaginationDots/PaginationDots.stories.tsx +62 -0
- package/src/components/Navigation/PaginationDots/PaginationDots.tsx +81 -0
- package/src/components/Navigation/PaginationDots/index.ts +1 -0
- package/src/components/Navigation/ProgressMap/ProgressMap.stories.tsx +116 -0
- package/src/components/Navigation/ProgressMap/ProgressMap.tsx +827 -0
- package/src/components/Navigation/WorldProgressMap/WorldProgressMap.stories.tsx +169 -0
- package/src/components/Navigation/WorldProgressMap/WorldProgressMap.tsx +790 -0
- package/src/components/Typography/Typography.stories.tsx +127 -0
- package/src/components/Typography/Typography.tsx +53 -0
- package/src/hooks/useResponsive.ts +41 -0
- package/src/hooks/useTheme.ts +32 -0
- package/src/index.css +355 -0
- package/src/index.ts +28 -0
- package/src/main.tsx +10 -0
- package/src/mocks/codegenNativeComponent.ts +5 -0
- package/src/styles/countryThemes.ts +79 -0
- package/src/styles/theme.ts +297 -0
- package/src/utils/iconMap.ts +23 -0
- package/tsconfig.app.json +25 -0
- package/tsconfig.json +7 -0
- package/tsconfig.node.json +24 -0
- package/vite.config.ts +51 -0
- package/vitest.shims.d.ts +1 -0
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import { Meta } from '@storybook/addon-docs/blocks';
|
|
2
|
+
|
|
3
|
+
<Meta title="Brand Guidelines/Movimento & Breakpoints" />
|
|
4
|
+
|
|
5
|
+
# Movimento, Animação & Breakpoints
|
|
6
|
+
|
|
7
|
+
Estas diretrizes regem como a interface do **Xetlingo** ganha vida através de transições e micro-animações (tom brincalhão, mas nunca distrator) e como ela se adapta a diferentes tamanhos de tela (breakpoints).
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 🎬 Movimento & Animação
|
|
12
|
+
|
|
13
|
+
As micro-animações servem para dar feedback ao utilizador e guiar a sua atenção de forma orgânica e fluida, sem excessos decorativos.
|
|
14
|
+
|
|
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
|
+
}}>Curvas e Durações de Transição</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 / Nome</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' }}>Usado em</th>
|
|
45
|
+
</tr>
|
|
46
|
+
</thead>
|
|
47
|
+
<tbody>
|
|
48
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
49
|
+
<td style={{ padding: '12px 16px' }}>
|
|
50
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--ease-bounce</code>
|
|
51
|
+
</td>
|
|
52
|
+
<td style={{ padding: '12px 16px' }}>
|
|
53
|
+
<code style={{ fontSize: '0.8rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>cubic-bezier(.34,1.56,.64,1)</code>
|
|
54
|
+
</td>
|
|
55
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
|
|
56
|
+
Pop de botão ao acertar, entrada de modal, mascote pop
|
|
57
|
+
</td>
|
|
58
|
+
</tr>
|
|
59
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
60
|
+
<td style={{ padding: '12px 16px' }}>
|
|
61
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--ease-smooth</code>
|
|
62
|
+
</td>
|
|
63
|
+
<td style={{ padding: '12px 16px' }}>
|
|
64
|
+
<code style={{ fontSize: '0.8rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>cubic-bezier(.4,0,.2,1)</code>
|
|
65
|
+
</td>
|
|
66
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
|
|
67
|
+
Transições de ecrã, hover states
|
|
68
|
+
</td>
|
|
69
|
+
</tr>
|
|
70
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
71
|
+
<td style={{ padding: '12px 16px' }}>
|
|
72
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--ease-out</code>
|
|
73
|
+
</td>
|
|
74
|
+
<td style={{ padding: '12px 16px' }}>
|
|
75
|
+
<code style={{ fontSize: '0.8rem', color: 'var(--text-secondary)', fontFamily: 'monospace' }}>cubic-bezier(0,0,.2,1)</code>
|
|
76
|
+
</td>
|
|
77
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
|
|
78
|
+
Slides de entrada de bottom sheet, cards
|
|
79
|
+
</td>
|
|
80
|
+
</tr>
|
|
81
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
82
|
+
<td style={{ padding: '12px 16px' }}>
|
|
83
|
+
<code style={{ fontSize: '0.85rem', color: 'var(--text-primary)', backgroundColor: 'var(--bg-app)', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--duration-fast</code>
|
|
84
|
+
</td>
|
|
85
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>120ms</td>
|
|
86
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
|
|
87
|
+
Hover, press de botão, toggle
|
|
88
|
+
</td>
|
|
89
|
+
</tr>
|
|
90
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
91
|
+
<td style={{ padding: '12px 16px' }}>
|
|
92
|
+
<code style={{ fontSize: '0.85rem', color: 'var(--text-primary)', backgroundColor: 'var(--bg-app)', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--duration-base</code>
|
|
93
|
+
</td>
|
|
94
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>200ms</td>
|
|
95
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
|
|
96
|
+
Transição de estado de input, chips
|
|
97
|
+
</td>
|
|
98
|
+
</tr>
|
|
99
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
100
|
+
<td style={{ padding: '12px 16px' }}>
|
|
101
|
+
<code style={{ fontSize: '0.85rem', color: 'var(--text-primary)', backgroundColor: 'var(--bg-app)', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--duration-medium</code>
|
|
102
|
+
</td>
|
|
103
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>300ms</td>
|
|
104
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
|
|
105
|
+
Modal/sheet enter/exit, progress fill
|
|
106
|
+
</td>
|
|
107
|
+
</tr>
|
|
108
|
+
<tr>
|
|
109
|
+
<td style={{ padding: '12px 16px' }}>
|
|
110
|
+
<code style={{ fontSize: '0.85rem', color: 'var(--text-primary)', backgroundColor: 'var(--bg-app)', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--duration-slow</code>
|
|
111
|
+
</td>
|
|
112
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>500ms</td>
|
|
113
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
|
|
114
|
+
Transição de ecrã, celebração de conclusão
|
|
115
|
+
</td>
|
|
116
|
+
</tr>
|
|
117
|
+
</tbody>
|
|
118
|
+
</table>
|
|
119
|
+
</div>
|
|
120
|
+
|
|
121
|
+
### Demonstrador Interativo de Animações (Keyframes)
|
|
122
|
+
|
|
123
|
+
Veja abaixo as animações e loops oficiais do design system renderizados em tempo real:
|
|
124
|
+
|
|
125
|
+
<div style={{
|
|
126
|
+
display: 'grid',
|
|
127
|
+
gridTemplateColumns: 'repeat(auto-fill, minmax(220px, 1fr))',
|
|
128
|
+
gap: '1.5rem',
|
|
129
|
+
marginBottom: '2.5rem',
|
|
130
|
+
marginTop: '1.5rem'
|
|
131
|
+
}}>
|
|
132
|
+
{/* Bobbing Mascot */}
|
|
133
|
+
<div style={{
|
|
134
|
+
backgroundColor: 'var(--bg-surface)',
|
|
135
|
+
border: '1px solid var(--border-color)',
|
|
136
|
+
borderRadius: '12px',
|
|
137
|
+
padding: '1.5rem',
|
|
138
|
+
display: 'flex',
|
|
139
|
+
flexDirection: 'column',
|
|
140
|
+
alignItems: 'center',
|
|
141
|
+
justifyContent: 'center',
|
|
142
|
+
height: '180px',
|
|
143
|
+
}}>
|
|
144
|
+
<div className="animate-bob" style={{
|
|
145
|
+
width: '50px',
|
|
146
|
+
height: '50px',
|
|
147
|
+
backgroundColor: '#f2974b',
|
|
148
|
+
borderRadius: '12px',
|
|
149
|
+
display: 'flex',
|
|
150
|
+
alignItems: 'center',
|
|
151
|
+
justifyContent: 'center',
|
|
152
|
+
fontWeight: 'bold',
|
|
153
|
+
color: '#ffffff',
|
|
154
|
+
fontSize: '0.85rem',
|
|
155
|
+
boxShadow: 'var(--shadow-sm)',
|
|
156
|
+
}}>Vava</div>
|
|
157
|
+
<div className="animate-contact-shadow" style={{
|
|
158
|
+
width: '36px',
|
|
159
|
+
height: '6px',
|
|
160
|
+
backgroundColor: '#51332d',
|
|
161
|
+
borderRadius: '50%',
|
|
162
|
+
marginTop: '20px',
|
|
163
|
+
filter: 'blur(2px)',
|
|
164
|
+
}} />
|
|
165
|
+
<span style={{ fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', marginTop: '16px' }}>xtBob (Mascote Vava)</span>
|
|
166
|
+
</div>
|
|
167
|
+
|
|
168
|
+
{/* Popping Tooltip */}
|
|
169
|
+
<div style={{
|
|
170
|
+
backgroundColor: 'var(--bg-surface)',
|
|
171
|
+
border: '1px solid var(--border-color)',
|
|
172
|
+
borderRadius: '12px',
|
|
173
|
+
padding: '1.5rem',
|
|
174
|
+
display: 'flex',
|
|
175
|
+
flexDirection: 'column',
|
|
176
|
+
alignItems: 'center',
|
|
177
|
+
justifyContent: 'center',
|
|
178
|
+
height: '180px',
|
|
179
|
+
}}>
|
|
180
|
+
<div className="animate-pop" style={{
|
|
181
|
+
backgroundColor: 'var(--bg-app)',
|
|
182
|
+
border: '1px solid var(--border-color)',
|
|
183
|
+
padding: '8px 12px',
|
|
184
|
+
borderRadius: '8px',
|
|
185
|
+
fontSize: '0.75rem',
|
|
186
|
+
fontWeight: '700',
|
|
187
|
+
color: 'var(--text-primary)',
|
|
188
|
+
boxShadow: 'var(--shadow-xs)',
|
|
189
|
+
position: 'relative',
|
|
190
|
+
}}>
|
|
191
|
+
Tooltip Ativo
|
|
192
|
+
<div style={{
|
|
193
|
+
position: 'absolute',
|
|
194
|
+
bottom: '-6px',
|
|
195
|
+
left: '50%',
|
|
196
|
+
marginLeft: '-6px',
|
|
197
|
+
width: '0',
|
|
198
|
+
height: '0',
|
|
199
|
+
borderLeft: '6px solid transparent',
|
|
200
|
+
borderRight: '6px solid transparent',
|
|
201
|
+
borderTop: '6px solid var(--border-color)',
|
|
202
|
+
}} />
|
|
203
|
+
</div>
|
|
204
|
+
<span style={{ fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', marginTop: '36px' }}>xtPop (Tooltip do nó)</span>
|
|
205
|
+
</div>
|
|
206
|
+
|
|
207
|
+
{/* Streak Flame */}
|
|
208
|
+
<div style={{
|
|
209
|
+
backgroundColor: 'var(--bg-surface)',
|
|
210
|
+
border: '1px solid var(--border-color)',
|
|
211
|
+
borderRadius: '12px',
|
|
212
|
+
padding: '1.5rem',
|
|
213
|
+
display: 'flex',
|
|
214
|
+
flexDirection: 'column',
|
|
215
|
+
alignItems: 'center',
|
|
216
|
+
justifyContent: 'center',
|
|
217
|
+
height: '180px',
|
|
218
|
+
}}>
|
|
219
|
+
<div className="animate-flame" style={{
|
|
220
|
+
fontSize: '2rem',
|
|
221
|
+
}}>🔥</div>
|
|
222
|
+
<span style={{ fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', marginTop: '24px' }}>xtFlame (Ícone Streak)</span>
|
|
223
|
+
</div>
|
|
224
|
+
|
|
225
|
+
{/* Pulsing Map Ring */}
|
|
226
|
+
<div style={{
|
|
227
|
+
backgroundColor: 'var(--bg-surface)',
|
|
228
|
+
border: '1px solid var(--border-color)',
|
|
229
|
+
borderRadius: '12px',
|
|
230
|
+
padding: '1.5rem',
|
|
231
|
+
display: 'flex',
|
|
232
|
+
flexDirection: 'column',
|
|
233
|
+
alignItems: 'center',
|
|
234
|
+
justifyContent: 'center',
|
|
235
|
+
height: '180px',
|
|
236
|
+
}}>
|
|
237
|
+
<div style={{ position: 'relative', width: '20px', height: '20px' }}>
|
|
238
|
+
<div className="animate-ring" style={{
|
|
239
|
+
position: 'absolute',
|
|
240
|
+
width: '20px',
|
|
241
|
+
height: '20px',
|
|
242
|
+
borderRadius: '50%',
|
|
243
|
+
}} />
|
|
244
|
+
<div style={{
|
|
245
|
+
position: 'absolute',
|
|
246
|
+
width: '20px',
|
|
247
|
+
height: '20px',
|
|
248
|
+
borderRadius: '50%',
|
|
249
|
+
backgroundColor: '#f2974b',
|
|
250
|
+
boxShadow: 'var(--shadow-xs)',
|
|
251
|
+
}} />
|
|
252
|
+
</div>
|
|
253
|
+
<span style={{ fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', marginTop: '36px' }}>xtRing (Pulse do nó)</span>
|
|
254
|
+
</div>
|
|
255
|
+
</div>
|
|
256
|
+
|
|
257
|
+
<div style={{
|
|
258
|
+
backgroundColor: 'var(--bg-surface)',
|
|
259
|
+
border: '1px solid var(--border-color)',
|
|
260
|
+
borderRadius: '16px',
|
|
261
|
+
padding: '1.5rem',
|
|
262
|
+
boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03)',
|
|
263
|
+
marginBottom: '2.5rem'
|
|
264
|
+
}}>
|
|
265
|
+
<h4 style={{
|
|
266
|
+
fontFamily: 'var(--font-title)',
|
|
267
|
+
fontSize: '1rem',
|
|
268
|
+
fontWeight: '700',
|
|
269
|
+
color: 'var(--text-primary)',
|
|
270
|
+
marginTop: 0,
|
|
271
|
+
marginBottom: '1rem',
|
|
272
|
+
}}>Regras Gerais de Animação</h4>
|
|
273
|
+
|
|
274
|
+
<ol style={{ fontSize: '0.9rem', color: 'var(--text-primary)', paddingLeft: '1.2rem', lineHeight: '1.6' }}>
|
|
275
|
+
<li><strong>Preferir opacity + transform</strong> a layout shifts. Evite animar width/height diretamente para não forçar reflows de layout.</li>
|
|
276
|
+
<li><strong>Respeitar prefers-reduced-motion</strong>. Todas as animações web devem ser envolvidas em media queries condicionais (no-preference) para respeitar acessibilidade.</li>
|
|
277
|
+
<li><strong>Mascotes em loop suave</strong>. A flutuação da mascote e os pulsares de nós correm infinitamente de forma relaxante. Feedbacks de acerto/erro usam bursts rápidos (300-500ms) e param.</li>
|
|
278
|
+
<li><strong>Sombra de contacto inversa</strong>. A sombra da mascote deve contrair-se e reduzir a sua opacidade à medida que a mascote sobe no loop (e expandir-se/escurecer ao descer).</li>
|
|
279
|
+
</ol>
|
|
280
|
+
</div>
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## 📏 Breakpoints (Responsividade)
|
|
285
|
+
|
|
286
|
+
Adotamos a abordagem **Mobile-first**. Todos os estilos base e paddings são desenhados inicialmente para telas `xs` (375px) e escalados para cima utilizando media queries.
|
|
287
|
+
|
|
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
|
+
}}>Tabela de Breakpoints</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', width: '80px' }}>Nome</th>
|
|
315
|
+
<th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Min-Width</th>
|
|
316
|
+
<th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Contexto</th>
|
|
317
|
+
<th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Grelha / Layout</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: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>xs</code>
|
|
324
|
+
</td>
|
|
325
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>0px (base)</td>
|
|
326
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>Telemóvel pequeno (iPhone SE, Android compact)</td>
|
|
327
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>4 colunas · Gutter 16px</td>
|
|
328
|
+
</tr>
|
|
329
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
330
|
+
<td style={{ padding: '12px 16px' }}>
|
|
331
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>sm</code>
|
|
332
|
+
</td>
|
|
333
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>375px</td>
|
|
334
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>Telemóvel padrão (iPhone 14, Pixel 7)</td>
|
|
335
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>4 colunas · Gutter 20px</td>
|
|
336
|
+
</tr>
|
|
337
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
338
|
+
<td style={{ padding: '12px 16px' }}>
|
|
339
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>md</code>
|
|
340
|
+
</td>
|
|
341
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>430px</td>
|
|
342
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>Telemóvel grande (iPhone 14 Plus, Pro Max)</td>
|
|
343
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>4 colunas · Gutter 22px</td>
|
|
344
|
+
</tr>
|
|
345
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
346
|
+
<td style={{ padding: '12px 16px' }}>
|
|
347
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>lg</code>
|
|
348
|
+
</td>
|
|
349
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>768px</td>
|
|
350
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>Tablet (iPad portrait, Surface)</td>
|
|
351
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>8 colunas · Gutter 24px · Margem 32px</td>
|
|
352
|
+
</tr>
|
|
353
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
354
|
+
<td style={{ padding: '12px 16px' }}>
|
|
355
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>xl</code>
|
|
356
|
+
</td>
|
|
357
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>1024px</td>
|
|
358
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>Desktop pequeno / laptop</td>
|
|
359
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>12 colunas · Gutter 24px · Margem 48px</td>
|
|
360
|
+
</tr>
|
|
361
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
362
|
+
<td style={{ padding: '12px 16px' }}>
|
|
363
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>2xl</code>
|
|
364
|
+
</td>
|
|
365
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>1280px</td>
|
|
366
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>Desktop padrão</td>
|
|
367
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>12 colunas · Gutter 28px · Margem 64px · Max-width 1200px</td>
|
|
368
|
+
</tr>
|
|
369
|
+
<tr>
|
|
370
|
+
<td style={{ padding: '12px 16px' }}>
|
|
371
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>3xl</code>
|
|
372
|
+
</td>
|
|
373
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>1440px</td>
|
|
374
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>Desktop largo</td>
|
|
375
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>12 colunas · Conteúdo max-width 1200px centrado</td>
|
|
376
|
+
</tr>
|
|
377
|
+
</tbody>
|
|
378
|
+
</table>
|
|
379
|
+
</div>
|
package/src/Spacing.mdx
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { Meta } from '@storybook/addon-docs/blocks';
|
|
2
|
+
|
|
3
|
+
<Meta title="Brand Guidelines/Espaçamento" />
|
|
4
|
+
|
|
5
|
+
# Espaçamento
|
|
6
|
+
|
|
7
|
+
O nosso sistema de espaçamento é construído sobre uma **base de 4px**. Todos os paddings, margens e gaps entre elementos devem ser múltiplos desta base para manter o ritmo vertical e consistência visual.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
{/* Escala de Espaçamento */}
|
|
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
|
+
}}>Escala de Espaçamento</h3>
|
|
29
|
+
|
|
30
|
+
<table style={{
|
|
31
|
+
width: '100%',
|
|
32
|
+
borderCollapse: 'collapse',
|
|
33
|
+
textAlign: 'left'
|
|
34
|
+
}}>
|
|
35
|
+
<thead>
|
|
36
|
+
<tr style={{
|
|
37
|
+
borderBottom: '2px solid var(--border-color)',
|
|
38
|
+
}}>
|
|
39
|
+
<th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Token</th>
|
|
40
|
+
<th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Valor</th>
|
|
41
|
+
<th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em', width: '120px' }}>Visual</th>
|
|
42
|
+
<th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Uso Típico</th>
|
|
43
|
+
</tr>
|
|
44
|
+
</thead>
|
|
45
|
+
<tbody>
|
|
46
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
47
|
+
<td style={{ padding: '12px 16px' }}>
|
|
48
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--space-1</code>
|
|
49
|
+
</td>
|
|
50
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>4px</td>
|
|
51
|
+
<td style={{ padding: '12px 16px' }}>
|
|
52
|
+
<div style={{ width: '4px', height: '16px', backgroundColor: '#f2974b', borderRadius: '2px' }} />
|
|
53
|
+
</td>
|
|
54
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
|
|
55
|
+
Micro-gaps, ícone + label
|
|
56
|
+
</td>
|
|
57
|
+
</tr>
|
|
58
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
59
|
+
<td style={{ padding: '12px 16px' }}>
|
|
60
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--space-2</code>
|
|
61
|
+
</td>
|
|
62
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>8px</td>
|
|
63
|
+
<td style={{ padding: '12px 16px' }}>
|
|
64
|
+
<div style={{ width: '8px', height: '16px', backgroundColor: '#f2974b', borderRadius: '2px' }} />
|
|
65
|
+
</td>
|
|
66
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
|
|
67
|
+
Gap interno de chips, botões pequenos
|
|
68
|
+
</td>
|
|
69
|
+
</tr>
|
|
70
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
71
|
+
<td style={{ padding: '12px 16px' }}>
|
|
72
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--space-3</code>
|
|
73
|
+
</td>
|
|
74
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>12px</td>
|
|
75
|
+
<td style={{ padding: '12px 16px' }}>
|
|
76
|
+
<div style={{ width: '12px', height: '16px', backgroundColor: '#f2974b', borderRadius: '2px' }} />
|
|
77
|
+
</td>
|
|
78
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
|
|
79
|
+
Padding horizontal de tags, gap de ícone em botão
|
|
80
|
+
</td>
|
|
81
|
+
</tr>
|
|
82
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
83
|
+
<td style={{ padding: '12px 16px' }}>
|
|
84
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--space-4</code>
|
|
85
|
+
</td>
|
|
86
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>16px</td>
|
|
87
|
+
<td style={{ padding: '12px 16px' }}>
|
|
88
|
+
<div style={{ width: '16px', height: '16px', backgroundColor: '#f2974b', borderRadius: '2px' }} />
|
|
89
|
+
</td>
|
|
90
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
|
|
91
|
+
Padding base de cards, margens de lista
|
|
92
|
+
</td>
|
|
93
|
+
</tr>
|
|
94
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
95
|
+
<td style={{ padding: '12px 16px' }}>
|
|
96
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--space-5</code>
|
|
97
|
+
</td>
|
|
98
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>20px</td>
|
|
99
|
+
<td style={{ padding: '12px 16px' }}>
|
|
100
|
+
<div style={{ width: '20px', height: '16px', backgroundColor: '#f2974b', borderRadius: '2px' }} />
|
|
101
|
+
</td>
|
|
102
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
|
|
103
|
+
Padding interno de modal, gap entre secções de card
|
|
104
|
+
</td>
|
|
105
|
+
</tr>
|
|
106
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
107
|
+
<td style={{ padding: '12px 16px' }}>
|
|
108
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--space-6</code>
|
|
109
|
+
</td>
|
|
110
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>24px</td>
|
|
111
|
+
<td style={{ padding: '12px 16px' }}>
|
|
112
|
+
<div style={{ width: '24px', height: '16px', backgroundColor: '#f2974b', borderRadius: '2px' }} />
|
|
113
|
+
</td>
|
|
114
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
|
|
115
|
+
Padding horizontal de ecrã (mobile), gap de stack
|
|
116
|
+
</td>
|
|
117
|
+
</tr>
|
|
118
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
119
|
+
<td style={{ padding: '12px 16px' }}>
|
|
120
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--space-8</code>
|
|
121
|
+
</td>
|
|
122
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>32px</td>
|
|
123
|
+
<td style={{ padding: '12px 16px' }}>
|
|
124
|
+
<div style={{ width: '32px', height: '16px', backgroundColor: '#f2974b', borderRadius: '2px' }} />
|
|
125
|
+
</td>
|
|
126
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
|
|
127
|
+
Padding de bottom sheet, gap de secções
|
|
128
|
+
</td>
|
|
129
|
+
</tr>
|
|
130
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
131
|
+
<td style={{ padding: '12px 16px' }}>
|
|
132
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--space-10</code>
|
|
133
|
+
</td>
|
|
134
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>40px</td>
|
|
135
|
+
<td style={{ padding: '12px 16px' }}>
|
|
136
|
+
<div style={{ width: '40px', height: '16px', backgroundColor: '#f2974b', borderRadius: '2px' }} />
|
|
137
|
+
</td>
|
|
138
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
|
|
139
|
+
Padding de bottom safe area, margens de página
|
|
140
|
+
</td>
|
|
141
|
+
</tr>
|
|
142
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
143
|
+
<td style={{ padding: '12px 16px' }}>
|
|
144
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--space-12</code>
|
|
145
|
+
</td>
|
|
146
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>48px</td>
|
|
147
|
+
<td style={{ padding: '12px 16px' }}>
|
|
148
|
+
<div style={{ width: '48px', height: '16px', backgroundColor: '#f2974b', borderRadius: '2px' }} />
|
|
149
|
+
</td>
|
|
150
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
|
|
151
|
+
Padding horizontal desktop, gap de seções grandes
|
|
152
|
+
</td>
|
|
153
|
+
</tr>
|
|
154
|
+
<tr>
|
|
155
|
+
<td style={{ padding: '12px 16px' }}>
|
|
156
|
+
<code style={{ fontSize: '0.85rem', color: '#cf7a30', backgroundColor: '#fef6ee', padding: '4px 8px', borderRadius: '6px', fontWeight: '600' }}>--space-16</code>
|
|
157
|
+
</td>
|
|
158
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>64px</td>
|
|
159
|
+
<td style={{ padding: '12px 16px' }}>
|
|
160
|
+
<div style={{ width: '64px', height: '16px', backgroundColor: '#f2974b', borderRadius: '2px' }} />
|
|
161
|
+
</td>
|
|
162
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>
|
|
163
|
+
Margens de página desktop, separadores de bloco
|
|
164
|
+
</td>
|
|
165
|
+
</tr>
|
|
166
|
+
</tbody>
|
|
167
|
+
</table>
|
|
168
|
+
</div>
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## Regras de Aplicação
|
|
173
|
+
|
|
174
|
+
Essas regras detalham o espaçamento padrão e comportamento de layout em diferentes contextos:
|
|
175
|
+
|
|
176
|
+
<div style={{
|
|
177
|
+
backgroundColor: 'var(--bg-surface)',
|
|
178
|
+
border: '1px solid var(--border-color)',
|
|
179
|
+
borderRadius: '16px',
|
|
180
|
+
padding: '1.5rem',
|
|
181
|
+
boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03)',
|
|
182
|
+
marginBottom: '2.5rem'
|
|
183
|
+
}}>
|
|
184
|
+
<table style={{
|
|
185
|
+
width: '100%',
|
|
186
|
+
borderCollapse: 'collapse',
|
|
187
|
+
textAlign: 'left'
|
|
188
|
+
}}>
|
|
189
|
+
<thead>
|
|
190
|
+
<tr style={{
|
|
191
|
+
borderBottom: '2px solid var(--border-color)',
|
|
192
|
+
}}>
|
|
193
|
+
<th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Contexto</th>
|
|
194
|
+
<th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Mobile</th>
|
|
195
|
+
<th style={{ padding: '10px 16px', fontSize: '0.75rem', fontWeight: '700', color: 'var(--text-secondary)', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Desktop</th>
|
|
196
|
+
</tr>
|
|
197
|
+
</thead>
|
|
198
|
+
<tbody>
|
|
199
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
200
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', fontWeight: '600', color: 'var(--text-primary)' }}>Padding lateral da página</td>
|
|
201
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>16-22px (<code style={{ fontSize: '0.8rem' }}>--space-4</code> / <code style={{ fontSize: '0.8rem' }}>--space-6</code>)</td>
|
|
202
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>48px (<code style={{ fontSize: '0.8rem' }}>--space-12</code>)</td>
|
|
203
|
+
</tr>
|
|
204
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
205
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', fontWeight: '600', color: 'var(--text-primary)' }}>Padding interno de card</td>
|
|
206
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>14-16px</td>
|
|
207
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>20-24px</td>
|
|
208
|
+
</tr>
|
|
209
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
210
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', fontWeight: '600', color: 'var(--text-primary)' }}>Gap entre cards numa lista</td>
|
|
211
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>12px</td>
|
|
212
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>16px</td>
|
|
213
|
+
</tr>
|
|
214
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
215
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', fontWeight: '600', color: 'var(--text-primary)' }}>Gap entre elementos de formulário</td>
|
|
216
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>12px</td>
|
|
217
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>16px</td>
|
|
218
|
+
</tr>
|
|
219
|
+
<tr style={{ borderBottom: '1px solid var(--border-color)' }}>
|
|
220
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', fontWeight: '600', color: 'var(--text-primary)' }}>Padding do botão primário (lg)</td>
|
|
221
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>15px v · 22px h</td>
|
|
222
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>16px v · 32px h</td>
|
|
223
|
+
</tr>
|
|
224
|
+
<tr>
|
|
225
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', fontWeight: '600', color: 'var(--text-primary)' }}>Height mínimo de touch target</td>
|
|
226
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)', fontWeight: 'bold' }}>44px (Mínimo a11y)</td>
|
|
227
|
+
<td style={{ padding: '12px 16px', fontSize: '0.9rem', color: 'var(--text-primary)' }}>36px</td>
|
|
228
|
+
</tr>
|
|
229
|
+
</tbody>
|
|
230
|
+
</table>
|
|
231
|
+
</div>
|