@noahbaumgartner/svelte-ui 0.0.5 → 0.0.7

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