pika-ux 1.0.0-beta.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 (292) hide show
  1. package/LICENSE +9 -0
  2. package/dist/icon-generator/generate-icon-ts-indices.js +78 -0
  3. package/dist/shadcn-postinstall/index.js +114 -0
  4. package/package.json +102 -0
  5. package/readme.md +50 -0
  6. package/scripts/setup.js +100 -0
  7. package/src/App.svelte +51 -0
  8. package/src/app.css +349 -0
  9. package/src/icons/ci/index.d.ts +5009 -0
  10. package/src/icons/lucide/index.d.ts +11274 -0
  11. package/src/index.ts +23 -0
  12. package/src/lib/docsite/Navigation.svelte +77 -0
  13. package/src/lib/docsite/pages/Colors.svelte +35 -0
  14. package/src/lib/docsite/pages/Components.svelte +50 -0
  15. package/src/lib/docsite/pages/GettingStarted.svelte +21 -0
  16. package/src/lib/docsite/pages/Icons.svelte +22 -0
  17. package/src/lib/docsite/pages/components/Button.svelte +40 -0
  18. package/src/main.ts +9 -0
  19. package/src/pika/chip/chip.svelte +95 -0
  20. package/src/pika/chip/index.ts +1 -0
  21. package/src/pika/combobox/combobox-types.ts +5 -0
  22. package/src/pika/combobox/combobox.svelte +221 -0
  23. package/src/pika/combobox/index.ts +2 -0
  24. package/src/pika/confirm-dialog/confirm-dialog.svelte +48 -0
  25. package/src/pika/confirm-dialog/index.ts +1 -0
  26. package/src/pika/copy-button/copy-button.svelte +134 -0
  27. package/src/pika/copy-button/index.ts +1 -0
  28. package/src/pika/create-copy-link-button/create-copy-link-button.svelte +133 -0
  29. package/src/pika/create-copy-link-button/index.ts +1 -0
  30. package/src/pika/date-picker/date-picker.svelte +33 -0
  31. package/src/pika/date-picker/index.ts +1 -0
  32. package/src/pika/date-range-picker/date-range-picker.svelte +48 -0
  33. package/src/pika/date-range-picker/index.ts +1 -0
  34. package/src/pika/date-time-picker/date-time-picker.svelte +336 -0
  35. package/src/pika/date-time-picker/index.ts +1 -0
  36. package/src/pika/expandable-container/expandable-container.svelte +155 -0
  37. package/src/pika/expandable-container/index.ts +1 -0
  38. package/src/pika/index.ts +29 -0
  39. package/src/pika/list/index.ts +2 -0
  40. package/src/pika/list/list-types.ts +5 -0
  41. package/src/pika/list/list.svelte +349 -0
  42. package/src/pika/markdown-editor/github.scss +87 -0
  43. package/src/pika/markdown-editor/index.ts +1 -0
  44. package/src/pika/markdown-editor/markdown-editor.svelte +44 -0
  45. package/src/pika/permanent-toast/index.ts +1 -0
  46. package/src/pika/permanent-toast/permanent-toast.svelte +47 -0
  47. package/src/pika/pika-alert/index.ts +1 -0
  48. package/src/pika/pika-alert/pika-alert.svelte +53 -0
  49. package/src/pika/pika-badge/index.ts +1 -0
  50. package/src/pika/pika-badge/pika-badge.svelte +61 -0
  51. package/src/pika/pika-table/index.ts +7 -0
  52. package/src/pika/pika-table/pika-table-cell.svelte +9 -0
  53. package/src/pika/pika-table/pika-table-checkbox.svelte +8 -0
  54. package/src/pika/pika-table/pika-table-column-header.svelte +88 -0
  55. package/src/pika/pika-table/pika-table-faceted-filter.svelte +109 -0
  56. package/src/pika/pika-table/pika-table-pagination.svelte +95 -0
  57. package/src/pika/pika-table/pika-table-row-actions.svelte +58 -0
  58. package/src/pika/pika-table/pika-table-toolbar.svelte +88 -0
  59. package/src/pika/pika-table/pika-table-view-options.svelte +35 -0
  60. package/src/pika/pika-table/pika-table.svelte +295 -0
  61. package/src/pika/pika-table/types.ts +106 -0
  62. package/src/pika/pika-tabs/index.ts +18 -0
  63. package/src/pika/pika-tabs/tabs-content.svelte +16 -0
  64. package/src/pika/pika-tabs/tabs-list.svelte +12 -0
  65. package/src/pika/pika-tabs/tabs-trigger.svelte +23 -0
  66. package/src/pika/popup-help/index.ts +1 -0
  67. package/src/pika/popup-help/popup-help.svelte +33 -0
  68. package/src/pika/simple-dropdown/index.ts +2 -0
  69. package/src/pika/simple-dropdown/simple-dropdown-types.ts +5 -0
  70. package/src/pika/simple-dropdown/simple-dropdown.svelte +288 -0
  71. package/src/pika/slideout/constants.ts +5 -0
  72. package/src/pika/slideout/context.svelte.ts +110 -0
  73. package/src/pika/slideout/index.ts +19 -0
  74. package/src/pika/slideout/slideout-content.svelte +36 -0
  75. package/src/pika/slideout/slideout-panel.svelte +126 -0
  76. package/src/pika/slideout/slideout-provider.svelte +49 -0
  77. package/src/pika/slideout/slideout-rail.svelte.die +69 -0
  78. package/src/pika/slideout/slideout.svelte +33 -0
  79. package/src/pika/slideout/slideout.svelte.old +113 -0
  80. package/src/pika/text-wave-shimmer/index.ts +1 -0
  81. package/src/pika/text-wave-shimmer/text-wave-shimmer.svelte +43 -0
  82. package/src/pika/tooltip-plus/index.ts +1 -0
  83. package/src/pika/tooltip-plus/tooltip-plus.svelte +42 -0
  84. package/src/shadcn/.DS_Store +0 -0
  85. package/src/shadcn/alert/alert-description.svelte +11 -0
  86. package/src/shadcn/alert/alert-title.svelte +24 -0
  87. package/src/shadcn/alert/alert.svelte +39 -0
  88. package/src/shadcn/alert/index.ts +14 -0
  89. package/src/shadcn/avatar/avatar-fallback.svelte +13 -0
  90. package/src/shadcn/avatar/avatar-image.svelte +13 -0
  91. package/src/shadcn/avatar/avatar.svelte +19 -0
  92. package/src/shadcn/avatar/index.ts +13 -0
  93. package/src/shadcn/badge/badge.svelte +48 -0
  94. package/src/shadcn/badge/index.ts +2 -0
  95. package/src/shadcn/breadcrumb/breadcrumb-ellipsis.svelte +12 -0
  96. package/src/shadcn/breadcrumb/breadcrumb-item.svelte +20 -0
  97. package/src/shadcn/breadcrumb/breadcrumb-link.svelte +31 -0
  98. package/src/shadcn/breadcrumb/breadcrumb-list.svelte +20 -0
  99. package/src/shadcn/breadcrumb/breadcrumb-page.svelte +23 -0
  100. package/src/shadcn/breadcrumb/breadcrumb-separator.svelte +15 -0
  101. package/src/shadcn/breadcrumb/breadcrumb.svelte +15 -0
  102. package/src/shadcn/breadcrumb/index.ts +25 -0
  103. package/src/shadcn/button/button.svelte +81 -0
  104. package/src/shadcn/button/index.ts +17 -0
  105. package/src/shadcn/calendar/calendar-caption.svelte +76 -0
  106. package/src/shadcn/calendar/calendar-cell.svelte +19 -0
  107. package/src/shadcn/calendar/calendar-day.svelte +31 -0
  108. package/src/shadcn/calendar/calendar-grid-body.svelte +12 -0
  109. package/src/shadcn/calendar/calendar-grid-head.svelte +12 -0
  110. package/src/shadcn/calendar/calendar-grid-row.svelte +12 -0
  111. package/src/shadcn/calendar/calendar-grid.svelte +16 -0
  112. package/src/shadcn/calendar/calendar-head-cell.svelte +16 -0
  113. package/src/shadcn/calendar/calendar-header.svelte +16 -0
  114. package/src/shadcn/calendar/calendar-heading.svelte +12 -0
  115. package/src/shadcn/calendar/calendar-month-select.svelte +25 -0
  116. package/src/shadcn/calendar/calendar-month.svelte +15 -0
  117. package/src/shadcn/calendar/calendar-months.svelte +20 -0
  118. package/src/shadcn/calendar/calendar-nav.svelte +19 -0
  119. package/src/shadcn/calendar/calendar-next-button.svelte +19 -0
  120. package/src/shadcn/calendar/calendar-prev-button.svelte +19 -0
  121. package/src/shadcn/calendar/calendar-year-select.svelte +25 -0
  122. package/src/shadcn/calendar/calendar.svelte +61 -0
  123. package/src/shadcn/calendar/index.ts +30 -0
  124. package/src/shadcn/card/card-content.svelte +16 -0
  125. package/src/shadcn/card/card-description.svelte +16 -0
  126. package/src/shadcn/card/card-footer.svelte +16 -0
  127. package/src/shadcn/card/card-header.svelte +16 -0
  128. package/src/shadcn/card/card-title.svelte +25 -0
  129. package/src/shadcn/card/card.svelte +20 -0
  130. package/src/shadcn/card/index.ts +22 -0
  131. package/src/shadcn/carousel/carousel-content.svelte +39 -0
  132. package/src/shadcn/carousel/carousel-item.svelte +26 -0
  133. package/src/shadcn/carousel/carousel-next.svelte +30 -0
  134. package/src/shadcn/carousel/carousel-previous.svelte +30 -0
  135. package/src/shadcn/carousel/carousel.svelte +88 -0
  136. package/src/shadcn/carousel/context.ts +51 -0
  137. package/src/shadcn/carousel/index.ts +19 -0
  138. package/src/shadcn/checkbox/checkbox.svelte +36 -0
  139. package/src/shadcn/checkbox/index.ts +6 -0
  140. package/src/shadcn/collapsible/collapsible-content.svelte +7 -0
  141. package/src/shadcn/collapsible/collapsible-trigger.svelte +7 -0
  142. package/src/shadcn/collapsible/collapsible.svelte +11 -0
  143. package/src/shadcn/collapsible/index.ts +13 -0
  144. package/src/shadcn/command/command-dialog.svelte +40 -0
  145. package/src/shadcn/command/command-empty.svelte +13 -0
  146. package/src/shadcn/command/command-group.svelte +30 -0
  147. package/src/shadcn/command/command-input.svelte +21 -0
  148. package/src/shadcn/command/command-item.svelte +16 -0
  149. package/src/shadcn/command/command-link-item.svelte +16 -0
  150. package/src/shadcn/command/command-list.svelte +13 -0
  151. package/src/shadcn/command/command-separator.svelte +13 -0
  152. package/src/shadcn/command/command-shortcut.svelte +20 -0
  153. package/src/shadcn/command/command.svelte +19 -0
  154. package/src/shadcn/command/index.ts +40 -0
  155. package/src/shadcn/data-table/data-table.svelte.ts +141 -0
  156. package/src/shadcn/data-table/flex-render.svelte +36 -0
  157. package/src/shadcn/data-table/index.ts +3 -0
  158. package/src/shadcn/data-table/render-helpers.ts +111 -0
  159. package/src/shadcn/dialog/dialog-close.svelte +7 -0
  160. package/src/shadcn/dialog/dialog-content.svelte +43 -0
  161. package/src/shadcn/dialog/dialog-description.svelte +13 -0
  162. package/src/shadcn/dialog/dialog-footer.svelte +20 -0
  163. package/src/shadcn/dialog/dialog-header.svelte +20 -0
  164. package/src/shadcn/dialog/dialog-overlay.svelte +16 -0
  165. package/src/shadcn/dialog/dialog-title.svelte +13 -0
  166. package/src/shadcn/dialog/dialog-trigger.svelte +7 -0
  167. package/src/shadcn/dialog/index.ts +37 -0
  168. package/src/shadcn/dropdown-menu/dropdown-menu-checkbox-item.svelte +41 -0
  169. package/src/shadcn/dropdown-menu/dropdown-menu-content.svelte +27 -0
  170. package/src/shadcn/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
  171. package/src/shadcn/dropdown-menu/dropdown-menu-group.svelte +7 -0
  172. package/src/shadcn/dropdown-menu/dropdown-menu-item.svelte +27 -0
  173. package/src/shadcn/dropdown-menu/dropdown-menu-label.svelte +24 -0
  174. package/src/shadcn/dropdown-menu/dropdown-menu-radio-group.svelte +16 -0
  175. package/src/shadcn/dropdown-menu/dropdown-menu-radio-item.svelte +26 -0
  176. package/src/shadcn/dropdown-menu/dropdown-menu-separator.svelte +13 -0
  177. package/src/shadcn/dropdown-menu/dropdown-menu-shortcut.svelte +20 -0
  178. package/src/shadcn/dropdown-menu/dropdown-menu-sub-content.svelte +16 -0
  179. package/src/shadcn/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
  180. package/src/shadcn/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
  181. package/src/shadcn/dropdown-menu/index.ts +49 -0
  182. package/src/shadcn/index.ts +40 -0
  183. package/src/shadcn/input/index.ts +7 -0
  184. package/src/shadcn/input/input.svelte +51 -0
  185. package/src/shadcn/is-mobile.svelte.ts +9 -0
  186. package/src/shadcn/label/index.ts +7 -0
  187. package/src/shadcn/label/label.svelte +16 -0
  188. package/src/shadcn/popover/index.ts +17 -0
  189. package/src/shadcn/popover/popover-content.svelte +29 -0
  190. package/src/shadcn/popover/popover-trigger.svelte +8 -0
  191. package/src/shadcn/radio-group/index.ts +10 -0
  192. package/src/shadcn/radio-group/radio-group-item.svelte +25 -0
  193. package/src/shadcn/radio-group/radio-group.svelte +19 -0
  194. package/src/shadcn/range-calendar/index.ts +30 -0
  195. package/src/shadcn/range-calendar/range-calendar-cell.svelte +19 -0
  196. package/src/shadcn/range-calendar/range-calendar-day.svelte +35 -0
  197. package/src/shadcn/range-calendar/range-calendar-grid-body.svelte +12 -0
  198. package/src/shadcn/range-calendar/range-calendar-grid-head.svelte +12 -0
  199. package/src/shadcn/range-calendar/range-calendar-grid-row.svelte +12 -0
  200. package/src/shadcn/range-calendar/range-calendar-grid.svelte +16 -0
  201. package/src/shadcn/range-calendar/range-calendar-head-cell.svelte +16 -0
  202. package/src/shadcn/range-calendar/range-calendar-header.svelte +16 -0
  203. package/src/shadcn/range-calendar/range-calendar-heading.svelte +16 -0
  204. package/src/shadcn/range-calendar/range-calendar-months.svelte +20 -0
  205. package/src/shadcn/range-calendar/range-calendar-next-button.svelte +18 -0
  206. package/src/shadcn/range-calendar/range-calendar-prev-button.svelte +18 -0
  207. package/src/shadcn/range-calendar/range-calendar.svelte +57 -0
  208. package/src/shadcn/resizable/index.ts +13 -0
  209. package/src/shadcn/resizable/resizable-handle.svelte +30 -0
  210. package/src/shadcn/resizable/resizable-pane-group.svelte +22 -0
  211. package/src/shadcn/scroll-area/index.ts +10 -0
  212. package/src/shadcn/scroll-area/scroll-area-scrollbar.svelte +28 -0
  213. package/src/shadcn/scroll-area/scroll-area.svelte +35 -0
  214. package/src/shadcn/select/index.ts +37 -0
  215. package/src/shadcn/select/select-content.svelte +38 -0
  216. package/src/shadcn/select/select-group-heading.svelte +21 -0
  217. package/src/shadcn/select/select-group.svelte +7 -0
  218. package/src/shadcn/select/select-item.svelte +31 -0
  219. package/src/shadcn/select/select-label.svelte +20 -0
  220. package/src/shadcn/select/select-scroll-down-button.svelte +11 -0
  221. package/src/shadcn/select/select-scroll-up-button.svelte +11 -0
  222. package/src/shadcn/select/select-separator.svelte +14 -0
  223. package/src/shadcn/select/select-trigger.svelte +30 -0
  224. package/src/shadcn/separator/index.ts +7 -0
  225. package/src/shadcn/separator/separator.svelte +16 -0
  226. package/src/shadcn/sheet/index.ts +36 -0
  227. package/src/shadcn/sheet/sheet-close.svelte +7 -0
  228. package/src/shadcn/sheet/sheet-content.svelte +66 -0
  229. package/src/shadcn/sheet/sheet-description.svelte +13 -0
  230. package/src/shadcn/sheet/sheet-footer.svelte +15 -0
  231. package/src/shadcn/sheet/sheet-header.svelte +15 -0
  232. package/src/shadcn/sheet/sheet-overlay.svelte +16 -0
  233. package/src/shadcn/sheet/sheet-title.svelte +13 -0
  234. package/src/shadcn/sheet/sheet-trigger.svelte +7 -0
  235. package/src/shadcn/sidebar/constants.ts +6 -0
  236. package/src/shadcn/sidebar/context.svelte.ts +80 -0
  237. package/src/shadcn/sidebar/index.ts +75 -0
  238. package/src/shadcn/sidebar/sidebar-content.svelte +24 -0
  239. package/src/shadcn/sidebar/sidebar-footer.svelte +21 -0
  240. package/src/shadcn/sidebar/sidebar-group-action.svelte +36 -0
  241. package/src/shadcn/sidebar/sidebar-group-content.svelte +21 -0
  242. package/src/shadcn/sidebar/sidebar-group-label.svelte +34 -0
  243. package/src/shadcn/sidebar/sidebar-group.svelte +21 -0
  244. package/src/shadcn/sidebar/sidebar-header.svelte +21 -0
  245. package/src/shadcn/sidebar/sidebar-input.svelte +21 -0
  246. package/src/shadcn/sidebar/sidebar-inset.svelte +24 -0
  247. package/src/shadcn/sidebar/sidebar-menu-action.svelte +43 -0
  248. package/src/shadcn/sidebar/sidebar-menu-badge.svelte +29 -0
  249. package/src/shadcn/sidebar/sidebar-menu-button.svelte +101 -0
  250. package/src/shadcn/sidebar/sidebar-menu-item.svelte +21 -0
  251. package/src/shadcn/sidebar/sidebar-menu-skeleton.svelte +36 -0
  252. package/src/shadcn/sidebar/sidebar-menu-sub-button.svelte +43 -0
  253. package/src/shadcn/sidebar/sidebar-menu-sub-item.svelte +21 -0
  254. package/src/shadcn/sidebar/sidebar-menu-sub.svelte +25 -0
  255. package/src/shadcn/sidebar/sidebar-menu.svelte +21 -0
  256. package/src/shadcn/sidebar/sidebar-provider.svelte +46 -0
  257. package/src/shadcn/sidebar/sidebar-rail.svelte +36 -0
  258. package/src/shadcn/sidebar/sidebar-separator.svelte +15 -0
  259. package/src/shadcn/sidebar/sidebar-trigger.svelte +35 -0
  260. package/src/shadcn/sidebar/sidebar.svelte +94 -0
  261. package/src/shadcn/skeleton/index.ts +7 -0
  262. package/src/shadcn/skeleton/skeleton.svelte +17 -0
  263. package/src/shadcn/slider/index.ts +7 -0
  264. package/src/shadcn/slider/slider.svelte +44 -0
  265. package/src/shadcn/sonner/index.ts +1 -0
  266. package/src/shadcn/sonner/sonner.svelte +13 -0
  267. package/src/shadcn/switch/index.ts +7 -0
  268. package/src/shadcn/switch/switch.svelte +27 -0
  269. package/src/shadcn/table/index.ts +28 -0
  270. package/src/shadcn/table/table-body.svelte +15 -0
  271. package/src/shadcn/table/table-caption.svelte +20 -0
  272. package/src/shadcn/table/table-cell.svelte +20 -0
  273. package/src/shadcn/table/table-footer.svelte +20 -0
  274. package/src/shadcn/table/table-head.svelte +23 -0
  275. package/src/shadcn/table/table-header.svelte +15 -0
  276. package/src/shadcn/table/table-row.svelte +23 -0
  277. package/src/shadcn/table/table.svelte +17 -0
  278. package/src/shadcn/tabs/index.ts +18 -0
  279. package/src/shadcn/tabs/tabs-content.svelte +21 -0
  280. package/src/shadcn/tabs/tabs-list.svelte +19 -0
  281. package/src/shadcn/tabs/tabs-trigger.svelte +21 -0
  282. package/src/shadcn/textarea/index.ts +7 -0
  283. package/src/shadcn/textarea/textarea.svelte +22 -0
  284. package/src/shadcn/toggle/index.ts +13 -0
  285. package/src/shadcn/toggle/toggle.svelte +51 -0
  286. package/src/shadcn/toggle-group/index.ts +10 -0
  287. package/src/shadcn/toggle-group/toggle-group-item.svelte +30 -0
  288. package/src/shadcn/toggle-group/toggle-group.svelte +41 -0
  289. package/src/shadcn/tooltip/index.ts +21 -0
  290. package/src/shadcn/tooltip/tooltip-content.svelte +47 -0
  291. package/src/shadcn/tooltip/tooltip-trigger.svelte +7 -0
  292. package/src/shadcn/utils.ts +14 -0
@@ -0,0 +1,19 @@
1
+ <script lang="ts">
2
+ import { Command as CommandPrimitive } from 'bits-ui';
3
+ import { cn } from '../utils.js';
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ value = $bindable(''),
8
+ class: className,
9
+ ...restProps
10
+ }: CommandPrimitive.RootProps = $props();
11
+ </script>
12
+
13
+ <CommandPrimitive.Root
14
+ bind:value
15
+ bind:ref
16
+ data-slot="command"
17
+ class={cn('bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md', className)}
18
+ {...restProps}
19
+ />
@@ -0,0 +1,40 @@
1
+ import { Command as CommandPrimitive } from "bits-ui";
2
+
3
+ import Root from "./command.svelte";
4
+ import Dialog from "./command-dialog.svelte";
5
+ import Empty from "./command-empty.svelte";
6
+ import Group from "./command-group.svelte";
7
+ import Item from "./command-item.svelte";
8
+ import Input from "./command-input.svelte";
9
+ import List from "./command-list.svelte";
10
+ import Separator from "./command-separator.svelte";
11
+ import Shortcut from "./command-shortcut.svelte";
12
+ import LinkItem from "./command-link-item.svelte";
13
+
14
+ const Loading = CommandPrimitive.Loading;
15
+
16
+ export {
17
+ Root,
18
+ Dialog,
19
+ Empty,
20
+ Group,
21
+ Item,
22
+ LinkItem,
23
+ Input,
24
+ List,
25
+ Separator,
26
+ Shortcut,
27
+ Loading,
28
+ //
29
+ Root as Command,
30
+ Dialog as CommandDialog,
31
+ Empty as CommandEmpty,
32
+ Group as CommandGroup,
33
+ Item as CommandItem,
34
+ LinkItem as CommandLinkItem,
35
+ Input as CommandInput,
36
+ List as CommandList,
37
+ Separator as CommandSeparator,
38
+ Shortcut as CommandShortcut,
39
+ Loading as CommandLoading,
40
+ };
@@ -0,0 +1,141 @@
1
+ import {
2
+ type RowData,
3
+ type TableOptions,
4
+ type TableOptionsResolved,
5
+ type TableState,
6
+ createTable,
7
+ } from "@tanstack/table-core";
8
+
9
+ /**
10
+ * Creates a reactive TanStack table object for Svelte.
11
+ * @param options Table options to create the table with.
12
+ * @returns A reactive table object.
13
+ * @example
14
+ * ```svelte
15
+ * <script>
16
+ * const table = createSvelteTable({ ... })
17
+ * </script>
18
+ *
19
+ * <table>
20
+ * <thead>
21
+ * {#each table.getHeaderGroups() as headerGroup}
22
+ * <tr>
23
+ * {#each headerGroup.headers as header}
24
+ * <th colspan={header.colSpan}>
25
+ * <FlexRender content={header.column.columnDef.header} context={header.getContext()} />
26
+ * </th>
27
+ * {/each}
28
+ * </tr>
29
+ * {/each}
30
+ * </thead>
31
+ * <!-- ... -->
32
+ * </table>
33
+ * ```
34
+ */
35
+ export function createSvelteTable<TData extends RowData>(options: TableOptions<TData>) {
36
+ const resolvedOptions: TableOptionsResolved<TData> = mergeObjects(
37
+ {
38
+ state: {},
39
+ onStateChange() {},
40
+ renderFallbackValue: null,
41
+ mergeOptions: (
42
+ defaultOptions: TableOptions<TData>,
43
+ options: Partial<TableOptions<TData>>
44
+ ) => {
45
+ return mergeObjects(defaultOptions, options);
46
+ },
47
+ },
48
+ options
49
+ );
50
+
51
+ const table = createTable(resolvedOptions);
52
+ let state = $state<Partial<TableState>>(table.initialState);
53
+
54
+ function updateOptions() {
55
+ table.setOptions((prev) => {
56
+ return mergeObjects(prev, options, {
57
+ state: mergeObjects(state, options.state || {}),
58
+
59
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
+ onStateChange: (updater: any) => {
61
+ if (updater instanceof Function) state = updater(state);
62
+ else state = mergeObjects(state, updater);
63
+
64
+ options.onStateChange?.(updater);
65
+ },
66
+ });
67
+ });
68
+ }
69
+
70
+ updateOptions();
71
+
72
+ $effect.pre(() => {
73
+ updateOptions();
74
+ });
75
+
76
+ return table;
77
+ }
78
+
79
+ type MaybeThunk<T extends object> = T | (() => T | null | undefined);
80
+ type Intersection<T extends readonly unknown[]> = (T extends [infer H, ...infer R]
81
+ ? H & Intersection<R>
82
+ : unknown) & {};
83
+
84
+ /**
85
+ * Lazily merges several objects (or thunks) while preserving
86
+ * getter semantics from every source.
87
+ *
88
+ * Proxy-based to avoid known WebKit recursion issue.
89
+ */
90
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
91
+ export function mergeObjects<Sources extends readonly MaybeThunk<any>[]>(
92
+ ...sources: Sources
93
+ ): Intersection<{ [K in keyof Sources]: Sources[K] }> {
94
+ const resolve = <T extends object>(src: MaybeThunk<T>): T | undefined =>
95
+ typeof src === "function" ? (src() ?? undefined) : src;
96
+
97
+ const findSourceWithKey = (key: PropertyKey) => {
98
+ for (let i = sources.length - 1; i >= 0; i--) {
99
+ const obj = resolve(sources[i]);
100
+ if (obj && key in obj) return obj;
101
+ }
102
+ return undefined;
103
+ };
104
+
105
+ return new Proxy(Object.create(null), {
106
+ get(_, key) {
107
+ const src = findSourceWithKey(key);
108
+
109
+ return src?.[key as never];
110
+ },
111
+
112
+ has(_, key) {
113
+ return !!findSourceWithKey(key);
114
+ },
115
+
116
+ ownKeys(): (string | symbol)[] {
117
+ const all = new Set<string | symbol>();
118
+ for (const s of sources) {
119
+ const obj = resolve(s);
120
+ if (obj) {
121
+ for (const k of Reflect.ownKeys(obj) as (string | symbol)[]) {
122
+ all.add(k);
123
+ }
124
+ }
125
+ }
126
+ return [...all];
127
+ },
128
+
129
+ getOwnPropertyDescriptor(_, key) {
130
+ const src = findSourceWithKey(key);
131
+ if (!src) return undefined;
132
+ return {
133
+ configurable: true,
134
+ enumerable: true,
135
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
136
+ value: (src as any)[key],
137
+ writable: true,
138
+ };
139
+ },
140
+ }) as Intersection<{ [K in keyof Sources]: Sources[K] }>;
141
+ }
@@ -0,0 +1,36 @@
1
+ <script
2
+ lang="ts"
3
+ generics="TData, TValue, TContext extends HeaderContext<TData, TValue> | CellContext<TData, TValue>"
4
+ >
5
+ import type { CellContext, ColumnDefTemplate, HeaderContext } from "@tanstack/table-core";
6
+ import { RenderComponentConfig, RenderSnippetConfig } from "./render-helpers.js";
7
+ type Props = {
8
+ /** The cell or header field of the current cell's column definition. */
9
+ content?: TContext extends HeaderContext<TData, TValue>
10
+ ? ColumnDefTemplate<HeaderContext<TData, TValue>>
11
+ : TContext extends CellContext<TData, TValue>
12
+ ? ColumnDefTemplate<CellContext<TData, TValue>>
13
+ : never;
14
+ /** The result of the `getContext()` function of the header or cell */
15
+ context: TContext;
16
+ };
17
+
18
+ let { content, context }: Props = $props();
19
+ </script>
20
+
21
+ {#if typeof content === "string"}
22
+ {content}
23
+ {:else if content instanceof Function}
24
+ <!-- It's unlikely that a CellContext will be passed to a Header -->
25
+ <!-- eslint-disable-next-line @typescript-eslint/no-explicit-any -->
26
+ {@const result = content(context as any)}
27
+ {#if result instanceof RenderComponentConfig}
28
+ {@const { component: Component, props } = result}
29
+ <Component {...props} />
30
+ {:else if result instanceof RenderSnippetConfig}
31
+ {@const { snippet, params } = result}
32
+ {@render snippet(params)}
33
+ {:else}
34
+ {result}
35
+ {/if}
36
+ {/if}
@@ -0,0 +1,3 @@
1
+ export { default as FlexRender } from "./flex-render.svelte";
2
+ export { renderComponent, renderSnippet } from "./render-helpers.js";
3
+ export { createSvelteTable } from "./data-table.svelte.js";
@@ -0,0 +1,111 @@
1
+ import type { Component, ComponentProps, Snippet } from "svelte";
2
+
3
+ /**
4
+ * A helper class to make it easy to identify Svelte components in
5
+ * `columnDef.cell` and `columnDef.header` properties.
6
+ *
7
+ * > NOTE: This class should only be used internally by the adapter. If you're
8
+ * reading this and you don't know what this is for, you probably don't need it.
9
+ *
10
+ * @example
11
+ * ```svelte
12
+ * {@const result = content(context as any)}
13
+ * {#if result instanceof RenderComponentConfig}
14
+ * {@const { component: Component, props } = result}
15
+ * <Component {...props} />
16
+ * {/if}
17
+ * ```
18
+ */
19
+ export class RenderComponentConfig<TComponent extends Component> {
20
+ component: TComponent;
21
+ props: ComponentProps<TComponent> | Record<string, never>;
22
+ constructor(
23
+ component: TComponent,
24
+ props: ComponentProps<TComponent> | Record<string, never> = {}
25
+ ) {
26
+ this.component = component;
27
+ this.props = props;
28
+ }
29
+ }
30
+
31
+ /**
32
+ * A helper class to make it easy to identify Svelte Snippets in `columnDef.cell` and `columnDef.header` properties.
33
+ *
34
+ * > NOTE: This class should only be used internally by the adapter. If you're
35
+ * reading this and you don't know what this is for, you probably don't need it.
36
+ *
37
+ * @example
38
+ * ```svelte
39
+ * {@const result = content(context as any)}
40
+ * {#if result instanceof RenderSnippetConfig}
41
+ * {@const { snippet, params } = result}
42
+ * {@render snippet(params)}
43
+ * {/if}
44
+ * ```
45
+ */
46
+ export class RenderSnippetConfig<TProps> {
47
+ snippet: Snippet<[TProps]>;
48
+ params: TProps;
49
+ constructor(snippet: Snippet<[TProps]>, params: TProps) {
50
+ this.snippet = snippet;
51
+ this.params = params;
52
+ }
53
+ }
54
+
55
+ /**
56
+ * A helper function to help create cells from Svelte components through ColumnDef's `cell` and `header` properties.
57
+ *
58
+ * This is only to be used with Svelte Components - use `renderSnippet` for Svelte Snippets.
59
+ *
60
+ * @param component A Svelte component
61
+ * @param props The props to pass to `component`
62
+ * @returns A `RenderComponentConfig` object that helps svelte-table know how to render the header/cell component.
63
+ * @example
64
+ * ```ts
65
+ * // +page.svelte
66
+ * const defaultColumns = [
67
+ * columnHelper.accessor('name', {
68
+ * header: header => renderComponent(SortHeader, { label: 'Name', header }),
69
+ * }),
70
+ * columnHelper.accessor('state', {
71
+ * header: header => renderComponent(SortHeader, { label: 'State', header }),
72
+ * }),
73
+ * ]
74
+ * ```
75
+ * @see {@link https://tanstack.com/table/latest/docs/guide/column-defs}
76
+ */
77
+ export function renderComponent<
78
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
+ T extends Component<any>,
80
+ Props extends ComponentProps<T>,
81
+ >(component: T, props: Props = {} as Props) {
82
+ return new RenderComponentConfig(component, props);
83
+ }
84
+
85
+ /**
86
+ * A helper function to help create cells from Svelte Snippets through ColumnDef's `cell` and `header` properties.
87
+ *
88
+ * The snippet must only take one parameter.
89
+ *
90
+ * This is only to be used with Snippets - use `renderComponent` for Svelte Components.
91
+ *
92
+ * @param snippet
93
+ * @param params
94
+ * @returns - A `RenderSnippetConfig` object that helps svelte-table know how to render the header/cell snippet.
95
+ * @example
96
+ * ```ts
97
+ * // +page.svelte
98
+ * const defaultColumns = [
99
+ * columnHelper.accessor('name', {
100
+ * cell: cell => renderSnippet(nameSnippet, { name: cell.row.name }),
101
+ * }),
102
+ * columnHelper.accessor('state', {
103
+ * cell: cell => renderSnippet(stateSnippet, { state: cell.row.state }),
104
+ * }),
105
+ * ]
106
+ * ```
107
+ * @see {@link https://tanstack.com/table/latest/docs/guide/column-defs}
108
+ */
109
+ export function renderSnippet<TProps>(snippet: Snippet<[TProps]>, params: TProps = {} as TProps) {
110
+ return new RenderSnippetConfig(snippet, params);
111
+ }
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import { Dialog as DialogPrimitive } from "bits-ui";
3
+
4
+ let { ref = $bindable(null), ...restProps }: DialogPrimitive.CloseProps = $props();
5
+ </script>
6
+
7
+ <DialogPrimitive.Close bind:ref data-slot="dialog-close" {...restProps} />
@@ -0,0 +1,43 @@
1
+ <script lang="ts">
2
+ import { Dialog as DialogPrimitive } from 'bits-ui';
3
+ import XIcon from '$icons/lucide/x';
4
+ import type { Snippet } from 'svelte';
5
+ import * as Dialog from './index.js';
6
+ import { cn, type WithoutChildrenOrChild } from '../utils.js';
7
+
8
+ let {
9
+ ref = $bindable(null),
10
+ class: className,
11
+ portalProps,
12
+ children,
13
+ showCloseButton = true,
14
+ ...restProps
15
+ }: WithoutChildrenOrChild<DialogPrimitive.ContentProps> & {
16
+ portalProps?: DialogPrimitive.PortalProps;
17
+ children: Snippet;
18
+ showCloseButton?: boolean;
19
+ } = $props();
20
+ </script>
21
+
22
+ <Dialog.Portal {...portalProps}>
23
+ <Dialog.Overlay />
24
+ <DialogPrimitive.Content
25
+ bind:ref
26
+ data-slot="dialog-content"
27
+ class={cn(
28
+ 'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed left-[50%] top-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg',
29
+ className
30
+ )}
31
+ {...restProps}
32
+ >
33
+ {@render children?.()}
34
+ {#if showCloseButton}
35
+ <DialogPrimitive.Close
36
+ class="ring-offset-background focus:ring-ring rounded-xs focus:outline-hidden absolute right-4 top-4 opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 disabled:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0"
37
+ >
38
+ <XIcon />
39
+ <span class="sr-only">Close</span>
40
+ </DialogPrimitive.Close>
41
+ {/if}
42
+ </DialogPrimitive.Content>
43
+ </Dialog.Portal>
@@ -0,0 +1,13 @@
1
+ <script lang="ts">
2
+ import { Dialog as DialogPrimitive } from 'bits-ui';
3
+ import { cn } from '../utils.js';
4
+
5
+ let { ref = $bindable(null), class: className, ...restProps }: DialogPrimitive.DescriptionProps = $props();
6
+ </script>
7
+
8
+ <DialogPrimitive.Description
9
+ bind:ref
10
+ data-slot="dialog-description"
11
+ class={cn('text-muted-foreground text-sm', className)}
12
+ {...restProps}
13
+ />
@@ -0,0 +1,20 @@
1
+ <script lang="ts">
2
+ import { cn, type WithElementRef } from '../utils.js';
3
+ import type { HTMLAttributes } from 'svelte/elements';
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ children,
9
+ ...restProps
10
+ }: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
11
+ </script>
12
+
13
+ <div
14
+ bind:this={ref}
15
+ data-slot="dialog-footer"
16
+ class={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}
17
+ {...restProps}
18
+ >
19
+ {@render children?.()}
20
+ </div>
@@ -0,0 +1,20 @@
1
+ <script lang="ts">
2
+ import type { HTMLAttributes } from 'svelte/elements';
3
+ import { cn, type WithElementRef } from '../utils.js';
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ children,
9
+ ...restProps
10
+ }: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
11
+ </script>
12
+
13
+ <div
14
+ bind:this={ref}
15
+ data-slot="dialog-header"
16
+ class={cn('flex flex-col gap-2 text-center sm:text-left', className)}
17
+ {...restProps}
18
+ >
19
+ {@render children?.()}
20
+ </div>
@@ -0,0 +1,16 @@
1
+ <script lang="ts">
2
+ import { Dialog as DialogPrimitive } from 'bits-ui';
3
+ import { cn } from '../utils.js';
4
+
5
+ let { ref = $bindable(null), class: className, ...restProps }: DialogPrimitive.OverlayProps = $props();
6
+ </script>
7
+
8
+ <DialogPrimitive.Overlay
9
+ bind:ref
10
+ data-slot="dialog-overlay"
11
+ class={cn(
12
+ 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50',
13
+ className
14
+ )}
15
+ {...restProps}
16
+ />
@@ -0,0 +1,13 @@
1
+ <script lang="ts">
2
+ import { Dialog as DialogPrimitive } from 'bits-ui';
3
+ import { cn } from '../utils.js';
4
+
5
+ let { ref = $bindable(null), class: className, ...restProps }: DialogPrimitive.TitleProps = $props();
6
+ </script>
7
+
8
+ <DialogPrimitive.Title
9
+ bind:ref
10
+ data-slot="dialog-title"
11
+ class={cn('text-lg font-semibold leading-none', className)}
12
+ {...restProps}
13
+ />
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import { Dialog as DialogPrimitive } from "bits-ui";
3
+
4
+ let { ref = $bindable(null), ...restProps }: DialogPrimitive.TriggerProps = $props();
5
+ </script>
6
+
7
+ <DialogPrimitive.Trigger bind:ref data-slot="dialog-trigger" {...restProps} />
@@ -0,0 +1,37 @@
1
+ import { Dialog as DialogPrimitive } from "bits-ui";
2
+
3
+ import Title from "./dialog-title.svelte";
4
+ import Footer from "./dialog-footer.svelte";
5
+ import Header from "./dialog-header.svelte";
6
+ import Overlay from "./dialog-overlay.svelte";
7
+ import Content from "./dialog-content.svelte";
8
+ import Description from "./dialog-description.svelte";
9
+ import Trigger from "./dialog-trigger.svelte";
10
+ import Close from "./dialog-close.svelte";
11
+
12
+ const Root = DialogPrimitive.Root;
13
+ const Portal = DialogPrimitive.Portal;
14
+
15
+ export {
16
+ Root,
17
+ Title,
18
+ Portal,
19
+ Footer,
20
+ Header,
21
+ Trigger,
22
+ Overlay,
23
+ Content,
24
+ Description,
25
+ Close,
26
+ //
27
+ Root as Dialog,
28
+ Title as DialogTitle,
29
+ Portal as DialogPortal,
30
+ Footer as DialogFooter,
31
+ Header as DialogHeader,
32
+ Trigger as DialogTrigger,
33
+ Overlay as DialogOverlay,
34
+ Content as DialogContent,
35
+ Description as DialogDescription,
36
+ Close as DialogClose,
37
+ };
@@ -0,0 +1,41 @@
1
+ <script lang="ts">
2
+ import { DropdownMenu as DropdownMenuPrimitive } from 'bits-ui';
3
+ import CheckIcon from '$icons/lucide/check';
4
+ import MinusIcon from '$icons/lucide/minus';
5
+ import { cn, type WithoutChildrenOrChild } from '../utils.js';
6
+ import type { Snippet } from 'svelte';
7
+
8
+ let {
9
+ ref = $bindable(null),
10
+ checked = $bindable(false),
11
+ indeterminate = $bindable(false),
12
+ class: className,
13
+ children: childrenProp,
14
+ ...restProps
15
+ }: WithoutChildrenOrChild<DropdownMenuPrimitive.CheckboxItemProps> & {
16
+ children?: Snippet;
17
+ } = $props();
18
+ </script>
19
+
20
+ <DropdownMenuPrimitive.CheckboxItem
21
+ bind:ref
22
+ bind:checked
23
+ bind:indeterminate
24
+ data-slot="dropdown-menu-checkbox-item"
25
+ class={cn(
26
+ "focus:bg-accent focus:text-accent-foreground outline-hidden relative flex cursor-default select-none items-center gap-2 rounded-sm py-1.5 pl-8 pr-2 text-sm data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0",
27
+ className
28
+ )}
29
+ {...restProps}
30
+ >
31
+ {#snippet children({ checked, indeterminate })}
32
+ <span class="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
33
+ {#if indeterminate}
34
+ <MinusIcon class="size-4" />
35
+ {:else}
36
+ <CheckIcon class={cn('size-4', !checked && 'text-transparent')} />
37
+ {/if}
38
+ </span>
39
+ {@render childrenProp?.()}
40
+ {/snippet}
41
+ </DropdownMenuPrimitive.CheckboxItem>
@@ -0,0 +1,27 @@
1
+ <script lang="ts">
2
+ import { cn } from '../utils.js';
3
+ import { DropdownMenu as DropdownMenuPrimitive } from 'bits-ui';
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ sideOffset = 4,
8
+ portalProps,
9
+ class: className,
10
+ ...restProps
11
+ }: DropdownMenuPrimitive.ContentProps & {
12
+ portalProps?: DropdownMenuPrimitive.PortalProps;
13
+ } = $props();
14
+ </script>
15
+
16
+ <DropdownMenuPrimitive.Portal {...portalProps}>
17
+ <DropdownMenuPrimitive.Content
18
+ bind:ref
19
+ data-slot="dropdown-menu-content"
20
+ {sideOffset}
21
+ class={cn(
22
+ 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 max-h-(--bits-dropdown-menu-content-available-height) origin-(--bits-dropdown-menu-content-transform-origin) z-50 min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border p-1 shadow-md outline-none',
23
+ className
24
+ )}
25
+ {...restProps}
26
+ />
27
+ </DropdownMenuPrimitive.Portal>
@@ -0,0 +1,22 @@
1
+ <script lang="ts">
2
+ import { DropdownMenu as DropdownMenuPrimitive } from 'bits-ui';
3
+ import { cn } from '../utils.js';
4
+ import type { ComponentProps } from 'svelte';
5
+
6
+ let {
7
+ ref = $bindable(null),
8
+ class: className,
9
+ inset,
10
+ ...restProps
11
+ }: ComponentProps<typeof DropdownMenuPrimitive.GroupHeading> & {
12
+ inset?: boolean;
13
+ } = $props();
14
+ </script>
15
+
16
+ <DropdownMenuPrimitive.GroupHeading
17
+ bind:ref
18
+ data-slot="dropdown-menu-group-heading"
19
+ data-inset={inset}
20
+ class={cn('px-2 py-1.5 text-sm font-semibold data-[inset]:pl-8', className)}
21
+ {...restProps}
22
+ />
@@ -0,0 +1,7 @@
1
+ <script lang="ts">
2
+ import { DropdownMenu as DropdownMenuPrimitive } from "bits-ui";
3
+
4
+ let { ref = $bindable(null), ...restProps }: DropdownMenuPrimitive.GroupProps = $props();
5
+ </script>
6
+
7
+ <DropdownMenuPrimitive.Group bind:ref data-slot="dropdown-menu-group" {...restProps} />
@@ -0,0 +1,27 @@
1
+ <script lang="ts">
2
+ import { cn } from '../utils.js';
3
+ import { DropdownMenu as DropdownMenuPrimitive } from 'bits-ui';
4
+
5
+ let {
6
+ ref = $bindable(null),
7
+ class: className,
8
+ inset,
9
+ variant = 'default',
10
+ ...restProps
11
+ }: DropdownMenuPrimitive.ItemProps & {
12
+ inset?: boolean;
13
+ variant?: 'default' | 'destructive';
14
+ } = $props();
15
+ </script>
16
+
17
+ <DropdownMenuPrimitive.Item
18
+ bind:ref
19
+ data-slot="dropdown-menu-item"
20
+ data-inset={inset}
21
+ data-variant={variant}
22
+ class={cn(
23
+ "data-highlighted:bg-accent data-highlighted:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:data-highlighted:bg-destructive/10 dark:data-[variant=destructive]:data-highlighted:bg-destructive/20 data-[variant=destructive]:data-highlighted:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground outline-hidden relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm data-[disabled]:pointer-events-none data-[inset]:pl-8 data-[disabled]:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0",
24
+ className
25
+ )}
26
+ {...restProps}
27
+ />