Skip to content

Opetushallitus/oph-design-system

Repository files navigation

Build

Quality Gate Status

OPH Design System

OPH Design System (ODS) on Opetushallituksen verkkopalveluiden käyttöön tarkoitettu muotoilujärjestelmä. Tämä Git-säilö sisältää muotoilujärjestelmän mukaan rakennetun React-komponenttikirjaston.

Huom! Tällä hetkellä komponenttikirjasto on vielä varhaisella kehitysasteella. Käyttöönottoa ei suositella ennen versiota 1.0.0!

Käytetyt teknologiat

Komponenttikirjaston käyttöönotto

Asenna komponenttikirjasto riippuvuutena suoraan Githubista:

npm i "github:opetushallitus/oph-design-system"

Varmista myös, että vertaisriippuvuudet (peer dependency) on asennettu:

{
  "peerDependencies": {
    "@mui/material": "^6",
    "next": "^14 || ^15", // Pakollinen vain, jos käytät Next.js:ää
    "react": "^18 || ^19"
  }
}

Kirjasto sisältää kaksi teema-varianttia: "oph" (sininen) ja "opintopolku" (vihreä). Next.js:ää käytettäessä voit ottaa teeman käyttöön juuritason layoutissa seuraavasti:

import { OphNextJsThemeProvider } from '@opetushallitus/oph-design-system/next/theme';
import { getLocale } from 'next-intl/server';

export async function RootLayout() {

  // Voit noutaa käyttäjän kielen millä tavalla haluat, esim. next-intl-kirjastolla
  const locale = await getLocale();
  return (
    <html lang={locale}>
      <body>
        <OphNextJsThemeProvider variant="oph" lang={locale}>
          {children}
        </OphNextJsThemeProvider>
      </body>
    </html>
}

Voit noutaa kielen millä tavalla haluat, esimerkiksi next-intl-kirjastolla, kunhan sen arvo on "fi", "sv" tai "en".

Voit myös käyttää teemaa ilman NextJs:ää, pelkällä Reactilla:

import { OphThemeProvider } from '@opetushallitus/oph-design-system/theme';

export function App() {
  // Hae käyttäjän kieli esim. selaimen asetuksista, URL:stä tai keksistä
  const lang = ['fi', 'sv', 'en'].includes(navigator.language)
    ? navigator.language
    : 'fi';

  return (
    <OphThemeProvider variant="oph" /* tai "opintopolku" */ lang={lang}>
      {/*Tähän teemaa käyttävät komponentit*/}
    </OphThemeProvider>
  );
}

Jos haluat kustomoida teemaa, voit antaa ThemeProviderille Material-UI:n teeman konfiguraatio-objektin osan overrides-parametrina, joka ylikirjoittaa teeman asetuksia. Teeman initialisointia voi kustomoida luomalla teeman createOphTheme-funktiolla tai useOphTheme-hookilla, joka löytyvät moduulista @opetushallitus/oph-design-system/theme (./src/next/theme/theme.tsx).

Kun teema on otettu käyttöön, voit käyttää ODS:n komponentteja omassa koodissasi:

import { OpenInNew } from '@mui/icons-material';
import { OphButton } from '@opetushallitus/oph-design-system';

export const OmaKomponentti = () => {
  return (
    <div>
      <OphButton startIcon={<OpenInNew />} href="https://opintopolku.fi">
        Opintopolku
      </OphButton>
    </div>
  );
};

Kehittäminen ja Storybook

UI-komponenttien dokumentointiin ja testaukseen käytetään Storybook-työkalua.

Main-haarasta muodostettu storybook on nähtävillä osoitteessa: https://dev-files.ops.opintopolku.fi/storybooks/oph-design-system/main/index.html

Jos haluat kehittää ODS:ää tai ajaa Storybookia lokaalisti, sinun täytyy asentaa ensin riippuvuudet:

npm ci

Tämän jälkeen voi käynnistää storybookin lokaalisti kehitys-moodissa:

npm run storybook

Storybook käynnistyy osoitteeseen http://localhost:6006. Muutokset ladataan automaattisesti, kun koodi muuttuu.

Voit myös tehdä tuotanto-buildin komennolla (oletuksena hakemistoon storybook-static):

npm run build-storybook

Yksikkötestaus

Moduulin yksikkötestit ovat moduulin kanssa samassa hakemistossa vastaavalla nimellä, mutta tiedostopäätteellä .test.ts(x).

Vitest:llä toteutetut yksikkötestit voi ajaa komennolla:

npm run test

Storybook-testit (Playwright)

Storybookin visualiset ja saavutettavuustestit on toteutettu Playwright:lla. Jokaiselle storylle tehdään seuraavat tarkistukset:

  • Saavutettavuusongelmat @axe-core/playwright-työkalulla.
  • Visuaalinen testaus eli kuvakaappausten vertailu, jolla varmistutaan että komponenttien visuaalinen ilme säilyy.

Jotta testit voi suorittaa, täytyy Storybook-palvelimen olla käynnissä osoitteessa http://localhost:6006.

Testien ajaminen kehityspalvelinta vasten

Helpoin tapa ajaa testit on käynnistää Storybookin kehityspalvelin. Tässä on myös se etu, että koodimuutokset ladataan automaattisesti (hot reload).

  1. Käynnistä storybook-kehityspalvelin: npm run storybook
  2. Aja testit toisessa terminaalissa joko
  • Oman koneen ympäristössä: npm run test-storybook tai...
  • Docker-kontissa Ubuntulla: npm run test-storybook-docker

Testien ajaminen muodostettua tuotantoversiota vasten

Testit voi ajaa myös dev-palvelimen sijaan Storybookin tuotantoversiota vasten. Tätä tapaa käytetään CI:ssä, koska testien ajaminen on nopeampaa.

  1. Muodosta tuotantoversio --test-optiolla (optio ei pakollinen, mutta nopeuttaa testejä): npm run build-storybook -- --test
  2. Käynnistä muodostettu versio ja aja testit joko
  • Oman koneen ympräristössä npm run start-and-test-storybook tai...
  • Docker-kontissa Ubuntulla: npm run start-and-test-storybook-docker

Jakeluversion muodostaminen

Komponenttikirjaston jakeluversio muodostetaan komennolla:

npm run build

Komento muodostaa EcmaScript-moduulit /dist-hakemistoon käyttäen tsup-työkalua. Package.json-tiedoston export-kentässä on määritelty moduulit, jotka jakeluversio tarjoaa. Jakeluversion tiedostot on lisätty myös Git-säilöön /dist-hakemistoon, jotta komentoa ei tarvitse ajaa kirjaston asennuksen yhteydessä.

Esimerkkiprojekti

Hakemistosta example löytyy lisäksi Next.js-esimerkkiprojekti, josta voi katsoa mallia komponenttikirjaston käyttöönottoon omassa projektissaan. Esimerkkiprojektilla voi myös testata että komponenttikirjaston jakeluversion käyttöönotto toimii. Katso lisätietoja Esimerkkiprojektin README:sta.