@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/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 = "platform" | "work" | "foundation";
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: "platform", label: "Platform", href: "/" },
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
- /** Old-domain suffix shown after the wordmark as the room nameplate */
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
- platform: {
35
- nameplate: null,
36
- links: [{ label: "Docs ↗", href: "https://docs.rizom.ai", external: true }],
37
- cta: { label: "Get Started", href: "#hero" },
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 "platform";
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
- // An org index is cross-room, so no room face is current there.
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({ face }: { face: FaceKey }): JSX.Element {
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({ face }: { face: FaceKey }): JSX.Element {
152
- const chrome = FACE_CHROME[face];
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 face={face} />
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 platform",
235
+ heading: "The brain",
203
236
  links: [
204
- { label: "Get started", href: "/#quickstart" },
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
- { id: "hero", template: "home:hero" },
18
- { id: "growth", template: "home:growth" },
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: "your-data", template: "home:your-data" },
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, ./work, ./foundation).
17
- sections: [homeSections, workSections, foundationSections],
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