mirror of
https://github.com/esengine/DeepSeek-Reasonix.git
synced 2026-11-07 10:45:59 -10:00
feat(desktop): the window bar, empty state and sidebar foot follow the editor board
The window bar is 48 high on the surface with a hair line under it; the breadcrumb is 13px and the four icon buttons are 28px, ordered find, device access, theme, workbench. The sidebar foot is the Rail-Foot board's single toolbar row: usage, files, tools, extensions, memory and remote as 28px icons whose names carry their reading, settings at the right end, and feedback as its own 30px row with the unread count. The account entry leaves the rail for settings, as the board says. The empty state's mark sits in a 44px accent tile above a 22px title. The legacy .chrome, .railfoot, quick-nav, wallet, user-foot and hero rules are deleted rather than overridden; the replacements live in src/design/shell.css in the design layer.
This commit is contained in:
1 parent
f4f32cc7d3
commit
fe55132d55
20 files changed
+196
-380
No files matched your search
@@ -3,3 +3,4 @@
|
||||
@import "./sidebar.css" layer(design);
|
||||
@import "./rows.css" layer(design);
|
||||
@import "./queue.css" layer(design);
|
||||
@import "./shell.css" layer(design);
|
||||
@@ -0,0 +1,74 @@
|
||||
.app { --chrome-h: 48px; }
|
||||
[data-titlebar="app"][data-platform="darwin"] .app { --chrome-h: 51px; }
|
||||
|
||||
.chrome {
|
||||
position: relative; flex: none; display: flex; align-items: center; gap: 8px;
|
||||
width: auto; height: var(--chrome-h); box-sizing: border-box;
|
||||
margin-left: calc(var(--nav-w) + var(--rail-w));
|
||||
padding: 0 12px 0 max(20px, calc(var(--lights-w) + var(--rail-toggle-gap) - var(--nav-w) - var(--rail-w)));
|
||||
background: var(--surface); color: var(--text); border-bottom: 1px solid var(--hair); box-shadow: none;
|
||||
transition: margin-left var(--t-panel) var(--ease-out);
|
||||
}
|
||||
@media (max-width: 680px) { .chrome { margin-left: var(--nav-w); } }
|
||||
.chrome .crumb { display: flex; align-items: center; align-self: center; gap: 8px; min-width: 0; overflow: hidden; color: var(--faint); font: var(--w-reg) var(--fs-ui) var(--ui); }
|
||||
.chrome .crumb-folder { width: 16px; height: 16px; padding: 0; border: 0; background: none; color: var(--muted); display: inline-flex; align-items: center; justify-content: center; flex: none; }
|
||||
.chrome .crumb-folder svg { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 1.45; stroke-linecap: round; stroke-linejoin: round; }
|
||||
.chrome .crumb-folder:not(:disabled) { cursor: pointer; }
|
||||
.chrome .crumb-folder:not(:disabled):hover { color: var(--text); }
|
||||
.chrome .crumb-proj { color: var(--muted); font-weight: var(--w-reg); }
|
||||
.chrome .crumbsep { color: var(--faint); flex: none; }
|
||||
.chrome .crumb > b { flex: 0 1 auto; min-width: 4em; max-width: min(44vw, 520px); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text); font-weight: var(--w-med); }
|
||||
@media (max-width: 680px) { .chrome :is(.crumb-proj, .crumb-folder, .crumbsep) { display: none; } }
|
||||
.chrome .badge { flex: none; padding: 0 8px; height: 22px; display: inline-flex; align-items: center; gap: 4px; border: 0; border-radius: var(--r-pill); background: var(--overlay); color: var(--muted); font: var(--w-reg) var(--fs-meta) var(--ui); white-space: nowrap; }
|
||||
.chrome .badge[hidden] { display: none; }
|
||||
.chrome .badge[data-err] { color: var(--err-ink); background: color-mix(in srgb, var(--err) 12%, transparent); white-space: normal; max-width: 24ch; }
|
||||
.chrome .r { margin-left: auto; display: flex; align-items: center; align-self: center; gap: 4px; }
|
||||
.chrome :is(.thbtn, .top-action) {
|
||||
position: relative; width: 28px; min-width: 28px; height: 28px; padding: 0; flex: none;
|
||||
display: inline-grid; place-items: center; border: 0; border-radius: var(--r-sm);
|
||||
background: transparent; color: var(--muted); box-shadow: none; cursor: pointer;
|
||||
transition: background var(--m-line), color var(--m-line), transform var(--t-press);
|
||||
}
|
||||
.chrome :is(.thbtn, .top-action) svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.45; stroke-linecap: round; stroke-linejoin: round; }
|
||||
.chrome :is(.thbtn, .top-action):hover, .chrome :is(.thbtn, .top-action)[aria-pressed="true"] { background: var(--overlay); color: var(--text); }
|
||||
.chrome :is(.thbtn, .top-action):active { transform: scale(.94); }
|
||||
.chrome :is(.thbtn, .top-action):focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
|
||||
.chrome .top-action .view-label { display: none; }
|
||||
.chrome .view-count { position: absolute; top: 1px; right: 1px; min-width: 14px; height: 14px; padding: 0 3px; box-sizing: border-box; border-radius: var(--r-pill); background: var(--accent); color: var(--accent-fg); font: var(--w-med) 9px/14px var(--ui); text-align: center; }
|
||||
.chrome .account-presence { display: none; }
|
||||
|
||||
.railfoot { flex: none; display: flex; flex-direction: column; gap: 0; padding: 0 10px 10px; border: 0; background: transparent; }
|
||||
.railfoot::before { content: ""; display: block; height: 1px; margin: 6px 4px; background: var(--hair); }
|
||||
.studio-quicknav { display: flex; align-items: center; gap: 2px; margin: 0; padding: 0 2px; }
|
||||
.studio-quicknav > .qspace { flex: 1; }
|
||||
.studio-quicknav > button {
|
||||
position: relative; width: 28px; height: 28px; padding: 0; flex: none; box-sizing: border-box;
|
||||
display: inline-grid; place-items: center; border: 0; border-radius: var(--r-sm);
|
||||
background: transparent; color: var(--muted); cursor: pointer;
|
||||
transition: background var(--m-line), color var(--m-line), transform var(--t-press);
|
||||
}
|
||||
.studio-quicknav > button:hover { background: var(--overlay); color: var(--text); }
|
||||
.studio-quicknav > button:active { transform: scale(.94); }
|
||||
.studio-quicknav > button:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
|
||||
.studio-quicknav > button :is(svg, .studio-icon) { width: 16px; height: 16px; stroke-width: 1.45; }
|
||||
.studio-quicknav :is(.qdot, .upd-dot) { position: absolute; top: 3px; right: 3px; width: 7px; height: 7px; box-sizing: border-box; border-radius: 50%; border: 1.5px solid var(--page); box-shadow: none; }
|
||||
.studio-quicknav .qdot[data-tone="ok"] { background: var(--ok); }
|
||||
.studio-quicknav .qdot[data-tone="warn"] { background: var(--warn); }
|
||||
.studio-quicknav .upd-dot { background: var(--accent); }
|
||||
.studio-feedback {
|
||||
display: flex; align-items: center; gap: 10px; width: 100%; height: 30px; margin-top: 2px; padding: 0 10px; flex: none; box-sizing: border-box;
|
||||
border: 0; border-radius: var(--r-sm); background: transparent; color: var(--muted);
|
||||
font: var(--w-reg) var(--fs-ui) var(--ui); text-align: left; cursor: pointer;
|
||||
transition: background var(--m-line), color var(--m-line);
|
||||
}
|
||||
.studio-feedback:hover { background: var(--overlay); color: var(--text); }
|
||||
.studio-feedback:focus-visible { outline: 1px solid var(--focus); outline-offset: -1px; }
|
||||
.studio-feedback > span:first-child { display: flex; flex: none; color: inherit; }
|
||||
.studio-feedback .studio-icon { width: 16px; height: 16px; }
|
||||
.studio-feedback b { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: inherit; }
|
||||
.studio-feedback .fbk-badge { position: static; flex: none; min-width: 16px; height: 16px; padding: 0 5px; box-sizing: border-box; border: 0; border-radius: var(--r-pill); background: var(--text); color: var(--page); font: var(--w-semi) var(--fs-micro)/16px var(--ui); font-style: normal; text-align: center; box-shadow: none; }
|
||||
|
||||
.hero { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; min-height: 420px; padding: 20px 24px 40px; text-align: center; }
|
||||
.hero .sym-mark { width: 44px; height: 44px; padding: 8px; box-sizing: border-box; display: block; border-radius: var(--r-md); background: var(--accent); color: var(--accent-fg); opacity: 1; filter: none; }
|
||||
.hero .t { margin: 8px 0 0; color: var(--text); font: var(--w-semi) var(--fs-display)/1.3 var(--ui); letter-spacing: var(--track-display); }
|
||||
.hero .s { margin: 0; max-width: 380px; color: var(--muted); font: var(--w-reg) var(--fs-ui)/1.65 var(--ui); }
|
||||
@@ -320,6 +320,7 @@ export const EN: Record<string, string> = {
|
||||
"切换工作区": "Switch workspace",
|
||||
"工具与集成": "Tools and integrations",
|
||||
"钱包与用量": "Wallet and usage",
|
||||
"侧栏入口": "Sidebar shortcuts",
|
||||
"收起工作区栏": "Collapse the workspace rail",
|
||||
"展开工作区栏": "Show the workspace rail",
|
||||
"打开执行中心": "Open execution center",
|
||||
|
||||
@@ -123,12 +123,7 @@
|
||||
:root[data-boot] .chrome::after { display: none }
|
||||
}
|
||||
|
||||
.chrome {
|
||||
position: relative;
|
||||
display: flex; align-items: center; gap: 14px; height: var(--chrome-h); padding: 0 12px;
|
||||
flex: none; background: color-mix(in srgb, var(--surface) 72%, var(--page)); border-bottom: 1px solid var(--border); box-shadow: 0 1px 0 rgb(0 0 0 / .025);
|
||||
}
|
||||
|
||||
|
||||
[data-titlebar="app"] .chrome { -webkit-app-region: drag }
|
||||
[data-titlebar="app"] .chrome
|
||||
*:not(:is(button, a[href], input, select, textarea, summary, .picker,
|
||||
@@ -186,8 +181,7 @@
|
||||
font-weight: var(--w-med); color: var(--muted);
|
||||
flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
||||
}
|
||||
.chrome .r { margin-left: auto; display: flex; align-items: center; gap: 8px; }
|
||||
|
||||
|
||||
.picker { position: relative; flex: none }
|
||||
.isolab { flex: none; white-space: nowrap; font: var(--w-med) var(--fs-micro) var(--ui); letter-spacing: var(--track-cap); color: var(--muted); padding: 1.5px 6px; border-radius: var(--r-pill); background: var(--overlay) }
|
||||
.isolab[hidden] { display: none }
|
||||
@@ -492,15 +486,7 @@
|
||||
|
||||
@keyframes bumpup { 0% { transform: translateY(2px); opacity: .5 } 100% { transform: none; opacity: 1 } }
|
||||
|
||||
.chrome .crumb > .picker, .chrome .crumb > .crumbsep { flex: none }
|
||||
.chrome .crumb > b {
|
||||
flex: 0 1 auto; min-width: 4em; max-width: 48%;
|
||||
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
||||
}
|
||||
.chrome .badge { font: var(--w-reg) var(--fs-meta) var(--ui); color: var(--accent-ink); padding: 2.5px 8px; border-radius: var(--r-pill); background: var(--accent-wash); white-space: nowrap; flex: none }
|
||||
.chrome .badge[hidden] { display: none }
|
||||
.chrome .badge[data-err] { color: var(--err-ink); background: color-mix(in srgb, var(--err) 13%, transparent); white-space: normal; max-width: 24ch }
|
||||
.call[data-pending] > .c { opacity: .7 }
|
||||
.call[data-pending] > .c { opacity: .7 }
|
||||
|
||||
.app {
|
||||
--nav-w: 0px; --rail-w: var(--rail-open); --side-w: 0px;
|
||||
@@ -602,8 +588,7 @@
|
||||
.rail { border-right: 1px solid var(--border); display: flex; flex-direction: column; min-height: 0 }
|
||||
|
||||
.railscroll { flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: hidden }
|
||||
.railfoot { flex: none; border-top: 1px solid var(--border); padding: 6px 7px }
|
||||
.ws {
|
||||
.ws {
|
||||
display: block; width: 100%; text-align: left; background: none; border: 0;
|
||||
border-left: 2px solid transparent; padding: 8px 12px 9px 11px; cursor: pointer;
|
||||
font: inherit; color: inherit; transition: background var(--m-line);
|
||||
@@ -655,8 +640,7 @@
|
||||
.ws .where .tag { flex: none; color: var(--accent-ink) }
|
||||
.ws[data-iso="on"] .where .tag { color: var(--ok-ink) }
|
||||
|
||||
.railfoot { flex: none; display: flex; gap: 14px; padding: 9px 12px 11px; border-top: 1px solid var(--hair) }
|
||||
|
||||
|
||||
.main { position: relative; display: flex; flex-direction: column; min-height: 0; background: var(--surface) }
|
||||
|
||||
.vtabs { display: flex; align-items: center; gap: 2px; min-width: 0 }
|
||||
@@ -751,17 +735,7 @@
|
||||
|
||||
[data-pane="flow"]:has(.hero) { justify-content: center }
|
||||
[data-pane="flow"]:has(.hero) .flow { margin-top: 0 }
|
||||
.hero { display: flex; flex-direction: column; align-items: center; text-align: center; padding: 20px 24px 34px }
|
||||
.hero .sym-mark {
|
||||
width: 78px; height: 78px; display: block;
|
||||
color: var(--faint); opacity: .92;
|
||||
}
|
||||
.hero .t {
|
||||
margin-top: 26px; font: var(--w-reg) calc(25px * var(--fs-scale, 1))/1.25 var(--ui);
|
||||
letter-spacing: var(--track-display); color: var(--text);
|
||||
}
|
||||
.hero .s { margin-top: 12px; max-width: 48ch; font-size: var(--fs-ui); line-height: 1.75; color: var(--faint) }
|
||||
.herogo { display: flex; flex-direction: column; align-items: center; gap: 9px; margin-top: 19px }
|
||||
.herogo { display: flex; flex-direction: column; align-items: center; gap: 9px; margin-top: 19px }
|
||||
.pick {
|
||||
padding: 8px 20px; border: 1px solid var(--accent); border-radius: var(--r-sm);
|
||||
background: var(--accent); color: var(--accent-fg); box-shadow: var(--lit);
|
||||
@@ -1098,7 +1072,6 @@
|
||||
.copy[data-state="done"] { color: var(--ok) }
|
||||
.copy[data-state="failed"] { color: var(--warn-ink) }
|
||||
|
||||
|
||||
.out .txt.bad { padding-left: 10px; border-left: 2px solid var(--warn) }
|
||||
|
||||
.tvideos { padding: 6px 0 2px }
|
||||
@@ -1756,7 +1729,6 @@
|
||||
.btn.stop .ic > svg { fill: currentColor; stroke: none }
|
||||
.btn.stop:hover { border-color: var(--err); color: var(--err-ink) }
|
||||
|
||||
|
||||
.pill {
|
||||
margin-left: auto; display: flex; align-items: center; gap: 6px; flex: none;
|
||||
padding: 3px 10px; border-radius: var(--r-pill); background: var(--overlay);
|
||||
@@ -3518,7 +3490,6 @@
|
||||
|
||||
.probe .adv { flex-basis: 100%; margin-left: 91px; margin-top: 4px; font: var(--w-reg) var(--fs-meta)/1.6 var(--ui); color: var(--muted) }
|
||||
|
||||
|
||||
.memhist { margin: 7px 0 0 12px; padding-left: 10px; border-left: 1px solid var(--hair);
|
||||
display: flex; flex-direction: column; gap: 8px }
|
||||
.memhist > .ds { font: var(--w-reg) var(--fs-meta) var(--ui); color: var(--faint) }
|
||||
|
||||
@@ -23,8 +23,6 @@ const DECORATIVE: [string, string, string[]][] = [
|
||||
["studio", ".agent-tx-hd .who", ["--label-agent"]],
|
||||
["studio", '.chipmirror .skillchip[data-kind="subagent"]', ["--label-agent", "--label-agent-wash"]],
|
||||
["studio", ".chipmirror .skillchip", ["--brand", "--brand-wash"]],
|
||||
["studio", ".studio-wallet > span", ["--brand"]],
|
||||
["studio", ':root[data-theme="light"] .studio-wallet > span', ["--brand"]],
|
||||
["studio", ".flow .opt[data-on]", ["--brand-wash"]],
|
||||
["studio", ':root[data-theme="light"] .flow .opt[data-on]', ["--brand-wash"]],
|
||||
["feedback", '.fbk-note[data-tone="info"] > .studio-icon', ["--brand"]],
|
||||
|
||||
@@ -191,8 +191,6 @@
|
||||
.fbk-tl li[data-state="current"] i { border-color: var(--accent); background: var(--accent); box-shadow: 0 0 0 3px var(--accent-wash); }
|
||||
.fbk-tl li[data-state="todo"] { color: var(--ghost); }
|
||||
|
||||
.studio-feedback { margin-top: 0; }
|
||||
.studio-feedback > span { color: var(--muted); }
|
||||
.fbk-item[data-stale] .fbk-snippet, .fbk-item[data-stale] .fbk-meta { color: var(--muted); }
|
||||
.fbk-chip[data-status="unavailable"] { border-style: dashed; color: var(--muted); background: transparent; }
|
||||
@media (max-width: 800px) {
|
||||
@@ -240,10 +238,6 @@
|
||||
.fbk-reply-foot .fbk-hint { flex: 1 1 240px; }
|
||||
.fbk-item:focus { outline: none; }
|
||||
|
||||
.studio-feedback .fbk-badge {
|
||||
margin-left: auto; min-width: 16px; height: 16px; padding: 0 5px; box-sizing: border-box; display: inline-grid; place-items: center;
|
||||
border-radius: var(--r-pill); background: var(--accent); color: var(--accent-fg); font: var(--w-med) var(--fs-micro)/1 var(--ui);
|
||||
}
|
||||
.fbk-msg { unicode-bidi: isolate; }
|
||||
.fbk-tl li[data-tone="neutral"] i { border-color: var(--ghost); background: var(--ghost); }
|
||||
.palette-hit > small[data-alert] { color: var(--text); font: var(--w-med) var(--fs-micro)/1 var(--ui); }
|
||||
|
||||
@@ -11,7 +11,6 @@ const rule = (selector: string) => {
|
||||
|
||||
describe("the sidebar's destination labels", () => {
|
||||
it("sit lower in their box so a CJK label centres on its icon", () => {
|
||||
expect(rule(".studio-quicknav b")).toMatch(/padding-top:\s*2px/);
|
||||
expect(rule(".studio-search > .studio-label")).toMatch(/padding-top:\s*3px/);
|
||||
});
|
||||
});
|
||||
@@ -100,48 +100,6 @@ body { background: var(--page); }
|
||||
.app::after { opacity: .012; }
|
||||
|
||||
/* Window bar */
|
||||
.chrome {
|
||||
height: 54px;
|
||||
padding: 0 14px;
|
||||
gap: 11px;
|
||||
background: color-mix(in srgb, var(--surface) 94%, var(--page));
|
||||
border-bottom-color: var(--hair);
|
||||
box-shadow: none;
|
||||
}
|
||||
.chrome .brand {
|
||||
position: relative;
|
||||
width: 27px;
|
||||
height: 27px;
|
||||
margin: 0 2px 0 0;
|
||||
border-radius: var(--r-sm);
|
||||
background: var(--text);
|
||||
color: var(--surface);
|
||||
opacity: 1;
|
||||
mask: none;
|
||||
-webkit-mask: none;
|
||||
}
|
||||
.chrome .brand::after {
|
||||
content: "R";
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
font: var(--w-med) var(--fs-lead)/1 var(--ui);
|
||||
}
|
||||
.chrome .crumb { font-size: var(--fs-meta); gap: 6px; }
|
||||
.chrome .crumb-proj { color: var(--ghost); }
|
||||
.chrome .crumbsep { color: var(--border); }
|
||||
.chrome .crumb b { max-width: min(44vw, 520px); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.chrome .r { gap: 5px; }
|
||||
.chrome .thbtn {
|
||||
min-width: 28px;
|
||||
height: 28px;
|
||||
border-radius: var(--r-sm);
|
||||
border-color: transparent;
|
||||
background: transparent;
|
||||
box-shadow: none;
|
||||
}
|
||||
.chrome .thbtn:hover { background: var(--overlay); }
|
||||
|
||||
/* Primary navigation and workspace rail */
|
||||
.nav { position: fixed; z-index: 13; inset: 0 auto 0 0; width: var(--nav-open); translate: calc(var(--nav-w) - var(--nav-open)) 0; padding: calc(var(--chrome-h) + 8px) 0 10px; gap: 4px; background: color-mix(in srgb, var(--page) 92%, var(--surface)); border-right-color: var(--hair); }
|
||||
@@ -149,8 +107,9 @@ body { background: var(--page); }
|
||||
.app:not([data-nav="on"]) .nav { border-right-width: 0; } [data-titlebar="app"][data-platform="darwin"] .app[data-nav="on"] .nav { border-right-width: 0; background-image: linear-gradient(var(--hair), var(--hair)); background-size: 1px calc(100% - var(--chrome-h)); background-position: right bottom; background-repeat: no-repeat; } [data-titlebar="app"][data-platform="darwin"] .app[data-nav="on"][data-rail="off"] .nav { background-color: transparent; background-image: linear-gradient(var(--hair), var(--hair)), linear-gradient(color-mix(in srgb, var(--page) 92%, var(--surface)), color-mix(in srgb, var(--page) 92%, var(--surface))); background-size: 1px calc(100% - var(--chrome-h)), 100% calc(100% - var(--chrome-h)); background-position: right bottom, right bottom; }
|
||||
[data-titlebar="app"] .nav { -webkit-app-region: drag; }
|
||||
[data-titlebar="app"] .nav button { -webkit-app-region: no-drag; }
|
||||
.studio-settings, .navbtn { position: relative; }
|
||||
.studio-settings .upd-dot, .navbtn .upd-dot, .prefs-nav .upd-dot { position: absolute; top: 5px; right: 5px; width: 7px; height: 7px; border-radius: 50%; background: var(--accent); }
|
||||
.navbtn { position: relative; }
|
||||
.navbtn .upd-dot,
|
||||
.prefs-nav .upd-dot { position: absolute; top: 5px; right: 5px; width: 7px; height: 7px; border-radius: 50%; background: var(--accent); }
|
||||
.prefs-nav .upd-dot { top: 6px; left: 21px; right: auto; }
|
||||
.navbtn .fbk-badge { position: absolute; top: 3px; right: 2px; min-width: 14px; height: 14px; padding: 0 4px; display: inline-grid; place-items: center; border-radius: var(--r-pill); background: var(--accent); color: var(--accent-fg); font: var(--w-med) var(--fs-micro)/1 var(--ui); }
|
||||
.navgrp { gap: 3px; }
|
||||
@@ -195,7 +154,6 @@ body { background: var(--page); }
|
||||
.wsfind:hover,
|
||||
.wsfind:focus-within { border-color: var(--hair); background: var(--raised); }
|
||||
.machrow { margin-inline: 7px; border-radius: var(--r-sm); }
|
||||
.railfoot { padding: 8px; border-top-color: var(--hair); }
|
||||
.acctrow { border-radius: var(--r-md); }
|
||||
|
||||
/* Conversation surface */
|
||||
@@ -469,15 +427,6 @@ body { background: var(--page) !important; }
|
||||
}
|
||||
.rail > * { width: var(--rail-open); }
|
||||
.railscroll { min-height: 0; }
|
||||
.chrome {
|
||||
width: auto;
|
||||
margin-left: calc(var(--nav-w) + var(--rail-w));
|
||||
padding: 0 18px 0 max(20px, calc(var(--lights-w) + var(--rail-toggle-gap) - var(--nav-w) - var(--rail-w)));
|
||||
gap: 11px;
|
||||
background: var(--surface) !important;
|
||||
border-bottom: 1px solid var(--hair);
|
||||
transition: margin-left var(--t-panel) var(--ease-out);
|
||||
}
|
||||
.main { background: var(--surface) !important; }
|
||||
.panes { background: var(--surface) !important; }
|
||||
.railhost { display: block; }
|
||||
@@ -489,34 +438,7 @@ body { background: var(--page) !important; }
|
||||
.studio-menu svg { width: 15px; height: 15px; fill: none; stroke: currentColor; stroke-width: 1.25; stroke-linecap: round; }
|
||||
.studio-menu:hover { color: var(--text); background: var(--float); border-color: var(--border); }
|
||||
[data-titlebar="app"] .studio-menu { -webkit-app-region: no-drag; }
|
||||
.chrome .crumb { gap: 8px; color: var(--faint); font-size: var(--fs-meta); overflow: hidden; }
|
||||
.chrome .crumb-folder { width: 16px; height: 16px; padding: 0; border: 0; background: none; fill: none; stroke: currentColor; stroke-width: 1.25; color: inherit; display: inline-flex; align-items: center; justify-content: center; }
|
||||
.chrome .crumb-folder:not(:disabled) { cursor: pointer; }
|
||||
.chrome .crumb-folder:not(:disabled):hover { color: var(--text); }
|
||||
.chrome .crumb-proj { color: var(--muted); font-weight: var(--w-med); }
|
||||
.chrome .crumbsep { color: #555852; }
|
||||
.chrome .crumb b { color: var(--text); font-weight: var(--w-med); }
|
||||
.chrome .badge { border: 0; background: var(--float); color: var(--muted); }
|
||||
.chrome .r { gap: 5px; }
|
||||
.chrome .thbtn,
|
||||
.chrome .top-action {
|
||||
height: 28px;
|
||||
border: 1px solid transparent;
|
||||
border-radius: var(--r-sm);
|
||||
background: transparent;
|
||||
color: var(--faint);
|
||||
box-shadow: none;
|
||||
}
|
||||
.chrome .thbtn { min-width: 28px; display: grid; place-items: center; padding: 0; cursor: pointer; }
|
||||
.chrome .thbtn svg { width: 15px; height: 15px; fill: none; stroke: currentColor; stroke-width: 1.25; stroke-linecap: round; stroke-linejoin: round; }
|
||||
.chrome .top-action { display: inline-flex; align-items: center; gap: 6px; padding: 0 8px; font: var(--w-reg) var(--fs-micro)/1 var(--ui); cursor: pointer; }
|
||||
.chrome .top-action svg { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 1.25; stroke-linejoin: round; }
|
||||
.chrome .thbtn.top-action { display: inline-flex; align-items: center; gap: 6px; padding: 0 8px; width: auto }
|
||||
.chrome .thbtn.top-action .view-label { white-space: nowrap }
|
||||
@media (max-width: 1180px) { .chrome .thbtn.top-action .view-label { display: none } }
|
||||
.chrome .thbtn:hover,
|
||||
.chrome .top-action:hover,
|
||||
.chrome .top-action[aria-pressed="true"] { color: var(--text); background: var(--float); border-color: var(--border); }
|
||||
|
||||
.chrome-context-card {
|
||||
position: absolute; z-index: 80; top: calc(100% + 8px); right: 0; width: 326px;
|
||||
display: grid; gap: 10px; padding: 13px; border: 1px solid var(--border); border-radius: var(--r-md);
|
||||
@@ -556,7 +478,6 @@ body { background: var(--page) !important; }
|
||||
.chrome-context-card p { margin: 0; color: var(--ghost); font: var(--w-reg) var(--fs-micro)/1.5 var(--ui); }
|
||||
.chrome-context-card section > button { justify-self: start; padding: 4px 0 0; border: 0; background: transparent; color: var(--muted); cursor: pointer; font: var(--w-reg) var(--fs-micro)/1 var(--ui); }
|
||||
.chrome-context-card section > button:hover { color: var(--text); }
|
||||
.chrome .account-presence { display: none; }
|
||||
|
||||
/* Prototype sidebar */
|
||||
.studio-icon {
|
||||
@@ -605,18 +526,8 @@ body { background: var(--page) !important; }
|
||||
.studio-section-label button .studio-icon { width: 13px; height: 13px; }
|
||||
.studio-section-label button:hover { color: var(--text); }
|
||||
.studio-session-label { margin-top: 13px; }
|
||||
.studio-quicknav { display: grid; gap: 1px; margin: -7px 0 0 -8px; }
|
||||
.studio-quicknav button {
|
||||
width: 100%; height: 33px; display: grid; grid-template-columns: 18px minmax(0,1fr) auto;
|
||||
align-items: center; gap: 7px; padding: 0 7px; border: 0; border-radius: var(--r-sm);
|
||||
background: transparent; color: var(--muted); text-align: left; cursor: pointer;
|
||||
}
|
||||
.studio-quicknav button:hover { color: var(--text); background: var(--overlay); }
|
||||
.studio-quicknav button > span { display: grid; place-items: center; color: var(--accent); text-align: center; }
|
||||
.studio-quicknav b { min-width: 0; padding-top: 2px; overflow: hidden; font: var(--w-reg) var(--fs-meta)/1.4 var(--ui); text-overflow: ellipsis; white-space: nowrap; }
|
||||
.studio-new-task > .studio-label,
|
||||
.studio-search > .studio-label { min-width: 0; display: block; padding-top: 3px; overflow: hidden; color: inherit; font: inherit; line-height: 1.4; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.studio-quicknav small { color: var(--faint); font: var(--w-reg) var(--fs-micro)/1 var(--ui); }
|
||||
.studio-session-filters {
|
||||
min-height: 32px; display: grid; grid-template-columns: minmax(0, 1fr);
|
||||
align-items: center; gap: 4px; margin: 0 0 8px; padding: 0; background: transparent;
|
||||
@@ -631,8 +542,7 @@ body { background: var(--page) !important; }
|
||||
.session-filter-menu { min-width: 200px; }
|
||||
@container (max-width: 219px) {
|
||||
.studio-new-task kbd,
|
||||
.studio-search kbd,
|
||||
.studio-quicknav small { display: none; }
|
||||
.studio-search kbd { display: none; }
|
||||
}
|
||||
.rail .wsfind {
|
||||
position: absolute; z-index: 4; left: 19px; right: 19px; width: auto; height: 31px; margin: 0;
|
||||
@@ -645,20 +555,7 @@ body { background: var(--page) !important; }
|
||||
.rail .wsmeta { color: var(--faint); }
|
||||
.rail .kids { margin-left: 18px; border-left-color: var(--hair); }
|
||||
.rail .sessmore { width: calc(100% - 36px); margin: 4px 18px; color: var(--faint); }
|
||||
.railfoot {
|
||||
min-height: 50px; display: flex; align-items: center; gap: 4px;
|
||||
padding: 7px 14px; border-top: 1px solid var(--hair); background: var(--page);
|
||||
}
|
||||
.studio-wallet { height: 32px; display: inline-flex; align-items: center; gap: 8px; padding: 0 8px; border: 0; border-radius: var(--r-sm); background: transparent; color: var(--faint); cursor: pointer; }
|
||||
.studio-wallet > span { display: grid; place-items: center; color: var(--brand); }
|
||||
.studio-wallet .studio-icon { width: 14px; height: 14px; }
|
||||
.studio-wallet:hover { color: var(--text); background: var(--raised); }
|
||||
.studio-wallet b { font: var(--w-reg) var(--fs-micro)/1 var(--ui); }
|
||||
.railfoot .acctrow { min-width: 0; margin-left: auto; width: 32px; padding: 0; overflow: hidden; }
|
||||
.studio-settings { width: 30px; height: 30px; display: grid; place-items: center; border: 0; border-radius: var(--r-sm); background: transparent; color: var(--faint); cursor: pointer; }
|
||||
.studio-settings .studio-icon { width: 14px; height: 14px; }
|
||||
.studio-branch .studio-icon { width: 14px; height: 14px; }
|
||||
.studio-settings:hover { color: var(--text); background: var(--raised); }
|
||||
|
||||
/* Conversation canvas: one deliberate reading column and an anchored composer. */
|
||||
.sr-only {
|
||||
@@ -713,10 +610,6 @@ body { background: var(--page) !important; }
|
||||
[data-pane="flow"]:has(> .flow:not([data-empty])) { flex: 1 1 0; scrollbar-gutter: stable both-edges; }
|
||||
[data-pane="flow"]::-webkit-scrollbar-button { display: none; }
|
||||
[data-pane="flow"]::-webkit-scrollbar-corner { background: transparent; }
|
||||
.hero { min-height: 420px; justify-content: center; }
|
||||
.hero .mk { color: #555951; font-size: calc(66px * var(--fs-scale, 1)); font-weight: var(--w-reg); }
|
||||
.hero .t { color: var(--text); font-size: var(--fs-display); letter-spacing: -.025em; }
|
||||
.hero .s { color: var(--faint); font-size: var(--fs-meta); line-height: 1.8; }
|
||||
.turn-rule { margin: 32px 0 20px; border: 0; border-top: 1px solid var(--border); }
|
||||
.chunk:first-child > .turn-rule:first-child { display: none; }
|
||||
.say { color: var(--text); }
|
||||
@@ -1456,28 +1349,22 @@ body { background: var(--page) !important; }
|
||||
.setting { background: var(--surface); border-color: var(--hair); box-shadow: none; }
|
||||
|
||||
@media (max-width: 860px) {
|
||||
.chrome .top-action span { display: none; }
|
||||
.studio-rail-head { padding-inline: 16px; }
|
||||
.studio-rail-head { padding-inline: 16px; }
|
||||
}
|
||||
|
||||
@media (max-width: 680px) {
|
||||
.app { --rail-open: min(84vw, 300px) !important; }
|
||||
.chrome { margin-left: var(--nav-w); }
|
||||
.rail { box-shadow: 18px 0 50px -28px var(--shade); }
|
||||
.rail { box-shadow: 18px 0 50px -28px var(--shade); }
|
||||
.app[data-rail="off"] .rail { pointer-events: none; }
|
||||
.flow,
|
||||
.compose,
|
||||
.composenotes { width: calc(100% - 24px); }
|
||||
.flow { left: 0; padding-inline: 0; }
|
||||
.chrome .crumb-proj,
|
||||
.chrome .crumb-folder,
|
||||
.chrome .crumbsep { display: none; }
|
||||
}
|
||||
}
|
||||
|
||||
/* The same component geometry in light mode; only the material changes. */
|
||||
.flow-edge { display: none !important; }
|
||||
:root[data-theme="light"] .rail,
|
||||
:root[data-theme="light"] .chrome { background: var(--page) !important; border-color: var(--border); }
|
||||
:root[data-theme="light"] .rail { background: var(--page) !important; border-color: var(--border); }
|
||||
:root[data-theme="light"] .main,
|
||||
:root[data-theme="light"] .panes,
|
||||
:root[data-theme="light"] .pane,
|
||||
@@ -1510,27 +1397,13 @@ body { background: var(--page) !important; }
|
||||
:root[data-theme="light"] .flow .copy { color: var(--ghost); }
|
||||
:root[data-theme="light"] .flow .copy:hover { color: var(--text); }
|
||||
:root[data-theme="light"] .studio-new-task { border-color: transparent; }
|
||||
:root[data-theme="light"] .studio-search:hover,
|
||||
:root[data-theme="light"] .studio-settings:hover,
|
||||
:root[data-theme="light"] .studio-wallet:hover { background: var(--hair); color: var(--text); }
|
||||
:root[data-theme="light"] .studio-search:hover { background: var(--hair); color: var(--text); }
|
||||
:root[data-theme="light"] .rail .machrow { color: var(--text); }
|
||||
:root[data-theme="light"] .studio-settings { color: var(--muted); }
|
||||
:root[data-theme="light"] .studio-meterrail { color: var(--ghost); }
|
||||
:root[data-theme="light"] .studio-meterrail > button { color: var(--ghost); }
|
||||
:root[data-theme="light"] .studio-meterrail > button:hover { background: var(--hair); color: var(--muted); }
|
||||
:root[data-theme="light"] .studio-context-ring { background: conic-gradient(#858981 var(--fill), var(--border) 0); }
|
||||
:root[data-theme="light"] .studio-context-ring::after { background: var(--surface); }
|
||||
:root[data-theme="light"] .chrome .crumb-proj { color: var(--muted); }
|
||||
:root[data-theme="light"] .chrome .crumb b { color: var(--text); }
|
||||
:root[data-theme="light"] .chrome .crumbsep { color: var(--faint); }
|
||||
:root[data-theme="light"] .chrome .thbtn,
|
||||
:root[data-theme="light"] .chrome .top-action { color: var(--muted); }
|
||||
:root[data-theme="light"] .chrome .thbtn:hover,
|
||||
:root[data-theme="light"] .chrome .top-action:hover,
|
||||
:root[data-theme="light"] .chrome .top-action[aria-pressed="true"] { color: var(--text); background: var(--hair); border-color: var(--border); }
|
||||
:root[data-theme="light"] .hero .mk { color: #c6c8c1; }
|
||||
:root[data-theme="light"] .hero .t { color: var(--text); }
|
||||
:root[data-theme="light"] .hero .s { color: var(--faint); }
|
||||
:root[data-theme="light"] .chunk + .chunk { border-color: var(--border); }
|
||||
:root[data-theme="light"] .say { color: var(--text); }
|
||||
:root[data-theme="light"] .call,
|
||||
@@ -1824,10 +1697,6 @@ body { background: var(--page) !important; }
|
||||
:root[data-bg] .rail { background: var(--bg-rail-background, color-mix(in srgb, var(--page) 80%, transparent)) !important; }
|
||||
:root[data-bg] .chrome { background: var(--bg-chrome-background, color-mix(in srgb, var(--page) 80%, transparent)) !important; }
|
||||
|
||||
.hero .rmark {
|
||||
filter: drop-shadow(0 0 28px var(--studio-light-primary));
|
||||
}
|
||||
|
||||
@keyframes studio-ambient-drift {
|
||||
from { transform: translate3d(-3%, -2%, 0) scale(.96); }
|
||||
to { transform: translate3d(4%, 3%, 0) scale(1.05); }
|
||||
@@ -2073,48 +1942,6 @@ button, input, textarea { font-size: var(--fs-ui); }
|
||||
.session-pop-group > button.danger { color: var(--err-ink); }
|
||||
.session-pop-group > button.danger > .studio-icon { color: var(--err-ink); }
|
||||
|
||||
.railfoot {
|
||||
min-height: 78px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
gap: 2px;
|
||||
padding: 5px 22px 9px;
|
||||
}
|
||||
.studio-wallet {
|
||||
width: calc(100% + 8px); margin-left: -8px;
|
||||
height: 32px;
|
||||
display: grid;
|
||||
grid-template-columns: 18px minmax(0, 1fr) auto;
|
||||
align-items: center;
|
||||
gap: 7px;
|
||||
padding: 0 7px;
|
||||
border: 0;
|
||||
border-radius: var(--r-xs);
|
||||
background: transparent;
|
||||
color: var(--muted);
|
||||
text-align: left;
|
||||
cursor: pointer;
|
||||
font: var(--w-reg) var(--fs-meta)/1.35 var(--ui);
|
||||
}
|
||||
.studio-wallet:hover { background: var(--raised); color: var(--text); }
|
||||
.studio-wallet b { font: inherit; }
|
||||
.studio-wallet small { color: var(--ghost); font: var(--w-reg) var(--fs-micro)/1 var(--mono); }
|
||||
.studio-user-foot {
|
||||
min-height: 38px;
|
||||
display: grid;
|
||||
grid-template-columns: 30px minmax(0,1fr) 30px;
|
||||
align-items: center;
|
||||
gap: 7px;
|
||||
margin-top: 3px;
|
||||
padding-top: 4px;
|
||||
border-top: 1px solid var(--hair);
|
||||
}
|
||||
.studio-user-foot .acctrow { position: relative; top: -1px; width: 30px; min-width: 30px; height: 30px; margin: 0; padding: 0; border: 0; overflow: hidden; }
|
||||
.studio-user-foot .ini { width: 30px; height: 30px; border-radius: var(--r-md); }
|
||||
.studio-user-foot .ini:not([data-off]) > span { text-box: trim-both cap alphabetic; transform: translateY(1px); }
|
||||
.studio-workspace-kind { color: var(--faint); font: var(--w-reg) var(--fs-micro)/1.5 var(--ui); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
|
||||
.turntools > .attach { order: 1 !important; }
|
||||
.turntools > .studio-mode-control { order: 2 !important; }
|
||||
.turntools > .studio-branch-pop { order: 3 !important; }
|
||||
@@ -2475,36 +2302,14 @@ button, input, textarea { font-size: var(--fs-ui); }
|
||||
.studio-policy-note { margin: 5px 0 0; padding: 9px 7px; border-top: 1px solid var(--border); color: var(--ghost); font: var(--w-reg) var(--fs-micro)/1.55 var(--ui); }
|
||||
.studio-control-chevron { margin-left: 1px; color: var(--ghost); }
|
||||
|
||||
:root[data-theme="light"] .studio-wallet,
|
||||
:root[data-theme="light"] .studio-workspace-kind { color: var(--muted); }
|
||||
:root[data-theme="light"] .studio-wallet:hover { background: var(--hair); color: var(--text); }
|
||||
:root[data-theme="light"] .studio-quicknav button > span,
|
||||
:root[data-theme="light"] .studio-new-task > span,
|
||||
:root[data-theme="light"] .studio-search > span,
|
||||
:root[data-theme="light"] .studio-wallet > span { color: var(--brand); }
|
||||
:root[data-theme="light"] .studio-search > span { color: var(--brand); }
|
||||
:root[data-theme="light"] .studio-browser,
|
||||
:root[data-theme="light"] .studio-browser-frame { background: var(--page); color: var(--text); }
|
||||
:root[data-theme="light"] .studio-browser-toolbar,
|
||||
:root[data-theme="light"] .studio-browser-note { background: var(--page); border-color: var(--border); }
|
||||
:root[data-theme="light"] .studio-browser-address { background: var(--surface); border-color: var(--border); }
|
||||
:root[data-theme="light"] .studio-browser-address input { color: var(--text); }
|
||||
:root[data-theme="light"] .chrome-context-card {
|
||||
border-color: var(--border); background: var(--surface); box-shadow: 0 20px 48px -24px #5c6259; color: var(--muted);
|
||||
}
|
||||
:root[data-theme="light"] .chrome-context-card header,
|
||||
:root[data-theme="light"] .chrome-context-card section { border-color: var(--border); }
|
||||
:root[data-theme="light"] .chrome-context-card header b,
|
||||
:root[data-theme="light"] .chrome-context-card header strong,
|
||||
:root[data-theme="light"] .chrome-context-card section > div:first-child b,
|
||||
:root[data-theme="light"] .chrome-context-parts b,
|
||||
:root[data-theme="light"] .chrome-mcp-row > span { color: var(--text); }
|
||||
:root[data-theme="light"] .chrome-context-card header small,
|
||||
:root[data-theme="light"] .chrome-context-card section small,
|
||||
:root[data-theme="light"] .chrome-context-card p { color: var(--faint); }
|
||||
:root[data-theme="light"] .chrome-context-bar { background: var(--hair); }
|
||||
:root[data-theme="light"] .chrome-mcp-row:hover { background: var(--overlay); }
|
||||
:root[data-theme="light"] .chrome-context-card section > button { color: #536789; }
|
||||
:root[data-theme="light"] .studio-user-foot { border-top-color: var(--border); }
|
||||
:root[data-theme="light"] .studio-branch-card,
|
||||
:root[data-theme="light"] .portmenu,
|
||||
:root[data-theme="light"] .polmenu { background: var(--surface); border-color: var(--border); box-shadow: var(--shadow-pack, 0 18px 44px -20px #596057); }
|
||||
@@ -2840,9 +2645,7 @@ button, input, textarea { font-size: var(--fs-ui); }
|
||||
remain intentionally independent from decorative themes.
|
||||
────────────────────────────────────────────────────────────────────────── */
|
||||
|
||||
.chrome,
|
||||
.rail,
|
||||
.railfoot,
|
||||
.main,
|
||||
.panes,
|
||||
.pane,
|
||||
@@ -2851,33 +2654,16 @@ button, input, textarea { font-size: var(--fs-ui); }
|
||||
.side .scroll,
|
||||
.studio-browser { color: var(--text); border-color: var(--hair); }
|
||||
|
||||
.chrome .crumb { color: var(--faint); }
|
||||
.chrome .crumb-proj,
|
||||
.chrome .crumb b { color: var(--text); }
|
||||
.chrome .crumbsep,
|
||||
.chrome .top-action,
|
||||
.studio-settings { color: var(--ghost); }
|
||||
.chrome .badge,
|
||||
.chrome .top-action[aria-pressed="true"] { background: var(--overlay); color: var(--muted); border-color: var(--border); }
|
||||
|
||||
.studio-settings:hover,
|
||||
.studio-search:hover,
|
||||
.studio-quicknav button:hover { color: var(--text); background: var(--overlay); }
|
||||
.studio-search:hover { color: var(--text); background: var(--overlay); }
|
||||
|
||||
.studio-new-task { background: transparent; border-color: transparent; color: var(--text); }
|
||||
.studio-new-task:hover { background: var(--overlay); border-color: transparent; color: var(--text); }
|
||||
.studio-section-label,
|
||||
.studio-section-label button,
|
||||
.studio-settings { color: var(--muted); }
|
||||
.studio-search,
|
||||
.studio-quicknav button,
|
||||
.studio-wallet { color: var(--text); }
|
||||
.studio-section-label button { color: var(--muted); }
|
||||
.studio-search { color: var(--text); }
|
||||
.studio-search kbd,
|
||||
.studio-quicknav small,
|
||||
.rail .wsmeta { color: var(--ghost); }
|
||||
.studio-search > span,
|
||||
.studio-quicknav button > span,
|
||||
.studio-wallet > span { color: var(--accent); }
|
||||
.studio-search > span { color: var(--accent); }
|
||||
.session-pop,
|
||||
.portmenu,
|
||||
.polmenu,
|
||||
@@ -2931,9 +2717,6 @@ button, input, textarea { font-size: var(--fs-ui); }
|
||||
.rail .wsfind { background: var(--overlay); }
|
||||
.rail .kids { border-color: var(--hair); }
|
||||
|
||||
.hero .mk { color: var(--faint); }
|
||||
.hero .t { color: var(--text); }
|
||||
.hero .s { color: var(--muted); }
|
||||
.chunk + .chunk { border-color: var(--hair); }
|
||||
.notice,
|
||||
.apv,
|
||||
@@ -3135,36 +2918,8 @@ button, input, textarea { font-size: var(--fs-ui); }
|
||||
}
|
||||
|
||||
/* Sidebar utility dock is part of the rail, not a second dark footer. */
|
||||
.railfoot {
|
||||
background: transparent !important;
|
||||
border-top-color: var(--hair) !important;
|
||||
color: var(--muted);
|
||||
}
|
||||
.studio-wallet { color: var(--text); }
|
||||
.studio-wallet b { color: var(--text); }
|
||||
.studio-wallet small { color: var(--text); font-variant-numeric: tabular-nums; }
|
||||
.studio-wallet.studio-feedback > span { color: var(--accent-ink); }
|
||||
.studio-wallet:hover { background: var(--accent-wash); color: var(--text); }
|
||||
.studio-user-foot { border-top-color: var(--hair); }
|
||||
.studio-workspace-kind { color: var(--muted); }
|
||||
.studio-user-foot .acctrow:hover,
|
||||
.studio-settings:hover { background: var(--accent-wash); color: var(--text); }
|
||||
:root[data-theme="light"][data-bg] .rail { background: var(--bg-rail-background, color-mix(in srgb, var(--page) 86%, transparent)) !important; }
|
||||
:root[data-theme="light"][data-bg] .chrome { background: var(--bg-chrome-background, color-mix(in srgb, var(--page) 86%, transparent)) !important; }
|
||||
:root[data-theme="light"][data-bg] .railfoot {
|
||||
box-shadow: 0 -1px color-mix(in srgb, var(--border) 62%, transparent);
|
||||
}
|
||||
:root[data-theme="light"] .studio-user-foot .ini[data-off] {
|
||||
background: var(--raised);
|
||||
color: var(--muted);
|
||||
box-shadow: inset 0 0 0 1px var(--border);
|
||||
}
|
||||
:root[data-theme="light"] .studio-wallet:hover,
|
||||
:root[data-theme="light"] .studio-user-foot .acctrow:hover,
|
||||
:root[data-theme="light"] .studio-settings:hover {
|
||||
background: var(--accent-wash);
|
||||
color: var(--text);
|
||||
}
|
||||
.side .scroll,
|
||||
.studio-browser,
|
||||
.studio-browser-toolbar { background: var(--surface); border-color: var(--hair); color: var(--text); }
|
||||
@@ -3842,10 +3597,6 @@ button, input, textarea { font-size: var(--fs-ui); }
|
||||
padding-left: 22px;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.chrome .thbtn,
|
||||
.chrome .top-action { min-height: 28px; }
|
||||
.chrome .crumb,
|
||||
.chrome .r { align-self: center; }
|
||||
|
||||
.turntools .studio-refine { order: 1; }
|
||||
.studio-refine[aria-disabled="true"] { cursor: default; }
|
||||
@@ -4110,4 +3861,3 @@ svg.studio-icon[data-kind="image"] { color: var(--ok); }
|
||||
.workbench-launcher-recent .studio-icon { width: 14px; height: 14px; flex: none; color: var(--faint); }
|
||||
.workbench-launcher-recent button > span { flex: none; max-width: 55%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.workbench-launcher-recent button > i { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--faint); font-style: normal; font-size: var(--fs-micro); }
|
||||
.studio-quicknav .qv { margin-left: auto; padding-right: 8px; color: var(--faint); font: var(--w-reg) var(--fs-micro)/1 var(--ui); font-style: normal; font-variant-numeric: tabular-nums; }
|
||||
@@ -627,8 +627,6 @@ export function App({ hub }: { hub: HubPort }) {
|
||||
onArchive={archiveSession}
|
||||
onRename={renameSession}
|
||||
onCollapse={() => setRail(false)}
|
||||
account={account}
|
||||
accountUnread={accountUnread}
|
||||
wallet={report.wallet}
|
||||
onSettings={showPrefs}
|
||||
onFiles={openFiles}
|
||||
|
||||
@@ -116,7 +116,6 @@ export function Chrome({ port, status, workspace: ws, title, steer, account, hos
|
||||
</button>
|
||||
)}
|
||||
<div className="r-fold" id="chrome-fold" data-open={more ? "" : undefined}>
|
||||
{hub && onError && <PhonePop hub={hub} />}
|
||||
{port && (
|
||||
<TooltipButton
|
||||
className="thbtn find-action"
|
||||
@@ -130,6 +129,7 @@ export function Chrome({ port, status, workspace: ws, title, steer, account, hos
|
||||
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M7.2 3.1a4.1 4.1 0 1 0 0 8.2 4.1 4.1 0 0 0 0-8.2M10.3 10.3 13 13" /></svg>
|
||||
</TooltipButton>
|
||||
)}
|
||||
{hub && onError && <PhonePop hub={hub} />}
|
||||
<TooltipButton
|
||||
className="thbtn theme-toggle"
|
||||
data-action="appearance.theme"
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
import { FeedbackBadge, feedbackEntryTab } from "./feedbackentry";
|
||||
import { useEffect, useMemo, useRef, useState } from "react";
|
||||
import { useEffect, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from "react";
|
||||
import { t } from "../i18n";
|
||||
import logoWordmark from "../assets/logo-wordmark.svg";
|
||||
import type { AccountState } from "../port/port";
|
||||
import type { HubPort, RuntimeView, TreeSession, TreeWorkspace } from "../port/hub";
|
||||
import { workspaceContains } from "../port/hub";
|
||||
import type { RemoteHost } from "../port/remote";
|
||||
import type { Adder } from "./addws";
|
||||
import { AccountRow } from "./AccountRow";
|
||||
import { TooltipButton } from "./TooltipButton";
|
||||
import { ContentMatches } from "./ContentMatches";
|
||||
import { useDestinations } from "./navdest";
|
||||
import { ICON, SECTION_NAME, SETTINGS, type Section } from "./prefsnav";
|
||||
@@ -72,8 +71,6 @@ interface Props {
|
||||
onArchive: (path: string, archived: boolean, runtimeId?: string) => Promise<void>;
|
||||
onRename: (path: string, title: string, mode?: "inline" | "dialog") => void;
|
||||
onCollapse: () => void;
|
||||
account: AccountState | null;
|
||||
accountUnread: string;
|
||||
wallet: string;
|
||||
onSettings: (section?: string) => void;
|
||||
onFiles: () => void;
|
||||
@@ -90,6 +87,18 @@ interface Props {
|
||||
* is signed in. It owns only what nothing outside it reads — which scope the
|
||||
* session filter is on, whether the switcher is open, and which workspaces are
|
||||
* folded. Everything else belongs to the window and arrives as a prop. */
|
||||
/** The foot's icon row is one toolbar: the arrow keys walk its buttons, Home and End jump to either end. */
|
||||
function moveAlongToolbar(event: ReactKeyboardEvent<HTMLDivElement>) {
|
||||
const step = { ArrowRight: 1, ArrowLeft: -1, Home: -Infinity, End: Infinity }[event.key];
|
||||
if (step === undefined) return;
|
||||
const buttons = [...event.currentTarget.querySelectorAll<HTMLButtonElement>(":scope > button:not(:disabled)")];
|
||||
const at = buttons.indexOf(document.activeElement as HTMLButtonElement);
|
||||
if (at < 0) return;
|
||||
event.preventDefault();
|
||||
const to = step === Infinity ? buttons.length - 1 : step === -Infinity ? 0 : (at + step + buttons.length) % buttons.length;
|
||||
buttons[to].focus();
|
||||
}
|
||||
|
||||
export function Sidebar({
|
||||
hub,
|
||||
collapsed,
|
||||
@@ -125,8 +134,6 @@ export function Sidebar({
|
||||
onArchive,
|
||||
onRename,
|
||||
onCollapse,
|
||||
account,
|
||||
accountUnread,
|
||||
wallet,
|
||||
onSettings,
|
||||
onFiles,
|
||||
@@ -382,29 +389,40 @@ export function Sidebar({
|
||||
</RailFilterContext.Provider>
|
||||
</div>
|
||||
{!navShown && <div className="railfoot">
|
||||
<div className="studio-quicknav">
|
||||
{destinations.filter(([mark]) => mark !== "usage").map(([mark, label, section]) => mark === "files" ? (
|
||||
<button key={mark} data-action="files.open" onClick={onFiles}>
|
||||
<span aria-hidden="true"><StudioIcon name="file" /></span><b>{t(label)}</b>
|
||||
</button>
|
||||
) : (
|
||||
<button key={mark} data-action="settings.section" data-value={section} onClick={() => onSettings(section)}>
|
||||
<span aria-hidden="true"><svg viewBox="0 0 16 16" width={15} height={15} fill="none" stroke="currentColor" strokeWidth={1} strokeLinecap="round" strokeLinejoin="round">{ICON[mark as Section]}</svg></span><b>{t(label)}</b>
|
||||
{section === "remote" && online > 0 && <em className="qv">{t("{n} 台在线", { n: online })}</em>}
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
{destinations.some(([mark]) => mark === "usage") && <button className="studio-wallet" data-action="settings.section" data-value="usage" onClick={() => onSettings("usage")}><span aria-hidden="true"><StudioIcon name="wallet" /></span><b>{t("钱包与用量")}</b>{wallet && <small>{hideAmounts ? MASK : wallet}</small>}</button>}
|
||||
<button className="studio-wallet studio-feedback" data-action="feedback.open" onClick={() => onFeedback(feedbackEntryTab(feedbackUnread))}>
|
||||
<div className="studio-quicknav" role="toolbar" aria-label={t("侧栏入口")} onKeyDown={moveAlongToolbar}>
|
||||
{destinations.map(([mark, label, section]) => {
|
||||
const reading = mark === "usage" ? (wallet ? (hideAmounts ? MASK : wallet) : "")
|
||||
: mark === "remote" && online > 0 ? t("{n} 台在线", { n: online }) : "";
|
||||
const name = reading ? `${t(label)} · ${reading}` : t(label);
|
||||
return (
|
||||
<TooltipButton
|
||||
key={mark}
|
||||
className={mark === "usage" ? "studio-wallet" : undefined}
|
||||
data-action={mark === "files" ? "files.open" : "settings.section"}
|
||||
data-value={mark === "files" ? undefined : section}
|
||||
aria-label={name}
|
||||
title={name}
|
||||
onClick={() => (mark === "files" ? onFiles() : onSettings(section))}
|
||||
>
|
||||
{mark === "files" ? <StudioIcon name="file" aria-hidden="true" />
|
||||
: <svg viewBox="0 0 16 16" width={16} height={16} fill="none" stroke="currentColor" strokeWidth={1.45} strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">{ICON[mark as Section]}</svg>}
|
||||
{mark === "remote" && online > 0 && <i className="qdot" data-tone="ok" aria-hidden="true" />}
|
||||
</TooltipButton>
|
||||
);
|
||||
})}
|
||||
<span className="qspace" aria-hidden="true" />
|
||||
<TooltipButton className="studio-settings" data-action="chrome.settings" onClick={() => onSettings()} aria-label={t("设置")} title={t("设置")} shortcut={chord(",")}>
|
||||
<svg viewBox="0 0 16 16" width={16} height={16} fill="none" stroke="currentColor" strokeWidth={1.45} strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
|
||||
<circle cx="8" cy="8" r="2.2" /><path d="M8 1.8v2M8 12.2v2M1.8 8h2M12.2 8h2M3.6 3.6l1.4 1.4M11 11l1.4 1.4M3.6 12.4L5 11M11 5l1.4-1.4" />
|
||||
</svg>
|
||||
<UpdateDot />
|
||||
</TooltipButton>
|
||||
</div>
|
||||
<button className="studio-feedback" data-action="feedback.open" onClick={() => onFeedback(feedbackEntryTab(feedbackUnread))}>
|
||||
<span aria-hidden="true"><StudioIcon name="feedback" /></span>
|
||||
<b>{t("发送反馈")}</b>
|
||||
<FeedbackBadge unread={feedbackUnread} />
|
||||
</button>
|
||||
<div className="studio-user-foot">
|
||||
<AccountRow account={account} unread={accountUnread} onOpen={() => onSettings("account")} />
|
||||
<span className="studio-workspace-kind">{t(account?.signedIn ? "个人工作空间" : "本地工作空间")}</span>
|
||||
<button className="studio-settings" data-action="chrome.settings" onClick={() => onSettings()} aria-label={t("设置")}><StudioIcon name="settings" /><UpdateDot /></button>
|
||||
</div>
|
||||
</div>}
|
||||
</div>
|
||||
</>
|
||||
|
||||
@@ -85,7 +85,7 @@ it("closes the phone-width sidebar drawer after choosing files", async () => {
|
||||
await mount();
|
||||
fireEvent.click(document.querySelector(".studio-menu")!);
|
||||
expect(document.querySelector(".app")!.getAttribute("data-rail")).toBe("on");
|
||||
fireEvent.click(document.querySelector(".studio-quicknav button")!);
|
||||
fireEvent.click(document.querySelector('.studio-quicknav [data-action="files.open"]')!);
|
||||
await waitFor(() => expect(filesShown()).toBe(true));
|
||||
expect(document.querySelector(".app")!.getAttribute("data-rail")).toBe("off");
|
||||
});
|
||||
|
||||
@@ -71,22 +71,22 @@ function sidebar() {
|
||||
activeWorkspace={tree[0]} liveIds={() => []} pinned={new Set()} onPin={noop} remotes={null} remoteTrees={{}}
|
||||
reloadRemotes={async () => {}} reloadRemoteTrees={async () => {}} readRemoteTree={async () => {}} reloadTree={async () => {}}
|
||||
adder={{ busy: false, add: noop, addPath: noop } as never} onOpen={async () => {}} onOpenRemote={async () => {}} onFocusPane={noop} onClosePanes={async () => {}}
|
||||
onPause={noop} onArchive={async () => {}} onRename={noop} onCollapse={noop} account={null} accountUnread="" wallet=""
|
||||
onPause={noop} onArchive={async () => {}} onRename={noop} onCollapse={noop} wallet=""
|
||||
onSettings={noop} onFeedback={noop} feedbackUnread={0} onFind={noop} onError={noop}
|
||||
/>,
|
||||
);
|
||||
}
|
||||
|
||||
const shortcuts = () => [...document.querySelectorAll(".studio-quicknav > button")].map((b) => b.textContent);
|
||||
const shortcuts = () => [...document.querySelectorAll(".studio-quicknav > button:not(.studio-settings)")].map((b) => b.getAttribute("aria-label"));
|
||||
|
||||
it("gives the sidebar the same order and the same hidden entries as the rail", async () => {
|
||||
render(<NavEntriesSection />);
|
||||
sidebar();
|
||||
expect(shortcuts()).toEqual(["文件", "工具与权限", "扩展", "记忆", "远程"]);
|
||||
expect(shortcuts()).toEqual(["用量", "文件", "工具与权限", "扩展", "记忆", "远程"]);
|
||||
await userEvent.click(screen.getByRole("button", { name: "上移:远程" }));
|
||||
await userEvent.click(screen.getByRole("button", { name: "上移:远程" }));
|
||||
await userEvent.click(screen.getByRole("switch", { name: "显示:记忆" }));
|
||||
expect(shortcuts()).toEqual(["文件", "工具与权限", "远程", "扩展"]);
|
||||
expect(shortcuts()).toEqual(["用量", "文件", "工具与权限", "远程", "扩展"]);
|
||||
});
|
||||
|
||||
it("takes the wallet row out of the sidebar when Usage is hidden", async () => {
|
||||
@@ -96,3 +96,20 @@ it("takes the wallet row out of the sidebar when Usage is hidden", async () => {
|
||||
await userEvent.click(screen.getByRole("switch", { name: "显示:用量" }));
|
||||
expect(document.querySelector(".studio-wallet:not(.studio-feedback)")).toBeNull();
|
||||
});
|
||||
|
||||
it("walks the foot's icon row with the arrow keys and names each entry with its reading", async () => {
|
||||
render(<NavEntriesSection />);
|
||||
sidebar();
|
||||
const bar = screen.getByRole("toolbar", { name: "侧栏入口" });
|
||||
const buttons = [...bar.querySelectorAll<HTMLButtonElement>(":scope > button")];
|
||||
expect(buttons.at(-1)!.getAttribute("aria-label")).toBe("设置");
|
||||
buttons[0].focus();
|
||||
await userEvent.keyboard("{ArrowRight}");
|
||||
expect(document.activeElement).toBe(buttons[1]);
|
||||
await userEvent.keyboard("{ArrowLeft}{ArrowLeft}");
|
||||
expect(document.activeElement).toBe(buttons.at(-1));
|
||||
await userEvent.keyboard("{Home}");
|
||||
expect(document.activeElement).toBe(buttons[0]);
|
||||
await userEvent.keyboard("{End}");
|
||||
expect(document.activeElement).toBe(buttons.at(-1));
|
||||
});
|
||||
@@ -20,7 +20,7 @@ function sidebar(onSettings = vi.fn()) {
|
||||
activeWorkspace={tree[0]} liveIds={() => []} pinned={new Set()} onPin={noop} remotes={null} remoteTrees={{}}
|
||||
reloadRemotes={async () => {}} reloadRemoteTrees={async () => {}} readRemoteTree={async () => {}} reloadTree={async () => {}}
|
||||
adder={{ busy: false, add: noop, addPath: noop } as never} onOpen={async () => {}} onOpenRemote={async () => {}} onFocusPane={noop} onClosePanes={async () => {}}
|
||||
onPause={noop} onArchive={async () => {}} onRename={noop} onCollapse={noop} account={null} accountUnread="" wallet=""
|
||||
onPause={noop} onArchive={async () => {}} onRename={noop} onCollapse={noop} wallet=""
|
||||
onSettings={onSettings} onFeedback={noop} feedbackUnread={0} onFind={noop} onError={noop}
|
||||
/>,
|
||||
);
|
||||
|
||||
@@ -158,7 +158,7 @@ it("still reaches settings with the rail off", async () => {
|
||||
await open();
|
||||
const footer = document.querySelector<HTMLElement>(".railfoot")!;
|
||||
expect(footer).not.toBeNull();
|
||||
for (const name of ["钱包与用量", "发送反馈", "账号", "设置"]) {
|
||||
for (const name of ["用量", "发送反馈", "设置"]) {
|
||||
expect(within(footer).getByRole("button", { name: new RegExp(`^${name}`) }), name).toBeTruthy();
|
||||
}
|
||||
await openAppearance();
|
||||
@@ -169,7 +169,9 @@ it.each(["on", "off"])("reaches usage, account, and settings with the rail %s",
|
||||
localStorage.setItem(KEY, mode);
|
||||
await open();
|
||||
const entries = mode === "on" ? navEl()! : document.querySelector<HTMLElement>(".railfoot")!;
|
||||
for (const [label, section, action] of [[mode === "on" ? "用量" : "钱包与用量", "usage"], ["账号", "account", "chrome.account"], ["设置", "session", "chrome.settings"]]) {
|
||||
const account = mode === "on" ? [["账号", "account", "chrome.account"]] : [];
|
||||
if (mode === "off") expect(entries.querySelector('[data-action="chrome.account"]')).toBeNull();
|
||||
for (const [label, section, action] of [["用量", "usage"], ...account, ["设置", "session", "chrome.settings"]]) {
|
||||
const button = within(entries).getByRole("button", { name: new RegExp(`^${label}`) });
|
||||
if (action) expect(entries.querySelector(`[data-action="${action}"]`)).toBe(button);
|
||||
await userEvent.click(button);
|
||||
|
||||
@@ -30,7 +30,7 @@ function draw(withRemote = false, runtimes: RuntimeView[] = []) {
|
||||
reloadRemotes={async () => {}} reloadRemoteTrees={async () => {}}
|
||||
readRemoteTree={async () => {}} reloadTree={async () => {}} adder={{ busy: false, add: noop, addPath: noop } as never}
|
||||
onOpen={async () => {}} onOpenRemote={async () => {}} onFocusPane={noop} onClosePanes={async () => {}}
|
||||
onPause={noop} onArchive={async () => {}} onRename={noop} onCollapse={noop} account={null} accountUnread="" wallet=""
|
||||
onPause={noop} onArchive={async () => {}} onRename={noop} onCollapse={noop} wallet=""
|
||||
onSettings={noop} onFeedback={noop} feedbackUnread={0} onFind={noop} onError={noop}
|
||||
/>,
|
||||
);
|
||||
|
||||
@@ -42,7 +42,7 @@ function draw(collapsed = false) {
|
||||
remotes={null} remoteTrees={{}} reloadRemotes={async () => {}} reloadRemoteTrees={async () => {}}
|
||||
readRemoteTree={async () => {}} reloadTree={reload} adder={adder} onOpen={open} onOpenRemote={remote}
|
||||
onFocusPane={() => {}} onClosePanes={async () => {}} onPause={() => {}} onArchive={async () => {}}
|
||||
onRename={() => {}} onCollapse={() => {}} account={null} accountUnread="" wallet=""
|
||||
onRename={() => {}} onCollapse={() => {}} wallet=""
|
||||
onSettings={() => {}} onFeedback={() => {}} feedbackUnread={0} onFind={() => {}}
|
||||
onError={(e) => setError(String(e))}
|
||||
/>
|
||||
|
||||
@@ -24,7 +24,7 @@ function draw(remote = false) {
|
||||
reloadTree={async () => {}} paging={NO_PAGING} adder={{ busy: false, add: noop, addPath: noop } as never}
|
||||
onOpen={async () => {}} onOpenRemote={async () => {}} onFocusPane={noop} onClosePanes={async () => {}}
|
||||
onPause={noop} onArchive={async () => {}} onRename={noop} onCollapse={noop}
|
||||
account={null} accountUnread="" wallet="" onSettings={noop} onFiles={noop} onView={noop}
|
||||
wallet="" onSettings={noop} onFiles={noop} onView={noop}
|
||||
onFeedback={noop} feedbackUnread={0} onFind={noop} onError={noop} />);
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ function draw(navShown: boolean, onSettings = vi.fn(), remotes: unknown = null)
|
||||
activeWorkspace={tree[0]} liveIds={() => []} pinned={new Set()} onPin={noop} remotes={remotes as never} remoteTrees={{}}
|
||||
reloadRemotes={async () => {}} reloadRemoteTrees={async () => {}} readRemoteTree={async () => {}} reloadTree={async () => {}}
|
||||
adder={{ busy: false, add: noop, addPath: noop } as never} onOpen={async () => {}} onOpenRemote={async () => {}} onFocusPane={noop} onClosePanes={async () => {}}
|
||||
onPause={noop} onArchive={async () => {}} onRename={noop} onCollapse={noop} account={null} accountUnread="" wallet=""
|
||||
onPause={noop} onArchive={async () => {}} onRename={noop} onCollapse={noop} wallet=""
|
||||
onSettings={onSettings} onFeedback={noop} feedbackUnread={0} onFind={noop} onError={noop}
|
||||
/>,
|
||||
);
|
||||
@@ -52,8 +52,10 @@ it("shows the shortcut of new session and search beside their label", () => {
|
||||
|
||||
it("says how many remote machines are online beside the remote entry, and nothing when none is", () => {
|
||||
draw(false, vi.fn(), [{ name: "gpu", status: "connected" }, { name: "dev", status: "idle" }]);
|
||||
expect(remoteEntries()[0].querySelector(".qv")?.textContent).toBe("1 台在线");
|
||||
expect(remoteEntries()[0].getAttribute("aria-label")).toBe("远程 · 1 台在线");
|
||||
expect(remoteEntries()[0].querySelector('.qdot[data-tone="ok"]')).not.toBeNull();
|
||||
cleanup();
|
||||
draw(false, vi.fn(), [{ name: "dev", status: "idle" }]);
|
||||
expect(remoteEntries()[0].querySelector(".qv")).toBeNull();
|
||||
expect(remoteEntries()[0].getAttribute("aria-label")).toBe("远程");
|
||||
expect(remoteEntries()[0].querySelector(".qdot")).toBeNull();
|
||||
});
|
||||
@@ -6,14 +6,14 @@
|
||||
"codeowners": 0,
|
||||
"commented-code": 0,
|
||||
"complexity": 666,
|
||||
"css-important": 204,
|
||||
"css-size": 9804,
|
||||
"css-important": 197,
|
||||
"css-size": 9283,
|
||||
"doc-language": 0,
|
||||
"doc-owner": 27,
|
||||
"doc-prose": 2128,
|
||||
"doc-prose": 1434,
|
||||
"error-text": 9,
|
||||
"essay": 2538,
|
||||
"file-size": 18157,
|
||||
"file-size": 18151,
|
||||
"flat-view": 0,
|
||||
"frontend-parity": 13,
|
||||
"function-size": 2392,
|
||||
@@ -77,12 +77,12 @@
|
||||
"doc-prose": 13
|
||||
},
|
||||
"desktop/frontend-next/src/styles/app.css": {
|
||||
"css-important": 28,
|
||||
"css-size": 5579
|
||||
"css-important": 25,
|
||||
"css-size": 5420
|
||||
},
|
||||
"desktop/frontend-next/src/styles/studio.css": {
|
||||
"css-important": 176,
|
||||
"css-size": 4225
|
||||
"css-important": 172,
|
||||
"css-size": 3863
|
||||
},
|
||||
"desktop/internal/winuninstall/registry_windows.go": {
|
||||
"essay": 1
|
||||
@@ -116,7 +116,7 @@
|
||||
},
|
||||
"docs/GUIDE.md": {
|
||||
"doc-owner": 1,
|
||||
"doc-prose": 362
|
||||
"doc-prose": 360
|
||||
},
|
||||
"docs/GUIDE.zh-CN.md": {
|
||||
"doc-owner": 1,
|
||||
@@ -143,7 +143,7 @@
|
||||
},
|
||||
"docs/SPEC.md": {
|
||||
"doc-owner": 1,
|
||||
"doc-prose": 333
|
||||
"doc-prose": 332
|
||||
},
|
||||
"docs/THEME_ASSETS.md": {
|
||||
"doc-owner": 1,
|
||||
@@ -265,7 +265,7 @@
|
||||
},
|
||||
"internal/contract/config/config.go": {
|
||||
"essay": 30,
|
||||
"file-size": 813,
|
||||
"file-size": 807,
|
||||
"process-input": 3
|
||||
},
|
||||
"internal/contract/config/credentials.go": {
|
||||
@@ -1506,74 +1506,65 @@
|
||||
"release-note": 29
|
||||
},
|
||||
"release-notes/studio/2.1.0.md": {
|
||||
"doc-prose": 1,
|
||||
"release-note": 25
|
||||
},
|
||||
"release-notes/studio/2.10.0.md": {
|
||||
"doc-prose": 28,
|
||||
"release-note": 46
|
||||
},
|
||||
"release-notes/studio/2.11.0.md": {
|
||||
"doc-prose": 206,
|
||||
"doc-prose": 1,
|
||||
"release-note": 75
|
||||
},
|
||||
"release-notes/studio/2.12.0.md": {
|
||||
"doc-prose": 16,
|
||||
"doc-prose": 3,
|
||||
"release-note": 35
|
||||
},
|
||||
"release-notes/studio/2.13.0.md": {
|
||||
"release-note": 23
|
||||
},
|
||||
"release-notes/studio/2.14.0.md": {
|
||||
"doc-prose": 28,
|
||||
"doc-prose": 3,
|
||||
"release-note": 53
|
||||
},
|
||||
"release-notes/studio/2.14.1.md": {
|
||||
"doc-prose": 16,
|
||||
"release-note": 7
|
||||
},
|
||||
"release-notes/studio/2.15.0.md": {
|
||||
"doc-prose": 110,
|
||||
"doc-prose": 4,
|
||||
"release-note": 43
|
||||
},
|
||||
"release-notes/studio/2.16.0.md": {
|
||||
"doc-prose": 107,
|
||||
"doc-prose": 3,
|
||||
"release-note": 47
|
||||
},
|
||||
"release-notes/studio/2.17.0.md": {
|
||||
"doc-prose": 43,
|
||||
"doc-prose": 4,
|
||||
"release-note": 26
|
||||
},
|
||||
"release-notes/studio/2.2.0.md": {
|
||||
"doc-prose": 1,
|
||||
"release-note": 26
|
||||
},
|
||||
"release-notes/studio/2.3.0.md": {
|
||||
"doc-prose": 2,
|
||||
"release-note": 30
|
||||
},
|
||||
"release-notes/studio/2.4.0.md": {
|
||||
"doc-prose": 1,
|
||||
"release-note": 45
|
||||
},
|
||||
"release-notes/studio/2.5.0.md": {
|
||||
"doc-prose": 10,
|
||||
"release-note": 29
|
||||
},
|
||||
"release-notes/studio/2.6.0.md": {
|
||||
"doc-prose": 8,
|
||||
"release-note": 31
|
||||
},
|
||||
"release-notes/studio/2.7.0.md": {
|
||||
"doc-prose": 44,
|
||||
"release-note": 26
|
||||
},
|
||||
"release-notes/studio/2.8.0.md": {
|
||||
"doc-prose": 58,
|
||||
"doc-prose": 1,
|
||||
"release-note": 37
|
||||
},
|
||||
"release-notes/studio/2.9.0.md": {
|
||||
"doc-prose": 32,
|
||||
"doc-prose": 1,
|
||||
"release-note": 28
|
||||
},
|
||||
"sdk/go/README.md": {
|
||||
|
||||
Reference in new issue
Block a user