Loading files
/* Pattern Atlas — lives in the community's dark room, so everything here
speaks --pfc-* tokens (see globals.css). Radius 0, hairline borders, and
the orange reserved for live signals: the pulsing "탐사중" ring, the
critical-knob box, and the one CTA. */
.atlas {
display: flex;
flex-direction: column;
flex: 1;
min-height: 0;
padding-bottom: 24px;
}
.toolbar {
display: flex;
align-items: center;
gap: 12px;
padding: 14px 0;
}
.tagline {
font-size: 13px;
color: var(--pfc-ink-muted);
margin: 0;
}
.toolbarSpacer {
flex: 1;
}
.toolBtn {
background: transparent;
color: var(--pfc-ink-muted);
border: 1px solid var(--pfc-hair);
font-family: var(--pf-mono, monospace);
font-size: 10px;
letter-spacing: 0.1em;
text-transform: uppercase;
padding: 7px 12px;
cursor: pointer;
border-radius: 0;
}
.toolBtn:hover {
color: var(--pfc-ink);
border-color: var(--pfc-edge);
}
.toolBtn[data-on="true"] {
color: var(--pfc-led);
border-color: var(--pfc-led-edge);
background: var(--pfc-led-wash);
}
.body {
display: flex;
flex: 1;
min-height: 540px;
height: calc(100vh - 230px);
border: 1px solid var(--pfc-hair);
}
.mapWrap {
flex: 1;
position: relative;
min-width: 0;
background: var(--pfc-well);
}
.map {
width: 100%;
height: 100%;
display: block;
cursor: default;
}
/* ── filter chips ── */
.chips {
position: absolute;
top: 12px;
left: 16px;
display: flex;
z-index: 1;
}
.chip {
composes: toolBtn;
border-right-width: 0;
padding: 5px 10px;
}
.chip:last-child {
border-right-width: 1px;
}
.chip[data-on="true"] {
color: var(--pfc-ink);
background: var(--pfc-well-2);
border-color: var(--pfc-edge);
}
/* ── map furniture ── */
.frame {
stroke: var(--pfc-hair);
}
.grid line {
stroke: rgba(244, 239, 230, 0.045);
}
.axis {
fill: var(--pfc-ink-faint);
font-family: var(--pf-mono, monospace);
font-size: 10px;
letter-spacing: 0.22em;
}
.famLabel {
font-family: var(--pf-mono, monospace);
font-size: 10px;
letter-spacing: 0.18em;
font-weight: 500;
opacity: 0.55;
}
.zoomHint {
color: var(--pfc-ink-faint);
font-family: var(--pf-mono, monospace);
font-size: 10px;
letter-spacing: 0.06em;
margin-left: 10px;
}
.mapWrap[data-placing="true"] .map {
cursor: crosshair;
}
/* ── "Add my pattern" picker ── */
.pickerWrap {
position: relative;
display: inline-flex;
}
.picker {
position: absolute;
right: 0;
top: calc(100% + 6px);
z-index: 6;
width: 396px;
max-height: 420px;
overflow-y: auto;
background: var(--pfc-panel);
border: 1px solid var(--pfc-edge);
padding: 4px;
}
/* You recognise your own work by looking at it — the picker is a contact
sheet of thumbnails, newest first, not a list of titles. */
.pickerGrid {
display: grid;
grid-template-columns: repeat(6, 1fr);
gap: 8px;
padding: 2px 4px 6px;
}
.pickerItem {
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
background: none;
border: none;
padding: 0;
cursor: pointer;
}
.pickerTile {
position: relative;
display: block;
width: 100%;
aspect-ratio: 1 / 2;
border: 1px solid var(--pfc-hair);
background: var(--pfc-well);
overflow: hidden;
}
.pickerItem:hover .pickerTile {
border-color: var(--pfc-led);
}
.pickerCaption {
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-family: var(--pf-mono, monospace);
font-size: 8.5px;
color: var(--pfc-ink-muted);
}
.pickerItem:hover .pickerCaption {
color: var(--pfc-ink);
}
/* Private patterns in the picker can only become research notes — the tag
says where the drop will land before anything is dropped. */
.researchTag {
color: var(--pfc-led, #e8552e);
opacity: 0.85;
}
.pickerHead {
font-family: var(--pf-mono, monospace);
font-size: 9.5px;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--pfc-ink-faint);
padding: 6px 10px 8px;
}
.pickerSearch {
width: calc(100% - 8px);
margin: 0 4px 6px;
background: var(--pfc-well);
border: 1px solid var(--pfc-hair);
border-radius: 0;
color: var(--pfc-ink);
font-family: var(--pf-sans, sans-serif);
font-size: 12px;
padding: 6px 8px;
}
.pickerSearch:focus {
outline: none;
border-color: var(--pfc-edge);
}
.placeBanner {
position: absolute;
top: 12px;
left: 50%;
transform: translateX(-50%);
z-index: 2;
display: flex;
align-items: center;
gap: 10px;
padding: 8px 12px;
background: var(--pfc-led-wash);
border: 1px solid var(--pfc-led-edge);
color: var(--pfc-led);
font-size: 12.5px;
white-space: nowrap;
}
.bannerLink {
color: var(--pfc-ink);
}
/* ── pattern pins: live tiles on the map ── */
.pin {
width: 44px;
display: flex;
flex-direction: column;
align-items: center;
gap: 3px;
cursor: pointer;
}
.pin[data-draggable="true"] {
cursor: grab;
}
.pinTile {
position: relative;
width: 44px;
height: 88px;
border: 1px solid var(--pfc-edge);
background: var(--pfc-well);
overflow: hidden;
}
.pin[data-selected="true"] .pinTile {
border-color: var(--pfc-ink);
box-shadow: 0 0 8px rgba(244, 239, 230, 0.25);
}
.pinWell {
position: absolute;
inset: 0;
}
.pinCaption {
max-width: 44px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-family: var(--pf-mono, monospace);
font-size: 8px;
letter-spacing: 0.04em;
color: var(--pfc-ink-muted);
}
/* ── pin panel ── */
.panelCanvas {
margin: 6px 0 14px;
}
.panelWell {
position: relative;
width: 140px;
height: 280px;
border: 1px solid var(--pfc-hair);
background: var(--pfc-well);
overflow: hidden;
}
.openLink {
display: inline-block;
margin-top: 4px;
font-size: 13px;
color: var(--pfc-ink);
text-decoration: none;
border-bottom: 1px solid var(--pfc-edge);
padding-bottom: 1px;
}
.openLink:hover {
border-bottom-color: var(--pfc-led);
color: var(--pfc-led);
}
.moveHint {
margin: 14px 0 8px;
font-size: 12px;
color: var(--pfc-ink-faint);
}
.removeBtn {
composes: toolBtn;
color: var(--pfc-danger);
border-color: rgba(232, 107, 94, 0.4);
}
.removeBtn:hover {
color: var(--pfc-danger);
border-color: var(--pfc-danger);
}
.legendTile {
width: 8px;
height: 16px;
border: 1px solid var(--pfc-edge);
background: var(--pfc-well);
flex: 0 0 auto;
}
/* ── lineage: made-from chip / owner select ── */
.fromChip {
composes: toolBtn;
text-transform: none;
letter-spacing: 0.02em;
font-size: 12px;
color: var(--pfc-ink);
}
.fromSelect {
width: 100%;
background: var(--pfc-well);
color: var(--pfc-ink);
border: 1px solid var(--pfc-hair);
border-radius: 0;
font-family: var(--pf-sans, sans-serif);
font-size: 12.5px;
padding: 7px 8px;
}
/* ── the player: sandboxed live run + knobs ── */
.playerWell {
position: relative;
width: 150px;
height: 300px;
border: 1px solid var(--pfc-hair);
background: var(--pfc-well);
overflow: hidden;
}
.knobRow {
display: grid;
grid-template-columns: 74px 1fr 44px;
align-items: center;
gap: 8px;
margin: 7px 0;
}
.knobLabel {
font-family: var(--pf-mono, monospace);
font-size: 10px;
letter-spacing: 0.06em;
color: var(--pfc-ink-2);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.knobVal {
font-family: var(--pf-mono, monospace);
font-size: 10px;
color: var(--pfc-ink-muted);
text-align: right;
}
.knobInput {
width: 100%;
accent-color: var(--pfc-led);
background: transparent;
}
/* ── linked-pattern minis in the entry panel ── */
.miniRow {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.miniItem {
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
width: 56px;
background: none;
border: none;
padding: 0;
cursor: pointer;
}
.miniTile {
position: relative;
display: block;
width: 40px;
height: 80px;
border: 1px solid var(--pfc-hair);
background: var(--pfc-well);
overflow: hidden;
}
.miniItem:hover .miniTile {
border-color: var(--pfc-edge);
}
.miniCaption {
max-width: 56px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-family: var(--pf-mono, monospace);
font-size: 9px;
color: var(--pfc-ink-muted);
}
/* ── nodes ── */
.node {
cursor: pointer;
outline: none;
}
.core {
transition: r 0.12s;
}
.node:hover .core {
r: 8;
}
.node[data-selected="true"] .core {
stroke: var(--pfc-ink);
stroke-width: 1.5;
}
.nodeLabel {
fill: var(--pfc-ink-muted);
font-size: 10.5px;
pointer-events: none;
}
@keyframes pulse {
0%, 100% { opacity: 0.2; r: 9; }
50% { opacity: 0.8; r: 13; }
}
.pulseRing {
animation: pulse 2.2s ease-in-out infinite;
}
/* ── side panel ── */
.panel {
flex: 0 0 400px;
border-left: 1px solid var(--pfc-hair);
background: var(--pfc-panel);
overflow-y: auto;
padding: 20px 20px 32px;
}
.panelTitle {
font-size: 17px;
font-weight: 700;
margin: 2px 0 3px;
}
.panelEn {
color: var(--pfc-ink-faint);
font-family: var(--pf-mono, monospace);
font-size: 10px;
letter-spacing: 0.14em;
text-transform: uppercase;
margin-bottom: 12px;
}
.badges {
display: flex;
gap: 6px;
margin-bottom: 14px;
flex-wrap: wrap;
}
.badge {
font-family: var(--pf-mono, monospace);
font-size: 10px;
letter-spacing: 0.08em;
text-transform: uppercase;
padding: 3px 8px;
border: 1px solid var(--pfc-hair);
color: var(--pfc-ink-muted);
}
.badge[data-live="true"] {
color: var(--pfc-led);
border-color: var(--pfc-led-edge);
}
.badgeFam {
composes: badge;
border-color: transparent;
color: var(--pfc-on-led);
font-weight: 700;
}
.sec {
margin: 14px 0;
}
.secK {
font-family: var(--pf-mono, monospace);
font-size: 10px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--pfc-ink-faint);
margin-bottom: 5px;
}
.secV {
font-size: 13px;
line-height: 1.6;
color: var(--pfc-ink-2);
}
.knobBox {
border: 1px solid var(--pfc-led-edge);
background: var(--pfc-led-wash);
padding: 10px 12px;
font-size: 12.5px;
line-height: 1.55;
color: var(--pfc-led);
}
.riskBox {
color: var(--pfc-danger);
font-size: 12.5px;
line-height: 1.55;
}
.implBox {
font-family: var(--pf-mono, monospace);
font-size: 11.5px;
color: var(--pfc-ink-2);
}
.prompt {
font-family: var(--pf-mono, monospace);
font-size: 10.5px;
line-height: 1.55;
color: var(--pfc-ink-2);
background: var(--pfc-well);
border: 1px solid var(--pfc-hair);
padding: 12px;
white-space: pre-wrap;
max-height: 230px;
overflow-y: auto;
margin: 6px 0 0;
}
.copyBtn {
margin-top: 10px;
width: 100%;
padding: 10px;
font-size: 11px;
font-family: var(--pf-mono, monospace);
letter-spacing: 0.08em;
text-transform: uppercase;
font-weight: 600;
background: var(--pfc-led);
border: 1px solid var(--pfc-led);
color: var(--pfc-on-led);
cursor: pointer;
border-radius: 0;
}
.copyBtn:hover {
background: #f16c47;
border-color: #f16c47;
}
.copyBtn[data-done="true"] {
background: transparent;
color: var(--pfc-led);
border-color: var(--pfc-led-edge);
}
/* ── intro / legend ── */
.howto {
font-size: 13px;
line-height: 1.8;
color: var(--pfc-ink-muted);
}
.howto p {
margin: 0;
}
.howto b {
color: var(--pfc-ink);
font-weight: 600;
}
.hr {
border: none;
border-top: 1px solid var(--pfc-hair);
margin: 14px 0;
}
.legendRow {
display: flex;
align-items: center;
gap: 9px;
font-size: 12.5px;
color: var(--pfc-ink-muted);
margin: 6px 0;
}
.legendDot {
width: 10px;
height: 10px;
border-radius: 50%;
flex: 0 0 auto;
}
.legendDot[data-status="verified"] {
background: #5ad7ff;
box-shadow: 0 0 6px #5ad7ff;
}
.legendDot[data-status="active"] {
background: #7ea4ff;
outline: 2px solid rgba(232, 85, 46, 0.4);
outline-offset: 2px;
}
.legendDot[data-status="hold"] {
background: rgba(90, 215, 255, 0.6);
}
.legendDot[data-status="unexplored"] {
background: transparent;
border: 1.5px dashed rgba(90, 215, 255, 0.53);
}
.legendDot[data-status="invented"] {
background: rgba(216, 210, 196, 0.25);
border: 1.5px dotted #d8d2c4;
box-shadow: 0 0 5px rgba(216, 210, 196, 0.5);
}
/* ── narrow screens: stack map over panel ── */
@media (max-width: 900px) {
.body {
flex-direction: column;
height: auto;
}
.mapWrap {
height: 60vh;
min-height: 380px;
}
.panel {
flex: none;
border-left: none;
border-top: 1px solid var(--pfc-hair);
max-height: none;
}
}
e5b871ed5This file is pinned to the selected release. Download the original to open it in your design tool.