components / 23

marked table

data needs rhythm before decoration. cheez keeps the native table readable, then adds ink only where structure or state needs it.

shadcnnpx shadcn@latest add berkantay/cheez/marked-table
live

data playground

ruled · default
60 responsive marks · live registry data
familycharacterstatusactions
underlineunderlineemphasiscalmsuccess: ready4,812
circlecircleencirclerushedsuccess: ready3,924
marker swipemarker-swipehighlightcalminfo: beta2,811
scribble outscribble-outcross-outchaoticsuccess: ready2,470
curved arrowcurved-arrowarrowrushedsuccess: ready1,943
starstarsymbolcalmwarning: draft806
selected1/ 60
variant
density
ink
character
<MarkedTable
  variant="ruled"
  density="default"
  tone="orange"
  character="rushed"
>
  <MarkedTableHeader>...</MarkedTableHeader>
  <MarkedTableBody>
    <MarkedTableRow selected={selected}>
      <MarkedTableCell>...</MarkedTableCell>
    </MarkedTableRow>
  </MarkedTableBody>
</MarkedTable>
rows

state without noise

one mark, one meaning
statemeaningbehavior
defaultordinary datano decoration
interactivecontains a controlfocus tint
selectedchosen by a real checkboxink edge + tint
mutedhistorical or unavailablereduced pressure
rhythm

density changes pace, not hierarchy

same native structure
compact
underline4,812
circle3,924
highlight2,811
default
underline4,812
circle3,924
highlight2,811
relaxed
underline4,812
circle3,924
highlight2,811
responsive

columns scroll, semantics stay

no card conversion
horizontal overflow preserves column relationships
componentprimitivekeyboardmotiondependencysize
marked tablenative tablebrowserWAAPIcheez core4.2 kb
marked selectBase UIroving focusWAAPI@base-ui/react7.1 kb
zero

empty is still a table state

one cell, correct span
markfamilystatus
no marks match “perfect”clear the filter and keep drawing.
reference

api

native slots and visual props
proptypedefaultpurpose
variant"ruled" | "framed" | "quiet""ruled"boundary system
density"compact" | "default" | "relaxed""default"cell rhythm
toneMarkedTableTone"neutral"built-in ink palette
colorstringtone colortable ink override
stripedbooleanfalsesubtle alternating rows
stickyHeaderbooleanfalsesticky native header cells
frameMarkCheezType"rounded-box"framed boundary mark
characterCheezCharacter"rushed"drawing personality
thicknessnumber1non-scaling pen weight
Row.selectedbooleanfalsevisual selected state
Row.mutedbooleanfalsede-emphasized row
Row.interactivebooleanfalsehover and focus treatment
Row.toneMarkedTableTonetable tonerow-specific state ink
Head.sortSortDirection"none"native aria-sort state
Cell.align"start" | "center" | "end""start"content alignment
Cell.numericbooleanfalsetabular right-aligned figures
Cell.markedbooleanfalseCheez emphasis around cell content
Cell.markCheezType"underline"cell emphasis mark
Cell.truncatebooleanfalsesingle-line overflow

behavior notes

  • every slot renders its matching native table element and forwards its ref
  • the scroll container never changes rows into cards because column relationships matter
  • sort state belongs on the header through aria-sort; the button only triggers the change
  • selected is visual only—the checkbox, radio, or grid owns selection semantics
  • numeric cells use tabular figures and right alignment by default
  • marked cells opt into a real Cheez underline without changing the table structure
  • the Cheez frame uses non-scaling ink so wide tables do not create thick borders