From be8bb438cdd787136442d7a9ae263892613da19b Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 23 Feb 2026 08:16:29 +0000 Subject: [PATCH] feat: Add File Browser and Graph Editor components - Implemented `FileBrowserComponent` based on design reference (Screen 2). - Implemented `GraphEditorComponent` based on design reference (Screen 3) including SVG curve visualization. - Updated `BuiThemeService` (`themes.ts`) with new CSS variables for channels, grid lines, and icons. - Updated `demo-app` to showcase the new components. - Adjusted build budget for styles to accommodate complex SCSS. Co-authored-by: vis-iks <225935531+vis-iks@users.noreply.github.com> --- apps/demo-app/project.json | 4 +- apps/demo-app/src/app/app.html | 16 +- apps/demo-app/src/app/app.ts | 4 +- libs/blender-ui/src/index.ts | 2 + .../file-browser/file-browser.component.html | 148 ++++++ .../file-browser/file-browser.component.scss | 301 ++++++++++++ .../file-browser/file-browser.component.ts | 13 + .../graph-editor/graph-editor.component.html | 302 ++++++++++++ .../graph-editor/graph-editor.component.scss | 434 ++++++++++++++++++ .../graph-editor/graph-editor.component.ts | 13 + libs/blender-ui/src/lib/services/themes.ts | 16 + 11 files changed, 1248 insertions(+), 5 deletions(-) create mode 100644 libs/blender-ui/src/lib/components/file-browser/file-browser.component.html create mode 100644 libs/blender-ui/src/lib/components/file-browser/file-browser.component.scss create mode 100644 libs/blender-ui/src/lib/components/file-browser/file-browser.component.ts create mode 100644 libs/blender-ui/src/lib/components/graph-editor/graph-editor.component.html create mode 100644 libs/blender-ui/src/lib/components/graph-editor/graph-editor.component.scss create mode 100644 libs/blender-ui/src/lib/components/graph-editor/graph-editor.component.ts diff --git a/apps/demo-app/project.json b/apps/demo-app/project.json index 53623bc..6f293d6 100644 --- a/apps/demo-app/project.json +++ b/apps/demo-app/project.json @@ -32,8 +32,8 @@ }, { "type": "anyComponentStyle", - "maximumWarning": "4kb", - "maximumError": "8kb" + "maximumWarning": "10kb", + "maximumError": "15kb" } ], "outputHashing": "all" diff --git a/apps/demo-app/src/app/app.html b/apps/demo-app/src/app/app.html index 1899e61..b8ce366 100644 --- a/apps/demo-app/src/app/app.html +++ b/apps/demo-app/src/app/app.html @@ -1,3 +1,4 @@ + - diff --git a/apps/demo-app/src/app/app.ts b/apps/demo-app/src/app/app.ts index 7950cac..76c2abf 100644 --- a/apps/demo-app/src/app/app.ts +++ b/apps/demo-app/src/app/app.ts @@ -1,9 +1,9 @@ import { Component, inject, computed } from '@angular/core'; import { RouterModule } from '@angular/router'; -import { BuiThemeService, LayoutComponent, ModifierPanelComponent, HeaderComponent, FooterComponent, OutlinerComponent, PropertiesComponent, ViewportComponent, TimelineComponent, ContextMenuTriggerDirective, ContextMenuItem } from '@blender-ui/core'; +import { BuiThemeService, LayoutComponent, ModifierPanelComponent, HeaderComponent, FooterComponent, OutlinerComponent, PropertiesComponent, ViewportComponent, TimelineComponent, ContextMenuTriggerDirective, ContextMenuItem, FileBrowserComponent, GraphEditorComponent } from '@blender-ui/core'; @Component({ - imports: [RouterModule, LayoutComponent, ModifierPanelComponent, HeaderComponent, FooterComponent, OutlinerComponent, PropertiesComponent, ViewportComponent, TimelineComponent, ContextMenuTriggerDirective], + imports: [RouterModule, LayoutComponent, ModifierPanelComponent, HeaderComponent, FooterComponent, OutlinerComponent, PropertiesComponent, ViewportComponent, TimelineComponent, ContextMenuTriggerDirective, FileBrowserComponent, GraphEditorComponent], selector: 'app-root', templateUrl: './app.html', styleUrl: './app.scss', diff --git a/libs/blender-ui/src/index.ts b/libs/blender-ui/src/index.ts index 9fb0246..c52b6af 100644 --- a/libs/blender-ui/src/index.ts +++ b/libs/blender-ui/src/index.ts @@ -17,3 +17,5 @@ export * from './lib/components/scene-properties/scene-properties.component'; export * from './lib/components/context-menu/context-menu.component'; export * from './lib/components/context-menu/context-menu.interface'; export * from './lib/components/context-menu/context-menu-trigger.directive'; +export * from './lib/components/file-browser/file-browser.component'; +export * from './lib/components/graph-editor/graph-editor.component'; diff --git a/libs/blender-ui/src/lib/components/file-browser/file-browser.component.html b/libs/blender-ui/src/lib/components/file-browser/file-browser.component.html new file mode 100644 index 0000000..ddad806 --- /dev/null +++ b/libs/blender-ui/src/lib/components/file-browser/file-browser.component.html @@ -0,0 +1,148 @@ +
+ +
+
+ folder + expand_more +
+
+ + +
+
+ + + + + +
+
+ search + +
+
+ + +
+ + + + +
+ + +
+ + +
+
+ + +
+ +
+
+ Name arrow_drop_down +
+
Date Modified
+
Size
+
+ + +
+ +
+
+ folder + adb-fastboot +
+
14 Aug 2025 21:00
+
+
+ +
+
+ folder + arduino +
+
04 Jun 2025 22:16
+
+
+ +
+
+ folder + bootloader +
+
06 Sep 2025 14:51
+
+
+ +
+
+ folder + chrome +
+
06 Sep 2025 15:15
+
+
+ +
+
+ folder + CLionProjects +
+
06 Sep 2025 12:16
+
+
+ +
+
+ folder + Desktop +
+
04 Jan 2026 15:37
+
+
+
+
+ folder + Documents +
+
17 Feb 2026 10:35
+
+
+
+
+ folder + Downloads +
+
20 Feb 2026 19:16
+
+
+
+
+
diff --git a/libs/blender-ui/src/lib/components/file-browser/file-browser.component.scss b/libs/blender-ui/src/lib/components/file-browser/file-browser.component.scss new file mode 100644 index 0000000..bae1f8e --- /dev/null +++ b/libs/blender-ui/src/lib/components/file-browser/file-browser.component.scss @@ -0,0 +1,301 @@ +:host { + display: block; + height: 100%; + width: 100%; + font-family: 'Inter', sans-serif; + color: var(--bui-text-color); + background-color: var(--bui-bg-dark); +} + +.file-browser-container { + display: flex; + flex-direction: column; + height: 100%; + border: 1px solid var(--bui-border-dark); + background-color: var(--bui-panel-bg); + border-radius: var(--bui-border-radius); + overflow: hidden; +} + +.header-bar { + display: flex; + align-items: center; + height: 28px; + padding: 0 8px; + background-color: var(--bui-panel-header); + border-bottom: 1px solid var(--bui-border-dark); + font-size: 12px; + user-select: none; + + .header-left { + display: flex; + align-items: center; + margin-right: 16px; + color: var(--bui-text-muted); + + .icon-folder { font-size: 16px; } + .icon-expand { font-size: 10px; margin-left: -2px; } + } + + .header-actions { + display: flex; + gap: 16px; + + .header-btn { + background: none; + border: none; + color: inherit; + padding: 2px 6px; + border-radius: 2px; + cursor: pointer; + font-size: inherit; + + &:hover { + background-color: rgba(255, 255, 255, 0.1); + color: white; + } + } + } +} + +.navigation-bar { + display: flex; + align-items: center; + height: 36px; + padding: 4px 8px; + background-color: var(--bui-panel-bg); + gap: 6px; + + .nav-controls { + display: flex; + gap: 2px; + } + + .nav-btn { + width: 28px; + height: 24px; + display: flex; + align-items: center; + justify-content: center; + background-color: var(--bui-border-dark); // Using border color as button bg approximation + color: var(--bui-text-color); + border: none; + cursor: pointer; + + &:hover:not(.disabled) { + background-color: #4d4d4d; // slightly lighter + } + + &.disabled { + cursor: not-allowed; + opacity: 0.5; + } + + &.rounded-left { border-top-left-radius: 2px; border-bottom-left-radius: 2px; } + &.rounded-right { border-top-right-radius: 2px; border-bottom-right-radius: 2px; } + + .material-icons-round { font-size: 16px; } + } + + .path-input-container { + flex-grow: 1; + + .path-input { + width: 100%; + height: 24px; + background-color: var(--bui-input-bg); + border: 1px solid var(--bui-border-dark); + border-radius: 2px; + padding: 0 8px; + font-size: 12px; + color: var(--bui-input-text); + outline: none; + + &:focus { + border-color: var(--bui-primary); + } + } + } +} + +.toolbar { + display: flex; + align-items: center; + height: 36px; + padding: 0 8px 4px 8px; + background-color: var(--bui-panel-bg); + border-bottom: 1px solid var(--bui-border-dark); + gap: 8px; + + .search-container { + position: relative; + flex-grow: 1; + max-width: 670px; + + .search-icon { + position: absolute; + left: 6px; + top: 50%; + transform: translateY(-50%); + font-size: 16px; + color: var(--bui-text-muted); + } + + .search-input { + width: 100%; + height: 24px; + padding-left: 28px; + background-color: var(--bui-input-bg); + border: 1px solid var(--bui-border-dark); + border-radius: 2px; + font-size: 12px; + color: var(--bui-input-text); + outline: none; + + &:focus { + border-color: var(--bui-primary); + } + } + } + + .spacer { flex-grow: 1; } + + .view-mode-group, .filter-group { + display: flex; + height: 24px; + border: 1px solid var(--bui-border-dark); + border-radius: 2px; + overflow: hidden; + + button { + background-color: var(--bui-border-dark); + border: none; + color: var(--bui-text-muted); + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + padding: 0 8px; + + &:hover { + background-color: #4d4d4d; + } + + &.active { + background-color: var(--bui-primary); + color: white; + } + + &.dropdown { + padding: 0 6px; + border-left: 1px solid rgba(0,0,0,0.2); + } + + .material-icons-round { font-size: 14px; } + } + } +} + +.file-list-area { + flex-grow: 1; + display: flex; + flex-direction: column; + background-color: var(--bui-bg-dark); // Using bg-dark for list background + overflow: hidden; + + .list-header { + display: flex; + align-items: center; + padding: 4px 12px; + font-size: 12px; + font-weight: 600; + color: var(--bui-text-muted); + background-color: var(--bui-panel-header); // Assuming slightly lighter for header + border-bottom: 1px solid var(--bui-border-dark); + user-select: none; + + .col-name { + flex-grow: 1; + display: flex; + align-items: center; + cursor: pointer; + &:hover { color: var(--bui-text-color); } + .sort-icon { font-size: 10px; margin-left: 4px; opacity: 0.5; } + } + + .col-date { + width: 144px; + padding-left: 16px; + border-left: 1px solid var(--bui-border-dark); + cursor: pointer; + &:hover { color: var(--bui-text-color); } + } + + .col-size { + width: 80px; + padding-left: 16px; + border-left: 1px solid var(--bui-border-dark); + cursor: pointer; + &:hover { color: var(--bui-text-color); } + } + } + + .list-content { + flex-grow: 1; + overflow-y: auto; + padding: 4px; + + .file-row { + display: flex; + align-items: center; + padding: 2px 8px; + font-size: 13px; // slightly bigger than header + color: var(--bui-text-color); + border-radius: 2px; + cursor: pointer; + margin-bottom: 1px; + + &:hover { + background-color: rgba(255, 255, 255, 0.05); + } + + &.active { + background-color: #383838; // Or primary with opacity? Design shows darker grey + } + + .cell-name { + flex-grow: 1; + display: flex; + align-items: center; + min-width: 0; + + .folder-icon { + color: var(--bui-folder-icon); + font-size: 16px; + margin-right: 8px; + } + + .filename { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + } + + .cell-date { + width: 144px; + font-size: 12px; + color: var(--bui-text-muted); + white-space: nowrap; + } + + .cell-size { + width: 80px; + text-align: right; + padding-right: 8px; + font-size: 12px; + color: var(--bui-text-muted); + } + } + } +} diff --git a/libs/blender-ui/src/lib/components/file-browser/file-browser.component.ts b/libs/blender-ui/src/lib/components/file-browser/file-browser.component.ts new file mode 100644 index 0000000..6a149c5 --- /dev/null +++ b/libs/blender-ui/src/lib/components/file-browser/file-browser.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'bui-file-browser', + standalone: true, + imports: [CommonModule], + templateUrl: './file-browser.component.html', + styleUrl: './file-browser.component.scss', +}) +export class FileBrowserComponent { + // Basic data for demonstration if needed, but the template will be static for now as per design reference. +} diff --git a/libs/blender-ui/src/lib/components/graph-editor/graph-editor.component.html b/libs/blender-ui/src/lib/components/graph-editor/graph-editor.component.html new file mode 100644 index 0000000..5f76d41 --- /dev/null +++ b/libs/blender-ui/src/lib/components/graph-editor/graph-editor.component.html @@ -0,0 +1,302 @@ +
+ +
+
+ + +
+
+
+ + +
+
+ +
+ + + + +
+ +
+
+ 0 + 12 + 24 + 36 + 48 + 60 + 72 + 84 + 96 + 108 + 120 + 132 + 138 + 144 + 156 + 168 + 180 + 192 + 204 + 216 + 228 + 240 +
+
+ +
+
+
+
+
+
+
+
+
+ + +
+
+ + +
+ 0 +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+ + + +
+
+
diff --git a/libs/blender-ui/src/lib/components/graph-editor/graph-editor.component.scss b/libs/blender-ui/src/lib/components/graph-editor/graph-editor.component.scss new file mode 100644 index 0000000..cd7af1d --- /dev/null +++ b/libs/blender-ui/src/lib/components/graph-editor/graph-editor.component.scss @@ -0,0 +1,434 @@ +:host { + display: block; + height: 100%; + width: 100%; + font-family: 'Inter', sans-serif; + color: var(--bui-text-color); + background-color: var(--bui-bg-dark); +} + +.graph-editor-container { + display: flex; + flex-direction: column; + height: 100%; + background-color: var(--bui-bg-dark); + border: 1px solid var(--bui-border-dark); +} + +.editor-header { + display: flex; + align-items: center; + height: 28px; + padding: 0 4px; + background-color: var(--bui-panel-header); + border-bottom: 1px solid var(--bui-border-dark); + font-size: 12px; + user-select: none; + + .header-left, .header-right { + display: flex; + align-items: center; + gap: 4px; + } + + .header-spacer { flex-grow: 1; } + + .icon-btn, .tool-btn { + background: none; + border: none; + color: var(--bui-text-muted); + border-radius: 2px; + padding: 2px 4px; + cursor: pointer; + display: flex; + align-items: center; + gap: 4px; + + &:hover { + background-color: rgba(255, 255, 255, 0.1); + color: var(--bui-text-color); + } + + &.primary-text { color: var(--bui-primary); } + + .material-icons-round { font-size: 16px; } + .sm-icon { font-size: 12px; } + } + + .menu-bar { + display: flex; + margin-left: 8px; + + .menu-btn { + background: none; + border: none; + color: var(--bui-text-color); + padding: 2px 8px; + border-radius: 2px; + cursor: pointer; + font-size: 12px; + + &:hover { + background-color: rgba(255, 255, 255, 0.1); + } + } + } + + .tool-btn { + background-color: rgba(255, 255, 255, 0.05); + border: 1px solid var(--bui-border-dark); + } +} + +.editor-body { + flex-grow: 1; + display: flex; + overflow: hidden; + + .channels-sidebar { + width: 250px; + display: flex; + flex-direction: column; + background-color: var(--bui-panel-bg); + border-right: 1px solid var(--bui-border-dark); + font-size: 12px; + + .sidebar-search { + padding: 4px; + border-bottom: 1px solid var(--bui-border-dark); + + .search-box { + display: flex; + align-items: center; + background-color: rgba(0, 0, 0, 0.2); + border-radius: 2px; + padding: 2px 4px; + + .search-icon { font-size: 14px; opacity: 0.5; margin-right: 4px; } + .filter-icon { font-size: 14px; opacity: 0.5; margin-left: 4px; cursor: pointer; } + + .search-input { + background: none; + border: none; + outline: none; + width: 100%; + color: var(--bui-text-color); + font-size: 12px; + padding: 0; + &::placeholder { color: var(--bui-text-muted); } + } + } + } + + .channels-list { + flex-grow: 1; + overflow-y: auto; + padding-top: 2px; + } + + .channel-row { + display: flex; + align-items: center; + padding: 2px 4px; + cursor: pointer; + user-select: none; + + &:hover { + background-color: rgba(255, 255, 255, 0.05); + .channel-icons.hidden-group { display: flex; opacity: 0.5; } + .channel-icons.opacity-80 { opacity: 1; } + } + + &.selected { + background-color: rgba(var(--bui-primary), 0.2); // Needs proper rgba handling or variable + // Fallback since variable is hex: + background-color: #4772b333; + } + + &.active-channel { + color: var(--bui-channel-yellow); // Or orange from design + } + + &.dimmed-bg { background-color: rgba(255, 255, 255, 0.05); } + + .expand-icon { font-size: 12px; margin-right: 4px; opacity: 0.7; } + .type-icon { font-size: 14px; margin-right: 6px; } + .type-icon.orange { color: var(--bui-channel-yellow); } // Using yellow for orange + .type-icon.yellow { color: #fce94f; } + .type-icon.dimmed { opacity: 0.7; } + + .channel-name { + flex-grow: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .channel-icons { + display: flex; + gap: 4px; + opacity: 0.5; + &.hidden-group { display: none; } + &.fade-in-group { opacity: 0.4; &:hover { opacity: 1; } } + + .sm-icon { font-size: 12px; } + } + + .visibility-eye { + width: 12px; + height: 12px; + border-radius: 2px; + margin-right: 8px; + display: flex; + align-items: center; + justify-content: center; + + .eye-icon { font-size: 8px; color: rgba(0,0,0,0.5); } + + &.bg-red { background-color: var(--bui-channel-red); } + &.bg-green { background-color: var(--bui-channel-green); } + &.bg-blue { background-color: var(--bui-channel-blue); } + } + + &.indent-1 { padding-left: 16px; } + &.indent-2 { padding-left: 24px; } + &.indent-3 { padding-left: 36px; } + } + + .sidebar-footer { + height: 24px; + border-top: 1px solid var(--bui-border-dark); + background-color: var(--bui-panel-header); + display: flex; + align-items: center; + padding: 0 8px; + font-size: 10px; + + .sm-icon { font-size: 12px; margin-right: 6px; opacity: 0.5; } + .footer-text { opacity: 0.7; } + } + } + + .graph-viewport { + flex-grow: 1; + display: flex; + flex-direction: column; + position: relative; + background-color: var(--bui-bg-dark); + + .time-ruler { + height: 24px; + background-color: var(--bui-panel-header); + border-bottom: 1px solid var(--bui-border-dark); + position: relative; + overflow: hidden; + + .ruler-ticks { + display: flex; + justify-content: space-between; + padding: 0 16px; + font-family: monospace; + font-size: 10px; + color: var(--bui-text-muted); + align-items: flex-end; + height: 100%; + padding-bottom: 2px; + + .current-frame { + background-color: var(--bui-primary); + color: white; + padding: 0 4px; + border-top-left-radius: 2px; + border-top-right-radius: 2px; + } + } + + .ruler-marks { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 6px; + display: flex; + justify-content: space-between; + padding: 0 16px; + pointer-events: none; + + .mark { + border-left: 1px solid var(--bui-border-dark); + height: 100%; + &.empty { border-color: transparent; width: 16px; } + } + } + } + + .graph-canvas { + flex-grow: 1; + position: relative; + overflow: hidden; + + // Grid Background + background-image: + linear-gradient(to right, var(--bui-grid-line-strong) 1px, transparent 1px), + linear-gradient(to bottom, var(--bui-grid-line-strong) 1px, transparent 1px); + background-size: 240px 100%, 100% 200px; + + .graph-grid { + position: absolute; + inset: 0; + opacity: 0.3; + pointer-events: none; + background-image: + linear-gradient(to right, var(--bui-grid-line) 1px, transparent 1px), + linear-gradient(to bottom, var(--bui-grid-line) 1px, transparent 1px); + background-size: 60px 100%, 100% 40px; + } + + .zero-line { + position: absolute; + top: 60%; + left: 0; + right: 0; + height: 1px; + background-color: #a855f7; // purple-500 + opacity: 0.6; + + .zero-label { + position: absolute; + top: -10px; + left: 0; + font-size: 10px; + color: white; + background-color: rgba(0,0,0,0.5); + padding: 0 4px; + border-radius: 0 2px 2px 0; + } + } + + .playhead { + position: absolute; + top: 0; + bottom: 0; + left: 58%; + width: 1px; + background-color: var(--bui-primary); + z-index: 20; + box-shadow: 0 0 10px rgba(71, 114, 179, 0.5); + } + + .graph-svg { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + pointer-events: none; + + .bezier-curve { + fill: none; + stroke-width: 2; + vector-effect: non-scaling-stroke; + + &.green { stroke: var(--bui-channel-green); opacity: 0.6; } + &.red { stroke: var(--bui-channel-red); stroke-width: 3; } + &.blue { stroke: var(--bui-channel-blue); } + &.dashed { stroke: #666; stroke-dasharray: 4; } + } + + .handle-line { + stroke: #a0a0a0; + stroke-width: 1; + } + + .keyframe { + fill: #1d1d1d; + stroke: #e0e0e0; + stroke-width: 1.5; + r: 3; + + &.keyframe-selected { + fill: #e0e0e0; + stroke: #ffae00; + r: 4; + } + + &.black-fill { fill: #000; stroke: #fff; } + } + + .handle-control { + fill: #000; + stroke: #a0a0a0; + stroke-width: 1; + r: 2; + } + } + + .scrollbar-h { + position: absolute; + bottom: 4px; + left: 16px; + right: 16px; + height: 12px; + background-color: rgba(0,0,0,0.2); + border-radius: 6px; + padding: 0 4px; + display: flex; + align-items: center; + + .thumb { + height: 6px; + width: 128px; + background-color: #888; + border-radius: 3px; + cursor: pointer; + &:hover { background-color: #aaa; } + } + } + + .scrollbar-v { + position: absolute; + top: 16px; + bottom: 16px; + right: 4px; + width: 12px; + background-color: rgba(0,0,0,0.2); + border-radius: 6px; + display: flex; + justify-content: center; + padding: 4px 0; + + .thumb { + width: 6px; + height: 33%; + background-color: #888; + border-radius: 3px; + cursor: pointer; + margin-top: 48px; // Offset + &:hover { background-color: #aaa; } + } + } + } + + .graph-footer { + height: 20px; + background-color: var(--bui-panel-header); + border-top: 1px solid var(--bui-border-dark); + display: flex; + align-items: center; + padding: 0 8px; + font-size: 10px; + gap: 16px; + + .info-group { + display: flex; + align-items: center; + gap: 4px; + + .label { opacity: 0.5; } + &.dimmed { opacity: 0.5; } + .sm-icon { font-size: 10px; } + } + + .spacer { flex-grow: 1; } + } + } +} diff --git a/libs/blender-ui/src/lib/components/graph-editor/graph-editor.component.ts b/libs/blender-ui/src/lib/components/graph-editor/graph-editor.component.ts new file mode 100644 index 0000000..51dba12 --- /dev/null +++ b/libs/blender-ui/src/lib/components/graph-editor/graph-editor.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'bui-graph-editor', + standalone: true, + imports: [CommonModule], + templateUrl: './graph-editor.component.html', + styleUrl: './graph-editor.component.scss', +}) +export class GraphEditorComponent { + // Placeholder logic. In a real app, this would handle keyframe data, selection, etc. +} diff --git a/libs/blender-ui/src/lib/services/themes.ts b/libs/blender-ui/src/lib/services/themes.ts index 5b7b974..54fa6f2 100644 --- a/libs/blender-ui/src/lib/services/themes.ts +++ b/libs/blender-ui/src/lib/services/themes.ts @@ -30,6 +30,14 @@ export const blenderDark: Theme = { '--bui-menu-hover': '#4772b3', '--bui-menu-text-muted': '#8f8f8f', '--bui-menu-shadow': '0 4px 6px -1px rgba(0, 0, 0, 0.5), 0 2px 4px -1px rgba(0, 0, 0, 0.3)', + '--bui-folder-icon': '#dcb67a', + '--bui-channel-red': '#e04e4e', + '--bui-channel-green': '#7ec928', + '--bui-channel-blue': '#4e8ce0', + '--bui-channel-yellow': '#d9bc26', + '--bui-grid-line': '#2a2a2a', + '--bui-grid-line-strong': '#353535', + '--bui-text-muted': '#9ca3af', }, }; @@ -58,5 +66,13 @@ export const blenderLight: Theme = { '--bui-menu-hover': '#4772b3', '--bui-menu-text-muted': '#8f8f8f', '--bui-menu-shadow': '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)', + '--bui-folder-icon': '#dcb67a', + '--bui-channel-red': '#e04e4e', + '--bui-channel-green': '#7ec928', + '--bui-channel-blue': '#4e8ce0', + '--bui-channel-yellow': '#d9bc26', + '--bui-grid-line': '#d1d1d1', + '--bui-grid-line-strong': '#b0b0b0', + '--bui-text-muted': '#666666', }, };