@deskwork/studio 0.12.0 → 0.13.0
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/dist/components/scrapbook-item.d.ts +9 -1
- package/dist/components/scrapbook-item.d.ts.map +1 -1
- package/dist/components/scrapbook-item.js +11 -2
- package/dist/components/scrapbook-item.js.map +1 -1
- package/dist/data/glossary.json +62 -0
- package/dist/lib/glossary-helper.d.ts +16 -0
- package/dist/lib/glossary-helper.d.ts.map +1 -0
- package/dist/lib/glossary-helper.js +26 -0
- package/dist/lib/glossary-helper.js.map +1 -0
- package/dist/lib/version.d.ts +10 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +29 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/pages/chrome.d.ts +24 -13
- package/dist/pages/chrome.d.ts.map +1 -1
- package/dist/pages/chrome.js +25 -24
- package/dist/pages/chrome.js.map +1 -1
- package/dist/pages/chrome.ts +38 -27
- package/dist/pages/content-detail.js +1 -1
- package/dist/pages/content-detail.js.map +1 -1
- package/dist/pages/content-detail.ts +1 -1
- package/dist/pages/content.d.ts.map +1 -1
- package/dist/pages/content.js +48 -0
- package/dist/pages/content.js.map +1 -1
- package/dist/pages/content.ts +51 -0
- package/dist/pages/dashboard/header.d.ts.map +1 -1
- package/dist/pages/dashboard/header.js +3 -0
- package/dist/pages/dashboard/header.js.map +1 -1
- package/dist/pages/dashboard/header.ts +3 -0
- package/dist/pages/dashboard/section.d.ts +6 -3
- package/dist/pages/dashboard/section.d.ts.map +1 -1
- package/dist/pages/dashboard/section.js +25 -12
- package/dist/pages/dashboard/section.js.map +1 -1
- package/dist/pages/dashboard/section.ts +26 -13
- package/dist/pages/entry-review.js +2 -2
- package/dist/pages/entry-review.js.map +1 -1
- package/dist/pages/entry-review.ts +2 -2
- package/dist/pages/html.d.ts +2 -0
- package/dist/pages/html.d.ts.map +1 -1
- package/dist/pages/html.js +2 -0
- package/dist/pages/html.js.map +1 -1
- package/dist/pages/html.ts +4 -0
- package/dist/pages/layout.d.ts.map +1 -1
- package/dist/pages/layout.js +6 -0
- package/dist/pages/layout.js.map +1 -1
- package/dist/pages/layout.ts +7 -0
- package/dist/pages/review-scrapbook-drawer.d.ts +7 -0
- package/dist/pages/review-scrapbook-drawer.d.ts.map +1 -1
- package/dist/pages/review-scrapbook-drawer.js +45 -6
- package/dist/pages/review-scrapbook-drawer.js.map +1 -1
- package/dist/pages/review-scrapbook-drawer.ts +50 -6
- package/dist/pages/review.d.ts.map +1 -1
- package/dist/pages/review.js +168 -41
- package/dist/pages/review.js.map +1 -1
- package/dist/pages/review.ts +192 -41
- package/dist/pages/scrapbook.d.ts +7 -14
- package/dist/pages/scrapbook.d.ts.map +1 -1
- package/dist/pages/scrapbook.js +352 -193
- package/dist/pages/scrapbook.js.map +1 -1
- package/dist/pages/scrapbook.ts +390 -222
- package/dist/pages/shortform.js +1 -1
- package/dist/pages/shortform.js.map +1 -1
- package/dist/pages/shortform.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +26 -13
- package/dist/server.js.map +1 -1
- package/package.json +4 -4
|
@@ -103,6 +103,14 @@ export declare function renderReadOnlyScrapbookRow(address: ScrapbookAddress, it
|
|
|
103
103
|
* Render an empty-state row for a scrapbook drawer / panel that has
|
|
104
104
|
* no items. Shown faded so the operator still sees the section exists
|
|
105
105
|
* for this node.
|
|
106
|
+
*
|
|
107
|
+
* Issue 6 — the empty state now invites action: it points the operator
|
|
108
|
+
* at the scrapbook viewer for THIS node so they can drop research notes
|
|
109
|
+
* directly. When `address` is supplied (drawer + content-detail
|
|
110
|
+
* callsites both have one in scope), the link resolves to the per-entry
|
|
111
|
+
* viewer URL `/dev/scrapbook/<site>/<slug>`. With no address, we fall
|
|
112
|
+
* back to the scrapbook index `/dev/scrapbook/` — used only by callers
|
|
113
|
+
* that haven't been threaded site/slug yet.
|
|
106
114
|
*/
|
|
107
|
-
export declare function renderEmptyScrapbookRow(): RawHtml;
|
|
115
|
+
export declare function renderEmptyScrapbookRow(address?: ScrapbookAddress): RawHtml;
|
|
108
116
|
//# sourceMappingURL=scrapbook-item.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scrapbook-item.d.ts","sourceRoot":"","sources":["../../src/components/scrapbook-item.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAM9D,gDAAgD;AAChD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,KACb,MAAM,GAAG,IAAI,CAAC;AAEnB,MAAM,WAAW,4BAA4B;IAC3C;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,gBAAgB,CAAC;CACxC;AASD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9B,MAAM,CAQR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAIpE;AA+DD;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,aAAa,EACnB,IAAI,GAAE,4BAAiC,GACtC,OAAO,CA8DT;AAED
|
|
1
|
+
{"version":3,"file":"scrapbook-item.d.ts","sourceRoot":"","sources":["../../src/components/scrapbook-item.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAM9D,gDAAgD;AAChD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,KACb,MAAM,GAAG,IAAI,CAAC;AAEnB,MAAM,WAAW,4BAA4B;IAC3C;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,gBAAgB,CAAC;CACxC;AASD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9B,MAAM,CAQR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAIpE;AA+DD;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,aAAa,EACnB,IAAI,GAAE,4BAAiC,GACtC,OAAO,CA8DT;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAMT"}
|
|
@@ -195,11 +195,20 @@ export function renderReadOnlyScrapbookRow(address, item, opts = {}) {
|
|
|
195
195
|
* Render an empty-state row for a scrapbook drawer / panel that has
|
|
196
196
|
* no items. Shown faded so the operator still sees the section exists
|
|
197
197
|
* for this node.
|
|
198
|
+
*
|
|
199
|
+
* Issue 6 — the empty state now invites action: it points the operator
|
|
200
|
+
* at the scrapbook viewer for THIS node so they can drop research notes
|
|
201
|
+
* directly. When `address` is supplied (drawer + content-detail
|
|
202
|
+
* callsites both have one in scope), the link resolves to the per-entry
|
|
203
|
+
* viewer URL `/dev/scrapbook/<site>/<slug>`. With no address, we fall
|
|
204
|
+
* back to the scrapbook index `/dev/scrapbook/` — used only by callers
|
|
205
|
+
* that haven't been threaded site/slug yet.
|
|
198
206
|
*/
|
|
199
|
-
export function renderEmptyScrapbookRow() {
|
|
207
|
+
export function renderEmptyScrapbookRow(address) {
|
|
208
|
+
const href = address ? scrapbookViewerUrl(address) : '/dev/scrapbook/';
|
|
200
209
|
return unsafe(html `
|
|
201
210
|
<div class="scrap scrap--empty" data-state="empty">
|
|
202
|
-
<span class="scrap__empty-text">
|
|
211
|
+
<span class="scrap__empty-text">No items yet. <a class="scrap__empty-link" href="${href}">Drop research notes →</a></span>
|
|
203
212
|
</div>`);
|
|
204
213
|
}
|
|
205
214
|
//# sourceMappingURL=scrapbook-item.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scrapbook-item.js","sourceRoot":"","sources":["../../src/components/scrapbook-item.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"scrapbook-item.js","sourceRoot":"","sources":["../../src/components/scrapbook-item.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"press-check": {
|
|
3
|
+
"term": "press-check",
|
|
4
|
+
"gloss": "The final pre-print review of a galley proof. In the studio, the longform-review surface where margin notes are added before approval.",
|
|
5
|
+
"seeAlso": ["galley", "proof"]
|
|
6
|
+
},
|
|
7
|
+
"galley": {
|
|
8
|
+
"term": "galley",
|
|
9
|
+
"gloss": "A column-proof of typeset copy. In the studio, the rendered article under review.",
|
|
10
|
+
"seeAlso": ["proof", "press-check"]
|
|
11
|
+
},
|
|
12
|
+
"compositor": {
|
|
13
|
+
"term": "compositor",
|
|
14
|
+
"gloss": "The typesetter at the press. In the studio, the operator-and-agent pair driving the editorial workflow.",
|
|
15
|
+
"seeAlso": []
|
|
16
|
+
},
|
|
17
|
+
"proof": {
|
|
18
|
+
"term": "proof",
|
|
19
|
+
"gloss": "A draft printed for review. In the studio, the document state passed between pipeline stages.",
|
|
20
|
+
"seeAlso": ["galley", "press-check"]
|
|
21
|
+
},
|
|
22
|
+
"marginalia": {
|
|
23
|
+
"term": "margin notes",
|
|
24
|
+
"gloss": "Notes written in the margins of a proof. In the studio, the comments left on the longform-review surface.",
|
|
25
|
+
"seeAlso": ["press-check"]
|
|
26
|
+
},
|
|
27
|
+
"stamp": {
|
|
28
|
+
"term": "stamp",
|
|
29
|
+
"gloss": "A status badge on a proof — approved, iterating, applied, etc.",
|
|
30
|
+
"seeAlso": []
|
|
31
|
+
},
|
|
32
|
+
"kicker": {
|
|
33
|
+
"term": "kicker",
|
|
34
|
+
"gloss": "A small label above the title of an article — typographic context for what's about to be read.",
|
|
35
|
+
"seeAlso": []
|
|
36
|
+
},
|
|
37
|
+
"flat-plan": {
|
|
38
|
+
"term": "flat plan",
|
|
39
|
+
"gloss": "An editorial layout-planning document showing what runs where. In the studio, the dashboard.",
|
|
40
|
+
"seeAlso": []
|
|
41
|
+
},
|
|
42
|
+
"desk-inset": {
|
|
43
|
+
"term": "desk inset",
|
|
44
|
+
"gloss": "A clipboard view of a single entry under inspection — the entry-review surface.",
|
|
45
|
+
"seeAlso": []
|
|
46
|
+
},
|
|
47
|
+
"dispatch": {
|
|
48
|
+
"term": "dispatch",
|
|
49
|
+
"gloss": "Moving a proof through pipeline stages. In the studio, the approve / iterate / publish actions.",
|
|
50
|
+
"seeAlso": ["proof"]
|
|
51
|
+
},
|
|
52
|
+
"stet": {
|
|
53
|
+
"term": "stet",
|
|
54
|
+
"gloss": "A proofreading mark meaning 'let it stand' — undoes a previous correction.",
|
|
55
|
+
"seeAlso": []
|
|
56
|
+
},
|
|
57
|
+
"scrapbook": {
|
|
58
|
+
"term": "scrapbook",
|
|
59
|
+
"gloss": "Research material kept alongside an article — clippings, screenshots, drafts. In the studio, the per-entry research store.",
|
|
60
|
+
"seeAlso": []
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import glossary from '../data/glossary.json';
|
|
2
|
+
import { type RawHtml } from '../pages/html.ts';
|
|
3
|
+
interface GlossaryEntry {
|
|
4
|
+
term: string;
|
|
5
|
+
gloss: string;
|
|
6
|
+
seeAlso?: string[];
|
|
7
|
+
}
|
|
8
|
+
type GlossaryKey = Extract<keyof typeof glossary, string>;
|
|
9
|
+
/**
|
|
10
|
+
* Emit markup for inline glossary terms.
|
|
11
|
+
*
|
|
12
|
+
* Returns a `RawHtml` marker so the html template tag inlines it without escaping.
|
|
13
|
+
*/
|
|
14
|
+
export declare function gloss(key: GlossaryKey): RawHtml;
|
|
15
|
+
export type { GlossaryKey, GlossaryEntry };
|
|
16
|
+
//# sourceMappingURL=glossary-helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glossary-helper.d.ts","sourceRoot":"","sources":["../../src/lib/glossary-helper.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,uBAAuB,CAAuB;AACnE,OAAO,EAAU,KAAK,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAExD,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,KAAK,WAAW,GAAG,OAAO,CAAC,MAAM,OAAO,QAAQ,EAAE,MAAM,CAAC,CAAC;AAc1D;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAS/C;AAED,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import glossary from '../data/glossary.json' with { type: 'json' };
|
|
2
|
+
import { unsafe } from "../pages/html.js";
|
|
3
|
+
function isKey(s) {
|
|
4
|
+
return Object.prototype.hasOwnProperty.call(glossary, s);
|
|
5
|
+
}
|
|
6
|
+
function escapeAttr(s) {
|
|
7
|
+
return s
|
|
8
|
+
.replaceAll('&', '&')
|
|
9
|
+
.replaceAll('<', '<')
|
|
10
|
+
.replaceAll('>', '>')
|
|
11
|
+
.replaceAll('"', '"');
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Emit markup for inline glossary terms.
|
|
15
|
+
*
|
|
16
|
+
* Returns a `RawHtml` marker so the html template tag inlines it without escaping.
|
|
17
|
+
*/
|
|
18
|
+
export function gloss(key) {
|
|
19
|
+
if (!isKey(key)) {
|
|
20
|
+
throw new Error(`unknown glossary term: ${String(key)}`);
|
|
21
|
+
}
|
|
22
|
+
const entry = glossary[key];
|
|
23
|
+
const k = escapeAttr(key);
|
|
24
|
+
return unsafe(`<span class="er-gloss" data-term="${k}" tabindex="0" role="button" aria-describedby="glossary-${k}">${escapeAttr(entry.term)}</span>`);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=glossary-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glossary-helper.js","sourceRoot":"","sources":["../../src/lib/glossary-helper.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,uBAAuB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACnE,OAAO,EAAE,MAAM,EAAgB,MAAM,kBAAkB,CAAC;AAUxD,SAAS,KAAK,CAAC,CAAS;IACtB,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC;SACL,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,GAAgB;IACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,KAAK,GAAkB,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,MAAM,CACX,qCAAqC,CAAC,2DAA2D,CAAC,KAAK,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CACvI,CAAC;AACJ,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"}
|
package/dist/pages/chrome.d.ts
CHANGED
|
@@ -3,24 +3,35 @@
|
|
|
3
3
|
* surface (dashboard, longform review, shortform, content view, scrapbook,
|
|
4
4
|
* help, and the studio index).
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* Single component, every consumer. Markup intentionally flat (no
|
|
7
|
+
* inner wrapper) so the folio can flex its three children — wordmark,
|
|
8
|
+
* spine, nav — directly. The active surface is marked with a red-pencil
|
|
9
|
+
* underline drawn via `::after` in editorial-nav.css.
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
11
|
+
* Layout invariant: the folio is `position: fixed; top: 0` and other
|
|
12
|
+
* fixed chrome (the review surface's `.er-strip`) sits BELOW it at
|
|
13
|
+
* `top: var(--er-folio-h)`. Earlier versions used `position: sticky` +
|
|
14
|
+
* a lower z-index, which left the folio eclipsed by the longform
|
|
15
|
+
* review's strip — the user couldn't see the global nav at all on
|
|
16
|
+
* review pages.
|
|
16
17
|
*/
|
|
17
18
|
import { type RawHtml } from './html.ts';
|
|
18
|
-
|
|
19
|
+
/**
|
|
20
|
+
* The set of values callers can pass as the active key. The first five
|
|
21
|
+
* map to a nav-item that gets `class="active"`; `'longform'` is a
|
|
22
|
+
* special "no nav match" key for the longform review surface — it
|
|
23
|
+
* carries an active context (we ARE inside a review) but no nav-item
|
|
24
|
+
* represents that destination, so none gets highlighted. Issue 4 fixed
|
|
25
|
+
* the prior behaviour where the longform review highlighted the
|
|
26
|
+
* shortform nav-item by prefix-matching, which was misleading.
|
|
27
|
+
*/
|
|
28
|
+
export type ChromeActiveLink = 'index' | 'dashboard' | 'content' | 'shortform' | 'manual' | 'longform';
|
|
19
29
|
/**
|
|
20
30
|
* Render the folio strip. `spineLabel` is the page-specific subtitle
|
|
21
|
-
* shown
|
|
22
|
-
* "
|
|
23
|
-
*
|
|
31
|
+
* shown to the right of the wordmark ("press-check", "the shape of the
|
|
32
|
+
* work", "longform · <slug>", etc.). When omitted the spine renders
|
|
33
|
+
* empty (an `aria-hidden` placeholder so the flex layout stays balanced
|
|
34
|
+
* across pages).
|
|
24
35
|
*/
|
|
25
36
|
export declare function renderEditorialFolio(active: ChromeActiveLink, spineLabel?: string): RawHtml;
|
|
26
37
|
//# sourceMappingURL=chrome.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../../src/pages/chrome.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"chrome.d.ts","sourceRoot":"","sources":["../../src/pages/chrome.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,MAAM,gBAAgB,GACxB,OAAO,GACP,WAAW,GACX,SAAS,GACT,WAAW,GACX,QAAQ,GACR,UAAU,CAAC;AAgBf;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,gBAAgB,EACxB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAmBT"}
|
package/dist/pages/chrome.js
CHANGED
|
@@ -3,48 +3,49 @@
|
|
|
3
3
|
* surface (dashboard, longform review, shortform, content view, scrapbook,
|
|
4
4
|
* help, and the studio index).
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* Single component, every consumer. Markup intentionally flat (no
|
|
7
|
+
* inner wrapper) so the folio can flex its three children — wordmark,
|
|
8
|
+
* spine, nav — directly. The active surface is marked with a red-pencil
|
|
9
|
+
* underline drawn via `::after` in editorial-nav.css.
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
11
|
+
* Layout invariant: the folio is `position: fixed; top: 0` and other
|
|
12
|
+
* fixed chrome (the review surface's `.er-strip`) sits BELOW it at
|
|
13
|
+
* `top: var(--er-folio-h)`. Earlier versions used `position: sticky` +
|
|
14
|
+
* a lower z-index, which left the folio eclipsed by the longform
|
|
15
|
+
* review's strip — the user couldn't see the global nav at all on
|
|
16
|
+
* review pages.
|
|
16
17
|
*/
|
|
17
18
|
import { html, unsafe } from "./html.js";
|
|
18
19
|
const NAV_LINKS = [
|
|
19
20
|
{ key: 'index', href: '/dev/', label: 'Index' },
|
|
20
21
|
{ key: 'dashboard', href: '/dev/editorial-studio', label: 'Dashboard' },
|
|
21
22
|
{ key: 'content', href: '/dev/content', label: 'Content' },
|
|
22
|
-
{ key: '
|
|
23
|
+
{ key: 'shortform', href: '/dev/editorial-review-shortform', label: 'Shortform' },
|
|
23
24
|
{ key: 'manual', href: '/dev/editorial-help', label: 'Manual' },
|
|
24
25
|
];
|
|
25
26
|
/**
|
|
26
27
|
* Render the folio strip. `spineLabel` is the page-specific subtitle
|
|
27
|
-
* shown
|
|
28
|
-
* "
|
|
29
|
-
*
|
|
28
|
+
* shown to the right of the wordmark ("press-check", "the shape of the
|
|
29
|
+
* work", "longform · <slug>", etc.). When omitted the spine renders
|
|
30
|
+
* empty (an `aria-hidden` placeholder so the flex layout stays balanced
|
|
31
|
+
* across pages).
|
|
30
32
|
*/
|
|
31
33
|
export function renderEditorialFolio(active, spineLabel) {
|
|
32
34
|
const links = NAV_LINKS.map((link) => {
|
|
33
35
|
const cls = link.key === active ? 'active' : '';
|
|
34
|
-
|
|
36
|
+
const aria = link.key === active ? ' aria-current="page"' : '';
|
|
37
|
+
return html `<a class="${cls}" href="${link.href}"${unsafe(aria)}>${link.label}</a>`;
|
|
35
38
|
}).join('');
|
|
36
39
|
const spine = spineLabel
|
|
37
|
-
? html `<
|
|
38
|
-
: '<
|
|
40
|
+
? html `<span class="er-folio-spine">${spineLabel}</span>`
|
|
41
|
+
: '<span class="er-folio-spine" aria-hidden="true"></span>';
|
|
39
42
|
return unsafe(html `
|
|
40
|
-
<header class="er-folio">
|
|
41
|
-
<
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
${unsafe(spine)}
|
|
47
|
-
</div>
|
|
43
|
+
<header class="er-folio" role="banner">
|
|
44
|
+
<span class="er-folio-mark">deskwork</span>
|
|
45
|
+
${unsafe(spine)}
|
|
46
|
+
<nav class="er-folio-nav" aria-label="Studio sections">
|
|
47
|
+
${unsafe(links)}
|
|
48
|
+
</nav>
|
|
48
49
|
</header>`);
|
|
49
50
|
}
|
|
50
51
|
//# sourceMappingURL=chrome.js.map
|
package/dist/pages/chrome.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chrome.js","sourceRoot":"","sources":["../../src/pages/chrome.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"chrome.js","sourceRoot":"","sources":["../../src/pages/chrome.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAgB,MAAM,WAAW,CAAC;AAyBvD,MAAM,SAAS,GAAyB;IACtC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IAC/C,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,WAAW,EAAE;IACvE,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE;IAC1D,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,iCAAiC,EAAE,KAAK,EAAE,WAAW,EAAE;IACjF,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,QAAQ,EAAE;CAChE,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAwB,EACxB,UAAmB;IAEnB,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAA,aAAa,GAAG,WAAW,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,MAAM,CAAC;IACtF,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,MAAM,KAAK,GAAG,UAAU;QACtB,CAAC,CAAC,IAAI,CAAA,gCAAgC,UAAU,SAAS;QACzD,CAAC,CAAC,yDAAyD,CAAC;IAE9D,OAAO,MAAM,CAAC,IAAI,CAAA;;;QAGZ,MAAM,CAAC,KAAK,CAAC;;UAEX,MAAM,CAAC,KAAK,CAAC;;cAET,CAAC,CAAC;AAChB,CAAC"}
|
package/dist/pages/chrome.ts
CHANGED
|
@@ -3,29 +3,40 @@
|
|
|
3
3
|
* surface (dashboard, longform review, shortform, content view, scrapbook,
|
|
4
4
|
* help, and the studio index).
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* Single component, every consumer. Markup intentionally flat (no
|
|
7
|
+
* inner wrapper) so the folio can flex its three children — wordmark,
|
|
8
|
+
* spine, nav — directly. The active surface is marked with a red-pencil
|
|
9
|
+
* underline drawn via `::after` in editorial-nav.css.
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
11
|
+
* Layout invariant: the folio is `position: fixed; top: 0` and other
|
|
12
|
+
* fixed chrome (the review surface's `.er-strip`) sits BELOW it at
|
|
13
|
+
* `top: var(--er-folio-h)`. Earlier versions used `position: sticky` +
|
|
14
|
+
* a lower z-index, which left the folio eclipsed by the longform
|
|
15
|
+
* review's strip — the user couldn't see the global nav at all on
|
|
16
|
+
* review pages.
|
|
16
17
|
*/
|
|
17
18
|
|
|
18
19
|
import { html, unsafe, type RawHtml } from './html.ts';
|
|
19
20
|
|
|
21
|
+
/**
|
|
22
|
+
* The set of values callers can pass as the active key. The first five
|
|
23
|
+
* map to a nav-item that gets `class="active"`; `'longform'` is a
|
|
24
|
+
* special "no nav match" key for the longform review surface — it
|
|
25
|
+
* carries an active context (we ARE inside a review) but no nav-item
|
|
26
|
+
* represents that destination, so none gets highlighted. Issue 4 fixed
|
|
27
|
+
* the prior behaviour where the longform review highlighted the
|
|
28
|
+
* shortform nav-item by prefix-matching, which was misleading.
|
|
29
|
+
*/
|
|
20
30
|
export type ChromeActiveLink =
|
|
21
31
|
| 'index'
|
|
22
32
|
| 'dashboard'
|
|
23
33
|
| 'content'
|
|
24
|
-
| '
|
|
25
|
-
| 'manual'
|
|
34
|
+
| 'shortform'
|
|
35
|
+
| 'manual'
|
|
36
|
+
| 'longform';
|
|
26
37
|
|
|
27
38
|
interface FolioLink {
|
|
28
|
-
key: ChromeActiveLink
|
|
39
|
+
key: Exclude<ChromeActiveLink, 'longform'>;
|
|
29
40
|
href: string;
|
|
30
41
|
label: string;
|
|
31
42
|
}
|
|
@@ -34,15 +45,16 @@ const NAV_LINKS: readonly FolioLink[] = [
|
|
|
34
45
|
{ key: 'index', href: '/dev/', label: 'Index' },
|
|
35
46
|
{ key: 'dashboard', href: '/dev/editorial-studio', label: 'Dashboard' },
|
|
36
47
|
{ key: 'content', href: '/dev/content', label: 'Content' },
|
|
37
|
-
{ key: '
|
|
48
|
+
{ key: 'shortform', href: '/dev/editorial-review-shortform', label: 'Shortform' },
|
|
38
49
|
{ key: 'manual', href: '/dev/editorial-help', label: 'Manual' },
|
|
39
50
|
];
|
|
40
51
|
|
|
41
52
|
/**
|
|
42
53
|
* Render the folio strip. `spineLabel` is the page-specific subtitle
|
|
43
|
-
* shown
|
|
44
|
-
* "
|
|
45
|
-
*
|
|
54
|
+
* shown to the right of the wordmark ("press-check", "the shape of the
|
|
55
|
+
* work", "longform · <slug>", etc.). When omitted the spine renders
|
|
56
|
+
* empty (an `aria-hidden` placeholder so the flex layout stays balanced
|
|
57
|
+
* across pages).
|
|
46
58
|
*/
|
|
47
59
|
export function renderEditorialFolio(
|
|
48
60
|
active: ChromeActiveLink,
|
|
@@ -50,21 +62,20 @@ export function renderEditorialFolio(
|
|
|
50
62
|
): RawHtml {
|
|
51
63
|
const links = NAV_LINKS.map((link) => {
|
|
52
64
|
const cls = link.key === active ? 'active' : '';
|
|
53
|
-
|
|
65
|
+
const aria = link.key === active ? ' aria-current="page"' : '';
|
|
66
|
+
return html`<a class="${cls}" href="${link.href}"${unsafe(aria)}>${link.label}</a>`;
|
|
54
67
|
}).join('');
|
|
55
68
|
|
|
56
69
|
const spine = spineLabel
|
|
57
|
-
? html`<
|
|
58
|
-
: '<
|
|
70
|
+
? html`<span class="er-folio-spine">${spineLabel}</span>`
|
|
71
|
+
: '<span class="er-folio-spine" aria-hidden="true"></span>';
|
|
59
72
|
|
|
60
73
|
return unsafe(html`
|
|
61
|
-
<header class="er-folio">
|
|
62
|
-
<
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
${unsafe(spine)}
|
|
68
|
-
</div>
|
|
74
|
+
<header class="er-folio" role="banner">
|
|
75
|
+
<span class="er-folio-mark">deskwork</span>
|
|
76
|
+
${unsafe(spine)}
|
|
77
|
+
<nav class="er-folio-nav" aria-label="Studio sections">
|
|
78
|
+
${unsafe(links)}
|
|
79
|
+
</nav>
|
|
69
80
|
</header>`);
|
|
70
81
|
}
|
|
@@ -122,7 +122,7 @@ function makeInlineTextLoaderForNode(ctx, site, node, index) {
|
|
|
122
122
|
}
|
|
123
123
|
function renderScrapbookList(site, slug, summary, loader) {
|
|
124
124
|
if (!summary || (summary.items.length === 0 && summary.secretItems.length === 0)) {
|
|
125
|
-
return renderEmptyScrapbookRow();
|
|
125
|
+
return renderEmptyScrapbookRow({ site, path: slug });
|
|
126
126
|
}
|
|
127
127
|
const itemRows = summary.items.map((item) => renderReadOnlyScrapbookRow({ site, path: slug }, item, {
|
|
128
128
|
inlinePreviewLoader: loader,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-detail.js","sourceRoot":"","sources":["../../src/pages/content-detail.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"content-detail.js","sourceRoot":"","sources":["../../src/pages/content-detail.ts"],"names":[],"mappings":"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"}
|
|
@@ -164,7 +164,7 @@ function renderScrapbookList(
|
|
|
164
164
|
loader: InlineTextLoader,
|
|
165
165
|
): RawHtml {
|
|
166
166
|
if (!summary || (summary.items.length === 0 && summary.secretItems.length === 0)) {
|
|
167
|
-
return renderEmptyScrapbookRow();
|
|
167
|
+
return renderEmptyScrapbookRow({ site, path: slug });
|
|
168
168
|
}
|
|
169
169
|
const itemRows = summary.items.map((item) =>
|
|
170
170
|
renderReadOnlyScrapbookRow({ site, path: slug }, item, {
|
|
@@ -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,
|
|
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"}
|
package/dist/pages/content.js
CHANGED
|
@@ -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}`),
|
|
@@ -389,6 +401,42 @@ export async function renderContentProject(ctx, site, projectSlug, selectedPath,
|
|
|
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, '&').replace(/"/g, '"');
|
|
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')}
|