svelte-bricks 0.2.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Masonry.svelte +35 -42
- package/dist/Masonry.svelte.d.ts +30 -25
- package/package.json +14 -21
- package/readme.md +23 -7
package/dist/Masonry.svelte
CHANGED
|
@@ -1,57 +1,37 @@
|
|
|
1
|
-
<script>import { flip } from 'svelte/animate';
|
|
1
|
+
<script lang="ts">import { flip } from 'svelte/animate';
|
|
2
2
|
import { fade } from 'svelte/transition';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export let duration = 200;
|
|
7
|
-
export let gap = 20;
|
|
8
|
-
// On non-primitive types, we need a property to tell masonry items apart. This component
|
|
9
|
-
// hard-codes the name of this property to 'id'. See https://svelte.dev/tutorial/keyed-each-blocks.
|
|
10
|
-
export let getId = (item) => {
|
|
3
|
+
let { animate = true, calcCols = (masonryWidth, minColWidth, gap) => {
|
|
4
|
+
return Math.min(items.length, Math.floor((masonryWidth + gap) / (minColWidth + gap)) || 1);
|
|
5
|
+
}, columnClass = ``, duration = 200, gap = 20, getId = (item) => {
|
|
11
6
|
if (typeof item === `number`)
|
|
12
7
|
return item;
|
|
13
8
|
if (typeof item === `string`)
|
|
14
9
|
return item;
|
|
15
10
|
return item[idKey];
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
let
|
|
25
|
-
$: nCols = Math.min(items.length, Math.floor(masonryWidth / (minColWidth + gap)) || 1);
|
|
26
|
-
$: itemsToCols = items.reduce((cols, item, idx) => {
|
|
11
|
+
}, idKey = `id`, items, masonryHeight = $bindable(0), masonryWidth = $bindable(0), maxColWidth = 500, minColWidth = 330, style = ``, class: className = ``, children, div = $bindable(undefined), // TODO add unit test for this prop
|
|
12
|
+
} = $props();
|
|
13
|
+
$effect.pre(() => {
|
|
14
|
+
if (maxColWidth < minColWidth) {
|
|
15
|
+
console.warn(`svelte-bricks: maxColWidth (${maxColWidth}) < minColWidth (${minColWidth}).`);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
let nCols = $derived(calcCols(masonryWidth, minColWidth, gap));
|
|
19
|
+
let itemsToCols = $derived(items.reduce((cols, item, idx) => {
|
|
27
20
|
cols[idx % cols.length].push([item, idx]);
|
|
28
21
|
return cols;
|
|
29
|
-
}, Array(nCols).fill(null).map(() => [])
|
|
30
|
-
);
|
|
22
|
+
}, Array(nCols).fill(null).map(() => [])));
|
|
31
23
|
</script>
|
|
32
|
-
<style>
|
|
33
|
-
:where(div.masonry) {
|
|
34
|
-
display: flex;
|
|
35
|
-
justify-content: center;
|
|
36
|
-
overflow-wrap: anywhere;
|
|
37
|
-
box-sizing: border-box;
|
|
38
|
-
}
|
|
39
|
-
:where(div.masonry div.col) {
|
|
40
|
-
display: grid;
|
|
41
|
-
height: max-content;
|
|
42
|
-
width: 100%;
|
|
43
|
-
}
|
|
44
|
-
</style>
|
|
45
|
-
|
|
46
24
|
|
|
25
|
+
<!-- deno-fmt-ignore -->
|
|
47
26
|
<div
|
|
48
27
|
class="masonry {className}"
|
|
49
28
|
bind:clientWidth={masonryWidth}
|
|
50
29
|
bind:clientHeight={masonryHeight}
|
|
30
|
+
bind:this={div}
|
|
51
31
|
style="gap: {gap}px; {style}"
|
|
52
32
|
>
|
|
53
|
-
{#each itemsToCols as col}
|
|
54
|
-
<div class="col {columnClass}" style="gap: {gap}px; max-width: {maxColWidth}px;">
|
|
33
|
+
{#each itemsToCols as col, idx}
|
|
34
|
+
<div class="col col-{idx} {columnClass}" style="gap: {gap}px; max-width: {maxColWidth}px;">
|
|
55
35
|
{#if animate}
|
|
56
36
|
{#each col as [item, idx] (getId(item))}
|
|
57
37
|
<div
|
|
@@ -59,19 +39,32 @@ $: itemsToCols = items.reduce((cols, item, idx) => {
|
|
|
59
39
|
out:fade={{ delay: 0, duration }}
|
|
60
40
|
animate:flip={{ duration }}
|
|
61
41
|
>
|
|
62
|
-
|
|
42
|
+
{#if children}{@render children({ idx, item })}{:else}
|
|
63
43
|
<span>{item}</span>
|
|
64
|
-
|
|
44
|
+
{/if}
|
|
65
45
|
</div>
|
|
66
46
|
{/each}
|
|
67
47
|
{:else}
|
|
68
48
|
{#each col as [item, idx] (getId(item))}
|
|
69
|
-
|
|
49
|
+
{#if children}{@render children({ idx, item })}{:else}
|
|
70
50
|
<span>{item}</span>
|
|
71
|
-
|
|
51
|
+
{/if}
|
|
72
52
|
{/each}
|
|
73
53
|
{/if}
|
|
74
54
|
</div>
|
|
75
55
|
{/each}
|
|
76
56
|
</div>
|
|
77
57
|
|
|
58
|
+
<style>
|
|
59
|
+
:where(div.masonry) {
|
|
60
|
+
display: flex;
|
|
61
|
+
justify-content: center;
|
|
62
|
+
overflow-wrap: anywhere;
|
|
63
|
+
box-sizing: border-box;
|
|
64
|
+
}
|
|
65
|
+
:where(div.masonry div.col) {
|
|
66
|
+
display: grid;
|
|
67
|
+
height: max-content;
|
|
68
|
+
width: 100%;
|
|
69
|
+
}
|
|
70
|
+
</style>
|
package/dist/Masonry.svelte.d.ts
CHANGED
|
@@ -1,33 +1,38 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
2
|
declare class __sveltets_Render<Item> {
|
|
3
3
|
props(): {
|
|
4
|
-
animate?: boolean
|
|
5
|
-
|
|
6
|
-
columnClass?: string
|
|
7
|
-
duration?: number
|
|
8
|
-
gap?: number
|
|
9
|
-
getId?: (
|
|
10
|
-
idKey?: string
|
|
4
|
+
animate?: boolean;
|
|
5
|
+
calcCols?: (masonryWidth: number, minColWidth: number, gap: number) => number;
|
|
6
|
+
columnClass?: string;
|
|
7
|
+
duration?: number;
|
|
8
|
+
gap?: number;
|
|
9
|
+
getId?: (item: Item) => string | number;
|
|
10
|
+
idKey?: string;
|
|
11
11
|
items: Item[];
|
|
12
|
-
masonryHeight?: number
|
|
13
|
-
masonryWidth?: number
|
|
14
|
-
maxColWidth?: number
|
|
15
|
-
minColWidth?: number
|
|
16
|
-
style?: string
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
[evt: string]: CustomEvent<any>;
|
|
20
|
-
};
|
|
21
|
-
slots(): {
|
|
22
|
-
default: {
|
|
12
|
+
masonryHeight?: number;
|
|
13
|
+
masonryWidth?: number;
|
|
14
|
+
maxColWidth?: number;
|
|
15
|
+
minColWidth?: number;
|
|
16
|
+
style?: string;
|
|
17
|
+
class?: string;
|
|
18
|
+
children?: Snippet<[{
|
|
23
19
|
idx: number;
|
|
24
20
|
item: Item;
|
|
25
|
-
}
|
|
21
|
+
}]>;
|
|
22
|
+
div?: HTMLDivElement;
|
|
26
23
|
};
|
|
24
|
+
events(): {};
|
|
25
|
+
slots(): {};
|
|
26
|
+
bindings(): "div" | "masonryHeight" | "masonryWidth";
|
|
27
|
+
exports(): {};
|
|
27
28
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
interface $$IsomorphicComponent {
|
|
30
|
+
new <Item>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Item>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Item>['props']>, ReturnType<__sveltets_Render<Item>['events']>, ReturnType<__sveltets_Render<Item>['slots']>> & {
|
|
31
|
+
$$bindings?: ReturnType<__sveltets_Render<Item>['bindings']>;
|
|
32
|
+
} & ReturnType<__sveltets_Render<Item>['exports']>;
|
|
33
|
+
<Item>(internal: unknown, props: ReturnType<__sveltets_Render<Item>['props']> & {}): ReturnType<__sveltets_Render<Item>['exports']>;
|
|
34
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
32
35
|
}
|
|
33
|
-
|
|
36
|
+
declare const Masonry: $$IsomorphicComponent;
|
|
37
|
+
type Masonry<Item> = InstanceType<typeof Masonry<Item>>;
|
|
38
|
+
export default Masonry;
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"homepage": "https://janosh.github.io/svelte-bricks",
|
|
6
6
|
"repository": "https://github.com/janosh/svelte-bricks",
|
|
7
7
|
"license": "MIT",
|
|
8
|
-
"version": "0.
|
|
8
|
+
"version": "0.3.1",
|
|
9
9
|
"type": "module",
|
|
10
10
|
"svelte": "./dist/index.js",
|
|
11
11
|
"bugs": "https://github.com/janosh/svelte-bricks/issues",
|
|
@@ -20,28 +20,21 @@
|
|
|
20
20
|
"changelog": "npx auto-changelog --package --output changelog.md --hide-credit --commit-limit false"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"svelte": "^
|
|
23
|
+
"svelte": "^5.22.6"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
|
-
"@sveltejs/adapter-static": "^
|
|
27
|
-
"@sveltejs/kit": "^
|
|
28
|
-
"@sveltejs/package": "^2.
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"svelte-preprocess": "^5.0.4",
|
|
39
|
-
"svelte-toc": "^0.5.6",
|
|
40
|
-
"svelte-zoo": "^0.4.9",
|
|
41
|
-
"svelte2tsx": "^0.6.22",
|
|
42
|
-
"typescript": "^5.2.2",
|
|
43
|
-
"vite": "^4.4.9",
|
|
44
|
-
"vitest": "^0.34.5"
|
|
26
|
+
"@sveltejs/adapter-static": "^3.0.8",
|
|
27
|
+
"@sveltejs/kit": "^2.19.0",
|
|
28
|
+
"@sveltejs/package": "^2.3.10",
|
|
29
|
+
"jsdom": "^26.0.0",
|
|
30
|
+
"mdsvex": "^0.12.3",
|
|
31
|
+
"svelte-check": "^4.1.5",
|
|
32
|
+
"svelte-preprocess": "^6.0.3",
|
|
33
|
+
"svelte-toc": "^0.5.9",
|
|
34
|
+
"svelte-zoo": "^0.4.16",
|
|
35
|
+
"svelte2tsx": "^0.7.35",
|
|
36
|
+
"vite": "^6.2.1",
|
|
37
|
+
"vitest": "^3.0.8"
|
|
45
38
|
},
|
|
46
39
|
"keywords": [
|
|
47
40
|
"svelte",
|
package/readme.md
CHANGED
|
@@ -33,26 +33,27 @@ The kitchen sink for this component looks something like this:
|
|
|
33
33
|
<script>
|
|
34
34
|
import Masonry from 'svelte-bricks'
|
|
35
35
|
|
|
36
|
-
let nItems = 30
|
|
37
|
-
|
|
36
|
+
let nItems = $state(30);
|
|
37
|
+
let items = $derived([...Array(nItems).keys()])
|
|
38
38
|
|
|
39
39
|
let [minColWidth, maxColWidth, gap] = [200, 800, 20]
|
|
40
|
-
let width, height
|
|
40
|
+
let width = $state(0), height = $state(0)
|
|
41
41
|
</script>
|
|
42
42
|
|
|
43
|
-
Masonry size: <span>{width}px</span> × <span>{height}px</span> (w ×
|
|
44
|
-
h)
|
|
43
|
+
Masonry size: <span>{width}px</span> × <span>{height}px</span> (w × h)
|
|
45
44
|
|
|
46
45
|
<Masonry
|
|
47
46
|
{items}
|
|
48
47
|
{minColWidth}
|
|
49
48
|
{maxColWidth}
|
|
50
49
|
{gap}
|
|
51
|
-
|
|
50
|
+
|
|
52
51
|
bind:masonryWidth={width}
|
|
53
52
|
bind:masonryHeight={height}
|
|
54
53
|
>
|
|
55
|
-
|
|
54
|
+
{#snippet children({ item })}
|
|
55
|
+
<Some {item} />
|
|
56
|
+
{/snippet}
|
|
56
57
|
</Masonry>
|
|
57
58
|
```
|
|
58
59
|
|
|
@@ -72,6 +73,21 @@ Additional optional props are:
|
|
|
72
73
|
|
|
73
74
|
Whether to [FLIP-animate](https://svelte.dev/tutorial/animate) masonry items when viewport resizing or other events cause `items` to rearrange.
|
|
74
75
|
|
|
76
|
+
1. ```ts
|
|
77
|
+
calcCols = (
|
|
78
|
+
masonryWidth: number,
|
|
79
|
+
minColWidth: number,
|
|
80
|
+
gap: number,
|
|
81
|
+
): number => {
|
|
82
|
+
return Math.min(
|
|
83
|
+
items.length,
|
|
84
|
+
Math.floor((masonryWidth + gap) / (minColWidth + gap)) || 1,
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Function used to compute the number of columns based on the masonry width, minimum column width and gap.
|
|
90
|
+
|
|
75
91
|
1. ```ts
|
|
76
92
|
class: string = ``
|
|
77
93
|
```
|