Figma hygiëne
Zo werken we in Figma: met duidelijke afspraken over opzet en structuur, oftewel de 'Figma hygiëne'.
Vooral rondom componenten is het fijn als we dezelfde hygiëne aanhouden. Zo kunnen componenten makkelijk gedeeld en hergebruikt worden tussen organisaties.
1. Figma structuur
Met de NL Design System Figma omgeving zitten we momenteel op het 'Organization plan'.
1.1 Teams
We hebben op dit moment 1 team: NL Design System.
1.2 Projecten
1.2.1 Bibliotheken
Hier plaatsen we onze Figma bestanden die als bibliotheek worden ingezet. Er zijn momenteel 2 Figma bibliotheken.
NL Design System - Bibliotheek
In deze bibliotheek vind je componenten met de status 'Community' en 'Candidate'. Samen werken we toe naar componenten met de status 'Hall of Fame'.
Bekijk de 'NL Design System - Bibliotheek' in Figma
NL Design System - ToDo Bibliotheek
In deze bibliotheek vind je componenten met de status 'Help Wanted' of 'Experimental'. Deze componenten zijn nog niet in code beschikbaar.
Bekijk de 'NL Design System - ToDo Bibliotheek' in Figma
1.2.2 Werkbestanden
Hier plaatsen we Figma bestanden waar we zelf mee werken. Bijvoorbeeld:
Schetsboek
Een schetsbestand om snel ideeën uit te werken, te delen of vast te leggen.
Bekijk het 'NL Design System - Schetsboek' in Figma
Voorbeeld bibliotheken
Duplicaten van onze Figma bibliotheken met het Voorbeeld-thema. Hiermee laten we zien hoe organisaties de bibliotheken kunnen toepassen.
- Bekijk 'NL Design System - Bibliotheek - Voorbeeld'
- Bekijk 'NL Design System - ToDo Bibliotheek - Voorbeeld'
Voorbeeld templates
Bestand met complete templates, opgebouwd uit componenten uit de 2 Figma bibliotheken met het Voorbeeld-thema.
Bekijk het bestand 'NL Design System - Templates - Voorbeeld' in Figma
1.2.3 Archief
Hier plaatsen we Figma bestanden die niet langer nodig of relevant zijn.
2. Figma bestanden
De volgende punten gelden voor alle Figma bestanden.
2.1 Bestandsnaam
Binnen NL Design System worden bibliotheken benoemd als NL Design System - {type-bibliotheek} - {naam-organisatie}
. Bijvoorbeeld: NL Design System - Bibliotheek - Utrecht
of NL Design System - ToDo Bibliotheek - Voorbeeld
. Gebruik deze naamgevingsconventie om duidelijkheid te geven over de herkomst en status van componenten.
2.2 Cover
Elk Figma bestand begint met een pagina ‘Cover’. Dit is de thumbnail die zichtbaar is in het Figma bestandenoverzicht. Je kunt de kleurstelling en titel aanpassen. Gebruik de functionaliteit ‘Set as thumbnail’ om deze cover te updaten.
2.3 Read me
Elk Figma bestand heeft als tweede pagina een 'Read me' frame waar wordt beschreven waar het bestand voor dient.
2.4 Open Source
Standaard zijn Figma bestanden niet openbaar voor iedereen. Omdat we open source werken, is het belangrijk om bij het delen van linkjes met de community de juiste instellingen te kiezen. Ga bij 'Share' naar de optie 'Anyone can view' om het bestand voor iedereen zichtbaar te maken.
3. Component bibliotheken
De volgende punten gelden specifiek voor de Figma bibliotheken.
3.1 Bibliotheek indeling
We hanteren 1 pagina per component, gerangschikt in alfabetische volgorde. Dit biedt de volgende voordelen:
- Relevante context per pagina. Door op elke pagina specifieke documentatie en context over de component toe te voegen, krijgen designers en developers direct inzicht in het gebruik en de richtlijnen, zonder afleiding van andere elementen.
- Snellere en eenvoudigere navigatie. Het terugvinden van specifieke componenten wordt een stuk makkelijker doordat elke component een eigen, goed vindbare pagina heeft.
- Betere versiebeheer en overzicht van wijzigingen. Alle opmerkingen en wijzigingen over een component blijven op 1 plek. Dit zorgt voor duidelijkheid en voorkomt verwarring bij het doorvoeren van updates.
- Kortere laadtijden. Door componenten te verdelen over meerdere pagina’s, verbetert de laadtijd per pagina. Dit voorkomt dat Figma traag wordt, met name bij grotere bibliotheken.
3.2 Schrijfwijze
3.2.1 Pages, Headings, Frames, Properties en Property values
Pages, Headings, Frames, Properties én Property values schrijven we met een hoofdletter aan het begin van elk woord. Bijvoorbeeld:
Button
Action Group
Icon Start
Tokens - Button
Documentatie - Button
Documentatie - Icon Size
Demo - Accordion
3.2.2 Layers
Layers schrijven we in kleine letters. Bijvoorbeeld:
text
label + description
3.2.3 Componenten
De componenten, zoals deze vanuit de bibliotheek worden gepubliceerd, schrijven we altijd in 'kebab-case', inclusief een prefix. Bijvoorbeeld:
utrecht-button
denhaag-side-nav
nl-link
3.2.4 Sub-componenten
Soms zijn componenten opgesplitst in sub-componenten. Deze sub-componenten mogen een korte naam hebben, zodat de lagen beter leesbaar blijven. We schrijven deze altijd in 'kebab-case' en plaatsen 2 underscores voor de naam. Dit zorgt ervoor dat ze verborgen blijven bij het gebruik van de bibliotheek en sluit aan bij de BEM-conventie, die ook in code wordt gebruikt. Bijvoorbeeld:
.denhaag-contact-timeline__step-header
wordt__step-header
.denhaag-contact-timeline__step
wordt__step
.todo-modal-dialog-header
wordt__header
3.3 Sub-componenten
Soms wordt een component opgesplitst in sub-componenten. Dit helpt om het ontwerp overzichtelijk, beheersbaar en herbruikbaar te houden. We maken subcomponenten aan als een component voldoet aan een of meerdere van de volgende criteria:
- De component is complex.
- De component is groot.
- De component bevat verschillende states.
- De component bevat herhalende items, zoals 'Items' in een 'List'.
3.4 Properties
3.4.1 Volgorde van properties
De volgorde van properties kan per component verschillen. Over het algemeen geldt: de meest impactvolle of vaak gebruikte properties staan bovenaan. Zie deze lijst als een uitgangspunt, niet als een strikte regel.
Appearance
/Type
Position
/Level
/Size
Checked
Current
Collapsible
/Toggle
Expanded
Nested
State
Container
Text
Show Icon Start
↳ Icon Start Value
Show Icon End
↳ Icon End Value
Show {naam-optie}
3.4.2 Volgorde van property values
Over het algemeen geldt: de meest logische of vaakst gebruikte waarde staat bovenaan. Zie deze lijst als een uitgangspunt, niet als een strikte regel.
-
Checked
False
True
-
Expanded
False
True
-
States
Default
Active
Hover
Focus-visible
Invalid
Read-only
Disabled
Visited
3.4.3 Exposed properties
Wanneer je een nested instance gebruikt binnen een component (bijvoorbeeld een Paragraph in een Alert), vermijd dan exposed properties om de volgende redenen:
- Te veel opties in het component-panel kunnen verwarrend zijn.
- Exposed properties geven geen controle over de volgorde van properties in het component-panel.
- Het risico bestaat dat een ongewenste variant wordt gekozen (bijvoorbeeld bij de Paragraph purpose 'Lead' in plaats van 'Default').
- Er kan altijd worden doorgeklikt naar de (sub)component om tekst of andere eigenschappen handmatig aan te passen.
3.5 Icons
Iconen worden indien mogelijk samengevoegd tot 1 vorm. Deze laag geven we de naar 'Shape'.
3.6 Structuur en positionering
3.6.1 Volgorde van frames
De volgorde van frames is als volgt:
- Tokens
- Sub-componenten (indien van toepassing)
- De component
- Documentatie
- Demo (indien van toepassing)
Bijvoorbeeld:
Tokens - Accordion
__button
__panel
__section
utrecht-accordion
Documentatie - Accordion
Demo - Accordion
3.6.2 Positionering en witruimte
Buiten frames
- De 'Page 'Heading' plaatsen we op X:0 en Y:0.
- De 'Estafettemodel Badge' plaatsen we 80px onder de Page Heading.
- Het eerste frame, vrijwel altijd
Tokens - {naam-component}
, plaatsen we onder de Estafettemodel Badge. - Als een pagina geen Estafette badge heeft, plaatsen we het frame 160px onder de Page Heading.
- Elke implementatie van een component bestaat uit de frames
Tokens - {naam-component}
, de component zelf enDocumentatie - {naam-component}
. Tussen deze frames zit horizontaal 80px.
Binnen frames
Er wordt gebruik gemaakt van auto-layout om de witruimte binnen frames te bepalen.
- Het frame van een (sub)component dat uit minstens 2 varianten bestaat, heeft een vertical gap van 48px en horizontal en vertical padding van 48px.
- De frames
Tokens - {naam-component}
enDocumentatie - {naam-component}
hebben een vertical gap van 48px, horizontal padding van 48px en een vertical padding van 64px. - Het frame
Demo - {naam-component}
heeft een vertical gap van 48px, horizontal padding van 16px en een vertical padding van 64px.
(Sub)component dat uit minstens 2 varianten bestaat:
- Verticale gap: 48px
- Horizontale padding: 48px
- Verticale padding: 48px
Tokens - {naam-component}
- Verticale gap: 48px
- Horizontale padding: 48px
- Verticale padding: 64px
Documentatie - {naam-component}
- Verticale gap: 48px
- Horizontale padding: 48px
- Verticale padding: 64px
Demo - {naam-component}
- Verticale gap: 48px
- Horizontale padding: 16px
- Verticale padding: 64px
3.7 Estafette Badges
De Estafette Badge bij een component geeft aan welke status de component heeft binnen het estafettemodel. Deze status komt overeen met de status zoals aangegeven op de documentatiewebsite.
Belangrijke opmerking: Niet elke component in de Figma bibliotheek heeft op dit moment een Estafette Badge die volledig synchroon loopt met de documentatiewebsite. Dit betekent dat een component op de documentatiewebsite nog de status Help Wanted kan hebben, terwijl er in de Figma bibliotheek al een Community versie bestaat. In dat geval heeft de Community component nog niet alle vereiste checkpoints behaald. Dit verschil zal in de toekomst steeds minder voorkomen.
3.7.1 Speciale statussen: Help Wanted en Experimental
Help Wanted
- Deze componenten hebben de Help Wanted status op de documentatiewebsite.
- In de Figma bibliotheek bevatten ze een verwijzing naar de documentatiewebsite en vaak al tokens (met als prefix 'todo').
- Dit maakt verdere ontwikkeling richting de Community status eenvoudiger.
Experimental
- Deze componenten hebben nog geen enkele stap binnen het estafettemodel gezet.
- Ze hebben geen verwijzing naar de documentatiewebsite en bevatten geen tokens.
- Dit zijn vroege experimenten die nog geen officiële status hebben.
4. Templates
De volgende punten gelden specifiek voor een template bestand.
4.1 Schrijfwijze
4.1.1 Frames
Voor frames hanteren we de volgende structuur voor de schrijfwijze: Viewport_Naam-van-pagina_Aanvulling--state
. SV
staat voor 'small viewport' enLV
staat voor 'large viewport'.
Bijvoorbeeld:
SV_Detailpagina
LV_Detailpagina
SV_Titel-van-stap--invalid
SV_Titel-van-stap_Opslaan
SV_Titel-van-stap_Opslaan--invalid
SV_Inloggen_Ja
SV_Inloggen_Nee
SV_Uw-gegevens--logged-in
4.2 Structuur en positionering
Per patroon of template maken we een aparte Page aan. Denk hierbij aan:
- Homepage
- Detailpagina
- Zoeken
- Formulieren
- Mijn omgeving
4.2.1 Positionering en witruimte
Buiten frames
Tussen verschillende implementaties zit horizontaal 800px.