@foxui/core 0.4.0

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 (183) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -0
  3. package/dist/components/accordion/accordion-content.svelte +22 -0
  4. package/dist/components/accordion/accordion-content.svelte.d.ts +4 -0
  5. package/dist/components/accordion/accordion-item.svelte +35 -0
  6. package/dist/components/accordion/accordion-item.svelte.d.ts +9 -0
  7. package/dist/components/accordion/accordion-trigger.svelte +40 -0
  8. package/dist/components/accordion/accordion-trigger.svelte.d.ts +7 -0
  9. package/dist/components/accordion/index.d.ts +6 -0
  10. package/dist/components/accordion/index.js +6 -0
  11. package/dist/components/alert/alert-description.svelte +16 -0
  12. package/dist/components/alert/alert-description.svelte.d.ts +5 -0
  13. package/dist/components/alert/alert-title.svelte +25 -0
  14. package/dist/components/alert/alert-title.svelte.d.ts +8 -0
  15. package/dist/components/alert/alert.svelte +122 -0
  16. package/dist/components/alert/alert.svelte.d.ts +79 -0
  17. package/dist/components/alert/index.d.ts +5 -0
  18. package/dist/components/alert/index.js +5 -0
  19. package/dist/components/avatar/Avatar.svelte +73 -0
  20. package/dist/components/avatar/Avatar.svelte.d.ts +14 -0
  21. package/dist/components/avatar/AvatarGroup.svelte +43 -0
  22. package/dist/components/avatar/AvatarGroup.svelte.d.ts +16 -0
  23. package/dist/components/avatar/index.d.ts +3 -0
  24. package/dist/components/avatar/index.js +3 -0
  25. package/dist/components/badge/Badge.svelte +80 -0
  26. package/dist/components/badge/Badge.svelte.d.ts +100 -0
  27. package/dist/components/badge/index.d.ts +1 -0
  28. package/dist/components/badge/index.js +1 -0
  29. package/dist/components/box/Box.svelte +23 -0
  30. package/dist/components/box/Box.svelte.d.ts +5 -0
  31. package/dist/components/box/index.d.ts +1 -0
  32. package/dist/components/box/index.js +1 -0
  33. package/dist/components/button/Button.svelte +103 -0
  34. package/dist/components/button/Button.svelte.d.ts +110 -0
  35. package/dist/components/button/index.d.ts +1 -0
  36. package/dist/components/button/index.js +1 -0
  37. package/dist/components/card/ImageCard.svelte +62 -0
  38. package/dist/components/card/ImageCard.svelte.d.ts +12 -0
  39. package/dist/components/card/index.d.ts +1 -0
  40. package/dist/components/card/index.js +1 -0
  41. package/dist/components/chat-bubble/ChatBubble.svelte +96 -0
  42. package/dist/components/chat-bubble/ChatBubble.svelte.d.ts +95 -0
  43. package/dist/components/chat-bubble/index.d.ts +1 -0
  44. package/dist/components/chat-bubble/index.js +1 -0
  45. package/dist/components/checkbox/checkbox.svelte +91 -0
  46. package/dist/components/checkbox/checkbox.svelte.d.ts +42 -0
  47. package/dist/components/checkbox/index.d.ts +1 -0
  48. package/dist/components/checkbox/index.js +1 -0
  49. package/dist/components/copy-code-button/AddCopyCodeButtons.svelte +35 -0
  50. package/dist/components/copy-code-button/AddCopyCodeButtons.svelte.d.ts +6 -0
  51. package/dist/components/copy-code-button/CopyCodeButton.svelte +69 -0
  52. package/dist/components/copy-code-button/CopyCodeButton.svelte.d.ts +7 -0
  53. package/dist/components/copy-code-button/index.d.ts +2 -0
  54. package/dist/components/copy-code-button/index.js +2 -0
  55. package/dist/components/head/Head.svelte +49 -0
  56. package/dist/components/head/Head.svelte.d.ts +10 -0
  57. package/dist/components/head/index.d.ts +1 -0
  58. package/dist/components/head/index.js +1 -0
  59. package/dist/components/heading/Heading.svelte +24 -0
  60. package/dist/components/heading/Heading.svelte.d.ts +8 -0
  61. package/dist/components/heading/Subheading.svelte +24 -0
  62. package/dist/components/heading/Subheading.svelte.d.ts +8 -0
  63. package/dist/components/heading/index.d.ts +3 -0
  64. package/dist/components/heading/index.js +3 -0
  65. package/dist/components/image/Image.svelte +80 -0
  66. package/dist/components/image/Image.svelte.d.ts +12 -0
  67. package/dist/components/image/index.d.ts +2 -0
  68. package/dist/components/image/index.js +1 -0
  69. package/dist/components/image-container/ImageContainer.svelte +15 -0
  70. package/dist/components/image-container/ImageContainer.svelte.d.ts +4 -0
  71. package/dist/components/image-container/index.d.ts +1 -0
  72. package/dist/components/image-container/index.js +1 -0
  73. package/dist/components/index.d.ts +34 -0
  74. package/dist/components/index.js +34 -0
  75. package/dist/components/input/Input.svelte +60 -0
  76. package/dist/components/input/Input.svelte.d.ts +46 -0
  77. package/dist/components/input/index.d.ts +2 -0
  78. package/dist/components/input/index.js +2 -0
  79. package/dist/components/label/Label.svelte +19 -0
  80. package/dist/components/label/Label.svelte.d.ts +4 -0
  81. package/dist/components/label/index.d.ts +1 -0
  82. package/dist/components/label/index.js +1 -0
  83. package/dist/components/modal/Modal.svelte +167 -0
  84. package/dist/components/modal/Modal.svelte.d.ts +33 -0
  85. package/dist/components/modal/index.d.ts +2 -0
  86. package/dist/components/modal/index.js +1 -0
  87. package/dist/components/navbar/Navbar.svelte +63 -0
  88. package/dist/components/navbar/Navbar.svelte.d.ts +8 -0
  89. package/dist/components/navbar/index.d.ts +1 -0
  90. package/dist/components/navbar/index.js +1 -0
  91. package/dist/components/number-input/NumberInput.svelte +201 -0
  92. package/dist/components/number-input/NumberInput.svelte.d.ts +98 -0
  93. package/dist/components/number-input/index.d.ts +2 -0
  94. package/dist/components/number-input/index.js +1 -0
  95. package/dist/components/paragraph/Paragraph.svelte +20 -0
  96. package/dist/components/paragraph/Paragraph.svelte.d.ts +5 -0
  97. package/dist/components/paragraph/index.d.ts +2 -0
  98. package/dist/components/paragraph/index.js +2 -0
  99. package/dist/components/popover/Popover.svelte +63 -0
  100. package/dist/components/popover/Popover.svelte.d.ts +14 -0
  101. package/dist/components/popover/index.d.ts +8 -0
  102. package/dist/components/popover/index.js +7 -0
  103. package/dist/components/popover/popover-content.svelte +28 -0
  104. package/dist/components/popover/popover-content.svelte.d.ts +7 -0
  105. package/dist/components/prose/Prose.svelte +107 -0
  106. package/dist/components/prose/Prose.svelte.d.ts +35 -0
  107. package/dist/components/prose/ProseCopyButton.svelte +12 -0
  108. package/dist/components/prose/ProseCopyButton.svelte.d.ts +8 -0
  109. package/dist/components/prose/index.d.ts +4 -0
  110. package/dist/components/prose/index.js +2 -0
  111. package/dist/components/scroll-area/BodyScrollArea.svelte +3 -0
  112. package/dist/components/scroll-area/BodyScrollArea.svelte.d.ts +19 -0
  113. package/dist/components/scroll-area/ScrollArea.svelte +71 -0
  114. package/dist/components/scroll-area/ScrollArea.svelte.d.ts +8 -0
  115. package/dist/components/scroll-area/index.d.ts +1 -0
  116. package/dist/components/scroll-area/index.js +1 -0
  117. package/dist/components/scroll-area/style.css +41 -0
  118. package/dist/components/select/Select.svelte +88 -0
  119. package/dist/components/select/Select.svelte.d.ts +13 -0
  120. package/dist/components/select/SelectChildren.svelte +29 -0
  121. package/dist/components/select/SelectChildren.svelte.d.ts +8 -0
  122. package/dist/components/select/SelectItem.svelte +31 -0
  123. package/dist/components/select/SelectItem.svelte.d.ts +4 -0
  124. package/dist/components/select/index.d.ts +3 -0
  125. package/dist/components/select/index.js +3 -0
  126. package/dist/components/select-2/Select.svelte +46 -0
  127. package/dist/components/select-2/Select.svelte.d.ts +12 -0
  128. package/dist/components/select-2/index.d.ts +1 -0
  129. package/dist/components/select-2/index.js +1 -0
  130. package/dist/components/sidebar/Sidebar.svelte +69 -0
  131. package/dist/components/sidebar/Sidebar.svelte.d.ts +9 -0
  132. package/dist/components/sidebar/index.d.ts +1 -0
  133. package/dist/components/sidebar/index.js +1 -0
  134. package/dist/components/slider/Slider.svelte +65 -0
  135. package/dist/components/slider/Slider.svelte.d.ts +4 -0
  136. package/dist/components/slider/SliderNumber.svelte +40 -0
  137. package/dist/components/slider/SliderNumber.svelte.d.ts +4 -0
  138. package/dist/components/slider/index.d.ts +3 -0
  139. package/dist/components/slider/index.js +3 -0
  140. package/dist/components/sonner/Toaster.svelte +73 -0
  141. package/dist/components/sonner/Toaster.svelte.d.ts +10 -0
  142. package/dist/components/sonner/index.d.ts +2 -0
  143. package/dist/components/sonner/index.js +2 -0
  144. package/dist/components/switch/index.d.ts +2 -0
  145. package/dist/components/switch/index.js +2 -0
  146. package/dist/components/switch/switch.svelte +27 -0
  147. package/dist/components/switch/switch.svelte.d.ts +4 -0
  148. package/dist/components/tabs/TabItem.svelte +56 -0
  149. package/dist/components/tabs/TabItem.svelte.d.ts +9 -0
  150. package/dist/components/tabs/Tabs.svelte +29 -0
  151. package/dist/components/tabs/Tabs.svelte.d.ts +12 -0
  152. package/dist/components/tabs/index.d.ts +2 -0
  153. package/dist/components/tabs/index.js +2 -0
  154. package/dist/components/textarea/index.d.ts +19 -0
  155. package/dist/components/textarea/index.js +2 -0
  156. package/dist/components/textarea/textarea.svelte +57 -0
  157. package/dist/components/textarea/textarea.svelte.d.ts +47 -0
  158. package/dist/components/theme-toggle/ThemeToggle.svelte +105 -0
  159. package/dist/components/theme-toggle/ThemeToggle.svelte.d.ts +7 -0
  160. package/dist/components/theme-toggle/index.d.ts +2 -0
  161. package/dist/components/theme-toggle/index.js +2 -0
  162. package/dist/components/toggle/index.d.ts +3 -0
  163. package/dist/components/toggle/index.js +3 -0
  164. package/dist/components/toggle/toggle.svelte +49 -0
  165. package/dist/components/toggle/toggle.svelte.d.ts +40 -0
  166. package/dist/components/toggle-group/index.d.ts +3 -0
  167. package/dist/components/toggle-group/index.js +3 -0
  168. package/dist/components/toggle-group/toggle-group-item.svelte +30 -0
  169. package/dist/components/toggle-group/toggle-group-item.svelte.d.ts +6 -0
  170. package/dist/components/toggle-group/toggle-group.svelte +41 -0
  171. package/dist/components/toggle-group/toggle-group.svelte.d.ts +8 -0
  172. package/dist/components/tooltip/index.d.ts +7 -0
  173. package/dist/components/tooltip/index.js +9 -0
  174. package/dist/components/tooltip/tooltip-content.svelte +21 -0
  175. package/dist/components/tooltip/tooltip-content.svelte.d.ts +4 -0
  176. package/dist/components/tooltip/tooltip.svelte +62 -0
  177. package/dist/components/tooltip/tooltip.svelte.d.ts +12 -0
  178. package/dist/index.d.ts +2 -0
  179. package/dist/index.js +3 -0
  180. package/dist/types.d.ts +1 -0
  181. package/dist/utils.d.ts +2 -0
  182. package/dist/utils.js +5 -0
  183. package/package.json +82 -0
@@ -0,0 +1,73 @@
1
+ <script lang="ts">
2
+ import { Toaster as SonnerToaster } from 'svelte-sonner';
3
+
4
+ const colorClasses = {
5
+ blue: 'bg-blue-200/50 dark:bg-blue-950/50 text-blue-600 [&_.title]:text-blue-800 [&_.description]:text-blue-700 dark:text-blue-500 border-blue-700/20 dark:border-blue-500/20 dark:[&_.title]:text-blue-300 dark:[&_.description]:text-blue-400',
6
+ red: 'bg-red-200/50 dark:bg-red-950/50 text-red-600 [&_.title]:text-red-800 [&_.description]:text-red-700 dark:text-red-500 border-red-700/20 dark:border-red-500/20 dark:[&_.title]:text-red-300 dark:[&_.description]:text-red-400',
7
+ yellow:
8
+ 'bg-yellow-200/50 dark:bg-yellow-950/50 text-yellow-600 [&_.title]:text-yellow-800 [&_.description]:text-yellow-700 dark:text-yellow-500 border-yellow-700/20 dark:border-yellow-500/20 dark:[&_.title]:text-yellow-300 dark:[&_.description]:text-yellow-400',
9
+ green:
10
+ 'bg-green-200/50 dark:bg-green-950/50 text-green-600 [&_.title]:text-green-800 [&_.description]:text-green-700 dark:text-green-500 border-green-700/20 dark:border-green-500/20 dark:[&_.title]:text-green-300 dark:[&_.description]:text-green-400',
11
+ indigo:
12
+ 'bg-indigo-200/50 dark:bg-indigo-950/50 text-indigo-600 [&_.title]:text-indigo-800 [&_.description]:text-indigo-700 dark:text-indigo-500 border-indigo-700/20 dark:border-indigo-500/20 dark:[&_.title]:text-indigo-300 dark:[&_.description]:text-indigo-400',
13
+ purple:
14
+ 'bg-purple-200/50 dark:bg-purple-950/50 text-purple-600 [&_.title]:text-purple-800 [&_.description]:text-purple-700 dark:text-purple-500 border-purple-700/20 dark:border-purple-500/20 dark:[&_.title]:text-purple-300 dark:[&_.description]:text-purple-400',
15
+ pink: 'bg-pink-200/50 dark:bg-pink-950/50 text-pink-600 [&_.title]:text-pink-800 [&_.description]:text-pink-700 dark:text-pink-500 border-pink-700/20 dark:border-pink-500/20 dark:[&_.title]:text-pink-300 dark:[&_.description]:text-pink-400',
16
+ orange:
17
+ 'bg-orange-200/50 dark:bg-orange-950/50 text-orange-600 [&_.title]:text-orange-800 [&_.description]:text-orange-700 dark:text-orange-500 border-orange-700/20 dark:border-orange-500/20 dark:[&_.title]:text-orange-300 dark:[&_.description]:text-orange-400',
18
+ teal: 'bg-teal-200/50 dark:bg-teal-950/50 text-teal-600 [&_.title]:text-teal-800 [&_.description]:text-teal-700 dark:text-teal-500 border-teal-700/20 dark:border-teal-500/20 dark:[&_.title]:text-teal-300 dark:[&_.description]:text-teal-400',
19
+ emerald:
20
+ 'bg-emerald-200/50 dark:bg-emerald-950/50 text-emerald-600 [&_.title]:text-emerald-800 [&_.description]:text-emerald-700 dark:text-emerald-500 border-emerald-700/20 dark:border-emerald-500/20 dark:[&_.title]:text-emerald-300 dark:[&_.description]:text-emerald-400',
21
+ lime: 'bg-lime-200/50 dark:bg-lime-950/50 text-lime-600 [&_.title]:text-lime-800 [&_.description]:text-lime-700 dark:text-lime-500 border-lime-700/20 dark:border-lime-500/20 dark:[&_.title]:text-lime-300 dark:[&_.description]:text-lime-400',
22
+ cyan: 'bg-cyan-200/50 dark:bg-cyan-950/50 text-cyan-600 [&_.title]:text-cyan-800 [&_.description]:text-cyan-700 dark:text-cyan-500 border-cyan-700/20 dark:border-cyan-500/20 dark:[&_.title]:text-cyan-300 dark:[&_.description]:text-cyan-400',
23
+ sky: 'bg-sky-200/50 dark:bg-sky-950/50 text-sky-600 [&_.title]:text-sky-800 [&_.description]:text-sky-700 dark:text-sky-500 border-sky-700/20 dark:border-sky-500/20 dark:[&_.title]:text-sky-300 dark:[&_.description]:text-sky-400',
24
+ rose: 'bg-rose-200/50 dark:bg-rose-950/50 text-rose-600 [&_.title]:text-rose-800 [&_.description]:text-rose-700 dark:text-rose-500 border-rose-700/20 dark:border-rose-500/20 dark:[&_.title]:text-rose-300 dark:[&_.description]:text-rose-400',
25
+ amber:
26
+ 'bg-amber-200/50 dark:bg-amber-950/50 text-amber-600 [&_.title]:text-amber-800 [&_.description]:text-amber-700 dark:text-amber-500 border-amber-700/20 dark:border-amber-500/20 dark:[&_.title]:text-amber-300 dark:[&_.description]:text-amber-400',
27
+ violet:
28
+ 'bg-violet-200/50 dark:bg-violet-950/50 text-violet-600 [&_.title]:text-violet-800 [&_.description]:text-violet-700 dark:text-violet-500 border-violet-700/20 dark:border-violet-500/20 dark:[&_.title]:text-violet-300 dark:[&_.description]:text-violet-400',
29
+ fuchsia:
30
+ 'bg-fuchsia-200/50 dark:bg-fuchsia-950/50 text-fuchsia-600 [&_.title]:text-fuchsia-800 [&_.description]:text-fuchsia-700 dark:text-fuchsia-500 border-fuchsia-700/20 dark:border-fuchsia-500/20 dark:[&_.title]:text-fuchsia-300 dark:[&_.description]:text-fuchsia-400',
31
+ base: 'bg-base-50/80 border-base-200 dark:bg-base-900/50 dark:border-base-800 [&_.title]:text-base-900 dark:[&_.title]:text-base-50 [&_.description]:text-base-800 dark:[&_.description]:text-base-100',
32
+ accent:
33
+ 'bg-accent-200/50 dark:bg-accent-950/50 text-accent-600 [&_.title]:text-accent-800 [&_.description]:text-accent-700 dark:text-accent-500 border-accent-700/20 dark:border-accent-500/20 dark:[&_.title]:text-accent-300 dark:[&_.description]:text-accent-400'
34
+ };
35
+
36
+ type Colors = keyof typeof colorClasses;
37
+
38
+ const {
39
+ colors = {
40
+ default: 'accent',
41
+ success: 'green',
42
+ error: 'red',
43
+ info: 'blue'
44
+ }
45
+ }: {
46
+ colors?: {
47
+ default?: Colors;
48
+ success?: Colors;
49
+ error?: Colors;
50
+ info?: Colors;
51
+ };
52
+ } = $props();
53
+ </script>
54
+
55
+ <SonnerToaster
56
+ toastOptions={{
57
+ unstyled: true,
58
+ classes: {
59
+ toast:
60
+ 'group toast min-w-12 w-fit sm:min-w-64 backdrop-blur-lg border rounded-2xl p-4 flex items-center gap-2 sm:fixed sm:bottom-4 sm:right-0 mx-2',
61
+ title: 'text-base title',
62
+ description: 'text-xs mt-1 description',
63
+
64
+ default: colorClasses[colors?.default ?? 'accent'],
65
+ loading: colorClasses[colors?.default ?? 'accent'],
66
+
67
+ success: colorClasses[colors?.success ?? 'green'],
68
+ error: colorClasses[colors?.error ?? 'red'],
69
+ info: colorClasses[colors?.info ?? 'blue']
70
+ }
71
+ }}
72
+ position="bottom-right"
73
+ />
@@ -0,0 +1,10 @@
1
+ declare const Toaster: import("svelte").Component<{
2
+ colors?: {
3
+ default?: "red" | "orange" | "amber" | "yellow" | "lime" | "green" | "emerald" | "teal" | "cyan" | "sky" | "blue" | "indigo" | "violet" | "purple" | "fuchsia" | "pink" | "rose" | "base" | "accent";
4
+ success?: "red" | "orange" | "amber" | "yellow" | "lime" | "green" | "emerald" | "teal" | "cyan" | "sky" | "blue" | "indigo" | "violet" | "purple" | "fuchsia" | "pink" | "rose" | "base" | "accent";
5
+ error?: "red" | "orange" | "amber" | "yellow" | "lime" | "green" | "emerald" | "teal" | "cyan" | "sky" | "blue" | "indigo" | "violet" | "purple" | "fuchsia" | "pink" | "rose" | "base" | "accent";
6
+ info?: "red" | "orange" | "amber" | "yellow" | "lime" | "green" | "emerald" | "teal" | "cyan" | "sky" | "blue" | "indigo" | "violet" | "purple" | "fuchsia" | "pink" | "rose" | "base" | "accent";
7
+ };
8
+ }, {}, "">;
9
+ type Toaster = ReturnType<typeof Toaster>;
10
+ export default Toaster;
@@ -0,0 +1,2 @@
1
+ export { default as Toaster } from './Toaster.svelte';
2
+ export { toast } from 'svelte-sonner';
@@ -0,0 +1,2 @@
1
+ export { default as Toaster } from './Toaster.svelte';
2
+ export { toast } from 'svelte-sonner';
@@ -0,0 +1,2 @@
1
+ import Root from './switch.svelte';
2
+ export { Root as Switch };
@@ -0,0 +1,2 @@
1
+ import Root from './switch.svelte';
2
+ export { Root as Switch };
@@ -0,0 +1,27 @@
1
+ <script lang="ts">
2
+ import { Switch as SwitchPrimitive, type WithoutChildrenOrChild } from 'bits-ui';
3
+ import { cn } from '../../utils';
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ checked = $bindable(false),
9
+ ...restProps
10
+ }: WithoutChildrenOrChild<SwitchPrimitive.RootProps> = $props();
11
+ </script>
12
+
13
+ <SwitchPrimitive.Root
14
+ bind:ref
15
+ bind:checked
16
+ class={cn(
17
+ 'data-[state=checked]:bg-accent-500/30 dark:data-[state=checked]:bg-accent-500/20 data-[state=checked]:border-accent-500/30 data-[state=unchecked]:bg-base-500/20 data-[state=unchecked]:border-base-400/30 peer focus-visible:outline-base-900 dark:focus-visible:outline-base-100 inline-flex h-6 w-10.5 shrink-0 cursor-pointer items-center rounded-full border transition-all hover:scale-105 focus-visible:outline-2 focus-visible:outline-offset-2 disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:scale-100',
18
+ className
19
+ )}
20
+ {...restProps}
21
+ >
22
+ <SwitchPrimitive.Thumb
23
+ class={cn(
24
+ 'bg-base-500 data-[state=checked]:bg-accent-600 dark:bg-base-600 dark:data-[state=checked]:bg-accent-500 pointer-events-none block size-5 rounded-full shadow-lg ring-0 data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0 motion-safe:transition-transform'
25
+ )}
26
+ />
27
+ </SwitchPrimitive.Root>
@@ -0,0 +1,4 @@
1
+ import { Switch as SwitchPrimitive } from 'bits-ui';
2
+ declare const Switch: import("svelte").Component<Omit<Omit<SwitchPrimitive.RootProps, "child">, "children">, {}, "ref" | "checked">;
3
+ type Switch = ReturnType<typeof Switch>;
4
+ export default Switch;
@@ -0,0 +1,56 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../utils';
3
+ import { fade } from 'svelte/transition';
4
+
5
+ let {
6
+ href,
7
+ isActive,
8
+ onclick,
9
+ name
10
+ }: {
11
+ name: string;
12
+ href?: string;
13
+ isActive?: boolean;
14
+ onclick?: () => void;
15
+ } = $props();
16
+ </script>
17
+
18
+ {#snippet content()}
19
+ <div
20
+ class={cn(
21
+ 'relative block cursor-pointer px-3 py-2.5 transition duration-200',
22
+ isActive
23
+ ? 'text-accent-500 dark:text-accent-400'
24
+ : 'hover:text-accent-500 dark:hover:text-accent-400'
25
+ )}
26
+ >
27
+ {name}
28
+ {#if isActive}
29
+ <span
30
+ transition:fade
31
+ class="from-accent-500/0 via-accent-500/40 to-accent-500/0 dark:from-accent-400/0 dark:via-accent-400/40 dark:to-accent-400/0 absolute inset-x-1 bottom-px h-px bg-gradient-to-r"
32
+ ></span>
33
+ {/if}
34
+ </div>
35
+ {/snippet}
36
+
37
+ <li>
38
+ {#if href}
39
+ <a {href}>
40
+ {@render content()}
41
+ </a>
42
+ {:else if onclick}
43
+ <button
44
+ type="button"
45
+ onclick={() => {
46
+ onclick?.();
47
+ }}
48
+ >
49
+ {@render content()}
50
+ </button>
51
+ {:else}
52
+ <div>
53
+ {@render content()}
54
+ </div>
55
+ {/if}
56
+ </li>
@@ -0,0 +1,9 @@
1
+ type $$ComponentProps = {
2
+ name: string;
3
+ href?: string;
4
+ isActive?: boolean;
5
+ onclick?: () => void;
6
+ };
7
+ declare const TabItem: import("svelte").Component<$$ComponentProps, {}, "">;
8
+ type TabItem = ReturnType<typeof TabItem>;
9
+ export default TabItem;
@@ -0,0 +1,29 @@
1
+ <script lang="ts">
2
+ import { cn } from '../../utils';
3
+ import TabItem from './TabItem.svelte';
4
+
5
+ let {
6
+ items,
7
+ active,
8
+ class: className
9
+ }: {
10
+ items: {
11
+ name: string;
12
+ href?: string;
13
+ onclick?: () => void;
14
+ }[];
15
+ active: string;
16
+ class?: string;
17
+ } = $props();
18
+ </script>
19
+
20
+ <ul class={cn('not-prose text-base-800 dark:text-base-200 flex flex-wrap px-3 text-sm font-medium', className)}>
21
+ {#each items as item}
22
+ <TabItem
23
+ href={item.href}
24
+ isActive={active == item.name}
25
+ name={item.name}
26
+ onclick={item.onclick}
27
+ />
28
+ {/each}
29
+ </ul>
@@ -0,0 +1,12 @@
1
+ type $$ComponentProps = {
2
+ items: {
3
+ name: string;
4
+ href?: string;
5
+ onclick?: () => void;
6
+ }[];
7
+ active: string;
8
+ class?: string;
9
+ };
10
+ declare const Tabs: import("svelte").Component<$$ComponentProps, {}, "">;
11
+ type Tabs = ReturnType<typeof Tabs>;
12
+ export default Tabs;
@@ -0,0 +1,2 @@
1
+ export { default as Tabs } from './Tabs.svelte';
2
+ export { default as TabItem } from './TabItem.svelte';
@@ -0,0 +1,2 @@
1
+ export { default as Tabs } from './Tabs.svelte';
2
+ export { default as TabItem } from './TabItem.svelte';
@@ -0,0 +1,19 @@
1
+ import Root from './textarea.svelte';
2
+ type FormTextareaEvent<T extends Event = Event> = T & {
3
+ currentTarget: EventTarget & HTMLTextAreaElement;
4
+ };
5
+ type TextareaEvents = {
6
+ blur: FormTextareaEvent<FocusEvent>;
7
+ change: FormTextareaEvent<Event>;
8
+ click: FormTextareaEvent<MouseEvent>;
9
+ focus: FormTextareaEvent<FocusEvent>;
10
+ keydown: FormTextareaEvent<KeyboardEvent>;
11
+ keypress: FormTextareaEvent<KeyboardEvent>;
12
+ keyup: FormTextareaEvent<KeyboardEvent>;
13
+ mouseover: FormTextareaEvent<MouseEvent>;
14
+ mouseenter: FormTextareaEvent<MouseEvent>;
15
+ mouseleave: FormTextareaEvent<MouseEvent>;
16
+ paste: FormTextareaEvent<ClipboardEvent>;
17
+ input: FormTextareaEvent<InputEvent>;
18
+ };
19
+ export { Root as Textarea, type TextareaEvents, type FormTextareaEvent };
@@ -0,0 +1,2 @@
1
+ import Root from './textarea.svelte';
2
+ export { Root as Textarea };
@@ -0,0 +1,57 @@
1
+ <script lang="ts" module>
2
+ import type { WithElementRef, WithoutChildren } from 'bits-ui';
3
+ import { type VariantProps, tv } from 'tailwind-variants';
4
+ import { cn } from '../../utils';
5
+
6
+ import type { HTMLTextareaAttributes } from 'svelte/elements';
7
+
8
+ export const inputVariants = tv({
9
+ base: 'focus:ring-2 ring-1 resize-none ring-inset border-0 focus:transition-transform rounded-2xl text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed duration-300 active:duration-100',
10
+ variants: {
11
+ variant: {
12
+ primary:
13
+ 'focus:ring-accent-500 dark:focus:ring-accent-500 ring-accent-500/30 dark:ring-accent-500/20 bg-accent-400/5 dark:bg-accent-600/5 text-accent-700 dark:text-accent-400 placeholder:text-accent-700/70 dark:placeholder:text-accent-400/70',
14
+ secondary:
15
+ 'focus:ring-base-800 dark:focus:ring-base-200 bg-base-100/50 dark:bg-base-900/50 text-base-900 dark:text-base-50 ring-base-200 dark:ring-base-800'
16
+ },
17
+ sizeVariant: {
18
+ default: 'px-3 py-1.5 text-base min-h-[80px]',
19
+ sm: 'px-3 text-xs py-1.5 font-base min-h-[60px]',
20
+ lg: 'px-4 text-lg py-2 font-semibold min-h-[100px]'
21
+ }
22
+ },
23
+ defaultVariants: {
24
+ variant: 'primary',
25
+ sizeVariant: 'default'
26
+ }
27
+ });
28
+
29
+ export type InputVariant = VariantProps<typeof inputVariants>['variant'];
30
+ export type InputSize = VariantProps<typeof inputVariants>['sizeVariant'];
31
+
32
+ export type InputProps = WithElementRef<HTMLTextareaAttributes> & {
33
+ variant?: InputVariant;
34
+ sizeVariant?: InputSize;
35
+ };
36
+ </script>
37
+
38
+ <script lang="ts">
39
+ let {
40
+ ref = $bindable(null),
41
+ value = $bindable(),
42
+ class: className,
43
+ variant = 'primary',
44
+ sizeVariant = 'default',
45
+ ...restProps
46
+ }: WithoutChildren<WithElementRef<HTMLTextareaAttributes>> & {
47
+ variant?: InputVariant;
48
+ sizeVariant?: InputSize;
49
+ } = $props();
50
+ </script>
51
+
52
+ <textarea
53
+ bind:this={ref}
54
+ class={cn(inputVariants({ variant, sizeVariant }), className)}
55
+ bind:value
56
+ {...restProps}
57
+ ></textarea>
@@ -0,0 +1,47 @@
1
+ import type { WithElementRef, WithoutChildren } from 'bits-ui';
2
+ import { type VariantProps } from 'tailwind-variants';
3
+ import type { HTMLTextareaAttributes } from 'svelte/elements';
4
+ export declare const inputVariants: import("tailwind-variants").TVReturnType<{
5
+ variant: {
6
+ primary: string;
7
+ secondary: string;
8
+ };
9
+ sizeVariant: {
10
+ default: string;
11
+ sm: string;
12
+ lg: string;
13
+ };
14
+ }, undefined, "focus:ring-2 ring-1 resize-none ring-inset border-0 focus:transition-transform rounded-2xl text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed duration-300 active:duration-100", {
15
+ variant: {
16
+ primary: string;
17
+ secondary: string;
18
+ };
19
+ sizeVariant: {
20
+ default: string;
21
+ sm: string;
22
+ lg: string;
23
+ };
24
+ }, undefined, import("tailwind-variants").TVReturnType<{
25
+ variant: {
26
+ primary: string;
27
+ secondary: string;
28
+ };
29
+ sizeVariant: {
30
+ default: string;
31
+ sm: string;
32
+ lg: string;
33
+ };
34
+ }, undefined, "focus:ring-2 ring-1 resize-none ring-inset border-0 focus:transition-transform rounded-2xl text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed duration-300 active:duration-100", unknown, unknown, undefined>>;
35
+ export type InputVariant = VariantProps<typeof inputVariants>['variant'];
36
+ export type InputSize = VariantProps<typeof inputVariants>['sizeVariant'];
37
+ export type InputProps = WithElementRef<HTMLTextareaAttributes> & {
38
+ variant?: InputVariant;
39
+ sizeVariant?: InputSize;
40
+ };
41
+ type $$ComponentProps = WithoutChildren<WithElementRef<HTMLTextareaAttributes>> & {
42
+ variant?: InputVariant;
43
+ sizeVariant?: InputSize;
44
+ };
45
+ declare const Textarea: import("svelte").Component<$$ComponentProps, {}, "ref" | "value">;
46
+ type Textarea = ReturnType<typeof Textarea>;
47
+ export default Textarea;
@@ -0,0 +1,105 @@
1
+ <script lang="ts" module>
2
+ export const theme = $state({
3
+ dark: false
4
+ });
5
+ </script>
6
+
7
+ <script lang="ts">
8
+ import { onMount } from 'svelte';
9
+ import { Button, type ButtonProps } from '../button';
10
+ import { cn } from '../../utils';
11
+
12
+ onMount(() => {
13
+ // load from local storage
14
+ const savedDarkMode = localStorage.getItem('darkMode');
15
+ if (savedDarkMode) {
16
+ theme.dark = JSON.parse(savedDarkMode);
17
+ } else {
18
+ // prefers color scheme?
19
+ theme.dark = window.matchMedia('(prefers-color-scheme: dark)').matches;
20
+ }
21
+
22
+ // remove local storage
23
+ // localStorage.removeItem("darkMode");
24
+ setTheme(theme.dark);
25
+
26
+ // recommended method for newer browsers: specify event-type as first argument
27
+ window
28
+ .matchMedia('(prefers-color-scheme: dark)')
29
+ .addEventListener('change', (e) => e.matches && toggleTheme());
30
+
31
+ window
32
+ .matchMedia('(prefers-color-scheme: light)')
33
+ .addEventListener('change', (e) => e.matches && toggleTheme());
34
+ });
35
+
36
+ function setTheme(dark: Boolean) {
37
+ var root = document.getElementsByTagName('html')[0];
38
+
39
+ if (dark) {
40
+ root.classList.add('dark');
41
+ } else {
42
+ root.classList.remove('dark');
43
+ }
44
+ }
45
+
46
+ function toggleTheme() {
47
+ theme.dark = !theme.dark;
48
+ // save to local storage
49
+ localStorage.setItem('darkMode', JSON.stringify(theme.dark));
50
+ setTheme(theme.dark);
51
+ }
52
+
53
+ let { class: className, ref = $bindable(null), ...restProps }: ButtonProps = $props();
54
+ </script>
55
+
56
+ <Button
57
+ variant="link"
58
+ onclick={toggleTheme}
59
+ class={cn(
60
+ 'theme-toggle focus-visible:outline-base-900 dark:focus-visible:outline-base-100 flex items-center justify-center rounded-2xl focus-visible:outline-2',
61
+ className
62
+ )}
63
+ bind:ref
64
+ {...restProps}
65
+ size="icon"
66
+ >
67
+ <svg
68
+ xmlns="http://www.w3.org/2000/svg"
69
+ fill="none"
70
+ viewBox="0 0 24 24"
71
+ stroke-width="1.5"
72
+ stroke="currentColor"
73
+ class="size-5! block transition-colors duration-500 dark:hidden"
74
+ >
75
+ <path
76
+ stroke-linecap="round"
77
+ stroke-linejoin="round"
78
+ d="M12 3v2.25m6.364.386l-1.591 1.591M21 12h-2.25m-.386 6.364l-1.591-1.591M12 18.75V21m-4.773-4.227l-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0z"
79
+ />
80
+ </svg>
81
+ <svg
82
+ xmlns="http://www.w3.org/2000/svg"
83
+ fill="none"
84
+ viewBox="0 0 24 24"
85
+ stroke-width="1.5"
86
+ stroke="currentColor"
87
+ class="size-5! hidden transition-colors duration-500 dark:block dark:text-white"
88
+ >
89
+ <path
90
+ stroke-linecap="round"
91
+ stroke-linejoin="round"
92
+ d="M21.752 15.002A9.718 9.718 0 0118 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 003 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 009.002-5.998z"
93
+ />
94
+ </svg>
95
+
96
+ <span class="sr-only">Toggle theme</span>
97
+ </Button>
98
+
99
+ <noscript>
100
+ <style>
101
+ .theme-toggle {
102
+ display: none;
103
+ }
104
+ </style>
105
+ </noscript>
@@ -0,0 +1,7 @@
1
+ export declare const theme: {
2
+ dark: boolean;
3
+ };
4
+ import { type ButtonProps } from '../button';
5
+ declare const ThemeToggle: import("svelte").Component<ButtonProps, {}, "ref">;
6
+ type ThemeToggle = ReturnType<typeof ThemeToggle>;
7
+ export default ThemeToggle;
@@ -0,0 +1,2 @@
1
+ export { default as ThemeToggle } from './ThemeToggle.svelte';
2
+ export { theme } from './ThemeToggle.svelte';
@@ -0,0 +1,2 @@
1
+ export { default as ThemeToggle } from './ThemeToggle.svelte';
2
+ export { theme } from './ThemeToggle.svelte';
@@ -0,0 +1,3 @@
1
+ import Root from "./toggle.svelte";
2
+ export { toggleVariants, type ToggleSize, type ToggleVariant, type ToggleVariants, } from "./toggle.svelte";
3
+ export { Root as Toggle };
@@ -0,0 +1,3 @@
1
+ import Root from "./toggle.svelte";
2
+ export { toggleVariants, } from "./toggle.svelte";
3
+ export { Root as Toggle };
@@ -0,0 +1,49 @@
1
+ <script lang="ts" module>
2
+ import { type VariantProps, tv } from 'tailwind-variants';
3
+
4
+ export const toggleVariants = tv({
5
+ base: 'text-base-900 dark:text-base-100 hover:bg-base-200/50 dark:hover:bg-base-800/50 dark:hover:text-base-50 hover:text-base-950 data-[state=on]:bg-accent-400/40 dark:data-[state=on]:bg-accent-500/15 dark:data-[state=on]:text-accent-300 data-[state=on]:text-accent-950 inline-flex items-center justify-center gap-2 rounded-2xl text-sm font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0',
6
+ variants: {
7
+ variant: {
8
+ default: 'bg-base-200/20 dark:bg-base-800/20'
9
+ },
10
+ size: {
11
+ default: 'h-10 min-w-10 px-3 [&_svg]:size-4',
12
+ sm: 'h-9 min-w-9 px-2.5 [&_svg]:size-3.5',
13
+ lg: 'h-11 min-w-11 px-4 [&_svg]:size-5',
14
+ }
15
+ },
16
+ defaultVariants: {
17
+ variant: 'default',
18
+ size: 'default'
19
+ }
20
+ });
21
+
22
+ export type ToggleVariant = VariantProps<typeof toggleVariants>['variant'];
23
+ export type ToggleSize = VariantProps<typeof toggleVariants>['size'];
24
+ export type ToggleVariants = VariantProps<typeof toggleVariants>;
25
+ </script>
26
+
27
+ <script lang="ts">
28
+ import { Toggle as TogglePrimitive } from 'bits-ui';
29
+ import { cn } from '../../utils';
30
+
31
+ let {
32
+ ref = $bindable(null),
33
+ pressed = $bindable(false),
34
+ class: className,
35
+ size = 'default',
36
+ variant = 'default',
37
+ ...restProps
38
+ }: TogglePrimitive.RootProps & {
39
+ variant?: ToggleVariant;
40
+ size?: ToggleSize;
41
+ } = $props();
42
+ </script>
43
+
44
+ <TogglePrimitive.Root
45
+ bind:ref
46
+ bind:pressed
47
+ class={cn(toggleVariants({ variant, size }), className)}
48
+ {...restProps}
49
+ />
@@ -0,0 +1,40 @@
1
+ import { type VariantProps } from 'tailwind-variants';
2
+ export declare const toggleVariants: import("tailwind-variants").TVReturnType<{
3
+ variant: {
4
+ default: string;
5
+ };
6
+ size: {
7
+ default: string;
8
+ sm: string;
9
+ lg: string;
10
+ };
11
+ }, undefined, "text-base-900 dark:text-base-100 hover:bg-base-200/50 dark:hover:bg-base-800/50 dark:hover:text-base-50 hover:text-base-950 data-[state=on]:bg-accent-400/40 dark:data-[state=on]:bg-accent-500/15 dark:data-[state=on]:text-accent-300 data-[state=on]:text-accent-950 inline-flex items-center justify-center gap-2 rounded-2xl text-sm font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0", {
12
+ variant: {
13
+ default: string;
14
+ };
15
+ size: {
16
+ default: string;
17
+ sm: string;
18
+ lg: string;
19
+ };
20
+ }, undefined, import("tailwind-variants").TVReturnType<{
21
+ variant: {
22
+ default: string;
23
+ };
24
+ size: {
25
+ default: string;
26
+ sm: string;
27
+ lg: string;
28
+ };
29
+ }, undefined, "text-base-900 dark:text-base-100 hover:bg-base-200/50 dark:hover:bg-base-800/50 dark:hover:text-base-50 hover:text-base-950 data-[state=on]:bg-accent-400/40 dark:data-[state=on]:bg-accent-500/15 dark:data-[state=on]:text-accent-300 data-[state=on]:text-accent-950 inline-flex items-center justify-center gap-2 rounded-2xl text-sm font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0", unknown, unknown, undefined>>;
30
+ export type ToggleVariant = VariantProps<typeof toggleVariants>['variant'];
31
+ export type ToggleSize = VariantProps<typeof toggleVariants>['size'];
32
+ export type ToggleVariants = VariantProps<typeof toggleVariants>;
33
+ import { Toggle as TogglePrimitive } from 'bits-ui';
34
+ type $$ComponentProps = TogglePrimitive.RootProps & {
35
+ variant?: ToggleVariant;
36
+ size?: ToggleSize;
37
+ };
38
+ declare const Toggle: import("svelte").Component<$$ComponentProps, {}, "ref" | "pressed">;
39
+ type Toggle = ReturnType<typeof Toggle>;
40
+ export default Toggle;
@@ -0,0 +1,3 @@
1
+ import Root from "./toggle-group.svelte";
2
+ import Item from "./toggle-group-item.svelte";
3
+ export { Root as ToggleGroup, Item as ToggleGroupItem, Item as ToggleItem };
@@ -0,0 +1,3 @@
1
+ import Root from "./toggle-group.svelte";
2
+ import Item from "./toggle-group-item.svelte";
3
+ export { Root as ToggleGroup, Item as ToggleGroupItem, Item as ToggleItem };
@@ -0,0 +1,30 @@
1
+ <script lang="ts">
2
+ import { ToggleGroup as ToggleGroupPrimitive } from "bits-ui";
3
+ import { getToggleGroupCtx } from "./toggle-group.svelte";
4
+ import { cn } from "../../utils";
5
+ import { type ToggleVariants, toggleVariants } from "../toggle/";
6
+
7
+ let {
8
+ ref = $bindable(null),
9
+ value = $bindable(),
10
+ class: className,
11
+ size,
12
+ variant,
13
+ ...restProps
14
+ }: ToggleGroupPrimitive.ItemProps & ToggleVariants = $props();
15
+
16
+ const ctx = getToggleGroupCtx();
17
+ </script>
18
+
19
+ <ToggleGroupPrimitive.Item
20
+ bind:ref
21
+ class={cn(
22
+ toggleVariants({
23
+ variant: ctx.variant || variant,
24
+ size: ctx.size || size,
25
+ }),
26
+ className
27
+ )}
28
+ {value}
29
+ {...restProps}
30
+ />