@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>
@@ -0,0 +1,4 @@
1
+ import type { DividedProgressProps } from '../../index.js';
2
+ declare const DividedProgress: import("svelte").Component<DividedProgressProps, {}, "">;
3
+ type DividedProgress = ReturnType<typeof DividedProgress>;
4
+ export default DividedProgress;
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';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@makolabs/ripple",
3
- "version": "0.0.1-dev.15",
3
+ "version": "0.0.1-dev.16",
4
4
  "description": "Simple Svelte 5 powered component library ✨",
5
5
  "repository": {
6
6
  "type": "git",