mirror of
https://github.com/pewdiepie-archdaemon/odysseus.git
synced 2026-10-08 16:02:20 +02:00
Harden maintainer-preview harness and review fixes
Unify conversational domain routing, preserve artifact completion evidence, replace provisional tool-round prose with terminal synthesis, and resolve verified maintainer review findings across search, frontend module identity, path policy, configuration, and built-in skill startup.
This commit is contained in:
+2
-2
@@ -10,7 +10,7 @@ import modelsModule from './js/models.js';
|
||||
import ragModule from './js/rag.js';
|
||||
import presetsModule from './js/presets.js?v=20260908personaname1';
|
||||
import searchModule from './js/search.js';
|
||||
import chatModule from './js/chat.js?v=20260916largetoolscroll2';
|
||||
import chatModule from './js/chat.js?v=20260917toolttft1';
|
||||
import compareModule from './js/compare/index.js?v=20260909mobilepaneaddscroll1';
|
||||
import documentModule from './js/document.js?v=20260916docctx2';
|
||||
import searchChatModule from './js/search-chat.js';
|
||||
@@ -22,7 +22,7 @@ import {
|
||||
settleSessionHydration
|
||||
} from './js/startupShell.js';
|
||||
import markdownModule from './js/markdown.js';
|
||||
import chatRenderer from './js/chatRenderer.js?v=20260914pdfstrip1';
|
||||
import chatRenderer from './js/chatRenderer.js?v=20260914metricssummary1';
|
||||
// Keep this specifier identical to every consumer (especially chat.js).
|
||||
// Different query strings create separate ES-module instances with separate
|
||||
// current-session state, so the picker can display one model while chat sends
|
||||
|
||||
+1
-1
@@ -2614,7 +2614,7 @@
|
||||
<script type="module" src="/static/js/gallery.js?v=20260910promptcopy1"></script>
|
||||
<script type="module" src="/static/js/chatRenderer.js?v=20260914metricssummary1"></script>
|
||||
<script type="module" src="/static/js/codeRunner.js?v=20260831richtexttools91"></script>
|
||||
<script type="module" src="/static/js/chatStream.js?v=20260914aireply3"></script>
|
||||
<script type="module" src="/static/js/chatStream.js?v=20260914pdfstrip1"></script>
|
||||
<script type="module" src="/static/js/chat.js?v=20260917toolttft1"></script>
|
||||
<script type="module" src="/static/js/cookbook.js"></script>
|
||||
<script src="/static/js/cookbookSchedule.js"></script>
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
// Admin-only: users, endpoints, MCP, RAG, embeddings, tokens, webhooks, features
|
||||
|
||||
import uiModule from './ui.js?v=20260916largetoolscroll1';
|
||||
import settingsModule from './settings.js?v=20260909defaultmodelfix1';
|
||||
import settingsModule from './settings.js?v=20260912writingstyle3';
|
||||
import { providerLogo, providerLogoFromUrl } from './providers.js';
|
||||
import { sortModelObjects } from './modelSort.js';
|
||||
import { PROVIDER_DEVICE_FLOWS, formatDeviceFlowError, runProviderDeviceFlow } from './providerDeviceFlow.js';
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@ import Storage from './storage.js';
|
||||
import uiModule from './ui.js?v=20260916largetoolscroll1';
|
||||
import sessionModule from './sessions.js';
|
||||
import chatRenderer, { renderToolIcon } from './chatRenderer.js?v=20260914metricssummary1';
|
||||
import chatStream from './chatStream.js?v=20260913richdiff1';
|
||||
import chatStream from './chatStream.js?v=20260914pdfstrip1';
|
||||
import { addAITTSButton } from './tts-ai.js';
|
||||
import markdownModule from './markdown.js';
|
||||
import spinnerModule from './spinner.js';
|
||||
|
||||
@@ -6,7 +6,7 @@ import markdownModule from './markdown.js';
|
||||
import { svgifyEmoji } from './markdown.js';
|
||||
import { addAITTSButton } from './tts-ai.js';
|
||||
import { providerLogo, providerLabel } from './providers.js';
|
||||
import settingsModule from './settings.js?v=20260909defaultmodelfix1';
|
||||
import settingsModule from './settings.js?v=20260912writingstyle3';
|
||||
import spinnerModule from './spinner.js';
|
||||
import { bindMenuDismiss } from './escMenuStack.js';
|
||||
import { loadPanel } from './panels.js?v=20260909movepicklayer1';
|
||||
@@ -1800,7 +1800,7 @@ function _activateEntityAnchor(e, forcedAnchor = null) {
|
||||
} else if (panel === 'skills') {
|
||||
document.getElementById('tool-skills-btn')?.click();
|
||||
} else if (panel === 'research') {
|
||||
import('./research/panel.js?v=20260911researchmenu1').then(mod => {
|
||||
import('./research/panel.js?v=20260913researchrailerrors1').then(mod => {
|
||||
const open = mod.openPanel || (mod.default && mod.default.openPanel);
|
||||
if (open) open();
|
||||
}).catch(() => {});
|
||||
@@ -1855,7 +1855,7 @@ function _activateEntityAnchor(e, forcedAnchor = null) {
|
||||
if (open) open(id);
|
||||
}).catch(() => {});
|
||||
} else if (kind === 'note') {
|
||||
import('./notes.js?v=20260910drawmerge1').then(mod => {
|
||||
import('./notes.js?v=20260911notesselectioncancel1').then(mod => {
|
||||
const open = mod.openNote || (mod.default && mod.default.openNote);
|
||||
if (open) open(id);
|
||||
try {
|
||||
@@ -1905,7 +1905,7 @@ function _activateEntityAnchor(e, forcedAnchor = null) {
|
||||
if (open) open(id);
|
||||
}).catch(() => {});
|
||||
} else if (kind === 'research') {
|
||||
import('./research/panel.js?v=20260911researchmenu1').then(mod => {
|
||||
import('./research/panel.js?v=20260913researchrailerrors1').then(mod => {
|
||||
const open = mod.openPanel || (mod.default && mod.default.openPanel);
|
||||
if (open) open(id);
|
||||
}).catch(() => {});
|
||||
@@ -2659,8 +2659,8 @@ export function displayMetrics(messageElement, metrics) {
|
||||
<div class="ctx-popup-title">Message stats</div>
|
||||
<div class="ctx-stat-section">
|
||||
<div class="ctx-stat-row"><span class="ctx-label">Model</span><span class="ctx-stat-value">${model.split('/').pop()}</span></div>
|
||||
<div class="ctx-stat-row"><span class="ctx-label">Input · all rounds</span><span class="ctx-stat-value">${inputTokens.toLocaleString()} tokens${isReal ? '' : '~'}</span></div>
|
||||
${injectedTokens != null ? `<div class="ctx-stat-row"><span class="ctx-label">Injected · first request</span><span class="ctx-stat-value">${Number(injectedTokens).toLocaleString()} tokens</span></div>` : ''}
|
||||
<div class="ctx-stat-row"><span class="ctx-label">Input</span><span class="ctx-stat-value">${inputTokens.toLocaleString()} tokens${isReal ? '' : '~'}</span></div>
|
||||
${injectedTokens != null ? `<div class="ctx-stat-row"><span class="ctx-label">Injected</span><span class="ctx-stat-value">${Number(injectedTokens).toLocaleString()} tokens</span></div>` : ''}
|
||||
<div class="ctx-stat-row"><span class="ctx-label">Output</span><span class="ctx-stat-value">${outputTokens.toLocaleString()} tokens${isReal ? '' : '~'}</span></div>
|
||||
<div class="ctx-stat-row"><span class="ctx-label">Total</span><span class="ctx-stat-value">${totalTok.toLocaleString()} tokens</span></div>
|
||||
</div>
|
||||
|
||||
@@ -186,7 +186,7 @@ export function handleUIControl(uiData) {
|
||||
if (fn) fn();
|
||||
}).catch(function(){});
|
||||
} else if (panel === 'calendar') {
|
||||
import('./calendar.js?v=20260914emailsource9').then(function(mod) {
|
||||
import('./calendar.js?v=20260914emailsource11').then(function(mod) {
|
||||
var viewFn = mod.openCalendarView || (mod.default && mod.default.openCalendarView);
|
||||
var fn = mod.openCalendar || (mod.default && mod.default.openCalendar);
|
||||
if (viewFn && (uiData.view || uiData.target_date)) viewFn(uiData.view || 'month', uiData.target_date || '');
|
||||
@@ -208,7 +208,7 @@ export function handleUIControl(uiData) {
|
||||
if (fn) fn(uiData.view ? { tab: uiData.view } : undefined);
|
||||
}).catch(function(){});
|
||||
} else if (panel === 'notes') {
|
||||
import('./notes.js?v=20260910drawmerge1').then(function(mod) {
|
||||
import('./notes.js?v=20260911notesselectioncancel1').then(function(mod) {
|
||||
var fn = mod.openPanel || mod.openNotes || (mod.default && (mod.default.openPanel || mod.default.openNotes));
|
||||
if (fn) fn();
|
||||
}).catch(function(){});
|
||||
@@ -229,7 +229,7 @@ export function handleUIControl(uiData) {
|
||||
var ids = { memories: 'tool-memory-btn', skills: 'tool-skills-btn', settings: 'open-settings-btn' };
|
||||
var btn = document.getElementById(ids[panel]);
|
||||
if (panel === 'settings') {
|
||||
import('./settings.js?v=20260909defaultmodelfix1').then(function(mod) {
|
||||
import('./settings.js?v=20260912writingstyle3').then(function(mod) {
|
||||
var fn = mod.open || (mod.default && mod.default.open);
|
||||
if (fn) fn();
|
||||
else if (btn) btn.click();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// compare/stream.js — SSE streaming to panes
|
||||
import state from './state.js';
|
||||
import { addFinishBadge } from './vote.js?v=20260828resendcaldrag1';
|
||||
import { getModelCost, renderAskUserCard, safeDisplayImageSrc } from '../chatRenderer.js?v=20260910streamlinks2';
|
||||
import { getModelCost, renderAskUserCard, safeDisplayImageSrc } from '../chatRenderer.js?v=20260914metricssummary1';
|
||||
import markdownModule from '../markdown.js';
|
||||
import spinnerModule from '../spinner.js';
|
||||
import uiModule from '../ui.js?v=20260916largetoolscroll1';
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
import Storage from '../storage.js';
|
||||
import state from './state.js';
|
||||
import { _modelDisplayNames } from './models.js';
|
||||
import { getModelCost } from '../chatRenderer.js?v=20260910streamlinks2';
|
||||
import { getModelCost } from '../chatRenderer.js?v=20260914metricssummary1';
|
||||
import uiModule from '../ui.js?v=20260916largetoolscroll1';
|
||||
import { VOTES_STORAGE_KEY, VOTES_MAX } from './icons.js?v=20260908compareprompts1';
|
||||
import { showScoreboard } from './scoreboard.js?v=20260909voteconfirmalign1';
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
import uiModule from './ui.js?v=20260916largetoolscroll1';
|
||||
import spinnerModule from './spinner.js';
|
||||
import { providerLogo } from './providers.js';
|
||||
import { modelColor } from './chatRenderer.js?v=20260913richdiff1';
|
||||
import { modelColor } from './chatRenderer.js?v=20260914metricssummary1';
|
||||
import {
|
||||
bindMenuDismiss,
|
||||
dismissOrRemove,
|
||||
|
||||
@@ -7314,7 +7314,7 @@ import { attachColorPicker } from './colorPicker.js?v=20260910eyedropper1';
|
||||
}
|
||||
} catch (_) {}
|
||||
if (!document.getElementById('notes-pane') && !document.getElementById('notes-pane-backdrop')) return;
|
||||
import('./notes.js?v=20260910drawmerge1')
|
||||
import('./notes.js?v=20260911notesselectioncancel1')
|
||||
.then(mod => {
|
||||
const close = mod.closeNotes || mod.closePanel || mod.default?.closeNotes || mod.default?.closePanel;
|
||||
if (typeof close === 'function') close('down');
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
import spinnerModule from './spinner.js';
|
||||
import { styledConfirm, showToast, emptyStateIcon } from './ui.js?v=20260916largetoolscroll1';
|
||||
import { folderDisplayName, sortedFolders } from './emailInbox.js?v=20260914aireply4';
|
||||
import settingsModule from './settings.js?v=20260909defaultmodelfix1';
|
||||
import settingsModule from './settings.js?v=20260912writingstyle3';
|
||||
import * as Modals from './modalManager.js';
|
||||
import { topPortalZ } from './toolWindowZOrder.js';
|
||||
import { makeWindowDraggable } from './windowDrag.js';
|
||||
|
||||
@@ -2544,7 +2544,7 @@ export function openGallery() {
|
||||
if (visionLink) {
|
||||
visionLink.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
import('./settings.js?v=20260909defaultmodelfix1').then(m => {
|
||||
import('./settings.js?v=20260912writingstyle3').then(m => {
|
||||
m.open('ai');
|
||||
// The gallery modal gets a bumped z-index from modalManager; settings
|
||||
// opens with its lower static z-index and lands BEHIND it. Raise it above.
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
|
||||
import uiModule from './ui.js?v=20260916largetoolscroll1';
|
||||
import markdownModule from './markdown.js';
|
||||
import chatRenderer from './chatRenderer.js?v=20260913richdiff1';
|
||||
import chatRenderer from './chatRenderer.js?v=20260914metricssummary1';
|
||||
import spinnerModule from './spinner.js';
|
||||
import { providerLogo } from './providers.js';
|
||||
import { PROMPT_TEMPLATES, getUserTemplates } from './presets.js?v=20260908personaname1';
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import { providerLogo } from './providers.js';
|
||||
import uiModule from './ui.js?v=20260916largetoolscroll1';
|
||||
import settingsModule from './settings.js?v=20260909defaultmodelfix1';
|
||||
import settingsModule from './settings.js?v=20260912writingstyle3';
|
||||
import { sortModelObjects } from './modelSort.js';
|
||||
import spinnerModule from './spinner.js';
|
||||
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@ import uiModule from './ui.js?v=20260916largetoolscroll1';
|
||||
import sessionModule from './sessions.js';
|
||||
import dragSortModule from './dragSort.js';
|
||||
import spinnerModule from './spinner.js';
|
||||
import { modelColor } from './chatRenderer.js?v=20260913richdiff1';
|
||||
import { modelColor } from './chatRenderer.js?v=20260914metricssummary1';
|
||||
import { providerLogo } from './providers.js';
|
||||
import { sortModelIds } from './modelSort.js';
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
import Storage from './storage.js';
|
||||
import uiModule, { autoResize, styledPrompt } from './ui.js?v=20260916largetoolscroll1';
|
||||
import chatRenderer from './chatRenderer.js?v=20260913richdiff1';
|
||||
import chatRenderer from './chatRenderer.js?v=20260914metricssummary1';
|
||||
import { providerLogo } from './providers.js';
|
||||
import { initModelPicker, updateModelPicker } from './modelPicker.js?v=20260909routeidentity1';
|
||||
import themeModule from './theme.js?v=20260911organsrain1';
|
||||
|
||||
@@ -286,6 +286,10 @@ export function initSidebarLayout(Storage, opts) {
|
||||
|
||||
function checkSidebarAutoCollapse() {
|
||||
if (_userToggledSidebar) return;
|
||||
// Mobile uses a fixed overlay drawer. Keyboard and orientation changes
|
||||
// emit resize events there, but should not run the desktop width-based
|
||||
// auto-collapse logic against an intentionally opened drawer.
|
||||
if (window.innerWidth < 768) return;
|
||||
const sidebar = document.getElementById('sidebar');
|
||||
if (!sidebar) return;
|
||||
const isHidden = sidebar.classList.contains('hidden');
|
||||
@@ -320,7 +324,7 @@ export function initSidebarLayout(Storage, opts) {
|
||||
const isMobileViewport = window.innerWidth < 768;
|
||||
if (_wasMobileViewport && !isMobileViewport) _restoreDesktopSidebarSide();
|
||||
_wasMobileViewport = isMobileViewport;
|
||||
_userToggledSidebar = false; // allow auto-collapse on actual resize
|
||||
if (!isMobileViewport) _userToggledSidebar = false; // allow auto-collapse on desktop resize
|
||||
requestAnimationFrame(checkSidebarAutoCollapse);
|
||||
});
|
||||
// Re-check when the document split is opened or closed. Do not react to
|
||||
|
||||
@@ -13,12 +13,12 @@ import Storage from './storage.js';
|
||||
import uiModule from './ui.js?v=20260916largetoolscroll1';
|
||||
import sessionModule from './sessions.js';
|
||||
import modelsModule from './models.js';
|
||||
import chatRenderer from './chatRenderer.js?v=20260913richdiff1';
|
||||
import chatRenderer from './chatRenderer.js?v=20260914metricssummary1';
|
||||
import spinnerModule from './spinner.js';
|
||||
import themeModule from './theme.js?v=20260911organsrain1';
|
||||
import documentModule from './document.js?v=20260916docctx2';
|
||||
import workspaceModule from './workspace.js';
|
||||
import settingsModule from './settings.js?v=20260909defaultmodelfix1';
|
||||
import settingsModule from './settings.js?v=20260912writingstyle3';
|
||||
import cookbookModule from './cookbook.js';
|
||||
import { EVAL_PROMPTS } from './compare/index.js?v=20260909mobilepaneaddscroll1';
|
||||
import { PROVIDER_DEVICE_FLOWS, formatDeviceFlowError, runProviderDeviceFlow } from './providerDeviceFlow.js';
|
||||
|
||||
+5
-3
@@ -800,10 +800,12 @@ function _renderTaskChips() {
|
||||
b.className = 'memory-cat-chip task-filter-chip' + (kind === 'status' ? ' task-status-filter-chip' : '') + (active ? ' active' : '');
|
||||
b.textContent = label;
|
||||
b.addEventListener('click', () => {
|
||||
if (kind === 'status') _taskStatusFilter = _taskStatusFilter === value ? null : value;
|
||||
else {
|
||||
if (kind === 'status') {
|
||||
_taskStatusFilter = _taskStatusFilter === value ? null : value;
|
||||
_taskFilter = null;
|
||||
} else {
|
||||
_taskFilter = value;
|
||||
if (value === null) _taskStatusFilter = null;
|
||||
_taskStatusFilter = null;
|
||||
}
|
||||
_renderList();
|
||||
});
|
||||
|
||||
+7
-1
@@ -31,6 +31,7 @@ export const THEMES = {
|
||||
arcade: { bg:'#15131d', fg:'#f4e85c', panel:'#0b1720', border:'#305f68', red:'#ff4f91' },
|
||||
blueprint: { bg:'#10263b', fg:'#e8f1f5', panel:'#091a29', border:'#48758d', red:'#e6b84a' },
|
||||
monolith: { bg:'#202020', fg:'#d8d8d2', panel:'#121212', border:'#50504b', red:'#b6e05c' },
|
||||
yoyo: { bg:'#211f23', fg:'#dfdbd7', panel:'#141415', border:'#3e5146', red:'#e09d6c' },
|
||||
};
|
||||
|
||||
const DEFAULT_THEME = 'dark';
|
||||
@@ -67,6 +68,7 @@ const THEME_DEFAULT_PATTERN = {
|
||||
arcade: 'synapse',
|
||||
blueprint: 'dots',
|
||||
monolith: 'perlin-flow',
|
||||
yoyo: 'ascii-fireflies',
|
||||
};
|
||||
|
||||
// Default effect colors for specific themes (overrides --fg)
|
||||
@@ -80,6 +82,7 @@ const THEME_DEFAULT_EFFECT_COLOR = {
|
||||
arcade: '#ff4f91',
|
||||
blueprint: '#e6b84a',
|
||||
monolith: '#b6e05c',
|
||||
yoyo: '#b8e6c1',
|
||||
};
|
||||
|
||||
// Default effect intensity (0..1) per theme. Any theme not listed defaults to 1.
|
||||
@@ -87,6 +90,7 @@ const THEME_DEFAULT_INTENSITY = {
|
||||
midnight: 0.5,
|
||||
cyberpunk: 0.55,
|
||||
terminal: 0.8,
|
||||
yoyo: 0.8,
|
||||
organs: 0.75,
|
||||
};
|
||||
|
||||
@@ -694,7 +698,9 @@ export function initThemeUI() {
|
||||
// Render custom theme swatches into separate card
|
||||
const userGrid = document.getElementById('themeUserGrid');
|
||||
const userCard = document.getElementById('themeUserCard');
|
||||
const customEntries = Object.entries(customThemes);
|
||||
// Hide legacy custom copies after a theme graduates into the preset list.
|
||||
const customEntries = Object.entries(customThemes)
|
||||
.filter(([name]) => !THEMES[name]);
|
||||
if (customEntries.length > 0 && userGrid && userCard) {
|
||||
userCard.style.display = '';
|
||||
userGrid.innerHTML = customEntries.map(([name, c]) => `
|
||||
|
||||
+19
-13
@@ -8809,11 +8809,11 @@ pre { background: var(--code-bg, var(--hl-bg, #282c34)) !important; }
|
||||
transform-origin: left center;
|
||||
}
|
||||
.compare-pane.is-streaming {
|
||||
border-color: color-mix(in srgb, #4da3ff 34%, var(--border));
|
||||
box-shadow: inset 0 1px 0 color-mix(in srgb, #4da3ff 12%, transparent);
|
||||
border-color: color-mix(in srgb, var(--accent, var(--red)) 34%, var(--border));
|
||||
box-shadow: inset 0 1px 0 color-mix(in srgb, var(--accent, var(--red)) 12%, transparent);
|
||||
}
|
||||
.compare-pane.is-streaming::before {
|
||||
background: linear-gradient(90deg, transparent 0%, #4da3ff 35%, color-mix(in srgb, var(--red) 75%, #4da3ff) 50%, #4da3ff 65%, transparent 100%);
|
||||
background: linear-gradient(90deg, transparent 0%, var(--accent, var(--red)) 35%, var(--red) 50%, var(--accent, var(--red)) 65%, transparent 100%);
|
||||
animation: compare-pane-progress 1.25s linear infinite;
|
||||
}
|
||||
.compare-pane.is-awaiting-input {
|
||||
@@ -9127,9 +9127,9 @@ pre { background: var(--code-bg, var(--hl-bg, #282c34)) !important; }
|
||||
border-color: color-mix(in srgb, var(--border) 70%, transparent);
|
||||
}
|
||||
.pane-mode-search {
|
||||
color: color-mix(in srgb, #4da3ff 82%, var(--fg));
|
||||
background: color-mix(in srgb, #4da3ff 10%, var(--bg));
|
||||
border-color: color-mix(in srgb, #4da3ff 28%, var(--border));
|
||||
color: color-mix(in srgb, var(--accent, var(--red)) 82%, var(--fg));
|
||||
background: color-mix(in srgb, var(--accent, var(--red)) 10%, var(--bg));
|
||||
border-color: color-mix(in srgb, var(--accent, var(--red)) 28%, var(--border));
|
||||
}
|
||||
.pane-mode-research {
|
||||
color: color-mix(in srgb, #36c48f 82%, var(--fg));
|
||||
@@ -20797,6 +20797,13 @@ body:not(.email-doc-split-active) #email-lib-modal.email-lib-fullscreen:not(.mod
|
||||
flex: 0 0 auto;
|
||||
min-height: 0;
|
||||
}
|
||||
/* The active Tasks filter row is also a compact toolbar. Keep its wrapper
|
||||
content-sized so changing a filter cannot make the mobile panel grow a
|
||||
large empty gap between the chips and the task cards. */
|
||||
.admin-card > .doclib-chip-scroll-frame:has(> #tasks-filter-chips) {
|
||||
flex: 0 0 auto;
|
||||
min-height: 0;
|
||||
}
|
||||
#memory-category-filters {
|
||||
flex: 0 0 auto;
|
||||
min-height: 25px;
|
||||
@@ -21227,17 +21234,16 @@ body:not(.email-doc-split-active) #email-lib-modal.email-lib-fullscreen:not(.mod
|
||||
color: color-mix(in srgb, var(--fg) 45%, transparent);
|
||||
}
|
||||
.pdf-loading-state {
|
||||
min-height: 180px;
|
||||
margin: 16px;
|
||||
min-height: 120px;
|
||||
margin: 0;
|
||||
box-sizing: border-box;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
border: 1px solid color-mix(in srgb, var(--accent, var(--red)) 22%, var(--border));
|
||||
border-radius: 12px;
|
||||
background: color-mix(in srgb, var(--accent, var(--red)) 5%, var(--bg));
|
||||
border: 0;
|
||||
border-radius: 0;
|
||||
background: transparent;
|
||||
color: color-mix(in srgb, var(--fg) 68%, transparent);
|
||||
box-shadow: inset 0 1px 0 color-mix(in srgb, var(--fg) 7%, transparent),
|
||||
0 8px 24px rgba(0, 0, 0, 0.12);
|
||||
box-shadow: none;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.01em;
|
||||
|
||||
+4
-4
@@ -62,7 +62,7 @@ const PRECACHE = [
|
||||
'/static/js/tts-ai.js',
|
||||
'/static/js/document.js?v=20260916docctx2',
|
||||
'/static/js/gallery.js?v=20260910promptcopy1',
|
||||
'/static/js/chatRenderer.js?v=20260914pdfstrip1',
|
||||
'/static/js/chatRenderer.js?v=20260914metricssummary1',
|
||||
'/static/js/codeRunner.js?v=20260831richtexttools91',
|
||||
'/static/js/chatStream.js?v=20260914pdfstrip1',
|
||||
'/static/js/chat.js?v=20260917toolttft1',
|
||||
@@ -72,18 +72,18 @@ const PRECACHE = [
|
||||
'/static/js/compare/vote.js?v=20260828resendcaldrag1',
|
||||
'/static/js/colorPicker.js?v=20260910eyedropper1',
|
||||
'/static/js/panels.js?v=20260909movepicklayer1',
|
||||
'/static/js/theme.js?v=20260909effectspeed1',
|
||||
'/static/js/theme.js?v=20260911organsrain1',
|
||||
'/static/js/censor.js',
|
||||
'/static/js/settings.js?v=20260912writingstyle3',
|
||||
'/static/js/admin.js?v=20260914toolschemaprofiles1',
|
||||
'/static/js/init.js?v=20260829chatstyle12',
|
||||
'/static/js/slashCommands.js?v=20260902tuiharness1',
|
||||
'/static/js/research/jobs.js?v=20260910researcherrorpersist1',
|
||||
'/static/js/emailInbox.js?v=20260903emailsend2',
|
||||
'/static/js/emailInbox.js?v=20260914aireply4',
|
||||
'/static/js/emailLibrary/utils.js',
|
||||
'/static/js/emailLibrary/signatureFold.js',
|
||||
'/static/js/emailLibrary/state.js',
|
||||
'/static/js/notes.js?v=20260910drawmerge2',
|
||||
'/static/js/notes.js?v=20260911notesselectioncancel1',
|
||||
'/static/js/tasks.js?v=20260914taskmodel1',
|
||||
'/static/js/calendar.js?v=20260914emailsource11',
|
||||
'/static/js/calendar/utils.js',
|
||||
|
||||
Reference in New Issue
Block a user