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

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 (102) hide show
  1. package/README.md +229 -96
  2. package/dist/button/Button.svelte +46 -0
  3. package/dist/button/Button.svelte.d.ts +4 -0
  4. package/dist/button/button.d.ts +136 -0
  5. package/dist/button/button.js +167 -0
  6. package/dist/button/index.d.ts +1 -0
  7. package/dist/button/index.js +1 -0
  8. package/dist/drawer/Drawer.svelte +213 -0
  9. package/dist/drawer/Drawer.svelte.d.ts +4 -0
  10. package/dist/drawer/drawer.d.ts +177 -0
  11. package/dist/drawer/drawer.js +80 -0
  12. package/dist/drawer/index.d.ts +2 -0
  13. package/dist/drawer/index.js +1 -0
  14. package/dist/elements/badge/Badge.svelte +35 -0
  15. package/dist/elements/badge/Badge.svelte.d.ts +4 -0
  16. package/dist/elements/badge/badge.d.ts +193 -0
  17. package/dist/elements/badge/badge.js +65 -0
  18. package/dist/elements/badge/index.d.ts +2 -0
  19. package/dist/elements/badge/index.js +2 -0
  20. package/dist/elements/dropdown/Dropdown.svelte +272 -0
  21. package/dist/elements/dropdown/Dropdown.svelte.d.ts +4 -0
  22. package/dist/elements/dropdown/Select.svelte +230 -0
  23. package/dist/elements/dropdown/Select.svelte.d.ts +4 -0
  24. package/dist/elements/dropdown/dropdown.d.ts +274 -0
  25. package/dist/elements/dropdown/dropdown.js +89 -0
  26. package/dist/elements/dropdown/index.d.ts +3 -0
  27. package/dist/elements/dropdown/index.js +2 -0
  28. package/dist/elements/dropdown/select.d.ts +220 -0
  29. package/dist/elements/dropdown/select.js +74 -0
  30. package/dist/header/Breadcrumbs.svelte +72 -0
  31. package/dist/header/Breadcrumbs.svelte.d.ts +4 -0
  32. package/dist/header/PageHeader.svelte +30 -0
  33. package/dist/header/PageHeader.svelte.d.ts +4 -0
  34. package/dist/header/breadcrumbs.d.ts +220 -0
  35. package/dist/header/breadcrumbs.js +81 -0
  36. package/dist/header/index.d.ts +4 -0
  37. package/dist/header/index.js +2 -0
  38. package/dist/header/pageheaders.d.ts +10 -0
  39. package/dist/header/pageheaders.js +1 -0
  40. package/dist/helper/cls.d.ts +1 -0
  41. package/dist/helper/cls.js +4 -0
  42. package/dist/helper/nav.svelte.d.ts +6 -0
  43. package/dist/helper/nav.svelte.js +23 -0
  44. package/dist/index.d.ts +10 -1
  45. package/dist/index.js +18 -1
  46. package/dist/layout/card/Card.svelte +44 -0
  47. package/dist/layout/card/Card.svelte.d.ts +4 -0
  48. package/dist/layout/card/StatsCard.svelte +236 -0
  49. package/dist/layout/card/StatsCard.svelte.d.ts +4 -0
  50. package/dist/layout/card/card.d.ts +139 -0
  51. package/dist/layout/card/card.js +50 -0
  52. package/dist/layout/card/index.d.ts +4 -0
  53. package/dist/layout/card/index.js +2 -0
  54. package/dist/layout/card/stats-card.d.ts +208 -0
  55. package/dist/layout/card/stats-card.js +73 -0
  56. package/dist/layout/index.d.ts +7 -1
  57. package/dist/layout/index.js +7 -1
  58. package/dist/layout/navbar/Navbar.svelte +206 -0
  59. package/dist/layout/navbar/Navbar.svelte.d.ts +4 -0
  60. package/dist/layout/navbar/index.d.ts +2 -0
  61. package/dist/layout/navbar/index.js +2 -0
  62. package/dist/layout/navbar/navbar.d.ts +228 -0
  63. package/dist/layout/navbar/navbar.js +98 -0
  64. package/dist/layout/sidebar/NavGroup.svelte +101 -0
  65. package/dist/layout/sidebar/NavGroup.svelte.d.ts +4 -0
  66. package/dist/layout/sidebar/NavItem.svelte +29 -0
  67. package/dist/layout/sidebar/NavItem.svelte.d.ts +4 -0
  68. package/dist/layout/sidebar/Sidebar.svelte +145 -0
  69. package/dist/layout/sidebar/Sidebar.svelte.d.ts +4 -0
  70. package/dist/layout/sidebar/index.d.ts +2 -0
  71. package/dist/layout/sidebar/index.js +1 -0
  72. package/dist/layout/sidebar/sidebar.d.ts +46 -0
  73. package/dist/layout/sidebar/sidebar.js +1 -0
  74. package/dist/layout/table/Cells.svelte +111 -0
  75. package/dist/layout/table/Cells.svelte.d.ts +27 -0
  76. package/dist/layout/table/Table.svelte +413 -0
  77. package/dist/layout/table/Table.svelte.d.ts +4 -0
  78. package/dist/layout/table/index.d.ts +3 -0
  79. package/dist/layout/table/index.js +2 -0
  80. package/dist/layout/table/table.d.ts +303 -0
  81. package/dist/layout/table/table.js +149 -0
  82. package/dist/layout/tabs/Tab.svelte +57 -0
  83. package/dist/layout/tabs/Tab.svelte.d.ts +4 -0
  84. package/dist/layout/tabs/TabContent.svelte +31 -0
  85. package/dist/layout/tabs/TabContent.svelte.d.ts +4 -0
  86. package/dist/layout/tabs/TabGroup.svelte +57 -0
  87. package/dist/layout/tabs/TabGroup.svelte.d.ts +4 -0
  88. package/dist/layout/tabs/index.d.ts +3 -0
  89. package/dist/layout/tabs/index.js +3 -0
  90. package/dist/layout/tabs/tabs.d.ts +155 -0
  91. package/dist/layout/tabs/tabs.js +156 -0
  92. package/dist/modal/Modal.svelte +206 -0
  93. package/dist/modal/Modal.svelte.d.ts +4 -0
  94. package/dist/modal/index.d.ts +1 -0
  95. package/dist/modal/index.js +1 -0
  96. package/dist/modal/modal.d.ts +234 -0
  97. package/dist/modal/modal.js +81 -0
  98. package/dist/types/variants.d.ts +21 -0
  99. package/dist/types/variants.js +19 -0
  100. package/package.json +100 -102
  101. package/dist/layout/Card.svelte +0 -179
  102. package/dist/layout/Card.svelte.d.ts +0 -208
@@ -0,0 +1,155 @@
1
+ import type { ClassValue } from 'tailwind-variants';
2
+ import type { Component, Snippet } from 'svelte';
3
+ import type { VariantColors, VariantSizes } from '../../types/variants.js';
4
+ export type TabItem = {
5
+ value: string;
6
+ label: string;
7
+ icon?: Component;
8
+ disabled?: boolean;
9
+ };
10
+ export type TabProps = {
11
+ value: string;
12
+ label: string;
13
+ icon?: Component;
14
+ selected?: boolean;
15
+ disabled?: boolean;
16
+ color?: VariantColors;
17
+ size?: VariantSizes;
18
+ onclick?: (event: Event) => void;
19
+ };
20
+ export type TabsProps = {
21
+ tabs: TabItem[];
22
+ selected?: string;
23
+ color?: VariantColors;
24
+ size?: VariantSizes;
25
+ class?: ClassValue;
26
+ listClass?: ClassValue;
27
+ triggerClass?: ClassValue;
28
+ panelClass?: ClassValue;
29
+ children?: Snippet<[active: string]>;
30
+ onchange?: (value: string) => void;
31
+ };
32
+ export type TabContentProps = {
33
+ value: string;
34
+ persisted?: boolean;
35
+ panelClass?: ClassValue;
36
+ children?: Snippet<[value: string]>;
37
+ };
38
+ export declare const tabs: import("tailwind-variants").TVReturnType<{
39
+ color: {
40
+ primary: {};
41
+ secondary: {};
42
+ success: {};
43
+ warning: {};
44
+ danger: {};
45
+ info: {};
46
+ default: {};
47
+ };
48
+ size: {
49
+ xs: {
50
+ trigger: string;
51
+ };
52
+ sm: {
53
+ trigger: string;
54
+ };
55
+ base: {
56
+ trigger: string;
57
+ };
58
+ lg: {
59
+ trigger: string;
60
+ };
61
+ xl: {
62
+ trigger: string;
63
+ };
64
+ '2xl': {
65
+ trigger: string;
66
+ };
67
+ };
68
+ selected: {
69
+ true: {};
70
+ false: {};
71
+ };
72
+ }, {
73
+ base: string;
74
+ list: string;
75
+ trigger: string;
76
+ panel: string;
77
+ }, undefined, {
78
+ color: {
79
+ primary: {};
80
+ secondary: {};
81
+ success: {};
82
+ warning: {};
83
+ danger: {};
84
+ info: {};
85
+ default: {};
86
+ };
87
+ size: {
88
+ xs: {
89
+ trigger: string;
90
+ };
91
+ sm: {
92
+ trigger: string;
93
+ };
94
+ base: {
95
+ trigger: string;
96
+ };
97
+ lg: {
98
+ trigger: string;
99
+ };
100
+ xl: {
101
+ trigger: string;
102
+ };
103
+ '2xl': {
104
+ trigger: string;
105
+ };
106
+ };
107
+ selected: {
108
+ true: {};
109
+ false: {};
110
+ };
111
+ }, {
112
+ base: string;
113
+ list: string;
114
+ trigger: string;
115
+ panel: string;
116
+ }, import("tailwind-variants").TVReturnType<{
117
+ color: {
118
+ primary: {};
119
+ secondary: {};
120
+ success: {};
121
+ warning: {};
122
+ danger: {};
123
+ info: {};
124
+ default: {};
125
+ };
126
+ size: {
127
+ xs: {
128
+ trigger: string;
129
+ };
130
+ sm: {
131
+ trigger: string;
132
+ };
133
+ base: {
134
+ trigger: string;
135
+ };
136
+ lg: {
137
+ trigger: string;
138
+ };
139
+ xl: {
140
+ trigger: string;
141
+ };
142
+ '2xl': {
143
+ trigger: string;
144
+ };
145
+ };
146
+ selected: {
147
+ true: {};
148
+ false: {};
149
+ };
150
+ }, {
151
+ base: string;
152
+ list: string;
153
+ trigger: string;
154
+ panel: string;
155
+ }, undefined, unknown, unknown, undefined>>;
@@ -0,0 +1,156 @@
1
+ import { tv } from 'tailwind-variants';
2
+ export const tabs = tv({
3
+ slots: {
4
+ base: 'w-full',
5
+ list: 'flex border-b border-default-200',
6
+ trigger: 'inline-flex items-center px-3 py-2 text-sm transition-all duration-200 ease-in-out cursor-pointer -mb-px border-b-2 border-transparent',
7
+ panel: 'mt-4 px-3'
8
+ },
9
+ variants: {
10
+ color: {
11
+ primary: {},
12
+ secondary: {},
13
+ success: {},
14
+ warning: {},
15
+ danger: {},
16
+ info: {},
17
+ default: {}
18
+ },
19
+ size: {
20
+ xs: {
21
+ trigger: 'px-2 py-1 text-xs'
22
+ },
23
+ sm: {
24
+ trigger: 'px-2 py-1 text-xs'
25
+ },
26
+ base: {
27
+ trigger: 'px-3 py-2 text-sm'
28
+ },
29
+ lg: {
30
+ trigger: 'px-4 py-2.5 text-base'
31
+ },
32
+ xl: {
33
+ trigger: 'px-5 py-3 text-lg'
34
+ },
35
+ '2xl': {
36
+ trigger: 'px-6 py-4 text-xl'
37
+ }
38
+ },
39
+ selected: {
40
+ true: {},
41
+ false: {}
42
+ }
43
+ },
44
+ compoundVariants: [
45
+ // LINE VARIANT - PRIMARY
46
+ {
47
+ color: 'primary',
48
+ selected: true,
49
+ class: {
50
+ trigger: 'text-primary-600 border-b-2 border-primary-500'
51
+ }
52
+ },
53
+ {
54
+ color: 'primary',
55
+ selected: false,
56
+ class: {
57
+ trigger: 'text-default-500 hover:text-primary-500'
58
+ }
59
+ },
60
+ // LINE VARIANT - SECONDARY
61
+ {
62
+ color: 'secondary',
63
+ selected: true,
64
+ class: {
65
+ trigger: 'text-secondary-600 border-b-2 border-secondary-500'
66
+ }
67
+ },
68
+ {
69
+ color: 'secondary',
70
+ selected: false,
71
+ class: {
72
+ trigger: 'text-default-500 hover:text-secondary-500'
73
+ }
74
+ },
75
+ // LINE VARIANT - SUCCESS
76
+ {
77
+ color: 'success',
78
+ selected: true,
79
+ class: {
80
+ trigger: 'text-success-600 border-b-2 border-success-500'
81
+ }
82
+ },
83
+ {
84
+ color: 'success',
85
+ selected: false,
86
+ class: {
87
+ trigger: 'text-default-500 hover:text-success-500'
88
+ }
89
+ },
90
+ // LINE VARIANT - WARNING
91
+ {
92
+ color: 'warning',
93
+ selected: true,
94
+ class: {
95
+ trigger: 'text-warning-600 border-b-2 border-warning-500'
96
+ }
97
+ },
98
+ {
99
+ color: 'warning',
100
+ selected: false,
101
+ class: {
102
+ trigger: 'text-default-500 hover:text-warning-500'
103
+ }
104
+ },
105
+ // LINE VARIANT - DANGER
106
+ {
107
+ color: 'danger',
108
+ selected: true,
109
+ class: {
110
+ trigger: 'text-danger-600 border-b-2 border-danger-500'
111
+ }
112
+ },
113
+ {
114
+ color: 'danger',
115
+ selected: false,
116
+ class: {
117
+ trigger: 'text-default-500 hover:text-danger-500'
118
+ }
119
+ },
120
+ // LINE VARIANT - INFO
121
+ {
122
+ color: 'info',
123
+ selected: true,
124
+ class: {
125
+ trigger: 'text-info-600 border-b-2 border-info-500'
126
+ }
127
+ },
128
+ {
129
+ color: 'info',
130
+ selected: false,
131
+ class: {
132
+ trigger: 'text-default-500 hover:text-info-500'
133
+ }
134
+ },
135
+ // LINE VARIANT - DEFAULT
136
+ {
137
+ color: 'default',
138
+ selected: true,
139
+ class: {
140
+ trigger: 'text-default-600 border-b-2 border-default-500'
141
+ }
142
+ },
143
+ {
144
+ color: 'default',
145
+ selected: false,
146
+ class: {
147
+ trigger: 'text-default-500 hover:text-default-700'
148
+ }
149
+ }
150
+ ],
151
+ defaultVariants: {
152
+ color: 'primary',
153
+ size: 'base',
154
+ selected: false
155
+ }
156
+ });
@@ -0,0 +1,206 @@
1
+ <script lang="ts">
2
+ import { onMount, onDestroy, tick } from 'svelte';
3
+ import { browser } from '$app/environment';
4
+ import { fade, scale } from 'svelte/transition';
5
+ import { quintOut } from 'svelte/easing';
6
+ import { cn } from '../helper/cls.js';
7
+ import { modal, type MakeModalProps } from './modal.js';
8
+
9
+ let {
10
+ open = $bindable(false),
11
+ onclose: onClose = () => {},
12
+ title,
13
+ description,
14
+ position = 'center',
15
+ size = 'lg',
16
+ children,
17
+ header,
18
+ custom,
19
+ class: className = '',
20
+ backdropclass: backdropClassName = '',
21
+ contentclass: contentClassName = '',
22
+ headerclass: headerClassName = '',
23
+ titleclass: titleClass = '',
24
+ bodyclass: bodyClassName = ''
25
+ }: MakeModalProps = $props();
26
+
27
+ let modalElement: HTMLDivElement | undefined = $state();
28
+
29
+ const {
30
+ base,
31
+ backdrop,
32
+ contentWrapper,
33
+ content,
34
+ header: headerVClass,
35
+ title: titleVClass,
36
+ closeButton,
37
+ body
38
+ } = $derived(
39
+ modal({
40
+ open,
41
+ position,
42
+ size
43
+ })
44
+ );
45
+
46
+ const closeButtonClasses = $derived(closeButton());
47
+ const contentItemClass = $derived(content());
48
+ const baseClass = $derived(cn(base(), className));
49
+ const backdropClass = $derived(cn(backdrop(), backdropClassName));
50
+ const contentWrapperClass = $derived(cn(contentWrapper(), contentClassName));
51
+ const headerClass = $derived(cn(headerVClass(), headerClassName));
52
+ const titleClasses = $derived(cn(titleVClass(), titleClass));
53
+ const bodyClasses = $derived(cn(body(), bodyClassName));
54
+
55
+ function handleBackdropClick(e: MouseEvent) {
56
+ if (e.target === e.currentTarget) {
57
+ onClose();
58
+ }
59
+ }
60
+
61
+ function handleEscapeKey(e: KeyboardEvent) {
62
+ if (e.key === 'Escape' && open) {
63
+ onClose();
64
+ }
65
+ }
66
+
67
+ function handleCloseClick() {
68
+ onClose();
69
+ }
70
+
71
+ // Focus trap functionality
72
+ let previouslyFocusedElement: HTMLElement | null = null;
73
+
74
+ function trapFocus(element: HTMLElement) {
75
+ const focusableElements = element.querySelectorAll(
76
+ 'a[href], button, input, textarea, select, details, [tabindex]:not([tabindex="-1"])'
77
+ );
78
+
79
+ if (focusableElements.length === 0) return;
80
+
81
+ const firstElement = focusableElements[0] as HTMLElement;
82
+ const lastElement = focusableElements[focusableElements.length - 1] as HTMLElement;
83
+
84
+ function handleTabKey(e: KeyboardEvent) {
85
+ if (e.key !== 'Tab') return;
86
+
87
+ if (e.shiftKey) {
88
+ if (document.activeElement === firstElement) {
89
+ lastElement.focus();
90
+ e.preventDefault();
91
+ }
92
+ } else {
93
+ if (document.activeElement === lastElement) {
94
+ firstElement.focus();
95
+ e.preventDefault();
96
+ }
97
+ }
98
+ }
99
+
100
+ element.addEventListener('keydown', handleTabKey);
101
+ firstElement.focus();
102
+
103
+ return () => {
104
+ element.removeEventListener('keydown', handleTabKey);
105
+ };
106
+ }
107
+
108
+ onMount(() => {
109
+ document.addEventListener('keydown', handleEscapeKey);
110
+ return () => {
111
+ document.removeEventListener('keydown', handleEscapeKey);
112
+ };
113
+ });
114
+
115
+ $effect(() => {
116
+ if (!browser) return;
117
+ if (open) {
118
+ previouslyFocusedElement = document.activeElement as HTMLElement;
119
+ document.body.style.overflow = 'hidden';
120
+
121
+ tick().then(() => {
122
+ if (modalElement) {
123
+ trapFocus(modalElement);
124
+ }
125
+ });
126
+ } else {
127
+ document.body.style.overflow = '';
128
+ if (previouslyFocusedElement) {
129
+ previouslyFocusedElement.focus();
130
+ }
131
+ }
132
+ });
133
+
134
+ onDestroy(() => {
135
+ if (browser && document.body.style.overflow === 'hidden') {
136
+ document.body.style.overflow = '';
137
+ }
138
+ });
139
+ </script>
140
+
141
+ {#if browser}
142
+ <div
143
+ class={baseClass}
144
+ bind:this={modalElement}
145
+ role="dialog"
146
+ aria-modal="true"
147
+ aria-labelledby={title ? 'modal-title' : undefined}
148
+ aria-describedby={description ? 'modal-description' : undefined}
149
+ >
150
+ <!-- Backdrop -->
151
+ <button
152
+ class={backdropClass}
153
+ onclick={handleBackdropClick}
154
+ transition:fade={{ duration: 200 }}
155
+ aria-label="Close modal"
156
+ ></button>
157
+
158
+ <!-- Modal content -->
159
+ <div
160
+ class={contentWrapperClass}
161
+ transition:scale={{ duration: 200, easing: quintOut, start: 0.95 }}
162
+ >
163
+ {#if custom}
164
+ {@render custom()}
165
+ {:else}
166
+ <div class={contentItemClass}>
167
+ {#if header || title}
168
+ <div class={headerClass}>
169
+ {#if header}
170
+ {@render header()}
171
+ {:else}
172
+ {#if title}
173
+ <h3 id="modal-title" class={titleClasses}>{title}</h3>
174
+ {/if}
175
+ <button
176
+ type="button"
177
+ class={closeButtonClasses}
178
+ onclick={handleCloseClick}
179
+ aria-label="Close modal"
180
+ >
181
+ <svg
182
+ xmlns="http://www.w3.org/2000/svg"
183
+ width="12"
184
+ height="12"
185
+ viewBox="0 0 12 12"
186
+ >
187
+ <path
188
+ fill="currentColor"
189
+ d="m1.897 2.054l.073-.084a.75.75 0 0 1 .976-.073l.084.073L6 4.939l2.97-2.97a.75.75 0 1 1 1.06 1.061L7.061 6l2.97 2.97a.75.75 0 0 1 .072.976l-.073.084a.75.75 0 0 1-.976.073l-.084-.073L6 7.061l-2.97 2.97A.75.75 0 1 1 1.97 8.97L4.939 6l-2.97-2.97a.75.75 0 0 1-.072-.976l.073-.084z"
190
+ />
191
+ </svg>
192
+ </button>
193
+ {/if}
194
+ </div>
195
+ {/if}
196
+
197
+ {#if children}
198
+ <div class={bodyClasses}>
199
+ {@render children()}
200
+ </div>
201
+ {/if}
202
+ </div>
203
+ {/if}
204
+ </div>
205
+ </div>
206
+ {/if}
@@ -0,0 +1,4 @@
1
+ import { type MakeModalProps } from './modal.js';
2
+ declare const Modal: import("svelte").Component<MakeModalProps, {}, "open">;
3
+ type Modal = ReturnType<typeof Modal>;
4
+ export default Modal;
@@ -0,0 +1 @@
1
+ export { default as Modal } from './Modal.svelte';
@@ -0,0 +1 @@
1
+ export { default as Modal } from './Modal.svelte';