svelte-comp 1.3.3 → 1.3.6
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/LICENSE.md +21 -21
- package/README.md +101 -100
- package/dist/App.svelte +507 -507
- package/dist/Container.svelte +59 -59
- package/dist/app.css +234 -235
- package/dist/app.d.ts +10 -0
- package/dist/lib/Accordion.svelte +155 -155
- package/dist/lib/Badge.svelte +44 -44
- package/dist/lib/Button.svelte +185 -170
- package/dist/lib/Calendar.svelte +384 -384
- package/dist/lib/Card.svelte +103 -103
- package/dist/lib/Carousel.svelte +293 -293
- package/dist/lib/Carousel.svelte.d.ts +1 -1
- package/dist/lib/CheckBox.svelte +210 -210
- package/dist/lib/CodeView.svelte +308 -307
- package/dist/lib/ColorPicker.svelte +159 -159
- package/dist/lib/ContextMenu.svelte +328 -322
- package/dist/lib/DatePicker.svelte +246 -246
- package/dist/lib/Dialog.svelte +233 -233
- package/dist/lib/Field.svelte +299 -299
- package/dist/lib/FilePicker.svelte +295 -240
- package/dist/lib/FilePicker.svelte.d.ts +6 -1
- package/dist/lib/Form.svelte +438 -438
- package/dist/lib/Hamburger.svelte +217 -217
- package/dist/lib/InstallPWA.svelte +94 -94
- package/dist/lib/Menu.svelte +623 -623
- package/dist/lib/NoticeBase.svelte +140 -140
- package/dist/lib/PaginatedCard.svelte +73 -73
- package/dist/lib/Pagination.svelte +119 -119
- package/dist/lib/PrimaryColorSelect.svelte +111 -111
- package/dist/lib/ProgressBar.svelte +141 -141
- package/dist/lib/ProgressCircle.svelte +190 -190
- package/dist/lib/Radio.svelte +189 -189
- package/dist/lib/SearchInput.svelte +104 -104
- package/dist/lib/Select.svelte +524 -524
- package/dist/lib/Slider.svelte +253 -253
- package/dist/lib/Splitter.svelte +159 -150
- package/dist/lib/Switch.svelte +168 -167
- package/dist/lib/Table.svelte +299 -299
- package/dist/lib/Tabs.svelte +213 -213
- package/dist/lib/ThemeToggle.svelte +128 -127
- package/dist/lib/TimePicker.svelte +312 -312
- package/dist/lib/TimePickerNew.svelte +634 -0
- package/dist/lib/TimePickerNew.svelte.d.ts +49 -0
- package/dist/lib/Toast.svelte +123 -123
- package/dist/lib/Tooltip.svelte +110 -110
- package/dist/lib/Topbar.svelte +107 -107
- package/dist/lib/__tests__/Accordion.test.d.ts +1 -0
- package/dist/lib/__tests__/Accordion.test.js +171 -0
- package/dist/lib/__tests__/Badge.test.d.ts +1 -0
- package/dist/lib/__tests__/Badge.test.js +41 -0
- package/dist/lib/__tests__/Button.test.d.ts +1 -0
- package/dist/lib/__tests__/Button.test.js +269 -0
- package/dist/lib/__tests__/Calendar.test.d.ts +1 -0
- package/dist/lib/__tests__/Calendar.test.js +171 -0
- package/dist/lib/__tests__/Card.test.d.ts +1 -0
- package/dist/lib/__tests__/Card.test.js +148 -0
- package/dist/lib/__tests__/Carousel.test.d.ts +1 -0
- package/dist/lib/__tests__/Carousel.test.js +439 -0
- package/dist/lib/__tests__/CheckBox.test.d.ts +1 -0
- package/dist/lib/__tests__/CheckBox.test.js +152 -0
- package/dist/lib/__tests__/CodeView.test.d.ts +1 -0
- package/dist/lib/__tests__/CodeView.test.js +157 -0
- package/dist/lib/__tests__/ColorPicker.test.d.ts +1 -0
- package/dist/lib/__tests__/ColorPicker.test.js +93 -0
- package/dist/lib/__tests__/ContextMenu.test.d.ts +1 -0
- package/dist/lib/__tests__/ContextMenu.test.js +67 -0
- package/dist/lib/__tests__/DatePicker.test.d.ts +1 -0
- package/dist/lib/__tests__/DatePicker.test.js +108 -0
- package/dist/lib/__tests__/Dialog.test.d.ts +1 -0
- package/dist/lib/__tests__/Dialog.test.js +183 -0
- package/dist/lib/__tests__/Field.test.d.ts +1 -0
- package/dist/lib/__tests__/Field.test.js +190 -0
- package/dist/lib/__tests__/FilePicker.test.d.ts +1 -0
- package/dist/lib/__tests__/FilePicker.test.js +179 -0
- package/dist/lib/__tests__/Form.integration.test.d.ts +1 -0
- package/dist/lib/__tests__/Form.integration.test.js +158 -0
- package/dist/lib/__tests__/Form.test.d.ts +1 -0
- package/dist/lib/__tests__/Form.test.js +463 -0
- package/dist/lib/__tests__/Hamburger.test.d.ts +1 -0
- package/dist/lib/__tests__/Hamburger.test.js +161 -0
- package/dist/lib/__tests__/InstallPWA.test.d.ts +1 -0
- package/dist/lib/__tests__/InstallPWA.test.js +15 -0
- package/dist/lib/__tests__/Menu.test.d.ts +1 -0
- package/dist/lib/__tests__/Menu.test.js +285 -0
- package/dist/lib/__tests__/NoticeBase.test.d.ts +1 -0
- package/dist/lib/__tests__/NoticeBase.test.js +60 -0
- package/dist/lib/__tests__/PaginatedCard.test.d.ts +1 -0
- package/dist/lib/__tests__/PaginatedCard.test.js +89 -0
- package/dist/lib/__tests__/Pagination.test.d.ts +1 -0
- package/dist/lib/__tests__/Pagination.test.js +168 -0
- package/dist/lib/__tests__/PrimaryColorSelect.test.d.ts +1 -0
- package/dist/lib/__tests__/PrimaryColorSelect.test.js +92 -0
- package/dist/lib/__tests__/ProgressBar.test.d.ts +1 -0
- package/dist/lib/__tests__/ProgressBar.test.js +69 -0
- package/dist/lib/__tests__/ProgressCircle.test.d.ts +1 -0
- package/dist/lib/__tests__/ProgressCircle.test.js +71 -0
- package/dist/lib/__tests__/Radio.test.d.ts +1 -0
- package/dist/lib/__tests__/Radio.test.js +127 -0
- package/dist/lib/__tests__/SearchInput.test.d.ts +1 -0
- package/dist/lib/__tests__/SearchInput.test.js +80 -0
- package/dist/lib/__tests__/Select.test.d.ts +1 -0
- package/dist/lib/__tests__/Select.test.js +408 -0
- package/dist/lib/__tests__/Slider.test.d.ts +1 -0
- package/dist/lib/__tests__/Slider.test.js +213 -0
- package/dist/lib/__tests__/Splitter.test.d.ts +1 -0
- package/dist/lib/__tests__/Splitter.test.js +87 -0
- package/dist/lib/__tests__/Switch.test.d.ts +1 -0
- package/dist/lib/__tests__/Switch.test.js +97 -0
- package/dist/lib/__tests__/Table.test.d.ts +1 -0
- package/dist/lib/__tests__/Table.test.js +349 -0
- package/dist/lib/__tests__/Tabs.test.d.ts +1 -0
- package/dist/lib/__tests__/Tabs.test.js +262 -0
- package/dist/lib/__tests__/ThemeToggle.test.d.ts +1 -0
- package/dist/lib/__tests__/ThemeToggle.test.js +84 -0
- package/dist/lib/__tests__/TimePicker.test.d.ts +1 -0
- package/dist/lib/__tests__/TimePicker.test.js +146 -0
- package/dist/lib/__tests__/TimePickerNew.test.d.ts +1 -0
- package/dist/lib/__tests__/TimePickerNew.test.js +322 -0
- package/dist/lib/__tests__/Toast.test.d.ts +1 -0
- package/dist/lib/__tests__/Toast.test.js +135 -0
- package/dist/lib/__tests__/Tooltip.test.d.ts +1 -0
- package/dist/lib/__tests__/Tooltip.test.js +171 -0
- package/dist/lib/__tests__/Topbar.test.d.ts +1 -0
- package/dist/lib/__tests__/Topbar.test.js +25 -0
- package/dist/lib/__tests__/setupLangContext.d.ts +1 -0
- package/dist/lib/__tests__/setupLangContext.js +65 -0
- package/dist/lib/__tests__/storage.test.d.ts +1 -0
- package/dist/lib/__tests__/storage.test.js +124 -0
- package/dist/lib/__tests__/utils.test.d.ts +1 -0
- package/dist/lib/__tests__/utils.test.js +11 -0
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.js +1 -0
- package/dist/lib/lang.d.ts +4 -0
- package/dist/lib/lang.js +4 -0
- package/dist/styles.css +234 -232
- package/dist/utils/index.js +15 -4
- package/package.json +52 -52
|
@@ -1,190 +1,190 @@
|
|
|
1
|
-
<!-- src/lib/ProgressCircle.svelte -->
|
|
2
|
-
<script lang="ts">
|
|
3
|
-
/**
|
|
4
|
-
* @component ProgressCircle
|
|
5
|
-
* @description Circular progress indicator for visualizing completion or load state (0-100). Supports indeterminate mode.
|
|
6
|
-
* @prop value {number} - Current progress value
|
|
7
|
-
* @default 0
|
|
8
|
-
* @prop indeterminate {boolean} - Enables spinning infinite mode
|
|
9
|
-
* @default false
|
|
10
|
-
* @prop sz {SizeKey} - Size preset (xs|sm|md|lg|xl)
|
|
11
|
-
* @default md
|
|
12
|
-
* @prop variant {ComponentVariant} - Color/style variant
|
|
13
|
-
* @options default|neutral
|
|
14
|
-
* @default default
|
|
15
|
-
* @prop label {string} - Optional text shown above the circle
|
|
16
|
-
* @default ""
|
|
17
|
-
* @prop disabled {boolean} - Apply disabled styles
|
|
18
|
-
* @default false
|
|
19
|
-
* @prop class {string} - Extra wrapper classes
|
|
20
|
-
* @default ""
|
|
21
|
-
* @note Clamps value between 0-100
|
|
22
|
-
* @note Uses SVG stroke-dashoffset animation
|
|
23
|
-
* @note Accessible role=progressbar with aria-valuenow
|
|
24
|
-
* @note Works in both determinate/indeterminate modes
|
|
25
|
-
*/
|
|
26
|
-
import type { HTMLAttributes } from "svelte/elements";
|
|
27
|
-
import { type SizeKey, type ComponentVariant, TEXT } from "./types";
|
|
28
|
-
import { cx, clamp } from "../utils";
|
|
29
|
-
|
|
30
|
-
type Props = HTMLAttributes<HTMLDivElement> & {
|
|
31
|
-
value?: number;
|
|
32
|
-
indeterminate?: boolean;
|
|
33
|
-
sz?: SizeKey;
|
|
34
|
-
variant?: ComponentVariant;
|
|
35
|
-
class?: string;
|
|
36
|
-
label?: string;
|
|
37
|
-
disabled?: boolean;
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
let {
|
|
41
|
-
value = 0,
|
|
42
|
-
indeterminate = false,
|
|
43
|
-
sz = "md",
|
|
44
|
-
variant = "default",
|
|
45
|
-
class: externalClass = "",
|
|
46
|
-
label = "",
|
|
47
|
-
disabled = false,
|
|
48
|
-
...rest
|
|
49
|
-
}: Props = $props();
|
|
50
|
-
|
|
51
|
-
const sizes: Record<SizeKey, { diameter: number; stroke: number }> = {
|
|
52
|
-
xs: { diameter: 40, stroke: 4 },
|
|
53
|
-
sm: { diameter: 48, stroke: 5 },
|
|
54
|
-
md: { diameter: 56, stroke: 6 },
|
|
55
|
-
lg: { diameter: 64, stroke: 7 },
|
|
56
|
-
xl: { diameter: 72, stroke: 8 },
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
const pctValue = $derived(clamp(value, 0, 100));
|
|
60
|
-
const pctText = $derived(Math.round(pctValue));
|
|
61
|
-
|
|
62
|
-
const geometry = $derived(sizes[sz]);
|
|
63
|
-
const center = $derived(geometry.diameter / 2);
|
|
64
|
-
const radius = $derived(center - geometry.stroke / 2);
|
|
65
|
-
const circumference = $derived(2 * Math.PI * radius);
|
|
66
|
-
|
|
67
|
-
const dashOffset = $derived(((100 - pctValue) / 100) * circumference);
|
|
68
|
-
const dashArray = $derived(`${circumference} ${circumference}`);
|
|
69
|
-
const indeterminateDash = $derived(`${circumference * 0.3} ${circumference}`);
|
|
70
|
-
|
|
71
|
-
const strokeColor = $derived(
|
|
72
|
-
variant === "neutral"
|
|
73
|
-
? "stroke-[var(--color-bg-secondary)]"
|
|
74
|
-
: "stroke-[var(--color-bg-primary)]"
|
|
75
|
-
);
|
|
76
|
-
|
|
77
|
-
const rootClass = $derived(
|
|
78
|
-
cx(
|
|
79
|
-
"inline-flex flex-col items-center gap-1 data-[disabled=true]:opacity-[var(--opacity-disabled)] data-[disabled=true]:cursor-not-allowed",
|
|
80
|
-
externalClass
|
|
81
|
-
)
|
|
82
|
-
);
|
|
83
|
-
</script>
|
|
84
|
-
|
|
85
|
-
<div
|
|
86
|
-
class={rootClass}
|
|
87
|
-
role="progressbar"
|
|
88
|
-
aria-valuemin="0"
|
|
89
|
-
aria-valuemax="100"
|
|
90
|
-
aria-valuenow={indeterminate ? undefined : pctText}
|
|
91
|
-
data-disabled={disabled ? "true" : undefined}
|
|
92
|
-
{...rest}
|
|
93
|
-
>
|
|
94
|
-
{#if label}
|
|
95
|
-
<span class={cx("text-[var(--color-text-muted)] select-none", TEXT[sz])}>
|
|
96
|
-
{label}
|
|
97
|
-
</span>
|
|
98
|
-
{/if}
|
|
99
|
-
|
|
100
|
-
<div
|
|
101
|
-
class="relative inline-flex items-center justify-center"
|
|
102
|
-
style={`width:${geometry.diameter}px;height:${geometry.diameter}px;`}
|
|
103
|
-
>
|
|
104
|
-
<svg
|
|
105
|
-
class="pc-svg"
|
|
106
|
-
viewBox={`0 0 ${geometry.diameter} ${geometry.diameter}`}
|
|
107
|
-
role="presentation"
|
|
108
|
-
aria-hidden="true"
|
|
109
|
-
>
|
|
110
|
-
<g class="pc-rot">
|
|
111
|
-
<circle
|
|
112
|
-
class="pc-track"
|
|
113
|
-
cx={center}
|
|
114
|
-
cy={center}
|
|
115
|
-
r={radius}
|
|
116
|
-
stroke-width={geometry.stroke}
|
|
117
|
-
></circle>
|
|
118
|
-
|
|
119
|
-
{#if indeterminate}
|
|
120
|
-
<circle
|
|
121
|
-
class={cx("pc-bar pc-indet", strokeColor)}
|
|
122
|
-
cx={center}
|
|
123
|
-
cy={center}
|
|
124
|
-
r={radius}
|
|
125
|
-
stroke-width={geometry.stroke}
|
|
126
|
-
stroke-dasharray={indeterminateDash}
|
|
127
|
-
></circle>
|
|
128
|
-
{:else}
|
|
129
|
-
<circle
|
|
130
|
-
class={cx("pc-bar", strokeColor)}
|
|
131
|
-
cx={center}
|
|
132
|
-
cy={center}
|
|
133
|
-
r={radius}
|
|
134
|
-
stroke-width={geometry.stroke}
|
|
135
|
-
stroke-dasharray={dashArray}
|
|
136
|
-
stroke-dashoffset={dashOffset}
|
|
137
|
-
></circle>
|
|
138
|
-
{/if}
|
|
139
|
-
</g>
|
|
140
|
-
</svg>
|
|
141
|
-
|
|
142
|
-
{#if !indeterminate}
|
|
143
|
-
<div
|
|
144
|
-
class={cx(
|
|
145
|
-
"absolute inset-0 flex items-center justify-center text-[var(--color-text-muted)] font-medium select-none",
|
|
146
|
-
TEXT[sz]
|
|
147
|
-
)}
|
|
148
|
-
>
|
|
149
|
-
{pctText}%
|
|
150
|
-
</div>
|
|
151
|
-
{/if}
|
|
152
|
-
</div>
|
|
153
|
-
</div>
|
|
154
|
-
|
|
155
|
-
<style>
|
|
156
|
-
.pc-svg {
|
|
157
|
-
width: 100%;
|
|
158
|
-
height: 100%;
|
|
159
|
-
}
|
|
160
|
-
.pc-rot {
|
|
161
|
-
transform: rotate(-90deg);
|
|
162
|
-
transform-origin: center;
|
|
163
|
-
}
|
|
164
|
-
.pc-track {
|
|
165
|
-
fill: none;
|
|
166
|
-
stroke: var(--border-color-default);
|
|
167
|
-
}
|
|
168
|
-
.pc-bar {
|
|
169
|
-
fill: none;
|
|
170
|
-
stroke-linecap: round;
|
|
171
|
-
transition:
|
|
172
|
-
stroke-dashoffset 0.25s ease,
|
|
173
|
-
stroke 0.2s ease;
|
|
174
|
-
transform-origin: center;
|
|
175
|
-
}
|
|
176
|
-
.pc-indet {
|
|
177
|
-
animation: pc-spin 1.2s linear infinite;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
:global {
|
|
181
|
-
@keyframes pc-spin {
|
|
182
|
-
0% {
|
|
183
|
-
transform: rotate(0deg);
|
|
184
|
-
}
|
|
185
|
-
100% {
|
|
186
|
-
transform: rotate(360deg);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
</style>
|
|
1
|
+
<!-- src/lib/ProgressCircle.svelte -->
|
|
2
|
+
<script lang="ts">
|
|
3
|
+
/**
|
|
4
|
+
* @component ProgressCircle
|
|
5
|
+
* @description Circular progress indicator for visualizing completion or load state (0-100). Supports indeterminate mode.
|
|
6
|
+
* @prop value {number} - Current progress value
|
|
7
|
+
* @default 0
|
|
8
|
+
* @prop indeterminate {boolean} - Enables spinning infinite mode
|
|
9
|
+
* @default false
|
|
10
|
+
* @prop sz {SizeKey} - Size preset (xs|sm|md|lg|xl)
|
|
11
|
+
* @default md
|
|
12
|
+
* @prop variant {ComponentVariant} - Color/style variant
|
|
13
|
+
* @options default|neutral
|
|
14
|
+
* @default default
|
|
15
|
+
* @prop label {string} - Optional text shown above the circle
|
|
16
|
+
* @default ""
|
|
17
|
+
* @prop disabled {boolean} - Apply disabled styles
|
|
18
|
+
* @default false
|
|
19
|
+
* @prop class {string} - Extra wrapper classes
|
|
20
|
+
* @default ""
|
|
21
|
+
* @note Clamps value between 0-100
|
|
22
|
+
* @note Uses SVG stroke-dashoffset animation
|
|
23
|
+
* @note Accessible role=progressbar with aria-valuenow
|
|
24
|
+
* @note Works in both determinate/indeterminate modes
|
|
25
|
+
*/
|
|
26
|
+
import type { HTMLAttributes } from "svelte/elements";
|
|
27
|
+
import { type SizeKey, type ComponentVariant, TEXT } from "./types";
|
|
28
|
+
import { cx, clamp } from "../utils";
|
|
29
|
+
|
|
30
|
+
type Props = HTMLAttributes<HTMLDivElement> & {
|
|
31
|
+
value?: number;
|
|
32
|
+
indeterminate?: boolean;
|
|
33
|
+
sz?: SizeKey;
|
|
34
|
+
variant?: ComponentVariant;
|
|
35
|
+
class?: string;
|
|
36
|
+
label?: string;
|
|
37
|
+
disabled?: boolean;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
let {
|
|
41
|
+
value = 0,
|
|
42
|
+
indeterminate = false,
|
|
43
|
+
sz = "md",
|
|
44
|
+
variant = "default",
|
|
45
|
+
class: externalClass = "",
|
|
46
|
+
label = "",
|
|
47
|
+
disabled = false,
|
|
48
|
+
...rest
|
|
49
|
+
}: Props = $props();
|
|
50
|
+
|
|
51
|
+
const sizes: Record<SizeKey, { diameter: number; stroke: number }> = {
|
|
52
|
+
xs: { diameter: 40, stroke: 4 },
|
|
53
|
+
sm: { diameter: 48, stroke: 5 },
|
|
54
|
+
md: { diameter: 56, stroke: 6 },
|
|
55
|
+
lg: { diameter: 64, stroke: 7 },
|
|
56
|
+
xl: { diameter: 72, stroke: 8 },
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const pctValue = $derived(clamp(value, 0, 100));
|
|
60
|
+
const pctText = $derived(Math.round(pctValue));
|
|
61
|
+
|
|
62
|
+
const geometry = $derived(sizes[sz]);
|
|
63
|
+
const center = $derived(geometry.diameter / 2);
|
|
64
|
+
const radius = $derived(center - geometry.stroke / 2);
|
|
65
|
+
const circumference = $derived(2 * Math.PI * radius);
|
|
66
|
+
|
|
67
|
+
const dashOffset = $derived(((100 - pctValue) / 100) * circumference);
|
|
68
|
+
const dashArray = $derived(`${circumference} ${circumference}`);
|
|
69
|
+
const indeterminateDash = $derived(`${circumference * 0.3} ${circumference}`);
|
|
70
|
+
|
|
71
|
+
const strokeColor = $derived(
|
|
72
|
+
variant === "neutral"
|
|
73
|
+
? "stroke-[var(--color-bg-secondary)]"
|
|
74
|
+
: "stroke-[var(--color-bg-primary)]"
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
const rootClass = $derived(
|
|
78
|
+
cx(
|
|
79
|
+
"inline-flex flex-col items-center gap-1 data-[disabled=true]:opacity-[var(--opacity-disabled)] data-[disabled=true]:cursor-not-allowed",
|
|
80
|
+
externalClass
|
|
81
|
+
)
|
|
82
|
+
);
|
|
83
|
+
</script>
|
|
84
|
+
|
|
85
|
+
<div
|
|
86
|
+
class={rootClass}
|
|
87
|
+
role="progressbar"
|
|
88
|
+
aria-valuemin="0"
|
|
89
|
+
aria-valuemax="100"
|
|
90
|
+
aria-valuenow={indeterminate ? undefined : pctText}
|
|
91
|
+
data-disabled={disabled ? "true" : undefined}
|
|
92
|
+
{...rest}
|
|
93
|
+
>
|
|
94
|
+
{#if label}
|
|
95
|
+
<span class={cx("text-[var(--color-text-muted)] select-none", TEXT[sz])}>
|
|
96
|
+
{label}
|
|
97
|
+
</span>
|
|
98
|
+
{/if}
|
|
99
|
+
|
|
100
|
+
<div
|
|
101
|
+
class="relative inline-flex items-center justify-center"
|
|
102
|
+
style={`width:${geometry.diameter}px;height:${geometry.diameter}px;`}
|
|
103
|
+
>
|
|
104
|
+
<svg
|
|
105
|
+
class="pc-svg"
|
|
106
|
+
viewBox={`0 0 ${geometry.diameter} ${geometry.diameter}`}
|
|
107
|
+
role="presentation"
|
|
108
|
+
aria-hidden="true"
|
|
109
|
+
>
|
|
110
|
+
<g class="pc-rot">
|
|
111
|
+
<circle
|
|
112
|
+
class="pc-track"
|
|
113
|
+
cx={center}
|
|
114
|
+
cy={center}
|
|
115
|
+
r={radius}
|
|
116
|
+
stroke-width={geometry.stroke}
|
|
117
|
+
></circle>
|
|
118
|
+
|
|
119
|
+
{#if indeterminate}
|
|
120
|
+
<circle
|
|
121
|
+
class={cx("pc-bar pc-indet", strokeColor)}
|
|
122
|
+
cx={center}
|
|
123
|
+
cy={center}
|
|
124
|
+
r={radius}
|
|
125
|
+
stroke-width={geometry.stroke}
|
|
126
|
+
stroke-dasharray={indeterminateDash}
|
|
127
|
+
></circle>
|
|
128
|
+
{:else}
|
|
129
|
+
<circle
|
|
130
|
+
class={cx("pc-bar", strokeColor)}
|
|
131
|
+
cx={center}
|
|
132
|
+
cy={center}
|
|
133
|
+
r={radius}
|
|
134
|
+
stroke-width={geometry.stroke}
|
|
135
|
+
stroke-dasharray={dashArray}
|
|
136
|
+
stroke-dashoffset={dashOffset}
|
|
137
|
+
></circle>
|
|
138
|
+
{/if}
|
|
139
|
+
</g>
|
|
140
|
+
</svg>
|
|
141
|
+
|
|
142
|
+
{#if !indeterminate}
|
|
143
|
+
<div
|
|
144
|
+
class={cx(
|
|
145
|
+
"absolute inset-0 flex items-center justify-center text-[var(--color-text-muted)] font-medium select-none",
|
|
146
|
+
TEXT[sz]
|
|
147
|
+
)}
|
|
148
|
+
>
|
|
149
|
+
{pctText}%
|
|
150
|
+
</div>
|
|
151
|
+
{/if}
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
|
|
155
|
+
<style>
|
|
156
|
+
.pc-svg {
|
|
157
|
+
width: 100%;
|
|
158
|
+
height: 100%;
|
|
159
|
+
}
|
|
160
|
+
.pc-rot {
|
|
161
|
+
transform: rotate(-90deg);
|
|
162
|
+
transform-origin: center;
|
|
163
|
+
}
|
|
164
|
+
.pc-track {
|
|
165
|
+
fill: none;
|
|
166
|
+
stroke: var(--border-color-default);
|
|
167
|
+
}
|
|
168
|
+
.pc-bar {
|
|
169
|
+
fill: none;
|
|
170
|
+
stroke-linecap: round;
|
|
171
|
+
transition:
|
|
172
|
+
stroke-dashoffset 0.25s ease,
|
|
173
|
+
stroke 0.2s ease;
|
|
174
|
+
transform-origin: center;
|
|
175
|
+
}
|
|
176
|
+
.pc-indet {
|
|
177
|
+
animation: pc-spin 1.2s linear infinite;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
:global {
|
|
181
|
+
@keyframes pc-spin {
|
|
182
|
+
0% {
|
|
183
|
+
transform: rotate(0deg);
|
|
184
|
+
}
|
|
185
|
+
100% {
|
|
186
|
+
transform: rotate(360deg);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
</style>
|