@volter/world-console 2.0.12 → 2.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,7 +1,8 @@
1
1
  # @volter/world-console
2
2
 
3
- The dashboard of [Volter World](https://github.com/volter-ai/world): a World's pages — its vendors' screens,
4
- overview, branches, changes, activity and keys. It is the same page on your machine (`volter world view`), on a
3
+ The dashboard of [Volter World](https://github.com/volter-ai/world): the list of Worlds, and a World's window, as a
4
+ desktop git app opens a repository — its vendors' screens, its changes and history, its events, each vendor's records,
5
+ and its settings. It is the same window on your machine (`volter world view`), on a
5
6
  self-hosted host and on the hosted cloud, and it carries nothing of orgs, members or billing: those are the
6
7
  platform's pages. Install it beside `@volter/world-host`; the host mounts it at `/-/console/` and prints its URL.
7
8
 
@@ -17,3 +18,16 @@ volter-host serve --dir ./worlds # prints the console URL alongside the admin
17
18
  ```
18
19
 
19
20
  Built on `@volter/world-host` and `@volter/world-runtime`. Apache-2.0.
21
+
22
+ ## Designing the pages
23
+
24
+ `bun run storybook` (in `apps/console`) serves every page at http://127.0.0.1:6106 as the real console over a recorded
25
+ World's doors (`stories/demo-world.json`) and a host's inventory as its admin reads it (`stories/demo-host.json`);
26
+ `stories/doors.ts` answers them, and an act answers ok and changes nothing. A change to `client/` shows in the open story
27
+ at once. A recording is a served World's doors read with its token (each door's answer, the World named `acme/web`), its
28
+ tokens never kept: a World the stories show is made through the product (`volter world init`, the app's own writes
29
+ through `volter world run`, cuts, pushes and keys through its doors), never written by hand. A vendor's screens are its own site, which no recording holds:
30
+ `STORYBOOK_SCREENS=http://127.0.0.1:<port>/<org>/<world> STORYBOOK_SCREENS_TOKEN=<its token> bun run storybook` shows them
31
+ from a World served on this machine. The pages' map is
32
+ [docs/contributing/console.md](../../docs/contributing/console.md).
33
+
@@ -0,0 +1,2 @@
1
+ // The brand's icons (brand.volter.ai/icon), written by scripts/brand-tokens.ts: each one's elements, a tag and its attributes.
2
+ export const ICONS: Record<string, Array<[string, Record<string, string>]>> = {"git-commit-horizontal":[["rect",{"x":"9","y":"9","width":"6","height":"6"}],["path",{"d":"M3 12h6M15 12h6"}]],"arrow-down-to-line":[["path",{"d":"M12 17V3"}],["path",{"d":"m6 11 6 6 6-6"}],["path",{"d":"M19 21H5"}]],"arrow-up-from-line":[["path",{"d":"m18 9-6-6-6 6"}],["path",{"d":"M12 3v14"}],["path",{"d":"M5 21h14"}]],"git-branch":[["rect",{"x":"4","y":"3","width":"4","height":"4"}],["rect",{"x":"4","y":"17","width":"4","height":"4"}],["rect",{"x":"16","y":"5","width":"4","height":"4"}],["path",{"d":"M6 7v10M18 9v2a4 4 0 0 1-4 4H6"}]],"monitor":[["rect",{"x":"3","y":"4","width":"18","height":"13"}],["path",{"d":"M8 21h8M12 17v4"}]],"vault":[["rect",{"width":"18","height":"18","x":"3","y":"3"}],["rect",{"x":"6.3","y":"6.3","width":"2.4","height":"2.4","fill":"currentColor","stroke":"none"}],["path",{"d":"m7.9 7.9 2.7 2.7"}],["rect",{"x":"15.3","y":"6.3","width":"2.4","height":"2.4","fill":"currentColor","stroke":"none"}],["path",{"d":"m13.4 10.6 2.7-2.7"}],["rect",{"x":"6.3","y":"15.3","width":"2.4","height":"2.4","fill":"currentColor","stroke":"none"}],["path",{"d":"m7.9 16.1 2.7-2.7"}],["rect",{"x":"15.3","y":"15.3","width":"2.4","height":"2.4","fill":"currentColor","stroke":"none"}],["path",{"d":"m13.4 13.4 2.7 2.7"}],["circle",{"cx":"12","cy":"12","r":"2"}]],"settings":[["circle",{"cx":"12","cy":"12","r":"3"}],["circle",{"cx":"12","cy":"12","r":"7"}],["path",{"d":"M12 2v3M12 19v3M2 12h3M19 12h3M4.9 4.9L7 7M17 17l2.1 2.1M4.9 19.1L7 17M17 7l2.1-2.1"}]],"history":[["path",{"d":"M3 12a9 9 0 1 0 3-6.7"}],["path",{"d":"M3 4v5h5"}],["path",{"d":"M12 7v5l3 3"}]],"activity":[["path",{"d":"M2 12h4l3-8 6 16 3-8h4"}]],"file-diff":[["path",{"d":"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"}],["path",{"d":"M9 10h6"}],["path",{"d":"M12 13V7"}],["path",{"d":"M9 17h6"}]],"square-plus":[["rect",{"x":"4","y":"4","width":"16","height":"16"}],["path",{"d":"M12 8v8M8 12h8"}]],"square-minus":[["rect",{"width":"18","height":"18","x":"3","y":"3"}],["path",{"d":"M8 12h8"}]],"square-dot":[["rect",{"width":"18","height":"18","x":"3","y":"3"}],["rect",{"x":"10.8","y":"10.8","width":"2.4","height":"2.4","fill":"currentColor","stroke":"none"}]],"cloud":[["path",{"d":"M7 19a5 5 0 0 1-.5-10A6 6 0 0 1 18 8a4.5 4.5 0 0 1 .5 11z"}]],"refresh-cw":[["path",{"d":"M20 12a8 8 0 0 1-14.3 4.9M4 12a8 8 0 0 1 14.3-4.9"}],["path",{"d":"M19 3v5h-5M5 21v-5h5"}]],"clock":[["circle",{"cx":"12","cy":"12","r":"9"}],["path",{"d":"M12 7v5l3 3"}]],"key-round":[["path",{"d":"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z"}],["rect",{"x":"15.3","y":"6.3","width":"2.4","height":"2.4","fill":"currentColor","stroke":"none"}]],"plug":[["path",{"d":"M9 3v5M15 3v5M6 8h12v4a6 6 0 0 1-12 0zM12 18v3"}]],"list-checks":[["path",{"d":"M11 6h9M11 12h9M11 18h9"}],["path",{"d":"M3 6l1.5 1.5L7 5M3 12l1.5 1.5L7 11M3 18l1.5 1.5L7 17"}]],"palette":[["path",{"d":"M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z"}],["rect",{"x":"12.3","y":"5.3","width":"2.4","height":"2.4","fill":"currentColor","stroke":"none"}],["rect",{"x":"16.3","y":"9.3","width":"2.4","height":"2.4","fill":"currentColor","stroke":"none"}],["rect",{"x":"5.3","y":"11.3","width":"2.4","height":"2.4","fill":"currentColor","stroke":"none"}],["rect",{"x":"7.3","y":"6.3","width":"2.4","height":"2.4","fill":"currentColor","stroke":"none"}]],"check":[["path",{"d":"M4 12l5 5L20 6"}]],"plus":[["path",{"d":"M12 4v16M4 12h16"}]],"chevron-down":[["path",{"d":"M5 9l7 7 7-7"}]],"external-link":[["path",{"d":"M14 4h6v6M20 4l-9 9"}],["path",{"d":"M18 14v6H4V6h6"}]],"table-2":[["path",{"d":"M3 9h18"}],["path",{"d":"M9 3v18"}],["rect",{"x":"3","y":"3","width":"18","height":"18"}]],"scroll-text":[["path",{"d":"M15 12h-5"}],["path",{"d":"M15 8h-5"}],["path",{"d":"M19 17V5a2 2 0 0 0-2-2H4"}],["path",{"d":"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3"}]],"layout-grid":[["rect",{"x":"4","y":"4","width":"7","height":"7"}],["rect",{"x":"13","y":"4","width":"7","height":"7"}],["rect",{"x":"4","y":"13","width":"7","height":"7"}],["rect",{"x":"13","y":"13","width":"7","height":"7"}]],"globe":[["circle",{"cx":"12","cy":"12","r":"9"}],["path",{"d":"M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18"}]],"arrow-left":[["path",{"d":"M20 12H5M11 6l-6 6 6 6"}]],"link":[["path",{"d":"M9 15l6-6"}],["path",{"d":"M11 6l2-2a4.2 4.2 0 0 1 6 6l-2 2M13 18l-2 2a4.2 4.2 0 0 1-6-6l2-2"}]],"user":[["circle",{"cx":"12","cy":"8","r":"4"}],["path",{"d":"M4 21v-1a6 6 0 0 1 6-6h4a6 6 0 0 1 6 6v1"}]],"log-out":[["path",{"d":"M10 4H4v16h6M9 12h11M16 8l4 4-4 4"}]]};
@@ -221,3 +221,393 @@ fieldset.choice { border: 0; padding: 0; margin: 0; display: grid; gap: 8px; min
221
221
  fieldset.choice > legend { padding: 0; margin-bottom: 4px; color: var(--muted); font-size: 12.5px; }
222
222
  fieldset.choice > label.check { display: flex; align-items: flex-start; gap: 8px; color: var(--ink); font-size: 13px; }
223
223
  fieldset.choice > label.check input { margin-top: 3px; }
224
+
225
+ /* EVENTS (Stripe's events list): one row per event, opening to what it carried and wrote */
226
+ .events { list-style: none; margin: 0; padding: 0; }
227
+ .events > li.event { margin: 0; border-top: 1px solid var(--line); }
228
+ .events > li.event:first-child { border-top: 0; }
229
+ .event > details > summary { list-style: none; cursor: pointer; display: grid; grid-template-columns: 92px minmax(110px, 150px) minmax(150px, 220px) minmax(0, 1fr) auto; gap: 12px; align-items: center; padding: 8px 14px; }
230
+ .event > details > summary::-webkit-details-marker { display: none; }
231
+ .event > details > summary:hover { background: var(--surface-2); }
232
+ .event > details[open] > summary { background: var(--surface-2); border-bottom: 1px solid var(--line); }
233
+ .ev-time { font-variant-numeric: tabular-nums; }
234
+ .ev-vendor { display: inline-flex; align-items: center; gap: 7px; min-width: 0; }
235
+ .ev-vendor .mark { width: 20px; height: 20px; }
236
+ .ev-record { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
237
+ .ev-record code { font-size: 12px; }
238
+ .ev-who { white-space: nowrap; }
239
+ .ev-detail { padding: 6px 14px 14px 118px; }
240
+ .ev-detail h4 { margin: 14px 0 6px; font-size: 11.5px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--muted); }
241
+ .ev-detail > p.mode:first-child { margin-top: 6px; }
242
+ .text { white-space: pre-wrap; overflow-wrap: anywhere; }
243
+ .folded > summary { cursor: pointer; list-style: none; }
244
+ .folded > summary::-webkit-details-marker { display: none; }
245
+ .folded[open] > summary .text { display: none; }
246
+ .folded pre { max-width: none; margin: 4px 0; white-space: pre-wrap; overflow-wrap: anywhere; font-size: 12px; }
247
+ .messages { list-style: none; margin: 6px 0; padding: 0; display: grid; gap: 6px; }
248
+ .messages li { margin: 0; display: grid; grid-template-columns: 80px minmax(0, 1fr); gap: 10px; padding: 8px 10px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); }
249
+ .messages .role { color: var(--muted); font: 600 11.5px/1.6 var(--mono); text-transform: uppercase; }
250
+ .filters { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 16px; margin: 14px 0 6px; }
251
+ .filters .chips { margin: 0; }
252
+ .op-filter { display: inline-flex; align-items: center; gap: 8px; color: var(--muted); font-size: 12.5px; }
253
+ .op-filter select { min-width: 200px; }
254
+ .content .feed { margin-top: 6px; }
255
+ @media (max-width: 860px) { .event > details > summary { grid-template-columns: 80px minmax(0, 1fr); } .ev-record, .ev-who { grid-column: 2; } .ev-detail { padding-left: 14px; } }
256
+
257
+ /* CHANGES: record by record, each write's fields as before → after */
258
+ .compare li.record { padding: 10px 12px; }
259
+ .record-head { margin: 0 0 4px; display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 8px; }
260
+ .record-head .kind { font-weight: 600; text-transform: capitalize; }
261
+ .record-head code { font-size: 12px; color: var(--muted); }
262
+ .write { margin: 6px 0 0 0; padding-left: 10px; border-left: 2px solid var(--line); }
263
+ .write > p { margin: 0 0 4px; }
264
+ .write .op { font-weight: 600; color: var(--ink); margin: 0; }
265
+ dl.field-diff { grid-template-columns: minmax(120px, 200px) minmax(0, 1fr); gap: 4px 14px; margin: 4px 0 2px; }
266
+ dl.field-diff dt { font: 12px/1.7 var(--mono); }
267
+ dl.field-diff .changed { display: inline-flex; flex-wrap: wrap; align-items: baseline; gap: 4px 6px; }
268
+ dl.field-diff del { text-decoration: line-through; background: var(--danger-soft); border-radius: 3px; padding: 0 3px; }
269
+ dl.field-diff ins { text-decoration: none; background: color-mix(in srgb, var(--ok) 14%, transparent); border-radius: 3px; padding: 0 3px; }
270
+ dl.field-diff .arrow { color: var(--muted); }
271
+ .badge.added { color: var(--ok); border-color: currentColor; }
272
+
273
+ /* BRANCHES: one table, each row its branch's page */
274
+ table.clickable tbody tr { cursor: pointer; }
275
+ table.clickable tbody tr:hover td { background: var(--surface-2); }
276
+ .branch-page h3 { display: flex; align-items: center; gap: 8px; margin: 0; }
277
+ .branch-page h4, .branch-page > p { margin: 18px 0 8px; }
278
+ .branch-page h4 { font-size: 13px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--muted); }
279
+ .branch-page dl.fields { margin: 0; gap: 6px 18px; }
280
+ fieldset.choice > label.check.sub { margin-left: 22px; color: var(--muted); }
281
+
282
+ /* REMOTE, VAULT, SETTINGS: each act says what it did, on the page */
283
+ .narration-log { list-style: none; margin: 10px 0; padding: 0; display: grid; gap: 4px; }
284
+ .narration-log li { margin: 0; padding: 7px 12px; border-radius: var(--radius); border: 1px solid var(--line); background: var(--surface); }
285
+ .narration-log li.ok { border-color: color-mix(in srgb, var(--ok) 45%, var(--line)); }
286
+ .narration-log li.bad { border-color: color-mix(in srgb, var(--danger) 45%, var(--line)); background: var(--danger-soft); }
287
+ .block.remote { margin-bottom: 14px; }
288
+ .remote code.big { font-size: 14px; }
289
+ .remote .origin-form { max-width: 520px; margin-top: 10px; }
290
+ .remote-acts { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 14px; align-items: start; }
291
+ .stack-tight > p { margin: 0 0 4px; }
292
+ .row-actions { display: flex; gap: 8px; justify-content: flex-end; align-items: center; flex-wrap: wrap; }
293
+ td.row-actions { white-space: nowrap; }
294
+ .pad .row-actions, form .row-actions { justify-content: flex-start; }
295
+ .content section.block + section.block { margin-top: 16px; }
296
+ .settings-head { margin: 26px 0 8px; }
297
+ .settings-head:first-of-type { margin-top: 8px; }
298
+ .changeset .block.where { margin: 0; }
299
+ .changeset .block.where > p { margin: 0; }
300
+ .badge.cs-plain { color: var(--muted); }
301
+ .dash .services td.num { text-align: right; }
302
+ .dash .services td:first-child { width: 42%; }
303
+ .content section.block { padding: 0; box-shadow: none; }
304
+ .remote-acts section.block { margin: 0; }
305
+ .changeset .where ul.receipts, .changeset .where ul.checks { padding: 0 14px 12px; margin: 0; }
306
+ .remote-acts section.block + section.block { margin-top: 0; }
307
+ .refusal { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; margin: 10px 0; }
308
+ .refusal > span { flex: 1 1 320px; }
309
+ .changeset .where p.failed { margin: 0 14px 10px; }
310
+ .changeset .where .where-sub { padding-bottom: 2px; text-transform: uppercase; letter-spacing: 0.05em; font-size: 11px; }
311
+ .clock-more.inline > summary { display: none; }
312
+ .clock-more.inline { margin: 0; }
313
+ .branches-head .head-actions { display: flex; gap: 8px; align-items: flex-start; flex-wrap: wrap; justify-content: flex-end; }
314
+ form.block.cut { display: flex; align-items: flex-end; gap: 12px; flex-wrap: wrap; margin: 0 0 12px; }
315
+ form.block.cut label { flex: 1 1 360px; display: grid; gap: 4px; margin: 0; }
316
+ .stats li a { font-size: 12.5px; }
317
+ form.block.cut { max-width: none; }
318
+ .tabs { display: flex; gap: 2px; border-bottom: 1px solid var(--line); margin: 0 0 14px; }
319
+ .tabs a { display: inline-flex; align-items: center; gap: 6px; padding: 8px 12px; color: var(--muted); text-decoration: none; border-bottom: 2px solid transparent; margin-bottom: -1px; font-weight: 500; }
320
+ .tabs a:hover { color: var(--ink); }
321
+ .tabs a.on { color: var(--ink); border-bottom-color: var(--ink); }
322
+ .tabs .count { font-size: 11.5px; padding: 0 6px; border-radius: 999px; background: var(--surface-2); border: 1px solid var(--line); }
323
+ .ev-detail ul.receipts { list-style: none; padding: 0; margin: 4px 0; display: grid; gap: 4px; }
324
+ /* the sidebar's counts sit at a link's right, as the vendors' do */
325
+ .side-nav > a .count { margin-left: auto; color: var(--faint); font: 11.5px var(--mono); }
326
+ /* the account block at the sidebar's foot: who is here, with what access; it opens to Appearance and Sign out */
327
+ .side-foot .account { display: block; position: relative; }
328
+ .account > summary { list-style: none; display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: 8px; cursor: pointer; border: 1px solid transparent; }
329
+ .account > summary::-webkit-details-marker { display: none; }
330
+ .account > summary:hover, .account[open] > summary { background: var(--surface-2); border-color: var(--line); }
331
+ .account .avatar { flex: none; width: 28px; height: 28px; border-radius: 999px; display: grid; place-items: center; background: var(--accent-soft); color: var(--ink); font-weight: 600; font-size: 13px; }
332
+ .account .who { flex: 1; min-width: 0; display: grid; line-height: 1.25; }
333
+ .account .who b { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; }
334
+ .account .chev { color: var(--muted); display: grid; }
335
+ .account .popover { bottom: calc(100% + 6px); top: auto; left: 0; right: 0; min-width: 220px; display: grid; gap: 6px; padding: 10px; }
336
+ .account .menu-label { margin: 0; color: var(--muted); font-size: 11.5px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; }
337
+ .account .menu-item { text-align: left; }
338
+ .account .popover { width: auto; max-width: none; }
339
+
340
+ /* THE WORKSPACE (on this machine): a desktop app's window. One short toolbar (TablePlus's, Proxyman's), a sidebar of
341
+ places, the place beside it; windows (Settings, Branches) over it. The window is the viewport; each pane scrolls alone. */
342
+ main.app.workspace { height: 100vh; display: grid; grid-template-rows: minmax(0, 1fr); overflow: hidden; }
343
+ .ws { display: flex; flex-direction: column; min-height: 0; }
344
+ .ws > .ws-body { flex: 1; }
345
+ .icon { flex: none; display: block; }
346
+ .ws-bar { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 12px; height: 40px; padding: 0 8px; border-bottom: 1px solid var(--line); background: var(--surface); }
347
+ .ws-left, .ws-right { display: flex; align-items: center; gap: 4px; min-width: 0; }
348
+ .ws-right { justify-content: flex-end; }
349
+ .ws-left h1 { margin: 0 6px 0 4px; font-size: 13px; }
350
+ .ws-left .brand-name { display: none; }
351
+ .ws-pick { position: relative; min-width: 0; }
352
+ .ws-pick > summary { display: flex; align-items: center; gap: 7px; height: 30px; padding: 0 8px; border-radius: 6px; color: var(--ink); }
353
+ .ws-pick > summary:hover, .ws-pick[open] > summary { background: var(--surface-2); }
354
+ .ws-pick-label { display: flex; align-items: baseline; gap: 6px; min-width: 0; white-space: nowrap; }
355
+ .ws-pick-label small { color: var(--muted); font-size: 11.5px; }
356
+ .ws-pick-label b { font-weight: 600; overflow: hidden; text-overflow: ellipsis; }
357
+ .ws-pick .popover { left: 0; right: auto; top: calc(100% + 4px); }
358
+ .ws-world-menu { width: 380px; padding: 8px; }
359
+ .ws-world-menu .menu-label, .ws-branch-menu .menu-label, .ws-tables .menu-label { margin: 6px 6px 2px; color: var(--muted); font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; }
360
+ .ws-menu-text { margin: 4px 6px; font-size: 12.5px; }
361
+ .ws-world-menu pre { margin: 4px 6px; }
362
+ .ws-world-menu .agent-prompt-button { margin: 4px 6px; width: calc(100% - 12px); }
363
+ .ws-world-menu hr { border: 0; border-top: 1px solid var(--line); margin: 6px 0; }
364
+ .ws-pick .popover.ws-branch-menu { width: 380px; padding: 0; gap: 0; overflow: hidden; }
365
+ .ws-branch-find { display: flex; gap: 8px; padding: 10px; border-bottom: 1px solid var(--line); }
366
+ .ws-branch-find input { flex: 1; min-width: 0; width: auto; }
367
+ .ws-branch-find button { flex: none; }
368
+ .ws-branch-menu .menu-label { margin: 10px 12px 4px; }
369
+ .ws-branch-list { list-style: none; margin: 0; padding: 0; }
370
+ .ws-branch-list li > *, .ws-branch-list li { display: flex; align-items: center; gap: 8px; }
371
+ .ws-branch-list li { padding: 0; }
372
+ .ws-branch-list li > a, .ws-branch-list li > span[title], .ws-branch-list li:not(:has(> a, > span[title])) { width: 100%; padding: 6px 12px; color: var(--ink); text-decoration: none; }
373
+ .ws-branch-list li.current { background: var(--surface-2); }
374
+ .ws-branch-list a:hover { background: var(--surface-2); }
375
+ .ws-branch-list .name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
376
+ .ws-branch-list .mode { font-size: 12px; white-space: nowrap; }
377
+ .ws-branch-none { margin: 4px 12px 8px; font-size: 12.5px; }
378
+ .ws-branch-foot { border-top: 1px solid var(--line); padding: 8px 12px; margin-top: 8px; }
379
+ .ws-where { justify-self: center; display: flex; align-items: center; gap: 6px; height: 28px; padding: 0 14px; max-width: 100%; border: 1px solid var(--line); border-radius: 6px; background: var(--surface-2); font: 12px var(--mono); color: var(--muted); white-space: nowrap; overflow: hidden; }
380
+ .ws-where > span:first-child { color: var(--ink); }
381
+ .ws-where .sep { color: var(--faint); }
382
+ .ws-where a { color: inherit; text-decoration: none; }
383
+ .ws-where a:hover { color: var(--ink); text-decoration: underline; }
384
+ .ws-where b { color: var(--ink); }
385
+ .ws-btn { display: inline-flex; align-items: center; gap: 6px; height: 28px; padding: 0 10px; font-size: 12.5px; }
386
+ .ws-btn.icon-only { padding: 0 7px; }
387
+ .ws-btn-count { min-width: 16px; padding: 0 4px; border-radius: 999px; background: var(--ink); color: var(--surface); font: 600 10.5px/16px var(--mono); text-align: center; }
388
+ .ws-banner { display: flex; align-items: center; gap: 10px; padding: 6px 14px; border-bottom: 1px solid var(--line); background: var(--warn-soft); font-size: 12.5px; }
389
+ .ws-banner button { margin-left: auto; height: 26px; padding: 0 10px; font-size: 12px; }
390
+ .ws-world-menu a, .ws-world-menu button { display: flex !important; align-items: center; gap: 8px; }
391
+ .ws-world-menu a.on { font-weight: 600; }
392
+ .ws-said { border-bottom: 1px solid var(--line); padding: 4px 14px; }
393
+ .ws-said .narration-log { margin: 0; }
394
+ .ws-body { display: grid; grid-template-columns: 216px minmax(0, 1fr); min-height: 0; }
395
+ .ws-side { display: flex; flex-direction: column; gap: 1px; min-height: 0; overflow-y: auto; padding: 6px 8px; border-right: 1px solid var(--line); background: var(--surface); }
396
+ .ws-side .side-group { margin: 14px 8px 4px; }
397
+ .ws-side .side-group:first-child { margin-top: 6px; }
398
+ .ws-side a, .ws-tables a { display: flex; align-items: center; gap: 8px; padding: 5px 8px; border-radius: 6px; color: var(--muted); text-decoration: none; font-weight: 500; min-width: 0; }
399
+ .ws-side a > span:not(.count):not(.mark), .ws-tables a > span:not(.count) { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
400
+ .ws-side a:hover, .ws-side a.on, .ws-tables a:hover, .ws-tables a.on { background: var(--surface-2); color: var(--ink); }
401
+ .ws-side a .count, .ws-tables a .count { margin-left: auto; color: var(--faint); font: 11.5px var(--mono); }
402
+ .ws-side a .mark { width: 16px; height: 16px; flex: none; }
403
+ .ws-main { display: grid; min-height: 0; min-width: 0; }
404
+ .cell-label { display: grid; line-height: 1.25; text-align: left; min-width: 0; }
405
+ .cell-label b { font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
406
+ .cell-label small { color: var(--muted); font-size: 11.5px; font-weight: 400; }
407
+ .ws-sheet { overflow-y: auto; min-height: 0; padding: 18px 28px 48px; }
408
+ .ws-list-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 36px; padding: 0 14px; border-bottom: 1px solid var(--line); font-weight: 600; font-size: 12.5px; background: var(--surface-2); }
409
+ .ws-list { list-style: none; margin: 0; padding: 0; overflow-y: auto; min-height: 0; }
410
+ .ws-list li { margin: 0; border-bottom: 1px solid var(--line); }
411
+ .ws-list button, .ws-list a { display: flex; align-items: center; gap: 9px; width: 100%; padding: 7px 14px; border: 0; border-radius: 0; background: none; color: var(--ink); text-align: left; text-decoration: none; font: inherit; }
412
+ .ws-list button:hover, .ws-list a:hover { background: var(--surface-2); }
413
+ .ws-list .on { background: var(--accent-soft); }
414
+ .ws-list .mark, .ws-diff-head .mark { width: 18px; height: 18px; flex: none; }
415
+ .ws-row-text { display: grid; min-width: 0; flex: 1; line-height: 1.3; }
416
+ .ws-row-text b { font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
417
+ .ws-row-text small { color: var(--muted); font-size: 11.5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
418
+ .ws-badges { display: grid; gap: 3px; justify-items: end; flex: none; }
419
+ .ws-badges .badge, .ws-list .badge { font-size: 10.5px; }
420
+ .badge .icon { display: inline-block; vertical-align: -2px; }
421
+ .ws-kind { flex: none; display: inline-grid; place-items: center; }
422
+ .ws-kind.added { color: var(--ok); }
423
+ .ws-kind.removed { color: var(--danger-text); }
424
+ .ws-kind.changed { color: var(--warn); }
425
+ .ws-detail { overflow-y: auto; min-height: 0; min-width: 0; }
426
+ .ws-detail .empty-state { margin: 12vh 24px 0; }
427
+ /* Changes (SourceTree's file status) and History (GitHub Desktop's): a list beside the selected thing */
428
+ .ws-status { display: grid; grid-template-columns: minmax(260px, 330px) minmax(0, 1fr); grid-template-rows: minmax(0, 1fr) auto; min-height: 0; }
429
+ .ws-files { display: grid; grid-template-rows: auto auto auto minmax(0, 1fr); min-height: 0; border-right: 1px solid var(--line); background: var(--surface); }
430
+ .ws-two { display: grid; grid-template-columns: minmax(240px, 300px) minmax(0, 1fr); min-height: 0; }
431
+ .ws-two.inner { grid-template-columns: minmax(200px, 240px) minmax(0, 1fr); border-top: 1px solid var(--line); }
432
+ .ws-two.inner > .ws-files { grid-template-rows: auto minmax(0, 1fr); }
433
+ .ws-pane-right { display: grid; grid-template-rows: auto auto minmax(0, 1fr); min-height: 0; min-width: 0; }
434
+ .ws-pane-right > .empty-state { margin: 12vh 24px 0; }
435
+ .ws-cs-head { padding: 12px 18px 0; }
436
+ .ws-cs-head .changeset-head { margin: 0; }
437
+ .ws-cs-head h3 { font-size: 15px; }
438
+ .ws-cs-tabs { margin: 8px 0 0; padding: 0 12px; }
439
+ .ws-review { padding: 4px 18px 32px; }
440
+ .ws-diff-head { display: flex; align-items: center; gap: 10px; padding: 10px 18px; border-bottom: 1px solid var(--line); background: var(--surface); position: sticky; top: 0; z-index: 1; }
441
+ .ws-diff-head code { font-size: 11px; }
442
+ .ws-writes { margin: 0; padding: 8px 18px 8px 36px; border-bottom: 1px solid var(--line); font-size: 12.5px; }
443
+ .ws-writes li { margin: 2px 0; }
444
+ .ws-fields { width: 100%; border-collapse: collapse; font-size: 12.5px; }
445
+ .ws-fields th, .ws-fields td { padding: 5px 12px; border-bottom: 1px solid var(--line); vertical-align: top; text-align: left; }
446
+ .ws-fields thead th { color: var(--muted); font-weight: 600; font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; background: var(--surface-2); }
447
+ .ws-fields tbody th { width: 22%; font-weight: 400; text-transform: none; letter-spacing: 0; color: var(--ink); font-size: 12.5px; background: none; }
448
+ .ws-fields tbody th code { background: none; border: 0; padding: 0; font-size: 12px; text-transform: none; }
449
+ .ws-fields td { font-family: var(--mono); word-break: break-word; width: 39%; }
450
+ .ws-fields td.was { background: var(--danger-soft); }
451
+ .ws-fields td.now { background: var(--accent-soft); }
452
+ .ws-status .ws-cut { grid-column: 1 / -1; }
453
+ .ws-cut { display: grid; gap: 6px; padding: 10px 14px; border-top: 1px solid var(--line); background: var(--surface); }
454
+ .ws-cut form { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 10px; }
455
+ .ws-cut form:not(:has(.ws-author)) { grid-template-columns: minmax(0, 1fr) auto; }
456
+ .ws-author { display: grid; place-items: center; width: 34px; height: 34px; border-radius: 50%; background: var(--surface-2); border: 1px solid var(--line); color: var(--ink); }
457
+ .ws-author:hover { background: var(--accent-soft); }
458
+ .ws-cut .narration-log { margin: 0; max-height: 72px; overflow-y: auto; }
459
+ .ws-view-switch { display: flex; gap: 0; margin: 6px 10px; padding: 2px; border: 1px solid var(--line); border-radius: 6px; background: var(--surface-2); width: max-content; }
460
+ .ws-view-switch button { height: 24px; padding: 0 12px; border: 0; border-radius: 4px; background: none; color: var(--muted); font-size: 12px; font-weight: 500; }
461
+ .ws-view-switch button.on { background: var(--surface); color: var(--ink); box-shadow: var(--volter-shadow-raised, none); }
462
+ .ws-files { grid-template-rows: auto auto auto minmax(0, 1fr); }
463
+ .ws-list .ws-group { border-bottom: 0; }
464
+ .ws-group-head { display: flex; align-items: center; gap: 8px; margin: 0; padding: 7px 14px; border-bottom: 1px solid var(--line); background: var(--surface-2); font-size: 12.5px; }
465
+ .ws-group-head .mark { width: 18px; height: 18px; }
466
+ .ws-group-head .mode { margin-left: auto; font: 11.5px var(--mono); }
467
+ .ws-group > ul { list-style: none; margin: 0; padding: 0; }
468
+ .ws-group > ul > li { border-bottom: 1px solid var(--line); }
469
+ .ws-list button.nested { padding-left: 30px; }
470
+ .ws-commits a { align-items: flex-start; padding: 9px 14px; }
471
+ .ws-commits b { white-space: normal; }
472
+ .ws-unpushed { color: var(--muted); padding-top: 2px; }
473
+ .ws-pane-right { grid-template-rows: auto minmax(0, 1fr); }
474
+ .ws-commit-head { display: flex; align-items: flex-start; gap: 12px; padding: 12px 18px; border-bottom: 1px solid var(--line); background: var(--surface); }
475
+ .ws-commit-title { flex: 1; min-width: 0; }
476
+ .ws-commit-head h3 { margin: 0 0 4px; font-size: 15px; }
477
+ .ws-commit-stat { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; margin: 0; font-size: 12.5px; }
478
+ .ws-commit-stat .plus { color: var(--ok); font-weight: 600; }
479
+ .ws-commit-stat .minus { color: var(--danger-text); font-weight: 600; }
480
+ .ws-commit-stat .dot { color: var(--warn); font-weight: 600; }
481
+ .ws-commit-head > button { display: inline-flex; align-items: center; gap: 6px; height: 30px; font-size: 12.5px; }
482
+ .ws-commit-head > button .badge { font-size: 10px; }
483
+ /* Events (Proxyman's): filters, a dense table, the selected one under it, a footer */
484
+ .ws-events, .ws-table-app { display: grid; min-height: 0; min-width: 0; }
485
+ .ws-events { grid-template-rows: auto minmax(120px, 1fr) minmax(160px, 40%) auto; }
486
+ .ws-filterbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 6px 12px; border-bottom: 1px solid var(--line); background: var(--surface); }
487
+ .ws-filterbar select { width: auto; height: 28px; padding: 0 28px 0 8px; font-size: 12.5px; }
488
+ .ws-seg { display: flex; gap: 2px; }
489
+ .ws-seg a { display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px; border-radius: 6px; color: var(--muted); text-decoration: none; font-weight: 500; font-size: 12.5px; }
490
+ .ws-seg a .mark { width: 16px; height: 16px; }
491
+ .ws-seg a:hover, .ws-seg a.on { background: var(--surface-2); color: var(--ink); }
492
+ .ws-grid-wrap { overflow: auto; min-height: 0; min-width: 0; background: var(--surface); }
493
+ .ws-grid { width: 100%; margin: 0; border: 0; border-radius: 0; border-collapse: collapse; font-size: 12.5px; }
494
+ .ws-grid thead th { position: sticky; top: 0; z-index: 1; padding: 6px 10px; background: var(--surface-2); border-bottom: 1px solid var(--line); color: var(--muted); font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; text-align: left; white-space: nowrap; }
495
+ .ws-grid td { padding: 5px 10px; border-bottom: 1px solid var(--line); white-space: nowrap; }
496
+ .ws-grid td b { font-weight: 500; }
497
+ .ws-grid td .mark { width: 16px; height: 16px; }
498
+ .ws-grid tbody tr { cursor: default; }
499
+ .ws-grid tbody tr:hover td { background: var(--surface-2); }
500
+ .ws-grid tbody tr.on td { background: var(--accent-soft); }
501
+ .ws-grid .mono { font-family: var(--mono); font-size: 12px; }
502
+ .ws-cell-clip { max-width: 280px; overflow: hidden; text-overflow: ellipsis; }
503
+ .ws-event-detail { overflow-y: auto; min-height: 0; border-top: 1px solid var(--line-strong, var(--line)); }
504
+ .ws-event-line { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 8px 14px; border-bottom: 1px solid var(--line); background: var(--surface); position: sticky; top: 0; }
505
+ .ws-event-line a { margin-left: auto; }
506
+ .ws-event-panes { display: grid; grid-template-columns: 1fr 1fr; }
507
+ .ws-event-panes > div { padding: 8px 14px 14px; min-width: 0; border-right: 1px solid var(--line); }
508
+ .ws-event-panes > div:last-child { border-right: 0; }
509
+ .ws-event-panes h4 { margin: 6px 0; }
510
+ .ws-foot { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 30px; padding: 0 12px; border-top: 1px solid var(--line); background: var(--surface); font-size: 12px; grid-column: 1 / -1; }
511
+ .ws-foot button { height: 24px; padding: 0 10px; font-size: 12px; }
512
+ /* A trace (Jaeger's) */
513
+ .ws-trace h2 { margin: 4px 0; font-size: 18px; }
514
+ .ws-trace-meta { margin: 4px 0 14px; color: var(--muted); }
515
+ .ws-trace-meta b { color: var(--ink); font-weight: 600; }
516
+ .ws-spans { border: 1px solid var(--line); border-radius: 6px; background: var(--surface); }
517
+ .ws-span { display: grid; grid-template-columns: minmax(260px, 38%) minmax(0, 1fr); align-items: center; min-height: 32px; border-bottom: 1px solid var(--line); cursor: default; }
518
+ .ws-span:hover, .ws-span.on { background: var(--surface-2); }
519
+ .ws-span.head { background: var(--surface-2); color: var(--muted); font-size: 11.5px; }
520
+ .ws-span > span:first-child { padding: 0 12px; border-right: 1px solid var(--line); align-self: stretch; display: flex; align-items: center; gap: 8px; min-width: 0; white-space: nowrap; overflow: hidden; }
521
+ .ws-span-name .mark { width: 16px; height: 16px; }
522
+ .ws-ticks { display: flex; justify-content: space-between; padding: 0 12px; }
523
+ .ws-span-track { position: relative; height: 32px; margin: 0 40px 0 12px; }
524
+ .ws-span-dot { position: absolute; top: 11px; width: 10px; height: 10px; margin-left: -5px; border-radius: 2px; background: var(--ink); }
525
+ .ws-span-at { position: absolute; top: 8px; margin-left: 10px; font-size: 11.5px; white-space: nowrap; }
526
+ .ws-span-detail { padding: 8px 14px 12px; border-bottom: 1px solid var(--line); background: var(--surface-2); }
527
+ /* A vendor's place (TablePlus's): its tables, the rows, the selected record */
528
+ .ws-table-app { grid-template-columns: 200px minmax(0, 1fr) minmax(240px, 300px); grid-template-rows: minmax(0, 1fr) auto; }
529
+ .ws-tables { display: flex; flex-direction: column; gap: 1px; overflow-y: auto; min-height: 0; padding-bottom: 8px; border-right: 1px solid var(--line); background: var(--surface); }
530
+ .ws-tables .ws-list-head { margin-bottom: 4px; }
531
+ .ws-tables .ws-list-head .mark { width: 18px; height: 18px; }
532
+ .ws-tables a { margin: 0 6px; }
533
+ .ws-record { overflow-y: auto; min-height: 0; border-left: 1px solid var(--line); background: var(--surface); }
534
+ .ws-record-fields { display: grid; grid-template-columns: minmax(80px, auto) minmax(0, 1fr); margin: 0; font-size: 12px; }
535
+ .ws-record-fields dt { padding: 5px 10px; color: var(--muted); border-bottom: 1px solid var(--line); }
536
+ .ws-record-fields dd { margin: 0; padding: 5px 10px; font-family: var(--mono); word-break: break-word; border-bottom: 1px solid var(--line); }
537
+ .ws-screen { display: flex; flex-direction: column; min-height: 0; background: var(--surface); }
538
+ .ws-screen iframe { flex: 1; width: 100%; border: 0; background: var(--surface); }
539
+ .ws-screen-bar { display: flex; align-items: center; gap: 14px; min-height: 36px; padding: 0 14px; border-bottom: 1px solid var(--line); background: var(--surface-2); font-size: 12.5px; }
540
+ .ws-screen-bar .mark { width: 18px; height: 18px; }
541
+ .ws-screen-bar > .mode { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
542
+ .ws-screen-bar a { display: inline-flex; align-items: center; gap: 6px; color: var(--ink); text-decoration: none; }
543
+ .ws-screen-bar a:hover { text-decoration: underline; }
544
+ .side-group .side-count { margin-left: 4px; color: var(--faint); font-family: var(--mono); }
545
+ .ws-screens-note { margin: 0; padding: 6px 12px; border-bottom: 1px solid var(--line); }
546
+ /* Settings (GitHub Desktop's window): its tabs beside its pane */
547
+ .ws-settings { display: grid; grid-template-columns: 200px minmax(0, 1fr); height: 100%; min-height: 0; }
548
+ .ws-settings > nav { display: flex; flex-direction: column; gap: 2px; padding: 12px 10px; border-right: 1px solid var(--line); }
549
+ .ws-settings > nav a { display: flex; align-items: center; gap: 10px; padding: 7px 10px; border-radius: 6px; color: var(--ink); text-decoration: none; font-weight: 500; }
550
+ .ws-settings > nav a:hover { background: var(--surface-2); }
551
+ .ws-settings > nav a.on { background: var(--ink); color: var(--surface); }
552
+ .ws-settings-pane { overflow-y: auto; min-height: 0; padding: 4px 24px 24px; }
553
+ .ws-settings-pane .settings-head:first-child, .ws-settings-pane > :first-child { margin-top: 14px; }
554
+ @media (max-width: 900px) { .ws-body { grid-template-columns: 1fr; } .ws-side { display: none; } .ws-status, .ws-two, .ws-table-app { grid-template-columns: 1fr; } .ws-where { display: none; } }
555
+ .crumbs-line a { display: inline-flex; align-items: center; gap: 6px; }
556
+
557
+ /* Signing in (GitHub Desktop's way: one window, one field, one act) and the list of Worlds (its repository list) */
558
+ main.app.gate { min-height: 100vh; display: grid; place-items: center; padding: 24px; }
559
+ .gate-window { width: min(420px, 100%); display: grid; gap: 14px; padding: 24px; border: 1px solid var(--line); border-radius: 12px; background: var(--surface); }
560
+ .gate-window h1 { margin: 0; font-size: 15px; }
561
+ .gate-window h2 { margin: 6px 0 0; font-size: 18px; }
562
+ .gate-window form { margin: 0; max-width: none; }
563
+ main.app.home { max-width: none; }
564
+ .home-window { max-width: 760px; margin: 28px auto; padding: 0; border: 1px solid var(--line); border-radius: 12px; background: var(--surface); overflow: hidden; }
565
+ .home-head { display: flex; align-items: center; gap: 12px; padding: 16px 20px; border-bottom: 1px solid var(--line); }
566
+ .home-head h2 { margin: 0; font-size: 16px; }
567
+ .home-head button { margin-left: auto; display: inline-flex; align-items: center; gap: 6px; }
568
+ .home-find { padding: 10px 20px; border-bottom: 1px solid var(--line); }
569
+ .home-org { margin: 14px 20px 6px; }
570
+ .home-note { margin: 12px 20px; }
571
+ .home-list { list-style: none; margin: 0 0 8px; padding: 0; border-top: 1px solid var(--line); }
572
+ .home-list li { display: flex; align-items: center; border-bottom: 1px solid var(--line); }
573
+ .home-list li > a { display: flex; align-items: center; gap: 12px; flex: 1; min-width: 0; padding: 10px 20px; color: var(--ink); text-decoration: none; }
574
+ .home-list li > a:hover { background: var(--surface-2); }
575
+ .home-vendors { display: flex; gap: 4px; margin-left: auto; }
576
+ .home-vendors .mark { width: 20px; height: 20px; }
577
+ .home-more { position: relative; margin-right: 12px; }
578
+ .home-more > summary { padding: 4px 8px; border-radius: 6px; color: var(--muted); }
579
+ .home-more > summary:hover { background: var(--surface-2); }
580
+ .home-more .popover { right: 0; left: auto; }
581
+ .home-find input { width: 100%; }
582
+ .home-org { color: var(--muted); font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; }
583
+ .ws-commit-meta { margin: 4px 0 0; font-size: 12px; }
584
+ .ws-pane-tabs { display: grid; grid-template-columns: 1fr 1fr; margin: 0; background: var(--surface); }
585
+ .ws-pane-tabs a { justify-content: center; padding: 9px 12px; }
586
+ .ws-files { display: flex; flex-direction: column; }
587
+ .ws-files > .ws-list { flex: 1; min-height: 0; }
588
+ .ws-files > * { flex: none; }
589
+ .ws-files > .ws-list { flex: 1 1 auto; }
590
+ .ws-screens-entry { margin-bottom: 6px; }
591
+ .ws-screens-marks { display: flex; gap: 2px; margin-left: auto; }
592
+ .ws-screens-marks .mark { width: 16px; height: 16px; }
593
+ .ws-screens-marks .more { font: 11px var(--mono); color: var(--faint); }
594
+ .ws-screens-entry .count { margin-left: 6px !important; }
595
+ .ws-on-screens { margin-left: auto; display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; white-space: nowrap; }
596
+ .ws-account { display: flex; align-items: center; gap: 14px; margin: 8px 0 16px; padding: 14px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); }
597
+ .ws-account-face { display: grid; place-items: center; width: 40px; height: 40px; border-radius: 50%; background: var(--surface-2); font-weight: 600; }
598
+ .ws-account .cell-label small + small { margin-top: 2px; }
599
+ .ws-settings-pane p button { display: inline-flex; align-items: center; gap: 6px; }
600
+ .ws-commit-who { display: flex; flex-wrap: wrap; gap: 14px; margin: 6px 0 0; font-size: 12.5px; }
601
+ .frame-changed, .layer-changed { display: inline-flex; align-items: center; gap: 3px; margin-left: 6px; color: var(--warn); font: 600 11.5px var(--mono); text-decoration: none; }
602
+ .layer-changed { margin-left: auto; }
603
+ .ws-rules { display: grid; gap: 4px; }
604
+ .ws-rules .ws-rule { padding: 12px 0; border-bottom: 1px solid var(--line); }
605
+ .ws-rules .ws-rule:last-of-type { border-bottom: 0; }
606
+ .ws-rules h4 { margin: 0 0 6px; }
607
+ .ws-rules p { margin: 4px 0; }
608
+ .ws-rule-list { list-style: none; margin: 4px 0; padding: 0; display: grid; gap: 6px; }
609
+ .ws-rule-list li { display: flex; align-items: center; gap: 8px; }
610
+ .ws-rule-list .mark { width: 18px; height: 18px; }
611
+ .ws-rule-row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 6px; }
612
+ .ws-rule-row select { width: auto; }
613
+ .ws-rules fieldset.choice { border: 0; padding: 0; margin: 4px 0; display: grid; gap: 6px; }