CandlestickChart

A headless wrapper for a financial chart showing open, high, low and close values for each period as candles. It gives the drawing the catalog's standard accessible shell: a named image plus an optional data-table alternative.

Status: beta — implemented and unit-tested in all eight headless libraries; not yet exercised in composed flows.

The component renders a <figure> holding a <div class="candlestick-chart-graphic" role="img" aria-label> around an inline <svg> that the consumer draws, and an optional sibling <div class="candlestick-chart-data-table"> for the accessible table. The component draws nothing and ships no scales, colours or animation.

Implementation Notes

  • Renders <figure class="candlestick-chart {class}"> containing the image wrapper and, when supplied, the data-table wrapper
  • The consumer supplies the <svg> (and any legend markup that belongs inside the image)
  • restProps spread onto the <figure>
  • No internal state, no drawing, no data handling

Props

Prop Type Default Description
class string "" Appended to the base class
label string (optional) — Accessible name of the image wrapper
children slot (required) — The consumer-drawn inline <svg>
dataTable slot (optional) — The accessible table alternative, rendered outside role="img"
...restProps HTML attributes — Spread onto the root <figure>

Usage

<CandlestickChart label="Describe the chart">
  <svg viewBox="0 0 100 100">…</svg>
  {#snippet dataTable()}
    <table><caption>Values</caption>…</table>
  {/snippet}
</CandlestickChart>

Keyboard Interactions

  • None on the graphic. The chart is a single image to assistive technology.
  • The data table follows native table behaviour.

ARIA

  • role="img" on the graphic wrapper exposes the chart as one image (its children are presentational)
  • aria-label provides the accessible name
  • The data table is outside role="img" so assistive technology can read it

When to Use

  • Open, high, low and close values per period, typically prices
  • Showing volatility and direction together
  • When a real data table accompanies the drawing as the accessible alternative

When Not to Use

  • Use LineChart — one value per period, such as a closing price
  • Use ColumnChart — one value per category
  • Use ScatterChart — relationships between two measures

Headless

This component decides semantics only: the figure element, the image role, the name and the table placement. It decides no geometry, scale, colour, legend or motion.

Styles

Target .candlestick-chart for the figure, .candlestick-chart-graphic for the image wrapper and .candlestick-chart-data-table for the table wrapper. Style the supplied <svg> from consumer CSS. No default styles are included.

Testing

  • Renders a <figure> with class candlestick-chart and a .candlestick-chart-graphic child with role="img"
  • label sets aria-label
  • The consumer svg renders inside the image wrapper
  • The data table renders in a .candlestick-chart-data-table sibling, outside role="img", only when supplied
  • Rest props reach the figure

Advice

Pass the candles as <svg> shapes. Do not use red and green alone to show up and down; add shape or a text cue and give open, high, low and close for each period in the data table.

Because role="img" makes descendants presentational, never put interactive controls inside the graphic; place legends and toggles next to it.

Data table alternative (added 2026-10-05)

The graphic is wrapped in <div class="candlestick-chart-graphic" role="img" aria-label>; role="img" is not on the <figure>. The optional dataTable (a snippet in Svelte, a prop in React, a named slot in Vue, a projected [dataTable] element in Angular, a DataTable render fragment in Blazor, params.dataTable in Nunjucks, a slot="data-table" child in Web Components) renders the accessible table in <div class="candlestick-chart-data-table">, a sibling of the graphic and never inside it: role="img" makes its descendants presentational, so a table inside would be invisible to assistive technology. Without a data table the wrapper is not rendered (except Angular, which always renders an empty wrapper because it cannot detect projected content).

Related components

  • line-chart
  • column-chart
  • scatter-chart
  • area-chart
  • graphic-block

References


Lily™ and Lily Design System™ are trademarks.

Example

Open, high, low, close
Day 1Up: 30, 70, 20, 55
Day 2Down: 48, 66, 14, 30
Show demo markup
<figure class="candlestick-chart"><div class="candlestick-chart-graphic" role="img" aria-label="Candlestick chart: four trading days"><svg viewBox="0 0 120 80" width="240" height="160" aria-hidden="true" focusable="false"><line x1="20" y1="12" x2="20" y2="62" stroke="currentColor"/><rect x="14" y="25" width="12" height="25" fill="currentColor"/><line x1="48" y1="20" x2="48" y2="68" stroke="currentColor"/><rect x="42" y="32" width="12" height="22" fill="none" stroke="currentColor"/><line x1="76" y1="8" x2="76" y2="55" stroke="currentColor"/><rect x="70" y="15" width="12" height="28" fill="currentColor"/><line x1="104" y1="18" x2="104" y2="65" stroke="currentColor"/><rect x="98" y="28" width="12" height="20" fill="none" stroke="currentColor"/></svg></div><div class="candlestick-chart-data-table"><table><caption>Open, high, low, close</caption><tbody><tr><th scope="row">Day 1</th><td>Up: 30, 70, 20, 55</td></tr><tr><th scope="row">Day 2</th><td>Down: 48, 66, 14, 30</td></tr></tbody></table></div></figure>

Graphic only (no data table)

Show markup
<figure class="candlestick-chart"><div class="candlestick-chart-graphic" role="img" aria-label="Candlestick chart: four trading days"><svg viewBox="0 0 120 80" width="240" height="160" aria-hidden="true" focusable="false"><line x1="20" y1="12" x2="20" y2="62" stroke="currentColor"/><rect x="14" y="25" width="12" height="25" fill="currentColor"/><line x1="48" y1="20" x2="48" y2="68" stroke="currentColor"/><rect x="42" y="32" width="12" height="22" fill="none" stroke="currentColor"/><line x1="76" y1="8" x2="76" y2="55" stroke="currentColor"/><rect x="70" y="15" width="12" height="28" fill="currentColor"/><line x1="104" y1="18" x2="104" y2="65" stroke="currentColor"/><rect x="98" y="28" width="12" height="20" fill="none" stroke="currentColor"/></svg></div></figure>
Usage example
<CandlestickChart label="Describe the chart">
  <svg viewBox="0 0 100 100">…</svg>
  {#snippet dataTable()}
    <table><caption>Values</caption>…</table>
  {/snippet}
</CandlestickChart>
Show Svelte source
// In your Svelte component:
import CandlestickChart from "lily-design-system-svelte-headless/components/CandlestickChart/CandlestickChart.svelte";

<CandlestickChart>
  <!-- content -->
</CandlestickChart>

Canonical contract

Generated from this component's canonical metadata — the machine-checked source the implementations are held to.

Metadata

  • Component: candlestick-chart
  • PascalCase: CandlestickChart
  • Description: a financial chart showing open, high, low and close values for each period as candles
  • Status: beta — implemented and unit-tested in all eight headless libraries; not yet exercised in composed flows
  • HTML tag: <figure>
  • CSS class: .candlestick-chart
  • Interactive: no

ARIA

  • role="img" on the graphic wrapper exposes the chart as a single image
  • aria-label provides the accessible name

Keyboard

  • No keyboard interactions on the chart
  • A data table (when rendered) follows native table keyboard behaviour

Props

  • class: string (default: "") -- appended to the base class
  • label: string (optional) -- accessible name
  • children: slot (required) -- the inline <svg>
  • dataTable: slot (optional) -- the accessible table alternative
  • ...restProps: HTML attributes -- spread onto the root <figure>