@makolabs/ripple 0.0.1-dev.9 → 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 (78) hide show
  1. package/README.md +1 -1
  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/charts/Chart.svelte +59 -47
  11. package/dist/charts/Chart.svelte.d.ts +1 -1
  12. package/dist/drawer/drawer.js +3 -3
  13. package/dist/elements/accordion/Accordion.svelte +98 -0
  14. package/dist/elements/accordion/Accordion.svelte.d.ts +4 -0
  15. package/dist/elements/accordion/accordion.d.ts +227 -0
  16. package/dist/elements/accordion/accordion.js +138 -0
  17. package/dist/elements/alert/Alert.svelte +7 -3
  18. package/dist/elements/dropdown/Dropdown.svelte +74 -107
  19. package/dist/elements/dropdown/Select.svelte +81 -62
  20. package/dist/elements/dropdown/dropdown.js +1 -1
  21. package/dist/elements/dropdown/select.js +8 -8
  22. package/dist/elements/file-upload/FileUpload.svelte +17 -95
  23. package/dist/elements/file-upload/FilesPreview.svelte +93 -0
  24. package/dist/elements/file-upload/FilesPreview.svelte.d.ts +4 -0
  25. package/dist/elements/progress/Progress.svelte +83 -25
  26. package/dist/file-browser/FileBrowser.svelte +877 -0
  27. package/dist/file-browser/FileBrowser.svelte.d.ts +14 -0
  28. package/dist/file-browser/index.d.ts +1 -0
  29. package/dist/file-browser/index.js +1 -0
  30. package/dist/filters/CompactFilters.svelte +147 -0
  31. package/dist/filters/CompactFilters.svelte.d.ts +4 -0
  32. package/dist/filters/index.d.ts +1 -0
  33. package/dist/filters/index.js +1 -0
  34. package/dist/forms/Checkbox.svelte +2 -2
  35. package/dist/forms/DateRange.svelte +21 -21
  36. package/dist/forms/Input.svelte +3 -3
  37. package/dist/forms/NumberInput.svelte +1 -1
  38. package/dist/forms/RadioInputs.svelte +3 -3
  39. package/dist/forms/Tags.svelte +5 -5
  40. package/dist/forms/Toggle.svelte +3 -3
  41. package/dist/forms/slider.js +4 -4
  42. package/dist/header/PageHeader.svelte +49 -11
  43. package/dist/index.d.ts +256 -143
  44. package/dist/index.js +19 -2
  45. package/dist/layout/card/MetricCard.svelte +64 -0
  46. package/dist/layout/card/MetricCard.svelte.d.ts +4 -0
  47. package/dist/layout/card/StatsCard.svelte +4 -3
  48. package/dist/layout/card/StatsCard.svelte.d.ts +1 -1
  49. package/dist/layout/card/metric-card.d.ts +49 -0
  50. package/dist/layout/card/metric-card.js +10 -0
  51. package/dist/layout/card/stats-card.d.ts +0 -15
  52. package/dist/layout/card/stats-card.js +1 -1
  53. package/dist/layout/sidebar/NavGroup.svelte +1 -7
  54. package/dist/layout/sidebar/NavItem.svelte +2 -2
  55. package/dist/layout/sidebar/Sidebar.svelte +103 -49
  56. package/dist/layout/table/Table.svelte +465 -88
  57. package/dist/layout/table/Table.svelte.d.ts +1 -1
  58. package/dist/layout/table/table.d.ts +0 -47
  59. package/dist/layout/table/table.js +0 -8
  60. package/dist/layout/tabs/Tab.svelte +9 -6
  61. package/dist/layout/tabs/Tab.svelte.d.ts +1 -1
  62. package/dist/layout/tabs/TabContent.svelte +1 -2
  63. package/dist/layout/tabs/TabContent.svelte.d.ts +1 -1
  64. package/dist/layout/tabs/TabGroup.svelte +10 -5
  65. package/dist/layout/tabs/TabGroup.svelte.d.ts +2 -2
  66. package/dist/layout/tabs/tabs.d.ts +61 -76
  67. package/dist/layout/tabs/tabs.js +170 -28
  68. package/dist/modal/Modal.svelte +3 -3
  69. package/dist/modal/modal.js +3 -3
  70. package/dist/utils/Portal.svelte +108 -0
  71. package/dist/utils/Portal.svelte.d.ts +8 -0
  72. package/dist/utils/dateUtils.d.ts +7 -0
  73. package/dist/utils/dateUtils.js +26 -0
  74. package/dist/variants.d.ts +11 -1
  75. package/dist/variants.js +17 -0
  76. package/package.json +4 -3
  77. package/dist/header/pageheaders.d.ts +0 -10
  78. package/dist/header/pageheaders.js +0 -1
@@ -0,0 +1,93 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../helper/cls.js';
3
+ import type { FilePreviewProps } from '../../index.js';
4
+
5
+ let { files = [], ondelete, class: className = '' }: FilePreviewProps = $props();
6
+
7
+ function formatFileSize(bytes: number): string {
8
+ if (bytes === 0) return '0 B';
9
+ const k = 1024;
10
+ const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
11
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
12
+ return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))}${sizes[i]}`;
13
+ }
14
+ </script>
15
+
16
+ {#if files.length > 0}
17
+ <ul class={cn('mt-6 space-y-3', className)}>
18
+ {#each files as file, i (i)}
19
+ <li
20
+ class={cn('flex items-center justify-between rounded-xl p-4 ring-4', {
21
+ 'bg-danger-50 ring-danger-100': file.status === 'error',
22
+ 'bg-success-50 ring-success-100': file.status === 'success',
23
+ 'ring-primary-100/30 bg-white': file.status === 'uploading'
24
+ })}
25
+ >
26
+ <div class="flex flex-1 items-center gap-3">
27
+ <!-- File Icon -->
28
+ <div
29
+ class={cn('flex size-10 items-center justify-center rounded-full', {
30
+ 'bg-danger-100 text-danger-500': file.status === 'error',
31
+ 'bg-success-100 text-success-500': file.status === 'success',
32
+ 'bg-primary-100 text-primary-500': file.status === 'uploading'
33
+ })}
34
+ >
35
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-5" viewBox="0 0 24 24">
36
+ <path
37
+ fill="currentColor"
38
+ d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6z"
39
+ />
40
+ </svg>
41
+ </div>
42
+
43
+ <div class="flex-1">
44
+ <!-- Filename and Size -->
45
+ <div class="mb-1 flex items-center justify-between">
46
+ <span class="text-default-700 font-medium">{file.OriginalFilename}</span>
47
+ <span class="text-default-500 text-sm">{formatFileSize(file.Size)}</span>
48
+ </div>
49
+
50
+ <!-- Status Information -->
51
+ {#if file.status === 'uploading'}
52
+ <div class="bg-default-100 h-1.5 w-full rounded-full">
53
+ <div
54
+ class="bg-primary-500 h-1.5 rounded-full transition-all duration-300"
55
+ style="width: {file.progress || 0}%"
56
+ ></div>
57
+ </div>
58
+ <span class="text-default-500 mt-1 text-sm">{file.progress || 0}%</span>
59
+ {:else if file.status === 'error'}
60
+ <div class="flex items-center justify-between">
61
+ <span class="text-danger-500 text-sm">Upload failed!</span>
62
+ <span class="text-danger-600 cursor-help text-sm font-medium"
63
+ >Please try again!</span
64
+ >
65
+ </div>
66
+ {:else if file.status === 'success'}
67
+ <p class="text-success-500 text-sm">Upload Successful!</p>
68
+ {/if}
69
+ </div>
70
+ </div>
71
+
72
+ <button
73
+ type="button"
74
+ aria-label="Delete file"
75
+ class={cn('ml-4 flex size-6 cursor-pointer items-center justify-center rounded-lg', {
76
+ 'bg-danger-100 text-danger-500': file.status === 'error',
77
+ 'bg-success-100 text-success-500': file.status === 'success',
78
+ 'bg-default-100 text-default-500': file.status === 'uploading'
79
+ })}
80
+ onclick={() => (file.FileID ? ondelete?.(file.FileID, i) : ondelete?.('', i))}
81
+ disabled={file.status === 'uploading'}
82
+ >
83
+ <svg xmlns="http://www.w3.org/2000/svg" class="size-4" viewBox="0 0 24 24">
84
+ <path
85
+ fill="currentColor"
86
+ d="M19 6.41L17.59 5L12 10.59L6.41 5L5 6.41L10.59 12L5 17.59L6.41 19L12 13.41L17.59 19L19 17.59L13.41 12L19 6.41z"
87
+ />
88
+ </svg>
89
+ </button>
90
+ </li>
91
+ {/each}
92
+ </ul>
93
+ {/if}
@@ -0,0 +1,4 @@
1
+ import type { FilePreviewProps } from '../../index.js';
2
+ declare const FilesPreview: import("svelte").Component<FilePreviewProps, {}, "">;
3
+ type FilesPreview = ReturnType<typeof FilesPreview>;
4
+ export default FilesPreview;
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { cn } from '../../helper/cls.js';
3
3
  import { Color, Size } from '../../variants.js';
4
- import type { ProgressProps } from '../../index.js';
4
+ import type { ProgressProps, ProgressSegment, VariantColors } from '../../index.js';
5
5
 
6
6
  let {
7
7
  value,
@@ -10,61 +10,89 @@
10
10
  color = Color.PRIMARY,
11
11
  showLabel = true,
12
12
  labelPosition = 'right',
13
+ segments = undefined,
14
+ showValues = false,
15
+ showLabels = false,
13
16
  class: className = '',
14
17
  labelClass = '',
15
18
  barClass = ''
16
19
  }: ProgressProps = $props();
17
20
 
18
- const percentage = $derived(Math.min(Math.round((value / max) * 100), 100));
21
+ // Function composition for better readability and maintainability
22
+ function calculatePercentage(val: number, maximum: number): number {
23
+ return Math.min(Math.round((val / maximum) * 100), 100);
24
+ }
19
25
 
26
+ function getColorClass(color: VariantColors): string {
27
+ const colorMap = {
28
+ [Color.PRIMARY]: 'bg-primary-600',
29
+ [Color.SECONDARY]: 'bg-secondary-600',
30
+ [Color.SUCCESS]: 'bg-success-600',
31
+ [Color.DANGER]: 'bg-danger-600',
32
+ [Color.WARNING]: 'bg-warning-600',
33
+ [Color.INFO]: 'bg-info-600',
34
+ [Color.DEFAULT]: 'bg-default-600'
35
+ };
36
+ return colorMap[color] || colorMap[Color.PRIMARY];
37
+ }
38
+
39
+ function getSizeTextClass(size: string): string {
40
+ if (size === Size.XS || size === Size.SM) return 'text-xs';
41
+ if (size === Size.BASE) return 'text-sm';
42
+ return 'text-base'; // For Size.LG, Size.XL
43
+ }
44
+
45
+ // Derived values
46
+ const percentage = $derived(segments ? 100 : calculatePercentage(value, max));
47
+ const segmentPercentages = $derived(
48
+ segments?.map(segment => ({
49
+ ...segment,
50
+ percentage: calculatePercentage(segment.value, max)
51
+ })) || []
52
+ );
53
+
54
+ // Class compositions
20
55
  const containerClass = $derived(
21
56
  cn(
22
- 'relative flex items-center',
57
+ 'relative',
23
58
  {
24
- 'flex-col gap-1': labelPosition === 'top' || labelPosition === 'bottom',
25
- 'flex-row gap-3': labelPosition === 'right'
59
+ 'flex items-center': !segments,
60
+ 'flex-col gap-1': !segments && (labelPosition === 'top' || labelPosition === 'bottom'),
61
+ 'flex-row gap-3': !segments && labelPosition === 'right'
26
62
  },
27
63
  className
28
64
  )
29
65
  );
30
66
 
31
67
  const progressClass = $derived(
32
- cn('w-full rounded-full bg-gray-200', {
68
+ cn('w-full rounded-full bg-default-200', {
33
69
  'h-1.5': size === Size.XS,
34
70
  'h-2': size === Size.SM,
35
71
  'h-2.5': size === Size.BASE,
36
72
  'h-3': size === Size.LG,
37
73
  'h-4': size === Size.XL,
38
- 'order-2': labelPosition === 'top',
39
- 'order-1': labelPosition === 'bottom'
74
+ 'order-2': !segments && labelPosition === 'top',
75
+ 'order-1': !segments && labelPosition === 'bottom',
76
+ 'flex overflow-hidden': segments
40
77
  })
41
78
  );
42
79
 
43
80
  const fillClass = $derived(
44
81
  cn(
45
82
  'h-full rounded-full transition-all',
46
- {
47
- 'bg-primary-600': color === Color.PRIMARY,
48
- 'bg-secondary-600': color === Color.SECONDARY,
49
- 'bg-success-600': color === Color.SUCCESS,
50
- 'bg-danger-600': color === Color.DANGER,
51
- 'bg-warning-600': color === Color.WARNING,
52
- 'bg-info-600': color === Color.INFO,
53
- 'bg-gray-600': color === Color.DEFAULT
54
- },
83
+ segments ? '' : getColorClass(color),
55
84
  barClass
56
85
  )
57
86
  );
58
87
 
59
88
  const labelTextClass = $derived(
60
89
  cn(
61
- 'text-gray-500',
90
+ 'text-default-500',
91
+ getSizeTextClass(size),
62
92
  {
63
- 'text-xs': size === Size.XS || size === Size.SM,
64
- 'text-sm': size === Size.BASE,
65
- 'text-base': size === Size.LG || size === Size.XL,
66
- 'order-1': labelPosition === 'top',
67
- 'order-2': labelPosition === 'bottom'
93
+ 'order-1': !segments && labelPosition === 'top',
94
+ 'order-2': !segments && labelPosition === 'bottom',
95
+ 'mt-1': segments
68
96
  },
69
97
  labelClass
70
98
  )
@@ -79,9 +107,39 @@
79
107
  aria-valuemin="0"
80
108
  aria-valuemax="100"
81
109
  >
82
- <div class={fillClass} style="width: {percentage}%"></div>
110
+ {#if segments}
111
+ {#each segmentPercentages as segment}
112
+ {#if segment.percentage > 0}
113
+ <div
114
+ class={cn(getColorClass(segment.color), barClass)}
115
+ style="width: {segment.percentage}%"
116
+ title={segment.label || `${segment.value} (${segment.percentage}%)`}
117
+ ></div>
118
+ {/if}
119
+ {/each}
120
+ {:else}
121
+ <div class={fillClass} style="width: {percentage}%"></div>
122
+ {/if}
83
123
  </div>
84
- {#if showLabel}
124
+
125
+ {#if segments && (showLabels || showValues)}
126
+ <div class="flex justify-between mt-1">
127
+ {#each segmentPercentages as segment}
128
+ {#if segment.percentage > 0}
129
+ <div class={labelTextClass}>
130
+ {#if showLabels && segment.label}
131
+ {segment.label}
132
+ {/if}
133
+ {#if showValues}
134
+ {#if showLabels && segment.label} ({/if}
135
+ {segment.percentage}%
136
+ {#if showLabels && segment.label}){/if}
137
+ {/if}
138
+ </div>
139
+ {/if}
140
+ {/each}
141
+ </div>
142
+ {:else if showLabel}
85
143
  <span class={labelTextClass}>{percentage}%</span>
86
144
  {/if}
87
145
  </div>