feat(10.1-02): render header and form partials through an allowlisted node renderer

- partialNodes rebuilds the server node tree with h() under the server's tag, attribute and URL lists
- PartialHost owns the skeleton, empty and failure states and keeps nodes visible on refetch
- type: partial is a valueless group-labelled field rendered on create and update
- ListView shows headerPartial above the list card and refetches it after bulk delete
- summer-partial and summer-stats style kit in main.css, documented in the cabana README; dist rebuilt
This commit is contained in:
Jakub Zych
2026-09-29 02:10:18 +02:00
parent 107d820109
commit 9df9fae930
20 changed files with 870 additions and 22 deletions

View File

@@ -207,6 +207,72 @@
opacity: 0;
scale: 0.98;
}
/* Partial style kit (Phase 10.1, UI-SPEC): stable class names a plugin's
partial templates may use, so server-rendered content looks native
without plugin CSS. They read only the public --c-* variables. */
.summer-partial {
font-size: 14px;
line-height: 1.5;
color: var(--c-text);
overflow-wrap: anywhere;
}
.summer-partial :where(p, ul, ol) {
margin: 0 0 8px;
}
.summer-partial :where(p, ul, ol):last-child {
margin-bottom: 0;
}
.summer-partial a {
color: var(--c-text);
text-decoration: underline;
}
.summer-partial a:focus-visible {
outline: 3px solid var(--c-ring);
outline-offset: 2px;
}
.summer-stats {
display: flex;
flex-wrap: wrap;
column-gap: 32px;
row-gap: 8px;
margin: 0;
padding: 16px 20px;
background: var(--c-surface);
border: 1px solid var(--c-border);
border-radius: 16px;
box-shadow: var(--c-shadow-card);
}
.summer-stat {
display: flex;
flex-direction: column-reverse;
gap: 4px;
min-width: 0;
}
.summer-stat__label {
margin: 0;
font-size: 13px;
line-height: 1.5;
font-weight: 400;
color: var(--c-muted);
overflow-wrap: anywhere;
}
.summer-stat__value {
margin: 0;
font-size: 20px;
line-height: 1.2;
font-weight: 600;
color: var(--c-text);
font-variant-numeric: tabular-nums;
}
}
@media (prefers-reduced-motion: reduce) {