Skip to content

CProgressCircular ​

Circular progress indicator. Shows determinate progress from 0 to 100 or an endless spinner in indeterminate mode. The default slot renders content in the center of the circle.

Basic usage ​

value sets the progress percentage and is clamped to the 0–100 range. The default slot receives the normalized value.

65%
Show code
vue
<script setup lang="ts">
import { ref } from 'vue'

const value = ref(65)
</script>

<template>
  <c-progress-circular :value="value" size="96" width="8">
    <template #default="{ value: shown }">{{ shown }}%</template>
  </c-progress-circular>

  <c-btn @click="value = Math.max(0, value - 10)">-10</c-btn>
  <c-btn @click="value = Math.min(100, value + 10)">+10</c-btn>
</template>

Colors ​

color accepts a palette token (teal, green-darken-1) or a raw color (#fa5a5a, rgb(...), var(...)) — there is no predefined set. The ring is drawn with currentColor, so the color lands on the root as a text-*/text-[...] class; the underlay stays on the theme tokens and can be recolored through a preset (the underlay zone).

Show code
html
<c-progress-circular value="70" size="48" width="5" color="indigo" />
<c-progress-circular value="70" size="48" width="5" color="teal" />
<c-progress-circular value="70" size="48" width="5" color="deep-purple-lighten-1" />
<c-progress-circular value="70" size="48" width="5" color="green-darken-1" />
<c-progress-circular value="70" size="48" width="5" color="#FFA726" />
<c-progress-circular value="70" size="48" width="5" color="#fa5a5a" />

A raw color must be a literal

Arbitrary classes (text-[#fa5a5a]) are generated by utils-jit via a static source scan: color="#fa5a5a" works, :color="someVar" with a raw value does not. Palette tokens are unaffected. See Custom attrs for details.

Indeterminate ​

Endless spinner for operations with unknown duration. size and width control the diameter and the stroke thickness.

Show code
html
<c-progress-circular indeterminate size="24" width="3" />
<c-progress-circular indeterminate color="green-darken-1" size="40" width="4" />
<c-progress-circular indeterminate color="#fa5a5a" size="64" width="6" />

Presets ​

CProgressCircular supports the preset system. Zones map 1:1 to the DOM and cover every colorable element: root (container), underlay (track ring), overlay (progress ring), and info (center content). The rings are SVG circles with stroke: currentColor, so text-* utilities recolor them. States: indeterminate and complete (value ≥ 100); indeterminate takes precedence.

In the demo below the ring and the counter are indigo/grey while uploading and turn green once value reaches 100 — no conditional classes in the template, the preset resolves the state on its own:

80%
Show code
ts
// main.ts — register the preset once
createVuelandUI({
  presets: {
    progress: {
      upload: {
        base: {
          underlay: ['text-grey'],
          overlay: ['text-indigo'],
          info: ['text-grey'],
        },
        complete: {
          overlay: ['text-green'],
          info: ['text-green'],
        },
      },
    },
  },
})
vue
<template>
  <c-progress-circular preset="progress.upload" :value="value" size="96" width="8">
    <template #default="{ value: shown }">{{ shown }}%</template>
  </c-progress-circular>
</template>

Accessibility ​

The root element gets role="progressbar" with aria-valuemin="0", aria-valuemax="100", and aria-valuenow set to the current value. In indeterminate mode aria-valuenow is omitted, which matches the WAI-ARIA progressbar pattern.


API ​

Props ​

Prop
Type
Default
Description
value
number | string
0
Progress percentage, clamped to 0–100
size
number | string
32
Diameter (px)
width
number | string
4
Stroke width (px)
rotate
number | string
0
Rotation of the starting point (deg)
indeterminate
boolean
false
Endless spinner mode
color
string
—
Palette token (teal) or raw color (#fa5a5a, rgb(...), var(...)); defaults to the theme primary
preset
string
—
Preset name (dot path) from the registry

Slots ​

Slot
Props
Description
default
{ value: number }
Content in the center; receives clamped value

CSS variables ​

Variable
Default
--c-progress-circular-color
var(--c-sys-color-primary)
--c-progress-circular-underlay-color
var(--c-sys-color-primary-container)