@mrintel/villain-ui 0.2.2 → 0.3.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.
- package/dist/components/buttons/Button.svelte +33 -0
- package/dist/components/buttons/Button.svelte.d.ts +11 -0
- package/dist/components/buttons/ButtonGroup.svelte +30 -0
- package/dist/components/buttons/ButtonGroup.svelte.d.ts +8 -0
- package/dist/components/buttons/FloatingActionButton.svelte +44 -0
- package/dist/components/buttons/FloatingActionButton.svelte.d.ts +11 -0
- package/dist/components/buttons/IconButton.svelte +53 -0
- package/dist/components/buttons/IconButton.svelte.d.ts +13 -0
- package/dist/components/buttons/LinkButton.svelte +37 -0
- package/dist/components/buttons/LinkButton.svelte.d.ts +12 -0
- package/dist/components/buttons/buttonClasses.d.ts +10 -0
- package/dist/components/buttons/buttonClasses.js +10 -0
- package/dist/components/buttons/index.d.ts +5 -0
- package/dist/components/buttons/index.js +5 -0
- package/dist/components/cards/Card.svelte +46 -0
- package/dist/components/cards/Card.svelte.d.ts +11 -0
- package/dist/components/cards/Container.svelte +33 -0
- package/dist/components/cards/Container.svelte.d.ts +10 -0
- package/dist/components/cards/Divider.svelte +52 -0
- package/dist/components/cards/Divider.svelte.d.ts +9 -0
- package/dist/components/cards/Grid.svelte +44 -0
- package/dist/components/cards/Grid.svelte.d.ts +10 -0
- package/dist/components/cards/Panel.svelte +32 -0
- package/dist/components/cards/Panel.svelte.d.ts +10 -0
- package/dist/components/cards/SectionHeader.svelte +38 -0
- package/dist/components/cards/SectionHeader.svelte.d.ts +11 -0
- package/dist/components/cards/index.d.ts +6 -0
- package/dist/components/cards/index.js +6 -0
- package/dist/components/data/Avatar.svelte +67 -0
- package/dist/components/data/Avatar.svelte.d.ts +10 -0
- package/dist/components/data/Badge.svelte +32 -0
- package/dist/components/data/Badge.svelte.d.ts +8 -0
- package/dist/components/data/CodeBlock.svelte +121 -0
- package/dist/components/data/CodeBlock.svelte.d.ts +32 -0
- package/dist/components/data/List.svelte +64 -0
- package/dist/components/data/List.svelte.d.ts +8 -0
- package/dist/components/data/Pagination.svelte +123 -0
- package/dist/components/data/Pagination.svelte.d.ts +9 -0
- package/dist/components/data/Stat.svelte +103 -0
- package/dist/components/data/Stat.svelte.d.ts +11 -0
- package/dist/components/data/Table.svelte +76 -0
- package/dist/components/data/Table.svelte.d.ts +9 -0
- package/dist/components/data/Tag.svelte +53 -0
- package/dist/components/data/Tag.svelte.d.ts +9 -0
- package/dist/components/data/index.d.ts +8 -0
- package/dist/components/data/index.js +8 -0
- package/dist/components/forms/Checkbox.svelte +51 -0
- package/dist/components/forms/Checkbox.svelte.d.ts +10 -0
- package/dist/components/forms/FileUpload.svelte +164 -0
- package/dist/components/forms/FileUpload.svelte.d.ts +22 -0
- package/dist/components/forms/Input.svelte +57 -0
- package/dist/components/forms/Input.svelte.d.ts +13 -0
- package/dist/components/forms/InputGroup.svelte +7 -0
- package/dist/components/forms/InputGroup.svelte.d.ts +20 -0
- package/dist/components/forms/RadioGroup.svelte +87 -0
- package/dist/components/forms/RadioGroup.svelte.d.ts +15 -0
- package/dist/components/forms/RangeSlider.svelte +116 -0
- package/dist/components/forms/RangeSlider.svelte.d.ts +14 -0
- package/dist/components/forms/Select.svelte +71 -0
- package/dist/components/forms/Select.svelte.d.ts +16 -0
- package/dist/components/forms/Switch.svelte +56 -0
- package/dist/components/forms/Switch.svelte.d.ts +10 -0
- package/dist/components/forms/Textarea.svelte +57 -0
- package/dist/components/forms/Textarea.svelte.d.ts +13 -0
- package/dist/components/forms/index.d.ts +9 -0
- package/dist/components/forms/index.js +9 -0
- package/dist/components/navigation/Breadcrumbs.svelte +59 -0
- package/dist/components/navigation/Breadcrumbs.svelte.d.ts +14 -0
- package/dist/components/navigation/ContextMenu.svelte +83 -0
- package/dist/components/navigation/ContextMenu.svelte.d.ts +11 -0
- package/dist/components/navigation/DropdownMenu.svelte +80 -0
- package/dist/components/navigation/DropdownMenu.svelte.d.ts +10 -0
- package/dist/components/navigation/Menu.svelte +48 -0
- package/dist/components/navigation/Menu.svelte.d.ts +15 -0
- package/dist/components/navigation/Navbar.svelte +32 -0
- package/dist/components/navigation/Navbar.svelte.d.ts +9 -0
- package/dist/components/navigation/Sidebar.svelte +35 -0
- package/dist/components/navigation/Sidebar.svelte.d.ts +10 -0
- package/dist/components/navigation/Tabs.svelte +54 -0
- package/dist/components/navigation/Tabs.svelte.d.ts +15 -0
- package/dist/components/navigation/index.d.ts +7 -0
- package/dist/components/navigation/index.js +7 -0
- package/dist/components/overlays/Alert.svelte +99 -0
- package/dist/components/overlays/Alert.svelte.d.ts +11 -0
- package/dist/components/overlays/CommandPalette.svelte +217 -0
- package/dist/components/overlays/CommandPalette.svelte.d.ts +16 -0
- package/dist/components/overlays/Drawer.svelte +167 -0
- package/dist/components/overlays/Drawer.svelte.d.ts +14 -0
- package/dist/components/overlays/Dropdown.svelte +30 -0
- package/dist/components/overlays/Dropdown.svelte.d.ts +9 -0
- package/dist/components/overlays/Modal.svelte +130 -0
- package/dist/components/overlays/Modal.svelte.d.ts +13 -0
- package/dist/components/overlays/Popover.svelte +131 -0
- package/dist/components/overlays/Popover.svelte.d.ts +11 -0
- package/dist/components/overlays/ProgressBar.svelte +45 -0
- package/dist/components/overlays/ProgressBar.svelte.d.ts +10 -0
- package/dist/components/overlays/SkeletonLoader.svelte +82 -0
- package/dist/components/overlays/SkeletonLoader.svelte.d.ts +9 -0
- package/dist/components/overlays/Spinner.svelte +43 -0
- package/dist/components/overlays/Spinner.svelte.d.ts +7 -0
- package/dist/components/overlays/Toast.svelte +140 -0
- package/dist/components/overlays/Toast.svelte.d.ts +13 -0
- package/dist/components/overlays/Tooltip.svelte +115 -0
- package/dist/components/overlays/Tooltip.svelte.d.ts +10 -0
- package/dist/components/overlays/index.d.ts +11 -0
- package/dist/components/overlays/index.js +11 -0
- package/dist/components/typography/Code.svelte +14 -0
- package/dist/components/typography/Code.svelte.d.ts +6 -0
- package/dist/components/typography/Heading.svelte +22 -0
- package/dist/components/typography/Heading.svelte.d.ts +9 -0
- package/dist/components/typography/Text.svelte +24 -0
- package/dist/components/typography/Text.svelte.d.ts +9 -0
- package/dist/components/typography/index.d.ts +3 -0
- package/dist/components/typography/index.js +3 -0
- package/dist/components/utilities/Accordion.svelte +67 -0
- package/dist/components/utilities/Accordion.svelte.d.ts +14 -0
- package/dist/components/utilities/Carousel.svelte +152 -0
- package/dist/components/utilities/Carousel.svelte.d.ts +16 -0
- package/dist/components/utilities/Collapse.svelte +60 -0
- package/dist/components/utilities/Collapse.svelte.d.ts +10 -0
- package/dist/components/utilities/Portal.svelte +72 -0
- package/dist/components/utilities/Portal.svelte.d.ts +21 -0
- package/dist/components/utilities/ScrollArea.svelte +41 -0
- package/dist/components/utilities/ScrollArea.svelte.d.ts +8 -0
- package/dist/components/utilities/index.d.ts +5 -0
- package/dist/components/utilities/index.js +5 -0
- package/dist/index.d.ts +15 -175
- package/dist/index.js +24 -4560
- package/dist/lib/internal/id.d.ts +12 -0
- package/dist/lib/internal/id.js +15 -0
- package/dist/theme.css +218 -0
- package/package.json +6 -5
- package/dist/index.css +0 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { variantClasses, sizeClasses } from './buttonClasses';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
variant?: 'primary' | 'secondary' | 'ghost';
|
|
6
|
+
size?: 'sm' | 'md' | 'lg';
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
type?: 'button' | 'submit' | 'reset';
|
|
9
|
+
onclick?: (event: MouseEvent) => void;
|
|
10
|
+
children?: import('svelte').Snippet;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let {
|
|
14
|
+
variant = 'primary',
|
|
15
|
+
size = 'md',
|
|
16
|
+
disabled = false,
|
|
17
|
+
type = 'button',
|
|
18
|
+
onclick,
|
|
19
|
+
children
|
|
20
|
+
}: Props = $props();
|
|
21
|
+
|
|
22
|
+
const baseClasses = 'inline-flex items-center justify-center rounded-[var(--radius-lg)] font-[var(--font-body)] transition-all duration-300 ease-[var(--ease-luxe)] cursor-pointer';
|
|
23
|
+
const disabledClasses = 'opacity-50 cursor-not-allowed pointer-events-none';
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
<button
|
|
27
|
+
{type}
|
|
28
|
+
{disabled}
|
|
29
|
+
onclick={onclick}
|
|
30
|
+
class="{baseClasses} {variantClasses[variant]} {sizeClasses[size]} {disabled ? disabledClasses : ''}"
|
|
31
|
+
>
|
|
32
|
+
{@render children?.()}
|
|
33
|
+
</button>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
variant?: 'primary' | 'secondary' | 'ghost';
|
|
3
|
+
size?: 'sm' | 'md' | 'lg';
|
|
4
|
+
disabled?: boolean;
|
|
5
|
+
type?: 'button' | 'submit' | 'reset';
|
|
6
|
+
onclick?: (event: MouseEvent) => void;
|
|
7
|
+
children?: import('svelte').Snippet;
|
|
8
|
+
}
|
|
9
|
+
declare const Button: import("svelte").Component<Props, {}, "">;
|
|
10
|
+
type Button = ReturnType<typeof Button>;
|
|
11
|
+
export default Button;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface Props {
|
|
3
|
+
orientation?: 'horizontal' | 'vertical';
|
|
4
|
+
spacing?: boolean;
|
|
5
|
+
children?: import('svelte').Snippet;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
let {
|
|
9
|
+
orientation = 'horizontal',
|
|
10
|
+
spacing = false,
|
|
11
|
+
children
|
|
12
|
+
}: Props = $props();
|
|
13
|
+
|
|
14
|
+
const orientationClasses = {
|
|
15
|
+
horizontal: 'flex-row',
|
|
16
|
+
vertical: 'flex-col'
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const mergedBorderClasses = {
|
|
20
|
+
horizontal: '[&>*:not(:first-child)]:ml-[-1px] [&>*:not(:first-child):not(:last-child)]:rounded-none [&>*:first-child]:rounded-r-none [&>*:last-child]:rounded-l-none',
|
|
21
|
+
vertical: '[&>*:not(:first-child)]:mt-[-1px] [&>*:not(:first-child):not(:last-child)]:rounded-none [&>*:first-child]:rounded-b-none [&>*:last-child]:rounded-t-none'
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const spacingClasses = 'gap-2';
|
|
25
|
+
const baseClasses = 'flex bg-transparent';
|
|
26
|
+
</script>
|
|
27
|
+
|
|
28
|
+
<div class="{baseClasses} {orientationClasses[orientation]} {spacing ? spacingClasses : mergedBorderClasses[orientation]}">
|
|
29
|
+
{@render children?.()}
|
|
30
|
+
</div>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
orientation?: 'horizontal' | 'vertical';
|
|
3
|
+
spacing?: boolean;
|
|
4
|
+
children?: import('svelte').Snippet;
|
|
5
|
+
}
|
|
6
|
+
declare const ButtonGroup: import("svelte").Component<Props, {}, "">;
|
|
7
|
+
type ButtonGroup = ReturnType<typeof ButtonGroup>;
|
|
8
|
+
export default ButtonGroup;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface Props {
|
|
3
|
+
position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
|
|
4
|
+
size?: 'md' | 'lg';
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
ariaLabel: string;
|
|
7
|
+
onclick?: (event: MouseEvent) => void;
|
|
8
|
+
children?: import('svelte').Snippet;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let {
|
|
12
|
+
position = 'bottom-right',
|
|
13
|
+
size = 'lg',
|
|
14
|
+
disabled = false,
|
|
15
|
+
ariaLabel,
|
|
16
|
+
onclick,
|
|
17
|
+
children
|
|
18
|
+
}: Props = $props();
|
|
19
|
+
|
|
20
|
+
const positionClasses = {
|
|
21
|
+
'bottom-right': 'bottom-6 right-6',
|
|
22
|
+
'bottom-left': 'bottom-6 left-6',
|
|
23
|
+
'top-right': 'top-6 right-6',
|
|
24
|
+
'top-left': 'top-6 left-6'
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const sizeClasses = {
|
|
28
|
+
md: 'w-14 h-14 text-base',
|
|
29
|
+
lg: 'w-16 h-16 text-lg'
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const baseClasses = 'fixed z-50 flex items-center justify-center rounded-[var(--radius-pill)] bg-[var(--color-accent)] text-[var(--color-text)] accent-glow hover-lift shadow-[var(--shadow-deep)] transition-all duration-300 ease-[var(--ease-luxe)] cursor-pointer animate-[glow-pulse_3s_ease-in-out_infinite] hover:scale-110';
|
|
33
|
+
const disabledClasses = 'opacity-50 cursor-not-allowed pointer-events-none';
|
|
34
|
+
</script>
|
|
35
|
+
|
|
36
|
+
<button
|
|
37
|
+
type="button"
|
|
38
|
+
{disabled}
|
|
39
|
+
aria-label={ariaLabel}
|
|
40
|
+
onclick={onclick}
|
|
41
|
+
class="{baseClasses} {positionClasses[position]} {sizeClasses[size]} {disabled ? disabledClasses : ''}"
|
|
42
|
+
>
|
|
43
|
+
{@render children?.()}
|
|
44
|
+
</button>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
|
|
3
|
+
size?: 'md' | 'lg';
|
|
4
|
+
disabled?: boolean;
|
|
5
|
+
ariaLabel: string;
|
|
6
|
+
onclick?: (event: MouseEvent) => void;
|
|
7
|
+
children?: import('svelte').Snippet;
|
|
8
|
+
}
|
|
9
|
+
declare const FloatingActionButton: import("svelte").Component<Props, {}, "">;
|
|
10
|
+
type FloatingActionButton = ReturnType<typeof FloatingActionButton>;
|
|
11
|
+
export default FloatingActionButton;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface Props {
|
|
3
|
+
variant?: 'primary' | 'secondary' | 'ghost';
|
|
4
|
+
size?: 'sm' | 'md' | 'lg';
|
|
5
|
+
shape?: 'circle' | 'square';
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
type?: 'button' | 'submit' | 'reset';
|
|
8
|
+
ariaLabel: string;
|
|
9
|
+
onclick?: (event: MouseEvent) => void;
|
|
10
|
+
children?: import('svelte').Snippet;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let {
|
|
14
|
+
variant = 'ghost',
|
|
15
|
+
size = 'md',
|
|
16
|
+
shape = 'circle',
|
|
17
|
+
disabled = false,
|
|
18
|
+
type = 'button',
|
|
19
|
+
ariaLabel,
|
|
20
|
+
onclick,
|
|
21
|
+
children
|
|
22
|
+
}: Props = $props();
|
|
23
|
+
|
|
24
|
+
const variantClasses = {
|
|
25
|
+
primary: 'bg-[var(--color-accent)] text-[var(--color-text)] accent-glow',
|
|
26
|
+
secondary: 'bg-transparent text-[var(--color-text)] border border-[var(--color-border-strong)] hover:border-[var(--color-accent)]',
|
|
27
|
+
ghost: 'bg-transparent text-[var(--color-text)] hover:bg-[var(--color-base-2)]'
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const sizeClasses = {
|
|
31
|
+
sm: 'w-8 h-8 text-sm',
|
|
32
|
+
md: 'w-10 h-10 text-base',
|
|
33
|
+
lg: 'w-12 h-12 text-lg'
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const shapeClasses = {
|
|
37
|
+
circle: 'rounded-[var(--radius-pill)]',
|
|
38
|
+
square: 'rounded-[var(--radius-lg)]'
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const baseClasses = 'inline-flex items-center justify-center font-[var(--font-body)] transition-all duration-300 ease-[var(--ease-luxe)] cursor-pointer hover-lift';
|
|
42
|
+
const disabledClasses = 'opacity-50 cursor-not-allowed pointer-events-none';
|
|
43
|
+
</script>
|
|
44
|
+
|
|
45
|
+
<button
|
|
46
|
+
{type}
|
|
47
|
+
{disabled}
|
|
48
|
+
aria-label={ariaLabel}
|
|
49
|
+
onclick={onclick}
|
|
50
|
+
class="{baseClasses} {variantClasses[variant]} {sizeClasses[size]} {shapeClasses[shape]} {disabled ? disabledClasses : ''}"
|
|
51
|
+
>
|
|
52
|
+
{@render children?.()}
|
|
53
|
+
</button>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
variant?: 'primary' | 'secondary' | 'ghost';
|
|
3
|
+
size?: 'sm' | 'md' | 'lg';
|
|
4
|
+
shape?: 'circle' | 'square';
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
type?: 'button' | 'submit' | 'reset';
|
|
7
|
+
ariaLabel: string;
|
|
8
|
+
onclick?: (event: MouseEvent) => void;
|
|
9
|
+
children?: import('svelte').Snippet;
|
|
10
|
+
}
|
|
11
|
+
declare const IconButton: import("svelte").Component<Props, {}, "">;
|
|
12
|
+
type IconButton = ReturnType<typeof IconButton>;
|
|
13
|
+
export default IconButton;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { variantClasses, sizeClasses } from './buttonClasses';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
href: string;
|
|
6
|
+
variant?: 'primary' | 'secondary' | 'ghost';
|
|
7
|
+
size?: 'sm' | 'md' | 'lg';
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
target?: '_self' | '_blank' | '_parent' | '_top';
|
|
10
|
+
rel?: string;
|
|
11
|
+
children?: import('svelte').Snippet;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let {
|
|
15
|
+
href,
|
|
16
|
+
variant = 'primary',
|
|
17
|
+
size = 'md',
|
|
18
|
+
disabled = false,
|
|
19
|
+
target,
|
|
20
|
+
rel,
|
|
21
|
+
children
|
|
22
|
+
}: Props = $props();
|
|
23
|
+
|
|
24
|
+
const baseClasses = 'inline-flex items-center justify-center rounded-[var(--radius-lg)] font-[var(--font-body)] transition-all duration-300 ease-[var(--ease-luxe)] no-underline';
|
|
25
|
+
const disabledClasses = 'opacity-50 pointer-events-none';
|
|
26
|
+
|
|
27
|
+
const computedRel = $derived(target === '_blank' ? (rel || 'noopener noreferrer') : rel);
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
<a
|
|
31
|
+
href={disabled ? undefined : href}
|
|
32
|
+
{target}
|
|
33
|
+
rel={computedRel}
|
|
34
|
+
class="{baseClasses} {variantClasses[variant]} {sizeClasses[size]} {disabled ? disabledClasses : ''}"
|
|
35
|
+
>
|
|
36
|
+
{@render children?.()}
|
|
37
|
+
</a>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
href: string;
|
|
3
|
+
variant?: 'primary' | 'secondary' | 'ghost';
|
|
4
|
+
size?: 'sm' | 'md' | 'lg';
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
target?: '_self' | '_blank' | '_parent' | '_top';
|
|
7
|
+
rel?: string;
|
|
8
|
+
children?: import('svelte').Snippet;
|
|
9
|
+
}
|
|
10
|
+
declare const LinkButton: import("svelte").Component<Props, {}, "">;
|
|
11
|
+
type LinkButton = ReturnType<typeof LinkButton>;
|
|
12
|
+
export default LinkButton;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const variantClasses = {
|
|
2
|
+
primary: 'bg-[var(--color-accent)] text-[var(--color-text)] accent-glow hover-lift',
|
|
3
|
+
secondary: 'bg-transparent text-[var(--color-text)] border border-[var(--color-border-strong)] hover:border-[var(--color-accent)] hover-lift',
|
|
4
|
+
ghost: 'bg-transparent text-[var(--color-text)] hover:bg-[var(--color-base-2)] hover-lift'
|
|
5
|
+
};
|
|
6
|
+
export const sizeClasses = {
|
|
7
|
+
sm: 'px-3 py-1.5 text-sm',
|
|
8
|
+
md: 'px-4 py-2 text-base',
|
|
9
|
+
lg: 'px-6 py-3 text-lg'
|
|
10
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { default as Button } from './Button.svelte';
|
|
2
|
+
export { default as IconButton } from './IconButton.svelte';
|
|
3
|
+
export { default as ButtonGroup } from './ButtonGroup.svelte';
|
|
4
|
+
export { default as LinkButton } from './LinkButton.svelte';
|
|
5
|
+
export { default as FloatingActionButton } from './FloatingActionButton.svelte';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { default as Button } from './Button.svelte';
|
|
2
|
+
export { default as IconButton } from './IconButton.svelte';
|
|
3
|
+
export { default as ButtonGroup } from './ButtonGroup.svelte';
|
|
4
|
+
export { default as LinkButton } from './LinkButton.svelte';
|
|
5
|
+
export { default as FloatingActionButton } from './FloatingActionButton.svelte';
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
padding?: 'none' | 'sm' | 'md' | 'lg';
|
|
6
|
+
hoverable?: boolean;
|
|
7
|
+
children?: Snippet;
|
|
8
|
+
header?: Snippet;
|
|
9
|
+
footer?: Snippet;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
let {
|
|
13
|
+
padding = 'md',
|
|
14
|
+
hoverable = false,
|
|
15
|
+
children,
|
|
16
|
+
header,
|
|
17
|
+
footer
|
|
18
|
+
}: Props = $props();
|
|
19
|
+
|
|
20
|
+
const paddingClasses = {
|
|
21
|
+
none: 'p-0',
|
|
22
|
+
sm: 'p-4',
|
|
23
|
+
md: 'p-6',
|
|
24
|
+
lg: 'p-8'
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const baseClasses = 'glass-panel rounded-xl transition-all duration-300 ease-[var(--ease-luxe)]';
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
<div class="{baseClasses} {hoverable ? 'hover-lift' : ''} {paddingClasses[padding]}">
|
|
31
|
+
{#if header}
|
|
32
|
+
<div class="pb-4 mb-4 border-b border-border">
|
|
33
|
+
{@render header()}
|
|
34
|
+
</div>
|
|
35
|
+
{/if}
|
|
36
|
+
|
|
37
|
+
<div>
|
|
38
|
+
{@render children?.()}
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
{#if footer}
|
|
42
|
+
<div class="pt-4 mt-4 border-t border-border">
|
|
43
|
+
{@render footer()}
|
|
44
|
+
</div>
|
|
45
|
+
{/if}
|
|
46
|
+
</div>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
padding?: 'none' | 'sm' | 'md' | 'lg';
|
|
4
|
+
hoverable?: boolean;
|
|
5
|
+
children?: Snippet;
|
|
6
|
+
header?: Snippet;
|
|
7
|
+
footer?: Snippet;
|
|
8
|
+
}
|
|
9
|
+
declare const Card: import("svelte").Component<Props, {}, "">;
|
|
10
|
+
type Card = ReturnType<typeof Card>;
|
|
11
|
+
export default Card;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';
|
|
6
|
+
centered?: boolean;
|
|
7
|
+
padding?: boolean;
|
|
8
|
+
children?: Snippet;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let {
|
|
12
|
+
size = 'lg',
|
|
13
|
+
centered = true,
|
|
14
|
+
padding = true,
|
|
15
|
+
children
|
|
16
|
+
}: Props = $props();
|
|
17
|
+
|
|
18
|
+
const sizeClasses = {
|
|
19
|
+
sm: 'max-w-screen-sm',
|
|
20
|
+
md: 'max-w-screen-md',
|
|
21
|
+
lg: 'max-w-screen-lg',
|
|
22
|
+
xl: 'max-w-screen-xl',
|
|
23
|
+
full: 'max-w-full'
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const centeredClasses = centered ? 'mx-auto' : '';
|
|
27
|
+
const paddingClasses = padding ? 'px-4 md:px-6 lg:px-8' : '';
|
|
28
|
+
const baseClasses = 'w-full';
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<div class="{baseClasses} {sizeClasses[size]} {centeredClasses} {paddingClasses}">
|
|
32
|
+
{@render children?.()}
|
|
33
|
+
</div>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';
|
|
4
|
+
centered?: boolean;
|
|
5
|
+
padding?: boolean;
|
|
6
|
+
children?: Snippet;
|
|
7
|
+
}
|
|
8
|
+
declare const Container: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type Container = ReturnType<typeof Container>;
|
|
10
|
+
export default Container;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface Props {
|
|
3
|
+
orientation?: 'horizontal' | 'vertical';
|
|
4
|
+
spacing?: 'none' | 'sm' | 'md' | 'lg';
|
|
5
|
+
thickness?: 'thin' | 'normal' | 'thick';
|
|
6
|
+
variant?: 'default' | 'strong';
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
let {
|
|
10
|
+
orientation = 'horizontal',
|
|
11
|
+
spacing = 'md',
|
|
12
|
+
thickness = 'normal',
|
|
13
|
+
variant = 'default'
|
|
14
|
+
}: Props = $props();
|
|
15
|
+
|
|
16
|
+
const horizontalThicknessMap = {
|
|
17
|
+
thin: 'border-t-[1px]',
|
|
18
|
+
normal: 'border-t-[1px]',
|
|
19
|
+
thick: 'border-t-[2px]'
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const verticalThicknessMap = {
|
|
23
|
+
thin: 'border-l-[1px]',
|
|
24
|
+
normal: 'border-l-[1px]',
|
|
25
|
+
thick: 'border-l-[2px]'
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const horizontalSpacing = {
|
|
29
|
+
none: 'my-0',
|
|
30
|
+
sm: 'my-2',
|
|
31
|
+
md: 'my-4',
|
|
32
|
+
lg: 'my-6'
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const verticalSpacing = {
|
|
36
|
+
none: 'mx-0',
|
|
37
|
+
sm: 'mx-2',
|
|
38
|
+
md: 'mx-4',
|
|
39
|
+
lg: 'mx-6'
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const borderColor = variant === 'strong' ? 'border-[var(--color-border-strong)]' : 'border-[var(--color-border)]';
|
|
43
|
+
|
|
44
|
+
const horizontalClasses = `w-full ${horizontalThicknessMap[thickness]} ${borderColor} ${horizontalSpacing[spacing]}`;
|
|
45
|
+
const verticalClasses = `h-full ${verticalThicknessMap[thickness]} ${borderColor} ${verticalSpacing[spacing]}`;
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
{#if orientation === 'horizontal'}
|
|
49
|
+
<hr class={horizontalClasses} />
|
|
50
|
+
{:else}
|
|
51
|
+
<div class={verticalClasses}></div>
|
|
52
|
+
{/if}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
orientation?: 'horizontal' | 'vertical';
|
|
3
|
+
spacing?: 'none' | 'sm' | 'md' | 'lg';
|
|
4
|
+
thickness?: 'thin' | 'normal' | 'thick';
|
|
5
|
+
variant?: 'default' | 'strong';
|
|
6
|
+
}
|
|
7
|
+
declare const Divider: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type Divider = ReturnType<typeof Divider>;
|
|
9
|
+
export default Divider;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
cols?: 1 | 2 | 3 | 4 | 6 | 12;
|
|
6
|
+
gap?: 'none' | 'sm' | 'md' | 'lg' | 'xl';
|
|
7
|
+
responsive?: boolean;
|
|
8
|
+
children?: Snippet;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let {
|
|
12
|
+
cols = 3,
|
|
13
|
+
gap = 'md',
|
|
14
|
+
responsive = true,
|
|
15
|
+
children
|
|
16
|
+
}: Props = $props();
|
|
17
|
+
|
|
18
|
+
const colsClasses = {
|
|
19
|
+
1: 'grid-cols-1',
|
|
20
|
+
2: 'grid-cols-2',
|
|
21
|
+
3: 'grid-cols-3',
|
|
22
|
+
4: 'grid-cols-4',
|
|
23
|
+
6: 'grid-cols-6',
|
|
24
|
+
12: 'grid-cols-12'
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const gapClasses = {
|
|
28
|
+
none: 'gap-0',
|
|
29
|
+
sm: 'gap-2',
|
|
30
|
+
md: 'gap-4',
|
|
31
|
+
lg: 'gap-6',
|
|
32
|
+
xl: 'gap-8'
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const responsiveClasses = responsive
|
|
36
|
+
? `grid-cols-1 ${cols >= 2 ? 'md:grid-cols-2' : ''} lg:${colsClasses[cols]}`
|
|
37
|
+
: colsClasses[cols];
|
|
38
|
+
|
|
39
|
+
const baseClasses = 'grid w-full';
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<div class="{baseClasses} {responsiveClasses} {gapClasses[gap]}">
|
|
43
|
+
{@render children?.()}
|
|
44
|
+
</div>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
cols?: 1 | 2 | 3 | 4 | 6 | 12;
|
|
4
|
+
gap?: 'none' | 'sm' | 'md' | 'lg' | 'xl';
|
|
5
|
+
responsive?: boolean;
|
|
6
|
+
children?: Snippet;
|
|
7
|
+
}
|
|
8
|
+
declare const Grid: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type Grid = ReturnType<typeof Grid>;
|
|
10
|
+
export default Grid;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
padding?: 'none' | 'sm' | 'md' | 'lg';
|
|
6
|
+
rounded?: boolean;
|
|
7
|
+
glass?: boolean;
|
|
8
|
+
children?: Snippet;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let {
|
|
12
|
+
padding = 'md',
|
|
13
|
+
rounded = true,
|
|
14
|
+
glass = true,
|
|
15
|
+
children
|
|
16
|
+
}: Props = $props();
|
|
17
|
+
|
|
18
|
+
const paddingClasses = {
|
|
19
|
+
none: 'p-0',
|
|
20
|
+
sm: 'p-4',
|
|
21
|
+
md: 'p-6',
|
|
22
|
+
lg: 'p-8'
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const glassClasses = glass ? 'glass-panel' : 'bg-[var(--color-panel)]';
|
|
26
|
+
const roundedClasses = rounded ? 'rounded-[var(--radius-lg)]' : '';
|
|
27
|
+
const baseClasses = 'transition-all duration-300 ease-[var(--ease-luxe)]';
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
<div class="{baseClasses} {glassClasses} {roundedClasses} {paddingClasses[padding]}">
|
|
31
|
+
{@render children?.()}
|
|
32
|
+
</div>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
padding?: 'none' | 'sm' | 'md' | 'lg';
|
|
4
|
+
rounded?: boolean;
|
|
5
|
+
glass?: boolean;
|
|
6
|
+
children?: Snippet;
|
|
7
|
+
}
|
|
8
|
+
declare const Panel: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type Panel = ReturnType<typeof Panel>;
|
|
10
|
+
export default Panel;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
level?: 1 | 2 | 3 | 4 | 5 | 6;
|
|
6
|
+
glow?: boolean;
|
|
7
|
+
subtitle?: string;
|
|
8
|
+
align?: 'left' | 'center' | 'right';
|
|
9
|
+
children?: Snippet;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
let {
|
|
13
|
+
level = 2,
|
|
14
|
+
glow = true,
|
|
15
|
+
subtitle,
|
|
16
|
+
align = 'left',
|
|
17
|
+
children
|
|
18
|
+
}: Props = $props();
|
|
19
|
+
|
|
20
|
+
const headingTag = `h${level}`;
|
|
21
|
+
const glowClasses = glow ? 'text-glow' : '';
|
|
22
|
+
const alignClasses = `text-${align}`;
|
|
23
|
+
|
|
24
|
+
const headingClasses = `font-[var(--font-heading)] text-[length:var(--text-h${level}-size)] font-[number:var(--text-h${level}-weight)] leading-[var(--text-h${level}-line-height)] text-[var(--color-text)] ${glowClasses} ${alignClasses}`;
|
|
25
|
+
const subtitleClasses = `mt-2 font-[var(--font-body)] text-[length:var(--text-body-size)] text-[var(--color-text-soft)] ${alignClasses}`;
|
|
26
|
+
</script>
|
|
27
|
+
|
|
28
|
+
<div class="mb-8">
|
|
29
|
+
<svelte:element this={headingTag} class={headingClasses}>
|
|
30
|
+
{@render children?.()}
|
|
31
|
+
</svelte:element>
|
|
32
|
+
|
|
33
|
+
{#if subtitle}
|
|
34
|
+
<p class={subtitleClasses}>
|
|
35
|
+
{subtitle}
|
|
36
|
+
</p>
|
|
37
|
+
{/if}
|
|
38
|
+
</div>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
interface Props {
|
|
3
|
+
level?: 1 | 2 | 3 | 4 | 5 | 6;
|
|
4
|
+
glow?: boolean;
|
|
5
|
+
subtitle?: string;
|
|
6
|
+
align?: 'left' | 'center' | 'right';
|
|
7
|
+
children?: Snippet;
|
|
8
|
+
}
|
|
9
|
+
declare const SectionHeader: import("svelte").Component<Props, {}, "">;
|
|
10
|
+
type SectionHeader = ReturnType<typeof SectionHeader>;
|
|
11
|
+
export default SectionHeader;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { default as Card } from './Card.svelte';
|
|
2
|
+
export { default as Panel } from './Panel.svelte';
|
|
3
|
+
export { default as Grid } from './Grid.svelte';
|
|
4
|
+
export { default as Container } from './Container.svelte';
|
|
5
|
+
export { default as SectionHeader } from './SectionHeader.svelte';
|
|
6
|
+
export { default as Divider } from './Divider.svelte';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { default as Card } from './Card.svelte';
|
|
2
|
+
export { default as Panel } from './Panel.svelte';
|
|
3
|
+
export { default as Grid } from './Grid.svelte';
|
|
4
|
+
export { default as Container } from './Container.svelte';
|
|
5
|
+
export { default as SectionHeader } from './SectionHeader.svelte';
|
|
6
|
+
export { default as Divider } from './Divider.svelte';
|