232 lines
6.3 KiB
CSS
232 lines
6.3 KiB
CSS
@layer components {
|
|
/* Semantic typography classes - font-size only */
|
|
.typography-markdown {
|
|
font-size: var(--text-markdown);
|
|
}
|
|
|
|
.typography-code {
|
|
font-size: var(--text-code);
|
|
}
|
|
|
|
.typography-ui-header {
|
|
font-size: var(--text-ui-header);
|
|
line-height: round(1.45em, 1px);
|
|
}
|
|
|
|
.typography-ui-label {
|
|
font-size: var(--text-ui-label);
|
|
line-height: round(1.45em, 1px);
|
|
}
|
|
|
|
.typography-meta {
|
|
font-size: var(--text-meta);
|
|
line-height: round(1.45em, 1px);
|
|
}
|
|
|
|
.typography-micro {
|
|
font-size: var(--text-micro);
|
|
line-height: round(1.45em, 1px);
|
|
}
|
|
|
|
/*
|
|
* Settings heading scale (by context):
|
|
* L1 page title → typography-settings-page-title (+ text-muted-foreground)
|
|
* L2 section → typography-settings-section-title (+ text-foreground)
|
|
* L3 group → typography-settings-group-title (+ text-foreground)
|
|
* L4 field label → typography-settings-field-label (+ text-foreground)
|
|
* typography-settings-title remains as L2 alias for older call sites.
|
|
*/
|
|
.typography-settings-page-title {
|
|
font-size: var(--text-settings-page-title);
|
|
font-weight: 600;
|
|
line-height: 1.25;
|
|
letter-spacing: -0.01em;
|
|
}
|
|
|
|
.typography-settings-section-title,
|
|
.typography-settings-title {
|
|
font-size: var(--text-ui-header);
|
|
font-weight: 600;
|
|
line-height: 1.2;
|
|
}
|
|
|
|
.typography-settings-group-title {
|
|
font-size: var(--text-ui-label);
|
|
font-weight: 500;
|
|
line-height: 1.2;
|
|
}
|
|
|
|
.typography-settings-field-label {
|
|
font-size: var(--text-ui-label);
|
|
font-weight: 400;
|
|
line-height: 1.2;
|
|
}
|
|
|
|
.typography-settings-description {
|
|
font-size: var(--text-meta);
|
|
font-weight: 400;
|
|
line-height: 1.5;
|
|
}
|
|
|
|
.typography-settings-link {
|
|
font-size: 0.8125rem; /* 13px */
|
|
font-weight: 500;
|
|
line-height: 1.2;
|
|
color: var(--primary-base);
|
|
transition: color var(--transition-fast, 150ms ease-in-out);
|
|
}
|
|
|
|
.typography-settings-link:hover {
|
|
text-decoration: underline;
|
|
}
|
|
|
|
.chat-column {
|
|
width: min(100%, 48rem);
|
|
margin-inline: auto;
|
|
padding-inline: calc(clamp(0.75rem, 2.5vw, 1rem) * var(--padding-scale, 1));
|
|
}
|
|
|
|
.wide-chat-layout .chat-column {
|
|
width: min(100%, 64rem);
|
|
}
|
|
|
|
.chat-input-column {
|
|
width: min(100%, 48rem);
|
|
margin-inline: auto;
|
|
padding-inline: calc(clamp(0.75rem, 2.5vw, 1rem) * var(--padding-scale, 1));
|
|
}
|
|
|
|
.wide-chat-layout .chat-input-column {
|
|
width: min(100%, 64rem);
|
|
}
|
|
|
|
.chat-message-column {
|
|
width: min(100%, 48rem);
|
|
margin-inline: auto;
|
|
padding-inline: calc(clamp(0.75rem, 2.5vw, 1rem) * var(--padding-scale, 1));
|
|
}
|
|
|
|
.wide-chat-layout .chat-message-column {
|
|
width: min(100%, 64rem);
|
|
}
|
|
|
|
@media (min-width: 1024px) {
|
|
.chat-column {
|
|
padding-inline: calc(clamp(1rem, 2.5vw, 1.5rem) * var(--padding-scale, 1));
|
|
}
|
|
|
|
.chat-input-column {
|
|
padding-inline: calc(clamp(1rem, 2.5vw, 1.5rem) * var(--padding-scale, 1));
|
|
}
|
|
|
|
.chat-message-column {
|
|
padding-inline: calc(clamp(1rem, 2.5vw, 1.5rem) * var(--padding-scale, 1));
|
|
}
|
|
}
|
|
|
|
/* Enhanced focus indicators for small interactive elements */
|
|
.model-favorite-button {
|
|
position: relative;
|
|
transition: transform 0.1s ease;
|
|
}
|
|
|
|
.model-favorite-button:focus-visible {
|
|
outline: 2px solid var(--primary);
|
|
outline-offset: 2px;
|
|
border-radius: 0.25rem;
|
|
}
|
|
|
|
.model-favorite-button:active {
|
|
transform: scale(0.95);
|
|
}
|
|
|
|
/* Heading typography - all use markdown size, differentiated by weight/color */
|
|
|
|
.typography-h1 {
|
|
font-size: var(--text-markdown);
|
|
line-height: var(--h1-line-height);
|
|
letter-spacing: var(--h1-letter-spacing);
|
|
font-weight: var(--h1-font-weight);
|
|
}
|
|
|
|
.typography-h2 {
|
|
font-size: var(--text-markdown);
|
|
line-height: var(--h2-line-height);
|
|
letter-spacing: var(--h2-letter-spacing);
|
|
font-weight: var(--h2-font-weight);
|
|
}
|
|
|
|
.typography-h3 {
|
|
font-size: var(--text-markdown);
|
|
line-height: var(--h3-line-height);
|
|
letter-spacing: var(--h3-letter-spacing);
|
|
font-weight: var(--h3-font-weight);
|
|
}
|
|
|
|
/* UI element typography - mapped to semantic variables */
|
|
.typography-ui-button {
|
|
font-size: var(--text-ui-label);
|
|
line-height: var(--ui-button-line-height);
|
|
letter-spacing: var(--ui-button-letter-spacing);
|
|
font-weight: var(--ui-button-font-weight);
|
|
}
|
|
|
|
.typography-ui-caption {
|
|
font-size: var(--text-micro);
|
|
line-height: var(--ui-caption-line-height);
|
|
letter-spacing: var(--ui-caption-letter-spacing);
|
|
font-weight: var(--ui-caption-font-weight);
|
|
}
|
|
|
|
/* Markdown typography - all use semantic markdown size */
|
|
.typography-markdown-body {
|
|
font-size: var(--text-markdown);
|
|
line-height: var(--markdown-body-line-height);
|
|
letter-spacing: var(--markdown-body-letter-spacing);
|
|
font-weight: var(--markdown-body-font-weight);
|
|
}
|
|
|
|
.typography-markdown-h1 {
|
|
font-size: var(--text-markdown);
|
|
line-height: var(--markdown-h1-line-height);
|
|
letter-spacing: var(--markdown-h1-letter-spacing);
|
|
font-weight: var(--markdown-h1-font-weight);
|
|
}
|
|
|
|
.typography-markdown-h2 {
|
|
font-size: var(--text-markdown);
|
|
line-height: var(--markdown-h2-line-height);
|
|
letter-spacing: var(--markdown-h2-letter-spacing);
|
|
font-weight: var(--markdown-h2-font-weight);
|
|
}
|
|
|
|
.typography-markdown-h3 {
|
|
font-size: var(--text-markdown);
|
|
line-height: var(--markdown-h3-line-height);
|
|
letter-spacing: var(--markdown-h3-letter-spacing);
|
|
font-weight: var(--markdown-h3-font-weight);
|
|
}
|
|
|
|
.typography-markdown-h4 {
|
|
font-size: var(--text-markdown);
|
|
line-height: var(--markdown-h4-line-height);
|
|
letter-spacing: var(--markdown-h4-letter-spacing);
|
|
font-weight: var(--markdown-h4-font-weight);
|
|
}
|
|
}
|
|
|
|
/* Chat message column width — intentionally UNLAYERED so it always wins the
|
|
cascade. The same rule inside `@layer components` above is correct in steady
|
|
state, but a layered rule can be momentarily out-ranked during a heavy style
|
|
recalc (e.g. a large session's virtualized list re-laying-out when the
|
|
background history prepend lands, or a late-loaded CSS chunk re-establishing
|
|
layer order). That dropped the clamp for a frame and flashed message text to
|
|
full width. An unlayered duplicate of just the width keeps it robust. */
|
|
.chat-message-column {
|
|
width: min(100%, 48rem);
|
|
}
|
|
|
|
.wide-chat-layout .chat-message-column {
|
|
width: min(100%, 64rem);
|
|
}
|