Beslutningsguide
Hvis I søger efter hvornår et design system betaler sig, eller efter en component library I kan stole på, står I typisk ét sted: to sider ligner ikke hinanden, en designer har tegnet den tredje knap, og nogen foreslår 'vi skal have et design system' som om det var et plugin. Nogen køber Storybook. Nogen kopierer shadcn og kalder det jeres. Nogen laver et Figma-bibliotek, koden aldrig læser.
Marketing-site-posterne handler om stack og SEO. Den her handler om den kontrakt, UI'et skal overholde, når mere end én person rører det. Et design system er ikke et galleri. Det er tokens I kan pege på, en ejer der må sige nej, og en regel om at en ny knap slår en gammel ihjel. Uden de tre ting har I en mappe. I har ikke et system, I kan forsvare.
TL;DR
De vigtigste pointer
- Et design system er en kontrakt: tokens, én ejer, og at I ikke opfinder den samme knap igen.
- En component library uden tokens er et galleri. Storybook uden beslutninger er et slideshow.
- I har brug for et system, når I har mere end én flade, eller mere end én person der shipper UI.
- På et MVP, der stadig finder produktet, er tre ærlige komponenter bedre end et library, I aldrig rydder op i.
- Figma-tokens, koden ikke læser, er dekoration. Systemet lever der, browseren renderer.
- shadcn, Polaris og 'vi kopierede Vercel' er et startkit. De bliver først jeres, når I har sagt nej til halvdelen.
Hvorfor det her overhovedet er vigtigt
Et design system, I ikke har besluttet, koster uger I ikke ser på en sprint-tavle. Hver ny side genåbner farve, spacing og 'er det her knappen?'. Designeren tegner. Udvikleren gætter. Review handler om pixels, ikke om om produktet er rigtigt. I tror I er langsomme til at bygge. I er langsomme til at blive enige om det, I allerede har bygget.
Teams køber den forkerte medicin. De ser et slide med tokens, theming og 'governance', og tegner et system-projekt oven på et site, der stadig skifter budskab hver anden uge. Eller de gør det modsatte: de har ingen kontrakt, så hver landing er et unikt sæt. Begge dele koster. Den ene i teater. Den anden i at I aldrig kan skifte en farve ét sted.
Det er også et performance- og SEO-spørgsmål, ikke kun et æstetik-spørgsmål. Tre forskellige knap-implementeringer er tre steder I kan glemme fokus, kontrast og den state, en crawler og en skærmlæser skal kunne. Et ærligt sæt komponenter er kedeligt — og det er derfor det holder. Variation, I ikke har besluttet, er den stille måde et Next.js-site bliver tungt og ulogisk på.
Vi skriver det, fordi 'design system' er blevet et køb, I tager før I har en sætning om hvad der må variere. Et ærligt setup er kedeligt: en farveskala, en type-skala, otte-punkt spacing, tre knap-varianter, og et navn der må sige nej. Uden den sætning har I Storybook. I har ikke et system, I kan skifte rebrand på.
Hvad et design system faktisk er — og hvad det ikke er
Et design system er de beslutninger, UI'et skal overholde, skrevet så både Figma og koden kan læse dem. Tokens er navngivne værdier: farve, type, spacing, radius, skygge. Komponenter er de få mønstre, I har sagt ja til. Dokumentation er den sætning, der forklarer hvornår I bruger den primære knap, og hvornår I ikke gør. Ejerskab er hvem der må tilføje en fjerde.
En component library er en mappe af komponenter. Den kan være rigtig. Den er ikke et system, før tokens og nej-retten findes. I kan have 40 komponenter og stadig opfinde den 41. I kan have fire og være færdige, hvis de fire er de eneste, I tillader på et marketing-site.
Storybook er et sted at se komponenterne. Det er nyttigt, når I har noget at vise. Det er teater, når I starter med Storybook-setup og 'addon-docs', før I har besluttet om knappen har en loading-state. Et galleri uden kontrakt er hvordan I får et pænt intern-site, produktion aldrig bruger.
Og det er ikke et theme I køber. Tailwind, shadcn, Radix, Polaris, Carbon — de er startkits og primitives. De giver jer et sprog. De giver jer ikke jeres beslutninger. 'Vi bruger shadcn' er en afhængighed. 'Vi har tre knapper, de her tokens, og den her person siger nej' er et system. Det første kan I installere en eftermiddag. Det andet kan I ikke købe.
Det der typisk går galt, når nogen siger design system
Den første fejl er at starte systemet, før produktet har et ansigt. I bruger uger på tokens og 'foundations', mens H1 og tilbuddet stadig skifter. Så bygger I et library til et produkt, I ikke har. Når budskabet lander, passer komponenterne ikke, og I har et system, I skammer jer over at åbne. Tre ærlige blokke på et MVP slår et library, I aldrig tør slette.
Den anden fejl er Storybook som bevis. I kan vise 20 states. Produktion bruger tre, og de tre er kopieret ind i siderne alligevel, fordi 'det var hurtigere'. Et library, siderne ikke importerer, er et internt site. Mål systemet på om en ny landing kan samles af det, I allerede har — ikke på om docs-sitet er pænt.
Den tredje fejl er at kopiere et stort systems API og kalde det jeres. Polaris er bygget til Shopify. shadcn er bygget til at I selv tager stilling. Hvis I lader alle varianter ligge 'så vi er dækket ind', har I et katalog, ingen kender. Et lille team dør af valg. Skær væk, indtil I kan nævne komponenterne uden at åbne en mappe.
Den fjerde fejl er at lade hver side være en undtagelse. 'Den her kampagne skal ligne noget andet'. 'Footer på den side er speciel'. Efter et halvt år har I et system på papiret og et unikt site i produktion. Undtagelsen skal have en ejer og en slutdato — ligesom et feature flag. Ellers er undtagelsen blevet produktet.
Component library vs. design system — to forskellige kontrakter
Component library
En mappe I kan importere. Nyttig. Ikke en kontrakt.
- Knapper, input, kort — kode I kan genbruge
- Kan starte som shadcn, Radix eller jeres egne filer
- Ingen pligt til at siderne faktisk bruger dem
- Uden tokens og nej-ret bliver den 41. komponent 'lige denne gang'
Design system
Beslutningerne bag mappen — tokens, ejer, og hvad der må variere.
- Navngivne tokens Figma og CSS begge kan læse
- Få varianter, og en sætning om hvornår I bruger hvilken
- Én person må sige nej til en ny knap
- En ny flade samles af det, I har — undtagelser har en slutdato
Sådan starter et lille team — uden at købe et design-ops-setup
Uden den her rækkefølge får I enten et galleri eller slet ingen kontrakt.
- 01
Skriv hvad der må variere — i fem linjer
Ikke 'vores brand'. 'Én primær knap, én sekundær, én fare. Én type-skala. Spacing i otte-punkt. Ingen ny farve uden at en gammel dør.' Hvis I ikke kan sige det, er I ikke klar til et system. I er klar til tre ærlige blokke og et nej til den fjerde knap.
- 02
Læg tokens ét sted, koden faktisk læser
CSS-variabler, et lille token-objekt, eller det tema Next.js og Tailwind allerede kan pege på. Spejl navnene i Figma. Hvis designeren siger primary/500, skal udvikleren ikke gætte en hex. To sandheder er hvordan rebrandet bliver et arkæologi-projekt.
- 03
Byg de få komponenter, siderne allerede gentager
Knap, input, kort, heading, listing. Ikke et modal-system til et site uden modaler. Hver komponent har de states, I faktisk bruger — hover, fokus, disabled, fejl. Spring 'vi laver alle varianter nu' over. I kan tilføje. I kan ikke ærligt slette 30 ubrugte.
- 04
Giv systemet en ejer og en nej-sætning
Ejer er et navn, ikke 'design og frontend'. Nej-sætningen er: en ny variant kræver at en gammel dør, eller at I skriver hvorfor den her flade er undtagelsen, og hvornår undtagelsen slutter. Uden nej er library'et et forslag.
- 05
Mål på næste side, ikke på docs-sitet
Den næste landing eller den næste app-skærm skal kunne samles af det, I har. Hvis den ikke kan, mangler I en komponent — eller I har sagt ja til en undtagelse, I burde have sagt nej til. Storybook kan vente, til mappen faktisk bliver importeret.
“Et design system betaler sig, når I kan skifte en farve ét sted — og sige nej til den fjerde knap uden et møde.”
Next.js, marketing-site og app — samme pligt, forskellige tidspunkter
Et marketing-site i Next.js kan leve længe på et ærligt sæt: heading, sektion, kort, formular, CTA. Det er et system, selv om I ikke kalder det et. Det bliver et problem, når kampagnesider begynder at medbringe deres egne knapper, eller når WordPress-rester og den nye App Router-side ikke deler tokens. Så er det ikke 'lidt variation'. Det er to brands på ét domæne.
En app ved siden af sitet — portal, checkout, admin — er det tidspunkt, systemet typisk begynder at betale sig. To flader, to teams eller to tempoer, og uden tokens I deler, divergerer I på en måned. Her er en fælles knap og en fælles type-skala ikke pynt. Det er den eneste måde en kunde kan tro, at login og forsiden er samme firma.
Et MVP på typisk 8–14 uger skal finde produktet. Et fuldt system-projekt i den periode er hvordan I bygger et library til et UI, I skrotter. Tag tre komponenter, I tør slette. Tag tokens, hvis I allerede ved, at app og site skal ligne hinanden. Tag ikke 'design-ops', fordi et slide sagde, at rigtige teams har et system fra dag ét.
Hvis I overvejer at skifte stack 'for at få et system', så vær ærlige: I skifter sted, beslutningen kan sidde. Et WordPress-tema med tre child-overrides er heller ikke et system. Et Next.js-site med hex'er i 20 filer er det samme rod med et andet badge. Skift stak hvis I også har andre grunde. Skift ikke fordi et kit lovede, at komponenter er gratis konsistens.
Hvad I typisk bør gøre i den situation, I står i
Venstre er det, I typisk siger. Højre er det næste skridt, vi typisk anbefaler.
Situation
Vi vil have et design system, før sitet har et fast budskab
Næste skridt
Tre ærlige blokke og tokens I faktisk læser. Library'et venter, til I kan nævne de sider, det skal bære
Situation
Vi har Storybook, og produktion kopierer alligevel markup
Næste skridt
Importér eller slet. Et galleri, siderne ikke bruger, er et internt site — ikke et system
Situation
Figma har tokens, og Next.js har hex'er i CSS
Næste skridt
Én sandhed. CSS-variabler eller et token-objekt begge kan pege på. Rebrandet skal være én fil
Situation
Vi har site og portal, og de ligner to firmaer
Næste skridt
Fælles knap, type og farve først. Det er det tidspunkt, et lille system typisk betaler sig
Situation
Vi kopierede shadcn og har alle varianter 'for en sikkerheds skyld'
Næste skridt
Skær til det, I viser. Et startkit bliver først jeres, når I har sagt nej til halvdelen
Tjekliste før I kalder det et design system
Hvis I mangler flere af punkterne, er sætningen et slide — ikke en kontrakt.
- Tokens har navne, og koden læser de samme navne som Figma
- I kan nævne jeres knap-varianter uden at åbne en mappe
- En navngiven person må sige nej til en ny komponent
- Den næste landing kan samles af det, I har — eller undtagelsen har en slutdato
- Storybook, hvis I har det, viser det produktion importerer — ikke et håb
- I har ikke startet et system-projekt for at undgå at beslutte budskabet
Spørgsmål vi får igen og igen
Hvornår betaler et design system sig for et lille team?
Når I har mere end én flade — site og portal, site og app — eller mere end én person der shipper UI, og I allerede ved, at I skal kunne skifte en farve ét sted. Det betaler sig ikke som et for-projekt på et MVP, der stadig finder budskabet. Tre ærlige komponenter og tokens, koden læser, slår et library I bygger til et UI, I skrotter. Tag systemet, når næste side ellers bliver en undtagelse. Tag det ikke, fordi et slide sagde 'governance'.
Er en component library ikke det samme som et design system?
Nej. Library'et er mappen. Systemet er kontrakten: tokens, få varianter, og en nej-ret. I kan have et fint library og stadig opfinde knappen på hver landing. I kan have et lille system uden Storybook, hvis siderne faktisk importerer de samme tre komponenter, og Figma peger på de samme navne. Kald mappen et library, indtil I har sagt hvad der ikke må variere.
Skal vi bruge Storybook, shadcn eller et stort system som Polaris?
shadcn og lignende primitives er et ærligt startkit, hvis I skærer i det. Polaris og andre store systemer er bygget til et andet firma — nyttige at læse, farlige at kopiere i fuld bredde. Storybook er rigtigt, når I har komponenter produktion bruger, og flere mennesker skal se states. Det er forkert som første commit, før I har en knap, I tør slette. Køb pipen, når læsningen er blevet et produkt. Køb den ikke for at ligne et design-ops-team.
Hvad gør vi, når Figma og koden allerede er skredet?
I starter ikke med at tegne forfra. I tager de tokens, produktion faktisk renderer, giver dem navne, og tvinger Figma til at pege på dem — eller I tager Figma-navnene og retter koden, hvis designet er den sandhed, I vil holde. Én sandhed. Derefter de tre komponenter, siderne gentager. Undtagelserne får en liste og en slutdato. Et nyt 'v2 design system' ved siden af det gamle er den femte sandhed.
Kan vi vente med et system, til vi relancerer?
I kan vente med galleriet. I bør ikke vente med tokens, hvis I allerede har to flader, der skal ligne hinanden efter relanceringen. En relancering uden en kontrakt er hvordan I får et pænt v1 og et rod i v2. Læg navnene, før I tegner alle sider om. Så kan relanceringen skifte værdier ét sted. Ellers er relanceringen et nyt sæt hex'er i 20 filer — igen.
Hvis næste landing kræver en ny knap, I ikke tør sige nej til
Lad os skille tokens, mappe og galleri ad.
Tre komponenter, koden faktisk læser, slår et Storybook I køber før I har et budskab.
