<feed xmlns='http://www.w3.org/2005/Atom'>
<title>pardes.git/src/detached/wire.zig, branch main</title>
<subtitle>Pardes</subtitle>
<id>https://git.0x4200.cafe/pardes.git/atom?h=main</id>
<link rel='self' href='https://git.0x4200.cafe/pardes.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/'/>
<updated>2026-10-01T03:12:17Z</updated>
<entry>
<title>A program that asked for focus reports (1004) hears CSI I when its pane takes the keyboard and CSI O when it gives it up, to another pane, a tag or another window</title>
<updated>2026-10-01T03:12:17Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-30T17:20:10Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=17c0d06618085de8d0bbf8152750ffa862db0080'/>
<id>urn:sha1:17c0d06618085de8d0bbf8152750ffa862db0080</id>
<content type='text'>
The core has a window-focus event now, from SDL's window focus and from
the tty's own focus reports (vaxis turns 1004 on outside); the detached
wire carries it: version 10. The test shell's ESC]777;mouse;focus;&lt;1|0&gt;
fakes the window's.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>A mouse event carries Shift and Alt as well as Ctrl, from SDL and from the tty's input; a program's wheel report carries them as xterm counts them, and Shift keeps the wheel pardes's own scroll</title>
<updated>2026-10-01T03:12:17Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-30T17:06:31Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=3f6733c805d873a7af6a6064ace0cf5916f481da'/>
<id>urn:sha1:3f6733c805d873a7af6a6064ace0cf5916f481da</id>
<content type='text'>
The reports are ghostty's encoder now (shift+4, meta+8, ctrl+16), with the
mode and format ghostty tracks. The detached wire carries the two new
bits: version 9. The test shell's ESC]777;mouse takes an optional fifth
field of modifiers.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>shader_build.zig is ShaderBuild.zig: a file that is a struct (its fields are the post chain's builds) takes a type's name</title>
<updated>2026-10-01T03:12:17Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-29T23:24:56Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=7d2178022e721f3eac023f3e3be56c1bb1e49927'/>
<id>urn:sha1:7d2178022e721f3eac023f3e3be56c1bb1e49927</id>
<content type='text'>
The naming the split agreed on: a file with fields is a type, TitleCase, as Messages.zig and Layer.zig are. Its importers bind it as ShaderBuild; comments and docs/render-pipeline.md name the new file. No behaviour changes.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>The theme's chrome is worked out once, not per grapheme; still post passes let the GUI rest; a perf gate</title>
<updated>2026-10-01T03:12:16Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-29T16:19:08Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=4e224b7c7e67fafcbe7359fcf534048e254b701d'/>
<id>urn:sha1:4e224b7c7e67fafcbe7359fcf534048e254b701d</id>
<content type='text'>
somtrmsz's contrast floors made ChromeTheme.fromTheme run its focus-tint
and separator searches (pow calls each), and Output's RowDecoration.styleAt
called it for every grapheme of every highlighted row: the 50k-line file's
render went from 0.11 ms to 13 ms. Pardes.bodyChrome now keeps the theme's
chrome, worked out again only when the theme differs; recolorSyntax asks
for it once a decorated row, and a plain row (nearly every row of a file)
never asks. ReleaseFast, medium fixture, median us, before -&gt; after (main):
render 13150 -&gt; 76 (111), key-down 14658 -&gt; 79 (110), wheel 13589 -&gt; 76
(109), open 14891 -&gt; 2095 (2055), edit-char 16703 -&gt; 3006 (1251; the rest of
that gap is editing and tree-sitter, not this).

Post.animating asked for frames whenever the window had focus and any pass
was ready, so a still pass kept the GUI drawing at the display's rate
(Bloom: 49% of a core idle, in a hidden test window). A pass now says
whether it moves on its own: the CRT (its hum and dither) and a Shadertoy
file whose source reads iTime, iFrame or iDate (shader_build.readsTime; the
flag rides the wire's post message); Bloom, Vignette and Grain are still.
Bloom idle: 49% -&gt; 1.2%, as with no pass.

zig build perf-gate: the 50k-line file's gestures, each's fastest sample
within 3x of the recorded baseline's (test/perf-baseline-&lt;platform&gt;-
&lt;optimize&gt;.json, recorded from this build), run with every unit-test. On
the regressed code it fails at 180x for render.
</content>
</entry>
<entry>
<title>Shader files compile again on save; an attached GUI runs the session's post chain</title>
<updated>2026-10-01T03:12:16Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-29T12:43:05Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=826ec1fac3c012e71ab34207328faaac5b5827b7'/>
<id>urn:sha1:826ec1fac3c012e71ab34207328faaac5b5827b7</id>
<content type='text'>
shader_build.zig takes the Shadertoy compile out of the GUI's Post: the
process that holds the core compiles each chain file behind the prefix on a
thread, watches its directory (file_watch's new shader slots), and on a
change reads and hashes each file, compiling only one whose bytes moved. A
failed compile keeps the last good SPIR-V and is said once; the same bytes
are never compiled or reported twice. A file is read with std, not fs.zig's
readFile, whose turn hand-off a worker thread does not hold.

A detached session compiles for its frontends and sends them the chain
(wire post: each pass's scene and level or the file's SPIR-V, and
ShaderAnimation) on attach and on every change, so an attached GUI runs the
same passes, levels and animation as a local one while still reading no disk
and running no program. The attached GUI describes its frames to the chain
from the session's chrome and redraws an animating chain on its own.
</content>
</entry>
<entry>
<title>G13: Parallax, lapis's dots drift with the text at a quarter of its speed</title>
<updated>2026-10-01T03:12:16Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-29T11:28:40Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=0a2694e935fa8a79f1a399f2d2cbc643f8c3734e'/>
<id>urn:sha1:0a2694e935fa8a79f1a399f2d2cbc643f8c3734e</id>
<content type='text'>
Parallax on|off (off, a pixel shell's; Chrome.fx bit 3). A body region
carries its first line (Region.line, a file's scroll or a terminal's grid
offset; the wire's region record grows a u32). The GUI offsets each
body's page dots by a quarter of its line in rows, and of G6's glide
offset while one runs, so the pattern drifts with the text and settles
with it; the cell shader reads it from the instance's serial slot, whose
per-cell dissolve noise G7 left unused (the dead noise code goes).

Tests: a scrolled body tells its line; the shift handed to the shader is
a quarter of it within the dots' period. Measured in a capture: four lines
move the dots 13 px (140 px / 4 mod 22). Gates as before, goldens
byte-identical. Feel review: .scratch/render/parallax/.
</content>
</entry>
<entry>
<title>G12: Occlusion, pane bodies darkening faintly toward their edges</title>
<updated>2026-10-01T03:12:16Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-29T10:47:39Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=ab668719385c94df3e274f71cb744f5917c1da7e'/>
<id>urn:sha1:ab668719385c94df3e274f71cb744f5917c1da7e</id>
<content type='text'>
Occlusion on|off (off, a pixel shell's; Chrome.fx bit 2 — the glow bits
field is now `fx`): four soft strips cast from just outside each pane body
inward, clipped to the body and round a cursor, black pre-warped to
linear light, 2% at most (§9.1) and under the lift's contrast ceiling,
in the pane's own group.

Tests: the shade stays inside the body, off the cursor, at most 2%.
Gates as G11. Feel review: .scratch/render/occlusion/ (with an x40 diff).
</content>
</entry>
<entry>
<title>G11: HoverGlow, a soft underline of light under a look-hover's word</title>
<updated>2026-10-01T03:12:16Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-29T10:31:35Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=87ad46cb7e7410c53419c20cef7df53ed4c15f60'/>
<id>urn:sha1:87ad46cb7e7410c53419c20cef7df53ed4c15f60</id>
<content type='text'>
HoverGlow on|off (off, a pixel shell's; Chrome.glows bit 1, SelectionGlow
bit 0 now that there are two): under the word a look-hover would open (its
cells in the affordance's tint) a strip three logical pixels tall along
its foot, blurred by one, in the theme's accent, at most 22% and under
the text's contrast floor, fading in over 80 ms; kept to the bodies and
split round a cursor. glowBlocks serves G9 and G11. The strip is cast from
a row away so addSoft's caster cut-out misses it.

Tests: the glow comes up by 90 ms and never falls on the cursor's cell.
Gates as G10 (a loaded machine shifted the GUI goldens a scene once; a
rerun matched 01-08). Feel review: .scratch/render/hover/.
</content>
</entry>
<entry>
<title>G9: SelectionGlow, a soft halo round the body's selection</title>
<updated>2026-10-01T03:12:16Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-29T10:17:07Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=99c088e277e7d79d7b4341d3f546c02e7254e107'/>
<id>urn:sha1:99c088e277e7d79d7b4341d3f546c02e7254e107</id>
<content type='text'>
SelectionGlow on|off (off; a pixel shell's, Chrome.selection_glow): each
block of selected rows in a pane body casts Lift's soft kind in the
selection's own colour, the block its caster (never touched) and a cursor
beside it joined to the caster; clipped to the bodies (never a tag or a
grip); at most 22% (§8.2), less where the text round it would drop below
min(its contrast, 4.5); fading in over 100 ms with an ease-out, on the
core's continuous path (shell_continuous); none while panes move. Blocks
come from the cells in the theme's selection colour (documented).

Tests: the halo's colour, its clip to the body, nothing at its first frame
and up to its cap after 100 ms, fading done. Gates as G8. Feel review:
.scratch/render/selection/.
</content>
</entry>
<entry>
<title>G5: lapis, 0x4200.cafe's manuscript, as a theme with its ornament</title>
<updated>2026-10-01T03:12:16Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-29T09:04:28Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=09ec515c5e94de741104038cd61f18b2b997e78c'/>
<id>urn:sha1:09ec515c5e94de741104038cd61f18b2b997e78c</id>
<content type='text'>
A native theme `lapis` (src/themes/lapis.zig) from web/theme/lapis.css:
a lapis-deep page, lapis tags with gold names, vellum text, vermilion
rubrics, gold rules and a vermilion tag rule, gold selection in lapis ink.
Its ornament is the theme's new `decor` (colors.Decor), drawn by a pixel
shell inside the chrome it already has (decision 1), all of it off every
focus indicator:

- page_dots: the site's gold dot grid (#e8c46a22, 22 px), drawn by the
  cell shader on page-coloured cells alone (flag 0x10000000), so it lies
  under the text and never under a selection, a tag or the cursor; fixed
  to the window, a page the panes lie on.
- rail_checker: the dither frame's gold and lapis checker in the scroll
  track (a decor kind, flag 0x08000000), anchored to its rail; the thumb
  stays solid gold.
- tag plaques (tag_border, tag_shadow, tag_stripe): every tag a raised
  plaque inside its own band, the site's trail: a 2px gold frame and a
  hard 5px vermilion shadow down and right, both within the band's rows
  and columns (down, what the slack under the text leaves), so no shadow
  reaches a body, a grip or the next pane. The focused pane's plaque is
  the code window's title bar, gold and lapis stripes of 2px, its words
  on plates of the focused ground; unfocused ones are plain; column and
  workspace tags take the object-label language (1px frame, 2px shadow
  toward the page). Drawn as decor under the cells (a group's under
  range), with blank tag cells see-through and the cells blended
  premultiplied (pipeline_over) on such frames; opaque windows only.
- title_shadow: the titles' vermilion offset shadow under a file name's
  letters, sampled in the cell shader inside the letters' own cells (flag
  0x08000000), none on a cursor.

Chrome carries the decor (decor_*, name_ink, active_name_ink); a theme
file folds a nested decor literal field by field. Left out, with why, in
docs/effects.md: the fonts, the ornaments, a decor crossfade, and in the
tty anything but the colours (a tag row has no spare cell for a shadow).
An empty column is the page. The effect id is masked to 27 bits (ui.vert/ui.frag) for the
fifth flag.

Tests: the cell flags land only on page ground and file-name cells, never
a cursor, nothing without decor; lapis's plaques stay inside their tag's
band, clear of every grip, only the focused one striped; its checker is in
the track; no other theme draws any; the separator and focus
tests cover lapis. Goldens: theme and themesel (the ring gains lapis after
acme). Gates as G4. Feel review: .scratch/render/lapis/ (lapis.png, lapis-2x.png,
tags-focused-vs-unfocused-2x.png, a PanelSlide at 60 fps and a quarter).
</content>
</entry>
</feed>
