spaper 1.4.0 → 2.0.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.
- package/README.md +20 -59
- package/dist/components/Alert.svelte +83 -0
- package/dist/components/Alert.svelte.d.ts +15 -0
- package/dist/components/Article.svelte +63 -0
- package/dist/components/Article.svelte.d.ts +17 -0
- package/dist/components/Avatar/Avatar.svelte +102 -0
- package/dist/components/Avatar/Avatar.svelte.d.ts +16 -0
- package/dist/components/Avatar/AvatarGroup.svelte +21 -0
- package/dist/components/Avatar/AvatarGroup.svelte.d.ts +9 -0
- package/dist/components/Avatar/index.d.ts +2 -0
- package/dist/components/Avatar/index.js +2 -0
- package/dist/components/Breadcrumb.svelte +33 -0
- package/dist/components/Breadcrumb.svelte.d.ts +12 -0
- package/dist/components/Button.svelte +174 -0
- package/dist/components/Button.svelte.d.ts +33 -0
- package/dist/components/Card.svelte +101 -0
- package/dist/components/Card.svelte.d.ts +22 -0
- package/dist/components/Carousel/Carousel.svelte +204 -0
- package/dist/components/Carousel/Carousel.svelte.d.ts +27 -0
- package/dist/components/Carousel/CarouselItem.svelte +48 -0
- package/dist/components/Carousel/CarouselItem.svelte.d.ts +7 -0
- package/{components → dist/components}/Carousel/index.d.ts +1 -0
- package/dist/components/Carousel/types.d.ts +22 -0
- package/dist/components/CloseButton.svelte +34 -0
- package/dist/components/CloseButton.svelte.d.ts +8 -0
- package/dist/components/Collapsible.svelte +64 -0
- package/dist/components/Collapsible.svelte.d.ts +16 -0
- package/dist/components/CopyButton.svelte +54 -0
- package/dist/components/CopyButton.svelte.d.ts +13 -0
- package/dist/components/Divider.svelte +9 -0
- package/dist/components/Divider.svelte.d.ts +6 -0
- package/dist/components/Form/Checkbox.svelte +54 -0
- package/dist/components/Form/Checkbox.svelte.d.ts +15 -0
- package/dist/components/Form/Input.svelte +105 -0
- package/dist/components/Form/Input.svelte.d.ts +21 -0
- package/dist/components/Form/NumberInput/DecrementButton.svelte +14 -0
- package/dist/components/Form/NumberInput/DecrementButton.svelte.d.ts +9 -0
- package/dist/components/Form/NumberInput/IncrementButton.svelte +14 -0
- package/dist/components/Form/NumberInput/IncrementButton.svelte.d.ts +9 -0
- package/dist/components/Form/NumberInput/NumberInput.svelte +227 -0
- package/dist/components/Form/NumberInput/NumberInput.svelte.d.ts +34 -0
- package/dist/components/Form/Radio.svelte +42 -0
- package/dist/components/Form/Radio.svelte.d.ts +13 -0
- package/dist/components/Form/Select.svelte +61 -0
- package/dist/components/Form/Select.svelte.d.ts +12 -0
- package/dist/components/Form/Slider.svelte +129 -0
- package/dist/components/Form/Slider.svelte.d.ts +22 -0
- package/dist/components/Form/Switch.svelte +101 -0
- package/dist/components/Form/Switch.svelte.d.ts +22 -0
- package/dist/components/Form/index.d.ts +9 -0
- package/{components → dist/components}/Form/index.js +1 -2
- package/dist/components/Hero.svelte +78 -0
- package/dist/components/Hero.svelte.d.ts +17 -0
- package/dist/components/Icon.svelte +102 -0
- package/dist/components/Icon.svelte.d.ts +27 -0
- package/dist/components/Modal/Modal.svelte +120 -0
- package/dist/components/Modal/Modal.svelte.d.ts +19 -0
- package/dist/components/Modal/index.d.ts +12 -0
- package/dist/components/Modal/index.js +30 -0
- package/dist/components/Navbar.svelte +98 -0
- package/dist/components/Navbar.svelte.d.ts +11 -0
- package/dist/components/Pagination/Arrow.svelte +29 -0
- package/dist/components/Pagination/Arrow.svelte.d.ts +8 -0
- package/dist/components/Pagination/NavigationButton.svelte +33 -0
- package/dist/components/Pagination/NavigationButton.svelte.d.ts +13 -0
- package/dist/components/Pagination/Pagination.svelte +209 -0
- package/dist/components/Pagination/Pagination.svelte.d.ts +32 -0
- package/{components → dist/components}/Pagination/arrow-dimension.js +3 -3
- package/{components → dist/components}/Pagination/index.d.ts +1 -1
- package/dist/components/Popover.svelte +64 -0
- package/dist/components/Popover.svelte.d.ts +17 -0
- package/dist/components/Progress.svelte +87 -0
- package/dist/components/Progress.svelte.d.ts +19 -0
- package/dist/components/ScrollTop.svelte +79 -0
- package/dist/components/ScrollTop.svelte.d.ts +17 -0
- package/dist/components/Skeleton.svelte +104 -0
- package/dist/components/Skeleton.svelte.d.ts +21 -0
- package/dist/components/Spinner.svelte +59 -0
- package/dist/components/Spinner.svelte.d.ts +16 -0
- package/dist/components/Table/Table.svelte +292 -0
- package/dist/components/Table/Table.svelte.d.ts +25 -0
- package/dist/components/Table/TableColumn.svelte +62 -0
- package/dist/components/Table/TableColumn.svelte.d.ts +15 -0
- package/dist/components/Table/context.d.ts +13 -0
- package/dist/components/Table/context.js +1 -0
- package/dist/components/Table/index.d.ts +2 -0
- package/dist/components/Table/index.js +2 -0
- package/dist/components/Tabs/Tab.svelte +90 -0
- package/dist/components/Tabs/Tab.svelte.d.ts +14 -0
- package/dist/components/Tabs/Tabs.svelte +138 -0
- package/dist/components/Tabs/Tabs.svelte.d.ts +13 -0
- package/{components → dist/components}/Tabs/utils.d.ts +4 -3
- package/dist/components/Tag.svelte +38 -0
- package/dist/components/Tag.svelte.d.ts +10 -0
- package/dist/components/Toast/Toast.svelte +105 -0
- package/dist/components/Toast/Toast.svelte.d.ts +6 -0
- package/dist/components/Toast/ToastContainer.svelte +101 -0
- package/dist/components/Toast/ToastContainer.svelte.d.ts +8 -0
- package/{components → dist/components}/Toast/index.d.ts +19 -5
- package/dist/components/Toast/index.js +100 -0
- package/dist/icons.d.ts +3 -0
- package/dist/icons.js +2 -0
- package/dist/index.d.ts +31 -0
- package/{index.js → dist/index.js} +10 -5
- package/dist/type-icons.d.ts +4 -0
- package/dist/type-icons.js +9 -0
- package/dist/types.d.ts +29 -0
- package/dist/utils.d.ts +16 -0
- package/dist/utils.js +44 -0
- package/package.json +70 -68
- package/components/Alert.svelte +0 -34
- package/components/Alert.svelte.d.ts +0 -21
- package/components/Article.svelte +0 -39
- package/components/Article.svelte.d.ts +0 -26
- package/components/Badge.svelte +0 -16
- package/components/Badge.svelte.d.ts +0 -20
- package/components/Breadcrumb.svelte +0 -17
- package/components/Breadcrumb.svelte.d.ts +0 -21
- package/components/Button.svelte +0 -41
- package/components/Button.svelte.d.ts +0 -30
- package/components/Card.svelte +0 -70
- package/components/Card.svelte.d.ts +0 -32
- package/components/Carousel/Carousel.svelte +0 -128
- package/components/Carousel/Carousel.svelte.d.ts +0 -35
- package/components/Carousel/CarouselItem.svelte +0 -32
- package/components/Carousel/CarouselItem.svelte.d.ts +0 -18
- package/components/Carousel/types.d.ts +0 -14
- package/components/CloseButton.svelte +0 -23
- package/components/CloseButton.svelte.d.ts +0 -19
- package/components/Collapsible.svelte +0 -49
- package/components/Collapsible.svelte.d.ts +0 -21
- package/components/CopyButton.svelte +0 -43
- package/components/CopyButton.svelte.d.ts +0 -24
- package/components/Form/Checkbox.svelte +0 -37
- package/components/Form/Checkbox.svelte.d.ts +0 -26
- package/components/Form/Form.svelte +0 -22
- package/components/Form/Form.svelte.d.ts +0 -26
- package/components/Form/Input.svelte +0 -67
- package/components/Form/Input.svelte.d.ts +0 -28
- package/components/Form/NumberInput/DecrementButton.svelte +0 -9
- package/components/Form/NumberInput/DecrementButton.svelte.d.ts +0 -19
- package/components/Form/NumberInput/IncrementButton.svelte +0 -9
- package/components/Form/NumberInput/IncrementButton.svelte.d.ts +0 -19
- package/components/Form/NumberInput/NumberInput.svelte +0 -129
- package/components/Form/NumberInput/NumberInput.svelte.d.ts +0 -36
- package/components/Form/Radio.svelte +0 -26
- package/components/Form/Radio.svelte.d.ts +0 -25
- package/components/Form/Select.svelte +0 -40
- package/components/Form/Select.svelte.d.ts +0 -24
- package/components/Form/Slider.svelte +0 -124
- package/components/Form/Slider.svelte.d.ts +0 -30
- package/components/Form/Switch.svelte +0 -71
- package/components/Form/index.d.ts +0 -10
- package/components/Form/style.scss +0 -4
- package/components/Hero.svelte +0 -78
- package/components/Hero.svelte.d.ts +0 -26
- package/components/Layout/Col.svelte +0 -25
- package/components/Layout/Col.svelte.d.ts +0 -27
- package/components/Layout/Row.svelte +0 -24
- package/components/Layout/Row.svelte.d.ts +0 -26
- package/components/Layout/index.d.ts +0 -2
- package/components/Layout/index.js +0 -2
- package/components/Modal/Modal.svelte +0 -62
- package/components/Modal/Modal.svelte.d.ts +0 -28
- package/components/Modal/index.d.ts +0 -13
- package/components/Modal/index.js +0 -17
- package/components/Navbar.svelte +0 -40
- package/components/Navbar.svelte.d.ts +0 -22
- package/components/Pagination/Arrow.svelte +0 -17
- package/components/Pagination/Arrow.svelte.d.ts +0 -19
- package/components/Pagination/NavigationButton.svelte +0 -23
- package/components/Pagination/NavigationButton.svelte.d.ts +0 -23
- package/components/Pagination/Pagination.svelte +0 -137
- package/components/Pagination/Pagination.svelte.d.ts +0 -36
- package/components/Popover.svelte +0 -62
- package/components/Popover.svelte.d.ts +0 -25
- package/components/Progress.svelte +0 -39
- package/components/Progress.svelte.d.ts +0 -25
- package/components/Skeleton.svelte +0 -55
- package/components/Skeleton.svelte.d.ts +0 -22
- package/components/Table.svelte +0 -73
- package/components/Table.svelte.d.ts +0 -24
- package/components/Tabs/Tab.svelte +0 -52
- package/components/Tabs/Tab.svelte.d.ts +0 -20
- package/components/Tabs/Tabs.svelte +0 -90
- package/components/Tabs/Tabs.svelte.d.ts +0 -25
- package/components/Toast/Toast.svelte +0 -91
- package/components/Toast/Toast.svelte.d.ts +0 -26
- package/components/Toast/ToastContainer.svelte +0 -37
- package/components/Toast/ToastContainer.svelte.d.ts +0 -18
- package/components/Toast/index.js +0 -37
- package/index.d.ts +0 -23
- package/types.d.ts +0 -16
- package/utils.d.ts +0 -16
- package/utils.js +0 -34
- /package/{components → dist/components}/Carousel/index.js +0 -0
- /package/{components → dist/components}/Carousel/types.js +0 -0
- /package/{components → dist/components}/Form/NumberInput/index.d.ts +0 -0
- /package/{components → dist/components}/Form/NumberInput/index.js +0 -0
- /package/{components → dist/components}/Pagination/arrow-dimension.d.ts +0 -0
- /package/{components → dist/components}/Pagination/index.js +0 -0
- /package/{components → dist/components}/Tabs/index.d.ts +0 -0
- /package/{components → dist/components}/Tabs/index.js +0 -0
- /package/{components → dist/components}/Tabs/utils.js +0 -0
- /package/{components → dist/components}/style.scss +0 -0
- /package/{types.js → dist/types.js} +0 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { PaperSize, PaperType } from '../types';
|
|
2
|
+
import type { IconNode } from '../icons';
|
|
3
|
+
interface Props {
|
|
4
|
+
type?: PaperType | null;
|
|
5
|
+
/** Icon shown to the left of the label. */
|
|
6
|
+
icon?: IconNode | null;
|
|
7
|
+
size?: PaperSize;
|
|
8
|
+
block?: boolean;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
loading?: boolean;
|
|
11
|
+
outline?: PaperType | null;
|
|
12
|
+
/**
|
|
13
|
+
* The `type` attribute for `<button>`. Useful for forms.
|
|
14
|
+
* Ignored if rendered as a link.
|
|
15
|
+
*/
|
|
16
|
+
nativeType?: 'submit' | 'reset' | 'button' | null;
|
|
17
|
+
/** When true, the button is rendered as an `<a>` element. */
|
|
18
|
+
isLink?: boolean;
|
|
19
|
+
href?: string | null;
|
|
20
|
+
/** When true and `isLink` is set,
|
|
21
|
+
* adds `target="_blank"` and `rel="noopener noreferrer"`
|
|
22
|
+
* to the link for external navigation.
|
|
23
|
+
*/
|
|
24
|
+
external?: boolean;
|
|
25
|
+
onclick?: (e: MouseEvent) => void;
|
|
26
|
+
children?: import('svelte').Snippet;
|
|
27
|
+
/** Replaces the default spinner while `loading` is set. */
|
|
28
|
+
loader?: import('svelte').Snippet;
|
|
29
|
+
[key: string]: any;
|
|
30
|
+
}
|
|
31
|
+
declare const Button: import("svelte").Component<Props, {}, "">;
|
|
32
|
+
type Button = ReturnType<typeof Button>;
|
|
33
|
+
export default Button;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte'
|
|
3
|
+
import type { PositionY, StringOrSnippet } from '../types'
|
|
4
|
+
import { isSnippet } from '../utils'
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
title?: StringOrSnippet
|
|
8
|
+
subTitle?: StringOrSnippet
|
|
9
|
+
image?: string
|
|
10
|
+
imageAlt?: string
|
|
11
|
+
imagePlacement?: PositionY
|
|
12
|
+
header?: StringOrSnippet
|
|
13
|
+
footer?: StringOrSnippet
|
|
14
|
+
/** @deprecated Use a width class, e.g. `class="w-1/2"`. */
|
|
15
|
+
width?: string
|
|
16
|
+
/** Root element. */
|
|
17
|
+
as?: keyof HTMLElementTagNameMap
|
|
18
|
+
children?: Snippet
|
|
19
|
+
bottom?: Snippet
|
|
20
|
+
class?: string
|
|
21
|
+
[key: string]: unknown
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
let {
|
|
25
|
+
title = '',
|
|
26
|
+
subTitle = '',
|
|
27
|
+
image = '',
|
|
28
|
+
imageAlt = '',
|
|
29
|
+
imagePlacement = 'top',
|
|
30
|
+
header = '',
|
|
31
|
+
footer = '',
|
|
32
|
+
width,
|
|
33
|
+
as = 'article',
|
|
34
|
+
children,
|
|
35
|
+
bottom,
|
|
36
|
+
class: className = '',
|
|
37
|
+
...rest
|
|
38
|
+
}: Props = $props()
|
|
39
|
+
|
|
40
|
+
const showImage = $derived(Boolean(image))
|
|
41
|
+
</script>
|
|
42
|
+
|
|
43
|
+
<svelte:element
|
|
44
|
+
this={as}
|
|
45
|
+
{...rest}
|
|
46
|
+
class={['card-paper', className]}
|
|
47
|
+
{...width ? { style: `width: ${width}` } : {}}
|
|
48
|
+
>
|
|
49
|
+
{#if header}
|
|
50
|
+
<header class="card-paper-header">
|
|
51
|
+
{#if isSnippet(header)}
|
|
52
|
+
{@render header()}
|
|
53
|
+
{:else}
|
|
54
|
+
{header}
|
|
55
|
+
{/if}
|
|
56
|
+
</header>
|
|
57
|
+
{/if}
|
|
58
|
+
|
|
59
|
+
{#if showImage && imagePlacement === 'top'}
|
|
60
|
+
<img class="w-full object-cover" src={image} alt={imageAlt} />
|
|
61
|
+
{/if}
|
|
62
|
+
|
|
63
|
+
<div class="card-paper-body">
|
|
64
|
+
<h4 class="card-paper-title">
|
|
65
|
+
{#if isSnippet(title)}
|
|
66
|
+
{@render title()}
|
|
67
|
+
{:else}
|
|
68
|
+
{title}
|
|
69
|
+
{/if}
|
|
70
|
+
</h4>
|
|
71
|
+
<h5 class="card-paper-subtitle">
|
|
72
|
+
{#if isSnippet(subTitle)}
|
|
73
|
+
{@render subTitle()}
|
|
74
|
+
{:else}
|
|
75
|
+
{subTitle}
|
|
76
|
+
{/if}
|
|
77
|
+
</h5>
|
|
78
|
+
|
|
79
|
+
<p class="card-text">
|
|
80
|
+
{@render children?.()}
|
|
81
|
+
</p>
|
|
82
|
+
|
|
83
|
+
{#if bottom}
|
|
84
|
+
{@render bottom()}
|
|
85
|
+
{/if}
|
|
86
|
+
</div>
|
|
87
|
+
|
|
88
|
+
{#if showImage && imagePlacement === 'bottom'}
|
|
89
|
+
<img class="image-bottom w-full object-cover" src={image} alt={imageAlt} />
|
|
90
|
+
{/if}
|
|
91
|
+
|
|
92
|
+
{#if footer}
|
|
93
|
+
<footer class="card-paper-footer">
|
|
94
|
+
{#if isSnippet(footer)}
|
|
95
|
+
{@render footer()}
|
|
96
|
+
{:else}
|
|
97
|
+
{footer}
|
|
98
|
+
{/if}
|
|
99
|
+
</footer>
|
|
100
|
+
{/if}
|
|
101
|
+
</svelte:element>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { PositionY, StringOrSnippet } from '../types';
|
|
3
|
+
interface Props {
|
|
4
|
+
title?: StringOrSnippet;
|
|
5
|
+
subTitle?: StringOrSnippet;
|
|
6
|
+
image?: string;
|
|
7
|
+
imageAlt?: string;
|
|
8
|
+
imagePlacement?: PositionY;
|
|
9
|
+
header?: StringOrSnippet;
|
|
10
|
+
footer?: StringOrSnippet;
|
|
11
|
+
/** @deprecated Use a width class, e.g. `class="w-1/2"`. */
|
|
12
|
+
width?: string;
|
|
13
|
+
/** Root element. */
|
|
14
|
+
as?: keyof HTMLElementTagNameMap;
|
|
15
|
+
children?: Snippet;
|
|
16
|
+
bottom?: Snippet;
|
|
17
|
+
class?: string;
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
declare const Card: import("svelte").Component<Props, {}, "">;
|
|
21
|
+
type Card = ReturnType<typeof Card>;
|
|
22
|
+
export default Card;
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount, setContext } from 'svelte'
|
|
3
|
+
import { writable } from 'svelte/store'
|
|
4
|
+
import type { Transition } from '../../types'
|
|
5
|
+
import type {
|
|
6
|
+
CarouselControls,
|
|
7
|
+
CarouselItemsStore,
|
|
8
|
+
CarouselItemsData,
|
|
9
|
+
TransitionStore,
|
|
10
|
+
} from './types'
|
|
11
|
+
import Pagination from '../Pagination/Pagination.svelte'
|
|
12
|
+
|
|
13
|
+
interface Props {
|
|
14
|
+
index?: number
|
|
15
|
+
/** The interval in milliseconds between slides. */
|
|
16
|
+
interval?: number
|
|
17
|
+
autoplay?: boolean
|
|
18
|
+
repeat?: boolean
|
|
19
|
+
pauseOnHover?: boolean
|
|
20
|
+
bullets?: boolean
|
|
21
|
+
keyNavigation?: boolean
|
|
22
|
+
transition?: Transition | null
|
|
23
|
+
onchange?: (index: number) => void
|
|
24
|
+
onclick?: (e: MouseEvent) => void
|
|
25
|
+
onkeydown?: (e: KeyboardEvent) => void
|
|
26
|
+
onmouseover?: (e: MouseEvent) => void
|
|
27
|
+
onmouseenter?: (e: MouseEvent) => void
|
|
28
|
+
onmouseleave?: (e: MouseEvent) => void
|
|
29
|
+
onfocus?: (e: FocusEvent) => void
|
|
30
|
+
/** Replaces the default bullets. Receives 0-based index helpers. */
|
|
31
|
+
controls?: import('svelte').Snippet<[CarouselControls]>
|
|
32
|
+
children?: import('svelte').Snippet
|
|
33
|
+
[key: string]: any
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let {
|
|
37
|
+
index = $bindable(0),
|
|
38
|
+
interval = 2500,
|
|
39
|
+
autoplay = true,
|
|
40
|
+
repeat = true,
|
|
41
|
+
pauseOnHover = true,
|
|
42
|
+
bullets = true,
|
|
43
|
+
keyNavigation = true,
|
|
44
|
+
transition = 'fade',
|
|
45
|
+
onchange,
|
|
46
|
+
onclick,
|
|
47
|
+
onkeydown,
|
|
48
|
+
onmouseover,
|
|
49
|
+
onmouseenter,
|
|
50
|
+
onmouseleave,
|
|
51
|
+
onfocus,
|
|
52
|
+
controls,
|
|
53
|
+
children,
|
|
54
|
+
...rest
|
|
55
|
+
}: Props = $props()
|
|
56
|
+
|
|
57
|
+
let intervalId: number
|
|
58
|
+
|
|
59
|
+
const items: CarouselItemsStore = writable([])
|
|
60
|
+
const transitionStore: TransitionStore = writable(null)
|
|
61
|
+
$effect(() => {
|
|
62
|
+
// Use .set() — `$store =` inside an effect re-subscribes and loops forever.
|
|
63
|
+
transitionStore.set(transition)
|
|
64
|
+
})
|
|
65
|
+
const itemsData: CarouselItemsData = {
|
|
66
|
+
activeItem: index,
|
|
67
|
+
items,
|
|
68
|
+
transition: transitionStore,
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
setContext('carouselItems', itemsData)
|
|
72
|
+
|
|
73
|
+
onMount(() => {
|
|
74
|
+
$items[index]?.show()
|
|
75
|
+
if (autoplay) {
|
|
76
|
+
setUpAutoplay()
|
|
77
|
+
return () => clearInterval(intervalId)
|
|
78
|
+
}
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
function setUpAutoplay() {
|
|
82
|
+
if (intervalId) clearInterval(intervalId)
|
|
83
|
+
if (!autoplay) return
|
|
84
|
+
|
|
85
|
+
intervalId = window.setInterval(() => {
|
|
86
|
+
if (!length) return
|
|
87
|
+
index = (index + 1) % length
|
|
88
|
+
if (!repeat && index === length - 1) {
|
|
89
|
+
clearInterval(intervalId)
|
|
90
|
+
}
|
|
91
|
+
}, interval)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function navigationHandler(value: number) {
|
|
95
|
+
goToItem(value - 1)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function goToItem(idx: number) {
|
|
99
|
+
if (autoplay) {
|
|
100
|
+
setUpAutoplay()
|
|
101
|
+
}
|
|
102
|
+
index = idx
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function next() {
|
|
106
|
+
if (!length) return
|
|
107
|
+
goToItem((index + 1) % length)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function previous() {
|
|
111
|
+
if (!length) return
|
|
112
|
+
goToItem((length + index - 1) % length)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function pause() {
|
|
116
|
+
if (!pauseOnHover || !autoplay) return
|
|
117
|
+
|
|
118
|
+
clearInterval(intervalId)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function resume() {
|
|
122
|
+
if (!pauseOnHover || !autoplay) return
|
|
123
|
+
|
|
124
|
+
setUpAutoplay()
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function handleKeydown(e: KeyboardEvent) {
|
|
128
|
+
onkeydown?.(e)
|
|
129
|
+
if (!keyNavigation || !length) return
|
|
130
|
+
|
|
131
|
+
switch (e.key) {
|
|
132
|
+
case 'ArrowRight':
|
|
133
|
+
next()
|
|
134
|
+
break
|
|
135
|
+
case 'ArrowLeft':
|
|
136
|
+
previous()
|
|
137
|
+
break
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function handleMouseEnter(e: MouseEvent) {
|
|
142
|
+
onmouseenter?.(e)
|
|
143
|
+
pause()
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function handleMouseLeave(e: MouseEvent) {
|
|
147
|
+
onmouseleave?.(e)
|
|
148
|
+
resume()
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function updateTabsVisility() {
|
|
152
|
+
$items.forEach((item, idx) => {
|
|
153
|
+
if (idx === index) item.show()
|
|
154
|
+
else item.hide()
|
|
155
|
+
})
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
$effect(() => {
|
|
159
|
+
if (index > -1) {
|
|
160
|
+
updateTabsVisility()
|
|
161
|
+
onchange?.(index)
|
|
162
|
+
}
|
|
163
|
+
})
|
|
164
|
+
let { length } = $derived($items)
|
|
165
|
+
</script>
|
|
166
|
+
|
|
167
|
+
<section
|
|
168
|
+
{...rest}
|
|
169
|
+
class={['outline-none', rest.class]}
|
|
170
|
+
{onclick}
|
|
171
|
+
onkeydown={handleKeydown}
|
|
172
|
+
{onmouseover}
|
|
173
|
+
{onfocus}
|
|
174
|
+
onmouseenter={handleMouseEnter}
|
|
175
|
+
onmouseleave={handleMouseLeave}
|
|
176
|
+
>
|
|
177
|
+
<div
|
|
178
|
+
class={[
|
|
179
|
+
'relative inline-block',
|
|
180
|
+
'min-h-(--min-height,120px) h-(--height,auto) max-h-(--max-height,none)',
|
|
181
|
+
'min-w-(--min-width,0) w-(--width,auto) max-w-(--max-width,none)',
|
|
182
|
+
]}
|
|
183
|
+
>
|
|
184
|
+
{@render children?.()}
|
|
185
|
+
{#if controls}
|
|
186
|
+
{@render controls({
|
|
187
|
+
index,
|
|
188
|
+
length,
|
|
189
|
+
goTo: goToItem,
|
|
190
|
+
next,
|
|
191
|
+
previous,
|
|
192
|
+
})}
|
|
193
|
+
{:else if bullets}
|
|
194
|
+
<Pagination
|
|
195
|
+
class="mt-2 flex w-full justify-center"
|
|
196
|
+
total={length}
|
|
197
|
+
pageSize={1}
|
|
198
|
+
current={index + 1}
|
|
199
|
+
bullets
|
|
200
|
+
onchange={navigationHandler}
|
|
201
|
+
/>
|
|
202
|
+
{/if}
|
|
203
|
+
</div>
|
|
204
|
+
</section>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Transition } from '../../types';
|
|
2
|
+
import type { CarouselControls } from './types';
|
|
3
|
+
interface Props {
|
|
4
|
+
index?: number;
|
|
5
|
+
/** The interval in milliseconds between slides. */
|
|
6
|
+
interval?: number;
|
|
7
|
+
autoplay?: boolean;
|
|
8
|
+
repeat?: boolean;
|
|
9
|
+
pauseOnHover?: boolean;
|
|
10
|
+
bullets?: boolean;
|
|
11
|
+
keyNavigation?: boolean;
|
|
12
|
+
transition?: Transition | null;
|
|
13
|
+
onchange?: (index: number) => void;
|
|
14
|
+
onclick?: (e: MouseEvent) => void;
|
|
15
|
+
onkeydown?: (e: KeyboardEvent) => void;
|
|
16
|
+
onmouseover?: (e: MouseEvent) => void;
|
|
17
|
+
onmouseenter?: (e: MouseEvent) => void;
|
|
18
|
+
onmouseleave?: (e: MouseEvent) => void;
|
|
19
|
+
onfocus?: (e: FocusEvent) => void;
|
|
20
|
+
/** Replaces the default bullets. Receives 0-based index helpers. */
|
|
21
|
+
controls?: import('svelte').Snippet<[CarouselControls]>;
|
|
22
|
+
children?: import('svelte').Snippet;
|
|
23
|
+
[key: string]: any;
|
|
24
|
+
}
|
|
25
|
+
declare const Carousel: import("svelte").Component<Props, {}, "index">;
|
|
26
|
+
type Carousel = ReturnType<typeof Carousel>;
|
|
27
|
+
export default Carousel;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onDestroy, getContext } from 'svelte'
|
|
3
|
+
import type { CarouselItemsData } from './types'
|
|
4
|
+
import { configureTransition } from '../../utils'
|
|
5
|
+
interface Props {
|
|
6
|
+
children?: import('svelte').Snippet
|
|
7
|
+
[key: string]: any
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
let { children, ...rest }: Props = $props()
|
|
11
|
+
|
|
12
|
+
const key = Symbol()
|
|
13
|
+
let active: boolean = $state(false)
|
|
14
|
+
|
|
15
|
+
const itemsData: CarouselItemsData = getContext('carouselItems')
|
|
16
|
+
|
|
17
|
+
if (!itemsData)
|
|
18
|
+
throw new Error('CarouselItem should be nested inside a Carousel')
|
|
19
|
+
|
|
20
|
+
// Register during init so the parent can show the first slide without racing onMount.
|
|
21
|
+
itemsData.items.update((list) => [
|
|
22
|
+
...list,
|
|
23
|
+
{
|
|
24
|
+
key,
|
|
25
|
+
show: () => (active = true),
|
|
26
|
+
hide: () => (active = false),
|
|
27
|
+
},
|
|
28
|
+
])
|
|
29
|
+
|
|
30
|
+
onDestroy(() => {
|
|
31
|
+
itemsData.items.update((list) => list.filter((item) => item.key !== key))
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
let { transition } = $derived(itemsData)
|
|
35
|
+
</script>
|
|
36
|
+
|
|
37
|
+
{#if active}
|
|
38
|
+
<div
|
|
39
|
+
{...rest}
|
|
40
|
+
class={['carousel-item', rest.class]}
|
|
41
|
+
in:configureTransition={{
|
|
42
|
+
name: $transition,
|
|
43
|
+
disabled: !$transition,
|
|
44
|
+
}}
|
|
45
|
+
>
|
|
46
|
+
{@render children?.()}
|
|
47
|
+
</div>
|
|
48
|
+
{/if}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Transition } from '../../types';
|
|
2
|
+
import type { Writable } from 'svelte/store';
|
|
3
|
+
export interface iCarouselItem {
|
|
4
|
+
key: symbol;
|
|
5
|
+
show: () => void;
|
|
6
|
+
hide: () => void;
|
|
7
|
+
}
|
|
8
|
+
export type CarouselItemsStore = Writable<iCarouselItem[]>;
|
|
9
|
+
export type TransitionStore = Writable<Transition | null>;
|
|
10
|
+
export interface CarouselItemsData {
|
|
11
|
+
activeItem: number;
|
|
12
|
+
items: CarouselItemsStore;
|
|
13
|
+
transition: TransitionStore;
|
|
14
|
+
}
|
|
15
|
+
/** Arguments passed to the Carousel `controls` snippet. Index is 0-based. */
|
|
16
|
+
export interface CarouselControls {
|
|
17
|
+
index: number;
|
|
18
|
+
length: number;
|
|
19
|
+
goTo: (index: number) => void;
|
|
20
|
+
next: () => void;
|
|
21
|
+
previous: () => void;
|
|
22
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import Icon from './Icon.svelte'
|
|
3
|
+
import { X } from '../icons'
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
ariaLabel?: string
|
|
7
|
+
onclick?: (e: MouseEvent) => void
|
|
8
|
+
[key: string]: any
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let { ariaLabel = 'close', onclick, ...rest }: Props = $props()
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<button {...rest} aria-label={ariaLabel} onclick={(e) => onclick?.(e)}>
|
|
15
|
+
<Icon name={X} size={18} />
|
|
16
|
+
</button>
|
|
17
|
+
|
|
18
|
+
<style>
|
|
19
|
+
button {
|
|
20
|
+
cursor: pointer;
|
|
21
|
+
float: right;
|
|
22
|
+
border: 0;
|
|
23
|
+
padding: 0;
|
|
24
|
+
background: none;
|
|
25
|
+
box-shadow: none;
|
|
26
|
+
transform: none;
|
|
27
|
+
&:hover,
|
|
28
|
+
&:focus {
|
|
29
|
+
transform: none;
|
|
30
|
+
box-shadow: none;
|
|
31
|
+
border: 0;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
</style>
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import Icon from './Icon.svelte'
|
|
3
|
+
import { ChevronDown } from '../icons'
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
label?: string
|
|
7
|
+
open?: boolean
|
|
8
|
+
/** Shared `name` → native exclusive accordion (only one open at a time). */
|
|
9
|
+
name?: string
|
|
10
|
+
/** Show the expand/collapse chevron next to the trigger. */
|
|
11
|
+
chevron?: boolean
|
|
12
|
+
onopen?: () => void
|
|
13
|
+
onclose?: () => void
|
|
14
|
+
trigger?: import('svelte').Snippet<[boolean]>
|
|
15
|
+
children?: import('svelte').Snippet
|
|
16
|
+
[key: string]: any
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let {
|
|
20
|
+
label = '',
|
|
21
|
+
open = $bindable(false),
|
|
22
|
+
name = undefined,
|
|
23
|
+
chevron = true,
|
|
24
|
+
onopen,
|
|
25
|
+
onclose,
|
|
26
|
+
trigger,
|
|
27
|
+
children,
|
|
28
|
+
...rest
|
|
29
|
+
}: Props = $props()
|
|
30
|
+
|
|
31
|
+
function onToggle(e: Event) {
|
|
32
|
+
const el = e.currentTarget as HTMLDetailsElement
|
|
33
|
+
open = el.open
|
|
34
|
+
if (open) onopen?.()
|
|
35
|
+
else onclose?.()
|
|
36
|
+
}
|
|
37
|
+
</script>
|
|
38
|
+
|
|
39
|
+
<details
|
|
40
|
+
{...rest}
|
|
41
|
+
class={['collapsible-paper', rest.class]}
|
|
42
|
+
{name}
|
|
43
|
+
bind:open
|
|
44
|
+
ontoggle={onToggle}
|
|
45
|
+
>
|
|
46
|
+
<summary class="flex! items-center justify-center gap-2">
|
|
47
|
+
<span class="min-w-0">
|
|
48
|
+
{#if trigger}{@render trigger(open)}{:else}{label}{/if}
|
|
49
|
+
</span>
|
|
50
|
+
{#if chevron}
|
|
51
|
+
<Icon
|
|
52
|
+
name={ChevronDown}
|
|
53
|
+
size={18}
|
|
54
|
+
class={[
|
|
55
|
+
'shrink-0 transition-transform ease-[ease]',
|
|
56
|
+
'duration-(--paper-collapsible-duration,0.3s)',
|
|
57
|
+
{ 'rotate-180': open },
|
|
58
|
+
]}
|
|
59
|
+
aria-hidden="true"
|
|
60
|
+
/>
|
|
61
|
+
{/if}
|
|
62
|
+
</summary>
|
|
63
|
+
{@render children?.()}
|
|
64
|
+
</details>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
label?: string;
|
|
3
|
+
open?: boolean;
|
|
4
|
+
/** Shared `name` → native exclusive accordion (only one open at a time). */
|
|
5
|
+
name?: string;
|
|
6
|
+
/** Show the expand/collapse chevron next to the trigger. */
|
|
7
|
+
chevron?: boolean;
|
|
8
|
+
onopen?: () => void;
|
|
9
|
+
onclose?: () => void;
|
|
10
|
+
trigger?: import('svelte').Snippet<[boolean]>;
|
|
11
|
+
children?: import('svelte').Snippet;
|
|
12
|
+
[key: string]: any;
|
|
13
|
+
}
|
|
14
|
+
declare const Collapsible: import("svelte").Component<Props, {}, "open">;
|
|
15
|
+
type Collapsible = ReturnType<typeof Collapsible>;
|
|
16
|
+
export default Collapsible;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import Button from './Button.svelte'
|
|
3
|
+
import Icon from './Icon.svelte'
|
|
4
|
+
import { Copy } from '../icons'
|
|
5
|
+
import { success } from './Toast'
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
/** The text to copy. */
|
|
9
|
+
text: string
|
|
10
|
+
successMessage?: string
|
|
11
|
+
ariaLabel?: string
|
|
12
|
+
onclick?: (e: MouseEvent) => void
|
|
13
|
+
oncopy?: (text: string) => void
|
|
14
|
+
children?: import('svelte').Snippet
|
|
15
|
+
[key: string]: any
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let {
|
|
19
|
+
text,
|
|
20
|
+
successMessage = 'Copied!',
|
|
21
|
+
ariaLabel = 'Copy to clipboard',
|
|
22
|
+
onclick,
|
|
23
|
+
oncopy,
|
|
24
|
+
children,
|
|
25
|
+
...rest
|
|
26
|
+
}: Props = $props()
|
|
27
|
+
|
|
28
|
+
async function copy(e: MouseEvent) {
|
|
29
|
+
onclick?.(e)
|
|
30
|
+
if (!text) return
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
await navigator.clipboard.writeText(text)
|
|
34
|
+
oncopy?.(text)
|
|
35
|
+
|
|
36
|
+
if (successMessage)
|
|
37
|
+
success({
|
|
38
|
+
message: successMessage,
|
|
39
|
+
position: 'top',
|
|
40
|
+
duration: 1000,
|
|
41
|
+
})
|
|
42
|
+
} catch (e) {
|
|
43
|
+
console.error(e)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
<Button {...rest} aria-label={ariaLabel} onclick={copy}>
|
|
49
|
+
{#if children}
|
|
50
|
+
{@render children()}
|
|
51
|
+
{:else}
|
|
52
|
+
<Icon name={Copy} size={18} />
|
|
53
|
+
{/if}
|
|
54
|
+
</Button>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
/** The text to copy. */
|
|
3
|
+
text: string;
|
|
4
|
+
successMessage?: string;
|
|
5
|
+
ariaLabel?: string;
|
|
6
|
+
onclick?: (e: MouseEvent) => void;
|
|
7
|
+
oncopy?: (text: string) => void;
|
|
8
|
+
children?: import('svelte').Snippet;
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
}
|
|
11
|
+
declare const CopyButton: import("svelte").Component<Props, {}, "">;
|
|
12
|
+
type CopyButton = ReturnType<typeof CopyButton>;
|
|
13
|
+
export default CopyButton;
|