@refrakt-md/svelte 0.1.0 → 0.3.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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@refrakt-md/svelte",
3
3
  "description": "Svelte renderer for refrakt.md content",
4
- "version": "0.1.0",
4
+ "version": "0.3.0",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -27,7 +27,7 @@
27
27
  ],
28
28
  "dependencies": {
29
29
  "@markdoc/markdoc": "0.4.0",
30
- "@refrakt-md/types": "0.1.0"
30
+ "@refrakt-md/types": "0.3.0"
31
31
  },
32
32
  "peerDependencies": {
33
33
  "svelte": "^5.0.0"
@@ -25,9 +25,9 @@
25
25
  }
26
26
 
27
27
  const globalOverrides = getElementOverrides();
28
- const merged = overrides
28
+ const merged = $derived(overrides
29
29
  ? { ...globalOverrides, ...overrides }
30
- : globalOverrides;
30
+ : globalOverrides);
31
31
  </script>
32
32
 
33
33
  {#if Array.isArray(node)}
@@ -4,6 +4,19 @@
4
4
  import { setContext } from 'svelte';
5
5
  import { matchRouteRule } from './route-rules.js';
6
6
 
7
+ interface OgMeta {
8
+ title?: string;
9
+ description?: string;
10
+ image?: string;
11
+ type?: string;
12
+ url?: string;
13
+ }
14
+
15
+ interface PageSeo {
16
+ jsonLd: object[];
17
+ og: OgMeta;
18
+ }
19
+
7
20
  interface PageData {
8
21
  title: string;
9
22
  description: string;
@@ -11,13 +24,17 @@
11
24
  renderable: any;
12
25
  pages: Array<{ url: string; title: string; draft: boolean }>;
13
26
  url: string;
27
+ seo?: PageSeo;
14
28
  }
15
29
 
16
30
  let { theme, page }: { theme: SvelteTheme; page: PageData } = $props();
17
31
 
18
32
  // Wire theme into Svelte context
33
+ // svelte-ignore state_referenced_locally
19
34
  setRegistry(theme.components);
35
+ // svelte-ignore state_referenced_locally
20
36
  if (theme.elements) setElementOverrides(theme.elements);
37
+ // svelte-ignore state_referenced_locally
21
38
  setContext('pages', page.pages);
22
39
 
23
40
  // Pick layout via route rules (reactive so layout updates on client-side navigation)
@@ -26,8 +43,33 @@
26
43
  </script>
27
44
 
28
45
  <svelte:head>
29
- {#if page.title}<title>{page.title}</title>{/if}
30
- {#if page.description}<meta name="description" content={page.description} />{/if}
46
+ {#if page.seo?.og.title}
47
+ <title>{page.seo.og.title}</title>
48
+ <meta property="og:title" content={page.seo.og.title} />
49
+ {:else if page.title}
50
+ <title>{page.title}</title>
51
+ {/if}
52
+ {#if page.seo?.og.description}
53
+ <meta name="description" content={page.seo.og.description} />
54
+ <meta property="og:description" content={page.seo.og.description} />
55
+ {:else if page.description}
56
+ <meta name="description" content={page.description} />
57
+ {/if}
58
+ {#if page.seo?.og.image}
59
+ <meta property="og:image" content={page.seo.og.image} />
60
+ <meta name="twitter:card" content="summary_large_image" />
61
+ {/if}
62
+ {#if page.seo?.og.url}
63
+ <meta property="og:url" content={page.seo.og.url} />
64
+ {/if}
65
+ {#if page.seo?.og.type}
66
+ <meta property="og:type" content={page.seo.og.type} />
67
+ {/if}
68
+ {#if page.seo}
69
+ {#each page.seo.jsonLd as schema}
70
+ {@html `<script type="application/ld+json">${JSON.stringify(schema)}</script>`}
71
+ {/each}
72
+ {/if}
31
73
  </svelte:head>
32
74
 
33
75
  {#if Layout}