@makolabs/ripple 0.0.1-dev.3 → 0.0.1-dev.31

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 (116) hide show
  1. package/README.md +571 -98
  2. package/dist/button/Button.svelte +48 -0
  3. package/dist/button/Button.svelte.d.ts +4 -0
  4. package/dist/button/button.d.ts +113 -0
  5. package/dist/button/button.js +168 -0
  6. package/dist/charts/Chart.svelte +543 -0
  7. package/dist/charts/Chart.svelte.d.ts +4 -0
  8. package/dist/drawer/Drawer.svelte +224 -0
  9. package/dist/drawer/Drawer.svelte.d.ts +4 -0
  10. package/dist/drawer/drawer.d.ts +160 -0
  11. package/dist/drawer/drawer.js +80 -0
  12. package/dist/elements/alert/Alert.svelte +57 -0
  13. package/dist/elements/alert/Alert.svelte.d.ts +4 -0
  14. package/dist/elements/badge/Badge.svelte +43 -0
  15. package/dist/elements/badge/Badge.svelte.d.ts +4 -0
  16. package/dist/elements/badge/badge.d.ts +181 -0
  17. package/dist/elements/badge/badge.js +65 -0
  18. package/dist/elements/dropdown/Dropdown.svelte +267 -0
  19. package/dist/elements/dropdown/Dropdown.svelte.d.ts +4 -0
  20. package/dist/elements/dropdown/Select.svelte +314 -0
  21. package/dist/elements/dropdown/Select.svelte.d.ts +4 -0
  22. package/dist/elements/dropdown/dropdown.d.ts +251 -0
  23. package/dist/elements/dropdown/dropdown.js +95 -0
  24. package/dist/elements/dropdown/select.d.ts +200 -0
  25. package/dist/elements/dropdown/select.js +82 -0
  26. package/dist/elements/file-upload/FileUpload.svelte +130 -0
  27. package/dist/elements/file-upload/FileUpload.svelte.d.ts +4 -0
  28. package/dist/elements/file-upload/FilesPreview.svelte +93 -0
  29. package/dist/elements/file-upload/FilesPreview.svelte.d.ts +4 -0
  30. package/dist/elements/progress/Progress.svelte +145 -0
  31. package/dist/elements/progress/Progress.svelte.d.ts +4 -0
  32. package/dist/elements/timeline/Timeline.svelte +92 -0
  33. package/dist/elements/timeline/Timeline.svelte.d.ts +7 -0
  34. package/dist/forms/Checkbox.svelte +54 -0
  35. package/dist/forms/Checkbox.svelte.d.ts +4 -0
  36. package/dist/forms/DateRange.svelte +493 -0
  37. package/dist/forms/DateRange.svelte.d.ts +4 -0
  38. package/dist/forms/Form.svelte +39 -0
  39. package/dist/forms/Form.svelte.d.ts +4 -0
  40. package/dist/forms/Input.svelte +86 -0
  41. package/dist/forms/Input.svelte.d.ts +4 -0
  42. package/dist/forms/NumberInput.svelte +159 -0
  43. package/dist/forms/NumberInput.svelte.d.ts +4 -0
  44. package/dist/forms/RadioInputs.svelte +64 -0
  45. package/dist/forms/RadioInputs.svelte.d.ts +4 -0
  46. package/dist/forms/RadioPill.svelte +66 -0
  47. package/dist/forms/RadioPill.svelte.d.ts +4 -0
  48. package/dist/forms/Slider.svelte +342 -0
  49. package/dist/forms/Slider.svelte.d.ts +4 -0
  50. package/dist/forms/Tags.svelte +181 -0
  51. package/dist/forms/Tags.svelte.d.ts +4 -0
  52. package/dist/forms/Toggle.svelte +132 -0
  53. package/dist/forms/Toggle.svelte.d.ts +4 -0
  54. package/dist/forms/slider.d.ts +143 -0
  55. package/dist/forms/slider.js +62 -0
  56. package/dist/header/Breadcrumbs.svelte +73 -0
  57. package/dist/header/Breadcrumbs.svelte.d.ts +4 -0
  58. package/dist/header/PageHeader.svelte +30 -0
  59. package/dist/header/PageHeader.svelte.d.ts +4 -0
  60. package/dist/header/breadcrumbs.d.ts +226 -0
  61. package/dist/header/breadcrumbs.js +87 -0
  62. package/dist/helper/cls.d.ts +1 -0
  63. package/dist/helper/cls.js +4 -0
  64. package/dist/helper/date.d.ts +7 -0
  65. package/dist/helper/date.js +15 -0
  66. package/dist/helper/nav.svelte.d.ts +6 -0
  67. package/dist/helper/nav.svelte.js +23 -0
  68. package/dist/index.d.ts +731 -1
  69. package/dist/index.js +70 -1
  70. package/dist/layout/card/Card.svelte +41 -0
  71. package/dist/layout/card/Card.svelte.d.ts +4 -0
  72. package/dist/layout/card/StatsCard.svelte +266 -0
  73. package/dist/layout/card/StatsCard.svelte.d.ts +4 -0
  74. package/dist/layout/card/card.d.ts +128 -0
  75. package/dist/layout/card/card.js +51 -0
  76. package/dist/layout/card/stats-card.d.ts +191 -0
  77. package/dist/layout/card/stats-card.js +73 -0
  78. package/dist/layout/navbar/Navbar.svelte +206 -0
  79. package/dist/layout/navbar/Navbar.svelte.d.ts +4 -0
  80. package/dist/layout/navbar/navbar.d.ts +205 -0
  81. package/dist/layout/navbar/navbar.js +98 -0
  82. package/dist/layout/sidebar/NavGroup.svelte +97 -0
  83. package/dist/layout/sidebar/NavGroup.svelte.d.ts +4 -0
  84. package/dist/layout/sidebar/NavItem.svelte +29 -0
  85. package/dist/layout/sidebar/NavItem.svelte.d.ts +4 -0
  86. package/dist/layout/sidebar/Sidebar.svelte +139 -0
  87. package/dist/layout/sidebar/Sidebar.svelte.d.ts +4 -0
  88. package/dist/layout/table/Cells.svelte +111 -0
  89. package/dist/layout/table/Cells.svelte.d.ts +27 -0
  90. package/dist/layout/table/Table.svelte +413 -0
  91. package/dist/layout/table/Table.svelte.d.ts +4 -0
  92. package/dist/layout/table/table.d.ts +284 -0
  93. package/dist/layout/table/table.js +141 -0
  94. package/dist/layout/tabs/Tab.svelte +57 -0
  95. package/dist/layout/tabs/Tab.svelte.d.ts +4 -0
  96. package/dist/layout/tabs/TabContent.svelte +31 -0
  97. package/dist/layout/tabs/TabContent.svelte.d.ts +4 -0
  98. package/dist/layout/tabs/TabGroup.svelte +57 -0
  99. package/dist/layout/tabs/TabGroup.svelte.d.ts +4 -0
  100. package/dist/layout/tabs/tabs.d.ts +155 -0
  101. package/dist/layout/tabs/tabs.js +156 -0
  102. package/dist/modal/Modal.svelte +207 -0
  103. package/dist/modal/Modal.svelte.d.ts +4 -0
  104. package/dist/modal/modal.d.ts +211 -0
  105. package/dist/modal/modal.js +81 -0
  106. package/dist/sonner/sonner.svelte +13 -0
  107. package/dist/sonner/sonner.svelte.d.ts +4 -0
  108. package/dist/types/variants.d.ts +1 -0
  109. package/dist/types/variants.js +1 -0
  110. package/dist/variants.d.ts +30 -0
  111. package/dist/variants.js +36 -0
  112. package/package.json +104 -102
  113. package/dist/layout/Card.svelte +0 -179
  114. package/dist/layout/Card.svelte.d.ts +0 -208
  115. package/dist/layout/index.d.ts +0 -1
  116. package/dist/layout/index.js +0 -1
@@ -0,0 +1,181 @@
1
+ export declare const badge: import("tailwind-variants").TVReturnType<{
2
+ size: {
3
+ xs: {
4
+ base: string;
5
+ icon: string;
6
+ };
7
+ sm: {
8
+ base: string;
9
+ icon: string;
10
+ };
11
+ base: {
12
+ base: string;
13
+ icon: string;
14
+ };
15
+ lg: {
16
+ base: string;
17
+ icon: string;
18
+ };
19
+ xl: {
20
+ base: string;
21
+ icon: string;
22
+ };
23
+ '2xl': {
24
+ base: string;
25
+ icon: string;
26
+ };
27
+ };
28
+ color: {
29
+ default: {
30
+ base: string;
31
+ icon: string;
32
+ };
33
+ primary: {
34
+ base: string;
35
+ icon: string;
36
+ };
37
+ secondary: {
38
+ base: string;
39
+ icon: string;
40
+ };
41
+ success: {
42
+ base: string;
43
+ icon: string;
44
+ };
45
+ warning: {
46
+ base: string;
47
+ icon: string;
48
+ };
49
+ danger: {
50
+ base: string;
51
+ icon: string;
52
+ };
53
+ info: {
54
+ base: string;
55
+ icon: string;
56
+ };
57
+ };
58
+ }, {
59
+ base: string;
60
+ icon: string;
61
+ }, undefined, {
62
+ size: {
63
+ xs: {
64
+ base: string;
65
+ icon: string;
66
+ };
67
+ sm: {
68
+ base: string;
69
+ icon: string;
70
+ };
71
+ base: {
72
+ base: string;
73
+ icon: string;
74
+ };
75
+ lg: {
76
+ base: string;
77
+ icon: string;
78
+ };
79
+ xl: {
80
+ base: string;
81
+ icon: string;
82
+ };
83
+ '2xl': {
84
+ base: string;
85
+ icon: string;
86
+ };
87
+ };
88
+ color: {
89
+ default: {
90
+ base: string;
91
+ icon: string;
92
+ };
93
+ primary: {
94
+ base: string;
95
+ icon: string;
96
+ };
97
+ secondary: {
98
+ base: string;
99
+ icon: string;
100
+ };
101
+ success: {
102
+ base: string;
103
+ icon: string;
104
+ };
105
+ warning: {
106
+ base: string;
107
+ icon: string;
108
+ };
109
+ danger: {
110
+ base: string;
111
+ icon: string;
112
+ };
113
+ info: {
114
+ base: string;
115
+ icon: string;
116
+ };
117
+ };
118
+ }, {
119
+ base: string;
120
+ icon: string;
121
+ }, import("tailwind-variants").TVReturnType<{
122
+ size: {
123
+ xs: {
124
+ base: string;
125
+ icon: string;
126
+ };
127
+ sm: {
128
+ base: string;
129
+ icon: string;
130
+ };
131
+ base: {
132
+ base: string;
133
+ icon: string;
134
+ };
135
+ lg: {
136
+ base: string;
137
+ icon: string;
138
+ };
139
+ xl: {
140
+ base: string;
141
+ icon: string;
142
+ };
143
+ '2xl': {
144
+ base: string;
145
+ icon: string;
146
+ };
147
+ };
148
+ color: {
149
+ default: {
150
+ base: string;
151
+ icon: string;
152
+ };
153
+ primary: {
154
+ base: string;
155
+ icon: string;
156
+ };
157
+ secondary: {
158
+ base: string;
159
+ icon: string;
160
+ };
161
+ success: {
162
+ base: string;
163
+ icon: string;
164
+ };
165
+ warning: {
166
+ base: string;
167
+ icon: string;
168
+ };
169
+ danger: {
170
+ base: string;
171
+ icon: string;
172
+ };
173
+ info: {
174
+ base: string;
175
+ icon: string;
176
+ };
177
+ };
178
+ }, {
179
+ base: string;
180
+ icon: string;
181
+ }, undefined, unknown, unknown, undefined>>;
@@ -0,0 +1,65 @@
1
+ import { tv } from 'tailwind-variants';
2
+ export const badge = tv({
3
+ slots: {
4
+ base: 'w-min inline-flex items-center justify-center whitespace-nowrap',
5
+ icon: 'h-4 w-4'
6
+ },
7
+ variants: {
8
+ size: {
9
+ xs: {
10
+ base: 'h-4 px-1.5 text-xs rounded gap-0.5',
11
+ icon: 'h-2.5 w-2.5'
12
+ },
13
+ sm: {
14
+ base: 'h-5 px-2 text-xs rounded gap-1',
15
+ icon: 'h-3 w-3'
16
+ },
17
+ base: {
18
+ base: 'h-6 px-2.5 text-sm rounded-md gap-1.5',
19
+ icon: 'h-3.5 w-3.5'
20
+ },
21
+ lg: {
22
+ base: 'h-7 px-3 text-base rounded-lg gap-2',
23
+ icon: 'h-4 w-4'
24
+ },
25
+ xl: {
26
+ base: 'h-8 px-3.5 text-lg rounded-xl gap-2.5',
27
+ icon: 'h-5 w-5'
28
+ },
29
+ '2xl': {
30
+ base: 'h-10 px-4 text-xl rounded-2xl gap-3',
31
+ icon: 'h-6 w-6'
32
+ }
33
+ },
34
+ color: {
35
+ default: {
36
+ base: 'bg-default-50 text-default-700',
37
+ icon: 'text-default-700'
38
+ },
39
+ primary: {
40
+ base: 'bg-primary-50 text-primary-700',
41
+ icon: 'text-primary-700'
42
+ },
43
+ secondary: {
44
+ base: 'bg-secondary-50 text-secondary-700',
45
+ icon: 'text-secondary-700'
46
+ },
47
+ success: {
48
+ base: 'bg-success-50 text-success-700',
49
+ icon: 'text-success-700'
50
+ },
51
+ warning: {
52
+ base: 'bg-warning-50 text-warning-700',
53
+ icon: 'text-warning-700'
54
+ },
55
+ danger: {
56
+ base: 'bg-danger-50 text-danger-700',
57
+ icon: 'text-danger-700'
58
+ },
59
+ info: {
60
+ base: 'bg-info-50 text-info-700',
61
+ icon: 'text-info-700'
62
+ }
63
+ }
64
+ }
65
+ });
@@ -0,0 +1,267 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../helper/cls.js';
3
+ import { fly } from 'svelte/transition';
4
+ import type { DropdownMenuProps, DropdownItem } from '../../index.js';
5
+ import { dropdownMenu } from '../../index.js';
6
+ import { onMount, onDestroy } from 'svelte';
7
+ import { Size } from '../../variants.js';
8
+
9
+ let {
10
+ sections = [],
11
+ open: isOpen = $bindable(false),
12
+ label = '',
13
+ icon: Icon,
14
+ containerClass = '',
15
+ itemClass = '',
16
+ class: className = '',
17
+ size = Size.BASE,
18
+ disabled = false,
19
+ position = 'bottom-left',
20
+ width = 'w-56',
21
+ header
22
+ }: DropdownMenuProps = $props();
23
+
24
+ // Determine if we're in icon-only mode
25
+ const iconOnly = $derived(!label && !!Icon);
26
+
27
+ let dropdownRef = $state<HTMLDivElement | undefined>();
28
+ let triggerRef = $state<HTMLDivElement | undefined>();
29
+ let portalEl = $state<HTMLDivElement | undefined>();
30
+ let triggerRect = $state<DOMRect | null>(null);
31
+
32
+ const {
33
+ base,
34
+ trigger,
35
+ container,
36
+ section,
37
+ item,
38
+ itemIcon,
39
+ header: headerClass,
40
+ headerTitle,
41
+ headerSubtitle
42
+ } = $derived(
43
+ dropdownMenu({
44
+ position,
45
+ size,
46
+ isOpen,
47
+ iconOnly
48
+ })
49
+ );
50
+
51
+ const baseClass = $derived(cn(base(), className));
52
+ const triggerClass_ = $derived(cn(trigger(), ''));
53
+ const containerClass_ = $derived(cn(container(), width, containerClass, 'shadow-lg'));
54
+ const sectionClass = $derived(cn(section()));
55
+ const itemClass_ = $derived(cn(item(), itemClass));
56
+ const iconClass = $derived(cn(itemIcon()));
57
+ const headerClass_ = $derived(cn(headerClass(), header?.class ?? ''));
58
+ const headerTitleClass = $derived(cn(headerTitle(), header?.titleClass ?? ''));
59
+ const headerSubtitleClass = $derived(cn(headerSubtitle(), header?.subtitleClass ?? ''));
60
+
61
+ const dropdownStyles = $derived.by(() => {
62
+ if (!triggerRect) return '';
63
+
64
+ const { top, left, bottom, right, width: triggerWidth, height: triggerHeight } = triggerRect;
65
+ const viewportWidth = window.innerWidth;
66
+ const viewportHeight = window.innerHeight;
67
+
68
+ // Default to 14rem (w-56) if not specified
69
+ const dropdownWidth = width ? parseInt(width.replace(/[^\d]/g, '')) * 0.25 : 14; // Convert Tailwind widths to rem
70
+ const dropdownWidthPx = dropdownWidth * 16;
71
+
72
+ let posStyles = `position: fixed; z-index: 9999;`;
73
+
74
+ if (position.includes('bottom')) {
75
+ posStyles += `top: ${bottom}px;`;
76
+ } else if (position.includes('top')) {
77
+ posStyles += `top: ${top - triggerHeight}px; transform: translateY(-100%);`;
78
+ }
79
+
80
+ if (position.includes('left')) {
81
+ if (left + dropdownWidthPx > viewportWidth - 20) {
82
+ posStyles += `left: auto; right: ${viewportWidth - right}px;`;
83
+ } else {
84
+ posStyles += `left: ${left}px;`;
85
+ }
86
+ } else if (position.includes('right')) {
87
+ if (right - dropdownWidthPx < 20) {
88
+ posStyles += `left: ${left}px; right: auto;`;
89
+ } else {
90
+ posStyles += `left: ${right - triggerWidth}px;`;
91
+ }
92
+ } else {
93
+ const centeredLeft = left + (triggerWidth / 2);
94
+ if (centeredLeft + (dropdownWidthPx / 2) > viewportWidth - 20) {
95
+ posStyles += `right: 20px; left: auto;`;
96
+ } else if (centeredLeft - (dropdownWidthPx / 2) < 20) {
97
+ posStyles += `left: 20px; right: auto;`;
98
+ } else {
99
+ posStyles += `left: ${centeredLeft}px; transform: translateX(-50%);`;
100
+ }
101
+ }
102
+
103
+ const maxHeight = viewportHeight - bottom - 20; // 20px padding from bottom
104
+ if (position.includes('bottom')) {
105
+ posStyles += `max-height: ${maxHeight}px; overflow-y: auto;`;
106
+ }
107
+
108
+ return posStyles;
109
+ });
110
+
111
+ function handleToggle() {
112
+ if (disabled) return;
113
+ isOpen = !isOpen;
114
+
115
+ if (isOpen) {
116
+ setTimeout(updatePosition, 0); // Use setTimeout to ensure DOM is updated
117
+ }
118
+ }
119
+
120
+ function handleClickOutside(event: MouseEvent) {
121
+ if (isOpen &&
122
+ dropdownRef &&
123
+ !dropdownRef.contains(event.target as Node) &&
124
+ triggerRef &&
125
+ !triggerRef.contains(event.target as Node)) {
126
+ isOpen = false;
127
+ }
128
+ }
129
+
130
+ function handleItemClick(item: DropdownItem) {
131
+ if (item.onclick) item.onclick();
132
+ isOpen = false;
133
+ }
134
+
135
+ function updatePosition() {
136
+ if (triggerRef) {
137
+ triggerRect = triggerRef.getBoundingClientRect();
138
+ }
139
+ }
140
+
141
+ function renderPortalDropdown() {
142
+ if (!portalEl || !document.body.contains(portalEl)) {
143
+ portalEl = document.createElement('div');
144
+ portalEl.id = 'dropdown-portal';
145
+ portalEl.style.position = 'fixed';
146
+ portalEl.style.top = '0';
147
+ portalEl.style.left = '0';
148
+ portalEl.style.width = '100%';
149
+ portalEl.style.height = '100%';
150
+ portalEl.style.pointerEvents = 'none';
151
+ portalEl.style.zIndex = '9999';
152
+ document.body.appendChild(portalEl);
153
+ }
154
+ }
155
+
156
+ onMount(() => {
157
+ renderPortalDropdown();
158
+ window.addEventListener('scroll', updatePosition, true);
159
+ window.addEventListener('resize', updatePosition);
160
+ });
161
+
162
+ onDestroy(() => {
163
+ if (!triggerRef) return;
164
+ window.removeEventListener('scroll', updatePosition, true);
165
+ window.removeEventListener('resize', updatePosition);
166
+ if (portalEl && document.body.contains(portalEl)) {
167
+ document.body.removeChild(portalEl);
168
+ }
169
+ });
170
+
171
+ $effect(() => {
172
+ if (isOpen) {
173
+ renderPortalDropdown();
174
+ updatePosition();
175
+ }
176
+ });
177
+ </script>
178
+
179
+ <svelte:window onclick={handleClickOutside} />
180
+
181
+ <div class={baseClass}>
182
+ <div bind:this={triggerRef}>
183
+ <button
184
+ type="button"
185
+ id="menu-button"
186
+ aria-expanded={isOpen}
187
+ aria-haspopup="true"
188
+ class={triggerClass_}
189
+ onclick={handleToggle}
190
+ {disabled}
191
+ >
192
+ {#if label}
193
+ {label}
194
+ {/if}
195
+
196
+ {#if Icon}
197
+ <Icon class="size-5 text-default-400" />
198
+ {:else if label}
199
+ <svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 28 28" class="size-5">
200
+ <path fill="currentColor"
201
+ d="M4.22 9.47a.75.75 0 0 1 1.06 0L14 18.19l8.72-8.72a.75.75 0 1 1 1.06 1.06l-9.25 9.25a.75.75 0 0 1-1.06 0l-9.25-9.25a.75.75 0 0 1 0-1.06" />
202
+ </svg>
203
+ {/if}
204
+ </button>
205
+ </div>
206
+ </div>
207
+
208
+ {#if isOpen && portalEl}
209
+ <div
210
+ bind:this={dropdownRef}
211
+ class={containerClass_}
212
+ role="menu"
213
+ aria-orientation="vertical"
214
+ aria-labelledby="menu-button"
215
+ style={dropdownStyles}
216
+ transition:fly={{ duration: 150, y: 5, opacity: 0 }}
217
+ >
218
+ {#if header}
219
+ <button class={headerClass_} onclick={header.onclick} aria-label="Header Actions">
220
+ {#if header.content}
221
+ {@render header.content()}
222
+ {:else}
223
+ {#if header.title}
224
+ <span class={headerTitleClass}>{header.title}</span>
225
+ {/if}
226
+ {#if header.subtitle}
227
+ <span class={headerSubtitleClass}>{header.subtitle}</span>
228
+ {/if}
229
+ {/if}
230
+ </button>
231
+ {/if}
232
+
233
+ {#each sections as section_, sectionIndex (sectionIndex)}
234
+ <div class={sectionClass}>
235
+ {#each section_.items as menuItem, itemIndex (itemIndex)}
236
+ {@const itemProps = {
237
+ class: itemClass_,
238
+ role: 'menuitem',
239
+ tabindex: -1,
240
+ id: `menu-item-${sectionIndex}-${itemIndex}`,
241
+ 'data-active': menuItem.active
242
+ }}
243
+ {#if menuItem.href}
244
+ <a href={menuItem.href} {...itemProps}>
245
+ {@render DropItemContent(menuItem)}
246
+ </a>
247
+ {:else}
248
+ <button
249
+ type="button"
250
+ onclick={() => handleItemClick(menuItem)}
251
+ disabled={!menuItem.onclick} {...itemProps}>
252
+ {@render DropItemContent(menuItem)}
253
+ </button>
254
+ {/if}
255
+ {/each}
256
+ </div>
257
+ {/each}
258
+ </div>
259
+ {/if}
260
+
261
+ {#snippet DropItemContent(menuItem: DropdownItem)}
262
+ {#if menuItem.icon}
263
+ {@const ItemIcon = menuItem.icon}
264
+ <ItemIcon class={iconClass} />
265
+ {/if}
266
+ <span class="truncate">{menuItem.label}</span>
267
+ {/snippet}
@@ -0,0 +1,4 @@
1
+ import type { DropdownMenuProps } from '../../index.js';
2
+ declare const Dropdown: import("svelte").Component<DropdownMenuProps, {}, "open">;
3
+ type Dropdown = ReturnType<typeof Dropdown>;
4
+ export default Dropdown;