Loading files
.introCopy {
margin: 0 0 24px;
color: var(--pf-ink-muted);
}
.workspace {
margin: 24px 0 10vh;
container-type: inline-size;
}
/* The mode switch is gone: two of its three cells left the page. */
.unsupported {
margin-top: 10px;
color: var(--pf-cream);
opacity: 0.75;
font-family: var(--pf-mono);
font-size: var(--pf-fs-mono);
line-height: 1.5;
}
.liveEditor {
margin-top: 20px;
margin-bottom: 14px;
border: 1px solid var(--pf-rule);
overflow: hidden;
}
/* One line under the editor instead of four numbered steps: what to do here,
and the single button that belongs to it. */
.editorFoot {
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
gap: 12px;
padding: 12px 14px;
border-top: 1px solid var(--pf-rule);
background: var(--pf-cream);
color: var(--pf-ink-muted);
font-size: var(--pf-fs-body);
line-height: 1.5;
}
.editorFoot span {
flex: 1;
min-width: 220px;
}
.editorFoot button {
flex: none;
min-height: 34px;
display: inline-flex;
align-items: center;
border: 1px solid var(--pf-rule);
background: #FFFFFF;
color: var(--pf-ink);
padding: 0 12px;
font: inherit;
font-size: var(--pf-fs-mono);
font-family: var(--pf-mono);
letter-spacing: var(--pf-track-mono);
text-transform: uppercase;
cursor: pointer;
}
.editorFoot button:hover {
background: var(--pf-ink);
color: var(--pf-cream);
border-color: var(--pf-ink);
}
/* Segmented preset pager: ‹ | numbers | › | 🎲 — same grammar as the mode
switch. Leads the editor box, so its rule sits on the bottom edge. */
.presetBar {
display: grid;
grid-template-columns: 48px 1fr 48px auto auto;
border-bottom: 1px solid var(--pf-rule);
background: var(--pf-cream);
}
.presetBar > * {
min-height: 44px;
display: grid;
place-items: center;
padding: 0 12px;
border: 0;
border-right: 1px solid var(--pf-rule);
background: transparent;
color: var(--pf-ink);
font-family: var(--pf-mono);
font-size: var(--pf-fs-mono);
letter-spacing: var(--pf-track-mono);
text-transform: uppercase;
text-decoration: none;
}
.presetBar > *:last-child {
border-right: 0;
}
.presetBar button,
.presetBar a {
cursor: pointer;
}
.presetBar button:hover,
.presetBar a:hover {
background: var(--pf-ink);
color: var(--pf-cream);
}
.presetBar button[aria-label='Previous preset'],
.presetBar button[aria-label='Next preset'] {
font-size: 18px;
line-height: 1;
}
/* Folded away by default (see showAllPresets) — a wall of 42 numbers was the
loudest thing in the panel and never said which preset was loaded. */
.presetNumbers {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(28px, 1fr));
align-content: center;
padding: 2px;
gap: 0;
border-bottom: 1px solid var(--pf-rule);
background: var(--pf-cream);
}
.presetNumbers button {
min-height: 24px;
display: grid;
place-items: center;
border: 0;
padding: 0;
background: transparent;
color: var(--pf-ink-muted);
font-family: var(--pf-mono);
font-size: 11px;
letter-spacing: 0;
cursor: pointer;
}
.presetNumbers button:hover {
background: var(--pf-ink);
color: var(--pf-cream);
}
.presetNumbers .presetNumActive {
background: var(--pf-ink);
color: var(--pf-cream);
}
/* Which preset is loaded, in words. Index, name, then the live marker.
align-items must be center, not baseline: baseline pins the group to the top
of the 44px cell (the tallest child lands at top:0) while every other cell in
the bar is place-items:center, so the row read as floating. */
.presetNow {
display: flex;
align-items: center;
justify-content: flex-start;
gap: 12px;
overflow: hidden;
}
.presetIndex {
flex: none;
color: var(--pf-ink-muted);
}
/* Hugs its text. As `flex: 1` it stretched to fill the cell, which opened a
dead gap before the live marker and read as a broken bar. This is the answer
to "which preset am I on", so it also takes the row size, not the small one. */
.presetName {
flex: 0 1 auto;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: var(--pf-ink);
text-transform: none;
letter-spacing: var(--pf-track-tight);
font-family: var(--pf-sans);
font-size: var(--pf-fs-row);
}
/* The single accent in this panel. It is a state readout — "the preview is
running this right now" — not decoration. */
.presetLive {
flex: none;
/* Status readout, so it sits at the cell edge rather than trailing the name
by whatever slack happens to be left over. */
margin-left: auto;
display: inline-flex;
align-items: center;
gap: 6px;
color: var(--pf-ink-muted);
font-size: 10px;
}
.presetLive::before {
content: "";
width: 6px;
height: 6px;
background: var(--pf-led);
}
/* ── Two branches ── where the pattern goes, and what to do if you already
have a board. Every exit from this panel is in this one row. */
.branches {
display: grid;
grid-template-columns: 1fr 300px;
gap: 24px;
align-items: start;
margin-top: 20px;
}
.nextSteps {
display: grid;
align-content: start;
}
.nextCard {
display: grid;
grid-template-columns: 32px 1fr;
gap: 2px 12px;
padding: 14px 0;
border-top: 1px solid var(--pf-rule);
color: inherit;
text-decoration: none;
transition: background 120ms ease;
}
.nextCard:hover {
background: var(--pf-cream-2);
}
.nextKicker {
grid-row: span 2;
color: var(--pf-ink-ghost);
font-family: var(--pf-mono);
font-size: var(--pf-fs-mono);
letter-spacing: var(--pf-track-mono);
}
.nextCard h3 {
margin: 0;
font-size: var(--pf-fs-row);
font-weight: 500;
letter-spacing: -0.01em;
}
.nextCard p {
margin: 0;
color: var(--pf-ink-muted);
font-size: var(--pf-fs-row-d);
line-height: 1.5;
}
.advancedNote {
margin: 14px 0 0;
color: var(--pf-ink-muted);
font-size: var(--pf-fs-row-d);
line-height: 1.5;
}
.advancedNote a {
color: var(--pf-ink);
border-bottom: 1px solid var(--pf-ink);
padding-bottom: 1px;
text-decoration: none;
}
/* Solid ink, not accent: this is the panel's one terminal action, and the
style guide reserves the orange for live signals. */
.hardwareBlock {
display: grid;
gap: 10px;
align-content: start;
padding: 18px;
border: 1px solid var(--pf-ink);
background: var(--pf-ink);
color: var(--pf-cream);
}
.hardwareBlock :global(.pf-kicker) {
color: var(--pf-cream);
opacity: 0.65;
}
.hardwareTitle {
font-size: var(--pf-fs-row);
font-weight: 500;
letter-spacing: -0.01em;
}
.flashButton {
min-height: 40px;
width: 100%;
display: inline-flex;
align-items: center;
justify-content: center;
border: 1px solid var(--pf-cream);
background: var(--pf-cream);
color: var(--pf-ink);
padding: 0 16px;
font-family: var(--pf-mono);
font-size: var(--pf-fs-mono);
font-weight: 500;
letter-spacing: var(--pf-track-mono);
text-transform: uppercase;
cursor: pointer;
transition: background 120ms ease, border-color 120ms ease;
}
.flashButton:hover {
background: var(--pf-cream-2);
border-color: var(--pf-cream-2);
}
.hardwareNote {
margin: 0;
color: var(--pf-cream);
opacity: 0.75;
font-size: var(--pf-fs-row-d);
line-height: 1.5;
}
/* Underlined, because these two are the way out of this block and the note
sits on a dark panel where a colour shift alone is easy to miss. */
.hardwareNote a {
color: inherit;
text-decoration: underline;
text-underline-offset: 2px;
}
.hardwareNote a:hover {
color: var(--pf-led);
}
.hardwareReq {
color: var(--pf-cream);
opacity: 0.55;
font-family: var(--pf-mono);
font-size: 10px;
letter-spacing: var(--pf-track-mono);
text-transform: uppercase;
}
.metaRows {
display: grid;
}
.ctaLinks {
display: flex;
flex-wrap: wrap;
gap: 18px;
}
@media (max-width: 720px) {
.workspace {
margin-top: 18px;
}
.editorFoot {
align-items: flex-start;
}
/* One row of exactly MOBILE_PRESET_WINDOW cells (see PatternPanel.tsx) —
the component only renders a window around the active preset here. */
.presetNumbers {
grid-template-columns: repeat(7, 1fr);
}
.presetNumbers button {
min-height: 40px;
}
}
/* The hardware block drops under the exits when the panel gets narrow. */
@container (max-width: 620px) {
.branches {
grid-template-columns: 1fr;
}
}
07e931b46This file is pinned to the selected release. Download the original to open it in your design tool.