@makolabs/ripple 0.0.1-dev.6 → 0.0.1-dev.60

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 (136) 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 +98 -0
  13. package/dist/elements/accordion/Accordion.svelte.d.ts +4 -0
  14. package/dist/elements/accordion/accordion.d.ts +227 -0
  15. package/dist/elements/accordion/accordion.js +138 -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 +100 -138
  22. package/dist/elements/dropdown/Dropdown.svelte.d.ts +1 -1
  23. package/dist/elements/dropdown/Select.svelte +167 -66
  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 +11 -5
  27. package/dist/elements/dropdown/select.d.ts +34 -54
  28. package/dist/elements/dropdown/select.js +24 -16
  29. package/dist/elements/file-upload/FileUpload.svelte +135 -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 +811 -9
  68. package/dist/index.js +69 -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 -47
  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 +464 -87
  85. package/dist/layout/table/Table.svelte.d.ts +1 -1
  86. package/dist/layout/table/table.d.ts +0 -47
  87. package/dist/layout/table/table.js +0 -8
  88. package/dist/layout/tabs/Tab.svelte +9 -6
  89. package/dist/layout/tabs/Tab.svelte.d.ts +1 -1
  90. package/dist/layout/tabs/TabContent.svelte +1 -2
  91. package/dist/layout/tabs/TabContent.svelte.d.ts +1 -1
  92. package/dist/layout/tabs/TabGroup.svelte +10 -5
  93. package/dist/layout/tabs/TabGroup.svelte.d.ts +2 -2
  94. package/dist/layout/tabs/tabs.d.ts +61 -76
  95. package/dist/layout/tabs/tabs.js +170 -28
  96. package/dist/modal/Modal.svelte +2 -1
  97. package/dist/modal/Modal.svelte.d.ts +1 -1
  98. package/dist/modal/modal.d.ts +0 -23
  99. package/dist/modal/modal.js +3 -3
  100. package/dist/sonner/sonner.svelte +13 -0
  101. package/dist/sonner/sonner.svelte.d.ts +4 -0
  102. package/dist/types/variants.d.ts +1 -21
  103. package/dist/types/variants.js +1 -19
  104. package/dist/utils/Portal.svelte +108 -0
  105. package/dist/utils/Portal.svelte.d.ts +8 -0
  106. package/dist/variants.d.ts +30 -0
  107. package/dist/variants.js +36 -0
  108. package/package.json +7 -3
  109. package/dist/button/index.d.ts +0 -1
  110. package/dist/button/index.js +0 -1
  111. package/dist/drawer/index.d.ts +0 -2
  112. package/dist/drawer/index.js +0 -1
  113. package/dist/elements/badge/index.d.ts +0 -2
  114. package/dist/elements/badge/index.js +0 -2
  115. package/dist/elements/dropdown/index.d.ts +0 -3
  116. package/dist/elements/dropdown/index.js +0 -2
  117. package/dist/header/index.d.ts +0 -4
  118. package/dist/header/index.js +0 -2
  119. package/dist/header/pageheaders.d.ts +0 -10
  120. package/dist/header/pageheaders.js +0 -1
  121. package/dist/layout/card/index.d.ts +0 -4
  122. package/dist/layout/card/index.js +0 -2
  123. package/dist/layout/index.d.ts +0 -5
  124. package/dist/layout/index.js +0 -5
  125. package/dist/layout/navbar/index.d.ts +0 -2
  126. package/dist/layout/navbar/index.js +0 -2
  127. package/dist/layout/sidebar/index.d.ts +0 -2
  128. package/dist/layout/sidebar/index.js +0 -1
  129. package/dist/layout/sidebar/sidebar.d.ts +0 -46
  130. package/dist/layout/sidebar/sidebar.js +0 -1
  131. package/dist/layout/table/index.d.ts +0 -3
  132. package/dist/layout/table/index.js +0 -2
  133. package/dist/layout/tabs/index.d.ts +0 -3
  134. package/dist/layout/tabs/index.js +0 -3
  135. package/dist/modal/index.d.ts +0 -1
  136. package/dist/modal/index.js +0 -1
@@ -1,45 +1,43 @@
1
- import type { ClassValue } from 'tailwind-variants';
2
- import type { Snippet } from 'svelte';
3
- import type { VariantColors } from '../../types/variants.js';
1
+ import { Color } from '../../variants.js';
4
2
  export declare const statsCard: import("tailwind-variants").TVReturnType<{
5
3
  color: {
6
- default: {
4
+ [Color.DEFAULT]: {
7
5
  label: string;
8
6
  value: string;
9
7
  trend: string;
10
8
  previousValue: string;
11
9
  };
12
- primary: {
10
+ [Color.PRIMARY]: {
13
11
  label: string;
14
12
  value: string;
15
13
  trend: string;
16
14
  previousValue: string;
17
15
  };
18
- secondary: {
16
+ [Color.SECONDARY]: {
19
17
  label: string;
20
18
  value: string;
21
19
  trend: string;
22
20
  previousValue: string;
23
21
  };
24
- info: {
22
+ [Color.INFO]: {
25
23
  label: string;
26
24
  value: string;
27
25
  trend: string;
28
26
  previousValue: string;
29
27
  };
30
- success: {
28
+ [Color.SUCCESS]: {
31
29
  label: string;
32
30
  value: string;
33
31
  trend: string;
34
32
  previousValue: string;
35
33
  };
36
- warning: {
34
+ [Color.WARNING]: {
37
35
  label: string;
38
36
  value: string;
39
37
  trend: string;
40
38
  previousValue: string;
41
39
  };
42
- danger: {
40
+ [Color.DANGER]: {
43
41
  label: string;
44
42
  value: string;
45
43
  trend: string;
@@ -64,46 +62,45 @@ export declare const statsCard: import("tailwind-variants").TVReturnType<{
64
62
  trend: string;
65
63
  previousValue: string;
66
64
  unit: string;
67
- chartContainer: string;
68
65
  }, undefined, {
69
66
  color: {
70
- default: {
67
+ [Color.DEFAULT]: {
71
68
  label: string;
72
69
  value: string;
73
70
  trend: string;
74
71
  previousValue: string;
75
72
  };
76
- primary: {
73
+ [Color.PRIMARY]: {
77
74
  label: string;
78
75
  value: string;
79
76
  trend: string;
80
77
  previousValue: string;
81
78
  };
82
- secondary: {
79
+ [Color.SECONDARY]: {
83
80
  label: string;
84
81
  value: string;
85
82
  trend: string;
86
83
  previousValue: string;
87
84
  };
88
- info: {
85
+ [Color.INFO]: {
89
86
  label: string;
90
87
  value: string;
91
88
  trend: string;
92
89
  previousValue: string;
93
90
  };
94
- success: {
91
+ [Color.SUCCESS]: {
95
92
  label: string;
96
93
  value: string;
97
94
  trend: string;
98
95
  previousValue: string;
99
96
  };
100
- warning: {
97
+ [Color.WARNING]: {
101
98
  label: string;
102
99
  value: string;
103
100
  trend: string;
104
101
  previousValue: string;
105
102
  };
106
- danger: {
103
+ [Color.DANGER]: {
107
104
  label: string;
108
105
  value: string;
109
106
  trend: string;
@@ -128,46 +125,45 @@ export declare const statsCard: import("tailwind-variants").TVReturnType<{
128
125
  trend: string;
129
126
  previousValue: string;
130
127
  unit: string;
131
- chartContainer: string;
132
128
  }, import("tailwind-variants").TVReturnType<{
133
129
  color: {
134
- default: {
130
+ [Color.DEFAULT]: {
135
131
  label: string;
136
132
  value: string;
137
133
  trend: string;
138
134
  previousValue: string;
139
135
  };
140
- primary: {
136
+ [Color.PRIMARY]: {
141
137
  label: string;
142
138
  value: string;
143
139
  trend: string;
144
140
  previousValue: string;
145
141
  };
146
- secondary: {
142
+ [Color.SECONDARY]: {
147
143
  label: string;
148
144
  value: string;
149
145
  trend: string;
150
146
  previousValue: string;
151
147
  };
152
- info: {
148
+ [Color.INFO]: {
153
149
  label: string;
154
150
  value: string;
155
151
  trend: string;
156
152
  previousValue: string;
157
153
  };
158
- success: {
154
+ [Color.SUCCESS]: {
159
155
  label: string;
160
156
  value: string;
161
157
  trend: string;
162
158
  previousValue: string;
163
159
  };
164
- warning: {
160
+ [Color.WARNING]: {
165
161
  label: string;
166
162
  value: string;
167
163
  trend: string;
168
164
  previousValue: string;
169
165
  };
170
- danger: {
166
+ [Color.DANGER]: {
171
167
  label: string;
172
168
  value: string;
173
169
  trend: string;
@@ -192,17 +188,4 @@ export declare const statsCard: import("tailwind-variants").TVReturnType<{
192
188
  trend: string;
193
189
  previousValue: string;
194
190
  unit: string;
195
- chartContainer: string;
196
191
  }, undefined, unknown, unknown, undefined>>;
197
- export type StatsCardProps = {
198
- label?: string;
199
- value?: string | number;
200
- previousValue?: string | number;
201
- previousValuePrefix?: string;
202
- trend?: number;
203
- color?: VariantColors;
204
- chartData?: number[];
205
- children?: Snippet;
206
- class?: ClassValue;
207
- formatLargeNumbers?: boolean;
208
- };
@@ -1,4 +1,5 @@
1
1
  import { tv } from 'tailwind-variants';
2
+ import { Color } from '../../variants.js';
2
3
  export const statsCard = tv({
3
4
  slots: {
4
5
  base: '',
@@ -7,47 +8,46 @@ export const statsCard = tv({
7
8
  trend: '',
8
9
  previousValue: '',
9
10
  unit: '',
10
- chartContainer: ''
11
11
  },
12
12
  variants: {
13
13
  color: {
14
- default: {
15
- label: 'text-gray-500',
16
- value: 'text-gray-900',
17
- trend: 'text-gray-600',
18
- previousValue: 'text-gray-500'
14
+ [Color.DEFAULT]: {
15
+ label: 'text-default-500',
16
+ value: 'text-default-900',
17
+ trend: 'text-default-600',
18
+ previousValue: 'text-default-500'
19
19
  },
20
- primary: {
20
+ [Color.PRIMARY]: {
21
21
  label: 'text-primary-500',
22
22
  value: 'text-primary-600',
23
23
  trend: 'text-primary-600',
24
24
  previousValue: 'text-primary-400'
25
25
  },
26
- secondary: {
26
+ [Color.SECONDARY]: {
27
27
  label: 'text-secondary-500',
28
28
  value: 'text-secondary-600',
29
29
  trend: 'text-secondary-600',
30
30
  previousValue: 'text-secondary-400'
31
31
  },
32
- info: {
32
+ [Color.INFO]: {
33
33
  label: 'text-info-500',
34
34
  value: 'text-info-600',
35
35
  trend: 'text-info-600',
36
36
  previousValue: 'text-info-400'
37
37
  },
38
- success: {
38
+ [Color.SUCCESS]: {
39
39
  label: 'text-success-500',
40
40
  value: 'text-success-600',
41
41
  trend: 'text-success-600',
42
42
  previousValue: 'text-success-400'
43
43
  },
44
- warning: {
44
+ [Color.WARNING]: {
45
45
  label: 'text-warning-500',
46
46
  value: 'text-warning-600',
47
47
  trend: 'text-warning-600',
48
48
  previousValue: 'text-warning-400'
49
49
  },
50
- danger: {
50
+ [Color.DANGER]: {
51
51
  label: 'text-danger-500',
52
52
  value: 'text-danger-600',
53
53
  trend: 'text-danger-600',
@@ -62,12 +62,12 @@ export const statsCard = tv({
62
62
  trend: 'text-danger-600'
63
63
  },
64
64
  neutral: {
65
- trend: 'text-gray-600'
65
+ trend: 'text-default-600'
66
66
  }
67
67
  }
68
68
  },
69
69
  defaultVariants: {
70
- color: 'default',
70
+ color: Color.DEFAULT,
71
71
  trendDirection: 'neutral'
72
72
  }
73
73
  });
@@ -198,31 +198,8 @@ export declare const navbar: import("tailwind-variants").TVReturnType<{
198
198
  export type NavbarProps = {
199
199
  logo?: string | Component;
200
200
  links?: NavbarLinkItem[];
201
- color?: keyof typeof navbar.variants.color;
202
- size?: keyof typeof navbar.variants.size;
203
201
  class?: ClassValue;
204
- wrapperClass?: ClassValue;
205
- brandClass?: ClassValue;
206
- menuClass?: ClassValue;
207
- mobileMenuClass?: ClassValue;
208
- linksClass?: ClassValue;
209
- linkClass?: ClassValue;
210
- mobileLinkClass?: ClassValue;
211
- actionsClass?: ClassValue;
212
- sticky?: boolean;
213
202
  brand?: Snippet;
214
203
  children?: Snippet;
215
204
  actions?: Snippet;
216
- userMenu?: boolean;
217
- username?: string;
218
- userAvatar?: string;
219
- userMenuItems?: {
220
- label: string;
221
- href: string;
222
- onClick?: () => void;
223
- }[];
224
- onmenuitemclick?: (item: {
225
- label: string;
226
- href: string;
227
- }) => void;
228
205
  };
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { getContext } from 'svelte';
3
- import type { MenuBar, NavGroupProps } from './sidebar.js';
3
+ import type { MenuBar, NavGroupProps } from '../../index.js';
4
4
  import { cn } from '../../helper/cls.js';
5
5
 
6
6
  let {
@@ -20,23 +20,20 @@
20
20
 
21
21
  const menubar: MenuBar = getContext('menubar');
22
22
 
23
- $effect(() => {
24
- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
25
- menubar.collapsed;
26
- resetIsActive();
27
- });
28
-
29
23
  const navGroupClasses = $derived(
30
24
  cn(
31
- `flex items-center gap-x-3 hover:bg-gray-950 p-1.5 rounded-md w-full cursor-pointer
32
- text-gray-400 text-sm/6 text-left`,
33
- { 'font-semibold bg-gray-950': isActive, 'hover:bg-gray-950': !isActive },
25
+ `items-center gap-x-3 p-1.5 rounded-md w-full cursor-pointer text-default-400 text-sm/6 text-left font-medium`,
26
+ {
27
+ 'font-semibold ': isActive,
28
+ hidden: menubar.collapsed,
29
+ 'hidden xl:flex': !menubar.collapsed
30
+ },
34
31
  className
35
32
  )
36
33
  );
37
34
 
38
35
  const chevronIconClasses = $derived(
39
- cn('size-4 text-gray-600 shrink-0', {
36
+ cn('size-4 text-default-600 shrink-0', {
40
37
  'rotate-90': isActive,
41
38
  '-ml-2 xl:ml-auto': !menubar.collapsed,
42
39
  '-ml-2': menubar.collapsed
@@ -50,51 +47,45 @@
50
47
  })
51
48
  );
52
49
 
53
- const topDivClasses = $derived(
54
- cn('overflow-hidden transition-all duration-200', {
55
- 'fixed left-0 top-0 shadow-lg w-screen h-screen z-50 bg-gray-700/30 backdrop-blur': isActive,
56
- 'xl:static xl:shadow-none xl:bg-transparent mt-0 xl:mt-1 xl:w-auto xl:h-auto':
57
- !menubar.collapsed
58
- })
59
- );
60
-
61
- const toggleButtonClasses = $derived(
62
- cn('bg-slate-900 w-72 pl-3 h-8 flex p-2', {
63
- 'xl:hidden': isActive && !menubar.collapsed
50
+ const iconClasses = $derived(
51
+ cn('size-6 shrink-0 text-default-600', {
52
+ 'flex xl:hidden': !menubar.collapsed
64
53
  })
65
54
  );
66
55
 
67
- const navUlClasses = $derived(
68
- cn('w-52', {
69
- 'bg-slate-900 w-72 h-[calc(100vh-32px)] p-2': isActive,
70
- 'xl:h-auto xl:bg-transparent xl:p-0 xl:w-52 xl:ml-2': !menubar.collapsed
56
+ const topDivClasses = $derived(
57
+ cn('overflow-hidden transition-all duration-200', {
58
+ 'bg-transparent mt-0 mt-1 w-auto': !menubar.collapsed,
59
+ 'xl:hidden': !isActive,
60
+ 'hidden xl:block': menubar.collapsed
71
61
  })
72
62
  );
73
63
  </script>
74
64
 
75
- <svelte:window onresize={resetIsActive} />
76
-
77
65
  <div>
78
66
  <button type="button" class={navGroupClasses} onclick={toggle}>
79
- {@render labelArea(labelClasses)}
80
- <FluentChevronRight16Filled class={chevronIconClasses} />
67
+ {@render labelArea(labelClasses, iconClasses)}
68
+ {@render ChevronIcon(chevronIconClasses, 0.7)}
81
69
  </button>
82
70
 
83
- {#if isActive}
84
- <div class={topDivClasses}>
85
- <div class={toggleButtonClasses}>
86
- <button
87
- type="button"
88
- class="flex h-7 w-7 cursor-pointer items-center justify-center gap-x-3
89
- rounded-md bg-slate-800 text-left text-sm/6 text-gray-700"
90
- onclick={toggle}
91
- >
92
- <FluentChevronRight16Filled class="size-4 shrink-0 -rotate-180 text-gray-600" />
93
- </button>
94
- </div>
95
- <ul class={navUlClasses}>
96
- {@render children?.()}
97
- </ul>
98
- </div>
99
- {/if}
71
+ <div class={topDivClasses}>
72
+ <ul>
73
+ {@render children?.()}
74
+ </ul>
75
+ </div>
100
76
  </div>
77
+
78
+ {#snippet ChevronIcon(className: string, size: number)}
79
+ <svg
80
+ xmlns="http://www.w3.org/2000/svg"
81
+ width="{size}em"
82
+ height="{size}em"
83
+ viewBox="0 0 16 16"
84
+ class={className}
85
+ >
86
+ <path
87
+ fill="currentColor"
88
+ d="M5.74 3.2a.75.75 0 0 0-.04 1.06L9.227 8L5.7 11.74a.75.75 0 1 0 1.1 1.02l4-4.25a.75.75 0 0 0 0-1.02l-4-4.25a.75.75 0 0 0-1.06-.04"
89
+ />
90
+ </svg>
91
+ {/snippet}
@@ -1,4 +1,4 @@
1
- import type { NavGroupProps } from './sidebar.js';
1
+ import type { NavGroupProps } from '../../index.js';
2
2
  declare const NavGroup: import("svelte").Component<NavGroupProps, {}, "">;
3
3
  type NavGroup = ReturnType<typeof NavGroup>;
4
4
  export default NavGroup;
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
2
  import clsx from 'clsx';
3
3
  import { getContext } from 'svelte';
4
- import type { MenuBar, NavItemProps } from './sidebar.js';
4
+ import type { MenuBar, NavItemProps } from '../../index.js';
5
5
  import { cn } from '../../helper/cls.js';
6
6
 
7
7
  let { href, children, active, class: className = '' }: NavItemProps = $props();
@@ -10,8 +10,8 @@
10
10
 
11
11
  const navItemClasses = $derived(
12
12
  cn([
13
- 'group flex gap-x-3 p-2 rounded-md text-gray-400 text-sm/6',
14
- { 'bg-gray-950 font-semibold': active, 'hover:bg-gray-950': !active },
13
+ 'group flex gap-x-3 p-2 rounded-md text-default-400 text-sm/6',
14
+ { 'bg-default-950 font-semibold': active, 'hover:bg-default-950': !active },
15
15
  className
16
16
  ])
17
17
  );
@@ -1,4 +1,4 @@
1
- import type { NavItemProps } from './sidebar.js';
1
+ import type { NavItemProps } from '../../index.js';
2
2
  declare const NavItem: import("svelte").Component<NavItemProps, {}, "">;
3
3
  type NavItem = ReturnType<typeof NavItem>;
4
4
  export default NavItem;
@@ -1,16 +1,7 @@
1
1
  <script lang="ts">
2
- import NavGroup from './NavGroup.svelte';
3
- import NavItem from './NavItem.svelte';
4
2
  import { setContext } from 'svelte';
5
- import type {
6
- MenuBar,
7
- NavigationItem,
8
- SidebarProps,
9
- ParentItem,
10
- LinkItem
11
- } from './sidebar.js';
3
+ import type { MenuBar, NavigationItem, SidebarProps, ParentItem, LinkItem } from '../../index.js';
12
4
  import clsx from 'clsx';
13
- import { cn } from '../../helper/cls.js';
14
5
  import { isRouteActive } from '../../helper/nav.svelte.js';
15
6
 
16
7
  let { items = [], logo }: SidebarProps = $props();
@@ -33,16 +24,15 @@
33
24
 
34
25
  if ('children' in item) {
35
26
  const parentItem = item as ParentItem;
36
- let anyChildActive = false;
27
+ let anyChildActive = parentItem.active;
37
28
 
38
29
  const updatedChildren = parentItem.children.map((child) => {
39
- const childActive = isRouteActive(child.href);
30
+ const childActive = isRouteActive(child.href, true);
40
31
  if (childActive) {
41
32
  anyChildActive = true;
42
33
  }
43
34
  return { ...child, active: childActive };
44
35
  });
45
-
46
36
  return { ...parentItem, active: anyChildActive, children: updatedChildren };
47
37
  }
48
38
 
@@ -56,90 +46,129 @@
56
46
 
57
47
  // Reactively compute the active states based on the current route
58
48
  const navigationItems = $derived(items.map((item) => processNavigationItem(item)));
49
+ $inspect(navigationItems)
59
50
 
60
51
  const sidebarClasses = $derived(
61
- clsx(
62
- `flex min-h-screen max-h-screen overflow-y-auto flex-col gap-y-1 overflow-y-auto
63
- border-r border-gray-800 bg-gray-900 px-3 duration-300 sticky top-0`,
64
- {
65
- 'w-16': menubar.collapsed,
66
- 'w-16 xl:w-72 shrink-0': !menubar.collapsed
67
- }
68
- )
52
+ clsx(`min-h-screen flex flex-col bg-gradient-to-b from-gray-900 to-default-900 h-full`, {
53
+ 'w-16': menubar.collapsed,
54
+ 'w-16 xl:w-64 shrink-0': !menubar.collapsed
55
+ })
69
56
  );
70
57
 
71
58
  const logoTextClasses = $derived(
72
- clsx('text-xl font-semibold hidden text-white', { 'xl:block': !menubar.collapsed })
59
+ clsx('text-xl font-bold text-white', {
60
+ 'xl:block': !menubar.collapsed,
61
+ hidden: menubar.collapsed
62
+ })
73
63
  );
74
64
 
75
65
  const logoWrapperClasses = $derived(
76
- clsx('flex shrink-0 items-center justify-between mt-3 flex-col', {
77
- 'xl:mt-0 xl:h-16 flex-row': !menubar.collapsed
78
- })
66
+ clsx(
67
+ 'flex items-center h-16 flex-shrink-0 px-4 bg-gradient-to-r from-gray-900 to-default-900/50 border-b border-white/10',
68
+ {
69
+ 'justify-between': !menubar.collapsed,
70
+ 'justify-center': menubar.collapsed
71
+ }
72
+ )
79
73
  );
80
74
  </script>
81
75
 
82
76
  <div class={sidebarClasses}>
83
77
  <div class={logoWrapperClasses}>
84
78
  <div class="flex items-center gap-x-1">
85
- {#if logo.src}
79
+ {#if logo.src && !menubar.collapsed}
86
80
  <img src={logo.src} alt={logo.title} class="size-8 shrink-0" />
87
81
  {/if}
88
- {#if logo.title}
82
+ {#if logo.title && !menubar.collapsed}
89
83
  <h1 class={logoTextClasses}>{logo.title}</h1>
90
84
  {/if}
91
85
  </div>
92
- <button onclick={toggle} class="hidden cursor-pointer xl:block" aria-label="Toggle Sidebar">
93
- <svg
94
- xmlns="http://www.w3.org/2000/svg"
95
- width="0.8em"
96
- height="0.8em"
97
- viewBox="0 0 24 24"
98
- class="size-6 shrink-0 text-gray-600"
99
- >
100
- <path
101
- fill="currentColor"
102
- d="M3 17h18a1 1 0 0 1 .117 1.993L21 19H3a1 1 0 0 1-.117-1.993zh18zm0-6l18-.002a1 1 0 0 1 .117 1.993l-.117.007L3 13a1 1 0 0 1-.117-1.993zl18-.002zm0-6h18a1 1 0 0 1 .117 1.993L21 7H3a1 1 0 0 1-.117-1.993zh18z"
103
- />
104
- </svg>
86
+ <button
87
+ onclick={toggle}
88
+ class="hidden cursor-pointer text-white xl:block"
89
+ aria-label="Toggle Sidebar"
90
+ >
91
+ {@render ToggleIcon()}
105
92
  </button>
106
93
  </div>
107
- <nav class="flex flex-1 flex-col">
108
- <ul role="list" class="flex flex-1 flex-col gap-y-1">
94
+
95
+ <div class="flex flex-1 flex-col overflow-y-auto bg-gradient-to-b from-transparent to-black/20">
96
+ <nav class="flex-1 space-y-6 px-2 py-4">
109
97
  {#each navigationItems as item, index (index)}
110
98
  {#if 'type' in item && item.type === 'horizontal-divider'}
111
- <li class="my-3 border-t border-gray-700"></li>
99
+ <li class="my-2 border-t border-white/10"></li>
112
100
  {:else if 'children' in item}
113
- <NavGroup active={item.active}>
114
- {#snippet labelArea(classes)}
115
- {#if item.Icon}
116
- {@const Icon = item.Icon}
117
- <Icon class="size-6 shrink-0 text-gray-600" />
118
- {/if}
119
- <span class={cn(classes)}>{item.label}</span>
120
- {/snippet}
121
- {#each item.children as child (child.label)}
122
- <NavItem href={child.href} active={child.active}>
123
- {#if child.Icon}
124
- {@const Icon = child.Icon}
125
- <Icon class="size-6 shrink-0 text-gray-600" />
126
- {/if}
127
- <span class="truncate">{child.label}</span>
128
- </NavItem>
129
- {/each}
130
- </NavGroup>
101
+ <div>
102
+ {#if !menubar.collapsed}
103
+ <h3 class="text-default-200 px-3 text-xs font-semibold tracking-wider uppercase">
104
+ {item.label}
105
+ </h3>
106
+ {/if}
107
+ <div class={menubar.collapsed ? '' : 'mt-2 space-y-1'}>
108
+ {#each item.children as child (child.label)}
109
+ <button
110
+ class="group hover:bg-default-500/10 flex w-full cursor-pointer items-center rounded-md px-3 py-2 text-sm font-medium transition-all duration-150 ease-in-out hover:text-white {child.active
111
+ ? 'bg-default-500/20'
112
+ : ''} {menubar.collapsed ? 'justify-center' : ''}"
113
+ class:text-white={child.active}
114
+ class:text-gray-300={!child.active}
115
+ onclick={() => (window.location.href = child.href)}
116
+ title={menubar.collapsed ? child.label : ''}
117
+ >
118
+ {#if child.Icon}
119
+ {@const Icon = child.Icon}
120
+ <Icon
121
+ class="h-5 w-5 flex-shrink-0 {child.active
122
+ ? 'text-default-200'
123
+ : 'text-gray-400'} {menubar.collapsed ? '' : 'mr-3'}"
124
+ />
125
+ {/if}
126
+ {#if !menubar.collapsed}
127
+ <span class="truncate">{child.label}</span>
128
+ {/if}
129
+ </button>
130
+ {/each}
131
+ </div>
132
+ </div>
131
133
  {:else if 'href' in item}
132
- <NavItem href={item.href} active={item.active}>
133
- {#snippet children(classes)}
134
- {#if item.Icon}
135
- {@const Icon = item.Icon}
136
- <Icon class="size-6 shrink-0 text-gray-600" />
137
- {/if}
138
- <span class={cn(classes)}>{item.label}</span>
139
- {/snippet}
140
- </NavItem>
134
+ <button
135
+ class="group hover:bg-default-500/10 flex w-full cursor-pointer items-center rounded-md px-3 py-2 text-sm font-medium transition-all duration-150 ease-in-out hover:text-white {item.active
136
+ ? 'bg-default-500/20'
137
+ : ''} {menubar.collapsed ? 'justify-center' : ''}"
138
+ class:text-white={item.active}
139
+ class:text-gray-300={!item.active}
140
+ onclick={() => (window.location.href = item.href)}
141
+ title={menubar.collapsed ? item.label : ''}
142
+ >
143
+ {#if item.Icon}
144
+ {@const Icon = item.Icon}
145
+ <Icon
146
+ class="h-5 w-5 flex-shrink-0 {item.active
147
+ ? 'text-default-200'
148
+ : 'text-gray-400'} {menubar.collapsed ? '' : 'mr-3'}"
149
+ />
150
+ {/if}
151
+ {#if !menubar.collapsed}
152
+ <span class="truncate">{item.label}</span>
153
+ {/if}
154
+ </button>
141
155
  {/if}
142
156
  {/each}
143
- </ul>
144
- </nav>
157
+ </nav>
158
+ </div>
145
159
  </div>
160
+
161
+ {#snippet ToggleIcon(classes = 'size-6 shrink-0 text-default-200')}
162
+ <svg
163
+ xmlns="http://www.w3.org/2000/svg"
164
+ width="0.8em"
165
+ height="0.8em"
166
+ viewBox="0 0 24 24"
167
+ class={classes}
168
+ >
169
+ <path
170
+ fill="currentColor"
171
+ d="M3 17h18a1 1 0 0 1 .117 1.993L21 19H3a1 1 0 0 1-.117-1.993zh18zm0-6l18-.002a1 1 0 0 1 .117 1.993l-.117.007L3 13a1 1 0 0 1-.117-1.993zl18-.002zm0-6h18a1 1 0 0 1 .117 1.993L21 7H3a1 1 0 0 1-.117-1.993zh18z"
172
+ />
173
+ </svg>
174
+ {/snippet}
@@ -1,4 +1,4 @@
1
- import type { SidebarProps } from './sidebar.js';
1
+ import type { SidebarProps } from '../../index.js';
2
2
  declare const Sidebar: import("svelte").Component<SidebarProps, {}, "">;
3
3
  type Sidebar = ReturnType<typeof Sidebar>;
4
4
  export default Sidebar;