@joewinke/jatui 0.1.33 → 0.2.1
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.
- package/CLAUDE.md +22 -0
- package/dist/actions/attention.d.ts +24 -0
- package/dist/actions/attention.js +94 -0
- package/dist/actions/floating.d.ts +53 -0
- package/dist/actions/floating.js +158 -0
- package/dist/actions/staggerEntrance.d.ts +28 -0
- package/dist/actions/staggerEntrance.js +71 -0
- package/dist/actions/tooltip.d.ts +28 -0
- package/dist/actions/tooltip.js +186 -0
- package/dist/assets/sounds/README.md +47 -0
- package/dist/assets/sounds/error.d.ts +1 -0
- package/dist/assets/sounds/error.js +4 -0
- package/dist/assets/sounds/notify.d.ts +1 -0
- package/dist/assets/sounds/notify.js +4 -0
- package/dist/assets/sounds/pop.d.ts +1 -0
- package/dist/assets/sounds/pop.js +4 -0
- package/dist/assets/sounds/send.d.ts +1 -0
- package/dist/assets/sounds/send.js +4 -0
- package/dist/assets/sounds/success.d.ts +1 -0
- package/dist/assets/sounds/success.js +4 -0
- package/dist/assets/sounds/toggle.d.ts +1 -0
- package/dist/assets/sounds/toggle.js +4 -0
- package/dist/carousel/index.d.ts +1 -0
- package/dist/carousel/index.js +2 -0
- package/dist/components/AnimatedNumber.svelte +112 -0
- package/dist/components/AnimatedNumber.svelte.d.ts +8 -0
- package/dist/components/Badge.svelte +75 -4
- package/dist/components/Badge.svelte.d.ts +6 -1
- package/dist/components/Button.svelte +196 -21
- package/dist/components/Button.svelte.d.ts +10 -1
- package/dist/components/Carousel.svelte +265 -0
- package/dist/components/Carousel.svelte.d.ts +21 -0
- package/dist/components/ChipInput.svelte +63 -3
- package/dist/components/Collapse.svelte +70 -14
- package/dist/components/Collapse.svelte.d.ts +11 -0
- package/dist/components/ColorSelector.svelte +21 -24
- package/dist/components/CommandPalette.svelte +475 -0
- package/dist/components/CommandPalette.svelte.d.ts +3 -0
- package/dist/components/ContextMenu.svelte +9 -73
- package/dist/components/CopyButton.svelte +156 -0
- package/dist/components/CopyButton.svelte.d.ts +12 -0
- package/dist/components/HoldToConfirm.svelte +183 -0
- package/dist/components/HoldToConfirm.svelte.d.ts +11 -0
- package/dist/components/KeyboardShortcutsOverlay.svelte +54 -8
- package/dist/components/KeyboardShortcutsOverlay.svelte.d.ts +3 -0
- package/dist/components/PasswordMeter.svelte +87 -0
- package/dist/components/PasswordMeter.svelte.d.ts +8 -0
- package/dist/components/PinInput.svelte +186 -0
- package/dist/components/PinInput.svelte.d.ts +13 -0
- package/dist/components/QuantityStepper.svelte +185 -0
- package/dist/components/QuantityStepper.svelte.d.ts +12 -0
- package/dist/components/Skeleton.svelte +123 -0
- package/dist/components/Skeleton.svelte.d.ts +12 -0
- package/dist/components/SpeechForm.svelte +37 -0
- package/dist/components/StatusBadge.svelte +31 -3
- package/dist/components/StatusBadge.svelte.d.ts +0 -5
- package/dist/components/Tabs.svelte +270 -0
- package/dist/components/Tabs.svelte.d.ts +15 -0
- package/dist/components/TextInput.svelte +138 -38
- package/dist/components/TextInput.svelte.d.ts +9 -1
- package/dist/components/VoicePlayer.svelte +51 -0
- package/dist/components/basic/Alert.svelte +36 -0
- package/dist/components/basic/Alert.svelte.d.ts +9 -0
- package/dist/components/basic/Breadcrumb.svelte +27 -0
- package/dist/components/basic/Breadcrumb.svelte.d.ts +11 -0
- package/dist/components/basic/ButtonGroup.svelte +15 -0
- package/dist/components/basic/ButtonGroup.svelte.d.ts +8 -0
- package/dist/components/basic/Checkbox.svelte +85 -0
- package/dist/components/basic/Checkbox.svelte.d.ts +15 -0
- package/dist/components/basic/Empty.svelte +17 -0
- package/dist/components/basic/Empty.svelte.d.ts +8 -0
- package/dist/components/basic/Kbd.svelte +16 -0
- package/dist/components/basic/Kbd.svelte.d.ts +8 -0
- package/dist/components/basic/Pagination.svelte +104 -0
- package/dist/components/basic/Pagination.svelte.d.ts +12 -0
- package/dist/components/basic/RadioGroup.svelte +71 -0
- package/dist/components/basic/RadioGroup.svelte.d.ts +18 -0
- package/dist/components/basic/Separator.svelte +19 -0
- package/dist/components/basic/Separator.svelte.d.ts +8 -0
- package/dist/components/basic/Slider.svelte +72 -0
- package/dist/components/basic/Slider.svelte.d.ts +17 -0
- package/dist/components/basic/Switch.svelte +88 -0
- package/dist/components/basic/Switch.svelte.d.ts +14 -0
- package/dist/components/basic/Toggle.svelte +43 -0
- package/dist/components/basic/Toggle.svelte.d.ts +14 -0
- package/dist/components/graph/GraphCanvas.svelte +103 -0
- package/dist/components/graph/GraphCanvas.svelte.d.ts +22 -0
- package/dist/components/graph/JatuiNode.svelte +128 -0
- package/dist/components/graph/JatuiNode.svelte.d.ts +14 -0
- package/dist/components/graph/index.d.ts +4 -0
- package/dist/components/graph/index.js +4 -0
- package/dist/components/graph/theme.d.ts +27 -0
- package/dist/components/graph/theme.js +136 -0
- package/dist/components/messaging/MessageItem.svelte +92 -0
- package/dist/components/messaging/MessageItem.svelte.d.ts +5 -0
- package/dist/components/messaging/TypingIndicator.svelte +63 -0
- package/dist/components/messaging/TypingIndicator.svelte.d.ts +7 -0
- package/dist/components/pipeline/PipelineColumn.svelte +44 -3
- package/dist/components/progress/ProgressBar.svelte +189 -0
- package/dist/components/progress/ProgressBar.svelte.d.ts +17 -0
- package/dist/components/progress/ProgressRing.svelte +138 -0
- package/dist/components/progress/ProgressRing.svelte.d.ts +12 -0
- package/dist/components/progress/Steps.svelte +195 -0
- package/dist/components/progress/Steps.svelte.d.ts +14 -0
- package/dist/components/shell/NavigationMenu.svelte +422 -0
- package/dist/components/shell/NavigationMenu.svelte.d.ts +43 -0
- package/dist/components/shell/Sidebar.svelte +276 -0
- package/dist/components/shell/Sidebar.svelte.d.ts +32 -0
- package/dist/components/shell/SidebarGroup.svelte +180 -0
- package/dist/components/shell/SidebarGroup.svelte.d.ts +19 -0
- package/dist/components/shell/SidebarItem.svelte +170 -0
- package/dist/components/shell/SidebarItem.svelte.d.ts +24 -0
- package/dist/components/shell/shell.d.ts +30 -0
- package/dist/components/shell/shell.js +65 -0
- package/dist/components/table/DataTable.svelte +364 -0
- package/dist/components/table/DataTable.svelte.d.ts +4 -0
- package/dist/components/table/flexRender.d.ts +31 -0
- package/dist/components/table/flexRender.js +32 -0
- package/dist/components/table/index.d.ts +3 -0
- package/dist/components/table/index.js +3 -0
- package/dist/components/table/types.d.ts +28 -0
- package/dist/components/table/types.js +1 -0
- package/dist/components/toast/ToastHost.svelte +21 -0
- package/dist/components/toast/ToastHost.svelte.d.ts +3 -0
- package/dist/components/toast/ToastItem.svelte +287 -0
- package/dist/components/toast/ToastItem.svelte.d.ts +9 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.js +64 -0
- package/dist/showcase/AnimatedBeam.svelte +183 -0
- package/dist/showcase/AnimatedBeam.svelte.d.ts +26 -0
- package/dist/showcase/AuroraDrift.svelte +74 -0
- package/dist/showcase/AuroraDrift.svelte.d.ts +9 -0
- package/dist/showcase/BentoCard.svelte +50 -0
- package/dist/showcase/BentoCard.svelte.d.ts +14 -0
- package/dist/showcase/BentoGrid.svelte +43 -0
- package/dist/showcase/BentoGrid.svelte.d.ts +12 -0
- package/dist/showcase/BorderBeam.svelte +79 -0
- package/dist/showcase/BorderBeam.svelte.d.ts +12 -0
- package/dist/showcase/ClipWipe.svelte +82 -0
- package/dist/showcase/ClipWipe.svelte.d.ts +12 -0
- package/dist/showcase/Confetti.svelte +71 -0
- package/dist/showcase/Confetti.svelte.d.ts +10 -0
- package/dist/showcase/CursorSpotlight.svelte +85 -0
- package/dist/showcase/CursorSpotlight.svelte.d.ts +9 -0
- package/dist/showcase/DeviceMock.svelte +186 -0
- package/dist/showcase/DeviceMock.svelte.d.ts +11 -0
- package/dist/showcase/Dock.svelte +123 -0
- package/dist/showcase/Dock.svelte.d.ts +17 -0
- package/dist/showcase/FlipCard.svelte +103 -0
- package/dist/showcase/FlipCard.svelte.d.ts +10 -0
- package/dist/showcase/FocusReveal.svelte +83 -0
- package/dist/showcase/FocusReveal.svelte.d.ts +11 -0
- package/dist/showcase/Globe.svelte +202 -0
- package/dist/showcase/Globe.svelte.d.ts +16 -0
- package/dist/showcase/KenBurns.svelte +105 -0
- package/dist/showcase/KenBurns.svelte.d.ts +13 -0
- package/dist/showcase/Marquee.svelte +89 -0
- package/dist/showcase/Marquee.svelte.d.ts +9 -0
- package/dist/showcase/ParallaxTilt.svelte +98 -0
- package/dist/showcase/ParallaxTilt.svelte.d.ts +10 -0
- package/dist/showcase/ScrambleText.svelte +98 -0
- package/dist/showcase/ScrambleText.svelte.d.ts +11 -0
- package/dist/showcase/ShineSweep.svelte +81 -0
- package/dist/showcase/ShineSweep.svelte.d.ts +9 -0
- package/dist/showcase/Terminal.svelte +230 -0
- package/dist/showcase/Terminal.svelte.d.ts +18 -0
- package/dist/showcase/TextSplitReveal.svelte +146 -0
- package/dist/showcase/TextSplitReveal.svelte.d.ts +13 -0
- package/dist/showcase/TextWave.svelte +55 -0
- package/dist/showcase/TextWave.svelte.d.ts +8 -0
- package/dist/showcase/TypewriterText.svelte +130 -0
- package/dist/showcase/TypewriterText.svelte.d.ts +9 -0
- package/dist/showcase/backdrop/GrainGradient.svelte +126 -0
- package/dist/showcase/backdrop/GrainGradient.svelte.d.ts +23 -0
- package/dist/showcase/backdrop/MeshGradient.svelte +104 -0
- package/dist/showcase/backdrop/MeshGradient.svelte.d.ts +20 -0
- package/dist/showcase/backdrop/Metaballs.svelte +116 -0
- package/dist/showcase/backdrop/Metaballs.svelte.d.ts +18 -0
- package/dist/showcase/backdrop/NeuroNoise.svelte +115 -0
- package/dist/showcase/backdrop/NeuroNoise.svelte.d.ts +20 -0
- package/dist/showcase/backdrop/ShowcaseBackdrop.svelte +48 -0
- package/dist/showcase/backdrop/ShowcaseBackdrop.svelte.d.ts +12 -0
- package/dist/showcase/backdrop/index.d.ts +5 -0
- package/dist/showcase/backdrop/index.js +6 -0
- package/dist/showcase/generative/GenerativeBackdrop.svelte +234 -0
- package/dist/showcase/generative/GenerativeBackdrop.svelte.d.ts +9 -0
- package/dist/showcase/generative/intent.d.ts +7 -0
- package/dist/showcase/generative/intent.js +67 -0
- package/dist/showcase/generative/manifest.d.ts +9 -0
- package/dist/showcase/generative/manifest.js +97 -0
- package/dist/showcase/generative/types.d.ts +48 -0
- package/dist/showcase/generative/types.js +8 -0
- package/dist/showcase/globe/index.d.ts +1 -0
- package/dist/showcase/globe/index.js +2 -0
- package/dist/showcase/index.d.ts +25 -0
- package/dist/showcase/index.js +39 -0
- package/dist/showcase/scroll/SmoothScroll.svelte +49 -0
- package/dist/showcase/scroll/SmoothScroll.svelte.d.ts +12 -0
- package/dist/showcase/scroll/index.d.ts +5 -0
- package/dist/showcase/scroll/index.js +4 -0
- package/dist/showcase/scroll/scrollProgress.d.ts +24 -0
- package/dist/showcase/scroll/scrollProgress.js +65 -0
- package/dist/showcase/scroll/scrollReveal.d.ts +30 -0
- package/dist/showcase/scroll/scrollReveal.js +70 -0
- package/dist/stores/commandPalette.svelte.d.ts +24 -0
- package/dist/stores/commandPalette.svelte.js +82 -0
- package/dist/stores/toast.svelte.d.ts +28 -0
- package/dist/stores/toast.svelte.js +33 -0
- package/dist/styles/motion.css +46 -0
- package/dist/styles/tokens.css +31 -0
- package/dist/transitions/glide.d.ts +31 -0
- package/dist/transitions/glide.js +58 -0
- package/dist/utils/sound.d.ts +6 -0
- package/dist/utils/sound.js +113 -0
- package/dist/utils/splitText.d.ts +25 -0
- package/dist/utils/splitText.js +94 -0
- package/dist/utils/themeWipe.d.ts +21 -0
- package/dist/utils/themeWipe.js +94 -0
- package/dist/utils/viewTransition.d.ts +23 -0
- package/dist/utils/viewTransition.js +75 -0
- package/package.json +78 -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,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,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,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;
|