: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 { position: relative; 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); } } /* Save button — green primary tone for python editor */ .editor-toolbar__actions .editor-save-button { color: #1f6d3a; background: #f1faf3; border-color: #b8dec1; font-weight: 600; } .editor-toolbar__actions .editor-save-button:disabled { opacity: 0.5; cursor: not-allowed; } .editor-toolbar__actions .editor-save-button.is-saving { color: #1f6d3a; opacity: 0.85; } .editor-toolbar__actions .editor-save-button .button-spinner { width: 12px; height: 12px; } /* Dirty banner — top of editor canvas */ .editor-dirty-banner { display: flex; align-items: center; gap: 8px; padding: 6px 14px; background: #fff7e6; border-bottom: 1px solid #f0d8a8; color: #9b6a18; font-size: 12px; font-weight: 500; } .editor-dirty-banner::before { content: "●"; color: #d49b00; font-size: 10px; } /* Python editor wrapper */ .python-editor { display: flex; flex-direction: column; height: 100%; min-height: 0; background: #fff; } .python-editor__status { display: flex; align-items: center; gap: 16px; padding: 4px 14px; background: #f5f7fa; border-bottom: 1px solid #e6e8ec; font-size: 11px; color: #6b7280; } .python-editor__canvas { flex: 1; min-height: 0; position: relative; overflow: hidden; } /* Python editor mount — multiple instances, only active visible */ .python-editor-mount { display: flex; width: 100%; height: 100%; min-height: 0; flex-direction: column; background: #fff; } /* ============ 只读编辑器样式 ============ */ .readonly-editor-container { display: flex; flex-direction: column; height: 100%; background: #f8f9fa; overflow: hidden; } .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; flex-shrink: 0; } .readonly-editor-content { flex: 1; overflow-y: auto; min-height: 0; } .readonly-editor-banner svg { flex-shrink: 0; } .readonly-editor-loading { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 200px; gap: 16px; color: #666; font-size: 14px; } .readonly-editor-error { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 200px; gap: 12px; color: #dc3545; font-size: 14px; text-align: center; padding: 20px; } .readonly-editor-error strong { font-size: 16px; } .readonly-editor-error p { margin: 0; color: #666; } /* ============ Notebook 只读视图样式 ============ */ .notebook-read-only { display: flex; flex-direction: column; height: 100%; overflow-y: auto; background: #fff; padding: 0; } .notebook-cell { display: flex; width: 100%; min-height: 44px; /* 保证空单元格的最小高度 */ padding: 8px 0; flex-shrink: 0; /* 防止单元格被压缩 */ } .notebook-cell--markdown { padding: 14px 24px; } .notebook-cell--code { padding-left: 0; padding-right: 0; } .notebook-cell__prompt { flex: 0 0 auto; min-width: 90px; padding-right: 16px; padding-left: 16px; color: #8b949e; font-family: "Consolas", "SFMono-Regular", monospace; font-size: 11px; text-align: right; user-select: none; line-height: 1.6; } .notebook-cell__content { flex: 1; min-width: 0; display: flex; flex-direction: column; } .notebook-cell__input { background: #f6f8fa; border-radius: 1px; padding: 6px; margin-right: 14px; border: #ccc 1px solid; min-height: 24px; /* 保证输入区域的最小高度 */ } .notebook-cell__input--empty { min-height: 24px; padding: 0 14px; display: flex; align-items: center; } .notebook-cell__input pre, .notebook-cell__input code { margin: 0; color: #24292f; font-family: "Consolas", "SFMono-Regular", monospace; font-size: 13px; line-height: 1.5; white-space: pre-wrap; word-break: break-word; background: transparent; } .notebook-cell__outputs { margin-top: 8px; } .notebook-output { padding-left: 6px; color: #24292f; font-size: 13px; line-height: 1.5; } .notebook-output pre { margin: 0; font-family: "Consolas", "SFMono-Regular", monospace; font-size: 13px; white-space: pre-wrap; word-break: break-word; } .notebook-output--stdout pre { color: #24292f; } .notebook-cell__content h1, .notebook-cell__content h2, .notebook-cell__content h3, .notebook-cell__content p, .notebook-cell__content li { margin: 6px 0; color: #24292f; font-size: 14px; line-height: 1.6; } .notebook-cell__content h1 { font-size: 24px; color: #1f6feb; font-weight: 600; } .notebook-cell__content h2 { font-size: 20px; color: #1f6feb; font-weight: 600; } .notebook-cell__content h3 { font-size: 16px; color: #24292f; font-weight: 600; } .notebook-cell__content ul, .notebook-cell__content ol { padding-left: 24px; } .notebook-cell__content li { margin-left: 0; list-style-position: outside; }