Files
model-platform/frontend/app/styles/platform.css
T
2026-08-12 14:55:09 +08:00

2049 lines
33 KiB
CSS

:root {
font-family:
Inter, "PingFang SC", "Microsoft YaHei", system-ui, -apple-system,
BlinkMacSystemFont, "Segoe UI", sans-serif;
color: #1d2a3b;
background: #eef2f6;
font-synthesis: none;
text-rendering: optimizeLegibility;
}
* {
box-sizing: border-box;
}
body {
min-width: 1120px;
min-height: 100vh;
margin: 0;
overflow: hidden;
}
button,
input,
select {
font: inherit;
}
button {
color: inherit;
}
.app-shell {
display: flex;
min-height: 100vh;
background: #eef2f6;
}
.sidebar {
position: relative;
z-index: 3;
display: flex;
width: 210px;
min-width: 210px;
flex-direction: column;
min-height: 100vh;
color: #c9d7e7;
background:
radial-gradient(circle at 10% 1%, rgb(28 105 186 / 25%), transparent 27%),
#09233f;
box-shadow: 5px 0 18px rgb(19 47 77 / 9%);
transition: width 0.2s ease, min-width 0.2s ease;
}
.sidebar.is-collapsed {
width: 70px;
min-width: 70px;
}
.sidebar.is-collapsed .brand__name,
.sidebar.is-collapsed .sidebar-footer span,
.sidebar.is-collapsed .nav-item span {
display: none;
}
.sidebar.is-collapsed .brand {
justify-content: center;
padding-left: 0;
padding-right: 0;
}
.sidebar.is-collapsed .sidebar-footer {
width: calc(100% - 18px);
justify-content: center;
padding-left: 17px;
padding-right: 17px;
}
.sidebar.is-collapsed .nav-item {
justify-content: center;
padding-left: 17px;
padding-right: 17px;
}
.brand {
display: flex;
height: 70px;
align-items: center;
gap: 10px;
padding: 0 17px;
border-bottom: 1px solid rgb(255 255 255 / 8%);
color: #fff;
}
.brand__mark {
display: grid;
width: 36px;
height: 36px;
flex: 0 0 auto;
place-items: center;
color: #5ca9ff;
}
.brand__name {
white-space: nowrap;
font-size: 15px;
font-weight: 700;
letter-spacing: .01em;
}
.navigation {
display: flex;
flex-direction: column;
gap: 7px;
padding: 19px 9px;
}
.nav-item,
.sidebar-footer {
display: flex;
height: 48px;
align-items: center;
gap: 13px;
padding: 0 17px;
border: 0;
border-radius: 6px;
color: #b9cade;
background: transparent;
cursor: pointer;
font-size: 14px;
text-align: left;
transition: .18s ease;
}
.nav-item:hover,
.sidebar-footer:hover {
color: #fff;
background: rgb(255 255 255 / 6%);
}
.nav-item--active {
color: #fff;
background: linear-gradient(135deg, #1479e8, #1267ca);
box-shadow: 0 7px 18px rgb(7 96 193 / 26%);
}
.sidebar-footer {
width: calc(100% - 18px);
margin: auto 9px 17px;
}
.main-area {
display: flex;
min-width: 0;
flex: 1;
flex-direction: column;
height: 100vh;
}
.topbar {
position: relative;
z-index: 2;
display: flex;
height: 70px;
min-height: 70px;
align-items: center;
justify-content: space-between;
padding: 0 22px;
border-bottom: 1px solid #dfe6ee;
background: #fff;
}
.page-title,
.topbar__actions,
.workspace-switcher,
.user-menu {
display: flex;
align-items: center;
}
.page-title {
gap: 9px;
}
.page-title h1 {
margin: 1px 0 0;
color: #14243a;
font-size: 18px;
line-height: 1.1;
}
.page-title__eyebrow {
color: #94a2b3;
font-size: 10px;
font-weight: 650;
letter-spacing: .08em;
text-transform: uppercase;
}
.icon-button {
display: grid;
width: 34px;
height: 34px;
place-items: center;
border: 1px solid #dfe6ed;
border-radius: 7px;
background: #fff;
cursor: pointer;
}
.icon-button:hover {
border-color: #b9c9da;
background: #f7faff;
}
.icon-button--back {
width: 31px;
border-color: transparent;
color: #7b8999;
transform: rotate(180deg);
}
.topbar__actions {
gap: 14px;
}
.topbar-menu-wrap {
position: relative;
display: flex;
align-items: center;
gap: 9px;
}
.topbar-dropdown {
position: absolute;
z-index: 50;
top: calc(100% + 7px);
right: 0;
width: 260px;
padding: 6px;
border: 1px solid #dce5ed;
border-radius: 8px;
background: #fff;
box-shadow: 0 14px 38px rgb(17 43 70 / 18%);
}
.topbar-dropdown--users {
width: 220px;
}
.topbar-dropdown > button {
display: flex;
width: 100%;
align-items: center;
gap: 10px;
padding: 9px 10px;
border: 0;
border-radius: 6px;
color: #40576d;
background: transparent;
text-align: left;
cursor: pointer;
}
.topbar-dropdown > button:hover,
.topbar-dropdown > button.is-selected {
background: #edf6ff;
}
.topbar-dropdown > button > span:not(.avatar) {
display: flex;
min-width: 0;
flex-direction: column;
gap: 2px;
}
.topbar-dropdown strong {
overflow: hidden;
color: #243a50;
font-size: 11px;
text-overflow: ellipsis;
white-space: nowrap;
}
.topbar-dropdown small {
color: #8797a7;
font-size: 9px;
}
.api-state {
display: flex;
align-items: center;
gap: 7px;
color: #768597;
font-size: 12px;
}
.api-state__dot {
width: 7px;
height: 7px;
border-radius: 50%;
background: #d05151;
box-shadow: 0 0 0 3px rgb(208 81 81 / 10%);
}
.api-state__dot.is-online {
background: #19b878;
box-shadow: 0 0 0 3px rgb(25 184 120 / 11%);
}
.workspace-switcher,
.user-menu {
height: 46px;
gap: 9px;
padding: 0 11px;
border: 1px solid #e0e7ee;
border-radius: 8px;
background: #fff;
cursor: pointer;
}
.workspace-switcher:hover,
.user-menu:hover {
border-color: #b9cce0;
}
.workspace-switcher__icon {
display: grid;
width: 30px;
height: 30px;
place-items: center;
border-radius: 7px;
color: #fff;
background: linear-gradient(145deg, #23aa73, #158d5d);
}
.workspace-switcher span:not(.workspace-switcher__icon),
.user-menu__copy {
display: flex;
min-width: 155px;
flex-direction: column;
align-items: flex-start;
}
.workspace-switcher small,
.user-menu small {
color: #97a3b1;
font-size: 10px;
}
.workspace-switcher strong,
.user-menu strong {
max-width: 190px;
overflow: hidden;
color: #26384d;
font-size: 13px;
text-overflow: ellipsis;
white-space: nowrap;
}
.user-menu {
border-color: transparent;
}
.user-menu__copy {
min-width: 50px;
}
.avatar {
display: grid;
width: 34px;
height: 34px;
place-items: center;
border-radius: 50%;
color: #fff;
background: linear-gradient(145deg, #3b92ed, #1869c9);
font-size: 14px;
font-weight: 700;
}
.workspace-layout {
display: grid;
min-height: 0;
flex: 1;
grid-template-columns: 310px minmax(0, 1fr);
gap: 10px;
padding: 10px;
}
.explorer,
.editor-area {
min-height: 0;
border: 1px solid #dce4ec;
border-radius: 7px;
background: #fff;
box-shadow: 0 2px 7px rgb(25 46 73 / 3%);
}
.explorer {
display: flex;
overflow: hidden;
flex-direction: column;
}
.explorer__header {
display: flex;
min-height: 64px;
align-items: center;
justify-content: space-between;
padding: 0 14px;
border-bottom: 1px solid #e8edf2;
}
.explorer__header h2 {
margin: 0 0 2px;
color: #1d2d42;
font-size: 16px;
}
.explorer__header > div > span {
color: #9aa7b6;
font-size: 10px;
}
.explorer__actions {
display: flex;
align-items: center;
gap: 9px;
}
.text-button {
display: inline-flex;
align-items: center;
gap: 3px;
padding: 5px 1px;
border: 0;
color: #1474d4;
background: transparent;
cursor: pointer;
font-size: 12px;
font-weight: 600;
}
.text-button:hover {
color: #0d58a2;
}
.text-button:disabled {
cursor: wait;
opacity: .55;
}
.visually-hidden {
position: absolute !important;
width: 1px !important;
height: 1px !important;
overflow: hidden !important;
clip: rect(0 0 0 0) !important;
clip-path: inset(50%) !important;
white-space: nowrap !important;
}
.search-box {
display: flex;
height: 38px;
align-items: center;
gap: 7px;
margin: 11px 12px 7px;
padding: 0 9px;
border: 1px solid #dce5ed;
border-radius: 6px;
color: #95a2b1;
background: #fbfcfd;
}
.search-box:focus-within {
border-color: #6aa9e9;
box-shadow: 0 0 0 3px rgb(31 119 207 / 8%);
}
.search-box input {
min-width: 0;
flex: 1;
border: 0;
outline: 0;
color: #26384d;
background: transparent;
font-size: 12px;
}
.search-box input::placeholder {
color: #a7b2bf;
}
.search-box button {
display: grid;
width: 24px;
height: 24px;
place-items: center;
border: 0;
color: #8d9aaa;
background: transparent;
cursor: pointer;
}
.is-spinning svg {
animation: spin .7s linear infinite;
}
.tree-scroll {
min-height: 0;
flex: 1;
overflow-y: auto;
padding: 5px 7px 14px;
}
.tree-group {
margin-bottom: 7px;
}
.tree-group__title {
display: flex;
width: 100%;
height: 33px;
align-items: center;
gap: 6px;
padding: 0 7px;
border: 0;
color: #43556a;
background: transparent;
font-family: inherit;
font-size: 12px;
font-weight: 650;
text-align: left;
cursor: pointer;
}
.tree-group__title > svg:first-child {
color: #98a5b2;
transform: rotate(0);
transition: transform 0.15s ease;
}
.tree-group__title.is-open > svg:first-child {
transform: rotate(90deg);
}
.tree-group__title:hover {
background: #f4f8fc;
}
.tree-group__title > svg:nth-child(2) {
color: #eab434;
fill: #f7c84a;
stroke: #e0a828;
}
.tree-group__title em {
display: grid;
min-width: 19px;
height: 18px;
margin-left: auto;
place-items: center;
border-radius: 10px;
color: #778698;
background: #eef2f6;
font-size: 10px;
font-style: normal;
}
.tree-group__items {
display: flex;
flex-direction: column;
gap: 2px;
padding-left: 13px;
}
.directory-branch {
display: flex;
flex-direction: column;
}
.directory-row {
display: flex;
width: 100%;
height: 32px;
align-items: center;
gap: 6px;
padding-right: 9px;
border: 0;
border-radius: 5px;
color: #45586c;
background: transparent;
cursor: pointer;
text-align: left;
}
.directory-row:hover {
background: #f4f7fa;
}
.directory-row > svg {
flex: 0 0 auto;
color: #e2aa27;
fill: #f7c84a;
}
.directory-row strong {
overflow: hidden;
font-size: 11px;
font-weight: 650;
text-overflow: ellipsis;
white-space: nowrap;
}
.directory-row__chevron {
display: grid;
flex: 0 0 auto;
place-items: center;
color: #94a2b1;
transition: transform .15s ease;
}
.directory-row__chevron.is-open {
transform: rotate(90deg);
}
.script-row {
display: flex;
width: 100%;
height: 47px;
align-items: center;
gap: 8px;
padding: 0 9px;
border: 1px solid transparent;
border-radius: 6px;
background: transparent;
cursor: pointer;
text-align: left;
}
.script-row:hover {
background: #f4f7fa;
}
.script-row--active {
border-color: #c6ddf4;
background: #eaf4ff;
}
.file-icon {
display: grid;
width: 25px;
height: 25px;
flex: 0 0 auto;
place-items: center;
border-radius: 5px;
}
.file-icon--notebook {
color: #e15e50;
background: #fff0ed;
}
.file-icon--python {
color: #2e73c6;
background: #eaf3ff;
}
.script-row__copy {
display: flex;
min-width: 0;
flex: 1;
flex-direction: column;
}
.script-row__copy strong {
overflow: hidden;
color: #34475d;
font-size: 12px;
font-weight: 600;
text-overflow: ellipsis;
white-space: nowrap;
}
.script-row__copy small {
margin-top: 2px;
color: #9ba8b7;
font-size: 9px;
}
.visibility-dot {
width: 6px;
height: 6px;
flex: 0 0 auto;
border-radius: 50%;
background: #1dbd7c;
box-shadow: 0 0 0 3px rgb(29 189 124 / 10%);
}
.lock-badge {
display: inline-flex;
align-items: center;
justify-content: center;
color: #c79a3a;
margin-right: 4px;
}
.tree-group__empty {
margin: 2px 0 7px 35px;
color: #a5b0bc;
font-size: 11px;
}
.tree-context-menu {
position: fixed;
z-index: 50;
display: flex;
width: 180px;
padding: 6px;
border: 1px solid #d9e2ea;
border-radius: 8px;
flex-direction: column;
background: #fff;
box-shadow: 0 14px 34px rgb(18 43 68 / 20%);
}
.tree-context-menu button {
display: flex;
height: 34px;
align-items: center;
gap: 9px;
padding: 0 9px;
border: 0;
border-radius: 5px;
color: #34475a;
background: transparent;
cursor: pointer;
font-size: 11px;
text-align: left;
}
.tree-context-menu button:hover {
color: #136dbd;
background: #eef6fd;
}
.tree-context-menu button.is-danger {
color: #c74848;
}
.tree-context-menu button.is-danger:hover {
background: #fff0f0;
}
.tree-context-menu__separator {
height: 1px;
margin: 5px 3px;
background: #e7ecf1;
}
.tree-empty {
display: flex;
align-items: center;
flex-direction: column;
padding: 34px 18px;
color: #97a4b4;
text-align: center;
}
.tree-empty__icon {
display: grid;
width: 46px;
height: 46px;
margin-bottom: 12px;
place-items: center;
border-radius: 13px;
color: #6796c5;
background: #eff6fd;
}
.tree-empty strong {
color: #637286;
font-size: 12px;
}
.tree-empty p {
margin: 6px 0 14px;
font-size: 10px;
line-height: 1.5;
}
.tree-empty button {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 7px 11px;
border: 1px solid #bcd6ee;
border-radius: 6px;
color: #176cc1;
background: #fff;
cursor: pointer;
font-size: 11px;
}
.tree-skeleton {
display: flex;
flex-direction: column;
gap: 8px;
padding: 15px 8px;
}
.tree-skeleton span {
height: 43px;
border-radius: 6px;
background: linear-gradient(90deg, #f2f5f8, #fafbfc, #f2f5f8);
background-size: 200% 100%;
animation: shimmer 1.3s infinite;
}
.editor-area {
display: flex;
overflow: hidden;
flex-direction: column;
}
.tabbar {
display: flex;
height: 43px;
min-height: 43px;
align-items: stretch;
border-bottom: 1px solid #e5ebf1;
background: #f7f9fb;
overflow: hidden;
position: relative;
}
.tabbar-scroll-content {
display: flex;
flex: 1;
overflow-x: auto;
overflow-y: hidden;
scroll-behavior: smooth;
}
.tabbar-scroll-content::-webkit-scrollbar {
height: 6px;
}
.tabbar-scroll-content::-webkit-scrollbar-track {
background: #f1f3f5;
}
.tabbar-scroll-content::-webkit-scrollbar-thumb {
background: #c9d6e4;
border-radius: 3px;
}
.tabbar-scroll-content::-webkit-scrollbar-thumb:hover {
background: #a8b9ca;
}
.tabbar-scroll-btn {
display: grid;
width: 28px;
flex: 0 0 auto;
place-items: center;
border: 0;
border-right: 1px solid #e4eaf0;
color: #6b7c8f;
background: #f7f9fb;
cursor: pointer;
z-index: 1;
transition: background 0.15s ease;
}
.tabbar-scroll-btn--right {
border-right: 0;
border-left: 1px solid #e4eaf0;
}
.tabbar-scroll-btn:hover {
background: #edf1f5;
color: #3d4c5c;
}
.tabbar-scroll-btn--left {
transform: rotate(180deg);
}
.editor-tab {
position: relative;
display: flex;
min-width: 100px;
max-width: 290px;
align-items: center;
gap: 6px;
padding: 0 6px;
border-right: 1px solid #e4eaf0;
color: #4b5c70;
background: #fff;
cursor: pointer;
font-size: 12px;
flex-shrink: 0;
}
.editor-tab:hover {
background: #f0f4f8;
}
.editor-tab--active::before {
position: absolute;
top: 0;
right: 0;
left: 0;
height: 2px;
background: #2381e5;
content: "";
}
.editor-tab > span:nth-child(2) {
overflow: hidden;
flex: 1;
text-overflow: ellipsis;
white-space: nowrap;
}
.editor-tab button,
.new-tab {
display: grid;
width: 25px;
height: 25px;
place-items: center;
border: 0;
color: #8e9baa;
background: transparent;
cursor: pointer;
}
.editor-tab button:hover,
.new-tab:hover {
color: #43566c;
background: #edf1f5;
}
.new-tab {
align-self: center;
margin-left: 5px;
border-radius: 4px;
}
.editor-toolbar {
display: flex;
min-height: 53px;
align-items: center;
justify-content: space-between;
padding: 0 14px;
border-bottom: 1px solid #e6ebf0;
background: #fff;
}
.editor-toolbar__path,
.editor-toolbar__actions {
display: flex;
align-items: center;
}
.editor-toolbar__path {
min-width: 0;
gap: 7px;
color: #8794a3;
font-size: 11px;
}
.editor-toolbar__path strong {
overflow: hidden;
max-width: 300px;
color: #45576b;
text-overflow: ellipsis;
white-space: nowrap;
}
.editor-toolbar__actions {
gap: 7px;
}
.editor-toolbar__actions button {
height: 31px;
padding: 0 11px;
border: 1px solid #d9e3ec;
border-radius: 5px;
color: #52708d;
background: #fff;
cursor: pointer;
font-size: 11px;
}
.editor-toolbar__actions button:hover {
border-color: #9dbbd8;
background: #f7fbff;
}
.editor-toolbar__actions button:disabled,
.open-editor-button:disabled {
cursor: wait;
opacity: .7;
}
.editor-toolbar__actions .end-edit-button {
border-color: #e1b8b8;
color: #a34c4c;
background: #fff8f8;
}
.editor-toolbar__actions .release-button {
border-color: #e7c689;
color: #9b6a18;
background: #fffbf3;
}
.stage-badge {
display: inline-flex;
height: 29px;
align-items: center;
gap: 6px;
padding: 0 10px;
border-radius: 15px;
color: #16845c;
background: #eaf9f3;
font-size: 10px;
}
.stage-badge span {
width: 6px;
height: 6px;
border-radius: 50%;
background: #20bc7f;
}
.stage-badge.is-editing {
color: #126b9d;
background: #e9f5fd;
}
.stage-badge.is-editing span {
background: #2495d3;
box-shadow: 0 0 0 3px rgb(36 149 211 / 13%);
animation: lock-pulse 1.8s ease-in-out infinite;
}
.editor-canvas {
min-height: 0;
flex: 1;
overflow: auto;
background:
linear-gradient(rgb(255 255 255 / 82%), rgb(255 255 255 / 82%)),
radial-gradient(circle, #c9d8e7 1px, transparent 1px);
background-color: #f4f7fa;
background-size: auto, 18px 18px;
}
.editor-canvas.is-embedded {
overflow: hidden;
background: #fff;
}
.embedded-jupyter {
display: flex;
width: 100%;
height: 100%;
min-height: 0;
flex-direction: column;
background: #fff;
}
.embedded-jupyter__status {
display: flex;
min-height: 34px;
align-items: center;
gap: 18px;
padding: 0 14px;
border-bottom: 1px solid #dfe6ec;
color: #718195;
background: #f8fafc;
font-size: 9px;
}
.embedded-jupyter__status > span {
display: inline-flex;
align-items: center;
gap: 6px;
}
.embedded-jupyter__status > span:first-child {
color: #197b59;
font-weight: 650;
}
.embedded-jupyter__status i {
width: 7px;
height: 7px;
border-radius: 50%;
background: #20b77d;
box-shadow: 0 0 0 3px rgb(32 183 125 / 12%);
}
.embedded-jupyter__status code {
margin-left: auto;
color: #72859a;
font-size: 9px;
}
.embedded-jupyter iframe {
width: 100%;
min-height: 0;
flex: 1;
border: 0;
background: #fff;
}
.editor-opening-state {
display: flex;
width: min(520px, calc(100% - 48px));
min-height: 260px;
align-items: center;
justify-content: center;
flex-direction: column;
margin: 64px auto;
padding: 36px;
border: 1px solid #dce5ed;
border-radius: 10px;
color: #66788d;
background: rgb(255 255 255 / 94%);
box-shadow: 0 12px 34px rgb(31 64 98 / 7%);
text-align: center;
}
.editor-opening-state__icon {
display: grid;
width: 54px;
height: 54px;
place-items: center;
margin-bottom: 16px;
border-radius: 50%;
color: #247bc5;
background: #edf6ff;
}
.editor-opening-state__icon .button-spinner {
width: 24px;
height: 24px;
border-width: 3px;
}
.editor-opening-state strong {
color: #1d344d;
font-size: 16px;
}
.editor-opening-state p {
max-width: 430px;
margin: 9px 0 0;
color: #7a8a9b;
font-size: 12px;
line-height: 1.7;
overflow-wrap: anywhere;
}
.editor-opening-state.has-error {
border-color: #f0cfcc;
}
.editor-opening-state.has-error .editor-opening-state__icon {
color: #c84f49;
background: #fff1f0;
}
.editor-opening-state .open-editor-button {
margin-top: 18px;
}
.script-overview {
width: min(1020px, calc(100% - 48px));
margin: 24px auto 38px;
}
.script-overview__header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 20px;
padding: 23px 26px;
border: 1px solid #dce5ed;
border-radius: 9px 9px 0 0;
background: #fff;
}
.section-kicker {
color: #2b7fca;
font-size: 9px;
font-weight: 800;
letter-spacing: .13em;
}
.script-overview__header h2 {
margin: 6px 0 4px;
color: #1b2d43;
font-size: 22px;
}
.script-overview__header p {
margin: 0;
color: #8997a6;
font-family: Consolas, "SFMono-Regular", monospace;
font-size: 10px;
}
.open-editor-button,
.primary-button,
.secondary-button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 7px;
border-radius: 6px;
cursor: pointer;
font-weight: 650;
}
.open-editor-button {
height: 37px;
padding: 0 14px;
border: 1px solid #b9d4ef;
color: #176cc0;
background: #f4f9ff;
font-size: 11px;
}
.open-editor-button:hover {
border-color: #7eafe0;
background: #eaf4ff;
}
.open-editor-button.is-editing {
border-color: #69b79a;
color: #137a55;
background: #effaf5;
}
.button-spinner--blue {
border-color: rgb(34 121 199 / 22%);
border-top-color: #2279c7;
}
.metadata-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
border-right: 1px solid #dce5ed;
border-bottom: 1px solid #dce5ed;
border-left: 1px solid #dce5ed;
background: #f9fbfd;
}
.metadata-grid > div {
display: flex;
min-height: 64px;
justify-content: center;
flex-direction: column;
padding: 0 21px;
border-right: 1px solid #e4eaf0;
}
.metadata-grid > div:last-child {
border-right: 0;
}
.metadata-grid span {
color: #94a0ae;
font-size: 9px;
}
.metadata-grid strong {
margin-top: 4px;
color: #405368;
font-size: 12px;
}
.preview-card {
overflow: hidden;
margin-top: 15px;
border: 1px solid #d8e1e9;
border-radius: 9px;
background: #fff;
box-shadow: 0 8px 25px rgb(23 52 81 / 7%);
}
.preview-card__bar {
display: grid;
height: 39px;
align-items: center;
grid-template-columns: 1fr auto 1fr;
padding: 0 13px;
border-bottom: 1px solid #e4e9ee;
color: #66778a;
background: #f4f6f8;
font-size: 10px;
}
.preview-card__bar > div {
display: flex;
gap: 6px;
}
.preview-card__bar em {
justify-self: end;
color: #9aa6b3;
font-style: normal;
}
.window-dot {
width: 8px;
height: 8px;
border-radius: 50%;
}
.window-dot--red { background: #ef6b62; }
.window-dot--yellow { background: #e9b949; }
.window-dot--green { background: #49b97b; }
.notebook-menu {
display: flex;
height: 34px;
align-items: center;
gap: 19px;
padding: 0 19px;
border-bottom: 1px solid #edf0f3;
color: #29394c;
font-family: Arial, sans-serif;
font-size: 10px;
}
.notebook-tools {
display: flex;
height: 37px;
align-items: center;
gap: 5px;
padding: 0 17px;
border-bottom: 1px solid #e8ecf0;
color: #5d6c7b;
background: #fbfcfd;
font-size: 10px;
}
.notebook-tools button {
width: 24px;
height: 23px;
border: 1px solid #dfe5eb;
border-radius: 3px;
color: #677585;
background: #fff;
}
.notebook-tools span {
min-width: 100px;
margin-left: 7px;
padding: 5px 9px;
border: 1px solid #dfe5eb;
background: #fff;
}
.notebook-tools em {
margin-left: auto;
color: #728091;
font-style: normal;
}
.notebook-preview {
min-height: 300px;
}
.cell {
position: relative;
width: calc(100% - 65px);
margin: 23px 21px 13px 44px;
padding: 13px 17px;
border: 1px solid #d9e1e8;
border-left: 3px solid #2e83d3;
background: #f8fafc;
}
.cell--muted {
border-left-color: #9ab1c7;
}
.cell__prompt {
position: absolute;
left: -37px;
color: #4b79ab;
font-family: Consolas, monospace;
font-size: 10px;
}
.cell pre,
.python-preview pre {
margin: 0;
color: #293b50;
font: 11px/1.75 Consolas, "SFMono-Regular", monospace;
}
.cell pre b,
.python-preview b {
color: #9c35a5;
}
.cell pre i,
.python-preview i {
color: #b35336;
font-style: normal;
}
.cell pre span {
color: #8392a1;
}
.python-preview {
display: flex;
min-height: 330px;
padding: 25px 0;
background: #fbfcfe;
}
.line-numbers {
width: 45px;
margin-right: 16px;
padding-right: 13px;
border-right: 1px solid #e4e9ee;
color: #abb5c0;
font: 11px/1.75 Consolas, monospace;
text-align: right;
}
.code-comment { color: #799469; }
.code-function { color: #3269a8; }
.integrity-row {
display: flex;
align-items: center;
gap: 24px;
margin-top: 12px;
padding: 0 3px;
color: #8795a4;
font-size: 10px;
}
.integrity-row span {
display: inline-flex;
align-items: center;
gap: 5px;
}
.integrity-row span:first-child {
color: #25875e;
}
.welcome-panel {
display: flex;
min-height: 100%;
align-items: center;
justify-content: center;
flex-direction: column;
padding: 35px;
background:
radial-gradient(circle at 50% 39%, rgb(74 150 225 / 9%), transparent 24%),
radial-gradient(circle, #d3dee8 1px, transparent 1px);
background-size: auto, 18px 18px;
text-align: center;
}
.welcome-panel__visual {
display: grid;
width: 86px;
height: 86px;
margin-bottom: 21px;
place-items: center;
border: 1px solid #cfe0f0;
border-radius: 25px;
color: #3d8cd9;
background: linear-gradient(145deg, #fff, #eaf4fd);
box-shadow: 0 16px 35px rgb(40 103 165 / 12%);
}
.welcome-panel__label {
color: #2e81ce;
font-size: 10px;
font-weight: 800;
letter-spacing: .12em;
}
.welcome-panel h2 {
margin: 9px 0 7px;
color: #21354c;
font-size: 23px;
}
.welcome-panel p {
width: min(430px, 100%);
margin: 0 0 22px;
color: #76879a;
font-size: 12px;
line-height: 1.8;
}
.primary-button {
min-height: 37px;
padding: 0 15px;
border: 1px solid #126ac3;
color: #fff;
background: linear-gradient(135deg, #1881e7, #1268c9);
box-shadow: 0 6px 15px rgb(20 111 202 / 18%);
font-size: 12px;
}
.primary-button:hover:not(:disabled) {
background: linear-gradient(135deg, #1175d8, #0e5bad);
}
.primary-button:disabled {
cursor: not-allowed;
opacity: .58;
}
.secondary-button {
min-height: 37px;
padding: 0 15px;
border: 1px solid #d8e1e9;
color: #56687c;
background: #fff;
font-size: 12px;
}
.modal-backdrop {
position: fixed;
z-index: 20;
display: grid;
inset: 0;
place-items: center;
background: rgb(10 27 45 / 43%);
backdrop-filter: blur(2px);
}
.modal {
width: min(520px, calc(100vw - 40px));
overflow: visible;
border: 1px solid #dce4eb;
border-radius: 11px;
background: #fff;
box-shadow: 0 24px 70px rgb(8 27 48 / 25%);
animation: modal-in .18s ease-out;
}
.modal--compact {
width: min(480px, calc(100vw - 40px));
max-height: 80vh;
display: flex;
flex-direction: column;
}
.modal--compact .modal__header {
flex-shrink: 0;
}
.modal--compact form {
padding: 19px 22px 0;
flex: 1;
overflow-y: auto;
}
.modal--compact .modal__footer {
flex-shrink: 0;
margin: 0;
}
.modal__header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20px 22px 16px;
border-bottom: 1px solid #e7ecf1;
}
.modal__eyebrow {
color: #2d82d4;
font-size: 9px;
font-weight: 800;
letter-spacing: .12em;
}
.modal__header h2 {
margin: 4px 0 0;
color: #1c2d42;
font-size: 19px;
}
.modal form {
padding: 19px 22px 0;
flex: 1;
overflow-y: auto;
}
.destination-chip {
display: flex;
align-items: center;
gap: 7px;
margin-bottom: 15px;
padding: 9px 10px;
border: 1px solid #dce7ef;
border-radius: 6px;
color: #587087;
background: #f7fafc;
font-size: 10px;
}
.destination-chip svg {
color: #dda321;
fill: #f7c84a;
}
.form-field {
display: flex;
margin-bottom: 17px;
flex-direction: column;
gap: 7px;
color: #3c4e62;
font-size: 12px;
font-weight: 650;
}
.form-field input,
.form-field select,
.form-field textarea {
width: 100%;
padding: 0 11px;
border: 1px solid #d6e0e9;
border-radius: 6px;
outline: 0;
color: #283a4e;
background: #fff;
font-size: 12px;
}
.form-field input,
.form-field select {
height: 39px;
}
.form-field textarea {
min-height: 92px;
padding-top: 10px;
resize: vertical;
font-family: inherit;
line-height: 1.55;
}
.form-field input:focus,
.form-field select:focus,
.form-field textarea:focus {
border-color: #5b9ddb;
box-shadow: 0 0 0 3px rgb(38 125 207 / 8%);
}
.form-field small {
color: #98a5b3;
font-size: 9px;
font-weight: 400;
}
.publish-source {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 17px;
padding: 11px 12px;
border: 1px solid #dce6ef;
border-radius: 7px;
background: #f8fbfd;
}
.publish-source > span:last-child {
display: flex;
min-width: 0;
flex-direction: column;
gap: 2px;
}
.publish-source strong {
overflow: hidden;
color: #34485d;
font-size: 12px;
text-overflow: ellipsis;
white-space: nowrap;
}
.publish-source small {
color: #8b99a8;
font-size: 9px;
}
.version-receipt {
width: min(470px, calc(100vw - 40px));
padding: 30px 28px 25px;
text-align: center;
}
.version-receipt__check {
display: grid;
width: 58px;
height: 58px;
margin: 0 auto 14px;
place-items: center;
border-radius: 50%;
color: #fff;
background: linear-gradient(145deg, #24b67d, #149566);
box-shadow: 0 9px 24px rgb(25 157 104 / 25%);
}
.version-receipt h2 {
margin: 5px 0 8px;
color: #24374a;
font-size: 20px;
}
.version-receipt > p {
max-width: 360px;
margin: 0 auto 20px;
color: #718093;
font-size: 11px;
line-height: 1.65;
}
.version-id-box {
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto;
align-items: center;
gap: 9px;
padding: 11px 12px;
border: 1px solid #dce6ee;
border-radius: 7px;
background: #f7fafc;
text-align: left;
}
.version-id-box span {
color: #8795a4;
font-size: 9px;
}
.version-id-box code {
overflow: hidden;
color: #275271;
font-size: 10px;
text-overflow: ellipsis;
white-space: nowrap;
}
.version-id-box button {
padding: 4px 8px;
border: 1px solid #bad3e8;
border-radius: 4px;
color: #2475b7;
background: #fff;
cursor: pointer;
font-size: 9px;
}
.version-receipt__close {
width: 100%;
height: 39px;
margin-top: 17px;
border: 0;
color: #fff;
background: #1976cf;
}
.type-picker {
display: grid;
margin: 0 0 17px;
padding: 0;
border: 0;
grid-template-columns: 1fr 1fr;
gap: 9px;
}
.type-picker legend {
margin-bottom: 7px;
color: #3c4e62;
font-size: 12px;
font-weight: 650;
}
.type-picker button {
position: relative;
display: flex;
min-height: 72px;
align-items: center;
gap: 9px;
padding: 10px;
border: 1px solid #dae2ea;
border-radius: 7px;
background: #fff;
cursor: pointer;
text-align: left;
}
.type-picker button:hover {
border-color: #a9c6e1;
}
.type-picker button.is-selected {
border-color: #4d98df;
background: #f4f9ff;
box-shadow: 0 0 0 2px rgb(49 133 216 / 7%);
}
.type-picker__icon {
display: grid;
width: 37px;
height: 37px;
flex: 0 0 auto;
place-items: center;
border-radius: 8px;
}
.type-picker__icon--notebook {
color: #dd5a4c;
background: #fff0ed;
}
.type-picker__icon--python {
color: #2a75c5;
background: #e9f3ff;
}
.type-picker button > span:nth-child(2) {
display: flex;
min-width: 0;
flex-direction: column;
}
.type-picker strong {
color: #34475b;
font-size: 11px;
}
.type-picker small {
margin-top: 3px;
color: #919eac;
font-size: 8px;
line-height: 1.35;
}
.type-picker__check {
position: absolute;
top: 6px;
right: 6px;
display: none;
width: 17px;
height: 17px;
place-items: center;
border-radius: 50%;
color: #fff;
background: #2e88dd;
}
.is-selected .type-picker__check {
display: grid;
}
.modal__footer {
display: flex;
justify-content: flex-end;
gap: 8px;
margin: 3px -22px 0;
padding: 14px 22px;
border-top: 1px solid #e8edf2;
background: #fafbfc;
}
.button-spinner {
width: 13px;
height: 13px;
border: 2px solid rgb(255 255 255 / 45%);
border-top-color: #fff;
border-radius: 50%;
animation: spin .7s linear infinite;
}
.button-spinner.button-spinner--blue {
border-color: rgb(34 121 199 / 22%);
border-top-color: #2279c7;
}
.toast {
position: fixed;
z-index: 30;
top: 82px;
right: 21px;
display: flex;
min-width: 260px;
max-width: 410px;
min-height: 46px;
align-items: center;
gap: 9px;
padding: 10px 14px;
border: 1px solid #cfdbe6;
border-radius: 8px;
color: #43566a;
background: #fff;
box-shadow: 0 12px 35px rgb(20 42 66 / 14%);
font-size: 12px;
animation: toast-in .2s ease-out;
}
.toast > span {
display: grid;
width: 27px;
height: 27px;
flex: 0 0 auto;
place-items: center;
border-radius: 50%;
}
.toast--success > span {
color: #177b55;
background: #e6f7f0;
}
.toast--error > span {
color: #b94a4a;
background: #fff0f0;
}
.toast--info > span {
color: #2675bf;
background: #eaf4fd;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
@keyframes shimmer {
to { background-position: -200% 0; }
}
@keyframes modal-in {
from { opacity: 0; transform: translateY(8px) scale(.985); }
}
@keyframes toast-in {
from { opacity: 0; transform: translateY(-7px); }
}
@keyframes lock-pulse {
50% { opacity: .5; transform: scale(.78); }
}
@media (max-width: 1280px) {
.sidebar {
width: 184px;
min-width: 184px;
}
.brand__name {
font-size: 13px;
}
.workspace-layout {
grid-template-columns: 285px minmax(0, 1fr);
}
.api-state {
display: none;
}
.workspace-switcher span:not(.workspace-switcher__icon) {
min-width: 130px;
}
.script-overview {
width: calc(100% - 30px);
}
}
/* ============ 只读编辑器样式 ============ */
.readonly-editor-container {
display: flex;
flex-direction: column;
height: 100%;
background: #f8f9fa;
}
.readonly-editor-banner {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
padding: 10px 16px;
background: #fff3cd;
border-bottom: 1px solid #e0e0e0;
color: #856404;
font-size: 13px;
font-weight: 500;
}
.readonly-editor-banner svg {
flex-shrink: 0;
}
.readonly-editor-loading {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
flex: 1;
gap: 16px;
color: #666;
font-size: 14px;
}
.readonly-editor-error {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
flex: 1;
gap: 12px;
color: #dc3545;
font-size: 14px;
text-align: center;
}
.readonly-editor-error strong {
font-size: 16px;
}
.readonly-editor-error p {
margin: 0;
color: #666;
}