@perspective-dev/viewer 4.5.0 → 4.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/dist/cdn/perspective-viewer.js +1 -1
  2. package/dist/cdn/perspective-viewer.js.map +2 -2
  3. package/dist/css/botanical.css +1 -1
  4. package/dist/css/dracula.css +1 -1
  5. package/dist/css/gruvbox-dark.css +1 -1
  6. package/dist/css/gruvbox.css +1 -1
  7. package/dist/css/icons.css +1 -1
  8. package/dist/css/intl/de.css +1 -1
  9. package/dist/css/intl/es.css +1 -1
  10. package/dist/css/intl/fr.css +1 -1
  11. package/dist/css/intl/ja.css +1 -1
  12. package/dist/css/intl/pt.css +1 -1
  13. package/dist/css/intl/zh.css +1 -1
  14. package/dist/css/intl.css +1 -1
  15. package/dist/css/monokai.css +1 -1
  16. package/dist/css/phosphor.css +1 -1
  17. package/dist/css/pro-dark.css +1 -1
  18. package/dist/css/pro.css +1 -1
  19. package/dist/css/solarized-dark.css +1 -1
  20. package/dist/css/solarized.css +1 -1
  21. package/dist/css/themes.css +1 -1
  22. package/dist/css/vaporwave.css +1 -1
  23. package/dist/esm/perspective-viewer.cdn.d.ts +3 -0
  24. package/dist/esm/perspective-viewer.inline.d.ts +3 -0
  25. package/dist/esm/perspective-viewer.inline.js +1 -1
  26. package/dist/esm/perspective-viewer.inline.js.map +2 -2
  27. package/dist/esm/perspective-viewer.js +1 -1
  28. package/dist/esm/perspective-viewer.js.map +2 -2
  29. package/dist/esm/ts-rs/OnUpdateData.d.ts +6 -0
  30. package/dist/esm/ts-rs/ViewOnUpdateResp.d.ts +4 -0
  31. package/dist/wasm/perspective-viewer.d.ts +15 -15
  32. package/dist/wasm/perspective-viewer.js +93 -88
  33. package/dist/wasm/perspective-viewer.wasm +0 -0
  34. package/dist/wasm/perspective-viewer.wasm.d.ts +15 -15
  35. package/package.json +1 -1
  36. package/src/{rust/components/style/local_style.rs → css/_column_dropdown.css} +14 -35
  37. package/src/css/_dropdown_menu.css +14 -0
  38. package/src/css/_filter_dropdown.css +14 -0
  39. package/src/css/_function_dropdown.css +14 -0
  40. package/src/css/_viewer_bundle.css +41 -0
  41. package/src/css/column-settings-panel.css +9 -3
  42. package/src/css/column-style.css +9 -1
  43. package/src/css/dom/checkbox.css +2 -2
  44. package/src/css/viewer.css +79 -1
  45. package/src/rust/components/column_dropdown.rs +3 -3
  46. package/src/rust/components/column_selector/active_column.rs +3 -0
  47. package/src/rust/components/column_selector/aggregate_selector.rs +0 -3
  48. package/src/rust/components/column_selector/config_selector.rs +0 -3
  49. package/src/rust/components/column_selector/empty_column.rs +0 -3
  50. package/src/rust/components/column_selector/filter_column.rs +0 -3
  51. package/src/rust/components/column_selector/inactive_column.rs +2 -1
  52. package/src/rust/components/column_selector/invalid_column.rs +0 -4
  53. package/src/rust/components/column_selector.rs +0 -3
  54. package/src/rust/components/column_settings_sidebar/style_tab/primitive_field.rs +1 -0
  55. package/src/rust/components/column_settings_sidebar/style_tab/symbol/symbol_pairs.rs +0 -3
  56. package/src/rust/components/column_settings_sidebar/style_tab/symbol.rs +0 -3
  57. package/src/rust/components/column_settings_sidebar.rs +1 -3
  58. package/src/rust/components/containers/dragdrop_list.rs +27 -0
  59. package/src/rust/components/containers/dropdown_menu.rs +1 -3
  60. package/src/rust/components/containers/scroll_panel.rs +1 -3
  61. package/src/rust/components/containers/split_panel.rs +0 -4
  62. package/src/rust/components/containers/tab_list.rs +0 -3
  63. package/src/rust/components/datetime_column_style.rs +0 -3
  64. package/src/rust/components/editable_header.rs +15 -0
  65. package/src/rust/components/empty_row.rs +0 -3
  66. package/src/rust/components/expression_editor.rs +2 -3
  67. package/src/rust/components/filter_dropdown.rs +3 -3
  68. package/src/rust/components/font_loader.rs +2 -2
  69. package/src/rust/components/form/code_editor.rs +0 -3
  70. package/src/rust/components/form/debug.rs +0 -4
  71. package/src/rust/components/function_dropdown.rs +3 -3
  72. package/src/rust/components/number_series_style.rs +0 -3
  73. package/src/rust/components/plugin_selector.rs +0 -3
  74. package/src/rust/components/plugin_tab.rs +0 -5
  75. package/src/rust/components/portal.rs +5 -2
  76. package/src/rust/components/render_warning.rs +0 -3
  77. package/src/rust/components/status_bar.rs +4 -3
  78. package/src/rust/components/string_column_style.rs +0 -3
  79. package/src/rust/components/style/mod.rs +60 -27
  80. package/src/rust/components/style/style_provider.rs +49 -16
  81. package/src/rust/components/style_controls/number_string_format.rs +1 -8
  82. package/src/rust/components/type_icon.rs +1 -4
  83. package/src/rust/components/viewer.rs +79 -5
  84. package/src/rust/custom_elements/copy_dropdown.rs +6 -2
  85. package/src/rust/custom_elements/export_dropdown.rs +6 -2
  86. package/src/rust/lib.rs +0 -1
  87. package/src/rust/renderer.rs +85 -21
  88. package/src/rust/session/metadata.rs +11 -1
  89. package/src/rust/session.rs +14 -1
  90. package/src/rust/tasks/reset_all.rs +38 -18
  91. package/src/rust/tasks/restore_and_render.rs +23 -12
  92. package/src/rust/tasks/send_column_config.rs +3 -2
  93. package/src/rust/tasks/send_plugin_config.rs +3 -2
  94. package/src/rust/tasks/update_and_render.rs +11 -4
  95. package/src/svg/checkbox-checked-icon.svg +1 -1
  96. package/src/svg/checkbox-unchecked-icon.svg +1 -1
  97. package/src/themes/botanical.css +2 -0
  98. package/src/themes/dracula.css +2 -0
  99. package/src/themes/gruvbox-dark.css +2 -0
  100. package/src/themes/icons.css +2 -0
  101. package/src/themes/intl/de.css +1 -0
  102. package/src/themes/intl/es.css +1 -0
  103. package/src/themes/intl/fr.css +1 -0
  104. package/src/themes/intl/ja.css +1 -0
  105. package/src/themes/intl/pt.css +1 -0
  106. package/src/themes/intl/zh.css +1 -0
  107. package/src/themes/intl.css +1 -0
  108. package/src/themes/monokai.css +2 -0
  109. package/src/themes/phosphor.css +2 -0
  110. package/src/themes/pro-dark.css +2 -0
  111. package/src/themes/vaporwave.css +2 -0
  112. package/tsconfig.json +1 -1
  113. package/src/rust/components/style/style_cache.rs +0 -136
  114. /package/dist/wasm/snippets/{perspective-viewer-39ab7da3ca157861 → perspective-viewer-93064d0d79855d97}/inline0.js +0 -0
  115. /package/dist/wasm/snippets/{perspective-viewer-39ab7da3ca157861 → perspective-viewer-93064d0d79855d97}/inline1.js +0 -0
  116. /package/dist/wasm/snippets/{perspective-viewer-39ab7da3ca157861 → perspective-viewer-93064d0d79855d97}/inline2.js +0 -0
  117. /package/dist/wasm/snippets/{perspective-viewer-39ab7da3ca157861 → perspective-viewer-93064d0d79855d97}/inline3.js +0 -0
  118. /package/dist/wasm/snippets/{perspective-viewer-39ab7da3ca157861 → perspective-viewer-93064d0d79855d97}/inline4.js +0 -0
@@ -1,35 +1,14 @@
1
- // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2
- // ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
3
- // ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
4
- // ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
5
- // ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
6
- // ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7
- // ┃ Copyright (c) 2017, the Perspective Authors. ┃
8
- // ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9
- // ┃ This file is part of the Perspective library, distributed under the terms ┃
10
- // ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
- // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
-
13
- use yew::prelude::*;
14
-
15
- use super::style_cache::*;
16
-
17
- #[derive(Properties)]
18
- pub struct LocalStyleProps {
19
- pub href: (&'static str, &'static str),
20
- }
21
-
22
- impl PartialEq for LocalStyleProps {
23
- fn eq(&self, _other: &Self) -> bool {
24
- true
25
- }
26
- }
27
-
28
- #[function_component(LocalStyle)]
29
- pub fn local_style(props: &LocalStyleProps) -> Html {
30
- if let Some(cache) = use_context::<StyleCache>() {
31
- cache.add_style(props.href.0, props.href.1);
32
- }
33
-
34
- html! {}
35
- }
1
+ /* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2
+ * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
3
+ * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
4
+ * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
5
+ * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
6
+ * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7
+ * ┃ Copyright (c) 2017, the Perspective Authors. ┃
8
+ * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9
+ * ┃ This file is part of the Perspective library, distributed under the terms ┃
10
+ * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
+ * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
+ */
13
+
14
+ @import "column-dropdown.css";
@@ -0,0 +1,14 @@
1
+ /* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2
+ * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
3
+ * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
4
+ * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
5
+ * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
6
+ * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7
+ * ┃ Copyright (c) 2017, the Perspective Authors. ┃
8
+ * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9
+ * ┃ This file is part of the Perspective library, distributed under the terms ┃
10
+ * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
+ * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
+ */
13
+
14
+ @import "containers/dropdown-menu.css";
@@ -0,0 +1,14 @@
1
+ /* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2
+ * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
3
+ * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
4
+ * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
5
+ * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
6
+ * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7
+ * ┃ Copyright (c) 2017, the Perspective Authors. ┃
8
+ * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9
+ * ┃ This file is part of the Perspective library, distributed under the terms ┃
10
+ * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
+ * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
+ */
13
+
14
+ @import "filter-dropdown.css";
@@ -0,0 +1,14 @@
1
+ /* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2
+ * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
3
+ * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
4
+ * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
5
+ * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
6
+ * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7
+ * ┃ Copyright (c) 2017, the Perspective Authors. ┃
8
+ * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9
+ * ┃ This file is part of the Perspective library, distributed under the terms ┃
10
+ * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
+ * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
+ */
13
+
14
+ @import "function-dropdown.css";
@@ -0,0 +1,41 @@
1
+ /* ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2
+ * ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
3
+ * ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
4
+ * ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
5
+ * ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
6
+ * ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7
+ * ┃ Copyright (c) 2017, the Perspective Authors. ┃
8
+ * ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9
+ * ┃ This file is part of the Perspective library, distributed under the terms ┃
10
+ * ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
+ * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
+ */
13
+
14
+ @import "dom/checkbox.css";
15
+ @import "dom/scrollbar.css";
16
+ @import "dom/select.css";
17
+
18
+ @import "containers/split-panel.css";
19
+ @import "containers/scroll-panel.css";
20
+ @import "containers/pairs-list.css";
21
+ @import "containers/tabs.css";
22
+
23
+ @import "type-icon.css";
24
+ @import "aggregate-selector.css";
25
+ @import "empty-column.css";
26
+ @import "filter-item.css";
27
+ @import "config-selector.css";
28
+ @import "column-selector.css";
29
+ @import "column-style.css";
30
+ @import "column-symbol-attributes.css";
31
+ @import "column-settings-panel.css";
32
+ @import "expression-editor.css";
33
+ @import "plugin-selector.css";
34
+ @import "plugin-settings-panel.css";
35
+ @import "render-warning.css";
36
+ @import "status-bar.css";
37
+
38
+ @import "form/code-editor.css";
39
+ @import "form/debug.css";
40
+
41
+ @import "viewer.css";
@@ -75,20 +75,22 @@
75
75
  border-radius: 3px;
76
76
  outline-width: 1px;
77
77
  outline-color: var(--psp-inactive--color);
78
+ padding-left: 4px;
78
79
 
79
80
  &.editable {
81
+ outline-style: dashed;
80
82
  &:hover {
81
83
  outline-style: solid;
82
84
  cursor: text;
83
85
  }
84
86
  }
85
- &:focus {
87
+ &.editable:focus {
86
88
  outline-style: solid;
87
89
  background: var(--psp--background-color);
88
90
  }
89
- &.edited {
91
+ /* &.edited {
90
92
  outline-style: dashed;
91
- }
93
+ } */
92
94
  &.invalid {
93
95
  outline-color: var(--psp-error--color);
94
96
  }
@@ -164,6 +166,10 @@
164
166
  content: var(--psp-label--stack--content, "Stack");
165
167
  }
166
168
 
169
+ label#interpolate-label:before {
170
+ content: var(--psp-label--interpolate--content, "Interpolate null");
171
+ }
172
+
167
173
  label#series-label:before {
168
174
  content: var(--psp-label--series--content, "Series");
169
175
  }
@@ -27,14 +27,22 @@
27
27
  margin: 0px;
28
28
  }
29
29
 
30
+ .is-default-value .bool-field-container {
31
+ background-color: var(--psp--background-color);
32
+ border: 1px solid var(--psp-inactive--color);
33
+ }
34
+
30
35
  .bool-field-container {
31
36
  display: flex;
32
- border: 1px solid var(--psp-inactive--color);
37
+ border: 1px dashed var(--psp-inactive--color);
33
38
  border-radius: 3px;
34
39
  align-items: center;
35
40
  padding: 0 6px;
36
41
  width: 100%;
37
42
  cursor: pointer;
43
+ label {
44
+ cursor: pointer;
45
+ }
38
46
  }
39
47
 
40
48
  &.no-style {
@@ -19,7 +19,7 @@
19
19
  padding: 0px;
20
20
  cursor: pointer;
21
21
  outline: none;
22
- margin: 0 5px;
22
+ margin: 0;
23
23
  display: inline-block;
24
24
  background-repeat: no-repeat;
25
25
  background-color: var(--psp--color, #ccc);
@@ -86,7 +86,7 @@
86
86
  opacity: 0.2s;
87
87
  }
88
88
 
89
- &:hover {
89
+ &:not(.alternate):hover {
90
90
  -webkit-mask-image: var(--psp-icon--checkbox-hover--mask-image);
91
91
  mask-image: var(--psp-icon--checkbox-hover--mask-image);
92
92
  }
@@ -16,10 +16,88 @@
16
16
  --psp--color: #ff0000;
17
17
  }
18
18
 
19
+ /* Shift-key affordance: while the user holds Shift, any mask-image icon
20
+ * tagged `.shift-alt-icon` recolors to advertise that a Shift-modified
21
+ * action is available on the underlying control. `!important` is required
22
+ * to beat per-icon ID-scoped `background-color` rules. */
23
+ :host(.shift-active) .shift-alt-icon {
24
+ background-color: var(
25
+ --shift-active--color,
26
+ var(--psp-datagrid--pos-cell--color, #1078d1)
27
+ ) !important;
28
+ }
29
+
30
+ :host(.shift-active) {
31
+ #sub-columns {
32
+ .is_column_active.toggle-mode {
33
+ -webkit-mask-image: var(--psp-icon--radio-off--mask-image);
34
+ mask-image: var(--psp-icon--radio-off--mask-image);
35
+
36
+ &:before {
37
+ content: var(--psp-icon--radio-off--mask-image);
38
+ }
39
+
40
+ &:hover {
41
+ -webkit-mask-image: var(--psp-icon--radio-hover--mask-image);
42
+ mask-image: var(--psp-icon--radio-hover--mask-image);
43
+ }
44
+ }
45
+
46
+ .is_column_active.select-mode {
47
+ -webkit-mask-image: var(--psp-icon--checkbox-off--mask-image);
48
+ mask-image: var(--psp-icon--checkbox-off--mask-image);
49
+
50
+ &:before {
51
+ content: var(--psp-icon--checkbox-off--mask-image);
52
+ }
53
+
54
+ &:hover {
55
+ -webkit-mask-image: var(--psp-icon--checkbox-hover--mask-image);
56
+ mask-image: var(--psp-icon--checkbox-hover--mask-image);
57
+ }
58
+ }
59
+ }
60
+
61
+ #active-columns {
62
+ .is_column_active.toggle-mode {
63
+ -webkit-mask-image: var(--psp-icon--radio-on--mask-image);
64
+ mask-image: var(--psp-icon--radio-on--mask-image);
65
+
66
+ &:before {
67
+ content: var(--psp-icon--radio-on--mask-image);
68
+ }
69
+
70
+ &:not(.required):hover {
71
+ -webkit-mask-image: var(--psp-icon--radio-hover--mask-image);
72
+ mask-image: var(--psp-icon--radio-hover--mask-image);
73
+ }
74
+ }
75
+
76
+ .is_column_active.select-mode {
77
+ -webkit-mask-image: var(--psp-icon--checkbox-on--mask-image);
78
+ mask-image: var(--psp-icon--checkbox-on--mask-image);
79
+
80
+ &:before {
81
+ content: var(--psp-icon--checkbox-on--mask-image);
82
+ }
83
+
84
+ &:not(.required):hover {
85
+ -webkit-mask-image: var(--psp-icon--checkbox-hover--mask-image);
86
+ mask-image: var(--psp-icon--checkbox-hover--mask-image);
87
+ }
88
+ }
89
+ }
90
+ }
91
+
19
92
  ::slotted(*) {
20
93
  pointer-events: var(--override-content-pointer-events);
21
94
  }
22
95
 
96
+ :host input[type="number"]::-webkit-inner-spin-button {
97
+ transform: scale(1.5) translateX(-5px); /* Makes the arrows 50% larger */
98
+ filter: var(--psp-input--filter);
99
+ }
100
+
23
101
  :host .sidebar_close_button {
24
102
  position: absolute;
25
103
  top: 0;
@@ -398,13 +476,13 @@
398
476
  cursor: pointer;
399
477
  padding: 6px 8px;
400
478
  font-size: var(--label--font-size, 0.75em);
479
+ text-transform: uppercase;
401
480
  flex: 0 1 100px;
402
481
  background-color: #00000020;
403
482
  border-bottom: 1px solid var(--psp-inactive--color);
404
483
  color: var(--psp-inactive--color);
405
484
  margin-left: -1px;
406
485
  border-left: 1px solid var(--psp-inactive--color);
407
-
408
486
  &:hover {
409
487
  color: inherit;
410
488
  }
@@ -22,12 +22,11 @@ use yew::prelude::*;
22
22
 
23
23
  use super::column_selector::InPlaceColumn;
24
24
  use super::portal::PortalModal;
25
+ use super::style::StyleSurface;
25
26
  use crate::session::Session;
26
27
  use crate::utils::*;
27
28
  use crate::*;
28
29
 
29
- static CSS: &str = include_str!(concat!(env!("OUT_DIR"), "/css/column-dropdown.css"));
30
-
31
30
  /// Shared state for the column dropdown, updated imperatively.
32
31
  #[derive(Default)]
33
32
  pub struct ColumnDropDownState {
@@ -207,6 +206,7 @@ impl Component for ColumnDropDownPortal {
207
206
  html! {
208
207
  <PortalModal
209
208
  tag_name="perspective-dropdown"
209
+ surface={StyleSurface::ColumnDropdown}
210
210
  {target}
211
211
  own_focus=false
212
212
  {on_close}
@@ -270,5 +270,5 @@ fn ColumnDropDownView(props: &ColumnDropDownViewProps) -> Html {
270
270
  props.width, props.width
271
271
  );
272
272
 
273
- html! { <><style>{ CSS }</style><style>{ position }</style>{ body }</> }
273
+ html! { <><style>{ position }</style>{ body }</> }
274
274
  }
@@ -355,6 +355,9 @@ impl Component for ActiveColumn {
355
355
  if is_required {
356
356
  class.push("required");
357
357
  };
358
+ if !is_required {
359
+ class.push("shift-alt-icon");
360
+ }
358
361
  html! {
359
362
  <div
360
363
  class={outer_classes}
@@ -18,8 +18,6 @@ use perspective_js::utils::ApiFuture;
18
18
  use yew::prelude::*;
19
19
 
20
20
  use crate::components::containers::select::*;
21
- use crate::components::style::LocalStyle;
22
- use crate::css;
23
21
  use crate::renderer::*;
24
22
  use crate::session::*;
25
23
  use crate::utils::PtrEqRc;
@@ -119,7 +117,6 @@ impl Component for AggregateSelector {
119
117
 
120
118
  html! {
121
119
  <>
122
- <LocalStyle href={css!("aggregate-selector")} />
123
120
  <div class="aggregate-selector-wrapper">
124
121
  <Select<Aggregate>
125
122
  wrapper_class="aggregate-selector"
@@ -25,8 +25,6 @@ use crate::components::column_dropdown::{ColumnDropDownElement, ColumnDropDownPo
25
25
  use crate::components::containers::dragdrop_list::*;
26
26
  use crate::components::containers::select::{Select, SelectItem};
27
27
  use crate::components::filter_dropdown::{FilterDropDownElement, FilterDropDownPortal};
28
- use crate::components::style::LocalStyle;
29
- use crate::css;
30
28
  use crate::presentation::Presentation;
31
29
  use crate::renderer::*;
32
30
  use crate::session::drag_drop_update::*;
@@ -609,7 +607,6 @@ impl Component for ConfigSelector {
609
607
  html! {
610
608
  <>
611
609
  <div slot="top_panel" id="top_panel" {class} ondragend={dragend}>
612
- <LocalStyle href={css!("config-selector")} />
613
610
  <div class="pivot_controls">
614
611
  if group_rollups.len() > 1 {
615
612
  <Select<GroupRollupMode>
@@ -17,8 +17,6 @@ use web_sys::*;
17
17
  use yew::prelude::*;
18
18
 
19
19
  use crate::components::column_dropdown::ColumnDropDownElement;
20
- use crate::components::style::LocalStyle;
21
- use crate::css;
22
20
 
23
21
  #[derive(Properties)]
24
22
  pub struct EmptyColumnProps {
@@ -70,7 +68,6 @@ impl Component for EmptyColumn {
70
68
 
71
69
  html! {
72
70
  <div class="pivot-column column-empty">
73
- <LocalStyle href={css!("empty-column")} />
74
71
  <input
75
72
  spellcheck="false"
76
73
  ref={self.input_ref.clone()}
@@ -23,9 +23,7 @@ use yew::prelude::*;
23
23
  use crate::components::containers::dragdrop_list::*;
24
24
  use crate::components::containers::select::*;
25
25
  use crate::components::filter_dropdown::FilterDropDownElement;
26
- use crate::components::style::LocalStyle;
27
26
  use crate::components::type_icon::TypeIcon;
28
- use crate::css;
29
27
  use crate::presentation::Presentation;
30
28
  use crate::renderer::*;
31
29
  use crate::session::*;
@@ -348,7 +346,6 @@ impl Component for FilterColumn {
348
346
  ondragstart={dragstart}
349
347
  ondragend={dragend}
350
348
  >
351
- <LocalStyle href={css!("filter-item")} />
352
349
  <div class="pivot-column-border">
353
350
  <span class="drag-handle icon" />
354
351
  // <TypeIcon ty={ColumnType::String} />
@@ -149,7 +149,8 @@ impl Component for InactiveColumn {
149
149
 
150
150
  let is_expression = ctx.props().is_expression;
151
151
 
152
- let is_active_class = ctx.props().renderer.metadata().select_mode.css();
152
+ let mut is_active_class = ctx.props().renderer.metadata().select_mode.css();
153
+ is_active_class.push("shift-alt-icon");
153
154
  let mut class = classes!("column-selector-column");
154
155
  if !ctx.props().visible {
155
156
  class.push("column-selector-column-hidden");
@@ -12,14 +12,10 @@
12
12
 
13
13
  use yew::prelude::*;
14
14
 
15
- use crate::components::style::LocalStyle;
16
- use crate::css;
17
-
18
15
  #[function_component(InvalidColumn)]
19
16
  pub fn invalid_column() -> Html {
20
17
  html! {
21
18
  <div class="pivot-column column-empty column-invalid">
22
- <LocalStyle href={css!("empty-column")} />
23
19
  <div class="column-invalid-input" />
24
20
  </div>
25
21
  }
@@ -39,10 +39,8 @@ use self::config_selector::ConfigSelector;
39
39
  use self::inactive_column::*;
40
40
  use super::containers::scroll_panel::*;
41
41
  use super::containers::split_panel::{Orientation, SplitPanel};
42
- use super::style::LocalStyle;
43
42
  use crate::components::column_dropdown::{ColumnDropDownElement, ColumnDropDownPortal};
44
43
  use crate::components::containers::scroll_panel_item::ScrollPanelItem;
45
- use crate::css;
46
44
  use crate::presentation::{ColumnLocator, DragDropContainer, Presentation};
47
45
  use crate::queries::{ActiveColumnState, ActiveColumnStateData, ColumnsIteratorSet};
48
46
  use crate::renderer::*;
@@ -519,7 +517,6 @@ impl Component for ColumnSelector {
519
517
 
520
518
  html! {
521
519
  <>
522
- <LocalStyle href={css!("column-selector")} />
523
520
  <SplitPanel
524
521
  no_wrap=true
525
522
  on_reset={self.on_reset.callback()}
@@ -160,6 +160,7 @@ pub fn BoolField(props: &BoolFieldProps) -> Html {
160
160
  <div class="bool-field-container">
161
161
  <input
162
162
  type="checkbox"
163
+ class="alternate"
163
164
  id={format!("{}-checkbox", props.field_key)}
164
165
  checked={current}
165
166
  {oninput}
@@ -17,9 +17,7 @@ use yew::{Callback, Html, Properties, html};
17
17
 
18
18
  use crate::components::column_settings_sidebar::style_tab::symbol::symbol_pairs_item::PairsListItem;
19
19
  use crate::components::filter_dropdown::FilterDropDownElement;
20
- use crate::components::style::LocalStyle;
21
20
  use crate::config::SymbolKVPair;
22
- use crate::css;
23
21
  use crate::utils::PtrEqRc;
24
22
 
25
23
  #[derive(Properties, PartialEq)]
@@ -84,7 +82,6 @@ impl yew::Component for PairsList {
84
82
 
85
83
  html! {
86
84
  <>
87
- <LocalStyle href={css!("containers/pairs-list")} />
88
85
  <div class="pairs-list" id={props.id.clone()} data-label={props.title.clone()}>
89
86
  <ul>{ for main_pairs }</ul>
90
87
  </div>
@@ -24,9 +24,7 @@ use yew::{Callback, Html, Properties, html};
24
24
 
25
25
  use crate::components::column_settings_sidebar::style_tab::symbol::symbol_pairs::PairsList;
26
26
  use crate::components::filter_dropdown::{FilterDropDownElement, FilterDropDownPortal};
27
- use crate::components::style::LocalStyle;
28
27
  use crate::config::{ColumnConfigFieldUpdate, KeyValueOpts, SymbolKVPair};
29
- use crate::css;
30
28
  use crate::session::Session;
31
29
 
32
30
  #[derive(Properties, PartialEq, Clone)]
@@ -126,7 +124,6 @@ impl yew::Component for SymbolStyle {
126
124
  let update_pairs = ctx.link().callback(SymbolAttrMsg::UpdatePairs);
127
125
  html! {
128
126
  <>
129
- <LocalStyle href={css!("column-symbol-attributes")} />
130
127
  <PairsList
131
128
  title="Symbols"
132
129
  id="attributes-symbols"
@@ -31,14 +31,12 @@ use crate::components::containers::sidebar::Sidebar;
31
31
  use crate::components::containers::tab_list::TabList;
32
32
  use crate::components::editable_header::EditableHeaderProps;
33
33
  use crate::components::expression_editor::ExpressionEditorProps;
34
- use crate::components::style::LocalStyle;
35
34
  use crate::components::type_icon::TypeIconType;
36
35
  use crate::presentation::{ColumnLocator, ColumnSettingsTab, Presentation};
37
36
  use crate::renderer::Renderer;
38
37
  use crate::session::{Session, SessionMetadataRc};
39
38
  use crate::tasks::{delete_expr, save_expr, update_expr};
40
39
  use crate::utils::PtrEqRc;
41
- use crate::*;
42
40
 
43
41
  #[derive(Clone, Derivative, Properties)]
44
42
  #[derivative(Debug)]
@@ -264,6 +262,7 @@ impl Component for ColumnSettingsPanel {
264
262
  ctx.props().selected_tab,
265
263
  Some(ColumnSettingsTab::Attributes)
266
264
  ),
265
+ update_on_input: true,
267
266
  icon_type: self
268
267
  .maybe_ty
269
268
  .map(|ty| ty.into())
@@ -355,7 +354,6 @@ impl Component for ColumnSettingsPanel {
355
354
 
356
355
  html! {
357
356
  <>
358
- <LocalStyle href={css!("column-settings-panel")} />
359
357
  <Sidebar
360
358
  on_close={ctx.props().on_close.clone()}
361
359
  id_prefix="column_settings"
@@ -193,6 +193,12 @@ where
193
193
  }
194
194
  });
195
195
 
196
+ // Held by per-row `ondragenter` closures below so they can re-arm
197
+ // the `safaridragleave` flag on the container element when the
198
+ // row stops dragenter from bubbling. See the comment inside the
199
+ // closure for why this matters.
200
+ let container_noderef = drag_container.noderef.clone();
201
+
196
202
  let invalid_drag: bool;
197
203
  let mut valid_duplicate_drag = false;
198
204
 
@@ -253,9 +259,30 @@ where
253
259
  let close = ctx.props().parent.callback(move |_| V::close(idx));
254
260
  let dragenter = ctx.props().parent.callback({
255
261
  let link = ctx.link().clone();
262
+ let container_noderef = container_noderef.clone();
256
263
  move |event: DragEvent| {
257
264
  event.stop_propagation();
258
265
  event.prevent_default();
266
+ // Safari: `relatedTarget` is always null on
267
+ // dragleave, so `dragleave_helper` uses a
268
+ // `data-safaridragleave` flag set by the
269
+ // container's own dragenter to distinguish
270
+ // child-crossing leaves (consume the flag)
271
+ // from real leaves (no flag → fire callback).
272
+ // The `stop_propagation` above blocks the
273
+ // container's dragenter, so the flag would
274
+ // never be re-armed after the first consume —
275
+ // any further internal boundary crossing
276
+ // would demote the state out of
277
+ // `DragOverInProgress` and the next drop
278
+ // would be silently rejected. Set the flag
279
+ // here so each row-targeted dragenter
280
+ // refills the pool.
281
+ if event.related_target().is_none()
282
+ && let Some(elem) = container_noderef.cast::<HtmlElement>()
283
+ {
284
+ let _ = elem.dataset().set("safaridragleave", "true");
285
+ }
259
286
  link.send_message(DragDropListMsg::Freeze(true));
260
287
  V::dragenter(idx)
261
288
  }
@@ -17,8 +17,6 @@ use web_sys::*;
17
17
  use yew::prelude::*;
18
18
 
19
19
  use super::select::SelectItem;
20
- use crate::components::style::LocalStyle;
21
- use crate::*;
22
20
 
23
21
  #[derive(Properties, PartialEq)]
24
22
  pub struct DropDownMenuProps<T>
@@ -95,7 +93,7 @@ where
95
93
  html! { <span class="no-results">{ "No Completions" }</span> }
96
94
  };
97
95
 
98
- html! { <><LocalStyle href={css!("containers/dropdown-menu")} />{ body }</> }
96
+ html! { <>{ body }</> }
99
97
  }
100
98
  }
101
99
 
@@ -22,8 +22,6 @@ use yew::prelude::*;
22
22
  use yew::virtual_dom::VChild;
23
23
 
24
24
  use super::scroll_panel_item::ScrollPanelItem;
25
- use crate::components::style::LocalStyle;
26
- use crate::css;
27
25
  use crate::utils::*;
28
26
 
29
27
  #[derive(Properties)]
@@ -253,7 +251,7 @@ impl Component for ScrollPanel {
253
251
  }
254
252
  };
255
253
 
256
- html! { <><LocalStyle href={css!("containers/scroll-panel")} />{ items }</> }
254
+ html! { <>{ items }</> }
257
255
  }
258
256
 
259
257
  fn rendered(&mut self, ctx: &Context<Self>, _first_render: bool) {