precis / frontend /src /App.css
compendious's picture
Prompt improvement, UI, better engineering, error checking, andmore UI
ef94785
Raw
History Blame Contribute Delete
16.3 kB
.content-layout {
max-width: 860px;
margin: 0 auto;
padding: 0 var(--spacing-3);
box-sizing: border-box;
}
.model-selector-wrap {
display: flex;
justify-content: flex-end;
margin-top: 14px;
}
.logo {
display: flex;
align-items: center;
gap: 24px;
color: var(--color-fg-default);
cursor: default;
user-select: none;
}
.logo-icon {
width: 96px;
height: 96px;
border-radius: 50%;
background-color: #ffffff;
padding: 12px;
box-sizing: border-box;
animation: logo-spin 10s linear infinite;
display: block;
}
@keyframes logo-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.logo-text {
font-size: 96px;
font-weight: 600;
letter-spacing: -0.03em;
color: var(--color-fg-default);
}
/* ─── Model selector ─────────────────────────────────────── */
.model-select {
appearance: none;
background: var(--color-canvas-subtle);
border: 1px solid var(--color-border-default);
border-radius: 6px;
color: var(--color-fg-default);
font-size: 13px;
font-family: inherit;
padding: 5px 26px 5px 10px;
cursor: pointer;
transition: border-color 0.2s, box-shadow 0.2s;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%23666' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 8px center;
}
.model-select:hover { border-color: var(--color-border-default); }
.model-select:focus {
outline: none;
border-color: var(--color-accent-emphasis);
box-shadow: 0 0 0 2px rgba(31, 111, 235, 0.2);
}
.model-select:disabled { opacity: 0.4; cursor: not-allowed; }
.model-select--ready {
border-color: rgba(46, 160, 67, 0.6) !important;
box-shadow: 0 0 0 2px rgba(46, 160, 67, 0.1);
}
.model-select--warming {
border-color: rgba(210, 153, 34, 0.6) !important;
box-shadow: 0 0 0 2px rgba(210, 153, 34, 0.08);
}
/* Hero */
.main {
flex: 1;
padding: var(--spacing-6) 0 var(--spacing-5);
}
/* Hero */
.hero {
margin-bottom: var(--spacing-4);
text-align: left;
}
.hero-logo {
justify-content: flex-start;
}
/* ─── Card ───────────────────────────────────────────────── */
.card-wrap {
background-color: var(--color-canvas-subtle);
border: 1px solid var(--color-border-default);
border-radius: 14px;
overflow: hidden;
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);
}
/* ─── Segmented control ──────────────────────────────────── */
.seg-control {
display: flex;
gap: 6px;
padding: 18px 32px 0;
border-bottom: 1px solid var(--color-border-muted);
}
.seg-btn {
position: relative;
padding: 8px 24px;
font-size: 14px;
font-weight: 500;
color: var(--color-fg-muted);
background: transparent;
border: none;
border-radius: 6px 6px 0 0;
cursor: pointer;
transition: color 0.15s;
margin-bottom: -1px;
border-bottom: 2px solid transparent;
}
.seg-btn:hover {
color: var(--color-fg-default);
}
.seg-btn--active {
color: var(--color-fg-default);
border-bottom-color: var(--color-accent-fg);
}
/* ─── Dropzone ───────────────────────────────────────────── */
/* (styles in index.css for .dropzone base) */
.dropzone-label {
font-size: 11px;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--color-fg-subtle);
background: var(--color-canvas-default);
border: 1px solid var(--color-border-muted);
border-radius: var(--radius-full);
padding: 2px 10px;
pointer-events: none;
user-select: none;
}
.panels {
padding: 32px 32px 0;
}
.panel {
display: none;
}
.panel--active {
display: block;
animation: fadeUp 0.18s ease-out both;
}
@keyframes fadeUp {
from { opacity: 0; transform: translateY(6px); }
to { opacity: 1; transform: translateY(0); }
}
/* ─── Fields ─────────────────────────────────────────────── */
.field {
margin-bottom: var(--spacing-3);
}
.field-label {
display: block;
font-size: 12px;
font-weight: 600;
letter-spacing: 0.04em;
text-transform: uppercase;
color: var(--color-fg-muted);
margin-bottom: 8px;
}
.field-label-hint {
font-weight: 400;
text-transform: none;
letter-spacing: 0;
color: var(--color-fg-subtle);
}
/* ─── Input overrides ────────────────────────────────────── */
.input--lg {
padding: 14px 16px;
font-size: 16px;
border-radius: 8px;
}
/* ─── File chip ──────────────────────────────────────────── */
.file-chip {
display: inline-flex;
align-items: center;
gap: 6px;
margin-top: 10px;
padding: 5px 10px 5px 8px;
background: var(--color-canvas-inset);
border: 1px solid var(--color-border-default);
border-radius: var(--radius-full);
font-size: 13px;
color: var(--color-fg-default);
}
.file-chip svg { color: var(--color-fg-muted); flex-shrink: 0; }
.file-chip__name {
max-width: 260px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.file-chip__size {
color: var(--color-fg-subtle);
font-size: 11px;
flex-shrink: 0;
}
.file-chip__remove {
display: flex;
align-items: center;
padding: 2px;
background: transparent;
border: none;
color: var(--color-fg-subtle);
cursor: pointer;
border-radius: 50%;
transition: color 0.12s, background-color 0.12s;
margin-left: 2px;
}
.file-chip__remove:hover {
color: var(--color-danger-fg);
background-color: rgba(248, 81, 73, 0.12);
}
/* ─── Action row ─────────────────────────────────────────── */
.action-row {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 12px;
padding: 12px 24px;
border-top: 1px solid var(--color-border-muted);
margin-top: var(--spacing-3);
}
.generate-wrapper {
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
}
.btn-generate {
padding: 8px 20px;
font-size: 14px;
border-radius: 8px;
gap: 7px;
}
.action-hint {
font-size: 10px;
color: var(--color-fg-subtle);
margin: 0;
}
.action-hint kbd {
font-family: inherit;
font-size: 9px;
background: var(--color-canvas-inset);
border: 1px solid var(--color-border-muted);
border-radius: 4px;
padding: 0 4px;
color: var(--color-fg-muted);
}
/* ─── Cancel button ──────────────────────────────────────── */
.btn-cancel {
display: inline-flex;
align-items: center;
gap: 5px;
padding: 7px 14px;
font-size: 13px;
font-weight: 500;
border-radius: 8px;
border: 1px solid rgba(248, 81, 73, 0.35);
background-color: rgba(248, 81, 73, 0.07);
color: var(--color-danger-fg);
cursor: pointer;
transition: background-color 0.15s, border-color 0.15s;
}
.btn-cancel:hover {
background-color: rgba(248, 81, 73, 0.14);
border-color: rgba(248, 81, 73, 0.55);
}
/* ─── Loading ────────────────────────────────────────────── */
.loading-spinner {
width: 20px;
height: 20px;
border: 2px solid var(--color-border-default);
border-top-color: var(--color-accent-fg);
border-radius: 50%;
animation: spin 0.7s linear infinite;
flex-shrink: 0;
}
@keyframes spin { to { transform: rotate(360deg); } }
/* ─── Inline result ──────────────────────────────────────── */
.inline-result {
margin: var(--spacing-2) 0 var(--spacing-3);
border-radius: 8px;
font-size: 13px;
line-height: 1.6;
border: 1px solid transparent;
overflow: hidden;
}
.inline-result--error {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 14px;
background-color: rgba(248, 81, 73, 0.07);
border-color: rgba(248, 81, 73, 0.25);
color: var(--color-danger-fg);
}
.inline-result--loading,
.inline-result--streaming {
background-color: var(--color-canvas-inset);
border-color: var(--color-border-muted);
}
.inline-result--streaming {
border-color: rgba(31, 111, 235, 0.35);
}
.inline-result--success {
background-color: rgba(22, 27, 34, 0.6);
border-color: var(--color-border-muted);
border-left: 3px solid var(--color-accent-emphasis);
}
.inline-result__label {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 12px;
font-size: 11px;
font-weight: 600;
letter-spacing: 0.04em;
text-transform: uppercase;
border-bottom: 1px solid var(--color-border-muted);
}
.inline-result--success .inline-result__label {
color: var(--color-accent-fg);
}
.inline-result--streaming .inline-result__label {
color: var(--color-fg-muted);
}
.inline-result__text {
padding: 12px 14px;
font-size: 14px;
line-height: 1.75;
color: var(--color-fg-default);
}
/* ── Prose ──────────────────────────────────────────────── */
.inline-result__text p { margin: 0 0 0.6em; }
.inline-result__text p:last-child { margin-bottom: 0; }
.inline-result__text h1,
.inline-result__text h2,
.inline-result__text h3,
.inline-result__text h4,
.inline-result__text h5,
.inline-result__text h6 {
font-weight: 600;
line-height: 1.3;
margin: 0.9em 0 0.35em;
color: var(--color-fg-default);
}
.inline-result__text h1 { font-size: 1.35em; }
.inline-result__text h2 { font-size: 1.2em; }
.inline-result__text h3 { font-size: 1.08em; }
.inline-result__text h4,
.inline-result__text h5,
.inline-result__text h6 { font-size: 1em; }
.inline-result__text h1:first-child,
.inline-result__text h2:first-child,
.inline-result__text h3:first-child { margin-top: 0; }
.inline-result__text ul,
.inline-result__text ol { margin: 0.4em 0 0.6em; padding-left: 1.5em; }
.inline-result__text ul { list-style-type: disc; }
.inline-result__text ol { list-style-type: decimal; }
.inline-result__text ul ul, .inline-result__text ol ul { list-style-type: circle; }
.inline-result__text ul ol, .inline-result__text ol ol { list-style-type: lower-alpha; }
.inline-result__text ul ul, .inline-result__text ol ul,
.inline-result__text ul ol, .inline-result__text ol ol { margin: 0.15em 0; padding-left: 1.4em; }
.inline-result__text ul ul ul, .inline-result__text ol ul ul { list-style-type: square; }
.inline-result__text li { margin: 0.2em 0; }
.inline-result__text li > p { margin: 0; }
.inline-result__text strong { font-weight: 600; }
.inline-result__text em { font-style: italic; }
.inline-result__text blockquote {
margin: 0.6em 0;
padding: 0.3em 0 0.3em 0.9em;
border-left: 3px solid var(--color-border-default);
color: var(--color-fg-muted);
font-style: italic;
}
.inline-result__text code {
font-family: var(--font-mono);
font-size: 12px;
background-color: var(--color-canvas-inset);
border: 1px solid var(--color-border-muted);
border-radius: 3px;
padding: 0.1em 0.35em;
}
.inline-result__text pre {
background-color: var(--color-canvas-inset);
border: 1px solid var(--color-border-muted);
border-radius: 6px;
padding: 0.75em 1em;
margin: 0.6em 0;
overflow-x: auto;
font-size: 12px;
line-height: 1.6;
}
.inline-result__text pre code { background: none; border: none; padding: 0; font-size: inherit; }
.inline-result__text hr { border: none; border-top: 1px solid var(--color-border-muted); margin: 0.8em 0; }
/* ─── Response badge ─────────────────────────────────────── */
.response-badge {
font-size: 10px;
font-weight: 500;
padding: 1px 7px;
border-radius: var(--radius-full);
background-color: var(--color-canvas-default);
border: 1px solid var(--color-border-muted);
color: var(--color-fg-subtle);
letter-spacing: 0;
text-transform: none;
}
/* ─── Streaming cursor ───────────────────────────────────── */
.streaming-cursor {
display: inline-block;
animation: blink 0.75s step-end infinite;
color: var(--color-accent-fg);
margin-left: 1px;
}
@keyframes blink { 50% { opacity: 0; } }
.streaming-placeholder {
color: var(--color-fg-subtle);
font-style: italic;
font-size: 13px;
}
/* ─── Footer ─────────────────────────────────────────────── */
.footer {
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
padding: var(--spacing-3);
font-size: 12px;
color: var(--color-fg-subtle);
border-top: 1px solid var(--color-border-muted);
}
.footer-sep { opacity: 0.4; }
.footer a {
color: var(--color-fg-subtle);
text-decoration: none;
transition: color 0.12s;
}
.footer a:hover { color: var(--color-fg-muted); }
/* Fade-in */
.fade-in { animation: fadeUp 0.25s ease-out both; }
/* Tooltips (Desktop Only) */
@media (hover: hover) and (min-width: 769px) {
[data-tooltip] {
position: relative;
}
[data-tooltip]::after {
content: attr(data-tooltip);
position: absolute;
bottom: 125%;
left: 50%;
transform: translateX(-50%) translateY(4px);
background-color: #24292f;
color: #ffffff;
font-size: 11px;
font-family: var(--font-family-sans);
font-weight: 500;
padding: 5px 8px;
border-radius: 6px;
border: 1px solid #30363d;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
white-space: nowrap;
opacity: 0;
pointer-events: none;
transition: opacity 0.12s ease, transform 0.12s ease;
z-index: 100;
}
[data-tooltip]::before {
content: "";
position: absolute;
bottom: 115%;
left: 50%;
transform: translateX(-50%) translateY(4px);
border-width: 5px;
border-style: solid;
border-color: #24292f transparent transparent transparent;
opacity: 0;
pointer-events: none;
transition: opacity 0.12s ease, transform 0.12s ease;
z-index: 100;
}
[data-tooltip]:hover::after,
[data-tooltip]:hover::before {
opacity: 1;
transform: translateX(-50%) translateY(0);
}
/* Align Generate tooltip to the right edge to prevent card overflow clipping */
.btn-generate[data-tooltip]::after {
left: auto;
right: 0;
transform: translateY(4px);
}
.btn-generate[data-tooltip]::before {
left: auto;
right: 20px;
transform: translateY(4px);
}
.btn-generate[data-tooltip]:hover::after,
.btn-generate[data-tooltip]:hover::before {
transform: translateY(0);
}
}
/* Media Queries (Mobile Friendly) */
@media (max-width: 768px) {
.logo {
gap: 16px;
}
.logo-icon {
width: 64px;
height: 64px;
padding: 8px;
}
.logo-text {
font-size: 56px;
}
.seg-control {
padding: 14px 20px 0;
}
.seg-btn {
padding: 8px 16px;
font-size: 13px;
}
.panels {
padding: 24px 20px 0;
}
.action-row {
padding: 16px 20px;
}
.action-hint {
display: none;
}
}
@media (max-width: 480px) {
.logo {
gap: 12px;
}
.logo-icon {
width: 48px;
height: 48px;
padding: 6px;
}
.logo-text {
font-size: 36px;
}
.seg-control {
padding: 12px 12px 0;
justify-content: space-between;
}
.seg-btn {
flex: 1;
text-align: center;
padding: 8px 8px;
}
.panels {
padding: 20px 12px 0;
}
.action-row {
flex-direction: column;
gap: 10px;
padding: 16px 12px;
}
.action-row .btn {
width: 100%;
justify-content: center;
}
.model-selector-wrap {
justify-content: center;
margin-top: 16px;
}
.model-select {
width: 100%;
}
}