@mrintel/villain-ui 0.3.0 → 0.7.1

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 (140) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +3490 -1296
  3. package/dist/components/buttons/Button.svelte +27 -33
  4. package/dist/components/buttons/Button.svelte.d.ts +4 -1
  5. package/dist/components/buttons/ButtonGroup.svelte +17 -30
  6. package/dist/components/buttons/FloatingActionButton.svelte +20 -44
  7. package/dist/components/buttons/FloatingActionButton.svelte.d.ts +2 -1
  8. package/dist/components/buttons/IconButton.svelte +23 -53
  9. package/dist/components/buttons/IconButton.svelte.d.ts +2 -1
  10. package/dist/components/buttons/LinkButton.svelte +24 -37
  11. package/dist/components/buttons/LinkButton.svelte.d.ts +4 -1
  12. package/dist/components/buttons/buttonClasses.d.ts +5 -0
  13. package/dist/components/buttons/buttonClasses.js +8 -3
  14. package/dist/components/cards/Card.svelte +54 -46
  15. package/dist/components/cards/Card.svelte.d.ts +9 -2
  16. package/dist/components/cards/Container.svelte +17 -33
  17. package/dist/components/cards/Divider.svelte +36 -52
  18. package/dist/components/cards/Divider.svelte.d.ts +2 -0
  19. package/dist/components/cards/Grid.svelte +55 -44
  20. package/dist/components/cards/Panel.svelte +18 -32
  21. package/dist/components/cards/Panel.svelte.d.ts +2 -1
  22. package/dist/components/cards/SectionHeader.svelte +24 -38
  23. package/dist/components/cards/SectionHeader.svelte.d.ts +1 -0
  24. package/dist/components/data/Avatar.svelte +48 -67
  25. package/dist/components/data/Badge.svelte +45 -32
  26. package/dist/components/data/Badge.svelte.d.ts +7 -1
  27. package/dist/components/data/CalendarGrid.svelte +433 -0
  28. package/dist/components/data/CalendarGrid.svelte.d.ts +25 -0
  29. package/dist/components/data/CalendarGrid.types.d.ts +7 -0
  30. package/dist/components/data/CalendarGrid.types.js +1 -0
  31. package/dist/components/data/CodeBlock.svelte +119 -121
  32. package/dist/components/data/CodeBlock.svelte.d.ts +8 -0
  33. package/dist/components/data/List.svelte +87 -64
  34. package/dist/components/data/List.svelte.d.ts +7 -0
  35. package/dist/components/data/Pagination.svelte +121 -123
  36. package/dist/components/data/Pagination.svelte.d.ts +5 -0
  37. package/dist/components/data/Sparkline.svelte +117 -0
  38. package/dist/components/data/Sparkline.svelte.d.ts +43 -0
  39. package/dist/components/data/Stat.svelte +92 -103
  40. package/dist/components/data/Table.svelte +443 -76
  41. package/dist/components/data/Table.svelte.d.ts +23 -2
  42. package/dist/components/data/Table.types.d.ts +14 -0
  43. package/dist/components/data/Table.types.js +1 -0
  44. package/dist/components/data/Tag.svelte +51 -53
  45. package/dist/components/data/Tag.svelte.d.ts +5 -1
  46. package/dist/components/data/index.d.ts +4 -0
  47. package/dist/components/data/index.js +2 -0
  48. package/dist/components/forms/Checkbox.svelte +39 -51
  49. package/dist/components/forms/Checkbox.svelte.d.ts +3 -1
  50. package/dist/components/forms/DatePicker.svelte +61 -0
  51. package/dist/components/forms/DatePicker.svelte.d.ts +15 -0
  52. package/dist/components/forms/DateTimePicker.svelte +63 -0
  53. package/dist/components/forms/DateTimePicker.svelte.d.ts +16 -0
  54. package/dist/components/forms/FileUpload.svelte +136 -164
  55. package/dist/components/forms/FileUpload.svelte.d.ts +1 -0
  56. package/dist/components/forms/Input.svelte +284 -57
  57. package/dist/components/forms/Input.svelte.d.ts +10 -3
  58. package/dist/components/forms/InputGroup.svelte +7 -7
  59. package/dist/components/forms/RadioGroup.svelte +77 -87
  60. package/dist/components/forms/RadioGroup.svelte.d.ts +3 -1
  61. package/dist/components/forms/RangeSlider.svelte +90 -116
  62. package/dist/components/forms/Select.svelte +106 -71
  63. package/dist/components/forms/Select.svelte.d.ts +3 -1
  64. package/dist/components/forms/Step.svelte +25 -0
  65. package/dist/components/forms/Step.svelte.d.ts +12 -0
  66. package/dist/components/forms/StepContext.d.ts +3 -0
  67. package/dist/components/forms/StepContext.js +5 -0
  68. package/dist/components/forms/Stepper.types.d.ts +37 -0
  69. package/dist/components/forms/Stepper.types.js +1 -0
  70. package/dist/components/forms/StepperForm.svelte +183 -0
  71. package/dist/components/forms/StepperForm.svelte.d.ts +17 -0
  72. package/dist/components/forms/Switch.svelte +44 -56
  73. package/dist/components/forms/Switch.svelte.d.ts +3 -1
  74. package/dist/components/forms/Textarea.svelte +52 -57
  75. package/dist/components/forms/Textarea.svelte.d.ts +3 -1
  76. package/dist/components/forms/TimePicker.svelte +63 -0
  77. package/dist/components/forms/TimePicker.svelte.d.ts +16 -0
  78. package/dist/components/forms/formClasses.d.ts +3 -0
  79. package/dist/components/forms/formClasses.js +3 -0
  80. package/dist/components/forms/index.d.ts +6 -0
  81. package/dist/components/forms/index.js +5 -0
  82. package/dist/components/navigation/Breadcrumbs.svelte +56 -59
  83. package/dist/components/navigation/Breadcrumbs.svelte.d.ts +1 -0
  84. package/dist/components/navigation/ContextMenu.svelte +133 -83
  85. package/dist/components/navigation/ContextMenu.svelte.d.ts +8 -1
  86. package/dist/components/navigation/DropdownMenu.svelte +139 -80
  87. package/dist/components/navigation/DropdownMenu.svelte.d.ts +8 -1
  88. package/dist/components/navigation/Menu.svelte +72 -48
  89. package/dist/components/navigation/Navbar.svelte +111 -32
  90. package/dist/components/navigation/Navbar.svelte.d.ts +6 -0
  91. package/dist/components/navigation/Sidebar.svelte +236 -35
  92. package/dist/components/navigation/Sidebar.svelte.d.ts +2 -0
  93. package/dist/components/navigation/Stepper.svelte +204 -0
  94. package/dist/components/navigation/Stepper.svelte.d.ts +34 -0
  95. package/dist/components/navigation/Tabs.svelte +86 -54
  96. package/dist/components/navigation/Tabs.svelte.d.ts +5 -1
  97. package/dist/components/navigation/index.d.ts +1 -0
  98. package/dist/components/navigation/index.js +1 -0
  99. package/dist/components/overlays/Alert.svelte +81 -99
  100. package/dist/components/overlays/Alert.svelte.d.ts +5 -1
  101. package/dist/components/overlays/CommandPalette.svelte +182 -217
  102. package/dist/components/overlays/Drawer.svelte +158 -167
  103. package/dist/components/overlays/Drawer.svelte.d.ts +3 -1
  104. package/dist/components/overlays/Dropdown.svelte +62 -30
  105. package/dist/components/overlays/Dropdown.svelte.d.ts +2 -0
  106. package/dist/components/overlays/Modal.svelte +125 -130
  107. package/dist/components/overlays/Modal.svelte.d.ts +3 -1
  108. package/dist/components/overlays/Popover.svelte +106 -131
  109. package/dist/components/overlays/ProgressBar.svelte +29 -45
  110. package/dist/components/overlays/SkeletonLoader.svelte +66 -82
  111. package/dist/components/overlays/Spinner.svelte +33 -43
  112. package/dist/components/overlays/Toast.svelte +111 -140
  113. package/dist/components/overlays/Toast.svelte.d.ts +3 -0
  114. package/dist/components/overlays/Tooltip.svelte +94 -115
  115. package/dist/components/overlays/Tooltip.svelte.d.ts +3 -1
  116. package/dist/components/typography/Code.svelte +10 -14
  117. package/dist/components/typography/Heading.svelte +15 -22
  118. package/dist/components/typography/Heading.svelte.d.ts +1 -0
  119. package/dist/components/typography/Text.svelte +21 -24
  120. package/dist/components/typography/Text.svelte.d.ts +2 -1
  121. package/dist/components/utilities/Accordion.svelte +54 -67
  122. package/dist/components/utilities/Accordion.svelte.d.ts +4 -1
  123. package/dist/components/utilities/Carousel.svelte +124 -152
  124. package/dist/components/utilities/Collapse.svelte +46 -60
  125. package/dist/components/utilities/Hero.svelte +42 -0
  126. package/dist/components/utilities/Hero.svelte.d.ts +10 -0
  127. package/dist/components/utilities/Portal.svelte +47 -72
  128. package/dist/components/utilities/ScrollArea.svelte +33 -41
  129. package/dist/components/utilities/SystemConsole.svelte +310 -0
  130. package/dist/components/utilities/SystemConsole.svelte.d.ts +20 -0
  131. package/dist/components/utilities/SystemInterface.svelte +726 -0
  132. package/dist/components/utilities/SystemInterface.svelte.d.ts +19 -0
  133. package/dist/components/utilities/index.d.ts +4 -0
  134. package/dist/components/utilities/index.js +3 -0
  135. package/dist/components/utilities/utilities.types.d.ts +46 -0
  136. package/dist/components/utilities/utilities.types.js +4 -0
  137. package/dist/index.d.ts +57 -5
  138. package/dist/index.js +5 -5
  139. package/dist/theme.css +2889 -218
  140. package/package.json +83 -76
@@ -1,33 +1,27 @@
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>
1
+ <script lang="ts">import { variantClasses, sizeClasses, disabledClasses } from './buttonClasses';
2
+ let { variant = 'primary', size = 'md', disabled = false, type = 'button', onclick, iconBefore, iconAfter, class: className = '', children, ...restProps } = $props();
3
+ 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 gap-2';
4
+ const classes = $derived(`${baseClasses} ${variantClasses[variant]} ${sizeClasses[size]} ${disabled ? disabledClasses : ''} ${className}`);
5
+ </script>
6
+
7
+ <button
8
+ {type}
9
+ {disabled}
10
+ onclick={onclick}
11
+ class={classes}
12
+ {...restProps}
13
+ >
14
+ {#if iconBefore}
15
+ <span class="inline-flex items-center justify-center">
16
+ {@render iconBefore()}
17
+ </span>
18
+ {/if}
19
+ {#if children}
20
+ {@render children()}
21
+ {/if}
22
+ {#if iconAfter}
23
+ <span class="inline-flex items-center justify-center">
24
+ {@render iconAfter()}
25
+ </span>
26
+ {/if}
27
+ </button>
@@ -1,10 +1,13 @@
1
- interface Props {
1
+ export interface Props {
2
2
  variant?: 'primary' | 'secondary' | 'ghost';
3
3
  size?: 'sm' | 'md' | 'lg';
4
4
  disabled?: boolean;
5
5
  type?: 'button' | 'submit' | 'reset';
6
6
  onclick?: (event: MouseEvent) => void;
7
+ iconBefore?: import('svelte').Snippet;
8
+ iconAfter?: import('svelte').Snippet;
7
9
  children?: import('svelte').Snippet;
10
+ class?: string;
8
11
  }
9
12
  declare const Button: import("svelte").Component<Props, {}, "">;
10
13
  type Button = ReturnType<typeof Button>;
@@ -1,30 +1,17 @@
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>
1
+ <script lang="ts">"use strict";
2
+ let { orientation = 'horizontal', spacing = false, children } = $props();
3
+ const orientationClasses = {
4
+ horizontal: 'flex-row',
5
+ vertical: 'flex-col'
6
+ };
7
+ const mergedBorderClasses = {
8
+ horizontal: '[&>*:not(:first-child)]:ml-[-1px] [&>*:not(:first-child):not(:last-child)]:rounded-none [&>*:first-child]:rounded-r-none [&>*:last-child]:rounded-l-none',
9
+ vertical: '[&>*:not(:first-child)]:mt-[-1px] [&>*:not(:first-child):not(:last-child)]:rounded-none [&>*:first-child]:rounded-b-none [&>*:last-child]:rounded-t-none'
10
+ };
11
+ const spacingClasses = 'gap-2';
12
+ const baseClasses = 'flex bg-transparent';
13
+ </script>
14
+
15
+ <div class="{baseClasses} {orientationClasses[orientation]} {spacing ? spacingClasses : mergedBorderClasses[orientation]}">
16
+ {@render children?.()}
17
+ </div>
@@ -1,44 +1,20 @@
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>
1
+ <script lang="ts">import { fabSizeClasses, disabledClasses } from './buttonClasses';
2
+ let { position = 'bottom-right', size = 'lg', disabled = false, ariaLabel, onclick, children, class: className = '' } = $props();
3
+ const positionClasses = {
4
+ 'bottom-right': 'bottom-6 right-6',
5
+ 'bottom-left': 'bottom-6 left-6',
6
+ 'top-right': 'top-6 right-6',
7
+ 'top-left': 'top-6 left-6'
8
+ };
9
+ const baseClasses = 'fixed z-[var(--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';
10
+ </script>
11
+
12
+ <button
13
+ type="button"
14
+ {disabled}
15
+ aria-label={ariaLabel}
16
+ onclick={onclick}
17
+ class="{baseClasses} {positionClasses[position]} {fabSizeClasses[size]} {disabled ? disabledClasses : ''} {className}"
18
+ >
19
+ {@render children?.()}
20
+ </button>
@@ -1,10 +1,11 @@
1
- interface Props {
1
+ export interface Props {
2
2
  position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
3
3
  size?: 'md' | 'lg';
4
4
  disabled?: boolean;
5
5
  ariaLabel: string;
6
6
  onclick?: (event: MouseEvent) => void;
7
7
  children?: import('svelte').Snippet;
8
+ class?: string;
8
9
  }
9
10
  declare const FloatingActionButton: import("svelte").Component<Props, {}, "">;
10
11
  type FloatingActionButton = ReturnType<typeof FloatingActionButton>;
@@ -1,53 +1,23 @@
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>
1
+ <script lang="ts">import { variantClasses, disabledClasses } from './buttonClasses';
2
+ let { variant = 'ghost', size = 'md', shape = 'circle', disabled = false, type = 'button', ariaLabel, onclick, children, class: className = '' } = $props();
3
+ const iconSizeClasses = {
4
+ sm: 'w-10 h-10 text-sm',
5
+ md: 'w-12 h-12 text-base',
6
+ lg: 'w-14 h-14 text-lg'
7
+ };
8
+ const shapeClasses = {
9
+ circle: 'rounded-[var(--radius-pill)]',
10
+ square: 'rounded-[var(--radius-lg)]'
11
+ };
12
+ const baseClasses = 'inline-flex items-center justify-center font-[var(--font-body)] transition-all duration-300 ease-[var(--ease-luxe)] cursor-pointer hover-lift';
13
+ </script>
14
+
15
+ <button
16
+ {type}
17
+ {disabled}
18
+ aria-label={ariaLabel}
19
+ onclick={onclick}
20
+ class="{baseClasses} {variantClasses[variant]} {iconSizeClasses[size]} {shapeClasses[shape]} {disabled ? disabledClasses : ''} {className}"
21
+ >
22
+ {@render children?.()}
23
+ </button>
@@ -1,4 +1,4 @@
1
- interface Props {
1
+ export interface Props {
2
2
  variant?: 'primary' | 'secondary' | 'ghost';
3
3
  size?: 'sm' | 'md' | 'lg';
4
4
  shape?: 'circle' | 'square';
@@ -7,6 +7,7 @@ interface Props {
7
7
  ariaLabel: string;
8
8
  onclick?: (event: MouseEvent) => void;
9
9
  children?: import('svelte').Snippet;
10
+ class?: string;
10
11
  }
11
12
  declare const IconButton: import("svelte").Component<Props, {}, "">;
12
13
  type IconButton = ReturnType<typeof IconButton>;
@@ -1,37 +1,24 @@
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>
1
+ <script lang="ts">import { variantClasses, sizeClasses, disabledClasses } from './buttonClasses';
2
+ let { href, variant = 'primary', size = 'md', disabled = false, target, rel, children, iconBefore, iconAfter, class: className = '' } = $props();
3
+ 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 gap-2';
4
+ const computedRel = $derived(target === '_blank' ? (rel || 'noopener noreferrer') : rel);
5
+ </script>
6
+
7
+ <a
8
+ href={disabled ? undefined : href}
9
+ {target}
10
+ rel={computedRel}
11
+ class="{baseClasses} {variantClasses[variant]} {sizeClasses[size]} {disabled ? disabledClasses : ''} {className}"
12
+ >
13
+ {#if iconBefore}
14
+ <span class="inline-flex items-center justify-center">
15
+ {@render iconBefore()}
16
+ </span>
17
+ {/if}
18
+ {@render children?.()}
19
+ {#if iconAfter}
20
+ <span class="inline-flex items-center justify-center">
21
+ {@render iconAfter()}
22
+ </span>
23
+ {/if}
24
+ </a>
@@ -1,4 +1,4 @@
1
- interface Props {
1
+ export interface Props {
2
2
  href: string;
3
3
  variant?: 'primary' | 'secondary' | 'ghost';
4
4
  size?: 'sm' | 'md' | 'lg';
@@ -6,6 +6,9 @@ interface Props {
6
6
  target?: '_self' | '_blank' | '_parent' | '_top';
7
7
  rel?: string;
8
8
  children?: import('svelte').Snippet;
9
+ iconBefore?: import('svelte').Snippet;
10
+ iconAfter?: import('svelte').Snippet;
11
+ class?: string;
9
12
  }
10
13
  declare const LinkButton: import("svelte").Component<Props, {}, "">;
11
14
  type LinkButton = ReturnType<typeof LinkButton>;
@@ -8,3 +8,8 @@ export declare const sizeClasses: {
8
8
  md: string;
9
9
  lg: string;
10
10
  };
11
+ export declare const disabledClasses = "opacity-50 cursor-not-allowed pointer-events-none";
12
+ export declare const fabSizeClasses: {
13
+ md: string;
14
+ lg: string;
15
+ };
@@ -4,7 +4,12 @@ export const variantClasses = {
4
4
  ghost: 'bg-transparent text-[var(--color-text)] hover:bg-[var(--color-base-2)] hover-lift'
5
5
  };
6
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'
7
+ sm: 'px-3 py-1.5 text-sm font-medium',
8
+ md: 'px-4 py-2 text-base font-medium',
9
+ lg: 'px-5 py-2.5 text-lg font-semibold'
10
+ };
11
+ export const disabledClasses = 'opacity-50 cursor-not-allowed pointer-events-none';
12
+ export const fabSizeClasses = {
13
+ md: 'w-16 h-16 text-base',
14
+ lg: 'w-18 h-18 text-lg'
10
15
  };
@@ -1,46 +1,54 @@
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>
1
+ <script lang="ts">let { padding = 'md', href, target = '_self', rel, onclick, selected = false, disabled = false, class: className = '', children, header, footer, iconBefore, ...restProps } = $props();
2
+ // Compute rel attribute: use explicit rel if provided, otherwise default to 'noopener noreferrer' for target='_blank'
3
+ const relValue = $derived(rel ?? (target === '_blank' ? 'noopener noreferrer' : undefined));
4
+ const paddingClasses = {
5
+ none: 'p-0',
6
+ sm: 'p-4',
7
+ md: 'p-6',
8
+ lg: 'p-8'
9
+ };
10
+ const isInteractive = $derived(!!href || !!onclick);
11
+ const baseClasses = $derived(`panel-raised rounded-[var(--radius-lg)] transition-all duration-300 ease-[var(--ease-luxe)]` +
12
+ `${href ? ' no-underline' : ''}` +
13
+ `${isInteractive ? ' cursor-pointer hover-lift' : ''}` +
14
+ `${selected ? ' ring-2 ring-accent ring-offset-2 ring-offset-base-0' : ''}` +
15
+ `${disabled ? ' opacity-50 pointer-events-none' : ''}`);
16
+ export {};
17
+ </script>
18
+
19
+ {#snippet cardContent()}
20
+ {#if iconBefore}
21
+ <div class="card-icon">
22
+ {@render iconBefore()}
23
+ </div>
24
+ {/if}
25
+ {#if header}
26
+ <div class="pb-3 mb-3 border-b border-border-strong">
27
+ {@render header()}
28
+ </div>
29
+ {/if}
30
+
31
+ <div>
32
+ {@render children?.()}
33
+ </div>
34
+
35
+ {#if footer}
36
+ <div class="pt-3 mt-3 border-t border-border-strong">
37
+ {@render footer()}
38
+ </div>
39
+ {/if}
40
+ {/snippet}
41
+
42
+ {#if href}
43
+ <a {href} {target} rel={relValue} class="{baseClasses} {paddingClasses[padding]} {className}" aria-disabled={disabled || undefined} {...restProps}>
44
+ {@render cardContent()}
45
+ </a>
46
+ {:else if onclick}
47
+ <button type="button" {onclick} {disabled} aria-pressed={selected} class="{baseClasses} {paddingClasses[padding]} {className} text-left w-full" {...restProps}>
48
+ {@render cardContent()}
49
+ </button>
50
+ {:else}
51
+ <div class="{baseClasses} {paddingClasses[padding]} {className}" {...restProps}>
52
+ {@render cardContent()}
53
+ </div>
54
+ {/if}
@@ -1,10 +1,17 @@
1
1
  import type { Snippet } from 'svelte';
2
- interface Props {
2
+ export interface Props {
3
3
  padding?: 'none' | 'sm' | 'md' | 'lg';
4
- hoverable?: boolean;
4
+ href?: string;
5
+ target?: '_blank' | '_self' | '_parent' | '_top';
6
+ rel?: string;
7
+ onclick?: (event: MouseEvent) => void;
8
+ selected?: boolean;
9
+ disabled?: boolean;
10
+ class?: string;
5
11
  children?: Snippet;
6
12
  header?: Snippet;
7
13
  footer?: Snippet;
14
+ iconBefore?: Snippet;
8
15
  }
9
16
  declare const Card: import("svelte").Component<Props, {}, "">;
10
17
  type Card = ReturnType<typeof Card>;
@@ -1,33 +1,17 @@
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>
1
+ <script lang="ts">let { size = 'lg', centered = true, padding = true, class: className = '', children, ...restProps } = $props();
2
+ const sizeClasses = {
3
+ sm: 'max-w-screen-sm',
4
+ md: 'max-w-screen-md',
5
+ lg: 'max-w-screen-lg',
6
+ xl: 'max-w-screen-xl',
7
+ full: 'max-w-full'
8
+ };
9
+ const centeredClasses = centered ? 'mx-auto' : '';
10
+ const paddingClasses = padding ? 'px-4 md:px-6 lg:px-8 py-8 md:py-12 lg:py-16' : '';
11
+ const baseClasses = 'w-full';
12
+ export {};
13
+ </script>
14
+
15
+ <div class="{baseClasses} {sizeClasses[size]} {centeredClasses} {paddingClasses} {className}" {...restProps}>
16
+ {@render children?.()}
17
+ </div>