@import "tailwindcss"; /* MetalUI's Tailwind theme: its type roles (type-ui, type-label…), inks (text-ink, text-ink2…), materials (material-raised, material-well, material-cap…) and radii, for the parts of the app MetalUI has no component for. The components' own CSS comes from @unlocalhosted/metalui/styles.css (see layout). */ @import "@unlocalhosted/metalui/theme.css"; /* * Soft Hardware: bone (light) and graphite (dark) colorways from MetalUI. The app's older token names * are kept as aliases of MetalUI's so every surface follows the colorway: * sheet / canvas / subtle / inset → surface lo → hi, and the sunk well * fg / muted / dim → ink, ink2, ink3 * line → the engraved rule * Green is intent (focus, selection, live), never a call to action; red is destructive only. * * The colorway follows the system unless overrides it. */ :root { --mu-sans: var(--font-geist), "Geist", -apple-system, BlinkMacSystemFont, system-ui, sans-serif; --mu-mono: var(--font-geist-mono), "Geist Mono", ui-monospace, SFMono-Regular, Menlo, monospace; --mu-pixel: var(--font-doto), "Martian Mono", ui-monospace, monospace; --page: var(--mu-page); --sheet: var(--mu-s); --canvas: var(--mu-s-hi); --canvas-subtle: var(--mu-s-lo); --canvas-inset: var(--mu-well-top); --header: var(--mu-page); --border: var(--mu-rule); --border-muted: color-mix(in srgb, var(--mu-rule) 70%, transparent); --fg: var(--mu-ink); --fg-muted: var(--mu-ink2); --fg-dim: var(--mu-ink3); --accent: var(--mu-ink); --accent-strong: var(--mu-ink); --accent-2: var(--mu-cue-url-ink); --accent-3: var(--mu-ink2); --success-emphasis: #2B7A52; --done: var(--mu-tint-iris); --danger: var(--mu-red); --attention: #9A6A12; --diff-add: rgba(63, 185, 122, .10); --diff-add-num: rgba(63, 185, 122, .18); --diff-del: rgba(216, 69, 59, .08); --diff-del-num: rgba(216, 69, 59, .15); --diff-hunk: rgba(40, 38, 32, .04); } [data-mu-colorway="graphite"] { --page: #19191B; --success-emphasis: var(--mu-green); --attention: var(--mu-warning); --diff-hunk: rgba(255, 255, 255, .04); } @media (prefers-color-scheme: dark) { :root:not([data-mu-colorway="bone"]) { --page: #19191B; --success-emphasis: var(--mu-green); --attention: var(--mu-warning); --diff-hunk: rgba(255, 255, 255, .04); } :root:not([data-mu-colorway="bone"]) .shiki, :root:not([data-mu-colorway="bone"]) .shiki span { color: var(--shiki-dark) !important; background-color: transparent !important; } } [data-mu-colorway="graphite"] .shiki, [data-mu-colorway="graphite"] .shiki span { color: var(--shiki-dark) !important; background-color: transparent !important; } /* Tailwind's `dark:` variant follows the colorway. */ @custom-variant dark { &:where([data-mu-colorway="graphite"], [data-mu-colorway="graphite"] *) { @slot; } @media (prefers-color-scheme: dark) { &:where(:root:not([data-mu-colorway="bone"]), :root:not([data-mu-colorway="bone"]) *) { @slot; } } } /* App aliases. `page`, `green`, `success` and `red` come from MetalUI's theme as they are. */ @theme inline { --color-sheet: var(--sheet); --color-canvas: var(--canvas); --color-subtle: var(--canvas-subtle); --color-inset: var(--canvas-inset); --color-header: var(--header); --color-line: var(--border); --color-line-muted: var(--border-muted); --color-fg: var(--fg); --color-muted: var(--fg-muted); --color-dim: var(--fg-dim); --color-accent: var(--accent); --color-accent-strong: var(--accent-strong); --color-accent-2: var(--accent-2); --color-accent-3: var(--accent-3); --color-success-emphasis: var(--success-emphasis); --color-done: var(--done); --color-danger: var(--danger); --color-attention: var(--attention); --font-sans: var(--mu-sans); --font-mono: var(--mu-mono); --shadow-card: var(--mu-raise-sm); --shadow-lift: var(--mu-raise-lite); --shadow-float: var(--mu-raise); --animate-pop: pop 180ms var(--mu-ease-slide); --animate-fade-up: fade-up 500ms var(--mu-ease-slide) both; } @keyframes pop { from { opacity: 0; transform: translateY(-6px) scale(0.985); } to { opacity: 1; transform: none; } } @keyframes fade-up { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } } body { background: var(--page); color: var(--mu-ink); font-family: var(--mu-sans); } @layer components { /* The engraved label role: uppercase mono with a lip, e.g. "PULL REQUEST · #8" */ .mono-label { font: 400 9.5px/12px var(--mu-mono); text-transform: uppercase; letter-spacing: 0.11em; color: var(--mu-engrave); text-shadow: var(--mu-lip-shadow); } /* A section heading, engraved above its plate: "ABOUT" */ .section-label { font: 400 9.5px/12px var(--mu-mono); text-transform: uppercase; letter-spacing: 0.11em; color: var(--mu-engrave); text-shadow: var(--mu-lip-shadow); } /* A raised plate in the colorway (Surface material="raise-lite"), for server-rendered blocks. */ .plate { background: linear-gradient(var(--mu-s-hi), var(--mu-s)); box-shadow: var(--mu-raise-lite); } /* A sunk well (the field look): inputs, code, quiet insets. */ .well { background: linear-gradient(var(--mu-well-top), var(--mu-well-bot)); box-shadow: var(--mu-well); } /* An engraved hairline with its lip. */ .rule-b { border-bottom: 1px solid var(--mu-rule); box-shadow: 0 1px 0 var(--mu-rule-lip); } .rule-t { border-top: 1px solid var(--mu-rule); box-shadow: inset 0 1px 0 var(--mu-rule-lip); } } ::selection { background: color-mix(in srgb, var(--mu-green) 35%, transparent); } :focus-visible { outline: 2px solid var(--mu-focus); outline-offset: 2px; } /* Menus and dialogs rise in on the surface spring */ details[open] > .menu-panel { animation: var(--animate-pop); } dialog[open] { animation: var(--animate-pop); } dialog::backdrop { background: var(--mu-scrim); backdrop-filter: blur(2px); } /* Code viewer: shiki output with line numbers */ .code-view .shiki { background: transparent !important; padding: 12px 0; overflow-x: auto; font-size: 12.5px; line-height: 21px; counter-reset: line; } .code-view .shiki code { display: block; min-width: max-content; font-family: var(--mu-mono); } .code-view .line { display: inline-block; width: 100%; padding-right: 24px; } .code-view .line:hover { background: var(--mu-menu-row-hover); } .code-view .line::before { counter-increment: line; content: counter(line); display: inline-block; width: 60px; padding-right: 20px; margin-right: 4px; text-align: right; color: var(--mu-syn-line); user-select: none; } .code-view .line:hover::before { color: var(--mu-ink2); } /* Rendered markdown (README, issues) */ .markdown { font-size: 14px; line-height: 1.7; letter-spacing: -0.005em; overflow-wrap: break-word; } .markdown > *:first-child { margin-top: 0; } .markdown > *:last-child { margin-bottom: 0; } .markdown p, .markdown ul, .markdown ol, .markdown blockquote, .markdown pre, .markdown table { margin: 0 0 16px; } .markdown h1, .markdown h2, .markdown h3, .markdown h4, .markdown h5, .markdown h6 { margin: 26px 0 10px; font-weight: 600; line-height: 1.25; letter-spacing: -0.02em; } .markdown h1 { font-size: 1.6em; } .markdown h2 { font-size: 1.3em; } .markdown h3 { font-size: 1.1em; } .markdown h4 { font-size: 1em; } .markdown a { color: inherit; text-decoration: underline; text-decoration-thickness: 1px; text-decoration-color: color-mix(in srgb, currentColor 30%, transparent); text-underline-offset: 3px; transition: text-decoration-color .16s; } .markdown a:hover { text-decoration-color: currentColor; } .markdown ul { list-style: disc; padding-left: 1.6em; } .markdown ol { list-style: decimal; padding-left: 1.6em; } .markdown li::marker { color: var(--mu-ink3); } .markdown li + li { margin-top: .3em; } .markdown li > input[type="checkbox"] { margin-right: .5em; accent-color: var(--mu-green-deep); } .markdown blockquote { padding: .6em 1em; color: var(--mu-ink2); background: linear-gradient(var(--mu-well-top), var(--mu-well-bot)); box-shadow: var(--mu-well); border-radius: 12px; } .markdown code { padding: .15em .45em; font-size: 85%; background: linear-gradient(var(--mu-well-top), var(--mu-well-bot)); box-shadow: var(--mu-well); border-radius: 6px; font-family: var(--mu-mono); } .markdown pre { padding: 14px 16px; overflow: auto; font-size: 85%; line-height: 1.7; background: linear-gradient(var(--mu-well-top), var(--mu-well-bot)); box-shadow: var(--mu-well); border-radius: 14px; } .markdown pre code { padding: 0; background: transparent; box-shadow: none; font-size: 100%; } .markdown table { border-collapse: separate; border-spacing: 0; display: block; overflow: auto; } .markdown th, .markdown td { padding: 9px 14px; border-bottom: 1px solid var(--mu-rule); } .markdown tr:last-child td { border-bottom: 0; } .markdown th { font: 400 9.5px/12px var(--mu-mono); text-transform: uppercase; letter-spacing: 0.11em; color: var(--mu-engrave); text-align: left; } .markdown img { max-width: 100%; display: inline; border-radius: 10px; } .markdown hr { height: 1px; margin: 32px 0; background: var(--mu-rule); border: 0; box-shadow: 0 1px 0 var(--mu-rule-lip); } /* A quiet light from above, behind marketing-style headers */ .aurora { background: radial-gradient(40rem 18rem at 50% -4rem, color-mix(in srgb, var(--mu-s-hi) 90%, transparent), transparent 70%); } /* Hairline grid that fades out towards the edges, like a cutting mat */ .dot-grid { background-image: linear-gradient(to right, color-mix(in srgb, var(--mu-rule) 55%, transparent) 1px, transparent 1px), linear-gradient(to bottom, color-mix(in srgb, var(--mu-rule) 55%, transparent) 1px, transparent 1px); background-size: 48px 48px; mask-image: radial-gradient(ellipse 60% 55% at 50% 0%, black 30%, transparent 75%); } .text-gradient { background: linear-gradient(180deg, var(--mu-ink) 20%, color-mix(in srgb, var(--mu-ink) 50%, transparent) 110%); -webkit-background-clip: text; background-clip: text; color: transparent; } /* A raised plate for highlighted cards */ .ring-gradient { background: linear-gradient(var(--mu-s-hi), var(--mu-s)); box-shadow: var(--mu-raise); } /* A glyph sunk in a well, like the empty state's */ .icon-tile { display: flex; align-items: center; justify-content: center; background: linear-gradient(var(--mu-well-top), var(--mu-well-bot)); box-shadow: var(--mu-well); color: var(--mu-ink3); } /* CodeMirror editor sizing */ .cm-theme, .cm-editor { height: 100%; } .cm-editor { font-size: 12.5px; } .cm-editor .cm-scroller { font-family: var(--mu-mono); line-height: 21px; } .cm-editor.cm-focused { outline: none !important; } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation: none !important; transition: none !important; } }