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 @@
1
+ export { default as ConfirmDialog } from './confirm-dialog.svelte';
@@ -0,0 +1,134 @@
1
+ <script lang="ts">
2
+ import Check from '$icons/lucide/check';
3
+ import Copy from '$icons/lucide/copy';
4
+ import { Button } from '../../shadcn/button';
5
+ import { tick, type Snippet } from 'svelte';
6
+
7
+ interface Props {
8
+ children?: Snippet<[]>;
9
+ value?: string;
10
+ /** When embedded in other elements, like a table, we don't want borders */
11
+ embedded?: boolean;
12
+
13
+ /** Truncate the value after this many characters showing a ...*/
14
+ truncateAfter?: number;
15
+
16
+ /** If true, the text will be shown as a link */
17
+ showTextAsLink?: boolean;
18
+
19
+ /** If showTextAsLink is true, this function will be called when the link is clicked */
20
+ linkCallbackFn?: () => void;
21
+
22
+ /** When provided, this is the title of the button */
23
+ title?: string;
24
+ }
25
+
26
+ const { children, value: propValue, embedded = false, truncateAfter = 0, showTextAsLink = false, linkCallbackFn, title }: Props = $props();
27
+
28
+ let hiddenRef = $state<HTMLElement>() as HTMLElement;
29
+ let value: string | undefined = $state(undefined);
30
+ let truncatedValue: string | undefined = $state(undefined);
31
+ let showCheckmark = $state(false);
32
+
33
+ let buttonTitle = $derived.by(() => {
34
+ const t = title;
35
+ const tv = truncatedValue;
36
+ const v = value;
37
+ if (t) {
38
+ return t;
39
+ } else if (tv) {
40
+ return tv;
41
+ } else if (v) {
42
+ return v;
43
+ } else {
44
+ return 'Copy';
45
+ }
46
+ });
47
+
48
+ $effect(() => {
49
+ if (propValue !== undefined) {
50
+ value = propValue;
51
+ updateTruncatedValue();
52
+ } else if (children) {
53
+ // Fall back to extracting from children
54
+ extractValue().catch((e) => {
55
+ throw new Error(`Failed to extract value: ${e instanceof Error ? e.message + ' ' + e.stack : String(e)}`);
56
+ });
57
+ }
58
+ });
59
+
60
+ async function extractValue() {
61
+ // We need to wait for the DOM to update
62
+ await tick();
63
+
64
+ if (!hiddenRef) return;
65
+
66
+ // Extract text content
67
+ value = (hiddenRef.textContent || '').trim();
68
+ updateTruncatedValue();
69
+ }
70
+
71
+ function updateTruncatedValue() {
72
+ if (!value) {
73
+ throw new Error('Did not find any text in the hidden container of ValueToCopy');
74
+ }
75
+ if (truncateAfter && truncateAfter > 0 && value.length > truncateAfter) {
76
+ // Check if there are enough characters to make the "start...end" format worthwhile
77
+ // We need at least truncateAfter + 7 characters (3 for "..." + 4 for end)
78
+ // to make the start...end format meaningful
79
+ const minLengthForStartEnd = truncateAfter + 7;
80
+
81
+ if (value.length >= minLengthForStartEnd) {
82
+ // Use "start...end" format
83
+ truncatedValue = `${value.slice(0, truncateAfter)}...${value.slice(-4)}`;
84
+ } else {
85
+ // Just truncate with "..." at the end
86
+ truncatedValue = `${value.slice(0, truncateAfter)}...`;
87
+ }
88
+ }
89
+ }
90
+
91
+ function copy() {
92
+ if (!value) {
93
+ console.error('No value to copy');
94
+ return;
95
+ }
96
+
97
+ if (!navigator || !navigator.clipboard) {
98
+ console.error('Clipboard API not supported');
99
+ return;
100
+ }
101
+
102
+ try {
103
+ navigator.clipboard.writeText(value);
104
+ showCheckmark = true;
105
+ setTimeout(() => {
106
+ showCheckmark = false;
107
+ }, 2000);
108
+ } catch (err) {
109
+ console.error('Failed to copy value:', err);
110
+ showCheckmark = false;
111
+ }
112
+ }
113
+ </script>
114
+
115
+ {#if !propValue}
116
+ <pre class="hidden-container" bind:this={hiddenRef} style="display: none; position: absolute; left: -9999px;">{#if children}{@render children()}{/if}</pre>
117
+ {/if}
118
+
119
+ <span class="inline-flex w-fit items-center {embedded ? '' : 'border border-gray-200 rounded-sm'}">
120
+ {#if showTextAsLink}
121
+ <Button class="p-0" variant="link" onclick={() => linkCallbackFn?.()}>{buttonTitle}</Button>
122
+ {:else}
123
+ <span class={embedded ? '' : 'border-r border-gray-200 px-2'}>{buttonTitle}</span>
124
+ {/if}
125
+ <span class="w-6 h-6 flex items-center justify-center">
126
+ {#if showCheckmark}
127
+ <Check class="w-3.5 h-3.5 text-green-500" />
128
+ {:else}
129
+ <Button variant="ghost" class="h-full w-full min-h-0 p-0 ml-1 rounded-none hover:border-blue-100 hover:border hover:rounded-sm" onclick={copy} disabled={!value}>
130
+ <Copy class="w-3.5 h-3.5 text-gray-400" />
131
+ </Button>
132
+ {/if}
133
+ </span>
134
+ </span>
@@ -0,0 +1 @@
1
+ export { default as CopyButton } from './copy-button.svelte';
@@ -0,0 +1,133 @@
1
+ <script lang="ts">
2
+ import Check from '$icons/lucide/check';
3
+ import Copy from '$icons/lucide/copy';
4
+ import Link from '$icons/lucide/link';
5
+ import Loader from '$icons/lucide/loader';
6
+ import { Button } from '../../shadcn/button';
7
+
8
+ interface Props {
9
+ /** If this doesn't exist, we assume that we need to create the link */
10
+ linkUrl?: string;
11
+
12
+ /** If not provided, will show Click button to create link */
13
+ valueToShowBeforeLinkIsCreated?: string;
14
+
15
+ /** When the user clicks the create link button, this function will be called */
16
+ createLinkFn: () => void;
17
+
18
+ /** If true, will show a loader and the button will be disabled */
19
+ creatingLink: boolean;
20
+
21
+ /** When set, will disable the create link button */
22
+ disableCreateLinkButton?: boolean;
23
+
24
+ /** Truncate the linkUrl or valueToShowBeforeLinkIsCreated after this many characters showing a ...*/
25
+ truncateAfter?: number;
26
+
27
+ /** Defaults to 100px */
28
+ width?: number;
29
+ }
30
+
31
+ const { linkUrl, valueToShowBeforeLinkIsCreated, createLinkFn, creatingLink, disableCreateLinkButton, truncateAfter = 0, width = 100 }: Props = $props();
32
+
33
+ const height = 50;
34
+
35
+ let showCheckmark = $state(false);
36
+ let value = $derived.by(() => {
37
+ if (linkUrl) {
38
+ return linkUrl;
39
+ } else {
40
+ return valueToShowBeforeLinkIsCreated ?? 'Click button to create link';
41
+ }
42
+ });
43
+ let truncatedValue = $derived.by(() => {
44
+ let result = value;
45
+ if (truncateAfter && truncateAfter > 0 && result.length > truncateAfter) {
46
+ result = `${result.slice(0, truncateAfter)}...`;
47
+ }
48
+ return result;
49
+ });
50
+
51
+ function copy() {
52
+ if (!linkUrl) {
53
+ console.error('No linkUrl to copy');
54
+ return;
55
+ }
56
+
57
+ if (!navigator || !navigator.clipboard) {
58
+ console.error('Clipboard API not supported');
59
+ return;
60
+ }
61
+
62
+ try {
63
+ navigator.clipboard.writeText(linkUrl);
64
+ showCheckmark = true;
65
+ setTimeout(() => {
66
+ showCheckmark = false;
67
+ }, 2000);
68
+ } catch (err) {
69
+ console.error('Failed to copy value:', err);
70
+ showCheckmark = false;
71
+ }
72
+ }
73
+ </script>
74
+
75
+ <div class="flex items-center w-[{width}px] h-[{height}px] border border-gray-200 rounded-xl">
76
+ <div class="flex-1 p-4 {!linkUrl ? 'text-gray-400' : ''}">{truncatedValue}</div>
77
+ <div class="w-[150px] h-[{height}px] flex items-center justify-center mr-4">
78
+ {#if showCheckmark}
79
+ <Check class="w-3.5 h-3.5 text-green-600 mr-2" /> <span class="text-green-600">Copied!</span>
80
+ {:else}
81
+ <Button
82
+ class="h-[{height}px] w-[150px] ml-1"
83
+ onclick={() => {
84
+ if (linkUrl) {
85
+ copy();
86
+ } else {
87
+ createLinkFn();
88
+ }
89
+ }}
90
+ disabled={creatingLink || (disableCreateLinkButton && !linkUrl)}
91
+ >
92
+ {#if creatingLink}
93
+ <Loader class="w-3.5 h-3.5 animate-spin white" /> Creating...
94
+ {:else if linkUrl}
95
+ <Copy class="w-3.5 h-3.5 white" /> Copy link
96
+ {:else}
97
+ <Link class="w-3.5 h-3.5 white" /> Create link
98
+ {/if}
99
+ </Button>
100
+ {/if}
101
+ </div>
102
+ </div>
103
+
104
+ <!-- <div class="flex h-[{height}px] w-[{width}px] items-center {'border border-gray-200 rounded-sm'}">
105
+
106
+ <div class={'border-r border-gray-200 px-2 h-[100px] flex items-center flex-1'}>{truncatedValue}</div>
107
+ <div class="w-[100px] h-[36px] flex items-center justify-center">
108
+ {#if showCheckmark}
109
+ <Check class="w-3.5 h-3.5 text-green-500" /> Copied!
110
+ {:else}
111
+ <Button
112
+ variant="ghost"
113
+ class="h-[36px] w-[100px] ml-1 rounded-none hover:border-blue-100 hover:border hover:rounded-sm"
114
+ onclick={() => {
115
+ if (linkUrl) {
116
+ copy();
117
+ } else {
118
+ createLinkFn();
119
+ }
120
+ }}
121
+ disabled={creatingLink || (disableCreateLinkButton && !linkUrl)}
122
+ >
123
+ {#if creatingLink}
124
+ <Loader class="w-3.5 h-3.5 animate-spin" /> Copying...
125
+ {:else if linkUrl}
126
+ <Copy class="w-3.5 h-3.5 text-gray-400" /> Copy link
127
+ {:else}
128
+ <Link class="w-3.5 h-3.5 text-gray-400" /> Create link
129
+ {/if}
130
+ </Button>
131
+ {/if}
132
+ </div>
133
+ </div> -->
@@ -0,0 +1 @@
1
+ export { default as CreateCopyLinkButton } from './create-copy-link-button.svelte';
@@ -0,0 +1,33 @@
1
+ <script lang="ts">
2
+ import { buttonVariants } from '../../shadcn/button/index.js';
3
+ import { Calendar } from '../../shadcn/calendar/index.js';
4
+ import * as Popover from '../../shadcn/popover/index.js';
5
+ import { cn } from '../../shadcn/utils.js';
6
+ import { DateFormatter, type DateValue, getLocalTimeZone } from '@internationalized/date';
7
+ import CalendarIcon from '$icons/lucide/calendar';
8
+
9
+ const df = new DateFormatter('en-US', {
10
+ dateStyle: 'long'
11
+ });
12
+
13
+ let value = $state<DateValue | undefined>();
14
+ let contentRef = $state<HTMLElement | null>(null);
15
+ </script>
16
+
17
+ <Popover.Root>
18
+ <Popover.Trigger
19
+ class={cn(
20
+ buttonVariants({
21
+ variant: 'outline',
22
+ class: 'w-[280px] justify-start text-left font-normal'
23
+ }),
24
+ !value && 'text-muted-foreground'
25
+ )}
26
+ >
27
+ <CalendarIcon />
28
+ {value ? df.format(value.toDate(getLocalTimeZone())) : 'Pick a date'}
29
+ </Popover.Trigger>
30
+ <Popover.Content bind:ref={contentRef} class="w-auto p-0">
31
+ <Calendar type="single" bind:value />
32
+ </Popover.Content>
33
+ </Popover.Root>
@@ -0,0 +1 @@
1
+ export { default as DatePicker } from './date-picker.svelte';
@@ -0,0 +1,48 @@
1
+ <script lang="ts">
2
+ import { buttonVariants } from '../../shadcn/button/index.js';
3
+ import * as Popover from '../../shadcn/popover/index.js';
4
+ import { RangeCalendar } from '../../shadcn/range-calendar/index.js';
5
+ import { cn } from '../../shadcn/utils.js';
6
+ import { CalendarDate, DateFormatter, type DateValue, getLocalTimeZone } from '@internationalized/date';
7
+ import CalendarIcon from '$icons/lucide/calendar';
8
+ import type { DateRange } from 'bits-ui';
9
+
10
+ const df = new DateFormatter('en-US', {
11
+ dateStyle: 'medium'
12
+ });
13
+
14
+ let value: DateRange = $state({
15
+ start: new CalendarDate(2022, 1, 20),
16
+ end: new CalendarDate(2022, 1, 20).add({ days: 20 })
17
+ });
18
+
19
+ let startValue: DateValue | undefined = $state(undefined);
20
+ </script>
21
+
22
+ <div class="grid gap-2">
23
+ <Popover.Root>
24
+ <Popover.Trigger class={cn(buttonVariants({ variant: 'outline' }), !value && 'text-muted-foreground')}>
25
+ <CalendarIcon class="mr-2 size-4" />
26
+ {#if value && value.start}
27
+ {#if value.end}
28
+ {df.format(value.start.toDate(getLocalTimeZone()))} - {df.format(value.end.toDate(getLocalTimeZone()))}
29
+ {:else}
30
+ {df.format(value.start.toDate(getLocalTimeZone()))}
31
+ {/if}
32
+ {:else if startValue}
33
+ {df.format(startValue.toDate(getLocalTimeZone()))}
34
+ {:else}
35
+ Pick a date
36
+ {/if}
37
+ </Popover.Trigger>
38
+ <Popover.Content class="w-auto p-0" align="start">
39
+ <RangeCalendar
40
+ bind:value
41
+ onStartValueChange={(v) => {
42
+ startValue = v;
43
+ }}
44
+ numberOfMonths={2}
45
+ />
46
+ </Popover.Content>
47
+ </Popover.Root>
48
+ </div>
@@ -0,0 +1 @@
1
+ export { default as DateRangePicker } from './date-range-picker.svelte';