@thomasfosterau/components 0.0.0 → 0.2.0

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 (484) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +241 -56
  3. package/dist/canvas/VectorCanvas.svelte +320 -0
  4. package/dist/canvas/VectorCanvas.svelte.d.ts +105 -0
  5. package/dist/canvas/history.d.ts +105 -0
  6. package/dist/canvas/history.js +147 -0
  7. package/dist/canvas/index.d.ts +15 -0
  8. package/dist/canvas/index.js +14 -0
  9. package/dist/canvas/types.d.ts +91 -0
  10. package/dist/canvas/types.js +13 -0
  11. package/dist/canvas/utils.d.ts +66 -0
  12. package/dist/canvas/utils.js +114 -0
  13. package/dist/charts/Chart.svelte +300 -0
  14. package/dist/charts/Chart.svelte.d.ts +50 -0
  15. package/dist/charts/index.d.ts +11 -0
  16. package/dist/charts/index.js +10 -0
  17. package/dist/charts/types.d.ts +28 -0
  18. package/dist/charts/types.js +6 -0
  19. package/dist/citations/BookCitation.svelte +53 -0
  20. package/dist/citations/BookCitation.svelte.d.ts +41 -0
  21. package/dist/citations/ChapterCitation.svelte +38 -0
  22. package/dist/citations/ChapterCitation.svelte.d.ts +50 -0
  23. package/dist/citations/Citation.svelte +47 -0
  24. package/dist/citations/Citation.svelte.d.ts +24 -0
  25. package/dist/citations/CreditList.svelte +69 -0
  26. package/dist/citations/CreditList.svelte.d.ts +47 -0
  27. package/dist/citations/DOILink.svelte +28 -0
  28. package/dist/citations/DOILink.svelte.d.ts +19 -0
  29. package/dist/citations/Footnote.svelte +39 -0
  30. package/dist/citations/Footnote.svelte.d.ts +17 -0
  31. package/dist/citations/FootnoteList.svelte +36 -0
  32. package/dist/citations/FootnoteList.svelte.d.ts +21 -0
  33. package/dist/citations/ISBNLink.svelte +29 -0
  34. package/dist/citations/ISBNLink.svelte.d.ts +19 -0
  35. package/dist/citations/ISSNLink.svelte +29 -0
  36. package/dist/citations/ISSNLink.svelte.d.ts +19 -0
  37. package/dist/citations/Publisher.svelte +34 -0
  38. package/dist/citations/Publisher.svelte.d.ts +14 -0
  39. package/dist/citations/ReferenceList.svelte +53 -0
  40. package/dist/citations/ReferenceList.svelte.d.ts +21 -0
  41. package/dist/citations/ReportCitation.svelte +41 -0
  42. package/dist/citations/ReportCitation.svelte.d.ts +36 -0
  43. package/dist/citations/ScholarlyArticleCitation.svelte +64 -0
  44. package/dist/citations/ScholarlyArticleCitation.svelte.d.ts +41 -0
  45. package/dist/citations/ThesisCitation.svelte +35 -0
  46. package/dist/citations/ThesisCitation.svelte.d.ts +29 -0
  47. package/dist/citations/bibliography.svelte.d.ts +55 -0
  48. package/dist/citations/bibliography.svelte.js +78 -0
  49. package/dist/citations/citation.d.ts +71 -0
  50. package/dist/citations/citation.js +121 -0
  51. package/dist/citations/csl.d.ts +102 -0
  52. package/dist/citations/csl.js +20 -0
  53. package/dist/citations/index.d.ts +31 -0
  54. package/dist/citations/index.js +36 -0
  55. package/dist/citations/list-format.d.ts +34 -0
  56. package/dist/citations/list-format.js +40 -0
  57. package/dist/context.svelte.d.ts +46 -0
  58. package/dist/context.svelte.js +51 -0
  59. package/dist/data/ChatBubble.svelte +48 -0
  60. package/dist/data/ChatBubble.svelte.d.ts +33 -0
  61. package/dist/data/DataGrid.svelte +150 -0
  62. package/dist/data/DataGrid.svelte.d.ts +118 -0
  63. package/dist/data/DescriptionList.svelte +53 -0
  64. package/dist/data/DescriptionList.svelte.d.ts +26 -0
  65. package/dist/data/DescriptionRow.svelte +56 -0
  66. package/dist/data/DescriptionRow.svelte.d.ts +21 -0
  67. package/dist/data/DiffText.svelte +29 -0
  68. package/dist/data/DiffText.svelte.d.ts +19 -0
  69. package/dist/data/ItemList.svelte +80 -0
  70. package/dist/data/ItemList.svelte.d.ts +52 -0
  71. package/dist/data/LinkListItem.svelte +46 -0
  72. package/dist/data/LinkListItem.svelte.d.ts +21 -0
  73. package/dist/data/MessageThread.svelte +29 -0
  74. package/dist/data/MessageThread.svelte.d.ts +17 -0
  75. package/dist/data/Pagination.svelte +136 -0
  76. package/dist/data/Pagination.svelte.d.ts +79 -0
  77. package/dist/data/PaginationFooter.svelte +42 -0
  78. package/dist/data/PaginationFooter.svelte.d.ts +61 -0
  79. package/dist/data/ResultCount.svelte +27 -0
  80. package/dist/data/ResultCount.svelte.d.ts +18 -0
  81. package/dist/data/Table.svelte +151 -0
  82. package/dist/data/Table.svelte.d.ts +75 -0
  83. package/dist/data/TreeList.svelte +41 -0
  84. package/dist/data/TreeList.svelte.d.ts +17 -0
  85. package/dist/data/TreeListItem.svelte +29 -0
  86. package/dist/data/TreeListItem.svelte.d.ts +10 -0
  87. package/dist/data/description-context.d.ts +39 -0
  88. package/dist/data/description-context.js +36 -0
  89. package/dist/data/diff.d.ts +14 -0
  90. package/dist/data/diff.js +10 -0
  91. package/dist/data/index.d.ts +37 -0
  92. package/dist/data/index.js +37 -0
  93. package/dist/data/list-item.d.ts +30 -0
  94. package/dist/data/list-item.js +19 -0
  95. package/dist/data/pagination.d.ts +81 -0
  96. package/dist/data/pagination.js +79 -0
  97. package/dist/data/table-types.d.ts +71 -0
  98. package/dist/data/table-types.js +35 -0
  99. package/dist/feedback/ConfirmDialog.svelte +79 -0
  100. package/dist/feedback/ConfirmDialog.svelte.d.ts +82 -0
  101. package/dist/feedback/Dialog.svelte +47 -0
  102. package/dist/feedback/Dialog.svelte.d.ts +36 -0
  103. package/dist/feedback/DialogFrame.svelte +64 -0
  104. package/dist/feedback/DialogFrame.svelte.d.ts +23 -0
  105. package/dist/feedback/Drawer.svelte +43 -0
  106. package/dist/feedback/Drawer.svelte.d.ts +43 -0
  107. package/dist/feedback/LoadingBoundary.svelte +61 -0
  108. package/dist/feedback/LoadingBoundary.svelte.d.ts +34 -0
  109. package/dist/feedback/ProgressBar.svelte +46 -0
  110. package/dist/feedback/ProgressBar.svelte.d.ts +28 -0
  111. package/dist/feedback/SegmentBar.svelte +83 -0
  112. package/dist/feedback/SegmentBar.svelte.d.ts +37 -0
  113. package/dist/feedback/StatTile.svelte +77 -0
  114. package/dist/feedback/StatTile.svelte.d.ts +50 -0
  115. package/dist/feedback/Stats.svelte +18 -0
  116. package/dist/feedback/Stats.svelte.d.ts +16 -0
  117. package/dist/feedback/Steps.svelte +72 -0
  118. package/dist/feedback/Steps.svelte.d.ts +61 -0
  119. package/dist/feedback/Timeline.svelte +86 -0
  120. package/dist/feedback/Timeline.svelte.d.ts +55 -0
  121. package/dist/feedback/Toaster.svelte +78 -0
  122. package/dist/feedback/Toaster.svelte.d.ts +32 -0
  123. package/dist/feedback/index.d.ts +34 -0
  124. package/dist/feedback/index.js +29 -0
  125. package/dist/feedback/sizes.d.ts +41 -0
  126. package/dist/feedback/sizes.js +69 -0
  127. package/dist/feedback/toaster.d.ts +48 -0
  128. package/dist/feedback/toaster.js +29 -0
  129. package/dist/fields/Calendar.svelte +60 -0
  130. package/dist/fields/Calendar.svelte.d.ts +11 -0
  131. package/dist/fields/CalendarMonths.svelte +86 -0
  132. package/dist/fields/CalendarMonths.svelte.d.ts +30 -0
  133. package/dist/fields/Checkbox.svelte +33 -0
  134. package/dist/fields/Checkbox.svelte.d.ts +30 -0
  135. package/dist/fields/CheckboxGroup.svelte +41 -0
  136. package/dist/fields/CheckboxGroup.svelte.d.ts +40 -0
  137. package/dist/fields/Combobox.svelte +229 -0
  138. package/dist/fields/Combobox.svelte.d.ts +133 -0
  139. package/dist/fields/DateField.svelte +37 -0
  140. package/dist/fields/DateField.svelte.d.ts +20 -0
  141. package/dist/fields/DateInput.svelte +31 -0
  142. package/dist/fields/DateInput.svelte.d.ts +35 -0
  143. package/dist/fields/DatePicker.svelte +47 -0
  144. package/dist/fields/DatePicker.svelte.d.ts +25 -0
  145. package/dist/fields/DateRangePicker.svelte +70 -0
  146. package/dist/fields/DateRangePicker.svelte.d.ts +43 -0
  147. package/dist/fields/Dropzone.svelte +232 -0
  148. package/dist/fields/Dropzone.svelte.d.ts +103 -0
  149. package/dist/fields/FieldErrors.svelte +30 -0
  150. package/dist/fields/FieldErrors.svelte.d.ts +11 -0
  151. package/dist/fields/Fieldset.svelte +53 -0
  152. package/dist/fields/Fieldset.svelte.d.ts +27 -0
  153. package/dist/fields/FileInput.svelte +68 -0
  154. package/dist/fields/FileInput.svelte.d.ts +39 -0
  155. package/dist/fields/FormField.svelte +78 -0
  156. package/dist/fields/FormField.svelte.d.ts +29 -0
  157. package/dist/fields/ImageInput.svelte +87 -0
  158. package/dist/fields/ImageInput.svelte.d.ts +45 -0
  159. package/dist/fields/MultiSelect.svelte +112 -0
  160. package/dist/fields/MultiSelect.svelte.d.ts +75 -0
  161. package/dist/fields/NumberField.svelte +190 -0
  162. package/dist/fields/NumberField.svelte.d.ts +76 -0
  163. package/dist/fields/PasswordInput.svelte +95 -0
  164. package/dist/fields/PasswordInput.svelte.d.ts +58 -0
  165. package/dist/fields/PickerPopover.svelte +47 -0
  166. package/dist/fields/PickerPopover.svelte.d.ts +16 -0
  167. package/dist/fields/PinInput.svelte +83 -0
  168. package/dist/fields/PinInput.svelte.d.ts +66 -0
  169. package/dist/fields/PushToggle.svelte +93 -0
  170. package/dist/fields/PushToggle.svelte.d.ts +55 -0
  171. package/dist/fields/RadioGroup.svelte +88 -0
  172. package/dist/fields/RadioGroup.svelte.d.ts +41 -0
  173. package/dist/fields/RangeCalendar.svelte +51 -0
  174. package/dist/fields/RangeCalendar.svelte.d.ts +23 -0
  175. package/dist/fields/Rating.svelte +127 -0
  176. package/dist/fields/Rating.svelte.d.ts +86 -0
  177. package/dist/fields/SearchInput.svelte +58 -0
  178. package/dist/fields/SearchInput.svelte.d.ts +33 -0
  179. package/dist/fields/SegmentGroup.svelte +91 -0
  180. package/dist/fields/SegmentGroup.svelte.d.ts +20 -0
  181. package/dist/fields/Select.svelte +36 -0
  182. package/dist/fields/Select.svelte.d.ts +35 -0
  183. package/dist/fields/Slider.svelte +194 -0
  184. package/dist/fields/Slider.svelte.d.ts +100 -0
  185. package/dist/fields/TagsInput.svelte +256 -0
  186. package/dist/fields/TagsInput.svelte.d.ts +102 -0
  187. package/dist/fields/TextInput.svelte +26 -0
  188. package/dist/fields/TextInput.svelte.d.ts +36 -0
  189. package/dist/fields/Textarea.svelte +22 -0
  190. package/dist/fields/Textarea.svelte.d.ts +31 -0
  191. package/dist/fields/TimeField.svelte +30 -0
  192. package/dist/fields/TimeField.svelte.d.ts +19 -0
  193. package/dist/fields/Toggle.svelte +72 -0
  194. package/dist/fields/Toggle.svelte.d.ts +38 -0
  195. package/dist/fields/VideoInput.svelte +35 -0
  196. package/dist/fields/VideoInput.svelte.d.ts +46 -0
  197. package/dist/fields/calendar-props.d.ts +119 -0
  198. package/dist/fields/calendar-props.js +51 -0
  199. package/dist/fields/dates.d.ts +28 -0
  200. package/dist/fields/dates.js +26 -0
  201. package/dist/fields/field-types.d.ts +80 -0
  202. package/dist/fields/field-types.js +92 -0
  203. package/dist/fields/file-validation.d.ts +30 -0
  204. package/dist/fields/file-validation.js +51 -0
  205. package/dist/fields/index.d.ts +43 -0
  206. package/dist/fields/index.js +42 -0
  207. package/dist/fields/latest-search.svelte.d.ts +38 -0
  208. package/dist/fields/latest-search.svelte.js +85 -0
  209. package/dist/fields/number-format.d.ts +52 -0
  210. package/dist/fields/number-format.js +89 -0
  211. package/dist/fields/segmented-field.d.ts +128 -0
  212. package/dist/fields/segmented-field.js +52 -0
  213. package/dist/fields/slider-keys.d.ts +21 -0
  214. package/dist/fields/slider-keys.js +37 -0
  215. package/dist/formatting/Countdown.svelte +110 -0
  216. package/dist/formatting/Countdown.svelte.d.ts +35 -0
  217. package/dist/formatting/DateTime.svelte +35 -0
  218. package/dist/formatting/DateTime.svelte.d.ts +26 -0
  219. package/dist/formatting/Duration.svelte +18 -0
  220. package/dist/formatting/Duration.svelte.d.ts +20 -0
  221. package/dist/formatting/FormatList.svelte +31 -0
  222. package/dist/formatting/FormatList.svelte.d.ts +46 -0
  223. package/dist/formatting/Highlight.svelte +51 -0
  224. package/dist/formatting/Highlight.svelte.d.ts +19 -0
  225. package/dist/formatting/Number.svelte +35 -0
  226. package/dist/formatting/Number.svelte.d.ts +43 -0
  227. package/dist/formatting/RelativeTime.svelte +69 -0
  228. package/dist/formatting/RelativeTime.svelte.d.ts +26 -0
  229. package/dist/formatting/Year.svelte +39 -0
  230. package/dist/formatting/Year.svelte.d.ts +21 -0
  231. package/dist/formatting/duration.d.ts +44 -0
  232. package/dist/formatting/duration.js +125 -0
  233. package/dist/formatting/index.d.ts +15 -0
  234. package/dist/formatting/index.js +17 -0
  235. package/dist/forms/EntityForm.svelte +185 -0
  236. package/dist/forms/EntityForm.svelte.d.ts +66 -0
  237. package/dist/forms/FormActions.svelte +29 -0
  238. package/dist/forms/FormActions.svelte.d.ts +37 -0
  239. package/dist/forms/FormErrors.svelte +21 -0
  240. package/dist/forms/FormErrors.svelte.d.ts +16 -0
  241. package/dist/forms/HiddenField.svelte +22 -0
  242. package/dist/forms/HiddenField.svelte.d.ts +11 -0
  243. package/dist/forms/SearchForm.svelte +43 -0
  244. package/dist/forms/SearchForm.svelte.d.ts +36 -0
  245. package/dist/forms/entity-form.d.ts +12 -0
  246. package/dist/forms/entity-form.js +12 -0
  247. package/dist/forms/index.d.ts +14 -0
  248. package/dist/forms/index.js +14 -0
  249. package/dist/hotkeys/HotkeyBadge.svelte +39 -0
  250. package/dist/hotkeys/HotkeyBadge.svelte.d.ts +25 -0
  251. package/dist/hotkeys/HotkeyHelpDialog.svelte +68 -0
  252. package/dist/hotkeys/HotkeyHelpDialog.svelte.d.ts +35 -0
  253. package/dist/hotkeys/HotkeyProvider.svelte +92 -0
  254. package/dist/hotkeys/HotkeyProvider.svelte.d.ts +4 -0
  255. package/dist/hotkeys/context.svelte.d.ts +47 -0
  256. package/dist/hotkeys/context.svelte.js +72 -0
  257. package/dist/hotkeys/index.d.ts +28 -0
  258. package/dist/hotkeys/index.js +27 -0
  259. package/dist/hotkeys/match.d.ts +65 -0
  260. package/dist/hotkeys/match.js +135 -0
  261. package/dist/hotkeys/registry.svelte.d.ts +55 -0
  262. package/dist/hotkeys/registry.svelte.js +110 -0
  263. package/dist/hotkeys/types.d.ts +74 -0
  264. package/dist/hotkeys/types.js +18 -0
  265. package/dist/index.d.ts +37 -0
  266. package/dist/index.js +37 -0
  267. package/dist/infobox/Infobox.svelte +79 -0
  268. package/dist/infobox/Infobox.svelte.d.ts +33 -0
  269. package/dist/infobox/InfoboxHeader.svelte +35 -0
  270. package/dist/infobox/InfoboxHeader.svelte.d.ts +18 -0
  271. package/dist/infobox/InfoboxImage.svelte +38 -0
  272. package/dist/infobox/InfoboxImage.svelte.d.ts +21 -0
  273. package/dist/infobox/InfoboxRow.svelte +50 -0
  274. package/dist/infobox/InfoboxRow.svelte.d.ts +25 -0
  275. package/dist/infobox/InfoboxSection.svelte +24 -0
  276. package/dist/infobox/InfoboxSection.svelte.d.ts +12 -0
  277. package/dist/infobox/index.d.ts +21 -0
  278. package/dist/infobox/index.js +20 -0
  279. package/dist/infobox/types.d.ts +86 -0
  280. package/dist/infobox/types.js +27 -0
  281. package/dist/layout/AppShell.svelte +50 -0
  282. package/dist/layout/AppShell.svelte.d.ts +28 -0
  283. package/dist/layout/Breadcrumbs.svelte +52 -0
  284. package/dist/layout/Breadcrumbs.svelte.d.ts +18 -0
  285. package/dist/layout/Cluster.svelte +28 -0
  286. package/dist/layout/Cluster.svelte.d.ts +27 -0
  287. package/dist/layout/DetailLayout.svelte +50 -0
  288. package/dist/layout/DetailLayout.svelte.d.ts +19 -0
  289. package/dist/layout/FilterBar.svelte +40 -0
  290. package/dist/layout/FilterBar.svelte.d.ts +12 -0
  291. package/dist/layout/Fits.svelte +27 -0
  292. package/dist/layout/Fits.svelte.d.ts +13 -0
  293. package/dist/layout/Flow.svelte +46 -0
  294. package/dist/layout/Flow.svelte.d.ts +16 -0
  295. package/dist/layout/Footer.svelte +32 -0
  296. package/dist/layout/Footer.svelte.d.ts +12 -0
  297. package/dist/layout/Grid.svelte +23 -0
  298. package/dist/layout/Grid.svelte.d.ts +26 -0
  299. package/dist/layout/HStack.svelte +12 -0
  300. package/dist/layout/HStack.svelte.d.ts +34 -0
  301. package/dist/layout/Hero.svelte +76 -0
  302. package/dist/layout/Hero.svelte.d.ts +36 -0
  303. package/dist/layout/Main.svelte +30 -0
  304. package/dist/layout/Main.svelte.d.ts +15 -0
  305. package/dist/layout/Navbar.svelte +68 -0
  306. package/dist/layout/Navbar.svelte.d.ts +31 -0
  307. package/dist/layout/PageHeader.svelte +77 -0
  308. package/dist/layout/PageHeader.svelte.d.ts +33 -0
  309. package/dist/layout/Section.svelte +72 -0
  310. package/dist/layout/Section.svelte.d.ts +40 -0
  311. package/dist/layout/Sidebar.svelte +54 -0
  312. package/dist/layout/Sidebar.svelte.d.ts +27 -0
  313. package/dist/layout/Spacer.svelte +12 -0
  314. package/dist/layout/Spacer.svelte.d.ts +6 -0
  315. package/dist/layout/Tabs.svelte +85 -0
  316. package/dist/layout/Tabs.svelte.d.ts +42 -0
  317. package/dist/layout/VStack.svelte +12 -0
  318. package/dist/layout/VStack.svelte.d.ts +29 -0
  319. package/dist/layout/index.d.ts +38 -0
  320. package/dist/layout/index.js +38 -0
  321. package/dist/layout/space.d.ts +44 -0
  322. package/dist/layout/space.js +76 -0
  323. package/dist/layout/types.d.ts +52 -0
  324. package/dist/layout/types.js +27 -0
  325. package/dist/links/ContextLinks.svelte +28 -0
  326. package/dist/links/ContextLinks.svelte.d.ts +20 -0
  327. package/dist/links/EmailLink.svelte +26 -0
  328. package/dist/links/EmailLink.svelte.d.ts +20 -0
  329. package/dist/links/index.d.ts +7 -0
  330. package/dist/links/index.js +7 -0
  331. package/dist/media/Figure.svelte +26 -0
  332. package/dist/media/Figure.svelte.d.ts +12 -0
  333. package/dist/media/Image.svelte +76 -0
  334. package/dist/media/Image.svelte.d.ts +41 -0
  335. package/dist/media/Video.svelte +65 -0
  336. package/dist/media/Video.svelte.d.ts +29 -0
  337. package/dist/media/image-dimensions.d.ts +28 -0
  338. package/dist/media/image-dimensions.js +34 -0
  339. package/dist/media/index.d.ts +10 -0
  340. package/dist/media/index.js +10 -0
  341. package/dist/search/CommandPalette.svelte +257 -0
  342. package/dist/search/CommandPalette.svelte.d.ts +59 -0
  343. package/dist/search/index.d.ts +13 -0
  344. package/dist/search/index.js +13 -0
  345. package/dist/search/types.d.ts +40 -0
  346. package/dist/search/types.js +20 -0
  347. package/dist/seo/Head.svelte +190 -0
  348. package/dist/seo/Head.svelte.d.ts +86 -0
  349. package/dist/seo/JsonLd.svelte +30 -0
  350. package/dist/seo/JsonLd.svelte.d.ts +20 -0
  351. package/dist/seo/index.d.ts +18 -0
  352. package/dist/seo/index.js +17 -0
  353. package/dist/seo/json-ld.d.ts +33 -0
  354. package/dist/seo/json-ld.js +29 -0
  355. package/dist/seo/og-image.d.ts +72 -0
  356. package/dist/seo/og-image.js +82 -0
  357. package/dist/seo/types.d.ts +43 -0
  358. package/dist/seo/types.js +6 -0
  359. package/dist/theme.css +161 -0
  360. package/dist/tips/PopoverTip.svelte +80 -0
  361. package/dist/tips/PopoverTip.svelte.d.ts +33 -0
  362. package/dist/tips/Tip.svelte +91 -0
  363. package/dist/tips/Tip.svelte.d.ts +25 -0
  364. package/dist/tips/index.d.ts +15 -0
  365. package/dist/tips/index.js +14 -0
  366. package/dist/tips/tip-stack.d.ts +26 -0
  367. package/dist/tips/tip-stack.js +37 -0
  368. package/dist/tips/tip-store.svelte.d.ts +75 -0
  369. package/dist/tips/tip-store.svelte.js +158 -0
  370. package/dist/tips/types.d.ts +46 -0
  371. package/dist/tips/types.js +6 -0
  372. package/dist/ui/Accordion.svelte +75 -0
  373. package/dist/ui/Accordion.svelte.d.ts +50 -0
  374. package/dist/ui/AccordionItem.svelte +73 -0
  375. package/dist/ui/AccordionItem.svelte.d.ts +18 -0
  376. package/dist/ui/Alert.svelte +61 -0
  377. package/dist/ui/Alert.svelte.d.ts +37 -0
  378. package/dist/ui/Badge.svelte +39 -0
  379. package/dist/ui/Badge.svelte.d.ts +32 -0
  380. package/dist/ui/Button.svelte +44 -0
  381. package/dist/ui/Button.svelte.d.ts +29 -0
  382. package/dist/ui/ButtonGroup.svelte +24 -0
  383. package/dist/ui/ButtonGroup.svelte.d.ts +17 -0
  384. package/dist/ui/Card.svelte +49 -0
  385. package/dist/ui/Card.svelte.d.ts +44 -0
  386. package/dist/ui/Chip.svelte +58 -0
  387. package/dist/ui/Chip.svelte.d.ts +21 -0
  388. package/dist/ui/ConfirmButton.svelte +75 -0
  389. package/dist/ui/ConfirmButton.svelte.d.ts +48 -0
  390. package/dist/ui/ContextMenu.svelte +75 -0
  391. package/dist/ui/ContextMenu.svelte.d.ts +25 -0
  392. package/dist/ui/Disclosure.svelte +46 -0
  393. package/dist/ui/Disclosure.svelte.d.ts +22 -0
  394. package/dist/ui/Divider.svelte +47 -0
  395. package/dist/ui/Divider.svelte.d.ts +28 -0
  396. package/dist/ui/DropdownMenu.svelte +44 -0
  397. package/dist/ui/DropdownMenu.svelte.d.ts +30 -0
  398. package/dist/ui/EmptyState.svelte +37 -0
  399. package/dist/ui/EmptyState.svelte.d.ts +22 -0
  400. package/dist/ui/ExternalLink.svelte +38 -0
  401. package/dist/ui/ExternalLink.svelte.d.ts +34 -0
  402. package/dist/ui/Heading.svelte +58 -0
  403. package/dist/ui/Heading.svelte.d.ts +22 -0
  404. package/dist/ui/Link.svelte +34 -0
  405. package/dist/ui/Link.svelte.d.ts +20 -0
  406. package/dist/ui/LinkButton.svelte +51 -0
  407. package/dist/ui/LinkButton.svelte.d.ts +33 -0
  408. package/dist/ui/Menu.svelte +24 -0
  409. package/dist/ui/Menu.svelte.d.ts +13 -0
  410. package/dist/ui/MenuCheckboxItem.svelte +33 -0
  411. package/dist/ui/MenuCheckboxItem.svelte.d.ts +20 -0
  412. package/dist/ui/MenuItem.svelte +73 -0
  413. package/dist/ui/MenuItem.svelte.d.ts +21 -0
  414. package/dist/ui/MenuRadioGroup.svelte +25 -0
  415. package/dist/ui/MenuRadioGroup.svelte.d.ts +20 -0
  416. package/dist/ui/MenuRadioItem.svelte +20 -0
  417. package/dist/ui/MenuRadioItem.svelte.d.ts +15 -0
  418. package/dist/ui/MenuSeparator.svelte +27 -0
  419. package/dist/ui/MenuSeparator.svelte.d.ts +8 -0
  420. package/dist/ui/MenuSub.svelte +24 -0
  421. package/dist/ui/MenuSub.svelte.d.ts +15 -0
  422. package/dist/ui/Popover.svelte +63 -0
  423. package/dist/ui/Popover.svelte.d.ts +40 -0
  424. package/dist/ui/ShareButton.svelte +64 -0
  425. package/dist/ui/ShareButton.svelte.d.ts +39 -0
  426. package/dist/ui/Skeleton.svelte +43 -0
  427. package/dist/ui/Skeleton.svelte.d.ts +22 -0
  428. package/dist/ui/Spinner.svelte +41 -0
  429. package/dist/ui/Spinner.svelte.d.ts +35 -0
  430. package/dist/ui/Stack.svelte +36 -0
  431. package/dist/ui/Stack.svelte.d.ts +48 -0
  432. package/dist/ui/ThemeToggle.svelte +65 -0
  433. package/dist/ui/ThemeToggle.svelte.d.ts +24 -0
  434. package/dist/ui/ToggleButton.svelte +58 -0
  435. package/dist/ui/ToggleButton.svelte.d.ts +45 -0
  436. package/dist/ui/ToggleGroup.svelte +142 -0
  437. package/dist/ui/ToggleGroup.svelte.d.ts +86 -0
  438. package/dist/ui/Toolbar.svelte +40 -0
  439. package/dist/ui/Toolbar.svelte.d.ts +20 -0
  440. package/dist/ui/ToolbarButton.svelte +29 -0
  441. package/dist/ui/ToolbarButton.svelte.d.ts +21 -0
  442. package/dist/ui/ToolbarLink.svelte +21 -0
  443. package/dist/ui/ToolbarLink.svelte.d.ts +12 -0
  444. package/dist/ui/ToolbarSeparator.svelte +22 -0
  445. package/dist/ui/ToolbarSeparator.svelte.d.ts +12 -0
  446. package/dist/ui/ToolbarToggleGroup.svelte +66 -0
  447. package/dist/ui/ToolbarToggleGroup.svelte.d.ts +52 -0
  448. package/dist/ui/Tooltip.svelte +54 -0
  449. package/dist/ui/Tooltip.svelte.d.ts +35 -0
  450. package/dist/ui/VisuallyHidden.svelte +23 -0
  451. package/dist/ui/VisuallyHidden.svelte.d.ts +10 -0
  452. package/dist/ui/accordion-context.d.ts +26 -0
  453. package/dist/ui/accordion-context.js +23 -0
  454. package/dist/ui/colour-token.d.ts +41 -0
  455. package/dist/ui/colour-token.js +49 -0
  456. package/dist/ui/context-menu.d.ts +13 -0
  457. package/dist/ui/context-menu.js +13 -0
  458. package/dist/ui/index.d.ts +63 -0
  459. package/dist/ui/index.js +62 -0
  460. package/dist/ui/menu-context.d.ts +20 -0
  461. package/dist/ui/menu-context.js +22 -0
  462. package/dist/ui/menu-parts/CheckboxItemPart.svelte +26 -0
  463. package/dist/ui/menu-parts/CheckboxItemPart.svelte.d.ts +5 -0
  464. package/dist/ui/menu-parts/ItemPart.svelte +29 -0
  465. package/dist/ui/menu-parts/ItemPart.svelte.d.ts +5 -0
  466. package/dist/ui/menu-parts/RadioGroupPart.svelte +24 -0
  467. package/dist/ui/menu-parts/RadioGroupPart.svelte.d.ts +5 -0
  468. package/dist/ui/menu-parts/RadioItemPart.svelte +22 -0
  469. package/dist/ui/menu-parts/RadioItemPart.svelte.d.ts +5 -0
  470. package/dist/ui/menu-parts/SeparatorPart.svelte +16 -0
  471. package/dist/ui/menu-parts/SeparatorPart.svelte.d.ts +5 -0
  472. package/dist/ui/menu-parts/SubPart.svelte +28 -0
  473. package/dist/ui/menu-parts/SubPart.svelte.d.ts +5 -0
  474. package/dist/ui/menu-parts/menu-parts.d.ts +104 -0
  475. package/dist/ui/menu-parts/menu-parts.js +31 -0
  476. package/dist/ui/menu-parts/parts.d.ts +12 -0
  477. package/dist/ui/menu-parts/parts.js +27 -0
  478. package/dist/ui/slug.d.ts +19 -0
  479. package/dist/ui/slug.js +25 -0
  480. package/dist/ui/toggle-classes.d.ts +39 -0
  481. package/dist/ui/toggle-classes.js +36 -0
  482. package/dist/ui/tones.d.ts +103 -0
  483. package/dist/ui/tones.js +240 -0
  484. package/package.json +41 -25
@@ -0,0 +1,22 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import type { HeadingLevel } from './tones.ts';
4
+ interface Props extends Omit<HTMLAttributes<HTMLHeadingElement>, 'children'> {
5
+ /** The heading level (`h1`–`h6`); choose it from the outline, not the size. */
6
+ level: HeadingLevel;
7
+ /** Explicit anchor id; derived from `children` when it is a string. */
8
+ id?: string | undefined;
9
+ /** Render a permalink beside the heading. Needs an id. */
10
+ anchor?: boolean | undefined;
11
+ /**
12
+ * Accessible name of the permalink.
13
+ * @defaultValue `'Link to this section'`
14
+ */
15
+ anchorLabel?: string | undefined;
16
+ /** The heading text, as a string or a snippet. */
17
+ children: Snippet<[]> | string;
18
+ }
19
+ /** A heading at any level with a stable `id`, optionally with a copyable anchor link. */
20
+ declare const Heading: import("svelte").Component<Props, {}, "">;
21
+ type Heading = ReturnType<typeof Heading>;
22
+ export default Heading;
@@ -0,0 +1,34 @@
1
+ <!-- @component
2
+ An in-text anchor in one of three weights; the plain link of the library.
3
+ -->
4
+ <!--
5
+ Link — an in-text anchor in one of three weights. The plain `<a>` of the
6
+ library: everything that is a link and not an action goes through it, so
7
+ that "what a link looks like" is one decision.
8
+
9
+ ARIA contract: a native `<a href>`, so role, focus and activation are the
10
+ platform's. `external` adds `target="_blank"` and `rel="noreferrer"`
11
+ (which implies `noopener`) — the two always travel together here, because a
12
+ new tab handed the referrer is the leak. An external link that must also
13
+ announce the new tab wants `ExternalLink`, which carries the visually
14
+ hidden warning; this one stays silent so it can be used mid-sentence.
15
+
16
+ `href` resolves through the components context unless `external`: an
17
+ absolute off-site URL is not the app's to rewrite.
18
+ -->
19
+ <script lang="ts">import { getComponentsContext } from "../context.svelte.js";
20
+ import { linkVariant } from "./tones.js";
21
+ let { href, variant = "primary", external = false, children, class: className, ...rest } = $props();
22
+ const context = getComponentsContext();
23
+ const resolved = $derived(external ? href : context.href(href));
24
+ </script>
25
+
26
+ <a
27
+ {...rest}
28
+ href={resolved}
29
+ target={external ? '_blank' : undefined}
30
+ rel={external ? 'noreferrer' : undefined}
31
+ class={[linkVariant[variant], className]}
32
+ >
33
+ {@render children()}
34
+ </a>
@@ -0,0 +1,20 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLAnchorAttributes } from 'svelte/elements';
3
+ import { type LinkVariant } from './tones.ts';
4
+ interface Props extends Omit<HTMLAnchorAttributes, 'href'> {
5
+ /** The target; an app path is resolved through the components context. */
6
+ href: string;
7
+ /**
8
+ * The link weight.
9
+ * @defaultValue `'primary'`
10
+ */
11
+ variant?: LinkVariant | undefined;
12
+ /** Open in a new tab with the safe `rel`. */
13
+ external?: boolean | undefined;
14
+ /** The link text; the anchor's accessible name. */
15
+ children: Snippet<[]>;
16
+ }
17
+ /** An in-text anchor in one of three weights; the plain link of the library. */
18
+ declare const Link: import("svelte").Component<Props, {}, "">;
19
+ type Link = ReturnType<typeof Link>;
20
+ export default Link;
@@ -0,0 +1,51 @@
1
+ <!-- @component
2
+ An `<a>` styled as a daisyUI `btn`, for navigation that reads as an action; it keeps every link behaviour.
3
+ -->
4
+ <!--
5
+ LinkButton — an `<a>` wearing the daisyUI `btn`, for navigation that reads
6
+ as an action ("View results", "Edit"). It is a link, not a button: it
7
+ navigates, so it must be an anchor and must keep Ctrl-click, middle-click
8
+ and "copy link address".
9
+
10
+ ARIA contract: a disabled link keeps its text but drops its `href`, takes
11
+ `role="button"` + `aria-disabled="true"` and leaves the tab order with
12
+ `tabindex="-1"` — an `<a>` without `href` is not focusable and has no role,
13
+ so both have to be restored by hand for the disabled state to be announced
14
+ at all. `external` opens a new tab with `rel="noreferrer"`, which implies
15
+ `noopener`; the pairing is not something a call site should be able to
16
+ forget.
17
+
18
+ `href` resolves through the components context (base path, locale prefix)
19
+ unless the link is `external`, where the destination is an absolute URL the
20
+ app has no business rewriting.
21
+ -->
22
+ <script lang="ts">import { getComponentsContext } from "../context.svelte.js";
23
+ import { buttonSize, buttonTone, buttonVariant } from "./tones.js";
24
+ let { href, tone, variant = "solid", size = "md", disabled = false, block = false, external = false, icon, children, class: className, ...rest } = $props();
25
+ const context = getComponentsContext();
26
+ const resolved = $derived(external ? href : context.href(href));
27
+ </script>
28
+
29
+ <a
30
+ {...rest}
31
+ href={disabled ? undefined : resolved}
32
+ role={disabled ? 'button' : undefined}
33
+ aria-disabled={disabled ? 'true' : undefined}
34
+ tabindex={disabled ? -1 : undefined}
35
+ target={external ? '_blank' : undefined}
36
+ rel={external ? 'noreferrer' : undefined}
37
+ class={[
38
+ 'btn',
39
+ tone !== undefined && buttonTone[tone],
40
+ buttonVariant[variant],
41
+ buttonSize[size],
42
+ block && 'btn-block',
43
+ disabled && 'btn-disabled',
44
+ className,
45
+ ]}
46
+ >
47
+ {#if icon}
48
+ {@render icon()}
49
+ {/if}
50
+ {@render children()}
51
+ </a>
@@ -0,0 +1,33 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { HTMLAnchorAttributes } from 'svelte/elements';
3
+ import { type ButtonVariant, type Size, type Tone } from './tones.ts';
4
+ interface Props extends Omit<HTMLAnchorAttributes, 'href'> {
5
+ /** The target; an app path is resolved through the components context. */
6
+ href: string;
7
+ /** Semantic colour. */
8
+ tone?: Tone | undefined;
9
+ /**
10
+ * daisyUI button style.
11
+ * @defaultValue `'solid'`
12
+ */
13
+ variant?: ButtonVariant | undefined;
14
+ /**
15
+ * daisyUI size step.
16
+ * @defaultValue `'md'`
17
+ */
18
+ size?: Size | undefined;
19
+ /** Renders the button as unavailable without removing its text. */
20
+ disabled?: boolean | undefined;
21
+ /** Full-width. */
22
+ block?: boolean | undefined;
23
+ /** Open in a new tab with the safe `rel`. */
24
+ external?: boolean | undefined;
25
+ /** Leading icon. */
26
+ icon?: Snippet<[]> | undefined;
27
+ /** The button text; the anchor's accessible name. */
28
+ children: Snippet<[]>;
29
+ }
30
+ /** An `<a>` styled as a daisyUI `btn`, for navigation that reads as an action; it keeps every link behaviour. */
31
+ declare const LinkButton: import("svelte").Component<Props, {}, "">;
32
+ type LinkButton = ReturnType<typeof LinkButton>;
33
+ export default LinkButton;
@@ -0,0 +1,24 @@
1
+ <!-- @component
2
+ A labelled navigation list: a `<nav>` landmark around a daisyUI `menu` of `MenuItem` links.
3
+ -->
4
+ <!--
5
+ Menu — site navigation: a `<nav>` landmark around a `<ul class="menu">` of
6
+ links, where the current page marks itself with `aria-current="page"`.
7
+ Links, list, landmark — no widget, no roving focus, no Escape. Everything
8
+ stays reachable with nothing but Tab, which is the correct behaviour for
9
+ navigation and the wrong behaviour for a menu.
10
+
11
+ An application menu behind a trigger is `DropdownMenu`, which takes the
12
+ same `MenuItem`s. The two are separate components so this one imports
13
+ nothing from bits-ui: a page that only navigates (`Sidebar` included) never
14
+ loads the dropdown runtime (#129).
15
+ -->
16
+ <script lang="ts">let { label, class: className, children } = $props();
17
+ export {};
18
+ </script>
19
+
20
+ <nav aria-label={label}>
21
+ <ul class={['menu w-full gap-1 p-0', className]}>
22
+ {@render children()}
23
+ </ul>
24
+ </nav>
@@ -0,0 +1,13 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ /** Accessible name of the navigation landmark. */
4
+ label: string;
5
+ /** Extra classes on the `<ul class="menu">`. */
6
+ class?: string | undefined;
7
+ /** The `MenuItem`s. */
8
+ children: Snippet<[]>;
9
+ }
10
+ /** A labelled navigation list: a `<nav>` landmark around a daisyUI `menu` of `MenuItem` links. */
11
+ declare const Menu: import("svelte").Component<Props, {}, "">;
12
+ type Menu = ReturnType<typeof Menu>;
13
+ export default Menu;
@@ -0,0 +1,33 @@
1
+ <!-- @component
2
+ An on/off entry of a `DropdownMenu` or `ContextMenu` (`role="menuitemcheckbox"`).
3
+ -->
4
+ <!--
5
+ MenuCheckboxItem — a setting toggled from a menu ("Show archived"). It
6
+ renders the checkbox item part its enclosing `DropdownMenu` or
7
+ `ContextMenu` lends it through context (`menu-parts/CheckboxItemPart.svelte`),
8
+ so this file imports nothing from bits-ui and costs a navigation-only page
9
+ nothing (#129).
10
+
11
+ ARIA contract: `role="menuitemcheckbox"` with `aria-checked` from bits-ui;
12
+ the check mark is `aria-hidden`. A checkbox item belongs to an application
13
+ menu, not a navigation list, so outside a `DropdownMenu` / `ContextMenu` it
14
+ renders nothing.
15
+ -->
16
+ <script lang="ts">import { getMenuParts } from "./menu-parts/menu-parts.js";
17
+ let { checked = $bindable(false), onCheckedChange, disabled = false, class: className, children } = $props();
18
+ const parts = getMenuParts();
19
+ const change = (next) => {
20
+ checked = next;
21
+ onCheckedChange?.(next);
22
+ };
23
+ </script>
24
+
25
+ {#if parts}
26
+ <parts.checkboxItem
27
+ {checked}
28
+ onCheckedChange={change}
29
+ {disabled}
30
+ class={className}
31
+ label={children}
32
+ />
33
+ {/if}
@@ -0,0 +1,20 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ /**
4
+ * Whether the item is checked. Bindable.
5
+ * @defaultValue `false`
6
+ */
7
+ checked?: boolean | undefined;
8
+ /** Called with the next state when the reader toggles it. */
9
+ onCheckedChange?: ((checked: boolean) => void) | undefined;
10
+ /** Shown but not activatable. */
11
+ disabled?: boolean | undefined;
12
+ /** Extra classes on the `<li>`. */
13
+ class?: string | undefined;
14
+ /** The item's label. */
15
+ children: Snippet<[]>;
16
+ }
17
+ /** An on/off entry of a `DropdownMenu` or `ContextMenu` (`role="menuitemcheckbox"`). */
18
+ declare const MenuCheckboxItem: import("svelte").Component<Props, {}, "checked">;
19
+ type MenuCheckboxItem = ReturnType<typeof MenuCheckboxItem>;
20
+ export default MenuCheckboxItem;
@@ -0,0 +1,73 @@
1
+ <!-- @component
2
+ One entry of a `Menu` (a navigation link), or of a `DropdownMenu` or `ContextMenu` (a bits-ui menu item).
3
+ -->
4
+ <!--
5
+ MenuItem — one entry of a `Menu`, `DropdownMenu` or `ContextMenu`; which
6
+ one is decided by the enclosing menu, never by a prop.
7
+
8
+ In `nav` mode it is a plain `<li><a>`: the current page takes daisyUI's
9
+ `menu-active` AND `aria-current="page"`, because the highlight is a
10
+ colour and the attribute is what says so out loud. `current` overrides the
11
+ context's `isCurrent(href)`, which is what an app without a router-aware
12
+ context uses.
13
+
14
+ Inside a `DropdownMenu` or `ContextMenu` it renders the item part that menu lends it
15
+ (`menu-parts/ItemPart.svelte`, through context), which goes through
16
+ bits-ui's `DropdownMenu.Item` `child` snippet, so the element is still the
17
+ caller's own `<a>` or `<button>` — carrying bits-ui's `role="menuitem"`, its
18
+ focus management and its selection handling — rather than a `<div>`
19
+ pretending to be one. This file imports nothing from bits-ui, so a
20
+ navigation-only page never loads the dropdown runtime (#129). An item with
21
+ an `href` is a link and must stay a link (middle-click, "open in new tab");
22
+ an item without one is a button.
23
+
24
+ ARIA contract: inside a `DropdownMenu` the `<li>` wrapper is `role="none"`
25
+ so it does not sit between `role="menu"` and `role="menuitem"`, and
26
+ `disabled` is bits-ui's (skipped by arrow keys, not activatable). In a
27
+ navigation list `disabled` is `aria-disabled` + no `href`, where there is
28
+ no widget to skip.
29
+ The `icon` snippet is decorative — the label carries the meaning.
30
+ -->
31
+ <script lang="ts">import { getComponentsContext } from "../context.svelte.js";
32
+ import { getMenuParts } from "./menu-parts/menu-parts.js";
33
+ let { href, onSelect, current, disabled = false, icon, class: className, children } = $props();
34
+ const context = getComponentsContext();
35
+ const parts = getMenuParts();
36
+ const resolved = $derived(href === undefined ? undefined : context.href(href));
37
+ // bits-ui's `onSelect` is not optional-friendly under
38
+ // `exactOptionalPropertyTypes`; a stable wrapper is simpler than a spread.
39
+ const select = () => onSelect?.();
40
+ const isCurrent = $derived(current ?? (resolved === undefined ? false : context.isCurrent(resolved)));
41
+ </script>
42
+
43
+ {#snippet label()}
44
+ {#if icon}<span class="size-5 shrink-0" aria-hidden="true">{@render icon()}</span>{/if}
45
+ {@render children()}
46
+ {/snippet}
47
+
48
+ {#if parts}
49
+ <parts.item
50
+ href={resolved}
51
+ current={isCurrent}
52
+ {disabled}
53
+ onSelect={select}
54
+ class={className}
55
+ {label}
56
+ />
57
+ {:else}
58
+ <li class={className}>
59
+ {#if resolved === undefined}
60
+ <button type="button" {disabled} onclick={select}>{@render label()}</button>
61
+ {:else}
62
+ <a
63
+ href={disabled ? undefined : resolved}
64
+ aria-disabled={disabled ? 'true' : undefined}
65
+ aria-current={isCurrent ? 'page' : undefined}
66
+ class:menu-active={isCurrent}
67
+ onclick={select}
68
+ >
69
+ {@render label()}
70
+ </a>
71
+ {/if}
72
+ </li>
73
+ {/if}
@@ -0,0 +1,21 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ /** Where the item navigates. Omitted, the item is a button. */
4
+ href?: string | undefined;
5
+ /** Called when the item is chosen. */
6
+ onSelect?: (() => void) | undefined;
7
+ /** Whether this item is the current page; defaults to the context's answer. */
8
+ current?: boolean | undefined;
9
+ /** Shown but not activatable. */
10
+ disabled?: boolean | undefined;
11
+ /** Leading icon. Decorative. */
12
+ icon?: Snippet<[]> | undefined;
13
+ /** Extra classes on the `<li>`. */
14
+ class?: string | undefined;
15
+ /** The item's label. */
16
+ children: Snippet<[]>;
17
+ }
18
+ /** One entry of a `Menu` (a navigation link), or of a `DropdownMenu` or `ContextMenu` (a bits-ui menu item). */
19
+ declare const MenuItem: import("svelte").Component<Props, {}, "">;
20
+ type MenuItem = ReturnType<typeof MenuItem>;
21
+ export default MenuItem;
@@ -0,0 +1,25 @@
1
+ <!-- @component
2
+ A set of mutually exclusive `MenuRadioItem`s in a `DropdownMenu` or `ContextMenu`.
3
+ -->
4
+ <!--
5
+ MenuRadioGroup — one choice from a few, made in a menu ("Sort by: name,
6
+ date, size"). It renders the radio group part its enclosing `DropdownMenu`
7
+ or `ContextMenu` lends it through context (`menu-parts/RadioGroupPart.svelte`),
8
+ so this file imports nothing from bits-ui (#129).
9
+
10
+ ARIA contract: a `role="group"` named by its visible `label` heading, around
11
+ `role="menuitemradio"` items, exactly one `aria-checked`. Outside a
12
+ `DropdownMenu` / `ContextMenu` it renders nothing.
13
+ -->
14
+ <script lang="ts">import { getMenuParts } from "./menu-parts/menu-parts.js";
15
+ let { value = $bindable(""), onValueChange, label, class: className, children } = $props();
16
+ const parts = getMenuParts();
17
+ const change = (next) => {
18
+ value = next;
19
+ onValueChange?.(next);
20
+ };
21
+ </script>
22
+
23
+ {#if parts}
24
+ <parts.radioGroup {value} onValueChange={change} {label} class={className} {children} />
25
+ {/if}
@@ -0,0 +1,20 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ /**
4
+ * The chosen item's value; empty string when none is chosen. Bindable.
5
+ * @defaultValue `''`
6
+ */
7
+ value?: string | undefined;
8
+ /** Called with the chosen value. */
9
+ onValueChange?: ((value: string) => void) | undefined;
10
+ /** Visible group heading; also its accessible name. */
11
+ label?: string | undefined;
12
+ /** Extra classes on the `<li>`. */
13
+ class?: string | undefined;
14
+ /** The `MenuRadioItem`s. */
15
+ children: Snippet<[]>;
16
+ }
17
+ /** A set of mutually exclusive `MenuRadioItem`s in a `DropdownMenu` or `ContextMenu`. */
18
+ declare const MenuRadioGroup: import("svelte").Component<Props, {}, "value">;
19
+ type MenuRadioGroup = ReturnType<typeof MenuRadioGroup>;
20
+ export default MenuRadioGroup;
@@ -0,0 +1,20 @@
1
+ <!-- @component
2
+ One option of a `MenuRadioGroup` (`role="menuitemradio"`).
3
+ -->
4
+ <!--
5
+ MenuRadioItem — one option of a `MenuRadioGroup`. It renders the radio
6
+ item part its enclosing `DropdownMenu` or `ContextMenu` lends it through
7
+ context (`menu-parts/RadioItemPart.svelte`), so this file imports nothing
8
+ from bits-ui (#129).
9
+
10
+ ARIA contract: `role="menuitemradio"` with `aria-checked`; the dot is
11
+ `aria-hidden`. Outside a `DropdownMenu` / `ContextMenu` it renders nothing.
12
+ -->
13
+ <script lang="ts">import { getMenuParts } from "./menu-parts/menu-parts.js";
14
+ let { value, disabled = false, class: className, children } = $props();
15
+ const parts = getMenuParts();
16
+ </script>
17
+
18
+ {#if parts}
19
+ <parts.radioItem {value} {disabled} class={className} label={children} />
20
+ {/if}
@@ -0,0 +1,15 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ /** The value this item chooses in its `MenuRadioGroup`. */
4
+ value: string;
5
+ /** Shown but not activatable. */
6
+ disabled?: boolean | undefined;
7
+ /** Extra classes on the `<li>`. */
8
+ class?: string | undefined;
9
+ /** The item's label. */
10
+ children: Snippet<[]>;
11
+ }
12
+ /** One option of a `MenuRadioGroup` (`role="menuitemradio"`). */
13
+ declare const MenuRadioItem: import("svelte").Component<Props, {}, "">;
14
+ type MenuRadioItem = ReturnType<typeof MenuRadioItem>;
15
+ export default MenuRadioItem;
@@ -0,0 +1,27 @@
1
+ <!-- @component
2
+ A rule between groups of `MenuItem`s.
3
+ -->
4
+ <!--
5
+ MenuSeparator — a rule between groups of `MenuItem`s.
6
+
7
+ ARIA contract: a real `role="separator"`, which is what tells a screen
8
+ reader the grouping exists at all; a bare styled `<li>` is a line sighted
9
+ readers can see and nobody else can. Inside a `DropdownMenu` or `ContextMenu` it renders the
10
+ separator part that menu lends it through context: bits-ui's own separator
11
+ (which also marks it non-focusable for the menu's arrow-key navigation),
12
+ wrapped in a `role="none"` `<li>` so the presentational list item stays out
13
+ of the accessibility tree. This file imports nothing from bits-ui (#129).
14
+
15
+ Outside a menu, use `Divider`: it is the free-standing rule, and this one
16
+ must stay an `<li>` inside the menu's list.
17
+ -->
18
+ <script lang="ts">import { getMenuParts } from "./menu-parts/menu-parts.js";
19
+ let { class: className } = $props();
20
+ const parts = getMenuParts();
21
+ </script>
22
+
23
+ {#if parts}
24
+ <parts.separator class={className} />
25
+ {:else}
26
+ <li role="separator" class={['divider my-1 h-px', className]}></li>
27
+ {/if}
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ /** Extra classes, merged last. */
3
+ class?: string | undefined;
4
+ }
5
+ /** A rule between groups of `MenuItem`s. */
6
+ declare const MenuSeparator: import("svelte").Component<Props, {}, "">;
7
+ type MenuSeparator = ReturnType<typeof MenuSeparator>;
8
+ export default MenuSeparator;
@@ -0,0 +1,24 @@
1
+ <!-- @component
2
+ A submenu of a `DropdownMenu` or `ContextMenu`: an item that opens a further menu.
3
+ -->
4
+ <!--
5
+ MenuSub — an item that opens a further menu ("Move to ▸"). It renders the
6
+ submenu part its enclosing `DropdownMenu` or `ContextMenu` lends it through
7
+ context (`menu-parts/SubPart.svelte`), so this file imports nothing from
8
+ bits-ui (#129). The children are the same `MenuItem`s, separators and
9
+ checkbox / radio items the parent menu takes.
10
+
11
+ ARIA contract: the opener is a `role="menuitem"` with
12
+ `aria-haspopup="menu"` and `aria-expanded`; → opens the submenu and focuses
13
+ its first item, ← closes it and returns focus to the opener. Outside a
14
+ `DropdownMenu` / `ContextMenu` it renders nothing: a navigation list has no
15
+ submenus to open.
16
+ -->
17
+ <script lang="ts">import { getMenuParts } from "./menu-parts/menu-parts.js";
18
+ let { label, disabled = false, class: className, children } = $props();
19
+ const parts = getMenuParts();
20
+ </script>
21
+
22
+ {#if parts}
23
+ <parts.sub {label} {disabled} class={className} {children} />
24
+ {/if}
@@ -0,0 +1,15 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ /** Text of the item that opens the submenu. */
4
+ label: string;
5
+ /** Shown but not activatable. */
6
+ disabled?: boolean | undefined;
7
+ /** Extra classes on the `<li>`. */
8
+ class?: string | undefined;
9
+ /** The submenu's items. */
10
+ children: Snippet<[]>;
11
+ }
12
+ /** A submenu of a `DropdownMenu` or `ContextMenu`: an item that opens a further menu. */
13
+ declare const MenuSub: import("svelte").Component<Props, {}, "">;
14
+ type MenuSub = ReturnType<typeof MenuSub>;
15
+ export default MenuSub;
@@ -0,0 +1,63 @@
1
+ <!-- @component
2
+ A small floating panel anchored to a trigger, on bits-ui’s `Popover`.
3
+ -->
4
+ <!--
5
+ Popover — a small floating panel anchored to a trigger, on bits-ui's
6
+ `Popover`.
7
+
8
+ Unlike a tooltip, a popover holds INTERACTIVE content: it takes focus, it
9
+ closes on Escape and on an outside click, and it returns focus to the
10
+ trigger. All of that is bits-ui's — it is precisely the hand-rolled part
11
+ that is always subtly wrong.
12
+
13
+ ARIA contract: bits-ui gives the trigger `aria-haspopup="dialog"` and
14
+ `aria-expanded` and wires `aria-controls` to the panel, but it leaves the
15
+ panel's own role to the caller — so `role="dialog"` is set here, where the
16
+ focus trap and the Escape handler that make the role true already are. When
17
+ `title` is set the panel is `aria-labelledby` that heading, so it announces
18
+ what it is on open; without a title, label it from the call site. The close button is
19
+ a labelled control, not a bare glyph.
20
+
21
+ Both snippets take the caller's own element: `trigger` receives the props
22
+ to spread, so an existing `Button` keeps its own markup.
23
+ -->
24
+ <script lang="ts">import { X } from "@lucide/svelte";
25
+ import { Popover } from "bits-ui";
26
+ import Button from "./Button.svelte";
27
+ import VisuallyHidden from "./VisuallyHidden.svelte";
28
+ let { open = $bindable(false), side = "bottom", align = "center", sideOffset = 8, title, closeLabel = "Close", class: className, trigger, children } = $props();
29
+ const titleId = $props.id();
30
+ </script>
31
+
32
+ <Popover.Root bind:open>
33
+ <Popover.Trigger>
34
+ {#snippet child({ props })}
35
+ {@render trigger({ props })}
36
+ {/snippet}
37
+ </Popover.Trigger>
38
+ <Popover.Portal>
39
+ <Popover.Content
40
+ {side}
41
+ {align}
42
+ {sideOffset}
43
+ role="dialog"
44
+ aria-labelledby={title === undefined ? undefined : titleId}
45
+ class={['card card-border bg-base-100 rounded-box z-50 w-72 p-4 shadow-md', className]}
46
+ >
47
+ {#if closeLabel !== undefined}
48
+ <Popover.Close>
49
+ {#snippet child({ props })}
50
+ <Button {...props} variant="ghost" size="sm" class="absolute top-2 right-2 btn-square">
51
+ <X class="size-4" aria-hidden="true" />
52
+ <VisuallyHidden>{closeLabel}</VisuallyHidden>
53
+ </Button>
54
+ {/snippet}
55
+ </Popover.Close>
56
+ {/if}
57
+ {#if title !== undefined}
58
+ <p id={titleId} class="mb-2 pr-8 font-semibold">{title}</p>
59
+ {/if}
60
+ {@render children()}
61
+ </Popover.Content>
62
+ </Popover.Portal>
63
+ </Popover.Root>
@@ -0,0 +1,40 @@
1
+ import { Popover } from 'bits-ui';
2
+ import type { Snippet } from 'svelte';
3
+ interface Props {
4
+ /** Whether the panel is open. Bindable. */
5
+ open?: boolean | undefined;
6
+ /**
7
+ * Which side of the trigger the panel opens on.
8
+ * @defaultValue `'bottom'`
9
+ */
10
+ side?: 'top' | 'right' | 'bottom' | 'left' | undefined;
11
+ /**
12
+ * Alignment against the trigger along that side.
13
+ * @defaultValue `'center'`
14
+ */
15
+ align?: 'start' | 'center' | 'end' | undefined;
16
+ /**
17
+ * Distance in pixels from the trigger.
18
+ * @defaultValue `8`
19
+ */
20
+ sideOffset?: number | undefined;
21
+ /** Heading for the panel; becomes its accessible name. */
22
+ title?: string | undefined;
23
+ /**
24
+ * Accessible name of the close button. Omit to hide the button.
25
+ * @defaultValue `'Close'`
26
+ */
27
+ closeLabel?: string | undefined;
28
+ /** Extra classes on the panel. */
29
+ class?: string | undefined;
30
+ /** The trigger — the caller's own element, spreading `props` onto it. */
31
+ trigger: Snippet<[{
32
+ props: Record<string, unknown>;
33
+ }]>;
34
+ /** The panel body, under `title` when one is given. */
35
+ children: Snippet<[]>;
36
+ }
37
+ /** A small floating panel anchored to a trigger, on bits-ui’s `Popover`. */
38
+ declare const Popover: import("svelte").Component<Props, {}, "open">;
39
+ type Popover = ReturnType<typeof Popover>;
40
+ export default Popover;