@youcan/celeste 0.6.32 → 0.6.34

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 (78) hide show
  1. package/dist/celeste.css +300 -234
  2. package/dist/cjs/chunks/index.js +95 -0
  3. package/dist/cjs/dropdown-menu-content.js +52 -2
  4. package/dist/cjs/dropdown-menu-item.js +13 -25
  5. package/dist/cjs/dropdown-menu-sub-content.js +49 -2
  6. package/dist/cjs/dropdown-menu-sub-trigger.js +43 -2
  7. package/dist/cjs/dropdown-menu-trigger.js +2 -2
  8. package/dist/cjs/dropdown.js +1 -2
  9. package/dist/cjs/index.js +15 -9
  10. package/dist/cjs/progress-bar.js +84 -0
  11. package/dist/cjs/progress-circle.js +92 -0
  12. package/dist/components/dropdown-menu/dropdown-menu-item.d.ts +1 -0
  13. package/dist/components/dropdown-menu/dropdown-menu-sub-trigger.d.ts +1 -0
  14. package/dist/components/index.d.ts +1 -0
  15. package/dist/components/progress/index.d.ts +4 -0
  16. package/dist/components/progress/progress-bar.d.ts +31 -0
  17. package/dist/components/progress/progress-circle.d.ts +27 -0
  18. package/dist/es/checkbox-label.js +1 -1
  19. package/dist/es/chunks/index.js +142 -47
  20. package/dist/es/chunks/index2.js +1 -1
  21. package/dist/es/combobox-group.js +1 -1
  22. package/dist/es/combobox-input.js +1 -1
  23. package/dist/es/combobox-item.js +1 -1
  24. package/dist/es/combobox-list.js +1 -1
  25. package/dist/es/combobox-root.js +1 -1
  26. package/dist/es/combobox-separator.js +1 -1
  27. package/dist/es/combobox-trigger.js +1 -1
  28. package/dist/es/command-group.js +1 -1
  29. package/dist/es/command-input.js +1 -1
  30. package/dist/es/command-item.js +1 -1
  31. package/dist/es/command-list.js +1 -1
  32. package/dist/es/command-root.js +1 -1
  33. package/dist/es/command-separator.js +1 -1
  34. package/dist/es/dropdown-menu-content.js +52 -2
  35. package/dist/es/dropdown-menu-group.js +1 -1
  36. package/dist/es/dropdown-menu-item.js +15 -27
  37. package/dist/es/dropdown-menu-label.js +1 -1
  38. package/dist/es/dropdown-menu-separator.js +1 -1
  39. package/dist/es/dropdown-menu-sub-content.js +49 -2
  40. package/dist/es/dropdown-menu-sub-trigger.js +43 -2
  41. package/dist/es/dropdown-menu-trigger.js +2 -2
  42. package/dist/es/dropdown.js +2 -3
  43. package/dist/es/index.js +48 -42
  44. package/dist/es/label.js +1 -1
  45. package/dist/es/progress-bar.js +85 -0
  46. package/dist/es/progress-circle.js +93 -0
  47. package/dist/es/scroll-bar.js +1 -1
  48. package/dist/es/segmented-control-item.js +1 -1
  49. package/dist/es/segmented-control.js +1 -1
  50. package/dist/es/select-content.js +1 -1
  51. package/dist/es/select-item.js +1 -1
  52. package/dist/es/select-trigger.js +1 -1
  53. package/dist/es/select-value.js +1 -1
  54. package/dist/es/tab-menu-content.js +1 -1
  55. package/dist/es/tab-menu-item.js +1 -1
  56. package/dist/es/tab-menu-list.js +1 -1
  57. package/dist/es/tab-menu.js +1 -1
  58. package/dist/es/tooltip.js +1 -1
  59. package/package.json +3 -3
  60. package/src/components/dropdown/dropdown.vue +0 -1
  61. package/src/components/dropdown-menu/dropdown-menu-content.vue +31 -21
  62. package/src/components/dropdown-menu/dropdown-menu-item.vue +8 -62
  63. package/src/components/dropdown-menu/dropdown-menu-sub-content.vue +32 -21
  64. package/src/components/dropdown-menu/dropdown-menu-sub-trigger.vue +30 -6
  65. package/src/components/dropdown-menu/dropdown-menu-trigger.vue +6 -20
  66. package/src/components/dropdown-menu/stories/dropdown-menu.stories.ts +150 -54
  67. package/src/components/index.ts +1 -0
  68. package/src/components/progress/index.ts +5 -0
  69. package/src/components/progress/progress-bar.vue +167 -0
  70. package/src/components/progress/progress-circle.vue +126 -0
  71. package/src/components/progress/stories/progress-bar.stories.ts +328 -0
  72. package/src/components/progress/stories/progress-circular.stories.ts +152 -0
  73. package/dist/cjs/chunks/dropdown-menu-content.vue_vue_type_style_index_0_lang.js +0 -51
  74. package/dist/cjs/chunks/dropdown-menu-sub-content.vue_vue_type_style_index_0_lang.js +0 -49
  75. package/dist/cjs/chunks/dropdown-menu-sub-trigger.vue_vue_type_style_index_0_lang.js +0 -32
  76. package/dist/es/chunks/dropdown-menu-content.vue_vue_type_style_index_0_lang.js +0 -52
  77. package/dist/es/chunks/dropdown-menu-sub-content.vue_vue_type_style_index_0_lang.js +0 -50
  78. package/dist/es/chunks/dropdown-menu-sub-trigger.vue_vue_type_style_index_0_lang.js +0 -33
@@ -0,0 +1,167 @@
1
+ <script setup lang="ts">
2
+ import { useDelegatedProps } from '@/composables/use-delegated-props';
3
+ import clsx from 'clsx';
4
+ import {
5
+ ProgressIndicator,
6
+ ProgressRoot,
7
+ type ProgressRootProps,
8
+ } from 'radix-vue';
9
+ import { computed, type HTMLAttributes } from 'vue';
10
+
11
+ const props = withDefaults(
12
+ defineProps<
13
+ ProgressRootProps & {
14
+ class?: HTMLAttributes['class'];
15
+ color?: 'blue' | 'red' | 'orange' | 'green' | 'primary';
16
+ title?: string;
17
+ layout?: 'default' | 'no-description' | 'inline' | 'bare';
18
+ }
19
+ >(),
20
+ {
21
+ modelValue: 0,
22
+ color: 'primary',
23
+ layout: 'bare',
24
+ max: 100,
25
+ },
26
+ );
27
+
28
+ const delegatedProps = useDelegatedProps(props, 'class');
29
+
30
+ const progress = computed(() => {
31
+ if (props.max === 0)
32
+ return 0;
33
+
34
+ const value = Math.min(Math.max(props.modelValue ?? 0, 0), props.max);
35
+
36
+ return Math.round((value / props.max) * 100);
37
+ });
38
+
39
+ const progressIndicator = computed(() => {
40
+ return 100 - (props.modelValue ?? 0) / props.max * 100;
41
+ });
42
+ </script>
43
+
44
+ <template>
45
+ <div class="celeste-progress-bar-wrapper" :data-layout="layout">
46
+ <div v-if="layout !== 'bare'" class="celeste-progress-bar-label">
47
+ <span
48
+ v-if="props.title && layout !== 'inline'"
49
+ class="celeste-progress-bar-label-title"
50
+ >
51
+ {{ title }}
52
+ </span>
53
+ <span
54
+ class="celeste-progress-bar-label"
55
+ >
56
+ <slot name="label">
57
+ {{ progress }}%
58
+ </slot>
59
+ </span>
60
+ </div>
61
+
62
+ <ProgressRoot
63
+ v-bind="delegatedProps"
64
+ :class="
65
+ clsx(
66
+ 'celeste-progress-bar',
67
+ props.class,
68
+ )
69
+ "
70
+ >
71
+ <ProgressIndicator
72
+ class="celeste-progress-bar-indicator"
73
+ :data-color="color"
74
+ />
75
+ </ProgressRoot>
76
+
77
+ <div v-if="$slots.description && layout === 'default'" class="celeste-progress-bar-description">
78
+ <slot name="description" />
79
+ </div>
80
+ </div>
81
+ </template>
82
+
83
+ <style lang="scss" scoped>
84
+ .celeste-progress-bar-wrapper {
85
+ --bar-height: 6px;
86
+
87
+ display: flex;
88
+ width: 100%;
89
+ gap: var(--spacing-6);
90
+
91
+ .celeste-progress-bar {
92
+ height: var(--bar-height);
93
+ overflow: hidden;
94
+ border-radius: var(--radius-full);
95
+ background: var(--color-bg-soft-200);
96
+ }
97
+
98
+ .celeste-progress-bar-indicator {
99
+ --progress: v-bind('progressIndicator');
100
+
101
+ width: 100%;
102
+ height: 100%;
103
+ transform: translateX(calc(var(--progress) * -1%));
104
+ border-radius: var(--radius-full);
105
+ background: var(--color-primary-base);
106
+
107
+ :dir(rtl) & {
108
+ transform: translateX(calc(var(--progress) * 1%));
109
+ }
110
+
111
+ &[data-color='orange'] {
112
+ background: var(--color-state-warning-base);
113
+ }
114
+
115
+ &[data-color='red'] {
116
+ background: var(--color-state-error-base);
117
+ }
118
+
119
+ &[data-color='blue'] {
120
+ background: var(--color-state-information-base);
121
+ }
122
+
123
+ &[data-color='green'] {
124
+ background: var(--color-state-success-base);
125
+ }
126
+ }
127
+
128
+ .celeste-progress-bar-label {
129
+ display: flex;
130
+ align-items: center;
131
+ justify-content: space-between;
132
+ gap: var(--spacing-6);
133
+ color: var(--color-text-sub-600);
134
+ font: var(--paragraph-sm);
135
+
136
+ &.celeste-progress-bar-title {
137
+ color: var(--color-text-strong-950);
138
+ font: var(--label-sm);
139
+ }
140
+ }
141
+
142
+ .celeste-progress-bar-description {
143
+ color: var(--color-text-sub-600);
144
+ font: var(--paragraph-xs);
145
+ }
146
+
147
+ &[data-layout='default'],
148
+ &[data-layout='no-description'] {
149
+ flex-direction: column;
150
+
151
+ &:deep(.celeste-progress-bar) {
152
+ width: 100%;
153
+ }
154
+ }
155
+
156
+ &[data-layout='inline'],
157
+ &[data-layout='bare'] {
158
+ flex-direction: row-reverse;
159
+ align-items: center;
160
+ gap: var(--spacing-8);
161
+
162
+ &:deep(.celeste-progress-bar) {
163
+ flex: 1;
164
+ }
165
+ }
166
+ }
167
+ </style>
@@ -0,0 +1,126 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue';
3
+ import { useDelegatedProps } from '@/composables/use-delegated-props';
4
+ import clsx from 'clsx';
5
+ import {
6
+ ProgressIndicator,
7
+ ProgressRoot,
8
+ type ProgressRootProps,
9
+ } from 'radix-vue';
10
+ import { computed } from 'vue';
11
+
12
+ const props = withDefaults(
13
+ defineProps<
14
+ ProgressRootProps & {
15
+ class?: HTMLAttributes['class'];
16
+ size?: 80 | 72 | 64 | 56 | 48;
17
+ }
18
+ >(),
19
+ {
20
+ modelValue: 0,
21
+ size: 80,
22
+ max: 100,
23
+ },
24
+ );
25
+
26
+ const delegatedProps = useDelegatedProps(props, 'class');
27
+
28
+ const STROKE_WIDTH = 6.4;
29
+ const radius = computed(() => (props.size - STROKE_WIDTH) / 2);
30
+ const circumference = computed(() => 2 * Math.PI * radius.value);
31
+
32
+ const progress = computed(() => {
33
+ if (props.max === 0)
34
+ return 0;
35
+
36
+ const value = Math.min(Math.max(props.modelValue ?? 0, 0), props.max);
37
+
38
+ return Math.round((value / props.max) * 100);
39
+ });
40
+
41
+ const offset = computed(() => {
42
+ return circumference.value * (1 - progress.value / 100);
43
+ });
44
+
45
+ const circleSize = computed(() => `${props.size}px`);
46
+ </script>
47
+
48
+ <template>
49
+ <ProgressRoot
50
+ v-bind="delegatedProps"
51
+ :value="props.modelValue"
52
+ :class="clsx('celeste-progress-circle', props.class)"
53
+ as="div"
54
+ >
55
+ <ProgressIndicator as-child>
56
+ <svg
57
+ class="celeste-progress-circle-svg"
58
+ :width="props.size"
59
+ :height="props.size"
60
+ >
61
+ <circle
62
+ class="celeste-progress-circle-track"
63
+ :cx="props.size / 2"
64
+ :cy="props.size / 2"
65
+ :r="radius"
66
+ :stroke-width="STROKE_WIDTH"
67
+ fill="transparent"
68
+ />
69
+ <circle
70
+ class="celeste-progress-circle-indicator"
71
+ :cx="props.size / 2"
72
+ :cy="props.size / 2"
73
+ :r="radius"
74
+ :stroke-width="STROKE_WIDTH"
75
+ fill="transparent"
76
+ :stroke-dasharray="circumference"
77
+ :stroke-dashoffset="offset"
78
+ />
79
+ </svg>
80
+ </ProgressIndicator>
81
+ <div
82
+ v-if="props.size !== 48"
83
+ class="celeste-progress-circle-label"
84
+ >
85
+ <slot>
86
+ {{ progress }}%
87
+ </slot>
88
+ </div>
89
+ </ProgressRoot>
90
+ </template>
91
+
92
+ <style scoped lang="scss">
93
+ .celeste-progress-circle {
94
+ display: inline-flex;
95
+ position: relative;
96
+ align-items: center;
97
+ justify-content: center;
98
+ width: v-bind('circleSize');
99
+ height: v-bind('circleSize');
100
+ }
101
+
102
+ .celeste-progress-circle-svg {
103
+ transform: rotate(-90deg);
104
+ }
105
+
106
+ .celeste-progress-circle-track {
107
+ stroke: var(--color-bg-soft-200);
108
+ }
109
+
110
+ .celeste-progress-circle-indicator {
111
+ transition: stroke-dashoffset 0.3s ease;
112
+ stroke: var(--color-primary-base);
113
+ }
114
+
115
+ .celeste-progress-circle-label {
116
+ position: absolute;
117
+ top: 50%;
118
+ left: 50%;
119
+ transform: translate(-50%, -50%);
120
+ color: var(--color-text-strong-950);
121
+ font: var(--label-sm);
122
+ text-align: center;
123
+ pointer-events: none;
124
+ user-select: none;
125
+ }
126
+ </style>
@@ -0,0 +1,328 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3-vite';
2
+ import ProgressBar from '../progress-bar.vue';
3
+
4
+ const meta: Meta<typeof ProgressBar> = {
5
+ title: 'Components/Progress/Progress Bar',
6
+ component: ProgressBar,
7
+ argTypes: {
8
+ color: {
9
+ control: { type: 'select' },
10
+ options: ['primary', 'blue', 'red', 'orange', 'green'],
11
+ },
12
+ layout: {
13
+ control: { type: 'select' },
14
+ options: ['default', 'no-description', 'inline', 'bare'],
15
+ },
16
+ },
17
+ };
18
+
19
+ export default meta;
20
+
21
+ type Story = StoryObj<typeof ProgressBar>;
22
+
23
+ export const Default: Story = {
24
+ args: {
25
+ layout: 'default',
26
+ title: 'Data Storage',
27
+ modelValue: 60,
28
+ color: 'primary',
29
+ },
30
+ render: args => ({
31
+ components: { ProgressBar },
32
+ setup() {
33
+ return { args };
34
+ },
35
+ template: `
36
+ <ProgressBar v-bind="args">
37
+ <template #description>
38
+ Upgrade to unlock unlimited data storage.
39
+ </template>
40
+ </ProgressBar>
41
+ `,
42
+ }),
43
+ };
44
+
45
+ export const ZeroProgress: Story = {
46
+ args: {
47
+ layout: 'default',
48
+ title: 'Download Progress',
49
+ modelValue: 0,
50
+ },
51
+ render: args => ({
52
+ components: { ProgressBar },
53
+ setup() {
54
+ return { args };
55
+ },
56
+ template: `
57
+ <ProgressBar v-bind="args">
58
+ <template #description>
59
+ Waiting to start download...
60
+ </template>
61
+ </ProgressBar>
62
+ `,
63
+ }),
64
+ };
65
+
66
+ export const FullProgress: Story = {
67
+ args: {
68
+ layout: 'default',
69
+ title: 'Upload Complete',
70
+ modelValue: 100,
71
+ color: 'green',
72
+ },
73
+ render: args => ({
74
+ components: { ProgressBar },
75
+ setup() {
76
+ return { args };
77
+ },
78
+ template: `
79
+ <ProgressBar v-bind="args">
80
+ <template #description>
81
+ All files have been uploaded successfully.
82
+ </template>
83
+ </ProgressBar>
84
+ `,
85
+ }),
86
+ };
87
+
88
+ export const WithCustomMax: Story = {
89
+ name: 'With Custom Max Value',
90
+ args: {
91
+ layout: 'default',
92
+ title: 'Memory Usage',
93
+ modelValue: 6144,
94
+ max: 8192,
95
+ },
96
+ render: args => ({
97
+ components: { ProgressBar },
98
+ setup() {
99
+ return { args };
100
+ },
101
+ template: `
102
+ <ProgressBar v-bind="args">
103
+ <template #label>
104
+ {{ args.modelValue }}MB / {{ args.max }}MB
105
+ </template>
106
+ <template #description>
107
+ System memory utilization is within normal range.
108
+ </template>
109
+ </ProgressBar>
110
+ `,
111
+ }),
112
+ };
113
+
114
+ export const DifferentLayouts: Story = {
115
+ render: () => ({
116
+ components: { ProgressBar },
117
+ template: `
118
+ <div style="display: flex; flex-direction: column; gap: 32px;">
119
+ <div>
120
+ <h3 style="margin-bottom: 16px; font: var(--label-md);">Default Layout</h3>
121
+ <ProgressBar layout="default" title="Project Progress" :modelValue="75">
122
+ <template #description>
123
+ 3 of 4 milestones completed
124
+ </template>
125
+ </ProgressBar>
126
+ </div>
127
+
128
+ <div>
129
+ <h3 style="margin-bottom: 16px; font: var(--label-md);">No Description Layout</h3>
130
+ <ProgressBar layout="no-description" title="Sync Status" :modelValue="45" />
131
+ </div>
132
+
133
+ <div>
134
+ <h3 style="margin-bottom: 16px; font: var(--label-md);">Inline Layout</h3>
135
+ <ProgressBar layout="inline" :modelValue="80" />
136
+ </div>
137
+
138
+ <div>
139
+ <h3 style="margin-bottom: 16px; font: var(--label-md);">Bare Layout</h3>
140
+ <ProgressBar layout="bare" :modelValue="30" />
141
+ </div>
142
+ </div>
143
+ `,
144
+ }),
145
+ };
146
+
147
+ export const DifferentColors: Story = {
148
+ render: () => ({
149
+ components: { ProgressBar },
150
+ template: `
151
+ <div style="display: flex; flex-direction: column; gap: 24px;">
152
+ <div>
153
+ <p style="margin-bottom: 8px; font: var(--label-sm);">Primary</p>
154
+ <ProgressBar layout="inline" color="primary" :modelValue="60" />
155
+ </div>
156
+ <div>
157
+ <p style="margin-bottom: 8px; font: var(--label-sm);">Blue (Information)</p>
158
+ <ProgressBar layout="inline" color="blue" :modelValue="40" />
159
+ </div>
160
+ <div>
161
+ <p style="margin-bottom: 8px; font: var(--label-sm);">Green (Success)</p>
162
+ <ProgressBar layout="inline" color="green" :modelValue="85" />
163
+ </div>
164
+ <div>
165
+ <p style="margin-bottom: 8px; font: var(--label-sm);">Orange (Warning)</p>
166
+ <ProgressBar layout="inline" color="orange" :modelValue="25" />
167
+ </div>
168
+ <div>
169
+ <p style="margin-bottom: 8px; font: var(--label-sm);">Red (Error)</p>
170
+ <ProgressBar layout="inline" color="red" :modelValue="15" />
171
+ </div>
172
+ </div>
173
+ `,
174
+ }),
175
+ };
176
+
177
+ export const WithCustomLabel: Story = {
178
+ name: 'With Custom Label (Slot)',
179
+ args: {
180
+ layout: 'default',
181
+ title: 'File Transfer',
182
+ modelValue: 1024,
183
+ max: 2048,
184
+ },
185
+ render: args => ({
186
+ components: { ProgressBar },
187
+ setup() {
188
+ return { args };
189
+ },
190
+ template: `
191
+ <ProgressBar v-bind="args">
192
+ <template #label>
193
+ {{ Math.round(args.modelValue / 1024 * 10) / 10 }}GB of {{ args.max / 1024 }}GB
194
+ </template>
195
+ <template #description>
196
+ Transfer speed: 25 MB/s • Time remaining: 2 minutes
197
+ </template>
198
+ </ProgressBar>
199
+ `,
200
+ }),
201
+ };
202
+
203
+ export const InlineWithTitle: Story = {
204
+ name: 'Inline Layout with Title',
205
+ args: {
206
+ layout: 'inline',
207
+ title: 'CPU Usage',
208
+ modelValue: 68,
209
+ color: 'orange',
210
+ },
211
+ render: args => ({
212
+ components: { ProgressBar },
213
+ setup() {
214
+ return { args };
215
+ },
216
+ template: `
217
+ <ProgressBar v-bind="args" />
218
+ `,
219
+ }),
220
+ };
221
+
222
+ export const LoadingStates: Story = {
223
+ name: 'Loading States Example',
224
+ render: () => ({
225
+ components: { ProgressBar },
226
+ template: `
227
+ <div style="display: flex; flex-direction: column; gap: 24px;">
228
+ <div>
229
+ <h4 style="margin-bottom: 12px; font: var(--label-sm);">Initializing</h4>
230
+ <ProgressBar layout="default" title="Setup" :modelValue="5" color="blue">
231
+ <template #description>
232
+ Preparing environment...
233
+ </template>
234
+ </ProgressBar>
235
+ </div>
236
+
237
+ <div>
238
+ <h4 style="margin-bottom: 12px; font: var(--label-sm);">In Progress</h4>
239
+ <ProgressBar layout="default" title="Installation" :modelValue="47" color="primary">
240
+ <template #description>
241
+ Installing dependencies (23 of 49)
242
+ </template>
243
+ </ProgressBar>
244
+ </div>
245
+
246
+ <div>
247
+ <h4 style="margin-bottom: 12px; font: var(--label-sm);">Nearly Complete</h4>
248
+ <ProgressBar layout="default" title="Finalizing" :modelValue="92" color="green">
249
+ <template #description>
250
+ Running final checks...
251
+ </template>
252
+ </ProgressBar>
253
+ </div>
254
+ </div>
255
+ `,
256
+ }),
257
+ };
258
+
259
+ export const EdgeCases: Story = {
260
+ render: () => ({
261
+ components: { ProgressBar },
262
+ template: `
263
+ <div style="display: flex; flex-direction: column; gap: 24px;">
264
+ <div>
265
+ <p style="margin-bottom: 8px; font: var(--label-sm);">Over Max Value</p>
266
+ <ProgressBar layout="inline" :modelValue="150" :max="100" color="red" />
267
+ </div>
268
+ <div>
269
+ <p style="margin-bottom: 8px; font: var(--label-sm);">Negative Value</p>
270
+ <ProgressBar layout="inline" :modelValue="-20" color="red" />
271
+ </div>
272
+ <div>
273
+ <p style="margin-bottom: 8px; font: var(--label-sm);">Max is Zero</p>
274
+ <ProgressBar layout="inline" :modelValue="0" :max="0" />
275
+ </div>
276
+ <div>
277
+ <p style="margin-bottom: 8px; font: var(--label-sm);">Very Small Progress</p>
278
+ <ProgressBar layout="inline" :modelValue="0.5" :max="100" />
279
+ </div>
280
+ </div>
281
+ `,
282
+ }),
283
+ };
284
+
285
+ export const RealWorldExamples: Story = {
286
+ name: 'Real World Use Cases',
287
+ render: () => ({
288
+ components: { ProgressBar },
289
+ template: `
290
+ <div style="display: flex; flex-direction: column; gap: 32px; max-width: 400px;">
291
+ <div>
292
+ <h4 style="margin-bottom: 16px; font: var(--label-md);">Storage Quota</h4>
293
+ <ProgressBar layout="default" title="Cloud Storage" :modelValue="1847" :max="2000" color="orange">
294
+ <template #label>
295
+ 1.8GB of 2GB used
296
+ </template>
297
+ <template #description>
298
+ You're running low on storage space. Consider upgrading your plan.
299
+ </template>
300
+ </ProgressBar>
301
+ </div>
302
+
303
+ <div>
304
+ <h4 style="margin-bottom: 16px; font: var(--label-md);">Profile Completion</h4>
305
+ <ProgressBar layout="default" title="Profile Setup" :modelValue="6" :max="8" color="blue">
306
+ <template #label>
307
+ 6 of 8 steps completed
308
+ </template>
309
+ <template #description>
310
+ Complete your profile to unlock all features.
311
+ </template>
312
+ </ProgressBar>
313
+ </div>
314
+
315
+ <div>
316
+ <h4 style="margin-bottom: 16px; font: var(--label-md);">System Health</h4>
317
+ <ProgressBar layout="no-description" title="CPU Usage" :modelValue="23" color="green" />
318
+ <div style="margin-top: 8px;">
319
+ <ProgressBar layout="no-description" title="Memory" :modelValue="67" color="primary" />
320
+ </div>
321
+ <div style="margin-top: 8px;">
322
+ <ProgressBar layout="no-description" title="Disk Space" :modelValue="89" color="orange" />
323
+ </div>
324
+ </div>
325
+ </div>
326
+ `,
327
+ }),
328
+ };