@casinogate/ui 1.11.9 → 1.11.11
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/dist/assets/css/root.css +6 -0
- package/dist/components/file-upload/components/file-upload.clear-trigger.svelte +15 -14
- package/dist/components/file-upload/components/file-upload.context.svelte +10 -2
- package/dist/components/file-upload/components/file-upload.dropzone.svelte +20 -48
- package/dist/components/file-upload/components/file-upload.hidden-input.svelte +14 -10
- package/dist/components/file-upload/components/file-upload.item-delete-trigger.svelte +21 -11
- package/dist/components/file-upload/components/file-upload.item-name.svelte +3 -8
- package/dist/components/file-upload/components/file-upload.item-preview-image.svelte +5 -17
- package/dist/components/file-upload/components/file-upload.item-preview.svelte +8 -3
- package/dist/components/file-upload/components/file-upload.item-size-text.svelte +2 -2
- package/dist/components/file-upload/components/file-upload.root.svelte +31 -19
- package/dist/components/file-upload/components/file-upload.root.svelte.d.ts +1 -1
- package/dist/components/file-upload/components/file-upload.svelte.d.ts +75 -4
- package/dist/components/file-upload/components/file-upload.svelte.js +164 -18
- package/dist/components/file-upload/styles.js +4 -3
- package/dist/components/file-upload/types.d.ts +7 -4
- package/dist/components/icons/exports.d.ts +1 -0
- package/dist/components/icons/exports.js +1 -0
- package/dist/components/icons/file.svelte +8 -0
- package/dist/components/icons/file.svelte.d.ts +26 -0
- package/dist/components/pagination/components/pagination.item.svelte +9 -4
- package/dist/components/pagination/components/pagination.item.svelte.d.ts +2 -2
- package/dist/components/pagination/components/pagination.next-button.svelte +1 -3
- package/dist/components/pagination/components/pagination.root.svelte +15 -4
- package/dist/components/pagination/components/pagination.root.svelte.d.ts +1 -1
- package/dist/components/pagination/components/state.svelte.d.ts +15 -0
- package/dist/components/pagination/components/state.svelte.js +11 -0
- package/dist/components/pagination/composed/root/pagination.root.svelte +9 -3
- package/dist/components/pagination/composed/root/pagination.root.svelte.d.ts +1 -1
- package/dist/components/pagination/styles.d.ts +24 -16
- package/dist/components/pagination/styles.js +10 -6
- package/dist/components/pagination/types.d.ts +4 -3
- package/package.json +1 -1
package/dist/assets/css/root.css
CHANGED
|
@@ -2593,6 +2593,12 @@
|
|
|
2593
2593
|
height: calc(var(--cgui-spacing) * 3.5);
|
|
2594
2594
|
}
|
|
2595
2595
|
}
|
|
2596
|
+
.cgui\:\[\&\>svg\]\:size-4 {
|
|
2597
|
+
&>svg {
|
|
2598
|
+
width: calc(var(--cgui-spacing) * 4);
|
|
2599
|
+
height: calc(var(--cgui-spacing) * 4);
|
|
2600
|
+
}
|
|
2601
|
+
}
|
|
2596
2602
|
.cgui\:\[\&\>svg\]\:size-5 {
|
|
2597
2603
|
&>svg {
|
|
2598
2604
|
width: calc(var(--cgui-spacing) * 5);
|
|
@@ -1,30 +1,31 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { cn } from '../../../internal/utils/common.js';
|
|
2
|
+
import { cn, useId } from '../../../internal/utils/common.js';
|
|
3
|
+
import { boxWith, mergeProps } from 'svelte-toolbelt';
|
|
3
4
|
import { fileUploadPrimitiveClearTriggerStyles } from '../styles.js';
|
|
4
5
|
import type { FileUploadPrimitiveClearTriggerProps } from '../types.js';
|
|
5
|
-
import {
|
|
6
|
+
import { FileUploadClearTriggerState } from './file-upload.svelte.js';
|
|
7
|
+
|
|
8
|
+
const uid = $props.id();
|
|
6
9
|
|
|
7
10
|
let {
|
|
8
11
|
ref = $bindable(null),
|
|
12
|
+
id = useId(uid),
|
|
9
13
|
children,
|
|
10
14
|
class: className,
|
|
11
15
|
...restProps
|
|
12
16
|
}: FileUploadPrimitiveClearTriggerProps = $props();
|
|
13
17
|
|
|
14
|
-
const
|
|
18
|
+
const state$ = FileUploadClearTriggerState.create({
|
|
19
|
+
ref: boxWith(
|
|
20
|
+
() => ref,
|
|
21
|
+
(v) => (ref = v)
|
|
22
|
+
),
|
|
23
|
+
id: boxWith(() => id),
|
|
24
|
+
});
|
|
15
25
|
|
|
16
|
-
|
|
17
|
-
rootState.clearFiles();
|
|
18
|
-
}
|
|
26
|
+
const mergedProps = $derived(mergeProps(restProps, state$.props));
|
|
19
27
|
</script>
|
|
20
28
|
|
|
21
|
-
<button
|
|
22
|
-
bind:this={ref}
|
|
23
|
-
type="button"
|
|
24
|
-
class={cn(fileUploadPrimitiveClearTriggerStyles(), className)}
|
|
25
|
-
data-slot="file-upload-clear-trigger"
|
|
26
|
-
onclick={handleClick}
|
|
27
|
-
{...restProps}
|
|
28
|
-
>
|
|
29
|
+
<button bind:this={ref} type="button" class={cn(fileUploadPrimitiveClearTriggerStyles(), className)} {...mergedProps}>
|
|
29
30
|
{@render children?.()}
|
|
30
31
|
</button>
|
|
@@ -4,7 +4,15 @@
|
|
|
4
4
|
|
|
5
5
|
const { children }: FileUploadPrimitiveContextProps = $props();
|
|
6
6
|
|
|
7
|
-
const context = FileUploadRootContext.get();
|
|
7
|
+
const context$ = FileUploadRootContext.get();
|
|
8
8
|
</script>
|
|
9
9
|
|
|
10
|
-
{@render children?.(
|
|
10
|
+
{@render children?.({
|
|
11
|
+
acceptedFiles: () => context$.opts.acceptedFiles.current,
|
|
12
|
+
rejectedFiles: () => context$.opts.rejectedFiles.current,
|
|
13
|
+
dragging: () => context$.dragging,
|
|
14
|
+
addFiles: context$.addFiles,
|
|
15
|
+
removeFile: context$.removeFile,
|
|
16
|
+
clearFiles: context$.clearFiles,
|
|
17
|
+
openFilePicker: context$.openFilePicker,
|
|
18
|
+
})}
|
|
@@ -1,72 +1,44 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { cn } from '../../../internal/utils/common.js';
|
|
2
|
+
import { cn, useId } from '../../../internal/utils/common.js';
|
|
3
|
+
import { boxWith, mergeProps } from 'svelte-toolbelt';
|
|
3
4
|
import { fileUploadPrimitiveDropzoneStyles } from '../styles.js';
|
|
4
5
|
import type { FileUploadPrimitiveDropzoneProps } from '../types.js';
|
|
5
|
-
import {
|
|
6
|
+
import { FileUploadDropzoneState } from './file-upload.svelte.js';
|
|
7
|
+
|
|
8
|
+
const uid = $props.id();
|
|
6
9
|
|
|
7
10
|
let {
|
|
8
11
|
ref = $bindable(null),
|
|
12
|
+
id = useId(uid),
|
|
9
13
|
disableClick = false,
|
|
10
14
|
children,
|
|
11
15
|
class: className,
|
|
12
16
|
...restProps
|
|
13
17
|
}: FileUploadPrimitiveDropzoneProps = $props();
|
|
14
18
|
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
function handleDragLeave(e: DragEvent) {
|
|
24
|
-
e.preventDefault();
|
|
25
|
-
e.stopPropagation();
|
|
26
|
-
rootState.dragging = false;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function handleDragOver(e: DragEvent) {
|
|
30
|
-
e.preventDefault();
|
|
31
|
-
e.stopPropagation();
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function handleDrop(e: DragEvent) {
|
|
35
|
-
e.preventDefault();
|
|
36
|
-
e.stopPropagation();
|
|
37
|
-
rootState.dragging = false;
|
|
38
|
-
|
|
39
|
-
if (e.dataTransfer?.files) {
|
|
40
|
-
rootState.addFiles(e.dataTransfer.files);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
19
|
+
const state$ = FileUploadDropzoneState.create({
|
|
20
|
+
disabledClick: boxWith(() => disableClick),
|
|
21
|
+
id: boxWith(() => id),
|
|
22
|
+
ref: boxWith(
|
|
23
|
+
() => ref,
|
|
24
|
+
(v) => (ref = v)
|
|
25
|
+
),
|
|
26
|
+
});
|
|
43
27
|
|
|
44
|
-
|
|
45
|
-
if (!disableClick) {
|
|
46
|
-
rootState.openFilePicker();
|
|
47
|
-
}
|
|
48
|
-
}
|
|
28
|
+
const mergedProps = $derived(mergeProps(restProps, state$.props));
|
|
49
29
|
</script>
|
|
50
30
|
|
|
51
31
|
<div
|
|
52
32
|
bind:this={ref}
|
|
53
|
-
role="presentation"
|
|
54
33
|
class={cn(
|
|
55
34
|
fileUploadPrimitiveDropzoneStyles({
|
|
56
|
-
dragging:
|
|
57
|
-
invalid:
|
|
58
|
-
disabled:
|
|
35
|
+
dragging: state$.root$.dragging,
|
|
36
|
+
invalid: state$.root$.opts.invalid.current,
|
|
37
|
+
disabled: state$.root$.opts.disabled.current,
|
|
59
38
|
}),
|
|
60
|
-
className
|
|
39
|
+
className
|
|
61
40
|
)}
|
|
62
|
-
|
|
63
|
-
data-dragging={rootState.dragging || undefined}
|
|
64
|
-
ondragenter={handleDragEnter}
|
|
65
|
-
ondragleave={handleDragLeave}
|
|
66
|
-
ondragover={handleDragOver}
|
|
67
|
-
ondrop={handleDrop}
|
|
68
|
-
onclick={handleClick}
|
|
69
|
-
{...restProps}
|
|
41
|
+
{...mergedProps}
|
|
70
42
|
>
|
|
71
43
|
{@render children?.()}
|
|
72
44
|
</div>
|
|
@@ -1,35 +1,39 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import type { Attachment } from 'svelte/attachments';
|
|
2
3
|
import type { FileUploadPrimitiveHiddenInputProps } from '../types.js';
|
|
3
4
|
import { FileUploadRootContext } from './file-upload.svelte.js';
|
|
4
5
|
|
|
5
6
|
let { ref = $bindable(null), ...restProps }: FileUploadPrimitiveHiddenInputProps = $props();
|
|
6
7
|
|
|
7
|
-
const
|
|
8
|
+
const root$ = FileUploadRootContext.get();
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
const attachEl: Attachment<HTMLInputElement> = (el) => {
|
|
11
|
+
root$.setHiddenInput(el);
|
|
10
12
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
return () => {
|
|
14
|
+
root$.setHiddenInput(null);
|
|
15
|
+
};
|
|
16
|
+
};
|
|
14
17
|
|
|
15
18
|
function handleChange(e: Event) {
|
|
16
19
|
const input = e.target as HTMLInputElement;
|
|
17
20
|
if (input.files) {
|
|
18
|
-
|
|
21
|
+
root$.addFiles(input.files);
|
|
19
22
|
input.value = '';
|
|
20
23
|
}
|
|
21
24
|
}
|
|
22
25
|
</script>
|
|
23
26
|
|
|
24
27
|
<input
|
|
25
|
-
bind:this={
|
|
28
|
+
bind:this={ref}
|
|
29
|
+
{@attach attachEl}
|
|
26
30
|
type="file"
|
|
27
31
|
tabindex={-1}
|
|
28
32
|
style="position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;"
|
|
29
33
|
data-slot="file-upload-hidden-input"
|
|
30
|
-
accept={
|
|
31
|
-
multiple={
|
|
32
|
-
disabled={
|
|
34
|
+
accept={root$.opts.accept.current}
|
|
35
|
+
multiple={root$.opts.maxFiles.current > 1}
|
|
36
|
+
disabled={root$.opts.disabled.current}
|
|
33
37
|
onchange={handleChange}
|
|
34
38
|
{...restProps}
|
|
35
39
|
/>
|
|
@@ -1,31 +1,41 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import {
|
|
2
|
+
import { Icon } from '../../icons/index.js';
|
|
3
|
+
import { cn, useId } from '../../../internal/utils/common.js';
|
|
4
|
+
import { boxWith, mergeProps } from 'svelte-toolbelt';
|
|
3
5
|
import { fileUploadPrimitiveItemDeleteTriggerStyles } from '../styles.js';
|
|
4
6
|
import type { FileUploadPrimitiveItemDeleteTriggerProps } from '../types.js';
|
|
5
|
-
import {
|
|
7
|
+
import { FileUploadDeleteTriggerState } from './file-upload.svelte.js';
|
|
8
|
+
|
|
9
|
+
const uid = $props.id();
|
|
6
10
|
|
|
7
11
|
let {
|
|
8
12
|
ref = $bindable(null),
|
|
13
|
+
id = useId(uid),
|
|
9
14
|
children,
|
|
10
15
|
class: className,
|
|
11
16
|
...restProps
|
|
12
17
|
}: FileUploadPrimitiveItemDeleteTriggerProps = $props();
|
|
13
18
|
|
|
14
|
-
const
|
|
15
|
-
|
|
19
|
+
const state$ = FileUploadDeleteTriggerState.create({
|
|
20
|
+
ref: boxWith(
|
|
21
|
+
() => ref,
|
|
22
|
+
(v) => (ref = v)
|
|
23
|
+
),
|
|
24
|
+
id: boxWith(() => id),
|
|
25
|
+
});
|
|
16
26
|
|
|
17
|
-
|
|
18
|
-
rootState.removeFile(itemState.opts.file.current);
|
|
19
|
-
}
|
|
27
|
+
const mergedProps = $derived(mergeProps(restProps, state$.props));
|
|
20
28
|
</script>
|
|
21
29
|
|
|
22
30
|
<button
|
|
23
31
|
bind:this={ref}
|
|
24
32
|
type="button"
|
|
25
33
|
class={cn(fileUploadPrimitiveItemDeleteTriggerStyles(), className)}
|
|
26
|
-
|
|
27
|
-
onclick={handleClick}
|
|
28
|
-
{...restProps}
|
|
34
|
+
{...mergedProps}
|
|
29
35
|
>
|
|
30
|
-
{
|
|
36
|
+
{#if children}
|
|
37
|
+
{@render children()}
|
|
38
|
+
{:else}
|
|
39
|
+
<Icon.Cross />
|
|
40
|
+
{/if}
|
|
31
41
|
</button>
|
|
@@ -4,14 +4,9 @@
|
|
|
4
4
|
import type { FileUploadPrimitiveItemNameProps } from '../types.js';
|
|
5
5
|
import { FileUploadItemContext } from './file-upload.svelte.js';
|
|
6
6
|
|
|
7
|
-
let {
|
|
8
|
-
ref = $bindable(null),
|
|
9
|
-
children,
|
|
10
|
-
class: className,
|
|
11
|
-
...restProps
|
|
12
|
-
}: FileUploadPrimitiveItemNameProps = $props();
|
|
7
|
+
let { ref = $bindable(null), children, class: className, ...restProps }: FileUploadPrimitiveItemNameProps = $props();
|
|
13
8
|
|
|
14
|
-
const
|
|
9
|
+
const item$ = FileUploadItemContext.get();
|
|
15
10
|
</script>
|
|
16
11
|
|
|
17
12
|
<div
|
|
@@ -23,6 +18,6 @@
|
|
|
23
18
|
{#if children}
|
|
24
19
|
{@render children()}
|
|
25
20
|
{:else}
|
|
26
|
-
{
|
|
21
|
+
{item$.opts.file.current.name}
|
|
27
22
|
{/if}
|
|
28
23
|
</div>
|
|
@@ -2,30 +2,18 @@
|
|
|
2
2
|
import { cn } from '../../../internal/utils/common.js';
|
|
3
3
|
import { fileUploadPrimitiveItemPreviewImageStyles } from '../styles.js';
|
|
4
4
|
import type { FileUploadPrimitiveItemPreviewImageProps } from '../types.js';
|
|
5
|
-
import {
|
|
5
|
+
import { FileUploadPreviewImageState } from './file-upload.svelte.js';
|
|
6
6
|
|
|
7
7
|
let { ref = $bindable(null), class: className, ...restProps }: FileUploadPrimitiveItemPreviewImageProps = $props();
|
|
8
8
|
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
let url = $state<string | undefined>(undefined);
|
|
12
|
-
|
|
13
|
-
$effect(() => {
|
|
14
|
-
const file = itemState.opts.file.current;
|
|
15
|
-
const objectUrl = URL.createObjectURL(file);
|
|
16
|
-
url = objectUrl;
|
|
17
|
-
|
|
18
|
-
return () => {
|
|
19
|
-
URL.revokeObjectURL(objectUrl);
|
|
20
|
-
};
|
|
21
|
-
});
|
|
9
|
+
const state$ = FileUploadPreviewImageState.create();
|
|
22
10
|
</script>
|
|
23
11
|
|
|
24
|
-
{#if
|
|
12
|
+
{#if state$.imageUrl}
|
|
25
13
|
<img
|
|
26
14
|
bind:this={ref}
|
|
27
|
-
src={
|
|
28
|
-
alt={
|
|
15
|
+
src={state$.imageUrl}
|
|
16
|
+
alt={state$.item$.opts.file.current.name}
|
|
29
17
|
class={cn(fileUploadPrimitiveItemPreviewImageStyles(), className)}
|
|
30
18
|
data-slot="file-upload-item-preview-image"
|
|
31
19
|
{...restProps}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import { Icon } from '../../icons/index.js';
|
|
2
3
|
import { cn } from '../../../internal/utils/common.js';
|
|
3
4
|
import { fileUploadPrimitiveItemPreviewStyles } from '../styles.js';
|
|
4
5
|
import type { FileUploadPrimitiveItemPreviewProps } from '../types.js';
|
|
@@ -12,9 +13,9 @@
|
|
|
12
13
|
...restProps
|
|
13
14
|
}: FileUploadPrimitiveItemPreviewProps = $props();
|
|
14
15
|
|
|
15
|
-
const
|
|
16
|
+
const item$ = FileUploadItemContext.get();
|
|
16
17
|
|
|
17
|
-
const isMatch = $derived(Boolean(
|
|
18
|
+
const isMatch = $derived(Boolean(item$.opts.file.current.type.match(type)));
|
|
18
19
|
</script>
|
|
19
20
|
|
|
20
21
|
{#if isMatch}
|
|
@@ -24,6 +25,10 @@
|
|
|
24
25
|
data-slot="file-upload-item-preview"
|
|
25
26
|
{...restProps}
|
|
26
27
|
>
|
|
27
|
-
{
|
|
28
|
+
{#if children}
|
|
29
|
+
{@render children?.()}
|
|
30
|
+
{:else}
|
|
31
|
+
<Icon.File />
|
|
32
|
+
{/if}
|
|
28
33
|
</div>
|
|
29
34
|
{/if}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
...restProps
|
|
12
12
|
}: FileUploadPrimitiveItemSizeTextProps = $props();
|
|
13
13
|
|
|
14
|
-
const
|
|
14
|
+
const item$ = FileUploadItemContext.get();
|
|
15
15
|
</script>
|
|
16
16
|
|
|
17
17
|
<div
|
|
@@ -23,6 +23,6 @@
|
|
|
23
23
|
{#if children}
|
|
24
24
|
{@render children()}
|
|
25
25
|
{:else}
|
|
26
|
-
{formatFileSize(
|
|
26
|
+
{formatFileSize(item$.opts.file.current.size)}
|
|
27
27
|
{/if}
|
|
28
28
|
</div>
|
|
@@ -1,37 +1,49 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { boolAttr } from '../../../internal/utils/attrs.js';
|
|
3
|
+
import { cn, noop } from '../../../internal/utils/common.js';
|
|
4
|
+
import { boxWith } from 'svelte-toolbelt';
|
|
4
5
|
import { fileUploadPrimitiveRootStyles } from '../styles.js';
|
|
5
6
|
import type { FileUploadPrimitiveRootProps } from '../types.js';
|
|
6
7
|
import { FileUploadRootState } from './file-upload.svelte.js';
|
|
7
8
|
|
|
8
9
|
let {
|
|
9
10
|
ref = $bindable(null),
|
|
11
|
+
acceptedFiles = $bindable([]),
|
|
12
|
+
rejectedFiles = $bindable([]),
|
|
10
13
|
accept,
|
|
11
14
|
maxFiles = 1,
|
|
12
15
|
maxFileSize = Infinity,
|
|
13
16
|
disabled = false,
|
|
14
17
|
invalid = false,
|
|
15
|
-
onFileAccept,
|
|
16
|
-
onFileReject,
|
|
17
|
-
onFileChange,
|
|
18
|
+
onFileAccept = noop,
|
|
19
|
+
onFileReject = noop,
|
|
20
|
+
onFileChange = noop,
|
|
18
21
|
children,
|
|
19
22
|
class: className,
|
|
20
23
|
...restProps
|
|
21
24
|
}: FileUploadPrimitiveRootProps = $props();
|
|
22
25
|
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
26
|
+
const state$ = FileUploadRootState.create({
|
|
27
|
+
acceptedFiles: boxWith(
|
|
28
|
+
() => acceptedFiles,
|
|
29
|
+
(v) => {
|
|
30
|
+
acceptedFiles = v;
|
|
31
|
+
}
|
|
32
|
+
),
|
|
33
|
+
rejectedFiles: boxWith(
|
|
34
|
+
() => rejectedFiles,
|
|
35
|
+
(v) => {
|
|
36
|
+
rejectedFiles = v;
|
|
37
|
+
}
|
|
38
|
+
),
|
|
39
|
+
accept: boxWith(() => accept),
|
|
40
|
+
maxFiles: boxWith(() => maxFiles),
|
|
41
|
+
maxFileSize: boxWith(() => maxFileSize),
|
|
42
|
+
disabled: boxWith(() => disabled),
|
|
43
|
+
invalid: boxWith(() => invalid),
|
|
44
|
+
onFileAccept: boxWith(() => onFileAccept),
|
|
45
|
+
onFileReject: boxWith(() => onFileReject),
|
|
46
|
+
onFileChange: boxWith(() => onFileChange),
|
|
35
47
|
});
|
|
36
48
|
</script>
|
|
37
49
|
|
|
@@ -39,8 +51,8 @@
|
|
|
39
51
|
bind:this={ref}
|
|
40
52
|
class={cn(fileUploadPrimitiveRootStyles({ disabled }), className)}
|
|
41
53
|
data-slot="file-upload-root"
|
|
42
|
-
data-disabled={disabled
|
|
43
|
-
data-dragging={
|
|
54
|
+
data-disabled={boolAttr(disabled)}
|
|
55
|
+
data-dragging={boolAttr(state$.dragging)}
|
|
44
56
|
{...restProps}
|
|
45
57
|
>
|
|
46
58
|
{@render children?.()}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { FileUploadPrimitiveRootProps } from '../types.js';
|
|
2
|
-
declare const FileUpload: import("svelte").Component<FileUploadPrimitiveRootProps, {}, "ref">;
|
|
2
|
+
declare const FileUpload: import("svelte").Component<FileUploadPrimitiveRootProps, {}, "ref" | "acceptedFiles" | "rejectedFiles">;
|
|
3
3
|
type FileUpload = ReturnType<typeof FileUpload>;
|
|
4
4
|
export default FileUpload;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { RefAttachment } from '../../../internal/types/common.js';
|
|
1
2
|
import { Context } from 'runed';
|
|
2
|
-
import type
|
|
3
|
+
import { type ReadableBoxedValues, type WithRefProps, type WritableBoxedValues } from 'svelte-toolbelt';
|
|
3
4
|
import type { FileAcceptDetails, FileChangeDetails, FileRejectDetails, RejectedFile } from '../types.js';
|
|
4
5
|
export declare const FileUploadRootContext: Context<FileUploadRootState>;
|
|
5
6
|
type FileUploadRootStateOpts = ReadableBoxedValues<{
|
|
@@ -8,13 +9,17 @@ type FileUploadRootStateOpts = ReadableBoxedValues<{
|
|
|
8
9
|
maxFileSize: number;
|
|
9
10
|
disabled: boolean;
|
|
10
11
|
invalid: boolean;
|
|
12
|
+
onFileAccept: (details: FileAcceptDetails) => void;
|
|
13
|
+
onFileReject: (details: FileRejectDetails) => void;
|
|
14
|
+
onFileChange: (details: FileChangeDetails) => void;
|
|
15
|
+
}> & WritableBoxedValues<{
|
|
16
|
+
acceptedFiles: File[];
|
|
17
|
+
rejectedFiles: RejectedFile[];
|
|
11
18
|
}>;
|
|
12
19
|
export declare class FileUploadRootState {
|
|
20
|
+
#private;
|
|
13
21
|
static create(opts: FileUploadRootStateOpts): FileUploadRootState;
|
|
14
22
|
readonly opts: FileUploadRootStateOpts;
|
|
15
|
-
acceptedFiles: File[];
|
|
16
|
-
rejectedFiles: RejectedFile[];
|
|
17
|
-
dragging: boolean;
|
|
18
23
|
onFileAccept?: (details: FileAcceptDetails) => void;
|
|
19
24
|
onFileReject?: (details: FileRejectDetails) => void;
|
|
20
25
|
onFileChange?: (details: FileChangeDetails) => void;
|
|
@@ -27,6 +32,34 @@ export declare class FileUploadRootState {
|
|
|
27
32
|
clearFiles(): void;
|
|
28
33
|
private validateFile;
|
|
29
34
|
private matchesAccept;
|
|
35
|
+
get dragging(): boolean;
|
|
36
|
+
set dragging(value: boolean);
|
|
37
|
+
}
|
|
38
|
+
type FileUploadDropzoneStateOpts = WithRefProps<ReadableBoxedValues<{
|
|
39
|
+
disabledClick: boolean;
|
|
40
|
+
}>>;
|
|
41
|
+
export declare class FileUploadDropzoneState {
|
|
42
|
+
static create(opts: FileUploadDropzoneStateOpts): FileUploadDropzoneState;
|
|
43
|
+
readonly root$: FileUploadRootState;
|
|
44
|
+
readonly opts: FileUploadDropzoneStateOpts;
|
|
45
|
+
readonly attachment: RefAttachment;
|
|
46
|
+
constructor(opts: FileUploadDropzoneStateOpts, root$: FileUploadRootState);
|
|
47
|
+
onDragEnter(e: DragEvent): void;
|
|
48
|
+
onDragLeave(e: DragEvent): void;
|
|
49
|
+
onDragOver(e: DragEvent): void;
|
|
50
|
+
onDrop(e: DragEvent): void;
|
|
51
|
+
onClick(): void;
|
|
52
|
+
readonly props: {
|
|
53
|
+
readonly id: string;
|
|
54
|
+
readonly ondragenter: (e: DragEvent) => void;
|
|
55
|
+
readonly ondragleave: (e: DragEvent) => void;
|
|
56
|
+
readonly ondragover: (e: DragEvent) => void;
|
|
57
|
+
readonly ondrop: (e: DragEvent) => void;
|
|
58
|
+
readonly onclick: () => void;
|
|
59
|
+
readonly 'data-dragging': "" | undefined;
|
|
60
|
+
readonly 'data-slot': "file-upload-dropzone";
|
|
61
|
+
readonly role: "presentation";
|
|
62
|
+
};
|
|
30
63
|
}
|
|
31
64
|
export declare const FileUploadItemContext: Context<FileUploadItemState>;
|
|
32
65
|
type FileUploadItemStateOpts = ReadableBoxedValues<{
|
|
@@ -37,5 +70,43 @@ export declare class FileUploadItemState {
|
|
|
37
70
|
readonly opts: FileUploadItemStateOpts;
|
|
38
71
|
constructor(opts: FileUploadItemStateOpts);
|
|
39
72
|
}
|
|
73
|
+
export declare class FileUploadPreviewImageState {
|
|
74
|
+
#private;
|
|
75
|
+
static create(): FileUploadPreviewImageState;
|
|
76
|
+
readonly item$: FileUploadItemState;
|
|
77
|
+
constructor(item$: FileUploadItemState);
|
|
78
|
+
get imageUrl(): string | null;
|
|
79
|
+
set imageUrl(value: string | null);
|
|
80
|
+
}
|
|
81
|
+
type FileUploadDeleteTriggerStateOpts = WithRefProps<ReadableBoxedValues<{}>>;
|
|
82
|
+
export declare class FileUploadDeleteTriggerState {
|
|
83
|
+
static create(opts: FileUploadDeleteTriggerStateOpts): FileUploadDeleteTriggerState;
|
|
84
|
+
readonly root$: FileUploadRootState;
|
|
85
|
+
readonly item$: FileUploadItemState;
|
|
86
|
+
readonly opts: FileUploadDeleteTriggerStateOpts;
|
|
87
|
+
readonly attachment: RefAttachment;
|
|
88
|
+
constructor(opts: FileUploadDeleteTriggerStateOpts, root$: FileUploadRootState, item$: FileUploadItemState);
|
|
89
|
+
onClick(): void;
|
|
90
|
+
readonly props: {
|
|
91
|
+
readonly id: string;
|
|
92
|
+
readonly onclick: () => void;
|
|
93
|
+
readonly 'data-slot': "file-upload-delete-trigger";
|
|
94
|
+
readonly role: "presentation";
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
type FileUploadClearTriggerStateOpts = WithRefProps<ReadableBoxedValues<{}>>;
|
|
98
|
+
export declare class FileUploadClearTriggerState {
|
|
99
|
+
static create(opts: FileUploadClearTriggerStateOpts): FileUploadClearTriggerState;
|
|
100
|
+
readonly root$: FileUploadRootState;
|
|
101
|
+
readonly opts: FileUploadClearTriggerStateOpts;
|
|
102
|
+
readonly attachment: RefAttachment;
|
|
103
|
+
constructor(opts: FileUploadClearTriggerStateOpts, root$: FileUploadRootState);
|
|
104
|
+
onClick(): void;
|
|
105
|
+
readonly props: {
|
|
106
|
+
readonly id: string;
|
|
107
|
+
readonly onclick: () => void;
|
|
108
|
+
readonly 'data-slot': "file-upload-clear-trigger";
|
|
109
|
+
};
|
|
110
|
+
}
|
|
40
111
|
export declare function formatFileSize(bytes: number): string;
|
|
41
112
|
export {};
|
|
@@ -1,21 +1,27 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Context } from 'runed';
|
|
1
|
+
import { boolAttr } from '../../../internal/utils/attrs.js';
|
|
2
|
+
import { Context, watch } from 'runed';
|
|
3
|
+
import { attachRef } from 'svelte-toolbelt';
|
|
3
4
|
// --- Root State ---
|
|
4
|
-
export const FileUploadRootContext = new Context(
|
|
5
|
+
export const FileUploadRootContext = new Context('file-upload-root');
|
|
5
6
|
export class FileUploadRootState {
|
|
6
7
|
static create(opts) {
|
|
7
8
|
return FileUploadRootContext.set(new FileUploadRootState(opts));
|
|
8
9
|
}
|
|
9
10
|
opts;
|
|
10
|
-
|
|
11
|
-
rejectedFiles = $state([]);
|
|
12
|
-
dragging = $state(false);
|
|
11
|
+
#dragging = $state(false);
|
|
13
12
|
onFileAccept;
|
|
14
13
|
onFileReject;
|
|
15
14
|
onFileChange;
|
|
16
15
|
hiddenInputRef = null;
|
|
17
16
|
constructor(opts) {
|
|
18
17
|
this.opts = opts;
|
|
18
|
+
this.addFiles = this.addFiles.bind(this);
|
|
19
|
+
this.removeFile = this.removeFile.bind(this);
|
|
20
|
+
this.clearFiles = this.clearFiles.bind(this);
|
|
21
|
+
this.openFilePicker = this.openFilePicker.bind(this);
|
|
22
|
+
this.onFileAccept = opts.onFileAccept.current;
|
|
23
|
+
this.onFileReject = opts.onFileReject.current;
|
|
24
|
+
this.onFileChange = opts.onFileChange.current;
|
|
19
25
|
}
|
|
20
26
|
setHiddenInput(input) {
|
|
21
27
|
this.hiddenInputRef = input;
|
|
@@ -43,31 +49,34 @@ export class FileUploadRootState {
|
|
|
43
49
|
for (const file of overLimit) {
|
|
44
50
|
rejected.push({ file, errors: ['TOO_MANY_FILES'] });
|
|
45
51
|
}
|
|
46
|
-
this.
|
|
52
|
+
this.opts.acceptedFiles.current =
|
|
53
|
+
this.opts.acceptedFiles.current.length + incoming.length > maxFiles
|
|
54
|
+
? incoming
|
|
55
|
+
: [...this.opts.acceptedFiles.current, ...incoming];
|
|
47
56
|
this.onFileAccept?.({ files: incoming });
|
|
48
57
|
}
|
|
49
58
|
if (rejected.length > 0) {
|
|
50
|
-
this.rejectedFiles = [...this.rejectedFiles, ...rejected];
|
|
59
|
+
this.opts.rejectedFiles.current = [...this.opts.rejectedFiles.current, ...rejected];
|
|
51
60
|
this.onFileReject?.({ files: rejected });
|
|
52
61
|
}
|
|
53
62
|
this.onFileChange?.({
|
|
54
|
-
acceptedFiles: this.acceptedFiles,
|
|
55
|
-
rejectedFiles: this.rejectedFiles,
|
|
63
|
+
acceptedFiles: this.opts.acceptedFiles.current,
|
|
64
|
+
rejectedFiles: this.opts.rejectedFiles.current,
|
|
56
65
|
});
|
|
57
66
|
}
|
|
58
67
|
removeFile(file) {
|
|
59
|
-
this.acceptedFiles = this.acceptedFiles.filter((f) => f !== file);
|
|
68
|
+
this.opts.acceptedFiles.current = this.opts.acceptedFiles.current.filter((f) => f !== file);
|
|
60
69
|
this.onFileChange?.({
|
|
61
|
-
acceptedFiles: this.acceptedFiles,
|
|
62
|
-
rejectedFiles: this.rejectedFiles,
|
|
70
|
+
acceptedFiles: this.opts.acceptedFiles.current,
|
|
71
|
+
rejectedFiles: this.opts.rejectedFiles.current,
|
|
63
72
|
});
|
|
64
73
|
}
|
|
65
74
|
clearFiles() {
|
|
66
|
-
this.acceptedFiles = [];
|
|
67
|
-
this.rejectedFiles = [];
|
|
75
|
+
this.opts.acceptedFiles.current = [];
|
|
76
|
+
this.opts.rejectedFiles.current = [];
|
|
68
77
|
this.onFileChange?.({
|
|
69
|
-
acceptedFiles: this.acceptedFiles,
|
|
70
|
-
rejectedFiles: this.rejectedFiles,
|
|
78
|
+
acceptedFiles: this.opts.acceptedFiles.current,
|
|
79
|
+
rejectedFiles: this.opts.rejectedFiles.current,
|
|
71
80
|
});
|
|
72
81
|
}
|
|
73
82
|
validateFile(file) {
|
|
@@ -98,9 +107,73 @@ export class FileUploadRootState {
|
|
|
98
107
|
return file.type === token;
|
|
99
108
|
});
|
|
100
109
|
}
|
|
110
|
+
get dragging() {
|
|
111
|
+
return this.#dragging;
|
|
112
|
+
}
|
|
113
|
+
set dragging(value) {
|
|
114
|
+
this.#dragging = value;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
export class FileUploadDropzoneState {
|
|
118
|
+
static create(opts) {
|
|
119
|
+
return new FileUploadDropzoneState(opts, FileUploadRootContext.get());
|
|
120
|
+
}
|
|
121
|
+
root$;
|
|
122
|
+
opts;
|
|
123
|
+
attachment;
|
|
124
|
+
constructor(opts, root$) {
|
|
125
|
+
this.onDragEnter = this.onDragEnter.bind(this);
|
|
126
|
+
this.onDragLeave = this.onDragLeave.bind(this);
|
|
127
|
+
this.onDragOver = this.onDragOver.bind(this);
|
|
128
|
+
this.onDrop = this.onDrop.bind(this);
|
|
129
|
+
this.onClick = this.onClick.bind(this);
|
|
130
|
+
this.root$ = root$;
|
|
131
|
+
this.opts = opts;
|
|
132
|
+
this.attachment = attachRef(opts.ref);
|
|
133
|
+
}
|
|
134
|
+
onDragEnter(e) {
|
|
135
|
+
e.preventDefault();
|
|
136
|
+
e.stopPropagation();
|
|
137
|
+
this.root$.dragging = true;
|
|
138
|
+
}
|
|
139
|
+
onDragLeave(e) {
|
|
140
|
+
e.preventDefault();
|
|
141
|
+
e.stopPropagation();
|
|
142
|
+
this.root$.dragging = false;
|
|
143
|
+
}
|
|
144
|
+
onDragOver(e) {
|
|
145
|
+
e.preventDefault();
|
|
146
|
+
e.stopPropagation();
|
|
147
|
+
}
|
|
148
|
+
onDrop(e) {
|
|
149
|
+
e.preventDefault();
|
|
150
|
+
e.stopPropagation();
|
|
151
|
+
this.root$.dragging = false;
|
|
152
|
+
if (e.dataTransfer?.files) {
|
|
153
|
+
this.root$.addFiles(e.dataTransfer.files);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
onClick() {
|
|
157
|
+
if (this.opts.disabledClick.current) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
this.root$.openFilePicker();
|
|
161
|
+
}
|
|
162
|
+
props = $derived.by(() => ({
|
|
163
|
+
id: this.opts.id.current,
|
|
164
|
+
ondragenter: this.onDragEnter,
|
|
165
|
+
ondragleave: this.onDragLeave,
|
|
166
|
+
ondragover: this.onDragOver,
|
|
167
|
+
ondrop: this.onDrop,
|
|
168
|
+
onclick: this.onClick,
|
|
169
|
+
'data-dragging': boolAttr(this.root$.dragging),
|
|
170
|
+
'data-slot': 'file-upload-dropzone',
|
|
171
|
+
role: 'presentation',
|
|
172
|
+
...this.attachment,
|
|
173
|
+
}));
|
|
101
174
|
}
|
|
102
175
|
// --- Item State ---
|
|
103
|
-
export const FileUploadItemContext = new Context(
|
|
176
|
+
export const FileUploadItemContext = new Context('file-upload-item');
|
|
104
177
|
export class FileUploadItemState {
|
|
105
178
|
static create(opts) {
|
|
106
179
|
return FileUploadItemContext.set(new FileUploadItemState(opts));
|
|
@@ -110,6 +183,79 @@ export class FileUploadItemState {
|
|
|
110
183
|
this.opts = opts;
|
|
111
184
|
}
|
|
112
185
|
}
|
|
186
|
+
// -- Preview Image State --
|
|
187
|
+
export class FileUploadPreviewImageState {
|
|
188
|
+
static create() {
|
|
189
|
+
return new FileUploadPreviewImageState(FileUploadItemContext.get());
|
|
190
|
+
}
|
|
191
|
+
item$;
|
|
192
|
+
#imageUrl = $state(null);
|
|
193
|
+
constructor(item$) {
|
|
194
|
+
this.item$ = item$;
|
|
195
|
+
watch(() => this.item$.opts.file.current, (file) => {
|
|
196
|
+
const objectUrl = URL.createObjectURL(file);
|
|
197
|
+
this.imageUrl = objectUrl;
|
|
198
|
+
return () => {
|
|
199
|
+
URL.revokeObjectURL(objectUrl);
|
|
200
|
+
};
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
get imageUrl() {
|
|
204
|
+
return this.#imageUrl;
|
|
205
|
+
}
|
|
206
|
+
set imageUrl(value) {
|
|
207
|
+
this.#imageUrl = value;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
export class FileUploadDeleteTriggerState {
|
|
211
|
+
static create(opts) {
|
|
212
|
+
return new FileUploadDeleteTriggerState(opts, FileUploadRootContext.get(), FileUploadItemContext.get());
|
|
213
|
+
}
|
|
214
|
+
root$;
|
|
215
|
+
item$;
|
|
216
|
+
opts;
|
|
217
|
+
attachment;
|
|
218
|
+
constructor(opts, root$, item$) {
|
|
219
|
+
this.onClick = this.onClick.bind(this);
|
|
220
|
+
this.root$ = root$;
|
|
221
|
+
this.item$ = item$;
|
|
222
|
+
this.opts = opts;
|
|
223
|
+
this.attachment = attachRef(opts.ref);
|
|
224
|
+
}
|
|
225
|
+
onClick() {
|
|
226
|
+
this.root$.removeFile(this.item$.opts.file.current);
|
|
227
|
+
}
|
|
228
|
+
props = $derived.by(() => ({
|
|
229
|
+
id: this.opts.id.current,
|
|
230
|
+
onclick: this.onClick,
|
|
231
|
+
'data-slot': 'file-upload-delete-trigger',
|
|
232
|
+
role: 'presentation',
|
|
233
|
+
...this.attachment,
|
|
234
|
+
}));
|
|
235
|
+
}
|
|
236
|
+
export class FileUploadClearTriggerState {
|
|
237
|
+
static create(opts) {
|
|
238
|
+
return new FileUploadClearTriggerState(opts, FileUploadRootContext.get());
|
|
239
|
+
}
|
|
240
|
+
root$;
|
|
241
|
+
opts;
|
|
242
|
+
attachment;
|
|
243
|
+
constructor(opts, root$) {
|
|
244
|
+
this.onClick = this.onClick.bind(this);
|
|
245
|
+
this.root$ = root$;
|
|
246
|
+
this.opts = opts;
|
|
247
|
+
this.attachment = attachRef(opts.ref);
|
|
248
|
+
}
|
|
249
|
+
onClick() {
|
|
250
|
+
this.root$.clearFiles();
|
|
251
|
+
}
|
|
252
|
+
props = $derived.by(() => ({
|
|
253
|
+
id: this.opts.id.current,
|
|
254
|
+
onclick: this.onClick,
|
|
255
|
+
'data-slot': 'file-upload-clear-trigger',
|
|
256
|
+
...this.attachment,
|
|
257
|
+
}));
|
|
258
|
+
}
|
|
113
259
|
// --- Utils ---
|
|
114
260
|
export function formatFileSize(bytes) {
|
|
115
261
|
if (bytes < 1024)
|
|
@@ -9,7 +9,7 @@ export const fileUploadPrimitiveRootStyles = tv({
|
|
|
9
9
|
});
|
|
10
10
|
export const fileUploadPrimitiveDropzoneStyles = tv({
|
|
11
11
|
base: [
|
|
12
|
-
'cgui:flex cgui:flex-col cgui:items-center cgui:justify-center cgui:gap-2',
|
|
12
|
+
'cgui:flex cgui:flex-col cgui:items-center cgui:justify-center cgui:gap-2 cgui:p-4',
|
|
13
13
|
'cgui:rounded-md cgui:border cgui:border-dashed cgui:border-stroke-default',
|
|
14
14
|
'cgui:cursor-pointer',
|
|
15
15
|
'cgui:transition-colors cgui:duration-200',
|
|
@@ -43,7 +43,7 @@ export const fileUploadPrimitiveItemStyles = tv({
|
|
|
43
43
|
});
|
|
44
44
|
export const fileUploadPrimitiveItemPreviewStyles = tv({
|
|
45
45
|
base: [
|
|
46
|
-
'cgui:size-10 cgui:shrink-0 cgui:flex cgui:items-center cgui:justify-center cgui:overflow-hidden cgui:rounded-xs',
|
|
46
|
+
'cgui:size-10 cgui:shrink-0 cgui:flex cgui:items-center cgui:text-icon-regular cgui:[&>svg]:size-6 cgui:justify-center cgui:overflow-hidden cgui:rounded-xs',
|
|
47
47
|
],
|
|
48
48
|
});
|
|
49
49
|
export const fileUploadPrimitiveItemPreviewImageStyles = tv({
|
|
@@ -61,8 +61,9 @@ export const fileUploadPrimitiveItemDeleteTriggerStyles = tv({
|
|
|
61
61
|
'cgui:rounded-xs cgui:cursor-pointer',
|
|
62
62
|
'cgui:text-fg-regular cgui:hover:text-fg-darkest',
|
|
63
63
|
'cgui:transition-colors cgui:duration-200',
|
|
64
|
+
'cgui:[&>svg]:size-4 cgui:text-icon-regular',
|
|
64
65
|
],
|
|
65
66
|
});
|
|
66
67
|
export const fileUploadPrimitiveClearTriggerStyles = tv({
|
|
67
|
-
base: ['cgui:cursor-pointer'],
|
|
68
|
+
base: ['cgui:cursor-pointer cgui:[&>svg]:size-4 cgui:text-icon-regular'],
|
|
68
69
|
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Without } from '../../internal/types/common.js';
|
|
2
2
|
import type { WithVariants } from '../../internal/types/composition.js';
|
|
3
3
|
import type { PrimitiveButtonAttributes, PrimitiveDivAttributes, PrimitiveImgAttributes, PrimitiveInputAttributes, PrimitiveLiAttributes, PrimitiveUListAttributes } from '../../internal/types/html-attributes.js';
|
|
4
|
+
import type { Snippet } from 'svelte';
|
|
4
5
|
import type { WithChildren, WithElementRef } from 'svelte-toolbelt';
|
|
5
6
|
import type { FileUploadPrimitiveClearTriggerVariants, FileUploadPrimitiveDropzoneVariants, FileUploadPrimitiveItemDeleteTriggerVariants, FileUploadPrimitiveItemGroupVariants, FileUploadPrimitiveItemNameVariants, FileUploadPrimitiveItemPreviewImageVariants, FileUploadPrimitiveItemPreviewVariants, FileUploadPrimitiveItemSizeTextVariants, FileUploadPrimitiveItemVariants, FileUploadPrimitiveTriggerVariants } from './styles.js';
|
|
6
7
|
export type FileError = 'TOO_MANY_FILES' | 'FILE_INVALID_TYPE' | 'FILE_TOO_LARGE';
|
|
@@ -19,6 +20,8 @@ export type FileChangeDetails = {
|
|
|
19
20
|
rejectedFiles: RejectedFile[];
|
|
20
21
|
};
|
|
21
22
|
type FileUploadPrimitiveRootPropsWithoutHTML = WithElementRef<WithChildren<{
|
|
23
|
+
acceptedFiles?: File[];
|
|
24
|
+
rejectedFiles?: RejectedFile[];
|
|
22
25
|
accept?: string;
|
|
23
26
|
maxFiles?: number;
|
|
24
27
|
maxFileSize?: number;
|
|
@@ -58,16 +61,16 @@ export type FileUploadPrimitiveItemDeleteTriggerProps = FileUploadPrimitiveItemD
|
|
|
58
61
|
type FileUploadPrimitiveClearTriggerPropsWithoutHTML = WithVariants<WithElementRef<WithChildren<{}>>, FileUploadPrimitiveClearTriggerVariants>;
|
|
59
62
|
export type FileUploadPrimitiveClearTriggerProps = FileUploadPrimitiveClearTriggerPropsWithoutHTML & Without<PrimitiveButtonAttributes, FileUploadPrimitiveClearTriggerPropsWithoutHTML>;
|
|
60
63
|
export type FileUploadContext = {
|
|
61
|
-
readonly acceptedFiles: File[];
|
|
62
|
-
readonly rejectedFiles: RejectedFile[];
|
|
63
|
-
readonly dragging: boolean;
|
|
64
|
+
readonly acceptedFiles: () => File[];
|
|
65
|
+
readonly rejectedFiles: () => RejectedFile[];
|
|
66
|
+
readonly dragging: () => boolean;
|
|
64
67
|
addFiles(files: FileList | File[]): void;
|
|
65
68
|
removeFile(file: File): void;
|
|
66
69
|
clearFiles(): void;
|
|
67
70
|
openFilePicker(): void;
|
|
68
71
|
};
|
|
69
72
|
export type FileUploadPrimitiveContextProps = {
|
|
70
|
-
children?:
|
|
73
|
+
children?: Snippet<[FileUploadContext]>;
|
|
71
74
|
};
|
|
72
75
|
type FileUploadRootPropsWithoutHTML = WithElementRef<WithChildren<{
|
|
73
76
|
accept?: string;
|
|
@@ -16,6 +16,7 @@ export { default as Dots } from './dots.svelte';
|
|
|
16
16
|
export { default as Error } from './error.svelte';
|
|
17
17
|
export { default as EyeCrossed } from './eye-crossed.svelte';
|
|
18
18
|
export { default as Eye } from './eye.svelte';
|
|
19
|
+
export { default as File } from './file.svelte';
|
|
19
20
|
export { default as Info } from './info.svelte';
|
|
20
21
|
export { default as Magnifier } from './magnifier.svelte';
|
|
21
22
|
export { default as Minus } from './minus.svelte';
|
|
@@ -16,6 +16,7 @@ export { default as Dots } from './dots.svelte';
|
|
|
16
16
|
export { default as Error } from './error.svelte';
|
|
17
17
|
export { default as EyeCrossed } from './eye-crossed.svelte';
|
|
18
18
|
export { default as Eye } from './eye.svelte';
|
|
19
|
+
export { default as File } from './file.svelte';
|
|
19
20
|
export { default as Info } from './info.svelte';
|
|
20
21
|
export { default as Magnifier } from './magnifier.svelte';
|
|
21
22
|
export { default as Minus } from './minus.svelte';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
|
|
2
|
+
><path
|
|
3
|
+
fill="currentColor"
|
|
4
|
+
fill-rule="evenodd"
|
|
5
|
+
d="M12 2H6a3 3 0 0 0-3 3v14a3 3 0 0 0 3 3h12a3 3 0 0 0 3-3v-8h-6a3 3 0 0 1-3-3zm9 7v-.172a3 3 0 0 0-.879-2.12l-3.828-3.83A3 3 0 0 0 14.172 2H14v6a1 1 0 0 0 1 1z"
|
|
6
|
+
clip-rule="evenodd"
|
|
7
|
+
/></svg
|
|
8
|
+
>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export default File;
|
|
2
|
+
type File = SvelteComponent<{
|
|
3
|
+
[x: string]: never;
|
|
4
|
+
}, {
|
|
5
|
+
[evt: string]: CustomEvent<any>;
|
|
6
|
+
}, {}> & {
|
|
7
|
+
$$bindings?: string | undefined;
|
|
8
|
+
};
|
|
9
|
+
declare const File: $$__sveltets_2_IsomorphicComponent<{
|
|
10
|
+
[x: string]: never;
|
|
11
|
+
}, {
|
|
12
|
+
[evt: string]: CustomEvent<any>;
|
|
13
|
+
}, {}, {}, string>;
|
|
14
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
15
|
+
new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
|
|
16
|
+
$$bindings?: Bindings;
|
|
17
|
+
} & Exports;
|
|
18
|
+
(internal: unknown, props: {
|
|
19
|
+
$$events?: Events;
|
|
20
|
+
$$slots?: Slots;
|
|
21
|
+
}): Exports & {
|
|
22
|
+
$set?: any;
|
|
23
|
+
$on?: any;
|
|
24
|
+
};
|
|
25
|
+
z_$$bindings?: Bindings;
|
|
26
|
+
}
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { cn } from '../../../internal/utils/common.js';
|
|
3
3
|
import { Pagination as PaginationPrimitive } from 'bits-ui';
|
|
4
|
-
import {
|
|
4
|
+
import { paginationItemStyles } from '../styles.js';
|
|
5
5
|
import type { PaginationItemProps } from '../types.js';
|
|
6
|
+
import { PaginationRootContext } from './state.svelte.js';
|
|
6
7
|
|
|
7
|
-
let { page, class: className, ...props }: PaginationItemProps = $props();
|
|
8
|
+
let { page, class: className, size, ...props }: PaginationItemProps = $props();
|
|
8
9
|
|
|
9
|
-
const
|
|
10
|
+
const rootCtx$ = PaginationRootContext.get();
|
|
10
11
|
</script>
|
|
11
12
|
|
|
12
|
-
<PaginationPrimitive.Page
|
|
13
|
+
<PaginationPrimitive.Page
|
|
14
|
+
{page}
|
|
15
|
+
class={cn(paginationItemStyles({ size: size ?? rootCtx$.opts.size.current }), className)}
|
|
16
|
+
{...props}
|
|
17
|
+
/>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
declare const Pagination: import("svelte").Component<
|
|
1
|
+
import type { PaginationItemProps } from '../types.js';
|
|
2
|
+
declare const Pagination: import("svelte").Component<PaginationItemProps, {}, "">;
|
|
3
3
|
type Pagination = ReturnType<typeof Pagination>;
|
|
4
4
|
export default Pagination;
|
|
@@ -6,11 +6,9 @@
|
|
|
6
6
|
import type { PaginationNextButtonProps } from '../types.js';
|
|
7
7
|
|
|
8
8
|
let { class: className, children, ref = $bindable(null), ...props }: PaginationNextButtonProps = $props();
|
|
9
|
-
|
|
10
|
-
const classNames = $derived(cn(paginationButtonStyles(), className));
|
|
11
9
|
</script>
|
|
12
10
|
|
|
13
|
-
<PaginationPrimitive.NextButton bind:ref class={
|
|
11
|
+
<PaginationPrimitive.NextButton bind:ref class={cn(paginationButtonStyles(), className)} {...props}>
|
|
14
12
|
{#if children}
|
|
15
13
|
{@render children?.()}
|
|
16
14
|
{:else}
|
|
@@ -1,20 +1,31 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { cn } from '../../../internal/utils/common.js';
|
|
3
3
|
import { Pagination as PaginationPrimitive } from 'bits-ui';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { boxWith } from 'svelte-toolbelt';
|
|
5
|
+
import { paginationRootStyles } from '../styles.js';
|
|
6
6
|
import type { PaginationRootProps } from '../types.js';
|
|
7
|
+
import { PaginationRootState } from './state.svelte.js';
|
|
7
8
|
|
|
8
9
|
let {
|
|
9
10
|
page = $bindable(1),
|
|
10
11
|
orientation = 'horizontal',
|
|
11
12
|
size = 'md',
|
|
12
13
|
centered = false,
|
|
14
|
+
ref = $bindable(null),
|
|
13
15
|
class: className,
|
|
14
16
|
...restProps
|
|
15
17
|
}: PaginationRootProps = $props();
|
|
16
18
|
|
|
17
|
-
|
|
19
|
+
PaginationRootState.create({
|
|
20
|
+
size: boxWith(() => size),
|
|
21
|
+
orientation: boxWith(() => orientation),
|
|
22
|
+
centered: boxWith(() => centered),
|
|
23
|
+
});
|
|
18
24
|
</script>
|
|
19
25
|
|
|
20
|
-
<PaginationPrimitive.Root
|
|
26
|
+
<PaginationPrimitive.Root
|
|
27
|
+
bind:page
|
|
28
|
+
bind:ref
|
|
29
|
+
class={cn(paginationRootStyles({ size, orientation, centered }), className)}
|
|
30
|
+
{...restProps}
|
|
31
|
+
/>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { PaginationRootProps } from '../types.js';
|
|
2
|
-
declare const Pagination: import("svelte").Component<PaginationRootProps, {}, "page">;
|
|
2
|
+
declare const Pagination: import("svelte").Component<PaginationRootProps, {}, "ref" | "page">;
|
|
3
3
|
type Pagination = ReturnType<typeof Pagination>;
|
|
4
4
|
export default Pagination;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Context } from 'runed';
|
|
2
|
+
import type { ReadableBoxedValues } from 'svelte-toolbelt';
|
|
3
|
+
import type { PaginationRootProps } from '../types.js';
|
|
4
|
+
export declare const PaginationRootContext: Context<PaginationRootState>;
|
|
5
|
+
type PaginationRootStateOpts = ReadableBoxedValues<{
|
|
6
|
+
size: PaginationRootProps['size'];
|
|
7
|
+
orientation: PaginationRootProps['orientation'];
|
|
8
|
+
centered: PaginationRootProps['centered'];
|
|
9
|
+
}>;
|
|
10
|
+
export declare class PaginationRootState {
|
|
11
|
+
static create(opts: PaginationRootStateOpts): PaginationRootState;
|
|
12
|
+
readonly opts: PaginationRootStateOpts;
|
|
13
|
+
constructor(opts: PaginationRootStateOpts);
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Context } from 'runed';
|
|
2
|
+
export const PaginationRootContext = new Context('pagination-root');
|
|
3
|
+
export class PaginationRootState {
|
|
4
|
+
static create(opts) {
|
|
5
|
+
return PaginationRootContext.set(new PaginationRootState(opts));
|
|
6
|
+
}
|
|
7
|
+
opts;
|
|
8
|
+
constructor(opts) {
|
|
9
|
+
this.opts = opts;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import { cn } from '../../../../internal/utils/common.js';
|
|
2
3
|
import * as PaginationPrimitive from '../../components/index.js';
|
|
3
4
|
import type { PaginationProps } from '../../types.js';
|
|
4
5
|
|
|
5
6
|
let {
|
|
6
7
|
page = $bindable(1),
|
|
7
|
-
perPage = 10,
|
|
8
|
+
perPage = $bindable(10),
|
|
9
|
+
orientation = 'horizontal',
|
|
8
10
|
perPageItems = [10, 20, 50, 100],
|
|
9
11
|
hidePageSize = false,
|
|
10
12
|
...restProps
|
|
11
13
|
}: PaginationProps = $props();
|
|
12
14
|
</script>
|
|
13
15
|
|
|
14
|
-
<PaginationPrimitive.Root bind:page {...restProps}>
|
|
16
|
+
<PaginationPrimitive.Root bind:page {orientation} {...restProps}>
|
|
15
17
|
{#snippet children({ pages })}
|
|
16
18
|
{#if !hidePageSize}
|
|
17
19
|
<PaginationPrimitive.PageSize bind:perPage {perPageItems} />
|
|
18
20
|
{/if}
|
|
19
21
|
|
|
20
|
-
<div
|
|
22
|
+
<div
|
|
23
|
+
class={cn('cgui:flex cgui:items-center cgui:justify-center cgui:gap-1 cgui:flex-1', {
|
|
24
|
+
'cgui:flex-col': orientation === 'vertical',
|
|
25
|
+
})}
|
|
26
|
+
>
|
|
21
27
|
<PaginationPrimitive.PrevButton />
|
|
22
28
|
|
|
23
29
|
{#each pages as page (page.key)}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { PaginationProps } from '../../types.js';
|
|
2
|
-
declare const Pagination: import("svelte").Component<PaginationProps, {}, "page">;
|
|
2
|
+
declare const Pagination: import("svelte").Component<PaginationProps, {}, "page" | "perPage">;
|
|
3
3
|
type Pagination = ReturnType<typeof Pagination>;
|
|
4
4
|
export default Pagination;
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import { Context } from 'runed';
|
|
2
|
-
import type { ReadableBox } from 'svelte-toolbelt';
|
|
3
1
|
import type { VariantProps } from 'tailwind-variants';
|
|
4
2
|
export declare const paginationRootStyles: import("tailwind-variants").TVReturnType<{
|
|
5
3
|
centered: {
|
|
6
4
|
true: string;
|
|
7
5
|
};
|
|
6
|
+
size: {
|
|
7
|
+
sm: string[];
|
|
8
|
+
md: string[];
|
|
9
|
+
lg: string[];
|
|
10
|
+
};
|
|
8
11
|
orientation: {
|
|
9
12
|
horizontal: string;
|
|
10
13
|
vertical: string;
|
|
@@ -13,6 +16,11 @@ export declare const paginationRootStyles: import("tailwind-variants").TVReturnT
|
|
|
13
16
|
centered: {
|
|
14
17
|
true: string;
|
|
15
18
|
};
|
|
19
|
+
size: {
|
|
20
|
+
sm: string[];
|
|
21
|
+
md: string[];
|
|
22
|
+
lg: string[];
|
|
23
|
+
};
|
|
16
24
|
orientation: {
|
|
17
25
|
horizontal: string;
|
|
18
26
|
vertical: string;
|
|
@@ -21,6 +29,11 @@ export declare const paginationRootStyles: import("tailwind-variants").TVReturnT
|
|
|
21
29
|
centered: {
|
|
22
30
|
true: string;
|
|
23
31
|
};
|
|
32
|
+
size: {
|
|
33
|
+
sm: string[];
|
|
34
|
+
md: string[];
|
|
35
|
+
lg: string[];
|
|
36
|
+
};
|
|
24
37
|
orientation: {
|
|
25
38
|
horizontal: string;
|
|
26
39
|
vertical: string;
|
|
@@ -28,21 +41,21 @@ export declare const paginationRootStyles: import("tailwind-variants").TVReturnT
|
|
|
28
41
|
}, undefined, string[], unknown, unknown, undefined>>;
|
|
29
42
|
export declare const paginationItemStyles: import("tailwind-variants").TVReturnType<{
|
|
30
43
|
size: {
|
|
31
|
-
sm: string;
|
|
32
|
-
md: string;
|
|
33
|
-
lg: string;
|
|
44
|
+
sm: string[];
|
|
45
|
+
md: string[];
|
|
46
|
+
lg: string[];
|
|
34
47
|
};
|
|
35
48
|
}, undefined, string[], {
|
|
36
49
|
size: {
|
|
37
|
-
sm: string;
|
|
38
|
-
md: string;
|
|
39
|
-
lg: string;
|
|
50
|
+
sm: string[];
|
|
51
|
+
md: string[];
|
|
52
|
+
lg: string[];
|
|
40
53
|
};
|
|
41
54
|
}, undefined, import("tailwind-variants").TVReturnType<{
|
|
42
55
|
size: {
|
|
43
|
-
sm: string;
|
|
44
|
-
md: string;
|
|
45
|
-
lg: string;
|
|
56
|
+
sm: string[];
|
|
57
|
+
md: string[];
|
|
58
|
+
lg: string[];
|
|
46
59
|
};
|
|
47
60
|
}, undefined, string[], unknown, unknown, undefined>>;
|
|
48
61
|
export declare const paginationButtonStyles: import("tailwind-variants").TVReturnType<{} | {} | {}, undefined, string[], {} | {}, undefined, import("tailwind-variants").TVReturnType<unknown, undefined, string[], unknown, unknown, undefined>>;
|
|
@@ -52,8 +65,3 @@ export type PaginationItemVariants = VariantProps<typeof paginationItemStyles>;
|
|
|
52
65
|
export type PaginationButtonVariants = VariantProps<typeof paginationButtonStyles>;
|
|
53
66
|
export type PaginationEllipsisVariants = VariantProps<typeof paginationEllipsisStyles>;
|
|
54
67
|
export type PaginationVariantsProps = PaginationRootVariants & PaginationItemVariants;
|
|
55
|
-
type PaginationContextValues = ReadableBox<{
|
|
56
|
-
size: PaginationItemVariants['size'];
|
|
57
|
-
}>;
|
|
58
|
-
export declare const PaginationContext: Context<PaginationContextValues>;
|
|
59
|
-
export {};
|
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
import { keyWithPrefix } from '../../internal/utils/common.js';
|
|
2
1
|
import { tv } from '../../internal/utils/tailwindcss.js';
|
|
3
|
-
|
|
2
|
+
const PaginationSizes = ['sm', 'md', 'lg'];
|
|
3
|
+
const PaginationOrientations = ['horizontal', 'vertical'];
|
|
4
4
|
export const paginationRootStyles = tv({
|
|
5
5
|
base: ['cgui:flex cgui:items-center cgui:gap-1'],
|
|
6
6
|
variants: {
|
|
7
7
|
centered: {
|
|
8
8
|
true: 'cgui:justify-center',
|
|
9
9
|
},
|
|
10
|
+
size: {
|
|
11
|
+
sm: [''],
|
|
12
|
+
md: [''],
|
|
13
|
+
lg: [''],
|
|
14
|
+
},
|
|
10
15
|
orientation: {
|
|
11
16
|
horizontal: 'cgui:flex-row',
|
|
12
17
|
vertical: 'cgui:flex-col',
|
|
@@ -25,9 +30,9 @@ export const paginationItemStyles = tv({
|
|
|
25
30
|
],
|
|
26
31
|
variants: {
|
|
27
32
|
size: {
|
|
28
|
-
sm: 'cgui:min-w-6 cgui:min-h-6 cgui:px-1',
|
|
29
|
-
md: 'cgui:min-w-8 cgui:min-h-8 cgui:px-1',
|
|
30
|
-
lg: 'cgui:min-w-10 cgui:min-h-10 cgui:px-1',
|
|
33
|
+
sm: ['cgui:min-w-6 cgui:min-h-6 cgui:px-1'],
|
|
34
|
+
md: ['cgui:min-w-8 cgui:min-h-8 cgui:px-1'],
|
|
35
|
+
lg: ['cgui:min-w-10 cgui:min-h-10 cgui:px-1'],
|
|
31
36
|
},
|
|
32
37
|
},
|
|
33
38
|
});
|
|
@@ -42,4 +47,3 @@ export const paginationButtonStyles = tv({
|
|
|
42
47
|
export const paginationEllipsisStyles = tv({
|
|
43
48
|
base: ['cgui:flex cgui:items-center cgui:justify-center cgui:shrink-0 cgui:size-6 cgui:text-icon-regular'],
|
|
44
49
|
});
|
|
45
|
-
export const PaginationContext = new Context(keyWithPrefix('pagination'));
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type { SelectContentProps } from '../select/types.js';
|
|
2
|
+
import type { WithVariants } from '../../internal/types/composition.js';
|
|
2
3
|
import type { PrimitiveDivAttributes } from '../../internal/types/html-attributes.js';
|
|
3
4
|
import { type PaginationNextButtonProps as PaginationNextButtonPropsPrimitive, type PaginationPageProps as PaginationPagePropsPrimitive, type PaginationPrevButtonProps as PaginationPrevButtonPropsPrimitive, type PaginationRootProps as PaginationRootPropsPrimitive } from 'bits-ui';
|
|
4
5
|
import type { WithChild, WithElementRef } from 'svelte-toolbelt';
|
|
5
|
-
import type { PaginationVariantsProps } from './styles.js';
|
|
6
|
-
export type PaginationRootProps = PaginationRootPropsPrimitive
|
|
6
|
+
import type { PaginationItemVariants, PaginationVariantsProps } from './styles.js';
|
|
7
|
+
export type PaginationRootProps = WithVariants<PaginationRootPropsPrimitive, PaginationVariantsProps>;
|
|
7
8
|
export type PaginationEllipsisProps = WithChild<WithElementRef<{} & PrimitiveDivAttributes>>;
|
|
8
|
-
export type PaginationItemProps = PaginationPagePropsPrimitive
|
|
9
|
+
export type PaginationItemProps = WithVariants<PaginationPagePropsPrimitive, PaginationItemVariants>;
|
|
9
10
|
export type PaginationNextButtonProps = PaginationNextButtonPropsPrimitive;
|
|
10
11
|
export type PaginationPrevButtonProps = PaginationPrevButtonPropsPrimitive;
|
|
11
12
|
export type PaginationPageSizeProps = {
|