@layer reset, base, components, pages; @layer reset { *, *::before, *::after { box-sizing: border-box; } html { height: 100%; color-scheme: light dark; } body { height: 100%; } body { margin: 0; } img { max-width: 100%; height: auto; display: block; } textarea, input, select, button { font: inherit; } } @layer base { :root { --bg: #e0e0e0; --fg: #121212; --border-color: #000000; /* Neobrutalist Palette */ --c-primary: #a390e4; /* Purple */ --c-secondary: #90e4c1; /* Mint */ --c-accent: #ffc900; /* Yellow */ --c-danger: #ff6b6b; /* Red */ --c-surface: #ffffff; --border-width: 2px; --border: var(--border-width) solid var(--border-color); --shadow: 4px 4px 0 0 var(--border-color); --shadow-sm: 2px 2px 0 0 var(--border-color); --shadow-hover: 6px 6px 0 0 var(--border-color); --pad-xs: 0.25rem; --pad-sm: 0.5rem; --pad-md: 0.75rem; --pad-lg: 1.5rem; --font-sans: "Space Grotesk", system-ui, -apple-system, sans-serif; --font-mono: "JetBrains Mono", "Courier New", monospace; --checkerboard-color: light-dark(rgb(from #000 r g b / 0.2), rgb(from #fff r g b / 0.2)); } @media (prefers-color-scheme: dark) { :root { /* Gruvbox Dark Palette */ --bg: #1d2021; --fg: #ebdbb2; --border-color: #504945; --c-primary: #d3869b; /* Gruvbox Purple */ --c-secondary: #8ec07c; /* Gruvbox Green */ --c-accent: #fabd2f; /* Gruvbox Yellow */ --c-danger: #fb4934; /* Gruvbox Red */ --c-surface: #282828; } } body { font-family: var(--font-sans); background-color: var(--bg); color: var(--fg); line-height: 1.4; /* Dot pattern background */ background-image: radial-gradient(rgb(from var(--border-color) r g b / 0.5) 1px, transparent 1px); background-size: 20px 20px; } code, pre, textarea, .mono { font-family: var(--font-mono); } h1, h2, h3 { margin: 0; font-weight: 900; letter-spacing: -0.02em; } } @layer components { .wrap { max-width: 50rem; margin: 0 auto; padding: var(--pad-lg); } .card { background: var(--c-surface); border: var(--border); box-shadow: var(--shadow); padding: var(--pad-md); display: grid; gap: var(--pad-md); } .btn, button, a.button { display: inline-flex; align-items: center; justify-content: center; padding: var(--pad-sm) var(--pad-md); --button-accent: var(--c-primary); --button-accent-border: oklch(from var(--button-accent) calc(1.1 - l) c h); background: var(--button-accent); color: oklch(from var(--button-accent) calc(1 - l) c h); border: var(--border-width) solid var(--button-accent-border); box-shadow: 2px 2px 0 0 var(--button-accent-border); font-weight: 800; text-decoration: none; cursor: pointer; transition: all 0.1s; gap: 0.5rem; font-size: 14px; text-transform: uppercase; &:hover { transform: translate(-2px, -2px); box-shadow: var(--shadow); filter: brightness(1.1); } &:active { transform: translate(2px, 2px); box-shadow: 0 0 0 0 var(--border-color); } &[disabled] { opacity: 0.5; cursor: not-allowed; box-shadow: none; transform: none; filter: grayscale(1); } .icon { font-size: 0.9em; line-height: 1; } &.danger { --button-accent: var(--c-danger); --button-accent-border: oklch(from var(--button-accent) calc(1.1 - l) c h); } } /* Variant buttons */ .btn-accent { background: var(--c-accent); } .btn-secondary { background: var(--c-secondary); } .btn-danger { background: var(--c-danger); color: oklch(from var(--c-danger) calc(1.1 - l) c h); } input[type="text"], input[type="file"], textarea, select { width: 100%; padding: var(--pad-sm); border: var(--border); background: var(--c-surface); border-radius: 0; outline: none; font-size: 14px; transition: box-shadow 0.1s; &:focus { box-shadow: var(--shadow-sm); background: var(--c-surface); } } textarea { resize: vertical; } .label { --label-accent: var(--c-accent); --label-accent-border: oklch(from var(--label-accent) calc(1.3 - l) c h); font-weight: 800; /* text-transform: uppercase; */ font-size: 13px; margin-bottom: 0.25rem; display: block; background: var(--label-accent); color: oklch(from var(--label-accent) calc(1.1 - l) c h); display: inline-block; padding: 0.1rem 0.3rem; border: var(--border-width) solid var(--label-accent-border); box-shadow: 2px 2px 0 0 var(--label-accent-border); } .hint { font-size: 13px; font-weight: 500; opacity: 0.7; display: grid; align-content: center; } .error { background: var(--c-danger); color: var(--fg); border: var(--border); padding: var(--pad-sm); font-weight: bold; box-shadow: var(--shadow); white-space: pre-wrap; margin-top: var(--pad-sm); } .field { display: grid; gap: 0.25rem; label { font-size: 14px; font-weight: bold; } } .field-group { display: grid; gap: 0.25rem; } .field-group-title { font-size: 14px; font-weight: bold; margin: 0; text-transform: none; letter-spacing: normal; } .pane-title { font-weight: 800; text-transform: uppercase; font-size: 14px; margin: 0; display: block; background: var(--c-accent); color: oklch(from var(--c-accent) calc(1.1 - l) c h); display: inline-block; padding: 0.1rem 0.3rem; border: var(--border-width) solid oklch(from var(--c-accent) calc(1.2 - l) c h); box-shadow: 2px 2px 0 0 oklch(from var(--c-accent) calc(1.2 - l) c h); } /* Visually hidden but accessible (for native input) */ .sr-only { position: absolute; width: 1px !important; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } /* Dropzone styling (applies to label or div) */ .dropzone { cursor: pointer; position: relative; padding: 2rem; text-align: center; border: 2px dashed var(--border-color); background: var(--bg); transition: all 0.2s; &:hover { background: oklch(from var(--bg) calc(l - 0.05) c h); } &.drag-over { background: var(--c-accent); transform: scale(1.01); } } } @layer pages { /* Index page */ .page-index { display: grid; place-items: center; min-height: 100vh; .wrap { width: 100%; } h1 { background: var(--c-secondary); color: oklch(from var(--c-secondary) calc(1.1 - l) c h); border: var(--border); box-shadow: var(--shadow); padding: var(--pad-sm); text-align: center; margin-bottom: var(--pad-md); font-size: 24px; } p { background: var(--c-surface); border: var(--border); padding: var(--pad-sm); margin-bottom: var(--pad-md); font-size: 14px; font-weight: 500; } .preview { display: none; margin-top: var(--pad-sm); padding: var(--pad-sm); border: var(--border); background: var(--bg); img { border: var(--border); } .meta { margin-top: var(--pad-xs); font-family: var(--font-mono); font-size: 12px; border-top: var(--border); padding-top: var(--pad-xs); } } } /* Edit page */ .page-edit { user-select: none; display: grid; grid-template-rows: auto 1fr; min-height: 100vh; .topbar { display: flex; gap: var(--pad-md); align-items: center; padding: var(--pad-sm) var(--pad-md); border-bottom: var(--border); background: var(--c-surface); z-index: 10; a { text-decoration: none; font-weight: 800; text-transform: uppercase; color: var(--fg); &:hover { text-decoration: underline; } } .label { margin: 0; box-shadow: none; --label-accent: var(--c-secondary); } } .container { display: grid; grid-template-columns: 40% 60%; height: 100%; } .pane { padding: var(--pad-md); overflow-y: auto; display: flex; flex-direction: column; align-items: start; gap: var(--pad-md); height: 100%; &.left { border-right: var(--border); background: var(--c-surface); } &.right { background: var(--bg); } } .edit-form { display: flex; flex-direction: column; gap: var(--pad-md); flex: 1; width: 100%; height: 100%; min-height: 0; .field, .field-group { display: flex; flex-direction: column; gap: 0.25rem; &:has(textarea) { flex: 1; min-height: 0; } } .prompt-row { display: flex; gap: var(--pad-sm); input { flex: 1; } button { white-space: nowrap; } } textarea { flex: 1; font-family: var(--font-mono); font-size: 12px; line-height: 1.5; white-space: pre; border: var(--border); box-shadow: inset 2px 2px 0 0 rgba(0, 0, 0, 0.05); min-height: 20rem; } .actions { display: flex; gap: var(--pad-sm); } } .preview { display: grid; place-items: center; border: var(--border); background: var(--c-surface); background-image: linear-gradient( 45deg, var(--checkerboard-color) 25%, transparent 25%, transparent 75%, var(--checkerboard-color) 75%, var(--checkerboard-color) ), linear-gradient( 45deg, var(--checkerboard-color) 25%, transparent 25%, transparent 75%, var(--checkerboard-color) 75%, var(--checkerboard-color) ); background-size: 12px 12px; background-position: 0 0, 6px 6px; padding: var(--pad-md); overflow: auto; box-shadow: var(--shadow); img { max-width: 100%; } } .downloads { display: flex; flex-wrap: wrap; gap: var(--pad-sm); .button { --button-accent: var(--c-surface); --button-accent-border: var(--border-color); padding: var(--pad-xs) var(--pad-sm); } } @media (max-width: 60rem) { .container { grid-template-columns: 1fr; grid-template-rows: 1fr auto; } .pane.left { border-right: none; border-bottom: var(--border); } .topbar { flex-direction: column; align-items: start; } } } }