/* ============================================================ Word Search — polished stylesheet Plain CSS, no framework. ============================================================ */ :root { /* Paper palette — newsprint */ --paper-bg: #ece4d3; --paper: #f6efde; --paper-2: #fbf6e8; --paper-3: #f0e8d3; /* Ink */ --ink: #1c1a16; --ink-soft: #6b6356; --ink-faint: rgba(28, 26, 22, 0.14); --rule-dashed: rgba(28, 26, 22, 0.32); /* Accent (red ink) */ --accent: #b3321a; --accent-soft: rgba(179, 50, 26, 0.08); /* Type */ --display: 'Playfair Display', 'Times New Roman', serif; --body: 'DM Mono', ui-monospace, Menlo, monospace; --mono: 'DM Mono', ui-monospace, Menlo, monospace; /* Geometry */ --rule: 1.5px solid var(--ink); --rule-2: 1px dashed var(--rule-dashed); --double: 3px double var(--ink); /* Spacing scale */ --s-1: 4px; --s-2: 8px; --s-3: 12px; --s-4: 16px; --s-5: 24px; --s-6: 32px; --s-7: 48px; } * { box-sizing: border-box; } html, body { margin: 0; padding: 0; background: var(--paper-bg); color: var(--ink); font-family: var(--body); font-size: 14px; line-height: 1.5; -webkit-font-smoothing: antialiased; } /* Subtle paper grain — faint speckle */ body { background-image: radial-gradient(rgba(28,26,22,0.025) 1px, transparent 1px), radial-gradient(rgba(28,26,22,0.018) 1px, transparent 1px); background-size: 3px 3px, 7px 7px; background-position: 0 0, 1px 2px; } /* ---------- Typography ---------- */ h1, h2, h3 { font-family: var(--display); font-weight: 900; letter-spacing: -0.01em; margin: 0; } h1 { font-size: 30px; line-height: 1.05; } h2 { font-size: 26px; line-height: 1.1; } h3 { font-size: 18px; font-weight: 800; line-height: 1.2; } a { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; } a:hover { text-decoration-thickness: 2px; } .eyebrow { font-family: var(--mono); font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-soft); } .muted { color: var(--ink-soft); } .mono { font-family: var(--mono); } /* ---------- Layout ---------- */ .shell { min-height: 100vh; display: flex; flex-direction: column; } .container { width: 100%; max-width: 1100px; margin: 0 auto; padding: 0 var(--s-6); } main { padding: var(--s-7) 0; flex: 1; } /* ---------- Header (Stamp + Tabs) ---------- */ .site-header { background: var(--paper); border-bottom: var(--rule); position: sticky; top: 0; z-index: 10; } .site-header__inner { max-width: 1100px; margin: 0 auto; padding: var(--s-3) var(--s-6); display: flex; align-items: center; justify-content: space-between; gap: var(--s-4); } .brand { display: flex; align-items: center; gap: var(--s-3); text-decoration: none; color: var(--ink); } .brand__mark { width: 38px; height: 38px; border: 2px solid var(--ink); background: var(--ink); color: var(--paper); display: grid; place-items: center; font-family: var(--display); font-weight: 900; font-size: 22px; flex: 0 0 auto; } .brand__name { display: block; font-family: var(--display); font-weight: 800; font-size: 19px; line-height: 1; } .brand__tagline { display: block; font-family: var(--mono); font-size: 10px; color: var(--ink-soft); letter-spacing: 0.08em; margin-top: 3px; } .tabs { display: flex; gap: 0; font-family: var(--mono); font-size: 13px; } .tabs a { padding: 8px 18px; border: var(--rule); color: var(--ink); background: var(--paper); text-decoration: none; font-weight: 500; } .tabs a + a { border-left: none; } .tabs a:hover { background: var(--paper-3); } .tabs a[aria-current="page"] { background: var(--ink); color: var(--paper); } /* ---------- Page heading ---------- */ .page-head { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--s-4); flex-wrap: wrap; margin-bottom: var(--s-4); } .page-head__title h1 { margin-top: 4px; } .page-head__meta { font-family: var(--mono); font-size: 11px; color: var(--ink-soft); } .section-rule { border: 0; border-top: var(--double); margin: 0 0 var(--s-6); } /* ---------- Cards / panels ---------- */ .panel { background: var(--paper); border: var(--rule); padding: var(--s-5); } .panel--inset { background: var(--paper-2); } /* ---------- Notices (errors / warnings) ---------- */ .notice { background: var(--paper); border: var(--rule); border-left: 4px solid var(--accent); padding: var(--s-3) var(--s-4); margin-bottom: var(--s-4); font-family: var(--mono); font-size: 13px; } .notice strong { display: block; font-family: var(--mono); font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-soft); margin-bottom: 4px; } .notice ul { margin: 0; padding-left: 18px; } .notice--warn { border-left-color: #c08a00; } /* ---------- Form controls ---------- */ .form-grid { display: grid; gap: var(--s-4); } .field { display: block; } .field__label { display: block; font-family: var(--mono); font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-soft); margin-bottom: 6px; font-weight: 500; } .field__hint { display: block; font-family: var(--mono); font-size: 11px; color: var(--ink-soft); margin-top: 6px; } input[type="text"], input[type="number"], input[type="email"], select, textarea { width: 100%; border: var(--rule); background: var(--paper-2); color: var(--ink); padding: 10px 12px; font-family: var(--mono); font-size: 14px; line-height: 1.4; border-radius: 0; appearance: none; -webkit-appearance: none; outline: none; transition: background 0.12s, box-shadow 0.12s; } input[type="text"]:focus, input[type="number"]:focus, select:focus, textarea:focus { background: var(--paper); box-shadow: 0 0 0 3px var(--ink); outline-offset: 2px; } input[readonly] { background: var(--paper-3); cursor: not-allowed; } textarea { min-height: 240px; resize: vertical; line-height: 1.7; } select { background-image: url("data:image/svg+xml;utf8,"); background-repeat: no-repeat; background-position: right 14px center; background-size: 10px; padding-right: 36px; cursor: pointer; } .row { display: flex; gap: var(--s-3); } .row > * { flex: 1; min-width: 0; } /* Checkboxes — custom square ink boxes */ .check { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; font-family: var(--mono); font-size: 13px; user-select: none; } .check input { appearance: none; -webkit-appearance: none; width: 16px; height: 16px; border: 1.5px solid var(--ink); background: var(--paper-2); display: inline-block; position: relative; cursor: pointer; margin: 0; flex: 0 0 auto; } .check input:checked { background: var(--ink); } .check input:checked::after { content: "✓"; position: absolute; inset: 0; color: var(--paper); font-size: 12px; font-family: var(--display); font-weight: 900; line-height: 14px; text-align: center; } .check input:disabled { cursor: not-allowed; opacity: 0.55; } .check input:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; } .check--locked { opacity: 0.7; } .check--locked .lock { font-family: var(--mono); font-size: 10px; color: var(--ink-soft); letter-spacing: 0.08em; margin-left: auto; } /* ---------- Buttons ---------- */ .btn { display: inline-flex; align-items: center; gap: 8px; padding: 10px 18px; font-family: var(--mono); font-size: 13px; font-weight: 600; letter-spacing: 0.02em; border: var(--rule); background: var(--ink); color: var(--paper); cursor: pointer; text-decoration: none; transition: transform 0.05s ease, background 0.12s; } .btn:hover { background: #000; } .btn:active { transform: translateY(1px); } .btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } .btn--ghost { background: var(--paper); color: var(--ink); } .btn--ghost:hover { background: var(--paper-3); } .btn--danger { background: var(--paper); color: var(--accent); border-color: var(--accent); } .btn--danger:hover { background: var(--accent); color: var(--paper); } .btn--sm { padding: 6px 12px; font-size: 12px; } /* Inline link-style action (for table rows) */ .row-actions { display: inline-flex; gap: 14px; font-family: var(--mono); font-size: 12px; } .row-actions a, .row-actions button { color: var(--ink); background: none; border: none; padding: 0; font: inherit; cursor: pointer; text-decoration: underline; text-underline-offset: 2px; } .row-actions a.del, .row-actions button.del { color: var(--accent); } .row-actions form { display: inline; margin: 0; } /* ---------- Tables (Themes ledger) ---------- */ .ledger { width: 100%; border-collapse: collapse; font-family: var(--mono); font-size: 13px; } .ledger thead th { text-align: left; font-family: var(--mono); font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-soft); font-weight: 600; padding: 12px 10px; border-bottom: 1.5px solid var(--ink); background: var(--paper-2); } .ledger tbody tr { border-bottom: var(--rule-2); transition: background 0.1s; } .ledger tbody tr:hover { background: var(--paper-2); } .ledger tbody td { padding: 14px 10px; vertical-align: middle; } .ledger .col-name { font-family: var(--display); font-size: 16px; font-weight: 700; } .ledger .col-slug { color: var(--ink-soft); } .ledger .col-words, .ledger .col-num { text-align: right; font-feature-settings: "tnum" 1; } .ledger .col-actions { text-align: right; width: 1%; white-space: nowrap; } /* ---------- Studio (Generate puzzle) split layout ---------- */ .studio { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr); gap: var(--s-6); align-items: start; } @media (max-width: 880px) { .studio { grid-template-columns: 1fr; } } .fieldset { border: var(--rule); background: var(--paper); padding: var(--s-4) var(--s-5) var(--s-5); margin: 0; } .fieldset > legend { font-family: var(--mono); font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-soft); padding: 0 8px; background: var(--paper-bg); margin-left: -4px; } .directions-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px var(--s-4); } .fieldset__divider { margin-top: 14px; padding-top: 12px; border-top: 1px dashed var(--ink-faint); } .button-row { display: flex; gap: 10px; margin-top: 4px; } .preview-card { background: var(--paper); border: var(--rule); padding: var(--s-4); position: sticky; top: 96px; } .preview-card__head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: var(--s-3); padding-bottom: var(--s-3); border-bottom: var(--rule-2); } .preview-card__title { font-family: var(--display); font-weight: 800; font-size: 16px; } /* Word search grid (decorative on Generate, real on Result) */ .ws-grid { display: grid; gap: 1px; background: var(--ink); border: 1.5px solid var(--ink); aspect-ratio: 1 / 1; } .ws-grid > span { background: var(--paper-2); display: grid; place-items: center; font-family: var(--mono); font-weight: 700; font-size: clamp(10px, 1.4vw, 14px); color: var(--ink); } .ws-words { margin-top: var(--s-3); display: flex; flex-wrap: wrap; gap: 4px 10px; font-family: var(--mono); font-size: 11px; color: var(--ink-soft); } .ws-words b { color: var(--ink); font-weight: 600; } .ws-words .sep { color: var(--ink-faint); } /* ---------- Result page ---------- */ .result-grid { margin: 0 auto; max-width: 640px; } .result-grid .ws-grid > span { font-size: clamp(11px, 1.6vw, 18px); } .word-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr)); gap: 4px 16px; list-style: none; padding: 0; margin: var(--s-4) 0 0; font-family: var(--mono); font-size: 13px; } .word-list li b { font-weight: 600; } .word-list li .pref { color: var(--ink-soft); margin-left: 4px; font-size: 11px; } /* ---------- Edit theme workbench ---------- */ .crumbs { font-family: var(--mono); font-size: 12px; color: var(--ink-soft); margin-bottom: 4px; } .crumbs a { color: var(--ink-soft); text-decoration: none; } .crumbs a:hover { color: var(--ink); } .crumbs .sep { margin: 0 6px; } .crumbs .here { color: var(--ink); } .workbench { display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr); gap: var(--s-5); } @media (max-width: 880px) { .workbench { grid-template-columns: 1fr; } } .preview-list { font-family: var(--mono); font-size: 13px; line-height: 1.85; max-height: 22rem; overflow: auto; } .preview-list .row { display: flex; justify-content: space-between; gap: 12px; padding: 2px 0; border-bottom: 1px dashed var(--ink-faint); } .preview-list .src { color: var(--ink-soft); } .preview-list .dst { color: var(--ink); font-weight: 600; } .preview-list .row.skipped .dst { color: var(--accent); font-weight: 500; font-style: italic; } .stat-row { display: flex; justify-content: space-between; font-family: var(--mono); font-size: 11px; color: var(--ink-soft); margin-top: var(--s-3); padding-top: var(--s-3); border-top: 1px dashed var(--ink-faint); } .bottom-bar { display: flex; align-items: center; gap: var(--s-3); margin-top: var(--s-5); padding-top: var(--s-4); border-top: var(--rule-2); } .bottom-bar .spacer { flex: 1; } .bottom-bar form { display: inline; margin: 0; } /* ---------- Footer ---------- */ .site-footer { border-top: var(--double); padding: var(--s-4) 0; font-family: var(--mono); font-size: 11px; color: var(--ink-soft); text-align: center; letter-spacing: 0.08em; }