feat: implement definition-aware forms runtime

This commit is contained in:
2026-08-01 17:48:35 +02:00
parent 396d6b0c90
commit 9dc49fe27b
25 changed files with 4180 additions and 79 deletions
+299
View File
@@ -0,0 +1,299 @@
.forms-runtime-page,
.forms-runtime-shell,
.form-instance-shell {
height: 100%;
min-height: 0;
overflow: hidden;
}
.forms-runtime-shell,
.form-instance-shell {
display: flex;
flex-direction: column;
background: var(--surface);
}
.forms-runtime-toolbar,
.form-instance-toolbar {
display: flex;
align-items: center;
gap: 14px;
min-height: 58px;
padding: 10px 18px;
border-bottom: 1px solid var(--border);
background: var(--surface-raised);
}
.forms-runtime-toolbar label {
display: flex;
align-items: center;
gap: 7px;
}
.forms-runtime-toolbar label > span,
.forms-runtime-count {
color: var(--text-soft);
font-size: 0.82rem;
}
.forms-runtime-count,
.form-instance-toolbar .status-badge {
margin-left: auto;
}
.forms-runtime-list-viewport,
.form-instance-viewport {
flex: 1;
min-height: 0;
padding: 16px 18px 24px;
}
.forms-runtime-list {
overflow: hidden;
border: 1px solid var(--border);
border-radius: 6px;
background: var(--surface-raised);
}
.forms-runtime-row {
display: grid;
grid-template-columns: minmax(260px, 1fr) minmax(170px, auto) auto;
align-items: center;
gap: 16px;
width: 100%;
min-height: 64px;
padding: 10px 14px;
border: 0;
border-bottom: 1px solid var(--border);
background: transparent;
color: inherit;
text-align: left;
cursor: pointer;
}
.forms-runtime-row:last-child {
border-bottom: 0;
}
.forms-runtime-row:hover,
.forms-runtime-row:focus-visible {
background: var(--hover-bg);
}
.forms-runtime-row-main {
display: flex;
min-width: 0;
flex-direction: column;
gap: 3px;
}
.forms-runtime-row-main strong,
.forms-runtime-row-main span {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.forms-runtime-row-main span,
.forms-runtime-row > span:not(.status-badge) {
color: var(--text-soft);
font-size: 0.84rem;
}
.forms-runtime-empty {
padding: 36px 0;
color: var(--text-soft);
text-align: center;
}
.form-instance-content {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(280px, 360px);
gap: 28px;
max-width: 1280px;
margin: 0 auto;
}
.form-instance-main,
.form-instance-aside {
min-width: 0;
}
.form-instance-main > header {
padding-bottom: 16px;
border-bottom: 1px solid var(--border);
}
.form-instance-main h1 {
margin: 0;
font-size: 1.45rem;
letter-spacing: 0;
}
.form-instance-main > header p {
max-width: 70ch;
margin: 7px 0 0;
color: var(--text-soft);
}
.form-fields {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 16px 18px;
padding: 20px 0;
}
.form-field {
display: flex;
min-width: 0;
flex-direction: column;
gap: 6px;
}
.form-field:has(textarea),
.form-field:has(select[multiple]) {
grid-column: 1 / -1;
}
.form-field > span:first-child {
font-size: 0.84rem;
font-weight: 600;
}
.form-field > span b {
color: var(--danger);
}
.form-field > small {
color: var(--text-soft);
font-size: 0.78rem;
}
.form-field textarea {
resize: vertical;
}
.form-field select[multiple] {
min-height: 110px;
}
.form-field-toggle {
justify-content: flex-end;
min-height: 58px;
}
.form-field-messages {
display: flex;
flex-direction: column;
gap: 3px;
}
.form-field-messages [data-severity="error"] {
color: var(--danger);
}
.form-field-messages [data-severity="warning"] {
color: var(--warning);
}
.form-evidence-summary,
.form-receipt {
display: flex;
flex-wrap: wrap;
gap: 10px 18px;
padding: 12px 0;
border-top: 1px solid var(--border);
color: var(--text-soft);
font-size: 0.84rem;
}
.form-receipt {
flex-direction: column;
}
.form-receipt code {
overflow-wrap: anywhere;
color: var(--text);
}
.form-instance-actions {
display: flex;
align-items: end;
justify-content: flex-end;
gap: 10px;
padding-top: 16px;
border-top: 1px solid var(--border);
}
.form-change-reason {
display: flex;
min-width: min(360px, 100%);
flex: 1;
flex-direction: column;
gap: 5px;
}
.form-change-reason span {
color: var(--text-soft);
font-size: 0.8rem;
}
.form-instance-aside section + section {
margin-top: 24px;
}
.form-instance-aside h2 {
margin: 0 0 8px;
font-size: 0.95rem;
letter-spacing: 0;
}
.form-instance-aside ol {
margin: 0;
padding: 0;
list-style: none;
border-top: 1px solid var(--border);
}
.form-instance-aside li {
display: flex;
flex-direction: column;
gap: 3px;
padding: 10px 0 10px 12px;
border-bottom: 1px solid var(--border);
border-left: 2px solid var(--accent);
}
.form-instance-aside li span,
.form-instance-aside li time {
color: var(--text-soft);
font-size: 0.78rem;
}
@media (max-width: 860px) {
.forms-runtime-row {
grid-template-columns: minmax(0, 1fr) auto;
}
.forms-runtime-row > span:not(.forms-runtime-row-main, .status-badge) {
display: none;
}
.form-instance-content {
grid-template-columns: 1fr;
}
.form-fields {
grid-template-columns: 1fr;
}
.form-field:has(textarea),
.form-field:has(select[multiple]) {
grid-column: auto;
}
.form-instance-actions {
align-items: stretch;
flex-direction: column;
}
}