ui-svelte 0.2.10 → 0.2.12

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 (206) hide show
  1. package/dist/charts/ArcChart.svelte +9 -13
  2. package/dist/charts/ArcChart.svelte.d.ts +3 -3
  3. package/dist/charts/AreaChart.svelte +347 -118
  4. package/dist/charts/AreaChart.svelte.d.ts +33 -4
  5. package/dist/charts/BarChart.svelte +288 -66
  6. package/dist/charts/BarChart.svelte.d.ts +26 -1
  7. package/dist/charts/Candlestick.svelte +53 -50
  8. package/dist/charts/Candlestick.svelte.d.ts +8 -8
  9. package/dist/charts/LineChart.svelte +391 -91
  10. package/dist/charts/LineChart.svelte.d.ts +26 -3
  11. package/dist/charts/PieChart.svelte +333 -92
  12. package/dist/charts/PieChart.svelte.d.ts +33 -5
  13. package/dist/charts/css/arc-chart.css +3 -3
  14. package/dist/charts/css/area-chart.css +127 -29
  15. package/dist/charts/css/bar-chart.css +114 -8
  16. package/dist/charts/css/candlestick.css +2 -0
  17. package/dist/charts/css/line-chart.css +111 -13
  18. package/dist/charts/css/pie-chart.css +92 -20
  19. package/dist/control/Audio.svelte +86 -44
  20. package/dist/control/Audio.svelte.d.ts +4 -1
  21. package/dist/control/Button.svelte +18 -27
  22. package/dist/control/Button.svelte.d.ts +3 -2
  23. package/dist/control/IconButton.svelte +17 -27
  24. package/dist/control/IconButton.svelte.d.ts +3 -3
  25. package/dist/control/Image.svelte +123 -0
  26. package/dist/control/Image.svelte.d.ts +13 -0
  27. package/dist/control/Record.svelte +144 -98
  28. package/dist/control/Record.svelte.d.ts +2 -1
  29. package/dist/control/ToggleGroup.svelte +22 -8
  30. package/dist/control/ToggleGroup.svelte.d.ts +2 -1
  31. package/dist/control/ToggleTheme.svelte +13 -11
  32. package/dist/control/ToggleTheme.svelte.d.ts +3 -2
  33. package/dist/control/Video.svelte +55 -29
  34. package/dist/control/Video.svelte.d.ts +1 -0
  35. package/dist/control/css/btn.css +200 -152
  36. package/dist/control/css/image.css +56 -0
  37. package/dist/control/css/media.css +95 -30
  38. package/dist/control/css/toggle-group.css +269 -84
  39. package/dist/control/css/video.css +1 -14
  40. package/dist/css/animations.css +427 -2
  41. package/dist/css/base.css +13 -347
  42. package/dist/css/decorations.css +402 -0
  43. package/dist/css/rich-text.css +485 -0
  44. package/dist/css/transitions.css +158 -0
  45. package/dist/css/typography.css +291 -0
  46. package/dist/display/Accordion.svelte +28 -4
  47. package/dist/display/Accordion.svelte.d.ts +2 -1
  48. package/dist/display/Alert.svelte +32 -12
  49. package/dist/display/Alert.svelte.d.ts +2 -3
  50. package/dist/display/Avatar.svelte +54 -26
  51. package/dist/display/Avatar.svelte.d.ts +7 -1
  52. package/dist/display/AvatarGroup.svelte +26 -18
  53. package/dist/display/AvatarGroup.svelte.d.ts +9 -3
  54. package/dist/display/Badge.svelte +11 -4
  55. package/dist/display/Badge.svelte.d.ts +2 -1
  56. package/dist/display/Card.svelte +15 -14
  57. package/dist/display/Card.svelte.d.ts +2 -3
  58. package/dist/display/Carousel.svelte +130 -99
  59. package/dist/display/Carousel.svelte.d.ts +6 -4
  60. package/dist/display/ChatBox.svelte +245 -106
  61. package/dist/display/ChatBox.svelte.d.ts +32 -5
  62. package/dist/display/Chip.svelte +31 -17
  63. package/dist/display/Chip.svelte.d.ts +3 -2
  64. package/dist/display/Code.svelte +6 -3
  65. package/dist/display/Code.svelte.d.ts +1 -0
  66. package/dist/display/Collapsible.svelte +30 -4
  67. package/dist/display/Collapsible.svelte.d.ts +2 -1
  68. package/dist/display/Empty.svelte +37 -3
  69. package/dist/display/Empty.svelte.d.ts +3 -0
  70. package/dist/display/Item.svelte +31 -18
  71. package/dist/display/Item.svelte.d.ts +2 -2
  72. package/dist/display/Map.svelte +488 -0
  73. package/dist/display/Map.svelte.d.ts +44 -0
  74. package/dist/display/Section.svelte +14 -12
  75. package/dist/display/Section.svelte.d.ts +2 -3
  76. package/dist/display/Skeleton.svelte +32 -0
  77. package/dist/display/Skeleton.svelte.d.ts +10 -0
  78. package/dist/display/Table.svelte +94 -132
  79. package/dist/display/Table.svelte.d.ts +10 -1
  80. package/dist/display/css/accordion.css +349 -52
  81. package/dist/display/css/alert.css +18 -25
  82. package/dist/display/css/avatar-group.css +38 -44
  83. package/dist/display/css/avatar.css +152 -123
  84. package/dist/display/css/badge.css +50 -27
  85. package/dist/display/css/card.css +51 -71
  86. package/dist/display/css/carousel.css +25 -5
  87. package/dist/display/css/chat-box.css +158 -26
  88. package/dist/display/css/chip.css +142 -68
  89. package/dist/display/css/code.css +2 -6
  90. package/dist/display/css/collapsible.css +349 -45
  91. package/dist/display/css/divider.css +8 -6
  92. package/dist/display/css/empty.css +7 -0
  93. package/dist/display/css/item.css +311 -89
  94. package/dist/display/css/map.css +164 -0
  95. package/dist/display/css/section.css +78 -33
  96. package/dist/display/css/skeleton.css +58 -0
  97. package/dist/display/css/table.css +320 -189
  98. package/dist/form/Checkbox.svelte +11 -5
  99. package/dist/form/Checkbox.svelte.d.ts +2 -1
  100. package/dist/form/ColorField.svelte +543 -0
  101. package/dist/form/ColorField.svelte.d.ts +29 -0
  102. package/dist/form/ComboBox.svelte +24 -9
  103. package/dist/form/ComboBox.svelte.d.ts +2 -2
  104. package/dist/form/CsvField.svelte +62 -136
  105. package/dist/form/CsvField.svelte.d.ts +2 -2
  106. package/dist/form/DateField.svelte +33 -15
  107. package/dist/form/DateField.svelte.d.ts +2 -1
  108. package/dist/form/DateRange.svelte +436 -0
  109. package/dist/form/DateRange.svelte.d.ts +24 -0
  110. package/dist/form/DragDrop.svelte +348 -0
  111. package/dist/form/DragDrop.svelte.d.ts +32 -0
  112. package/dist/form/Dropzone.svelte +28 -8
  113. package/dist/form/Dropzone.svelte.d.ts +2 -2
  114. package/dist/form/Editor.svelte +626 -0
  115. package/dist/form/Editor.svelte.d.ts +50 -0
  116. package/dist/form/ImageCropper.svelte +291 -61
  117. package/dist/form/ImageCropper.svelte.d.ts +15 -1
  118. package/dist/form/PasswordField.svelte +120 -75
  119. package/dist/form/PasswordField.svelte.d.ts +9 -10
  120. package/dist/form/PhoneField.svelte +34 -16
  121. package/dist/form/PhoneField.svelte.d.ts +4 -3
  122. package/dist/form/PinField.svelte +39 -31
  123. package/dist/form/PinField.svelte.d.ts +3 -3
  124. package/dist/form/RadioGroup.svelte +4 -4
  125. package/dist/form/RadioGroup.svelte.d.ts +1 -1
  126. package/dist/form/Select.svelte +20 -19
  127. package/dist/form/Select.svelte.d.ts +2 -2
  128. package/dist/form/Slider.svelte +4 -2
  129. package/dist/form/Slider.svelte.d.ts +1 -0
  130. package/dist/form/TextField.svelte +16 -7
  131. package/dist/form/TextField.svelte.d.ts +2 -2
  132. package/dist/form/Textarea.svelte +15 -6
  133. package/dist/form/Textarea.svelte.d.ts +2 -2
  134. package/dist/form/Toggle.svelte +11 -1
  135. package/dist/form/Toggle.svelte.d.ts +2 -0
  136. package/dist/form/css/checkbox.css +18 -2
  137. package/dist/form/css/color-field.css +141 -0
  138. package/dist/form/css/control.css +193 -82
  139. package/dist/form/css/csv-field.css +226 -0
  140. package/dist/form/css/date-range.css +122 -0
  141. package/dist/form/css/date.css +24 -2
  142. package/dist/form/css/drag-drop.css +271 -0
  143. package/dist/form/css/dropzone.css +153 -34
  144. package/dist/form/css/editor.css +367 -0
  145. package/dist/form/css/field.css +4 -0
  146. package/dist/form/css/image-cropper.css +223 -22
  147. package/dist/form/css/password.css +1 -1
  148. package/dist/form/css/radio-group.css +1 -1
  149. package/dist/form/css/select.css +2 -2
  150. package/dist/form/css/slider.css +1 -0
  151. package/dist/form/css/textarea.css +178 -75
  152. package/dist/form/css/toggle.css +11 -2
  153. package/dist/hooks/use-table.svelte.d.ts +1 -0
  154. package/dist/hooks/use-table.svelte.js +6 -0
  155. package/dist/icons/index.d.ts +38 -2
  156. package/dist/icons/index.js +40 -4
  157. package/dist/index.css +16 -1
  158. package/dist/index.d.ts +11 -3
  159. package/dist/index.js +10 -2
  160. package/dist/layout/AppBar.svelte +22 -14
  161. package/dist/layout/AppBar.svelte.d.ts +2 -1
  162. package/dist/layout/Footer.svelte +19 -11
  163. package/dist/layout/Footer.svelte.d.ts +2 -1
  164. package/dist/layout/Provider.svelte +27 -4
  165. package/dist/layout/Provider.svelte.d.ts +3 -1
  166. package/dist/layout/css/app-bar.css +63 -66
  167. package/dist/layout/css/footer.css +62 -65
  168. package/dist/navigation/BottomNav.svelte +41 -13
  169. package/dist/navigation/FooterGroup.svelte +1 -1
  170. package/dist/navigation/NavMenu.svelte +47 -23
  171. package/dist/navigation/NavMenu.svelte.d.ts +29 -0
  172. package/dist/navigation/Pagination.svelte +158 -0
  173. package/dist/navigation/Pagination.svelte.d.ts +18 -0
  174. package/dist/navigation/SideNav.svelte +30 -25
  175. package/dist/navigation/SideNav.svelte.d.ts +2 -3
  176. package/dist/navigation/Tabs.svelte +17 -7
  177. package/dist/navigation/Tabs.svelte.d.ts +2 -2
  178. package/dist/navigation/css/bottom-nav.css +279 -257
  179. package/dist/navigation/css/footer-group.css +1 -1
  180. package/dist/navigation/css/footer-nav.css +1 -1
  181. package/dist/navigation/css/nav-menu.css +332 -106
  182. package/dist/navigation/css/pagination.css +74 -0
  183. package/dist/navigation/css/side-nav.css +515 -75
  184. package/dist/navigation/css/tabs.css +246 -52
  185. package/dist/overlay/Command.svelte +340 -0
  186. package/dist/overlay/Command.svelte.d.ts +24 -25
  187. package/dist/overlay/Drawer.svelte +49 -21
  188. package/dist/overlay/Drawer.svelte.d.ts +2 -2
  189. package/dist/overlay/Dropdown.svelte +4 -5
  190. package/dist/overlay/Modal.svelte +51 -16
  191. package/dist/overlay/Modal.svelte.d.ts +3 -3
  192. package/dist/overlay/Toast.svelte +41 -17
  193. package/dist/overlay/Toast.svelte.d.ts +1 -1
  194. package/dist/overlay/Tooltip.svelte +40 -26
  195. package/dist/overlay/Tooltip.svelte.d.ts +2 -2
  196. package/dist/overlay/css/command.css +80 -0
  197. package/dist/overlay/css/drawer.css +63 -24
  198. package/dist/overlay/css/dropdown.css +1 -1
  199. package/dist/overlay/css/hovercard.css +1 -1
  200. package/dist/overlay/css/modal.css +27 -27
  201. package/dist/overlay/css/toast.css +17 -29
  202. package/dist/overlay/css/tooltip.css +83 -66
  203. package/dist/stores/theme.svelte.js +26 -1
  204. package/dist/stores/toast.svelte.d.ts +4 -4
  205. package/dist/stores/toast.svelte.js +2 -2
  206. package/package.json +1 -1
@@ -12,15 +12,7 @@
12
12
  startClass?: string;
13
13
  centerClass?: string;
14
14
  endClass?: string;
15
- isBlurred?: boolean;
16
- isBordered?: boolean;
17
- borderOnScrollOnly?: boolean;
18
- hideOnScroll?: boolean;
19
- solidOnScroll?: boolean;
20
- isSticky?: boolean;
21
- isFloating?: boolean;
22
- isBoxed?: boolean;
23
- variant?:
15
+ color?:
24
16
  | 'primary'
25
17
  | 'secondary'
26
18
  | 'muted'
@@ -29,7 +21,16 @@
29
21
  | 'warning'
30
22
  | 'danger'
31
23
  | 'surface'
32
- | 'ghost';
24
+ | 'default';
25
+ variant?: 'solid' | 'soft';
26
+ isBlurred?: boolean;
27
+ isBordered?: boolean;
28
+ borderOnScrollOnly?: boolean;
29
+ hideOnScroll?: boolean;
30
+ solidOnScroll?: boolean;
31
+ isSticky?: boolean;
32
+ isFloating?: boolean;
33
+ isBoxed?: boolean;
33
34
  };
34
35
 
35
36
  const {
@@ -41,12 +42,13 @@
41
42
  startClass,
42
43
  centerClass,
43
44
  endClass,
45
+ color = 'default',
46
+ variant = 'soft',
44
47
  isBordered,
45
48
  borderOnScrollOnly = false,
46
49
  isBlurred,
47
50
  isSticky,
48
51
  isBoxed,
49
- variant = 'ghost',
50
52
  hideOnScroll,
51
53
  solidOnScroll = false,
52
54
  isFloating = false
@@ -59,7 +61,7 @@
59
61
 
60
62
  const scroll = useScroll();
61
63
 
62
- const variantClasses = {
64
+ const colors = {
63
65
  primary: 'is-primary',
64
66
  secondary: 'is-secondary',
65
67
  muted: 'is-muted',
@@ -68,7 +70,12 @@
68
70
  warning: 'is-warning',
69
71
  danger: 'is-danger',
70
72
  surface: 'is-surface',
71
- ghost: 'is-ghost'
73
+ default: 'is-default'
74
+ };
75
+
76
+ const variants = {
77
+ solid: 'is-solid',
78
+ soft: 'is-soft'
72
79
  };
73
80
 
74
81
  $effect(() => {
@@ -108,7 +115,8 @@
108
115
  bind:this={headerElement}
109
116
  class={cn(
110
117
  'appbar',
111
- variantClasses[variant],
118
+ colors[color],
119
+ variants[variant],
112
120
  shouldShowBorder && 'is-bordered',
113
121
  shouldBlur && 'is-blurred',
114
122
  isHidden && 'is-hidden',
@@ -8,6 +8,8 @@ type Props = {
8
8
  startClass?: string;
9
9
  centerClass?: string;
10
10
  endClass?: string;
11
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'warning' | 'danger' | 'surface' | 'default';
12
+ variant?: 'solid' | 'soft';
11
13
  isBlurred?: boolean;
12
14
  isBordered?: boolean;
13
15
  borderOnScrollOnly?: boolean;
@@ -16,7 +18,6 @@ type Props = {
16
18
  isSticky?: boolean;
17
19
  isFloating?: boolean;
18
20
  isBoxed?: boolean;
19
- variant?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'warning' | 'danger' | 'surface' | 'ghost';
20
21
  };
21
22
  declare const AppBar: import("svelte").Component<Props, {}, "">;
22
23
  type AppBar = ReturnType<typeof AppBar>;
@@ -12,11 +12,7 @@
12
12
  startClass?: string;
13
13
  centerClass?: string;
14
14
  endClass?: string;
15
- isBlurred?: boolean;
16
- isBordered?: boolean;
17
- isBoxed?: boolean;
18
- hideOnScroll?: boolean;
19
- variant?:
15
+ color?:
20
16
  | 'primary'
21
17
  | 'secondary'
22
18
  | 'muted'
@@ -25,7 +21,12 @@
25
21
  | 'warning'
26
22
  | 'danger'
27
23
  | 'surface'
28
- | 'ghost';
24
+ | 'default';
25
+ variant?: 'solid' | 'soft';
26
+ isBlurred?: boolean;
27
+ isBordered?: boolean;
28
+ isBoxed?: boolean;
29
+ hideOnScroll?: boolean;
29
30
  };
30
31
 
31
32
  const {
@@ -37,11 +38,12 @@
37
38
  startClass,
38
39
  centerClass,
39
40
  endClass,
41
+ color = 'default',
42
+ variant = 'soft',
40
43
  isBordered,
41
44
  isBlurred,
42
45
  isBoxed,
43
- hideOnScroll,
44
- variant = 'ghost'
46
+ hideOnScroll
45
47
  }: Props = $props();
46
48
 
47
49
  let footerElement = $state<HTMLElement | null>(null);
@@ -51,7 +53,7 @@
51
53
 
52
54
  const scroll = useScroll();
53
55
 
54
- const variantClasses = {
56
+ const colors = {
55
57
  primary: 'is-primary',
56
58
  secondary: 'is-secondary',
57
59
  muted: 'is-muted',
@@ -60,7 +62,12 @@
60
62
  warning: 'is-warning',
61
63
  danger: 'is-danger',
62
64
  surface: 'is-surface',
63
- ghost: 'is-ghost'
65
+ default: 'is-default'
66
+ };
67
+
68
+ const variants = {
69
+ solid: 'is-solid',
70
+ soft: 'is-soft'
64
71
  };
65
72
 
66
73
  $effect(() => {
@@ -93,7 +100,8 @@
93
100
  bind:this={footerElement}
94
101
  class={cn(
95
102
  'footer',
96
- variantClasses[variant],
103
+ colors[color],
104
+ variants[variant],
97
105
  isBordered && 'is-bordered',
98
106
  shouldBlur && 'is-blurred',
99
107
  isHidden && 'is-hidden',
@@ -8,11 +8,12 @@ type Props = {
8
8
  startClass?: string;
9
9
  centerClass?: string;
10
10
  endClass?: string;
11
+ color?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'warning' | 'danger' | 'surface' | 'default';
12
+ variant?: 'solid' | 'soft';
11
13
  isBlurred?: boolean;
12
14
  isBordered?: boolean;
13
15
  isBoxed?: boolean;
14
16
  hideOnScroll?: boolean;
15
- variant?: 'primary' | 'secondary' | 'muted' | 'success' | 'info' | 'warning' | 'danger' | 'surface' | 'ghost';
16
17
  };
17
18
  declare const Footer: import("svelte").Component<Props, {}, "">;
18
19
  type Footer = ReturnType<typeof Footer>;
@@ -5,22 +5,45 @@
5
5
 
6
6
  type Props = {
7
7
  children: Snippet;
8
- toastSolid?: boolean;
8
+ toastVariant?: 'solid' | 'soft';
9
9
  toastIcon?: boolean;
10
10
  toastPosition?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
11
+ themeTransition?: 'circle' | 'slide' | 'fade' | 'vertical' | 'none';
12
+ pageTransition?: 'fade' | 'slide' | 'scale' | 'none';
11
13
  };
12
14
 
13
- const { children, toastSolid, toastPosition, toastIcon }: Props = $props();
15
+ const {
16
+ children,
17
+ toastVariant,
18
+ toastPosition,
19
+ toastIcon,
20
+ themeTransition = 'circle',
21
+ pageTransition = 'fade'
22
+ }: Props = $props();
14
23
 
15
24
  onNavigate((navigation) => {
25
+ if (pageTransition === 'none') return;
16
26
  if (!document.startViewTransition) return;
17
27
  return new Promise((resolve) => {
18
- document.startViewTransition(async () => {
28
+ document.documentElement.classList.add('page-transitioning');
29
+ document.documentElement.setAttribute('data-page-transition', pageTransition);
30
+
31
+ const transition = document.startViewTransition(async () => {
19
32
  resolve();
20
33
  await navigation.complete;
21
34
  });
35
+
36
+ transition.finished.finally(() => {
37
+ document.documentElement.classList.remove('page-transitioning');
38
+ document.documentElement.removeAttribute('data-page-transition');
39
+ });
22
40
  });
23
41
  });
42
+ $effect(() => {
43
+ if (typeof document !== 'undefined') {
44
+ document.documentElement.setAttribute('data-theme-transition', themeTransition);
45
+ }
46
+ });
24
47
  </script>
25
48
 
26
49
  <svelte:head>
@@ -49,4 +72,4 @@
49
72
  </svelte:head>
50
73
 
51
74
  {@render children()}
52
- <Toast position={toastPosition} showIcon={toastIcon} isSolid={toastSolid} />
75
+ <Toast position={toastPosition} showIcon={toastIcon} variant={toastVariant} />
@@ -1,9 +1,11 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  type Props = {
3
3
  children: Snippet;
4
- toastSolid?: boolean;
4
+ toastVariant?: 'solid' | 'soft';
5
5
  toastIcon?: boolean;
6
6
  toastPosition?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
7
+ themeTransition?: 'circle' | 'slide' | 'fade' | 'vertical' | 'none';
8
+ pageTransition?: 'fade' | 'slide' | 'scale' | 'none';
7
9
  };
8
10
  declare const Provider: import("svelte").Component<Props, {}, "">;
9
11
  type Provider = ReturnType<typeof Provider>;
@@ -19,15 +19,15 @@
19
19
  }
20
20
 
21
21
  &.is-transparent {
22
- @apply bg-transparent border-transparent shadow-none;
22
+ @apply bg-transparent! border-transparent shadow-none;
23
23
  }
24
24
 
25
25
  &.is-floating-enabled {
26
- @apply left-1/2 -translate-x-1/2;
26
+ @apply fixed top-0 left-1/2 -translate-x-1/2;
27
27
  }
28
28
 
29
29
  &.is-floating {
30
- @apply mt-4 w-[calc(100%-2rem)] rounded-ui shadow-md shadow-muted border border-muted;
30
+ @apply mt-4 w-[calc(100%-2rem)] rounded-box shadow-md shadow-muted border border-muted;
31
31
  }
32
32
 
33
33
  &.is-floating-enabled:not(.is-floating) {
@@ -35,6 +35,66 @@
35
35
  @apply border-b border-muted;
36
36
  }
37
37
 
38
+ &.is-soft {
39
+ &.is-primary {
40
+ @apply bg-on-primary text-primary;
41
+ }
42
+ &.is-secondary {
43
+ @apply bg-on-secondary text-secondary;
44
+ }
45
+ &.is-muted {
46
+ @apply bg-muted text-on-muted;
47
+ }
48
+ &.is-success {
49
+ @apply bg-on-success text-success;
50
+ }
51
+ &.is-info {
52
+ @apply bg-on-info text-info;
53
+ }
54
+ &.is-warning {
55
+ @apply bg-on-warning text-warning;
56
+ }
57
+ &.is-danger {
58
+ @apply bg-on-danger text-danger;
59
+ }
60
+ &.is-default {
61
+ @apply bg-background text-on-background;
62
+ }
63
+ &.is-surface {
64
+ @apply bg-surface text-on-surface;
65
+ }
66
+ }
67
+
68
+ &.is-solid {
69
+ &.is-primary {
70
+ @apply bg-primary text-on-primary;
71
+ }
72
+ &.is-secondary {
73
+ @apply bg-secondary text-on-secondary;
74
+ }
75
+ &.is-muted {
76
+ @apply bg-on-muted text-muted;
77
+ }
78
+ &.is-success {
79
+ @apply bg-success text-on-success;
80
+ }
81
+ &.is-info {
82
+ @apply bg-info text-on-info;
83
+ }
84
+ &.is-warning {
85
+ @apply bg-warning text-on-warning;
86
+ }
87
+ &.is-danger {
88
+ @apply bg-danger text-on-danger;
89
+ }
90
+ &.is-default {
91
+ @apply bg-background text-on-background;
92
+ }
93
+ &.is-surface {
94
+ @apply bg-surface text-on-surface;
95
+ }
96
+ }
97
+
38
98
  .appbar-content {
39
99
  @apply flex flex-nowrap items-center justify-between relative;
40
100
  @apply w-full px-2 h-full min-h-12;
@@ -52,67 +112,4 @@
52
112
  }
53
113
  }
54
114
  }
55
- .appbar.is-primary {
56
- @apply bg-on-primary text-primary;
57
- }
58
-
59
- .appbar.is-primary.is-solid {
60
- @apply bg-primary text-on-primary;
61
- }
62
-
63
- .appbar.is-secondary {
64
- @apply bg-on-secondary text-secondary;
65
- }
66
-
67
- .appbar.is-secondary.is-solid {
68
- @apply bg-secondary text-on-secondary;
69
- }
70
-
71
- .appbar.is-success {
72
- @apply bg-on-success text-success;
73
- }
74
-
75
- .appbar.is-success.is-solid {
76
- @apply bg-success text-on-success;
77
- }
78
-
79
- .appbar.is-info {
80
- @apply bg-on-info text-info;
81
- }
82
-
83
- .appbar.is-info.is-solid {
84
- @apply bg-info text-on-info;
85
- }
86
-
87
- .appbar.is-warning {
88
- @apply bg-on-warning text-warning;
89
- }
90
-
91
- .appbar.is-warning.is-solid {
92
- @apply bg-warning text-on-warning;
93
- }
94
-
95
- .appbar.is-danger {
96
- @apply bg-on-danger text-danger;
97
- }
98
-
99
- .appbar.is-danger.is-solid {
100
- @apply bg-danger text-on-danger;
101
- }
102
-
103
- .appbar.is-muted {
104
- @apply bg-muted text-on-muted;
105
- }
106
-
107
- .appbar.is-muted.is-solid {
108
- @apply bg-on-muted text-muted;
109
- }
110
-
111
- .appbar.is-ghost {
112
- @apply bg-background text-on-background;
113
- }
114
-
115
- .appbar.is-surface {
116
- @apply bg-surface text-on-surface;
117
- }
118
115
  }
@@ -1,10 +1,10 @@
1
1
  @layer components {
2
2
  .footer {
3
- @apply w-full bg-background mt-auto;
3
+ @apply w-full mt-auto;
4
4
  @apply transition-all duration-300 ease-in-out;
5
5
 
6
6
  &.is-blurred {
7
- @apply backdrop-blur-lg bg-transparent;
7
+ @apply backdrop-blur-lg;
8
8
  }
9
9
 
10
10
  &.is-bordered {
@@ -15,6 +15,66 @@
15
15
  @apply translate-y-full;
16
16
  }
17
17
 
18
+ &.is-soft {
19
+ &.is-primary {
20
+ @apply bg-on-primary text-primary;
21
+ }
22
+ &.is-secondary {
23
+ @apply bg-on-secondary text-secondary;
24
+ }
25
+ &.is-muted {
26
+ @apply bg-muted text-on-muted;
27
+ }
28
+ &.is-success {
29
+ @apply bg-on-success text-success;
30
+ }
31
+ &.is-info {
32
+ @apply bg-on-info text-info;
33
+ }
34
+ &.is-warning {
35
+ @apply bg-on-warning text-warning;
36
+ }
37
+ &.is-danger {
38
+ @apply bg-on-danger text-danger;
39
+ }
40
+ &.is-default {
41
+ @apply bg-background text-on-background;
42
+ }
43
+ &.is-surface {
44
+ @apply bg-surface text-on-surface;
45
+ }
46
+ }
47
+
48
+ &.is-solid {
49
+ &.is-primary {
50
+ @apply bg-primary text-on-primary;
51
+ }
52
+ &.is-secondary {
53
+ @apply bg-secondary text-on-secondary;
54
+ }
55
+ &.is-muted {
56
+ @apply bg-on-muted text-muted;
57
+ }
58
+ &.is-success {
59
+ @apply bg-success text-on-success;
60
+ }
61
+ &.is-info {
62
+ @apply bg-info text-on-info;
63
+ }
64
+ &.is-warning {
65
+ @apply bg-warning text-on-warning;
66
+ }
67
+ &.is-danger {
68
+ @apply bg-danger text-on-danger;
69
+ }
70
+ &.is-default {
71
+ @apply bg-background text-on-background;
72
+ }
73
+ &.is-surface {
74
+ @apply bg-surface text-on-surface;
75
+ }
76
+ }
77
+
18
78
  .footer-content {
19
79
  @apply column md:row flex-nowrap items-center justify-between relative;
20
80
  @apply w-full px-2 h-full min-h-12;
@@ -32,67 +92,4 @@
32
92
  }
33
93
  }
34
94
  }
35
- .footer.is-primary {
36
- @apply bg-on-primary text-primary;
37
- }
38
-
39
- .footer.is-primary.is-solid {
40
- @apply bg-primary text-on-primary;
41
- }
42
-
43
- .footer.is-secondary {
44
- @apply bg-on-secondary text-secondary;
45
- }
46
-
47
- .footer.is-secondary.is-solid {
48
- @apply bg-secondary text-on-secondary;
49
- }
50
-
51
- .footer.is-success {
52
- @apply bg-on-success text-success;
53
- }
54
-
55
- .footer.is-success.is-solid {
56
- @apply bg-success text-on-success;
57
- }
58
-
59
- .footer.is-info {
60
- @apply bg-on-info text-info;
61
- }
62
-
63
- .footer.is-info.is-solid {
64
- @apply bg-info text-on-info;
65
- }
66
-
67
- .footer.is-warning {
68
- @apply bg-on-warning text-warning;
69
- }
70
-
71
- .footer.is-warning.is-solid {
72
- @apply bg-warning text-on-warning;
73
- }
74
-
75
- .footer.is-danger {
76
- @apply bg-on-danger text-danger;
77
- }
78
-
79
- .footer.is-danger.is-solid {
80
- @apply bg-danger text-on-danger;
81
- }
82
-
83
- .footer.is-muted {
84
- @apply bg-muted text-on-muted;
85
- }
86
-
87
- .footer.is-muted.is-solid {
88
- @apply bg-on-muted text-muted;
89
- }
90
-
91
- .footer.is-ghost {
92
- @apply bg-background text-on-background;
93
- }
94
-
95
- .footer.is-surface {
96
- @apply bg-surface text-on-surface;
97
- }
98
95
  }
@@ -16,27 +16,56 @@
16
16
 
17
17
  type Props = {
18
18
  items: BottomNavItem[];
19
- variant?: 'primary' | 'secondary' | 'ghost' | 'line';
19
+ color?:
20
+ | 'primary'
21
+ | 'secondary'
22
+ | 'muted'
23
+ | 'success'
24
+ | 'info'
25
+ | 'warning'
26
+ | 'danger'
27
+ | 'surface'
28
+ | 'default';
29
+ variant?: 'solid' | 'soft' | 'blur';
30
+ activeStyle?: 'line' | 'pill';
20
31
  size?: 'sm' | 'md' | 'lg';
21
- isSolid?: boolean;
22
32
  isBlock?: boolean;
33
+ isBordered?: boolean;
23
34
  class?: string;
24
35
  };
25
36
 
26
37
  const {
27
38
  items = [],
28
39
  class: className,
29
- variant = 'primary',
40
+ color = 'primary',
41
+ variant = 'soft',
42
+ activeStyle = 'line',
30
43
  size = 'md',
31
- isSolid = false,
32
- isBlock = false
44
+ isBlock = false,
45
+ isBordered = true
33
46
  }: Props = $props();
34
47
 
35
- const variantClasses = {
48
+ const colors = {
36
49
  primary: 'is-primary',
37
50
  secondary: 'is-secondary',
38
- ghost: 'is-ghost',
39
- line: 'is-line'
51
+ muted: 'is-muted',
52
+ success: 'is-success',
53
+ info: 'is-info',
54
+ warning: 'is-warning',
55
+ danger: 'is-danger',
56
+ surface: 'is-surface',
57
+ default: 'is-default'
58
+ };
59
+
60
+ const variants = {
61
+ solid: 'is-solid',
62
+ soft: 'is-soft',
63
+ blur: 'is-blur'
64
+ };
65
+
66
+ const activeStyles = {
67
+ line: 'active-line',
68
+ pill: 'active-pill'
40
69
  };
41
70
 
42
71
  const sizeClasses = {
@@ -45,13 +74,10 @@
45
74
  lg: 'is-lg'
46
75
  };
47
76
 
48
- // Determine if any item has a label
49
77
  const hasLabels = $derived(items.some((item) => item.label));
50
78
 
51
79
  function isItemActive(item: BottomNavItem): boolean {
52
- // If item has explicit isActive, use that
53
80
  if (item.isActive !== undefined) return item.isActive;
54
- // Otherwise check against current URL
55
81
  if (!item.href) return false;
56
82
  return page.url.pathname === item.href || page.url.pathname.startsWith(item.href + '/');
57
83
  }
@@ -66,11 +92,13 @@
66
92
  <nav
67
93
  class={cn(
68
94
  'bottomnav',
69
- variantClasses[variant],
95
+ colors[color],
96
+ variants[variant],
97
+ activeStyles[activeStyle],
70
98
  sizeClasses[size],
71
- isSolid && 'is-solid',
72
99
  !hasLabels && 'is-icon-only',
73
100
  !isBlock && 'is-fixed',
101
+ isBordered && 'is-bordered',
74
102
  className
75
103
  )}
76
104
  >
@@ -35,7 +35,7 @@
35
35
  >
36
36
  {link.label}
37
37
  {#if link.external}
38
- <span class="sr-only">(abre en nueva ventana)</span>
38
+ <span class="sr-only">(opens in new window)</span>
39
39
  {/if}
40
40
  </a>
41
41
  </li>