@joewinke/jatui 0.1.31 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/CLAUDE.md +22 -0
  2. package/dist/actions/attention.d.ts +24 -0
  3. package/dist/actions/attention.js +94 -0
  4. package/dist/actions/collapse.js +29 -15
  5. package/dist/actions/floating.d.ts +53 -0
  6. package/dist/actions/floating.js +158 -0
  7. package/dist/actions/listNav.js +137 -108
  8. package/dist/actions/railNav.js +89 -72
  9. package/dist/actions/staggerEntrance.d.ts +28 -0
  10. package/dist/actions/staggerEntrance.js +71 -0
  11. package/dist/actions/tooltip.d.ts +28 -0
  12. package/dist/actions/tooltip.js +186 -0
  13. package/dist/assets/sounds/README.md +47 -0
  14. package/dist/assets/sounds/error.d.ts +1 -0
  15. package/dist/assets/sounds/error.js +4 -0
  16. package/dist/assets/sounds/notify.d.ts +1 -0
  17. package/dist/assets/sounds/notify.js +4 -0
  18. package/dist/assets/sounds/pop.d.ts +1 -0
  19. package/dist/assets/sounds/pop.js +4 -0
  20. package/dist/assets/sounds/send.d.ts +1 -0
  21. package/dist/assets/sounds/send.js +4 -0
  22. package/dist/assets/sounds/success.d.ts +1 -0
  23. package/dist/assets/sounds/success.js +4 -0
  24. package/dist/assets/sounds/toggle.d.ts +1 -0
  25. package/dist/assets/sounds/toggle.js +4 -0
  26. package/dist/components/AnimatedNumber.svelte +112 -0
  27. package/dist/components/AnimatedNumber.svelte.d.ts +8 -0
  28. package/dist/components/Badge.svelte +75 -4
  29. package/dist/components/Badge.svelte.d.ts +6 -1
  30. package/dist/components/Button.svelte +196 -21
  31. package/dist/components/Button.svelte.d.ts +10 -1
  32. package/dist/components/Carousel.svelte +265 -0
  33. package/dist/components/Carousel.svelte.d.ts +21 -0
  34. package/dist/components/ChipInput.svelte +63 -3
  35. package/dist/components/Collapse.svelte +70 -14
  36. package/dist/components/Collapse.svelte.d.ts +11 -0
  37. package/dist/components/ColorSelector.svelte +21 -24
  38. package/dist/components/CommandPalette.svelte +475 -0
  39. package/dist/components/CommandPalette.svelte.d.ts +3 -0
  40. package/dist/components/ContextMenu.svelte +9 -73
  41. package/dist/components/CopyButton.svelte +156 -0
  42. package/dist/components/CopyButton.svelte.d.ts +12 -0
  43. package/dist/components/HoldToConfirm.svelte +183 -0
  44. package/dist/components/HoldToConfirm.svelte.d.ts +11 -0
  45. package/dist/components/KeyboardShortcutsOverlay.svelte +54 -8
  46. package/dist/components/KeyboardShortcutsOverlay.svelte.d.ts +3 -0
  47. package/dist/components/PasswordMeter.svelte +87 -0
  48. package/dist/components/PasswordMeter.svelte.d.ts +8 -0
  49. package/dist/components/PinInput.svelte +186 -0
  50. package/dist/components/PinInput.svelte.d.ts +13 -0
  51. package/dist/components/QuantityStepper.svelte +185 -0
  52. package/dist/components/QuantityStepper.svelte.d.ts +12 -0
  53. package/dist/components/Skeleton.svelte +123 -0
  54. package/dist/components/Skeleton.svelte.d.ts +12 -0
  55. package/dist/components/SpeechForm.svelte +37 -0
  56. package/dist/components/StatusBadge.svelte +31 -3
  57. package/dist/components/StatusBadge.svelte.d.ts +0 -5
  58. package/dist/components/Tabs.svelte +270 -0
  59. package/dist/components/Tabs.svelte.d.ts +15 -0
  60. package/dist/components/TextInput.svelte +138 -38
  61. package/dist/components/TextInput.svelte.d.ts +9 -1
  62. package/dist/components/VoicePlayer.svelte +51 -0
  63. package/dist/components/basic/Alert.svelte +36 -0
  64. package/dist/components/basic/Alert.svelte.d.ts +9 -0
  65. package/dist/components/basic/Breadcrumb.svelte +27 -0
  66. package/dist/components/basic/Breadcrumb.svelte.d.ts +11 -0
  67. package/dist/components/basic/ButtonGroup.svelte +15 -0
  68. package/dist/components/basic/ButtonGroup.svelte.d.ts +8 -0
  69. package/dist/components/basic/Checkbox.svelte +85 -0
  70. package/dist/components/basic/Checkbox.svelte.d.ts +15 -0
  71. package/dist/components/basic/Empty.svelte +17 -0
  72. package/dist/components/basic/Empty.svelte.d.ts +8 -0
  73. package/dist/components/basic/Kbd.svelte +16 -0
  74. package/dist/components/basic/Kbd.svelte.d.ts +8 -0
  75. package/dist/components/basic/Pagination.svelte +104 -0
  76. package/dist/components/basic/Pagination.svelte.d.ts +12 -0
  77. package/dist/components/basic/RadioGroup.svelte +71 -0
  78. package/dist/components/basic/RadioGroup.svelte.d.ts +18 -0
  79. package/dist/components/basic/Separator.svelte +19 -0
  80. package/dist/components/basic/Separator.svelte.d.ts +8 -0
  81. package/dist/components/basic/Slider.svelte +72 -0
  82. package/dist/components/basic/Slider.svelte.d.ts +17 -0
  83. package/dist/components/basic/Switch.svelte +88 -0
  84. package/dist/components/basic/Switch.svelte.d.ts +14 -0
  85. package/dist/components/basic/Toggle.svelte +43 -0
  86. package/dist/components/basic/Toggle.svelte.d.ts +14 -0
  87. package/dist/components/graph/GraphCanvas.svelte +103 -0
  88. package/dist/components/graph/GraphCanvas.svelte.d.ts +22 -0
  89. package/dist/components/graph/JatuiNode.svelte +128 -0
  90. package/dist/components/graph/JatuiNode.svelte.d.ts +14 -0
  91. package/dist/components/graph/theme.d.ts +27 -0
  92. package/dist/components/graph/theme.js +136 -0
  93. package/dist/components/markup.js +62 -59
  94. package/dist/components/messaging/MessageItem.svelte +92 -0
  95. package/dist/components/messaging/MessageItem.svelte.d.ts +5 -0
  96. package/dist/components/messaging/TypingIndicator.svelte +63 -0
  97. package/dist/components/messaging/TypingIndicator.svelte.d.ts +7 -0
  98. package/dist/components/pipeline/PipelineColumn.svelte +44 -3
  99. package/dist/components/progress/ProgressBar.svelte +189 -0
  100. package/dist/components/progress/ProgressBar.svelte.d.ts +17 -0
  101. package/dist/components/progress/ProgressRing.svelte +138 -0
  102. package/dist/components/progress/ProgressRing.svelte.d.ts +12 -0
  103. package/dist/components/progress/Steps.svelte +195 -0
  104. package/dist/components/progress/Steps.svelte.d.ts +14 -0
  105. package/dist/components/session-nav/transcriptModel.js +66 -49
  106. package/dist/components/shell/NavigationMenu.svelte +422 -0
  107. package/dist/components/shell/NavigationMenu.svelte.d.ts +43 -0
  108. package/dist/components/shell/Sidebar.svelte +276 -0
  109. package/dist/components/shell/Sidebar.svelte.d.ts +32 -0
  110. package/dist/components/shell/SidebarGroup.svelte +180 -0
  111. package/dist/components/shell/SidebarGroup.svelte.d.ts +19 -0
  112. package/dist/components/shell/SidebarItem.svelte +170 -0
  113. package/dist/components/shell/SidebarItem.svelte.d.ts +24 -0
  114. package/dist/components/shell/shell.d.ts +30 -0
  115. package/dist/components/shell/shell.js +65 -0
  116. package/dist/components/table/DataTable.svelte +364 -0
  117. package/dist/components/table/DataTable.svelte.d.ts +4 -0
  118. package/dist/components/table/flexRender.d.ts +31 -0
  119. package/dist/components/table/flexRender.js +32 -0
  120. package/dist/components/table/types.d.ts +28 -0
  121. package/dist/components/table/types.js +1 -0
  122. package/dist/components/toast/ToastHost.svelte +21 -0
  123. package/dist/components/toast/ToastHost.svelte.d.ts +3 -0
  124. package/dist/components/toast/ToastItem.svelte +287 -0
  125. package/dist/components/toast/ToastItem.svelte.d.ts +9 -0
  126. package/dist/data/emojis.js +4 -4
  127. package/dist/dnd/autoScroll.js +12 -10
  128. package/dist/dnd/createDndBoard.svelte.js +110 -76
  129. package/dist/dnd/createDndBoard.test.js +161 -85
  130. package/dist/dnd/draggable.js +23 -15
  131. package/dist/dnd/dropTarget.js +29 -15
  132. package/dist/dnd/index.d.ts +0 -1
  133. package/dist/dnd/index.js +0 -1
  134. package/dist/dnd/types.d.ts +0 -9
  135. package/dist/dnd/types.js +14 -2
  136. package/dist/index.d.ts +60 -6
  137. package/dist/index.js +73 -6
  138. package/dist/showcase/AnimatedBeam.svelte +183 -0
  139. package/dist/showcase/AnimatedBeam.svelte.d.ts +26 -0
  140. package/dist/showcase/AuroraDrift.svelte +74 -0
  141. package/dist/showcase/AuroraDrift.svelte.d.ts +9 -0
  142. package/dist/showcase/BentoCard.svelte +50 -0
  143. package/dist/showcase/BentoCard.svelte.d.ts +14 -0
  144. package/dist/showcase/BentoGrid.svelte +43 -0
  145. package/dist/showcase/BentoGrid.svelte.d.ts +12 -0
  146. package/dist/showcase/BorderBeam.svelte +79 -0
  147. package/dist/showcase/BorderBeam.svelte.d.ts +12 -0
  148. package/dist/showcase/ClipWipe.svelte +82 -0
  149. package/dist/showcase/ClipWipe.svelte.d.ts +12 -0
  150. package/dist/showcase/Confetti.svelte +71 -0
  151. package/dist/showcase/Confetti.svelte.d.ts +10 -0
  152. package/dist/showcase/CursorSpotlight.svelte +85 -0
  153. package/dist/showcase/CursorSpotlight.svelte.d.ts +9 -0
  154. package/dist/showcase/DeviceMock.svelte +186 -0
  155. package/dist/showcase/DeviceMock.svelte.d.ts +11 -0
  156. package/dist/showcase/Dock.svelte +123 -0
  157. package/dist/showcase/Dock.svelte.d.ts +17 -0
  158. package/dist/showcase/FlipCard.svelte +103 -0
  159. package/dist/showcase/FlipCard.svelte.d.ts +10 -0
  160. package/dist/showcase/FocusReveal.svelte +83 -0
  161. package/dist/showcase/FocusReveal.svelte.d.ts +11 -0
  162. package/dist/showcase/Globe.svelte +202 -0
  163. package/dist/showcase/Globe.svelte.d.ts +16 -0
  164. package/dist/showcase/KenBurns.svelte +105 -0
  165. package/dist/showcase/KenBurns.svelte.d.ts +13 -0
  166. package/dist/showcase/Marquee.svelte +89 -0
  167. package/dist/showcase/Marquee.svelte.d.ts +9 -0
  168. package/dist/showcase/ParallaxTilt.svelte +98 -0
  169. package/dist/showcase/ParallaxTilt.svelte.d.ts +10 -0
  170. package/dist/showcase/ScrambleText.svelte +98 -0
  171. package/dist/showcase/ScrambleText.svelte.d.ts +11 -0
  172. package/dist/showcase/ShineSweep.svelte +81 -0
  173. package/dist/showcase/ShineSweep.svelte.d.ts +9 -0
  174. package/dist/showcase/Terminal.svelte +230 -0
  175. package/dist/showcase/Terminal.svelte.d.ts +18 -0
  176. package/dist/showcase/TextSplitReveal.svelte +146 -0
  177. package/dist/showcase/TextSplitReveal.svelte.d.ts +13 -0
  178. package/dist/showcase/TextWave.svelte +55 -0
  179. package/dist/showcase/TextWave.svelte.d.ts +8 -0
  180. package/dist/showcase/TypewriterText.svelte +130 -0
  181. package/dist/showcase/TypewriterText.svelte.d.ts +9 -0
  182. package/dist/showcase/backdrop/GrainGradient.svelte +126 -0
  183. package/dist/showcase/backdrop/GrainGradient.svelte.d.ts +23 -0
  184. package/dist/showcase/backdrop/MeshGradient.svelte +104 -0
  185. package/dist/showcase/backdrop/MeshGradient.svelte.d.ts +20 -0
  186. package/dist/showcase/backdrop/Metaballs.svelte +116 -0
  187. package/dist/showcase/backdrop/Metaballs.svelte.d.ts +18 -0
  188. package/dist/showcase/backdrop/NeuroNoise.svelte +115 -0
  189. package/dist/showcase/backdrop/NeuroNoise.svelte.d.ts +20 -0
  190. package/dist/showcase/backdrop/ShowcaseBackdrop.svelte +48 -0
  191. package/dist/showcase/backdrop/ShowcaseBackdrop.svelte.d.ts +12 -0
  192. package/dist/showcase/generative/GenerativeBackdrop.svelte +234 -0
  193. package/dist/showcase/generative/GenerativeBackdrop.svelte.d.ts +9 -0
  194. package/dist/showcase/generative/intent.d.ts +7 -0
  195. package/dist/showcase/generative/intent.js +67 -0
  196. package/dist/showcase/generative/manifest.d.ts +9 -0
  197. package/dist/showcase/generative/manifest.js +97 -0
  198. package/dist/showcase/generative/types.d.ts +48 -0
  199. package/dist/showcase/generative/types.js +8 -0
  200. package/dist/showcase/index.d.ts +36 -0
  201. package/dist/showcase/index.js +46 -0
  202. package/dist/showcase/scroll/SmoothScroll.svelte +49 -0
  203. package/dist/showcase/scroll/SmoothScroll.svelte.d.ts +12 -0
  204. package/dist/showcase/scroll/scrollProgress.d.ts +24 -0
  205. package/dist/showcase/scroll/scrollProgress.js +65 -0
  206. package/dist/showcase/scroll/scrollReveal.d.ts +30 -0
  207. package/dist/showcase/scroll/scrollReveal.js +70 -0
  208. package/dist/stores/commandPalette.svelte.d.ts +24 -0
  209. package/dist/stores/commandPalette.svelte.js +82 -0
  210. package/dist/stores/confirmDialog.svelte.js +5 -5
  211. package/dist/stores/inputDialog.svelte.js +5 -5
  212. package/dist/stores/toast.svelte.d.ts +28 -0
  213. package/dist/stores/toast.svelte.js +33 -0
  214. package/dist/styles/motion.css +46 -0
  215. package/dist/styles/tokens.css +31 -0
  216. package/dist/transitions/glide.d.ts +31 -0
  217. package/dist/transitions/glide.js +58 -0
  218. package/dist/types/booking.js +4 -4
  219. package/dist/types/comments.js +2 -2
  220. package/dist/types/messaging.js +3 -3
  221. package/dist/types/pipeline.js +2 -2
  222. package/dist/utils/currency.js +4 -2
  223. package/dist/utils/daisyuiColors.js +27 -25
  224. package/dist/utils/dateFormatters.d.ts +20 -0
  225. package/dist/utils/dateFormatters.js +65 -44
  226. package/dist/utils/googleMapsLoader.js +100 -46
  227. package/dist/utils/mentionParser.js +30 -30
  228. package/dist/utils/phone.js +27 -21
  229. package/dist/utils/phoneFormat.js +9 -9
  230. package/dist/utils/sound.d.ts +6 -0
  231. package/dist/utils/sound.js +113 -0
  232. package/dist/utils/splitText.d.ts +25 -0
  233. package/dist/utils/splitText.js +94 -0
  234. package/dist/utils/taskUtils.js +1 -1
  235. package/dist/utils/themeWipe.d.ts +21 -0
  236. package/dist/utils/themeWipe.js +94 -0
  237. package/dist/utils/viewTransition.d.ts +23 -0
  238. package/dist/utils/viewTransition.js +75 -0
  239. package/package.json +56 -4
@@ -0,0 +1,15 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ orientation?: 'horizontal' | 'vertical';
4
+ class?: string;
5
+ children?: import('svelte').Snippet;
6
+ }
7
+
8
+ let { orientation = 'horizontal', class: className = '', children }: Props = $props();
9
+
10
+ const orientationClass = $derived(orientation === 'vertical' ? 'join-vertical' : 'join');
11
+ </script>
12
+
13
+ <div class="{orientationClass} {className}">
14
+ {#if children}{@render children()}{/if}
15
+ </div>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ orientation?: 'horizontal' | 'vertical';
3
+ class?: string;
4
+ children?: import('svelte').Snippet;
5
+ }
6
+ declare const ButtonGroup: import("svelte").Component<Props, {}, "">;
7
+ type ButtonGroup = ReturnType<typeof ButtonGroup>;
8
+ export default ButtonGroup;
@@ -0,0 +1,85 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ checked?: boolean;
4
+ label?: string;
5
+ size?: 'xs' | 'sm' | 'md' | 'lg';
6
+ variant?: 'default' | 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info';
7
+ disabled?: boolean;
8
+ indeterminate?: boolean;
9
+ name?: string;
10
+ id?: string;
11
+ onchange?: (checked: boolean) => void;
12
+ class?: string;
13
+ }
14
+
15
+ let {
16
+ checked = $bindable(false),
17
+ label,
18
+ size = 'md',
19
+ variant = 'primary',
20
+ disabled = false,
21
+ indeterminate = false,
22
+ name,
23
+ id,
24
+ onchange,
25
+ class: className = ''
26
+ }: Props = $props();
27
+
28
+ const sizeClass = $derived({ xs: 'checkbox-xs', sm: 'checkbox-sm', md: '', lg: 'checkbox-lg' }[size]);
29
+ const variantClass = $derived(
30
+ {
31
+ default: '',
32
+ primary: 'checkbox-primary',
33
+ secondary: 'checkbox-secondary',
34
+ accent: 'checkbox-accent',
35
+ success: 'checkbox-success',
36
+ warning: 'checkbox-warning',
37
+ error: 'checkbox-error',
38
+ info: 'checkbox-info'
39
+ }[variant]
40
+ );
41
+ const inputClass = $derived(
42
+ ['checkbox', sizeClass, variantClass, className].filter(Boolean).join(' ')
43
+ );
44
+
45
+ const inputId = $derived(id || (label ? `checkbox-${Math.random().toString(36).slice(2)}` : undefined));
46
+
47
+ let inputEl: HTMLInputElement | undefined = $state();
48
+
49
+ $effect(() => {
50
+ if (inputEl) inputEl.indeterminate = indeterminate;
51
+ });
52
+
53
+ function handleChange(e: Event) {
54
+ checked = (e.target as HTMLInputElement).checked;
55
+ onchange?.(checked);
56
+ }
57
+ </script>
58
+
59
+ {#if label}
60
+ <label class="flex cursor-pointer items-center gap-2" for={inputId}>
61
+ <input
62
+ bind:this={inputEl}
63
+ type="checkbox"
64
+ {name}
65
+ id={inputId}
66
+ class={inputClass}
67
+ checked={checked}
68
+ {disabled}
69
+ onchange={handleChange}
70
+ />
71
+ <span class="label-text">{label}</span>
72
+ </label>
73
+ {:else}
74
+ <input
75
+ bind:this={inputEl}
76
+ type="checkbox"
77
+ {name}
78
+ {id}
79
+ class={inputClass}
80
+ checked={checked}
81
+ {disabled}
82
+ onchange={handleChange}
83
+ aria-label={label}
84
+ />
85
+ {/if}
@@ -0,0 +1,15 @@
1
+ interface Props {
2
+ checked?: boolean;
3
+ label?: string;
4
+ size?: 'xs' | 'sm' | 'md' | 'lg';
5
+ variant?: 'default' | 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info';
6
+ disabled?: boolean;
7
+ indeterminate?: boolean;
8
+ name?: string;
9
+ id?: string;
10
+ onchange?: (checked: boolean) => void;
11
+ class?: string;
12
+ }
13
+ declare const Checkbox: import("svelte").Component<Props, {}, "checked">;
14
+ type Checkbox = ReturnType<typeof Checkbox>;
15
+ export default Checkbox;
@@ -0,0 +1,17 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ copy?: string;
4
+ class?: string;
5
+ children?: import('svelte').Snippet;
6
+ }
7
+
8
+ let { copy = 'Nothing here yet.', class: className = '', children }: Props = $props();
9
+ </script>
10
+
11
+ <div class="text-base-content/45 flex flex-col items-center justify-center gap-2 py-8 text-sm {className}">
12
+ {#if children}
13
+ {@render children()}
14
+ {:else}
15
+ <span>{copy}</span>
16
+ {/if}
17
+ </div>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ copy?: string;
3
+ class?: string;
4
+ children?: import('svelte').Snippet;
5
+ }
6
+ declare const Empty: import("svelte").Component<Props, {}, "">;
7
+ type Empty = ReturnType<typeof Empty>;
8
+ export default Empty;
@@ -0,0 +1,16 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ size?: 'xs' | 'sm' | 'md' | 'lg';
4
+ class?: string;
5
+ children?: import('svelte').Snippet;
6
+ }
7
+
8
+ let { size = 'md', class: className = '', children }: Props = $props();
9
+
10
+ const sizeClass = $derived({ xs: 'kbd-xs', sm: 'kbd-sm', md: '', lg: 'kbd-lg' }[size]);
11
+ const kbdClass = $derived(['kbd', sizeClass, className].filter(Boolean).join(' '));
12
+ </script>
13
+
14
+ <kbd class={kbdClass}>
15
+ {#if children}{@render children()}{/if}
16
+ </kbd>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ size?: 'xs' | 'sm' | 'md' | 'lg';
3
+ class?: string;
4
+ children?: import('svelte').Snippet;
5
+ }
6
+ declare const Kbd: import("svelte").Component<Props, {}, "">;
7
+ type Kbd = ReturnType<typeof Kbd>;
8
+ export default Kbd;
@@ -0,0 +1,104 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ page?: number;
4
+ count: number;
5
+ pageSize?: number;
6
+ size?: 'xs' | 'sm' | 'md' | 'lg';
7
+ showEdges?: boolean;
8
+ onchange?: (page: number) => void;
9
+ class?: string;
10
+ }
11
+
12
+ let {
13
+ page = $bindable(1),
14
+ count,
15
+ pageSize = 10,
16
+ size = 'md',
17
+ showEdges = true,
18
+ onchange,
19
+ class: className = ''
20
+ }: Props = $props();
21
+
22
+ const totalPages = $derived(Math.max(1, Math.ceil(count / pageSize)));
23
+ const canPrev = $derived(page > 1);
24
+ const canNext = $derived(page < totalPages);
25
+
26
+ const btnSizeClass = $derived({ xs: 'btn-xs', sm: 'btn-sm', md: 'btn-sm', lg: 'btn-md' }[size]);
27
+
28
+ // Show at most 5 page buttons, centered on current page
29
+ const pageNumbers = $derived(() => {
30
+ const delta = 2;
31
+ const range: number[] = [];
32
+ for (
33
+ let i = Math.max(1, page - delta);
34
+ i <= Math.min(totalPages, page + delta);
35
+ i++
36
+ ) {
37
+ range.push(i);
38
+ }
39
+ return range;
40
+ });
41
+
42
+ function go(p: number) {
43
+ if (p < 1 || p > totalPages) return;
44
+ page = p;
45
+ onchange?.(page);
46
+ }
47
+
48
+ function handleKeydown(e: KeyboardEvent, p: number) {
49
+ if (e.key === 'Enter' || e.key === ' ') {
50
+ e.preventDefault();
51
+ go(p);
52
+ }
53
+ }
54
+ </script>
55
+
56
+ <div class="join {className}" role="navigation" aria-label="Pagination">
57
+ {#if showEdges}
58
+ <button
59
+ type="button"
60
+ class="btn join-item {btnSizeClass}"
61
+ disabled={!canPrev}
62
+ onclick={() => go(1)}
63
+ aria-label="First page"
64
+ >«</button>
65
+ {/if}
66
+
67
+ <button
68
+ type="button"
69
+ class="btn join-item {btnSizeClass}"
70
+ disabled={!canPrev}
71
+ onclick={() => go(page - 1)}
72
+ aria-label="Previous page"
73
+ >‹</button>
74
+
75
+ {#each pageNumbers() as p}
76
+ <button
77
+ type="button"
78
+ class="btn join-item {btnSizeClass}"
79
+ class:btn-active={p === page}
80
+ onclick={() => go(p)}
81
+ onkeydown={(e) => handleKeydown(e, p)}
82
+ aria-label="Page {p}"
83
+ aria-current={p === page ? 'page' : undefined}
84
+ >{p}</button>
85
+ {/each}
86
+
87
+ <button
88
+ type="button"
89
+ class="btn join-item {btnSizeClass}"
90
+ disabled={!canNext}
91
+ onclick={() => go(page + 1)}
92
+ aria-label="Next page"
93
+ >›</button>
94
+
95
+ {#if showEdges}
96
+ <button
97
+ type="button"
98
+ class="btn join-item {btnSizeClass}"
99
+ disabled={!canNext}
100
+ onclick={() => go(totalPages)}
101
+ aria-label="Last page"
102
+ >»</button>
103
+ {/if}
104
+ </div>
@@ -0,0 +1,12 @@
1
+ interface Props {
2
+ page?: number;
3
+ count: number;
4
+ pageSize?: number;
5
+ size?: 'xs' | 'sm' | 'md' | 'lg';
6
+ showEdges?: boolean;
7
+ onchange?: (page: number) => void;
8
+ class?: string;
9
+ }
10
+ declare const Pagination: import("svelte").Component<Props, {}, "page">;
11
+ type Pagination = ReturnType<typeof Pagination>;
12
+ export default Pagination;
@@ -0,0 +1,71 @@
1
+ <script lang="ts">
2
+ export interface RadioOption {
3
+ value: string;
4
+ label: string;
5
+ disabled?: boolean;
6
+ }
7
+
8
+ interface Props {
9
+ value?: string;
10
+ options: RadioOption[];
11
+ name: string;
12
+ size?: 'xs' | 'sm' | 'md' | 'lg';
13
+ variant?: 'default' | 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info';
14
+ orientation?: 'horizontal' | 'vertical';
15
+ onchange?: (value: string) => void;
16
+ class?: string;
17
+ }
18
+
19
+ let {
20
+ value = $bindable(''),
21
+ options,
22
+ name,
23
+ size = 'md',
24
+ variant = 'primary',
25
+ orientation = 'vertical',
26
+ onchange,
27
+ class: className = ''
28
+ }: Props = $props();
29
+
30
+ const sizeClass = $derived({ xs: 'radio-xs', sm: 'radio-sm', md: '', lg: 'radio-lg' }[size]);
31
+ const variantClass = $derived(
32
+ {
33
+ default: '',
34
+ primary: 'radio-primary',
35
+ secondary: 'radio-secondary',
36
+ accent: 'radio-accent',
37
+ success: 'radio-success',
38
+ warning: 'radio-warning',
39
+ error: 'radio-error',
40
+ info: 'radio-info'
41
+ }[variant]
42
+ );
43
+ const radioClass = $derived(['radio', sizeClass, variantClass].filter(Boolean).join(' '));
44
+ const groupClass = $derived(
45
+ ['flex', orientation === 'horizontal' ? 'flex-row flex-wrap gap-4' : 'flex-col gap-2', className].join(' ')
46
+ );
47
+
48
+ function handleChange(e: Event, optValue: string) {
49
+ value = optValue;
50
+ onchange?.(value);
51
+ }
52
+ </script>
53
+
54
+ <div class={groupClass} role="radiogroup">
55
+ {#each options as opt}
56
+ {@const inputId = `${name}-${opt.value}`}
57
+ <label class="flex cursor-pointer items-center gap-2" for={inputId}>
58
+ <input
59
+ type="radio"
60
+ id={inputId}
61
+ {name}
62
+ value={opt.value}
63
+ class={radioClass}
64
+ checked={value === opt.value}
65
+ disabled={opt.disabled}
66
+ onchange={(e) => handleChange(e, opt.value)}
67
+ />
68
+ <span class="label-text">{opt.label}</span>
69
+ </label>
70
+ {/each}
71
+ </div>
@@ -0,0 +1,18 @@
1
+ export interface RadioOption {
2
+ value: string;
3
+ label: string;
4
+ disabled?: boolean;
5
+ }
6
+ interface Props {
7
+ value?: string;
8
+ options: RadioOption[];
9
+ name: string;
10
+ size?: 'xs' | 'sm' | 'md' | 'lg';
11
+ variant?: 'default' | 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info';
12
+ orientation?: 'horizontal' | 'vertical';
13
+ onchange?: (value: string) => void;
14
+ class?: string;
15
+ }
16
+ declare const RadioGroup: import("svelte").Component<Props, {}, "value">;
17
+ type RadioGroup = ReturnType<typeof RadioGroup>;
18
+ export default RadioGroup;
@@ -0,0 +1,19 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ orientation?: 'horizontal' | 'vertical';
4
+ label?: string;
5
+ class?: string;
6
+ }
7
+
8
+ let { orientation = 'horizontal', label, class: className = '' }: Props = $props();
9
+ </script>
10
+
11
+ {#if orientation === 'vertical'}
12
+ <div class="divider divider-horizontal {className}" role="separator" aria-orientation="vertical">
13
+ {#if label}{label}{/if}
14
+ </div>
15
+ {:else if label}
16
+ <div class="divider {className}" role="separator" aria-orientation="horizontal">{label}</div>
17
+ {:else}
18
+ <hr class="border-base-content/10 my-0 {className}" role="separator" aria-orientation="horizontal" />
19
+ {/if}
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ orientation?: 'horizontal' | 'vertical';
3
+ label?: string;
4
+ class?: string;
5
+ }
6
+ declare const Separator: import("svelte").Component<Props, {}, "">;
7
+ type Separator = ReturnType<typeof Separator>;
8
+ export default Separator;
@@ -0,0 +1,72 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ value?: number;
4
+ min?: number;
5
+ max?: number;
6
+ step?: number;
7
+ size?: 'xs' | 'sm' | 'md' | 'lg';
8
+ variant?: 'default' | 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info';
9
+ showValue?: boolean;
10
+ disabled?: boolean;
11
+ name?: string;
12
+ id?: string;
13
+ onchange?: (value: number) => void;
14
+ class?: string;
15
+ }
16
+
17
+ let {
18
+ value = $bindable(50),
19
+ min = 0,
20
+ max = 100,
21
+ step = 1,
22
+ size = 'md',
23
+ variant = 'primary',
24
+ showValue = false,
25
+ disabled = false,
26
+ name,
27
+ id,
28
+ onchange,
29
+ class: className = ''
30
+ }: Props = $props();
31
+
32
+ const sizeClass = $derived({ xs: 'range-xs', sm: 'range-sm', md: '', lg: 'range-lg' }[size]);
33
+ const variantClass = $derived(
34
+ {
35
+ default: '',
36
+ primary: 'range-primary',
37
+ secondary: 'range-secondary',
38
+ accent: 'range-accent',
39
+ success: 'range-success',
40
+ warning: 'range-warning',
41
+ error: 'range-error',
42
+ info: 'range-info'
43
+ }[variant]
44
+ );
45
+ const rangeClass = $derived(['range', sizeClass, variantClass, className].filter(Boolean).join(' '));
46
+
47
+ function handleInput(e: Event) {
48
+ value = Number((e.target as HTMLInputElement).value);
49
+ onchange?.(value);
50
+ }
51
+ </script>
52
+
53
+ <div class="flex w-full flex-col gap-1">
54
+ <input
55
+ type="range"
56
+ {name}
57
+ {id}
58
+ class={rangeClass}
59
+ {min}
60
+ {max}
61
+ {step}
62
+ value={value}
63
+ {disabled}
64
+ oninput={handleInput}
65
+ aria-valuenow={value}
66
+ aria-valuemin={min}
67
+ aria-valuemax={max}
68
+ />
69
+ {#if showValue}
70
+ <div class="text-base-content/60 w-full text-right text-xs tabular-nums">{value}</div>
71
+ {/if}
72
+ </div>
@@ -0,0 +1,17 @@
1
+ interface Props {
2
+ value?: number;
3
+ min?: number;
4
+ max?: number;
5
+ step?: number;
6
+ size?: 'xs' | 'sm' | 'md' | 'lg';
7
+ variant?: 'default' | 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info';
8
+ showValue?: boolean;
9
+ disabled?: boolean;
10
+ name?: string;
11
+ id?: string;
12
+ onchange?: (value: number) => void;
13
+ class?: string;
14
+ }
15
+ declare const Slider: import("svelte").Component<Props, {}, "value">;
16
+ type Slider = ReturnType<typeof Slider>;
17
+ export default Slider;
@@ -0,0 +1,88 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ checked?: boolean;
4
+ label?: string;
5
+ size?: 'xs' | 'sm' | 'md' | 'lg';
6
+ variant?: 'default' | 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info';
7
+ disabled?: boolean;
8
+ name?: string;
9
+ id?: string;
10
+ onchange?: (checked: boolean) => void;
11
+ class?: string;
12
+ }
13
+
14
+ let {
15
+ checked = $bindable(false),
16
+ label,
17
+ size = 'md',
18
+ variant = 'primary',
19
+ disabled = false,
20
+ name,
21
+ id,
22
+ onchange,
23
+ class: className = ''
24
+ }: Props = $props();
25
+
26
+ const sizeClass = $derived({ xs: 'toggle-xs', sm: 'toggle-sm', md: '', lg: 'toggle-lg' }[size]);
27
+ const variantClass = $derived(
28
+ {
29
+ default: '',
30
+ primary: 'toggle-primary',
31
+ secondary: 'toggle-secondary',
32
+ accent: 'toggle-accent',
33
+ success: 'toggle-success',
34
+ warning: 'toggle-warning',
35
+ error: 'toggle-error',
36
+ info: 'toggle-info'
37
+ }[variant]
38
+ );
39
+ const inputClass = $derived(
40
+ ['toggle', 'jatui-switch', sizeClass, variantClass, className].filter(Boolean).join(' ')
41
+ );
42
+
43
+ const inputId = $derived(id || (label ? `switch-${Math.random().toString(36).slice(2)}` : undefined));
44
+
45
+ function handleChange(e: Event) {
46
+ checked = (e.target as HTMLInputElement).checked;
47
+ onchange?.(checked);
48
+ }
49
+ </script>
50
+
51
+ {#if label}
52
+ <label class="flex cursor-pointer items-center gap-2" for={inputId}>
53
+ <input
54
+ type="checkbox"
55
+ {name}
56
+ id={inputId}
57
+ class={inputClass}
58
+ checked={checked}
59
+ {disabled}
60
+ onchange={handleChange}
61
+ />
62
+ <span class="label-text">{label}</span>
63
+ </label>
64
+ {:else}
65
+ <input
66
+ type="checkbox"
67
+ {name}
68
+ {id}
69
+ class={inputClass}
70
+ checked={checked}
71
+ {disabled}
72
+ onchange={handleChange}
73
+ aria-label={label}
74
+ />
75
+ {/if}
76
+
77
+ <style>
78
+ /* Spring settle on toggle confirmation — sanctioned per motion contract */
79
+ .jatui-switch {
80
+ transition: background-color var(--motion-fast) var(--motion-spring);
81
+ }
82
+
83
+ @media (prefers-reduced-motion: reduce) {
84
+ .jatui-switch {
85
+ transition: none;
86
+ }
87
+ }
88
+ </style>
@@ -0,0 +1,14 @@
1
+ interface Props {
2
+ checked?: boolean;
3
+ label?: string;
4
+ size?: 'xs' | 'sm' | 'md' | 'lg';
5
+ variant?: 'default' | 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info';
6
+ disabled?: boolean;
7
+ name?: string;
8
+ id?: string;
9
+ onchange?: (checked: boolean) => void;
10
+ class?: string;
11
+ }
12
+ declare const Switch: import("svelte").Component<Props, {}, "checked">;
13
+ type Switch = ReturnType<typeof Switch>;
14
+ export default Switch;
@@ -0,0 +1,43 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Toggle — alias for Switch with identical props.
4
+ * DaisyUI uses `toggle` class; this re-exports that surface.
5
+ */
6
+ import Switch from './Switch.svelte';
7
+
8
+ interface Props {
9
+ checked?: boolean;
10
+ label?: string;
11
+ size?: 'xs' | 'sm' | 'md' | 'lg';
12
+ variant?: 'default' | 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info';
13
+ disabled?: boolean;
14
+ name?: string;
15
+ id?: string;
16
+ onchange?: (checked: boolean) => void;
17
+ class?: string;
18
+ }
19
+
20
+ let {
21
+ checked = $bindable(false),
22
+ label,
23
+ size = 'md',
24
+ variant = 'primary',
25
+ disabled = false,
26
+ name,
27
+ id,
28
+ onchange,
29
+ class: className = ''
30
+ }: Props = $props();
31
+ </script>
32
+
33
+ <Switch
34
+ bind:checked
35
+ {label}
36
+ {size}
37
+ {variant}
38
+ {disabled}
39
+ {name}
40
+ {id}
41
+ {onchange}
42
+ class={className}
43
+ />
@@ -0,0 +1,14 @@
1
+ interface Props {
2
+ checked?: boolean;
3
+ label?: string;
4
+ size?: 'xs' | 'sm' | 'md' | 'lg';
5
+ variant?: 'default' | 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info';
6
+ disabled?: boolean;
7
+ name?: string;
8
+ id?: string;
9
+ onchange?: (checked: boolean) => void;
10
+ class?: string;
11
+ }
12
+ declare const Toggle: import("svelte").Component<Props, {}, "checked">;
13
+ type Toggle = ReturnType<typeof Toggle>;
14
+ export default Toggle;