@x33025/sveltely 0.1.0 → 0.1.2
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/components/Library/Button/Button.demo.svelte +5 -3
- package/dist/components/Library/Button/Button.demo.svelte.d.ts +1 -0
- package/dist/components/Library/Calendar/Calendar.demo.svelte +2 -14
- package/dist/components/Library/Calendar/Calendar.svelte +54 -50
- package/dist/components/Library/Divider/Divider.svelte +10 -0
- package/dist/components/Library/Divider/Divider.svelte.d.ts +26 -0
- package/dist/components/Library/Divider/index.d.ts +1 -0
- package/dist/components/Library/Divider/index.js +1 -0
- package/dist/components/Library/Dropdown/Dropdown.demo.svelte +37 -2
- package/dist/components/Library/Dropdown/Dropdown.svelte +55 -34
- package/dist/components/Library/Dropdown/Dropdown.svelte.d.ts +1 -1
- package/dist/components/Library/Dropdown/index.d.ts +1 -1
- package/dist/components/Library/Dropdown/types.d.ts +4 -1
- package/dist/components/Library/Floating/Floating.svelte +35 -1
- package/dist/components/Library/ForEach/ForEach.svelte +14 -0
- package/dist/components/Library/ForEach/ForEach.svelte.d.ts +28 -0
- package/dist/components/Library/ForEach/index.d.ts +1 -0
- package/dist/components/Library/ForEach/index.js +1 -0
- package/dist/components/Library/Grid/Grid.svelte +74 -0
- package/dist/components/Library/Grid/Grid.svelte.d.ts +13 -0
- package/dist/components/Library/Grid/index.d.ts +1 -0
- package/dist/components/Library/Grid/index.js +1 -0
- package/dist/components/Library/GridItem/GridItem.svelte +65 -0
- package/dist/components/Library/GridItem/GridItem.svelte.d.ts +14 -0
- package/dist/components/Library/GridItem/index.d.ts +1 -0
- package/dist/components/Library/GridItem/index.js +1 -0
- package/dist/components/Library/HStack/HStack.svelte +45 -0
- package/dist/components/Library/HStack/HStack.svelte.d.ts +9 -0
- package/dist/components/Library/HStack/index.d.ts +1 -0
- package/dist/components/Library/HStack/index.js +1 -0
- package/dist/components/Library/Image/Image.demo.svelte +18 -0
- package/dist/components/Library/Image/Image.demo.svelte.d.ts +23 -0
- package/dist/components/Library/Image/Image.svelte +57 -0
- package/dist/components/Library/Image/Image.svelte.d.ts +17 -0
- package/dist/components/Library/Image/ImagePlaceholder.svelte +202 -0
- package/dist/components/Library/Image/ImagePlaceholder.svelte.d.ts +7 -0
- package/dist/components/Library/Image/index.d.ts +1 -0
- package/dist/components/Library/Image/index.js +1 -0
- package/dist/components/Library/ImageMask/BrushPreview.svelte +119 -0
- package/dist/components/Library/ImageMask/BrushPreview.svelte.d.ts +11 -0
- package/dist/components/Library/ImageMask/ImageMask.demo.svelte +117 -0
- package/dist/components/Library/ImageMask/ImageMask.demo.svelte.d.ts +10 -0
- package/dist/components/Library/ImageMask/ImageMask.svelte +46 -0
- package/dist/components/Library/ImageMask/ImageMask.svelte.d.ts +20 -0
- package/dist/components/Library/ImageMask/MaskLayer.svelte +341 -0
- package/dist/components/Library/ImageMask/MaskLayer.svelte.d.ts +12 -0
- package/dist/components/Library/ImageMask/contour.d.ts +11 -0
- package/dist/components/Library/ImageMask/contour.js +152 -0
- package/dist/components/Library/ImageMask/index.d.ts +2 -0
- package/dist/components/Library/ImageMask/index.js +1 -0
- package/dist/components/Library/ImageMask/marchingAnts.d.ts +8 -0
- package/dist/components/Library/ImageMask/marchingAnts.js +29 -0
- package/dist/components/Library/ImageMask/maskSurface.d.ts +5 -0
- package/dist/components/Library/ImageMask/maskSurface.js +94 -0
- package/dist/components/Library/ImageMask/types.d.ts +23 -0
- package/dist/components/Library/ImageMask/types.js +1 -0
- package/dist/components/Library/Label/Label.demo.svelte +28 -0
- package/dist/components/Library/Label/Label.demo.svelte.d.ts +9 -0
- package/dist/components/Library/Label/Label.svelte +177 -0
- package/dist/components/Library/Label/Label.svelte.d.ts +18 -0
- package/dist/components/Library/Label/index.d.ts +1 -0
- package/dist/components/Library/Label/index.js +1 -0
- package/dist/components/Library/NumberField/NumberField.demo.svelte +21 -0
- package/dist/components/Library/NumberField/NumberField.demo.svelte.d.ts +8 -0
- package/dist/components/Library/NumberField/NumberField.svelte +194 -0
- package/dist/components/Library/NumberField/NumberField.svelte.d.ts +21 -0
- package/dist/components/Library/NumberField/index.d.ts +1 -0
- package/dist/components/Library/NumberField/index.js +1 -0
- package/dist/components/Library/ScrollView/ScrollView.svelte +25 -9
- package/dist/components/Library/ScrollView/ScrollView.svelte.d.ts +4 -4
- package/dist/components/Library/Spacer/Spacer.svelte +7 -0
- package/dist/components/Library/Spacer/Spacer.svelte.d.ts +26 -0
- package/dist/components/Library/Spacer/index.d.ts +1 -0
- package/dist/components/Library/Spacer/index.js +1 -0
- package/dist/components/Library/TextField/TextField.demo.svelte +14 -0
- package/dist/components/Library/TextField/TextField.demo.svelte.d.ts +8 -0
- package/dist/components/Library/TextField/TextField.svelte +149 -0
- package/dist/components/Library/TextField/TextField.svelte.d.ts +19 -0
- package/dist/components/Library/TextField/index.d.ts +1 -0
- package/dist/components/Library/TextField/index.js +1 -0
- package/dist/components/Library/VStack/VStack.svelte +45 -0
- package/dist/components/Library/VStack/VStack.svelte.d.ts +9 -0
- package/dist/components/Library/VStack/index.d.ts +1 -0
- package/dist/components/Library/VStack/index.js +1 -0
- package/dist/components/Local/ComponentGrid.svelte +15 -31
- package/dist/components/Local/HeroCard.svelte +26 -36
- package/dist/components/Local/HeroCard.svelte.d.ts +0 -2
- package/dist/index.d.ts +23 -0
- package/dist/index.js +17 -0
- package/dist/style/index.css +28 -17
- package/dist/style/label.d.ts +6 -0
- package/dist/style/label.js +4 -0
- package/dist/style/layout.d.ts +57 -0
- package/dist/style/layout.js +128 -0
- package/dist/style/media.d.ts +12 -0
- package/dist/style/media.js +8 -0
- package/dist/style/scroll.d.ts +7 -0
- package/dist/style/scroll.js +5 -0
- package/dist/style/text-editor.d.ts +34 -0
- package/dist/style/text-editor.js +29 -0
- package/dist/style.css +58 -35
- package/package.json +1 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<script lang="ts" generics="T">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
|
|
4
|
+
type Props = {
|
|
5
|
+
items: T[];
|
|
6
|
+
children: Snippet<[item: T, index: number]>;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
let { items, children }: Props = $props();
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
{#each items as item, index}
|
|
13
|
+
{@render children(item, index)}
|
|
14
|
+
{/each}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
declare function $$render<T>(): {
|
|
3
|
+
props: {
|
|
4
|
+
items: T[];
|
|
5
|
+
children: Snippet<[item: T, index: number]>;
|
|
6
|
+
};
|
|
7
|
+
exports: {};
|
|
8
|
+
bindings: "";
|
|
9
|
+
slots: {};
|
|
10
|
+
events: {};
|
|
11
|
+
};
|
|
12
|
+
declare class __sveltets_Render<T> {
|
|
13
|
+
props(): ReturnType<typeof $$render<T>>['props'];
|
|
14
|
+
events(): ReturnType<typeof $$render<T>>['events'];
|
|
15
|
+
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
16
|
+
bindings(): "";
|
|
17
|
+
exports(): {};
|
|
18
|
+
}
|
|
19
|
+
interface $$IsomorphicComponent {
|
|
20
|
+
new <T>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
21
|
+
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
22
|
+
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
23
|
+
<T>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
24
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
25
|
+
}
|
|
26
|
+
declare const ForEach: $$IsomorphicComponent;
|
|
27
|
+
type ForEach<T> = InstanceType<typeof ForEach<T>>;
|
|
28
|
+
export default ForEach;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './ForEach.svelte';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './ForEach.svelte';
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import { extractLayoutProps, layoutStyle, type LayoutProps } from '../../../style/layout';
|
|
4
|
+
import { extractStyleProps, surfaceStyle, type StyleProps } from '../../../style/surface';
|
|
5
|
+
|
|
6
|
+
type Props = {
|
|
7
|
+
children?: Snippet;
|
|
8
|
+
columns?: number | string;
|
|
9
|
+
rows?: number | string;
|
|
10
|
+
autoRows?: number | string;
|
|
11
|
+
dense?: boolean;
|
|
12
|
+
} & LayoutProps &
|
|
13
|
+
StyleProps;
|
|
14
|
+
|
|
15
|
+
let {
|
|
16
|
+
children,
|
|
17
|
+
columns = 1,
|
|
18
|
+
rows,
|
|
19
|
+
autoRows,
|
|
20
|
+
dense = false,
|
|
21
|
+
...restProps
|
|
22
|
+
}: Props = $props();
|
|
23
|
+
|
|
24
|
+
const extractedLayoutProps = $derived.by(() => extractLayoutProps(restProps));
|
|
25
|
+
const layoutProps = $derived(extractedLayoutProps.layoutProps);
|
|
26
|
+
const afterLayoutProps = $derived(extractedLayoutProps.restProps);
|
|
27
|
+
const extractedStyleProps = $derived.by(() => extractStyleProps(afterLayoutProps));
|
|
28
|
+
const styleProps = $derived(extractedStyleProps.styleProps);
|
|
29
|
+
const templateColumns = $derived(
|
|
30
|
+
typeof columns === 'number' ? `repeat(${columns}, minmax(0, 1fr))` : columns
|
|
31
|
+
);
|
|
32
|
+
const templateRows = $derived(
|
|
33
|
+
rows === undefined ? undefined : typeof rows === 'number' ? `repeat(${rows}, minmax(0, 1fr))` : rows
|
|
34
|
+
);
|
|
35
|
+
const gridAutoRows = $derived(
|
|
36
|
+
autoRows === undefined ? undefined : typeof autoRows === 'number' ? `${autoRows}rem` : autoRows
|
|
37
|
+
);
|
|
38
|
+
const rootStyle = $derived.by(() =>
|
|
39
|
+
[
|
|
40
|
+
`grid-template-columns: ${templateColumns};`,
|
|
41
|
+
templateRows ? `grid-template-rows: ${templateRows};` : '',
|
|
42
|
+
gridAutoRows ? `grid-auto-rows: ${gridAutoRows};` : '',
|
|
43
|
+
layoutStyle(layoutProps),
|
|
44
|
+
surfaceStyle(styleProps, 'grid')
|
|
45
|
+
]
|
|
46
|
+
.filter(Boolean)
|
|
47
|
+
.join(' ')
|
|
48
|
+
);
|
|
49
|
+
</script>
|
|
50
|
+
|
|
51
|
+
<div class="grid" class:grid-dense={dense} style={rootStyle}>
|
|
52
|
+
{#if children}
|
|
53
|
+
{@render children()}
|
|
54
|
+
{/if}
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<style>
|
|
58
|
+
.grid {
|
|
59
|
+
display: grid;
|
|
60
|
+
min-width: 0;
|
|
61
|
+
min-height: 0;
|
|
62
|
+
align-items: stretch;
|
|
63
|
+
gap: var(--grid-gap, 0px);
|
|
64
|
+
border-radius: var(--grid-border-radius, 0px);
|
|
65
|
+
padding:
|
|
66
|
+
var(--grid-padding-y, 0px)
|
|
67
|
+
var(--grid-padding-x, 0px);
|
|
68
|
+
font-size: var(--grid-font-size, inherit);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.grid-dense {
|
|
72
|
+
grid-auto-flow: dense;
|
|
73
|
+
}
|
|
74
|
+
</style>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import { type LayoutProps } from '../../../style/layout';
|
|
3
|
+
import { type StyleProps } from '../../../style/surface';
|
|
4
|
+
type Props = {
|
|
5
|
+
children?: Snippet;
|
|
6
|
+
columns?: number | string;
|
|
7
|
+
rows?: number | string;
|
|
8
|
+
autoRows?: number | string;
|
|
9
|
+
dense?: boolean;
|
|
10
|
+
} & LayoutProps & StyleProps;
|
|
11
|
+
declare const Grid: import("svelte").Component<Props, {}, "">;
|
|
12
|
+
type Grid = ReturnType<typeof Grid>;
|
|
13
|
+
export default Grid;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './Grid.svelte';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './Grid.svelte';
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import { extractLayoutProps, layoutStyle, type LayoutProps } from '../../../style/layout';
|
|
4
|
+
import { extractStyleProps, surfaceStyle, type StyleProps } from '../../../style/surface';
|
|
5
|
+
|
|
6
|
+
type Props = {
|
|
7
|
+
children?: Snippet;
|
|
8
|
+
column?: number | string;
|
|
9
|
+
row?: number | string;
|
|
10
|
+
columnSpan?: number;
|
|
11
|
+
rowSpan?: number;
|
|
12
|
+
area?: string;
|
|
13
|
+
} & LayoutProps &
|
|
14
|
+
StyleProps;
|
|
15
|
+
|
|
16
|
+
let {
|
|
17
|
+
children,
|
|
18
|
+
column,
|
|
19
|
+
row,
|
|
20
|
+
columnSpan,
|
|
21
|
+
rowSpan,
|
|
22
|
+
area,
|
|
23
|
+
...restProps
|
|
24
|
+
}: Props = $props();
|
|
25
|
+
|
|
26
|
+
const extractedLayoutProps = $derived.by(() => extractLayoutProps(restProps));
|
|
27
|
+
const layoutProps = $derived(extractedLayoutProps.layoutProps);
|
|
28
|
+
const afterLayoutProps = $derived(extractedLayoutProps.restProps);
|
|
29
|
+
const extractedStyleProps = $derived.by(() => extractStyleProps(afterLayoutProps));
|
|
30
|
+
const styleProps = $derived(extractedStyleProps.styleProps);
|
|
31
|
+
const rootStyle = $derived.by(() =>
|
|
32
|
+
[
|
|
33
|
+
column !== undefined ? `grid-column: ${column};` : '',
|
|
34
|
+
row !== undefined ? `grid-row: ${row};` : '',
|
|
35
|
+
column === undefined && columnSpan !== undefined
|
|
36
|
+
? `grid-column: span ${columnSpan} / span ${columnSpan};`
|
|
37
|
+
: '',
|
|
38
|
+
row === undefined && rowSpan !== undefined ? `grid-row: span ${rowSpan} / span ${rowSpan};` : '',
|
|
39
|
+
area !== undefined ? `grid-area: ${area};` : '',
|
|
40
|
+
layoutStyle(layoutProps),
|
|
41
|
+
surfaceStyle(styleProps, 'grid-item')
|
|
42
|
+
]
|
|
43
|
+
.filter(Boolean)
|
|
44
|
+
.join(' ')
|
|
45
|
+
);
|
|
46
|
+
</script>
|
|
47
|
+
|
|
48
|
+
<div class="grid-item" style={rootStyle}>
|
|
49
|
+
{#if children}
|
|
50
|
+
{@render children()}
|
|
51
|
+
{/if}
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<style>
|
|
55
|
+
.grid-item {
|
|
56
|
+
min-width: 0;
|
|
57
|
+
min-height: 0;
|
|
58
|
+
height: 100%;
|
|
59
|
+
border-radius: var(--grid-item-border-radius, 0px);
|
|
60
|
+
padding:
|
|
61
|
+
var(--grid-item-padding-y, 0px)
|
|
62
|
+
var(--grid-item-padding-x, 0px);
|
|
63
|
+
font-size: var(--grid-item-font-size, inherit);
|
|
64
|
+
}
|
|
65
|
+
</style>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import { type LayoutProps } from '../../../style/layout';
|
|
3
|
+
import { type StyleProps } from '../../../style/surface';
|
|
4
|
+
type Props = {
|
|
5
|
+
children?: Snippet;
|
|
6
|
+
column?: number | string;
|
|
7
|
+
row?: number | string;
|
|
8
|
+
columnSpan?: number;
|
|
9
|
+
rowSpan?: number;
|
|
10
|
+
area?: string;
|
|
11
|
+
} & LayoutProps & StyleProps;
|
|
12
|
+
declare const GridItem: import("svelte").Component<Props, {}, "">;
|
|
13
|
+
type GridItem = ReturnType<typeof GridItem>;
|
|
14
|
+
export default GridItem;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './GridItem.svelte';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './GridItem.svelte';
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import { extractLayoutProps, layoutStyle, type LayoutProps } from '../../../style/layout';
|
|
4
|
+
import { extractStyleProps, surfaceStyle, type StyleProps } from '../../../style/surface';
|
|
5
|
+
|
|
6
|
+
type Props = {
|
|
7
|
+
children?: Snippet;
|
|
8
|
+
} & LayoutProps &
|
|
9
|
+
StyleProps;
|
|
10
|
+
|
|
11
|
+
let { children, ...restProps }: Props = $props();
|
|
12
|
+
|
|
13
|
+
const extractedLayoutProps = $derived.by(() => extractLayoutProps(restProps));
|
|
14
|
+
const layoutProps = $derived(extractedLayoutProps.layoutProps);
|
|
15
|
+
const afterLayoutProps = $derived(extractedLayoutProps.restProps);
|
|
16
|
+
const extractedStyleProps = $derived.by(() => extractStyleProps(afterLayoutProps));
|
|
17
|
+
const styleProps = $derived(extractedStyleProps.styleProps);
|
|
18
|
+
const rootStyle = $derived.by(() =>
|
|
19
|
+
[layoutStyle(layoutProps), surfaceStyle(styleProps, 'stack')].filter(Boolean).join(' ')
|
|
20
|
+
);
|
|
21
|
+
</script>
|
|
22
|
+
|
|
23
|
+
<div class="hstack" style={rootStyle}>
|
|
24
|
+
{#if children}
|
|
25
|
+
{@render children()}
|
|
26
|
+
{/if}
|
|
27
|
+
</div>
|
|
28
|
+
|
|
29
|
+
<style>
|
|
30
|
+
.hstack {
|
|
31
|
+
display: flex;
|
|
32
|
+
min-width: min-content;
|
|
33
|
+
min-height: min-content;
|
|
34
|
+
flex-direction: row;
|
|
35
|
+
gap: var(--stack-gap, 0px);
|
|
36
|
+
border-radius: var(--stack-border-radius, 0px);
|
|
37
|
+
padding:
|
|
38
|
+
var(--stack-padding-y, 0px)
|
|
39
|
+
var(--stack-padding-x, 0px);
|
|
40
|
+
font-size: var(--stack-font-size, inherit);
|
|
41
|
+
--divider-width: 1px;
|
|
42
|
+
--divider-height: auto;
|
|
43
|
+
--divider-align-self: stretch;
|
|
44
|
+
}
|
|
45
|
+
</style>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import { type LayoutProps } from '../../../style/layout';
|
|
3
|
+
import { type StyleProps } from '../../../style/surface';
|
|
4
|
+
type Props = {
|
|
5
|
+
children?: Snippet;
|
|
6
|
+
} & LayoutProps & StyleProps;
|
|
7
|
+
declare const HStack: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type HStack = ReturnType<typeof HStack>;
|
|
9
|
+
export default HStack;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './HStack.svelte';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './HStack.svelte';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<script module lang="ts">
|
|
2
|
+
export const demo = {
|
|
3
|
+
name: 'Image',
|
|
4
|
+
description: 'Responsive image display with generated placeholder and busy states.'
|
|
5
|
+
};
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<script lang="ts">
|
|
9
|
+
import Image from './Image.svelte';
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<Image
|
|
13
|
+
src="https://images.unsplash.com/photo-1542291026-7eec264c27ff?auto=format&fit=crop&w=600&q=80"
|
|
14
|
+
alt="Red sneaker"
|
|
15
|
+
fit="cover"
|
|
16
|
+
class="aspect-square"
|
|
17
|
+
/>
|
|
18
|
+
<Image busy placeholderKey="image-demo-loading" class="aspect-square" />
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare const demo: {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
};
|
|
5
|
+
import Image from './Image.svelte';
|
|
6
|
+
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> {
|
|
7
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
8
|
+
$$bindings?: Bindings;
|
|
9
|
+
} & Exports;
|
|
10
|
+
(internal: unknown, props: {
|
|
11
|
+
$$events?: Events;
|
|
12
|
+
$$slots?: Slots;
|
|
13
|
+
}): Exports & {
|
|
14
|
+
$set?: any;
|
|
15
|
+
$on?: any;
|
|
16
|
+
};
|
|
17
|
+
z_$$bindings?: Bindings;
|
|
18
|
+
}
|
|
19
|
+
declare const Image: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
20
|
+
[evt: string]: CustomEvent<any>;
|
|
21
|
+
}, {}, {}, string>;
|
|
22
|
+
type Image = InstanceType<typeof Image>;
|
|
23
|
+
export default Image;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { HTMLImgAttributes } from 'svelte/elements';
|
|
4
|
+
import type { ImageFit, ImageLoading } from '../../../style/media';
|
|
5
|
+
import ImagePlaceholder from './ImagePlaceholder.svelte';
|
|
6
|
+
|
|
7
|
+
type Props = {
|
|
8
|
+
src?: string | null;
|
|
9
|
+
alt?: string;
|
|
10
|
+
fit?: ImageFit;
|
|
11
|
+
busy?: boolean;
|
|
12
|
+
placeholderKey?: string;
|
|
13
|
+
loading?: ImageLoading;
|
|
14
|
+
decoding?: HTMLImgAttributes['decoding'];
|
|
15
|
+
children?: Snippet;
|
|
16
|
+
class?: string;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
let {
|
|
20
|
+
src = null,
|
|
21
|
+
alt = '',
|
|
22
|
+
fit = 'contain',
|
|
23
|
+
busy = false,
|
|
24
|
+
placeholderKey = 'default',
|
|
25
|
+
loading = 'lazy',
|
|
26
|
+
decoding = 'async',
|
|
27
|
+
children,
|
|
28
|
+
class: className = ''
|
|
29
|
+
}: Props = $props();
|
|
30
|
+
|
|
31
|
+
const showImage = $derived(Boolean(src) && !busy);
|
|
32
|
+
</script>
|
|
33
|
+
|
|
34
|
+
<div class={`image relative overflow-hidden bg-zinc-100 ${className}`}>
|
|
35
|
+
{#if showImage}
|
|
36
|
+
<img
|
|
37
|
+
{src}
|
|
38
|
+
{alt}
|
|
39
|
+
{loading}
|
|
40
|
+
{decoding}
|
|
41
|
+
draggable="false"
|
|
42
|
+
class="absolute inset-0 size-full {fit === 'cover' ? 'object-cover' : 'object-contain'}"
|
|
43
|
+
/>
|
|
44
|
+
{:else}
|
|
45
|
+
<ImagePlaceholder seed={placeholderKey} class="absolute inset-0" />
|
|
46
|
+
{/if}
|
|
47
|
+
|
|
48
|
+
{#if children}
|
|
49
|
+
{@render children()}
|
|
50
|
+
{/if}
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<style>
|
|
54
|
+
.image {
|
|
55
|
+
border-radius: var(--image-border-radius, var(--sveltely-border-radius));
|
|
56
|
+
}
|
|
57
|
+
</style>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { HTMLImgAttributes } from 'svelte/elements';
|
|
3
|
+
import type { ImageFit, ImageLoading } from '../../../style/media';
|
|
4
|
+
type Props = {
|
|
5
|
+
src?: string | null;
|
|
6
|
+
alt?: string;
|
|
7
|
+
fit?: ImageFit;
|
|
8
|
+
busy?: boolean;
|
|
9
|
+
placeholderKey?: string;
|
|
10
|
+
loading?: ImageLoading;
|
|
11
|
+
decoding?: HTMLImgAttributes['decoding'];
|
|
12
|
+
children?: Snippet;
|
|
13
|
+
class?: string;
|
|
14
|
+
};
|
|
15
|
+
declare const Image: import("svelte").Component<Props, {}, "">;
|
|
16
|
+
type Image = ReturnType<typeof Image>;
|
|
17
|
+
export default Image;
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount } from 'svelte';
|
|
3
|
+
|
|
4
|
+
let {
|
|
5
|
+
class: className = '',
|
|
6
|
+
seed = 'default'
|
|
7
|
+
}: {
|
|
8
|
+
class?: string;
|
|
9
|
+
seed?: string;
|
|
10
|
+
} = $props();
|
|
11
|
+
|
|
12
|
+
const fps = 24;
|
|
13
|
+
const scale = 3.2;
|
|
14
|
+
const speed = 0.18;
|
|
15
|
+
const contrast = 1.6;
|
|
16
|
+
let canvas: HTMLCanvasElement | null = null;
|
|
17
|
+
let context2d: CanvasRenderingContext2D | null = null;
|
|
18
|
+
let resizeObserver: ResizeObserver | null = null;
|
|
19
|
+
let animationFrame = 0;
|
|
20
|
+
let lastUpdate = 0;
|
|
21
|
+
let startTime = 0;
|
|
22
|
+
let viewportWidth = 1;
|
|
23
|
+
let viewportHeight = 1;
|
|
24
|
+
let devicePixelRatio = 1;
|
|
25
|
+
let canvasPixelWidth = 0;
|
|
26
|
+
let canvasPixelHeight = 0;
|
|
27
|
+
|
|
28
|
+
function hashString(value: string): number {
|
|
29
|
+
let hash = 2_166_136_261;
|
|
30
|
+
|
|
31
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
32
|
+
hash ^= value.charCodeAt(i);
|
|
33
|
+
hash = Math.imul(hash, 16_777_619);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return hash >>> 0;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const seedValue = $derived(hashString(seed));
|
|
40
|
+
const seedX = $derived(seedValue % 10_000);
|
|
41
|
+
const seedY = $derived((seedValue >>> 8) % 10_000);
|
|
42
|
+
const seedZ = $derived((seedValue >>> 16) % 10_000);
|
|
43
|
+
|
|
44
|
+
function fade(t: number): number {
|
|
45
|
+
return t * t * t * (t * (t * 6 - 15) + 10);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function lerp(a: number, b: number, t: number): number {
|
|
49
|
+
return a + (b - a) * t;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function clamp01(value: number): number {
|
|
53
|
+
return Math.max(0, Math.min(1, value));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function hash3D(x: number, y: number, z: number): number {
|
|
57
|
+
let n = Math.imul(x, 374_761_393) ^ Math.imul(y, 668_265_263) ^ Math.imul(z, 2_147_483_647);
|
|
58
|
+
n = (n ^ (n >>> 13)) >>> 0;
|
|
59
|
+
n = Math.imul(n, 1_274_126_177) >>> 0;
|
|
60
|
+
return ((n ^ (n >>> 16)) >>> 0) / 4_294_967_295;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function valueNoise3D(x: number, y: number, z: number): number {
|
|
64
|
+
const x0 = Math.floor(x);
|
|
65
|
+
const y0 = Math.floor(y);
|
|
66
|
+
const z0 = Math.floor(z);
|
|
67
|
+
const x1 = x0 + 1;
|
|
68
|
+
const y1 = y0 + 1;
|
|
69
|
+
const z1 = z0 + 1;
|
|
70
|
+
const sx = fade(x - x0);
|
|
71
|
+
const sy = fade(y - y0);
|
|
72
|
+
const sz = fade(z - z0);
|
|
73
|
+
const z00 = lerp(hash3D(x0, y0, z0), hash3D(x1, y0, z0), sx);
|
|
74
|
+
const z10 = lerp(hash3D(x0, y1, z0), hash3D(x1, y1, z0), sx);
|
|
75
|
+
const z01 = lerp(hash3D(x0, y0, z1), hash3D(x1, y0, z1), sx);
|
|
76
|
+
const z11 = lerp(hash3D(x0, y1, z1), hash3D(x1, y1, z1), sx);
|
|
77
|
+
return lerp(lerp(z00, z10, sy), lerp(z01, z11, sy), sz);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function fbm3D(x: number, y: number, z: number): number {
|
|
81
|
+
let total = 0;
|
|
82
|
+
let amplitude = 0.5;
|
|
83
|
+
let frequency = 1;
|
|
84
|
+
let amplitudeSum = 0;
|
|
85
|
+
|
|
86
|
+
for (let i = 0; i < 3; i += 1) {
|
|
87
|
+
total += valueNoise3D(x * frequency, y * frequency, z * frequency) * amplitude;
|
|
88
|
+
amplitudeSum += amplitude;
|
|
89
|
+
amplitude *= 0.5;
|
|
90
|
+
frequency *= 2;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return total / amplitudeSum;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function updateCanvasDimensions() {
|
|
97
|
+
if (!canvas) return;
|
|
98
|
+
const rect = canvas.parentElement?.getBoundingClientRect() ?? canvas.getBoundingClientRect();
|
|
99
|
+
const dpr = window.devicePixelRatio || 1;
|
|
100
|
+
devicePixelRatio = dpr;
|
|
101
|
+
viewportWidth = Math.max(1, rect.width);
|
|
102
|
+
viewportHeight = Math.max(1, rect.height);
|
|
103
|
+
const nextCanvasPixelWidth = Math.max(1, Math.round(viewportWidth * dpr));
|
|
104
|
+
const nextCanvasPixelHeight = Math.max(1, Math.round(viewportHeight * dpr));
|
|
105
|
+
|
|
106
|
+
if (
|
|
107
|
+
nextCanvasPixelWidth === canvasPixelWidth &&
|
|
108
|
+
nextCanvasPixelHeight === canvasPixelHeight &&
|
|
109
|
+
context2d
|
|
110
|
+
) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
canvasPixelWidth = nextCanvasPixelWidth;
|
|
115
|
+
canvasPixelHeight = nextCanvasPixelHeight;
|
|
116
|
+
canvas.width = nextCanvasPixelWidth;
|
|
117
|
+
canvas.height = nextCanvasPixelHeight;
|
|
118
|
+
canvas.style.width = `${viewportWidth}px`;
|
|
119
|
+
canvas.style.height = `${viewportHeight}px`;
|
|
120
|
+
context2d = canvas.getContext('2d', { alpha: true });
|
|
121
|
+
context2d?.setTransform(dpr, 0, 0, dpr, 0, 0);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function toChannel(value: number, low: number, high: number): number {
|
|
125
|
+
return Math.round(lerp(low, high, clamp01(value)));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function drawFrame(time: number) {
|
|
129
|
+
if (!context2d) return;
|
|
130
|
+
context2d.clearRect(0, 0, viewportWidth, viewportHeight);
|
|
131
|
+
|
|
132
|
+
const phase = time * speed;
|
|
133
|
+
const background = context2d.createLinearGradient(0, 0, viewportWidth, viewportHeight);
|
|
134
|
+
background.addColorStop(0, 'rgb(248 248 249)');
|
|
135
|
+
background.addColorStop(0.45, 'rgb(241 241 243)');
|
|
136
|
+
background.addColorStop(1, 'rgb(232 232 235)');
|
|
137
|
+
context2d.fillStyle = background;
|
|
138
|
+
context2d.fillRect(0, 0, viewportWidth, viewportHeight);
|
|
139
|
+
|
|
140
|
+
const columns = Math.max(10, Math.ceil(viewportWidth / 22));
|
|
141
|
+
const rows = Math.max(10, Math.ceil(viewportHeight / 22));
|
|
142
|
+
const cellWidth = viewportWidth / columns;
|
|
143
|
+
const cellHeight = viewportHeight / rows;
|
|
144
|
+
|
|
145
|
+
for (let row = 0; row < rows; row += 1) {
|
|
146
|
+
for (let col = 0; col < columns; col += 1) {
|
|
147
|
+
const nx = col / Math.max(1, columns - 1);
|
|
148
|
+
const ny = row / Math.max(1, rows - 1);
|
|
149
|
+
const noise = fbm3D(
|
|
150
|
+
nx * scale + seedX + Math.cos(phase + ny * 2.4) * 0.22,
|
|
151
|
+
ny * scale + seedY + Math.sin(phase * 1.2 + nx * 2.1) * 0.22,
|
|
152
|
+
phase + seedZ
|
|
153
|
+
);
|
|
154
|
+
const centered = (noise - 0.5) * 2;
|
|
155
|
+
const remapped = Math.tanh(centered * contrast) * 0.5 + 0.5;
|
|
156
|
+
const shimmer = 0.5 + 0.5 * Math.sin(phase * 2.2 + nx * 7 + ny * 5);
|
|
157
|
+
const grayscale = toChannel(remapped * 0.8 + shimmer * 0.2, 148, 248);
|
|
158
|
+
const x = col * cellWidth;
|
|
159
|
+
const y = row * cellHeight;
|
|
160
|
+
|
|
161
|
+
context2d.fillStyle = `rgb(${grayscale} ${grayscale} ${grayscale})`;
|
|
162
|
+
context2d.fillRect(x, y, cellWidth, cellHeight);
|
|
163
|
+
context2d.strokeStyle = 'rgba(255 255 255 / 0.36)';
|
|
164
|
+
context2d.lineWidth = 1 / devicePixelRatio;
|
|
165
|
+
context2d.strokeRect(
|
|
166
|
+
x + 0.5 / devicePixelRatio,
|
|
167
|
+
y + 0.5 / devicePixelRatio,
|
|
168
|
+
Math.max(0, cellWidth - 1 / devicePixelRatio),
|
|
169
|
+
Math.max(0, cellHeight - 1 / devicePixelRatio)
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function tick(timestamp: number) {
|
|
176
|
+
if (startTime === 0) startTime = timestamp;
|
|
177
|
+
if (timestamp - lastUpdate >= 1000 / fps) {
|
|
178
|
+
drawFrame((timestamp - startTime) / 1000);
|
|
179
|
+
lastUpdate = timestamp;
|
|
180
|
+
}
|
|
181
|
+
animationFrame = requestAnimationFrame(tick);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
onMount(() => {
|
|
185
|
+
updateCanvasDimensions();
|
|
186
|
+
resizeObserver = new ResizeObserver(() => {
|
|
187
|
+
updateCanvasDimensions();
|
|
188
|
+
drawFrame((performance.now() - startTime) / 1000);
|
|
189
|
+
});
|
|
190
|
+
if (canvas?.parentElement) resizeObserver.observe(canvas.parentElement);
|
|
191
|
+
animationFrame = requestAnimationFrame(tick);
|
|
192
|
+
window.addEventListener('resize', updateCanvasDimensions);
|
|
193
|
+
|
|
194
|
+
return () => {
|
|
195
|
+
cancelAnimationFrame(animationFrame);
|
|
196
|
+
resizeObserver?.disconnect();
|
|
197
|
+
window.removeEventListener('resize', updateCanvasDimensions);
|
|
198
|
+
};
|
|
199
|
+
});
|
|
200
|
+
</script>
|
|
201
|
+
|
|
202
|
+
<canvas bind:this={canvas} class={`block size-full ${className}`}></canvas>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './Image.svelte';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './Image.svelte';
|