The history stack has been global since the Android back gesture landed -- every navigation is an entry and `popstate` restores any of them in either direction. What the report describes as "back is tab-scoped" is that the only way back was a detail view's own button, which leaves the screen with the view it belongs to: click over to Tracks and the album you were reading is still one entry away with nothing on screen saying so. `<nav-history>` is that affordance, plus `nav.back` / `nav.forward` on Alt+Left / Alt+Right -- the browser's own combination, and clear of the bare arrows that seek, since a binding matches on its full canonical string. Forward is not back negated, which is why the old `pushedEntries` counter is gone rather than extended: `popstate` carries no direction and fires identically both ways, so one counter decremented on every pop reads a forward as a second back. Each entry carries its index and the shell keeps the current one and a high-water mark, which also survives a jump of more than one. The buttons dispatch the events the rest of the app already dispatches rather than calling `history` themselves -- the shell owns the guard that stops a press at the root leaving the app, and a second caller reaching for history is how the old `navStack` came to disagree with the platform. Below 900px the control stands down: the top bar is what runs out of room first below that, and nothing becomes unreachable -- the shortcuts are global at every width and the phone has the platform's gesture. Closes #6
88 lines
2.0 KiB
Plaintext
88 lines
2.0 KiB
Plaintext
# Every icon this app bundles, as <style>/<name>, one per line.
|
|
#
|
|
# It is a list rather than a glob because the alternative is shipping
|
|
# 2 001 SVGs to use 64 of them. It is *committed* rather than derived
|
|
# because twenty call sites compute their icon name from state
|
|
# (`jobIcon(job)`, `TONE_ICONS[tone]`, `this.favCtrl.iconName`), so no
|
|
# static analysis can produce this list and no build step can check it.
|
|
#
|
|
# What checks it is the runtime: `src/icons/index.ts` reports a name it
|
|
# cannot resolve to `window.__yjIconMisses` and renders a fallback, and
|
|
# `frontend/scripts/icon-sweep.mjs` drives the app to collect them. A
|
|
# missing icon is therefore a visible, findable bug rather than a
|
|
# silent request to a CDN.
|
|
#
|
|
# Names must exist in Font Awesome **Free** (CC BY 4.0); see
|
|
# fetch-icons.mjs for why that is not negotiable. Re-vendor with:
|
|
# node frontend/scripts/fetch-icons.mjs
|
|
regular/heart
|
|
regular/star
|
|
solid/arrow-down-wide-short
|
|
solid/arrow-left
|
|
solid/arrow-right
|
|
solid/arrow-rotate-right
|
|
solid/arrows-rotate
|
|
solid/arrow-up-short-wide
|
|
solid/backward-step
|
|
solid/bars
|
|
solid/bars-staggered
|
|
regular/bookmark
|
|
solid/bookmark
|
|
solid/box-open
|
|
solid/check
|
|
solid/chevron-down
|
|
solid/chevron-right
|
|
solid/circle-check
|
|
solid/circle-exclamation
|
|
solid/circle-info
|
|
solid/circle-minus
|
|
solid/circle-question
|
|
solid/clock-rotate-left
|
|
solid/compact-disc
|
|
solid/copy
|
|
solid/database
|
|
solid/download
|
|
solid/ellipsis
|
|
solid/file-import
|
|
solid/filter
|
|
solid/floppy-disk
|
|
solid/folder
|
|
solid/forward-step
|
|
solid/gear
|
|
solid/globe
|
|
solid/heart
|
|
solid/home
|
|
solid/hourglass-half
|
|
solid/house
|
|
solid/images
|
|
solid/info
|
|
solid/list
|
|
solid/list-check
|
|
solid/magnifying-glass
|
|
solid/masks-theater
|
|
solid/music
|
|
solid/pause
|
|
solid/pen
|
|
solid/pen-to-square
|
|
solid/play
|
|
solid/plus
|
|
solid/quote-left
|
|
solid/remove
|
|
solid/repeat
|
|
solid/rotate
|
|
solid/running
|
|
solid/shuffle
|
|
solid/star
|
|
solid/stop
|
|
solid/tag
|
|
solid/tags
|
|
solid/trash
|
|
solid/triangle-exclamation
|
|
solid/user
|
|
solid/user-group
|
|
solid/volume-high
|
|
solid/volume-low
|
|
solid/volume-off
|
|
solid/volume-xmark
|
|
solid/xmark
|