@analogjs/content 3.0.0-alpha.2 → 3.0.0-alpha.20
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/LICENSE +21 -0
- package/fesm2022/analogjs-content-md4x.mjs +290 -0
- package/fesm2022/analogjs-content-md4x.mjs.map +1 -0
- package/fesm2022/analogjs-content-mdc.mjs +170 -0
- package/fesm2022/analogjs-content-mdc.mjs.map +1 -0
- package/fesm2022/analogjs-content-og.mjs +34 -46
- package/fesm2022/analogjs-content-og.mjs.map +1 -1
- package/fesm2022/analogjs-content-prism-highlighter.mjs +81 -68
- package/fesm2022/analogjs-content-prism-highlighter.mjs.map +1 -1
- package/fesm2022/analogjs-content-resources.mjs +113 -124
- package/fesm2022/analogjs-content-resources.mjs.map +1 -1
- package/fesm2022/analogjs-content-shiki-highlighter.mjs +9 -14
- package/fesm2022/analogjs-content-shiki-highlighter.mjs.map +1 -1
- package/fesm2022/analogjs-content.mjs +658 -636
- package/fesm2022/analogjs-content.mjs.map +1 -1
- package/fesm2022/content-list-loader.mjs +284 -0
- package/fesm2022/content-list-loader.mjs.map +1 -0
- package/md4x/package.json +4 -0
- package/mdc/package.json +4 -0
- package/og/package.json +2 -2
- package/package.json +56 -30
- package/plugin/package.json +2 -22
- package/plugin/src/index.d.ts +4 -2
- package/plugin/src/index.js +6 -3
- package/plugin/src/index.js.map +1 -1
- package/plugin/src/migrations/update-markdown-version/compat.d.ts +6 -2
- package/plugin/src/migrations/update-markdown-version/compat.js +8 -5
- package/plugin/src/migrations/update-markdown-version/compat.js.map +1 -1
- package/plugin/src/migrations/update-markdown-version/update-markdown-version.d.ts +6 -2
- package/plugin/src/migrations/update-markdown-version/update-markdown-version.js +18 -20
- package/plugin/src/migrations/update-markdown-version/update-markdown-version.js.map +1 -1
- package/prism-highlighter/package.json +2 -2
- package/resources/package.json +2 -2
- package/shiki-highlighter/package.json +2 -2
- package/src/lib/devtools/content-devtools-client.ts +215 -0
- package/src/lib/devtools/content-devtools.styles.css +194 -0
- package/types/md4x/src/index.d.ts +5 -0
- package/types/md4x/src/lib/md4x-content-renderer.service.d.ts +33 -0
- package/types/md4x/src/lib/md4x-wasm-content-renderer.service.d.ts +16 -0
- package/types/md4x/src/lib/provide-md4x.d.ts +26 -0
- package/types/md4x/src/lib/streaming-markdown-renderer.d.ts +21 -0
- package/types/mdc/src/index.d.ts +2 -0
- package/types/mdc/src/lib/mdc-component-registry.d.ts +25 -0
- package/types/mdc/src/lib/mdc-renderer.directive.d.ts +33 -0
- package/types/og/src/index.d.ts +2 -0
- package/types/og/src/lib/og.d.ts +5 -0
- package/types/og/src/lib/options.d.ts +11 -0
- package/types/prism-highlighter/src/index.d.ts +8 -0
- package/types/prism-highlighter/src/lib/prism/angular.d.ts +1 -0
- package/types/prism-highlighter/src/lib/prism-highlighter.d.ts +8 -0
- package/types/resources/src/content-file-resource.d.ts +37 -0
- package/types/resources/src/content-files-resource.d.ts +3 -0
- package/types/resources/src/index.d.ts +2 -0
- package/types/shiki-highlighter/src/index.d.ts +7 -0
- package/types/src/index.d.ts +18 -0
- package/types/src/lib/anchor-navigation.directive.d.ts +9 -0
- package/types/src/lib/content-file-loader.d.ts +6 -0
- package/types/src/lib/content-file.d.ts +8 -0
- package/types/src/lib/content-files-list-token.d.ts +3 -0
- package/types/src/lib/content-files-token.d.ts +3 -0
- package/types/src/lib/content-list-loader.d.ts +7 -0
- package/types/src/lib/content-renderer.d.ts +33 -0
- package/types/src/lib/content.d.ts +14 -0
- package/types/src/lib/devtools/content-devtools-plugin.d.ts +23 -0
- package/types/src/lib/devtools/content-devtools-renderer.d.ts +23 -0
- package/types/src/lib/devtools/index.d.ts +23 -0
- package/types/src/lib/get-content-files.d.ts +14 -0
- package/types/src/lib/inject-content-files.d.ts +4 -0
- package/types/src/lib/markdown-content-renderer.service.d.ts +10 -0
- package/types/src/lib/markdown-route.component.d.ts +15 -0
- package/types/src/lib/markdown.component.d.ts +26 -0
- package/types/src/lib/marked-content-highlighter.d.ts +17 -0
- package/types/src/lib/marked-setup.service.d.ts +10 -0
- package/types/src/lib/parse-raw-content-file.d.ts +18 -0
- package/types/src/lib/provide-content.d.ts +7 -0
- package/types/src/lib/render-task.service.d.ts +8 -0
- package/types/src/lib/utils/zone-wait-for.d.ts +2 -0
- package/og/README.md +0 -3
- package/plugin/README.md +0 -11
- package/plugin/src/migrations/update-markdown-renderer-feature/compat.d.ts +0 -2
- package/plugin/src/migrations/update-markdown-renderer-feature/compat.js +0 -6
- package/plugin/src/migrations/update-markdown-renderer-feature/compat.js.map +0 -1
- package/plugin/src/migrations/update-markdown-renderer-feature/update-markdown-renderer-feature.d.ts +0 -2
- package/plugin/src/migrations/update-markdown-renderer-feature/update-markdown-renderer-feature.js +0 -48
- package/plugin/src/migrations/update-markdown-renderer-feature/update-markdown-renderer-feature.js.map +0 -1
- package/prism-highlighter/README.md +0 -3
- package/resources/README.md +0 -3
- package/shiki-highlighter/README.md +0 -3
- package/types/analogjs-content-og.d.ts +0 -19
- package/types/analogjs-content-prism-highlighter.d.ts +0 -15
- package/types/analogjs-content-resources.d.ts +0 -20
- package/types/analogjs-content-shiki-highlighter.d.ts +0 -11
- package/types/analogjs-content.d.ts +0 -168
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@analogjs/content",
|
|
3
|
-
"version": "3.0.0-alpha.
|
|
3
|
+
"version": "3.0.0-alpha.20",
|
|
4
4
|
"description": "Content Rendering for Analog",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "Brandon Roberts <robertsbt@gmail.com>",
|
|
@@ -29,75 +29,101 @@
|
|
|
29
29
|
"@angular/router": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0",
|
|
30
30
|
"@nx/devkit": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0 || ^22",
|
|
31
31
|
"front-matter": "^4.0.2",
|
|
32
|
-
"marked": "^
|
|
32
|
+
"marked": "^17.0.5",
|
|
33
33
|
"marked-gfm-heading-id": "^4.1.1",
|
|
34
34
|
"marked-highlight": "^2.2.1",
|
|
35
35
|
"marked-mangle": "^1.1.10",
|
|
36
36
|
"rxjs": "^6.5.0 || ^7.5.0",
|
|
37
|
+
"@standard-schema/spec": "^1.0.0",
|
|
37
38
|
"prismjs": "^1.29.0",
|
|
38
39
|
"satori": "^0.10.14",
|
|
39
40
|
"satori-html": "^0.3.2",
|
|
40
|
-
"sharp": "^0.33.5"
|
|
41
|
+
"sharp": "^0.33.5",
|
|
42
|
+
"md4x": ">=0.0.20"
|
|
41
43
|
},
|
|
42
44
|
"peerDependenciesMeta": {
|
|
43
45
|
"@nx/devkit": {
|
|
44
46
|
"optional": true
|
|
45
47
|
},
|
|
48
|
+
"md4x": {
|
|
49
|
+
"optional": true
|
|
50
|
+
},
|
|
46
51
|
"satori": {
|
|
47
52
|
"optional": true
|
|
48
53
|
},
|
|
49
54
|
"satori-html": {
|
|
50
55
|
"optional": true
|
|
51
56
|
},
|
|
57
|
+
"@standard-schema/spec": {
|
|
58
|
+
"optional": true
|
|
59
|
+
},
|
|
52
60
|
"sharp": {
|
|
53
61
|
"optional": true
|
|
54
62
|
}
|
|
55
63
|
},
|
|
56
|
-
"dependencies": {
|
|
57
|
-
"tslib": "^2.3.0"
|
|
58
|
-
},
|
|
59
|
-
"ng-update": {
|
|
60
|
-
"packageGroup": [
|
|
61
|
-
"@analogjs/platform",
|
|
62
|
-
"@analogjs/content",
|
|
63
|
-
"@analogjs/router",
|
|
64
|
-
"@analogjs/storybook-angular",
|
|
65
|
-
"@analogjs/vite-plugin-angular",
|
|
66
|
-
"@analogjs/vite-plugin-nitro",
|
|
67
|
-
"@analogjs/vitest-angular"
|
|
68
|
-
],
|
|
69
|
-
"migrations": "./plugin/migrations.json"
|
|
70
|
-
},
|
|
71
|
-
"publishConfig": {
|
|
72
|
-
"access": "public",
|
|
73
|
-
"provenance": true
|
|
74
|
-
},
|
|
75
|
-
"module": "fesm2022/analogjs-content.mjs",
|
|
76
|
-
"typings": "types/analogjs-content.d.ts",
|
|
77
64
|
"exports": {
|
|
78
65
|
"./package.json": {
|
|
79
66
|
"default": "./package.json"
|
|
80
67
|
},
|
|
81
68
|
".": {
|
|
82
|
-
"types": "./types/
|
|
69
|
+
"types": "./types/src/index.d.ts",
|
|
70
|
+
"import": "./fesm2022/analogjs-content.mjs",
|
|
83
71
|
"default": "./fesm2022/analogjs-content.mjs"
|
|
84
72
|
},
|
|
73
|
+
"./md4x": {
|
|
74
|
+
"types": "./types/md4x/src/index.d.ts",
|
|
75
|
+
"import": "./fesm2022/analogjs-content-md4x.mjs",
|
|
76
|
+
"default": "./fesm2022/analogjs-content-md4x.mjs"
|
|
77
|
+
},
|
|
78
|
+
"./mdc": {
|
|
79
|
+
"types": "./types/mdc/src/index.d.ts",
|
|
80
|
+
"import": "./fesm2022/analogjs-content-mdc.mjs",
|
|
81
|
+
"default": "./fesm2022/analogjs-content-mdc.mjs"
|
|
82
|
+
},
|
|
85
83
|
"./og": {
|
|
86
|
-
"types": "./types/
|
|
84
|
+
"types": "./types/og/src/index.d.ts",
|
|
85
|
+
"import": "./fesm2022/analogjs-content-og.mjs",
|
|
87
86
|
"default": "./fesm2022/analogjs-content-og.mjs"
|
|
88
87
|
},
|
|
89
88
|
"./prism-highlighter": {
|
|
90
|
-
"types": "./types/
|
|
89
|
+
"types": "./types/prism-highlighter/src/index.d.ts",
|
|
90
|
+
"import": "./fesm2022/analogjs-content-prism-highlighter.mjs",
|
|
91
91
|
"default": "./fesm2022/analogjs-content-prism-highlighter.mjs"
|
|
92
92
|
},
|
|
93
93
|
"./resources": {
|
|
94
|
-
"types": "./types/
|
|
94
|
+
"types": "./types/resources/src/index.d.ts",
|
|
95
|
+
"import": "./fesm2022/analogjs-content-resources.mjs",
|
|
95
96
|
"default": "./fesm2022/analogjs-content-resources.mjs"
|
|
96
97
|
},
|
|
97
98
|
"./shiki-highlighter": {
|
|
98
|
-
"types": "./types/
|
|
99
|
+
"types": "./types/shiki-highlighter/src/index.d.ts",
|
|
100
|
+
"import": "./fesm2022/analogjs-content-shiki-highlighter.mjs",
|
|
99
101
|
"default": "./fesm2022/analogjs-content-shiki-highlighter.mjs"
|
|
100
102
|
}
|
|
101
103
|
},
|
|
104
|
+
"dependencies": {
|
|
105
|
+
"tslib": "^2.3.0"
|
|
106
|
+
},
|
|
107
|
+
"devDependencies": {
|
|
108
|
+
"@analogjs/vite-plugin-angular": "workspace:^"
|
|
109
|
+
},
|
|
110
|
+
"ng-update": {
|
|
111
|
+
"packageGroup": [
|
|
112
|
+
"@analogjs/platform",
|
|
113
|
+
"@analogjs/content",
|
|
114
|
+
"@analogjs/router",
|
|
115
|
+
"@analogjs/storybook-angular",
|
|
116
|
+
"@analogjs/vite-plugin-angular",
|
|
117
|
+
"@analogjs/vite-plugin-nitro",
|
|
118
|
+
"@analogjs/vitest-angular"
|
|
119
|
+
],
|
|
120
|
+
"migrations": "./plugin/migrations.json"
|
|
121
|
+
},
|
|
122
|
+
"publishConfig": {
|
|
123
|
+
"access": "public",
|
|
124
|
+
"provenance": true
|
|
125
|
+
},
|
|
126
|
+
"module": "fesm2022/analogjs-content.mjs",
|
|
127
|
+
"typings": "types/src/index.d.ts",
|
|
102
128
|
"sideEffects": false
|
|
103
|
-
}
|
|
129
|
+
}
|
package/plugin/package.json
CHANGED
|
@@ -1,23 +1,3 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
|
|
4
|
-
"main": "./src/index.js",
|
|
5
|
-
"type": "commonjs",
|
|
6
|
-
"dependencies": {
|
|
7
|
-
"ts-morph": "^27.0.0",
|
|
8
|
-
"tslib": "^2.8.1"
|
|
9
|
-
},
|
|
10
|
-
"peerDependencies": {
|
|
11
|
-
"@nx/devkit": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0 || ^22",
|
|
12
|
-
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0"
|
|
13
|
-
},
|
|
14
|
-
"peerDependenciesMeta": {
|
|
15
|
-
"@nx/devkit": {
|
|
16
|
-
"optional": true
|
|
17
|
-
},
|
|
18
|
-
"vite": {
|
|
19
|
-
"optional": true
|
|
20
|
-
}
|
|
21
|
-
},
|
|
22
|
-
"types": "./src/index.d.ts"
|
|
23
|
-
}
|
|
2
|
+
"type": "commonjs"
|
|
3
|
+
}
|
package/plugin/src/index.d.ts
CHANGED
package/plugin/src/index.js
CHANGED
package/plugin/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../content-plugin/src/index.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-inferrable-types\nconst _default: undefined = void 0;\nexport default _default;\n"],"mappings":";;AACA,MAAM,WAAsB,KAAK"}
|
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { convertNxGenerator } from "@nx/devkit";
|
|
2
|
+
|
|
3
|
+
//#region src/migrations/update-markdown-version/compat.d.ts
|
|
4
|
+
declare const _default: ReturnType<typeof convertNxGenerator>;
|
|
5
|
+
export = _default;
|
|
6
|
+
//# sourceMappingURL=compat.d.ts.map
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
const require_src_migrations_update_markdown_version_update_markdown_version = require('./update-markdown-version.js');
|
|
2
|
+
let _nx_devkit = require("@nx/devkit");
|
|
3
|
+
|
|
4
|
+
//#region src/migrations/update-markdown-version/compat.ts
|
|
5
|
+
const _default = (0, _nx_devkit.convertNxGenerator)(require_src_migrations_update_markdown_version_update_markdown_version);
|
|
6
|
+
|
|
7
|
+
//#endregion
|
|
8
|
+
module.exports = _default;
|
|
6
9
|
//# sourceMappingURL=compat.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compat.js","
|
|
1
|
+
{"version":3,"file":"compat.js","names":["updateMarkdownVersion"],"sources":["../../../../../../content-plugin/src/migrations/update-markdown-version/compat.ts"],"sourcesContent":["import { convertNxGenerator } from '@nx/devkit';\nimport updateMarkdownVersion from './update-markdown-version';\n\nconst _default: ReturnType<typeof convertNxGenerator> = convertNxGenerator(\n updateMarkdownVersion,\n);\nexport default _default;\n"],"mappings":";;;;AAGA,MAAM,8CACJA,uEACD"}
|
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
import { Tree } from
|
|
2
|
-
|
|
1
|
+
import { Tree } from "@nx/devkit";
|
|
2
|
+
|
|
3
|
+
//#region src/migrations/update-markdown-version/update-markdown-version.d.ts
|
|
4
|
+
declare function update(host: Tree): Promise<(() => void) | undefined>;
|
|
5
|
+
export = update;
|
|
6
|
+
//# sourceMappingURL=update-markdown-version.d.ts.map
|
|
@@ -1,23 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
|
1
|
+
let _nx_devkit = require("@nx/devkit");
|
|
2
|
+
|
|
3
|
+
//#region src/migrations/update-markdown-version/update-markdown-version.ts
|
|
5
4
|
async function update(host) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
await (0, devkit_1.formatFiles)(host);
|
|
19
|
-
if (dependencyAdded) {
|
|
20
|
-
return () => (0, devkit_1.installPackagesTask)(host);
|
|
21
|
-
}
|
|
5
|
+
let dependencyAdded = false;
|
|
6
|
+
if (host.exists("/angular.json")) {
|
|
7
|
+
(0, _nx_devkit.addDependenciesToPackageJson)(host, {
|
|
8
|
+
marked: "^15.0.7",
|
|
9
|
+
"marked-mangle": "^1.1.10",
|
|
10
|
+
"marked-highlight": "^2.2.1",
|
|
11
|
+
"marked-gfm-heading-id": "^4.1.1"
|
|
12
|
+
}, {});
|
|
13
|
+
dependencyAdded = true;
|
|
14
|
+
}
|
|
15
|
+
await (0, _nx_devkit.formatFiles)(host);
|
|
16
|
+
if (dependencyAdded) return () => (0, _nx_devkit.installPackagesTask)(host);
|
|
22
17
|
}
|
|
18
|
+
|
|
19
|
+
//#endregion
|
|
20
|
+
module.exports = update;
|
|
23
21
|
//# sourceMappingURL=update-markdown-version.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-markdown-version.js","
|
|
1
|
+
{"version":3,"file":"update-markdown-version.js","names":[],"sources":["../../../../../../content-plugin/src/migrations/update-markdown-version/update-markdown-version.ts"],"sourcesContent":["import {\n addDependenciesToPackageJson,\n type Tree,\n formatFiles,\n installPackagesTask,\n} from '@nx/devkit';\n\nexport default async function update(\n host: Tree,\n): Promise<(() => void) | undefined> {\n // NOTE: we only add the dependency if the project is an Angular project\n // Nx projects can add the dependency from migrations.json\n let dependencyAdded = false;\n if (host.exists('/angular.json')) {\n addDependenciesToPackageJson(\n host,\n {\n marked: '^15.0.7',\n 'marked-mangle': '^1.1.10',\n 'marked-highlight': '^2.2.1',\n 'marked-gfm-heading-id': '^4.1.1',\n },\n {},\n );\n dependencyAdded = true;\n }\n\n await formatFiles(host);\n\n if (dependencyAdded) {\n return () => installPackagesTask(host);\n }\n}\n"],"mappings":";;;AAOA,eAA8B,OAC5B,MACmC;CAGnC,IAAI,kBAAkB;AACtB,KAAI,KAAK,OAAO,gBAAgB,EAAE;AAChC,+CACE,MACA;GACE,QAAQ;GACR,iBAAiB;GACjB,oBAAoB;GACpB,yBAAyB;GAC1B,EACD,EAAE,CACH;AACD,oBAAkB;;AAGpB,mCAAkB,KAAK;AAEvB,KAAI,gBACF,kDAAiC,KAAK"}
|
package/resources/package.json
CHANGED
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side script for the Analog Content DevTools panel.
|
|
3
|
+
* Injected by the Vite plugin in dev mode only.
|
|
4
|
+
*
|
|
5
|
+
* @experimental Content DevTools is experimental and may change in future releases.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
interface DevToolsData {
|
|
9
|
+
renderer: string;
|
|
10
|
+
renderTimeMs: number;
|
|
11
|
+
frontmatter: Record<string, unknown>;
|
|
12
|
+
toc: Array<{ id: string; level: number; text: string }>;
|
|
13
|
+
contentLength: number;
|
|
14
|
+
headingCount: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const STORAGE_KEY = 'analog-content-devtools-open';
|
|
18
|
+
|
|
19
|
+
// Cache the latest devtools payload at module level so events fired
|
|
20
|
+
// during initial bootstrap (before the panel is created) are not lost.
|
|
21
|
+
let latestDevToolsData: DevToolsData | null = null;
|
|
22
|
+
let panelUpdateCallback: ((data: DevToolsData) => void) | null = null;
|
|
23
|
+
|
|
24
|
+
window.addEventListener('analog-content-devtools-data', ((
|
|
25
|
+
e: CustomEvent<DevToolsData>,
|
|
26
|
+
) => {
|
|
27
|
+
latestDevToolsData = e.detail;
|
|
28
|
+
if (panelUpdateCallback) {
|
|
29
|
+
panelUpdateCallback(e.detail);
|
|
30
|
+
}
|
|
31
|
+
}) as EventListener);
|
|
32
|
+
|
|
33
|
+
function createPanel(): HTMLElement {
|
|
34
|
+
const root = document.createElement('div');
|
|
35
|
+
root.id = 'analog-content-devtools';
|
|
36
|
+
root.innerHTML = `
|
|
37
|
+
<button class="acd-toggle" title="Analog Content DevTools">
|
|
38
|
+
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
39
|
+
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6zm-1 2l5 5h-5V4zM6 20V4h5v7h7v9H6z"/>
|
|
40
|
+
<path d="M8 13h8v1H8zm0 3h6v1H8z" opacity=".6"/>
|
|
41
|
+
</svg>
|
|
42
|
+
</button>
|
|
43
|
+
<div class="acd-panel" style="display:none">
|
|
44
|
+
<div class="acd-header">
|
|
45
|
+
<span>Analog Content DevTools <span class="acd-badge acd-badge-experimental">experimental</span></span>
|
|
46
|
+
</div>
|
|
47
|
+
<div class="acd-tabs">
|
|
48
|
+
<button class="acd-tab" data-tab="overview" data-active="true">Overview</button>
|
|
49
|
+
<button class="acd-tab" data-tab="frontmatter">Frontmatter</button>
|
|
50
|
+
<button class="acd-tab" data-tab="toc">TOC</button>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="acd-body">
|
|
53
|
+
<div class="acd-empty">No content data available. Navigate to a content page.</div>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
`;
|
|
57
|
+
return root;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function renderOverview(data: DevToolsData): string {
|
|
61
|
+
const speedClass =
|
|
62
|
+
data.renderTimeMs < 5
|
|
63
|
+
? 'acd-fast'
|
|
64
|
+
: data.renderTimeMs > 50
|
|
65
|
+
? 'acd-slow'
|
|
66
|
+
: '';
|
|
67
|
+
return `
|
|
68
|
+
<div class="acd-section">
|
|
69
|
+
<div class="acd-section-title">Renderer</div>
|
|
70
|
+
<div class="acd-kv">
|
|
71
|
+
<span class="acd-key">Active</span>
|
|
72
|
+
<span class="acd-value"><span class="acd-badge acd-badge-renderer">${data.renderer}</span></span>
|
|
73
|
+
</div>
|
|
74
|
+
<div class="acd-kv">
|
|
75
|
+
<span class="acd-key">Render time</span>
|
|
76
|
+
<span class="acd-value ${speedClass}">${data.renderTimeMs.toFixed(2)}ms</span>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
<div class="acd-section">
|
|
80
|
+
<div class="acd-section-title">Content</div>
|
|
81
|
+
<div class="acd-kv">
|
|
82
|
+
<span class="acd-key">Length</span>
|
|
83
|
+
<span class="acd-value">${data.contentLength.toLocaleString()} chars</span>
|
|
84
|
+
</div>
|
|
85
|
+
<div class="acd-kv">
|
|
86
|
+
<span class="acd-key">Headings</span>
|
|
87
|
+
<span class="acd-value">${data.headingCount}</span>
|
|
88
|
+
</div>
|
|
89
|
+
<div class="acd-kv">
|
|
90
|
+
<span class="acd-key">Frontmatter keys</span>
|
|
91
|
+
<span class="acd-value">${Object.keys(data.frontmatter).length}</span>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
`;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function renderFrontmatter(data: DevToolsData): string {
|
|
98
|
+
const keys = Object.keys(data.frontmatter);
|
|
99
|
+
if (keys.length === 0) {
|
|
100
|
+
return '<div class="acd-empty">No frontmatter found.</div>';
|
|
101
|
+
}
|
|
102
|
+
return `
|
|
103
|
+
<div class="acd-section">
|
|
104
|
+
<div class="acd-section-title">Frontmatter attributes</div>
|
|
105
|
+
<div class="acd-pre">${escapeHtml(JSON.stringify(data.frontmatter, null, 2))}</div>
|
|
106
|
+
</div>
|
|
107
|
+
`;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function renderToc(data: DevToolsData): HTMLElement {
|
|
111
|
+
if (data.toc.length === 0) {
|
|
112
|
+
const empty = document.createElement('div');
|
|
113
|
+
empty.className = 'acd-empty';
|
|
114
|
+
empty.textContent = 'No headings found.';
|
|
115
|
+
return empty;
|
|
116
|
+
}
|
|
117
|
+
const section = document.createElement('div');
|
|
118
|
+
section.className = 'acd-section';
|
|
119
|
+
const title = document.createElement('div');
|
|
120
|
+
title.className = 'acd-section-title';
|
|
121
|
+
title.textContent = `Table of Contents (${data.toc.length} headings)`;
|
|
122
|
+
section.appendChild(title);
|
|
123
|
+
|
|
124
|
+
for (const h of data.toc) {
|
|
125
|
+
const item = document.createElement('div');
|
|
126
|
+
item.className = 'acd-toc-item';
|
|
127
|
+
item.style.paddingLeft = `${(h.level - 1) * 12}px`;
|
|
128
|
+
const anchor = document.createElement('a');
|
|
129
|
+
anchor.setAttribute('href', `#${encodeURIComponent(h.id)}`);
|
|
130
|
+
anchor.textContent = `${'#'.repeat(h.level)} ${h.text}`;
|
|
131
|
+
item.appendChild(anchor);
|
|
132
|
+
section.appendChild(item);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return section;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function escapeHtml(str: string): string {
|
|
139
|
+
return str
|
|
140
|
+
.replace(/&/g, '&')
|
|
141
|
+
.replace(/</g, '<')
|
|
142
|
+
.replace(/>/g, '>')
|
|
143
|
+
.replace(/"/g, '"');
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function initDevTools() {
|
|
147
|
+
if (document.getElementById('analog-content-devtools')) return;
|
|
148
|
+
|
|
149
|
+
const panel = createPanel();
|
|
150
|
+
document.body.appendChild(panel);
|
|
151
|
+
|
|
152
|
+
const toggle = panel.querySelector('.acd-toggle') as HTMLElement;
|
|
153
|
+
const panelEl = panel.querySelector('.acd-panel') as HTMLElement;
|
|
154
|
+
const body = panel.querySelector('.acd-body') as HTMLElement;
|
|
155
|
+
const tabs = panel.querySelectorAll('.acd-tab');
|
|
156
|
+
|
|
157
|
+
let isOpen = localStorage.getItem(STORAGE_KEY) === 'true';
|
|
158
|
+
let activeTab = 'overview';
|
|
159
|
+
let currentData: DevToolsData | null = latestDevToolsData;
|
|
160
|
+
|
|
161
|
+
function updateVisibility() {
|
|
162
|
+
panelEl.style.display = isOpen ? 'flex' : 'none';
|
|
163
|
+
localStorage.setItem(STORAGE_KEY, String(isOpen));
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function updateBody() {
|
|
167
|
+
if (!currentData) {
|
|
168
|
+
body.innerHTML =
|
|
169
|
+
'<div class="acd-empty">No content data available. Navigate to a content page.</div>';
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
switch (activeTab) {
|
|
173
|
+
case 'overview':
|
|
174
|
+
body.innerHTML = renderOverview(currentData);
|
|
175
|
+
break;
|
|
176
|
+
case 'frontmatter':
|
|
177
|
+
body.innerHTML = renderFrontmatter(currentData);
|
|
178
|
+
break;
|
|
179
|
+
case 'toc':
|
|
180
|
+
body.replaceChildren(renderToc(currentData));
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
toggle.addEventListener('click', () => {
|
|
186
|
+
isOpen = !isOpen;
|
|
187
|
+
updateVisibility();
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
tabs.forEach((tab) => {
|
|
191
|
+
tab.addEventListener('click', () => {
|
|
192
|
+
activeTab = (tab as HTMLElement).dataset['tab'] || 'overview';
|
|
193
|
+
tabs.forEach((t) =>
|
|
194
|
+
(t as HTMLElement).setAttribute('data-active', String(t === tab)),
|
|
195
|
+
);
|
|
196
|
+
updateBody();
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
// Wire the module-level listener to update the panel
|
|
201
|
+
panelUpdateCallback = (data: DevToolsData) => {
|
|
202
|
+
currentData = data;
|
|
203
|
+
updateBody();
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
updateVisibility();
|
|
207
|
+
updateBody();
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Init when DOM is ready
|
|
211
|
+
if (document.readyState === 'loading') {
|
|
212
|
+
document.addEventListener('DOMContentLoaded', initDevTools);
|
|
213
|
+
} else {
|
|
214
|
+
initDevTools();
|
|
215
|
+
}
|