third-audience-mdx 1.0.2 → 1.0.3
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/dashboard/routes/okf-graph-route.d.mts +6 -0
- package/dist/dashboard/routes/okf-graph-route.d.ts +6 -0
- package/dist/dashboard/routes/okf-graph-route.js +266 -0
- package/dist/dashboard/routes/okf-graph-route.js.map +1 -0
- package/dist/dashboard/routes/okf-graph-route.mjs +231 -0
- package/dist/dashboard/routes/okf-graph-route.mjs.map +1 -0
- package/dist/dashboard/routes/okf-route.js +1 -1
- package/dist/dashboard/routes/okf-route.js.map +1 -1
- package/dist/dashboard/routes/okf-route.mjs +1 -1
- package/dist/dashboard/routes/okf-route.mjs.map +1 -1
- package/dist/dashboard/ui/components/Sidebar.js +15 -0
- package/dist/dashboard/ui/components/Sidebar.js.map +1 -1
- package/dist/dashboard/ui/components/Sidebar.mjs +15 -0
- package/dist/dashboard/ui/components/Sidebar.mjs.map +1 -1
- package/dist/dashboard/ui/pages/OkfPage.d.mts +5 -0
- package/dist/dashboard/ui/pages/OkfPage.d.ts +5 -0
- package/dist/dashboard/ui/pages/OkfPage.js +438 -0
- package/dist/dashboard/ui/pages/OkfPage.js.map +1 -0
- package/dist/dashboard/ui/pages/OkfPage.mjs +414 -0
- package/dist/dashboard/ui/pages/OkfPage.mjs.map +1 -0
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +11 -1
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/dashboard/ui/pages/OkfPage.tsx
|
|
22
|
+
var OkfPage_exports = {};
|
|
23
|
+
__export(OkfPage_exports, {
|
|
24
|
+
OkfPage: () => OkfPage
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(OkfPage_exports);
|
|
27
|
+
var import_react = require("react");
|
|
28
|
+
|
|
29
|
+
// src/dashboard/ui/components/Card.tsx
|
|
30
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
31
|
+
function Card({ title, action, children }) {
|
|
32
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "ta-card ta-section", children: [
|
|
33
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "ta-card-header", children: [
|
|
34
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { children: title }),
|
|
35
|
+
action
|
|
36
|
+
] }),
|
|
37
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "ta-card-body", children })
|
|
38
|
+
] });
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// src/dashboard/ui/components/HeroCard.tsx
|
|
42
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
43
|
+
function HeroCard({ label, value, meta, color = "blue", icon }) {
|
|
44
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: `ta-hero-card ta-hero-card--${color}`, children: [
|
|
45
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "ta-hero-icon", children: icon }),
|
|
46
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
47
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "ta-hero-label", children: label }),
|
|
48
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "ta-hero-value", children: value }),
|
|
49
|
+
meta && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "ta-hero-meta", children: meta })
|
|
50
|
+
] })
|
|
51
|
+
] });
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// src/dashboard/ui/pages/OkfPage.tsx
|
|
55
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
56
|
+
function OkfGraph({ data }) {
|
|
57
|
+
const svgRef = (0, import_react.useRef)(null);
|
|
58
|
+
(0, import_react.useEffect)(() => {
|
|
59
|
+
const svg = svgRef.current;
|
|
60
|
+
if (!svg || !data.nodes.length) return;
|
|
61
|
+
const NS = "http://www.w3.org/2000/svg";
|
|
62
|
+
svg.innerHTML = "";
|
|
63
|
+
const rect = svg.getBoundingClientRect();
|
|
64
|
+
const W = Math.max(320, Math.round(rect.width)) || 900;
|
|
65
|
+
const H = Math.max(360, Math.round(rect.height)) || 560;
|
|
66
|
+
svg.setAttribute("viewBox", `0 0 ${W} ${H}`);
|
|
67
|
+
const showLabels = data.nodes.length <= 40;
|
|
68
|
+
const spread = Math.min(W, H) * 0.42;
|
|
69
|
+
const nodes = data.nodes.map((n, i) => {
|
|
70
|
+
const ang = i / data.nodes.length * Math.PI * 2;
|
|
71
|
+
return { ...n, x: W / 2 + Math.cos(ang) * spread, y: H / 2 + Math.sin(ang) * spread, vx: 0, vy: 0, deg: 0, fixed: false, moved: false };
|
|
72
|
+
});
|
|
73
|
+
const byId = {};
|
|
74
|
+
nodes.forEach((n) => {
|
|
75
|
+
byId[n.id] = n;
|
|
76
|
+
});
|
|
77
|
+
const edges = data.edges.filter((e) => byId[e.source] && byId[e.target] && e.source !== e.target);
|
|
78
|
+
edges.forEach((e) => {
|
|
79
|
+
byId[e.source].deg++;
|
|
80
|
+
byId[e.target].deg++;
|
|
81
|
+
});
|
|
82
|
+
const radius = (n) => 6 + Math.min(10, n.deg * 1.7);
|
|
83
|
+
function tick() {
|
|
84
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
85
|
+
const a = nodes[i];
|
|
86
|
+
for (let j = i + 1; j < nodes.length; j++) {
|
|
87
|
+
const b = nodes[j];
|
|
88
|
+
const dx = a.x - b.x, dy = a.y - b.y;
|
|
89
|
+
const d2 = dx * dx + dy * dy || 0.01, d = Math.sqrt(d2);
|
|
90
|
+
const f = 9e3 / d2, fx = f * dx / d, fy = f * dy / d;
|
|
91
|
+
a.vx += fx;
|
|
92
|
+
a.vy += fy;
|
|
93
|
+
b.vx -= fx;
|
|
94
|
+
b.vy -= fy;
|
|
95
|
+
}
|
|
96
|
+
a.vx += (W / 2 - a.x) * 5e-3;
|
|
97
|
+
a.vy += (H / 2 - a.y) * 5e-3;
|
|
98
|
+
}
|
|
99
|
+
for (const e of edges) {
|
|
100
|
+
const a = byId[e.source], b = byId[e.target];
|
|
101
|
+
const dx = b.x - a.x, dy = b.y - a.y;
|
|
102
|
+
const d = Math.sqrt(dx * dx + dy * dy) || 0.01;
|
|
103
|
+
const f = (d - 150) * 0.012, fx = f * dx / d, fy = f * dy / d;
|
|
104
|
+
a.vx += fx;
|
|
105
|
+
a.vy += fy;
|
|
106
|
+
b.vx -= fx;
|
|
107
|
+
b.vy -= fy;
|
|
108
|
+
}
|
|
109
|
+
for (const a of nodes) {
|
|
110
|
+
if (a.fixed) {
|
|
111
|
+
a.vx = 0;
|
|
112
|
+
a.vy = 0;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
a.vx *= 0.86;
|
|
116
|
+
a.vy *= 0.86;
|
|
117
|
+
a.x += Math.max(-12, Math.min(12, a.vx));
|
|
118
|
+
a.y += Math.max(-12, Math.min(12, a.vy));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const view = document.createElementNS(NS, "g");
|
|
122
|
+
svg.appendChild(view);
|
|
123
|
+
const gE = document.createElementNS(NS, "g");
|
|
124
|
+
const gN = document.createElementNS(NS, "g");
|
|
125
|
+
view.appendChild(gE);
|
|
126
|
+
view.appendChild(gN);
|
|
127
|
+
let tx = 0, ty = 0, sc = 1;
|
|
128
|
+
const applyView = () => view.setAttribute("transform", `translate(${tx},${ty}) scale(${sc})`);
|
|
129
|
+
const edgeEls = edges.map(() => {
|
|
130
|
+
const ln = document.createElementNS(NS, "line");
|
|
131
|
+
ln.setAttribute("stroke", "rgba(130,175,230,0.10)");
|
|
132
|
+
ln.setAttribute("stroke-width", "0.7");
|
|
133
|
+
gE.appendChild(ln);
|
|
134
|
+
return ln;
|
|
135
|
+
});
|
|
136
|
+
nodes.forEach((n) => {
|
|
137
|
+
const g = document.createElementNS(NS, "g");
|
|
138
|
+
g.setAttribute("cursor", n.url ? "pointer" : "grab");
|
|
139
|
+
const c = document.createElementNS(NS, "circle");
|
|
140
|
+
c.setAttribute("r", String(radius(n)));
|
|
141
|
+
c.setAttribute("fill", n.type === "WebPage" || n.type === "Page" ? "#8ab4e8" : "#5291d7");
|
|
142
|
+
c.setAttribute("stroke", "#0f1115");
|
|
143
|
+
c.setAttribute("stroke-width", "1.5");
|
|
144
|
+
const t = document.createElementNS(NS, "text");
|
|
145
|
+
t.textContent = n.title.length > 26 ? n.title.slice(0, 24) + "\u2026" : n.title;
|
|
146
|
+
t.setAttribute("fill", "#c9d4e0");
|
|
147
|
+
t.setAttribute("font-size", "11");
|
|
148
|
+
t.setAttribute("text-anchor", "middle");
|
|
149
|
+
t.setAttribute("pointer-events", "none");
|
|
150
|
+
t.setAttribute("opacity", showLabels ? "1" : "0");
|
|
151
|
+
const ti = document.createElementNS(NS, "title");
|
|
152
|
+
ti.textContent = n.title;
|
|
153
|
+
g.appendChild(c);
|
|
154
|
+
g.appendChild(t);
|
|
155
|
+
g.appendChild(ti);
|
|
156
|
+
g.addEventListener("mouseenter", () => highlight(n));
|
|
157
|
+
g.addEventListener("mouseleave", clearHi);
|
|
158
|
+
if (n.url) {
|
|
159
|
+
g.addEventListener("click", () => {
|
|
160
|
+
if (n.moved) {
|
|
161
|
+
n.moved = false;
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
window.open(n.url, "_blank", "noopener");
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
gN.appendChild(g);
|
|
168
|
+
n.g = g;
|
|
169
|
+
n.c = c;
|
|
170
|
+
n.t = t;
|
|
171
|
+
});
|
|
172
|
+
function highlight(node) {
|
|
173
|
+
const on = { [node.id]: true };
|
|
174
|
+
edges.forEach((e, i) => {
|
|
175
|
+
const hit = e.source === node.id || e.target === node.id;
|
|
176
|
+
edgeEls[i].setAttribute("stroke", hit ? "rgba(146,190,240,0.95)" : "rgba(130,175,230,0.07)");
|
|
177
|
+
if (hit) {
|
|
178
|
+
on[e.source] = true;
|
|
179
|
+
on[e.target] = true;
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
nodes.forEach((m) => {
|
|
183
|
+
m.g.setAttribute("opacity", on[m.id] ? "1" : "0.22");
|
|
184
|
+
m.t.setAttribute("opacity", on[m.id] ? "1" : showLabels ? "1" : "0");
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
function clearHi() {
|
|
188
|
+
edgeEls.forEach((el) => el.setAttribute("stroke", "rgba(130,175,230,0.10)"));
|
|
189
|
+
nodes.forEach((m) => {
|
|
190
|
+
m.g.setAttribute("opacity", "1");
|
|
191
|
+
if (!showLabels) m.t.setAttribute("opacity", "0");
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
function paint() {
|
|
195
|
+
edges.forEach((e, i) => {
|
|
196
|
+
const a = byId[e.source], b = byId[e.target];
|
|
197
|
+
edgeEls[i].setAttribute("x1", String(a.x));
|
|
198
|
+
edgeEls[i].setAttribute("y1", String(a.y));
|
|
199
|
+
edgeEls[i].setAttribute("x2", String(b.x));
|
|
200
|
+
edgeEls[i].setAttribute("y2", String(b.y));
|
|
201
|
+
});
|
|
202
|
+
nodes.forEach((n) => {
|
|
203
|
+
n.c.setAttribute("cx", String(n.x));
|
|
204
|
+
n.c.setAttribute("cy", String(n.y));
|
|
205
|
+
n.t.setAttribute("x", String(n.x));
|
|
206
|
+
n.t.setAttribute("y", String(n.y - radius(n) - 5));
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
function pt(el, ev) {
|
|
210
|
+
const m = el.getScreenCTM();
|
|
211
|
+
if (!m) return { x: ev.clientX, y: ev.clientY };
|
|
212
|
+
const inv = m.inverse();
|
|
213
|
+
return { x: inv.a * ev.clientX + inv.c * ev.clientY + inv.e, y: inv.b * ev.clientX + inv.d * ev.clientY + inv.f };
|
|
214
|
+
}
|
|
215
|
+
const state = { drag: null, pan: null };
|
|
216
|
+
svg.addEventListener("mousedown", (ev) => {
|
|
217
|
+
const p = pt(view, ev);
|
|
218
|
+
let best = 900;
|
|
219
|
+
let hit = null;
|
|
220
|
+
nodes.forEach((n) => {
|
|
221
|
+
const dx = n.x - p.x, dy = n.y - p.y, dd = dx * dx + dy * dy;
|
|
222
|
+
if (dd < best) {
|
|
223
|
+
best = dd;
|
|
224
|
+
hit = n;
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
if (hit !== null) {
|
|
228
|
+
state.drag = hit;
|
|
229
|
+
state.drag.fixed = true;
|
|
230
|
+
state.drag.moved = false;
|
|
231
|
+
} else {
|
|
232
|
+
const r = pt(svg, ev);
|
|
233
|
+
state.pan = { x: r.x, y: r.y, tx, ty };
|
|
234
|
+
svg.style.cursor = "grabbing";
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
const onMouseMove = (ev) => {
|
|
238
|
+
if (state.drag !== null) {
|
|
239
|
+
const p = pt(view, ev);
|
|
240
|
+
state.drag.x = p.x;
|
|
241
|
+
state.drag.y = p.y;
|
|
242
|
+
state.drag.moved = true;
|
|
243
|
+
tick();
|
|
244
|
+
state.drag.x = p.x;
|
|
245
|
+
state.drag.y = p.y;
|
|
246
|
+
paint();
|
|
247
|
+
} else if (state.pan !== null) {
|
|
248
|
+
const r = pt(svg, ev);
|
|
249
|
+
tx = state.pan.tx + (r.x - state.pan.x);
|
|
250
|
+
ty = state.pan.ty + (r.y - state.pan.y);
|
|
251
|
+
applyView();
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
const onMouseUp = () => {
|
|
255
|
+
if (state.drag !== null) {
|
|
256
|
+
state.drag.fixed = false;
|
|
257
|
+
state.drag = null;
|
|
258
|
+
let f = 0;
|
|
259
|
+
(function r() {
|
|
260
|
+
tick();
|
|
261
|
+
paint();
|
|
262
|
+
if (f++ < 60) requestAnimationFrame(r);
|
|
263
|
+
})();
|
|
264
|
+
}
|
|
265
|
+
if (state.pan !== null) {
|
|
266
|
+
state.pan = null;
|
|
267
|
+
svg.style.cursor = "";
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
window.addEventListener("mousemove", onMouseMove);
|
|
271
|
+
window.addEventListener("mouseup", onMouseUp);
|
|
272
|
+
svg.addEventListener("wheel", (ev) => {
|
|
273
|
+
ev.preventDefault();
|
|
274
|
+
const r = pt(svg, ev), lx = (r.x - tx) / sc, ly = (r.y - ty) / sc;
|
|
275
|
+
sc = Math.max(0.15, Math.min(4, sc * (ev.deltaY < 0 ? 1.12 : 1 / 1.12)));
|
|
276
|
+
tx = r.x - lx * sc;
|
|
277
|
+
ty = r.y - ly * sc;
|
|
278
|
+
applyView();
|
|
279
|
+
}, { passive: false });
|
|
280
|
+
function fitView() {
|
|
281
|
+
let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
|
|
282
|
+
nodes.forEach((n) => {
|
|
283
|
+
const r = radius(n) + 24;
|
|
284
|
+
if (n.x - r < minX) minX = n.x - r;
|
|
285
|
+
if (n.y - r < minY) minY = n.y - r;
|
|
286
|
+
if (n.x + r > maxX) maxX = n.x + r;
|
|
287
|
+
if (n.y + r > maxY) maxY = n.y + r;
|
|
288
|
+
});
|
|
289
|
+
const bw = Math.max(1, maxX - minX), bh = Math.max(1, maxY - minY), pad = 30;
|
|
290
|
+
sc = Math.max(0.15, Math.min(2, Math.min((W - pad * 2) / bw, (H - pad * 2) / bh)));
|
|
291
|
+
tx = (W - bw * sc) / 2 - minX * sc;
|
|
292
|
+
ty = (H - bh * sc) / 2 - minY * sc;
|
|
293
|
+
applyView();
|
|
294
|
+
}
|
|
295
|
+
for (let k = 0; k < 500; k++) tick();
|
|
296
|
+
paint();
|
|
297
|
+
fitView();
|
|
298
|
+
return () => {
|
|
299
|
+
window.removeEventListener("mousemove", onMouseMove);
|
|
300
|
+
window.removeEventListener("mouseup", onMouseUp);
|
|
301
|
+
};
|
|
302
|
+
}, [data]);
|
|
303
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
304
|
+
"svg",
|
|
305
|
+
{
|
|
306
|
+
ref: svgRef,
|
|
307
|
+
style: { width: "100%", height: "72vh", minHeight: 560, display: "block", background: "#0f1115", borderRadius: 8, cursor: "grab", touchAction: "none" },
|
|
308
|
+
role: "img",
|
|
309
|
+
"aria-label": "Knowledge graph of your content"
|
|
310
|
+
}
|
|
311
|
+
);
|
|
312
|
+
}
|
|
313
|
+
function OkfPage() {
|
|
314
|
+
const [state, setState] = (0, import_react.useState)({ data: null, loading: true, error: null });
|
|
315
|
+
(0, import_react.useEffect)(() => {
|
|
316
|
+
fetch("/api/third-audience/okf-graph").then((r) => r.ok ? r.json() : r.json().then((e) => Promise.reject(e.error ?? "Failed"))).then((data2) => setState({ data: data2, loading: false, error: null })).catch((e) => setState({ data: null, loading: false, error: String(e) }));
|
|
317
|
+
}, []);
|
|
318
|
+
if (state.loading) return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { padding: 48, color: "var(--ta-gray-500)", textAlign: "center" }, children: "Loading knowledge graph\u2026" });
|
|
319
|
+
if (state.error) return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { padding: 48, color: "var(--ta-red)", textAlign: "center" }, children: state.error });
|
|
320
|
+
if (!state.data) return null;
|
|
321
|
+
const { data } = state;
|
|
322
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { children: [
|
|
323
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h1", { className: "ta-page-title", children: "OKF Bundle" }),
|
|
324
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "ta-page-subtitle", children: "Open Knowledge Format \u2014 your content as clean Markdown for AI crawlers" }),
|
|
325
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "ta-hero-grid", children: [
|
|
326
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
327
|
+
HeroCard,
|
|
328
|
+
{
|
|
329
|
+
label: "Total Pages",
|
|
330
|
+
value: data.stats.pages,
|
|
331
|
+
meta: "in content directory",
|
|
332
|
+
color: "blue",
|
|
333
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: [
|
|
334
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" }),
|
|
335
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("polyline", { points: "14 2 14 8 20 8" })
|
|
336
|
+
] })
|
|
337
|
+
}
|
|
338
|
+
),
|
|
339
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
340
|
+
HeroCard,
|
|
341
|
+
{
|
|
342
|
+
label: "Graph Nodes",
|
|
343
|
+
value: data.stats.nodes,
|
|
344
|
+
meta: "top connected pages",
|
|
345
|
+
color: "teal",
|
|
346
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: [
|
|
347
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("circle", { cx: "12", cy: "12", r: "3" }),
|
|
348
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("circle", { cx: "3", cy: "6", r: "2" }),
|
|
349
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("circle", { cx: "21", cy: "6", r: "2" }),
|
|
350
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("circle", { cx: "3", cy: "18", r: "2" }),
|
|
351
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("circle", { cx: "21", cy: "18", r: "2" }),
|
|
352
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "5", y1: "6", x2: "10", y2: "11" }),
|
|
353
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "19", y1: "6", x2: "14", y2: "11" }),
|
|
354
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "5", y1: "18", x2: "10", y2: "13" }),
|
|
355
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "19", y1: "18", x2: "14", y2: "13" })
|
|
356
|
+
] })
|
|
357
|
+
}
|
|
358
|
+
),
|
|
359
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
360
|
+
HeroCard,
|
|
361
|
+
{
|
|
362
|
+
label: "Internal Links",
|
|
363
|
+
value: data.stats.edges,
|
|
364
|
+
meta: "edges in graph",
|
|
365
|
+
color: "green",
|
|
366
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: [
|
|
367
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" }),
|
|
368
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" })
|
|
369
|
+
] })
|
|
370
|
+
}
|
|
371
|
+
),
|
|
372
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
373
|
+
HeroCard,
|
|
374
|
+
{
|
|
375
|
+
label: "Bundle Index",
|
|
376
|
+
value: "View",
|
|
377
|
+
meta: data.indexUrl.replace(/^https?:\/\/[^/]+/, ""),
|
|
378
|
+
color: "orange",
|
|
379
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, children: [
|
|
380
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" }),
|
|
381
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("polyline", { points: "15 3 21 3 21 9" }),
|
|
382
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "10", y1: "14", x2: "21", y2: "3" })
|
|
383
|
+
] })
|
|
384
|
+
}
|
|
385
|
+
)
|
|
386
|
+
] }),
|
|
387
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { marginBottom: 24 }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Card, { title: "Knowledge Graph", children: [
|
|
388
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("p", { style: { fontSize: 13, color: "var(--ta-gray-500)", marginBottom: 16 }, children: [
|
|
389
|
+
"Drag nodes \xB7 scroll to zoom \xB7 drag background to pan \xB7 click a node to open the page",
|
|
390
|
+
data.graph.nodes.length > 40 && " \xB7 hover a node to reveal its labels"
|
|
391
|
+
] }),
|
|
392
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(OkfGraph, { data: data.graph })
|
|
393
|
+
] }) }),
|
|
394
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "ta-grid-2", children: [
|
|
395
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Card, { title: "Bundle URLs", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("table", { className: "ta-table", children: [
|
|
396
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("tr", { children: [
|
|
397
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("th", { children: "Resource" }),
|
|
398
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("th", { children: "URL" })
|
|
399
|
+
] }) }),
|
|
400
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("tbody", { children: [
|
|
401
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("tr", { children: [
|
|
402
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { children: "Index" }),
|
|
403
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("a", { href: "/okf", target: "_blank", rel: "noreferrer", style: { fontFamily: "var(--ta-font-mono)", fontSize: 12 }, children: "/okf" }) })
|
|
404
|
+
] }),
|
|
405
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("tr", { children: [
|
|
406
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { children: "AI Sitemap" }),
|
|
407
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("a", { href: "/sitemap-ai.xml", target: "_blank", rel: "noreferrer", style: { fontFamily: "var(--ta-font-mono)", fontSize: 12 }, children: "/sitemap-ai.xml" }) })
|
|
408
|
+
] }),
|
|
409
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("tr", { children: [
|
|
410
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { children: "LLMs.txt" }),
|
|
411
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("td", { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("a", { href: "/llms.txt", target: "_blank", rel: "noreferrer", style: { fontFamily: "var(--ta-font-mono)", fontSize: 12 }, children: "/llms.txt" }) })
|
|
412
|
+
] })
|
|
413
|
+
] })
|
|
414
|
+
] }) }),
|
|
415
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Card, { title: "How AI Crawlers Use OKF", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { style: { fontSize: 13, color: "var(--ta-gray-600)", lineHeight: 1.7 }, children: [
|
|
416
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("p", { style: { marginBottom: 10 }, children: [
|
|
417
|
+
"Each page on your site is available as clean Markdown at ",
|
|
418
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("code", { style: { fontFamily: "var(--ta-font-mono)", background: "var(--ta-gray-100)", padding: "1px 5px", borderRadius: 4 }, children: "/okf/slug.md" })
|
|
419
|
+
] }),
|
|
420
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("p", { style: { marginBottom: 10 }, children: [
|
|
421
|
+
"Internal links are rewritten to point to sibling ",
|
|
422
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("code", { style: { fontFamily: "var(--ta-font-mono)", background: "var(--ta-gray-100)", padding: "1px 5px", borderRadius: 4 }, children: ".md" }),
|
|
423
|
+
" files so crawlers can follow the full knowledge graph."
|
|
424
|
+
] }),
|
|
425
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("p", { children: [
|
|
426
|
+
"The index at ",
|
|
427
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("code", { style: { fontFamily: "var(--ta-font-mono)", background: "var(--ta-gray-100)", padding: "1px 5px", borderRadius: 4 }, children: "/okf" }),
|
|
428
|
+
" lists every page with title and description \u2014 a complete sitemap in natural language."
|
|
429
|
+
] })
|
|
430
|
+
] }) })
|
|
431
|
+
] })
|
|
432
|
+
] });
|
|
433
|
+
}
|
|
434
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
435
|
+
0 && (module.exports = {
|
|
436
|
+
OkfPage
|
|
437
|
+
});
|
|
438
|
+
//# sourceMappingURL=OkfPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/dashboard/ui/pages/OkfPage.tsx","../../../../src/dashboard/ui/components/Card.tsx","../../../../src/dashboard/ui/components/HeroCard.tsx"],"sourcesContent":["'use client'\n\nimport { useEffect, useRef, useState } from 'react'\nimport { Card } from '../components/Card.js'\nimport { HeroCard } from '../components/HeroCard.js'\n\ninterface GraphNode { id: string; title: string; type: string; url: string }\ninterface GraphEdge { source: string; target: string }\ninterface GraphData { nodes: GraphNode[]; edges: GraphEdge[] }\ninterface OkfData {\n graph: GraphData\n stats: { pages: number; nodes: number; edges: number }\n indexUrl: string\n}\n\nfunction OkfGraph({ data }: { data: GraphData }) {\n const svgRef = useRef<SVGSVGElement>(null)\n\n useEffect(() => {\n const svg = svgRef.current\n if (!svg || !data.nodes.length) return\n const NS = 'http://www.w3.org/2000/svg'\n svg.innerHTML = ''\n\n const rect = svg.getBoundingClientRect()\n const W = Math.max(320, Math.round(rect.width)) || 900\n const H = Math.max(360, Math.round(rect.height)) || 560\n svg.setAttribute('viewBox', `0 0 ${W} ${H}`)\n\n const showLabels = data.nodes.length <= 40\n const spread = Math.min(W, H) * 0.42\n\n type SimNode = GraphNode & { x: number; y: number; vx: number; vy: number; deg: number; fixed: boolean; moved: boolean; g?: SVGGElement; c?: SVGCircleElement; t?: SVGTextElement }\n const nodes: SimNode[] = data.nodes.map((n, i) => {\n const ang = (i / data.nodes.length) * Math.PI * 2\n return { ...n, x: W / 2 + Math.cos(ang) * spread, y: H / 2 + Math.sin(ang) * spread, vx: 0, vy: 0, deg: 0, fixed: false, moved: false }\n })\n\n const byId: Record<string, SimNode> = {}\n nodes.forEach(n => { byId[n.id] = n })\n\n const edges = data.edges.filter(e => byId[e.source] && byId[e.target] && e.source !== e.target)\n edges.forEach(e => { byId[e.source].deg++; byId[e.target].deg++ })\n\n const radius = (n: SimNode) => 6 + Math.min(10, n.deg * 1.7)\n\n function tick() {\n for (let i = 0; i < nodes.length; i++) {\n const a = nodes[i]\n for (let j = i + 1; j < nodes.length; j++) {\n const b = nodes[j]\n const dx = a.x - b.x, dy = a.y - b.y\n const d2 = dx * dx + dy * dy || 0.01, d = Math.sqrt(d2)\n const f = 9000 / d2, fx = f * dx / d, fy = f * dy / d\n a.vx += fx; a.vy += fy; b.vx -= fx; b.vy -= fy\n }\n a.vx += (W / 2 - a.x) * 0.005\n a.vy += (H / 2 - a.y) * 0.005\n }\n for (const e of edges) {\n const a = byId[e.source], b = byId[e.target]\n const dx = b.x - a.x, dy = b.y - a.y\n const d = Math.sqrt(dx * dx + dy * dy) || 0.01\n const f = (d - 150) * 0.012, fx = f * dx / d, fy = f * dy / d\n a.vx += fx; a.vy += fy; b.vx -= fx; b.vy -= fy\n }\n for (const a of nodes) {\n if (a.fixed) { a.vx = 0; a.vy = 0; continue }\n a.vx *= 0.86; a.vy *= 0.86\n a.x += Math.max(-12, Math.min(12, a.vx))\n a.y += Math.max(-12, Math.min(12, a.vy))\n }\n }\n\n const view = document.createElementNS(NS, 'g')\n svg.appendChild(view)\n const gE = document.createElementNS(NS, 'g')\n const gN = document.createElementNS(NS, 'g')\n view.appendChild(gE); view.appendChild(gN)\n\n let tx = 0, ty = 0, sc = 1\n const applyView = () => view.setAttribute('transform', `translate(${tx},${ty}) scale(${sc})`)\n\n const edgeEls = edges.map(() => {\n const ln = document.createElementNS(NS, 'line')\n ln.setAttribute('stroke', 'rgba(130,175,230,0.10)')\n ln.setAttribute('stroke-width', '0.7')\n gE.appendChild(ln); return ln\n })\n\n nodes.forEach(n => {\n const g = document.createElementNS(NS, 'g')\n g.setAttribute('cursor', n.url ? 'pointer' : 'grab')\n const c = document.createElementNS(NS, 'circle')\n c.setAttribute('r', String(radius(n)))\n c.setAttribute('fill', n.type === 'WebPage' || n.type === 'Page' ? '#8ab4e8' : '#5291d7')\n c.setAttribute('stroke', '#0f1115'); c.setAttribute('stroke-width', '1.5')\n const t = document.createElementNS(NS, 'text')\n t.textContent = n.title.length > 26 ? n.title.slice(0, 24) + '…' : n.title\n t.setAttribute('fill', '#c9d4e0'); t.setAttribute('font-size', '11')\n t.setAttribute('text-anchor', 'middle'); t.setAttribute('pointer-events', 'none')\n t.setAttribute('opacity', showLabels ? '1' : '0')\n const ti = document.createElementNS(NS, 'title'); ti.textContent = n.title\n g.appendChild(c); g.appendChild(t); g.appendChild(ti)\n g.addEventListener('mouseenter', () => highlight(n))\n g.addEventListener('mouseleave', clearHi)\n if (n.url) {\n g.addEventListener('click', () => { if (n.moved) { n.moved = false; return } window.open(n.url, '_blank', 'noopener') })\n }\n gN.appendChild(g); n.g = g; n.c = c; n.t = t\n })\n\n function highlight(node: SimNode) {\n const on: Record<string, boolean> = { [node.id]: true }\n edges.forEach((e, i) => {\n const hit = e.source === node.id || e.target === node.id\n edgeEls[i].setAttribute('stroke', hit ? 'rgba(146,190,240,0.95)' : 'rgba(130,175,230,0.07)')\n if (hit) { on[e.source] = true; on[e.target] = true }\n })\n nodes.forEach(m => {\n m.g!.setAttribute('opacity', on[m.id] ? '1' : '0.22')\n m.t!.setAttribute('opacity', on[m.id] ? '1' : showLabels ? '1' : '0')\n })\n }\n\n function clearHi() {\n edgeEls.forEach(el => el.setAttribute('stroke', 'rgba(130,175,230,0.10)'))\n nodes.forEach(m => {\n m.g!.setAttribute('opacity', '1')\n if (!showLabels) m.t!.setAttribute('opacity', '0')\n })\n }\n\n function paint() {\n edges.forEach((e, i) => {\n const a = byId[e.source], b = byId[e.target]\n edgeEls[i].setAttribute('x1', String(a.x)); edgeEls[i].setAttribute('y1', String(a.y))\n edgeEls[i].setAttribute('x2', String(b.x)); edgeEls[i].setAttribute('y2', String(b.y))\n })\n nodes.forEach(n => {\n n.c!.setAttribute('cx', String(n.x)); n.c!.setAttribute('cy', String(n.y))\n n.t!.setAttribute('x', String(n.x)); n.t!.setAttribute('y', String(n.y - radius(n) - 5))\n })\n }\n\n function pt(el: SVGGraphicsElement, ev: MouseEvent) {\n const m = el.getScreenCTM(); if (!m) return { x: ev.clientX, y: ev.clientY }\n const inv = m.inverse()\n return { x: inv.a * ev.clientX + inv.c * ev.clientY + inv.e, y: inv.b * ev.clientX + inv.d * ev.clientY + inv.f }\n }\n\n const state: { drag: SimNode | null; pan: { x: number; y: number; tx: number; ty: number } | null } = { drag: null, pan: null }\n\n svg.addEventListener('mousedown', ev => {\n const p = pt(view as SVGGraphicsElement, ev)\n let best = 900\n let hit: SimNode | null = null\n nodes.forEach(n => { const dx = n.x - p.x, dy = n.y - p.y, dd = dx * dx + dy * dy; if (dd < best) { best = dd; hit = n } })\n if (hit !== null) { state.drag = hit; (state.drag as SimNode).fixed = true; (state.drag as SimNode).moved = false }\n else { const r = pt(svg as SVGGraphicsElement, ev); state.pan = { x: r.x, y: r.y, tx, ty }; svg.style.cursor = 'grabbing' }\n })\n const onMouseMove = (ev: MouseEvent) => {\n if (state.drag !== null) { const p = pt(view as SVGGraphicsElement, ev); state.drag.x = p.x; state.drag.y = p.y; state.drag.moved = true; tick(); state.drag.x = p.x; state.drag.y = p.y; paint() }\n else if (state.pan !== null) { const r = pt(svg as SVGGraphicsElement, ev); tx = state.pan.tx + (r.x - state.pan.x); ty = state.pan.ty + (r.y - state.pan.y); applyView() }\n }\n const onMouseUp = () => {\n if (state.drag !== null) {\n state.drag.fixed = false; state.drag = null\n let f = 0;(function r() { tick(); paint(); if (f++ < 60) requestAnimationFrame(r) })()\n }\n if (state.pan !== null) { state.pan = null; svg.style.cursor = '' }\n }\n window.addEventListener('mousemove', onMouseMove)\n window.addEventListener('mouseup', onMouseUp)\n svg.addEventListener('wheel', ev => {\n ev.preventDefault()\n const r = pt(svg as SVGGraphicsElement, ev), lx = (r.x - tx) / sc, ly = (r.y - ty) / sc\n sc = Math.max(0.15, Math.min(4, sc * (ev.deltaY < 0 ? 1.12 : 1 / 1.12)))\n tx = r.x - lx * sc; ty = r.y - ly * sc; applyView()\n }, { passive: false })\n\n function fitView() {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity\n nodes.forEach(n => {\n const r = radius(n) + 24\n if (n.x - r < minX) minX = n.x - r; if (n.y - r < minY) minY = n.y - r\n if (n.x + r > maxX) maxX = n.x + r; if (n.y + r > maxY) maxY = n.y + r\n })\n const bw = Math.max(1, maxX - minX), bh = Math.max(1, maxY - minY), pad = 30\n sc = Math.max(0.15, Math.min(2, Math.min((W - pad * 2) / bw, (H - pad * 2) / bh)))\n tx = (W - bw * sc) / 2 - minX * sc; ty = (H - bh * sc) / 2 - minY * sc; applyView()\n }\n\n for (let k = 0; k < 500; k++) tick()\n paint(); fitView()\n\n return () => {\n window.removeEventListener('mousemove', onMouseMove)\n window.removeEventListener('mouseup', onMouseUp)\n }\n }, [data])\n\n return (\n <svg\n ref={svgRef}\n style={{ width: '100%', height: '72vh', minHeight: 560, display: 'block', background: '#0f1115', borderRadius: 8, cursor: 'grab', touchAction: 'none' }}\n role=\"img\"\n aria-label=\"Knowledge graph of your content\"\n />\n )\n}\n\nexport function OkfPage() {\n const [state, setState] = useState<{ data: OkfData | null; loading: boolean; error: string | null }>({ data: null, loading: true, error: null })\n\n useEffect(() => {\n fetch('/api/third-audience/okf-graph')\n .then(r => r.ok ? r.json() : r.json().then((e: { error?: string }) => Promise.reject(e.error ?? 'Failed')))\n .then((data: OkfData) => setState({ data, loading: false, error: null }))\n .catch((e: unknown) => setState({ data: null, loading: false, error: String(e) }))\n }, [])\n\n if (state.loading) return <div style={{ padding: 48, color: 'var(--ta-gray-500)', textAlign: 'center' }}>Loading knowledge graph…</div>\n if (state.error) return <div style={{ padding: 48, color: 'var(--ta-red)', textAlign: 'center' }}>{state.error}</div>\n if (!state.data) return null\n\n const { data } = state\n\n return (\n <div>\n <h1 className=\"ta-page-title\">OKF Bundle</h1>\n <p className=\"ta-page-subtitle\">Open Knowledge Format — your content as clean Markdown for AI crawlers</p>\n\n <div className=\"ta-hero-grid\">\n <HeroCard\n label=\"Total Pages\"\n value={data.stats.pages}\n meta=\"in content directory\"\n color=\"blue\"\n icon={<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/></svg>}\n />\n <HeroCard\n label=\"Graph Nodes\"\n value={data.stats.nodes}\n meta=\"top connected pages\"\n color=\"teal\"\n icon={<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}><circle cx=\"12\" cy=\"12\" r=\"3\"/><circle cx=\"3\" cy=\"6\" r=\"2\"/><circle cx=\"21\" cy=\"6\" r=\"2\"/><circle cx=\"3\" cy=\"18\" r=\"2\"/><circle cx=\"21\" cy=\"18\" r=\"2\"/><line x1=\"5\" y1=\"6\" x2=\"10\" y2=\"11\"/><line x1=\"19\" y1=\"6\" x2=\"14\" y2=\"11\"/><line x1=\"5\" y1=\"18\" x2=\"10\" y2=\"13\"/><line x1=\"19\" y1=\"18\" x2=\"14\" y2=\"13\"/></svg>}\n />\n <HeroCard\n label=\"Internal Links\"\n value={data.stats.edges}\n meta=\"edges in graph\"\n color=\"green\"\n icon={<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/></svg>}\n />\n <HeroCard\n label=\"Bundle Index\"\n value=\"View\"\n meta={data.indexUrl.replace(/^https?:\\/\\/[^/]+/, '')}\n color=\"orange\"\n icon={<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/><polyline points=\"15 3 21 3 21 9\"/><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/></svg>}\n />\n </div>\n\n <div style={{ marginBottom: 24 }}>\n <Card title=\"Knowledge Graph\">\n <p style={{ fontSize: 13, color: 'var(--ta-gray-500)', marginBottom: 16 }}>\n Drag nodes · scroll to zoom · drag background to pan · click a node to open the page\n {data.graph.nodes.length > 40 && ' · hover a node to reveal its labels'}\n </p>\n <OkfGraph data={data.graph} />\n </Card>\n </div>\n\n <div className=\"ta-grid-2\">\n <Card title=\"Bundle URLs\">\n <table className=\"ta-table\">\n <thead><tr><th>Resource</th><th>URL</th></tr></thead>\n <tbody>\n <tr>\n <td>Index</td>\n <td><a href=\"/okf\" target=\"_blank\" rel=\"noreferrer\" style={{ fontFamily: 'var(--ta-font-mono)', fontSize: 12 }}>/okf</a></td>\n </tr>\n <tr>\n <td>AI Sitemap</td>\n <td><a href=\"/sitemap-ai.xml\" target=\"_blank\" rel=\"noreferrer\" style={{ fontFamily: 'var(--ta-font-mono)', fontSize: 12 }}>/sitemap-ai.xml</a></td>\n </tr>\n <tr>\n <td>LLMs.txt</td>\n <td><a href=\"/llms.txt\" target=\"_blank\" rel=\"noreferrer\" style={{ fontFamily: 'var(--ta-font-mono)', fontSize: 12 }}>/llms.txt</a></td>\n </tr>\n </tbody>\n </table>\n </Card>\n <Card title=\"How AI Crawlers Use OKF\">\n <div style={{ fontSize: 13, color: 'var(--ta-gray-600)', lineHeight: 1.7 }}>\n <p style={{ marginBottom: 10 }}>Each page on your site is available as clean Markdown at <code style={{ fontFamily: 'var(--ta-font-mono)', background: 'var(--ta-gray-100)', padding: '1px 5px', borderRadius: 4 }}>/okf/slug.md</code></p>\n <p style={{ marginBottom: 10 }}>Internal links are rewritten to point to sibling <code style={{ fontFamily: 'var(--ta-font-mono)', background: 'var(--ta-gray-100)', padding: '1px 5px', borderRadius: 4 }}>.md</code> files so crawlers can follow the full knowledge graph.</p>\n <p>The index at <code style={{ fontFamily: 'var(--ta-font-mono)', background: 'var(--ta-gray-100)', padding: '1px 5px', borderRadius: 4 }}>/okf</code> lists every page with title and description — a complete sitemap in natural language.</p>\n </div>\n </Card>\n </div>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\n\ninterface CardProps {\n title: string\n action?: ReactNode\n children: ReactNode\n}\n\nexport function Card({ title, action, children }: CardProps) {\n return (\n <div className=\"ta-card ta-section\">\n <div className=\"ta-card-header\">\n <h2>{title}</h2>\n {action}\n </div>\n <div className=\"ta-card-body\">{children}</div>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\n\ninterface HeroCardProps {\n label: string\n value: string | number\n meta?: string\n color?: 'blue' | 'green' | 'orange' | 'teal'\n icon: ReactNode\n}\n\nexport function HeroCard({ label, value, meta, color = 'blue', icon }: HeroCardProps) {\n return (\n <div className={`ta-hero-card ta-hero-card--${color}`}>\n <div className=\"ta-hero-icon\">{icon}</div>\n <div>\n <div className=\"ta-hero-label\">{label}</div>\n <div className=\"ta-hero-value\">{value}</div>\n {meta && <div className=\"ta-hero-meta\">{meta}</div>}\n </div>\n </div>\n )\n}\n"],"mappings":"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","names":["import_jsx_runtime","import_jsx_runtime","data"]}
|