@perspective-dev/viewer 4.5.2 → 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 (178) 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.d.ts +9 -0
  18. package/dist/esm/perspective-viewer.inline.js +20 -1
  19. package/dist/esm/perspective-viewer.inline.js.map +4 -4
  20. package/dist/esm/perspective-viewer.js +20 -1
  21. package/dist/esm/perspective-viewer.js.map +4 -4
  22. package/dist/esm/plugin.d.ts +71 -5
  23. package/dist/esm/ts-rs/ClientOptions.d.ts +7 -0
  24. package/dist/esm/ts-rs/ExportMethod.d.ts +1 -0
  25. package/dist/esm/ts-rs/ExportOptions.d.ts +9 -0
  26. package/dist/esm/ts-rs/GetClientOptions.d.ts +8 -0
  27. package/dist/esm/ts-rs/GetTableOptions.d.ts +8 -0
  28. package/dist/esm/ts-rs/Layout.d.ts +11 -0
  29. package/dist/esm/ts-rs/Orientation.d.ts +4 -0
  30. package/dist/esm/ts-rs/PanelOptions.d.ts +7 -0
  31. package/dist/esm/ts-rs/PanelViewerConfig.d.ts +39 -0
  32. package/dist/esm/ts-rs/SplitLayout.d.ts +7 -0
  33. package/dist/esm/ts-rs/TabLayout.d.ts +10 -0
  34. package/dist/esm/ts-rs/ViewerConfig.d.ts +6 -2
  35. package/dist/esm/ts-rs/WorkspaceConfig.d.ts +40 -0
  36. package/dist/esm/ts-rs/WorkspaceConfigUpdate.d.ts +28 -0
  37. package/dist/wasm/perspective-viewer.d.ts +211 -77
  38. package/dist/wasm/perspective-viewer.js +528 -180
  39. package/dist/wasm/perspective-viewer.wasm +0 -0
  40. package/dist/wasm/perspective-viewer.wasm.d.ts +34 -26
  41. package/dist/wasm/snippets/perspective-viewer-daeef4ceb066e6c7/inline0.js +6 -0
  42. package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline3.js → perspective-viewer-daeef4ceb066e6c7/inline4.js} +5 -0
  43. package/package.json +3 -2
  44. package/src/css/_context_menu.css +14 -0
  45. package/src/css/column-settings-panel.css +1 -1
  46. package/src/css/containers/context-menu.css +101 -0
  47. package/src/css/panel-tab.css +193 -0
  48. package/src/css/plugin-selector.css +7 -10
  49. package/src/css/status-bar.css +75 -81
  50. package/src/css/viewer.css +180 -70
  51. package/src/rust/components/column_dropdown.rs +40 -30
  52. package/src/rust/components/column_selector/active_column.rs +7 -18
  53. package/src/rust/components/column_selector/aggregate_selector.rs +4 -7
  54. package/src/rust/components/column_selector/config_selector.rs +33 -81
  55. package/src/rust/components/column_selector/filter_column.rs +5 -15
  56. package/src/rust/components/column_selector/inactive_column.rs +3 -8
  57. package/src/rust/components/column_selector/sort_column.rs +3 -6
  58. package/src/rust/components/column_selector.rs +5 -11
  59. package/src/rust/components/containers/split_panel.rs +175 -62
  60. package/src/rust/components/context_menu.rs +130 -0
  61. package/src/rust/components/form/debug.rs +3 -0
  62. package/src/rust/components/global_filter_bar.rs +76 -0
  63. package/src/rust/components/main_panel/frame_theme.rs +186 -0
  64. package/src/rust/components/main_panel/msg.rs +62 -0
  65. package/src/rust/components/main_panel/presize.rs +220 -0
  66. package/src/rust/components/main_panel/reconcile.rs +224 -0
  67. package/src/rust/components/main_panel/render.rs +385 -0
  68. package/src/rust/components/main_panel/update.rs +184 -0
  69. package/src/rust/components/main_panel.rs +311 -71
  70. package/src/rust/components/mod.rs +4 -0
  71. package/src/rust/components/panel_menu.rs +486 -0
  72. package/src/rust/components/panel_tab.rs +505 -0
  73. package/src/rust/components/plugin_tab.rs +1 -1
  74. package/src/rust/components/settings_panel.rs +13 -5
  75. package/src/rust/components/status_bar.rs +110 -178
  76. package/src/rust/components/status_indicator.rs +6 -9
  77. package/src/rust/components/style/mod.rs +5 -0
  78. package/src/rust/components/style/style_provider.rs +2 -0
  79. package/src/rust/components/viewer/filters.rs +133 -0
  80. package/src/rust/components/viewer/msg.rs +180 -0
  81. package/src/rust/components/viewer/panels.rs +326 -0
  82. package/src/rust/components/viewer/render.rs +243 -0
  83. package/src/rust/components/viewer/settings.rs +402 -0
  84. package/src/rust/components/viewer/snapshots.rs +134 -0
  85. package/src/rust/components/viewer/wiring.rs +505 -0
  86. package/src/rust/components/viewer.rs +243 -756
  87. package/src/rust/config/export_method.rs +1 -1
  88. package/src/rust/config/mod.rs +4 -0
  89. package/src/rust/config/options.rs +71 -0
  90. package/src/rust/config/viewer_config.rs +24 -2
  91. package/src/rust/config/workspace_config.rs +92 -0
  92. package/src/rust/custom_elements/copy_dropdown.rs +3 -1
  93. package/src/rust/custom_elements/debug_plugin.rs +20 -1
  94. package/src/rust/custom_elements/export_dropdown.rs +3 -1
  95. package/src/rust/custom_elements/viewer.rs +1015 -286
  96. package/src/rust/custom_events.rs +212 -61
  97. package/src/rust/js/mod.rs +2 -0
  98. package/src/rust/js/plugin.rs +297 -10
  99. package/src/rust/js/regular_layout.rs +258 -0
  100. package/src/rust/lib.rs +20 -1
  101. package/src/rust/presentation.rs +66 -33
  102. package/src/rust/queries/get_viewer_config.rs +29 -11
  103. package/src/rust/queries/plugin_column_styles.rs +2 -2
  104. package/src/rust/renderer/activate.rs +41 -14
  105. package/src/rust/renderer/dispatch.rs +436 -0
  106. package/src/rust/renderer/plugin_config.rs +495 -0
  107. package/src/rust/renderer/registry.rs +18 -6
  108. package/src/rust/renderer/render_timer.rs +29 -10
  109. package/src/rust/renderer.rs +350 -837
  110. package/src/rust/session/column_defaults_update.rs +26 -8
  111. package/src/rust/session/view_subscription.rs +30 -15
  112. package/src/rust/session.rs +753 -264
  113. package/src/rust/tasks/apply_global_filters.rs +89 -0
  114. package/src/rust/tasks/auto_pause.rs +171 -0
  115. package/src/rust/tasks/copy_export.rs +29 -19
  116. package/src/rust/tasks/create_panel.rs +243 -0
  117. package/src/rust/tasks/dismiss_render_warning.rs +3 -1
  118. package/src/rust/tasks/edit_expression.rs +4 -4
  119. package/src/rust/tasks/eject.rs +64 -23
  120. package/src/rust/tasks/mod.rs +28 -4
  121. package/src/rust/tasks/pipeline.rs +411 -0
  122. package/src/rust/tasks/presize_panels.rs +324 -0
  123. package/src/rust/tasks/reset_all.rs +22 -12
  124. package/src/rust/tasks/resize_observer.rs +124 -87
  125. package/src/rust/tasks/restore_and_render.rs +80 -86
  126. package/src/rust/tasks/restore_panel.rs +145 -0
  127. package/src/rust/tasks/send_column_config.rs +5 -2
  128. package/src/rust/tasks/send_plugin_config.rs +5 -2
  129. package/src/rust/tasks/set_edit_mode.rs +59 -0
  130. package/src/rust/tasks/sync_update_panels.rs +152 -0
  131. package/src/rust/tasks/table_lifecycle.rs +158 -0
  132. package/src/rust/tasks/update_theme.rs +56 -12
  133. package/src/rust/utils/completion.rs +56 -0
  134. package/src/rust/utils/custom_element.rs +5 -0
  135. package/src/rust/utils/debounce.rs +130 -7
  136. package/src/rust/utils/mod.rs +6 -0
  137. package/src/rust/utils/pending_effects.rs +62 -0
  138. package/src/rust/utils/spawn.rs +33 -0
  139. package/src/rust/utils/weak_scope.rs +0 -10
  140. package/src/rust/workspace.rs +846 -0
  141. package/src/svg/active-indicator.svg +3 -0
  142. package/src/themes/botanical.css +5 -2
  143. package/src/themes/defaults.css +54 -2
  144. package/src/themes/dracula.css +6 -3
  145. package/src/themes/gruvbox-dark.css +5 -2
  146. package/src/themes/gruvbox.css +5 -2
  147. package/src/themes/icons.css +4 -2
  148. package/src/themes/monokai.css +5 -2
  149. package/src/themes/phosphor.css +5 -2
  150. package/src/themes/pro-dark.css +5 -2
  151. package/src/themes/pro.css +2 -1
  152. package/src/themes/solarized-dark.css +5 -2
  153. package/src/themes/solarized.css +5 -2
  154. package/src/themes/vaporwave.css +5 -2
  155. package/src/ts/bootstrap.ts +8 -7
  156. package/src/ts/extensions.ts +30 -2
  157. package/src/ts/perspective-viewer.ts +10 -0
  158. package/src/ts/plugin.ts +72 -5
  159. package/src/ts/ts-rs/ClientOptions.ts +7 -0
  160. package/src/ts/ts-rs/ExportMethod.ts +3 -0
  161. package/src/ts/ts-rs/ExportOptions.ts +8 -0
  162. package/src/ts/ts-rs/GetClientOptions.ts +7 -0
  163. package/src/ts/ts-rs/GetTableOptions.ts +7 -0
  164. package/src/ts/ts-rs/Layout.ts +9 -0
  165. package/src/ts/ts-rs/Orientation.ts +6 -0
  166. package/src/ts/ts-rs/PanelOptions.ts +7 -0
  167. package/src/ts/ts-rs/PanelViewerConfig.ts +15 -0
  168. package/src/ts/ts-rs/SplitLayout.ts +5 -0
  169. package/src/ts/ts-rs/TabLayout.ts +11 -0
  170. package/src/ts/ts-rs/ViewerConfig.ts +6 -2
  171. package/src/ts/ts-rs/WorkspaceConfig.ts +36 -0
  172. package/src/ts/ts-rs/WorkspaceConfigUpdate.ts +24 -0
  173. package/src/rust/tasks/intersection_observer.rs +0 -98
  174. package/src/rust/tasks/update_and_render.rs +0 -110
  175. /package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline0.js → perspective-viewer-daeef4ceb066e6c7/inline1.js} +0 -0
  176. /package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline1.js → perspective-viewer-daeef4ceb066e6c7/inline2.js} +0 -0
  177. /package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline2.js → perspective-viewer-daeef4ceb066e6c7/inline3.js} +0 -0
  178. /package/dist/wasm/snippets/{perspective-viewer-93064d0d79855d97/inline4.js → perspective-viewer-daeef4ceb066e6c7/inline5.js} +0 -0
@@ -18,8 +18,23 @@ import type {
18
18
  export type * from "../../src/ts/ts-rs/ViewerConfig.d.ts";
19
19
  export type * from "../../src/ts/ts-rs/ViewerConfigUpdate.d.ts";
20
20
  export type * from "../../src/ts/ts-rs/PluginStaticConfig.d.ts";
21
+ export type * from "../../src/ts/ts-rs/WorkspaceConfig.d.ts";
22
+ export type * from "../../src/ts/ts-rs/WorkspaceConfigUpdate.d.ts";
23
+ export type * from "../../src/ts/ts-rs/ExportMethod.d.ts";
24
+ export type * from "../../src/ts/ts-rs/PanelOptions.d.ts";
25
+ export type * from "../../src/ts/ts-rs/ClientOptions.d.ts";
26
+ export type * from "../../src/ts/ts-rs/ExportOptions.d.ts";
27
+ export type * from "../../src/ts/ts-rs/GetTableOptions.d.ts";
28
+ export type * from "../../src/ts/ts-rs/GetClientOptions.d.ts";
29
+ import type {GetTableOptions} from "../../src/ts/ts-rs/GetTableOptions.d.ts";
30
+ import type {PanelOptions} from "../../src/ts/ts-rs/PanelOptions.d.ts";
31
+ import type {ExportOptions} from "../../src/ts/ts-rs/ExportOptions.d.ts";
32
+ import type {GetClientOptions} from "../../src/ts/ts-rs/GetClientOptions.d.ts";
33
+ import type {ClientOptions} from "../../src/ts/ts-rs/ClientOptions.d.ts";
21
34
  import type {ViewerConfig} from "../../src/ts/ts-rs/ViewerConfig.d.ts";
22
35
  import type {ViewerConfigUpdate} from "../../src/ts/ts-rs/ViewerConfigUpdate.d.ts";
36
+ import type {WorkspaceConfig} from "../../src/ts/ts-rs/WorkspaceConfig.d.ts";
37
+ import type {WorkspaceConfigUpdate} from "../../src/ts/ts-rs/WorkspaceConfigUpdate.d.ts";
23
38
 
24
39
 
25
40
 
@@ -372,6 +387,19 @@ export class PerspectiveDebugPluginElement {
372
387
  restore(_config?: any | null): void;
373
388
  restyle(): void;
374
389
  save(): any;
390
+ /**
391
+ * Delegates to `draw()` VIRTUALLY — through the JS element's `draw`
392
+ * property, never `self.draw(view)` (Rust static dispatch). This
393
+ * element is the documented base class for custom plugins
394
+ * (`class MyPlugin extends
395
+ * customElements.get("perspective-viewer-plugin")`), whose contract is
396
+ * "`update()` defaults to dispatch to `draw()`" — a
397
+ * subclass overriding only `draw` must receive `update`-path repaints
398
+ * (`BindDisposition::Unchanged`/`Adopted` runs,
399
+ * `PLUGIN_DRAW_INVARIANT_PLAN.md`); the static call bypassed the
400
+ * override and repainted the Debug CSV instead (the
401
+ * `view_lifecycle.spec` regression).
402
+ */
375
403
  update(view: View): Promise<any>;
376
404
  readonly config_column_names: any;
377
405
  readonly min_config_columns: any;
@@ -412,6 +440,16 @@ export class PerspectiveViewerElement {
412
440
  * Create a new JavaScript Heap reference for this model instance.
413
441
  */
414
442
  __get_model(): PerspectiveViewerElement;
443
+ /**
444
+ * Add a new, independent panel to this viewer's layout, rendering the
445
+ * supplied [`ViewerConfigUpdate`] into it. The panel uses the default
446
+ * [`perspective_client::Client`] (the first passed to [`Self::load`]) to
447
+ * resolve its `table`. Returns the generated panel id.
448
+ *
449
+ * Element-level config fields (`settings`, `theme`) in the argument are
450
+ * ignored — those are shared across the element, not per-panel.
451
+ */
452
+ addPanel(update: ViewerConfigUpdate): Promise<any>;
415
453
  connectedCallback(): void;
416
454
  /**
417
455
  * Copy this viewer's `View` or `Table` data as CSV to the system
@@ -430,11 +468,11 @@ export class PerspectiveViewerElement {
430
468
  * })
431
469
  * ```
432
470
  */
433
- copy(method?: string | null): Promise<any>;
471
+ copy(options?: ExportOptions | null): Promise<any>;
434
472
  /**
435
- * Delete the internal [`View`] and all associated state, rendering this
473
+ * Delete all internal [`View`]s and all associated state, rendering this
436
474
  * `<perspective-viewer>` unusable and freeing all associated resources.
437
- * Does not delete the supplied [`Table`] (as this is constructed by the
475
+ * Does not delete any supplied [`Table`] (as this is constructed by the
438
476
  * callee).
439
477
  *
440
478
  * Calling _any_ method on a `<perspective-viewer>` after [`Self::delete`]
@@ -471,16 +509,25 @@ export class PerspectiveViewerElement {
471
509
  * })
472
510
  * ```
473
511
  */
474
- download(method?: string | null): Promise<any>;
512
+ download(options?: ExportOptions | null): Promise<any>;
475
513
  /**
476
- * Restart this `<perspective-viewer>` to its initial state, before
477
- * `load()`.
514
+ * Remove a [`Client`] from this `<perspective-viewer>` and dispose every
515
+ * panel bound to it (each panel's `View` is deleted and its `Table`
516
+ * reference released).
478
517
  *
479
- * Use `Self::restart` if you plan to call `Self::load` on this viewer
480
- * again, or alternatively `Self::delete` if this viewer is no longer
481
- * needed.
518
+ * # Arguments
519
+ *
520
+ * - `options` - An optional `{client?: string}` dict naming the client to
521
+ * eject; the active panel's client when omitted.
522
+ *
523
+ * # JavaScript Examples
524
+ *
525
+ * ```javascript
526
+ * await viewer.eject();
527
+ * await viewer.eject({client: "remote"});
528
+ * ```
482
529
  */
483
- eject(): Promise<any>;
530
+ eject(options?: ClientOptions | null): Promise<any>;
484
531
  /**
485
532
  * Exports this viewer's internal [`View`] as a JavaSript data, the
486
533
  * exact type of which depends on the `method` but defaults to `String`
@@ -501,7 +548,7 @@ export class PerspectiveViewerElement {
501
548
  * const data = await viewer.export("plugin");
502
549
  * ```
503
550
  */
504
- export(method?: string | null): Promise<any>;
551
+ export(options?: ExportOptions | null): Promise<any>;
505
552
  /**
506
553
  * Flush any pending modifications to this `<perspective-viewer>`. Since
507
554
  * `<perspective-viewer>`'s API is almost entirely `async`, it may take
@@ -523,6 +570,11 @@ export class PerspectiveViewerElement {
523
570
  * ```
524
571
  */
525
572
  flush(): Promise<any>;
573
+ /**
574
+ * The id of the active panel — the one the settings panel and status-bar
575
+ * toolbar target — or `null` when the element has zero panels.
576
+ */
577
+ getActivePanel(): any;
526
578
  /**
527
579
  * Get an `Array` of all of the plugin custom elements registered for this
528
580
  * element. This may not include plugins which called
@@ -546,12 +598,17 @@ export class PerspectiveViewerElement {
546
598
  * const client = await viewer.getClient();
547
599
  * ```
548
600
  */
549
- getClient(wait_for_client?: boolean | null): Promise<any>;
601
+ getClient(options?: GetClientOptions | null): Promise<any>;
550
602
  /**
551
- * Get this viewer's edit port for the currently loaded [`Table`] (see
552
- * [`Table::update`] for details on ports).
603
+ * Get this viewer's edit port for the named panel's [`Table`] (see
604
+ * [`Table::update`] for details on ports), or the active panel when
605
+ * `panel` is omitted.
553
606
  */
554
- getEditPort(): number;
607
+ getEditPort(options?: PanelOptions | null): number;
608
+ /**
609
+ * Get the ids of all panels in this viewer's layout, in insertion order.
610
+ */
611
+ getPanelNames(): Array<any>;
555
612
  /**
556
613
  * Gets a plugin Custom Element with the `name` field, or get the active
557
614
  * plugin if no `name` is provided.
@@ -573,12 +630,12 @@ export class PerspectiveViewerElement {
573
630
  * const {virtual_fps, actual_fps} = await viewer.getRenderStats();
574
631
  * ```
575
632
  */
576
- getRenderStats(): any;
633
+ getRenderStats(options?: PanelOptions | null): any;
577
634
  /**
578
635
  * Return a [`perspective_js::JsViewWindow`] for the currently selected
579
- * region.
636
+ * region of the named panel, or the active panel when `panel` is omitted.
580
637
  */
581
- getSelection(): ViewWindow | undefined;
638
+ getSelection(options?: PanelOptions | null): ViewWindow | undefined;
582
639
  /**
583
640
  * Get the underlying [`Table`] for this viewer (as passed to
584
641
  * [`PerspectiveViewerElement::load`] or as the `table` field to
@@ -596,7 +653,7 @@ export class PerspectiveViewerElement {
596
653
  * const table = await viewer.getTable();
597
654
  * ```
598
655
  */
599
- getTable(wait_for_table?: boolean | null): Promise<any>;
656
+ getTable(options?: GetTableOptions | null): Promise<any>;
600
657
  /**
601
658
  * Get the underlying [`View`] for this viewer.
602
659
  *
@@ -618,22 +675,15 @@ export class PerspectiveViewerElement {
618
675
  * const view = await viewer.getView();
619
676
  * ```
620
677
  */
621
- getView(): Promise<any>;
678
+ getView(options?: PanelOptions | null): Promise<any>;
622
679
  /**
623
680
  * Get a copy of the [`ViewConfig`] for the current [`View`]. This is
624
681
  * non-blocking as it does not need to access the plugin (unlike
625
682
  * [`PerspectiveViewerElement::save`]), and also makes no API calls to the
626
683
  * server (unlike [`PerspectiveViewerElement::getView`] followed by
627
684
  * [`View::get_config`])
628
- *
629
- * Returns the [`ViewConfig`] the currently-bound `View` was constructed
630
- * from, so the value is consistent with what the active plugin is
631
- * rendering even if a queued [`Self::restore`]/`update_and_render` has
632
- * already mutated the live config in anticipation of the next draw.
633
- * Falls back to the live session config when no `View` has yet been
634
- * created (e.g., after `load` but before the first render).
635
685
  */
636
- getViewConfig(): Promise<any>;
686
+ getViewConfig(options?: PanelOptions | null): Promise<any>;
637
687
  /**
638
688
  * Loads a [`Client`], or optionally [`Table`], or optionally a Javascript
639
689
  * `Promise` which returns a [`Client`] or [`Table`], in this viewer.
@@ -710,28 +760,40 @@ export class PerspectiveViewerElement {
710
760
  * await viewer.load(table);
711
761
  * ```
712
762
  */
713
- load(table: any): Promise<any>;
763
+ load(client: Client | Table | Promise<Client | Table>): Promise<any>;
714
764
  constructor(elem: HTMLElement);
715
765
  /**
716
- * Force open the settings for a particular column. Pass `null` to close
717
- * the column settings panel. See [`Self::toggleColumnSettings`] for more.
766
+ * Remove the panel with id `name` from the layout, disposing its engines
767
+ * (its `View` is deleted and its `Table` reference released). The last
768
+ * remaining panel cannot be removed (resolves as a no-op). Resolves
769
+ * after the panel's teardown run completes, carrying any teardown
770
+ * error — previously fire-and-forget and silently dropped (invariant
771
+ * I6). See also [`Self::addPanel`].
718
772
  */
719
- openColumnSettings(column_name?: string | null, toggle?: boolean | null): Promise<any>;
773
+ removePanel(name: string): Promise<any>;
720
774
  /**
721
- * Reset the viewer's `ViewerConfig` to the default.
775
+ * Reset a panel's `ViewerConfig` to its data-relative default.
776
+ *
777
+ * Without a `panel`, this is ELEMENT-LEVEL: EVERY panel is reset and the
778
+ * cross-filter overlay cleared (symmetric with whole-element
779
+ * [`Self::save`] / [`Self::restore`]). With `{panel}`, only that panel is
780
+ * reset — the other panels and the overlay are left untouched.
722
781
  *
723
782
  * # Arguments
724
783
  *
725
784
  * - `reset_all` - If set, will clear expressions and column settings as
726
785
  * well.
786
+ * - `options` - An optional `{panel?: string}`; the panel to reset, or
787
+ * every panel when omitted.
727
788
  *
728
789
  * # JavaScript Examples
729
790
  *
730
791
  * ```javascript
731
- * await viewer.reset();
792
+ * await viewer.reset(); // every panel
793
+ * await viewer.reset(true, {panel: "p1"}); // just "p1", + expressions
732
794
  * ```
733
795
  */
734
- reset(reset_all?: boolean | null): Promise<any>;
796
+ reset(reset_all?: boolean | null, options?: PanelOptions | null): Promise<any>;
735
797
  /**
736
798
  * If this element is in an _errored_ state, this method will clear it and
737
799
  * re-render. Calling this method is equivalent to clicking the error reset
@@ -780,9 +842,23 @@ export class PerspectiveViewerElement {
780
842
  */
781
843
  resize(options?: any | null): Promise<any>;
782
844
  /**
783
- * Restores this element from a full/partial
784
- * [`perspective_js::JsViewConfig`] (this element's user-configurable
785
- * state, including the `Table` name).
845
+ * Restore a single panel from a full/partial
846
+ * [`perspective_js::JsViewConfig`] (its user-configurable state, including
847
+ * the `Table` name) — the active panel, or a specific panel via the
848
+ * optional `{panel}` selector.
849
+ *
850
+ * If `panel` names no existing panel, a NEW panel is created with that id
851
+ * and the config restored into it (an upsert), equivalent to
852
+ * [`Self::addPanel`] but with a caller-chosen id. As with a created panel,
853
+ * the element-level `settings`/`theme` fields are ignored in that case.
854
+ *
855
+ * On an empty element with a pending [`Self::load`] whose payload is not
856
+ * yet classified, the active-target form (no `panel`) instead claims and
857
+ * restores into that load's reserved first panel — see [`Self::load`].
858
+ *
859
+ * This restores a SINGLE panel; a whole-element config (with a `panels`
860
+ * map) must be applied via [`Self::restoreWorkspace`] — its `panels` /
861
+ * `layout` keys are ignored here.
786
862
  *
787
863
  * One of the best ways to use [`Self::restore`] is by first configuring
788
864
  * a `<perspective-viewer>` as you wish, then using either the `Debug`
@@ -793,6 +869,7 @@ export class PerspectiveViewerElement {
793
869
  *
794
870
  * - `update` - The config to restore to, as returned by [`Self::save`] in
795
871
  * either "json", "string" or "arraybuffer" format.
872
+ * - `name` - The panel to target, or `None` for the active panel.
796
873
  *
797
874
  * # JavaScript Examples
798
875
  *
@@ -810,7 +887,22 @@ export class PerspectiveViewerElement {
810
887
  * await viewer.restore({group_by: ["State"]});
811
888
  * ```
812
889
  */
813
- restore(update: ViewerConfigUpdate): Promise<any>;
890
+ restore(update: ViewerConfigUpdate, options?: PanelOptions | null): Promise<void>;
891
+ /**
892
+ * Restore the ENTIRE element from a whole-element
893
+ * [`WorkspaceConfigUpdate`] (`{version, active?, layout, panels, ...}`) —
894
+ * the multi-panel counterpart of [`Self::restore`]. Every existing panel
895
+ * is replaced by the `panels` entries, and the layout tree + master/detail
896
+ * cross-filter state re-applied. Unlike [`Self::restore`], this never
897
+ * falls back to the single-panel path.
898
+ *
899
+ * # JavaScript Examples
900
+ *
901
+ * ```javascript
902
+ * await viewer.restoreWorkspace(await otherViewer.saveWorkspace());
903
+ * ```
904
+ */
905
+ restoreWorkspace(update: WorkspaceConfigUpdate): Promise<void>;
814
906
  /**
815
907
  * Restyle all plugins from current document.
816
908
  *
@@ -831,34 +923,67 @@ export class PerspectiveViewerElement {
831
923
  */
832
924
  restyleElement(): Promise<any>;
833
925
  /**
834
- * Save this element's user-configurable state to a serialized state
835
- * object, one which can be restored via the [`Self::restore`] method.
926
+ * Save a single panel's user-configurable state as a [`ViewerConfig`], one
927
+ * which can be restored via [`Self::restore`] — the active panel, or a
928
+ * specific panel via the optional `{panel}` selector.
929
+ *
930
+ * This saves a SINGLE panel; to snapshot the ENTIRE element (every panel +
931
+ * layout + cross-filters) use [`Self::saveWorkspace`].
932
+ *
933
+ * # Arguments
934
+ *
935
+ * - `options` - An optional `{panel?: string}`; the panel to save, or the
936
+ * active panel when omitted.
836
937
  *
837
938
  * # JavaScript Examples
838
939
  *
839
940
  * Get the current `group_by` setting:
840
941
  *
841
942
  * ```javascript
842
- * const {group_by} = await viewer.restore();
943
+ * const {group_by} = await viewer.save();
843
944
  * ```
844
945
  *
845
946
  * Reset workflow attached to an external button `myResetButton`:
846
947
  *
847
948
  * ```javascript
848
949
  * const token = await viewer.save();
849
- * myResetButton.addEventListener("clien", async () => {
950
+ * myResetButton.addEventListener("click", async () => {
850
951
  * await viewer.restore(token);
851
952
  * });
852
953
  * ```
853
954
  */
854
- save(): Promise<ViewerConfig>;
955
+ save(options?: PanelOptions | null): Promise<ViewerConfig>;
956
+ /**
957
+ * Save the ENTIRE element to a whole-element [`WorkspaceConfig`]
958
+ * (`{version, active?, layout, panels, ...}`) — the multi-panel
959
+ * counterpart of [`Self::save`]. Unlike [`Self::save`] (which emits a
960
+ * single `ViewerConfig` for one panel), this ALWAYS emits the
961
+ * whole-element format, restorable via [`Self::restoreWorkspace`].
962
+ *
963
+ * # JavaScript Examples
964
+ *
965
+ * ```javascript
966
+ * const token = await viewer.saveWorkspace();
967
+ * await viewer.restoreWorkspace(token);
968
+ * ```
969
+ */
970
+ saveWorkspace(): Promise<WorkspaceConfig>;
971
+ /**
972
+ * Make the panel with id `name` the active panel, re-targeting the
973
+ * settings panel and status-bar toolbar (and the root's
974
+ * session/renderer subscriptions) to its engines. Resolves after the
975
+ * activation-chrome redraws on both sides of the switch have completed
976
+ * (invariant I6).
977
+ */
978
+ setActivePanel(name: string): Promise<any>;
855
979
  /**
856
980
  * Sets the auto-pause behavior of this component.
857
981
  *
858
- * When `true`, this `<perspective-viewer>` will register an
859
- * `IntersectionObserver` on itself and subsequently skip rendering
860
- * whenever its viewport visibility changes. Auto-pause is enabled by
861
- * default.
982
+ * When `true`, this `<perspective-viewer>` will skip rendering
983
+ * whenever it cannot be seen — tracked via an `IntersectionObserver`
984
+ * on itself (scrolled out of the viewport, `display: none`) combined
985
+ * with the document's page visibility (backgrounded browser tab,
986
+ * minimized window). Auto-pause is enabled by default.
862
987
  *
863
988
  * # Arguments
864
989
  *
@@ -897,9 +1022,10 @@ export class PerspectiveViewerElement {
897
1022
  */
898
1023
  setAutoSize(autosize: boolean): void;
899
1024
  /**
900
- * Set the selection [`perspective_js::JsViewWindow`] for this element.
1025
+ * Set the selection [`perspective_js::JsViewWindow`] for the named panel,
1026
+ * or the active panel when `panel` is omitted.
901
1027
  */
902
- setSelection(window?: ViewWindow | null): void;
1028
+ setSelection(window?: ViewWindow | null, options?: PanelOptions | null): void;
903
1029
  /**
904
1030
  * Determines the render throttling behavior. Can be an integer, for
905
1031
  * millisecond window to throttle render event; or, if `None`, adaptive
@@ -928,7 +1054,7 @@ export class PerspectiveViewerElement {
928
1054
  * string}`. The CustomEvent is also fired whenever the user toggles the
929
1055
  * sidebar manually.
930
1056
  */
931
- toggleColumnSettings(column_name: string): Promise<any>;
1057
+ toggleColumnSettings(column_name: string, options?: PanelOptions | null): Promise<any>;
932
1058
  /**
933
1059
  * Toggle (or force) the config panel open/closed.
934
1060
  *
@@ -1439,43 +1565,49 @@ export interface InitOutput {
1439
1565
  readonly perspectivedebugpluginelement_restore: (a: number, b: number, c: number) => void;
1440
1566
  readonly perspectivedebugpluginelement_save: (a: number, b: number) => void;
1441
1567
  readonly perspectivedebugpluginelement_select_mode: (a: number, b: number) => void;
1568
+ readonly perspectivedebugpluginelement_update: (a: number, b: number) => number;
1442
1569
  readonly perspectiveviewerelement___get_model: (a: number) => number;
1570
+ readonly perspectiveviewerelement_addPanel: (a: number, b: number) => number;
1443
1571
  readonly perspectiveviewerelement_connectedCallback: (a: number, b: number) => void;
1444
1572
  readonly perspectiveviewerelement_copy: (a: number, b: number) => number;
1445
1573
  readonly perspectiveviewerelement_delete: (a: number) => number;
1446
1574
  readonly perspectiveviewerelement_download: (a: number, b: number) => number;
1447
- readonly perspectiveviewerelement_eject: (a: number) => number;
1575
+ readonly perspectiveviewerelement_eject: (a: number, b: number) => number;
1448
1576
  readonly perspectiveviewerelement_export: (a: number, b: number) => number;
1449
1577
  readonly perspectiveviewerelement_flush: (a: number) => number;
1578
+ readonly perspectiveviewerelement_getActivePanel: (a: number) => number;
1450
1579
  readonly perspectiveviewerelement_getAllPlugins: (a: number) => number;
1451
1580
  readonly perspectiveviewerelement_getClient: (a: number, b: number) => number;
1452
- readonly perspectiveviewerelement_getEditPort: (a: number, b: number) => void;
1581
+ readonly perspectiveviewerelement_getEditPort: (a: number, b: number, c: number) => void;
1582
+ readonly perspectiveviewerelement_getPanelNames: (a: number) => number;
1453
1583
  readonly perspectiveviewerelement_getPlugin: (a: number, b: number, c: number, d: number) => void;
1454
- readonly perspectiveviewerelement_getRenderStats: (a: number, b: number) => void;
1455
- readonly perspectiveviewerelement_getSelection: (a: number) => number;
1584
+ readonly perspectiveviewerelement_getRenderStats: (a: number, b: number, c: number) => void;
1585
+ readonly perspectiveviewerelement_getSelection: (a: number, b: number, c: number) => void;
1456
1586
  readonly perspectiveviewerelement_getTable: (a: number, b: number) => number;
1457
- readonly perspectiveviewerelement_getView: (a: number) => number;
1458
- readonly perspectiveviewerelement_getViewConfig: (a: number) => number;
1587
+ readonly perspectiveviewerelement_getView: (a: number, b: number) => number;
1588
+ readonly perspectiveviewerelement_getViewConfig: (a: number, b: number) => number;
1459
1589
  readonly perspectiveviewerelement_load: (a: number, b: number, c: number) => void;
1460
1590
  readonly perspectiveviewerelement_new: (a: number) => number;
1461
- readonly perspectiveviewerelement_openColumnSettings: (a: number, b: number, c: number, d: number) => number;
1462
- readonly perspectiveviewerelement_reset: (a: number, b: number) => number;
1591
+ readonly perspectiveviewerelement_removePanel: (a: number, b: number, c: number) => number;
1592
+ readonly perspectiveviewerelement_reset: (a: number, b: number, c: number) => number;
1463
1593
  readonly perspectiveviewerelement_resetError: (a: number) => number;
1464
1594
  readonly perspectiveviewerelement_resetThemes: (a: number, b: number, c: number) => number;
1465
1595
  readonly perspectiveviewerelement_resize: (a: number, b: number) => number;
1466
- readonly perspectiveviewerelement_restore: (a: number, b: number) => number;
1596
+ readonly perspectiveviewerelement_restore: (a: number, b: number, c: number) => number;
1597
+ readonly perspectiveviewerelement_restoreWorkspace: (a: number, b: number) => number;
1467
1598
  readonly perspectiveviewerelement_restyleElement: (a: number) => number;
1468
- readonly perspectiveviewerelement_save: (a: number) => number;
1599
+ readonly perspectiveviewerelement_save: (a: number, b: number) => number;
1600
+ readonly perspectiveviewerelement_saveWorkspace: (a: number) => number;
1601
+ readonly perspectiveviewerelement_setActivePanel: (a: number, b: number, c: number) => number;
1469
1602
  readonly perspectiveviewerelement_setAutoPause: (a: number, b: number) => number;
1470
1603
  readonly perspectiveviewerelement_setAutoSize: (a: number, b: number) => void;
1471
- readonly perspectiveviewerelement_setSelection: (a: number, b: number, c: number) => void;
1604
+ readonly perspectiveviewerelement_setSelection: (a: number, b: number, c: number, d: number) => void;
1472
1605
  readonly perspectiveviewerelement_setThrottle: (a: number, b: number, c: number) => void;
1473
- readonly perspectiveviewerelement_toggleColumnSettings: (a: number, b: number, c: number) => number;
1606
+ readonly perspectiveviewerelement_toggleColumnSettings: (a: number, b: number, c: number, d: number) => number;
1474
1607
  readonly perspectiveviewerelement_toggleConfig: (a: number, b: number) => number;
1475
1608
  readonly registerPlugin: (a: number, b: number) => void;
1476
1609
  readonly perspectivedebugpluginelement_delete: (a: number) => number;
1477
1610
  readonly perspectivedebugpluginelement_resize: (a: number) => number;
1478
- readonly perspectivedebugpluginelement_update: (a: number, b: number) => number;
1479
1611
  readonly perspectivedebugpluginelement_min_config_columns: (a: number) => number;
1480
1612
  readonly perspectivedebugpluginelement_restyle: (a: number) => void;
1481
1613
  readonly exportdropdownmenuelement_new: (a: number) => number;
@@ -1572,19 +1704,21 @@ export interface InitOutput {
1572
1704
  readonly virtualdataslice_setStringCol: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void;
1573
1705
  readonly virtualserver_handleRequest: (a: number, b: number, c: number) => number;
1574
1706
  readonly virtualserver_new: (a: number, b: number) => void;
1575
- readonly __wasm_bindgen_func_elem_3003: (a: number, b: number) => void;
1576
- readonly __wasm_bindgen_func_elem_13420: (a: number, b: number) => void;
1577
- readonly __wasm_bindgen_func_elem_16304: (a: number, b: number) => void;
1578
- readonly __wasm_bindgen_func_elem_16950: (a: number, b: number) => void;
1579
- readonly __wasm_bindgen_func_elem_16975: (a: number, b: number) => void;
1580
- readonly __wasm_bindgen_func_elem_24178: (a: number, b: number, c: number, d: number) => void;
1581
- readonly __wasm_bindgen_func_elem_5053: (a: number, b: number, c: number) => void;
1582
- readonly __wasm_bindgen_func_elem_5054: (a: number, b: number, c: number) => void;
1583
- readonly __wasm_bindgen_func_elem_5051: (a: number, b: number, c: number) => void;
1584
- readonly __wasm_bindgen_func_elem_16419: (a: number, b: number, c: number) => void;
1585
- readonly __wasm_bindgen_func_elem_16992: (a: number, b: number, c: number) => void;
1586
- readonly __wasm_bindgen_func_elem_14095: (a: number, b: number) => number;
1587
- readonly __wasm_bindgen_func_elem_16953: (a: number, b: number) => void;
1707
+ readonly __wasm_bindgen_func_elem_15590: (a: number, b: number) => void;
1708
+ readonly __wasm_bindgen_func_elem_3497: (a: number, b: number) => void;
1709
+ readonly __wasm_bindgen_func_elem_18482: (a: number, b: number) => void;
1710
+ readonly __wasm_bindgen_func_elem_19140: (a: number, b: number) => void;
1711
+ readonly __wasm_bindgen_func_elem_19169: (a: number, b: number) => void;
1712
+ readonly __wasm_bindgen_func_elem_26445: (a: number, b: number, c: number, d: number) => void;
1713
+ readonly __wasm_bindgen_func_elem_6144: (a: number, b: number, c: number) => void;
1714
+ readonly __wasm_bindgen_func_elem_6145: (a: number, b: number, c: number) => void;
1715
+ readonly __wasm_bindgen_func_elem_6146: (a: number, b: number, c: number) => void;
1716
+ readonly __wasm_bindgen_func_elem_6142: (a: number, b: number, c: number) => void;
1717
+ readonly __wasm_bindgen_func_elem_18602: (a: number, b: number, c: number) => void;
1718
+ readonly __wasm_bindgen_func_elem_19145: (a: number, b: number, c: number) => void;
1719
+ readonly __wasm_bindgen_func_elem_19186: (a: number, b: number, c: number) => void;
1720
+ readonly __wasm_bindgen_func_elem_16279: (a: number, b: number) => number;
1721
+ readonly __wasm_bindgen_func_elem_19144: (a: number, b: number) => void;
1588
1722
  readonly __wbindgen_export: (a: number, b: number) => number;
1589
1723
  readonly __wbindgen_export2: (a: number, b: number, c: number, d: number) => number;
1590
1724
  readonly __wbindgen_export3: (a: number) => void;