blume 2.2.3 → 2.2.4
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/CHANGELOG.md +8 -0
- package/THIRD-PARTY-NOTICES.md +51 -0
- package/dist/cli/{chunk-b7n58hgj.js → chunk-0b1a8xqz.js} +3 -3
- package/dist/cli/{chunk-8h2t2vyj.js → chunk-0qx6vwwf.js} +2 -2
- package/dist/cli/{chunk-qax1aekz.js → chunk-3ps63r91.js} +1 -1
- package/dist/cli/{chunk-2f6btenb.js → chunk-402xaaxn.js} +3 -3
- package/dist/cli/{chunk-0xyedh7k.js → chunk-49xa4yf2.js} +2 -2
- package/dist/cli/{chunk-znwhf37a.js → chunk-51wr1wre.js} +1 -1
- package/dist/cli/{chunk-akj2p7k1.js → chunk-531qbwn1.js} +6 -6
- package/dist/cli/{chunk-hwjspffr.js → chunk-5bp65pv4.js} +4 -3
- package/dist/cli/{chunk-hwjspffr.js.map → chunk-5bp65pv4.js.map} +3 -3
- package/dist/cli/{chunk-88zkpg89.js → chunk-6nvcjzts.js} +2 -2
- package/dist/cli/{chunk-6xag1c83.js → chunk-6v5w8vzd.js} +4 -4
- package/dist/cli/{chunk-0ynr0fr7.js → chunk-8cshtem6.js} +5 -5
- package/dist/cli/{chunk-x0jqyq1g.js → chunk-8h5ceyk0.js} +6 -6
- package/dist/cli/{chunk-1ay3hzn0.js → chunk-8v90n67z.js} +3 -3
- package/dist/cli/{chunk-xv8nkt56.js → chunk-98me5yas.js} +14 -14
- package/dist/cli/{chunk-pxp1y6yz.js → chunk-9k7gg4ga.js} +9 -9
- package/dist/cli/{chunk-pxp1y6yz.js.map → chunk-9k7gg4ga.js.map} +2 -2
- package/dist/cli/{chunk-psg2za5z.js → chunk-9qmc57zw.js} +3 -3
- package/dist/cli/{chunk-b664x65a.js → chunk-a1xmzxk2.js} +16 -16
- package/dist/cli/{chunk-426rytg6.js → chunk-ajw85dgf.js} +2 -2
- package/dist/cli/{chunk-ry2ymbxf.js → chunk-ansqj08e.js} +5 -5
- package/dist/cli/{chunk-rc2qk3qx.js → chunk-b0vwhmdf.js} +2 -2
- package/dist/cli/{chunk-xkx216rd.js → chunk-b5gztt4j.js} +17 -17
- package/dist/cli/{chunk-c0qddrxr.js → chunk-bc4jz2m4.js} +1 -1
- package/dist/cli/{chunk-x25s4gph.js → chunk-d4h1y312.js} +1 -1
- package/dist/cli/{chunk-0wt5amrk.js → chunk-et7zwqkg.js} +15 -15
- package/dist/cli/{chunk-88q28zav.js → chunk-f29q3j13.js} +3 -3
- package/dist/cli/{chunk-zj6bcx0n.js → chunk-f72388jn.js} +2 -2
- package/dist/cli/{chunk-9emfspcp.js → chunk-g0hpwbyx.js} +4 -4
- package/dist/cli/{chunk-p4fe7tax.js → chunk-j102xmnk.js} +7 -7
- package/dist/cli/{chunk-8fm3b4vm.js → chunk-m54bz9ng.js} +6 -6
- package/dist/cli/{chunk-r5ajrw1g.js → chunk-mt6njy68.js} +2 -2
- package/dist/cli/{chunk-982qfeny.js → chunk-n091sgam.js} +6 -6
- package/dist/cli/{chunk-zjfwzrvd.js → chunk-p33bf2nb.js} +14 -14
- package/dist/cli/{chunk-zgca0vxs.js → chunk-saxq5jjr.js} +2 -2
- package/dist/cli/{chunk-5xq12jz7.js → chunk-sbt1s5j2.js} +17 -17
- package/dist/cli/{chunk-t43g7v22.js → chunk-tckd6qwv.js} +2 -2
- package/dist/cli/{chunk-g62vnvaw.js → chunk-tf4134kk.js} +5 -5
- package/dist/cli/{chunk-gc7knd2s.js → chunk-vxdjss7f.js} +2 -2
- package/dist/cli/{chunk-5f96yq2c.js → chunk-x2pgg22t.js} +1 -1
- package/dist/cli/{chunk-yrmw5n2b.js → chunk-xhrwrzrh.js} +9 -9
- package/dist/cli/index.js +18 -18
- package/dist/types/core/config-input.d.ts +6 -0
- package/dist/types/core/schema.d.ts +1 -0
- package/docs/configuration/theming.mdx +13 -1
- package/package.json +4 -3
- package/skills/blume-migrate/references/docus.md +1 -2
- package/skills/blume-migrate/references/docusaurus.md +1 -1
- package/skills/blume-migrate/references/vitepress.md +2 -2
- package/skills/blume-migrate/references/vuepress.md +1 -1
- package/src/components/layout/Header.astro +18 -10
- package/src/components/layout/PageActions.astro +1 -0
- package/src/components/layout/PageLayout.astro +6 -1
- package/src/components/layout/ReferenceLayout.astro +6 -1
- package/src/components/layout/RootLayout.astro +6 -1
- package/src/components/layout/head-scripts.ts +5 -1
- package/src/core/config-input.ts +6 -0
- package/src/core/schema.ts +1 -0
- package/src/theme/chrome-icons.ts +2 -1
- package/src/theme/entry.ts +4 -1
- /package/dist/cli/{chunk-b7n58hgj.js.map → chunk-0b1a8xqz.js.map} +0 -0
- /package/dist/cli/{chunk-8h2t2vyj.js.map → chunk-0qx6vwwf.js.map} +0 -0
- /package/dist/cli/{chunk-qax1aekz.js.map → chunk-3ps63r91.js.map} +0 -0
- /package/dist/cli/{chunk-2f6btenb.js.map → chunk-402xaaxn.js.map} +0 -0
- /package/dist/cli/{chunk-0xyedh7k.js.map → chunk-49xa4yf2.js.map} +0 -0
- /package/dist/cli/{chunk-znwhf37a.js.map → chunk-51wr1wre.js.map} +0 -0
- /package/dist/cli/{chunk-akj2p7k1.js.map → chunk-531qbwn1.js.map} +0 -0
- /package/dist/cli/{chunk-88zkpg89.js.map → chunk-6nvcjzts.js.map} +0 -0
- /package/dist/cli/{chunk-6xag1c83.js.map → chunk-6v5w8vzd.js.map} +0 -0
- /package/dist/cli/{chunk-0ynr0fr7.js.map → chunk-8cshtem6.js.map} +0 -0
- /package/dist/cli/{chunk-x0jqyq1g.js.map → chunk-8h5ceyk0.js.map} +0 -0
- /package/dist/cli/{chunk-1ay3hzn0.js.map → chunk-8v90n67z.js.map} +0 -0
- /package/dist/cli/{chunk-xv8nkt56.js.map → chunk-98me5yas.js.map} +0 -0
- /package/dist/cli/{chunk-psg2za5z.js.map → chunk-9qmc57zw.js.map} +0 -0
- /package/dist/cli/{chunk-b664x65a.js.map → chunk-a1xmzxk2.js.map} +0 -0
- /package/dist/cli/{chunk-426rytg6.js.map → chunk-ajw85dgf.js.map} +0 -0
- /package/dist/cli/{chunk-ry2ymbxf.js.map → chunk-ansqj08e.js.map} +0 -0
- /package/dist/cli/{chunk-rc2qk3qx.js.map → chunk-b0vwhmdf.js.map} +0 -0
- /package/dist/cli/{chunk-xkx216rd.js.map → chunk-b5gztt4j.js.map} +0 -0
- /package/dist/cli/{chunk-c0qddrxr.js.map → chunk-bc4jz2m4.js.map} +0 -0
- /package/dist/cli/{chunk-x25s4gph.js.map → chunk-d4h1y312.js.map} +0 -0
- /package/dist/cli/{chunk-0wt5amrk.js.map → chunk-et7zwqkg.js.map} +0 -0
- /package/dist/cli/{chunk-88q28zav.js.map → chunk-f29q3j13.js.map} +0 -0
- /package/dist/cli/{chunk-zj6bcx0n.js.map → chunk-f72388jn.js.map} +0 -0
- /package/dist/cli/{chunk-9emfspcp.js.map → chunk-g0hpwbyx.js.map} +0 -0
- /package/dist/cli/{chunk-p4fe7tax.js.map → chunk-j102xmnk.js.map} +0 -0
- /package/dist/cli/{chunk-8fm3b4vm.js.map → chunk-m54bz9ng.js.map} +0 -0
- /package/dist/cli/{chunk-r5ajrw1g.js.map → chunk-mt6njy68.js.map} +0 -0
- /package/dist/cli/{chunk-982qfeny.js.map → chunk-n091sgam.js.map} +0 -0
- /package/dist/cli/{chunk-zjfwzrvd.js.map → chunk-p33bf2nb.js.map} +0 -0
- /package/dist/cli/{chunk-zgca0vxs.js.map → chunk-saxq5jjr.js.map} +0 -0
- /package/dist/cli/{chunk-5xq12jz7.js.map → chunk-sbt1s5j2.js.map} +0 -0
- /package/dist/cli/{chunk-t43g7v22.js.map → chunk-tckd6qwv.js.map} +0 -0
- /package/dist/cli/{chunk-g62vnvaw.js.map → chunk-tf4134kk.js.map} +0 -0
- /package/dist/cli/{chunk-gc7knd2s.js.map → chunk-vxdjss7f.js.map} +0 -0
- /package/dist/cli/{chunk-5f96yq2c.js.map → chunk-x2pgg22t.js.map} +0 -0
- /package/dist/cli/{chunk-yrmw5n2b.js.map → chunk-xhrwrzrh.js.map} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import"./chunk-
|
|
2
|
+
import"./chunk-5bp65pv4.js";
|
|
3
3
|
import {
|
|
4
4
|
packageRoot,
|
|
5
5
|
getBlumeVersion,
|
|
@@ -13,13 +13,13 @@ import"./chunk-zccbjcj0.js";
|
|
|
13
13
|
import {
|
|
14
14
|
AGENTS,
|
|
15
15
|
launchInstalledAgent
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-d4h1y312.js";
|
|
17
17
|
import {
|
|
18
18
|
scanProject
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-vxdjss7f.js";
|
|
20
20
|
import {
|
|
21
21
|
siteSkillName
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-b0vwhmdf.js";
|
|
23
23
|
|
|
24
24
|
// src/cli/commands/skill.ts
|
|
25
25
|
import { defineCommand } from "citty";
|
|
@@ -123,4 +123,4 @@ export {
|
|
|
123
123
|
};
|
|
124
124
|
|
|
125
125
|
//# debugId=8BB2AE139A5F70AE64756E2164756E21
|
|
126
|
-
//# sourceMappingURL=chunk-
|
|
126
|
+
//# sourceMappingURL=chunk-tf4134kk.js.map
|
|
@@ -90,7 +90,7 @@ import {
|
|
|
90
90
|
createModuleLoader,
|
|
91
91
|
resolveProjectContext,
|
|
92
92
|
loadConfig
|
|
93
|
-
} from "./chunk-
|
|
93
|
+
} from "./chunk-5bp65pv4.js";
|
|
94
94
|
import {
|
|
95
95
|
BlumeError,
|
|
96
96
|
locatePath,
|
|
@@ -4882,4 +4882,4 @@ var scanProject = async (root, options = {}) => {
|
|
|
4882
4882
|
export { directiveSource, normalizeFence, QUOTED_ATTR, metaTokens, RESERVED_META_KEYWORDS, isForeignKeyword, isLineRange, validateSearchPopularIcons, validateMcpClientIcons, validateNavTargets, gitEnv, realPath, gitRepositoryRoot, locateMdxFailure, findFolderMetaFiles, isWithin, scanProject };
|
|
4883
4883
|
|
|
4884
4884
|
//# debugId=C199F41EFA089E4F64756E2164756E21
|
|
4885
|
-
//# sourceMappingURL=chunk-
|
|
4885
|
+
//# sourceMappingURL=chunk-vxdjss7f.js.map
|
|
@@ -4,11 +4,11 @@ import {
|
|
|
4
4
|
discoverIslands,
|
|
5
5
|
discoverExamples,
|
|
6
6
|
missingDependencyDiagnostic
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-0qx6vwwf.js";
|
|
8
8
|
import {
|
|
9
9
|
discoverPages,
|
|
10
10
|
navTargetRoutes
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-5bp65pv4.js";
|
|
12
12
|
import {
|
|
13
13
|
packageRoot,
|
|
14
14
|
commandMeta,
|
|
@@ -23,24 +23,24 @@ import {
|
|
|
23
23
|
import {
|
|
24
24
|
ComponentOverridesError,
|
|
25
25
|
analyzeComponentOverrides
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-51wr1wre.js";
|
|
27
27
|
import {
|
|
28
28
|
validateNavTargets,
|
|
29
29
|
scanProject
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-vxdjss7f.js";
|
|
31
31
|
import"./chunk-zccbjcj0.js";
|
|
32
32
|
import"./chunk-jq5n4avg.js";
|
|
33
33
|
import {
|
|
34
34
|
unregisteredSnapshotDiagnostics
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-0b1a8xqz.js";
|
|
36
36
|
import {
|
|
37
37
|
servedFiles
|
|
38
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-f29q3j13.js";
|
|
39
39
|
import {
|
|
40
40
|
serverFeatures,
|
|
41
41
|
checkRequiredSecrets
|
|
42
|
-
} from "./chunk-
|
|
43
|
-
import"./chunk-
|
|
42
|
+
} from "./chunk-ajw85dgf.js";
|
|
43
|
+
import"./chunk-b0vwhmdf.js";
|
|
44
44
|
|
|
45
45
|
// src/cli/commands/doctor.ts
|
|
46
46
|
import { readFileSync } from "node:fs";
|
|
@@ -171,4 +171,4 @@ export {
|
|
|
171
171
|
};
|
|
172
172
|
|
|
173
173
|
//# debugId=A4A339755430C21A64756E2164756E21
|
|
174
|
-
//# sourceMappingURL=chunk-
|
|
174
|
+
//# sourceMappingURL=chunk-xhrwrzrh.js.map
|
package/dist/cli/index.js
CHANGED
|
@@ -725,24 +725,24 @@ var main = defineCommand({
|
|
|
725
725
|
version: getBlumeVersion()
|
|
726
726
|
},
|
|
727
727
|
subCommands: {
|
|
728
|
-
add: lazyCommand(commandMeta.add, () => import("./chunk-
|
|
729
|
-
audit: lazyCommand(commandMeta.audit, () => import("./chunk-
|
|
730
|
-
build: lazyCommand(commandMeta.build, () => import("./chunk-
|
|
731
|
-
check: lazyCommand(commandMeta.check, () => import("./chunk-
|
|
732
|
-
dev: lazyCommand(commandMeta.dev, () => import("./chunk-
|
|
733
|
-
doctor: lazyCommand(commandMeta.doctor, () => import("./chunk-
|
|
734
|
-
eject: lazyCommand(commandMeta.eject, () => import("./chunk-
|
|
735
|
-
eval: lazyCommand(commandMeta.eval, () => import("./chunk-
|
|
736
|
-
init: lazyCommand(commandMeta.init, () => import("./chunk-
|
|
737
|
-
"mcp-stdio": lazyCommand(commandMeta["mcp-stdio"], () => import("./chunk-
|
|
738
|
-
migrate: lazyCommand(commandMeta.migrate, () => import("./chunk-
|
|
739
|
-
preview: lazyCommand(commandMeta.preview, () => import("./chunk-
|
|
740
|
-
skill: lazyCommand(commandMeta.skill, () => import("./chunk-
|
|
741
|
-
sync: lazyCommand(commandMeta.sync, () => import("./chunk-
|
|
742
|
-
translate: lazyCommand(commandMeta.translate, () => import("./chunk-
|
|
743
|
-
upgrade: lazyCommand(commandMeta.upgrade, () => import("./chunk-
|
|
744
|
-
validate: lazyCommand(commandMeta.validate, () => import("./chunk-
|
|
745
|
-
version: lazyCommand(commandMeta.version, () => import("./chunk-
|
|
728
|
+
add: lazyCommand(commandMeta.add, () => import("./chunk-f72388jn.js"), "addCommand"),
|
|
729
|
+
audit: lazyCommand(commandMeta.audit, () => import("./chunk-n091sgam.js"), "auditCommand"),
|
|
730
|
+
build: lazyCommand(commandMeta.build, () => import("./chunk-b5gztt4j.js"), "buildCommand"),
|
|
731
|
+
check: lazyCommand(commandMeta.check, () => import("./chunk-a1xmzxk2.js"), "checkCommand"),
|
|
732
|
+
dev: lazyCommand(commandMeta.dev, () => import("./chunk-sbt1s5j2.js"), "devCommand"),
|
|
733
|
+
doctor: lazyCommand(commandMeta.doctor, () => import("./chunk-xhrwrzrh.js"), "doctorCommand"),
|
|
734
|
+
eject: lazyCommand(commandMeta.eject, () => import("./chunk-p33bf2nb.js"), "ejectCommand"),
|
|
735
|
+
eval: lazyCommand(commandMeta.eval, () => import("./chunk-531qbwn1.js"), "evalCommand"),
|
|
736
|
+
init: lazyCommand(commandMeta.init, () => import("./chunk-98me5yas.js"), "initCommand"),
|
|
737
|
+
"mcp-stdio": lazyCommand(commandMeta["mcp-stdio"], () => import("./chunk-3ps63r91.js"), "mcpStdioCommand"),
|
|
738
|
+
migrate: lazyCommand(commandMeta.migrate, () => import("./chunk-6nvcjzts.js"), "migrateCommand"),
|
|
739
|
+
preview: lazyCommand(commandMeta.preview, () => import("./chunk-ansqj08e.js"), "previewCommand"),
|
|
740
|
+
skill: lazyCommand(commandMeta.skill, () => import("./chunk-tf4134kk.js"), "skillCommand"),
|
|
741
|
+
sync: lazyCommand(commandMeta.sync, () => import("./chunk-et7zwqkg.js"), "syncCommand"),
|
|
742
|
+
translate: lazyCommand(commandMeta.translate, () => import("./chunk-8cshtem6.js"), "translateCommand"),
|
|
743
|
+
upgrade: lazyCommand(commandMeta.upgrade, () => import("./chunk-8h5ceyk0.js"), "upgradeCommand"),
|
|
744
|
+
validate: lazyCommand(commandMeta.validate, () => import("./chunk-m54bz9ng.js"), "validateCommand"),
|
|
745
|
+
version: lazyCommand(commandMeta.version, () => import("./chunk-6v5w8vzd.js"), "versionCommand")
|
|
746
746
|
}
|
|
747
747
|
});
|
|
748
748
|
loadEnvFiles(process.cwd());
|
|
@@ -435,6 +435,12 @@ export interface ThemeConfig {
|
|
|
435
435
|
mode?: "system" | "light" | "dark";
|
|
436
436
|
/** Corner radius scale. Defaults to `md`. */
|
|
437
437
|
radius?: RadiusScale;
|
|
438
|
+
/**
|
|
439
|
+
* Show the header's light/dark toggle. Defaults to `true`. `false` hides it
|
|
440
|
+
* and ignores any choice a reader saved earlier, so every page renders in
|
|
441
|
+
* `mode` (`system` follows the reader's OS setting).
|
|
442
|
+
*/
|
|
443
|
+
toggle?: boolean;
|
|
438
444
|
}
|
|
439
445
|
/** A curated link for the search dialog empty state. */
|
|
440
446
|
export interface SearchPopularLink {
|
|
@@ -4295,6 +4295,7 @@ export declare const blumeConfigSchema: z.ZodObject<{
|
|
|
4295
4295
|
md: "md";
|
|
4296
4296
|
lg: "lg";
|
|
4297
4297
|
}>>;
|
|
4298
|
+
toggle: z.ZodDefault<z.ZodBoolean>;
|
|
4298
4299
|
}, z.core.$strict>>;
|
|
4299
4300
|
title: z.ZodDefault<z.ZodString>;
|
|
4300
4301
|
toc: z.ZodPipe<z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
|
|
@@ -14,6 +14,7 @@ theme: {
|
|
|
14
14
|
accent: "teal", // a named preset or any CSS color
|
|
15
15
|
radius: "md", // none | sm | md | lg
|
|
16
16
|
mode: "system", // system | light | dark
|
|
17
|
+
toggle: true, // show the light/dark toggle
|
|
17
18
|
fonts: { // self-hosted Google Fonts
|
|
18
19
|
display: "inter",
|
|
19
20
|
body: "inter",
|
|
@@ -51,7 +52,18 @@ Text on an accent or action fill, like a button label or a step number, is white
|
|
|
51
52
|
- **`system`** (default) — follow the reader's OS preference
|
|
52
53
|
- **`light`** / **`dark`** — default to one scheme
|
|
53
54
|
|
|
54
|
-
A toggle in the header
|
|
55
|
+
A toggle in the header lets readers switch, and their choice is remembered across visits. Dark mode is applied with a `data-theme="dark"` attribute on the `<html>` element.
|
|
56
|
+
|
|
57
|
+
To ship a single scheme, set `toggle: false`. The header drops the toggle, and every page renders in `mode`, even for readers who picked the other scheme before the toggle was removed:
|
|
58
|
+
|
|
59
|
+
```ts blume.config.ts lineNumbers
|
|
60
|
+
theme: {
|
|
61
|
+
mode: "dark",
|
|
62
|
+
toggle: false,
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
With `mode: "system"`, `toggle: false` follows each reader's OS setting and gives them no way to override it.
|
|
55
67
|
|
|
56
68
|
### Fonts
|
|
57
69
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "blume",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.4",
|
|
4
4
|
"description": "The open-source docs framework for humans and agents.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agents",
|
|
@@ -36,7 +36,8 @@
|
|
|
36
36
|
"docs",
|
|
37
37
|
"skills",
|
|
38
38
|
"AGENTS.md",
|
|
39
|
-
"CHANGELOG.md"
|
|
39
|
+
"CHANGELOG.md",
|
|
40
|
+
"THIRD-PARTY-NOTICES.md"
|
|
40
41
|
],
|
|
41
42
|
"type": "module",
|
|
42
43
|
"types": "./dist/types/index.d.ts",
|
|
@@ -116,7 +117,7 @@
|
|
|
116
117
|
"@astrojs/mdx": "^8.0.2",
|
|
117
118
|
"@astrojs/node": "^11.1.6",
|
|
118
119
|
"@astrojs/react": "^7.0.0",
|
|
119
|
-
"@astrojs/vercel": "^11.0.
|
|
120
|
+
"@astrojs/vercel": "^11.0.14",
|
|
120
121
|
"@clack/prompts": "^1.8.0",
|
|
121
122
|
"@iconify-json/lucide": "^1.2.140",
|
|
122
123
|
"@iconify/types": "^2.0.0",
|
|
@@ -87,7 +87,7 @@ Read `app/app.config.ts` (`app.config.ts` at the project root on Nuxt 3), `nuxt.
|
|
|
87
87
|
| `toc.bottom.links` | `navigation.featured` (`to` → `href`). Report the move |
|
|
88
88
|
| `navigation.sub` | `navigation.tabs` (see Navigation). `'aside'` anchors have no Blume form; report |
|
|
89
89
|
| `docus.locale` (not `en`) | a one-locale `i18n` block |
|
|
90
|
-
| `docus.colorMode` | `theme.mode`.
|
|
90
|
+
| `docus.colorMode` | `theme.mode`. A forced mode also takes `theme.toggle: false` |
|
|
91
91
|
| `assistant.faqQuestions` | `ai.assistant.suggestions` (`[{ label }]`; flatten categories) |
|
|
92
92
|
| `ui.colors.primary` | `theme.accent`. Nuxt UI paints shade 500 in light mode and 400 in dark: a Blume preset of the same name, else `{ light, dark }` with those Tailwind values. **Not declared means Docus's emerald:** the site turns Blume's default color unless you offer `theme.accent: "green"`; report it either way |
|
|
93
93
|
| `--ui-radius: 0` in CSS | `theme.radius: "none"` |
|
|
@@ -275,7 +275,6 @@ Report each of these, and anything else you drop:
|
|
|
275
275
|
- Nuxt UI overrides and theme CSS that doesn't map
|
|
276
276
|
- a custom `seo.titleTemplate`, `seo.schema`, and the TOC title
|
|
277
277
|
- logo extras, and socials with no Blume platform
|
|
278
|
-
- a forced color mode (the toggle stays)
|
|
279
278
|
- `navigation.sub: 'aside'` anchors
|
|
280
279
|
- a header button that showed only on the landing page (now site-wide)
|
|
281
280
|
- **Navigation:** text-order sorting (`10.` before `2.`), and pages that sorted after a folder.
|
|
@@ -20,7 +20,7 @@ Read `themeConfig`, `presets`, and `plugins`:
|
|
|
20
20
|
| `themeConfig.navbar.items` (doc items) | `navigation.tabs` (for section links) |
|
|
21
21
|
| `themeConfig.navbar.items` (external/utility links — Blog, Discord…) | **`navigation.actions`** (`[{ label, href }]`, plain header links) to keep them in the header, or **`navigation.featured`** (`{ label, href, icon? }`, pinned above the sidebar on every route) if they should survive on phones; the GitHub link → the `github` config instead (it renders in the footer) |
|
|
22
22
|
| `themeConfig.navbar.items` (a `className`-styled button — "Get started", "Sign up") | **`navigation.cta`** (`{ label, href }`, the header's one filled button; a route the docs don't serve must be an absolute URL) |
|
|
23
|
-
| `themeConfig.colorMode.defaultMode` | `theme.mode` (`respectPrefersColorScheme: true` → `"system"`) |
|
|
23
|
+
| `themeConfig.colorMode.defaultMode` | `theme.mode` (`respectPrefersColorScheme: true` → `"system"`); `colorMode.disableSwitch: true` → `theme.toggle: false` |
|
|
24
24
|
| `themeConfig.prism.theme` / `.darkTheme` | `markdown.code.theme: { light, dark }` (map Prism theme names to Shiki themes, e.g. `github`/`github-dark`) |
|
|
25
25
|
| `themeConfig.metadata` / `themeConfig.image` | per-page `seo` frontmatter / `seo.og`; report what doesn't fit |
|
|
26
26
|
| `url` + `baseUrl` | **`url` → `deployment.site`**, unless the target host is Vercel or Netlify, which Blume auto-detects (see SKILL.md — GitHub Pages, a common Docusaurus host, is not one of them); `baseUrl` (when not `/`) → `deployment: { base: "/…" }`, or the `base` option of a host adapter (`vercel({ base })`) when the site also needs one |
|
|
@@ -48,7 +48,7 @@ Read the whole module and the helpers it imports (sidebars, nav, per-locale conf
|
|
|
48
48
|
| `rewrites` | **move each file to the path its rewrite produced**, so the URL stays put (`slug` only where moving is impossible). VitePress relative links are already written against the rewritten paths |
|
|
49
49
|
| `srcDir` / `srcExclude` | `content.root` / `content.exclude`, which adds to the defaults `**/_*` and `**/.*` |
|
|
50
50
|
| `outDir`, `assetsDir`, `cacheDir`, `ignoreDeadLinks`, `metaChunk`, `mpa` | drop |
|
|
51
|
-
| `appearance` | `'dark'
|
|
51
|
+
| `appearance` | `'dark'` → `theme.mode: "dark"`; `'force-dark'` → `theme: { mode: "dark", toggle: false }`; `false` → `theme: { mode: "light", toggle: false }`; `'force-auto'` → `theme.toggle: false`; `true` → omit |
|
|
52
52
|
| `lastUpdated: true` | `lastModified: "git"` |
|
|
53
53
|
| `sitemap.hostname` | `deployment.site`, unless the host is Vercel or Netlify (auto-detected). `sitemap.transformItems` → drop |
|
|
54
54
|
| `markdown.theme` | `markdown.code.theme: { light, dark }`; VitePress's default (`github-light`/`github-dark`) is Blume's, so omit it unless changed |
|
|
@@ -201,4 +201,4 @@ The old URL list is `<old build>/**/*.html` (or the live `sitemap.xml`). Blume s
|
|
|
201
201
|
|
|
202
202
|
## Dropped — report these
|
|
203
203
|
|
|
204
|
-
`titleTemplate`, the footer `message` (and any link inside `copyright`),
|
|
204
|
+
`titleTemplate`, the footer `message` (and any link inside `copyright`), per-page `outline`/`aside`, one-sided `prev`/`next`, page-level toggles (`editLink`, `footer`, `navbar`, `pageClass`), `head` entries beyond meta tags and analytics, build hooks, Vite and custom markdown-it plugins, unsupported social links, line-number offsets and the site-wide switch, snippet regions and include ranges (now split files), copied out-of-root snippets, data-driven and unregistered theme components (and any content they hid), `VPTeamMembers`, data loaders and dynamic routes, hero styling, the DocSearch index (with its credentials), old-site anchors that were already broken (and any left unpinned under `--only-linked`), version-dropdown links, and `::: note`/`important`/`caution` text that 1.x showed literally.
|
|
@@ -70,7 +70,7 @@ Read the whole config, including the modules it imports. VuePress sites often ke
|
|
|
70
70
|
| `nextLinks: false` **and** `prevLinks: false` (v1) | `pagination: false` on every page: there's no site-wide switch. Only one of them → drop (report) |
|
|
71
71
|
| `search: false` | `search: false` |
|
|
72
72
|
| `algolia` (`apiKey`, `indexName`, `appId`), in `themeConfig` or, in v1, any `themeConfig.locales[path]` | omit `search` (Orama) and report the credentials. A v1 `algolia` block is almost always **DocSearch**: Algolia's crawler fills the index (the app is `BH4D9OD16A` when `appId` is missing, and `algoliaOptions.facetFilters` often marks a shared index). Its records aren't Blume's, and Blume's sync, given an admin key, replaces the whole index on every build. Never point `algolia()` at it; a new index of your own is a separate opt-in |
|
|
73
|
-
| **v2** `colorMode: 'dark'` / `'light'` | `theme.mode`. `colorModeSwitch: false` →
|
|
73
|
+
| **v2** `colorMode: 'dark'` / `'light'` | `theme.mode`. `colorModeSwitch: false` → `theme.toggle: false` |
|
|
74
74
|
| **v2** `hostname` | `deployment.site`, unless the target host is Vercel or Netlify |
|
|
75
75
|
| `locales` | see "i18n" |
|
|
76
76
|
| `smoothScroll`, `searchMaxSuggestions`, `searchPlaceholder`, `repoLabel`, `editLinkText`, **v2** `contributors`, `externalLinkIcon`, `home`, `notFound`, `backToHome`, and the other UI labels | drop. A translated UI string → `i18n.ui` |
|
|
@@ -319,16 +319,24 @@ const clickScript = `(()=>{const dr=()=>{const h=document.querySelector("[data-b
|
|
|
319
319
|
/>
|
|
320
320
|
)
|
|
321
321
|
}
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
322
|
+
{
|
|
323
|
+
data.config.theme.toggle && (
|
|
324
|
+
<button
|
|
325
|
+
aria-label={n.toggleTheme}
|
|
326
|
+
class={iconButton}
|
|
327
|
+
data-blume-theme-toggle
|
|
328
|
+
data-blume-tooltip={n.toggleTheme}
|
|
329
|
+
type="button"
|
|
330
|
+
>
|
|
331
|
+
<span class="inline-flex dark:hidden">
|
|
332
|
+
<Icon name="sun" size={18} />
|
|
333
|
+
</span>
|
|
334
|
+
<span class="hidden dark:inline-flex">
|
|
335
|
+
<Icon name="moon" size={18} />
|
|
336
|
+
</span>
|
|
337
|
+
</button>
|
|
338
|
+
)
|
|
339
|
+
}
|
|
332
340
|
{assistantEnabled && <Ask strings={assistantStrings} />}
|
|
333
341
|
</div>
|
|
334
342
|
</header>
|
|
@@ -75,6 +75,7 @@ const LOGOS: Record<string, string> = {
|
|
|
75
75
|
'<svg class="size-4 shrink-0" viewBox="0 0 466.73 532.09" xmlns="http://www.w3.org/2000/svg"><path d="M457.43,125.94L244.42,2.96c-6.84-3.95-15.28-3.95-22.12,0L9.3,125.94c-5.75,3.32-9.3,9.46-9.3,16.11v247.99c0,6.65,3.55,12.79,9.3,16.11l213.01,122.98c6.84,3.95,15.28,3.95,22.12,0l213.01-122.98c5.75-3.32,9.3-9.46,9.3-16.11v-247.99c0-6.65-3.55-12.79-9.3-16.11h-.01ZM444.05,151.99l-205.63,356.16c-1.39,2.4-5.06,1.42-5.06-1.36v-233.21c0-4.66-2.49-8.97-6.53-11.31L24.87,145.67c-2.4-1.39-1.42-5.06,1.36-5.06h411.26c5.84,0,9.49,6.33,6.57,11.39h-.01Z" fill="currentColor"/></svg>',
|
|
76
76
|
scira:
|
|
77
77
|
'<svg class="size-4 shrink-0" fill="none" viewBox="0 0 910 934" xmlns="http://www.w3.org/2000/svg"><path d="M647.664 197.775C569.13 189.049 525.5 145.419 516.774 66.8849C508.048 145.419 464.418 189.049 385.884 197.775C464.418 206.501 508.048 250.131 516.774 328.665C525.5 250.131 569.13 206.501 647.664 197.775Z" fill="currentColor" stroke="currentColor" stroke-linejoin="round" stroke-width="8"/><path d="M857.5 508.116C763.259 497.644 710.903 445.288 700.432 351.047C689.961 445.288 637.605 497.644 543.364 508.116C637.605 518.587 689.961 570.943 700.432 665.184C710.903 570.943 763.259 518.587 857.5 508.116Z" stroke="currentColor" stroke-linejoin="round" stroke-width="20"/><path d="M889.949 121.237C831.049 114.692 798.326 81.9698 791.782 23.0692C785.237 81.9698 752.515 114.692 693.614 121.237C752.515 127.781 785.237 160.504 791.782 219.404C798.326 160.504 831.049 127.781 889.949 121.237Z" fill="currentColor" stroke="currentColor" stroke-linejoin="round" stroke-width="8"/><path d="M760.632 764.337C720.719 814.616 669.835 855.1 611.872 882.692C553.91 910.285 490.404 924.255 426.213 923.533C362.022 922.812 298.846 907.419 241.518 878.531C184.19 849.643 134.228 808.026 95.4548 756.863C56.6815 705.7 30.1238 646.346 17.8129 583.343C5.50207 520.339 7.76433 455.354 24.4266 393.359C41.089 331.364 71.7099 274.001 113.947 225.658C156.184 177.315 208.919 139.273 268.117 114.442" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="30"/></svg>',
|
|
78
|
+
// Lucide's message-circle; Lucide's license is in THIRD-PARTY-NOTICES.md.
|
|
78
79
|
t3: '<svg class="size-4 shrink-0" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M7.9 20A9 9 0 1 0 4 16.1L2 22Z"/></svg>',
|
|
79
80
|
v0: '<svg class="size-4 shrink-0" fill="currentColor" viewBox="0 0 147 70" xmlns="http://www.w3.org/2000/svg"><path d="M56 50.2031V14H70V60.1562C70 65.5928 65.5928 70 60.1562 70C57.5605 70 54.9982 68.9992 53.1562 67.1573L0 14H19.7969L56 50.2031Z"/><path d="M147 56H133V23.9531L100.953 56H133V70H96.6875C85.8144 70 77 61.1856 77 50.3125V14H91V46.1562L123.156 14H91V0H127.312C138.186 0 147 8.81439 147 19.6875V56Z"/></svg>',
|
|
80
81
|
};
|
|
@@ -445,7 +445,12 @@ const localeRedirect = localeTargets
|
|
|
445
445
|
<script data-key={bannerKey} is:inline set:html={BANNER_INIT_SCRIPT} />
|
|
446
446
|
)
|
|
447
447
|
}
|
|
448
|
-
<script
|
|
448
|
+
<script
|
|
449
|
+
data-fixed={data.config.theme.toggle ? undefined : ""}
|
|
450
|
+
data-mode={themeMode}
|
|
451
|
+
is:inline
|
|
452
|
+
set:html={THEME_INIT_SCRIPT}
|
|
453
|
+
/>
|
|
449
454
|
{consent && <ConsentHead consent={consent} />}
|
|
450
455
|
<Analytics analytics={analytics} />
|
|
451
456
|
</head>
|
|
@@ -138,7 +138,12 @@ createIconSprite(Astro.locals);
|
|
|
138
138
|
<script data-key={bannerKey} is:inline set:html={BANNER_INIT_SCRIPT} />
|
|
139
139
|
)
|
|
140
140
|
}
|
|
141
|
-
<script
|
|
141
|
+
<script
|
|
142
|
+
data-fixed={data.config.theme.toggle ? undefined : ""}
|
|
143
|
+
data-mode={themeMode}
|
|
144
|
+
is:inline
|
|
145
|
+
set:html={THEME_INIT_SCRIPT}
|
|
146
|
+
/>
|
|
142
147
|
{consent && <ConsentHead consent={consent} />}
|
|
143
148
|
<Analytics analytics={analytics} />
|
|
144
149
|
</head>
|
|
@@ -692,7 +692,12 @@ const localeRedirect = localeTargets
|
|
|
692
692
|
<script data-key={bannerKey} is:inline set:html={BANNER_INIT_SCRIPT} />
|
|
693
693
|
)
|
|
694
694
|
}
|
|
695
|
-
<script
|
|
695
|
+
<script
|
|
696
|
+
data-fixed={data.config.theme.toggle ? undefined : ""}
|
|
697
|
+
data-mode={themeMode}
|
|
698
|
+
is:inline
|
|
699
|
+
set:html={THEME_INIT_SCRIPT}
|
|
700
|
+
/>
|
|
696
701
|
{consent && <ConsentHead consent={consent} />}
|
|
697
702
|
<Analytics analytics={analytics} />
|
|
698
703
|
</head>
|
|
@@ -45,12 +45,16 @@
|
|
|
45
45
|
* after a swap the theme the `before-swap` stamp carried over stands, so a
|
|
46
46
|
* toggle the reader made still holds for the rest of their visit.
|
|
47
47
|
*
|
|
48
|
+
* `data-fixed` (present when `theme.toggle` is off) skips the stored
|
|
49
|
+
* preference, so a choice saved before the toggle was removed can't hold the
|
|
50
|
+
* page in a mode the site no longer offers.
|
|
51
|
+
*
|
|
48
52
|
* Paper is white, so a dark page prints light: `beforeprint` switches the root
|
|
49
53
|
* to the light theme (every token, Shiki color, and `dark:` utility follows
|
|
50
54
|
* it) and `afterprint` puts the dark theme back. The listeners sit on
|
|
51
55
|
* `window`, so the one registration outlives client-router swaps.
|
|
52
56
|
*/
|
|
53
|
-
export const THEME_INIT_SCRIPT = `(()=>{const
|
|
57
|
+
export const THEME_INIT_SCRIPT = `(()=>{const ds=document.currentScript?.dataset;const m=ds?.mode??"system";const fixed=ds?.fixed!==undefined;const apply=()=>{const r=document.documentElement;let s=null;let blocked=false;try{s=fixed?null:localStorage.getItem("blume-theme");}catch{blocked=true;}const sys=matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";r.dataset.theme=s??(blocked&&r.dataset.theme?r.dataset.theme:m==="system"?sys:m);};apply();document.addEventListener("astro:before-swap",(e)=>{const t=document.documentElement.dataset.theme;if(t){e.newDocument.documentElement.dataset.theme=t;}});document.addEventListener("astro:after-swap",apply);let printed=null;addEventListener("beforeprint",()=>{const r=document.documentElement;if(r.dataset.theme==="dark"){printed="dark";r.dataset.theme="light";}});addEventListener("afterprint",()=>{if(printed){document.documentElement.dataset.theme=printed;printed=null;}});})();`;
|
|
54
58
|
|
|
55
59
|
/**
|
|
56
60
|
* Keep an embedded Scalar reference on Blume's theme. Scalar picks its own
|
package/src/core/config-input.ts
CHANGED
|
@@ -500,6 +500,12 @@ export interface ThemeConfig {
|
|
|
500
500
|
mode?: "system" | "light" | "dark";
|
|
501
501
|
/** Corner radius scale. Defaults to `md`. */
|
|
502
502
|
radius?: RadiusScale;
|
|
503
|
+
/**
|
|
504
|
+
* Show the header's light/dark toggle. Defaults to `true`. `false` hides it
|
|
505
|
+
* and ignores any choice a reader saved earlier, so every page renders in
|
|
506
|
+
* `mode` (`system` follows the reader's OS setting).
|
|
507
|
+
*/
|
|
508
|
+
toggle?: boolean;
|
|
503
509
|
}
|
|
504
510
|
|
|
505
511
|
// ---------------------------------------------------------------------------
|
package/src/core/schema.ts
CHANGED
|
@@ -761,6 +761,7 @@ const themeConfigFields = {
|
|
|
761
761
|
.prefault({}),
|
|
762
762
|
mode: z.enum(["system", "light", "dark"]).default("system"),
|
|
763
763
|
radius: z.enum(["none", "sm", "md", "lg"]).default("md"),
|
|
764
|
+
toggle: z.boolean().default(true),
|
|
764
765
|
};
|
|
765
766
|
|
|
766
767
|
const themeConfigSchema = z.strictObject(
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
* time via `resolveIcon` and inline as zero-JS SVG.
|
|
11
11
|
*
|
|
12
12
|
* Values are Lucide inner-SVG markup; the client `svg()` helpers wrap them in an
|
|
13
|
-
* `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" …>`.
|
|
13
|
+
* `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" …>`. Lucide's
|
|
14
|
+
* license is in THIRD-PARTY-NOTICES.md.
|
|
14
15
|
*/
|
|
15
16
|
/** Inner-SVG markup keyed by the icon name a client script requests. */
|
|
16
17
|
interface ChromeIconSet {
|
package/src/theme/entry.ts
CHANGED
|
@@ -9,7 +9,10 @@ import { CODE_PADDING_BLOCK_REM } from "./code-block-padding.ts";
|
|
|
9
9
|
*/
|
|
10
10
|
const CODE_SCROLL_INSET_REM = 0.375;
|
|
11
11
|
|
|
12
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* Lucide's arrow-up-right (the featured-link icon) as a `mask` data URI.
|
|
14
|
+
* Lucide's license is in THIRD-PARTY-NOTICES.md.
|
|
15
|
+
*/
|
|
13
16
|
const EXTERNAL_LINK_MASK = `url("data:image/svg+xml,${encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M7 7h10v10M7 17L17 7"/></svg>')}")`;
|
|
14
17
|
|
|
15
18
|
interface TailwindEntryOptions {
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|