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

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 (129) hide show
  1. package/README.md +394 -54
  2. package/dist/button/Button.svelte +5 -3
  3. package/dist/button/Button.svelte.d.ts +1 -1
  4. package/dist/button/button.d.ts +40 -63
  5. package/dist/button/button.js +15 -14
  6. package/dist/charts/Chart.svelte +545 -0
  7. package/dist/charts/Chart.svelte.d.ts +4 -0
  8. package/dist/drawer/Drawer.svelte +13 -2
  9. package/dist/drawer/Drawer.svelte.d.ts +1 -1
  10. package/dist/drawer/drawer.d.ts +0 -17
  11. package/dist/drawer/drawer.js +3 -3
  12. package/dist/elements/accordion/Accordion.svelte +83 -0
  13. package/dist/elements/accordion/Accordion.svelte.d.ts +4 -0
  14. package/dist/elements/accordion/accordion.d.ts +200 -0
  15. package/dist/elements/accordion/accordion.js +86 -0
  16. package/dist/elements/alert/Alert.svelte +57 -0
  17. package/dist/elements/alert/Alert.svelte.d.ts +4 -0
  18. package/dist/elements/badge/Badge.svelte +13 -5
  19. package/dist/elements/badge/Badge.svelte.d.ts +1 -1
  20. package/dist/elements/badge/badge.d.ts +0 -12
  21. package/dist/elements/dropdown/Dropdown.svelte +32 -37
  22. package/dist/elements/dropdown/Dropdown.svelte.d.ts +1 -1
  23. package/dist/elements/dropdown/Select.svelte +143 -59
  24. package/dist/elements/dropdown/Select.svelte.d.ts +1 -1
  25. package/dist/elements/dropdown/dropdown.d.ts +34 -57
  26. package/dist/elements/dropdown/dropdown.js +10 -4
  27. package/dist/elements/dropdown/select.d.ts +34 -54
  28. package/dist/elements/dropdown/select.js +22 -14
  29. package/dist/elements/file-upload/FileUpload.svelte +130 -0
  30. package/dist/elements/file-upload/FileUpload.svelte.d.ts +4 -0
  31. package/dist/elements/file-upload/FilesPreview.svelte +93 -0
  32. package/dist/elements/file-upload/FilesPreview.svelte.d.ts +4 -0
  33. package/dist/elements/progress/Progress.svelte +145 -0
  34. package/dist/elements/progress/Progress.svelte.d.ts +4 -0
  35. package/dist/elements/timeline/Timeline.svelte +92 -0
  36. package/dist/elements/timeline/Timeline.svelte.d.ts +7 -0
  37. package/dist/forms/Checkbox.svelte +54 -0
  38. package/dist/forms/Checkbox.svelte.d.ts +4 -0
  39. package/dist/forms/DateRange.svelte +493 -0
  40. package/dist/forms/DateRange.svelte.d.ts +4 -0
  41. package/dist/forms/Form.svelte +39 -0
  42. package/dist/forms/Form.svelte.d.ts +4 -0
  43. package/dist/forms/Input.svelte +86 -0
  44. package/dist/forms/Input.svelte.d.ts +4 -0
  45. package/dist/forms/NumberInput.svelte +159 -0
  46. package/dist/forms/NumberInput.svelte.d.ts +4 -0
  47. package/dist/forms/RadioInputs.svelte +64 -0
  48. package/dist/forms/RadioInputs.svelte.d.ts +4 -0
  49. package/dist/forms/RadioPill.svelte +66 -0
  50. package/dist/forms/RadioPill.svelte.d.ts +4 -0
  51. package/dist/forms/Slider.svelte +342 -0
  52. package/dist/forms/Slider.svelte.d.ts +4 -0
  53. package/dist/forms/Tags.svelte +181 -0
  54. package/dist/forms/Tags.svelte.d.ts +4 -0
  55. package/dist/forms/Toggle.svelte +132 -0
  56. package/dist/forms/Toggle.svelte.d.ts +4 -0
  57. package/dist/forms/slider.d.ts +143 -0
  58. package/dist/forms/slider.js +62 -0
  59. package/dist/header/Breadcrumbs.svelte +2 -1
  60. package/dist/header/Breadcrumbs.svelte.d.ts +1 -1
  61. package/dist/header/PageHeader.svelte +2 -2
  62. package/dist/header/PageHeader.svelte.d.ts +1 -1
  63. package/dist/header/breadcrumbs.d.ts +20 -14
  64. package/dist/header/breadcrumbs.js +6 -0
  65. package/dist/helper/date.d.ts +7 -0
  66. package/dist/helper/date.js +15 -0
  67. package/dist/index.d.ts +762 -9
  68. package/dist/index.js +70 -16
  69. package/dist/layout/card/Card.svelte +5 -8
  70. package/dist/layout/card/Card.svelte.d.ts +1 -1
  71. package/dist/layout/card/StatsCard.svelte +119 -89
  72. package/dist/layout/card/StatsCard.svelte.d.ts +1 -1
  73. package/dist/layout/card/card.d.ts +22 -33
  74. package/dist/layout/card/card.js +9 -8
  75. package/dist/layout/card/stats-card.d.ts +22 -39
  76. package/dist/layout/card/stats-card.js +14 -14
  77. package/dist/layout/navbar/navbar.d.ts +0 -23
  78. package/dist/layout/sidebar/NavGroup.svelte +38 -48
  79. package/dist/layout/sidebar/NavGroup.svelte.d.ts +1 -1
  80. package/dist/layout/sidebar/NavItem.svelte +3 -3
  81. package/dist/layout/sidebar/NavItem.svelte.d.ts +1 -1
  82. package/dist/layout/sidebar/Sidebar.svelte +101 -72
  83. package/dist/layout/sidebar/Sidebar.svelte.d.ts +1 -1
  84. package/dist/layout/table/Table.svelte +2 -2
  85. package/dist/layout/table/Table.svelte.d.ts +1 -1
  86. package/dist/layout/table/table.d.ts +1 -20
  87. package/dist/layout/table/table.js +0 -8
  88. package/dist/layout/tabs/TabGroup.svelte +2 -2
  89. package/dist/layout/tabs/TabGroup.svelte.d.ts +2 -2
  90. package/dist/layout/tabs/tabs.d.ts +2 -2
  91. package/dist/modal/Modal.svelte +2 -1
  92. package/dist/modal/Modal.svelte.d.ts +1 -1
  93. package/dist/modal/modal.d.ts +0 -23
  94. package/dist/modal/modal.js +3 -3
  95. package/dist/sonner/sonner.svelte +13 -0
  96. package/dist/sonner/sonner.svelte.d.ts +4 -0
  97. package/dist/types/variants.d.ts +1 -21
  98. package/dist/types/variants.js +1 -19
  99. package/dist/variants.d.ts +30 -0
  100. package/dist/variants.js +36 -0
  101. package/package.json +7 -3
  102. package/dist/button/index.d.ts +0 -1
  103. package/dist/button/index.js +0 -1
  104. package/dist/drawer/index.d.ts +0 -2
  105. package/dist/drawer/index.js +0 -1
  106. package/dist/elements/badge/index.d.ts +0 -2
  107. package/dist/elements/badge/index.js +0 -2
  108. package/dist/elements/dropdown/index.d.ts +0 -3
  109. package/dist/elements/dropdown/index.js +0 -2
  110. package/dist/header/index.d.ts +0 -4
  111. package/dist/header/index.js +0 -2
  112. package/dist/header/pageheaders.d.ts +0 -10
  113. package/dist/header/pageheaders.js +0 -1
  114. package/dist/layout/card/index.d.ts +0 -4
  115. package/dist/layout/card/index.js +0 -2
  116. package/dist/layout/index.d.ts +0 -7
  117. package/dist/layout/index.js +0 -7
  118. package/dist/layout/navbar/index.d.ts +0 -2
  119. package/dist/layout/navbar/index.js +0 -2
  120. package/dist/layout/sidebar/index.d.ts +0 -2
  121. package/dist/layout/sidebar/index.js +0 -1
  122. package/dist/layout/sidebar/sidebar.d.ts +0 -46
  123. package/dist/layout/sidebar/sidebar.js +0 -1
  124. package/dist/layout/table/index.d.ts +0 -3
  125. package/dist/layout/table/index.js +0 -2
  126. package/dist/layout/tabs/index.d.ts +0 -3
  127. package/dist/layout/tabs/index.js +0 -3
  128. package/dist/modal/index.d.ts +0 -1
  129. package/dist/modal/index.js +0 -1
@@ -0,0 +1,83 @@
1
+ <script lang="ts">
2
+ import { twMerge } from 'tailwind-merge';
3
+ import { accordion } from './accordion.js';
4
+ import type { AccordionProps } from '../../index.js';
5
+
6
+ let {
7
+ title,
8
+ description,
9
+ id,
10
+ bordered,
11
+ color,
12
+ open,
13
+ onexpand,
14
+ oncollapse,
15
+ class: className,
16
+ summary,
17
+ children,
18
+ icon: Icon
19
+ }: AccordionProps = $props();
20
+
21
+ const {
22
+ base,
23
+ header,
24
+ title: titleClass,
25
+ description: descriptionClass,
26
+ body
27
+ } = accordion({ color, open, bordered });
28
+
29
+ function handleClick() {
30
+ open = !open;
31
+ if (open && onexpand) {
32
+ onexpand();
33
+ } else if (!open && oncollapse) {
34
+ oncollapse();
35
+ }
36
+ }
37
+
38
+ const baseClasses = $derived(twMerge(base(), className));
39
+ </script>
40
+
41
+ <div class={baseClasses}>
42
+ <button
43
+ class={twMerge(header(), 'flex gap-3')}
44
+ aria-expanded={open}
45
+ aria-controls={id}
46
+ onclick={handleClick}
47
+ >
48
+ <div class="flex items-start justify-start gap-3">
49
+ {#if Icon}
50
+ <Icon class="text-default-500 size-5" />
51
+ {/if}
52
+ <div class="flex flex-col">
53
+ {#if title}
54
+ <h3 class={titleClass()}>{title}</h3>
55
+ {/if}
56
+ {#if description}
57
+ <p class={descriptionClass()}>{description}</p>
58
+ {/if}
59
+ </div>
60
+ </div>
61
+ <div class="flex items-center">
62
+ {@render summary?.()}
63
+ <svg
64
+ xmlns="http://www.w3.org/2000/svg"
65
+ width="20"
66
+ height="20"
67
+ viewBox="0 0 20 20"
68
+ class="text-default-500 size-5 transition-transform duration-200"
69
+ class:rotate-180={open}
70
+ >
71
+ <path
72
+ fill="currentColor"
73
+ d="M15.794 7.733a.75.75 0 0 1-.026 1.06l-5.25 5.001a.75.75 0 0 1-1.035 0l-5.25-5a.75.75 0 0 1 1.034-1.087l4.734 4.509l4.733-4.51a.75.75 0 0 1 1.06.027"
74
+ />
75
+ </svg>
76
+ </div>
77
+ </button>
78
+ {#if open}
79
+ <div class={body()} {id}>
80
+ {@render children()}
81
+ </div>
82
+ {/if}
83
+ </div>
@@ -0,0 +1,4 @@
1
+ import type { AccordionProps } from '../../index.js';
2
+ declare const Accordion: import("svelte").Component<AccordionProps, {}, "">;
3
+ type Accordion = ReturnType<typeof Accordion>;
4
+ export default Accordion;
@@ -0,0 +1,200 @@
1
+ import { Color } from '../../variants.js';
2
+ export declare const accordion: import("tailwind-variants").TVReturnType<{
3
+ color: {
4
+ [Color.DEFAULT]: {
5
+ base: string;
6
+ header: string;
7
+ body: string;
8
+ };
9
+ [Color.PRIMARY]: {
10
+ base: string;
11
+ header: string;
12
+ title: string;
13
+ };
14
+ [Color.SECONDARY]: {
15
+ base: string;
16
+ header: string;
17
+ title: string;
18
+ };
19
+ [Color.SUCCESS]: {
20
+ base: string;
21
+ header: string;
22
+ title: string;
23
+ };
24
+ [Color.WARNING]: {
25
+ base: string;
26
+ header: string;
27
+ title: string;
28
+ };
29
+ [Color.DANGER]: {
30
+ base: string;
31
+ header: string;
32
+ title: string;
33
+ };
34
+ [Color.INFO]: {
35
+ base: string;
36
+ header: string;
37
+ title: string;
38
+ };
39
+ };
40
+ open: {
41
+ true: {
42
+ base: string;
43
+ title: string;
44
+ };
45
+ false: {
46
+ base: string;
47
+ };
48
+ };
49
+ bordered: {
50
+ true: {
51
+ base: string;
52
+ body: string;
53
+ };
54
+ false: {
55
+ base: string;
56
+ };
57
+ };
58
+ iconPosition: {
59
+ start: {};
60
+ end: {};
61
+ };
62
+ }, {
63
+ base: string;
64
+ header: string;
65
+ title: string;
66
+ description: string;
67
+ body: string;
68
+ }, undefined, {
69
+ color: {
70
+ [Color.DEFAULT]: {
71
+ base: string;
72
+ header: string;
73
+ body: string;
74
+ };
75
+ [Color.PRIMARY]: {
76
+ base: string;
77
+ header: string;
78
+ title: string;
79
+ };
80
+ [Color.SECONDARY]: {
81
+ base: string;
82
+ header: string;
83
+ title: string;
84
+ };
85
+ [Color.SUCCESS]: {
86
+ base: string;
87
+ header: string;
88
+ title: string;
89
+ };
90
+ [Color.WARNING]: {
91
+ base: string;
92
+ header: string;
93
+ title: string;
94
+ };
95
+ [Color.DANGER]: {
96
+ base: string;
97
+ header: string;
98
+ title: string;
99
+ };
100
+ [Color.INFO]: {
101
+ base: string;
102
+ header: string;
103
+ title: string;
104
+ };
105
+ };
106
+ open: {
107
+ true: {
108
+ base: string;
109
+ title: string;
110
+ };
111
+ false: {
112
+ base: string;
113
+ };
114
+ };
115
+ bordered: {
116
+ true: {
117
+ base: string;
118
+ body: string;
119
+ };
120
+ false: {
121
+ base: string;
122
+ };
123
+ };
124
+ iconPosition: {
125
+ start: {};
126
+ end: {};
127
+ };
128
+ }, {
129
+ base: string;
130
+ header: string;
131
+ title: string;
132
+ description: string;
133
+ body: string;
134
+ }, import("tailwind-variants").TVReturnType<{
135
+ color: {
136
+ [Color.DEFAULT]: {
137
+ base: string;
138
+ header: string;
139
+ body: string;
140
+ };
141
+ [Color.PRIMARY]: {
142
+ base: string;
143
+ header: string;
144
+ title: string;
145
+ };
146
+ [Color.SECONDARY]: {
147
+ base: string;
148
+ header: string;
149
+ title: string;
150
+ };
151
+ [Color.SUCCESS]: {
152
+ base: string;
153
+ header: string;
154
+ title: string;
155
+ };
156
+ [Color.WARNING]: {
157
+ base: string;
158
+ header: string;
159
+ title: string;
160
+ };
161
+ [Color.DANGER]: {
162
+ base: string;
163
+ header: string;
164
+ title: string;
165
+ };
166
+ [Color.INFO]: {
167
+ base: string;
168
+ header: string;
169
+ title: string;
170
+ };
171
+ };
172
+ open: {
173
+ true: {
174
+ base: string;
175
+ title: string;
176
+ };
177
+ false: {
178
+ base: string;
179
+ };
180
+ };
181
+ bordered: {
182
+ true: {
183
+ base: string;
184
+ body: string;
185
+ };
186
+ false: {
187
+ base: string;
188
+ };
189
+ };
190
+ iconPosition: {
191
+ start: {};
192
+ end: {};
193
+ };
194
+ }, {
195
+ base: string;
196
+ header: string;
197
+ title: string;
198
+ description: string;
199
+ body: string;
200
+ }, undefined, unknown, unknown, undefined>>;
@@ -0,0 +1,86 @@
1
+ import { tv } from '../../helper/cls.js';
2
+ import { Color } from '../../variants.js';
3
+ export const accordion = tv({
4
+ slots: {
5
+ base: 'w-full relative overflow-hidden rounded-xl transition-all duration-200 hover:shadow-md bg-white border border-default-200',
6
+ header: 'w-full flex cursor-pointer items-center justify-between p-4 transition-colors duration-200 hover:bg-default-50',
7
+ title: 'flex text-default-900 text-sm font-medium leading-tight',
8
+ description: 'text-default-500 text-xs',
9
+ body: 'w-full border-t border-default-200 p-4 pt-3 transition-all',
10
+ },
11
+ variants: {
12
+ color: {
13
+ [Color.DEFAULT]: {
14
+ base: 'bg-white hover:border-default-300',
15
+ header: 'hover:bg-default-50',
16
+ body: ''
17
+ },
18
+ [Color.PRIMARY]: {
19
+ base: 'bg-primary-50/50 hover:border-primary-300',
20
+ header: 'text-primary-700 hover:bg-primary-50',
21
+ title: 'text-primary-700'
22
+ },
23
+ [Color.SECONDARY]: {
24
+ base: 'bg-secondary-50/50 hover:border-secondary-300',
25
+ header: 'text-secondary-700 hover:bg-secondary-50',
26
+ title: 'text-secondary-700'
27
+ },
28
+ [Color.SUCCESS]: {
29
+ base: 'bg-success-50/50 hover:border-success-300',
30
+ header: 'text-success-700 hover:bg-success-50',
31
+ title: 'text-success-700'
32
+ },
33
+ [Color.WARNING]: {
34
+ base: 'bg-warning-50/50 hover:border-warning-300',
35
+ header: 'text-warning-700 hover:bg-warning-50',
36
+ title: 'text-warning-700'
37
+ },
38
+ [Color.DANGER]: {
39
+ base: 'bg-danger-50/50 hover:border-danger-300',
40
+ header: 'text-danger-700 hover:bg-danger-50',
41
+ title: 'text-danger-700'
42
+ },
43
+ [Color.INFO]: {
44
+ base: 'bg-info-50/50 hover:border-info-300',
45
+ header: 'text-info-700 hover:bg-info-50',
46
+ title: 'text-info-700'
47
+ }
48
+ },
49
+ open: {
50
+ true: {
51
+ base: 'shadow-sm',
52
+ title: 'text-default-900'
53
+ },
54
+ false: {
55
+ base: ''
56
+ }
57
+ },
58
+ bordered: {
59
+ true: {
60
+ base: 'border border-default-200',
61
+ body: 'border-t'
62
+ },
63
+ false: {
64
+ base: 'shadow-sm'
65
+ }
66
+ },
67
+ iconPosition: {
68
+ start: {},
69
+ end: {}
70
+ }
71
+ },
72
+ compoundVariants: [
73
+ {
74
+ open: true,
75
+ class: {
76
+ header: 'border-b-0'
77
+ }
78
+ }
79
+ ],
80
+ defaultVariants: {
81
+ color: Color.DEFAULT,
82
+ open: false,
83
+ bordered: true,
84
+ iconPosition: 'start'
85
+ }
86
+ });
@@ -0,0 +1,57 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../helper/cls.js';
3
+ import { Color } from '../../variants.js';
4
+ import type { AlertProps } from '../../index.js';
5
+
6
+ let {
7
+ title,
8
+ message,
9
+ color = Color.DEFAULT,
10
+ onclose,
11
+ footer,
12
+ class: className = ''
13
+ }: AlertProps = $props();
14
+
15
+ function handleClose() {
16
+ onclose?.();
17
+ }
18
+
19
+ const colorClasses = {
20
+ [Color.DEFAULT]: 'bg-default-50 border-default-200 text-default-800',
21
+ [Color.PRIMARY]: 'bg-primary-50 border-primary-200 text-primary-800',
22
+ [Color.SUCCESS]: 'bg-success-50 border-success-200 text-success-800',
23
+ [Color.WARNING]: 'bg-warning-50 border-warning-200 text-warning-800',
24
+ [Color.DANGER]: 'bg-danger-50 border-danger-200 text-danger-800',
25
+ [Color.INFO]: 'bg-info-50 border-info-200 text-info-800'
26
+ };
27
+ </script>
28
+
29
+ <div class={cn('relative rounded-lg border p-4', colorClasses[color], className)}>
30
+ <div class="flex items-start justify-between gap-4">
31
+ <div class="flex-1">
32
+ {#if title}
33
+ <h4 class="font-semibold">{title}</h4>
34
+ {/if}
35
+ <p class="text-sm">{message}</p>
36
+ </div>
37
+ {#if onclose}
38
+ <button
39
+ type="button"
40
+ class="hover:bg-default-200/20 flex-shrink-0 cursor-pointer rounded-md p-1"
41
+ onclick={handleClose}
42
+ aria-label="Close alert"
43
+ >
44
+ <svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor">
45
+ <path
46
+ fill-rule="evenodd"
47
+ d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
48
+ clip-rule="evenodd"
49
+ />
50
+ </svg>
51
+ </button>
52
+ {/if}
53
+ </div>
54
+ {#if footer}
55
+ {@render footer()}
56
+ {/if}
57
+ </div>
@@ -0,0 +1,4 @@
1
+ import type { AlertProps } from '../../index.js';
2
+ declare const Alert: import("svelte").Component<AlertProps, {}, "">;
3
+ type Alert = ReturnType<typeof Alert>;
4
+ export default Alert;
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { cn } from '../../helper/cls.js';
3
- import { badge, type BadgeProps } from './badge.js';
3
+ import { badge } from './badge.js';
4
+ import type { BadgeProps } from '../../index.js';
4
5
 
5
6
  let {
6
7
  size = 'base',
@@ -18,13 +19,20 @@
18
19
  );
19
20
 
20
21
  const baseClass = $derived(cn(base(), className));
22
+
23
+ function handleOnClose(event) {
24
+ event.preventDefault();
25
+ onClose();
26
+ }
21
27
  </script>
22
28
 
23
- <div class={baseClass}>
29
+ <span class={baseClass}>
24
30
  {@render children()}
25
31
  {#if onClose}
26
- <button type="button" onclick={onClose} class="cursor-pointer" aria-label="Close">
27
- <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
32
+ <button
33
+ onclick={handleOnClose} class="cursor-pointer h-full flex items-center" aria-label="Close" title="Close"
34
+ tabindex="0" type="button">
35
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32" class="size-2">
28
36
  <path
29
37
  fill="currentColor"
30
38
  d="M26.113 4.116a1.25 1.25 0 0 1 1.768 1.768L17.766 15.999l10.115 10.114a1.25 1.25 0 1 1-1.768 1.768L16 17.766L5.884 27.881a1.25 1.25 0 1 1-1.768-1.768L14.231 16L4.116 5.884a1.25 1.25 0 1 1 1.768-1.768l10.115 10.115z"
@@ -32,4 +40,4 @@
32
40
  </svg>
33
41
  </button>
34
42
  {/if}
35
- </div>
43
+ </span>
@@ -1,4 +1,4 @@
1
- import { type BadgeProps } from './badge.js';
1
+ import type { BadgeProps } from '../../index.js';
2
2
  declare const Badge: import("svelte").Component<BadgeProps, {}, "">;
3
3
  type Badge = ReturnType<typeof Badge>;
4
4
  export default Badge;
@@ -1,6 +1,3 @@
1
- import type { ClassValue } from 'tailwind-variants';
2
- import type { VariantColors, VariantSizes } from '../../types/variants.js';
3
- import type { Snippet } from 'svelte';
4
1
  export declare const badge: import("tailwind-variants").TVReturnType<{
5
2
  size: {
6
3
  xs: {
@@ -182,12 +179,3 @@ export declare const badge: import("tailwind-variants").TVReturnType<{
182
179
  base: string;
183
180
  icon: string;
184
181
  }, undefined, unknown, unknown, undefined>>;
185
- export type BadgeProps = {
186
- label?: string;
187
- size?: VariantSizes;
188
- color?: VariantColors;
189
- class?: ClassValue;
190
- contentClass?: ClassValue;
191
- children: Snippet;
192
- onclose?: (event: MouseEvent) => void;
193
- };
@@ -1,17 +1,16 @@
1
1
  <script lang="ts">
2
2
  import { cn } from '../../helper/cls.js';
3
3
  import { fly } from 'svelte/transition';
4
- import { dropdownMenu, type DropdownMenuProps, type DropdownItem } from './dropdown.js';
4
+ import type { DropdownMenuProps, DropdownItem } from '../../index.js';
5
+ import { dropdownMenu } from '../../index.js';
5
6
  import { onMount, onDestroy } from 'svelte';
6
- import { Size } from '../../types/variants.js';
7
+ import { Size } from '../../variants.js';
7
8
 
8
9
  let {
9
10
  sections = [],
10
11
  open: isOpen = $bindable(false),
11
- label = 'Options',
12
+ label = '',
12
13
  icon: Icon,
13
- triggerContent,
14
- triggerClass = '',
15
14
  containerClass = '',
16
15
  itemClass = '',
17
16
  class: className = '',
@@ -22,6 +21,9 @@
22
21
  header
23
22
  }: DropdownMenuProps = $props();
24
23
 
24
+ // Determine if we're in icon-only mode
25
+ const iconOnly = $derived(!label && !!Icon);
26
+
25
27
  let dropdownRef = $state<HTMLDivElement | undefined>();
26
28
  let triggerRef = $state<HTMLDivElement | undefined>();
27
29
  let portalEl = $state<HTMLDivElement | undefined>();
@@ -41,12 +43,13 @@
41
43
  dropdownMenu({
42
44
  position,
43
45
  size,
44
- isOpen
46
+ isOpen,
47
+ iconOnly
45
48
  })
46
49
  );
47
50
 
48
51
  const baseClass = $derived(cn(base(), className));
49
- const triggerClass_ = $derived(cn(trigger(), triggerClass));
52
+ const triggerClass_ = $derived(cn(trigger(), ''));
50
53
  const containerClass_ = $derived(cn(container(), width, containerClass, 'shadow-lg'));
51
54
  const sectionClass = $derived(cn(section()));
52
55
  const itemClass_ = $derived(cn(item(), itemClass));
@@ -125,7 +128,6 @@
125
128
  }
126
129
 
127
130
  function handleItemClick(item: DropdownItem) {
128
- if (item.disabled) return;
129
131
  if (item.onclick) item.onclick();
130
132
  isOpen = false;
131
133
  }
@@ -178,35 +180,28 @@
178
180
 
179
181
  <div class={baseClass}>
180
182
  <div bind:this={triggerRef}>
181
- {#if triggerContent}
182
- {@render triggerContent()}
183
- {:else}
184
- <button
185
- type="button"
186
- id="menu-button"
187
- aria-expanded={isOpen}
188
- aria-haspopup="true"
189
- class={triggerClass_}
190
- onclick={handleToggle}
191
- {disabled}
192
- >
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
193
  {label}
194
- {#if Icon}
195
- <Icon class="-mr-1 size-5 text-default-400" />
196
- {:else}
197
- <svg
198
- class="-mr-1 size-5 text-default-400"
199
- viewBox="0 0 16 16"
200
- fill="currentColor"
201
- aria-hidden="true"
202
- >
203
- <path
204
- d="M6.62 12.7c.31.27.77.27 1.08 0l5-4.5A.76.76 0 0 0 12.16 7c0-.2-.08-.38-.21-.52a.76.76 0 0 0-1.09.02L7 10l-3.85-3.5a.76.76 0 0 0-1.07-.02.74.74 0 0 0-.02 1.07l4.56 5.15Z"
205
- />
206
- </svg>
207
- {/if}
208
- </button>
209
- {/if}
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>
210
205
  </div>
211
206
  </div>
212
207
 
@@ -253,7 +248,7 @@
253
248
  <button
254
249
  type="button"
255
250
  onclick={() => handleItemClick(menuItem)}
256
- disabled={menuItem.disabled} {...itemProps}>
251
+ disabled={!menuItem.onclick} {...itemProps}>
257
252
  {@render DropItemContent(menuItem)}
258
253
  </button>
259
254
  {/if}
@@ -1,4 +1,4 @@
1
- import { type DropdownMenuProps } from './dropdown.js';
1
+ import type { DropdownMenuProps } from '../../index.js';
2
2
  declare const Dropdown: import("svelte").Component<DropdownMenuProps, {}, "open">;
3
3
  type Dropdown = ReturnType<typeof Dropdown>;
4
4
  export default Dropdown;