@rizom/site-rizom-ai 0.2.0-alpha.166 → 0.2.0-alpha.167
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -4
- package/src/brain-screens.tsx +465 -0
- package/src/brain.tsx +418 -0
- package/src/home.tsx +17 -192
- package/src/layout.tsx +52 -18
- package/src/routes.ts +32 -4
- package/src/shared.tsx +56 -0
- package/src/site.ts +4 -2
package/src/layout.tsx
CHANGED
|
@@ -9,7 +9,7 @@ import { RizomFrame, type RizomLayoutProps } from "@rizom/site-rizom";
|
|
|
9
9
|
* the route path; each face keeps its live links and old-domain nameplate.
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
type FaceKey = "
|
|
12
|
+
type FaceKey = "brain" | "work" | "foundation";
|
|
13
13
|
|
|
14
14
|
interface FaceLink {
|
|
15
15
|
label: string;
|
|
@@ -17,24 +17,33 @@ interface FaceLink {
|
|
|
17
17
|
external?: boolean;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
+
// The three faces of the practice. Home ("/") is the umbrella above them —
|
|
21
|
+
// it claims no face in the strip and wears the plain wordmark.
|
|
20
22
|
const FACES: { key: FaceKey; label: string; href: string }[] = [
|
|
21
|
-
{ key: "
|
|
23
|
+
{ key: "brain", label: "Brain", href: "/brain" },
|
|
22
24
|
{ key: "work", label: "Work", href: "/work" },
|
|
23
25
|
{ key: "foundation", label: "Foundation", href: "/foundation" },
|
|
24
26
|
];
|
|
25
27
|
|
|
26
28
|
interface FaceChrome {
|
|
27
|
-
/**
|
|
29
|
+
/** Suffix shown after the wordmark as the room nameplate */
|
|
28
30
|
nameplate: string | null;
|
|
29
31
|
links: FaceLink[];
|
|
30
32
|
cta: FaceLink;
|
|
31
33
|
}
|
|
32
34
|
|
|
33
35
|
const FACE_CHROME: Record<FaceKey, FaceChrome> = {
|
|
34
|
-
|
|
35
|
-
nameplate:
|
|
36
|
-
links: [
|
|
37
|
-
|
|
36
|
+
brain: {
|
|
37
|
+
nameplate: "brain",
|
|
38
|
+
links: [
|
|
39
|
+
{ label: "Docs ↗", href: "https://docs.rizom.ai", external: true },
|
|
40
|
+
{
|
|
41
|
+
label: "GitHub ↗",
|
|
42
|
+
href: "https://github.com/rizom-ai",
|
|
43
|
+
external: true,
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
cta: { label: "Get Started", href: "/brain#quickstart" },
|
|
38
47
|
},
|
|
39
48
|
work: {
|
|
40
49
|
nameplate: "work",
|
|
@@ -58,12 +67,30 @@ const FACE_CHROME: Record<FaceKey, FaceChrome> = {
|
|
|
58
67
|
},
|
|
59
68
|
};
|
|
60
69
|
|
|
70
|
+
// The umbrella page's own chrome: the plain wordmark, links into the room and
|
|
71
|
+
// docs, and a get-started CTA that points at the product room.
|
|
72
|
+
const HOME_CHROME: FaceChrome = {
|
|
73
|
+
nameplate: null,
|
|
74
|
+
links: [
|
|
75
|
+
{ label: "Brain", href: "/brain" },
|
|
76
|
+
{ label: "Docs ↗", href: "https://docs.rizom.ai", external: true },
|
|
77
|
+
],
|
|
78
|
+
cta: { label: "Get Started", href: "/brain" },
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
function isHome(path: string): boolean {
|
|
82
|
+
return path === "/";
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// The active face drives the room accent (data-room). Home and /brain both
|
|
86
|
+
// wear brass — home because it is the umbrella, /brain because brass is the
|
|
87
|
+
// product face — so both resolve to "brain" (the theme's default accent).
|
|
61
88
|
function activeFace(path: string): FaceKey {
|
|
62
89
|
if (path === "/work" || path.startsWith("/work/")) return "work";
|
|
63
90
|
if (path === "/foundation" || path.startsWith("/foundation/")) {
|
|
64
91
|
return "foundation";
|
|
65
92
|
}
|
|
66
|
-
return "
|
|
93
|
+
return "brain";
|
|
67
94
|
}
|
|
68
95
|
|
|
69
96
|
// The org-level indexes: cross-room aggregations (everything published,
|
|
@@ -84,12 +111,13 @@ function orgIndexActive(path: string): string | null {
|
|
|
84
111
|
function FacesStrip({ path }: { path: string }): JSX.Element {
|
|
85
112
|
const face = activeFace(path);
|
|
86
113
|
const activeIndex = orgIndexActive(path);
|
|
114
|
+
const home = isHome(path);
|
|
87
115
|
return (
|
|
88
116
|
<div className="relative z-[2] flex items-baseline gap-6 border-b border-theme-light px-6 py-3 font-label text-label-xs uppercase tracking-[0.14em] md:px-10 xl:px-20">
|
|
89
117
|
<span className="text-theme-muted">rizom</span>
|
|
90
118
|
{FACES.map((item) =>
|
|
91
|
-
//
|
|
92
|
-
item.key === face && !activeIndex ? (
|
|
119
|
+
// No face is current on the umbrella home, nor on a cross-room index.
|
|
120
|
+
item.key === face && !activeIndex && !home ? (
|
|
93
121
|
<a
|
|
94
122
|
key={item.key}
|
|
95
123
|
href={item.href}
|
|
@@ -129,8 +157,7 @@ function FacesStrip({ path }: { path: string }): JSX.Element {
|
|
|
129
157
|
);
|
|
130
158
|
}
|
|
131
159
|
|
|
132
|
-
function Wordmark({
|
|
133
|
-
const nameplate = FACE_CHROME[face].nameplate;
|
|
160
|
+
function Wordmark({ nameplate }: { nameplate: string | null }): JSX.Element {
|
|
134
161
|
return (
|
|
135
162
|
<a
|
|
136
163
|
href="/"
|
|
@@ -148,8 +175,14 @@ function Wordmark({ face }: { face: FaceKey }): JSX.Element {
|
|
|
148
175
|
);
|
|
149
176
|
}
|
|
150
177
|
|
|
151
|
-
function FaceNav({
|
|
152
|
-
|
|
178
|
+
function FaceNav({
|
|
179
|
+
face,
|
|
180
|
+
home,
|
|
181
|
+
}: {
|
|
182
|
+
face: FaceKey;
|
|
183
|
+
home: boolean;
|
|
184
|
+
}): JSX.Element {
|
|
185
|
+
const chrome = home ? HOME_CHROME : FACE_CHROME[face];
|
|
153
186
|
// Deliberately NOT merged with siteInfo.navigation: entity plugins
|
|
154
187
|
// register slot-based nav entries for every list route (topics,
|
|
155
188
|
// posts, …), which floods the bar. Each room owns its own links.
|
|
@@ -157,7 +190,7 @@ function FaceNav({ face }: { face: FaceKey }): JSX.Element {
|
|
|
157
190
|
|
|
158
191
|
return (
|
|
159
192
|
<nav className="relative z-[2] flex items-baseline gap-8 px-6 py-5 md:px-10 xl:px-20">
|
|
160
|
-
<Wordmark
|
|
193
|
+
<Wordmark nameplate={chrome.nameplate} />
|
|
161
194
|
<div className="hidden items-baseline gap-7 md:flex">
|
|
162
195
|
{links.map((link) => (
|
|
163
196
|
<a
|
|
@@ -199,9 +232,9 @@ interface FooterColumn {
|
|
|
199
232
|
Shown on every face; the signature comes from the site-info entity. */
|
|
200
233
|
const FOOTER_COLUMNS: FooterColumn[] = [
|
|
201
234
|
{
|
|
202
|
-
heading: "The
|
|
235
|
+
heading: "The brain",
|
|
203
236
|
links: [
|
|
204
|
-
{ label: "Get started", href: "
|
|
237
|
+
{ label: "Get started", href: "/brain#quickstart" },
|
|
205
238
|
{ label: "Documentation ↗", href: "https://docs.rizom.ai" },
|
|
206
239
|
{ label: "GitHub ↗", href: "https://github.com/rizom-ai" },
|
|
207
240
|
{ label: "Network", href: "/network" },
|
|
@@ -324,6 +357,7 @@ function RizomAiChrome({
|
|
|
324
357
|
children: ComponentChildren;
|
|
325
358
|
}): JSX.Element {
|
|
326
359
|
const face = activeFace(path);
|
|
360
|
+
const home = isHome(path);
|
|
327
361
|
return (
|
|
328
362
|
<RizomFrame canvas={false}>
|
|
329
363
|
{/* xl:pl matches the mockup's 148px left rail (68 + the 80px
|
|
@@ -332,7 +366,7 @@ function RizomAiChrome({
|
|
|
332
366
|
<MyceliumRail />
|
|
333
367
|
<header className="sticky top-0 z-[100] border-b border-theme-light bg-nav-fade backdrop-blur-[12px]">
|
|
334
368
|
<FacesStrip path={path} />
|
|
335
|
-
<FaceNav face={face} />
|
|
369
|
+
<FaceNav face={face} home={home} />
|
|
336
370
|
</header>
|
|
337
371
|
<main>{children}</main>
|
|
338
372
|
<SiteFooter siteInfo={siteInfo} />
|
package/src/routes.ts
CHANGED
|
@@ -14,16 +14,44 @@ export const aiRoutes: RouteDefinitionInput[] = [
|
|
|
14
14
|
layout: "default",
|
|
15
15
|
navigation: { show: false },
|
|
16
16
|
sections: [
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
// The hero is the live agent proximity map, rendered from this brain's
|
|
18
|
+
// own registry. dataQuery routes it through the datasource (live map
|
|
19
|
+
// data); its hero copy is authored at site-content/home/network.md and
|
|
20
|
+
// merged over via the content overlay. Then the story the map opens: the
|
|
21
|
+
// dark it fights, how the network grows, the mission, the faces.
|
|
22
|
+
{
|
|
23
|
+
id: "network",
|
|
24
|
+
template: "agent-discovery:proximity-map",
|
|
25
|
+
dataQuery: {},
|
|
26
|
+
},
|
|
19
27
|
{ id: "problem", template: "home:problem" },
|
|
20
|
-
{ id: "
|
|
21
|
-
{ id: "quickstart", template: "home:quickstart" },
|
|
28
|
+
{ id: "growth", template: "home:growth" },
|
|
22
29
|
{ id: "mission", template: "home:mission" },
|
|
23
30
|
{ id: "faces", template: "home:faces" },
|
|
24
31
|
{ id: "alive", template: "home:alive" },
|
|
25
32
|
],
|
|
26
33
|
},
|
|
34
|
+
{
|
|
35
|
+
// The product's own room: the brain's life with its owner in four
|
|
36
|
+
// chapters — capture, ask, see it run, connect — each illustrated by a
|
|
37
|
+
// real interface screen, then the data principles and the quickstart.
|
|
38
|
+
id: "brain",
|
|
39
|
+
path: "/brain",
|
|
40
|
+
title: "Rizom Brain",
|
|
41
|
+
description: "Build the agent that represents you",
|
|
42
|
+
layout: "default",
|
|
43
|
+
navigation: { show: false },
|
|
44
|
+
sections: [
|
|
45
|
+
{ id: "hero", template: "brain:hero" },
|
|
46
|
+
{ id: "capture", template: "brain:capture" },
|
|
47
|
+
{ id: "ask", template: "brain:ask" },
|
|
48
|
+
{ id: "run", template: "brain:run" },
|
|
49
|
+
{ id: "connect", template: "brain:connect" },
|
|
50
|
+
{ id: "your-data", template: "brain:your-data" },
|
|
51
|
+
{ id: "quickstart", template: "brain:quickstart" },
|
|
52
|
+
{ id: "close", template: "brain:close" },
|
|
53
|
+
],
|
|
54
|
+
},
|
|
27
55
|
{
|
|
28
56
|
// Everything published, in one index — essays (post) + talks (deck),
|
|
29
57
|
// rendered by the blog and decks plugins' own list templates. This custom
|
package/src/shared.tsx
CHANGED
|
@@ -195,3 +195,59 @@ const DELAY_CLASSES = ["", "reveal-delay-1", "reveal-delay-2"];
|
|
|
195
195
|
export function delayClass(index: number): string {
|
|
196
196
|
return DELAY_CLASSES[index % DELAY_CLASSES.length] ?? "";
|
|
197
197
|
}
|
|
198
|
+
|
|
199
|
+
/* The three-up marker/title/text grid shared by two rooms: home's "why it
|
|
200
|
+
has to exist" problem trio (large display numerals) and /brain's "your
|
|
201
|
+
data, your rules" principles (mono markers). One schema, one component,
|
|
202
|
+
the marker style toggled by `mono`. */
|
|
203
|
+
export const trioItemSchema: z.ZodObject<{
|
|
204
|
+
marker: z.ZodString;
|
|
205
|
+
title: z.ZodString;
|
|
206
|
+
text: z.ZodString;
|
|
207
|
+
}> = z.object({
|
|
208
|
+
marker: z.string(),
|
|
209
|
+
title: z.string(),
|
|
210
|
+
text: z.string(),
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
export const trioSchema: z.ZodObject<{
|
|
214
|
+
cap: z.ZodString;
|
|
215
|
+
items: z.ZodArray<typeof trioItemSchema>;
|
|
216
|
+
}> = z.object({
|
|
217
|
+
cap: z.string(),
|
|
218
|
+
items: z.array(trioItemSchema),
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
export type TrioItem = z.infer<typeof trioItemSchema>;
|
|
222
|
+
|
|
223
|
+
export function Trio({
|
|
224
|
+
items,
|
|
225
|
+
mono,
|
|
226
|
+
}: {
|
|
227
|
+
items: TrioItem[];
|
|
228
|
+
mono: boolean;
|
|
229
|
+
}): JSX.Element {
|
|
230
|
+
return (
|
|
231
|
+
<div className="mt-[30px] grid max-w-[1040px] gap-11 md:grid-cols-3">
|
|
232
|
+
{items.map((item, i) => (
|
|
233
|
+
<div key={item.title} className={`reveal ${delayClass(i)}`}>
|
|
234
|
+
{mono ? (
|
|
235
|
+
<span className="inline-block pt-3 pb-[15px] font-label text-[14px] font-medium tracking-[0.1em] text-accent">
|
|
236
|
+
{item.marker}
|
|
237
|
+
</span>
|
|
238
|
+
) : (
|
|
239
|
+
<span className="block font-display text-[44px] font-light leading-none text-theme-light [font-variation-settings:'SOFT'_30,'opsz'_100]">
|
|
240
|
+
{item.marker}
|
|
241
|
+
</span>
|
|
242
|
+
)}
|
|
243
|
+
<b className="mt-2.5 block font-display text-[21px] font-[520] tracking-[-0.006em] text-theme [font-variation-settings:'SOFT'_55]">
|
|
244
|
+
{item.title}
|
|
245
|
+
</b>
|
|
246
|
+
<p className="mt-2 font-body text-[15.5px] text-theme-light">
|
|
247
|
+
{item.text}
|
|
248
|
+
</p>
|
|
249
|
+
</div>
|
|
250
|
+
))}
|
|
251
|
+
</div>
|
|
252
|
+
);
|
|
253
|
+
}
|
package/src/site.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { SiteDefinition } from "@rizom/site";
|
|
|
2
2
|
import { createRizomSite } from "@rizom/site-rizom";
|
|
3
3
|
import { AiLayout } from "./layout";
|
|
4
4
|
import { homeSections } from "./home";
|
|
5
|
+
import { brainSections } from "./brain";
|
|
5
6
|
import { workSections } from "./work";
|
|
6
7
|
import { foundationSections } from "./foundation";
|
|
7
8
|
import { aiRoutes } from "./routes";
|
|
@@ -13,8 +14,9 @@ export const rizomAiSite: SiteDefinition = createRizomSite({
|
|
|
13
14
|
// room accents key off data-room, set by the layout.
|
|
14
15
|
layout: AiLayout,
|
|
15
16
|
routes: aiRoutes,
|
|
16
|
-
// Every page is authored schema-first (see ./home, ./
|
|
17
|
-
|
|
17
|
+
// Every page is authored schema-first (see ./home, ./brain, ./work,
|
|
18
|
+
// ./foundation).
|
|
19
|
+
sections: [homeSections, brainSections, workSections, foundationSections],
|
|
18
20
|
// The org-level indexes (/writing, /network) are hand-written routes that
|
|
19
21
|
// compose the plugins' own list templates; entityDisplay just supplies the
|
|
20
22
|
// labels + detail-page paths. Navigation is hidden — the layout's faces
|