Spaces:
Running
Running
Download frontend/src/App.css from neongeckocom/AskJerry: direct link, hf CLI and curl.
- Browser
- Download file 21.1 kB
-
https://huggingface.co/spaces/neongeckocom/AskJerry/resolve/main/frontend/src/App.css
- Command line
-
hf download hf://spaces/neongeckocom/AskJerry/frontend/src/App.css
-
curl -L -o App.css https://huggingface.co/spaces/neongeckocom/AskJerry/resolve/main/frontend/src/App.css
21.1 kB
| html.aj-hide-pointer, | |
| html.aj-hide-pointer * { | |
| cursor: none ; | |
| } | |
| .aj-app { | |
| flex: 1 1 0; | |
| min-height: 0; | |
| display: flex; | |
| flex-direction: column; | |
| overflow: hidden; | |
| background: var(--lc-gradient); | |
| color: var(--lc-text); | |
| } | |
| /* Matches Version B: single row, three columns — brand | title | actions */ | |
| .aj-header { | |
| display: grid; | |
| grid-template-columns: 1fr auto 1fr; | |
| align-items: center; | |
| padding: 12px 12px; | |
| background: var(--lc-header); | |
| border-bottom: 1px solid var(--lc-border); | |
| box-shadow: var(--lc-shadow-sm); | |
| position: relative; | |
| z-index: 50; | |
| } | |
| /* Subtle "sunburst" signature — echoes the tribal logo's blue / green / terracotta / gold | |
| rays without reproducing the logo itself. */ | |
| .aj-header::after { | |
| content: ''; | |
| position: absolute; | |
| left: 0; | |
| right: 0; | |
| bottom: -1px; | |
| height: 3px; | |
| background: var(--lc-tribal-strip); | |
| opacity: 0.85; | |
| } | |
| /* Neon.ai header brand — wordmark: solid cyan-teal (darkest stop from previous gradient) */ | |
| .aj-header-brand-link { | |
| display: flex; | |
| align-items: center; | |
| gap: 6px; | |
| justify-self: start; | |
| text-decoration: none; | |
| color: inherit; | |
| transition: opacity 0.15s; | |
| font-size: 20px; | |
| } | |
| .aj-header-brand-link:hover { | |
| opacity: 0.8; | |
| } | |
| .aj-header-logo { | |
| /* Match capital-letter height of adjacent "Neon.ai" wordmark, then +20%. */ | |
| height: 0.864em; | |
| height: 1.2cap; | |
| width: auto; | |
| display: block; | |
| } | |
| .aj-header-brand-name { | |
| font-size: 20px; | |
| font-weight: 700; | |
| letter-spacing: -0.02em; | |
| line-height: 1.2; | |
| color: var(--lc-text); | |
| } | |
| .aj-header-title-wrap { | |
| text-align: center; | |
| } | |
| .aj-header-title { | |
| margin: 0; | |
| font-size: 20px; | |
| font-weight: 700; | |
| letter-spacing: -0.02em; | |
| line-height: 1.2; | |
| text-align: center; | |
| white-space: nowrap; | |
| color: var(--lc-text); | |
| } | |
| .aj-sub { | |
| font-size: 14px; | |
| color: var(--lc-muted); | |
| margin: 0; | |
| } | |
| /* Version B: actions live in aj-options-wrap (flex row, right-aligned) */ | |
| .aj-options-wrap { | |
| position: relative; | |
| justify-self: end; | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| } | |
| /* Header icon buttons — compact; overflow / composer use different rules below */ | |
| .aj-header .aj-btn { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| width: 36px; | |
| height: 36px; | |
| padding: 0; | |
| gap: 0; | |
| border-radius: 8px; | |
| border: 1px solid var(--lc-border); | |
| background: var(--lc-elevated); | |
| color: var(--lc-muted); | |
| cursor: pointer; | |
| font-size: 0; | |
| } | |
| .aj-header .aj-btn:hover:not(:disabled) { | |
| background: var(--lc-card-hover); | |
| color: var(--lc-text); | |
| border-color: var(--lc-border); | |
| } | |
| .aj-btn { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 6px; | |
| padding: 8px 14px; | |
| border-radius: 10px; | |
| border: 1px solid var(--lc-border); | |
| background: var(--lc-elevated); | |
| color: inherit; | |
| cursor: pointer; | |
| font-size: 13px; | |
| font-weight: 500; | |
| } | |
| .aj-btn:hover:not(:disabled) { | |
| border-color: var(--lc-border); | |
| background: var(--lc-card-hover); | |
| color: var(--lc-text); | |
| } | |
| .aj-btn:disabled { | |
| opacity: 0.45; | |
| cursor: not-allowed; | |
| } | |
| /* Single primary action — the only element using the accent gradient */ | |
| .aj-btn.primary { | |
| background: var(--lc-accent-gradient); | |
| border-color: transparent; | |
| color: #fff; | |
| } | |
| .aj-btn.primary:hover:not(:disabled) { | |
| background: var(--lc-accent-gradient); | |
| border-color: transparent; | |
| color: #fff; | |
| filter: brightness(1.06); | |
| } | |
| .aj-btn.danger { | |
| border-color: var(--lc-danger-border); | |
| color: var(--lc-danger-strong); | |
| } | |
| .aj-header .aj-btn.danger { | |
| color: var(--lc-danger); | |
| border-color: var(--lc-danger-border); | |
| } | |
| .aj-header .aj-btn.danger:hover:not(:disabled) { | |
| background: var(--lc-danger-bg); | |
| border-color: var(--lc-danger); | |
| color: var(--lc-danger); | |
| } | |
| .aj-btn.ghost { | |
| border-color: transparent; | |
| background: transparent; | |
| } | |
| .aj-btn.ghost:hover:not(:disabled) { | |
| background: var(--lc-hover); | |
| } | |
| /* Options dropdown: fixed so it is not clipped by .aj-app overflow:hidden; position set via JS (--aj-options-panel-*) */ | |
| .aj-options-panel { | |
| position: fixed; | |
| z-index: 200; | |
| top: var(--aj-options-panel-top, 68px); | |
| right: var(--aj-options-panel-right, 12px); | |
| left: auto; | |
| width: min(400px, calc(100vw - 32px)); | |
| max-height: min(70vh, calc(100dvh - var(--aj-options-panel-top, 68px) - 12px)); | |
| overflow-y: auto; | |
| padding: 14px 16px 16px; | |
| border-radius: 12px; | |
| border: 1px solid var(--lc-border); | |
| background: var(--lc-elevated); | |
| box-shadow: var(--lc-shadow-lg); | |
| } | |
| .aj-options-section { | |
| padding: 14px; | |
| border-radius: 10px; | |
| border: 1px solid var(--lc-border-muted); | |
| background: var(--lc-bg2); | |
| } | |
| .aj-options-section + .aj-options-section { | |
| margin-top: 12px; | |
| } | |
| .aj-options-section-title { | |
| margin: 0 0 10px; | |
| font-size: 11px; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| letter-spacing: 0.06em; | |
| color: var(--lc-muted); | |
| } | |
| .aj-options-section-title + .aj-field, | |
| .aj-options-section-title + .aj-field-checkbox { | |
| margin-top: 0; | |
| } | |
| .aj-options-hint { | |
| margin: 8px 0 0; | |
| font-size: 12px; | |
| color: var(--lc-muted); | |
| line-height: 1.45; | |
| } | |
| .aj-field span { | |
| display: block; | |
| font-size: 11px; | |
| color: var(--lc-muted); | |
| margin-bottom: 6px; | |
| } | |
| .aj-field textarea { | |
| width: 100%; | |
| box-sizing: border-box; | |
| padding: 12px 14px; | |
| border-radius: 10px; | |
| border: 1px solid var(--lc-border); | |
| background: var(--lc-input); | |
| color: var(--lc-text); | |
| font-size: 13px; | |
| line-height: 1.5; | |
| resize: vertical; | |
| min-height: 120px; | |
| } | |
| .aj-field textarea::placeholder { | |
| color: var(--lc-placeholder); | |
| opacity: 0.85; | |
| } | |
| .aj-field-checkbox { | |
| display: flex; | |
| flex-direction: row; | |
| align-items: flex-start; | |
| gap: 10px; | |
| margin-top: 14px; | |
| } | |
| .aj-field-checkbox span { | |
| display: inline; | |
| margin-bottom: 0; | |
| font-size: 13px; | |
| color: var(--lc-text); | |
| } | |
| .aj-field-checkbox input { | |
| margin-top: 2px; | |
| flex-shrink: 0; | |
| } | |
| .aj-speed-options { | |
| display: flex; | |
| gap: 6px; | |
| margin-top: 6px; | |
| } | |
| .aj-speed-option { | |
| padding: 4px 12px; | |
| border-radius: 6px; | |
| border: 1px solid var(--lc-border); | |
| background: var(--lc-input); | |
| color: var(--lc-muted); | |
| font-size: 13px; | |
| font-weight: 600; | |
| cursor: pointer; | |
| transition: all 0.15s; | |
| } | |
| .aj-speed-option:hover { | |
| border-color: var(--lc-accent); | |
| color: var(--lc-accent); | |
| } | |
| .aj-speed-option--active { | |
| background: var(--lc-accent); | |
| color: #fff; | |
| border-color: var(--lc-accent); | |
| } | |
| .aj-speed-option--active:hover { | |
| color: #fff; | |
| } | |
| .aj-chat-wrap { | |
| flex: 1; | |
| display: flex; | |
| flex-direction: column; | |
| min-height: 0; | |
| overflow: hidden; | |
| } | |
| .aj-messages { | |
| flex: 1; | |
| overflow-y: auto; | |
| padding: 20px 16px 0; | |
| background: transparent; | |
| } | |
| /* Centered reading column that holds messages + the sticky composer */ | |
| .aj-thread { | |
| width: 100%; | |
| max-width: var(--lc-col); | |
| min-height: 100%; | |
| margin: 0 auto; | |
| display: flex; | |
| flex-direction: column; | |
| } | |
| /* Empty state */ | |
| .aj-empty { | |
| margin: 48px auto 0; | |
| max-width: 520px; | |
| text-align: center; | |
| } | |
| .aj-empty-title { | |
| margin: 0 0 8px; | |
| font-size: 18px; | |
| font-weight: 700; | |
| color: var(--lc-text); | |
| } | |
| .aj-empty-sub { | |
| margin: 0; | |
| font-size: 15px; | |
| line-height: 1.5; | |
| color: var(--lc-muted); | |
| } | |
| /* Fixed above the composer dock + footer — jump to bottom when scrolled up */ | |
| .aj-jump-bottom-btn { | |
| position: fixed; | |
| /* Hug the right edge of the centered reading column instead of the far viewport | |
| gutter; fall back to 12px from the edge when the viewport is narrower than the column. */ | |
| right: max(12px, calc(50% - var(--lc-col) / 2 + 12px)); | |
| bottom: calc(108px + env(safe-area-inset-bottom, 0px)); | |
| z-index: 55; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| width: 48px; | |
| height: 48px; | |
| padding: 0; | |
| border-radius: 50%; | |
| border: 1px solid var(--lc-border); | |
| background: var(--lc-elevated); | |
| color: var(--lc-accent); | |
| box-shadow: var(--lc-shadow-lg); | |
| cursor: pointer; | |
| transition: transform 0.15s ease, box-shadow 0.15s ease; | |
| } | |
| /* The generic [data-tip] tooltip rule (position: relative) has equal specificity | |
| and later source order, so it would otherwise override the fixed positioning | |
| above and drop the button into normal flow. Keep it pinned to the viewport. */ | |
| .aj-jump-bottom-btn[data-tip] { | |
| position: fixed; | |
| } | |
| .aj-jump-bottom-btn:hover { | |
| transform: translateY(-2px); | |
| box-shadow: var(--lc-shadow-lg); | |
| border-color: var(--lc-accent); | |
| } | |
| .aj-jump-bottom-btn:focus-visible { | |
| outline: none; | |
| box-shadow: var(--lc-focus-ring); | |
| } | |
| @media (max-width: 520px) { | |
| .aj-jump-bottom-btn { | |
| right: 8px; | |
| bottom: calc(100px + env(safe-area-inset-bottom, 0px)); | |
| width: 44px; | |
| height: 44px; | |
| } | |
| } | |
| .aj-msg-row { | |
| display: flex; | |
| align-items: flex-end; | |
| gap: 10px; | |
| margin-bottom: 16px; | |
| max-width: 960px; | |
| margin-left: auto; | |
| margin-right: auto; | |
| box-sizing: border-box; | |
| } | |
| /* Symmetric padding P → center overlap = (1 − 2P) of row; P=35% → 30% overlap */ | |
| .aj-msg-row:not(.user) { | |
| padding-right: 35%; | |
| justify-content: flex-end; | |
| } | |
| /* User: right side, left-justified — extends past center */ | |
| .aj-msg-row.user { | |
| padding-left: 35%; | |
| justify-content: flex-start; | |
| } | |
| .aj-shape { | |
| flex-shrink: 0; | |
| width: 14px; | |
| height: 14px; | |
| border-radius: 50%; | |
| background: var(--lc-accent); | |
| } | |
| .aj-bubble-wrap { | |
| max-width: 100%; | |
| position: relative; | |
| z-index: 0; | |
| } | |
| .aj-bubble-name { | |
| font-size: 11px; | |
| color: var(--lc-muted); | |
| margin-bottom: 4px; | |
| padding: 0 4px; | |
| } | |
| /* Names at the outer edge of each bubble (away from center) */ | |
| .aj-msg-row.user .aj-bubble-name { | |
| text-align: right; | |
| } | |
| .aj-msg-row:not(.user) .aj-bubble-name { | |
| text-align: left; | |
| } | |
| .aj-msg-row:not(.user) .aj-bubble { | |
| text-align: left; | |
| } | |
| .aj-msg-row.user .aj-bubble { | |
| text-align: left; | |
| } | |
| .aj-bubble { | |
| padding: 12px 16px; | |
| border-radius: 16px; | |
| line-height: 1.55; | |
| font-size: 14px; | |
| border: 1px solid var(--lc-border); | |
| background: var(--lc-bubble); | |
| box-shadow: var(--lc-shadow); | |
| white-space: pre-wrap; | |
| word-break: break-word; | |
| } | |
| /* Speech-bubble tails: one corner tighter for a natural bubble shape */ | |
| .aj-msg-row:not(.user) .aj-bubble { | |
| border-bottom-left-radius: 4px; | |
| } | |
| .aj-msg-row.user .aj-bubble { | |
| border-radius: 16px; | |
| border-bottom-right-radius: 4px; | |
| background: var(--lc-accent-gradient); | |
| color: #fff; | |
| border-color: transparent; | |
| } | |
| /* Assistant replies: render markdown as formatted text (not raw syntax) */ | |
| .aj-bubble--assistant-md { | |
| white-space: normal; | |
| } | |
| .aj-bubble-md { | |
| line-height: 1.55; | |
| } | |
| .aj-bubble-md p { | |
| margin: 0 0 0.65em; | |
| } | |
| .aj-bubble-md p:last-child { | |
| margin-bottom: 0; | |
| } | |
| .aj-bubble-md h1, | |
| .aj-bubble-md h2, | |
| .aj-bubble-md h3, | |
| .aj-bubble-md h4 { | |
| margin: 0.85em 0 0.4em; | |
| line-height: 1.25; | |
| font-weight: 600; | |
| } | |
| .aj-bubble-md h1:first-child, | |
| .aj-bubble-md h2:first-child, | |
| .aj-bubble-md h3:first-child, | |
| .aj-bubble-md h4:first-child { | |
| margin-top: 0; | |
| } | |
| .aj-bubble-md h1 { | |
| font-size: 1.2em; | |
| } | |
| .aj-bubble-md h2 { | |
| font-size: 1.1em; | |
| } | |
| .aj-bubble-md h3, | |
| .aj-bubble-md h4 { | |
| font-size: 1.05em; | |
| } | |
| .aj-bubble-md ul, | |
| .aj-bubble-md ol { | |
| margin: 0 0 0.65em; | |
| padding-left: 1.35em; | |
| } | |
| .aj-bubble-md li { | |
| margin: 0.2em 0; | |
| } | |
| .aj-bubble-md li > p { | |
| margin: 0.25em 0; | |
| } | |
| .aj-bubble-md blockquote { | |
| margin: 0.5em 0; | |
| padding: 0 0 0 0.75em; | |
| border-left: 3px solid var(--lc-accent); | |
| color: var(--lc-muted); | |
| } | |
| .aj-bubble-md hr { | |
| margin: 0.85em 0; | |
| border: none; | |
| border-top: 1px solid var(--lc-border); | |
| } | |
| .aj-bubble-md pre { | |
| margin: 0.5em 0; | |
| padding: 10px 12px; | |
| border-radius: 10px; | |
| background: var(--lc-tint-strong); | |
| overflow-x: auto; | |
| font-size: 13px; | |
| } | |
| .aj-bubble-md code { | |
| font-family: ui-monospace, 'Cascadia Code', 'Segoe UI Mono', monospace; | |
| font-size: 0.92em; | |
| padding: 0.1em 0.35em; | |
| border-radius: 4px; | |
| background: var(--lc-tint-strong); | |
| } | |
| .aj-bubble-md pre code { | |
| padding: 0; | |
| background: none; | |
| font-size: inherit; | |
| } | |
| .aj-bubble-md a { | |
| color: var(--lc-accent); | |
| text-decoration: underline; | |
| text-underline-offset: 2px; | |
| } | |
| .aj-bubble-md table { | |
| width: 100%; | |
| border-collapse: collapse; | |
| margin: 0.5em 0; | |
| font-size: 13px; | |
| } | |
| .aj-bubble-md th, | |
| .aj-bubble-md td { | |
| border: 1px solid var(--lc-border); | |
| padding: 6px 8px; | |
| text-align: left; | |
| } | |
| .aj-bubble-md th { | |
| background: var(--lc-tint); | |
| } | |
| .aj-typing { | |
| display: inline-block; | |
| width: 8px; | |
| height: 8px; | |
| border-radius: 50%; | |
| background: var(--lc-accent); | |
| animation: aj-pulse 1s ease-in-out infinite; | |
| } | |
| @keyframes aj-pulse { | |
| 0%, | |
| 100% { | |
| opacity: 0.35; | |
| } | |
| 50% { | |
| opacity: 1; | |
| } | |
| } | |
| /* Context meter bar — centered in the reading column, not full-bleed */ | |
| .aj-context-bar { | |
| z-index: 49; | |
| display: flex; | |
| align-items: center; | |
| gap: 10px; | |
| width: 100%; | |
| max-width: var(--lc-col); | |
| margin: 0 auto; | |
| padding: 8px 16px; | |
| border-bottom: 1px solid var(--lc-border-muted); | |
| background: transparent; | |
| } | |
| .aj-context-meter { | |
| flex: 1; | |
| height: 4px; | |
| border-radius: 2px; | |
| background: var(--lc-border); | |
| overflow: hidden; | |
| max-width: 180px; | |
| } | |
| .aj-context-fill { | |
| height: 100%; | |
| border-radius: 2px; | |
| background: var(--lc-accent); | |
| transition: width 0.3s; | |
| } | |
| .aj-context-fill[data-hot] { | |
| background: var(--lc-warning-fill); | |
| } | |
| .aj-context-label { | |
| font-size: 11px; | |
| color: var(--lc-muted); | |
| white-space: nowrap; | |
| } | |
| /* Summary banner */ | |
| .aj-summary-banner { | |
| margin: 16px auto; | |
| max-width: 560px; | |
| padding: 14px 18px; | |
| border-radius: 12px; | |
| border: 1px solid var(--lc-border); | |
| background: var(--lc-accent-light); | |
| } | |
| .aj-summary-banner p { | |
| margin: 0 0 6px; | |
| font-size: 13px; | |
| line-height: 1.5; | |
| } | |
| .aj-summary-banner p:last-child { | |
| margin-bottom: 0; | |
| } | |
| .aj-summary-text { | |
| color: var(--lc-muted); | |
| font-size: 12px ; | |
| } | |
| /* Context overflow banner */ | |
| .aj-overflow-banner { | |
| display: flex; | |
| gap: 12px; | |
| padding: 16px 10px; | |
| background: var(--lc-danger-bg); | |
| border-top: 1px solid var(--lc-danger-border); | |
| } | |
| .aj-overflow-icon { | |
| flex-shrink: 0; | |
| color: var(--lc-danger); | |
| margin-top: 2px; | |
| } | |
| .aj-overflow-body { | |
| flex: 1; | |
| min-width: 0; | |
| } | |
| .aj-overflow-title { | |
| margin: 0 0 4px; | |
| font-size: 14px; | |
| font-weight: 600; | |
| color: var(--lc-danger-strong); | |
| } | |
| .aj-overflow-detail { | |
| margin: 0 0 12px; | |
| font-size: 13px; | |
| color: var(--lc-danger-text); | |
| line-height: 1.5; | |
| } | |
| .aj-overflow-actions { | |
| display: flex; | |
| gap: 8px; | |
| flex-wrap: wrap; | |
| } | |
| .aj-overflow-actions .aj-btn { | |
| font-size: 12px; | |
| padding: 6px 12px; | |
| } | |
| /* Composer sits just below the latest reply, then sticks to the bottom of the | |
| chat window once the conversation scrolls past it. */ | |
| .aj-composer { | |
| position: sticky; | |
| bottom: 0; | |
| z-index: 40; | |
| margin-top: 16px; | |
| padding: 10px 12px; | |
| border: 1px solid var(--lc-border); | |
| border-bottom: none; | |
| border-radius: 14px 14px 0 0; | |
| background: var(--lc-sidebar); | |
| box-shadow: var(--lc-shadow-up); | |
| flex-shrink: 0; | |
| } | |
| /* Persistent copyright footer, always visible below the chat window */ | |
| .aj-footer { | |
| flex-shrink: 0; | |
| padding: 8px 16px calc(8px + env(safe-area-inset-bottom, 0px)); | |
| text-align: center; | |
| background: var(--lc-header); | |
| border-top: 1px solid var(--lc-border); | |
| } | |
| .aj-footer p { | |
| margin: 0; | |
| font-size: 12px; | |
| line-height: 1.5; | |
| color: var(--lc-muted); | |
| } | |
| .aj-footer a { | |
| color: var(--lc-accent); | |
| text-decoration: underline; | |
| text-underline-offset: 2px; | |
| border-radius: 2px; | |
| } | |
| .aj-footer a:hover { | |
| color: var(--lc-accent-strong); | |
| } | |
| .aj-voice-error-banner { | |
| display: flex; | |
| align-items: flex-start; | |
| justify-content: space-between; | |
| gap: 12px; | |
| padding: 8px 12px; | |
| font-size: 13px; | |
| line-height: 1.45; | |
| color: var(--lc-danger-text); | |
| background: var(--lc-danger-bg); | |
| border-bottom: 1px solid var(--lc-danger-border); | |
| } | |
| .aj-voice-error-banner span { | |
| flex: 1; | |
| min-width: 0; | |
| } | |
| .aj-voice-error-dismiss { | |
| flex-shrink: 0; | |
| border: none; | |
| background: transparent; | |
| color: var(--lc-danger-strong); | |
| font-size: 20px; | |
| line-height: 1; | |
| cursor: pointer; | |
| padding: 0 4px; | |
| } | |
| .aj-voice-error-dismiss:hover { | |
| color: var(--lc-danger-text); | |
| } | |
| .aj-composer-inner { | |
| display: flex; | |
| gap: 6px; | |
| align-items: flex-end; | |
| width: 100%; | |
| max-width: none; | |
| box-sizing: border-box; | |
| } | |
| .aj-composer-field { | |
| flex: 1; | |
| min-width: 0; | |
| display: flex; | |
| flex-direction: column; | |
| align-self: stretch; | |
| } | |
| .aj-composer-field--listening textarea { | |
| background: var(--lc-success-bg) ; | |
| border-color: var(--lc-success) ; | |
| } | |
| .aj-composer textarea { | |
| width: 100%; | |
| min-width: 0; | |
| flex: 1 1 auto; | |
| align-self: stretch; | |
| box-sizing: border-box; | |
| min-height: 34px; | |
| max-height: 50vh; | |
| padding: 6px 10px; | |
| border-radius: 10px; | |
| border: 1px solid var(--lc-border); | |
| background: var(--lc-input); | |
| color: var(--lc-text); | |
| font-size: 14px; | |
| resize: none; | |
| line-height: 1.45; | |
| overflow-y: hidden; | |
| } | |
| .aj-composer textarea:focus { | |
| outline: none; | |
| border-color: var(--lc-accent); | |
| box-shadow: 0 0 0 3px var(--lc-accent-light); | |
| } | |
| .aj-composer textarea::placeholder { | |
| color: var(--lc-placeholder); | |
| } | |
| .aj-composer .aj-btn { | |
| width: 34px; | |
| height: 34px; | |
| padding: 0; | |
| justify-content: center; | |
| flex-shrink: 0; | |
| } | |
| .aj-share-wrap { | |
| position: relative; | |
| flex-shrink: 0; | |
| } | |
| .aj-share-panel { | |
| position: absolute; | |
| right: 0; | |
| bottom: calc(100% + 8px); | |
| z-index: 200; | |
| min-width: 200px; | |
| max-width: min(280px, calc(100vw - 40px)); | |
| padding: 8px; | |
| border-radius: 12px; | |
| border: 1px solid var(--lc-border); | |
| background: var(--lc-elevated); | |
| box-shadow: var(--lc-shadow); | |
| } | |
| .aj-share-item { | |
| display: block; | |
| width: 100%; | |
| margin: 0; | |
| padding: 10px 12px; | |
| border: none; | |
| border-radius: 8px; | |
| background: transparent; | |
| color: var(--lc-text); | |
| font-size: 14px; | |
| font-weight: 500; | |
| text-align: left; | |
| cursor: pointer; | |
| } | |
| .aj-share-item:hover { | |
| background: var(--lc-hover); | |
| } | |
| .aj-share-hint { | |
| margin: 6px 4px 2px; | |
| font-size: 11px; | |
| line-height: 1.4; | |
| color: var(--lc-muted); | |
| } | |
| /* Per-message TTS + search (assistant) — popover right or below bubble */ | |
| .aj-msg-actions { | |
| width: 100%; | |
| margin-top: 8px; | |
| } | |
| .aj-msg-search-wrap { | |
| display: flex; | |
| justify-content: flex-end; | |
| gap: 6px; | |
| } | |
| .aj-spin { | |
| animation: aj-spin 0.9s linear infinite; | |
| } | |
| @keyframes aj-spin { | |
| to { | |
| transform: rotate(360deg); | |
| } | |
| } | |
| .aj-msg-search-btn { | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| width: 32px; | |
| height: 32px; | |
| padding: 0; | |
| border-radius: 8px; | |
| border: 1px solid var(--lc-border); | |
| background: var(--lc-input); | |
| color: var(--lc-muted); | |
| cursor: pointer; | |
| } | |
| .aj-msg-search-btn:hover { | |
| border-color: var(--lc-accent); | |
| color: var(--lc-accent); | |
| background: var(--lc-hover); | |
| } | |
| .aj-tts-speed-btn { | |
| width: auto; | |
| padding: 0 6px; | |
| } | |
| .aj-tts-speed-label { | |
| font-size: 11px; | |
| font-weight: 700; | |
| line-height: 1; | |
| } | |
| [data-tip] { | |
| position: relative; | |
| } | |
| [data-tip]::after { | |
| content: attr(data-tip); | |
| position: absolute; | |
| bottom: calc(100% + 6px); | |
| left: 50%; | |
| transform: translateX(-50%); | |
| white-space: nowrap; | |
| font-size: 13px; | |
| padding: 5px 10px; | |
| border-radius: 6px; | |
| background: var(--lc-text); | |
| color: var(--lc-card); | |
| pointer-events: none; | |
| opacity: 0; | |
| transition: opacity 0.15s ease; | |
| z-index: 300; | |
| } | |
| [data-tip]:hover::after { | |
| opacity: 1; | |
| } | |
| /* Header: tooltips below the controls (default is above and clips off the top of the viewport). | |
| Right-side actions: anchor to the right so the label extends left into view. */ | |
| .aj-header [data-tip]::after { | |
| bottom: auto; | |
| top: calc(100% + 6px); | |
| left: auto; | |
| right: 0; | |
| transform: none; | |
| } | |
| .aj-header .aj-header-brand-link[data-tip]::after { | |
| left: 0; | |
| right: auto; | |
| } | |
| /* position: fixed + top/left/width set inline (escapes .aj-messages overflow) */ | |
| .aj-msg-search-popover { | |
| position: fixed; | |
| visibility: hidden; | |
| z-index: 250; | |
| box-sizing: border-box; | |
| min-width: 280px; | |
| padding: 12px 14px; | |
| border-radius: 12px; | |
| border: 1px solid var(--lc-border); | |
| background: var(--lc-elevated); | |
| box-shadow: var(--lc-shadow-lg); | |
| max-height: min(70vh, 520px); | |
| overflow-y: auto; | |
| } | |
| .aj-msg-search-popover-head { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-bottom: 10px; | |
| font-size: 13px; | |
| font-weight: 600; | |
| color: var(--lc-text); | |
| } | |
| .aj-msg-search-close { | |
| border: none; | |
| background: none; | |
| cursor: pointer; | |
| font-size: 18px; | |
| line-height: 1; | |
| color: var(--lc-muted); | |
| padding: 0 4px; | |
| } | |
| .aj-msg-search-close:hover { | |
| color: var(--lc-text); | |
| } | |
| .aj-msg-search-loading { | |
| font-size: 12px; | |
| color: var(--lc-muted); | |
| } | |
| .aj-msg-search-input { | |
| width: 100%; | |
| box-sizing: border-box; | |
| margin-bottom: 10px; | |
| padding: 8px 10px; | |
| border-radius: 8px; | |
| border: 1px solid var(--lc-border); | |
| background: var(--lc-input); | |
| color: var(--lc-text); | |
| font-size: 12px; | |
| line-height: 1.45; | |
| resize: vertical; | |
| min-height: 64px; | |
| font-family: inherit; | |
| } | |
| .aj-msg-search-input:focus { | |
| outline: none; | |
| border-color: var(--lc-accent); | |
| box-shadow: 0 0 0 3px var(--lc-accent-light); | |
| } | |
| .aj-msg-search-actions { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 8px; | |
| } | |
| .aj-msg-search-actions .aj-btn { | |
| width: auto; | |
| height: auto; | |
| padding: 6px 12px; | |
| font-size: 12px; | |
| font-weight: 600; | |
| } | |