@justai/cuts 0.152.0 → 0.154.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.152.0",
3
+ "version": "0.154.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": {
@@ -41,8 +41,8 @@
41
41
  "access": "public"
42
42
  },
43
43
  "dependencies": {
44
- "@justai/core": "^0.41.0",
45
- "@justai/ui": "^0.28.0",
44
+ "@justai/core": "^0.43.0",
45
+ "@justai/ui": "^0.29.0",
46
46
  "@justai/atrium": "^0.1.9"
47
47
  },
48
48
  "scripts": {
@@ -236,15 +236,22 @@ const chrome = face === "page";
236
236
  display: flex; flex-direction: column;
237
237
  padding-inline: max(var(--gutter, 16px), env(safe-area-inset-left)) max(var(--gutter, 16px), env(safe-area-inset-right));
238
238
  }
239
- /* 640 is the fleet's one threshold and the fleet's one column width — @justai/ui declares
240
- `--column`, and a media query cannot read a custom property, so the NUMBER has to be written
241
- again here. Written again is not decided again: if this ever disagrees with base.css, this is
242
- the copy that is wrong. */
239
+ /* 1280 is the fleet's one threshold and the fleet's one column width (2026-10-14; 640 before) —
240
+ @justai/ui declares `--column`, and a media query cannot read a custom property, so the NUMBER has
241
+ to be written again here. Written again is not decided again: if this ever disagrees with
242
+ base.css, this is the copy that is wrong. The gutter steps at 640 and keeps the safe-area term
243
+ until the column, exactly as base.css does. */
243
244
  @media (min-width: 640px) {
244
245
  .pp .app {
245
246
  --gutter: 28px;
246
- max-width: 640px;
247
- max-width: var(--column, 640px);
247
+ padding-left: 28px; padding-right: 28px;
248
+ padding-inline: max(var(--gutter, 28px), env(safe-area-inset-left)) max(var(--gutter, 28px), env(safe-area-inset-right));
249
+ }
250
+ }
251
+ @media (min-width: 1280px) {
252
+ .pp .app {
253
+ max-width: 1280px;
254
+ max-width: var(--column, 1280px);
248
255
  margin-left: auto; margin-right: auto; margin-inline: auto;
249
256
  padding-left: 28px; padding-right: 28px; padding-inline: var(--gutter, 28px);
250
257
  border-left: 1px solid var(--border); border-right: 1px solid var(--border);
package/src/Profile.astro CHANGED
@@ -29,8 +29,9 @@
29
29
  // href stay local with no per-consumer escape hatch. `files`, `me` and `feed` each hand-rolled this
30
30
  // entire section before; they are child personas, and a child persona is a persona.
31
31
  //
32
- // CONTRACT: the shell's scroll-spy reads `.pname` and `.handle` from here to name the title strip, and
33
- // the section id `#profile` is one of the three cut anchors. Nothing else depends on the profile.
32
+ // CONTRACT: the section id `#profile` is one of the three cut anchors. Nothing else depends on the
33
+ // profile. (The scroll-spy also read `.pname` and `.handle` from here to name the toolbar's title strip;
34
+ // the strip went in cuts 0.152.0 and nothing reads them now.)
34
35
  interface Props {
35
36
  // The persona name (the <h1>), rendered RAW — it is authored in the persona's own source, never user
36
37
  // input, so a name may carry markup (justai's "justai<span class='pro'>.pro</span>"). Same rule as the
@@ -108,7 +109,9 @@ const vars = [
108
109
  background: var(--cover, linear-gradient(135deg, var(--accent), transparent));
109
110
  position: relative;
110
111
  }
111
- @media (min-width: 640px) { .cover { margin-inline: -28px; } }
112
+ /* the cover mirrors the page's padding: 28 with the safe-area term from 640, plain 28 at the column (1280) */
113
+ @media (min-width: 640px) { .cover { margin-inline: calc(-1 * max(28px, env(safe-area-inset-left))) calc(-1 * max(28px, env(safe-area-inset-right))); } }
114
+ @media (min-width: 1280px) { .cover { margin-inline: -28px; } }
112
115
  .avatar {
113
116
  width: 76px; height: 76px; border-radius: var(--radius-lg); margin-block-start: -40px;
114
117
  display: grid; place-items: center; padding: var(--avatar-pad, 0);
package/src/Sheet.astro CHANGED
@@ -318,16 +318,13 @@ const doneIsOurs = doneDefault || done === true;
318
318
  position: relative; /* the Done action is positioned against this */
319
319
  display: flex;
320
320
  flex-direction: column;
321
- /* THE ONE SIZING RULE, and there is no media query anywhere in this file. The persona's column
322
- is the active view, and its width is READ rather than repeated: `--column` is declared once in
323
- @justai/ui and the page is sized from the same token. On a phone this is the whole screen; on a
324
- desk it is the persona's own width, centred. It said 480 until 2026-08-04, in its own copy of
325
- the number — so when the page became 768 the sheet stayed a phone's width on a tablet. */
326
- /* THE FALLBACK IS NOT DECORATION. `--column` arrives with @justai/ui, and a page that uses this
327
- cut without it — the harness's own sheet fixture is one — never sees the token at all. So the
328
- literal here is the fleet's real width, not a historical one: it was 768 for an afternoon and
329
- the sheet quietly rendered at 768 on a 640 fleet, which is how that was found. */
330
- width: min(100%, var(--sheet-width, var(--column, 640px)));
321
+ /* THE ONE SIZING RULE, and there is no media query anywhere in this file: the whole screen on a
322
+ phone, 640 centred anywhere wider. Until 2026-10-14 the sheet READ the column (`--column`), and
323
+ the column was 640. When the column became 1280 the sheet stopped following it: a sheet across a
324
+ desk-wide column is a page, not a sheet — 640 is the width the fleet already knows a sheet at,
325
+ and a persona that wants another sets `--sheet-width`. (History: 480 until 2026-08-04 in its own
326
+ copy, then the column's 768 for an afternoon, then 640.) */
327
+ width: min(100%, var(--sheet-width, 640px));
331
328
  /* dvh is Chromium 108+; the fallback above it survives because the build has targets. */
332
329
  max-height: min(92vh, 100vh - 24px);
333
330
  max-height: min(92dvh, 100dvh - 24px);
package/src/Toolbar.astro CHANGED
@@ -351,7 +351,11 @@ import AuthMount from "./AuthMount.astro";
351
351
  /* `.stuck` is still set by the script below and still means "content is under the bar" — it simply
352
352
  has nothing to paint now that the shelf is opaque and always shadowed. Kept because the class is
353
353
  part of this cut's contract and a consumer may hang its own behaviour on it. */
354
- @media (min-width: 640px) { .toolbar { margin-inline: -28px; padding-inline: 28px; } }
354
+ /* From 640 the gutter is 28, and the app still fills the screen until 1280 — an iPhone held sideways is
355
+ in that range, so the bar keeps the safe-area term exactly as the page's padding does. At the
356
+ column (1280, @justai/ui base.css) the page drops it and so does the bar. */
357
+ @media (min-width: 640px) { .toolbar { margin-inline: calc(-1 * max(28px, env(safe-area-inset-left))) calc(-1 * max(28px, env(safe-area-inset-right))); padding-inline: max(28px, env(safe-area-inset-left)) max(28px, env(safe-area-inset-right)); } }
358
+ @media (min-width: 1280px) { .toolbar { margin-inline: -28px; padding-inline: 28px; } }
355
359
  .tb-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
356
360
  /* nav lives on the left, beside the back affordance — the middle is intentionally empty */
357
361
  .tb-left { display: flex; align-items: center; gap: 2px; min-width: 0; }