Table

Om komponenten

Tabellen er en enkel og stilren tabellkomponent som kan brukes til Ä vise data pÄ en oversiktlig mÄte. Tabellen er som en standard responsiv og vil tilpasse seg skjermstÞrrelsen. Denne funksjonaliteten kan slÄes av.

Tabellen kan brukes i ren HTML med Ä legge pÄ .pkt-table, eller som en komponent i Vue eller React. Dersom tabellen skal brukes i ren html med kun css-klassene, mÄ man huske Ä legge pÄ en av skinsene for Ä fÄ riktig farge.

For nÄ vil tabellen kun endre stil og farge. Senere er tanken Ä legge til mer funksjonalitet som sortering og filtrering i Vue og React komponentene.

Se et mer komplekst eksempel helt nederst.

Varianter

Tabellen kommer i flere varianter som kan brukes for seg selv eller sammen. Disse er:

  • .pkt-table--compact
  • .pkt-table--responsive

Som standard er tabellen satt til Ă„ ha en god del spacing og vĂŠre responsiv. Ønsker man ha mindre padding mellom cellene, kan man bruke .pkt-table--compact klassen eller sette prop’en compact i Vue eller React. Dette kan endres ved Ă„ sette prop-en responsiveView til false for React og Vue.

Kompakt tabell

For Ä fÄ en mer kompakt tabell, kan man bruke klassen .pkt-table--compact eller sette prop-en compact til true for React og Vue. Som en standard, er denne satt til false.

// Ren html med kun stylingklasser
<table class="pkt-table pkt-table--compact">
  ...
</table>
// Vue og React

<PktTable compact> ... </PktTable>

Responsive tabeller

For Ä tilpasse tabeller pÄ smÄ skjermer kan man bruke klassen .pkt-table--responsive. Da vil hver celle stables under hverandre i tillegg til Ä vise kolonnetitler. NÄr skjermstÞrrelsen blir mindre enn 768px (breakpoint: tablet), vil tabellen bli endres til en listevisning av tabellen.

For React og Vue, kan man endre pÄ prop-en responsiveView for Ä velge om man Þnsker en slik responsivitet eller ikke. Som en standard, er denne satt til true.

I mobilvisning, vil flere elementer fungere som normalt ved bruk av wrapperen .pkt-table__celle-wrapper i de fleste nettlesere.

// Ren html med kun stylingklasser
<table class="pkt-table pkt-table--responsive">
  ...
</table>
// Vue og React

<PktTable responsiveView> ... </PktTable>

Farger

Tabellen har to ulike skins: “basic” og “zebra-blue”. Disse kan brukes for Ă„ gi tabellen en spesifikk farge. Disse kan settes ved hjelp av klassen direkte i html eller via props i Vue og React.

  • .pkt-table--basic
  • .pkt-table--zebra-blue
// Ren html med kun stylingklasser
<table class="pkt-table pkt-table--zebra-blue">
  ...
</table>
// Vue og React

<PktTable skin="zebra-blue"> ... </PktTable>

Flere elementer i Ă©n celle

For Ă„ legge til flere elementer i Ă©n celle, kan man gruppere elementene i en <span> med klassen .pkt-table--cell-wrapper. Dette vil gi en finere visning av innholdet i cellen. Se eksempel under.

<table class="pkt-table pkt-table--basic pkt-table--responsive">
<thead>
    <tr>
      <th> Kolonnetittel</th>
      <th> Kolonnetittel</th>
      <th> Kolonnetittel</th>
      <th> Kolonnetittel</th>
    </tr>
  </thead>
  <tbody>
    <tr >
      <td data-label="Kolonnetittel"> Celle data</td>
      <td data-label="Kolonnetittel"> Celle data</td>
      <td data-label="Kolonnetittel"> Celle data</td>
      <td data-label="Kolonnetittel"> Celle data</td>
  </tr>
    <tr >
      <td data-label="Kolonnetittel">
        <span class="pkt-table__cell-wrapper">
          <span>tag</span>
          <span>tag</span>
        </span>
      </td>
      <td data-label="Kolonnetittel"> Celle data</td>
      <td data-label="Kolonnetittel"> Celle data</td>
      <td data-label="Kolonnetittel"> Celle data</td>
    </tr>
  </tbody>
</table>
<PktTable>
  <PktTableHeader>
      <PktTableRow>
        <PktTableHeaderCell> KolonneTittel</PktTableHeaderCell>
        <PktTableHeaderCell> KolonneTittel</PktTableHeaderCell>
      </PktTableRow>
    </PktTableHeader>
    <PktTableBody>
      <PktTableRow>
        <PktTableDataCell :dataLabel="KolonneTittel"> Celle </PktTableDataCell>
      </PktTableRow>
    </PktTableBody>
</PktTable>
  <PktTable skin="basic" responsiveView>
    <PktTableHeader>
      <PktTableRow>
        {tableData.map((data) => (
          <PktTableHeaderCell>{data.label}</PktTableHeaderCell>
        ))}
      </PktTableRow>
    </PktTableHeader>
    <PktTableBody>
      {[...Array(3)].map((_, index) => (
        <PktTableRow key={index}>
          {tableData.map((data) => (
            <PktTableDataCell dataLabel={data.label}>
              {data.value}
            </PktTableDataCell>
          ))}
        </PktTableRow>
      ))}
    </PktTableBody>
  </PktTable>

Eksempel med mer fyldig data

Under er et kodeeksempel pÄ en tabell med mer komplekst innhold. Den er responsiv, inneholder flere <Tag>-komponenter, og har et skin kalt basic.

  <table class="pkt-table pkt-table--basic pkt-table--responsive">
    <thead class="pkt-table__header">
      <tr class="pkt-table__row" role="row">
        <th class="pkt-table__header-cell"> Dato og tid</th>
        <th class="pkt-table__header-cell"> Status</th>
        <th class="pkt-table__header-cell"> Memo</th>
        <th class="pkt-table__header-cell"> Vurdering</th>
        <th class="pkt-table__header-cell"> Vurdert av</th>
      </tr>
    </thead>
    <tbody class="pkt-table__body">
      <tr class="pkt-table__row" role="row">
        <td class="pkt-table__data-cell" data-label="Dato og tid"> 19.01.2023 08:08</td>
        <td class="pkt-table__data-cell" data-label="Status">
          <span class="pkt-table__cell-wrapper">
            <span class="pkt-tag pkt-tag--thin-text pkt-tag--yellow">Normal</span>
          </span>
        </td>
        <td class="pkt-table__data-cell" data-label="Vurdering">
          <span class="pkt-table__cell-wrapper">
            <span class="pkt-tag pkt-tag--thin-text pkt-tag--green">Normal</span>
          </span>
        </td>
        <td class="pkt-table__data-cell" data-label="Vurdert av"> Ted Mosby</td>
      </tr>
    </tbody>
  </table>
<PktTable responsiveView :skin="skinType" compact>
  <PktTableHeader>
    <PktTableRow>
      <PktTableHeaderCell v-for="data in basicTableData" :key="data.label">{{ data.label }}</PktTableHeaderCell>
    </PktTableRow>
  </PktTableHeader>
  <PktTableBody>
    <PktTableRow v-for="n in 3" :key="n">
      <PktTableDataCell
        v-for="(data, index) in basicTableData"
        :key="`${data.value}-${index}`"
        :dataLabel="data.label"
        >{{ data.value }}</PktTableDataCell
      >
    </PktTableRow>
  </PktTableBody>
</PktTable>
<PktTable skin="basic" responsiveView>
  <PktTableHeader>
    <PktTableRow>
      {tableData.map((data) => (
        <PktTableHeaderCell>{data.label}</PktTableHeaderCell>
      ))}
    </PktTableRow>
  </PktTableHeader>
  <PktTableBody>
    {[...Array(3)].map((_, index) => (
      <PktTableRow key={index}>
        {tableData.map((data) => (
          <PktTableDataCell dataLabel={data.label}>
            {data.value}
          </PktTableDataCell>
        ))}
      </PktTableRow>
    ))}
  </PktTableBody>
</PktTable>

CSS oversikt

I Punkt brukes BEM-styling. Under er Table sin CSS-struktur.

Block:

  • .pkt-table

Elements:

  • .pkt-table__header
  • .pkt-table__body
  • .pkt-table__row
  • .pkt-table__header-cell
  • .pkt-table__data-cell

Modifiers:

  • .pkt-table--basic
  • .pkt-table--zebra-blue
  • .pkt-table--compact
  • .pkt-table--responsive

Props og slots

<Table/>

PropsTypeValidationDefaultDescription
classNamestringStyling klasse
childrenReactNode eller VNode
compactbooleanfalseMindre padding
skinbasic, zebra-bluebasicHvert skin har en egen stil
responsiveViewbooleantrueTilpasser seg mindre skjermer nÄr skjermeen er mindre enn 786px

<TableBody/>, <TableHeader/>, <TableHeaderCell/> og <TableRow/>

PropsTypeValidationDefaultDescription
classNamestring-Styling klasse
childrenReactNode eller VNode-

<TableDataCell>

PropsTypeValidationDefaultDescription
classNamestring-Styling klasse
childrenReactNode eller VNode-
dataLabelstring-Brukes i responsiv visning. MĂ„ settes til kolonnetittelen til tilhĂžrende celleinnhold