feat(FN-2964): merge fusion/fn-2964

Commits merged:
- test(FN-2964): complete Step 2 — cover custom providers disclosure behavior
- feat(FN-2964): complete Step 1 — embed custom providers disclosure in onboarding
- fix(FN-2963): reuse shared onboarding disclosure for custom providers
- fix(FN-2963): address disclosure focus ring and mobile touch target
- fix(FN-2963): align custom providers disclosure with shared pattern
- feat(FN-2963): apply inline edit UX and tokenized custom provider styles
- fix(FN-2963): align custom providers UI with auth patterns
- fix(FN-2963): complete Step 5 — resolve lint gate in providers section
- test(FN-2963): complete Step 4 — add custom providers section tests
- feat(FN-2963): complete Step 3 — integrate custom providers section
- feat(FN-2963): complete Step 2 — add custom providers section styles
- feat(FN-2963): complete Step 1 — create custom providers section component
- feat(FN-2961): complete Step 6 — document custom provider settings
- test(FN-2961): complete Step 4 — cover custom provider routes
- feat(FN-2961): complete Step 3 — add custom provider API client
- feat(FN-2961): complete Step 2 — add custom provider CRUD routes
- feat(FN-2961): complete Step 1 — add custom provider core types

Files changed:
.../app/components/CustomProvidersSection.css      | 138 +++++++
 .../app/components/CustomProvidersSection.tsx      | 425 +++++++++++++++++++++
 .../app/components/ModelOnboardingModal.css        |  60 ---
 .../app/components/OnboardingDisclosure.css        |  67 ++++
 .../app/components/OnboardingDisclosure.tsx        |  38 ++
 .../__tests__/CustomProvidersSection.test.tsx      | 237 ++++++++++++
 .../__tests__/ModelOnboardingModal.test.tsx        |  67 +++-
 7 files changed, 967 insertions(+), 65 deletions(-)

Fusion-Task-Id: FN-2964
This commit is contained in:
Fusion
2026-04-29 23:39:18 -07:00
committed by gsxdsm
parent c1c5ba6f43
commit 74989993a3
7 changed files with 967 additions and 65 deletions

View File

@@ -218,66 +218,6 @@
}
/* === OnboardingDisclosure === */
.onboarding-disclosure {
display: flex;
flex-direction: column;
margin-top: var(--space-sm);
}
.onboarding-disclosure-trigger {
display: flex;
align-items: center;
gap: var(--space-xs);
background: none;
border: none;
color: var(--text-muted);
font-size: 12px;
cursor: pointer;
padding: var(--space-xs) 0;
transition: color var(--transition-fast);
font-family: inherit;
}
.onboarding-disclosure-trigger:hover {
color: var(--text);
}
.onboarding-disclosure-trigger:focus-visible {
outline: var(--focus-ring-strong);
border-radius: var(--radius-sm);
}
.onboarding-disclosure-chevron {
width: 14px;
height: 14px;
transition: transform var(--transition-fast);
flex-shrink: 0;
}
.onboarding-disclosure-trigger[aria-expanded="true"] .onboarding-disclosure-chevron {
transform: rotate(90deg);
}
.onboarding-disclosure-content {
padding: var(--space-sm) 0 var(--space-sm) 22px;
color: var(--text-muted);
font-size: 12px;
line-height: 1.5;
animation: onboarding-disclosure-enter 150ms ease-out;
}
@keyframes onboarding-disclosure-enter {
from {
opacity: 0;
transform: translateY(-4px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.model-onboarding-loading {
display: flex;
align-items: center;