@tekki-forge/runtime-admin 0.2.0 → 0.3.2
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/admin-dashboard.d.ts +16 -0
- package/dist/admin-dashboard.js +60 -0
- package/dist/admin-dashboard.js.map +1 -0
- package/dist/admin-orgs.d.ts +14 -0
- package/dist/admin-orgs.js +75 -0
- package/dist/admin-orgs.js.map +1 -0
- package/dist/admin-shell.d.ts +55 -0
- package/dist/admin-shell.js +141 -0
- package/dist/admin-shell.js.map +1 -0
- package/dist/admin.js +35 -4
- package/dist/admin.js.map +1 -1
- package/dist/app-pages.d.ts +19 -0
- package/dist/app-pages.js +109 -0
- package/dist/app-pages.js.map +1 -0
- package/dist/auth-pages.js +7 -2
- package/dist/auth-pages.js.map +1 -1
- package/dist/charts.d.ts +98 -2
- package/dist/charts.js +264 -24
- package/dist/charts.js.map +1 -1
- package/dist/context.js +32 -1
- package/dist/context.js.map +1 -1
- package/dist/dashboard.d.ts +63 -8
- package/dist/dashboard.js +180 -36
- package/dist/dashboard.js.map +1 -1
- package/dist/i18n/messages/de.js +751 -0
- package/dist/i18n/messages/de.js.map +1 -1
- package/dist/i18n/messages/en.js +751 -0
- package/dist/i18n/messages/en.js.map +1 -1
- package/dist/i18n/messages/es.js +751 -0
- package/dist/i18n/messages/es.js.map +1 -1
- package/dist/i18n/messages/fr.js +751 -0
- package/dist/i18n/messages/fr.js.map +1 -1
- package/dist/i18n/messages/pt.js +751 -0
- package/dist/i18n/messages/pt.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/shell.js +37 -34
- package/dist/shell.js.map +1 -1
- package/dist/site/editor/api.d.ts +74 -0
- package/dist/site/editor/api.js +93 -0
- package/dist/site/editor/api.js.map +1 -0
- package/dist/site/editor/content-page.d.ts +4 -0
- package/dist/site/editor/content-page.js +65 -0
- package/dist/site/editor/content-page.js.map +1 -0
- package/dist/site/editor/inbox-tab.d.ts +4 -0
- package/dist/site/editor/inbox-tab.js +88 -0
- package/dist/site/editor/inbox-tab.js.map +1 -0
- package/dist/site/editor/index.d.ts +1 -0
- package/dist/site/editor/index.js +3 -0
- package/dist/site/editor/index.js.map +1 -0
- package/dist/site/editor/model.d.ts +145 -0
- package/dist/site/editor/model.js +408 -0
- package/dist/site/editor/model.js.map +1 -0
- package/dist/site/editor/page-editor.d.ts +10 -0
- package/dist/site/editor/page-editor.js +257 -0
- package/dist/site/editor/page-editor.js.map +1 -0
- package/dist/site/editor/page-settings.d.ts +9 -0
- package/dist/site/editor/page-settings.js +105 -0
- package/dist/site/editor/page-settings.js.map +1 -0
- package/dist/site/editor/pages-tab.d.ts +5 -0
- package/dist/site/editor/pages-tab.js +108 -0
- package/dist/site/editor/pages-tab.js.map +1 -0
- package/dist/site/editor/posts-tab.d.ts +6 -0
- package/dist/site/editor/posts-tab.js +139 -0
- package/dist/site/editor/posts-tab.js.map +1 -0
- package/dist/site/editor/preview.d.ts +32 -0
- package/dist/site/editor/preview.js +104 -0
- package/dist/site/editor/preview.js.map +1 -0
- package/dist/site/editor/prop-fields.d.ts +53 -0
- package/dist/site/editor/prop-fields.js +233 -0
- package/dist/site/editor/prop-fields.js.map +1 -0
- package/dist/site/editor/section-list.d.ts +14 -0
- package/dist/site/editor/section-list.js +110 -0
- package/dist/site/editor/section-list.js.map +1 -0
- package/dist/site/editor/section-picker.d.ts +12 -0
- package/dist/site/editor/section-picker.js +44 -0
- package/dist/site/editor/section-picker.js.map +1 -0
- package/dist/site/editor/widgets.d.ts +84 -0
- package/dist/site/editor/widgets.js +130 -0
- package/dist/site/editor/widgets.js.map +1 -0
- package/dist/site/format.d.ts +31 -0
- package/dist/site/format.js +106 -0
- package/dist/site/format.js.map +1 -0
- package/dist/site/forms.d.ts +43 -0
- package/dist/site/forms.js +155 -0
- package/dist/site/forms.js.map +1 -0
- package/dist/site/header.d.ts +32 -0
- package/dist/site/header.js +76 -0
- package/dist/site/header.js.map +1 -0
- package/dist/site/icons.d.ts +10 -0
- package/dist/site/icons.js +28 -0
- package/dist/site/icons.js.map +1 -0
- package/dist/site/index.d.ts +11 -0
- package/dist/site/index.js +13 -0
- package/dist/site/index.js.map +1 -0
- package/dist/site/markdown.d.ts +14 -0
- package/dist/site/markdown.js +457 -0
- package/dist/site/markdown.js.map +1 -0
- package/dist/site/page.d.ts +16 -0
- package/dist/site/page.js +65 -0
- package/dist/site/page.js.map +1 -0
- package/dist/site/proxy.d.ts +13 -0
- package/dist/site/proxy.js +43 -0
- package/dist/site/proxy.js.map +1 -0
- package/dist/site/sections.d.ts +43 -0
- package/dist/site/sections.js +560 -0
- package/dist/site/sections.js.map +1 -0
- package/dist/site/server.d.ts +73 -0
- package/dist/site/server.js +235 -0
- package/dist/site/server.js.map +1 -0
- package/dist/site/types.d.ts +137 -0
- package/dist/site/types.js +2 -0
- package/dist/site/types.js.map +1 -0
- package/dist/support.d.ts +29 -0
- package/dist/support.js +165 -0
- package/dist/support.js.map +1 -0
- package/dist/system-config.d.ts +24 -0
- package/dist/system-config.js +37 -0
- package/dist/system-config.js.map +1 -0
- package/dist/system-settings.d.ts +9 -0
- package/dist/system-settings.js +60 -0
- package/dist/system-settings.js.map +1 -0
- package/dist/theme-catalog.d.ts +72 -2
- package/dist/theme-catalog.js +47 -0
- package/dist/theme-catalog.js.map +1 -1
- package/dist/theme-switcher.d.ts +8 -0
- package/dist/theme-switcher.js +39 -4
- package/dist/theme-switcher.js.map +1 -1
- package/dist/theme.js +8 -0
- package/dist/theme.js.map +1 -1
- package/dist/transactions.d.ts +4 -0
- package/dist/transactions.js +60 -0
- package/dist/transactions.js.map +1 -0
- package/package.json +9 -5
- package/styles.css +1089 -0
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { validHref, validImage } from "@tekki-forge/compiler/site";
|
|
3
|
+
import { Fragment } from "react";
|
|
4
|
+
const MAX_DEPTH = 8;
|
|
5
|
+
const FENCE = /^ {0,3}(`{3,}|~{3,})\s*([\w+#.-]*)\s*$/;
|
|
6
|
+
const HEADING = /^ {0,3}(#{1,6})(?:\s+(.*?))?\s*#*\s*$/;
|
|
7
|
+
const RULE = /^ {0,3}([-*_])(?:\s*\1){2,}\s*$/;
|
|
8
|
+
const BULLET = /^( {0,3})([-*+])\s+(.*)$/;
|
|
9
|
+
const ORDERED = /^( {0,3})(\d{1,9})[.)]\s+(.*)$/;
|
|
10
|
+
const QUOTE = /^ {0,3}>\s?(.*)$/;
|
|
11
|
+
const TABLE_SEP = /^\s*\|?\s*:?-{1,}:?\s*(\|\s*:?-{1,}:?\s*)*\|?\s*$/;
|
|
12
|
+
const isBlank = (line) => !line.trim();
|
|
13
|
+
const startsBlock = (line) => FENCE.test(line) || HEADING.test(line) || RULE.test(line) || BULLET.test(line) || ORDERED.test(line) || QUOTE.test(line);
|
|
14
|
+
function splitRow(line) {
|
|
15
|
+
let s = line.trim();
|
|
16
|
+
if (s.startsWith("|"))
|
|
17
|
+
s = s.slice(1);
|
|
18
|
+
if (s.endsWith("|") && !s.endsWith("\\|"))
|
|
19
|
+
s = s.slice(0, -1);
|
|
20
|
+
const cells = [];
|
|
21
|
+
let cur = "";
|
|
22
|
+
for (let i = 0; i < s.length; i++) {
|
|
23
|
+
if (s[i] === "\\" && s[i + 1] === "|") {
|
|
24
|
+
cur += "|";
|
|
25
|
+
i++;
|
|
26
|
+
}
|
|
27
|
+
else if (s[i] === "|") {
|
|
28
|
+
cells.push(cur.trim());
|
|
29
|
+
cur = "";
|
|
30
|
+
}
|
|
31
|
+
else
|
|
32
|
+
cur += s[i];
|
|
33
|
+
}
|
|
34
|
+
cells.push(cur.trim());
|
|
35
|
+
return cells;
|
|
36
|
+
}
|
|
37
|
+
function parseBlocks(lines, depth) {
|
|
38
|
+
const out = [];
|
|
39
|
+
let i = 0;
|
|
40
|
+
while (i < lines.length) {
|
|
41
|
+
const line = lines[i];
|
|
42
|
+
if (isBlank(line)) {
|
|
43
|
+
i++;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const fence = FENCE.exec(line);
|
|
47
|
+
if (fence) {
|
|
48
|
+
const marker = fence[1];
|
|
49
|
+
const body = [];
|
|
50
|
+
i++;
|
|
51
|
+
while (i < lines.length && !new RegExp(`^ {0,3}${marker[0] === "`" ? "`" : "~"}{${marker.length},}\\s*$`).test(lines[i]))
|
|
52
|
+
body.push(lines[i++]);
|
|
53
|
+
i++; // closing fence (or end of text)
|
|
54
|
+
out.push({ t: "code", ...(fence[2] ? { lang: fence[2] } : {}), text: body.join("\n") });
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const heading = HEADING.exec(line);
|
|
58
|
+
if (heading) {
|
|
59
|
+
out.push({ t: "h", level: heading[1].length, c: parseInline(heading[2] ?? "", depth) });
|
|
60
|
+
i++;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (RULE.test(line)) {
|
|
64
|
+
out.push({ t: "hr" });
|
|
65
|
+
i++;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (QUOTE.test(line)) {
|
|
69
|
+
const inner = [];
|
|
70
|
+
while (i < lines.length && !isBlank(lines[i]) && (QUOTE.test(lines[i]) || !startsBlock(lines[i]))) {
|
|
71
|
+
const m = QUOTE.exec(lines[i]);
|
|
72
|
+
inner.push(m ? m[1] : lines[i]);
|
|
73
|
+
i++;
|
|
74
|
+
}
|
|
75
|
+
out.push(depth < MAX_DEPTH ? { t: "quote", c: parseBlocks(inner, depth + 1) } : { t: "p", c: [inner.join(" ")] });
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const bullet = BULLET.exec(line);
|
|
79
|
+
const ordered = bullet ? null : ORDERED.exec(line);
|
|
80
|
+
if (bullet || ordered) {
|
|
81
|
+
const pattern = bullet ? BULLET : ORDERED;
|
|
82
|
+
const items = [];
|
|
83
|
+
while (i < lines.length) {
|
|
84
|
+
const cur = lines[i];
|
|
85
|
+
const m = pattern.exec(cur);
|
|
86
|
+
if (m) {
|
|
87
|
+
items.push([m[3]]);
|
|
88
|
+
i++;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
// Continuation: indented lines (nested lists, more paragraphs), or lazy text right after an item line.
|
|
92
|
+
if (isBlank(cur)) {
|
|
93
|
+
const next = lines[i + 1];
|
|
94
|
+
if (next !== undefined && (/^\s{2,}\S/.test(next) || pattern.test(next))) {
|
|
95
|
+
items[items.length - 1].push("");
|
|
96
|
+
i++;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
if (/^\s{2,}\S/.test(cur)) {
|
|
102
|
+
items[items.length - 1].push(cur.replace(/^\s{2,4}/, ""));
|
|
103
|
+
i++;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (!startsBlock(cur) && !isBlank(lines[i - 1])) {
|
|
107
|
+
items[items.length - 1].push(cur);
|
|
108
|
+
i++;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
const parsed = items.map((item) => (depth < MAX_DEPTH ? parseBlocks(item, depth + 1) : [{ t: "p", c: [item.join(" ")] }]));
|
|
114
|
+
out.push(bullet ? { t: "ul", items: parsed } : { t: "ol", start: Number(ordered[2]), items: parsed });
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
// Table: a header row followed by a separator row.
|
|
118
|
+
if (line.includes("|") && i + 1 < lines.length && TABLE_SEP.test(lines[i + 1]) && lines[i + 1].includes("-")) {
|
|
119
|
+
const head = splitRow(line);
|
|
120
|
+
const align = splitRow(lines[i + 1]).map((c) => (c.startsWith(":") && c.endsWith(":") ? "center" : c.endsWith(":") ? "right" : c.startsWith(":") ? "left" : null));
|
|
121
|
+
i += 2;
|
|
122
|
+
const rows = [];
|
|
123
|
+
while (i < lines.length && !isBlank(lines[i]) && lines[i].includes("|")) {
|
|
124
|
+
const cells = splitRow(lines[i]);
|
|
125
|
+
rows.push(head.map((_, j) => parseInline(cells[j] ?? "", depth)));
|
|
126
|
+
i++;
|
|
127
|
+
}
|
|
128
|
+
out.push({ t: "table", align: head.map((_, j) => align[j] ?? null), head: head.map((h) => parseInline(h, depth)), rows });
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
// Paragraph: until a blank line or another block.
|
|
132
|
+
const para = [];
|
|
133
|
+
while (i < lines.length && !isBlank(lines[i]) && (para.length === 0 || !startsBlock(lines[i])))
|
|
134
|
+
para.push(lines[i++]);
|
|
135
|
+
out.push({ t: "p", c: parseParagraph(para, depth) });
|
|
136
|
+
}
|
|
137
|
+
return out;
|
|
138
|
+
}
|
|
139
|
+
/** Lines of a paragraph: two trailing spaces or a backslash make a line break, other newlines are spaces. */
|
|
140
|
+
function parseParagraph(lines, depth) {
|
|
141
|
+
const out = [];
|
|
142
|
+
lines.forEach((raw, n) => {
|
|
143
|
+
const last = n === lines.length - 1;
|
|
144
|
+
const hard = !last && (/ {2,}$/.test(raw) || /\\$/.test(raw));
|
|
145
|
+
const text = raw.trim().replace(/\\$/, "");
|
|
146
|
+
out.push(...parseInline(text, depth));
|
|
147
|
+
if (!last)
|
|
148
|
+
out.push(hard ? { t: "br" } : " ");
|
|
149
|
+
});
|
|
150
|
+
return out;
|
|
151
|
+
}
|
|
152
|
+
const ESCAPABLE = "\\`*_{}[]()#+-.!|~<>";
|
|
153
|
+
const isSpace = (c) => c === undefined || /\s/.test(c);
|
|
154
|
+
const isWord = (c) => c !== undefined && /[\p{L}\p{N}]/u.test(c);
|
|
155
|
+
/** Index of the `]` matching the `[` at `open`, or -1. */
|
|
156
|
+
function closingBracket(text, open) {
|
|
157
|
+
let depth = 0;
|
|
158
|
+
for (let j = open; j < text.length; j++) {
|
|
159
|
+
if (text[j] === "\\")
|
|
160
|
+
j++;
|
|
161
|
+
else if (text[j] === "[")
|
|
162
|
+
depth++;
|
|
163
|
+
else if (text[j] === "]" && --depth === 0)
|
|
164
|
+
return j;
|
|
165
|
+
}
|
|
166
|
+
return -1;
|
|
167
|
+
}
|
|
168
|
+
/** `(url "title")` right after a `]`: the url, the title and the index after `)`. */
|
|
169
|
+
function linkTarget(text, at) {
|
|
170
|
+
if (text[at] !== "(")
|
|
171
|
+
return null;
|
|
172
|
+
let depth = 0;
|
|
173
|
+
for (let j = at; j < text.length; j++) {
|
|
174
|
+
if (text[j] === "\\")
|
|
175
|
+
j++;
|
|
176
|
+
else if (text[j] === "(")
|
|
177
|
+
depth++;
|
|
178
|
+
else if (text[j] === ")" && --depth === 0) {
|
|
179
|
+
const inner = text.slice(at + 1, j).trim();
|
|
180
|
+
const m = /^<?([^\s>]*)>?(?:\s+["'(](.*)["')])?$/.exec(inner);
|
|
181
|
+
if (!m)
|
|
182
|
+
return null;
|
|
183
|
+
return { url: m[1], ...(m[2] ? { title: m[2] } : {}), end: j + 1 };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
/** Closing delimiter of an emphasis run opened at `from` (skipping code spans and longer runs). */
|
|
189
|
+
function closingDelimiter(text, from, delim) {
|
|
190
|
+
for (let j = from; j < text.length; j++) {
|
|
191
|
+
const c = text[j];
|
|
192
|
+
if (c === "\\") {
|
|
193
|
+
j++;
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (c === "`") {
|
|
197
|
+
const end = text.indexOf("`", j + 1);
|
|
198
|
+
if (end > 0)
|
|
199
|
+
j = end;
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (!text.startsWith(delim, j))
|
|
203
|
+
continue;
|
|
204
|
+
if (delim.length === 1 && text[j + 1] === delim) {
|
|
205
|
+
// A "**" run inside "*…*": skip it (it belongs to a nested strong) unless it ends the text ("*a **b***").
|
|
206
|
+
const after = closingDelimiter(text, j + 2, delim + delim);
|
|
207
|
+
if (after > 0) {
|
|
208
|
+
j = after + 1;
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (delim.length === 2 && text[j + 2] === delim[0])
|
|
213
|
+
continue; // "***": close on the last two
|
|
214
|
+
if (isSpace(text[j - 1]))
|
|
215
|
+
continue;
|
|
216
|
+
if (delim[0] === "_" && isWord(text[j + delim.length]))
|
|
217
|
+
continue;
|
|
218
|
+
if (j === from)
|
|
219
|
+
continue;
|
|
220
|
+
return j;
|
|
221
|
+
}
|
|
222
|
+
return -1;
|
|
223
|
+
}
|
|
224
|
+
function parseInline(text, depth) {
|
|
225
|
+
const out = [];
|
|
226
|
+
let buf = "";
|
|
227
|
+
const flush = () => {
|
|
228
|
+
if (buf)
|
|
229
|
+
out.push(buf);
|
|
230
|
+
buf = "";
|
|
231
|
+
};
|
|
232
|
+
for (let i = 0; i < text.length; i++) {
|
|
233
|
+
const c = text[i];
|
|
234
|
+
if (c === "\\" && i + 1 < text.length && ESCAPABLE.includes(text[i + 1])) {
|
|
235
|
+
buf += text[++i];
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
if (c === "`") {
|
|
239
|
+
let ticks = 1;
|
|
240
|
+
while (text[i + ticks] === "`")
|
|
241
|
+
ticks++;
|
|
242
|
+
const fence = "`".repeat(ticks);
|
|
243
|
+
const end = text.indexOf(fence, i + ticks);
|
|
244
|
+
if (end > 0) {
|
|
245
|
+
flush();
|
|
246
|
+
out.push({ t: "code", text: text.slice(i + ticks, end).replace(/^ (.+) $/, "$1") });
|
|
247
|
+
i = end + ticks - 1;
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
buf += fence;
|
|
251
|
+
i += ticks - 1;
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
if ((c === "!" && text[i + 1] === "[") || c === "[") {
|
|
255
|
+
const open = c === "!" ? i + 1 : i;
|
|
256
|
+
const close = closingBracket(text, open);
|
|
257
|
+
const target = close > 0 ? linkTarget(text, close + 1) : null;
|
|
258
|
+
if (target) {
|
|
259
|
+
flush();
|
|
260
|
+
const label = text.slice(open + 1, close);
|
|
261
|
+
if (c === "!") {
|
|
262
|
+
// Unsafe sources are dropped: only the description stays, as text.
|
|
263
|
+
if (validImage(target.url))
|
|
264
|
+
out.push({ t: "img", src: target.url, alt: label.replace(/[*_`]/g, ""), ...(target.title ? { title: target.title } : {}) });
|
|
265
|
+
else if (label)
|
|
266
|
+
out.push(label);
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
const children = depth < MAX_DEPTH ? parseInline(label, depth + 1) : [label];
|
|
270
|
+
if (validHref(target.url))
|
|
271
|
+
out.push({ t: "a", href: target.url, ...(target.title ? { title: target.title } : {}), c: children });
|
|
272
|
+
else
|
|
273
|
+
out.push(...children);
|
|
274
|
+
}
|
|
275
|
+
i = target.end - 1;
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
if (c === "<") {
|
|
280
|
+
// Autolink <https://…> / <mailto:…>; any other "<" is plain text (raw HTML is never interpreted).
|
|
281
|
+
const end = text.indexOf(">", i);
|
|
282
|
+
const inner = end > 0 ? text.slice(i + 1, end) : "";
|
|
283
|
+
if (/^(https?:\/\/|mailto:)\S+$/i.test(inner) && validHref(inner)) {
|
|
284
|
+
flush();
|
|
285
|
+
out.push({ t: "a", href: inner, c: [inner.replace(/^mailto:/i, "")] });
|
|
286
|
+
i = end;
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (c === "*" || c === "_" || (c === "~" && text[i + 1] === "~")) {
|
|
291
|
+
const double = text[i + 1] === c;
|
|
292
|
+
const delim = c === "~" ? "~~" : double ? c + c : c;
|
|
293
|
+
const canOpen = !isSpace(text[i + delim.length]) && !(c === "_" && isWord(text[i - 1]));
|
|
294
|
+
if (canOpen && depth < MAX_DEPTH) {
|
|
295
|
+
const end = closingDelimiter(text, i + delim.length, delim);
|
|
296
|
+
if (end > 0) {
|
|
297
|
+
flush();
|
|
298
|
+
out.push({ t: c === "~" ? "del" : delim.length === 2 ? "strong" : "em", c: parseInline(text.slice(i + delim.length, end), depth + 1) });
|
|
299
|
+
i = end + delim.length - 1;
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
buf += delim;
|
|
304
|
+
i += delim.length - 1;
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
buf += c;
|
|
308
|
+
}
|
|
309
|
+
flush();
|
|
310
|
+
return out;
|
|
311
|
+
}
|
|
312
|
+
/** Parse markdown into the block tree. */
|
|
313
|
+
function parse(source) {
|
|
314
|
+
return parseBlocks(String(source ?? "").replace(/\r\n?/g, "\n").replace(/\t/g, " ").split("\n"), 0);
|
|
315
|
+
}
|
|
316
|
+
const external = (href) => /^https?:\/\//i.test(href);
|
|
317
|
+
/** A list item made of one paragraph, optionally followed by nested lists. */
|
|
318
|
+
const tight = (item) => item[0]?.t === "p" && item.slice(1).every((b) => b.t === "ul" || b.t === "ol");
|
|
319
|
+
/** Heading levels start at `minHeading` (the page has its own h1 — a "# Title" in a section becomes an h2). */
|
|
320
|
+
const level = (n, minHeading) => Math.min(6, Math.max(minHeading, n));
|
|
321
|
+
// ─── React ──────────────────────────────────────────────────────────────────
|
|
322
|
+
function renderInline(nodes) {
|
|
323
|
+
return nodes.map((n, k) => {
|
|
324
|
+
if (typeof n === "string")
|
|
325
|
+
return _jsx(Fragment, { children: n }, k);
|
|
326
|
+
switch (n.t) {
|
|
327
|
+
case "em":
|
|
328
|
+
return _jsx("em", { children: renderInline(n.c) }, k);
|
|
329
|
+
case "strong":
|
|
330
|
+
return _jsx("strong", { children: renderInline(n.c) }, k);
|
|
331
|
+
case "del":
|
|
332
|
+
return _jsx("del", { children: renderInline(n.c) }, k);
|
|
333
|
+
case "code":
|
|
334
|
+
return _jsx("code", { children: n.text }, k);
|
|
335
|
+
case "br":
|
|
336
|
+
return _jsx("br", {}, k);
|
|
337
|
+
case "img":
|
|
338
|
+
// eslint-disable-next-line @next/next/no-img-element -- any URL or public file, no next/image config needed
|
|
339
|
+
return _jsx("img", { src: n.src, alt: n.alt, title: n.title, loading: "lazy", decoding: "async" }, k);
|
|
340
|
+
case "a":
|
|
341
|
+
return (_jsx("a", { href: n.href, title: n.title, ...(external(n.href) ? { rel: "noopener" } : {}), children: renderInline(n.c) }, k));
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
function renderBlocks(blocks, minHeading) {
|
|
346
|
+
return blocks.map((b, k) => {
|
|
347
|
+
switch (b.t) {
|
|
348
|
+
case "h": {
|
|
349
|
+
const Tag = `h${level(b.level, minHeading)}`;
|
|
350
|
+
return _jsx(Tag, { children: renderInline(b.c) }, k);
|
|
351
|
+
}
|
|
352
|
+
case "p":
|
|
353
|
+
return _jsx("p", { children: renderInline(b.c) }, k);
|
|
354
|
+
case "code":
|
|
355
|
+
return (_jsx("pre", { tabIndex: 0, children: _jsx("code", { ...(b.lang ? { "data-lang": b.lang } : {}), children: b.text }) }, k));
|
|
356
|
+
case "hr":
|
|
357
|
+
return _jsx("hr", {}, k);
|
|
358
|
+
case "quote":
|
|
359
|
+
return _jsx("blockquote", { children: renderBlocks(b.c, minHeading) }, k);
|
|
360
|
+
case "ul":
|
|
361
|
+
case "ol": {
|
|
362
|
+
const items = b.items.map((item, j) => (_jsx("li", { children: tight(item) ? [_jsx(Fragment, { children: renderInline(item[0].c) }, "p"), ...renderBlocks(item.slice(1), minHeading)] : renderBlocks(item, minHeading) }, j)));
|
|
363
|
+
return b.t === "ul" ? _jsx("ul", { children: items }, k) : _jsx("ol", { ...(b.start !== 1 ? { start: b.start } : {}), children: items }, k);
|
|
364
|
+
}
|
|
365
|
+
case "table":
|
|
366
|
+
return (_jsx("div", { className: "forge-site-table-scroll", tabIndex: 0, children: _jsxs("table", { children: [_jsx("thead", { children: _jsx("tr", { children: b.head.map((h, j) => (_jsx("th", { scope: "col", style: b.align[j] ? { textAlign: b.align[j] } : undefined, children: renderInline(h) }, j))) }) }), _jsx("tbody", { children: b.rows.map((row, r) => (_jsx("tr", { children: row.map((cell, j) => (_jsx("td", { style: b.align[j] ? { textAlign: b.align[j] } : undefined, children: renderInline(cell) }, j))) }, r))) })] }) }, k));
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
/** Markdown as React elements inside a `.forge-site-prose` block (typography from the theme tokens). */
|
|
371
|
+
export function Markdown({ source, className = "", minHeading = 2 }) {
|
|
372
|
+
const blocks = parse(source);
|
|
373
|
+
if (!blocks.length)
|
|
374
|
+
return null;
|
|
375
|
+
return _jsx("div", { className: `forge-site-prose ${className}`.trim(), children: renderBlocks(blocks, minHeading) });
|
|
376
|
+
}
|
|
377
|
+
// ─── HTML string (RSS) ──────────────────────────────────────────────────────
|
|
378
|
+
export const escapeHtml = (s) => s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
379
|
+
function htmlInline(nodes) {
|
|
380
|
+
return nodes
|
|
381
|
+
.map((n) => {
|
|
382
|
+
if (typeof n === "string")
|
|
383
|
+
return escapeHtml(n);
|
|
384
|
+
switch (n.t) {
|
|
385
|
+
case "em":
|
|
386
|
+
case "strong":
|
|
387
|
+
case "del":
|
|
388
|
+
return `<${n.t}>${htmlInline(n.c)}</${n.t}>`;
|
|
389
|
+
case "code":
|
|
390
|
+
return `<code>${escapeHtml(n.text)}</code>`;
|
|
391
|
+
case "br":
|
|
392
|
+
return "<br>";
|
|
393
|
+
case "img":
|
|
394
|
+
return `<img src="${escapeHtml(n.src)}" alt="${escapeHtml(n.alt)}"${n.title ? ` title="${escapeHtml(n.title)}"` : ""}>`;
|
|
395
|
+
case "a":
|
|
396
|
+
return `<a href="${escapeHtml(n.href)}"${n.title ? ` title="${escapeHtml(n.title)}"` : ""}>${htmlInline(n.c)}</a>`;
|
|
397
|
+
}
|
|
398
|
+
})
|
|
399
|
+
.join("");
|
|
400
|
+
}
|
|
401
|
+
function htmlBlocks(blocks, minHeading) {
|
|
402
|
+
return blocks
|
|
403
|
+
.map((b) => {
|
|
404
|
+
switch (b.t) {
|
|
405
|
+
case "h":
|
|
406
|
+
return `<h${level(b.level, minHeading)}>${htmlInline(b.c)}</h${level(b.level, minHeading)}>`;
|
|
407
|
+
case "p":
|
|
408
|
+
return `<p>${htmlInline(b.c)}</p>`;
|
|
409
|
+
case "code":
|
|
410
|
+
return `<pre><code>${escapeHtml(b.text)}</code></pre>`;
|
|
411
|
+
case "hr":
|
|
412
|
+
return "<hr>";
|
|
413
|
+
case "quote":
|
|
414
|
+
return `<blockquote>${htmlBlocks(b.c, minHeading)}</blockquote>`;
|
|
415
|
+
case "ul":
|
|
416
|
+
case "ol": {
|
|
417
|
+
const items = b.items.map((item) => `<li>${tight(item) ? htmlInline(item[0].c) + htmlBlocks(item.slice(1), minHeading) : htmlBlocks(item, minHeading)}</li>`).join("");
|
|
418
|
+
return b.t === "ul" ? `<ul>${items}</ul>` : `<ol${b.start !== 1 ? ` start="${b.start}"` : ""}>${items}</ol>`;
|
|
419
|
+
}
|
|
420
|
+
case "table":
|
|
421
|
+
return `<table><thead><tr>${b.head.map((h) => `<th>${htmlInline(h)}</th>`).join("")}</tr></thead><tbody>${b.rows.map((r) => `<tr>${r.map((c) => `<td>${htmlInline(c)}</td>`).join("")}</tr>`).join("")}</tbody></table>`;
|
|
422
|
+
}
|
|
423
|
+
})
|
|
424
|
+
.join("");
|
|
425
|
+
}
|
|
426
|
+
/** Markdown as an escaped HTML string (RSS item bodies). `baseUrl` makes relative links and images absolute. */
|
|
427
|
+
export function markdownToHtml(source, options = {}) {
|
|
428
|
+
const html = htmlBlocks(parse(source), options.minHeading ?? 2);
|
|
429
|
+
if (!options.baseUrl)
|
|
430
|
+
return html;
|
|
431
|
+
const base = options.baseUrl.replace(/\/$/, "");
|
|
432
|
+
return html.replace(/(href|src)="\/(?!\/)/g, `$1="${base}/`);
|
|
433
|
+
}
|
|
434
|
+
/** Plain text of markdown (excerpts, meta descriptions, reading time). */
|
|
435
|
+
export function markdownToText(source) {
|
|
436
|
+
const text = (nodes) => nodes.map((n) => (typeof n === "string" ? n : n.t === "br" ? " " : n.t === "img" ? n.alt : n.t === "code" ? n.text : text(n.c))).join("");
|
|
437
|
+
const blocks = (list) => list.flatMap((b) => {
|
|
438
|
+
switch (b.t) {
|
|
439
|
+
case "h":
|
|
440
|
+
case "p":
|
|
441
|
+
return [text(b.c)];
|
|
442
|
+
case "code":
|
|
443
|
+
return [b.text];
|
|
444
|
+
case "quote":
|
|
445
|
+
return blocks(b.c);
|
|
446
|
+
case "ul":
|
|
447
|
+
case "ol":
|
|
448
|
+
return b.items.flatMap(blocks);
|
|
449
|
+
case "table":
|
|
450
|
+
return [...b.head.map(text), ...b.rows.flatMap((r) => r.map(text))];
|
|
451
|
+
default:
|
|
452
|
+
return [];
|
|
453
|
+
}
|
|
454
|
+
});
|
|
455
|
+
return blocks(parse(source)).join(" ").replace(/\s+/g, " ").trim();
|
|
456
|
+
}
|
|
457
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/site/markdown.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Messages } from "../i18n/locale.js";
|
|
2
|
+
import type { SiteApp, SiteRender } from "./types.js";
|
|
3
|
+
export interface SitePageViewProps {
|
|
4
|
+
app: SiteApp;
|
|
5
|
+
render: SiteRender;
|
|
6
|
+
/** UI language (resolveLocale), default: the app's default locale. */
|
|
7
|
+
locale?: string;
|
|
8
|
+
/** Schema translations by locale (apps/web/forge.locales.ts). */
|
|
9
|
+
messages?: Record<string, Messages>;
|
|
10
|
+
/** Editor preview (`?preview=1` for site editors): hidden sections show, marked. */
|
|
11
|
+
preview?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/** A website page: its sections between the header and the footer. One h1: the opening hero's, else the page title (visually hidden). */
|
|
14
|
+
export declare function SitePageView({ app: baseApp, render, locale, messages, preview }: SitePageViewProps): import("react").JSX.Element | null;
|
|
15
|
+
/** A blog post, guide, webinar or case study: title, author, date, cover and the markdown body. */
|
|
16
|
+
export declare function SitePostView({ app: baseApp, render, locale, messages }: Omit<SitePageViewProps, "preview">): import("react").JSX.Element | null;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { validHref, validImage } from "@tekki-forge/compiler/site";
|
|
3
|
+
import { ArrowLeft } from "lucide-react";
|
|
4
|
+
import { Fragment } from "react";
|
|
5
|
+
import { BrandLogo } from "../brand-art.js";
|
|
6
|
+
import { formatDate, siteTranslator } from "./format.js";
|
|
7
|
+
import { SiteHeader } from "./header.js";
|
|
8
|
+
import { SocialIcon, SOCIAL_NAMES } from "./icons.js";
|
|
9
|
+
import { Markdown, markdownToText } from "./markdown.js";
|
|
10
|
+
import { renderSection } from "./sections.js";
|
|
11
|
+
const external = (href) => /^https?:\/\//i.test(href);
|
|
12
|
+
/** Header buttons with their labels: the built-in sign-in/sign-up are translated, page buttons keep their title. */
|
|
13
|
+
function headerActions(actions, t) {
|
|
14
|
+
return actions
|
|
15
|
+
.filter((a) => validHref(a.href))
|
|
16
|
+
.map((a) => ({ href: a.href, label: a.label ?? (a.kind === "signUp" ? t("site.signUp") : a.kind === "signIn" ? t("site.signIn") : a.href), primary: a.kind === "signUp" }));
|
|
17
|
+
}
|
|
18
|
+
function headerNav(chrome) {
|
|
19
|
+
return chrome.nav.flatMap((e) => {
|
|
20
|
+
if (e.items) {
|
|
21
|
+
const items = e.items.filter((l) => validHref(l.href));
|
|
22
|
+
return items.length ? [{ label: e.label, ...(e.description ? { description: e.description } : {}), items }] : [];
|
|
23
|
+
}
|
|
24
|
+
return e.href && validHref(e.href) ? [{ label: e.label, href: e.href }] : [];
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function SiteFooter({ app, chrome, t }) {
|
|
28
|
+
const year = new Date().getFullYear();
|
|
29
|
+
const columns = chrome.footer.columns.map((c) => ({ ...c, links: c.links.filter((l) => validHref(l.href)) })).filter((c) => c.links.length);
|
|
30
|
+
const social = chrome.footer.social.filter((s) => SOCIAL_NAMES[s.network] && validHref(s.href) && external(s.href));
|
|
31
|
+
const colClass = columns.length >= 4 ? "@3xl:grid-cols-4" : columns.length === 3 ? "@3xl:grid-cols-3" : "@3xl:grid-cols-2";
|
|
32
|
+
return (_jsx("footer", { className: "forge-site-footer mt-auto", children: _jsxs("div", { className: "mx-auto max-w-6xl px-4 py-14 @3xl:px-8 @3xl:py-16", children: [_jsxs("div", { className: `grid gap-12 ${columns.length ? "@5xl:grid-cols-[minmax(0,1fr)_minmax(0,2fr)]" : ""}`, children: [_jsxs("div", { className: "max-w-sm", children: [_jsxs("a", { href: "/", className: "forge-focusable inline-flex items-center gap-2.5 rounded-[var(--forge-radius-control)] font-semibold text-ink", children: [_jsx(BrandLogo, { app: app }), _jsx("span", { children: app.name })] }), (chrome.footer.note || app.theme.tagline) && _jsx("p", { className: "mt-4 text-sm leading-relaxed text-pretty text-ink-muted", children: chrome.footer.note ?? app.theme.tagline }), social.length > 0 && (_jsx("ul", { className: "mt-6 flex flex-wrap gap-1.5", "aria-label": t("site.footer.social"), children: social.map((s) => (_jsx("li", { children: _jsx("a", { href: s.href, rel: "noopener me", "aria-label": SOCIAL_NAMES[s.network], className: "forge-btn forge-btn-ghost inline-flex size-9 items-center justify-center", children: _jsx(SocialIcon, { network: s.network }) }) }, s.network + s.href))) }))] }), columns.length > 0 && (_jsx("nav", { "aria-label": t("site.footer.navigation"), className: `grid grid-cols-2 gap-x-8 gap-y-10 ${colClass}`, children: columns.map((c, i) => (_jsxs("div", { children: [_jsx("h2", { className: "text-sm font-semibold text-ink", children: c.title }), _jsx("ul", { className: "mt-4 grid gap-3 text-sm", children: c.links.map((l) => (_jsx("li", { children: _jsx("a", { href: l.href, ...(external(l.href) ? { rel: "noopener" } : {}), className: "forge-focusable forge-site-footer-link rounded-sm", children: l.label }) }, l.href + l.label))) })] }, c.title + i))) }))] }), _jsx("p", { className: "mt-12 border-t border-line pt-6 text-sm text-ink-muted", children: t("site.footer.copyright", { year: String(year), app: app.name }) })] }) }));
|
|
33
|
+
}
|
|
34
|
+
/** Skip link, header, main and footer around a page's content. */
|
|
35
|
+
function SiteShell({ app, render, t, currentPath, children }) {
|
|
36
|
+
const brand = (_jsxs("a", { href: "/", className: "forge-focusable flex min-w-0 shrink-0 items-center gap-2.5 rounded-[var(--forge-radius-control)] font-semibold text-ink", children: [_jsx(BrandLogo, { app: app }), _jsx("span", { className: "truncate", children: app.name })] }));
|
|
37
|
+
return (_jsxs("div", { className: "forge-app-bg forge-site @container flex min-h-dvh flex-col", children: [_jsx("a", { href: "#main", className: "forge-skip-link", children: t("site.skipToContent") }), _jsx(SiteHeader, { brand: brand, nav: headerNav(render.chrome), actions: headerActions(render.chrome.actions, t), labels: { navigation: t("site.navigation"), openMenu: t("site.openMenu"), closeMenu: t("site.closeMenu"), menu: t("site.menu") }, ...(currentPath ? { currentPath } : {}) }), _jsx("main", { id: "main", tabIndex: -1, className: "flex-1 focus:outline-none", children: children }), _jsx(SiteFooter, { app: app, chrome: render.chrome, t: t })] }));
|
|
38
|
+
}
|
|
39
|
+
/** A website page: its sections between the header and the footer. One h1: the opening hero's, else the page title (visually hidden). */
|
|
40
|
+
export function SitePageView({ app: baseApp, render, locale, messages, preview = false }) {
|
|
41
|
+
const { app, lang, t } = siteTranslator(baseApp, locale, messages);
|
|
42
|
+
const page = render.page;
|
|
43
|
+
if (!page)
|
|
44
|
+
return null;
|
|
45
|
+
const visible = page.sections.filter((s) => preview || !s.hidden);
|
|
46
|
+
const opensWithHero = visible[0]?.type === "hero" && typeof visible[0].props.title === "string" && !!visible[0].props.title.trim();
|
|
47
|
+
return (_jsxs(SiteShell, { app: app, render: render, t: t, currentPath: page.path, children: [page.status === "draft" && (_jsx("p", { role: "status", className: "forge-banner px-4 py-2 text-center text-sm font-medium", children: t("site.draftNotice") })), !opensWithHero && _jsx("h1", { className: "sr-only", children: page.title }), visible.map((section, i) => (_jsx(Fragment, { children: renderSection({ app, section, data: section.data, lang, t, preview, first: i === 0, pagePath: page.path }) }, section.id)))] }));
|
|
48
|
+
}
|
|
49
|
+
/** Reading time in minutes (about 220 words a minute). */
|
|
50
|
+
const readingMinutes = (body) => Math.max(1, Math.round(markdownToText(body).split(/\s+/).filter(Boolean).length / 220));
|
|
51
|
+
/** A blog post, guide, webinar or case study: title, author, date, cover and the markdown body. */
|
|
52
|
+
export function SitePostView({ app: baseApp, render, locale, messages }) {
|
|
53
|
+
const { app, lang, t } = siteTranslator(baseApp, locale, messages);
|
|
54
|
+
const post = render.post;
|
|
55
|
+
if (!post)
|
|
56
|
+
return null;
|
|
57
|
+
const base = render.blog[post.kind];
|
|
58
|
+
const back = base && validHref(base) ? base : undefined;
|
|
59
|
+
const cover = validImage(post.coverImage) ? post.coverImage : undefined;
|
|
60
|
+
const date = post.publishedAt ? formatDate(post.publishedAt, lang) : "";
|
|
61
|
+
const minutes = readingMinutes(post.body);
|
|
62
|
+
const backLink = back && (_jsxs("a", { href: back, className: "forge-focusable inline-flex items-center gap-1.5 rounded-sm text-sm font-medium text-link hover:underline", children: [_jsx(ArrowLeft, { className: "size-4", "aria-hidden": true }), t(`site.post.back.${post.kind}`)] }));
|
|
63
|
+
return (_jsx(SiteShell, { app: app, render: render, t: t, ...(back ? { currentPath: back } : {}), children: _jsxs("article", { className: "forge-site-section px-4 pt-12 pb-20 @3xl:px-8 @3xl:pt-16 @3xl:pb-28", children: [_jsxs("header", { className: "mx-auto max-w-3xl", children: [backLink, post.tags.length > 0 && (_jsx("ul", { className: "mt-8 flex flex-wrap gap-1.5", "aria-label": t("site.post.tags"), children: post.tags.map((tag) => (_jsx("li", { className: "forge-chip px-2.5 py-0.5 text-xs font-medium", children: tag }, tag))) })), _jsx("h1", { className: `forge-heading forge-site-display text-4xl leading-[1.08] font-semibold tracking-tight text-balance text-ink @3xl:text-5xl ${post.tags.length ? "mt-4" : "mt-8"}`, children: post.title }), post.excerpt && _jsx("p", { className: "mt-5 text-xl leading-relaxed text-pretty text-ink-muted", children: post.excerpt }), _jsxs("p", { className: "mt-8 flex flex-wrap items-center gap-x-3 gap-y-1 border-b border-line pb-8 text-sm text-ink-muted", children: [post.authorName && _jsx("span", { className: "font-medium text-ink", children: post.authorName }), post.authorName && date && _jsx("span", { "aria-hidden": true, children: "\u00B7" }), date && _jsx("time", { dateTime: post.publishedAt, children: date }), _jsx("span", { "aria-hidden": true, children: "\u00B7" }), _jsx("span", { children: t("site.post.readingTime", { count: minutes }) })] })] }), cover && (_jsx("div", { className: "forge-site-frame forge-site-media mx-auto mt-10 aspect-[16/9] max-w-5xl overflow-hidden", children: _jsx("img", { src: cover, alt: "", fetchPriority: "high", decoding: "async", className: "size-full object-cover" }) })), _jsx(Markdown, { source: post.body, className: "forge-site-prose-lg mx-auto mt-12 max-w-3xl" }), backLink && _jsx("footer", { className: "mx-auto mt-16 max-w-3xl border-t border-line pt-8", children: backLink })] }) }));
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/site/page.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AppIR } from "@tekki-forge/compiler";
|
|
2
|
+
export type SiteRoutingApp = Pick<AppIR, "entities" | "plugins" | "site"> & Partial<Pick<AppIR, "landing">>;
|
|
3
|
+
/** First path segments that belong to the app (never the website): reserved routes, entity lists, plugin pages. */
|
|
4
|
+
export declare function appSegments(app: SiteRoutingApp): Set<string>;
|
|
5
|
+
/**
|
|
6
|
+
* Where proxy.ts rewrites `pathname` (null: leave the request alone).
|
|
7
|
+
* - Without `site`: `/` for signed-out visitors → `/welcome` when the legacy landing page is on; nothing else changes.
|
|
8
|
+
* - `/` → `/site` for signed-out visitors (signed-in people keep their dashboard).
|
|
9
|
+
* - `<blog base>/rss.xml` → `/site-feed/<kind>`.
|
|
10
|
+
* - Any other path whose first segment is not the app's (sign-in, admin, API, entity and plugin pages) → `/site<path>`.
|
|
11
|
+
* Static files (a dot in the last segment) are left alone.
|
|
12
|
+
*/
|
|
13
|
+
export declare function siteProxyTarget(app: SiteRoutingApp, pathname: string, signedIn: boolean): string | null;
|