Gå til innholdet

Tilpasning

Du tilpasser Fristil ved å sette CSS-variabler i din egen CSS. Verdiene som følger med pakken er standardverdier, og dine egne vinner over dem.

Fire veier, i den rekkefølgen du bør prøve dem:

VeiTil hva
TokensFarger, på tvers av hele systemet
KomponentvariablerForm og størrelse på én komponent
Vanlige reglerAlt annet

Skal hele systemet ha organisasjonens farger, er Eget tema raskere: du oppgir merkefargene, og generatoren byggefunksjon skalaene og kontrollerer kontrasten i begge temaer.

Skal du bare endre en farge eller to, overstyrer du variablene i din egen CSS. Last den etter tokens.css:

:root {
--semantic-interactive-main: #7c3aed;
--semantic-interactive-contrast: #ffffff;
}

Alt Fristil sender ut ligger i et cascade layer (@layer fristil). CSS uten layer vinner alltid over CSS i et layer, uansett spesifisitet. Du trenger verken !important eller lange selektorer.

Overstyringen over gjelder begge temaer. Vil du ha ulike verdier, skriver du dine egne regler:

:root {
--semantic-interactive-main: #7c3aed;
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--semantic-interactive-main: #c4b5fd;
}
}
[data-theme="dark"] {
--semantic-interactive-main: #c4b5fd;
}

De to siste blokkene må begge være med, siden Fristil støtter både systemvalget og et eksplisitt data-theme.

Overstyr semantiske verdier når du vil endre hva en farge betyr. Overstyr palett-verdier når du vil bytte hele skalaen; da følger alle semantiske verdier som peker på den, med.

Farger er ikke det eneste du kan endre. Hver komponent har egne variabler for form og størrelse:

:root {
--fs-button-radius: 9999px;
--fs-input-radius: 0;
}
VariabelStandard
--fs-button-paddingvar(--size-2) var(--size-4)
--fs-button-radiusvar(--size-1)
--fs-badge-paddingvar(--size-0-5) var(--size-2)
--fs-badge-radiusvar(--size-4)
--fs-alert-paddingvar(--size-3) var(--size-4)
--fs-alert-radiusvar(--size-1)
--fs-alert-accentvar(--size-1)
--fs-card-paddingvar(--size-4)
--fs-card-radiusvar(--size-2)
--fs-divider-spacevar(--size-4)
--fs-spinner-sizevar(--size-6)
--fs-spinner-thickness2px
--fs-table-cell-paddingvar(--size-2) var(--size-3)
--fs-list-gapvar(--size-1)
--fs-tag-paddingvar(--size-0-5) var(--size-2)
--fs-tag-radiusvar(--size-1)
--fs-avatar-sizevar(--size-10)
--fs-avatar-radiusvar(--size-1)
--fs-skeleton-heightvar(--size-4)
--fs-skeleton-radiusvar(--size-1)
--fs-breadcrumbs-gapvar(--size-2)
--fs-pagination-gapvar(--size-1)
--fs-pagination-sizevar(--size-10)
--fs-pagination-radiusvar(--size-1)
--fs-skip-link-paddingvar(--size-2) var(--size-4)
--fs-skip-link-radiusvar(--size-1)
--fs-accordion-radiusvar(--size-1)
--fs-accordion-paddingvar(--size-3) var(--size-4)
--fs-dialog-widthmin(32rem, 100%, calc(100vw - var(--size-8)))
--fs-dialog-paddingvar(--size-5)
--fs-dialog-radiusvar(--size-2)
--fs-tooltip-width16rem
--fs-tooltip-paddingvar(--size-1) var(--size-2)
--fs-tooltip-radiusvar(--size-1)
--fs-paragraph-width70ch
--fs-paragraph-gapvar(--size-3)
--fs-tabs-gapvar(--size-1)
--fs-tabs-paddingvar(--size-2) var(--size-4)
--fs-tabs-panel-spacevar(--size-4)
--fs-error-summary-paddingvar(--size-4)
--fs-error-summary-radiusvar(--size-1)
--fs-file-upload-paddingvar(--size-2)
--fs-file-upload-radiusvar(--size-1)
--fs-avatar-stack-overlapcalc(var(--size-2) * -1)
--fs-popover-widthmin(20rem, calc(100vw - var(--size-8)))
--fs-popover-paddingvar(--size-3)
--fs-popover-radiusvar(--size-1)
--fs-popover-topsettes av komponenten
--fs-popover-leftsettes av komponenten
--fs-toast-spacevar(--size-4)
--fs-toast-widthmin(24rem, calc(100vw - var(--size-8)))
--fs-toast-paddingvar(--size-3) var(--size-4)
--fs-toast-radiusvar(--size-1)
--fs-suggestion-max-heightcalc(var(--size-10) * 4)
--fs-suggestion-radiusvar(--size-1)
--fs-suggestion-option-paddingvar(--size-2) var(--size-3)
--fs-input-paddingvar(--size-2) var(--size-3)
--fs-input-radiusvar(--size-1)
--fs-textarea-min-heightcalc(var(--size-4) * 5)
--fs-textarea-paddingvar(--size-2) var(--size-3)
--fs-textarea-radiusvar(--size-1)
--fs-select-radiusvar(--size-1)
--fs-select-option-paddingvar(--size-2) var(--size-3)
--fs-select-viewport-marginvar(--size-2)
--fs-checkbox-sizevar(--size-5)
--fs-checkbox-radiusvar(--size-1)
--fs-radio-sizevar(--size-5)
--fs-switch-widthvar(--size-10)
--fs-switch-heightvar(--size-6)
--fs-fieldset-gapvar(--size-2)
--fs-search-icon-spacevar(--size-10)
--fs-search-icon-sizevar(--size-5)
--fs-toggle-group-radiusvar(--size-1)
--fs-toggle-group-heightvar(--size-10)
--fs-toggle-group-padding0 var(--size-4)
--fs-session-timeout-width26rem
--fs-session-timeout-paddingvar(--size-5)
--fs-session-timeout-radiusvar(--size-1)
--fs-connection-status-layer1000
--fs-connection-status-paddingvar(--size-2) var(--size-4)

Standardverdiene peker på --size-*-skalaen. Endrer du skalaen, følger komponentene med. Setter du variabelen, gjelder din verdi bare for den komponenten.

Alt Fristil sender ut, både tokens og komponent-CSS, ligger i @layer fristil. CSS uten layer vinner alltid over CSS i et layer, uansett spesifisitet. Du kan derfor overstyre hva som helst med en enkel selektor:

.fs-button {
letter-spacing: 0.02em;
}

Uten layeret ville du måttet slå selektorer som .fs-button[data-variant="danger"]:hover, eller ty til !important.

Bruker du Tailwind, må laget vårt plasseres. Lagene teller i den rekkefølgen de først blir nevnt, og det siste vinner uansett spesifisitet. Sett rekkefølgen på første linje i CSS-en din:

@layer theme, base, fristil, components, utilities;
@import "tailwindcss";
@import "@fristil/designsystem/tokens.css";
@import "@fristil/designsystem/tailwind.css";

Uten den linja får du ett av to problemer, avhengig av hvilken import som kommer først:

RekkefølgeHva som skjer
fristil før baseTailwinds Preflight nullstiller komponentene. Bakgrunnen forsvinner fra knappen.
fristil etter utilitiesKomponentene slår Tailwind-klassene dine. p-6 på en .fs-button gjør ingenting.
base, fristil, utilitiesBegge deler virker

Dette er testet, ikke antatt: tilpasning.browser.test.ts bygger begge tilfellene i hvert sitt dokument og kontrollerer hva knappen faktisk får.

Fristils eget tema for Tailwind ligger i @fristil/designsystem/tailwind.css. Det er en vanlig CSS-fil, så pakken har ingen avhengighet til Tailwind, og din versjon er den eneste som er i bruk. Se Design tokens.

Ingen komponent i Fristil bruker shadow DOM lenger. <fs-calendar> var den eneste, og den er fjernet til fordel for nettleserens eget datopanel. Se Dato i et skjema.

Det betyr at CSS-en din når fram overalt. Du trenger verken ::part() eller å lete etter en vei inn i en skyggerot.

Variabler og laget dekker utseendet. De dekker ikke at komponenten skal gjøre noe annet enn den gjør. Da kan du overta kildekoden til den ene komponenten:

Terminal window
npx @fristil/designsystem overta button --ut=src/ui

Kommandoen kopierer komponentens filer inn i prosjektet ditt, og skriver om henvisningene ut av mappa, slik at kopien virker der den havner:

Kopierte button til src/ui/button/
button.ts
button.css
Komponenten er nå din. Oppdateringer av @fristil/designsystem rører den ikke.
Henvisninger ut av mappa peker nå på pakken:
../shared.js → @fristil/designsystem/shared
Bytt ut disse importene med kopien:
@fristil/designsystem/button
@fristil/designsystem/button.css

Klassenavnene følger med. Importerer du stilarket fra pakken i tillegg, finnes komponenten to ganger, og hvilken som vinner avgjøres av rekkefølgen. Bytt derfor ut importene, som utskriften sier.

Det du gir fra deg er oppdateringene. Rettelser og forbedringer i pakken treffer ikke kopien, og det er du som eier den derfra. Bruk kommandoen på den ene komponenten som trenger det, ikke på alle.

npx @fristil/designsystem overta uten navn lister komponentene. Kopien skrives ikke over hvis mappa finnes fra før, med mindre du legger til --overskriv=ja.