@perspective-dev/viewer 4.5.2 → 5.1.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 (227) 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/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/extensions.d.ts +22 -3
  24. package/dist/esm/perspective-viewer.d.ts +9 -0
  25. package/dist/esm/perspective-viewer.inline.js +20 -1
  26. package/dist/esm/perspective-viewer.inline.js.map +4 -4
  27. package/dist/esm/perspective-viewer.js +20 -1
  28. package/dist/esm/perspective-viewer.js.map +4 -4
  29. package/dist/esm/plugin.d.ts +71 -5
  30. package/dist/esm/ts-rs/ClientOptions.d.ts +7 -0
  31. package/dist/esm/ts-rs/ExportMethod.d.ts +1 -0
  32. package/dist/esm/ts-rs/ExportOptions.d.ts +9 -0
  33. package/dist/esm/ts-rs/GetClientOptions.d.ts +8 -0
  34. package/dist/esm/ts-rs/GetTableOptions.d.ts +8 -0
  35. package/dist/esm/ts-rs/Layout.d.ts +11 -0
  36. package/dist/esm/ts-rs/Orientation.d.ts +4 -0
  37. package/dist/esm/ts-rs/PanelOptions.d.ts +7 -0
  38. package/dist/esm/ts-rs/PanelViewerConfig.d.ts +41 -0
  39. package/dist/esm/ts-rs/SplitLayout.d.ts +7 -0
  40. package/dist/esm/ts-rs/TabLayout.d.ts +10 -0
  41. package/dist/esm/ts-rs/ViewerConfig.d.ts +8 -2
  42. package/dist/esm/ts-rs/ViewerConfigUpdate.d.ts +9 -0
  43. package/dist/esm/ts-rs/WindowAggregate.d.ts +1 -0
  44. package/dist/esm/ts-rs/WindowSort.d.ts +7 -0
  45. package/dist/esm/ts-rs/WindowSortDir.d.ts +6 -0
  46. package/dist/esm/ts-rs/WindowSpec.d.ts +46 -0
  47. package/dist/esm/ts-rs/Windows.d.ts +10 -0
  48. package/dist/esm/ts-rs/WorkspaceConfig.d.ts +40 -0
  49. package/dist/esm/ts-rs/WorkspaceConfigUpdate.d.ts +28 -0
  50. package/dist/wasm/perspective-viewer.d.ts +299 -78
  51. package/dist/wasm/perspective-viewer.js +544 -186
  52. package/dist/wasm/perspective-viewer.wasm +0 -0
  53. package/dist/wasm/perspective-viewer.wasm.d.ts +34 -26
  54. package/dist/wasm/snippets/perspective-viewer-8a8c7d5d696b43ae/inline0.js +6 -0
  55. package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline3.js → perspective-viewer-8a8c7d5d696b43ae/inline4.js} +5 -0
  56. package/package.json +3 -2
  57. package/src/css/_context_menu.css +14 -0
  58. package/src/css/column-selector.css +1 -0
  59. package/src/css/column-settings-panel.css +68 -3
  60. package/src/css/column-style.css +4 -3
  61. package/src/css/config-selector.css +22 -1
  62. package/src/css/containers/context-menu.css +107 -0
  63. package/src/css/containers/tabs.css +2 -2
  64. package/src/css/panel-tab.css +193 -0
  65. package/src/css/plugin-selector.css +7 -10
  66. package/src/css/status-bar.css +75 -81
  67. package/src/css/viewer.css +188 -70
  68. package/src/rust/components/column_dropdown.rs +40 -30
  69. package/src/rust/components/column_selector/active_column.rs +28 -45
  70. package/src/rust/components/column_selector/aggregate_selector.rs +4 -7
  71. package/src/rust/components/column_selector/column_selector_column_row.rs +73 -0
  72. package/src/rust/components/column_selector/config_selector.rs +40 -82
  73. package/src/rust/components/column_selector/expr_edit_button.rs +7 -1
  74. package/src/rust/components/column_selector/filter_column.rs +5 -15
  75. package/src/rust/components/column_selector/inactive_column.rs +11 -9
  76. package/src/rust/components/column_selector/sort_column.rs +3 -6
  77. package/src/rust/components/column_selector.rs +25 -14
  78. package/src/rust/components/column_settings_sidebar/style_tab.rs +2 -1
  79. package/src/rust/components/column_settings_sidebar/window_tab.rs +34 -0
  80. package/src/rust/components/column_settings_sidebar.rs +163 -16
  81. package/src/rust/components/containers/dragdrop_list.rs +73 -3
  82. package/src/rust/components/containers/sidebar.rs +99 -22
  83. package/src/rust/components/containers/split_panel.rs +181 -62
  84. package/src/rust/components/context_menu.rs +130 -0
  85. package/src/rust/components/editable_header.rs +2 -0
  86. package/src/rust/components/form/debug.rs +3 -0
  87. package/src/rust/components/global_filter_bar.rs +76 -0
  88. package/src/rust/components/main_panel/frame_theme.rs +186 -0
  89. package/src/rust/components/main_panel/msg.rs +62 -0
  90. package/src/rust/components/main_panel/presize.rs +220 -0
  91. package/src/rust/components/main_panel/reconcile.rs +224 -0
  92. package/src/rust/components/main_panel/render.rs +385 -0
  93. package/src/rust/components/main_panel/update.rs +184 -0
  94. package/src/rust/components/main_panel.rs +316 -71
  95. package/src/rust/components/mod.rs +5 -0
  96. package/src/rust/components/panel_menu.rs +493 -0
  97. package/src/rust/components/panel_tab.rs +510 -0
  98. package/src/rust/components/plugin_tab.rs +1 -1
  99. package/src/rust/components/portal.rs +7 -0
  100. package/src/rust/components/settings_panel.rs +13 -5
  101. package/src/rust/components/status_bar.rs +110 -178
  102. package/src/rust/components/status_indicator.rs +6 -9
  103. package/src/rust/components/style/mod.rs +5 -0
  104. package/src/rust/components/style/style_provider.rs +2 -0
  105. package/src/rust/components/viewer/filters.rs +133 -0
  106. package/src/rust/components/viewer/msg.rs +182 -0
  107. package/src/rust/components/viewer/panels.rs +326 -0
  108. package/src/rust/components/viewer/render.rs +255 -0
  109. package/src/rust/components/viewer/settings.rs +434 -0
  110. package/src/rust/components/viewer/snapshots.rs +134 -0
  111. package/src/rust/components/viewer/wiring.rs +505 -0
  112. package/src/rust/components/viewer.rs +245 -756
  113. package/src/rust/components/window_editor.rs +1013 -0
  114. package/src/rust/config/export_method.rs +1 -1
  115. package/src/rust/config/mod.rs +4 -0
  116. package/src/rust/config/options.rs +71 -0
  117. package/src/rust/config/viewer_config.rs +24 -2
  118. package/src/rust/config/workspace_config.rs +92 -0
  119. package/src/rust/custom_elements/copy_dropdown.rs +3 -1
  120. package/src/rust/custom_elements/debug_plugin.rs +20 -1
  121. package/src/rust/custom_elements/export_dropdown.rs +3 -1
  122. package/src/rust/custom_elements/viewer.rs +1015 -286
  123. package/src/rust/custom_events.rs +212 -61
  124. package/src/rust/js/mod.rs +2 -0
  125. package/src/rust/js/plugin.rs +297 -10
  126. package/src/rust/js/regular_layout.rs +258 -0
  127. package/src/rust/lib.rs +24 -2
  128. package/src/rust/presentation/column_locator.rs +16 -1
  129. package/src/rust/presentation.rs +66 -33
  130. package/src/rust/queries/columns_iter_set.rs +7 -1
  131. package/src/rust/queries/get_viewer_config.rs +29 -11
  132. package/src/rust/queries/plugin_column_styles.rs +2 -2
  133. package/src/rust/renderer/activate.rs +41 -14
  134. package/src/rust/renderer/dispatch.rs +463 -0
  135. package/src/rust/renderer/plugin_config.rs +495 -0
  136. package/src/rust/renderer/registry.rs +18 -6
  137. package/src/rust/renderer/render_timer.rs +29 -10
  138. package/src/rust/renderer.rs +384 -838
  139. package/src/rust/session/column_defaults_update.rs +26 -8
  140. package/src/rust/session/drag_drop_update.rs +18 -0
  141. package/src/rust/session/metadata.rs +66 -9
  142. package/src/rust/session/replace_expression_update.rs +1 -0
  143. package/src/rust/session/view_subscription.rs +30 -15
  144. package/src/rust/session.rs +755 -264
  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/edit_window.rs +155 -0
  152. package/src/rust/tasks/eject.rs +64 -23
  153. package/src/rust/tasks/mod.rs +30 -4
  154. package/src/rust/tasks/pipeline.rs +411 -0
  155. package/src/rust/tasks/presize_panels.rs +324 -0
  156. package/src/rust/tasks/reset_all.rs +22 -12
  157. package/src/rust/tasks/resize_observer.rs +124 -87
  158. package/src/rust/tasks/restore_and_render.rs +80 -86
  159. package/src/rust/tasks/restore_panel.rs +145 -0
  160. package/src/rust/tasks/send_column_config.rs +5 -2
  161. package/src/rust/tasks/send_plugin_config.rs +5 -2
  162. package/src/rust/tasks/set_edit_mode.rs +59 -0
  163. package/src/rust/tasks/sync_update_panels.rs +152 -0
  164. package/src/rust/tasks/table_lifecycle.rs +158 -0
  165. package/src/rust/tasks/update_theme.rs +56 -12
  166. package/src/rust/utils/browser/dragdrop.rs +12 -0
  167. package/src/rust/utils/browser/tests/debounce.rs +49 -0
  168. package/src/rust/utils/completion.rs +56 -0
  169. package/src/rust/utils/custom_element.rs +5 -0
  170. package/src/rust/utils/debounce.rs +189 -17
  171. package/src/rust/utils/mod.rs +6 -0
  172. package/src/rust/utils/pending_effects.rs +62 -0
  173. package/src/rust/utils/spawn.rs +33 -0
  174. package/src/rust/utils/weak_scope.rs +0 -10
  175. package/src/rust/workspace.rs +846 -0
  176. package/src/svg/active-indicator.svg +3 -0
  177. package/src/svg/pin-icon.svg +5 -0
  178. package/src/themes/botanical.css +5 -2
  179. package/src/themes/defaults.css +54 -2
  180. package/src/themes/dracula.css +6 -3
  181. package/src/themes/gruvbox-dark.css +5 -2
  182. package/src/themes/gruvbox.css +5 -2
  183. package/src/themes/icons.css +5 -2
  184. package/src/themes/intl/de.css +7 -0
  185. package/src/themes/intl/es.css +7 -0
  186. package/src/themes/intl/fr.css +7 -0
  187. package/src/themes/intl/ja.css +7 -0
  188. package/src/themes/intl/pt.css +7 -0
  189. package/src/themes/intl/zh.css +7 -0
  190. package/src/themes/intl.css +10 -1
  191. package/src/themes/monokai.css +5 -2
  192. package/src/themes/phosphor.css +5 -2
  193. package/src/themes/pro-dark.css +5 -2
  194. package/src/themes/pro.css +2 -1
  195. package/src/themes/solarized-dark.css +5 -2
  196. package/src/themes/solarized.css +5 -2
  197. package/src/themes/vaporwave.css +5 -2
  198. package/src/ts/bootstrap.ts +8 -7
  199. package/src/ts/extensions.ts +30 -2
  200. package/src/ts/perspective-viewer.ts +10 -0
  201. package/src/ts/plugin.ts +72 -5
  202. package/src/ts/ts-rs/ClientOptions.ts +7 -0
  203. package/src/ts/ts-rs/ExportMethod.ts +3 -0
  204. package/src/ts/ts-rs/ExportOptions.ts +8 -0
  205. package/src/ts/ts-rs/GetClientOptions.ts +7 -0
  206. package/src/ts/ts-rs/GetTableOptions.ts +7 -0
  207. package/src/ts/ts-rs/Layout.ts +9 -0
  208. package/src/ts/ts-rs/Orientation.ts +6 -0
  209. package/src/ts/ts-rs/PanelOptions.ts +7 -0
  210. package/src/ts/ts-rs/PanelViewerConfig.ts +16 -0
  211. package/src/ts/ts-rs/SplitLayout.ts +5 -0
  212. package/src/ts/ts-rs/TabLayout.ts +11 -0
  213. package/src/ts/ts-rs/ViewerConfig.ts +7 -2
  214. package/src/ts/ts-rs/ViewerConfigUpdate.ts +9 -0
  215. package/src/ts/ts-rs/WindowAggregate.ts +3 -0
  216. package/src/ts/ts-rs/WindowSort.ts +9 -0
  217. package/src/ts/ts-rs/WindowSortDir.ts +8 -0
  218. package/src/ts/ts-rs/WindowSpec.ts +46 -0
  219. package/src/ts/ts-rs/Windows.ts +10 -0
  220. package/src/ts/ts-rs/WorkspaceConfig.ts +36 -0
  221. package/src/ts/ts-rs/WorkspaceConfigUpdate.ts +24 -0
  222. package/src/rust/tasks/intersection_observer.rs +0 -98
  223. package/src/rust/tasks/update_and_render.rs +0 -110
  224. /package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline0.js → perspective-viewer-8a8c7d5d696b43ae/inline1.js} +0 -0
  225. /package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline1.js → perspective-viewer-8a8c7d5d696b43ae/inline2.js} +0 -0
  226. /package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline2.js → perspective-viewer-8a8c7d5d696b43ae/inline3.js} +0 -0
  227. /package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline4.js → perspective-viewer-8a8c7d5d696b43ae/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>
@@ -0,0 +1,5 @@
1
+ <svg width="14" height="14" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path
3
+ d="M8 2h6v2l-1 1v4l3 2v2h-4v6l-1 2-1-2v-6H6v-2l3-2V5L8 4z"
4
+ stroke="#042121" />
5
+ </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;
@@ -90,6 +92,7 @@ perspective-viewer[theme="Botanical"] {
90
92
  --psp-charts--map-tiles--attribution-: "I <3 Open Source";
91
93
  }
92
94
 
95
+ perspective-context-menu[theme="Botanical"],
93
96
  perspective-copy-menu[theme="Botanical"],
94
97
  perspective-export-menu[theme="Botanical"],
95
98
  perspective-dropdown[theme="Botanical"],
@@ -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;
@@ -122,7 +124,7 @@ perspective-viewer[theme="Dracula"] {
122
124
  --theme-pink: #ff79c6;
123
125
 
124
126
  color: var(--theme-fg0);
125
- background-color: var(--theme-bg0);
127
+ background-color: var(--theme-bg1);
126
128
  --psp--color: var(--theme-fg1);
127
129
  --psp-inactive--color: var(--theme-fg2);
128
130
  --psp-inactive--border-color: var(--theme-bg2);
@@ -154,6 +156,7 @@ perspective-viewer[theme="Dracula"] {
154
156
  ) !important;
155
157
  }
156
158
 
159
+ perspective-context-menu[theme="Dracula"],
157
160
  perspective-copy-menu[theme="Dracula"],
158
161
  perspective-export-menu[theme="Dracula"],
159
162
  perspective-dropdown[theme="Dracula"] {
@@ -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;
@@ -167,6 +169,7 @@ perspective-viewer[theme="Gruvbox Dark"] {
167
169
  ) !important;
168
170
  }
169
171
 
172
+ perspective-context-menu[theme="Gruvbox Dark"],
170
173
  perspective-copy-menu[theme="Gruvbox Dark"],
171
174
  perspective-export-menu[theme="Gruvbox Dark"],
172
175
  perspective-dropdown[theme="Gruvbox Dark"] {
@@ -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(
@@ -51,10 +52,12 @@ perspective-string-column-style {
51
52
  --psp-icon--sort-none--mask-image: url("../svg/sort-none-icon.svg");
52
53
  --psp-icon--add-expression--mask-image: url("../svg/expression.svg");
53
54
  --psp-icon--close--mask-image: url("../svg/close-icon.svg");
55
+ --psp-icon--pin--mask-image: url("../svg/pin-icon.svg");
54
56
  --psp-label--inactive-column-selector--content: url("../svg/checkbox-unchecked-icon.svg");
55
57
  --psp-label--active-column-selector--content: url("../svg/checkbox-checked-icon.svg");
56
58
  --psp-icon--select-arrow-light--mask-image: url("../svg/dropdown-selector-light.svg");
57
59
  --psp-icon--select-arrow-dark--mask-image: url("../svg/dropdown-selector.svg");
60
+ --psp-icon--active-indicator--mask-image: url("../svg/active-indicator.svg");
58
61
  --psp-icon-overflow-hint--content: "!";
59
62
  --psp-label--reset-button-icon--content: "refresh";
60
63
  --psp-label--save-button-icon--content: "save";
@@ -108,6 +108,13 @@ perspective-dropdown {
108
108
  /* Tabs */
109
109
  --psp-label--style-tab--content: "Stil";
110
110
  --psp-label--attributes-tab--content: "Attribute";
111
+ --psp-label--window-tab--content: "Fenster";
112
+ --psp-label--window-source--content: "Spalte";
113
+ --psp-label--window-order-by--content: "Sortieren nach";
114
+ --psp-label--window-partition-by--content: "Partitionieren nach";
115
+ --psp-label--window-frame--content: "Rahmen";
116
+ --psp-label--window-offset--content: "Versatz";
117
+ --psp-label--window-alpha--content: "Alpha";
111
118
  --psp-label--query-tab--content: "Abfrage";
112
119
  --psp-label--plugin-tab--content: "Plugin";
113
120
  --psp-label--debug-tab--content: "JSON";
@@ -108,6 +108,13 @@ perspective-dropdown {
108
108
  /* Tabs */
109
109
  --psp-label--style-tab--content: "Estilo";
110
110
  --psp-label--attributes-tab--content: "Atributos";
111
+ --psp-label--window-tab--content: "Ventana";
112
+ --psp-label--window-source--content: "Columna";
113
+ --psp-label--window-order-by--content: "Ordenar por";
114
+ --psp-label--window-partition-by--content: "Particionar por";
115
+ --psp-label--window-frame--content: "Marco";
116
+ --psp-label--window-offset--content: "Desplazamiento";
117
+ --psp-label--window-alpha--content: "Alfa";
111
118
  --psp-label--query-tab--content: "Consulta";
112
119
  --psp-label--plugin-tab--content: "Plugin";
113
120
  --psp-label--debug-tab--content: "JSON";
@@ -108,6 +108,13 @@ perspective-dropdown {
108
108
  /* Tabs */
109
109
  --psp-label--style-tab--content: "Style";
110
110
  --psp-label--attributes-tab--content: "Les attributs";
111
+ --psp-label--window-tab--content: "Fenêtre";
112
+ --psp-label--window-source--content: "Colonne";
113
+ --psp-label--window-order-by--content: "Commandé par";
114
+ --psp-label--window-partition-by--content: "Partitionner par";
115
+ --psp-label--window-frame--content: "Cadre";
116
+ --psp-label--window-offset--content: "Décalage";
117
+ --psp-label--window-alpha--content: "Alpha";
111
118
  --psp-label--query-tab--content: "Requête";
112
119
  --psp-label--plugin-tab--content: "Plugin";
113
120
  --psp-label--debug-tab--content: "JSON";
@@ -108,6 +108,13 @@ perspective-dropdown {
108
108
  /* Tabs */
109
109
  --psp-label--style-tab--content: "スタイル";
110
110
  --psp-label--attributes-tab--content: "属性";
111
+ --psp-label--window-tab--content: "ウィンドウ";
112
+ --psp-label--window-source--content: "列";
113
+ --psp-label--window-order-by--content: "注文方法";
114
+ --psp-label--window-partition-by--content: "パーティション";
115
+ --psp-label--window-frame--content: "フレーム";
116
+ --psp-label--window-offset--content: "オフセット";
117
+ --psp-label--window-alpha--content: "アルファ";
111
118
  --psp-label--query-tab--content: "クエリ";
112
119
  --psp-label--plugin-tab--content: "プラグイン";
113
120
  --psp-label--debug-tab--content: "JSON";
@@ -108,6 +108,13 @@ perspective-dropdown {
108
108
  /* Tabs */
109
109
  --psp-label--style-tab--content: "Estilo";
110
110
  --psp-label--attributes-tab--content: "Atributos";
111
+ --psp-label--window-tab--content: "Janela";
112
+ --psp-label--window-source--content: "Coluna";
113
+ --psp-label--window-order-by--content: "Ordenar por";
114
+ --psp-label--window-partition-by--content: "Particionar por";
115
+ --psp-label--window-frame--content: "Quadro";
116
+ --psp-label--window-offset--content: "Deslocamento";
117
+ --psp-label--window-alpha--content: "Alfa";
111
118
  --psp-label--query-tab--content: "Consulta";
112
119
  --psp-label--plugin-tab--content: "Plugin";
113
120
  --psp-label--debug-tab--content: "JSON";
@@ -108,6 +108,13 @@ perspective-dropdown {
108
108
  /* Tabs */
109
109
  --psp-label--style-tab--content: "风格";
110
110
  --psp-label--attributes-tab--content: "属性";
111
+ --psp-label--window-tab--content: "窗口";
112
+ --psp-label--window-source--content: "列";
113
+ --psp-label--window-order-by--content: "订购依据";
114
+ --psp-label--window-partition-by--content: "分区依据";
115
+ --psp-label--window-frame--content: "框架";
116
+ --psp-label--window-offset--content: "偏移";
117
+ --psp-label--window-alpha--content: "Alpha";
111
118
  --psp-label--query-tab--content: "查询";
112
119
  --psp-label--plugin-tab--content: "插件";
113
120
  --psp-label--debug-tab--content: "JSON";
@@ -103,11 +103,20 @@ perspective-dropdown {
103
103
 
104
104
  /* Tabs */
105
105
  --psp-label--style-tab--content: "Style";
106
- --psp-label--attributes-tab--content: "Attributes";
106
+ --psp-label--attributes-tab--content: "Expression";
107
+ --psp-label--window-tab--content: "Window";
107
108
  --psp-label--query-tab--content: "Query";
108
109
  --psp-label--plugin-tab--content: "Plugin";
109
110
  --psp-label--debug-tab--content: "JSON";
110
111
 
112
+ /* Window editor */
113
+ --psp-label--window-source--content: "Column";
114
+ --psp-label--window-order-by--content: "Order By";
115
+ --psp-label--window-partition-by--content: "Partition By";
116
+ --psp-label--window-frame--content: "Frame";
117
+ --psp-label--window-offset--content: "Offset";
118
+ --psp-label--window-alpha--content: "Alpha";
119
+
111
120
  /* Plugin settings */
112
121
  --psp-label--edit-mode--content: "Edit mode";
113
122
  --psp-label--scroll-lock--content: "Scroll lock";
@@ -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;
@@ -163,6 +165,7 @@ perspective-viewer[theme="Monokai"] {
163
165
  );
164
166
  }
165
167
 
168
+ perspective-context-menu[theme="Monokai"],
166
169
  perspective-copy-menu[theme="Monokai"],
167
170
  perspective-export-menu[theme="Monokai"],
168
171
  perspective-dropdown[theme="Monokai"],
@@ -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;
@@ -124,6 +126,7 @@ perspective-viewer[theme="Phosphor"] {
124
126
  );
125
127
  }
126
128
 
129
+ perspective-context-menu[theme="Phosphor"],
127
130
  perspective-copy-menu[theme="Phosphor"],
128
131
  perspective-export-menu[theme="Phosphor"],
129
132
  perspective-dropdown[theme="Phosphor"],
@@ -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;
@@ -107,6 +109,7 @@ perspective-viewer[theme="Pro Dark"] {
107
109
  );
108
110
  }
109
111
 
112
+ perspective-context-menu[theme="Pro Dark"],
110
113
  perspective-copy-menu[theme="Pro Dark"],
111
114
  perspective-export-menu[theme="Pro Dark"],
112
115
  perspective-dropdown[theme="Pro Dark"],
@@ -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;
@@ -175,6 +177,7 @@ perspective-viewer[theme="Vaporwave"] {
175
177
  ) !important;
176
178
  }
177
179
 
180
+ perspective-context-menu[theme="Vaporwave"],
178
181
  perspective-copy-menu[theme="Vaporwave"],
179
182
  perspective-export-menu[theme="Vaporwave"],
180
183
  perspective-dropdown[theme="Vaporwave"],
@@ -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";