Skip to content

Redesign theme support#3146

Merged
texodus merged 2 commits intomasterfrom
themes-redesign
Mar 30, 2026
Merged

Redesign theme support#3146
texodus merged 2 commits intomasterfrom
themes-redesign

Conversation

@texodus
Copy link
Copy Markdown
Member

@texodus texodus commented Mar 27, 2026

This PR refactors the CSS structure of <perspective-viewer>:

  • Removes .less from all packages, replaced with regular CSS (.css).
  • Use lightningcss for bundling and SVG datauri inlining (replaces procss).
  • Rename all exported CSS variables to use --psp-{module}--{component?}--{property} format. This is a breaking change for custom themes!
  • Converts all SVGs to have correct internal dimensions, and modify all use of SVGs as icons to rely on their internal dimensions for layout, removing all (most) explicit dimensions from icons in the internal CSS. This makes it much easier to customize perspective-viewer icons with somewhat arbitrarily sized replacements.
  • Incidentally reduces bundle size by ~40kb.
  • Refactor tools/ directory (with the goal of eventually eliminating it entirely). EDIT Moved this to stand-alone PR.
  • Fix drag/drop focus loss bug in sidebar.

@texodus texodus added enhancement Feature requests or improvements breaking labels Mar 27, 2026
@texodus texodus force-pushed the themes-redesign branch 3 times, most recently from 834535c to d8dbeab Compare March 29, 2026 15:51
@texodus
Copy link
Copy Markdown
Member Author

texodus commented Mar 29, 2026

Migration guide for themes:

old_name new_name category
--theme-name --psp-theme-name theme
--active--color --psp-active--color semantic
--active--background --psp-active--background semantic
--inactive--color --psp-inactive--color semantic
--inactive--border-color --psp-inactive--border-color semantic
--error--color --psp-error--color semantic
--warning--color --psp-warning--color semantic
--warning--background --psp-warning--background semantic
--icon--color --psp--color semantic
--overflow-hint-icon--color --psp-icon-overflow-hint--color semantic
--overflow-hint-icon--content --psp-icon-overflow-hint--content semantic
--plugin--background --psp--background-color plugin
--plugin--border --psp-plugin--border plugin
--sidebar--background --psp-sidebar--background plugin
--placeholder--background --psp-placeholder--background plugin
--theme-icon--mask-image --psp-icon--theme--mask-image icon
--close-icon--mask-image --psp-icon--close--mask-image icon
--copy-icon--mask-image --psp-icon--copy--mask-image icon
--export-icon--mask-image --psp-icon--export--mask-image icon
--reset-icon--mask-image --psp-icon--reset--mask-image icon
--downloading-icon--mask-image --psp-icon--downloading--mask-image icon
--updating-icon--mask-image --psp-icon--updating--mask-image icon
--free-scroll-icon--mask-image --psp-icon--free-scroll--mask-image icon
--add-expression-icon--mask-image --psp-icon--add-expression--mask-image icon
--bookmarks--mask-image --psp-icon--bookmarks--mask-image icon
--column-drag-handle--mask-image --psp-icon--column-drag-handle--mask-image icon
--column-settings-icon--mask-image --psp-icon--column-settings--mask-image icon
--column-checkbox-on--mask-image --psp-icon--checkbox-on--mask-image icon
--column-checkbox-off--mask-image --psp-icon--checkbox-off--mask-image icon
--column-checkbox-hover--mask-image --psp-icon--checkbox-hover--mask-image icon
--column-radio-on--mask-image --psp-icon--radio-on--mask-image icon
--column-radio-off--mask-image --psp-icon--radio-off--mask-image icon
--column-radio-hover--mask-image --psp-icon--radio-hover--mask-image icon
--sort-asc-icon--mask-image --psp-icon--sort-asc--mask-image icon
--sort-desc-icon--mask-image --psp-icon--sort-desc--mask-image icon
--sort-col-asc-icon--mask-image --psp-icon--sort-col-asc--mask-image icon
--sort-col-desc-icon--mask-image --psp-icon--sort-col-desc--mask-image icon
--sort-abs-asc-icon--mask-image --psp-icon--sort-abs-asc--mask-image icon
--sort-abs-desc-icon--mask-image --psp-icon--sort-abs-desc--mask-image icon
--sort-abs-col-asc-icon--mask-image --psp-icon--sort-abs-col-asc--mask-image icon
--sort-abs-col-desc-icon--mask-image --psp-icon--sort-abs-col-desc--mask-image icon
--sort-none-icon--mask-image --psp-icon--sort-none--mask-image icon
--status-ok-icon--mask-image --psp-icon--status-ok--mask-image icon
--drawer-tab-icon--mask-image --psp-icon--drawer-tab--mask-image icon
--drawer-tab-icon--hover--mask-image --psp-icon--drawer-tab-hover--mask-image icon
--drawer-tab-inverted-icon--mask-image --psp-icon--drawer-tab-inverted--mask-image icon
--drawer-tab-inverted-icon--hover--mask-image --psp-icon--drawer-tab-inverted-hover--mask-image icon
--select-arrow--background-image --psp-icon--select-arrow--mask-image icon
--select-arrow--hover--background-image --psp-icon--select-arrow-hover--mask-image icon
--select-arrow-dark--background-image --psp-icon--select-arrow-dark--mask-image icon
--select-arrow-light--background-image --psp-icon--select-arrow-light--mask-image icon
--column-type-boolean--mask-image --psp-column-type--boolean--mask-image column
--column-type-date--mask-image --psp-column-type--date--mask-image column
--column-type-datetime--mask-image --psp-column-type--datetime--mask-image column
--column-type-float--mask-image --psp-column-type--float--mask-image column
--column-type-integer--mask-image --psp-column-type--integer--mask-image column
--column-type-string--mask-image --psp-column-type--string--mask-image column
--boolean--column-type--color --psp-column-type--boolean--color column
--date--column-type--color --psp-column-type--date--color column
--float--column-type--color --psp-column-type--float--color column
--string--column-type--color --psp-column-type--string--color column
--column_type--width --psp-column-type--width column
--column-selector--font-size --psp-column-selector--font-size column
--d3fc-series --psp-d3fc--series--color d3fc
--d3fc-series-1 --psp-d3fc--series-1--color d3fc
--d3fc-series-2 --psp-d3fc--series-2--color d3fc
--d3fc-series-3 --psp-d3fc--series-3--color d3fc
--d3fc-series-4 --psp-d3fc--series-4--color d3fc
--d3fc-series-5 --psp-d3fc--series-5--color d3fc
--d3fc-series-6 --psp-d3fc--series-6--color d3fc
--d3fc-series-7 --psp-d3fc--series-7--color d3fc
--d3fc-series-8 --psp-d3fc--series-8--color d3fc
--d3fc-series-9 --psp-d3fc--series-9--color d3fc
--d3fc-series-10 --psp-d3fc--series-10--color d3fc
--d3fc-series-11 --psp-d3fc--series-11--color d3fc
--d3fc-series-12 --psp-d3fc--series-12--color d3fc
--d3fc-full--gradient --psp-d3fc--full-gradient--background d3fc
--d3fc-positive--gradient --psp-d3fc--pos-gradient--background d3fc
--d3fc-negative--gradient --psp-d3fc--neg-gradient--background d3fc
--d3fc-axis--lines --psp-d3fc--axis-lines--color d3fc
--d3fc-axis-ticks--color --psp-d3fc--axis-ticks--color d3fc
--d3fc-gridline--color --psp-d3fc--gridline--color d3fc
--d3fc-legend--background --psp-d3fc--legend--background d3fc
--d3fc-legend--text --psp-d3fc--legend--color d3fc
--d3fc-label--color --psp-d3fc--label--color d3fc
--d3fc-tooltip--background --psp-d3fc--tooltip--background d3fc
--d3fc-tooltip--background--color --psp-d3fc--tooltip--background-color d3fc
--d3fc-tooltip--color --psp-d3fc--tooltip--color d3fc
--d3fc-tooltip--border-color --psp-d3fc--tooltip--border-color d3fc
--d3fc-tooltip--box-shadow --psp-d3fc--tooltip--box-shadow d3fc
--d3fc-treedata--hover-highlight --psp-d3fc--treedata--hover-highlight d3fc
--d3fc-treedata--labels --psp-d3fc--treedata--labels d3fc
--d3fc-treedata-axis--lines --psp-d3fc--treedata-axis--lines d3fc
--map-tile-url --psp-openlayers--tile-url map
--map-gradient --psp-openlayers--gradient--background map
--map-element-background --psp-openlayers--element--background map
--map-attribution--filter --psp-openlayers--attribution--filter map
--map-category-1 --psp-openlayers--category-1--color map
--map-category-2 --psp-openlayers--category-2--color map
--map-category-3 --psp-openlayers--category-3--color map
--map-category-4 --psp-openlayers--category-4--color map
--map-category-5 --psp-openlayers--category-5--color map
--map-category-6 --psp-openlayers--category-6--color map
--map-category-7 --psp-openlayers--category-7--color map
--map-category-8 --psp-openlayers--category-8--color map
--map-category-9 --psp-openlayers--category-9--color map
--map-category-10 --psp-openlayers--category-10--color map
--rt-pos-cell--color --psp-datagrid--pos-cell--color datagrid
--rt-neg-cell--color --psp-datagrid--neg-cell--color datagrid
--rt--border-color --psp-datagrid--border-color datagrid
--rt-hover--border-color --psp-datagrid--hover--border-color datagrid
--toolbar-scroll-lock--content --psp-toolbar-scroll-lock--content datagrid
--toolbar-scroll-lock-active--content --psp-toolbar-scroll-lock-active--content datagrid
--toolbar-edit-mode--read-only--content --psp-toolbar-edit-mode-read-only--content datagrid
--toolbar-edit-mode--edit--content --psp-toolbar-edit-mode-edit--content datagrid
--toolbar-edit-mode--select-row--content --psp-toolbar-edit-mode-select-row--content datagrid
--toolbar-edit-mode--select-column--content --psp-toolbar-edit-mode-select-column--content datagrid
--toolbar-edit-mode--select-region--content --psp-toolbar-edit-mode-select-region--content datagrid
--datagrid-column-edit-button--content --psp-datagrid--column-edit-button--content datagrid
--workspace-spacing --psp-workspace--spacing workspace
--workspace-split-panel-handle--background-color --psp-workspace--split-panel-handle--background-color workspace
--workspace-tabbar--border-color --psp-workspace--tabbar--border-color workspace
--workspace-tabbar--border-width --psp-workspace--tabbar--border-width workspace
--workspace-tabbar-tab--border-width --psp-workspace--tabbar-tab--border-width workspace
--workspace-tabbar--border --psp-workspace--tabbar--border workspace
--code-editor-column--color --psp-code-editor--column--color editor
--code-editor-comment--color --psp-code-editor--comment--color editor
--code-editor-literal--color --psp-code-editor--literal--color editor
--code-editor-operator--color --psp-code-editor--operator--color editor
--code-editor-symbol--color --psp-code-editor--symbol--color editor
--expression--error-color --psp-expression--error--color editor
--expression--function-color --psp-expression--function--color editor
--expression--operator-color --psp-expression--operator--color editor
--status-bar--display --psp-status-bar--display status
--status-bar--padding --psp-status-bar--padding status
--status-bar--border-radius --psp-status-bar--border-radius status
--status-indicator--pointer-events --psp-status-icon--pointer-events status
--status-icon-connected--color --psp-status-icon--connected--color status
--status-icon-error--color --psp-status-icon--error--color status
--status-icon-initializing--color --psp-status-icon--initializing--color status
--status-icon-keyframes-start--transform --psp-status-icon--keyframes-start--transform status
--status-icon-keyframes-end--transform --psp-status-icon--keyframes-end--transform status
--status-icon-updating-keyframes-start--filter --psp-status-icon--updating-keyframes-start--filter status
--status-icon-updating-keyframes-start--transform --psp-status-icon--updating-keyframes-start--transform status
--status-icon-updating-keyframes-end--filter --psp-status-icon--updating-keyframes-end--filter status
--status-icon-updating-keyframes-end--transform --psp-status-icon--updating-keyframes-end--transform status
--status-ok-icon--border-color --psp-status-icon--ok--border-color status
--status-ok-icon--cursor --psp-status-icon--ok--cursor status
--status-ok-icon--hover--background-color --psp-status-icon--ok-hover--background-color status
--status-ok-icon--hover--border-color --psp-status-icon--ok-hover--border-color status
--status-ok-icon--hover--color --psp-status-icon--ok-hover--color status
--plugin-selector-datagrid--content --psp-plugin-selector--datagrid--content plugin
--plugin-selector-x-bar--content --psp-plugin-selector--x-bar--content plugin
--plugin-selector-y-bar--content --psp-plugin-selector--y-bar--content plugin
--plugin-selector-y-line--content --psp-plugin-selector--y-line--content plugin
--plugin-selector-y-area--content --psp-plugin-selector--y-area--content plugin
--plugin-selector-y-scatter--content --psp-plugin-selector--y-scatter--content plugin
--plugin-selector-x-y-line--content --psp-plugin-selector--x-y-line--content plugin
--plugin-selector-x-y-scatter--content --psp-plugin-selector--x-y-scatter--content plugin
--plugin-selector-treemap--content --psp-plugin-selector--treemap--content plugin
--plugin-selector-sunburst--content --psp-plugin-selector--sunburst--content plugin
--plugin-selector-heatmap--content --psp-plugin-selector--heatmap--content plugin
--plugin-selector-map-scatter--content --psp-plugin-selector--map-scatter--content plugin
--plugin-selector-ohlc--content --psp-plugin-selector--ohlc--content plugin
--plugin-selector-candlestick--content --psp-plugin-selector--candlestick--content plugin
--plugin-name-datagrid--content --psp-plugin-name--datagrid--content plugin
--plugin-name-x-bar--content --psp-plugin-name--x-bar--content plugin
--plugin-name-y-bar--content --psp-plugin-name--y-bar--content plugin
--plugin-name-y-line--content --psp-plugin-name--y-line--content plugin
--plugin-name-y-area--content --psp-plugin-name--y-area--content plugin
--plugin-name-y-scatter--content --psp-plugin-name--y-scatter--content plugin
--plugin-name-x-y-line--content --psp-plugin-name--x-y-line--content plugin
--plugin-name-x-y-scatter--content --psp-plugin-name--x-y-scatter--content plugin
--plugin-name-treemap--content --psp-plugin-name--treemap--content plugin
--plugin-name-sunburst--content --psp-plugin-name--sunburst--content plugin
--plugin-name-heatmap--content --psp-plugin-name--heatmap--content plugin
--plugin-name-ohlc--content --psp-plugin-name--ohlc--content plugin
--plugin-name-candlestick--content --psp-plugin-name--candlestick--content plugin
--button--font-family --psp-button--font-family ui
--button--font-size --psp-button--font-size ui
--button--min-width --psp-button--min-width ui
--config-button--padding --psp-config-button--padding ui
--select--background-color --psp-select--background-color ui
--select--padding --psp-select--padding ui
--interface-monospace--font-family --psp-interface-monospace--font-family ui
--calendar--filter --psp-calendar--filter ui
--main-column--border --psp-main-column--border ui
--main-column--border-radius --psp-main-column--border-radius ui
--main-column--border-width --psp-main-column--border-width ui
--main-column--margin --psp-main-column--margin ui
--top-panel-row--display --psp-top-panel-row--display ui
--close-button--display --psp-close-button--display ui
--active-column-selector--content --psp-label--active-column-selector--content label
--inactive-column-selector--content --psp-label--inactive-column-selector--content label
--add-expression-button--content --psp-label--add-expression-button--content label
--aggregate-depth-label--content --psp-label--aggregate-depth--content label
--all-columns-label--content --psp-label--all-columns--content label
--attributes-tab-label--content --psp-label--attributes-tab--content label
--background-label--content --psp-label--background--content label
--color-label--content --psp-label--color--content label
--color-range-label--content --psp-label--color-range--content label
--column-selector-column-color--content --psp-label--column-color--content label
--column-selector-column-columns--content --psp-label--column-columns--content label
--column-selector-column-label--content --psp-label--column-label--content label
--column-selector-column-size--content --psp-label--column-size--content label
--column-selector-column-symbol--content --psp-label--column-symbol--content label
--column-selector-column-tooltip--content --psp-label--column-tooltip--content label
--column-selector-column-x-axis--content --psp-label--column-x-axis--content label
--column-selector-column-y-axis--content --psp-label--column-y-axis--content label
--column-style-close-button--content --psp-label--column-style-close-button--content label
--column-style-open-button--content --psp-label--column-style-open-button--content label
--column-style-neg-color--content --psp-label--column-style-neg-color--content label
--column-style-pos-color--content --psp-label--column-style-pos-color--content label
--config-button-icon--content --psp-label--config-button--content label
--copy-button--content --psp-label--copy-button--content label
--d3fc-y1-label--content --psp-label--d3fc-y1--content label
--d3fc-y2-label--content --psp-label--d3fc-y2--content label
--date-style-label--content --psp-label--date-style--content label
--day-label--content --psp-label--day--content label
--debug-tab-label--content --psp-label--debug-tab--content label
--edit-mode--read-only--content --psp-label--edit-mode-read-only--content label
--edit-mode--edit--content --psp-label--edit-mode-edit--content label
--edit-mode--select-column--content --psp-label--edit-mode-select-column--content label
--edit-mode--select-region--content --psp-label--edit-mode-select-region--content label
--edit-mode--select-row--content --psp-label--edit-mode-select-row--content label
--export-button--content --psp-label--export-button--content label
--filter-label--content --psp-label--filter--content label
--foreground-label--content --psp-label--foreground--content label
--format-label--content --psp-label--format--content label
--fractional-digits-label--content --psp-label--fractional-digits--content label
--fractional-seconds-label--content --psp-label--fractional-seconds--content label
--group-by-label--content --psp-label--group-by--content label
--hour-label--content --psp-label--hour--content label
--hours-label--content --psp-label--hours--content label
--max-value-label--content --psp-label--max-value--content label
--minimum-integer-digits-label--content --psp-label--minimum-integer-digits--content label
--minute-label--content --psp-label--minute--content label
--month-label--content --psp-label--month--content label
--no-results--content --psp-label--no-results--content label
--notation-label--content --psp-label--notation--content label
--reset-button--content --psp-label--reset-button--content label
--reset-button-icon--content --psp-label--reset-button-icon--content label
--rounding-increment-label--content --psp-label--rounding-increment--content label
--rounding-mode-label--content --psp-label--rounding-mode--content label
--rounding-priority-label--content --psp-label--rounding-priority--content label
--save-button-icon--content --psp-label--save-button-icon--content label
--scroll-lock-alt-toggle--content --psp-label--scroll-lock-alt-toggle--content label
--scroll-lock-toggle--content --psp-label--scroll-lock-toggle--content label
--second-label--content --psp-label--second--content label
--series-label--content --psp-label--series--content label
--sign-display-label--content --psp-label--sign-display--content label
--significant-digits-label--content --psp-label--significant-digits--content label
--sort-label--content --psp-label--sort--content label
--split-by-label--content --psp-label--split-by--content label
--style-label--content --psp-label--style--content label
--style-tab-label--content --psp-label--style-tab--content label
--time-style-label--content --psp-label--time-style--content label
--timezone-label--content --psp-label--timezone--content label
--trailing-zero-display-label--content --psp-label--trailing-zero-display--content label
--transpose-button--content --psp-label--transpose-button--content label
--tree-label-collapse--content --psp-label--tree-collapse--content label
--tree-label-expand--content --psp-label--tree-expand--content label
--untitled--content --psp-label--untitled--content label
--use-grouping-label--content --psp-label--use-grouping--content label
--weekday-label--content --psp-label--weekday--content label
--year-label--content --psp-label--year--content label
--null--content --psp-label--null--content label

texodus added 2 commits March 29, 2026 16:56
Signed-off-by: Andrew Stein <steinlink@gmail.com>
Signed-off-by: Andrew Stein <steinlink@gmail.com>
@texodus texodus marked this pull request as ready for review March 30, 2026 01:15
@texodus texodus merged commit 5dc4e03 into master Mar 30, 2026
28 of 30 checks passed
@texodus texodus deleted the themes-redesign branch March 30, 2026 01:17
@texodus texodus mentioned this pull request Apr 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking enhancement Feature requests or improvements

Development

Successfully merging this pull request may close these issues.

1 participant