@makolabs/ripple 0.0.1-dev.15 → 0.0.1-dev.16
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.
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cn } from '../../helper/cls.js';
|
|
3
|
+
import { Color, Size } from '../../variants.js';
|
|
4
|
+
import type { DividedProgressProps, VariantColors } from '../../index.js';
|
|
5
|
+
|
|
6
|
+
let {
|
|
7
|
+
segments,
|
|
8
|
+
max = 100,
|
|
9
|
+
size = Size.BASE,
|
|
10
|
+
showLabels = false,
|
|
11
|
+
showValues = true,
|
|
12
|
+
class: className = '',
|
|
13
|
+
barClass = '',
|
|
14
|
+
labelClass = ''
|
|
15
|
+
}: DividedProgressProps = $props();
|
|
16
|
+
|
|
17
|
+
// Calculate total value of all segments
|
|
18
|
+
const totalValue = $derived(segments.reduce((sum, segment) => sum + segment.value, 0));
|
|
19
|
+
|
|
20
|
+
// Calculate percentages for each segment
|
|
21
|
+
const segmentPercentages = $derived(
|
|
22
|
+
segments.map(segment => ({
|
|
23
|
+
...segment,
|
|
24
|
+
percentage: Math.min(Math.round((segment.value / max) * 100), 100)
|
|
25
|
+
}))
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
const containerClass = $derived(
|
|
29
|
+
cn('relative w-full', className)
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
const progressClass = $derived(
|
|
33
|
+
cn('w-full rounded-full bg-gray-200 flex overflow-hidden', {
|
|
34
|
+
'h-1.5': size === Size.XS,
|
|
35
|
+
'h-2': size === Size.SM,
|
|
36
|
+
'h-2.5': size === Size.BASE,
|
|
37
|
+
'h-3': size === Size.LG,
|
|
38
|
+
'h-4': size === Size.XL
|
|
39
|
+
})
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
const getColorClass = (color: VariantColors) => {
|
|
43
|
+
switch (color) {
|
|
44
|
+
case Color.PRIMARY:
|
|
45
|
+
return 'bg-primary-600';
|
|
46
|
+
case Color.SECONDARY:
|
|
47
|
+
return 'bg-secondary-600';
|
|
48
|
+
case Color.SUCCESS:
|
|
49
|
+
return 'bg-success-600';
|
|
50
|
+
case Color.DANGER:
|
|
51
|
+
return 'bg-danger-600';
|
|
52
|
+
case Color.WARNING:
|
|
53
|
+
return 'bg-warning-600';
|
|
54
|
+
case Color.INFO:
|
|
55
|
+
return 'bg-info-600';
|
|
56
|
+
case Color.DEFAULT:
|
|
57
|
+
return 'bg-gray-600';
|
|
58
|
+
default:
|
|
59
|
+
return 'bg-primary-600';
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const labelTextClass = $derived(
|
|
64
|
+
cn(
|
|
65
|
+
'text-gray-500 mt-1',
|
|
66
|
+
{
|
|
67
|
+
'text-xs': size === Size.XS || size === Size.SM,
|
|
68
|
+
'text-sm': size === Size.BASE,
|
|
69
|
+
'text-base': size === Size.LG || size === Size.XL
|
|
70
|
+
},
|
|
71
|
+
labelClass
|
|
72
|
+
)
|
|
73
|
+
);
|
|
74
|
+
</script>
|
|
75
|
+
|
|
76
|
+
<div class={containerClass}>
|
|
77
|
+
<div
|
|
78
|
+
class={progressClass}
|
|
79
|
+
role="progressbar"
|
|
80
|
+
aria-valuenow={totalValue}
|
|
81
|
+
aria-valuemin="0"
|
|
82
|
+
aria-valuemax={max}
|
|
83
|
+
>
|
|
84
|
+
{#each segmentPercentages as segment, i}
|
|
85
|
+
{#if segment.percentage > 0}
|
|
86
|
+
<div
|
|
87
|
+
class={cn(getColorClass(segment.color), barClass)}
|
|
88
|
+
style="width: {segment.percentage}%"
|
|
89
|
+
title={segment.label || `${segment.value} (${segment.percentage}%)`}
|
|
90
|
+
></div>
|
|
91
|
+
{/if}
|
|
92
|
+
{/each}
|
|
93
|
+
</div>
|
|
94
|
+
|
|
95
|
+
{#if showLabels || showValues}
|
|
96
|
+
<div class="flex justify-between mt-1">
|
|
97
|
+
{#each segmentPercentages as segment, i}
|
|
98
|
+
{#if segment.percentage > 0}
|
|
99
|
+
<div class={labelTextClass}>
|
|
100
|
+
{#if showLabels && segment.label}
|
|
101
|
+
{segment.label}
|
|
102
|
+
{/if}
|
|
103
|
+
{#if showValues}
|
|
104
|
+
{#if showLabels && segment.label} ({/if}
|
|
105
|
+
{segment.percentage}%
|
|
106
|
+
{#if showLabels && segment.label}){/if}
|
|
107
|
+
{/if}
|
|
108
|
+
</div>
|
|
109
|
+
{/if}
|
|
110
|
+
{/each}
|
|
111
|
+
</div>
|
|
112
|
+
{/if}
|
|
113
|
+
</div>
|
package/dist/index.d.ts
CHANGED
|
@@ -711,7 +711,23 @@ export type ProgressProps = {
|
|
|
711
711
|
labelClass?: string;
|
|
712
712
|
barClass?: string;
|
|
713
713
|
};
|
|
714
|
+
export type ProgressSegment = {
|
|
715
|
+
value: number;
|
|
716
|
+
color: VariantColors;
|
|
717
|
+
label?: string;
|
|
718
|
+
};
|
|
719
|
+
export type DividedProgressProps = {
|
|
720
|
+
segments: ProgressSegment[];
|
|
721
|
+
max?: number;
|
|
722
|
+
size?: VariantSizes;
|
|
723
|
+
showLabels?: boolean;
|
|
724
|
+
showValues?: boolean;
|
|
725
|
+
class?: string;
|
|
726
|
+
barClass?: string;
|
|
727
|
+
labelClass?: string;
|
|
728
|
+
};
|
|
714
729
|
export { default as Progress } from './elements/progress/Progress.svelte';
|
|
730
|
+
export { default as DividedProgress } from './elements/progress/DividedProgress.svelte';
|
|
715
731
|
export interface TimelineItem {
|
|
716
732
|
title: string;
|
|
717
733
|
time: Date | string;
|
package/dist/index.js
CHANGED
|
@@ -62,4 +62,5 @@ export { default as DateRange } from './forms/DateRange.svelte';
|
|
|
62
62
|
export { default as Tags } from './forms/Tags.svelte';
|
|
63
63
|
export { default as RadioPill } from './forms/RadioPill.svelte';
|
|
64
64
|
export { default as Progress } from './elements/progress/Progress.svelte';
|
|
65
|
+
export { default as DividedProgress } from './elements/progress/DividedProgress.svelte';
|
|
65
66
|
export { default as Timeline } from './elements/timeline/Timeline.svelte';
|