@noahbaumgartner/svelte-ui 0.0.4 → 0.0.6

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 (216) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +28 -13
  3. package/dist/components/accordion/Accordion.svelte +44 -0
  4. package/dist/components/accordion/Accordion.svelte.d.ts +13 -0
  5. package/dist/components/accordion/AccordionItem.svelte +145 -0
  6. package/dist/components/accordion/AccordionItem.svelte.d.ts +17 -0
  7. package/dist/components/accordion/context.d.ts +5 -0
  8. package/dist/components/accordion/context.js +2 -0
  9. package/dist/components/alert-dialog/AlertDialog.svelte +108 -76
  10. package/dist/components/alert-dialog/AlertDialog.svelte.d.ts +5 -2
  11. package/dist/components/avatar/Avatar.svelte +71 -49
  12. package/dist/components/avatar/Avatar.svelte.d.ts +5 -2
  13. package/dist/components/avatar-group/AvatarGroup.svelte +103 -0
  14. package/dist/components/avatar-group/AvatarGroup.svelte.d.ts +19 -0
  15. package/dist/components/badge/Badge.svelte +50 -28
  16. package/dist/components/badge/Badge.svelte.d.ts +6 -4
  17. package/dist/components/breadcrumb/Breadcrumb.svelte +21 -17
  18. package/dist/components/breadcrumb/Breadcrumb.svelte.d.ts +3 -1
  19. package/dist/components/breadcrumb/BreadcrumbEllipsis.svelte +17 -6
  20. package/dist/components/breadcrumb/BreadcrumbEllipsis.svelte.d.ts +5 -2
  21. package/dist/components/breadcrumb/BreadcrumbItem.svelte +75 -36
  22. package/dist/components/breadcrumb/BreadcrumbItem.svelte.d.ts +8 -5
  23. package/dist/components/breadcrumb/BreadcrumbSeparator.svelte +32 -9
  24. package/dist/components/breadcrumb/BreadcrumbSeparator.svelte.d.ts +10 -17
  25. package/dist/components/button/Button.svelte +206 -168
  26. package/dist/components/button/Button.svelte.d.ts +9 -5
  27. package/dist/components/button-group/ButtonGroup.svelte +52 -55
  28. package/dist/components/button-group/ButtonGroup.svelte.d.ts +3 -1
  29. package/dist/components/calendar/Calendar.svelte +232 -144
  30. package/dist/components/calendar/Calendar.svelte.d.ts +19 -2
  31. package/dist/components/calendar/dates.d.ts +4 -1
  32. package/dist/components/calendar/dates.js +8 -2
  33. package/dist/components/card/Card.svelte +48 -32
  34. package/dist/components/card/Card.svelte.d.ts +3 -1
  35. package/dist/components/card/CardAction.svelte +11 -7
  36. package/dist/components/card/CardAction.svelte.d.ts +3 -1
  37. package/dist/components/card/CardContent.svelte +8 -4
  38. package/dist/components/card/CardContent.svelte.d.ts +3 -1
  39. package/dist/components/card/CardDescription.svelte +11 -7
  40. package/dist/components/card/CardDescription.svelte.d.ts +3 -1
  41. package/dist/components/card/CardFooter.svelte +15 -11
  42. package/dist/components/card/CardFooter.svelte.d.ts +3 -1
  43. package/dist/components/card/CardHeader.svelte +15 -11
  44. package/dist/components/card/CardHeader.svelte.d.ts +3 -1
  45. package/dist/components/card/CardTitle.svelte +11 -7
  46. package/dist/components/card/CardTitle.svelte.d.ts +3 -1
  47. package/dist/components/checkbox/Checkbox.svelte +152 -61
  48. package/dist/components/checkbox/Checkbox.svelte.d.ts +5 -2
  49. package/dist/components/color-picker/ColorPicker.svelte +131 -78
  50. package/dist/components/color-picker/ColorPicker.svelte.d.ts +10 -1
  51. package/dist/components/context-menu/ContextMenu.svelte +78 -61
  52. package/dist/components/context-menu/ContextMenu.svelte.d.ts +5 -2
  53. package/dist/components/context-menu/ContextMenuInfo.svelte +91 -0
  54. package/dist/components/context-menu/ContextMenuInfo.svelte.d.ts +19 -0
  55. package/dist/components/context-menu/ContextMenuItem.svelte +102 -57
  56. package/dist/components/context-menu/ContextMenuItem.svelte.d.ts +10 -5
  57. package/dist/components/context-menu/ContextMenuLabel.svelte +28 -0
  58. package/dist/components/context-menu/ContextMenuLabel.svelte.d.ts +10 -0
  59. package/dist/components/context-menu/ContextMenuSeparator.svelte +29 -0
  60. package/dist/components/context-menu/ContextMenuSeparator.svelte.d.ts +8 -0
  61. package/dist/components/dialog/Dialog.svelte +149 -108
  62. package/dist/components/dialog/Dialog.svelte.d.ts +7 -2
  63. package/dist/components/drawer/Drawer.svelte +419 -0
  64. package/dist/components/drawer/Drawer.svelte.d.ts +28 -0
  65. package/dist/components/empty-state/EmptyState.svelte +106 -0
  66. package/dist/components/empty-state/EmptyState.svelte.d.ts +19 -0
  67. package/dist/components/entry/Entry.svelte +94 -0
  68. package/dist/components/entry/Entry.svelte.d.ts +16 -0
  69. package/dist/components/field/Field.svelte +66 -45
  70. package/dist/components/field/Field.svelte.d.ts +2 -1
  71. package/dist/components/field/FieldContent.svelte +11 -8
  72. package/dist/components/field/FieldContent.svelte.d.ts +2 -1
  73. package/dist/components/field/FieldDescription.svelte +18 -15
  74. package/dist/components/field/FieldDescription.svelte.d.ts +2 -1
  75. package/dist/components/field/FieldError.svelte +22 -13
  76. package/dist/components/field/FieldError.svelte.d.ts +2 -1
  77. package/dist/components/field/FieldGroup.svelte +15 -12
  78. package/dist/components/field/FieldGroup.svelte.d.ts +2 -1
  79. package/dist/components/field/FieldLegend.svelte +23 -14
  80. package/dist/components/field/FieldLegend.svelte.d.ts +2 -1
  81. package/dist/components/field/FieldSeparator.svelte +12 -9
  82. package/dist/components/field/FieldSeparator.svelte.d.ts +2 -1
  83. package/dist/components/field/FieldSet.svelte +18 -15
  84. package/dist/components/field/FieldSet.svelte.d.ts +2 -1
  85. package/dist/components/footer/Footer.svelte +105 -0
  86. package/dist/components/footer/Footer.svelte.d.ts +14 -0
  87. package/dist/components/footer/FooterColumn.svelte +37 -0
  88. package/dist/components/footer/FooterColumn.svelte.d.ts +11 -0
  89. package/dist/components/image/Image.svelte +61 -0
  90. package/dist/components/image/Image.svelte.d.ts +18 -0
  91. package/dist/components/input/Input.svelte +307 -208
  92. package/dist/components/input/Input.svelte.d.ts +12 -1
  93. package/dist/components/input-group/InputGroup.svelte +101 -61
  94. package/dist/components/input-group/InputGroup.svelte.d.ts +2 -1
  95. package/dist/components/input-group/InputGroupAddon.svelte +58 -49
  96. package/dist/components/kbd/Kbd.svelte +39 -30
  97. package/dist/components/kbd/Kbd.svelte.d.ts +2 -1
  98. package/dist/components/kbd/KbdGroup.svelte +15 -12
  99. package/dist/components/kbd/KbdGroup.svelte.d.ts +2 -1
  100. package/dist/components/label/Label.svelte +47 -28
  101. package/dist/components/label/Label.svelte.d.ts +2 -1
  102. package/dist/components/link/Link.svelte +71 -17
  103. package/dist/components/link/Link.svelte.d.ts +2 -1
  104. package/dist/components/mesh-gradient/MeshGradient.svelte +97 -0
  105. package/dist/components/mesh-gradient/MeshGradient.svelte.d.ts +11 -0
  106. package/dist/components/navbar/Navbar.svelte +137 -99
  107. package/dist/components/navbar/Navbar.svelte.d.ts +4 -2
  108. package/dist/components/navigation-menu/NavigationMenu.svelte +37 -20
  109. package/dist/components/navigation-menu/NavigationMenu.svelte.d.ts +4 -2
  110. package/dist/components/navigation-menu/NavigationMenuItem.svelte +131 -89
  111. package/dist/components/navigation-menu/NavigationMenuItem.svelte.d.ts +4 -2
  112. package/dist/components/navigation-menu/NavigationMenuLink.svelte +90 -51
  113. package/dist/components/navigation-menu/NavigationMenuLink.svelte.d.ts +7 -5
  114. package/dist/components/number-stepper/NumberStepper.svelte +101 -0
  115. package/dist/components/number-stepper/NumberStepper.svelte.d.ts +21 -0
  116. package/dist/components/popover/Popover.svelte +85 -65
  117. package/dist/components/popover/Popover.svelte.d.ts +5 -2
  118. package/dist/components/preview-card/PreviewCard.svelte +184 -0
  119. package/dist/components/preview-card/PreviewCard.svelte.d.ts +23 -0
  120. package/dist/components/progress/Progress.svelte +111 -0
  121. package/dist/components/progress/Progress.svelte.d.ts +13 -0
  122. package/dist/components/radio-group/RadioGroup.svelte +24 -19
  123. package/dist/components/radio-group/RadioGroup.svelte.d.ts +2 -1
  124. package/dist/components/radio-group/RadioGroupItem.svelte +101 -54
  125. package/dist/components/radio-group/RadioGroupItem.svelte.d.ts +2 -1
  126. package/dist/components/section/Section.svelte +114 -0
  127. package/dist/components/section/Section.svelte.d.ts +22 -0
  128. package/dist/components/select/Select.svelte +474 -0
  129. package/dist/components/select/Select.svelte.d.ts +48 -0
  130. package/dist/components/separator/Separator.svelte +21 -10
  131. package/dist/components/separator/Separator.svelte.d.ts +2 -1
  132. package/dist/components/sidebar/Sidebar.svelte +158 -87
  133. package/dist/components/sidebar/Sidebar.svelte.d.ts +6 -1
  134. package/dist/components/sidebar/SidebarContent.svelte +15 -12
  135. package/dist/components/sidebar/SidebarContent.svelte.d.ts +2 -1
  136. package/dist/components/sidebar/SidebarFooter.svelte +10 -7
  137. package/dist/components/sidebar/SidebarFooter.svelte.d.ts +2 -1
  138. package/dist/components/sidebar/SidebarGroup.svelte +35 -25
  139. package/dist/components/sidebar/SidebarGroup.svelte.d.ts +2 -1
  140. package/dist/components/sidebar/SidebarHeader.svelte +37 -8
  141. package/dist/components/sidebar/SidebarHeader.svelte.d.ts +6 -1
  142. package/dist/components/sidebar/SidebarInset.svelte +11 -8
  143. package/dist/components/sidebar/SidebarInset.svelte.d.ts +2 -1
  144. package/dist/components/sidebar/SidebarMenu.svelte +13 -10
  145. package/dist/components/sidebar/SidebarMenu.svelte.d.ts +2 -1
  146. package/dist/components/sidebar/SidebarMenuItem.svelte +195 -114
  147. package/dist/components/sidebar/SidebarMenuItem.svelte.d.ts +11 -5
  148. package/dist/components/sidebar/SidebarProvider.svelte +18 -9
  149. package/dist/components/sidebar/SidebarProvider.svelte.d.ts +2 -1
  150. package/dist/components/sidebar/SidebarSeparator.svelte +6 -1
  151. package/dist/components/sidebar/SidebarSeparator.svelte.d.ts +6 -17
  152. package/dist/components/sidebar/SidebarTrigger.svelte +17 -5
  153. package/dist/components/sidebar/SidebarTrigger.svelte.d.ts +4 -2
  154. package/dist/components/skeleton/Skeleton.svelte +26 -16
  155. package/dist/components/skeleton/Skeleton.svelte.d.ts +4 -2
  156. package/dist/components/spinner/Spinner.svelte +71 -46
  157. package/dist/components/spinner/Spinner.svelte.d.ts +2 -1
  158. package/dist/components/switch/Switch.svelte +126 -65
  159. package/dist/components/switch/Switch.svelte.d.ts +4 -2
  160. package/dist/components/table/Table.svelte +135 -76
  161. package/dist/components/table/Table.svelte.d.ts +12 -2
  162. package/dist/components/tabs/Tabs.svelte +337 -0
  163. package/dist/components/tabs/Tabs.svelte.d.ts +50 -0
  164. package/dist/components/textarea/Textarea.svelte +76 -42
  165. package/dist/components/textarea/Textarea.svelte.d.ts +4 -1
  166. package/dist/components/time-picker/TimePicker.svelte +214 -85
  167. package/dist/components/time-picker/TimePicker.svelte.d.ts +18 -1
  168. package/dist/components/toaster/Toaster.svelte +132 -70
  169. package/dist/components/toaster/Toaster.svelte.d.ts +18 -2
  170. package/dist/components/toaster/toast.svelte.d.ts +3 -3
  171. package/dist/components/toggle/Toggle.svelte +25 -4
  172. package/dist/components/toggle/Toggle.svelte.d.ts +1 -1
  173. package/dist/components/tooltip/Tooltip.svelte +87 -58
  174. package/dist/components/tooltip/Tooltip.svelte.d.ts +4 -2
  175. package/dist/icon.d.ts +12 -0
  176. package/dist/icon.js +1 -0
  177. package/dist/index.d.ts +21 -0
  178. package/dist/index.js +19 -0
  179. package/dist/internal/icons/ArrowDown.svelte +14 -0
  180. package/dist/internal/icons/ArrowDown.svelte.d.ts +4 -0
  181. package/dist/internal/icons/ArrowUp.svelte +14 -0
  182. package/dist/internal/icons/ArrowUp.svelte.d.ts +4 -0
  183. package/dist/internal/icons/Calendar.svelte +16 -0
  184. package/dist/internal/icons/Calendar.svelte.d.ts +4 -0
  185. package/dist/internal/icons/Check.svelte +8 -0
  186. package/dist/internal/icons/Check.svelte.d.ts +4 -0
  187. package/dist/internal/icons/ChevronDown.svelte +8 -0
  188. package/dist/internal/icons/ChevronDown.svelte.d.ts +4 -0
  189. package/dist/internal/icons/ChevronLeft.svelte +8 -0
  190. package/dist/internal/icons/ChevronLeft.svelte.d.ts +4 -0
  191. package/dist/internal/icons/ChevronRight.svelte +8 -0
  192. package/dist/internal/icons/ChevronRight.svelte.d.ts +4 -0
  193. package/dist/internal/icons/ChevronUp.svelte +8 -0
  194. package/dist/internal/icons/ChevronUp.svelte.d.ts +4 -0
  195. package/dist/internal/icons/ChevronsUpDown.svelte +14 -0
  196. package/dist/internal/icons/ChevronsUpDown.svelte.d.ts +4 -0
  197. package/dist/internal/icons/Clock.svelte +14 -0
  198. package/dist/internal/icons/Clock.svelte.d.ts +4 -0
  199. package/dist/internal/icons/Ellipsis.svelte +15 -0
  200. package/dist/internal/icons/Ellipsis.svelte.d.ts +4 -0
  201. package/dist/internal/icons/Icon.svelte +33 -0
  202. package/dist/internal/icons/Icon.svelte.d.ts +8 -0
  203. package/dist/internal/icons/Minus.svelte +8 -0
  204. package/dist/internal/icons/Minus.svelte.d.ts +4 -0
  205. package/dist/internal/icons/PanelLeft.svelte +14 -0
  206. package/dist/internal/icons/PanelLeft.svelte.d.ts +4 -0
  207. package/dist/internal/icons/Plus.svelte +14 -0
  208. package/dist/internal/icons/Plus.svelte.d.ts +4 -0
  209. package/dist/internal/icons/User.svelte +14 -0
  210. package/dist/internal/icons/User.svelte.d.ts +4 -0
  211. package/dist/internal/icons/X.svelte +14 -0
  212. package/dist/internal/icons/X.svelte.d.ts +4 -0
  213. package/dist/styles/tokens.css +39 -41
  214. package/package.json +5 -10
  215. package/dist/icons.d.ts +0 -2
  216. package/dist/icons.js +0 -4
@@ -1,27 +1,40 @@
1
1
  <script lang="ts">
2
+ import type { Snippet } from 'svelte';
2
3
  import type { HTMLAttributes } from 'svelte/elements';
3
- import { User } from '@lucide/svelte';
4
+ import User from '../../internal/icons/User.svelte';
4
5
 
5
6
  type Props = Omit<HTMLAttributes<HTMLSpanElement>, 'children'> & {
7
+ /** The root element. Bindable. */
8
+ ref?: HTMLSpanElement | null;
6
9
  src?: string;
7
10
  /** Describes the person; also the accessible name when the fallback is shown. */
8
11
  alt: string;
9
12
  /** Shown when there is no `src` or the image fails to load, e.g. initials. Defaults to a user icon. */
10
- fallback?: string;
13
+ fallback?: string | Snippet;
11
14
  size?: 'sm' | 'md' | 'lg';
12
15
  };
13
16
 
14
- let { src, alt, fallback, size = 'md', class: className, ...rest }: Props = $props();
17
+ let {
18
+ ref = $bindable(null),
19
+ src,
20
+ alt,
21
+ fallback,
22
+ size = 'md',
23
+ class: className,
24
+ ...rest
25
+ }: Props = $props();
15
26
 
16
27
  let failedSrc = $state<string>();
17
28
  </script>
18
29
 
19
- <span {...rest} class={['avatar', `avatar--${size}`, className]}>
30
+ <span {...rest} bind:this={ref} class={['avatar', `avatar--${size}`, className]}>
20
31
  {#if src && src !== failedSrc}
21
32
  <img class="avatar-image" {src} {alt} onerror={() => (failedSrc = src)} />
22
33
  {:else}
23
34
  <span class="avatar-fallback" role="img" aria-label={alt}>
24
- {#if fallback}
35
+ {#if typeof fallback === 'function'}
36
+ {@render fallback()}
37
+ {:else if fallback}
25
38
  {fallback}
26
39
  {:else}
27
40
  <User class="avatar-icon" aria-hidden="true" />
@@ -31,55 +44,64 @@
31
44
  </span>
32
45
 
33
46
  <style>
34
- .avatar {
35
- display: inline-flex;
36
- flex-shrink: 0;
37
- overflow: hidden;
38
- background-color: var(--color-surface);
39
- color: var(--color-text-secondary);
40
- user-select: none;
41
- }
47
+ @layer svelte-ui {
48
+ .avatar {
49
+ display: inline-flex;
50
+ flex-shrink: 0;
51
+ overflow: hidden;
52
+ background-color: var(--color-surface);
53
+ color: var(--color-text-secondary);
54
+ user-select: none;
55
+ }
42
56
 
43
- .avatar--sm {
44
- width: 24px;
45
- height: 24px;
46
- border-radius: 8px;
47
- font-size: 10px;
48
- }
57
+ .avatar--sm {
58
+ width: 24px;
59
+ height: 24px;
60
+ border-radius: 8px;
61
+ font-size: 10px;
62
+ }
49
63
 
50
- .avatar--md {
51
- width: 32px;
52
- height: 32px;
53
- border-radius: 10px;
54
- font-size: 12px;
55
- }
64
+ .avatar--md {
65
+ width: 32px;
66
+ height: 32px;
67
+ border-radius: 10px;
68
+ font-size: 12px;
69
+ }
56
70
 
57
- .avatar--lg {
58
- width: 40px;
59
- height: 40px;
60
- border-radius: 12px;
61
- font-size: 14px;
62
- }
71
+ .avatar--lg {
72
+ width: 40px;
73
+ height: 40px;
74
+ border-radius: 12px;
75
+ font-size: 14px;
76
+ }
63
77
 
64
- .avatar-image {
65
- width: 100%;
66
- height: 100%;
67
- object-fit: cover;
68
- }
78
+ .avatar-image {
79
+ width: 100%;
80
+ height: 100%;
81
+ object-fit: cover;
82
+ }
69
83
 
70
- .avatar-fallback {
71
- display: flex;
72
- align-items: center;
73
- justify-content: center;
74
- width: 100%;
75
- height: 100%;
76
- font-family: inherit;
77
- font-weight: 500;
78
- text-transform: uppercase;
79
- }
84
+ .avatar-fallback {
85
+ display: flex;
86
+ align-items: center;
87
+ justify-content: center;
88
+ width: 100%;
89
+ height: 100%;
90
+ font-family: inherit;
91
+ font-weight: 500;
92
+ text-transform: uppercase;
93
+ }
94
+
95
+ .avatar-fallback :global(.avatar-icon) {
96
+ width: 60%;
97
+ height: 60%;
98
+ }
80
99
 
81
- .avatar-fallback :global(.avatar-icon) {
82
- width: 60%;
83
- height: 60%;
100
+ @media (forced-colors: active) {
101
+ .avatar {
102
+ border: 1px solid CanvasText;
103
+ box-sizing: border-box;
104
+ }
105
+ }
84
106
  }
85
107
  </style>
@@ -1,12 +1,15 @@
1
+ import type { Snippet } from 'svelte';
1
2
  import type { HTMLAttributes } from 'svelte/elements';
2
3
  type Props = Omit<HTMLAttributes<HTMLSpanElement>, 'children'> & {
4
+ /** The root element. Bindable. */
5
+ ref?: HTMLSpanElement | null;
3
6
  src?: string;
4
7
  /** Describes the person; also the accessible name when the fallback is shown. */
5
8
  alt: string;
6
9
  /** Shown when there is no `src` or the image fails to load, e.g. initials. Defaults to a user icon. */
7
- fallback?: string;
10
+ fallback?: string | Snippet;
8
11
  size?: 'sm' | 'md' | 'lg';
9
12
  };
10
- declare const Avatar: import("svelte").Component<Props, {}, "">;
13
+ declare const Avatar: import("svelte").Component<Props, {}, "ref">;
11
14
  type Avatar = ReturnType<typeof Avatar>;
12
15
  export default Avatar;
@@ -0,0 +1,103 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import type { HTMLAttributes } from 'svelte/elements';
4
+
5
+ type Props = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
6
+ /** The root element. Bindable. */
7
+ ref?: HTMLDivElement | null;
8
+ /** Accessible name for the group, e.g. "Members". */
9
+ label?: string;
10
+ /** How many more there are than the Avatars shown; rendered as "+3" at the end. */
11
+ more?: number;
12
+ /** Size of the "+3"; match it to the Avatars' `size`. */
13
+ size?: 'sm' | 'md' | 'lg';
14
+ /** Replaces the "+3" content, given the `more` count. */
15
+ overflow?: Snippet<[count: number]>;
16
+ /** Avatars, overlapping each other. */
17
+ children: Snippet;
18
+ };
19
+
20
+ let {
21
+ ref = $bindable(null),
22
+ label,
23
+ more = 0,
24
+ size = 'md',
25
+ overflow,
26
+ class: className,
27
+ children,
28
+ ...rest
29
+ }: Props = $props();
30
+ </script>
31
+
32
+ <div {...rest} bind:this={ref} role="group" aria-label={label} class={['avatar-group', className]}>
33
+ {@render children()}
34
+ {#if more > 0}
35
+ <span class={['avatar-group-more', `avatar-group-more--${size}`]}>
36
+ {#if overflow}{@render overflow(more)}{:else}+{more}{/if}
37
+ </span>
38
+ {/if}
39
+ </div>
40
+
41
+ <style>
42
+ @layer svelte-ui {
43
+ .avatar-group {
44
+ display: inline-flex;
45
+ align-items: center;
46
+ }
47
+
48
+ /* The ring in the page colour separates the overlapping avatars */
49
+ .avatar-group > :global(*) {
50
+ box-shadow: 0 0 0 2px var(--color-bg);
51
+ }
52
+
53
+ .avatar-group > :global(:not(:first-child)) {
54
+ margin-inline-start: -6px;
55
+ }
56
+
57
+ .avatar-group-more {
58
+ display: inline-flex;
59
+ align-items: center;
60
+ justify-content: center;
61
+ box-sizing: border-box;
62
+ flex-shrink: 0;
63
+ padding: 0 6px;
64
+ font-weight: 500;
65
+ font-variant-numeric: tabular-nums;
66
+ color: var(--color-text-secondary);
67
+ background-color: var(--color-surface);
68
+ user-select: none;
69
+ }
70
+
71
+ /* Same sizes and corners as Avatar */
72
+ .avatar-group-more--sm {
73
+ min-width: 24px;
74
+ height: 24px;
75
+ border-radius: 8px;
76
+ font-size: 10px;
77
+ }
78
+
79
+ .avatar-group-more--md {
80
+ min-width: 32px;
81
+ height: 32px;
82
+ border-radius: 10px;
83
+ font-size: 12px;
84
+ }
85
+
86
+ .avatar-group-more--lg {
87
+ min-width: 40px;
88
+ height: 40px;
89
+ border-radius: 12px;
90
+ font-size: 14px;
91
+ }
92
+
93
+ @media (forced-colors: active) {
94
+ .avatar-group > :global(*) {
95
+ outline: 2px solid Canvas;
96
+ }
97
+
98
+ .avatar-group-more {
99
+ border: 1px solid CanvasText;
100
+ }
101
+ }
102
+ }
103
+ </style>
@@ -0,0 +1,19 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ type Props = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {
4
+ /** The root element. Bindable. */
5
+ ref?: HTMLDivElement | null;
6
+ /** Accessible name for the group, e.g. "Members". */
7
+ label?: string;
8
+ /** How many more there are than the Avatars shown; rendered as "+3" at the end. */
9
+ more?: number;
10
+ /** Size of the "+3"; match it to the Avatars' `size`. */
11
+ size?: 'sm' | 'md' | 'lg';
12
+ /** Replaces the "+3" content, given the `more` count. */
13
+ overflow?: Snippet<[count: number]>;
14
+ /** Avatars, overlapping each other. */
15
+ children: Snippet;
16
+ };
17
+ declare const AvatarGroup: import("svelte").Component<Props, {}, "ref">;
18
+ type AvatarGroup = ReturnType<typeof AvatarGroup>;
19
+ export default AvatarGroup;
@@ -1,49 +1,71 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
3
  import type { HTMLAttributes } from 'svelte/elements';
4
- import type { LucideIcon } from '@lucide/svelte';
4
+ import type { IconComponent } from '../../icon.js';
5
5
 
6
6
  type Props = Omit<HTMLAttributes<HTMLSpanElement>, 'children'> & {
7
+ /** The root element. Bindable. */
8
+ ref?: HTMLSpanElement | null;
7
9
  variant?: 'primary' | 'secondary';
8
- /** Any Lucide icon (import from `svelte-ui/icons`). */
9
- icon?: LucideIcon;
10
+ /** Any icon component, e.g. from `@lucide/svelte`. */
11
+ icon?: IconComponent;
10
12
  children: Snippet;
11
13
  };
12
14
 
13
- let { variant = 'secondary', icon: Icon, class: className, children, ...rest }: Props = $props();
15
+ let {
16
+ ref = $bindable(null),
17
+ variant = 'secondary',
18
+ icon: Icon,
19
+ class: className,
20
+ children,
21
+ ...rest
22
+ }: Props = $props();
14
23
  </script>
15
24
 
16
- <span {...rest} class={['badge', `badge--${variant}`, className]}>
25
+ <span {...rest} bind:this={ref} class={['badge', `badge--${variant}`, className]}>
17
26
  {#if Icon}<Icon class="badge-icon" aria-hidden="true" />{/if}
18
27
  {@render children()}
19
28
  </span>
20
29
 
21
30
  <style>
22
- .badge {
23
- display: inline-flex;
24
- align-items: center;
25
- gap: 4px;
26
- width: fit-content;
27
- padding: 2px 8px;
28
- font-family: inherit;
29
- font-size: 12px;
30
- border-radius: 6px;
31
- user-select: none;
32
- }
31
+ @layer svelte-ui {
32
+ .badge {
33
+ display: inline-flex;
34
+ align-items: center;
35
+ gap: 4px;
36
+ width: fit-content;
37
+ padding: 2px 8px;
38
+ font-family: inherit;
39
+ font-size: 12px;
40
+ border-radius: 6px;
41
+ user-select: none;
42
+ }
33
43
 
34
- .badge--primary {
35
- background-color: var(--color-accent);
36
- color: var(--color-accent-foreground);
37
- }
44
+ .badge--primary {
45
+ background-color: var(--color-accent);
46
+ color: var(--color-accent-foreground);
47
+ }
38
48
 
39
- .badge--secondary {
40
- background-color: var(--color-surface);
41
- color: var(--color-text);
42
- }
49
+ .badge--secondary {
50
+ background-color: var(--color-surface);
51
+ color: var(--color-text);
52
+ }
53
+
54
+ .badge :global(.badge-icon) {
55
+ width: 12px;
56
+ height: 12px;
57
+ flex-shrink: 0;
58
+ }
59
+
60
+ @media (forced-colors: active) {
61
+ .badge {
62
+ border: 1px solid ButtonText;
63
+ }
43
64
 
44
- .badge :global(.badge-icon) {
45
- width: 12px;
46
- height: 12px;
47
- flex-shrink: 0;
65
+ .badge--primary {
66
+ border-color: Highlight;
67
+ border-width: 2px;
68
+ }
69
+ }
48
70
  }
49
71
  </style>
@@ -1,12 +1,14 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { HTMLAttributes } from 'svelte/elements';
3
- import type { LucideIcon } from '@lucide/svelte';
3
+ import type { IconComponent } from '../../icon.js';
4
4
  type Props = Omit<HTMLAttributes<HTMLSpanElement>, 'children'> & {
5
+ /** The root element. Bindable. */
6
+ ref?: HTMLSpanElement | null;
5
7
  variant?: 'primary' | 'secondary';
6
- /** Any Lucide icon (import from `svelte-ui/icons`). */
7
- icon?: LucideIcon;
8
+ /** Any icon component, e.g. from `@lucide/svelte`. */
9
+ icon?: IconComponent;
8
10
  children: Snippet;
9
11
  };
10
- declare const Badge: import("svelte").Component<Props, {}, "">;
12
+ declare const Badge: import("svelte").Component<Props, {}, "ref">;
11
13
  type Badge = ReturnType<typeof Badge>;
12
14
  export default Badge;
@@ -3,35 +3,39 @@
3
3
  import type { HTMLAttributes } from 'svelte/elements';
4
4
 
5
5
  type Props = Omit<HTMLAttributes<HTMLElement>, 'children'> & {
6
+ /** The nav element. Bindable. */
7
+ ref?: HTMLElement | null;
6
8
  /** `BreadcrumbItem`s and `BreadcrumbEllipsis`es. */
7
9
  children: Snippet;
8
10
  };
9
11
 
10
- let { class: className, children, ...rest }: Props = $props();
12
+ let { ref = $bindable(null), class: className, children, ...rest }: Props = $props();
11
13
  </script>
12
14
 
13
- <nav aria-label="Breadcrumb" {...rest} class={['breadcrumb', className]}>
15
+ <nav aria-label="Breadcrumb" {...rest} bind:this={ref} class={['breadcrumb', className]}>
14
16
  <ol class="breadcrumb-list">
15
17
  {@render children()}
16
18
  </ol>
17
19
  </nav>
18
20
 
19
21
  <style>
20
- .breadcrumb-list {
21
- display: flex;
22
- flex-wrap: wrap;
23
- align-items: center;
24
- gap: 6px;
25
- margin: 0;
26
- padding: 0;
27
- list-style: none;
28
- font-size: 13px;
29
- color: var(--color-text-muted);
30
- overflow-wrap: anywhere;
31
- }
22
+ @layer svelte-ui {
23
+ .breadcrumb-list {
24
+ display: flex;
25
+ flex-wrap: wrap;
26
+ align-items: center;
27
+ gap: 6px;
28
+ margin: 0;
29
+ padding: 0;
30
+ list-style: none;
31
+ font-size: 13px;
32
+ color: var(--color-text-muted);
33
+ overflow-wrap: anywhere;
34
+ }
32
35
 
33
- /* Each item renders its own trailing separator; the last one has nothing to separate */
34
- .breadcrumb-list :global(.breadcrumb-separator:last-child) {
35
- display: none;
36
+ /* Each item renders its own trailing separator; the last one has nothing to separate */
37
+ .breadcrumb-list :global(.breadcrumb-separator:last-child) {
38
+ display: none;
39
+ }
36
40
  }
37
41
  </style>
@@ -1,9 +1,11 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { HTMLAttributes } from 'svelte/elements';
3
3
  type Props = Omit<HTMLAttributes<HTMLElement>, 'children'> & {
4
+ /** The nav element. Bindable. */
5
+ ref?: HTMLElement | null;
4
6
  /** `BreadcrumbItem`s and `BreadcrumbEllipsis`es. */
5
7
  children: Snippet;
6
8
  };
7
- declare const Breadcrumb: import("svelte").Component<Props, {}, "">;
9
+ declare const Breadcrumb: import("svelte").Component<Props, {}, "ref">;
8
10
  type Breadcrumb = ReturnType<typeof Breadcrumb>;
9
11
  export default Breadcrumb;
@@ -1,21 +1,30 @@
1
1
  <script lang="ts">
2
2
  import type { Snippet } from 'svelte';
3
- import Ellipsis from '@lucide/svelte/icons/ellipsis';
3
+ import type { HTMLLiAttributes } from 'svelte/elements';
4
+ import Ellipsis from '../../internal/icons/Ellipsis.svelte';
4
5
  import Button from '../button/Button.svelte';
5
6
  import ContextMenu from '../context-menu/ContextMenu.svelte';
6
7
  import BreadcrumbSeparator from './BreadcrumbSeparator.svelte';
7
8
 
8
- type Props = {
9
+ type Props = Omit<HTMLLiAttributes, 'children'> & {
10
+ /** The li element. Bindable. */
11
+ ref?: HTMLLIElement | null;
9
12
  /** Accessible name of the menu trigger. */
10
13
  label?: string;
11
14
  /** `ContextMenuItem`s for the collapsed items. */
12
15
  children: Snippet;
13
16
  };
14
17
 
15
- let { label = 'More', children }: Props = $props();
18
+ let {
19
+ ref = $bindable(null),
20
+ label = 'More',
21
+ class: className,
22
+ children,
23
+ ...rest
24
+ }: Props = $props();
16
25
  </script>
17
26
 
18
- <li class="breadcrumb-ellipsis">
27
+ <li {...rest} bind:this={ref} class={['breadcrumb-ellipsis', className]}>
19
28
  <ContextMenu>
20
29
  {#snippet trigger(props)}
21
30
  <Button {...props} variant="ghost" size="sm" icon={Ellipsis} {label} />
@@ -26,7 +35,9 @@
26
35
  <BreadcrumbSeparator />
27
36
 
28
37
  <style>
29
- .breadcrumb-ellipsis {
30
- display: inline-flex;
38
+ @layer svelte-ui {
39
+ .breadcrumb-ellipsis {
40
+ display: inline-flex;
41
+ }
31
42
  }
32
43
  </style>
@@ -1,10 +1,13 @@
1
1
  import type { Snippet } from 'svelte';
2
- type Props = {
2
+ import type { HTMLLiAttributes } from 'svelte/elements';
3
+ type Props = Omit<HTMLLiAttributes, 'children'> & {
4
+ /** The li element. Bindable. */
5
+ ref?: HTMLLIElement | null;
3
6
  /** Accessible name of the menu trigger. */
4
7
  label?: string;
5
8
  /** `ContextMenuItem`s for the collapsed items. */
6
9
  children: Snippet;
7
10
  };
8
- declare const BreadcrumbEllipsis: import("svelte").Component<Props, {}, "">;
11
+ declare const BreadcrumbEllipsis: import("svelte").Component<Props, {}, "ref">;
9
12
  type BreadcrumbEllipsis = ReturnType<typeof BreadcrumbEllipsis>;
10
13
  export default BreadcrumbEllipsis;