blob: c035746b88b0ea096a44b2b93f8970681764e4bb [file]
/* ---- Enabled models: flat connection list. Each connection is one
* top-level row (logo · name + provider · status chip · chevron), sorted
* strictly in bridge.list() order. The Item primitive carries the row
* chrome (media / content / actions, hover + selected fills); this file
* only owns the scroll container, the hairline between rows, and the
* disabled dimming. Status tone lives on the Chip primitive, the default
* marker on the Chip `accent` variant — no bespoke status/tag CSS here. */
.connectionList {
max-height: 360px;
overflow-y: auto;
margin: 0;
padding: 0;
list-style: none;
}
.connectionRow {
border-radius: var(--radius-control);
}
.connectionList li + li .connectionRow {
border-top: var(--border-width-hairline) solid oklch(from var(--foreground) l c h / 0.06);
}
/* The default-connection selected wash rides the Item `selected` prop
(data-selected → --state-selected-bg), one selected-row implementation
across the app. */
.connectionRow[data-disabled="true"] {
opacity: var(--opacity-muted);
}
.catalogPillTabs,
.settingsSurface[data-modal="true"] .catalogPillTabs {
display: flex;
flex-wrap: wrap;
gap: var(--space-2);
}
.catalogPillTabs strong {
font-size: var(--font-size-ui);
font-weight: var(--font-weight-bold);
}
.providerMarketGrid,
.settingsSurface[data-modal="true"] .providerMarketGrid {
grid-template-columns: 1fr;
overflow: auto;
}
.providerCatalogRow {
border-radius: var(--radius-control);
}
.providerMarketGrid .providerCatalogRow + .providerCatalogRow,
.providerOAuthGrid .providerCatalogRow + .providerCatalogRow {
border-top: var(--border-width-hairline) solid oklch(from var(--foreground) l c h / 0.06);
}
/* Logo plates match the enabled list (compact 32px) so the page reads as
* one column of provider rows top to bottom. */
.providerCatalogRow .providerLogo {
width: 32px;
height: 32px;
/* No radius here: --radius-plate is a ratio, so the size change alone
keeps this plate the same shape as the 44px one. Restating a fixed
px would re-introduce the size drift PR-UI-13 removed. */
}
/* Gated providers carry a real trailing state badge in ItemActions (not an
* absolute ::after), tinted by the gate reason. The row itself is a plain
* div Item with no render prop, so it is inert — the provider-surface gate
* never lets a gated provider read as clickable. The state badge is now the
* Chip primitive (info = unavailable, warning = experimental); tone→alpha
* lives in chip.tsx, so no bespoke .is-state tint rules remain here. */
/* PR-UI-13 (@yuejing 2026-05-22): ProviderLogo size normalization.
*
* Audit §3.8 — "OnboardingHero (compact) 跟 ProvidersPanel (default)
* 大小不同,底图比例感觉不统一". Root cause: the compact override
* only resized width/height/border-radius, but inherited the default
* `0 8px 16px` drop shadow — at 32px the shadow extends ~25% beyond
* the icon, visually drifting from the default size. Border-radius
* ratios also drifted (29.5% default vs 31.25% compact vs 33% micro).
*
* Fix: pin a single ~27-28% border-radius ratio across all three
* sizes (md / sm / xs) and scale the drop shadow proportionally.
* Inner SVG keeps the existing 72% ratio so brand marks read the
* same at every size.
*
* 2026-07-27: that ratio is now carried by --radius-plate (27%), not
* by a per-size px value. The tier convergence had rewritten both
* sizes to --radius-surface, which silently reverted this fix —
* 8px reads 18.2% at 44px and 25% at 32px, the exact drift the audit
* above was raising. A percentage is scale-invariant, so the compact
* override no longer needs to restate the radius at all.
*/
/* Neutral, theme-aware plate. Provider identity now comes from the
official brand mark (provider-brand-marks.tsx), so the plate stays a
quiet foreground wash in both light and dark — no per-provider tints. */
.providerLogo {
width: 44px;
height: 44px;
display: grid;
place-items: center;
border-radius: var(--radius-plate);
background: var(--foreground-5);
color: var(--foreground);
box-shadow: inset 0 0 0 1px oklch(from var(--foreground) l c h / 0.06);
}
.providerLogo[data-compact="true"] {
width: 32px;
height: 32px;
}
/* Color marks keep their own fill. Inline monochrome SVGs inherit the plate
color; external monochrome assets use a mask because `<img>` documents do
not inherit `currentColor`. */
.providerLogo svg,
.providerLogo img,
.providerLogo .providerAssetMask {
width: 64%;
height: 64%;
display: block;
}
.providerAssetMask {
background: currentColor;
mask-position: center;
mask-repeat: no-repeat;
mask-size: contain;
}