Skip to content

Commit e2f6e3f

Browse files
committed
fix(panel): refactor and fix background progress transition
1 parent 1ea6dfc commit e2f6e3f

File tree

5 files changed

+54
-24
lines changed

5 files changed

+54
-24
lines changed

src/components/container/ContainerComponent.ce.vue

+4-1
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ import {
99
NNotificationProvider,
1010
} from 'naive-ui';
1111
12-
import { computed, ref } from 'vue';
12+
import { computed, onBeforeMount, ref } from 'vue';
1313
1414
import LoadingBarProvider from '~/components/container/LoadingBarProvider.vue';
1515
import MessageProvider from '~/components/container/MessageProvider.vue';
1616
import NotificationProvider from '~/components/container/NotificationProvider.vue';
1717
import { NavbarService } from '~/services/navbar.service';
1818
import { lazyComponent } from '~/utils/lazy.utils';
19+
import { addCustomProgressProperty } from '~/utils/style.utils';
1920
2021
const AppComponent = lazyComponent(() => import('~/components/AppComponent.vue'));
2122
@@ -30,6 +31,8 @@ const { drawer } = NavbarService;
3031
const drawerOpen = NavbarService.open;
3132
3233
const root = ref<HTMLElement>();
34+
35+
onBeforeMount(() => addCustomProgressProperty());
3336
</script>
3437

3538
<template>

src/components/views/panel/PanelButtonProgress.vue

+14-13
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ const props = defineProps({
1717
type: Boolean,
1818
required: false,
1919
},
20+
disabled: {
21+
type: Boolean,
22+
required: false,
23+
},
2024
percentage: {
2125
type: Number,
2226
required: false,
@@ -43,7 +47,6 @@ const percentageLabel = computed(() => {
4347

4448
<template>
4549
<div
46-
ref="root"
4750
class="container"
4851
:data-progress="percentage"
4952
:style="{
@@ -66,7 +69,7 @@ const percentageLabel = computed(() => {
6669
:class="{ filled, progress }"
6770
round
6871
:secondary="!filled"
69-
:disabled="loading"
72+
:disabled="disabled"
7073
:loading="loading"
7174
:type="type"
7275
>
@@ -81,37 +84,35 @@ const percentageLabel = computed(() => {
8184
</template>
8285

8386
<style lang="scss" scoped>
87+
@use '~/styles/mixin' as mixin;
88+
8489
.container {
8590
i {
8691
margin-left: calc(0% - var(--n-icon-margin));
8792
}
8893
}
8994
9095
.button {
91-
background: linear-gradient(to right, var(--n-color) 0%, var(--n-color) 100%);
9296
transition:
9397
color 0.3s var(--n-bezier),
9498
background 0.3s var(--n-bezier),
9599
background-color 0.3s var(--n-bezier),
96100
opacity 0.3s var(--n-bezier),
97101
border-color 0.3s var(--n-bezier),
98-
filter 0.3s var(--n-bezier);
99-
will-change: color, background, background-color, opacity, border-color, filter;
102+
filter 0.3s var(--n-bezier),
103+
--progress 0.3s var(--n-bezier);
100104
101105
&:hover {
102-
background-color: unset;
103106
filter: brightness(1.2);
104107
}
105108
}
106109
110+
.filled:not(.progress) {
111+
background: linear-gradient(to right, var(--n-color) 0%, var(--n-color) 100%);
112+
}
113+
107114
.progress:not(.filled) {
108-
background: linear-gradient(
109-
to right,
110-
var(--progress-color) 0%,
111-
var(--progress-color) var(--progress, 0%),
112-
var(--n-color) var(--progress, 0%),
113-
var(--n-color) 100%
114-
);
115+
@include mixin.progress-background($rail: var(--n-color));
115116
}
116117
117118
.metric {

src/components/views/panel/PanelSelectProgress.vue

+9-10
Original file line numberDiff line numberDiff line change
@@ -182,35 +182,34 @@ const renderLabel = (option: SelectOption & { icon: Component }) => [
182182
</template>
183183

184184
<style scoped lang="scss">
185+
@use '~/styles/mixin' as mixin;
186+
185187
.button-progress-container {
186188
i {
187189
margin-left: calc(0% - var(--n-icon-margin));
188190
}
189191
190192
.button {
191-
background: linear-gradient(to right, var(--n-color) 0%, var(--n-color) 100%);
192193
transition:
193194
color 0.3s var(--n-bezier),
194195
background 0.3s var(--n-bezier),
195196
background-color 0.3s var(--n-bezier),
196197
opacity 0.3s var(--n-bezier),
197198
border-color 0.3s var(--n-bezier),
198-
filter 0.3s var(--n-bezier);
199-
will-change: color, background, background-color, opacity, border-color, filter;
199+
filter 0.3s var(--n-bezier),
200+
--progress 0.3s var(--n-bezier);
200201
201202
&:hover {
202203
filter: brightness(1.2);
203204
}
204205
}
205206
207+
.filled:not(.progress) {
208+
background: linear-gradient(to right, var(--n-color) 0%, var(--n-color) 100%);
209+
}
210+
206211
.progress:not(.filled) {
207-
background: linear-gradient(
208-
to right,
209-
var(--progress-color) 0%,
210-
var(--progress-color) var(--progress, 0%),
211-
var(--n-color) var(--progress, 0%),
212-
var(--n-color) 100%
213-
);
212+
@include mixin.progress-background($rail: var(--n-color));
214213
}
215214
}
216215

src/styles/mixin.scss

+14
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,17 @@
3333
background: $to;
3434
}
3535
}
36+
37+
@mixin progress-background(
38+
$color: var(--progress-color, var(--color-primary)),
39+
$rail: var(--rail-color, var(--color-primary-focus)),
40+
$progress: var(--progress, 0%),
41+
) {
42+
background: linear-gradient(
43+
to right,
44+
$color 0%,
45+
$color var(--progress, 0%),
46+
$rail $progress,
47+
$rail 100%
48+
);
49+
}

src/utils/style.utils.ts

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
export const addCustomProgressProperty = (progress = 0, throwOnError = false) => {
2+
try {
3+
window.CSS.registerProperty({
4+
name: '--progress',
5+
syntax: '<percentage>',
6+
inherits: true,
7+
initialValue: `${progress}%`,
8+
});
9+
} catch (error) {
10+
(throwOnError ? console.error : console.warn)('Failed to register custom CSS property: --progress', error);
11+
if (throwOnError) throw error;
12+
}
13+
};

0 commit comments

Comments
 (0)