| Commit message (Collapse) | Author | Age |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
rose_pine_moon, rose_pine_dawn
Every colour is the original's own, cited file:line in each theme file.
Sources:
palette; https://github.com/rose-pine/palette; ~/05-genizah/rose-pine-palette; 92af52b465ab6e47437aca223c9b8d3009a2023b
neovim port (highlight mapping, terminal colours, lualine); https://github.com/rose-pine/neovim; ~/05-genizah/rose-pine-neovim; ff483051a47e27d84bdef47703538df1ed9f4a47
Chrome moved to meet pardes's floors (text, syntax, ANSI untouched):
rose_pine: focused tag ground #1f1d2e -> #3c3a4e: 1.02:1 off the unfocused #1d1b2a, pardes needs 1.5:1 on a dark page
rose_pine: unfocused tag text #6e6a86 -> #858299: 3.27:1 on #1d1b2a, tag text needs 4.5:1 to be read and run
rose_pine: focused tag text #908caa -> #a8a5bd: 3.42:1 on #3c3a4e, tag text needs 4.5:1
rose_pine_moon: focused tag ground #2a273f -> #45415b: 1.03:1 off the unfocused #27253b, pardes needs 1.5:1 on a dark page
rose_pine_moon: unfocused tag text #6e6a86 -> #918ea3: 2.88:1 on #27253b, tag text needs 4.5:1 to be read and run
rose_pine_moon: focused tag text #908caa -> #b1afc4: 3.02:1 on #45415b, tag text needs 4.5:1
rose_pine_dawn: focused tag ground #fffaf3 -> #e2ddde: 1.02:1 off the unfocused #fdf8f1, pardes needs 1.25:1 on a light page
rose_pine_dawn: unfocused tag text #9893a5 -> #74707d: 2.82:1 on #fdf8f1, tag text needs 4.5:1 to be read and run
rose_pine_dawn: focused tag text #797593 -> #615e76: 3.27:1 on #e2ddde, tag text needs 4.5:1
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
tokyonight_storm, tokyonight_moon, tokyonight_day
Every colour is the original's own, cited file:line in each theme file.
Sources:
repo; https://github.com/folke/tokyonight.nvim; ~/05-genizah/tokyonight.nvim; cdc07ac78467a233fd62c493de29a17e0cf2b2b6
Chrome moved to meet pardes's floors (text, syntax, ANSI untouched):
tokyonight_night: focused tag ground #16161e -> #363846: 1.00:1 off the unfocused #16161e, pardes needs 1.5:1 on a dark page
tokyonight_night: unfocused tag text #3b4261 -> #7e8297: 1.83:1 on #16161e, tag text needs 4.5:1 to be read and run
tokyonight_night: rules between panes #15161e -> #3b3e4d: 1.05:1 off the page, lifted toward the text to 1.6:1 (as colors.zig separatorOf does)
tokyonight_storm: focused tag ground #1f2335 -> #3d4258: 1.00:1 off the unfocused #1f2335, pardes needs 1.5:1 on a dark page
tokyonight_storm: unfocused tag text #3b4261 -> #858a9d: 1.58:1 on #1f2335, tag text needs 4.5:1 to be read and run
tokyonight_storm: rules between panes #1d202f -> #44495f: 1.11:1 off the page, lifted toward the text to 1.6:1 (as colors.zig separatorOf does)
tokyonight_storm: scroll thumb #3b4261 -> #404767: 1.42:1 on its track #272b3f
tokyonight_moon: focused tag ground #1e2030 -> #3a3e56: 1.00:1 off the unfocused #1e2030, pardes needs 1.5:1 on a dark page
tokyonight_moon: unfocused tag text #3b4261 -> #858a9d: 1.64:1 on #1e2030, tag text needs 4.5:1 to be read and run
tokyonight_moon: focused tag text #828bb8 -> #a3a9ca: 3.16:1 on #3a3e56, tag text needs 4.5:1
tokyonight_moon: rules between panes #1b1d2b -> #414557: 1.09:1 off the page, lifted toward the text to 1.6:1 (as colors.zig separatorOf does)
tokyonight_moon: scroll thumb #3b4261 -> #3e4564: 1.46:1 on its track #27293a
tokyonight_day: focused tag ground #d0d5e3 -> #b5bdd7: 1.00:1 off the unfocused #d0d5e3, pardes needs 1.25:1 on a light page
tokyonight_day: unfocused tag text #a8aecb -> #575a6a: 1.49:1 on #d0d5e3, tag text needs 4.5:1 to be read and run
tokyonight_day: focused tag text #6172b0 -> #404b74: 2.47:1 on #b5bdd7, tag text needs 4.5:1
tokyonight_day: scroll thumb #a8aecb -> #9fa8ca: 1.41:1 on its track #c8cfe1
keyword is Neovim's tree-sitter @keyword (c.purple, groups/treesitter.lua:36),
which is what pardes's tree-sitter keywords are, not vim's regex Keyword (cyan).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
monokai_pro_classic, monokai_pro_machine, monokai_pro_octagon, monokai_pro_ristretto, monokai_pro_spectrum, monokai_pro_light, monokai_pro_light_sun
Every colour is the original's own, cited file:line in each theme file.
Sources:
Monokai Pro for VS Code 2.0.15, published by Wimer Hazenberg (Monokai), verified on Open VSX; https://open-vsx.org/api/monokai/theme-monokai-pro-vscode/2.0.15/file/monokai.theme-monokai-pro-vscode-2.0.15.vsix; ~/05-genizah/monokai-pro-vscode/vsix/extension/themes
Chrome moved to meet pardes's floors (text, syntax, ANSI untouched):
monokai_pro: focused tag ground #2d2a2e -> #4f4637: 1.00:1 off the unfocused #2d2a2e, pardes needs 1.5:1 on a dark page
monokai_pro: rules between panes #221f22 -> #4e4b4d: 1.15:1 off the page, lifted toward the text to 1.6:1 (as colors.zig separatorOf does)
monokai_pro: scroll thumb #434044 -> #4a484b: 1.39:1 on its track #2d2a2e
monokai_pro_classic: focused tag ground #272822 -> #46452f: 1.00:1 off the unfocused #272822, pardes needs 1.5:1 on a dark page
monokai_pro_classic: rules between panes #1d1e19 -> #4a4b44: 1.13:1 off the page, lifted toward the text to 1.6:1 (as colors.zig separatorOf does)
monokai_pro_classic: scroll thumb #3e3f38 -> #46473f: 1.40:1 on its track #272822
monokai_pro_machine: focused tag ground #273136 -> #4a4f40: 1.00:1 off the unfocused #273136, pardes needs 1.5:1 on a dark page
monokai_pro_machine: unfocused tag text #8b9798 -> #8d999a: 4.42:1 on #273136, tag text needs 4.5:1 to be read and run
monokai_pro_machine: rules between panes #1d2528 -> #485152: 1.17:1 off the page, lifted toward the text to 1.6:1 (as colors.zig separatorOf does)
monokai_pro_machine: scroll thumb #3d474b -> #444e52: 1.39:1 on its track #273136
monokai_pro_octagon: focused tag ground #282a3a -> #4a4642: 1.00:1 off the unfocused #282a3a, pardes needs 1.5:1 on a dark page
monokai_pro_octagon: unfocused tag text #888d94 -> #8d9298: 4.24:1 on #282a3a, tag text needs 4.5:1 to be read and run
monokai_pro_octagon: rules between panes #1e1f2b -> #4b4d57: 1.15:1 off the page, lifted toward the text to 1.6:1 (as colors.zig separatorOf does)
monokai_pro_octagon: scroll thumb #3d3f4e -> #444655: 1.36:1 on its track #282a3a
monokai_pro_ristretto: focused tag ground #2c2525 -> #514332: 1.00:1 off the unfocused #2c2525, pardes needs 1.5:1 on a dark page
monokai_pro_ristretto: unfocused tag text #948a8b -> #968c8d: 4.48:1 on #2c2525, tag text needs 4.5:1 to be read and run
monokai_pro_ristretto: rules between panes #211c1c -> #4d4747: 1.12:1 off the page, lifted toward the text to 1.6:1 (as colors.zig separatorOf does)
monokai_pro_ristretto: scroll thumb #433b3b -> #4b4242: 1.38:1 on its track #2c2525
monokai_pro_spectrum: focused tag ground #222222 -> #45412d: 1.00:1 off the unfocused #222222, pardes needs 1.5:1 on a dark page
monokai_pro_spectrum: rules between panes #191919 -> #454447: 1.11:1 off the page, lifted toward the text to 1.6:1 (as colors.zig separatorOf does)
monokai_pro_spectrum: scroll thumb #39383a -> #413f42: 1.36:1 on its track #222222
monokai_pro_light: focused tag ground #faf4f2 -> #f5d1d9: 1.00:1 off the unfocused #faf4f2, pardes needs 1.25:1 on a light page
monokai_pro_light: unfocused tag text #918c8e -> #716d6f: 3.04:1 on #faf4f2, tag text needs 4.5:1 to be read and run
monokai_pro_light: focused tag text #e14775 -> #a73557: 2.80:1 on #f5d1d9, tag text needs 4.5:1
monokai_pro_light: rules between panes #ede7e5 -> #c6c0c0: 1.12:1 off the page, lifted toward the text to 1.6:1 (as colors.zig separatorOf does)
monokai_pro_light: scroll thumb #e5e0de -> #cec9c8: 1.20:1 on its track #faf4f2
monokai_pro_light_sun: focused tag ground #f8efe7 -> #f0cdcf: 1.00:1 off the unfocused #f8efe7, pardes needs 1.25:1 on a light page
monokai_pro_light_sun: unfocused tag text #92898a -> #726b6c: 3.00:1 on #f8efe7, tag text needs 4.5:1 to be read and run
monokai_pro_light_sun: focused tag text #ce4770 -> #9d3655: 3.01:1 on #f0cdcf, tag text needs 4.5:1
monokai_pro_light_sun: rules between panes #eee5de -> #c7bebb: 1.09:1 off the page, lifted toward the text to 1.6:1 (as colors.zig separatorOf does)
monokai_pro_light_sun: scroll thumb #e4dbd5 -> #cac1be: 1.20:1 on its track #f8efe7
|
| |
|
|
|
|
|
|
|
| |
Every colour is the original's own, cited file:line in each theme file.
Sources:
Sublime Text 2.0.2's Monokai.tmTheme (Wimer Hazenberg), from 'Color Scheme - Default.sublime-package'; https://download.sublimetext.com/Sublime%20Text%202.0.2%20x64.tar.bz2; ~/05-genizah/sublime-text-2-color-schemes/Monokai.tmTheme
Chrome moved to meet pardes's floors (text, syntax, ANSI untouched):
monokai: focused tag ground #49483e -> #59584f: 1.19:1 off the unfocused #3e3d32, pardes needs 1.5:1 on a dark page
monokai: rules between panes #3b3a32 -> #4a4941: 1.30:1 off the page, lifted toward the text to 1.6:1 (as colors.zig separatorOf does)
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
alucard
Every colour is the original's own, cited file:line in each theme file.
Sources:
official palette (Dracula, Alucard); https://github.com/dracula/dracula-theme; ~/05-genizah/dracula-theme; 1e04a4b768302fa2de37d09cc7b8087eabcd3ed8
official VS Code port: roles, UI, ANSI, Soft transform; https://github.com/dracula/visual-studio-code; ~/05-genizah/dracula-visual-studio-code; a08a206f2c8420ba3c05f0e8d01d43b2f933fdf8
Chrome moved to meet pardes's floors (text, syntax, ANSI untouched):
dracula: focused tag ground #282a36 -> #41434d: 1.11:1 off the unfocused #21222c, pardes needs 1.5:1 on a dark page
dracula: unfocused tag text #6272a4 -> #7b89b3: 3.36:1 on #21222c, tag text needs 4.5:1 to be read and run
dracula_soft: focused tag ground #282a36 -> #454751: 1.05:1 off the unfocused #272727, pardes needs 1.5:1 on a dark page
dracula_soft: unfocused tag text #7b7f8b -> #8b8e99: 3.74:1 on #272727, tag text needs 4.5:1 to be read and run
alucard: unfocused tag text #6c664b -> #5d5841: 3.75:1 on #cfcfde, tag text needs 4.5:1 to be read and run
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
solarized_light
Every colour is the original's own, cited file:line in each theme file.
Sources:
canonical palette and ANSI map; https://github.com/altercation/solarized; ~/05-genizah/solarized; 62f656a02f93c5190a8753159e34b385588d5ff3
the author's vim port for roles; ~/05-genizah/solarized/vim-colors-solarized/colors/solarized.vim
Chrome moved to meet pardes's floors (text, syntax, ANSI untouched):
solarized_dark: unfocused tag text #073642 -> #01090b: 2.92:1 on #657b83, tag text needs 4.5:1 to be read and run
solarized_dark: focused grip #268bd2 -> #2483c5: 1.38:1 on the focused tag #93a1a1
solarized_light: unfocused tag text #eee8d5 -> #2b2a26: 2.58:1 on #839496, tag text needs 4.5:1 to be read and run
solarized_light: focused tag text #eee8d5 -> #f0ebda: 4.39:1 on #586e75, tag text needs 4.5:1
solarized_light: focused grip #268bd2 -> #2f90d4: 1.46:1 on the focused tag #586e75
|
| |
|
|
|
|
|
|
|
|
| |
Every colour is the original's own, cited file:line in each theme file.
Sources:
VS Code 1.130.0 built-in theme; /usr/share/code/resources/app/extensions/theme-defaults/themes/dark_plus.json (includes ./dark_vs.json)
VS Code source for workbench defaults; https://github.com/microsoft/vscode; ~/05-genizah/vscode; 1b6a188127eeaf9194f945eb6eb89a657e93c54c (tag 1.130.0)
Chrome moved to meet pardes's floors (text, syntax, ANSI untouched):
dark_plus: unfocused tag ground #2d2d2d -> #3c3c3c: 1.21:1 off the focused one (the page, kept), pardes needs 1.5:1 on a dark page
dark_plus: unfocused tag text #969696 -> #a7a7a7: 3.73:1 on #3c3c3c, tag text needs 4.5:1 to be read and run
|
| |
|
|
|
|
|
|
|
|
|
| |
as legacy, a section per ported family
The picker's headings come from colors.theme_groups instead of one split at
native_theme_count, so acme (current, matched to plan9port acme's source)
no longer sits under a legacy heading. Ring order follows the sections:
the fifteen pardes palettes, acme, lapis, the faithful ports a family at a
time, then helix and dark, then the imports. An imported theme whose name a
port takes gets _helix, as zed's carry _zed.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
chain
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.
|
| |
|
|
|
|
|
|
|
|
| |
A column's plaque now starts at its grip's end, where the pane plaque under
it starts, and every plaque in a column ends at the same x, far enough short
of the next column's rule that no shadow meets it. Where tag bands meet (the
workspace's over the columns', a column's over its first pane's), the upper
box runs down to the ruled edge with no shadow down, and the lower box lays
its top frame over that edge, so there is one line between them, not two
frames and a gap.
|
| |
|
|
|
|
|
| |
The curtain's glyph slide becomes a wipe: the new grid behind a head that
crosses the pane, the old ahead, and between them two columns whose colours
step from the old ground to the new in OKLab (CharSource.edge). Only the
head's columns change from frame to frame.
|
| |
|
|
|
|
|
| |
ThumbFlash (off by default) brightens a body's scroll thumb toward the ink
when its view moves and fades it back over 250 ms, truecolor only. The tty
present path now clears shell_continuous once before its effects and each
effect only raises it, so the trail and the flash no longer mask each other.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
ChipShadow on|off (off; the tty shell's, §9.2 T1): each notice chip casts
a shadow one cell right and one down inside its own pane's body: on a
blank cell a half block (▌ right, ▀ below, ▘ at the corner) in a colour
35% darker than the ground (OKLab), so the shadow is half a cell thick;
under text the ground itself darkened. Never the cursor's cell, a
selection, a tag or another chip; truecolor terminals only.
Tests: the shadow lies right of or below the chip, never in it; nothing
with it off or without truecolor. Snapshots unchanged. Feel review:
.scratch/render/tty/shadow/.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
animation.dissolveRevealed (the tty compositor's dissolve and the pointer
mapping that follows it) swaps each changed cell once at its place in a
4x4 Bayer matrix, shifted by the pane's serial so two panes differ,
instead of at a hashed noise threshold: the new content comes in as an
even patterned screen (§9.2 T4). Endpoints stay exact.
Tests: a 4x4 block reveals exactly t x 16 cells at t = 1/4, 1/2, 3/4.
Snapshots unchanged. Feel review: .scratch/render/tty/dissolve/ (the
matrix over two real frames; the recorded session's pane did not
animate, noted in docs/effects.md).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
JumpTrail on|off (off; the tty shell's, §9.2 T2): a jump of three cells or
more leaves three to five cells of trail behind the cursor along its path,
their ground mixed toward the text's colour in OKLab (most beside the
cursor), fading out over 120 ms. Truecolor terminals only (vaxis's answer,
or COLORTERM truecolor/24bit); never the cursor's own cell, a selection or
anything outside the focused pane's body; none under Motion off. It rides
the continuous path (Pardes.shell_continuous) while it lasts; a few cells
of output a frame. docs/effects.md opens the terminal track with the audit
under decision 2 (keep and polish, remove nothing).
Tests: a ten-cell jump lights 3 to 5 cells behind the cursor on its row,
gone by 120 ms; a one-cell step and a terminal without truecolor light
none. Feel review: .scratch/render/tty/trail/ (a real tty session replayed
through pyte at 60 fps).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Afterglow on|off (off, a pixel shell's; Chrome.fx bit 4): the GUI keeps
the grid it last drew and when each cell changed; a body cell whose text
changed glows in the theme's accent, at most 18% and under the text's
contrast floor, fading with an ease-out over 250 ms, one flat rectangle a
run of cells that changed together; never a tag or a grip, the cursor or a
selection; a scrolled body (its first line moved) starts over rather than
lighting up whole. On the continuous path while anything glows.
Tests: three changed cells glow as a run of two (the cursor's left out),
gone by 250 ms, a scroll lights nothing. Gates as before; goldens
byte-identical. Feel review: .scratch/render/afterglow/.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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/.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
test/gui_golden.py hashed a scene once two captures 400 ms apart agreed;
on a loaded machine a slow frame agreed with itself before the scene's
change landed and every later hash moved up a scene. A test window now
writes a status file into its capture directory each loop step (gui.zig
writeTestStatus: step, frames captured, idle — nothing owes a frame,
nothing moves, nothing waits on the core's clock), and the harness waits
for an idle step two past the one current when it asks: a 9P write has
been served by then, so the frame is the scene's. Two things kept a
window from ever going idle, both fixed:
- Look-hover re-armed forever: resting on a word with nothing to open, the
hover wait ran its two frames, found nothing, cancelled, and the next
present's pointer refresh started it again: a frame every other frame
for as long as the pointer rested there, live too (CPU). The place last
refused is remembered (Pardes.look_hover_refused) until the pointer
moves off it.
- The virtual clock moved only on a wait that timed out, so a steady
trickle of events held it still; it now moves to the core's wake too
when an event cut the wait short and nothing owes a frame.
Captures go to a directory of their own, outside the session's (a file
written there every frame is a change in the directory its panes look
at). All 17 goldens match the file as recorded at oooopqyv; eight runs,
five alongside a ReleaseFast build and three with all 16 cores saturated
(load 13-19), were byte-identical, 14 s a run unloaded (was ~30).
Tests: the resting pointer lets the core go idle.
|
| |
|
|
|
|
|
|
|
|
|
| |
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).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
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/.
|
| |\ |
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
ChromeTheme.interpolate mixes each colour in OKLab (colors.mixOklab), so a
fade between hues keeps its lightness instead of going dark and muddy mid
way; animation.Fade eases it in and out (smooth), and one retargeted mid
fade eases out from where it shows, so it never stalls. Still 10 frames
(160 ms). The page, text and syntax colours change at once as before.
Tests: OKLab round-trips its ends exactly and keeps a red-to-green mid-way
brighter than the sRGB mix. Gates as G9 (no golden moved). Feel review:
.scratch/render/crossfade/.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
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/.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The notice chip's motion was mostly there (a drop easing out on the
Motion flavour, a dissolve easing in, Lift's shadow in tier 4 at its
fade). Its dissolve took 300 ms against a 180 ms fall, the wrong way
round for §8.1 (leaving quicker than arriving, 100 to 160 ms):
MessageDissolve now defaults to 150. The field comments had the two
easings swapped; the stack test pins a longer dissolve for the case it
checks. docs/config.md and docs/effects.md say so.
Tests: both timings in their bands, leaving quicker. Gates as G7 (no
golden moved). Feel review: .scratch/render/notices/.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
dissolve crossfades
- Track.launch: a move retargeted mid-way (Presentation.sync) starts at
the old move's speed along the new one's longest side (carriedLaunch,
Motion.easeFrom/speedFrom), so a second change during a slide bends the
motion instead of stopping it dead. The macOS track ABI grows the float
(pardes.h, 48 bytes; its reserved byte is named motion, as in Zig).
- A pane that slides, zooms or rises casts Lift's soft shadow at
sin(pi x progress) of its strength, on the other panes' bodies and
rails alone, under the same contrast ceiling, carried by its track.
- The GUI's PanelDissolve is a crossfade: the new cell drawn first, the
old one over it at 1 - progress, premultiplied, on the blending cell
pipeline for such groups (new cells now emitted before old ones, as the
old layers already came after the new). sRGB blend, not linear light
(documented). The tty keeps its per-cell swap.
Presentation.zig's and animation.zig's tests were not in any test root;
pardes.zig's test block now takes them in.
Tests: a retargeted move carries its speed and still lands exactly; a
moving pane's shadow is clipped off every tag, grip and its own body,
none at the start or the landing, most mid-way. GUI golden 18 changes by
the shadow (frame 6 of a slide). Gates as G6. Feel review:
.scratch/render/transitions/.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
A mouse wheel's notch (SDL's whole-number step, notchOf) scrolls the core
by its lines at once, so keys and clicks act where the text is, and the
picture follows on the Motion flavour's spring at half again its pace,
critically damped whatever the flavour (text never passes its mark),
carried from its current speed (animation.Spring.carry), so notches in a
row flow on. How far the rows moved is measured on the next frame against
the last (Glide.measure: a wrapped line's rows, a terminal's output, with a
couple of rows' slack for the cursor's line and its number); the rows that
left are kept, nearest first, and drawn in the gap the lag opens; the lag
is never more than the body's height. A touchpad's fractions move the
picture under the finger as before; `Motion off` lands a notch at once;
a PDF page scrolls as before.
The glide runs on the core's continuous path: Pardes.shell_continuous
keeps frames coming every loop while it moves and carries a virtual clock
with it; idle, nothing. The test feed takes wheel events
(ESC]777;mouse;wheel;<amount>;<x>;<y>BEL).
Tests: notch vs fraction; a carried spring keeps its speed and never
passes its mark; a notch over two-row lines lags two rows, keeps the rows
that left, settles frame by frame and leaves the continuous path, and
lands at once with Motion off. Gates as G5. Feel review:
.scratch/render/scroll/glide-{smooth,crisp,bouncy,off}{,-quarter}.mp4 and
strips (a notch down, three, then two up).
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
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).
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Three bundled Shadertoy passes beside Crt, each `Bloom|Vignette|Grain
0..3` (off by default, nothing drawn while off), in shaders/post/:
- Bloom: what is brighter than the page (a channel's linear peak over
0.75/0.7/0.6 and over the page's own + 0.15, so a light page does not
bloom) glows, 2/3.5/5% (§8.2's budget). The glow is a dual Kawase blur
in RGBA16F textures at half size and down, 3/4/5 steps by level
(shaders/bloom-down, bloom-up; Post.bloomChain), composited in linear
light and dithered.
- Vignette: round, from halfway to a corner, 10/18/28% at the far corners,
in linear light, dithered.
- Grain: a still, triangular-spread grain of 1.5/3/5 of 255 on
page-coloured pixels only, a logical pixel big; still, so it asks for no
frames.
Focus rule: the shell passes every bundled pass the rectangles of the tags
with their grips, the column and workspace tags, the notices and the
cursor (pardesSpare, at most 32, neighbours on one row merged), and a
bundled pass leaves them as they are; and a per-theme ceiling (pardesCap,
Post.capsOf) keeps the page's text and the selection's text at min(their
contrast, 4.5) under each pass at its strongest. User files get no
ceiling and no spared rectangles.
Fix found on the way: SDL GPU binds at most 4 KiB of a uniform block, so
every Shadertoy colour after iPalette (iBackgroundColor, iForegroundColor,
the cursor and selection colours, iPalette[>=4]) read zero. The prefix's
block is cut in three (Globals, Palette, Colors) with ghostty's names and
order, each pushed as a slice of the one struct; pardes's own block moves
to binding 3.
Tests: the caps hold over every native theme; each uniform slice fits
4 KiB; the prefix's members in ghostty's order across its blocks.
Gates: tty/gui unit-test and core-test pass; snap fails only
nested-optout; GUI goldens 01-08 byte-identical (09-18 wait on
wkzlsqvy, as in somtrmsz); web builds. Feel review material:
.scratch/render/{bloom,vignette,grain}/ (levels on forge, dusk, acme,
crops, a levels mp4).
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
separators and focus tints
Density: dp() in gui.zig draws every size given in pixels in logical
pixels (SDL's window display scale, rounded, at least one), as acme scales
Border, ButtonBorder and Scrollgap: the rules (rule_px), the tag rule, the
grip's ring, its dirty gap and mode bars, the rail's gap to the text and
its minimum, the thumb's inset, the rim, a bar cursor's minimum width,
underline and strikethrough thickness (the atlas is dropped on a scale
change), the rule-grab margin, and the Crt's scanline and mask periods
(pardesScale in the post prefix). Cell- and tagline-measured sizes stay:
the rail's width, Lift's blur and offsets, every motion; iResolution,
fragCoord and iMouse stay in the display's pixels, as ghostty's.
PARDES_TEST_SCALE forces a density in a harness (a test window is 1x
otherwise, whatever display it lands on) and sizes the test font with it.
Colours: a separator that stands off its page by less than 1.5:1 is lifted
toward the text to 1.6:1 (helix, atelier, paper; a theme with no page,
dark, is judged against #121212), and empty_col follows it. forge's own
rule already stands at 3.83:1; what hid it was density: 2 device pixels
on a 3x screen, now 6 (dp). A focused tag's tint closer than 1.5:1 to the
plain tag on a dark page (1.25:1 on a light one) is pushed further the way
it leans, as far as its text keeps its own contrast or 4.5: forge
1.23 -> 1.51 (#2d3440 -> #374253), and likewise dusk, orchard, ink,
lagoon, clay, harvest, spectrum, solarium, forge_soft; daybreak, atelier,
paper to 1.25. dark and helix gain a tint of their own (dark: #484566
under #c8c8c8, 1.54:1; helix: ramp 237 under 250, 1.65:1).
Tag caret: past a full row's end, the G3 glide box sits on the tag's right
edge, where the layer's caret and the pixel shell's are.
Tests: every native theme's separator >= 1.5 and every dark one has a
tint >= 1.25 with readable text; forge keeps its own border; the tag caret
glide box at a full row; at 2x the spine, tag rule, ring, rail start and
gap, and bar cursor double. Legacy-ThemeFile test strips helix's new pair.
Goldens: snapshot goldens change in colour rows only, the tints (orchard
#283a2f -> #314738 at boot, forge, helix and dark in theme/themesel).
GUI goldens: the harness's single Del of the renamed wide pane is refused
since ysqnkyoy (a rename counted as unsaved; fixed on the 9P line in
wkzlsqvy), so scenes 09-17 were recorded with that pane open and the file
was stale since the merge (08 and 18 also moved with ykvnltvs's full-row
tag wrap). The goldens here were recorded with that pane closed (as
wkzlsqvy will close it); against the parent's binary under the same
conditions they differ only in the tints: 01-13 forge's (#2d3440 ->
#374253, and the glyph edges on it), 14 ink's; 15-18 are byte-identical.
Until wkzlsqvy is merged, a run here fails 09-17. Each commit reproduces its own
recorded goldens on this machine (checked at kvtmqkyn). A test window is
1x unless PARDES_TEST_SCALE says otherwise, whatever display it opens on.
Prebuilt shaders refreshed from their sources.
Captures: .scratch/render/dark-borders/{before,after,compare,scale2,scale3}.
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
`name` trimmed blanks off both ends, so `trailing.zig ` named another
file than the one written without a word. acme refuses any blank in a
name, `bad character in file name` (xfid.c:650); pardes takes one inside
(it names files with spaces) and now refuses one at an end, and a
control character, in acme's words.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| | |
`err - exec: ...` said nothing of where the line ran; the root's exec and
look run at the keyboard's pane, and their err now names it, as a click
there would.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| | |
At 80x24 a script's third or fourth pane/new was refused for want of
rows. `size` still sets any other size, and a frontend attaching its own.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
is said as `dial failed: <reason>`
Mount took any well-formed dial and nothing was found out until the
first look through it, which then said `look: look: dial`. Mount now
probes the peer (version, attach, its root) with the turn out, and fails
its write, mounting nothing, when none answers; the dial errors read as
words, `no answer`, `timed out`, `hung up`, and a look through a peer
gone since names its path: `look: /n/peer/f: dial failed: no answer`.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| | |
tagexec's does
A word run from a header runs in the session's directory (execDir), but
New named its scratch after the pane with the keyboard.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Every look that found something cleared the looker's selection first, so
`@p5:2` or `f.txt:2` written to a pane's look collapsed its dot to
q1-1. Only a look that stays in the pane starts from a clean selection
now; one that goes elsewhere takes away just the click's highlight, and a
miss changes nothing, as acme's look does.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
reads the first word
In acme flag 2 promises a second record with the expanded range, and
acme's libraries read one. F records set it always and a click with no
range known set it, with none following: a library then took the next
event for it. Records here carry the word already, so 2 is never set.
Flag 1 now reads the first word as acme's lookup does, so `Msg hi` is 1.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| | |
Repeated `/^/` from #3 stayed at #3: the search found the empty match
where it started and called that the next one. sam (editors/sam/
address.c:97-119) searches again a character on, or back, wrapping; so
does addr now, and `/$/` and `/x*/` step as they should.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
The check read how the weights shared the rows after the resize, not
whether the rows could hold every pane's tag and two rows: a pane the
proportional squeeze took short made `size` refuse, growing included,
and refuse sizes it took a moment before. It now asks layout.minRows,
the minimum placement asks, per column; a size they fit is taken, and a
pane the resize took under its minimum gets its rows back. An out of
range size says `invalid size`, which 9ns reads as EINVAL, as the doc had.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| | |
`file:?foo?`, `@p5:?foo?` and `:?foo?` were not taken for addresses (the
first character had to be one of `0-9+-/$.#,;`), so they went the path
way and found nothing.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| | |
Only a line number reached a terminal (the line way); any other address
went to lookAddress, which wanted a file and said the terminal was no
text. The body is now the lines a +Search of it lists, addressed from the
cursor, and the match selected as a +Search row's range is.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| | |
active pane
`@p<serial>:<line>` goes the line way (parsePathLine), where a serial
naming no pane quietly did nothing and look read back the active pane.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
err never cuts a list
Exit's refusal joined every name into one err, cut at the record's cap in
mid-name, so a script could not tell which panes held it up. Each pane is
now an `unsaved` record before the err, and the err names the one pane
or counts them: `4 unsaved panes: Modified (Exit again to discard)`.
Restore, Del and Delcol refuse the same way.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
A failure said while it ran (Exit's refusal, a Del refused) or later by
the host (a Save's write, a Dump's) left `msg N Save` in the log as if it
had worked. The announcement's record is remembered and taken back out
on either, unless a follower read it already. A refused pane/new logs its
err alone, and a failed Dump says its reason in words (`file not found`,
not `FileNotFound`) so its msg goes and the err is the one record.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
smaller window
A terminal of one body row loses its prompt's mark and reads busy for
ever. Placement already refused to make one that short; now layout never
leaves one there either: a grip drag stops at the floor, and a column
squeezed by weights or by the window takes the rows from its other panes.
Text panes keep acme's way and can still be dragged to their tag, since
acme has no terminals to follow. The shrinktag, splitparent and cornerdrag
goldens are re-recorded for it, shrinktag's re-grab moved to where the
grip now is.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
split from the right, busy names its program, chord follow-ups, /commands rows, Exit's second refusal
Dogfood round 16 took these literally and found them false: bash ran the
echo after Kill as fish does; a name with spaces broke split(maxsplit=3)
since the row ends with the column serial; pty/run's busy line names the
program; /commands rows end in a description; a second Exit refusal names
only panes edited since.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| | |
A Msg past 256 bytes was cut mid-word and silently: nothing told a reader
of /log that the line went on.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| | |
87 of the listed words had no description: settings have no doc comment
to read, so each now carries a one-sentence doc, and the builtins without
one got theirs. Exit's no longer names an internal function, and Repl's
first sentence is short enough to be read whole.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
write's does
Under the one rule a click fails its write too, but only a ctl write
assembled the `<a>, <b>: Modified (Exit again to discard)` line: a click
failed with the first pane's name alone.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
active pane's
No pane asked for it, so borrowing the directory of whichever pane last
had the keyboard named it after an accident; acme's new window has acme's
directory.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
busy for ever
A one-row pty loses the prompt's input mark as soon as the prompt wraps,
and busy detection never sees the shell idle again. Placement already
keeps a new terminal at tag + 2 rows; a winsize write now keeps the pty
at two. A pane dragged down to one body row keeps a one-row pty, since
a taller pty than the pane shows would put its cursor below the pane.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
|