aidos-ui 4.0.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +14 -1
- package/CLAUDE.md +72 -0
- package/dist/BaseButton.js.map +1 -1
- package/dist/BaseLink.js.map +1 -1
- package/dist/BaseListItem.d.ts +1 -1
- package/dist/Calendar.d.ts +2 -2
- package/dist/DarkMode.js.map +1 -1
- package/dist/DatePicker.js.map +1 -1
- package/dist/Dialog.d.ts +3 -3
- package/dist/Dialog.js.map +1 -1
- package/dist/Dropdown.js.map +1 -1
- package/dist/Icon.d.ts +3 -3
- package/dist/Icon.js +2 -21
- package/dist/Icon.js.map +1 -1
- package/dist/Interactable.js.map +1 -1
- package/dist/NextJSRouterState.js.map +1 -1
- package/dist/OnVisible.d.ts +1 -1
- package/dist/OnVisible.js.map +1 -1
- package/dist/Popover.d.ts +3 -3
- package/dist/Popover.js.map +1 -1
- package/dist/Providers.d.ts +2 -2
- package/dist/RangeInput.d.ts +1 -1
- package/dist/RootView.js.map +1 -1
- package/dist/Select.d.ts +0 -1
- package/dist/Storage.d.ts +2 -1
- package/dist/Storage.js.map +1 -1
- package/dist/Stream.js.map +1 -1
- package/dist/Text.js.map +1 -1
- package/dist/TextInput.d.ts +3 -2
- package/dist/TextInput.js +13 -4
- package/dist/TextInput.js.map +1 -1
- package/dist/TextPairing.js.map +1 -1
- package/dist/Tooltip.d.ts +2 -2
- package/dist/Tooltip.js.map +1 -1
- package/dist/aria.js.map +1 -1
- package/dist/hash.js.map +1 -1
- package/dist/jss.d.ts +6 -6
- package/dist/jss.js +2 -2
- package/dist/jss.js.map +1 -1
- package/dist/numberToBase.js.map +1 -1
- package/dist/stateMachineContextFactory.js.map +1 -1
- package/dist/useCookie.js.map +1 -1
- package/dist/useKeyboard.js.map +1 -1
- package/dist/useNavigation.js.map +1 -1
- package/dist/useRefEffect.js.map +1 -1
- package/next-env.d.ts +2 -1
- package/next.config.js +2 -1
- package/package.json +27 -20
- package/src/BaseListItem.tsx +1 -1
- package/src/Calendar.tsx +2 -2
- package/src/Dialog.tsx +3 -3
- package/src/Icon.tsx +4 -30
- package/src/Popover.tsx +3 -3
- package/src/Providers.tsx +1 -1
- package/src/RangeInput.tsx +1 -1
- package/src/Storage.tsx +1 -1
- package/src/TextInput.tsx +17 -5
- package/src/Tooltip.tsx +2 -2
- package/src/docs/mdx.tsx +40 -0
- package/src/docs/searchIndex.ts +1 -1
- package/src/jss.tsx +3 -3
- package/src/pages/Badge.mdx +136 -14
- package/src/pages/Button.mdx +121 -63
- package/src/pages/Calendar.mdx +196 -2
- package/src/pages/Card.mdx +123 -47
- package/src/pages/Checkbox.mdx +103 -28
- package/src/pages/Dialog.mdx +172 -7
- package/src/pages/FlexLayout.mdx +185 -51
- package/src/pages/Hashing.mdx +199 -8
- package/src/pages/Icon.mdx +150 -42
- package/src/pages/IconButton.mdx +127 -116
- package/src/pages/Link.mdx +118 -47
- package/src/pages/List.mdx +167 -283
- package/src/pages/ListHeader.mdx +157 -27
- package/src/pages/Popover.mdx +177 -55
- package/src/pages/ProgressBar.mdx +186 -6
- package/src/pages/ProgressCircle.mdx +196 -13
- package/src/pages/RangeInput.mdx +189 -61
- package/src/pages/Tabs.mdx +202 -346
- package/src/pages/Text.mdx +102 -81
- package/src/pages/TextInput.mdx +169 -44
- package/src/pages/TextPairing.mdx +164 -115
- package/src/pages/TimeInput.mdx +142 -37
- package/src/pages/Tooltip.mdx +99 -12
- package/src/pages/_app.tsx +13 -3
- package/src/pages/css-in-js.mdx +196 -83
- package/src/pages/navigation.mdx +122 -20
- package/src/pages/useCookie.mdx +168 -7
- package/src/pages/useKeyboard.mdx +242 -5
- package/src/pages/useNavigation.mdx +244 -16
- package/src/pages/usePromise.mdx +271 -6
- package/src/pages/useRefEffect.mdx +230 -28
- package/tsconfig.json +13 -4
|
@@ -1,20 +1,200 @@
|
|
|
1
1
|
import { ProgressBar } from "../ProgressBar";
|
|
2
2
|
import { Column } from "../Column";
|
|
3
|
+
import { Row } from "../Row";
|
|
4
|
+
import { Span } from "../Text";
|
|
5
|
+
import { cssVar } from "../jss";
|
|
3
6
|
|
|
4
7
|
# ProgressBar
|
|
5
8
|
|
|
6
|
-
|
|
9
|
+
A linear progress indicator for displaying completion percentage. Supports multiple colors and sizes.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Props
|
|
14
|
+
|
|
15
|
+
| Prop | Type | Default | Description |
|
|
16
|
+
|------|------|---------|-------------|
|
|
17
|
+
| `progress` | `number` | Required | Progress value from 0 to 1 (values > 1 are capped at 1) |
|
|
18
|
+
| `color` | `Color` | Required | Bar fill color: `"highlight"`, `"negative"`, `"warning"`, etc. |
|
|
19
|
+
| `size` | `Size` | Required | Bar height: `"xsmall"` (4px), `"small"` (8px), `"medium"` (12px), `"large"` (16px), `"xlarge"` (20px) |
|
|
20
|
+
| `jss` | `JSS` | - | Custom styles for the container |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Basic usage
|
|
7
25
|
|
|
8
26
|
<Column gap="medium">
|
|
9
|
-
<ProgressBar color="highlight" progress={0.66} size="
|
|
10
|
-
|
|
11
|
-
|
|
27
|
+
<ProgressBar color="highlight" progress={0.66} size="medium" />
|
|
28
|
+
</Column>
|
|
29
|
+
|
|
30
|
+
```js
|
|
31
|
+
<ProgressBar color="highlight" progress={0.66} size="medium" />
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Sizes
|
|
37
|
+
|
|
38
|
+
<Column gap="medium">
|
|
39
|
+
<Row gap="medium" align="center">
|
|
40
|
+
<Span size="small" color="secondary" jss={{ width: 60 }}>xsmall</Span>
|
|
41
|
+
<ProgressBar color="highlight" progress={0.5} size="xsmall" jss={{ flexGrow: 1 }} />
|
|
42
|
+
</Row>
|
|
43
|
+
<Row gap="medium" align="center">
|
|
44
|
+
<Span size="small" color="secondary" jss={{ width: 60 }}>small</Span>
|
|
45
|
+
<ProgressBar color="highlight" progress={0.5} size="small" jss={{ flexGrow: 1 }} />
|
|
46
|
+
</Row>
|
|
47
|
+
<Row gap="medium" align="center">
|
|
48
|
+
<Span size="small" color="secondary" jss={{ width: 60 }}>medium</Span>
|
|
49
|
+
<ProgressBar color="highlight" progress={0.5} size="medium" jss={{ flexGrow: 1 }} />
|
|
50
|
+
</Row>
|
|
51
|
+
<Row gap="medium" align="center">
|
|
52
|
+
<Span size="small" color="secondary" jss={{ width: 60 }}>large</Span>
|
|
53
|
+
<ProgressBar color="highlight" progress={0.5} size="large" jss={{ flexGrow: 1 }} />
|
|
54
|
+
</Row>
|
|
55
|
+
<Row gap="medium" align="center">
|
|
56
|
+
<Span size="small" color="secondary" jss={{ width: 60 }}>xlarge</Span>
|
|
57
|
+
<ProgressBar color="highlight" progress={0.5} size="xlarge" jss={{ flexGrow: 1 }} />
|
|
58
|
+
</Row>
|
|
12
59
|
</Column>
|
|
13
60
|
|
|
14
61
|
```js
|
|
62
|
+
<ProgressBar color="highlight" progress={0.5} size="xsmall" /> // 4px
|
|
63
|
+
<ProgressBar color="highlight" progress={0.5} size="small" /> // 8px
|
|
64
|
+
<ProgressBar color="highlight" progress={0.5} size="medium" /> // 12px
|
|
65
|
+
<ProgressBar color="highlight" progress={0.5} size="large" /> // 16px
|
|
66
|
+
<ProgressBar color="highlight" progress={0.5} size="xlarge" /> // 20px
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Colors
|
|
72
|
+
|
|
15
73
|
<Column gap="medium">
|
|
16
74
|
<ProgressBar color="highlight" progress={0.66} size="large" />
|
|
17
|
-
<ProgressBar color="negative" progress={0.66} size="
|
|
18
|
-
<ProgressBar color="warning" progress={0.66} size="
|
|
75
|
+
<ProgressBar color="negative" progress={0.66} size="large" />
|
|
76
|
+
<ProgressBar color="warning" progress={0.66} size="large" />
|
|
77
|
+
<ProgressBar color="positive" progress={0.66} size="large" />
|
|
78
|
+
</Column>
|
|
79
|
+
|
|
80
|
+
```js
|
|
81
|
+
<ProgressBar color="highlight" progress={0.66} size="large" /> // Accent color
|
|
82
|
+
<ProgressBar color="negative" progress={0.66} size="large" /> // Error/danger
|
|
83
|
+
<ProgressBar color="warning" progress={0.66} size="large" /> // Warning
|
|
84
|
+
<ProgressBar color="positive" progress={0.66} size="large" /> // Success
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Progress states
|
|
90
|
+
|
|
91
|
+
<Column gap="medium">
|
|
92
|
+
<Row gap="medium" align="center">
|
|
93
|
+
<ProgressBar color="highlight" progress={0} size="medium" jss={{ flexGrow: 1 }} />
|
|
94
|
+
<Span size="small" color="secondary">0%</Span>
|
|
95
|
+
</Row>
|
|
96
|
+
<Row gap="medium" align="center">
|
|
97
|
+
<ProgressBar color="highlight" progress={0.25} size="medium" jss={{ flexGrow: 1 }} />
|
|
98
|
+
<Span size="small" color="secondary">25%</Span>
|
|
99
|
+
</Row>
|
|
100
|
+
<Row gap="medium" align="center">
|
|
101
|
+
<ProgressBar color="highlight" progress={0.5} size="medium" jss={{ flexGrow: 1 }} />
|
|
102
|
+
<Span size="small" color="secondary">50%</Span>
|
|
103
|
+
</Row>
|
|
104
|
+
<Row gap="medium" align="center">
|
|
105
|
+
<ProgressBar color="highlight" progress={0.75} size="medium" jss={{ flexGrow: 1 }} />
|
|
106
|
+
<Span size="small" color="secondary">75%</Span>
|
|
107
|
+
</Row>
|
|
108
|
+
<Row gap="medium" align="center">
|
|
109
|
+
<ProgressBar color="positive" progress={1} size="medium" jss={{ flexGrow: 1 }} />
|
|
110
|
+
<Span size="small" color="secondary">100%</Span>
|
|
111
|
+
</Row>
|
|
19
112
|
</Column>
|
|
113
|
+
|
|
114
|
+
```js
|
|
115
|
+
<ProgressBar color="highlight" progress={0} size="medium" /> // Empty
|
|
116
|
+
<ProgressBar color="highlight" progress={0.5} size="medium" /> // Half
|
|
117
|
+
<ProgressBar color="positive" progress={1} size="medium" /> // Complete
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## With percentage label
|
|
123
|
+
|
|
124
|
+
```js
|
|
125
|
+
function UploadProgress({ progress }) {
|
|
126
|
+
const percentage = Math.round(progress * 100);
|
|
127
|
+
|
|
128
|
+
return (
|
|
129
|
+
<Column gap="small">
|
|
130
|
+
<Row justify="space-between">
|
|
131
|
+
<Span>Uploading...</Span>
|
|
132
|
+
<Span color="secondary">{percentage}%</Span>
|
|
133
|
+
</Row>
|
|
134
|
+
<ProgressBar
|
|
135
|
+
color={progress === 1 ? "positive" : "highlight"}
|
|
136
|
+
progress={progress}
|
|
137
|
+
size="medium"
|
|
138
|
+
/>
|
|
139
|
+
</Column>
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Dynamic color based on value
|
|
147
|
+
|
|
148
|
+
```js
|
|
149
|
+
function StorageIndicator({ used, total }) {
|
|
150
|
+
const progress = used / total;
|
|
151
|
+
|
|
152
|
+
// Change color based on usage
|
|
153
|
+
const color = progress > 0.9
|
|
154
|
+
? "negative"
|
|
155
|
+
: progress > 0.7
|
|
156
|
+
? "warning"
|
|
157
|
+
: "highlight";
|
|
158
|
+
|
|
159
|
+
return (
|
|
160
|
+
<Column gap="small">
|
|
161
|
+
<Row justify="space-between">
|
|
162
|
+
<Span>Storage</Span>
|
|
163
|
+
<Span color="secondary">{Math.round(progress * 100)}% used</Span>
|
|
164
|
+
</Row>
|
|
165
|
+
<ProgressBar color={color} progress={progress} size="small" />
|
|
166
|
+
</Column>
|
|
167
|
+
);
|
|
168
|
+
}
|
|
20
169
|
```
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Animated progress
|
|
174
|
+
|
|
175
|
+
The progress bar uses CSS transform for smooth animations:
|
|
176
|
+
|
|
177
|
+
```js
|
|
178
|
+
function AnimatedProgress() {
|
|
179
|
+
const [progress, setProgress] = useState(0);
|
|
180
|
+
|
|
181
|
+
useEffect(() => {
|
|
182
|
+
const interval = setInterval(() => {
|
|
183
|
+
setProgress((p) => (p >= 1 ? 0 : p + 0.1));
|
|
184
|
+
}, 500);
|
|
185
|
+
return () => clearInterval(interval);
|
|
186
|
+
}, []);
|
|
187
|
+
|
|
188
|
+
return <ProgressBar color="highlight" progress={progress} size="medium" />;
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Use cases
|
|
195
|
+
|
|
196
|
+
- **File uploads**: Show upload completion
|
|
197
|
+
- **Storage usage**: Display disk/quota usage
|
|
198
|
+
- **Form completion**: Indicate steps completed
|
|
199
|
+
- **Loading states**: Show determinate loading progress
|
|
200
|
+
- **Skill levels**: Display proficiency ratings
|
|
@@ -1,26 +1,40 @@
|
|
|
1
1
|
import { ProgressCircle } from "../ProgressCircle";
|
|
2
2
|
import { Row } from "../Row";
|
|
3
|
+
import { Column } from "../Column";
|
|
4
|
+
import { Span } from "../Text";
|
|
3
5
|
import { cssVar } from "../jss";
|
|
4
6
|
|
|
5
7
|
# ProgressCircle
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
A circular progress indicator for displaying completion percentage. Uses SVG for crisp rendering at any size.
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Props
|
|
14
|
+
|
|
15
|
+
| Prop | Type | Default | Description |
|
|
16
|
+
|------|------|---------|-------------|
|
|
17
|
+
| `progress` | `number` | Required | Progress value from 0 to 1 |
|
|
18
|
+
| `outerRadius` | `number` | Required | Radius of the circle in pixels |
|
|
19
|
+
| `stroke` | `number` | `4` | Width of the progress stroke |
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Basic usage
|
|
24
|
+
|
|
25
|
+
<Row gap="medium" align="center" padding="medium">
|
|
26
|
+
<ProgressCircle progress={0.75} outerRadius={24} />
|
|
20
27
|
</Row>
|
|
21
28
|
|
|
22
29
|
```js
|
|
23
|
-
<
|
|
30
|
+
<ProgressCircle progress={0.75} outerRadius={24} />
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Progress states
|
|
36
|
+
|
|
37
|
+
<Row gap="medium" align="center" padding="medium">
|
|
24
38
|
<ProgressCircle progress={0.1} outerRadius={12} />
|
|
25
39
|
<ProgressCircle progress={0.2} outerRadius={12} />
|
|
26
40
|
<ProgressCircle progress={0.3} outerRadius={12} />
|
|
@@ -32,4 +46,173 @@ The `ProgressCircle` component can be used to represent percentual progress in a
|
|
|
32
46
|
<ProgressCircle progress={0.9} outerRadius={12} />
|
|
33
47
|
<ProgressCircle progress={1} outerRadius={12} />
|
|
34
48
|
</Row>
|
|
49
|
+
|
|
50
|
+
```js
|
|
51
|
+
<ProgressCircle progress={0.1} outerRadius={12} />
|
|
52
|
+
<ProgressCircle progress={0.2} outerRadius={12} />
|
|
53
|
+
<ProgressCircle progress={0.3} outerRadius={12} />
|
|
54
|
+
// ... and so on
|
|
55
|
+
<ProgressCircle progress={1} outerRadius={12} />
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Sizes
|
|
61
|
+
|
|
62
|
+
Adjust the `outerRadius` to change the circle size:
|
|
63
|
+
|
|
64
|
+
<Row gap="large" align="center" padding="medium">
|
|
65
|
+
<Column align="center" gap="small">
|
|
66
|
+
<ProgressCircle progress={0.66} outerRadius={8} />
|
|
67
|
+
<Span size="small" color="secondary">8px</Span>
|
|
68
|
+
</Column>
|
|
69
|
+
<Column align="center" gap="small">
|
|
70
|
+
<ProgressCircle progress={0.66} outerRadius={12} />
|
|
71
|
+
<Span size="small" color="secondary">12px</Span>
|
|
72
|
+
</Column>
|
|
73
|
+
<Column align="center" gap="small">
|
|
74
|
+
<ProgressCircle progress={0.66} outerRadius={20} />
|
|
75
|
+
<Span size="small" color="secondary">20px</Span>
|
|
76
|
+
</Column>
|
|
77
|
+
<Column align="center" gap="small">
|
|
78
|
+
<ProgressCircle progress={0.66} outerRadius={32} />
|
|
79
|
+
<Span size="small" color="secondary">32px</Span>
|
|
80
|
+
</Column>
|
|
81
|
+
<Column align="center" gap="small">
|
|
82
|
+
<ProgressCircle progress={0.66} outerRadius={48} />
|
|
83
|
+
<Span size="small" color="secondary">48px</Span>
|
|
84
|
+
</Column>
|
|
85
|
+
</Row>
|
|
86
|
+
|
|
87
|
+
```js
|
|
88
|
+
<ProgressCircle progress={0.66} outerRadius={8} /> // Small
|
|
89
|
+
<ProgressCircle progress={0.66} outerRadius={12} /> // Default
|
|
90
|
+
<ProgressCircle progress={0.66} outerRadius={20} /> // Medium
|
|
91
|
+
<ProgressCircle progress={0.66} outerRadius={32} /> // Large
|
|
92
|
+
<ProgressCircle progress={0.66} outerRadius={48} /> // Extra large
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Stroke width
|
|
98
|
+
|
|
99
|
+
Adjust the `stroke` prop to change the line thickness:
|
|
100
|
+
|
|
101
|
+
<Row gap="large" align="center" padding="medium">
|
|
102
|
+
<Column align="center" gap="small">
|
|
103
|
+
<ProgressCircle progress={0.66} outerRadius={24} stroke={2} />
|
|
104
|
+
<Span size="small" color="secondary">2px stroke</Span>
|
|
105
|
+
</Column>
|
|
106
|
+
<Column align="center" gap="small">
|
|
107
|
+
<ProgressCircle progress={0.66} outerRadius={24} stroke={4} />
|
|
108
|
+
<Span size="small" color="secondary">4px stroke</Span>
|
|
109
|
+
</Column>
|
|
110
|
+
<Column align="center" gap="small">
|
|
111
|
+
<ProgressCircle progress={0.66} outerRadius={24} stroke={6} />
|
|
112
|
+
<Span size="small" color="secondary">6px stroke</Span>
|
|
113
|
+
</Column>
|
|
114
|
+
<Column align="center" gap="small">
|
|
115
|
+
<ProgressCircle progress={0.66} outerRadius={24} stroke={8} />
|
|
116
|
+
<Span size="small" color="secondary">8px stroke</Span>
|
|
117
|
+
</Column>
|
|
118
|
+
</Row>
|
|
119
|
+
|
|
120
|
+
```js
|
|
121
|
+
<ProgressCircle progress={0.66} outerRadius={24} stroke={2} />
|
|
122
|
+
<ProgressCircle progress={0.66} outerRadius={24} stroke={4} /> // Default
|
|
123
|
+
<ProgressCircle progress={0.66} outerRadius={24} stroke={6} />
|
|
124
|
+
<ProgressCircle progress={0.66} outerRadius={24} stroke={8} />
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## With label
|
|
130
|
+
|
|
131
|
+
Combine with text to show the percentage:
|
|
132
|
+
|
|
133
|
+
```js
|
|
134
|
+
function CircularProgress({ value }) {
|
|
135
|
+
return (
|
|
136
|
+
<Row align="center" gap="small">
|
|
137
|
+
<ProgressCircle progress={value} outerRadius={16} />
|
|
138
|
+
<Span>{Math.round(value * 100)}%</Span>
|
|
139
|
+
</Row>
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Inline with text
|
|
147
|
+
|
|
148
|
+
Use small circles inline with text:
|
|
149
|
+
|
|
150
|
+
```js
|
|
151
|
+
<Row align="center" gap="small">
|
|
152
|
+
<Span>Task completion:</Span>
|
|
153
|
+
<ProgressCircle progress={0.8} outerRadius={8} stroke={2} />
|
|
154
|
+
<Span color="secondary">80%</Span>
|
|
155
|
+
</Row>
|
|
35
156
|
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Skill indicator
|
|
161
|
+
|
|
162
|
+
```js
|
|
163
|
+
function SkillBadge({ name, level }) {
|
|
164
|
+
return (
|
|
165
|
+
<Row align="center" gap="medium" padding="small">
|
|
166
|
+
<ProgressCircle progress={level / 100} outerRadius={16} />
|
|
167
|
+
<Column gap="none">
|
|
168
|
+
<Span bold>{name}</Span>
|
|
169
|
+
<Span size="small" color="secondary">{level}%</Span>
|
|
170
|
+
</Column>
|
|
171
|
+
</Row>
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Usage
|
|
176
|
+
<SkillBadge name="React" level={90} />
|
|
177
|
+
<SkillBadge name="TypeScript" level={85} />
|
|
178
|
+
<SkillBadge name="Node.js" level={70} />
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Animated loading
|
|
184
|
+
|
|
185
|
+
```js
|
|
186
|
+
function LoadingCircle() {
|
|
187
|
+
const [progress, setProgress] = useState(0);
|
|
188
|
+
|
|
189
|
+
useEffect(() => {
|
|
190
|
+
const interval = setInterval(() => {
|
|
191
|
+
setProgress((p) => (p >= 1 ? 0 : p + 0.05));
|
|
192
|
+
}, 100);
|
|
193
|
+
return () => clearInterval(interval);
|
|
194
|
+
}, []);
|
|
195
|
+
|
|
196
|
+
return <ProgressCircle progress={progress} outerRadius={20} />;
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Styling
|
|
203
|
+
|
|
204
|
+
The ProgressCircle uses these CSS variables:
|
|
205
|
+
- `--secondary-background`: Circle background color
|
|
206
|
+
- `--highlight`: Progress stroke color
|
|
207
|
+
|
|
208
|
+
The SVG is rotated -90 degrees so progress starts from the top.
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## Use cases
|
|
213
|
+
|
|
214
|
+
- **Compact progress indicators**: Where horizontal space is limited
|
|
215
|
+
- **Skill/proficiency displays**: Show expertise levels
|
|
216
|
+
- **Loading states**: Determinate circular spinners
|
|
217
|
+
- **Dashboard metrics**: Compact data visualization
|
|
218
|
+
- **Achievement badges**: Show completion status
|