CwPPFDChart

Horizontal PPFD range gauge for crop lighting targets. It highlights the optimal band and shows whether the current reading is low, optimal, or high at a glance.

Interactive Crop Selection

Pick a crop and drag the simulated sensor reading to see the target range, live marker, and status update in real time.

Photosynthetic Photon Flux Density

Pepper PPFD

Updated 10/22/2026, 8:36:05 PM

Current PPFD
740 µmol/m²/s
Target range
600–1,000
DLI today
18.4 mol/m²/day

Optimal· Inside target band

CwPPFDChart example Copy code
<CwPPFDChart
	plant="Pepper"
	current={740}
	targetMin={600}
	targetMax={1000}
	dliToday={18.4}
/>

Fixed 0-1600 Scale

Use a fixed horticulture scale when you want direct comparison across crops or facilities.

Photosynthetic Photon Flux Density

Tomato PPFD

Updated 3/9/2024, 4:00:00 PM

Current PPFD
1,380 µmol/m²/s
Target range
700–1,200
DLI today
26.9 mol/m²/day

Too high· 180 µmol/m²/s above target

Loading & missing data

A missing reading shows “—” with no marker or status; missing targets hide the target band and status instead of treating the target as zero.

Photosynthetic Photon Flux Density

Tomato PPFD

Current PPFD
—
Target range
—

Photosynthetic Photon Flux Density

Tomato PPFD

Current PPFD
—
Target range
700–1,200

No data available

Photosynthetic Photon Flux Density

Unassigned crop PPFD

Current PPFD
640 µmol/m²/s
Target range
—
API

Usage and API reference

CwPPFDChart is a focused range gauge for lighting targets. Give it the current PPFD reading plus a target band, and then optionally lock the domain and tick marks for cross-crop comparisons.

How to think about it

  1. Start with current, targetMin, and targetMax Those three values are the minimum set needed to render the gauge and current status.
  2. Add DLI and timestamp when available These fields make the summary more useful, but the chart still works without them.
  3. Lock the domain for side-by-side comparisons When different crops or rooms need direct comparison, provide `domainMin`, `domainMax`, and explicit `ticks`.

Props and callbacks

APITypeDetails
current Required
numberCurrent PPFD reading.
targetMin Required
numberLower edge of the target band.
targetMax Required
numberUpper edge of the target band.
plant

Default: ''

stringOptional crop or cultivar label.
unit

Default: umol/m2/s

stringReading unit label.
domainMin

Default: 0

numberLower chart domain.
domainMax
numberUpper chart domain. Auto-expands when omitted.
ticks
Array<number | CwPPFDTick>Optional explicit tick labels.
dliToday
numberOptional daily light integral value.
updatedAt
string | Date | numberOptional timestamp displayed in the summary.
showSummary

Default: true

booleanShows the summary block above the gauge.
showDelta

Default: true

booleanShows the delta from the target band.
lowLabel / optimalLabel / highLabel
stringCustom text for the three status ranges.
noData
string | booleanWhen present, blurs the chart and shows an overlay. Pass localized text, or use the bare `noData` attribute for "No data available".
loading

Default: false

booleanShows a skeleton chart and sets `aria-busy` while data loads.
locale
stringBCP 47 locale for number and date formatting. Defaults to the runtime locale.

Copy-paste examples

Each snippet is a complete, working example you can paste into a Svelte 5 component.

Basic crop lighting target

This is the smallest useful configuration.

Basic crop lighting target Copy code
<CwPPFDChart
	plant="Pepper"
	current={740}
	targetMin={600}
	targetMax={1000}
	dliToday={18.4}
	updatedAt={Date.now()}
/>
Fixed production scale

Lock the domain when users compare multiple crops or rooms side by side.

Fixed production scale Copy code
<CwPPFDChart
	plant="Tomato"
	current={1380}
	targetMin={700}
	targetMax={1200}
	domainMin={0}
	domainMax={1600}
	ticks={[0, 200, 400, 600, 800, 1000, 1200, 1400, 1600]}
	dliToday={26.9}
/>
Compact chart with custom labels

Useful when the surrounding card already provides most of the context.

Compact chart with custom labels Copy code
<CwPPFDChart
	current={180}
	targetMin={250}
	targetMax={400}
	showSummary={false}
	showDelta={false}
	lowLabel="Too dim"
	optimalLabel="Target zone"
	highLabel="Too bright"
/>