@deskwork/studio 0.11.1 → 0.12.1

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.
Files changed (52) hide show
  1. package/README.md +19 -0
  2. package/dist/lib/client-script.d.ts +24 -0
  3. package/dist/lib/client-script.d.ts.map +1 -0
  4. package/dist/lib/client-script.js +34 -0
  5. package/dist/lib/client-script.js.map +1 -0
  6. package/dist/lib/entry-resolver.d.ts.map +1 -1
  7. package/dist/lib/entry-resolver.js +16 -9
  8. package/dist/lib/entry-resolver.js.map +1 -1
  9. package/dist/lib/version.d.ts +10 -0
  10. package/dist/lib/version.d.ts.map +1 -0
  11. package/dist/lib/version.js +29 -0
  12. package/dist/lib/version.js.map +1 -0
  13. package/dist/pages/content.d.ts.map +1 -1
  14. package/dist/pages/content.js +50 -2
  15. package/dist/pages/content.js.map +1 -1
  16. package/dist/pages/content.ts +53 -2
  17. package/dist/pages/dashboard/header.d.ts.map +1 -1
  18. package/dist/pages/dashboard/header.js +3 -0
  19. package/dist/pages/dashboard/header.js.map +1 -1
  20. package/dist/pages/dashboard/header.ts +3 -0
  21. package/dist/pages/dashboard/section.d.ts +6 -3
  22. package/dist/pages/dashboard/section.d.ts.map +1 -1
  23. package/dist/pages/dashboard/section.js +25 -12
  24. package/dist/pages/dashboard/section.js.map +1 -1
  25. package/dist/pages/dashboard/section.ts +26 -13
  26. package/dist/pages/dashboard.js +1 -1
  27. package/dist/pages/dashboard.js.map +1 -1
  28. package/dist/pages/dashboard.ts +1 -1
  29. package/dist/pages/entry-review.js +1 -1
  30. package/dist/pages/entry-review.js.map +1 -1
  31. package/dist/pages/entry-review.ts +1 -1
  32. package/dist/pages/layout.d.ts +6 -1
  33. package/dist/pages/layout.d.ts.map +1 -1
  34. package/dist/pages/layout.js +6 -3
  35. package/dist/pages/layout.js.map +1 -1
  36. package/dist/pages/layout.ts +12 -4
  37. package/dist/pages/review.js +1 -1
  38. package/dist/pages/review.js.map +1 -1
  39. package/dist/pages/review.ts +1 -1
  40. package/dist/pages/scrapbook.js +1 -1
  41. package/dist/pages/scrapbook.js.map +1 -1
  42. package/dist/pages/scrapbook.ts +1 -1
  43. package/dist/pages/shortform.js +1 -1
  44. package/dist/pages/shortform.js.map +1 -1
  45. package/dist/pages/shortform.ts +1 -1
  46. package/dist/routes/api.d.ts.map +1 -1
  47. package/dist/routes/api.js +89 -0
  48. package/dist/routes/api.js.map +1 -1
  49. package/dist/server.d.ts.map +1 -1
  50. package/dist/server.js +86 -13
  51. package/dist/server.js.map +1 -1
  52. package/package.json +4 -2
package/README.md CHANGED
@@ -23,6 +23,25 @@ The studio binds to loopback by default (`127.0.0.1`) plus the local Tailscale i
23
23
  | `/dev/scrapbook/<site>/<path>` | Scrapbook viewer at any depth |
24
24
  | `/dev/content/<site>/<project>` | Bird's-eye content tree view |
25
25
 
26
+ ### Local development (deskwork monorepo)
27
+
28
+ When working on the studio itself from inside this monorepo:
29
+
30
+ ```sh
31
+ npm install # creates workspace symlinks
32
+ npm run dev --workspace @deskwork/studio # Vite-in-Hono on port 47321
33
+ ```
34
+
35
+ `npm run dev` boots the studio with `DESKWORK_DEV=1` and `tsx --watch`, mounting Vite's dev middleware in front of Hono. Effects:
36
+
37
+ - Edits under `packages/studio/src/*.ts` (server-side) auto-restart the process.
38
+ - Edits under `plugins/deskwork-studio/public/src/*.ts` (client-side) are served by Vite with HMR — the browser auto-reloads on save (full module HMR engages whenever modules add `import.meta.hot` handlers).
39
+ - The in-process esbuild step is skipped; client TS source is served directly via Vite at `/src/<name>.ts`.
40
+
41
+ The dev server points at the workspace root (`--project-root ../..`) so it reads the project's own `.deskwork/config.json` and surfaces the project's calendar.
42
+
43
+ Production code path (no `DESKWORK_DEV`) is unchanged — the studio runs the in-process esbuild on boot and serves bundled JS from `.runtime-cache/dist/`.
44
+
26
45
  ### Source
27
46
 
28
47
  Repository: [`audiocontrol-org/deskwork`](https://github.com/audiocontrol-org/deskwork). The studio source lives at [`packages/studio/`](https://github.com/audiocontrol-org/deskwork/tree/main/packages/studio); shared core logic in [`@deskwork/core`](https://www.npmjs.com/package/@deskwork/core); the lifecycle CLI in [`@deskwork/cli`](https://www.npmjs.com/package/@deskwork/cli).
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Emit the <script> tag for a client-side TS module.
3
+ *
4
+ * Dev mode (DESKWORK_DEV=1): emit /src/<name>.ts so Vite's middleware serves
5
+ * the source with HMR.
6
+ *
7
+ * Prod mode (default): emit /static/dist/<name>.js (the in-process esbuild
8
+ * output served from .runtime-cache/dist/).
9
+ */
10
+ export declare function clientScriptTag(name: string): string;
11
+ /**
12
+ * Emit the Vite HMR client `<script>` tag — empty string in prod.
13
+ *
14
+ * Vite's `/@vite/client` module connects the browser to Vite's WebSocket,
15
+ * receives invalidation events on file change, and either runs the
16
+ * module's `import.meta.hot.accept` handler or triggers a full page
17
+ * reload. With no `import.meta.hot` calls in the studio's client code
18
+ * yet, this gives us auto-reload on save (HMR-grade behavior without the
19
+ * fine-grained module updates).
20
+ *
21
+ * Layout prepends this to scriptModules in dev so every page gets it.
22
+ */
23
+ export declare function viteClientTag(): string;
24
+ //# sourceMappingURL=client-script.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-script.d.ts","sourceRoot":"","sources":["../../src/lib/client-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAKtC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Emit the <script> tag for a client-side TS module.
3
+ *
4
+ * Dev mode (DESKWORK_DEV=1): emit /src/<name>.ts so Vite's middleware serves
5
+ * the source with HMR.
6
+ *
7
+ * Prod mode (default): emit /static/dist/<name>.js (the in-process esbuild
8
+ * output served from .runtime-cache/dist/).
9
+ */
10
+ export function clientScriptTag(name) {
11
+ if (process.env.DESKWORK_DEV === '1') {
12
+ return `<script type="module" src="/src/${name}.ts"></script>`;
13
+ }
14
+ return `<script type="module" src="/static/dist/${name}.js"></script>`;
15
+ }
16
+ /**
17
+ * Emit the Vite HMR client `<script>` tag — empty string in prod.
18
+ *
19
+ * Vite's `/@vite/client` module connects the browser to Vite's WebSocket,
20
+ * receives invalidation events on file change, and either runs the
21
+ * module's `import.meta.hot.accept` handler or triggers a full page
22
+ * reload. With no `import.meta.hot` calls in the studio's client code
23
+ * yet, this gives us auto-reload on save (HMR-grade behavior without the
24
+ * fine-grained module updates).
25
+ *
26
+ * Layout prepends this to scriptModules in dev so every page gets it.
27
+ */
28
+ export function viteClientTag() {
29
+ if (process.env.DESKWORK_DEV === '1') {
30
+ return '<script type="module" src="/@vite/client"></script>';
31
+ }
32
+ return '';
33
+ }
34
+ //# sourceMappingURL=client-script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-script.js","sourceRoot":"","sources":["../../src/lib/client-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,GAAG,EAAE,CAAC;QACrC,OAAO,mCAAmC,IAAI,gBAAgB,CAAC;IACjE,CAAC;IACD,OAAO,2CAA2C,IAAI,gBAAgB,CAAC;AACzE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,GAAG,EAAE,CAAC;QACrC,OAAO,qDAAqD,CAAC;IAC/D,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"entry-resolver.d.ts","sourceRoot":"","sources":["../../src/lib/entry-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAS,MAAM,6BAA6B,CAAC;AAEhE,UAAU,aAAa;IACrB,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAaD,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAc5F"}
1
+ {"version":3,"file":"entry-resolver.d.ts","sourceRoot":"","sources":["../../src/lib/entry-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,KAAK,EAAS,MAAM,6BAA6B,CAAC;AAEhE,UAAU,aAAa;IACrB,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAaD,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAoB5F"}
@@ -14,6 +14,7 @@
14
14
  import { readFile } from 'node:fs/promises';
15
15
  import { join } from 'node:path';
16
16
  import { readSidecar } from '@deskwork/core/sidecar';
17
+ import { getContentDir } from '@deskwork/core/config';
17
18
  const STAGE_ARTIFACT = {
18
19
  Ideas: (s, d) => join(d, s, 'scrapbook', 'idea.md'),
19
20
  Planned: (s, d) => join(d, s, 'scrapbook', 'plan.md'),
@@ -26,16 +27,22 @@ const STAGE_ARTIFACT = {
26
27
  };
27
28
  export async function resolveEntry(projectRoot, uuid) {
28
29
  const entry = await readSidecar(projectRoot, uuid);
29
- // TODO(pipeline-redesign Phase 6+): read content dir from .deskwork/config.json.
30
- // Until config plumbing lands, default to `docs/` (matches every test fixture
31
- // and the canonical layout in the redesign spec).
32
- const contentDir = join(projectRoot, 'docs');
33
- const stage = entry.priorStage ?? entry.currentStage;
34
- const pathFn = STAGE_ARTIFACT[stage];
35
- if (pathFn === null) {
36
- throw new Error(`No artifact path for stage ${stage}`);
30
+ // #140: prefer the explicit artifactPath when set; fall back to the
31
+ // slug+stage heuristic only for entries that don't have one (entries
32
+ // created pre-#140 fix and not yet doctor-repaired).
33
+ let artifactPath;
34
+ if (entry.artifactPath) {
35
+ artifactPath = join(projectRoot, entry.artifactPath);
36
+ }
37
+ else {
38
+ const stage = entry.priorStage ?? entry.currentStage;
39
+ const pathFn = STAGE_ARTIFACT[stage];
40
+ if (pathFn === null) {
41
+ throw new Error(`No artifact path for stage ${stage}`);
42
+ }
43
+ const contentDir = getContentDir(projectRoot);
44
+ artifactPath = pathFn(entry.slug, contentDir);
37
45
  }
38
- const artifactPath = pathFn(entry.slug, contentDir);
39
46
  const artifactBody = await readFile(artifactPath, 'utf8');
40
47
  return { entry, artifactBody, artifactPath };
41
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"entry-resolver.js","sourceRoot":"","sources":["../../src/lib/entry-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AASrD,MAAM,cAAc,GAAyE;IAC3F,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC;IACnD,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC;IACrD,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC;IAC1D,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IAC1C,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IACvC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IAC3C,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,IAAI;CAChB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB,EAAE,IAAY;IAClE,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACnD,iFAAiF;IACjF,8EAA8E;IAC9E,kDAAkD;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,YAAY,CAAC;IACrD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC1D,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"entry-resolver.js","sourceRoot":"","sources":["../../src/lib/entry-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAStD,MAAM,cAAc,GAAyE;IAC3F,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC;IACnD,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC;IACrD,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,YAAY,CAAC;IAC1D,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IAC1C,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IACvC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IAC3C,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,IAAI;CAChB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB,EAAE,IAAY;IAClE,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAEnD,oEAAoE;IACpE,qEAAqE;IACrE,qDAAqD;IACrD,IAAI,YAAoB,CAAC;IACzB,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,YAAY,CAAC;QACrD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;QAC9C,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC1D,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Studio version surfacing (#111).
3
+ *
4
+ * Reads the studio's own package.json via `import.meta.url` so the
5
+ * version is always whatever was published / built — no env-var
6
+ * juggling, works for source-loaded plugin paths AND cache-installed
7
+ * paths. Memoized: read once at module load, reuse across requests.
8
+ */
9
+ export declare function getStudioVersion(): string;
10
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,wBAAgB,gBAAgB,IAAI,MAAM,CAazC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Studio version surfacing (#111).
3
+ *
4
+ * Reads the studio's own package.json via `import.meta.url` so the
5
+ * version is always whatever was published / built — no env-var
6
+ * juggling, works for source-loaded plugin paths AND cache-installed
7
+ * paths. Memoized: read once at module load, reuse across requests.
8
+ */
9
+ import { readFileSync } from 'node:fs';
10
+ import { dirname, resolve } from 'node:path';
11
+ import { fileURLToPath } from 'node:url';
12
+ let memoized;
13
+ export function getStudioVersion() {
14
+ if (memoized !== undefined)
15
+ return memoized;
16
+ // Source layout: packages/studio/dist/lib/version.js → ../.. = packages/studio/
17
+ // tsx-from-source layout: packages/studio/src/lib/version.ts → ../.. = packages/studio/
18
+ const here = fileURLToPath(import.meta.url);
19
+ const pkgPath = resolve(dirname(here), '..', '..', 'package.json');
20
+ try {
21
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
22
+ memoized = pkg.version ?? 'unknown';
23
+ }
24
+ catch {
25
+ memoized = 'unknown';
26
+ }
27
+ return memoized;
28
+ }
29
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,IAAI,QAA4B,CAAC;AAEjC,MAAM,UAAU,gBAAgB;IAC9B,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,gFAAgF;IAChF,wFAAwF;IACxF,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACnE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAyB,CAAC;QAC/E,QAAQ,GAAG,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,GAAG,SAAS,CAAC;IACvB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/pages/content.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAWH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAOjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOtD;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,YAAY,CAAC;AAqJzD,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,aAAa,EAClB,QAAQ,CAAC,EAAE,WAAW,GACrB,MAAM,CA2CR;AAkMD,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,QAAQ,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA2D3C"}
1
+ {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/pages/content.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAWH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAOjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOtD;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,YAAY,CAAC;AAqJzD,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,aAAa,EAClB,QAAQ,CAAC,EAAE,WAAW,GACrB,MAAM,CA2CR;AAkMD,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,QAAQ,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAuE3C"}
@@ -166,7 +166,7 @@ export function renderContentTopLevel(ctx, getIndex) {
166
166
  // #29: lightbox listener for image thumbnails in detail-panel
167
167
  // scrap rows. Idempotent — safe to load on the top-level page
168
168
  // too (no scrap rows there → no work).
169
- scriptModules: ['/static/dist/content-view-client.js'],
169
+ scriptModules: ['content-view-client'],
170
170
  });
171
171
  }
172
172
  // ---------------------------------------------------------------------------
@@ -339,6 +339,18 @@ export async function renderContentProject(ctx, site, projectSlug, selectedPath,
339
339
  const sp = loadProjectsForSite(ctx, site, getIndex);
340
340
  const project = sp.projects.find((p) => p.rootSlug === projectSlug);
341
341
  if (!project) {
342
+ // #145: a URL of the form `/dev/content/<site>/<slug>` may refer to
343
+ // an entry whose actual on-disk artifact lives DEEP in the tree
344
+ // (e.g. `<contentDir>/1.0/<slug>.md`). Such entries appear as
345
+ // sub-nodes under their root segment, not as top-level projects.
346
+ // Walk the assembled tree once for a node whose path's basename
347
+ // matches the requested slug; if found, redirect to the canonical
348
+ // deep URL instead of 404'ing.
349
+ const deepHit = findNodeBySlugBasename(sp.projects, projectSlug);
350
+ if (deepHit !== null) {
351
+ const target = `/dev/content/${site}/${encodeURI(deepHit)}`;
352
+ return { status: 200, html: redirectHtml(target) };
353
+ }
342
354
  return {
343
355
  status: 404,
344
356
  html: renderNotFound(`unknown project: ${projectSlug} on ${site}`),
@@ -385,10 +397,46 @@ export async function renderContentProject(ctx, site, projectSlug, selectedPath,
385
397
  bodyHtml: body,
386
398
  // #29: scrap rows in the detail panel have image thumbnails;
387
399
  // wire up the lightbox.
388
- scriptModules: ['/static/dist/content-view-client.js'],
400
+ scriptModules: ['content-view-client'],
389
401
  }),
390
402
  };
391
403
  }
404
+ /**
405
+ * #145: walk projects' trees in DFS order and return the first node
406
+ * whose path's last segment matches `slug`. Used to redirect
407
+ * slug-only URLs to their canonical deep path.
408
+ */
409
+ function findNodeBySlugBasename(projects, slug) {
410
+ for (const project of projects) {
411
+ const found = walkForBasename(project.root, slug);
412
+ if (found !== null)
413
+ return found;
414
+ }
415
+ return null;
416
+ }
417
+ function walkForBasename(node, slug) {
418
+ const last = node.path.split('/').pop() ?? '';
419
+ if (last === slug)
420
+ return node.path;
421
+ for (const child of node.children) {
422
+ const found = walkForBasename(child, slug);
423
+ if (found !== null)
424
+ return found;
425
+ }
426
+ return null;
427
+ }
428
+ /**
429
+ * Server-side meta-refresh redirect. Used when we want to land the
430
+ * adopter at a different URL but can't issue a 302 from the page
431
+ * renderer (we return a result tuple, not a Response). Browsers honor
432
+ * the meta refresh; bots see a usable HTML body.
433
+ */
434
+ function redirectHtml(target) {
435
+ const escaped = target.replace(/&/g, '&amp;').replace(/"/g, '&quot;');
436
+ return `<!doctype html><meta http-equiv="refresh" content="0;url=${escaped}">` +
437
+ `<title>Redirecting…</title>` +
438
+ `<a href="${escaped}">Redirecting to ${escaped}</a>`;
439
+ }
392
440
  function renderNotFound(message) {
393
441
  const body = html `
394
442
  ${renderEditorialFolio('content', 'not found')}
@@ -1 +1 @@
1
- {"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/pages/content.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/pages/content.ts"],"names":[],"mappings":"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"}
@@ -245,7 +245,7 @@ export function renderContentTopLevel(
245
245
  // #29: lightbox listener for image thumbnails in detail-panel
246
246
  // scrap rows. Idempotent — safe to load on the top-level page
247
247
  // too (no scrap rows there → no work).
248
- scriptModules: ['/static/dist/content-view-client.js'],
248
+ scriptModules: ['content-view-client'],
249
249
  });
250
250
  }
251
251
 
@@ -454,6 +454,18 @@ export async function renderContentProject(
454
454
  const sp = loadProjectsForSite(ctx, site, getIndex);
455
455
  const project = sp.projects.find((p) => p.rootSlug === projectSlug);
456
456
  if (!project) {
457
+ // #145: a URL of the form `/dev/content/<site>/<slug>` may refer to
458
+ // an entry whose actual on-disk artifact lives DEEP in the tree
459
+ // (e.g. `<contentDir>/1.0/<slug>.md`). Such entries appear as
460
+ // sub-nodes under their root segment, not as top-level projects.
461
+ // Walk the assembled tree once for a node whose path's basename
462
+ // matches the requested slug; if found, redirect to the canonical
463
+ // deep URL instead of 404'ing.
464
+ const deepHit = findNodeBySlugBasename(sp.projects, projectSlug);
465
+ if (deepHit !== null) {
466
+ const target = `/dev/content/${site}/${encodeURI(deepHit)}`;
467
+ return { status: 200, html: redirectHtml(target) };
468
+ }
457
469
  return {
458
470
  status: 404,
459
471
  html: renderNotFound(`unknown project: ${projectSlug} on ${site}`),
@@ -503,11 +515,50 @@ export async function renderContentProject(
503
515
  bodyHtml: body,
504
516
  // #29: scrap rows in the detail panel have image thumbnails;
505
517
  // wire up the lightbox.
506
- scriptModules: ['/static/dist/content-view-client.js'],
518
+ scriptModules: ['content-view-client'],
507
519
  }),
508
520
  };
509
521
  }
510
522
 
523
+ /**
524
+ * #145: walk projects' trees in DFS order and return the first node
525
+ * whose path's last segment matches `slug`. Used to redirect
526
+ * slug-only URLs to their canonical deep path.
527
+ */
528
+ function findNodeBySlugBasename(
529
+ projects: readonly ContentProject[],
530
+ slug: string,
531
+ ): string | null {
532
+ for (const project of projects) {
533
+ const found = walkForBasename(project.root, slug);
534
+ if (found !== null) return found;
535
+ }
536
+ return null;
537
+ }
538
+
539
+ function walkForBasename(node: ContentNode, slug: string): string | null {
540
+ const last = node.path.split('/').pop() ?? '';
541
+ if (last === slug) return node.path;
542
+ for (const child of node.children) {
543
+ const found = walkForBasename(child, slug);
544
+ if (found !== null) return found;
545
+ }
546
+ return null;
547
+ }
548
+
549
+ /**
550
+ * Server-side meta-refresh redirect. Used when we want to land the
551
+ * adopter at a different URL but can't issue a 302 from the page
552
+ * renderer (we return a result tuple, not a Response). Browsers honor
553
+ * the meta refresh; bots see a usable HTML body.
554
+ */
555
+ function redirectHtml(target: string): string {
556
+ const escaped = target.replace(/&/g, '&amp;').replace(/"/g, '&quot;');
557
+ return `<!doctype html><meta http-equiv="refresh" content="0;url=${escaped}">` +
558
+ `<title>Redirecting…</title>` +
559
+ `<a href="${escaped}">Redirecting to ${escaped}</a>`;
560
+ }
561
+
511
562
  function renderNotFound(message: string): string {
512
563
  const body = html`
513
564
  ${renderEditorialFolio('content', 'not found')}
@@ -1 +1 @@
1
- {"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../../src/pages/dashboard/header.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAuBxD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,aAAa,EACnB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,IAAI,GACR,OAAO,CA0BT;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAa3C"}
1
+ {"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../../src/pages/dashboard/header.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAwBxD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,aAAa,EACnB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,IAAI,GACR,OAAO,CA4BT;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAa3C"}
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import { DASHBOARD_STAGE_ORDER } from "./data.js";
10
10
  import { html, unsafe } from "../html.js";
11
+ import { getStudioVersion } from "../../lib/version.js";
11
12
  const MONTH_NAMES = [
12
13
  'January', 'February', 'March', 'April', 'May', 'June',
13
14
  'July', 'August', 'September', 'October', 'November', 'December',
@@ -43,6 +44,8 @@ export function renderHeader(data, projectRoot, now) {
43
44
  <p class="er-pagehead__deck">
44
45
  Project: <code>${projectRoot}</code>
45
46
  &nbsp;·&nbsp; <a class="er-link-marginalia" href="/dev/editorial-help">the manual</a>
47
+ &nbsp;·&nbsp; <span class="er-pagehead__version" data-studio-version
48
+ title="@deskwork/studio version">v${getStudioVersion()}</span>
46
49
  </p>
47
50
  <p class="er-pagehead__meta">
48
51
  <span>${issueDate}</span>
@@ -1 +1 @@
1
- {"version":3,"file":"header.js","sourceRoot":"","sources":["../../../src/pages/dashboard/header.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,GAAG;IAClB,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;IACtD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU;CACjE,CAAC;AAEF,SAAS,iBAAiB,CAAC,IAAmB;IAC5C,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW;YAAE,CAAC,EAAE,CAAC;IAClF,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,aAAa,CAAC,IAAmB;IACxC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,WAAW,KAAK,UAAU;YAAE,CAAC,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,IAAmB,EACnB,WAAmB,EACnB,GAAS;IAET,MAAM,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;IACzF,OAAO,MAAM,CAAC,IAAI,CAAA;;;aAGP,MAAM,eAAe,QAAQ;;;;;;uBAMnB,WAAW;;;;cAIpB,SAAS;;cAET,IAAI,CAAC,OAAO,CAAC,MAAM;;cAEnB,iBAAiB,CAAC,IAAI,CAAC;;cAEvB,aAAa,CAAC,IAAI,CAAC;;YAErB,CAAC,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,MAAM,CAAC,IAAI,CAAA;;;;;;;UAOV,qBAAqB,CAAC,GAAG,CACzB,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAA,4CAA4C,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAChG;;eAEM,CAAC,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"header.js","sourceRoot":"","sources":["../../../src/pages/dashboard/header.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,WAAW,GAAG;IAClB,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;IACtD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU;CACjE,CAAC;AAEF,SAAS,iBAAiB,CAAC,IAAmB;IAC5C,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW;YAAE,CAAC,EAAE,CAAC;IAClF,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,aAAa,CAAC,IAAmB;IACxC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,WAAW,KAAK,UAAU;YAAE,CAAC,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,IAAmB,EACnB,WAAmB,EACnB,GAAS;IAET,MAAM,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;IACzF,OAAO,MAAM,CAAC,IAAI,CAAA;;;aAGP,MAAM,eAAe,QAAQ;;;;;;uBAMnB,WAAW;;;4CAGU,gBAAgB,EAAE;;;cAGhD,SAAS;;cAET,IAAI,CAAC,OAAO,CAAC,MAAM;;cAEnB,iBAAiB,CAAC,IAAI,CAAC;;cAEvB,aAAa,CAAC,IAAI,CAAC;;YAErB,CAAC,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,MAAM,CAAC,IAAI,CAAA;;;;;;;UAOV,qBAAqB,CAAC,GAAG,CACzB,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAA,4CAA4C,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAChG;;eAEM,CAAC,CAAC;AACjB,CAAC"}
@@ -10,6 +10,7 @@
10
10
  import type { DashboardData } from './data.ts';
11
11
  import { DASHBOARD_STAGE_ORDER } from './data.ts';
12
12
  import { html, unsafe, type RawHtml } from '../html.ts';
13
+ import { getStudioVersion } from '../../lib/version.ts';
13
14
 
14
15
  const MONTH_NAMES = [
15
16
  'January', 'February', 'March', 'April', 'May', 'June',
@@ -51,6 +52,8 @@ export function renderHeader(
51
52
  <p class="er-pagehead__deck">
52
53
  Project: <code>${projectRoot}</code>
53
54
  &nbsp;·&nbsp; <a class="er-link-marginalia" href="/dev/editorial-help">the manual</a>
55
+ &nbsp;·&nbsp; <span class="er-pagehead__version" data-studio-version
56
+ title="@deskwork/studio version">v${getStudioVersion()}</span>
54
57
  </p>
55
58
  <p class="er-pagehead__meta">
56
59
  <span>${issueDate}</span>
@@ -22,9 +22,12 @@ import type { Entry, Stage } from '@deskwork/core/schema/entry';
22
22
  export declare function renderRow(entry: Entry, index: number): RawHtml;
23
23
  /**
24
24
  * Render one full stage section: heading + ornaments + count + rows.
25
- * Empty stages render the placeholder message — keeping the section
26
- * visible (rather than collapsing it) so the operator sees that the
27
- * stage exists and is currently empty.
25
+ *
26
+ * Empty stages render compact (just the heading, no placeholder body)
27
+ * keeps the operator's sense of pipeline shape without padding the
28
+ * dashboard with multi-line empty placeholders for low-volume
29
+ * calendars (#112). The hover title still surfaces the stage's
30
+ * "what to run next" hint when the operator points at the heading.
28
31
  */
29
32
  export declare function renderStageSection(stage: Stage, entries: readonly Entry[]): RawHtml;
30
33
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"section.d.ts","sourceRoot":"","sources":["../../../src/pages/dashboard/section.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AA6BhE;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CA8B9D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,KAAK,EAAE,GAAG,OAAO,CAkBnF;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,IAAI,OAAO,CAWvD"}
1
+ {"version":3,"file":"section.d.ts","sourceRoot":"","sources":["../../../src/pages/dashboard/section.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AA6BhE;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAgC9D;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,KAAK,EAAE,GAAG,OAAO,CA0BnF;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,IAAI,OAAO,CAWvD"}
@@ -60,27 +60,40 @@ export function renderRow(entry, index) {
60
60
  <span class="er-calendar-title">${entry.title}</span>
61
61
  <span class="er-calendar-meta er-calendar-meta-iteration"
62
62
  data-iteration="${iteration}">iteration: ${iteration}</span>
63
- <span class="er-calendar-meta er-calendar-meta-updated"
64
- title="${entry.updatedAt}">${formatDate(entry.updatedAt)}</span>
63
+ <time class="er-calendar-meta er-calendar-meta-updated" data-format="date"
64
+ datetime="${entry.updatedAt}" title="${entry.updatedAt}">${formatDate(entry.updatedAt)}</time>
65
65
  </div>
66
- <span class="er-calendar-status">${renderReviewStateBadge(entry.reviewState)}</span>
66
+ <span class="er-calendar-status"><a href="${reviewLink}"
67
+ title="open the review surface for ${entry.slug}"
68
+ class="er-stamp-link">${renderReviewStateBadge(entry.reviewState)}</a></span>
67
69
  ${renderRowActions(entry)}
68
70
  </div>
69
71
  </div>`);
70
72
  }
71
73
  /**
72
74
  * Render one full stage section: heading + ornaments + count + rows.
73
- * Empty stages render the placeholder message — keeping the section
74
- * visible (rather than collapsing it) so the operator sees that the
75
- * stage exists and is currently empty.
75
+ *
76
+ * Empty stages render compact (just the heading, no placeholder body)
77
+ * keeps the operator's sense of pipeline shape without padding the
78
+ * dashboard with multi-line empty placeholders for low-volume
79
+ * calendars (#112). The hover title still surfaces the stage's
80
+ * "what to run next" hint when the operator points at the heading.
76
81
  */
77
82
  export function renderStageSection(stage, entries) {
78
- const body = entries.length === 0
79
- ? unsafe(html `<div class="er-empty" data-empty-stage="${stage}"
80
- style="padding: 1rem 0.25rem; font-size: 0.95rem;">
81
- ${STAGE_EMPTY_MESSAGES[stage]}
82
- </div>`)
83
- : unsafe(entries.map((e, i) => renderRow(e, i).__raw).join(''));
83
+ if (entries.length === 0) {
84
+ return unsafe(html `
85
+ <section class="er-section er-section--empty"
86
+ id="stage-${stage.toLowerCase()}" data-stage-section="${stage}"
87
+ data-empty-stage="${stage}">
88
+ <h2 class="er-section-head er-section-head--empty"
89
+ title="${STAGE_EMPTY_MESSAGES[stage]}">
90
+ <span>${stage}</span>
91
+ <span class="ornament">${STAGE_ORNAMENTS[stage]}</span>
92
+ <span class="count">№ 00</span>
93
+ </h2>
94
+ </section>`);
95
+ }
96
+ const body = unsafe(entries.map((e, i) => renderRow(e, i).__raw).join(''));
84
97
  return unsafe(html `
85
98
  <section class="er-section" id="stage-${stage.toLowerCase()}" data-stage-section="${stage}">
86
99
  <h2 class="er-section-head">
@@ -1 +1 @@
1
- {"version":3,"file":"section.js","sourceRoot":"","sources":["../../../src/pages/dashboard/section.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"section.js","sourceRoot":"","sources":["../../../src/pages/dashboard/section.ts"],"names":[],"mappings":"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"}