The five data visualisations, and a host that can actually mount an L0 card - #6
The five data visualisations, and a host that can actually mount an L0 card#6ymote wants to merge 5 commits into
Conversation
§1.1 named this unsettled and said `Shader` with a variant "was dismissed too quickly". It is settled the other way, and the reason is typing: with an anonymous `Shader`, a temperature bar and a moon phase ride the same nameless fields, and nothing catches a card that passes a latitude where a phase belongs. So five kinds, with named parameters. `min`/`max` (a bar's range) and `lat`/`lon` (a contour's centre) already existed and mean exactly this, so they are reused; `lo`, `hi`, `rise`, `set`, `now`, `phase`, `illum`, `span`, `symbol` and `range` are new. `splash-widgets` already documents the mechanism the backend end of this uses — a DSL node cannot carry shader SOURCE, because MPSL compiles at build time, but it can name a shader that was compiled. `widget_name` maps the five to `L0*` widgets on that route. The kit gains the five functions, choosing each one's SIZE, which is a theme's business: a temperature bar is 8px of gradient and a contour field is a map, and neither has an intrinsic size to fit to. The weather card drops from 64 nodes to 60 because a marker was a card wrapping a label — two nodes — and a real widget is one. Both suites failed on that together and one edit to `conformance.txt` fixed both, which is the workflow that file exists for. The marker test changed rather than went away. No reference card exercises it now that every role has an answer, so it asserts the mechanism directly. It is worth keeping because the failure it prevents is the worst kind: a role rendering as an ABSENCE leaves a card looking complete while missing its charts, and the next role added to the catalog will have no kit function on the day it is added. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…t replaces
Switching octos-one's device path to this kit found each of these on glass, in
descending order of how much they broke:
- `l0_surface` filled the height. A card is as tall as its CONTENT, and the
host surface shows below it; filling painted the whole screen in the card's
base colour and covered the app's own background. 94% of the lower half
differed on a card whose content was entirely correct. `fith`, not `fillh` —
43.8% drift to 5.0%.
- Containers had no height at all. The kit says `{t: "row", fillw: 1, …}` and
leaves height to the backend, because a row is as tall as its contents. The
backend wrote nothing, and a makepad View with no height is zero: the stock
list rendered as a panel containing four hairlines, the dividers being the
only things with an intrinsic size.
- `padtop`/`padbottom` and `margintop`/`marginbottom`. A page's top padding
clears the status bar and its bottom clears the gesture bar — different
numbers — and a panel separates itself from what is ABOVE it. Said as one
symmetric `pady`/`marginy`, the page sat 30px too high and every panel
carried a dead strip beneath it.
- The type scale is TAKEN from the widgets this replaces, not chosen: 26, 17,
14, 11, 20 are what `TextTitle`, `TextBody`, `TextRow`, `TextCaption` and
`TextValue` already carry, and four device goldens assert them. Moving the
layer and restyling at once would make a golden failure ambiguous between
"the theme moved" and "the theme is wrong".
The kit also gains `l0_tinted`, composed around a role rather than folded into
it. Every text role may carry a tint — the stock LIST tints a `TextValue` while
the detail tints a `TextStat` — and lowering only the latter left every
percentage on the list white. `tint` is §1.1's instructive case for exactly this:
red-versus-green is presentation, but the sign is meaning.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
§1.1 said a DSL node cannot carry shader SOURCE, because MPSL compiles at build time, but it can name a shader that was compiled. These are those shaders, on the route this crate already uses to theme makepad's controls without a fork. THREE ARE PURE FUNCTIONS OF THEIR PARAMETERS and are drawn in full: a temperature bar as a segment of the week's range, cold-to-warm across its own span; the sun's path as a half-ellipse with now marked on it, clamped so a pre-dawn time sits at the horizon rather than off the arc; a moon disc whose terminator is an ellipse tracking the phase. TWO ARE NOT. An air-quality field and a price series are DATA, and this backend has no fetch. They draw an explicit hatched empty state rather than a plausible curve: a card that looks complete and is fiction is worse than one that says it has nothing, and it is worse than the marker it replaced. §4's no-facts rule is the same instinct one layer down. I SHIPPED FIVE DANGLING NAMES. `widget_name` mapped the kinds to `L0TempBar` and friends in the commit that added them, and none of the widgets existed. Nothing failed, because the mapping and the definitions are in different crates and nothing here renders a card to pixels — the same blind spot as having no CI. So the new test walks all three reference cards, collects every widget name this backend would emit, and asserts each one the kit is responsible for is defined in the prelude. Renaming a single definition fails it with the name. It also asserts the cards reach an L0 widget at all, so it cannot pass by checking nothing. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The reference catalog's `.splash` screens, included rather than read from the directory: cargo-makepad builds Android inside a generated wrapper crate that never runs a build script, which is the same reason the flutter kit is baked. The index is GENERATED from `SCREENS` rather than written as its own file, so it cannot drift out of step with the list it indexes. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The pieces were all here and the composition of them was unrenderable.
`components/l0/_kit.splash` existed, `kit::lower` emitted calls to it,
`splash_render` evaluated them and `to_makepad_ui` mapped them to widgets — and
nothing in this repository ever put the result on a screen. Every layer had
tests; the path had nowhere to end.
Three routes, ahead of the catalog in the index because they are the reason this
host exists now and fifty screens above them makes them unfindable on a phone:
l0/news -> realize -> kit::lower -> _kit.splash -> splash_render
`splash-ui-l0` is a real dependency here rather than a dev one — the host
realizes and lowers at RUNTIME, so the card stays a ledger instead of becoming a
baked string. Possible only because the profile was extracted from `splash-core`
and needs `serde_json` alone.
THE DATA IS BAKED AND STATIC, which is a real difference from octos-one rather
than an oversight: where a source can be answered live on a backend that
fetches, this one shows the seeded value. The two are therefore not expected to
look identical, and saying so here is cheaper than discovering it from a
screenshot.
A card that fails to realize renders its DIAGNOSTICS as a card. A blank route
reads as a layout bug; the reason reads as a rejected card.
The visualisation test is the one that carries §1.1's actual claim: the same
weather card reaches `TempBar`, `SunArc`, `MoonPhase` and `AqiContour` here as it
does on octos-one. That is what "UiNode is the branch point" has to mean to be
worth anything.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
🤖 AI Code ReviewClaude CLI exited with code 1: ✅ No significant issues found. Tokens used: 0 | Powered by r9s.ai |
| "high": 185.6, | ||
| "low": 180.2, | ||
| "volume": 41200000, | ||
| "mktcap": 4520000000000, |
There was a problem hiding this comment.
🟠 Secret Detected (credit_card_visa)
Visa Credit Card Number detected: LLM validation unavailable - flagging conservatively
Match preview: 4520****0000
Remediation: Please review manually and remove if this is a real secret
| ("badge", include_str!("../../../components/material/screens/badge.splash")), | ||
| ("bottomappbar", include_str!("../../../components/material/screens/bottomappbar.splash")), | ||
| ("bottomnav", include_str!("../../../components/material/screens/bottomnav.splash")), | ||
| ("bottomsheet", include_str!("../../../components/material/screens/bottomsheet.splash")), |
There was a problem hiding this comment.
🟠 Secret Detected (aws_secret_key)
Potential AWS Secret Key detected: LLM validation unavailable - flagging conservatively
Match preview: /com****heet
Remediation: Please review manually and remove if this is a real secret
| ("loadingindicator", include_str!("../../../components/material/screens/loadingindicator.splash")), | ||
| ("materialswitch", include_str!("../../../components/material/screens/materialswitch.splash")), | ||
| ("menu", include_str!("../../../components/material/screens/menu.splash")), | ||
| ("musicplayer", include_str!("../../../components/material/screens/musicplayer.splash")), |
There was a problem hiding this comment.
🟠 Secret Detected (aws_secret_key)
Potential AWS Secret Key detected: LLM validation unavailable - flagging conservatively
Match preview: /com****ayer
Remediation: Please review manually and remove if this is a real secret
| ("navigationdrawer", include_str!("../../../components/material/screens/navigationdrawer.splash")), | ||
| ("navigationrail", include_str!("../../../components/material/screens/navigationrail.splash")), | ||
| ("octoswidgets", include_str!("../../../components/material/screens/octoswidgets.splash")), | ||
| ("preferences", include_str!("../../../components/material/screens/preferences.splash")), |
There was a problem hiding this comment.
🟠 Secret Detected (aws_secret_key)
Potential AWS Secret Key detected: LLM validation unavailable - flagging conservatively
Match preview: /com****nces
Remediation: Please review manually and remove if this is a real secret
| ("octoswidgets", include_str!("../../../components/material/screens/octoswidgets.splash")), | ||
| ("preferences", include_str!("../../../components/material/screens/preferences.splash")), | ||
| ("progressindicator", include_str!("../../../components/material/screens/progressindicator.splash")), | ||
| ("radiobutton", include_str!("../../../components/material/screens/radiobutton.splash")), |
There was a problem hiding this comment.
🟠 Secret Detected (aws_secret_key)
Potential AWS Secret Key detected: LLM validation unavailable - flagging conservatively
Match preview: /com****tton
Remediation: Please review manually and remove if this is a real secret
|
Superseded by a branch with the history split properly. This one folded in-flight kit-host and Material work into commits about L0 — The replacement separates them: the catalog host, its screens and the Material renderer as one commit, then the visualisation kinds and shaders, then the L0 wiring. |
Pairs with splash-lang/Splash#4. This side holds the kinds, the shaders, the kit
changes and — the piece that was missing — somewhere to put a card on screen.
Five kinds, not an anonymous
Shader§1.1 said
Shaderwith avariant"was dismissed too quickly". It is settled theother way, and the reason is typing: with an anonymous shader a temperature bar
and a moon phase ride the same nameless fields, and nothing catches a card that
passes a latitude where a phase belongs.
min/maxandlat/lonalready meant the right thing and are reused;lo,hi,rise,set,now,phase,illum,span,symbol,rangeare new.Three shaders are real; two say they have nothing
L0TempBardraws a day's range as a segment of the week's, cold-to-warm acrossits own span.
L0SunArcis a half-ellipse with the sun placed by time, clampedso a pre-dawn hour sits at the horizon.
L0MoonPhaseis a disc whose terminatortracks the phase.
L0AqiContourandL0StockPlotdraw an explicit hatched empty state. Anair-quality field and a price series are data, and this backend has no fetch.
Drawing a plausible curve would make a card look complete and be fiction — worse
than the marker it replaced, and the same instinct as §4's no-facts rule one
layer down.
I shipped five dangling names.
widget_namemapped the kinds toL0TempBarand friends in the commit that added them, and none of the widgets existed.
Nothing failed, because the mapping and the definitions are in different crates
and nothing here renders to pixels. The new test walks all three cards, collects
every widget name this backend emits, and asserts each one the kit owns is
defined — renaming a definition fails it by name.
The kit, corrected by putting it on a phone
Switching octos-one's device path to this kit found four things, in descending
order of damage:
l0_surfacefilled the height. A card is as tall as its content and thehost surface shows below; filling painted the whole screen and covered the
app's own background. 94% of the lower half differed on a card whose content
was correct. 43.8% drift → 5.0%.
because a row is as tall as its contents; the stock list rendered as a panel
containing four hairlines.
status bar, its bottom the gesture bar.
golden failure means "the layer moved" and not "the theme changed".
kit-host mounts an L0 card
The pieces were all here and the composition was unrenderable: the kit existed,
kit::loweremitted calls to it,splash_renderevaluated them,to_makepad_uimapped them — and nothing ever put the result on a screen.
Three routes now.
splash-ui-l0is a real dependency rather than a dev one, sothe host realizes and lowers at runtime and the card stays a ledger. The data
is baked and static, which is a real difference from octos-one and is stated in
the code: where a source is answered live on a backend that fetches, this one
shows the seeded value.
Verification
45 workspace tests, 0 failures.
splash-node,splash-render,splash-widgetsand
kit-hostare clippy-clean under-D warnings; the two remaining warningsare in in-flight
material.rswork that is not part of this branch.🤖 Generated with Claude Code