From 15d3839aa4c986984acace9dcdbc37e44adf0cc4 Mon Sep 17 00:00:00 2001 From: Andrew Stein Date: Fri, 27 Mar 2026 13:47:08 -0400 Subject: [PATCH 1/2] Replace `less` with `css`, rename CSS theme variables for consistency Signed-off-by: Andrew Stein --- .gitignore | 1 + Cargo.lock | 603 ++++++++++++++---- docs/md/how_to/javascript/theming.md | 4 +- docs/src/css/regular_table_reset.css | 5 +- examples/blocks/src/fractal/index.css | 2 +- examples/esbuild-duckdb-virtual/src/index.ts | 3 +- packages/jupyterlab/build.mjs | 34 +- packages/jupyterlab/package.json | 2 +- .../src/{less/index.less => css/index.css} | 33 +- packages/viewer-d3fc/build.mjs | 28 +- packages/viewer-d3fc/package.json | 2 +- .../src/{less/chart.less => css/chart.css} | 128 ++-- .../viewer-d3fc/src/ts/series/colorStyles.ts | 10 +- .../viewer-d3fc/src/ts/series/seriesRange.ts | 4 +- .../src/ts/series/treemap/treemapLabel.ts | 2 +- packages/viewer-datagrid/build.mjs | 37 +- packages/viewer-datagrid/package.json | 2 +- .../src/css/mitered-headers.css | 64 ++ .../src/css/perspective-viewer-datagrid.css | 6 + .../src/{less/pro.less => css/pro.css} | 63 +- .../regular_table.css} | 318 ++++----- .../row-hover.less => css/row-hover.css} | 50 +- .../scrollbar.less => css/scrollbar.css} | 31 +- .../sub-cell-scroll.css} | 27 +- .../{less/toolbar.less => css/toolbar.css} | 85 +-- .../src/less/mitered-headers.less | 65 -- .../viewer-datagrid/src/ts/model/create.ts | 8 +- .../src/ts/style_handlers/body.ts | 2 +- .../ts/style_handlers/table_cell/datetime.ts | 21 +- packages/viewer-openlayers/build.mjs | 31 +- packages/viewer-openlayers/package.json | 2 +- .../src/css/perspective-viewer-openlayers.css | 2 + .../src/{less/plugin.less => css/plugin.css} | 33 +- .../src/themes/material.dark.css | 41 ++ .../src/themes/material.dark.less | 33 - packages/workspace/build.mjs | 118 ++-- packages/workspace/package.json | 2 +- packages/workspace/src/css/dockpanel.css | 110 ++++ .../{less/injected.less => css/injected.css} | 27 +- packages/workspace/src/css/menu.css | 130 ++++ packages/workspace/src/css/tabbar.css | 378 +++++++++++ .../src/{less/viewer.less => css/viewer.css} | 61 +- .../src/{less/widget.less => css/widget.css} | 42 +- .../workspace.less => css/workspace.css} | 54 +- packages/workspace/src/less/dockpanel.less | 105 --- packages/workspace/src/less/menu.less | 128 ---- packages/workspace/src/less/tabbar.less | 389 ----------- packages/workspace/src/svg/bookmark-icon.svg | 2 +- .../themes/{pro-dark.less => pro-dark.css} | 100 ++- .../src/themes/{pro.less => pro.css} | 111 ++-- .../workspace/src/ts/perspective-workspace.ts | 2 +- .../workspace/src/ts/workspace/dockpanel.ts | 2 +- .../workspace/src/ts/workspace/workspace.ts | 2 +- pnpm-lock.yaml | 323 +++++++--- pnpm-workspace.yaml | 2 +- .../perspective-js/src/rust/virtual_server.rs | 1 - rust/perspective-python/build.mjs | 29 +- rust/perspective-viewer/Cargo.toml | 3 +- rust/perspective-viewer/build.mjs | 100 +-- rust/perspective-viewer/build.rs | 45 +- rust/perspective-viewer/package.json | 5 +- .../aggregate-selector.css} | 43 +- .../src/css/column-dropdown.css | 109 ++++ .../column-selector.css} | 283 ++++---- .../column-settings-panel.css} | 122 ++-- .../column-style.css} | 104 +-- .../column-symbol-attributes.css} | 29 +- .../config-selector.css} | 269 ++++---- .../containers/dropdown-menu.css} | 39 +- .../containers/pairs-list.css} | 25 +- .../containers/scroll-panel.css} | 23 +- .../containers/split-panel.css} | 29 +- .../tabs.less => css/containers/tabs.css} | 36 +- .../src/css/dom/checkbox.css | 102 +++ .../src/css/dom/scrollbar.css | 35 + .../dom/select.less => css/dom/select.css} | 33 +- .../empty-column.css} | 37 +- .../expression-editor.css} | 37 +- .../filter-dropdown.css} | 23 +- .../filter-item.less => css/filter-item.css} | 31 +- .../form/code-editor.css} | 56 +- .../form/debug.less => css/form/debug.css} | 37 +- .../function-dropdown.css} | 23 +- .../src/css/plugin-selector.css | 261 ++++++++ .../render-warning.css} | 35 +- .../status-bar.less => css/status-bar.css} | 265 ++++---- rust/perspective-viewer/src/css/type-icon.css | 116 ++++ .../src/{less/viewer.less => css/viewer.css} | 200 +++--- .../src/less/column-dropdown.less | 95 --- .../src/less/dom/checkbox.less | 100 --- .../src/less/dom/scrollbar.less | 35 - .../src/less/plugin-selector.less | 183 ------ .../src/less/type-icon.less | 68 -- .../perspective-viewer/src/svg/bg-pattern.png | Bin 5809 -> 547 bytes .../perspective-viewer/src/svg/close-icon.svg | 2 +- .../perspective-viewer/src/svg/expression.svg | 2 +- .../src/svg/mega-menu-icons-candlestick.svg | 2 +- .../src/svg/mega-menu-icons-datagrid.svg | 3 +- .../src/svg/mega-menu-icons-heatmap.svg | 2 +- .../src/svg/mega-menu-icons-map-scatter.svg | 2 +- .../src/svg/mega-menu-icons-ohlc.svg | 2 +- .../src/svg/mega-menu-icons-sunburst.svg | 2 +- .../src/svg/mega-menu-icons-treemap.svg | 2 +- .../src/svg/mega-menu-icons-x-bar.svg | 2 +- .../src/svg/mega-menu-icons-x-y-line.svg | 2 +- .../src/svg/mega-menu-icons-x-y-scatter.svg | 2 +- .../src/svg/mega-menu-icons-y-area.svg | 2 +- .../src/svg/mega-menu-icons-y-bar.svg | 2 +- .../src/svg/mega-menu-icons-y-line.svg | 2 +- .../src/svg/mega-menu-icons-y-scatter.svg | 2 +- .../src/svg/radio-hover.svg | 2 +- rust/perspective-viewer/src/svg/radio-off.svg | 2 +- rust/perspective-viewer/src/svg/radio-on.svg | 2 +- .../src/themes/botanical.css | 157 +++++ .../src/themes/botanical.less | 142 ----- .../src/themes/defaults.css | 139 ++++ .../perspective-viewer/src/themes/dracula.css | 233 +++++++ .../src/themes/dracula.less | 101 --- .../src/themes/gruvbox-dark.css | 255 ++++++++ .../src/themes/gruvbox-dark.less | 116 ---- .../perspective-viewer/src/themes/gruvbox.css | 134 ++++ .../src/themes/gruvbox.less | 152 ----- rust/perspective-viewer/src/themes/icons.css | 124 ++++ rust/perspective-viewer/src/themes/icons.less | 130 ---- rust/perspective-viewer/src/themes/intl.css | 102 +++ rust/perspective-viewer/src/themes/intl.less | 102 --- .../perspective-viewer/src/themes/intl/de.css | 102 +++ .../src/themes/intl/de.less | 102 --- .../perspective-viewer/src/themes/intl/es.css | 102 +++ .../src/themes/intl/es.less | 102 --- .../perspective-viewer/src/themes/intl/fr.css | 102 +++ .../src/themes/intl/fr.less | 102 --- .../perspective-viewer/src/themes/intl/ja.css | 102 +++ .../src/themes/intl/ja.less | 102 --- .../perspective-viewer/src/themes/intl/pt.css | 102 +++ .../src/themes/intl/pt.less | 102 --- .../perspective-viewer/src/themes/intl/zh.css | 102 +++ .../src/themes/intl/zh.less | 102 --- .../perspective-viewer/src/themes/monokai.css | 233 +++++++ .../src/themes/monokai.less | 107 ---- .../src/themes/pro-dark.css | 158 +++++ .../src/themes/pro-dark.less | 147 ----- .../src/themes/{variables.less => pro.css} | 38 +- rust/perspective-viewer/src/themes/pro.less | 186 ------ .../src/themes/solarized-dark.css | 135 ++++ .../src/themes/solarized-dark.less | 78 --- .../src/themes/solarized.css | 95 +++ .../src/themes/solarized.less | 102 --- .../src/themes/{themes.less => themes.css} | 42 +- .../src/themes/vaporwave.css | 256 ++++++++ .../src/themes/vaporwave.less | 145 ----- .../js/viewer_config/localization.spec.ts | 2 +- rust/perspective-viewer/tools.mjs | 88 +++ rust/perspective/build.mjs | 11 +- tools/test/results.tar.gz | Bin 172951 -> 175819 bytes 155 files changed, 6645 insertions(+), 5264 deletions(-) rename packages/jupyterlab/src/{less/index.less => css/index.css} (68%) rename packages/viewer-d3fc/src/{less/chart.less => css/chart.css} (76%) create mode 100644 packages/viewer-datagrid/src/css/mitered-headers.css create mode 100644 packages/viewer-datagrid/src/css/perspective-viewer-datagrid.css rename packages/viewer-datagrid/src/{less/pro.less => css/pro.css} (70%) rename packages/viewer-datagrid/src/{less/regular_table.less => css/regular_table.css} (55%) rename packages/viewer-datagrid/src/{less/row-hover.less => css/row-hover.css} (66%) rename packages/viewer-datagrid/src/{less/scrollbar.less => css/scrollbar.css} (63%) rename packages/viewer-datagrid/src/{less/sub-cell-scroll.less => css/sub-cell-scroll.css} (79%) rename packages/viewer-datagrid/src/{less/toolbar.less => css/toolbar.css} (63%) delete mode 100644 packages/viewer-datagrid/src/less/mitered-headers.less create mode 100644 packages/viewer-openlayers/src/css/perspective-viewer-openlayers.css rename packages/viewer-openlayers/src/{less/plugin.less => css/plugin.css} (73%) create mode 100644 packages/viewer-openlayers/src/themes/material.dark.css delete mode 100644 packages/viewer-openlayers/src/themes/material.dark.less create mode 100644 packages/workspace/src/css/dockpanel.css rename packages/workspace/src/{less/injected.less => css/injected.css} (61%) create mode 100644 packages/workspace/src/css/menu.css create mode 100644 packages/workspace/src/css/tabbar.css rename packages/workspace/src/{less/viewer.less => css/viewer.css} (62%) rename packages/workspace/src/{less/widget.less => css/widget.css} (57%) rename packages/workspace/src/{less/workspace.less => css/workspace.css} (60%) delete mode 100644 packages/workspace/src/less/dockpanel.less delete mode 100644 packages/workspace/src/less/menu.less delete mode 100644 packages/workspace/src/less/tabbar.less rename packages/workspace/src/themes/{pro-dark.less => pro-dark.css} (73%) rename packages/workspace/src/themes/{pro.less => pro.css} (63%) rename rust/perspective-viewer/src/{less/aggregate-selector.less => css/aggregate-selector.css} (68%) create mode 100644 rust/perspective-viewer/src/css/column-dropdown.css rename rust/perspective-viewer/src/{less/column-selector.less => css/column-selector.css} (59%) rename rust/perspective-viewer/src/{less/column-settings-panel.less => css/column-settings-panel.css} (57%) rename rust/perspective-viewer/src/{less/column-style.less => css/column-style.css} (71%) rename rust/perspective-viewer/src/{less/column-symbol-attributes.less => css/column-symbol-attributes.css} (74%) rename rust/perspective-viewer/src/{less/config-selector.less => css/config-selector.css} (52%) rename rust/perspective-viewer/src/{less/containers/dropdown-menu.less => css/containers/dropdown-menu.css} (67%) rename rust/perspective-viewer/src/{less/containers/pairs-list.less => css/containers/pairs-list.css} (70%) rename rust/perspective-viewer/src/{less/containers/scroll-panel.less => css/containers/scroll-panel.css} (66%) rename rust/perspective-viewer/src/{less/containers/split-panel.less => css/containers/split-panel.css} (75%) rename rust/perspective-viewer/src/{less/containers/tabs.less => css/containers/tabs.css} (71%) create mode 100644 rust/perspective-viewer/src/css/dom/checkbox.css create mode 100644 rust/perspective-viewer/src/css/dom/scrollbar.css rename rust/perspective-viewer/src/{less/dom/select.less => css/dom/select.css} (68%) rename rust/perspective-viewer/src/{less/empty-column.less => css/empty-column.css} (72%) rename rust/perspective-viewer/src/{less/expression-editor.less => css/expression-editor.css} (78%) rename rust/perspective-viewer/src/{less/filter-dropdown.less => css/filter-dropdown.css} (73%) rename rust/perspective-viewer/src/{less/filter-item.less => css/filter-item.css} (81%) rename rust/perspective-viewer/src/{less/form/code-editor.less => css/form/code-editor.css} (69%) rename rust/perspective-viewer/src/{less/form/debug.less => css/form/debug.css} (71%) rename rust/perspective-viewer/src/{less/function-dropdown.less => css/function-dropdown.css} (71%) create mode 100644 rust/perspective-viewer/src/css/plugin-selector.css rename rust/perspective-viewer/src/{less/render-warning.less => css/render-warning.css} (72%) rename rust/perspective-viewer/src/{less/status-bar.less => css/status-bar.css} (61%) create mode 100644 rust/perspective-viewer/src/css/type-icon.css rename rust/perspective-viewer/src/{less/viewer.less => css/viewer.css} (58%) delete mode 100644 rust/perspective-viewer/src/less/column-dropdown.less delete mode 100644 rust/perspective-viewer/src/less/dom/checkbox.less delete mode 100644 rust/perspective-viewer/src/less/dom/scrollbar.less delete mode 100644 rust/perspective-viewer/src/less/plugin-selector.less delete mode 100644 rust/perspective-viewer/src/less/type-icon.less create mode 100644 rust/perspective-viewer/src/themes/botanical.css delete mode 100644 rust/perspective-viewer/src/themes/botanical.less create mode 100644 rust/perspective-viewer/src/themes/defaults.css create mode 100644 rust/perspective-viewer/src/themes/dracula.css delete mode 100644 rust/perspective-viewer/src/themes/dracula.less create mode 100644 rust/perspective-viewer/src/themes/gruvbox-dark.css delete mode 100644 rust/perspective-viewer/src/themes/gruvbox-dark.less create mode 100644 rust/perspective-viewer/src/themes/gruvbox.css delete mode 100644 rust/perspective-viewer/src/themes/gruvbox.less create mode 100644 rust/perspective-viewer/src/themes/icons.css delete mode 100644 rust/perspective-viewer/src/themes/icons.less create mode 100644 rust/perspective-viewer/src/themes/intl.css delete mode 100644 rust/perspective-viewer/src/themes/intl.less create mode 100644 rust/perspective-viewer/src/themes/intl/de.css delete mode 100644 rust/perspective-viewer/src/themes/intl/de.less create mode 100644 rust/perspective-viewer/src/themes/intl/es.css delete mode 100644 rust/perspective-viewer/src/themes/intl/es.less create mode 100644 rust/perspective-viewer/src/themes/intl/fr.css delete mode 100644 rust/perspective-viewer/src/themes/intl/fr.less create mode 100644 rust/perspective-viewer/src/themes/intl/ja.css delete mode 100644 rust/perspective-viewer/src/themes/intl/ja.less create mode 100644 rust/perspective-viewer/src/themes/intl/pt.css delete mode 100644 rust/perspective-viewer/src/themes/intl/pt.less create mode 100644 rust/perspective-viewer/src/themes/intl/zh.css delete mode 100644 rust/perspective-viewer/src/themes/intl/zh.less create mode 100644 rust/perspective-viewer/src/themes/monokai.css delete mode 100644 rust/perspective-viewer/src/themes/monokai.less create mode 100644 rust/perspective-viewer/src/themes/pro-dark.css delete mode 100644 rust/perspective-viewer/src/themes/pro-dark.less rename rust/perspective-viewer/src/themes/{variables.less => pro.css} (54%) delete mode 100644 rust/perspective-viewer/src/themes/pro.less create mode 100644 rust/perspective-viewer/src/themes/solarized-dark.css delete mode 100644 rust/perspective-viewer/src/themes/solarized-dark.less create mode 100644 rust/perspective-viewer/src/themes/solarized.css delete mode 100644 rust/perspective-viewer/src/themes/solarized.less rename rust/perspective-viewer/src/themes/{themes.less => themes.css} (53%) create mode 100644 rust/perspective-viewer/src/themes/vaporwave.css delete mode 100644 rust/perspective-viewer/src/themes/vaporwave.less create mode 100644 rust/perspective-viewer/tools.mjs diff --git a/.gitignore b/.gitignore index 3130ad18c3..30e1695322 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ __pycache__/ .clangd .DS_Store .emsdk +.plan .pnpm-store .ipynb_checkpoints .perspectiverc diff --git a/Cargo.lock b/Cargo.lock index 87deef98fc..6d1026aa32 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,17 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.16", + "once_cell", + "version_check", +] + [[package]] name = "ahash" version = "0.8.12" @@ -96,7 +107,7 @@ version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c8955af33b25f3b175ee10af580577280b4bd01f7e823d94c7cdef7cf8c9aef" dependencies = [ - "ahash", + "ahash 0.8.12", "arrow-buffer", "arrow-data", "arrow-schema", @@ -159,7 +170,7 @@ version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68bf3e3efbd1278f770d67e5dc410257300b161b93baedb3aae836144edcaf4b" dependencies = [ - "ahash", + "ahash 0.8.12", "arrow-array", "arrow-buffer", "arrow-data", @@ -260,6 +271,15 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64-simd" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" +dependencies = [ + "simd-abstraction", +] + [[package]] name = "basic-toml" version = "0.1.10" @@ -284,6 +304,18 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -299,6 +331,28 @@ version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "bytes" version = "1.11.0" @@ -506,6 +560,35 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "const-str" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" +dependencies = [ + "const-str-proc-macro", +] + +[[package]] +name = "const-str-proc-macro" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -562,6 +645,38 @@ dependencies = [ "typenum", ] +[[package]] +name = "cssparser" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf", + "smallvec", +] + +[[package]] +name = "cssparser-color" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" +dependencies = [ + "cssparser", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.111", +] + [[package]] name = "cxx" version = "1.0.190" @@ -624,12 +739,34 @@ dependencies = [ "syn 2.0.111", ] +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "data-encoding" version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +[[package]] +name = "data-url" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" +dependencies = [ + "matches", +] + [[package]] name = "derivative" version = "2.2.0" @@ -647,12 +784,6 @@ version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abd57806937c9cc163efc8ea3910e00a62e2aeb0b8119f1793a978088f8f6b04" -[[package]] -name = "difflib" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" - [[package]] name = "diffy" version = "0.3.0" @@ -694,10 +825,19 @@ dependencies = [ ] [[package]] -name = "downcast" -version = "0.11.0" +name = "dtoa" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] [[package]] name = "either" @@ -795,15 +935,6 @@ dependencies = [ "rustc_version", ] -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" -dependencies = [ - "num-traits", -] - [[package]] name = "fnv" version = "1.0.7" @@ -832,10 +963,10 @@ dependencies = [ ] [[package]] -name = "fragile" -version = "2.0.1" +name = "funty" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dd6caf6059519a65843af8fe2a3ae298b14b80179855aeb4adc2c1934ee619" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" @@ -1198,6 +1329,15 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" @@ -1548,6 +1688,46 @@ dependencies = [ "libc", ] +[[package]] +name = "lightningcss" +version = "1.0.0-alpha.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6314c2f0590ac93c86099b98bb7ba8abcf759bfd89604ffca906472bb54937" +dependencies = [ + "ahash 0.8.12", + "bitflags", + "const-str", + "cssparser", + "cssparser-color", + "dashmap", + "data-encoding", + "getrandom 0.3.4", + "indexmap 2.12.1", + "itertools 0.10.5", + "lazy_static", + "lightningcss-derive", + "parcel_selectors", + "parcel_sourcemap", + "pastey", + "pathdiff", + "rayon", + "serde", + "serde-content", + "smallvec", +] + +[[package]] +name = "lightningcss-derive" +version = "1.0.0-alpha.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12744d1279367caed41739ef094c325d53fb0ffcd4f9b84a368796f870252" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "link-cplusplus" version = "1.0.12" @@ -1603,6 +1783,12 @@ dependencies = [ "regex-automata", ] +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + [[package]] name = "matchit" version = "0.8.4" @@ -1679,33 +1865,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "mockall" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" -dependencies = [ - "cfg-if", - "downcast", - "fragile", - "lazy_static", - "mockall_derive", - "predicates", - "predicates-tree", -] - -[[package]] -name = "mockall_derive" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" -dependencies = [ - "cfg-if", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "multimap" version = "0.10.1" @@ -1722,12 +1881,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "normalize-line-endings" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" - [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1819,12 +1972,48 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "outref" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" + [[package]] name = "overload" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "parcel_selectors" +version = "0.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54fd03f1ad26cb6b3ec1b7414fa78a3bd639e7dbb421b1a60513c96ce886a196" +dependencies = [ + "bitflags", + "cssparser", + "log", + "phf", + "phf_codegen", + "precomputed-hash", + "rustc-hash", + "smallvec", +] + +[[package]] +name = "parcel_sourcemap" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" +dependencies = [ + "base64-simd", + "data-url", + "rkyv", + "serde", + "serde_json", + "vlq", +] + [[package]] name = "parking_lot" version = "0.12.5" @@ -1854,6 +2043,18 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + [[package]] name = "percent-encoding" version = "2.3.2" @@ -1905,7 +2106,7 @@ dependencies = [ "prost-build", "prost-types", "protobuf-src", - "rand", + "rand 0.9.1", "serde", "serde_bytes", "serde_json", @@ -2014,11 +2215,11 @@ dependencies = [ "glob", "itertools 0.14.0", "js-sys", + "lightningcss", "macro_rules_attribute", "nom", "perspective-client", "perspective-js", - "procss", "serde", "serde-wasm-bindgen", "serde_json", @@ -2045,6 +2246,58 @@ dependencies = [ "indexmap 2.12.1", ] +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project" version = "1.1.10" @@ -2119,34 +2372,10 @@ dependencies = [ ] [[package]] -name = "predicates" -version = "2.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" -dependencies = [ - "difflib", - "float-cmp", - "itertools 0.10.5", - "normalize-line-endings", - "predicates-core", - "regex", -] - -[[package]] -name = "predicates-core" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" - -[[package]] -name = "predicates-tree" -version = "1.0.12" +name = "precomputed-hash" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" -dependencies = [ - "predicates-core", - "termtree", -] +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "prettyplease" @@ -2201,23 +2430,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "procss" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aab2f146f9f527c7e31c6d2cc8d57765686aa4cee61e4aad1077a12574a3291" -dependencies = [ - "anyhow", - "base64", - "console_error_panic_hook", - "js-sys", - "mockall", - "nom", - "serde-wasm-bindgen", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "prost" version = "0.12.6" @@ -2279,6 +2491,26 @@ dependencies = [ "cmake", ] +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "pyo3" version = "0.25.1" @@ -2401,6 +2633,21 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "rand" version = "0.9.1" @@ -2408,7 +2655,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha", - "rand_core", + "rand_core 0.9.3", ] [[package]] @@ -2418,9 +2665,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.9.3", ] +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + [[package]] name = "rand_core" version = "0.9.3" @@ -2499,6 +2752,44 @@ version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rkyv" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rust-axum" version = "4.3.0" @@ -2518,6 +2809,12 @@ version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + [[package]] name = "rustc_version" version = "0.4.1" @@ -2573,6 +2870,12 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2" +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "semver" version = "0.9.0" @@ -2608,6 +2911,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-content" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3753ca04f350fa92d00b6146a3555e63c55388c9ef2e11e09bce2ff1c0b509c6" +dependencies = [ + "serde", +] + [[package]] name = "serde-wasm-bindgen" version = "0.6.5" @@ -2753,6 +3065,27 @@ dependencies = [ "libc", ] +[[package]] +name = "simd-abstraction" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" +dependencies = [ + "outref", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" + [[package]] name = "slab" version = "0.4.11" @@ -2905,6 +3238,12 @@ dependencies = [ "lock_api", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "target-lexicon" version = "0.13.3" @@ -2933,12 +3272,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "termtree" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" - [[package]] name = "thiserror" version = "1.0.69" @@ -2997,6 +3330,21 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.48.0" @@ -3283,7 +3631,7 @@ dependencies = [ "http 1.4.0", "httparse", "log", - "rand", + "rand 0.9.1", "sha1", "thiserror 2.0.17", "utf-8", @@ -3307,6 +3655,12 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + [[package]] name = "unicode-width" version = "0.1.14" @@ -3343,6 +3697,16 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "valuable" version = "0.1.1" @@ -3355,6 +3719,12 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vlq" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" + [[package]] name = "walkdir" version = "2.5.0" @@ -3418,8 +3788,6 @@ dependencies = [ "cfg-if", "once_cell", "rustversion", - "serde", - "serde_json", "wasm-bindgen-macro", "wasm-bindgen-shared", ] @@ -3882,6 +4250,15 @@ version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "yew" version = "0.22.0" diff --git a/docs/md/how_to/javascript/theming.md b/docs/md/how_to/javascript/theming.md index 41d84d7ea8..ebfe66b9fd 100644 --- a/docs/md/how_to/javascript/theming.md +++ b/docs/md/how_to/javascript/theming.md @@ -79,12 +79,12 @@ theme-able variable to get a functional UI. ### Icons and Translation UI icons are defined by CSS variables provided by -[`@perspective-dev/viewer/dist/css/icons.css`](https://github.com/perspective-dev/perspective/blob/master/rust/perspective-viewer/src/themes/icons.less). +[`@perspective-dev/viewer/dist/css/icons.css`](https://github.com/perspective-dev/perspective/blob/master/rust/perspective-viewer/src/themes/icons.css). These variables must be defined for the UI icons to work - there are no default icons without a theme. UI text is also defined in CSS variables provided by -[`@perspective-dev/viewer/dist/css/intl.css`](https://github.com/perspective-dev/perspective/blob/master/rust/perspective-viewer/src/themes/intl.less), +[`@perspective-dev/viewer/dist/css/intl.css`](https://github.com/perspective-dev/perspective/blob/master/rust/perspective-viewer/src/themes/intl.css), and has identical import requirements. Some _example definitions_ (automatically-translated sans-editing) can be found [`@perspective-dev/viewer/dist/css/intl/` folder](https://github.com/perspective-dev/perspective/tree/master/rust/perspective-viewer/src/themes/intl). diff --git a/docs/src/css/regular_table_reset.css b/docs/src/css/regular_table_reset.css index 2b5db896b6..3c83b0a9eb 100644 --- a/docs/src/css/regular_table_reset.css +++ b/docs/src/css/regular_table_reset.css @@ -18,8 +18,9 @@ tbody, table thead { border: 0; font-size: 12px; - font-family: "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", - "Consolas", "Liberation Mono", monospace; + font-family: + "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas", + "Liberation Mono", monospace; margin: 0; padding: 0; vertical-align: middle; diff --git a/examples/blocks/src/fractal/index.css b/examples/blocks/src/fractal/index.css index dfba871141..0ce58160c6 100644 --- a/examples/blocks/src/fractal/index.css +++ b/examples/blocks/src/fractal/index.css @@ -19,7 +19,7 @@ perspective-viewer { perspective-viewer[theme="Pro Light"], perspective-viewer[theme="Pro Dark"] { - --d3fc-positive--gradient: linear-gradient( + --psp-d3fc--pos-gradient--background: linear-gradient( #94d0ff, #8795e8, #966bff, diff --git a/examples/esbuild-duckdb-virtual/src/index.ts b/examples/esbuild-duckdb-virtual/src/index.ts index 7db1aefa56..9db268e3be 100644 --- a/examples/esbuild-duckdb-virtual/src/index.ts +++ b/examples/esbuild-duckdb-virtual/src/index.ts @@ -61,7 +61,6 @@ async function initializeDuckDB() { } async function loadSampleData(db: duckdb.AsyncDuckDBConnection) { - // const c = await db.connect(); try { const response = await fetch(SUPERSTORE_ARROW); const arrayBuffer = await response.arrayBuffer(); @@ -83,6 +82,6 @@ const client = await perspective.worker(server); const viewer = document.querySelector("perspective-viewer")!; viewer.load(client); viewer.restore({ - table: "data_source_one", + table: "memory.data_source_one", group_by: ["State"], }); diff --git a/packages/jupyterlab/build.mjs b/packages/jupyterlab/build.mjs index c72c5fa2af..9b460357db 100644 --- a/packages/jupyterlab/build.mjs +++ b/packages/jupyterlab/build.mjs @@ -14,13 +14,17 @@ import { WasmPlugin } from "@perspective-dev/esbuild-plugin/wasm.js"; import { WorkerPlugin } from "@perspective-dev/esbuild-plugin/worker.js"; import { build } from "@perspective-dev/esbuild-plugin/build.js"; import * as path from "node:path"; -import { BuildCss } from "@prospective.co/procss/target/cjs/procss.js"; +import { bundleAsync as bundleCss, composeVisitors } from "lightningcss"; import * as fs from "node:fs"; import * as url from "node:url"; -import { createRequire } from "node:module"; +// import { createRequire } from "node:module"; import { execSync } from "node:child_process"; +import { + resolveNPM, + inlineUrlVisitor, +} from "@perspective-dev/viewer/tools.mjs"; -const _require = createRequire(import.meta.url); +// const _require = createRequire(import.meta.url); const __dirname = url.fileURLToPath(new URL(".", import.meta.url)).slice(0, -1); const NBEXTENSION_PATH = path.resolve( @@ -105,13 +109,6 @@ const NB_BUILDS = [ // }, ]; -function add(builder, path, path2) { - builder.add( - path, - fs.readFileSync(_require.resolve(path2 || path)).toString(), - ); -} - const IS_TEST = process.argv.some((x) => x === "--test"); const BUILD = IS_TEST ? [LAB_BUILD, ...NB_BUILDS, TEST_BUILD] @@ -119,16 +116,17 @@ const BUILD = IS_TEST async function build_all() { fs.mkdirSync("dist/css", { recursive: true }); - const builder3 = new BuildCss(""); - add(builder3, "@perspective-dev/viewer/dist/css/themes.css"); - add(builder3, "./index.less", "./src/less/index.less"); - fs.writeFileSync( - "dist/css/perspective-jupyterlab.css", - builder3.compile().get("index.css"), - ); + const filename = path.resolve(__dirname, "src/css/index.css"); + const { code } = await bundleCss({ + filename, + minify: true, + visitor: inlineUrlVisitor(filename), + resolver: resolveNPM(import.meta.url), + }); + fs.writeFileSync("dist/css/perspective-jupyterlab.css", code); await Promise.all(BUILD.map(build)).catch(() => process.exit(1)); - fs.cpSync("src/less", "dist/less", { recursive: true }); + fs.cpSync("src/css", "dist/css/src", { recursive: true }); execSync("jupyter labextension build .", { stdio: "inherit", }); diff --git a/packages/jupyterlab/package.json b/packages/jupyterlab/package.json index 82109088aa..7231755ca7 100644 --- a/packages/jupyterlab/package.json +++ b/packages/jupyterlab/package.json @@ -38,7 +38,7 @@ "@perspective-dev/esbuild-plugin": "workspace:", "@perspective-dev/test": "workspace:", "@jupyterlab/builder": "^4", - "@prospective.co/procss": "^0.1.16", + "lightningcss": "catalog:", "copy-webpack-plugin": "~12", "zx": "^8.1.8" }, diff --git a/packages/jupyterlab/src/less/index.less b/packages/jupyterlab/src/css/index.css similarity index 68% rename from packages/jupyterlab/src/less/index.less rename to packages/jupyterlab/src/css/index.css index cea5e70e03..c17514c8d3 100644 --- a/packages/jupyterlab/src/less/index.less +++ b/packages/jupyterlab/src/css/index.css @@ -1,14 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ @import "@perspective-dev/viewer/dist/css/themes.css"; @@ -25,18 +26,18 @@ div.PSPContainer { resize: vertical; } -// Widget height for Jupyterlab +/* Widget height for Jupyterlab */ .jp-NotebookPanel-notebook div.PSPContainer { height: 520px; } -// Widget height for Jupyter Notebook +/* Widget height for Jupyter Notebook */ .jupyter-widgets-view div.PSPContainer { height: 520px; } -// Widget height for Voila -// Widget height for VS Code +/* Widget height for Voila */ +/* Widget height for VS Code */ body[data-voila="voila"] .jp-OutputArea-output div.PSPContainer, body[data-vscode-theme-id] .cell-output-ipywidget-background div.PSPContainer { min-height: 520px; @@ -44,7 +45,7 @@ body[data-vscode-theme-id] .cell-output-ipywidget-background div.PSPContainer { } div.PSPContainer perspective-viewer[theme="Pro Light"] { - --plugin--border: 1px solid #e0e0e0; + --psp-plugin--border: 1px solid #e0e0e0; } div.PSPContainer perspective-viewer { diff --git a/packages/viewer-d3fc/build.mjs b/packages/viewer-d3fc/build.mjs index a64cb10cc5..37906415f4 100644 --- a/packages/viewer-d3fc/build.mjs +++ b/packages/viewer-d3fc/build.mjs @@ -12,13 +12,10 @@ import { NodeModulesExternal } from "@perspective-dev/esbuild-plugin/external.js"; import { build } from "@perspective-dev/esbuild-plugin/build.js"; -import { BuildCss } from "@prospective.co/procss/target/cjs/procss.js"; -import { promisify } from "node:util"; +import { bundle as bundleCss } from "lightningcss"; import { execSync } from "node:child_process"; import * as fs from "node:fs"; -import * as path_mod from "node:path"; - -const exec = promisify(execSync); +import { inlineUrlVisitor } from "@perspective-dev/viewer/tools.mjs"; const BUILD = [ { @@ -74,21 +71,14 @@ const BUILD = [ }, ]; -function add(builder, path) { - builder.add( - path, - fs.readFileSync(path_mod.join("./src/less", path)).toString(), - ); -} - async function compile_css() { fs.mkdirSync("dist/css", { recursive: true }); - const builder = new BuildCss(""); - add(builder, "./chart.less"); - fs.writeFileSync( - "dist/css/perspective-viewer-d3fc.css", - builder.compile().get("chart.css"), - ); + const { code } = bundleCss({ + filename: "./src/css/chart.css", + minify: true, + visitor: inlineUrlVisitor("./src/css/chart.css"), + }); + fs.writeFileSync("dist/css/perspective-viewer-d3fc.css", code); } async function build_all() { @@ -100,7 +90,7 @@ async function build_all() { // esbuild can handle typescript files, and strips out types from the output, // but it is unable to check types, so we must run tsc as a separate step. try { - await exec("tsc", { stdio: "inherit" }); + execSync("tsc", { stdio: "inherit" }); } catch (error) { console.error(error); // tsc errors tend to get buried when running multiple package builds. If diff --git a/packages/viewer-d3fc/package.json b/packages/viewer-d3fc/package.json index 100ca74ea6..b26c4d7b82 100644 --- a/packages/viewer-d3fc/package.json +++ b/packages/viewer-d3fc/package.json @@ -72,7 +72,7 @@ "devDependencies": { "@perspective-dev/esbuild-plugin": "workspace:", "@perspective-dev/test": "workspace:", - "@prospective.co/procss": "catalog:", + "lightningcss": "catalog:", "@types/d3": "catalog:", "typescript": "catalog:" } diff --git a/packages/viewer-d3fc/src/less/chart.less b/packages/viewer-d3fc/src/css/chart.css similarity index 76% rename from packages/viewer-d3fc/src/less/chart.less rename to packages/viewer-d3fc/src/css/chart.css index faf92969e8..282e90e811 100644 --- a/packages/viewer-d3fc/src/less/chart.less +++ b/packages/viewer-d3fc/src/css/chart.css @@ -1,23 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@mixin icon { - background-repeat: no-repeat; - background-color: var(--icon--color); - content: ""; - display: inline-block; - -webkit-mask-size: cover; - mask-size: cover; -} +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { user-select: none; @@ -38,8 +30,8 @@ } text { - // `font-family` does not apply to `` nodes via inheritance. - font-family: var(--interface-monospace--font-family); + /* `font-family` does not apply to `` nodes via inheritance. */ + font-family: var(--psp-interface-monospace--font-family); } &.heatmap, @@ -80,7 +72,7 @@ display: flex; justify-content: center; align-items: center; - background: var(--d3fc-legend--background); + background: var(--psp-d3fc--legend--background); } & .multi-ylabel { position: absolute; @@ -90,7 +82,7 @@ display: flex; justify-content: center; align-items: center; - background: var(--d3fc-legend--background); + background: var(--psp-d3fc--legend--background); } & .outer-container { @@ -114,7 +106,7 @@ text-anchor: middle; user-select: none; pointer-events: none; - fill: var(--d3fc-treedata--labels, rgb(51, 51, 51)); + fill: var(--psp-d3fc--treemap--labels, rgb(51, 51, 51)); } & div.xy-scatter-container { @@ -151,7 +143,10 @@ } & path { - fill: var(--d3fc-series, rgba(31, 119, 180, 0.5)); + fill: var( + --psp-d3fc--series--color, + rgba(31, 119, 180, 0.5) + ); } & text.segment, @@ -159,7 +154,7 @@ text-anchor: middle; user-select: none; pointer-events: none; - fill: var(--d3fc-treedata--labels, rgb(51, 51, 51)); + fill: var(--psp-d3fc--treemap--labels, rgb(51, 51, 51)); } & div.title-container { @@ -206,13 +201,19 @@ & .treerect { stroke: var( - --d3fc-treedata-axis--lines, - var(--d3fc-axis--lines, white) + --psp-d3fc--treemap-axis--lines, + var(--psp-d3fc--axis-lines--color, white) + ); + fill: var( + --psp-d3fc--series--color, + rgba(31, 119, 180, 0.5) ); - fill: var(--d3fc-series, rgba(31, 119, 180, 0.5)); &:hover { cursor: pointer; - stroke: var(--d3fc-treedata--hover-highlight, black); + stroke: var( + --psp-d3fc--treemap--hover-highlight, + black + ); stroke-opacity: 1; } } @@ -226,7 +227,7 @@ &:hover { fill-opacity: 0.1; opacity: 1; - fill: var(--d3fc-treedata--hover-highlight, black); + fill: var(--psp-d3fc--treemap--hover-highlight, black); } } & .leafnode { @@ -257,7 +258,7 @@ z-index: 4; } & text { - fill: var(--d3fc-treedata--labels, rgb(51, 51, 51)); + fill: var(--psp-d3fc--treemap--labels, rgb(51, 51, 51)); &.title { dominant-baseline: hanging; } @@ -286,7 +287,7 @@ & .x-label, & .y-label { - color: var(--d3fc-label--color, inherit); + color: var(--psp-d3fc--label--color, inherit); font-size: 14px; } @@ -306,13 +307,13 @@ & .y-axis text, & .y2-axis text, & .x-axis text { - fill: var(--d3fc-axis-ticks--color, rgb(80, 80, 80)); + fill: var(--psp-d3fc--axis-ticks--color, rgb(80, 80, 80)); font-size: 11px; } & .y-axis path, & .y2-axis path, & .x-axis path { - stroke: var(--d3fc-axis--lines, rgb(180, 210, 225)); + stroke: var(--psp-d3fc--axis-lines--color, rgb(180, 210, 225)); } & .splitter-label { @@ -322,12 +323,12 @@ &::after { margin-left: 5px; - color: var(--d3fc-axis--lines, rgb(180, 210, 225)); + color: var(--psp-d3fc--axis-lines--color, rgb(180, 210, 225)); } &:hover { &::after { - color: var(--d3fc-axis-ticks--color, rgb(80, 80, 80)); + color: var(--psp-d3fc--axis-ticks--color, rgb(80, 80, 80)); } } @@ -340,19 +341,29 @@ } & .y-label.left-label .splitter-label::after { - @include icon; + background-repeat: no-repeat; + background-color: var(--psp--color); + content: ""; + display: inline-block; + -webkit-mask-size: cover; + mask-size: cover; width: 16px; height: 12px; - -webkit-mask-image: var(--sort-desc-icon--mask-image); - mask-image: var(--sort-desc-icon--mask-image); + -webkit-mask-image: var(--psp-icon--sort-desc--mask-image); + mask-image: var(--psp-icon--sort-desc--mask-image); } & .y-label.right-label .splitter-label::after { - @include icon; + background-repeat: no-repeat; + background-color: var(--psp--color); + content: ""; + display: inline-block; + -webkit-mask-size: cover; + mask-size: cover; width: 16px; height: 12px; - -webkit-mask-image: var(--sort-asc-icon--mask-image); - mask-image: var(--sort-asc-icon--mask-image); + -webkit-mask-image: var(--psp-icon--sort-asc--mask-image); + mask-image: var(--psp-icon--sort-asc--mask-image); } &.ybar .y-axis path, @@ -378,7 +389,7 @@ } & .nearbyTip { - fill: var(--d3fc-series, rgba(31, 119, 180, 0.5)); + fill: var(--psp-d3fc--series--color, rgba(31, 119, 180, 0.5)); } } @@ -413,7 +424,7 @@ &[borderbox-on-hover="true"] { transition: box-shadow 1s; &:hover { - background-color: var(--d3fc-legend--background, #ffffff); + background-color: var(--psp-d3fc--legend--background, #ffffff); transition: box-shadow 0.2s, background-color 0.2s; @@ -428,8 +439,11 @@ cursor: pointer; & path { - fill: var(--d3fc-series, rgba(31, 119, 180, 0.5)); - stroke: var(--d3fc-series, rgb(31, 119, 180)); + fill: var( + --psp-d3fc--series--color, + rgba(31, 119, 180, 0.5) + ); + stroke: var(--psp-d3fc--series--color, rgb(31, 119, 180)); } &.hidden path { fill: rgba(204, 204, 204, 0.5); @@ -443,7 +457,7 @@ } & text { - fill: var(--d3fc-legend--text, rgb(51, 51, 51)); + fill: var(--psp-d3fc--legend--color, rgb(51, 51, 51)); } & .label { @@ -453,7 +467,7 @@ } & #legend-axis path { - stroke: var(--d3fc-legend--text, rgb(51, 51, 51)); + stroke: var(--psp-d3fc--legend--color, rgb(51, 51, 51)); } & .legend-controls { @@ -494,9 +508,9 @@ & button { -webkit-appearance: none; - background: var(--plugin--background, rgb(247, 247, 247)); - border: 1px solid var(--inactive--color, rgb(204, 204, 204)); - color: var(--d3fc-label--color, inherit); + background: var(--psp--background-color, rgb(247, 247, 247)); + border: 1px solid var(--psp-inactive--color, rgb(204, 204, 204)); + color: var(--psp-d3fc--label--color, inherit); font-size: 12px; padding: 8px; opacity: 0.5; @@ -535,10 +549,10 @@ font-weight: 300; white-space: nowrap; padding: 0.5em; - background: var(--d3fc-tooltip--background, #ffffff); - color: var(--d3fc-tooltip--color, black); - border: 1px solid var(--d3fc-tooltip--border-color, #777777); - box-shadow: var(--d3fc-tooltip--box-shadow, none); + background: var(--psp-d3fc--tooltip--background, #ffffff); + color: var(--psp-d3fc--tooltip--color, black); + border: 1px solid var(--psp-d3fc--tooltip--border-color, #777777); + box-shadow: var(--psp-d3fc--tooltip--box-shadow, none); pointer-events: none; } diff --git a/packages/viewer-d3fc/src/ts/series/colorStyles.ts b/packages/viewer-d3fc/src/ts/series/colorStyles.ts index 55b4fc3752..267de95b05 100644 --- a/packages/viewer-d3fc/src/ts/series/colorStyles.ts +++ b/packages/viewer-d3fc/src/ts/series/colorStyles.ts @@ -27,10 +27,10 @@ export const initialiseStyles = ( }; const computed = computedStyle(container); - styles["series"] = computed(`--d3fc-series`); + styles["series"] = computed(`--psp-d3fc--series--color`); for (let i = 1; ; i++) { const key = `series-${i}`; - const color = computed(`--d3fc-${key}`); + const color = computed(`--psp-d3fc--${key}--color`); if (!color) { break; } @@ -40,11 +40,11 @@ export const initialiseStyles = ( } styles.opacity = getOpacityFromColor(styles.series); - styles.grid.gridLineColor = computed`--d3fc-gridline--color`; + styles.grid.gridLineColor = computed`--psp-d3fc--gridline--color`; - const gradients = ["full", "positive", "negative"]; + const gradients = ["full", "pos", "neg"]; gradients.forEach((g) => { - const gradient = computed(`--d3fc-${g}--gradient`); + const gradient = computed(`--psp-d3fc--${g}-gradient--background`); styles.gradient[g] = parseGradient(gradient, styles.opacity); }); diff --git a/packages/viewer-d3fc/src/ts/series/seriesRange.ts b/packages/viewer-d3fc/src/ts/series/seriesRange.ts index 1f93bac2c0..34f3f1bdd9 100644 --- a/packages/viewer-d3fc/src/ts/series/seriesRange.ts +++ b/packages/viewer-d3fc/src/ts/series/seriesRange.ts @@ -33,9 +33,9 @@ export function seriesColorRange( let gradient = settings.colorStyles.gradient.full; if (extent[0] >= 0) { - gradient = settings.colorStyles.gradient.positive; + gradient = settings.colorStyles.gradient.pos; } else if (extent[1] <= 0) { - gradient = settings.colorStyles.gradient.negative; + gradient = settings.colorStyles.gradient.neg; } else { const maxVal = Math.max(-extent[0], extent[1]); extent = [-maxVal, maxVal]; diff --git a/packages/viewer-d3fc/src/ts/series/treemap/treemapLabel.ts b/packages/viewer-d3fc/src/ts/series/treemap/treemapLabel.ts index b6e4776edd..ff73fb5421 100644 --- a/packages/viewer-d3fc/src/ts/series/treemap/treemapLabel.ts +++ b/packages/viewer-d3fc/src/ts/series/treemap/treemapLabel.ts @@ -41,7 +41,7 @@ export const restoreLabels = (nodes) => { export const preventTextCollisions = (nodes) => { const textCollisionFuzzFactorPx = -2; - const textAdjustPx = 14; // This should remain the same as the css value for .top => font-size in the chart.less + const textAdjustPx = 14; // This should remain the same as the css value for .top => font-size in the chart.css const rect = (element): DOMRect => element.getBoundingClientRect(); const topNodes = []; diff --git a/packages/viewer-datagrid/build.mjs b/packages/viewer-datagrid/build.mjs index 1669e69556..7583c57265 100644 --- a/packages/viewer-datagrid/build.mjs +++ b/packages/viewer-datagrid/build.mjs @@ -12,9 +12,9 @@ import { NodeModulesExternal } from "@perspective-dev/esbuild-plugin/external.js"; import { build } from "@perspective-dev/esbuild-plugin/build.js"; -import { BuildCss } from "@prospective.co/procss/target/cjs/procss.js"; +import { bundle as bundleCss } from "lightningcss"; import * as fs from "node:fs"; -import * as path_mod from "node:path"; +import { inlineUrlVisitor } from "@perspective-dev/viewer/tools.mjs"; import "zx/globals"; @@ -47,32 +47,23 @@ const BUILD = [ }, ]; -function add(builder, path) { - builder.add( - path, - fs.readFileSync(path_mod.join("./src/less", path)).toString(), - ); -} - async function compile_css() { fs.mkdirSync("dist/css", { recursive: true }); - const builder1 = new BuildCss(""); - add(builder1, "./pro.less"); - add(builder1, "./mitered-headers.less"); - add(builder1, "./row-hover.less"); - add(builder1, "./sub-cell-scroll.less"); - add(builder1, "./scrollbar.less"); - add(builder1, "./regular_table.less"); - fs.writeFileSync( - "dist/css/perspective-viewer-datagrid.css", - builder1.compile().get("regular_table.css"), - ); + const { code: datagridCode } = bundleCss({ + filename: "./src/css/perspective-viewer-datagrid.css", + minify: true, + visitor: inlineUrlVisitor("./src/css/perspective-viewer-datagrid.css"), + }); + fs.writeFileSync("dist/css/perspective-viewer-datagrid.css", datagridCode); - const builder2 = new BuildCss(""); - add(builder2, "./toolbar.less"); + const { code: toolbarCode } = bundleCss({ + filename: "./src/css/toolbar.css", + minify: true, + visitor: inlineUrlVisitor("./src/css/toolbar.css"), + }); fs.writeFileSync( "dist/css/perspective-viewer-datagrid-toolbar.css", - builder2.compile().get("toolbar.css"), + toolbarCode, ); } diff --git a/packages/viewer-datagrid/package.json b/packages/viewer-datagrid/package.json index d51a40d55b..fc273fd9d0 100644 --- a/packages/viewer-datagrid/package.json +++ b/packages/viewer-datagrid/package.json @@ -39,7 +39,7 @@ "regular-table": "catalog:" }, "devDependencies": { - "@prospective.co/procss": "catalog:", + "lightningcss": "catalog:", "@perspective-dev/esbuild-plugin": "workspace:", "@perspective-dev/test": "workspace:", "@types/chroma-js": "catalog:", diff --git a/packages/viewer-datagrid/src/css/mitered-headers.css b/packages/viewer-datagrid/src/css/mitered-headers.css new file mode 100644 index 0000000000..0c8a1f6f08 --- /dev/null +++ b/packages/viewer-datagrid/src/css/mitered-headers.css @@ -0,0 +1,64 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ + +.psp-header-border:not(.psp-is-top):not(.psp-header-leaf) { + /* right */ + box-shadow: 1px 0px var(--psp-inactive--border-color, #8b868045); +} + +.psp-header-group { + /* bottom */ + box-shadow: 0px 10px 0 -9px var(--psp-inactive--border-color, #8b868045); +} + +.psp-is-top { + /* top-miter-right */ + box-shadow: 5px 4px 0px -4px var(--psp-inactive--border-color, #8b868045); +} + +.psp-is-top.psp-header-group:not(.psp-header-group-corner) { + /* top-miter-right and bottom */ + box-shadow: + 5px 4px 0px -4px var(--psp-inactive--border-color, #8b868045), + 0px 10px 0 -9px var(--psp-inactive--border-color, #8b868045); +} + +.psp-header-border.psp-header-group { + &:not(.psp-is-top):not(.psp-header-group-corner) { + /* right and bottom */ + box-shadow: + 1px 0px var(--psp-inactive--border-color, #8b868045), + 0px 10px 0 -9px var(--psp-inactive--border-color, #8b868045); + } +} + +perspective-viewer[settings] + tr.rt-autosize + .psp-header-leaf.psp-header-border:not(.psp-menu-enabled) { + box-shadow: 1px 0px var(--psp-inactive--border-color, #8b868045); +} + +:host-context(perspective-viewer[settings]) + tr.rt-autosize + .psp-header-leaf.psp-header-border:not(.psp-menu-enabled) { + box-shadow: 1px 0px var(--psp-inactive--border-color, #8b868045); +} + +.psp-header-leaf.psp-header-border { + /* bottom-miter-right */ + box-shadow: 5px -4px 0px -4px var(--psp-inactive--border-color, #8b868045); +} + +tr:only-child th { + box-shadow: none !important; +} diff --git a/packages/viewer-datagrid/src/css/perspective-viewer-datagrid.css b/packages/viewer-datagrid/src/css/perspective-viewer-datagrid.css new file mode 100644 index 0000000000..9dde8b42ea --- /dev/null +++ b/packages/viewer-datagrid/src/css/perspective-viewer-datagrid.css @@ -0,0 +1,6 @@ +@import "./pro.css"; +@import "./mitered-headers.css"; +@import "./row-hover.css"; +@import "./sub-cell-scroll.css"; +@import "./scrollbar.css"; +@import "./regular_table.css"; diff --git a/packages/viewer-datagrid/src/less/pro.less b/packages/viewer-datagrid/src/css/pro.css similarity index 70% rename from packages/viewer-datagrid/src/less/pro.less rename to packages/viewer-datagrid/src/css/pro.css index 05193cd694..3f8864472f 100644 --- a/packages/viewer-datagrid/src/less/pro.less +++ b/packages/viewer-datagrid/src/css/pro.css @@ -1,22 +1,21 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@row-height: 19px; +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ regular-table { padding: 0; margin: 12px 0 0 12px; font-family: inherit; - --rt-hover--border-color: var(--inactive--color, #c5c9d080); + --psp-datagrid--hover--border-color: var(--psp-inactive--color, #c5c9d080); div[tabindex] { outline: none; @@ -35,7 +34,7 @@ regular-table { text-align: center; } - // Header groups should overflow and not contribute to auto-sizing. + /* Header groups should overflow and not contribute to auto-sizing. */ thead tr:not(.rt-autosize) th { overflow: hidden; max-width: 0px; @@ -70,7 +69,7 @@ regular-table { text-align: left; } - // frozen rows + /* frozen rows */ thead tr:last-child th { border-bottom: 1px solid #8b868045; @@ -95,12 +94,11 @@ regular-table { td, th { white-space: nowrap; - font-size: 12px; padding-right: 5px; padding-left: 5px; padding-top: 0px; padding-bottom: 0px; - height: @row-height; + height: var(--psp-datagrid--row--height, 19px); } table * { @@ -116,7 +114,7 @@ regular-table { span.rt-row-header-icon { color: #aaa; padding-right: 4px; - font-family: var(--button--font-family); + font-family: var(--psp-button--font-family); } span.rt-column-header-icon { @@ -124,7 +122,7 @@ regular-table { padding-left: 3px; display: inline-block; width: 10px; - font-family: var(--button--font-family); + font-family: var(--psp-button--font-family); } span.rt-row-header-icon:hover { @@ -141,17 +139,17 @@ regular-table { text-overflow: ellipsis; } - // OPTIONAL zebra striping + /* OPTIONAL zebra striping */ - // @zebra-stripe-color: rgb(238,238,238); + /* @zebra-stripe-color: rgb(238,238,238); */ - // tbody tr:nth-child(even) td:not(.rt-group-header) { - // background: @zebra-stripe-color; - // } + /* tbody tr:nth-child(even) td:not(.rt-group-header) { */ + /* background: @zebra-stripe-color; */ + /* } */ - // tbody tr:nth-child(even) span.rt-group-name { - // background: @zebra-stripe-color; - // } + /* tbody tr:nth-child(even) span.rt-group-name { */ + /* background: @zebra-stripe-color; */ + /* } */ td span.rt-group-name, th span.rt-group-name { @@ -182,15 +180,18 @@ regular-table { } a { - color: var(--rt-pos-cell--color); + color: var(--psp-datagrid--pos-cell--color); } a:visited { - color: var(--active--color); + color: var(--psp-active--color); } td.psp-null:after, th.psp-null:after { - content: var(--null--content, "-"); + content: var(--psp-label--null--content, "-"); + color: var(--psp-label--null--color, inherit); + font-size: var(--psp-label--null--font-size, inherit); + vertical-align: middle; } } diff --git a/packages/viewer-datagrid/src/less/regular_table.less b/packages/viewer-datagrid/src/css/regular_table.css similarity index 55% rename from packages/viewer-datagrid/src/less/regular_table.less rename to packages/viewer-datagrid/src/css/regular_table.css index b02b892cbe..75600e9277 100644 --- a/packages/viewer-datagrid/src/less/regular_table.less +++ b/packages/viewer-datagrid/src/css/regular_table.css @@ -1,53 +1,41 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import "./pro.less"; -@import "./mitered-headers.less"; -@import "./row-hover.less"; -@import "./sub-cell-scroll.less"; -@import "./scrollbar.less"; - -// Row Selection - -@mixin icon { - background-repeat: no-repeat; - background-color: var(--icon--color); - content: ""; - display: inline-block; - -webkit-mask-size: cover; - mask-size: cover; -} - -// // TODO this makes the UI flash a CSS layout for a millsiecond when toggling -// // settings butit could be fixed. - -// perspective-viewer:not([settings]) { -// @include settings-not-open; -// } - -// :host-context(perspective-viewer:not([settings])) { -// @include settings-not-open; -// } - -// @mixin settings-not-open { -// regular-table table tr.rt-autosize + tr th { -// height: 0px; -// span { -// display: none; -// } -// } -// } - -@mixin settings-open { +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ +/* + +/* Row Selection */ + +/* // TODO this makes the UI flash a CSS layout for a millsiecond when toggling */ +/* // settings butit could be fixed. */ + +/* perspective-viewer:not([settings]) { */ +/* @include settings-not-open; */ +/* } */ + +/* :host-context(perspective-viewer:not([settings])) { */ +/* @include settings-not-open; */ +/* } */ + +/* @mixin settings-not-open { */ +/* regular-table table tr.rt-autosize + tr th { */ +/* height: 0px; */ +/* span { */ +/* display: none; */ +/* } */ +/* } */ +/* } */ + +perspective-viewer, +:host { .psp-menu-enabled { padding: 0 6px; font-size: 8px; @@ -56,65 +44,55 @@ .psp-menu-enabled:hover, tr:not(.rt-autosize) th.psp-menu-open { - color: var(--plugin--background); - background-color: var(--icon--color); - border-bottom-color: var(--icon--color); + color: var(--psp--background-color); + background-color: var(--psp--color); + border-bottom-color: var(--psp--color); cursor: pointer; } tr:not(.rt-autosize) th.psp-menu-open { &:before { - @include icon; + background-repeat: no-repeat; + background-color: var(--psp--color); + content: ""; + display: inline-block; + -webkit-mask-size: cover; + mask-size: cover; height: 8px; width: 10px; - -webkit-mask-image: var(--column-settings-icon--mask-image); - mask-image: var(--column-settings-icon--mask-image); + -webkit-mask-image: var(--psp-icon--column-settings--mask-image); + mask-image: var(--psp-icon--column-settings--mask-image); margin-right: 4px; - background-color: var(--plugin--background); + background-color: var(--psp--background-color); } } td.psp-menu-open { box-shadow: - inset -2px 0px 0px var(--icon--color), - inset 2px 0px 0px var(--icon--color); + inset -2px 0px 0px var(--psp--color), + inset 2px 0px 0px var(--psp--color); } tr:first-child td.psp-menu-open { - border-top-color: var(--icon--color) !important; + border-top-color: var(--psp--color) !important; } tr:last-child td.psp-menu-open { box-shadow: - inset -2px 0px 0px var(--icon--color), - inset 2px 0px 0px var(--icon--color), - inset 0px -2px 0px var(--icon--color); + inset -2px 0px 0px var(--psp--color), + inset 2px 0px 0px var(--psp--color), + inset 0px -2px 0px var(--psp--color); } } -perspective-viewer { - @include settings-open; -} - -:host { - @include settings-open; -} - -@mixin viewer-table-styles { +perspective-viewer, +:host-context(perspective-viewer) { regular-table table thead tr:last-child th { border-bottom-width: 1px; - border-bottom-color: var(--inactive--border-color, #8b868045); + border-bottom-color: var(--psp-inactive--border-color, #8b868045); } } -perspective-viewer { - @include viewer-table-styles; -} - -:host-context(perspective-viewer) { - @include viewer-table-styles; -} - .psp-sort-enabled:hover { cursor: pointer; } @@ -159,96 +137,131 @@ td:focus { outline-width: 1px; } -@mixin table-no-dragging { +perspective-viewer.dragging, +:host-context(perspective-viewer.dragging) { regular-table { pointer-events: none; } } -perspective-viewer.dragging { - @include table-no-dragging; -} -:host-context(perspective-viewer.dragging) { - @include table-no-dragging; -} .psp-header-border:last-child { border-right-width: 0px; } .psp-header-sort-desc:after { - @include icon; + background-repeat: no-repeat; + background-color: var(--psp--color); + content: ""; + display: inline-block; + -webkit-mask-size: cover; + mask-size: cover; width: 14px; height: 11px; margin-left: 4px; - -webkit-mask-image: var(--sort-desc-icon--mask-image); - mask-image: var(--sort-desc-icon--mask-image); + -webkit-mask-image: var(--psp-icon--sort-desc--mask-image); + mask-image: var(--psp-icon--sort-desc--mask-image); } .psp-header-sort-asc:after { - @include icon; + background-repeat: no-repeat; + background-color: var(--psp--color); + content: ""; + display: inline-block; + -webkit-mask-size: cover; + mask-size: cover; width: 14px; height: 11px; margin-left: 4px; - -webkit-mask-image: var(--sort-asc-icon--mask-image); - mask-image: var(--sort-asc-icon--mask-image); + -webkit-mask-image: var(--psp-icon--sort-asc--mask-image); + mask-image: var(--psp-icon--sort-asc--mask-image); } .psp-header-sort-col-desc:after { - @include icon; + background-repeat: no-repeat; + background-color: var(--psp--color); + content: ""; + display: inline-block; + -webkit-mask-size: cover; + mask-size: cover; width: 14px; height: 11px; margin-left: 4px; - -webkit-mask-image: var(--sort-col-desc-icon--mask-image); - mask-image: var(--sort-col-desc-icon--mask-image); + -webkit-mask-image: var(--psp-icon--sort-col-desc--mask-image); + mask-image: var(--psp-icon--sort-col-desc--mask-image); } .psp-header-sort-col-asc:after { - @include icon; + background-repeat: no-repeat; + background-color: var(--psp--color); + content: ""; + display: inline-block; + -webkit-mask-size: cover; + mask-size: cover; width: 14px; height: 11px; margin-left: 4px; - -webkit-mask-image: var(--sort-col-asc-icon--mask-image); - mask-image: var(--sort-col-asc-icon--mask-image); + -webkit-mask-image: var(--psp-icon--sort-col-asc--mask-image); + mask-image: var(--psp-icon--sort-col-asc--mask-image); } .psp-header-sort-abs-desc:after { - @include icon; + background-repeat: no-repeat; + background-color: var(--psp--color); + content: ""; + display: inline-block; + -webkit-mask-size: cover; + mask-size: cover; width: 14px; height: 11px; margin-left: 4px; - -webkit-mask-image: var(--sort-abs-desc-icon--mask-image); - mask-image: var(--sort-abs-desc-icon--mask-image); + -webkit-mask-image: var(--psp-icon--sort-abs-desc--mask-image); + mask-image: var(--psp-icon--sort-abs-desc--mask-image); } .psp-header-sort-abs-asc:after { - @include icon; + background-repeat: no-repeat; + background-color: var(--psp--color); + content: ""; + display: inline-block; + -webkit-mask-size: cover; + mask-size: cover; width: 14px; height: 11px; margin-left: 4px; - -webkit-mask-image: var(--sort-abs-asc-icon--mask-image); - mask-image: var(--sort-abs-asc-icon--mask-image); + -webkit-mask-image: var(--psp-icon--sort-abs-asc--mask-image); + mask-image: var(--psp-icon--sort-abs-asc--mask-image); } .psp-header-sort-abs-col-desc:after { - @include icon; + background-repeat: no-repeat; + background-color: var(--psp--color); + content: ""; + display: inline-block; + -webkit-mask-size: cover; + mask-size: cover; width: 14px; height: 11px; margin-left: 4px; - -webkit-mask-image: var(--sort-abs-col-desc-icon--mask-image); - mask-image: var(--sort-abs-col-desc-icon--mask-image); + -webkit-mask-image: var(--psp-icon--sort-abs-col-desc--mask-image); + mask-image: var(--psp-icon--sort-abs-col-desc--mask-image); } .psp-header-sort-abs-col-asc:after { - @include icon; + background-repeat: no-repeat; + background-color: var(--psp--color); + content: ""; + display: inline-block; + -webkit-mask-size: cover; + mask-size: cover; width: 14px; height: 11px; margin-left: 4px; - -webkit-mask-image: var(--sort-abs-col-asc-icon--mask-image); - mask-image: var(--sort-abs-col-asc-icon--mask-image); + -webkit-mask-image: var(--psp-icon--sort-abs-col-asc--mask-image); + mask-image: var(--psp-icon--sort-abs-col-asc--mask-image); } tbody th:last-of-type { - border-right: 1px solid var(--inactive--border-color, #8b868045); + border-right: 1px solid var(--psp-inactive--border-color, #8b868045); overflow: hidden; text-overflow: ellipsis; } @@ -256,7 +269,7 @@ tbody th:empty { background-image: linear-gradient( to right, transparent 9px, - var(--inactive--border-color, #eee) 10px, + var(--psp-inactive--border-color, #eee) 10px, transparent 11px ); background-repeat: no-repeat; @@ -272,17 +285,17 @@ regular-table:not(.flat-group-rollup-mode) { } .psp-tree-label:before { - color: var(--icon--color); - font-family: var(--button--font-family, inherit); + color: var(--psp--color); + font-family: var(--psp-button--font-family, inherit); padding-right: 11px; } .psp-tree-label-expand:before { - content: var(--tree-label-expand--content, "+"); + content: var(--psp-label--tree-expand--content, "+"); } .psp-tree-label-collapse:before { - content: var(--tree-label-collapse--content, "-"); + content: var(--psp-label--tree-collapse--content, "-"); } .psp-tree-label-expand, @@ -291,8 +304,8 @@ regular-table:not(.flat-group-rollup-mode) { } .psp-tree-label:hover:before { - color: var(--active--color); - text-shadow: 0px 0px 5px var(--active--color); + color: var(--psp-active--color); + text-shadow: 0px 0px 5px var(--psp-active--color); } } @@ -307,10 +320,10 @@ regular-table:not(.flat-group-rollup-mode) { text-align: left; } .psp-positive:not(:focus) { - color: var(--rt-pos-cell--color); + color: var(--psp-datagrid--pos-cell--color); } .psp-negative:not(:focus) { - color: var(--rt-neg-cell--color); + color: var(--psp-datagrid--neg-cell--color); } regular-table table tbody td { @@ -339,7 +352,7 @@ regular-table table { td, th { - border-color: var(--inactive--border-color, #8b868045); + border-color: var(--psp-inactive--border-color, #8b868045); height: 23px; } @@ -371,10 +384,10 @@ regular-table table { td.psp-select-region, th.psp-select-region { - // transition: background-color 0.5s, color 0.5s, border-color 0.5s; - background-color: var(--icon--color) !important; - color: var(--plugin--background) !important; - border-color: var(--plugin--background) !important; + /* transition: background-color 0.5s, color 0.5s, border-color 0.5s; */ + background-color: var(--psp--color) !important; + color: var(--psp--background-color) !important; + border-color: var(--psp--background-color) !important; } } @@ -387,63 +400,56 @@ regular-table tr:hover + tr td.psp-select-region:not(.psp-row-selected):not(.psp-row-subselected) { - border-color: var(--plugin--background) !important; + border-color: var(--psp--background-color) !important; } regular-table tbody tr:hover { td.psp-select-region.psp-menu-open { &:not(.psp-row-selected):not(.psp-row-subselected) { box-shadow: - inset -2px 0px 0px var(--plugin--background), - inset 2px 0px 0px var(--plugin--background); + inset -2px 0px 0px var(--psp--background-color), + inset 2px 0px 0px var(--psp--background-color); } } } :host-context(perspective-viewer[settings]) td.psp-select-region.psp-menu-open { box-shadow: - inset -2px 0px 0px var(--plugin--background), - inset 2px 0px 0px var(--plugin--background); -} - -// This is a design/architecture bug. When the datagrid draws during a sidepanel -// collapse/uncollapse, the `settings` attribute is set to the _previous_ state -// as this collapse takes a while and we dont want the new state CSS to apply -// until the drawing is done. However, this causes the datagrid to draw its -// _first_ frame as if its in the wrong state, as it detects sidepanel state -// via HTML attribute checking. -@mixin design-slash-architecture-bug { - regular-table #psp-column-edit-buttons:after { - content: none; - } + inset -2px 0px 0px var(--psp--background-color), + inset 2px 0px 0px var(--psp--background-color); } +/* This is a design/architecture bug. When the datagrid draws during a sidepanel */ +/* collapse/uncollapse, the `settings` attribute is set to the _previous_ state */ +/* as this collapse takes a while and we dont want the new state CSS to apply */ +/* until the drawing is done. However, this causes the datagrid to draw its */ +/* _first_ frame as if its in the wrong state, as it detects sidepanel state */ +/* via HTML attribute checking. */ regular-table #psp-column-edit-buttons th:not(.rt-group-corner) span:not(.rt-column-resize):before { - content: var(--datagrid-column-edit-button--content, "Edit"); -} - -perspective-viewer:not([settings]) { - @include design-slash-architecture-bug; + content: var(--psp-datagrid--column-edit-button--content, "Edit"); } +perspective-viewer:not([settings]), :host-context(perspective-viewer:not([settings])) { - @include design-slash-architecture-bug; + regular-table #psp-column-edit-buttons:after { + content: none; + } } -// Style the last row of the `` so that is has a bottom border. +/* Style the last row of the `` so that is has a bottom border. */ regular-table table thead tr:last-child:after { width: 10000px; box-sizing: border-box; display: block; height: 23px; content: " "; - border-bottom: 1px solid var(--inactive--border-color); + border-bottom: 1px solid var(--psp-inactive--border-color); } -// Extend every row to the right edge of the page with a fake column. +/* Extend every row to the right edge of the page with a fake column. */ regular-table table tbody tr:after { width: 10000px; box-sizing: border-box; @@ -454,15 +460,15 @@ regular-table table tbody tr:after { } regular-table table tbody tr:not(:first-child):after { - border-top: 1px solid var(--inactive--border-color); + border-top: 1px solid var(--psp-inactive--border-color); } regular-table table tbody tr:hover:not(:first-child):after { - border-top: 1px solid var(--rt-hover--border-color); + border-top: 1px solid var(--psp-datagrid--hover--border-color); } regular-table table tbody tr:hover + tr:after { - border-top: 1px solid var(--rt-hover--border-color); + border-top: 1px solid var(--psp-datagrid--hover--border-color); } @keyframes pulse_pos { diff --git a/packages/viewer-datagrid/src/less/row-hover.less b/packages/viewer-datagrid/src/css/row-hover.css similarity index 66% rename from packages/viewer-datagrid/src/less/row-hover.less rename to packages/viewer-datagrid/src/css/row-hover.css index 008ac0eb39..c5c5c54a77 100644 --- a/packages/viewer-datagrid/src/less/row-hover.less +++ b/packages/viewer-datagrid/src/css/row-hover.css @@ -1,14 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ regular-table { tbody { @@ -18,24 +19,29 @@ regular-table { th.psp-tree-label:not(.psp-row-selected):not(.psp-row-subselected), tr:hover td:not(.psp-row-selected):not(.psp-row-subselected), tr:hover:after { - border-color: var(--rt-hover--border-color, #c5c9d080) !important; - box-shadow: 0px 1px 0px var(--rt-hover--border-color, #c5c9d080); + border-color: var( + --psp-datagrid--hover--border-color, + #c5c9d080 + ) !important; + box-shadow: 0px 1px 0px + var(--psp-datagrid--hover--border-color, #c5c9d080); &.psp-menu-open { box-shadow: - inset -2px 0px 0px var(--icon--color), - inset 2px 0px 0px var(--icon--color), - 0px 1px 0px var(--rt-hover--border-color, #c5c9d080); + inset -2px 0px 0px var(--psp--color), + inset 2px 0px 0px var(--psp--color), + 0px 1px 0px + var(--psp-datagrid--hover--border-color, #c5c9d080); } } tr:last-child:hover td:not(.psp-row-selected):not(.psp-row-subselected).psp-menu-open { box-shadow: - inset -2px 0px 0px var(--icon--color), - inset 2px 0px 0px var(--icon--color), - inset 0px -2px 0px var(--icon--color), - 0px 1px 0px var(--rt-hover--border-color, #c5c9d080); + inset -2px 0px 0px var(--psp--color), + inset 2px 0px 0px var(--psp--color), + inset 0px -2px 0px var(--psp--color), + 0px 1px 0px var(--psp-datagrid--hover--border-color, #c5c9d080); } tr:hover @@ -71,7 +77,7 @@ regular-table { th:first-child:empty ~ th:empty + th:not(:empty), td:first-child { border-left-color: var( - --rt-hover--border-color, + --psp-datagrid--hover--border-color, #c5c9d080 ) !important; } @@ -79,7 +85,7 @@ regular-table { th:last-child, td:last-child { border-right-color: var( - --rt-hover--border-color, + --psp-datagrid--hover--border-color, #c5c9d080 ) !important; } diff --git a/packages/viewer-datagrid/src/less/scrollbar.less b/packages/viewer-datagrid/src/css/scrollbar.css similarity index 63% rename from packages/viewer-datagrid/src/less/scrollbar.less rename to packages/viewer-datagrid/src/css/scrollbar.css index f2b6b332ec..70d6a3c70e 100644 --- a/packages/viewer-datagrid/src/less/scrollbar.less +++ b/packages/viewer-datagrid/src/css/scrollbar.css @@ -1,20 +1,21 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ -// Scrollbar styling +/* Scrollbar styling */ regular-table { outline: none; - // webkit (chrome, safari, etc) scrollbar styling + /* webkit (chrome, safari, etc) scrollbar styling */ &::-webkit-scrollbar, &::-webkit-scrollbar-corner { background-color: transparent; @@ -24,8 +25,8 @@ regular-table { &::-webkit-scrollbar-thumb { background-clip: content-box; - background: var(--icon--color); - border: 5.5px solid var(--plugin--background); + background: var(--psp--color); + border: 5.5px solid var(--psp--background-color); max-height: 50%; max-width: 50%; min-width: 10%; diff --git a/packages/viewer-datagrid/src/less/sub-cell-scroll.less b/packages/viewer-datagrid/src/css/sub-cell-scroll.css similarity index 79% rename from packages/viewer-datagrid/src/less/sub-cell-scroll.less rename to packages/viewer-datagrid/src/css/sub-cell-scroll.css index 2749c77e39..c85944f134 100644 --- a/packages/viewer-datagrid/src/less/sub-cell-scroll.less +++ b/packages/viewer-datagrid/src/css/sub-cell-scroll.css @@ -1,17 +1,18 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ -// Handles sub-cell scrolling via CSS transform offset by variables set during -// rendering. +/* Handles sub-cell scrolling via CSS transform offset by variables set during */ +/* rendering. */ perspective-viewer-datagrid:not(.sub-cell-scroll-disabled) regular-table table, :host(:not(.sub-cell-scroll-disabled)) regular-table table { tbody td, diff --git a/packages/viewer-datagrid/src/less/toolbar.less b/packages/viewer-datagrid/src/css/toolbar.css similarity index 63% rename from packages/viewer-datagrid/src/less/toolbar.less rename to packages/viewer-datagrid/src/css/toolbar.css index a205a504ea..ccab11e478 100644 --- a/packages/viewer-datagrid/src/less/toolbar.less +++ b/packages/viewer-datagrid/src/css/toolbar.css @@ -1,14 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { position: relative; @@ -42,9 +43,9 @@ &:hover { box-shadow: - -4px 0 0 var(--icon--color), - 4px 0 0 var(--icon--color); - background-color: var(--icon--color); + -4px 0 0 var(--psp--color), + 4px 0 0 var(--psp--color); + background-color: var(--psp--color); } } @@ -54,11 +55,11 @@ } #scroll_lock.lock-scroll:before { - -webkit-mask-image: var(--toolbar-scroll-lock-active--content); + -webkit-mask-image: var(--psp-toolbar-scroll-lock-active--content); } #scroll_lock:before { - -webkit-mask-image: var(--toolbar-scroll-lock--content); + -webkit-mask-image: var(--psp-toolbar-scroll-lock--content); } #select_mode:before { @@ -70,69 +71,75 @@ } #edit_mode[data-edit-mode="READ_ONLY"]:before { - -webkit-mask-image: var(--toolbar-edit-mode--read-only--content); + -webkit-mask-image: var(--psp-toolbar-edit-mode-read-only--content); } #edit_mode[data-edit-mode="EDIT"]:before { - -webkit-mask-image: var(--toolbar-edit-mode--edit--content); + -webkit-mask-image: var(--psp-toolbar-edit-mode-edit--content); } :host(.aggregated) #toolbar #edit_mode[data-edit-mode="EDIT"]:before { - -webkit-mask-image: var(--toolbar-edit-mode--read-only--content); + -webkit-mask-image: var(--psp-toolbar-edit-mode-read-only--content); } #edit_mode[data-edit-mode="SELECT_ROW"]:before { - -webkit-mask-image: var(--toolbar-edit-mode--select-row--content); + -webkit-mask-image: var(--psp-toolbar-edit-mode-select-row--content); } #edit_mode[data-edit-mode="SELECT_COLUMN"]:before { - -webkit-mask-image: var(--toolbar-edit-mode--select-column--content); + -webkit-mask-image: var(--psp-toolbar-edit-mode-select-column--content); } #edit_mode[data-edit-mode="SELECT_REGION"]:before { - -webkit-mask-image: var(--toolbar-edit-mode--select-region--content); + -webkit-mask-image: var(--psp-toolbar-edit-mode-select-region--content); } -// #edit_mode span:before { -// content: var(--edit-mode-toggle--content, "N/A"); -// } +/* #edit_mode span:before { */ +/* content: var(--edit-mode-toggle--content, "N/A"); */ +/* } */ #edit_mode[data-edit-mode="READ_ONLY"] span:before { - content: var(--edit-mode--read-only--content, "Read Only"); + content: var(--psp-label--edit-mode-read-only--content, "Read Only"); } #edit_mode[data-edit-mode="EDIT"] span:before { - content: var(--edit-mode--edit--content, "Editable"); + content: var(--psp-label--edit-mode-edit--content, "Editable"); } #edit_mode[data-edit-mode="SELECT_ROW"] span:before { - content: var(--edit-mode--select-row--content, "Row Select"); + content: var(--psp-label--edit-mode-select-row--content, "Row Select"); } #edit_mode[data-edit-mode="SELECT_COLUMN"] span:before { - content: var(--edit-mode--select-column--content, "Column Select"); + content: var( + --psp-label--edit-mode-select-column--content, + "Column Select" + ); } #edit_mode[data-edit-mode="SELECT_REGION"] span:before { - content: var(--edit-mode--select-region--content, "Region Select"); + content: var( + --psp-label--edit-mode-select-region--content, + "Region Select" + ); } #scroll_lock span:before { - content: var(--scroll-lock-toggle--content, "Free Scroll"); + content: var(--psp-label--scroll-lock-toggle--content, "Free Scroll"); } #scroll_lock.lock-scroll span:before { - content: var(--scroll-lock-alt-toggle--content, "Align Scroll"); + content: var(--psp-label--scroll-lock-alt-toggle--content, "Align Scroll"); } -// The icon. +/* The icon. */ .button:before { width: 21px; height: 21px; content: ""; -webkit-mask-size: cover; mask-size: cover; - background-color: var(--icon--color); + background-color: var(--psp--color); } .button.editable:before, @@ -167,8 +174,8 @@ .hover-target:focus-within .button, .hover-target:hover .button { position: relative; - background-color: var(--icon--color); - color: var(--plugin--background); + background-color: var(--psp--color); + color: var(--psp--background-color); opacity: 1; display: flex; align-items: center; @@ -177,10 +184,10 @@ .hover-target:focus-within .button:before, .hover-target:hover .button:before { - background-color: var(--plugin--background); + background-color: var(--psp--background-color); } -// The label. +/* The label. */ .hover-target:focus-within .button > span, .hover-target:hover .button > span { display: block; @@ -194,7 +201,7 @@ white-space: pre-wrap; line-height: 1; font-size: 9px; - background-color: var(--icon--color); + background-color: var(--psp--color); width: 35px; text-align: center; border-radius: 0 0 3px 3px; diff --git a/packages/viewer-datagrid/src/less/mitered-headers.less b/packages/viewer-datagrid/src/less/mitered-headers.less deleted file mode 100644 index f42ec4b5cf..0000000000 --- a/packages/viewer-datagrid/src/less/mitered-headers.less +++ /dev/null @@ -1,65 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -.psp-header-border:not(.psp-is-top):not(.psp-header-leaf) { - // right - box-shadow: 1px 0px var(--inactive--border-color, #8b868045); -} - -.psp-header-group { - // bottom - box-shadow: 0px 10px 0 -9px var(--inactive--border-color, #8b868045); -} - -.psp-is-top { - // top-miter-right - box-shadow: 5px 4px 0px -4px var(--inactive--border-color, #8b868045); -} - -.psp-is-top.psp-header-group:not(.psp-header-group-corner) { - // top-miter-right and bottom - box-shadow: - 5px 4px 0px -4px var(--inactive--border-color, #8b868045), - 0px 10px 0 -9px var(--inactive--border-color, #8b868045); -} - -.psp-header-border.psp-header-group { - &:not(.psp-is-top):not(.psp-header-group-corner) { - // right and bottom - box-shadow: - 1px 0px var(--inactive--border-color, #8b868045), - 0px 10px 0 -9px var(--inactive--border-color, #8b868045); - } -} - -@mixin disabled-menu-funky-box-shadow { - tr.rt-autosize .psp-header-leaf.psp-header-border:not(.psp-menu-enabled) { - box-shadow: 1px 0px var(--inactive--border-color, #8b868045); - } -} - -perspective-viewer[settings] { - @include disabled-menu-funky-box-shadow; -} - -:host-context(perspective-viewer[settings]) { - @include disabled-menu-funky-box-shadow; -} - -.psp-header-leaf.psp-header-border { - // bottom-miter-right - box-shadow: 5px -4px 0px -4px var(--inactive--border-color, #8b868045); -} - -tr:only-child th { - box-shadow: none !important; -} diff --git a/packages/viewer-datagrid/src/ts/model/create.ts b/packages/viewer-datagrid/src/ts/model/create.ts index 20b481835a..aa29b70c2b 100644 --- a/packages/viewer-datagrid/src/ts/model/create.ts +++ b/packages/viewer-datagrid/src/ts/model/create.ts @@ -152,15 +152,15 @@ export async function createModel( ]); const _plugin_background = chroma( - get_rule(regular, "--plugin--background", "#FFFFFF"), + get_rule(regular, "--psp--background-color", "#FFFFFF"), ).rgb(); const _pos_fg_color = make_color_record( - get_rule(regular, "--rt-pos-cell--color", "#338DCD"), + get_rule(regular, "--psp-datagrid--pos-cell--color", "#338DCD"), ); const _neg_fg_color = make_color_record( - get_rule(regular, "--rt-neg-cell--color", "#FF5942"), + get_rule(regular, "--psp-datagrid--neg-cell--color", "#FF5942"), ); const _pos_bg_color = make_color_record( @@ -172,7 +172,7 @@ export async function createModel( ); const _color = make_color_record( - get_rule(regular, "--active--color", "#ff0000"), + get_rule(regular, "--psp-active--color", "#ff0000"), ); const _schema: Schema = { diff --git a/packages/viewer-datagrid/src/ts/style_handlers/body.ts b/packages/viewer-datagrid/src/ts/style_handlers/body.ts index 97462ae06e..7031d74136 100644 --- a/packages/viewer-datagrid/src/ts/style_handlers/body.ts +++ b/packages/viewer-datagrid/src/ts/style_handlers/body.ts @@ -94,7 +94,7 @@ export function applyBodyCellStyles( } else if (type === "string") { cell_style_string.call(this, plugin as any, td, metadata as any); } else if (type === "date" || type === "datetime") { - cell_style_datetime.call(this, plugin as any, td, metadata as any); + cell_style_datetime.call(this, plugin as any, td, metadata); } else { td.style.backgroundColor = ""; td.style.color = ""; diff --git a/packages/viewer-datagrid/src/ts/style_handlers/table_cell/datetime.ts b/packages/viewer-datagrid/src/ts/style_handlers/table_cell/datetime.ts index 37764db082..8a37381278 100644 --- a/packages/viewer-datagrid/src/ts/style_handlers/table_cell/datetime.ts +++ b/packages/viewer-datagrid/src/ts/style_handlers/table_cell/datetime.ts @@ -17,20 +17,23 @@ import { } from "../../color_utils.js"; import type { DatagridModel, ColumnConfig, ColorRecord } from "../../types.js"; +interface PluginWithColor extends Omit { + color?: ColorRecord; +} + export function cell_style_datetime( this: DatagridModel, - plugin: ColumnConfig, + plugin: PluginWithColor, td: HTMLElement, metadata: CellMetadata, ): void { - const colorRecord: ColorRecord = //(() => { - // if (plugin?.color !== undefined) { - // return plugin.color; - // } else { - // return - this._color; - // } - // })(); + const colorRecord: ColorRecord = (() => { + if (plugin?.color !== undefined) { + return plugin.color; + } else { + return this._color; + } + })(); const [hex, r, g, b] = colorRecord; diff --git a/packages/viewer-openlayers/build.mjs b/packages/viewer-openlayers/build.mjs index 3db0ef7334..b243b3848b 100644 --- a/packages/viewer-openlayers/build.mjs +++ b/packages/viewer-openlayers/build.mjs @@ -12,12 +12,12 @@ import { NodeModulesExternal } from "@perspective-dev/esbuild-plugin/external.js"; import { build } from "@perspective-dev/esbuild-plugin/build.js"; -import { BuildCss } from "@prospective.co/procss/target/cjs/procss.js"; +import { bundleAsync as bundleCssAsync } from "lightningcss"; import * as fs from "node:fs"; -import * as path_mod from "node:path"; -import { createRequire } from "node:module"; - -const _require = createRequire(import.meta.url); +import { + resolveNPM, + inlineUrlVisitor, +} from "@perspective-dev/viewer/tools.mjs"; const BUILD = [ { @@ -42,19 +42,14 @@ const BUILD = [ async function compile_css() { fs.mkdirSync("dist/css", { recursive: true }); - const builder = new BuildCss(""); - builder.add( - "ol/ol.css", - fs.readFileSync(_require.resolve("ol/ol.css")).toString(), - ); - builder.add( - "./plugin.less", - fs.readFileSync("./src/less/plugin.less").toString(), - ); - fs.writeFileSync( - "dist/css/perspective-viewer-openlayers.css", - builder.compile().get("plugin.css"), - ); + const filename = "./src/css/perspective-viewer-openlayers.css"; + const { code } = await bundleCssAsync({ + filename, + minify: true, + resolver: resolveNPM(import.meta.url), + visitor: inlineUrlVisitor(filename), + }); + fs.writeFileSync("dist/css/perspective-viewer-openlayers.css", code); } async function build_all() { diff --git a/packages/viewer-openlayers/package.json b/packages/viewer-openlayers/package.json index 38ddf05996..0fa212a409 100644 --- a/packages/viewer-openlayers/package.json +++ b/packages/viewer-openlayers/package.json @@ -35,6 +35,6 @@ "devDependencies": { "@perspective-dev/esbuild-plugin": "workspace:", "@perspective-dev/test": "workspace:", - "@prospective.co/procss": "catalog:" + "lightningcss": "catalog:" } } diff --git a/packages/viewer-openlayers/src/css/perspective-viewer-openlayers.css b/packages/viewer-openlayers/src/css/perspective-viewer-openlayers.css new file mode 100644 index 0000000000..e5578b0dac --- /dev/null +++ b/packages/viewer-openlayers/src/css/perspective-viewer-openlayers.css @@ -0,0 +1,2 @@ +@import "ol/ol.css"; +@import "./plugin.css"; diff --git a/packages/viewer-openlayers/src/less/plugin.less b/packages/viewer-openlayers/src/css/plugin.css similarity index 73% rename from packages/viewer-openlayers/src/less/plugin.less rename to packages/viewer-openlayers/src/css/plugin.css index c67767eae6..45ef4dc91a 100644 --- a/packages/viewer-openlayers/src/less/plugin.less +++ b/packages/viewer-openlayers/src/css/plugin.css @@ -1,16 +1,17 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ -@import "ol/ol.css"; +/* @import "ol/ol.css"; */ :host { #container { @@ -28,13 +29,13 @@ } & .ol-attribution { - filter: var(--map-attribution--filter, none); + filter: var(--psp-openlayers--attribution--filter, none); } & .map-tooltip { position: absolute; display: none; - background: var(--map-element-background, #eee); + background: var(--psp-openlayers--element--background, #eee); border: 1px solid #888; border-radius: 5px; padding: 5px; @@ -75,7 +76,7 @@ right: 4em; width: 80px; height: 122px; - background: var(--map-element-background, #eee); + background: var(--psp-openlayers--element--background, #eee); border-radius: 5px; pointer-events: none; opacity: 0.8; @@ -86,7 +87,7 @@ } & .tick line { - color: var(--map-element-background, #eee); + color: var(--psp-openlayers--element--background, #eee); } } } diff --git a/packages/viewer-openlayers/src/themes/material.dark.css b/packages/viewer-openlayers/src/themes/material.dark.css new file mode 100644 index 0000000000..4ce33c568a --- /dev/null +++ b/packages/viewer-openlayers/src/themes/material.dark.css @@ -0,0 +1,41 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +perspective-viewer { + --map-element-background: #333333; + + /* colors for categories 1 to 11 */ + --map-category-1: #1f77b4; + --map-category-2: #0366d6; + --map-category-3: #ff7f0e; + --map-category-4: #2ca02c; + --map-category-5: #d62728; + --map-category-6: #9467bd; + --map-category-7: #8c564b; + --map-category-8: #e377c2; + --map-category-9: #7f7f7f; + --map-category-10: #bcbd22; + --map-category-11: #17becf; + + /* color gradient when color value is selected */ + --map-gradient: linear-gradient( + #4d342f 0%, + #e4521b 22.5%, + #decb45 42.5%, + #a0a0a0 50%, + #bccda8 57.5%, + #42b3d5 67.5%, + #1a237e 100% + ); + + --map-tile-url: "http://{a-c}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png"; +} diff --git a/packages/viewer-openlayers/src/themes/material.dark.less b/packages/viewer-openlayers/src/themes/material.dark.less deleted file mode 100644 index badbe2c5dc..0000000000 --- a/packages/viewer-openlayers/src/themes/material.dark.less +++ /dev/null @@ -1,33 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -perspective-viewer { - --map-element-background: #333333; - - // colors for categories 1 to 11 - --map-category-1: #1f77b4; - --map-category-2: #0366d6; - --map-category-3: #ff7f0e; - --map-category-4: #2ca02c; - --map-category-5: #d62728; - --map-category-6: #9467bd; - --map-category-7: #8c564b; - --map-category-8: #e377c2; - --map-category-9: #7f7f7f; - --map-category-10: #bcbd22; - --map-category-11: #17becf; - - // color gradient when color value is selected - --map-gradient: linear-gradient(#4d342f 0%, #e4521b 22.5%, #decb45 42.5%, #a0a0a0 50%, #bccda8 57.5%, #42b3d5 67.5%, #1a237e 100%); - - --map-tile-url: "http://{a-c}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png"; -} diff --git a/packages/workspace/build.mjs b/packages/workspace/build.mjs index d271db5a32..f4eae23d3f 100644 --- a/packages/workspace/build.mjs +++ b/packages/workspace/build.mjs @@ -15,13 +15,20 @@ import { WasmPlugin } from "@perspective-dev/esbuild-plugin/wasm.js"; import { WorkerPlugin } from "@perspective-dev/esbuild-plugin/worker.js"; import { ResolvePlugin } from "@perspective-dev/esbuild-plugin/resolve.js"; import { build } from "@perspective-dev/esbuild-plugin/build.js"; -import { BuildCss } from "@prospective.co/procss/target/cjs/procss.js"; +import { + bundle as bundleCss, + bundleAsync as bundleCssAsync, +} from "lightningcss"; import * as fs from "node:fs"; -import { createRequire } from "node:module"; +// import { createRequire } from "node:module"; +import { + inlineUrlVisitor, + resolveNPM, +} from "@perspective-dev/viewer/tools.mjs"; import "zx/globals"; -const _require = createRequire(import.meta.url); +// const _require = createRequire(import.meta.url); const BUILD = [ { @@ -66,81 +73,42 @@ const BUILD = [ }, ]; -function add(builder, path, path2) { - builder.add( - path, - fs.readFileSync(_require.resolve(path2 || path)).toString(), - ); -} - async function build_all() { - fs.mkdirSync("build/css", { recursive: true }); fs.mkdirSync("dist/css", { recursive: true }); - const builder3 = new BuildCss(""); - - add(builder3, "@lumino/widgets/style/widget.css"); - add(builder3, "@lumino/widgets/style/accordionpanel.css"); - add(builder3, "@lumino/widgets/style/commandpalette.css"); - add(builder3, "@lumino/widgets/style/dockpanel.css"); - add(builder3, "@lumino/widgets/style/menu.css"); - add(builder3, "@lumino/widgets/style/menubar.css"); - add(builder3, "@lumino/widgets/style/scrollbar.css"); - add(builder3, "@lumino/widgets/style/splitpanel.css"); - add(builder3, "@lumino/widgets/style/tabbar.css"); - add(builder3, "@lumino/widgets/style/tabpanel.css"); - - add(builder3, "@lumino/widgets/style/menu.css"); - add(builder3, "@lumino/widgets/style/index.css"); - - add(builder3, "./tabbar.less", "./src/less/tabbar.less"); - add(builder3, "./dockpanel.less", "./src/less/dockpanel.less"); - add(builder3, "./widget.less", "./src/less/widget.less"); - - add(builder3, "./viewer.less", "./src/less/viewer.less"); - add(builder3, "./menu.less", "./src/less/menu.less"); - add(builder3, "./workspace.less", "./src/less/workspace.less"); - add(builder3, "./injected.less", "./src/less/injected.less"); - fs.writeFileSync( - "build/css/workspace.css", - builder3.compile().get("workspace.css"), - ); - - fs.writeFileSync( - "build/css/injected.css", - builder3.compile().get("injected.css"), - ); - - const pro = new BuildCss("./src/themes"); - add(pro, "icons.less", "@perspective-dev/viewer/src/themes/icons.less"); - add(pro, "intl.less", "@perspective-dev/viewer/src/themes/intl.less"); - add(pro, "pro.less", "@perspective-dev/viewer/src/themes/pro.less"); - add(pro, "output.scss", "./src/themes/pro.less"); - fs.writeFileSync("dist/css/pro.css", pro.compile().get("output.css")); - - const pro_dark = new BuildCss("./src/themes"); - add( - pro_dark, - "icons.less", - "@perspective-dev/viewer/src/themes/icons.less", - ); - add(pro_dark, "intl.less", "@perspective-dev/viewer/src/themes/intl.less"); - add(pro_dark, "pro.less", "@perspective-dev/viewer/src/themes/pro.less"); - add( - pro_dark, - "pro-dark.less", - "@perspective-dev/viewer/src/themes/pro-dark.less", - ); - // add(builder2, "@perspective-dev/viewer/src/themes/pro-dark.less"); - // add(builder2, "pro-workspace.less", "./src/themes/pro.less"); - // add(builder2, "@perspective-dev/viewer/src/themes/variables.less"); - add(pro_dark, "output.scss", "./src/themes/pro-dark.less"); - fs.writeFileSync( - "dist/css/pro-dark.css", - pro_dark.compile().get("output.css"), - ); - + const { code: wsCode } = await bundleCssAsync({ + filename: "./src/css/workspace.css", + resolver: resolveNPM(import.meta.url), + minify: true, + errorRecovery: true, + visitor: inlineUrlVisitor("./src/css/workspace.css"), + }); + + fs.writeFileSync("dist/css/workspace.css", wsCode); + const { code: injCode } = await bundleCssAsync({ + filename: "./src/css/injected.css", + resolver: resolveNPM(import.meta.url), + minify: true, + errorRecovery: true, + visitor: inlineUrlVisitor("./src/css/workspace.css"), + }); + + // Workspace themes — bundle with lightningcss (resolves @imports) + fs.writeFileSync("dist/css/injected.css", injCode); + const { code: proCode } = bundleCss({ + filename: "./src/themes/pro.css", + minify: true, + visitor: inlineUrlVisitor("./src/themes/pro.css"), + }); + + fs.writeFileSync("dist/css/pro.css", proCode); + const { code: proDarkCode } = bundleCss({ + filename: "./src/themes/pro-dark.css", + minify: true, + visitor: inlineUrlVisitor("./src/themes/pro-dark.css"), + }); + + fs.writeFileSync("dist/css/pro-dark.css", proDarkCode); await Promise.all(BUILD.map(build)).catch(() => process.exit(1)); - try { await $`tsc --project ./tsconfig.json`.stdio( "inherit", diff --git a/packages/workspace/package.json b/packages/workspace/package.json index 946e348eb7..ce8c40c340 100644 --- a/packages/workspace/package.json +++ b/packages/workspace/package.json @@ -45,7 +45,7 @@ }, "devDependencies": { "@perspective-dev/viewer": "workspace:", - "@prospective.co/procss": "catalog:", + "lightningcss": "catalog:", "@perspective-dev/esbuild-plugin": "workspace:", "@perspective-dev/test": "workspace:", "@types/lodash": "catalog:", diff --git a/packages/workspace/src/css/dockpanel.css b/packages/workspace/src/css/dockpanel.css new file mode 100644 index 0000000000..38f1932bca --- /dev/null +++ b/packages/workspace/src/css/dockpanel.css @@ -0,0 +1,110 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ + +:host { + .lm-DockPanel { + overflow: var(--dock-panel--overflow, hidden); + position: absolute; + background-color: var(--detail--background-color, transparent); + padding: var(--psp-workspace--spacing); + top: 0; + left: 0; + right: 0; + bottom: 0; + &[data-mode="single-document"] { + padding: 0px; + } + } + + .lm-Widget, + .lm-Widget { + cursor: inherit; + } + + .lm-DockPanel.ew, + .lm-DockPanel.ew .lm-Widget, + .lm-SplitPanel.ew, + .lm-SplitPanel.ew .lm-Widget { + cursor: ew-resize !important; + } + + .lm-DockPanel.ns, + .lm-DockPanel.ns .lm-Widget, + .lm-SplitPanel.ns, + .lm-SplitPanel.ns .lm-Widget { + cursor: ns-resize !important; + } + + .workspace-master-widget { + min-width: 100px !important; + } + + .lm-DockPanel.resizing ::slotted(perspective-viewer), + .lm-SplitPanel.resizing ::slotted(perspective-viewer) { + pointer-events: none; + } + + .widget-blur ::slotted(perspective-viewer) { + opacity: 0.5; + } + + .lm-DockPanel-handle.resizing { + background-color: rgba(0, 0, 0, 0.05); + } + + .perspective-scroll-panel { + overflow: auto !important; + } + + .lm-Panel { + min-height: 100%; + } + + .lm-DockPanel-handle { + background-color: none; + } + + .lm-SplitPanel-handle { + background-color: var( + --psp-workspace--split-panel-handle--background-color + ); + } + + .lm-SplitPanel-handle, + .lm-DockPanel-handle { + transition: background-color 0.3s ease-out; + &:hover { + background-color: rgba(0, 0, 0, 0.05); + } + } + + .lm-DockPanel-handle[data-orientation="horizontal"] { + width: 10px !important; + margin-left: -5px; + } + + .lm-DockPanel-handle[data-orientation="vertical"] { + height: 10px !important; + margin-top: -5px; + } + + .lm-DockPanel-overlay { + background: rgba(75, 75, 75, 0.2); + border: 1px dashed #666; + border-radius: 6px; + transition-property: top, left, right, bottom; + transition-duration: 50ms; + transition-timing-function: linear; + margin: 0px; + } +} diff --git a/packages/workspace/src/less/injected.less b/packages/workspace/src/css/injected.css similarity index 61% rename from packages/workspace/src/less/injected.less rename to packages/workspace/src/css/injected.css index 1ff896c656..96454e54ed 100644 --- a/packages/workspace/src/less/injected.less +++ b/packages/workspace/src/css/injected.css @@ -1,14 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ -@import "./viewer.less"; -@import "./menu.less"; +@import "./viewer.css"; +@import "./menu.css"; diff --git a/packages/workspace/src/css/menu.css b/packages/workspace/src/css/menu.css new file mode 100644 index 0000000000..a431917453 --- /dev/null +++ b/packages/workspace/src/css/menu.css @@ -0,0 +1,130 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ + +@import "@lumino/widgets/style/menu.css"; + +:host { + .lm-Menu { + font-size: 12px; + padding: 8px; + background-color: var(--psp--background-color); + color: var(--psp--color); + border: 1px solid var(--psp-inactive--color); + border-radius: 3px; + max-width: 350px; + top: 0; + left: 0; + } + + .lm-Menu.perspective-workspace-menu { + .lm-Menu-item { + padding-left: 37px !important; + } + } + + .lm-Menu-item.lm-mod-active { + background-color: var(--psp--color); + color: var(--psp--background-color); + } + + .lm-Menu-item.lm-mod-disabled { + opacity: 0.5; + } + + .lm-Menu-itemIcon { + width: 24px; + height: 12px; + margin-right: 4px; + } + + .lm-Menu-itemLabel { + flex: 1 1; + padding: 4px 2px 4px 2px; + } + + .lm-Menu-itemMnemonic { + text-decoration: underline; + } + + .lm-Menu-itemShortcut { + padding: 4px 0px; + } + + .lm-Menu-itemSubmenuIcon { + width: 24px; + height: 18px; + } + + .lm-Menu-item { + display: flex; + align-items: center; + outline: none; + + margin: 0 -8px; + padding: 0 8px; + } + + .lm-Menu-item[data-type="separator"] > div { + padding: 0; + height: 9px; + } + + .lm-Menu-item[data-type="separator"] > div::after { + content: ""; + display: block; + position: relative; + top: 4px; + border-top: 1px solid; + } + + .lm-MenuBar-menu { + transform: translateY(-1px); + } + + .lm-MenuBar-item { + padding: 10px 32px; + border-left: 1px solid transparent; + border-right: 1px solid transparent; + color: #737373 !important; + } + + .lm-MenuBar-item.lm-mod-active { + background: rgba(0, 0, 0, 0.2); + } + + .lm-MenuBar.lm-mod-active .lm-MenuBar-item.lm-mod-active { + z-index: 10001; + background: rgba(0, 0, 0, 0.2); + /* border-left: 1px solid #c0c0c0; */ + /* border-right: 1px solid #c0c0c0; */ + } + + .lm-Menu-itemIcon:before { + content: attr(content); + font-family: + "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas", + "Liberation Mono", monospace; + } + + [data-type="submenu"] .lm-Menu-itemSubmenuIcon:before { + content: ">"; + font-family: + "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas", + "Liberation Mono", monospace; + height: 18px; + } + + .lm-mod-drag-image.lm-TabBar-tab { + display: none; + } +} diff --git a/packages/workspace/src/css/tabbar.css b/packages/workspace/src/css/tabbar.css new file mode 100644 index 0000000000..fcc85cff51 --- /dev/null +++ b/packages/workspace/src/css/tabbar.css @@ -0,0 +1,378 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ + +:host { + .lm-TabBar-tabLabel { + background-color: transparent; + border: none; + color: var(--psp--color, #666); + cursor: pointer; + padding: 0px 6px; + margin: 0; + margin-left: 15.5px; + margin-right: auto; + flex: 0 1 auto; + border-radius: 3px; + &:hover { + background-color: var(--psp--color); + color: var(--psp--background-color); + } + } + + /* .p-TabBar-tabLabel[value="[untitled]"] { */ + /* color: #ddd !important; */ + /* } */ + + .lm-TabBar-tabLabel:focus { + outline: none; + color: var(--workspace-secondary--color, #666) !important; + cursor: text; + } + + .lm-TabBar-tab.lm-mod-closable > .lm-TabBar-tabCloseIcon:before { + content: var(--close-button--content, "\2715"); + } + + .lm-TabBar-tab > .lm-TabBar-tabConfigIcon:before { + content: var(--open-settings-button--content, "\1F527"); + font-family: var(--settings--font-family, "Arial"); + transition: color 0.5s ease; + } + + .lm-TabBar-tab.lm-mod-current.settings_open + > .lm-TabBar-tabConfigIcon:before { + content: var(--close-settings-button--content, "\1F527"); + } + + .lm-TabBar-tab.lm-mod-current.linked > .lm-TabBar-tabConfigIcon:before { + color: #22a0ce; + } + + .lm-TabBar-tab > .lm-TabBar-tabConfigIcon { + opacity: 0; + pointer-events: none; + } + + .lm-TabBar-tab.lm-mod-current > .lm-TabBar-tabConfigIcon { + opacity: 1; + pointer-events: all; + } + + .lm-mod-current { + .lm-TabBar-tabConfigIcon, + .lm-TabBar-tabCloseIcon { + color: inherit; + transition: color 0.2s ease-out; + } + + .lm-TabBar-tabConfigIcon:hover, + .lm-TabBar-tabCloseIcon:hover { + color: #1a7da1; + transition: color 0.2s ease-out; + } + } + + .lm-BoxPanel { + overflow: scroll !important; + } + + .lm-TabBar, + .lm-TabBar-tab { + position: relative; + + overflow: visible !important; + } + + .lm-TabBar-tabLabel:empty::after { + content: "untitled"; + color: #aaa; + } + + .lm-mod-current .lm-TabBar-tabLabel:empty::after { + color: #ddd; + } + + .lm-TabBar-tabLabel:empty::after { + content: "untitled"; + } + + .divider { + left: 32px; + bottom: 0; + position: absolute; + right: 32px; + + height: 1px; + background-color: var(--psp-workspace--tabbar--border-color); + margin-bottom: 0px; + } + + .lm-TabBar-tab .drag-handle { + pointer-events: all; + height: 12px; + width: 14px; + -webkit-mask-image: var(--psp-icon--column-drag-handle--mask-image); + mask-image: var(--psp-icon--column-drag-handle--mask-image); + padding: 12px 0 12px 12px; + background-repeat: no-repeat; + background-color: var(--psp--color, red); + content: ""; + display: inline-block; + -webkit-mask-size: cover; + mask-size: auto; + mask-position: center; + mask-repeat: no-repeat; + } + + .lm-TabBar { + /* z-index: -1; */ + pointer-events: none; + .lm-TabBar-tabCloseIcon { + pointer-events: all; + } + + .bookmarks-button { + pointer-events: all; + } + } + + .lm-TabBar-tab.lm-mod-hidden { + display: flex !important; + opacity: 0.5; + } + + .lm-TabBar-tab.lm-mod-current .divider { + display: block; + } + + .pfm-button-base { + background: white !important; + } + + .pfm-button-base:active { + background: #016bc6 !important; + } + + .lm-TabBar-content { + padding: 0px; + border-bottom: 0px solid #fff !important; + border-left: #eaeaea; + border-right: #eaeaea; + } + + .lm-TabBar-tab.lm-mod-current { + .shadow { + margin: -1px; + position: absolute; + width: calc(100% + 2px); + height: 200%; + pointer-events: none; + left: 0px; + } + + &.settings_open .shadow { + box-shadow: none; + } + } + + .lm-TabBar-tab { + /* margin: 0px 4px; */ + border-color: #eaeaea; + align-items: center; + } + + .lm-TabBar-content.inactive-blur > .lm-TabBar-tab { + background-color: var( + --workspace-inactive-blur--background-color, + transparent + ); + } + + .condensed .lm-TabBar-content { + & > .lm-TabBar-tab.lm-mod-current .lm-TabBar-tabConfigIcon { + display: block; + } + + & > .lm-TabBar-tab.lm-mod-current.settings_open { + .lm-TabBar-tabLabel { + margin-left: 0px; + } + } + } + + .lm-TabBar-content > .lm-TabBar-tab.lm-mod-current.settings_open { + border-width: 1px 1px 0px 1px !important; + border-color: var(--psp-workspace--tabbar--border-color, #ddd); + + .lm-TabBar-tabToolbar { + display: flex; + } + + .divider { + height: 1px; + margin-bottom: 0px; + background-color: var(--psp-workspace--tabbar--border-color, #ddd); + } + + &:last-child:first-child .divider { + transition: none; + } + } + + .lm-TabBar-content > .lm-TabBar-tab.lm-mod-current.perspective_updating { + .lm-TabBar-tabConfigIcon { + display: none; + } + + .lm-TabBar-tabLoadingIcon { + display: block; + } + } + + .lm-TabBar-content > .lm-TabBar-tab { + max-width: 100000px !important; + flex: 0 1 100000px !important; + background: none; + color: #737373; + height: 40px !important; + max-height: 40px !important; + margin-bottom: -40px; + transform: none !important; + transition: color 0.2s ease-out; + } + + .lm-TabBar-content > .lm-TabBar-tab { + color: #ccc; + } + + .lm-TabBar-content > .lm-TabBar-tab { + color: #ccc; + } + + .lm-TabBar-content > .lm-TabBar-tab:hover { + color: #ccc; + } + + .lm-TabBar-content > .lm-TabBar-tab.lm-mod-current { + color: var(--workspace-secondary--color, #666); + } + + .lm-TabBar-tab.lm-mod-current .lm-TabBar-tabLabel { + white-space: nowrap !important; + } + + .lm-TabBar-tabLabel { + font-family: inherit; + font-size: 12px; + line-height: 22px; + text-align: start; + white-space: normal !important; + word-break: break-all; + } + + .lm-TabBar-tabCloseIcon, + .lm-TabBar-tabConfigIcon { + cursor: pointer !important; + line-height: 22px !important; + padding-right: 16.5px !important; + } + + .lm-TabBar-tabConfigIcon { + padding-left: 8px; + padding-right: 8px !important; + } + + .lm-TabBar-tabLoadingIcon { + padding-left: 11px; + padding-right: 12px; + } + + .bottom .lm-TabBar-tab { + flex-basis: 10000px !important; + max-width: 10000px !important; + } + + .lm-TabBar-content > .lm-TabBar-tab.lm-mod-current { + color: var(--workspace-tabbar--color, #666) !important; + /* border: var(--psp-workspace--tabbar--border, 1px solid #ddd); */ + /* border-width: var(--psp-workspace--tabbar-tab--border-width); */ + /* box-shadow: 0 13px 0 -12px var(--psp-inactive--border-color); */ + /* border-radius: var(--psp-workspace--tabbar--border-radius, 6px) */ + /* var(--psp-workspace--tabbar--border-radius, 6px) 0 0; */ + /* background-color: var(--workspace-tabbar--background-color, white); */ + background: none; + height: 40px !important; + max-height: 40px !important; + margin-bottom: -40px; + border: 0 solid transparent; + border-width: 1px 1px 0px 1px; + } + + .bottom .lm-TabBar-tab.lm-mod-current { + border: none; + } + + ::-webkit-scrollbar-thumb { + background-color: #ccc; + } + + .perspective-workspace.context-menu * .lm-TabBar.context-focus { + opacity: 1; + } + + .perspective-workspace.context-menu * .lm-TabBar, + .perspective-workspace.context-menu + .lm-Widget.workspace-widget:not(.context-focus) + .viewer-container { + opacity: 0.2; + } + + .bookmarks-button { + margin-left: 11px; + margin-right: -13px; + height: 20px; + border-radius: 3px; + border: 1px solid var(--psp-inactive--color); + background-color: var(--psp--background-color); + + &:hover { + background-color: var(--psp--color); + border-color: var(--psp--color); + } + } + + .bookmarks { + background-repeat: no-repeat; + background-color: var(--psp--color); + content: ""; + display: inline-block; + -webkit-mask-size: cover; + mask-size: cover; + cursor: pointer; + width: 20px; + height: 12px; + -webkit-mask-image: var(--psp-icon--bookmarks--mask-image); + mask-image: var(--psp-icon--bookmarks--mask-image); + -webkit-mask-position: center; + mask-position: center; + -webkit-mask-size: auto; + mask-size: auto; + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + padding: 4px 6px; + + &:hover { + background-color: var(--psp--background-color); + } + } +} diff --git a/packages/workspace/src/less/viewer.less b/packages/workspace/src/css/viewer.css similarity index 62% rename from packages/workspace/src/less/viewer.less rename to packages/workspace/src/css/viewer.css index da4463c516..af50ef46b2 100644 --- a/packages/workspace/src/less/viewer.less +++ b/packages/workspace/src/css/viewer.css @@ -1,55 +1,54 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@border-color: 1px solid #eaeaea; +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ ::slotted(.workspace-master-widget) { - --status-bar--display: none; - --config-button-icon--content: var( + --psp-status-bar--display: none; + --psp-label--config-button--content: var( --open-settings-button--content, "\1F527" ) !important; } .workspace-master-widget[settings] { - --config-button-icon--content: var( + --psp-label--config-button--content: var( --close-settings-button--content, "\1F527" ) !important; } :not(.workspace-master-widget).widget-maximize { - --config-button-icon--content: var( + --psp-label--config-button--content: var( --open-settings-button--content, "\1F527" ) !important; } :not(.workspace-master-widget).widget-maximize[settings] { - --config-button-icon--content: var( + --psp-label--config-button--content: var( --close-settings-button--content, "\1F527" ) !important; } .lm-DockPanel-widget { - border: @border-color; + border: 1px solid #eaeaea; border-width: 0px !important; min-width: 300px; min-height: 200px; } :not.workspace-master-widget { - --config-button-icon--content: "" !important; + --psp-label--config-button--content: "" !important; } .context-menu > perspective-viewer.context-focus { @@ -66,7 +65,7 @@ } :host { - --bookmarks--mask-image: url("../svg/bookmark-icon.svg"); + --psp-icon--bookmarks--mask-image: url("../svg/bookmark-icon.svg"); } ::slotted(perspective-viewer) { @@ -79,17 +78,19 @@ width: 100%; height: 100%; overflow: visible !important; - --close-button--display: flex; + --psp-close-button--display: flex; } ::slotted(perspective-viewer.bookmarks-container:not([settings])) { - --status-ok-icon--mask-image: var(--bookmarks--mask-image) !important; - --status-ok-icon--border-color: var(--inactive--color); - --status-ok-icon--hover--border-color: var(--icon--color); - --status-ok-icon--hover--background-color: var(--icon--color); - --status-ok-icon--hover--color: var(--plugin--background); - --status-ok-icon--cursor: pointer; - --status-indicator--pointer-events: all; + --psp-icon--status-ok--mask-image: var( + --psp-icon--bookmarks--mask-image + ) !important; + --psp-status-icon--ok--border-color: var(--psp-inactive--color); + --psp-status-icon--ok-hover--border-color: var(--psp--color); + --psp-status-icon--ok-hover--background-color: var(--psp--color); + --psp-status-icon--ok-hover--color: var(--psp--background-color); + --psp-status-icon--ok--cursor: pointer; + --psp-status-icon--pointer-events: all; } ::slotted(perspective-viewer::part(status-indicator)) { @@ -98,7 +99,7 @@ } ::slotted(perspective-viewer:not(.widget-maximize)) { - --status-bar--padding: 0 36px 0 8px; + --psp-status-bar--padding: 0 36px 0 8px; } :host-context(.lm-mod-override-cursor) { diff --git a/packages/workspace/src/less/widget.less b/packages/workspace/src/css/widget.css similarity index 57% rename from packages/workspace/src/less/widget.less rename to packages/workspace/src/css/widget.css index 93d03fd007..8c67d93459 100644 --- a/packages/workspace/src/less/widget.less +++ b/packages/workspace/src/css/widget.css @@ -1,24 +1,26 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@border-color: 1px solid #eaedef; +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ .lm-DockPanel:not([data-mode="single-document"]) .viewer-container { - border: var(--workspace-tabbar--border, 1px solid var(--inactive--color)); - border-width: var(--workspace-tabbar--border-width); - border-radius: var(--workspace-tabbar--border-radius, 6px) - var(--workspace-tabbar--border-radius, 6px) - var(--workspace-tabbar--border-radius, 6px) - var(--workspace-tabbar--border-radius, 6px); + border: var( + --psp-workspace--tabbar--border, + 1px solid var(--psp-inactive--color) + ); + border-width: var(--psp-workspace--tabbar--border-width); + border-radius: var(--psp-workspace--tabbar--border-radius, 6px) + var(--psp-workspace--tabbar--border-radius, 6px) + var(--psp-workspace--tabbar--border-radius, 6px) + var(--psp-workspace--tabbar--border-radius, 6px); } .viewer-container { @@ -37,6 +39,6 @@ .workspace-widget { display: flex; flex-direction: column; - border: @border-color; + border: 1px solid #eaedef; border-width: 0px !important; } diff --git a/packages/workspace/src/less/workspace.less b/packages/workspace/src/css/workspace.css similarity index 60% rename from packages/workspace/src/less/workspace.less rename to packages/workspace/src/css/workspace.css index b35231352f..0cb8c25297 100644 --- a/packages/workspace/src/less/workspace.less +++ b/packages/workspace/src/css/workspace.css @@ -1,14 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ @import "@lumino/widgets/style/widget.css"; @import "@lumino/widgets/style/accordionpanel.css"; @@ -21,17 +22,28 @@ @import "@lumino/widgets/style/tabbar.css"; @import "@lumino/widgets/style/tabpanel.css"; -@import "./injected.less"; +/* @import "@lumino/widgets/style/widget.css"; +@import "@lumino/widgets/style/accordionpanel.css"; +@import "@lumino/widgets/style/commandpalette.css"; +@import "@lumino/widgets/style/dockpanel.css"; +@import "@lumino/widgets/style/menu.css"; +@import "@lumino/widgets/style/menubar.css"; +@import "@lumino/widgets/style/scrollbar.css"; +@import "@lumino/widgets/style/splitpanel.css"; +@import "@lumino/widgets/style/tabbar.css"; +@import "@lumino/widgets/style/tabpanel.css"; */ +@import "@lumino/widgets/style/index.css"; -:host { - @import "./tabbar.less"; - @import "./dockpanel.less"; - @import "./widget.less"; +@import "./injected.css"; +@import "./tabbar.css"; +@import "./dockpanel.css"; +@import "./widget.css"; - --workspace-spacing: 3px; +:host { + --psp-workspace--spacing: 3px; - // width: 100%; - // height: 100%; + /* width: 100%; */ + /* height: 100%; */ .workspace { width: 100%; @@ -44,7 +56,9 @@ } div.lm-SplitPanel-handle { - background-color: var(--workspace-split-panel-handle--background-color); + background-color: var( + --psp-workspace--split-panel-handle--background-color + ); } .master-panel { diff --git a/packages/workspace/src/less/dockpanel.less b/packages/workspace/src/less/dockpanel.less deleted file mode 100644 index acd4dfda6a..0000000000 --- a/packages/workspace/src/less/dockpanel.less +++ /dev/null @@ -1,105 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -.lm-DockPanel { - overflow: var(--dock-panel--overflow, hidden); - position: absolute; - background-color: var(--detail--background-color, transparent); - padding: var(--workspace-spacing); - top: 0; - left: 0; - right: 0; - bottom: 0; - &[data-mode="single-document"] { - padding: 0px; - } -} - -.lm-Widget, -.lm-Widget { - cursor: inherit; -} - -.lm-DockPanel.ew, -.lm-DockPanel.ew .lm-Widget, -.lm-SplitPanel.ew, -.lm-SplitPanel.ew .lm-Widget { - cursor: ew-resize !important; -} - -.lm-DockPanel.ns, -.lm-DockPanel.ns .lm-Widget, -.lm-SplitPanel.ns, -.lm-SplitPanel.ns .lm-Widget { - cursor: ns-resize !important; -} - -.workspace-master-widget { - min-width: 100px !important; -} - -.lm-DockPanel.resizing ::slotted(perspective-viewer), -.lm-SplitPanel.resizing ::slotted(perspective-viewer) { - pointer-events: none; -} - -.widget-blur ::slotted(perspective-viewer) { - opacity: 0.5; -} - -.lm-DockPanel-handle.resizing { - background-color: rgba(0, 0, 0, 0.05); -} - -.perspective-scroll-panel { - overflow: auto !important; -} - -.lm-Panel { - min-height: 100%; -} - -.lm-DockPanel-handle { - background-color: none; -} - -.lm-SplitPanel-handle { - background-color: var(--workspace-split-panel-handle--background-color); -} - -.lm-SplitPanel-handle, -.lm-DockPanel-handle { - transition: background-color 0.3s ease-out; - &:hover { - background-color: rgba(0, 0, 0, 0.05); - } -} - -.lm-DockPanel-handle[data-orientation="horizontal"] { - width: 10px !important; - margin-left: -5px; -} - -.lm-DockPanel-handle[data-orientation="vertical"] { - height: 10px !important; - margin-top: -5px; -} - -.lm-DockPanel-overlay { - background: rgba(75, 75, 75, 0.2); - border: 1px dashed #666; - border-radius: 6px; - transition-property: top, left, right, bottom; - transition-duration: 50ms; - transition-timing-function: linear; - margin: 0px; -} diff --git a/packages/workspace/src/less/menu.less b/packages/workspace/src/less/menu.less deleted file mode 100644 index 334b9931a1..0000000000 --- a/packages/workspace/src/less/menu.less +++ /dev/null @@ -1,128 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import "@lumino/widgets/style/menu.css"; - -.lm-Menu { - font-size: 12px; - padding: 8px; - background-color: var(--plugin--background); - color: var(--icon--color); - border: 1px solid var(--inactive--color); - border-radius: 3px; - max-width: 350px; - top: 0; - left: 0; -} - -.lm-Menu.perspective-workspace-menu { - .lm-Menu-item { - padding-left: 37px !important; - min-width: var(--min-width); - } -} - -.lm-Menu-item.lm-mod-active { - background-color: var(--icon--color); - color: var(--plugin--background); -} - -.lm-Menu-item.lm-mod-disabled { - opacity: 0.5; -} - -.lm-Menu-itemIcon { - width: 24px; - height: 12px; - margin-right: 4px; -} - -.lm-Menu-itemLabel { - flex: 1 1; - padding: 4px 2px 4px 2px; -} - -.lm-Menu-itemMnemonic { - text-decoration: underline; -} - -.lm-Menu-itemShortcut { - padding: 4px 0px; -} - -.lm-Menu-itemSubmenuIcon { - width: 24px; - height: 18px; -} - -.lm-Menu-item { - display: flex; - align-items: center; - outline: none; - - margin: 0 -8px; - padding: 0 8px; -} - -.lm-Menu-item[data-type="separator"] > div { - padding: 0; - height: 9px; -} - -.lm-Menu-item[data-type="separator"] > div::after { - content: ""; - display: block; - position: relative; - top: 4px; - border-top: 1px solid; -} - -.lm-MenuBar-menu { - transform: translateY(-1px); -} - -.lm-MenuBar-item { - padding: 10px 32px; - border-left: 1px solid transparent; - border-right: 1px solid transparent; - color: #737373 !important; -} - -.lm-MenuBar-item.lm-mod-active { - background: rgba(0, 0, 0, 0.2); -} - -.lm-MenuBar.lm-mod-active .lm-MenuBar-item.lm-mod-active { - z-index: 10001; - background: rgba(0, 0, 0, 0.2); - // border-left: 1px solid #c0c0c0; - // border-right: 1px solid #c0c0c0; -} - -.lm-Menu-itemIcon:before { - content: attr(content); - font-family: - "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas", - "Liberation Mono", monospace; -} - -[data-type="submenu"] .lm-Menu-itemSubmenuIcon:before { - content: ">"; - font-family: - "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas", - "Liberation Mono", monospace; - height: 18px; -} - -.lm-mod-drag-image.lm-TabBar-tab { - display: none; -} diff --git a/packages/workspace/src/less/tabbar.less b/packages/workspace/src/less/tabbar.less deleted file mode 100644 index f428d240a0..0000000000 --- a/packages/workspace/src/less/tabbar.less +++ /dev/null @@ -1,389 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -.lm-TabBar-tabLabel { - background-color: transparent; - border: none; - color: var(--icon--color, #666); - cursor: pointer; - padding: 0px 6px; - margin: 0; - margin-left: 15.5px; - margin-right: auto; - flex: 0 1 auto; - border-radius: 3px; - &:hover { - background-color: var(--icon--color); - color: var(--plugin--background); - } -} - -// .p-TabBar-tabLabel[value="[untitled]"] { -// color: #ddd !important; -// } - -.lm-TabBar-tabLabel:focus { - outline: none; - color: var(--workspace-secondary--color, #666) !important; - cursor: text; -} - -.lm-TabBar-tab.lm-mod-closable > .lm-TabBar-tabCloseIcon:before { - content: var(--close-button--content, "\2715"); -} - -.lm-TabBar-tab > .lm-TabBar-tabConfigIcon:before { - content: var(--open-settings-button--content, "\1F527"); - font-family: var(--settings--font-family, "Arial"); - transition: color 0.5s ease; -} - -.lm-TabBar-tab.lm-mod-current.settings_open > .lm-TabBar-tabConfigIcon:before { - content: var(--close-settings-button--content, "\1F527"); -} - -.lm-TabBar-tab.lm-mod-current.linked > .lm-TabBar-tabConfigIcon:before { - color: #22a0ce; -} - -.lm-TabBar-tab > .lm-TabBar-tabConfigIcon { - opacity: 0; - pointer-events: none; -} - -.lm-TabBar-tab.lm-mod-current > .lm-TabBar-tabConfigIcon { - opacity: 1; - pointer-events: all; -} - -.lm-mod-current { - .lm-TabBar-tabConfigIcon, - .lm-TabBar-tabCloseIcon { - color: inherit; - transition: color 0.2s ease-out; - } - - .lm-TabBar-tabConfigIcon:hover, - .lm-TabBar-tabCloseIcon:hover { - color: #1a7da1; - transition: color 0.2s ease-out; - } -} - -.lm-BoxPanel { - overflow: scroll !important; -} - -.lm-TabBar, -.lm-TabBar-tab { - position: relative; - - overflow: visible !important; -} - -.lm-TabBar-tabLabel:empty::after { - content: "untitled"; - color: #aaa; -} - -.lm-mod-current .lm-TabBar-tabLabel:empty::after { - color: #ddd; -} - -.lm-TabBar-tabLabel:empty::after { - content: "untitled"; -} - -.divider { - left: 32px; - bottom: 0; - position: absolute; - right: 32px; - - height: 1px; - background-color: var(--workspace-tabbar--border-color); - margin-bottom: 0px; -} - -.lm-TabBar-tab .drag-handle { - pointer-events: all; - height: 12px; - width: 14px; - -webkit-mask-image: var(--column-drag-handle--mask-image); - mask-image: var(--column-drag-handle--mask-image); - padding: 12px 0 12px 12px; - background-repeat: no-repeat; - background-color: var(--icon--color, red); - content: ""; - display: inline-block; - -webkit-mask-size: cover; - mask-size: auto; - mask-position: center; - mask-repeat: no-repeat; -} - -.lm-TabBar { - // z-index: -1; - pointer-events: none; - .lm-TabBar-tabCloseIcon { - pointer-events: all; - } - - .bookmarks-button { - pointer-events: all; - } -} - -.lm-TabBar-tab.lm-mod-hidden { - display: flex !important; - opacity: 0.5; -} - -.lm-TabBar-tab.lm-mod-current .divider { - display: block; -} - -// .lm-TabBar-tabLabel input { -// height: 18px; -// } - -// .lm-TabBar { -// // min-height: 0px !important; -// } - -@border-color: 1px solid #eaeaea; -@night-border-color: 1px solid #ddd; - -.pfm-button-base { - background: white !important; -} - -.pfm-button-base:active { - background: #016bc6 !important; -} - -.lm-TabBar-content { - padding: 0px; - border-bottom: 0px solid #fff !important; - border-left: #eaeaea; - border-right: #eaeaea; -} - -.lm-TabBar-tab.lm-mod-current { - .shadow { - margin: -1px; - position: absolute; - width: calc(100% + 2px); - height: 200%; - pointer-events: none; - left: 0px; - } - - &.settings_open .shadow { - box-shadow: none; - } -} - -.lm-TabBar-tab { - // margin: 0px 4px; - border-color: #eaeaea; - align-items: center; -} - -.lm-TabBar-content.inactive-blur > .lm-TabBar-tab { - background-color: var( - --workspace-inactive-blur--background-color, - transparent - ); -} - -.condensed .lm-TabBar-content { - & > .lm-TabBar-tab.lm-mod-current .lm-TabBar-tabConfigIcon { - display: block; - } - - & > .lm-TabBar-tab.lm-mod-current.settings_open { - .lm-TabBar-tabLabel { - margin-left: 0px; - } - } -} - -.lm-TabBar-content > .lm-TabBar-tab.lm-mod-current.settings_open { - border-width: 1px 1px 0px 1px !important; - border-color: var(--workspace-tabbar--border-color, #ddd); - - .lm-TabBar-tabToolbar { - display: flex; - } - - .divider { - height: 1px; - margin-bottom: 0px; - background-color: var(--workspace-tabbar--border-color, #ddd); - } - - &:last-child:first-child .divider { - transition: none; - } -} - -.lm-TabBar-content > .lm-TabBar-tab.lm-mod-current.perspective_updating { - .lm-TabBar-tabConfigIcon { - display: none; - } - - .lm-TabBar-tabLoadingIcon { - display: block; - } -} - -.lm-TabBar-content > .lm-TabBar-tab { - max-width: 100000px !important; - flex: 0 1 100000px !important; - background: none; - color: #737373; - height: 40px !important; - max-height: 40px !important; - margin-bottom: -40px; - transform: none !important; - transition: color 0.2s ease-out; -} - -.lm-TabBar-content > .lm-TabBar-tab { - color: #ccc; -} - -.lm-TabBar-content > .lm-TabBar-tab { - color: #ccc; -} - -.lm-TabBar-content > .lm-TabBar-tab:hover { - color: #ccc; -} - -.lm-TabBar-content > .lm-TabBar-tab.lm-mod-current { - color: var(--workspace-secondary--color, #666); -} - -.lm-TabBar-tab.lm-mod-current .lm-TabBar-tabLabel { - white-space: nowrap !important; -} - -.lm-TabBar-tabLabel { - font-family: inherit; - font-size: 12px; - line-height: 22px; - text-align: start; - white-space: normal !important; - word-break: break-all; -} - -.lm-TabBar-tabCloseIcon, -.lm-TabBar-tabConfigIcon { - cursor: pointer !important; - line-height: 22px !important; - padding-right: 16.5px !important; -} - -.lm-TabBar-tabConfigIcon { - padding-left: 8px; - padding-right: 8px !important; -} - -.lm-TabBar-tabLoadingIcon { - padding-left: 11px; - padding-right: 12px; -} - -.bottom .lm-TabBar-tab { - flex-basis: 10000px !important; - max-width: 10000px !important; -} - -.lm-TabBar-content > .lm-TabBar-tab.lm-mod-current { - color: var(--workspace-tabbar--color, #666) !important; - // border: var(--workspace-tabbar--border, 1px solid #ddd); - // border-width: var(--workspace-tabbar-tab--border-width); - // box-shadow: 0 13px 0 -12px var(--inactive--border-color); - // border-radius: var(--workspace-tabbar--border-radius, 6px) - // var(--workspace-tabbar--border-radius, 6px) 0 0; - // background-color: var(--workspace-tabbar--background-color, white); - background: none; - height: 40px !important; - max-height: 40px !important; - margin-bottom: -40px; - border: 0 solid transparent; - border-width: 1px 1px 0px 1px; -} - -.bottom .lm-TabBar-tab.lm-mod-current { - border: none; -} - -::-webkit-scrollbar-thumb { - background-color: #ccc; -} - -.perspective-workspace.context-menu * .lm-TabBar.context-focus { - opacity: 1; -} - -.perspective-workspace.context-menu * .lm-TabBar, -.perspective-workspace.context-menu - .lm-Widget.workspace-widget:not(.context-focus) - .viewer-container { - opacity: 0.2; -} - -@mixin icon { - background-repeat: no-repeat; - background-color: var(--icon--color); - content: ""; - display: inline-block; - -webkit-mask-size: cover; - mask-size: cover; -} - -.bookmarks-button { - margin-left: 11px; - margin-right: -13px; - height: 20px; - border-radius: 3px; - border: 1px solid var(--inactive--color); - background-color: var(--plugin--background); - - &:hover { - background-color: var(--icon--color); - border-color: var(--icon--color); - } -} - -.bookmarks { - @include icon; - cursor: pointer; - width: 20px; - height: 12px; - -webkit-mask-image: var(--bookmarks--mask-image); - mask-image: var(--bookmarks--mask-image); - -webkit-mask-position: center; - mask-position: center; - -webkit-mask-size: auto; - mask-size: auto; - -webkit-mask-repeat: no-repeat; - mask-repeat: no-repeat; - padding: 4px 6px; - - &:hover { - background-color: var(--plugin--background); - } -} diff --git a/packages/workspace/src/svg/bookmark-icon.svg b/packages/workspace/src/svg/bookmark-icon.svg index 73a34079ab..a9fbef4004 100644 --- a/packages/workspace/src/svg/bookmark-icon.svg +++ b/packages/workspace/src/svg/bookmark-icon.svg @@ -1,4 +1,4 @@ - + diff --git a/packages/workspace/src/themes/pro-dark.less b/packages/workspace/src/themes/pro-dark.css similarity index 73% rename from packages/workspace/src/themes/pro-dark.less rename to packages/workspace/src/themes/pro-dark.css index 7571e72d27..d3b6b93ec5 100644 --- a/packages/workspace/src/themes/pro-dark.less +++ b/packages/workspace/src/themes/pro-dark.css @@ -1,20 +1,14 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@grey60: #c5c9d0; -@grey500: #3b3f46; -@grey600: #2f3136; -@grey700: #2a2c2f; -@grey800: #242526; +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ perspective-workspace, perspective-workspace[theme="Pro Dark"], @@ -23,8 +17,8 @@ perspective-indicator[theme="Pro Dark"] { } perspective-workspace perspective-viewer { - --status-bar--height: 39px; - --plugin-selector--height: 47px; + --psp-status-bar--height: 39px; + --psp-plugin-selector--height: 47px; } perspective-workspace perspective-viewer.widget-maximize { @@ -38,38 +32,7 @@ perspective-workspace perspective-viewer.widget-maximize { } perspective-workspace { - @include perspective-workspace-pro-base; - @include perspective-viewer-pro-dark--colors; - - background-color: #000202; - color: white; - // --workspace-master--background-color: @grey800; - --workspace-tabbar--background-color: @grey800; - // --workspace-tabbar--border: 1px solid @grey500; - // --workspace-tabbar--border-color: @grey500; - --workspace-secondary--color: @grey60; - --workspace-tabbar--border: 1px solid var(--inactive--color); - --workspace-tabbar--border-width: 1px 1px 1px 1px; - --workspace-tabbar--border-radius: 6px; - --workspace-tabbar--border-color: var(--inactive--color); - --workspace-tabbar-tab--border-width: 1px 1px 0 1px; -} - -perspective-viewer[theme="Pro Dark"].workspace-master-widget { - --plugin--background: @grey800; -} - -perspective-workspace-menu { - font-family: - "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas", - "Liberation Mono", monospace; - font-weight: 300; - background: @grey700 !important; - color: white !important; - border: 1px solid @grey500 !important; -} - -@mixin perspective-workspace-pro-base { + /* perspective-workspace-pro-base */ font-family: "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas", "Liberation Mono", monospace; @@ -98,14 +61,13 @@ perspective-workspace-menu { --workspace-tabbar--border-color: var(--inactive--color); --workspace-tabbar-tab--border-width: 1px 1px 0px 1px; - // Workspace + /* Workspace */ --column-drag-handle--mask-image: url("../svg/drag-handle.svg"); --bookmarks--mask-image: url("../svg/bookmark-icon.svg"); -} -@mixin perspective-viewer-pro-dark--colors { + /* perspective-viewer-pro-dark--colors */ background-color: #242526; - --workspace-split-panel-handle--background-color: @grey800; + --workspace-split-panel-handle--background-color: #242526; color: white; --icon--color: white; --active--color: #2770a9; @@ -113,7 +75,6 @@ perspective-workspace-menu { --inactive--color: #61656e; --inactive--border-color: #4c505b; --plugin--background: #242526; - --modal-target--background: rgba(255, 255, 255, 0.05); --active--background: rgba(39, 113, 170, 0.5); --expression--operator-color: #c5c9d0; --expression--function-color: #22a0ce; @@ -130,11 +91,34 @@ perspective-workspace-menu { --select-arrow-dark--background-image ); - // Syntax + /* Syntax */ --code-editor-symbol--color: white; --code-editor-literal--color: #7dc3f0; --code-editor-operator--color: rgb(23, 166, 123); --code-editor-comment--color: rgb(204, 120, 48); --code-editor-column--color: #e18ee1; - // --code-editor-unknown--color: rgb(204, 120, 48); + + background-color: #000202; + color: white; + --workspace-tabbar--background-color: #242526; + --workspace-secondary--color: #c5c9d0; + --workspace-tabbar--border: 1px solid var(--inactive--color); + --workspace-tabbar--border-width: 1px 1px 1px 1px; + --workspace-tabbar--border-radius: 6px; + --workspace-tabbar--border-color: var(--inactive--color); + --workspace-tabbar-tab--border-width: 1px 1px 0 1px; +} + +perspective-viewer[theme="Pro Dark"].workspace-master-widget { + --plugin--background: #242526; +} + +perspective-workspace-menu { + font-family: + "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas", + "Liberation Mono", monospace; + font-weight: 300; + background: #2a2c2f !important; + color: white !important; + border: 1px solid #3b3f46 !important; } diff --git a/packages/workspace/src/themes/pro.less b/packages/workspace/src/themes/pro.css similarity index 63% rename from packages/workspace/src/themes/pro.less rename to packages/workspace/src/themes/pro.css index 29008f31d9..4a5eed045a 100644 --- a/packages/workspace/src/themes/pro.less +++ b/packages/workspace/src/themes/pro.css @@ -1,16 +1,14 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import url("ref://pro.less"); +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ .lm-cursor-backdrop { display: none; @@ -23,38 +21,7 @@ perspective-indicator[theme="Pro Light"] { } perspective-workspace { - @include perspective-workspace-pro-base; - @include perspective-viewer-pro--colors; - background-color: #dadada; -} - -perspective-workspace perspective-viewer.widget-maximize { - --modal-panel--margin: -4px 0 -4px 0; - --status-bar--border-radius: 6px 0 0 0; - --main-column--margin: 3px 0 3px 3px; - --main-column--border: 1px solid var(--inactive--color); - --main-column--border-width: 1px 0px 1px 1px; - --main-column--border-radius: 6px 0 0 6px; - --settings-button--margin: 10px 0 0 0; -} - -perspective-workspace perspective-viewer { - --status-bar--height: 39px; - --plugin-selector--height: 47px; -} - -perspective-viewer[theme="Pro Light"].workspace-master-widget { - background-color: #f2f4f6; - --plugin--background: #f2f4f6; - regular-table { - td, - th { - border-color: #e0e4e9; - } - } -} - -@mixin perspective-workspace-pro-base { + /* perspective-workspace-pro-base */ font-family: "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas", "Liberation Mono", monospace; @@ -84,9 +51,61 @@ perspective-viewer[theme="Pro Light"].workspace-master-widget { --workspace-tabbar--border-color: var(--inactive--color); --workspace-tabbar-tab--border-width: 1px 1px 0px 1px; - // Workspace + /* Workspace */ --column-drag-handle--mask-image: url("../svg/drag-handle.svg"); --bookmarks--mask-image: url("../svg/bookmark-icon.svg"); + + /* perspective-viewer-pro--colors */ + color: #161616; + background-color: #dadada; + --icon--color: #161616; + --inactive--color: #ababab; + --inactive--border-color: #dadada; + + --active--color: #2670a9; + --error--color: #ff471e; + --plugin--background: #ffffff; + --overflow-hint-icon--color: rgba(0, 0, 0, 0.2); + --select--background-color: none; + --warning--background: #042121; + --warning--color: #fdfffd; + + --select-arrow--background-image: var( + --select-arrow-dark--background-image + ); + + --select-arrow--hover--background-image: var( + --select-arrow-light--background-image + ); + + /* TODO deprecate me */ + --overflow-hint-icon--color: #fdfffd; +} + +perspective-workspace perspective-viewer.widget-maximize { + /* --modal-panel--margin: -4px 0 -4px 0; */ + --psp-status-bar--border-radius: 6px 0 0 0; + --psp-main-column--margin: 3px 0 3px 3px; + --psp-main-column--border: 1px solid var(--inactive--color); + --psp-main-column--border-width: 1px 0px 1px 1px; + --psp-main-column--border-radius: 6px 0 0 6px; + /* --settings-button--margin: 10px 0 0 0; */ +} + +perspective-workspace perspective-viewer { + --psp-status-bar--height: 39px; + --psp-plugin-selector--height: 47px; +} + +perspective-viewer[theme="Pro Light"].workspace-master-widget { + background-color: #f2f4f6; + --plugin--background: #f2f4f6; + regular-table { + td, + th { + border-color: #e0e4e9; + } + } } perspective-viewer { diff --git a/packages/workspace/src/ts/perspective-workspace.ts b/packages/workspace/src/ts/perspective-workspace.ts index 550dc8607e..8c420052cf 100644 --- a/packages/workspace/src/ts/perspective-workspace.ts +++ b/packages/workspace/src/ts/perspective-workspace.ts @@ -22,7 +22,7 @@ export { PerspectiveViewerWidget } from "./workspace/widget"; export * from "./extensions"; import { PerspectiveWorkspace, PerspectiveWorkspaceConfig } from "./workspace"; import { bindTemplate, CustomElementProto } from "./utils/custom_elements"; -import style from "../../build/css/workspace.css"; +import style from "../../dist/css/workspace.css"; import template from "../html/workspace.html"; export { PerspectiveWorkspaceConfig }; diff --git a/packages/workspace/src/ts/workspace/dockpanel.ts b/packages/workspace/src/ts/workspace/dockpanel.ts index 29274764ee..ae069eca4a 100644 --- a/packages/workspace/src/ts/workspace/dockpanel.ts +++ b/packages/workspace/src/ts/workspace/dockpanel.ts @@ -149,7 +149,7 @@ export class PerspectiveDockPanel extends DockPanel { parseInt( window .getComputedStyle(this._workspace.element) - .getPropertyValue("--workspace-spacing"), + .getPropertyValue("--psp-workspace--spacing"), ) || 0; 1; } diff --git a/packages/workspace/src/ts/workspace/workspace.ts b/packages/workspace/src/ts/workspace/workspace.ts index e7de217f56..403d228da6 100644 --- a/packages/workspace/src/ts/workspace/workspace.ts +++ b/packages/workspace/src/ts/workspace/workspace.ts @@ -24,7 +24,7 @@ import type { } from "@perspective-dev/viewer"; import type * as psp from "@perspective-dev/client"; import type * as psp_viewer from "@perspective-dev/viewer"; -import injectedStyles from "../../../build/css/injected.css"; +import injectedStyles from "../../../dist/css/injected.css"; import { PerspectiveDockPanel } from "./dockpanel"; import { WorkspaceMenu } from "./menu"; import { createCommands } from "./commands"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1f4c6f1e0c..e406c24b2f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,9 +30,6 @@ catalogs: '@playwright/test': specifier: '=1.58.0' version: 1.58.0 - '@prospective.co/procss': - specifier: 0.1.18 - version: 0.1.18 '@types/chroma-js': specifier: ^3.1.2 version: 3.1.2 @@ -123,6 +120,9 @@ catalogs: less: specifier: ^4.1.0 version: 4.4.2 + lightningcss: + specifier: ^1.29.0 + version: 1.32.0 lodash: specifier: ^4.17.20 version: 4.17.21 @@ -246,7 +246,7 @@ importers: version: link:packages/workspace '@playwright/experimental-ct-react': specifier: 'catalog:' - version: 1.58.0(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(vite@6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1) + version: 1.58.0(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(vite@6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1) '@playwright/test': specifier: 'catalog:' version: 1.58.0 @@ -273,13 +273,13 @@ importers: dependencies: '@docusaurus/core': specifier: ^3.7.0 - version: 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + version: 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@docusaurus/preset-classic': specifier: ^3.7.0 - version: 3.9.2(@algolia/client-search@5.41.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(@types/react@19.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3) + version: 3.9.2(@algolia/client-search@5.41.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(@types/react@19.2.2)(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3) '@docusaurus/theme-common': specifier: ^3.7.0 - version: 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mdx-js/react': specifier: ^3.0.0 version: 3.1.1(@types/react@19.2.2)(react@18.3.1) @@ -671,7 +671,7 @@ importers: devDependencies: vite: specifier: 'catalog:' - version: 6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) examples/webpack-example: dependencies: @@ -783,12 +783,12 @@ importers: '@perspective-dev/test': specifier: 'workspace:' version: link:../../tools/test - '@prospective.co/procss': - specifier: ^0.1.16 - version: 0.1.17 copy-webpack-plugin: specifier: ~12 version: 12.0.2(webpack@5.102.1(webpack-cli@5.1.4)) + lightningcss: + specifier: 'catalog:' + version: 1.32.0 zx: specifier: ^8.1.8 version: 8.8.5 @@ -875,12 +875,12 @@ importers: '@perspective-dev/test': specifier: 'workspace:' version: link:../../tools/test - '@prospective.co/procss': - specifier: 'catalog:' - version: 0.1.18 '@types/d3': specifier: 'catalog:' version: 7.4.3 + lightningcss: + specifier: 'catalog:' + version: 1.32.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -906,12 +906,12 @@ importers: '@perspective-dev/test': specifier: 'workspace:' version: link:../../tools/test - '@prospective.co/procss': - specifier: 'catalog:' - version: 0.1.18 '@types/chroma-js': specifier: 'catalog:' version: 3.1.2 + lightningcss: + specifier: 'catalog:' + version: 1.32.0 prettier: specifier: 'catalog:' version: 3.6.2 @@ -952,9 +952,9 @@ importers: '@perspective-dev/test': specifier: 'workspace:' version: link:../../tools/test - '@prospective.co/procss': + lightningcss: specifier: 'catalog:' - version: 0.1.18 + version: 1.32.0 packages/workspace: dependencies: @@ -998,15 +998,15 @@ importers: '@perspective-dev/viewer': specifier: 'workspace:' version: link:../../rust/perspective-viewer - '@prospective.co/procss': - specifier: 'catalog:' - version: 0.1.18 '@types/lodash': specifier: 'catalog:' version: 4.17.20 '@types/react': specifier: 'catalog:' version: 19.2.2 + lightningcss: + specifier: 'catalog:' + version: 1.32.0 typescript: specifier: 'catalog:' version: 5.9.3 @@ -1050,7 +1050,7 @@ importers: version: link:../../tools/test '@playwright/experimental-ct-react': specifier: 'catalog:' - version: 1.58.0(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(vite@6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1) + version: 1.58.0(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(vite@6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1) '@playwright/test': specifier: 'catalog:' version: 1.58.0 @@ -1142,13 +1142,10 @@ importers: version: link:../../tools/test '@playwright/experimental-ct-react': specifier: 'catalog:' - version: 1.58.0(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(vite@6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1) + version: 1.58.0(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(vite@6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1) '@playwright/test': specifier: 'catalog:' version: 1.58.0 - '@prospective.co/procss': - specifier: 'catalog:' - version: 0.1.18 '@types/node': specifier: 'catalog:' version: 24.9.1 @@ -1158,6 +1155,9 @@ importers: '@types/react-dom': specifier: 'catalog:' version: 18.3.7(@types/react@19.2.2) + lightningcss: + specifier: 'catalog:' + version: 1.32.0 prettier: specifier: 'catalog:' version: 3.6.2 @@ -1278,7 +1278,7 @@ importers: version: 3.0.0 '@playwright/experimental-ct-react': specifier: 'catalog:' - version: 1.58.0(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(vite@6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1) + version: 1.58.0(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(vite@6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1) '@playwright/test': specifier: 'catalog:' version: 1.58.0 @@ -1311,7 +1311,7 @@ importers: dependencies: '@playwright/experimental-ct-react': specifier: 'catalog:' - version: 1.58.0(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(vite@6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1) + version: 1.58.0(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(vite@6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1) '@playwright/test': specifier: 'catalog:' version: 1.58.0 @@ -3384,12 +3384,6 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - '@prospective.co/procss@0.1.17': - resolution: {integrity: sha512-jZCbEji9gTgJIJ41a0VQQV8GARUNKp9ils8/6347fbNkGBtA3cRwhQfRAxnqc0dhyo6pTSjMSflqop5ToIiSwQ==} - - '@prospective.co/procss@0.1.18': - resolution: {integrity: sha512-odl+Vd/Lm2XdkB223/eghsGS4A5x5q8D9f/vCei2Wb/ljyLCGFWvP7w4Dtglid9xpvDCpJZtogeZASLcitMxug==} - '@puppeteer/browsers@2.10.12': resolution: {integrity: sha512-mP9iLFZwH+FapKJLeA7/fLqOlSUwYpMwjR1P5J23qd4e7qGJwecJccJqHYrjw33jmIZYV4dtiTHPD/J+1e7cEw==} engines: {node: '>=18'} @@ -5150,6 +5144,10 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} @@ -6436,6 +6434,76 @@ packages: webpack: optional: true + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -10556,7 +10624,7 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/bundler@3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': + '@docusaurus/bundler@3.9.2(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: '@babel/core': 7.28.5 '@docusaurus/babel': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -10568,7 +10636,7 @@ snapshots: clean-css: 5.3.3 copy-webpack-plugin: 11.0.0(webpack@5.102.1) css-loader: 6.11.0(webpack@5.102.1) - css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.102.1) + css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(lightningcss@1.32.0)(webpack@5.102.1) cssnano: 6.1.2(postcss@8.5.6) file-loader: 6.2.0(webpack@5.102.1) html-minifier-terser: 7.2.0 @@ -10597,10 +10665,10 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/core@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': + '@docusaurus/core@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: '@docusaurus/babel': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/bundler': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/bundler': 3.9.2(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@docusaurus/logger': 3.9.2 '@docusaurus/mdx-loader': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -10726,13 +10794,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/plugin-content-blog@3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': + '@docusaurus/plugin-content-blog@3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@docusaurus/logger': 3.9.2 '@docusaurus/mdx-loader': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-common': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -10767,13 +10835,13 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': + '@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@docusaurus/logger': 3.9.2 '@docusaurus/mdx-loader': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/module-type-aliases': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-common': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -10807,9 +10875,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-content-pages@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': + '@docusaurus/plugin-content-pages@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@docusaurus/mdx-loader': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -10837,9 +10905,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-css-cascade-layers@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': + '@docusaurus/plugin-css-cascade-layers@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -10864,9 +10932,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-debug@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': + '@docusaurus/plugin-debug@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) fs-extra: 11.3.2 @@ -10892,9 +10960,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-analytics@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': + '@docusaurus/plugin-google-analytics@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 @@ -10918,9 +10986,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-gtag@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': + '@docusaurus/plugin-google-gtag@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/gtag.js': 0.0.12 @@ -10945,9 +11013,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-tag-manager@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': + '@docusaurus/plugin-google-tag-manager@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 @@ -10971,9 +11039,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-sitemap@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': + '@docusaurus/plugin-sitemap@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@docusaurus/logger': 3.9.2 '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -11002,9 +11070,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-svgr@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': + '@docusaurus/plugin-svgr@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -11032,22 +11100,22 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/preset-classic@3.9.2(@algolia/client-search@5.41.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(@types/react@19.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3)': - dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - '@docusaurus/plugin-content-blog': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - '@docusaurus/plugin-content-pages': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - '@docusaurus/plugin-css-cascade-layers': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - '@docusaurus/plugin-debug': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - '@docusaurus/plugin-google-analytics': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - '@docusaurus/plugin-google-gtag': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - '@docusaurus/plugin-google-tag-manager': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - '@docusaurus/plugin-sitemap': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - '@docusaurus/plugin-svgr': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - '@docusaurus/theme-classic': 3.9.2(@types/react@19.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-search-algolia': 3.9.2(@algolia/client-search@5.41.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(@types/react@19.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3) + '@docusaurus/preset-classic@3.9.2(@algolia/client-search@5.41.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(@types/react@19.2.2)(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3)': + dependencies: + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-content-blog': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-content-pages': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-css-cascade-layers': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-debug': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-google-analytics': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-google-gtag': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-google-tag-manager': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-sitemap': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-svgr': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/theme-classic': 3.9.2(@types/react@19.2.2)(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-search-algolia': 3.9.2(@algolia/client-search@5.41.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(@types/react@19.2.2)(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3) '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -11077,16 +11145,16 @@ snapshots: '@types/react': 19.2.2 react: 18.3.1 - '@docusaurus/theme-classic@3.9.2(@types/react@19.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': + '@docusaurus/theme-classic@3.9.2(@types/react@19.2.2)(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@docusaurus/logger': 3.9.2 '@docusaurus/mdx-loader': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/module-type-aliases': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-blog': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - '@docusaurus/plugin-content-pages': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-blog': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-content-pages': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/theme-translations': 3.9.2 '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -11124,11 +11192,11 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/theme-common@3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/theme-common@3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@docusaurus/mdx-loader': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/module-type-aliases': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-common': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/history': 4.7.11 @@ -11148,13 +11216,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/theme-search-algolia@3.9.2(@algolia/client-search@5.41.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(@types/react@19.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3)': + '@docusaurus/theme-search-algolia@3.9.2(@algolia/client-search@5.41.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(@types/react@19.2.2)(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.9.3)': dependencies: '@docsearch/react': 4.2.0(@algolia/client-search@5.41.0)(@types/react@19.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) '@docusaurus/logger': 3.9.2 - '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@18.3.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/theme-translations': 3.9.2 '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -12533,11 +12601,11 @@ snapshots: '@perspective-dev/server@4.3.0': {} - '@playwright/experimental-ct-core@1.58.0(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)': + '@playwright/experimental-ct-core@1.58.0(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)': dependencies: playwright: 1.58.0 playwright-core: 1.58.0 - vite: 6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -12551,10 +12619,10 @@ snapshots: - tsx - yaml - '@playwright/experimental-ct-react@1.58.0(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(vite@6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1)': + '@playwright/experimental-ct-react@1.58.0(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(vite@6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1)': dependencies: - '@playwright/experimental-ct-core': 1.58.0(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@vitejs/plugin-react': 4.7.0(vite@6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@playwright/experimental-ct-core': 1.58.0(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + '@vitejs/plugin-react': 4.7.0(vite@6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - '@types/node' - jiti @@ -12588,10 +12656,6 @@ snapshots: '@polka/url@1.0.0-next.29': {} - '@prospective.co/procss@0.1.17': {} - - '@prospective.co/procss@0.1.18': {} - '@puppeteer/browsers@2.10.12': dependencies: debug: 4.4.3 @@ -13234,7 +13298,7 @@ snapshots: '@vercel/oidc@3.0.3': {} - '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -13242,7 +13306,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -14149,7 +14213,7 @@ snapshots: optionalDependencies: webpack: 5.102.1(webpack-cli@5.1.4) - css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.102.1): + css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(lightningcss@1.32.0)(webpack@5.102.1): dependencies: '@jridgewell/trace-mapping': 0.3.31 cssnano: 6.1.2(postcss@8.5.6) @@ -14160,6 +14224,7 @@ snapshots: webpack: 5.102.1(webpack-cli@5.1.4) optionalDependencies: clean-css: 5.3.3 + lightningcss: 1.32.0 css-prefers-color-scheme@10.0.0(postcss@8.5.6): dependencies: @@ -14551,6 +14616,8 @@ snapshots: destroy@1.2.0: {} + detect-libc@2.1.2: {} + detect-node@2.1.0: {} detect-port@1.6.1: @@ -16049,6 +16116,55 @@ snapshots: optionalDependencies: webpack: 5.102.1(webpack-cli@5.1.4) + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -18965,7 +19081,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vite@6.4.1(@types/node@24.9.1)(jiti@1.21.7)(less@4.4.2)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) @@ -18978,6 +19094,7 @@ snapshots: fsevents: 2.3.3 jiti: 1.21.7 less: 4.4.2 + lightningcss: 1.32.0 terser: 5.44.0 tsx: 4.20.6 yaml: 2.8.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 4609d8d215..849962c9a9 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -52,7 +52,7 @@ catalog: "@jupyterlab/builder": "^4" "@playwright/experimental-ct-react": "=1.58.0" "@playwright/test": "=1.58.0" - "@prospective.co/procss": "0.1.18" + "lightningcss": "^1.29.0" "@types/d3": "^7.4.3" "@types/lodash": "^4.17.20" "@types/node": ">=22" diff --git a/rust/perspective-js/src/rust/virtual_server.rs b/rust/perspective-js/src/rust/virtual_server.rs index b1b2fc91c8..c918aeb0d4 100644 --- a/rust/perspective-js/src/rust/virtual_server.rs +++ b/rust/perspective-js/src/rust/virtual_server.rs @@ -589,7 +589,6 @@ impl VirtualDataSlice { #[wasm_bindgen(js_name = "fromArrowIpc")] pub fn from_arrow_ipc(&self, ipc: Uint8Array) -> Result<(), JsValue> { - // tracing::error!("L {}", ipc.len()); self.1 .lock() .unwrap() diff --git a/rust/perspective-python/build.mjs b/rust/perspective-python/build.mjs index 85b85339b4..a4befb5d79 100644 --- a/rust/perspective-python/build.mjs +++ b/rust/perspective-python/build.mjs @@ -11,7 +11,7 @@ // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ import * as fs from "node:fs"; -import sh from "../../tools/scripts/sh.mjs"; +import { execSync } from "child_process"; import * as url from "url"; import * as toml from "@iarna/toml"; import * as tar from "tar"; @@ -38,22 +38,20 @@ fs.mkdirSync(`./perspective_python-${version}.data`, { recursive: true }); fs.copyFileSync("../../LICENSE.md", "./LICENSE.md"); const cwd = process.cwd(); -const cmd = sh(); +const env = { ...process.env }; +let emsdk_prefix = ""; if (is_pyodide) { - const emsdkdir = sh.path`${__dirname}/../../.emsdk`; + const emsdkdir = path.resolve(__dirname, "../../.emsdk"); const { emscripten } = JSON.parse( - fs.readFileSync(sh.path`${__dirname}/../../package.json`), + fs.readFileSync(path.resolve(__dirname, "../../package.json")), ); - cmd.sh`cd ${emsdkdir}`.sh`. ./emsdk_env.sh` - .sh`./emsdk activate ${emscripten}`.sh`cd ${cwd}`; + emsdk_prefix = `cd ${emsdkdir} && . ./emsdk_env.sh && ./emsdk activate ${emscripten} && cd ${cwd} && `; } // if not windows if (process.platform !== "win32") { - cmd.env({ - PSP_ROOT_DIR: "../..", - }); + env.PSP_ROOT_DIR = "../.."; } const build_wheel = !!process.env.PSP_BUILD_WHEEL || is_pyodide; @@ -101,7 +99,7 @@ if (build_wheel) { features.push(...standard_features); } - cmd.sh(`maturin build ${flags} --features=${features.join(",")} ${target}`); + execSync(`${emsdk_prefix}maturin build ${flags} --features=${features.join(",")} ${target}`, { stdio: "inherit", env }); } if (build_sdist) { @@ -154,17 +152,12 @@ if (process.env["PSP_UV"] === "1") { if (!build_wheel && !build_sdist) { const dev_features = ["abi3"]; - cmd.sh( - `maturin develop --features=${dev_features.join( - ",", - )} ${flags} ${target}`, + execSync( + `${emsdk_prefix}maturin develop --features=${dev_features.join(",")} ${flags} ${target}`, + { stdio: "inherit", env }, ); } -if (!cmd.isEmpty()) { - cmd.runSync(); -} - // Generates version 2.3 according to https://packaging.python.org/en/latest/specifications/core-metadata/ // Takes parsed pyproject.toml, Cargo.toml, and contents of README.md. function generatePkgInfo(pyproject, cargo, readme_md) { diff --git a/rust/perspective-viewer/Cargo.toml b/rust/perspective-viewer/Cargo.toml index e0aa93e4b8..4928bf7449 100644 --- a/rust/perspective-viewer/Cargo.toml +++ b/rust/perspective-viewer/Cargo.toml @@ -39,8 +39,7 @@ talc-allocator = ["perspective-js/talc-allocator"] trace-allocator = ["perspective-js/trace-allocator"] [build-dependencies] -serde_json = { version = "1.0.59", features = ["raw_value"] } -procss = { version = "0.1.18" } +lightningcss = "1.0.0-alpha.71" glob = "0.3.0" anyhow = "1.0.66" diff --git a/rust/perspective-viewer/build.mjs b/rust/perspective-viewer/build.mjs index a6ccba30ee..e21efa6c50 100644 --- a/rust/perspective-viewer/build.mjs +++ b/rust/perspective-viewer/build.mjs @@ -14,8 +14,14 @@ import { execSync } from "child_process"; import { build } from "@perspective-dev/esbuild-plugin/build.js"; import { NodeModulesExternal } from "@perspective-dev/esbuild-plugin/external.js"; import * as fs from "node:fs"; -import { BuildCss } from "@prospective.co/procss/target/cjs/procss.js"; +import * as path from "node:path"; +import { + bundle as bundleCss, + composeVisitors, + bundleAsync as bundleAsyncCss, +} from "lightningcss"; import { compress } from "pro_self_extracting_wasm"; +import { get_host, inlineUrlVisitor, resolveNPM } from "./tools.mjs"; const IS_DEBUG = !!process.env.PSP_DEBUG || process.argv.indexOf("--debug") >= 0; @@ -25,19 +31,18 @@ const INHERIT = { stderr: "inherit", }; -function get_host() { - return /host\: (.+?)$/gm.exec(execSync(`rustc -vV`).toString())[1]; -} -async function build_all() { - execSync( - `cargo bundle --target=${get_host()} -- perspective_viewer ${IS_DEBUG ? "" : "--release"}`, - INHERIT, - ); +export async function build_all() { + if (!process.env.PSP_SKIP_WASM) { + execSync( + `cargo bundle --target=${get_host()} -- perspective_viewer ${IS_DEBUG ? "" : "--release"}`, + INHERIT, + ); - await compress( - "dist/wasm/perspective-viewer.wasm", - "dist/wasm/perspective-viewer.wasm", - ); + await compress( + "dist/wasm/perspective-viewer.wasm", + "dist/wasm/perspective-viewer.wasm", + ); + } // JavaScript const BUILD = [ @@ -109,41 +114,46 @@ async function build_all() { // Typecheck execSync("tsc --project tsconfig.json", INHERIT); - // Generate themes. `cargo` is not a great tool for this as there's no - // simple way to find the output artifact. - function add(builder, path) { - builder.add(path, fs.readFileSync(`./src/themes/${path}`).toString()); - } - + // Generate themes via lightningcss bundling. fs.mkdirSync("./dist/css/intl", { recursive: true }); - const builder = new BuildCss("./src/themes"); - add(builder, "variables.less"); - add(builder, "intl.less"); - add(builder, "icons.less"); - add(builder, "pro.less"); - add(builder, "pro-dark.less"); - add(builder, "botanical.less"); - add(builder, "monokai.less"); - add(builder, "solarized.less"); - add(builder, "solarized-dark.less"); - add(builder, "vaporwave.less"); - add(builder, "gruvbox.less"); - add(builder, "gruvbox-dark.less"); - add(builder, "dracula.less"); - add(builder, "themes.less"); - for (const [name, css] of builder.compile()) { - fs.writeFileSync(`dist/css/${name}`, css); + const themes = [ + "icons", + "intl", + "pro", + "pro-dark", + "botanical", + "monokai", + "solarized", + "solarized-dark", + "vaporwave", + "gruvbox", + "gruvbox-dark", + "dracula", + "themes", + ]; + + for (const name of themes) { + const filename = `./src/themes/${name}.css`; + const { code } = await bundleAsyncCss({ + filename, + minify: true, + visitor: inlineUrlVisitor(filename), + resolver: resolveNPM(import.meta.url), + }); + + fs.writeFileSync(`dist/css/${name}.css`, code); } - const intl_builder = new BuildCss("./src/themes/intl"); - add(intl_builder, "intl/de.less"); - add(intl_builder, "intl/es.less"); - add(intl_builder, "intl/fr.less"); - add(intl_builder, "intl/ja.less"); - add(intl_builder, "intl/pt.less"); - add(intl_builder, "intl/zh.less"); - for (const [name, css] of intl_builder.compile()) { - fs.writeFileSync(`dist/css/intl/${name}`, css); + const intl_langs = ["de", "es", "fr", "ja", "pt", "zh"]; + for (const lang of intl_langs) { + const filename = `./src/themes/intl/${lang}.css`; + const { code } = await bundleAsyncCss({ + filename, + minify: true, + visitor: inlineUrlVisitor(filename), + }); + + fs.writeFileSync(`dist/css/intl/${lang}.css`, code); } } diff --git a/rust/perspective-viewer/build.rs b/rust/perspective-viewer/build.rs index eae7b398f9..4e303590ce 100644 --- a/rust/perspective-viewer/build.rs +++ b/rust/perspective-viewer/build.rs @@ -10,37 +10,32 @@ // ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ -#![feature(exit_status_error)] - use glob::glob; -use procss::BuildCss; - -fn with_wd(indir: &str, f: impl FnOnce() -> T) -> T { - let current_dir = std::env::current_dir().unwrap(); - std::env::set_current_dir(indir).unwrap(); - let res = f(); - std::env::set_current_dir(current_dir).unwrap(); - res -} - -fn glob_with_wd(indir: &str, input: &str) -> Vec { - with_wd(indir, || { - glob(input) - .unwrap() - .map(|x| x.unwrap().to_string_lossy().to_string()) - .collect() - }) -} +use lightningcss::bundler::{Bundler, FileProvider}; +use lightningcss::stylesheet::PrinterOptions; fn main() -> Result<(), anyhow::Error> { let out_dir = std::env::var("OUT_DIR").unwrap(); let out_path = std::path::Path::new(&out_dir); - let mut build = BuildCss::new("./src/less"); - let files = glob_with_wd("./src/less", "**/*.less"); - for src in files.iter() { - build.add_file(src); + let fs: &'static FileProvider = Box::leak(Box::new(FileProvider::new())); + for entry in glob("./src/css/**/*.css")? { + let entry = entry?; + let relative = entry + .strip_prefix("./src/css/") + .or_else(|_| entry.strip_prefix("src/css/"))?; + + let mut bundler = Bundler::new(fs, None, Default::default()); + let stylesheet = bundler.bundle(&entry)?; + let output = stylesheet.to_css(PrinterOptions { + minify: true, + ..Default::default() + })?; + + let out_file = out_path.join("css").join(relative); + std::fs::create_dir_all(out_file.parent().unwrap())?; + std::fs::write(&out_file, output.code)?; + println!("cargo:rerun-if-changed={}", entry.display()); } - build.compile()?.write(out_path.join("css"))?; Ok(()) } diff --git a/rust/perspective-viewer/package.json b/rust/perspective-viewer/package.json index a4171b688f..5317ead057 100644 --- a/rust/perspective-viewer/package.json +++ b/rust/perspective-viewer/package.json @@ -19,7 +19,8 @@ "./src/*": "./src/*", "./test/*": "./test/*", "./package.json": "./package.json", - "./tsconfig.json": "./tsconfig.json" + "./tsconfig.json": "./tsconfig.json", + "./tools.mjs": "./tools.mjs" }, "files": [ "dist/**/*", @@ -43,7 +44,7 @@ "@perspective-dev/esbuild-plugin": "workspace:", "@perspective-dev/test": "workspace:", "@perspective-dev/metadata": "workspace:", - "@prospective.co/procss": "catalog:", + "lightningcss": "catalog:", "@playwright/test": "catalog:", "@playwright/experimental-ct-react": "catalog:", "@types/react": "catalog:", diff --git a/rust/perspective-viewer/src/less/aggregate-selector.less b/rust/perspective-viewer/src/css/aggregate-selector.css similarity index 68% rename from rust/perspective-viewer/src/less/aggregate-selector.less rename to rust/perspective-viewer/src/css/aggregate-selector.css index fca602ddfc..e85b3bfbb7 100644 --- a/rust/perspective-viewer/src/less/aggregate-selector.less +++ b/rust/perspective-viewer/src/css/aggregate-selector.css @@ -1,26 +1,27 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { - // Wrapper prevents the width of the selector options from increasing the width of - // the container it is embedded in. + /* Wrapper prevents the width of the selector options from increasing the width of */ + /* the container it is embedded in. */ .aggregate-selector-wrapper { height: 19px; display: flex; - padding-left: 23px; - width: 85px; - min-width: 85px; - max-width: 85px; - flex: 0 0 85px; + padding-left: 6px; + width: 68px; + min-width: 68px; + max-width: 68px; + flex: 0 0 68px; label { font-size: 10px; @@ -34,7 +35,6 @@ } .aggregate-selector { - font-size: 10px; border-bottom-width: 0px; margin-top: 0px; height: 19px; @@ -43,9 +43,12 @@ text-overflow: ellipsis; padding-right: 12px; border: 1px solid transparent; + select { + font-size: 0.8em; + } &:hover { - border: 1px solid var(--icon--color); + border: 1px solid var(--psp--color); border-radius: 2px; transition: none; } diff --git a/rust/perspective-viewer/src/css/column-dropdown.css b/rust/perspective-viewer/src/css/column-dropdown.css new file mode 100644 index 0000000000..98bd077c75 --- /dev/null +++ b/rust/perspective-viewer/src/css/column-dropdown.css @@ -0,0 +1,109 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ + +:host { + box-sizing: border-box; + position: fixed; + z-index: 10000; + outline: none; + font-size: 0.75em; + border: inherit; + /* box-shadow: 0 2px 4px 0 rgb(0 0 0 / 10%); */ + user-select: none; + background-color: var(--psp--color, #fff) !important; + color: var(--psp--background-color, #333) !important; + /* padding: 6px 8px; */ + border: 1px solid var(--psp--color) !important; + max-width: 300px; + overflow: hidden; + max-height: 600px; + overflow: auto; + &:hover { + --fix: ; + } + &::-webkit-scrollbar-thumb { + border-radius: 2px; + border: 2px solid transparent; + box-shadow: inset 0px 0px 0 4px var(--psp-inactive--color); + } + &:hover::-webkit-scrollbar-thumb { + border: 1px solid transparent; + box-shadow: inset 0px 0px 0 4px var(--psp-inactive--color); + } + &::-webkit-scrollbar, + &::-webkit-scrollbar-corner { + background-color: transparent; + width: 6px; + height: 6px; + } + + display: flex; + flex-direction: column; + + .selected { + background-color: var(--psp--background-color) !important; + color: var(--psp--color) !important; + } + + span { + cursor: pointer; + padding: 4px 5px; + } + + .no-results { + padding: 3px 24px 6px 11px; + color: var(--psp-error--color); + font-size: 8px; + } + + .no-results:before { + content: var(--psp-label--no-results--content, "Invalid Column"); + } + + #add-expression { + .icon { + background-repeat: no-repeat; + background-color: var(--psp--color); + display: inline-flex; + -webkit-mask-size: cover; + mask-size: cover; + margin-right: 5px; + -webkit-mask-image: var(--psp-icon--add-expression--mask-image); + mask-image: var(--psp-icon--add-expression--mask-image); + &:before { + line-height: 0; + content: var(--psp-icon--add-expression--mask-image); + visibility: hidden; + } + } + } +} + +:host(:hover) { + .selected { + background-color: var(--psp--color, #fff) !important; + color: var(--psp--background-color, #333) !important; + } + + span:hover, + span.selected:hover { + background-color: var(--psp--background-color) !important; + color: var(--psp--color) !important; + } +} + +:host(.no-results) { + overflow: hidden; + background-color: transparent !important; + border: none !important; +} diff --git a/rust/perspective-viewer/src/less/column-selector.less b/rust/perspective-viewer/src/css/column-selector.css similarity index 59% rename from rust/perspective-viewer/src/less/column-selector.less rename to rust/perspective-viewer/src/css/column-selector.css index 537f1e716a..da859649b5 100644 --- a/rust/perspective-viewer/src/less/column-selector.less +++ b/rust/perspective-viewer/src/css/column-selector.css @@ -1,30 +1,19 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import "dom/scrollbar.less"; - -// TODO this could be a class -@mixin icon { - background-repeat: no-repeat; - background-color: var(--icon--color); - content: ""; - display: inline-block; - -webkit-mask-size: cover; - mask-size: cover; -} +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { #add-expression-button:before { - content: var(--add-expression-button--content, "New Column"); + content: var(--psp-label--add-expression-button--content, "New Column"); text-transform: uppercase; font-size: 0.8333333em; } @@ -41,7 +30,7 @@ overflow: hidden; text-overflow: ellipsis; flex: 0 1 auto; - padding-left: 23px; + padding-left: 6px; display: inline-block; align-items: center; line-height: normal; @@ -59,8 +48,8 @@ flex: 0 100000000 67px; } - // Inactive columns need to account for expression buttons, which won't be - // the last child if it has a button + /* Inactive columns need to account for expression buttons, which won't be */ + /* the last child if it has a button */ #sub-columns .column-selector--spacer:last-child { width: 93px; flex: 0 100000000 93px; @@ -86,7 +75,7 @@ border: var(--column-add--border, 1px solid transparent); min-height: 24px; flex-direction: row; - background-color: #8b868045; + background-color: var(--psp-placeholder--background); border-radius: 2px; display: flex; align-items: center; @@ -94,17 +83,24 @@ cursor: pointer; margin-bottom: 4px; - // Button icon - &:before { - @include icon; - width: 14px; - height: 14px; - margin-left: 12px; - -webkit-mask-image: var(--add-expression-icon--mask-image); - mask-image: var(--add-expression-icon--mask-image); + /* Button icon */ + & > .icon { + background-repeat: no-repeat; + background-color: var(--psp--color); + display: inline-flex; + -webkit-mask-size: cover; + mask-size: cover; + margin-left: 9px; + -webkit-mask-image: var(--psp-icon--add-expression--mask-image); + mask-image: var(--psp-icon--add-expression--mask-image); + &:before { + line-height: 0; + content: var(--psp-icon--add-expression--mask-image); + visibility: hidden; + } } - // Text label of the button e.g. "New Column" + /* Text label of the button e.g. "New Column" */ & > span { align-self: center; margin-left: 7.5px; @@ -115,10 +111,10 @@ &.modal-target, &.dragdrop-hover { - color: var(--plugin--background); - background-color: var(--icon--color); - &:before { - background-color: var(--plugin--background); + color: var(--psp--background-color); + background-color: var(--psp--color); + & > .icon { + background-color: var(--psp--background-color); } } } @@ -126,15 +122,15 @@ .dragdrop-highlight { .pivot-column-border, .column-selector-column-border { - border: 1px solid var(--icon--color); + border: 1px solid var(--psp--color); } } .column-selector-column-border, .pivot-column-border { &.snap-drag-image { - background-color: var(--plugin--background) !important; - border: 1px solid var(--icon--color) !important; + background-color: var(--psp--background-color) !important; + border: 1px solid var(--psp--color) !important; position: absolute !important; pointer-events: none; left: 0; @@ -170,7 +166,7 @@ } .column_name { - padding-left: 23px !important; + padding-left: 6px !important; } } @@ -182,7 +178,7 @@ #top_panel .pivot-column.column-empty .pivot-column-draggable { - border-color: var(--icon--color); + border-color: var(--psp--color); } .column-selector-column { @@ -190,11 +186,11 @@ flex-direction: row-reverse; align-items: center; - // Expression column toolbar buttons + /* Expression column toolbar buttons */ span.expression-edit-button, span.expression-delete-button { padding-top: 1px; - font-family: var(--button--font-family, inherit); + font-family: var(--psp-button--font-family, inherit); cursor: pointer; padding: 2px 4px 0 4px; margin-right: 4px; @@ -202,10 +198,9 @@ border-radius: 3px; &:hover, &.is-editing { - background-color: var(--icon--color); - &:before { - background-color: var(--plugin--background); - border-radius: 3px; + background-color: var(--psp--color); + .icon { + background-color: var(--psp--background-color); } } } @@ -229,12 +224,19 @@ margin-left: 0px; } - span.expression-edit-button:before { - @include icon; - height: 14px; - width: 14px; - -webkit-mask-image: var(--column-settings-icon--mask-image); - mask-image: var(--column-settings-icon--mask-image); + span.expression-edit-button .icon { + background-repeat: no-repeat; + background-color: var(--psp--color); + display: inline-block; + -webkit-mask-size: cover; + mask-size: cover; + -webkit-mask-image: var(--psp-icon--column-settings--mask-image); + mask-image: var(--psp-icon--column-settings--mask-image); + + &:before { + content: var(--psp-icon--column-settings--mask-image); + visibility: hidden; + } } .column-selector-draggable { @@ -263,14 +265,27 @@ min-height: 24px; } - &:not(.empty-named) .column-selector-column-border:before { - margin: 0px 0 0 6px; // TODO - flex: 0 0 auto; // TODO - @include icon; - height: 12px; - width: 5px; - -webkit-mask-image: var(--column-drag-handle--mask-image); - mask-image: var(--column-drag-handle--mask-image); + &:not(.empty-named) .column-selector-column-border > .drag-handle { + margin: 0px 0 0 6px; + flex: 0 0 auto; + background-repeat: no-repeat; + background-color: var(--psp--color); + display: inline-block; + -webkit-mask-size: cover; + mask-size: cover; + -webkit-mask-image: var( + --psp-icon--psp-icon--column-drag-handle--mask-image + ); + mask-image: var( + --psp-icon--psp-icon--column-drag-handle--mask-image + ); + + &:before { + content: var( + --psp-icon--psp-icon--column-drag-handle--mask-image + ); + visibility: hidden; + } } } } @@ -283,25 +298,19 @@ .is_column_active { display: inline-flex; overflow: hidden; - padding-bottom: 4px; + margin-bottom: 4px; flex: 0 0 auto; cursor: pointer; - font-size: var(--column-selector--font-size, 14px); + font-size: var(--psp-column-selector--font-size, 14px); font-family: var( --column-selector--font-family, - var(--button--font-family, inherit) + var(--psp-button--font-family, inherit) ) !important; - &.select-mode { - margin: 0 6.5px; - // Width of the icon, which is not always present - min-width: 14px; - } - &, + &.select-mode, &.toggle-mode { - margin: 0 6.5px; - min-width: 14px; + margin: 0 6.5px 4px 6.5px; } } @@ -318,23 +327,29 @@ overflow-x: hidden !important; overflow-y: scroll; min-height: 20%; - @include scrollbar; } #sub-columns .scroll-panel-container:before { font-size: var(--label--font-size, 0.75em); padding: var(--column_type--padding, 0px 0px 0px 0px); position: absolute; - margin-top: -13px; - top: 0; - content: var(--all-columns-label--content, "All Columns"); + height: 28px; + top: -28px; + display: inline-flex; + align-items: flex-end; + content: var(--psp-label--all-columns--content, "All Columns"); } - #sub-columns .scroll-panel-container:first-child { + #sub-columns .scroll-panel-container { margin-top: 28px; margin-bottom: 4px; } + /* #sub-acolumns .scroll-panel-container #add-expression { + padding-top: 28px; + margin-top: 0; + } */ + #sub-columns .column-selector-column.column-selector-column-hidden { overflow: hidden; height: 0; @@ -351,38 +366,50 @@ padding-bottom: 8px; } + #active-columns, + #column_settings_sidebar, + #sub-columns { + .is_column_active { + background-repeat: no-repeat; + background-color: var(--psp--color); + -webkit-mask-size: cover; + mask-size: cover; + } + } + #active-columns, #column_settings_sidebar { width: 100%; - .is_column_active:before { - @include icon; - } .is_column_active.select-mode { + -webkit-mask-image: var(--psp-icon--radio-on--mask-image); + mask-image: var(--psp-icon--radio-on--mask-image); + &:before { - width: 14px; - height: 14px; - -webkit-mask-image: var(--column-radio-on--mask-image); - mask-image: var(--column-radio-on--mask-image); + line-height: 0; + content: var(--psp-icon--radio-on--mask-image); + visibility: hidden; } - &:not(.required):hover:before { - -webkit-mask-image: var(--column-radio-hover--mask-image); - mask-image: var(--column-radio-hover--mask-image); + &:not(.required):hover { + -webkit-mask-image: var(--psp-icon--radio-hover--mask-image); + mask-image: var(--psp-icon--radio-hover--mask-image); } } .is_column_active.toggle-mode { + -webkit-mask-image: var(--psp-icon--checkbox-on--mask-image); + mask-image: var(--psp-icon--checkbox-on--mask-image); + &:before { - width: 14px; - height: 14px; - -webkit-mask-image: var(--column-checkbox-on--mask-image); - mask-image: var(--column-checkbox-on--mask-image); + line-height: 0; + content: var(--psp-icon--checkbox-on--mask-image); + visibility: hidden; } - &:not(.required):hover:before { - -webkit-mask-image: var(--column-checkbox-hover--mask-image); - mask-image: var(--column-checkbox-hover--mask-image); + &:not(.required):hover { + -webkit-mask-image: var(--psp-icon--checkbox-hover--mask-image); + mask-image: var(--psp-icon--checkbox-hover--mask-image); } } @@ -392,8 +419,7 @@ cursor: initial; } - &.inactive:before { - content: ""; + &.inactive { background: none; } } @@ -406,8 +432,8 @@ } .column-selector-column-border { - border-color: var(--inactive--color); - background-color: var(--plugin--background); + border-color: var(--psp-inactive--color); + background-color: var(--psp--background-color); } &:before { @@ -427,7 +453,7 @@ .dragover, .column-selector-column .column-selector-draggable.empty-named { - background-color: #8b868045; + background-color: var(--psp-placeholder--background); border-color: transparent; border-radius: 2px; } @@ -440,7 +466,7 @@ } .column-selector-column .column-selector-draggable.dragover { - border: 1px solid var(--icon--color); + border: 1px solid var(--psp--color); position: relative; &:before { content: " "; @@ -451,7 +477,7 @@ right: 5px; bottom: 5px; border-radius: 2px; - background-color: var(--icon--color); + background-color: var(--psp--color); opacity: 0.3; } @@ -462,7 +488,7 @@ .column-selector-column { .column-selector-column-border { - background-color: #8b868045; + background-color: var(--psp-placeholder--background); border: 1px solid transparent; align-items: center; } @@ -472,12 +498,12 @@ #active-columns.dragdrop-highlight .column-selector-column, .column-selector-column.dragdrop-hover { .column-selector-column-border { - border-color: var(--icon--color); + border-color: var(--psp--color); } } - // Inactive Columns are the columns in the column selector not currently - // selected for the `columns` field of the `ViewConfig`. + /* Inactive Columns are the columns in the column selector not currently */ + /* selected for the `columns` field of the `ViewConfig`. */ #sub-columns { padding-bottom: 8px; @@ -486,34 +512,35 @@ margin: 0px; } - .is_column_active:before { - @include icon; - } - .is_column_active.select-mode { + -webkit-mask-image: var(--psp-icon--radio-off--mask-image); + mask-image: var(--psp-icon--radio-off--mask-image); + &:before { - width: 14px; - height: 14px; - -webkit-mask-image: var(--column-radio-off--mask-image); - mask-image: var(--column-radio-off--mask-image); + line-height: 0; + content: var(--psp-icon--radio-off--mask-image); + visibility: hidden; } - &:hover:before { - -webkit-mask-image: var(--column-radio-hover--mask-image); - mask-image: var(--column-radio-hover--mask-image); + + &:hover { + -webkit-mask-image: var(--psp-icon--radio-hover--mask-image); + mask-image: var(--psp-icon--radio-hover--mask-image); } } .is_column_active.toggle-mode { + -webkit-mask-image: var(--psp-icon--checkbox-off--mask-image); + mask-image: var(--psp-icon--checkbox-off--mask-image); + &:before { - width: 14px; - height: 14px; - -webkit-mask-image: var(--column-checkbox-off--mask-image); - mask-image: var(--column-checkbox-off--mask-image); + line-height: 0; + content: var(--psp-icon--checkbox-off--mask-image); + visibility: hidden; } - &:hover:before { - -webkit-mask-image: var(--column-checkbox-hover--mask-image); - mask-image: var(--column-checkbox-hover--mask-image); + &:hover { + -webkit-mask-image: var(--psp-icon--checkbox-hover--mask-image); + mask-image: var(--psp-icon--checkbox-hover--mask-image); } } diff --git a/rust/perspective-viewer/src/less/column-settings-panel.less b/rust/perspective-viewer/src/css/column-settings-panel.css similarity index 57% rename from rust/perspective-viewer/src/less/column-settings-panel.less rename to rust/perspective-viewer/src/css/column-settings-panel.css index 6425261f91..f55e489f9f 100644 --- a/rust/perspective-viewer/src/less/column-settings-panel.less +++ b/rust/perspective-viewer/src/css/column-settings-panel.css @@ -1,16 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import (reference) url(./column-selector.less); +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { #column_settings_sidebar { @@ -33,9 +32,9 @@ flex: 0 1 auto; } - // NOTE: These should probably make their way to global form styling eventually. + /* NOTE: These should probably make their way to global form styling eventually. */ .errored { - outline-color: var(--error--color); + outline-color: var(--psp-error--color); } .item_title { @@ -47,14 +46,14 @@ &[type="text"], &[type="search"] { outline: 1px solid; - outline-color: var(--inactive--color); - background-color: var(--plugin--background); + outline-color: var(--psp-inactive--color); + background-color: var(--psp--background-color); border: none; margin-bottom: 0.5em; font-family: inherit; font-size: 1em; &:disabled { - background-color: var(--inactive--color); + background-color: var(--psp-inactive--color); } } @@ -74,7 +73,7 @@ align-items: center; border-radius: 3px; outline-width: 1px; - outline-color: var(--inactive--color); + outline-color: var(--psp-inactive--color); &.editable { &:hover { @@ -84,13 +83,13 @@ } &:focus { outline-style: solid; - background: var(--plugin--background); + background: var(--psp--background-color); } &.edited { outline-style: dashed; } &.invalid { - outline-color: var(--error--color); + outline-color: var(--psp-error--color); } .sidebar_header_title { @@ -112,140 +111,155 @@ } label#color-label:before { - content: var(--color-label--content, "Color"); + content: var(--psp-label--color--content, "Color"); } label#format-label:before { - content: var(--format-label--content, "Format"); + content: var(--psp-label--format--content, "Format"); } label#timezone-label:before { - content: var(--timezone-label--content, "Timezone"); + content: var(--psp-label--timezone--content, "Timezone"); } label#date-style-label:before { - content: var(--date-style-label--content, "Date Style"); + content: var(--psp-label--date-style--content, "Date Style"); } label#time-style-label:before { - content: var(--time-style-label--content, "Time Style"); + content: var(--psp-label--time-style--content, "Time Style"); } label#foreground-label:before { - content: var(--foreground-label--content, "Foreground"); + content: var(--psp-label--foreground--content, "Foreground"); } label#background-label:before { - content: var(--background-label--content, "Background"); + content: var(--psp-label--background--content, "Background"); } label#series-label:before { - content: var(--series-label--content, "Series"); + content: var(--psp-label--series--content, "Series"); } label#color-range-label:before { - content: var(--color-range-label--content, "Color Range"); + content: var(--psp-label--color-range--content, "Color Range"); } label#style-label:before { - content: var(--style-label--content, "Style"); + content: var(--psp-label--style--content, "Style"); } label#minimum-integer-digits-label:before { content: var( - --minimum-integer-digits-label--content, + --psp-label--minimum-integer-digits--content, "Minimum Integer Digits" ); } label#rounding-increment-label:before { - content: var(--rounding-increment-label--content, "Rounding Increment"); + content: var( + --psp-label--rounding-increment--content, + "Rounding Increment" + ); } label#notation-label:before { - content: var(--notation-label--content, "Notation"); + content: var(--psp-label--notation--content, "Notation"); } label#use-grouping-label:before { - content: var(--use-grouping-label--content, "Use Grouping"); + content: var(--psp-label--use-grouping--content, "Use Grouping"); } label#sign-display-label:before { - content: var(--sign-display-label--content, "Sign Display"); + content: var(--psp-label--sign-display--content, "Sign Display"); } label#aggregate-depth-label:before { - content: var(--aggregate-depth-label--content, "Aggregate Depth"); + content: var(--psp-label--aggregate-depth--content, "Aggregate Depth"); } label#max-value-label:before { - content: var(--max-value-label--content, "Max Value"); + content: var(--psp-label--max-value--content, "Max Value"); } label#rounding-priority-label:before { - content: var(--rounding-priority-label--content, "Rounding Priority"); + content: var( + --psp-label--rounding-priority--content, + "Rounding Priority" + ); } label#rounding-mode-label:before { - content: var(--rounding-mode-label--content, "Rounding Mode"); + content: var(--psp-label--rounding-mode--content, "Rounding Mode"); } label#trailing-zero-display-label:before { content: var( - --trailing-zero-display-label--content, + --psp-label--trailing-zero-display--content, "Trailing Zero Display" ); } label#significant-digits-label:before { - content: var(--significant-digits-label--content, "Significant Digits"); + content: var( + --psp-label--significant-digits--content, + "Significant Digits" + ); } label#fractional-digits-label:before { - content: var(--fractional-digits-label--content, "Fractional Digits"); + content: var( + --psp-label--fractional-digits--content, + "Fractional Digits" + ); } label#year-label:before { - content: var(--year-label--content, "Year"); + content: var(--psp-label--year--content, "Year"); } label#month-label:before { - content: var(--month-label--content, "Month"); + content: var(--psp-label--month--content, "Month"); } label#day-label:before { - content: var(--day-label--content, "Day"); + content: var(--psp-label--day--content, "Day"); } label#weekday-label:before { - content: var(--weekday-label--content, "Weekday"); + content: var(--psp-label--weekday--content, "Weekday"); } label#hour-label:before { - content: var(--hour-label--content, "Hour"); + content: var(--psp-label--hour--content, "Hour"); } label#minute-label:before { - content: var(--minute-label--content, "Minute"); + content: var(--psp-label--minute--content, "Minute"); } label#second-label:before { - content: var(--second-label--content, "Second"); + content: var(--psp-label--second--content, "Second"); } label#fractional-seconds-label:before { - content: var(--fractional-seconds-label--content, "Fractional Seconds"); + content: var( + --psp-label--fractional-seconds--content, + "Fractional Seconds" + ); } label#hours-label:before { - content: var(--hours-label--content, "12/24 Hours"); + content: var(--psp-label--hours--content, "12/24 Hours"); } div.tab-title#Style:before { - content: var(--style-tab-label--content, "Style"); + content: var(--psp-label--style-tab--content, "Style"); } div.tab-title#Attributes:before { - content: var(--attributes-tab-label--content, "Attributes"); + content: var(--psp-label--attributes-tab--content, "Attributes"); } } diff --git a/rust/perspective-viewer/src/less/column-style.less b/rust/perspective-viewer/src/css/column-style.css similarity index 71% rename from rust/perspective-viewer/src/less/column-style.less rename to rust/perspective-viewer/src/css/column-style.css index eb879baf28..3ba952f6c3 100644 --- a/rust/perspective-viewer/src/less/column-style.less +++ b/rust/perspective-viewer/src/css/column-style.css @@ -1,23 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@mixin icon { - background-repeat: no-repeat; - background-color: var(--icon--color); - content: ""; - display: inline-block; - -webkit-mask-size: cover; - mask-size: cover; -} +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { #column-style-container { @@ -26,11 +18,11 @@ &.no-style { font-style: italic; - background-color: #8b868045; + background-color: var(--psp-placeholder--background); } .is-default-value .dropdown-width-container { - background-color: var(--plugin--background); + background-color: var(--psp--background-color); } .dropdown-width-container { @@ -40,11 +32,11 @@ border-radius: 2px; padding: 0 8px; border-radius: 2px; - // border: 1px solid transparent; - border-color: var(--inactive--color, #666); + /* border: 1px solid transparent; */ + border-color: var(--psp-inactive--color, #666); &:hover { - background-color: var(--plugin--background); + background-color: var(--psp--background-color); } } @@ -52,8 +44,8 @@ cursor: pointer; font-size: 10px; height: 22px; - // padding-bottom: 2px; - // border-bottom: 1px solid var(--input--border-color, #ccc); + /* padding-bottom: 2px; */ + /* border-bottom: 1px solid var(--input--border-color, #ccc); */ padding: 0 8px; } @@ -68,7 +60,7 @@ margin-left: 4px; width: 14px; height: 14px; - border: 1px solid var(--inactive--border-color); + border: 1px solid var(--psp-inactive--border-color); border-radius: 2px; } @@ -77,18 +69,22 @@ width: 22px; height: 22px; margin-right: -4px; + display: inline-block; + background-repeat: no-repeat; + background-color: var(--psp--color); + -webkit-mask-size: cover; + mask-size: cover; + -webkit-mask-image: var(--psp-icon--close--mask-image); + mask-image: var(--psp-icon--close--mask-image); &:before { - @include icon; - width: 22px; - height: 22px; - -webkit-mask-image: var(--close-icon--mask-image); - mask-image: var(--close-icon--mask-image); + content: var(--psp-icon--close--mask-image); + visibility: hidden; } } .is-default-value input.parameter { - background-color: var(--plugin--background); + background-color: var(--psp--background-color); } input.parameter { @@ -110,7 +106,7 @@ border-width: 1px; border-color: var( --input--border-color, - var(--inactive--color, inherit) + var(--psp-inactive--color, inherit) ); } @@ -141,23 +137,27 @@ input[type="radio"] { appearance: none; + display: inline-block; + background-repeat: no-repeat; + background-color: var(--psp--color); + -webkit-mask-size: cover; + mask-size: cover; + -webkit-mask-image: var(--psp-icon--radio-off--mask-image); + mask-image: var(--psp-icon--radio-off--mask-image); - &:checked:before { - -webkit-mask-image: var(--column-radio-on--mask-image); - mask-image: var(--column-radio-on--mask-image); + &:before { + content: var(--psp-icon--radio-off--mask-image); + visibility: hidden; } - &:before { - @include icon; - width: 10px; - height: 10px; - -webkit-mask-image: var(--column-radio-off--mask-image); - mask-image: var(--column-radio-off--mask-image); + &:checked { + -webkit-mask-image: var(--psp-icon--radio-on--mask-image); + mask-image: var(--psp-icon--radio-on--mask-image); } - &:hover:before { - -webkit-mask-image: var(--column-radio-hover--mask-image); - mask-image: var(--column-radio-hover--mask-image); + &:hover { + -webkit-mask-image: var(--psp-icon--radio-hover--mask-image); + mask-image: var(--psp-icon--radio-hover--mask-image); } } @@ -209,7 +209,7 @@ grid-column: 1; grid-row: 1; margin: 0; - font-family: var(--button--font-family, inherit); + font-family: var(--psp-button--font-family, inherit); color: var(--sign--color, white); width: 36px; height: 24px; @@ -279,7 +279,7 @@ appearance: none; background: none; color: inherit; - border: 1px solid var(--inactive--color); + border: 1px solid var(--psp-inactive--color); border-radius: 3px; font-family: inherit; padding: 6px; @@ -292,9 +292,9 @@ } &:hover { - border-color: var(--icon--color); - background-color: var(--icon--color); - color: var(--plugin--background); + border-color: var(--psp--color); + background-color: var(--psp--color); + color: var(--psp--background-color); } &:hover:before { diff --git a/rust/perspective-viewer/src/less/column-symbol-attributes.less b/rust/perspective-viewer/src/css/column-symbol-attributes.css similarity index 74% rename from rust/perspective-viewer/src/less/column-symbol-attributes.less rename to rust/perspective-viewer/src/css/column-symbol-attributes.css index 83ac78dee5..2f8550475d 100644 --- a/rust/perspective-viewer/src/less/column-symbol-attributes.less +++ b/rust/perspective-viewer/src/css/column-symbol-attributes.css @@ -1,14 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { #attributes-symbols { @@ -16,8 +17,8 @@ svg { width: 15px; height: auto; - color: var(--icon--color); - fill: var(--icon--color); + color: var(--psp--color); + fill: var(--psp--color); background: none; } @@ -40,7 +41,7 @@ } .row-selector-errored input { - border-color: var(--error--color); + border-color: var(--psp-error--color); } } diff --git a/rust/perspective-viewer/src/less/config-selector.less b/rust/perspective-viewer/src/css/config-selector.css similarity index 52% rename from rust/perspective-viewer/src/less/config-selector.less rename to rust/perspective-viewer/src/css/config-selector.css index bdf0f37db2..3bf34221f6 100644 --- a/rust/perspective-viewer/src/less/config-selector.less +++ b/rust/perspective-viewer/src/css/config-selector.css @@ -1,69 +1,61 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@mixin icon { - background-repeat: no-repeat; - background-color: var(--icon--color); - content: ""; - display: inline-block; - -webkit-mask-size: cover; - mask-size: cover; -} +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { #top_panel.dragdrop-highlight { .psp-text-field { - border-bottom-color: var(--icon--color) !important; + border-bottom-color: var(--psp--color) !important; } .pivot-column-border { - border-color: var(--icon--color) !important; + border-color: var(--psp--color) !important; } } #top_panel.group-rollup-mode-total { #group_by { width: 100%; - // height: 26px; + /* height: 26px; */ .pivot-column { .pivot-column-total { min-height: 24px; margin-bottom: 4px; &:before { - background-color: var(--plugin--background); + background-color: var(--psp--background-color); } } .column_name { - color: var(--inactive--color); + color: var(--psp-inactive--color); } .type-icon { - background-color: var(--inactive--color); + background-color: var(--psp-inactive--color); } &:hover .pivot-column-border { - border-color: var(--inactive--color, #ababab); + border-color: var(--psp-inactive--color, #ababab); } - // input { - // background-color: var(--plugin--background); - // pointer-events: none; - // border: 1px solid var(--inactive--color); - // color: var(--inactive--color) !important; - // // &:placeholder { + /* input { */ + /* background-color: var(--psp--background-color); */ + /* pointer-events: none; */ + /* border: 1px solid var(--psp-inactive--color); */ + /* color: var(--psp-inactive--color) !important; */ + /* // &:placeholder { */ - // // } - // } + /* // } */ + /* } */ } } } @@ -80,24 +72,24 @@ margin: 0 6.5px 4px 6.5px; cursor: pointer; height: 14px; - } - - .row_close:before { - height: 14px; - width: 14px; + display: inline-block; background-repeat: no-repeat; - background-color: var(--icon--color); - content: ""; + background-color: var(--psp--color); -webkit-mask-size: cover; mask-size: cover; - display: inline-block; - -webkit-mask-image: var(--column-checkbox-on--mask-image); - mask-image: var(--column-checkbox-on--mask-image); - } + -webkit-mask-image: var(--psp-icon--checkbox-on--mask-image); + mask-image: var(--psp-icon--checkbox-on--mask-image); + + &:before { + line-height: 0; + content: var(--psp-icon--checkbox-on--mask-image); + visibility: hidden; + } - .row_close:hover:before { - -webkit-mask-image: var(--column-checkbox-hover--mask-image); - mask-image: var(--column-checkbox-hover--mask-image); + &:hover { + -webkit-mask-image: var(--psp-icon--checkbox-hover--mask-image); + mask-image: var(--psp-icon--checkbox-hover--mask-image); + } } .pivot-column { @@ -109,8 +101,8 @@ .pivot-column-border { flex: 1 1 auto; overflow: hidden; - background-color: var(--plugin--background); - border: 1px solid var(--inactive--color, #ababab); + background-color: var(--psp--background-color); + border: 1px solid var(--psp-inactive--color, #ababab); border-radius: 2px; display: flex; align-items: center; @@ -127,7 +119,7 @@ } &:hover .pivot-column-border { - border-color: var(--icon--color); + border-color: var(--psp--color); } .pivot-column-draggable { @@ -140,19 +132,27 @@ cursor: move; } - &:not(.column-empty) .pivot-column-border:before { + &:not(.column-empty) .pivot-column-border > .drag-handle { flex: 0 0 auto; - height: 12px; - width: 5px; - -webkit-mask-image: var(--column-drag-handle--mask-image); - mask-image: var(--column-drag-handle--mask-image); margin: 0px 0 0 6px; background-repeat: no-repeat; - background-color: var(--icon--color); - content: ""; + background-color: var(--psp--color); display: inline-block; -webkit-mask-size: cover; mask-size: cover; + -webkit-mask-image: var( + --psp-icon--psp-icon--column-drag-handle--mask-image + ); + mask-image: var( + --psp-icon--psp-icon--column-drag-handle--mask-image + ); + + &:before { + content: var( + --psp-icon--psp-icon--column-drag-handle--mask-image + ); + visibility: hidden; + } } span { @@ -161,16 +161,16 @@ span:first-child { text-overflow: ellipsis; - // max-width: 250px; + /* max-width: 250px; */ overflow: hidden; } - // Column is being dragged-over, e.g. this is the drop indicator. + /* Column is being dragged-over, e.g. this is the drop indicator. */ & .config-drop { - background-color: #8b868045; + background-color: var(--psp-placeholder--background); margin-right: 7px; margin-bottom: 4px; - border: 1px solid var(--icon--color); + border: 1px solid var(--psp--color); border-radius: 2px; overflow: visible; flex: 1 1 auto; @@ -185,7 +185,7 @@ right: 5px; bottom: 5px; border-radius: 2px; - background-color: var(--icon--color); + background-color: var(--psp--color); opacity: 0.3; } @@ -200,19 +200,19 @@ } #group_by label.pivot-selector-label:before { - content: var(--group-by-label--content, "Group By"); + content: var(--psp-label--group-by--content, "Group By"); } #split_by label.pivot-selector-label:before { - content: var(--split-by-label--content, "Split By"); + content: var(--psp-label--split-by--content, "Split By"); } #sort label.pivot-selector-label:before { - content: var(--sort-label--content, "Order By"); + content: var(--psp-label--sort--content, "Order By"); } #filter label.pivot-selector-label:before { - content: var(--filter-label--content, "Where"); + content: var(--psp-label--filter--content, "Where"); } .rrow { @@ -274,7 +274,7 @@ line-height: 17px; box-sizing: border-box; white-space: nowrap; - padding: var(--column-drop-container--padding, 0px); + padding: 0px; font-size: var(--label--font-size, 0.75em); display: inline-block; } @@ -299,19 +299,18 @@ margin-right: 28px; margin-top: 9px; select:hover { - color: var(--icon--color, inherit); + color: var(--psp--color, inherit); } } .group_rollup_wrapper { - width: 48px; margin-bottom: -30px; flex: 0 1 auto; - color: var(--inactive--color); + color: var(--psp-inactive--color); padding-top: 15px; - font-size: 9px; + font-size: var(--label--font-size, 0.75em); select { - font-size: 9px !important; + font-size: var(--label--font-size); } } @@ -323,21 +322,21 @@ user-select: none; padding: 0; align-self: center; - // margin-bottom: -23px; - // margin-top: 11.5px; - // align-self: flex-end; + /* margin-bottom: -23px; */ + /* margin-top: 11.5px; */ + /* align-self: flex-end; */ z-index: 1; min-height: 0px; - // margin-right: 30px; + /* margin-right: 30px; */ &:hover:before { - color: var(--icon--color, inherit); + color: var(--psp--color, inherit); } &:before { - font-family: var(--button--font-family, inherit); - color: var(--inactive--color, #666); - content: var(--transpose-button--content, "Swap"); + font-family: var(--psp-button--font-family, inherit); + color: var(--psp-inactive--color, #666); + content: var(--psp-label--transpose-button--content, "Swap"); } } } @@ -345,64 +344,98 @@ .sort-icon { display: inline-flex; margin-left: auto; - // margin-right: 8px; + /* margin-right: 8px; */ cursor: pointer; - font-family: var(--button--font-family, inherit); + font-family: var(--psp-button--font-family, inherit); + background-repeat: no-repeat; + background-color: var(--psp--color); + -webkit-mask-size: cover; + mask-size: cover; &:hover { opacity: 1; - color: var(--active--color, inherit); - } - - &:before { - @include icon; - width: 16px; - height: 16px; + color: var(--psp-active--color, inherit); } - &.desc:before { - -webkit-mask-image: var(--sort-desc-icon--mask-image); - mask-image: var(--sort-desc-icon--mask-image); + &.desc { + -webkit-mask-image: var(--psp-icon--sort-desc--mask-image); + mask-image: var(--psp-icon--sort-desc--mask-image); + &:before { + content: var(--psp-icon--sort-desc--mask-image); + visibility: hidden; + } } - &.asc:before { - -webkit-mask-image: var(--sort-asc-icon--mask-image); - mask-image: var(--sort-asc-icon--mask-image); + &.asc { + -webkit-mask-image: var(--psp-icon--sort-asc--mask-image); + mask-image: var(--psp-icon--sort-asc--mask-image); + &:before { + content: var(--psp-icon--sort-asc--mask-image); + visibility: hidden; + } } - &.none:before { - -webkit-mask-image: var(--sort-none-icon--mask-image); - mask-image: var(--sort-none-icon--mask-image); + &.none { + -webkit-mask-image: var(--psp-icon--sort-none--mask-image); + mask-image: var(--psp-icon--sort-none--mask-image); + &:before { + content: var(--psp-icon--sort-none--mask-image); + visibility: hidden; + } } - &.asc.abs:before { - -webkit-mask-image: var(--sort-abs-asc-icon--mask-image); - mask-image: var(--sort-abs-asc-icon--mask-image); + &.asc.abs { + -webkit-mask-image: var(--psp-icon--sort-abs-asc--mask-image); + mask-image: var(--psp-icon--sort-abs-asc--mask-image); + &:before { + content: var(--psp-icon--sort-abs-asc--mask-image); + visibility: hidden; + } } - &.desc.abs:before { - -webkit-mask-image: var(--sort-abs-desc-icon--mask-image); - mask-image: var(--sort-abs-desc-icon--mask-image); + &.desc.abs { + -webkit-mask-image: var(--psp-icon--sort-abs-desc--mask-image); + mask-image: var(--psp-icon--sort-abs-desc--mask-image); + &:before { + content: var(--psp-icon--sort-abs-desc--mask-image); + visibility: hidden; + } } - &.col.asc:before { - -webkit-mask-image: var(--sort-col-asc-icon--mask-image); - mask-image: var(--sort-col-asc-icon--mask-image); + &.col.asc { + -webkit-mask-image: var(--psp-icon--sort-col-asc--mask-image); + mask-image: var(--psp-icon--sort-col-asc--mask-image); + &:before { + content: var(--psp-icon--sort-col-asc--mask-image); + visibility: hidden; + } } - &.col.desc:before { - -webkit-mask-image: var(--sort-col-desc-icon--mask-image); - mask-image: var(--sort-col-desc-icon--mask-image); + &.col.desc { + -webkit-mask-image: var(--psp-icon--sort-col-desc--mask-image); + mask-image: var(--psp-icon--sort-col-desc--mask-image); + &:before { + content: var(--psp-icon--sort-col-desc--mask-image); + visibility: hidden; + } } - &.col.asc.abs:before { - -webkit-mask-image: var(--sort-abs-col-asc-icon--mask-image); - mask-image: var(--sort-abs-col-asc-icon--mask-image); + &.col.asc.abs { + -webkit-mask-image: var(--psp-icon--sort-abs-col-asc--mask-image); + mask-image: var(--psp-icon--sort-abs-col-asc--mask-image); + &:before { + content: var(--psp-icon--sort-abs-col-asc--mask-image); + visibility: hidden; + } } - &.col.desc.abs:before { - -webkit-mask-image: var(--sort-abs-col-desc-icon--mask-image); - mask-image: var(--sort-abs-col-desc-icon--mask-image); + &.col.desc.abs { + -webkit-mask-image: var(--psp-icon--sort-abs-col-desc--mask-image); + mask-image: var(--psp-icon--sort-abs-col-desc--mask-image); + &:before { + content: var(--psp-icon--sort-abs-col-desc--mask-image); + visibility: hidden; + } } } } diff --git a/rust/perspective-viewer/src/less/containers/dropdown-menu.less b/rust/perspective-viewer/src/css/containers/dropdown-menu.css similarity index 67% rename from rust/perspective-viewer/src/less/containers/dropdown-menu.less rename to rust/perspective-viewer/src/css/containers/dropdown-menu.css index f609c97b79..ff7269bf5e 100644 --- a/rust/perspective-viewer/src/less/containers/dropdown-menu.less +++ b/rust/perspective-viewer/src/css/containers/dropdown-menu.css @@ -1,14 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { position: fixed; @@ -26,23 +27,23 @@ min-width: 80px; code { - font-family: var(--interface-monospace--font-family), monospace; + font-family: var(--psp-interface-monospace--font-family), monospace; } input { margin: 0; padding: 0; border: none; - border-bottom: 1px solid var(--inactive--color, #ccc); + border-bottom: 1px solid var(--psp-inactive--color, #ccc); background: transparent; - font-family: var(--interface-monospace--font-family), monospace; + font-family: var(--psp-interface-monospace--font-family), monospace; color: inherit; outline: none; } .invalid { - color: var(--error--color, #ff0000); - border-color: var(--error--color, #ff0000); + color: var(--psp-error--color, #ff0000); + border-color: var(--psp-error--color, #ff0000); } .selected { @@ -50,7 +51,7 @@ } .dropdown-group-label { - color: var(--inactive--color); + color: var(--psp-inactive--color); &:not(:first-of-type) { margin-top: 16px; @@ -88,7 +89,7 @@ } .dropdown-group-container span:hover { - background-color: var(--icon--color); - color: var(--plugin--background); + background-color: var(--psp--color); + color: var(--psp--background-color); } } diff --git a/rust/perspective-viewer/src/less/containers/pairs-list.less b/rust/perspective-viewer/src/css/containers/pairs-list.css similarity index 70% rename from rust/perspective-viewer/src/less/containers/pairs-list.less rename to rust/perspective-viewer/src/css/containers/pairs-list.css index 84c4af7075..fb4f3e9f14 100644 --- a/rust/perspective-viewer/src/less/containers/pairs-list.less +++ b/rust/perspective-viewer/src/css/containers/pairs-list.css @@ -1,14 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ .pairs-list { ul { @@ -24,7 +25,7 @@ flex-direction: row; align-items: center; justify-content: space-between; - border-bottom: solid 1px var(--inactive--border-color); + border-bottom: solid 1px var(--psp-inactive--border-color); margin-bottom: 12px; } diff --git a/rust/perspective-viewer/src/less/containers/scroll-panel.less b/rust/perspective-viewer/src/css/containers/scroll-panel.css similarity index 66% rename from rust/perspective-viewer/src/less/containers/scroll-panel.less rename to rust/perspective-viewer/src/css/containers/scroll-panel.css index 8ac0885f2b..64f10922c1 100644 --- a/rust/perspective-viewer/src/less/containers/scroll-panel.less +++ b/rust/perspective-viewer/src/css/containers/scroll-panel.css @@ -1,14 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { .scroll-panel-container { diff --git a/rust/perspective-viewer/src/less/containers/split-panel.less b/rust/perspective-viewer/src/css/containers/split-panel.css similarity index 75% rename from rust/perspective-viewer/src/less/containers/split-panel.less rename to rust/perspective-viewer/src/css/containers/split-panel.css index 40e088e064..3eae3319fa 100644 --- a/rust/perspective-viewer/src/less/containers/split-panel.less +++ b/rust/perspective-viewer/src/css/containers/split-panel.css @@ -1,14 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { #modal_panel.split-panel.orient-reverse @@ -54,7 +55,7 @@ flex: 0 0 auto; } - // The thing you click to drag the panel size. + /* The thing you click to drag the panel size. */ .split-panel-divider { flex: 0 0 6px; transition: background-color 0.2s ease-out; @@ -66,8 +67,8 @@ } } - // Make the elements embedded in each child stretch to fill the - // container + /* Make the elements embedded in each child stretch to fill the */ + /* container */ .split-panel-child { position: relative; display: flex; diff --git a/rust/perspective-viewer/src/less/containers/tabs.less b/rust/perspective-viewer/src/css/containers/tabs.css similarity index 71% rename from rust/perspective-viewer/src/less/containers/tabs.less rename to rust/perspective-viewer/src/css/containers/tabs.css index fb0d953995..9d47ca4df4 100644 --- a/rust/perspective-viewer/src/less/containers/tabs.less +++ b/rust/perspective-viewer/src/css/containers/tabs.css @@ -1,20 +1,19 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import "dom/scrollbar.less"; +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { .tab-gutter { - border-color: var(--inactive--color, #6e6e6e); + border-color: var(--psp-inactive--color, #6e6e6e); display: flex; .tab.tab-padding { @@ -29,21 +28,21 @@ } .tab { - //TODO: This needs to be a variable color. Which one? + /* TODO: This needs to be a variable color. Which one? */ background: rgba(0, 0, 0, 0.125); - border-right: 1px solid var(--inactive--color, #6e6e6e); + border-right: 1px solid var(--psp-inactive--color, #6e6e6e); user-select: none; cursor: pointer; .tab-title { font-size: 10px; padding: 10px; - border-bottom: 1px solid var(--inactive--color, #6e6e6e); + border-bottom: 1px solid var(--psp-inactive--color, #6e6e6e); } .tab-border { height: 2px; width: 100%; - background-color: var(--inactive--color, #6e6e6e); + background-color: var(--psp-inactive--color, #6e6e6e); margin-top: 1px; } @@ -68,7 +67,6 @@ } .tab-content { - @include scrollbar; flex: 1 1 auto; overflow: hidden; display: flex; diff --git a/rust/perspective-viewer/src/css/dom/checkbox.css b/rust/perspective-viewer/src/css/dom/checkbox.css new file mode 100644 index 0000000000..afbae7d6ba --- /dev/null +++ b/rust/perspective-viewer/src/css/dom/checkbox.css @@ -0,0 +1,102 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ + +:host { + input[type="checkbox"].alternate { + appearance: none; + height: 14px; + width: 14px; + padding: 0px; + cursor: pointer; + outline: none; + margin: 0 5px; + display: inline-block; + background-repeat: no-repeat; + background-color: var(--psp--color, #ccc); + -webkit-mask-size: cover; + mask-size: cover; + font-family: var(--psp-button--font-family, inherit); + -webkit-mask-image: var( + --psp-label--inactive-column-selector--content, + none + ); + mask-image: var(--psp-label--inactive-column-selector--content, none); + + &:before { + content: var(--psp-label--inactive-column-selector--content, none); + visibility: hidden; + } + + &:hover { + border-radius: 2px; + outline: 1px solid var(--psp--color); + } + + &:checked:hover { + background-color: var(--psp--color, #ccc); + } + + &:checked { + -webkit-mask-image: var( + --psp-label--active-column-selector--content, + none + ); + mask-image: var(--psp-label--active-column-selector--content, none); + } + } + + input[type="checkbox"] { + float: left; + appearance: none; + height: 14px; + width: 14px; + padding: 0px; + cursor: pointer; + outline: none; + margin: 0 5px 0 0; + display: inline-block; + background-repeat: no-repeat; + background-color: var(--psp--color); + -webkit-mask-size: cover; + mask-size: cover; + -webkit-mask-image: var(--psp-icon--checkbox-off--mask-image); + mask-image: var(--psp-icon--checkbox-off--mask-image); + + &:before { + content: var(--psp-icon--checkbox-off--mask-image); + visibility: hidden; + } + + &:checked { + -webkit-mask-image: var(--psp-icon--checkbox-on--mask-image); + mask-image: var(--psp-icon--checkbox-on--mask-image); + } + + &[disabled] { + opacity: 0.2s; + } + + &:hover { + background-color: transparent; + } + + &:hover { + -webkit-mask-image: var(--psp-icon--checkbox-hover--mask-image); + mask-image: var(--psp-icon--checkbox-hover--mask-image); + } + } + + input[type="checkbox"]:not(:disabled) { + cursor: pointer; + } +} diff --git a/rust/perspective-viewer/src/css/dom/scrollbar.css b/rust/perspective-viewer/src/css/dom/scrollbar.css new file mode 100644 index 0000000000..eeb9b9716d --- /dev/null +++ b/rust/perspective-viewer/src/css/dom/scrollbar.css @@ -0,0 +1,35 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ + +:host { + .scrollable { + &:hover { + --fix: ; + } + &::-webkit-scrollbar-thumb { + border-radius: 2px; + border: 2px solid transparent; + box-shadow: inset 0px 0px 0 4px var(--psp-inactive--color); + } + &:hover::-webkit-scrollbar-thumb { + border: 1px solid transparent; + box-shadow: inset 0px 0px 0 4px var(--psp-inactive--color); + } + &::-webkit-scrollbar, + &::-webkit-scrollbar-corner { + background-color: transparent; + width: 6px; + height: 6px; + } + } +} diff --git a/rust/perspective-viewer/src/less/dom/select.less b/rust/perspective-viewer/src/css/dom/select.css similarity index 68% rename from rust/perspective-viewer/src/less/dom/select.less rename to rust/perspective-viewer/src/css/dom/select.css index d2e06f489d..4b1f577bff 100644 --- a/rust/perspective-viewer/src/less/dom/select.less +++ b/rust/perspective-viewer/src/css/dom/select.css @@ -1,14 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { .dropdown-width-container { @@ -41,21 +42,21 @@ appearance: none; color: inherit; padding: 0px 12px 0px 0px; - font-size: 10px; + /* font-size: 10px; */ font-family: inherit; background-color: transparent; - background-image: var(--select-arrow--background-image); + background-image: var(--psp-icon--select-arrow--mask-image); background-position: right 2px center; background-repeat: no-repeat; &.invert:focus-within, &.invert:hover { - background-image: var(--select-arrow--hover--background-image); + background-image: var(--psp-icon--select-arrow-hover--mask-image); } option { - color: var(--icon--color, inherit); - background: var(--plugin--background, transparent); + color: var(--psp--color, inherit); + background: var(--psp--background-color, transparent); } } } diff --git a/rust/perspective-viewer/src/less/empty-column.less b/rust/perspective-viewer/src/css/empty-column.css similarity index 72% rename from rust/perspective-viewer/src/less/empty-column.less rename to rust/perspective-viewer/src/css/empty-column.css index e08fdb5cd8..1ea72cdef6 100644 --- a/rust/perspective-viewer/src/less/empty-column.less +++ b/rust/perspective-viewer/src/css/empty-column.css @@ -1,14 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { --invalid-column-pattern: url("data:image/svg+xml;utf8,"); @@ -21,7 +22,7 @@ .column-invalid-input { mask-image: var(--invalid-column-pattern); -webkit-mask-image: var(--invalid-column-pattern); - background-color: var(--icon--color); + background-color: var(--psp--color); mask-size: cover; -webkit-mask-size: cover; width: 100%; @@ -36,8 +37,8 @@ position: relative; box-sizing: border-box; width: calc(100% - 7px); - background-color: #8b868045; - border: 1px solid var(--icon--color); + background-color: var(--psp-placeholder--background); + border: 1px solid var(--psp--color); border-radius: 2px; margin-right: 6px; margin-bottom: 4px; @@ -52,7 +53,7 @@ align-items: stretch; cursor: auto; - background-color: #8b868045; + background-color: var(--psp-placeholder--background); border: 1px solid transparent; border-radius: 2px; padding-bottom: 0px; @@ -65,8 +66,8 @@ } .column-empty-input:focus { - color: var(--plugin--background); - background-color: var(--icon--color); - border: 1px solid var(--icon--color); + color: var(--psp--background-color); + background-color: var(--psp--color); + border: 1px solid var(--psp--color); } } diff --git a/rust/perspective-viewer/src/less/expression-editor.less b/rust/perspective-viewer/src/css/expression-editor.css similarity index 78% rename from rust/perspective-viewer/src/less/expression-editor.less rename to rust/perspective-viewer/src/css/expression-editor.css index f45cd78594..8ea220748b 100644 --- a/rust/perspective-viewer/src/less/expression-editor.less +++ b/rust/perspective-viewer/src/css/expression-editor.css @@ -1,22 +1,23 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { #editor-container { display: flex; flex-direction: column; min-width: 0px; - border: 1px solid var(--inactive--color); - background-color: var(--plugin--background); + border: 1px solid var(--psp-inactive--color); + background-color: var(--psp--background-color); border-radius: 3px; overflow: hidden; @@ -25,7 +26,7 @@ overflow: hidden; text-overflow: ellipsis; min-height: 1.5em; - color: var(--error--color); + color: var(--psp-error--color); top: 0.5em; left: 0.5em; position: absolute; @@ -37,7 +38,7 @@ #textarea_editable, #line_numbers, #editor { - background-color: var(--inactive--border-color); + background-color: var(--psp-inactive--border-color); } } } @@ -129,7 +130,7 @@ font-family: inherit; font-size: 0.8333em; text-transform: uppercase; - border: 1px solid var(--icon--color); + border: 1px solid var(--psp--color); border-radius: 2px; height: 24px; padding: 2px 12px; @@ -140,8 +141,8 @@ &:not([disabled]):hover { cursor: pointer; - background-color: var(--icon--color); - color: var(--plugin--background); + background-color: var(--psp--color); + color: var(--psp--background-color); } &[disabled] { diff --git a/rust/perspective-viewer/src/less/filter-dropdown.less b/rust/perspective-viewer/src/css/filter-dropdown.css similarity index 73% rename from rust/perspective-viewer/src/less/filter-dropdown.less rename to rust/perspective-viewer/src/css/filter-dropdown.css index 3ddbd15023..f6421de1aa 100644 --- a/rust/perspective-viewer/src/less/filter-dropdown.less +++ b/rust/perspective-viewer/src/css/filter-dropdown.css @@ -1,14 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { position: fixed; diff --git a/rust/perspective-viewer/src/less/filter-item.less b/rust/perspective-viewer/src/css/filter-item.css similarity index 81% rename from rust/perspective-viewer/src/less/filter-item.less rename to rust/perspective-viewer/src/css/filter-item.css index 734773153f..2abf51ec09 100644 --- a/rust/perspective-viewer/src/less/filter-item.less +++ b/rust/perspective-viewer/src/css/filter-item.css @@ -1,18 +1,19 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { :-webkit-calendar-picker-indicator { - filter: var(--calendar--filter, none); + filter: var(--psp-calendar--filter, none); } #top_panel { @@ -39,14 +40,14 @@ grid-area: 1 / 1; padding: 0; border: none; - border-bottom: 1px solid var(--inactive--color, #ccc); + border-bottom: 1px solid var(--psp-inactive--color, #ccc); background: transparent; color: inherit; } &:after { content: attr(data-value) " "; - color: var(--inactive--color, inherit); + color: var(--psp-inactive--color, inherit); visibility: hidden; white-space: nowrap; padding-right: 18px; @@ -85,7 +86,7 @@ } } - // The filter comparator + /* The filter comparator */ #filter { .pivot-column { input { diff --git a/rust/perspective-viewer/src/less/form/code-editor.less b/rust/perspective-viewer/src/css/form/code-editor.css similarity index 69% rename from rust/perspective-viewer/src/less/form/code-editor.less rename to rust/perspective-viewer/src/css/form/code-editor.css index 46d8b3d418..7558e7e3dc 100644 --- a/rust/perspective-viewer/src/less/form/code-editor.less +++ b/rust/perspective-viewer/src/css/form/code-editor.css @@ -1,16 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import "dom/scrollbar.less"; +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { #editor { @@ -19,7 +18,6 @@ position: relative; overflow-x: visible; overflow-y: auto; - @include scrollbar; #editor-height-sizer { height: 100px; @@ -33,13 +31,13 @@ } #line_numbers { - color: var(--inactive--color); - background-color: var(--plugin--background, white); + color: var(--psp-inactive--color); + background-color: var(--psp--background-color, white); box-sizing: border-box; display: flex; flex-direction: column; flex: 0 0 auto; - font-family: var(--interface-monospace--font-family, monospace); + font-family: var(--psp-interface-monospace--font-family, monospace); font-weight: 400; overflow: hidden; padding: 6px 0 6px 6px; @@ -59,25 +57,25 @@ pre#content { margin: 0 6px 6px 0; padding: 6px 0; - // margin-left: 36px; + /* margin-left: 36px; */ box-sizing: border-box; pointer-events: none; font-weight: 400; - font-family: var(--interface-monospace--font-family, monospace); + font-family: var(--psp-interface-monospace--font-family, monospace); color: var(--code-editor-error--color, red); white-space: pre; overflow: hidden; span { - // display: contents; + /* display: contents; */ } .comment { - color: var(--code-editor-comment--color, orange); + color: var(--psp-code-editor--comment--color, orange); } .operator { - color: var(--code-editor-operator--color, green); + color: var(--psp-code-editor--operator--color, green); } .unknown { @@ -85,19 +83,19 @@ } .symbol { - color: var(--code-editor-symbol--color, #242526); + color: var(--psp-code-editor--symbol--color, #242526); } .column { - color: var(--code-editor-column--color, purple); + color: var(--psp-code-editor--column--color, purple); } .literal { - color: var(--code-editor-literal--color, blue); + color: var(--psp-code-editor--literal--color, blue); } .error_highlight { - // background-color: + /* background-color: */ color: var(--code-editor-error--color, red); background-color: rgba(255, 0, 0, 0.1); border: 0px solid var(--code-editor-error--color, red); @@ -107,12 +105,10 @@ } #textarea_editable { - @include scrollbar; - position: absolute; width: 100%; height: 100%; - font-family: var(--interface-monospace--font-family, monospace); + font-family: var(--psp-interface-monospace--font-family, monospace); font-size: 1em; resize: none; padding: 6px 0; @@ -120,7 +116,7 @@ border: none; outline: none; color: transparent; - caret-color: var(--code-editor-symbol--color, #242526); + caret-color: var(--psp-code-editor--symbol--color, #242526); white-space: pre; box-sizing: border-box; background-color: transparent; diff --git a/rust/perspective-viewer/src/less/form/debug.less b/rust/perspective-viewer/src/css/form/debug.css similarity index 71% rename from rust/perspective-viewer/src/less/form/debug.less rename to rust/perspective-viewer/src/css/form/debug.css index 07f182525e..86610e83c2 100644 --- a/rust/perspective-viewer/src/less/form/debug.less +++ b/rust/perspective-viewer/src/css/form/debug.css @@ -1,18 +1,19 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { div.tab-title#Debug:before { - content: var(--debug-tab-label--content, "Debug JSON"); + content: var(--psp-label--debug-tab--content, "Debug JSON"); } #debug-panel-overflow { @@ -47,7 +48,7 @@ appearance: none; background-color: transparent; border-radius: 3px; - border: 1px solid var(--icon--color); + border: 1px solid var(--psp--color); color: inherit; cursor: pointer; flex: 0 1 100px; @@ -59,8 +60,8 @@ overflow: hidden; width: 0px; &:not([disabled]):hover { - background-color: var(--icon--color); - color: var(--plugin--background); + background-color: var(--psp--color); + color: var(--psp--background-color); } &[disabled] { @@ -79,10 +80,10 @@ } #editor { - background-color: var(--plugin--background); - border: 1px solid var(--inactive--color); + background-color: var(--psp--background-color); + border: 1px solid var(--psp-inactive--color); border-radius: 2px; - // height: 100%; + /* height: 100%; */ } } } diff --git a/rust/perspective-viewer/src/less/function-dropdown.less b/rust/perspective-viewer/src/css/function-dropdown.css similarity index 71% rename from rust/perspective-viewer/src/less/function-dropdown.less rename to rust/perspective-viewer/src/css/function-dropdown.css index 54be01fb8a..78a98d84b2 100644 --- a/rust/perspective-viewer/src/less/function-dropdown.less +++ b/rust/perspective-viewer/src/css/function-dropdown.css @@ -1,14 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { position: fixed; diff --git a/rust/perspective-viewer/src/css/plugin-selector.css b/rust/perspective-viewer/src/css/plugin-selector.css new file mode 100644 index 0000000000..28a7359665 --- /dev/null +++ b/rust/perspective-viewer/src/css/plugin-selector.css @@ -0,0 +1,261 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ + +:host { + #settings_panel { + #plugin_selector_container.open ~ * { + opacity: 0; + } + + #plugin_selector_container { + min-height: var( + --psp-plugin-selector--height, + var(--psp-status-bar--height, 48px) + ); + display: flex; + white-space: nowrap; + flex-direction: column; + flex: 0 0 auto; + + /* Overflow the padding bounds of the container */ + /* TODO these bounds exist to protext the resizer and scrollbar (left & */ + /* right resp) but we really should find a way to remove it and delegate */ + /* to sub-containers. */ + margin: 0 0px 0 -9px; + + #plugin_selector_border { + height: 2px; + min-height: 2px; + width: 100%; + background-color: var(--psp-inactive--color, #6e6e6e); + margin-top: 2px; + } + + .plugin-selector-options { + overflow-y: auto; + } + + &.open { + position: absolute; + margin: 0; + top: 0; + left: 0; + right: 0; + bottom: 0; + + /* This element is first in the container but visually "overlaps" */ + /* when expanded */ + z-index: 3; + color: var(--psp--color, #042121); + /* background: var(--psp--background-color); */ + + .plugin-select-item { + padding-left: 8px; + } + } + + .plugin-select-item-name { + padding-left: 10px; + font-size: 1.33333em; + } + + .plugin-select-item-name:before { + /* This value is set in a `style` tag from Yew! */ + content: var(--default-column-title); + } + + .plugin-select-item { + /* width: 48px; */ + padding-left: 9px; + height: var( + --psp-plugin-selector--height, + var(--psp-status-bar--height, 48px) + ); + min-height: var( + --psp-plugin-selector--height, + var(--psp-status-bar--height, 48px) + ); + display: flex; + align-items: center; + border-bottom: 1px solid transparent; + box-shadow: 0px 1px var(--psp-inactive--color, #6e6e6e); + cursor: pointer; + } + + .plugin-select-item > .icon { + display: inline-block; + -webkit-mask-size: cover; + mask-size: cover; + background-repeat: no-repeat; + background-color: var(--psp--color); + } + + .plugin-select-item:hover { + background-color: var(--psp--color, #042121); + color: var(--psp--background-color, #fdfffd); + } + + .plugin-select-item:hover > .icon { + background-color: var(--psp--background-color, #fdfffd); + } + + .plugin-select-item[data-plugin="Candlestick"] > .icon { + -webkit-mask-image: var( + --psp-plugin-selector--candlestick--content + ); + mask-image: var(--psp-plugin-selector--candlestick--content); + &:before { + content: var(--psp-plugin-selector--candlestick--content); + visibility: hidden; + } + } + + .plugin-select-item[data-plugin="Heatmap"] > .icon { + -webkit-mask-image: var( + --psp-plugin-selector--heatmap--content + ); + mask-image: var(--psp-plugin-selector--heatmap--content); + &:before { + content: var(--psp-plugin-selector--heatmap--content); + visibility: hidden; + } + } + + .plugin-select-item[data-plugin="Map Scatter"] > .icon { + -webkit-mask-image: var( + --psp-plugin-selector--map-scatter--content + ); + mask-image: var(--psp-plugin-selector--map-scatter--content); + &:before { + content: var(--psp-plugin-selector--map-scatter--content); + visibility: hidden; + } + } + + .plugin-select-item[data-plugin="OHLC"] > .icon { + -webkit-mask-image: var(--psp-plugin-selector--ohlc--content); + mask-image: var(--psp-plugin-selector--ohlc--content); + &:before { + content: var(--psp-plugin-selector--ohlc--content); + visibility: hidden; + } + } + + .plugin-select-item[data-plugin="Sunburst"] > .icon { + -webkit-mask-image: var( + --psp-plugin-selector--sunburst--content + ); + mask-image: var(--psp-plugin-selector--sunburst--content); + &:before { + content: var(--psp-plugin-selector--sunburst--content); + visibility: hidden; + } + } + + .plugin-select-item[data-plugin="Treemap"] > .icon { + -webkit-mask-image: var( + --psp-plugin-selector--treemap--content + ); + mask-image: var(--psp-plugin-selector--treemap--content); + &:before { + content: var(--psp-plugin-selector--treemap--content); + visibility: hidden; + } + } + + .plugin-select-item[data-plugin="X Bar"] > .icon { + -webkit-mask-image: var(--psp-plugin-selector--x-bar--content); + mask-image: var(--psp-plugin-selector--x-bar--content); + &:before { + content: var(--psp-plugin-selector--x-bar--content); + visibility: hidden; + } + } + + .plugin-select-item[data-plugin="X/Y Line"] > .icon { + -webkit-mask-image: var( + --psp-plugin-selector--x-y-line--content + ); + mask-image: var(--psp-plugin-selector--x-y-line--content); + &:before { + content: var(--psp-plugin-selector--x-y-line--content); + visibility: hidden; + } + } + + .plugin-select-item[data-plugin="X/Y Scatter"] > .icon { + -webkit-mask-image: var( + --psp-plugin-selector--x-y-scatter--content + ); + mask-image: var(--psp-plugin-selector--x-y-scatter--content); + &:before { + content: var(--psp-plugin-selector--x-y-scatter--content); + visibility: hidden; + } + } + + .plugin-select-item[data-plugin="Y Area"] > .icon { + -webkit-mask-image: var(--psp-plugin-selector--y-area--content); + mask-image: var(--psp-plugin-selector--y-area--content); + &:before { + content: var(--psp-plugin-selector--y-area--content); + visibility: hidden; + } + } + + .plugin-select-item[data-plugin="Y Bar"] > .icon { + -webkit-mask-image: var(--psp-plugin-selector--y-bar--content); + mask-image: var(--psp-plugin-selector--y-bar--content); + &:before { + content: var(--psp-plugin-selector--y-bar--content); + visibility: hidden; + } + } + + .plugin-select-item[data-plugin="Y Line"] > .icon { + -webkit-mask-image: var(--psp-plugin-selector--y-line--content); + mask-image: var(--psp-plugin-selector--y-line--content); + &:before { + content: var(--psp-plugin-selector--y-line--content); + visibility: hidden; + } + } + + .plugin-select-item[data-plugin="Y Scatter"] > .icon { + -webkit-mask-image: var( + --psp-plugin-selector--y-scatter--content + ); + mask-image: var(--psp-plugin-selector--y-scatter--content); + &:before { + content: var(--psp-plugin-selector--y-scatter--content); + visibility: hidden; + } + } + + .plugin-select-item[data-plugin="Datagrid"] > .icon { + -webkit-mask-image: var( + --psp-plugin-selector--datagrid--content + ); + mask-image: var(--psp-plugin-selector--datagrid--content); + &:before { + content: var(--psp-plugin-selector--datagrid--content); + visibility: hidden; + } + } + } + + #plugin_selector { + flex-grow: 1; + } + } +} diff --git a/rust/perspective-viewer/src/less/render-warning.less b/rust/perspective-viewer/src/css/render-warning.css similarity index 72% rename from rust/perspective-viewer/src/less/render-warning.less rename to rust/perspective-viewer/src/css/render-warning.css index dd0bb6e126..441f2364dc 100644 --- a/rust/perspective-viewer/src/less/render-warning.less +++ b/rust/perspective-viewer/src/css/render-warning.css @@ -1,20 +1,21 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ -// @amber400: #ffca28; +/* @amber400: #ffca28; */ :host { .plugin_information { - color: var(--warning--color, inherit); + color: var(--psp-warning--color, inherit); box-sizing: border-box; display: flex; position: absolute; @@ -30,7 +31,7 @@ align-items: center; &.plugin_information--warning { - background: var(--warning--background, #ffca28); + background: var(--psp-warning--background, #ffca28); } .plugin_information__text { @@ -45,13 +46,13 @@ } .plugin_information__icon:before { - content: var(--overflow-hint-icon--content); + content: var(--psp-icon-overflow-hint--content); height: 20px; font-family: var( --overflow_hint--font-family, - var(--button--font-family, inherit) + var(--psp-button--font-family, inherit) ); - color: var(--overflow-hint-icon--color); + color: var(--psp-icon-overflow-hint--color); padding: var(--overflow-hint-icon--padding, 0 12px 0 6px); font-size: 16px; } diff --git a/rust/perspective-viewer/src/less/status-bar.less b/rust/perspective-viewer/src/css/status-bar.css similarity index 61% rename from rust/perspective-viewer/src/less/status-bar.less rename to rust/perspective-viewer/src/css/status-bar.css index 2a5d967998..687c5a7e9a 100644 --- a/rust/perspective-viewer/src/less/status-bar.less +++ b/rust/perspective-viewer/src/css/status-bar.css @@ -1,14 +1,15 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host(:hover) { #status_bar.settings-closed.floating { @@ -18,11 +19,11 @@ } :host { - // When settings open ... + /* When settings open ... */ #main_column #status_bar, #main_column #status_bar.titled { input::placeholder { - color: var(--inactive--color); + color: var(--psp-inactive--color); } } @@ -43,23 +44,25 @@ min-height: auto; max-height: none; gap: 6px; - top: calc((var(--status-bar--height, 48px) - 20px) / 2); - right: calc(min(48px, (var(--status-bar--height, 48px) - 20px) / 2)); + top: calc((var(--psp-status-bar--height, 48px) - 20px) / 2); + right: calc( + min(48px, (var(--psp-status-bar--height, 48px) - 20px) / 2) + ); } #status_bar { - box-shadow: 0 13px 0 -12px var(--inactive--border-color); + box-shadow: 0 13px 0 -12px var(--psp-inactive--border-color); z-index: 1; - display: var(--status-bar--display, flex); + display: var(--psp-status-bar--display, flex); gap: 6px; align-items: center; - background: var(--plugin--background); - padding: var(--status-bar--padding, 0 31px 0 8px); + background: var(--psp--background-color); + padding: var(--psp-status-bar--padding, 0 31px 0 8px); position: relative; - height: var(--status-bar--height, 48px); - min-height: var(--status-bar--height, 48px); - max-height: var(--status-bar--height, 48px); - border-radius: var(--status-bar--border-radius); + height: var(--psp-status-bar--height, 48px); + min-height: var(--psp-status-bar--height, 48px); + max-height: var(--psp-status-bar--height, 48px); + border-radius: var(--psp-status-bar--border-radius); #status-bar-placeholder { margin: 0px; margin-right: -5px; @@ -71,8 +74,8 @@ } input:placeholder-shown + #status-bar-placeholder:before { - content: var(--untitled--content, "untitled"); - color: var(--inactive--color); + content: var(--psp-label--untitled--content, "untitled"); + color: var(--psp-inactive--color); } .input-sizer { @@ -106,7 +109,7 @@ &:after { content: attr(data-value) " "; - color: var(--inactive--color, inherit); + color: var(--psp-inactive--color, inherit); visibility: hidden; white-space: nowrap; padding-right: 12px; @@ -148,11 +151,11 @@ span.x, span.total { - color: var(--inactive--color); + color: var(--psp-inactive--color); } } - // Exceptions when the menu bar is visible and the settings panel is closed. + /* Exceptions when the menu bar is visible and the settings panel is closed. */ #menu-bar { flex: 0 1000000 auto; height: 100%; @@ -175,16 +178,13 @@ span.icon { height: 100%; - line-height: 36px; + /* line-height: 36px; */ margin: 0; } span#status { - width: 20px; - height: 20px; background-repeat: no-repeat; - background-color: var(--icon--color); - content: ""; + background-color: var(--psp--color); mask-size: contain; mask-repeat: no-repeat; mask-position: center; @@ -193,12 +193,17 @@ margin: 0 5px; } - // span#status_updating + /* span#status_updating */ span#status.loading { image-rendering: pixelated; - mask-image: var(--downloading-icon--mask-image); - -webkit-mask-image: var(--downloading-icon--mask-image); + mask-image: var(--psp-icon--downloading--mask-image); + -webkit-mask-image: var(--psp-icon--downloading--mask-image); + &:before { + visibility: hidden; + content: var(--psp-icon--downloading--mask-image); + line-height: 0; + } } span#status.uninitialized { @@ -207,8 +212,13 @@ span#status.connected, span#status.updating { - mask-image: var(--status-ok-icon--mask-image); - -webkit-mask-image: var(--status-ok-icon--mask-image); + mask-image: var(--psp-icon--status-ok--mask-image); + -webkit-mask-image: var(--psp-icon--status-ok--mask-image); + &:before { + visibility: hidden; + content: var(--psp-icon--status-ok--mask-image); + line-height: 0; + } } .error-dialog { @@ -222,9 +232,9 @@ padding: 0px 0px 0px 50px; display: none; white-space: pre-wrap; - color: var(--plugin--background); - background: var(--icon--color); - border-radius: var(--status-bar--border-radius); + color: var(--psp--background-color); + background: var(--psp--color); + border-radius: var(--psp-status-bar--border-radius); } .error-dialog-message { @@ -233,14 +243,14 @@ align-items: center; display: flex; padding-right: 17px; - height: var(--status-bar--height, 48px); - min-height: var(--status-bar--height, 48px); + height: var(--psp-status-bar--height, 48px); + min-height: var(--psp-status-bar--height, 48px); } .error-dialog-stack { font-size: 10px; padding-right: 17px; - color: var(--inactive--color); + color: var(--psp-inactive--color); overflow-y: auto; padding-bottom: 24px; } @@ -256,22 +266,23 @@ border-radius: 3px; margin: 0; height: auto; - border: 1px solid var(--status-ok-icon--border-color, transparent); - cursor: var(--status-ok-icon--cursor); - pointer-events: var(--status-indicator--pointer-events, none); + border: 1px solid + var(--psp-status-icon--ok--border-color, transparent); + cursor: var(--psp-status-icon--ok--cursor); + pointer-events: var(--psp-status-icon--pointer-events, none); &:hover { background-color: var( - --status-ok-icon--hover--background-color, + --psp-status-icon--ok-hover--background-color, transparent ); border-color: var( - --status-ok-icon--hover--border-color, + --psp-status-icon--ok-hover--border-color, transparent ); span#status { background-color: var( - --status-ok-icon--hover--color, - var(--icon--color) + --psp-status-icon--ok-hover--color, + var(--psp--color) ); } } @@ -292,37 +303,42 @@ align-items: center; justify-content: center; height: 20px; + width: 20px; border-radius: 10px; - color: var(--plugin--background); + color: var(--psp--background-color); &:before { content: "!"; } } &.errored:hover { - background-color: var(--icon--color); + background-color: var(--psp--color); span#status.errored { - color: var(--icon--color); - background-color: var(--plugin--background); + color: var(--psp--color); + background-color: var(--psp--background-color); } } } - // Status bar status icon animations + /* Status bar status icon animations */ span#status_updating { position: absolute; + display: inline-flex; + margin: 0 5px; opacity: 0; - width: 20px; - height: 20px; background-repeat: no-repeat; - background-color: var(--icon--color); - content: ""; + background-color: var(--psp--color); -webkit-mask-size: cover; mask-size: cover; pointer-events: none; image-rendering: pixelated; - mask-image: var(--updating-icon--mask-image); - -webkit-mask-image: var(--updating-icon--mask-image); + mask-image: var(--psp-icon--updating--mask-image); + -webkit-mask-image: var(--psp-icon--updating--mask-image); + &:before { + visibility: hidden; + content: var(--psp-icon--updating--mask-image); + line-height: 0; + } } span#status.updating { @@ -339,51 +355,76 @@ animation-duration: 0.3s; } - .button:before { - height: 21px; - width: 21px; + .button > .icon { background-repeat: no-repeat; - background-color: var(--icon--color); - content: ""; + background-color: var(--psp--color); -webkit-mask-size: cover; mask-size: cover; pointer-events: none; + display: inline-block; } span#export { - &:before { - -webkit-mask-image: var(--export-icon--mask-image); - mask-image: var(--export-icon--mask-image); + & > .icon { + -webkit-mask-image: var(--psp-icon--export--mask-image); + mask-image: var(--psp-icon--export--mask-image); + display: inline-flex; + &:before { + line-height: 0; + content: var(--psp-icon--export--mask-image); + visibility: hidden; + } } - span:before { - content: var(--export-button--content, "Export"); + + span:not(.icon):before { + content: var(--psp-label--export-button--content, "Export"); } } span#lock { - &:before { - -webkit-mask-image: var(--free-scroll-icon--mask-image); - mask-image: var(--free-scroll-icon--mask-image); + & > .icon { + -webkit-mask-image: var(--psp-icon--free-scroll--mask-image); + mask-image: var(--psp-icon--free-scroll--mask-image); + + &:before { + line-height: 0; + content: var(--psp-icon--free-scroll--mask-image); + visibility: hidden; + } } } span#reset { - &:before { - -webkit-mask-image: var(--reset-icon--mask-image); - mask-image: var(--reset-icon--mask-image); + & > .icon { + -webkit-mask-image: var(--psp-icon--reset--mask-image); + mask-image: var(--psp-icon--reset--mask-image); + display: inline-flex; + &:before { + line-height: 0; + content: var(--psp-icon--reset--mask-image); + visibility: hidden; + } } - span:before { - content: var(--reset-button--content); + span:not(.icon):before { + content: var(--psp-label--reset-button--content); } } span#copy { - &:before { - -webkit-mask-image: var(--copy-icon--mask-image); - mask-image: var(--copy-icon--mask-image); + & > .icon { + -webkit-mask-image: var(--psp-icon--copy--mask-image); + mask-image: var(--psp-icon--copy--mask-image); + display: inline-flex; + + &:before { + line-height: 0; + content: var(--psp-icon--copy--mask-image); + visibility: hidden; + } } - span:before { - content: var(--copy-button--content); + + span:not(.icon):before { + content: var(--psp-label--copy-button--content); } } @@ -405,21 +446,29 @@ height: 100%; } - &:before { + & > .icon { margin: 0 6px 0 4px; - -webkit-mask-image: var(--theme-icon--mask-image); - mask-image: var(--theme-icon--mask-image); + height: auto; + -webkit-mask-image: var(--psp-icon--theme--mask-image); + mask-image: var(--psp-icon--theme--mask-image); + display: inline-flex; + &:before { + line-height: 0; + content: var(--psp-icon--theme--mask-image); + visibility: hidden; + } } } - #theme_icon.modified:hover + #theme:before { - -webkit-mask-image: var(--close-icon--mask-image); - mask-image: var(--close-icon--mask-image); + #theme_icon.modified:hover + #theme > .icon { + -webkit-mask-image: var(--psp-icon--close--mask-image); + mask-image: var(--psp-icon--close--mask-image); } #theme_selector { max-width: 100px; text-overflow: ellipsis; + font-size: 0.8em; } .button { @@ -428,7 +477,7 @@ align-items: center; margin: 0px; padding: 0 5px; - color: var(--inactive--color, #ccc); + color: var(--psp-inactive--color, #ccc); border: 1px solid transparent; border-radius: 3px; font-size: var(--label--font-size, 0.75em); @@ -440,7 +489,7 @@ display: none; } - &:before { + & > .icon { z-index: 1; } } @@ -455,9 +504,9 @@ &:hover, &.modal-target { box-shadow: - -4px 0 0 var(--icon--color), - 4px 0 0 var(--icon--color); - background-color: var(--icon--color); + -4px 0 0 var(--psp--color), + 4px 0 0 var(--psp--color); + background-color: var(--psp--color); } &:focus-within .button select, @@ -466,26 +515,26 @@ } .modal-target .button > span { - color: var(--icon--color) !important; + color: var(--psp--color) !important; } &:focus-within .button, &:hover .button, &.modal-target .button { position: relative; - min-width: var(--button--min-width, 33px); + min-width: var(--psp-button--min-width, 33px); color: inherit; cursor: pointer; transition: none; - background-color: var(--icon--color); - color: var(--plugin--background); + background-color: var(--psp--color); + color: var(--psp--background-color); - &:before { - background-color: var(--plugin--background); + & > .icon { + background-color: var(--psp--background-color); } - // The label. - @mixin label { + & > span:not(.icon) { + /* The label. */ display: block; text-align: center; position: absolute; @@ -498,20 +547,16 @@ white-space: nowrap; line-height: 1; width: 41px; - background-color: var(--icon--color); + background-color: var(--psp--color); border-radius: 0 0 3px 3px; } - & > span { - @include label; - } - & > .dropdown-width-container { display: block; margin: 0; white-space: nowrap; line-height: 1; - background-color: var(--icon--color); + background-color: var(--psp--color); pointer-events: all; & > select { diff --git a/rust/perspective-viewer/src/css/type-icon.css b/rust/perspective-viewer/src/css/type-icon.css new file mode 100644 index 0000000000..4ca48b4e84 --- /dev/null +++ b/rust/perspective-viewer/src/css/type-icon.css @@ -0,0 +1,116 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ + +:host #selected-columns .type-icon, +:host #sub-columns .type-icon { + /* position: absolute; */ + /* left: 15px; */ + margin-left: 4px; +} + +:host .icon { + background-repeat: no-repeat; + background-color: var(--psp--color); + display: inline-block; + -webkit-mask-size: cover; + mask-size: cover; + flex-shrink: 0; + line-height: 0; + &.integer { + -webkit-mask-image: var(--icon-image); + mask-image: var(--icon-image); + + &:before { + content: var(--icon-image); + visibility: hidden; + } + } +} + +:host .type-icon { + background-repeat: no-repeat; + background-color: var(--psp--color); + display: inline-block; + -webkit-mask-size: cover; + mask-size: cover; + flex-shrink: 0; + line-height: 0; + + &.none { + content: none; + } + + &.integer { + -webkit-mask-image: var(--psp-column-type--integer--mask-image); + mask-image: var(--psp-column-type--integer--mask-image); + + &:before { + content: var(--psp-column-type--integer--mask-image); + visibility: hidden; + } + } + + &.float { + -webkit-mask-image: var(--psp-column-type--float--mask-image); + mask-image: var(--psp-column-type--float--mask-image); + &:before { + content: var(--psp-column-type--float--mask-image); + visibility: hidden; + } + } + + &.string { + -webkit-mask-image: var(--psp-column-type--string--mask-image); + mask-image: var(--psp-column-type--string--mask-image); + &:before { + content: var(--psp-column-type--string--mask-image); + visibility: hidden; + } + } + + &.boolean { + -webkit-mask-image: var(--psp-column-type--boolean--mask-image); + mask-image: var(--psp-column-type--boolean--mask-image); + &:before { + content: var(--psp-column-type--boolean--mask-image); + visibility: hidden; + } + } + + &.date { + -webkit-mask-image: var(--psp-column-type--date--mask-image); + mask-image: var(--psp-column-type--date--mask-image); + &:before { + content: var(--psp-column-type--date--mask-image); + visibility: hidden; + } + } + + &.datetime { + -webkit-mask-image: var(--psp-column-type--datetime--mask-image); + mask-image: var(--psp-column-type--datetime--mask-image); + &:before { + content: var(--psp-column-type--datetime--mask-image); + visibility: hidden; + } + } + + &.expression { + -webkit-mask-image: var(--psp-icon--add-expression--mask-image); + mask-image: var(--psp-icon--add-expression--mask-image); + &:before { + content: var(--psp-icon--add-expression--mask-image); + visibility: hidden; + } + } +} diff --git a/rust/perspective-viewer/src/less/viewer.less b/rust/perspective-viewer/src/css/viewer.css similarity index 58% rename from rust/perspective-viewer/src/less/viewer.less rename to rust/perspective-viewer/src/css/viewer.css index 8c17946326..11276a6cbf 100644 --- a/rust/perspective-viewer/src/less/viewer.less +++ b/rust/perspective-viewer/src/css/viewer.css @@ -1,18 +1,19 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + */ :host { --settings-panel-z-index: 10; - --icon--color: #ff0000; + --psp--color: #ff0000; } ::slotted(*) { @@ -25,8 +26,8 @@ padding-top: calc( ( var( - --plugin-selector--height, - var(--status-bar--height, 48px) + --psp-plugin-selector--height, + var(--psp-status-bar--height, 48px) ) - 20px ) / @@ -35,15 +36,18 @@ padding-bottom: calc( ( var( - --plugin-selector--height, - var(--status-bar--height, 48px) + --psp-plugin-selector--height, + var(--psp-status-bar--height, 48px) ) - 20px ) / 2 ); z-index: 10000; - height: var(--plugin-selector--height, var(--status-bar--height, 48px)); + height: var( + --psp-plugin-selector--height, + var(--psp-status-bar--height, 48px) + ); &:hover { cursor: pointer; @@ -52,25 +56,27 @@ .sidebar_close_button_inner { border-radius: 5px 0 0 5px; height: 20px; - background-color: var(--plugin--background); + background-color: var(--psp--background-color); } - .sidebar_close_button_inner:before { + .sidebar_close_button_inner .icon { display: inline-block; - height: 20px; - width: 20px; - content: ""; mask-size: cover; -webkit-mask-size: cover; background-repeat: no-repeat; - background-color: var(--icon--color); - mask-image: var(--drawer-tab-icon--mask-image); - -webkit-mask-image: var(--drawer-tab-icon--mask-image); + background-color: var(--psp--color); + mask-image: var(--psp-icon--drawer-tab--mask-image); + -webkit-mask-image: var(--psp-icon--drawer-tab--mask-image); + + &:before { + content: var(--psp-icon--drawer-tab--mask-image); + visibility: hidden; + } } - &:hover .sidebar_close_button_inner:before { - mask-image: var(--drawer-tab-icon--hover--mask-image); - -webkit-mask-image: var(--drawer-tab-icon--hover--mask-image); + &:hover .sidebar_close_button_inner .icon { + mask-image: var(--psp-icon--drawer-tab-hover--mask-image); + -webkit-mask-image: var(--psp-icon--drawer-tab-hover--mask-image); } } @@ -81,20 +87,20 @@ :host #debug_close_button.sidebar_close_button .sidebar_close_button_inner { background-attachment: fixed; - background: var(--sidebar--background); - background-size: 4px; + background: var(--psp-sidebar--background); - &:before { - mask-image: var(--drawer-tab-icon--hover--mask-image); - -webkit-mask-image: var(--drawer-tab-icon--hover--mask-image); + .icon { + mask-image: var(--psp-icon--drawer-tab-hover--mask-image); + -webkit-mask-image: var(--psp-icon--drawer-tab-hover--mask-image); } } :host #debug_close_button.sidebar_close_button:hover - .sidebar_close_button_inner:before { - mask-image: var(--drawer-tab-icon--mask-image); - -webkit-mask-image: var(--drawer-tab-icon--mask-image); + .sidebar_close_button_inner + .icon { + mask-image: var(--psp-icon--drawer-tab--mask-image); + -webkit-mask-image: var(--psp-icon--drawer-tab--mask-image); } :host #debug_open_button.sidebar_close_button { @@ -107,14 +113,16 @@ } :host #debug_open_button.sidebar_close_button .sidebar_close_button_inner { - &:before { - mask-image: var(--drawer-tab-inverted-icon--mask-image); - -webkit-mask-image: var(--drawer-tab-inverted-icon--mask-image); + .icon { + mask-image: var(--psp-icon--drawer-tab-inverted--mask-image); + -webkit-mask-image: var(--psp-icon--drawer-tab-inverted--mask-image); } - &:hover:before { - mask-image: var(--drawer-tab-inverted-icon--hover--mask-image); - -webkit-mask-image: var(--drawer-tab-inverted-icon--hover--mask-image); + &:hover .icon { + mask-image: var(--psp-icon--drawer-tab-inverted-hover--mask-image); + -webkit-mask-image: var( + --psp-icon--drawer-tab-inverted-hover--mask-image + ); } } @@ -164,7 +172,7 @@ height: auto; flex-direction: row-reverse; & > .split-panel-divider { - border-left: 1px solid var(--inactive--color, #6e6e6e); + border-left: 1px solid var(--psp-inactive--color, #6e6e6e); margin-right: -5px; } } @@ -183,12 +191,12 @@ } #modal_panel > .split-panel-divider { - border-left: 1px solid var(--inactive--color, #6e6e6e); + border-left: 1px solid var(--psp-inactive--color, #6e6e6e); margin-right: -5px; } #status_bar { - height: var(--status-bar--height, 48px); + height: var(--psp-status-bar--height, 48px); } #main_column_container { @@ -204,19 +212,22 @@ overflow: hidden; flex-direction: column; position: relative; - margin: var(--main-column--margin); - border: var(--main-column--border); - border-width: var(--main-column--border-width); - border-radius: var(--main-column--border-radius); + margin: var(--psp-main-column--margin); + border: var(--psp-main-column--border); + border-width: var(--psp-main-column--border-width); + border-radius: var(--psp-main-column--border-radius); } #main_panel_container { position: relative; height: 100%; box-shadow: var(--plugin--box-shadow, none); - background: var(--plugin--background, none); + background: var( + --psp-main-column--background, + var(--psp--background-color, none) + ); overflow: hidden; - border: var(--plugin--border, none); + border: var(--psp-plugin--border, none); } #settings_panel { @@ -233,8 +244,8 @@ } & > .split-panel-divider { - border-top: 1px solid var(--inactive--color, #6e6e6e); - border-bottom: 2px solid var(--inactive--color, #6e6e6e); + border-top: 1px solid var(--psp-inactive--color, #6e6e6e); + border-bottom: 2px solid var(--psp-inactive--color, #6e6e6e); margin-left: -9px; margin-right: 0px; flex: 0 0 4px; @@ -242,8 +253,8 @@ } #column_settings_sidebar .split-panel-divider { - border-top: 1px solid var(--inactive--color, #6e6e6e); - border-bottom: 2px solid var(--inactive--color, #6e6e6e); + border-top: 1px solid var(--psp-inactive--color, #6e6e6e); + border-bottom: 2px solid var(--psp-inactive--color, #6e6e6e); margin-left: -9px; margin-right: -4px; flex: 0 0 4px; @@ -256,8 +267,7 @@ } .sidebar_column { - background: var(--sidebar--background); - background-size: 4px; + background: var(--psp-sidebar--background); background-attachment: fixed; display: flex; @@ -265,7 +275,7 @@ flex-direction: column; flex: 1; - // Needs 2 because it must take precedence over teh chart legend. + /* Needs 2 because it must take precedence over teh chart legend. */ z-index: 2; } @@ -273,7 +283,7 @@ margin-top: 3px; border-bottom-width: 1px; border-style: solid; - border-color: var(--inactive--color, #c5c9d0); + border-color: var(--psp-inactive--color, #c5c9d0); border-top-width: 0px; border-left-width: 0px; border-right-width: 0px; @@ -289,80 +299,82 @@ } #close_button { - background-color: var(--plugin--background); + background-color: var(--psp--background-color); padding: 0px; overflow: hidden; - display: var(--close-button--display, none); + display: var(--psp-close-button--display, none); align-items: center; justify-content: center; z-index: 10000; - border: 1px solid var(--inactive--color); + border: 1px solid var(--psp-inactive--color); border-radius: 5px; font-size: 10px; font-weight: normal; &:hover { - color: var(--plugin--background, inherit); - background-color: var(--icon--color); + color: var(--psp--background-color, inherit); + background-color: var(--psp--color); cursor: pointer; } - &:hover:before { - background-color: var(--plugin--background); + &:hover .icon { + background-color: var(--psp--background-color); } - &:before { + .icon { display: inline-block; - height: 20px; - min-height: 20px; - width: 20px; - min-width: 20px; - content: ""; mask-size: cover; -webkit-mask-size: cover; background-repeat: no-repeat; - background-color: var(--icon--color); - mask-image: var(--close-icon--mask-image); - -webkit-mask-image: var(--close-icon--mask-image); + background-color: var(--psp--color); + mask-image: var(--psp-icon--close--mask-image); + -webkit-mask-image: var(--psp-icon--close--mask-image); + + &:before { + content: var(--psp-icon--close--mask-image); + visibility: hidden; + } } } #settings_button { - background-color: var(--plugin--background); + background-color: var(--psp--background-color); padding: 0; overflow: hidden; display: flex; align-items: center; justify-content: center; z-index: 3; - border: 1px solid var(--inactive--color); + border: 1px solid var(--psp-inactive--color); border-radius: 5px; font-size: 10px; font-weight: normal; &:hover { - color: var(--plugin--background, inherit); - background-color: var(--icon--color); + color: var(--psp--background-color, inherit); + background-color: var(--psp--color); cursor: pointer; } - &:hover:before { - background-color: var(--plugin--background); + &:hover .icon { + background-color: var(--psp--background-color); } - &:before { + .icon { display: inline-block; - height: 20px; - min-height: 20px; - width: 20px; - min-width: 20px; - content: ""; mask-size: cover; -webkit-mask-size: cover; background-repeat: no-repeat; - background-color: var(--icon--color); - mask-image: var(--drawer-tab-inverted-icon--mask-image); - -webkit-mask-image: var(--drawer-tab-inverted-icon--mask-image); + background-color: var(--psp--color); + mask-image: var(--psp-icon--drawer-tab-inverted--mask-image); + -webkit-mask-image: var( + --psp-icon--drawer-tab-inverted--mask-image + ); + + &:before { + content: var(--psp-icon--drawer-tab-inverted--mask-image); + visibility: hidden; + } } } @@ -373,14 +385,14 @@ .sidebar_header { min-height: var( - --plugin-selector--height, - var(--status-bar--height, 48px) + --psp-plugin-selector--height, + var(--psp-status-bar--height, 48px) ); overflow: hidden; display: flex; flex-direction: column; justify-content: center; - border-bottom: 1px solid var(--inactive--color, #6e6e6e); + border-bottom: 1px solid var(--psp-inactive--color, #6e6e6e); } .sidebar_header_title { @@ -394,7 +406,7 @@ .sidebar_border { height: 2px; width: 100%; - background-color: var(--inactive--color, #6e6e6e); + background-color: var(--psp-inactive--color, #6e6e6e); margin-top: 1px; flex-shrink: 0; flex-grow: 0; diff --git a/rust/perspective-viewer/src/less/column-dropdown.less b/rust/perspective-viewer/src/less/column-dropdown.less deleted file mode 100644 index 68da85dcc8..0000000000 --- a/rust/perspective-viewer/src/less/column-dropdown.less +++ /dev/null @@ -1,95 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import "dom/scrollbar.less"; - -@mixin icon { - background-repeat: no-repeat; - background-color: var(--icon--color); - content: ""; - display: inline-block; - -webkit-mask-size: cover; - mask-size: cover; -} - -:host { - box-sizing: border-box; - position: fixed; - z-index: 10000; - outline: none; - font-size: 0.75em; - border: inherit; - // box-shadow: 0 2px 4px 0 rgb(0 0 0 / 10%); - user-select: none; - background-color: var(--icon--color, #fff) !important; - color: var(--plugin--background, #333) !important; - // padding: 6px 8px; - border: 1px solid var(--icon--color) !important; - max-width: 300px; - overflow: hidden; - max-height: 600px; - overflow: auto; - @include scrollbar; - - display: flex; - flex-direction: column; - - .selected { - background-color: var(--plugin--background) !important; - color: var(--icon--color) !important; - } - - span { - cursor: pointer; - padding: 4px 5px; - } - - .no-results { - padding: 3px 24px 6px 11px; - color: var(--error--color); - font-size: 8px; - } - - .no-results:before { - content: var(--no-results--content, "Invalid Column"); - } - - #add-expression { - &:before { - @include icon; - width: 14px; - height: 12px; - margin-right: 5px; - -webkit-mask-image: var(--add-expression-icon--mask-image); - mask-image: var(--add-expression-icon--mask-image); - } - } -} - -:host(:hover) { - .selected { - background-color: var(--icon--color, #fff) !important; - color: var(--plugin--background, #333) !important; - } - - span:hover, - span.selected:hover { - background-color: var(--plugin--background) !important; - color: var(--icon--color) !important; - } -} - -:host(.no-results) { - overflow: hidden; - background-color: transparent !important; - border: none !important; -} diff --git a/rust/perspective-viewer/src/less/dom/checkbox.less b/rust/perspective-viewer/src/less/dom/checkbox.less deleted file mode 100644 index b76eb17012..0000000000 --- a/rust/perspective-viewer/src/less/dom/checkbox.less +++ /dev/null @@ -1,100 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@mixin icon { - background-repeat: no-repeat; - background-color: var(--icon--color); - content: ""; - display: inline-block; - -webkit-mask-size: cover; - mask-size: cover; -} - -:host { - input[type="checkbox"].alternate { - appearance: none; - height: 14px; - width: 14px; - padding: 0px; - cursor: pointer; - outline: none; - margin: 0 5px; - - &:before { - @include icon; - width: 14px; - height: 14px; - font-family: var(--button--font-family, inherit); - background-color: var(--icon--color, #ccc); - -webkit-mask-image: var(--inactive-column-selector--content, none); - mask-image: var(--inactive-column-selector--content, none); - } - - &:hover { - border-radius: 2px; - outline: 1px solid var(--icon--color); - } - - &:checked:hover { - background-color: var(--icon--color, #ccc); - &:before { - background-color: var(--plugin--background, #ccc); - } - } - - &:checked:before { - -webkit-mask-image: var(--active-column-selector--content, none); - mask-image: var(--active-column-selector--content, none); - } - } - - input[type="checkbox"] { - float: left; - appearance: none; - height: 14px; - width: 14px; - padding: 0px; - cursor: pointer; - outline: none; - margin: 0 5px 0 0; - - &:checked:before { - -webkit-mask-image: var(--column-checkbox-on--mask-image); - mask-image: var(--column-checkbox-on--mask-image); - } - - &[disabled]:before { - opacity: 0.2s; - } - - &:before { - @include icon; - height: 13px; - width: 13px; - -webkit-mask-image: var(--column-checkbox-off--mask-image); - mask-image: var(--column-checkbox-off--mask-image); - } - - &:hover { - background-color: transparent; - } - - &:hover:before { - -webkit-mask-image: var(--column-checkbox-hover--mask-image); - mask-image: var(--column-checkbox-hover--mask-image); - } - } - - input[type="checkbox"]:not(:disabled) { - cursor: pointer; - } -} diff --git a/rust/perspective-viewer/src/less/dom/scrollbar.less b/rust/perspective-viewer/src/less/dom/scrollbar.less deleted file mode 100644 index d74d4bd1b4..0000000000 --- a/rust/perspective-viewer/src/less/dom/scrollbar.less +++ /dev/null @@ -1,35 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@mixin scrollbar { - &:hover { - --fix: ; - } - - &::-webkit-scrollbar-thumb { - border-radius: 2px; - border: 2px solid transparent; - box-shadow: inset 0px 0px 0 4px var(--inactive--color); - } - - &:hover::-webkit-scrollbar-thumb { - border: 1px solid transparent; - box-shadow: inset 0px 0px 0 4px var(--inactive--color); - } - - &::-webkit-scrollbar, - &::-webkit-scrollbar-corner { - background-color: transparent; - width: 6px; - height: 6px; - } -} diff --git a/rust/perspective-viewer/src/less/plugin-selector.less b/rust/perspective-viewer/src/less/plugin-selector.less deleted file mode 100644 index 6eb8234387..0000000000 --- a/rust/perspective-viewer/src/less/plugin-selector.less +++ /dev/null @@ -1,183 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import "dom/scrollbar.less"; - -:host { - #settings_panel { - #plugin_selector_container.open ~ * { - opacity: 0; - } - - #plugin_selector_container { - min-height: var( - --plugin-selector--height, - var(--status-bar--height, 48px) - ); - display: flex; - white-space: nowrap; - flex-direction: column; - flex: 0 0 auto; - - // Overflow the padding bounds of the container - // TODO these bounds exist to protext the resizer and scrollbar (left & - // right resp) but we really should find a way to remove it and delegate - // to sub-containers. - margin: 0 0px 0 -9px; - - #plugin_selector_border { - height: 2px; - min-height: 2px; - width: 100%; - background-color: var(--inactive--color, #6e6e6e); - margin-top: 2px; - } - - .plugin-selector-options { - overflow-y: auto; - @include scrollbar; - } - - &.open { - position: absolute; - margin: 0; - top: 0; - left: 0; - right: 0; - bottom: 0; - - // This element is first in the container but visually "overlaps" - // when expanded - z-index: 3; - color: var(--icon--color, #042121); - // background: var(--plugin--background); - - .plugin-select-item { - padding-left: 8px; - } - } - - .plugin-select-item-name { - padding-left: 10px; - font-size: 1.33333em; - } - - .plugin-select-item-name:before { - // This value is set in a `style` tag from Yew! - content: var(--default-column-title); - } - - .plugin-select-item { - // width: 48px; - padding-left: 9px; - height: var( - --plugin-selector--height, - var(--status-bar--height, 48px) - ); - min-height: var( - --plugin-selector--height, - var(--status-bar--height, 48px) - ); - display: flex; - align-items: center; - border-bottom: 1px solid transparent; - box-shadow: 0px 1px var(--inactive--color, #6e6e6e); - cursor: pointer; - } - - // Hadn't seen this technique before, makes sizing/positioning these - // trivial. There's some indication this doesn't work on non-chrome - // https://stackoverflow.com/questions/36259410/how-to-set-size-of-svg-image-in-before-pseudo-class - // https://stackoverflow.com/questions/21509982/change-svg-fill-color-in-before-or-after-css - .plugin-select-item:before { - content: ""; - display: inline-block; - height: 35px; - width: 40px; - -webkit-mask-size: cover; - mask-size: cover; - background-repeat: no-repeat; - background-color: var(--icon--color); - } - - .plugin-select-item:hover { - background-color: var(--icon--color, #042121); - color: var(--plugin--background, #fdfffd); - } - - .plugin-select-item:hover:before { - background-color: var(--plugin--background, #fdfffd); - } - - .plugin-select-item[data-plugin="Candlestick"]:before { - // mask-image: var(--plugin-selector-candlestick--content); - -webkit-mask-image: var(--plugin-selector-candlestick--content); - } - - .plugin-select-item[data-plugin="Heatmap"]:before { - -webkit-mask-image: var(--plugin-selector-heatmap--content); - } - - .plugin-select-item[data-plugin="Map Scatter"]:before { - -webkit-mask-image: var(--plugin-selector-map-scatter--content); - } - - .plugin-select-item[data-plugin="OHLC"]:before { - -webkit-mask-image: var(--plugin-selector-ohlc--content); - } - - .plugin-select-item[data-plugin="Sunburst"]:before { - -webkit-mask-image: var(--plugin-selector-sunburst--content); - } - - .plugin-select-item[data-plugin="Treemap"]:before { - -webkit-mask-image: var(--plugin-selector-treemap--content); - } - - .plugin-select-item[data-plugin="X Bar"]:before { - -webkit-mask-image: var(--plugin-selector-x-bar--content); - } - - .plugin-select-item[data-plugin="X/Y Line"]:before { - -webkit-mask-image: var(--plugin-selector-x-y-line--content); - } - - .plugin-select-item[data-plugin="X/Y Scatter"]:before { - -webkit-mask-image: var(--plugin-selector-x-y-scatter--content); - } - - .plugin-select-item[data-plugin="Y Area"]:before { - -webkit-mask-image: var(--plugin-selector-y-area--content); - } - - .plugin-select-item[data-plugin="Y Bar"]:before { - -webkit-mask-image: var(--plugin-selector-y-bar--content); - } - - .plugin-select-item[data-plugin="Y Line"]:before { - -webkit-mask-image: var(--plugin-selector-y-line--content); - } - - .plugin-select-item[data-plugin="Y Scatter"]:before { - -webkit-mask-image: var(--plugin-selector-y-scatter--content); - } - - .plugin-select-item[data-plugin="Datagrid"]:before { - -webkit-mask-image: var(--plugin-selector-datagrid--content); - } - } - - #plugin_selector { - flex-grow: 1; - } - } -} diff --git a/rust/perspective-viewer/src/less/type-icon.less b/rust/perspective-viewer/src/less/type-icon.less deleted file mode 100644 index c74014b970..0000000000 --- a/rust/perspective-viewer/src/less/type-icon.less +++ /dev/null @@ -1,68 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -:host #selected-columns .type-icon, -:host #sub-columns .type-icon { - position: absolute; - left: 15px; -} - -:host .type-icon { - height: 13px; - width: 13px; - background-repeat: no-repeat; - background-color: var(--icon--color); - content: ""; - display: inline-block; - -webkit-mask-size: cover; - mask-size: cover; - flex-shrink: 0; - - &.none { - content: none; - } - - &.integer { - -webkit-mask-image: var(--column-type-integer--mask-image); - mask-image: var(--column-type-integer--mask-image); - } - - &.float { - -webkit-mask-image: var(--column-type-float--mask-image); - mask-image: var(--column-type-float--mask-image); - } - - &.string { - -webkit-mask-image: var(--column-type-string--mask-image); - mask-image: var(--column-type-string--mask-image); - } - - &.boolean { - -webkit-mask-image: var(--column-type-boolean--mask-image); - mask-image: var(--column-type-boolean--mask-image); - } - - &.date { - -webkit-mask-image: var(--column-type-date--mask-image); - mask-image: var(--column-type-date--mask-image); - } - - &.datetime { - -webkit-mask-image: var(--column-type-datetime--mask-image); - mask-image: var(--column-type-datetime--mask-image); - } - - &.expression { - -webkit-mask-image: var(--add-expression-icon--mask-image); - mask-image: var(--add-expression-icon--mask-image); - } -} diff --git a/rust/perspective-viewer/src/svg/bg-pattern.png b/rust/perspective-viewer/src/svg/bg-pattern.png index 88ce031de76550c44ffbdfc86e94d54f7425ebb3..5f0a684f121fc197cdffdb90d9cf72924cc63338 100644 GIT binary patch delta 513 zcmV+c0{;E6Eu#b>iBL{Q4GJ0x0000DNk~Le00002000042nGNE0Hp8kIg$hwe<+cC zk-tmBKpe$iTcsiu5sQc@WT;MdQBlWQg(6f4wL+^7CYSz#CJjl7i=*ILaPY@s)xpJC zR|i)?5c~n+A0SSOE>hz6l0u6Z503lr?%w0>9pJB*nQC^#09CV$R3a{9va3Sy6#K5$n5oZ+ViKO?>mEM7-bHzqfA_gRM~{*-8Q>F$V@x+J;tk^IO-tvzPaI}NNg+Nb z9yjQM#E)E;U4G+SaM;f?!$vwaPaGx|3T-U6F)JD>@f2}HQ8miNFNQM2vuW7}?=0D))VN^AKmbzt_B^jb@c909%Cz{Pb- zllOqj9boWDmkh~~0yO>kJn()--;@RVZ-MSLx3}g#P9K0Yb(OpU4i15_0%fmzyt}Kt zw|~zx`}+aiw{p>riUVB$5dZ)NVoOIv00000008+zyML1o79K(B1056@EG#dnfdBvi zA4x<(R0!8&WME*>`2YVu0}}%jF#Z4kpMjB)5g`Hqk4^?Hr2d-^00000NkvXXu0mjf D)bH2^ literal 5809 zcmeHLc~leE7Y=F#0V|@l3JPNcMP-tiWU@*?1cX2%6mX*(!^|W^NG2u&1OycdEmiBT zNQ)JViYV1$t%_7!uxQ0<6}5uPLEHc>SU{zM*q4Bat?jR#)BgT4IWw7g@4oNe`^|Un z%b8C?ruh%FcCco#SOet&zME|-qsp1;GO=qO!{*!-mlIb{-_^3+V_Aiuv?>42Yu;I3UXXd-{WWWT zsddhD?+R^t=%qIs9%tO$J3q;;dPx0}fS>B#aid4CY3W0!>Nyn|IkmsoH_W}z-f1XM zb75@nup{ja*PnPEIiOwV@AoK14e>#Z?H?8!r?%E~b~xtc7hPB~ zeW-I}+{MNF-KlSp9Z`!UaqRSAxg(bQ47l&XKb2mn4ajKxY`fS|HLS+rZn5Fo;bYqz zMd@`np--YSu`}nhvB0%^>V8XXUcPm9$=I(oHYGEQ%a6oV-*xz^%3j&HWaAM#;&OAd zeCJi9JbCE4_x2}c?DO4HWksy~-1VbWt7V#P@Q2*n*U{n$R@F?RCwoNsg|IIjo?INj zq|UI#&fVr8FQP4Gr56l5{B;^@YmtLx{M#Gd3Nw7<9U`)e(T&m z*Jg(aW9!DY68ydcDsuIHz=yGw#e3tE~sw-q`%gOm+!BbTo@2Y~5 z&yf?uJGRK08U}7p9^JR|=Vh56OiCt@lpFUH3TH{z)u*Fd_muVB@JY+V&V!FWc-!*Z zTLr6GEQ<`ak57o)$LDEzgQCt!Ss@E33mKXb9QG~y4a-THVsh*L-Oz;Et<&A6WQ0uI z-4NM))_J4cXJu`z+rD8VJ7yP3_lfT`)J(8S^MZD8rY+)x)~3ie`Yn0WsphhxDNf`@S`|ZlMo^&T>tPH*P)y{bhoA)nnaeq?kwSDG~ z@7P*p9_61zG_`TH1&T{G-vy7vU1z&`j$4||c-Q*xnCNtHE@!{{y_1>Q^3#L;Grx~= zoTxb&xMiw`eB^Y&`sR$nV-s$}ry`0^eD?4L*Y@`Po31-59j4gZ%u4S!*m~Q=$s>fd zyYFn86;PRYmgXN=#8_gfMZ6520!{-QqBWI1!JKBqqGs0WK> z_kkMp+gXaYqy(+u;3OSIaf})r=*KLUhnG=@6EPG6MNulXR>p2BImm|8q>MdNpg1Zp(mBnP~WND5a3S6j%FC0l*>&>NZ=&!IkaBIMI{mm z7vXVvJQ!HOhD0rc8)2;(rDewSh9HTa^}0BH ztT`Q$;8L-a2ACRvSM)iT{&Gb~&k7R-Dz!#uUIoa0&QcdmGqfR^*7cY_7hun{IkDa$ zF>2*AmY-W=n)#DC@cUv9Pf0Ul11p6>>Pr)Gro807PqjeOgqoE01S3^OMd7$eAciGk zTm(yS3|t{19!wA-oQG2g58EoZ!P^ag-9Kcu{z@&N9E+yc}FhSn#Vhq~H87&W)+uIn~dZLWU^GFP$`C%O_Q%xRM5 zNC8^cr1}L?`^Wm|K{3!uCIQz|-YUSajO}e|v{1;?QiXVYjsS84now&^#XJ7_5E7y( z(=-1|;<^7MH(DD{=^5$|+39dS4w^F1m5i;_(;BEt#wxWEV(9K0lcxWP3j-eiM|dI{ z*QzM6V|2Huzav$GVi=zigX$Mid>G@S6fEWoC|E)uJdzNI#1f(4d0zfCQePy$|3k(U zPAUmXsDx1w3fc@p@<8r535!rZiD7t@2opv9ZN~m!6EGK-Sv#Pg{FQL{Fv5coG#o*t z0!)gEVMJgmvF;o_xTdY~X^nVr|5Qa?2EF!DAh@nEut$R}pWCzNcPkO-{=fWmSMPu6 z0)k#Sc`1Hh(e;Y1mtx?hj9;ni6j1adZob%6H? z{iA~XeOXUT-`oTFtH8(rUBGMui#5#EbXdqkUG9NFOGd8nv%KBMqQB67-r@0fV2F_W zdWR3MB%-75aNcS^eaN<~E_sV;&E{2`s!Lji=d#wHPFL7vpI-N1L+XgJqt9Pm|FCcu zW6#@Am35$`=9^y{SJ{Hk22H|-)pMFo`P>>3{~_A9Y(bh9QAV~cSeu$U_;W|r;Od~c U+js300e399-!$JHQzFxT2O92pqW}N^ diff --git a/rust/perspective-viewer/src/svg/close-icon.svg b/rust/perspective-viewer/src/svg/close-icon.svg index 054d536d27..d488da7054 100644 --- a/rust/perspective-viewer/src/svg/close-icon.svg +++ b/rust/perspective-viewer/src/svg/close-icon.svg @@ -1,4 +1,4 @@ - + + diff --git a/rust/perspective-viewer/src/svg/mega-menu-icons-candlestick.svg b/rust/perspective-viewer/src/svg/mega-menu-icons-candlestick.svg index 4c911a6299..1dd96867cf 100644 --- a/rust/perspective-viewer/src/svg/mega-menu-icons-candlestick.svg +++ b/rust/perspective-viewer/src/svg/mega-menu-icons-candlestick.svg @@ -1,7 +1,7 @@ + viewBox="0 0 80 70" style="enable-background:new 0 0 80 70;" xml:space="preserve" width="40" height="35"> diff --git a/rust/perspective-viewer/src/svg/mega-menu-icons-datagrid.svg b/rust/perspective-viewer/src/svg/mega-menu-icons-datagrid.svg index 14dec9e847..2f41c0d788 100644 --- a/rust/perspective-viewer/src/svg/mega-menu-icons-datagrid.svg +++ b/rust/perspective-viewer/src/svg/mega-menu-icons-datagrid.svg @@ -1,7 +1,6 @@ - + viewBox="0 0 80 70" style="enable-background:new 0 0 80 70;" xml:space="preserve" width="40" height="35"> diff --git a/rust/perspective-viewer/src/svg/mega-menu-icons-heatmap.svg b/rust/perspective-viewer/src/svg/mega-menu-icons-heatmap.svg index ef0079b60e..5b8c0c0d33 100644 --- a/rust/perspective-viewer/src/svg/mega-menu-icons-heatmap.svg +++ b/rust/perspective-viewer/src/svg/mega-menu-icons-heatmap.svg @@ -1,7 +1,7 @@ + viewBox="0 0 80 70" style="enable-background:new 0 0 80 70;" xml:space="preserve" width="40" height="35"> diff --git a/rust/perspective-viewer/src/svg/mega-menu-icons-map-scatter.svg b/rust/perspective-viewer/src/svg/mega-menu-icons-map-scatter.svg index 54ff43dd6c..6bf2f98bc4 100644 --- a/rust/perspective-viewer/src/svg/mega-menu-icons-map-scatter.svg +++ b/rust/perspective-viewer/src/svg/mega-menu-icons-map-scatter.svg @@ -1,7 +1,7 @@ + viewBox="0 0 80 70" style="enable-background:new 0 0 80 70;" xml:space="preserve" width="40" height="35"> diff --git a/rust/perspective-viewer/src/svg/mega-menu-icons-ohlc.svg b/rust/perspective-viewer/src/svg/mega-menu-icons-ohlc.svg index 52ad73ade9..8bd4bcab30 100644 --- a/rust/perspective-viewer/src/svg/mega-menu-icons-ohlc.svg +++ b/rust/perspective-viewer/src/svg/mega-menu-icons-ohlc.svg @@ -1,7 +1,7 @@ + viewBox="0 0 80 70" style="enable-background:new 0 0 80 70;" xml:space="preserve" width="40" height="35"> diff --git a/rust/perspective-viewer/src/svg/mega-menu-icons-sunburst.svg b/rust/perspective-viewer/src/svg/mega-menu-icons-sunburst.svg index 5d944767d0..dbd5775e1a 100644 --- a/rust/perspective-viewer/src/svg/mega-menu-icons-sunburst.svg +++ b/rust/perspective-viewer/src/svg/mega-menu-icons-sunburst.svg @@ -1,7 +1,7 @@ + viewBox="0 0 80 70" style="enable-background:new 0 0 80 70;" xml:space="preserve" width="40" height="35"> diff --git a/rust/perspective-viewer/src/svg/mega-menu-icons-treemap.svg b/rust/perspective-viewer/src/svg/mega-menu-icons-treemap.svg index 23290c66ac..a52469d27b 100644 --- a/rust/perspective-viewer/src/svg/mega-menu-icons-treemap.svg +++ b/rust/perspective-viewer/src/svg/mega-menu-icons-treemap.svg @@ -1,7 +1,7 @@ + viewBox="0 0 80 70" style="enable-background:new 0 0 80 70;" xml:space="preserve" width="40" height="35"> diff --git a/rust/perspective-viewer/src/svg/mega-menu-icons-x-bar.svg b/rust/perspective-viewer/src/svg/mega-menu-icons-x-bar.svg index 21f0b4ad53..63d6e93f18 100644 --- a/rust/perspective-viewer/src/svg/mega-menu-icons-x-bar.svg +++ b/rust/perspective-viewer/src/svg/mega-menu-icons-x-bar.svg @@ -1,7 +1,7 @@ + viewBox="0 0 80 70" style="enable-background:new 0 0 80 70;" xml:space="preserve" width="40" height="35"> diff --git a/rust/perspective-viewer/src/svg/mega-menu-icons-x-y-line.svg b/rust/perspective-viewer/src/svg/mega-menu-icons-x-y-line.svg index 191fe2ada8..56a32098ed 100644 --- a/rust/perspective-viewer/src/svg/mega-menu-icons-x-y-line.svg +++ b/rust/perspective-viewer/src/svg/mega-menu-icons-x-y-line.svg @@ -1,7 +1,7 @@ + viewBox="0 0 80 70" style="enable-background:new 0 0 80 70;" xml:space="preserve" width="40" height="35"> diff --git a/rust/perspective-viewer/src/svg/mega-menu-icons-x-y-scatter.svg b/rust/perspective-viewer/src/svg/mega-menu-icons-x-y-scatter.svg index 8dc42fff03..8ffcfa1280 100644 --- a/rust/perspective-viewer/src/svg/mega-menu-icons-x-y-scatter.svg +++ b/rust/perspective-viewer/src/svg/mega-menu-icons-x-y-scatter.svg @@ -1,7 +1,7 @@ + viewBox="0 0 80 70" style="enable-background:new 0 0 80 70;" xml:space="preserve" width="40" height="35"> diff --git a/rust/perspective-viewer/src/svg/mega-menu-icons-y-area.svg b/rust/perspective-viewer/src/svg/mega-menu-icons-y-area.svg index eda9a20e18..7bf2b39f2b 100644 --- a/rust/perspective-viewer/src/svg/mega-menu-icons-y-area.svg +++ b/rust/perspective-viewer/src/svg/mega-menu-icons-y-area.svg @@ -1,7 +1,7 @@ + viewBox="0 0 80 70" style="enable-background:new 0 0 80 70;" xml:space="preserve" width="40" height="35"> diff --git a/rust/perspective-viewer/src/svg/mega-menu-icons-y-bar.svg b/rust/perspective-viewer/src/svg/mega-menu-icons-y-bar.svg index f78b3218fc..de236421a9 100644 --- a/rust/perspective-viewer/src/svg/mega-menu-icons-y-bar.svg +++ b/rust/perspective-viewer/src/svg/mega-menu-icons-y-bar.svg @@ -1,7 +1,7 @@ + viewBox="0 0 80 70" style="enable-background:new 0 0 80 70;" xml:space="preserve" width="40" height="35"> diff --git a/rust/perspective-viewer/src/svg/mega-menu-icons-y-line.svg b/rust/perspective-viewer/src/svg/mega-menu-icons-y-line.svg index b63f9db1cc..16784d2b6e 100644 --- a/rust/perspective-viewer/src/svg/mega-menu-icons-y-line.svg +++ b/rust/perspective-viewer/src/svg/mega-menu-icons-y-line.svg @@ -1,7 +1,7 @@ + viewBox="0 0 80 70" style="enable-background:new 0 0 80 70;" xml:space="preserve" width="40" height="35"> diff --git a/rust/perspective-viewer/src/svg/mega-menu-icons-y-scatter.svg b/rust/perspective-viewer/src/svg/mega-menu-icons-y-scatter.svg index 159faa373a..3f54ea4d90 100644 --- a/rust/perspective-viewer/src/svg/mega-menu-icons-y-scatter.svg +++ b/rust/perspective-viewer/src/svg/mega-menu-icons-y-scatter.svg @@ -1,7 +1,7 @@ + viewBox="0 0 80 70" style="enable-background:new 0 0 80 70;" xml:space="preserve" width="40" height="35"> diff --git a/rust/perspective-viewer/src/svg/radio-hover.svg b/rust/perspective-viewer/src/svg/radio-hover.svg index 64a663e11f..402e1a3b14 100644 --- a/rust/perspective-viewer/src/svg/radio-hover.svg +++ b/rust/perspective-viewer/src/svg/radio-hover.svg @@ -1,4 +1,4 @@ - + diff --git a/rust/perspective-viewer/src/svg/radio-off.svg b/rust/perspective-viewer/src/svg/radio-off.svg index 41f10d50a6..aff23bc120 100644 --- a/rust/perspective-viewer/src/svg/radio-off.svg +++ b/rust/perspective-viewer/src/svg/radio-off.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/rust/perspective-viewer/src/svg/radio-on.svg b/rust/perspective-viewer/src/svg/radio-on.svg index a413696cef..212dd6aa6b 100644 --- a/rust/perspective-viewer/src/svg/radio-on.svg +++ b/rust/perspective-viewer/src/svg/radio-on.svg @@ -1,4 +1,4 @@ - + diff --git a/rust/perspective-viewer/src/themes/botanical.css b/rust/perspective-viewer/src/themes/botanical.css new file mode 100644 index 0000000000..e437fad245 --- /dev/null +++ b/rust/perspective-viewer/src/themes/botanical.css @@ -0,0 +1,157 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +@import "./defaults.css"; + +/* Register theme for auto-detection */ +perspective-viewer, +perspective-viewer[theme="Botanical"] { + --psp-theme-name: "Botanical"; +} + +perspective-viewer[theme="Botanical"] { + /* perspective-viewer-botanical--colors */ + background-color: #1a2e1a; + color: #e0ead8; + --psp--color: #e0ead8; + --psp-active--color: #5a9e4b; + --psp-error--color: #e8836a; + --psp-inactive--color: #526b4a; + --psp-inactive--border-color: #3d5c3d; + --psp--background-color: #1a2e1a; + --psp-active--background: rgba(90, 158, 75, 0.5); + --psp-expression--operator--color: #b8c9ad; + --psp-expression--function--color: #7bc96f; + --psp-expression--psp-error--color: rgb(232, 131, 106); + --psp-calendar--filter: invert(1); + --psp-warning--color: #1a2e1a; + --psp-warning--background: var(--psp--color); + + --psp-icon--select-arrow--mask-image: var( + --psp-icon--select-arrow-light--mask-image + ); + + --psp-icon--select-arrow-hover--mask-image: var( + --psp-icon--select-arrow-dark--mask-image + ); + + /* Syntax */ + --psp-code-editor--symbol--color: #e0ead8; + --psp-code-editor--literal--color: #a8d8a0; + --psp-code-editor--operator--color: rgb(206, 176, 104); + --psp-code-editor--comment--color: rgb(120, 160, 100); + --psp-code-editor--column--color: #c9a0d8; + + /* perspective-viewer-botanical--datagrid */ + --psp-datagrid--pos-cell--color: #7bc96f; + --psp-datagrid--neg-cell--color: #ebac21; + + /* perspective-viewer-botanical--d3fc */ + --psp-d3fc--legend--color: #b8c9ad; + --psp-d3fc--treemap--labels: #e0ead8; + --psp-d3fc--treemap--hover-highlight: #e0ead8; + --psp-d3fc--tooltip--color: #e0ead8; + --psp-d3fc--axis-ticks--color: #b8c9ad; + --psp-d3fc--axis-lines--color: #526b4a; + --psp-d3fc--gridline--color: #2a4228; + --psp-d3fc--tooltip--background: rgba(30, 52, 32, 1); + --psp-d3fc--tooltip--border-color: #1a2e1a; + --psp-d3fc--legend--background: var(--psp--background-color); + + --psp-d3fc--series--color: rgb(90, 158, 75); + --psp-d3fc--series-1--color: rgb(90, 158, 75); + --psp-d3fc--series-2--color: rgb(206, 176, 104); + --psp-d3fc--series-3--color: rgb(160, 110, 180); + --psp-d3fc--series-4--color: rgb(80, 170, 150); + --psp-d3fc--series-5--color: rgb(140, 170, 90); + --psp-d3fc--series-6--color: rgb(200, 120, 140); + --psp-d3fc--series-7--color: rgb(100, 150, 190); + --psp-d3fc--series-8--color: rgb(210, 140, 80); + --psp-d3fc--series-9--color: rgb(130, 120, 190); + --psp-d3fc--series-10--color: rgb(170, 200, 110); + + --psp-d3fc--full-gradient--background: linear-gradient( + #e8836a 0%, + #1a2e1a 50%, + #5a9e4b 100% + ); + + --psp-d3fc--pos-gradient--background: linear-gradient( + #1a2e1a 0%, + #5a9e4b 100% + ); + --psp-d3fc--neg-gradient--background: linear-gradient( + #e8836a 0%, + #1a2e1a 100% + ); + + /* perspective-viewer-botanical--openlayers */ + --psp-openlayers--tile-url: "http://{a-c}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png"; + --psp-openlayers--attribution--filter: invert(1) hue-rotate(180deg); + --psp-openlayers--element--background: #1e3420; + --psp-openlayers--category-1--color: rgb(90, 158, 75); + --psp-openlayers--category-2--color: rgb(206, 176, 104); + --psp-openlayers--category-3--color: rgb(160, 110, 180); + --psp-openlayers--category-4--color: rgb(80, 170, 150); + --psp-openlayers--category-5--color: rgb(140, 170, 90); + --psp-openlayers--category-6--color: rgb(200, 120, 140); + --psp-openlayers--category-7--color: rgb(100, 150, 190); + --psp-openlayers--category-8--color: rgb(210, 140, 80); + --psp-openlayers--category-9--color: rgb(130, 120, 190); + --psp-openlayers--category-10--color: rgb(170, 200, 110); + --psp-openlayers--gradient--background: linear-gradient( + #e8836a 0%, + #1a2e1a 50%, + #5a9e4b 100% + ); +} + +perspective-copy-menu[theme="Botanical"], +perspective-export-menu[theme="Botanical"], +perspective-dropdown[theme="Botanical"], +perspective-date-column-style[theme="Botanical"], +perspective-datetime-column-style[theme="Botanical"], +perspective-number-column-style[theme="Botanical"], +perspective-string-column-style[theme="Botanical"] { + /* perspective-viewer-botanical--colors */ + background-color: #1a2e1a; + color: #e0ead8; + --psp--color: #e0ead8; + --psp-active--color: #5a9e4b; + --psp-error--color: #e8836a; + --psp-inactive--color: #526b4a; + --psp-inactive--border-color: #3d5c3d; + --psp--background-color: #1a2e1a; + --psp-active--background: rgba(90, 158, 75, 0.5); + --psp-expression--operator--color: #b8c9ad; + --psp-expression--function--color: #7bc96f; + --psp-expression--psp-error--color: rgb(232, 131, 106); + --psp-calendar--filter: invert(1); + --psp-warning--color: #1a2e1a; + --psp-warning--background: var(--psp--color); + + --psp-icon--select-arrow--mask-image: var( + --psp-icon--select-arrow-light--mask-image + ); + + --psp-icon--select-arrow-hover--mask-image: var( + --psp-icon--select-arrow-dark--mask-image + ); + + --psp-code-editor--symbol--color: #e0ead8; + --psp-code-editor--literal--color: #a8d8a0; + --psp-code-editor--operator--color: rgb(206, 176, 104); + --psp-code-editor--comment--color: rgb(120, 160, 100); + --psp-code-editor--column--color: #c9a0d8; + + border: 1px solid #3d5c3d; +} diff --git a/rust/perspective-viewer/src/themes/botanical.less b/rust/perspective-viewer/src/themes/botanical.less deleted file mode 100644 index 74b986d1a7..0000000000 --- a/rust/perspective-viewer/src/themes/botanical.less +++ /dev/null @@ -1,142 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import "icons.less"; -@import "intl.less"; - -@import url("ref://pro.less"); - -// Register theme for auto-detection -perspective-viewer, -perspective-viewer[theme="Botanical"] { - --theme-name: "Botanical"; -} - -perspective-viewer[theme="Botanical"] { - @include perspective-viewer-botanical; -} - -perspective-copy-menu[theme="Botanical"], -perspective-export-menu[theme="Botanical"], -perspective-dropdown[theme="Botanical"], -perspective-date-column-style[theme="Botanical"], -perspective-datetime-column-style[theme="Botanical"], -perspective-number-column-style[theme="Botanical"], -perspective-string-column-style[theme="Botanical"] { - @include perspective-modal-botanical; -} - -@mixin perspective-viewer-botanical { - @include perspective-viewer-pro; - @include perspective-viewer-botanical--colors; - @include perspective-viewer-botanical--datagrid; - @include perspective-viewer-botanical--d3fc; - @include perspective-viewer-botanical--openlayers; -} - -@mixin perspective-modal-botanical { - @include perspective-modal-pro; - @include perspective-viewer-botanical--colors; - - background-color: #1a2e1a; - border: 1px solid #3d5c3d; -} - -@mixin perspective-viewer-botanical--colors { - background-color: #1a2e1a; - color: #e0ead8; - --icon--color: #e0ead8; - --active--color: #5a9e4b; - --error--color: #e8836a; - --inactive--color: #526b4a; - --inactive--border-color: #3d5c3d; - --plugin--background: #1a2e1a; - --modal-target--background: rgba(224, 234, 216, 0.05); - --active--background: rgba(90, 158, 75, 0.5); - --expression--operator-color: #b8c9ad; - --expression--function-color: #7bc96f; - --expression--error-color: rgb(232, 131, 106); - --calendar--filter: invert(1); - --warning--color: #1a2e1a; - --warning--background: var(--icon--color); - - --select-arrow--background-image: var( - --select-arrow-light--background-image - ); - - --select-arrow--hover--background-image: var( - --select-arrow-dark--background-image - ); - - // Syntax - --code-editor-symbol--color: #e0ead8; - --code-editor-literal--color: #a8d8a0; - --code-editor-operator--color: rgb(206, 176, 104); - --code-editor-comment--color: rgb(120, 160, 100); - --code-editor-column--color: #c9a0d8; -} - -@mixin perspective-viewer-botanical--openlayers { - --map-tile-url: "http://{a-c}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png"; - --map-attribution--filter: invert(1) hue-rotate(180deg); - --map-element-background: #1e3420; - --map-category-1: rgb(90, 158, 75); - --map-category-2: rgb(206, 176, 104); - --map-category-3: rgb(160, 110, 180); - --map-category-4: rgb(80, 170, 150); - --map-category-5: rgb(140, 170, 90); - --map-category-6: rgb(200, 120, 140); - --map-category-7: rgb(100, 150, 190); - --map-category-8: rgb(210, 140, 80); - --map-category-9: rgb(130, 120, 190); - --map-category-10: rgb(170, 200, 110); - --map-gradient: linear-gradient(#e8836a 0%, #1a2e1a 50%, #5a9e4b 100%); -} - -@mixin perspective-viewer-botanical--datagrid { - --rt-pos-cell--color: #7bc96f; - --rt-neg-cell--color: #ebac21; -} - -@mixin perspective-viewer-botanical--d3fc { - --d3fc-legend--text: #b8c9ad; - --d3fc-treedata--labels: #e0ead8; - --d3fc-treedata--hover-highlight: #e0ead8; - --d3fc-tooltip--color: #e0ead8; - --d3fc-axis-ticks--color: #b8c9ad; - --d3fc-axis--lines: #526b4a; - --d3fc-gridline--color: #2a4228; - --d3fc-tooltip--background: rgba(30, 52, 32, 1); - --d3fc-tooltip--border-color: #1a2e1a; - --d3fc-legend--background: var(--plugin--background); - - --d3fc-series: rgb(90, 158, 75); - --d3fc-series-1: rgb(90, 158, 75); - --d3fc-series-2: rgb(206, 176, 104); - --d3fc-series-3: rgb(160, 110, 180); - --d3fc-series-4: rgb(80, 170, 150); - --d3fc-series-5: rgb(140, 170, 90); - --d3fc-series-6: rgb(200, 120, 140); - --d3fc-series-7: rgb(100, 150, 190); - --d3fc-series-8: rgb(210, 140, 80); - --d3fc-series-9: rgb(130, 120, 190); - --d3fc-series-10: rgb(170, 200, 110); - - --d3fc-full--gradient: linear-gradient( - #e8836a 0%, - #1a2e1a 50%, - #5a9e4b 100% - ); - - --d3fc-positive--gradient: linear-gradient(#1a2e1a 0%, #5a9e4b 100%); - --d3fc-negative--gradient: linear-gradient(#e8836a 0%, #1a2e1a 100%); -} diff --git a/rust/perspective-viewer/src/themes/defaults.css b/rust/perspective-viewer/src/themes/defaults.css new file mode 100644 index 0000000000..9bab442ea7 --- /dev/null +++ b/rust/perspective-viewer/src/themes/defaults.css @@ -0,0 +1,139 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +@import "./icons.css"; +@import "./intl.css"; + +perspective-viewer, +perspective-workspace, +perspective-copy-menu, +perspective-export-menu, +perspective-dropdown, +perspective-date-column-style, +perspective-datetime-column-style, +perspective-number-column-style, +perspective-string-column-style { + /* Colors */ + --psp-placeholder--background: #8b868045; + + /* Dimensions */ + --psp-button--font-size: 16px; + --psp-config-button--padding: 15px 8px 6px 8px; + --psp-column-selector--font-size: 16px; + --psp-column-type--width: 25px; + --psp-select--padding: 0px; + --psp-top-panel-row--display: inline-flex; + --psp-button--min-width: 33px; + + /* Fonts */ + font-family: + "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas", + "Liberation Mono", monospace; + --psp-interface-monospace--font-family: + "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", "Consolas", + "Liberation Mono", monospace; + + /* Colors (select arrow defaults) */ + --psp-icon--select-arrow--mask-image: var( + --psp-icon--select-arrow-dark--mask-image + ); + --psp-icon--select-arrow-hover--mask-image: var( + --psp-icon--select-arrow-light--mask-image + ); + + /* D3FC */ + --psp-label--d3fc-y1--content: "arrow_upward"; + --psp-label--d3fc-y2--content: "arrow_downward"; + --psp-d3fc--treemap-axis--lines: none; + --psp-d3fc--tooltip--background-color: rgba(155, 155, 155, 0.8); + --psp-d3fc--tooltip--color: #161616; + --psp-d3fc--tooltip--border-color: #fff; + --psp-d3fc--tooltip--box-shadow: 0 2px 4px 0 rgb(0 0 0 / 10%); + --psp-d3fc--gridline--color: #eaedef; + --psp-d3fc--axis-ticks--color: #161616; + --psp-d3fc--axis-lines--color: #c5c9d0; + --psp-d3fc--legend--background: var(--psp--background-color); + --psp-d3fc--series--color: rgba(31, 119, 180, 0.8); + --psp-d3fc--series-1--color: #0366d6; + --psp-d3fc--series-2--color: #ff7f0e; + --psp-d3fc--series-3--color: #2ca02c; + --psp-d3fc--series-4--color: #d62728; + --psp-d3fc--series-5--color: #9467bd; + --psp-d3fc--series-6--color: #8c564b; + --psp-d3fc--series-7--color: #e377c2; + --psp-d3fc--series-8--color: #7f7f7f; + --psp-d3fc--series-9--color: #bcbd22; + --psp-d3fc--series-10--color: #17becf; + --psp-d3fc--full-gradient--background: linear-gradient( + #4d342f 0%, + #e4521b 22.5%, + #feeb65 42.5%, + #f0f0f0 50%, + #dcedc8 57.5%, + #42b3d5 67.5%, + #1a237e 100% + ); + --psp-d3fc--pos-gradient--background: linear-gradient( + #f0f0f0 0%, + #dcedc8 10%, + #42b3d5 50%, + #1a237e 100% + ); + --psp-d3fc--neg-gradient--background: linear-gradient( + #4d342f 0%, + #e4521b 50%, + #feeb65 90%, + #f0f0f0 100% + ); + + /* Datagrid */ + --psp-datagrid--pos-cell--color: #338dcd; + --psp-datagrid--neg-cell--color: #ff471e; + + /* OpenLayers */ + --psp-openlayers--tile-url: "http://{a-c}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png"; + --psp-openlayers--element--background: #fff; + --psp-openlayers--category-1--color: #0366d6; + --psp-openlayers--category-2--color: #ff7f0e; + --psp-openlayers--category-3--color: #2ca02c; + --psp-openlayers--category-4--color: #d62728; + --psp-openlayers--category-5--color: #9467bd; + --psp-openlayers--category-6--color: #8c564b; + --psp-openlayers--category-7--color: #e377c2; + --psp-openlayers--category-8--color: #7f7f7f; + --psp-openlayers--category-9--color: #bcbd22; + --psp-openlayers--category-10--color: #17becf; + --psp-openlayers--gradient--background: linear-gradient( + #4d342f 0%, + #e4521b 22.5%, + #feeb65 42.5%, + #f0f0f0 50%, + #dcedc8 57.5%, + #42b3d5 67.5%, + #1a237e 100% + ); +} + +/* Modal defaults */ +perspective-copy-menu, +perspective-export-menu, +perspective-dropdown, +perspective-date-column-style, +perspective-datetime-column-style, +perspective-number-column-style, +perspective-string-column-style { + background-color: white; + border: 1px solid var(--psp-inactive--color); + border-radius: 0 0 2px 2px; + --psp-label--column-style-pos-color--content: "+"; + --psp-label--column-style-neg-color--content: "-"; +} diff --git a/rust/perspective-viewer/src/themes/dracula.css b/rust/perspective-viewer/src/themes/dracula.css new file mode 100644 index 0000000000..642b170b41 --- /dev/null +++ b/rust/perspective-viewer/src/themes/dracula.css @@ -0,0 +1,233 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +@import "./defaults.css"; + +perspective-viewer, +perspective-viewer[theme="Dracula"] { + --psp-theme-name: "Dracula"; +} + +perspective-viewer[theme="Dracula"] { + /* perspective-viewer-pro-dark--colors (overrides) */ + background-color: #242526; + color: white; + --psp--color: white; + --psp-active--color: #2770a9; + --psp-error--color: #ff9485; + --psp-inactive--color: #61656e; + --psp-inactive--border-color: #4c505b; + --psp--background-color: #242526; + --psp-active--background: rgba(39, 113, 170, 0.5); + --psp-expression--operator--color: #c5c9d0; + --psp-expression--function--color: #22a0ce; + --psp-expression--psp-error--color: rgb(255, 136, 136); + --psp-calendar--filter: invert(1); + --psp-warning--color: #242526; + --psp-warning--background: var(--psp--color); + + --psp-icon--select-arrow--mask-image: var( + --psp-icon--select-arrow-light--mask-image + ); + + --psp-icon--select-arrow-hover--mask-image: var( + --psp-icon--select-arrow-dark--mask-image + ); + + --psp-code-editor--symbol--color: white; + --psp-code-editor--literal--color: #7dc3f0; + --psp-code-editor--operator--color: rgb(23, 166, 123); + --psp-code-editor--comment--color: rgb(204, 120, 48); + --psp-code-editor--column--color: #e18ee1; + + /* perspective-viewer-pro-dark--datagrid */ + --psp-datagrid--pos-cell--color: #7dc3f0; + --psp-datagrid--neg-cell--color: #ff9485; + + /* perspective-viewer-pro-dark--d3fc (overrides) */ + --psp-d3fc--legend--color: #c5c9d0; + --psp-d3fc--treemap--labels: white; + --psp-d3fc--treemap--hover-highlight: white; + --psp-d3fc--tooltip--color: white; + --psp-d3fc--axis-ticks--color: #c5c9d0; + --psp-d3fc--axis-lines--color: #61656e; + --psp-d3fc--gridline--color: #3b3f46; + --psp-d3fc--tooltip--background: rgba(42, 44, 47, 1); + --psp-d3fc--tooltip--border-color: #242526; + --psp-d3fc--legend--background: var(--psp--background-color); + --psp-d3fc--series--color: rgb(71, 120, 194); + --psp-d3fc--series-1--color: rgb(71, 120, 194); + --psp-d3fc--series-2--color: rgb(204, 120, 48); + --psp-d3fc--series-3--color: rgb(158, 84, 192); + --psp-d3fc--series-4--color: rgb(51, 150, 153); + --psp-d3fc--series-5--color: rgb(102, 114, 143); + --psp-d3fc--series-6--color: rgb(211, 103, 189); + --psp-d3fc--series-7--color: rgb(109, 124, 77); + --psp-d3fc--series-8--color: rgb(221, 99, 103); + --psp-d3fc--series-9--color: rgb(120, 104, 206); + --psp-d3fc--series-10--color: rgb(23, 166, 123); + --psp-d3fc--full-gradient--background: linear-gradient( + #dd6367 0%, + #242526 50%, + #3289c8 100% + ); + --psp-d3fc--pos-gradient--background: linear-gradient( + #242526 0%, + #3289c8 100% + ); + --psp-d3fc--neg-gradient--background: linear-gradient( + #dd6367 0%, + #242526 100% + ); + + /* perspective-viewer-pro-dark--openlayers (overrides) */ + --psp-openlayers--tile-url: "http://{a-c}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png"; + --psp-openlayers--attribution--filter: invert(1) hue-rotate(180deg); + --psp-openlayers--element--background: #212c2f; + --psp-openlayers--category-1--color: rgb(71, 120, 194); + --psp-openlayers--category-2--color: rgb(204, 120, 48); + --psp-openlayers--category-3--color: rgb(158, 84, 192); + --psp-openlayers--category-4--color: rgb(51, 150, 153); + --psp-openlayers--category-5--color: rgb(102, 114, 143); + --psp-openlayers--category-6--color: rgb(211, 103, 189); + --psp-openlayers--category-7--color: rgb(109, 124, 77); + --psp-openlayers--category-8--color: rgb(221, 99, 103); + --psp-openlayers--category-9--color: rgb(120, 104, 206); + --psp-openlayers--category-10--color: rgb(23, 166, 123); + --psp-openlayers--gradient--background: linear-gradient( + #dd6367 0%, + #242526 50%, + #3289c8 100% + ); + + /* perspective-viewer-dracula--colors */ + --theme-bg0: #191a22; + --theme-bg1: #282a36; + --theme-bg2: #44475a; + + --theme-gray: #928374; + + --theme-fg0: #f8f8f2; + --theme-fg1: #6272a4; + --theme-fg2: #44475a; + + --theme-red: #ff5555; + --theme-green: #50fa7b; + --theme-yellow: #f1fa8c; + --theme-blue: #8be9fd; + --theme-purple: #bd93f9; + --theme-orange: #ffb86c; + --theme-pink: #ff79c6; + + color: var(--theme-fg0); + background-color: var(--theme-bg0); + --psp--color: var(--theme-fg1); + --psp-inactive--color: var(--theme-fg2); + --psp-inactive--border-color: var(--theme-bg2); + --psp--background-color: var(--theme-bg1); + --psp-status-icon--connected--color: var(--theme-green); + --psp-status-icon--initializing--color: var(--theme-yellow); + --psp-status-icon--psp-error--color: var(--theme-red); + + /* perspective-viewer-dracula--datagrid */ + --psp-datagrid--pos-cell--color: var(--theme-blue); + --psp-datagrid--neg-cell--color: var(--theme-red); + + /* perspective-viewer-dracula--d3fc */ + --psp-d3fc--axis-ticks--color: var(--theme-fg1); + --psp-d3fc--gridline--color: var(--theme-bg2); + --psp-d3fc--series--color: var(--theme-blue); + --psp-d3fc--series-1--color: var(--theme-blue); + --psp-d3fc--series-2--color: var(--theme-red); + --psp-d3fc--series-3--color: var(--theme-green); + --psp-d3fc--series-4--color: var(--theme-yellow); + --psp-d3fc--series-5--color: var(--theme-purple); + --psp-d3fc--series-6--color: var(--theme-pink); + --psp-d3fc--series-7--color: var(--theme-orange); + + --psp-d3fc--neg-gradient--background: linear-gradient( + var(--theme-bg0), + var(--theme-red) + ) !important; + + --psp-d3fc--pos-gradient--background: linear-gradient( + var(--theme-bg0), + var(--theme-blue) + ) !important; + + --psp-d3fc--full-gradient--background: linear-gradient( + var(--theme-red), + var(--theme-bg0), + var(--theme-blue) + ) !important; +} + +perspective-copy-menu[theme="Dracula"], +perspective-export-menu[theme="Dracula"], +perspective-dropdown[theme="Dracula"] { + /* perspective-viewer-pro-dark--colors (overrides) */ + background-color: #242526; + color: white; + --psp--color: white; + --psp-active--color: #2770a9; + --psp-error--color: #ff9485; + --psp-inactive--color: #61656e; + --psp-inactive--border-color: #4c505b; + --psp--background-color: #242526; + --psp-active--background: rgba(39, 113, 170, 0.5); + --psp-expression--operator--color: #c5c9d0; + --psp-expression--function--color: #22a0ce; + --psp-expression--psp-error--color: rgb(255, 136, 136); + --psp-calendar--filter: invert(1); + --psp-warning--color: #242526; + --psp-warning--background: var(--psp--color); + --psp-icon--select-arrow--mask-image: var( + --psp-icon--select-arrow-light--mask-image + ); + --psp-icon--select-arrow-hover--mask-image: var( + --psp-icon--select-arrow-dark--mask-image + ); + --psp-code-editor--symbol--color: white; + --psp-code-editor--literal--color: #7dc3f0; + --psp-code-editor--operator--color: rgb(23, 166, 123); + --psp-code-editor--comment--color: rgb(204, 120, 48); + --psp-code-editor--column--color: #e18ee1; + + border: 1px solid #4c505b; + + /* perspective-viewer-dracula--colors */ + --theme-bg0: #191a22; + --theme-bg1: #282a36; + --theme-bg2: #44475a; + --theme-gray: #928374; + --theme-fg0: #f8f8f2; + --theme-fg1: #6272a4; + --theme-fg2: #44475a; + --theme-red: #ff5555; + --theme-green: #50fa7b; + --theme-yellow: #f1fa8c; + --theme-blue: #8be9fd; + --theme-purple: #bd93f9; + --theme-orange: #ffb86c; + --theme-pink: #ff79c6; + + color: var(--theme-fg0); + --psp--color: var(--theme-fg1); + --psp-inactive--color: var(--theme-fg2); + --psp-inactive--border-color: var(--theme-bg2); + --psp--background-color: var(--theme-bg1); + --psp-status-icon--connected--color: var(--theme-green); + --psp-status-icon--initializing--color: var(--theme-yellow); + --psp-status-icon--psp-error--color: var(--theme-red); + + background-color: var(--theme-bg0); +} diff --git a/rust/perspective-viewer/src/themes/dracula.less b/rust/perspective-viewer/src/themes/dracula.less deleted file mode 100644 index dae888e185..0000000000 --- a/rust/perspective-viewer/src/themes/dracula.less +++ /dev/null @@ -1,101 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import "icons.less"; - -@import url("ref://pro-dark.less"); - -perspective-viewer, -perspective-viewer[theme="Dracula"] { - --theme-name: "Dracula"; -} - -perspective-viewer[theme="Dracula"] { - @include perspective-viewer-pro-dark; - @include perspective-viewer-dracula--colors; - @include perspective-viewer-dracula--animation; - @include perspective-viewer-dracula--fonts; - @include perspective-viewer-dracula--datagrid; - @include perspective-viewer-dracula--d3fc; -} - -perspective-copy-menu[theme="Dracula"], -perspective-export-menu[theme="Dracula"], -perspective-dropdown[theme="Dracula"] { - @include perspective-modal-pro-dark; - @include perspective-viewer-dracula--colors; - background-color: var(--theme-bg0); -} - -@mixin perspective-viewer-dracula--colors { - --theme-bg0: #191a22; - --theme-bg1: #282a36; - --theme-bg2: #44475a; - - --theme-gray: #928374; - - --theme-fg0: #f8f8f2; - --theme-fg1: #6272a4; - --theme-fg2: #44475a; - - --theme-red: #ff5555; - --theme-green: #50fa7b; - --theme-yellow: #f1fa8c; - --theme-blue: #8be9fd; - --theme-purple: #bd93f9; - --theme-orange: #ffb86c; - --theme-pink: #ff79c6; - - color: var(--theme-fg0); - background-color: var(--theme-bg0); - --icon--color: var(--theme-fg1); - --inactive--color: var(--theme-fg2); - --inactive--border-color: var(--theme-bg2); - --plugin--background: var(--theme-bg1); - --status-icon-connected--color: var(--theme-green); - --status-icon-initializing--color: var(--theme-yellow); - --status-icon-error--color: var(--theme-red); -} - -@mixin perspective-viewer-dracula--datagrid { - --rt-pos-cell--color: var(--theme-blue); - --rt-neg-cell--color: var(--theme-red); -} - -@mixin perspective-viewer-dracula--d3fc { - --d3fc-axis-ticks--color: var(--theme-fg1); - --d3fc-gridline--color: var(--theme-bg2); - --d3fc-series: var(--theme-blue); - --d3fc-series-1: var(--theme-blue); - --d3fc-series-2: var(--theme-red); - --d3fc-series-3: var(--theme-green); - --d3fc-series-4: var(--theme-yellow); - --d3fc-series-5: var(--theme-purple); - --d3fc-series-6: var(--theme-pink); - --d3fc-series-7: var(--theme-orange); - - --d3fc-negative--gradient: linear-gradient( - var(--theme-bg0), - var(--theme-red) - ) !important; - - --d3fc-positive--gradient: linear-gradient( - var(--theme-bg0), - var(--theme-blue) - ) !important; - - --d3fc-full--gradient: linear-gradient( - var(--theme-red), - var(--theme-bg0), - var(--theme-blue) - ) !important; -} diff --git a/rust/perspective-viewer/src/themes/gruvbox-dark.css b/rust/perspective-viewer/src/themes/gruvbox-dark.css new file mode 100644 index 0000000000..8a58c01ebb --- /dev/null +++ b/rust/perspective-viewer/src/themes/gruvbox-dark.css @@ -0,0 +1,255 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +@import "./defaults.css"; + +perspective-viewer, +perspective-viewer[theme="Gruvbox Dark"] { + --psp-theme-name: "Gruvbox Dark"; +} + +perspective-viewer[theme="Gruvbox Dark"] { + /* perspective-viewer-pro-dark--colors (overrides) */ + background-color: #242526; + color: white; + --psp--color: white; + --psp-active--color: #2770a9; + --psp-error--color: #ff9485; + --psp-inactive--color: #61656e; + --psp-inactive--border-color: #4c505b; + --psp--background-color: #242526; + --psp-active--background: rgba(39, 113, 170, 0.5); + --psp-expression--operator--color: #c5c9d0; + --psp-expression--function--color: #22a0ce; + --psp-expression--psp-error--color: rgb(255, 136, 136); + --psp-calendar--filter: invert(1); + --psp-warning--color: #242526; + --psp-warning--background: var(--psp--color); + + --psp-icon--select-arrow--mask-image: var( + --psp-icon--select-arrow-light--mask-image + ); + + --psp-icon--select-arrow-hover--mask-image: var( + --psp-icon--select-arrow-dark--mask-image + ); + + --psp-code-editor--symbol--color: white; + --psp-code-editor--literal--color: #7dc3f0; + --psp-code-editor--operator--color: rgb(23, 166, 123); + --psp-code-editor--comment--color: rgb(204, 120, 48); + --psp-code-editor--column--color: #e18ee1; + + /* perspective-viewer-pro-dark--datagrid */ + --psp-datagrid--pos-cell--color: #7dc3f0; + --psp-datagrid--neg-cell--color: #ff9485; + + /* perspective-viewer-pro-dark--d3fc (overrides) */ + --psp-d3fc--legend--color: #c5c9d0; + --psp-d3fc--treemap--labels: white; + --psp-d3fc--treemap--hover-highlight: white; + --psp-d3fc--tooltip--color: white; + --psp-d3fc--axis-ticks--color: #c5c9d0; + --psp-d3fc--axis-lines--color: #61656e; + --psp-d3fc--gridline--color: #3b3f46; + --psp-d3fc--tooltip--background: rgba(42, 44, 47, 1); + --psp-d3fc--tooltip--border-color: #242526; + --psp-d3fc--legend--background: var(--psp--background-color); + --psp-d3fc--series--color: rgb(71, 120, 194); + --psp-d3fc--series-1--color: rgb(71, 120, 194); + --psp-d3fc--series-2--color: rgb(204, 120, 48); + --psp-d3fc--series-3--color: rgb(158, 84, 192); + --psp-d3fc--series-4--color: rgb(51, 150, 153); + --psp-d3fc--series-5--color: rgb(102, 114, 143); + --psp-d3fc--series-6--color: rgb(211, 103, 189); + --psp-d3fc--series-7--color: rgb(109, 124, 77); + --psp-d3fc--series-8--color: rgb(221, 99, 103); + --psp-d3fc--series-9--color: rgb(120, 104, 206); + --psp-d3fc--series-10--color: rgb(23, 166, 123); + --psp-d3fc--full-gradient--background: linear-gradient( + #dd6367 0%, + #242526 50%, + #3289c8 100% + ); + --psp-d3fc--pos-gradient--background: linear-gradient( + #242526 0%, + #3289c8 100% + ); + --psp-d3fc--neg-gradient--background: linear-gradient( + #dd6367 0%, + #242526 100% + ); + + /* perspective-viewer-pro-dark--openlayers (overrides) */ + --psp-openlayers--tile-url: "http://{a-c}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png"; + --psp-openlayers--attribution--filter: invert(1) hue-rotate(180deg); + --psp-openlayers--element--background: #212c2f; + --psp-openlayers--category-1--color: rgb(71, 120, 194); + --psp-openlayers--category-2--color: rgb(204, 120, 48); + --psp-openlayers--category-3--color: rgb(158, 84, 192); + --psp-openlayers--category-4--color: rgb(51, 150, 153); + --psp-openlayers--category-5--color: rgb(102, 114, 143); + --psp-openlayers--category-6--color: rgb(211, 103, 189); + --psp-openlayers--category-7--color: rgb(109, 124, 77); + --psp-openlayers--category-8--color: rgb(221, 99, 103); + --psp-openlayers--category-9--color: rgb(120, 104, 206); + --psp-openlayers--category-10--color: rgb(23, 166, 123); + --psp-openlayers--gradient--background: linear-gradient( + #dd6367 0%, + #242526 50%, + #3289c8 100% + ); + + /* perspective-viewer-gruvbox-dark--colors */ + --theme-bg0: #282828; + --theme-bg1: #3c3836; + --theme-bg2: #7c6f64; + + --theme-gray: #928374; + + --theme-fg0: #fbf1c7; + --theme-fg1: #ebdbb2; + --theme-fg2: #a89984; + + --theme-red: #cc241d; + --theme-green: #98871a; + --theme-yellow: #d79921; + --theme-blue: #458588; + --theme-purple: #b16286; + --theme-aqua: #689d5a; + --theme-orange: #d65d0e; + + --theme-alt-red: #fb4934; + --theme-alt-green: #b8bb26; + --theme-alt-yellow: #fabd2f; + --theme-alt-blue: #83a598; + --theme-alt-purple: #d3869b; + --theme-alt-aqua: #8ec07c; + --theme-alt-orange: #fe8019; + + color: var(--theme-fg0); + background-color: var(--theme-bg0); + --psp--color: var(--theme-fg1); + --psp-inactive--color: var(--theme-fg2); + --psp-inactive--border-color: var(--theme-bg2); + --psp--background-color: var(--theme-bg1); + --psp-status-icon--connected--color: var(--theme-aqua); + --psp-status-icon--initializing--color: var(--theme-yellow); + --psp-status-icon--psp-error--color: var(--theme-red); + + /* perspective-viewer-gruvbox-dark--datagrid */ + --psp-datagrid--pos-cell--color: var(--theme-alt-blue); + --psp-datagrid--neg-cell--color: var(--theme-alt-red); + + /* perspective-viewer-gruvbox-dark--d3fc */ + --psp-d3fc--axis-ticks--color: var(--theme-fg1); + --psp-d3fc--gridline--color: var(--theme-bg2); + --psp-d3fc--series--color: var(--theme-blue); + --psp-d3fc--series-1--color: var(--theme-blue); + --psp-d3fc--series-2--color: var(--theme-red); + --psp-d3fc--series-3--color: var(--theme-green); + --psp-d3fc--series-4--color: var(--theme-purple); + --psp-d3fc--series-5--color: var(--theme-aqua); + --psp-d3fc--series-6--color: var(--theme-alt-blue); + --psp-d3fc--series-7--color: var(--theme-alt-red); + --psp-d3fc--series-8--color: var(--theme-alt-green); + --psp-d3fc--series-9--color: var(--theme-alt-purple); + --psp-d3fc--series-10--color: var(--theme-alt-aqua); + + --psp-d3fc--neg-gradient--background: linear-gradient( + var(--theme-bg0), + var(--theme-red), + var(--theme-alt-red) + ) !important; + + --psp-d3fc--pos-gradient--background: linear-gradient( + var(--theme-bg0), + var(--theme-blue), + var(--theme-alt-blue) + ) !important; + + --psp-d3fc--full-gradient--background: linear-gradient( + var(--theme-alt-red), + var(--theme-red), + var(--theme-bg0), + var(--theme-blue), + var(--theme-alt-blue) + ) !important; +} + +perspective-copy-menu[theme="Gruvbox Dark"], +perspective-export-menu[theme="Gruvbox Dark"], +perspective-dropdown[theme="Gruvbox Dark"] { + /* perspective-viewer-pro-dark--colors (overrides) */ + background-color: #242526; + color: white; + --psp--color: white; + --psp-active--color: #2770a9; + --psp-error--color: #ff9485; + --psp-inactive--color: #61656e; + --psp-inactive--border-color: #4c505b; + --psp--background-color: #242526; + --psp-active--background: rgba(39, 113, 170, 0.5); + --psp-expression--operator--color: #c5c9d0; + --psp-expression--function--color: #22a0ce; + --psp-expression--psp-error--color: rgb(255, 136, 136); + --psp-calendar--filter: invert(1); + --psp-warning--color: #242526; + --psp-warning--background: var(--psp--color); + --psp-icon--select-arrow--mask-image: var( + --psp-icon--select-arrow-light--mask-image + ); + --psp-icon--select-arrow-hover--mask-image: var( + --psp-icon--select-arrow-dark--mask-image + ); + --psp-code-editor--symbol--color: white; + --psp-code-editor--literal--color: #7dc3f0; + --psp-code-editor--operator--color: rgb(23, 166, 123); + --psp-code-editor--comment--color: rgb(204, 120, 48); + --psp-code-editor--column--color: #e18ee1; + + border: 1px solid #4c505b; + + /* perspective-viewer-gruvbox-dark--colors */ + --theme-bg0: #282828; + --theme-bg1: #3c3836; + --theme-bg2: #7c6f64; + --theme-gray: #928374; + --theme-fg0: #fbf1c7; + --theme-fg1: #ebdbb2; + --theme-fg2: #a89984; + --theme-red: #cc241d; + --theme-green: #98871a; + --theme-yellow: #d79921; + --theme-blue: #458588; + --theme-purple: #b16286; + --theme-aqua: #689d5a; + --theme-orange: #d65d0e; + --theme-alt-red: #fb4934; + --theme-alt-green: #b8bb26; + --theme-alt-yellow: #fabd2f; + --theme-alt-blue: #83a598; + --theme-alt-purple: #d3869b; + --theme-alt-aqua: #8ec07c; + --theme-alt-orange: #fe8019; + + color: var(--theme-fg0); + --psp--color: var(--theme-fg1); + --psp-inactive--color: var(--theme-fg2); + --psp-inactive--border-color: var(--theme-bg2); + --psp--background-color: var(--theme-bg1); + --psp-status-icon--connected--color: var(--theme-aqua); + --psp-status-icon--initializing--color: var(--theme-yellow); + --psp-status-icon--psp-error--color: var(--theme-red); + + background-color: var(--theme-bg0); +} diff --git a/rust/perspective-viewer/src/themes/gruvbox-dark.less b/rust/perspective-viewer/src/themes/gruvbox-dark.less deleted file mode 100644 index b2665334fa..0000000000 --- a/rust/perspective-viewer/src/themes/gruvbox-dark.less +++ /dev/null @@ -1,116 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import "icons.less"; - -@import url("ref://pro-dark.less"); - -perspective-viewer, -perspective-viewer[theme="Gruvbox Dark"] { - --theme-name: "Gruvbox Dark"; -} - -perspective-viewer[theme="Gruvbox Dark"] { - @include perspective-viewer-pro-dark; - @include perspective-viewer-gruvbox-dark--colors; - @include perspective-viewer-gruvbox-dark--animation; - @include perspective-viewer-gruvbox-dark--fonts; - @include perspective-viewer-gruvbox-dark--datagrid; - @include perspective-viewer-gruvbox-dark--d3fc; -} - -perspective-copy-menu[theme="Gruvbox Dark"], -perspective-export-menu[theme="Gruvbox Dark"], -perspective-dropdown[theme="Gruvbox Dark"] { - @include perspective-modal-pro-dark; - @include perspective-viewer-gruvbox-dark--colors; - background-color: var(--theme-bg0); -} - -@mixin perspective-viewer-gruvbox-dark--colors { - --theme-bg0: #282828; - --theme-bg1: #3c3836; - --theme-bg2: #7c6f64; - - --theme-gray: #928374; - - --theme-fg0: #fbf1c7; - --theme-fg1: #ebdbb2; - --theme-fg2: #a89984; - - --theme-red: #cc241d; - --theme-green: #98871a; - --theme-yellow: #d79921; - --theme-blue: #458588; - --theme-purple: #b16286; - --theme-aqua: #689d5a; - --theme-orange: #d65d0e; - - --theme-alt-red: #fb4934; - --theme-alt-green: #b8bb26; - --theme-alt-yellow: #fabd2f; - --theme-alt-blue: #83a598; - --theme-alt-purple: #d3869b; - --theme-alt-aqua: #8ec07c; - --theme-alt-orange: #fe8019; - - color: var(--theme-fg0); - background-color: var(--theme-bg0); - --icon--color: var(--theme-fg1); - --inactive--color: var(--theme-fg2); - --inactive--border-color: var(--theme-bg2); - --plugin--background: var(--theme-bg1); - --status-icon-connected--color: var(--theme-aqua); - --status-icon-initializing--color: var(--theme-yellow); - --status-icon-error--color: var(--theme-red); -} - -@mixin perspective-viewer-gruvbox-dark--datagrid { - --rt-pos-cell--color: var(--theme-alt-blue); - --rt-neg-cell--color: var(--theme-alt-red); -} - -@mixin perspective-viewer-gruvbox-dark--d3fc { - --d3fc-axis-ticks--color: var(--theme-fg1); - --d3fc-gridline--color: var(--theme-bg2); - --d3fc-series: var(--theme-blue); - --d3fc-series-1: var(--theme-blue); - --d3fc-series-2: var(--theme-red); - --d3fc-series-3: var(--theme-green); - --d3fc-series-4: var(--theme-purple); - --d3fc-series-5: var(--theme-aqua); - --d3fc-series-6: var(--theme-alt-blue); - --d3fc-series-7: var(--theme-alt-red); - --d3fc-series-8: var(--theme-alt-green); - --d3fc-series-9: var(--theme-alt-purple); - --d3fc-series-10: var(--theme-alt-aqua); - - --d3fc-negative--gradient: linear-gradient( - var(--theme-bg0), - var(--theme-red), - var(--theme-alt-red) - ) !important; - - --d3fc-positive--gradient: linear-gradient( - var(--theme-bg0), - var(--theme-blue), - var(--theme-alt-blue) - ) !important; - - --d3fc-full--gradient: linear-gradient( - var(--theme-alt-red), - var(--theme-red), - var(--theme-bg0), - var(--theme-blue), - var(--theme-alt-blue) - ) !important; -} diff --git a/rust/perspective-viewer/src/themes/gruvbox.css b/rust/perspective-viewer/src/themes/gruvbox.css new file mode 100644 index 0000000000..6ff072f84d --- /dev/null +++ b/rust/perspective-viewer/src/themes/gruvbox.css @@ -0,0 +1,134 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +@import "./defaults.css"; + +perspective-viewer, +perspective-viewer[theme="Gruvbox Light"] { + --psp-theme-name: "Gruvbox Light"; +} + +perspective-viewer[theme="Gruvbox Light"] { + /* perspective-viewer-gruvbox-light--colors */ + --theme-fg0: #282828; + --theme-fg1: #3c3836; + --theme-fg2: #7c6f64; + + --theme-gray: #928374; + + --theme-bg0: #fbf1c7; + --theme-bg1: #ebdbb2; + --theme-bg2: #a89984; + + --theme-red: #cc241d; + --theme-green: #98871a; + --theme-yellow: #d79921; + --theme-blue: #458588; + --theme-purple: #b16286; + --theme-aqua: #689d5a; + --theme-orange: #d65d0e; + + --theme-alt-red: #9d0006; + --theme-alt-green: #79740e; + --theme-alt-yellow: #b57614; + --theme-alt-blue: #076678; + --theme-alt-purple: #8f3f71; + --theme-alt-aqua: #427b58; + --theme-alt-orange: #af3a03; + + color: var(--theme-fg1); + background-color: var(--theme-bg1); + --psp--color: var(--theme-fg0); + --psp-inactive--color: var(--theme-fg2); + --psp-inactive--border-color: var(--theme-bg2); + --psp--background-color: var(--theme-bg0); + --psp-status-icon--connected--color: var(--theme-aqua); + --psp-status-icon--initializing--color: var(--theme-yellow); + --psp-status-icon--psp-error--color: var(--theme-red); + + /* perspective-viewer-gruvbox-light--datagrid */ + --psp-datagrid--pos-cell--color: var(--theme-blue); + --psp-datagrid--neg-cell--color: var(--theme-red); + + /* perspective-viewer-gruvbox-light--d3fc */ + --psp-d3fc--axis-ticks--color: var(--theme-fg1); + --psp-d3fc--gridline--color: var(--theme-bg2); + --psp-d3fc--series--color: var(--theme-blue); + --psp-d3fc--series-1--color: var(--theme-blue); + --psp-d3fc--series-2--color: var(--theme-red); + --psp-d3fc--series-3--color: var(--theme-green); + --psp-d3fc--series-4--color: var(--theme-purple); + --psp-d3fc--series-5--color: var(--theme-aqua); + --psp-d3fc--series-6--color: var(--theme-alt-blue); + --psp-d3fc--series-7--color: var(--theme-alt-red); + --psp-d3fc--series-8--color: var(--theme-alt-green); + --psp-d3fc--series-9--color: var(--theme-alt-purple); + --psp-d3fc--series-10--color: var(--theme-alt-aqua); + + --psp-d3fc--neg-gradient--background: linear-gradient( + var(--theme-bg1), + var(--theme-red), + var(--theme-alt-red) + ) !important; + + --psp-d3fc--pos-gradient--background: linear-gradient( + var(--theme-bg1), + var(--theme-blue), + var(--theme-alt-blue) + ) !important; + + --psp-d3fc--full-gradient--background: linear-gradient( + var(--theme-alt-red), + var(--theme-red), + var(--theme-bg1), + var(--theme-blue), + var(--theme-alt-blue) + ) !important; +} + +perspective-copy-menu[theme="Gruvbox Light"], +perspective-export-menu[theme="Gruvbox Light"], +perspective-dropdown[theme="Gruvbox Light"] { + /* perspective-viewer-gruvbox-light--colors */ + --theme-fg0: #282828; + --theme-fg1: #3c3836; + --theme-fg2: #7c6f64; + --theme-gray: #928374; + --theme-bg0: #fbf1c7; + --theme-bg1: #ebdbb2; + --theme-bg2: #a89984; + --theme-red: #cc241d; + --theme-green: #98871a; + --theme-yellow: #d79921; + --theme-blue: #458588; + --theme-purple: #b16286; + --theme-aqua: #689d5a; + --theme-orange: #d65d0e; + --theme-alt-red: #9d0006; + --theme-alt-green: #79740e; + --theme-alt-yellow: #b57614; + --theme-alt-blue: #076678; + --theme-alt-purple: #8f3f71; + --theme-alt-aqua: #427b58; + --theme-alt-orange: #af3a03; + + color: var(--theme-fg1); + --psp--color: var(--theme-fg0); + --psp-inactive--color: var(--theme-fg2); + --psp-inactive--border-color: var(--theme-bg2); + --psp--background-color: var(--theme-bg0); + --psp-status-icon--connected--color: var(--theme-aqua); + --psp-status-icon--initializing--color: var(--theme-yellow); + --psp-status-icon--psp-error--color: var(--theme-red); + + background-color: var(--theme-bg0); +} diff --git a/rust/perspective-viewer/src/themes/gruvbox.less b/rust/perspective-viewer/src/themes/gruvbox.less deleted file mode 100644 index 55f72b06dc..0000000000 --- a/rust/perspective-viewer/src/themes/gruvbox.less +++ /dev/null @@ -1,152 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import "icons.less"; - -@import url("ref://pro.less"); - -perspective-viewer, -perspective-viewer[theme="Gruvbox Light"] { - --theme-name: "Gruvbox Light"; -} - -perspective-viewer[theme="Gruvbox Light"] { - // --gruvbox-fg0: #282828; - // --gruvbox-fg1: #3c3836; - // --gruvbox-fg2: #504945; - // --gruvbox-fg3: #665c54; - // --gruvbox-fg4: #7c6f64; - // --gruvbox-gray: #928374; - // --gruvbox-bg0: #fbf1c7; - // --gruvbox-bg1: #ebdbb2; - // --gruvbox-bg2: #d5c4a1; - // --gruvbox-bg3: #bdae93; - // --gruvbox-bg4: #a89984; - - // --gruvbox-red: #cc241d; - // --gruvbox-green: #98871a; - // --gruvbox-yellow: #d79921; - // --gruvbox-blue: #458588; - // --gruvbox-purple: #b16286; - // --gruvbox-aqua: #689d5a; - // --gruvbox-orange: #d65d0e; - - // --gruvbox-dark-red: #9d0006; - // --gruvbox-dark-green: #79740e; - // --gruvbox-dark-yellow: #b57614; - // --gruvbox-dark-blue: #076678; - // --gruvbox-dark-purple: #8f3f71; - // --gruvbox-dark-aqua: #427b58; - // --gruvbox-dark-orange: #af3a03; - - // --gruvbox-light-red: #fb4934; - // --gruvbox-light-green: #b8bb26; - // --gruvbox-light-yellow: #fabd2f; - // --gruvbox-light-blue: #83a598; - // --gruvbox-light-purple: #d3869b; - // --gruvbox-light-aqua: #8ec07c; - // --gruvbox-light-orange: #fe8019; - - @include perspective-viewer-pro; - @include perspective-viewer-gruvbox-light--colors; - @include perspective-viewer-gruvbox-light--animation; - @include perspective-viewer-gruvbox-light--fonts; - @include perspective-viewer-gruvbox-light--datagrid; - @include perspective-viewer-gruvbox-light--d3fc; -} - -perspective-copy-menu[theme="Gruvbox Light"], -perspective-export-menu[theme="Gruvbox Light"], -perspective-dropdown[theme="Gruvbox Light"] { - @include perspective-modal-pro; - @include perspective-viewer-gruvbox-light--colors; - background-color: var(--theme-bg0); -} - -@mixin perspective-viewer-gruvbox-light--colors { - --theme-fg0: #282828; - --theme-fg1: #3c3836; - --theme-fg2: #7c6f64; - - --theme-gray: #928374; - - --theme-bg0: #fbf1c7; - --theme-bg1: #ebdbb2; - --theme-bg2: #a89984; - - --theme-red: #cc241d; - --theme-green: #98871a; - --theme-yellow: #d79921; - --theme-blue: #458588; - --theme-purple: #b16286; - --theme-aqua: #689d5a; - --theme-orange: #d65d0e; - - --theme-alt-red: #9d0006; - --theme-alt-green: #79740e; - --theme-alt-yellow: #b57614; - --theme-alt-blue: #076678; - --theme-alt-purple: #8f3f71; - --theme-alt-aqua: #427b58; - --theme-alt-orange: #af3a03; - - color: var(--theme-fg1); - background-color: var(--theme-bg1); - --icon--color: var(--theme-fg0); - --inactive--color: var(--theme-fg2); - --inactive--border-color: var(--theme-bg2); - --plugin--background: var(--theme-bg0); - --status-icon-connected--color: var(--theme-aqua); - --status-icon-initializing--color: var(--theme-yellow); - --status-icon-error--color: var(--theme-red); -} - -@mixin perspective-viewer-gruvbox-light--datagrid { - --rt-pos-cell--color: var(--theme-blue); - --rt-neg-cell--color: var(--theme-red); -} - -@mixin perspective-viewer-gruvbox-light--d3fc { - --d3fc-axis-ticks--color: var(--theme-fg1); - --d3fc-gridline--color: var(--theme-bg2); - --d3fc-series: var(--theme-blue); - --d3fc-series-1: var(--theme-blue); - --d3fc-series-2: var(--theme-red); - --d3fc-series-3: var(--theme-green); - --d3fc-series-4: var(--theme-purple); - --d3fc-series-5: var(--theme-aqua); - --d3fc-series-6: var(--theme-alt-blue); - --d3fc-series-7: var(--theme-alt-red); - --d3fc-series-8: var(--theme-alt-green); - --d3fc-series-9: var(--theme-alt-purple); - --d3fc-series-10: var(--theme-alt-aqua); - - --d3fc-negative--gradient: linear-gradient( - var(--theme-bg1), - var(--theme-red), - var(--theme-alt-red) - ) !important; - - --d3fc-positive--gradient: linear-gradient( - var(--theme-bg1), - var(--theme-blue), - var(--theme-alt-blue) - ) !important; - - --d3fc-full--gradient: linear-gradient( - var(--theme-alt-red), - var(--theme-red), - var(--theme-bg1), - var(--theme-blue), - var(--theme-alt-blue) - ) !important; -} diff --git a/rust/perspective-viewer/src/themes/icons.css b/rust/perspective-viewer/src/themes/icons.css new file mode 100644 index 0000000000..1ada5fcf33 --- /dev/null +++ b/rust/perspective-viewer/src/themes/icons.css @@ -0,0 +1,124 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +perspective-viewer, +perspective-workspace, +perspective-copy-menu, +perspective-export-menu, +perspective-dropdown, +perspective-date-column-style, +perspective-datetime-column-style, +perspective-number-column-style, +perspective-string-column-style { + /* Icons */ + --psp-column-type--integer--mask-image: url("../svg/number-type.svg"); + --psp-column-type--float--mask-image: var( + --psp-column-type--integer--mask-image + ); + --psp-column-type--string--mask-image: url("../svg/string-type.svg"); + --psp-column-type--date--mask-image: url("../svg/date-type.svg"); + --psp-column-type--boolean--mask-image: url("../svg/boolean-type.svg"); + --psp-column-type--datetime--mask-image: var( + --psp-column-type--date--mask-image + ); + --psp-icon--column-drag-handle--mask-image: url("../svg/drag-handle.svg"); + --psp-icon--radio-on--mask-image: url("../svg/radio-on.svg"); + --psp-icon--radio-hover--mask-image: url("../svg/radio-hover.svg"); + --psp-icon--radio-off--mask-image: url("../svg/radio-off.svg"); + --psp-icon--checkbox-on--mask-image: url("../svg/checkbox-on.svg"); + --psp-icon--checkbox-hover--mask-image: url("../svg/checkbox-hover.svg"); + --psp-icon--checkbox-off--mask-image: url("../svg/checkbox-off.svg"); + --psp-icon--column-settings--mask-image: url("../svg/column-settings-icon.svg"); + --psp-icon--sort-asc--mask-image: url("../svg/sort-asc-icon.svg"); + --psp-icon--sort-desc--mask-image: url("../svg/sort-desc-icon.svg"); + --psp-icon--sort-col-asc--mask-image: url("../svg/sort-col-asc-icon.svg"); + --psp-icon--sort-col-desc--mask-image: url("../svg/sort-col-desc-icon.svg"); + --psp-icon--sort-abs-asc--mask-image: url("../svg/sort-abs-asc-icon.svg"); + --psp-icon--sort-abs-desc--mask-image: url("../svg/sort-abs-desc-icon.svg"); + --psp-icon--sort-abs-col-asc--mask-image: url("../svg/sort-abs-col-asc-icon.svg"); + --psp-icon--sort-abs-col-desc--mask-image: url("../svg/sort-abs-col-desc-icon.svg"); + --psp-icon--sort-none--mask-image: url("../svg/sort-none-icon.svg"); + --psp-icon--add-expression--mask-image: url("../svg/expression.svg"); + --psp-icon--close--mask-image: url("../svg/close-icon.svg"); + --psp-label--inactive-column-selector--content: url("../svg/checkbox-unchecked-icon.svg"); + --psp-label--active-column-selector--content: url("../svg/checkbox-checked-icon.svg"); + --psp-icon--select-arrow-light--mask-image: url("../svg/dropdown-selector-light.svg"); + --psp-icon--select-arrow-dark--mask-image: url("../svg/dropdown-selector.svg"); + --psp-icon-overflow-hint--content: "!"; + --psp-label--reset-button-icon--content: "refresh"; + --psp-label--save-button-icon--content: "save"; + + --psp-icon--updating--mask-image: url("../svg/updating.gif"); + --psp-icon--downloading--mask-image: url("../svg/downloading.gif"); + --psp-icon--status-ok--mask-image: url(../svg/status_ok.svg); + --psp-icon--export--mask-image: url("../svg/export-icon.svg"); + --psp-icon--free-scroll--mask-image: url("../svg/free-scroll-icon.svg"); + --psp-icon--reset--mask-image: url("../svg/revert-icon.svg"); + --psp-icon--copy--mask-image: url("../svg/duplicate-icon.svg"); + --psp-icon--theme--mask-image: url("../svg/theme-icon.svg"); + + --psp-icon--drawer-tab--mask-image: url(../svg/drawer-tab.svg); + --psp-icon--drawer-tab-hover--mask-image: url(../svg/drawer-tab-hover.svg); + --psp-icon--drawer-tab-inverted--mask-image: url(../svg/drawer-tab-invert.svg); + --psp-icon--drawer-tab-inverted-hover--mask-image: url(../svg/drawer-tab-invert-hover.svg); + + --psp-sidebar--background: var(--psp--background-color) + url(../svg/bg-pattern.png); + + /* Plugin Selector */ + --psp-plugin-selector--candlestick--content: url(../svg/mega-menu-icons-candlestick.svg); + --psp-plugin-selector--heatmap--content: url(../svg/mega-menu-icons-heatmap.svg); + --psp-plugin-selector--map-scatter--content: url(../svg/mega-menu-icons-map-scatter.svg); + --psp-plugin-selector--ohlc--content: url(../svg/mega-menu-icons-ohlc.svg); + --psp-plugin-selector--sunburst--content: url(../svg/mega-menu-icons-sunburst.svg); + --psp-plugin-selector--treemap--content: url(../svg/mega-menu-icons-treemap.svg); + --psp-plugin-selector--x-bar--content: url(../svg/mega-menu-icons-x-bar.svg); + --psp-plugin-selector--x-y-line--content: url(../svg/mega-menu-icons-x-y-line.svg); + --psp-plugin-selector--x-y-scatter--content: url(../svg/mega-menu-icons-x-y-scatter.svg); + --psp-plugin-selector--y-area--content: url(../svg/mega-menu-icons-y-area.svg); + --psp-plugin-selector--y-bar--content: url(../svg/mega-menu-icons-y-bar.svg); + --psp-plugin-selector--y-line--content: url(../svg/mega-menu-icons-y-line.svg); + --psp-plugin-selector--y-scatter--content: url(../svg/mega-menu-icons-y-scatter.svg); + --psp-plugin-selector--datagrid--content: url(../svg/mega-menu-icons-datagrid.svg); + + /* Colors */ + color: #161616; + background-color: transparent; + --psp--color: #161616; + --psp-inactive--color: #ababab; + --psp-inactive--border-color: #dadada; + + --psp-active--color: #2670a9; + --psp-error--color: #ff471e; + --psp--background-color: #ffffff; + --psp-icon-overflow-hint--color: rgba(0, 0, 0, 0.2); + --psp-select--background-color: none; + --psp-warning--background: #042121; + --psp-warning--color: #fdfffd; + + /* TODO deprecate me */ + --psp-icon-overflow-hint--color: #fdfffd; + + /* Datagrid */ + /* `regular-table` icons */ + --psp-label--column-style-open-button--content: "style"; + --psp-label--column-style-close-button--content: ">\00a0 style"; + --psp-label--tree-collapse--content: "-"; + --psp-label--tree-expand--content: "+"; + --psp-toolbar-scroll-lock--content: url("../svg/free-scroll-icon.svg"); + --psp-toolbar-scroll-lock-active--content: url("../svg/align-scroll-icon.svg"); + --psp-toolbar-edit-mode-read-only--content: url("../svg/read-only-icon.svg"); + --psp-toolbar-edit-mode-edit--content: url("../svg/editable-icon.svg"); + --psp-toolbar-edit-mode-select-row--content: url("../svg/datagrid-select-row.svg"); + --psp-toolbar-edit-mode-select-column--content: url("../svg/datagrid-select-column.svg"); + --psp-toolbar-edit-mode-select-region--content: url("../svg/datagrid-select-region.svg"); +} diff --git a/rust/perspective-viewer/src/themes/icons.less b/rust/perspective-viewer/src/themes/icons.less deleted file mode 100644 index 06ca7cbeec..0000000000 --- a/rust/perspective-viewer/src/themes/icons.less +++ /dev/null @@ -1,130 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -perspective-viewer, -perspective-workspace, -perspective-copy-menu, -perspective-export-menu, -perspective-dropdown, -perspective-date-column-style, -perspective-datetime-column-style, -perspective-number-column-style, -perspective-string-column-style { - @include perspective-viewer-base--icons; - @include perspective-viewer-base--colors; - @include perspective-viewer-base--datagrid; -} - -@mixin perspective-viewer-base--colors { - color: #161616; - background-color: transparent; - --icon--color: #161616; - --inactive--color: #ababab; - --inactive--border-color: #dadada; - - --root--background: #ffffff; - --active--color: #2670a9; - --error--color: #ff471e; - --plugin--background: #ffffff; - --overflow-hint-icon--color: rgba(0, 0, 0, 0.2); - --select--background-color: none; - --column-drop-container--background: none; - --warning--background: #042121; - --warning--color: #fdfffd; - - // TODO deprecate me - --overflow-hint-icon--color: #fdfffd; -} - -@mixin perspective-viewer-base--icons { - --column-type-integer--mask-image: url("../svg/number-type.svg"); - --column-type-float--mask-image: var(--column-type-integer--mask-image); - --column-type-string--mask-image: url("../svg/string-type.svg"); - --column-type-date--mask-image: url("../svg/date-type.svg"); - --column-type-boolean--mask-image: url("../svg/boolean-type.svg"); - --column-type-datetime--mask-image: var(--column-type-date--mask-image); - --column-drag-handle--mask-image: url("../svg/drag-handle.svg"); - --column-radio-on--mask-image: url("../svg/radio-on.svg"); - --column-radio-hover--mask-image: url("../svg/radio-hover.svg"); - --column-radio-off--mask-image: url("../svg/radio-off.svg"); - --column-checkbox-on--mask-image: url("../svg/checkbox-on.svg"); - --column-checkbox-hover--mask-image: url("../svg/checkbox-hover.svg"); - --column-checkbox-off--mask-image: url("../svg/checkbox-off.svg"); - --column-settings-icon--mask-image: url("../svg/column-settings-icon.svg"); - --sort-asc-icon--mask-image: url("../svg/sort-asc-icon.svg"); - --sort-desc-icon--mask-image: url("../svg/sort-desc-icon.svg"); - --sort-col-asc-icon--mask-image: url("../svg/sort-col-asc-icon.svg"); - --sort-col-desc-icon--mask-image: url("../svg/sort-col-desc-icon.svg"); - --sort-abs-asc-icon--mask-image: url("../svg/sort-abs-asc-icon.svg"); - --sort-abs-desc-icon--mask-image: url("../svg/sort-abs-desc-icon.svg"); - --sort-abs-col-asc-icon--mask-image: url("../svg/sort-abs-col-asc-icon.svg"); - --sort-abs-col-desc-icon--mask-image: url("../svg/sort-abs-col-desc-icon.svg"); - --sort-none-icon--mask-image: url("../svg/sort-none-icon.svg"); - --add-expression-icon--mask-image: url("../svg/expression.svg"); - --close-icon--mask-image: url("../svg/close-icon.svg"); - --inactive-column-selector--content: url("../svg/checkbox-unchecked-icon.svg"); - --active-column-selector--content: url("../svg/checkbox-checked-icon.svg"); - --select-arrow-light--background-image: url("../svg/dropdown-selector-light.svg"); - --select-arrow-dark--background-image: url("../svg/dropdown-selector.svg"); - --overflow-hint-icon--content: "!"; - --reset-button-icon--content: "refresh"; - --save-button-icon--content: "save"; - - --updating-icon--mask-image: url("../svg/updating.gif"); - --downloading-icon--mask-image: url("../svg/downloading.gif"); - --status-ok-icon--mask-image: url(../svg/status_ok.svg); - --export-icon--mask-image: url("../svg/export-icon.svg"); - --free-scroll-icon--mask-image: url("../svg/free-scroll-icon.svg"); - --reset-icon--mask-image: url("../svg/revert-icon.svg"); - --copy-icon--mask-image: url("../svg/duplicate-icon.svg"); - --theme-icon--mask-image: url("../svg/theme-icon.svg"); - - --drawer-tab-icon--mask-image: url(../svg/drawer-tab.svg); - --drawer-tab-icon--hover--mask-image: url(../svg/drawer-tab-hover.svg); - --drawer-tab-inverted-icon--mask-image: url(../svg/drawer-tab-invert.svg); - --drawer-tab-inverted-icon--hover--mask-image: url(../svg/drawer-tab-invert-hover.svg); - - --plugin--background--pattern: url(../svg/bg-pattern.png); - --sidebar--background: var(--plugin--background) - var(--plugin--background--pattern); - - // Plugin Selector - --plugin-selector-candlestick--content: url(../svg/mega-menu-icons-candlestick.svg); - --plugin-selector-heatmap--content: url(../svg/mega-menu-icons-heatmap.svg); - --plugin-selector-map-scatter--content: url(../svg/mega-menu-icons-map-scatter.svg); - --plugin-selector-ohlc--content: url(../svg/mega-menu-icons-ohlc.svg); - --plugin-selector-sunburst--content: url(../svg/mega-menu-icons-sunburst.svg); - --plugin-selector-treemap--content: url(../svg/mega-menu-icons-treemap.svg); - --plugin-selector-x-bar--content: url(../svg/mega-menu-icons-x-bar.svg); - --plugin-selector-x-y-line--content: url(../svg/mega-menu-icons-x-y-line.svg); - --plugin-selector-x-y-scatter--content: url(../svg/mega-menu-icons-x-y-scatter.svg); - --plugin-selector-y-area--content: url(../svg/mega-menu-icons-y-area.svg); - --plugin-selector-y-bar--content: url(../svg/mega-menu-icons-y-bar.svg); - --plugin-selector-y-line--content: url(../svg/mega-menu-icons-y-line.svg); - --plugin-selector-y-scatter--content: url(../svg/mega-menu-icons-y-scatter.svg); - --plugin-selector-datagrid--content: url(../svg/mega-menu-icons-datagrid.svg); -} - -@mixin perspective-viewer-base--datagrid { - // `regular-table` icons - --column-style-open-button--content: "style"; - --column-style-close-button--content: ">\00a0 style"; - --tree-label-collapse--content: "-"; - --tree-label-expand--content: "+"; - --toolbar-scroll-lock--content: url("../svg/free-scroll-icon.svg"); - --toolbar-scroll-lock-active--content: url("../svg/align-scroll-icon.svg"); - --toolbar-edit-mode--read-only--content: url("../svg/read-only-icon.svg"); - --toolbar-edit-mode--edit--content: url("../svg/editable-icon.svg"); - --toolbar-edit-mode--select-row--content: url("../svg/datagrid-select-row.svg"); - --toolbar-edit-mode--select-column--content: url("../svg/datagrid-select-column.svg"); - --toolbar-edit-mode--select-region--content: url("../svg/datagrid-select-region.svg"); -} diff --git a/rust/perspective-viewer/src/themes/intl.css b/rust/perspective-viewer/src/themes/intl.css new file mode 100644 index 0000000000..45f8307428 --- /dev/null +++ b/rust/perspective-viewer/src/themes/intl.css @@ -0,0 +1,102 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +perspective-viewer, +perspective-dropdown { + /* Config */ + --psp-label--group-by--content: "Group By"; + --psp-label--split-by--content: "Split By"; + --psp-label--sort--content: "Order By"; + --psp-label--filter--content: "Where"; + --psp-label--transpose-button--content: "Swap"; + --psp-label--config-button--content: "configure"; + --psp-label--all-columns--content: "All Columns"; + --psp-label--untitled--content: "untitled"; + + /* Plugin names */ + --psp-plugin-name--datagrid--content: "Datagrid"; + --psp-plugin-name--treemap--content: "Treemap"; + --psp-plugin-name--sunburst--content: "Sunburst"; + --psp-plugin-name--heatmap--content: "Heatmap"; + --psp-plugin-name--x-bar--content: "X Bar"; + --psp-plugin-name--y-bar--content: "Y Bar"; + --psp-plugin-name--y-line--content: "Y Line"; + --psp-plugin-name--x-y-line--content: "X/Y Line"; + --psp-plugin-name--x-y-scatter--content: "X/Y Scatter"; + --psp-plugin-name--y-scatter--content: "Y Scatter"; + --psp-plugin-name--y-area--content: "Y Area"; + --psp-plugin-name--ohlc--content: "OHLC"; + --psp-plugin-name--candlestick--content: "Candlestick"; + + /* Column Selector names */ + --psp-label--column-columns--content: "Columns"; + --psp-label--column-x-axis--content: "X Axis"; + --psp-label--column-y-axis--content: "Y Axis"; + --psp-label--column-color--content: "Color"; + --psp-label--column-size--content: "Size"; + --psp-label--column-symbol--content: "Symbol"; + --psp-label--column-label--content: "Label"; + --psp-label--column-tooltip--content: "Tooltip"; + --psp-label--add-expression-button--content: "New Column"; + + /* Toolbar */ + --psp-label--no-results--content: "Invalid Column"; + --psp-datagrid--column-edit-button--content: "Edit"; + --psp-label--copy-button--content: "Copy"; + --psp-label--export-button--content: "Export"; + --psp-label--reset-button--content: "Reset"; + --psp-label--edit-mode-read-only--content: "Read Only"; + --psp-label--edit-mode-edit--content: "Text Edit"; + --psp-label--edit-mode-select-row--content: "Select Row"; + --psp-label--edit-mode-select-column--content: "Select Column"; + --psp-label--edit-mode-select-region--content: "Select Region"; + --psp-label--scroll-lock-toggle--content: "Free Scroll"; + --psp-label--scroll-lock-alt-toggle--content: "Align Scroll"; + + /* Column Settings */ + --psp-label--color--content: "Color"; + --psp-label--format--content: "Format"; + --psp-label--timezone--content: "Timezone"; + --psp-label--date-style--content: "Date Style"; + --psp-label--time-style--content: "Time Style"; + --psp-label--foreground--content: "Foreground"; + --psp-label--background--content: "Background"; + --psp-label--series--content: "Series"; + --psp-label--color-range--content: "Color Range"; + --psp-label--style--content: "Style"; + --psp-label--minimum-integer-digits--content: "Minimum Integer Digits"; + --psp-label--rounding-increment--content: "Rounding Increment"; + --psp-label--notation--content: "Notation"; + --psp-label--use-grouping--content: "Use Grouping"; + --psp-label--sign-display--content: "Sign Display"; + --psp-label--aggregate-depth--content: "Aggregate Depth"; + --psp-label--max-value--content: "Max Value"; + --psp-label--rounding-priority--content: "Rounding Priority"; + --psp-label--rounding-mode--content: "Rounding Mode"; + --psp-label--trailing-zero-display--content: "Trailing Zero Display"; + --psp-label--fractional-digits--content: "Fractional Digits"; + --psp-label--significant-digits--content: "Significant Digits"; + --psp-label--year--content: "Year"; + --psp-label--month--content: "Month"; + --psp-label--day--content: "Day"; + --psp-label--weekday--content: "Weekday"; + --psp-label--hour--content: "Hour"; + --psp-label--minute--content: "Minute"; + --psp-label--second--content: "Second"; + --psp-label--fractional-seconds--content: "Fractional Seconds"; + --psp-label--hours--content: "12/24 Hours"; + + /* Tabs */ + --psp-label--style-tab--content: "Style"; + --psp-label--attributes-tab--content: "Attributes"; + --psp-label--debug-tab--content: "Debug JSON"; +} diff --git a/rust/perspective-viewer/src/themes/intl.less b/rust/perspective-viewer/src/themes/intl.less deleted file mode 100644 index b5b099385e..0000000000 --- a/rust/perspective-viewer/src/themes/intl.less +++ /dev/null @@ -1,102 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -perspective-viewer, -perspective-dropdown { - // Config - --group-by-label--content: "Group By"; - --split-by-label--content: "Split By"; - --sort-label--content: "Order By"; - --filter-label--content: "Where"; - --transpose-button--content: "Swap"; - --config-button-icon--content: "configure"; - --all-columns-label--content: "All Columns"; - --untitled--content: "untitled"; - - // Plugin names - --plugin-name-datagrid--content: "Datagrid"; - --plugin-name-treemap--content: "Treemap"; - --plugin-name-sunburst--content: "Sunburst"; - --plugin-name-heatmap--content: "Heatmap"; - --plugin-name-x-bar--content: "X Bar"; - --plugin-name-y-bar--content: "Y Bar"; - --plugin-name-y-line--content: "Y Line"; - --plugin-name-x-y-line--content: "X/Y Line"; - --plugin-name-x-y-scatter--content: "X/Y Scatter"; - --plugin-name-y-scatter--content: "Y Scatter"; - --plugin-name-y-area--content: "Y Area"; - --plugin-name-ohlc--content: "OHLC"; - --plugin-name-candlestick--content: "Candlestick"; - - // Column Selector names - --column-selector-column-columns--content: "Columns"; - --column-selector-column-x-axis--content: "X Axis"; - --column-selector-column-y-axis--content: "Y Axis"; - --column-selector-column-color--content: "Color"; - --column-selector-column-size--content: "Size"; - --column-selector-column-symbol--content: "Symbol"; - --column-selector-column-label--content: "Label"; - --column-selector-column-tooltip--content: "Tooltip"; - --add-expression-button--content: "New Column"; - - // Toolbar - --no-results--content: "Invalid Column"; - --datagrid-column-edit-button--content: "Edit"; - --copy-button--content: "Copy"; - --export-button--content: "Export"; - --reset-button--content: "Reset"; - --edit-mode--read-only--content: "Read Only"; - --edit-mode--edit--content: "Text Edit"; - --edit-mode--select-row--content: "Select Row"; - --edit-mode--select-column--content: "Select Column"; - --edit-mode--select-region--content: "Select Region"; - --scroll-lock-toggle--content: "Free Scroll"; - --scroll-lock-alt-toggle--content: "Align Scroll"; - - // Column Settings - --color-label--content: "Color"; - --format-label--content: "Format"; - --timezone-label--content: "Timezone"; - --date-style-label--content: "Date Style"; - --time-style-label--content: "Time Style"; - --foreground-label--content: "Foreground"; - --background-label--content: "Background"; - --series-label--content: "Series"; - --color-range-label--content: "Color Range"; - --style-label--content: "Style"; - --minimum-integer-digits-label--content: "Minimum Integer Digits"; - --rounding-increment-label--content: "Rounding Increment"; - --notation-label--content: "Notation"; - --use-grouping-label--content: "Use Grouping"; - --sign-display-label--content: "Sign Display"; - --aggregate-depth-label--content: "Aggregate Depth"; - --max-value-label--content: "Max Value"; - --rounding-priority-label--content: "Rounding Priority"; - --rounding-mode-label--content: "Rounding Mode"; - --trailing-zero-display-label--content: "Trailing Zero Display"; - --fractional-digits-label--content: "Fractional Digits"; - --significant-digits-label--content: "Significant Digits"; - --year-label--content: "Year"; - --month-label--content: "Month"; - --day-label--content: "Day"; - --weekday-label--content: "Weekday"; - --hour-label--content: "Hour"; - --minute-label--content: "Minute"; - --second-label--content: "Second"; - --fractional-seconds-label--content: "Fractional Seconds"; - --hours-label--content: "12/24 Hours"; - - // Tabs - --style-tab-label--content: "Style"; - --attributes-tab-label--content: "Attributes"; - --debug-tab-label--content: "Debug JSON"; -} diff --git a/rust/perspective-viewer/src/themes/intl/de.css b/rust/perspective-viewer/src/themes/intl/de.css new file mode 100644 index 0000000000..b8e6574c71 --- /dev/null +++ b/rust/perspective-viewer/src/themes/intl/de.css @@ -0,0 +1,102 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +perspective-viewer, +perspective-dropdown { + /* Config */ + --psp-label--group-by--content: "Gruppiere nach"; + --psp-label--split-by--content: "Geteilt nach"; + --psp-label--sort--content: "Sortieren nach"; + --psp-label--filter--content: "Wo"; + --psp-label--transpose-button--content: "Tauschen"; + --psp-label--config-button--content: "Konfigurieren"; + --psp-label--all-columns--content: "Alle Spalten"; + --psp-label--untitled--content: "Ohne Titel"; + + /* Plugin names */ + --psp-plugin-name--datagrid--content: "Datengitter"; + --psp-plugin-name--treemap--content: "Baumkarte"; + --psp-plugin-name--sunburst--content: "Sonnendurchbruch"; + --psp-plugin-name--heatmap--content: "Heatmap"; + --psp-plugin-name--x-bar--content: "X-Bar"; + --psp-plugin-name--y-bar--content: "Und Bar"; + --psp-plugin-name--y-line--content: "und Linie"; + --psp-plugin-name--x-y-line--content: "X/Y-Linie"; + --psp-plugin-name--x-y-scatter--content: "X/Y-Streuung"; + --psp-plugin-name--y-scatter--content: "Y-Scatter"; + --psp-plugin-name--y-area--content: "und Bereich"; + --psp-plugin-name--ohlc--content: "Autsch"; + --psp-plugin-name--candlestick--content: "Leuchter"; + + /* Column Selector names */ + --psp-label--column-columns--content: "Säulen"; + --psp-label--column-x-axis--content: "X-Achse"; + --psp-label--column-y-axis--content: "Y-Achse"; + --psp-label--column-color--content: "Farbe"; + --psp-label--column-size--content: "Größe"; + --psp-label--column-symbol--content: "Symbol"; + --psp-label--column-label--content: "Etikett"; + --psp-label--column-tooltip--content: "Tooltip"; + --psp-label--add-expression-button--content: "Neue Spalte"; + + /* Toolbar */ + --psp-label--no-results--content: "Ungültige Spalte"; + --psp-datagrid--column-edit-button--content: "Bearbeiten"; + --psp-label--copy-button--content: "Kopieren"; + --psp-label--export-button--content: "Export"; + --psp-label--reset-button--content: "Zurücksetzen"; + --psp-label--edit-mode-read-only--content: "Read Only"; + --psp-label--edit-mode-edit--content: "Text Edit"; + --psp-label--edit-mode-select-row--content: "Select Row"; + --psp-label--edit-mode-select-column--content: "Select Column"; + --psp-label--edit-mode-select-region--content: "Select Region"; + --psp-label--scroll-lock-toggle--content: "Kostenlose Schriftrolle"; + --psp-label--scroll-lock-alt-toggle--content: "Bildlauf ausrichten"; + + /* Column Settings */ + --psp-label--color--content: "Farbe"; + --psp-label--format--content: "Format"; + --psp-label--timezone--content: "Zeitzone"; + --psp-label--date-style--content: "Datumsstil"; + --psp-label--time-style--content: "Zeitstil"; + --psp-label--foreground--content: "Vordergrund"; + --psp-label--background--content: "Hintergrund"; + --psp-label--series--content: "Serie"; + --psp-label--color-range--content: "Farbspektrum"; + --psp-label--style--content: "Stil"; + --psp-label--minimum-integer-digits--content: "Mindestanzahl ganzzahliger Ziffern"; + --psp-label--rounding-increment--content: "Rundungsinkrement"; + --psp-label--notation--content: "Notation"; + --psp-label--use-grouping--content: "Verwenden Sie Gruppierung"; + --psp-label--sign-display--content: "Schilderanzeige"; + --psp-label--max-value--content: "Maximaler Wert"; + --psp-label--rounding-priority--content: "Rundungspriorität"; + --psp-label--rounding-mode--content: "Rundungsmodus"; + --psp-label--trailing-zero-display--content: "Anzeige der nachgestellten Null"; + --psp-label--fractional-digits--content: "Bruchstellen"; + --psp-label--significant-digits--content: "Wichtige Ziffer"; + --psp-label--year--content: "Jahr"; + --psp-label--month--content: "Monat"; + --psp-label--day--content: "Tag"; + --psp-label--weekday--content: "Wochentag"; + --psp-label--hour--content: "Stunde"; + --psp-label--minute--content: "Minute"; + --psp-label--second--content: "Zweite"; + --psp-label--fractional-seconds--content: "Sekundenbruchteile"; + --psp-label--hours--content: "12/24 Stunden"; + --psp-label--aggregate-depth--content: "Gesamttiefe"; + + /* Tabs */ + --psp-label--style-tab--content: "Stil"; + --psp-label--attributes-tab--content: "Attribute"; + --psp-label--debug-tab--content: "Debug JSON"; +} diff --git a/rust/perspective-viewer/src/themes/intl/de.less b/rust/perspective-viewer/src/themes/intl/de.less deleted file mode 100644 index 8f917a5faf..0000000000 --- a/rust/perspective-viewer/src/themes/intl/de.less +++ /dev/null @@ -1,102 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -perspective-viewer, -perspective-dropdown { - // Config - --group-by-label--content: "Gruppiere nach"; - --split-by-label--content: "Geteilt nach"; - --sort-label--content: "Sortieren nach"; - --filter-label--content: "Wo"; - --transpose-button--content: "Tauschen"; - --config-button-icon--content: "Konfigurieren"; - --all-columns-label--content: "Alle Spalten"; - --untitled--content: "Ohne Titel"; - - // Plugin names - --plugin-name-datagrid--content: "Datengitter"; - --plugin-name-treemap--content: "Baumkarte"; - --plugin-name-sunburst--content: "Sonnendurchbruch"; - --plugin-name-heatmap--content: "Heatmap"; - --plugin-name-x-bar--content: "X-Bar"; - --plugin-name-y-bar--content: "Und Bar"; - --plugin-name-y-line--content: "und Linie"; - --plugin-name-x-y-line--content: "X/Y-Linie"; - --plugin-name-x-y-scatter--content: "X/Y-Streuung"; - --plugin-name-y-scatter--content: "Y-Scatter"; - --plugin-name-y-area--content: "und Bereich"; - --plugin-name-ohlc--content: "Autsch"; - --plugin-name-candlestick--content: "Leuchter"; - - // Column Selector names - --column-selector-column-columns--content: "Säulen"; - --column-selector-column-x-axis--content: "X-Achse"; - --column-selector-column-y-axis--content: "Y-Achse"; - --column-selector-column-color--content: "Farbe"; - --column-selector-column-size--content: "Größe"; - --column-selector-column-symbol--content: "Symbol"; - --column-selector-column-label--content: "Etikett"; - --column-selector-column-tooltip--content: "Tooltip"; - --add-expression-button--content: "Neue Spalte"; - - // Toolbar - --no-results--content: "Ungültige Spalte"; - --datagrid-column-edit-button--content: "Bearbeiten"; - --copy-button--content: "Kopieren"; - --export-button--content: "Export"; - --reset-button--content: "Zurücksetzen"; - --edit-mode--read-only--content: "Read Only"; - --edit-mode--edit--content: "Text Edit"; - --edit-mode--select-row--content: "Select Row"; - --edit-mode--select-column--content: "Select Column"; - --edit-mode--select-region--content: "Select Region"; - --scroll-lock-toggle--content: "Kostenlose Schriftrolle"; - --scroll-lock-alt-toggle--content: "Bildlauf ausrichten"; - - // Column Settings - --color-label--content: "Farbe"; - --format-label--content: "Format"; - --timezone-label--content: "Zeitzone"; - --date-style-label--content: "Datumsstil"; - --time-style-label--content: "Zeitstil"; - --foreground-label--content: "Vordergrund"; - --background-label--content: "Hintergrund"; - --series-label--content: "Serie"; - --color-range-label--content: "Farbspektrum"; - --style-label--content: "Stil"; - --minimum-integer-digits-label--content: "Mindestanzahl ganzzahliger Ziffern"; - --rounding-increment-label--content: "Rundungsinkrement"; - --notation-label--content: "Notation"; - --use-grouping-label--content: "Verwenden Sie Gruppierung"; - --sign-display-label--content: "Schilderanzeige"; - --max-value-label--content: "Maximaler Wert"; - --rounding-priority-label--content: "Rundungspriorität"; - --rounding-mode-label--content: "Rundungsmodus"; - --trailing-zero-display-label--content: "Anzeige der nachgestellten Null"; - --fractional-digits-label--content: "Bruchstellen"; - --significant-digits-label--content: "Wichtige Ziffer"; - --year-label--content: "Jahr"; - --month-label--content: "Monat"; - --day-label--content: "Tag"; - --weekday-label--content: "Wochentag"; - --hour-label--content: "Stunde"; - --minute-label--content: "Minute"; - --second-label--content: "Zweite"; - --fractional-seconds-label--content: "Sekundenbruchteile"; - --hours-label--content: "12/24 Stunden"; - --aggregate-depth-label--content: "Gesamttiefe"; - - // Tabs - --style-tab-label--content: "Stil"; - --attributes-tab-label--content: "Attribute"; - --debug-tab-label--content: "Debug JSON"; -} diff --git a/rust/perspective-viewer/src/themes/intl/es.css b/rust/perspective-viewer/src/themes/intl/es.css new file mode 100644 index 0000000000..5a682c23a6 --- /dev/null +++ b/rust/perspective-viewer/src/themes/intl/es.css @@ -0,0 +1,102 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +perspective-viewer, +perspective-dropdown { + /* Config */ + --psp-label--group-by--content: "Agrupar por"; + --psp-label--split-by--content: "Dividir por"; + --psp-label--sort--content: "Ordenar por"; + --psp-label--filter--content: "Dónde"; + --psp-label--transpose-button--content: "Intercambio"; + --psp-label--config-button--content: "Configurar"; + --psp-label--all-columns--content: "Todas las columnas"; + --psp-label--untitled--content: "Intitulado"; + + /* Plugin names */ + --psp-plugin-name--datagrid--content: "Cuadrícula de datos"; + --psp-plugin-name--treemap--content: "Mapa de árbol"; + --psp-plugin-name--sunburst--content: "resplandor solar"; + --psp-plugin-name--heatmap--content: "Mapa de calor"; + --psp-plugin-name--x-bar--content: "Barra X"; + --psp-plugin-name--y-bar--content: "Y Bar"; + --psp-plugin-name--y-line--content: "Y Line"; + --psp-plugin-name--x-y-line--content: "Línea X/Y"; + --psp-plugin-name--x-y-scatter--content: "Dispersión X/Y"; + --psp-plugin-name--y-scatter--content: "Dispersión Y"; + --psp-plugin-name--y-area--content: "Y Area"; + --psp-plugin-name--ohlc--content: "Ay"; + --psp-plugin-name--candlestick--content: "Candelero"; + + /* Column Selector names */ + --psp-label--column-columns--content: "columnas"; + --psp-label--column-x-axis--content: "Eje X"; + --psp-label--column-y-axis--content: "Y Axis"; + --psp-label--column-color--content: "Color"; + --psp-label--column-size--content: "Tamaño"; + --psp-label--column-symbol--content: "Símbolo"; + --psp-label--column-label--content: "Etiqueta"; + --psp-label--column-tooltip--content: "Información sobre herramientas"; + --psp-label--add-expression-button--content: "Nueva columna"; + + /* Toolbar */ + --psp-label--no-results--content: "Columna no válida"; + --psp-datagrid--column-edit-button--content: "Editar"; + --psp-label--copy-button--content: "Copiar"; + --psp-label--export-button--content: "Exportar"; + --psp-label--reset-button--content: "Reiniciar"; + --psp-label--edit-mode-read-only--content: "Read Only"; + --psp-label--edit-mode-edit--content: "Text Edit"; + --psp-label--edit-mode-select-row--content: "Select Row"; + --psp-label--edit-mode-select-column--content: "Select Column"; + --psp-label--edit-mode-select-region--content: "Select Region"; + --psp-label--scroll-lock-toggle--content: "Desplazamiento libre"; + --psp-label--scroll-lock-alt-toggle--content: "Alinear desplazamiento"; + + /* Column Settings */ + --psp-label--color--content: "Color"; + --psp-label--format--content: "Formato"; + --psp-label--timezone--content: "Zona horaria"; + --psp-label--date-style--content: "Estilo de fecha"; + --psp-label--time-style--content: "Estilo de hora"; + --psp-label--foreground--content: "Primer plano"; + --psp-label--background--content: "Fondo"; + --psp-label--series--content: "Serie"; + --psp-label--color-range--content: "Gama de colores"; + --psp-label--style--content: "Estilo"; + --psp-label--minimum-integer-digits--content: "Dígitos enteros mínimos"; + --psp-label--rounding-increment--content: "Incremento de redondeo"; + --psp-label--notation--content: "Notación"; + --psp-label--use-grouping--content: "Usar agrupación"; + --psp-label--sign-display--content: "Visualización de letreros"; + --psp-label--max-value--content: "Valor máximo"; + --psp-label--rounding-priority--content: "Prioridad de redondeo"; + --psp-label--rounding-mode--content: "Modo de redondeo"; + --psp-label--trailing-zero-display--content: "Visualización del cero final"; + --psp-label--fractional-digits--content: "Dígitos fraccionarios"; + --psp-label--significant-digits--content: "Dígitos significantes"; + --psp-label--year--content: "Año"; + --psp-label--month--content: "Mes"; + --psp-label--day--content: "Día"; + --psp-label--weekday--content: "Día laborable"; + --psp-label--hour--content: "Hora"; + --psp-label--minute--content: "Minuto"; + --psp-label--second--content: "Segundo"; + --psp-label--fractional-seconds--content: "Segundos fraccionarios"; + --psp-label--hours--content: "12/24 Horas"; + --psp-label--aggregate-depth--content: "Profundidad agregada"; + + /* Tabs */ + --psp-label--style-tab--content: "Estilo"; + --psp-label--attributes-tab--content: "Atributos"; + --psp-label--debug-tab--content: "Debug JSON"; +} diff --git a/rust/perspective-viewer/src/themes/intl/es.less b/rust/perspective-viewer/src/themes/intl/es.less deleted file mode 100644 index 0e196770fa..0000000000 --- a/rust/perspective-viewer/src/themes/intl/es.less +++ /dev/null @@ -1,102 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -perspective-viewer, -perspective-dropdown { - // Config - --group-by-label--content: "Agrupar por"; - --split-by-label--content: "Dividir por"; - --sort-label--content: "Ordenar por"; - --filter-label--content: "Dónde"; - --transpose-button--content: "Intercambio"; - --config-button-icon--content: "Configurar"; - --all-columns-label--content: "Todas las columnas"; - --untitled--content: "Intitulado"; - - // Plugin names - --plugin-name-datagrid--content: "Cuadrícula de datos"; - --plugin-name-treemap--content: "Mapa de árbol"; - --plugin-name-sunburst--content: "resplandor solar"; - --plugin-name-heatmap--content: "Mapa de calor"; - --plugin-name-x-bar--content: "Barra X"; - --plugin-name-y-bar--content: "Y Bar"; - --plugin-name-y-line--content: "Y Line"; - --plugin-name-x-y-line--content: "Línea X/Y"; - --plugin-name-x-y-scatter--content: "Dispersión X/Y"; - --plugin-name-y-scatter--content: "Dispersión Y"; - --plugin-name-y-area--content: "Y Area"; - --plugin-name-ohlc--content: "Ay"; - --plugin-name-candlestick--content: "Candelero"; - - // Column Selector names - --column-selector-column-columns--content: "columnas"; - --column-selector-column-x-axis--content: "Eje X"; - --column-selector-column-y-axis--content: "Y Axis"; - --column-selector-column-color--content: "Color"; - --column-selector-column-size--content: "Tamaño"; - --column-selector-column-symbol--content: "Símbolo"; - --column-selector-column-label--content: "Etiqueta"; - --column-selector-column-tooltip--content: "Información sobre herramientas"; - --add-expression-button--content: "Nueva columna"; - - // Toolbar - --no-results--content: "Columna no válida"; - --datagrid-column-edit-button--content: "Editar"; - --copy-button--content: "Copiar"; - --export-button--content: "Exportar"; - --reset-button--content: "Reiniciar"; - --edit-mode--read-only--content: "Read Only"; - --edit-mode--edit--content: "Text Edit"; - --edit-mode--select-row--content: "Select Row"; - --edit-mode--select-column--content: "Select Column"; - --edit-mode--select-region--content: "Select Region"; - --scroll-lock-toggle--content: "Desplazamiento libre"; - --scroll-lock-alt-toggle--content: "Alinear desplazamiento"; - - // Column Settings - --color-label--content: "Color"; - --format-label--content: "Formato"; - --timezone-label--content: "Zona horaria"; - --date-style-label--content: "Estilo de fecha"; - --time-style-label--content: "Estilo de hora"; - --foreground-label--content: "Primer plano"; - --background-label--content: "Fondo"; - --series-label--content: "Serie"; - --color-range-label--content: "Gama de colores"; - --style-label--content: "Estilo"; - --minimum-integer-digits-label--content: "Dígitos enteros mínimos"; - --rounding-increment-label--content: "Incremento de redondeo"; - --notation-label--content: "Notación"; - --use-grouping-label--content: "Usar agrupación"; - --sign-display-label--content: "Visualización de letreros"; - --max-value-label--content: "Valor máximo"; - --rounding-priority-label--content: "Prioridad de redondeo"; - --rounding-mode-label--content: "Modo de redondeo"; - --trailing-zero-display-label--content: "Visualización del cero final"; - --fractional-digits-label--content: "Dígitos fraccionarios"; - --significant-digits-label--content: "Dígitos significantes"; - --year-label--content: "Año"; - --month-label--content: "Mes"; - --day-label--content: "Día"; - --weekday-label--content: "Día laborable"; - --hour-label--content: "Hora"; - --minute-label--content: "Minuto"; - --second-label--content: "Segundo"; - --fractional-seconds-label--content: "Segundos fraccionarios"; - --hours-label--content: "12/24 Horas"; - --aggregate-depth-label--content: "Profundidad agregada"; - - // Tabs - --style-tab-label--content: "Estilo"; - --attributes-tab-label--content: "Atributos"; - --debug-tab-label--content: "Debug JSON"; -} diff --git a/rust/perspective-viewer/src/themes/intl/fr.css b/rust/perspective-viewer/src/themes/intl/fr.css new file mode 100644 index 0000000000..69199901ea --- /dev/null +++ b/rust/perspective-viewer/src/themes/intl/fr.css @@ -0,0 +1,102 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +perspective-viewer, +perspective-dropdown { + /* Config */ + --psp-label--group-by--content: "Par groupe"; + --psp-label--split-by--content: "Divisé par"; + --psp-label--sort--content: "Commandé par"; + --psp-label--filter--content: "Où"; + --psp-label--transpose-button--content: "Échanger"; + --psp-label--config-button--content: "Configurer"; + --psp-label--all-columns--content: "Toutes les colonnes"; + --psp-label--untitled--content: "Sans titre"; + + /* Plugin names */ + --psp-plugin-name--datagrid--content: "Grille de données"; + --psp-plugin-name--treemap--content: "Treemap"; + --psp-plugin-name--sunburst--content: "Coup de soleil"; + --psp-plugin-name--heatmap--content: "Carte de chaleur"; + --psp-plugin-name--x-bar--content: "Barre X"; + --psp-plugin-name--y-bar--content: "Et le bar"; + --psp-plugin-name--y-line--content: "et ligne"; + --psp-plugin-name--x-y-line--content: "Ligne X/Y"; + --psp-plugin-name--x-y-scatter--content: "Dispersion X/Y"; + --psp-plugin-name--y-scatter--content: "Dispersion Y"; + --psp-plugin-name--y-area--content: "et la superficie"; + --psp-plugin-name--ohlc--content: "Aie"; + --psp-plugin-name--candlestick--content: "Chandelier"; + + /* Column Selector names */ + --psp-label--column-columns--content: "Colonnes"; + --psp-label--column-x-axis--content: "Axe X"; + --psp-label--column-y-axis--content: "Axe Y"; + --psp-label--column-color--content: "Couleur"; + --psp-label--column-size--content: "Taille"; + --psp-label--column-symbol--content: "Symbole"; + --psp-label--column-label--content: "Étiquette"; + --psp-label--column-tooltip--content: "Info-bulle"; + --psp-label--add-expression-button--content: "Nouvelle colonne"; + + /* Toolbar */ + --psp-label--no-results--content: "Colonne invalide"; + --psp-datagrid--column-edit-button--content: "Modifier"; + --psp-label--copy-button--content: "Copie"; + --psp-label--export-button--content: "Exporter"; + --psp-label--reset-button--content: "Réinitialiser"; + --psp-label--edit-mode-read-only--content: "Read Only"; + --psp-label--edit-mode-edit--content: "Text Edit"; + --psp-label--edit-mode-select-row--content: "Select Row"; + --psp-label--edit-mode-select-column--content: "Select Column"; + --psp-label--edit-mode-select-region--content: "Select Region"; + --psp-label--scroll-lock-toggle--content: "Défilement gratuit"; + --psp-label--scroll-lock-alt-toggle--content: "Aligner le défilement"; + + /* Column Settings */ + --psp-label--color--content: "Couleur"; + --psp-label--format--content: "Format"; + --psp-label--timezone--content: "Fuseau horaire"; + --psp-label--date-style--content: "Style de date"; + --psp-label--time-style--content: "Style temporel"; + --psp-label--foreground--content: "Premier plan"; + --psp-label--background--content: "Arrière-plan"; + --psp-label--series--content: "Série"; + --psp-label--color-range--content: "Gamme de couleurs"; + --psp-label--style--content: "Style"; + --psp-label--minimum-integer-digits--content: "Chiffres entiers minimaux"; + --psp-label--rounding-increment--content: "Incrément d'arrondi"; + --psp-label--notation--content: "Notation"; + --psp-label--use-grouping--content: "Utiliser le regroupement"; + --psp-label--sign-display--content: "Affichage des panneaux"; + --psp-label--max-value--content: "Valeur max"; + --psp-label--rounding-priority--content: "Priorité d'arrondi"; + --psp-label--rounding-mode--content: "Mode d'arrondi"; + --psp-label--trailing-zero-display--content: "Affichage du zéro final"; + --psp-label--fractional-digits--content: "Chiffres fractionnaires"; + --psp-label--significant-digits--content: "Chiffres significatifs"; + --psp-label--year--content: "Année"; + --psp-label--month--content: "Mois"; + --psp-label--day--content: "Jour"; + --psp-label--weekday--content: "Jour de la semaine"; + --psp-label--hour--content: "Heure"; + --psp-label--minute--content: "Minute"; + --psp-label--second--content: "Deuxième"; + --psp-label--fractional-seconds--content: "Fractions de secondes"; + --psp-label--hours--content: "12/24 heures"; + --psp-label--aggregate-depth--content: "Profondeur globale"; + + /* Tabs */ + --psp-label--style-tab--content: "Style"; + --psp-label--attributes-tab--content: "Les attributs"; + --psp-label--debug-tab--content: "Debug JSON"; +} diff --git a/rust/perspective-viewer/src/themes/intl/fr.less b/rust/perspective-viewer/src/themes/intl/fr.less deleted file mode 100644 index 9132ed1d79..0000000000 --- a/rust/perspective-viewer/src/themes/intl/fr.less +++ /dev/null @@ -1,102 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -perspective-viewer, -perspective-dropdown { - // Config - --group-by-label--content: "Par groupe"; - --split-by-label--content: "Divisé par"; - --sort-label--content: "Commandé par"; - --filter-label--content: "Où"; - --transpose-button--content: "Échanger"; - --config-button-icon--content: "Configurer"; - --all-columns-label--content: "Toutes les colonnes"; - --untitled--content: "Sans titre"; - - // Plugin names - --plugin-name-datagrid--content: "Grille de données"; - --plugin-name-treemap--content: "Treemap"; - --plugin-name-sunburst--content: "Coup de soleil"; - --plugin-name-heatmap--content: "Carte de chaleur"; - --plugin-name-x-bar--content: "Barre X"; - --plugin-name-y-bar--content: "Et le bar"; - --plugin-name-y-line--content: "et ligne"; - --plugin-name-x-y-line--content: "Ligne X/Y"; - --plugin-name-x-y-scatter--content: "Dispersion X/Y"; - --plugin-name-y-scatter--content: "Dispersion Y"; - --plugin-name-y-area--content: "et la superficie"; - --plugin-name-ohlc--content: "Aie"; - --plugin-name-candlestick--content: "Chandelier"; - - // Column Selector names - --column-selector-column-columns--content: "Colonnes"; - --column-selector-column-x-axis--content: "Axe X"; - --column-selector-column-y-axis--content: "Axe Y"; - --column-selector-column-color--content: "Couleur"; - --column-selector-column-size--content: "Taille"; - --column-selector-column-symbol--content: "Symbole"; - --column-selector-column-label--content: "Étiquette"; - --column-selector-column-tooltip--content: "Info-bulle"; - --add-expression-button--content: "Nouvelle colonne"; - - // Toolbar - --no-results--content: "Colonne invalide"; - --datagrid-column-edit-button--content: "Modifier"; - --copy-button--content: "Copie"; - --export-button--content: "Exporter"; - --reset-button--content: "Réinitialiser"; - --edit-mode--read-only--content: "Read Only"; - --edit-mode--edit--content: "Text Edit"; - --edit-mode--select-row--content: "Select Row"; - --edit-mode--select-column--content: "Select Column"; - --edit-mode--select-region--content: "Select Region"; - --scroll-lock-toggle--content: "Défilement gratuit"; - --scroll-lock-alt-toggle--content: "Aligner le défilement"; - - // Column Settings - --color-label--content: "Couleur"; - --format-label--content: "Format"; - --timezone-label--content: "Fuseau horaire"; - --date-style-label--content: "Style de date"; - --time-style-label--content: "Style temporel"; - --foreground-label--content: "Premier plan"; - --background-label--content: "Arrière-plan"; - --series-label--content: "Série"; - --color-range-label--content: "Gamme de couleurs"; - --style-label--content: "Style"; - --minimum-integer-digits-label--content: "Chiffres entiers minimaux"; - --rounding-increment-label--content: "Incrément d'arrondi"; - --notation-label--content: "Notation"; - --use-grouping-label--content: "Utiliser le regroupement"; - --sign-display-label--content: "Affichage des panneaux"; - --max-value-label--content: "Valeur max"; - --rounding-priority-label--content: "Priorité d'arrondi"; - --rounding-mode-label--content: "Mode d'arrondi"; - --trailing-zero-display-label--content: "Affichage du zéro final"; - --fractional-digits-label--content: "Chiffres fractionnaires"; - --significant-digits-label--content: "Chiffres significatifs"; - --year-label--content: "Année"; - --month-label--content: "Mois"; - --day-label--content: "Jour"; - --weekday-label--content: "Jour de la semaine"; - --hour-label--content: "Heure"; - --minute-label--content: "Minute"; - --second-label--content: "Deuxième"; - --fractional-seconds-label--content: "Fractions de secondes"; - --hours-label--content: "12/24 heures"; - --aggregate-depth-label--content: "Profondeur globale"; - - // Tabs - --style-tab-label--content: "Style"; - --attributes-tab-label--content: "Les attributs"; - --debug-tab-label--content: "Debug JSON"; -} diff --git a/rust/perspective-viewer/src/themes/intl/ja.css b/rust/perspective-viewer/src/themes/intl/ja.css new file mode 100644 index 0000000000..75da5592a8 --- /dev/null +++ b/rust/perspective-viewer/src/themes/intl/ja.css @@ -0,0 +1,102 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +perspective-viewer, +perspective-dropdown { + /* Config */ + --psp-label--group-by--content: "グループ化"; + --psp-label--split-by--content: "分割"; + --psp-label--sort--content: "注文方法"; + --psp-label--filter--content: "どこ"; + --psp-label--transpose-button--content: "スワップ"; + --psp-label--config-button--content: "構成、設定"; + --psp-label--all-columns--content: "すべての列"; + --psp-label--untitled--content: "無題"; + + /* Plugin names */ + --psp-plugin-name--datagrid--content: "データグリッド"; + --psp-plugin-name--treemap--content: "ツリーマップ"; + --psp-plugin-name--sunburst--content: "サンバースト"; + --psp-plugin-name--heatmap--content: "ヒートマップ"; + --psp-plugin-name--x-bar--content: "Xバー"; + --psp-plugin-name--y-bar--content: "アンドバー"; + --psp-plugin-name--y-line--content: "そしてライン"; + --psp-plugin-name--x-y-line--content: "X/Y ライン"; + --psp-plugin-name--x-y-scatter--content: "X/Y 散布図"; + --psp-plugin-name--y-scatter--content: "Y散布図"; + --psp-plugin-name--y-area--content: "とエリア"; + --psp-plugin-name--ohlc--content: "痛い"; + --psp-plugin-name--candlestick--content: "ローソク足"; + + /* Column Selector names */ + --psp-label--column-columns--content: "コラム"; + --psp-label--column-x-axis--content: "X軸"; + --psp-label--column-y-axis--content: "Y軸"; + --psp-label--column-color--content: "色"; + --psp-label--column-size--content: "サイズ"; + --psp-label--column-symbol--content: "シンボル"; + --psp-label--column-label--content: "ラベル"; + --psp-label--column-tooltip--content: "ツールチップ"; + --psp-label--add-expression-button--content: "新しい列"; + --psp-label--aggregate-depth--content: "集約の深さ"; + + /* Toolbar */ + --psp-label--no-results--content: "無効な列"; + --psp-datagrid--column-edit-button--content: "編集"; + --psp-label--copy-button--content: "コピー"; + --psp-label--export-button--content: "輸出"; + --psp-label--reset-button--content: "リセット"; + --psp-label--edit-mode-read-only--content: "Read Only"; + --psp-label--edit-mode-edit--content: "Text Edit"; + --psp-label--edit-mode-select-row--content: "Select Row"; + --psp-label--edit-mode-select-column--content: "Select Column"; + --psp-label--edit-mode-select-region--content: "Select Region"; + --psp-label--scroll-lock-toggle--content: "フリースクロ​​ール"; + --psp-label--scroll-lock-alt-toggle--content: "スクロールを揃える"; + + /* Column Settings */ + --psp-label--color--content: "色"; + --psp-label--format--content: "フォーマット"; + --psp-label--timezone--content: "タイムゾーン"; + --psp-label--date-style--content: "日付スタイル"; + --psp-label--time-style--content: "時間スタイル"; + --psp-label--foreground--content: "前景"; + --psp-label--background--content: "背景"; + --psp-label--series--content: "シリーズ"; + --psp-label--color-range--content: "色の範囲"; + --psp-label--style--content: "スタイル"; + --psp-label--minimum-integer-digits--content: "整数の最小桁数"; + --psp-label--rounding-increment--content: "丸め増分"; + --psp-label--notation--content: "表記"; + --psp-label--use-grouping--content: "グループ化を使用する"; + --psp-label--sign-display--content: "サインディスプレイ"; + --psp-label--max-value--content: "最大値"; + --psp-label--rounding-priority--content: "丸めの優先順位"; + --psp-label--rounding-mode--content: "丸めモード"; + --psp-label--trailing-zero-display--content: "末尾ゼロの表示"; + --psp-label--fractional-digits--content: "小数桁"; + --psp-label--significant-digits--content: "有効数字"; + --psp-label--year--content: "年"; + --psp-label--month--content: "月"; + --psp-label--day--content: "日"; + --psp-label--weekday--content: "平日"; + --psp-label--hour--content: "時間"; + --psp-label--minute--content: "分"; + --psp-label--second--content: "2番"; + --psp-label--fractional-seconds--content: "小数秒"; + --psp-label--hours--content: "12/24時間"; + + /* Tabs */ + --psp-label--style-tab--content: "スタイル"; + --psp-label--attributes-tab--content: "属性"; + --psp-label--debug-tab--content: "Debug JSON"; +} diff --git a/rust/perspective-viewer/src/themes/intl/ja.less b/rust/perspective-viewer/src/themes/intl/ja.less deleted file mode 100644 index 51a8eb4bdc..0000000000 --- a/rust/perspective-viewer/src/themes/intl/ja.less +++ /dev/null @@ -1,102 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -perspective-viewer, -perspective-dropdown { - // Config - --group-by-label--content: "グループ化"; - --split-by-label--content: "分割"; - --sort-label--content: "注文方法"; - --filter-label--content: "どこ"; - --transpose-button--content: "スワップ"; - --config-button-icon--content: "構成、設定"; - --all-columns-label--content: "すべての列"; - --untitled--content: "無題"; - - // Plugin names - --plugin-name-datagrid--content: "データグリッド"; - --plugin-name-treemap--content: "ツリーマップ"; - --plugin-name-sunburst--content: "サンバースト"; - --plugin-name-heatmap--content: "ヒートマップ"; - --plugin-name-x-bar--content: "Xバー"; - --plugin-name-y-bar--content: "アンドバー"; - --plugin-name-y-line--content: "そしてライン"; - --plugin-name-x-y-line--content: "X/Y ライン"; - --plugin-name-x-y-scatter--content: "X/Y 散布図"; - --plugin-name-y-scatter--content: "Y散布図"; - --plugin-name-y-area--content: "とエリア"; - --plugin-name-ohlc--content: "痛い"; - --plugin-name-candlestick--content: "ローソク足"; - - // Column Selector names - --column-selector-column-columns--content: "コラム"; - --column-selector-column-x-axis--content: "X軸"; - --column-selector-column-y-axis--content: "Y軸"; - --column-selector-column-color--content: "色"; - --column-selector-column-size--content: "サイズ"; - --column-selector-column-symbol--content: "シンボル"; - --column-selector-column-label--content: "ラベル"; - --column-selector-column-tooltip--content: "ツールチップ"; - --add-expression-button--content: "新しい列"; - --aggregate-depth-label--content: "集約の深さ"; - - // Toolbar - --no-results--content: "無効な列"; - --datagrid-column-edit-button--content: "編集"; - --copy-button--content: "コピー"; - --export-button--content: "輸出"; - --reset-button--content: "リセット"; - --edit-mode--read-only--content: "Read Only"; - --edit-mode--edit--content: "Text Edit"; - --edit-mode--select-row--content: "Select Row"; - --edit-mode--select-column--content: "Select Column"; - --edit-mode--select-region--content: "Select Region"; - --scroll-lock-toggle--content: "フリースクロ​​ール"; - --scroll-lock-alt-toggle--content: "スクロールを揃える"; - - // Column Settings - --color-label--content: "色"; - --format-label--content: "フォーマット"; - --timezone-label--content: "タイムゾーン"; - --date-style-label--content: "日付スタイル"; - --time-style-label--content: "時間スタイル"; - --foreground-label--content: "前景"; - --background-label--content: "背景"; - --series-label--content: "シリーズ"; - --color-range-label--content: "色の範囲"; - --style-label--content: "スタイル"; - --minimum-integer-digits-label--content: "整数の最小桁数"; - --rounding-increment-label--content: "丸め増分"; - --notation-label--content: "表記"; - --use-grouping-label--content: "グループ化を使用する"; - --sign-display-label--content: "サインディスプレイ"; - --max-value-label--content: "最大値"; - --rounding-priority-label--content: "丸めの優先順位"; - --rounding-mode-label--content: "丸めモード"; - --trailing-zero-display-label--content: "末尾ゼロの表示"; - --fractional-digits-label--content: "小数桁"; - --significant-digits-label--content: "有効数字"; - --year-label--content: "年"; - --month-label--content: "月"; - --day-label--content: "日"; - --weekday-label--content: "平日"; - --hour-label--content: "時間"; - --minute-label--content: "分"; - --second-label--content: "2番"; - --fractional-seconds-label--content: "小数秒"; - --hours-label--content: "12/24時間"; - - // Tabs - --style-tab-label--content: "スタイル"; - --attributes-tab-label--content: "属性"; - --debug-tab-label--content: "Debug JSON"; -} diff --git a/rust/perspective-viewer/src/themes/intl/pt.css b/rust/perspective-viewer/src/themes/intl/pt.css new file mode 100644 index 0000000000..d4575f0676 --- /dev/null +++ b/rust/perspective-viewer/src/themes/intl/pt.css @@ -0,0 +1,102 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +perspective-viewer, +perspective-dropdown { + /* Config */ + --psp-label--group-by--content: "Agrupar por"; + --psp-label--split-by--content: "Dividir por"; + --psp-label--sort--content: "Ordenar por"; + --psp-label--filter--content: "Onde"; + --psp-label--transpose-button--content: "Trocar"; + --psp-label--config-button--content: "Configurar"; + --psp-label--all-columns--content: "Todas as colunas"; + --psp-label--untitled--content: "Sem título"; + + /* Plugin names */ + --psp-plugin-name--datagrid--content: "Grade de dados"; + --psp-plugin-name--treemap--content: "Mapa de árvore"; + --psp-plugin-name--sunburst--content: "reluzente"; + --psp-plugin-name--heatmap--content: "Mapa de calor"; + --psp-plugin-name--x-bar--content: "Barra X"; + --psp-plugin-name--y-bar--content: "E Barra"; + --psp-plugin-name--y-line--content: "e linha"; + --psp-plugin-name--x-y-line--content: "Linha X/Y"; + --psp-plugin-name--x-y-scatter--content: "Dispersão X/Y"; + --psp-plugin-name--y-scatter--content: "Dispersão Y"; + --psp-plugin-name--y-area--content: "e área"; + --psp-plugin-name--ohlc--content: "Ai"; + --psp-plugin-name--candlestick--content: "Castiçal"; + + /* Column Selector names */ + --psp-label--column-columns--content: "Colunas"; + --psp-label--column-x-axis--content: "Eixo X"; + --psp-label--column-y-axis--content: "Eixo Y"; + --psp-label--column-color--content: "Cor"; + --psp-label--column-size--content: "Tamanho"; + --psp-label--column-symbol--content: "Símbolo"; + --psp-label--column-label--content: "Rótulo"; + --psp-label--column-tooltip--content: "Dica"; + --psp-label--add-expression-button--content: "Nova Coluna"; + + /* Toolbar */ + --psp-label--no-results--content: "Coluna inválida"; + --psp-datagrid--column-edit-button--content: "Editar"; + --psp-label--copy-button--content: "cópia de"; + --psp-label--export-button--content: "Exportar"; + --psp-label--reset-button--content: "Reiniciar"; + --psp-label--edit-mode-read-only--content: "Read Only"; + --psp-label--edit-mode-edit--content: "Text Edit"; + --psp-label--edit-mode-select-row--content: "Select Row"; + --psp-label--edit-mode-select-column--content: "Select Column"; + --psp-label--edit-mode-select-region--content: "Select Region"; + --psp-label--scroll-lock-toggle--content: "Rolagem Grátis"; + --psp-label--scroll-lock-alt-toggle--content: "Alinhar rolagem"; + + /* Column Settings */ + --psp-label--color--content: "Cor"; + --psp-label--format--content: "Formatar"; + --psp-label--timezone--content: "Fuso horário"; + --psp-label--date-style--content: "Estilo de data"; + --psp-label--time-style--content: "Estilo de tempo"; + --psp-label--foreground--content: "Primeiro plano"; + --psp-label--background--content: "Fundo"; + --psp-label--series--content: "Series"; + --psp-label--color-range--content: "Gama de cores"; + --psp-label--style--content: "Estilo"; + --psp-label--minimum-integer-digits--content: "Dígitos inteiros mínimos"; + --psp-label--rounding-increment--content: "Incremento de arredondamento"; + --psp-label--notation--content: "Notação"; + --psp-label--use-grouping--content: "Usar agrupamento"; + --psp-label--sign-display--content: "Exibição de sinalização"; + --psp-label--max-value--content: "Valor máximo"; + --psp-label--rounding-priority--content: "Prioridade de arredondamento"; + --psp-label--rounding-mode--content: "Modo de arredondamento"; + --psp-label--trailing-zero-display--content: "Exibição de zero à direita"; + --psp-label--fractional-digits--content: "Dígitos Fracionários"; + --psp-label--significant-digits--content: "Dígitos significantes"; + --psp-label--year--content: "Ano"; + --psp-label--month--content: "Mês"; + --psp-label--day--content: "Dia"; + --psp-label--weekday--content: "Dia da semana"; + --psp-label--hour--content: "Hora"; + --psp-label--minute--content: "Minuto"; + --psp-label--second--content: "Segundo"; + --psp-label--fractional-seconds--content: "Segundos fracionários"; + --psp-label--hours--content: "12/24 horas"; + --psp-label--aggregate-depth--content: "Profundidad agregada"; + + /* Tabs */ + --psp-label--style-tab--content: "Estilo"; + --psp-label--attributes-tab--content: "Atributos"; + --psp-label--debug-tab--content: "Debug JSON"; +} diff --git a/rust/perspective-viewer/src/themes/intl/pt.less b/rust/perspective-viewer/src/themes/intl/pt.less deleted file mode 100644 index c816f1e21d..0000000000 --- a/rust/perspective-viewer/src/themes/intl/pt.less +++ /dev/null @@ -1,102 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -perspective-viewer, -perspective-dropdown { - // Config - --group-by-label--content: "Agrupar por"; - --split-by-label--content: "Dividir por"; - --sort-label--content: "Ordenar por"; - --filter-label--content: "Onde"; - --transpose-button--content: "Trocar"; - --config-button-icon--content: "Configurar"; - --all-columns-label--content: "Todas as colunas"; - --untitled--content: "Sem título"; - - // Plugin names - --plugin-name-datagrid--content: "Grade de dados"; - --plugin-name-treemap--content: "Mapa de árvore"; - --plugin-name-sunburst--content: "reluzente"; - --plugin-name-heatmap--content: "Mapa de calor"; - --plugin-name-x-bar--content: "Barra X"; - --plugin-name-y-bar--content: "E Barra"; - --plugin-name-y-line--content: "e linha"; - --plugin-name-x-y-line--content: "Linha X/Y"; - --plugin-name-x-y-scatter--content: "Dispersão X/Y"; - --plugin-name-y-scatter--content: "Dispersão Y"; - --plugin-name-y-area--content: "e área"; - --plugin-name-ohlc--content: "Ai"; - --plugin-name-candlestick--content: "Castiçal"; - - // Column Selector names - --column-selector-column-columns--content: "Colunas"; - --column-selector-column-x-axis--content: "Eixo X"; - --column-selector-column-y-axis--content: "Eixo Y"; - --column-selector-column-color--content: "Cor"; - --column-selector-column-size--content: "Tamanho"; - --column-selector-column-symbol--content: "Símbolo"; - --column-selector-column-label--content: "Rótulo"; - --column-selector-column-tooltip--content: "Dica"; - --add-expression-button--content: "Nova Coluna"; - - // Toolbar - --no-results--content: "Coluna inválida"; - --datagrid-column-edit-button--content: "Editar"; - --copy-button--content: "cópia de"; - --export-button--content: "Exportar"; - --reset-button--content: "Reiniciar"; - --edit-mode--read-only--content: "Read Only"; - --edit-mode--edit--content: "Text Edit"; - --edit-mode--select-row--content: "Select Row"; - --edit-mode--select-column--content: "Select Column"; - --edit-mode--select-region--content: "Select Region"; - --scroll-lock-toggle--content: "Rolagem Grátis"; - --scroll-lock-alt-toggle--content: "Alinhar rolagem"; - - // Column Settings - --color-label--content: "Cor"; - --format-label--content: "Formatar"; - --timezone-label--content: "Fuso horário"; - --date-style-label--content: "Estilo de data"; - --time-style-label--content: "Estilo de tempo"; - --foreground-label--content: "Primeiro plano"; - --background-label--content: "Fundo"; - --series-label--content: "Series"; - --color-range-label--content: "Gama de cores"; - --style-label--content: "Estilo"; - --minimum-integer-digits-label--content: "Dígitos inteiros mínimos"; - --rounding-increment-label--content: "Incremento de arredondamento"; - --notation-label--content: "Notação"; - --use-grouping-label--content: "Usar agrupamento"; - --sign-display-label--content: "Exibição de sinalização"; - --max-value-label--content: "Valor máximo"; - --rounding-priority-label--content: "Prioridade de arredondamento"; - --rounding-mode-label--content: "Modo de arredondamento"; - --trailing-zero-display-label--content: "Exibição de zero à direita"; - --fractional-digits-label--content: "Dígitos Fracionários"; - --significant-digits-label--content: "Dígitos significantes"; - --year-label--content: "Ano"; - --month-label--content: "Mês"; - --day-label--content: "Dia"; - --weekday-label--content: "Dia da semana"; - --hour-label--content: "Hora"; - --minute-label--content: "Minuto"; - --second-label--content: "Segundo"; - --fractional-seconds-label--content: "Segundos fracionários"; - --hours-label--content: "12/24 horas"; - --aggregate-depth-label--content: "Profundidad agregada"; - - // Tabs - --style-tab-label--content: "Estilo"; - --attributes-tab-label--content: "Atributos"; - --debug-tab-label--content: "Debug JSON"; -} diff --git a/rust/perspective-viewer/src/themes/intl/zh.css b/rust/perspective-viewer/src/themes/intl/zh.css new file mode 100644 index 0000000000..076e7e0093 --- /dev/null +++ b/rust/perspective-viewer/src/themes/intl/zh.css @@ -0,0 +1,102 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +perspective-viewer, +perspective-dropdown { + /* Config */ + --psp-label--group-by--content: "通过...分组"; + --psp-label--split-by--content: "分割依据"; + --psp-label--sort--content: "订购依据"; + --psp-label--filter--content: "在哪里"; + --psp-label--transpose-button--content: "交换"; + --psp-label--config-button--content: "配置"; + --psp-label--all-columns--content: "所有栏目"; + --psp-label--untitled--content: "无标题"; + + /* Plugin names */ + --psp-plugin-name--datagrid--content: "数据网格"; + --psp-plugin-name--treemap--content: "树形图"; + --psp-plugin-name--sunburst--content: "旭日"; + --psp-plugin-name--heatmap--content: "热图"; + --psp-plugin-name--x-bar--content: "X吧"; + --psp-plugin-name--y-bar--content: "和酒吧"; + --psp-plugin-name--y-line--content: "和线"; + --psp-plugin-name--x-y-line--content: "X/Y线"; + --psp-plugin-name--x-y-scatter--content: "X/Y 散点图"; + --psp-plugin-name--y-scatter--content: "Y 散点图"; + --psp-plugin-name--y-area--content: "和面积"; + --psp-plugin-name--ohlc--content: "哎哟"; + --psp-plugin-name--candlestick--content: "烛台"; + + /* Column Selector names */ + --psp-label--column-columns--content: "列"; + --psp-label--column-x-axis--content: "X轴"; + --psp-label--column-y-axis--content: "Y轴"; + --psp-label--column-color--content: "颜色"; + --psp-label--column-size--content: "尺寸"; + --psp-label--column-symbol--content: "象征"; + --psp-label--column-label--content: "标签"; + --psp-label--column-tooltip--content: "工具提示"; + --psp-label--add-expression-button--content: "新专栏"; + + /* Toolbar */ + --psp-label--no-results--content: "无效列"; + --psp-datagrid--column-edit-button--content: "编辑"; + --psp-label--copy-button--content: "复制"; + --psp-label--export-button--content: "出口"; + --psp-label--reset-button--content: "重置"; + --psp-label--edit-mode-read-only--content: "Read Only"; + --psp-label--edit-mode-edit--content: "Text Edit"; + --psp-label--edit-mode-select-row--content: "Select Row"; + --psp-label--edit-mode-select-column--content: "Select Column"; + --psp-label--edit-mode-select-region--content: "Select Region"; + --psp-label--scroll-lock-toggle--content: "自由滚动"; + --psp-label--scroll-lock-alt-toggle--content: "对齐滚动"; + + /* Column Settings */ + --psp-label--color--content: "颜色"; + --psp-label--format--content: "格式"; + --psp-label--timezone--content: "时区"; + --psp-label--date-style--content: "日期样式"; + --psp-label--time-style--content: "时间风格"; + --psp-label--foreground--content: "前景"; + --psp-label--background--content: "背景"; + --psp-label--series--content: "系列"; + --psp-label--color-range--content: "颜色范围"; + --psp-label--style--content: "风格"; + --psp-label--minimum-integer-digits--content: "最小整数位数"; + --psp-label--rounding-increment--content: "舍入增量"; + --psp-label--notation--content: "符号"; + --psp-label--use-grouping--content: "使用分组"; + --psp-label--sign-display--content: "标志展示"; + --psp-label--max-value--content: "最大值"; + --psp-label--rounding-priority--content: "舍入优先级"; + --psp-label--rounding-mode--content: "舍入模式"; + --psp-label--trailing-zero-display--content: "尾随零显示"; + --psp-label--fractional-digits--content: "小数位"; + --psp-label--significant-digits--content: "有效数字"; + --psp-label--year--content: "年"; + --psp-label--month--content: "月"; + --psp-label--day--content: "天"; + --psp-label--weekday--content: "工作日"; + --psp-label--hour--content: "小时"; + --psp-label--minute--content: "分钟"; + --psp-label--second--content: "第二"; + --psp-label--fractional-seconds--content: "小数秒"; + --psp-label--hours--content: "12/24 小时"; + --psp-label--aggregate-depth--content: "聚合深度"; + + /* Tabs */ + --psp-label--style-tab--content: "风格"; + --psp-label--attributes-tab--content: "属性"; + --psp-label--debug-tab--content: "Debug JSON"; +} diff --git a/rust/perspective-viewer/src/themes/intl/zh.less b/rust/perspective-viewer/src/themes/intl/zh.less deleted file mode 100644 index a2ff217c50..0000000000 --- a/rust/perspective-viewer/src/themes/intl/zh.less +++ /dev/null @@ -1,102 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -perspective-viewer, -perspective-dropdown { - // Config - --group-by-label--content: "通过...分组"; - --split-by-label--content: "分割依据"; - --sort-label--content: "订购依据"; - --filter-label--content: "在哪里"; - --transpose-button--content: "交换"; - --config-button-icon--content: "配置"; - --all-columns-label--content: "所有栏目"; - --untitled--content: "无标题"; - - // Plugin names - --plugin-name-datagrid--content: "数据网格"; - --plugin-name-treemap--content: "树形图"; - --plugin-name-sunburst--content: "旭日"; - --plugin-name-heatmap--content: "热图"; - --plugin-name-x-bar--content: "X吧"; - --plugin-name-y-bar--content: "和酒吧"; - --plugin-name-y-line--content: "和线"; - --plugin-name-x-y-line--content: "X/Y线"; - --plugin-name-x-y-scatter--content: "X/Y 散点图"; - --plugin-name-y-scatter--content: "Y 散点图"; - --plugin-name-y-area--content: "和面积"; - --plugin-name-ohlc--content: "哎哟"; - --plugin-name-candlestick--content: "烛台"; - - // Column Selector names - --column-selector-column-columns--content: "列"; - --column-selector-column-x-axis--content: "X轴"; - --column-selector-column-y-axis--content: "Y轴"; - --column-selector-column-color--content: "颜色"; - --column-selector-column-size--content: "尺寸"; - --column-selector-column-symbol--content: "象征"; - --column-selector-column-label--content: "标签"; - --column-selector-column-tooltip--content: "工具提示"; - --add-expression-button--content: "新专栏"; - - // Toolbar - --no-results--content: "无效列"; - --datagrid-column-edit-button--content: "编辑"; - --copy-button--content: "复制"; - --export-button--content: "出口"; - --reset-button--content: "重置"; - --edit-mode--read-only--content: "Read Only"; - --edit-mode--edit--content: "Text Edit"; - --edit-mode--select-row--content: "Select Row"; - --edit-mode--select-column--content: "Select Column"; - --edit-mode--select-region--content: "Select Region"; - --scroll-lock-toggle--content: "自由滚动"; - --scroll-lock-alt-toggle--content: "对齐滚动"; - - // Column Settings - --color-label--content: "颜色"; - --format-label--content: "格式"; - --timezone-label--content: "时区"; - --date-style-label--content: "日期样式"; - --time-style-label--content: "时间风格"; - --foreground-label--content: "前景"; - --background-label--content: "背景"; - --series-label--content: "系列"; - --color-range-label--content: "颜色范围"; - --style-label--content: "风格"; - --minimum-integer-digits-label--content: "最小整数位数"; - --rounding-increment-label--content: "舍入增量"; - --notation-label--content: "符号"; - --use-grouping-label--content: "使用分组"; - --sign-display-label--content: "标志展示"; - --max-value-label--content: "最大值"; - --rounding-priority-label--content: "舍入优先级"; - --rounding-mode-label--content: "舍入模式"; - --trailing-zero-display-label--content: "尾随零显示"; - --fractional-digits-label--content: "小数位"; - --significant-digits-label--content: "有效数字"; - --year-label--content: "年"; - --month-label--content: "月"; - --day-label--content: "天"; - --weekday-label--content: "工作日"; - --hour-label--content: "小时"; - --minute-label--content: "分钟"; - --second-label--content: "第二"; - --fractional-seconds-label--content: "小数秒"; - --hours-label--content: "12/24 小时"; - --aggregate-depth-label--content: "聚合深度"; - - // Tabs - --style-tab-label--content: "风格"; - --attributes-tab-label--content: "属性"; - --debug-tab-label--content: "Debug JSON"; -} diff --git a/rust/perspective-viewer/src/themes/monokai.css b/rust/perspective-viewer/src/themes/monokai.css new file mode 100644 index 0000000000..9889d799be --- /dev/null +++ b/rust/perspective-viewer/src/themes/monokai.css @@ -0,0 +1,233 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +@import "./defaults.css"; + +perspective-viewer, +perspective-viewer[theme="Monokai"] { + --psp-theme-name: "Monokai"; +} + +perspective-viewer[theme="Monokai"] { + /* perspective-viewer-pro-dark--colors (overrides) */ + background-color: #242526; + color: white; + --psp--color: white; + --psp-active--color: #2770a9; + --psp-error--color: #ff9485; + --psp-inactive--color: #61656e; + --psp-inactive--border-color: #4c505b; + --psp--background-color: #242526; + --psp-active--background: rgba(39, 113, 170, 0.5); + --psp-expression--operator--color: #c5c9d0; + --psp-expression--function--color: #22a0ce; + --psp-expression--psp-error--color: rgb(255, 136, 136); + --psp-calendar--filter: invert(1); + --psp-warning--color: #242526; + --psp-warning--background: var(--psp--color); + + --psp-icon--select-arrow--mask-image: var( + --psp-icon--select-arrow-light--mask-image + ); + + --psp-icon--select-arrow-hover--mask-image: var( + --psp-icon--select-arrow-dark--mask-image + ); + + --psp-code-editor--symbol--color: white; + --psp-code-editor--literal--color: #7dc3f0; + --psp-code-editor--operator--color: rgb(23, 166, 123); + --psp-code-editor--comment--color: rgb(204, 120, 48); + --psp-code-editor--column--color: #e18ee1; + + /* perspective-viewer-pro-dark--datagrid (overrides) */ + --psp-datagrid--pos-cell--color: #7dc3f0; + --psp-datagrid--neg-cell--color: #ff9485; + + /* perspective-viewer-pro-dark--d3fc (overrides) */ + --psp-d3fc--legend--color: #c5c9d0; + --psp-d3fc--treemap--labels: white; + --psp-d3fc--treemap--hover-highlight: white; + --psp-d3fc--tooltip--color: white; + --psp-d3fc--axis-ticks--color: #c5c9d0; + --psp-d3fc--axis-lines--color: #61656e; + --psp-d3fc--gridline--color: #3b3f46; + --psp-d3fc--tooltip--background: rgba(42, 44, 47, 1); + --psp-d3fc--tooltip--border-color: #242526; + --psp-d3fc--legend--background: var(--psp--background-color); + --psp-d3fc--series--color: rgb(71, 120, 194); + --psp-d3fc--series-1--color: rgb(71, 120, 194); + --psp-d3fc--series-2--color: rgb(204, 120, 48); + --psp-d3fc--series-3--color: rgb(158, 84, 192); + --psp-d3fc--series-4--color: rgb(51, 150, 153); + --psp-d3fc--series-5--color: rgb(102, 114, 143); + --psp-d3fc--series-6--color: rgb(211, 103, 189); + --psp-d3fc--series-7--color: rgb(109, 124, 77); + --psp-d3fc--series-8--color: rgb(221, 99, 103); + --psp-d3fc--series-9--color: rgb(120, 104, 206); + --psp-d3fc--series-10--color: rgb(23, 166, 123); + --psp-d3fc--full-gradient--background: linear-gradient( + #dd6367 0%, + #242526 50%, + #3289c8 100% + ); + --psp-d3fc--pos-gradient--background: linear-gradient( + #242526 0%, + #3289c8 100% + ); + --psp-d3fc--neg-gradient--background: linear-gradient( + #dd6367 0%, + #242526 100% + ); + + /* perspective-viewer-pro-dark--openlayers (overrides) */ + --psp-openlayers--tile-url: "http://{a-c}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png"; + --psp-openlayers--attribution--filter: invert(1) hue-rotate(180deg); + --psp-openlayers--element--background: #212c2f; + --psp-openlayers--category-1--color: rgb(71, 120, 194); + --psp-openlayers--category-2--color: rgb(204, 120, 48); + --psp-openlayers--category-3--color: rgb(158, 84, 192); + --psp-openlayers--category-4--color: rgb(51, 150, 153); + --psp-openlayers--category-5--color: rgb(102, 114, 143); + --psp-openlayers--category-6--color: rgb(211, 103, 189); + --psp-openlayers--category-7--color: rgb(109, 124, 77); + --psp-openlayers--category-8--color: rgb(221, 99, 103); + --psp-openlayers--category-9--color: rgb(120, 104, 206); + --psp-openlayers--category-10--color: rgb(23, 166, 123); + --psp-openlayers--gradient--background: linear-gradient( + #dd6367 0%, + #242526 50%, + #3289c8 100% + ); + + /* perspective-viewer-monokai--colors */ + color: #d6d6d6; + background-color: #2d2a2e; + + --psp-active--color: #78dce8; + --psp-error--color: #ff6188; + --psp-inactive--color: #797979; + --psp-inactive--border-color: #666666; + --psp--background-color: #2d2a2e; + + /* Column type indicators */ + --psp-column-type--float--color: #78dce8; + --psp-column-type--string--color: #ff6188; + --psp-column-type--date--color: #a9dc76; + --psp-column-type--boolean--color: #ffd866; + + --psp-warning--background: #ffd866; + + /* perspective-viewer-monokai--datagrid */ + --psp-datagrid--pos-cell--color: #78dce8 !important; + --psp-datagrid--neg-cell--color: #ff6188 !important; + --psp-datagrid--border-color: #444444; + + /* FIXME: broken in shadow DOM */ + regular-table table tbody th:empty { + background: linear-gradient( + to right, + transparent 9px, + #444444 10px, + transparent 11px + ); + } + + /* perspective-viewer-monokai--d3fc */ + --psp-d3fc--treemap--labels: #d6d6d6; + --psp-d3fc--treemap--hover-highlight: #2d2a2e; + + --psp-d3fc--axis-ticks--color: #d6d6d6; + --psp-d3fc--gridline--color: #444444; + --psp-d3fc--series--color: #78dce8; + --psp-d3fc--series-1--color: #78dce8; + --psp-d3fc--series-2--color: #ff6188; + --psp-d3fc--series-3--color: #fc9867; + --psp-d3fc--series-4--color: #ffd866; + --psp-d3fc--series-5--color: #a9dc76; + + --psp-d3fc--series-6--color: #ab9df2; + --psp-d3fc--series-7--color: #66d9ef; + --psp-d3fc--series-8--color: #f92672; + --psp-d3fc--series-9--color: #fd971f; + --psp-d3fc--series-10--color: #e6db74; + --psp-d3fc--series-11--color: #a6e22e; + --psp-d3fc--series-12--color: #ae81ff; + + --psp-d3fc--neg-gradient--background: linear-gradient( + #272822 0%, + #ff6188 100% + ); + --psp-d3fc--pos-gradient--background: linear-gradient( + #272822 0%, + #78dce8 100% + ); + --psp-d3fc--full-gradient--background: linear-gradient( + #ff6188 0%, + #272822 50%, + #78dce8 100% + ); +} + +perspective-copy-menu[theme="Monokai"], +perspective-export-menu[theme="Monokai"], +perspective-dropdown[theme="Monokai"], +perspective-date-column-style[theme="Monokai"], +perspective-datetime-column-style[theme="Monokai"], +perspective-number-column-style[theme="Monokai"], +perspective-string-column-style[theme="Monokai"] { + /* perspective-viewer-pro-dark--colors (overrides) */ + background-color: #242526; + color: white; + --psp--color: white; + --psp-active--color: #2770a9; + --psp-error--color: #ff9485; + --psp-inactive--color: #61656e; + --psp-inactive--border-color: #4c505b; + --psp--background-color: #242526; + --psp-active--background: rgba(39, 113, 170, 0.5); + --psp-expression--operator--color: #c5c9d0; + --psp-expression--function--color: #22a0ce; + --psp-expression--psp-error--color: rgb(255, 136, 136); + --psp-calendar--filter: invert(1); + --psp-warning--color: #242526; + --psp-warning--background: var(--psp--color); + --psp-icon--select-arrow--mask-image: var( + --psp-icon--select-arrow-light--mask-image + ); + --psp-icon--select-arrow-hover--mask-image: var( + --psp-icon--select-arrow-dark--mask-image + ); + --psp-code-editor--symbol--color: white; + --psp-code-editor--literal--color: #7dc3f0; + --psp-code-editor--operator--color: rgb(23, 166, 123); + --psp-code-editor--comment--color: rgb(204, 120, 48); + --psp-code-editor--column--color: #e18ee1; + + border: 1px solid #4c505b; + + /* perspective-viewer-monokai--colors */ + color: #d6d6d6; + --psp-active--color: #78dce8; + --psp-error--color: #ff6188; + --psp-inactive--color: #797979; + --psp-inactive--border-color: #666666; + --psp--background-color: #2d2a2e; + --psp-column-type--float--color: #78dce8; + --psp-column-type--string--color: #ff6188; + --psp-column-type--date--color: #a9dc76; + --psp-column-type--boolean--color: #ffd866; + --psp-warning--background: #ffd866; + + background-color: #2d2a2e; + border: 1px solid #797979; +} diff --git a/rust/perspective-viewer/src/themes/monokai.less b/rust/perspective-viewer/src/themes/monokai.less deleted file mode 100644 index d4366045e5..0000000000 --- a/rust/perspective-viewer/src/themes/monokai.less +++ /dev/null @@ -1,107 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import "icons.less"; - -@import url("ref://pro-dark.less"); - -perspective-viewer, -perspective-viewer[theme="Monokai"] { - --theme-name: "Monokai"; -} - -perspective-viewer[theme="Monokai"] { - @include perspective-viewer-pro-dark; - @include perspective-viewer-monokai--colors; - @include perspective-viewer-monokai--datagrid; - @include perspective-viewer-monokai--d3fc; -} - -perspective-copy-menu[theme="Monokai"], -perspective-export-menu[theme="Monokai"], -perspective-dropdown[theme="Monokai"], -perspective-date-column-style[theme="Monokai"], -perspective-datetime-column-style[theme="Monokai"], -perspective-number-column-style[theme="Monokai"], -perspective-string-column-style[theme="Monokai"] { - @include perspective-modal-pro-dark; - @include perspective-viewer-monokai--colors; - - background-color: #2d2a2e; - border: 1px solid #797979; -} - -@mixin perspective-viewer-monokai--colors { - color: #d6d6d6; - background-color: #2d2a2e; - - --active--color: #78dce8; - --error--color: #ff6188; - --inactive--color: #797979; - --inactive--border-color: #666666; - --plugin--background: #2d2a2e; - - // Column type indicators - --float--column-type--color: #78dce8; - --string--column-type--color: #ff6188; - --date--column-type--color: #a9dc76; - --boolean--column-type--color: #ffd866; - - --warning--background: #ffd866; -} - -@mixin perspective-viewer-monokai--datagrid { - --rt-pos-cell--color: #78dce8 !important; - --rt-neg-cell--color: #ff6188 !important; - --rt--border-color: #444444; - - // FIXME: broken in shadow DOM. Can be fixed with a new custom property allowing empty header cell backgrounds - // to be styled - regular-table table tbody th:empty { - background: linear-gradient( - to right, - transparent 9px, - #444444 10px, - transparent 11px - ); - } -} - -@mixin perspective-viewer-monokai--d3fc { - --d3fc-treedata--labels: #d6d6d6; - --d3fc-treedata--hover-highlight: #2d2a2e; - - --d3fc-axis-ticks--color: #d6d6d6; - --d3fc-gridline--color: #444444; - --d3fc-series: #78dce8; - --d3fc-series-1: #78dce8; - --d3fc-series-2: #ff6188; - --d3fc-series-3: #fc9867; - --d3fc-series-4: #ffd866; - --d3fc-series-5: #a9dc76; - - --d3fc-series-6: #ab9df2; - --d3fc-series-7: #66d9ef; - --d3fc-series-8: #f92672; - --d3fc-series-9: #fd971f; - --d3fc-series-10: #e6db74; - --d3fc-series-11: #a6e22e; - --d3fc-series-12: #ae81ff; - - --d3fc-negative--gradient: linear-gradient(#272822 0%, #ff6188 100%); - --d3fc-positive--gradient: linear-gradient(#272822 0%, #78dce8 100%); - --d3fc-full--gradient: linear-gradient( - #ff6188 0%, - #272822 50%, - #78dce8 100% - ); -} diff --git a/rust/perspective-viewer/src/themes/pro-dark.css b/rust/perspective-viewer/src/themes/pro-dark.css new file mode 100644 index 0000000000..4286a765c7 --- /dev/null +++ b/rust/perspective-viewer/src/themes/pro-dark.css @@ -0,0 +1,158 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +@import "./defaults.css"; + +/* Register theme for auto-detection */ +perspective-viewer, +perspective-viewer[theme="Pro Dark"] { + --psp-theme-name: "Pro Dark"; +} + +perspective-viewer[theme="Pro Dark"] { + /* perspective-viewer-pro-dark--colors (overrides) */ + background-color: #242526; + color: white; + --psp--color: white; + --psp-active--color: #2770a9; + --psp-error--color: #ff9485; + --psp-inactive--color: #61656e; + --psp-inactive--border-color: #4c505b; + --psp--background-color: #242526; + --psp-active--background: rgba(39, 113, 170, 0.5); + --psp-expression--operator--color: #c5c9d0; + --psp-expression--function--color: #22a0ce; + --psp-expression--psp-error--color: rgb(255, 136, 136); + --psp-calendar--filter: invert(1); + --psp-warning--color: #242526; + --psp-warning--background: var(--psp--color); + + --psp-icon--select-arrow--mask-image: var( + --psp-icon--select-arrow-light--mask-image + ); + + --psp-icon--select-arrow-hover--mask-image: var( + --psp-icon--select-arrow-dark--mask-image + ); + + /* Syntax */ + --psp-code-editor--symbol--color: white; + --psp-code-editor--literal--color: #7dc3f0; + --psp-code-editor--operator--color: rgb(23, 166, 123); + --psp-code-editor--comment--color: rgb(204, 120, 48); + --psp-code-editor--column--color: #e18ee1; + + /* perspective-viewer-pro-dark--datagrid (overrides) */ + --psp-datagrid--pos-cell--color: #7dc3f0; + --psp-datagrid--neg-cell--color: #ff9485; + + /* perspective-viewer-pro-dark--d3fc (overrides) */ + --psp-d3fc--legend--color: #c5c9d0; + --psp-d3fc--treemap--labels: white; + --psp-d3fc--treemap--hover-highlight: white; + --psp-d3fc--tooltip--color: white; + --psp-d3fc--axis-ticks--color: #c5c9d0; + --psp-d3fc--axis-lines--color: #61656e; + --psp-d3fc--gridline--color: #3b3f46; + --psp-d3fc--tooltip--background: rgba(42, 44, 47, 1); + --psp-d3fc--tooltip--border-color: #242526; + --psp-d3fc--legend--background: var(--psp--background-color); + + --psp-d3fc--series--color: rgb(71, 120, 194); + --psp-d3fc--series-1--color: rgb(71, 120, 194); + --psp-d3fc--series-2--color: rgb(204, 120, 48); + --psp-d3fc--series-3--color: rgb(158, 84, 192); + --psp-d3fc--series-4--color: rgb(51, 150, 153); + --psp-d3fc--series-5--color: rgb(102, 114, 143); + --psp-d3fc--series-6--color: rgb(211, 103, 189); + --psp-d3fc--series-7--color: rgb(109, 124, 77); + --psp-d3fc--series-8--color: rgb(221, 99, 103); + --psp-d3fc--series-9--color: rgb(120, 104, 206); + --psp-d3fc--series-10--color: rgb(23, 166, 123); + + --psp-d3fc--full-gradient--background: linear-gradient( + #dd6367 0%, + #242526 50%, + #3289c8 100% + ); + + --psp-d3fc--pos-gradient--background: linear-gradient( + #242526 0%, + #3289c8 100% + ); + --psp-d3fc--neg-gradient--background: linear-gradient( + #dd6367 0%, + #242526 100% + ); + + /* perspective-viewer-pro-dark--openlayers (overrides) */ + --psp-openlayers--tile-url: "http://{a-c}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png"; + --psp-openlayers--attribution--filter: invert(1) hue-rotate(180deg); + --psp-openlayers--element--background: #212c2f; + --psp-openlayers--category-1--color: rgb(71, 120, 194); + --psp-openlayers--category-2--color: rgb(204, 120, 48); + --psp-openlayers--category-3--color: rgb(158, 84, 192); + --psp-openlayers--category-4--color: rgb(51, 150, 153); + --psp-openlayers--category-5--color: rgb(102, 114, 143); + --psp-openlayers--category-6--color: rgb(211, 103, 189); + --psp-openlayers--category-7--color: rgb(109, 124, 77); + --psp-openlayers--category-8--color: rgb(221, 99, 103); + --psp-openlayers--category-9--color: rgb(120, 104, 206); + --psp-openlayers--category-10--color: rgb(23, 166, 123); + --psp-openlayers--gradient--background: linear-gradient( + #dd6367 0%, + #242526 50%, + #3289c8 100% + ); +} + +perspective-copy-menu[theme="Pro Dark"], +perspective-export-menu[theme="Pro Dark"], +perspective-dropdown[theme="Pro Dark"], +perspective-date-column-style[theme="Pro Dark"], +perspective-datetime-column-style[theme="Pro Dark"], +perspective-number-column-style[theme="Pro Dark"], +perspective-string-column-style[theme="Pro Dark"] { + /* perspective-viewer-pro-dark--colors (overrides) */ + background-color: #242526; + color: white; + --psp--color: white; + --psp-active--color: #2770a9; + --psp-error--color: #ff9485; + --psp-inactive--color: #61656e; + --psp-inactive--border-color: #4c505b; + --psp--background-color: #242526; + --psp-active--background: rgba(39, 113, 170, 0.5); + --psp-expression--operator--color: #c5c9d0; + --psp-expression--function--color: #22a0ce; + --psp-expression--psp-error--color: rgb(255, 136, 136); + --psp-calendar--filter: invert(1); + --psp-warning--color: #242526; + --psp-warning--background: var(--psp--color); + + --psp-icon--select-arrow--mask-image: var( + --psp-icon--select-arrow-light--mask-image + ); + + --psp-icon--select-arrow-hover--mask-image: var( + --psp-icon--select-arrow-dark--mask-image + ); + + /* Syntax */ + --psp-code-editor--symbol--color: white; + --psp-code-editor--literal--color: #7dc3f0; + --psp-code-editor--operator--color: rgb(23, 166, 123); + --psp-code-editor--comment--color: rgb(204, 120, 48); + --psp-code-editor--column--color: #e18ee1; + + border: 1px solid #4c505b; +} diff --git a/rust/perspective-viewer/src/themes/pro-dark.less b/rust/perspective-viewer/src/themes/pro-dark.less deleted file mode 100644 index 0def888573..0000000000 --- a/rust/perspective-viewer/src/themes/pro-dark.less +++ /dev/null @@ -1,147 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import "icons.less"; -@import "intl.less"; - -@import url("ref://pro.less"); - -// Register theme for auto-detection -perspective-viewer, -perspective-viewer[theme="Pro Dark"] { - --theme-name: "Pro Dark"; -} - -perspective-viewer[theme="Pro Dark"] { - @include perspective-viewer-pro-dark; -} - -perspective-copy-menu[theme="Pro Dark"], -perspective-export-menu[theme="Pro Dark"], -perspective-dropdown[theme="Pro Dark"], -perspective-date-column-style[theme="Pro Dark"], -perspective-datetime-column-style[theme="Pro Dark"], -perspective-number-column-style[theme="Pro Dark"], -perspective-string-column-style[theme="Pro Dark"] { - @include perspective-modal-pro-dark; -} - -@mixin perspective-viewer-pro-dark { - @include perspective-viewer-pro; - @include perspective-viewer-pro-dark--colors; - @include perspective-viewer-pro-dark--datagrid; - @include perspective-viewer-pro-dark--d3fc; - @include perspective-viewer-pro-dark--openlayers; -} - -@mixin perspective-modal-pro-dark { - @include perspective-modal-pro; - @include perspective-viewer-pro-dark--colors; - - background-color: #242526; - border: 1px solid #4c505b; -} - -@mixin perspective-viewer-pro-dark--colors { - background-color: #242526; - color: white; - --icon--color: white; - --active--color: #2770a9; - --error--color: #ff9485; - --inactive--color: #61656e; - --inactive--border-color: #4c505b; - --plugin--background: #242526; - --modal-target--background: rgba(255, 255, 255, 0.05); - --active--background: rgba(39, 113, 170, 0.5); - --expression--operator-color: #c5c9d0; - --expression--function-color: #22a0ce; - --expression--error-color: rgb(255, 136, 136); - --calendar--filter: invert(1); - --warning--color: #242526; - --warning--background: var(--icon--color); - - --select-arrow--background-image: var( - --select-arrow-light--background-image - ); - - --select-arrow--hover--background-image: var( - --select-arrow-dark--background-image - ); - - // Syntax - --code-editor-symbol--color: white; - --code-editor-literal--color: #7dc3f0; - --code-editor-operator--color: rgb(23, 166, 123); - --code-editor-comment--color: rgb(204, 120, 48); - --code-editor-column--color: #e18ee1; - // --code-editor-unknown--color: rgb(204, 120, 48); -} - -@mixin perspective-viewer-pro-dark--openlayers { - --map-tile-url: "http://{a-c}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png"; - --map-attribution--filter: invert(1) hue-rotate(180deg); - --map-element-background: #212c2f; - --map-category-1: rgb(71, 120, 194); - --map-category-2: rgb(204, 120, 48); - --map-category-3: rgb(158, 84, 192); - --map-category-4: rgb(51, 150, 153); - --map-category-5: rgb(102, 114, 143); - --map-category-6: rgb(211, 103, 189); - --map-category-7: rgb(109, 124, 77); - --map-category-8: rgb(221, 99, 103); - --map-category-9: rgb(120, 104, 206); - --map-category-10: rgb(23, 166, 123); - --map-gradient: linear-gradient(#dd6367 0%, #242526 50%, #3289c8 100%); -} - -@mixin perspective-viewer-pro-dark--datagrid { - --rt-pos-cell--color: #7dc3f0; - --rt-neg-cell--color: #ff9485; -} - -@mixin perspective-viewer-pro-dark--d3fc { - --d3fc-legend--text: #c5c9d0; - --d3fc-treedata--labels: white; - --d3fc-treedata--hover-highlight: white; - --d3fc-tooltip--color: white; - --d3fc-axis-ticks--color: #c5c9d0; - --d3fc-axis--lines: #61656e; - --d3fc-gridline--color: #3b3f46; - --d3fc-tooltip--background: rgba(42, 44, 47, 1); - --d3fc-tooltip--border-color: #242526; - --d3fc-legend--background: var(--plugin--background); - - --d3fc-series: rgb(71, 120, 194); - --d3fc-series-1: rgb(71, 120, 194); - --d3fc-series-2: rgb(204, 120, 48); - --d3fc-series-3: rgb(158, 84, 192); - --d3fc-series-4: rgb(51, 150, 153); - --d3fc-series-5: rgb(102, 114, 143); - --d3fc-series-6: rgb(211, 103, 189); - --d3fc-series-7: rgb(109, 124, 77); - --d3fc-series-8: rgb(221, 99, 103); - --d3fc-series-9: rgb(120, 104, 206); - --d3fc-series-10: rgb(23, 166, 123); - - --d3fc-full--gradient: linear-gradient( - #dd6367 0%, - #242526 50%, - #3289c8 100% - ); - - --d3fc-positive--gradient: linear-gradient(#242526 0%, #3289c8 100%); - --d3fc-negative--gradient: linear-gradient(#dd6367 0%, #242526 100%); -} - -// :host select { -// background-image: url("../svg/dropdown-selector.svg"); -// } diff --git a/rust/perspective-viewer/src/themes/variables.less b/rust/perspective-viewer/src/themes/pro.css similarity index 54% rename from rust/perspective-viewer/src/themes/variables.less rename to rust/perspective-viewer/src/themes/pro.css index 1232f79132..a1944b460f 100644 --- a/rust/perspective-viewer/src/themes/variables.less +++ b/rust/perspective-viewer/src/themes/pro.css @@ -1,24 +1,18 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ -@green50: #70c77f; +@import "./defaults.css"; -@grey20: #eaedef; -@grey60: #c5c9d0; -@grey200: #61656e; -@grey300: #4c505b; -@grey400: #44484f; -@grey500: #3b3f46; -@grey600: #2f3136; -@grey700: #2a2c2f; -@grey800: #242526; -@grey900: #161616; \ No newline at end of file +perspective-viewer, +perspective-viewer[theme="Pro Light"] { + --psp-theme-name: "Pro Light"; +} diff --git a/rust/perspective-viewer/src/themes/pro.less b/rust/perspective-viewer/src/themes/pro.less deleted file mode 100644 index 1f33679893..0000000000 --- a/rust/perspective-viewer/src/themes/pro.less +++ /dev/null @@ -1,186 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import "icons.less"; -@import "intl.less"; - -// Register theme for auto-detection -perspective-viewer, -perspective-viewer[theme="Pro Light"] { - --theme-name: "Pro Light"; -} - -perspective-viewer[theme="Pro Light"] { - @include perspective-viewer-pro; -} - -perspective-copy-menu[theme="Pro Light"], -perspective-export-menu[theme="Pro Light"], -perspective-dropdown[theme="Pro Light"], -perspective-date-column-style[theme="Pro Light"], -perspective-datetime-column-style[theme="Pro Light"], -perspective-number-column-style[theme="Pro Light"], -perspective-string-column-style[theme="Pro Light"] { - @include perspective-modal-pro; - background-color: white; -} - -@mixin perspective-viewer-pro { - @include perspective-viewer-pro--dimensions; - @include perspective-viewer-pro--colors; - @include perspective-viewer-pro--fonts; - @include perspective-viewer-pro--d3fc; - @include perspective-viewer-pro--datagrid; - @include perspective-viewer-pro--openlayers; -} - -@mixin perspective-modal-pro { - font-family: "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", - "Consolas", "Liberation Mono", monospace; - background-color: white; - border: 1px solid var(--inactive--color); - border-radius: 0 0 2px 2px; - --column-style-pos-color--content: "+"; - --column-style-neg-color--content: "-"; - --save-button-icon--content: "save"; - --reset-button-icon--content: "refresh"; - - @include perspective-viewer-pro--fonts; - @include perspective-viewer-pro--colors; -} - -@mixin perspective-viewer-pro--dimensions { - --button--font-size: 16px; - --config-button--padding: 15px 8px 6px 8px; - --column-drop-label--font-size: 8px; - --column-drop-container--padding: 0px; - --column-selector--width: 20px; - --column-selector--font-size: 16px; - - // 3 char width in 'Roboto Mono' - --column_type--width: 25px; - - --select--padding: 0px; - --top-panel-row--display: inline-flex; - --button--min-width: 33px; -} - -@mixin perspective-viewer-pro--colors { - color: #161616; - background-color: transparent; - --icon--color: #161616; - --inactive--color: #ababab; - --inactive--border-color: #dadada; - - --root--background: #ffffff; - --active--color: #2670a9; - --error--color: #ff471e; - --plugin--background: #ffffff; - --overflow-hint-icon--color: rgba(0, 0, 0, 0.2); - --select--background-color: none; - --column-drop-container--background: none; - --warning--background: #042121; - --warning--color: #fdfffd; - - --select-arrow--background-image: var( - --select-arrow-dark--background-image - ); - - --select-arrow--hover--background-image: var( - --select-arrow-light--background-image - ); - - // TODO deprecate me - --overflow-hint-icon--color: #fdfffd; -} - -@mixin perspective-viewer-pro--fonts { - font-family: "ui-monospace", "SFMono-Regular", "SF Mono", "Menlo", - "Consolas", "Liberation Mono", monospace; - --interface-monospace--font-family: "ui-monospace", "SFMono-Regular", - "SF Mono", "Menlo", "Consolas", "Liberation Mono", monospace; -} - -@mixin perspective-viewer-pro--d3fc { - --d3fc-y1-label--content: "arrow_upward"; - --d3fc-y2-label--content: "arrow_downward"; - --d3fc-treedata-axis--lines: none; - --d3fc-tooltip--background--color: rgba(155, 155, 155, 0.8); - --d3fc-tooltip--color: #161616; - --d3fc-tooltip--border-color: #fff; - --d3fc-tooltip--box-shadow: 0 2px 4px 0 rgb(0 0 0 / 10%); - --d3fc-gridline--color: #eaedef; - --d3fc-axis-ticks--color: #161616; - --d3fc-axis--lines: #c5c9d0; - --d3fc-legend--background: var(--plugin--background); - --d3fc-series: rgba(31, 119, 180, 0.8); - --d3fc-series-1: #0366d6; - --d3fc-series-2: #ff7f0e; - --d3fc-series-3: #2ca02c; - --d3fc-series-4: #d62728; - --d3fc-series-5: #9467bd; - --d3fc-series-6: #8c564b; - --d3fc-series-7: #e377c2; - --d3fc-series-8: #7f7f7f; - --d3fc-series-9: #bcbd22; - --d3fc-series-10: #17becf; - --d3fc-full--gradient: linear-gradient( - #4d342f 0%, - #e4521b 22.5%, - #feeb65 42.5%, - #f0f0f0 50%, - #dcedc8 57.5%, - #42b3d5 67.5%, - #1a237e 100% - ); - --d3fc-positive--gradient: linear-gradient( - #f0f0f0 0%, - #dcedc8 10%, - #42b3d5 50%, - #1a237e 100% - ); - --d3fc-negative--gradient: linear-gradient( - #4d342f 0%, - #e4521b 50%, - #feeb65 90%, - #f0f0f0 100% - ); -} - -@mixin perspective-viewer-pro--openlayers { - --map-tile-url: "http://{a-c}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png"; - --map-element-background: #fff; - --map-category-1: #0366d6; - --map-category-2: #ff7f0e; - --map-category-3: #2ca02c; - --map-category-4: #d62728; - --map-category-5: #9467bd; - --map-category-6: #8c564b; - --map-category-7: #e377c2; - --map-category-8: #7f7f7f; - --map-category-9: #bcbd22; - --map-category-10: #17becf; - --map-gradient: linear-gradient( - #4d342f 0%, - #e4521b 22.5%, - #feeb65 42.5%, - #f0f0f0 50%, - #dcedc8 57.5%, - #42b3d5 67.5%, - #1a237e 100% - ); -} - -@mixin perspective-viewer-pro--datagrid { - --rt-pos-cell--color: #338dcd; - --rt-neg-cell--color: #ff471e; -} diff --git a/rust/perspective-viewer/src/themes/solarized-dark.css b/rust/perspective-viewer/src/themes/solarized-dark.css new file mode 100644 index 0000000000..e6ad29be69 --- /dev/null +++ b/rust/perspective-viewer/src/themes/solarized-dark.css @@ -0,0 +1,135 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +@import "./defaults.css"; + +perspective-viewer, +perspective-viewer[theme="Solarized Dark"] { + --psp-theme-name: "Solarized Dark"; +} + +perspective-viewer[theme="Solarized Dark"] { + /* perspective-viewer-solarized--colors */ + color: #586e75; + background-color: #eee8d5; + --psp--color: #586e75; + --psp-active--color: #268bd2; + --psp-error--color: #cb4b16; + --psp-inactive--color: #93a1a1; + --psp-inactive--border-color: var(--psp-inactive--color); + --psp--background-color: #fdf6e3; + --psp-column-type--float--color: #268bd2; + --psp-column-type--string--color: #cb4b16; + --psp-column-type--date--color: #2aa198; + --psp-column-type--boolean--color: #b58900; + + /* perspective-viewer-solarized--datagrid */ + --psp-datagrid--pos-cell--color: #268bd2 !important; + --psp-datagrid--neg-cell--color: #cb4b16 !important; + --psp-datagrid--hover--border-color: #ccc; + --psp-datagrid--border-color: #93a1a1; + + /* perspective-viewer-solarized--d3fc */ + --psp-d3fc--treemap--labels: black; + --psp-d3fc--treemap--hover-highlight: black; + --psp-d3fc--axis-ticks--color: #586e75; + --psp-d3fc--gridline--color: #eee8d5; + --psp-d3fc--series--color: #268bd2; + --psp-d3fc--series-1--color: #268bd2; + --psp-d3fc--series-2--color: #cb4b16; + --psp-d3fc--series-3--color: #b58900; + --psp-d3fc--series-4--color: #859900; + --psp-d3fc--series-5--color: #2aa198; + --psp-d3fc--series-6--color: #6c71c4; + --psp-d3fc--series-7--color: #d33682; + --psp-d3fc--pos-gradient--background: linear-gradient( + #268bd2 0%, + #2aa198, + #859900, + #b58900, + #cb4b16, + #dc322f, + #d33682 100% + ); + + /* perspective-viewer-solarized-dark--colors */ + color: #93a1a1; + background-color: #002b36; + + --psp-inactive--color: #586e75; + --psp-inactive--border-color: var(--psp-inactive--color); + --psp--background-color: #073642; + + --psp-icon--select-arrow--mask-image: var( + --psp-icon--select-arrow-light--mask-image + ); + + --psp-icon--select-arrow-hover--mask-image: var( + --psp-icon--select-arrow-dark--mask-image + ); + + /* perspective-viewer-solarized-dark--d3fc */ + --psp-d3fc--treemap--labels: white; + --psp-d3fc--treemap--hover-highlight: white; + --psp-d3fc--axis-ticks--color: #93a1a1; + --psp-d3fc--axis-lines--color: #93a1a1; + --psp-d3fc--gridline--color: #002b36; + --psp-d3fc--legend--color: #93a1a1; + + --psp-d3fc--full-gradient--background: linear-gradient( + #cb4b16 0%, + #073642 50%, + #268bd2 100% + ); + + --psp-d3fc--neg-gradient--background: linear-gradient( + #cb4b16 0%, + #073642 100% + ); +} + +perspective-copy-menu[theme="Solarized Dark"], +perspective-export-menu[theme="Solarized Dark"], +perspective-dropdown[theme="Solarized Dark"], +perspective-date-column-style[theme="Solarized Dark"], +perspective-datetime-column-style[theme="Solarized Dark"], +perspective-number-column-style[theme="Solarized Dark"], +perspective-string-column-style[theme="Solarized Dark"] { + /* perspective-viewer-solarized--colors */ + color: #586e75; + --psp--color: #586e75; + --psp-active--color: #268bd2; + --psp-error--color: #cb4b16; + --psp-inactive--color: #93a1a1; + --psp-inactive--border-color: var(--psp-inactive--color); + --psp--background-color: #fdf6e3; + --psp-column-type--float--color: #268bd2; + --psp-column-type--string--color: #cb4b16; + --psp-column-type--date--color: #2aa198; + --psp-column-type--boolean--color: #b58900; + + /* perspective-viewer-solarized-dark--colors */ + color: #93a1a1; + --psp-inactive--color: #586e75; + --psp-inactive--border-color: var(--psp-inactive--color); + --psp--background-color: #073642; + + --psp-icon--select-arrow--mask-image: var( + --psp-icon--select-arrow-light--mask-image + ); + + --psp-icon--select-arrow-hover--mask-image: var( + --psp-icon--select-arrow-dark--mask-image + ); + + background-color: #073642; +} diff --git a/rust/perspective-viewer/src/themes/solarized-dark.less b/rust/perspective-viewer/src/themes/solarized-dark.less deleted file mode 100644 index ccdacdf9e9..0000000000 --- a/rust/perspective-viewer/src/themes/solarized-dark.less +++ /dev/null @@ -1,78 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import "icons.less"; - -@import url("ref://pro-dark.less"); -@import url("ref://solarized.less"); - -perspective-viewer, -perspective-viewer[theme="Solarized Dark"] { - --theme-name: "Solarized Dark"; -} - -perspective-viewer[theme="Solarized Dark"] { - @include perspective-viewer-pro-dark--colors; - @include perspective-viewer-solarized; - @include perspective-viewer-solarized-dark--colors; - // @include perspective-viewer-solarized-dark--datagrid; - @include perspective-viewer-solarized-dark--d3fc; -} - -perspective-copy-menu[theme="Solarized Dark"], -perspective-export-menu[theme="Solarized Dark"], -perspective-dropdown[theme="Solarized Dark"], -perspective-date-column-style[theme="Solarized Dark"], -perspective-datetime-column-style[theme="Solarized Dark"], -perspective-number-column-style[theme="Solarized Dark"], -perspective-string-column-style[theme="Solarized Dark"] { - @include perspective-modal-solarized; - @include perspective-viewer-solarized-dark--colors; - background-color: #073642; -} - -@mixin perspective-viewer-solarized-dark--colors { - color: #93a1a1; - background-color: #002b36; - - --inactive--color: #586e75; - --inactive--border-color: var(--inactive--color); - --plugin--background: #073642; - - --select-arrow--background-image: var( - --select-arrow-light--background-image - ); - - --select-arrow--hover--background-image: var( - --select-arrow-dark--background-image - ); -} - -// @mixin perspective-viewer-solarized-dark--datagrid {} - -@mixin perspective-viewer-solarized-dark--d3fc { - --d3fc-treedata--labels: white; - --d3fc-treedata--hover-highlight: white; - --d3fc-axis-ticks--color: #93a1a1; - --d3fc-axis--lines: #93a1a1; - --d3fc-gridline--color: #002b36; - --d3fc-legend--text: #93a1a1; - - --d3fc-full--gradient: linear-gradient( - #cb4b16 0%, - #073642 50%, - #268bd2 100% - ); - - // --d3fc-positive--gradient: linear-gradient(#073642 0%, #268bd2 100%); - --d3fc-negative--gradient: linear-gradient(#cb4b16 0%, #073642 100%); -} diff --git a/rust/perspective-viewer/src/themes/solarized.css b/rust/perspective-viewer/src/themes/solarized.css new file mode 100644 index 0000000000..fb97969abc --- /dev/null +++ b/rust/perspective-viewer/src/themes/solarized.css @@ -0,0 +1,95 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +@import "./defaults.css"; + +perspective-viewer, +perspective-viewer[theme="Solarized"] { + --psp-theme-name: "Solarized"; +} + +perspective-viewer[theme="Solarized"] { + /* perspective-viewer-solarized--colors */ + color: #586e75; + background-color: #eee8d5; + --psp--color: #586e75; + --psp-active--color: #268bd2; + --psp-error--color: #cb4b16; + --psp-inactive--color: #93a1a1; + --psp-inactive--border-color: var(--psp-inactive--color); + --psp--background-color: #fdf6e3; + + /* Column type indicators */ + --psp-column-type--float--color: #268bd2; + --psp-column-type--string--color: #cb4b16; + --psp-column-type--date--color: #2aa198; + --psp-column-type--boolean--color: #b58900; + + /* perspective-viewer-solarized--datagrid */ + --psp-datagrid--pos-cell--color: #268bd2 !important; + --psp-datagrid--neg-cell--color: #cb4b16 !important; + --psp-datagrid--hover--border-color: #ccc; + --psp-datagrid--border-color: #93a1a1; + + /* perspective-viewer-solarized--d3fc */ + --psp-d3fc--treemap--labels: black; + --psp-d3fc--treemap--hover-highlight: black; + + --psp-d3fc--axis-ticks--color: #586e75; + --psp-d3fc--gridline--color: #eee8d5; + --psp-d3fc--series--color: #268bd2; + --psp-d3fc--series-1--color: #268bd2; + --psp-d3fc--series-2--color: #cb4b16; + --psp-d3fc--series-3--color: #b58900; + --psp-d3fc--series-4--color: #859900; + --psp-d3fc--series-5--color: #2aa198; + + --psp-d3fc--series-6--color: #6c71c4; + --psp-d3fc--series-7--color: #d33682; + + --psp-d3fc--pos-gradient--background: linear-gradient( + #268bd2 0%, + #2aa198, + #859900, + #b58900, + #cb4b16, + #dc322f, + #d33682 100% + ); +} + +x { + color: #cb4b16; +} + +perspective-copy-menu[theme="Solarized"], +perspective-export-menu[theme="Solarized"], +perspective-dropdown[theme="Solarized"], +perspective-date-column-style[theme="Solarized"], +perspective-datetime-column-style[theme="Solarized"], +perspective-number-column-style[theme="Solarized"], +perspective-string-column-style[theme="Solarized"] { + /* perspective-viewer-solarized--colors */ + color: #586e75; + --psp--color: #586e75; + --psp-active--color: #268bd2; + --psp-error--color: #cb4b16; + --psp-inactive--color: #93a1a1; + --psp-inactive--border-color: var(--psp-inactive--color); + --psp--background-color: #fdf6e3; + --psp-column-type--float--color: #268bd2; + --psp-column-type--string--color: #cb4b16; + --psp-column-type--date--color: #2aa198; + --psp-column-type--boolean--color: #b58900; + + background-color: #fdf6e3; +} diff --git a/rust/perspective-viewer/src/themes/solarized.less b/rust/perspective-viewer/src/themes/solarized.less deleted file mode 100644 index 5b984b21aa..0000000000 --- a/rust/perspective-viewer/src/themes/solarized.less +++ /dev/null @@ -1,102 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import "icons.less"; - -@import url("ref://pro.less"); - -perspective-viewer, -perspective-viewer[theme="Solarized"] { - --theme-name: "Solarized"; -} - -perspective-viewer[theme="Solarized"] { - @include perspective-viewer-solarized; -} - -perspective-copy-menu[theme="Solarized"], -perspective-export-menu[theme="Solarized"], -perspective-dropdown[theme="Solarized"], -perspective-date-column-style[theme="Solarized"], -perspective-datetime-column-style[theme="Solarized"], -perspective-number-column-style[theme="Solarized"], -perspective-string-column-style[theme="Solarized"] { - @include perspective-modal-solarized; -} - -@mixin perspective-modal-solarized { - @include perspective-modal-pro; - @include perspective-viewer-solarized--colors; - - background-color: #fdf6e3; -} - -@mixin perspective-viewer-solarized { - @include perspective-viewer-pro; - @include perspective-viewer-solarized--colors; - @include perspective-viewer-solarized--datagrid; - @include perspective-viewer-solarized--d3fc; -} - -@mixin perspective-viewer-solarized--colors { - color: #586e75; - background-color: #eee8d5; - --icon--color: #586e75; - --active--color: #268bd2; - --error--color: #cb4b16; - --inactive--color: #93a1a1; - --inactive--border-color: var(--inactive--color); - --plugin--background: #fdf6e3; - - // Column type indicators - --float--column-type--color: #268bd2; - --string--column-type--color: #cb4b16; - --date--column-type--color: #2aa198; - --boolean--column-type--color: #b58900; -} - -@mixin perspective-viewer-solarized--datagrid { - --rt-pos-cell--color: #268bd2 !important; - --rt-neg-cell--color: #cb4b16 !important; - --rt-hover--border-color: #ccc; - --rt--border-color: #93a1a1; -} -x { - color: #cb4b16; -} - -@mixin perspective-viewer-solarized--d3fc { - --d3fc-treedata--labels: black; - --d3fc-treedata--hover-highlight: black; - - --d3fc-axis-ticks--color: #586e75; - --d3fc-gridline--color: #eee8d5; - --d3fc-series: #268bd2; - --d3fc-series-1: #268bd2; - --d3fc-series-2: #cb4b16; - --d3fc-series-3: #b58900; - --d3fc-series-4: #859900; - --d3fc-series-5: #2aa198; - - --d3fc-series-6: #6c71c4; - --d3fc-series-7: #d33682; - - --d3fc-positive--gradient: linear-gradient( - #268bd2 0%, - #2aa198, - #859900, - #b58900, - #cb4b16, - #dc322f, - #d33682 100% - ); -} diff --git a/rust/perspective-viewer/src/themes/themes.less b/rust/perspective-viewer/src/themes/themes.css similarity index 53% rename from rust/perspective-viewer/src/themes/themes.less rename to rust/perspective-viewer/src/themes/themes.css index 13cb32aa5a..cfed720ef4 100644 --- a/rust/perspective-viewer/src/themes/themes.less +++ b/rust/perspective-viewer/src/themes/themes.css @@ -1,22 +1,22 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ -@import "pro.less"; -@import "pro-dark.less"; -@import "monokai.less"; -@import "solarized.less"; -@import "solarized-dark.less"; -@import "vaporwave.less"; -@import "gruvbox.less"; -@import "gruvbox-dark.less"; -@import "dracula.less"; -@import "botanical.less"; \ No newline at end of file +@import "./pro.css"; +@import "./pro-dark.css"; +@import "./monokai.css"; +@import "./solarized.css"; +@import "./solarized-dark.css"; +@import "./vaporwave.css"; +@import "./gruvbox.css"; +@import "./gruvbox-dark.css"; +@import "./dracula.css"; +@import "./botanical.css"; diff --git a/rust/perspective-viewer/src/themes/vaporwave.css b/rust/perspective-viewer/src/themes/vaporwave.css new file mode 100644 index 0000000000..a423cdf9db --- /dev/null +++ b/rust/perspective-viewer/src/themes/vaporwave.css @@ -0,0 +1,256 @@ +/* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ + * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ + * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ + * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ + * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ + * ┃ Copyright (c) 2017, the Perspective Authors. ┃ + * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ + * ┃ This file is part of the Perspective library, distributed under the terms ┃ + * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ + * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */ + +@import "./defaults.css"; + +perspective-viewer, +perspective-viewer[theme="Vaporwave"] { + --psp-theme-name: "Vaporwave"; +} + +perspective-viewer[theme="Vaporwave"] { + /* perspective-viewer-pro-dark--colors (overrides) */ + background-color: #242526; + color: white; + --psp--color: white; + --psp-active--color: #2770a9; + --psp-error--color: #ff9485; + --psp-inactive--color: #61656e; + --psp-inactive--border-color: #4c505b; + --psp--background-color: #242526; + --psp-active--background: rgba(39, 113, 170, 0.5); + --psp-expression--operator--color: #c5c9d0; + --psp-expression--function--color: #22a0ce; + --psp-expression--psp-error--color: rgb(255, 136, 136); + --psp-calendar--filter: invert(1); + --psp-warning--color: #242526; + --psp-warning--background: var(--psp--color); + + --psp-icon--select-arrow--mask-image: var( + --psp-icon--select-arrow-light--mask-image + ); + + --psp-icon--select-arrow-hover--mask-image: var( + --psp-icon--select-arrow-dark--mask-image + ); + + --psp-code-editor--symbol--color: white; + --psp-code-editor--literal--color: #7dc3f0; + --psp-code-editor--operator--color: rgb(23, 166, 123); + --psp-code-editor--comment--color: rgb(204, 120, 48); + --psp-code-editor--column--color: #e18ee1; + + /* perspective-viewer-pro-dark--datagrid */ + --psp-datagrid--pos-cell--color: #7dc3f0; + --psp-datagrid--neg-cell--color: #ff9485; + + /* perspective-viewer-pro-dark--d3fc (overrides) */ + --psp-d3fc--legend--color: #c5c9d0; + --psp-d3fc--treemap--labels: white; + --psp-d3fc--treemap--hover-highlight: white; + --psp-d3fc--tooltip--color: white; + --psp-d3fc--axis-ticks--color: #c5c9d0; + --psp-d3fc--axis-lines--color: #61656e; + --psp-d3fc--gridline--color: #3b3f46; + --psp-d3fc--tooltip--background: rgba(42, 44, 47, 1); + --psp-d3fc--tooltip--border-color: #242526; + --psp-d3fc--legend--background: var(--psp--background-color); + --psp-d3fc--series--color: rgb(71, 120, 194); + --psp-d3fc--series-1--color: rgb(71, 120, 194); + --psp-d3fc--series-2--color: rgb(204, 120, 48); + --psp-d3fc--series-3--color: rgb(158, 84, 192); + --psp-d3fc--series-4--color: rgb(51, 150, 153); + --psp-d3fc--series-5--color: rgb(102, 114, 143); + --psp-d3fc--series-6--color: rgb(211, 103, 189); + --psp-d3fc--series-7--color: rgb(109, 124, 77); + --psp-d3fc--series-8--color: rgb(221, 99, 103); + --psp-d3fc--series-9--color: rgb(120, 104, 206); + --psp-d3fc--series-10--color: rgb(23, 166, 123); + --psp-d3fc--full-gradient--background: linear-gradient( + #dd6367 0%, + #242526 50%, + #3289c8 100% + ); + --psp-d3fc--pos-gradient--background: linear-gradient( + #242526 0%, + #3289c8 100% + ); + --psp-d3fc--neg-gradient--background: linear-gradient( + #dd6367 0%, + #242526 100% + ); + + /* perspective-viewer-pro-dark--openlayers (overrides) */ + --psp-openlayers--tile-url: "http://{a-c}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png"; + --psp-openlayers--attribution--filter: invert(1) hue-rotate(180deg); + --psp-openlayers--element--background: #212c2f; + --psp-openlayers--category-1--color: rgb(71, 120, 194); + --psp-openlayers--category-2--color: rgb(204, 120, 48); + --psp-openlayers--category-3--color: rgb(158, 84, 192); + --psp-openlayers--category-4--color: rgb(51, 150, 153); + --psp-openlayers--category-5--color: rgb(102, 114, 143); + --psp-openlayers--category-6--color: rgb(211, 103, 189); + --psp-openlayers--category-7--color: rgb(109, 124, 77); + --psp-openlayers--category-8--color: rgb(221, 99, 103); + --psp-openlayers--category-9--color: rgb(120, 104, 206); + --psp-openlayers--category-10--color: rgb(23, 166, 123); + --psp-openlayers--gradient--background: linear-gradient( + #dd6367 0%, + #242526 50%, + #3289c8 100% + ); + + /* perspective-viewer-vaporwave--colors */ + color: #49acff; + background-color: rgb(7, 8, 29) !important; + --psp--color: #49acff; + --psp-inactive--color: rgb(19, 33, 50) !important; + --psp-inactive--border-color: var(--psp-inactive--color); + --psp--background-color: rgb(7, 8, 29) !important; + + /* perspective-viewer-vaporwave--animation */ + --psp-status-icon--updating-keyframes-start--filter: opacity(1); + --psp-status-icon--updating-keyframes-end--filter: opacity(0); + --psp-status-icon--updating-keyframes-start--transform: scale(1); + --psp-status-icon--updating-keyframes-end--transform: scale(0.5); + --psp-status-icon--keyframes-start--transform: scale(1.25); + --psp-status-icon--keyframes-end--transform: scale(1); + + /* perspective-viewer-vaporwave--datagrid */ + --pp-color-1: #092132; + --pp-color-2: #42b6e6; + --psp-datagrid--pos-cell--color: #42b6e6 !important; + --psp-datagrid--hover--border-color: var(--pp-color-1) !important; + + /* FIXME: broken in shadow DOM */ + regular-table table tbody th:empty { + background: linear-gradient( + to right, + transparent 9px, + rgb(19, 33, 50) 10px, + transparent 11px + ); + background-repeat: no-repeat; + background-position: 0px -10px; + } + + /* perspective-viewer-vaporwave--d3fc */ + --psp-d3fc--axis-ticks--color: #49acff; + --psp-d3fc--gridline--color: rgb(19, 33, 50); + --psp-d3fc--series--color: #01cdfe; + --psp-d3fc--series-1--color: #01cdfe; + --psp-d3fc--series-2--color: #ff71ce; + --psp-d3fc--series-3--color: #05ffa1; + --psp-d3fc--series-4--color: #b967ff; + --psp-d3fc--series-5--color: #fffb96; + + --psp-d3fc--series-6--color: hsl(192, 99%, 25%); + --psp-d3fc--series-7--color: hsl(321, 100%, 36%); + --psp-d3fc--series-8--color: hsl(192, 99%, 25%); + --psp-d3fc--series-9--color: hsl(157, 100%, 25%); + --psp-d3fc--series-10--color: hsl(272, 100%, 35%); + + --psp-d3fc--neg-gradient--background: linear-gradient( + #f3d431, + #efb92d, + #ed9c25, + #eb7e20, + #e75d1e, + #d14632, + #b03e38, + #8c3a36, + #643633, + #07081d + ) !important; + + --psp-d3fc--pos-gradient--background: linear-gradient( + #07081d, + #2e4463, + #1e588a, + #086da7, + #0082b9, + #039ac7, + #12b1d4, + #2bc8e2, + #3ddff0, + #61f4fb + ) !important; + + --psp-d3fc--full-gradient--background: linear-gradient( + #f3d431, + #efb92d, + #ed9c25, + #eb7e20, + #e75d1e, + #d14632, + #b03e38, + #8c3a36, + #643633, + #07081d, + #2e4463, + #1e588a, + #086da7, + #0082b9, + #039ac7, + #12b1d4, + #2bc8e2, + #3ddff0, + #61f4fb + ) !important; +} + +perspective-copy-menu[theme="Vaporwave"], +perspective-export-menu[theme="Vaporwave"], +perspective-dropdown[theme="Vaporwave"], +perspective-date-column-style[theme="Vaporwave"], +perspective-datetime-column-style[theme="Vaporwave"], +perspective-number-column-style[theme="Vaporwave"], +perspective-string-column-style[theme="Vaporwave"] { + /* perspective-viewer-pro-dark--colors (overrides) */ + background-color: #242526; + color: white; + --psp--color: white; + --psp-active--color: #2770a9; + --psp-error--color: #ff9485; + --psp-inactive--color: #61656e; + --psp-inactive--border-color: #4c505b; + --psp--background-color: #242526; + --psp-active--background: rgba(39, 113, 170, 0.5); + --psp-expression--operator--color: #c5c9d0; + --psp-expression--function--color: #22a0ce; + --psp-expression--psp-error--color: rgb(255, 136, 136); + --psp-calendar--filter: invert(1); + --psp-warning--color: #242526; + --psp-warning--background: var(--psp--color); + --psp-icon--select-arrow--mask-image: var( + --psp-icon--select-arrow-light--mask-image + ); + --psp-icon--select-arrow-hover--mask-image: var( + --psp-icon--select-arrow-dark--mask-image + ); + --psp-code-editor--symbol--color: white; + --psp-code-editor--literal--color: #7dc3f0; + --psp-code-editor--operator--color: rgb(23, 166, 123); + --psp-code-editor--comment--color: rgb(204, 120, 48); + --psp-code-editor--column--color: #e18ee1; + + border: 1px solid #4c505b; + + /* perspective-viewer-vaporwave--colors */ + color: #49acff; + --psp--color: #49acff; + --psp-inactive--color: rgb(19, 33, 50) !important; + --psp-inactive--border-color: var(--psp-inactive--color); + --psp--background-color: rgb(7, 8, 29) !important; + + background-color: #07081d; +} diff --git a/rust/perspective-viewer/src/themes/vaporwave.less b/rust/perspective-viewer/src/themes/vaporwave.less deleted file mode 100644 index 65d3db5f86..0000000000 --- a/rust/perspective-viewer/src/themes/vaporwave.less +++ /dev/null @@ -1,145 +0,0 @@ -// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ -// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ -// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ -// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ -// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ -// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ -// ┃ Copyright (c) 2017, the Perspective Authors. ┃ -// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ -// ┃ This file is part of the Perspective library, distributed under the terms ┃ -// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ -// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - -@import "icons.less"; - -@import url("ref://pro-dark.less"); - -perspective-viewer, -perspective-viewer[theme="Vaporwave"] { - --theme-name: "Vaporwave"; -} - -perspective-viewer[theme="Vaporwave"] { - @include perspective-viewer-pro-dark; - @include perspective-viewer-vaporwave--colors; - @include perspective-viewer-vaporwave--animation; - @include perspective-viewer-vaporwave--fonts; - @include perspective-viewer-vaporwave--datagrid; - @include perspective-viewer-vaporwave--d3fc; -} - -perspective-copy-menu[theme="Vaporwave"], -perspective-export-menu[theme="Vaporwave"], -perspective-dropdown[theme="Vaporwave"], -perspective-date-column-style[theme="Vaporwave"], -perspective-datetime-column-style[theme="Vaporwave"], -perspective-number-column-style[theme="Vaporwave"], -perspective-string-column-style[theme="Vaporwave"] { - @include perspective-modal-pro-dark; - @include perspective-viewer-vaporwave--colors; - - background-color: #07081d; -} - -@mixin perspective-viewer-vaporwave--colors { - color: #49acff; - background-color: rgb(7, 8, 29) !important; - --icon--color: #49acff; - --inactive--color: rgb(19, 33, 50) !important; - --inactive--border-color: var(--inactive--color); - --plugin--background: rgb(7, 8, 29) !important; -} - -@mixin perspective-viewer-vaporwave--animation { - --status-icon-updating-keyframes-start--filter: opacity(1); - --status-icon-updating-keyframes-end--filter: opacity(0); - --status-icon-updating-keyframes-start--transform: scale(1); - --status-icon-updating-keyframes-end--transform: scale(0.5); - --status-icon-keyframes-start--transform: scale(1.25); - --status-icon-keyframes-end--transform: scale(1); -} - -@mixin perspective-viewer-vaporwave--datagrid { - --pp-color-1: #092132; - --pp-color-2: #42b6e6; - --rt-pos-cell--color: #42b6e6 !important; - --rt-hover--border-color: var(--pp-color-1) !important; - - // FIXME: broken in shadow DOM. Can be fixed with a new custom property allowing empty header cell backgrounds - // to be styled - regular-table table tbody th:empty { - background: linear-gradient( - to right, - transparent 9px, - rgb(19, 33, 50) 10px, - transparent 11px - ); - background-repeat: no-repeat; - background-position: 0px -10px; - } -} - -@mixin perspective-viewer-vaporwave--d3fc { - --d3fc-axis-ticks--color: #49acff; - --d3fc-gridline--color: rgb(19, 33, 50); - --d3fc-series: #01cdfe; - --d3fc-series-1: #01cdfe; - --d3fc-series-2: #ff71ce; - --d3fc-series-3: #05ffa1; - --d3fc-series-4: #b967ff; - --d3fc-series-5: #fffb96; - - --d3fc-series-6: hsl(192, 99%, 25%); - --d3fc-series-7: hsl(321, 100%, 36%); - --d3fc-series-8: hsl(192, 99%, 25%); - --d3fc-series-9: hsl(157, 100%, 25%); - --d3fc-series-10: hsl(272, 100%, 35%); - - --d3fc-negative--gradient: linear-gradient( - #f3d431, - #efb92d, - #ed9c25, - #eb7e20, - #e75d1e, - #d14632, - #b03e38, - #8c3a36, - #643633, - #07081d - ) !important; - - --d3fc-positive--gradient: linear-gradient( - #07081d, - #2e4463, - #1e588a, - #086da7, - #0082b9, - #039ac7, - #12b1d4, - #2bc8e2, - #3ddff0, - #61f4fb - ) !important; - - --d3fc-full--gradient: linear-gradient( - #f3d431, - #efb92d, - #ed9c25, - #eb7e20, - #e75d1e, - #d14632, - #b03e38, - #8c3a36, - #643633, - #07081d, - #2e4463, - #1e588a, - #086da7, - #0082b9, - #039ac7, - #12b1d4, - #2bc8e2, - #3ddff0, - #61f4fb - ) !important; -} diff --git a/rust/perspective-viewer/test/js/viewer_config/localization.spec.ts b/rust/perspective-viewer/test/js/viewer_config/localization.spec.ts index 29c2d5babb..7ccd722b66 100644 --- a/rust/perspective-viewer/test/js/viewer_config/localization.spec.ts +++ b/rust/perspective-viewer/test/js/viewer_config/localization.spec.ts @@ -47,7 +47,7 @@ test.describe("Localization", function () { }); const intl = fs - .readFileSync(`${__dirname}/../../../src/themes/intl.less`) + .readFileSync(`${__dirname}/../../../src/themes/intl.css`) .toString(); const keys = Array.from(intl.matchAll(/--[a-zA-Z0-9\-]+/g)).flat(); diff --git a/rust/perspective-viewer/tools.mjs b/rust/perspective-viewer/tools.mjs new file mode 100644 index 0000000000..8b876f35b6 --- /dev/null +++ b/rust/perspective-viewer/tools.mjs @@ -0,0 +1,88 @@ +// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ +// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃ +// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃ +// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃ +// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃ +// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ +// ┃ Copyright (c) 2017, the Perspective Authors. ┃ +// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃ +// ┃ This file is part of the Perspective library, distributed under the terms ┃ +// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ +// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ + +import { execSync } from "child_process"; +import * as fs from "node:fs"; +import * as path from "node:path"; +import { bundle as bundleCss, composeVisitors } from "lightningcss"; + +import { createRequire } from "node:module"; + +const INHERIT = { + stdio: "inherit", + stderr: "inherit", +}; + +export function get_host() { + return /host\: (.+?)$/gm.exec(execSync(`rustc -vV`).toString())[1]; +} + +export const resolveNPM = (url) => ({ + read(filePath) { + if (filePath.startsWith("http")) { + return `@import url("${filePath}");`; + } + + return fs.readFileSync(filePath, "utf8"); + }, + resolve(specifier, from) { + if (specifier.startsWith("http")) { + return { external: specifier }; + } + + const _require = createRequire(url); + + if (specifier.startsWith(".") || specifier.startsWith("/")) { + return path.resolve(path.dirname(from), specifier); + } + + return _require.resolve(specifier); + }, +}); + +// Inline url() asset references as data URIs. +export function inlineUrlVisitor(fromFile) { + const dir = path.dirname(fromFile); + return composeVisitors([ + { + Url(url) { + const ext = path.extname(url.url).toLowerCase(); + if (![".svg", ".png", ".gif"].includes(ext)) { + return; + } + + const resolved = path.resolve(dir, url.url); + if (!fs.existsSync(resolved)) { + return; + } + + const content = fs.readFileSync(resolved); + const mime = + ext === ".svg" + ? "image/svg+xml" + : ext === ".png" + ? "image/png" + : "image/gif"; + + const new_content = content + .toString("base64") + .split("\n") + .map((x) => x.trim()) + .join(""); + return { + url: `data:${mime};base64,${new_content}`, + loc: url.loc, + }; + }, + }, + ]); +} diff --git a/rust/perspective/build.mjs b/rust/perspective/build.mjs index 327a6649b9..03c44872a2 100644 --- a/rust/perspective/build.mjs +++ b/rust/perspective/build.mjs @@ -10,20 +10,18 @@ // ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃ // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ -import sh from "../../tools/scripts/sh.mjs"; +import { execSync } from "child_process"; let flags = "--release"; if (!!process.env.PSP_DEBUG) { flags = ""; } -const cmd = sh(); +const env = { ...process.env }; // if not windows if (process.platform !== "win32") { - cmd.env({ - PSP_ROOT_DIR: "../..", - }); + env.PSP_ROOT_DIR = "../.."; } let target = ""; @@ -40,5 +38,4 @@ if (process.env.PSP_ARCH === "x86_64" && process.platform === "darwin") { target = "--target=aarch64-unknown-linux-gnu"; } -cmd.sh(`cargo build ${flags} ${target}`); -cmd.runSync(); +execSync(`cargo build ${flags} ${target}`, { stdio: "inherit", env }); diff --git a/tools/test/results.tar.gz b/tools/test/results.tar.gz index 7ae0d34b0d214e0e6d64ddf620e3036ce2550923..5db1287e15a7f5d7e0bc5f15617aab6af1f67610 100644 GIT binary patch literal 175819 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 literal 172951 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

QIAD=?*3iKp7|(qCLTbf~Z4(;oRz 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

j8+`9nJX~m#Ru#asy|9t> z(L`cVe%?FTl22|w=GjpwIjJOSJGB@*$_ruA{E~>P?E4HRhdlHy2LE~KeIWh Es| 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 From d76cf969f26eddc4b3fc2eb8a24fb231ec2ad524 Mon Sep 17 00:00:00 2001 From: Andrew Stein Date: Sat, 28 Mar 2026 21:54:39 -0400 Subject: [PATCH 2/2] Fix drag/drop bugs Signed-off-by: Andrew Stein --- .../src/rust/components/column_dropdown.rs | 2 +- .../src/rust/components/column_selector.rs | 5 +- .../column_selector/active_column.rs | 3 +- .../column_selector/add_expression_button.rs | 1 + .../column_selector/config_selector.rs | 1 + .../column_selector/expr_edit_button.rs | 2 +- .../column_selector/filter_column.rs | 1 + .../column_selector/inactive_column.rs | 1 + .../column_selector/pivot_column.rs | 1 + .../components/column_selector/sort_column.rs | 1 + .../components/containers/dragdrop_list.rs | 1 + .../containers/sidebar_close_button.rs | 2 +- .../rust/components/containers/split_panel.rs | 1 + .../rust/components/containers/tab_list.rs | 2 +- .../src/rust/components/form/code_editor.rs | 7 +- .../components/form/color_range_selector.rs | 25 +++- .../src/rust/components/main_panel.rs | 9 +- .../src/rust/components/plugin_selector.rs | 7 +- .../src/rust/components/settings_panel.rs | 4 +- .../src/rust/components/status_bar.rs | 39 ++++-- .../src/rust/components/status_indicator.rs | 15 +-- .../src/rust/components/style/style_cache.rs | 6 +- .../src/rust/components/viewer.rs | 13 +- .../src/rust/custom_elements/modal.rs | 2 +- .../src/rust/custom_elements/viewer.rs | 24 +--- rust/perspective-viewer/src/rust/dragdrop.rs | 121 +++++++++++++++++- .../src/rust/presentation/sheets.rs | 6 +- rust/perspective-viewer/src/rust/session.rs | 54 ++++++-- .../src/rust/session/props.rs | 9 +- .../src/rust/tasks/eject.rs | 4 +- .../src/rust/tasks/resize_observer.rs | 7 +- tools/scripts/lint.mjs | 3 +- 32 files changed, 286 insertions(+), 93 deletions(-) diff --git a/rust/perspective-viewer/src/rust/components/column_dropdown.rs b/rust/perspective-viewer/src/rust/components/column_dropdown.rs index 9d38b0de94..ff927d57e5 100644 --- a/rust/perspective-viewer/src/rust/components/column_dropdown.rs +++ b/rust/perspective-viewer/src/rust/components/column_dropdown.rs @@ -246,7 +246,7 @@ fn ColumnDropDownView(props: &ColumnDropDownViewProps) -> Html { { col } }, InPlaceColumn::Expression(col) => html! { - { col.name.clone() } + { col.name.clone() } }, }; diff --git a/rust/perspective-viewer/src/rust/components/column_selector.rs b/rust/perspective-viewer/src/rust/components/column_selector.rs index a37fa82f72..88748ce373 100644 --- a/rust/perspective-viewer/src/rust/components/column_selector.rs +++ b/rust/perspective-viewer/src/rust/components/column_selector.rs @@ -62,7 +62,7 @@ pub struct ColumnSelectorProps { pub selected_column: Option, /// Value props threaded from root's `SessionProps` / `RendererProps`. - pub has_table: bool, + pub has_table: Option, pub named_column_count: usize, pub view_config: PtrEqRc, pub drag_column: Option, @@ -285,7 +285,7 @@ impl Component for ColumnSelector { move |_| dragdrop.notify_drag_end() }); - let mut active_classes = classes!(); + let mut active_classes = classes!("scrollable"); if ctx.props().drag_column.is_some() { active_classes.push("dragdrop-highlight"); }; @@ -491,6 +491,7 @@ impl Component for ColumnSelector {

+ if ctx.props().is_aggregated { Html { html! {
+
} diff --git a/rust/perspective-viewer/src/rust/components/column_selector/config_selector.rs b/rust/perspective-viewer/src/rust/components/column_selector/config_selector.rs index d9bf1633c6..622a8db754 100644 --- a/rust/perspective-viewer/src/rust/components/column_selector/config_selector.rs +++ b/rust/perspective-viewer/src/rust/components/column_selector/config_selector.rs @@ -615,6 +615,7 @@ impl Component for ConfigSelector { id="group_rollup_mode_selector" wrapper_class="group_rollup_wrapper" + is_autosize=true values={Rc::new( group_rollups .iter() diff --git a/rust/perspective-viewer/src/rust/components/column_selector/expr_edit_button.rs b/rust/perspective-viewer/src/rust/components/column_selector/expr_edit_button.rs index 09c5ddcad8..394dbb6113 100644 --- a/rust/perspective-viewer/src/rust/components/column_selector/expr_edit_button.rs +++ b/rust/perspective-viewer/src/rust/components/column_selector/expr_edit_button.rs @@ -54,5 +54,5 @@ pub fn ExprEditButton(p: &ExprEditButtonProps) -> Html { "expression-edit-button" }; - html! { } + html! { } } diff --git a/rust/perspective-viewer/src/rust/components/column_selector/filter_column.rs b/rust/perspective-viewer/src/rust/components/column_selector/filter_column.rs index 2ef12de155..07e7b30ace 100644 --- a/rust/perspective-viewer/src/rust/components/column_selector/filter_column.rs +++ b/rust/perspective-viewer/src/rust/components/column_selector/filter_column.rs @@ -350,6 +350,7 @@ impl Component for FilterColumn { >
+ // { filter.column().to_owned() } diff --git a/rust/perspective-viewer/src/rust/components/column_selector/inactive_column.rs b/rust/perspective-viewer/src/rust/components/column_selector/inactive_column.rs index d4d6a77a10..bd80bd3693 100644 --- a/rust/perspective-viewer/src/rust/components/column_selector/inactive_column.rs +++ b/rust/perspective-viewer/src/rust/components/column_selector/inactive_column.rs @@ -171,6 +171,7 @@ impl Component for InactiveColumn { {ondragend} >
+ { ctx.props().name.clone() } diff --git a/rust/perspective-viewer/src/rust/components/column_selector/pivot_column.rs b/rust/perspective-viewer/src/rust/components/column_selector/pivot_column.rs index 4b439dc574..4fcb2ce724 100644 --- a/rust/perspective-viewer/src/rust/components/column_selector/pivot_column.rs +++ b/rust/perspective-viewer/src/rust/components/column_selector/pivot_column.rs @@ -99,6 +99,7 @@ impl Component for PivotColumn { ondragend={dragend} >
+ { ctx.props().column.clone() }
diff --git a/rust/perspective-viewer/src/rust/components/column_selector/sort_column.rs b/rust/perspective-viewer/src/rust/components/column_selector/sort_column.rs index 5a579f093b..cacbd57153 100644 --- a/rust/perspective-viewer/src/rust/components/column_selector/sort_column.rs +++ b/rust/perspective-viewer/src/rust/components/column_selector/sort_column.rs @@ -132,6 +132,7 @@ impl Component for SortColumn { ondragend={dragend} >
+ // { ctx.props().sort.0.to_owned() } diff --git a/rust/perspective-viewer/src/rust/components/containers/dragdrop_list.rs b/rust/perspective-viewer/src/rust/components/containers/dragdrop_list.rs index 557a4c9ab8..41d5635d6c 100644 --- a/rust/perspective-viewer/src/rust/components/containers/dragdrop_list.rs +++ b/rust/perspective-viewer/src/rust/components/containers/dragdrop_list.rs @@ -309,6 +309,7 @@ where if ctx.props().disabled && ctx.props().is_dragover.is_none() {
+ { "TOTAL" }
diff --git a/rust/perspective-viewer/src/rust/components/containers/sidebar_close_button.rs b/rust/perspective-viewer/src/rust/components/containers/sidebar_close_button.rs index d6131e4f74..2e57b28be0 100644 --- a/rust/perspective-viewer/src/rust/components/containers/sidebar_close_button.rs +++ b/rust/perspective-viewer/src/rust/components/containers/sidebar_close_button.rs @@ -24,7 +24,7 @@ pub fn SidebarCloseButton(p: &SidebarCloseButtonProps) -> Html { let id = &p.id; html! {