From 24f8a5857e1a620507c22ab23536a816781ce0b6 Mon Sep 17 00:00:00 2001 From: gsinghpal Date: Sun, 19 Apr 2026 17:36:11 -0400 Subject: [PATCH] feat(fusion_accounting_assets): SCSS foundation for OWL widget Made-with: Cursor --- fusion_accounting_assets/__manifest__.py | 5 +- .../static/src/scss/_variables.scss | 40 +++++ .../static/src/scss/assets.scss | 157 ++++++++++++++++++ .../static/src/scss/dark_mode.scss | 32 ++++ 4 files changed, 233 insertions(+), 1 deletion(-) create mode 100644 fusion_accounting_assets/static/src/scss/_variables.scss create mode 100644 fusion_accounting_assets/static/src/scss/assets.scss create mode 100644 fusion_accounting_assets/static/src/scss/dark_mode.scss diff --git a/fusion_accounting_assets/__manifest__.py b/fusion_accounting_assets/__manifest__.py index 032e8ab7..5522b92d 100644 --- a/fusion_accounting_assets/__manifest__.py +++ b/fusion_accounting_assets/__manifest__.py @@ -1,6 +1,6 @@ { 'name': 'Fusion Accounting Assets', - 'version': '19.0.1.0.18', + 'version': '19.0.1.0.19', 'category': 'Accounting/Accounting', 'summary': 'AI-augmented asset management with depreciation schedules.', 'description': """ @@ -37,6 +37,9 @@ menu hides; the engine + AI tools remain available for the chat. ], 'assets': { 'web.assets_backend': [ + 'fusion_accounting_assets/static/src/scss/_variables.scss', + 'fusion_accounting_assets/static/src/scss/assets.scss', + 'fusion_accounting_assets/static/src/scss/dark_mode.scss', ], }, 'installable': True, diff --git a/fusion_accounting_assets/static/src/scss/_variables.scss b/fusion_accounting_assets/static/src/scss/_variables.scss new file mode 100644 index 00000000..c25f8d20 --- /dev/null +++ b/fusion_accounting_assets/static/src/scss/_variables.scss @@ -0,0 +1,40 @@ +// Fusion assets design tokens (extends Phase 1+2's tokens for consistency). + +$asset-bg-primary: #ffffff; +$asset-bg-secondary: #f9fafb; +$asset-bg-tertiary: #f3f4f6; +$asset-border: #e5e7eb; +$asset-text-primary: #111827; +$asset-text-secondary: #6b7280; +$asset-text-muted: #9ca3af; +$asset-accent: #3b82f6; +$asset-accent-bg: #eff6ff; + +// State colors +$asset-state-draft: #6b7280; +$asset-state-running: #10b981; +$asset-state-paused: #f59e0b; +$asset-state-disposed: #ef4444; + +// Severity colors (mirrors phase 2) +$asset-severity-high: #ef4444; +$asset-severity-high-bg: #fef2f2; +$asset-severity-medium: #f59e0b; +$asset-severity-medium-bg: #fffbeb; +$asset-severity-low: #10b981; +$asset-severity-low-bg: #ecfdf5; + +$asset-space-1: 0.25rem; +$asset-space-2: 0.5rem; +$asset-space-3: 0.75rem; +$asset-space-4: 1rem; +$asset-space-6: 1.5rem; + +$asset-font-size-xs: 0.75rem; +$asset-font-size-sm: 0.875rem; +$asset-font-size-base: 1rem; +$asset-font-size-lg: 1.125rem; +$asset-font-size-xl: 1.25rem; + +$asset-border-radius: 0.375rem; +$asset-border-radius-md: 0.5rem; diff --git a/fusion_accounting_assets/static/src/scss/assets.scss b/fusion_accounting_assets/static/src/scss/assets.scss new file mode 100644 index 00000000..bd60b796 --- /dev/null +++ b/fusion_accounting_assets/static/src/scss/assets.scss @@ -0,0 +1,157 @@ +@import "variables"; + +.o_fusion_assets { + background: $asset-bg-secondary; + min-height: 100vh; + + &_header { + background: $asset-bg-primary; + border-bottom: 1px solid $asset-border; + padding: $asset-space-4 $asset-space-6; + display: flex; + justify-content: space-between; + align-items: center; + + h1 { font-size: $asset-font-size-xl; margin: 0; } + + .o_fusion_assets_summary { + display: flex; + gap: $asset-space-6; + font-size: $asset-font-size-sm; + color: $asset-text-secondary; + + .summary-value { + font-weight: 600; + color: $asset-text-primary; + margin-left: $asset-space-1; + } + } + } + + &_card { + background: $asset-bg-primary; + border: 1px solid $asset-border; + border-radius: $asset-border-radius-md; + padding: $asset-space-4; + margin-bottom: $asset-space-3; + cursor: pointer; + transition: all 200ms ease-in-out; + + &:hover { + border-color: $asset-accent; + box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); + } + + &.selected { + border-color: $asset-accent; + background: $asset-accent-bg; + } + + &_header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: $asset-space-2; + } + + .asset-name { + font-weight: 600; + font-size: $asset-font-size-base; + } + + .asset-state-badge { + padding: $asset-space-1 $asset-space-2; + border-radius: $asset-border-radius; + font-size: $asset-font-size-xs; + font-weight: 500; + text-transform: uppercase; + + &[data-state="draft"] { background: lighten($asset-state-draft, 40%); color: $asset-state-draft; } + &[data-state="running"] { background: lighten($asset-state-running, 45%); color: $asset-state-running; } + &[data-state="paused"] { background: lighten($asset-state-paused, 35%); color: $asset-state-paused; } + &[data-state="disposed"] { background: lighten($asset-state-disposed, 35%); color: $asset-state-disposed; } + } + + .asset-numbers { + display: grid; + grid-template-columns: 1fr 1fr; + gap: $asset-space-2; + font-size: $asset-font-size-sm; + color: $asset-text-secondary; + + .label { + font-weight: 500; + margin-right: $asset-space-2; + } + .value { + color: $asset-text-primary; + font-weight: 500; + } + } + } + + &_table { + background: $asset-bg-primary; + border-radius: $asset-border-radius-md; + overflow: hidden; + font-size: $asset-font-size-sm; + + table { width: 100%; border-collapse: collapse; } + + th { + background: $asset-bg-tertiary; + padding: $asset-space-3; + text-align: left; + font-weight: 600; + color: $asset-text-secondary; + border-bottom: 1px solid $asset-border; + } + + td { + padding: $asset-space-2 $asset-space-3; + border-bottom: 1px solid lighten($asset-border, 5%); + } + + tr.posted { background: $asset-bg-secondary; } + tr.due-now { background: $asset-severity-medium-bg; } + .text-end { text-align: right; } + } + + .btn_asset { + padding: $asset-space-2 $asset-space-4; + border-radius: $asset-border-radius; + background: $asset-bg-primary; + border: 1px solid $asset-border; + color: $asset-text-primary; + font-size: $asset-font-size-sm; + cursor: pointer; + + &:hover { background: $asset-bg-tertiary; } + + &.primary { + background: $asset-accent; + border-color: $asset-accent; + color: white; + + &:hover { background: darken($asset-accent, 8%); } + } + + &.danger { + background: $asset-severity-high; + border-color: $asset-severity-high; + color: white; + } + } +} + +.o_fusion_anomaly_strip { + margin: $asset-space-3 0; + padding: $asset-space-3; + border-radius: $asset-border-radius; + border: 1px solid; + font-size: $asset-font-size-sm; + + &[data-severity="high"] { background: $asset-severity-high-bg; border-color: $asset-severity-high; } + &[data-severity="medium"] { background: $asset-severity-medium-bg; border-color: $asset-severity-medium; } + &[data-severity="low"] { background: $asset-severity-low-bg; border-color: $asset-severity-low; } +} diff --git a/fusion_accounting_assets/static/src/scss/dark_mode.scss b/fusion_accounting_assets/static/src/scss/dark_mode.scss new file mode 100644 index 00000000..2de63446 --- /dev/null +++ b/fusion_accounting_assets/static/src/scss/dark_mode.scss @@ -0,0 +1,32 @@ +@import "variables"; + +[data-color-scheme="dark"] .o_fusion_assets { + background: #1f2937; color: #f9fafb; + + &_header, &_card, &_table { background: #111827; border-color: #374151; } + + &_card { + &:hover { border-color: #60a5fa; } + &.selected { background: #1e3a8a; border-color: #60a5fa; } + .asset-numbers .label { color: #9ca3af; } + .asset-numbers .value { color: #f9fafb; } + } + + &_table { + th { background: #1f2937; color: #d1d5db; } + td { border-color: #374151; } + tr.posted { background: #1f2937; } + } + + .btn_asset { + background: #374151; border-color: #4b5563; color: #f9fafb; + &:hover { background: #4b5563; } + &.primary { background: #3b82f6; } + } + + .o_fusion_anomaly_strip { + &[data-severity="high"] { background: rgba(239, 68, 68, 0.15); } + &[data-severity="medium"] { background: rgba(245, 158, 11, 0.15); } + &[data-severity="low"] { background: rgba(16, 185, 129, 0.15); } + } +}