Make task-detail PR numbers open their GitHub pull request when a URL is present. - Render the PR number as a secure external link when prInfo.url is available. - Keep the existing plain text PR number fallback when no URL is present. - Add focus/hover styling, dashboard documentation, regression tests, and a patch changeset. Files changed: .changeset/fn-7183-pr-number-link.md | 7 +++++++ docs/dashboard-guide.md | 1 + packages/dashboard/app/components/PrPanel.css | 13 ++++++++++++ packages/dashboard/app/components/PrPanel.tsx | 12 ++++++++++- .../app/components/__tests__/PrPanel.test.tsx | 24 ++++++++++++++++++++++ 5 files changed, 56 insertions(+), 1 deletion(-) Fusion-Task-Id: FN-7183 Fusion-Task-Lineage: 0a349723-9dda-4784-b747-b140b85a3013 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
325 lines
7.1 KiB
CSS
325 lines
7.1 KiB
CSS
.pr-panel-stack {
|
|
display: grid;
|
|
gap: var(--space-md);
|
|
}
|
|
|
|
.pr-panel-summary {
|
|
align-items: center;
|
|
display: flex;
|
|
gap: var(--space-sm);
|
|
justify-content: space-between;
|
|
margin-bottom: var(--space-sm);
|
|
}
|
|
|
|
.pr-panel-summary-badge {
|
|
background: color-mix(in srgb, var(--color-info) 20%, transparent);
|
|
border: var(--btn-border-width) solid color-mix(in srgb, var(--color-info) 30%, transparent);
|
|
border-radius: var(--radius-pill);
|
|
color: var(--color-info);
|
|
font-size: 0.75rem;
|
|
font-weight: 600;
|
|
padding: 0 var(--space-sm);
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
.pr-panel-section {
|
|
display: grid;
|
|
gap: var(--space-sm);
|
|
margin-bottom: var(--space-sm);
|
|
}
|
|
|
|
.pr-panel-row-label {
|
|
color: var(--text-muted);
|
|
font-size: 0.75rem;
|
|
font-weight: 600;
|
|
letter-spacing: 0.02em;
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
.pr-panel-checks-rollup {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: var(--space-sm);
|
|
font-size: 0.8125rem;
|
|
}
|
|
|
|
.pr-panel-tone-success {
|
|
color: var(--color-success);
|
|
}
|
|
|
|
.pr-panel-tone-error {
|
|
color: var(--color-error);
|
|
}
|
|
|
|
.pr-panel-tone-warning {
|
|
color: var(--color-warning);
|
|
}
|
|
|
|
.pr-panel-tone-muted {
|
|
color: var(--text-muted);
|
|
font-size: 0.8125rem;
|
|
}
|
|
|
|
.pr-panel-checks-details {
|
|
border: var(--btn-border-width) solid var(--border);
|
|
border-radius: var(--radius-md);
|
|
padding: var(--space-sm);
|
|
}
|
|
|
|
.pr-panel-checks-details summary {
|
|
color: var(--text-muted);
|
|
cursor: pointer;
|
|
font-size: 0.75rem;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.pr-panel-check-list {
|
|
display: grid;
|
|
gap: var(--space-xs);
|
|
list-style: none;
|
|
margin: var(--space-sm) 0 0;
|
|
padding: 0;
|
|
}
|
|
|
|
.pr-panel-check-item {
|
|
align-items: center;
|
|
display: grid;
|
|
gap: var(--space-sm);
|
|
grid-template-columns: auto minmax(0, 1fr) auto auto;
|
|
}
|
|
|
|
.pr-panel-check-dot {
|
|
justify-self: start;
|
|
}
|
|
|
|
.pr-panel-check-name {
|
|
overflow-wrap: anywhere;
|
|
}
|
|
|
|
.pr-panel-required {
|
|
border: var(--btn-border-width) solid var(--border);
|
|
border-radius: var(--radius-pill);
|
|
color: var(--text-muted);
|
|
font-size: 0.6875rem;
|
|
padding: 0 var(--space-sm);
|
|
}
|
|
|
|
.pr-panel-check-chip,
|
|
.pr-panel-review-badge {
|
|
border: var(--btn-border-width) solid transparent;
|
|
border-radius: var(--radius-pill);
|
|
font-size: 0.6875rem;
|
|
font-weight: 600;
|
|
padding: 0 var(--space-sm);
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
.pr-panel-check-chip--success,
|
|
.pr-panel-review-badge--success {
|
|
background: color-mix(in srgb, var(--color-success) 20%, transparent);
|
|
color: var(--color-success);
|
|
}
|
|
|
|
.pr-panel-check-chip--error,
|
|
.pr-panel-review-badge--error {
|
|
background: color-mix(in srgb, var(--color-error) 20%, transparent);
|
|
color: var(--color-error);
|
|
}
|
|
|
|
.pr-panel-check-chip--warning,
|
|
.pr-panel-review-badge--warning {
|
|
background: color-mix(in srgb, var(--color-warning) 20%, transparent);
|
|
color: var(--color-warning);
|
|
}
|
|
|
|
.pr-panel-check-chip--muted,
|
|
.pr-panel-review-badge--muted {
|
|
background: color-mix(in srgb, var(--text-muted) 20%, transparent);
|
|
color: var(--text-muted);
|
|
}
|
|
|
|
.pr-panel-comment-time {
|
|
color: var(--text-muted);
|
|
font-size: 0.75rem;
|
|
}
|
|
|
|
.pr-card a.pr-number {
|
|
text-decoration: none;
|
|
}
|
|
|
|
.pr-card a.pr-number:hover {
|
|
text-decoration: underline;
|
|
}
|
|
|
|
.pr-card a.pr-number:focus-visible {
|
|
box-shadow: var(--focus-ring-strong);
|
|
outline: 0;
|
|
}
|
|
|
|
.pr-panel-refresh-icon--muted {
|
|
opacity: 0.6;
|
|
}
|
|
|
|
.pr-panel-review-thread {
|
|
border: var(--btn-border-width) solid var(--border);
|
|
border-radius: var(--radius-md);
|
|
display: grid;
|
|
gap: var(--space-xs);
|
|
padding: var(--space-sm);
|
|
}
|
|
|
|
.pr-panel-review-thread-header {
|
|
align-items: center;
|
|
display: flex;
|
|
gap: var(--space-sm);
|
|
justify-content: space-between;
|
|
}
|
|
|
|
.pr-panel-review-item {
|
|
color: var(--text);
|
|
font-size: 0.8125rem;
|
|
text-decoration: none;
|
|
}
|
|
|
|
.pr-panel-review-item:hover {
|
|
color: var(--text);
|
|
text-decoration: underline;
|
|
}
|
|
|
|
.pr-hint--info {
|
|
background: color-mix(in srgb, var(--color-info) 12%, transparent);
|
|
border: var(--btn-border-width) solid color-mix(in srgb, var(--color-info) 35%, transparent);
|
|
border-radius: var(--radius-md);
|
|
color: var(--color-info);
|
|
font-size: 0.8125rem;
|
|
padding: var(--space-md);
|
|
}
|
|
|
|
.pr-hint--warning {
|
|
background: color-mix(in srgb, var(--color-warning) 12%, transparent);
|
|
border: var(--btn-border-width) solid color-mix(in srgb, var(--color-warning) 35%, transparent);
|
|
border-radius: var(--radius-md);
|
|
color: var(--color-warning);
|
|
font-size: 0.8125rem;
|
|
padding: var(--space-md);
|
|
}
|
|
|
|
.pr-hint--conflict {
|
|
align-items: center;
|
|
background: color-mix(in srgb, var(--color-warning) 10%, transparent);
|
|
border: var(--btn-border-width) solid var(--color-warning);
|
|
border-radius: var(--radius-md);
|
|
color: var(--color-warning);
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
font-size: 0.8125rem;
|
|
gap: var(--space-sm);
|
|
justify-content: space-between;
|
|
padding: var(--space-md);
|
|
}
|
|
|
|
.pr-hint--success {
|
|
background: color-mix(in srgb, var(--color-success) 12%, transparent);
|
|
border: var(--btn-border-width) solid color-mix(in srgb, var(--color-success) 35%, transparent);
|
|
border-radius: var(--radius-md);
|
|
color: var(--color-success);
|
|
font-size: 0.8125rem;
|
|
padding: var(--space-md);
|
|
}
|
|
|
|
.pr-merge-controls {
|
|
display: grid;
|
|
gap: var(--space-sm);
|
|
}
|
|
|
|
.pr-conflict-section {
|
|
background: color-mix(in srgb, var(--color-warning) 10%, transparent);
|
|
border: var(--btn-border-width) solid color-mix(in srgb, var(--color-warning) 35%, transparent);
|
|
border-radius: var(--radius-md);
|
|
display: grid;
|
|
gap: var(--space-sm);
|
|
padding: var(--space-md);
|
|
}
|
|
|
|
.pr-conflict-section__header {
|
|
align-items: center;
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: var(--space-sm);
|
|
justify-content: space-between;
|
|
}
|
|
|
|
.pr-conflict-files {
|
|
margin: 0;
|
|
padding-inline-start: var(--space-lg);
|
|
}
|
|
|
|
.pr-conflict-commands {
|
|
background: var(--surface);
|
|
border-radius: var(--radius-sm);
|
|
margin: 0;
|
|
overflow-x: auto;
|
|
padding: var(--space-sm);
|
|
}
|
|
|
|
.pr-merge-error {
|
|
align-items: center;
|
|
background: color-mix(in srgb, var(--color-error) 10%, transparent);
|
|
border: var(--btn-border-width) solid color-mix(in srgb, var(--color-error) 35%, transparent);
|
|
border-radius: var(--radius-md);
|
|
color: var(--color-error);
|
|
display: flex;
|
|
gap: var(--space-sm);
|
|
justify-content: space-between;
|
|
padding: var(--space-md);
|
|
}
|
|
|
|
.pr-error {
|
|
background: color-mix(in srgb, var(--color-error) 10%, transparent);
|
|
border: var(--btn-border-width) solid color-mix(in srgb, var(--color-error) 35%, transparent);
|
|
border-radius: var(--radius-md);
|
|
color: var(--color-error);
|
|
display: grid;
|
|
gap: var(--space-sm);
|
|
padding: var(--space-md);
|
|
}
|
|
|
|
.pr-error__hint {
|
|
color: var(--text);
|
|
}
|
|
|
|
.pr-error__actions {
|
|
align-items: center;
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: var(--space-sm);
|
|
}
|
|
|
|
.pr-error__retry:focus-visible,
|
|
.pr-error__dismiss:focus-visible {
|
|
box-shadow: var(--focus-ring-strong);
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.pr-panel-checks-rollup {
|
|
align-items: flex-start;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--space-xs);
|
|
}
|
|
|
|
.pr-panel-check-item {
|
|
grid-template-columns: auto minmax(0, 1fr);
|
|
}
|
|
|
|
.pr-panel-required,
|
|
.pr-panel-check-chip {
|
|
justify-self: start;
|
|
}
|
|
|
|
.pr-conflict-section__header {
|
|
align-items: flex-start;
|
|
flex-direction: column;
|
|
}
|
|
}
|