blob: 5c71ce32b7ea021387dd9f389e7724f9147fdac6 [file]
// Copyright (C) 2026 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* Chart theme utilities for reading Perfetto theme colors.
*
* DESIGN NOTES:
*
* 1. Colors are read from CSS variables defined in theme_provider.scss, NOT
* hardcoded. This ensures charts automatically adapt when theme colors
* are updated in SCSS.
*
* 2. Colors are read from the provided element (or a sensible fallback) so
* that charts work even in embedded builds that omit .pf-theme-provider.
*
* 3. All color-sensitive values (axis, series, tooltip) are included directly
* in the ECharts option object. When Mithril redraws after a theme change,
* the option is rebuilt with the latest CSS variable values, which causes
* ECharts to update colors via setOption().
*/
/**
* Theme colors for charts and visualizations.
*/
export interface ChartThemeColors {
readonly textColor: string;
readonly borderColor: string;
readonly backgroundColor: string;
readonly accentColor: string;
readonly chartColors: readonly string[];
readonly fontFamily: string;
}
/**
* Returns the current theme colors by reading CSS variables from the given
* element. The element must be within the DOM tree that has the theme CSS
* variables defined (typically a child of .pf-theme-provider).
*/
export function getChartThemeColors(el: Element): ChartThemeColors {
const style = getComputedStyle(el);
const chartColors: string[] = [];
for (let i = 1; i <= 8; i++) {
chartColors.push(style.getPropertyValue(`--pf-chart-color-${i}`).trim());
}
return {
textColor: style.getPropertyValue('--pf-color-text').trim(),
borderColor: style.getPropertyValue('--pf-color-border').trim(),
backgroundColor: style.getPropertyValue('--pf-color-background').trim(),
accentColor: style.getPropertyValue('--pf-color-accent').trim(),
chartColors,
fontFamily:
style.getPropertyValue('--pf-font-compact').trim() || 'sans-serif',
};
}