From 2a7028b457ec1fe5c719d1e8e86aa11514530fc3 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 22 Feb 2026 23:57:05 +0000 Subject: [PATCH] feat: Add Blender-style Modifier Properties Panel - Implemented `ModifierPanelComponent` matching the design reference. - Created reusable components: `BuiCheckbox`, `BuiNumberInput`, `BuiSelect`, `BuiSection`. - Updated theme service with new variables for the panel. - Integrated the panel into the demo app. - Verified with Playwright tests. Co-authored-by: vis-iks <225935531+vis-iks@users.noreply.github.com> --- apps/demo-app/src/app/app.html | 12 +- apps/demo-app/src/app/app.scss | 36 +-- apps/demo-app/src/app/app.spec.ts | 18 +- apps/demo-app/src/app/app.ts | 4 +- demo-app.log | 28 +- libs/blender-ui/src/index.ts | 5 + .../checkbox/checkbox.component.html | 4 + .../checkbox/checkbox.component.scss | 58 ++++ .../components/checkbox/checkbox.component.ts | 21 ++ .../modifier-panel.component.html | 148 +++++++++ .../modifier-panel.component.scss | 289 ++++++++++++++++++ .../modifier-panel.component.ts | 50 +++ .../number-input/number-input.component.html | 16 + .../number-input/number-input.component.scss | 91 ++++++ .../number-input/number-input.component.ts | 31 ++ .../components/section/section.component.html | 7 + .../components/section/section.component.scss | 44 +++ .../components/section/section.component.ts | 18 ++ .../components/select/select.component.html | 6 + .../components/select/select.component.scss | 39 +++ .../lib/components/select/select.component.ts | 29 ++ libs/blender-ui/src/lib/services/themes.ts | 34 ++- .../blender-ui/src/lib/styles/_variables.scss | 4 + verification/modifier_panel.png | Bin 0 -> 32059 bytes verification/modifier_panel_expanded.png | Bin 0 -> 44485 bytes verification/verify_modifier_panel.py | 24 ++ 26 files changed, 965 insertions(+), 51 deletions(-) create mode 100644 libs/blender-ui/src/lib/components/checkbox/checkbox.component.html create mode 100644 libs/blender-ui/src/lib/components/checkbox/checkbox.component.scss create mode 100644 libs/blender-ui/src/lib/components/checkbox/checkbox.component.ts create mode 100644 libs/blender-ui/src/lib/components/modifier-panel/modifier-panel.component.html create mode 100644 libs/blender-ui/src/lib/components/modifier-panel/modifier-panel.component.scss create mode 100644 libs/blender-ui/src/lib/components/modifier-panel/modifier-panel.component.ts create mode 100644 libs/blender-ui/src/lib/components/number-input/number-input.component.html create mode 100644 libs/blender-ui/src/lib/components/number-input/number-input.component.scss create mode 100644 libs/blender-ui/src/lib/components/number-input/number-input.component.ts create mode 100644 libs/blender-ui/src/lib/components/section/section.component.html create mode 100644 libs/blender-ui/src/lib/components/section/section.component.scss create mode 100644 libs/blender-ui/src/lib/components/section/section.component.ts create mode 100644 libs/blender-ui/src/lib/components/select/select.component.html create mode 100644 libs/blender-ui/src/lib/components/select/select.component.scss create mode 100644 libs/blender-ui/src/lib/components/select/select.component.ts create mode 100644 verification/modifier_panel.png create mode 100644 verification/modifier_panel_expanded.png create mode 100644 verification/verify_modifier_panel.py diff --git a/apps/demo-app/src/app/app.html b/apps/demo-app/src/app/app.html index b459336..053bd17 100644 --- a/apps/demo-app/src/app/app.html +++ b/apps/demo-app/src/app/app.html @@ -1,9 +1,5 @@ -
-

Blender UI Demo

-

Current Theme: {{ activeTheme().name }}

- + -
This is a panel.
- - -
+ diff --git a/apps/demo-app/src/app/app.scss b/apps/demo-app/src/app/app.scss index 9404d1d..00c1b00 100644 --- a/apps/demo-app/src/app/app.scss +++ b/apps/demo-app/src/app/app.scss @@ -4,29 +4,31 @@ display: block; width: 100vw; height: 100vh; - background-color: bui.$bui-bg-dark; - color: bui.$bui-text-color; - padding: 20px; + margin: 0; + padding: 0; + overflow: hidden; font-family: sans-serif; } -.panel { - background-color: bui.$bui-panel-bg; - padding: 20px; - border-radius: bui.$bui-border-radius; - margin-top: 20px; +.theme-toggle { + position: fixed; + bottom: 20px; + right: 20px; + width: 40px; + height: 40px; + border-radius: 50%; + background-color: bui.$bui-bg-light; + color: bui.$bui-text-color; border: 1px solid bui.$bui-border-dark; -} - -button { - padding: 10px 20px; - background-color: bui.$bui-primary; - color: white; - border: none; - border-radius: bui.$bui-border-radius; + display: flex; + align-items: center; + justify-content: center; cursor: pointer; + z-index: 1000; + box-shadow: 0 2px 10px rgba(0,0,0,0.2); + padding: 0; &:hover { - opacity: 0.9; + background-color: bui.$bui-panel-bg; } } diff --git a/apps/demo-app/src/app/app.spec.ts b/apps/demo-app/src/app/app.spec.ts index 4270b7b..2724306 100644 --- a/apps/demo-app/src/app/app.spec.ts +++ b/apps/demo-app/src/app/app.spec.ts @@ -1,20 +1,24 @@ import { TestBed } from '@angular/core/testing'; import { App } from './app'; -import { NxWelcome } from './nx-welcome'; describe('App', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [App, NxWelcome], + imports: [App], }).compileComponents(); }); - it('should render title', async () => { + it('should render modifier panel', async () => { const fixture = TestBed.createComponent(App); - await fixture.whenStable(); + fixture.detectChanges(); const compiled = fixture.nativeElement as HTMLElement; - expect(compiled.querySelector('h1')?.textContent).toContain( - 'Welcome demo-app', - ); + expect(compiled.querySelector('bui-modifier-panel')).toBeTruthy(); + }); + + it('should render theme toggle', async () => { + const fixture = TestBed.createComponent(App); + fixture.detectChanges(); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('.theme-toggle')).toBeTruthy(); }); }); diff --git a/apps/demo-app/src/app/app.ts b/apps/demo-app/src/app/app.ts index 1275ad7..3e15bff 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 } from '@blender-ui/core'; +import { BuiThemeService, ModifierPanelComponent } from '@blender-ui/core'; @Component({ - imports: [RouterModule], + imports: [RouterModule, ModifierPanelComponent], selector: 'app-root', templateUrl: './app.html', styleUrl: './app.scss', diff --git a/demo-app.log b/demo-app.log index df2e0b7..fae9495 100644 --- a/demo-app.log +++ b/demo-app.log @@ -1,14 +1,34 @@ -> nx run demo-app:serve:development --port=4200 +> nx run demo-app:serve:development โฏ Building... โœ” Building... Initial chunk files | Names  |  Raw size -main.js  | main  |  7.80 kB |  +main.js  | main  |  73.04 kB |  styles.css  | styles  | 110 bytes |  -   | Initial total |  7.91 kB -Application bundle generation complete. [3.360 seconds] - 2026-02-22T22:28:04.671Z +   | Initial total |  73.15 kB +Application bundle generation complete. [4.012 seconds] - 2026-02-22T23:47:13.515Z  Watch mode enabled. Watching for file changes... NOTE: Raw file sizes do not reflect development server per-request transformations. โžœ Local: http://localhost:4200/ +โฏ Changes detected. Rebuilding... +โœ” Changes detected. Rebuilding... +Initial chunk files | Names | Raw size +main.js  | main  | 73.11 kB |  +Application bundle generation complete. [0.764 seconds] - 2026-02-22T23:50:56.104Z + +Page reload sent to client(s). +โฏ Changes detected. Rebuilding... +โœ” Changes detected. Rebuilding... + +No output file changes. +Application bundle generation complete. [2.666 seconds] - 2026-02-22T23:51:14.860Z + +โฏ Changes detected. Rebuilding... +โœ” Changes detected. Rebuilding... +Initial chunk files | Names | Raw size +main.js  | main  | 73.11 kB |  +Application bundle generation complete. [0.797 seconds] - 2026-02-22T23:51:31.420Z + +Component update sent to client(s). diff --git a/libs/blender-ui/src/index.ts b/libs/blender-ui/src/index.ts index afc596f..1551df5 100644 --- a/libs/blender-ui/src/index.ts +++ b/libs/blender-ui/src/index.ts @@ -1,3 +1,8 @@ export * from './lib/core/core'; export * from './lib/services/theme.service'; export * from './lib/services/themes'; +export * from './lib/components/checkbox/checkbox.component'; +export * from './lib/components/number-input/number-input.component'; +export * from './lib/components/select/select.component'; +export * from './lib/components/section/section.component'; +export * from './lib/components/modifier-panel/modifier-panel.component'; diff --git a/libs/blender-ui/src/lib/components/checkbox/checkbox.component.html b/libs/blender-ui/src/lib/components/checkbox/checkbox.component.html new file mode 100644 index 0000000..471b4d2 --- /dev/null +++ b/libs/blender-ui/src/lib/components/checkbox/checkbox.component.html @@ -0,0 +1,4 @@ +
+
+ {{ label() }} +
diff --git a/libs/blender-ui/src/lib/components/checkbox/checkbox.component.scss b/libs/blender-ui/src/lib/components/checkbox/checkbox.component.scss new file mode 100644 index 0000000..e1dbd44 --- /dev/null +++ b/libs/blender-ui/src/lib/components/checkbox/checkbox.component.scss @@ -0,0 +1,58 @@ +@use '../../styles/variables' as *; + +:host { + display: inline-block; +} + +.bui-checkbox-container { + display: flex; + align-items: center; + cursor: pointer; + user-select: none; + + &.disabled { + cursor: not-allowed; + opacity: 0.5; + } +} + +.bui-checkbox { + appearance: none; + background-color: transparent; + margin: 0; + width: 1rem; + height: 1rem; + border: 1px solid $bui-text-color; // Fallback or distinct color + border-radius: 2px; + display: grid; + place-content: center; + margin-right: 0.5rem; + transition: all 0.2s ease; + + // The checkmark + &::before { + content: ""; + width: 0.65em; + height: 0.65em; + transform: scale(0); + transition: 120ms transform ease-in-out; + box-shadow: inset 1em 1em white; + transform-origin: center; + clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%); + } + + &.checked { + background-color: $bui-primary; + border-color: $bui-primary; + + &::before { + transform: scale(1); + } + } +} + +.label { + font-family: var(--bui-font-display, "Inter", "system-ui", "sans-serif"); + font-size: 0.75rem; // 12px + color: $bui-text-color; +} diff --git a/libs/blender-ui/src/lib/components/checkbox/checkbox.component.ts b/libs/blender-ui/src/lib/components/checkbox/checkbox.component.ts new file mode 100644 index 0000000..54d4061 --- /dev/null +++ b/libs/blender-ui/src/lib/components/checkbox/checkbox.component.ts @@ -0,0 +1,21 @@ +import { Component, input, output } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'bui-checkbox', + standalone: true, + imports: [CommonModule], + templateUrl: './checkbox.component.html', + styleUrl: './checkbox.component.scss', +}) +export class BuiCheckboxComponent { + checked = input(false); + label = input(''); + disabled = input(false); + checkedChange = output(); + + toggle() { + if (this.disabled()) return; + this.checkedChange.emit(!this.checked()); + } +} diff --git a/libs/blender-ui/src/lib/components/modifier-panel/modifier-panel.component.html b/libs/blender-ui/src/lib/components/modifier-panel/modifier-panel.component.html new file mode 100644 index 0000000..4a3d87e --- /dev/null +++ b/libs/blender-ui/src/lib/components/modifier-panel/modifier-panel.component.html @@ -0,0 +1,148 @@ +
+ +
+
๐Ÿ”ง
+
+
๐Ÿ“ท
+
๐Ÿ–จ๏ธ
+
๐Ÿ“‘
+
โ˜€
+
๐ŸŒ
+
+
๐Ÿ”ง
+
๐Ÿ“
+
๐Ÿงช
+
๐Ÿ”—
+
๐Ÿ”บ
+
๐Ÿ”ด
+
๐Ÿ
+
+ + +
+ +
+ + โ€บ + +
+
๐Ÿ“Œ
+
+ + +
+ + + +
+ +
+ โ–ผ + ๐ŸŒ€ + Subdivision + +
+ + + + +
+ +
+ + +
+ + +
+ +
+
+ + +
+
+ + +
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+ + + +
+
+ +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+ + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ +
+ + + + +
+
diff --git a/libs/blender-ui/src/lib/components/modifier-panel/modifier-panel.component.scss b/libs/blender-ui/src/lib/components/modifier-panel/modifier-panel.component.scss new file mode 100644 index 0000000..b7b6d4b --- /dev/null +++ b/libs/blender-ui/src/lib/components/modifier-panel/modifier-panel.component.scss @@ -0,0 +1,289 @@ +@use '../../styles/variables' as *; + +:host { + display: block; + height: 100vh; + width: 100vw; + overflow: hidden; + background-color: $bui-bg-dark; + color: $bui-text-color; + font-family: var(--bui-font-display, "Inter", "system-ui", "sans-serif"); + font-size: 12px; +} + +.bui-layout { + display: flex; + height: 100%; +} + +.bui-sidebar { + width: 2.5rem; // w-10 ~ 40px + background-color: $bui-panel-bg; // panel-light / dark + border-right: 1px solid $bui-border-dark; + display: flex; + flex-direction: column; + align-items: center; + padding: 0.5rem 0; + gap: 0.25rem; + + .icon-button { + width: 2rem; + height: 2rem; + display: flex; + align-items: center; + justify-content: center; + border-radius: $bui-border-radius; + cursor: pointer; + opacity: 0.7; + + &:hover { + background-color: rgba(255,255,255,0.1); + opacity: 1; + } + + &.active { + background-color: $bui-highlight; // highlight-light/dark + color: #fff; + opacity: 1; + } + } + + .separator { + width: 100%; + height: 1px; + background-color: $bui-border-dark; + margin: 0.25rem 0; + } +} + +.bui-main { + flex: 1; + display: flex; + flex-direction: column; + background-color: $bui-panel-bg; +} + +.bui-panel-top { + height: 2rem; + display: flex; + align-items: center; + padding: 0 0.5rem; + border-bottom: 1px solid $bui-border-dark; + background-color: $bui-panel-bg; + + .breadcrumb-item { + display: flex; + align-items: center; + gap: 0.25rem; + cursor: pointer; + padding: 0.125rem 0.25rem; + border-radius: 2px; + + &:hover { + background-color: rgba(255,255,255,0.1); + } + } + + .separator { + margin: 0 0.5rem; + color: #888; + } + + .spacer { + flex: 1; + } +} + +.bui-panel-content { + flex: 1; + padding: 0.5rem; + overflow-y: auto; +} + +.add-modifier-btn { + width: 100%; + display: flex; + align-items: center; + justify-content: center; + padding: 0.25rem 0.75rem; + margin-bottom: 0.75rem; + background-color: $bui-bg-light; // white / #3d3d3d + border: 1px solid $bui-border-dark; + border-radius: $bui-border-radius; + color: $bui-text-color; + cursor: pointer; + + &:hover { + background-color: rgba(255,255,255,0.05); + } +} + +.bui-modifier-card { + border: 1px solid $bui-primary; + border-radius: $bui-border-radius; + background-color: $bui-card-bg; + overflow: hidden; + box-shadow: 0 1px 2px rgba(0,0,0,0.1); +} + +.bui-modifier-header { + height: 1.75rem; + display: flex; + align-items: center; + padding: 0 0.5rem; + background-color: $bui-panel-header; // blue-50 / #343434 + border-bottom: 1px solid $bui-border-dark; + gap: 0.5rem; + user-select: none; + + .expand-icon { + font-size: 0.6rem; + color: #888; + cursor: pointer; + } + + .modifier-icon { + color: $bui-highlight; // blue-400 + } + + .modifier-title { + flex: 1; + font-weight: 600; + } + + .modifier-toggles { + display: flex; + gap: 2px; + + .toggle-btn { + padding: 0.125rem; + border-radius: 2px; + cursor: pointer; + border: none; + background: transparent; + color: #888; + + &:hover { + background-color: rgba(255,255,255,0.1); + } + + &.active { + color: $bui-highlight; // blue-400 + } + } + } + + .separator-vertical { + height: 1rem; + width: 1px; + background-color: $bui-border-dark; + margin: 0 0.25rem; + } + + .close-btn, .drag-btn { + background: transparent; + border: none; + color: #888; + cursor: pointer; + + &:hover { + color: #fff; + } + } + + .close-btn:hover { + color: #ff5555; + } +} + +.bui-modifier-body { + padding: 0.5rem; + display: flex; + flex-direction: column; + gap: 0.375rem; // space-y-1.5 +} + +.type-toggle-row { + display: flex; + margin-bottom: 0.5rem; + + .toggle-group { + display: flex; + width: 100%; + border: 1px solid $bui-border-dark; + border-radius: 2px; + overflow: hidden; + + .toggle-option { + flex: 1; + padding: 0.25rem 0.5rem; + text-align: center; + background-color: $bui-bg-light; // white / #222 + color: $bui-text-color; + border: none; + border-right: 1px solid $bui-border-dark; + cursor: pointer; + + &:last-child { + border-right: none; + } + + &:hover { + background-color: rgba(255,255,255,0.05); + } + + &.active { + background-color: $bui-primary; // highlight-light / primary + color: #fff; + } + } + } +} + +.control-row { + display: grid; + grid-template-columns: 110px 1fr 10px; // Adjusted for dot + gap: 0.25rem; + align-items: center; + + label { + text-align: right; + padding-right: 0.5rem; + color: #888; // text-gray-600/400 + } + + .status-dot { + width: 0.5rem; + height: 0.5rem; + border-radius: 50%; + background-color: #555; // gray-600 + + &.hidden { + opacity: 0; + } + } + + &.checkbox-row { + .spacer-label { + // empty + } + } +} + +.bui-footer { + height: 1.5rem; + background-color: $bui-panel-bg; + border-top: 1px solid $bui-border-dark; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 0.5rem; + font-size: 10px; + color: #888; + + .footer-left, .footer-right { + display: flex; + gap: 0.75rem; + align-items: center; + } +} diff --git a/libs/blender-ui/src/lib/components/modifier-panel/modifier-panel.component.ts b/libs/blender-ui/src/lib/components/modifier-panel/modifier-panel.component.ts new file mode 100644 index 0000000..28f57f9 --- /dev/null +++ b/libs/blender-ui/src/lib/components/modifier-panel/modifier-panel.component.ts @@ -0,0 +1,50 @@ +import { Component, signal } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { BuiCheckboxComponent } from '../checkbox/checkbox.component'; +import { BuiNumberInputComponent } from '../number-input/number-input.component'; +import { BuiSelectComponent, SelectOption } from '../select/select.component'; +import { BuiSectionComponent } from '../section/section.component'; + +@Component({ + selector: 'bui-modifier-panel', + standalone: true, + imports: [ + CommonModule, + BuiCheckboxComponent, + BuiNumberInputComponent, + BuiSelectComponent, + BuiSectionComponent, + ], + templateUrl: './modifier-panel.component.html', + styleUrl: './modifier-panel.component.scss', +}) +export class ModifierPanelComponent { + // State for the inputs + levelsViewport = signal(1); + levelsRender = signal(2); + optimalDisplay = signal(true); + + // Advanced section + useLimitSurface = signal(true); + quality = signal(3); + uvSmooth = signal('Keep Boundaries'); + boundarySmooth = signal('All'); + useCreases = signal(true); + useCustomNormals = signal(false); + + // Options + uvSmoothOptions: SelectOption[] = [ + { label: 'Keep Boundaries', value: 'Keep Boundaries' }, + { label: 'None', value: 'None' }, + { label: 'Keep Corners', value: 'Keep Corners' }, + { label: 'Keep Corners, Junctions', value: 'Keep Corners, Junctions' }, + { label: 'Keep Corners, Junctions, Concave', value: 'Keep Corners, Junctions, Concave' }, + { label: 'Keep Boundaries, Junctions', value: 'Keep Boundaries, Junctions' }, + { label: 'All', value: 'All' }, + ]; + + boundarySmoothOptions: SelectOption[] = [ + { label: 'All', value: 'All' }, + { label: 'Keep Corners', value: 'Keep Corners' }, + ]; +} diff --git a/libs/blender-ui/src/lib/components/number-input/number-input.component.html b/libs/blender-ui/src/lib/components/number-input/number-input.component.html new file mode 100644 index 0000000..3769a9b --- /dev/null +++ b/libs/blender-ui/src/lib/components/number-input/number-input.component.html @@ -0,0 +1,16 @@ +
+
+ +
+ โ–ฒ + โ–ผ +
+
diff --git a/libs/blender-ui/src/lib/components/number-input/number-input.component.scss b/libs/blender-ui/src/lib/components/number-input/number-input.component.scss new file mode 100644 index 0000000..755258a --- /dev/null +++ b/libs/blender-ui/src/lib/components/number-input/number-input.component.scss @@ -0,0 +1,91 @@ +@use '../../styles/variables' as *; + +:host { + display: block; + width: 100%; +} + +.bui-number-input-container { + position: relative; + width: 100%; + height: 1.5rem; // ~24px + background-color: $bui-input-bg; + border: 1px solid $bui-border-dark; + border-radius: 2px; // rounded-sm + overflow: hidden; + + &:hover { + .progress-bar { + opacity: 0.5; // Slightly lighter on hover + } + + .bui-number-input { + color: #fff; // text-white + } + + .arrows { + opacity: 1; + } + } + + &:focus-within { + border-color: $bui-primary; + // ring-1 ring-primary + box-shadow: 0 0 0 1px $bui-primary; + } +} + +.progress-bar { + position: absolute; + left: 0; + top: 0; + bottom: 0; + background-color: rgba(255, 255, 255, 0.1); // gray-600/30 equivalent + pointer-events: none; + transition: width 0.1s ease; + z-index: 0; +} + +.bui-number-input { + width: 100%; + height: 100%; + background: transparent; + border: none; + color: $bui-text-color; + font-family: inherit; + font-size: 0.75rem; // xs + text-align: center; + position: relative; + z-index: 1; + padding: 0 0.5rem; + appearance: textfield; // remove spin buttons standard + + &:focus { + outline: none; + } + + &::-webkit-inner-spin-button, + &::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; + } +} + +.arrows { + position: absolute; + right: 2px; + top: 50%; + transform: translateY(-50%); + display: flex; + flex-direction: column; + opacity: 0; + transition: opacity 0.2s; + pointer-events: none; + z-index: 2; + + .arrow-up, .arrow-down { + font-size: 6px; + line-height: 6px; + color: #888; + } +} diff --git a/libs/blender-ui/src/lib/components/number-input/number-input.component.ts b/libs/blender-ui/src/lib/components/number-input/number-input.component.ts new file mode 100644 index 0000000..83636da --- /dev/null +++ b/libs/blender-ui/src/lib/components/number-input/number-input.component.ts @@ -0,0 +1,31 @@ +import { Component, computed, input, output } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +@Component({ + selector: 'bui-number-input', + standalone: true, + imports: [CommonModule, FormsModule], + templateUrl: './number-input.component.html', + styleUrl: './number-input.component.scss', +}) +export class BuiNumberInputComponent { + value = input(0); + min = input(0); + max = input(100); + step = input(1); + valueChange = output(); + + progressWidth = computed(() => { + const val = this.value(); + const min = this.min(); + const max = this.max(); + const percentage = ((val - min) / (max - min)) * 100; + return `${Math.min(100, Math.max(0, percentage))}%`; + }); + + onInput(event: Event) { + const val = (event.target as HTMLInputElement).valueAsNumber; + this.valueChange.emit(val); + } +} diff --git a/libs/blender-ui/src/lib/components/section/section.component.html b/libs/blender-ui/src/lib/components/section/section.component.html new file mode 100644 index 0000000..f1e5d62 --- /dev/null +++ b/libs/blender-ui/src/lib/components/section/section.component.html @@ -0,0 +1,7 @@ +
+ โ–ถ + +
+
+ +
diff --git a/libs/blender-ui/src/lib/components/section/section.component.scss b/libs/blender-ui/src/lib/components/section/section.component.scss new file mode 100644 index 0000000..45b9bbb --- /dev/null +++ b/libs/blender-ui/src/lib/components/section/section.component.scss @@ -0,0 +1,44 @@ +@use '../../styles/variables' as *; + +:host { + display: block; + padding-top: 0.5rem; // pt-2 +} + +.bui-section-header { + display: flex; + align-items: center; + cursor: pointer; + color: #888; // text-gray-400 + font-size: 0.75rem; // xs + user-select: none; + + &:hover { + color: $bui-text-color; // hover:text-gray-200 + } +} + +.arrow-icon { + margin-right: 0.25rem; + font-size: 0.6rem; + transition: transform 0.1s ease; + display: inline-block; + + &.expanded { + transform: rotate(90deg); + } +} + +.section-label { + font-weight: 500; +} + +.bui-section-content { + padding-left: 0.5rem; // pl-2 + margin-top: 0.25rem; // mt-1 + border-left: 1px solid rgba(255, 255, 255, 0.1); // border-white/10 + margin-left: 0.375rem; // ml-1.5 + display: flex; + flex-direction: column; + gap: 0.375rem; // space-y-1.5 +} diff --git a/libs/blender-ui/src/lib/components/section/section.component.ts b/libs/blender-ui/src/lib/components/section/section.component.ts new file mode 100644 index 0000000..4799543 --- /dev/null +++ b/libs/blender-ui/src/lib/components/section/section.component.ts @@ -0,0 +1,18 @@ +import { Component, input, signal } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'bui-section', + standalone: true, + imports: [CommonModule], + templateUrl: './section.component.html', + styleUrl: './section.component.scss', +}) +export class BuiSectionComponent { + label = input(''); + expanded = signal(false); + + toggle() { + this.expanded.update((v) => !v); + } +} diff --git a/libs/blender-ui/src/lib/components/select/select.component.html b/libs/blender-ui/src/lib/components/select/select.component.html new file mode 100644 index 0000000..7b02f06 --- /dev/null +++ b/libs/blender-ui/src/lib/components/select/select.component.html @@ -0,0 +1,6 @@ +
+ + โ–ผ +
diff --git a/libs/blender-ui/src/lib/components/select/select.component.scss b/libs/blender-ui/src/lib/components/select/select.component.scss new file mode 100644 index 0000000..7376c03 --- /dev/null +++ b/libs/blender-ui/src/lib/components/select/select.component.scss @@ -0,0 +1,39 @@ +@use '../../styles/variables' as *; + +:host { + display: block; + width: 100%; +} + +.bui-select-container { + position: relative; + width: 100%; +} + +.bui-select { + width: 100%; + appearance: none; + background-color: $bui-input-bg; + border: 1px solid $bui-border-dark; + border-radius: 2px; + color: $bui-text-color; + font-family: inherit; + font-size: 0.75rem; // xs + padding: 0.25rem 1.5rem 0.25rem 0.5rem; // Right padding for arrow + cursor: pointer; + + &:focus { + outline: none; + border-color: $bui-primary; + } +} + +.arrow-icon { + position: absolute; + right: 0.5rem; + top: 50%; + transform: translateY(-50%); + pointer-events: none; + color: #888; + font-size: 0.6rem; +} diff --git a/libs/blender-ui/src/lib/components/select/select.component.ts b/libs/blender-ui/src/lib/components/select/select.component.ts new file mode 100644 index 0000000..68ac9cc --- /dev/null +++ b/libs/blender-ui/src/lib/components/select/select.component.ts @@ -0,0 +1,29 @@ +import { Component, input, output } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +export interface SelectOption { + label: string; + value: any; +} + +@Component({ + selector: 'bui-select', + standalone: true, + imports: [CommonModule, FormsModule], + templateUrl: './select.component.html', + styleUrl: './select.component.scss', +}) +export class BuiSelectComponent { + options = input([]); + value = input(null); + valueChange = output(); + + onChange(event: Event) { + const val = (event.target as HTMLSelectElement).value; + // Find the original value from options if needed, but for string values it's fine. + // If value is complex object, we might need to map it back. + // Assuming simple string/number values for now. + this.valueChange.emit(val); + } +} diff --git a/libs/blender-ui/src/lib/services/themes.ts b/libs/blender-ui/src/lib/services/themes.ts index 911b553..b965337 100644 --- a/libs/blender-ui/src/lib/services/themes.ts +++ b/libs/blender-ui/src/lib/services/themes.ts @@ -8,39 +8,47 @@ export interface Theme { export const blenderDark: Theme = { name: 'dark', properties: { - '--bui-primary': '#e77e22', - '--bui-bg-light': '#f0f0f0', + '--bui-primary': '#4772b3', + '--bui-bg-light': '#e0e0e0', '--bui-bg-dark': '#1d1d1d', - '--bui-panel-bg': '#282828', + '--bui-panel-bg': '#2b2b2b', '--bui-panel-header': '#303030', - '--bui-input-bg': '#232323', + '--bui-input-bg': '#181818', '--bui-input-active-green': '#55802b', '--bui-input-active-yellow': '#8c7f21', '--bui-input-text': '#dedede', '--bui-tab-bg': '#222222', '--bui-tab-active': '#3d3d3d', - '--bui-border-dark': '#181818', - '--bui-text-color': '#e2e2e2', + '--bui-border-dark': '#3d3d3d', + '--bui-text-color': '#cccccc', '--bui-border-radius': '4px', + '--bui-highlight': '#5680c2', + '--bui-surface-dark': '#303030', + '--bui-surface-light': '#f5f5f5', + '--bui-card-bg': '#303030', }, }; export const blenderLight: Theme = { name: 'light', properties: { - '--bui-primary': '#e77e22', - '--bui-bg-light': '#ffffff', - '--bui-bg-dark': '#f0f0f0', - '--bui-panel-bg': '#e6e6e6', - '--bui-panel-header': '#d9d9d9', + '--bui-primary': '#4772b3', + '--bui-bg-light': '#e0e0e0', + '--bui-bg-dark': '#1d1d1d', + '--bui-panel-bg': '#f0f0f0', + '--bui-panel-header': '#f5f5f5', '--bui-input-bg': '#ffffff', '--bui-input-active-green': '#7bc654', '--bui-input-active-yellow': '#d4c24a', '--bui-input-text': '#333333', '--bui-tab-bg': '#d9d9d9', '--bui-tab-active': '#e6e6e6', - '--bui-border-dark': '#cccccc', - '--bui-text-color': '#333333', + '--bui-border-dark': '#d1d1d1', + '--bui-text-color': '#222222', '--bui-border-radius': '4px', + '--bui-highlight': '#375e97', + '--bui-surface-dark': '#303030', + '--bui-surface-light': '#f5f5f5', + '--bui-card-bg': '#ffffff', }, }; diff --git a/libs/blender-ui/src/lib/styles/_variables.scss b/libs/blender-ui/src/lib/styles/_variables.scss index fbcc5c1..7e6f242 100644 --- a/libs/blender-ui/src/lib/styles/_variables.scss +++ b/libs/blender-ui/src/lib/styles/_variables.scss @@ -12,3 +12,7 @@ $bui-tab-active: var(--bui-tab-active); $bui-border-dark: var(--bui-border-dark); $bui-text-color: var(--bui-text-color); $bui-border-radius: var(--bui-border-radius); +$bui-highlight: var(--bui-highlight); +$bui-surface-dark: var(--bui-surface-dark); +$bui-surface-light: var(--bui-surface-light); +$bui-card-bg: var(--bui-card-bg); diff --git a/verification/modifier_panel.png b/verification/modifier_panel.png new file mode 100644 index 0000000000000000000000000000000000000000..15a7f81bda995bab5b49129f97a839ac306f787a GIT binary patch literal 32059 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 literal 0 HcmV?d00001 diff --git a/verification/modifier_panel_expanded.png b/verification/modifier_panel_expanded.png new file mode 100644 index 0000000000000000000000000000000000000000..d9543f09830400785e53231f4473a0c2b128f430 GIT binary patch literal 44485 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�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 ZC&(BRly6zh1<=$Xomnv`Rw2Lh(^y#(4r2^uv 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 literal 0 HcmV?d00001 diff --git a/verification/verify_modifier_panel.py b/verification/verify_modifier_panel.py new file mode 100644 index 0000000..0c8ad85 --- /dev/null +++ b/verification/verify_modifier_panel.py @@ -0,0 +1,24 @@ +from playwright.sync_api import sync_playwright + +def verify_modifier_panel(): + with sync_playwright() as p: + browser = p.chromium.launch(headless=True) + page = browser.new_page() + page.goto("http://localhost:4200") + + # Wait for modifier panel + page.wait_for_selector("bui-modifier-panel") + + # Click on Advanced section to expand + page.click("text=Advanced") + + # Wait for expansion animation or just wait a bit + page.wait_for_timeout(500) + + # Take screenshot + page.screenshot(path="verification/modifier_panel_expanded.png") + + browser.close() + +if __name__ == "__main__": + verify_modifier_panel()