:root {
--fv-prior: #58a6ff;
--fv-data: #f2cc60;
--fv-post: #56d364;
--fv-hot: #ff7b72;
--fv-flow: #bc8cff;
--fv-ink: rgba(230, 237, 243, 0.9);
--fv-grid: rgba(230, 237, 243, 0.08);
--fv-panel: rgba(110, 118, 129, 0.08);
}
html.light,
html.rust {
--fv-prior: #0969da;
--fv-data: #9a6700;
--fv-post: #1a7f37;
--fv-hot: #cf222e;
--fv-flow: #8250df;
--fv-ink: rgba(31, 35, 40, 0.9);
--fv-grid: rgba(31, 35, 40, 0.08);
--fv-panel: rgba(175, 184, 193, 0.12);
}
html.coal,
html.navy,
html.ayu,
html.dark {
--fv-prior: #58a6ff;
--fv-data: #f2cc60;
--fv-post: #56d364;
--fv-hot: #ff7b72;
--fv-flow: #bc8cff;
--fv-ink: rgba(230, 237, 243, 0.9);
--fv-grid: rgba(230, 237, 243, 0.08);
--fv-panel: rgba(110, 118, 129, 0.08);
}
.fugue-explorable {
border: 1px solid var(--fv-grid);
border-radius: 8px;
background: var(--fv-panel);
padding: 12px 14px;
margin: 1.4rem 0;
font-size: 0.8rem;
}
.fv-canvas {
display: block;
width: 100%;
border-radius: 6px;
touch-action: pan-y;
}
.fugue-explorable canvas {
touch-action: pan-y;
}
.fv-canvas.fv-touch-none,
.fugue-explorable canvas.fv-touch-none {
touch-action: none;
}
.fv-canvas.fv-grabbing,
.fugue-explorable canvas.fv-grabbing {
cursor: grabbing;
}
.fv-controls {
display: flex;
flex-flow: row wrap;
gap: 10px;
align-items: flex-end;
margin-bottom: 10px;
}
.fv-control {
display: inline-flex;
flex-direction: column;
gap: 3px;
font-size: 0.8rem;
}
.fv-control-label {
text-transform: uppercase;
letter-spacing: 0.08em;
opacity: 0.65;
font-size: 0.68rem;
}
.fv-control-value {
font-family: var(--mono-font, "Source Code Pro", monospace);
font-variant-numeric: tabular-nums;
opacity: 0.9;
}
.fv-range {
-webkit-appearance: none;
appearance: none;
width: 140px;
height: 26px;
background: transparent;
cursor: pointer;
}
.fv-range::-webkit-slider-runnable-track {
height: 3px;
border-radius: 999px;
background: color-mix(in srgb, var(--fv-ink) 18%, transparent);
}
.fv-range::-webkit-slider-thumb {
-webkit-appearance: none;
width: 14px;
height: 14px;
margin-top: -5.5px;
border: none;
border-radius: 50%;
background: var(--fv-prior);
transition: box-shadow 120ms ease;
}
.fv-range:hover::-webkit-slider-thumb,
.fv-range:active::-webkit-slider-thumb {
box-shadow: 0 0 0 5px color-mix(in srgb, var(--fv-prior) 22%, transparent);
}
.fv-range::-moz-range-track {
height: 3px;
border-radius: 999px;
background: color-mix(in srgb, var(--fv-ink) 18%, transparent);
}
.fv-range::-moz-range-progress {
height: 3px;
border-radius: 999px;
background: var(--fv-prior);
}
.fv-range::-moz-range-thumb {
width: 14px;
height: 14px;
border: none;
border-radius: 50%;
background: var(--fv-prior);
transition: box-shadow 120ms ease;
}
.fv-range:hover::-moz-range-thumb,
.fv-range:active::-moz-range-thumb {
box-shadow: 0 0 0 5px color-mix(in srgb, var(--fv-prior) 22%, transparent);
}
.fv-range:focus-visible {
outline: 2px solid var(--fv-prior);
outline-offset: 2px;
}
.fv-toggle {
flex-direction: row;
align-items: center;
gap: 6px;
cursor: pointer;
}
.fv-checkbox {
-webkit-appearance: none;
appearance: none;
width: 15px;
height: 15px;
margin: 0;
border: 1px solid color-mix(in srgb, var(--fv-ink) 35%, transparent);
border-radius: 4px;
background: transparent;
cursor: pointer;
transition: background-color 120ms ease, border-color 120ms ease;
}
.fv-checkbox:hover {
border-color: var(--fv-post);
}
.fv-checkbox:checked {
background: var(--fv-post) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 8'%3E%3Cpath d='M1 4l2.8 2.8L9 1.4' fill='none' stroke='%23081018' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / 9px no-repeat;
border-color: var(--fv-post);
}
html.light .fv-checkbox:checked,
html.rust .fv-checkbox:checked {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 8'%3E%3Cpath d='M1 4l2.8 2.8L9 1.4' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}
.fv-checkbox:focus-visible {
outline: 2px solid var(--fv-post);
outline-offset: 2px;
}
.fv-buttons {
display: inline-flex;
gap: 6px;
align-items: center;
}
.fv-btn {
font-size: 0.75rem;
padding: 4px 10px;
border-radius: 6px;
border: 1px solid var(--fv-grid);
background: transparent;
color: var(--fv-ink);
cursor: pointer;
font-family: inherit;
line-height: 1.4;
transition: border-color 120ms ease, background-color 120ms ease;
}
.fv-btn:hover {
border-color: var(--fv-prior);
background-color: color-mix(in srgb, var(--fv-prior) 10%, transparent);
}
.fv-btn:focus-visible {
outline: 2px solid var(--fv-prior);
outline-offset: 2px;
}
.fv-btn.fv-primary {
background: var(--fv-prior);
border-color: var(--fv-prior);
color: #0d1117;
font-weight: 600;
}
html.light .fv-btn.fv-primary,
html.rust .fv-btn.fv-primary {
color: #ffffff;
}
.fv-readouts {
display: flex;
flex-flow: row wrap;
gap: 16px;
margin-top: 10px;
align-items: baseline;
}
.fv-readout {
display: inline-flex;
flex-direction: column;
gap: 1px;
}
.fv-readout-label {
text-transform: uppercase;
letter-spacing: 0.08em;
opacity: 0.65;
font-size: 0.66rem;
}
.fv-readout-value {
font-family: var(--mono-font, "Source Code Pro", monospace);
font-variant-numeric: tabular-nums;
font-size: 0.95rem;
}
.fv-scrub {
border-bottom: 1px dashed var(--fv-prior);
cursor: ew-resize;
font-family: var(--mono-font, "Source Code Pro", monospace);
font-variant-numeric: tabular-nums;
color: var(--fv-prior);
user-select: none;
-webkit-user-select: none;
padding: 0 1px;
white-space: nowrap;
touch-action: none;
}
.fv-scrub:focus-visible {
outline: 2px solid var(--fv-prior);
outline-offset: 2px;
}
.fv-scrub-active {
color: var(--fv-hot);
border-bottom-color: var(--fv-hot);
}
.fv-c-prior { color: var(--fv-prior); }
.fv-c-data { color: var(--fv-data); }
.fv-c-post { color: var(--fv-post); }
.fv-c-hot { color: var(--fv-hot); }
.fv-c-flow { color: var(--fv-flow); }
.fv-hint {
font-style: italic;
opacity: 0.7;
font-size: 0.78rem;
margin-top: 8px;
}
.fv-hint::before {
content: "try: ";
font-style: normal;
text-transform: uppercase;
letter-spacing: 0.08em;
opacity: 0.7;
font-size: 0.66rem;
}
.fv-instruction {
font-size: 0.72rem;
opacity: 0.6;
margin-top: 4px;
text-align: center;
}
@media (prefers-reduced-motion: reduce) {
.fugue-explorable * {
transition: none !important;
animation: none !important;
}
}
.fv-inline {
position: relative;
padding: 8px 10px;
border-radius: 6px;
margin: 1.1rem 0;
}
.fv-inline .fv-canvas {
border-radius: 5px;
}
.fv-glyph {
position: absolute;
top: 6px;
right: 8px;
z-index: 2;
width: 20px;
height: 20px;
padding: 0;
display: flex;
align-items: center;
justify-content: center;
border: none;
background: transparent;
color: var(--fv-ink);
opacity: 0.35;
cursor: pointer;
font-size: 0.72rem;
line-height: 1;
font-family: inherit;
transition: opacity 0.15s ease;
}
.fv-glyph:hover {
opacity: 1;
}
.fv-glyph:focus-visible {
opacity: 1;
outline: 2px solid var(--fv-prior);
outline-offset: 2px;
border-radius: 4px;
}
.fv-caption {
font-style: italic;
opacity: 0.7;
font-size: 0.76rem;
margin-top: 6px;
line-height: 1.4;
}
@media (pointer: coarse) {
.fv-range {
height: 30px;
width: 160px;
}
.fv-range::-webkit-slider-thumb {
width: 18px;
height: 18px;
margin-top: -7.5px;
}
.fv-range::-moz-range-thumb {
width: 18px;
height: 18px;
}
.fv-select {
padding: 7px 30px 7px 12px;
}
.fv-btn {
padding: 8px 14px;
font-size: 0.8rem;
line-height: 1.5;
}
.fv-checkbox {
width: 20px;
height: 20px;
}
.fv-toggle {
gap: 8px;
}
.fv-scrub {
padding: 3px 4px;
}
.fv-glyph {
width: 30px;
height: 30px;
opacity: 0.5;
font-size: 0.85rem;
}
}
@media (max-width: 420px) {
.fugue-explorable {
padding: 10px 10px;
}
.fv-controls {
gap: 8px 12px;
}
.fv-readouts {
gap: 10px 14px;
}
.fv-range {
width: 130px;
}
}
@media (max-width: 340px) {
.fv-control {
flex: 1 1 100%;
}
.fv-range {
width: 100%;
min-width: 0;
}
}
.fv-pg-editors {
margin-bottom: 8px;
}
.fv-pg-editor {
display: block;
width: 100%;
box-sizing: border-box;
margin-top: 8px;
padding: 10px 12px;
font-family: var(--mono-font, monospace);
font-size: 0.82em;
line-height: 1.5;
color: var(--fg);
background: var(--quote-bg, rgba(128, 128, 128, 0.08));
border: 1px solid var(--fv-grid, rgba(128, 128, 128, 0.35));
border-radius: 6px;
resize: vertical;
}
.fv-pg-editor:focus-visible {
outline: 2px solid var(--fv-flow, #b18bf5);
outline-offset: 1px;
}
.fv-pg-feedback {
margin-top: 6px;
font-family: var(--mono-font, monospace);
font-size: 0.75em;
min-height: 1.2em;
}
.fv-pg-feedback.fv-pg-ok { color: var(--fv-post, #56d364); opacity: 0.8; }
.fv-pg-feedback.fv-pg-err { color: var(--fv-hot, #ff7b72); }
.fv-pg-notice {
padding: 14px 16px;
border: 1px dashed var(--fv-grid, rgba(128, 128, 128, 0.4));
border-radius: 8px;
font-size: 0.9em;
opacity: 0.85;
}
.fv-select {
-webkit-appearance: none;
appearance: none;
font: inherit;
font-size: 0.85em;
color: var(--fg);
background-color: var(--bg);
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%238b96ad' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 9px center;
background-size: 10px 6px;
border: 1px solid color-mix(in srgb, var(--fv-ink) 25%, transparent);
border-radius: 7px;
padding: 4px 28px 4px 10px;
cursor: pointer;
transition: border-color 120ms ease;
}
.fv-select:hover {
border-color: var(--fv-prior);
}
.fv-select:focus-visible {
outline: 2px solid var(--fv-prior);
outline-offset: 2px;
}
.fv-pg-badge {
margin-top: 6px;
}