@perspective-dev/viewer 4.5.1 → 5.0.0

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 (212) hide show
  1. package/dist/cdn/perspective-viewer.js +20 -1
  2. package/dist/cdn/perspective-viewer.js.map +4 -4
  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/monokai.css +1 -1
  9. package/dist/css/phosphor.css +1 -1
  10. package/dist/css/pro-dark.css +1 -1
  11. package/dist/css/pro.css +1 -1
  12. package/dist/css/solarized-dark.css +1 -1
  13. package/dist/css/solarized.css +1 -1
  14. package/dist/css/themes.css +1 -1
  15. package/dist/css/vaporwave.css +1 -1
  16. package/dist/esm/extensions.d.ts +22 -3
  17. package/dist/esm/perspective-viewer.cdn.d.ts +3 -0
  18. package/dist/esm/perspective-viewer.d.ts +9 -0
  19. package/dist/esm/perspective-viewer.inline.d.ts +3 -0
  20. package/dist/esm/perspective-viewer.inline.js +20 -1
  21. package/dist/esm/perspective-viewer.inline.js.map +4 -4
  22. package/dist/esm/perspective-viewer.js +20 -1
  23. package/dist/esm/perspective-viewer.js.map +4 -4
  24. package/dist/esm/plugin.d.ts +71 -5
  25. package/dist/esm/ts-rs/ClientOptions.d.ts +7 -0
  26. package/dist/esm/ts-rs/ExportMethod.d.ts +1 -0
  27. package/dist/esm/ts-rs/ExportOptions.d.ts +9 -0
  28. package/dist/esm/ts-rs/GetClientOptions.d.ts +8 -0
  29. package/dist/esm/ts-rs/GetTableOptions.d.ts +8 -0
  30. package/dist/esm/ts-rs/Layout.d.ts +11 -0
  31. package/dist/esm/ts-rs/OnUpdateData.d.ts +6 -0
  32. package/dist/esm/ts-rs/Orientation.d.ts +4 -0
  33. package/dist/esm/ts-rs/PanelOptions.d.ts +7 -0
  34. package/dist/esm/ts-rs/PanelViewerConfig.d.ts +39 -0
  35. package/dist/esm/ts-rs/SplitLayout.d.ts +7 -0
  36. package/dist/esm/ts-rs/TabLayout.d.ts +10 -0
  37. package/dist/esm/ts-rs/ViewOnUpdateResp.d.ts +4 -0
  38. package/dist/esm/ts-rs/ViewerConfig.d.ts +6 -2
  39. package/dist/esm/ts-rs/WorkspaceConfig.d.ts +40 -0
  40. package/dist/esm/ts-rs/WorkspaceConfigUpdate.d.ts +28 -0
  41. package/dist/wasm/perspective-viewer.d.ts +213 -79
  42. package/dist/wasm/perspective-viewer.js +537 -189
  43. package/dist/wasm/perspective-viewer.wasm +0 -0
  44. package/dist/wasm/perspective-viewer.wasm.d.ts +36 -28
  45. package/dist/wasm/snippets/perspective-viewer-daeef4ceb066e6c7/inline0.js +6 -0
  46. package/dist/wasm/snippets/{perspective-viewer-3cd58f0374935772/inline3.js → perspective-viewer-daeef4ceb066e6c7/inline4.js} +5 -0
  47. package/package.json +3 -2
  48. package/src/css/_column_dropdown.css +14 -0
  49. package/src/css/_context_menu.css +14 -0
  50. package/src/css/_dropdown_menu.css +14 -0
  51. package/src/css/_filter_dropdown.css +14 -0
  52. package/src/css/_function_dropdown.css +14 -0
  53. package/src/css/_viewer_bundle.css +41 -0
  54. package/src/css/column-settings-panel.css +1 -1
  55. package/src/css/containers/context-menu.css +101 -0
  56. package/src/css/panel-tab.css +193 -0
  57. package/src/css/plugin-selector.css +7 -10
  58. package/src/css/status-bar.css +75 -81
  59. package/src/css/viewer.css +181 -71
  60. package/src/rust/components/column_dropdown.rs +43 -33
  61. package/src/rust/components/column_selector/active_column.rs +7 -18
  62. package/src/rust/components/column_selector/aggregate_selector.rs +4 -10
  63. package/src/rust/components/column_selector/config_selector.rs +33 -84
  64. package/src/rust/components/column_selector/empty_column.rs +0 -3
  65. package/src/rust/components/column_selector/filter_column.rs +5 -18
  66. package/src/rust/components/column_selector/inactive_column.rs +3 -8
  67. package/src/rust/components/column_selector/invalid_column.rs +0 -4
  68. package/src/rust/components/column_selector/sort_column.rs +3 -6
  69. package/src/rust/components/column_selector.rs +5 -14
  70. package/src/rust/components/column_settings_sidebar/style_tab/symbol/symbol_pairs.rs +0 -3
  71. package/src/rust/components/column_settings_sidebar/style_tab/symbol.rs +0 -3
  72. package/src/rust/components/column_settings_sidebar.rs +0 -3
  73. package/src/rust/components/containers/dropdown_menu.rs +1 -3
  74. package/src/rust/components/containers/scroll_panel.rs +1 -3
  75. package/src/rust/components/containers/split_panel.rs +175 -66
  76. package/src/rust/components/containers/tab_list.rs +0 -3
  77. package/src/rust/components/context_menu.rs +130 -0
  78. package/src/rust/components/datetime_column_style.rs +0 -3
  79. package/src/rust/components/empty_row.rs +0 -3
  80. package/src/rust/components/expression_editor.rs +2 -3
  81. package/src/rust/components/filter_dropdown.rs +3 -3
  82. package/src/rust/components/font_loader.rs +2 -2
  83. package/src/rust/components/form/code_editor.rs +0 -3
  84. package/src/rust/components/form/debug.rs +3 -4
  85. package/src/rust/components/function_dropdown.rs +3 -3
  86. package/src/rust/components/global_filter_bar.rs +76 -0
  87. package/src/rust/components/main_panel/frame_theme.rs +186 -0
  88. package/src/rust/components/main_panel/msg.rs +62 -0
  89. package/src/rust/components/main_panel/presize.rs +220 -0
  90. package/src/rust/components/main_panel/reconcile.rs +224 -0
  91. package/src/rust/components/main_panel/render.rs +385 -0
  92. package/src/rust/components/main_panel/update.rs +184 -0
  93. package/src/rust/components/main_panel.rs +311 -71
  94. package/src/rust/components/mod.rs +4 -0
  95. package/src/rust/components/number_series_style.rs +0 -3
  96. package/src/rust/components/panel_menu.rs +486 -0
  97. package/src/rust/components/panel_tab.rs +505 -0
  98. package/src/rust/components/plugin_selector.rs +0 -3
  99. package/src/rust/components/plugin_tab.rs +1 -6
  100. package/src/rust/components/portal.rs +5 -2
  101. package/src/rust/components/render_warning.rs +0 -3
  102. package/src/rust/components/settings_panel.rs +13 -5
  103. package/src/rust/components/status_bar.rs +113 -180
  104. package/src/rust/components/status_indicator.rs +6 -9
  105. package/src/rust/components/string_column_style.rs +0 -3
  106. package/src/rust/components/style/mod.rs +65 -27
  107. package/src/rust/components/style/style_provider.rs +51 -16
  108. package/src/rust/components/style_controls/number_string_format.rs +1 -8
  109. package/src/rust/components/type_icon.rs +1 -4
  110. package/src/rust/components/viewer/filters.rs +133 -0
  111. package/src/rust/components/viewer/msg.rs +180 -0
  112. package/src/rust/components/viewer/panels.rs +326 -0
  113. package/src/rust/components/viewer/render.rs +243 -0
  114. package/src/rust/components/viewer/settings.rs +402 -0
  115. package/src/rust/components/viewer/snapshots.rs +134 -0
  116. package/src/rust/components/viewer/wiring.rs +505 -0
  117. package/src/rust/components/viewer.rs +243 -758
  118. package/src/rust/config/export_method.rs +1 -1
  119. package/src/rust/config/mod.rs +4 -0
  120. package/src/rust/config/options.rs +71 -0
  121. package/src/rust/config/viewer_config.rs +24 -2
  122. package/src/rust/config/workspace_config.rs +92 -0
  123. package/src/rust/custom_elements/copy_dropdown.rs +9 -3
  124. package/src/rust/custom_elements/debug_plugin.rs +20 -1
  125. package/src/rust/custom_elements/export_dropdown.rs +9 -3
  126. package/src/rust/custom_elements/viewer.rs +1015 -286
  127. package/src/rust/custom_events.rs +212 -61
  128. package/src/rust/js/mod.rs +2 -0
  129. package/src/rust/js/plugin.rs +297 -10
  130. package/src/rust/js/regular_layout.rs +258 -0
  131. package/src/rust/lib.rs +20 -2
  132. package/src/rust/presentation.rs +66 -33
  133. package/src/rust/queries/get_viewer_config.rs +29 -11
  134. package/src/rust/queries/plugin_column_styles.rs +2 -2
  135. package/src/rust/renderer/activate.rs +41 -14
  136. package/src/rust/renderer/dispatch.rs +436 -0
  137. package/src/rust/renderer/plugin_config.rs +495 -0
  138. package/src/rust/renderer/registry.rs +18 -6
  139. package/src/rust/renderer/render_timer.rs +29 -10
  140. package/src/rust/renderer.rs +350 -827
  141. package/src/rust/session/column_defaults_update.rs +26 -8
  142. package/src/rust/session/metadata.rs +11 -1
  143. package/src/rust/session/view_subscription.rs +30 -15
  144. package/src/rust/session.rs +753 -251
  145. package/src/rust/tasks/apply_global_filters.rs +89 -0
  146. package/src/rust/tasks/auto_pause.rs +171 -0
  147. package/src/rust/tasks/copy_export.rs +29 -19
  148. package/src/rust/tasks/create_panel.rs +243 -0
  149. package/src/rust/tasks/dismiss_render_warning.rs +3 -1
  150. package/src/rust/tasks/edit_expression.rs +4 -4
  151. package/src/rust/tasks/eject.rs +64 -23
  152. package/src/rust/tasks/mod.rs +28 -4
  153. package/src/rust/tasks/pipeline.rs +411 -0
  154. package/src/rust/tasks/presize_panels.rs +324 -0
  155. package/src/rust/tasks/reset_all.rs +22 -12
  156. package/src/rust/tasks/resize_observer.rs +124 -87
  157. package/src/rust/tasks/restore_and_render.rs +80 -86
  158. package/src/rust/tasks/restore_panel.rs +145 -0
  159. package/src/rust/tasks/send_column_config.rs +5 -2
  160. package/src/rust/tasks/send_plugin_config.rs +5 -2
  161. package/src/rust/tasks/set_edit_mode.rs +59 -0
  162. package/src/rust/tasks/sync_update_panels.rs +152 -0
  163. package/src/rust/tasks/table_lifecycle.rs +158 -0
  164. package/src/rust/tasks/update_theme.rs +56 -12
  165. package/src/rust/utils/completion.rs +56 -0
  166. package/src/rust/utils/custom_element.rs +5 -0
  167. package/src/rust/utils/debounce.rs +130 -7
  168. package/src/rust/utils/mod.rs +6 -0
  169. package/src/rust/utils/pending_effects.rs +62 -0
  170. package/src/rust/{components/style/local_style.rs → utils/spawn.rs} +17 -19
  171. package/src/rust/utils/weak_scope.rs +0 -10
  172. package/src/rust/workspace.rs +846 -0
  173. package/src/svg/active-indicator.svg +3 -0
  174. package/src/themes/botanical.css +7 -2
  175. package/src/themes/defaults.css +54 -2
  176. package/src/themes/dracula.css +8 -3
  177. package/src/themes/gruvbox-dark.css +7 -2
  178. package/src/themes/gruvbox.css +5 -2
  179. package/src/themes/icons.css +4 -2
  180. package/src/themes/monokai.css +7 -2
  181. package/src/themes/phosphor.css +7 -2
  182. package/src/themes/pro-dark.css +7 -2
  183. package/src/themes/pro.css +2 -1
  184. package/src/themes/solarized-dark.css +5 -2
  185. package/src/themes/solarized.css +5 -2
  186. package/src/themes/vaporwave.css +7 -2
  187. package/src/ts/bootstrap.ts +8 -7
  188. package/src/ts/extensions.ts +30 -2
  189. package/src/ts/perspective-viewer.ts +10 -0
  190. package/src/ts/plugin.ts +72 -5
  191. package/src/ts/ts-rs/ClientOptions.ts +7 -0
  192. package/src/ts/ts-rs/ExportMethod.ts +3 -0
  193. package/src/ts/ts-rs/ExportOptions.ts +8 -0
  194. package/src/ts/ts-rs/GetClientOptions.ts +7 -0
  195. package/src/ts/ts-rs/GetTableOptions.ts +7 -0
  196. package/src/ts/ts-rs/Layout.ts +9 -0
  197. package/src/ts/ts-rs/Orientation.ts +6 -0
  198. package/src/ts/ts-rs/PanelOptions.ts +7 -0
  199. package/src/ts/ts-rs/PanelViewerConfig.ts +15 -0
  200. package/src/ts/ts-rs/SplitLayout.ts +5 -0
  201. package/src/ts/ts-rs/TabLayout.ts +11 -0
  202. package/src/ts/ts-rs/ViewerConfig.ts +6 -2
  203. package/src/ts/ts-rs/WorkspaceConfig.ts +36 -0
  204. package/src/ts/ts-rs/WorkspaceConfigUpdate.ts +24 -0
  205. package/tsconfig.json +1 -1
  206. package/src/rust/components/style/style_cache.rs +0 -136
  207. package/src/rust/tasks/intersection_observer.rs +0 -98
  208. package/src/rust/tasks/update_and_render.rs +0 -110
  209. /package/dist/wasm/snippets/{perspective-viewer-3cd58f0374935772/inline0.js → perspective-viewer-daeef4ceb066e6c7/inline1.js} +0 -0
  210. /package/dist/wasm/snippets/{perspective-viewer-3cd58f0374935772/inline1.js → perspective-viewer-daeef4ceb066e6c7/inline2.js} +0 -0
  211. /package/dist/wasm/snippets/{perspective-viewer-3cd58f0374935772/inline2.js → perspective-viewer-daeef4ceb066e6c7/inline3.js} +0 -0
  212. /package/dist/wasm/snippets/{perspective-viewer-3cd58f0374935772/inline4.js → perspective-viewer-daeef4ceb066e6c7/inline5.js} +0 -0
@@ -0,0 +1,3 @@
1
+ <svg width="12" height="12" viewBox="0 -0.5 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M15.1593 1.64958L10.3424 7.71878V7.81838L18 6.84731V10.1465L10.3424 9.27499V9.37459L15.2113 15.201L12.0195 16.9502L8.97725 10.1527H8.87974L5.58397 17L2.69772 15.2508L7.50813 9.33101V9.23142L0 10.1402L0 6.84108L7.44962 7.76858V7.66899L2.68472 1.74918L5.77898 0.0497986L8.91874 6.79751H9.02275L12.117 0L15.1593 1.64958Z" fill="#042121"/>
3
+ </svg>
@@ -14,11 +14,13 @@
14
14
 
15
15
  /* Register theme for auto-detection */
16
16
  perspective-viewer,
17
- perspective-viewer[theme="Botanical"] {
17
+ perspective-viewer[theme="Botanical"],
18
+ perspective-viewer [theme="Botanical"] {
18
19
  --psp-theme-name: "Botanical";
19
20
  }
20
21
 
21
- perspective-viewer[theme="Botanical"] {
22
+ perspective-viewer[theme="Botanical"],
23
+ perspective-viewer [theme="Botanical"] {
22
24
  /* perspective-viewer-botanical--colors */
23
25
  background-color: #1a2e1a;
24
26
  color: #e0ead8;
@@ -33,6 +35,7 @@ perspective-viewer[theme="Botanical"] {
33
35
  --psp-expression--function--color: #7bc96f;
34
36
  --psp-expression--psp-error--color: rgb(232, 131, 106);
35
37
  --psp-calendar--filter: invert(1);
38
+ --psp-input--filter: invert(1);
36
39
  --psp-warning--color: #1a2e1a;
37
40
  --psp-warning--background: var(--psp--color);
38
41
 
@@ -89,6 +92,7 @@ perspective-viewer[theme="Botanical"] {
89
92
  --psp-charts--map-tiles--attribution-: "I <3 Open Source";
90
93
  }
91
94
 
95
+ perspective-context-menu[theme="Botanical"],
92
96
  perspective-copy-menu[theme="Botanical"],
93
97
  perspective-export-menu[theme="Botanical"],
94
98
  perspective-dropdown[theme="Botanical"],
@@ -110,6 +114,7 @@ perspective-string-column-style[theme="Botanical"] {
110
114
  --psp-expression--function--color: #7bc96f;
111
115
  --psp-expression--psp-error--color: rgb(232, 131, 106);
112
116
  --psp-calendar--filter: invert(1);
117
+ --psp-input--filter: invert(1);
113
118
  --psp-warning--color: #1a2e1a;
114
119
  --psp-warning--background: var(--psp--color);
115
120
 
@@ -14,7 +14,21 @@
14
14
  @import "./intl.css";
15
15
 
16
16
  perspective-viewer,
17
- perspective-workspace,
17
+ /* Per-panel light-DOM descendants (the plugin + `<PanelTab>`, both carrying a
18
+ `theme` attribute) get the complete base too — so each panel resolves real
19
+ `color`/`font-family` and every `--psp-*` from its OWN theme instead of
20
+ inheriting the active panel's. Theme overrides refine this via the matching
21
+ `perspective-viewer [theme="X"]` rule.
22
+
23
+ `:where()` gives this clause ZERO specificity, so the panel's own
24
+ `[theme="X"]` override (specificity 0,1,1) ALWAYS wins over this default base.
25
+ Without it the two would tie at (0,1,1) and import order would decide — and
26
+ because every theme file `@import`s `defaults.css`, the base is inlined after
27
+ later overrides and the default would leak over the panel's theme. A
28
+ zero-specificity rule still beats inheritance, so the base values apply where
29
+ the override is silent. */
30
+ :where(perspective-viewer [theme]),
31
+ perspective-context-menu,
18
32
  perspective-copy-menu,
19
33
  perspective-export-menu,
20
34
  perspective-dropdown,
@@ -26,7 +40,6 @@ perspective-string-column-style {
26
40
  --psp--color: #161616;
27
41
 
28
42
  color: var(--psp--color);
29
- background-color: transparent;
30
43
 
31
44
  --psp-inactive--color: #ababab;
32
45
  --psp-inactive--border-color: #dadada;
@@ -127,9 +140,48 @@ perspective-string-column-style {
127
140
  #42b3d5 67.5%,
128
141
  #1a237e 100%
129
142
  );
143
+
144
+ /* Completeness anchors for per-panel theming. These are color/appearance
145
+ vars that some themes (e.g. Pro Dark) set but the light default does not
146
+ — so without a base value an unthemed/light panel would *inherit* them
147
+ from a differently-themed (active) panel, mixing themes. `initial` makes
148
+ the custom property the guaranteed-invalid value: consumers fall back to
149
+ their own default (identical to the current unthemed rendering) AND the
150
+ element no longer inherits a neighboring panel's value. A theme that
151
+ wants a real value overrides it in its `[theme="X"]` block as usual. */
152
+ --psp-active--background: initial;
153
+ --psp-calendar--filter: initial;
154
+ --psp-charts--legend--color: initial;
155
+ --psp-charts--tooltip--background: initial;
156
+ --psp-charts--treemap--hover-highlight: initial;
157
+ --psp-charts--treemap--labels: initial;
158
+ --psp-code-editor--column--color: initial;
159
+ --psp-code-editor--comment--color: initial;
160
+ --psp-code-editor--literal--color: initial;
161
+ --psp-code-editor--operator--color: initial;
162
+ --psp-code-editor--symbol--color: initial;
163
+ --psp-expression--error--color: initial;
164
+ --psp-expression--function--color: initial;
165
+ --psp-expression--operator--color: initial;
166
+ --psp-input--filter: initial;
167
+ --psp-openlayers--attribution--filter: initial;
168
+ --psp-charts--series-11--color: initial;
169
+ --psp-charts--series-12--color: initial;
170
+ --psp-charts--map-tiles--url: initial;
171
+ --psp-column-type--boolean--color: initial;
172
+ --psp-column-type--date--color: initial;
173
+ --psp-column-type--float--color: initial;
174
+ --psp-column-type--string--color: initial;
175
+ --psp-datagrid--border-color: initial;
176
+ --psp-datagrid--hover--border-color: initial;
177
+ --psp-expression--psp-error--color: initial;
178
+ --psp-status-icon--connected--color: initial;
179
+ --psp-status-icon--initializing--color: initial;
180
+ --psp-status-icon--psp-error--color: initial;
130
181
  }
131
182
 
132
183
  /* Modal defaults */
184
+ perspective-context-menu,
133
185
  perspective-copy-menu,
134
186
  perspective-export-menu,
135
187
  perspective-dropdown,
@@ -13,11 +13,13 @@
13
13
  @import "./defaults.css";
14
14
 
15
15
  perspective-viewer,
16
- perspective-viewer[theme="Dracula"] {
16
+ perspective-viewer[theme="Dracula"],
17
+ perspective-viewer [theme="Dracula"] {
17
18
  --psp-theme-name: "Dracula";
18
19
  }
19
20
 
20
- perspective-viewer[theme="Dracula"] {
21
+ perspective-viewer[theme="Dracula"],
22
+ perspective-viewer [theme="Dracula"] {
21
23
  /* perspective-viewer-pro-dark--colors (overrides) */
22
24
  background-color: #242526;
23
25
  color: white;
@@ -32,6 +34,7 @@ perspective-viewer[theme="Dracula"] {
32
34
  --psp-expression--function--color: #22a0ce;
33
35
  --psp-expression--psp-error--color: rgb(255, 136, 136);
34
36
  --psp-calendar--filter: invert(1);
37
+ --psp-input--filter: invert(1);
35
38
  --psp-warning--color: #242526;
36
39
  --psp-warning--background: var(--psp--color);
37
40
 
@@ -121,7 +124,7 @@ perspective-viewer[theme="Dracula"] {
121
124
  --theme-pink: #ff79c6;
122
125
 
123
126
  color: var(--theme-fg0);
124
- background-color: var(--theme-bg0);
127
+ background-color: var(--theme-bg1);
125
128
  --psp--color: var(--theme-fg1);
126
129
  --psp-inactive--color: var(--theme-fg2);
127
130
  --psp-inactive--border-color: var(--theme-bg2);
@@ -153,6 +156,7 @@ perspective-viewer[theme="Dracula"] {
153
156
  ) !important;
154
157
  }
155
158
 
159
+ perspective-context-menu[theme="Dracula"],
156
160
  perspective-copy-menu[theme="Dracula"],
157
161
  perspective-export-menu[theme="Dracula"],
158
162
  perspective-dropdown[theme="Dracula"] {
@@ -170,6 +174,7 @@ perspective-dropdown[theme="Dracula"] {
170
174
  --psp-expression--function--color: #22a0ce;
171
175
  --psp-expression--psp-error--color: rgb(255, 136, 136);
172
176
  --psp-calendar--filter: invert(1);
177
+ --psp-input--filter: invert(1);
173
178
  --psp-warning--color: #242526;
174
179
  --psp-warning--background: var(--psp--color);
175
180
  --psp-icon--select-arrow--mask-image: var(
@@ -13,11 +13,13 @@
13
13
  @import "./defaults.css";
14
14
 
15
15
  perspective-viewer,
16
- perspective-viewer[theme="Gruvbox Dark"] {
16
+ perspective-viewer[theme="Gruvbox Dark"],
17
+ perspective-viewer [theme="Gruvbox Dark"] {
17
18
  --psp-theme-name: "Gruvbox Dark";
18
19
  }
19
20
 
20
- perspective-viewer[theme="Gruvbox Dark"] {
21
+ perspective-viewer[theme="Gruvbox Dark"],
22
+ perspective-viewer [theme="Gruvbox Dark"] {
21
23
  /* perspective-viewer-pro-dark--colors (overrides) */
22
24
  background-color: #242526;
23
25
  color: white;
@@ -32,6 +34,7 @@ perspective-viewer[theme="Gruvbox Dark"] {
32
34
  --psp-expression--function--color: #22a0ce;
33
35
  --psp-expression--psp-error--color: rgb(255, 136, 136);
34
36
  --psp-calendar--filter: invert(1);
37
+ --psp-input--filter: invert(1);
35
38
  --psp-warning--color: #242526;
36
39
  --psp-warning--background: var(--psp--color);
37
40
 
@@ -166,6 +169,7 @@ perspective-viewer[theme="Gruvbox Dark"] {
166
169
  ) !important;
167
170
  }
168
171
 
172
+ perspective-context-menu[theme="Gruvbox Dark"],
169
173
  perspective-copy-menu[theme="Gruvbox Dark"],
170
174
  perspective-export-menu[theme="Gruvbox Dark"],
171
175
  perspective-dropdown[theme="Gruvbox Dark"] {
@@ -183,6 +187,7 @@ perspective-dropdown[theme="Gruvbox Dark"] {
183
187
  --psp-expression--function--color: #22a0ce;
184
188
  --psp-expression--psp-error--color: rgb(255, 136, 136);
185
189
  --psp-calendar--filter: invert(1);
190
+ --psp-input--filter: invert(1);
186
191
  --psp-warning--color: #242526;
187
192
  --psp-warning--background: var(--psp--color);
188
193
  --psp-icon--select-arrow--mask-image: var(
@@ -13,11 +13,13 @@
13
13
  @import "./defaults.css";
14
14
 
15
15
  perspective-viewer,
16
- perspective-viewer[theme="Gruvbox Light"] {
16
+ perspective-viewer[theme="Gruvbox Light"],
17
+ perspective-viewer [theme="Gruvbox Light"] {
17
18
  --psp-theme-name: "Gruvbox Light";
18
19
  }
19
20
 
20
- perspective-viewer[theme="Gruvbox Light"] {
21
+ perspective-viewer[theme="Gruvbox Light"],
22
+ perspective-viewer [theme="Gruvbox Light"] {
21
23
  /* perspective-viewer-gruvbox-light--colors */
22
24
  --theme-fg0: #282828;
23
25
  --theme-fg1: #3c3836;
@@ -83,6 +85,7 @@ perspective-viewer[theme="Gruvbox Light"] {
83
85
  ) !important;
84
86
  }
85
87
 
88
+ perspective-context-menu[theme="Gruvbox Light"],
86
89
  perspective-copy-menu[theme="Gruvbox Light"],
87
90
  perspective-export-menu[theme="Gruvbox Light"],
88
91
  perspective-dropdown[theme="Gruvbox Light"] {
@@ -11,14 +11,15 @@
11
11
  * ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ */
12
12
 
13
13
  perspective-viewer,
14
- perspective-workspace,
14
+ perspective-context-menu,
15
15
  perspective-copy-menu,
16
16
  perspective-export-menu,
17
17
  perspective-dropdown,
18
18
  perspective-date-column-style,
19
19
  perspective-datetime-column-style,
20
20
  perspective-number-column-style,
21
- perspective-string-column-style {
21
+ perspective-string-column-style,
22
+ perspective-viewer-tab {
22
23
  /* Icons */
23
24
  --psp-column-type--integer--mask-image: url("../svg/number-type.svg");
24
25
  --psp-column-type--float--mask-image: var(
@@ -55,6 +56,7 @@ perspective-string-column-style {
55
56
  --psp-label--active-column-selector--content: url("../svg/checkbox-checked-icon.svg");
56
57
  --psp-icon--select-arrow-light--mask-image: url("../svg/dropdown-selector-light.svg");
57
58
  --psp-icon--select-arrow-dark--mask-image: url("../svg/dropdown-selector.svg");
59
+ --psp-icon--active-indicator--mask-image: url("../svg/active-indicator.svg");
58
60
  --psp-icon-overflow-hint--content: "!";
59
61
  --psp-label--reset-button-icon--content: "refresh";
60
62
  --psp-label--save-button-icon--content: "save";
@@ -13,11 +13,13 @@
13
13
  @import "./defaults.css";
14
14
 
15
15
  perspective-viewer,
16
- perspective-viewer[theme="Monokai"] {
16
+ perspective-viewer[theme="Monokai"],
17
+ perspective-viewer [theme="Monokai"] {
17
18
  --psp-theme-name: "Monokai";
18
19
  }
19
20
 
20
- perspective-viewer[theme="Monokai"] {
21
+ perspective-viewer[theme="Monokai"],
22
+ perspective-viewer [theme="Monokai"] {
21
23
  /* perspective-viewer-pro-dark--colors (overrides) */
22
24
  background-color: #242526;
23
25
  color: white;
@@ -32,6 +34,7 @@ perspective-viewer[theme="Monokai"] {
32
34
  --psp-expression--function--color: #22a0ce;
33
35
  --psp-expression--psp-error--color: rgb(255, 136, 136);
34
36
  --psp-calendar--filter: invert(1);
37
+ --psp-input--filter: invert(1);
35
38
  --psp-warning--color: #242526;
36
39
  --psp-warning--background: var(--psp--color);
37
40
 
@@ -162,6 +165,7 @@ perspective-viewer[theme="Monokai"] {
162
165
  );
163
166
  }
164
167
 
168
+ perspective-context-menu[theme="Monokai"],
165
169
  perspective-copy-menu[theme="Monokai"],
166
170
  perspective-export-menu[theme="Monokai"],
167
171
  perspective-dropdown[theme="Monokai"],
@@ -183,6 +187,7 @@ perspective-string-column-style[theme="Monokai"] {
183
187
  --psp-expression--function--color: #22a0ce;
184
188
  --psp-expression--psp-error--color: rgb(255, 136, 136);
185
189
  --psp-calendar--filter: invert(1);
190
+ --psp-input--filter: invert(1);
186
191
  --psp-warning--color: #242526;
187
192
  --psp-warning--background: var(--psp--color);
188
193
  --psp-icon--select-arrow--mask-image: var(
@@ -13,11 +13,13 @@
13
13
  @import "./defaults.css";
14
14
 
15
15
  perspective-viewer,
16
- perspective-viewer[theme="Phosphor"] {
16
+ perspective-viewer[theme="Phosphor"],
17
+ perspective-viewer [theme="Phosphor"] {
17
18
  --psp-theme-name: "Phosphor";
18
19
  }
19
20
 
20
- perspective-viewer[theme="Phosphor"] {
21
+ perspective-viewer[theme="Phosphor"],
22
+ perspective-viewer [theme="Phosphor"] {
21
23
  /* perspective-viewer-phosphor--colors */
22
24
  --theme-bg0: #0a0a0a;
23
25
  --theme-bg1: #0d0d0d;
@@ -43,6 +45,7 @@ perspective-viewer[theme="Phosphor"] {
43
45
  --psp-expression--function--color: var(--theme-green-bright);
44
46
  --psp-expression--psp-error--color: var(--theme-red);
45
47
  --psp-calendar--filter: invert(1) hue-rotate(70deg);
48
+ --psp-input--filter: invert(1) hue-rotate(70deg);
46
49
  --psp-warning--color: var(--theme-bg0);
47
50
  --psp-warning--background: var(--theme-amber);
48
51
 
@@ -123,6 +126,7 @@ perspective-viewer[theme="Phosphor"] {
123
126
  );
124
127
  }
125
128
 
129
+ perspective-context-menu[theme="Phosphor"],
126
130
  perspective-copy-menu[theme="Phosphor"],
127
131
  perspective-export-menu[theme="Phosphor"],
128
132
  perspective-dropdown[theme="Phosphor"],
@@ -153,6 +157,7 @@ perspective-string-column-style[theme="Phosphor"] {
153
157
  --psp-expression--function--color: var(--theme-green-bright);
154
158
  --psp-expression--psp-error--color: var(--theme-red);
155
159
  --psp-calendar--filter: invert(1) hue-rotate(70deg);
160
+ --psp-input--filter: invert(1) hue-rotate(70deg);
156
161
  --psp-warning--color: var(--theme-bg0);
157
162
  --psp-warning--background: var(--theme-amber);
158
163
  --psp-icon--select-arrow--mask-image: var(
@@ -14,11 +14,13 @@
14
14
 
15
15
  /* Register theme for auto-detection */
16
16
  perspective-viewer,
17
- perspective-viewer[theme="Pro Dark"] {
17
+ perspective-viewer[theme="Pro Dark"],
18
+ perspective-viewer [theme="Pro Dark"] {
18
19
  --psp-theme-name: "Pro Dark";
19
20
  }
20
21
 
21
- perspective-viewer[theme="Pro Dark"] {
22
+ perspective-viewer[theme="Pro Dark"],
23
+ perspective-viewer [theme="Pro Dark"] {
22
24
  /* perspective-viewer-pro-dark--colors (overrides) */
23
25
  background-color: #242526;
24
26
  color: white;
@@ -33,6 +35,7 @@ perspective-viewer[theme="Pro Dark"] {
33
35
  --psp-expression--function--color: #22a0ce;
34
36
  --psp-expression--error--color: rgb(255, 136, 136);
35
37
  --psp-calendar--filter: invert(1);
38
+ --psp-input--filter: invert(1);
36
39
  --psp-warning--color: #242526;
37
40
  --psp-warning--background: var(--psp--color);
38
41
 
@@ -106,6 +109,7 @@ perspective-viewer[theme="Pro Dark"] {
106
109
  );
107
110
  }
108
111
 
112
+ perspective-context-menu[theme="Pro Dark"],
109
113
  perspective-copy-menu[theme="Pro Dark"],
110
114
  perspective-export-menu[theme="Pro Dark"],
111
115
  perspective-dropdown[theme="Pro Dark"],
@@ -127,6 +131,7 @@ perspective-string-column-style[theme="Pro Dark"] {
127
131
  --psp-expression--function--color: #22a0ce;
128
132
  --psp-expression--error--color: rgb(255, 136, 136);
129
133
  --psp-calendar--filter: invert(1);
134
+ --psp-input--filter: invert(1);
130
135
  --psp-warning--color: #242526;
131
136
  --psp-warning--background: var(--psp--color);
132
137
 
@@ -13,6 +13,7 @@
13
13
  @import "./defaults.css";
14
14
 
15
15
  perspective-viewer,
16
- perspective-viewer[theme="Pro Light"] {
16
+ perspective-viewer[theme="Pro Light"],
17
+ perspective-viewer [theme="Pro Light"] {
17
18
  --psp-theme-name: "Pro Light";
18
19
  }
@@ -13,11 +13,13 @@
13
13
  @import "./defaults.css";
14
14
 
15
15
  perspective-viewer,
16
- perspective-viewer[theme="Solarized Dark"] {
16
+ perspective-viewer[theme="Solarized Dark"],
17
+ perspective-viewer [theme="Solarized Dark"] {
17
18
  --psp-theme-name: "Solarized Dark";
18
19
  }
19
20
 
20
- perspective-viewer[theme="Solarized Dark"] {
21
+ perspective-viewer[theme="Solarized Dark"],
22
+ perspective-viewer [theme="Solarized Dark"] {
21
23
  /* perspective-viewer-solarized--colors */
22
24
  color: #586e75;
23
25
  background-color: #eee8d5;
@@ -82,6 +84,7 @@ perspective-viewer[theme="Solarized Dark"] {
82
84
  );
83
85
  }
84
86
 
87
+ perspective-context-menu[theme="Solarized Dark"],
85
88
  perspective-copy-menu[theme="Solarized Dark"],
86
89
  perspective-export-menu[theme="Solarized Dark"],
87
90
  perspective-dropdown[theme="Solarized Dark"],
@@ -13,11 +13,13 @@
13
13
  @import "./defaults.css";
14
14
 
15
15
  perspective-viewer,
16
- perspective-viewer[theme="Solarized"] {
16
+ perspective-viewer[theme="Solarized"],
17
+ perspective-viewer [theme="Solarized"] {
17
18
  --psp-theme-name: "Solarized";
18
19
  }
19
20
 
20
- perspective-viewer[theme="Solarized"] {
21
+ perspective-viewer[theme="Solarized"],
22
+ perspective-viewer [theme="Solarized"] {
21
23
  /* perspective-viewer-solarized--colors */
22
24
  color: #586e75;
23
25
  background-color: #eee8d5;
@@ -61,6 +63,7 @@ x {
61
63
  color: #cb4b16;
62
64
  }
63
65
 
66
+ perspective-context-menu[theme="Solarized"],
64
67
  perspective-copy-menu[theme="Solarized"],
65
68
  perspective-export-menu[theme="Solarized"],
66
69
  perspective-dropdown[theme="Solarized"],
@@ -13,11 +13,13 @@
13
13
  @import "./defaults.css";
14
14
 
15
15
  perspective-viewer,
16
- perspective-viewer[theme="Vaporwave"] {
16
+ perspective-viewer[theme="Vaporwave"],
17
+ perspective-viewer [theme="Vaporwave"] {
17
18
  --psp-theme-name: "Vaporwave";
18
19
  }
19
20
 
20
- perspective-viewer[theme="Vaporwave"] {
21
+ perspective-viewer[theme="Vaporwave"],
22
+ perspective-viewer [theme="Vaporwave"] {
21
23
  /* perspective-viewer-pro-dark--colors (overrides) */
22
24
  background-color: #242526;
23
25
  color: white;
@@ -32,6 +34,7 @@ perspective-viewer[theme="Vaporwave"] {
32
34
  --psp-expression--function--color: #22a0ce;
33
35
  --psp-expression--psp-error--color: rgb(255, 136, 136);
34
36
  --psp-calendar--filter: invert(1);
37
+ --psp-input--filter: invert(1);
35
38
  --psp-warning--color: #242526;
36
39
  --psp-warning--background: var(--psp--color);
37
40
 
@@ -174,6 +177,7 @@ perspective-viewer[theme="Vaporwave"] {
174
177
  ) !important;
175
178
  }
176
179
 
180
+ perspective-context-menu[theme="Vaporwave"],
177
181
  perspective-copy-menu[theme="Vaporwave"],
178
182
  perspective-export-menu[theme="Vaporwave"],
179
183
  perspective-dropdown[theme="Vaporwave"],
@@ -195,6 +199,7 @@ perspective-string-column-style[theme="Vaporwave"] {
195
199
  --psp-expression--function--color: #22a0ce;
196
200
  --psp-expression--psp-error--color: rgb(255, 136, 136);
197
201
  --psp-calendar--filter: invert(1);
202
+ --psp-input--filter: invert(1);
198
203
  --psp-warning--color: #242526;
199
204
  --psp-warning--background: var(--psp--color);
200
205
  --psp-icon--select-arrow--mask-image: var(
@@ -26,12 +26,13 @@ export async function init_client(
26
26
  ) {
27
27
  // @ts-ignore
28
28
  const url = await worker_url.getWorkerURL();
29
- if (wasm_module === undefined) {
30
- wasm_module = (await import(url)) as typeof wasm_module_type;
31
- }
29
+ const [wasm_module2, module_or_path] = await Promise.all([
30
+ wasm_module === undefined ? import(url) : wasm_module,
31
+ load_wasm_stage_0(wasm_binary).then((unzipped) =>
32
+ WebAssembly.compile(unzipped as BufferSource),
33
+ ),
34
+ ]);
32
35
 
33
- const unzipped = await load_wasm_stage_0(wasm_binary);
34
- const module_or_path = await WebAssembly.compile(unzipped as BufferSource);
35
- await wasm_module.default({ module_or_path });
36
- await wasm_module.init(module_or_path, url);
36
+ await wasm_module2.default({ module_or_path });
37
+ await wasm_module2.init(module_or_path, url);
37
38
  }
@@ -26,18 +26,21 @@ export class PerspectiveSelectDetail {
26
26
  column_names?: string[];
27
27
  removeConfigs: ViewConfigUpdate[];
28
28
  insertConfigs: ViewConfigUpdate[];
29
+ panel?: string;
29
30
  constructor(
30
31
  selected: boolean,
31
32
  row: Record<string, unknown>,
32
33
  column_names: string[],
33
34
  removeConfigs: ViewConfigUpdate[],
34
35
  insertConfigs: ViewConfigUpdate[],
36
+ panel?: string,
35
37
  ) {
36
38
  this.selected = selected;
37
39
  this.row = row;
38
40
  this.column_names = column_names;
39
41
  this.removeConfigs = removeConfigs;
40
42
  this.insertConfigs = insertConfigs;
43
+ this.panel = panel;
41
44
  }
42
45
 
43
46
  get removeFilters(): Filter[] {
@@ -72,12 +75,27 @@ export type PerspectiveClickEventDetail = {
72
75
  config: ViewerConfigUpdate;
73
76
  row: Record<string, any>;
74
77
  column_names: Array<string | Array<string>>;
78
+ panel?: string;
75
79
  };
76
80
 
77
81
  export type PerspectiveSelectEventDetail = {
78
82
  view_window: ViewWindow;
79
83
  };
80
84
 
85
+ export type PerspectiveConfigUpdateEventDetail = {
86
+ /**
87
+ * Serialize the panel config that triggered this event, ON DEMAND. The
88
+ * serialization is deferred so a config change with no interested listener
89
+ * costs nothing; call `getConfig()` only if you need the config.
90
+ *
91
+ * Valid ONLY synchronously within the event callback — the backing closure
92
+ * is released immediately after dispatch, so stashing `getConfig` and
93
+ * calling it later throws. To read config outside the callback, use
94
+ * `viewer.save()` / `viewer.saveWorkspace()`.
95
+ */
96
+ getConfig(): ViewerConfigUpdate;
97
+ };
98
+
81
99
  // JSX / React extensions
82
100
 
83
101
  type ReactPerspectiveViewerAttributes<T> = React.HTMLAttributes<T>;
@@ -196,7 +214,13 @@ export interface PerspectiveViewerElementExt {
196
214
 
197
215
  addEventListener(
198
216
  name: "perspective-global-filter",
199
- cb: (e: CustomEvent<PerspectiveSelectEventDetail>) => void,
217
+ cb: (e: CustomEvent<PerspectiveSelectDetail>) => void,
218
+ options?: { signal: AbortSignal },
219
+ ): void;
220
+
221
+ addEventListener(
222
+ name: "perspective-global-filter-update",
223
+ cb: (e: CustomEvent<Filter[]>) => void,
200
224
  options?: { signal: AbortSignal },
201
225
  ): void;
202
226
 
@@ -214,7 +238,7 @@ export interface PerspectiveViewerElementExt {
214
238
 
215
239
  addEventListener(
216
240
  name: "perspective-config-update",
217
- cb: (e: CustomEvent) => void,
241
+ cb: (e: CustomEvent<PerspectiveConfigUpdateEventDetail>) => void,
218
242
  options?: { signal: AbortSignal },
219
243
  ): void;
220
244
 
@@ -239,6 +263,10 @@ export interface PerspectiveViewerElementExt {
239
263
  removeEventListener(name: "perspective-click", cb: any): void;
240
264
  removeEventListener(name: "perspective-select", cb: any): void;
241
265
  removeEventListener(name: "perspective-global-filter", cb: any): void;
266
+ removeEventListener(
267
+ name: "perspective-global-filter-update",
268
+ cb: any,
269
+ ): void;
242
270
  removeEventListener(name: "perspective-toggle-settings", cb: any): void;
243
271
  removeEventListener(
244
272
  name: "perspective-toggle-settings-before",
@@ -31,6 +31,8 @@
31
31
  * @module perspective-viewer
32
32
  */
33
33
 
34
+ import "regular-layout";
35
+
34
36
  export { IPerspectiveViewerPlugin } from "./plugin";
35
37
  export { HTMLPerspectiveViewerPluginElement } from "./plugin";
36
38
 
@@ -46,10 +48,18 @@ export type * from "./extensions.ts";
46
48
  export { PerspectiveSelectDetail } from "./extensions.ts";
47
49
  export type * from "./ts-rs/ViewerConfigUpdate.d.ts";
48
50
  export type * from "./ts-rs/ViewerConfig.d.ts";
51
+ export type * from "./ts-rs/WorkspaceConfigUpdate.d.ts";
52
+ export type * from "./ts-rs/WorkspaceConfig.d.ts";
49
53
  export type * from "./ts-rs/Filter.d.ts";
50
54
  export type * from "./ts-rs/FilterTerm.d.ts";
51
55
  export type * from "./ts-rs/FilterReducer.d.ts";
52
56
  export type * from "./ts-rs/PluginStaticConfig.ts";
57
+ export type * from "./ts-rs/ExportMethod.d.ts";
58
+ export type * from "./ts-rs/PanelOptions.d.ts";
59
+ export type * from "./ts-rs/ClientOptions.d.ts";
60
+ export type * from "./ts-rs/ExportOptions.d.ts";
61
+ export type * from "./ts-rs/GetTableOptions.d.ts";
62
+ export type * from "./ts-rs/GetClientOptions.d.ts";
53
63
 
54
64
  export { init_client } from "./bootstrap";
55
65
  import { init_client } from "./bootstrap";