Iconen
De DSO Toolkit biedt een iconenset aan. Deze set is op een aantal manieren te gebruiken.
Iconenset beheren
- De single source of truth bevindt zich in Figma: DSO Library, DSO Identiteit, Iconset
- Download altijd de gehele iconenset vanuit Figma. Ongeacht of er één of meer iconen zijn toegevoegd of verwijderd of dat de iconenset (svg-bestanden) compleet is vernieuwd.
- Plaats de gedownloade svg-bestanden in een folder naar keuze of in de repository in de folder
packages/dso-toolkit/src/icons-new. - Indien de nieuwe iconen in een folder naar keuze zijn geplaatst voer dan in de root van de repository het volgende
commando uit:
pnpm icons --newIconsDir <folder naar keuze>. - Indien de nieuwe iconen in de folder
packages/dso-toolkit/src/icons-newin de repository geplaatst, dan is het commando simpelwegpnpm icons. Het commando beschouwt die locatie als de default locatie. - Het commando
pnpm iconsvoert het scriptscripts/iconsuit. Dit script:- transformeert de naam van de uit Figma gedownloade svg-bestanden naar de gewenste naam
- optimaliseert de svg-bestanden met de node.js library SVG Optimizer. De custom plugin
setFillCurrentColorzetfill="currentColor"op die svg-bestanden van iconen die in Figma Single Color Icons worden genoemd, zodat deze svg-bestanden via css van een ander kleur kunnen worden voorzien.setFillCurrentColorhoudt daarbij rekening met iconen, waarvoor dit niet moet gebeuren. Dat zijn de iconen die in Figma Multi Color Icons worden genoemd: deze hebben een vaste kleurstelling. Daarnaast wordt het iconspinnerniet door het script geprocessed, omdat dit een speciaal icon is met een animatie erin. - schrijft de geoptimaliseerde svg-bestanden weg naar
/packages/dso-toolkit/src/icons - werkt het Web Component
/packages/core/src/components/icon/icon.tsxbij. Dit betekent dat de import-statements van alle svg-bestanden worden vervangen en dat de consticonsopnieuw gevuld wordt met de nieuwe alias-objecten. - genereert het type IconAlias in 2 bestanden:
- packages/core/src/components/icon/icon.interfaces.ts
- storybook/src/components/icon/icon.models.ts
- genereert een json-file
storybook/assets/icons.json: dit bestand wordt gebruikt tbv van icon-selectie in Storybook
- Daarna is het nog wel zaak om de ontstane diff te beoordelen en eventueel handmatig bij te werken.
di mixins
De di mixins maken gebruik van iconen die als data-uri worden ingebakken in CSS custom properties op :root
(gegenereerd door @include di.inline-icons(); in dso.scss).
"di" staat voor DSO Toolkit Icon. De di.base() en di.variant() mixins worden in HTML/CSS implementaties
gebruikt voor werkvormen waar de afnemer het icoon niet zelf kiest, maar waar het icoon vastligt bij een variant van
het component. Een voorbeeld is het List component: een li met de modifier class dso-status-warning toont altijd
het icoon status-warning, en een li met dso-forbidden toont altijd het icoon forbidden in de kleur rood. De
afnemer kiest dus de variant, en daarmee ligt het icoon vast. In een Web Component wordt het icoon bij de variant
gekozen in de component-code (bijvoorbeeld <dso-alert status="warning">, dat intern <dso-icon> gebruikt). In de HTML/CSS implementatie koppel je het icoon aan de modifier class van de variant. Dat doe je door in die
modifier class een di mixin aan te roepen. De mixins zetten alleen het icoon als achtergrondafbeelding op het
element waarin je ze aanroept:
di.base()zetbackground-imageplus de basis-CSS:background-repeat,background-position,background-size, afmetingen envertical-align.di.variant()zet alleenbackground-image.
De mixins maken dus geen pseudo-element aan en zetten ook geen content of positionering. Wil je het icoon in een
pseudo-element tonen, zoals meestal het geval is, dan maak je zelf het ::before of ::after element aan. Daarin zet
je content: "" en zo nodig de positionering, en roep je de mixin aan:
ul > li.dso-status-warning {
position: relative;
&::before {
content: "";
position: absolute;
inset-inline-start: -1.2em;
@include di.base("status-warning");
}
}
Om een icoon (en optioneel een kleur) beschikbaar te maken voor de di mixins, registreer je de combinatie in
packages/dso-toolkit/src/di.scss:
$colors: de beschikbare kleurnamen met hun sass-kleurwaarde.$icons: per icoon een lijst met toegestane kleurnamen. Een lege lijst betekent dat het icoon vaste kleuren heeft (geencurrentColorin de svg) en dus zonder kleur-argument gebruikt wordt.
// /packages/dso-toolkit/src/di.scss
$icons: (
// ...
"cross": ("grasgroen", "zwart") // ...
);
De build faalt met een duidelijke foutmelding als een icoon/kleur-combinatie wordt opgevraagd die niet in $icons
(of een kleur die niet in $colors) voorkomt. Voeg in dat geval de ontbrekende combinatie toe aan $icons
(en zo nodig de kleur aan $colors).
Maak altijd gebruik van di.base($icon, $color, $override-property, $size, $vertical-align). Deze mixin past in één
keer het icoon en de bijbehorende basis-CSS (background-repeat, background-position, background-size,
afmetingen, vertical-align) toe. Als op hetzelfde element voorwaardelijk een ander icoon moet worden getoond
(bijvoorbeeld bij :hover), gebruik dan di.variant($icon, $color, $override-property): hiermee wordt alleen het
icoon (dus alleen background-image) gewijzigd, zonder de overige CSS-properties te dupliceren.
di.custom-property($icon, $color) geeft de naam van de onderliggende custom property terug, bruikbaar wanneer je
zelf een var() wilt samenstellen (zoals in global/mixins/set-colors.mixin.scss).
@use "di";
.dso-component {
&::before {
content: "";
@include di.base("cross", "grasgroen");
}
&:hover::before {
@include di.variant("cross", "zwart");
}
}
De di.base() en di.variant() mixins worden nooit in een Web Component gebruikt. Gebruik dan <dso-icon>.
di.custom-property() mag wel in Web Components gebruikt worden (bijvoorbeeld via set-colors.mixin.scss): de custom
properties worden op :root gedefinieerd en erven door in de shadow DOM. Roep di.inline-icons() nooit aan vanuit
packages/core; dit gebeurt alleen in dso.scss en vereist de sass-functie uit de gulp-build van dso-toolkit.
Icon component
- In een Web Component maken we altijd gebruik van het Core component
<dso-icon>. - In de markup voorschriften binnen Storybook component templates maken we altijd gebruik van
iconTemplate().