Migrering til Punkt 19

Punkt 19 kutter antall breakpoints fra seks til fire og rydder i spacing-skalaen. Vi har laget et verktøy som kan gjøre det meste av migreringen for deg. Denne siden beskriver hva som endrer seg, hva verktøyet tar, og hva du må se på selv.

Kort oppsummert

De fleste prosjekter trenger ingen eller svært få endringer. Vi har kjørt verktøyet mot flere reelle kodebaser i Oslo kommune, og de fleste kom tilbake uten et eneste treff. De responsive hjelpeklassene er rett og slett lite brukt. Det er også hele grunnen til at vi kutter dem.

Kjør verktøyet

Verktøyet tar én sti: mappa koden din ligger i. Det går gjennom alt under den, så det enkleste er å peke på rota av prosjektet. node_modules, dist, build og andre byggemapper hoppes over automatisk.

npx @oslokommune/punkt-migrate@next . --dry-run

Vil du avgrense til en del av prosjektet, bytt ut . med den mappa. Den heter ./src i mange prosjekter, men kan like gjerne hete ./app, ./components eller ./resources/views. Ligger koden i flere mapper, er det enklere å kjøre på rota enn å kjøre én gang per mappe.

--dry-run skriver ingenting. Du får en rapport med fire kategorier:

KategoriBetyr
EndretTrygt skrevet om. Ingen oppfølging.
FjernetKlassen finnes ikke lenger. Stilen forsvinner, så se over.
DroppetOverflødig etter omskrivingen. Ingen oppfølging.
FlaggetKrever at du vurderer det selv.

Er rapporten grei, kjør uten --dry-run. Verktøyet nekter å skrive hvis du har endringer som ikke er sjekket inn, så du alltid kan se hva det gjorde med git diff.

npx @oslokommune/punkt-migrate@next .

Verktøyet avslutter med kode 1 hvis noe havnet i Flagget, så du kan kjøre det i CI.

Breakpoints: 6 → 4

phablet (576px) og desktop (1600px) fjernes. De fire som blir, beholder verdiene sine.

BreakpointVerdiStatus
mobile0Uendret
phablet36rem (~576px)Fjernes
tablet48rem (~768px)Uendret
tablet-big64rem (~1024px)Uendret
laptop80rem (~1280px)Uendret
desktop100rem (~1600px)Fjernes

Hjelpeklasser med -phablet-up rundes opp til -tablet-up. Stilen slår altså inn på en bredere skjerm enn før. Mobilvisningen er aldri berørt.

<!-- før -->
<h1 class="pkt-txt-28 pkt-txt-54--phablet-up">Overskrift</h1>

<!-- etter -->
<h1 class="pkt-txt-28 pkt-txt-54--tablet-up">Overskrift</h1>

Klasser med -desktop-up fjernes uten erstatning, fordi det ikke finnes noe breakpoint over. Over 1600px arver elementet det laptop-up eller lavere setter. Verktøyet rapporterer hver eneste fjerning med fil og linjenummer.

Klasser med --mobile-up mister suffikset, fordi de alltid var identiske med basisklassen.

tablet-big og laptop trenger ingen migrering.

Bredder på container og grid

.pkt-container--phablet og .pkt-grid--desktop og de andre breddemodifikatorene beholdes alle sammen. De er max-width-verdier, ikke breakpoints. Navnet er den eneste koblingen. Du trenger ikke gjøre noe med dem.

I SCSS

bp('phablet-up') og bp('desktop-up') byttes til bp-up() med verdien, så terskelen står der den står:

// før
@include bp('phablet-up') { ... }

// etter
@include bp-up(36rem) { ... }

Intervallnavnene bp('mobile'), bp('phablet'), bp('laptop') og alle *-to-*-navnene byttes til media queryen de tilsvarer.

Fra og med Punkt 18.9 skriver bp() ut en @warn når du bruker et navn som forsvinner, så du ser dem allerede ved bygg.

Spacing

Åtte verdier som aldri har vært i Figma fjernes, og snappes til nærmeste godkjente verdi. Halvtrinn rundes opp.

FjernesBlir
size-5size-6
size-15size-16
size-30size-32
size-50size-48
size-52size-56
size-60size-64
size-75size-72
size-100size-104

size-10 og size-20 blir stående selv om de heller ikke er i Figma. De er for mye i bruk.

Dette endrer piksler. Verktøyet gjør omskrivingen, men resultatet bør ses over visuelt.

gap-size-* fjernes

Hjelpeklassene gap-size-0 til gap-size-128 forsvinner. De har aldri vært dokumentert, og gap virker uansett bare på flex- og grid-beholdere, i motsetning til margin og padding, som virker overalt.

Det finnes ingen erstatning. Verktøyet rapporterer hver forekomst med verdien du skal sette:

Fjernet  gap-size-24 (sett gap: 1.5rem selv)

Responsiv spacing flyttes ut av base

pkt-base.css inneholder i dag 2 610 responsive spacing-klasser, over halvparten av alle reglene i fila, og nesten ingen bruker dem. I Punkt 19 ligger de i en egen fil du henter inn selv.

Dette gjelder uansett hvordan du henter Punkt. Klassene forsvinner også fra pkt, altså fra hele bunten, ikke bare fra pkt-base.

Med SCSS:

@use '@oslokommune/punkt-css/dist/scss/pkt';
@use '@oslokommune/punkt-css/dist/scss/pkt-spacing-responsive'; // bare hvis du trenger den

Fra CDN:

<link href="https://punkt-cdn.oslo.kommune.no/19/css/pkt.min.css" rel="stylesheet" />
<link
  href="https://punkt-cdn.oslo.kommune.no/19/css/pkt-spacing-responsive.min.css"
  rel="stylesheet"
/>

Bruker du @layer? Da finnes pkt-spacing-responsive.layer ved siden av pkt.layer, på samme måte som for resten av Punkt:

@use '@oslokommune/punkt-css/dist/scss/pkt.layer';
@use '@oslokommune/punkt-css/dist/scss/pkt-spacing-responsive.layer';

Det er viktig at den havner i samme layer som resten av Punkt. Ligger den utenfor, vinner den over alt annet, også over dine egne overstyringer. Se oppsettet med @layer.

Trenger du dem ikke, blir pkt.css 15 kB mindre gzipet, og pkt-base.css omtrent halvert, fra 31 til 16 kB.

Har du spesielle behov? Utvid listene

Bruker du SCSS, bestemmer du selv hva som ligger i $spacing og $breakpoints. Punkt genererer hjelpeklassene ut fra listene, så du kan beholde en verdi vi fjerner, eller legge til en terskel vi aldri har hatt, uten å vente på oss.

Legg oppsettet i en egen fil, og hent den inn før Punkt:

// punkt-config.scss
@use 'sass:map';
@use '@oslokommune/punkt-css/dist/scss/abstracts/variables' as v;

// Ta tilbake phablet
v.$breakpoints: map.merge(
  v.$breakpoints,
  (
    'phablet': 36rem,
  )
);

// Behold size-52, og legg til en egen verdi
v.$spacing: map.merge(
  v.$spacing,
  (
    'size-52': 3.25rem,
    'size-200': 12.5rem,
  )
);
// main.scss
@use 'punkt-config';
@use '@oslokommune/punkt-css/dist/scss/pkt';

Med map.merge beholder du hele lista vår og legger bare til dine egne verdier. Du slipper å kopiere den, og du kan ikke komme i skade for å fjerne en verdi komponentene våre trenger.

Responsiv spacing følger ikke med automatisk. Legger du til et breakpoint, får du responsive klasser for typografi, grid og synlighet med det samme, men spacing bare hvis du også henter inn pkt-spacing-responsive.

Rekkefølgen i $spacing bestemmer hvilken klasse som vinner når to av samme type står på samme element, så behold rekkefølgen fra vår liste hvis du er i tvil.

Hva verktøyet ikke kan gjøre

Verktøyet skriver aldri om noe det ikke er sikkert på. Det flagger i stedet, med fil og linjenummer:

  • Klassenavn som settes sammen i kode, som `pkt-cell--span${n}-phablet-up`. Her vet ikke verktøyet hva navnet blir.
  • Kollisjoner det ikke kan løse, for eksempel når en phablet-klasse og en tablet-klasse ligger i hver sin gren av et classNames()-kall.
  • Fjerninger som krever en strukturell endring, som å slette et helt argument eller en objektnøkkel.
  • Bygget CSS lagt inn i repoet. Har du en kopi av Punkt sin CSS liggende, hopper verktøyet over den og sier fra. Den erstatter du ved å oppgradere pakka.

Henter du Punkt fra CDN?

Verktøyet migrerer koden din, ikke CDN-lenkene. Peker du på en versjonert sti, som /18/css/pkt.min.css, får du Punkt 19 først når du selv bytter til /19/. Da bør du kjøre verktøyet i samme slengen.