@functionalcms/svelte-components 5.5.9 → 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.
@@ -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,9 @@
1
+ export type BlogPost = {
2
+ slug: string;
3
+ title: string;
4
+ description: string;
5
+ date: string;
6
+ author: string;
7
+ tags: string[];
8
+ image: string;
9
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { BlogPost } from "./Post";
2
+ export declare const getPosts: () => Array<BlogPost>;
3
+ export declare const getTags: () => Record<string, number>;
@@ -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
+ };
@@ -5,7 +5,7 @@ export { machineAuthenticationHandle } from './server-side/auth/machine_authenti
5
5
  export { userAuthenticationProvider } from './server-side/auth/userAuthenticationProvider.js';
6
6
  export { hookSequence } from './server-side/functionalSequence.js';
7
7
  export { sessionStorageHandler } from './server-side/handlers/sessionStorageHandler.js';
8
- export { getCommunicationService, getDataService, getTemplateService, getWebsiteService, getFileService, getUsersService } from './server-side/getServices.js';
8
+ export { getCommunicationService, getDataService, getTemplateService, getWebsiteService, getFileService, getUsersService, getSetupService } from './server-side/getServices.js';
9
9
  export type { RedirectResponse } from './server-side/auth/RedirectResponse.js';
10
10
  export { isHuman } from './components/form/AntiBot.js';
11
11
  export { paraglideHandler } from './server-side/handlers/paraglideHandler.js';
@@ -5,7 +5,7 @@ export { machineAuthenticationHandle } from './server-side/auth/machine_authenti
5
5
  export { userAuthenticationProvider } from './server-side/auth/userAuthenticationProvider.js';
6
6
  export { hookSequence } from './server-side/functionalSequence.js';
7
7
  export { sessionStorageHandler } from './server-side/handlers/sessionStorageHandler.js';
8
- export { getCommunicationService, getDataService, getTemplateService, getWebsiteService, getFileService, getUsersService } from './server-side/getServices.js';
8
+ export { getCommunicationService, getDataService, getTemplateService, getWebsiteService, getFileService, getUsersService, getSetupService } from './server-side/getServices.js';
9
9
  export { isHuman } from './components/form/AntiBot.js';
10
10
  export { paraglideHandler } from './server-side/handlers/paraglideHandler.js';
11
11
  export { redirectPipelineHandler } from './server-side/handlers/redirectPipelineHandler.js';
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';
@@ -1,4 +1,4 @@
1
- import { CommunicationService, DataService, TemplateService, WebsitesService, FilesService, UsersService } from "@functionalcms/services";
1
+ import { CommunicationService, DataService, TemplateService, WebsitesService, FilesService, UsersService, SetupService } from "@functionalcms/services";
2
2
  import type { Locals } from "./types.js";
3
3
  export declare const getDataService: (locals: Locals, endpoint: string) => DataService;
4
4
  export declare const getCommunicationService: (locals: Locals, endpoint: string) => CommunicationService;
@@ -6,3 +6,4 @@ export declare const getWebsiteService: (locals: Locals, endpoint: string) => We
6
6
  export declare const getTemplateService: (locals: Locals, endpoint: string) => TemplateService;
7
7
  export declare const getFileService: (locals: Locals, endpoint: string) => FilesService;
8
8
  export declare const getUsersService: (locals: Locals, endpoint: string) => UsersService;
9
+ export declare const getSetupService: (locals: Locals, endpoint: string) => SetupService;
@@ -1,4 +1,4 @@
1
- import { CommunicationService, DataService, TemplateService, WebsitesService, FilesService, UsersService, } from "@functionalcms/services";
1
+ import { CommunicationService, DataService, TemplateService, WebsitesService, FilesService, UsersService, SetupService, } from "@functionalcms/services";
2
2
  const getAccessToken = (locals) => locals.token;
3
3
  export const getDataService = (locals, endpoint) => {
4
4
  const accessToken = getAccessToken(locals);
@@ -30,3 +30,8 @@ export const getUsersService = (locals, endpoint) => {
30
30
  const service = new UsersService(accessToken, endpoint);
31
31
  return service;
32
32
  };
33
+ export const getSetupService = (locals, endpoint) => {
34
+ const accessToken = getAccessToken(locals);
35
+ const service = new SetupService(accessToken, endpoint);
36
+ return service;
37
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@functionalcms/svelte-components",
3
- "version": "5.5.9",
3
+ "version": "5.6.0",
4
4
  "license": "MIT",
5
5
  "watch": {
6
6
  "build": {
@@ -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
  },