@justai/cuts 0.51.0 → 0.53.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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/Posts.astro +54 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@justai/cuts",
3
- "version": "0.51.0",
3
+ "version": "0.53.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": {
package/src/Posts.astro CHANGED
@@ -95,8 +95,44 @@ const vars = [
95
95
  /* the cut owns its own landing offset (was `#kernel, #posts { scroll-margin-top }` in each persona —
96
96
  which orphaned once #posts moved here and carried this component's scope cid instead of the persona's). */
97
97
  .posts { border-block-start: 1px solid var(--border); scroll-margin-top: 82px; }
98
- .post { padding-block: 18px; cursor: pointer; transition: background 0.15s var(--ease-out); }
99
- .post:hover { background: color-mix(in srgb, var(--text) 3.5%, transparent); }
98
+ /* A post is hoverable because it is a link to its own page, and the hover used to say so with a grey wash
99
+ — `--text` at 3.5% — which reads as dimming rather than as lifting. It now uses the card material, so
100
+ hovering a post looks like the same gesture as hovering a catalogue card.
101
+
102
+ `var(--card-bg, ...)` with the old wash as the fallback ON PURPOSE. Those tokens exist in app.zone only;
103
+ the other eleven personas have no catalogue and never defined them, and their column already uses
104
+ `--surface` as its own background, so falling back to that would have made the hover invisible. This way
105
+ app.zone gets the material and nobody else changes at all, which is the difference between an
106
+ improvement and a regression in eleven repos.
107
+
108
+ 16px of horizontal padding with a matching negative margin, so the box grows outward and the text does
109
+ not move. 16 rather than the 18 above it because the column's own padding is 16px on a phone and 28px
110
+ from 768px up: at 18 the box would overflow the narrow case by 2px. Two pixels of asymmetry nobody can
111
+ see beats a horizontal scrollbar on a phone.
112
+
113
+ Square corners, stated rather than inherited — a radius here would make it a card, and it is not one:
114
+ it spans the column and sits directly against its neighbours. */
115
+ .post {
116
+ padding-block: 18px;
117
+ padding-inline: 16px;
118
+ margin-inline: -16px;
119
+ border-radius: 0;
120
+ cursor: pointer;
121
+ transition: background 0.15s var(--ease-out);
122
+ }
123
+ /* The card's own material, and all three ingredients of it rather than just the fill — because on dark
124
+ `--card-bg` and `--surface` are THE SAME VALUE (#1c1c228c), so a fill alone would have been invisible
125
+ against the column it sits in. The catalogue cards get away with it because their border, their blur and
126
+ their shadow do the separating there; measured from tokens.css, not guessed.
127
+
128
+ The hairline is an INSET shadow rather than a border: a real border would add a pixel to the box on
129
+ hover and nudge everything below it. */
130
+ .post:hover {
131
+ background: var(--card-bg, color-mix(in srgb, var(--text) 3.5%, transparent));
132
+ box-shadow: inset 0 0 0 1px var(--border);
133
+ backdrop-filter: var(--card-blur, none);
134
+ -webkit-backdrop-filter: var(--card-blur, none);
135
+ }
100
136
  .post + .post { border-block-start: 1px solid var(--border); }
101
137
 
102
138
  .trow { display: flex; gap: 12px; }
@@ -154,8 +190,22 @@ const vars = [
154
190
  go from the CONTAINER, which is why this reads upward from the image with :has(). Scoping it to the image
155
191
  is what keeps a sibling persona's tiled icon tiled: .rav wraps their reply as well as a self-reply.
156
192
  `contain` rather than `cover`, because a mark with transparent margins must not be cropped to fill. */
157
- .pa:has(.mk.bare), .rav:has(.mk.bare) { background: none; border-color: transparent; }
158
- .pa .mk.bare, .rav .mk.bare { object-fit: contain; }
193
+ .pa:has(.mk.bare), .rav:has(.mk.bare) {
194
+ background: none; border-color: transparent;
195
+ /* The slot rounds its corners and clips, which is right for a tile whose own corners are round and wrong
196
+ for a mark with no tile: the arms reach the corners, so the radius sliced their round outer tips flat.
197
+ Measured before the fix — 27.5px wide against 28.0 tall inside a square 30px slot, the asymmetry being
198
+ the clipping showing up as numbers. Nothing is left to clip once the mark is inset below, but both go
199
+ anyway, or a later change to the inset brings the slicing back silently. */
200
+ border-radius: 0; overflow: visible;
201
+ }
202
+ /* 72%, measured rather than judged. Filling the slot, the arms painted 92% of it; a sibling's tiled icon
203
+ paints its glyph across 61%, because the glyph sits inset within its own tile. So app.zone carried half
204
+ again the painted width of every persona it was replying to, in a thread where it is one speaker among
205
+ peers rather than the platform above them. At 72% the arms land near 67% — a shade above the siblings,
206
+ which suits a bracket form being lighter than a filled ring. The feed permalink page uses the same number
207
+ for the same reason; the two surfaces render one conversation and must not disagree about it. */
208
+ .pa .mk.bare, .rav .mk.bare { width: 72%; height: 72%; object-fit: contain; }
159
209
  /* The scheme pair: the page decides, because the SVG's own media query does not survive <img>.
160
210
  Written as `.pa .mk.av-*` rather than `.av-*` deliberately — `.pa .mk { display: block }` above is two
161
211
  classes deep, so a single-class `.av-light { display: none }` loses on specificity and the toggle silently