diff --git a/.DS_Store b/.DS_Store index de1f640..ceb2fb9 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/demo/stacked-blocks/1.jpg b/demo/stacked-blocks/1.jpg new file mode 100644 index 0000000..cd1b886 Binary files /dev/null and b/demo/stacked-blocks/1.jpg differ diff --git a/demo/stacked-blocks/2.jpg b/demo/stacked-blocks/2.jpg new file mode 100644 index 0000000..e6fa9dd Binary files /dev/null and b/demo/stacked-blocks/2.jpg differ diff --git a/demo/stacked-blocks/3.jpg b/demo/stacked-blocks/3.jpg new file mode 100644 index 0000000..49987f1 Binary files /dev/null and b/demo/stacked-blocks/3.jpg differ diff --git a/demo/stacked-blocks/4.jpg b/demo/stacked-blocks/4.jpg new file mode 100644 index 0000000..7f41e1f Binary files /dev/null and b/demo/stacked-blocks/4.jpg differ diff --git a/demo/stacked-blocks/5.jpg b/demo/stacked-blocks/5.jpg new file mode 100644 index 0000000..3a39cd9 Binary files /dev/null and b/demo/stacked-blocks/5.jpg differ diff --git a/demo/stacked-blocks/6.jpg b/demo/stacked-blocks/6.jpg new file mode 100644 index 0000000..9252dda Binary files /dev/null and b/demo/stacked-blocks/6.jpg differ diff --git a/demo/stacked-blocks/index.html b/demo/stacked-blocks/index.html new file mode 100644 index 0000000..b4b1d6c --- /dev/null +++ b/demo/stacked-blocks/index.html @@ -0,0 +1,37 @@ + + + + + + 堆叠块拼接 Demo + + + +
+
+
+ + + + + +
+
+ · ≤6 块:下缘生长到新高度,思考默认展开,结束自动折叠。
+ · >6 块:顶部出现“更多”,只保留最近 6 块,整体高度恒定 7 行;新增时整列上移,新块自底部露出再展开。 +
+
+ +
+
+
+
还没有块,点击上方按钮体验拼接动画。
+
+
+ + +
+ + + + diff --git a/demo/stacked-blocks/script.js b/demo/stacked-blocks/script.js new file mode 100644 index 0000000..2b45762 --- /dev/null +++ b/demo/stacked-blocks/script.js @@ -0,0 +1,342 @@ +(() => { + const MAX_VISIBLE = 6; + const blocks = []; + let showAll = false; + let idSeed = 1; + let running = false; + let timers = []; + + const stackShell = document.getElementById('stackShell'); + const stackInner = document.getElementById('stackInner'); + const btnPlay = document.getElementById('playLoop'); + const btnStep = document.getElementById('stepOnce'); + const btnPause = document.getElementById('pauseLoop'); + const btnClear = document.getElementById('clearAll'); + const btnToggleAll = document.getElementById('toggleAll'); + + const samples = [ + '评估用户意图,先汇总检索关键字,再推演候选工具。', + '正在调用 web_search,拼接 query 并去重关键词。', + '校验上下文有效性,准备输出草稿。', + '工具结果将写入下一个文本块,留意引用。', + '自动回溯最近 3 条工具调用,避免重复请求。' + ]; + + const pick = () => samples[Math.floor(Math.random() * samples.length)]; + + const createBlock = type => ({ + id: `${type}-${idSeed++}`, + type, + title: type === 'thinking' ? '思考过程' : '搜索完成', + detail: pick(), + streaming: true, + expanded: type === 'thinking', + timestamp: Date.now() + }); + + const computeVisible = () => { + if (showAll || blocks.length <= MAX_VISIBLE) return [...blocks]; + const hidden = blocks.length - MAX_VISIBLE; + return [{ id: `more-${hidden}`, type: 'more', hidden }, ...blocks.slice(-MAX_VISIBLE)]; + }; + + const updateButtons = () => { + const overLimit = blocks.length > MAX_VISIBLE; + btnToggleAll.disabled = !overLimit; + btnToggleAll.textContent = showAll ? '收起到最近 6 个' : '展开全部'; + }; + + const measurePositions = () => { + const map = {}; + stackInner.querySelectorAll('[data-id]').forEach(el => { + map[el.dataset.id] = el.getBoundingClientRect(); + }); + return map; + }; + + const animateHeight = (prev, next) => { + if (prev === next) return; + stackShell.style.height = prev + 'px'; + // force reflow + stackShell.getBoundingClientRect(); + stackShell.style.transition = 'height 280ms cubic-bezier(0.25, 0.9, 0.3, 1)'; + stackShell.style.height = next + 'px'; + const clear = () => { + stackShell.style.transition = ''; + stackShell.removeEventListener('transitionend', clear); + }; + stackShell.addEventListener('transitionend', clear); + }; + + const applyFLIP = (prev, isGrowMode, addedId) => { + stackInner.querySelectorAll('[data-id]').forEach(el => { + const id = el.dataset.id; + const isMoreRow = id.startsWith('more'); + const now = el.getBoundingClientRect(); + const old = prev[id]; + + if (old) { + const dy = old.top - now.top; + if (Math.abs(dy) > 0.5) { + el.style.transform = `translateY(${dy}px)`; + el.style.transition = 'transform 220ms ease, opacity 220ms ease'; + requestAnimationFrame(() => { + el.style.transform = 'translateY(0)'; + }); + el.addEventListener( + 'transitionend', + () => { + el.style.transform = ''; + el.style.transition = ''; + }, + { once: true } + ); + } + } else { + const usePeek = !showAll && blocks.length <= MAX_VISIBLE && id === addedId; + if (usePeek) { + el.classList.add('peek'); + requestAnimationFrame(() => el.classList.remove('peek')); + } else if (isGrowMode || isMoreRow) { + el.classList.add('flow-enter'); + requestAnimationFrame(() => el.classList.add('flow-enter-active')); + el.addEventListener( + 'transitionend', + () => { + el.classList.remove('flow-enter', 'flow-enter-active'); + }, + { once: true } + ); + } else if (id === addedId) { + el.classList.add('peek'); + requestAnimationFrame(() => el.classList.remove('peek')); + } + } + }); + }; + + const createBlockRow = block => { + const row = document.createElement('div'); + row.className = `row block-row type-${block.type}`; + row.dataset.id = block.id; + + const main = document.createElement('div'); + main.className = 'row-main'; + main.addEventListener('click', () => { + block.expanded = !block.expanded; + render(); + }); + + const arrow = document.createElement('div'); + arrow.className = `arrow ${block.expanded ? 'open' : ''}`; + arrow.textContent = '›'; + + const icon = document.createElement('div'); + icon.className = 'row-icon'; + icon.textContent = block.type === 'thinking' ? '🧠' : '🔍'; + + const text = document.createElement('div'); + text.className = 'row-text'; + + const title = document.createElement('div'); + title.className = 'row-title'; + title.textContent = block.title; + + const sub = document.createElement('div'); + sub.className = 'row-sub'; + if (block.type === 'thinking') { + sub.textContent = block.streaming ? '思考中 · 默认展开' : '思考完成 · 点击查看详情'; + } else { + sub.textContent = block.streaming ? '工具调用中 · 运行后自动收起' : '工具完成 · 点击展开结果'; + } + + text.appendChild(title); + text.appendChild(sub); + + const pill = document.createElement('div'); + pill.className = `pill ${block.streaming ? '' : 'green'}`; + pill.textContent = block.streaming ? '进行中' : '已完成'; + + main.appendChild(arrow); + main.appendChild(icon); + main.appendChild(text); + main.appendChild(pill); + + const detailWrap = document.createElement('div'); + detailWrap.className = 'row-detail'; + detailWrap.style.display = block.expanded ? 'block' : 'none'; + + const detailInner = document.createElement('div'); + detailInner.className = 'row-detail-inner'; + detailInner.textContent = block.detail; + detailWrap.appendChild(detailInner); + + row.appendChild(main); + row.appendChild(detailWrap); + + if (block.streaming) { + const progress = document.createElement('div'); + progress.className = 'progress'; + row.appendChild(progress); + } + + return row; + }; + + const createMoreRow = (id, hidden) => { + const row = document.createElement('div'); + row.className = 'row more-row'; + row.dataset.id = id; + row.addEventListener('click', () => { + showAll = true; + render(); + }); + + const dot = document.createElement('div'); + dot.className = 'more-dot'; + dot.textContent = '···'; + + const text = document.createElement('div'); + const title = document.createElement('div'); + title.className = 'row-title'; + title.textContent = '更多'; + const tip = document.createElement('div'); + tip.className = 'more-tip'; + tip.textContent = `已折叠 ${hidden} 个更早的块,点击展开查看`; + text.appendChild(title); + text.appendChild(tip); + + const btn = document.createElement('button'); + btn.className = 'more-btn'; + btn.textContent = '展开'; + + row.appendChild(dot); + row.appendChild(text); + row.appendChild(btn); + return row; + }; + + const render = (options = {}) => { + const prev = measurePositions(); + const prevHeight = stackShell.getBoundingClientRect().height || 0; + const visible = computeVisible(); + stackInner.innerHTML = ''; + + if (!visible.length) { + stackShell.classList.add('empty'); + updateButtons(); + animateHeight(prevHeight, 140); + return; + } + + stackShell.classList.remove('empty'); + + visible.forEach(block => { + if (block.type === 'more') { + stackInner.appendChild(createMoreRow(block.id, block.hidden)); + } else { + stackInner.appendChild(createBlockRow(block)); + } + }); + + const isGrowMode = showAll || blocks.length <= MAX_VISIBLE; + requestAnimationFrame(() => applyFLIP(prev, isGrowMode, options.newlyAddedId)); + updateButtons(); + const nextHeight = stackInner.scrollHeight; + animateHeight(prevHeight || nextHeight, nextHeight); + }; + + const addBlock = type => { + const block = createBlock(type); + blocks.push(block); + render({ newlyAddedId: block.id }); + + // 返回 Promise,结束时机取决于类型 + return new Promise(resolve => { + if (type === 'thinking') { + timers.push( + setTimeout(() => { + block.streaming = false; + block.detail += ' · 已产出结论,等待工具。'; + render(); + }, 1200) + ); + timers.push( + setTimeout(() => { + block.expanded = false; + render(); + resolve(); + }, 2000) + ); + } else { + timers.push( + setTimeout(() => { + block.streaming = false; + block.detail = '检索到 3 条结果,已写入后续回复。'; + render(); + resolve(); + }, 1400) + ); + } + }); + }; + + const wait = ms => new Promise(r => timers.push(setTimeout(r, ms))); + + const runCycle = async () => { + const thinkingDone = await addBlock('thinking'); + await wait(200); // 给折叠留一帧 + await addBlock('tool'); + await wait(500); // 循环间隔 + }; + + const playLoop = async () => { + if (running) return; + running = true; + btnPlay.disabled = true; + btnStep.disabled = true; + btnPause.disabled = false; + while (running) { + await runCycle(); + } + btnPlay.disabled = false; + btnStep.disabled = false; + btnPause.disabled = true; + }; + + const stepOnce = async () => { + if (running) return; + btnStep.disabled = true; + await runCycle(); + btnStep.disabled = false; + }; + + const pauseLoop = () => { + running = false; + }; + + const clearAll = () => { + timers.forEach(t => clearTimeout(t)); + timers = []; + running = false; + blocks.length = 0; + showAll = false; + render(); + btnPlay.disabled = false; + btnStep.disabled = false; + btnPause.disabled = true; + }; + + btnPlay.addEventListener('click', playLoop); + btnStep.addEventListener('click', stepOnce); + btnPause.addEventListener('click', pauseLoop); + btnClear.addEventListener('click', clearAll); + btnToggleAll.addEventListener('click', () => { + if (blocks.length <= MAX_VISIBLE) return; + showAll = !showAll; + render(); + }); + + // 初始播放一轮示例,演示“先思考后工具”的顺序 + stepOnce(); +})(); diff --git a/demo/stacked-blocks/stack6.html b/demo/stacked-blocks/stack6.html new file mode 100644 index 0000000..b059062 --- /dev/null +++ b/demo/stacked-blocks/stack6.html @@ -0,0 +1,514 @@ + + + + + + ≤6 块顺序动画 Demo + + + +
+
+
+ + +
+
严格顺序:思考(展开→折叠) → 工具 → 思考 → 工具... 直至 6 块。动画曲线、展开/折叠与现有项目一致。
+
+ +
+
+
+ + +
+ + + + diff --git a/demo/stacked-blocks/stack7.html b/demo/stacked-blocks/stack7.html new file mode 100644 index 0000000..effcf5e --- /dev/null +++ b/demo/stacked-blocks/stack7.html @@ -0,0 +1,841 @@ + + + + + + ≥7 块传送带 Demo + + + +
+
+
+ + + 前 6 块动画与 stack6 完全一致;第 7 块起触发“更多”+传送带。 +
+
+ +
+
+ ⋯ 更多 + 0 条折叠 +
+
+
+ + +
+ + + + diff --git a/demo/stacked-blocks/style.css b/demo/stacked-blocks/style.css new file mode 100644 index 0000000..f9ffa39 --- /dev/null +++ b/demo/stacked-blocks/style.css @@ -0,0 +1,324 @@ +:root { + --paper: #f7f3ea; + --card: #fdfbf6; + --ink: #5b4a36; + --muted: #9a8d7d; + --line: #e9e1d6; + --shadow: 0 18px 48px rgba(91, 74, 54, 0.12); + --accent: #b98a59; + --accent-weak: rgba(185, 138, 89, 0.18); + --green: #4c9f70; + --peek-clip: inset(42% 0 0 0 round 0 0 18px 18px); +} + +* { + box-sizing: border-box; +} + +body { + margin: 0; + padding: 20px; + background: radial-gradient(circle at 20% 18%, rgba(185, 138, 89, 0.08), transparent 28%), + radial-gradient(circle at 86% 12%, rgba(76, 159, 112, 0.08), transparent 30%), + linear-gradient(180deg, #faf7f0, #f5f1e7); + font-family: "Inter", "PingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + color: var(--ink); +} + +.page { + max-width: 1080px; + margin: 0 auto; + display: flex; + flex-direction: column; + gap: 14px; +} + +.panel { + background: var(--card); + border: 1px solid var(--line); + border-radius: 16px; + box-shadow: var(--shadow); + padding: 14px 16px; +} + +.controls { + display: flex; + flex-wrap: wrap; + gap: 10px; + align-items: center; + justify-content: flex-start; +} + +button { + border: 1px solid var(--line); + background: #fff; + color: var(--ink); + border-radius: 12px; + padding: 8px 12px; + font-size: 13px; + cursor: pointer; + transition: all 150ms ease; + box-shadow: 0 6px 18px rgba(91, 74, 54, 0.08); +} + +button.primary { + background: linear-gradient(135deg, #cfa976, #b98957); + border-color: #c49556; + color: #fffdf8; + box-shadow: 0 8px 22px rgba(185, 138, 89, 0.28); +} + +button:active { + transform: translateY(1px); +} + +button:disabled { + opacity: 0.55; + cursor: not-allowed; + box-shadow: none; +} + +.hint { + color: var(--muted); + font-size: 13px; + margin-top: 6px; + line-height: 1.4; +} + +.stack-wrapper { + position: relative; +} + +.stack-shell { + position: relative; + border: 1px solid var(--line); + border-radius: 18px; + background: var(--card); + box-shadow: var(--shadow); + overflow: hidden; + transition: height 280ms cubic-bezier(0.25, 0.9, 0.3, 1), box-shadow 180ms ease; + min-height: 140px; +} + +.stack-shell.empty { + display: grid; + place-items: center; +} + +.stack-shell:not(.empty) .empty-hint { + display: none; +} + +.stack-inner { + width: 100%; +} + +.empty-hint { + color: var(--muted); + font-size: 14px; + padding: 18px 0; + text-align: center; +} + +.row { + background: transparent; +} + +.block-row { + padding: 16px 22px; + display: flex; + flex-direction: column; + gap: 8px; + border-bottom: 1px solid var(--line); + background: linear-gradient(180deg, rgba(255, 255, 255, 0.65), rgba(255, 255, 255, 0.48)); +} + +.block-row:last-child { + border-bottom: none; +} + +.row-main { + display: grid; + grid-template-columns: 22px 40px 1fr auto; + align-items: center; + gap: 12px; + cursor: pointer; +} + +.arrow { + width: 18px; + height: 18px; + display: grid; + place-items: center; + color: var(--muted); + transition: transform 240ms ease; + font-size: 18px; +} + +.arrow.open { + transform: rotate(90deg); + color: var(--accent); +} + +.row-icon { + width: 36px; + height: 36px; + border-radius: 12px; + background: #f2ede4; + display: grid; + place-items: center; + color: var(--accent); + font-size: 18px; + box-shadow: inset 0 0 0 1px rgba(91, 74, 54, 0.06); +} + +.row-text { + display: flex; + flex-direction: column; + gap: 4px; +} + +.row-title { + font-weight: 650; + color: var(--ink); +} + +.row-sub { + font-size: 13px; + color: var(--muted); +} + +.pill { + padding: 4px 10px; + border-radius: 999px; + font-size: 12px; + font-weight: 600; + border: 1px solid var(--accent-weak); + background: rgba(185, 138, 89, 0.12); + color: var(--accent); + white-space: nowrap; +} + +.pill.green { + border-color: rgba(76, 159, 112, 0.16); + background: rgba(76, 159, 112, 0.12); + color: var(--green); +} + +.row-detail { + padding-left: 64px; + padding-right: 4px; + color: var(--ink); + line-height: 1.6; + font-size: 14px; +} + +.row-detail-inner { + background: #fffdfa; + border: 1px dashed var(--line); + border-radius: 12px; + padding: 10px 12px; +} + +.progress { + height: 3px; + border-radius: 999px; + background: rgba(185, 138, 89, 0.16); + overflow: hidden; + position: relative; + margin-left: 64px; + margin-right: 10px; +} + +.progress::after { + content: ""; + position: absolute; + inset: 0; + background: linear-gradient(90deg, rgba(185, 138, 89, 0.05), rgba(185, 138, 89, 0.8), rgba(185, 138, 89, 0.05)); + animation: shimmer 1.3s linear infinite; +} + +@keyframes shimmer { + from { + transform: translateX(-40%); + } + to { + transform: translateX(40%); + } +} + +.more-row { + background: linear-gradient(180deg, #f0ebe1, #e6dece); + color: #4a3f30; + padding: 14px 18px; + border-bottom: 1px solid rgba(74, 63, 48, 0.08); + display: grid; + grid-template-columns: 32px 1fr auto; + align-items: center; + gap: 10px; + cursor: pointer; +} + +.more-dot { + width: 32px; + height: 32px; + border-radius: 12px; + background: rgba(74, 63, 48, 0.12); + display: grid; + place-items: center; + font-weight: 800; + letter-spacing: 2px; +} + +.more-tip { + font-size: 13px; + color: rgba(74, 63, 48, 0.75); +} + +.more-btn { + border: 1px solid rgba(74, 63, 48, 0.2); + background: rgba(255, 255, 255, 0.9); + color: #4a3f30; + border-radius: 10px; + padding: 6px 10px; + font-size: 12px; + cursor: pointer; + transition: all 120ms ease; +} + +.more-btn:hover { + background: #fff; + box-shadow: 0 6px 14px rgba(74, 63, 48, 0.12); +} + +.flow-enter { + max-height: 0; + opacity: 0; + transform: translateY(18px); +} + +.flow-enter-active { + max-height: 420px; + opacity: 1; + transform: translateY(0); + transition: max-height 260ms cubic-bezier(0.25, 0.9, 0.3, 1), opacity 220ms ease, transform 260ms ease; +} + +.peek { + clip-path: var(--peek-clip); + transform: translateY(18px); + opacity: 0.65; + transition: clip-path 260ms ease, transform 260ms ease, opacity 220ms ease; +} + +.block-row, +.more-row { + transition: transform 220ms ease, opacity 220ms ease; +} + +.footer-note { + color: var(--muted); + font-size: 12px; + text-align: right; + margin-top: 6px; +} diff --git a/demo/stacked-blocks/截图/截屏2025-12-31 23.59.37.png b/demo/stacked-blocks/截图/截屏2025-12-31 23.59.37.png new file mode 100644 index 0000000..d2a2d73 Binary files /dev/null and b/demo/stacked-blocks/截图/截屏2025-12-31 23.59.37.png differ diff --git a/demo/stacked-blocks/截图/截屏2025-12-31 23.59.45.png b/demo/stacked-blocks/截图/截屏2025-12-31 23.59.45.png new file mode 100644 index 0000000..595f47e Binary files /dev/null and b/demo/stacked-blocks/截图/截屏2025-12-31 23.59.45.png differ diff --git a/demo/stacked-blocks/截图/截屏2025-12-31 23.59.55.png b/demo/stacked-blocks/截图/截屏2025-12-31 23.59.55.png new file mode 100644 index 0000000..c699ea5 Binary files /dev/null and b/demo/stacked-blocks/截图/截屏2025-12-31 23.59.55.png differ diff --git a/demo/stacked-blocks/截图/截屏2025-12-31 23.59.59.png b/demo/stacked-blocks/截图/截屏2025-12-31 23.59.59.png new file mode 100644 index 0000000..1c75944 Binary files /dev/null and b/demo/stacked-blocks/截图/截屏2025-12-31 23.59.59.png differ diff --git a/demo/stacked-blocks/截屏2025-12-31 20.13.03.png b/demo/stacked-blocks/截屏2025-12-31 20.13.03.png new file mode 100644 index 0000000..c97cb14 Binary files /dev/null and b/demo/stacked-blocks/截屏2025-12-31 20.13.03.png differ diff --git a/static/demo/style/1.html b/static/demo/style/1.html new file mode 100644 index 0000000..62bca80 --- /dev/null +++ b/static/demo/style/1.html @@ -0,0 +1,112 @@ + + + + + +Light Theme Demo + + + + +
+
+
+ 搜索一下原神目前卡池是什么,写在一个文件里。 +
+ +
+
我来帮您搜索原神当前卡池信息并写入文件。
+ +
+
🔍
+
搜索完成 "原神当前卡池 2024年12月"
+
+ +
+
🔍
+
搜索完成 "原神 5.3版本卡池"
+
+ +
+
📄
+
文件创建成功 genshin_banner.txt
+
+
+ +
+
+ 输入消息... (Ctrl+Enter 发送) + +
+
+
+
+ + \ No newline at end of file diff --git a/static/demo/style/2.html b/static/demo/style/2.html new file mode 100644 index 0000000..7bf320e --- /dev/null +++ b/static/demo/style/2.html @@ -0,0 +1,111 @@ + + + + + +Dark Theme Demo + + + + +
+
+
+ > 搜索一下原神目前卡池是什么,写在一个文件里 +
+ +
+
正在执行任务序列...
+ +
+
[SEARCH]
+
Query: "原神当前卡池 2024年12月"
+
+ +
+
[SEARCH]
+
Query: "原神 5.3版本卡池"
+
+ +
+
[WRITE]
+
Created: ./temp/genshin_banner.txt
+
+
+ +
+
+ _ 输入指令... + +
+
+
+
+ + \ No newline at end of file diff --git a/static/demo/style/3.html b/static/demo/style/3.html new file mode 100644 index 0000000..1ddd566 --- /dev/null +++ b/static/demo/style/3.html @@ -0,0 +1,177 @@ + + + + + +Creative Glass Theme + + + + +
+
+
+ 搜索一下原神目前卡池是什么,写在一个文件里。 +
+ +
+
好的,我已经为您整理了卡池信息。
+ +
+
🔍
+
Web Search: Genshin Impact Banners
+
+ +
+
⚙️
+
Processing Data...
+
+ +
+
📂
+
File Saved: banner_info.txt
+
+
+ +
+
+ Ask me anything... + +
+
+
+
+ + \ No newline at end of file diff --git a/static/icons/未命名文件夹.zip b/static/icons/未命名文件夹.zip new file mode 100644 index 0000000..af74235 Binary files /dev/null and b/static/icons/未命名文件夹.zip differ diff --git a/static/icons/未命名文件夹/bot.svg b/static/icons/未命名文件夹/bot.svg new file mode 100644 index 0000000..1a622f9 --- /dev/null +++ b/static/icons/未命名文件夹/bot.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/static/icons/未命名文件夹/layers.svg b/static/icons/未命名文件夹/layers.svg new file mode 100644 index 0000000..a36c416 --- /dev/null +++ b/static/icons/未命名文件夹/layers.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icons/未命名文件夹/menu.svg b/static/icons/未命名文件夹/menu.svg new file mode 100644 index 0000000..0ec9745 --- /dev/null +++ b/static/icons/未命名文件夹/menu.svg @@ -0,0 +1,15 @@ + + + + + diff --git a/static/icons/未命名文件夹/发送.svg b/static/icons/未命名文件夹/发送.svg new file mode 100644 index 0000000..3356fc9 --- /dev/null +++ b/static/icons/未命名文件夹/发送.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icons/未命名文件夹/对话记录.svg b/static/icons/未命名文件夹/对话记录.svg new file mode 100644 index 0000000..7026581 --- /dev/null +++ b/static/icons/未命名文件夹/对话记录.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/icons/未命名文件夹/搜索.svg b/static/icons/未命名文件夹/搜索.svg new file mode 100644 index 0000000..c0ad6d9 --- /dev/null +++ b/static/icons/未命名文件夹/搜索.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/icons/未命名文件夹/新建.svg b/static/icons/未命名文件夹/新建.svg new file mode 100644 index 0000000..7384498 --- /dev/null +++ b/static/icons/未命名文件夹/新建.svg @@ -0,0 +1,14 @@ + + + + diff --git a/static/icons/未命名文件夹/用户.svg b/static/icons/未命名文件夹/用户.svg new file mode 100644 index 0000000..8e61592 --- /dev/null +++ b/static/icons/未命名文件夹/用户.svg @@ -0,0 +1,14 @@ + + + + diff --git a/static/icons/未命名文件夹/问题.svg b/static/icons/未命名文件夹/问题.svg new file mode 100644 index 0000000..c237815 --- /dev/null +++ b/static/icons/未命名文件夹/问题.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/src/components/personalization/PersonalizationDrawer.vue b/static/src/components/personalization/PersonalizationDrawer.vue index 55b1674..9f4c451 100644 --- a/static/src/components/personalization/PersonalizationDrawer.vue +++ b/static/src/components/personalization/PersonalizationDrawer.vue @@ -295,6 +295,45 @@ +
+
+
+
+

界面主题

+

在浅色、深色和 Claude 经典之间一键切换。会立即应用并保存在本地。

+
+
Beta
+
+
+ +
+

虚拟显示器保持原样;仅主界面、侧边栏与个人空间配色随主题改变。

+
+