@functionalcms/svelte-components 5.5.10 → 5.6.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/dist/components/blog/BlogList.svelte +85 -0
- package/dist/components/blog/BlogList.svelte.d.ts +14 -0
- package/dist/components/blog/BlogTagList.svelte +27 -0
- package/dist/components/blog/BlogTagList.svelte.d.ts +14 -0
- package/dist/components/blog/Post.d.ts +9 -0
- package/dist/components/blog/Post.js +1 -0
- package/dist/components/blog/blogService.d.ts +3 -0
- package/dist/components/blog/blogService.js +36 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/package.json +3 -2
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Gallery, type ImgType } from "flowbite-svelte";
|
|
3
|
+
import type { BlogPost } from "./Post";
|
|
4
|
+
import type { Snippet } from "svelte";
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
posts: BlogPost[];
|
|
8
|
+
columns?: number;
|
|
9
|
+
gap?: number;
|
|
10
|
+
renderItem?: Snippet<[item: ImgType]>;
|
|
11
|
+
}
|
|
12
|
+
let {
|
|
13
|
+
posts,
|
|
14
|
+
columns = 2,
|
|
15
|
+
gap = 4,
|
|
16
|
+
renderItem = undefined,
|
|
17
|
+
}: Props = $props();
|
|
18
|
+
|
|
19
|
+
let gridColukmns = $derived(`grid-cols-${columns} gap-${gap} `);
|
|
20
|
+
|
|
21
|
+
function formatDate(dateString: string) {
|
|
22
|
+
const date = new Date(dateString);
|
|
23
|
+
return date.toLocaleDateString("pl-PL", {
|
|
24
|
+
year: "numeric",
|
|
25
|
+
month: "long",
|
|
26
|
+
day: "numeric",
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
{#snippet defaultRender(post)}
|
|
32
|
+
<article
|
|
33
|
+
class="border rounded-lg overflow-hidden shadow-lg hover:shadow-xl transition-shadow"
|
|
34
|
+
>
|
|
35
|
+
{#if post.image}
|
|
36
|
+
<img
|
|
37
|
+
src={post.image}
|
|
38
|
+
alt={post.title}
|
|
39
|
+
class="w-full h-48 object-cover"
|
|
40
|
+
/>
|
|
41
|
+
{/if}
|
|
42
|
+
|
|
43
|
+
<div class="p-6">
|
|
44
|
+
<div class="text-sm text-gray-600 mb-2">
|
|
45
|
+
{formatDate(post.date)} · {post.author}
|
|
46
|
+
</div>
|
|
47
|
+
|
|
48
|
+
<h2 class="text-2xl font-bold mb-3">
|
|
49
|
+
<a
|
|
50
|
+
href="/blog/{post.slug}"
|
|
51
|
+
class="hover:text-blue-600 transition-colors"
|
|
52
|
+
>
|
|
53
|
+
{post.title}
|
|
54
|
+
</a>
|
|
55
|
+
</h2>
|
|
56
|
+
|
|
57
|
+
<p class="text-gray-700 mb-4">{post.description}</p>
|
|
58
|
+
|
|
59
|
+
<div class="flex flex-wrap gap-2 mb-4">
|
|
60
|
+
{#each post.tags as tag}
|
|
61
|
+
<span class="text-xs bg-gray-200 px-2 py-1 rounded"
|
|
62
|
+
>{tag}</span
|
|
63
|
+
>
|
|
64
|
+
{/each}
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
<a
|
|
68
|
+
href="/blog/{post.slug}"
|
|
69
|
+
class="text-blue-600 hover:text-blue-800 font-medium"
|
|
70
|
+
>
|
|
71
|
+
Czytaj więcej →
|
|
72
|
+
</a>
|
|
73
|
+
</div>
|
|
74
|
+
</article>
|
|
75
|
+
{/snippet}
|
|
76
|
+
|
|
77
|
+
<Gallery class={gridColukmns} items={posts} let:item>
|
|
78
|
+
{#snippet figure(item)}
|
|
79
|
+
{#if renderItem}
|
|
80
|
+
{@render renderItem(item)}
|
|
81
|
+
{:else}
|
|
82
|
+
{@render defaultRender(item)}
|
|
83
|
+
{/if}
|
|
84
|
+
{/snippet}
|
|
85
|
+
</Gallery>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: Record<string, never>;
|
|
4
|
+
events: {
|
|
5
|
+
[evt: string]: CustomEvent<any>;
|
|
6
|
+
};
|
|
7
|
+
slots: {};
|
|
8
|
+
};
|
|
9
|
+
export type BlogListProps = typeof __propDef.props;
|
|
10
|
+
export type BlogListEvents = typeof __propDef.events;
|
|
11
|
+
export type BlogListSlots = typeof __propDef.slots;
|
|
12
|
+
export default class BlogList extends SvelteComponentTyped<BlogListProps, BlogListEvents, BlogListSlots> {
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Gallery, type ImgType } from "flowbite-svelte";
|
|
3
|
+
import type { BlogPost } from "./Post";
|
|
4
|
+
import type { Snippet } from "svelte";
|
|
5
|
+
import { getTags } from "./blogService";
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
posts: BlogPost[];
|
|
9
|
+
renderItem?: Snippet<[item: ImgType]>;
|
|
10
|
+
}
|
|
11
|
+
let { posts, renderItem = undefined }: Props = $props();
|
|
12
|
+
|
|
13
|
+
let tags = $derived(getTags());
|
|
14
|
+
console.log(tags)
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
Tag list
|
|
18
|
+
<!--
|
|
19
|
+
<Gallery class={gridColukmns} items={posts} let:item>
|
|
20
|
+
{#snippet figure(item)}
|
|
21
|
+
{#if renderItem}
|
|
22
|
+
{@render renderItem(item)}
|
|
23
|
+
{:else}
|
|
24
|
+
{@render defaultRender(item)}
|
|
25
|
+
{/if}
|
|
26
|
+
{/snippet}
|
|
27
|
+
</Gallery> -->
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: Record<string, never>;
|
|
4
|
+
events: {
|
|
5
|
+
[evt: string]: CustomEvent<any>;
|
|
6
|
+
};
|
|
7
|
+
slots: {};
|
|
8
|
+
};
|
|
9
|
+
export type BlogTagListProps = typeof __propDef.props;
|
|
10
|
+
export type BlogTagListEvents = typeof __propDef.events;
|
|
11
|
+
export type BlogTagListSlots = typeof __propDef.slots;
|
|
12
|
+
export default class BlogTagList extends SvelteComponentTyped<BlogTagListProps, BlogTagListEvents, BlogTagListSlots> {
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export const getPosts = () => {
|
|
2
|
+
const postFiles = import.meta.glob('/src/posts/*.md', { eager: true });
|
|
3
|
+
const posts = Object.entries(postFiles).map(([path, post]) => {
|
|
4
|
+
const slug = path.split('/').pop()?.replace('.md', '') || '';
|
|
5
|
+
const { metadata } = post;
|
|
6
|
+
return {
|
|
7
|
+
slug,
|
|
8
|
+
title: metadata.title,
|
|
9
|
+
description: metadata.description,
|
|
10
|
+
date: metadata.date,
|
|
11
|
+
author: metadata.author,
|
|
12
|
+
tags: metadata.tags,
|
|
13
|
+
image: metadata.image
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
// Sort by date descending
|
|
17
|
+
posts.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
|
|
18
|
+
return posts;
|
|
19
|
+
};
|
|
20
|
+
export const getTags = () => {
|
|
21
|
+
let posts = getPosts();
|
|
22
|
+
let tags = posts
|
|
23
|
+
.reduce((acc, post) => {
|
|
24
|
+
post
|
|
25
|
+
.tags
|
|
26
|
+
.forEach(tag => {
|
|
27
|
+
if (acc[tag] == undefined) {
|
|
28
|
+
acc[tag] = 0;
|
|
29
|
+
}
|
|
30
|
+
;
|
|
31
|
+
acc[tag]++;
|
|
32
|
+
});
|
|
33
|
+
return acc;
|
|
34
|
+
}, {});
|
|
35
|
+
return tags;
|
|
36
|
+
};
|
package/dist/index.d.ts
CHANGED
|
@@ -18,3 +18,7 @@ export { type Icons, SolidIcons, OutlinedIcons } from './components/icons.js';
|
|
|
18
18
|
export { default as Icon } from './components/Icon.svelte';
|
|
19
19
|
export * from "flowbite-svelte";
|
|
20
20
|
export { hashString } from './utils/stringHash.js';
|
|
21
|
+
export { default as BlogList } from './components/blog/BlogList.svelte';
|
|
22
|
+
export { type BlogPost } from './components/blog/Post.js';
|
|
23
|
+
export { type getTags } from './components/blog/blogService.js';
|
|
24
|
+
export { getPosts } from './components/blog/blogService.js';
|
package/dist/index.js
CHANGED
|
@@ -17,3 +17,7 @@ export { SolidIcons, OutlinedIcons } from './components/icons.js';
|
|
|
17
17
|
export { default as Icon } from './components/Icon.svelte';
|
|
18
18
|
export * from "flowbite-svelte";
|
|
19
19
|
export { hashString } from './utils/stringHash.js';
|
|
20
|
+
export { default as BlogList } from './components/blog/BlogList.svelte';
|
|
21
|
+
export {} from './components/blog/Post.js';
|
|
22
|
+
export {} from './components/blog/blogService.js';
|
|
23
|
+
export { getPosts } from './components/blog/blogService.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@functionalcms/svelte-components",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.6.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"watch": {
|
|
6
6
|
"build": {
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"svelte": "./dist/index-server.js"
|
|
33
33
|
},
|
|
34
34
|
"./css/functional.css": "./css/functional.css",
|
|
35
|
-
"./package.json": "./package.json"
|
|
35
|
+
"./package.json": "./package.json"
|
|
36
36
|
},
|
|
37
37
|
"files": [
|
|
38
38
|
"dist",
|
|
@@ -61,6 +61,7 @@
|
|
|
61
61
|
"flowbite": "^4.0.1",
|
|
62
62
|
"flowbite-svelte": "^1.31.0",
|
|
63
63
|
"flowbite-svelte-icons": "^3.1.0",
|
|
64
|
+
"mdsvex": "^0.12.7",
|
|
64
65
|
"oauth4webapi": "^3.8.5",
|
|
65
66
|
"tailwindcss": "^4.2.2"
|
|
66
67
|
},
|