Hoppa till innehållet

Tabeller

En riktig <table>. Streck istället för zebra.

Tabell

Siffror är högerställda och tabulära.

Produce

Projekt

ProjektKundAnsvarigNedlagtBudgetStatusÅtgärder
Webbplats 2026Region SkåneLinn Svensson412,5600Pågår
IntranätKommunalPaul Andersson228,0240Väntar
Förvaltning 2026SkatteverketNiklas Ek247,5240Försenat
Municipio CloudUmeå universitetFredrik Holm96,0120Pågår
Analys-onboardingBillerudEva-Maria Nilsson18,520Klart
<div class="ws-table-scroll">
  <table class="ws-table">
    <thead><tr><th scope="col">Projekt</th><th scope="col" data-align="end">Timmar</th></tr></thead>
    <tbody><tr><td>…</td><td class="ws-num">412,5</td></tr></tbody>
  </table>
</div>

Sortering

Riktningen ligger i aria-sort; pilen ritas ur det.

ProjektNedlagtBudget
Webbplats 2026412,5600
Förvaltning 2026247,5240
Intranät228,0240
<!-- sorteringen är en URL: en länk, inte en knapp -->
<th scope="col" aria-sort="descending">
  <a href="?sort=hours&amp;direction=asc">Nedlagt</a>
</th>
Webbplats 2026412,5600
Förvaltning 2026247,5240
Intranät228,0240
<th scope="col" aria-sort="descending">
  <button type="button">Nedlagt</button>
</th>

Rad för rad

<Table>, <HeadCell>, <Row> och <Cell>, eller headCell(), row() och cell(). En rubrik med href sorteras av servern; med sortable sorteras den här på sidan av init(). Klicka på en rubrik.

Webbplats 2026Region Skåne412,5600
IntranätKommunal228,0240
Förvaltning 2026Skatteverket247,5240
Municipio CloudUmeå universitet96,0120
Analys-onboardingBillerud18,520
Utan budgetIntern3,5
<Table label="Projekt" fixed>
  <Fragment slot="head">
    <HeadCell sortable width="lg">Projekt</HeadCell>
    <HeadCell sortable>Kund</HeadCell>
    <HeadCell sortable type="num" align="end" width="sm">Nedlagt</HeadCell>
    <HeadCell sortable type="num" align="end" width="sm">Budget</HeadCell>
  </Fragment>
  <Row><Cell>Webbplats 2026</Cell>…<Cell num data-sort="412.5">412,5</Cell></Row>
</Table>

<!-- sorterad av servern -->
<HeadCell sort="descending" href="?sort=timmar&riktning=asc" align="end">Nedlagt</HeadCell>

Grupper och inställt

En grupprubrik är en neutral rad med <th scope="rowgroup">. data-indent sätter en rad som hör till raden ovanför ett steg in. En inställd rad (data-state="cancelled") stryks över; en etikett i den gör det inte och säger varför. Bredder med data-width på <col> eller rubriken, och ws-table--min-md eller --min-lg för en tabell som hellre rullar än kläms.

TidHändelseAnsvarig
Måndag 12 oktober
09:00–09:30Avstämning med Region Skåne BekräftadLinn Svensson
FörberedelserAgenda och underlagLinn Svensson
13:00–15:00Workshop: informationsarkitektur InställdPaul Andersson
Tisdag 13 oktober
10:00–11:00LeveransgenomgångNiklas Ek

Utanför en tabell: Workshop 13:00 Inställd

<Table label="Kalender" fixed minWidth="md">
  <col slot="colgroup" data-width="sm" /><col slot="colgroup" />…
  <Row group><Cell header="rowgroup" colspan={3}>Måndag 12 oktober</Cell></Row>
  <Row><Cell>09:00</Cell><Cell>Avstämning <StatusPill>Bekräftad</StatusPill></Cell>…</Row>
  <Row state="cancelled"><Cell>13:00</Cell><Cell>Workshop <StatusPill>Inställd</StatusPill></Cell>…</Row>
  <Row><Cell indent>Förberedelser</Cell>…</Row>
</Table>

<span class="ws-cancelled">Workshop</span>   <!-- utanför en tabell -->

Markera rader

En verktygsrad med bulk är ett formulär ovanför tabellen, och dess kryssrutor står i raderna med form. Antalet läses upp, och åtgärderna väntar tills något är markerat. Utan skript skickas formuläret ändå.

DatumHändelse
mån 12 oktAvstämning
tis 13 oktWorkshop
ons 14 oktLeveransgenomgång
<ToolbarRow bulk id="sortera" action="/calendar/sort" aria-label="Markerade händelser">
  <select name="klient" aria-label="Klient för markerade">…</select>
  <Button type="submit" size="sm" name="kategori" value="klient" data-malm-bulk-action>Koppla till klient</Button>
</ToolbarRow>

<th><input type="checkbox" data-malm-bulk-all="sortera" aria-label="Markera alla" /></th>
<td><input type="checkbox" name="id" value="412" form="sortera" data-malm-bulk-row aria-label="Markera Avstämning" /></td>

Summor

Dubbelt streck ovanför summan, som i en huvudbok.

ProjektNedlagt
Webbplats 2026412,5
Intranät228,0
Förvaltning 2026247,5
Summa markerade640,5
<tfoot><tr><th scope="row">Summa</th><td class="ws-num">906,0</td></tr></tfoot>

Breda tabeller

Scrollar i sin egen låda. tabindex='0' gör den nåbar med tangentbord.

MedarbetareMånTisOnsTorsFreSumma
Anton Berg8,07,58,06,08,037,5
Eva-Maria Nilsson8,08,08,08,08,040,0
Fredrik Holm8,08,08,08,08,040,0
Johan de Geer8,07,58,08,08,039,5
Linn Svensson8,08,08,06,08,037,5
Niklas Ek8,08,08,08,08,040,0
Paul Andersson8,07,58,08,08,039,5
Westin Lund8,08,08,08,08,040,0
<div class="ws-table-scroll" tabindex="0" role="region" aria-label="Rapport">
  <table class="ws-table">…</table>
</div>

Fastnålade kolumner

Kolumnen som säger vilken rad det är står kvar när resten scrollar i sidled.

MedarbetareMånTisOnsTorsFreSumma
Alva Nyström8,07,58,06,09,038,5
Bengt Ohlsson8,08,04,08,08,036,0
<td data-pin="start">Alva Nyström</td>
<td data-pin="end" class="ws-num">38,5</td>

Tonade rader

Tonen säger vad raden är, aldrig hur den ser ut — och bär sin egen text­färg.

FakturaFörfallerBelopp SEK
2026-11830 sep42 500,00
2026-11712 sep18 000,00
2026-1043 aug7 250,00
2026-101Betald31 000,00
<tr data-tint="warn">…</tr>
<tr data-tint="danger">…</tr>

Täta tabeller

--dense för en tabell med många kolumner siffror i en panel. --nowrap håller varje cell på en rad, --top ställer cellerna upptill och --fixed tar bredderna från rubrikcellerna. th[data-group] står över en grupp kolumner, och ws-table-scroll--framed ger tabellen en egen kant i en panels innehåll.

Sidor

SidaSeptemberAugusti
SidaBesökPersonerBesökPersoner
/start12 4803 91211 9023 804
/lon-och-ersattning4 3102 2073 9882 119
/semester2 0451 6303 8112 740
<div class="ws-table-scroll ws-table-scroll--framed" tabindex="0">
  <table class="ws-table ws-table--dense ws-table--nowrap ws-table--no-sticky">
    <thead>
      <tr><th scope="col"></th><th scope="colgroup" colspan="2" data-group>September</th><th scope="colgroup" colspan="2" data-group>Augusti</th></tr>
      <tr><th scope="col">Sida</th><th scope="col" data-align="end">Besök</th>…</tr>
    </thead>
    …
  </table>
</div>

Värmeceller

En cell vars värde också är dess ton: accenten blandad i ytan med --ws-heat, som produkten sätter från datan. Den mörkaste tonen slutar där texten fortfarande klarar AAA.

Dag89101112
Mån4811224013022
Tis3517020510112
<td data-heat style="--ws-heat: 40%">112</td>
<td data-heat style="--ws-heat: 80%">240</td>

Namn på två rader

Ett namn och det det hör till: en webbplats över sin domän, en kund över sin kortform. --mono sätter andra raden som kod, för ett id eller en sökväg.

Göteborgs stadgoteborg.seStartsidan/sv/start
<span class="ws-name">
  <span class="ws-name__main">Göteborgs stad</span>
  <span class="ws-name__sub">goteborg.se</span>
</span>

Ändringar

Vad ett fält var och vad det blev — raden en ändringslogg består av.

  • Timmar:7,508,00
  • Kund:tomtWhitespace AB
  • Not:Uppföljning inför sprintmötettomt
  • Timpris:dolt — kräver behörighet
<li class="ws-change">
  <span class="ws-change__label">Timmar:</span>
  <span class="ws-change__values">
    <span class="ws-change__from">7,50</span>
    <span class="ws-change__arrow" aria-hidden="true">→</span>
    <span class="ws-change__to">8,00</span>
  </span>
</li>
Jämförelse

--compare: det tidigare värdet är ett värde i sin egen rätt — förra periodens siffra — och stryks inte. Skillnaden kan följa som __delta.

  • Besök:11 90212 480+4,9 %
<li class="ws-change ws-change--compare">
  <span class="ws-change__label">Besök:</span>
  <span class="ws-change__values">
    <span class="ws-change__from">11 902</span>
    <span class="ws-change__arrow" aria-hidden="true">→</span>
    <span class="ws-change__to">12 480</span>
    <span class="ws-change__delta">+4,9 %</span>
  </span>
</li>

Sammanfattning

Som GOV.UK: svaren att se över innan något skickas, varje rad med en länk för att ändra den. Tre kolumner när listan har plats, staplad när den inte har det.

Projekt
Webbplats 2026
Ändra projekt
Kund
Region Skåne
Ändra kund
Period
1–30 september 2026
Ändra period
Timmar
412,5 av 600
Ändra timmar
Skapad av
Linn Svensson
<dl class="ws-summary-list">
  <div class="ws-summary-list__row">
    <dt class="ws-summary-list__key">Projekt</dt>
    <dd class="ws-summary-list__value">Webbplats 2026</dd>
    <dd class="ws-summary-list__actions">
      <a href="#project">Ändra<span class="ws-sr-only"> projekt</span></a>
    </dd>
  </div>
</dl>

Värmekarta

Elva steg, data-heat="0"–"10", satta från datat. Det mörkaste steget är markeringstonen, så siffran har samma färg i alla steg.

När används den?

Europe/Stockholm891011121314151617
Mån851051111249888116888593
Tis89881021031009599829495
Ons75128473798867788440
Tor81847730737876806565
Fre8197104908710190898486
Lör6
Sön76
<table class="ws-table ws-heatmap">
  <tbody><tr><th scope="row">Mån</th><td data-heat="7">85</td>…</tr></tbody>
</table>