Upload style.css
Browse files- static/css/style.css +55 -105
static/css/style.css
CHANGED
|
@@ -554,7 +554,8 @@ textarea:focus, input[type="text"]:focus {
|
|
| 554 |
}
|
| 555 |
|
| 556 |
.history-row-static .timestamp {
|
| 557 |
-
float:
|
|
|
|
| 558 |
font-weight: 400;
|
| 559 |
}
|
| 560 |
|
|
@@ -608,7 +609,7 @@ textarea:focus, input[type="text"]:focus {
|
|
| 608 |
}
|
| 609 |
|
| 610 |
.result-text {
|
| 611 |
-
font-size: var(--text-
|
| 612 |
color: var(--color-text);
|
| 613 |
}
|
| 614 |
|
|
@@ -637,7 +638,7 @@ audio {
|
|
| 637 |
padding: var(--space-3) var(--space-4);
|
| 638 |
border-radius: var(--radius-sm);
|
| 639 |
font-size: var(--text-base);
|
| 640 |
-
margin-bottom:
|
| 641 |
}
|
| 642 |
|
| 643 |
.nav-link {
|
|
@@ -758,6 +759,7 @@ audio {
|
|
| 758 |
align-items: center;
|
| 759 |
justify-content: center;
|
| 760 |
cursor: pointer;
|
|
|
|
| 761 |
box-shadow: 0 4px 12px rgba(96, 108, 56, 0.35);
|
| 762 |
transition: background-color 120ms ease, transform 120ms ease;
|
| 763 |
}
|
|
@@ -1019,16 +1021,6 @@ audio {
|
|
| 1019 |
}
|
| 1020 |
|
| 1021 |
/* One-shot ripple on the inline mic button when tapped */
|
| 1022 |
-
.mic-inline-btn {
|
| 1023 |
-
position: absolute;
|
| 1024 |
-
right: 8px;
|
| 1025 |
-
bottom: 8px;
|
| 1026 |
-
width: 38px;
|
| 1027 |
-
height: 38px;
|
| 1028 |
-
border-radius: 50%;
|
| 1029 |
-
overflow: visible;
|
| 1030 |
-
}
|
| 1031 |
-
|
| 1032 |
.mic-inline-btn::after {
|
| 1033 |
content: "";
|
| 1034 |
position: absolute;
|
|
@@ -1483,13 +1475,14 @@ audio {
|
|
| 1483 |
}
|
| 1484 |
|
| 1485 |
/* ============================================================
|
| 1486 |
-
|
|
|
|
| 1487 |
============================================================ */
|
| 1488 |
|
| 1489 |
/* Filter chips — status/language filters above list and history views.
|
| 1490 |
-
Distinct from .chip (symptom/reply quick-select) which uses
|
| 1491 |
-
|
| 1492 |
-
|
| 1493 |
.filter-chip-row {
|
| 1494 |
display: flex;
|
| 1495 |
flex-wrap: wrap;
|
|
@@ -1521,6 +1514,11 @@ audio {
|
|
| 1521 |
color: var(--color-primary-dark);
|
| 1522 |
}
|
| 1523 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1524 |
.provider .filter-chip:hover {
|
| 1525 |
border-color: var(--color-provider-accent);
|
| 1526 |
}
|
|
@@ -1531,6 +1529,11 @@ audio {
|
|
| 1531 |
color: var(--color-provider-accent-text);
|
| 1532 |
}
|
| 1533 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1534 |
.sort-toggle-btn {
|
| 1535 |
display: inline-flex;
|
| 1536 |
align-items: center;
|
|
@@ -1553,77 +1556,29 @@ audio {
|
|
| 1553 |
color: var(--color-provider-accent-text);
|
| 1554 |
}
|
| 1555 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1556 |
.sort-toggle-btn svg {
|
| 1557 |
width: 14px;
|
| 1558 |
height: 14px;
|
| 1559 |
flex-shrink: 0;
|
| 1560 |
}
|
| 1561 |
|
| 1562 |
-
/*
|
| 1563 |
-
filters/search. Intentionally minimal — icon, short title, one line. */
|
| 1564 |
-
.empty-state {
|
| 1565 |
-
text-align: center;
|
| 1566 |
-
padding: var(--space-7) var(--space-5);
|
| 1567 |
-
}
|
| 1568 |
-
|
| 1569 |
-
.empty-state-icon {
|
| 1570 |
-
width: 36px;
|
| 1571 |
-
height: 36px;
|
| 1572 |
-
stroke: var(--color-border);
|
| 1573 |
-
margin: 0 auto var(--space-3);
|
| 1574 |
-
display: block;
|
| 1575 |
-
}
|
| 1576 |
-
|
| 1577 |
-
.empty-state-title {
|
| 1578 |
-
font-size: var(--text-base);
|
| 1579 |
-
font-weight: 600;
|
| 1580 |
-
color: var(--color-text);
|
| 1581 |
-
margin-bottom: var(--space-2);
|
| 1582 |
-
}
|
| 1583 |
-
|
| 1584 |
-
.empty-state-body {
|
| 1585 |
-
font-size: var(--text-sm);
|
| 1586 |
-
color: var(--color-text-secondary);
|
| 1587 |
-
margin: 0;
|
| 1588 |
-
}
|
| 1589 |
-
|
| 1590 |
-
/* ============================================================
|
| 1591 |
-
12F: Component library pass + accessibility review
|
| 1592 |
-
============================================================ */
|
| 1593 |
-
|
| 1594 |
-
/* ---- Focus rings: every interactive element needs a visible focus
|
| 1595 |
-
indicator for keyboard users. Existing .btn:focus-visible covers
|
| 1596 |
-
primary/secondary/provider buttons. Adding the missing cases. ---- */
|
| 1597 |
-
|
| 1598 |
-
.filter-chip:focus-visible {
|
| 1599 |
-
outline: 2px solid var(--color-primary);
|
| 1600 |
-
outline-offset: 2px;
|
| 1601 |
-
}
|
| 1602 |
-
|
| 1603 |
-
.provider .filter-chip:focus-visible {
|
| 1604 |
-
outline-color: var(--color-provider-accent);
|
| 1605 |
-
}
|
| 1606 |
-
|
| 1607 |
.queue-tab:focus-visible {
|
| 1608 |
outline: 2px solid var(--color-provider-accent);
|
| 1609 |
outline-offset: 2px;
|
| 1610 |
}
|
| 1611 |
|
| 1612 |
-
.sort-toggle-btn:focus-visible {
|
| 1613 |
-
outline: 2px solid var(--color-provider-accent);
|
| 1614 |
-
outline-offset: 2px;
|
| 1615 |
-
}
|
| 1616 |
-
|
| 1617 |
-
.history-row:focus-visible {
|
| 1618 |
-
outline: 2px solid var(--color-primary);
|
| 1619 |
-
outline-offset: 2px;
|
| 1620 |
-
}
|
| 1621 |
-
|
| 1622 |
.queue-card:focus-visible {
|
| 1623 |
outline: 2px solid var(--color-provider-accent);
|
| 1624 |
outline-offset: 2px;
|
| 1625 |
}
|
| 1626 |
|
|
|
|
| 1627 |
.audio-btn:focus-visible {
|
| 1628 |
outline: 2px solid var(--color-primary-dark);
|
| 1629 |
outline-offset: 2px;
|
|
@@ -1633,9 +1588,7 @@ audio {
|
|
| 1633 |
outline-color: var(--color-provider-accent-text);
|
| 1634 |
}
|
| 1635 |
|
| 1636 |
-
/*
|
| 1637 |
-
already exists, this mirrors it for the rust-accent role. ---- */
|
| 1638 |
-
|
| 1639 |
.btn-provider:disabled {
|
| 1640 |
background: var(--color-border);
|
| 1641 |
color: var(--color-text-secondary);
|
|
@@ -1643,42 +1596,43 @@ audio {
|
|
| 1643 |
cursor: not-allowed;
|
| 1644 |
}
|
| 1645 |
|
| 1646 |
-
/*
|
| 1647 |
-
relying on inheritance from the button's own text color). ---- */
|
| 1648 |
-
|
| 1649 |
.btn-provider .spinner {
|
| 1650 |
border: 2px solid rgba(255, 255, 255, 0.35);
|
| 1651 |
border-top-color: #fff;
|
| 1652 |
}
|
| 1653 |
|
| 1654 |
-
/*
|
| 1655 |
-
|
| 1656 |
-
|
| 1657 |
-
|
| 1658 |
-
|
| 1659 |
-
float: none;
|
| 1660 |
-
margin-left: auto;
|
| 1661 |
}
|
| 1662 |
|
| 1663 |
-
|
| 1664 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1665 |
|
| 1666 |
-
.
|
| 1667 |
font-size: var(--text-base);
|
|
|
|
| 1668 |
color: var(--color-text);
|
|
|
|
| 1669 |
}
|
| 1670 |
|
| 1671 |
-
|
| 1672 |
-
|
| 1673 |
-
|
| 1674 |
-
|
| 1675 |
-
margin-bottom: 0;
|
| 1676 |
}
|
| 1677 |
|
| 1678 |
-
/*
|
| 1679 |
-
|
| 1680 |
-
|
| 1681 |
-
|
| 1682 |
@media (min-width: 900px) {
|
| 1683 |
.provider-layout [data-step="respond"] #back-to-list,
|
| 1684 |
.provider-layout [data-step="respond"] #back-to-list-readonly {
|
|
@@ -1686,10 +1640,8 @@ audio {
|
|
| 1686 |
}
|
| 1687 |
}
|
| 1688 |
|
| 1689 |
-
/*
|
| 1690 |
-
|
| 1691 |
-
adding " (active)" to the selected filter chip label. ---- */
|
| 1692 |
-
|
| 1693 |
.sr-only {
|
| 1694 |
position: absolute;
|
| 1695 |
width: 1px;
|
|
@@ -1702,10 +1654,8 @@ audio {
|
|
| 1702 |
border: 0;
|
| 1703 |
}
|
| 1704 |
|
| 1705 |
-
/*
|
| 1706 |
-
|
| 1707 |
-
appears as a small bar at the top of the viewport on Tab. ---- */
|
| 1708 |
-
|
| 1709 |
.skip-link {
|
| 1710 |
position: absolute;
|
| 1711 |
top: -40px;
|
|
|
|
| 554 |
}
|
| 555 |
|
| 556 |
.history-row-static .timestamp {
|
| 557 |
+
float: none;
|
| 558 |
+
margin-left: auto;
|
| 559 |
font-weight: 400;
|
| 560 |
}
|
| 561 |
|
|
|
|
| 609 |
}
|
| 610 |
|
| 611 |
.result-text {
|
| 612 |
+
font-size: var(--text-base);
|
| 613 |
color: var(--color-text);
|
| 614 |
}
|
| 615 |
|
|
|
|
| 638 |
padding: var(--space-3) var(--space-4);
|
| 639 |
border-radius: var(--radius-sm);
|
| 640 |
font-size: var(--text-base);
|
| 641 |
+
margin-bottom: 0;
|
| 642 |
}
|
| 643 |
|
| 644 |
.nav-link {
|
|
|
|
| 759 |
align-items: center;
|
| 760 |
justify-content: center;
|
| 761 |
cursor: pointer;
|
| 762 |
+
overflow: visible;
|
| 763 |
box-shadow: 0 4px 12px rgba(96, 108, 56, 0.35);
|
| 764 |
transition: background-color 120ms ease, transform 120ms ease;
|
| 765 |
}
|
|
|
|
| 1021 |
}
|
| 1022 |
|
| 1023 |
/* One-shot ripple on the inline mic button when tapped */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1024 |
.mic-inline-btn::after {
|
| 1025 |
content: "";
|
| 1026 |
position: absolute;
|
|
|
|
| 1475 |
}
|
| 1476 |
|
| 1477 |
/* ============================================================
|
| 1478 |
+
Filter chips (12E), focus rings, disabled states,
|
| 1479 |
+
skip link, sr-only utility, desktop Back-hide (12F)
|
| 1480 |
============================================================ */
|
| 1481 |
|
| 1482 |
/* Filter chips — status/language filters above list and history views.
|
| 1483 |
+
Distinct from .chip (symptom/reply quick-select) which uses pill shape
|
| 1484 |
+
and sits inline in a card. These are tighter, sit in their own row,
|
| 1485 |
+
and have an explicit active/selected state. */
|
| 1486 |
.filter-chip-row {
|
| 1487 |
display: flex;
|
| 1488 |
flex-wrap: wrap;
|
|
|
|
| 1514 |
color: var(--color-primary-dark);
|
| 1515 |
}
|
| 1516 |
|
| 1517 |
+
.filter-chip:focus-visible {
|
| 1518 |
+
outline: 2px solid var(--color-primary);
|
| 1519 |
+
outline-offset: 2px;
|
| 1520 |
+
}
|
| 1521 |
+
|
| 1522 |
.provider .filter-chip:hover {
|
| 1523 |
border-color: var(--color-provider-accent);
|
| 1524 |
}
|
|
|
|
| 1529 |
color: var(--color-provider-accent-text);
|
| 1530 |
}
|
| 1531 |
|
| 1532 |
+
.provider .filter-chip:focus-visible {
|
| 1533 |
+
outline-color: var(--color-provider-accent);
|
| 1534 |
+
}
|
| 1535 |
+
|
| 1536 |
+
/* Sort toggle button, shown on provider Completed tab only */
|
| 1537 |
.sort-toggle-btn {
|
| 1538 |
display: inline-flex;
|
| 1539 |
align-items: center;
|
|
|
|
| 1556 |
color: var(--color-provider-accent-text);
|
| 1557 |
}
|
| 1558 |
|
| 1559 |
+
.sort-toggle-btn:focus-visible {
|
| 1560 |
+
outline: 2px solid var(--color-provider-accent);
|
| 1561 |
+
outline-offset: 2px;
|
| 1562 |
+
}
|
| 1563 |
+
|
| 1564 |
.sort-toggle-btn svg {
|
| 1565 |
width: 14px;
|
| 1566 |
height: 14px;
|
| 1567 |
flex-shrink: 0;
|
| 1568 |
}
|
| 1569 |
|
| 1570 |
+
/* Queue tab and card focus rings */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1571 |
.queue-tab:focus-visible {
|
| 1572 |
outline: 2px solid var(--color-provider-accent);
|
| 1573 |
outline-offset: 2px;
|
| 1574 |
}
|
| 1575 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1576 |
.queue-card:focus-visible {
|
| 1577 |
outline: 2px solid var(--color-provider-accent);
|
| 1578 |
outline-offset: 2px;
|
| 1579 |
}
|
| 1580 |
|
| 1581 |
+
/* Audio button focus rings */
|
| 1582 |
.audio-btn:focus-visible {
|
| 1583 |
outline: 2px solid var(--color-primary-dark);
|
| 1584 |
outline-offset: 2px;
|
|
|
|
| 1588 |
outline-color: var(--color-provider-accent-text);
|
| 1589 |
}
|
| 1590 |
|
| 1591 |
+
/* Provider Send button disabled state, mirrors .btn-primary:disabled */
|
|
|
|
|
|
|
| 1592 |
.btn-provider:disabled {
|
| 1593 |
background: var(--color-border);
|
| 1594 |
color: var(--color-text-secondary);
|
|
|
|
| 1596 |
cursor: not-allowed;
|
| 1597 |
}
|
| 1598 |
|
| 1599 |
+
/* Spinner inside the provider Send button */
|
|
|
|
|
|
|
| 1600 |
.btn-provider .spinner {
|
| 1601 |
border: 2px solid rgba(255, 255, 255, 0.35);
|
| 1602 |
border-top-color: #fff;
|
| 1603 |
}
|
| 1604 |
|
| 1605 |
+
/* Empty state: shown when a list is genuinely empty or no results match
|
| 1606 |
+
filters/search. Intentionally minimal — icon, short title, one line. */
|
| 1607 |
+
.empty-state {
|
| 1608 |
+
text-align: center;
|
| 1609 |
+
padding: var(--space-7) var(--space-5);
|
|
|
|
|
|
|
| 1610 |
}
|
| 1611 |
|
| 1612 |
+
.empty-state-icon {
|
| 1613 |
+
width: 36px;
|
| 1614 |
+
height: 36px;
|
| 1615 |
+
stroke: var(--color-border);
|
| 1616 |
+
margin: 0 auto var(--space-3);
|
| 1617 |
+
display: block;
|
| 1618 |
+
}
|
| 1619 |
|
| 1620 |
+
.empty-state-title {
|
| 1621 |
font-size: var(--text-base);
|
| 1622 |
+
font-weight: 600;
|
| 1623 |
color: var(--color-text);
|
| 1624 |
+
margin-bottom: var(--space-2);
|
| 1625 |
}
|
| 1626 |
|
| 1627 |
+
.empty-state-body {
|
| 1628 |
+
font-size: var(--text-sm);
|
| 1629 |
+
color: var(--color-text-secondary);
|
| 1630 |
+
margin: 0;
|
|
|
|
| 1631 |
}
|
| 1632 |
|
| 1633 |
+
/* Desktop provider: hide Back buttons inside the respond pane.
|
| 1634 |
+
On desktop both panes are always visible (two-column grid), so
|
| 1635 |
+
Back belongs to mobile-only one-at-a-time navigation. */
|
|
|
|
| 1636 |
@media (min-width: 900px) {
|
| 1637 |
.provider-layout [data-step="respond"] #back-to-list,
|
| 1638 |
.provider-layout [data-step="respond"] #back-to-list-readonly {
|
|
|
|
| 1640 |
}
|
| 1641 |
}
|
| 1642 |
|
| 1643 |
+
/* Visually-hidden utility: screen-reader-only text, visible to AT
|
| 1644 |
+
but not rendered on screen. */
|
|
|
|
|
|
|
| 1645 |
.sr-only {
|
| 1646 |
position: absolute;
|
| 1647 |
width: 1px;
|
|
|
|
| 1654 |
border: 0;
|
| 1655 |
}
|
| 1656 |
|
| 1657 |
+
/* Skip link: keyboard users can bypass the header and jump to main
|
| 1658 |
+
content. Visually hidden until focused, rises to the top on Tab. */
|
|
|
|
|
|
|
| 1659 |
.skip-link {
|
| 1660 |
position: absolute;
|
| 1661 |
top: -40px;
|