Skip to content

Commit 16fb867

Browse files
authored
feat: custom colors added to FwbProgress and FwbSpinner
2 parents 4fe5eca + a66a931 commit 16fb867

File tree

9 files changed

+95
-30
lines changed

9 files changed

+95
-30
lines changed

docs/components/progress.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script setup>
22
import FwbProgressExample from './progress/examples/FwbProgressExample.vue'
33
import FwbProgressExampleColor from './progress/examples/FwbProgressExampleColor.vue'
4+
import FwbProgressExampleCustom from './progress/examples/FwbProgressExampleCustom.vue'
45
import FwbProgressExampleLabelInside from './progress/examples/FwbProgressExampleLabelInside.vue'
56
import FwbProgressExampleLabelOutside from './progress/examples/FwbProgressExampleLabelOutside.vue'
67
import FwbProgressExampleSize from './progress/examples/FwbProgressExampleSize.vue'
@@ -101,3 +102,31 @@ You can also apply color.
101102
import { FwbProgress } from 'flowbite-vue'
102103
</script>
103104
```
105+
106+
## Custom
107+
You can fully customize the appearance of the progress bar using TailwindCSS utility classes via the following props:
108+
109+
| Prop | Description |
110+
|-----------------------|------------------------------------------------------------------|
111+
| `inner-classes` | Custom classes for the inner progress bar |
112+
| `outer-classes` | Custom classes for the outer progress bar container |
113+
| `outside-label-classes` | Custom classes for the label outside the progress bar |
114+
115+
These props allow you to override or extend the default styling for each part of the component, enabling advanced use cases such as gradients, custom colors, rounded corners, and more.
116+
117+
<fwb-progress-example-custom />
118+
```vue
119+
<template>
120+
<fwb-progress
121+
:progress="50"
122+
:inner-classes="'rounded-xs bg-teal-900 dark:bg-teal-200'"
123+
:outer-classes="'bg-teal-200 dark:bg-teal-900'"
124+
:outside-label-classes="'italic text-sky-800 dark:text-sky-200'"
125+
label="Custom"
126+
/>
127+
</template>
128+
129+
<script setup>
130+
import { FwbProgress } from 'flowbite-vue'
131+
</script>
132+
```
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<template>
2+
<fwb-progress
3+
:progress="50"
4+
:inner-classes="'rounded-xs bg-teal-900 dark:bg-teal-200'"
5+
:outer-classes="'bg-teal-200 dark:bg-teal-900'"
6+
:outside-label-classes="'italic text-sky-800 dark:text-sky-200'"
7+
label="Custom"
8+
/>
9+
</template>
10+
11+
<script lang="ts" setup>
12+
import { FwbProgress } from '../../../../src/index'
13+
</script>

docs/components/spinner.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ import { FwbSpinner } from 'flowbite-vue'
5959
<fwb-spinner color="red" />
6060
<fwb-spinner color="white" />
6161
<fwb-spinner color="yellow" />
62+
<fwb-spinner color="#3fb984" /> <!-- Custom color -->
6263
</template>
6364
6465
<script setup>
@@ -71,5 +72,5 @@ import { FwbSpinner } from 'flowbite-vue'
7172
### Props
7273
| Name | Values | Default |
7374
|-------|-----------------------------------------------------------------------------------------|---------|
74-
| color | `blue`, `gray`, `green`, `pink`, `purple`, `red`, `white`, `yellow` | `blue` |
75+
| color | `blue`, `gray`, `green`, `pink`, `purple`, `red`, `white`, `yellow`, any hex code | `blue` |
7576
| size | `0`, `0.5`, `1`, `1.5`, `10`, `11`, `12`, `2`, `2.5`, `3`, `4`, `5`, `6`, `7`, `8`, `9` | `4` |

docs/components/spinner/examples/FwbSpinnerExampleColor.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<fwb-spinner color="red" />
99
<fwb-spinner color="white" />
1010
<fwb-spinner color="yellow" />
11+
<fwb-spinner color="#3fb984" />
1112
</div>
1213
</template>
1314

src/components/FwbProgress/FwbProgress.vue

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,19 @@
44
<div class="mb-1 flex justify-between">
55
<span
66
:class="outsideLabelClasses"
7-
class="text-base font-medium"
87
>{{ label }}</span>
98
<span
109
v-if="labelProgress && labelPosition === 'outside'"
1110
:class="outsideLabelClasses"
12-
class="text-sm font-medium"
1311
>{{ progress }}%</span>
1412
</div>
1513
</template>
1614
<div
1715
:class="outerClasses"
18-
class="w-full rounded-full bg-gray-200 dark:bg-gray-700"
1916
>
2017
<div
2118
:class="innerClasses"
2219
:style="{ width: progress + '%' }"
23-
class="rounded-full p-0.5 text-center font-medium text-blue-100"
2420
>
2521
<template v-if="labelProgress && labelPosition === 'inside'">
2622
{{ progress }}%
@@ -44,6 +40,9 @@ interface IProgressProps {
4440
labelProgress?: boolean
4541
progress?: number
4642
size?: ProgressSize
43+
innerClasses?: string | Record<string, boolean>
44+
outerClasses?: string | Record<string, boolean>
45+
outsideLabelClasses?: string | Record<string, boolean>
4746
}
4847
4948
const props = withDefaults(defineProps<IProgressProps>(), {
@@ -53,6 +52,9 @@ const props = withDefaults(defineProps<IProgressProps>(), {
5352
labelProgress: false,
5453
progress: 0,
5554
size: 'md',
55+
innerClasses: '',
56+
outerClasses: '',
57+
outsideLabelClasses: '',
5658
})
5759
5860
const {

src/components/FwbProgress/composables/useProgressClasses.ts

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1-
import classNames from 'classnames'
21
import { computed, type Ref } from 'vue'
32

43
import type { ProgressLabelPosition, ProgressSize, ProgressVariant } from '../types'
54

5+
import { useMergeClasses } from '@/composables/useMergeClasses'
6+
7+
const defaultInnerClasses = 'rounded-full p-0.5 text-center font-medium text-blue-100'
8+
const defaultOuterClasses = 'w-full rounded-full bg-gray-200 dark:bg-gray-700'
9+
const defaultOutsideLabelClasses = 'text-base font-medium'
10+
611
const barColorClasses: Record<ProgressVariant, string> = {
712
default: 'bg-blue-600 dark:bg-blue-600',
813
blue: 'bg-blue-600 dark:bg-blue-600',
@@ -36,28 +41,37 @@ export type UseProgressClassesProps = {
3641
color: Ref<ProgressVariant>
3742
size: Ref<ProgressSize>
3843
labelPosition: Ref<ProgressLabelPosition>
44+
innerClasses?: Ref<string | Record<string, boolean>>
45+
outerClasses?: Ref<string | Record<string, boolean>>
46+
outsideLabelClasses?: Ref<string | Record<string, boolean>>
3947
}
4048

41-
export function useProgressClasses (props: UseProgressClassesProps): { innerClasses: Ref<string>, outerClasses: Ref<string>, outsideLabelClasses: Ref<string> } {
42-
const bindClasses = computed(() => {
43-
return classNames(
44-
barColorClasses[props.color.value],
45-
progressSizeClasses[props.size.value],
46-
)
47-
})
48-
const outerClasses = computed(() => {
49-
return classNames(
50-
progressSizeClasses[props.size.value],
51-
)
52-
})
53-
const outsideLabelClasses = computed(() => {
54-
return classNames(
55-
outsideTextColorClasses[props.color.value],
56-
)
57-
})
49+
export function useProgressClasses (props: UseProgressClassesProps): {
50+
innerClasses: Ref<string>
51+
outerClasses: Ref<string>
52+
outsideLabelClasses: Ref<string>
53+
} {
54+
const innerClasses = computed(() => useMergeClasses([
55+
defaultInnerClasses,
56+
barColorClasses[props.color.value],
57+
progressSizeClasses[props.size.value],
58+
props.innerClasses?.value || '',
59+
]))
60+
61+
const outerClasses = computed(() => useMergeClasses([
62+
defaultOuterClasses,
63+
progressSizeClasses[props.size.value],
64+
props.outerClasses?.value || '',
65+
]))
66+
67+
const outsideLabelClasses = computed(() => useMergeClasses([
68+
defaultOutsideLabelClasses,
69+
outsideTextColorClasses[props.color.value],
70+
props.outsideLabelClasses?.value || '',
71+
]))
5872

5973
return {
60-
innerClasses: bindClasses,
74+
innerClasses,
6175
outerClasses,
6276
outsideLabelClasses,
6377
}

src/components/FwbSpinner/FwbSpinner.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<template>
22
<svg
33
:class="spinnerClasses"
4+
:style="customColor ? { '--custom-fill': customColor } : {}"
45
fill="none"
56
role="status"
67
viewBox="0 0 100 101"
@@ -12,7 +13,7 @@
1213
/>
1314
<path
1415
d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z"
15-
fill="currentFill"
16+
:fill="customColor || 'currentFill'"
1617
/>
1718
</svg>
1819
</template>
@@ -34,5 +35,5 @@ const props = withDefaults(defineProps<ISpinnerProps>(), {
3435
size: '4',
3536
})
3637
37-
const { spinnerClasses } = useSpinnerClasses(toRefs(props))
38+
const { spinnerClasses, customColor } = useSpinnerClasses(toRefs(props))
3839
</script>

src/components/FwbSpinner/composables/useSpinnerClasses.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,12 @@ export type UseSpinnerClassesProps = {
3838
size: Ref<SpinnerSize>
3939
}
4040

41-
export function useSpinnerClasses (props: UseSpinnerClassesProps): { spinnerClasses: Ref<string> } {
41+
export function useSpinnerClasses (props: UseSpinnerClassesProps): { spinnerClasses: Ref<string>, customColor: Ref<string | null> } {
4242
const sizeClasses = computed(() => sizes[props.size.value])
43-
const colorClasses = computed(() => colors[props.color.value])
43+
44+
const colorClasses = computed(() => colors[props.color.value as SpinnerColor] ?? '')
45+
const customColor = computed(() => colorClasses.value ? null : (props.color.value as string))
46+
4447
const bgColorClasses = computed(() => 'text-gray-200 dark:text-gray-600')
4548
const animateClasses = computed(() => 'animate-spin')
4649
const spinnerClasses = computed(() => classNames(
@@ -50,5 +53,5 @@ export function useSpinnerClasses (props: UseSpinnerClassesProps): { spinnerClas
5053
sizeClasses.value,
5154
))
5255

53-
return { spinnerClasses }
56+
return { spinnerClasses, customColor }
5457
}

src/components/FwbSpinner/types.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1-
export type SpinnerColor = 'blue' | 'gray' | 'green' | 'red' | 'yellow' | 'pink' | 'purple' | 'white'
1+
type CustomColor = (`#${string}` & {})
2+
export type SpinnerColor = 'blue' | 'gray' | 'green' | 'red' | 'yellow' | 'pink' | 'purple' | 'white' | CustomColor
23

34
export type SpinnerSize = '0' | '0.5' | '1' | '1.5' | '2' | '2.5' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11' | '12'

0 commit comments

Comments
 (0)