9 directories, 58 files

tinai

Home / tinai
@import url('https://fonts.googleapis.com/css2?family=Noto+Emoji:wght@600&display=swap');

/* Core stylesheet: theme variables, SimpleBar management, element defaults
   (body, forms, tables, checkboxes), and syntax-highlighting themes.
   Shared primitives and feature styles live in separate files loaded after
   this one, in cascade order:
   shared.css, layout.css, index-lists.css, conversation.css, dialogs.css,
   settings.css, mermaid.css, overlays.css, instant-answer.css, choices.css,
   document.css, scratchpad.css

Conventions:
- One class, one owner: a component's base styles live in a single file;
  other files style it only through their own modifier/role classes
  (.scroll-fill, .scroll-stick, .scroll-main, .input-range-themed,
  .btn-compact, feature modifier classes).
- State and layout-context styling stays descendant-based (panel-state
  classes, .side-drawer-active, :has rules) and carries an ownership
  comment pointing at the file that owns the base component.
- Role classes are flat, single-class selectors so specificity stays low;
  when an override must beat a contextual rule, use an element+class
  selector and rely on file order, or an id scope — not !important. */

/* Default Theme Variables (Fallback for IDE inspection & dynamic override) */
:root {
    --BG-base: #000;
    --BG-panel: #111;
    --BG-panel2: #222;
    --FG-base: #FFFFFF;
    --FG-muted: #888;
    --AC-trim-dd: #aaa;
    --AC-trim-d: #999;
    --AC-trim: #888;
    --AC-trim-l: #444;
    --DM-margin: 16pt;
    --DM-margin-h: 8pt;
    --DM-margin-q: 4pt;
    --DM-margin-s: 2pt;
    --TX-status-success: #51cf66;
    --TX-status-error: #ff6b6b;
    --TX-badge-admin: #ffd43b;
    --TX-link: #a0a0a0;
    --BD-panel: #888;
    --BD-panel-l: #444;
    --BD-input: #888;
    --BD-fieldset: #888;
    --BD-divider: #222;
    --AC-btn: #888;
    --AC-btn-text: #aaa;
    --BG-header: color-mix(in srgb, var(--AC-trim) 35%, var(--BG-panel2));

    /* Accent tints over transparency, used for highlights, drag targets and
       glass panels: named once here so features stay in step when the trim
       or intensity ramps change. */
    --AC-trim-tint-faint: var(--AC-trim-tint-faint);
    --AC-trim-tint-soft: var(--AC-trim-tint-soft);
    --AC-trim-tint-mild: var(--AC-trim-tint-mild);
    --AC-trim-tint-strong: var(--AC-trim-tint-strong);
    --AC-trim-tint-heavy: color-mix(in srgb, var(--AC-trim) 45%, transparent);

    /* Hairline border color for subdued section dividers inside panels. */
    --BD-panel-hairline: var(--BD-panel-hairline);
}

/* SimpleBar (util/scrollbars.js): color scrollbars with theme variables so
   they follow the active theme. Vertical tracks are always visible so the
   layout width stays consistent; horizontal tracks appear only on overflow
   (via :has on the thumb). x-only containers (sb-x) scroll sideways only. */
/* SimpleBar-core derives each axis from the host's computed overflow
   (overflow: hidden disables the axis) and constrains flex/grid hosts by it,
   so managed hosts scroll natively but render no native scrollbar: no gutter
   is reserved and the custom track stays flush with the frame. !important
   beats the native scrollbar styling below, which applies to the containers
   that are deliberately not managed. */
[data-simplebar] {
	overflow-y: scroll;
	scrollbar-width: none !important;
}

.simplebar-track.simplebar-vertical {
	pointer-events: auto;
	visibility: visible !important;
	width: 10px;
	background: var(--BG-panel2);
	border: 1pt solid var(--BD-panel-l);
	border-radius: 2px;
	box-sizing: border-box;
}

.simplebar-track.simplebar-horizontal:has(.simplebar-scrollbar.simplebar-visible) {
	pointer-events: auto;
	height: 10px;
	background: var(--BG-panel2);
	border: 1pt solid var(--BD-panel-l);
	border-radius: 2px;
	box-sizing: border-box;
}

.simplebar-track .simplebar-scrollbar:before {
	background: var(--BG-panel);
	border: 1pt solid var(--BD-input);
	border-radius: 2px;
}

.simplebar-track .simplebar-scrollbar.simplebar-visible:before {
	opacity: 1;
	transition: none;
}

.simplebar-track .simplebar-scrollbar.simplebar-hover:before,
[data-simplebar].simplebar-dragging .simplebar-scrollbar:before {
	background: color-mix(in srgb, var(--AC-trim) 30%, var(--BG-panel));
}

/* Scrolling stops at managed scrollers: no chaining into ancestors and no
   browser overscroll effects when a scroll hits the top/bottom. The gutter
   keeps content out from under the always-visible vertical track. */
[data-simplebar] .simplebar-content-wrapper {
	overscroll-behavior: contain;
	padding-right: calc(10px + var(--DM-margin-q));
}

/* x-only containers: no vertical track or gutter, and bottom room for the
   need-based horizontal track */
.sb-x .simplebar-track.simplebar-vertical {
	display: none;
}

.sb-x .simplebar-content-wrapper {
	overscroll-behavior: auto;
	padding-right: 0;
	padding-bottom: calc(10px + var(--DM-margin-q));
}

/* Main columns: the track sits flush against the frame edge, so suppress
   its right border there. The floating drawer keeps its full border. */
/* scroll-main: main-column hosts sit flush against the frame edge, so the
   vertical track suppresses its right border there. Floating drawers keep
   their full border. */
.scroll-main .simplebar-track.simplebar-vertical {
	border-right: none;
}

/* SimpleBar's float clearfix would become grid items in the managed
   bottom-stick grids (grid-template-rows: 1fr auto), shifting the rows */
.simplebar-content:before,
.simplebar-content:after {
	content: none;
}

/* Native scrollbar styling for the containers deliberately not managed by
   SimpleBar (code blocks, diagrams, textareas, dialogs, streaming text) */
:is(.code-block,
	.div-diagram-mermaid, .mermaid,
	#id-prompt, .prompt-style-input,
	.div-plugin-dialog-container,
	.div-thinking-content.thinking-streaming .div-thinking-text,
	.instant-answer-thoughts-content,
	.instant-answer-response-content pre, .instant-answer-body pre,
	.instant-answer-response-content .code-block, .instant-answer-body .code-block) {
	scrollbar-width: thin;
	scrollbar-color: var(--BG-panel) var(--BG-base);
}

/* Textareas cannot be SimpleBar-managed: paint their native scroller with
   the SimpleBar track and thumb colors via the WebKit pseudo elements
   (Chromium); Firefox uses the standard properties above */
textarea {
	scrollbar-width: thin;
	scrollbar-color: var(--BG-panel) var(--BG-panel2);
}

textarea::-webkit-scrollbar {
	width: 10px;
}

textarea::-webkit-scrollbar-track {
	background: var(--BG-panel2);
	border: 1pt solid var(--BD-panel-l);
	border-radius: 2px;
	box-sizing: border-box;
}

textarea::-webkit-scrollbar-thumb {
	background: var(--BG-panel);
	border: 1pt solid var(--BD-input);
	border-radius: 2px;
}

/* Base Overrides */

body{
    position: fixed;
    height: 100%;
    width: 100%;
    overflow: hidden;
    background-color: var(--BG-base);
    color: var(--FG-base);
}

::selection {
    background-color: var(--AC-trim);
    color: var(--BG-base);
}


::-moz-selection {
    background-color: var(--AC-trim);
    color: var(--BG-base);
}

code, pre{
    display: inline-block;
    word-wrap: normal;
    white-space: pre;
    background-color: var(--BG-panel);
    padding: 0 0.2em;
}

code{
    background-color: var(--BG-panel);
}

table {
    border-collapse: collapse;
    width: 100%;
    max-width: 100%;
    margin: var(--DM-margin-h) 0;
    box-sizing: border-box;
    border: 1px solid var(--BD-panel-l);
    background-color: var(--BG-panel);
    font-size: 0.92em;
}

table th, table td {
    padding: var(--DM-margin-q) var(--DM-margin-h);
    border: 1px solid var(--BD-panel-l);
    text-align: left;
    word-break: normal;
}

thead, table th {
    background-color: var(--BG-header);
    color: var(--FG-base);
    font-weight: bold;
}

table tr:nth-child(even) {
    background-color: var(--BG-base);
}

/* Row states, most to least subdued: hover (panel2), selected (mild accent tint), header (strong accent tint) */
table tr:hover {
    background-color: var(--BG-panel2);
}

table tr.selected-row,
table tr.selected-row td {
    background-color: color-mix(in srgb, var(--AC-trim) 20%, var(--BG-panel2));
}
input, button, textarea, select{
    background-color: var(--BG-base);
    color: var(--FG-base);
    padding: var(--DM-margin-q);
    border: 1pt solid var(--BD-input);
}
select{
    width: 100%;
    box-sizing: border-box;
    border: 1pt solid var(--BD-input);
    border-radius: var(--DM-margin-q);
}
select, ::picker(select) {
    appearance: base-select;
    background-color: var(--BG-base);
    color: var(--FG-base);
    border: 1pt solid var(--BD-input);
    border-radius: var(--DM-margin-q);
    overflow-y: auto;
}

::picker(select) {
    background-color: var(--BG-panel);
    border: 1pt solid var(--BD-input);
    border-radius: var(--DM-margin-q);
    box-shadow: 0 4px 14px rgba(0, 0, 0, 0.4);
    padding: var(--DM-margin-s);
}

select:hover {
    filter: brightness(1.15);
    box-shadow: 0 0 6px var(--BD-input);
    border-color: var(--BD-input);
}

select:focus {
    outline: 2px solid var(--BD-input);
    border-color: var(--BD-input);
}

select option, option {
    background-color: var(--BG-panel);
    color: var(--FG-base);
    padding: var(--DM-margin-q);
}

select option:hover,
select option:focus,
select option:checked,
option:hover,
option:focus,
option:checked {
    background-color: var(--BG-panel2);
    color: var(--AC-trim-dd);
}
input[type="checkbox"] {
    appearance: none;
    -webkit-appearance: none;
    -moz-appearance: none;
    width: 16px;
    height: 16px;
    border: 1px solid var(--AC-btn);
    border-radius: 2px;
    position: relative;
    cursor: pointer;
    vertical-align: middle; /* Align with text */
    margin: 0 var(--DM-margin-q) 0 0;
}

input[type="checkbox"]:checked {
    background-color: var(--AC-btn); /* Fill color when checked */
    border-color: var(--AC-btn);
}

input[type="checkbox"]:checked::after {
    font-family: "Noto Emoji", sans-serif;
    content: '✔'; /* Checkmark character */
    color: var(--BG-base); /* Color of the checkmark */
    font-size: 12px;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    line-height: 1;
}
button:disabled{
    opacity: 0.6;
}

input[type="checkbox"]:disabled,
input[type="checkbox"]:disabled + label {
    opacity: 0.5;
    cursor: default;
}

button:hover {
    filter: brightness(1.15);
    box-shadow: 0 0 6px var(--AC-btn);
}

button:focus {
    outline: 3px solid var(--AC-btn);
}

/* Libraries */

.hljs {
    background: var(--BG-panel);
    color: var(--FG-base);
    border-radius: var(--DM-margin-q);
}

.hljs-comment,
.hljs-quote {
    color: var(--FG-muted);
    font-style: italic;
}

.hljs-keyword,
.hljs-selector-tag,
.hljs-subst {
    color: var(--AC-trim-dd);
    font-weight: bold;
}

.hljs-number,
.hljs-literal,
.hljs-variable,
.hljs-template-variable,
.hljs-tag .hljs-attr {
    color: var(--AC-trim-d);
}

.hljs-string,
.hljs-doctag,
.hljs-title,
.hljs-section,
.hljs-selector-id {
    color: var(--AC-trim);
}

.hljs-title.function_,
.hljs-function,
.hljs-type,
.hljs-built_in {
    color: var(--AC-trim-dd);
    font-weight: bold;
}

.hljs-attr,
.hljs-attribute,
.hljs-symbol,
.hljs-bullet,
.hljs-link {
    color: var(--AC-trim);
}

.hljs-params {
    color: var(--FG-base);
}

.hljs-meta,
.hljs-meta .hljs-keyword,
.hljs-tag {
    color: var(--FG-muted);
}

.hljs-addition {
    color: var(--TX-status-success, #51cf66);
}

.hljs-deletion {
    color: var(--TX-status-error, #ff6b6b);
}

/* YAML: keys pop, values stay neutral, structure tokens stay quiet */
.language-yaml .hljs-attr {
    color: var(--AC-trim-dd);
    font-weight: bold;
}
.language-yaml .hljs-string {
    color: var(--FG-base);
}
.language-yaml .hljs-bullet {
    color: var(--AC-trim-dd);
}
.language-yaml .hljs-meta,
.language-yaml .hljs-type {
    color: var(--AC-trim-d);
}

.code-block {
    display: block;
    position: relative;
    max-width: 100%;
    overflow-x: auto;
}

.div-scroll-container-inner{
    margin: var(--DM-margin-q);
}
@media screen and (max-width: 499px) {
    body {
        font-size: 85%;
    }
}
/* View Transitions */
html.theme-transitioning::view-transition-old(root),
html.theme-transitioning::view-transition-new(root) {
    animation-duration: 700ms;
}
🌐
style.css ×
Type: Web, text/plain
12.06 Kilobytes
Last Modified 2026-11-04 09:48:28
⬇ Download File