dystopia-linear-lib 1.0.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 (496) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +65 -0
  3. package/dist/components/accordion/Accordion.svelte +39 -0
  4. package/dist/components/accordion/Accordion.svelte.d.ts +4 -0
  5. package/dist/components/accordion/Accordion.types.d.ts +14 -0
  6. package/dist/components/accordion/Accordion.types.js +1 -0
  7. package/dist/components/accordion/AccordionItem.svelte +70 -0
  8. package/dist/components/accordion/AccordionItem.svelte.d.ts +4 -0
  9. package/dist/components/accordion/AccordionItem.types.d.ts +13 -0
  10. package/dist/components/accordion/AccordionItem.types.js +1 -0
  11. package/dist/components/accordion/accordion-context.d.ts +8 -0
  12. package/dist/components/accordion/accordion-context.js +12 -0
  13. package/dist/components/accordion/index.d.ts +4 -0
  14. package/dist/components/accordion/index.js +2 -0
  15. package/dist/components/alert/Alert.svelte +45 -0
  16. package/dist/components/alert/Alert.svelte.d.ts +4 -0
  17. package/dist/components/alert/Alert.types.d.ts +15 -0
  18. package/dist/components/alert/Alert.types.js +1 -0
  19. package/dist/components/alert/Alert.variants.d.ts +5 -0
  20. package/dist/components/alert/Alert.variants.js +14 -0
  21. package/dist/components/alert/index.d.ts +3 -0
  22. package/dist/components/alert/index.js +2 -0
  23. package/dist/components/avatar/Avatar.svelte +38 -0
  24. package/dist/components/avatar/Avatar.svelte.d.ts +4 -0
  25. package/dist/components/avatar/Avatar.types.d.ts +13 -0
  26. package/dist/components/avatar/Avatar.types.js +1 -0
  27. package/dist/components/avatar/index.d.ts +2 -0
  28. package/dist/components/avatar/index.js +1 -0
  29. package/dist/components/badge/Badge.svelte +11 -0
  30. package/dist/components/badge/Badge.svelte.d.ts +4 -0
  31. package/dist/components/badge/Badge.types.d.ts +7 -0
  32. package/dist/components/badge/Badge.types.js +1 -0
  33. package/dist/components/badge/Badge.variants.d.ts +5 -0
  34. package/dist/components/badge/Badge.variants.js +14 -0
  35. package/dist/components/badge/index.d.ts +3 -0
  36. package/dist/components/badge/index.js +2 -0
  37. package/dist/components/breadcrumb/Breadcrumb.svelte +9 -0
  38. package/dist/components/breadcrumb/Breadcrumb.svelte.d.ts +4 -0
  39. package/dist/components/breadcrumb/Breadcrumb.types.d.ts +6 -0
  40. package/dist/components/breadcrumb/Breadcrumb.types.js +1 -0
  41. package/dist/components/breadcrumb/BreadcrumbEllipsis.svelte +37 -0
  42. package/dist/components/breadcrumb/BreadcrumbEllipsis.svelte.d.ts +4 -0
  43. package/dist/components/breadcrumb/BreadcrumbEllipsis.types.d.ts +16 -0
  44. package/dist/components/breadcrumb/BreadcrumbEllipsis.types.js +1 -0
  45. package/dist/components/breadcrumb/BreadcrumbItem.svelte +10 -0
  46. package/dist/components/breadcrumb/BreadcrumbItem.svelte.d.ts +4 -0
  47. package/dist/components/breadcrumb/BreadcrumbItem.types.d.ts +6 -0
  48. package/dist/components/breadcrumb/BreadcrumbItem.types.js +1 -0
  49. package/dist/components/breadcrumb/BreadcrumbLink.svelte +22 -0
  50. package/dist/components/breadcrumb/BreadcrumbLink.svelte.d.ts +4 -0
  51. package/dist/components/breadcrumb/BreadcrumbLink.types.d.ts +10 -0
  52. package/dist/components/breadcrumb/BreadcrumbLink.types.js +1 -0
  53. package/dist/components/breadcrumb/BreadcrumbList.svelte +13 -0
  54. package/dist/components/breadcrumb/BreadcrumbList.svelte.d.ts +4 -0
  55. package/dist/components/breadcrumb/BreadcrumbList.types.d.ts +6 -0
  56. package/dist/components/breadcrumb/BreadcrumbList.types.js +1 -0
  57. package/dist/components/breadcrumb/BreadcrumbPage.svelte +15 -0
  58. package/dist/components/breadcrumb/BreadcrumbPage.svelte.d.ts +4 -0
  59. package/dist/components/breadcrumb/BreadcrumbPage.types.d.ts +6 -0
  60. package/dist/components/breadcrumb/BreadcrumbPage.types.js +1 -0
  61. package/dist/components/breadcrumb/BreadcrumbSeparator.svelte +28 -0
  62. package/dist/components/breadcrumb/BreadcrumbSeparator.svelte.d.ts +4 -0
  63. package/dist/components/breadcrumb/BreadcrumbSeparator.types.d.ts +7 -0
  64. package/dist/components/breadcrumb/BreadcrumbSeparator.types.js +1 -0
  65. package/dist/components/breadcrumb/index.d.ts +14 -0
  66. package/dist/components/breadcrumb/index.js +7 -0
  67. package/dist/components/button/Button.svelte +47 -0
  68. package/dist/components/button/Button.svelte.d.ts +4 -0
  69. package/dist/components/button/Button.types.d.ts +14 -0
  70. package/dist/components/button/Button.types.js +1 -0
  71. package/dist/components/button/Button.variants.d.ts +6 -0
  72. package/dist/components/button/Button.variants.js +19 -0
  73. package/dist/components/button/index.d.ts +3 -0
  74. package/dist/components/button/index.js +2 -0
  75. package/dist/components/button-group/ButtonGroup.svelte +11 -0
  76. package/dist/components/button-group/ButtonGroup.svelte.d.ts +4 -0
  77. package/dist/components/button-group/ButtonGroup.types.d.ts +7 -0
  78. package/dist/components/button-group/ButtonGroup.types.js +1 -0
  79. package/dist/components/button-group/ButtonGroup.variants.d.ts +5 -0
  80. package/dist/components/button-group/ButtonGroup.variants.js +12 -0
  81. package/dist/components/button-group/index.d.ts +3 -0
  82. package/dist/components/button-group/index.js +2 -0
  83. package/dist/components/calendar/Calendar.svelte +276 -0
  84. package/dist/components/calendar/Calendar.svelte.d.ts +4 -0
  85. package/dist/components/calendar/Calendar.types.d.ts +52 -0
  86. package/dist/components/calendar/Calendar.types.js +1 -0
  87. package/dist/components/calendar/CalendarDay.svelte +30 -0
  88. package/dist/components/calendar/CalendarDay.svelte.d.ts +4 -0
  89. package/dist/components/calendar/CalendarDay.types.d.ts +16 -0
  90. package/dist/components/calendar/CalendarDay.types.js +1 -0
  91. package/dist/components/calendar/CalendarDay.variants.d.ts +8 -0
  92. package/dist/components/calendar/CalendarDay.variants.js +31 -0
  93. package/dist/components/calendar/index.d.ts +5 -0
  94. package/dist/components/calendar/index.js +3 -0
  95. package/dist/components/card/Card.svelte +10 -0
  96. package/dist/components/card/Card.svelte.d.ts +4 -0
  97. package/dist/components/card/Card.types.d.ts +6 -0
  98. package/dist/components/card/Card.types.js +1 -0
  99. package/dist/components/card/CardContent.svelte +10 -0
  100. package/dist/components/card/CardContent.svelte.d.ts +4 -0
  101. package/dist/components/card/CardContent.types.d.ts +6 -0
  102. package/dist/components/card/CardContent.types.js +1 -0
  103. package/dist/components/card/CardDescription.svelte +10 -0
  104. package/dist/components/card/CardDescription.svelte.d.ts +4 -0
  105. package/dist/components/card/CardDescription.types.d.ts +6 -0
  106. package/dist/components/card/CardDescription.types.js +1 -0
  107. package/dist/components/card/CardFooter.svelte +10 -0
  108. package/dist/components/card/CardFooter.svelte.d.ts +4 -0
  109. package/dist/components/card/CardFooter.types.d.ts +6 -0
  110. package/dist/components/card/CardFooter.types.js +1 -0
  111. package/dist/components/card/CardHeader.svelte +10 -0
  112. package/dist/components/card/CardHeader.svelte.d.ts +4 -0
  113. package/dist/components/card/CardHeader.types.d.ts +6 -0
  114. package/dist/components/card/CardHeader.types.js +1 -0
  115. package/dist/components/card/CardTitle.svelte +10 -0
  116. package/dist/components/card/CardTitle.svelte.d.ts +4 -0
  117. package/dist/components/card/CardTitle.types.d.ts +6 -0
  118. package/dist/components/card/CardTitle.types.js +1 -0
  119. package/dist/components/card/index.d.ts +12 -0
  120. package/dist/components/card/index.js +6 -0
  121. package/dist/components/checkbox/Checkbox.svelte +74 -0
  122. package/dist/components/checkbox/Checkbox.svelte.d.ts +4 -0
  123. package/dist/components/checkbox/Checkbox.types.d.ts +15 -0
  124. package/dist/components/checkbox/Checkbox.types.js +1 -0
  125. package/dist/components/checkbox/Checkbox.variants.d.ts +5 -0
  126. package/dist/components/checkbox/Checkbox.variants.js +13 -0
  127. package/dist/components/checkbox/index.d.ts +3 -0
  128. package/dist/components/checkbox/index.js +2 -0
  129. package/dist/components/collapsible/Collapsible.svelte +64 -0
  130. package/dist/components/collapsible/Collapsible.svelte.d.ts +4 -0
  131. package/dist/components/collapsible/Collapsible.types.d.ts +13 -0
  132. package/dist/components/collapsible/Collapsible.types.js +1 -0
  133. package/dist/components/collapsible/index.d.ts +2 -0
  134. package/dist/components/collapsible/index.js +1 -0
  135. package/dist/components/combobox/Combobox.svelte +528 -0
  136. package/dist/components/combobox/Combobox.svelte.d.ts +25 -0
  137. package/dist/components/combobox/Combobox.types.d.ts +83 -0
  138. package/dist/components/combobox/Combobox.types.js +1 -0
  139. package/dist/components/combobox/Combobox.variants.d.ts +11 -0
  140. package/dist/components/combobox/Combobox.variants.js +35 -0
  141. package/dist/components/combobox/combobox-state.svelte.d.ts +69 -0
  142. package/dist/components/combobox/combobox-state.svelte.js +223 -0
  143. package/dist/components/combobox/index.d.ts +3 -0
  144. package/dist/components/combobox/index.js +2 -0
  145. package/dist/components/data-table/DataTable.svelte +113 -0
  146. package/dist/components/data-table/DataTable.svelte.d.ts +26 -0
  147. package/dist/components/data-table/DataTable.types.d.ts +32 -0
  148. package/dist/components/data-table/DataTable.types.js +1 -0
  149. package/dist/components/data-table/DataTableColumnHeader.svelte +63 -0
  150. package/dist/components/data-table/DataTableColumnHeader.svelte.d.ts +4 -0
  151. package/dist/components/data-table/DataTableColumnHeader.types.d.ts +17 -0
  152. package/dist/components/data-table/DataTableColumnHeader.types.js +1 -0
  153. package/dist/components/data-table/DataTablePagination.svelte +50 -0
  154. package/dist/components/data-table/DataTablePagination.svelte.d.ts +26 -0
  155. package/dist/components/data-table/DataTablePagination.types.d.ts +32 -0
  156. package/dist/components/data-table/DataTablePagination.types.js +1 -0
  157. package/dist/components/data-table/index.d.ts +6 -0
  158. package/dist/components/data-table/index.js +3 -0
  159. package/dist/components/date-picker/DatePicker.svelte +216 -0
  160. package/dist/components/date-picker/DatePicker.svelte.d.ts +4 -0
  161. package/dist/components/date-picker/DatePicker.types.d.ts +40 -0
  162. package/dist/components/date-picker/DatePicker.types.js +1 -0
  163. package/dist/components/date-picker/index.d.ts +2 -0
  164. package/dist/components/date-picker/index.js +1 -0
  165. package/dist/components/dialog/Dialog.svelte +179 -0
  166. package/dist/components/dialog/Dialog.svelte.d.ts +4 -0
  167. package/dist/components/dialog/Dialog.types.d.ts +21 -0
  168. package/dist/components/dialog/Dialog.types.js +1 -0
  169. package/dist/components/dialog/index.d.ts +2 -0
  170. package/dist/components/dialog/index.js +1 -0
  171. package/dist/components/drawer/Drawer.svelte +157 -0
  172. package/dist/components/drawer/Drawer.svelte.d.ts +4 -0
  173. package/dist/components/drawer/Drawer.types.d.ts +22 -0
  174. package/dist/components/drawer/Drawer.types.js +1 -0
  175. package/dist/components/drawer/Drawer.variants.d.ts +5 -0
  176. package/dist/components/drawer/Drawer.variants.js +14 -0
  177. package/dist/components/drawer/index.d.ts +3 -0
  178. package/dist/components/drawer/index.js +2 -0
  179. package/dist/components/dropdown/Dropdown.svelte +152 -0
  180. package/dist/components/dropdown/Dropdown.svelte.d.ts +4 -0
  181. package/dist/components/dropdown/Dropdown.types.d.ts +15 -0
  182. package/dist/components/dropdown/Dropdown.types.js +1 -0
  183. package/dist/components/dropdown/DropdownItem.svelte +31 -0
  184. package/dist/components/dropdown/DropdownItem.svelte.d.ts +4 -0
  185. package/dist/components/dropdown/DropdownItem.types.d.ts +8 -0
  186. package/dist/components/dropdown/DropdownItem.types.js +1 -0
  187. package/dist/components/dropdown/index.d.ts +4 -0
  188. package/dist/components/dropdown/index.js +2 -0
  189. package/dist/components/empty-state/EmptyState.svelte +37 -0
  190. package/dist/components/empty-state/EmptyState.svelte.d.ts +4 -0
  191. package/dist/components/empty-state/EmptyState.types.d.ts +16 -0
  192. package/dist/components/empty-state/EmptyState.types.js +1 -0
  193. package/dist/components/empty-state/index.d.ts +2 -0
  194. package/dist/components/empty-state/index.js +1 -0
  195. package/dist/components/helper-text/HelperText.svelte +15 -0
  196. package/dist/components/helper-text/HelperText.svelte.d.ts +4 -0
  197. package/dist/components/helper-text/HelperText.types.d.ts +8 -0
  198. package/dist/components/helper-text/HelperText.types.js +1 -0
  199. package/dist/components/helper-text/index.d.ts +2 -0
  200. package/dist/components/helper-text/index.js +1 -0
  201. package/dist/components/hover-card/HoverCard.svelte +138 -0
  202. package/dist/components/hover-card/HoverCard.svelte.d.ts +4 -0
  203. package/dist/components/hover-card/HoverCard.types.d.ts +20 -0
  204. package/dist/components/hover-card/HoverCard.types.js +1 -0
  205. package/dist/components/hover-card/index.d.ts +2 -0
  206. package/dist/components/hover-card/index.js +1 -0
  207. package/dist/components/label/Label.svelte +26 -0
  208. package/dist/components/label/Label.svelte.d.ts +4 -0
  209. package/dist/components/label/Label.types.d.ts +9 -0
  210. package/dist/components/label/Label.types.js +1 -0
  211. package/dist/components/label/index.d.ts +2 -0
  212. package/dist/components/label/index.js +1 -0
  213. package/dist/components/pagination/Pagination.svelte +85 -0
  214. package/dist/components/pagination/Pagination.svelte.d.ts +4 -0
  215. package/dist/components/pagination/Pagination.types.d.ts +41 -0
  216. package/dist/components/pagination/Pagination.types.js +1 -0
  217. package/dist/components/pagination/PaginationEllipsis.svelte +15 -0
  218. package/dist/components/pagination/PaginationEllipsis.svelte.d.ts +4 -0
  219. package/dist/components/pagination/PaginationEllipsis.types.d.ts +9 -0
  220. package/dist/components/pagination/PaginationEllipsis.types.js +1 -0
  221. package/dist/components/pagination/PaginationEllipsis.variants.d.ts +5 -0
  222. package/dist/components/pagination/PaginationEllipsis.variants.js +13 -0
  223. package/dist/components/pagination/PaginationItem.svelte +10 -0
  224. package/dist/components/pagination/PaginationItem.svelte.d.ts +4 -0
  225. package/dist/components/pagination/PaginationItem.types.d.ts +6 -0
  226. package/dist/components/pagination/PaginationItem.types.js +1 -0
  227. package/dist/components/pagination/PaginationLink.svelte +30 -0
  228. package/dist/components/pagination/PaginationLink.svelte.d.ts +4 -0
  229. package/dist/components/pagination/PaginationLink.types.d.ts +15 -0
  230. package/dist/components/pagination/PaginationLink.types.js +1 -0
  231. package/dist/components/pagination/PaginationLink.variants.d.ts +6 -0
  232. package/dist/components/pagination/PaginationLink.variants.js +18 -0
  233. package/dist/components/pagination/PaginationList.svelte +10 -0
  234. package/dist/components/pagination/PaginationList.svelte.d.ts +4 -0
  235. package/dist/components/pagination/PaginationList.types.d.ts +6 -0
  236. package/dist/components/pagination/PaginationList.types.js +1 -0
  237. package/dist/components/pagination/PaginationNext.svelte +25 -0
  238. package/dist/components/pagination/PaginationNext.svelte.d.ts +4 -0
  239. package/dist/components/pagination/PaginationNext.types.d.ts +9 -0
  240. package/dist/components/pagination/PaginationNext.types.js +1 -0
  241. package/dist/components/pagination/PaginationNext.variants.d.ts +5 -0
  242. package/dist/components/pagination/PaginationNext.variants.js +13 -0
  243. package/dist/components/pagination/PaginationPrevious.svelte +25 -0
  244. package/dist/components/pagination/PaginationPrevious.svelte.d.ts +4 -0
  245. package/dist/components/pagination/PaginationPrevious.types.d.ts +9 -0
  246. package/dist/components/pagination/PaginationPrevious.types.js +1 -0
  247. package/dist/components/pagination/PaginationPrevious.variants.d.ts +5 -0
  248. package/dist/components/pagination/PaginationPrevious.variants.js +13 -0
  249. package/dist/components/pagination/index.d.ts +18 -0
  250. package/dist/components/pagination/index.js +11 -0
  251. package/dist/components/password-field/PasswordField.svelte +69 -0
  252. package/dist/components/password-field/PasswordField.svelte.d.ts +4 -0
  253. package/dist/components/password-field/PasswordField.types.d.ts +10 -0
  254. package/dist/components/password-field/PasswordField.types.js +1 -0
  255. package/dist/components/password-field/index.d.ts +2 -0
  256. package/dist/components/password-field/index.js +1 -0
  257. package/dist/components/popover/Popover.svelte +84 -0
  258. package/dist/components/popover/Popover.svelte.d.ts +4 -0
  259. package/dist/components/popover/Popover.types.d.ts +15 -0
  260. package/dist/components/popover/Popover.types.js +1 -0
  261. package/dist/components/popover/index.d.ts +2 -0
  262. package/dist/components/popover/index.js +1 -0
  263. package/dist/components/progress/Progress.svelte +35 -0
  264. package/dist/components/progress/Progress.svelte.d.ts +4 -0
  265. package/dist/components/progress/Progress.types.d.ts +12 -0
  266. package/dist/components/progress/Progress.types.js +1 -0
  267. package/dist/components/progress/Progress.variants.d.ts +5 -0
  268. package/dist/components/progress/Progress.variants.js +13 -0
  269. package/dist/components/progress/index.d.ts +3 -0
  270. package/dist/components/progress/index.js +2 -0
  271. package/dist/components/radio/Radio.svelte +46 -0
  272. package/dist/components/radio/Radio.svelte.d.ts +4 -0
  273. package/dist/components/radio/Radio.types.d.ts +16 -0
  274. package/dist/components/radio/Radio.types.js +1 -0
  275. package/dist/components/radio/Radio.variants.d.ts +5 -0
  276. package/dist/components/radio/Radio.variants.js +13 -0
  277. package/dist/components/radio/index.d.ts +3 -0
  278. package/dist/components/radio/index.js +2 -0
  279. package/dist/components/select/Select.svelte +55 -0
  280. package/dist/components/select/Select.svelte.d.ts +4 -0
  281. package/dist/components/select/Select.types.d.ts +16 -0
  282. package/dist/components/select/Select.types.js +1 -0
  283. package/dist/components/select/Select.variants.d.ts +6 -0
  284. package/dist/components/select/Select.variants.js +18 -0
  285. package/dist/components/select/index.d.ts +3 -0
  286. package/dist/components/select/index.js +2 -0
  287. package/dist/components/separator/Separator.svelte +19 -0
  288. package/dist/components/separator/Separator.svelte.d.ts +4 -0
  289. package/dist/components/separator/Separator.types.d.ts +7 -0
  290. package/dist/components/separator/Separator.types.js +1 -0
  291. package/dist/components/separator/Separator.variants.d.ts +5 -0
  292. package/dist/components/separator/Separator.variants.js +12 -0
  293. package/dist/components/separator/index.d.ts +3 -0
  294. package/dist/components/separator/index.js +2 -0
  295. package/dist/components/sidebar/Sidebar.svelte +28 -0
  296. package/dist/components/sidebar/Sidebar.svelte.d.ts +4 -0
  297. package/dist/components/sidebar/Sidebar.types.d.ts +7 -0
  298. package/dist/components/sidebar/Sidebar.types.js +1 -0
  299. package/dist/components/sidebar/Sidebar.variants.d.ts +5 -0
  300. package/dist/components/sidebar/Sidebar.variants.js +12 -0
  301. package/dist/components/sidebar/SidebarCollapsibleItem.svelte +77 -0
  302. package/dist/components/sidebar/SidebarCollapsibleItem.svelte.d.ts +4 -0
  303. package/dist/components/sidebar/SidebarCollapsibleItem.types.d.ts +9 -0
  304. package/dist/components/sidebar/SidebarCollapsibleItem.types.js +1 -0
  305. package/dist/components/sidebar/SidebarContent.svelte +14 -0
  306. package/dist/components/sidebar/SidebarContent.svelte.d.ts +4 -0
  307. package/dist/components/sidebar/SidebarContent.types.d.ts +6 -0
  308. package/dist/components/sidebar/SidebarContent.types.js +1 -0
  309. package/dist/components/sidebar/SidebarFooter.svelte +14 -0
  310. package/dist/components/sidebar/SidebarFooter.svelte.d.ts +4 -0
  311. package/dist/components/sidebar/SidebarFooter.types.d.ts +6 -0
  312. package/dist/components/sidebar/SidebarFooter.types.js +1 -0
  313. package/dist/components/sidebar/SidebarGroup.svelte +10 -0
  314. package/dist/components/sidebar/SidebarGroup.svelte.d.ts +4 -0
  315. package/dist/components/sidebar/SidebarGroup.types.d.ts +6 -0
  316. package/dist/components/sidebar/SidebarGroup.types.js +1 -0
  317. package/dist/components/sidebar/SidebarGroupLabel.svelte +21 -0
  318. package/dist/components/sidebar/SidebarGroupLabel.svelte.d.ts +4 -0
  319. package/dist/components/sidebar/SidebarGroupLabel.types.d.ts +6 -0
  320. package/dist/components/sidebar/SidebarGroupLabel.types.js +1 -0
  321. package/dist/components/sidebar/SidebarHeader.svelte +14 -0
  322. package/dist/components/sidebar/SidebarHeader.svelte.d.ts +4 -0
  323. package/dist/components/sidebar/SidebarHeader.types.d.ts +6 -0
  324. package/dist/components/sidebar/SidebarHeader.types.js +1 -0
  325. package/dist/components/sidebar/SidebarItem.svelte +51 -0
  326. package/dist/components/sidebar/SidebarItem.svelte.d.ts +4 -0
  327. package/dist/components/sidebar/SidebarItem.types.d.ts +11 -0
  328. package/dist/components/sidebar/SidebarItem.types.js +1 -0
  329. package/dist/components/sidebar/SidebarItem.variants.d.ts +6 -0
  330. package/dist/components/sidebar/SidebarItem.variants.js +17 -0
  331. package/dist/components/sidebar/SidebarTrigger.svelte +39 -0
  332. package/dist/components/sidebar/SidebarTrigger.svelte.d.ts +4 -0
  333. package/dist/components/sidebar/SidebarTrigger.types.d.ts +8 -0
  334. package/dist/components/sidebar/SidebarTrigger.types.js +1 -0
  335. package/dist/components/sidebar/index.d.ts +20 -0
  336. package/dist/components/sidebar/index.js +11 -0
  337. package/dist/components/sidebar/sidebar-context.d.ts +8 -0
  338. package/dist/components/sidebar/sidebar-context.js +12 -0
  339. package/dist/components/skeleton/Skeleton.svelte +12 -0
  340. package/dist/components/skeleton/Skeleton.svelte.d.ts +4 -0
  341. package/dist/components/skeleton/Skeleton.types.d.ts +4 -0
  342. package/dist/components/skeleton/Skeleton.types.js +1 -0
  343. package/dist/components/skeleton/index.d.ts +2 -0
  344. package/dist/components/skeleton/index.js +1 -0
  345. package/dist/components/slider/Slider.svelte +30 -0
  346. package/dist/components/slider/Slider.svelte.d.ts +4 -0
  347. package/dist/components/slider/Slider.types.d.ts +9 -0
  348. package/dist/components/slider/Slider.types.js +1 -0
  349. package/dist/components/slider/Slider.variants.d.ts +5 -0
  350. package/dist/components/slider/Slider.variants.js +26 -0
  351. package/dist/components/slider/index.d.ts +3 -0
  352. package/dist/components/slider/index.js +2 -0
  353. package/dist/components/spinner/Spinner.svelte +24 -0
  354. package/dist/components/spinner/Spinner.svelte.d.ts +4 -0
  355. package/dist/components/spinner/Spinner.types.d.ts +10 -0
  356. package/dist/components/spinner/Spinner.types.js +1 -0
  357. package/dist/components/spinner/Spinner.variants.d.ts +5 -0
  358. package/dist/components/spinner/Spinner.variants.js +13 -0
  359. package/dist/components/spinner/index.d.ts +3 -0
  360. package/dist/components/spinner/index.js +2 -0
  361. package/dist/components/switch/Switch.svelte +37 -0
  362. package/dist/components/switch/Switch.svelte.d.ts +4 -0
  363. package/dist/components/switch/Switch.types.d.ts +13 -0
  364. package/dist/components/switch/Switch.types.js +1 -0
  365. package/dist/components/switch/Switch.variants.d.ts +8 -0
  366. package/dist/components/switch/Switch.variants.js +25 -0
  367. package/dist/components/switch/index.d.ts +3 -0
  368. package/dist/components/switch/index.js +2 -0
  369. package/dist/components/table/Table.svelte +14 -0
  370. package/dist/components/table/Table.svelte.d.ts +4 -0
  371. package/dist/components/table/Table.types.d.ts +10 -0
  372. package/dist/components/table/Table.types.js +1 -0
  373. package/dist/components/table/TableBody.svelte +10 -0
  374. package/dist/components/table/TableBody.svelte.d.ts +4 -0
  375. package/dist/components/table/TableBody.types.d.ts +6 -0
  376. package/dist/components/table/TableBody.types.js +1 -0
  377. package/dist/components/table/TableCaption.svelte +10 -0
  378. package/dist/components/table/TableCaption.svelte.d.ts +4 -0
  379. package/dist/components/table/TableCaption.types.d.ts +6 -0
  380. package/dist/components/table/TableCaption.types.js +1 -0
  381. package/dist/components/table/TableCell.svelte +13 -0
  382. package/dist/components/table/TableCell.svelte.d.ts +4 -0
  383. package/dist/components/table/TableCell.types.d.ts +6 -0
  384. package/dist/components/table/TableCell.types.js +1 -0
  385. package/dist/components/table/TableFooter.svelte +13 -0
  386. package/dist/components/table/TableFooter.svelte.d.ts +4 -0
  387. package/dist/components/table/TableFooter.types.d.ts +6 -0
  388. package/dist/components/table/TableFooter.types.js +1 -0
  389. package/dist/components/table/TableHead.svelte +17 -0
  390. package/dist/components/table/TableHead.svelte.d.ts +4 -0
  391. package/dist/components/table/TableHead.types.d.ts +6 -0
  392. package/dist/components/table/TableHead.types.js +1 -0
  393. package/dist/components/table/TableHeader.svelte +10 -0
  394. package/dist/components/table/TableHeader.svelte.d.ts +4 -0
  395. package/dist/components/table/TableHeader.types.d.ts +6 -0
  396. package/dist/components/table/TableHeader.types.js +1 -0
  397. package/dist/components/table/TableRow.svelte +17 -0
  398. package/dist/components/table/TableRow.svelte.d.ts +4 -0
  399. package/dist/components/table/TableRow.types.d.ts +11 -0
  400. package/dist/components/table/TableRow.types.js +1 -0
  401. package/dist/components/table/index.d.ts +16 -0
  402. package/dist/components/table/index.js +8 -0
  403. package/dist/components/tabs/Tabs.svelte +19 -0
  404. package/dist/components/tabs/Tabs.svelte.d.ts +4 -0
  405. package/dist/components/tabs/Tabs.types.d.ts +7 -0
  406. package/dist/components/tabs/Tabs.types.js +1 -0
  407. package/dist/components/tabs/TabsContent.svelte +24 -0
  408. package/dist/components/tabs/TabsContent.svelte.d.ts +4 -0
  409. package/dist/components/tabs/TabsContent.types.d.ts +7 -0
  410. package/dist/components/tabs/TabsContent.types.js +1 -0
  411. package/dist/components/tabs/TabsList.svelte +61 -0
  412. package/dist/components/tabs/TabsList.svelte.d.ts +4 -0
  413. package/dist/components/tabs/TabsList.types.d.ts +6 -0
  414. package/dist/components/tabs/TabsList.types.js +1 -0
  415. package/dist/components/tabs/TabsTrigger.svelte +37 -0
  416. package/dist/components/tabs/TabsTrigger.svelte.d.ts +4 -0
  417. package/dist/components/tabs/TabsTrigger.types.d.ts +8 -0
  418. package/dist/components/tabs/TabsTrigger.types.js +1 -0
  419. package/dist/components/tabs/index.d.ts +8 -0
  420. package/dist/components/tabs/index.js +4 -0
  421. package/dist/components/tabs/tabs-context.d.ts +8 -0
  422. package/dist/components/tabs/tabs-context.js +12 -0
  423. package/dist/components/text-field/TextField.svelte +53 -0
  424. package/dist/components/text-field/TextField.svelte.d.ts +4 -0
  425. package/dist/components/text-field/TextField.types.d.ts +17 -0
  426. package/dist/components/text-field/TextField.types.js +1 -0
  427. package/dist/components/text-field/TextField.variants.d.ts +6 -0
  428. package/dist/components/text-field/TextField.variants.js +18 -0
  429. package/dist/components/text-field/index.d.ts +3 -0
  430. package/dist/components/text-field/index.js +2 -0
  431. package/dist/components/textarea/Textarea.svelte +53 -0
  432. package/dist/components/textarea/Textarea.svelte.d.ts +4 -0
  433. package/dist/components/textarea/Textarea.types.d.ts +15 -0
  434. package/dist/components/textarea/Textarea.types.js +1 -0
  435. package/dist/components/textarea/Textarea.variants.d.ts +6 -0
  436. package/dist/components/textarea/Textarea.variants.js +18 -0
  437. package/dist/components/textarea/index.d.ts +3 -0
  438. package/dist/components/textarea/index.js +2 -0
  439. package/dist/components/toast/ToastItem.svelte +109 -0
  440. package/dist/components/toast/ToastItem.svelte.d.ts +17 -0
  441. package/dist/components/toast/Toaster.svelte +51 -0
  442. package/dist/components/toast/Toaster.svelte.d.ts +4 -0
  443. package/dist/components/toast/Toaster.types.d.ts +20 -0
  444. package/dist/components/toast/Toaster.types.js +1 -0
  445. package/dist/components/toast/Toaster.variants.d.ts +5 -0
  446. package/dist/components/toast/Toaster.variants.js +14 -0
  447. package/dist/components/toast/index.d.ts +4 -0
  448. package/dist/components/toast/index.js +3 -0
  449. package/dist/components/toast/toast-store.svelte.d.ts +28 -0
  450. package/dist/components/toast/toast-store.svelte.js +34 -0
  451. package/dist/components/toggle/Toggle.svelte +29 -0
  452. package/dist/components/toggle/Toggle.svelte.d.ts +4 -0
  453. package/dist/components/toggle/Toggle.types.d.ts +9 -0
  454. package/dist/components/toggle/Toggle.types.js +1 -0
  455. package/dist/components/toggle/Toggle.variants.d.ts +6 -0
  456. package/dist/components/toggle/Toggle.variants.js +18 -0
  457. package/dist/components/toggle/index.d.ts +3 -0
  458. package/dist/components/toggle/index.js +2 -0
  459. package/dist/components/tooltip/Tooltip.svelte +113 -0
  460. package/dist/components/tooltip/Tooltip.svelte.d.ts +4 -0
  461. package/dist/components/tooltip/Tooltip.types.d.ts +19 -0
  462. package/dist/components/tooltip/Tooltip.types.js +1 -0
  463. package/dist/components/tooltip/index.d.ts +2 -0
  464. package/dist/components/tooltip/index.js +1 -0
  465. package/dist/components/typography/Typography.svelte +33 -0
  466. package/dist/components/typography/Typography.svelte.d.ts +4 -0
  467. package/dist/components/typography/Typography.types.d.ts +10 -0
  468. package/dist/components/typography/Typography.types.js +1 -0
  469. package/dist/components/typography/Typography.variants.d.ts +5 -0
  470. package/dist/components/typography/Typography.variants.js +17 -0
  471. package/dist/components/typography/index.d.ts +3 -0
  472. package/dist/components/typography/index.js +2 -0
  473. package/dist/index.css +399 -0
  474. package/dist/utils/calendar-grid.d.ts +20 -0
  475. package/dist/utils/calendar-grid.js +26 -0
  476. package/dist/utils/cn.d.ts +2 -0
  477. package/dist/utils/cn.js +5 -0
  478. package/dist/utils/dismissable-layer.d.ts +12 -0
  479. package/dist/utils/dismissable-layer.js +44 -0
  480. package/dist/utils/floating.d.ts +18 -0
  481. package/dist/utils/floating.js +61 -0
  482. package/dist/utils/focus-trap.d.ts +12 -0
  483. package/dist/utils/focus-trap.js +55 -0
  484. package/dist/utils/id.d.ts +11 -0
  485. package/dist/utils/id.js +17 -0
  486. package/dist/utils/pagination-range.d.ts +18 -0
  487. package/dist/utils/pagination-range.js +34 -0
  488. package/dist/utils/portal.d.ts +5 -0
  489. package/dist/utils/portal.js +23 -0
  490. package/dist/utils/presence.svelte.d.ts +9 -0
  491. package/dist/utils/presence.svelte.js +38 -0
  492. package/dist/utils/roving-focus.d.ts +20 -0
  493. package/dist/utils/roving-focus.js +44 -0
  494. package/dist/utils/scroll-lock.d.ts +7 -0
  495. package/dist/utils/scroll-lock.js +33 -0
  496. package/package.json +108 -0
@@ -0,0 +1,528 @@
1
+ <script lang="ts" generics="T extends ComboboxValue">
2
+ import { cn } from '../../utils/cn.js';
3
+ import { floating } from '../../utils/floating.js';
4
+ import { portal } from '../../utils/portal.js';
5
+ import { createPresence } from '../../utils/presence.svelte.js';
6
+ import { createDismissableLayer } from '../../utils/dismissable-layer.js';
7
+ import { createIds } from '../../utils/id.js';
8
+ import { Spinner } from '../spinner/index.js';
9
+ import { ComboboxState, splitMatch } from './combobox-state.svelte.js';
10
+ import {
11
+ comboboxVariants,
12
+ comboboxOptionVariants,
13
+ comboboxChipVariants
14
+ } from './Combobox.variants.js';
15
+ import type { ComboboxOption, ComboboxProps, ComboboxValue } from './Combobox.types.js';
16
+
17
+ let {
18
+ options = [],
19
+ value = $bindable(),
20
+ search = $bindable(''),
21
+ multiple = false,
22
+ name,
23
+ id,
24
+ class: className,
25
+ classes,
26
+ labels,
27
+ size,
28
+ manualFilter = false,
29
+ loading = false,
30
+ error,
31
+ disabled = false,
32
+ invalid = false,
33
+ clearable = false,
34
+ maxChips = 3,
35
+ prefix,
36
+ searchDebounce = 250,
37
+ filter,
38
+ portalTarget,
39
+ onSearchChange,
40
+ onValueChange,
41
+ onRetry,
42
+ onEndReached,
43
+ item,
44
+ empty
45
+ }: ComboboxProps<T> = $props();
46
+
47
+ const uid = $props.id();
48
+ const ids = createIds(uid, 'listbox');
49
+
50
+ let triggerEl = $state<HTMLDivElement | null>(null);
51
+ let contentEl = $state<HTMLDivElement | null>(null);
52
+ let inputEl = $state<HTMLInputElement | null>(null);
53
+ let listEl = $state<HTMLElement | null>(null);
54
+
55
+ const combobox = new ComboboxState<T>({
56
+ get options() {
57
+ return options;
58
+ },
59
+ get value() {
60
+ return value;
61
+ },
62
+ get multiple() {
63
+ return multiple;
64
+ },
65
+ get manualFilter() {
66
+ return manualFilter;
67
+ },
68
+ get searchDebounce() {
69
+ return searchDebounce;
70
+ },
71
+ get filter() {
72
+ return filter;
73
+ },
74
+ setValue(next) {
75
+ value = next;
76
+ onValueChange?.(next);
77
+ },
78
+ setSearch(query) {
79
+ if (query === search) return;
80
+ search = query;
81
+ onSearchChange?.(query);
82
+ }
83
+ });
84
+
85
+ const presence = createPresence(
86
+ () => combobox.open,
87
+ () => contentEl
88
+ );
89
+
90
+ const visibleChips = $derived(combobox.selectedItems.slice(0, maxChips));
91
+ const hiddenChipCount = $derived(Math.max(0, combobox.selectedItems.length - maxChips));
92
+ const showClear = $derived(clearable && !disabled && combobox.values.length > 0);
93
+ const activeId = $derived(
94
+ combobox.filtered.length > 0 ? `${ids.listbox}-opt-${combobox.activeIndex}` : undefined
95
+ );
96
+ const showTypeToSearch = $derived(
97
+ manualFilter && !loading && !error && combobox.inputValue.trim() === '' && options.length === 0
98
+ );
99
+ const showSkeleton = $derived(loading && combobox.filtered.length === 0);
100
+
101
+ // Keeps labels of currently selected options available after `options` changes
102
+ // (relevant in remote-search mode, where `options` is replaced every query).
103
+ $effect(() => {
104
+ combobox.cacheSelected();
105
+ });
106
+
107
+ $effect(() => {
108
+ void combobox.filtered;
109
+ combobox.clampActive();
110
+ });
111
+
112
+ $effect(() => () => combobox.destroy());
113
+
114
+ $effect(() => {
115
+ if (!combobox.open) return;
116
+
117
+ // `contentEl` is itself tracked $state, so reading it makes this effect
118
+ // re-run once the portalled panel actually mounts — see Dropdown.svelte
119
+ // for the same pattern.
120
+ if (!contentEl) return;
121
+
122
+ inputEl?.focus();
123
+
124
+ return createDismissableLayer(() => [triggerEl, contentEl], {
125
+ onPointerDownOutside: () => combobox.closeMenu(),
126
+ onEscapeKeydown: (event) => {
127
+ event.preventDefault();
128
+ closeAndFocusTrigger();
129
+ }
130
+ });
131
+ });
132
+
133
+ $effect(() => {
134
+ if (!combobox.open) return;
135
+ const index = combobox.activeIndex;
136
+ listEl
137
+ ?.querySelector<HTMLElement>(`[data-index="${index}"]`)
138
+ ?.scrollIntoView({ block: 'nearest' });
139
+ });
140
+
141
+ // Guards against `onEndReached` firing repeatedly for every scroll tick
142
+ // while the same page is still in flight. Re-armed below whenever `options`
143
+ // or `loading` changes — a page landing (or a load failing and resetting
144
+ // `loading`) is what allows the next threshold-cross to fire again.
145
+ let endReachedFired = false;
146
+
147
+ $effect(() => {
148
+ void options;
149
+ void loading;
150
+ endReachedFired = false;
151
+ });
152
+
153
+ function handleListScroll(event: Event): void {
154
+ if (!onEndReached || loading || endReachedFired) return;
155
+
156
+ const el = event.currentTarget as HTMLElement;
157
+ const distanceToBottom = el.scrollHeight - el.scrollTop - el.clientHeight;
158
+ if (distanceToBottom > 48) return;
159
+
160
+ endReachedFired = true;
161
+ onEndReached();
162
+ }
163
+
164
+ function closeAndFocusTrigger(): void {
165
+ combobox.closeMenu();
166
+ triggerEl?.focus();
167
+ }
168
+
169
+ function handleTriggerKeydown(event: KeyboardEvent): void {
170
+ if (disabled) return;
171
+
172
+ if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {
173
+ event.preventDefault();
174
+ combobox.openMenu();
175
+ return;
176
+ }
177
+ if (event.key === 'Escape') combobox.closeMenu();
178
+ }
179
+
180
+ function handleInputKeydown(event: KeyboardEvent): void {
181
+ switch (event.key) {
182
+ case 'ArrowDown':
183
+ event.preventDefault();
184
+ combobox.move(1);
185
+ break;
186
+ case 'ArrowUp':
187
+ event.preventDefault();
188
+ combobox.move(-1);
189
+ break;
190
+ case 'Home':
191
+ event.preventDefault();
192
+ combobox.moveTo('first');
193
+ break;
194
+ case 'End':
195
+ event.preventDefault();
196
+ combobox.moveTo('last');
197
+ break;
198
+ case 'Enter':
199
+ event.preventDefault();
200
+ combobox.selectActive();
201
+ break;
202
+ case 'Escape':
203
+ // Handled here so the popup closes and focus returns to the trigger
204
+ // in one step, rather than leaving focus stranded on an unmounting input.
205
+ event.preventDefault();
206
+ closeAndFocusTrigger();
207
+ break;
208
+ case 'Tab':
209
+ combobox.closeMenu();
210
+ break;
211
+ case 'Backspace':
212
+ if (multiple && combobox.inputValue === '') {
213
+ event.preventDefault();
214
+ combobox.popLast();
215
+ }
216
+ break;
217
+ }
218
+ }
219
+
220
+ const triggerProps = $derived({
221
+ id,
222
+ role: 'combobox' as const,
223
+ tabindex: disabled ? -1 : 0,
224
+ 'aria-expanded': combobox.open,
225
+ 'aria-controls': ids.listbox,
226
+ 'aria-haspopup': 'listbox' as const,
227
+ 'aria-invalid': invalid || undefined,
228
+ 'data-invalid': invalid ? '' : undefined,
229
+ 'data-disabled': disabled ? '' : undefined,
230
+ onclick: () => !disabled && combobox.toggleMenu(),
231
+ onkeydown: handleTriggerKeydown
232
+ });
233
+ </script>
234
+
235
+ {#snippet optionRow(option: ComboboxOption<T>, index: number)}
236
+ {@const selected = combobox.isSelected(option.value)}
237
+ {@const active = index === combobox.activeIndex}
238
+ <!--
239
+ Keyboard interaction lives on the search input via aria-activedescendant —
240
+ options are never focused themselves.
241
+ -->
242
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
243
+ <div
244
+ role="option"
245
+ tabindex="-1"
246
+ id={`${ids.listbox}-opt-${index}`}
247
+ data-index={index}
248
+ aria-selected={selected}
249
+ aria-disabled={option.disabled || undefined}
250
+ class={cn(
251
+ comboboxOptionVariants({ active, selected, disabled: !!option.disabled }),
252
+ classes?.option
253
+ )}
254
+ onclick={() => combobox.select(option)}
255
+ onmousedown={(event) => event.preventDefault()}
256
+ onmouseenter={() => combobox.setActive(index)}
257
+ >
258
+ {#if item}
259
+ {@render item({ option, active, selected })}
260
+ {:else}
261
+ <span class="min-w-0 flex-1 truncate">
262
+ {#each splitMatch(option.label, combobox.inputValue) as part, partIndex (partIndex)}
263
+ {#if part.match}
264
+ <mark class="bg-transparent font-semibold text-primary">{part.text}</mark>
265
+ {:else}{part.text}{/if}
266
+ {/each}
267
+ </span>
268
+ {#if selected}
269
+ <svg
270
+ viewBox="0 0 24 24"
271
+ fill="none"
272
+ stroke="currentColor"
273
+ stroke-width="2"
274
+ stroke-linecap="round"
275
+ stroke-linejoin="round"
276
+ aria-hidden="true"
277
+ class="size-4 shrink-0 text-primary"
278
+ >
279
+ <path d="M20 6 9 17l-5-5" />
280
+ </svg>
281
+ {/if}
282
+ {/if}
283
+ </div>
284
+ {/snippet}
285
+
286
+ <div class={cn('relative w-full', className)}>
287
+ <div
288
+ bind:this={triggerEl}
289
+ {...triggerProps}
290
+ class={cn(comboboxVariants({ size }), showClear ? 'pr-14' : 'pr-9', classes?.trigger)}
291
+ >
292
+ {#if prefix}
293
+ <span class="flex shrink-0 items-center justify-center text-foreground-faint">
294
+ {#if typeof prefix === 'string'}
295
+ <span class="font-medium">{prefix}</span>
296
+ {:else}
297
+ {@render prefix()}
298
+ {/if}
299
+ </span>
300
+ {/if}
301
+ <div class="flex min-w-0 flex-1 flex-wrap items-center gap-tight">
302
+ {#if combobox.selectedItems.length === 0}
303
+ <span class="truncate leading-snug text-foreground-faint">
304
+ {labels?.placeholder ?? 'Select…'}
305
+ </span>
306
+ {:else if multiple}
307
+ {#each visibleChips as chip (chip.value)}
308
+ <span class={cn(comboboxChipVariants(), classes?.chip)}>
309
+ <span class="truncate">{chip.label}</span>
310
+ <button
311
+ type="button"
312
+ tabindex="-1"
313
+ aria-label={labels?.removeChip?.(chip.label) ?? `Remove ${chip.label}`}
314
+ class="rounded-sm p-0.5 transition-colors duration-150 hover:bg-surface-hover"
315
+ onclick={(event) => {
316
+ event.stopPropagation();
317
+ combobox.deselect(chip.value);
318
+ }}
319
+ >
320
+ <svg
321
+ viewBox="0 0 24 24"
322
+ fill="none"
323
+ stroke="currentColor"
324
+ stroke-width="2"
325
+ stroke-linecap="round"
326
+ stroke-linejoin="round"
327
+ aria-hidden="true"
328
+ class="size-3"
329
+ >
330
+ <path d="M18 6 6 18" />
331
+ <path d="m6 6 12 12" />
332
+ </svg>
333
+ </button>
334
+ </span>
335
+ {/each}
336
+ {#if hiddenChipCount > 0}
337
+ <span class="text-xs font-medium text-foreground-subtle">+{hiddenChipCount}</span>
338
+ {/if}
339
+ {:else}
340
+ <span class="truncate leading-snug">{combobox.selectedItems[0].label}</span>
341
+ {/if}
342
+ </div>
343
+ </div>
344
+
345
+ {#if showClear}
346
+ <button
347
+ type="button"
348
+ tabindex="-1"
349
+ aria-label={labels?.clearSelection ?? 'Clear selection'}
350
+ class="absolute top-1/2 right-8 -translate-y-1/2 rounded-md p-1 text-foreground-faint transition-colors duration-150 hover:bg-surface-subtle hover:text-foreground-muted"
351
+ onclick={() => combobox.clear()}
352
+ >
353
+ <svg
354
+ viewBox="0 0 24 24"
355
+ fill="none"
356
+ stroke="currentColor"
357
+ stroke-width="2"
358
+ stroke-linecap="round"
359
+ stroke-linejoin="round"
360
+ aria-hidden="true"
361
+ class="size-4"
362
+ >
363
+ <path d="M18 6 6 18" />
364
+ <path d="m6 6 12 12" />
365
+ </svg>
366
+ </button>
367
+ {/if}
368
+
369
+ <svg
370
+ viewBox="0 0 24 24"
371
+ fill="none"
372
+ stroke="currentColor"
373
+ stroke-width="2"
374
+ stroke-linecap="round"
375
+ stroke-linejoin="round"
376
+ aria-hidden="true"
377
+ class={cn(
378
+ 'pointer-events-none absolute top-1/2 right-3 size-4 -translate-y-1/2 text-foreground-faint transition-transform duration-200',
379
+ combobox.open && 'rotate-180'
380
+ )}
381
+ >
382
+ <path d="m7 15 5 5 5-5" />
383
+ <path d="m7 9 5-5 5 5" />
384
+ </svg>
385
+
386
+ {#if name}
387
+ {#if combobox.values.length === 0}
388
+ <input type="hidden" {name} value="" />
389
+ {:else}
390
+ {#each combobox.values as selectedValue (selectedValue)}
391
+ <input type="hidden" {name} value={selectedValue} />
392
+ {/each}
393
+ {/if}
394
+ {/if}
395
+ </div>
396
+
397
+ {#if presence.current}
398
+ <div
399
+ bind:this={contentEl}
400
+ data-slot="combobox-content"
401
+ data-state={combobox.open ? 'open' : 'closed'}
402
+ inert={!combobox.open}
403
+ use:portal={{ target: portalTarget }}
404
+ use:floating={{
405
+ reference: triggerEl,
406
+ placement: 'bottom-start',
407
+ offset: 6,
408
+ matchReferenceWidth: true,
409
+ maxHeight: 320
410
+ }}
411
+ class={cn(
412
+ 'z-50 flex flex-col overflow-hidden rounded-lg border border-border bg-surface shadow-sm',
413
+ classes?.content
414
+ )}
415
+ >
416
+ <div class="flex shrink-0 items-center gap-tight border-b border-border px-compact">
417
+ <svg
418
+ viewBox="0 0 24 24"
419
+ fill="none"
420
+ stroke="currentColor"
421
+ stroke-width="2"
422
+ stroke-linecap="round"
423
+ stroke-linejoin="round"
424
+ aria-hidden="true"
425
+ class="size-4 shrink-0 text-foreground-faint"
426
+ >
427
+ <circle cx="11" cy="11" r="8" />
428
+ <path d="m21 21-4.3-4.3" />
429
+ </svg>
430
+ <input
431
+ bind:this={inputEl}
432
+ type="text"
433
+ autocomplete="off"
434
+ spellcheck="false"
435
+ aria-label={labels?.searchPlaceholder ?? 'Search…'}
436
+ aria-autocomplete="list"
437
+ aria-controls={ids.listbox}
438
+ aria-activedescendant={activeId}
439
+ placeholder={labels?.searchPlaceholder ?? 'Search…'}
440
+ value={combobox.inputValue}
441
+ class={cn(
442
+ 'h-10 w-full flex-1 bg-transparent text-sm leading-snug text-foreground placeholder:text-foreground-faint focus:outline-none',
443
+ classes?.input
444
+ )}
445
+ oninput={(event) => combobox.setInputValue(event.currentTarget.value)}
446
+ onkeydown={handleInputKeydown}
447
+ />
448
+ {#if loading}
449
+ <Spinner size="sm" label="" class="shrink-0 text-primary" />
450
+ {/if}
451
+ </div>
452
+
453
+ <div
454
+ bind:this={listEl}
455
+ role="listbox"
456
+ id={ids.listbox}
457
+ aria-multiselectable={multiple || undefined}
458
+ class="min-h-0 flex-1 overflow-y-auto p-1"
459
+ onscroll={handleListScroll}
460
+ >
461
+ {#if error}
462
+ <div class="flex flex-col items-center gap-cozy px-compact py-6 text-center">
463
+ <svg
464
+ viewBox="0 0 24 24"
465
+ fill="none"
466
+ stroke="currentColor"
467
+ stroke-width="2"
468
+ stroke-linecap="round"
469
+ stroke-linejoin="round"
470
+ aria-hidden="true"
471
+ class="size-5 text-danger"
472
+ >
473
+ <circle cx="12" cy="12" r="10" />
474
+ <line x1="12" y1="8" x2="12" y2="12" />
475
+ <line x1="12" y1="16" x2="12.01" y2="16" />
476
+ </svg>
477
+ <p class="text-sm leading-snug text-foreground-subtle">{error}</p>
478
+ {#if onRetry}
479
+ <button
480
+ type="button"
481
+ class="rounded-md px-2 py-1 text-xs font-medium text-primary transition-colors duration-150 hover:bg-surface-subtle"
482
+ onclick={() => onRetry?.()}
483
+ >
484
+ {labels?.retry ?? 'Retry'}
485
+ </button>
486
+ {/if}
487
+ </div>
488
+ {:else if showSkeleton}
489
+ <div class="flex flex-col gap-tight p-1">
490
+ {#each [0, 1, 2] as skeletonRow (skeletonRow)}
491
+ <div class="h-8 animate-pulse rounded-md bg-surface-subtle"></div>
492
+ {/each}
493
+ </div>
494
+ {:else if showTypeToSearch}
495
+ <p class="px-compact py-6 text-center text-sm leading-snug text-foreground-faint">
496
+ {labels?.typeToSearch ?? 'Type to search…'}
497
+ </p>
498
+ {:else if combobox.filtered.length === 0}
499
+ {#if empty}
500
+ {@render empty()}
501
+ {:else}
502
+ <p class="px-compact py-6 text-center text-sm leading-snug text-foreground-faint">
503
+ {labels?.empty ?? 'No results found.'}
504
+ </p>
505
+ {/if}
506
+ {:else}
507
+ {#each combobox.groups as group (group.label ?? '__ungrouped')}
508
+ {#if group.label}
509
+ <div role="group" aria-label={group.label}>
510
+ <span
511
+ class="block px-compact pt-3 pb-1 text-[11px] font-semibold tracking-wide text-foreground-faint uppercase"
512
+ >
513
+ {group.label}
514
+ </span>
515
+ {#each group.items as entry (entry.option.value)}
516
+ {@render optionRow(entry.option, entry.index)}
517
+ {/each}
518
+ </div>
519
+ {:else}
520
+ {#each group.items as entry (entry.option.value)}
521
+ {@render optionRow(entry.option, entry.index)}
522
+ {/each}
523
+ {/if}
524
+ {/each}
525
+ {/if}
526
+ </div>
527
+ </div>
528
+ {/if}
@@ -0,0 +1,25 @@
1
+ import type { ComboboxProps, ComboboxValue } from './Combobox.types.js';
2
+ declare function $$render<T extends ComboboxValue>(): {
3
+ props: ComboboxProps<T>;
4
+ exports: {};
5
+ bindings: "search" | "value";
6
+ slots: {};
7
+ events: {};
8
+ };
9
+ declare class __sveltets_Render<T extends ComboboxValue> {
10
+ props(): ReturnType<typeof $$render<T>>['props'];
11
+ events(): ReturnType<typeof $$render<T>>['events'];
12
+ slots(): ReturnType<typeof $$render<T>>['slots'];
13
+ bindings(): "search" | "value";
14
+ exports(): {};
15
+ }
16
+ interface $$IsomorphicComponent {
17
+ new <T extends ComboboxValue>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
18
+ $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
19
+ } & ReturnType<__sveltets_Render<T>['exports']>;
20
+ <T extends ComboboxValue>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
21
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
22
+ }
23
+ declare const Combobox: $$IsomorphicComponent;
24
+ type Combobox<T extends ComboboxValue> = InstanceType<typeof Combobox<T>>;
25
+ export default Combobox;
@@ -0,0 +1,83 @@
1
+ import type { Snippet } from 'svelte';
2
+ import type { ComboboxVariantProps } from './Combobox.variants.js';
3
+ export type ComboboxValue = string | number;
4
+ export interface ComboboxOption<T extends ComboboxValue = ComboboxValue> {
5
+ value: T;
6
+ label: string;
7
+ disabled?: boolean;
8
+ /** Flat grouping key. Options sharing a key are rendered under one header. */
9
+ group?: string;
10
+ /** Extra terms matched by the local filter in addition to the label. */
11
+ keywords?: string[];
12
+ }
13
+ /** A filtered option paired with its index in the flat filtered list. */
14
+ export interface ComboboxRenderItem<T extends ComboboxValue = ComboboxValue> {
15
+ option: ComboboxOption<T>;
16
+ index: number;
17
+ }
18
+ export interface ComboboxRenderGroup<T extends ComboboxValue = ComboboxValue> {
19
+ label: string | undefined;
20
+ items: ComboboxRenderItem<T>[];
21
+ }
22
+ export type ComboboxFilter<T extends ComboboxValue = ComboboxValue> = (option: ComboboxOption<T>, query: string) => boolean;
23
+ /** All user-facing strings, structured so a consumer can fully localize — never hardcode English here. */
24
+ export interface ComboboxLabels {
25
+ placeholder?: string;
26
+ searchPlaceholder?: string;
27
+ empty?: string;
28
+ typeToSearch?: string;
29
+ retry?: string;
30
+ clearSelection?: string;
31
+ removeChip?: (label: string) => string;
32
+ }
33
+ export interface ComboboxProps<T extends ComboboxValue = ComboboxValue> extends ComboboxVariantProps {
34
+ /** Option list. Supply it from anywhere — static array, TanStack Query, plain fetch. */
35
+ options?: ComboboxOption<T>[];
36
+ value?: T | T[];
37
+ /** Debounced query. Bind it and use it as your data-layer key — fetching/caching/racing is entirely up to you. */
38
+ search?: string;
39
+ multiple?: boolean;
40
+ name?: string;
41
+ id?: string;
42
+ class?: string;
43
+ classes?: {
44
+ trigger?: string;
45
+ content?: string;
46
+ input?: string;
47
+ option?: string;
48
+ chip?: string;
49
+ };
50
+ labels?: ComboboxLabels;
51
+ /** Skip local filtering because the data source already filtered server-side. */
52
+ manualFilter?: boolean;
53
+ loading?: boolean;
54
+ error?: string;
55
+ disabled?: boolean;
56
+ invalid?: boolean;
57
+ clearable?: boolean;
58
+ /** Chips rendered before collapsing the rest into a "+N" counter. */
59
+ maxChips?: number;
60
+ /** Leading adornment in the trigger: plain text or a snippet (icon, badge, …). */
61
+ prefix?: Snippet | string;
62
+ searchDebounce?: number;
63
+ filter?: ComboboxFilter<T>;
64
+ portalTarget?: HTMLElement | string;
65
+ onSearchChange?: (query: string) => void;
66
+ onValueChange?: (value: T | T[] | undefined) => void;
67
+ onRetry?: () => void;
68
+ /**
69
+ * Fired once when the listbox is scrolled near its bottom edge — wire this
70
+ * up to fetch and append the next page. The component only signals; it
71
+ * does not fetch, merge, or track pages itself (same "consumer owns the
72
+ * data layer" philosophy as `onSearchChange`). Re-arms automatically once
73
+ * `options` or `loading` changes, so a page landing (or a load failing and
74
+ * resetting `loading`) is what allows the next threshold-cross to fire again.
75
+ */
76
+ onEndReached?: () => void;
77
+ item?: Snippet<[{
78
+ option: ComboboxOption<T>;
79
+ active: boolean;
80
+ selected: boolean;
81
+ }]>;
82
+ empty?: Snippet;
83
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ export declare const comboboxVariants: (props?: ({
3
+ size?: "sm" | "md" | "lg" | null | undefined;
4
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
5
+ export declare const comboboxOptionVariants: (props?: ({
6
+ active?: boolean | null | undefined;
7
+ selected?: boolean | null | undefined;
8
+ disabled?: boolean | null | undefined;
9
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
10
+ export declare const comboboxChipVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
11
+ export type ComboboxVariantProps = VariantProps<typeof comboboxVariants>;
@@ -0,0 +1,35 @@
1
+ import { cva } from 'class-variance-authority';
2
+ export const comboboxVariants = cva('flex w-full cursor-pointer items-center gap-cozy rounded-md border border-border bg-surface text-left text-foreground transition-colors duration-150 hover:border-border-hover focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none data-disabled:cursor-not-allowed data-disabled:opacity-50 data-invalid:border-danger-border data-invalid:focus-visible:ring-danger', {
3
+ variants: {
4
+ size: {
5
+ sm: 'min-h-8 px-2 py-1 text-xs',
6
+ md: 'min-h-10 px-3 py-1.5 text-sm',
7
+ lg: 'min-h-12 px-control-x py-2 text-base'
8
+ }
9
+ },
10
+ defaultVariants: {
11
+ size: 'md'
12
+ }
13
+ });
14
+ export const comboboxOptionVariants = cva('flex cursor-pointer items-center gap-tight rounded-md px-compact py-2 text-sm text-foreground-soft leading-snug transition-colors duration-150', {
15
+ variants: {
16
+ active: {
17
+ true: 'bg-surface-subtle',
18
+ false: ''
19
+ },
20
+ selected: {
21
+ true: 'font-medium text-primary',
22
+ false: ''
23
+ },
24
+ disabled: {
25
+ true: 'pointer-events-none opacity-50',
26
+ false: ''
27
+ }
28
+ },
29
+ defaultVariants: {
30
+ active: false,
31
+ selected: false,
32
+ disabled: false
33
+ }
34
+ });
35
+ export const comboboxChipVariants = cva('inline-flex max-w-40 items-center gap-tight rounded-md border border-border bg-surface-subtle py-0.5 pr-1 pl-2 text-xs leading-snug font-medium text-foreground-soft');