Skip to content

Design system ​

Le design commun

Les couleurs, les polices, les icônes et les composants partagés avec le web sont présentés dans la section Design. Cette page explique comment le mobile les implémente.

L'interface reproduit exactement la maquette Figma (page « Mockups », cadres « App (iOS) 390 px »). Les couleurs, polices et tailles viennent des variables Figma, avec les mêmes noms.

Les couleurs : src/theme/colors.ts ​

NomValeurUsage
textDefault#111827Texte principal
textSubtle#374151Texte secondaire
textMuted#4b5563Légendes, valeurs dans les listes
textOnBrand#ffffffTexte sur fond vert
surfaceCard#ffffffCartes, listes, barre d'onglets
surfacePage#f5f5f4Fond des pages de réglages
borderDefault#e5e7ebSéparateurs
borderStrong#9ca3afBordures de champs
brandPrimary#144545La couleur TimeManager : boutons, onglet actif, liens
brandPrimaryPressed#0f3535Bouton principal appuyé
brandPrimarySoft#e8ededFonds légers (avatars)
brandAccent#e8c18eSable : pauses, bouton Pause en cours
brandAccentStrong#7a4f1aAnneau du bouton Pause
brandWork#2e8a82Temps travaillé dans la frise et les graphiques
brandTrack#dce3e1Fond des barres et de l'anneau
chartGridrgba(17,24,39,0.1)Grille des graphiques
feedbackDangerStrong#b91c1cBouton Service en cours, actions destructrices
feedbackDangerText#b91c1cMessages d'erreur
feedbackDangerBorder#fecacaBordure des boutons de danger

Pas de mode sombre : la maquette n'en a pas, et app.json force le mode clair.

Les utiliser ​

tsx
// directement par leur nom, dans les composants du kit
<Text color="textMuted">...</Text>
<Icon name="bell" color={colors.brandPrimary} />

// dans un style
const { colors } = useTheme();
<View style={{ backgroundColor: colors.surfacePage }} />

Le type ColorName liste tous les noms : une faute de frappe est refusée par TypeScript.

Pourquoi useTheme() ?

Aujourd'hui il renvoie toujours les mêmes couleurs. Mais tous les composants passent par lui : si un jour la maquette ajoute un mode sombre, il suffira de changer ce seul hook.

Les polices : src/theme/typography.ts ​

NomPoliceUsage
lightInter 300L'heure en grand sur Clock
regularInter 400Texte courant
mediumInter 500Libellés, onglets
semiboldInter 600Titres de barre, libellés importants
boldInter 700Grands titres (connexion, présentation), chiffres clés des équipes et des graphiques
monoShare Tech Mono 400Initiales des avatars et de l'en-tête de profil
tsx
<Text size={17} weight="semibold">Titre</Text>

Les composants du kit : src/components/ui/ ​

Tous les écrans sont construits avec ces briques. Elles ne font aucune requête : elles affichent ce qu'on leur donne.

Texte et icônes ​

ComposantRôleProps principales
TextTout texte de l'appsize, weight, color, align, lineHeight
IconUne icône Uicons (Flaticon) dessinée en SVGname, size, color
LogoLe logo TimeManagersize
AvatarLes initiales dans un rondinitials, variant (nav, row, stack, invited, mini)
StatusUn statut avec icône et couleur (jamais la couleur seule)kind : complete, overtime, missingClockOut, corrected, pending, approved...

Les tracés des 44 icônes sont dans icon-paths.ts. Pour en ajouter une, on copie le tracé SVG depuis Uicons.

Actions ​

ComposantRôleProps principales
ButtonBoutonlabel, variant (primary, secondary, danger, accent), size (default, large), icon, disabled
TextLinkLien texte soulignélabel, onPress, icon
AddRowLigne « + Ajouter... » dans une listelabel, onPress
CheckboxCase à cocherlabel, checked, onChange
SegmentedControlChoix entre 2 ou 3 options (périodes)options, value, onChange

Listes façon réglages iOS : group.tsx ​

tsx
<Group label="Profil" footer="Seul le GM peut changer l'email.">
  <NavRow label="Prénom" value="Elias" onPress={...} />
  <DetailRow title="Email" detail="elias@example.com" />
  <InputRow label="Mot de passe" secureTextEntry />
</Group>
ComposantRôle
GroupUne carte blanche arrondie avec un titre au-dessus et une note en dessous
NavRowUne ligne avec libellé, valeur et chevron, qui ouvre quelque chose
ValueRowUne ligne libellé et valeur, non cliquable
DetailRowUne ligne sur deux niveaux (titre et détail), avec badge ou éléments à gauche et à droite
InputRowUn champ de saisie dans une ligne
TextAreaRowUn champ multiligne (raison d'une correction)

Structure d'écran ​

ComposantRôle
Screen (src/components/screen.tsx)Le cadre de chaque écran : fond, en-tête, défilement
AppBarLa barre du haut : titre, flèche retour (back), bouton d'action à droite
tsx
<Screen background="surfacePage" header={<AppBar title="Compte" bordered />}>
  ...
</Screen>

Feuilles qui montent du bas ​

ComposantRôle
SheetLa feuille de base, avec titre et fermeture
OptionSheetChoisir une option dans une liste (langue, manager)
ActionSheetConfirmer une action, souvent destructrice
TextInputSheetModifier un texte (prénom, nom d'équipe)
DateTimeSheetChoisir un jour et une heure
DaySheetChoisir un jour
tsx
<ActionSheet
  visible={sheet === 'delete'}
  message={t('account.deleteIntro')}
  actions={[{ label: t('account.delete'), destructive: true, onPress: deleteAccount }]}
  cancelLabel={t('common.cancel')}
  onClose={close}
/>

Formulaires d'authentification ​

ComposantRôle
TextFieldChamp avec libellé au-dessus (écrans de connexion)
AuthCardLa mise en page des écrans publics : logo, titre, intro, contenu
PasswordRulesLes règles de mot de passe cochées en direct

Retour d'information ​

ComposantRôle
ToastBandeau vert en haut pendant 4 s. Voir État global.

Les graphiques : src/components/charts/ ​

Dessinés directement en SVG, sans bibliothèque.

ComposantGraphique
BarChartHeures par jour, avec la ligne de l'objectif
LineChartHeures par semaine, avec la ligne de l'objectif
DoughnutChartAnneau : part de l'objectif atteinte
ChartCardLa carte autour d'un graphique (titre, sous-titre)
LegendLa légende
axis.tsxLes libellés des axes

Les composants métier ​

ComposantRôle
clock/clock-button.tsxLe bouton à maintenir. Voir Exemple complet : pointer.
clock/day-timeline.tsxLa frise de 6 h à 20 h : travail en vert, pauses en sable
dashboard-view.tsxLe tableau de bord complet, pour soi ou pour un membre
team/teams-list.tsxLa liste des équipes
team/team-detail.tsxLe détail d'une équipe : période, moyenne, membres
team/member-records.tsxLes absences et les semaines d'un membre
navigation/tab-bar.tsxLa barre d'onglets
profile-header.tsxL'en-tête de Compte
role-line.tsxLa ligne « rôle » sur la fiche d'un utilisateur

Accessibilité ​

  • Chaque élément cliquable a un accessibilityRole (button, link, tab) et un accessibilityLabel quand le texte ne suffit pas.
  • Les statuts ont toujours une icône et un texte, jamais la couleur seule.
  • Le bouton de pointage peut être déclenché d'un double tap avec VoiceOver ou TalkBack.
  • Les toasts sont annoncés par le lecteur d'écran.
  • Les contrastes reprennent ceux validés sur le web (rouge #b91c1c à 6,47:1).