@makolabs/ripple 0.0.1-dev → 0.0.1-dev.10

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 +574 -8
  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 +533 -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 +53 -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 +213 -0
  27. package/dist/elements/file-upload/FileUpload.svelte.d.ts +4 -0
  28. package/dist/elements/progress/Progress.svelte +87 -0
  29. package/dist/elements/progress/Progress.svelte.d.ts +4 -0
  30. package/dist/elements/timeline/Timeline.svelte +92 -0
  31. package/dist/elements/timeline/Timeline.svelte.d.ts +7 -0
  32. package/dist/forms/Checkbox.svelte +54 -0
  33. package/dist/forms/Checkbox.svelte.d.ts +4 -0
  34. package/dist/forms/DateRange.svelte +493 -0
  35. package/dist/forms/DateRange.svelte.d.ts +4 -0
  36. package/dist/forms/Form.svelte +39 -0
  37. package/dist/forms/Form.svelte.d.ts +4 -0
  38. package/dist/forms/Input.svelte +86 -0
  39. package/dist/forms/Input.svelte.d.ts +4 -0
  40. package/dist/forms/NumberInput.svelte +159 -0
  41. package/dist/forms/NumberInput.svelte.d.ts +4 -0
  42. package/dist/forms/RadioInputs.svelte +64 -0
  43. package/dist/forms/RadioInputs.svelte.d.ts +4 -0
  44. package/dist/forms/RadioPill.svelte +66 -0
  45. package/dist/forms/RadioPill.svelte.d.ts +4 -0
  46. package/dist/forms/Slider.svelte +342 -0
  47. package/dist/forms/Slider.svelte.d.ts +4 -0
  48. package/dist/forms/Tags.svelte +181 -0
  49. package/dist/forms/Tags.svelte.d.ts +4 -0
  50. package/dist/forms/Toggle.svelte +132 -0
  51. package/dist/forms/Toggle.svelte.d.ts +4 -0
  52. package/dist/forms/slider.d.ts +143 -0
  53. package/dist/forms/slider.js +62 -0
  54. package/dist/header/Breadcrumbs.svelte +73 -0
  55. package/dist/header/Breadcrumbs.svelte.d.ts +4 -0
  56. package/dist/header/PageHeader.svelte +30 -0
  57. package/dist/header/PageHeader.svelte.d.ts +4 -0
  58. package/dist/header/breadcrumbs.d.ts +226 -0
  59. package/dist/header/breadcrumbs.js +87 -0
  60. package/dist/header/pageheaders.d.ts +10 -0
  61. package/dist/header/pageheaders.js +1 -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 +733 -1
  69. package/dist/index.js +61 -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 +265 -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 +206 -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 +303 -0
  93. package/dist/layout/table/table.js +149 -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 +20 -0
  111. package/dist/variants.js +19 -0
  112. package/package.json +32 -4
  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,314 @@
1
+ <script lang="ts">
2
+ import { tick } from 'svelte';
3
+ import { cn } from '../../helper/cls.js';
4
+ import { selectTV } from './select.js';
5
+ import type { SelectItem, SelectProps } from '../../index.js';
6
+ import Badge from '../badge/Badge.svelte';
7
+ import { Size } from '../../variants.js';
8
+
9
+ let {
10
+ items = [],
11
+ value = $bindable(''),
12
+ multiple = false,
13
+ placeholder = 'Select an option',
14
+ searchable = false,
15
+ disabled = false,
16
+ size = Size.BASE,
17
+ class: className = '',
18
+ containerClass = '',
19
+ listClass = '',
20
+ itemClass = '',
21
+ searchInputClass = '',
22
+ icon: Icon,
23
+ iconClass = '',
24
+ triggerClass = '', // recently, just now
25
+ onselect = () => {},
26
+ onopen = () => {},
27
+ onclose = () => {}
28
+ }: SelectProps = $props();
29
+
30
+ let open = $state(false);
31
+ let searchQuery = $state('');
32
+ let selectRef = $state<HTMLDivElement | null>(null);
33
+ let searchInputRef = $state<HTMLInputElement | null>(null);
34
+ let highlightedIndex = $state(-1);
35
+
36
+ // Convert value to array for internal processing if multiple is true
37
+ const valueArray = $derived.by(() => {
38
+ if (multiple) {
39
+ return Array.isArray(value) ? value : value ? [value] : [];
40
+ }
41
+ return typeof value === 'string' ? [value] : [];
42
+ });
43
+
44
+ const { base, trigger, triggerIcon, container, searchInput, list, item, emptyMessage } = $derived(
45
+ selectTV({
46
+ size,
47
+ disabled,
48
+ multiple
49
+ })
50
+ );
51
+
52
+ const baseClass = $derived(cn(base(), className));
53
+ const triggerClass_ = $derived(cn(trigger(), triggerClass));
54
+ const triggerIconClass = $derived(cn(triggerIcon(), iconClass));
55
+ const containerClass_ = $derived(cn(container(), containerClass));
56
+ const searchInputClass_ = $derived(cn(searchInput(), searchInputClass));
57
+ const listClass_ = $derived(cn(list(), listClass));
58
+ const itemClass_ = $derived(cn(item(), itemClass));
59
+ const emptyMessageClass = $derived(cn(emptyMessage()));
60
+
61
+ const selectedItem = $derived(items.find((item) => item.value === value));
62
+ const selectedItems = $derived(items.filter((item) => valueArray.includes(item.value)));
63
+
64
+ const filteredItems = $derived(
65
+ searchable && searchQuery
66
+ ? items.filter((item) => item.label.toLowerCase().includes(searchQuery.toLowerCase()))
67
+ : items
68
+ );
69
+
70
+ function handleToggle() {
71
+ if (disabled) return;
72
+ open = !open;
73
+
74
+ if (open) {
75
+ highlightedIndex = !multiple ? filteredItems.findIndex((item) => item.value === value) : -1;
76
+
77
+ onopen();
78
+
79
+ if (searchable) {
80
+ tick().then(() => {
81
+ searchInputRef?.focus();
82
+ });
83
+ }
84
+ } else {
85
+ onclose();
86
+ searchQuery = '';
87
+ }
88
+ }
89
+
90
+ function handleSelect(item: SelectItem) {
91
+ if (item.disabled) return;
92
+
93
+ if (multiple) {
94
+ const isSelected = valueArray.includes(item.value);
95
+
96
+ if (isSelected) {
97
+ // Remove from selection
98
+ value = Array.isArray(value) ? value.filter((v) => v !== item.value) : [];
99
+ } else {
100
+ // Add to selection
101
+ value = Array.isArray(value) ? [...value, item.value] : [item.value];
102
+ }
103
+
104
+ // Keep dropdown open when multiple selection is enabled
105
+ if (searchable && searchInputRef) {
106
+ searchInputRef.focus();
107
+ }
108
+ } else {
109
+ // Single selection
110
+ value = item.value;
111
+ open = false;
112
+ }
113
+
114
+ onselect({ value });
115
+ }
116
+
117
+ function removeItem(itemValue: string) {
118
+ if (multiple && Array.isArray(value)) {
119
+ value = value.filter((v) => v !== itemValue);
120
+ onselect({ value });
121
+ }
122
+ }
123
+
124
+ function handleClickOutside(event: MouseEvent) {
125
+ if (selectRef && !selectRef.contains(event.target as Node) && open) {
126
+ open = false;
127
+ onclose();
128
+ }
129
+ }
130
+
131
+ function handleKeydown(event: KeyboardEvent) {
132
+ // check if the event is fired from the select
133
+ if (!selectRef || !selectRef.contains(event.target as Node)) return;
134
+
135
+ if (!open) {
136
+ if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') {
137
+ event.preventDefault();
138
+ open = true;
139
+ onopen();
140
+ return;
141
+ }
142
+ return;
143
+ }
144
+
145
+ if (event.key === 'Escape') {
146
+ event.preventDefault();
147
+ open = false;
148
+ onclose();
149
+ return;
150
+ }
151
+
152
+ const availableItems = filteredItems.filter((item) => !item.disabled);
153
+ if (!availableItems.length) return;
154
+
155
+ if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
156
+ event.preventDefault();
157
+
158
+ if (event.key === 'ArrowDown') {
159
+ highlightedIndex = (highlightedIndex + 1) % availableItems.length;
160
+ } else {
161
+ highlightedIndex = highlightedIndex <= 0 ? availableItems.length - 1 : highlightedIndex - 1;
162
+ }
163
+
164
+ tick().then(() => {
165
+ const highlightedElement = document.querySelector(
166
+ `[data-index="${highlightedIndex}"]`
167
+ ) as HTMLElement;
168
+ if (highlightedElement) {
169
+ highlightedElement.scrollIntoView({ block: 'center', behavior: 'instant' });
170
+ }
171
+ });
172
+ }
173
+
174
+ if (event.key === 'Enter' || event.key === ' ') {
175
+ event.preventDefault();
176
+ if (highlightedIndex >= 0 && highlightedIndex < availableItems.length) {
177
+ handleSelect(availableItems[highlightedIndex]);
178
+ }
179
+ }
180
+ }
181
+ </script>
182
+
183
+ <svelte:window onclick={handleClickOutside} onkeydown={handleKeydown} />
184
+
185
+ <div bind:this={selectRef} class={baseClass} data-state={open ? 'open' : 'closed'}>
186
+ <label
187
+ class={triggerClass_}
188
+ aria-disabled={disabled}
189
+ aria-haspopup="listbox"
190
+ aria-labelledby="select-label"
191
+ >
192
+ <button
193
+ type="button"
194
+ aria-label="Toggle dropdown"
195
+ {disabled}
196
+ aria-expanded={open}
197
+ onclick={handleToggle}
198
+ ></button>
199
+ <span class="flex min-h-[1.5rem] flex-1 flex-wrap items-center gap-1 overflow-hidden">
200
+ {#if multiple && selectedItems.length > 0}
201
+ {#each selectedItems as item (item.value)}
202
+ <Badge {size} color="info" onclose={() => removeItem(item.value)}>
203
+ {item.value}
204
+ </Badge>
205
+ {/each}
206
+ {:else if !multiple && selectedItem}
207
+ <span id="select-label" class="flex-1 truncate text-left">
208
+ {selectedItem.label}
209
+ </span>
210
+ {:else}
211
+ <span id="select-label" class="text-default-500 px-1">
212
+ {placeholder}
213
+ </span>
214
+ {/if}
215
+ </span>
216
+
217
+ <span class="ml-auto flex flex-shrink-0 items-center pl-2">
218
+ {#if Icon}
219
+ <Icon class={triggerIconClass} />
220
+ {:else}
221
+ <svg
222
+ xmlns="http://www.w3.org/2000/svg"
223
+ viewBox="0 0 20 20"
224
+ fill="currentColor"
225
+ class={cn(triggerIconClass, open && 'rotate-180 transform')}
226
+ >
227
+ <path
228
+ fill-rule="evenodd"
229
+ d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
230
+ clip-rule="evenodd"
231
+ />
232
+ </svg>
233
+ {/if}
234
+ </span>
235
+ </label>
236
+
237
+ {#if open}
238
+ <div class={containerClass_} role="listbox" aria-labelledby="select-label">
239
+ {#if searchable}
240
+ <div class={searchInputClass_}>
241
+ <svg
242
+ xmlns="http://www.w3.org/2000/svg"
243
+ width="12"
244
+ height="12"
245
+ viewBox="0 0 12 12"
246
+ class="size-4"
247
+ >
248
+ <path
249
+ fill="currentColor"
250
+ d="M5 1a4 4 0 1 0 2.452 7.16l2.694 2.693a.5.5 0 1 0 .707-.707L8.16 7.453A4 4 0 0 0 5 1M2 5a3 3 0 1 1 6 0a3 3 0 0 1-6 0"
251
+ />
252
+ </svg>
253
+ <input
254
+ bind:this={searchInputRef}
255
+ bind:value={searchQuery}
256
+ type="text"
257
+ class="ring-0 outline-0"
258
+ placeholder="Search..."
259
+ aria-label="Search select options"
260
+ />
261
+ </div>
262
+ {/if}
263
+
264
+ {#if filteredItems.length === 0}
265
+ <div class={emptyMessageClass}>No items found</div>
266
+ {:else}
267
+ <ul class={listClass_}>
268
+ {#each filteredItems as item, index (item.value)}
269
+ <li>
270
+ <button
271
+ type="button"
272
+ onclick={() => handleSelect(item)}
273
+ disabled={item.disabled}
274
+ class={itemClass_}
275
+ role="option"
276
+ aria-selected={valueArray.includes(item.value)}
277
+ data-selected={valueArray.includes(item.value)}
278
+ data-highlighted={index === highlightedIndex}
279
+ data-index={index}
280
+ >
281
+ <span class="flex w-full items-center justify-between">
282
+ <span class="flex items-center gap-2 overflow-hidden">
283
+ {#if item.icon}
284
+ {@const Icon = item.icon}
285
+ <Icon class="h-4 w-4 flex-shrink-0" />
286
+ {/if}
287
+ <span class="truncate">{item.label}</span>
288
+ </span>
289
+
290
+ {#if valueArray.includes(item.value)}
291
+ <svg
292
+ xmlns="http://www.w3.org/2000/svg"
293
+ width="16"
294
+ height="16"
295
+ viewBox="0 0 24 24"
296
+ fill="none"
297
+ stroke="currentColor"
298
+ stroke-width="2"
299
+ stroke-linecap="round"
300
+ stroke-linejoin="round"
301
+ class="text-info-500"
302
+ >
303
+ <polyline points="20 6 9 17 4 12" />
304
+ </svg>
305
+ {/if}
306
+ </span>
307
+ </button>
308
+ </li>
309
+ {/each}
310
+ </ul>
311
+ {/if}
312
+ </div>
313
+ {/if}
314
+ </div>
@@ -0,0 +1,4 @@
1
+ import type { SelectProps } from '../../index.js';
2
+ declare const Select: import("svelte").Component<SelectProps, {}, "value">;
3
+ type Select = ReturnType<typeof Select>;
4
+ export default Select;
@@ -0,0 +1,251 @@
1
+ import { Size } from '../../variants.js';
2
+ export declare const dropdownMenu: import("tailwind-variants").TVReturnType<{
3
+ position: {
4
+ 'top-left': {
5
+ container: string;
6
+ };
7
+ 'top-right': {
8
+ container: string;
9
+ };
10
+ 'bottom-left': {
11
+ container: string;
12
+ };
13
+ 'bottom-right': {
14
+ container: string;
15
+ };
16
+ };
17
+ size: {
18
+ [Size.XS]: {
19
+ trigger: string;
20
+ item: string;
21
+ itemIcon: string;
22
+ header: string;
23
+ headerTitle: string;
24
+ headerSubtitle: string;
25
+ };
26
+ [Size.SM]: {
27
+ trigger: string;
28
+ item: string;
29
+ itemIcon: string;
30
+ header: string;
31
+ headerTitle: string;
32
+ headerSubtitle: string;
33
+ };
34
+ [Size.BASE]: {
35
+ trigger: string;
36
+ item: string;
37
+ itemIcon: string;
38
+ header: string;
39
+ headerTitle: string;
40
+ headerSubtitle: string;
41
+ };
42
+ [Size.LG]: {
43
+ trigger: string;
44
+ item: string;
45
+ itemIcon: string;
46
+ header: string;
47
+ headerTitle: string;
48
+ headerSubtitle: string;
49
+ };
50
+ [Size.XL]: {
51
+ trigger: string;
52
+ item: string;
53
+ itemIcon: string;
54
+ header: string;
55
+ headerTitle: string;
56
+ headerSubtitle: string;
57
+ };
58
+ [Size.XXL]: {
59
+ trigger: string;
60
+ item: string;
61
+ itemIcon: string;
62
+ header: string;
63
+ headerTitle: string;
64
+ headerSubtitle: string;
65
+ };
66
+ };
67
+ isOpen: {
68
+ true: {};
69
+ };
70
+ iconOnly: {
71
+ true: {
72
+ trigger: string;
73
+ };
74
+ };
75
+ }, {
76
+ base: string;
77
+ trigger: string;
78
+ container: string;
79
+ section: string;
80
+ header: string;
81
+ headerTitle: string;
82
+ headerSubtitle: string;
83
+ item: string;
84
+ itemIcon: string;
85
+ }, undefined, {
86
+ position: {
87
+ 'top-left': {
88
+ container: string;
89
+ };
90
+ 'top-right': {
91
+ container: string;
92
+ };
93
+ 'bottom-left': {
94
+ container: string;
95
+ };
96
+ 'bottom-right': {
97
+ container: string;
98
+ };
99
+ };
100
+ size: {
101
+ [Size.XS]: {
102
+ trigger: string;
103
+ item: string;
104
+ itemIcon: string;
105
+ header: string;
106
+ headerTitle: string;
107
+ headerSubtitle: string;
108
+ };
109
+ [Size.SM]: {
110
+ trigger: string;
111
+ item: string;
112
+ itemIcon: string;
113
+ header: string;
114
+ headerTitle: string;
115
+ headerSubtitle: string;
116
+ };
117
+ [Size.BASE]: {
118
+ trigger: string;
119
+ item: string;
120
+ itemIcon: string;
121
+ header: string;
122
+ headerTitle: string;
123
+ headerSubtitle: string;
124
+ };
125
+ [Size.LG]: {
126
+ trigger: string;
127
+ item: string;
128
+ itemIcon: string;
129
+ header: string;
130
+ headerTitle: string;
131
+ headerSubtitle: string;
132
+ };
133
+ [Size.XL]: {
134
+ trigger: string;
135
+ item: string;
136
+ itemIcon: string;
137
+ header: string;
138
+ headerTitle: string;
139
+ headerSubtitle: string;
140
+ };
141
+ [Size.XXL]: {
142
+ trigger: string;
143
+ item: string;
144
+ itemIcon: string;
145
+ header: string;
146
+ headerTitle: string;
147
+ headerSubtitle: string;
148
+ };
149
+ };
150
+ isOpen: {
151
+ true: {};
152
+ };
153
+ iconOnly: {
154
+ true: {
155
+ trigger: string;
156
+ };
157
+ };
158
+ }, {
159
+ base: string;
160
+ trigger: string;
161
+ container: string;
162
+ section: string;
163
+ header: string;
164
+ headerTitle: string;
165
+ headerSubtitle: string;
166
+ item: string;
167
+ itemIcon: string;
168
+ }, import("tailwind-variants").TVReturnType<{
169
+ position: {
170
+ 'top-left': {
171
+ container: string;
172
+ };
173
+ 'top-right': {
174
+ container: string;
175
+ };
176
+ 'bottom-left': {
177
+ container: string;
178
+ };
179
+ 'bottom-right': {
180
+ container: string;
181
+ };
182
+ };
183
+ size: {
184
+ [Size.XS]: {
185
+ trigger: string;
186
+ item: string;
187
+ itemIcon: string;
188
+ header: string;
189
+ headerTitle: string;
190
+ headerSubtitle: string;
191
+ };
192
+ [Size.SM]: {
193
+ trigger: string;
194
+ item: string;
195
+ itemIcon: string;
196
+ header: string;
197
+ headerTitle: string;
198
+ headerSubtitle: string;
199
+ };
200
+ [Size.BASE]: {
201
+ trigger: string;
202
+ item: string;
203
+ itemIcon: string;
204
+ header: string;
205
+ headerTitle: string;
206
+ headerSubtitle: string;
207
+ };
208
+ [Size.LG]: {
209
+ trigger: string;
210
+ item: string;
211
+ itemIcon: string;
212
+ header: string;
213
+ headerTitle: string;
214
+ headerSubtitle: string;
215
+ };
216
+ [Size.XL]: {
217
+ trigger: string;
218
+ item: string;
219
+ itemIcon: string;
220
+ header: string;
221
+ headerTitle: string;
222
+ headerSubtitle: string;
223
+ };
224
+ [Size.XXL]: {
225
+ trigger: string;
226
+ item: string;
227
+ itemIcon: string;
228
+ header: string;
229
+ headerTitle: string;
230
+ headerSubtitle: string;
231
+ };
232
+ };
233
+ isOpen: {
234
+ true: {};
235
+ };
236
+ iconOnly: {
237
+ true: {
238
+ trigger: string;
239
+ };
240
+ };
241
+ }, {
242
+ base: string;
243
+ trigger: string;
244
+ container: string;
245
+ section: string;
246
+ header: string;
247
+ headerTitle: string;
248
+ headerSubtitle: string;
249
+ item: string;
250
+ itemIcon: string;
251
+ }, undefined, unknown, unknown, undefined>>;
@@ -0,0 +1,95 @@
1
+ import { tv } from '../../helper/cls.js';
2
+ import { Size } from '../../variants.js';
3
+ export const dropdownMenu = tv({
4
+ slots: {
5
+ base: 'relative inline-block text-left',
6
+ trigger: 'inline-flex w-full justify-center items-center gap-x-1.5 rounded-md bg-white px-3 py-2 text-sm font-semibold text-default-900 shadow-xs ring-1 ring-inset ring-default-300 hover:bg-default-50 cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed',
7
+ container: 'absolute z-50 mt-2 origin-top-right divide-y divide-default-100 rounded-md bg-white ring-1 ring-black/5 shadow-lg focus:outline-none',
8
+ section: 'py-1',
9
+ header: 'flex flex-col px-4 py-2 w-full items-start',
10
+ headerTitle: 'text-sm font-medium text-default-900',
11
+ headerSubtitle: 'text-sm text-default-500',
12
+ item: 'w-full group flex items-center px-4 py-2 text-sm text-default-700 hover:bg-default-100 hover:text-default-900 data-[active=true]:bg-default-100 data-[active=true]:text-default-900 disabled:opacity-50 disabled:cursor-not-allowed',
13
+ itemIcon: 'mr-3 size-5 text-default-400 group-hover:text-default-500 group-data-[active=true]:text-default-500'
14
+ },
15
+ variants: {
16
+ position: {
17
+ 'top-left': {
18
+ container: 'origin-bottom-left bottom-full left-0 mb-2'
19
+ },
20
+ 'top-right': {
21
+ container: 'origin-bottom-right bottom-full right-0 mb-2'
22
+ },
23
+ 'bottom-left': {
24
+ container: 'origin-top-left top-full left-0 mt-2'
25
+ },
26
+ 'bottom-right': {
27
+ container: 'origin-top-right top-full right-0 mt-2'
28
+ }
29
+ },
30
+ size: {
31
+ [Size.XS]: {
32
+ trigger: 'px-2 py-1 text-xs',
33
+ item: 'px-2.5 py-1 text-xs',
34
+ itemIcon: 'mr-1.5 size-3.5',
35
+ header: 'px-2.5 py-1.5',
36
+ headerTitle: 'text-xs',
37
+ headerSubtitle: 'text-xs'
38
+ },
39
+ [Size.SM]: {
40
+ trigger: 'px-2.5 py-1.5 text-xs',
41
+ item: 'px-3 py-1.5 text-xs',
42
+ itemIcon: 'mr-2 size-4',
43
+ header: 'px-3 py-2',
44
+ headerTitle: 'text-xs',
45
+ headerSubtitle: 'text-xs'
46
+ },
47
+ [Size.BASE]: {
48
+ trigger: 'px-3 py-2 text-sm',
49
+ item: 'px-4 py-2 text-sm',
50
+ itemIcon: 'mr-3 size-5',
51
+ header: 'px-4 py-3',
52
+ headerTitle: 'text-sm',
53
+ headerSubtitle: 'text-sm'
54
+ },
55
+ [Size.LG]: {
56
+ trigger: 'px-4 py-2.5 text-base',
57
+ item: 'px-5 py-2.5 text-base',
58
+ itemIcon: 'mr-3 size-6',
59
+ header: 'px-5 py-3.5',
60
+ headerTitle: 'text-base',
61
+ headerSubtitle: 'text-sm'
62
+ },
63
+ [Size.XL]: {
64
+ trigger: 'px-5 py-3 text-lg',
65
+ item: 'px-6 py-3 text-lg',
66
+ itemIcon: 'mr-3.5 size-7',
67
+ header: 'px-6 py-4',
68
+ headerTitle: 'text-lg',
69
+ headerSubtitle: 'text-base'
70
+ },
71
+ [Size.XXL]: {
72
+ trigger: 'px-6 py-3.5 text-xl',
73
+ item: 'px-7 py-3.5 text-xl',
74
+ itemIcon: 'mr-4 size-8',
75
+ header: 'px-7 py-5',
76
+ headerTitle: 'text-xl',
77
+ headerSubtitle: 'text-lg'
78
+ }
79
+ },
80
+ isOpen: {
81
+ true: {}
82
+ },
83
+ iconOnly: {
84
+ true: {
85
+ trigger: 'inline-flex justify-center items-center cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed bg-transparent shadow-none ring-0 hover:bg-transparent'
86
+ }
87
+ }
88
+ },
89
+ defaultVariants: {
90
+ position: 'bottom-right',
91
+ size: Size.BASE,
92
+ isOpen: false,
93
+ iconOnly: false
94
+ }
95
+ });