@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,334 @@
|
|
|
1
|
+
import type { CSSProperties } from 'react';
|
|
2
|
+
|
|
3
|
+
export interface FlagProps {
|
|
4
|
+
countryCode: string;
|
|
5
|
+
size?: number;
|
|
6
|
+
style?: CSSProperties;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const normalizeCountryCode = (input: string): string => {
|
|
10
|
+
const code = input.toLowerCase().trim();
|
|
11
|
+
|
|
12
|
+
if (code === 'fr' || code === 'fra' || code === 'frança' || code === 'france') return 'FR';
|
|
13
|
+
if (code === 'be' || code === 'bel' || code === 'bélgica' || code === 'belgium') return 'BE';
|
|
14
|
+
if (code === 'ch' || code === 'che' || code === 'suíça' || code === 'switzerland') return 'CH';
|
|
15
|
+
if (code === 'lu' || code === 'lux' || code === 'luxemburgo' || code === 'luxembourg') return 'LU';
|
|
16
|
+
if (code === 'mc' || code === 'mco' || code === 'mónaco' || code === 'monaco') return 'MC';
|
|
17
|
+
if (code === 'ca' || code === 'can' || code === 'canadá' || code === 'canada') return 'CA';
|
|
18
|
+
if (code === 'ci' || code === 'civ' || code === "côte d'ivoire" || code === "cote d'ivoire" || code === 'marfim' || code === 'costa do marfim') return 'CI';
|
|
19
|
+
if (code === 'sn' || code === 'sen' || code === 'senegal') return 'SN';
|
|
20
|
+
if (code === 'cm' || code === 'cmr' || code === 'camarões' || code === 'cameroon') return 'CM';
|
|
21
|
+
if (code === 'cd' || code === 'cod' || code === 'rd congo' || code === 'republica democratica do congo' || code === 'república democrática do congo' || code === 'dr congo') return 'CD';
|
|
22
|
+
if (code === 'mg' || code === 'mdg' || code === 'madagascar') return 'MG';
|
|
23
|
+
if (code === 'bf' || code === 'bfa' || code === 'burkina faso') return 'BF';
|
|
24
|
+
if (code === 'ne' || code === 'ner' || code === 'níger' || code === 'niger') return 'NE';
|
|
25
|
+
if (code === 'ml' || code === 'mli' || code === 'mali') return 'ML';
|
|
26
|
+
if (code === 'td' || code === 'tcd' || code === 'chade' || code === 'chad') return 'TD';
|
|
27
|
+
if (code === 'gn' || code === 'gin' || code === 'guiné' || code === 'guinea') return 'GN';
|
|
28
|
+
if (code === 'rw' || code === 'rwa' || code === 'ruanda' || code === 'rwanda') return 'RW';
|
|
29
|
+
if (code === 'bi' || code === 'bdi' || code === 'burundi') return 'BI';
|
|
30
|
+
if (code === 'bj' || code === 'ben' || code === 'benim' || code === 'benin') return 'BJ';
|
|
31
|
+
if (code === 'tg' || code === 'tgo' || code === 'togo') return 'TG';
|
|
32
|
+
if (code === 'cf' || code === 'caf' || code === 'república centro-africana' || code === 'republica centro-africana' || code === 'central african republic') return 'CF';
|
|
33
|
+
if (code === 'cg' || code === 'cog' || code === 'congo' || code === 'república do congo' || code === 'republica do congo') return 'CG';
|
|
34
|
+
if (code === 'ga' || code === 'gab' || code === 'gabão' || code === 'gabon') return 'GA';
|
|
35
|
+
if (code === 'gq' || code === 'gnq' || code === 'guiné equatorial' || code === 'guine equatorial' || code === 'equatorial guinea') return 'GQ';
|
|
36
|
+
if (code === 'dj' || code === 'dji' || code === 'djibouti') return 'DJ';
|
|
37
|
+
if (code === 'km' || code === 'com' || code === 'comores' || code === 'comoros') return 'KM';
|
|
38
|
+
if (code === 'vu' || code === 'vut' || code === 'vanuatu') return 'VU';
|
|
39
|
+
if (code === 'sc' || code === 'syc' || code === 'seychelles') return 'SC';
|
|
40
|
+
if (code === 'ht' || code === 'hti' || code === 'haiti') return 'HT';
|
|
41
|
+
|
|
42
|
+
return 'UNKNOWN';
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export const Flag = ({ countryCode, size = 40, style }: FlagProps) => {
|
|
46
|
+
const normalized = normalizeCountryCode(countryCode);
|
|
47
|
+
|
|
48
|
+
const renderFlagContent = () => {
|
|
49
|
+
switch (normalized) {
|
|
50
|
+
case 'FR': // França
|
|
51
|
+
return (
|
|
52
|
+
<>
|
|
53
|
+
<path fill="#00209F" d="M0 0h170.7v512H0z"/>
|
|
54
|
+
<path fill="#fff" d="M170.7 0h170.6v512H170.7z"/>
|
|
55
|
+
<path fill="#E8001F" d="M341.3 0H512v512H341.3z"/>
|
|
56
|
+
</>
|
|
57
|
+
);
|
|
58
|
+
case 'BE': // Bélgica
|
|
59
|
+
return (
|
|
60
|
+
<>
|
|
61
|
+
<path fill="#000" d="M0 0h170.7v512H0z"/>
|
|
62
|
+
<path fill="#FFE300" d="M170.7 0h170.6v512H170.7z"/>
|
|
63
|
+
<path fill="#E8001F" d="M341.3 0H512v512H341.3z"/>
|
|
64
|
+
</>
|
|
65
|
+
);
|
|
66
|
+
case 'CH': // Suíça
|
|
67
|
+
return (
|
|
68
|
+
<>
|
|
69
|
+
<path fill="#d52b1e" d="M0 0h512v512H0z"/>
|
|
70
|
+
<path fill="#fff" d="M236 116h40v280h-40zM116 236h280v-40H116z"/>
|
|
71
|
+
</>
|
|
72
|
+
);
|
|
73
|
+
case 'LU': // Luxemburgo
|
|
74
|
+
return (
|
|
75
|
+
<>
|
|
76
|
+
<path fill="#E8001F" d="M0 0h512v170.7H0z"/>
|
|
77
|
+
<path fill="#fff" d="M0 170.7h512v170.6H0z"/>
|
|
78
|
+
<path fill="#419ad6" d="M0 341.3h512V512H0z"/>
|
|
79
|
+
</>
|
|
80
|
+
);
|
|
81
|
+
case 'MC': // Mónaco
|
|
82
|
+
return (
|
|
83
|
+
<>
|
|
84
|
+
<path fill="#E8001F" d="M0 0h512v256H0z"/>
|
|
85
|
+
<path fill="#fff" d="M0 256h512v256H0z"/>
|
|
86
|
+
</>
|
|
87
|
+
);
|
|
88
|
+
case 'CA': // Canadá
|
|
89
|
+
return (
|
|
90
|
+
<>
|
|
91
|
+
<path fill="#fff" d="M128 0h256v512H128z"/>
|
|
92
|
+
<path fill="#d52b1e" d="M0 0h128v512H0zm384 0h128v512H384z"/>
|
|
93
|
+
<path fill="#d52b1e" d="M135.3 247.4l-14 4.8 65.4 57.5c5 14.8-1.7 19.1-6 26.9l71-9-1.8 71.5 14.8-.5-3.3-70.9 71.2 8.4c-4.4-9.3-8.3-14.2-4.3-29l65.4-54.5-11.4-4.1c-9.4-7.3 4-34.8 6-52.2 0 0-38.1 13.1-40.6 6.2l-9.9-18.5-34.6 38c-3.8 1-5.4-.6-6.3-3.8l16-79.7-25.4 14.3q-3.3 1.3-5.6-2.4l-24.5-49-25.2 50.9q-3 2.7-5.4.8l-24.2-13.6 14.5 79.2c-1.1 3-3.9 4-7.1 2.3l-33.3-37.8c-4.3 7-7.3 18.4-13 21-5.7 2.3-25-4.9-37.9-7.7 4.4 15.9 18.2 42.3 9.5 51z"/>
|
|
94
|
+
</>
|
|
95
|
+
);
|
|
96
|
+
case 'CI': // Côte d'Ivoire
|
|
97
|
+
return (
|
|
98
|
+
<>
|
|
99
|
+
<path fill="#F77F00" d="M0 0h170.7v512H0z"/>
|
|
100
|
+
<path fill="#fff" d="M170.7 0h170.6v512H170.7z"/>
|
|
101
|
+
<path fill="#009E60" d="M341.3 0H512v512H341.3z"/>
|
|
102
|
+
</>
|
|
103
|
+
);
|
|
104
|
+
case 'SN': // Senegal
|
|
105
|
+
return (
|
|
106
|
+
<>
|
|
107
|
+
<path fill="#00E070" d="M0 0h170.7v512H0z"/>
|
|
108
|
+
<path fill="#FFDC00" d="M170.7 0h170.6v512H170.7z"/>
|
|
109
|
+
<path fill="#E8001F" d="M341.3 0H512v512H341.3z"/>
|
|
110
|
+
<path fill="#00E070" d="M256 180l16 48h50l-40 30 15 48-41-30-41 30 15-48-40-30h50z"/>
|
|
111
|
+
</>
|
|
112
|
+
);
|
|
113
|
+
case 'CM': // Camarões
|
|
114
|
+
return (
|
|
115
|
+
<>
|
|
116
|
+
<path fill="#00E070" d="M0 0h170.7v512H0z"/>
|
|
117
|
+
<path fill="#E8001F" d="M170.7 0h170.6v512H170.7z"/>
|
|
118
|
+
<path fill="#FFE300" d="M341.3 0H512v512H341.3z"/>
|
|
119
|
+
<path fill="#FFE300" d="M256 180l16 48h50l-40 30 15 48-41-30-41 30 15-48-40-30h50z"/>
|
|
120
|
+
</>
|
|
121
|
+
);
|
|
122
|
+
case 'CD': // RD Congo
|
|
123
|
+
return (
|
|
124
|
+
<>
|
|
125
|
+
<path fill="#00A3E0" d="M0 0h512v512H0z"/>
|
|
126
|
+
<path fill="#FFDC00" d="M0 400L400 0h70L0 470z"/>
|
|
127
|
+
<path fill="#E8001F" d="M0 415L415 0h40L0 455z"/>
|
|
128
|
+
<path fill="#FFDC00" d="M70 60l8 24h25l-20 15 8 24-21-15-21 15 8-24-20-15h25z"/>
|
|
129
|
+
</>
|
|
130
|
+
);
|
|
131
|
+
case 'MG': // Madagascar
|
|
132
|
+
return (
|
|
133
|
+
<>
|
|
134
|
+
<path fill="#fff" d="M0 0h170.7v512H0z"/>
|
|
135
|
+
<path fill="#E8001F" d="M170.7 0H512v256H170.7z"/>
|
|
136
|
+
<path fill="#009E60" d="M170.7 256H512v256H170.7z"/>
|
|
137
|
+
</>
|
|
138
|
+
);
|
|
139
|
+
case 'BF': // Burkina Faso
|
|
140
|
+
return (
|
|
141
|
+
<>
|
|
142
|
+
<path fill="#E8001F" d="M0 0h512v256H0z"/>
|
|
143
|
+
<path fill="#009E60" d="M0 256h512v256H0z"/>
|
|
144
|
+
<path fill="#FFDC00" d="M256 210l10 30h32l-26 18 10 30-26-18-26 18 10-30-26-18h32z"/>
|
|
145
|
+
</>
|
|
146
|
+
);
|
|
147
|
+
case 'NE': // Níger
|
|
148
|
+
return (
|
|
149
|
+
<>
|
|
150
|
+
<path fill="#F77F00" d="M0 0h512v170.7H0z"/>
|
|
151
|
+
<path fill="#fff" d="M0 170.7h512v170.6H0z"/>
|
|
152
|
+
<path fill="#009E60" d="M0 341.3h512V512H0z"/>
|
|
153
|
+
<circle cx="256" cy="256" r="50" fill="#F77F00"/>
|
|
154
|
+
</>
|
|
155
|
+
);
|
|
156
|
+
case 'ML': // Mali
|
|
157
|
+
return (
|
|
158
|
+
<>
|
|
159
|
+
<path fill="#00E070" d="M0 0h170.7v512H0z"/>
|
|
160
|
+
<path fill="#FFDC00" d="M170.7 0h170.6v512H170.7z"/>
|
|
161
|
+
<path fill="#E8001F" d="M341.3 0H512v512H341.3z"/>
|
|
162
|
+
</>
|
|
163
|
+
);
|
|
164
|
+
case 'TD': // Chade
|
|
165
|
+
return (
|
|
166
|
+
<>
|
|
167
|
+
<path fill="#00209F" d="M0 0h170.7v512H0z"/>
|
|
168
|
+
<path fill="#FFDC00" d="M170.7 0h170.6v512H170.7z"/>
|
|
169
|
+
<path fill="#E8001F" d="M341.3 0H512v512H341.3z"/>
|
|
170
|
+
</>
|
|
171
|
+
);
|
|
172
|
+
case 'GN': // Guiné
|
|
173
|
+
return (
|
|
174
|
+
<>
|
|
175
|
+
<path fill="#E8001F" d="M0 0h170.7v512H0z"/>
|
|
176
|
+
<path fill="#FFDC00" d="M170.7 0h170.6v512H170.7z"/>
|
|
177
|
+
<path fill="#00E070" d="M341.3 0H512v512H341.3z"/>
|
|
178
|
+
</>
|
|
179
|
+
);
|
|
180
|
+
case 'RW': // Ruanda
|
|
181
|
+
return (
|
|
182
|
+
<>
|
|
183
|
+
<path fill="#00A3E0" d="M0 0h512v256H0z"/>
|
|
184
|
+
<path fill="#FFDC00" d="M0 256h512v128H0z"/>
|
|
185
|
+
<path fill="#009E60" d="M0 384h512v128H0z"/>
|
|
186
|
+
<circle cx="400" cy="80" r="30" fill="#FFDC00"/>
|
|
187
|
+
</>
|
|
188
|
+
);
|
|
189
|
+
case 'BI': // Burundi
|
|
190
|
+
return (
|
|
191
|
+
<>
|
|
192
|
+
<path fill="#E8001F" d="M0 0h512v512H0z"/>
|
|
193
|
+
<path fill="#009E60" d="M0 0l256 256L0 512zm512 0L256 256l256 256z"/>
|
|
194
|
+
<path d="M0 0l512 512M0 512l512-512" stroke="#fff" strokeWidth="40"/>
|
|
195
|
+
<circle cx="256" cy="256" r="80" fill="#fff"/>
|
|
196
|
+
<circle cx="256" cy="225" r="10" fill="#e8001f" stroke="#009e60" strokeWidth="2"/>
|
|
197
|
+
<circle cx="226" cy="275" r="10" fill="#e8001f" stroke="#009e60" strokeWidth="2"/>
|
|
198
|
+
<circle cx="286" cy="275" r="10" fill="#e8001f" stroke="#009e60" strokeWidth="2"/>
|
|
199
|
+
</>
|
|
200
|
+
);
|
|
201
|
+
case 'BJ': // Benim
|
|
202
|
+
return (
|
|
203
|
+
<>
|
|
204
|
+
<path fill="#00E070" d="M0 0h192v512H0z"/>
|
|
205
|
+
<path fill="#FFDC00" d="M192 0h320v256H192z"/>
|
|
206
|
+
<path fill="#E8001F" d="M192 256h320v256H192z"/>
|
|
207
|
+
</>
|
|
208
|
+
);
|
|
209
|
+
case 'TG': // Togo
|
|
210
|
+
return (
|
|
211
|
+
<>
|
|
212
|
+
<path fill="#FFDC00" d="M0 0h512v512H0z"/>
|
|
213
|
+
<path fill="#009E60" d="M0 0h512v102.4H0zm0 204.8h512v102.4H0zm0 204.8h512v102.4H0z"/>
|
|
214
|
+
<path fill="#E8001F" d="M0 0h204.8v204.8H0z"/>
|
|
215
|
+
<path fill="#fff" d="M102.4 75l10 30h32l-26 18 10 30-26-18-26 18 10-30-26-18h32z"/>
|
|
216
|
+
</>
|
|
217
|
+
);
|
|
218
|
+
case 'CF': // Rep. Centro-Africana
|
|
219
|
+
return (
|
|
220
|
+
<>
|
|
221
|
+
<path fill="#00209F" d="M0 0h512v128H0z"/>
|
|
222
|
+
<path fill="#fff" d="M0 128h512v128H0z"/>
|
|
223
|
+
<path fill="#009E60" d="M0 256h512v128H0z"/>
|
|
224
|
+
<path fill="#FFDC00" d="M0 384h512v128H0z"/>
|
|
225
|
+
<path fill="#E8001F" d="M213.3 0h85.4v512h-85.4z"/>
|
|
226
|
+
<path fill="#FFDC00" d="M60 25l6 18h19l-15 11 6 18-15-11-15 11 6-18-15-11h19z"/>
|
|
227
|
+
</>
|
|
228
|
+
);
|
|
229
|
+
case 'CG': // Congo
|
|
230
|
+
return (
|
|
231
|
+
<>
|
|
232
|
+
<path fill="#FFDC00" d="M0 0h512v512H0z"/>
|
|
233
|
+
<path fill="#009E60" d="M0 0h341.3L0 341.3z"/>
|
|
234
|
+
<path fill="#E8001F" d="M512 512L170.7 512L512 170.7z"/>
|
|
235
|
+
</>
|
|
236
|
+
);
|
|
237
|
+
case 'GA': // Gabão
|
|
238
|
+
return (
|
|
239
|
+
<>
|
|
240
|
+
<path fill="#00E070" d="M0 0h512v170.7H0z"/>
|
|
241
|
+
<path fill="#FFDC00" d="M0 170.7h512v170.6H0z"/>
|
|
242
|
+
<path fill="#00209F" d="M0 341.3h512V512H0z"/>
|
|
243
|
+
</>
|
|
244
|
+
);
|
|
245
|
+
case 'GQ': // Guiné Equatorial
|
|
246
|
+
return (
|
|
247
|
+
<>
|
|
248
|
+
<path fill="#009E60" d="M0 0h512v170.7H0z"/>
|
|
249
|
+
<path fill="#fff" d="M0 170.7h512v170.6H0z"/>
|
|
250
|
+
<path fill="#E8001F" d="M0 341.3h512V512H0z"/>
|
|
251
|
+
<path fill="#00A3E0" d="M0 0l170.7 256L0 512z"/>
|
|
252
|
+
<path fill="#888" d="M246 236h20v40h-20z"/>
|
|
253
|
+
<path fill="#009E60" d="M256 216c5 0 5 15 5 20h-10c0-5 0-20 5-20z"/>
|
|
254
|
+
</>
|
|
255
|
+
);
|
|
256
|
+
case 'DJ': // Djibouti
|
|
257
|
+
return (
|
|
258
|
+
<>
|
|
259
|
+
<path fill="#00A3E0" d="M0 0h512v256H0z"/>
|
|
260
|
+
<path fill="#009E60" d="M0 256h512v256H0z"/>
|
|
261
|
+
<path fill="#fff" d="M0 0l216 256L0 512z"/>
|
|
262
|
+
<path fill="#E8001F" d="M70 230l5 15h16l-13 9 5 15-13-9-13 9 5-15-13-9h16z"/>
|
|
263
|
+
</>
|
|
264
|
+
);
|
|
265
|
+
case 'KM': // Comores
|
|
266
|
+
return (
|
|
267
|
+
<>
|
|
268
|
+
<path fill="#FFDC00" d="M0 0h512v128H0z"/>
|
|
269
|
+
<path fill="#fff" d="M0 128h512v128H0z"/>
|
|
270
|
+
<path fill="#E8001F" d="M0 256h512v128H0z"/>
|
|
271
|
+
<path fill="#00209F" d="M0 384h512v128H0z"/>
|
|
272
|
+
<path fill="#009E60" d="M0 0l216 256L0 512z"/>
|
|
273
|
+
<path fill="#fff" d="M45 220c15 0 25 15 25 36s-10 36-25 36c20 0 30-15 30-36s-10-36-30-36z"/>
|
|
274
|
+
<circle cx="76" cy="211" r="3" fill="#fff"/>
|
|
275
|
+
<circle cx="79" cy="236" r="3" fill="#fff"/>
|
|
276
|
+
<circle cx="79" cy="261" r="3" fill="#fff"/>
|
|
277
|
+
<circle cx="76" cy="286" r="3" fill="#fff"/>
|
|
278
|
+
</>
|
|
279
|
+
);
|
|
280
|
+
case 'VU': // Vanuatu
|
|
281
|
+
return (
|
|
282
|
+
<>
|
|
283
|
+
<path fill="#E8001F" d="M0 0h512v256H0z"/>
|
|
284
|
+
<path fill="#009E60" d="M0 256h512v256H0z"/>
|
|
285
|
+
<path fill="#FFDC00" d="M0 0l250 256L0 512z"/>
|
|
286
|
+
<path fill="#000" d="M0 30l210 226L0 482z"/>
|
|
287
|
+
<path fill="#FFDC00" d="M220 240h292v32H220z"/>
|
|
288
|
+
<path fill="#000" d="M230 246h282v20H230z"/>
|
|
289
|
+
<circle cx="65" cy="256" r="30" fill="none" stroke="#FFDC00" strokeWidth="6" strokeDasharray="140 50"/>
|
|
290
|
+
</>
|
|
291
|
+
);
|
|
292
|
+
case 'SC': // Seychelles
|
|
293
|
+
return (
|
|
294
|
+
<>
|
|
295
|
+
<path fill="#00209F" d="M0 512L0 0h170.7z"/>
|
|
296
|
+
<path fill="#FFDC00" d="M0 512L170.7 0h170.6z"/>
|
|
297
|
+
<path fill="#E8001F" d="M0 512L341.3 0H512v170.7z"/>
|
|
298
|
+
<path fill="#fff" d="M0 512L512 170.7v170.6z"/>
|
|
299
|
+
<path fill="#009E60" d="M0 512L512 341.3V512z"/>
|
|
300
|
+
</>
|
|
301
|
+
);
|
|
302
|
+
case 'HT': // Haiti
|
|
303
|
+
return (
|
|
304
|
+
<>
|
|
305
|
+
<path fill="#00209F" d="M0 0h512v256H0z"/>
|
|
306
|
+
<path fill="#E8001F" d="M0 256h512v256H0z"/>
|
|
307
|
+
<path fill="#fff" d="M220 220h72v72H220z"/>
|
|
308
|
+
<path fill="#51332d" d="M253 235h6v20h-6z"/>
|
|
309
|
+
<path fill="#009E60" d="M256 235c-8-6-15 4-15 4s7 3 15-4zm0 0c8-6 15 4 15 4s-7 3-15-4z"/>
|
|
310
|
+
</>
|
|
311
|
+
);
|
|
312
|
+
default: // Fallback gray
|
|
313
|
+
return (
|
|
314
|
+
<path fill="#ccc" d="M0 0h512v512H0z"/>
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
return (
|
|
320
|
+
<svg
|
|
321
|
+
width={size}
|
|
322
|
+
height={size}
|
|
323
|
+
viewBox="0 0 512 512"
|
|
324
|
+
style={{
|
|
325
|
+
display: 'block',
|
|
326
|
+
borderRadius: size / 2,
|
|
327
|
+
overflow: 'hidden',
|
|
328
|
+
...style,
|
|
329
|
+
}}
|
|
330
|
+
>
|
|
331
|
+
{renderFlagContent()}
|
|
332
|
+
</svg>
|
|
333
|
+
);
|
|
334
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { View } from 'react-native';
|
|
3
|
+
import { InstructionBubble } from './InstructionBubble';
|
|
4
|
+
|
|
5
|
+
const meta = {
|
|
6
|
+
title: 'Components/DataDisplay/InstructionBubble',
|
|
7
|
+
component: InstructionBubble,
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: 'fullscreen',
|
|
10
|
+
docs: {
|
|
11
|
+
description: {
|
|
12
|
+
component: `O **InstructionBubble** é usado para apresentar uma instrução ou diálogo ao utilizador, sempre acompanhado pelo avatar da mascote Yaya.
|
|
13
|
+
Suporta múltiplas expressões da Yaya através da propriedade \`yayaVariant\`.
|
|
14
|
+
|
|
15
|
+
### Exemplo de Uso
|
|
16
|
+
\`\`\`tsx
|
|
17
|
+
<InstructionBubble
|
|
18
|
+
title="Eu bebo água"
|
|
19
|
+
subtitle="toca nas palavras pela ordem"
|
|
20
|
+
yayaVariant="falar"
|
|
21
|
+
/>
|
|
22
|
+
\`\`\`
|
|
23
|
+
`
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
argTypes: {
|
|
28
|
+
yayaVariant: {
|
|
29
|
+
control: 'select',
|
|
30
|
+
options: ['neutra', 'feliz', 'errou', 'acertou', 'celebrar', 'dormir', 'falar', 'pensar', 'surpresa'],
|
|
31
|
+
description: 'A expressão da mascote Yaya',
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
tags: ['autodocs'],
|
|
35
|
+
decorators: [
|
|
36
|
+
(Story) => (
|
|
37
|
+
<View style={{ backgroundColor: '#ffffff', width: '100%' }}>
|
|
38
|
+
<Story />
|
|
39
|
+
</View>
|
|
40
|
+
),
|
|
41
|
+
],
|
|
42
|
+
} satisfies Meta<any>;
|
|
43
|
+
|
|
44
|
+
export default meta;
|
|
45
|
+
type Story = StoryObj<any>;
|
|
46
|
+
|
|
47
|
+
export const Falar: Story = {
|
|
48
|
+
name: 'Instrução Padrão (Falar)',
|
|
49
|
+
args: {
|
|
50
|
+
title: 'Eu bebo água',
|
|
51
|
+
subtitle: 'toca nas palavras pela ordem',
|
|
52
|
+
yayaVariant: 'falar',
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export const Feliz: Story = {
|
|
57
|
+
name: 'Feedback Positivo (Feliz)',
|
|
58
|
+
args: {
|
|
59
|
+
title: 'Muito bem!',
|
|
60
|
+
subtitle: 'Acertaste em todas as palavras.',
|
|
61
|
+
yayaVariant: 'feliz',
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export const Pensativa: Story = {
|
|
66
|
+
name: 'Dúvida ou Dica (Pensar)',
|
|
67
|
+
args: {
|
|
68
|
+
title: 'Será que está certo?',
|
|
69
|
+
subtitle: 'Revê a tua resposta antes de enviar.',
|
|
70
|
+
yayaVariant: 'pensar',
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export const SemSubtitulo: Story = {
|
|
75
|
+
name: 'Apenas Título',
|
|
76
|
+
args: {
|
|
77
|
+
title: 'Bom trabalho!',
|
|
78
|
+
yayaVariant: 'celebrar',
|
|
79
|
+
},
|
|
80
|
+
};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { View, StyleSheet } from 'react-native';
|
|
2
|
+
import type { ViewStyle } from 'react-native';
|
|
3
|
+
import { theme } from '../../../styles/theme';
|
|
4
|
+
import { useResponsive } from '../../../hooks/useResponsive';
|
|
5
|
+
import { Yaya } from '../../Mascots/Yaya/Yaya';
|
|
6
|
+
import type { YayaVariant } from '../../Mascots/Yaya/Yaya';
|
|
7
|
+
import { Typography } from '../../Typography/Typography';
|
|
8
|
+
|
|
9
|
+
export interface InstructionBubbleProps {
|
|
10
|
+
/** Título principal (ex: "Eu bebo água") */
|
|
11
|
+
title: string;
|
|
12
|
+
/** Subtítulo descritivo (ex: "toca nas palavras pela ordem") */
|
|
13
|
+
subtitle?: string;
|
|
14
|
+
/** Expressão/Variante da mascote Yaya */
|
|
15
|
+
yayaVariant?: YayaVariant;
|
|
16
|
+
/** Estilos customizados opcionais */
|
|
17
|
+
style?: ViewStyle | ViewStyle[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const InstructionBubble = ({
|
|
21
|
+
title,
|
|
22
|
+
subtitle,
|
|
23
|
+
yayaVariant = 'falar',
|
|
24
|
+
style,
|
|
25
|
+
}: InstructionBubbleProps) => {
|
|
26
|
+
const { scale, scaleText } = useResponsive();
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<View style={[styles.container, style]}>
|
|
30
|
+
{/* Avatar Yaya na Esquerda */}
|
|
31
|
+
<View style={[styles.avatarContainer, { marginRight: scale(16) }]}>
|
|
32
|
+
<Yaya variant={yayaVariant} avatarOnly size={scale(64)} />
|
|
33
|
+
</View>
|
|
34
|
+
|
|
35
|
+
{/* Balão de Instrução (Bubble) */}
|
|
36
|
+
<View style={[
|
|
37
|
+
styles.bubble,
|
|
38
|
+
{
|
|
39
|
+
paddingHorizontal: scale(20),
|
|
40
|
+
paddingVertical: scale(16),
|
|
41
|
+
borderTopRightRadius: scale(24),
|
|
42
|
+
borderBottomRightRadius: scale(24),
|
|
43
|
+
borderBottomLeftRadius: scale(4),
|
|
44
|
+
borderTopLeftRadius: scale(24),
|
|
45
|
+
borderWidth: scale(2),
|
|
46
|
+
}
|
|
47
|
+
]}>
|
|
48
|
+
<Typography style={[styles.title, { fontSize: scaleText(22) }]}>
|
|
49
|
+
{title}
|
|
50
|
+
</Typography>
|
|
51
|
+
{subtitle && (
|
|
52
|
+
<Typography style={[styles.subtitle, { fontSize: scaleText(14), marginTop: scale(4) }]}>
|
|
53
|
+
{subtitle}
|
|
54
|
+
</Typography>
|
|
55
|
+
)}
|
|
56
|
+
</View>
|
|
57
|
+
</View>
|
|
58
|
+
);
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const styles = StyleSheet.create({
|
|
62
|
+
container: {
|
|
63
|
+
flexDirection: 'row',
|
|
64
|
+
alignItems: 'center',
|
|
65
|
+
width: '100%',
|
|
66
|
+
maxWidth: 500,
|
|
67
|
+
},
|
|
68
|
+
avatarContainer: {
|
|
69
|
+
justifyContent: 'center',
|
|
70
|
+
alignItems: 'center',
|
|
71
|
+
},
|
|
72
|
+
bubble: {
|
|
73
|
+
flexShrink: 1,
|
|
74
|
+
backgroundColor: theme.colors.brown[50], // #fdf3ea
|
|
75
|
+
borderColor: theme.colors.brown[100], // #efe2d6
|
|
76
|
+
justifyContent: 'center',
|
|
77
|
+
},
|
|
78
|
+
title: {
|
|
79
|
+
|
|
80
|
+
color: theme.colors.brown[800], // #51332d
|
|
81
|
+
},
|
|
82
|
+
subtitle: {
|
|
83
|
+
|
|
84
|
+
color: theme.colors.brown[500], // #9a8478
|
|
85
|
+
},
|
|
86
|
+
});
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// eslint-disable-next-line storybook/no-renderer-packages
|
|
2
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import { View } from 'react-native';
|
|
4
|
+
import { LevelBadge } from './LevelBadge';
|
|
5
|
+
import { Typography } from '../../Typography/Typography';
|
|
6
|
+
|
|
7
|
+
const meta = {
|
|
8
|
+
title: 'Components/DataDisplay/LevelBadge',
|
|
9
|
+
component: LevelBadge,
|
|
10
|
+
parameters: {
|
|
11
|
+
layout: 'padded',
|
|
12
|
+
docs: {
|
|
13
|
+
description: {
|
|
14
|
+
component: 'O **LevelBadge** exibe os níveis CEFR num formato retangular ou em pílula, usado nos ecrãs de progresso.\n\n### Exemplo de Uso\n```tsx\n<LevelBadge \n level="B2"\n variant="primary"\n/>\n```',
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
tags: ['autodocs'],
|
|
19
|
+
argTypes: {
|
|
20
|
+
levelCode: { control: { type: 'select', options: ['A1', 'A2', 'B1', 'B2', 'C1'] } },
|
|
21
|
+
size: { control: { type: 'select', options: ['lg', 'sm'] } },
|
|
22
|
+
countryFlagName: { control: 'text' },
|
|
23
|
+
},
|
|
24
|
+
decorators: [
|
|
25
|
+
(Story) => (
|
|
26
|
+
<View style={{ padding: 24, maxWidth: 400, backgroundColor: '#f5f0eb', alignItems: 'flex-start' }}>
|
|
27
|
+
<Story />
|
|
28
|
+
</View>
|
|
29
|
+
),
|
|
30
|
+
],
|
|
31
|
+
} satisfies Meta<any>;
|
|
32
|
+
|
|
33
|
+
export default meta;
|
|
34
|
+
type Story = StoryObj<any>;
|
|
35
|
+
|
|
36
|
+
export const LargeA1: Story = {
|
|
37
|
+
name: "Grande A1 (LG)",
|
|
38
|
+
args: {
|
|
39
|
+
levelCode: 'A1',
|
|
40
|
+
size: 'lg',
|
|
41
|
+
countryFlagName: 'França',
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export const SmallA1: Story = {
|
|
46
|
+
name: "Pequeno A1 (SM)",
|
|
47
|
+
args: {
|
|
48
|
+
levelCode: 'A1',
|
|
49
|
+
size: 'sm',
|
|
50
|
+
countryFlagName: 'França',
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export const LargeB2: Story = {
|
|
55
|
+
name: "Grande B2 (Senegal)",
|
|
56
|
+
args: {
|
|
57
|
+
levelCode: 'B2',
|
|
58
|
+
size: 'lg',
|
|
59
|
+
countryFlagName: 'Senegal',
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export const LargeC1: Story = {
|
|
64
|
+
name: "Grande C1 (Canadá)",
|
|
65
|
+
args: {
|
|
66
|
+
levelCode: 'C1',
|
|
67
|
+
size: 'lg',
|
|
68
|
+
countryFlagName: 'Canadá',
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export const Catalog: Story = {
|
|
73
|
+
name: "Catálogo de Níveis (All Levels)",
|
|
74
|
+
args: {
|
|
75
|
+
levelCode: 'A1',
|
|
76
|
+
size: 'lg',
|
|
77
|
+
},
|
|
78
|
+
render: () => (
|
|
79
|
+
<View style={{ gap: 20 }}>
|
|
80
|
+
<Typography style={{ fontWeight: 'bold', color: '#51332d', marginBottom: 4 }}>Tamanho Grande (LG)</Typography>
|
|
81
|
+
<View style={{ flexDirection: 'row', flexWrap: 'wrap', gap: 12 }}>
|
|
82
|
+
<LevelBadge levelCode="A1" size="lg" countryFlagName="França" />
|
|
83
|
+
<LevelBadge levelCode="A2" size="lg" countryFlagName="França" />
|
|
84
|
+
<LevelBadge levelCode="B1" size="lg" countryFlagName="França" />
|
|
85
|
+
<LevelBadge levelCode="B2" size="lg" countryFlagName="França" />
|
|
86
|
+
<LevelBadge levelCode="C1" size="lg" countryFlagName="França" />
|
|
87
|
+
</View>
|
|
88
|
+
|
|
89
|
+
<Typography style={{ fontWeight: 'bold', color: '#51332d', marginTop: 12, marginBottom: 4 }}>Tamanho Pequeno (SM)</Typography>
|
|
90
|
+
<View style={{ flexDirection: 'row', flexWrap: 'wrap', gap: 12 }}>
|
|
91
|
+
<LevelBadge levelCode="A1" size="sm" countryFlagName="França" />
|
|
92
|
+
<LevelBadge levelCode="A2" size="sm" countryFlagName="França" />
|
|
93
|
+
<LevelBadge levelCode="B1" size="sm" countryFlagName="França" />
|
|
94
|
+
<LevelBadge levelCode="B2" size="sm" countryFlagName="França" />
|
|
95
|
+
<LevelBadge levelCode="C1" size="sm" countryFlagName="França" />
|
|
96
|
+
</View>
|
|
97
|
+
</View>
|
|
98
|
+
),
|
|
99
|
+
};
|