@font-face { font-family: 'IosevkaNerdFontMono'; src: url('/fonts/IosevkaNerdFontMono-Regular.woff2') format('woff2'), url('/fonts/IosevkaNerdFontMono-Regular.ttf') format('truetype'); font-weight: 400; font-style: normal; font-display: swap; } @font-face { font-family: 'IosevkaNerdFontMono'; src: url('/fonts/IosevkaNerdFontMono-Bold.woff2') format('woff2'), url('/fonts/IosevkaNerdFontMono-Bold.ttf') format('truetype'); font-weight: 700; font-style: normal; font-display: swap; } @font-face { font-family: 'IosevkaNerdFontMono'; src: url('/fonts/IosevkaNerdFontMono-Italic.woff2') format('woff2'), url('/fonts/IosevkaNerdFontMono-Italic.ttf') format('truetype'); font-weight: 400; font-style: italic; font-display: swap; } :root { --bg: #1a1b26; --bg-secondary: #1f2335; --bg-tertiary: #292e42; --fg: #c0caf5; --fg-muted: #a9b1d6; --fg-subtle: #565f89; --border: #292e42; --link: #7aa2f7; --link-hover: #7dcfff; --green: #9ece6a; --red: #f7768e; --yellow: #e0af68; --orange: #ff9e64; --purple: #bb9af7; --cyan: #7dcfff; --ml-base: #1f2335; --ml-mid: #3b4261; --ml-accent: #7aa2f7; --ml-accent-fg: #1a1b26; --tok-keyword: #bb9af7; --tok-type: #2ac3de; --tok-builtin: #7aa2f7; --tok-number: #ff9e64; --tok-string: #9ece6a; --tok-char: #9ece6a; --tok-comment: #565f89; --tok-preproc: #7dcfff; --tok-op: #89ddff; --tok-punct: #a9b1d6; } .t-kw { color: var(--tok-keyword); } .t-ty { color: var(--tok-type); } .t-bi { color: var(--tok-builtin); } .t-num { color: var(--tok-number); } .t-str { color: var(--tok-string); } .t-chr { color: var(--tok-char); } .t-cmt { color: var(--tok-comment); font-style: italic; } .t-pp { color: var(--tok-preproc); } .t-op { color: var(--tok-op); } .t-pun { color: var(--tok-punct); } .code-block { margin: 1rem 0; border: 1px solid var(--border); border-radius: 4px; overflow: hidden; } .code-lang { padding: 0.25rem 0.75rem; background: var(--bg-tertiary); border-bottom: 1px solid var(--border); color: var(--fg-subtle); font-size: 0.75rem; } pre.code { margin: 0; padding: 0.85rem 1rem; background: var(--bg-secondary); border-radius: 0; overflow-x: auto; line-height: 1.45; tab-size: 4; -moz-tab-size: 4; } pre.code code { background: none; padding: 0; } * { margin: 0; padding: 0; box-sizing: border-box; } html { font-size: 14px; } body { font-family: 'IosevkaNerdFontMono', ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace; background: var(--bg); color: var(--fg); line-height: 1.5; min-height: 100vh; padding-bottom: 2.5rem; } a { color: var(--link); text-decoration: none; } a:hover { color: var(--link-hover); text-decoration: underline; } header { background: var(--bg-secondary); border-bottom: 1px solid var(--border); padding: 1rem 2rem; display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 1rem; } header .logo { font-weight: bold; font-size: 1.1rem; } .nav-right { display: flex; align-items: center; gap: 1.25rem; } .nav-right a { color: var(--fg-muted); } .nav-right a:hover { color: var(--fg); } .inline-form { display: inline; } .link-button { background: none; border: none; color: var(--fg-muted); font: inherit; cursor: pointer; padding: 0; } .link-button:hover { color: var(--fg); text-decoration: underline; } main { max-width: 1100px; margin: 0 auto; padding: 1.5rem 1rem; } footer.modeline { position: fixed; left: 0; right: 0; bottom: 0; z-index: 50; background: var(--bg); border-top: 1px solid var(--border); font-size: 0.9rem; line-height: 1.8; overflow: hidden; } .ml-row { display: flex; align-items: stretch; white-space: nowrap; } .ml-a, .ml-b, .ml-c { padding: 0 0.6rem; } .ml-a { background: var(--ml-accent); color: var(--ml-accent-fg); font-weight: 700; } .ml-b { background: var(--ml-mid); color: var(--fg-muted); } .ml-c { background: var(--ml-base); color: var(--fg-muted); } .ml-fill { flex: 1; background: var(--bg); min-width: 1rem; } .ml-sep::before { display: inline-block; } .ml-fwd::before { content: "\e0b0"; } .ml-bwd::before { content: "\e0b2"; } .sep-a-b { color: var(--ml-accent); background: var(--ml-mid); } .sep-b-c { color: var(--ml-mid); background: var(--ml-base); } .sep-c-bar { color: var(--ml-base); background: var(--bg); } .sep-bar-c { color: var(--ml-base); background: var(--bg); } .sep-c-b { color: var(--ml-mid); background: var(--ml-base); } .sep-b-a { color: var(--ml-accent); background: var(--ml-mid); } h1, h2, h3 { font-weight: 600; margin-bottom: 1rem; } h1 { font-size: 1.5rem; } h2 { font-size: 1.25rem; color: var(--fg-muted); } h3 { font-size: 1.1rem; } .empty { color: var(--fg-muted); padding: 2rem 0; } table { width: 100%; border-collapse: collapse; margin: 1rem 0; } th, td { text-align: left; padding: 0.5rem 0.5rem; border-bottom: 1px solid var(--border); } th { background: var(--bg-secondary); color: var(--fg-muted); font-weight: 600; } tbody tr:hover { background: var(--bg-secondary); } table.thread-list { table-layout: fixed; } table.thread-list th:nth-child(1), table.thread-list td:nth-child(1) { width: 55%; } .thread-list .title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .thread-list .author { color: var(--fg-muted); } .thread-list .replies, .thread-list .activity { color: var(--fg-subtle); white-space: nowrap; } .thread-list .activity { text-align: right; } .breadcrumb { margin-bottom: 1rem; color: var(--fg-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .thread-header { margin-bottom: 1.5rem; padding-bottom: 1rem; border-bottom: 1px solid var(--border); } .thread-header h1 { margin-bottom: 0.25rem; } .thread-meta, .profile-meta { color: var(--fg-subtle); font-size: 0.9rem; } .posts { display: flex; flex-direction: column; gap: 1rem; } .post { background: var(--bg-secondary); border: 1px solid var(--border); border-radius: 4px; } .post-meta { display: flex; align-items: center; gap: 0.75rem; padding: 0.5rem 1rem; background: var(--bg-tertiary); border-bottom: 1px solid var(--border); border-radius: 4px 4px 0 0; font-size: 0.9rem; color: var(--fg-subtle); } .post-author { font-weight: 600; } .post-anchor { margin-left: auto; color: var(--fg-subtle); } .badge { background: var(--bg); border: 1px solid var(--border); border-radius: 3px; padding: 0 0.4rem; font-size: 0.75rem; color: var(--green); } .post-body { padding: 1rem; word-wrap: break-word; overflow-wrap: anywhere; } .post-body > *:first-child { margin-top: 0; } .post-body > *:last-child { margin-bottom: 0; } .post-body p { margin: 0.75rem 0; } .post-body h1, .post-body h2, .post-body h3, .post-body h4 { margin: 1.25rem 0 0.5rem; color: var(--fg); } .post-body h1 { font-size: 1.4rem; border-bottom: 1px solid var(--border); padding-bottom: 0.3rem; } .post-body h2 { font-size: 1.2rem; border-bottom: 1px solid var(--border); padding-bottom: 0.3rem; } .post-body h3 { font-size: 1.05rem; } .post-body ul, .post-body ol { margin: 0.75rem 0; padding-left: 1.75rem; } .post-body li { margin: 0.2rem 0; } .post-body blockquote { border-left: 3px solid var(--border); margin: 0.75rem 0; padding-left: 1rem; color: var(--fg-muted); } .post-body code { background: var(--bg-tertiary); padding: 0.1rem 0.35rem; border-radius: 3px; } .post-body pre.code code { background: none; padding: 0; } .post-body hr { border: none; border-top: 1px solid var(--border); margin: 1.5rem 0; } .post-body table { margin: 0.75rem 0; width: auto; } .post-body img { max-width: 100%; } mark { background: var(--yellow); color: var(--bg); border-radius: 2px; padding: 0 0.1rem; } .post:target { border-color: var(--link); } .reply-form, .stacked-form { display: flex; flex-direction: column; gap: 0.5rem; margin-top: 2rem; } .reply-form h3 { margin-bottom: 0.25rem; } label { color: var(--fg-muted); font-size: 0.9rem; } input[type="text"], input[type="password"], textarea { font-family: inherit; font-size: 1rem; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 4px; padding: 0.6rem 0.75rem; width: 100%; } input:focus, textarea:focus { outline: none; border-color: var(--link); } textarea { resize: vertical; line-height: 1.5; tab-size: 4; -moz-tab-size: 4; } button[type="submit"] { align-self: flex-start; font-family: inherit; font-size: 1rem; background: var(--bg-tertiary); color: var(--fg); border: 1px solid var(--border); border-radius: 4px; padding: 0.5rem 1.25rem; cursor: pointer; margin-top: 0.25rem; } button[type="submit"]:hover { background: var(--border); border-color: var(--fg-subtle); } .login-prompt { margin-top: 2rem; padding: 1rem; background: var(--bg-secondary); border: 1px solid var(--border); border-radius: 4px; color: var(--fg-muted); } .auth-form { max-width: 420px; margin: 2rem auto; } .auth-alt { margin-top: 1.5rem; color: var(--fg-muted); font-size: 0.9rem; } .form-errors { list-style: none; background: rgba(248, 81, 73, 0.1); border: 1px solid var(--red); border-radius: 4px; padding: 0.75rem 1rem; margin-bottom: 1.5rem; color: var(--red); } .form-errors li { margin: 0.2rem 0; } .profile-header { margin-bottom: 1.5rem; padding-bottom: 1rem; border-bottom: 1px solid var(--border); } .profile-header h1 { margin-bottom: 0.25rem; } .pagination { display: flex; justify-content: space-between; align-items: center; margin-top: 2rem; padding-top: 1rem; border-top: 1px solid var(--border); color: var(--fg-subtle); } .search-form { display: flex; gap: 0.5rem; margin-bottom: 1.5rem; } .search-form input { flex: 1; font-family: inherit; font-size: 1rem; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 4px; padding: 0.6rem 0.75rem; } .search-form input:focus { outline: none; border-color: var(--link); } .search-form button { font-family: inherit; background: var(--bg-tertiary); color: var(--fg); border: 1px solid var(--border); border-radius: 4px; padding: 0.6rem 1.25rem; cursor: pointer; } .search-count { color: var(--fg-subtle); margin-bottom: 1rem; } .search-results { list-style: none; } .search-results li { padding: 0.75rem 0; border-bottom: 1px solid var(--border); } .result-title { font-weight: 600; } .result-board { margin-left: 0.6rem; font-size: 0.8rem; color: var(--fg-subtle); } .result-snippet { margin-top: 0.25rem; color: var(--fg-muted); font-size: 0.9rem; } .tele-overlay { display: none; position: fixed; inset: 0; z-index: 100; background: rgba(0, 0, 0, 0.55); padding-top: 8vh; justify-content: center; } .tele-overlay.tele-visible { display: flex; } .tele { width: min(760px, 92vw); height: min(460px, 70vh); display: flex; flex-direction: column; background: var(--bg-secondary); border: 1px solid var(--ml-accent); border-radius: 6px; overflow: hidden; box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5); } .tele-input { font-family: inherit; font-size: 1.05rem; background: var(--bg); color: var(--fg); border: none; border-bottom: 1px solid var(--border); padding: 0.85rem 1rem; outline: none; } .tele-body { flex: 1; display: flex; min-height: 0; } .tele-list { list-style: none; width: 45%; overflow-y: auto; border-right: 1px solid var(--border); } .tele-item { padding: 0.5rem 0.85rem; cursor: pointer; border-left: 2px solid transparent; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .tele-item-title { color: var(--fg); } .tele-item-board { margin-left: 0.5rem; font-size: 0.75rem; color: var(--fg-subtle); } .tele-active { background: var(--bg-tertiary); border-left-color: var(--ml-accent); } .tele-empty { padding: 0.85rem; color: var(--fg-subtle); } .tele-preview { flex: 1; padding: 1rem; overflow-y: auto; } .tele-prev-title { font-weight: 700; margin-bottom: 0.5rem; } .tele-prev-snippet { color: var(--fg-muted); font-size: 0.9rem; line-height: 1.6; } .tele-footer { display: flex; gap: 1.25rem; padding: 0.4rem 1rem; background: var(--ml-base); border-top: 1px solid var(--border); color: var(--fg-subtle); font-size: 0.8rem; } .error { text-align: center; padding: 4rem 2rem; } .error h1 { color: var(--red); } .board-category { margin-bottom: 2.5rem; } .board-category h2 { border-bottom: 1px solid var(--border); padding-bottom: 0.5rem; margin-bottom: 0.5rem; } table.board-list { table-layout: fixed; } .board-list .col-board { width: 50%; } .board-list .col-num { width: 9%; text-align: center; color: var(--fg-subtle); } .board-list .col-last { width: 32%; } .board-list th.col-num { text-align: center; } .board-list td { vertical-align: top; padding: 0.6rem 0.5rem; } .board-name { font-weight: 600; font-size: 1.05rem; } .board-desc { color: var(--fg-muted); font-size: 0.9rem; margin-top: 0.15rem; } .last-title { display: inline-block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: bottom; } .last-meta { color: var(--fg-subtle); font-size: 0.85rem; margin-top: 0.15rem; } .muted { color: var(--fg-subtle); } .board-header { margin-bottom: 1.5rem; padding-bottom: 1rem; border-bottom: 1px solid var(--border); } .board-header h1 { margin-bottom: 0.25rem; } .board-header .board-desc { margin-bottom: 0.75rem; } .button-link { display: inline-block; background: var(--bg-tertiary); color: var(--fg); border: 1px solid var(--border); border-radius: 4px; padding: 0.35rem 1rem; font-size: 0.9rem; } .button-link:hover { background: var(--border); border-color: var(--fg-subtle); text-decoration: none; } .badge { background: var(--bg); border: 1px solid var(--border); border-radius: 3px; padding: 0 0.4rem; font-size: 0.75rem; color: var(--green); vertical-align: middle; } .badge-pin { color: var(--yellow); border-color: var(--yellow); } .badge-lock { color: var(--red); border-color: var(--red); } .role-badge { border-radius: 3px; padding: 0 0.35rem; font-size: 0.7rem; margin-left: 0.35rem; vertical-align: middle; } .role-admin { color: var(--red); border: 1px solid var(--red); } .role-mod { color: var(--green); border: 1px solid var(--green); } .mod-bar { display: flex; align-items: center; gap: 1rem; margin-top: 0.75rem; padding: 0.5rem 0.75rem; background: var(--bg-secondary); border: 1px solid var(--border); border-radius: 4px; font-size: 0.85rem; width: fit-content; } .mod-label { color: var(--fg-subtle); text-transform: uppercase; letter-spacing: 0.05em; font-size: 0.7rem; } .link-button.danger { color: var(--red); } .post-delete { margin-left: 0.5rem; } .preview { margin: 1.5rem 0; border: 1px solid var(--border); border-radius: 4px; background: var(--bg-secondary); } .preview-label { padding: 0.4rem 1rem; background: var(--bg-tertiary); border-bottom: 1px solid var(--border); border-radius: 4px 4px 0 0; color: var(--fg-subtle); text-transform: uppercase; letter-spacing: 0.05em; font-size: 0.7rem; } .preview .post-body { padding: 1rem; } .markup-hint { color: var(--fg-subtle); font-size: 0.8rem; margin-top: -0.1rem; } .markup-hint code { background: var(--bg-tertiary); padding: 0 0.25rem; font-size: 0.85em; } .form-actions { display: flex; gap: 0.75rem; margin-top: 0.25rem; } button.secondary { background: transparent; color: var(--fg-muted); } button.secondary:hover { background: var(--bg-secondary); color: var(--fg); } .role-form { display: flex; gap: 0.5rem; align-items: center; } .role-form select { font-family: inherit; font-size: 0.9rem; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 4px; padding: 0.25rem 0.5rem; } .role-form button { font-family: inherit; font-size: 0.85rem; background: var(--bg-tertiary); color: var(--fg); border: 1px solid var(--border); border-radius: 4px; padding: 0.25rem 0.75rem; cursor: pointer; } .role-form button:hover { background: var(--border); border-color: var(--fg-subtle); } .board-list { width: 100%; border-collapse: collapse; } .board-list th { text-align: left; font-size: 0.85rem; color: var(--fg-subtle); } .board-list td { padding: 0.3rem 0.4rem 0.3rem 0; vertical-align: middle; } .board-list input[type="text"], .board-list input[type="number"] { width: 100%; font-family: inherit; font-size: 0.9rem; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 4px; padding: 0.25rem 0.5rem; } .board-list input.pos { width: 3.5rem; } .board-list input:focus { outline: none; border-color: var(--fg-subtle); } .board-actions { display: flex; gap: 0.5rem; align-items: center; } .board-actions button { font-family: inherit; font-size: 0.85rem; background: var(--bg-tertiary); color: var(--fg); border: 1px solid var(--border); border-radius: 4px; padding: 0.25rem 0.75rem; cursor: pointer; } .board-actions button:hover { background: var(--border); border-color: var(--fg-subtle); } .board-actions button.danger { color: var(--danger, #e06c75); } .board-actions button:disabled { opacity: 0.4; cursor: not-allowed; } .post-tools { display: flex; align-items: center; gap: 0.75rem; margin-top: -0.1rem; } .upload-btn { color: var(--fg-muted); font-size: 0.85rem; border: 1px solid var(--border); border-radius: 4px; padding: 0.2rem 0.6rem; } .upload-btn:hover { color: var(--fg); border-color: var(--fg-subtle); text-decoration: none; } .upload-status { color: var(--red); font-size: 0.8rem; } textarea.drag-over { border-color: var(--ml-accent); background: var(--bg-secondary); } .upload-result { margin-bottom: 1.5rem; padding: 1rem; background: var(--bg-secondary); border: 1px solid var(--border); border-radius: 4px; } .upload-result input { width: 100%; font-family: inherit; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 4px; padding: 0.5rem 0.75rem; margin: 0.5rem 0; } .upload-preview img { max-width: 100%; max-height: 320px; border: 1px solid var(--border); border-radius: 4px; } .vim-toggle { display: flex; align-items: center; gap: 0.4rem; margin-left: auto; color: var(--fg-subtle); font-size: 0.85rem; cursor: pointer; } .vim-toggle input { width: auto; accent-color: var(--ml-accent); } .vim-status { font-size: 0.85rem; color: var(--fg-subtle); margin-top: 0.25rem; min-height: 1.2em; } textarea.vim-on { caret-color: var(--orange); } textarea.vim-normal, textarea.vim-visual { border-color: var(--ml-accent); } textarea.vim-insert { border-color: var(--green); }