Delay dashboard GitHub setup warnings until the project grace period expires while keeping AI setup warnings immediate. - Add per-project GitHub warning delay state and persistence. - Route dashboard GitHub warnings to Settings → Authentication with a Connect GitHub action. - Hide non-actionable GitHub-only warnings in the New Task modal and update localized copy, docs, and tests. Files changed: .changeset/fn-7475-github-setup-warning.md | 7 ++ docs/dashboard-guide.md | 6 + packages/dashboard/app/App.tsx | 11 +- packages/dashboard/app/components/NewTaskModal.tsx | 8 +- .../app/components/SetupWarningBanner.css | 10 ++ .../app/components/SetupWarningBanner.tsx | 18 ++- .../app/components/__tests__/NewTaskModal.test.tsx | 46 ++++++- .../__tests__/SetupWarningBanner.test.tsx | 40 ++++++ .../app/components/dashboard/DashboardBanners.tsx | 3 + .../dashboard/__tests__/DashboardBanners.test.tsx | 125 ++++++++++++++++++- .../dashboard/app/components/dashboard/types.ts | 1 + .../__tests__/useGithubSetupWarningDelay.test.ts | 134 +++++++++++++++++++++ .../app/hooks/useGithubSetupWarningDelay.ts | 96 +++++++++++++++ packages/dashboard/app/utils/projectStorage.ts | 1 + packages/i18n/locales/en/app.json | 5 +- packages/i18n/locales/es/app.json | 5 +- packages/i18n/locales/fr/app.json | 5 +- packages/i18n/locales/ko/app.json | 5 +- packages/i18n/locales/zh-CN/app.json | 5 +- packages/i18n/locales/zh-TW/app.json | 5 +- packages/i18n/src/resources.d.ts | 127 +++++++++++++------ 21 files changed, 606 insertions(+), 57 deletions(-) Fusion-Task-Id: FN-7475 Fusion-Task-Lineage: 5bf1fffa-b58c-42a1-b170-367a4c20eaaf Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
101 lines
2.3 KiB
CSS
101 lines
2.3 KiB
CSS
/* === SetupWarningBanner === */
|
|
.setup-warning-banner {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--space-sm);
|
|
padding: var(--space-sm) var(--space-md);
|
|
margin-bottom: var(--space-md);
|
|
border-radius: var(--radius-md);
|
|
border-inline-start: var(--space-xs) solid var(--color-warning);
|
|
background: color-mix(in srgb, var(--color-warning) 8%, transparent);
|
|
}
|
|
|
|
.setup-warning-banner__item {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--space-xs);
|
|
}
|
|
|
|
.setup-warning-banner__title {
|
|
color: var(--text);
|
|
}
|
|
|
|
.setup-warning-banner__description {
|
|
margin: 0;
|
|
color: var(--text-muted);
|
|
}
|
|
|
|
.setup-warning-banner__actions {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: var(--space-sm);
|
|
}
|
|
|
|
.setup-warning-banner--compact {
|
|
flex-direction: row;
|
|
align-items: flex-start;
|
|
justify-content: space-between;
|
|
gap: var(--space-sm);
|
|
}
|
|
|
|
.setup-warning-banner--dismissible:not(.setup-warning-banner--compact) {
|
|
position: relative;
|
|
padding-inline-end: calc(var(--space-2xl) + var(--space-lg) + var(--space-xs));
|
|
}
|
|
|
|
.setup-warning-banner--dismissible:not(.setup-warning-banner--compact) .setup-warning-banner__dismiss {
|
|
position: absolute;
|
|
top: var(--space-sm);
|
|
inset-inline-end: var(--space-sm);
|
|
}
|
|
|
|
.setup-warning-banner__compact-text {
|
|
margin: 0;
|
|
color: var(--text);
|
|
flex: 1;
|
|
}
|
|
|
|
.setup-warning-banner__dismiss {
|
|
align-self: flex-start;
|
|
background: none;
|
|
border: none;
|
|
color: var(--text-muted);
|
|
cursor: pointer;
|
|
padding: var(--space-xs);
|
|
border-radius: var(--radius-sm);
|
|
transition: color var(--transition-fast), background var(--transition-fast);
|
|
line-height: 0;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.setup-warning-banner__dismiss:hover {
|
|
color: var(--text);
|
|
background: color-mix(in srgb, var(--color-warning) 12%, transparent);
|
|
}
|
|
|
|
.setup-warning-banner__dismiss:focus-visible {
|
|
outline: none;
|
|
box-shadow: var(--focus-ring-strong);
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.setup-warning-banner--compact {
|
|
padding: var(--space-xs) var(--space-sm);
|
|
}
|
|
|
|
.setup-warning-banner__actions .btn {
|
|
width: 100%;
|
|
}
|
|
}
|
|
|
|
@media (max-width: 480px) {
|
|
.setup-warning-banner--dismissible:not(.setup-warning-banner--compact) {
|
|
padding-inline-end: var(--space-md);
|
|
}
|
|
|
|
.setup-warning-banner--dismissible:not(.setup-warning-banner--compact) .setup-warning-banner__dismiss {
|
|
position: static;
|
|
align-self: flex-end;
|
|
}
|
|
}
|