/* ------------------------------------------------------------------
   Cheetah figure vocabulary — adopted, not authored.

   Source: Cheetah presentation/website-visualizations/round-2/assets/styles.css
   Verbatim copy kept at visuals/projects/cheetah/slides/styles.css
   Regenerate with the script in the session scratchpad if the project ships a
   new figure set.

   Only the figure rules are kept, scoped under .figure-plate. Page-level rules
   (:root, body, .site-shell, .gallery, .chart-*, legends) and the project's
   dark-mode palette are deliberately dropped: Lab429 supplies the palette from
   figure-plate.css, and these rules read it through the same variable names.
   ------------------------------------------------------------------ */

.figure-plate .evidence-table {
  width: 100%;
  min-width: 1040px;
  border-collapse: collapse;
  color: var(--ink);
  font-size: 14px;
  line-height: 1.42;
}

.figure-plate .evidence-table caption {
  padding: 0 0 14px;
  color: var(--muted);
  text-align: left;
}

.figure-plate .evidence-table th,
.figure-plate .evidence-table td {
  padding: 13px 14px;
  border-bottom: 1px solid var(--line-soft);
  text-align: left;
  vertical-align: top;
}

.figure-plate .evidence-table thead th {
  border-top: 1px solid var(--line-soft);
  background: var(--server);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.02em;
}

.figure-plate .evidence-table tbody th {
  width: 15%;
  font-weight: 700;
}

.figure-plate .evidence-table td:nth-child(2) {
  width: 23%;
  background: var(--return-soft);
}

.figure-plate .evidence-table td:nth-child(3) {
  width: 24%;
  background: var(--warning-soft);
}

.figure-plate .evidence-table td:nth-child(4) {
  width: 18%;
}

.figure-plate .evidence-table td:nth-child(5) {
  width: 20%;
}

.figure-plate .shared-spine {
  min-width: 1040px;
  margin-bottom: 16px;
  padding: 13px 16px;
  border-left: 4px solid var(--command);
  background: var(--command-soft);
  color: var(--ink);
  font-size: 14px;
  line-height: 1.45;
}

.figure-plate .capability-table {
  width: 100%;
  min-width: 1040px;
  border-collapse: collapse;
  color: var(--ink);
  font-size: 14px;
  line-height: 1.42;
}

.figure-plate .capability-table caption {
  padding: 0 0 14px;
  color: var(--muted);
  text-align: left;
}

.figure-plate .capability-table th,
.figure-plate .capability-table td {
  padding: 13px 14px;
  border-bottom: 1px solid var(--line-soft);
  text-align: left;
  vertical-align: top;
}

.figure-plate .capability-table thead th {
  border-top: 1px solid var(--line-soft);
  background: var(--server);
  font-size: 13px;
  font-weight: 700;
}

.figure-plate .capability-table tbody th {
  width: 14%;
  font-weight: 700;
}

.figure-plate .capability-table td:nth-child(2) {
  width: 18%;
}

.figure-plate .capability-table td:nth-child(3) {
  width: 23%;
  background: var(--return-soft);
}

.figure-plate .capability-table td:nth-child(4) {
  width: 23%;
}

.figure-plate .capability-table td:nth-child(5) {
  width: 22%;
  background: var(--warning-soft);
}

.figure-plate .status {
  display: block;
  width: fit-content;
  margin-bottom: 6px;
  font-size: 12px;
  font-weight: 700;
}

.figure-plate .status.implemented {
  color: var(--return);
}

.figure-plate .status.partial {
  color: var(--warning);
}

.figure-plate .status.contract {
  color: var(--command);
}

.figure-plate .composition-rule {
  min-width: 1040px;
  margin-bottom: 16px;
  padding: 13px 16px;
  border-left: 4px solid var(--return);
  background: var(--return-soft);
  color: var(--ink);
  font-size: 14px;
  line-height: 1.45;
}

.figure-plate .configuration-table {
  width: 100%;
  min-width: 1080px;
  border-collapse: collapse;
  color: var(--ink);
  font-size: 14px;
  line-height: 1.42;
}

.figure-plate .configuration-table caption {
  padding: 0 0 14px;
  color: var(--muted);
  text-align: left;
}

.figure-plate .configuration-table th,
.figure-plate .configuration-table td {
  padding: 13px 14px;
  border-bottom: 1px solid var(--line-soft);
  text-align: left;
  vertical-align: top;
}

.figure-plate .configuration-table thead th {
  border-top: 1px solid var(--line-soft);
  background: var(--server);
  font-size: 13px;
  font-weight: 700;
}

.figure-plate .configuration-table tbody th {
  width: 15%;
  font-weight: 700;
}

.figure-plate .configuration-table td:nth-child(2) {
  width: 20%;
  background: var(--return-soft);
}

.figure-plate .configuration-table td:nth-child(3) {
  width: 23%;
}

.figure-plate .configuration-table td:nth-child(4) {
  width: 20%;
  background: var(--warning-soft);
}

.figure-plate .configuration-table td:nth-child(5) {
  width: 22%;
}

.figure-plate .composition-points {
  min-width: 1040px;
  margin-top: 16px;
  padding: 13px 16px;
  border-left: 4px solid var(--command);
  background: var(--command-soft);
  color: var(--ink);
  font-size: 14px;
  line-height: 1.45;
}

.figure-plate .composition-points strong,
.figure-plate .composition-points span {
  display: block;
}

.figure-plate .composition-points span {
  margin-top: 3px;
  color: var(--muted);
}

.figure-plate .retention-rule {
  min-width: 1080px;
  margin-bottom: 16px;
  padding: 13px 16px;
  border-left: 4px solid var(--warning);
  background: var(--warning-soft);
  color: var(--ink);
  font-size: 14px;
  line-height: 1.45;
}

.figure-plate .retention-table {
  width: 100%;
  min-width: 1120px;
  border-collapse: collapse;
  color: var(--ink);
  font-size: 14px;
  line-height: 1.42;
}

.figure-plate .retention-table caption {
  padding: 0 0 14px;
  color: var(--muted);
  text-align: left;
}

.figure-plate .retention-table th,
.figure-plate .retention-table td {
  padding: 13px 14px;
  border-bottom: 1px solid var(--line-soft);
  text-align: left;
  vertical-align: top;
}

.figure-plate .retention-table thead th {
  border-top: 1px solid var(--line-soft);
  background: var(--server);
  font-size: 13px;
  font-weight: 700;
}

.figure-plate .retention-table tbody th {
  width: 15%;
  font-weight: 700;
}

.figure-plate .retention-table td:nth-child(2) {
  width: 18%;
}

.figure-plate .retention-table td:nth-child(3) {
  width: 21%;
  background: var(--return-soft);
}

.figure-plate .retention-table td:nth-child(4) {
  width: 21%;
}

.figure-plate .retention-table td:nth-child(5) {
  width: 25%;
  background: var(--warning-soft);
}

.figure-plate .diagram .boundary {
  fill: var(--surface-soft);
  stroke: var(--line-soft);
  stroke-width: 2;
}

.figure-plate .diagram .boundary.server-boundary {
  fill: var(--server);
}

.figure-plate .diagram .boundary.client-boundary {
  fill: var(--client);
  stroke: var(--client-line);
}

.figure-plate .diagram .node,
.figure-plate .diagram .role,
.figure-plate .diagram .chip,
.figure-plate .diagram .store,
.figure-plate .diagram .evidence,
.figure-plate .diagram .machine,
.figure-plate .diagram .note-box {
  fill: var(--surface);
  stroke: var(--line);
  stroke-width: 1.7;
}

/* ---- colour modifiers ----
   The base rule above re-declares a grey stroke at the same specificity as the plate's
   single-class colour rules, and it lands later, so every coloured variant has to be
   restated here at higher specificity or it silently falls back to grey on plain
   surface. This used to be done one base-and-modifier pair at a time, which meant the
   colour of a box depended on which base class it happened to be drawn with: a
   `node command-node` was blue but a `role command-node` was grey, and `action-node`
   and `evidence-node` had no entry at all, so they were always grey. Between them that
   was thirty nodes in the AWACS set, twenty-four in Troveholm's and twenty-two in
   Cheetah's, none of them visibly broken enough to notice.

   Pairing base against modifier never terminates — each new project brings a base the
   list has not met. `:not(.boundary)` raises the modifier to the same specificity for
   every base at once, present and future. Boundaries are excluded because they are
   deliberately hollow; the two that carry a colour modifier take the stroke only. */
.figure-plate .diagram .command-node:not(.boundary) {
  fill: var(--command-soft);
  stroke: var(--command);
}

.figure-plate .diagram .evidence-node:not(.boundary) {
  fill: var(--evidence-soft);
  stroke: var(--evidence);
}

.figure-plate .diagram .return-node:not(.boundary) {
  fill: var(--return-soft);
  stroke: var(--return);
}

.figure-plate .diagram .action-node:not(.boundary) {
  fill: var(--action-soft);
  stroke: var(--action);
}

.figure-plate .diagram .warning-node:not(.boundary) {
  fill: var(--warning-soft);
  stroke: var(--warning);
}

.figure-plate .diagram .danger-node:not(.boundary) {
  fill: var(--danger-soft);
  stroke: var(--danger);
}

.figure-plate .diagram .platform-node:not(.boundary) {
  fill: var(--client);
  stroke: var(--client-line);
}

/* A future-node marks a capability that is designed but not built. This is the one the
   honesty of a figure rests on, so it carries its own colour as well as its dash. */
.figure-plate .diagram .future-node:not(.boundary) {
  fill: var(--future-soft);
  stroke: var(--future);
  stroke-dasharray: 7 6;
}

.figure-plate .diagram .boundary.warning-node { stroke: var(--warning); }
.figure-plate .diagram .boundary.return-node { stroke: var(--return); }

.figure-plate .diagram .node.optional-node {
  stroke-dasharray: 7 5;
}

.figure-plate .diagram .machine.selected {
  stroke: var(--command);
  stroke-width: 4;
}

.figure-plate .diagram text {
  fill: var(--ink);
  font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}

.figure-plate .diagram .title {
  font-size: 22px;
  font-weight: 700;
}

.figure-plate .diagram .label {
  font-size: 17px;
  font-weight: 650;
}

.figure-plate .diagram .body {
  font-size: 15px;
  font-weight: 450;
}

.figure-plate .diagram .small {
  font-size: 13px;
  font-weight: 500;
}

.figure-plate .diagram .tiny {
  font-size: 11.5px;
  font-weight: 500;
}

.figure-plate .diagram .muted {
  fill: var(--muted);
}

.figure-plate .diagram .command-text {
  fill: var(--command);
}

.figure-plate .diagram .return-text {
  fill: var(--return);
}

.figure-plate .diagram .warning-text {
  fill: var(--warning);
}

.figure-plate .diagram .danger-text {
  fill: var(--danger);
}

.figure-plate .diagram .edge {
  fill: none;
  stroke: var(--line);
  stroke-width: 2.2;
}

.figure-plate .diagram .edge.command {
  stroke: var(--command);
  stroke-width: 3;
}

.figure-plate .diagram .edge.return {
  stroke: var(--return);
  stroke-width: 3;
}

.figure-plate .diagram .edge.danger {
  stroke: var(--danger);
  stroke-width: 2.5;
}

.figure-plate .diagram .edge.dashed {
  stroke-dasharray: 7 7;
}

.figure-plate .diagram .edge.observed {
  stroke-dasharray: 3 7;
}

.figure-plate .diagram .label-bg {
  fill: var(--surface);
  opacity: 0.96;
}

.figure-plate .diagram .number {
  fill: var(--ink);
}

.figure-plate .diagram .number-text {
  fill: var(--surface);
  font-size: 13px;
  font-weight: 750;
  text-anchor: middle;
}

.figure-plate .diagram .separator {
  stroke: var(--line-soft);
  stroke-width: 1.4;
}
