@diegopluna/narvi 0.0.0-stage → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. package/README.md +82 -2
  2. package/dist/components/activity/ActivityContent.svelte +55 -0
  3. package/dist/components/activity/ActivityContent.svelte.d.ts +11 -0
  4. package/dist/components/activity/ActivityRoot.svelte +66 -0
  5. package/dist/components/activity/ActivityRoot.svelte.d.ts +17 -0
  6. package/dist/components/activity/ActivityStep.svelte +157 -0
  7. package/dist/components/activity/ActivityStep.svelte.d.ts +26 -0
  8. package/dist/components/activity/ActivityThought.svelte +60 -0
  9. package/dist/components/activity/ActivityThought.svelte.d.ts +10 -0
  10. package/dist/components/activity/ActivityTrigger.svelte +103 -0
  11. package/dist/components/activity/ActivityTrigger.svelte.d.ts +20 -0
  12. package/dist/components/activity/context.d.ts +7 -0
  13. package/dist/components/activity/context.js +11 -0
  14. package/dist/components/activity/index.d.ts +11 -0
  15. package/dist/components/activity/index.js +6 -0
  16. package/dist/components/announcer/Announcer.svelte +84 -0
  17. package/dist/components/announcer/Announcer.svelte.d.ts +13 -0
  18. package/dist/components/app-shell/AppShellHeader.svelte +54 -0
  19. package/dist/components/app-shell/AppShellHeader.svelte.d.ts +15 -0
  20. package/dist/components/app-shell/AppShellMain.svelte +49 -0
  21. package/dist/components/app-shell/AppShellMain.svelte.d.ts +11 -0
  22. package/dist/components/app-shell/AppShellPanel.svelte +107 -0
  23. package/dist/components/app-shell/AppShellPanel.svelte.d.ts +18 -0
  24. package/dist/components/app-shell/AppShellRoot.svelte +136 -0
  25. package/dist/components/app-shell/AppShellRoot.svelte.d.ts +28 -0
  26. package/dist/components/app-shell/AppShellSidebar.svelte +192 -0
  27. package/dist/components/app-shell/AppShellSidebar.svelte.d.ts +17 -0
  28. package/dist/components/app-shell/AppShellToggle.svelte +50 -0
  29. package/dist/components/app-shell/AppShellToggle.svelte.d.ts +10 -0
  30. package/dist/components/app-shell/context.d.ts +15 -0
  31. package/dist/components/app-shell/context.js +15 -0
  32. package/dist/components/app-shell/index.d.ts +15 -0
  33. package/dist/components/app-shell/index.js +8 -0
  34. package/dist/components/approval/Approval.svelte +213 -0
  35. package/dist/components/approval/Approval.svelte.d.ts +38 -0
  36. package/dist/components/avatar/AvatarFallback.svelte +73 -0
  37. package/dist/components/avatar/AvatarFallback.svelte.d.ts +11 -0
  38. package/dist/components/avatar/AvatarImage.svelte +75 -0
  39. package/dist/components/avatar/AvatarImage.svelte.d.ts +11 -0
  40. package/dist/components/avatar/AvatarRoot.svelte +108 -0
  41. package/dist/components/avatar/AvatarRoot.svelte.d.ts +19 -0
  42. package/dist/components/avatar/context.d.ts +11 -0
  43. package/dist/components/avatar/context.js +11 -0
  44. package/dist/components/avatar/index.d.ts +7 -0
  45. package/dist/components/avatar/index.js +6 -0
  46. package/dist/components/badge/Badge.svelte +78 -0
  47. package/dist/components/badge/Badge.svelte.d.ts +15 -0
  48. package/dist/components/button/Button.svelte +270 -0
  49. package/dist/components/button/Button.svelte.d.ts +22 -0
  50. package/dist/components/card/Card.svelte +65 -0
  51. package/dist/components/card/Card.svelte.d.ts +15 -0
  52. package/dist/components/change-stats/ChangeStats.svelte +52 -0
  53. package/dist/components/change-stats/ChangeStats.svelte.d.ts +14 -0
  54. package/dist/components/changes-summary/ChangesSummary.svelte +152 -0
  55. package/dist/components/changes-summary/ChangesSummary.svelte.d.ts +20 -0
  56. package/dist/components/checkbox/Checkbox.svelte +178 -0
  57. package/dist/components/checkbox/Checkbox.svelte.d.ts +19 -0
  58. package/dist/components/code/Code.svelte +33 -0
  59. package/dist/components/code/Code.svelte.d.ts +10 -0
  60. package/dist/components/command/CommandDialog.svelte +37 -0
  61. package/dist/components/command/CommandDialog.svelte.d.ts +12 -0
  62. package/dist/components/command/CommandEmpty.svelte +20 -0
  63. package/dist/components/command/CommandEmpty.svelte.d.ts +11 -0
  64. package/dist/components/command/CommandFooter.svelte +25 -0
  65. package/dist/components/command/CommandFooter.svelte.d.ts +11 -0
  66. package/dist/components/command/CommandGroup.svelte +25 -0
  67. package/dist/components/command/CommandGroup.svelte.d.ts +12 -0
  68. package/dist/components/command/CommandInput.svelte +33 -0
  69. package/dist/components/command/CommandInput.svelte.d.ts +8 -0
  70. package/dist/components/command/CommandItem.svelte +49 -0
  71. package/dist/components/command/CommandItem.svelte.d.ts +16 -0
  72. package/dist/components/command/CommandList.svelte +21 -0
  73. package/dist/components/command/CommandList.svelte.d.ts +10 -0
  74. package/dist/components/command/CommandRoot.svelte +20 -0
  75. package/dist/components/command/CommandRoot.svelte.d.ts +11 -0
  76. package/dist/components/command/index.d.ts +20 -0
  77. package/dist/components/command/index.js +12 -0
  78. package/dist/components/command/styles.d.ts +117 -0
  79. package/dist/components/command/styles.js +121 -0
  80. package/dist/components/composer/ComposerAttachButton.svelte +55 -0
  81. package/dist/components/composer/ComposerAttachButton.svelte.d.ts +14 -0
  82. package/dist/components/composer/ComposerAttachment.svelte +173 -0
  83. package/dist/components/composer/ComposerAttachment.svelte.d.ts +13 -0
  84. package/dist/components/composer/ComposerAttachments.svelte +63 -0
  85. package/dist/components/composer/ComposerAttachments.svelte.d.ts +13 -0
  86. package/dist/components/composer/ComposerModelPicker.svelte +475 -0
  87. package/dist/components/composer/ComposerModelPicker.svelte.d.ts +27 -0
  88. package/dist/components/composer/ComposerRoot.svelte +315 -0
  89. package/dist/components/composer/ComposerRoot.svelte.d.ts +42 -0
  90. package/dist/components/composer/ComposerSubmit.svelte +131 -0
  91. package/dist/components/composer/ComposerSubmit.svelte.d.ts +13 -0
  92. package/dist/components/composer/ComposerTextarea.svelte +109 -0
  93. package/dist/components/composer/ComposerTextarea.svelte.d.ts +9 -0
  94. package/dist/components/composer/ComposerToggle.svelte +106 -0
  95. package/dist/components/composer/ComposerToggle.svelte.d.ts +14 -0
  96. package/dist/components/composer/ComposerToolbar.svelte +29 -0
  97. package/dist/components/composer/ComposerToolbar.svelte.d.ts +11 -0
  98. package/dist/components/composer/context.d.ts +53 -0
  99. package/dist/components/composer/context.js +32 -0
  100. package/dist/components/composer/index.d.ts +21 -0
  101. package/dist/components/composer/index.js +13 -0
  102. package/dist/components/conversation/ConversationContent.svelte +94 -0
  103. package/dist/components/conversation/ConversationContent.svelte.d.ts +15 -0
  104. package/dist/components/conversation/ConversationEmpty.svelte +89 -0
  105. package/dist/components/conversation/ConversationEmpty.svelte.d.ts +16 -0
  106. package/dist/components/conversation/ConversationRoot.svelte +237 -0
  107. package/dist/components/conversation/ConversationRoot.svelte.d.ts +20 -0
  108. package/dist/components/conversation/ConversationScrollButton.svelte +114 -0
  109. package/dist/components/conversation/ConversationScrollButton.svelte.d.ts +14 -0
  110. package/dist/components/conversation/context.d.ts +28 -0
  111. package/dist/components/conversation/context.js +15 -0
  112. package/dist/components/conversation/index.d.ts +11 -0
  113. package/dist/components/conversation/index.js +8 -0
  114. package/dist/components/conversation/scrolling.d.ts +25 -0
  115. package/dist/components/conversation/scrolling.js +60 -0
  116. package/dist/components/dev-styles/DevStyles.svelte +21 -0
  117. package/dist/components/dev-styles/DevStyles.svelte.d.ts +3 -0
  118. package/dist/components/dialog/ConfirmDialog.svelte +157 -0
  119. package/dist/components/dialog/ConfirmDialog.svelte.d.ts +31 -0
  120. package/dist/components/dialog/DialogBody.svelte +19 -0
  121. package/dist/components/dialog/DialogBody.svelte.d.ts +10 -0
  122. package/dist/components/dialog/DialogContent.svelte +55 -0
  123. package/dist/components/dialog/DialogContent.svelte.d.ts +17 -0
  124. package/dist/components/dialog/DialogDescription.svelte +23 -0
  125. package/dist/components/dialog/DialogDescription.svelte.d.ts +10 -0
  126. package/dist/components/dialog/DialogFooter.svelte +19 -0
  127. package/dist/components/dialog/DialogFooter.svelte.d.ts +10 -0
  128. package/dist/components/dialog/DialogHeader.svelte +19 -0
  129. package/dist/components/dialog/DialogHeader.svelte.d.ts +10 -0
  130. package/dist/components/dialog/DialogTitle.svelte +20 -0
  131. package/dist/components/dialog/DialogTitle.svelte.d.ts +10 -0
  132. package/dist/components/dialog/index.d.ts +17 -0
  133. package/dist/components/dialog/index.js +12 -0
  134. package/dist/components/dialog/styles.d.ts +120 -0
  135. package/dist/components/dialog/styles.js +136 -0
  136. package/dist/components/divider/Divider.svelte +42 -0
  137. package/dist/components/divider/Divider.svelte.d.ts +11 -0
  138. package/dist/components/empty-state/EmptyState.svelte +82 -0
  139. package/dist/components/empty-state/EmptyState.svelte.d.ts +15 -0
  140. package/dist/components/field/Field.svelte +132 -0
  141. package/dist/components/field/Field.svelte.d.ts +23 -0
  142. package/dist/components/field/context.d.ts +12 -0
  143. package/dist/components/field/context.js +9 -0
  144. package/dist/components/frame/Frame.svelte +88 -0
  145. package/dist/components/frame/Frame.svelte.d.ts +19 -0
  146. package/dist/components/heading/Heading.svelte +82 -0
  147. package/dist/components/heading/Heading.svelte.d.ts +16 -0
  148. package/dist/components/input/Input.svelte +47 -0
  149. package/dist/components/input/Input.svelte.d.ts +14 -0
  150. package/dist/components/kbd/Kbd.svelte +40 -0
  151. package/dist/components/kbd/Kbd.svelte.d.ts +11 -0
  152. package/dist/components/link/Link.svelte +68 -0
  153. package/dist/components/link/Link.svelte.d.ts +16 -0
  154. package/dist/components/menu/ContextMenuContent.svelte +33 -0
  155. package/dist/components/menu/ContextMenuContent.svelte.d.ts +11 -0
  156. package/dist/components/menu/ContextMenuTrigger.svelte +44 -0
  157. package/dist/components/menu/ContextMenuTrigger.svelte.d.ts +11 -0
  158. package/dist/components/menu/MenuCheckboxItem.svelte +43 -0
  159. package/dist/components/menu/MenuCheckboxItem.svelte.d.ts +11 -0
  160. package/dist/components/menu/MenuContent.svelte +36 -0
  161. package/dist/components/menu/MenuContent.svelte.d.ts +10 -0
  162. package/dist/components/menu/MenuItem.svelte +41 -0
  163. package/dist/components/menu/MenuItem.svelte.d.ts +16 -0
  164. package/dist/components/menu/MenuLabel.svelte +24 -0
  165. package/dist/components/menu/MenuLabel.svelte.d.ts +10 -0
  166. package/dist/components/menu/MenuRadioItem.svelte +54 -0
  167. package/dist/components/menu/MenuRadioItem.svelte.d.ts +12 -0
  168. package/dist/components/menu/MenuSeparator.svelte +19 -0
  169. package/dist/components/menu/MenuSeparator.svelte.d.ts +8 -0
  170. package/dist/components/menu/MenuSubContent.svelte +34 -0
  171. package/dist/components/menu/MenuSubContent.svelte.d.ts +10 -0
  172. package/dist/components/menu/MenuSubTrigger.svelte +35 -0
  173. package/dist/components/menu/MenuSubTrigger.svelte.d.ts +11 -0
  174. package/dist/components/menu/context-menu.d.ts +11 -0
  175. package/dist/components/menu/context-menu.js +10 -0
  176. package/dist/components/menu/index.js +16 -0
  177. package/dist/components/message/MessageAction.svelte +62 -0
  178. package/dist/components/message/MessageAction.svelte.d.ts +16 -0
  179. package/dist/components/message/MessageActions.svelte +77 -0
  180. package/dist/components/message/MessageActions.svelte.d.ts +19 -0
  181. package/dist/components/message/MessageContent.svelte +68 -0
  182. package/dist/components/message/MessageContent.svelte.d.ts +12 -0
  183. package/dist/components/message/MessageCopy.svelte +106 -0
  184. package/dist/components/message/MessageCopy.svelte.d.ts +16 -0
  185. package/dist/components/message/MessageHeader.svelte +74 -0
  186. package/dist/components/message/MessageHeader.svelte.d.ts +15 -0
  187. package/dist/components/message/MessagePending.svelte +44 -0
  188. package/dist/components/message/MessagePending.svelte.d.ts +10 -0
  189. package/dist/components/message/MessageRoot.svelte +79 -0
  190. package/dist/components/message/MessageRoot.svelte.d.ts +20 -0
  191. package/dist/components/message/MessageTime.svelte +58 -0
  192. package/dist/components/message/MessageTime.svelte.d.ts +12 -0
  193. package/dist/components/message/context.d.ts +7 -0
  194. package/dist/components/message/context.js +11 -0
  195. package/dist/components/message/index.d.ts +18 -0
  196. package/dist/components/message/index.js +11 -0
  197. package/dist/components/notice/Notice.svelte +111 -0
  198. package/dist/components/notice/Notice.svelte.d.ts +26 -0
  199. package/dist/components/plan/Plan.svelte +198 -0
  200. package/dist/components/plan/Plan.svelte.d.ts +18 -0
  201. package/dist/components/popover/PopoverContent.svelte +42 -0
  202. package/dist/components/popover/PopoverContent.svelte.d.ts +10 -0
  203. package/dist/components/popover/index.d.ts +7 -0
  204. package/dist/components/popover/index.js +7 -0
  205. package/dist/components/progress/Progress.svelte +113 -0
  206. package/dist/components/progress/Progress.svelte.d.ts +11 -0
  207. package/dist/components/questionnaire/Questionnaire.svelte +315 -0
  208. package/dist/components/questionnaire/Questionnaire.svelte.d.ts +33 -0
  209. package/dist/components/queued-message/QueuedMessage.svelte +133 -0
  210. package/dist/components/queued-message/QueuedMessage.svelte.d.ts +23 -0
  211. package/dist/components/rail/RailItem.svelte +170 -0
  212. package/dist/components/rail/RailItem.svelte.d.ts +21 -0
  213. package/dist/components/rail/RailRoot.svelte +46 -0
  214. package/dist/components/rail/RailRoot.svelte.d.ts +13 -0
  215. package/dist/components/rail/RailSpacer.svelte +2 -0
  216. package/dist/components/rail/RailSpacer.svelte.d.ts +26 -0
  217. package/dist/components/rail/index.d.ts +6 -0
  218. package/dist/components/rail/index.js +4 -0
  219. package/dist/components/reasoning/ReasoningContent.svelte +56 -0
  220. package/dist/components/reasoning/ReasoningContent.svelte.d.ts +12 -0
  221. package/dist/components/reasoning/ReasoningRoot.svelte +102 -0
  222. package/dist/components/reasoning/ReasoningRoot.svelte.d.ts +25 -0
  223. package/dist/components/reasoning/ReasoningTrigger.svelte +106 -0
  224. package/dist/components/reasoning/ReasoningTrigger.svelte.d.ts +18 -0
  225. package/dist/components/reasoning/context.d.ts +8 -0
  226. package/dist/components/reasoning/context.js +11 -0
  227. package/dist/components/reasoning/index.d.ts +7 -0
  228. package/dist/components/reasoning/index.js +6 -0
  229. package/dist/components/resize-handle/ResizeHandle.svelte +177 -0
  230. package/dist/components/resize-handle/ResizeHandle.svelte.d.ts +29 -0
  231. package/dist/components/rolling-text/RollingText.svelte +51 -0
  232. package/dist/components/rolling-text/RollingText.svelte.d.ts +11 -0
  233. package/dist/components/segmented/SegmentedControl.svelte +171 -0
  234. package/dist/components/segmented/SegmentedControl.svelte.d.ts +20 -0
  235. package/dist/components/select/Select.svelte +146 -0
  236. package/dist/components/select/Select.svelte.d.ts +31 -0
  237. package/dist/components/separator/Separator.svelte +48 -0
  238. package/dist/components/separator/Separator.svelte.d.ts +11 -0
  239. package/dist/components/settings-row/SettingsRow.svelte +97 -0
  240. package/dist/components/settings-row/SettingsRow.svelte.d.ts +21 -0
  241. package/dist/components/shimmer/Shimmer.svelte +66 -0
  242. package/dist/components/shimmer/Shimmer.svelte.d.ts +12 -0
  243. package/dist/components/sidebar/SidebarContent.svelte +70 -0
  244. package/dist/components/sidebar/SidebarContent.svelte.d.ts +13 -0
  245. package/dist/components/sidebar/SidebarFooter.svelte +33 -0
  246. package/dist/components/sidebar/SidebarFooter.svelte.d.ts +10 -0
  247. package/dist/components/sidebar/SidebarGroup.svelte +123 -0
  248. package/dist/components/sidebar/SidebarGroup.svelte.d.ts +19 -0
  249. package/dist/components/sidebar/SidebarHeader.svelte +39 -0
  250. package/dist/components/sidebar/SidebarHeader.svelte.d.ts +12 -0
  251. package/dist/components/sidebar/SidebarItem.svelte +236 -0
  252. package/dist/components/sidebar/SidebarItem.svelte.d.ts +27 -0
  253. package/dist/components/sidebar/index.d.ts +11 -0
  254. package/dist/components/sidebar/index.js +6 -0
  255. package/dist/components/skeleton/Skeleton.svelte +61 -0
  256. package/dist/components/skeleton/Skeleton.svelte.d.ts +13 -0
  257. package/dist/components/spinner/Spinner.svelte +57 -0
  258. package/dist/components/spinner/Spinner.svelte.d.ts +12 -0
  259. package/dist/components/stack/Stack.svelte +99 -0
  260. package/dist/components/stack/Stack.svelte.d.ts +19 -0
  261. package/dist/components/status-indicator/StatusIndicator.svelte +97 -0
  262. package/dist/components/status-indicator/StatusIndicator.svelte.d.ts +14 -0
  263. package/dist/components/suggestions/SuggestionsItem.svelte +104 -0
  264. package/dist/components/suggestions/SuggestionsItem.svelte.d.ts +14 -0
  265. package/dist/components/suggestions/SuggestionsRoot.svelte +80 -0
  266. package/dist/components/suggestions/SuggestionsRoot.svelte.d.ts +20 -0
  267. package/dist/components/suggestions/context.d.ts +7 -0
  268. package/dist/components/suggestions/context.js +8 -0
  269. package/dist/components/suggestions/index.d.ts +5 -0
  270. package/dist/components/suggestions/index.js +5 -0
  271. package/dist/components/switch/Switch.svelte +175 -0
  272. package/dist/components/switch/Switch.svelte.d.ts +17 -0
  273. package/dist/components/tabs/Tabs.svelte +170 -0
  274. package/dist/components/tabs/Tabs.svelte.d.ts +22 -0
  275. package/dist/components/text/Text.svelte +88 -0
  276. package/dist/components/text/Text.svelte.d.ts +20 -0
  277. package/dist/components/textarea/Textarea.svelte +64 -0
  278. package/dist/components/textarea/Textarea.svelte.d.ts +13 -0
  279. package/dist/components/theme/Theme.svelte +49 -0
  280. package/dist/components/theme/Theme.svelte.d.ts +25 -0
  281. package/dist/components/toast/Toaster.svelte +223 -0
  282. package/dist/components/toast/Toaster.svelte.d.ts +9 -0
  283. package/dist/components/toast/toasts.svelte.d.ts +55 -0
  284. package/dist/components/toast/toasts.svelte.js +66 -0
  285. package/dist/components/tool/ToolContent.svelte +51 -0
  286. package/dist/components/tool/ToolContent.svelte.d.ts +11 -0
  287. package/dist/components/tool/ToolInput.svelte +21 -0
  288. package/dist/components/tool/ToolInput.svelte.d.ts +14 -0
  289. package/dist/components/tool/ToolOutput.svelte +33 -0
  290. package/dist/components/tool/ToolOutput.svelte.d.ts +16 -0
  291. package/dist/components/tool/ToolRoot.svelte +94 -0
  292. package/dist/components/tool/ToolRoot.svelte.d.ts +23 -0
  293. package/dist/components/tool/ToolSection.svelte +102 -0
  294. package/dist/components/tool/ToolSection.svelte.d.ts +16 -0
  295. package/dist/components/tool/ToolTrigger.svelte +191 -0
  296. package/dist/components/tool/ToolTrigger.svelte.d.ts +14 -0
  297. package/dist/components/tool/context.d.ts +18 -0
  298. package/dist/components/tool/context.js +11 -0
  299. package/dist/components/tool/index.d.ts +12 -0
  300. package/dist/components/tool/index.js +8 -0
  301. package/dist/components/tooltip/TooltipContent.svelte +76 -0
  302. package/dist/components/tooltip/TooltipContent.svelte.d.ts +12 -0
  303. package/dist/components/tooltip/TooltipRoot.svelte +37 -0
  304. package/dist/components/tooltip/TooltipRoot.svelte.d.ts +10 -0
  305. package/dist/components/tooltip/TooltipTrigger.svelte +25 -0
  306. package/dist/components/tooltip/TooltipTrigger.svelte.d.ts +5 -0
  307. package/dist/components/tooltip/index.d.ts +13 -0
  308. package/dist/components/tooltip/index.js +10 -0
  309. package/dist/components/tooltip/intent.d.ts +2 -0
  310. package/dist/components/tooltip/intent.js +29 -0
  311. package/dist/components/work-fold/WorkFold.svelte +100 -0
  312. package/dist/components/work-fold/WorkFold.svelte.d.ts +15 -0
  313. package/dist/index.d.ts +127 -0
  314. package/dist/index.js +93 -0
  315. package/dist/internal/Chevron.svelte +28 -0
  316. package/dist/internal/Chevron.svelte.d.ts +7 -0
  317. package/dist/internal/Code.svelte +70 -0
  318. package/dist/internal/Code.svelte.d.ts +10 -0
  319. package/dist/internal/Collapse.svelte +57 -0
  320. package/dist/internal/Collapse.svelte.d.ts +12 -0
  321. package/dist/internal/Glyph.svelte +89 -0
  322. package/dist/internal/Glyph.svelte.d.ts +37 -0
  323. package/dist/internal/Tile.svelte +86 -0
  324. package/dist/internal/Tile.svelte.d.ts +15 -0
  325. package/dist/internal/control.d.ts +58 -0
  326. package/dist/internal/control.js +74 -0
  327. package/dist/internal/disclosure.d.ts +7 -0
  328. package/dist/internal/disclosure.js +1 -0
  329. package/dist/internal/json.d.ts +13 -0
  330. package/dist/internal/json.js +51 -0
  331. package/dist/internal/kinds.d.ts +9 -0
  332. package/dist/internal/kinds.js +25 -0
  333. package/dist/internal/layer.d.ts +103 -0
  334. package/dist/internal/layer.js +129 -0
  335. package/dist/internal/loop.d.ts +35 -0
  336. package/dist/internal/loop.js +72 -0
  337. package/dist/internal/markers.stylex.d.ts +14 -0
  338. package/dist/internal/markers.stylex.js +10 -0
  339. package/dist/internal/roving.d.ts +17 -0
  340. package/dist/internal/roving.js +68 -0
  341. package/dist/internal/shared.d.ts +36 -0
  342. package/dist/internal/shared.js +44 -0
  343. package/dist/internal/sx.d.ts +14 -0
  344. package/dist/internal/sx.js +11 -0
  345. package/dist/preset.d.ts +102 -0
  346. package/dist/preset.js +334 -0
  347. package/dist/tokens.stylex.d.ts +104 -0
  348. package/dist/tokens.stylex.js +125 -0
  349. package/dist/vite.d.ts +16 -0
  350. package/dist/vite.js +58 -0
  351. package/package.json +123 -5
@@ -0,0 +1,75 @@
1
+ <script lang="ts" module>
2
+ import * as stylex from '@stylexjs/stylex';
3
+ import type { HTMLImgAttributes } from 'svelte/elements';
4
+ import { attrs, type Sx } from '../../internal/sx.js';
5
+ import { getAvatarContext } from './context.js';
6
+
7
+ export type AvatarImageProps = Omit<HTMLImgAttributes, 'src' | 'children'> & {
8
+ /** Image URL. While it is missing, loading or broken, the Fallback shows. */
9
+ src?: string | null;
10
+ sx?: Sx;
11
+ ref?: HTMLImageElement | null;
12
+ };
13
+
14
+ const styles = stylex.create({
15
+ // Laid over the fallback, so a loaded image simply covers it, even before
16
+ // the page has hydrated
17
+ image: {
18
+ position: 'absolute',
19
+ inset: 0,
20
+ display: 'block',
21
+ width: '100%',
22
+ height: '100%',
23
+ borderRadius: 'inherit',
24
+ objectFit: 'cover'
25
+ },
26
+ hidden: { display: 'none' }
27
+ });
28
+ </script>
29
+
30
+ <script lang="ts">
31
+ let {
32
+ src,
33
+ alt,
34
+ sx,
35
+ class: className,
36
+ ref = $bindable(null),
37
+ ...rest
38
+ }: AvatarImageProps = $props();
39
+
40
+ const avatar = getAvatarContext('Image');
41
+ let status = $state<'loading' | 'loaded' | 'error'>('loading');
42
+
43
+ // A new src starts over. An image that settled before hydration fires no
44
+ // events, so its state is read straight from the element.
45
+ $effect(() => {
46
+ if (!src) {
47
+ status = 'error';
48
+ return;
49
+ }
50
+ status = 'loading';
51
+ if (ref?.complete) status = ref.naturalWidth > 0 ? 'loaded' : 'error';
52
+ });
53
+
54
+ $effect(() => {
55
+ avatar.status = status;
56
+ return () => {
57
+ avatar.status = 'none';
58
+ };
59
+ });
60
+ </script>
61
+
62
+ {#if src}
63
+ <!-- The Root carries the person's name, so the picture itself is decorative by default -->
64
+ <img
65
+ bind:this={ref}
66
+ {src}
67
+ alt={alt ?? ''}
68
+ draggable="false"
69
+ data-slot="avatar-image"
70
+ onload={() => (status = 'loaded')}
71
+ onerror={() => (status = 'error')}
72
+ {...rest}
73
+ {...attrs([styles.image, status === 'error' && styles.hidden, sx], className)}
74
+ />
75
+ {/if}
@@ -0,0 +1,11 @@
1
+ import type { HTMLImgAttributes } from 'svelte/elements';
2
+ import { type Sx } from '../../internal/sx.js';
3
+ export type AvatarImageProps = Omit<HTMLImgAttributes, 'src' | 'children'> & {
4
+ /** Image URL. While it is missing, loading or broken, the Fallback shows. */
5
+ src?: string | null;
6
+ sx?: Sx;
7
+ ref?: HTMLImageElement | null;
8
+ };
9
+ declare const AvatarImage: import("svelte").Component<AvatarImageProps, {}, "ref">;
10
+ type AvatarImage = ReturnType<typeof AvatarImage>;
11
+ export default AvatarImage;
@@ -0,0 +1,108 @@
1
+ <script lang="ts" module>
2
+ import * as stylex from '@stylexjs/stylex';
3
+ import type { Snippet } from 'svelte';
4
+ import type { HTMLAttributes } from 'svelte/elements';
5
+ import { attrs, type Sx } from '../../internal/sx.js';
6
+ import { font, radius } from '../../tokens.stylex.js';
7
+ import { setAvatarContext, type AvatarImageStatus } from './context.js';
8
+
9
+ export type AvatarSize = 'sm' | 'md' | 'lg' | 'xl';
10
+
11
+ export type AvatarRootProps = Omit<HTMLAttributes<HTMLSpanElement>, 'children'> & {
12
+ /**
13
+ * The person's name. It becomes the avatar's accessible name and picks the
14
+ * colour behind the initials, so each person keeps theirs.
15
+ */
16
+ name?: string;
17
+ size?: AvatarSize;
18
+ sx?: Sx;
19
+ ref?: HTMLSpanElement | null;
20
+ /** An Avatar.Image and an Avatar.Fallback. */
21
+ children?: Snippet;
22
+ };
23
+
24
+ const styles = stylex.create({
25
+ root: {
26
+ position: 'relative',
27
+ display: 'inline-grid',
28
+ flexShrink: 0,
29
+ overflow: 'hidden',
30
+ borderRadius: radius.full,
31
+ fontFamily: font.body,
32
+ fontWeight: font.weightSemibold,
33
+ lineHeight: 1,
34
+ userSelect: 'none',
35
+ verticalAlign: 'middle',
36
+ // One hairline over whatever is showing, image or fallback. Pure black or
37
+ // white, so it never picks up the colour underneath.
38
+ '::after': {
39
+ content: '""',
40
+ position: 'absolute',
41
+ inset: 0,
42
+ borderRadius: 'inherit',
43
+ boxShadow: 'inset 0 0 0 1px light-dark(rgb(0 0 0 / 0.1), rgb(255 255 255 / 0.14))',
44
+ pointerEvents: 'none'
45
+ },
46
+ // Shadows vanish in forced-colours mode; this outline stands in for the edge
47
+ outlineStyle: 'solid',
48
+ outlineWidth: '1px',
49
+ outlineColor: 'transparent',
50
+ outlineOffset: '-1px'
51
+ }
52
+ });
53
+
54
+ const sizes = stylex.create({
55
+ sm: { width: '1.5rem', height: '1.5rem', fontSize: '0.625rem' },
56
+ md: { width: '1.75rem', height: '1.75rem', fontSize: '0.6875rem' },
57
+ lg: { width: '2.25rem', height: '2.25rem', fontSize: font.sizeSm },
58
+ xl: { width: '3.5rem', height: '3.5rem', fontSize: '1.125rem' }
59
+ });
60
+
61
+ // Blue through violet to teal: every hue sits comfortably beside the silver-blue accent.
62
+ function hueOf(name: string): number {
63
+ // FNV-1a: similar names still land far apart
64
+ let hash = 2166136261;
65
+ for (const char of name) hash = Math.imul(hash ^ (char.codePointAt(0) ?? 0), 16777619);
66
+ return 170 + ((hash >>> 0) % 150);
67
+ }
68
+ </script>
69
+
70
+ <script lang="ts">
71
+ let {
72
+ name,
73
+ size = 'md',
74
+ sx,
75
+ class: className,
76
+ ref = $bindable(null),
77
+ children,
78
+ ...rest
79
+ }: AvatarRootProps = $props();
80
+
81
+ let status = $state<AvatarImageStatus>('none');
82
+
83
+ setAvatarContext({
84
+ get status() {
85
+ return status;
86
+ },
87
+ set status(value) {
88
+ status = value;
89
+ },
90
+ get name() {
91
+ return name;
92
+ }
93
+ });
94
+ </script>
95
+
96
+ <!-- With a name, the whole avatar is one image with that name, and what is inside is not read out -->
97
+ <span
98
+ bind:this={ref}
99
+ role={name ? 'img' : undefined}
100
+ aria-label={name}
101
+ data-slot="avatar"
102
+ data-status={status}
103
+ {...rest}
104
+ {...attrs([styles.root, sizes[size], sx], className)}
105
+ style:--narvi-avatar-hue={name ? hueOf(name) : undefined}
106
+ >
107
+ {@render children?.()}
108
+ </span>
@@ -0,0 +1,19 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import { type Sx } from '../../internal/sx.js';
4
+ export type AvatarSize = 'sm' | 'md' | 'lg' | 'xl';
5
+ export type AvatarRootProps = Omit<HTMLAttributes<HTMLSpanElement>, 'children'> & {
6
+ /**
7
+ * The person's name. It becomes the avatar's accessible name and picks the
8
+ * colour behind the initials, so each person keeps theirs.
9
+ */
10
+ name?: string;
11
+ size?: AvatarSize;
12
+ sx?: Sx;
13
+ ref?: HTMLSpanElement | null;
14
+ /** An Avatar.Image and an Avatar.Fallback. */
15
+ children?: Snippet;
16
+ };
17
+ declare const AvatarRoot: import("svelte").Component<AvatarRootProps, {}, "ref">;
18
+ type AvatarRoot = ReturnType<typeof AvatarRoot>;
19
+ export default AvatarRoot;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Where the image stands. `none` until an Avatar.Image is placed; Fallback hides
3
+ * only once the image has actually loaded.
4
+ */
5
+ export type AvatarImageStatus = 'none' | 'loading' | 'loaded' | 'error';
6
+ export type AvatarContext = {
7
+ status: AvatarImageStatus;
8
+ readonly name: string | undefined;
9
+ };
10
+ export declare function setAvatarContext(context: AvatarContext): void;
11
+ export declare function getAvatarContext(part: string): AvatarContext;
@@ -0,0 +1,11 @@
1
+ import { getContext, setContext } from 'svelte';
2
+ const KEY = Symbol('narvi.avatar');
3
+ export function setAvatarContext(context) {
4
+ setContext(KEY, context);
5
+ }
6
+ export function getAvatarContext(part) {
7
+ const context = getContext(KEY);
8
+ if (!context)
9
+ throw new Error(`<Avatar.${part}> must be placed inside <Avatar.Root>.`);
10
+ return context;
11
+ }
@@ -0,0 +1,7 @@
1
+ import Fallback from './AvatarFallback.svelte';
2
+ import Image from './AvatarImage.svelte';
3
+ import Root from './AvatarRoot.svelte';
4
+ export { Root, Image, Fallback, Root as AvatarRoot, Image as AvatarImage, Fallback as AvatarFallback };
5
+ export type { AvatarFallbackProps } from './AvatarFallback.svelte';
6
+ export type { AvatarImageProps } from './AvatarImage.svelte';
7
+ export type { AvatarRootProps, AvatarSize } from './AvatarRoot.svelte';
@@ -0,0 +1,6 @@
1
+ import Fallback from './AvatarFallback.svelte';
2
+ import Image from './AvatarImage.svelte';
3
+ import Root from './AvatarRoot.svelte';
4
+ export { Root, Image, Fallback,
5
+ //
6
+ Root as AvatarRoot, Image as AvatarImage, Fallback as AvatarFallback };
@@ -0,0 +1,78 @@
1
+ <script lang="ts" module>
2
+ import * as stylex from '@stylexjs/stylex';
3
+ import type { Snippet } from 'svelte';
4
+ import type { HTMLAttributes } from 'svelte/elements';
5
+ import { shared } from '../../internal/shared.js';
6
+ import { attrs, type Sx } from '../../internal/sx.js';
7
+ import { colors, font, radius } from '../../tokens.stylex.js';
8
+
9
+ export type BadgeTone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger';
10
+
11
+ export type BadgeProps = Omit<HTMLAttributes<HTMLSpanElement>, 'children'> & {
12
+ /** Colour of the dot. The words stay in the text colour, so they are always readable. */
13
+ tone?: BadgeTone;
14
+ /** Hides the dot, for a plain label or a count. */
15
+ plain?: boolean;
16
+ sx?: Sx;
17
+ children?: Snippet;
18
+ };
19
+
20
+ const styles = stylex.create({
21
+ base: {
22
+ display: 'inline-flex',
23
+ alignItems: 'center',
24
+ gap: '0.375rem',
25
+ boxSizing: 'border-box',
26
+ minHeight: '1.375rem',
27
+ paddingInline: '0.5rem',
28
+ // A pill at the default scale, squarer when it is sharp
29
+ borderRadius: radius.xl,
30
+ boxShadow: `inset 0 0 0 1px ${colors.lineStrong}`,
31
+ color: colors.textMuted,
32
+ fontFamily: font.body,
33
+ fontSize: font.sizeXs,
34
+ fontWeight: font.weightMedium,
35
+ fontVariantNumeric: 'tabular-nums',
36
+ lineHeight: 1,
37
+ whiteSpace: 'nowrap',
38
+ verticalAlign: 'middle'
39
+ },
40
+ dot: {
41
+ flexShrink: 0,
42
+ width: '0.375rem',
43
+ height: '0.375rem',
44
+ borderRadius: radius.full,
45
+ forcedColorAdjust: 'none'
46
+ },
47
+ lit: { color: colors.text }
48
+ });
49
+
50
+ const dots = stylex.create({
51
+ neutral: { backgroundColor: colors.textSubtle },
52
+ accent: { backgroundColor: colors.ithil, boxShadow: `0 0 8px ${colors.glow}` },
53
+ success: { backgroundColor: colors.success },
54
+ warning: { backgroundColor: colors.warning },
55
+ danger: { backgroundColor: colors.danger }
56
+ });
57
+ </script>
58
+
59
+ <script lang="ts">
60
+ let {
61
+ tone = 'neutral',
62
+ plain = false,
63
+ sx,
64
+ class: className,
65
+ children,
66
+ ...rest
67
+ }: BadgeProps = $props();
68
+ </script>
69
+
70
+ <span
71
+ {...rest}
72
+ {...attrs([styles.base, shared.edged, tone === 'accent' && styles.lit, sx], className)}
73
+ >
74
+ {#if !plain}
75
+ <span aria-hidden="true" {...stylex.attrs(styles.dot, dots[tone])}></span>
76
+ {/if}
77
+ {@render children?.()}
78
+ </span>
@@ -0,0 +1,15 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import { type Sx } from '../../internal/sx.js';
4
+ export type BadgeTone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger';
5
+ export type BadgeProps = Omit<HTMLAttributes<HTMLSpanElement>, 'children'> & {
6
+ /** Colour of the dot. The words stay in the text colour, so they are always readable. */
7
+ tone?: BadgeTone;
8
+ /** Hides the dot, for a plain label or a count. */
9
+ plain?: boolean;
10
+ sx?: Sx;
11
+ children?: Snippet;
12
+ };
13
+ declare const Badge: import("svelte").Component<BadgeProps, {}, "">;
14
+ type Badge = ReturnType<typeof Badge>;
15
+ export default Badge;
@@ -0,0 +1,270 @@
1
+ <script lang="ts" module>
2
+ import * as stylex from '@stylexjs/stylex';
3
+ import type { Snippet } from 'svelte';
4
+ import type { HTMLAnchorAttributes, HTMLButtonAttributes } from 'svelte/elements';
5
+ import { shared } from '../../internal/shared.js';
6
+ import { attrs, type Sx } from '../../internal/sx.js';
7
+ import { colors, font, motion, radius } from '../../tokens.stylex.js';
8
+ import Spinner from '../spinner/Spinner.svelte';
9
+
10
+ export type ButtonVariant = 'primary' | 'secondary' | 'soft' | 'ghost' | 'danger';
11
+ export type ButtonSize = 'sm' | 'md' | 'lg';
12
+
13
+ export type ButtonProps = Omit<HTMLButtonAttributes & HTMLAnchorAttributes, 'children'> & {
14
+ variant?: ButtonVariant;
15
+ size?: ButtonSize;
16
+ /** Shows a spinner and blocks interaction while keeping the button's width. */
17
+ loading?: boolean;
18
+ disabled?: boolean;
19
+ /** Square button for a single icon. Give it an `aria-label`. */
20
+ iconOnly?: boolean;
21
+ /** Renders a link styled as a button. */
22
+ href?: string;
23
+ sx?: Sx;
24
+ ref?: HTMLButtonElement | HTMLAnchorElement | null;
25
+ children?: Snippet;
26
+ };
27
+
28
+ // StyleX needs these in the same file to evaluate them at build time
29
+ const HOVER = '@media (hover: hover) and (pointer: fine)';
30
+ const MOTION = '@media (prefers-reduced-motion: no-preference)';
31
+
32
+ const styles = stylex.create({
33
+ base: {
34
+ position: 'relative',
35
+ display: 'inline-flex',
36
+ alignItems: 'center',
37
+ justifyContent: 'center',
38
+ flexShrink: 0,
39
+ boxSizing: 'border-box',
40
+ margin: 0,
41
+ borderWidth: 0,
42
+ fontFamily: font.body,
43
+ fontWeight: font.weightMedium,
44
+ lineHeight: 1,
45
+ whiteSpace: 'nowrap',
46
+ textDecoration: 'none',
47
+ cursor: 'pointer',
48
+ userSelect: 'none',
49
+ appearance: 'none',
50
+ WebkitTapHighlightColor: 'transparent',
51
+ // Press feedback, only for people who have not asked for less motion
52
+ scale: { default: null, ':active': { default: null, [MOTION]: 0.96 } },
53
+ // The press answers at once with a strong ease-out. Hover colours use a plain ease.
54
+ transitionProperty: {
55
+ default: 'background-color, color, filter',
56
+ [MOTION]: 'scale, background-color, color, filter'
57
+ },
58
+ transitionDuration: motion.base,
59
+ transitionTimingFunction: {
60
+ default: 'ease',
61
+ [MOTION]: `${motion.easeOut}, ease, ease, ease`
62
+ }
63
+ },
64
+
65
+ // Sizes. Small and medium extend their hit area to 40px without moving the layout.
66
+ sm: {
67
+ minHeight: '1.75rem',
68
+ paddingInline: '0.625rem',
69
+ gap: '0.375rem',
70
+ borderRadius: radius.sm,
71
+ fontSize: font.sizeSm,
72
+ '::after': { content: '""', position: 'absolute', insetInline: 0, insetBlock: '-6px' }
73
+ },
74
+ md: {
75
+ minHeight: '2rem',
76
+ paddingInline: '0.75rem',
77
+ gap: '0.4375rem',
78
+ borderRadius: radius.md,
79
+ fontSize: font.sizeMd,
80
+ '::after': { content: '""', position: 'absolute', insetInline: 0, insetBlock: '-4px' }
81
+ },
82
+ lg: {
83
+ minHeight: '2.5rem',
84
+ paddingInline: '1rem',
85
+ gap: '0.5rem',
86
+ borderRadius: radius.lg,
87
+ fontSize: '0.9375rem'
88
+ },
89
+ iconSm: { width: '1.75rem', paddingInline: 0 },
90
+ iconMd: { width: '2rem', paddingInline: 0 },
91
+ iconLg: { width: '2.5rem', paddingInline: 0 },
92
+
93
+ // Mithril: a small piece of bright metal
94
+ primary: {
95
+ color: colors.onMithril,
96
+ backgroundImage: `linear-gradient(180deg, ${colors.mithrilTop}, ${colors.mithrilBottom})`,
97
+ boxShadow: `inset 0 1px 0 ${colors.mithrilEdge}, inset 0 -1px 0 rgb(0 0 0 / 0.14), 0 1px 2px rgb(0 0 0 / 0.4), 0 10px 22px -10px ${colors.mithrilDrop}`,
98
+ filter: { default: null, ':hover': { default: null, [HOVER]: 'brightness(1.06)' } },
99
+ // The deeper hover shadow is a layer of its own that fades in. Fading
100
+ // opacity is cheap; animating the shadow itself repaints it every frame.
101
+ '::before': {
102
+ content: '""',
103
+ position: 'absolute',
104
+ inset: 0,
105
+ borderRadius: 'inherit',
106
+ boxShadow: `0 12px 22px -10px ${colors.mithrilDrop}`,
107
+ opacity: { default: 0, ':hover': { default: null, [HOVER]: 1 } },
108
+ pointerEvents: 'none',
109
+ transitionProperty: 'opacity',
110
+ transitionDuration: motion.base,
111
+ transitionTimingFunction: 'ease'
112
+ }
113
+ },
114
+ secondary: {
115
+ color: colors.text,
116
+ backgroundColor: {
117
+ default: colors.surfaceRaised,
118
+ ':hover': { default: null, [HOVER]: colors.hover }
119
+ },
120
+ boxShadow: `inset 0 0 0 1px ${colors.lineStrong}, inset 0 1px 0 ${colors.highlight}, 0 1px 2px ${colors.shade}`
121
+ },
122
+ soft: {
123
+ color: colors.ithil,
124
+ backgroundColor: {
125
+ default: colors.ithilSoft,
126
+ ':hover': { default: null, [HOVER]: colors.focusHalo }
127
+ }
128
+ },
129
+ ghost: {
130
+ color: {
131
+ default: colors.textMuted,
132
+ ':hover': { default: null, [HOVER]: colors.text }
133
+ },
134
+ backgroundColor: {
135
+ default: 'transparent',
136
+ ':hover': { default: null, [HOVER]: colors.hover }
137
+ }
138
+ },
139
+ danger: {
140
+ color: colors.danger,
141
+ backgroundColor: {
142
+ default: 'transparent',
143
+ ':hover': {
144
+ default: null,
145
+ [HOVER]: `color-mix(in oklab, ${colors.danger} 12%, transparent)`
146
+ }
147
+ },
148
+ boxShadow: `inset 0 0 0 1px color-mix(in oklab, ${colors.danger} 45%, transparent)`
149
+ },
150
+
151
+ // States
152
+ disabled: {
153
+ opacity: 0.5,
154
+ cursor: 'not-allowed',
155
+ pointerEvents: 'none'
156
+ },
157
+ loading: {
158
+ cursor: 'progress',
159
+ pointerEvents: 'none'
160
+ },
161
+ content: {
162
+ display: 'inline-flex',
163
+ alignItems: 'center',
164
+ justifyContent: 'center',
165
+ gap: 'inherit',
166
+ transitionProperty: { default: 'opacity', [MOTION]: 'opacity, filter' },
167
+ transitionDuration: motion.base,
168
+ transitionTimingFunction: motion.easeOut
169
+ },
170
+ // A little blur as the label leaves, so label and spinner read as one change
171
+ // and not two things overlapping
172
+ contentHidden: {
173
+ opacity: 0,
174
+ filter: { default: null, [MOTION]: 'blur(2px)' }
175
+ },
176
+ // The spinner fades in as the label fades out. It leaves at once: when the
177
+ // work is done, the label should be back without delay.
178
+ spinner: {
179
+ position: 'absolute',
180
+ inset: 0,
181
+ display: 'grid',
182
+ placeItems: 'center',
183
+ opacity: { default: 1, '@starting-style': 0 },
184
+ scale: { default: null, [MOTION]: { default: 1, '@starting-style': 0.9 } },
185
+ transitionProperty: { default: 'opacity', [MOTION]: 'opacity, scale' },
186
+ transitionDuration: motion.base,
187
+ transitionTimingFunction: motion.easeOut
188
+ }
189
+ });
190
+
191
+ const iconStyles = { sm: styles.iconSm, md: styles.iconMd, lg: styles.iconLg };
192
+ </script>
193
+
194
+ <script lang="ts">
195
+ let {
196
+ variant = 'secondary',
197
+ size = 'md',
198
+ loading = false,
199
+ disabled = false,
200
+ iconOnly = false,
201
+ href,
202
+ type = 'button',
203
+ sx,
204
+ class: className,
205
+ ref = $bindable(null),
206
+ children,
207
+ ...rest
208
+ }: ButtonProps = $props();
209
+
210
+ const inert = $derived(disabled || loading);
211
+
212
+ const rootAttrs = $derived(
213
+ attrs(
214
+ [
215
+ styles.base,
216
+ shared.focusable,
217
+ styles[size],
218
+ iconOnly && iconStyles[size],
219
+ styles[variant],
220
+ disabled && styles.disabled,
221
+ loading && styles.loading,
222
+ sx
223
+ ],
224
+ className
225
+ )
226
+ );
227
+ </script>
228
+
229
+ {#snippet content()}
230
+ <span {...stylex.attrs(styles.content, loading && styles.contentHidden)}>
231
+ {@render children?.()}
232
+ </span>
233
+ {#if loading}
234
+ <span {...stylex.attrs(styles.spinner)}>
235
+ <Spinner size={16} label="Loading" />
236
+ </span>
237
+ {/if}
238
+ {/snippet}
239
+
240
+ {#if href !== undefined}
241
+ <a
242
+ bind:this={ref}
243
+ href={inert ? undefined : href}
244
+ role={inert ? 'link' : undefined}
245
+ aria-disabled={inert ? true : undefined}
246
+ aria-busy={loading ? true : undefined}
247
+ {...rest}
248
+ {...rootAttrs}
249
+ >
250
+ {@render content()}
251
+ </a>
252
+ {:else}
253
+ <button
254
+ bind:this={ref}
255
+ {type}
256
+ disabled={disabled || undefined}
257
+ aria-disabled={loading ? true : undefined}
258
+ aria-busy={loading ? true : undefined}
259
+ {...rest}
260
+ {...rootAttrs}
261
+ onclick={loading
262
+ ? (event) => {
263
+ event.preventDefault();
264
+ event.stopPropagation();
265
+ }
266
+ : rest.onclick}
267
+ >
268
+ {@render content()}
269
+ </button>
270
+ {/if}
@@ -0,0 +1,22 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLAnchorAttributes, HTMLButtonAttributes } from 'svelte/elements';
3
+ import { type Sx } from '../../internal/sx.js';
4
+ export type ButtonVariant = 'primary' | 'secondary' | 'soft' | 'ghost' | 'danger';
5
+ export type ButtonSize = 'sm' | 'md' | 'lg';
6
+ export type ButtonProps = Omit<HTMLButtonAttributes & HTMLAnchorAttributes, 'children'> & {
7
+ variant?: ButtonVariant;
8
+ size?: ButtonSize;
9
+ /** Shows a spinner and blocks interaction while keeping the button's width. */
10
+ loading?: boolean;
11
+ disabled?: boolean;
12
+ /** Square button for a single icon. Give it an `aria-label`. */
13
+ iconOnly?: boolean;
14
+ /** Renders a link styled as a button. */
15
+ href?: string;
16
+ sx?: Sx;
17
+ ref?: HTMLButtonElement | HTMLAnchorElement | null;
18
+ children?: Snippet;
19
+ };
20
+ declare const Button: import("svelte").Component<ButtonProps, {}, "ref">;
21
+ type Button = ReturnType<typeof Button>;
22
+ export default Button;