feat: add visual settings and readiness gate
This commit is contained in:
+524
-1
@@ -59,6 +59,11 @@ textarea {
|
||||
font-family: "Segoe UI Variable", "PingFang SC", "Microsoft YaHei", system-ui, sans-serif;
|
||||
}
|
||||
|
||||
select {
|
||||
font-family: inherit;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
button,
|
||||
input,
|
||||
textarea {
|
||||
@@ -69,6 +74,11 @@ button {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
button:disabled {
|
||||
cursor: not-allowed;
|
||||
opacity: 0.48;
|
||||
}
|
||||
|
||||
button:focus-visible,
|
||||
input:focus-visible,
|
||||
textarea:focus-visible,
|
||||
@@ -150,6 +160,14 @@ textarea:focus-visible,
|
||||
gap: 9px;
|
||||
}
|
||||
|
||||
.settings-alert-dot {
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
border-radius: 50%;
|
||||
background: var(--warning);
|
||||
box-shadow: 0 0 0 3px var(--warning-soft);
|
||||
}
|
||||
|
||||
.save-state {
|
||||
gap: 5px;
|
||||
margin-right: 6px;
|
||||
@@ -853,6 +871,448 @@ textarea:focus-visible,
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
.settings-backdrop {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
z-index: 100;
|
||||
padding: 24px;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
background: rgb(18 24 20 / 0.56);
|
||||
backdrop-filter: blur(8px);
|
||||
}
|
||||
|
||||
.settings-dialog {
|
||||
width: min(1120px, 100%);
|
||||
height: min(820px, calc(100dvh - 48px));
|
||||
display: grid;
|
||||
grid-template-rows: auto auto minmax(0, 1fr) auto;
|
||||
overflow: hidden;
|
||||
border: 1px solid var(--line-strong);
|
||||
border-radius: var(--radius-surface);
|
||||
background: var(--surface);
|
||||
box-shadow: 0 34px 100px rgb(7 13 9 / 0.34);
|
||||
}
|
||||
|
||||
.settings-header {
|
||||
padding: 20px 22px 16px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
gap: 24px;
|
||||
border-bottom: 1px solid var(--line);
|
||||
background: var(--surface-raised);
|
||||
}
|
||||
|
||||
.settings-header h1,
|
||||
.settings-header p,
|
||||
.settings-section-heading h2,
|
||||
.settings-section-heading p,
|
||||
.settings-readiness p,
|
||||
.setting-status-row p,
|
||||
.setting-toggle-row p,
|
||||
.deployment-note p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.settings-header h1 {
|
||||
margin-top: 3px;
|
||||
font-size: 21px;
|
||||
font-weight: 690;
|
||||
letter-spacing: -0.02em;
|
||||
}
|
||||
|
||||
.settings-header > div > p:last-child {
|
||||
margin-top: 5px;
|
||||
color: var(--text-soft);
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.settings-kicker {
|
||||
color: var(--accent-strong);
|
||||
font-size: 9px;
|
||||
font-weight: 720;
|
||||
letter-spacing: 0.12em;
|
||||
}
|
||||
|
||||
.settings-readiness {
|
||||
min-height: 70px;
|
||||
padding: 11px 22px;
|
||||
display: grid;
|
||||
grid-template-columns: auto minmax(220px, auto) minmax(180px, 1fr);
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
border-bottom: 1px solid var(--line);
|
||||
background: color-mix(in srgb, var(--accent-soft) 68%, var(--surface));
|
||||
}
|
||||
|
||||
.readiness-orb {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
border-radius: 50%;
|
||||
color: var(--warning);
|
||||
background: var(--warning-soft);
|
||||
}
|
||||
|
||||
.readiness-orb.ready {
|
||||
color: var(--accent-strong);
|
||||
background: var(--accent-soft);
|
||||
}
|
||||
|
||||
.settings-readiness strong {
|
||||
display: block;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.settings-readiness p {
|
||||
margin-top: 4px;
|
||||
color: var(--text-soft);
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
.readiness-meter {
|
||||
height: 5px;
|
||||
overflow: hidden;
|
||||
border-radius: 5px;
|
||||
background: var(--line);
|
||||
}
|
||||
|
||||
.readiness-meter span {
|
||||
height: 100%;
|
||||
display: block;
|
||||
border-radius: inherit;
|
||||
background: var(--accent);
|
||||
transition: width 240ms ease;
|
||||
}
|
||||
|
||||
.settings-layout {
|
||||
min-height: 0;
|
||||
display: grid;
|
||||
grid-template-columns: 190px minmax(0, 1fr);
|
||||
}
|
||||
|
||||
.settings-nav {
|
||||
padding: 14px 10px;
|
||||
display: grid;
|
||||
align-content: start;
|
||||
gap: 3px;
|
||||
border-right: 1px solid var(--line);
|
||||
background: var(--surface-muted);
|
||||
}
|
||||
|
||||
.settings-nav button {
|
||||
min-height: 43px;
|
||||
padding: 0 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 8px;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 8px;
|
||||
color: var(--text-soft);
|
||||
background: transparent;
|
||||
text-align: left;
|
||||
font-size: 11px;
|
||||
font-weight: 620;
|
||||
}
|
||||
|
||||
.settings-nav button:hover {
|
||||
background: color-mix(in srgb, var(--surface-raised) 72%, transparent);
|
||||
}
|
||||
|
||||
.settings-nav button.active {
|
||||
color: var(--text);
|
||||
border-color: var(--line);
|
||||
background: var(--surface-raised);
|
||||
}
|
||||
|
||||
.settings-nav small {
|
||||
color: var(--text-faint);
|
||||
font-size: 8px;
|
||||
font-weight: 650;
|
||||
}
|
||||
|
||||
.settings-nav small.required {
|
||||
color: var(--warning);
|
||||
}
|
||||
|
||||
.settings-nav small.done {
|
||||
color: var(--accent-strong);
|
||||
}
|
||||
|
||||
.settings-content {
|
||||
min-width: 0;
|
||||
overflow-y: auto;
|
||||
padding: 22px 26px 30px;
|
||||
}
|
||||
|
||||
.settings-loading {
|
||||
min-height: 300px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 8px;
|
||||
color: var(--text-soft);
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
.settings-section-heading {
|
||||
padding-bottom: 16px;
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
justify-content: space-between;
|
||||
gap: 20px;
|
||||
border-bottom: 1px solid var(--line);
|
||||
}
|
||||
|
||||
.settings-section-heading h2 {
|
||||
font-size: 16px;
|
||||
font-weight: 690;
|
||||
}
|
||||
|
||||
.settings-section-heading p {
|
||||
max-width: 620px;
|
||||
margin-top: 5px;
|
||||
color: var(--text-soft);
|
||||
font-size: 10px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.advanced-toggle {
|
||||
min-width: 86px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
gap: 6px;
|
||||
color: var(--text-soft);
|
||||
font-size: 9px;
|
||||
}
|
||||
|
||||
.advanced-toggle input {
|
||||
accent-color: var(--accent);
|
||||
}
|
||||
|
||||
.settings-fields {
|
||||
display: grid;
|
||||
}
|
||||
|
||||
.setting-field,
|
||||
.setting-toggle-row,
|
||||
.setting-status-row {
|
||||
padding: 15px 0;
|
||||
border-bottom: 1px solid var(--line);
|
||||
}
|
||||
|
||||
.setting-field {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(160px, 0.36fr) minmax(260px, 0.64fr);
|
||||
gap: 4px 22px;
|
||||
}
|
||||
|
||||
.setting-field-label {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.setting-field-label strong,
|
||||
.setting-toggle-row strong,
|
||||
.setting-status-row strong {
|
||||
font-size: 11px;
|
||||
font-weight: 650;
|
||||
}
|
||||
|
||||
.setting-field-label small {
|
||||
color: var(--warning);
|
||||
font-size: 8px;
|
||||
}
|
||||
|
||||
.setting-description {
|
||||
grid-column: 1;
|
||||
color: var(--text-faint);
|
||||
font-size: 9px;
|
||||
line-height: 1.55;
|
||||
}
|
||||
|
||||
.setting-control-wrap {
|
||||
grid-column: 2;
|
||||
grid-row: 1 / span 2;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 7px;
|
||||
}
|
||||
|
||||
.setting-control-wrap input,
|
||||
.setting-control-wrap select {
|
||||
width: 100%;
|
||||
min-width: 0;
|
||||
height: 38px;
|
||||
padding: 0 10px;
|
||||
border: 1px solid var(--line-strong);
|
||||
border-radius: 8px;
|
||||
color: var(--text);
|
||||
background: var(--surface-raised);
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
.setting-control-wrap input::placeholder {
|
||||
color: var(--text-faint);
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.generate-button {
|
||||
min-width: 88px;
|
||||
height: 36px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 5px;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 8px;
|
||||
color: var(--accent-strong);
|
||||
background: var(--accent-soft);
|
||||
font-size: 9px;
|
||||
font-weight: 650;
|
||||
}
|
||||
|
||||
.option-help {
|
||||
grid-column: 2;
|
||||
color: var(--accent-strong);
|
||||
font-size: 9px;
|
||||
}
|
||||
|
||||
.setting-toggle-row,
|
||||
.setting-status-row {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr auto;
|
||||
align-items: center;
|
||||
gap: 14px;
|
||||
}
|
||||
|
||||
.setting-toggle-row p,
|
||||
.setting-status-row p {
|
||||
margin-top: 4px;
|
||||
color: var(--text-faint);
|
||||
font-size: 9px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.setting-toggle-row input {
|
||||
width: 35px;
|
||||
height: 19px;
|
||||
accent-color: var(--accent);
|
||||
}
|
||||
|
||||
.setting-status-row {
|
||||
grid-template-columns: auto 1fr auto;
|
||||
}
|
||||
|
||||
.setting-status-row > span {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.setting-status-row > span.configured {
|
||||
color: var(--accent-strong);
|
||||
background: var(--accent-soft);
|
||||
}
|
||||
|
||||
.setting-status-row > span.missing {
|
||||
color: var(--warning);
|
||||
background: var(--warning-soft);
|
||||
}
|
||||
|
||||
.setting-status-row > small {
|
||||
color: var(--text-soft);
|
||||
font-size: 9px;
|
||||
}
|
||||
|
||||
.deployment-note {
|
||||
margin-top: 16px;
|
||||
padding: 12px;
|
||||
display: grid;
|
||||
grid-template-columns: auto 1fr;
|
||||
gap: 9px;
|
||||
color: var(--text-soft);
|
||||
border-left: 3px solid var(--accent);
|
||||
background: var(--accent-soft);
|
||||
}
|
||||
|
||||
.deployment-note p {
|
||||
font-size: 9px;
|
||||
line-height: 1.65;
|
||||
}
|
||||
|
||||
.deployment-note code {
|
||||
color: var(--text);
|
||||
font-family: "Cascadia Code", monospace;
|
||||
}
|
||||
|
||||
.settings-test-actions {
|
||||
margin-top: 18px;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.settings-test-actions .button svg:last-child {
|
||||
color: var(--accent-strong);
|
||||
}
|
||||
|
||||
.spin {
|
||||
animation: settings-spin 900ms linear infinite;
|
||||
}
|
||||
|
||||
@keyframes settings-spin {
|
||||
to { transform: rotate(360deg); }
|
||||
}
|
||||
|
||||
.settings-footer {
|
||||
min-height: 68px;
|
||||
padding: 12px 20px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 18px;
|
||||
border-top: 1px solid var(--line);
|
||||
background: var(--surface-raised);
|
||||
}
|
||||
|
||||
.settings-notice,
|
||||
.settings-footer-actions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.settings-notice {
|
||||
min-width: 0;
|
||||
gap: 6px;
|
||||
color: var(--text-soft);
|
||||
font-size: 9px;
|
||||
}
|
||||
|
||||
.settings-notice span {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.settings-notice.error {
|
||||
color: var(--warning);
|
||||
}
|
||||
|
||||
.settings-notice.success {
|
||||
color: var(--accent-strong);
|
||||
}
|
||||
|
||||
.settings-footer-actions {
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
@media (max-width: 1180px) {
|
||||
.studio-grid {
|
||||
grid-template-columns: 190px minmax(520px, 1fr);
|
||||
@@ -871,7 +1331,7 @@ textarea:focus-visible,
|
||||
}
|
||||
|
||||
.save-state,
|
||||
.topbar-actions .button-secondary,
|
||||
.topbar-actions .button-secondary:not(.settings-button),
|
||||
.brand-subtitle {
|
||||
display: none;
|
||||
}
|
||||
@@ -933,6 +1393,69 @@ textarea:focus-visible,
|
||||
.conversation {
|
||||
min-height: 230px;
|
||||
}
|
||||
|
||||
.settings-backdrop {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.settings-dialog {
|
||||
height: 100dvh;
|
||||
border: 0;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.settings-header {
|
||||
padding: 14px;
|
||||
}
|
||||
|
||||
.settings-readiness {
|
||||
padding: 10px 14px;
|
||||
grid-template-columns: auto 1fr;
|
||||
}
|
||||
|
||||
.readiness-meter {
|
||||
grid-column: 1 / -1;
|
||||
}
|
||||
|
||||
.settings-layout {
|
||||
grid-template-columns: 1fr;
|
||||
grid-template-rows: auto minmax(0, 1fr);
|
||||
}
|
||||
|
||||
.settings-nav {
|
||||
padding: 8px;
|
||||
display: flex;
|
||||
overflow-x: auto;
|
||||
border-right: 0;
|
||||
border-bottom: 1px solid var(--line);
|
||||
}
|
||||
|
||||
.settings-nav button {
|
||||
min-width: 108px;
|
||||
}
|
||||
|
||||
.settings-content {
|
||||
padding: 18px 15px 24px;
|
||||
}
|
||||
|
||||
.setting-field {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.setting-control-wrap,
|
||||
.option-help {
|
||||
grid-column: 1;
|
||||
grid-row: auto;
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
.settings-footer {
|
||||
padding: 10px 12px;
|
||||
}
|
||||
|
||||
.settings-notice {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
|
||||
Reference in New Issue
Block a user