@makolabs/ripple 0.0.1-dev.65 → 0.0.1-dev.66

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/dist/index.d.ts CHANGED
@@ -177,6 +177,20 @@ export type StatsCardProps = {
177
177
  class?: ClassValue;
178
178
  formatLargeNumbers?: boolean;
179
179
  };
180
+ export type MetricDetail = {
181
+ label: string;
182
+ value: string | number;
183
+ color?: string;
184
+ };
185
+ export type MetricCardProps = {
186
+ title: string;
187
+ value: string | number;
188
+ details?: MetricDetail[];
189
+ percent?: number;
190
+ primaryColor?: string;
191
+ secondaryColor?: string;
192
+ class?: ClassValue;
193
+ };
180
194
  export type DataRow = Record<string, any>;
181
195
  export type KeyType = keyof DataRow;
182
196
  export type StatusType = 'active' | 'inactive' | 'pending' | 'error' | 'default';
@@ -341,6 +355,7 @@ export { default as Dropdown } from './elements/dropdown/Dropdown.svelte';
341
355
  export { default as Select } from './elements/dropdown/Select.svelte';
342
356
  export { default as Card } from './layout/card/Card.svelte';
343
357
  export { default as StatsCard } from './layout/card/StatsCard.svelte';
358
+ export { default as MetricCard } from './layout/card/MetricCard.svelte';
344
359
  export { default as Alert } from './elements/alert/Alert.svelte';
345
360
  export type TabProps = {
346
361
  value: string;
@@ -388,6 +403,7 @@ export { modal } from './modal/modal.js';
388
403
  export { drawer } from './drawer/drawer.js';
389
404
  export { selectTV } from './elements/dropdown/select.js';
390
405
  export { breadcrumbs } from './header/breadcrumbs.js';
406
+ export { metricCard } from './layout/card/metric-card.js';
391
407
  export type ChartColorKey = keyof typeof ChartColor;
392
408
  export type ChartColorValue = typeof ChartColor[ChartColorKey];
393
409
  export type ChartColors = {
package/dist/index.js CHANGED
@@ -28,6 +28,7 @@ export { default as Select } from './elements/dropdown/Select.svelte';
28
28
  // Elements - Card
29
29
  export { default as Card } from './layout/card/Card.svelte';
30
30
  export { default as StatsCard } from './layout/card/StatsCard.svelte';
31
+ export { default as MetricCard } from './layout/card/MetricCard.svelte';
31
32
  // Elements - Alert
32
33
  export { default as Alert } from './elements/alert/Alert.svelte';
33
34
  export { default as Tab } from './layout/tabs/Tab.svelte';
@@ -50,6 +51,7 @@ export { modal } from './modal/modal.js';
50
51
  export { drawer } from './drawer/drawer.js';
51
52
  export { selectTV } from './elements/dropdown/select.js';
52
53
  export { breadcrumbs } from './header/breadcrumbs.js';
54
+ export { metricCard } from './layout/card/metric-card.js';
53
55
  export { default as Chart } from './charts/Chart.svelte';
54
56
  export { default as FileUpload } from './elements/file-upload/FileUpload.svelte';
55
57
  export { default as FilesPreview } from './elements/file-upload/FilesPreview.svelte';
@@ -0,0 +1,59 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../helper/cls.js';
3
+ import { metricCard } from './metric-card.js';
4
+ import type { MetricCardProps } from '../../index.js';
5
+
6
+ let {
7
+ title,
8
+ value,
9
+ details = [],
10
+ percent,
11
+ primaryColor = 'text-green-700',
12
+ secondaryColor = 'text-red-600',
13
+ class: className = ''
14
+ }: MetricCardProps = $props();
15
+
16
+ // Get the first two details for the breakdown display
17
+ const primaryDetail = $derived(details[0]);
18
+ const secondaryDetail = $derived(details[1]);
19
+
20
+ const { base, title: titleSlot, value: valueSlot, detail: detailSlot, progress: progressSlot } = $derived(
21
+ metricCard()
22
+ );
23
+
24
+ const baseClasses = $derived(cn(base(), className));
25
+ </script>
26
+
27
+ <div class={baseClasses}>
28
+ <div class={titleSlot()}>{title}</div>
29
+ <div class={valueSlot()}>
30
+ {typeof value === 'number' ? value.toLocaleString('de-DE') : value}
31
+ </div>
32
+
33
+ {#if primaryDetail}
34
+ <div class={cn(detailSlot(), primaryColor)}>
35
+ <span>{primaryDetail.label}</span>
36
+ <span class="font-medium">
37
+ {primaryDetail.value}
38
+ </span>
39
+ </div>
40
+ {/if}
41
+
42
+ {#if secondaryDetail}
43
+ <div class={cn(detailSlot(), secondaryColor)}>
44
+ <span>{secondaryDetail.label}</span>
45
+ <span class="font-medium">
46
+ {secondaryDetail.value}
47
+ </span>
48
+ </div>
49
+ {/if}
50
+
51
+ {#if percent !== undefined}
52
+ <div class={progressSlot()}>
53
+ <div
54
+ class="h-2 rounded-full bg-green-500"
55
+ style="width: {Math.min(100, percent)}%"
56
+ ></div>
57
+ </div>
58
+ {/if}
59
+ </div>
@@ -0,0 +1,4 @@
1
+ import type { MetricCardProps } from '../../index.js';
2
+ declare const MetricCard: import("svelte").Component<MetricCardProps, {}, "">;
3
+ type MetricCard = ReturnType<typeof MetricCard>;
4
+ export default MetricCard;
@@ -0,0 +1,49 @@
1
+ export declare const metricCard: import("tailwind-variants").TVReturnType<{
2
+ [key: string]: {
3
+ [key: string]: import("tailwind-merge").ClassNameValue | {
4
+ base?: import("tailwind-merge").ClassNameValue;
5
+ value?: import("tailwind-merge").ClassNameValue;
6
+ title?: import("tailwind-merge").ClassNameValue;
7
+ progress?: import("tailwind-merge").ClassNameValue;
8
+ detail?: import("tailwind-merge").ClassNameValue;
9
+ };
10
+ };
11
+ } | {
12
+ [x: string]: {
13
+ [x: string]: import("tailwind-merge").ClassNameValue | {
14
+ base?: import("tailwind-merge").ClassNameValue;
15
+ value?: import("tailwind-merge").ClassNameValue;
16
+ title?: import("tailwind-merge").ClassNameValue;
17
+ progress?: import("tailwind-merge").ClassNameValue;
18
+ detail?: import("tailwind-merge").ClassNameValue;
19
+ };
20
+ };
21
+ } | {}, {
22
+ base: string;
23
+ title: string;
24
+ value: string;
25
+ detail: string;
26
+ progress: string;
27
+ }, undefined, {
28
+ [key: string]: {
29
+ [key: string]: import("tailwind-merge").ClassNameValue | {
30
+ base?: import("tailwind-merge").ClassNameValue;
31
+ value?: import("tailwind-merge").ClassNameValue;
32
+ title?: import("tailwind-merge").ClassNameValue;
33
+ progress?: import("tailwind-merge").ClassNameValue;
34
+ detail?: import("tailwind-merge").ClassNameValue;
35
+ };
36
+ };
37
+ } | {}, {
38
+ base: string;
39
+ title: string;
40
+ value: string;
41
+ detail: string;
42
+ progress: string;
43
+ }, import("tailwind-variants").TVReturnType<unknown, {
44
+ base: string;
45
+ title: string;
46
+ value: string;
47
+ detail: string;
48
+ progress: string;
49
+ }, undefined, unknown, unknown, undefined>>;
@@ -0,0 +1,10 @@
1
+ import { tv } from 'tailwind-variants';
2
+ export const metricCard = tv({
3
+ slots: {
4
+ base: 'border-default-200 rounded-xl border bg-white p-6 shadow-sm',
5
+ title: 'text-default-500 text-sm',
6
+ value: 'text-default-900 mt-2 text-3xl font-bold',
7
+ detail: 'mt-2 flex justify-between text-xs',
8
+ progress: 'mt-2 h-2 w-full rounded-full bg-gray-200'
9
+ }
10
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@makolabs/ripple",
3
- "version": "0.0.1-dev.65",
3
+ "version": "0.0.1-dev.66",
4
4
  "description": "Simple Svelte 5 powered component library ✨",
5
5
  "repository": {
6
6
  "type": "git",