feat: ship HTTP dashboard and harden daemon/API flows
Add the static HTTP dashboard example and wire in the recent daemon/API polish: CORS-aware API routing, service-install behavior cleanup, safer systemd unit ExecStart quoting, and friendly-name validation for path-safe targeting. Also refresh README/API/roadmap docs, remove the temporary claude observations file, and include the related tests for API/status and daemon validation.
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: "IBM Plex Sans", "Segoe UI", sans-serif;
|
||||
background: linear-gradient(180deg, #eef4ff 0%, #f8fbff 100%);
|
||||
color: #1b2a41;
|
||||
}
|
||||
|
||||
header {
|
||||
padding: 1.2rem 1.4rem;
|
||||
background: #0b3954;
|
||||
color: #f3f7fb;
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin: 0 0 0.4rem 0;
|
||||
font-size: 1.4rem;
|
||||
}
|
||||
|
||||
main {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
|
||||
gap: 0.8rem;
|
||||
padding: 0.8rem;
|
||||
}
|
||||
|
||||
.panel {
|
||||
background: #ffffff;
|
||||
border: 1px solid #c6d6eb;
|
||||
border-radius: 10px;
|
||||
padding: 0.8rem;
|
||||
box-shadow: 0 2px 8px rgba(15, 35, 55, 0.06);
|
||||
}
|
||||
|
||||
.panel-wide {
|
||||
grid-column: 1 / -1;
|
||||
}
|
||||
|
||||
.panel-wide:nth-last-of-type(2) {
|
||||
order: 100;
|
||||
}
|
||||
|
||||
.panel-wide:last-of-type {
|
||||
order: 101;
|
||||
}
|
||||
|
||||
.panel h2 {
|
||||
margin-top: 0;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
label {
|
||||
display: block;
|
||||
margin: 0.4rem 0;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
input,
|
||||
select,
|
||||
button {
|
||||
width: 100%;
|
||||
margin-top: 0.25rem;
|
||||
border: 1px solid #9db3cf;
|
||||
border-radius: 6px;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
input,
|
||||
select {
|
||||
padding: 0.45rem;
|
||||
background: #fbfdff;
|
||||
}
|
||||
|
||||
button {
|
||||
padding: 0.55rem;
|
||||
cursor: pointer;
|
||||
background: #1d6fa5;
|
||||
color: #ffffff;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
button.warn {
|
||||
background: #af6d1d;
|
||||
}
|
||||
|
||||
button.danger {
|
||||
background: #a12626;
|
||||
}
|
||||
|
||||
.row {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
|
||||
gap: 0.45rem;
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
|
||||
.hint {
|
||||
font-size: 0.8rem;
|
||||
color: #425b7a;
|
||||
}
|
||||
|
||||
textarea[readonly] {
|
||||
width: 100%;
|
||||
min-height: 220px;
|
||||
max-height: 70vh;
|
||||
resize: both;
|
||||
overflow: auto;
|
||||
margin: 0;
|
||||
padding: 0.6rem;
|
||||
border: 1px solid #2f4b66;
|
||||
border-radius: 6px;
|
||||
background: #0f1720;
|
||||
color: #d9ecff;
|
||||
font-size: 0.8rem;
|
||||
font-family: "IBM Plex Mono", "Cascadia Code", monospace;
|
||||
white-space: pre;
|
||||
}
|
||||
Reference in New Issue
Block a user