A monitor showing a Figma-style interface with a button component selected, inspect specs visible, comment bubbles near design elements — the visual marker for the Figma handoff audit.
Image description: A monitor showing a Figma-style interface with a button component selected, inspect specs visible, comment bubbles near design elements — the visual marker for the Figma handoff audit.

Engineering primer · Figma-överlämningsgranskning

Överlämningen från designer till ingenjör misslyckas med tillgänglighet: en studie av 50 Figma-filer

Vi granskade 50 produktions-Figma-filer — anonymiserade, med tillstånd — för de tillgänglighetsspecifikationer som tog sig med i överlämningen och de som inte gjorde det.

Överlämningen från designer till ingenjör misslyckas med tillgänglighet
en studie av 50 Figma-filer

Vi fick läsbehörighet till 50 produktions-Figma-filer från 28 produktteam, med tillstånd och fullständig anonymisering, och gick sedan igenom varje fil med en enda fråga: när ingenjören öppnar den här filen och börjar implementera, vilka tillgänglighetsbeslut har designern redan fattat — och vilka lämnas kvar för ingenjören att uppfinna fredagen klockan 16? Svaret, fil efter fil, är att de flesta fortfarande uppfinns vid 16-tiden.

50
produktions-Figma-filer granskade, anonymiserade
60%
av interaktiva komponenter levererades utan fokusstatus-design
5
tillgänglighetsegenskaper spårade i varje fil
11 min läsning
Uppdaterad maj 2026

1. Hur vi granskade de 50 filerna

Urvalet är 50 Figma-filer från 28 produktteam inom SaaS, handel, fintech, offentlig sektor och edtech. Vi förhandlade läsbehörighet på icke-attributeringsbasis: ingenting i denna artikel identifierar ett varumärke, ett team eller en designer. Filerna valdes för att spegla vad en ingenjör faktiskt skulle ta emot vid överlämning — inte en polerad fallstudie från en portfoliosajt — så vi bad varje team dela filen som den senaste funktionen levererades från, inte den fil de var stoltast över. Tolv av filerna var från team med en dedikerad designsystemspraktik; de övriga 38 var produktnivåfiler som importerade ett systembibliotek eller rullade sina egna komponenter inline.

Vi gick igenom varje fil och letade efter fem tillgänglighetsegenskaper: fokusstatus-design på varje interaktiv komponent, alternativtextanteckningar på varje bild eller icke-dekorativ ikon, läsordningsdokumentation över layouten, rörelseinställningshantering för animerade eller övergångselement, och mörktlägeskontrastspecifikation för alla komponenter som levererades till både ljust och mörkt tema. För varje egenskap fick en fil poängen “dokumenterad” enbart om en kompetent ingenjör kunde implementera designen utan att behöva uppfinna svaret själv. “Nämns i en klistislapp” räknades inte. “Hex specificerat i ett enda hover-tillstånd” räknades inte. Ribban var: är beslutet i filen i en form som ingenjören kan agera på utan att fråga?

Huvudfyndet är att överlämningen, enligt denna ribba, saknar tillgänglighetsbesluten långt oftare än den inkluderar dem. Fokusstatus-design förekom på ca 40% av interaktiva komponenter i korpusen. Alternativtextanteckningar förekom på ungefär 22% av bilderna som behövde dem. Läsordning var explicit dokumenterad i 16% av filerna. Rörelseinställningar behandlades i 10%. Mörktlägeskontrast — för de 31 filerna som levererade båda teman — specificerades för 30% av komponenterna. Gapet finns inte i någon enskild egenskap. Det finns i alla fem, och ingenjören lämnas att stänga dem ett omdöme i taget.

50
filer granskade från 28 produktteam (ögonblicksbild maj 2026)
28
distinkta team, anonymiserade, inom fem sektorer
5
tillgänglighetsegenskaper betygsatta per fil, per komponent
ca 1 800
interaktiva komponenter berörda i korpusen
Vad “dokumenterad” betyder i denna granskning

Vi använde ribban ingenjör-läser-och-implementerar. En fokusstatus räknas som dokumenterad om filen visar den visuella specifikationen — konturlinjefärg, bredd, offset, kontrast mot det fokuserade elementets bakgrund — i en form som ingenjören kan mappa till en CSS-token. Ett angränsande Slack-meddelande som säger “använd varumärkets blå” räknas inte, för Slack-meddelanden överlever inte överlämningen. Filen måste bära beslutet på egen hand.

”Överlämningen misslyckas inte för att designers inte bryr sig om tillgänglighet. Den misslyckas för att filformatet behandlar tillgänglighet som en kommentarsanteckning när det borde vara en förstklassig egenskap hos varje komponent.”

— disabilityworld.org:s ingenjörsbord, granskningsanteckningar

2. Fokusstatus-design: 60%-gapet

Av de ca 1 800 interaktiva komponenterna i korpusen — knappar, länkar, inmatningsfält, kryssrutor, switchar, flikar, kombofält, menyobjekt, kort-som-knappar, allt en tangentbordsanvändare kan nå — levererade ungefär 40% en designad fokusstatus. De övriga 60% levererade en standardstatus, en aktiv och en hoverstatus, och stannade sedan. Ingenjören som bygger komponenten väljer en fokuskontur vid implementeringstillfället, vanligtvis genom att kopiera webbläsarens standard, vanligtvis utan att kontrollera att standarden har 3:1-kontrast mot komponentens yta i båda de ljusa och mörka teman filen levereras i.

Hur ser “ingen fokusstatus-design” ut i praktiken? Det ser ut som en knappkomponent med tre varianter på duken — vila, hover, nedtryckt — och ingen fjärde variant. Det ser ut som ett inmatningsfält med en stilad kantlinje och ingen andra kantstil för det fokuserade tillståndet. Det ser ut som ett kryssrutaprimitiv med en fokusring enbart på vilovarianten, med ingenjören lämnad att gissa om samma ring ska visas på den markerade eller obestämda varianten. Mönstret upprepas över komponenter, team och sektorer. Det är det enskilt största tillgänglighetsgapet i korpusen och det enskilt lättaste att designa in.

De team som designade fokusstatus väl hade en av två saker som hjälpte dem. Den första var en explicit designsystemsregel: varje interaktiv komponent måste leverera en variant vars namn börjar med focus-, och komponenten släpps inte in i biblioteket förrän den varianten finns. Den andra var en Figma-komponentegenskap kallad state med focus, focus-visible och focus-within som uppräknade värden, så att filens komponentbläddrare synliggör de saknade varianterna visuellt. Team utan någon av dessa två scaffolds lämnade fokusstatusen till ingenjören ungefär nio gånger av tio.

60%
av interaktiva komponenter levererades utan fokusstatus-design
ca 720
komponenter klarade fokusstatusnivån i korpusen
2
scaffolds som stängde gapet: tillståndsvarianten-namngivning eller komponentegenskap-enums
12 / 50
filer använde ingen scaffold och visade inga fokusstatus alls
En Figma-komponent med fokusstatus designad kontra utan
Med — fyra namngivna varianter, fokusspecen är i filen

Knappkomponent, fyra varianter: state=default, state=hover, state=pressed, state=focus-visible. Focus-visible-varianten visar en 2px konturlinje, 2px offset, färgtoken —focus-ring (som i sin tur är mappad till ett hex som klarar 3:1 mot knappytan i båda teman). Ingenjören läser inspektionspanelen och kopierar tokenreferensen; ingenting uppfinns.

Utan — tre varianter, fokus lämnat till ingenjören

Samma knappkomponent, tre varianter: default, hover, pressed. Ingen fokusvariant på duken. En klistislapp från designern säger “använd systemets fokusring.” Ingenjören söker i designsystemsbiblioteket, hittar två kandidatfokusringar (en från knappar, en från inmatningsfält, något olika bredder), väljer en, levererar den, och QA-passet tre veckor senare flaggar den för att den valda ringen faller under 3:1 på den inaktiverade-men-fortfarande-fokuserbar sekundärknappytan.

Webbläsarstandarden-fällan

När fokusstatusen inte finns i filen levererar ingenjörer ofta webbläsarens standard — och webbläsarens standard åsidosätts av den globala *:focus { outline: none } i de flesta CSS-resets som samma ingenjör lade till sex månader tidigare för att klara en annan recensionskommentar. Resultatet är en komponent som ser bra ut i Figma-förhandsvisningen, ser bra ut i utvecklingsmiljön med reseten inaktiverad, och levereras utan synlig fokusindikator alls.


3. Alternativtextanteckningar: mestadels tomma

Av filerna i korpusen som inkluderade innehållsbilder — produktfotografi, hjälteillustrationerna, ikonknappar, infografikfigurer — hade 78% inga alternativtextanteckningar på bildlagren. Bilden var placerad, dimensionerad och stilad; den textuella motsvarighet som ingenjören förväntades sätta på det renderade <img>-elementet fanns inte i filen. Åtta av 50 filer hade alternativtext på några bilder men inte alla, vanligtvis med hjälteillustrationens anteckning och innehållsbildernas tomma. Tre filer hade alternativtext på varje bild. Ingenjören, i 47 av 50 filer, förväntades uppfinna alternativtexten — och i praktiken ärvde den ofta från filnamnet, bildtexten eller vilken sträng som passade det visuella rytmet.

Gapet är strukturellt knutet till Figmas bildprimitiv. Det finns ingen inbyggd “alt”-egenskap på en bildfyllning eller ett bildlager; alternativtext måste bäras som ett lagernamn, en kommentar, en klistislapp, ett separat specdokument eller ett plugin-tillagt fält. Inget av dessa bärs genom inspektionspanelen som standard, så ingenjören som läser filen i inspektionsvyn ser inte alternativtexten ens om designern har skrivit den på annan plats. Team som konsekvent stängde gapet använde ett av tre lösningar: plugin-hanterade alternativtextfält på varje bildvariant, en dokumenterad konvention att lagernamnet är alternativtexten, eller ett separat alternativtextkalkylblad kopplat till bildfilnamn som levererades vid sidan av filen.

Ikonknappar var en delbrister inuti detta bristmönster. I 41 av 50 filer hade ikonelement — sökglaset, hamburgermenyn, stäng-X, dela-pilen — ingen anteckning om tillgängligt namn, vilket lämnade ingenjören att skriva aria-label=“Sök” från det visuella sammanhanget utan bekräftelse på att “Sök” var rätt ord i varumärkets röst (var det “Hitta”? var det “Slå upp”? var det ingenting för att knappen öppnar en panel märkt på annat håll?). Ikonnamnsättning är exakt den typ av mikrokopibeslut som gynnas av en designers penna, och exakt den typ som överlämningen förlorar.

78%
av filerna hade inga alternativtextanteckningar på innehållsbilder
41 / 50
filer lämnade ikontknappars tillgängliga namn till ingenjören
3 / 50
filer antecknade alternativtext på varje bild, från början till slut
3
lösningar som de stängande teamen använde: plugin-fält, lagernamnskonvention, kalkylblad
Dekorativ kontra informativ är ett designbeslut

Varje bild är antingen dekorativ (alternativtext bör vara tom, skärmläsaren hoppar över den) eller informativ (alternativtext bär den information det visuella förmedlar). Det valet är ett innehållsbeslut, och det tillhör designern eller skribenten, inte ingenjören som gissar vid midnatt. En fil som inte säger något om vilka bilder som är dekorativa levererar antingen för mycket alternativtext (varje bild beskrivs utförligt, inklusive de som är ren ornament) eller för lite (hjälteillustrationens beskrivs, varje innehållsbild får alt="" för att ingenjören spelade det säkert).


4. Läsordning, rörelse, mörkt läge-kontrast

De återstående tre egenskaperna hade distinkta bristmönster. Läsordning — ordningen i vilken en skärmläsare berättar sidan, som i moderna responsiva layouter inte längre är garanterad att matcha den visuella uppifrån-och-ned-ordningen — dokumenterades i 16% av filerna. Dokumentationen, där den fanns, var vanligtvis ett numrerat lager på duken (1, 2, 3 …) tillagt med ett plugin. De övriga 84% lämnade ingenjören att mappa läsordningen från den DOM-ordning de råkade skriva, vilket på en CSS Grid-layout med explicit rad-och-kolumnplacering kan avvika från den visuella layouten med en hel kolumn.

Rörelseinställningar klarade sig sämst. Tio procent av filerna nämnde prefers-reduced-motion överhuvudtaget. De återstående 90% specificerade animeringar och övergångar — modalinträden, akkordexpansioner, snackbarsglidningar, sidövergångar — utan att specificera vad samma komponent ska göra när användaren har reducerad rörelse aktiverat. Ingenjören byggde antingen det reducerade-rörelse-fallet vid implementeringstillfället (ofta utan en visuell referens) eller levererade samma animering till alla, vilket är standard och vilket bryter mot 2.3.3 Animation from Interactions för användare som ange inställningen.

Mörktlägeskontrast specificerades för 30% av komponenterna i filer som levererade båda teman. De övriga 70% specificerade kontrastens ljusa tema — vanligtvis med en Stark- eller kontrastredigeringsanteckning i filen — och släppte sedan det mörka temat med en hex-vänd palett, och lämnade ingenjören att kontrollera om det vända paret fortfarande klarade 4,5:1 på brödtext och 3:1 på UI-komponenter. I ungefär en femtedel av de 31 dubbeltema-filerna sjönk minst en komponent under kontrasttröskeln i det mörka temat för att den mörka ytan och den mörka texten båda var inriktade på det ljusa temats kontrastmatematik, inte det mörka temats.

Matrisen nedan sammanfattar de fem gapen

Matrisen spårar “slutförandegrad” för varje egenskap i korpusen — andelen filer där egenskapen dokumenterades till ribban ingenjör-läser-och-implementerar. Kolumnerna delar upp graden baserat på om filen kom från ett team med en dedikerad designsystemspraktik eller ett produktteam som rullar komponenter inline; gapet mellan de två kolumnerna är system-kontra-ingen-system-deltat.

TillgänglighetsegenskapAlla 50 filerDesignsystemsteam (12)Produktteam (38)System-kontra-produkt-delta
Fokusstatus-design (interaktiva komponenter)40%75%29%+46pp
Alternativtextanteckningar (innehållsbilder)22%50%13%+37pp
Läsordning (kanvasnivå)16%42%8%+34pp
Rörelseinställningar (animerade element)10%33%3%+30pp
Mörktlägeskontrast (enbart dubbeltema-filer, n=31)30%55%19%+36pp

”Designsystemsteam dokumenterar tillgänglighetsbesluten ungefär dubbelt så ofta som produktteam — men även systemteamen klarar ribban på bara en av de fem egenskaperna för det mesta.”

— disabilityworld.org:s ingenjörsbord, granskningsanteckningar

5. Stark och Able: ojämn användning

De två pluginer som dyker upp mest i korpusen är Stark och Able. Båda är mogna, båda är väl ansedda, och båda levererar funktioner som stänger flera av de ovan dokumenterade gapen. Stark lägger till en kontrastkontroll, ett fokusordningslager, en förhandsgranskning för reducerad rörelse och ett alternativtextanteckningsfält på bildlager. Able lägger till en färgkontrastinspektion, ett synsimuleringsvisningslager och en berörmålskontroll. Endera plugin, använt konsekvent i en fil, skulle lyfta den filen ur korpusens bottenkvartal.

Använt konsekvent är den avgörande frasen. Av de 50 filerna var Stark installerat och synligen använt i 18, och Able i 11. I de filer där pluginet användes var det vanligtvis på hjältekomponenten och den primära CTA — de komponenter som troligast befinner sig på duken när designern öppnade pluginet — och bara sparsamt på annat håll. Sex filer använde Stark på en global genomgång; en använde Able på en global genomgång. Mönstret är: plugins finns, designers vet om dem, de tas in för punktkontroller, och sedan stannar punktkontrollen vid de komponenter designern råkade titta på när pluginet var öppet.

De två team som stängde granskningen på pluginanvändning gjorde en sak annorlunda: de körde pluginets granskningsfunktion på varje sida av filen som ett releasegatesteg innan filen delades med ingenjörsavdelningen. Granskningen kördes i filen, producerade en rapport, och rapporten behövde vara tom (eller dess undantag dokumenterade) innan filen gick från “under design” till “klar för ingenjör.” Detta är plugin-som-arbetsflöde snarare än plugin-som-punktkontroll, och det är skillnaden mellan 80% täckning och 20% täckning i vårt urval.

Stark
Stark Lab · kontrast, fokusordning, rörelse, alt
ca 1,4 miljoner installationer i Figma + Sketch + Adobe XD (maj 2026)
Användning i korpus18 / 50 filer (36%)
Använt som arbetsflöde
Gaptäckning vid genomgående användning4 av 5 egenskaper stängningsbara (fokus, kontrast, alt, rörelse)
Able
Able · kontrast, synssimulering, berörmål
ca 320 000 installationer i Figma-communityt (maj 2026)
Användning i korpus11 / 50 filer (22%)
Använt som arbetsflöde
Gaptäckning vid genomgående användning2 av 5 egenskaper stängningsbara (kontrast, mörktlägeskontrast)
Plugins är nödvändiga, inte tillräckliga

Ett plugin höjer golvet: kontrastredigeraren fångar de uppenbara 2,1:1-bristerna, alternativtextfältet ger designern någonstans att skriva. Inget av det hjälper om pluginet körs på tre komponenter och inte på de återstående 27. Lösningen är att sätta pluginet i arbetsflödet — ett releasegatesteg, en föröverlämnande checklista, en Figma-gren som inte kan slås samman utan en tom pluginrapport — snarare än i designerns gottfinnande vid det ögonblick de minns att det finns.


6. En överlämningschecklista och ett tokenkontrakt

Granskningen producerar en checklista och ett kontrakt. Checklistan är vad en designer ska kunna bocka av innan filen delas med ingenjörsavdelningen. Kontraktet är formen på de designtokens som åtföljer filen så att ingenjören mappar Figma-variabler till CSS-egna egenskaper utan att uppfinna mellanliggande värden. Båda är avsiktligt korta: varje punkt i checklistan är en egenskap som granskningen mätte, och varje token i kontraktet är ett värde som stängde ett gap i korpusen.

1

Varje interaktiv komponent levererar en state=focus-visible-variant.

Inte “systemet har en fokusring.” En variant namngiven focus-visible på själva komponenten, med konturlinjefärgen, bredden och offsetten bundna till fokusring-tokenen. Varianten är vad ingenjören kopierar in i implementeringen; utan den gissar ingenjören.

2

Varje innehållsbild har alternativtext i ett plugin-hanterat fält eller en dokumenterad lagernamnskonvention.

Välj en plats och följ den. Starks alternativtextfält, lagernamnet behandlat som alt, eller ett sidokalkylblad — något av de tre fungerar, men bara om varje bild i filen använder samma. Ikonknappar får också en anteckning om tillgängligt namn, på samma plats, med den exakta sträng ingenjören ska lägga i aria-label.

3

Läsordning dokumenteras på varje sida där DOM-ordningen divergerar från den visuella ordningen.

Den enklaste dokumentationen är ett numrerat lager tillagt med ett plugin (Stark har ett, flera communityplugins också). För sidor vars ordning trivialt är uppifrån-och-ned-vänster-till-höger kan du hoppa över lagret; för allt som använder CSS Grid-placering, namngivna områden eller absolut positionering är lagret obligatoriskt.

4

Varje animerat eller övergångselement har en reducerad-rörelse-variant på duken.

En andra ram, en andra variant, eller en dokumenterad “ingen animering”-version. Ingenjören ska inte uppfinna det reducerade-rörelse-fallet — designern ska specificera om modalen tonar in istället för att glida, om snackbaren visas direkt istället för att glida, om sidövergången utelämnas helt.

5

För dubbeltema-filer kontrolleras kontrasten i det mörka temat separat, inte härledd från det ljusa temat.

Mörktlägescontrastmatematik är sitt eget problem; att vända paletten räcker inte. Kör Stark eller Able på varje komponent i mörkt läge, inte bara i ljust. Dokumentera kontrastförhållandet i variantens anteckningar så att ingenjören kan bekräfta att implementeringen matchar.

6

Filen levereras med ett tokenkontrakt: en platt lista över varje Figma-variabel mappad till sin CSS-egna egenskap.

Kontraktet är bryggan mellan filen och kodbasen. Ett typiskt kontrakt ser ut som tabellen nedan: varje rad namnger en Figma-variabel, den CSS-egna egenskap ingenjören ska binda den till, värdet i ljust tema, värdet i mörkt tema och det WCAG-framgångskriterium tokenen deltar i.

Figma-variabelCSS-egna egenskapLjust värdeMörkt värdeWCAG-kopplingar
color/focus-ring—focus-ring#0B57D0#A8C7FA2.4.7, 1.4.11
color/text/body—text-body#1F1F1F#E3E3E31.4.3 (4,5:1 mot yta)
color/surface/raised—surface-raised#FFFFFF#1F1F1F1.4.11 (3:1 mot granne)
size/touch-target/min—touch-target-min44px44px2.5.5, 2.5.8
motion/duration/standard—motion-standard200ms200ms2.3.3 (hoppa vid reducerad rörelse)
motion/duration/reduced—motion-reduced0ms0ms2.3.3
Varför kontraktet är hävstången

När kontraktet väl finns är ingenjörens jobb mekaniskt: bind CSS-egna egenskapen till Figma-variabeln, leverera implementeringen, granska genom att jämföra de renderade värdena med kontraktet. Utan kontraktet är varje bindning ett omdömesbeslut, och omdömesbeslut ackumuleras till 60%-gapet. Kontraktet är den enda artefakt som förflyttar tillgängligheten från “ingenjören är ansvarig vid överlämning” till “systemet är ansvarigt vid designtillfälle.”


Slutsats: filen är kontraktet

50-filsgranskningen avslutas med ett enkelt fynd. Överlämningen misslyckas med tillgänglighet inte för att designers inte bryr sig och inte för att ingenjörer inte bryr sig, utan för att filen — Figma-filen, den enda artefakt alla parter läser — inte bär tillgänglighetsbesluten som förstklassiga egenskaper. Fokusstatus, alternativtext, läsordning, rörelseinställningar, mörktlägeskontrast: vart och ett är ett designbeslut, vart och ett hör hemma i filen, vart och ett befinner sig för tillfället på annan plats. I en klistislapp, i ett Slack-meddelande, i ett separat kalkylblad, i ingenjörens huvud fredagen klockan 16.

Lösningen är inte en hjältedesigner eller en hjälteingenjör. Det är en arbetsflödesförändring på teamnivå: varje interaktiv komponent levererar en fokusvariant, varje bild bär alternativtext på en plugin-hanterad plats, läsordning är lagd ovanpå varje icke-trivial sida, animeringar specificerar sin reducerade-rörelse-motsvarighet, mörktlägeskontrast kontrolleras separat från ljus, och filen levereras bredvid ett tokenkontrakt som namnger varje variabel implementeringen binder till. Inget av dessa steg är nytt, inget kräver ett verktyg vi inte redan har, och varje team som antar dem som releasegatesteg stänger det mesta av de gap vi mätte på en enda releasecykel.

Det djupare fyndet är att designsystemsteam redan gör detta ungefär dubbelt så ofta som produktteam. Lyftet som designsystemsteamen ger är exakt det lyft som disciplinen att bygga ett system pålägger: komponenter namnges, egenskaper räknas upp, varianter görs synliga, tokens görs explicita. Att ta med samma disciplin till produktnivåfiler — även utan ett fullständigt designsystem under — stänger det mesta av överlämningsgapet. Det är inte ett verktygsproblem längre. Det är ett arbetsflödesval.

”Filen borde anlända med tillgänglighetsbesluten redan fattade. Allt annat innebär att ingenjören uppfinner dem vid det sämsta möjliga tillfället, med det minsta möjliga sammanhanget, under den snävaste möjliga tidsfristen.”

— disabilityworld.org:s ingenjörsbord, avslutande anteckning