aidos-ui 3.0.31 → 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.
Files changed (157) hide show
  1. package/.claude/settings.local.json +14 -1
  2. package/CLAUDE.md +72 -0
  3. package/README.md +43 -29
  4. package/dist/Badge.d.ts +2 -2
  5. package/dist/Badge.js.map +1 -1
  6. package/dist/BaseButton.d.ts +2 -2
  7. package/dist/BaseButton.js +2 -2
  8. package/dist/BaseButton.js.map +1 -1
  9. package/dist/BaseInput.d.ts +2 -2
  10. package/dist/BaseInput.js.map +1 -1
  11. package/dist/BaseLink.d.ts +2 -2
  12. package/dist/BaseLink.js +2 -2
  13. package/dist/BaseLink.js.map +1 -1
  14. package/dist/BaseListItem.d.ts +3 -3
  15. package/dist/BaseListItem.js.map +1 -1
  16. package/dist/BaseView.d.ts +2 -2
  17. package/dist/BaseView.js.map +1 -1
  18. package/dist/Calendar.d.ts +4 -4
  19. package/dist/DarkMode.js.map +1 -1
  20. package/dist/DateInput.d.ts +2 -2
  21. package/dist/DatePicker.js.map +1 -1
  22. package/dist/DatetimeInput.d.ts +2 -2
  23. package/dist/Dialog.d.ts +3 -3
  24. package/dist/Dialog.js.map +1 -1
  25. package/dist/Dropdown.d.ts +3 -3
  26. package/dist/Dropdown.js.map +1 -1
  27. package/dist/Icon.d.ts +3 -3
  28. package/dist/Icon.js +2 -21
  29. package/dist/Icon.js.map +1 -1
  30. package/dist/IconLink.js +2 -1
  31. package/dist/IconLink.js.map +1 -1
  32. package/dist/Interactable.d.ts +4 -4
  33. package/dist/Interactable.js +2 -2
  34. package/dist/Interactable.js.map +1 -1
  35. package/dist/ListButtonItem.js +2 -2
  36. package/dist/ListButtonItem.js.map +1 -1
  37. package/dist/ListLinkItem.js +2 -2
  38. package/dist/ListLinkItem.js.map +1 -1
  39. package/dist/MenuIcon.js.map +1 -1
  40. package/dist/NextJSRouter.js.map +1 -1
  41. package/dist/NextJSRouterState.js.map +1 -1
  42. package/dist/OnVisible.d.ts +1 -1
  43. package/dist/OnVisible.js.map +1 -1
  44. package/dist/Popover.d.ts +7 -7
  45. package/dist/Popover.js +2 -2
  46. package/dist/Popover.js.map +1 -1
  47. package/dist/ProgressBar.d.ts +2 -2
  48. package/dist/ProgressBar.js.map +1 -1
  49. package/dist/Providers.d.ts +2 -2
  50. package/dist/Providers.js +2 -2
  51. package/dist/Providers.js.map +1 -1
  52. package/dist/RangeInput.d.ts +3 -3
  53. package/dist/RangeInput.js +2 -2
  54. package/dist/RangeInput.js.map +1 -1
  55. package/dist/RootView.js.map +1 -1
  56. package/dist/Select.d.ts +2 -3
  57. package/dist/Select.js.map +1 -1
  58. package/dist/StaticCheckbox.js.map +1 -1
  59. package/dist/Storage.d.ts +2 -1
  60. package/dist/Storage.js.map +1 -1
  61. package/dist/Stream.js.map +1 -1
  62. package/dist/Sublist.d.ts +2 -2
  63. package/dist/Tabs.d.ts +4 -4
  64. package/dist/Tabs.js +2 -4
  65. package/dist/Tabs.js.map +1 -1
  66. package/dist/Text.d.ts +2 -2
  67. package/dist/Text.js.map +1 -1
  68. package/dist/TextArea.d.ts +2 -2
  69. package/dist/TextArea.js.map +1 -1
  70. package/dist/TextInput.d.ts +4 -3
  71. package/dist/TextInput.js +14 -5
  72. package/dist/TextInput.js.map +1 -1
  73. package/dist/TextPairing.d.ts +2 -2
  74. package/dist/TextPairing.js.map +1 -1
  75. package/dist/Tooltip.d.ts +4 -4
  76. package/dist/Tooltip.js.map +1 -1
  77. package/dist/aria.js.map +1 -1
  78. package/dist/hash.js.map +1 -1
  79. package/dist/jss.d.ts +21 -21
  80. package/dist/jss.js +6 -6
  81. package/dist/jss.js.map +1 -1
  82. package/dist/numberToBase.js.map +1 -1
  83. package/dist/stateMachineContextFactory.js.map +1 -1
  84. package/dist/useCookie.js.map +1 -1
  85. package/dist/useKeyboard.js.map +1 -1
  86. package/dist/useNavigation.js.map +1 -1
  87. package/dist/useRefEffect.js.map +1 -1
  88. package/next-env.d.ts +2 -1
  89. package/next.config.js +2 -1
  90. package/package.json +27 -20
  91. package/src/Badge.tsx +2 -2
  92. package/src/BaseButton.tsx +4 -4
  93. package/src/BaseInput.tsx +2 -2
  94. package/src/BaseLink.tsx +4 -4
  95. package/src/BaseListItem.tsx +3 -3
  96. package/src/BaseView.tsx +3 -3
  97. package/src/Calendar.tsx +4 -4
  98. package/src/DateInput.tsx +2 -2
  99. package/src/DatetimeInput.tsx +2 -2
  100. package/src/Dialog.tsx +3 -3
  101. package/src/Dropdown.tsx +4 -4
  102. package/src/Icon.tsx +4 -30
  103. package/src/IconLink.tsx +2 -1
  104. package/src/Interactable.tsx +4 -4
  105. package/src/ListButtonItem.tsx +2 -2
  106. package/src/ListLinkItem.tsx +2 -2
  107. package/src/MenuIcon.tsx +2 -2
  108. package/src/NextJSRouter.tsx +2 -2
  109. package/src/Popover.tsx +9 -9
  110. package/src/ProgressBar.tsx +3 -3
  111. package/src/Providers.tsx +4 -4
  112. package/src/RangeInput.tsx +5 -5
  113. package/src/Select.tsx +2 -2
  114. package/src/StaticCheckbox.tsx +2 -2
  115. package/src/Storage.tsx +1 -1
  116. package/src/Sublist.tsx +2 -2
  117. package/src/Tabs.tsx +4 -6
  118. package/src/Text.tsx +2 -2
  119. package/src/TextArea.tsx +2 -2
  120. package/src/TextInput.tsx +20 -8
  121. package/src/TextPairing.tsx +2 -2
  122. package/src/Tooltip.tsx +5 -5
  123. package/src/docs/mdx.tsx +40 -0
  124. package/src/docs/searchIndex.ts +1 -1
  125. package/src/jss.tsx +18 -18
  126. package/src/pages/Badge.mdx +136 -14
  127. package/src/pages/Button.mdx +121 -63
  128. package/src/pages/Calendar.mdx +196 -2
  129. package/src/pages/Card.mdx +123 -47
  130. package/src/pages/Checkbox.mdx +103 -28
  131. package/src/pages/Dialog.mdx +172 -7
  132. package/src/pages/FlexLayout.mdx +185 -51
  133. package/src/pages/Hashing.mdx +199 -8
  134. package/src/pages/Icon.mdx +150 -42
  135. package/src/pages/IconButton.mdx +127 -116
  136. package/src/pages/Link.mdx +118 -47
  137. package/src/pages/List.mdx +167 -283
  138. package/src/pages/ListHeader.mdx +157 -27
  139. package/src/pages/Popover.mdx +177 -55
  140. package/src/pages/ProgressBar.mdx +186 -6
  141. package/src/pages/ProgressCircle.mdx +196 -13
  142. package/src/pages/RangeInput.mdx +189 -61
  143. package/src/pages/Tabs.mdx +202 -346
  144. package/src/pages/Text.mdx +102 -81
  145. package/src/pages/TextInput.mdx +169 -44
  146. package/src/pages/TextPairing.mdx +164 -115
  147. package/src/pages/TimeInput.mdx +142 -37
  148. package/src/pages/Tooltip.mdx +99 -12
  149. package/src/pages/_app.tsx +14 -4
  150. package/src/pages/css-in-js.mdx +196 -83
  151. package/src/pages/navigation.mdx +122 -20
  152. package/src/pages/useCookie.mdx +168 -7
  153. package/src/pages/useKeyboard.mdx +242 -5
  154. package/src/pages/useNavigation.mdx +244 -16
  155. package/src/pages/usePromise.mdx +271 -6
  156. package/src/pages/useRefEffect.mdx +230 -28
  157. 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
- The `ProgressBar` component can be used to represent percentual progress in a linear way:
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="large" />
10
- <ProgressBar color="negative" progress={0.66} size="medium" />
11
- <ProgressBar color="warning" progress={0.66} size="small" />
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="medium" />
18
- <ProgressBar color="warning" progress={0.66} size="small" />
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
- The `ProgressCircle` component can be used to represent percentual progress in a circular way:
9
+ A circular progress indicator for displaying completion percentage. Uses SVG for crisp rendering at any size.
8
10
 
9
- <Row gap="medium" align="center">
10
- <ProgressCircle progress={0.1} outerRadius={12} />
11
- <ProgressCircle progress={0.2} outerRadius={12} />
12
- <ProgressCircle progress={0.3} outerRadius={12} />
13
- <ProgressCircle progress={0.4} outerRadius={12} />
14
- <ProgressCircle progress={0.5} outerRadius={12} />
15
- <ProgressCircle progress={0.6} outerRadius={12} />
16
- <ProgressCircle progress={0.7} outerRadius={12} />
17
- <ProgressCircle progress={0.8} outerRadius={12} />
18
- <ProgressCircle progress={0.9} outerRadius={12} />
19
- <ProgressCircle progress={1} outerRadius={12} />
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
- <Row gap="medium" align="center">
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