@widgetic/design-system 0.5.21 → 0.5.23

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 (246) hide show
  1. package/README.md +2 -0
  2. package/dist/components/CopyableHeader.svelte +260 -448
  3. package/dist/components/CopyableHeader.svelte.d.ts +8 -5
  4. package/dist/components/EmptyState.svelte +100 -128
  5. package/dist/components/EmptyState.svelte.d.ts +16 -19
  6. package/dist/components/GenerateLoader.svelte +17 -10
  7. package/dist/components/PasswordInput.svelte +41 -44
  8. package/dist/components/PasswordInput.svelte.d.ts +2 -0
  9. package/dist/components/ThumbHashImage.svelte +117 -119
  10. package/dist/components/WScrollArea.svelte +47 -41
  11. package/dist/components/chat/ActivityRow.svelte +115 -0
  12. package/dist/components/chat/ActivityRow.svelte.d.ts +18 -0
  13. package/dist/components/chat/ChatHeader.svelte +114 -0
  14. package/dist/components/chat/ChatHeader.svelte.d.ts +26 -0
  15. package/dist/components/chat/Composer.svelte +172 -0
  16. package/dist/components/chat/Composer.svelte.d.ts +27 -0
  17. package/dist/components/chat/Message.svelte +158 -0
  18. package/dist/components/chat/Message.svelte.d.ts +28 -0
  19. package/dist/components/chat/OptionRow.svelte +59 -0
  20. package/dist/components/chat/OptionRow.svelte.d.ts +14 -0
  21. package/dist/components/chat/PlanCard.svelte +220 -0
  22. package/dist/components/chat/PlanCard.svelte.d.ts +34 -0
  23. package/dist/components/chat/QuestionCard.svelte +265 -0
  24. package/dist/components/chat/QuestionCard.svelte.d.ts +38 -0
  25. package/dist/components/chat/ScrollToBottom.svelte +51 -0
  26. package/dist/components/chat/ScrollToBottom.svelte.d.ts +11 -0
  27. package/dist/components/chat/SuggestionCard.svelte +79 -0
  28. package/dist/components/chat/SuggestionCard.svelte.d.ts +20 -0
  29. package/dist/components/chat/TaskRow.svelte +59 -0
  30. package/dist/components/chat/TaskRow.svelte.d.ts +11 -0
  31. package/dist/components/chat/composerLogic.d.ts +16 -0
  32. package/dist/components/chat/composerLogic.js +29 -0
  33. package/dist/components/chat/index.d.ts +16 -0
  34. package/dist/components/chat/index.js +16 -0
  35. package/dist/components/chat/questionCardLogic.d.ts +11 -0
  36. package/dist/components/chat/questionCardLogic.js +39 -0
  37. package/dist/components/index.d.ts +10 -1
  38. package/dist/components/index.js +10 -0
  39. package/dist/components/modals/ActionModal.svelte +186 -180
  40. package/dist/components/modals/BaseModal.svelte +404 -395
  41. package/dist/components/modals/BaseModal.svelte.d.ts +3 -0
  42. package/dist/components/modals/NewItemDialog.svelte +200 -243
  43. package/dist/components/modals/Portal.svelte +107 -105
  44. package/dist/components/modals/README.md +16 -2
  45. package/dist/components/modals/RenameDialog.svelte +234 -292
  46. package/dist/components/navigation/Breadcrumbs.svelte +415 -377
  47. package/dist/components/navigation/Breadcrumbs.svelte.d.ts +3 -2
  48. package/dist/components/navigation/types.d.ts +2 -0
  49. package/dist/components/pdf/PDFViewer.svelte +54 -1
  50. package/dist/components/search-input/SearchInput.svelte +51 -104
  51. package/dist/components/search-input/SearchInput.svelte.d.ts +9 -27
  52. package/dist/components/shad-editor/editor.css +1 -1
  53. package/dist/components/shad-editor/i18n/messages.d.ts +1 -1
  54. package/dist/components/shad-editor/i18n/messages.js +1 -1
  55. package/dist/components/shell/AppShell.svelte +52 -0
  56. package/dist/components/shell/AppShell.svelte.d.ts +13 -0
  57. package/dist/components/shell/Banner.svelte +90 -0
  58. package/dist/components/shell/Banner.svelte.d.ts +61 -0
  59. package/dist/components/shell/ErrorState.svelte +60 -0
  60. package/dist/components/shell/ErrorState.svelte.d.ts +13 -0
  61. package/dist/components/shell/Link.svelte +63 -0
  62. package/dist/components/shell/Link.svelte.d.ts +53 -0
  63. package/dist/components/shell/NavDrawer.svelte +117 -0
  64. package/dist/components/shell/NavDrawer.svelte.d.ts +10 -0
  65. package/dist/components/shell/NavRow.svelte +128 -0
  66. package/dist/components/shell/NavRow.svelte.d.ts +65 -0
  67. package/dist/components/shell/NavSectionLabel.svelte +27 -0
  68. package/dist/components/shell/NavSectionLabel.svelte.d.ts +9 -0
  69. package/dist/components/shell/NotificationRow.svelte +76 -0
  70. package/dist/components/shell/NotificationRow.svelte.d.ts +16 -0
  71. package/dist/components/shell/PageHeader.svelte +42 -0
  72. package/dist/components/shell/PageHeader.svelte.d.ts +12 -0
  73. package/dist/components/shell/ProfileRow.svelte +95 -0
  74. package/dist/components/shell/ProfileRow.svelte.d.ts +54 -0
  75. package/dist/components/shell/SettingsDialog.svelte +118 -0
  76. package/dist/components/shell/SettingsDialog.svelte.d.ts +19 -0
  77. package/dist/components/shell/SettingsNav.svelte +46 -0
  78. package/dist/components/shell/SettingsNav.svelte.d.ts +11 -0
  79. package/dist/components/shell/Sidebar.svelte +82 -0
  80. package/dist/components/shell/Sidebar.svelte.d.ts +25 -0
  81. package/dist/components/shell/Stat.svelte +63 -0
  82. package/dist/components/shell/Stat.svelte.d.ts +58 -0
  83. package/dist/components/shell/TopBar.svelte +37 -0
  84. package/dist/components/shell/TopBar.svelte.d.ts +11 -0
  85. package/dist/components/shell/WidgetRow.svelte +126 -0
  86. package/dist/components/shell/WidgetRow.svelte.d.ts +78 -0
  87. package/dist/components/shell/error-state-messages.d.ts +7 -0
  88. package/dist/components/shell/error-state-messages.js +9 -0
  89. package/dist/components/shell/index.d.ts +22 -0
  90. package/dist/components/shell/index.js +25 -0
  91. package/dist/components/shell/link-external.d.ts +2 -0
  92. package/dist/components/shell/link-external.js +7 -0
  93. package/dist/components/shell/messages.d.ts +7 -0
  94. package/dist/components/shell/messages.js +5 -0
  95. package/dist/components/shell/settings-nav-types.d.ts +12 -0
  96. package/dist/components/shell/settings-nav-types.js +3 -0
  97. package/dist/components/shell/shell-utils.d.ts +7 -0
  98. package/dist/components/shell/shell-utils.js +27 -0
  99. package/dist/components/shell/stat-tone.d.ts +3 -0
  100. package/dist/components/shell/stat-tone.js +11 -0
  101. package/dist/components/toast/ToasterModal.svelte +102 -168
  102. package/dist/components/toast/ToasterModal.svelte.d.ts +2 -12
  103. package/dist/components/ui/accordion/accordion-content.svelte +3 -2
  104. package/dist/components/ui/accordion/accordion-item.svelte +10 -1
  105. package/dist/components/ui/accordion/accordion-trigger.svelte +4 -3
  106. package/dist/components/ui/alert/alert-description.svelte +5 -1
  107. package/dist/components/ui/alert/alert-title.svelte +2 -1
  108. package/dist/components/ui/alert/index.d.ts +13 -11
  109. package/dist/components/ui/alert/index.js +4 -4
  110. package/dist/components/ui/avatar/avatar-utils.d.ts +2 -0
  111. package/dist/components/ui/avatar/avatar-utils.js +9 -0
  112. package/dist/components/ui/avatar/avatar.svelte +63 -0
  113. package/dist/components/ui/avatar/avatar.svelte.d.ts +80 -0
  114. package/dist/components/ui/avatar/index.d.ts +4 -0
  115. package/dist/components/ui/avatar/index.js +4 -0
  116. package/dist/components/ui/badge/badge.svelte +22 -10
  117. package/dist/components/ui/badge/badge.svelte.d.ts +14 -15
  118. package/dist/components/ui/breadcrumb/breadcrumb-ellipsis.svelte +2 -2
  119. package/dist/components/ui/breadcrumb/breadcrumb-link.svelte +1 -1
  120. package/dist/components/ui/breadcrumb/breadcrumb-page.svelte +1 -1
  121. package/dist/components/ui/breadcrumb/breadcrumb-separator.svelte +2 -2
  122. package/dist/components/ui/button/button-padding.d.ts +9 -0
  123. package/dist/components/ui/button/button-padding.js +15 -0
  124. package/dist/components/ui/button/button.svelte +81 -31
  125. package/dist/components/ui/button/button.svelte.d.ts +48 -29
  126. package/dist/components/ui/calendar/calendar-cell.svelte +1 -1
  127. package/dist/components/ui/calendar/calendar-head-cell.svelte +1 -1
  128. package/dist/components/ui/calendar/calendar-next-button.svelte +2 -2
  129. package/dist/components/ui/calendar/calendar-prev-button.svelte +2 -2
  130. package/dist/components/ui/card/card-description.svelte +1 -1
  131. package/dist/components/ui/card/card-title.svelte +1 -1
  132. package/dist/components/ui/card/card.svelte +1 -1
  133. package/dist/components/ui/checkbox/checkbox.svelte +9 -5
  134. package/dist/components/ui/chip/chip.svelte +48 -0
  135. package/dist/components/ui/chip/chip.svelte.d.ts +13 -0
  136. package/dist/components/ui/chip/index.d.ts +2 -0
  137. package/dist/components/ui/chip/index.js +2 -0
  138. package/dist/components/ui/command/command-dialog.svelte +1 -1
  139. package/dist/components/ui/command/command-input.svelte +4 -4
  140. package/dist/components/ui/command/command-item.svelte +1 -1
  141. package/dist/components/ui/command/command.svelte +1 -1
  142. package/dist/components/ui/dialog/dialog-content.svelte +4 -4
  143. package/dist/components/ui/dialog/dialog-description.svelte +1 -1
  144. package/dist/components/ui/dialog/dialog-overlay.svelte +1 -1
  145. package/dist/components/ui/dialog/dialog-title.svelte +1 -1
  146. package/dist/components/ui/drawer/drawer-content.svelte +1 -1
  147. package/dist/components/ui/drawer/drawer-overlay.svelte +1 -1
  148. package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +5 -5
  149. package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte +1 -1
  150. package/dist/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +1 -1
  151. package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte +20 -2
  152. package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte.d.ts +4 -0
  153. package/dist/components/ui/dropdown-menu/dropdown-menu-label.svelte +5 -1
  154. package/dist/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +3 -3
  155. package/dist/components/ui/dropdown-menu/dropdown-menu-separator.svelte +2 -1
  156. package/dist/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +1 -1
  157. package/dist/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +3 -3
  158. package/dist/components/ui/field/field-ids.d.ts +7 -0
  159. package/dist/components/ui/field/field-ids.js +15 -0
  160. package/dist/components/ui/field/field.svelte +62 -0
  161. package/dist/components/ui/field/field.svelte.d.ts +21 -0
  162. package/dist/components/ui/field/index.d.ts +3 -0
  163. package/dist/components/ui/field/index.js +3 -0
  164. package/dist/components/ui/hover-card/hover-card-content.svelte +1 -1
  165. package/dist/components/ui/icon-button/icon-button.svelte +72 -0
  166. package/dist/components/ui/icon-button/icon-button.svelte.d.ts +90 -0
  167. package/dist/components/ui/icon-button/index.d.ts +2 -0
  168. package/dist/components/ui/icon-button/index.js +4 -0
  169. package/dist/components/ui/input/index.d.ts +1 -0
  170. package/dist/components/ui/input/input.svelte +11 -4
  171. package/dist/components/ui/input/input.svelte.d.ts +4 -1
  172. package/dist/components/ui/input-otp/input-otp-separator.svelte +2 -2
  173. package/dist/components/ui/input-otp/input-otp-slot.svelte +5 -4
  174. package/dist/components/ui/input-otp/input-otp-slot.svelte.d.ts +1 -1
  175. package/dist/components/ui/input-otp/input-otp.svelte +1 -1
  176. package/dist/components/ui/label/label.svelte +3 -2
  177. package/dist/components/ui/popover/popover-content.svelte +1 -1
  178. package/dist/components/ui/progress/progress.svelte +19 -5
  179. package/dist/components/ui/progress/progress.svelte.d.ts +4 -2
  180. package/dist/components/ui/radio-group/radio-group-item.svelte +4 -4
  181. package/dist/components/ui/range-calendar/range-calendar-head-cell.svelte +1 -1
  182. package/dist/components/ui/range-calendar/range-calendar-next-button.svelte +2 -2
  183. package/dist/components/ui/range-calendar/range-calendar-prev-button.svelte +2 -2
  184. package/dist/components/ui/scroll-area/scroll-area-scrollbar.svelte +4 -1
  185. package/dist/components/ui/scroll-area/scroll-area.svelte +1 -1
  186. package/dist/components/ui/select/select-content.svelte +1 -3
  187. package/dist/components/ui/select/select-item.svelte +5 -4
  188. package/dist/components/ui/select/select-scroll-down-button.svelte +2 -2
  189. package/dist/components/ui/select/select-scroll-up-button.svelte +2 -2
  190. package/dist/components/ui/select/select-trigger.svelte +4 -3
  191. package/dist/components/ui/skeleton/index.d.ts +2 -0
  192. package/dist/components/ui/skeleton/index.js +2 -0
  193. package/dist/components/ui/skeleton/skeleton.svelte +24 -0
  194. package/dist/components/ui/skeleton/skeleton.svelte.d.ts +8 -0
  195. package/dist/components/ui/slider/slider.svelte +5 -10
  196. package/dist/components/ui/sonner/sonner.svelte +19 -13
  197. package/dist/components/ui/stepper-button/index.d.ts +3 -0
  198. package/dist/components/ui/stepper-button/index.js +2 -0
  199. package/dist/components/ui/stepper-button/stepper-button.svelte +37 -0
  200. package/dist/components/ui/stepper-button/stepper-button.svelte.d.ts +9 -0
  201. package/dist/components/ui/switch/switch.svelte +8 -3
  202. package/dist/components/ui/table/table-cell.svelte +1 -1
  203. package/dist/components/ui/table/table-head.svelte +1 -1
  204. package/dist/components/ui/table/table-row.svelte +1 -1
  205. package/dist/components/ui/tabs/tabs-list.svelte +1 -1
  206. package/dist/components/ui/tabs/tabs-trigger.svelte +1 -1
  207. package/dist/components/ui/tag/index.d.ts +2 -0
  208. package/dist/components/ui/tag/index.js +2 -0
  209. package/dist/components/ui/tag/tag.svelte +42 -0
  210. package/dist/components/ui/tag/tag.svelte.d.ts +11 -0
  211. package/dist/components/ui/textarea/textarea.svelte +4 -3
  212. package/dist/components/ui/textarea/textarea.svelte.d.ts +2 -2
  213. package/dist/components/ui/toggle/toggle.svelte +9 -9
  214. package/dist/components/ui/toggle/toggle.svelte.d.ts +14 -21
  215. package/dist/components/ui/tooltip/tooltip-content.svelte +1 -1
  216. package/dist/fonts/Inter/Inter-Black.woff2 +0 -0
  217. package/dist/fonts/Inter/Inter-BlackItalic.woff2 +0 -0
  218. package/dist/fonts/Inter/Inter-Bold.woff2 +0 -0
  219. package/dist/fonts/Inter/Inter-BoldItalic.woff2 +0 -0
  220. package/dist/fonts/Inter/Inter-ExtraBold.woff2 +0 -0
  221. package/dist/fonts/Inter/Inter-ExtraBoldItalic.woff2 +0 -0
  222. package/dist/fonts/Inter/Inter-ExtraLight-BETA.woff2 +0 -0
  223. package/dist/fonts/Inter/Inter-ExtraLightItalic-BETA.woff2 +0 -0
  224. package/dist/fonts/Inter/Inter-Italic.woff2 +0 -0
  225. package/dist/fonts/Inter/Inter-Light-BETA.woff2 +0 -0
  226. package/dist/fonts/Inter/Inter-LightItalic-BETA.woff2 +0 -0
  227. package/dist/fonts/Inter/Inter-Medium.woff2 +0 -0
  228. package/dist/fonts/Inter/Inter-MediumItalic.woff2 +0 -0
  229. package/dist/fonts/Inter/Inter-Regular.woff2 +0 -0
  230. package/dist/fonts/Inter/Inter-SemiBold.woff2 +0 -0
  231. package/dist/fonts/Inter/Inter-SemiBoldItalic.woff2 +0 -0
  232. package/dist/fonts/Inter/Inter-Thin-BETA.woff2 +0 -0
  233. package/dist/fonts/Inter/Inter-ThinItalic-BETA.woff2 +0 -0
  234. package/dist/fonts/Inter/Inter-italic.var.woff2 +0 -0
  235. package/dist/fonts/Inter/Inter-upright.var.woff2 +0 -0
  236. package/dist/fonts/Inter/Inter.var.woff2 +0 -0
  237. package/dist/fonts/JetBrainsMono/JetBrainsMono-Regular.woff2 +0 -0
  238. package/dist/i18n/audit/designSystemWords.d.ts +1 -1
  239. package/dist/i18n/audit/designSystemWords.js +1 -1
  240. package/dist/styles/fonts.css +18 -14
  241. package/dist/styles/global.css +7 -19
  242. package/dist/styles/tokens.css +332 -0
  243. package/dist/utils.d.ts +27 -0
  244. package/dist/utils.js +33 -2
  245. package/package.json +2 -1
  246. package/tailwind.config.ts +7 -47
@@ -0,0 +1,48 @@
1
+ <!-- Figma: Chip (component set 65:4, node 65:2). -->
2
+ <script lang="ts">
3
+ import type { HTMLAttributes } from "svelte/elements";
4
+ import type { Snippet } from "svelte";
5
+ import IconX from "@tabler/icons-svelte/icons/x";
6
+ import { cn } from "../../../utils.js";
7
+
8
+ let {
9
+ class: className,
10
+ label,
11
+ showRemove = false,
12
+ removeLabel = "Remove",
13
+ disabled = false,
14
+ onRemove = undefined,
15
+ leading,
16
+ }: HTMLAttributes<HTMLDivElement> & {
17
+ label: string;
18
+ showRemove?: boolean;
19
+ removeLabel?: string;
20
+ disabled?: boolean;
21
+ onRemove?: () => void;
22
+ leading?: Snippet;
23
+ } = $props();
24
+ </script>
25
+
26
+ <div
27
+ class={cn(
28
+ "inline-flex h-7 max-w-full items-center gap-1.5 rounded-lg border border-border bg-transparent px-2 text-label-small text-foreground transition-colors duration-fast",
29
+ disabled ? "pointer-events-none opacity-50" : "hover:bg-accent",
30
+ className
31
+ )}
32
+ >
33
+ {#if leading}
34
+ <span class="flex shrink-0 items-center">{@render leading()}</span>
35
+ {/if}
36
+ <span class="truncate">{label}</span>
37
+ {#if showRemove && onRemove}
38
+ <button
39
+ type="button"
40
+ class="inline-flex size-4 shrink-0 items-center justify-center text-muted-foreground hover:text-foreground focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
41
+ aria-label={removeLabel}
42
+ {disabled}
43
+ onclick={onRemove}
44
+ >
45
+ <IconX class="size-4 stroke-[1.333]" aria-hidden="true" />
46
+ </button>
47
+ {/if}
48
+ </div>
@@ -0,0 +1,13 @@
1
+ import type { HTMLAttributes } from "svelte/elements";
2
+ import type { Snippet } from "svelte";
3
+ type $$ComponentProps = HTMLAttributes<HTMLDivElement> & {
4
+ label: string;
5
+ showRemove?: boolean;
6
+ removeLabel?: string;
7
+ disabled?: boolean;
8
+ onRemove?: () => void;
9
+ leading?: Snippet;
10
+ };
11
+ declare const Chip: import("svelte").Component<$$ComponentProps, {}, "">;
12
+ type Chip = ReturnType<typeof Chip>;
13
+ export default Chip;
@@ -0,0 +1,2 @@
1
+ import Root from "./chip.svelte";
2
+ export { Root, Root as Chip };
@@ -0,0 +1,2 @@
1
+ import Root from "./chip.svelte";
2
+ export { Root, Root as Chip };
@@ -23,7 +23,7 @@
23
23
  </script>
24
24
 
25
25
  <Dialog.Root bind:open {...restProps}>
26
- <Dialog.Content class="overflow-hidden p-0 shadow-lg" {portalProps}>
26
+ <Dialog.Content class="overflow-hidden p-0" {portalProps}>
27
27
  <Command
28
28
  class="[&_[data-command-group]:not([hidden])_~[data-command-group]]:pt-0 **:data-command-group:px-2 [&_[data-command-input-wrapper]_svg]:h-5 [&_[data-command-input-wrapper]_svg]:w-5 **:data-command-input:h-12 **:data-command-item:px-2 **:data-command-item:py-3 [&_[data-command-item]_svg]:h-5 [&_[data-command-item]_svg]:w-5"
29
29
  {...restProps}
@@ -4,7 +4,7 @@
4
4
  </script>
5
5
 
6
6
  <script lang="ts">
7
- import Search from "lucide-svelte/icons/search";
7
+ import IconSearch from "@tabler/icons-svelte/icons/search";
8
8
  import { cn } from "../../../utils.js";
9
9
 
10
10
  let {
@@ -15,11 +15,11 @@
15
15
  }: CommandInputProps = $props();
16
16
  </script>
17
17
 
18
- <div class="flex items-center border-b px-2" data-command-input-wrapper="">
19
- <Search class="me-2 size-4 shrink-0 opacity-50" />
18
+ <div class="border-border flex items-center border-b px-2" data-command-input-wrapper="">
19
+ <IconSearch class="text-muted-foreground me-2 size-4 shrink-0 stroke-[1.333]" />
20
20
  <CommandPrimitive.Input
21
21
  class={cn(
22
- "placeholder:text-muted-foreground flex h-11 w-full rounded-md bg-transparent py-3 text-base outline-hidden disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
22
+ "text-body placeholder:text-muted-foreground flex h-9 w-full bg-transparent py-2 outline-hidden disabled:cursor-not-allowed disabled:opacity-50",
23
23
  className
24
24
  )}
25
25
  bind:ref
@@ -15,7 +15,7 @@
15
15
 
16
16
  <CommandPrimitive.Item
17
17
  class={cn(
18
- "aria-selected:bg-accent aria-selected:text-accent-foreground relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
18
+ "text-body aria-selected:bg-accent aria-selected:text-foreground relative flex h-8 cursor-default select-none items-center gap-2 rounded-lg px-2 py-1.5 outline-hidden transition-colors duration-fast data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 [&_svg]:stroke-[1.333]",
19
19
  className
20
20
  )}
21
21
  bind:ref
@@ -16,7 +16,7 @@
16
16
 
17
17
  <CommandPrimitive.Root
18
18
  class={cn(
19
- "bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md",
19
+ "bg-popover text-popover-foreground border-border flex h-full w-full flex-col overflow-hidden rounded-xl border",
20
20
  className
21
21
  )}
22
22
  bind:value
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { Dialog as DialogPrimitive, type WithoutChildrenOrChild } from "bits-ui";
3
- import X from "lucide-svelte/icons/x";
3
+ import IconX from "@tabler/icons-svelte/icons/x";
4
4
  import type { Snippet } from "svelte";
5
5
  import * as Dialog from "./index.js";
6
6
  import { cn } from "../../../utils.js";
@@ -25,16 +25,16 @@
25
25
  <DialogPrimitive.Content
26
26
  bind:ref
27
27
  class={cn(
28
- "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] bg-background fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border p-6 shadow-lg duration-200 sm:rounded-lg",
28
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 bg-background border-border fixed start-1/2 top-1/2 z-50 grid w-dialog max-w-[calc(100vw-3rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-panel border p-6 duration-base",
29
29
  className
30
30
  )}
31
31
  {...restProps}
32
32
  >
33
33
  {@render children?.()}
34
34
  <DialogPrimitive.Close
35
- class="ring-offset-background focus:ring-ring absolute end-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-offset-2 disabled:pointer-events-none"
35
+ class="text-foreground hover:bg-accent absolute end-4 top-4 inline-flex size-8 items-center justify-center rounded-lg transition-colors duration-fast focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none"
36
36
  >
37
- <X class="size-4" />
37
+ <IconX class="size-4 stroke-[1.333]" />
38
38
  <span class="sr-only">{closeLabel}</span>
39
39
  </DialogPrimitive.Close>
40
40
  </DialogPrimitive.Content>
@@ -15,6 +15,6 @@
15
15
 
16
16
  <DialogPrimitive.Description
17
17
  bind:ref
18
- class={cn("text-muted-foreground text-sm", className)}
18
+ class={cn("text-body text-muted-foreground", className)}
19
19
  {...restProps}
20
20
  />
@@ -16,7 +16,7 @@
16
16
  <DialogPrimitive.Overlay
17
17
  bind:ref
18
18
  class={cn(
19
- "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/80",
19
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-foreground/40 backdrop-blur-sm",
20
20
  className
21
21
  )}
22
22
  {...restProps}
@@ -15,6 +15,6 @@
15
15
 
16
16
  <DialogPrimitive.Title
17
17
  bind:ref
18
- class={cn("text-lg font-semibold leading-none tracking-tight", className)}
18
+ class={cn("text-heading-page", className)}
19
19
  {...restProps}
20
20
  />
@@ -19,7 +19,7 @@
19
19
  <DrawerPrimitive.Content
20
20
  bind:ref
21
21
  class={cn(
22
- "bg-background fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border",
22
+ "bg-background border-border fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-xl border",
23
23
  className
24
24
  )}
25
25
  {...restProps}
@@ -15,6 +15,6 @@
15
15
 
16
16
  <DrawerPrimitive.Overlay
17
17
  bind:ref
18
- class={cn("fixed inset-0 z-50 bg-black/80", className)}
18
+ class={cn("fixed inset-0 z-50 bg-foreground/40 backdrop-blur-sm", className)}
19
19
  {...restProps}
20
20
  />
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { DropdownMenu as DropdownMenuPrimitive, type WithoutChildrenOrChild } from "bits-ui";
3
- import Check from "lucide-svelte/icons/check";
4
- import Minus from "lucide-svelte/icons/minus";
3
+ import IconCheck from "@tabler/icons-svelte/icons/check";
4
+ import IconMinus from "@tabler/icons-svelte/icons/minus";
5
5
  import { cn } from "../../../utils.js";
6
6
  import type { Snippet } from "svelte";
7
7
 
@@ -22,7 +22,7 @@
22
22
  bind:checked
23
23
  bind:indeterminate
24
24
  class={cn(
25
- "data-highlighted:bg-accent data-highlighted:text-accent-foreground relative flex cursor-default select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-hidden data-disabled:pointer-events-none data-disabled:opacity-50",
25
+ "text-body data-highlighted:bg-accent data-highlighted:text-foreground relative flex h-8 cursor-default select-none items-center rounded-lg py-1.5 ps-8 pe-2 outline-hidden transition-colors duration-fast data-disabled:pointer-events-none data-disabled:opacity-50",
26
26
  className
27
27
  )}
28
28
  {...restProps}
@@ -30,9 +30,9 @@
30
30
  {#snippet children({ checked, indeterminate })}
31
31
  <span class="absolute start-2 flex size-3.5 items-center justify-center">
32
32
  {#if indeterminate}
33
- <Minus class="size-4" />
33
+ <IconMinus class="size-4 stroke-[1.333]" />
34
34
  {:else}
35
- <Check class={cn("size-4", !checked && "text-transparent")} />
35
+ <IconCheck class={cn("size-4 stroke-[1.333]", !checked && "text-transparent")} />
36
36
  {/if}
37
37
  </span>
38
38
  {@render childrenProp?.()}
@@ -24,7 +24,7 @@
24
24
  {sideOffset}
25
25
  dir={$textDirection}
26
26
  class={cn(
27
- "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-md border p-1 shadow-md outline-hidden",
27
+ "bg-popover text-popover-foreground border-border data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-xl border p-1 outline-hidden",
28
28
  className
29
29
  )}
30
30
  {...restProps}
@@ -14,6 +14,6 @@
14
14
 
15
15
  <DropdownMenuPrimitive.GroupHeading
16
16
  bind:ref
17
- class={cn("px-2 py-1.5 text-sm font-semibold", inset && "ps-8", className)}
17
+ class={cn("text-caption-medium text-muted-foreground px-2 pb-1 pt-1.5", inset && "ps-8", className)}
18
18
  {...restProps}
19
19
  />
@@ -6,18 +6,36 @@
6
6
  ref = $bindable(null),
7
7
  class: className,
8
8
  inset,
9
+ description,
10
+ label,
11
+ children,
9
12
  ...restProps
10
13
  }: DropdownMenuPrimitive.ItemProps & {
11
14
  inset?: boolean;
15
+ /** Second line (Menu Item with description — 48px row). */
16
+ description?: string;
17
+ /** Primary line when `description` is set (icons stay in the default slot). */
18
+ label?: string;
12
19
  } = $props();
13
20
  </script>
14
21
 
15
22
  <DropdownMenuPrimitive.Item
16
23
  bind:ref
17
24
  class={cn(
18
- "data-highlighted:bg-accent data-highlighted:text-accent-foreground relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden transition-colors data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
25
+ "text-body data-highlighted:bg-accent data-highlighted:text-foreground relative flex cursor-default select-none items-center gap-2 rounded-lg px-2 py-1.5 outline-hidden transition-colors duration-fast data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 [&_svg]:stroke-[1.333] data-[variant=destructive]:text-destructive data-highlighted:data-[variant=destructive]:text-destructive",
26
+ description ? "min-h-12" : "min-h-8",
19
27
  inset && "ps-8",
20
28
  className
21
29
  )}
22
30
  {...restProps}
23
- />
31
+ >
32
+ {#if description && label}
33
+ {@render children?.()}
34
+ <div class="flex min-w-0 flex-1 flex-col gap-0">
35
+ <span class="text-body truncate">{label}</span>
36
+ <span class="text-caption text-muted-foreground truncate">{description}</span>
37
+ </div>
38
+ {:else}
39
+ {@render children?.()}
40
+ {/if}
41
+ </DropdownMenuPrimitive.Item>
@@ -1,6 +1,10 @@
1
1
  import { DropdownMenu as DropdownMenuPrimitive } from "bits-ui";
2
2
  type $$ComponentProps = DropdownMenuPrimitive.ItemProps & {
3
3
  inset?: boolean;
4
+ /** Second line (Menu Item with description — 48px row). */
5
+ description?: string;
6
+ /** Primary line when `description` is set (icons stay in the default slot). */
7
+ label?: string;
4
8
  };
5
9
  declare const DropdownMenuItem: import("svelte").Component<$$ComponentProps, {}, "ref">;
6
10
  type DropdownMenuItem = ReturnType<typeof DropdownMenuItem>;
@@ -16,7 +16,11 @@
16
16
 
17
17
  <div
18
18
  bind:this={ref}
19
- class={cn("px-2 py-1.5 text-sm font-semibold", inset && "ps-8", className)}
19
+ class={cn(
20
+ "text-caption-medium text-muted-foreground px-2 pb-1 pt-1.5",
21
+ inset && "ps-8",
22
+ className
23
+ )}
20
24
  {...restProps}
21
25
  >
22
26
  {@render children?.()}
@@ -4,7 +4,7 @@
4
4
  </script>
5
5
 
6
6
  <script lang="ts">
7
- import Circle from "lucide-svelte/icons/circle";
7
+ import IconCircleFilled from "@tabler/icons-svelte/icons/circle-filled";
8
8
  import { cn } from "../../../utils.js";
9
9
 
10
10
  let {
@@ -18,7 +18,7 @@
18
18
  <DropdownMenuPrimitive.RadioItem
19
19
  bind:ref
20
20
  class={cn(
21
- "data-highlighted:bg-accent data-highlighted:text-accent-foreground relative flex cursor-default select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-hidden data-disabled:pointer-events-none data-disabled:opacity-50",
21
+ "text-body data-highlighted:bg-accent data-highlighted:text-foreground relative flex h-8 cursor-default select-none items-center rounded-lg py-1.5 ps-8 pe-2 outline-hidden transition-colors duration-fast data-disabled:pointer-events-none data-disabled:opacity-50",
22
22
  className
23
23
  )}
24
24
  {...restProps}
@@ -26,7 +26,7 @@
26
26
  {#snippet children({ checked })}
27
27
  <span class="absolute start-2 flex size-3.5 items-center justify-center">
28
28
  {#if checked}
29
- <Circle class="size-2 fill-current" />
29
+ <IconCircleFilled class="size-2 stroke-[1.333]" />
30
30
  {/if}
31
31
  </span>
32
32
  {@render childrenProp?.({ checked })}
@@ -13,8 +13,9 @@
13
13
  }: DropdownMenuSeparatorProps = $props();
14
14
  </script>
15
15
 
16
+ <!-- Figma Menu Separator (9px tall): a 1px line with 4px above and below. (py-1 on the line itself drew an 8px band.) -->
16
17
  <DropdownMenuPrimitive.Separator
17
18
  bind:ref
18
- class={cn("bg-muted -mx-1 my-1 h-px", className)}
19
+ class={cn("bg-border my-1 h-px", className)}
19
20
  {...restProps}
20
21
  />
@@ -22,7 +22,7 @@
22
22
  bind:ref
23
23
  dir={$textDirection}
24
24
  class={cn(
25
- "bg-popover text-popover-foreground z-50 min-w-[8rem] rounded-md border p-1 shadow-lg focus:outline-hidden",
25
+ "bg-popover text-popover-foreground border-border z-50 min-w-[8rem] rounded-xl border p-1 focus:outline-hidden",
26
26
  className
27
27
  )}
28
28
  {...restProps}
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { DropdownMenu as DropdownMenuPrimitive } from "bits-ui";
3
- import ChevronRight from "lucide-svelte/icons/chevron-right";
3
+ import IconChevronRight from "@tabler/icons-svelte/icons/chevron-right";
4
4
  import { cn } from "../../../utils.js";
5
5
 
6
6
  let {
@@ -17,12 +17,12 @@
17
17
  <DropdownMenuPrimitive.SubTrigger
18
18
  bind:ref
19
19
  class={cn(
20
- "data-highlighted:bg-accent data-[state=open]:bg-accent flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
20
+ "text-body data-highlighted:bg-accent data-[state=open]:bg-accent flex h-8 cursor-default select-none items-center gap-2 rounded-lg px-2 py-1.5 outline-hidden transition-colors duration-fast [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 [&_svg]:stroke-[1.333]",
21
21
  inset && "ps-8",
22
22
  className
23
23
  )}
24
24
  {...restProps}
25
25
  >
26
26
  {@render children?.()}
27
- <ChevronRight class="ms-auto rtl:-scale-x-100" />
27
+ <IconChevronRight class="ms-auto stroke-[1.333] rtl:-scale-x-100" />
28
28
  </DropdownMenuPrimitive.SubTrigger>
@@ -0,0 +1,7 @@
1
+ export type FieldIds = {
2
+ controlId: string;
3
+ descriptionId: string;
4
+ errorId: string;
5
+ };
6
+ export declare function createFieldIds(baseId: string): FieldIds;
7
+ export declare function fieldDescribedBy(hasDescription: boolean, hasError: boolean, ids: FieldIds): string | undefined;
@@ -0,0 +1,15 @@
1
+ export function createFieldIds(baseId) {
2
+ return {
3
+ controlId: `${baseId}-control`,
4
+ descriptionId: `${baseId}-description`,
5
+ errorId: `${baseId}-error`,
6
+ };
7
+ }
8
+ export function fieldDescribedBy(hasDescription, hasError, ids) {
9
+ const parts = [];
10
+ if (hasDescription)
11
+ parts.push(ids.descriptionId);
12
+ if (hasError)
13
+ parts.push(ids.errorId);
14
+ return parts.length > 0 ? parts.join(" ") : undefined;
15
+ }
@@ -0,0 +1,62 @@
1
+ <!-- Figma: Field (component set 105:27, node 105:2). -->
2
+ <script lang="ts" module>
3
+ let fieldAutoId = 0;
4
+ </script>
5
+
6
+ <script lang="ts">
7
+ import type { Snippet } from "svelte";
8
+ import { cn } from "../../../utils.js";
9
+ import { Label } from "../label/index.js";
10
+ import { createFieldIds, fieldDescribedBy } from "./field-ids.js";
11
+
12
+ let {
13
+ class: className,
14
+ label,
15
+ description = undefined,
16
+ error = undefined,
17
+ required = false,
18
+ id: idProp = undefined,
19
+ control,
20
+ }: {
21
+ class?: string;
22
+ label: string;
23
+ description?: string;
24
+ error?: string;
25
+ required?: boolean;
26
+ id?: string;
27
+ control: Snippet<
28
+ [
29
+ {
30
+ id: string;
31
+ describedBy: string | undefined;
32
+ invalid: boolean;
33
+ "aria-describedby": string | undefined;
34
+ "aria-invalid": boolean;
35
+ },
36
+ ]
37
+ >;
38
+ } = $props();
39
+
40
+ const resolvedId = idProp ?? `field-${++fieldAutoId}`;
41
+ const ids = createFieldIds(resolvedId);
42
+ const invalid = $derived(Boolean(error));
43
+ const describedBy = $derived(fieldDescribedBy(Boolean(description), invalid, ids));
44
+ </script>
45
+
46
+ <div class={cn("flex w-full flex-col gap-1.5", className)}>
47
+ <Label for={ids.controlId} class="text-body-medium">
48
+ {label}{#if required}<span class="text-destructive" aria-hidden="true"> *</span>{/if}
49
+ </Label>
50
+ {@render control({
51
+ id: ids.controlId,
52
+ describedBy,
53
+ invalid,
54
+ "aria-describedby": describedBy,
55
+ "aria-invalid": invalid,
56
+ })}
57
+ {#if error}
58
+ <p id={ids.errorId} class="text-caption text-destructive" role="alert">{error}</p>
59
+ {:else if description}
60
+ <p id={ids.descriptionId} class="text-caption text-muted-foreground">{description}</p>
61
+ {/if}
62
+ </div>
@@ -0,0 +1,21 @@
1
+ import type { Snippet } from "svelte";
2
+ type $$ComponentProps = {
3
+ class?: string;
4
+ label: string;
5
+ description?: string;
6
+ error?: string;
7
+ required?: boolean;
8
+ id?: string;
9
+ control: Snippet<[
10
+ {
11
+ id: string;
12
+ describedBy: string | undefined;
13
+ invalid: boolean;
14
+ "aria-describedby": string | undefined;
15
+ "aria-invalid": boolean;
16
+ }
17
+ ]>;
18
+ };
19
+ declare const Field: import("svelte").Component<$$ComponentProps, {}, "">;
20
+ type Field = ReturnType<typeof Field>;
21
+ export default Field;
@@ -0,0 +1,3 @@
1
+ import Root from "./field.svelte";
2
+ export { createFieldIds, fieldDescribedBy, type FieldIds } from "./field-ids.js";
3
+ export { Root, Root as Field };
@@ -0,0 +1,3 @@
1
+ import Root from "./field.svelte";
2
+ export { createFieldIds, fieldDescribedBy } from "./field-ids.js";
3
+ export { Root, Root as Field };
@@ -26,7 +26,7 @@
26
26
  {sideOffset}
27
27
  dir={$textDirection}
28
28
  class={cn(
29
- "bg-popover text-popover-foreground z-50 mt-3 w-64 rounded-md border p-4 shadow-md outline-hidden",
29
+ "bg-popover text-popover-foreground border-border z-50 mt-3 w-64 rounded-xl border p-4 outline-hidden",
30
30
  className
31
31
  )}
32
32
  {...restProps}
@@ -0,0 +1,72 @@
1
+ <!--
2
+ Figma: Icon Button (component set 37:3, page Icon Button)
3
+ With bits-ui triggers, use `{#snippet child({ props })}` and spread `props` onto this button.
4
+ -->
5
+ <script lang="ts" module>
6
+ import type { WithElementRef } from "bits-ui";
7
+ import type { HTMLButtonAttributes } from "svelte/elements";
8
+ import type { VariantProps } from "tailwind-variants";
9
+
10
+ export const iconButtonVariants = tv({
11
+ base: "inline-flex shrink-0 items-center justify-center transition-colors duration-fast press-feedback focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 [&_svg]:stroke-[1.333]",
12
+ variants: {
13
+ variant: {
14
+ ghost:
15
+ "rounded-lg text-foreground hover:bg-accent hover:text-foreground",
16
+ secondary:
17
+ "rounded-lg bg-secondary text-secondary-foreground hover:bg-accent hover:text-foreground",
18
+ outline:
19
+ "rounded-lg border border-input bg-background text-foreground hover:bg-accent hover:text-foreground",
20
+ primary:
21
+ "rounded-full bg-primary text-primary-foreground hover:bg-primary/90",
22
+ accent:
23
+ "rounded-full bg-brand text-brand-foreground hover:bg-brand/90",
24
+ },
25
+ size: {
26
+ default: "size-8",
27
+ sm: "size-7",
28
+ },
29
+ },
30
+ defaultVariants: {
31
+ variant: "ghost",
32
+ size: "default",
33
+ },
34
+ });
35
+
36
+ export type IconButtonVariant = VariantProps<typeof iconButtonVariants>["variant"];
37
+ export type IconButtonSize = VariantProps<typeof iconButtonVariants>["size"];
38
+
39
+ export type IconButtonProps = WithElementRef<HTMLButtonAttributes> & {
40
+ ref?: HTMLButtonElement | null;
41
+ class?: string;
42
+ variant?: IconButtonVariant;
43
+ size?: IconButtonSize;
44
+ /** Required for accessibility (aria-label). */
45
+ label: string;
46
+ };
47
+ </script>
48
+
49
+ <script lang="ts">
50
+ import { cn, tv } from "../../../utils.js";
51
+
52
+ let {
53
+ class: className,
54
+ variant = "ghost",
55
+ size = "default",
56
+ label,
57
+ ref = $bindable(null),
58
+ type = "button",
59
+ children,
60
+ ...restProps
61
+ }: IconButtonProps = $props();
62
+ </script>
63
+
64
+ <button
65
+ bind:this={ref}
66
+ type={type}
67
+ aria-label={label}
68
+ class={cn(iconButtonVariants({ variant, size, className }))}
69
+ {...restProps}
70
+ >
71
+ {@render children?.()}
72
+ </button>