@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,34 @@
1
+ export * from './accordion';
2
+ export * from './alert';
3
+ export * from './avatar';
4
+ export * from './badge';
5
+ export * from './box';
6
+ export * from './button';
7
+ export * from './card';
8
+ export * from './chat-bubble';
9
+ export * from './checkbox';
10
+ export * from './copy-code-button';
11
+ export * from './head';
12
+ export * from './heading';
13
+ export * from './image';
14
+ export * from './image-container';
15
+ export * from './input';
16
+ export * from './label';
17
+ export * from './modal';
18
+ export * from './navbar';
19
+ export * from './number-input';
20
+ export * from './paragraph';
21
+ export * from './popover';
22
+ export * from './prose';
23
+ export * from './scroll-area';
24
+ export * from './select';
25
+ export * from './sidebar';
26
+ export * from './slider';
27
+ export * from './sonner';
28
+ export * from './switch';
29
+ export * from './tabs';
30
+ export * from './textarea';
31
+ export * from './theme-toggle';
32
+ export * from './toggle';
33
+ export * from './toggle-group';
34
+ export * from './tooltip';
@@ -0,0 +1,34 @@
1
+ export * from './accordion';
2
+ export * from './alert';
3
+ export * from './avatar';
4
+ export * from './badge';
5
+ export * from './box';
6
+ export * from './button';
7
+ export * from './card';
8
+ export * from './chat-bubble';
9
+ export * from './checkbox';
10
+ export * from './copy-code-button';
11
+ export * from './head';
12
+ export * from './heading';
13
+ export * from './image';
14
+ export * from './image-container';
15
+ export * from './input';
16
+ export * from './label';
17
+ export * from './modal';
18
+ export * from './navbar';
19
+ export * from './number-input';
20
+ export * from './paragraph';
21
+ export * from './popover';
22
+ export * from './prose';
23
+ export * from './scroll-area';
24
+ export * from './select';
25
+ export * from './sidebar';
26
+ export * from './slider';
27
+ export * from './sonner';
28
+ export * from './switch';
29
+ export * from './tabs';
30
+ export * from './textarea';
31
+ export * from './theme-toggle';
32
+ export * from './toggle';
33
+ export * from './toggle-group';
34
+ export * from './tooltip';
@@ -0,0 +1,60 @@
1
+ <script lang="ts" module>
2
+ import type { WithElementRef } from 'bits-ui';
3
+ import { type VariantProps, tv } from 'tailwind-variants';
4
+ import { cn } from '../../utils';
5
+
6
+ import type { HTMLInputAttributes, HTMLInputTypeAttribute } from 'svelte/elements';
7
+
8
+ export const inputVariants = tv({
9
+ base: 'focus:ring-2 ring-1 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/50 dark:placeholder:text-accent-400/50',
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 placeholder:text-base-900/50 dark:placeholder:text-base-50/50'
16
+ },
17
+ sizeVariant: {
18
+ default: 'px-3 py-1.5 text-base',
19
+ sm: 'px-3 text-xs py-1.5 font-base',
20
+ lg: 'px-4 text-lg py-2 font-semibold'
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
+ type InputType = Exclude<HTMLInputTypeAttribute, 'file'>;
33
+
34
+ export type InputProps = WithElementRef<
35
+ Omit<HTMLInputAttributes, 'type'> & { type?: InputType }
36
+ > & {
37
+ variant?: InputVariant;
38
+ sizeVariant?: InputSize;
39
+ };
40
+ </script>
41
+
42
+ <script lang="ts">
43
+ let {
44
+ ref = $bindable(null),
45
+ value = $bindable(),
46
+ type,
47
+ class: className,
48
+ variant = 'primary',
49
+ sizeVariant = 'default',
50
+ ...restProps
51
+ }: InputProps = $props();
52
+ </script>
53
+
54
+ <input
55
+ bind:this={ref}
56
+ class={cn(inputVariants({ variant, sizeVariant }), className)}
57
+ {type}
58
+ bind:value
59
+ {...restProps}
60
+ />
@@ -0,0 +1,46 @@
1
+ import type { WithElementRef } from 'bits-ui';
2
+ import { type VariantProps } from 'tailwind-variants';
3
+ import type { HTMLInputAttributes, HTMLInputTypeAttribute } 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 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 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
+ type InputType = Exclude<HTMLInputTypeAttribute, 'file'>;
38
+ export type InputProps = WithElementRef<Omit<HTMLInputAttributes, 'type'> & {
39
+ type?: InputType;
40
+ }> & {
41
+ variant?: InputVariant;
42
+ sizeVariant?: InputSize;
43
+ };
44
+ declare const Input: import("svelte").Component<InputProps, {}, "ref" | "value">;
45
+ type Input = ReturnType<typeof Input>;
46
+ export default Input;
@@ -0,0 +1,2 @@
1
+ import Root, { type InputProps, type InputSize, type InputVariant, inputVariants } from './Input.svelte';
2
+ export { type InputProps, Root as Input, inputVariants, type InputSize, type InputVariant };
@@ -0,0 +1,2 @@
1
+ import Root, { inputVariants } from './Input.svelte';
2
+ export { Root as Input, inputVariants };
@@ -0,0 +1,19 @@
1
+ <script lang="ts">
2
+ import { Label as LabelPrimitive } from 'bits-ui';
3
+ import { cn } from '../../utils';
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ ...restProps
9
+ }: LabelPrimitive.RootProps = $props();
10
+ </script>
11
+
12
+ <LabelPrimitive.Root
13
+ bind:ref
14
+ class={cn(
15
+ 'text-base-900 dark:text-base-50 text-sm leading-none font-medium peer-disabled:cursor-not-allowed peer-disabled:opacity-70',
16
+ className
17
+ )}
18
+ {...restProps}
19
+ />
@@ -0,0 +1,4 @@
1
+ import { Label as LabelPrimitive } from 'bits-ui';
2
+ declare const Label: import("svelte").Component<LabelPrimitive.RootProps, {}, "ref">;
3
+ type Label = ReturnType<typeof Label>;
4
+ export default Label;
@@ -0,0 +1 @@
1
+ export { default as Label } from './Label.svelte';
@@ -0,0 +1 @@
1
+ export { default as Label } from './Label.svelte';
@@ -0,0 +1,167 @@
1
+ <script lang="ts" module>
2
+ import type { Snippet } from 'svelte';
3
+ import { Dialog, type WithoutChild } from 'bits-ui';
4
+ import { Button, type ButtonProps } from '../button';
5
+
6
+ export type ModalProps = Dialog.RootProps & {
7
+ title?: string;
8
+ titleSnippet?: Snippet;
9
+ titleClass?: string;
10
+ description?: string;
11
+ descriptionSnippet?: Snippet;
12
+ descriptionClass?: string;
13
+ interactOutsideBehavior?: 'close' | 'ignore';
14
+ closeButton?: boolean;
15
+ contentProps?: WithoutChild<Dialog.ContentProps>;
16
+
17
+ yesButton?:
18
+ | boolean
19
+ | {
20
+ label?: string;
21
+ onclick?: () => void;
22
+ variant?: ButtonProps['variant'];
23
+ disabled?: boolean;
24
+ class?: string;
25
+ };
26
+
27
+ noButton?:
28
+ | boolean
29
+ | {
30
+ label?: string;
31
+ onclick?: () => void;
32
+ variant?: ButtonProps['variant'];
33
+ disabled?: boolean;
34
+ class?: string;
35
+ };
36
+
37
+ class?: string;
38
+
39
+ onOpenAutoFocus?: (event: Event) => void;
40
+ };
41
+ </script>
42
+
43
+ <script lang="ts">
44
+ import { cn } from '../../utils';
45
+
46
+ let {
47
+ open = $bindable(false),
48
+ children,
49
+ contentProps,
50
+ title,
51
+ titleSnippet,
52
+ titleClass,
53
+ description,
54
+ descriptionSnippet,
55
+ descriptionClass,
56
+ interactOutsideBehavior = 'close',
57
+ closeButton = true,
58
+ yesButton,
59
+ noButton,
60
+ class: className,
61
+ onOpenAutoFocus,
62
+ ...restProps
63
+ }: ModalProps = $props();
64
+
65
+ let yesButtonRef = $state<HTMLButtonElement | null>(null);
66
+ </script>
67
+
68
+ <Dialog.Root bind:open {...restProps}>
69
+ <Dialog.Portal>
70
+ <Dialog.Overlay
71
+ class="motion-safe:data-[state=open]:animate-in motion-safe:data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 bg-base-200/10 dark:bg-base-900/10 fixed inset-0 z-50 backdrop-blur-sm"
72
+ />
73
+ <Dialog.Content
74
+ {onOpenAutoFocus}
75
+ {interactOutsideBehavior}
76
+ {...contentProps}
77
+ class={cn(
78
+ 'motion-safe:data-[state=open]:animate-in motion-safe:data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-bottom-1/2 data-[state=open]:slide-in-from-bottom-1/2',
79
+ 'fixed left-[50%] top-[50%] z-50 grid w-[calc(100%-1rem)] max-w-lg translate-x-[-50%] translate-y-[-50%] shadow-lg',
80
+ 'bg-base-50/60 dark:bg-base-900/60 backdrop-blur-xl border-base-200/80 dark:border-base-800 gap-4 rounded-2xl border p-6',
81
+ className
82
+ )}
83
+ >
84
+ {#if title}
85
+ <Dialog.Title class="text-base-900 dark:text-base-100 text-lg font-semibold"
86
+ >{title}</Dialog.Title
87
+ >
88
+ {/if}
89
+ {#if titleSnippet}
90
+ <Dialog.Title class={titleClass}>
91
+ {@render titleSnippet()}
92
+ </Dialog.Title>
93
+ {/if}
94
+ {#if description}
95
+ <Dialog.Description class="text-base-600 dark:text-base-400 text-sm"
96
+ >{description}</Dialog.Description
97
+ >
98
+ {/if}
99
+ {#if descriptionSnippet}
100
+ <Dialog.Description class={descriptionClass}>
101
+ {@render descriptionSnippet?.()}
102
+ </Dialog.Description>
103
+ {/if}
104
+
105
+ {#if yesButton || noButton}
106
+ <div class="flex flex-col items-stretch justify-end gap-2 md:flex-row md:items-center">
107
+ {#if yesButton}
108
+ <Button
109
+ bind:ref={yesButtonRef}
110
+ onclick={() => {
111
+ open = false;
112
+ if (typeof yesButton === 'object') {
113
+ yesButton.onclick?.();
114
+ }
115
+ }}
116
+ class={cn('order-last', typeof yesButton === 'object' ? yesButton.class : '')}
117
+ variant={typeof yesButton === 'object' ? yesButton?.variant || 'primary' : 'primary'}
118
+ disabled={typeof yesButton === 'object' ? yesButton?.disabled : false}
119
+ >
120
+ {typeof yesButton === 'object' ? yesButton.label || 'Yes' : 'Yes'}
121
+ </Button>
122
+ {/if}
123
+ {#if noButton}
124
+ <Button
125
+ onclick={() => {
126
+ open = false;
127
+ if (typeof noButton === 'object') {
128
+ noButton.onclick?.();
129
+ }
130
+ }}
131
+ class={cn(typeof noButton === 'object' ? noButton.class : '')}
132
+ variant={typeof noButton === 'object'
133
+ ? noButton?.variant || 'secondary'
134
+ : 'secondary'}
135
+ disabled={typeof noButton === 'object' ? noButton?.disabled : false}
136
+ >
137
+ {typeof noButton === 'object' ? noButton.label || 'No' : 'No'}
138
+ </Button>
139
+ {/if}
140
+ </div>
141
+ {/if}
142
+
143
+ {@render children?.()}
144
+
145
+ {#if closeButton}
146
+ <Dialog.Close
147
+ class="text-base-900 dark:text-base-500 hover:text-base-800 dark:hover:text-base-200 hover:bg-base-200 dark:hover:bg-base-800 focus:outline-base-900 dark:focus:outline-base-50 focus:bg-base-200 dark:focus:bg-base-800 focus:text-base-800 dark:focus:text-base-200 absolute right-2 top-2 cursor-pointer rounded-xl p-1 transition-colors focus:outline-2 focus:outline-offset-2"
148
+ >
149
+ <svg
150
+ xmlns="http://www.w3.org/2000/svg"
151
+ viewBox="0 0 24 24"
152
+ fill="currentColor"
153
+ class="size-4"
154
+ >
155
+ <path
156
+ fill-rule="evenodd"
157
+ d="M5.47 5.47a.75.75 0 0 1 1.06 0L12 10.94l5.47-5.47a.75.75 0 1 1 1.06 1.06L13.06 12l5.47 5.47a.75.75 0 1 1-1.06 1.06L12 13.06l-5.47 5.47a.75.75 0 0 1-1.06-1.06L10.94 12 5.47 6.53a.75.75 0 0 1 0-1.06Z"
158
+ clip-rule="evenodd"
159
+ />
160
+ </svg>
161
+
162
+ <span class="sr-only">Close</span>
163
+ </Dialog.Close>
164
+ {/if}
165
+ </Dialog.Content>
166
+ </Dialog.Portal>
167
+ </Dialog.Root>
@@ -0,0 +1,33 @@
1
+ import type { Snippet } from 'svelte';
2
+ import { Dialog, type WithoutChild } from 'bits-ui';
3
+ import { type ButtonProps } from '../button';
4
+ export type ModalProps = Dialog.RootProps & {
5
+ title?: string;
6
+ titleSnippet?: Snippet;
7
+ titleClass?: string;
8
+ description?: string;
9
+ descriptionSnippet?: Snippet;
10
+ descriptionClass?: string;
11
+ interactOutsideBehavior?: 'close' | 'ignore';
12
+ closeButton?: boolean;
13
+ contentProps?: WithoutChild<Dialog.ContentProps>;
14
+ yesButton?: boolean | {
15
+ label?: string;
16
+ onclick?: () => void;
17
+ variant?: ButtonProps['variant'];
18
+ disabled?: boolean;
19
+ class?: string;
20
+ };
21
+ noButton?: boolean | {
22
+ label?: string;
23
+ onclick?: () => void;
24
+ variant?: ButtonProps['variant'];
25
+ disabled?: boolean;
26
+ class?: string;
27
+ };
28
+ class?: string;
29
+ onOpenAutoFocus?: (event: Event) => void;
30
+ };
31
+ declare const Modal: import("svelte").Component<ModalProps, {}, "open">;
32
+ type Modal = ReturnType<typeof Modal>;
33
+ export default Modal;
@@ -0,0 +1,2 @@
1
+ export { default as Modal } from './Modal.svelte';
2
+ export type { ModalProps } from './Modal.svelte';
@@ -0,0 +1 @@
1
+ export { default as Modal } from './Modal.svelte';
@@ -0,0 +1,63 @@
1
+ <script lang="ts">
2
+ import type { WithElementRef } from 'bits-ui';
3
+ import type { HTMLAttributes } from 'svelte/elements';
4
+ import { cn } from '../../utils';
5
+
6
+ const {
7
+ class: className,
8
+ children,
9
+ hasSidebar = false,
10
+ ...restProps
11
+ }: WithElementRef<HTMLAttributes<HTMLDivElement>> & { hasSidebar?: boolean } = $props();
12
+ </script>
13
+
14
+ <div
15
+ class={cn(
16
+ 'header fixed top-1 right-0 mx-1 left-0 z-50 flex h-16 items-center justify-between p-2 shadow-lg rounded-2xl border border-base-400/30 dark:border-base-300/10 overflow-hidden',
17
+ hasSidebar ? 'lg:left-74' : '',
18
+ className
19
+ )}
20
+ {...restProps}
21
+ >
22
+ {@render children?.()}
23
+ <div
24
+ class="backdrop from-base-100/50 via-base-50/20 dark:from-base-900/30 dark:via-base-950/10 pointer-events-none absolute inset-0 -z-10 bg-linear-to-b backdrop-blur-md"
25
+ ></div>
26
+
27
+ <div
28
+ class="backdrop-edge bg-base-900/10 dark:bg-base-500/10 pointer-events-none absolute right-0 bottom-0 left-0 -z-10 translate-y-full backdrop-blur-sm"
29
+ ></div>
30
+ </div>
31
+
32
+ <style>
33
+ /** better frosted glass effect adopted from https://www.joshwcomeau.com/css/backdrop-filter/ */
34
+ .header {
35
+ --thickness: 1px;
36
+ }
37
+
38
+ @supports (mask-image: none) or (-webkit-mask-image: none) {
39
+ .backdrop {
40
+ height: 200%;
41
+ -webkit-mask-image: linear-gradient(to bottom, black 0% 50%, transparent 50% 100%);
42
+ mask-image: linear-gradient(to bottom, black 0% 50%, transparent 50% 100%);
43
+ }
44
+ .backdrop-edge {
45
+ height: 100%;
46
+ inset: 0;
47
+ -webkit-mask-image: linear-gradient(
48
+ to bottom,
49
+ black 0,
50
+ black var(--thickness),
51
+ transparent var(--thickness)
52
+ );
53
+ mask-image: linear-gradient(
54
+ to bottom,
55
+ black 0,
56
+ black var(--thickness),
57
+ transparent var(--thickness)
58
+ );
59
+
60
+ filter: brightness(1.5);
61
+ }
62
+ }
63
+ </style>
@@ -0,0 +1,8 @@
1
+ import type { WithElementRef } from 'bits-ui';
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ type $$ComponentProps = WithElementRef<HTMLAttributes<HTMLDivElement>> & {
4
+ hasSidebar?: boolean;
5
+ };
6
+ declare const Navbar: import("svelte").Component<$$ComponentProps, {}, "">;
7
+ type Navbar = ReturnType<typeof Navbar>;
8
+ export default Navbar;
@@ -0,0 +1 @@
1
+ export { default as Navbar } from './Navbar.svelte';
@@ -0,0 +1 @@
1
+ export { default as Navbar } from './Navbar.svelte';