@rizom/site-rizom-ai 0.2.0-alpha.195 → 0.2.0-alpha.197
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/growth-diagram.tsx +3 -29
- package/src/home.tsx +71 -29
- package/src/routes.ts +4 -4
- package/src/shared.tsx +22 -8
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rizom/site-rizom-ai",
|
|
3
|
-
"version": "0.2.0-alpha.
|
|
3
|
+
"version": "0.2.0-alpha.197",
|
|
4
4
|
"description": "Rizom AI site package for hosted Rover deployments",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
"prepack": "publish-manifest prepare"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@rizom/site": "0.2.0-alpha.
|
|
22
|
-
"@rizom/site-rizom": "0.2.0-alpha.
|
|
23
|
-
"@rizom/site-sections": "0.2.0-alpha.
|
|
21
|
+
"@rizom/site": "0.2.0-alpha.197",
|
|
22
|
+
"@rizom/site-rizom": "0.2.0-alpha.197",
|
|
23
|
+
"@rizom/site-sections": "0.2.0-alpha.197",
|
|
24
24
|
"preact": "^10.27.2"
|
|
25
25
|
},
|
|
26
26
|
"publishConfig": {
|
package/src/growth-diagram.tsx
CHANGED
|
@@ -10,7 +10,7 @@ export function GrowthDiagram(): JSX.Element {
|
|
|
10
10
|
return (
|
|
11
11
|
<div className="growth reveal reveal-delay-1 mt-5">
|
|
12
12
|
<svg
|
|
13
|
-
viewBox="0 0 980
|
|
13
|
+
viewBox="0 0 980 274"
|
|
14
14
|
role="img"
|
|
15
15
|
aria-label="One brain growing into a team, then a network"
|
|
16
16
|
>
|
|
@@ -233,7 +233,8 @@ export function GrowthDiagram(): JSX.Element {
|
|
|
233
233
|
d="M941,141 C958,141 972,140 995,139"
|
|
234
234
|
/>
|
|
235
235
|
|
|
236
|
-
{/* labels along a common baseline
|
|
236
|
+
{/* labels along a common baseline — the stage columns beneath the
|
|
237
|
+
diagram carry the words, so the sub-labels are gone (rev 10) */}
|
|
237
238
|
<line className="tick" x1="110" y1="238" x2="110" y2="248" />
|
|
238
239
|
<text
|
|
239
240
|
className="gt-you"
|
|
@@ -244,15 +245,6 @@ export function GrowthDiagram(): JSX.Element {
|
|
|
244
245
|
>
|
|
245
246
|
You
|
|
246
247
|
</text>
|
|
247
|
-
<text
|
|
248
|
-
className="gt-sub"
|
|
249
|
-
x="110"
|
|
250
|
-
y="281"
|
|
251
|
-
text-anchor="middle"
|
|
252
|
-
style="--d:.5s"
|
|
253
|
-
>
|
|
254
|
-
personal brain · available now
|
|
255
|
-
</text>
|
|
256
248
|
<line className="tick" x1="452" y1="238" x2="452" y2="248" />
|
|
257
249
|
<text
|
|
258
250
|
className="gt-team"
|
|
@@ -263,15 +255,6 @@ export function GrowthDiagram(): JSX.Element {
|
|
|
263
255
|
>
|
|
264
256
|
Team
|
|
265
257
|
</text>
|
|
266
|
-
<text
|
|
267
|
-
className="gt-sub"
|
|
268
|
-
x="452"
|
|
269
|
-
y="281"
|
|
270
|
-
text-anchor="middle"
|
|
271
|
-
style="--d:1.1s"
|
|
272
|
-
>
|
|
273
|
-
shared intelligence · the team bundle
|
|
274
|
-
</text>
|
|
275
258
|
<line className="tick" x1="795" y1="238" x2="795" y2="248" />
|
|
276
259
|
<text
|
|
277
260
|
className="gt-net"
|
|
@@ -282,15 +265,6 @@ export function GrowthDiagram(): JSX.Element {
|
|
|
282
265
|
>
|
|
283
266
|
Network
|
|
284
267
|
</text>
|
|
285
|
-
<text
|
|
286
|
-
className="gt-sub"
|
|
287
|
-
x="795"
|
|
288
|
-
y="281"
|
|
289
|
-
text-anchor="middle"
|
|
290
|
-
style="--d:1.8s"
|
|
291
|
-
>
|
|
292
|
-
distributed expertise · emerging
|
|
293
|
-
</text>
|
|
294
268
|
</svg>
|
|
295
269
|
</div>
|
|
296
270
|
);
|
package/src/home.tsx
CHANGED
|
@@ -19,35 +19,60 @@ import {
|
|
|
19
19
|
/**
|
|
20
20
|
* The umbrella home page. The hero is the live agent proximity map (wired in
|
|
21
21
|
* routes.ts as agent-discovery:proximity-map); the sections here tell the
|
|
22
|
-
* story the map opens — the
|
|
23
|
-
*
|
|
24
|
-
* band
|
|
22
|
+
* rev-10 story the map opens — the pain (problem, withered), how the parts
|
|
23
|
+
* come together (growth carries the system: brain, practice, network), the
|
|
24
|
+
* mission band (the quote alone), the single ask (one-light), the three
|
|
25
|
+
* faces, and the living-proof colophon.
|
|
25
26
|
* Each section is authored from one zod schema (its component's props are
|
|
26
27
|
* `z.infer` of that schema); copy is content-driven, stored as markdown in
|
|
27
28
|
* site-content/home/<section>.md. Only the assembled section group is
|
|
28
29
|
* exported — the schemas and components are module-local.
|
|
29
30
|
*/
|
|
30
31
|
|
|
31
|
-
/* ============ growth diagram ============ */
|
|
32
|
+
/* ============ growth diagram + the three stages ============ */
|
|
33
|
+
|
|
34
|
+
const growthStageSchema = z.object({
|
|
35
|
+
title: z.string(),
|
|
36
|
+
text: z.string(),
|
|
37
|
+
});
|
|
32
38
|
|
|
33
39
|
const growthSchema = z.object({
|
|
34
40
|
cap: z.string(),
|
|
35
|
-
capNote: z.string(),
|
|
36
|
-
|
|
41
|
+
capNote: z.string().optional(),
|
|
42
|
+
stages: z.array(growthStageSchema),
|
|
37
43
|
});
|
|
38
44
|
|
|
45
|
+
/* Stage columns are keyed to the diagram's zone colors by position:
|
|
46
|
+
You (brass, the brain) → Team (ruby, the practice) → Network (moss). */
|
|
47
|
+
const STAGE_TITLE_COLOR = [
|
|
48
|
+
"text-[color:var(--palette-brass)]",
|
|
49
|
+
"text-[color:var(--palette-ruby-soft)]",
|
|
50
|
+
"text-[color:var(--palette-moss)]",
|
|
51
|
+
];
|
|
52
|
+
|
|
39
53
|
function HomeGrowthSection({
|
|
40
54
|
cap,
|
|
41
55
|
capNote,
|
|
42
|
-
|
|
56
|
+
stages,
|
|
43
57
|
}: z.infer<typeof growthSchema>): JSX.Element {
|
|
44
58
|
return (
|
|
45
59
|
<Section id="growth" className="py-14">
|
|
46
60
|
<SectCap lead={cap} trail={capNote} />
|
|
47
61
|
<GrowthDiagram />
|
|
48
|
-
<
|
|
49
|
-
{
|
|
50
|
-
|
|
62
|
+
<div className="reveal reveal-delay-2 mt-6 grid max-w-[1040px] gap-x-11 gap-y-6 md:grid-cols-3">
|
|
63
|
+
{stages.map((stage, i) => (
|
|
64
|
+
<div key={stage.title}>
|
|
65
|
+
<b
|
|
66
|
+
className={`block font-label text-label-xs font-semibold uppercase tracking-[0.18em] ${STAGE_TITLE_COLOR[i] ?? ""}`}
|
|
67
|
+
>
|
|
68
|
+
{stage.title}
|
|
69
|
+
</b>
|
|
70
|
+
<p className="mt-2 font-body text-[15px] text-theme-light">
|
|
71
|
+
{stage.text}
|
|
72
|
+
</p>
|
|
73
|
+
</div>
|
|
74
|
+
))}
|
|
75
|
+
</div>
|
|
51
76
|
</Section>
|
|
52
77
|
);
|
|
53
78
|
}
|
|
@@ -61,8 +86,9 @@ function HomeProblemSection({
|
|
|
61
86
|
}: z.infer<typeof trioSchema>): JSX.Element {
|
|
62
87
|
return (
|
|
63
88
|
<Section id="problem" className="py-14">
|
|
64
|
-
|
|
65
|
-
<
|
|
89
|
+
{/* The one section with no warmth: cold cap, hollow numerals. */}
|
|
90
|
+
<SectCap lead={cap} trail={capNote} tone="cold" />
|
|
91
|
+
<Trio items={items} mono={false} withered />
|
|
66
92
|
</Section>
|
|
67
93
|
);
|
|
68
94
|
}
|
|
@@ -71,9 +97,10 @@ function HomeProblemSection({
|
|
|
71
97
|
|
|
72
98
|
const oneLightSchema = z.object({
|
|
73
99
|
cap: z.string(),
|
|
74
|
-
capNote: z.string(),
|
|
100
|
+
capNote: z.string().optional(),
|
|
75
101
|
headline: z.string(),
|
|
76
102
|
intro: z.string(),
|
|
103
|
+
pull: z.string().optional(),
|
|
77
104
|
primaryCta: ctaSchema,
|
|
78
105
|
secondaryCta: ctaSchema,
|
|
79
106
|
});
|
|
@@ -83,6 +110,7 @@ function HomeOneLightSection({
|
|
|
83
110
|
capNote,
|
|
84
111
|
headline,
|
|
85
112
|
intro,
|
|
113
|
+
pull,
|
|
86
114
|
primaryCta,
|
|
87
115
|
secondaryCta,
|
|
88
116
|
}: z.infer<typeof oneLightSchema>): JSX.Element {
|
|
@@ -92,9 +120,14 @@ function HomeOneLightSection({
|
|
|
92
120
|
<h2 className="reveal reveal-delay-1 mt-3.5 max-w-[20em] font-display text-[clamp(28px,3vw,40px)] font-[465] leading-[1.1] tracking-[-0.014em] text-theme [font-variation-settings:'SOFT'_78,'opsz'_84]">
|
|
93
121
|
{renderHighlightedText(headline, ROOM_HIGHLIGHT_CLS)}
|
|
94
122
|
</h2>
|
|
95
|
-
<p className="reveal reveal-delay-
|
|
123
|
+
<p className="reveal reveal-delay-1 mt-4 max-w-[62ch] font-body text-[17px] leading-[1.7] text-theme-muted">
|
|
96
124
|
{intro}
|
|
97
125
|
</p>
|
|
126
|
+
{pull && (
|
|
127
|
+
<p className="reveal reveal-delay-2 mt-5 max-w-[21em] font-display text-[clamp(24px,2.8vw,34px)] font-normal italic leading-[1.22] tracking-[-0.012em] text-theme-muted [font-variation-settings:'SOFT'_90,'opsz'_110]">
|
|
128
|
+
{renderHighlightedText(pull, "font-[460] text-accent-bright")}
|
|
129
|
+
</p>
|
|
130
|
+
)}
|
|
98
131
|
<CtaRow
|
|
99
132
|
primaryCta={primaryCta}
|
|
100
133
|
secondaryCta={secondaryCta}
|
|
@@ -106,11 +139,13 @@ function HomeOneLightSection({
|
|
|
106
139
|
|
|
107
140
|
/* ============ mission band ============ */
|
|
108
141
|
|
|
142
|
+
/* Rev 10: the band is pure thesis — the quote carries the mission alone.
|
|
143
|
+
Sub and CTAs stay authorable but optional, so older content parses. */
|
|
109
144
|
const missionSchema = z.object({
|
|
110
145
|
quote: z.string(),
|
|
111
|
-
sub: z.string(),
|
|
112
|
-
primaryCta: ctaSchema,
|
|
113
|
-
secondaryCta: ctaSchema,
|
|
146
|
+
sub: z.string().optional(),
|
|
147
|
+
primaryCta: ctaSchema.optional(),
|
|
148
|
+
secondaryCta: ctaSchema.optional(),
|
|
114
149
|
});
|
|
115
150
|
|
|
116
151
|
function HomeMissionSection({
|
|
@@ -121,14 +156,18 @@ function HomeMissionSection({
|
|
|
121
156
|
}: z.infer<typeof missionSchema>): JSX.Element {
|
|
122
157
|
return (
|
|
123
158
|
<Band quote={quote}>
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
159
|
+
{sub && (
|
|
160
|
+
<p className="reveal reveal-delay-1 mt-[18px] max-w-[52ch] font-body text-[17px] text-theme-light">
|
|
161
|
+
{sub}
|
|
162
|
+
</p>
|
|
163
|
+
)}
|
|
164
|
+
{primaryCta && secondaryCta && (
|
|
165
|
+
<CtaRow
|
|
166
|
+
primaryCta={primaryCta}
|
|
167
|
+
secondaryCta={secondaryCta}
|
|
168
|
+
className="reveal reveal-delay-2 mt-[26px]"
|
|
169
|
+
/>
|
|
170
|
+
)}
|
|
132
171
|
</Band>
|
|
133
172
|
);
|
|
134
173
|
}
|
|
@@ -213,20 +252,23 @@ const aliveSchema = z.object({
|
|
|
213
252
|
export const homeSections: SiteSectionGroup = sectionGroup("home", {
|
|
214
253
|
growth: defineSection(growthSchema, HomeGrowthSection, {
|
|
215
254
|
title: "Growth",
|
|
216
|
-
description:
|
|
255
|
+
description:
|
|
256
|
+
"You → Team → Network diagram with the three stage columns — how the parts come together",
|
|
217
257
|
}),
|
|
218
258
|
problem: defineSection(trioSchema, HomeProblemSection, {
|
|
219
259
|
title: "Problem",
|
|
220
|
-
description:
|
|
260
|
+
description:
|
|
261
|
+
"Alone, it withers — problem trio (hollow numerals, no warmth)",
|
|
221
262
|
}),
|
|
222
263
|
"one-light": defineSection(oneLightSchema, HomeOneLightSection, {
|
|
223
264
|
title: "One Light",
|
|
224
265
|
description:
|
|
225
|
-
"It starts with
|
|
266
|
+
"It starts with you — the single ask, after the mission and before the faces",
|
|
226
267
|
}),
|
|
227
268
|
mission: defineSection(missionSchema, HomeMissionSection, {
|
|
228
269
|
title: "Mission",
|
|
229
|
-
description:
|
|
270
|
+
description:
|
|
271
|
+
"Mission band — display-italic statement alone; sub and CTAs optional",
|
|
230
272
|
}),
|
|
231
273
|
faces: defineSection(facesSchema, HomeFacesSection, {
|
|
232
274
|
title: "Faces",
|
package/src/routes.ts
CHANGED
|
@@ -17,18 +17,18 @@ export const aiRoutes: RouteDefinitionInput[] = [
|
|
|
17
17
|
// The hero is the live agent proximity map, rendered from this brain's
|
|
18
18
|
// own registry. dataQuery routes it through the datasource (live map
|
|
19
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
|
|
21
|
-
//
|
|
22
|
-
// the
|
|
20
|
+
// merged over via the content overlay. Then the rev-10 story: the pain
|
|
21
|
+
// (problem), how the parts come together (growth carries the system),
|
|
22
|
+
// the mission, and only then the ask (one-light), the faces, the proof.
|
|
23
23
|
{
|
|
24
24
|
id: "network",
|
|
25
25
|
template: "agent-discovery:proximity-map",
|
|
26
26
|
dataQuery: {},
|
|
27
27
|
},
|
|
28
28
|
{ id: "problem", template: "home:problem" },
|
|
29
|
-
{ id: "one-light", template: "home:one-light" },
|
|
30
29
|
{ id: "growth", template: "home:growth" },
|
|
31
30
|
{ id: "mission", template: "home:mission" },
|
|
31
|
+
{ id: "one-light", template: "home:one-light" },
|
|
32
32
|
{ id: "faces", template: "home:faces" },
|
|
33
33
|
{ id: "alive", template: "home:alive" },
|
|
34
34
|
],
|
package/src/shared.tsx
CHANGED
|
@@ -30,16 +30,20 @@ export const HIGHLIGHT_CLS = "italic font-[395] text-accent-bright";
|
|
|
30
30
|
export const ROOM_HIGHLIGHT_CLS = "italic font-[400] text-accent";
|
|
31
31
|
|
|
32
32
|
/* The mockup's `.cap` section caption: mono, wide-tracked, a short
|
|
33
|
-
accent tick leading in, optional lowercase trail note.
|
|
33
|
+
accent tick leading in, optional lowercase trail note. The "cold" tone
|
|
34
|
+
drains the accent — rev-10's withered section holds no warmth. */
|
|
34
35
|
export function SectCap({
|
|
35
36
|
lead,
|
|
36
37
|
trail,
|
|
38
|
+
tone = "accent",
|
|
37
39
|
className = "",
|
|
38
40
|
}: {
|
|
39
41
|
lead: string;
|
|
40
42
|
trail?: string | undefined;
|
|
43
|
+
tone?: "accent" | "cold";
|
|
41
44
|
className?: string;
|
|
42
45
|
}): JSX.Element {
|
|
46
|
+
const cold = tone === "cold";
|
|
43
47
|
return (
|
|
44
48
|
<p
|
|
45
49
|
className={`reveal flex flex-wrap items-baseline gap-3.5 font-label text-label-xs uppercase tracking-[0.2em] ${className}`}
|
|
@@ -49,9 +53,13 @@ export function SectCap({
|
|
|
49
53
|
<span className="flex items-baseline gap-3.5">
|
|
50
54
|
<span
|
|
51
55
|
aria-hidden="true"
|
|
52
|
-
className=
|
|
56
|
+
className={`h-px w-[26px] self-center opacity-80 ${cold ? "bg-theme-light" : "bg-accent"}`}
|
|
53
57
|
/>
|
|
54
|
-
<span
|
|
58
|
+
<span
|
|
59
|
+
className={`font-medium ${cold ? "text-theme-light" : "text-accent"}`}
|
|
60
|
+
>
|
|
61
|
+
{lead}
|
|
62
|
+
</span>
|
|
55
63
|
</span>
|
|
56
64
|
{trail && (
|
|
57
65
|
<span className="normal-case tracking-[0.1em] text-theme-light">
|
|
@@ -206,7 +214,8 @@ export function delayClass(index: number): string {
|
|
|
206
214
|
/* The three-up marker/title/text grid shared by two rooms: home's "why it
|
|
207
215
|
has to exist" problem trio (large display numerals) and /brain's "your
|
|
208
216
|
data, your rules" principles (mono markers). One schema, one component,
|
|
209
|
-
the marker style toggled by `mono
|
|
217
|
+
the marker style toggled by `mono`; `withered` hollows the numerals and
|
|
218
|
+
cools the titles — the rev-10 no-warmth treatment for the pain section. */
|
|
210
219
|
export const trioItemSchema: z.ZodObject<{
|
|
211
220
|
marker: z.ZodString;
|
|
212
221
|
title: z.ZodString;
|
|
@@ -232,10 +241,15 @@ export type TrioItem = z.infer<typeof trioItemSchema>;
|
|
|
232
241
|
export function Trio({
|
|
233
242
|
items,
|
|
234
243
|
mono,
|
|
244
|
+
withered = false,
|
|
235
245
|
}: {
|
|
236
246
|
items: TrioItem[];
|
|
237
247
|
mono: boolean;
|
|
248
|
+
withered?: boolean;
|
|
238
249
|
}): JSX.Element {
|
|
250
|
+
const numeralClass = withered
|
|
251
|
+
? "block font-display text-[44px] font-light leading-none text-transparent [-webkit-text-stroke:1px_var(--color-text-light)] [font-variation-settings:'SOFT'_30,'opsz'_100]"
|
|
252
|
+
: "block font-display text-[44px] font-light leading-none text-theme-light [font-variation-settings:'SOFT'_30,'opsz'_100]";
|
|
239
253
|
return (
|
|
240
254
|
<div className="mt-[30px] grid gap-11 md:grid-cols-3">
|
|
241
255
|
{items.map((item, i) => (
|
|
@@ -245,11 +259,11 @@ export function Trio({
|
|
|
245
259
|
{item.marker}
|
|
246
260
|
</span>
|
|
247
261
|
) : (
|
|
248
|
-
<span className=
|
|
249
|
-
{item.marker}
|
|
250
|
-
</span>
|
|
262
|
+
<span className={numeralClass}>{item.marker}</span>
|
|
251
263
|
)}
|
|
252
|
-
<b
|
|
264
|
+
<b
|
|
265
|
+
className={`mt-2.5 block font-display text-[21px] font-[520] tracking-[-0.006em] [font-variation-settings:'SOFT'_55] ${withered ? "text-theme-muted" : "text-theme"}`}
|
|
266
|
+
>
|
|
253
267
|
{item.title}
|
|
254
268
|
</b>
|
|
255
269
|
<p className="mt-2 font-body text-[15.5px] text-theme-light">
|