@analogjs/content 3.0.0-alpha.81 → 3.0.0-alpha.82

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": "@analogjs/content",
3
- "version": "3.0.0-alpha.81",
3
+ "version": "3.0.0-alpha.82",
4
4
  "description": "Content Rendering for Analog",
5
5
  "type": "module",
6
6
  "author": "Brandon Roberts <robertsbt@gmail.com>",
@@ -73,11 +73,6 @@
73
73
  "import": "./fesm2022/analogjs-content.mjs",
74
74
  "default": "./fesm2022/analogjs-content.mjs"
75
75
  },
76
- "./devtools": {
77
- "types": "./types/devtools/src/index.d.ts",
78
- "import": "./fesm2022/analogjs-content-devtools.mjs",
79
- "default": "./fesm2022/analogjs-content-devtools.mjs"
80
- },
81
76
  "./md4x": {
82
77
  "types": "./types/md4x/src/index.d.ts",
83
78
  "import": "./fesm2022/analogjs-content-md4x.mjs",
@@ -113,8 +108,8 @@
113
108
  "tslib": "^2.3.0"
114
109
  },
115
110
  "devDependencies": {
116
- "@analogjs/vite-plugin-angular": "3.0.0-alpha.81",
117
- "@analogjs/vitest-angular": "3.0.0-alpha.81"
111
+ "@analogjs/vite-plugin-angular": "3.0.0-alpha.82",
112
+ "@analogjs/vitest-angular": "3.0.0-alpha.82"
118
113
  },
119
114
  "ng-update": {
120
115
  "packageGroup": [
@@ -1,4 +0,0 @@
1
- {
2
- "module": "../fesm2022/analogjs-content-devtools.mjs",
3
- "typings": "../types/devtools/src/index.d.ts"
4
- }
@@ -1,162 +0,0 @@
1
- import { t as ContentRenderer } from "./content-renderer.mjs";
2
- import * as i0 from "@angular/core";
3
- import { Injectable, InjectionToken, inject } from "@angular/core";
4
- import { transformWithOxc } from "vite";
5
- //#region \0rolldown/runtime.js
6
- var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
7
- //#endregion
8
- //#region packages/content/src/lib/devtools/content-devtools-renderer.ts
9
- /**
10
- * Token for the wrapped renderer that DevTools delegates to.
11
- * @internal
12
- */
13
- var DEVTOOLS_INNER_RENDERER = new InjectionToken("devtools_inner_renderer");
14
- /**
15
- * Wraps an existing ContentRenderer to collect timing and metadata for the
16
- * Content DevTools panel. Dispatches a custom event on the window after
17
- * each render so the devtools client can update.
18
- *
19
- * @experimental Content DevTools is experimental and may change in future releases.
20
- */
21
- var DevToolsContentRenderer = class DevToolsContentRenderer extends ContentRenderer {
22
- constructor() {
23
- super(...arguments);
24
- this.inner = inject(DEVTOOLS_INNER_RENDERER);
25
- }
26
- async render(content) {
27
- const start = performance.now();
28
- const result = await this.inner.render(content);
29
- const elapsed = performance.now() - start;
30
- if (typeof window !== "undefined") window.dispatchEvent(new CustomEvent("analog-content-devtools-data", { detail: {
31
- renderer: this.inner.constructor.name,
32
- renderTimeMs: elapsed,
33
- toc: result.toc,
34
- contentLength: content.length,
35
- headingCount: result.toc.length,
36
- frontmatter: {}
37
- } }));
38
- return result;
39
- }
40
- getContentHeadings(content) {
41
- return this.inner.getContentHeadings(content);
42
- }
43
- enhance() {
44
- this.inner.enhance();
45
- }
46
- static {
47
- this.ɵfac = i0.ɵɵngDeclareFactory({
48
- minVersion: "12.0.0",
49
- version: "22.0.0",
50
- ngImport: i0,
51
- type: DevToolsContentRenderer,
52
- deps: null,
53
- target: i0.ɵɵFactoryTarget.Injectable
54
- });
55
- }
56
- static {
57
- this.ɵprov = i0.ɵɵngDeclareInjectable({
58
- minVersion: "12.0.0",
59
- version: "22.0.0",
60
- ngImport: i0,
61
- type: DevToolsContentRenderer
62
- });
63
- }
64
- };
65
- i0.ɵɵngDeclareClassMetadata({
66
- minVersion: "12.0.0",
67
- version: "22.0.0",
68
- ngImport: i0,
69
- type: DevToolsContentRenderer,
70
- decorators: [{ type: Injectable }]
71
- });
72
- //#endregion
73
- //#region packages/content/src/lib/devtools/content-devtools-plugin.ts
74
- var import___vite_browser_external = (/* @__PURE__ */ __commonJSMin(((exports, module) => {
75
- module.exports = {};
76
- })))();
77
- /**
78
- * Vite plugin that injects the Analog Content DevTools panel in dev mode.
79
- *
80
- * Shows render time, frontmatter data, TOC, and content stats in a floating
81
- * panel. Dev-only — completely stripped from production builds.
82
- *
83
- * @experimental Content DevTools is experimental and may change in future releases.
84
- *
85
- * @example
86
- * ```typescript
87
- * // vite.config.ts
88
- * import { contentDevToolsPlugin } from '@analogjs/content/devtools';
89
- *
90
- * export default defineConfig({
91
- * plugins: [
92
- * analog({ ... }),
93
- * contentDevToolsPlugin(),
94
- * ],
95
- * });
96
- * ```
97
- */
98
- function contentDevToolsPlugin() {
99
- let isDev = false;
100
- return {
101
- name: "analog-content-devtools",
102
- apply: "serve",
103
- configResolved(config) {
104
- isDev = config.command === "serve";
105
- },
106
- transformIndexHtml: {
107
- order: "post",
108
- async handler(html) {
109
- if (!isDev) return html;
110
- const pluginDir = (0, import___vite_browser_external.dirname)((0, import___vite_browser_external.fileURLToPath)(import.meta.url));
111
- const cssPath = (0, import___vite_browser_external.resolve)(pluginDir, "content-devtools.styles.css");
112
- const clientPath = (0, import___vite_browser_external.resolve)(pluginDir, "content-devtools-client.ts");
113
- let css;
114
- let clientCode;
115
- try {
116
- css = (0, import___vite_browser_external.readFileSync)(cssPath, "utf-8");
117
- clientCode = (0, import___vite_browser_external.readFileSync)(clientPath, "utf-8");
118
- } catch {
119
- return html;
120
- }
121
- const transformResult = await transformWithOxc(clientCode, "content-devtools-client.ts", { lang: "ts" });
122
- const injection = `
123
- <style>${css}</style>
124
- <script type="module">${transformResult.code}<\/script>`;
125
- return html.replace("</body>", `${injection}\n</body>`);
126
- }
127
- }
128
- };
129
- }
130
- //#endregion
131
- //#region packages/content/src/lib/devtools/index.ts
132
- /**
133
- * Wraps the given ContentRenderer with DevTools instrumentation.
134
- *
135
- * The supplied renderer class is provided under DEVTOOLS_INNER_RENDERER and
136
- * DevToolsContentRenderer becomes the new ContentRenderer, delegating
137
- * all calls and collecting timing data.
138
- *
139
- * @param innerRenderer The renderer class to wrap with devtools instrumentation.
140
- *
141
- * @experimental Content DevTools is experimental and may change in future releases.
142
- *
143
- * @example
144
- * ```typescript
145
- * provideContent(
146
- * withContentDevTools(NoopContentRenderer),
147
- * );
148
- * ```
149
- */
150
- function withContentDevTools(innerRenderer) {
151
- return [{
152
- provide: DEVTOOLS_INNER_RENDERER,
153
- useClass: innerRenderer
154
- }, {
155
- provide: ContentRenderer,
156
- useClass: DevToolsContentRenderer
157
- }];
158
- }
159
- //#endregion
160
- export { DevToolsContentRenderer, contentDevToolsPlugin, withContentDevTools };
161
-
162
- //# sourceMappingURL=analogjs-content-devtools.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analogjs-content-devtools.mjs","names":[],"sources":["../../src/lib/devtools/content-devtools-renderer.ts","../../../../__vite-browser-external","../../src/lib/devtools/content-devtools-plugin.ts","../../src/lib/devtools/index.ts"],"sourcesContent":["import { Injectable, InjectionToken, inject } from '@angular/core';\n\nimport {\n ContentRenderer,\n RenderedContent,\n TableOfContentItem,\n} from '../content-renderer';\n\n/**\n * Token for the wrapped renderer that DevTools delegates to.\n * @internal\n */\nexport const DEVTOOLS_INNER_RENDERER: InjectionToken<ContentRenderer> =\n new InjectionToken<ContentRenderer>('devtools_inner_renderer');\n\n/**\n * Wraps an existing ContentRenderer to collect timing and metadata for the\n * Content DevTools panel. Dispatches a custom event on the window after\n * each render so the devtools client can update.\n *\n * @experimental Content DevTools is experimental and may change in future releases.\n */\n@Injectable()\nexport class DevToolsContentRenderer extends ContentRenderer {\n private readonly inner = inject(DEVTOOLS_INNER_RENDERER);\n\n override async render(content: string): Promise<RenderedContent> {\n const start = performance.now();\n const result = await this.inner.render(content);\n const elapsed = performance.now() - start;\n\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('analog-content-devtools-data', {\n detail: {\n renderer: this.inner.constructor.name,\n renderTimeMs: elapsed,\n toc: result.toc,\n contentLength: content.length,\n headingCount: result.toc.length,\n frontmatter: {},\n },\n }),\n );\n }\n\n return result;\n }\n\n override getContentHeadings(content: string): TableOfContentItem[] {\n return this.inner.getContentHeadings(content);\n }\n\n override enhance(): void {\n this.inner.enhance();\n }\n}\n","module.exports = {}","import { readFileSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { Plugin } from 'vite';\nimport { transformWithOxc } from 'vite';\n\n/**\n * Vite plugin that injects the Analog Content DevTools panel in dev mode.\n *\n * Shows render time, frontmatter data, TOC, and content stats in a floating\n * panel. Dev-only — completely stripped from production builds.\n *\n * @experimental Content DevTools is experimental and may change in future releases.\n *\n * @example\n * ```typescript\n * // vite.config.ts\n * import { contentDevToolsPlugin } from '@analogjs/content/devtools';\n *\n * export default defineConfig({\n * plugins: [\n * analog({ ... }),\n * contentDevToolsPlugin(),\n * ],\n * });\n * ```\n */\nexport function contentDevToolsPlugin(): Plugin {\n let isDev = false;\n\n return {\n name: 'analog-content-devtools',\n apply: 'serve',\n\n configResolved(config) {\n isDev = config.command === 'serve';\n },\n\n transformIndexHtml: {\n order: 'post',\n async handler(html) {\n if (!isDev) return html;\n\n const pluginDir = dirname(fileURLToPath(import.meta.url));\n const cssPath = resolve(pluginDir, 'content-devtools.styles.css');\n const clientPath = resolve(pluginDir, 'content-devtools-client.ts');\n\n let css: string;\n let clientCode: string;\n try {\n css = readFileSync(cssPath, 'utf-8');\n clientCode = readFileSync(clientPath, 'utf-8');\n } catch {\n // Fallback: files may not exist if running from compiled output.\n // The plugin silently degrades — no devtools panel.\n return html;\n }\n\n const transformResult = await transformWithOxc(\n clientCode,\n 'content-devtools-client.ts',\n { lang: 'ts' },\n );\n\n const injection = `\n<style>${css}</style>\n<script type=\"module\">${transformResult.code}</script>`;\n\n return html.replace('</body>', `${injection}\\n</body>`);\n },\n },\n };\n}\n","import { Provider, Type } from '@angular/core';\nimport { ContentRenderer } from '../content-renderer';\nimport {\n DevToolsContentRenderer,\n DEVTOOLS_INNER_RENDERER,\n} from './content-devtools-renderer';\n\nexport { contentDevToolsPlugin } from './content-devtools-plugin';\nexport {\n DevToolsContentRenderer,\n DEVTOOLS_INNER_RENDERER,\n} from './content-devtools-renderer';\n\n/**\n * Wraps the given ContentRenderer with DevTools instrumentation.\n *\n * The supplied renderer class is provided under DEVTOOLS_INNER_RENDERER and\n * DevToolsContentRenderer becomes the new ContentRenderer, delegating\n * all calls and collecting timing data.\n *\n * @param innerRenderer The renderer class to wrap with devtools instrumentation.\n *\n * @experimental Content DevTools is experimental and may change in future releases.\n *\n * @example\n * ```typescript\n * provideContent(\n * withContentDevTools(NoopContentRenderer),\n * );\n * ```\n */\nexport function withContentDevTools(\n innerRenderer: Type<ContentRenderer>,\n): Provider {\n return [\n {\n provide: DEVTOOLS_INNER_RENDERER,\n useClass: innerRenderer,\n },\n {\n provide: ContentRenderer,\n useClass: DevToolsContentRenderer,\n },\n ];\n}\n"],"mappings":";;;;;;;;;;;;AAYA,IAAa,0BACX,IAAI,eAAgC,0BAA0B;;;;;;;;IAetD,0BAAA,MAAA,gCAAiC,gBAAQ;CAC/C,cAAgB;AAEZ,QAAO,GAAA,UAAW;AACpB,OAAO,QAAA,OACD,wBAAY;;CAGZ,MAAA,OAAA,SAAc;EACd,MAAK,QAAO,YAAA,KAAA;EACZ,MAAA,SAAe,MAAQ,KAAA,MAAA,OAAA,QAAA;EACvB,MAAA,UAAc,YAAW,KAAA,GAAA;AACzB,MAAA,OAAa,WAAA,YAGlB,QAAA,cAAA,IAAA,YAAA,gCAAA,EAAA,QAAA;GAGI,UAAA,KAAA,MAAA,YAAA;;GAGmB,KAAA,OAAuC;GAC/C,eAAA,QAAmB;;GAGd,aAAA,EAAA;GACZ,EAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtDf,QAAO,UAAU,EAAA;;;;;;;;;;;;;;;;;;;;;;;AC4BjB,SAAgB,wBAAgC;CAC9C,IAAI,QAAQ;AAEZ,QAAO;EACC,MAAA;EACN,OAAO;EAEP,eAAe,QAAQ;AACb,WAAO,OAAA,YAAY;;EAG7B,oBAAoB;GACX,OAAA;GACD,MAAQ,QAAM,MAAA;AACN,QAAA,CAAA,MAEN,QAAY;IACZ,MAAU,aAAA,GAAA,+BAAA,UAAA,GAAA,+BAAA,eAAmB,OAAA,KAAA,IAA8B,CAAA;IAC3D,MAAA,WAAA,GAAA,+BAAA,SAAqB,WAAW,8BAA6B;IAE/D,MAAA,cAAA,GAAA,+BAAA,SAAA,WAAA,6BAAA;IACA,IAAA;IACA,IAAA;AACI,QAAA;AACO,YAAA,GAAA,+BAAA,cAAa,SAAY,QAAQ;AACxC,mBAAA,GAAA,+BAAA,cAAA,YAAA,QAAA;;AAaH,YAAA;;IAGO,MAAA,kBAAsB,MAAA,iBAAqB,YAAA,8BAAA,EAAA,MAAA,MAAA,CAAA;;;wBAG5D,gBAAA,KAAA;;;;;;;;;;;;;;;;;;;;;;;;;;ACzCH,SAAgB,oBACd,eACU;AACV,QACE,CACE;EACU,SAAA;EAEZ,UAAA;EACE,EACA;EAEH,SAAA"}
@@ -1,215 +0,0 @@
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, '&amp;')
141
- .replace(/</g, '&lt;')
142
- .replace(/>/g, '&gt;')
143
- .replace(/"/g, '&quot;');
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
- }
@@ -1,194 +0,0 @@
1
- #analog-content-devtools {
2
- position: fixed;
3
- bottom: 0;
4
- right: 0;
5
- z-index: 99999;
6
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
7
- font-size: 12px;
8
- color: #e4e4e7;
9
- pointer-events: none;
10
- }
11
-
12
- #analog-content-devtools * {
13
- box-sizing: border-box;
14
- }
15
-
16
- #analog-content-devtools .acd-toggle {
17
- position: fixed;
18
- bottom: 12px;
19
- right: 12px;
20
- width: 36px;
21
- height: 36px;
22
- border-radius: 8px;
23
- background: #18181b;
24
- border: 1px solid #3f3f46;
25
- cursor: pointer;
26
- display: flex;
27
- align-items: center;
28
- justify-content: center;
29
- pointer-events: auto;
30
- opacity: 0.7;
31
- transition: opacity 0.15s;
32
- }
33
-
34
- #analog-content-devtools .acd-toggle:hover {
35
- opacity: 1;
36
- }
37
-
38
- #analog-content-devtools .acd-toggle svg {
39
- width: 20px;
40
- height: 20px;
41
- fill: #a1a1aa;
42
- }
43
-
44
- #analog-content-devtools .acd-panel {
45
- position: fixed;
46
- bottom: 56px;
47
- right: 12px;
48
- width: 420px;
49
- max-height: 70vh;
50
- background: #18181b;
51
- border: 1px solid #3f3f46;
52
- border-radius: 10px;
53
- overflow: hidden;
54
- display: flex;
55
- flex-direction: column;
56
- pointer-events: auto;
57
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
58
- }
59
-
60
- #analog-content-devtools .acd-header {
61
- display: flex;
62
- align-items: center;
63
- justify-content: space-between;
64
- padding: 8px 12px;
65
- background: #27272a;
66
- border-bottom: 1px solid #3f3f46;
67
- font-weight: 600;
68
- font-size: 11px;
69
- text-transform: uppercase;
70
- letter-spacing: 0.05em;
71
- color: #a1a1aa;
72
- }
73
-
74
- #analog-content-devtools .acd-tabs {
75
- display: flex;
76
- gap: 2px;
77
- padding: 4px 8px;
78
- background: #27272a;
79
- border-bottom: 1px solid #3f3f46;
80
- }
81
-
82
- #analog-content-devtools .acd-tab {
83
- padding: 4px 10px;
84
- border-radius: 4px;
85
- background: transparent;
86
- border: none;
87
- color: #71717a;
88
- cursor: pointer;
89
- font-size: 11px;
90
- font-family: inherit;
91
- }
92
-
93
- #analog-content-devtools .acd-tab:hover {
94
- color: #a1a1aa;
95
- }
96
-
97
- #analog-content-devtools .acd-tab[data-active='true'] {
98
- background: #3f3f46;
99
- color: #e4e4e7;
100
- }
101
-
102
- #analog-content-devtools .acd-body {
103
- overflow-y: auto;
104
- padding: 12px;
105
- flex: 1;
106
- }
107
-
108
- #analog-content-devtools .acd-section {
109
- margin-bottom: 12px;
110
- }
111
-
112
- #analog-content-devtools .acd-section-title {
113
- font-size: 10px;
114
- font-weight: 600;
115
- text-transform: uppercase;
116
- letter-spacing: 0.05em;
117
- color: #71717a;
118
- margin-bottom: 6px;
119
- }
120
-
121
- #analog-content-devtools .acd-kv {
122
- display: flex;
123
- justify-content: space-between;
124
- padding: 2px 0;
125
- border-bottom: 1px solid #27272a;
126
- }
127
-
128
- #analog-content-devtools .acd-key {
129
- color: #a1a1aa;
130
- }
131
-
132
- #analog-content-devtools .acd-value {
133
- color: #22d3ee;
134
- }
135
-
136
- #analog-content-devtools .acd-value.acd-fast {
137
- color: #4ade80;
138
- }
139
-
140
- #analog-content-devtools .acd-value.acd-slow {
141
- color: #fb923c;
142
- }
143
-
144
- #analog-content-devtools .acd-toc-item {
145
- padding: 2px 0;
146
- cursor: pointer;
147
- color: #a1a1aa;
148
- }
149
-
150
- #analog-content-devtools .acd-toc-item:hover {
151
- color: #e4e4e7;
152
- }
153
-
154
- #analog-content-devtools .acd-toc-item a {
155
- color: inherit;
156
- text-decoration: none;
157
- }
158
-
159
- #analog-content-devtools .acd-pre {
160
- background: #09090b;
161
- border: 1px solid #27272a;
162
- border-radius: 6px;
163
- padding: 8px;
164
- overflow-x: auto;
165
- white-space: pre-wrap;
166
- overflow-wrap: anywhere;
167
- font-size: 11px;
168
- line-height: 1.5;
169
- max-height: 300px;
170
- overflow-y: auto;
171
- }
172
-
173
- #analog-content-devtools .acd-empty {
174
- color: #52525b;
175
- font-style: italic;
176
- }
177
-
178
- #analog-content-devtools .acd-badge {
179
- display: inline-block;
180
- padding: 1px 6px;
181
- border-radius: 4px;
182
- font-size: 10px;
183
- font-weight: 600;
184
- }
185
-
186
- #analog-content-devtools .acd-badge-experimental {
187
- background: #422006;
188
- color: #fb923c;
189
- }
190
-
191
- #analog-content-devtools .acd-badge-renderer {
192
- background: #042f2e;
193
- color: #2dd4bf;
194
- }
@@ -1 +0,0 @@
1
- export { contentDevToolsPlugin, DevToolsContentRenderer, withContentDevTools, } from '../../src/lib/devtools/index';
@@ -1,23 +0,0 @@
1
- import type { Plugin } from 'vite';
2
- /**
3
- * Vite plugin that injects the Analog Content DevTools panel in dev mode.
4
- *
5
- * Shows render time, frontmatter data, TOC, and content stats in a floating
6
- * panel. Dev-only — completely stripped from production builds.
7
- *
8
- * @experimental Content DevTools is experimental and may change in future releases.
9
- *
10
- * @example
11
- * ```typescript
12
- * // vite.config.ts
13
- * import { contentDevToolsPlugin } from '@analogjs/content/devtools';
14
- *
15
- * export default defineConfig({
16
- * plugins: [
17
- * analog({ ... }),
18
- * contentDevToolsPlugin(),
19
- * ],
20
- * });
21
- * ```
22
- */
23
- export declare function contentDevToolsPlugin(): Plugin;
@@ -1,23 +0,0 @@
1
- import { InjectionToken } from '@angular/core';
2
- import { ContentRenderer, RenderedContent, TableOfContentItem } from '../content-renderer';
3
- import * as i0 from "@angular/core";
4
- /**
5
- * Token for the wrapped renderer that DevTools delegates to.
6
- * @internal
7
- */
8
- export declare const DEVTOOLS_INNER_RENDERER: InjectionToken<ContentRenderer>;
9
- /**
10
- * Wraps an existing ContentRenderer to collect timing and metadata for the
11
- * Content DevTools panel. Dispatches a custom event on the window after
12
- * each render so the devtools client can update.
13
- *
14
- * @experimental Content DevTools is experimental and may change in future releases.
15
- */
16
- export declare class DevToolsContentRenderer extends ContentRenderer {
17
- private readonly inner;
18
- render(content: string): Promise<RenderedContent>;
19
- getContentHeadings(content: string): TableOfContentItem[];
20
- enhance(): void;
21
- static ɵfac: i0.ɵɵFactoryDeclaration<DevToolsContentRenderer, never>;
22
- static ɵprov: i0.ɵɵInjectableDeclaration<DevToolsContentRenderer>;
23
- }
@@ -1,23 +0,0 @@
1
- import { Provider, Type } from '@angular/core';
2
- import { ContentRenderer } from '../content-renderer';
3
- export { contentDevToolsPlugin } from './content-devtools-plugin';
4
- export { DevToolsContentRenderer, DEVTOOLS_INNER_RENDERER, } from './content-devtools-renderer';
5
- /**
6
- * Wraps the given ContentRenderer with DevTools instrumentation.
7
- *
8
- * The supplied renderer class is provided under DEVTOOLS_INNER_RENDERER and
9
- * DevToolsContentRenderer becomes the new ContentRenderer, delegating
10
- * all calls and collecting timing data.
11
- *
12
- * @param innerRenderer The renderer class to wrap with devtools instrumentation.
13
- *
14
- * @experimental Content DevTools is experimental and may change in future releases.
15
- *
16
- * @example
17
- * ```typescript
18
- * provideContent(
19
- * withContentDevTools(NoopContentRenderer),
20
- * );
21
- * ```
22
- */
23
- export declare function withContentDevTools(innerRenderer: Type<ContentRenderer>): Provider;