Feature/physics and tilemap enhancement (#247)

* feat(behavior-tree,tilemap): 修复编辑器连线缩放问题并增强插件系统

* feat(node-editor,blueprint): 新增通用节点编辑器和蓝图可视化脚本系统

* feat(editor,tilemap): 优化编辑器UI样式和Tilemap编辑器功能

* fix: 修复CodeQL安全警告和CI类型检查错误

* fix: 修复CodeQL安全警告和CI类型检查错误

* fix: 修复CodeQL安全警告和CI类型检查错误
This commit is contained in:
YHH
2025-11-29 23:00:48 +08:00
committed by GitHub
parent f03b73b58e
commit 359886c72f
198 changed files with 33879 additions and 13121 deletions

View File

@@ -24,213 +24,14 @@
color: var(--color-text-primary);
}
.editor-titlebar {
display: flex;
align-items: center;
justify-content: center;
height: 22px;
background: linear-gradient(to bottom, #3a3a3f, #2a2a2f);
border-bottom: 1px solid rgba(0, 0, 0, 0.3);
flex-shrink: 0;
position: relative;
-webkit-app-region: drag;
}
.titlebar-project-name {
position: absolute;
left: 8px;
font-size: 11px;
font-weight: 500;
color: #fff;
}
.titlebar-app-name {
font-size: 11px;
color: #888;
}
.editor-header {
display: flex;
align-items: center;
justify-content: space-between;
height: 28px;
padding: 0 8px;
background-color: #1a1a1f;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
flex-shrink: 0;
transition: all 0.3s ease;
z-index: var(--z-index-dropdown);
position: relative;
}
.editor-header.remote-connected .status {
color: #4ade80;
}
.editor-header.remote-connected .status::before {
background-color: #4ade80;
}
.header-right {
display: flex;
align-items: center;
gap: 6px;
margin-left: auto;
}
.toolbar-btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--spacing-xs);
height: var(--size-button-sm);
padding: 0 var(--spacing-md);
background-color: var(--color-primary);
color: var(--color-text-inverse);
border: none;
border-radius: var(--radius-sm);
font-size: var(--font-size-sm);
font-weight: var(--font-weight-medium);
cursor: pointer;
transition: all var(--transition-fast);
user-select: none;
}
.toolbar-btn:hover:not(:disabled) {
background-color: var(--color-primary-hover);
transform: translateY(-1px);
box-shadow: var(--shadow-sm);
}
.toolbar-btn:active:not(:disabled) {
background-color: var(--color-primary-active);
transform: translateY(0);
box-shadow: var(--shadow-inner);
}
.toolbar-btn:disabled {
background-color: var(--color-bg-input);
color: var(--color-text-disabled);
cursor: not-allowed;
opacity: 0.6;
}
.toolbar-btn:focus-visible {
outline: 2px solid var(--color-focus);
outline-offset: 2px;
}
.toolbar-btn svg {
width: var(--size-icon-sm);
height: var(--size-icon-sm);
}
.locale-btn {
width: 22px;
height: 22px;
padding: 0;
background-color: transparent;
color: #888;
border: none;
border-radius: 2px;
}
.locale-btn:hover:not(:disabled) {
background-color: rgba(255, 255, 255, 0.08);
color: #ccc;
border-color: transparent;
transform: none;
box-shadow: none;
}
.locale-dropdown {
position: relative;
}
.locale-btn {
display: flex;
align-items: center;
gap: 4px;
width: auto;
padding: 0 6px;
}
.locale-label {
font-size: 10px;
}
.locale-menu {
position: absolute;
top: 100%;
right: 0;
margin-top: 4px;
min-width: 100px;
background: #252529;
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 3px;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.6);
padding: 4px 0;
z-index: var(--z-index-dropdown);
}
.locale-menu-item {
display: block;
width: 100%;
padding: 6px 12px;
background: transparent;
border: none;
color: #ccc;
font-size: 11px;
text-align: left;
cursor: pointer;
transition: all 0.1s;
}
.locale-menu-item:hover {
background: #3b82f6;
color: #fff;
}
.locale-menu-item.active {
color: #3b82f6;
}
.locale-menu-item.active:hover {
color: #fff;
}
.editor-header .status {
display: flex;
align-items: center;
gap: 4px;
font-size: 10px;
color: #4ade80;
white-space: nowrap;
}
.editor-header .status::before {
content: '';
width: 5px;
height: 5px;
background-color: #4ade80;
border-radius: 50%;
animation: pulse 2s ease-in-out infinite;
}
@keyframes pulse {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0.5;
}
}
.editor-content {
display: flex;
flex: 1;
overflow: hidden;
cursor: default;
/* Leave space for StatusBar */
padding-bottom: 24px;
}
.viewport {
@@ -238,7 +39,7 @@
flex-direction: column;
height: 100%;
background-color: var(--color-bg-base);
padding: var(--spacing-lg);
padding: 0;
}
.viewport h3 {
@@ -258,7 +59,7 @@
align-items: center;
justify-content: space-between;
height: var(--layout-footer-height);
padding: 0 var(--spacing-lg);
padding: 0 8px;
background-color: var(--color-primary);
color: var(--color-text-inverse);
font-size: var(--font-size-xs);

View File

@@ -9,9 +9,12 @@
}
.asset-browser-header {
padding: 12px 15px;
padding: 0 8px;
background: #252526;
border-bottom: 1px solid #333;
height: 26px;
display: flex;
align-items: center;
}
.asset-browser-header h3 {

View File

@@ -10,11 +10,12 @@
display: flex;
align-items: center;
justify-content: space-between;
padding: 6px 8px;
padding: 0 8px;
background: var(--color-bg-elevated);
border-bottom: 1px solid var(--color-border-default);
flex-shrink: 0;
gap: 8px;
height: 26px;
}
.console-toolbar-left {

View File

@@ -0,0 +1,628 @@
/* ==================== Content Browser Styles ==================== */
.content-browser {
display: flex;
height: 100%;
background: #1e1e1e;
color: #e0e0e0;
font-size: 12px;
}
.content-browser.is-drawer {
border-top: 2px solid #3b82f6;
}
.content-browser-empty {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
color: #666;
}
/* ==================== Left Panel - Folder Tree ==================== */
.content-browser-left {
width: 200px;
min-width: 150px;
max-width: 300px;
display: flex;
flex-direction: column;
background: #252526;
border-right: 1px solid #3c3c3c;
overflow: hidden;
}
/* Section (Favorites, Collections) */
.cb-section {
border-bottom: 1px solid #3c3c3c;
}
.cb-section-header {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 12px;
font-size: 11px;
font-weight: 600;
color: #999;
cursor: pointer;
user-select: none;
}
.cb-section-header:hover {
background: #2d2d30;
}
.cb-section-header span {
flex: 1;
}
.cb-section-actions {
display: flex;
gap: 2px;
}
.cb-section-btn {
display: flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
background: transparent;
border: none;
border-radius: 3px;
color: #666;
cursor: pointer;
}
.cb-section-btn:hover {
background: #3c3c3c;
color: #999;
}
.cb-section-content {
padding: 4px 0;
}
.cb-section-empty {
padding: 8px 12px;
color: #555;
font-size: 11px;
font-style: italic;
}
/* Folder Tree */
.cb-folder-tree {
flex: 1;
overflow-y: auto;
padding: 4px 0;
}
.folder-tree-item {
display: flex;
align-items: center;
gap: 4px;
padding: 4px 8px;
cursor: pointer;
user-select: none;
transition: background 0.1s ease;
}
.folder-tree-item:hover {
background: #2d2d30;
}
.folder-tree-item.selected {
background: #094771;
}
.folder-tree-expand {
display: flex;
align-items: center;
justify-content: center;
width: 14px;
height: 14px;
color: #888;
flex-shrink: 0;
}
.folder-tree-icon {
display: flex;
align-items: center;
color: #dcb67a;
flex-shrink: 0;
}
.folder-tree-name {
flex: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-size: 12px;
}
/* ==================== Right Panel - Content Area ==================== */
.content-browser-right {
flex: 1;
display: flex;
flex-direction: column;
min-width: 0;
background: #1e1e1e;
}
/* Top Toolbar */
.cb-toolbar {
display: flex;
align-items: center;
padding: 6px 12px;
gap: 8px;
background: #2d2d30;
border-bottom: 1px solid #3c3c3c;
}
.cb-toolbar-left {
display: flex;
gap: 4px;
}
.cb-toolbar-btn {
display: flex;
align-items: center;
gap: 6px;
padding: 5px 10px;
background: transparent;
border: none;
border-radius: 3px;
color: #ccc;
font-size: 12px;
cursor: pointer;
transition: all 0.1s ease;
}
.cb-toolbar-btn:hover {
background: #3c3c3c;
}
.cb-toolbar-btn.primary {
background: #3b82f6;
color: #fff;
}
.cb-toolbar-btn.primary:hover {
background: #2563eb;
}
.cb-toolbar-btn.dock-btn {
background: #3c3c3c;
}
/* Breadcrumb */
.cb-breadcrumb {
flex: 1;
display: flex;
align-items: center;
gap: 2px;
padding: 0 8px;
overflow: hidden;
}
.cb-breadcrumb-item {
display: flex;
align-items: center;
gap: 2px;
white-space: nowrap;
}
.cb-breadcrumb-sep {
color: #666;
flex-shrink: 0;
}
.cb-breadcrumb-link {
padding: 2px 6px;
border-radius: 3px;
color: #999;
cursor: pointer;
transition: all 0.1s ease;
}
.cb-breadcrumb-link:hover {
background: #3c3c3c;
color: #fff;
}
.cb-toolbar-right {
display: flex;
gap: 4px;
}
/* Search Bar */
.cb-search-bar {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 12px;
background: #252526;
border-bottom: 1px solid #3c3c3c;
}
.cb-filter-btn {
display: flex;
align-items: center;
gap: 4px;
padding: 5px 8px;
background: #3c3c3c;
border: none;
border-radius: 3px;
color: #999;
cursor: pointer;
}
.cb-filter-btn:hover {
background: #4c4c4c;
color: #ccc;
}
.cb-search-input-wrapper {
flex: 1;
position: relative;
display: flex;
align-items: center;
}
.cb-search-icon {
position: absolute;
left: 10px;
color: #666;
pointer-events: none;
}
.cb-search-input {
width: 100%;
padding: 6px 10px 6px 32px;
background: #3c3c3c;
border: 1px solid #4c4c4c;
border-radius: 3px;
color: #e0e0e0;
font-size: 12px;
outline: none;
}
.cb-search-input:focus {
border-color: #3b82f6;
}
.cb-search-input::placeholder {
color: #666;
}
.cb-view-options {
display: flex;
gap: 2px;
}
.cb-view-btn {
display: flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
background: transparent;
border: none;
border-radius: 3px;
color: #666;
cursor: pointer;
}
.cb-view-btn:hover {
background: #3c3c3c;
color: #999;
}
.cb-view-btn.active {
background: #3c3c3c;
color: #e0e0e0;
}
/* ==================== Asset Grid ==================== */
.cb-asset-grid {
flex: 1;
overflow-y: auto;
padding: 12px;
}
.cb-asset-grid.grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(90px, 1fr));
gap: 8px;
align-content: start;
}
.cb-asset-grid.list {
display: flex;
flex-direction: column;
gap: 2px;
}
.cb-loading,
.cb-empty {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
color: #666;
font-size: 13px;
}
/* Asset Item - Grid View */
.cb-asset-grid.grid .cb-asset-item {
display: flex;
flex-direction: column;
align-items: center;
padding: 12px 8px 8px;
background: transparent;
border-radius: 4px;
cursor: pointer;
transition: all 0.1s ease;
user-select: none;
}
.cb-asset-grid.grid .cb-asset-item:hover {
background: #2d2d30;
}
.cb-asset-grid.grid .cb-asset-item.selected {
background: #094771;
outline: 1px solid #3b82f6;
}
.cb-asset-grid.grid .cb-asset-thumbnail {
width: 64px;
height: 64px;
display: flex;
align-items: center;
justify-content: center;
background: #1a1a1a;
border: 1px solid #333;
border-radius: 4px;
margin-bottom: 8px;
}
.cb-asset-grid.grid .cb-asset-info {
width: 100%;
text-align: center;
}
.cb-asset-grid.grid .cb-asset-name {
font-size: 11px;
color: #e0e0e0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin-bottom: 2px;
}
.cb-asset-grid.grid .cb-asset-type {
font-size: 10px;
color: #666;
}
/* Asset Item - List View */
.cb-asset-grid.list .cb-asset-item {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 12px;
background: transparent;
border-radius: 3px;
cursor: pointer;
transition: all 0.1s ease;
user-select: none;
}
.cb-asset-grid.list .cb-asset-item:hover {
background: #2d2d30;
}
.cb-asset-grid.list .cb-asset-item.selected {
background: #094771;
}
.cb-asset-grid.list .cb-asset-thumbnail {
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.cb-asset-grid.list .cb-asset-info {
flex: 1;
display: flex;
align-items: center;
gap: 16px;
min-width: 0;
}
.cb-asset-grid.list .cb-asset-name {
flex: 1;
font-size: 12px;
color: #e0e0e0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.cb-asset-grid.list .cb-asset-type {
font-size: 11px;
color: #666;
white-space: nowrap;
}
/* Thumbnail Icons */
.asset-thumbnail-icon {
color: #888;
}
.asset-thumbnail-icon.folder {
color: #dcb67a;
}
.asset-thumbnail-icon.scene {
color: #66bb6a;
}
.asset-thumbnail-icon.btree {
color: #ab47bc;
}
.asset-thumbnail-icon.code {
color: #42a5f5;
}
.asset-thumbnail-icon.json {
color: #ffa726;
}
.asset-thumbnail-icon.image {
color: #ec407a;
}
/* ==================== Status Bar ==================== */
.cb-status-bar {
display: flex;
align-items: center;
padding: 4px 12px;
background: #252526;
border-top: 1px solid #3c3c3c;
font-size: 11px;
color: #888;
}
/* ==================== Dialogs ==================== */
.cb-dialog-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
}
.cb-dialog {
min-width: 350px;
background: #2d2d30;
border: 1px solid #3c3c3c;
border-radius: 6px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
}
.cb-dialog-header {
padding: 12px 16px;
border-bottom: 1px solid #3c3c3c;
}
.cb-dialog-header h3 {
margin: 0;
font-size: 14px;
font-weight: 600;
color: #e0e0e0;
}
.cb-dialog-body {
padding: 16px;
}
.cb-dialog-body input {
width: 100%;
padding: 8px 12px;
background: #1e1e1e;
border: 1px solid #3c3c3c;
border-radius: 4px;
color: #e0e0e0;
font-size: 13px;
outline: none;
}
.cb-dialog-body input:focus {
border-color: #3b82f6;
}
.cb-dialog-body p {
margin: 0;
color: #ccc;
font-size: 13px;
}
.cb-dialog-footer {
display: flex;
justify-content: flex-end;
gap: 8px;
padding: 12px 16px;
border-top: 1px solid #3c3c3c;
}
.cb-btn {
padding: 6px 16px;
background: #3c3c3c;
border: none;
border-radius: 4px;
color: #e0e0e0;
font-size: 12px;
cursor: pointer;
transition: background 0.1s ease;
}
.cb-btn:hover {
background: #4c4c4c;
}
.cb-btn.primary {
background: #3b82f6;
color: #fff;
}
.cb-btn.primary:hover {
background: #2563eb;
}
.cb-btn.danger {
background: #dc2626;
color: #fff;
}
.cb-btn.danger:hover {
background: #b91c1c;
}
/* ==================== Scrollbar ==================== */
.content-browser-left::-webkit-scrollbar,
.cb-folder-tree::-webkit-scrollbar,
.cb-asset-grid::-webkit-scrollbar {
width: 8px;
}
.content-browser-left::-webkit-scrollbar-track,
.cb-folder-tree::-webkit-scrollbar-track,
.cb-asset-grid::-webkit-scrollbar-track {
background: transparent;
}
.content-browser-left::-webkit-scrollbar-thumb,
.cb-folder-tree::-webkit-scrollbar-thumb,
.cb-asset-grid::-webkit-scrollbar-thumb {
background: #424242;
border-radius: 4px;
}
.content-browser-left::-webkit-scrollbar-thumb:hover,
.cb-folder-tree::-webkit-scrollbar-thumb:hover,
.cb-asset-grid::-webkit-scrollbar-thumb:hover {
background: #4e4e4e;
}

View File

@@ -2,22 +2,57 @@
display: flex;
flex-direction: column;
height: 100%;
background-color: #1a1a1f;
color: var(--color-text-primary);
background-color: #262626;
color: #ccc;
position: relative;
font-size: 11px;
}
.inspector-header {
display: flex;
align-items: center;
gap: 8px;
height: 32px;
padding: 0 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
background-color: #252529;
gap: 6px;
height: 24px;
padding: 0 6px;
border-bottom: 1px solid #1a1a1a;
background-color: #2d2d2d;
flex-shrink: 0;
}
.inspector-header-left {
display: flex;
align-items: center;
gap: 4px;
flex: 1;
}
.inspector-lock-btn {
display: flex;
align-items: center;
justify-content: center;
width: 16px;
height: 16px;
background: transparent;
border: none;
color: #666;
cursor: pointer;
padding: 0;
}
.inspector-lock-btn:hover {
color: #999;
}
.inspector-lock-btn.locked {
color: #f59e0b;
}
.inspector-object-count {
font-size: 11px;
color: #888;
margin-left: auto;
}
.inspector-header-icon {
color: var(--color-text-secondary);
flex-shrink: 0;
@@ -32,13 +67,84 @@
letter-spacing: 0.05em;
}
/* Search Box */
.inspector-search {
display: flex;
align-items: center;
gap: 4px;
padding: 2px 6px;
background: #262626;
border-bottom: 1px solid #1a1a1a;
}
.inspector-search svg {
color: #555;
flex-shrink: 0;
width: 12px;
height: 12px;
}
.inspector-search input {
flex: 1;
background: #1e1e1e;
border: 1px solid #3a3a3a;
border-radius: 2px;
padding: 2px 6px;
font-size: 11px;
color: #ccc;
height: 18px;
}
.inspector-search input:focus {
outline: none;
border-color: #4a9eff;
}
.inspector-search input::placeholder {
color: #555;
}
/* Category Tabs */
.inspector-category-tabs {
display: flex;
flex-wrap: wrap;
gap: 2px;
padding: 2px 6px;
background: #262626;
border-bottom: 1px solid #1a1a1a;
}
.inspector-category-tab {
padding: 1px 6px;
font-size: 10px;
font-weight: 400;
color: #888;
background: transparent;
border: 1px solid #333;
border-radius: 2px;
cursor: pointer;
transition: all 0.1s ease;
height: 18px;
}
.inspector-category-tab:hover {
background: #333;
color: #ccc;
}
.inspector-category-tab.active {
background: #3b82f6;
border-color: #3b82f6;
color: #fff;
}
.inspector-content {
flex: 1;
display: flex;
flex-direction: column;
overflow-y: scroll;
overflow-y: auto;
overflow-x: hidden;
padding: 8px;
padding: 0;
min-height: 0;
}
@@ -65,16 +171,12 @@
}
.inspector-section {
margin-bottom: 8px;
margin-bottom: 0;
padding: 0;
background-color: transparent;
border-radius: 0;
}
.inspector-section:last-child {
margin-bottom: 0;
}
.section-header {
display: flex;
align-items: center;
@@ -122,7 +224,7 @@
}
.section-content {
padding: var(--spacing-sm) 0;
padding: 0;
}
.info-row {
@@ -319,10 +421,10 @@
color: #888;
text-transform: uppercase;
letter-spacing: 0.08em;
margin: 0 0 6px 0;
padding: 6px 8px;
margin: 0;
padding: 3px 6px;
background: rgba(0, 0, 0, 0.3);
border-radius: 3px;
border-radius: 0;
}
.property-field {
@@ -485,8 +587,8 @@
.add-component-trigger {
display: flex;
align-items: center;
gap: 3px;
padding: 3px 6px;
gap: 2px;
padding: 2px 5px;
background: #3b82f6;
border: none;
border-radius: 2px;
@@ -495,6 +597,7 @@
font-size: 10px;
font-weight: 500;
transition: all 0.1s ease;
height: 18px;
}
.add-component-trigger:hover {
@@ -688,67 +791,57 @@
/* 组件列表项样式 */
.component-item-card {
margin-bottom: 2px;
background: #2a2a2f;
margin-bottom: 0;
background: #262626;
border: none;
border-radius: 0;
border-bottom: 1px solid #1a1a1a;
overflow: visible;
transition: none;
border-left: 3px solid #4a4a50;
}
.component-item-card:hover {
background: #2e2e33;
}
.component-item-card.expanded {
border-left-color: #3b82f6;
background: #252529;
background: #262626;
}
.component-item-header {
display: flex;
align-items: center;
padding: 6px 8px;
background: transparent;
padding: 0 8px;
background: #2d2d2d;
cursor: pointer;
user-select: none;
transition: background 0.1s ease;
min-height: 28px;
height: 26px;
gap: 6px;
}
.component-item-header:hover {
background: rgba(255, 255, 255, 0.03);
background: #333;
}
.component-expand-icon {
display: flex;
align-items: center;
color: #666;
transition: color 0.1s ease;
width: 14px;
color: #888;
width: 12px;
height: 12px;
}
.component-item-card:hover .component-expand-icon,
.component-item-card.expanded .component-expand-icon {
color: #3b82f6;
color: #ccc;
}
.component-icon {
display: flex;
align-items: center;
color: #666;
margin-left: 4px;
margin-right: 6px;
color: #888;
}
.component-item-card.expanded .component-icon {
color: #3b82f6;
color: #ccc;
}
.component-item-name {
flex: 1;
font-size: 11px;
font-size: 12px;
font-weight: 500;
color: #ccc;
}
@@ -765,10 +858,8 @@
border: none;
color: #555;
cursor: pointer;
padding: 3px;
border-radius: 2px;
padding: 2px;
opacity: 0;
transition: all 0.1s ease;
}
.component-item-header:hover .component-remove-btn {
@@ -776,14 +867,12 @@
}
.component-item-card .component-remove-btn:hover {
background: #ef4444;
color: #fff;
color: #ef4444;
}
.component-item-content {
padding: 6px 8px 8px 8px;
border-top: 1px solid rgba(255, 255, 255, 0.05);
background: #1e1e23;
padding: 0;
background: #262626;
overflow: visible;
min-width: 0;
}
@@ -828,3 +917,288 @@
color: #888;
font-size: 12px;
}
/* ==================== Transform Component (UE5 Style) ==================== */
.transform-section {
background: #262626;
border-bottom: 1px solid #1a1a1a;
}
.transform-section-header {
display: flex;
align-items: center;
gap: 4px;
padding: 0 6px;
background: #2d2d2d;
cursor: pointer;
user-select: none;
height: 24px;
border-bottom: 1px solid #1a1a1a;
}
.transform-section-header:hover {
background: #333;
}
.transform-section-expand {
display: flex;
align-items: center;
justify-content: center;
color: #888;
transition: transform 0.15s ease;
width: 14px;
height: 14px;
}
.transform-section-expand.expanded {
transform: rotate(90deg);
}
.transform-section-title {
font-size: 11px;
font-weight: 600;
color: #ccc;
flex: 1;
}
.transform-section-content {
padding: 4px 0;
}
/* Transform Row */
.transform-row {
display: flex;
align-items: center;
padding: 3px 8px;
min-height: 22px;
gap: 4px;
}
.transform-row:hover {
background: rgba(255, 255, 255, 0.02);
}
/* Transform Row Label */
.transform-row-label {
display: flex;
align-items: center;
width: 64px;
min-width: 64px;
flex-shrink: 0;
}
.transform-label-text {
font-size: 11px;
color: #999;
font-weight: 400;
}
/* Transform Row Inputs Container */
.transform-row-inputs {
display: flex;
flex: 1;
gap: 3px;
min-width: 0;
}
.transform-row-inputs.rotation-single {
/* Single rotation input takes full width */
}
/* Transform Axis Input */
.transform-axis-input {
display: flex;
align-items: center;
flex: 1;
min-width: 0;
position: relative;
background: #1e1e1e;
border: 1px solid #3a3a3a;
border-radius: 2px;
height: 18px;
overflow: hidden;
}
.transform-axis-input:hover {
border-color: #4a4a4a;
background: #222;
}
.transform-axis-input:focus-within {
border-color: #4a9eff;
}
.transform-axis-input.dragging {
border-color: #4a9eff;
}
/* Color bar indicator inside input */
.transform-axis-bar {
width: 3px;
height: 100%;
flex-shrink: 0;
cursor: ew-resize;
transition: width 0.1s ease;
}
.transform-axis-bar:hover {
width: 4px;
}
.transform-axis-bar.x {
background: #c83232;
}
.transform-axis-bar.y {
background: #32a852;
}
.transform-axis-bar.z {
background: #3264c8;
}
.transform-axis-input input {
flex: 1;
min-width: 0;
height: 100%;
padding: 0 4px;
background: transparent;
border: none;
font-size: 10px;
font-family: 'Consolas', 'Monaco', 'Menlo', monospace;
color: #ddd;
text-align: left;
-moz-appearance: textfield;
}
.transform-axis-input input::-webkit-outer-spin-button,
.transform-axis-input input::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
.transform-axis-input input:focus {
outline: none;
background: rgba(74, 158, 255, 0.05);
}
/* Suffix (like degree symbol) */
.transform-axis-suffix {
font-size: 9px;
color: #666;
padding-right: 4px;
flex-shrink: 0;
}
/* Lock Button */
.transform-lock-btn {
display: flex;
align-items: center;
justify-content: center;
width: 18px;
height: 18px;
background: transparent;
border: none;
color: #555;
cursor: pointer;
padding: 0;
flex-shrink: 0;
border-radius: 2px;
}
.transform-lock-btn:hover {
color: #888;
background: rgba(255, 255, 255, 0.05);
}
.transform-lock-btn.locked {
color: #f59e0b;
}
/* Reset Button */
.transform-reset-btn {
display: flex;
align-items: center;
justify-content: center;
width: 18px;
height: 18px;
background: transparent;
border: none;
color: #444;
cursor: pointer;
padding: 0;
flex-shrink: 0;
border-radius: 2px;
opacity: 0;
transition: opacity 0.1s ease;
}
.transform-row:hover .transform-reset-btn {
opacity: 1;
}
.transform-reset-btn:hover {
color: #888;
background: rgba(255, 255, 255, 0.05);
}
/* Mobility Row */
.transform-mobility-row {
display: flex;
align-items: center;
padding: 3px 8px;
min-height: 22px;
gap: 4px;
margin-top: 4px;
border-top: 1px solid #333;
}
.transform-mobility-label {
font-size: 11px;
color: #999;
width: 64px;
min-width: 64px;
flex-shrink: 0;
}
.transform-mobility-buttons {
display: flex;
gap: 0;
flex: 1;
}
.transform-mobility-btn {
flex: 1;
padding: 0 6px;
font-size: 10px;
font-weight: 400;
color: #888;
background: #2a2a2a;
border: 1px solid #3a3a3a;
cursor: pointer;
height: 18px;
transition: all 0.1s ease;
}
.transform-mobility-btn:first-child {
border-radius: 2px 0 0 2px;
}
.transform-mobility-btn:last-child {
border-radius: 0 2px 2px 0;
}
.transform-mobility-btn:not(:first-child) {
border-left: none;
}
.transform-mobility-btn:hover {
background: #3a3a3a;
color: #ccc;
}
.transform-mobility-btn.active {
background: #3b82f6;
border-color: #3b82f6;
color: #fff;
}

View File

@@ -1,9 +1,11 @@
.file-tree-toolbar {
display: flex;
align-items: center;
gap: 4px;
padding: 4px 8px;
padding: 0 8px;
background: #252526;
border-bottom: 1px solid #3e3e3e;
height: 26px;
}
.file-tree-toolbar-btn {

View File

@@ -1,372 +1,386 @@
/* ==================== Container ==================== */
.flexlayout-dock-container {
width: 100%;
height: 100%;
background: #1e1e1e;
position: relative;
overflow: hidden;
width: 100%;
height: 100%;
background: #1a1a1a;
position: relative;
}
.flexlayout__layout {
background: #1e1e1e;
position: absolute !important;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: #1a1a1a;
position: absolute !important;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
/* ==================== Tabset (Panel Container) ==================== */
.flexlayout__tabset {
background: #252526;
}
.flexlayout__tabset_header {
background: #252526;
border-bottom: 1px solid #1e1e1e;
height: 28px;
min-height: 28px;
}
.flexlayout__tab {
background: transparent;
color: #969696;
border: none;
padding: 0 16px;
height: 28px;
line-height: 28px;
cursor: default;
transition: all 0.1s ease;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
position: relative;
}
.flexlayout__tab::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 2px;
background: transparent;
transition: background-color 0.1s ease;
}
.flexlayout__tab:hover {
background: rgba(255, 255, 255, 0.03);
color: #e0e0e0;
}
.flexlayout__tab_button {
background: transparent !important;
color: #969696;
border: none !important;
border-right: none !important;
padding: 0 16px;
height: 28px;
cursor: pointer;
transition: all 0.1s ease;
position: relative;
}
.flexlayout__tab_button::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 2px;
background: transparent;
transition: background-color 0.1s ease;
}
.flexlayout__tab_button:hover {
background: rgba(255, 255, 255, 0.03) !important;
color: #e0e0e0;
}
.flexlayout__tab_button--selected {
background: transparent !important;
color: #ffffff !important;
border-bottom: none !important;
}
.flexlayout__tab_button--selected::after {
background: #007acc;
}
.flexlayout__tab_button_leading {
display: flex;
align-items: center;
gap: 6px;
}
.flexlayout__tab_button_content {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 120px;
font-size: 12px;
font-weight: 400;
letter-spacing: 0.3px;
}
.flexlayout__tab_button--selected .flexlayout__tab_button_content {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 120px;
font-weight: 500;
}
.flexlayout__tab_button_trailing {
margin-left: 8px;
opacity: 0.6;
transition: opacity 0.15s ease;
display: flex;
align-items: center;
justify-content: center;
padding: 2px;
border-radius: 3px;
}
.flexlayout__tab_button:hover .flexlayout__tab_button_trailing,
.flexlayout__tab:hover .flexlayout__tab_button_trailing {
opacity: 1;
}
.flexlayout__tab_button_trailing:hover {
background: rgba(255, 255, 255, 0.1);
}
.flexlayout__tab_button_trailing svg {
width: 12px;
height: 12px;
color: #cccccc;
}
.flexlayout__tab_button_trailing:hover svg {
color: #ffffff;
}
.flexlayout__tabset_tabbar_outer {
background: #2d2d30;
}
/* 标签栏滚动条样式 */
.flexlayout__tab_moveable::-webkit-scrollbar {
width: 14px;
height: 14px;
}
.flexlayout__tab_moveable::-webkit-scrollbar-track {
background: transparent;
}
.flexlayout__tab_moveable::-webkit-scrollbar-thumb {
background: rgba(121, 121, 121, 0.4);
border-radius: 8px;
border: 3px solid transparent;
background-clip: padding-box;
}
.flexlayout__tab_moveable::-webkit-scrollbar-thumb:hover {
background: rgba(100, 100, 100, 0.7);
background-clip: padding-box;
}
.flexlayout__tab_moveable::-webkit-scrollbar-corner {
background: transparent;
background: #242424;
border-radius: 0;
}
.flexlayout__tabset-selected {
background: #1e1e1e;
background: #242424;
}
.flexlayout__tabset_header {
background: #2a2a2a;
border-bottom: 1px solid #1a1a1a;
height: 26px;
min-height: 26px;
}
.flexlayout__tabset_tabbar_outer {
background: #2a2a2a;
}
/* ==================== Tab Buttons ==================== */
.flexlayout__tab {
background: transparent;
color: #888888;
border: none;
padding: 0 12px;
height: 26px;
line-height: 26px;
cursor: default;
transition: color 0.1s ease;
font-family: "Segoe UI", -apple-system, BlinkMacSystemFont, Roboto, sans-serif;
font-size: 11px;
position: relative;
}
.flexlayout__tab:hover {
color: #cccccc;
background: transparent;
}
.flexlayout__tab::after {
display: none;
}
.flexlayout__tab_button {
background: transparent !important;
color: #888888;
border: none !important;
border-right: none !important;
padding: 0 12px;
height: 26px;
cursor: pointer;
transition: color 0.1s ease;
position: relative;
font-size: 11px;
}
.flexlayout__tab_button::after {
display: none;
}
.flexlayout__tab_button:hover {
background: transparent !important;
color: #cccccc;
}
.flexlayout__tab_button--selected {
background: transparent !important;
color: #ffffff !important;
border-bottom: none !important;
}
.flexlayout__tab_button_leading {
display: flex;
align-items: center;
gap: 6px;
}
.flexlayout__tab_button_content {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 140px;
font-size: 11px;
font-weight: 400;
}
.flexlayout__tab_button--selected .flexlayout__tab_button_content {
font-weight: 400;
}
/* Tab close button */
.flexlayout__tab_button_trailing {
margin-left: 6px;
opacity: 0;
transition: opacity 0.1s ease;
display: flex;
align-items: center;
justify-content: center;
padding: 2px;
border-radius: 2px;
}
.flexlayout__tab_button:hover .flexlayout__tab_button_trailing {
opacity: 0.6;
}
.flexlayout__tab_button_trailing:hover {
opacity: 1 !important;
background: rgba(255, 255, 255, 0.1);
}
.flexlayout__tab_button_trailing svg {
width: 10px;
height: 10px;
color: #999999;
}
.flexlayout__tab_button_trailing:hover svg {
color: #ffffff;
}
/* ==================== Splitter (Divider between panels) ==================== */
.flexlayout__splitter {
background: linear-gradient(to right, transparent, #3e3e42 40%, #3e3e42 60%, transparent);
transition: all 0.15s ease;
}
.flexlayout__splitter_horz {
background: linear-gradient(to bottom, transparent, #3e3e42 40%, #3e3e42 60%, transparent);
background: #1a1a1a !important;
transition: background 0.15s ease;
}
.flexlayout__splitter:hover {
background: #007acc;
background: #4a9eff !important;
}
.flexlayout__splitter_horz {
cursor: row-resize !important;
}
.flexlayout__splitter_vert {
cursor: col-resize !important;
}
.flexlayout__splitter_border {
background: #1e1e1e;
}
.flexlayout__outline_rect {
border: 2px solid #007acc;
box-shadow: 0 0 20px rgba(0, 122, 204, 0.5);
background: rgba(0, 122, 204, 0.1);
}
.flexlayout__edge_rect {
background: rgba(0, 122, 204, 0.3);
border: 2px solid #007acc;
}
.flexlayout__drag_rect {
border: 2px solid #007acc;
background: rgba(0, 122, 204, 0.2);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
background: #1a1a1a !important;
}
/* ==================== Panel Content ==================== */
.flexlayout__tabset_content {
background: #1e1e1e;
overflow: auto;
background: #242424;
overflow: auto;
}
.flexlayout__tabset_content * {
cursor: default !important;
cursor: default !important;
}
.flexlayout__tabset_content button,
.flexlayout__tabset_content a,
.flexlayout__tabset_content [role="button"] {
cursor: pointer !important;
.flexlayout__tabset_content [role="button"],
.flexlayout__tabset_content input,
.flexlayout__tabset_content select,
.flexlayout__tabset_content textarea {
cursor: pointer !important;
}
/* ==================== Drag & Drop ==================== */
.flexlayout__outline_rect {
border: 1px solid #4a9eff;
box-shadow: 0 0 12px rgba(74, 158, 255, 0.3);
background: rgba(74, 158, 255, 0.08);
border-radius: 2px;
}
.flexlayout__edge_rect {
background: rgba(74, 158, 255, 0.15);
border: 1px solid #4a9eff;
}
.flexlayout__drag_rect {
border: 1px solid #4a9eff;
background: rgba(74, 158, 255, 0.1);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
border-radius: 2px;
}
/* ==================== Tab Toolbar ==================== */
.flexlayout__tab_toolbar {
display: flex !important;
align-items: center;
gap: 4px;
padding: 0 8px;
visibility: visible !important;
opacity: 1 !important;
display: flex !important;
align-items: center;
gap: 2px;
padding: 0 4px;
visibility: visible !important;
opacity: 1 !important;
}
.flexlayout__tab_toolbar_button {
background: transparent;
border: none;
color: #cccccc;
cursor: pointer;
padding: 4px;
border-radius: 3px;
transition: background-color 0.15s ease;
display: flex !important;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
background: transparent;
border: none;
color: #666666;
cursor: pointer;
padding: 3px;
border-radius: 2px;
transition: all 0.1s ease;
display: flex !important;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
}
.flexlayout__tab_toolbar_button:hover {
background: #383838;
color: #ffffff;
background: rgba(255, 255, 255, 0.08);
color: #cccccc;
}
.flexlayout__tab_toolbar_button svg {
width: 14px;
height: 14px;
width: 12px;
height: 12px;
}
/* 确保最小化和最大化按钮可见 */
.flexlayout__tab_toolbar_button-min,
.flexlayout__tab_toolbar_button-max {
display: flex !important;
visibility: visible !important;
display: flex !important;
visibility: visible !important;
}
/* Maximized tabset styling */
.flexlayout__tabset_maximized .flexlayout__tab_toolbar_button-max {
color: #4a9eff;
}
.flexlayout__tabset_maximized .flexlayout__tab_toolbar_button-max:hover {
background: rgba(74, 158, 255, 0.2);
color: #ffffff;
}
/* ==================== Popup Menu ==================== */
.flexlayout__popup_menu {
background: #252526;
border: 1px solid #454545;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
border-radius: 3px;
background: #2d2d2d;
border: 1px solid #3a3a3a;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
border-radius: 4px;
padding: 4px 0;
}
.flexlayout__popup_menu_item {
color: #cccccc;
padding: 8px 16px;
cursor: pointer;
transition: background-color 0.15s ease;
color: #cccccc;
padding: 6px 12px;
cursor: pointer;
transition: background 0.1s ease;
font-size: 11px;
}
.flexlayout__popup_menu_item:hover {
background: #2a2d2e;
color: #ffffff;
background: #3a3a3a;
color: #ffffff;
}
.flexlayout__popup_menu_item:active {
background: #094771;
background: #4a9eff;
}
/* ==================== Border Panels ==================== */
.flexlayout__border {
background: #252526;
border: 1px solid #1e1e1e;
background: #242424;
border: none;
}
.flexlayout__border_top,
.flexlayout__border_bottom {
border-left: none;
border-right: none;
border-left: none;
border-right: none;
}
.flexlayout__border_left,
.flexlayout__border_right {
border-top: none;
border-bottom: none;
border-top: none;
border-bottom: none;
}
.flexlayout__border_button {
background: transparent;
color: #969696;
border: none;
border-bottom: 1px solid #1e1e1e;
padding: 8px 12px;
cursor: pointer;
transition: all 0.1s ease;
position: relative;
background: transparent;
color: #888888;
border: none;
border-bottom: none;
padding: 6px 10px;
cursor: pointer;
transition: color 0.1s ease;
position: relative;
font-size: 11px;
}
.flexlayout__border_button::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 2px;
background: transparent;
transition: background-color 0.1s ease;
display: none;
}
.flexlayout__border_button:hover {
background: rgba(255, 255, 255, 0.03);
color: #e0e0e0;
background: transparent;
color: #cccccc;
}
.flexlayout__border_button--selected {
background: transparent;
color: #ffffff;
}
.flexlayout__border_button--selected::after {
background: #007acc;
background: transparent;
color: #ffffff;
}
/* ==================== Error Boundary ==================== */
.flexlayout__error_boundary_container {
background: #1e1e1e;
color: #f48771;
padding: 16px;
font-family: monospace;
background: #242424;
color: #f48771;
padding: 16px;
font-family: monospace;
}
.flexlayout__error_boundary_message {
margin-bottom: 8px;
font-weight: 600;
margin-bottom: 8px;
font-weight: 600;
}
/* 持久化面板占位符 */
/* ==================== Scrollbar ==================== */
.flexlayout__tabset_content::-webkit-scrollbar,
.flexlayout__tab_moveable::-webkit-scrollbar {
width: 8px;
height: 8px;
}
.flexlayout__tabset_content::-webkit-scrollbar-track,
.flexlayout__tab_moveable::-webkit-scrollbar-track {
background: transparent;
}
.flexlayout__tabset_content::-webkit-scrollbar-thumb,
.flexlayout__tab_moveable::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.15);
border-radius: 4px;
}
.flexlayout__tabset_content::-webkit-scrollbar-thumb:hover,
.flexlayout__tab_moveable::-webkit-scrollbar-thumb:hover {
background: rgba(255, 255, 255, 0.25);
}
.flexlayout__tabset_content::-webkit-scrollbar-corner,
.flexlayout__tab_moveable::-webkit-scrollbar-corner {
background: transparent;
}
/* ==================== Persistent Panels ==================== */
.persistent-panel-placeholder {
width: 100%;
height: 100%;
background: transparent;
width: 100%;
height: 100%;
background: transparent;
}
/* 持久化面板容器 */
.persistent-panel-container {
background: #1e1e1e;
background: #242424;
}
/* 确保 tabset header 在 persistent panel 之上 */
.flexlayout__tabset_header,
.flexlayout__tabset_tabbar_outer {
position: relative;
z-index: 10;
}
/* 最大化时确保 tab bar 可见 */
.flexlayout__tabset_maximized .flexlayout__tabset_header,
.flexlayout__tabset_maximized .flexlayout__tabset_tabbar_outer {
z-index: 100;
}

View File

@@ -12,11 +12,12 @@
display: flex;
align-items: center;
justify-content: space-between;
padding: 6px 8px;
padding: 0 8px;
background: var(--color-bg-elevated);
border-bottom: 1px solid var(--color-border-default);
flex-shrink: 0;
gap: 8px;
height: 26px;
z-index: var(--z-index-above);
}

View File

@@ -0,0 +1,260 @@
/* ==================== Main Toolbar Container ==================== */
.main-toolbar {
display: flex;
align-items: center;
height: 36px;
background: linear-gradient(180deg, #3a3a3f 0%, #2d2d32 100%);
border-bottom: 1px solid #1a1a1d;
padding: 0 8px;
gap: 4px;
user-select: none;
flex-shrink: 0;
position: relative;
z-index: var(--z-index-header);
}
/* ==================== Toolbar Groups ==================== */
.toolbar-group {
display: flex;
align-items: center;
gap: 2px;
}
.toolbar-center {
background: rgba(0, 0, 0, 0.2);
border-radius: 4px;
padding: 2px 4px;
}
/* Absolutely centered play controls */
.toolbar-center-wrapper {
position: absolute;
left: 50%;
transform: translateX(-50%);
display: flex;
align-items: center;
pointer-events: none;
}
.toolbar-center-wrapper > * {
pointer-events: auto;
}
/* Right section for preview indicator */
.toolbar-right {
margin-left: auto;
display: flex;
align-items: center;
min-width: 100px;
justify-content: flex-end;
}
/* ==================== Toolbar Separator ==================== */
.toolbar-separator {
width: 1px;
height: 20px;
background: rgba(255, 255, 255, 0.1);
margin: 0 4px;
}
/* ==================== Tool Buttons ==================== */
.toolbar-button {
display: flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
background: transparent;
border: none;
border-radius: 3px;
color: #888888;
cursor: pointer;
transition: all 0.1s ease;
}
.toolbar-button:hover:not(.disabled) {
background: rgba(255, 255, 255, 0.08);
color: #cccccc;
}
.toolbar-button:active:not(.disabled) {
background: rgba(255, 255, 255, 0.05);
}
.toolbar-button.active {
background: rgba(74, 158, 255, 0.2);
color: #4a9eff;
}
.toolbar-button.active:hover {
background: rgba(74, 158, 255, 0.3);
}
.toolbar-button.disabled {
color: #444444;
cursor: not-allowed;
}
.toolbar-button svg {
flex-shrink: 0;
}
/* Play button special styling */
.toolbar-center .toolbar-button {
width: 32px;
height: 28px;
}
.toolbar-center .toolbar-button:first-child {
color: #4ade80;
}
.toolbar-center .toolbar-button:first-child:hover:not(.disabled) {
background: rgba(74, 222, 128, 0.15);
color: #4ade80;
}
.toolbar-center .toolbar-button:nth-child(2) {
color: #f87171;
}
.toolbar-center .toolbar-button:nth-child(2):hover:not(.disabled) {
background: rgba(248, 113, 113, 0.15);
}
.toolbar-center .toolbar-button:nth-child(2).disabled {
color: #444444;
}
/* ==================== Preview Mode Indicator ==================== */
.preview-indicator {
display: flex;
align-items: center;
gap: 6px;
padding: 4px 10px;
background: rgba(74, 222, 128, 0.15);
border: 1px solid rgba(74, 222, 128, 0.3);
border-radius: 4px;
color: #4ade80;
font-size: 11px;
font-weight: 500;
animation: pulse-glow 2s ease-in-out infinite;
}
@keyframes pulse-glow {
0%, 100% {
box-shadow: 0 0 4px rgba(74, 222, 128, 0.2);
}
50% {
box-shadow: 0 0 8px rgba(74, 222, 128, 0.4);
}
}
.preview-indicator svg {
flex-shrink: 0;
}
/* ==================== Dropdown Menus (for future use) ==================== */
.toolbar-dropdown {
position: relative;
}
.toolbar-dropdown-button {
display: flex;
align-items: center;
gap: 4px;
padding: 4px 8px;
background: transparent;
border: none;
border-radius: 3px;
color: #888888;
font-size: 11px;
cursor: pointer;
transition: all 0.1s ease;
}
.toolbar-dropdown-button:hover {
background: rgba(255, 255, 255, 0.08);
color: #cccccc;
}
.toolbar-dropdown-item {
display: block;
width: 100%;
padding: 6px 12px;
background: transparent;
border: none;
color: #c0c0c0;
font-size: 11px;
text-align: left;
cursor: pointer;
transition: background 0.1s ease;
}
.toolbar-dropdown-item:hover {
background: #3b82f6;
color: #ffffff;
}
/* ==================== Toolbar Dropdown ==================== */
.toolbar-dropdown {
position: relative;
}
.toolbar-dropdown-trigger {
display: flex !important;
align-items: center;
gap: 4px;
width: auto !important;
padding: 0 8px !important;
}
.toolbar-dropdown-menu {
position: absolute;
top: 100%;
left: 0;
margin-top: 4px;
min-width: 160px;
background: #252528;
border: 1px solid #3a3a3d;
border-radius: 4px;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
padding: 4px 0;
z-index: var(--z-index-popover);
animation: dropdown-fade-in 0.1s ease;
}
@keyframes dropdown-fade-in {
from {
opacity: 0;
transform: translateY(-4px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.toolbar-dropdown-menu button {
display: flex;
align-items: center;
gap: 8px;
width: 100%;
padding: 8px 12px;
background: transparent;
border: none;
color: #c0c0c0;
font-size: 12px;
text-align: left;
cursor: pointer;
transition: background 0.1s ease;
}
.toolbar-dropdown-menu button:hover {
background: #3b82f6;
color: #ffffff;
}
.toolbar-dropdown-menu button svg {
flex-shrink: 0;
}

View File

@@ -0,0 +1,528 @@
.output-log-panel {
display: flex;
flex-direction: column;
height: 100%;
background: #1a1a1a;
font-family: 'Consolas', 'Monaco', monospace;
font-size: 12px;
}
/* ==================== Toolbar ==================== */
.output-log-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
height: 36px;
padding: 0 8px;
background: #252526;
border-bottom: 1px solid #3c3c3c;
flex-shrink: 0;
}
.output-log-toolbar-left {
display: flex;
align-items: center;
gap: 8px;
flex: 1;
}
.output-log-toolbar-right {
display: flex;
align-items: center;
gap: 4px;
}
/* Search Box */
.output-log-search {
display: flex;
align-items: center;
gap: 8px;
flex: 1;
max-width: 300px;
height: 26px;
padding: 0 10px;
background: #3c3c3c;
border: 1px solid #4a4a4a;
border-radius: 4px;
color: #888;
transition: all 0.15s ease;
}
.output-log-search:focus-within {
border-color: #3b82f6;
background: #2d2d2d;
}
.output-log-search input {
flex: 1;
background: transparent;
border: none;
outline: none;
color: #e0e0e0;
font-size: 12px;
}
.output-log-search input::placeholder {
color: #666;
}
.output-log-search-clear {
display: flex;
align-items: center;
justify-content: center;
width: 16px;
height: 16px;
padding: 0;
background: #555;
border: none;
border-radius: 50%;
color: #ccc;
cursor: pointer;
transition: all 0.1s ease;
}
.output-log-search-clear:hover {
background: #666;
color: #fff;
}
/* Toolbar Buttons */
.output-log-btn {
display: flex;
align-items: center;
gap: 6px;
height: 26px;
padding: 0 10px;
background: transparent;
border: 1px solid #4a4a4a;
border-radius: 4px;
color: #ccc;
font-size: 11px;
cursor: pointer;
transition: all 0.15s ease;
}
.output-log-btn:hover {
background: #3c3c3c;
border-color: #555;
}
.output-log-btn.active {
background: #3c3c3c;
border-color: #3b82f6;
}
.output-log-btn.has-filter {
border-color: #3b82f6;
}
.filter-badge {
display: flex;
align-items: center;
justify-content: center;
min-width: 16px;
height: 16px;
padding: 0 4px;
background: #3b82f6;
border-radius: 8px;
color: #fff;
font-size: 10px;
font-weight: 600;
}
.output-log-icon-btn {
display: flex;
align-items: center;
justify-content: center;
width: 28px;
height: 26px;
padding: 0;
background: transparent;
border: 1px solid transparent;
border-radius: 4px;
color: #888;
cursor: pointer;
transition: all 0.15s ease;
}
.output-log-icon-btn:hover {
background: #3c3c3c;
color: #e0e0e0;
}
.output-log-icon-btn.active {
background: #3c3c3c;
border-color: #3b82f6;
color: #3b82f6;
}
.output-log-close-btn {
display: flex;
align-items: center;
justify-content: center;
width: 28px;
height: 26px;
padding: 0;
background: transparent;
border: none;
border-radius: 4px;
color: #888;
cursor: pointer;
transition: all 0.15s ease;
margin-left: 4px;
}
.output-log-close-btn:hover {
background: #3c3c3c;
color: #e0e0e0;
}
/* ==================== Dropdown Menu ==================== */
.output-log-dropdown {
position: relative;
}
.output-log-menu {
position: absolute;
top: calc(100% + 4px);
right: 0;
min-width: 200px;
background: #2d2d2d;
border: 1px solid #4a4a4a;
border-radius: 6px;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
padding: 6px 0;
z-index: 100;
}
.output-log-menu.settings-menu {
min-width: 180px;
}
.output-log-menu-header {
padding: 6px 12px;
font-size: 10px;
font-weight: 600;
color: #888;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.output-log-menu-item {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 12px;
cursor: pointer;
transition: background 0.1s ease;
}
.output-log-menu-item:hover {
background: rgba(255, 255, 255, 0.05);
}
.output-log-menu-item input[type="checkbox"] {
width: 14px;
height: 14px;
margin: 0;
accent-color: #3b82f6;
cursor: pointer;
}
.output-log-menu-item span {
flex: 1;
color: #e0e0e0;
font-size: 12px;
}
.output-log-menu-item .level-count {
color: #888;
font-size: 11px;
font-family: 'Consolas', 'Monaco', monospace;
}
.level-icon {
flex-shrink: 0;
}
.level-icon.debug {
color: #858585;
}
.level-icon.info {
color: #4a9eff;
}
.level-icon.warn {
color: #ffc107;
}
.level-icon.error {
color: #f44336;
}
.level-icon.remote {
color: #10b981;
}
.output-log-menu-divider {
height: 1px;
background: #4a4a4a;
margin: 6px 0;
}
.output-log-menu-action {
display: flex;
align-items: center;
gap: 8px;
width: 100%;
padding: 6px 12px;
background: transparent;
border: none;
color: #e0e0e0;
font-size: 12px;
cursor: pointer;
transition: background 0.1s ease;
}
.output-log-menu-action:hover {
background: rgba(255, 255, 255, 0.05);
}
.output-log-menu-action svg {
color: #888;
}
/* ==================== Log Content ==================== */
.output-log-content {
flex: 1;
overflow-y: auto;
overflow-x: hidden;
}
.output-log-content::-webkit-scrollbar {
width: 10px;
}
.output-log-content::-webkit-scrollbar-track {
background: #1a1a1a;
}
.output-log-content::-webkit-scrollbar-thumb {
background: #4a4a4a;
border-radius: 5px;
border: 2px solid #1a1a1a;
}
.output-log-content::-webkit-scrollbar-thumb:hover {
background: #5a5a5a;
}
/* Hide timestamp/source based on settings */
.output-log-content.hide-timestamp .output-log-entry-time {
display: none;
}
.output-log-content.hide-source .output-log-entry-source {
display: none;
}
/* Empty State */
.output-log-empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100%;
color: #666;
gap: 12px;
}
.output-log-empty p {
margin: 0;
font-size: 13px;
}
/* ==================== Log Entry ==================== */
.output-log-entry {
display: flex;
align-items: flex-start;
gap: 8px;
padding: 4px 12px;
border-bottom: 1px solid #2a2a2a;
line-height: 1.4;
transition: background 0.1s ease;
}
.output-log-entry:hover {
background: rgba(255, 255, 255, 0.02);
}
.output-log-entry-icon {
display: flex;
align-items: center;
padding-top: 2px;
flex-shrink: 0;
}
.output-log-entry-time {
color: #666;
font-size: 11px;
white-space: nowrap;
padding-top: 2px;
flex-shrink: 0;
font-variant-numeric: tabular-nums;
}
.output-log-entry-source {
color: #888;
font-size: 11px;
white-space: nowrap;
padding-top: 2px;
flex-shrink: 0;
opacity: 0.7;
}
.output-log-entry-source.source-remote {
color: #4a9eff;
opacity: 1;
font-weight: 600;
}
.output-log-entry-client {
color: #10b981;
font-size: 10px;
white-space: nowrap;
padding: 1px 6px;
flex-shrink: 0;
background: rgba(16, 185, 129, 0.15);
border: 1px solid rgba(16, 185, 129, 0.4);
border-radius: 3px;
font-weight: 600;
}
.output-log-entry-message {
flex: 1;
color: #e0e0e0;
word-break: break-word;
padding-top: 2px;
}
.output-log-message-container {
display: flex;
align-items: flex-start;
gap: 8px;
}
.output-log-message-text {
flex: 1;
}
.output-log-message-preview {
opacity: 0.9;
}
.output-log-expand-btn {
display: inline;
margin-left: 8px;
padding: 2px 6px;
background: #3c3c3c;
border: 1px solid #4a4a4a;
border-radius: 3px;
color: #3b82f6;
font-size: 10px;
cursor: pointer;
transition: all 0.1s ease;
}
.output-log-expand-btn:hover {
background: #4a4a4a;
border-color: #3b82f6;
}
.output-log-json-btn {
display: flex;
align-items: center;
justify-content: center;
padding: 2px 6px;
background: #3b82f6;
border: none;
border-radius: 3px;
color: #fff;
font-size: 10px;
font-weight: 600;
cursor: pointer;
opacity: 0.8;
transition: all 0.1s ease;
flex-shrink: 0;
}
.output-log-json-btn:hover {
opacity: 1;
}
/* Log Level Styles */
.output-log-entry-debug {
color: #858585;
}
.output-log-entry-debug .output-log-entry-icon {
color: #858585;
}
.output-log-entry-info .output-log-entry-icon {
color: #4a9eff;
}
.output-log-entry-warn {
background: rgba(255, 193, 7, 0.05);
}
.output-log-entry-warn .output-log-entry-icon {
color: #ffc107;
}
.output-log-entry-error {
background: rgba(244, 67, 54, 0.08);
}
.output-log-entry-error .output-log-entry-icon {
color: #f44336;
}
.log-entry-remote {
border-left: 2px solid #4a9eff;
background: rgba(74, 158, 255, 0.03);
}
/* ==================== Status Bar ==================== */
.output-log-status {
display: flex;
align-items: center;
justify-content: space-between;
height: 24px;
padding: 0 12px;
background: #252526;
border-top: 1px solid #3c3c3c;
flex-shrink: 0;
font-size: 11px;
color: #888;
}
.output-log-scroll-btn {
display: flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
background: #3b82f6;
border: none;
border-radius: 3px;
color: #fff;
font-size: 10px;
cursor: pointer;
transition: all 0.1s ease;
}
.output-log-scroll-btn:hover {
background: #2563eb;
}

View File

@@ -8,10 +8,12 @@
.plugin-market-toolbar {
display: flex;
gap: 12px;
padding: 16px;
align-items: center;
gap: 8px;
padding: 0 8px;
border-bottom: 1px solid var(--color-border, #333);
background: var(--color-bg-secondary, #252526);
height: 26px;
}
.plugin-market-search {

View File

@@ -10,10 +10,11 @@
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 12px;
padding: 0 8px;
background: var(--color-bg-tertiary);
border-bottom: 1px solid var(--color-border);
gap: 12px;
gap: 8px;
height: 26px;
}
.plugin-toolbar-left,

View File

@@ -10,9 +10,10 @@
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 16px;
padding: 0 8px;
border-bottom: 1px solid var(--color-border-default);
flex-shrink: 0;
height: 26px;
}
.profiler-dock-header h3 {

View File

@@ -9,11 +9,12 @@
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 12px;
padding: 0 8px;
background: var(--color-bg-elevated);
border-bottom: 1px solid var(--color-border-default);
flex-shrink: 0;
gap: 12px;
gap: 8px;
height: 26px;
}
.profiler-toolbar-left {

File diff suppressed because it is too large Load Diff

View File

@@ -1,534 +1,527 @@
.scene-hierarchy {
display: flex;
flex-direction: column;
height: 100%;
background-color: var(--color-bg-base);
color: var(--color-text-primary);
display: flex;
flex-direction: column;
height: 100%;
background-color: #2a2a2a;
color: #e0e0e0;
}
.hierarchy-header {
display: flex;
align-items: center;
gap: var(--spacing-sm);
height: var(--layout-panel-header);
padding: 0 var(--spacing-md);
border-bottom: 1px solid var(--color-border-default);
background-color: var(--color-bg-elevated);
flex-shrink: 0;
.scene-hierarchy.outliner {
font-size: 12px;
}
.hierarchy-header-icon {
color: var(--color-text-secondary);
flex-shrink: 0;
/* ==================== Toolbar ==================== */
.outliner-toolbar {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 8px;
background: #333;
border-bottom: 1px solid #1a1a1a;
flex-shrink: 0;
}
.hierarchy-header h3 {
margin: 0;
font-size: var(--font-size-sm);
font-weight: var(--font-weight-semibold);
color: var(--color-text-primary);
text-transform: uppercase;
letter-spacing: 0.05em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex-shrink: 1;
min-width: 0;
.outliner-toolbar-left {
display: flex;
align-items: center;
}
.scene-name-container {
display: flex;
align-items: center;
padding: 1px 6px;
background-color: var(--color-bg-base);
border: 1px solid var(--color-border-default);
border-radius: var(--radius-sm);
margin-left: auto;
margin-right: var(--spacing-sm);
transition: all var(--transition-fast);
height: 20px;
.outliner-filter-btn {
display: flex;
align-items: center;
gap: 4px;
padding: 4px 8px;
background: #3a3a3a;
border: 1px solid #4a4a4a;
border-radius: 3px;
color: #ccc;
cursor: pointer;
transition: all 0.15s ease;
}
.scene-name-container.clickable {
cursor: pointer;
.outliner-filter-btn:hover {
background: #444;
border-color: #555;
}
.scene-name-container.clickable:hover {
background-color: var(--color-bg-hover);
border-color: var(--color-primary);
.outliner-search {
flex: 1;
display: flex;
align-items: center;
gap: 6px;
padding: 4px 10px;
background: #3a3a3a;
border: 1px solid #4a4a4a;
border-radius: 3px;
}
.scene-name-container.clickable:hover .scene-name {
color: var(--color-primary);
.outliner-search svg {
color: #888;
flex-shrink: 0;
}
.scene-name-container.modified {
background-color: rgba(251, 191, 36, 0.25);
border-color: rgb(251, 191, 36);
.outliner-search input {
flex: 1;
background: transparent;
border: none;
outline: none;
color: #e0e0e0;
font-size: 12px;
}
.scene-name-container.modified .scene-name {
color: rgb(251, 191, 36);
font-weight: 600;
.outliner-search input::placeholder {
color: #666;
}
.modified-indicator {
color: rgb(251, 191, 36);
font-size: 8px;
margin-left: 4px;
animation: pulse-modified 2s ease-in-out infinite;
.outliner-search .search-dropdown {
color: #666;
cursor: pointer;
}
@keyframes pulse-modified {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0.4;
}
.outliner-toolbar-right {
display: flex;
align-items: center;
gap: 4px;
}
.scene-name {
font-size: var(--font-size-xs);
color: var(--color-text-secondary);
font-weight: var(--font-weight-medium);
max-width: 120px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
transition: color var(--transition-fast);
.outliner-action-btn {
display: flex;
align-items: center;
justify-content: center;
width: 26px;
height: 26px;
background: #3a3a3a;
border: 1px solid #4a4a4a;
border-radius: 3px;
color: #ccc;
cursor: pointer;
transition: all 0.15s ease;
}
.view-mode-toggle {
display: flex;
align-items: center;
gap: 2px;
padding: 2px;
background-color: var(--color-bg-base);
border: 1px solid var(--color-border-default);
border-radius: var(--radius-sm);
.outliner-action-btn:hover {
background: #444;
border-color: #555;
color: #fff;
}
.mode-btn {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
min-width: 24px;
height: 20px;
padding: 0;
background: transparent;
border: none;
border-radius: var(--radius-xs);
color: #cccccc;
cursor: pointer;
transition: all var(--transition-fast);
/* ==================== Column Header ==================== */
.outliner-header {
display: flex;
align-items: center;
height: 24px;
padding: 0 8px;
background: #333;
border-bottom: 1px solid #1a1a1a;
flex-shrink: 0;
font-size: 11px;
color: #999;
}
.mode-btn svg {
width: 14px;
height: 14px;
min-width: 14px;
min-height: 14px;
color: inherit;
stroke: currentColor;
.outliner-header-icons {
display: flex;
align-items: center;
gap: 8px;
padding-right: 8px;
border-right: 1px solid #444;
margin-right: 8px;
}
.mode-btn:hover {
background-color: var(--color-bg-hover);
color: var(--color-text-primary);
.header-icon {
color: #666;
cursor: pointer;
transition: color 0.15s ease;
}
.mode-btn.active {
background-color: var(--color-primary);
color: white;
.header-icon:hover {
color: #999;
}
.remote-indicator {
display: flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
background-color: rgba(16, 185, 129, 0.15);
border: 1px solid rgba(16, 185, 129, 0.5);
border-radius: var(--radius-sm);
color: rgb(16, 185, 129);
font-size: var(--font-size-xs);
animation: pulse-green 1.5s ease-in-out infinite;
.outliner-header-label {
flex: 1;
display: flex;
align-items: center;
gap: 4px;
cursor: pointer;
user-select: none;
padding: 2px 4px;
border-radius: 2px;
transition: background 0.15s ease;
}
.hierarchy-search {
display: flex;
align-items: center;
gap: var(--spacing-sm);
padding: var(--spacing-sm) var(--spacing-md);
border-bottom: 1px solid var(--color-border-default);
background-color: var(--color-bg-base);
flex-shrink: 0;
.outliner-header-label:hover {
background: rgba(255, 255, 255, 0.05);
}
.hierarchy-search svg {
color: var(--color-text-tertiary);
flex-shrink: 0;
.outliner-header-label.sorted {
color: #e0e0e0;
}
.hierarchy-search input {
flex: 1;
background: transparent;
border: none;
outline: none;
color: var(--color-text-primary);
font-size: var(--font-size-sm);
padding: 0;
.outliner-header-type {
width: 140px;
display: flex;
align-items: center;
gap: 4px;
cursor: pointer;
user-select: none;
padding: 2px 4px;
border-radius: 2px;
transition: background 0.15s ease;
}
.hierarchy-search input::placeholder {
color: var(--color-text-tertiary);
.outliner-header-type:hover {
background: rgba(255, 255, 255, 0.05);
}
.hierarchy-toolbar {
display: flex;
align-items: center;
gap: var(--spacing-xs);
padding: var(--spacing-sm) var(--spacing-md);
border-bottom: 1px solid var(--color-border-default);
background-color: var(--color-bg-base);
flex-shrink: 0;
.outliner-header-type.sorted {
color: #e0e0e0;
}
.toolbar-btn {
display: flex;
align-items: center;
gap: var(--spacing-xs);
padding: var(--spacing-xs) var(--spacing-sm);
background-color: var(--color-bg-elevated);
border: 1px solid var(--color-border-default);
border-radius: var(--radius-sm);
color: var(--color-text-primary);
font-size: var(--font-size-sm);
cursor: pointer;
transition: all var(--transition-fast);
.sort-indicator {
font-size: 8px;
color: #888;
}
.toolbar-btn:hover:not(:disabled) {
background-color: var(--color-bg-hover);
border-color: var(--color-primary);
color: var(--color-primary);
/* ==================== Content Area ==================== */
.outliner-content {
flex: 1;
overflow: auto;
}
.toolbar-btn:active:not(:disabled) {
transform: scale(0.98);
.outliner-content::-webkit-scrollbar {
width: 10px;
height: 10px;
}
.toolbar-btn:disabled {
cursor: not-allowed;
color: #666;
.outliner-content::-webkit-scrollbar-track {
background: #2a2a2a;
}
.toolbar-btn.icon-only {
padding: var(--spacing-xs);
min-width: 28px;
justify-content: center;
.outliner-content::-webkit-scrollbar-thumb {
background: #4a4a4a;
border-radius: 5px;
border: 2px solid #2a2a2a;
}
.hierarchy-content {
flex: 1;
overflow: auto;
padding: var(--spacing-xs) 0;
.outliner-content::-webkit-scrollbar-thumb:hover {
background: #5a5a5a;
}
.hierarchy-content::-webkit-scrollbar {
width: 14px;
height: 14px;
.outliner-list {
padding: 0;
margin: 0;
}
.hierarchy-content::-webkit-scrollbar-track {
background: transparent;
/* ==================== Item Styles ==================== */
.outliner-item {
display: flex;
align-items: center;
height: 22px;
padding: 0 8px;
cursor: pointer;
transition: background 0.1s ease;
border-bottom: 1px solid transparent;
}
.hierarchy-content::-webkit-scrollbar-thumb {
background: rgba(121, 121, 121, 0.4);
border-radius: 8px;
border: 3px solid transparent;
background-clip: padding-box;
.outliner-item:hover {
background: rgba(255, 255, 255, 0.05);
}
.hierarchy-content::-webkit-scrollbar-thumb:hover {
background: rgba(100, 100, 100, 0.7);
background-clip: padding-box;
.outliner-item.selected {
background: #3d5a80;
}
.hierarchy-content::-webkit-scrollbar-corner {
background: transparent;
.outliner-item.selected:hover {
background: #4a6a90;
}
.outliner-item.world-item {
background: #333;
border-bottom: 1px solid #1a1a1a;
}
.outliner-item.dragging {
opacity: 0.5;
}
.outliner-item.drop-target {
border-top: 2px solid #4a9eff;
}
.outliner-item.disabled {
opacity: 0.5;
}
.outliner-item-icons {
display: flex;
align-items: center;
gap: 8px;
padding-right: 8px;
margin-right: 4px;
}
.item-icon {
color: #666;
cursor: pointer;
transition: color 0.15s ease;
}
.item-icon:hover {
color: #999;
}
.item-icon.visibility {
color: #888;
}
.outliner-item-content {
flex: 1;
display: flex;
align-items: center;
gap: 6px;
min-width: 0;
}
.outliner-item-expand {
width: 14px;
height: 14px;
display: flex;
align-items: center;
justify-content: center;
color: #888;
flex-shrink: 0;
}
.outliner-item-expand:hover {
color: #ccc;
}
.outliner-item-name {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: #e0e0e0;
}
.outliner-item.selected .outliner-item-name {
color: #fff;
}
.outliner-item-type {
width: 140px;
color: #888;
font-size: 11px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* Entity Type Icons */
.entity-type-icon {
flex-shrink: 0;
}
.entity-type-icon.world {
color: #4a9eff;
}
.entity-type-icon.folder {
color: #dcb67a;
}
.entity-type-icon.light {
color: #ffd700;
}
.entity-type-icon.atmosphere,
.entity-type-icon.cloud,
.entity-type-icon.fog {
color: #87ceeb;
}
.entity-type-icon.mesh {
color: #9966ff;
}
.entity-type-icon.player {
color: #4ade80;
}
.entity-type-icon.default {
color: #888;
}
/* ==================== Status Bar ==================== */
.outliner-status {
display: flex;
align-items: center;
height: 22px;
padding: 0 12px;
background: #2d2d2d;
border-top: 1px solid #1a1a1a;
flex-shrink: 0;
font-size: 11px;
color: #888;
}
/* ==================== Empty State ==================== */
.empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: var(--spacing-4xl) var(--spacing-lg);
text-align: center;
color: var(--color-text-secondary);
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 40px 20px;
text-align: center;
color: #666;
height: 100%;
}
.empty-icon {
color: var(--color-text-tertiary);
margin-bottom: var(--spacing-md);
opacity: 0.5;
}
.empty-title {
font-size: var(--font-size-base);
font-weight: var(--font-weight-medium);
color: var(--color-text-secondary);
margin-bottom: var(--spacing-xs);
color: #444;
margin-bottom: 12px;
opacity: 0.5;
}
.empty-hint {
font-size: var(--font-size-sm);
color: var(--color-text-tertiary);
font-size: 12px;
color: #555;
}
.entity-list {
list-style: none;
margin: 0;
padding: 0;
/* ==================== View Mode Toggle ==================== */
.view-mode-toggle {
display: flex;
align-items: center;
gap: 2px;
padding: 2px;
background: #3a3a3a;
border: 1px solid #4a4a4a;
border-radius: 3px;
margin-left: 8px;
}
.entity-item {
display: flex;
align-items: center;
gap: var(--spacing-sm);
padding: var(--spacing-sm) var(--spacing-md);
cursor: pointer;
user-select: none;
transition: all var(--transition-fast);
position: relative;
.mode-btn {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 20px;
padding: 0;
background: transparent;
border: none;
border-radius: 2px;
color: #888;
cursor: pointer;
transition: all 0.15s ease;
}
.entity-item::before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 2px;
background-color: transparent;
transition: background-color var(--transition-fast);
.mode-btn:hover {
background: rgba(255, 255, 255, 0.1);
color: #ccc;
}
.entity-item:hover {
background-color: var(--color-bg-hover);
.mode-btn.active {
background: #4a9eff;
color: #fff;
}
.entity-item.selected {
background-color: var(--color-selected);
}
.entity-item.selected::before {
background-color: var(--color-primary);
}
.entity-item.selected:hover {
background-color: var(--color-selected-hover);
}
.entity-icon {
color: var(--color-text-secondary);
flex-shrink: 0;
transition: color var(--transition-fast);
}
.entity-item:hover .entity-icon,
.entity-item.selected .entity-icon {
color: var(--color-primary);
}
.entity-name {
font-size: var(--font-size-base);
color: var(--color-text-primary);
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.entity-item.selected .entity-name {
font-weight: var(--font-weight-medium);
}
/* Remote entity styles */
.entity-item.remote-entity {
cursor: default;
border-left: 2px solid rgba(16, 185, 129, 0.5);
}
.entity-item.remote-entity:hover {
background-color: rgba(16, 185, 129, 0.05);
}
.entity-item.remote-entity::before {
display: none;
}
.entity-item.remote-entity.disabled {
opacity: 0.5;
}
.entity-item.remote-entity.disabled .entity-name {
text-decoration: line-through;
color: var(--color-text-tertiary);
}
.entity-item.dragging {
opacity: 0.5;
}
.entity-item.drop-target {
border-top: 2px solid var(--color-primary);
}
.entity-tag {
display: flex;
align-items: center;
justify-content: center;
padding: 2px 6px;
background-color: rgba(139, 92, 246, 0.15);
border: 1px solid rgba(139, 92, 246, 0.4);
border-radius: var(--radius-sm);
color: rgb(167, 139, 250);
font-size: 10px;
font-weight: var(--font-weight-medium);
font-family: var(--font-family-mono);
flex-shrink: 0;
}
.component-count {
display: flex;
align-items: center;
justify-content: center;
min-width: 18px;
height: 18px;
padding: 0 4px;
background-color: rgba(16, 185, 129, 0.2);
border: 1px solid rgba(16, 185, 129, 0.5);
border-radius: var(--radius-full);
color: rgb(16, 185, 129);
font-size: 10px;
font-weight: var(--font-weight-semibold);
flex-shrink: 0;
.remote-indicator {
display: flex;
align-items: center;
padding: 2px 6px;
background: rgba(16, 185, 129, 0.15);
border: 1px solid rgba(16, 185, 129, 0.5);
border-radius: 3px;
color: rgb(16, 185, 129);
animation: pulse-green 1.5s ease-in-out infinite;
}
@keyframes pulse-green {
0%, 100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.6;
transform: scale(1.05);
}
0%, 100% {
opacity: 1;
}
50% {
opacity: 0.6;
}
}
/* Context menu styles */
/* ==================== Context Menu ==================== */
.context-menu {
background-color: var(--color-bg-elevated);
border: 1px solid var(--color-border-default);
border-radius: var(--radius-md);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
padding: var(--spacing-xs);
min-width: 150px;
background: #2d2d2d;
border: 1px solid #444;
border-radius: 4px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
padding: 4px;
min-width: 180px;
}
.context-menu button {
display: flex;
align-items: center;
gap: var(--spacing-sm);
width: 100%;
padding: var(--spacing-sm) var(--spacing-md);
background: transparent;
border: none;
border-radius: var(--radius-sm);
color: var(--color-text-primary);
font-size: var(--font-size-sm);
cursor: pointer;
text-align: left;
display: flex;
align-items: center;
gap: 8px;
width: 100%;
padding: 6px 10px;
background: transparent;
border: none;
border-radius: 3px;
color: #e0e0e0;
font-size: 12px;
cursor: pointer;
text-align: left;
}
.context-menu button:hover {
background-color: var(--color-bg-hover);
background: rgba(255, 255, 255, 0.1);
}
.context-menu-divider {
height: 1px;
background-color: var(--color-border-default);
margin: var(--spacing-xs) 0;
height: 1px;
background: #444;
margin: 4px 0;
}
.context-menu-item-with-submenu {
position: relative;
}
.context-menu-item-with-submenu > button {
display: flex;
align-items: center;
gap: var(--spacing-sm);
width: 100%;
padding: var(--spacing-sm) var(--spacing-md);
background: transparent;
border: none;
border-radius: var(--radius-sm);
color: var(--color-text-primary);
font-size: var(--font-size-sm);
cursor: pointer;
text-align: left;
}
.context-menu-item-with-submenu > button:hover {
background-color: var(--color-bg-hover);
position: relative;
}
.context-menu-item-with-submenu .submenu-arrow {
margin-left: auto;
color: var(--color-text-tertiary);
margin-left: auto;
color: #666;
}
.context-submenu {
position: fixed;
background-color: var(--color-bg-elevated);
border: 1px solid var(--color-border-default);
border-radius: var(--radius-md);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
padding: var(--spacing-xs);
min-width: 150px;
z-index: var(--z-index-popover);
position: fixed;
background: #2d2d2d;
border: 1px solid #444;
border-radius: 4px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
padding: 4px;
min-width: 180px;
z-index: 1001;
}
.context-submenu button {
display: flex;
align-items: center;
gap: var(--spacing-sm);
width: 100%;
padding: var(--spacing-sm) var(--spacing-md);
background: transparent;
border: none;
border-radius: var(--radius-sm);
color: var(--color-text-primary);
font-size: var(--font-size-sm);
cursor: pointer;
text-align: left;
display: flex;
align-items: center;
gap: 8px;
width: 100%;
padding: 6px 10px;
background: transparent;
border: none;
border-radius: 3px;
color: #e0e0e0;
font-size: 12px;
cursor: pointer;
text-align: left;
}
.context-submenu button:hover {
background-color: var(--color-bg-hover);
background: rgba(255, 255, 255, 0.1);
}
.context-menu-danger {
color: var(--color-error) !important;
color: #f87171 !important;
}
.context-menu-danger:hover {
background-color: rgba(244, 135, 113, 0.1) !important;
background: rgba(248, 113, 113, 0.15) !important;
}

View File

@@ -1,426 +1,498 @@
/* ==================== Settings Window - 新设计 ==================== */
.settings-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: var(--z-index-modal);
backdrop-filter: blur(4px);
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.6);
display: flex;
align-items: center;
justify-content: center;
z-index: var(--z-index-modal, 1000);
backdrop-filter: blur(2px);
}
.settings-window {
background-color: var(--color-bg-base);
border: 1px solid var(--color-border-strong);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-xl);
width: 800px;
max-width: 90vw;
max-height: 80vh;
display: flex;
flex-direction: column;
overflow: hidden;
.settings-window-new {
display: flex;
width: 1100px;
max-width: 95vw;
height: 700px;
max-height: 90vh;
background: #1e1e1e;
border: 1px solid #3c3c3c;
border-radius: 6px;
overflow: hidden;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
}
.settings-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: var(--spacing-lg) var(--spacing-xl);
border-bottom: 1px solid var(--color-border-default);
background-color: var(--color-bg-elevated);
/* ==================== Left Sidebar ==================== */
.settings-sidebar-new {
width: 220px;
min-width: 220px;
background: #252526;
border-right: 1px solid #3c3c3c;
display: flex;
flex-direction: column;
}
.settings-title {
display: flex;
align-items: center;
gap: var(--spacing-sm);
color: var(--color-text-primary);
.settings-sidebar-header {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 12px;
background: #2d2d30;
border-bottom: 1px solid #3c3c3c;
font-size: 12px;
color: #e0e0e0;
}
.settings-title h2 {
margin: 0;
font-size: var(--font-size-lg);
font-weight: var(--font-weight-semibold);
.settings-sidebar-header svg {
color: #888;
}
.settings-close-btn {
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
background: none;
border: none;
color: var(--color-text-secondary);
cursor: pointer;
border-radius: var(--radius-sm);
transition: all var(--transition-fast);
.settings-sidebar-close {
margin-left: auto;
background: none;
border: none;
color: #888;
cursor: pointer;
padding: 4px;
border-radius: 2px;
display: flex;
align-items: center;
justify-content: center;
}
.settings-close-btn:hover {
background-color: var(--color-bg-hover);
color: var(--color-text-primary);
.settings-sidebar-close:hover {
background: #3c3c3c;
color: #e0e0e0;
}
.settings-body {
flex: 1;
display: flex;
overflow: hidden;
.settings-sidebar-search {
padding: 8px 12px;
font-size: 11px;
color: #888;
border-bottom: 1px solid #3c3c3c;
}
.settings-sidebar {
width: 220px;
background-color: var(--color-bg-elevated);
border-right: 1px solid var(--color-border-default);
overflow-y: auto;
flex-shrink: 0;
.settings-sidebar-categories {
flex: 1;
overflow-y: auto;
padding: 4px 0;
}
.settings-sidebar::-webkit-scrollbar {
width: 8px;
.settings-main-category {
margin-bottom: 2px;
}
.settings-sidebar::-webkit-scrollbar-track {
background: transparent;
.settings-main-category-header {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 12px;
font-size: 12px;
font-weight: 600;
color: #e0e0e0;
cursor: pointer;
user-select: none;
}
.settings-sidebar::-webkit-scrollbar-thumb {
background: rgba(121, 121, 121, 0.3);
border-radius: 4px;
.settings-main-category-header:hover {
background: #2d2d30;
}
.settings-sidebar::-webkit-scrollbar-thumb:hover {
background: rgba(100, 100, 100, 0.5);
.settings-main-category-header svg {
color: #888;
flex-shrink: 0;
}
.settings-category-btn {
width: 100%;
display: flex;
flex-direction: column;
align-items: flex-start;
padding: var(--spacing-md) var(--spacing-lg);
background: none;
border: none;
border-left: 3px solid transparent;
cursor: pointer;
text-align: left;
transition: all var(--transition-fast);
position: relative;
.settings-sub-categories {
padding-left: 12px;
}
.settings-category-btn:hover {
background-color: var(--color-bg-hover);
.settings-sub-category {
display: block;
width: 100%;
padding: 5px 12px 5px 18px;
background: none;
border: none;
text-align: left;
font-size: 11px;
color: #999;
cursor: pointer;
transition: all 0.1s ease;
}
.settings-category-btn.active {
background-color: var(--color-bg-base);
border-left-color: var(--color-primary);
.settings-sub-category:hover {
color: #e0e0e0;
background: #2d2d30;
}
.settings-category-title {
font-size: var(--font-size-sm);
font-weight: var(--font-weight-medium);
color: var(--color-text-primary);
.settings-sub-category.active {
color: #fff;
background: #094771;
}
/* ==================== Right Content ==================== */
.settings-content-new {
flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
}
.settings-content-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 16px;
background: #2d2d30;
border-bottom: 1px solid #3c3c3c;
}
.settings-search-bar {
display: flex;
align-items: center;
gap: 8px;
flex: 1;
max-width: 400px;
padding: 6px 12px;
background: #1e1e1e;
border: 1px solid #3c3c3c;
border-radius: 4px;
}
.settings-search-bar svg {
color: #666;
flex-shrink: 0;
}
.settings-search-bar input {
flex: 1;
background: none;
border: none;
color: #e0e0e0;
font-size: 12px;
outline: none;
}
.settings-search-bar input::placeholder {
color: #666;
}
.settings-header-actions {
display: flex;
align-items: center;
gap: 4px;
}
.settings-icon-btn {
display: flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
background: none;
border: none;
color: #888;
cursor: pointer;
border-radius: 4px;
}
.settings-icon-btn:hover {
background: #3c3c3c;
color: #e0e0e0;
}
.settings-action-btn {
padding: 6px 12px;
background: #3c3c3c;
border: 1px solid #4a4a4a;
border-radius: 4px;
color: #e0e0e0;
font-size: 11px;
cursor: pointer;
transition: all 0.1s ease;
}
.settings-action-btn:hover {
background: #4a4a4a;
}
/* ==================== Category Title Bar ==================== */
.settings-category-title-bar {
padding: 12px 16px;
background: #252526;
border-bottom: 1px solid #3c3c3c;
}
.settings-category-breadcrumb {
display: flex;
align-items: center;
gap: 6px;
font-size: 14px;
font-weight: 600;
color: #e0e0e0;
margin-bottom: 4px;
}
.settings-category-breadcrumb svg {
color: #888;
}
.settings-breadcrumb-separator {
color: #666;
}
.settings-category-desc {
font-size: var(--font-size-xs);
color: var(--color-text-tertiary);
margin-top: 2px;
font-size: 11px;
color: #888;
margin: 4px 0 8px;
}
.settings-category-arrow {
position: absolute;
right: var(--spacing-md);
top: 50%;
transform: translateY(-50%);
color: var(--color-text-tertiary);
opacity: 0;
transition: opacity var(--transition-fast);
.settings-category-actions {
display: flex;
align-items: center;
gap: 8px;
margin-top: 8px;
}
.settings-category-btn.active .settings-category-arrow {
opacity: 1;
.settings-category-action-btn {
padding: 5px 12px;
background: #3c3c3c;
border: 1px solid #4a4a4a;
border-radius: 3px;
color: #e0e0e0;
font-size: 11px;
cursor: pointer;
transition: all 0.1s ease;
}
.settings-content {
flex: 1;
overflow-y: auto;
padding: var(--spacing-xl);
.settings-category-action-btn:hover {
background: #4a4a4a;
}
.settings-content::-webkit-scrollbar {
width: 14px;
/* ==================== Settings Sections ==================== */
.settings-sections-container {
flex: 1;
overflow-y: auto;
padding: 0;
}
.settings-content::-webkit-scrollbar-track {
background: transparent;
.settings-section-new {
border-bottom: 1px solid #3c3c3c;
}
.settings-content::-webkit-scrollbar-thumb {
background: rgba(121, 121, 121, 0.4);
border-radius: 8px;
border: 3px solid transparent;
background-clip: padding-box;
.settings-section-header-new {
display: flex;
align-items: center;
gap: 6px;
padding: 10px 16px;
font-size: 12px;
font-weight: 600;
color: #e0e0e0;
cursor: pointer;
user-select: none;
background: #2a2a2a;
}
.settings-content::-webkit-scrollbar-thumb:hover {
background: rgba(100, 100, 100, 0.7);
background-clip: padding-box;
.settings-section-header-new:hover {
background: #333;
}
.settings-section {
margin-bottom: var(--spacing-2xl);
.settings-section-header-new svg {
color: #888;
}
.settings-section:last-child {
margin-bottom: 0;
.settings-section-content-new {
padding: 4px 0;
background: #1e1e1e;
}
.settings-section-title {
font-size: var(--font-size-base);
font-weight: var(--font-weight-semibold);
color: var(--color-text-primary);
margin: 0 0 var(--spacing-md) 0;
padding-bottom: var(--spacing-sm);
border-bottom: 1px solid var(--color-border-subtle);
/* ==================== Settings Row ==================== */
.settings-row {
display: flex;
align-items: center;
padding: 6px 16px 6px 28px;
min-height: 32px;
}
.settings-section-description {
font-size: var(--font-size-sm);
color: var(--color-text-secondary);
margin: var(--spacing-sm) 0 var(--spacing-md) 0;
.settings-row:hover {
background: #252526;
}
.settings-field {
margin-bottom: var(--spacing-lg);
.settings-row-label {
display: flex;
align-items: center;
gap: 4px;
flex: 0 0 200px;
font-size: 11px;
color: #999;
}
.settings-field:last-child {
margin-bottom: 0;
.settings-row-expand {
color: #666;
cursor: pointer;
}
.settings-label {
display: flex;
flex-direction: column;
gap: var(--spacing-xs);
font-size: var(--font-size-sm);
font-weight: var(--font-weight-medium);
color: var(--color-text-primary);
margin-bottom: var(--spacing-sm);
}
.settings-label-checkbox {
flex-direction: row;
align-items: flex-start;
gap: var(--spacing-sm);
margin-bottom: 0;
}
.settings-label-checkbox span:first-of-type {
font-weight: var(--font-weight-medium);
}
.settings-hint {
font-size: var(--font-size-xs);
font-weight: var(--font-weight-normal);
color: var(--color-text-tertiary);
margin-top: 2px;
}
.settings-input {
width: 100%;
padding: var(--spacing-sm) var(--spacing-md);
background-color: var(--color-bg-inset);
border: 1px solid var(--color-border-default);
border-radius: var(--radius-sm);
color: var(--color-text-primary);
font-size: var(--font-size-sm);
font-family: var(--font-family-mono);
transition: all var(--transition-fast);
}
.settings-input:focus {
outline: none;
border-color: var(--color-primary);
background-color: var(--color-bg-base);
}
.settings-input:hover:not(:focus) {
border-color: var(--color-border-strong);
.settings-row-value {
flex: 1;
display: flex;
align-items: center;
gap: 8px;
}
/* ==================== Input Styles ==================== */
.settings-checkbox {
width: 18px;
height: 18px;
margin: 0;
cursor: pointer;
flex-shrink: 0;
width: 16px;
height: 16px;
accent-color: #0078d4;
cursor: pointer;
}
.settings-footer {
display: flex;
align-items: center;
justify-content: flex-end;
gap: var(--spacing-md);
padding: var(--spacing-lg) var(--spacing-xl);
border-top: 1px solid var(--color-border-default);
background-color: var(--color-bg-elevated);
.settings-number-input,
.settings-text-input {
width: 100%;
max-width: 200px;
padding: 4px 8px;
background: #1e1e1e;
border: 1px solid #3c3c3c;
border-radius: 2px;
color: #e0e0e0;
font-size: 11px;
outline: none;
}
.settings-btn {
padding: var(--spacing-sm) var(--spacing-lg);
border: none;
border-radius: var(--radius-sm);
font-size: var(--font-size-sm);
font-weight: var(--font-weight-medium);
cursor: pointer;
transition: all var(--transition-fast);
.settings-number-input:focus,
.settings-text-input:focus {
border-color: #0078d4;
}
.settings-btn-cancel {
background-color: var(--color-bg-hover);
color: var(--color-text-primary);
border: 1px solid var(--color-border-default);
}
.settings-btn-cancel:hover {
background-color: var(--color-bg-inset);
border-color: var(--color-border-strong);
}
.settings-btn-save {
background-color: var(--color-primary);
color: var(--color-text-inverse);
}
.settings-btn-save:hover {
background-color: var(--color-primary-hover);
}
.settings-btn-save:active {
transform: scale(0.98);
.settings-number-input.error,
.settings-text-input.error {
border-color: #f48771;
}
.settings-select {
width: 100%;
padding: var(--spacing-sm) var(--spacing-md);
background-color: var(--color-bg-inset);
border: 1px solid var(--color-border-default);
border-radius: var(--radius-sm);
color: var(--color-text-primary);
font-size: var(--font-size-sm);
cursor: pointer;
transition: all var(--transition-fast);
width: 100%;
max-width: 200px;
padding: 4px 8px;
background: #1e1e1e;
border: 1px solid #3c3c3c;
border-radius: 2px;
color: #e0e0e0;
font-size: 11px;
outline: none;
cursor: pointer;
}
.settings-select:focus {
outline: none;
border-color: var(--color-primary);
background-color: var(--color-bg-base);
}
.settings-select:hover:not(:focus) {
border-color: var(--color-border-strong);
}
.settings-range-wrapper {
display: flex;
align-items: center;
gap: var(--spacing-md);
border-color: #0078d4;
}
/* ==================== Range Input ==================== */
.settings-range {
flex: 1;
height: 6px;
border-radius: 3px;
background: var(--color-bg-inset);
outline: none;
-webkit-appearance: none;
flex: 1;
max-width: 150px;
height: 4px;
background: #3c3c3c;
border-radius: 2px;
outline: none;
-webkit-appearance: none;
}
.settings-range::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 16px;
height: 16px;
border-radius: 50%;
background: var(--color-primary);
cursor: pointer;
transition: transform var(--transition-fast);
}
.settings-range::-webkit-slider-thumb:hover {
transform: scale(1.2);
}
.settings-range::-moz-range-thumb {
width: 16px;
height: 16px;
border-radius: 50%;
background: var(--color-primary);
cursor: pointer;
border: none;
transition: transform var(--transition-fast);
}
.settings-range::-moz-range-thumb:hover {
transform: scale(1.2);
-webkit-appearance: none;
width: 12px;
height: 12px;
background: #0078d4;
border-radius: 50%;
cursor: pointer;
}
.settings-range-value {
min-width: 40px;
text-align: center;
font-size: var(--font-size-sm);
font-weight: var(--font-weight-medium);
color: var(--color-text-primary);
font-family: var(--font-family-mono);
min-width: 40px;
text-align: right;
font-size: 11px;
color: #999;
font-family: monospace;
}
/* ==================== Color Input ==================== */
.settings-color-bar {
width: 120px;
height: 22px;
border-radius: 2px;
position: relative;
overflow: hidden;
cursor: pointer;
}
.settings-color-input {
width: 60px;
height: 40px;
border: 1px solid var(--color-border-default);
border-radius: var(--radius-sm);
cursor: pointer;
transition: border-color var(--transition-fast);
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0;
cursor: pointer;
}
.settings-color-input:hover {
border-color: var(--color-border-strong);
}
.settings-input-error {
border-color: var(--color-error) !important;
/* ==================== Special Types ==================== */
.settings-plugin-list,
.settings-custom-renderer {
padding: 8px 16px;
}
.settings-error {
display: block;
margin-top: var(--spacing-xs);
font-size: var(--font-size-xs);
color: var(--color-error);
color: #f48771;
font-size: 11px;
}
.settings-empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100%;
color: var(--color-text-tertiary);
text-align: center;
gap: var(--spacing-md);
.settings-hint {
color: #888;
font-size: 11px;
}
.settings-empty svg {
opacity: 0.3;
/* ==================== Empty State ==================== */
.settings-empty-new {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100%;
color: #666;
gap: 12px;
}
.settings-empty p {
margin: 0;
font-size: var(--font-size-base);
.settings-empty-new svg {
opacity: 0.3;
}
.settings-empty-new p {
font-size: 13px;
}
/* ==================== Scrollbar ==================== */
.settings-sidebar-categories::-webkit-scrollbar,
.settings-sections-container::-webkit-scrollbar {
width: 8px;
}
.settings-sidebar-categories::-webkit-scrollbar-track,
.settings-sections-container::-webkit-scrollbar-track {
background: transparent;
}
.settings-sidebar-categories::-webkit-scrollbar-thumb,
.settings-sections-container::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.1);
border-radius: 4px;
}
.settings-sidebar-categories::-webkit-scrollbar-thumb:hover,
.settings-sections-container::-webkit-scrollbar-thumb:hover {
background: rgba(255, 255, 255, 0.2);
}

View File

@@ -0,0 +1,323 @@
.status-bar {
position: fixed;
bottom: 0;
left: 0;
right: 0;
display: flex;
align-items: center;
justify-content: space-between;
height: 24px;
background: #2d2d2d;
border-top: 1px solid #1a1a1a;
padding: 0;
flex-shrink: 0;
font-size: 11px;
user-select: none;
z-index: 1000;
}
.status-bar-left {
display: flex;
align-items: center;
height: 100%;
flex: 1;
}
.status-bar-right {
display: flex;
align-items: center;
height: 100%;
}
.status-bar-divider {
width: 1px;
height: 14px;
background: #444;
margin: 0 2px;
}
/* Tab Buttons */
.status-bar-tab {
display: flex;
align-items: center;
gap: 4px;
height: 100%;
padding: 0 8px;
background: transparent;
border: none;
color: #888;
font-size: 11px;
cursor: pointer;
transition: all 0.15s ease;
}
.status-bar-tab:hover {
background: rgba(255, 255, 255, 0.05);
color: #ccc;
}
.status-bar-tab.active {
color: #fff;
background: rgba(255, 255, 255, 0.08);
border-bottom: 2px solid #0078d4;
}
/* Console Input */
.status-bar-console-input {
display: flex;
align-items: center;
flex: 1;
height: 100%;
padding: 0 8px;
color: #666;
}
.console-prompt {
color: #666;
margin-right: 4px;
}
.status-bar-console-input input {
flex: 1;
background: transparent;
border: none;
color: #888;
font-size: 11px;
font-family: 'Consolas', 'Monaco', monospace;
outline: none;
}
.status-bar-console-input input::placeholder {
color: #555;
}
/* Right Side Indicators */
.status-bar-indicator {
display: flex;
align-items: center;
gap: 4px;
height: 100%;
padding: 0 8px;
background: transparent;
border: none;
color: #888;
font-size: 11px;
cursor: pointer;
}
.status-bar-indicator:hover {
background: rgba(255, 255, 255, 0.05);
color: #ccc;
}
/* Icon Group */
.status-bar-icon-group {
display: flex;
align-items: center;
height: 100%;
}
.status-bar-icon-btn {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 100%;
background: transparent;
border: none;
color: #888;
cursor: pointer;
}
.status-bar-icon-btn:hover {
background: rgba(255, 255, 255, 0.05);
color: #ccc;
}
/* Info Items */
.status-bar-info {
display: flex;
align-items: center;
gap: 4px;
height: 100%;
padding: 0 8px;
color: #888;
font-size: 11px;
}
.status-bar-info svg {
color: #4ade80;
}
/* Generic button reset */
.status-bar-btn {
display: flex;
align-items: center;
gap: 4px;
background: transparent;
border: none;
color: #888;
font-size: 11px;
cursor: pointer;
}
.status-bar-btn:hover {
color: #ccc;
}
/* ==================== Drawer Common Styles ==================== */
.drawer-backdrop {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 24px;
background: rgba(0, 0, 0, 0.3);
z-index: 998;
}
.drawer-panel {
position: fixed;
left: 0;
right: 0;
bottom: 24px;
background: #1e1e1e;
border-top: 2px solid #3b82f6;
z-index: 999;
display: flex;
flex-direction: column;
box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.4);
overflow: hidden;
transition: height 0.15s ease;
}
.drawer-panel:not(.open) {
height: 0 !important;
border-top: none;
box-shadow: none;
}
.drawer-panel:not(.open) .drawer-header,
.drawer-panel:not(.open) .drawer-body,
.drawer-panel:not(.open) .drawer-resize-handle,
.drawer-panel:not(.open) .output-log-toolbar {
display: none;
}
.drawer-resize-handle {
position: absolute;
top: -4px;
left: 0;
right: 0;
height: 8px;
cursor: ns-resize;
z-index: 10;
}
.drawer-resize-handle::before {
content: '';
position: absolute;
top: 3px;
left: 50%;
transform: translateX(-50%);
width: 40px;
height: 3px;
background: #4c4c4c;
border-radius: 2px;
opacity: 0;
transition: opacity 0.2s ease;
}
.drawer-resize-handle:hover::before {
opacity: 1;
}
.drawer-header {
display: flex;
align-items: center;
justify-content: space-between;
height: 28px;
padding: 0 8px 0 12px;
background: #252526;
border-bottom: 1px solid #3c3c3c;
}
.drawer-title {
display: flex;
align-items: center;
gap: 8px;
font-size: 12px;
font-weight: 500;
color: #e0e0e0;
}
.drawer-close {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
background: transparent;
border: none;
border-radius: 3px;
color: #888;
cursor: pointer;
transition: all 0.1s ease;
}
.drawer-close:hover {
background: #3c3c3c;
color: #e0e0e0;
}
.drawer-body {
flex: 1;
overflow: hidden;
}
/* Content Drawer Specific */
.content-drawer-panel .drawer-body .content-browser {
height: 100%;
}
.content-drawer-panel .drawer-body .content-browser.is-drawer {
border-top: none;
}
/* Drawer Toggle Button */
.drawer-toggle-btn {
display: flex;
align-items: center;
gap: 6px;
height: 100%;
padding: 0 10px;
background: #3a3a3a;
border: none;
border-right: 1px solid #1a1a1a;
color: #ccc;
font-size: 11px;
cursor: pointer;
transition: background 0.15s ease;
}
.drawer-toggle-btn:hover {
background: #444;
color: #fff;
}
.drawer-toggle-btn.active {
background: #4a4a4a;
color: #fff;
}
/* ==================== Output Log Drawer ==================== */
.output-log-body {
background: #1a1a1a;
}
.output-log-body .output-log-panel {
height: 100%;
}

View File

@@ -0,0 +1,213 @@
/* ==================== Title Bar Container ==================== */
.titlebar {
display: flex;
align-items: center;
justify-content: space-between;
height: 32px;
background: linear-gradient(180deg, #3a3a3f 0%, #2d2d32 100%);
border-bottom: 1px solid #1a1a1d;
user-select: none;
flex-shrink: 0;
}
/* ==================== Left Section: Logo + Menus ==================== */
.titlebar-left {
display: flex;
align-items: center;
height: 100%;
}
.titlebar-logo {
display: flex;
align-items: center;
justify-content: center;
width: 40px;
height: 100%;
background: rgba(0, 0, 0, 0.2);
border-right: 1px solid rgba(255, 255, 255, 0.05);
}
.titlebar-logo-text {
font-size: 14px;
font-weight: 700;
color: #4a9eff;
text-shadow: 0 0 8px rgba(74, 158, 255, 0.8),
0 0 16px rgba(74, 158, 255, 0.5),
0 0 24px rgba(74, 158, 255, 0.3);
letter-spacing: 1px;
}
/* ==================== Menu Bar ==================== */
.titlebar-menus {
display: flex;
align-items: center;
height: 100%;
}
.titlebar-menu-item {
position: relative;
height: 100%;
}
.titlebar-menu-button {
height: 100%;
padding: 0 12px;
background: transparent;
border: none;
color: #a0a0a0;
font-size: 12px;
font-weight: 400;
cursor: pointer;
transition: all 0.1s ease;
}
.titlebar-menu-button:hover {
background: rgba(255, 255, 255, 0.06);
color: #d0d0d0;
}
.titlebar-menu-button.active {
background: rgba(255, 255, 255, 0.1);
color: #ffffff;
}
/* ==================== Dropdown Menu ==================== */
.titlebar-dropdown {
position: absolute;
top: 100%;
left: 0;
min-width: 200px;
background: #252528;
border: 1px solid #3a3a3d;
border-radius: 4px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);
padding: 4px 0;
z-index: 10000;
animation: dropdown-fade-in 0.1s ease;
}
@keyframes dropdown-fade-in {
from {
opacity: 0;
transform: translateY(-4px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.titlebar-dropdown-item {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
padding: 6px 12px;
background: transparent;
border: none;
color: #c0c0c0;
font-size: 12px;
text-align: left;
cursor: pointer;
transition: background 0.1s ease;
}
.titlebar-dropdown-item:hover:not(.disabled) {
background: #3b82f6;
color: #ffffff;
}
.titlebar-dropdown-item.disabled {
color: #505050;
cursor: not-allowed;
}
.titlebar-dropdown-item-content {
display: flex;
align-items: center;
gap: 8px;
}
.titlebar-dropdown-item-content svg {
width: 14px;
height: 14px;
opacity: 0.7;
}
.titlebar-dropdown-shortcut {
color: #606060;
font-size: 11px;
margin-left: 24px;
}
.titlebar-dropdown-item:hover:not(.disabled) .titlebar-dropdown-shortcut {
color: rgba(255, 255, 255, 0.7);
}
.titlebar-dropdown-separator {
height: 1px;
background: #3a3a3d;
margin: 4px 8px;
}
/* ==================== Center Section: Draggable Area ==================== */
.titlebar-center {
flex: 1;
height: 100%;
-webkit-app-region: drag;
}
/* ==================== Right Section: Project Name + Window Controls ==================== */
.titlebar-right {
display: flex;
align-items: center;
height: 100%;
}
.titlebar-project-name {
font-size: 12px;
font-weight: 400;
color: #707070;
padding: 0 16px;
height: 100%;
display: flex;
align-items: center;
-webkit-app-region: drag;
}
.titlebar-window-controls {
display: flex;
align-items: center;
height: 100%;
}
.titlebar-button {
display: flex;
align-items: center;
justify-content: center;
width: 46px;
height: 100%;
background: transparent;
border: none;
color: #808080;
cursor: pointer;
transition: all 0.1s ease;
}
.titlebar-button:hover {
background: rgba(255, 255, 255, 0.1);
color: #ffffff;
}
.titlebar-button:active {
background: rgba(255, 255, 255, 0.05);
}
.titlebar-button-close:hover {
background: #e81123;
color: #ffffff;
}
.titlebar-button svg {
flex-shrink: 0;
}

View File

@@ -0,0 +1,244 @@
/* Transform Component Inspector - Custom Design */
.tf-inspector {
padding: 4px 0;
}
/* Divider between rows */
.tf-divider {
height: 1px;
background: #3a3a3a;
margin: 0 8px;
}
/* Transform Row */
.tf-row {
display: flex;
align-items: center;
padding: 4px 8px;
min-height: 24px;
gap: 4px;
}
.tf-row:hover {
background: rgba(255, 255, 255, 0.02);
}
/* Label Button with dropdown arrow */
.tf-label-btn {
display: flex;
align-items: center;
justify-content: space-between;
width: 70px;
min-width: 70px;
padding: 0 8px;
background: #333;
border: 1px solid #444;
border-radius: 2px;
color: #ccc;
font-size: 11px;
cursor: pointer;
height: 20px;
flex-shrink: 0;
}
.tf-label-btn:hover {
background: #3a3a3a;
border-color: #4a4a4a;
}
.tf-label-btn svg {
color: #888;
flex-shrink: 0;
}
/* Inputs Container */
.tf-inputs {
display: flex;
flex: 1;
gap: 2px;
min-width: 0;
}
/* Axis Input */
.tf-axis-input {
display: flex;
align-items: center;
flex: 1;
min-width: 0;
background: #1a1a1a;
border: 1px solid #444;
border-radius: 2px;
height: 20px;
overflow: hidden;
}
.tf-axis-input:hover {
border-color: #555;
background: #1e1e1e;
}
.tf-axis-input:focus-within {
border-color: #4a9eff;
}
.tf-axis-input.dragging {
border-color: #4a9eff;
}
/* Color bar */
.tf-axis-bar {
width: 4px;
height: 100%;
flex-shrink: 0;
cursor: ew-resize;
}
.tf-axis-bar.tf-axis-x {
background: #c04040;
}
.tf-axis-bar.tf-axis-y {
background: #40a040;
}
.tf-axis-bar.tf-axis-z {
background: #4060c0;
}
.tf-axis-input input {
flex: 1;
min-width: 0;
height: 100%;
padding: 0 4px;
background: transparent;
border: none;
font-size: 11px;
font-family: 'Consolas', 'Monaco', 'Menlo', monospace;
color: #ddd;
text-align: left;
-moz-appearance: textfield;
}
.tf-axis-input input::-webkit-outer-spin-button,
.tf-axis-input input::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
.tf-axis-input input:focus {
outline: none;
background: rgba(74, 158, 255, 0.05);
}
/* Suffix */
.tf-axis-suffix {
font-size: 10px;
color: #666;
padding-right: 4px;
flex-shrink: 0;
}
/* Lock Button */
.tf-lock-btn {
display: flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
background: transparent;
border: none;
color: #666;
cursor: pointer;
padding: 0;
flex-shrink: 0;
border-radius: 2px;
}
.tf-lock-btn:hover {
color: #999;
background: rgba(255, 255, 255, 0.05);
}
.tf-lock-btn.locked {
color: #ccc;
}
/* Reset Button */
.tf-reset-btn {
display: flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
background: transparent;
border: none;
color: #555;
cursor: pointer;
padding: 0;
flex-shrink: 0;
border-radius: 2px;
}
.tf-reset-btn:hover {
color: #999;
background: rgba(255, 255, 255, 0.05);
}
/* Mobility Row */
.tf-mobility-row {
display: flex;
align-items: center;
padding: 4px 8px;
min-height: 24px;
gap: 4px;
}
.tf-mobility-label {
font-size: 11px;
color: #999;
width: 70px;
min-width: 70px;
flex-shrink: 0;
padding-left: 8px;
}
.tf-mobility-buttons {
display: flex;
gap: 0;
flex: 1;
}
.tf-mobility-btn {
flex: 1;
padding: 0 8px;
font-size: 11px;
font-weight: 400;
color: #999;
background: #2a2a2a;
border: 1px solid #444;
cursor: pointer;
height: 20px;
transition: all 0.1s ease;
}
.tf-mobility-btn:first-child {
border-radius: 2px 0 0 2px;
}
.tf-mobility-btn:last-child {
border-radius: 0 2px 2px 0;
}
.tf-mobility-btn:not(:first-child) {
border-left: none;
}
.tf-mobility-btn:hover {
background: #333;
color: #ccc;
}
.tf-mobility-btn.active {
background: #444;
color: #fff;
}

View File

@@ -8,6 +8,140 @@
overflow: hidden;
}
/* Viewport Internal Toolbar */
.viewport-internal-toolbar {
position: absolute;
top: 0;
left: 0;
right: 0;
display: flex;
align-items: center;
justify-content: space-between;
height: 28px;
padding: 0 8px;
background: rgba(30, 30, 30, 0.85);
backdrop-filter: blur(4px);
border-bottom: 1px solid rgba(0, 0, 0, 0.3);
z-index: 20;
}
.viewport-internal-toolbar-left,
.viewport-internal-toolbar-right {
display: flex;
align-items: center;
gap: 4px;
}
.viewport-snap-control {
display: flex;
align-items: center;
gap: 4px;
color: #888;
font-size: 12px;
}
.viewport-snap-dropdown {
position: relative;
}
.viewport-snap-btn {
display: flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 3px;
color: #aaa;
font-size: 11px;
cursor: pointer;
transition: all 0.15s ease;
height: 22px;
}
.viewport-snap-btn:hover {
background: rgba(255, 255, 255, 0.1);
color: #fff;
}
/* Zoom display */
.viewport-zoom-display {
display: flex;
align-items: center;
gap: 4px;
padding: 0 6px;
color: #888;
font-size: 11px;
font-family: var(--font-family-mono);
}
.viewport-view-btn {
display: flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 3px;
color: #aaa;
font-size: 11px;
cursor: pointer;
transition: all 0.15s ease;
}
.viewport-view-btn:hover {
background: rgba(255, 255, 255, 0.1);
color: #fff;
}
.viewport-more-btn {
padding: 2px 4px;
}
.viewport-snap-menu {
position: absolute;
top: 100%;
left: 0;
margin-top: 4px;
min-width: 80px;
background: #2d2d2d;
border: 1px solid #444;
border-radius: 4px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
z-index: 100;
overflow: hidden;
}
.viewport-snap-menu-right {
left: auto;
right: 0;
min-width: 140px;
}
.viewport-snap-menu button {
display: flex;
align-items: center;
gap: 8px;
width: 100%;
padding: 6px 12px;
background: transparent;
border: none;
color: #ccc;
font-size: 11px;
text-align: left;
cursor: pointer;
transition: background 0.1s ease;
}
.viewport-snap-menu button:hover {
background: rgba(255, 255, 255, 0.1);
}
.viewport-snap-menu button.active {
background: rgba(0, 120, 212, 0.3);
color: #fff;
}
.viewport-toolbar {
display: flex;
align-items: center;
@@ -183,39 +317,6 @@
margin: 0 6px;
}
/* Coordinate system indicator */
.viewport-coord-indicator {
display: flex;
align-items: center;
gap: 4px;
padding: 2px 6px;
background: rgba(0, 0, 0, 0.2);
border-radius: 3px;
font-size: 10px;
font-weight: 600;
color: var(--color-text-secondary);
text-transform: uppercase;
letter-spacing: 0.5px;
}
.viewport-coord-indicator.world {
color: #60a5fa;
}
.viewport-coord-indicator.local {
color: #fbbf24;
}
/* Zoom indicator */
.viewport-zoom {
display: flex;
align-items: center;
padding: 2px 6px;
font-size: 10px;
font-weight: 500;
color: var(--color-text-secondary);
font-variant-numeric: tabular-nums;
}
.viewport-canvas {
flex: 1;