Files
fusion/packages/dashboard/app/components/WorkflowStepManager.css
Fusion 95d742abb3 feat(FN-4468): add workflow step gateMode advisory gating
Adds an "advisory" `gateMode` option for workflow steps: steps in advisory mode log findings but no longer block merge completion, while steps that must block can still be configured as blocking. The change covers the workflow step types and schema, executor gating logic, dashboard UI in WorkflowSte

Fusion-Task-Id: FN-4468
2026-05-14 05:35:12 -07:00

539 lines
9.4 KiB
CSS

/* === Workflow Step Manager Modal === */
.modal.workflow-step-manager-modal {
width: min(900px, 95vw);
max-width: 95vw;
min-width: 480px;
height: 80vh;
min-height: 480px;
max-height: calc(100dvh - var(--overlay-padding-top, 10vh) - 16px);
overflow: hidden;
resize: both;
}
.wfm-body {
padding: var(--space-md);
flex: 1;
min-height: 0;
overflow-y: auto;
}
/* Loading / empty states */
.wfm-empty {
text-align: center;
padding: var(--space-xl);
color: var(--text-muted);
font-size: 14px;
}
.wfm-loading {
text-align: center;
padding: var(--space-xl);
color: var(--text-muted);
}
/* Tab navigation row */
.wfm-tab-row {
display: flex;
gap: var(--space-sm);
margin-bottom: var(--space-md);
border-bottom: 1px solid var(--border);
padding-bottom: var(--space-sm);
}
.wfm-tab-btn {
display: flex;
align-items: center;
gap: 6px;
font-size: 13px;
padding: 6px 12px;
}
/* Step list */
.wfm-step-list {
display: flex;
flex-direction: column;
gap: var(--space-sm);
}
/* Step card */
.wfm-step-card {
padding: 12px 16px;
border: 1px solid var(--border);
border-radius: var(--radius-md);
background: var(--bg-secondary);
}
.wfm-step-card-top {
display: flex;
justify-content: space-between;
align-items: flex-start;
}
.wfm-step-card-info {
flex: 1;
min-width: 0;
}
.wfm-step-card-title-row {
display: flex;
align-items: center;
gap: var(--space-sm);
margin-bottom: 4px;
}
.wfm-step-card-name {
font-weight: 600;
font-size: 14px;
}
.wfm-step-card-desc {
font-size: 12px;
color: var(--text-muted);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.wfm-step-card-actions {
display: flex;
gap: 4px;
margin-left: var(--space-sm);
flex-shrink: 0;
}
.wfm-delete-confirm {
display: flex;
gap: 4px;
align-items: center;
}
/* Badges */
.wfm-badge {
font-size: 11px;
padding: 2px 6px;
border-radius: var(--radius-sm);
}
.wfm-badge-enabled {
background: color-mix(in srgb, var(--ws-success) 15%, transparent);
color: var(--ws-success);
}
.wfm-badge-disabled {
background: var(--bg-tertiary);
color: var(--text-muted);
}
.wfm-badge-prompt {
background: color-mix(in srgb, var(--ws-pre-merge) 15%, transparent);
color: var(--ws-pre-merge);
}
.wfm-badge-script {
background: color-mix(in srgb, var(--ws-post-merge) 15%, transparent);
color: var(--ws-post-merge);
}
.wfm-badge-pre-merge {
background: color-mix(in srgb, var(--ws-pre-merge) 15%, transparent);
color: var(--ws-pre-merge);
}
.wfm-badge-post-merge {
background: color-mix(in srgb, var(--ws-info) 15%, transparent);
color: var(--ws-info);
}
.wfm-badge-default-on {
background: color-mix(in srgb, var(--ws-warning) 15%, transparent);
color: var(--ws-warning);
}
.wfm-badge-gate {
background: color-mix(in srgb, var(--color-warning) 15%, transparent);
color: var(--color-warning);
}
.wfm-badge-advisory {
background: color-mix(in srgb, var(--color-info) 15%, transparent);
color: var(--color-info);
}
.wfm-badge-category {
font-size: 11px;
padding: 2px 6px;
border-radius: var(--radius-sm);
}
.wfm-badge-category-quality {
background: color-mix(in srgb, var(--ws-quality) 15%, transparent);
color: var(--ws-quality);
}
.wfm-badge-category-security {
background: color-mix(in srgb, var(--ws-security) 15%, transparent);
color: var(--ws-security);
}
.wfm-badge-category-plugin {
background: color-mix(in srgb, var(--color-info) 15%, transparent);
color: var(--color-info);
}
.wfm-delete-confirm-btn {
color: var(--ws-error);
}
/* Template cards */
.wfm-template-list {
display: flex;
flex-direction: column;
gap: 12px;
}
.wfm-template-card {
padding: var(--space-md);
border: 1px solid var(--border);
border-radius: var(--radius-md);
background: var(--bg-secondary);
}
.wfm-template-inner {
display: flex;
gap: 12px;
align-items: flex-start;
}
.wfm-template-icon {
padding: var(--space-sm);
border-radius: var(--radius-sm);
background: var(--bg-tertiary);
color: var(--text);
flex-shrink: 0;
}
.wfm-template-content {
flex: 1;
min-width: 0;
}
.wfm-template-title-row {
display: flex;
align-items: center;
gap: var(--space-sm);
margin-bottom: 4px;
}
.wfm-template-name {
font-weight: 600;
font-size: 14px;
}
.wfm-template-desc {
font-size: 12px;
color: var(--text-muted);
margin-bottom: var(--space-sm);
}
.wfm-template-add-btn {
font-size: 12px;
padding: 4px 12px;
display: flex;
align-items: center;
gap: 4px;
}
/* Create chooser */
.wfm-create-chooser {
display: flex;
flex-direction: column;
gap: var(--space-md);
padding: var(--space-md);
border: 1px solid var(--border);
border-radius: var(--radius-md);
background: var(--bg-secondary);
}
.wfm-create-chooser-hint {
margin: 0;
color: var(--text-muted);
}
.wfm-create-custom-btn {
display: flex;
align-items: center;
justify-content: center;
gap: var(--space-xs);
}
/* Edit/create form */
.wfm-form {
padding: var(--space-md);
border: 1px solid var(--border);
border-radius: var(--radius-md);
background: var(--bg-secondary);
}
.wfm-form-title {
margin: 0 0 12px;
font-size: 14px;
font-weight: 600;
}
.wfm-form-fields {
display: flex;
flex-direction: column;
gap: var(--space-md);
}
.wfm-field label,
.wfm-field-label {
display: block;
font-size: 12px;
color: var(--text-muted);
margin-bottom: 4px;
}
.wfm-field input[type="text"],
.wfm-field textarea,
.wfm-field select {
width: 100%;
padding: 8px 12px;
border-radius: var(--radius-md);
border: 1px solid var(--border);
background: var(--bg);
color: var(--text);
font-size: 13px;
font-family: inherit;
outline: none;
transition:
border-color var(--transition-fast),
box-shadow var(--transition-fast);
}
.wfm-field input[type="text"]:focus,
.wfm-field textarea:focus,
.wfm-field select:focus {
border-color: var(--todo);
box-shadow: var(--focus-ring);
}
.wfm-field textarea {
resize: vertical;
}
.wfm-field textarea.wfm-prompt-textarea {
font-family: var(--font-mono, monospace);
}
/* Mode selector */
.wfm-mode-selector {
display: flex;
gap: var(--space-sm);
}
.wfm-mode-btn {
display: flex;
align-items: center;
gap: 6px;
font-size: 12px;
padding: 6px 12px;
flex: 1;
justify-content: center;
}
/* Prompt header row (label + refine button) */
.wfm-prompt-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 4px;
}
.wfm-refine-btn {
font-size: 12px;
display: flex;
align-items: center;
gap: 4px;
}
.wfm-refine-btn span {
font-size: 11px;
}
/* No-scripts placeholder */
.wfm-no-scripts {
padding: 8px 12px;
border-radius: var(--radius-md);
border: 1px solid var(--border);
background: var(--bg-tertiary);
color: var(--text-muted);
font-size: 12px;
}
/* Checkbox toggle */
.wfm-checkbox-label {
display: flex;
align-items: center;
gap: var(--space-sm);
font-size: 13px;
cursor: pointer;
}
.wfm-checkbox-label input[type="checkbox"] {
accent-color: var(--todo);
}
/* Form actions */
.wfm-form-actions {
display: flex;
justify-content: flex-end;
gap: var(--space-sm);
margin-top: 4px;
}
/* Footer */
.wfm-footer {
padding: 12px 16px;
border-top: 1px solid var(--border);
}
.wfm-footer-add-btn {
display: flex;
align-items: center;
gap: 6px;
}
/* Spinner */
.wfm-spinner {
margin: 0 auto var(--space-sm);
}
.wfm-model-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
}
.wfm-model-header label {
margin-bottom: 0;
}
.wfm-model-clear-btn {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 11px;
color: var(--text-tertiary);
background: none;
border: none;
cursor: pointer;
padding: 2px 6px;
border-radius: 4px;
}
.wfm-model-clear-btn:hover {
color: var(--text-muted);
background: var(--bg-tertiary);
}
.wfm-model-hint {
display: block;
font-size: 11px;
color: var(--text-tertiary);
margin-bottom: 6px;
}
@media (max-width: 768px) {
/* Full-screen sheet on mobile — drop the overlay's top padding so the
modal fills the viewport instead of being pushed below it. */
.modal-overlay:has(.workflow-step-manager-modal) {
padding-top: 0;
align-items: stretch;
justify-content: stretch;
}
.modal.workflow-step-manager-modal {
width: 100vw;
min-width: 0;
max-width: 100vw;
height: 100dvh;
min-height: 0;
max-height: 100dvh;
margin: 0;
border: none;
border-radius: 0;
resize: none;
}
.wfm-body {
flex: 1;
min-height: 0;
max-height: none;
overflow-y: auto;
}
.wfm-tab-row {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
scrollbar-width: none;
}
.wfm-tab-row::-webkit-scrollbar {
display: none;
}
.wfm-tab-btn {
flex-shrink: 0;
white-space: nowrap;
}
.wfm-step-card-top {
flex-wrap: wrap;
gap: var(--space-sm);
}
.wfm-step-card-title-row {
flex-wrap: wrap;
}
.wfm-step-card-actions {
flex-wrap: wrap;
margin-left: 0;
width: 100%;
justify-content: flex-end;
}
.wfm-step-card-desc {
overflow: visible;
text-overflow: clip;
white-space: normal;
word-break: break-word;
}
.wfm-template-inner {
flex-direction: column;
}
.wfm-mode-selector {
flex-wrap: wrap;
}
.wfm-form-actions {
flex-direction: column;
}
.wfm-form-actions .btn {
width: 100%;
}
.wfm-create-custom-btn {
width: 100%;
}
.wfm-footer {
padding: 12px 14px;
}
}