aboutsummaryrefslogtreecommitdiffstats
path: root/web (follow)
Commit message (Collapse)AuthorAge
* web: plainer front page copy -- themes, effects, scripting, floats, installuser2026-09-24
|
* webdemo: the picker in the machine, and a guest that proves its themesuser2026-09-22
| | | | | | | | | | | | | | | | | | | | | | The demo image was cut before any of this existed: an old guest binary with no `C-a t` in it, and a config whose theme was a pasted palette. Rebuilt -- guest binary, root filesystem, site -- so the thing a visitor lands in is the thing the front page is now claiming. The overlay already kept every shipped theme in ~/.config/slosh/themes (they are symlinks into contrib/, copied by content because a symlink in an ext2 image would dangle), which turns out to be exactly the directory the picker looks in first -- and in the guest it is the *only* one, since /usr/bin/slosh has no share/slosh beside it. So `boot-check` now asks the guest itself: `{"cmd":"theme"}` over --script, expecting the worn theme and the shipped list back. It failed honestly the first time, for the right reason (no HOME in a phase that boots straight to /bin/sh, so no config, so no themes/ beside it), which is the kind of failure a check is for. The welcome float grew a fourth line -- `C-a t`, every theme, worn as you browse -- and a row to hold it; the motd and the config's own comments say the same. A visitor who reads three lines and presses one key should land on the feature the page just sold them.
* web: a recording of the theme picker, and the tour step for ituser2026-09-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The landing page's feature tour is scripted recordings -- driver scripts against `slosh --script` on a virtual clock, re-rendered by `make` so a UI change can never leave a stale demo -- and the picker is exactly the kind of thing that does not survive being described. "Moving the selection applies the theme" is a sentence; twenty-six seconds of a session changing colour under a list is the claim itself. demos/themes.py: a sidebar session with two tabs and a build pane that says it is busy (so the spinner is in shot, turning in whatever colour the theme being tried says it should), `cat config.kdl` showing a config that names a theme and holds no colours at all, then C-a t -- the list, two themes worn rather than swatched, `pho` typed to narrow, C-s writing the one line, a second `cat` proving it wrote that line and nothing else, and finally a browse that ends in Escape, which puts back what was worn. Two rules the demo had to obey, both now in PLAN.md beside the other lessons: only dark themes, because cells slosh does not paint keep the terminal's own background and the cast header fixes that once -- `paper` would look broken in the player and fine in a light terminal; and nothing on screen may carry this machine, so the themes are copied next to the temp config rather than pointed at with `theme_dir`, leaving a `cat` frame that reads as a name and a directory nobody has to have. The step slots after "make it yours, live", which is where a reader has just been shown a config being edited by hand and is best placed to notice that a theme is one word of it. Casts are built at publish time, so build-site picks the new one up with no wiring.
* theme: a name and a directory, not sixty colours in your configuser2026-09-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Wearing a theme meant pasting its `theme { }` block into config.kdl, or including a path to a file you had copied there yourself. Both make the palette a literal in your config, and a literal is the one thing you cannot change cheaply: not from a script, not from a running session, not by a list of what is available, and never again from upstream -- the colours you pasted are the colours that theme had the day you pasted them. So a theme is a file in a directory now, and a config names it: theme_name "phosphor" theme { frame_focus "#00ff88" } // ...but that one colour is mine theme_name is applied after the includes and before everything the file says itself, which is the rule includes already follow and for the same reason: the loader reads a document by asking it for names rather than walking it in order, so "here" is not a position it could honour, and "what you asked for is the base, what you wrote is yours" is the rule worth having. Two directories, yours first: `themes/` beside the root config -- beside the file that was loaded, so a config somewhere else (SLOSH_CONFIG, or one handed to --check) takes its themes with it -- and then <prefix>/share/slosh/themes, compiled in from PREFIX. install(1) has been putting themes there all along and nothing could read them; now a shipped theme is nameable without being copied, and a file of yours with the same name shadows it, which is how a root-owned theme gets edited. A name, not a path. The directory is what makes a theme switchable, listable and shadowable, and a path silently does none of those, so `theme_name "../x.kdl"` is refused with a line pointing at `include`, which still works and is still the answer for a file somewhere a directory of names cannot reach. A theme that is not there is one complaint and no more (D9): the rest of the config applies, because losing your keybindings over a mistyped colour scheme would be the wrong trade. A theme file is read by the same loader, so it is watched like any other: saving one reloads the session wearing it, and the derivations (tab_status_fg, tab_idle_bg) run over the theme's own colours exactly as before. Switching without editing anything, over the socket a session already has: slosh -s main cmd theme # amber default* ... slosh -s main cmd '{"cmd":"theme","name":"amber"}' # now slosh -s main cmd '{"cmd":"theme","name":"amber","save":true}' The session holds the name over later reloads, so saving your config for an unrelated reason does not put the old colours back; `save` writes the theme_name line into the file, replacing the one already there and leaving every other line and comment alone -- dumping the whole config back over itself would reformat a hand-written file and drop its comments, which is not a fair price for changing a colour scheme. A name is tried on a throwaway config first, so a typo costs nothing. An empty name gives the answer back to the file. --dump-config stops writing colours: it writes the theme's name and the colours a config overrode by hand, so a dumped config keeps following its theme instead of freezing it. --dump-theme is the other half and is new: the resolved palette as a theme file, which is how you start one from the session in front of you rather than from an empty file. It is also what keeps contrib/themes/default.kdl honest -- that file is now the annotated reference (the commented palette moved there out of config.kdl, where it was 119 lines of colour in the middle of the prose), and a test compares it against the compiled-in one. While in there: tests/test_themes.py's "every theme sets every colour" guard had been grepping for `&c->`, the spelling before the colour table moved to offsetof, so it had been finding zero colours and passing for months. Fixed, with the derived and opt-in colours exempted for the reasons they are derived and opt-in, and with a check that the guard found a table at all.
* web: boot the demo before publishing ituser2026-09-12
| | | | | | | | | | | | | | | | | | v0.1.7 shipped a demo that could not start a session, and the site was live and broken because nothing between `make` and `rsync` ever ran the guest. The demo is the one artifact here whose build succeeding says nothing about it working: it is a cross-compiled riscv64 binary in an ext2 image, so the failures the rest of build-site would notice -- a compiler error, a missing file -- are not where its failures live. A guest that segfaults on startup links, packages and copies perfectly, and the page then loads, draws a terminal and sits there dead. web/demo/boot-check already boots that exact image in a native emulator and fails if init does not reach a composed screen. It took twenty seconds to find what the browser reported as one unexplained line, so it runs in the build now, between `make site` and the copy into the staging tree. NO_BOOT_CHECK=1 opts out; NO_DEMO=1 skips it with the rest of the demo.
* sidebar: statuses wear italic instead of an indent, and can wear colouruser2026-09-10
| | | | | | | | | | | | | | | | | | | | | | | Three columns of indent is a fifth of a sixteen-column sidebar, spent saying 'this belongs to the row above'. The slant says it in none: a status now starts in the same column its tab's name starts in, and is set in italic. That also survives the monochrome themes in contrib, where a colour-only distinction would have had nothing to spend. tab_status_fg / tab_status_bg are there for themes that do have colour to spend. The fg follows tab_count when a theme does not name it -- the same declared/derived split apply_scrolled makes -- so the six themes in contrib get coherent status rows without a line added to any of them. The bg is unset by default, because a band is opt-in and 'none' is what a translucent terminal wants; the row is padded so a band that *is* set covers the row rather than the words on it. Two things fell out. The padding loop existed three times and is now pad_cells. And cb_color wrote #000000 for an unset colour, so quietly pinned attach_bg -- 'gray ink on the terminal's own background', says its comment -- to a black band. Unset colours are now written commented out, the same trick the states block uses for what it wants re-derived rather than pinned.
* build: a vendor bump rebuilds libghostty-vt, everywhere it is consumeduser2026-09-10
| | | | | | | | | | | | | | | | | | | | | Three stale-build landmines, all found by shipping v0.1.7 -- the first release where new code (GhosttySearch) actually needed the vendor bump of 2026-09-01: - $(VT_LIB) had no prerequisites, so an existing .a *was* the build: the macOS builder compiled pane.c against zig-out headers from before the bump. The vendor manifest is now the prerequisite; a re-vendor rewrites it, so a bump rebuilds the lib and its installed headers. - web/demo had the same guard and also never passed -Dversion-string: upstream's build.zig ran git describe in our repo, and on the tag checkout web/publish builds from, a slosh tag is a fatal version mismatch. Both fixed; both had hidden behind a stale build/vt. - The builder's zig-pkg (excluded from the sync, and left half-empty by a once-interrupted push) is an input, not a cache: it is now synced separately and additively, so a bump's new packages arrive and a partial local tree cannot maim the builder's copy.
* web: on one column the hero hovers, not a copy of the logouser2026-09-03
| | | | | | | | | | | The stage-resident logo copy goes: instead the top section itself -- logo and buttons -- is position: sticky below 54rem, full-bleed, with the tour's stage tucked under it at --hero-h, which the page script measures (wrapping buttons make it no fixed number; a ResizeObserver keeps it honest). The tagline yields the room: with the header on screen at all times, every line it keeps is a line the tour loses. Desktop is exactly as before -- the floating logo, its observers and its collision test untouched.
* web: the floating logo, on one-column screens toouser2026-09-03
| | | | | | | | | Below 54rem the fixed corner the float centres itself in is content, not air, so the float stays hidden there -- but the logo can ride where the terminal does: a small copy inside the sticky stage, above the player, on screen at all times. No observer, no collision test; it sticks with the stage. Same link back to the top, same wash and shine (the shared rules now name both), same reduced-motion fallback.
* web/recordings: a move cursor while the pointer dragsuser2026-09-03
| | | | | | | | | | The cast already marks the button in the ptr track ([x, y, 1]); the player now remembers the cell where it went down and, the moment the pointer leaves it, swaps the arrow for a four-way move cursor (a clip-path, like the arrow) centred on the old tip. A still click never triggers it, so the border-click split keeps its arrow while the gap drag and both pane-carries in the panes demo read as carrying. Player-side only: every existing cast gets it without re-rendering.
* web: carduser2026-09-02
|
* web: arch install as three copyable stepsuser2026-09-02
| | | | | | | | | The pacman.conf section and the install command each get their own box (one copies config, the other a command; sharing a box made the copy button copy neither cleanly), and ghostty-terminfo moves from the aside into the install box as a commented optional line, marked x86_64-only -- extra does not build it for aarch64, where slosh's self-installed ~/.terminfo copy is the whole story.
* arch: point at ghostty-terminfo, the pacman spelling of the entryuser2026-09-02
| | | | | | | | optdepends says it at install time, the README and the install tab say it before. Our package deliberately does not ship the file: extra/ghostty-terminfo owns that path, and two packages must not. Without either, slosh's own ~/.terminfo copy covers it. pkgrel=2, both architectures rebuilt and republished.
* webdemo: generate terminfo.h -- pty.c includes it nowuser2026-09-02
| | | | | | | | The demo Makefile compiles pty.c with its own rules and never learned the new header, so the v0.1.5 tag cannot build its own demo and ship's website step died there. Same generation recipe as the top-level Makefile; the tag being immutable, 0.1.5's site publishes from master.
* web: the released version in the hero, linking to the releaseuser2026-09-02
| | | | | | Stamped by build-site from ./VERSION, which the release invariant keeps equal to the newest tag -- so the page cannot advertise a version that was never cut, and nothing is bumped by hand.
* web: contributing section, shorteruser2026-09-02
|
* web: a contributing section -- the github and the discorduser2026-09-02
| | | | | | The multiplayer patch proved the repo takes patches; say so where people can see it, and give the not-yet-an-issue conversations somewhere to happen.
* web: no em dashes on the landing pageuser2026-09-02
| | | | | | Colons, commas and semicolons where twelve of them stood. People read an em dash as the house style of a language model, and the landing page is not the place to argue.
* web: the sessions step mentions shared attachuser2026-09-02
|
* web: choreuser2026-09-02
|
* webdemo: version from contrib/version, published by shipuser2026-09-02
| | | | | | | | | | The demo's Makefile said VERSION := 0.1.0 by hand, so the in-browser slosh announced a release two tags old no matter what was built into it. It now derives from contrib/version like every other artifact, suffixed +webdemo so the guest build names itself. And ship gains a website step: the site (demo included) is rebuilt from the tag checkout and published as part of a release, so the demo cannot fall behind again.
* web: the real site is the only site, and web/publish ships ituser2026-09-02
| | | | | | | | The coming-soon gate (FULL=1) and its page go: the site is finished enough to be the default. web/publish (make www-publish) builds, refuses to sync a tree that does not look like the site, and rsyncs to /opt/slosh -- around /arch, which contrib/ship owns, and around the served demo when a NO_DEMO build has none to offer.
* web: choreuser2026-09-02
|
* web: deprecate install.sh and the served dist/user2026-09-02
| | | | | | | GitHub releases host the binaries now; installing is a package manager (brew, pacman) or a manual download from the releases page. The curl|sh script and slosh.foo/dist are gone -- one less channel to keep in sync, one less thing to trust.
* install: source tab clones from githubuser2026-09-02
|
* install: key enrollment commands right in the pacman tabuser2026-09-02
| | | | | | The three commands were a link away in contrib/arch; a repo whose packages refuse to install without the key should hand them over where the repo is advertised.
* public links: point at github.com/sl0p-foo/slosh instead of cgituser2026-09-02
| | | | | | | | GitHub is the public interaction point now. The formula and PKGBUILD fetch GitHub's /archive/ tarballs (same git-archive bytes, per-ref stable); the PKGBUILD is bumped to 0.1.2 while at it, and its cd's drop the v -- GitHub tag archives extract to slosh-X.Y.Z/. The cgit remote stays for pushing; only published URLs change.
* install tabs: macOS / linux / sourceuser2026-09-02
|
* install: drop install.sh, point at GitHub releases for binariesuser2026-09-02
| | | | | | | The landing page now shows the releases page for direct downloads and only lists package manager tabs (homebrew, arch, source). The linux installer script and the windows curl recipe are gone — the releases page is the single place for prebuilt binaries.
* point homebrew tap at github.com/sl0p-foo/homebrew-sloshuser2026-09-02
| | | | | brew auto-resolves GitHub taps, so the explicit URL is no longer needed: 'brew tap sl0p-foo/slosh' is all users type.
* web: cleanupuser2026-09-02
|
* web: the logo becomes geometry -- fonts cannot break rectsuser2026-08-30
| | | | | | | | | | | | | | | | | | | Android reports arrived of the logo rendering shattered, and the cause is the ascii itself: the default monospace there has no block glyphs, so every ▀▄█ falls back to whatever font volunteers, each with its own metrics, and the grid comes apart. No font stack fixes a missing glyph, and shipping a font is against the house rules. So the logo stops being text: web/gen-logo-mask turns logo.txt into an SVG of merged rects, inlined into site.css as a data URI and used as a CSS mask on an empty element. The animated background layers show through the mask exactly as they showed through background-clip: text, so every effect survives -- gradient slide, shine, hue, glow -- and two old hacks retire with the fonts: the letter-spacing pinstripe fix, and (after one round of seams at fractional mask scales) a vertical overlap baked into the rects. Same 318x84 box, same placement math, and a hero that reads as role=img with a label instead of seven rows of block glyphs.
* web: the magnet scroll goesuser2026-08-30
| | | | | | | | Proximity snapping, even with the doorway steps freed, still catches some people's scrolling in ways worth no tour polish -- input devices and browsers disagree too much about what proximity means. The clickable steps and the smooth scrolling stay; a reader's wheel is theirs again, everywhere.
* web: a one-line footer -- slosh is a sl0p.foo productuser2026-08-30
| | | | | | The page gets its colophon back, at a fraction of the old footer's size: one centred mono line in the floor's own greys, the link a shade brighter and pink under the pointer.
* web: the hero logo cycles too, in truer coloursuser2026-08-30
| | | | | | | | | The floating logo's dress on the big one, cut to the brand: no hue rotation -- that is what walks the little one off into blues -- just a 4s slide through the palette's own pinks and orchid and --dead's sunset orange, the most retrowave colour the theme already owns, with the shine crossing once a loop and a soft pink glow underneath. Reduced motion gets the gradient standing still.
* web: the demo poster rises above the lightened flooruser2026-08-30
| | | | | | | The body gradient's ground passes --panel by, and a box darker than its floor reads as a hole. The poster steps up to --code-bg -- the same raised step the install boxes beside it use -- and its border moves to --faint, since the old border colour is now the fill.
* web: the page lightens toward the ground, barelyuser2026-08-30
| | | | | | | | A gradient on the body, whose box is the whole document, so the fade maps to scroll distance: near-black held through the hero and the tour, then a slow climb to a grey that stops shy of the panels' own colour -- the floor lightens, the boxes on it stay boxes. html keeps the solid top colour, so over-scroll rubber-banding stays dark.
* web: the logo trades the glitch for the shineuser2026-08-30
| | | | | | | | | | A band of light sweeping the glyphs once a loop -- the logo running slosh's own shine preset, which is a better advertisement than a signal fault. The band is a second background layer on the same text clip, parked off the ink for 86% of the loop and crossing in the closing 0.7s; one set of keyframes drives both layers, the colour slide holding its linear pace through every stop. The glitch keyframes go, and reduced motion still keeps only the hue.
* web: the logo glitches, briefly, every seven secondsuser2026-08-30
| | | | | | | | | | | A signal that is fine, fine, fine, and then for a third of a second is not: torn into bands by clip-path, shoved and sheared by transform -- the two properties the other animations left free, filter being the hue's and background the slide's. Doubled keyframe percentages make the cuts hard instead of smeared, and 7s against the 5s slide and 4s hue lands the burst somewhere new in the colour every time. Reduced motion never sees it: the glitch is nothing but motion, and the reduced lane already keeps only the hue.
* web: the hero button says try it, like the section it goes touser2026-08-30
|
* web: the whole step is the road, not just its titleuser2026-08-30
| | | | | | | | | | 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.
* web: the tour's doorway steps stop grabbinguser2026-08-30
| | | | | | | | | 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.
* web: the tour magnets, politelyuser2026-08-30
| | | | | | | | | | | | 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.
* web: a step's title is a road to the stepuser2026-08-30
| | | | | | | | 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.
* web: the floating logo yields to the buttons and the rising terminaluser2026-08-30
| | | | | | | | | | | | | | | 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.
* web: the config cast zeroes the padding before going compactuser2026-08-30
| | | | | | | | 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.
* web: the config cast edits in colouruser2026-08-30
| | | | | | | | | | 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.
* web: the casts play at 1.75x -- the owner has watched them enoughuser2026-08-30
|
* web: the config cast turns the layout before it editsuser2026-08-30
| | | | | | | | | | | 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.
* web: one knob to hurry every cast on the pageuser2026-08-30
| | | | | | | | | 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.