/* BUTTONS */ button { color: var(--detail); background: var(--light-background); padding: 6px 12px; border: 1px solid var(--detail); font-family: inherit; cursor: pointer; transition: opacity 0.2s ease; } button:hover { opacity: 0.8; } button.primary, .btn-primary { background: var(--primary-dark); color: var(--primary-light); border: none; padding: 0.5rem 1rem; font-family: inherit; font-size: 0.85rem; cursor: pointer; transition: opacity 0.2s ease; } button.primary:hover, .btn-primary:hover { opacity: 0.8; } button.secondary, .btn-secondary { background: var(--surface-muted); color: var(--detail); border: none; padding: 0.5rem 1rem; font-family: "IBM Plex Mono", monospace; font-size: 0.85rem; cursor: pointer; transition: opacity 0.2s ease; } button.secondary:hover, .btn-secondary:hover { opacity: 0.8; } /* Irreversible actions. The class was in the markup before it was in here (the admin clean-slate button, the chat wipe), rendering as an ordinary button, which is the one thing a destructive control must not look like. */ button.danger { background: var(--danger); color: var(--primary-light); border: none; padding: 0.5rem 1rem; font-family: inherit; font-size: 0.85rem; cursor: pointer; transition: opacity 0.2s ease; } button.danger:hover { opacity: 0.8; } /* FORMS */ form { display: flex; flex-direction: column; gap: 1rem; width: 100%; } .form-container { max-width: 600px; background: var(--light-background); padding: 1.5rem; } label { font-family: "IBM Plex Mono", monospace; color: var(--detail); font-size: 14px; } input[type="text"], input[type="email"], input[type="password"], input[type="number"], textarea, select { width: 100%; background: var(--input-background); border: none; padding: 0.6rem; font-family: "IBM Plex Mono", monospace; font-size: 0.85rem; color: var(--detail); } input::placeholder, textarea::placeholder { opacity: 0.5; } input[type="text"]:focus, input[type="email"]:focus, input[type="password"]:focus, input[type="number"]:focus, textarea:focus, select:focus { outline: none; border: 2px solid var(--highlight); } textarea { min-height: 150px; resize: vertical; } textarea.drag-over { border: 2px dashed var(--highlight); background: var(--surface-muted); } /* Inline form validation error, inserted by mt.js on a 422 submit, replacing the old error toast. Persists next to the form with the input preserved. */ .form-error { background: var(--surface-muted); border-left: 3px solid var(--error); color: var(--error); padding: 0.6rem 0.75rem; margin-bottom: 0.75rem; font-size: 0.85rem; } input[aria-invalid="true"], textarea[aria-invalid="true"], select[aria-invalid="true"] { border: 2px solid var(--error); } select { cursor: pointer; } input[type="submit"], form button { font-family: "Young Serif", serif; font-size: 16px; color: var(--detail); background: var(--light-background); padding: 10px 20px; border: 1px solid var(--detail); cursor: pointer; } input[type="submit"]:hover, form button:hover { background: var(--background); } .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; } .form-group { display: flex; flex-direction: column; gap: 0.25rem; } .form-actions { display: flex; gap: 1rem; margin-top: 0.5rem; } .form-help { display: block; font-size: 0.8rem; color: var(--text-muted); margin-top: 0.25rem; } .input-narrow { width: 6rem; }