Zum Hauptinhalt springen

Wie kann ich Icons im Theme ändern?

· 3 Minuten Lesezeit
Martin Oppitz
Architekt@ITZBund & Creator of KoliBri

Heute wollen wir in einem kurzen Blog-Post zeigen, wie Ihr die standardmäßig hinterlegten Icons über das Theming (Theme-Designer) ändern könnt.

1. Icon-Font integrieren

Damit Icons angezeigt werden können, muss zunächst die gewünschte Icon-Font (z.B. Font Awesome Free) in der Webseite (HTML) eingebunden werden. Dies geschieht in der Regel mittels folgendem HTML:

<head>
<link rel="stylesheet" href="assets/fontawesome-free/css/all.min.css" />
</head>

Icon-Font im Theme hinterlegen

Die Icon-Komponente von KoliBri kapselt die Icon-Font und muss daher die CSS-Definitionen von den im Design System ausgewählten Icon-Identifier kennen. Dazu muss das CSS aus der gleichen CSS-Datei, wie aus 1., in das Theme kopiert und damit hinterlegt werden.

  1. Theme-Designer öffnen
  2. Theme auswählen
  3. Icon-Komponente auswählen
  4. Schalter auf Komponent-Styling umstellen
  5. CSS aus der Icon-Font einfügen und speichern
  6. Theme in Projekt übernehmen

Standard-Icons im Theme ändern

Das Ändern eines Icons ist ganz einfach, wenn folgendes Prinzip klar ist. Alle Icons werden durch die Web Component kol-icon abgebildet. Diese Komponente exportiert immer den Part icon. Über einen Part kann man auf festgelegte CSS-Eigenschaften innerhalb einer Web Component zugreifen. Exemplarisch sieht das so aus:

kol-icon::part(icon) {
font-family: 'Font Awesome 6 Free';
font-weight: 900;
}
kol-icon::part(icon):before {
content: '😃';
}

Um ein Icon über den Designer zu ändern, sind folgende Schritte zu durchlaufen:

  1. Theme-Designer öffnen
  2. Theme auswählen
  3. Komponente auswählen, wo ein Icon geändert werden soll
  4. Schalter auf Komponent-Styling umstellen
  5. Spezifischen Selektor auf ein Icon ermitteln
  6. Spezifischen Selektor verwenden, um Schriftart und Content anzupassen
  7. Komponent-CSS speichern
  8. Theme in Projekt übernehmen

Hier mal ein komplexeres Beispiel für die Pagination:

kol-button::part(icon) {
font-family: 'Font Awesome 6 Free';
font-weight: 900;
}
kol-button.first::part(icon):before,
kol-button.previous::part(icon):before,
kol-button.next::part(icon):before,
kol-button.last::part(icon):before {
content: '😃';
}

FAQ

Warum hängt das Icon im KolIcon etwas tiefer?

Mit der CSS-Definition display: contents; am kol-icon-Tag wird das Icon passend ausgerichtet. Die Ausrichtung der Icon-Komponente innerhalb anderer Komponenten hängt immer von der jeweiligen Verwendung ab.

Warum kann ich die Schriftgröße nicht ändern?

kol-icon::part(icon) {
font-family: 'Font Awesome 6 Free';
font-size: 2rem !important;
font-weight: 900;
}

Der Grund liegt in der font CSS-Definition in der Icon-Font selbst und in der Notwendigkeit, die Schriftgröße bei Icons von Außen setzen übernehmen (erben).

.codicon[class*='codicon-'] {
font: 16px / 1 codicon;
}
:host > i,
:host > i::before {
font-size: inherit !important;
}

Möchte man ein Icon in seiner Größe anpassen, so kann man das einfach von Außen tun.

kol-icon {
font-size: 2rem;
}

Ankündigung Release 1.5

· 5 Minuten Lesezeit
Martin Oppitz
Architekt@ITZBund & Creator of KoliBri

Das Release 1.5 wird bald veröffentlicht und bringt zahlreiche neue Komponenten, Verbesserungen und ein vereinfachtes Theming mit.

Die wichtigsten Änderungen sind:

  • Neue Komponenten

    • Image
    • Popover
    • SplitButton
    • ToggleButton (s. InputCheckbox)
    • Quote
  • Verbesserungen

    • Performance

      • Die Performance wurde durch die überdimensionierten CSS-Definitionen in der Icon-Komponente beeinträchtigt. Hintergrund sind die vielen Icon-Selectoren in den Icon-Fonts. Für ein Design System wird jedoch nur ein Bruchteil dieser CSS-Definitionen wirklich benötigt. Für die Komponenten haben wir uns für die schlanke Icon-Font von Visual Studio Code (Codicon) entschieden und Icofont und Font-Awesome standardmäßig entfernt (kann wieder nachgerüstet werden). Somit bringt dieses Release eine erhebliche Performance-Verbesserung beim Rendern der Komponenten mit sich.
    • Assets (Fonts und Icons)

      • Versionen der Icon-Fonts wurden aktualisiert
      • Assets wurden auf die Themes aufgeteilt, wo sie relevant sind. Dadurch können die KoliBri-Artefakt (NPM-Paket) verkleinert und somit schneller heruntergeladen und installiert werden.
      • Durch das Hinterlegen eines Postinstall-Scripts können die Assets nach jeder Installation der KoliBri-Pakete automatisch in den public/assets-Ordner kopiert werden.
         // package.json
        "scripts": {

        "postinstall": "npm-run-all postinstall:*",
        "postinstall:components-assets": "cpy \"node_modules/@public-ui/components/assets/**/*\" public/assets --dot",
        "postinstall:themes-assets": "cpy \"node_modules/@public-ui/themes/assets/**/*\" public/assets --dot",
        },
        "devDependencies": {
        "cpy-cli": "^4.2.0",
        "npm-run-all": "^4.1.5",

        }
      • Anschließend einem npm i (pnpm i) ausführen, damit alle Assets automatisch in den public/assets-Ordner kopiert werden.
      • Damit die Assets nicht mit eingecheckt werden müssen, kann man sie in der .gitignore-Datei ausschließen.
        # .gitignore
        /public/assets/bundes/
        /public/assets/codicons/
        /public/assets/fontawesome-free/
        /public/assets/icofont/
        /public/assets/kreon/
        /public/assets/material-icons/
        /public/assets/material-symbols/
        /public/assets/noto-sans/
        /public/assets/roboto/
        /public/assets/tabler-icons/
        /public/assets/kolibri.ico
      • Weitere Icon-Fonts wurden in Themes verwendet:
        • Microsoft Codicons
        • Google Material Icons
        • Google Material Symbols
        • Tabler Icons
  • Refactorings

    • Ein paar Komponenten haben wir refactored, um die Funktionalitäten zu erweitern und die Wartbarkeit zu verbessern.
    • Accordion
      • Der Header des Accordions wird jetzt mittels KoliBri-Heading, -Button und -Span umgesetzt.
      • Accordions lassen sich jetzt auch animiert auf- und zuklappen.
    • Alert
      • Die Konstruktion der Alerts wurde überarbeitet, um die volle Flexibilität für die Gestaltung zu ermöglichen.
    • Heading
      • Die Heading-Komponente wurde mit einem Expert-Slot versehen.
    • Inputs, Select und Textarea
      • Die Konstruktion aller Eingabefelder wurde überarbeitet, um die Gestaltbarkeit und Wartbarkeit zu verbessern.
    • Nav
      • Aufklappbare Untermenüs haben jetzt einen separaten Expand-Button. So kann der eigentliche Menüpunkt unabhängig vom Auf- und Zuklappen verwendet werden.
      • Menüpunkte können jetzt Links, Buttons oder auch reiner Text sein.
    • Table Die Pagination befindet sich jetzt im DOM immer oben, um den blinden Nutzenden eine schnellere Navigation zu ermöglichen. Für sehende Nutzende kann die Pagination über das Theming entweder über oder unter der Tabelle angezeigt werden.
    • Tabs
      • Die Tabs verwenden jetzt die KoliBri-Button-Komponente.
    • Tooltip
      • Der Tooltip ist nur für die interne Verwendung in KoliBri-Komponenten gedacht. Um die Gestaltbarkeit zu verbessern, wird der Tooltip jetzt ohne Shadow-Root bereitgestellt. Sollte die Komponente außerhalb von KoliBri verwendet werden, muss das Styling in das CSS-Styling des Projekts (Webseite, App) hinzugefügt werden.
    • Alle relevante Themes wurden bzgl. der Refactorings überarbeitet
  • Adapter

    • Neuer Adapter für Angular 16 hinzugefügt
  • KoliBri-CLI

    • Templates
      • Die Templates wurden überarbeitet und aktualisiert.
      • Angular-Template auf Version 16 aktualisiert
  • Expert-Slot

    • Der Expert-Slot kann verwendet werden, um beliebiges HTML anstatt des Text-Labels auf eigene Verantwortung einfügen zu können.
    • Bei der Einführung eines Expert-Slots, wird in der Regel das Property _label Pflicht. Entweder enthält das Label einen Text, der dann ohne Slot angezeigt wird. Oder es ist leer und der Expert-Slot wird aktiviert.
      <kol-heading _label="Inhalt einer H4-Überschrift" _level="4"></kol-heading>
      <kol-heading _label="" _level="4">
      <span slot="expert"> Inhalt einer H4-Überschrift … </span>
      </kol-heading>
    • Heading: Die Heading ermöglicht jetzt das Einfügen beliebiger Inhalte im Expert-Modus. Hierzu wurde das erforderliche Property _label eingeführt. Lässt man das Property leer (_label=""), wird er Expert-Slot aktiviert.
  • Theming

    • Basis-Styling: Wir haben das CSS auf den Komponenten auf das Wesentliche reduziert. Das Styling beinhaltet primär nur noch Layout-Definitionen ohne Farben, Abstände und Tokens. Somit kann das Erstellen von eigenen Themes deutlich vereinfacht werden.
    • Alle unsere Themes wurden bezüglich der neuen Basis-Styling-Definitionen angepasst und konnten dadurch deutlich vereinfacht werden.
    • Neue Themes
      • Theme der Europäischen Kommission
      • Theme der Europäischen Union
      • Theme für die neue Version des Design System Zoll (v2)
      • Theme des Bundes Styleguides (Bundesregierung)
      • Theme des Bundeszentralamt für Steuern (WIP)
      • Theme des Freistaats Thüringen (für Demozwecke)
  • Dokumentation

    • Code-Beispiele
      • Es gibt eine Beispiel-Anwendung () mit zahlreichen Code-Beispielen.
      • Code-Beispiele wurden erweitert und aktualisiert
      • Beispiel-Anwendung kann ausgecheckt und lokal gestartet werden (ist im KoliBri-Repository).
      • Code-Bespiele werden jetzt in der Dokumentation angezeigt.
      • Code-Beispiele beinhaltet eine Handout-Sicht für Präsentationen von Themes.
    • Texte
      • Die Texte wurde überarbeitet und aktualisiert.
      • Die Texte wurde auf Englisch übersetzt.
    • Live-Editor (beta): Alle Komponenten können jetzt live umkonfiguriert werden. Die Änderungen werden daneben im Viewer direkt auf der Komponente angezeigt.
  • Funktionalitäten

    • Der Link ermöglicht jetzt die Angabe eines Dateinames für den Download-Link.
    • Der Progress kann jetzt auch den Fortschritt als lesbaren Text anzeigen und eine Bezeichnung haben.

Wie style ich eine Komponente?

· 2 Minuten Lesezeit
Martin Oppitz
Architekt@ITZBund & Creator of KoliBri

Am Beispiel der Badge-Komponente wollen wir einmal schauen, wie das Stylen funktioniert.

Herausforderung

Die Badge-Komponente hat einen Smart-Button und der soll optisch kleiner aussehen, wie ein Button, der immer mindestens 44px hoch und breit ist.

  • Bild einfügen vorher

Wir sehen im nachfolgenden HTML-Snippet, dass der umschließende Span die Badge-Hintergrundfarbe bestimmt. Da der Button innerhalb des Span ist, wird die Hintergrundfarbe auch auf den Button gesetzt. Der Button muss mindestens 44px hoch und breit sein, also wird auch der äußere Span mindestens 44px hoch und breit. Das wollen wir nicht.

<span class="smart-button" style="background-color: rgb(204, 222, 218); color: rgb(0, 78, 55);">
<kol-span-wc class="hydrated">
<span>
<span>Badge mit Schalter</span>
</span>
</kol-span-wc>
<kol-button-wc _hide-label="" class="hydrated">
<button aria-labelledby="cf22bf" class="normal icon-only" type="button">
<kol-span-wc class="icon-only hydrated" _hide-label="">
<span>
<kol-icon class="icon left hydrated" style=""></kol-icon>
</span>
</kol-span-wc>
</button>
<kol-tooltip aria-hidden="true" class="hydrated">
<div id="floating" style="left: 1233.91px; top: 312.5px; display: none; visibility: hidden;">
<div id="arrow" style="left: 19px; bottom: -5px;"></div>
<kol-badge id="cf22bf" class="hydrated" style=""></kol-badge>
</div>
</kol-tooltip>
</kol-button-wc>
</span>

Lösung

Idee 1

Wir optimieren die Komponente, indem wir die Hintergrundfarbe vom umschließenden Span entfernen und auf die beiden inneren Span-Elemente übertragen.

<span class="smart-button" style="color: rgb(0, 78, 55);">
<kol-span-wc class="hydrated" style="background-color: rgb(204, 222, 218);">
<span>
<span>Badge mit Schalter</span>
</span>
</kol-span-wc>
<kol-button-wc _hide-label="" class="hydrated">
<button aria-labelledby="cf22bf" class="normal icon-only" type="button">
<kol-span-wc class="icon-only hydrated" _hide-label="" style="background-color: rgb(204, 222, 218);">
<span>
<kol-icon class="icon left hydrated" style=""></kol-icon>
</span>
</kol-span-wc>
</button>
<kol-tooltip aria-hidden="true" class="hydrated">
<div id="floating" style="left: 1233.91px; top: 312.5px; display: none; visibility: hidden;">
<div id="arrow" style="left: 19px; bottom: -5px;"></div>
<kol-badge id="cf22bf" class="hydrated" style=""></kol-badge>
</div>
</kol-tooltip>
</kol-button-wc>
</span>

Das geht aber nicht, weil wir an den 2. Span nicht rankommen. Wir müssen also eine andere Lösung finden.

Idee 2

Es bleibt beim der initialen Komponenten-Konstruktion. Wir versuchen es mit CSS und erzwingen eine Zeilenhöhe für den umschließenden Span.

  • Bild Heihgt 1.75rem einfügen

Wir sehen im Bild, dass der linke Rand des Button oben rausragt. Das können wir aber leicht lösen, indem wir den linken Rand des Buttons auf 0 setzen und stattdessen einen rechten Rand am Text-Span setzen.