diff --git a/fusion_accounting_reports/__manifest__.py b/fusion_accounting_reports/__manifest__.py index ae0e2772..58593bdf 100644 --- a/fusion_accounting_reports/__manifest__.py +++ b/fusion_accounting_reports/__manifest__.py @@ -1,6 +1,6 @@ { 'name': 'Fusion Accounting Reports', - 'version': '19.0.1.0.21', + 'version': '19.0.1.0.22', 'category': 'Accounting/Accounting', 'summary': 'AI-augmented financial reports (P&L, balance sheet, trial balance, GL).', 'description': """ @@ -39,6 +39,9 @@ menu hides; the engine and AI tools remain available for the chat. ], 'assets': { 'web.assets_backend': [ + 'fusion_accounting_reports/static/src/scss/_variables.scss', + 'fusion_accounting_reports/static/src/scss/reports.scss', + 'fusion_accounting_reports/static/src/scss/dark_mode.scss', ], }, 'installable': True, diff --git a/fusion_accounting_reports/static/src/scss/_variables.scss b/fusion_accounting_reports/static/src/scss/_variables.scss new file mode 100644 index 00000000..e158bfdc --- /dev/null +++ b/fusion_accounting_reports/static/src/scss/_variables.scss @@ -0,0 +1,49 @@ +// Fusion reports design tokens (extends Phase 1's bank_rec tokens for consistency). + +// Colors — semantic +$report-bg-primary: #ffffff; +$report-bg-secondary: #f9fafb; +$report-bg-tertiary: #f3f4f6; +$report-border: #e5e7eb; +$report-text-primary: #111827; +$report-text-secondary: #6b7280; +$report-text-muted: #9ca3af; +$report-accent: #3b82f6; +$report-accent-bg: #eff6ff; + +// Severity colors (mirrors bank_rec) +$report-severity-high: #ef4444; +$report-severity-high-bg: #fef2f2; +$report-severity-medium: #f59e0b; +$report-severity-medium-bg: #fffbeb; +$report-severity-low: #10b981; +$report-severity-low-bg: #ecfdf5; + +// Variance indicators +$report-variance-positive: #10b981; +$report-variance-negative: #ef4444; + +// Spacing +$report-space-1: 0.25rem; +$report-space-2: 0.5rem; +$report-space-3: 0.75rem; +$report-space-4: 1rem; +$report-space-5: 1.25rem; +$report-space-6: 1.5rem; +$report-space-8: 2rem; + +// Typography +$report-font-size-xs: 0.75rem; +$report-font-size-sm: 0.875rem; +$report-font-size-base: 1rem; +$report-font-size-lg: 1.125rem; +$report-font-size-xl: 1.25rem; +$report-font-mono: ui-monospace, SFMono-Regular, Menlo, monospace; + +// Borders + radii +$report-border-radius: 0.375rem; +$report-border-radius-md: 0.5rem; +$report-border-radius-lg: 0.75rem; + +// Subtotal indentation +$report-indent-per-level: 1.5rem; diff --git a/fusion_accounting_reports/static/src/scss/dark_mode.scss b/fusion_accounting_reports/static/src/scss/dark_mode.scss new file mode 100644 index 00000000..4cb50e63 --- /dev/null +++ b/fusion_accounting_reports/static/src/scss/dark_mode.scss @@ -0,0 +1,34 @@ +@import "variables"; + +[data-color-scheme="dark"] .o_fusion_reports { + background: #1f2937; + color: #f9fafb; + + &_header, &_table, &_filters, .o_fusion_commentary_panel { + background: #111827; + border-color: #374151; + color: #f9fafb; + } + + &_table { + th { background: #1f2937; color: #d1d5db; } + td { border-color: #374151; } + tr.subtotal { background: #1f2937; } + tr.drillable:hover { background: #1e3a8a; } + } + + .btn_report { + 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); } + } +} diff --git a/fusion_accounting_reports/static/src/scss/reports.scss b/fusion_accounting_reports/static/src/scss/reports.scss new file mode 100644 index 00000000..f5f90a1e --- /dev/null +++ b/fusion_accounting_reports/static/src/scss/reports.scss @@ -0,0 +1,161 @@ +@import "variables"; + +.o_fusion_reports { + background: $report-bg-secondary; + min-height: 100vh; + + &_header { + background: $report-bg-primary; + border-bottom: 1px solid $report-border; + padding: $report-space-4 $report-space-6; + display: flex; + justify-content: space-between; + align-items: center; + + h1 { + font-size: $report-font-size-xl; + margin: 0; + } + } + + &_table { + background: $report-bg-primary; + border: 1px solid $report-border; + border-radius: $report-border-radius-md; + margin: $report-space-4; + overflow: hidden; + font-family: $report-font-mono; + font-size: $report-font-size-sm; + + table { + width: 100%; + border-collapse: collapse; + } + + th { + background: $report-bg-tertiary; + padding: $report-space-3 $report-space-4; + text-align: left; + font-weight: 600; + color: $report-text-secondary; + border-bottom: 1px solid $report-border; + } + + th.amount, td.amount { + text-align: right; + white-space: nowrap; + } + + td { + padding: $report-space-2 $report-space-4; + border-bottom: 1px solid lighten($report-border, 5%); + } + + tr.subtotal { + font-weight: 600; + background: $report-bg-secondary; + border-top: 1px solid $report-text-muted; + } + + tr.subtotal td { + border-bottom: 1px solid $report-text-muted; + } + + tr.drillable { + cursor: pointer; + &:hover { background: $report-accent-bg; } + } + + .level-1 { padding-left: $report-space-4 + $report-indent-per-level; } + .level-2 { padding-left: $report-space-4 + $report-indent-per-level * 2; } + .level-3 { padding-left: $report-space-4 + $report-indent-per-level * 3; } + + .variance-pos { color: $report-variance-positive; } + .variance-neg { color: $report-variance-negative; } + } + + &_filters { + background: $report-bg-primary; + padding: $report-space-3 $report-space-4; + border-bottom: 1px solid $report-border; + display: flex; + gap: $report-space-3; + align-items: center; + flex-wrap: wrap; + } + + .btn_report { + padding: $report-space-2 $report-space-4; + border-radius: $report-border-radius; + background: $report-bg-primary; + border: 1px solid $report-border; + color: $report-text-primary; + font-size: $report-font-size-sm; + cursor: pointer; + transition: all 150ms ease-in-out; + + &:hover { background: $report-bg-tertiary; } + + &.primary { + background: $report-accent; + border-color: $report-accent; + color: white; + + &:hover { background: darken($report-accent, 8%); } + } + } +} + +.o_fusion_anomaly_strip { + margin: $report-space-3; + padding: $report-space-3; + border-radius: $report-border-radius; + border: 1px solid; + font-size: $report-font-size-sm; + + &[data-severity="high"] { + background: $report-severity-high-bg; + border-color: $report-severity-high; + } + &[data-severity="medium"] { + background: $report-severity-medium-bg; + border-color: $report-severity-medium; + } + &[data-severity="low"] { + background: $report-severity-low-bg; + border-color: $report-severity-low; + } +} + +.o_fusion_commentary_panel { + background: $report-bg-primary; + border: 1px solid $report-border; + border-radius: $report-border-radius-md; + margin: $report-space-3; + padding: $report-space-4; + + h4 { + margin: 0 0 $report-space-3; + font-size: $report-font-size-base; + color: $report-text-primary; + } + + .commentary-section { + margin-bottom: $report-space-3; + + h5 { + font-size: $report-font-size-sm; + color: $report-text-secondary; + text-transform: uppercase; + letter-spacing: 0.05em; + margin-bottom: $report-space-2; + } + + ul { + margin: 0; + padding-left: $report-space-4; + + li { margin: $report-space-1 0; } + } + } +}