Yleistä
Taulukoiden ja listojen avulla voidaan näyttää tietoryhmiä helposti selailtavassa muodossa.
Oikean esitystavan valinta vaikuttaa siihen, miten helposti käyttäjä löytää ja hahmottaa tiedot. Hyvin valittu esitystapa vähentää myös käyttäjän kognitiivista kuormaa. Myös käytettävissä oleva tila voi asettaa rajoitteita.
Taulukot
Taulukot mahdollistavat suurtenkin tietomassojen selailun, käsittelyn ja vertailun. Olennaiset tiedot on usein helppo löytää taulukosta, ja myös tietojen järjestäminen ja suodattaminen on tehokasta. Taulukot voi toteuttaa TableV2-komponentilla
Taulukot sopivat tyypillisesti esimerkiksi asiantuntijakäyttöliittymiin, joissa tietomäärät ovat suuria ja joissa tietoja pitää voida selailla tehokkaasti. Asiantuntijakäyttöliittymissä näytön leveys ei yleensä rajoita taulukon kokoa samalla tavalla kuin kapeammissa näkymissä, koska niitä ei yleensä käytetä mobiililaitteilla.
Huomioi, että taulukot vaativat riittävästi tilaa vaakasuunnassa. Ne eivät siten välttämättä sovellu kapeisiin näkymiin, jotka ovat tyypillisiä henkilöasiakkaiden palveluissa. Tarvittaessa taulukkoon voi sisällyttää vaakasuuntaisen vierityspalkin, mutta tämä usein huonontaa käytettävyyttä.
Käytä taulukkoa, kun
- tietoja pitää pystyä vertailemaan tai analysoimaan
- tietoja pitää pystyä suodattamaan ja lajittelemaan
- numeerisia tietoja pitää pystyä laskemaan yhteen
- tietoryhmät ovat rakenteeltaan yhteismitallisia, ja niille voidaan antaa yhteiset sarakeotsikot
- tietomassat ovat suuria, ja tietoja pitää pysytä näkemään mahdollisimman paljon kerrallaan
- käytettävissä on riittävästi vaakasuuntaista tilaa.
function ExampleTable() {
const headers = [
{
name: "Nimi",
key: "nimi",
align: "left",
},
{
name: "Menolaji",
key: "menolaji",
align: "left",
},
{
name: "Lisätieto",
key: "lisatieto",
align: "left",
},
{
name: "Ilmoitettu",
key: "ilmoitettu",
align: "right",
},
{
name: "Huomioitu",
key: "huomioitu",
align: "right",
},
];
const rows = [
{
id: "row-0",
nimi: "Suominen, Anni Onni",
menolaji: "Perusosa",
lisatieto: "Yksin asuva",
ilmoitettu: null,
huomioitu: 487.89,
},
{
id: "row-1",
nimi: "Suominen, Anni Onni",
menolaji: "Hammashoitomaksu",
lisatieto: null,
ilmoitettu: 75.0,
huomioitu: 75.0,
},
{
id: "row-2",
nimi: "Suominen, Anni Onni",
menolaji: "Asiakirjamaksu",
lisatieto: null,
ilmoitettu: 150.0,
huomioitu: 150.0,
},
{
id: "row-3",
nimi: "Suominen, Anni Onni",
menolaji: "Vakuutusmaksu",
lisatieto: null,
ilmoitettu: 50.0,
huomioitu: 50.0,
},
{
id: "row-4",
nimi: "Suominen, Anni Onni",
menolaji: "Asiantuntijalausunto",
lisatieto: null,
ilmoitettu: 350.0,
huomioitu: 350.0,
},
{
id: "row-5",
nimi: "Suominen, Anni Onni",
menolaji: "Lääkekulut",
lisatieto: null,
ilmoitettu: 15.0,
huomioitu: 15.0,
},
];
const formatCurrency = (amount) => new Intl.NumberFormat("fi-FI", { minimumFractionDigits: 2 }).format(amount);
const getTotalSum = (data, prop) => data.reduce((sum, el) => sum + (Number(el[prop]) || 0), 0);
const { data, sortKey, sortOrder, requestSort } = useSort(rows);
const description = {
none: "ei järjestystä",
ascending: "järjestetty nousevasti",
descending: "järjestetty laskevasti",
};
const sortLabel = headers.find((el) => el.key === sortKey)?.name || undefined;
const sortDescription = description?.[sortOrder];
return (
<TableV2 sortLabel={sortLabel} sortDescription={sortDescription} size="xs">
<TableV2Caption className="kds-mb-1">Menot</TableV2Caption>
<TableV2Head>
<TableV2HeadRow hasBorder={false}>
{headers.map(({ key, name, align }) => (
<TableV2HeadCell
align={align}
key={key}
onClick={() => requestSort(key)}
order={sortKey === key ? sortOrder : null}
scope="col"
>
{name}
</TableV2HeadCell>
))}
</TableV2HeadRow>
<TableV2HeadRow>
<TableV2HeadCell dense="top" scope="col">
<Select size="xs" aria-label="Suodata nimen perusteella">
<option>Suodata</option>
<option>Suominen Anni Onni</option>
</Select>
</TableV2HeadCell>
<TableV2HeadCell dense="top" scope="col">
<Select size="xs" aria-label="Suodata menolajin perusteella">
<option>Suodata</option>
<option>Hammashoitomaksu</option>
<option>Asiakirjamaksu</option>
</Select>
</TableV2HeadCell>
<TableV2HeadCell as="td" dense="top" />
<TableV2HeadCell as="td" dense="top" />
<TableV2HeadCell as="td" dense="top" />
</TableV2HeadRow>
</TableV2Head>
<TableV2Body>
{data.map((row) => (
<TableV2Row key={row.id}>
{headers.map(({ key, align }) => (
<TableV2Cell key={`${key}-${row.id}`} align={align}>
{typeof row[key] === "number" && formatCurrency(row[key])}
{typeof row[key] !== "number" && row[key]}
</TableV2Cell>
))}
</TableV2Row>
))}
</TableV2Body>
<TableV2Footer>
<TableV2Row isSummary>
<TableV2Cell colSpan={3} align="right">
Yhteensä
</TableV2Cell>
<TableV2Cell align="right">{formatCurrency(getTotalSum(rows, "ilmoitettu"))}</TableV2Cell>
<TableV2Cell align="right">{formatCurrency(getTotalSum(rows, "huomioitu"))}</TableV2Cell>
</TableV2Row>
</TableV2Footer>
</TableV2>
);
}
render(<ExampleTable />);
Listat
Listojen avulla selattavat tietomassat saadaan sopimaan taulukoita paremmin kapeille näytöille. Listojen avulla voi esittää myös sellaisia tietoja, jotka eivät luonteeltaan sovi taulukoihin.
Listojen periaatteita noudattaa myös korttimainen esitystapa.
Käytä listaa, kun
- käyttäjän on tärkeämpää löytää ja tarkastella yksittäisiä kohteita kuin vertailla niitä keskenään
- tietoryhmillä ei ole keskenään samanlaista rakennetta tai ne eivät ole keskenään yhteismitallisia
- vaakasuuntaista tilaa on käytössä rajallisesti (esim. kapea mobiilinäkymä)
- tietoryhmä sisältää visuaalisia elementtejä (esim. kuvia).
function TopicalElement({ date, heading, badge, desc }) {
return (
<div
className="kds-p-0 kds-flex kds-flex-column kds-mb-2 kds-box"
style={{ borderBottom: ".125rem solid #e1e1e1" }}
>
<div className="kds-relative kds-w-full">
<Text color="muted" className="kds-mb-0">
{date}
<Badge variant="light" className="kds-ml-2">
{badge}
</Badge>
</Text>
<Heading as="h5" className="kds-w-full kds-my-2 kds-pl-0" style={{ maxWidth: "100%" }}>
{heading}
</Heading>
<IconUiArrowRight style={{ float: "right" }} size="s" />
<Text color="muted">{desc}</Text>
</div>
</div>
);
}
function ArticleList() {
return (
<div className="md:w-[50%]">
<Heading as="h4" className="kds-mt-0">
Tiedotteet ja artikkelit
</Heading>
<List unstyled>
<ListItem>
<TopicalElement
date="13.9.2025"
heading="Matkailijan terveysopas: Näin varaudut sairaanhoitoon ulkomailla"
badge="Artikkeli"
desc="Henkilöasiakkaat"
/>
</ListItem>
<ListItem>
<TopicalElement
date="9.6.2025"
heading="Veronpalautus voi vaikuttaa toimeentulotukeen"
badge="Tiedote"
desc="Henkilöasiakkaat | Kumppanit | Media ja sidosryhmät"
/>
</ListItem>
<ListItem>
<TopicalElement
date="5.6.2025"
heading="Pohditko toimeentulotuen hakemista? Nämä asiat voivat estää tuen saamisen"
badge="Artikkeli"
desc="Henkilöasiakkaat"
/>
</ListItem>
<ListItem>
<TopicalElement
date="4.6.2025"
heading="Kela ei enää lähetä kirjettä kuntoutuskustannusten maksamisesta"
badge="Artikkeli"
desc="Henkilöasiakkaat"
/>
</ListItem>
</List>
</div>
);
}
render(<ArticleList />);
function TopicalElement({ date, heading, badge, desc, variant, type }) {
return (
<div
className="kds-p-0 kds-flex kds-flex-column kds-mb-2 kds-box"
style={{ borderBottom: ".125rem solid #e1e1e1" }}
>
<div className="kds-relative kds-w-full">
<Text color="muted" className="kds-mb-2">
{date}
<span style={{ float: "right" }}>{type}</span>
</Text>
<Heading as="h5" className="kds-w-full kds-my-0 kds-pl-0" style={{ maxWidth: "100%" }}>
{heading}
</Heading>
<Badge variant={variant} className="kds-mb-4">
{badge}
</Badge>
<Text>{desc}</Text>
</div>
</div>
);
}
function ArticleList() {
return (
<div style={{ maxWidth: "24rem" }}>
<List unstyled>
<ListItem>
<TopicalElement
date="13.9.2025"
heading="Sairastaminen"
badge="Valmis"
desc="Lorem ipsum dolor sit amet, consectetur adipiscing elit"
variant="success"
type={
<>
<IconUiPhone className="kds-mr-2" />
Puhelu
</>
}
/>
</ListItem>
<ListItem>
<TopicalElement
date="9.6.2025"
heading="Työttömyys"
badge="Odottaa vastausta"
desc="Lorem ipsum dolor sit amet, consectetur adipiscing elit"
variant="warning"
type={
<>
<IconUiMessage className="kds-mr-2" />
Viesti
</>
}
/>
</ListItem>
<ListItem>
<TopicalElement
date="5.6.2025"
heading="Kuntoutukseen hakeminen"
badge="Valmis"
desc="Lorem ipsum dolor sit amet, consectetur adipiscing elit"
variant="success"
type={
<>
<IconUiPhone className="kds-mr-2" />
Puhelu
</>
}
/>
</ListItem>
<ListItem>
<TopicalElement
date="4.6.2025"
heading="Lapsen syntymä"
badge="Valmis"
desc="Lorem ipsum dolor sit amet, consectetur adipiscing elit"
variant="success"
type={
<>
<IconUiChatBubble className="kds-mr-2" />
Chat
</>
}
/>
</ListItem>
</List>
</div>
);
}
render(<ArticleList />);
function TopicalElement({ heading, desc, phone, mail }) {
return (
<div
className="kds-p-0 kds-flex kds-flex-column kds-mb-2 kds-box"
style={{ borderBottom: ".125rem solid #e1e1e1" }}
>
<div style={{ width: "7rem", height: "8rem", backgroundColor: "#e1e1e1" }} className="kds-mr-2 kds-mt-2" />
<div className="kds-relative kds-w-full">
<Heading as="h5" className="kds-w-full kds-mb-0 kds-pl-0 kds-mt-2" style={{ maxWidth: "100%" }}>
{heading}
</Heading>
<Text color="muted">{desc}</Text>
<Link href="/" className="kds-block kds-mb-2">
{mail}
</Link>
<Link href="/" className="kds-block kds-mb-4">
{phone}
</Link>
</div>
</div>
);
}
function ArticleList() {
return (
<div style={{ maxWidth: "24rem" }}>
<List unstyled>
<ListItem>
<TopicalElement heading="Eija Esimerkki" desc="tutkija" mail="eija.esimerkki@kela.fi" phone="050 123 4567" />
</ListItem>
<ListItem>
<TopicalElement
heading="Matti Meikäläinen"
desc="erikoistutkija"
mail="matti.meikäläinen@kela.fi"
phone="050 123 4567"
/>
</ListItem>
<ListItem>
<TopicalElement
heading="Kerttu Kelalainen"
desc="tutkimuspäälikkö"
mail="kerttu.kelalainen@kela.fi"
phone="050 123 4567"
/>
</ListItem>
</List>
</div>
);
}
render(<ArticleList />);
Taulukon muuttaminen listaksi
Suuret taulukot ovat harvoin selkein tapa esittää tietoa kansalaisten palveluissa, joiden tulee toimia myös mobiilinäytöillä. Taulukoita voikin olla tarpeen muuttaa listoiksi esimerkiksi tilanteissa, joissa käytössä ollut taulukkomuotoinen esitystapa pitäisi saada muutettua mobiilikäyttöliittymälle sopivaan muotoon.
Jos taulukko on laaja, tiedot voi olla joskus hyödyllistä jakaa useampaan listaan. Laajojen taulukoiden osalta on myös hyvä varmistaa, ovatko kaikki tiedot käyttäjän kannalta olennaisia.
Yksinkertaisin tapa muuttaa taulukko listaksi on näyttää kunkin rivin tiedot allekkain ryhmänä. Jos tilaa on riittävästi, tietoja voi esittää myös rinnakkain.
const tableVariants = ["light", "light", "light", "primary"];
function BadgeTable({ rows = 3 }) {
return (
<div className="w-full">
<TableV2>
<TableV2Head>
<TableV2HeadRow>
{tableVariants.map((variant, idx) => (
<TableV2HeadCell key={`head-${idx}`}>
<Badge variant="dark" className={idx < 3 ? "kds-w-2/4" : "kds-w-1/4"} style={{ height: ".75rem" }}>
{" "}
</Badge>
</TableV2HeadCell>
))}
</TableV2HeadRow>
</TableV2Head>
<TableV2Body>
{[...Array(rows)].map((_, rowIndex) => (
<TableV2Row key={`row-${rowIndex}`}>
{tableVariants.map((variant, cellIndex) => (
<TableV2Cell key={`cell-${rowIndex}-${cellIndex}`}>
<Badge
variant={rowIndex === 2 && variant === "primary" ? "danger" : variant}
className={cellIndex < 3 ? "kds-w-2/4" : "kds-w-1/4"}
style={{ height: ".75rem" }}
>
{" "}
</Badge>
</TableV2Cell>
))}
</TableV2Row>
))}
</TableV2Body>
</TableV2>
</div>
);
}
render(<BadgeTable />);
function BadgeList({ rows = 3 }) {
return (
<div>
{[...Array(rows)].map((_, rowIndex) => (
<div key={`list-row-${rowIndex}`} className="grid grid-cols-2 gap-2" style={{ maxWidth: "24rem" }}>
<List unstyled style={{ borderBottom: ".125rem solid #e1e1e1" }} className="kds-py-4">
<ListItem className="flex items-center">
<Badge variant={"dark"} className="kds-w-2/4" style={{ height: ".75rem" }}>
{" "}
</Badge>
<Badge
variant={rowIndex !== 2 ? "primary" : "danger"}
className="kds-w-1/4 kds-ml-4"
style={{ height: ".75rem" }}
>
{" "}
</Badge>
</ListItem>
<ListItem className="flex items-center">
<Badge variant={"light"} className="kds-w-2/4" style={{ height: ".75rem" }}>
{" "}
</Badge>
</ListItem>
<ListItem className="flex items-center">
<Badge variant={"light"} className="kds-w-2/4" style={{ height: ".75rem" }}>
{" "}
</Badge>
</ListItem>
</List>
</div>
))}
</div>
);
}
render(<BadgeList />);
Listan ulkoasua ja käytettävyyttä voi parantaa kiinnittämällä huomiota seuraaviin asioihin:
- Minkälainen tietojen järjestys tukee listan silmäilyä?
- Mitkä tiedot ovat tarpeellisia? Voiko taulukon sarakeotsikot jättää listasta pois?
- Onko jotain tietoja tarpeen korostaa?
<TableV2>
<TableV2Head>
<TableV2HeadRow>
<TableV2HeadCell>Etuus</TableV2HeadCell>
<TableV2HeadCell>Ratkaisupäivä</TableV2HeadCell>
<TableV2HeadCell>Ratkaisu</TableV2HeadCell>
<TableV2HeadCell>Ajanjakso</TableV2HeadCell>
<TableV2HeadCell>Lisätieto</TableV2HeadCell>
<TableV2HeadCell>Päätös</TableV2HeadCell>
</TableV2HeadRow>
</TableV2Head>
<TableV2Body>
<TableV2Row>
<TableV2Cell>Äitiyspäiväraha</TableV2Cell>
<TableV2Cell>14.3.2022</TableV2Cell>
<TableV2Cell>Myönnetty</TableV2Cell>
<TableV2Cell>28.3.2022-31.3.2023</TableV2Cell>
<TableV2Cell>Nostrud exercitation</TableV2Cell>
<TableV2Cell>
<Link href="#" standalone>
Avaa päätös
</Link>
</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Sairauspäiväraha</TableV2Cell>
<TableV2Cell>15.5.2022</TableV2Cell>
<TableV2Cell>Myönnetty</TableV2Cell>
<TableV2Cell>20.4.2022-31.3.2023</TableV2Cell>
<TableV2Cell></TableV2Cell>
<TableV2Cell>
<Link href="#" standalone>
Avaa päätös
</Link>
</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Työkyvyttömyyseläke</TableV2Cell>
<TableV2Cell>30.5.2022</TableV2Cell>
<TableV2Cell>Hylätty</TableV2Cell>
<TableV2Cell>28.3.2022-</TableV2Cell>
<TableV2Cell>Nostrud exercitation</TableV2Cell>
<TableV2Cell>
<Link href="#" standalone>
Avaa päätös
</Link>
</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Työttömyyspäiväraha</TableV2Cell>
<TableV2Cell>30.5.2025</TableV2Cell>
<TableV2Cell>Myönnetty</TableV2Cell>
<TableV2Cell>20.4.2025-31.6.2025</TableV2Cell>
<TableV2Cell></TableV2Cell>
<TableV2Cell>
<Link href="#" standalone>
Avaa päätös
</Link>
</TableV2Cell>
</TableV2Row>
</TableV2Body>
</TableV2>
<List unstyled style={{ maxWidth: "24rem" }}>
<ListItem style={{ borderBottom: ".125rem solid #e1e1e1", paddingBottom: "1rem" }}>
<Heading as="h5" className="kds-mt-0">
Äitiyspäiväraha
</Heading>
<DescriptionList columns={1} stack>
<DescriptionListItem label="Ratkaisupäivä">14.3.2025</DescriptionListItem>
<DescriptionListItem label="Ajanjakso">28.3.2022-31.3.2023</DescriptionListItem>
<DescriptionListItem label="Ratkaisu">Myönnetty</DescriptionListItem>
<DescriptionListItem label="Lisätieto">Nostrud exercitation</DescriptionListItem>
</DescriptionList>
<Link href="#" standalone target="_blank">
Avaa päätös
</Link>
</ListItem>
<ListItem style={{ borderBottom: ".125rem solid #e1e1e1", paddingBottom: "1rem" }}>
<Heading as="h5">Sairauspäiväraha</Heading>
<DescriptionList columns={1} stack>
<DescriptionListItem label="Ratkaisupäivä">14.3.2025</DescriptionListItem>
<DescriptionListItem label="Ajanjakso">28.3.2022-31.3.2023</DescriptionListItem>
<DescriptionListItem label="Ratkaisu">Myönnetty</DescriptionListItem>
<DescriptionListItem label="Lisätieto">Nostrud exercitation</DescriptionListItem>
</DescriptionList>
<Link href="#" standalone target="_blank">
Avaa päätös
</Link>
</ListItem>
</List>
<List unstyled style={{ maxWidth: "24rem" }} size="sm">
<ListItem style={{ borderBottom: ".125rem solid #e1e1e1", paddingBottom: "1rem" }}>
<Heading as="h5" className="kds-mt-0">
Äitiyspäiväraha
</Heading>
<DescriptionList columns={1} spacing="xs">
<DescriptionListItem label="Ratkaisupäivä">14.3.2025</DescriptionListItem>
<DescriptionListItem label="Ajanjakso">28.3.2022-31.3.2023</DescriptionListItem>
<DescriptionListItem label="Ratkaisu">Myönnetty</DescriptionListItem>
<DescriptionListItem label="Lisätieto">Nostrud exercitation</DescriptionListItem>
</DescriptionList>
<Link href="#" standalone target="_blank">
Avaa päätös
</Link>
</ListItem>
<ListItem style={{ borderBottom: ".125rem solid #e1e1e1", paddingBottom: "1rem" }}>
<Heading as="h5" className="kds-mt-2">
Sairauspäiväraha
</Heading>
<DescriptionList columns={1} spacing="xs">
<DescriptionListItem label="Ratkaisupäivä">14.3.2025</DescriptionListItem>
<DescriptionListItem label="Ajanjakso">28.3.2022-31.3.2023</DescriptionListItem>
<DescriptionListItem label="Ratkaisu">Myönnetty</DescriptionListItem>
<DescriptionListItem label="Lisätieto">Nostrud exercitation</DescriptionListItem>
</DescriptionList>
<Link href="#" standalone target="_blank">
Avaa päätös
</Link>
</ListItem>
</List>
function TopicalElement({ date, heading, badge, desc, dateRange }) {
return (
<div className="kds-flex kds-flex-column kds-mb-2 kds-box" style={{ borderBottom: ".125rem solid #e1e1e1" }}>
<div className="kds-relative kds-w-full kds-mb-4">
<Text color="muted" className="kds-mb-0">
{date}
</Text>
<Heading as="h5" className="kds-w-full kds-my-2 kds-pl-0" style={{ maxWidth: "100%" }}>
{heading}
</Heading>
<Text color="muted" className="kds-mb-0">
{dateRange}
</Text>
{badge}
<Text>{desc}</Text>
<Link href="#" standalone target="_blank">
Avaa päätös
</Link>
</div>
</div>
);
}
function ArticleList() {
return (
<div style={{ maxWidth: "24rem" }}>
<List unstyled>
<ListItem>
<TopicalElement
date="13.9.2025"
dateRange="28.3.2022 - 31.3.2023"
heading="Äitiyspäiväraha"
badge={
<Badge variant="success" className="kds-mb-2">
Myönnetty
</Badge>
}
desc="Nostrud exercitation ullamco laboris."
/>
</ListItem>
<ListItem>
<TopicalElement
date="13.9.2025"
dateRange="28.3.2022 - 31.3.2023"
heading="Sairauspäiväraha"
badge={
<Badge variant="success" className="kds-mb-2">
Myönnetty
</Badge>
}
/>
</ListItem>
<ListItem>
<TopicalElement
date="13.9.2025"
dateRange="28.3.2022 - 31.3.2023"
heading="Työkyvyttömyyseläke"
badge={
<Badge variant="danger" className="kds-mb-2">
Hylätty
</Badge>
}
desc="Nostrud exercitation ullamco laboris."
/>
</ListItem>
<ListItem>
<TopicalElement
date="13.9.2025"
dateRange="28.3.2022 - 31.3.2023"
heading="Työttömyyspäiväraha"
badge={
<Badge variant="success" className="kds-mb-2">
Myönnetty
</Badge>
}
/>
</ListItem>
</List>
</div>
);
}
render(<ArticleList />);
Aina taulukon tietojen muuttaminen listaksi ei ole tarpeen. Useita sarakkeita sisältävän taulukon näyttäminen listana voi hankaloittaa tietokokonaisuuden hahmottamista ja tietojen vertailua. Tarvittaessa taulukkoon voi sisällyttää kapealla näytöllä vaakasuuntaisen vierityspalkin, joka toisaalta saattaa heikentää taulukon käytettävyyttä.
<TableV2 hasScrollHint>
<TableV2Head>
<TableV2HeadRow>
<TableV2HeadCell scope="col">Hyvinvointialue</TableV2HeadCell>
<TableV2HeadCell scope="col" align="right">
Väestö, alle 65-vuotiaat
</TableV2HeadCell>
<TableV2HeadCell scope="col" align="right">
Yleisenasumistuen saajat
</TableV2HeadCell>
<TableV2HeadCell scope="col" align="right">
Saajien osuus, %
</TableV2HeadCell>
<TableV2HeadCell scope="col" align="right">
Tukea saavat ruokakunnat
</TableV2HeadCell>
<TableV2HeadCell scope="col" align="right">
Keskimääräinen asumistuki, e/kk
</TableV2HeadCell>
</TableV2HeadRow>
</TableV2Head>
<TableV2Body>
<TableV2Row>
<TableV2Cell>Helsinki</TableV2Cell>
<TableV2Cell align="right">566 683</TableV2Cell>
<TableV2Cell align="right">108 591</TableV2Cell>
<TableV2Cell align="right">19,2</TableV2Cell>
<TableV2Cell align="right">68 049</TableV2Cell>
<TableV2Cell align="right">461,19</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Pirkanmaa</TableV2Cell>
<TableV2Cell align="right">423 892</TableV2Cell>
<TableV2Cell align="right">63 242</TableV2Cell>
<TableV2Cell align="right">14,9</TableV2Cell>
<TableV2Cell align="right">43 630</TableV2Cell>
<TableV2Cell align="right">322,77</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Länsi-Uusimaa</TableV2Cell>
<TableV2Cell align="right">409 785</TableV2Cell>
<TableV2Cell align="right">52 257</TableV2Cell>
<TableV2Cell align="right">12,8</TableV2Cell>
<TableV2Cell align="right">28 070</TableV2Cell>
<TableV2Cell align="right">447,02</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Varsinais-Suomi</TableV2Cell>
<TableV2Cell align="right">375 275</TableV2Cell>
<TableV2Cell align="right">52 611</TableV2Cell>
<TableV2Cell align="right">14,0</TableV2Cell>
<TableV2Cell align="right">35 184</TableV2Cell>
<TableV2Cell align="right">325,32</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Pohjois-Pohjanmaa</TableV2Cell>
<TableV2Cell align="right">328 445</TableV2Cell>
<TableV2Cell align="right">43 798</TableV2Cell>
<TableV2Cell align="right">13,3</TableV2Cell>
<TableV2Cell align="right">28 148</TableV2Cell>
<TableV2Cell align="right">316,89</TableV2Cell>
</TableV2Row>
</TableV2Body>
</TableV2>
Tilankäyttö
Responsiivisuus tarkoittaa sisältöjen mukautumista eri näyttökokoihin. Taulukoiden ja listojen responsiivisuus vaikuttaa sekä asetteluun että käytettävyyteen.
Jos leveällä näytöllä näytettävä taulukko ei mahdu kapealle näytölle, näkymän kaventuessa tiedot voidaan näyttää esimerkiksi listassa.
Jos sisällöt on ensisijaisesti suunniteltu mobiilikäyttöön ja ne esitetään listana, varmista, että sisällöt toistuvat selkeinä myös leveillä näytöillä. Listan asettelua voi muuttaa leveille näytöille sopivaksi esimerkiksi tuomalla tietoja rinnakkain.
Alla oleva koodiesimerkki mukautuu käytettävissä olevan tilan mukaan. Leveässä näkymässä tiedot näytetään rinnakkain, jolloin ne toimivat taulukon sarakkeiden tapaan.
<>
<List unstyled className="hidden md:block">
<ListItem className="kds-border-b kds-border-t kds-borded-solid kds-border-default">
<Text color="muted" mb={2}>
26.5.2025
</Text>
<div className="kds-relative kds-w-full kds-flex kds-justify-between">
<div className="kds-flex grid gap-2">
<Heading as="h3" size={5} mt={0} mb={2} mr={2}>
AMORION 50 mg/ml
</Heading>
<Text mb={2} ml={2} mr={4}>
jauhe oraalisuspensiota varten
</Text>
</div>
<IconUiCaretRight className="kds-text-primary kds-mr-2" size="s" />
</div>
<Row sm={8} md={6} lg={6} xl={3} gy={4} className="kds--my-2">
<Column>
Määrätty määrä
<br />
<strong>1 x 60 ml</strong>
</Column>
<Column>
Lääkettä jäljellä
<br />
<strong>0</strong>
</Column>
<Column>
Reseptin viimeinen voimassaolopäivä
<br />
<strong>26.5.2027</strong>
</Column>
</Row>
</ListItem>
<ListItem className="kds-border-b kds-borded-solid kds-border-default">
<Text color="muted" mb={2}>
20.3.2025
</Text>
<div className="kds-relative kds-w-full kds-flex kds-justify-between">
<div className="kds-flex grid gap-2">
<Heading as="h3" size={5} mt={0} mb={2} mr={2}>
BURANA 800mg
</Heading>
<Text mb={2} ml={2} mr={4}>
tabletti
</Text>
</div>
<IconUiCaretRight className="kds-text-primary kds-mr-2" size="s" />
</div>
<Row sm={8} md={6} lg={6} xl={3} gy={4} className="kds--my-2">
<Column>
Määrätty määrä
<br />
<strong>2 x 98 fol</strong>
</Column>
<Column>
Lääkettä jäljellä
<br />
<strong>1 x 98 fol</strong>
</Column>
<Column>
Reseptin viimeinen voimassaolopäivä
<br />
<strong>26.5.2027</strong>
</Column>
</Row>
</ListItem>
</List>
<List unstyled className="block md:hidden" style={{ maxWidth: "24rem" }}>
<ListItem className="kds-border-b kds-border-t kds-borded-solid kds-border-default">
<Text color="muted" mb={2}>
26.5.2025
</Text>
<div className="kds-relative kds-w-full kds-flex kds-justify-between">
<div>
<Heading as="h3" size={5} mt={0} mb={2} mr={2}>
AMORION 50 mg/ml
</Heading>
<Text mb={2} ml={2} mr={4}>
jauhe oraalisuspensiota varten
</Text>
</div>
<Link href="/" className="kds-mr-4">
<IconUiCaretRight size="s" />
</Link>
</div>
<DescriptionList size="xs" columns={1} spacing="xs" emphasizeValue>
<DescriptionListItem label="Määrätty määrä">1 x 60 ml</DescriptionListItem>
<DescriptionListItem label="lääkettä jäljellä">0</DescriptionListItem>
<DescriptionListItem label="Reseptin viimeinen voimassaolopäivä">26.5.2027</DescriptionListItem>
</DescriptionList>
</ListItem>
<ListItem className="kds-border-b kds-borded-solid kds-border-default">
<Text color="muted" mb={2}>
26.5.2025
</Text>
<div className="kds-relative kds-w-full kds-flex kds-justify-between">
<div>
<Heading as="h3" size={5} mt={0} mb={2} mr={2}>
BURANA 800 mg
</Heading>
<Text mb={2} ml={2} mr={4}>
tabletti
</Text>
</div>
<Link href="/" className="kds-mr-4">
<IconUiCaretRight size="s" />
</Link>
</div>
<DescriptionList size="xs" columns={1} spacing="xs" emphasizeValue>
<DescriptionListItem label="Määrätty määrä">2 x 98 fol</DescriptionListItem>
<DescriptionListItem label="lääkettä jäljellä">1 x 98 fol</DescriptionListItem>
<DescriptionListItem label="Reseptin viimeinen voimassaolopäivä">20.3.2027</DescriptionListItem>
</DescriptionList>
</ListItem>
</List>
</>
Dataintensiivisyys tarkoittaa sitä, kuinka tiiviisti tai väljästi tiedot esitetään. Dataintensiivisyys voi vaikuttaa siihen, kuinka tehokkaasti käyttäjä saa oman tehtävänsä hoidettua.
Jos käyttäjän on tarve nähdä kerralla mahdollisimman paljon tietoryhmiä, kannattaa taulukoista ja listoista käyttää tiivistä esitystapaa. Tiivistäminen onnistuu usein välistyksiä pienentämällä tai asettelemalla tiedot rinnakkain. TableV2-komponentti tarjoaa myös tiiviin esitystavan.
Väljä lista:
<List unstyled style={{ maxWidth: "24rem" }}>
<ListItem style={{ borderBottom: ".125rem solid #e1e1e1", paddingBottom: "1rem" }}>
<Heading as="h5" className="kds-mt-0">
Äitiyspäiväraha
</Heading>
<DescriptionList columns={1}>
<DescriptionListItem label="Ratkaisupäivä">14.3.2025</DescriptionListItem>
<DescriptionListItem label="Ajanjakso">28.3.2022-31.3.2023</DescriptionListItem>
<DescriptionListItem label="Ratkaisu">Myönnetty</DescriptionListItem>
<DescriptionListItem label="Lisätieto">Nostrud exercitation</DescriptionListItem>
</DescriptionList>
<Link href="#" standalone target="_blank">
Avaa päätös
</Link>
</ListItem>
<ListItem style={{ borderBottom: ".125rem solid #e1e1e1", paddingBottom: "1rem" }}>
<Heading as="h5" className="kds-mt-2">
Sairauspäiväraha
</Heading>
<DescriptionList columns={1} spacing="xs" labelWidth="xs">
<DescriptionListItem label="Ratkaisupäivä">14.3.2025</DescriptionListItem>
<DescriptionListItem label="Ajanjakso">28.3.2022-31.3.2023</DescriptionListItem>
<DescriptionListItem label="Ratkaisu">Myönnetty</DescriptionListItem>
<DescriptionListItem label="Lisätieto">Nostrud exercitation</DescriptionListItem>
</DescriptionList>
<Link href="#" standalone target="_blank">
Avaa päätös
</Link>
</ListItem>
</List>
Tiivis lista:
<List unstyled style={{ maxWidth: "24rem" }} size="sm">
<ListItem style={{ borderBottom: ".125rem solid #e1e1e1", paddingBottom: "1rem" }}>
<Heading as="h5" className="kds-mt-0">
Äitiyspäiväraha
</Heading>
<DescriptionList columns={1} spacing="xs">
<DescriptionListItem label="Ratkaisupäivä">14.3.2025</DescriptionListItem>
<DescriptionListItem label="Ajanjakso">28.3.2022-31.3.2023</DescriptionListItem>
<DescriptionListItem label="Ratkaisu">Myönnetty</DescriptionListItem>
<DescriptionListItem label="Lisätieto">Nostrud exercitation</DescriptionListItem>
</DescriptionList>
<Link href="#" standalone target="_blank">
Avaa päätös
</Link>
</ListItem>
<ListItem style={{ borderBottom: ".125rem solid #e1e1e1", paddingBottom: "1rem" }}>
<Heading as="h5" className="kds-mt-2">
Sairauspäiväraha
</Heading>
<DescriptionList columns={1} spacing="xs">
<DescriptionListItem label="Ratkaisupäivä">14.3.2025</DescriptionListItem>
<DescriptionListItem label="Ajanjakso">28.3.2022-31.3.2023</DescriptionListItem>
<DescriptionListItem label="Ratkaisu">Myönnetty</DescriptionListItem>
<DescriptionListItem label="Lisätieto">Nostrud exercitation</DescriptionListItem>
</DescriptionList>
<Link href="#" standalone target="_blank">
Avaa päätös
</Link>
</ListItem>
</List>
Väljä taulukko:
<TableV2>
<TableV2Head>
<TableV2HeadRow>
<TableV2HeadCell scope="col">Hyvinvointialue</TableV2HeadCell>
<TableV2HeadCell scope="col" align="right">
Kuntoutujien määrä
</TableV2HeadCell>
</TableV2HeadRow>
</TableV2Head>
<TableV2Body>
<TableV2Row>
<TableV2Cell>Pirkanmaa</TableV2Cell>
<TableV2Cell align="right">4 879</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Pohjois-Pohjanmaa</TableV2Cell>
<TableV2Cell align="right">3 474</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Varsinais-Suomi</TableV2Cell>
<TableV2Cell align="right">3 060</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Helsinki</TableV2Cell>
<TableV2Cell align="right">2 534</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Pohjois-Savo</TableV2Cell>
<TableV2Cell align="right">2 315</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Keski-Suomi</TableV2Cell>
<TableV2Cell align="right">2 219</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Pohjois-Karjala</TableV2Cell>
<TableV2Cell align="right">2 020</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Länsi-Uusimaa</TableV2Cell>
<TableV2Cell align="right">1 562</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Etelä-Pohjanmaa</TableV2Cell>
<TableV2Cell align="right">1 360</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Vantaa ja Kerava</TableV2Cell>
<TableV2Cell align="right">1 303</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Satakunta</TableV2Cell>
<TableV2Cell align="right">1 262</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Kanta-Häme</TableV2Cell>
<TableV2Cell align="right">1 198</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Lappi</TableV2Cell>
<TableV2Cell align="right">1 086</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Etelä-Savo</TableV2Cell>
<TableV2Cell align="right">1 052</TableV2Cell>
</TableV2Row>
</TableV2Body>
</TableV2>
Tiivis taulukko:
<TableV2 isStriped size="xs">
<TableV2Head>
<TableV2HeadRow>
<TableV2HeadCell scope="col">Hyvinvointialue</TableV2HeadCell>
<TableV2HeadCell scope="col" align="right">
Kuntoutujien määrä
</TableV2HeadCell>
</TableV2HeadRow>
</TableV2Head>
<TableV2Body>
<TableV2Row>
<TableV2Cell>Pirkanmaa</TableV2Cell>
<TableV2Cell align="right">4 879</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Pohjois-Pohjanmaa</TableV2Cell>
<TableV2Cell align="right">3 474</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Varsinais-Suomi</TableV2Cell>
<TableV2Cell align="right">3 060</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Helsinki</TableV2Cell>
<TableV2Cell align="right">2 534</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Pohjois-Savo</TableV2Cell>
<TableV2Cell align="right">2 315</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Keski-Suomi</TableV2Cell>
<TableV2Cell align="right">2 219</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Pohjois-Karjala</TableV2Cell>
<TableV2Cell align="right">2 020</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Länsi-Uusimaa</TableV2Cell>
<TableV2Cell align="right">1 562</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Etelä-Pohjanmaa</TableV2Cell>
<TableV2Cell align="right">1 360</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Vantaa ja Kerava</TableV2Cell>
<TableV2Cell align="right">1 303</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Satakunta</TableV2Cell>
<TableV2Cell align="right">1 262</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Kanta-Häme</TableV2Cell>
<TableV2Cell align="right">1 198</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Lappi</TableV2Cell>
<TableV2Cell align="right">1 086</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>Etelä-Savo</TableV2Cell>
<TableV2Cell align="right">1 052</TableV2Cell>
</TableV2Row>
</TableV2Body>
</TableV2>
Saavutettavuus
Listat toimivat ruudunlukijakäyttäjillä eri tavalla kuin taulukot. Listat luetaan käyttäjälle rivi kerrallaan. Taulukot puolestaan luetaan siten, että ruudunlukija toistaa jokaisesta solusta sekä sarakeotsikon että solun arvon.
Alla olevissa esimerkeissä on esitetty samat tiedot sekä taulukkona että listana. Molemmat esitystavat vievät käyttöliittymällä saman verran tilaa ja näyttävän hyvin samankaltaisilta. Ruudunlukijakäyttäjälle tietojen selaaminen listana on kuitenkin nopeampaa, sillä taulukossa ruudunlukija toistaa sarakeotsikon joka solussa.
<TableV2>
<TableV2Caption>Lapsilisän maksupäivät vuonna 2025</TableV2Caption>
<TableV2Head>
<TableV2HeadRow>
<TableV2HeadCell>Kuukausi</TableV2HeadCell>
<TableV2HeadCell>Maksupäivä</TableV2HeadCell>
</TableV2HeadRow>
</TableV2Head>
<TableV2Body>
<TableV2Row>
<TableV2Cell>tammikuu</TableV2Cell>
<TableV2Cell>24.1</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>helmikuu</TableV2Cell>
<TableV2Cell>26.2</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>maaliskuu</TableV2Cell>
<TableV2Cell>26.3</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>huhtikuu</TableV2Cell>
<TableV2Cell>25.4</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>toukokuu</TableV2Cell>
<TableV2Cell>23.5</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>kesäkuu</TableV2Cell>
<TableV2Cell>26.6</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>heinäkuu</TableV2Cell>
<TableV2Cell>25.7</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>elokuu</TableV2Cell>
<TableV2Cell>26.8</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>syyskuu</TableV2Cell>
<TableV2Cell>26.9</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>lokakuu</TableV2Cell>
<TableV2Cell>24.10</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>marraskuu</TableV2Cell>
<TableV2Cell>26.11</TableV2Cell>
</TableV2Row>
<TableV2Row>
<TableV2Cell>joulukuu</TableV2Cell>
<TableV2Cell>23.12</TableV2Cell>
</TableV2Row>
</TableV2Body>
</TableV2>
const borderClass = "kds-border-b kds-border-solid kds-border-dark";
const ListComponent = () => (
<div>
<Heading as="h5">Lapsilisän maksupäivät vuonna 2024</Heading>
<DescriptionList>
<DescriptionListItem label="tammikuu" className={borderClass}>
26.1.
</DescriptionListItem>
<DescriptionListItem label="helmikuu" className={borderClass}>
23.2.
</DescriptionListItem>
<DescriptionListItem label="maaliskuu" className={borderClass}>
26.3.
</DescriptionListItem>
<DescriptionListItem label="huhtikuu" className={borderClass}>
26.4.
</DescriptionListItem>
<DescriptionListItem label="toukokuu" className={borderClass}>
24.5.
</DescriptionListItem>
<DescriptionListItem label="kesäkuu" className={borderClass}>
26.6.
</DescriptionListItem>
<DescriptionListItem label="heinäkuu" className={borderClass}>
26.7.
</DescriptionListItem>
<DescriptionListItem label="elokuu" className={borderClass}>
23.8.
</DescriptionListItem>
<DescriptionListItem label="syyskuu" className={borderClass}>
26.9.
</DescriptionListItem>
<DescriptionListItem label="lokakuu" className={borderClass}>
25.10.
</DescriptionListItem>
<DescriptionListItem label="marraskuu" className={borderClass}>
26.11.
</DescriptionListItem>
<DescriptionListItem label="joulukuu" className={borderClass}>
20.12.
</DescriptionListItem>
</DescriptionList>
</div>
);
render(<ListComponent />);