ruview @ v1405
integrity
- size
- 60.4 MiB
- downloaded
- last checked
release notes
Automated release from CI pipeline
Changes: feat(homecore-ui iter 2): Edit Entity modal + shadow-DOM focus delegation
CRUD increment 2/6 — clicking any state card on the Dashboard opens the Add Entity modal in EDIT mode: pre-populated, entity_id locked, "Save" primary button, idempotent POST to /api/states/ (backend returns 200 if existed, 201 if created — same handler).
frontend/src/components/StateCard.ts:
- card div is now role="button" tabindex=0, dispatches
hc-state-card-clickon click + Enter/Space keydown - aria-label="Edit <entity_id>" for screen readers
- shadowRootOptions delegatesFocus=true so the outer Tab sequence can reach the inner focusable div (caught by browser agent — without this Tab couldn't pierce the shadow root)
frontend/src/pages/Dashboard.ts:
- new state: editingState (null = create, StateView = edit)
- _openEdit() catches
hc-state-card-clickfrom the grid container - modal heading switches: "Add entity" ↔ "Edit <entity_id>"
- primary button text switches: "Create" ↔ "Save"
- EntityForm receives .editing=true so entity_id input is disabled
- submit toast reads "Updated" or "Created" depending on mode
Browser-verified end-to-end (real homecore-server :8123, 12 entities):
- Click
light.kitchen_ceiling→ modal opens with all 4 attributes (brightness=230, color_temp_kelvin=4000, friendly_name, supported_color_modes) pre-populated - Change state to "off", click Save → toast "Updated light.kitchen_ceiling = off", grid card reflects new state
- Backend curl confirms /api/states/light.kitchen_ceiling.state = "off"
- Enter key on focused card opens the modal too
- 0 console errors
Co-Authored-By: claude-flow ruv@ruv.net
Docker Image:
ghcr.io/ruvnet/RuView:89190b6c2d357dff3ecbe8daaea225b7569032b0
download
unix · zip
curl -fL -o v1405.zip https://ratatoskr.space/pkg/ruview/v1405.zip
printf '%s %s\n' 'ab4da1f61017fd1eccd114bd1ed17e719f442d8b68581aeae2362e4ed46b6090' 'v1405.zip' | sha256sum -c -
windows · zip
$url = "https://ratatoskr.space/pkg/ruview/v1405.zip"
$out = "v1405.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "ab4da1f61017fd1eccd114bd1ed17e719f442d8b68581aeae2362e4ed46b6090") { throw "sha256 mismatch" }
unix · tar.gz
curl -fL -o v1405.tar.gz https://ratatoskr.space/pkg/ruview/v1405.tar.gz
printf '%s %s\n' '92293bfff680ac9cdcf687f392a512b32f2b00780626dcff18e97899271f2051' 'v1405.tar.gz' | sha256sum -c -
windows · tar.gz
$url = "https://ratatoskr.space/pkg/ruview/v1405.tar.gz"
$out = "v1405.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "92293bfff680ac9cdcf687f392a512b32f2b00780626dcff18e97899271f2051") { throw "sha256 mismatch" }
download via yggdrasil mesh
unix · zip
curl -fL -o v1405.zip http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1405.zip
printf '%s %s\n' 'ab4da1f61017fd1eccd114bd1ed17e719f442d8b68581aeae2362e4ed46b6090' 'v1405.zip' | sha256sum -c -
windows · zip
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1405.zip"
$out = "v1405.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "ab4da1f61017fd1eccd114bd1ed17e719f442d8b68581aeae2362e4ed46b6090") { throw "sha256 mismatch" }
unix · tar.gz
curl -fL -o v1405.tar.gz http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1405.tar.gz
printf '%s %s\n' '92293bfff680ac9cdcf687f392a512b32f2b00780626dcff18e97899271f2051' 'v1405.tar.gz' | sha256sum -c -
windows · tar.gz
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1405.tar.gz"
$out = "v1405.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "92293bfff680ac9cdcf687f392a512b32f2b00780626dcff18e97899271f2051") { throw "sha256 mismatch" }
| artifact | format | size | hashes |
|---|---|---|---|
| v1405.zip | zip | 60.4 MiB |
blake3-24 d27d24de0f1930c3be8422975f54e55c332428ee81444432
sha256 ab4da1f61017fd1eccd114bd1ed17e719f442d8b68581aeae2362e4ed46b6090
sha1 260bf69cacdf71206b82c1ca906e17ad4b34958a
|
| v1405.tar.gz | tar.gz | 58.7 MiB |
blake3-24 d0e21e4ad1074435033f99a6a16ee7681ba57a679028b0fc
sha256 92293bfff680ac9cdcf687f392a512b32f2b00780626dcff18e97899271f2051
sha1 43f8815b4db02c4d53ec438dd4a4c824ae2dfbb1
|
install
bazel
http_archive(
name = "ruview",
urls = ["https://ratatoskr.space/pkg/ruview/v1405.tar.gz"],
integrity = "sha256-kik7//aArJzc9ofzkqUSsy8rAHgGJtz/GOl4mScfIFE=",
strip_prefix = "ruview-v1405",
)
zig
.url = "https://ratatoskr.space/pkg/ruview/v1405.tar.gz",
install via yggdrasil mesh
bazel
http_archive(
name = "ruview",
urls = ["http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1405.tar.gz"],
integrity = "sha256-kik7//aArJzc9ofzkqUSsy8rAHgGJtz/GOl4mScfIFE=",
strip_prefix = "ruview-v1405",
)
zig
.url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1405.tar.gz",