| Commit message (Collapse) | Author | Age |
| | |
|
| |
|
|
|
|
|
|
|
|
| |
Clicking anywhere in a dimmed article glides it to the centre and so,
through the observer, switches the recording. Three guards keep the
click meaning navigation: the active step does not react (clicks there
are for reading and selecting, not going where you already are), a
selection is not a click, and a link is a link. The pointer cursor and
the title's breath of pink now belong to dimmed steps only -- the
active one is just prose.
|
| |
|
|
|
|
|
|
|
| |
Proximity snapping traps at the edges: between steps, adjacent fields
hand you from magnet to magnet, but at the first and last there is no
next field -- a wheel tick toward the hero or past the final demo ends
inside the boundary step's radius and is pulled straight back, forever.
The interior steps keep their snap-align; the doorways go without,
because a doorway that grabs is worse than a step that does not snap.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
scroll-snap-type: y proximity on the root, snap-align: center on the
steps and nothing else: a scroll that ends near a step is settled onto
its centre -- the exact spot the tour activates it, so the rest
position and the lit step agree -- and momentum, half-reads and every
snapless section are left alone, by spec. Proximity, never mandatory:
the mandatory kind on a page that also has prose is a trap, and the
JS kind is worse. Off in the one-column layout, where the sticky
stage covers the upper viewport and a centred step would sit half
beneath it.
|
| |
|
|
|
|
|
|
| |
Clicking an article's h3 glides it to the middle of the viewport --
the exact spot where the tour's observer activates it, so the click
also switches the recording, through the same door scrolling uses
rather than a second mechanism. The pointer cursor and a breath of
pink on hover say clickable.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Two overlaps the section observers missed. The show opened on the big
logo leaving, but the hero's buttons sit below it, so there was a band
of scroll with the little logo arriving on top of install/try/docs --
observe the whole hero instead. And at the tour's exit the stage
unpins and is dragged up through the logo's air before the try section
crosses its line -- no section boundary says so, but two rects do: a
rAF-throttled collision check against the pinned player's rect, and
whenever the terminal would touch the logo, the logo yields.
Verified by sweeping fifteen scroll positions: shown through the whole
tour, hidden over the buttons, the rising terminal, the demo box and
the install tabs, with zero overlapping frames.
|
| |
|
|
|
|
|
|
| |
padding 1 2 was still in force when compact arrived, and the dense
school reads best with the panes flush against its dividers. The cast
now takes the padding back first -- cc rewrites the line to padding 0
on camera, one more save applying live -- so the compact beat lands on
the layout it was designed around.
|
| |
|
|
|
|
|
|
|
|
| |
vim -u NONE kept the render machine's dotfiles out of the cast, but
NONE also switches off filetype detection and syntax -- so the config
demo was editing kdl in monochrome, underselling vim and the file both.
The demo now authors its own six-line vimrc instead: syntax on,
habamax (the webdemo's own look), shortmess for the column. The cast
depends on vim's runtime and nothing personal, which is what NONE was
protecting in the first place.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
| |
C-a e arrived as a strip along the bottom, and a 66-line config in a
twelve-row strip reads like a keyhole. A quarter turn (C-a Space)
right after it opens makes the editor a column with the height the
file deserves -- and shows off the rotate while at it.
The column brought back vim's hit-enter stall (the file-info message
wraps at 49 columns), so the recording's EDITOR gains the same
shortmess the webdemo's vimrc already carries.
|
| |
|
|
|
|
|
|
|
| |
window.SLOSHCAST_SPEED, multiplied into each mount's own data-speed:
the front page sets 1.25 and every recording plays a quarter faster
than authored, the scripts under demos/ untouched -- their pacing is
theirs, and how much of it a visitor's attention span gets is the
page's call. The clock keeps counting cast-time, so the timestamps
mean the same thing at any speed.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The title drag had one beat -- drop in the middle, trade places --
which undersells the feature: carried over a pane, the target
subdivides into a centre and four edge bands, a band meaning "in
beside it, on this side", filling the half it would hand over while
every other candidate greys out. The cast now lingers over the centre,
steers into a band, and drops -- and the drop restacks the whole tab,
a rearrangement no swap could produce, chosen so the release visibly
changes the layout (the first cut dropped a pane beside the neighbour
it already had, and proved nothing).
The band is aimed by its entry in the compositor's hit list, like
every coordinate in these demos: the rect the program promised is the
rect the pointer hits. The panes article's bullet follows suit.
|
| |
|
|
|
|
| |
The tour-width breakout belongs to the machine, not to the offer of
one: unbooted, the panel now sits flush with the prose and the install
box; booted, it still takes the tour's width and most of a viewport.
|
| |
|
|
|
|
| |
A real ghost button centred under the running machine, in the hero
buttons' own dress -- ghost on purpose: booting stays the loud verb,
stopping the quiet one. The caption drops to a side note beside it.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
A caption under the running machine offers the off switch, dressed as
a link inside a sentence. Dropping the iframe out of the DOM tears the
whole VM down -- emulator, kernel, disk cache, the lot -- the stage
shrinks back into the poster (the original nodes come back from a
stash, listeners and all, so the boot button is immediately live
again), and the scroll follows both ways.
Reload always did this; the button does it without taking the rest of
the page with it.
|
| |
|
|
|
|
|
| |
Two logos in quick succession -- the splash's, then the welcome
float's -- reads as a glitch, not a greeting, technically correct or
not. splash_ms 0 in the guest config; the comment leaves the knob
visible for anyone editing their way through the playground.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
A try section between the tour and the install box: a modest poster
with one button, and the machine only when the button is pushed -- the
front page keeps costing two files, which is the decision the README
recorded when the demo got its own page, still being honoured.
The click grows the stage to most of a viewport *before* the iframe
goes in (the guest reads its geometry from the room exactly once, at
boot), then glides the scroll to land the machine centred. An iframe,
not the demo's scripts inlined: the emulator's emscripten glue owns
its globals by name, and isolation is what keeps this page and that
blob out of each other's namespaces. ?embed=1 makes the demo page
drop its own header and footer inside the frame; standalone it is
unchanged, and phones navigate to it rather than embedding -- wasm
under a soft keyboard in an iframe helps nobody.
The floating logo learns the tour's edges properly while at it: the
try section arriving closes the show (measured with a -45% rootMargin,
because the tour's exit margin lets the section ride high while the
last step is still centred), and a section scrolled past counts as
arrived, not gone.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
Fewer colours at once, more per second: the gradient slims to three
stops -- pink, orchid, blue -- and the hue rotation takes over the
variety, a full wheel in 4s (5s in the reduced-motion lane, colour in
place, still nothing travelling). The slide drops to 5s with it.
And a drop shadow, inside the hue keyframes because the filter
property is the animation's to own -- a static filter would lose to
it -- and listed before the hue-rotate so the glow is rotated with
the letters and always matches their current colour. Soft and low:
on a near-black page a shadow can only read as a faint underglow.
|
| |
|
|
|
|
|
|
|
|
|
| |
Both of the owner's browsers showed the cycle frozen, and the culprit
was neither of the browsers: the OS asks for reduced motion, both pass
it on, and the media rule here answered by killing every animation.
The preference is about motion -- patterns that travel, the vestibular
kind -- not about colour, so the position slide goes and the in-place
hue rotation stays, at half speed. Nothing moves, everything still
breathes, and a visitor who asked the OS for stillness gets exactly
the stillness they asked for.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
More of the wheel -- the gradient now walks pink, orchid, blue, cyan,
mint and back, all colours the demo's own terminal palette already
speaks -- and a faster walk, 8s to the position slide's loop.
And a second motion: WebKit caches a text-clipped paint and never
repaints it for a background-position animation, so on Safari the wash
sat frozen, pink on the left, cyan on the right, which rather defeats
a colour cycle. A hue rotation runs alongside (12s to the full wheel):
filters apply post-paint on the compositor, so every engine animates
it over the cached clip. Chrome and Firefox get both motions, WebKit
gets the rotation alone -- either way, nothing stays pink.
|
| |
|
|
|
|
|
|
|
| |
A gradient of the pink's neighbours -- orchid one side, a lighter pink
the other -- clipped to the ink and slid along it, one tile every
fourteen seconds: the logo's own little colour pass, in the spirit of
the shaders it advertises. Horizontal on purpose, because only a 90deg
gradient meets its own edge seamlessly when the loop wraps; animated
only while shown, and not at all under prefers-reduced-motion.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
A fixed top worked at one viewport height and overlapped the pinned
terminal at others: the terminal's top edge is (viewport - the stage's
lift padding) / 2 - half the player, which no constant tracks. Measure
it instead, centre the logo in what remains, and hide it outright when
a short viewport leaves no air -- hiding beats overlapping.
Re-placed on resize and by a ResizeObserver on the player mounts, not
on the pin: the players are zero-height until their casts arrive, and
the pin is a 100vh box that never resizes, so watching it would freeze
the placement at the pre-load height.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
xterm turns a mouse event into a cell with getBoundingClientRect() and
its own unscaled cell metrics, so the scale() that stretched the fixed
grid into the stage put every click on the wrong cell, off by the
scale factor. Desktop kept the factor near 1 -- cols and rows are
derived from the same room the scale fills -- so it passed for
working; a phone is forced onto the 80-column floor, the factor lands
near a half, and a tap selects a pane the finger never touched.
Refit the font size instead: walk it until the grid fills the room
(iterated, cell metrics are not linear in font size), centre the
leftover with translate, which moves rect and clicks together. The
grid stays what the guest was told at boot; only the glyphs move. A
webfont resolving late changes the metrics under the fit, so refit
again when document.fonts settles.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The overlay grows into a first session worth having:
- The config is a playground now -- every theme the repo ships rides
along as an include one word away, and the settings worth flipping
(compact, shaders, keys, dim_unfocused) sit commented in the file,
each one uncomment-and-save from happening on screen.
- C-a e opens vim, not busybox vi: editor "vim" in the config, since
the image always carried the real vim and its kdl syntax without
ever launching them. shortmess in the vimrc keeps the file-info
message from wedging a narrow pane into a hit-enter prompt.
- The config starts open, highlighted, in a pane of its own: the
discovery C-a e would make, made before anyone has to make it.
- A welcome float greets over everything, the slosh logo on top,
centred by the layout engine at whatever size the browser gave the
terminal (the previous commit is its enabling act). It teaches its
own dismissal -- C-a x, or the X it wears -- and it never exits on
its own, so keep_dead has no corpse to keep.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
C-a F drops a throwaway shell over a working layout; a monitor runs in
it, moves with the keys that move boundaries, grows about its centre.
Then C-a ?, the cheatsheet built from the bindings actually in force,
and exit closes the float with the layout exactly as it was.
The monitor is an htop impression with authored numbers, not htop: a
recording that renders differently every run is a bug here, byte-for-
byte is the contract. Phosphor, because every cast in the tour records
under its own theme so the next step reads as a scene change.
|
| |
|
|
|
|
|
|
|
|
|
| |
Block glyphs' ink can round a hair narrower than the monospace advance,
so the ascii logos showed hairline gaps between characters that should
read as solid ink; -0.05em of letter-spacing tucks each glyph into the
last, on the floating logo and the hero's alike.
The floating logo also stops dressing as a link on hover: the global
a:hover underline through seven rows of block glyphs was a mess, and
the colour flash no better. It still is one -- the pointer says so.
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
An ed25519 key made for exactly this -- slosh package signing
<slosh@slosh.foo>, 0F67C909938CFFA8A76B59FD8D69B55A0E9056B9 -- signs every
package and both indexes. The public half travels two ways that would both
have to lie: contrib/arch/slosh.asc in git, and /arch/slosh.asc on the
website; the READMEs walk through pacman-key --add and --lsign-key, and the
[slosh] stanza loses its SigLevel override because pacman's default demands
signatures and now gets them.
contrib/arch-repo pins the fingerprint, refuses to run without the secret
key (an unsigned update would make every enrolled pacman refuse the repo),
and now regenerates the index from the directory every time: repo-add skips
an entry whose version it already has, so after a same-version rebuild an
incremental add left the db describing the previous bytes -- a checksum
mismatch for every client. An index rebuilt from disk cannot disagree with
disk. Verified end to end with a scratch pacman keyring: enrolled key
syncs and downloads under Required DatabaseRequired, unenrolled key is
refused at the database.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
AUR signups are closed while the AUR deals with supply chain attacks, so
the package is published from our own roof -- which is the better offer
anyway: a pacman repository serves built packages where the AUR hands
every user a rebuild. contrib/aur/ becomes contrib/arch/ (the .SRCINFO
goes; it is AUR metadata, regenerated in a minute when signups reopen),
and contrib/arch-repo builds the package and maintains the slosh.db /
slosh.files indexes in dist/arch/<carch>/, which rsyncs to
/opt/slosh/arch/ on the box. The README and the front page carry the
[slosh] stanza; SigLevel is spelled out because the packages are not
signed yet and pacman defaults to demanding it.
|
| |
|
|
|
|
|
|
| |
DESIGN.md was a scratch design doc and .fastfeedback a per-repo tool cache;
neither belongs in the tree. Both stay on disk, ignored. Everything that
pointed at DESIGN.md now points at docs/design.md, and the decision counts
quoted from it (which had already drifted: the README said twenty-one, the
docs said twenty-two) are gone with it.
|
| |
|
|
|
|
|
|
| |
The install section says what Windows gets (one slosh.exe, ConPTY panes,
AF_UNIX sessions) and points at the docs; the front-page doc list gains the
windows page. install.sh states in its header that Windows is not its job,
and refuses under MSYS/MinGW/Cygwin with a pointer instead of building a
binary that is the wrong shape for the machine.
|
| |
|
|
|
|
|
| |
The default goal is `help`, so the installer's bare `make` printed a
cheerful list of targets, exited 0, and installed whatever build/slosh
happened to be lying around -- or failed at the copy on a clean tree.
Name the target.
|
| | |
|
| |
|
|
|
|
|
|
| |
Measured in a headless browser: the band spent most of its sweep off
screen and its eased segment rushed the middle, so the pane lit up for
half a second in eight at ten percent white. Now the keyframes cover
exactly the stretch where the band crosses the pane, the sweep is
linear and 1.6s long, and the sheen is half again as bright.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The copy no longer reads as eye candy: shaders are how a pane says
what is true of it. An unfocused pane dims, a dead shell greys out,
scrollback tints, a bell shimmers until it is seen. Scanlines and CRT
phosphor stay, admitted as such.
And every eight seconds the pane demonstrates the bell: a soft sheen
crosses the body, gone within a second, painted as a clipped
background sweep so the frame title stays put. Off under
prefers-reduced-motion, like everything else here.
|
| |
|
|
|
| |
Full stops and a colon where the dashes were. The title is
slosh: coming soon.
|
| |
|
|
|
|
|
|
|
|
| |
Shaders are the thing no other multiplexer has, so the coming-soon
page should not keep quiet about them: a line names them, and the pane
itself wears two -- zebra band=1 and vignette, redrawn in CSS -- so
the claim is demonstrated on the spot.
Below the prompt: slosh is a sl0p.foo product, with the Discord
invite.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The site is not finished -- the demo video is still being cut and the
public repo URL does not exist yet -- so what slosh.foo serves is one
self-contained page in the session-drawn look: tab strip, a focused
pane that runs $ slosh and prints the announcement as its output,
status line, the sl0p palette. No scripts, nothing fetched.
web/build-site assembles just that page by default now; FULL=1 builds
the real site (front page + docs + demo) while it is being finished.
Drop the gate when the real thing ships.
|
| |
|
|
|
|
|
|
|
|
|
| |
$(shell find overlay -type f) skips symlinks, and the one symlink in
overlay/ is the sl0p theme pointing into contrib/themes -- the file the
README promises cannot drift was the one file whose edit did not
rebuild the rootfs. find -L includes it, and make stats prereqs through
symlinks, so the target's mtime is the one compared.
Found while tracing what a src/app.c edit does under make www: that
path was already correct (depfile -> object -> guest -> image -> site).
|
|
|
Consolidate everything the website is made of:
- web_new/ -> web/: the front page, install.sh, and build-site
- contrib/webdemo/ -> web/demo/: the in-browser machine, committed for
the first time (it had never been checked in)
- make www at the top level assembles the whole site into build/www
(NO_DEMO=1 skips the guest cross-compile)
- web_plan.md deleted: the plan is fulfilled and web/README.md is now
the record
Path fallout: the overlay theme symlink gains one ../ (web/demo is a
level shallower relative to contrib/themes), PYSRC in the Makefile
follows the demo scripts, contrib/README.md drops its webdemo section.
ROOT := ../.. in the demo Makefile survives unchanged -- web/demo sits
at the same depth contrib/webdemo did.
Verified: make www builds front page + docs + demo end to end,
web/demo make check boots the image to slosh, tests/test_docs.py and
make fmt-check green.
|