|
1303 | 1303 | .qh-chip.is-machine { border-style: dashed; } |
1304 | 1304 | .qh-audnoreq { margin-top: 12px; font-size: 11.5px; color: var(--fg-tertiary); } |
1305 | 1305 | .qh-audexp { display: block; margin-top: 4px; } |
| 1306 | + /* The default state's own biggest fact. Reads as a finding, not as a warning: |
| 1307 | + nothing is wrong, this is simply how the fleet works and an auditor should |
| 1308 | + know it before they scroll. */ |
| 1309 | + .qh-audfinding { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding: 9px 12px; margin-bottom: 10px; background: var(--bg-white); border: 1px solid var(--stroke-medium); border-radius: var(--r-sm); font-size: 12.5px; line-height: 1.5; color: var(--fg-secondary); } |
| 1310 | + .qh-audfinding > span { flex: 1 1 260px; min-width: 0; text-wrap: pretty; } |
| 1311 | + .qh-audfinding b { font-weight: 600; color: var(--fg-primary); } |
1306 | 1312 | .qh-audsplit { display: grid; grid-template-columns: minmax(0, 1fr) 340px; gap: 14px; align-items: start; } |
1307 | 1313 | .qh-audlist { min-width: 0; border: 1px solid var(--stroke-light); border-radius: var(--r-md); overflow: hidden; background: var(--bg-white); } |
1308 | 1314 | .qh-audday-h { position: sticky; top: 0; z-index: 2; display: flex; align-items: center; gap: 8px; padding: 6px 14px; background: var(--bg-light); border-bottom: 1px solid var(--stroke-light); font-size: 11px; font-weight: 700; color: var(--fg-secondary); } |
|
1361 | 1367 | .qh-mxgroup { margin-bottom: 14px; } |
1362 | 1368 | .qh-mxgroup-h { display: flex; align-items: center; gap: 8px; margin: 12px 0 7px; font-size: 12.5px; font-weight: 600; color: var(--fg-secondary); } |
1363 | 1369 | .qh-mxgroup-n { padding: 1px 7px; border-radius: 999px; background: var(--adaptive-light); font-size: 11px; color: var(--fg-tertiary); } |
1364 | | - .qh-mxrow { display: flex; align-items: flex-start; gap: 14px; padding: 11px 13px; background: var(--bg-white); border: 1px solid var(--stroke-light); border-radius: var(--r-md); } |
| 1370 | + /* A row is ONE LINE, because the list is scanned thirty times and read once. |
| 1371 | + The whole story sits in the detail below it, one click away — the same |
| 1372 | + principle as the audit rail: a detail needs a place that does not make the |
| 1373 | + list heavy. */ |
| 1374 | + .qh-mxitem { background: var(--bg-white); border: 1px solid var(--stroke-light); border-radius: var(--r-md); } |
1365 | 1375 | /* A wide exemption LOOKS wide. Tonal ground + a stronger border, no stripe and |
1366 | | - no per-row warning banner: the brief's ask is that hierarchy carries the |
1367 | | - weight so an ordinary correct row is not shouted at. */ |
1368 | | - .qh-mxrow.is-wide { background: var(--warning-adaptive-light); border-color: var(--stroke-strong); } |
1369 | | - /* Turned off genuinely does nothing, so dimming the sentence is honest here |
1370 | | - (unlike a disabled account on the Roles screen, where the row still stands). */ |
1371 | | - .qh-mxrow.is-off { background: var(--bg-light); } |
1372 | | - .qh-mxrow.is-off .qh-mxsent, .qh-mxrow.is-off .qh-mxlines, .qh-mxrow.is-moot .qh-mxsent { color: var(--fg-tertiary); } |
1373 | | - .qh-mxrow.is-off .qh-mxsent b { color: var(--fg-secondary); } |
1374 | | - .qh-mxrow-main { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 4px; } |
1375 | | - .qh-mxrow-top { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } |
| 1376 | + no per-row warning banner: hierarchy carries the weight so an ordinary |
| 1377 | + correct row is not shouted at. */ |
| 1378 | + .qh-mxitem.is-wide { background: var(--warning-adaptive-light); border-color: var(--stroke-strong); } |
| 1379 | + /* Turned off genuinely does nothing, so dimming is honest here (unlike a |
| 1380 | + disabled account on the Roles screen, where the row still stands). */ |
| 1381 | + .qh-mxitem.is-off { background: var(--bg-light); } |
| 1382 | + .qh-mxitem.is-off .qh-mxtitle, .qh-mxitem.is-moot .qh-mxtitle { color: var(--fg-tertiary); } |
| 1383 | + .qh-mxlist { gap: 6px; } |
| 1384 | + .qh-mxitem.is-off .qh-mxsent, .qh-mxitem.is-off .qh-mxlines, .qh-mxitem.is-moot .qh-mxsent { color: var(--fg-tertiary); } |
| 1385 | + .qh-mxitem.is-off .qh-mxsent b { color: var(--fg-secondary); } |
| 1386 | + .qh-mxitem.is-open { border-color: var(--stroke-strong); } |
| 1387 | + .qh-mxitem-top { display: flex; align-items: center; gap: 9px; width: 100%; padding: 9px 12px; background: none; border: 0; border-radius: var(--r-md); font: inherit; text-align: left; cursor: pointer; } |
| 1388 | + .qh-mxitem-top:hover { background: var(--adaptive-light); } |
| 1389 | + .qh-mxcaret { flex-shrink: 0; display: inline-flex; color: var(--fg-tertiary); transition: transform .15s ease; } |
| 1390 | + .qh-mxitem.is-open .qh-mxcaret { transform: rotate(90deg); } |
| 1391 | + .qh-mxwhere { flex-shrink: 0; font-family: var(--qh-mono); font-size: 11.5px; color: var(--fg-tertiary); } |
| 1392 | + .qh-mxtitle { flex-shrink: 0; font-family: var(--qh-mono); font-size: 12px; color: var(--fg-primary); } |
| 1393 | + /* The reason shares the row's one line: it is the most useful sentence on the |
| 1394 | + row and the thing the search matches, so it is worth the width left over |
| 1395 | + and no more. The full text is two lines down, in the detail. */ |
| 1396 | + .qh-mxsaid { flex: 1 1 auto; min-width: 40px; font-size: 12px; color: var(--fg-tertiary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } |
| 1397 | + .qh-mxwhen { flex-shrink: 0; margin-left: auto; font-size: 11px; color: var(--fg-tertiary); } |
| 1398 | + .qh-mxdetail { display: flex; flex-direction: column; gap: 5px; padding: 2px 14px 13px 33px; } |
| 1399 | + .qh-mxrowacts { display: flex; align-items: center; gap: 13px; flex-wrap: wrap; margin-top: 7px; } |
| 1400 | + /* The one fact the list cannot show about itself, said once above it rather |
| 1401 | + than as a second section with its own explanatory paragraph. */ |
| 1402 | + .qh-mxbar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; font-size: 12.5px; color: var(--fg-secondary); } |
| 1403 | + .qh-mxbar svg { flex-shrink: 0; color: var(--fg-warning); } |
| 1404 | + .qh-mxbar b { color: var(--fg-primary); } |
1376 | 1405 | .qh-mxpath { font-family: var(--qh-mono); font-size: 12px; line-height: 1.55; color: var(--fg-primary); overflow-wrap: break-word; min-width: 0; } |
1377 | 1406 | .qh-mxsep { margin: 0 5px; color: var(--fg-tertiary); } |
1378 | 1407 | .qh-mxall { color: var(--fg-warning); } |
1379 | | - .qh-mxchip { padding: 2px 8px; border-radius: var(--r-2xs); font-size: 10px; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; color: var(--fg-secondary); background: var(--adaptive-strong); } |
| 1408 | + .qh-mxchip { white-space: nowrap; padding: 2px 8px; border-radius: var(--r-2xs); font-size: 10px; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; color: var(--fg-secondary); background: var(--adaptive-strong); } |
1380 | 1409 | .qh-mxchip.is-server, .qh-mxchip.is-database { color: var(--fg-danger); background: var(--danger-adaptive-light); } |
1381 | 1410 | .qh-mxchip.is-schema { color: var(--fg-warning); background: var(--warning-adaptive-light); } |
1382 | 1411 | .qh-mxchip.is-off { color: var(--fg-tertiary); background: var(--adaptive-medium); } |
1383 | 1412 | .qh-mxchip.is-gone { color: var(--fg-warning); background: var(--warning-adaptive-light); } |
1384 | 1413 | .qh-mxchip.is-aud { color: var(--fg-accent); background: var(--brand-adaptive-light); } |
| 1414 | + /* Only what differs from the default that 27 of the 30 live rows use. A chip |
| 1415 | + on every row would make every row read the same. */ |
| 1416 | + .qh-mxchip.is-full { color: var(--fg-danger); background: var(--danger-adaptive-light); } |
| 1417 | + .qh-mxchip.is-join { color: var(--fg-warning); background: var(--warning-adaptive-light); } |
1385 | 1418 | .qh-mxsent { font-size: 13px; line-height: 1.5; color: var(--fg-secondary); text-wrap: pretty; } |
1386 | 1419 | .qh-mxsent b { font-weight: 600; color: var(--fg-primary); } |
1387 | 1420 | .qh-mxlines { display: flex; flex-wrap: wrap; gap: 4px 14px; font-size: 11.5px; line-height: 1.45; color: var(--fg-tertiary); } |
|
1391 | 1424 | .qh-mxreason { margin-top: 2px; font-size: 12.5px; line-height: 1.5; color: var(--fg-secondary); text-wrap: pretty; } |
1392 | 1425 | .qh-mxmeta { font-size: 11px; font-family: var(--qh-mono); color: var(--fg-tertiary); } |
1393 | 1426 | .qh-mxsug { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; margin-top: 5px; padding: 6px 9px; border-radius: var(--r-xs); background: var(--adaptive-light); font-size: 11.5px; color: var(--fg-secondary); } |
1394 | | - .qh-mxacts { flex-shrink: 0; display: flex; align-items: center; gap: 8px; } |
| 1427 | + /* The app's quiet text action — used wherever a control has to sit inside a |
| 1428 | + sentence or a section header without becoming a button. Bare, tokened and |
| 1429 | + accent-coloured so it reads as actionable beside body text; qh-mxdel below |
| 1430 | + is the same idiom with a danger hover. */ |
| 1431 | + .qh-linkbtn { padding: 0; background: none; border: 0; font: inherit; font-size: 11.5px; font-weight: 500; color: var(--fg-accent); cursor: pointer; } |
| 1432 | + .qh-linkbtn:hover { text-decoration: underline; } |
| 1433 | + .qh-linkbtn:focus-visible { outline: none; border-radius: var(--r-2xs); box-shadow: 0 0 0 2px var(--brand-adaptive-medium); } |
1395 | 1434 | .qh-mxdel { padding: 0; background: none; border: 0; font: inherit; font-size: 12px; color: var(--fg-tertiary); cursor: pointer; } |
1396 | 1435 | .qh-mxdel:hover { color: var(--fg-danger); } |
1397 | | - .qh-mxcount { margin-left: auto; font-size: 11.5px; color: var(--fg-tertiary); } |
1398 | 1436 | /* --- the add flow --- */ |
1399 | 1437 | .qh-mxform { margin: 0 0 16px; padding: 16px 18px; background: var(--bg-white); border: 1px solid var(--stroke-medium); border-radius: var(--r-lg); } |
1400 | 1438 | .qh-mxfields { display: flex; gap: 12px; flex-wrap: wrap; } |
1401 | 1439 | .qh-mxfields .qh-select { min-width: 190px; } |
1402 | 1440 | .qh-mxcolfield .qh-select { min-width: 300px; } |
1403 | | - .qh-mxrungs { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 8px; } |
1404 | | - .qh-mxrung { display: flex; flex-direction: column; gap: 3px; padding: 10px 12px; background: var(--bg-light); border: 1px solid var(--stroke-light); border-radius: var(--r-sm); font: inherit; text-align: left; cursor: pointer; } |
1405 | | - .qh-mxrung:hover { border-color: var(--stroke-accent); } |
1406 | | - .qh-mxrung.is-on { background: var(--brand-adaptive-light); border-color: var(--brand-green); } |
1407 | | - /* The two wide rungs are picked deliberately or not at all, so selecting one |
1408 | | - changes the colour of the choice itself — not just of a warning beside it. */ |
1409 | | - .qh-mxrung.is-wide.is-on { background: var(--danger-adaptive-light); border-color: var(--fg-danger); } |
1410 | | - .qh-mxrung-l { display: flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 600; color: var(--fg-primary); } |
1411 | | - .qh-mxrung.is-on .qh-mxrung-l { color: var(--fg-accent); } |
1412 | | - .qh-mxrung.is-wide.is-on .qh-mxrung-l { color: var(--fg-danger); } |
1413 | | - .qh-mxrung-w { font-size: 11.5px; line-height: 1.45; color: var(--fg-tertiary); text-wrap: pretty; } |
1414 | | - /* Off the top of the ladder, not a sixth peer card: it is wider than the top |
1415 | | - rung of a ladder built to make width feel wide, and it should not sit in |
1416 | | - the same row as "one column". */ |
1417 | | - .qh-mxfleet { display: flex; align-items: flex-start; gap: 9px; width: 100%; margin-top: 8px; padding: 10px 12px; background: none; border: 1px dashed var(--stroke-strong); border-radius: var(--r-sm); font: inherit; text-align: left; color: var(--fg-secondary); cursor: pointer; } |
1418 | | - .qh-mxfleet:hover { border-color: var(--fg-danger); color: var(--fg-danger); } |
1419 | | - .qh-mxfleet.is-on { border-style: solid; background: var(--danger-adaptive-light); border-color: var(--fg-danger); color: var(--fg-danger); } |
1420 | | - .qh-mxfleet-t { flex: 1 1 auto; display: flex; flex-direction: column; gap: 3px; font-size: 13px; font-weight: 600; } |
1421 | | - .qh-mxfleet-w { font-size: 11.5px; font-weight: 400; line-height: 1.45; color: var(--fg-tertiary); text-wrap: pretty; } |
1422 | | - .qh-mxfleet.is-on .qh-mxfleet-w { color: var(--fg-danger); } |
| 1441 | + /* The ladder as ONE row, widest last. Five cards printing five widths at once |
| 1442 | + made the reader compare all five before picking one; the sentence under the |
| 1443 | + row states the width of the rung they actually picked, which is the only |
| 1444 | + one they are deciding about. */ |
| 1445 | + .qh-mxscope { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; } |
| 1446 | + /* Picking a wide rung colours the CHOICE, not a warning beside it. */ |
| 1447 | + .qh-mxscope .qh-seg-opt.is-wide.is-active { color: var(--fg-danger); background: var(--danger-adaptive-light); } |
| 1448 | + .qh-mxfleetlink { font-size: 12px; } |
| 1449 | + .qh-mxwidth { margin: 9px 0 14px; font-size: 12.5px; line-height: 1.5; color: var(--fg-secondary); text-wrap: pretty; } |
| 1450 | + /* Off the ladder rather than a sixth segment: it is wider than the top rung of |
| 1451 | + a ladder built to make width feel wide, and it should not sit in the same |
| 1452 | + row as "one column". */ |
| 1453 | + .qh-mxfleetbox { display: flex; align-items: flex-start; gap: 9px; margin-top: 10px; padding: 10px 12px; background: var(--danger-adaptive-light); border: 1px solid var(--fg-danger); border-radius: var(--r-sm); font-size: 12.5px; line-height: 1.5; color: var(--fg-danger); text-wrap: pretty; } |
| 1454 | + .qh-mxfleetbox svg { flex-shrink: 0; margin-top: 2px; } |
| 1455 | + /* Numbered steps, so the form reads as three things instead of nine. */ |
| 1456 | + .qh-mxstep { display: flex; align-items: baseline; gap: 9px; margin: 18px 0 9px; } |
| 1457 | + .qh-mxstep:first-child { margin-top: 0; } |
| 1458 | + .qh-mxstep-n { flex-shrink: 0; width: 19px; height: 19px; display: inline-flex; align-items: center; justify-content: center; border-radius: 999px; background: var(--adaptive-light); font-size: 11px; font-weight: 700; color: var(--fg-secondary); } |
| 1459 | + .qh-mxstep-t { display: flex; flex-direction: column; gap: 3px; font-size: 13px; font-weight: 600; color: var(--fg-primary); } |
| 1460 | + .qh-mxstep-t .qh-accedit-hint { font-weight: 400; } |
| 1461 | + /* The defaults, STATED. Two questions whose answer is right 27 times out of 30 |
| 1462 | + are not questions on the way past — but reading this line has to be faster |
| 1463 | + than opening it, or it is just a closed form. */ |
| 1464 | + .qh-mxsum { display: flex; align-items: center; justify-content: space-between; gap: 14px; width: 100%; max-width: 620px; padding: 9px 12px; background: var(--bg-light); border: 1px solid var(--stroke-light); border-radius: var(--r-sm); font: inherit; text-align: left; cursor: pointer; } |
| 1465 | + .qh-mxsum:hover { border-color: var(--stroke-accent); } |
| 1466 | + .qh-mxsum-t { font-size: 12.5px; color: var(--fg-secondary); } |
| 1467 | + .qh-mxsettings { margin-top: 2px; } |
| 1468 | + /* Editing in place: the consequences and the reason, never the reach. */ |
| 1469 | + .qh-mxeditbox { display: flex; flex-direction: column; gap: 11px; margin-top: 2px; padding: 12px 14px; background: var(--bg-light); border: 1px solid var(--stroke-medium); border-radius: var(--r-sm); } |
| 1470 | + .qh-mxeditwhat { display: flex; flex-direction: column; gap: 3px; } |
| 1471 | + .qh-mxfixed { font-size: 11.5px; color: var(--fg-tertiary); } |
| 1472 | + .qh-mxprevbtn { margin-right: auto; } |
1423 | 1473 | /* The typed confirmation is a separate step, separated by whitespace that |
1424 | 1474 | clears the reach sentence's own line-height (19.5px). A 14px gap let a |
1425 | 1475 | wrapped sentence run into it; a rule read as an underline on the last line |
|
1445 | 1495 | .qh-mxevidence { margin-top: 8px; font-size: 12px; line-height: 1.5; color: var(--fg-secondary); } |
1446 | 1496 | .qh-mxreason-in { display: block; width: 100%; max-width: 620px; height: auto; padding: 9px 11px; line-height: 1.5; resize: vertical; } |
1447 | 1497 | .qh-mxprev { margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--stroke-light); } |
1448 | | - .qh-mxprev-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 8px; } |
1449 | 1498 | .qh-mxprev-idle { font-size: 12.5px; line-height: 1.5; color: var(--fg-tertiary); text-wrap: pretty; } |
1450 | 1499 | .qh-mxprev-q { display: flex; align-items: flex-start; justify-content: space-between; gap: 14px; padding: 9px 11px; background: var(--bg-light); border-radius: var(--r-xs); } |
1451 | 1500 | .qh-mxprev-q code { font-family: var(--qh-mono); font-size: 11.5px; line-height: 1.55; white-space: pre-wrap; color: var(--fg-secondary); } |
|
0 commit comments