Summary
High-performance SVG circular progress indicator. Supports full-circle and semi-circle variants, rounded stroke caps, centered or side-aligned content, and advanced gradient strokes for both fill and track.Basic usage
Standard circle
Semicircle with gradient
Card layout with side content
Configuration API
All methods acceptClosure unless noted.
Real-world examples
Dashboard Completion Rate
Storage Usage with Fraction
Playground
/admin/flex-fields/progress-circle
See Playground for setup.
Related components
CSS classes (reference)
Static rendering and responsive content
Ordinary circle and semicircle displays are server-rendered SVG and CSS, with no Alpine factory, event listeners, ResizeObserver or component JavaScript. Each instance owns its stylesheet consumer and unique SVG gradient references. CSS animates changed values when enabled; reduced-motion preferences disable the transition. A zero value displays only the track, without a colored rounded-cap dot. Ordinary progress card shells have a 24px radius; distribution cards use 16px. Side layouts reserve space for their text, wrap within the available width and mirror with surrounding RTL direction. Long center labels (over 22 characters) appear below the ring so they do not collide with its stroke. Semicircle andxs center labels also appear below. The above layout retains the
value inside the ring. Paused displays use a clear icon without blurred digits
behind it; assistive technology receives the paused state and current value.
The accessible progressbar uses the configured numeric maximum and a clamped
current value; custom displayValue supplies the spoken value text. Set an explicit
aria-label through extraAttributes if a dashboard requires a different accessible
name. Null means zero. Non-finite values, non-positive max, invalid enum choices
and injected CSS declarations are rejected.
Distribution half gauge
variant('breakdown') draws multiple rounded segments across a 180-degree half
ring. It is server-rendered SVG with a small optional preview controller and no chart library.
Amounts determine the segment proportions; the center shows the first largest
segment by default. Hovering an arc or legend entry previews its percentage and
label immediately, with no server request. Leaving restores the default (or a
pinned selection). Keyboard focus previews the same information. Click or tap
pins a segment; Escape clears that selection. Only interactive breakdown instances
load the preview module; ordinary rings and interactive(false) remain CSS/SVG-only. activeSegment() selects a different center channel by its zero-based
index. displayValue() and label() can override the center text.
Segment
color is optional and falls back to a repeating six-color palette.
displayValue is optional and defaults to the numeric amount with grouping.
An all-zero or empty dataset draws only the track and reports 0%. Zero amounts
remain in the legend but do not produce colored arcs. Tiny positive segments keep
finite geometry with appropriately reduced corner radii.
This distribution chart uses labeled segments and legend buttons when interactive;
interactive(false) exposes a static image and text legend. It does not imply
completion progress. Its period chip and badge are display-only.
Use showLegend(false) for a compact chart. Gauge widths are xs 144px, sm
200px, md 240px and lg 288px (bounded by the available width), and omit shell() to embed it into your own card. Channel proportions are
calculated from their sum; value()/max() apply to the ordinary progress variants.
Small indicators in a table
size('xs') draws a 40px ring. Use showValue(false) for the ring alone, without
removing its accessible numeric value. The ordinary ring sizes apply to circle
and semicircle variants; breakdown gauges use the wider scales listed above.
ViewColumn, so its SVG and per-cell asset
consumer stay shared. The existing FLEX ProgressColumn is a linear indicator.
resources/views/tables/columns/completion-circle.blade.php:
completion. For counts, configure
max() from the record and optionally displayValue() with your own short text.
No copied SVG, inline stylesheet, or extra JavaScript is needed. Keep headings,
card shells and long labels outside a compact table cell.