@makolabs/ripple 0.0.1 → 0.0.3

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.
Files changed (144) hide show
  1. package/README.md +575 -8
  2. package/dist/adapters/storage/BaseAdapter.d.ts +20 -0
  3. package/dist/adapters/storage/BaseAdapter.js +171 -0
  4. package/dist/adapters/storage/S3Adapter.d.ts +21 -0
  5. package/dist/adapters/storage/S3Adapter.js +194 -0
  6. package/dist/adapters/storage/index.d.ts +3 -0
  7. package/dist/adapters/storage/index.js +3 -0
  8. package/dist/adapters/storage/types.d.ts +102 -0
  9. package/dist/adapters/storage/types.js +4 -0
  10. package/dist/button/Button.svelte +48 -0
  11. package/dist/button/Button.svelte.d.ts +4 -0
  12. package/dist/button/button.d.ts +113 -0
  13. package/dist/button/button.js +168 -0
  14. package/dist/charts/Chart.svelte +545 -0
  15. package/dist/charts/Chart.svelte.d.ts +4 -0
  16. package/dist/drawer/Drawer.svelte +224 -0
  17. package/dist/drawer/Drawer.svelte.d.ts +4 -0
  18. package/dist/drawer/drawer.d.ts +160 -0
  19. package/dist/drawer/drawer.js +80 -0
  20. package/dist/elements/accordion/Accordion.svelte +98 -0
  21. package/dist/elements/accordion/Accordion.svelte.d.ts +4 -0
  22. package/dist/elements/accordion/accordion.d.ts +227 -0
  23. package/dist/elements/accordion/accordion.js +138 -0
  24. package/dist/elements/alert/Alert.svelte +57 -0
  25. package/dist/elements/alert/Alert.svelte.d.ts +4 -0
  26. package/dist/elements/badge/Badge.svelte +43 -0
  27. package/dist/elements/badge/Badge.svelte.d.ts +4 -0
  28. package/dist/elements/badge/badge.d.ts +181 -0
  29. package/dist/elements/badge/badge.js +65 -0
  30. package/dist/elements/dropdown/Dropdown.svelte +234 -0
  31. package/dist/elements/dropdown/Dropdown.svelte.d.ts +4 -0
  32. package/dist/elements/dropdown/Select.svelte +333 -0
  33. package/dist/elements/dropdown/Select.svelte.d.ts +4 -0
  34. package/dist/elements/dropdown/dropdown.d.ts +251 -0
  35. package/dist/elements/dropdown/dropdown.js +95 -0
  36. package/dist/elements/dropdown/select.d.ts +200 -0
  37. package/dist/elements/dropdown/select.js +82 -0
  38. package/dist/elements/file-upload/FileUpload.svelte +135 -0
  39. package/dist/elements/file-upload/FileUpload.svelte.d.ts +4 -0
  40. package/dist/elements/file-upload/FilesPreview.svelte +93 -0
  41. package/dist/elements/file-upload/FilesPreview.svelte.d.ts +4 -0
  42. package/dist/elements/progress/Progress.svelte +145 -0
  43. package/dist/elements/progress/Progress.svelte.d.ts +4 -0
  44. package/dist/elements/timeline/Timeline.svelte +92 -0
  45. package/dist/elements/timeline/Timeline.svelte.d.ts +7 -0
  46. package/dist/file-browser/FileBrowser.svelte +877 -0
  47. package/dist/file-browser/FileBrowser.svelte.d.ts +14 -0
  48. package/dist/file-browser/index.d.ts +1 -0
  49. package/dist/file-browser/index.js +1 -0
  50. package/dist/filters/CompactFilters.svelte +147 -0
  51. package/dist/filters/CompactFilters.svelte.d.ts +4 -0
  52. package/dist/filters/index.d.ts +1 -0
  53. package/dist/filters/index.js +1 -0
  54. package/dist/forms/Checkbox.svelte +54 -0
  55. package/dist/forms/Checkbox.svelte.d.ts +4 -0
  56. package/dist/forms/DateRange.svelte +493 -0
  57. package/dist/forms/DateRange.svelte.d.ts +4 -0
  58. package/dist/forms/Form.svelte +39 -0
  59. package/dist/forms/Form.svelte.d.ts +4 -0
  60. package/dist/forms/Input.svelte +86 -0
  61. package/dist/forms/Input.svelte.d.ts +4 -0
  62. package/dist/forms/NumberInput.svelte +159 -0
  63. package/dist/forms/NumberInput.svelte.d.ts +4 -0
  64. package/dist/forms/RadioInputs.svelte +64 -0
  65. package/dist/forms/RadioInputs.svelte.d.ts +4 -0
  66. package/dist/forms/RadioPill.svelte +66 -0
  67. package/dist/forms/RadioPill.svelte.d.ts +4 -0
  68. package/dist/forms/Slider.svelte +342 -0
  69. package/dist/forms/Slider.svelte.d.ts +4 -0
  70. package/dist/forms/Tags.svelte +181 -0
  71. package/dist/forms/Tags.svelte.d.ts +4 -0
  72. package/dist/forms/Toggle.svelte +132 -0
  73. package/dist/forms/Toggle.svelte.d.ts +4 -0
  74. package/dist/forms/slider.d.ts +143 -0
  75. package/dist/forms/slider.js +62 -0
  76. package/dist/header/Breadcrumbs.svelte +73 -0
  77. package/dist/header/Breadcrumbs.svelte.d.ts +4 -0
  78. package/dist/header/PageHeader.svelte +68 -0
  79. package/dist/header/PageHeader.svelte.d.ts +4 -0
  80. package/dist/header/breadcrumbs.d.ts +226 -0
  81. package/dist/header/breadcrumbs.js +87 -0
  82. package/dist/helper/cls.d.ts +1 -0
  83. package/dist/helper/cls.js +4 -0
  84. package/dist/helper/date.d.ts +7 -0
  85. package/dist/helper/date.js +15 -0
  86. package/dist/helper/nav.svelte.d.ts +6 -0
  87. package/dist/helper/nav.svelte.js +23 -0
  88. package/dist/index.d.ts +856 -1
  89. package/dist/index.js +78 -1
  90. package/dist/layout/card/Card.svelte +41 -0
  91. package/dist/layout/card/Card.svelte.d.ts +4 -0
  92. package/dist/layout/card/MetricCard.svelte +64 -0
  93. package/dist/layout/card/MetricCard.svelte.d.ts +4 -0
  94. package/dist/layout/card/StatsCard.svelte +266 -0
  95. package/dist/layout/card/StatsCard.svelte.d.ts +4 -0
  96. package/dist/layout/card/card.d.ts +128 -0
  97. package/dist/layout/card/card.js +51 -0
  98. package/dist/layout/card/metric-card.d.ts +49 -0
  99. package/dist/layout/card/metric-card.js +10 -0
  100. package/dist/layout/card/stats-card.d.ts +191 -0
  101. package/dist/layout/card/stats-card.js +73 -0
  102. package/dist/layout/navbar/Navbar.svelte +206 -0
  103. package/dist/layout/navbar/Navbar.svelte.d.ts +4 -0
  104. package/dist/layout/navbar/navbar.d.ts +205 -0
  105. package/dist/layout/navbar/navbar.js +98 -0
  106. package/dist/layout/sidebar/NavGroup.svelte +91 -0
  107. package/dist/layout/sidebar/NavGroup.svelte.d.ts +4 -0
  108. package/dist/layout/sidebar/NavItem.svelte +29 -0
  109. package/dist/layout/sidebar/NavItem.svelte.d.ts +4 -0
  110. package/dist/layout/sidebar/Sidebar.svelte +193 -0
  111. package/dist/layout/sidebar/Sidebar.svelte.d.ts +4 -0
  112. package/dist/layout/table/Cells.svelte +111 -0
  113. package/dist/layout/table/Cells.svelte.d.ts +27 -0
  114. package/dist/layout/table/Table.svelte +790 -0
  115. package/dist/layout/table/Table.svelte.d.ts +4 -0
  116. package/dist/layout/table/table.d.ts +256 -0
  117. package/dist/layout/table/table.js +141 -0
  118. package/dist/layout/tabs/Tab.svelte +60 -0
  119. package/dist/layout/tabs/Tab.svelte.d.ts +4 -0
  120. package/dist/layout/tabs/TabContent.svelte +30 -0
  121. package/dist/layout/tabs/TabContent.svelte.d.ts +4 -0
  122. package/dist/layout/tabs/TabGroup.svelte +62 -0
  123. package/dist/layout/tabs/TabGroup.svelte.d.ts +4 -0
  124. package/dist/layout/tabs/tabs.d.ts +140 -0
  125. package/dist/layout/tabs/tabs.js +298 -0
  126. package/dist/modal/Modal.svelte +207 -0
  127. package/dist/modal/Modal.svelte.d.ts +4 -0
  128. package/dist/modal/modal.d.ts +211 -0
  129. package/dist/modal/modal.js +81 -0
  130. package/dist/sonner/sonner.svelte +13 -0
  131. package/dist/sonner/sonner.svelte.d.ts +4 -0
  132. package/dist/types/variants.d.ts +1 -0
  133. package/dist/types/variants.js +1 -0
  134. package/dist/utils/Portal.svelte +108 -0
  135. package/dist/utils/Portal.svelte.d.ts +8 -0
  136. package/dist/utils/dateUtils.d.ts +7 -0
  137. package/dist/utils/dateUtils.js +26 -0
  138. package/dist/variants.d.ts +30 -0
  139. package/dist/variants.js +36 -0
  140. package/package.json +39 -6
  141. package/dist/layout/Card.svelte +0 -179
  142. package/dist/layout/Card.svelte.d.ts +0 -208
  143. package/dist/layout/index.d.ts +0 -1
  144. package/dist/layout/index.js +0 -1
@@ -0,0 +1,81 @@
1
+ import { tv } from 'tailwind-variants';
2
+ export const modal = tv({
3
+ slots: {
4
+ base: 'fixed inset-0 z-50 flex items-center justify-center overflow-y-auto',
5
+ backdrop: 'fixed inset-0 transition-opacity bg-black/50',
6
+ contentWrapper: 'absolute transform overflow-hidden transition-all px-2',
7
+ content: 'bg-white overflow-hidden rounded-lg',
8
+ header: 'px-4 py-3 flex items-center justify-between border-b border-default-200',
9
+ body: 'px-3 py-2 max-h-[70dvh] overflow-y-auto',
10
+ title: 'text-default-900 leading-6 text-base font-semibold',
11
+ closeButton: 'text-default-400 hover:text-default-500 rounded-md cursor-pointer'
12
+ },
13
+ variants: {
14
+ open: {
15
+ true: {
16
+ base: 'visible',
17
+ backdrop: 'visible opacity-100',
18
+ contentWrapper: 'visible scale-100 opacity-100'
19
+ },
20
+ false: {
21
+ base: 'invisible',
22
+ backdrop: 'invisible opacity-0',
23
+ contentWrapper: 'invisible scale-95 opacity-0'
24
+ }
25
+ },
26
+ position: {
27
+ center: {
28
+ contentWrapper: 'mx-auto'
29
+ },
30
+ top: {
31
+ contentWrapper: 'mx-auto top-7'
32
+ },
33
+ bottom: {
34
+ contentWrapper: 'mx-auto bottom-7'
35
+ },
36
+ left: {
37
+ contentWrapper: 'left-7'
38
+ },
39
+ right: {
40
+ contentWrapper: 'right-7'
41
+ }
42
+ },
43
+ size: {
44
+ xs: {
45
+ contentWrapper: 'w-full max-w-xs'
46
+ },
47
+ sm: {
48
+ contentWrapper: 'w-full max-w-sm'
49
+ },
50
+ base: {
51
+ contentWrapper: 'w-full max-w-md'
52
+ },
53
+ lg: {
54
+ contentWrapper: 'w-full max-w-lg'
55
+ },
56
+ xl: {
57
+ contentWrapper: 'w-full max-w-xl'
58
+ },
59
+ '2xl': {
60
+ contentWrapper: 'w-full max-w-2xl'
61
+ }
62
+ },
63
+ border: {
64
+ none: {
65
+ content: 'border-0'
66
+ },
67
+ default: {
68
+ content: 'border border-default-200'
69
+ },
70
+ colored: {
71
+ content: 'border'
72
+ }
73
+ }
74
+ },
75
+ defaultVariants: {
76
+ open: false,
77
+ position: 'center',
78
+ size: 'base',
79
+ color: 'default'
80
+ }
81
+ });
@@ -0,0 +1,13 @@
1
+ <script lang="ts">
2
+ import { Toaster as Sonner, type ToasterProps as SonnerProps } from 'svelte-sonner';
3
+
4
+ let restProps: SonnerProps = $props();
5
+ </script>
6
+
7
+ <Sonner
8
+ class="toaster group"
9
+ toastOptions={{
10
+
11
+ }}
12
+ {...restProps}
13
+ />
@@ -0,0 +1,4 @@
1
+ import { Toaster as Sonner, type ToasterProps as SonnerProps } from 'svelte-sonner';
2
+ declare const Sonner: import("svelte").Component<SonnerProps, {}, "">;
3
+ type Sonner = ReturnType<typeof Sonner>;
4
+ export default Sonner;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,108 @@
1
+ <script lang="ts">
2
+ import { onMount, onDestroy, type Snippet } from 'svelte';
3
+
4
+ /**
5
+ * Target element to mount the portal content to
6
+ * Defaults to document.body
7
+ */
8
+ let { target, children }: { target?: HTMLElement | null; children: Snippet } = $props();
9
+
10
+ let ref: HTMLElement;
11
+ let portal: HTMLElement;
12
+ let animationFrameId: number;
13
+ let isPositioned = $state(false);
14
+
15
+ // Position update without animation - for immediate positioning
16
+ function updatePosition() {
17
+ if (!ref || !target) return;
18
+
19
+ const { top, left, width, height } = target.getBoundingClientRect();
20
+ const scrollY = window.scrollY || document.documentElement.scrollTop;
21
+ const scrollX = window.scrollX || document.documentElement.scrollLeft;
22
+
23
+ // Set instant positioning without transitions for first render
24
+ if (!isPositioned) {
25
+ ref.style.position = 'absolute';
26
+ ref.style.width = `${width}px`;
27
+ ref.style.zIndex = '10000'; // Ensure the highest z-index
28
+ ref.style.top = `${height}px`; // Position below the target
29
+ ref.style.left = '0px';
30
+ ref.style.transform = `translate(${left + scrollX}px, ${top + scrollY}px)`;
31
+ ref.style.visibility = 'hidden'; // Keep hidden until fully positioned
32
+
33
+ // Wait for next frame to ensure positioning is applied before showing
34
+ animationFrameId = requestAnimationFrame(() => {
35
+ ref.style.opacity = '1';
36
+ ref.style.visibility = 'visible';
37
+ isPositioned = true;
38
+
39
+ // Now add transition for subsequent updates
40
+ ref.style.transition = 'transform 0.1s ease-out';
41
+ });
42
+ } else {
43
+ // For subsequent updates, smoothly transition
44
+ ref.style.transform = `translate(${left + scrollX}px, ${top + scrollY}px)`;
45
+ }
46
+ }
47
+
48
+ // Handle scroll and resize with animation frames for smooth updates
49
+ function handlePositionUpdate() {
50
+ if (animationFrameId) {
51
+ cancelAnimationFrame(animationFrameId);
52
+ }
53
+
54
+ animationFrameId = requestAnimationFrame(updatePosition);
55
+ }
56
+
57
+ onMount(() => {
58
+ // Create portal container
59
+ portal = document.createElement('div');
60
+ portal.className = 'ripple-portal';
61
+ portal.style.position = 'fixed';
62
+ portal.style.zIndex = '10000'; // Ensure highest z-index
63
+ portal.style.top = '0';
64
+ portal.style.left = '0';
65
+ portal.style.width = '100%';
66
+ portal.style.pointerEvents = 'none'; // Allow clicking through the container but not its children
67
+
68
+ // Default to document.body if no target is provided
69
+ const targetElement = document.body; // Always append to body for best visibility
70
+ targetElement.appendChild(portal);
71
+
72
+ // Move the content to the portal
73
+ portal.appendChild(ref);
74
+
75
+ // Allow pointer events on the content
76
+ ref.style.pointerEvents = 'auto';
77
+
78
+ // Initially hide the content
79
+ ref.style.opacity = '0';
80
+
81
+ // Position immediately - critical for first render
82
+ updatePosition();
83
+
84
+ // Add event listeners for position updates
85
+ window.addEventListener('resize', handlePositionUpdate);
86
+ window.addEventListener('scroll', handlePositionUpdate, true);
87
+ });
88
+
89
+ onDestroy(() => {
90
+ // Clean up on component destruction
91
+ if (portal && portal.parentNode) {
92
+ portal.parentNode.removeChild(portal);
93
+ }
94
+
95
+ // Clean up event listeners
96
+ window.removeEventListener('resize', handlePositionUpdate);
97
+ window.removeEventListener('scroll', handlePositionUpdate, true);
98
+
99
+ // Cancel any pending animation frame
100
+ if (animationFrameId) {
101
+ cancelAnimationFrame(animationFrameId);
102
+ }
103
+ });
104
+ </script>
105
+
106
+ <div class="portal-content" bind:this={ref}>
107
+ {@render children()}
108
+ </div>
@@ -0,0 +1,8 @@
1
+ import { type Snippet } from 'svelte';
2
+ type $$ComponentProps = {
3
+ target?: HTMLElement | null;
4
+ children: Snippet;
5
+ };
6
+ declare const Portal: import("svelte").Component<$$ComponentProps, {}, "">;
7
+ type Portal = ReturnType<typeof Portal>;
8
+ export default Portal;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Format a date to a specific format
3
+ * @param date - Date to format
4
+ * @param format - Format string (default: 'YYYY-MM-DD')
5
+ * @returns Formatted date string
6
+ */
7
+ export declare function formatDate(date: Date | string | number, formatStr?: string): string;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Format a date to a specific format
3
+ * @param date - Date to format
4
+ * @param format - Format string (default: 'YYYY-MM-DD')
5
+ * @returns Formatted date string
6
+ */
7
+ export function formatDate(date, formatStr = 'DD.MM.YYYY HH:mm') {
8
+ const d = new Date(date);
9
+ if (isNaN(d.getTime())) {
10
+ return 'Invalid Date';
11
+ }
12
+ // Simple format implementation for common patterns
13
+ const day = d.getDate().toString().padStart(2, '0');
14
+ const month = (d.getMonth() + 1).toString().padStart(2, '0');
15
+ const year = d.getFullYear();
16
+ const hours = d.getHours().toString().padStart(2, '0');
17
+ const minutes = d.getMinutes().toString().padStart(2, '0');
18
+ const seconds = d.getSeconds().toString().padStart(2, '0');
19
+ return formatStr
20
+ .replace('DD', day)
21
+ .replace('MM', month)
22
+ .replace('YYYY', year.toString())
23
+ .replace('HH', hours)
24
+ .replace('mm', minutes)
25
+ .replace('ss', seconds);
26
+ }
@@ -0,0 +1,30 @@
1
+ import type { ChartColors, VariantColors, VariantSizes } from './index.js';
2
+ export declare const Color: {
3
+ DEFAULT: string;
4
+ PRIMARY: string;
5
+ SECONDARY: string;
6
+ INFO: string;
7
+ SUCCESS: string;
8
+ WARNING: string;
9
+ DANGER: string;
10
+ };
11
+ export declare const Size: {
12
+ XS: string;
13
+ SM: string;
14
+ BASE: string;
15
+ LG: string;
16
+ XL: string;
17
+ XXL: string;
18
+ };
19
+ export declare const ChartColor: {
20
+ readonly HEALTH: "health";
21
+ readonly PROPERTY: "property";
22
+ readonly AUTO: "auto";
23
+ readonly LIFE: "life";
24
+ readonly OTHER: "other";
25
+ readonly DEFAULT: "default";
26
+ };
27
+ export declare const defaultChartColors: ChartColors;
28
+ export declare const colors: VariantColors[];
29
+ export declare const sizes: VariantSizes[];
30
+ export declare const chartColors: ("default" | "health" | "property" | "auto" | "life" | "other")[];
@@ -0,0 +1,36 @@
1
+ export const Color = {
2
+ DEFAULT: 'default',
3
+ PRIMARY: 'primary',
4
+ SECONDARY: 'secondary',
5
+ INFO: 'info',
6
+ SUCCESS: 'success',
7
+ WARNING: 'warning',
8
+ DANGER: 'danger'
9
+ };
10
+ export const Size = {
11
+ XS: 'xs',
12
+ SM: 'sm',
13
+ BASE: 'base',
14
+ LG: 'lg',
15
+ XL: 'xl',
16
+ XXL: '2xl'
17
+ };
18
+ export const ChartColor = {
19
+ HEALTH: 'health',
20
+ PROPERTY: 'property',
21
+ AUTO: 'auto',
22
+ LIFE: 'life',
23
+ OTHER: 'other',
24
+ DEFAULT: 'default'
25
+ };
26
+ export const defaultChartColors = {
27
+ [ChartColor.HEALTH]: '#1F69FF',
28
+ [ChartColor.PROPERTY]: '#2D9D78',
29
+ [ChartColor.AUTO]: '#E8A317',
30
+ [ChartColor.LIFE]: '#E34974',
31
+ [ChartColor.OTHER]: '#7B3FE4',
32
+ [ChartColor.DEFAULT]: '#6B7280'
33
+ };
34
+ export const colors = Object.values(Color);
35
+ export const sizes = Object.values(Size);
36
+ export const chartColors = Object.values(ChartColor);
package/package.json CHANGED
@@ -1,6 +1,11 @@
1
1
  {
2
2
  "name": "@makolabs/ripple",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
+ "description": "Simple Svelte 5 powered component library ✨",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/makolabsai/ripple-ui.git"
8
+ },
4
9
  "scripts": {
5
10
  "dev": "vite dev",
6
11
  "build": "vite build && npm run prepack",
@@ -13,7 +18,8 @@
13
18
  "lint": "prettier --check . && eslint .",
14
19
  "test:unit": "vitest",
15
20
  "test": "npm run test:unit -- --run && npm run test:e2e",
16
- "test:e2e": "playwright test"
21
+ "test:e2e": "playwright test",
22
+ "uplish": "git add . && git commit -m \"chore: prepare for publish\" && npm version patch && git push --follow-tags && npm publish"
17
23
  },
18
24
  "files": [
19
25
  "dist",
@@ -43,9 +49,10 @@
43
49
  "@sveltejs/kit": "^2.16.0",
44
50
  "@sveltejs/package": "^2.0.0",
45
51
  "@sveltejs/vite-plugin-svelte": "^5.0.0",
46
- "@tailwindcss/vite": "^4.0.0",
52
+ "@tailwindcss/vite": "^4.0.14",
47
53
  "@testing-library/jest-dom": "^6.6.3",
48
54
  "@testing-library/svelte": "^5.2.4",
55
+ "@types/node": "^22.13.10",
49
56
  "eslint": "^9.18.0",
50
57
  "eslint-config-prettier": "^10.0.1",
51
58
  "eslint-plugin-svelte": "^3.0.0",
@@ -57,17 +64,43 @@
57
64
  "publint": "^0.3.2",
58
65
  "svelte": "^5.0.0",
59
66
  "svelte-check": "^4.0.0",
67
+ "sveltekit-superforms": "^2.24.0",
60
68
  "tailwindcss": "^4.0.0",
61
69
  "typescript": "^5.0.0",
62
70
  "typescript-eslint": "^8.20.0",
63
71
  "vite": "^6.0.0",
64
- "vitest": "^3.0.0"
72
+ "vitest": "^3.0.0",
73
+ "zod": "^3.24.2"
65
74
  },
66
75
  "keywords": [
67
- "svelte"
76
+ "svelte",
77
+ "ui",
78
+ "svelte5",
79
+ "modal",
80
+ "navigation",
81
+ "ripple",
82
+ "button",
83
+ "sidebar",
84
+ "card",
85
+ "select",
86
+ "tooltip",
87
+ "accordion",
88
+ "tabs",
89
+ "alert",
90
+ "badge",
91
+ "breadcrumb",
92
+ "carousel",
93
+ "collapse",
94
+ "list-group",
95
+ "pagination",
96
+ "progress",
97
+ "spinner",
98
+ "toast"
68
99
  ],
69
100
  "dependencies": {
70
- "mako-ui-components": "github:makolabsai/mako-ui-components",
101
+ "dayjs": "^1.11.13",
102
+ "echarts": "^5.6.0",
103
+ "svelte-sonner": "^0.3.28",
71
104
  "tailwind-merge": "^3.0.2",
72
105
  "tailwind-variants": "^1.0.0"
73
106
  }
@@ -1,179 +0,0 @@
1
- <script lang="ts" module>
2
- import { cn } from '../helper/cls';
3
- import type { Snippet } from 'svelte';
4
- import { tv, type ClassValue } from 'tailwind-variants';
5
-
6
- const cardVariants = tv({
7
- variants: {
8
- size: {
9
- 'xs': 'p-2',
10
- 'sm': 'p-3',
11
- 'base': 'p-4',
12
- 'lg': 'p-5',
13
- 'xl': 'p-6',
14
- '2xl': 'p-8'
15
- },
16
- color: {
17
- 'default': 'bg-default-50 dark:bg-default-800',
18
- 'primary': 'bg-primary-50 dark:bg-primary-900/20',
19
- 'secondary': 'bg-secondary-50 dark:bg-secondary-800/20',
20
- 'info': 'bg-info-50 dark:bg-info-900/20',
21
- 'success': 'bg-success-50 dark:bg-success-900/20',
22
- 'warning': 'bg-warning-50 dark:bg-warning-900/20',
23
- 'danger': 'bg-danger-50 dark:bg-danger-900/20'
24
- },
25
- border: {
26
- 'none': 'border-0',
27
- 'default': 'border border-gray-200 dark:border-gray-700',
28
- 'colored': 'border'
29
- },
30
- rounded: {
31
- 'none': 'rounded-none',
32
- 'sm': 'rounded',
33
- 'md': 'rounded-lg',
34
- 'lg': 'rounded-xl',
35
- 'full': 'rounded-3xl'
36
- },
37
- shadow: {
38
- 'none': 'shadow-none',
39
- 'sm': 'shadow-sm',
40
- 'md': 'shadow',
41
- 'lg': 'shadow-lg'
42
- }
43
- },
44
- defaultVariants: {
45
- size: 'base',
46
- color: 'default',
47
- border: 'default',
48
- rounded: 'md',
49
- shadow: 'sm'
50
- }
51
- });
52
-
53
- const SIZE_TEXT_VARIANTS = {
54
- 'xs': 'text-xs',
55
- 'sm': 'text-sm',
56
- 'base': 'text-base',
57
- 'lg': 'text-lg',
58
- 'xl': 'text-xl',
59
- '2xl': 'text-2xl'
60
- };
61
-
62
- const cardTitleVariants = tv({
63
- variants: {
64
- color: {
65
- 'default': 'text-default-900 dark:text-default-100',
66
- 'primary': 'text-primary-900 dark:text-primary-100',
67
- 'secondary': 'text-secondary-900 dark:text-secondary-100',
68
- 'info': 'text-info-900 dark:text-info-100',
69
- 'success': 'text-success-900 dark:text-success-100',
70
- 'warning': 'text-warning-900 dark:text-warning-100',
71
- 'danger': 'text-danger-900 dark:text-danger-100'
72
- },
73
- weight: {
74
- 'normal': 'font-normal',
75
- 'medium': 'font-medium',
76
- 'semibold': 'font-semibold',
77
- 'bold': 'font-bold'
78
- },
79
- size: SIZE_TEXT_VARIANTS
80
- },
81
- defaultVariants: {
82
- color: 'default',
83
- weight: 'semibold',
84
- size: 'base'
85
- }
86
- });
87
-
88
- const cardBodyVariants = tv({
89
- variants: {
90
- color: {
91
- 'default': 'text-default-700 dark:text-default-300',
92
- 'primary': 'text-primary-700 dark:text-primary-300',
93
- 'secondary': 'text-secondary-700 dark:text-secondary-300',
94
- 'info': 'text-info-700 dark:text-info-300',
95
- 'success': 'text-success-700 dark:text-success-300',
96
- 'warning': 'text-warning-700 dark:text-warning-300',
97
- 'danger': 'text-danger-700 dark:text-danger-300'
98
- },
99
- size: SIZE_TEXT_VARIANTS
100
- },
101
- defaultVariants: {
102
- color: 'default',
103
- size: 'base'
104
- }
105
- });
106
-
107
-
108
- export type BaseCardProps = {
109
- class?: ClassValue
110
- containerClass?: ClassValue
111
- size?: keyof typeof cardVariants.variants.size
112
- color?: keyof typeof cardVariants.variants.color
113
- border?: keyof typeof cardVariants.variants.border
114
- rounded?: keyof typeof cardVariants.variants.rounded
115
- shadow?: keyof typeof cardVariants.variants.shadow;
116
- titleWeight?: keyof typeof cardTitleVariants.variants.weight
117
- }
118
-
119
- type CustomCardProps = {
120
- custom: Snippet
121
- children?: never
122
- title?: never
123
- }
124
-
125
- type CardWithChildrenProps = {
126
- children: Snippet
127
- custom?: never
128
- title?: string
129
- }
130
-
131
- export type CardProps = BaseCardProps & (CardWithChildrenProps | CustomCardProps);
132
- </script>
133
-
134
- <script lang="ts">
135
- let {
136
- children,
137
- custom,
138
- title,
139
- size = 'base',
140
- color = 'default',
141
- border = 'default',
142
- rounded = 'md',
143
- shadow = 'sm',
144
- class: className = '',
145
- titleWeight = 'semibold'
146
- }: CardProps = $props();
147
-
148
- const cardClasses = $derived(
149
- cn(
150
- cardVariants({ size, color, border, rounded, shadow }),
151
- className
152
- )
153
- );
154
-
155
- const cardTitleClasses = $derived(
156
- cn(
157
- cardTitleVariants({ color: color, weight: titleWeight, size })
158
- )
159
- );
160
-
161
- const cardBodyClasses = $derived(
162
- cn(
163
- cardBodyVariants({ color: color, size })
164
- )
165
- );
166
- </script>
167
-
168
- <div class={cardClasses}>
169
- {#if children}
170
- {#if title}
171
- <h3 class={cardTitleClasses}>{title}</h3>
172
- {/if}
173
- <div class={cardBodyClasses}>
174
- {@render children()}
175
- </div>
176
- {:else if custom}
177
- {@render custom()}
178
- {/if}
179
- </div>