@justai/cuts 0.83.0 → 0.85.0

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": "@justai/cuts",
3
- "version": "0.83.0",
3
+ "version": "0.85.0",
4
4
  "description": "A persona's named parts — the page shell that holds them, and the cuts themselves.",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {
@@ -110,9 +110,17 @@ interface Props {
110
110
  avatarPad?: string;
111
111
  /** The cover behind the profile. Defaults to the host persona's accent, which is the point. */
112
112
  cover?: string;
113
- /** The host persona's face, if the page already resolved it server-side. Otherwise `childFace()`
114
- * fills it in at runtime from /api/face — see @justai/core. */
113
+ /** queries: the child persona knows its host already · server-side face · feed accent
114
+ *
115
+ * THE HOST'S FACE WHEN THE PAGE ALREADY HAS IT. Two children fetch it in the browser because they
116
+ * are one static bundle mounted on every host; the feed RENDERS per host and already read the
117
+ * registry, so it knows before the first paint. Pass it and the accent is set server-side —
118
+ * no flash of the platform default, and `childFace()` has nothing to do.
119
+ * Leave it out and the runtime path applies, which is the ordinary case. */
115
120
  host?: { name?: string; avatar?: string; accent?: string };
121
+ /** Override the handle line. Defaults to `@<child>` — a child persona's own address. The feed says
122
+ * `qr.app.zone · feed` instead, because it is the FEED OF a host rather than a room inside it. */
123
+ handle?: string;
116
124
  /** Where the parent's kernel is. Defaults to the host root, which is where a visitor came from. */
117
125
  parentHref?: string;
118
126
  parentLabel?: string;
@@ -126,6 +134,7 @@ interface Props {
126
134
  }
127
135
  const {
128
136
  child, name, bio, meta, host,
137
+ handle,
129
138
  parentHref = "/#kernel", parentLabel = "Home",
130
139
  sectionsLabel = "Sections", profileLabel, kernelLabel, face = "page",
131
140
  avatarBg = "linear-gradient(160deg, #1f2740, #11141f)",
@@ -144,7 +153,7 @@ const chrome = face === "page";
144
153
  IT RENDERS THE COLUMN ITSELF. An earlier draft styled `.pp .app` and left the consumer to emit
145
154
  the element, which is precisely the homework law 1 forbids: a shell whose geometry only works if
146
155
  somebody remembers a class name is a template, not a component. */}
147
- <div class="pp" id="pp" data-child={child} data-face={face}>
156
+ <div class="pp" id="pp" data-child={child} data-face={face} style={host?.accent ? `--accent: ${host.accent}` : undefined}>
148
157
  <main class="app">
149
158
  {/* THE `sheet` FACE SHOWS NO PROFILE AND NO ROW. It is content inside somebody's chrome, and a
150
159
  biography there is the guest introducing itself while the host is mid-sentence. As a `page`
@@ -162,7 +171,7 @@ const chrome = face === "page";
162
171
  child's own words, correct if the lookup never returns. */}
163
172
  <Profile
164
173
  name={`<span id="pnName">${name}</span><span class="pro" id="pnFacet"></span>`}
165
- handle={`<span id="pnHandle">@${child}</span>`}
174
+ handle={`<span id="pnHandle">${handle ?? "@" + child}</span>`}
166
175
  bio={bio ? `<span id="pnBio">${bio}</span>` : undefined}
167
176
  meta={`<span id="pnMeta">${meta ?? ""}</span>`}
168
177
  kernelLabel={name}
package/src/Toolbar.astro CHANGED
@@ -350,6 +350,34 @@ import AuthMount from "./AuthMount.astro";
350
350
  inside the same 19px. If the row is ever to read level, the way there is to grow the GLYPHS, not to
351
351
  shrink the identity. */
352
352
  .tb-nav.tb-mark :global(img) { width: 19px; height: 19px; }
353
+
354
+ /* ── WHATEVER IS FIRST IN THE ROW READS AT 20; EVERYTHING AFTER IT AT 19 ────────────────────
355
+ *
356
+ * queries: toolbar icon sizes · why is the first icon bigger · 20 and 19 · first position
357
+ *
358
+ * The founder's rule, with app.zone's own mark as the reference every icon is measured against.
359
+ * It is POSITIONAL, not about which icon happens to be there — the row is saying that the first
360
+ * thing in it is not one of the sections, and that is true whatever fills the slot:
361
+ *
362
+ * a persona `BackToZone` — the way out to app.zone
363
+ * a child persona the parent's face — the way up
364
+ * app.zone itself its OWN mark, because there is no way out of the zone from the zone
365
+ *
366
+ * Written structurally for that reason. `BackToZone` sizes itself; when it is absent the nav group
367
+ * becomes the first child of `.tb-left`, and its first item is what a person sees first. Expressed
368
+ * as a selector rather than a list of ids, a fourth arrangement is right without anyone editing
369
+ * this file — which is what "positional" has to mean to be worth the words.
370
+ *
371
+ * Measured across nine live surfaces first: `home` was 20 on eleven personas and 19 on qr, which
372
+ * had overridden it; the three children's parent icon was 19; auth's was 19 because I set it there
373
+ * an hour earlier having read the drift backwards; app.zone's own mark was 19 while being the
374
+ * first thing in its row. `BackToZone`'s default was right the whole time.
375
+ *
376
+ * The first slot always holds a MARK — a drawing that fills its own viewBox — so a 20px box is
377
+ * 20px of ink. A glyph there would need 26.67 to read the same, and if one ever lands in that slot
378
+ * this rule is where the exception belongs. */
379
+ .tb-left > .tb-nav-group:first-child > .tb-nav:first-child :global(svg),
380
+ .tb-left > .tb-nav-group:first-child > .tb-nav:first-child :global(img) { width: 20px; height: 20px; }
353
381
  .tb-nav :global(svg) { width: 19px; height: 19px; }
354
382
 
355
383
  /* ── EQUAL INK, TWO BOXES ────────────────────────────────────────────────────────────────────