@rizom/site-rizom-ai 0.2.0-alpha.179 → 0.2.0-alpha.181

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rizom/site-rizom-ai",
3
- "version": "0.2.0-alpha.179",
3
+ "version": "0.2.0-alpha.181",
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.179",
22
- "@rizom/site-rizom": "0.2.0-alpha.179",
23
- "@rizom/site-sections": "0.2.0-alpha.179",
21
+ "@rizom/site": "0.2.0-alpha.181",
22
+ "@rizom/site-rizom": "0.2.0-alpha.181",
23
+ "@rizom/site-sections": "0.2.0-alpha.181",
24
24
  "preact": "^10.27.2"
25
25
  },
26
26
  "publishConfig": {
@@ -97,6 +97,15 @@ export const SCREEN_STYLES = `
97
97
  @keyframes brainScreenFlicker { 0%, 100% { opacity: .75; } 50% { opacity: 1; } }
98
98
  @media (prefers-reduced-motion: reduce) { .brain-screen .ifc-status i { animation: none; } }
99
99
  @media (max-width: 900px) { .brain-screen .dash-canvas { grid-template-columns: 1fr; } .brain-screen .dash-canvas .ifc-card { grid-column: auto !important; } }
100
+ @media (max-width: 640px) {
101
+ .brain-screen .ifc-strip { flex-wrap: wrap; row-gap: 6px; }
102
+ .brain-screen .ifc-tabs { overflow-x: auto; }
103
+ /* The studio's library pane becomes a horizontal file strip above the
104
+ manuscript instead of a crushed side column. */
105
+ .brain-screen .cms-cols { grid-template-columns: 1fr; }
106
+ .brain-screen .cms-list { display: flex; gap: 2px; overflow-x: auto; padding: 8px 10px; border-right: 0; border-bottom: 1px solid rgba(241,234,221,.09); }
107
+ .brain-screen .cms-item { flex: none; gap: 6px; padding: 5px 10px; border-left: 0; border-radius: 6px; }
108
+ }
100
109
  `;
101
110
 
102
111
  /** Emitted once per page; scopes all screen styles under `.brain-screen`. */
package/src/layout.tsx CHANGED
@@ -67,13 +67,14 @@ const FACE_CHROME: Record<FaceKey, FaceChrome> = {
67
67
  },
68
68
  };
69
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.
70
+ // The umbrella page's own chrome: the plain wordmark, the org-level indexes
71
+ // (everything published, everyone in the network the strip above already
72
+ // offers the faces), and a get-started CTA that points at the product room.
72
73
  const HOME_CHROME: FaceChrome = {
73
74
  nameplate: null,
74
75
  links: [
75
- { label: "Brain", href: "/brain" },
76
- { label: "Docs ↗", href: "https://docs.rizom.ai", external: true },
76
+ { label: "Writing", href: "/writing" },
77
+ { label: "Network", href: "/network" },
77
78
  ],
78
79
  cta: { label: "Get Started", href: "/brain" },
79
80
  };
@@ -94,8 +95,9 @@ function activeFace(path: string): FaceKey {
94
95
  }
95
96
 
96
97
  // The org-level indexes: cross-room aggregations (everything published,
97
- // everyone in the network) that belong to no single face. They live
98
- // top-right on every face, and claim the current page on their own path.
98
+ // everyone in the network) that belong to no single face. They live in the
99
+ // home nav and the footer; the strip only needs their paths so no face
100
+ // claims the current page there.
99
101
  const ORG_INDEXES: { label: string; href: string }[] = [
100
102
  { label: "Writing", href: "/writing" },
101
103
  { label: "Network", href: "/network" },
@@ -113,7 +115,7 @@ function FacesStrip({ path }: { path: string }): JSX.Element {
113
115
  const activeIndex = orgIndexActive(path);
114
116
  const home = isHome(path);
115
117
  return (
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">
118
+ <div className="relative z-[2] flex flex-wrap items-baseline gap-x-4 gap-y-1.5 border-b border-theme-light px-4 py-3 font-label text-label-xs uppercase tracking-[0.12em] sm:gap-x-6 sm:px-6 sm:tracking-[0.14em] md:px-10 xl:px-20">
117
119
  <span className="text-theme-muted">rizom</span>
118
120
  {FACES.map((item) =>
119
121
  // No face is current on the umbrella home, nor on a cross-room index.
@@ -121,7 +123,7 @@ function FacesStrip({ path }: { path: string }): JSX.Element {
121
123
  <a
122
124
  key={item.key}
123
125
  href={item.href}
124
- className="text-accent"
126
+ className="-my-2 inline-block py-2 text-accent"
125
127
  aria-current="page"
126
128
  >
127
129
  {item.label}
@@ -130,28 +132,23 @@ function FacesStrip({ path }: { path: string }): JSX.Element {
130
132
  <a
131
133
  key={item.key}
132
134
  href={item.href}
133
- className="text-theme-light transition-colors hover:text-theme"
135
+ className="-my-2 inline-block py-2 text-theme-light transition-colors hover:text-theme"
134
136
  >
135
137
  {item.label}
136
138
  </a>
137
139
  ),
138
140
  )}
139
- <div className="ml-auto flex items-baseline gap-6">
140
- {ORG_INDEXES.map((index) => {
141
- const active = activeIndex === index.href;
142
- return (
143
- <a
144
- key={index.href}
145
- href={index.href}
146
- className={`transition-colors ${
147
- active ? "text-accent" : "text-theme-light hover:text-theme"
148
- }`}
149
- {...(active ? { "aria-current": "page" } : {})}
150
- >
151
- {index.label}
152
- </a>
153
- );
154
- })}
141
+ <div className="ml-auto flex items-baseline">
142
+ {/* boot.js binds by id and syncs the label; window.toggleTheme
143
+ (injected by site-engine) flips data-theme + persists it. */}
144
+ <button
145
+ id="themeToggle"
146
+ type="button"
147
+ aria-label="Toggle color theme"
148
+ className="-my-2 inline-block cursor-pointer py-2 uppercase text-theme-light transition-colors hover:text-theme"
149
+ >
150
+ ☀ Light
151
+ </button>
155
152
  </div>
156
153
  </div>
157
154
  );
@@ -161,13 +158,13 @@ function Wordmark({ nameplate }: { nameplate: string | null }): JSX.Element {
161
158
  return (
162
159
  <a
163
160
  href="/"
164
- className="font-display text-[26px] font-semibold tracking-[-0.01em] [font-variation-settings:'SOFT'_100]"
161
+ className="font-display text-[clamp(22px,5.5vw,26px)] font-semibold tracking-[-0.01em] [font-variation-settings:'SOFT'_100]"
165
162
  aria-label="Rizom home"
166
163
  >
167
164
  <span className="text-theme">rizom</span>
168
165
  <span className="text-accent">.</span>
169
166
  {nameplate && (
170
- <span className="text-[20px] font-normal text-theme-muted">
167
+ <span className="text-[clamp(17px,4.3vw,20px)] font-normal text-theme-muted">
171
168
  {nameplate}
172
169
  </span>
173
170
  )}
@@ -189,9 +186,11 @@ function FaceNav({
189
186
  const links: FaceLink[] = chrome.links;
190
187
 
191
188
  return (
192
- <nav className="relative z-[2] flex items-baseline gap-8 px-6 py-5 md:px-10 xl:px-20">
189
+ <nav className="relative z-[2] flex items-baseline gap-4 px-4 py-5 sm:gap-8 sm:px-6 md:px-10 xl:px-20">
193
190
  <Wordmark nameplate={chrome.nameplate} />
194
- <div className="hidden items-baseline gap-7 md:flex">
191
+ {/* Below sm the footer carries every chrome link; the row keeps
192
+ just the wordmark and the CTA so nothing overflows. */}
193
+ <div className="hidden items-baseline gap-7 sm:flex">
195
194
  {links.map((link) => (
196
195
  <a
197
196
  key={`${link.href}-${link.label}`}
@@ -205,7 +204,7 @@ function FaceNav({
205
204
  <div className="flex-1" />
206
205
  <a
207
206
  href={chrome.cta.href}
208
- className="self-center rounded-[3px] bg-accent px-[18px] py-[9px] font-body text-[16px] font-medium text-theme-inverse transition-[filter,transform] hover:brightness-110 hover:-translate-y-px"
207
+ className="self-center whitespace-nowrap rounded-[3px] bg-accent px-3.5 py-2 font-body text-[15px] font-medium text-theme-inverse transition-[filter,transform] hover:brightness-110 hover:-translate-y-px sm:px-[18px] sm:py-[9px] sm:text-[16px]"
209
208
  >
210
209
  {chrome.cta.label}
211
210
  </a>
@@ -265,7 +264,7 @@ function SiteFooter({
265
264
  siteInfo: RizomLayoutProps["siteInfo"];
266
265
  }): JSX.Element {
267
266
  return (
268
- <footer className="relative z-[1] grid gap-10 border-t border-theme px-6 pt-11 pb-[38px] md:grid-cols-2 md:px-10 xl:grid-cols-[1.3fr_1fr_1fr_1fr] xl:px-20">
267
+ <footer className="relative z-[1] grid gap-10 border-t border-theme px-4 pt-11 pb-[38px] sm:grid-cols-2 sm:px-6 md:px-10 lg:grid-cols-[1.3fr_1fr_1fr_1fr] xl:px-20">
269
268
  <div>
270
269
  <a
271
270
  href="/"
@@ -287,7 +286,7 @@ function SiteFooter({
287
286
  <a
288
287
  key={link.href + link.label}
289
288
  href={link.href}
290
- className="block py-[3px] font-body text-[15.5px] text-theme-light no-underline transition-colors hover:text-theme"
289
+ className="block py-1.5 font-body text-[15.5px] text-theme-light no-underline transition-colors hover:text-theme"
291
290
  >
292
291
  {link.label}
293
292
  </a>
package/src/shared.tsx CHANGED
@@ -44,11 +44,15 @@ export function SectCap({
44
44
  <p
45
45
  className={`reveal flex flex-wrap items-baseline gap-3.5 font-label text-label-xs uppercase tracking-[0.2em] ${className}`}
46
46
  >
47
- <span
48
- aria-hidden="true"
49
- className="h-px w-[26px] self-center bg-accent opacity-80"
50
- />
51
- <span className="font-medium text-accent">{lead}</span>
47
+ {/* Tick and lead wrap as one unit — a long trail may drop to its
48
+ own line, but the tick never orphans away from the lead. */}
49
+ <span className="flex items-baseline gap-3.5">
50
+ <span
51
+ aria-hidden="true"
52
+ className="h-px w-[26px] self-center bg-accent opacity-80"
53
+ />
54
+ <span className="font-medium text-accent">{lead}</span>
55
+ </span>
52
56
  {trail && (
53
57
  <span className="normal-case tracking-[0.1em] text-theme-light">
54
58
  {trail}
@@ -133,7 +137,10 @@ export function IndexRow({
133
137
  <span className="font-label text-label-xs uppercase tracking-[0.1em] text-theme-light">
134
138
  {row.kicker}
135
139
  </span>
136
- <span className="block">
140
+ {/* Below md the two-column grid is folio|kicker on the first row;
141
+ title and meta take full-width rows of their own instead of
142
+ falling into the 44px folio column. */}
143
+ <span className="col-span-2 block md:col-span-1">
137
144
  <span className="block font-display text-[26px] font-[470] tracking-[-0.01em] text-theme transition-colors group-hover:text-accent [font-variation-settings:'SOFT'_75,'opsz'_60]">
138
145
  {row.title}
139
146
  </span>
@@ -141,7 +148,7 @@ export function IndexRow({
141
148
  {row.text}
142
149
  </span>
143
150
  </span>
144
- <span className="text-right font-label text-[12px] text-theme-light">
151
+ <span className="col-span-2 text-right font-label text-[12px] text-theme-light md:col-span-1">
145
152
  {row.meta ?? "→"}
146
153
  {row.metaSub && (
147
154
  <small className="block text-theme-light opacity-70">
@@ -152,7 +159,7 @@ export function IndexRow({
152
159
  </>
153
160
  );
154
161
 
155
- const rowClass = `reveal ${delayClass} group grid max-w-[1040px] grid-cols-[44px_1fr] items-baseline gap-6 border-t border-theme-light py-6 no-underline md:grid-cols-[64px_176px_1fr_auto]`;
162
+ const rowClass = `reveal ${delayClass} group grid max-w-[1040px] grid-cols-[44px_1fr] items-baseline gap-x-6 gap-y-2 border-t border-theme-light py-6 no-underline md:grid-cols-[64px_176px_1fr_auto] md:gap-6`;
156
163
 
157
164
  return row.href ? (
158
165
  <a href={row.href} className={rowClass}>
@@ -181,7 +188,7 @@ export function AliveLine({
181
188
  <a
182
189
  key={link.href + link.label}
183
190
  href={link.href}
184
- className={`reveal ${i > 0 ? "reveal-delay-1" : ""} border-b border-theme-light font-label text-[12px] text-theme-light no-underline transition-colors hover:text-accent-bright`}
191
+ className={`reveal ${i > 0 ? "reveal-delay-1" : ""} -mt-2 inline-block border-b border-theme-light pt-2 font-label text-[12px] text-theme-light no-underline transition-colors hover:text-accent-bright`}
185
192
  >
186
193
  {link.label}
187
194
  </a>