vela-protocol 0.109.0

Core library for the Vela scientific knowledge protocol: replayable frontier state, signed canonical events, and proof packets.
Documentation
/* Workbench — utility primitives layered on tokens.css.

   The page chrome (rim, head, main, foot grid) was deleted when
   Workbench.astro took over. What remains here are the small
   primitives still used inside workbench tool pages:

     .wb-btn       — hairline buttons + ink + ghost variants
     .wb-input     — underlined text input
     .wb-chip      — engraved state pill (live/ok/contested/lost/inferred)

   Anything visual related to the old .wb / .wb-rim / .wb-head /
   .wb-main / .wb-foot grid is gone. */

* { box-sizing: border-box; }

/* ============================================================
   Buttons — hairline-only by default, never solid fills
   ============================================================ */
.wb-btn {
  font-family: var(--font-sans);
  font-size: var(--size-sm);
  font-weight: 500;
  line-height: 1;
  padding: 9px 14px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--rule-2);
  background: transparent;
  color: var(--ink-1);
  cursor: pointer;
  transition:
    color var(--dur-1) var(--ease),
    border-color var(--dur-1) var(--ease),
    background var(--dur-1) var(--ease);
  letter-spacing: 0.01em;
}
.wb-btn:hover {
  color: var(--ink-0);
  border-color: color-mix(in oklab, var(--gold) 56%, transparent);
  background: var(--paper-1);
}
.wb-btn--ink {
  background: var(--ink-1);
  color: var(--paper-0);
  border-color: var(--ink-1);
}
.wb-btn--ink:hover {
  background: var(--ink-0);
  border-color: var(--ink-0);
  color: var(--paper-0);
}
.wb-btn--ghost {
  background: transparent;
  border-color: transparent;
  color: var(--ink-2);
  padding: 9px 10px;
}
.wb-btn--ghost:hover {
  color: var(--ink-0);
  background: transparent;
  border-color: transparent;
  text-decoration: underline;
  text-decoration-color: color-mix(in oklab, var(--gold) 56%, transparent);
  text-underline-offset: 4px;
}
.wb-btn__kbd {
  display: inline-block;
  margin-left: 8px;
  padding: 1px 5px;
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--ink-3);
  border: 1px solid var(--rule-2);
  border-radius: var(--radius-sm);
  background: var(--paper-1);
  letter-spacing: 0.08em;
}

/* ============================================================
   Input — underlined field, not a box
   ============================================================ */
.wb-input {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 2px;
  border: 0;
  border-bottom: 1px solid var(--rule-3);
  background: transparent;
  transition: border-bottom-color var(--dur-1) var(--ease);
}
.wb-input:focus-within { border-bottom-color: var(--gold); }
.wb-input input {
  flex: 1; border: 0; outline: 0; background: transparent;
  font: inherit; color: var(--ink-0);
  font-size: var(--size-base);
  font-family: var(--font-sans);
}
.wb-input input::placeholder { color: var(--ink-4); }
.wb-input__kbd {
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--ink-3);
  border: 1px solid var(--rule-2);
  border-radius: var(--radius-sm);
  padding: 1px 5px;
  letter-spacing: 0.08em;
}

/* ============================================================
   State chip — engraved pill, no fills
   ============================================================ */
.wb-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 2px 8px;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--chip, var(--ink-3));
  border: 1px solid color-mix(in oklab, var(--chip, var(--ink-3)) 38%, transparent);
  border-radius: var(--radius-sm);
  line-height: 1.5;
  background: transparent;
}
.wb-chip__dot {
  width: 5px; height: 5px; border-radius: 50%;
  background: var(--chip, var(--ink-3));
}

/* Live chip — gold pulse, the "now" state */
.wb-chip--live {
  --chip: var(--gold);
  color: color-mix(in oklab, var(--gold) 80%, var(--ink-1));
}
.wb-chip--live .wb-chip__dot {
  box-shadow: 0 0 0 2px var(--gold-soft);
  animation: wb-chip-pulse 3.6s var(--ease) infinite;
}
@keyframes wb-chip-pulse {
  0%, 100% { box-shadow: 0 0 0 2px var(--gold-soft); }
  50%      { box-shadow: 0 0 0 3px var(--gold-glow); }
}

/* Semantic state chips */
.wb-chip--ok        { --chip: var(--moss); }
.wb-chip--contested { --chip: var(--brass); }
.wb-chip--lost      { --chip: var(--cinnabar); }
.wb-chip--inferred  { --chip: var(--winter); }