返回 DeepSeek-Reasonix
ProviderConnections.css
根目录 / desktop / frontend / src / components / ProviderConnections.css
1 .provider-connections { display: grid; grid-template-columns: minmax(180px, 250px) minmax(0, 1fr); border: 1px solid var(--border); border-radius: 12px; overflow: hidden; }
2 .provider-connections[hidden], .provider-connections [hidden] { display: none !important; }
3 .provider-connections__nav { padding: 14px; border-right: 1px solid var(--border); display: flex; flex-direction: column; gap: 14px; min-width: 0; }
4 .provider-connections__nav > input { width: 100%; min-width: 0; flex: none; box-sizing: border-box; }
5 .provider-connections__list { max-height: 620px; overflow-y: auto; }
6 .provider-connections__brand { display: flex; align-items: center; gap: 8px; padding: 14px 6px 8px; }
7 .provider-connections__brand strong { flex: 1; overflow-wrap: anywhere; }
8 .provider-connections__item { display: flex; align-items: baseline; gap: 9px; width: 100%; border: 1px solid transparent; border-radius: 8px; padding: 10px 12px; color: inherit; background: transparent; text-align: left; font: inherit; cursor: pointer; }
9 .provider-connections__item strong { font-weight: 500; overflow-wrap: anywhere; }
10 .provider-connections__item small { display: block; color: var(--fg-faint); margin-top: 4px; }
11 .provider-connections__item:hover { background: var(--bg-soft); }
12 .provider-connections__item[aria-current="true"] { background: var(--bg-soft); border-color: var(--accent); }
13 .provider-connections__item:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
14 .provider-connections__status { width: 7px; height: 7px; flex: 0 0 7px; border-radius: 50%; background: var(--fg-faint); }
15 .provider-connections__status--ready { background: var(--success, #23965a); }
16 .provider-connections__detail { min-width: 0; padding: 20px; }
17 .provider-connections .provider-access-card--detail { border: 0; box-shadow: none; padding: 0; display: flex; flex-direction: column; }
18 .provider-access-card--detail > .provider-editor { order: 1; }
19 .provider-access-card--detail > :not(.provider-access-card__head):not(.provider-access-card__desc):not(.provider-editor) { order: 2; }
20 .provider-connections .provider-connections__back { display: none; }
21 @media (max-width: 760px) {
22 .provider-connections { grid-template-columns: minmax(0, 1fr); }
23 .provider-connections__nav { border-right: 0; }
24 .provider-connections__detail { display: none; padding: 12px; }
25 .provider-connections--detail > .provider-connections__nav { display: none; }
26 .provider-connections--detail > .provider-connections__detail { display: block; }
27 .provider-connections .provider-connections__back { display: inline-flex; margin-bottom: 16px; }
28 }
29
30 .provider-connections .provider-editor { border: 0; padding-inline: 0; box-shadow: none; }
31 .connection-title { display: inline-flex; align-items: center; gap: 8px; border: 0; padding: 0; background: transparent; color: inherit; font: inherit; text-align: left; cursor: pointer; overflow-wrap: anywhere; }
32 .connection-title:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }
33 .connection-title svg { flex-shrink: 0; color: var(--fg-faint); }
34 .connection-title-editor { min-width: 0; max-width: 100%; }
35 .connection-title-editor__row { display: flex; align-items: center; gap: 6px; }
36 .connection-title-editor__row .mem-input { width: 220px; min-width: 0; }
37 .connection-title-editor small { display: block; font-size: 12px; font-weight: normal; }
38 .provider-model-draft--inline .provider-model-draft__list { display: flex; flex-direction: column; }
39 .provider-model-draft--inline .provider-model-draft__option { display: flex; flex-direction: row; flex-wrap: wrap; align-items: center; gap: 10px; }
40 .provider-model-draft--inline .provider-model-draft__model { flex: 1; min-width: 150px; }
41 .provider-key-compact__head { display: flex; align-items: center; gap: 8px; }
42 .provider-key-compact__head > strong, .provider-model-toolbar > strong { margin-right: auto; }
43 .provider-key-compact__more { position: relative; }
44
45 .provider-key-compact__menu { position: absolute; right: 0; top: 100%; width: min(300px, 70vw); padding: 12px; background: var(--bg-elev); border: 1px solid var(--border); border-radius: 8px; z-index: var(--z-popover); }
46
47 .btn.provider-icon-action { min-width: 36px; min-height: 36px; padding: 6px; border: 0; background: transparent; list-style: none; }
48 .provider-icon-action::-webkit-details-marker { display: none; }
49
50 /* Compact editor: one aligned form and one flat model list. */
51
52 .provider-editor.provider-editor--compact { gap: 20px; background: var(--bg-elev); border: 0; box-shadow: none; padding: 0; font-size: 14px; }
53 .provider-connection-fields { display: flex; flex-direction: column; gap: 16px; padding: 12px 0 24px; border-bottom: 1px solid var(--border); }
54 .provider-connection-fields h3 { margin: 0 0 4px; font-size: var(--font-control); }
55 .provider-connection-field { display: grid; grid-template-columns: minmax(0, 1fr); align-items: start; gap: 8px; }
56 .provider-connection-field > .set-label { margin: 0; }
57 .provider-connection-field > .mem-input, .provider-connection-field > .mem-select { width: 100%; min-height: 40px; margin: 0; background: var(--bg-elev); border-radius: 8px; }
58 .provider-field-help { grid-column: 1; color: var(--fg-faint); font-size: var(--font-control-small); }
59 .provider-key-compact__head > strong { flex: 0 0 130px; margin-right: 8px; font-weight: 500; }
60 .provider-key-placeholder { flex: 1; min-width: 0; overflow: hidden; white-space: nowrap; padding: 10px 12px; border: 1px solid var(--border); border-radius: 8px; color: var(--fg-faint); }
61 .provider-key-compact .set-key { margin-top: 12px; }
62 .provider-key-compact__menu { display: flex; flex-direction: column; gap: 8px; box-sizing: border-box; }
63 .provider-editor--compact .provider-model-draft--inline { border: 0; padding: 0; gap: 16px; }
64 .provider-model-draft--inline .provider-model-toolbar { justify-content: flex-start; gap: 12px; }
65 .provider-model-draft--inline .provider-model-toolbar > strong { margin: 0; }
66 .provider-model-draft--inline .provider-model-draft__tools { margin-left: auto; }
67 .provider-model-draft--inline .provider-model-draft__list { gap: 0; padding: 0; max-height: 360px; border: 1px solid var(--border); border-radius: 8px; }
68 .provider-model-draft--inline .provider-model-draft__option { flex-wrap: nowrap; min-height: 56px; box-sizing: border-box; padding: 8px 12px; border: 0; border-bottom: 1px solid var(--border); border-radius: 0; background: transparent; font-family: var(--font-sans); font-size: var(--font-control); }
69 .provider-model-draft--inline .provider-model-draft__option:last-child { border-bottom: 0; }
70 .provider-model-draft--inline .provider-model-draft__model { min-width: 0; gap: 12px; }
71 .provider-model-draft--inline input[type="checkbox"] { accent-color: var(--accent); width: 16px; height: 16px; }
72 .provider-context-badge { flex-shrink: 0; padding: 4px 8px; border: 1px solid var(--border); border-radius: 6px; color: var(--fg-faint); font-size: var(--font-control-small); }
73 .provider-editor--compact .provider-capabilities { padding: 0; }
74 .provider-editor--compact .provider-capabilities > .provider-card-block__label { display: none; }
75 .provider-editor--compact .provider-capability-row { margin: 0; border: 0; padding: 16px 0; }
76 .provider-editor--compact .provider-editor-advanced { border: 0; border-top: 1px solid var(--border); border-radius: 0; background: transparent; }
77 .provider-editor-footer { flex: none; padding: 16px 0; background: var(--bg-elev); border-top: 1px solid var(--border); }
78 .provider-editor-footer > span { margin-right: auto; color: var(--fg-faint); font-size: var(--font-control-small); }
79 @media (max-width: 900px) {
80 .provider-connection-field { grid-template-columns: minmax(0, 1fr); }
81 .provider-field-help { grid-column: 1; }
82 .provider-key-compact__head { flex-wrap: wrap; }
83 .provider-key-compact__head > strong { flex-basis: 100%; }
84 .provider-model-draft--inline .provider-model-toolbar { flex-wrap: wrap; }
85
86 }
87
88 .provider-editor--compact .set-label, .provider-editor--compact .mem-input, .provider-editor--compact .mem-select { font-size: 14px; }
89 .provider-editor--compact .set-label { font-weight: 500; }
90 .provider-editor--compact h3, .provider-editor--compact .provider-model-toolbar > strong { font-size: 16px; }
91 .provider-editor--compact .provider-model-draft__option { font-size: 14px; }
92 .provider-editor--compact .provider-editor-advanced__hint { display: none; }
93
94 .provider-connection-field > .mem-select { max-width: none; }
95 .provider-editor-footer .btn { min-height: 36px; padding-inline: 18px; font-size: 14px; }
96
97 .provider-model-dialog { width: min(900px, calc(100vw - 32px)); max-height: calc(100vh - 40px); box-sizing: border-box; padding: 28px 32px 24px; border: 1px solid var(--border); border-radius: 16px; background: var(--bg-elev); color: var(--fg); font: 14px var(--font-sans); }
98 .provider-model-dialog::backdrop { background: #0008; }
99 .provider-model-dialog header, .provider-model-dialog footer { display: flex; align-items: center; gap: 12px; }
100 .provider-model-dialog h2 { flex: 1; margin: 0; font-size: 21px; }
101 .provider-model-dialog h3 { margin: 0 0 16px; font-size: 16px; }
102 .provider-model-dialog__id { display: grid; gap: 12px; margin: 24px 0; }
103 .provider-model-dialog__id > span { display: flex; align-items: center; gap: 10px; overflow-wrap: anywhere; }
104 .provider-model-dialog__columns { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(280px, .95fr); gap: 32px; padding: 22px 0 24px; border-block: 1px solid var(--border); }
105 .provider-model-dialog__columns aside { border-left: 0; border-radius: 12px; background: color-mix(in srgb, var(--bg) 62%, transparent); padding: 18px 20px; }
106 .provider-model-dialog section label { display: grid; grid-template-columns: 1fr auto; align-items: center; gap: 8px; }
107 .provider-model-dialog .mem-input, .provider-model-dialog .mem-select { width: 100%; box-sizing: border-box; font-size: 14px; min-height: 40px; }
108 .provider-model-dialog section label .mem-input { grid-column: 1 / -1; }
109 .provider-model-dialog p, .provider-model-dialog small { color: var(--fg-faint); line-height: 1.5; }
110 .provider-model-dialog p { margin: 7px 0 16px; font-size: 12px; }
111 .provider-model-dialog details { margin-top: 24px; }
112 .provider-model-dialog summary { cursor: pointer; margin-bottom: 12px; }
113 .provider-model-dialog dl { margin: 0; }
114 .provider-model-dialog dl > div { display: grid; grid-template-columns: 44px 1fr; gap: 12px; border-bottom: 1px solid var(--border); padding: 18px 0; }
115 .provider-model-dialog dd { margin: 0; overflow-wrap: anywhere; }
116 .provider-model-dialog footer { padding-top: 24px; }
117 .provider-model-dialog footer small { margin-right: auto; }
118 .provider-model-dialog [role="alert"] { color: var(--danger); }
119 @media (max-width: 600px) {
120 .provider-model-dialog { padding: 18px; }
121 .provider-model-dialog__columns { grid-template-columns: 1fr; gap: 20px; }
122 .provider-model-dialog__columns aside { padding-left: 0; border-left: 0; }
123 .provider-model-dialog footer { flex-wrap: wrap; }
124 }
125 .provider-model-dialog__capability-title { margin: 18px 0 10px; color: var(--fg-faint); }
126 .provider-model-dialog__chips { display: flex; flex-wrap: wrap; gap: 8px; }
127 .provider-model-dialog__chips label { display: inline-flex; align-items: center; gap: 8px; padding: 8px 10px; border: 1px solid var(--border); border-radius: 8px; }
128 .provider-model-dialog__chips input { accent-color: var(--accent); margin: 0; }
129 .provider-model-dialog__chips label:has(input:disabled:not(:checked)) { color: var(--fg-faint); }
130 .provider-model-dialog__effort-card { margin-top: 18px; padding: 16px; border: 1px solid var(--border); border-radius: 12px; background: color-mix(in srgb, var(--bg) 48%, transparent); }
131 .provider-model-dialog__effort-card > label { margin-bottom: 9px; }
132 .provider-model-dialog__effort-card .provider-model-dialog__chips { margin-bottom: 14px; }
133 .provider-model-dialog__effort-card .provider-model-dialog__chips label { padding: 7px 9px; background: var(--bg-elev); }
134 .provider-model-dialog__effort-card > p { margin-bottom: 0; }
135
136 .provider-model-dialog .mem-input, .provider-model-dialog .mem-select { background: var(--bg-elev); }
137
138 /* One viewport owner; navigation and editor body scroll independently. */
139 .settings-center__content:has(.provider-connections:not([hidden])):not(:has(.model-access-page[hidden])) { display: flex; flex-direction: column; overflow: hidden; }
140 .settings-page:has(.provider-connections:not([hidden])):not(:has(.model-access-page[hidden])),
141 .settings-section:has(.provider-connections:not([hidden])),
142 .settings-section__body:has(.provider-connections:not([hidden])),
143 .provider-access-grid:has(.provider-connections:not([hidden])) { display: flex; flex-direction: column; flex: 1; min-height: 0; }
144 .settings-page:has(.provider-connections:not([hidden])):not(:has(.model-access-page[hidden])) > .settings-page__header,
145 .settings-page:has(.provider-connections:not([hidden])):not(:has(.model-access-page[hidden])) > .settings-subtabs,
146 .settings-section:has(.provider-connections:not([hidden])) > .settings-section__head { flex: none; }
147 .provider-connections { flex: 1; min-height: 0; }
148 .provider-connections__nav { min-height: 0; }
149 .provider-connections__nav > .btn { flex: none; }
150 .provider-connections__list { flex: 1; min-height: 0; max-height: none; overscroll-behavior-y: contain; }
151 .provider-connections__detail { display: flex; flex-direction: column; min-height: 0; }
152 .provider-connections__detail > div:not([hidden]) { display: flex; flex-direction: column; flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior-y: contain; }
153 .provider-connections__detail > div:has(> .provider-access-card > .provider-editor) { overflow: hidden; }
154 .provider-connections .provider-access-card--detail { flex: 1; min-height: 0; gap: 12px; }
155 .provider-access-card--detail > .provider-access-card__head,
156 .provider-access-card--detail > .provider-access-card__desc { flex: none; }
157 .provider-connections .provider-editor { flex: 1; min-height: 0; gap: 0; }
158 .provider-editor__body { display: flex; flex-direction: column; gap: 16px; min-width: 0; }
159 .provider-connections .provider-editor__body { flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior-y: contain; scrollbar-gutter: stable; padding-right: 8px; }
160 .provider-editor--compact .provider-model-draft__list { max-height: none; overflow: visible; }
161 .provider-editor--compact .provider-connection-fields { gap: 20px; padding-block: 8px 20px; }
162 .provider-editor-footer { padding-block: 12px; }
163 @media (max-width: 760px) {
164 .provider-connections__detail { display: none; }
165 .provider-connections--detail > .provider-connections__detail { display: flex; }
166 .provider-connections__back { flex: none; }
167 }
168
169 .model-access-page { display: flex; flex-direction: column; flex: 1; min-height: 0; }
170 .model-access-page[hidden] { display: none; }
171
172 .provider-editor__body > * { flex-shrink: 0; }
173
174 .provider-connections__item--flat { align-items: center; gap: 12px; min-height: 52px; }
175 .provider-connections__item--flat strong { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
176 .provider-connections__item--flat .provider-catalog__icon, .provider-connections__item--flat .provider-catalog__monogram { width: 24px; height: 24px; flex: 0 0 24px; }
177
178 .provider-key-single { display: flex; flex-direction: column; gap: 8px; }
179 .provider-key-single > label { font-weight: 500; color: var(--fg-dim); }
180 .provider-key-single__input { position: relative; }
181 .provider-key-single__input .mem-input { width: 100%; box-sizing: border-box; padding-right: 48px; }
182 .provider-key-single__input > button { position: absolute; right: 6px; top: 50%; transform: translateY(-50%); border: 0; background: transparent; }
183
184 .provider-connection-fields .set-label,
185 .provider-connection-fields .provider-key-single > label {
186 color: var(--fg-dim);
187 font-size: 14px;
188 font-weight: 500;
189 line-height: 1.4;
190 }
191 .provider-connection-fields .mem-input,
192 .provider-connection-fields .mem-select {
193 min-height: 42px;
194 box-sizing: border-box;
195 border-radius: 8px;
196 background: var(--bg-elev);
197 }
198
199 /* Model services is a workspace, without duplicate page/card chrome. */
200 :root .settings-center__content:has(.model-access-page:not([hidden])) {
201 padding: 0;
202 }
203 :root .settings-page:has(.model-access-page:not([hidden])) {
204 max-width: none;
205 margin: 0;
206 padding: 0;
207 gap: 0;
208 }
209 :root .settings-page:has(.model-access-page:not([hidden])) > .settings-page__header {
210 display: none;
211 }
212 :root .model-access-page > .settings-section {
213 margin: 0;
214 padding: 0;
215 border: 0;
216 border-radius: 0;
217 box-shadow: none;
218 background: transparent;
219 gap: 0;
220 }
221 :root .model-access-page > .settings-section > .settings-section__head {
222 display: none;
223 }
224 :root .model-access-page .settings-section__body {
225 padding: 0;
226 gap: 0;
227 }
228 :root .model-access-page .provider-connections {
229 border: 0;
230 border-radius: 0;
231 }
232
233 /* Size the connection workspace from the panel, never from its form content. */
234 .settings-center:has(.model-access-page:not([hidden]) .provider-connections:not([hidden])) {
235 grid-template-rows: minmax(0, 1fr);
236 }
237 .settings-center__content:has(.model-access-page:not([hidden]) .provider-connections:not([hidden])) {
238 min-height: 0;
239 }
240 .provider-connections {
241 grid-template-rows: minmax(0, 1fr);
242 }
243 .provider-connections__nav {
244 display: grid;
245 grid-template-rows: auto minmax(0, 1fr) auto;
246 overflow: hidden;
247 }
248 .provider-connections__list {
249 overflow-y: auto;
250 scrollbar-gutter: stable;
251 }
252
253 /* The real SettingsPanel has a content wrapper between main and the page.
254 It must participate in the height chain, or long forms expand both columns. */
255 .settings-page-content:has(.model-access-page:not([hidden]) .provider-connections:not([hidden])) {
256 display: flex;
257 flex-direction: column;
258 flex: 1;
259 min-height: 0;
260 overflow: hidden;
261 }
262 .settings-page-content:has(.model-access-page:not([hidden]) .provider-connections:not([hidden])) > .banner {
263 flex-shrink: 0;
264 }
265
265 lines CSS