@farming-labs/svelte-theme 0.0.2-beta.11 → 0.0.2-beta.13

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,6 +1,6 @@
1
1
  {
2
2
  "name": "@farming-labs/svelte-theme",
3
- "version": "0.0.2-beta.11",
3
+ "version": "0.0.2-beta.13",
4
4
  "description": "Svelte UI components for @farming-labs/docs — layout, sidebar, TOC, search, and theme toggle",
5
5
  "type": "module",
6
6
  "svelte": "./src/index.js",
@@ -49,8 +49,8 @@
49
49
  "dependencies": {
50
50
  "gray-matter": "^4.0.3",
51
51
  "sugar-high": "^0.9.5",
52
- "@farming-labs/docs": "0.0.2-beta.11",
53
- "@farming-labs/svelte": "0.0.2-beta.11"
52
+ "@farming-labs/docs": "0.0.2-beta.13",
53
+ "@farming-labs/svelte": "0.0.2-beta.13"
54
54
  },
55
55
  "peerDependencies": {
56
56
  "svelte": ">=5.0.0"
@@ -8,6 +8,24 @@
8
8
  ? config.metadata.titleTemplate.replace("%s", "")
9
9
  : " – Docs"
10
10
  );
11
+
12
+ let tocEnabled = $derived(
13
+ config?.theme?.ui?.layout?.toc?.enabled ?? true
14
+ );
15
+
16
+ let breadcrumbEnabled = $derived.by(() => {
17
+ const bc = config?.breadcrumb;
18
+ if (bc === undefined || bc === true) return true;
19
+ if (bc === false) return false;
20
+ if (typeof bc === "object") return bc.enabled !== false;
21
+ return true;
22
+ });
23
+
24
+ let showEditOnGithub = $derived(
25
+ !!config?.github && !!data.editOnGithub
26
+ );
27
+
28
+ let showLastModified = $derived(!!data.lastModified);
11
29
  </script>
12
30
 
13
31
  <svelte:head>
@@ -19,12 +37,12 @@
19
37
 
20
38
  <DocsPage
21
39
  entry={config?.entry ?? "docs"}
22
- tocEnabled={true}
23
- breadcrumbEnabled={config?.breadcrumb?.enabled ?? true}
40
+ {tocEnabled}
41
+ {breadcrumbEnabled}
24
42
  previousPage={data.previousPage}
25
43
  nextPage={data.nextPage}
26
- editOnGithub={data.editOnGithub}
27
- lastModified={data.lastModified}
44
+ editOnGithub={showEditOnGithub ? data.editOnGithub : null}
45
+ lastModified={showLastModified ? data.lastModified : null}
28
46
  >
29
47
  {#snippet children()}
30
48
  {@html data.html}
@@ -3,19 +3,56 @@
3
3
  import AskAIDialog from "./AskAIDialog.svelte";
4
4
  import FloatingAIChat from "./FloatingAIChat.svelte";
5
5
  import { page } from "$app/stores";
6
+ import { onMount } from "svelte";
6
7
 
7
8
  let {
8
9
  tree,
9
10
  config = null,
10
11
  title = undefined,
11
12
  titleUrl = undefined,
12
- themeToggle = true,
13
13
  children,
14
14
  } = $props();
15
15
 
16
16
  let resolvedTitle = $derived(title ?? config?.nav?.title ?? "Docs");
17
17
  let resolvedTitleUrl = $derived(titleUrl ?? config?.nav?.url ?? "/docs");
18
18
 
19
+ let showThemeToggle = $derived.by(() => {
20
+ const toggle = config?.themeToggle;
21
+ if (toggle === undefined || toggle === true) return true;
22
+ if (toggle === false) return false;
23
+ if (typeof toggle === "object") return toggle.enabled !== false;
24
+ return true;
25
+ });
26
+
27
+ let forcedTheme = $derived.by(() => {
28
+ const toggle = config?.themeToggle;
29
+ if (typeof toggle === "object" && toggle.enabled === false && toggle.default && toggle.default !== "system") {
30
+ return toggle.default;
31
+ }
32
+ return null;
33
+ });
34
+
35
+ let themeInitScript = $derived.by(() => {
36
+ if (forcedTheme) {
37
+ return `document.documentElement.classList.remove('light','dark');document.documentElement.classList.add('${forcedTheme}')`;
38
+ }
39
+ return [
40
+ "(function(){",
41
+ "var m=document.cookie.match(/(?:^|;\\s*)theme=(\\w+)/);",
42
+ "var t=m?m[1]:(window.matchMedia('(prefers-color-scheme:dark)').matches?'dark':'light');",
43
+ "document.documentElement.classList.remove('light','dark');",
44
+ "document.documentElement.classList.add(t);",
45
+ "})()",
46
+ ].join("");
47
+ });
48
+
49
+ onMount(() => {
50
+ if (forcedTheme) {
51
+ document.documentElement.classList.remove("light", "dark");
52
+ document.documentElement.classList.add(forcedTheme);
53
+ }
54
+ });
55
+
19
56
  let sidebarOpen = $state(false);
20
57
  let searchOpen = $state(false);
21
58
 
@@ -82,6 +119,10 @@
82
119
 
83
120
  <svelte:window onkeydown={handleKeydown} />
84
121
 
122
+ <svelte:head>
123
+ {@html `<script>${themeInitScript}</script>`}
124
+ </svelte:head>
125
+
85
126
  <div class="fd-layout">
86
127
  <!-- Mobile header -->
87
128
  <header class="fd-header">
@@ -227,7 +268,7 @@
227
268
  {/if}
228
269
  </nav>
229
270
 
230
- {#if themeToggle}
271
+ {#if showThemeToggle}
231
272
  <div class="fd-sidebar-footer">
232
273
  <ThemeToggle />
233
274
  </div>
@@ -8,7 +8,14 @@
8
8
  let theme = $state("light");
9
9
 
10
10
  onMount(() => {
11
- theme = document.documentElement.classList.contains("dark") ? "dark" : "light";
11
+ if (document.documentElement.classList.contains("dark")) {
12
+ theme = "dark";
13
+ } else if (document.documentElement.classList.contains("light")) {
14
+ theme = "light";
15
+ } else {
16
+ theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
17
+ document.documentElement.classList.add(theme);
18
+ }
12
19
  });
13
20
 
14
21
  function toggle() {