@perspective-dev/viewer 5.0.0 → 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 (106) hide show
  1. package/dist/cdn/perspective-viewer.js +6 -6
  2. package/dist/cdn/perspective-viewer.js.map +2 -2
  3. package/dist/css/botanical.css +1 -1
  4. package/dist/css/dracula.css +1 -1
  5. package/dist/css/gruvbox-dark.css +1 -1
  6. package/dist/css/gruvbox.css +1 -1
  7. package/dist/css/icons.css +1 -1
  8. package/dist/css/intl/de.css +1 -1
  9. package/dist/css/intl/es.css +1 -1
  10. package/dist/css/intl/fr.css +1 -1
  11. package/dist/css/intl/ja.css +1 -1
  12. package/dist/css/intl/pt.css +1 -1
  13. package/dist/css/intl/zh.css +1 -1
  14. package/dist/css/intl.css +1 -1
  15. package/dist/css/monokai.css +1 -1
  16. package/dist/css/phosphor.css +1 -1
  17. package/dist/css/pro-dark.css +1 -1
  18. package/dist/css/pro.css +1 -1
  19. package/dist/css/solarized-dark.css +1 -1
  20. package/dist/css/solarized.css +1 -1
  21. package/dist/css/themes.css +1 -1
  22. package/dist/css/vaporwave.css +1 -1
  23. package/dist/esm/perspective-viewer.inline.js +9 -9
  24. package/dist/esm/perspective-viewer.inline.js.map +2 -2
  25. package/dist/esm/perspective-viewer.js +1 -1
  26. package/dist/esm/perspective-viewer.js.map +2 -2
  27. package/dist/esm/ts-rs/PanelViewerConfig.d.ts +2 -0
  28. package/dist/esm/ts-rs/ViewerConfig.d.ts +2 -0
  29. package/dist/esm/ts-rs/ViewerConfigUpdate.d.ts +9 -0
  30. package/dist/esm/ts-rs/WindowAggregate.d.ts +1 -0
  31. package/dist/esm/ts-rs/WindowSort.d.ts +7 -0
  32. package/dist/esm/ts-rs/WindowSortDir.d.ts +6 -0
  33. package/dist/esm/ts-rs/WindowSpec.d.ts +46 -0
  34. package/dist/esm/ts-rs/Windows.d.ts +10 -0
  35. package/dist/wasm/perspective-viewer.d.ts +103 -16
  36. package/dist/wasm/perspective-viewer.js +118 -108
  37. package/dist/wasm/perspective-viewer.wasm +0 -0
  38. package/dist/wasm/perspective-viewer.wasm.d.ts +15 -15
  39. package/package.json +1 -1
  40. package/src/css/column-selector.css +1 -0
  41. package/src/css/column-settings-panel.css +67 -2
  42. package/src/css/column-style.css +4 -3
  43. package/src/css/config-selector.css +22 -1
  44. package/src/css/containers/context-menu.css +12 -6
  45. package/src/css/containers/tabs.css +2 -2
  46. package/src/css/viewer.css +8 -0
  47. package/src/rust/components/column_selector/active_column.rs +21 -27
  48. package/src/rust/components/column_selector/column_selector_column_row.rs +73 -0
  49. package/src/rust/components/column_selector/config_selector.rs +7 -1
  50. package/src/rust/components/column_selector/expr_edit_button.rs +7 -1
  51. package/src/rust/components/column_selector/inactive_column.rs +8 -1
  52. package/src/rust/components/column_selector.rs +20 -3
  53. package/src/rust/components/column_settings_sidebar/style_tab.rs +2 -1
  54. package/src/rust/components/column_settings_sidebar/window_tab.rs +34 -0
  55. package/src/rust/components/column_settings_sidebar.rs +163 -16
  56. package/src/rust/components/containers/dragdrop_list.rs +73 -3
  57. package/src/rust/components/containers/sidebar.rs +99 -22
  58. package/src/rust/components/containers/split_panel.rs +6 -0
  59. package/src/rust/components/editable_header.rs +2 -0
  60. package/src/rust/components/main_panel.rs +5 -0
  61. package/src/rust/components/mod.rs +1 -0
  62. package/src/rust/components/panel_menu.rs +7 -0
  63. package/src/rust/components/panel_tab.rs +5 -0
  64. package/src/rust/components/portal.rs +7 -0
  65. package/src/rust/components/viewer/msg.rs +2 -0
  66. package/src/rust/components/viewer/render.rs +12 -0
  67. package/src/rust/components/viewer/settings.rs +33 -1
  68. package/src/rust/components/viewer.rs +2 -0
  69. package/src/rust/components/window_editor.rs +1013 -0
  70. package/src/rust/lib.rs +4 -1
  71. package/src/rust/presentation/column_locator.rs +16 -1
  72. package/src/rust/queries/columns_iter_set.rs +7 -1
  73. package/src/rust/renderer/dispatch.rs +85 -58
  74. package/src/rust/renderer.rs +34 -1
  75. package/src/rust/session/drag_drop_update.rs +18 -0
  76. package/src/rust/session/metadata.rs +66 -9
  77. package/src/rust/session/replace_expression_update.rs +1 -0
  78. package/src/rust/session.rs +7 -5
  79. package/src/rust/tasks/edit_window.rs +155 -0
  80. package/src/rust/tasks/mod.rs +2 -0
  81. package/src/rust/utils/browser/dragdrop.rs +12 -0
  82. package/src/rust/utils/browser/tests/debounce.rs +49 -0
  83. package/src/rust/utils/debounce.rs +76 -27
  84. package/src/svg/pin-icon.svg +5 -0
  85. package/src/themes/icons.css +1 -0
  86. package/src/themes/intl/de.css +7 -0
  87. package/src/themes/intl/es.css +7 -0
  88. package/src/themes/intl/fr.css +7 -0
  89. package/src/themes/intl/ja.css +7 -0
  90. package/src/themes/intl/pt.css +7 -0
  91. package/src/themes/intl/zh.css +7 -0
  92. package/src/themes/intl.css +10 -1
  93. package/src/ts/ts-rs/PanelViewerConfig.ts +2 -1
  94. package/src/ts/ts-rs/ViewerConfig.ts +2 -1
  95. package/src/ts/ts-rs/ViewerConfigUpdate.ts +9 -0
  96. package/src/ts/ts-rs/WindowAggregate.ts +3 -0
  97. package/src/ts/ts-rs/WindowSort.ts +9 -0
  98. package/src/ts/ts-rs/WindowSortDir.ts +8 -0
  99. package/src/ts/ts-rs/WindowSpec.ts +46 -0
  100. package/src/ts/ts-rs/Windows.ts +10 -0
  101. /package/dist/wasm/snippets/{perspective-viewer-daeef4ceb066e6c7 → perspective-viewer-8a8c7d5d696b43ae}/inline0.js +0 -0
  102. /package/dist/wasm/snippets/{perspective-viewer-daeef4ceb066e6c7 → perspective-viewer-8a8c7d5d696b43ae}/inline1.js +0 -0
  103. /package/dist/wasm/snippets/{perspective-viewer-daeef4ceb066e6c7 → perspective-viewer-8a8c7d5d696b43ae}/inline2.js +0 -0
  104. /package/dist/wasm/snippets/{perspective-viewer-daeef4ceb066e6c7 → perspective-viewer-8a8c7d5d696b43ae}/inline3.js +0 -0
  105. /package/dist/wasm/snippets/{perspective-viewer-daeef4ceb066e6c7 → perspective-viewer-8a8c7d5d696b43ae}/inline4.js +0 -0
  106. /package/dist/wasm/snippets/{perspective-viewer-daeef4ceb066e6c7 → perspective-viewer-8a8c7d5d696b43ae}/inline5.js +0 -0
@@ -299,6 +299,7 @@ impl PanelMenu {
299
299
 
300
300
  html! {
301
301
  <PortalModal
302
+ key="perspective-context-menu"
302
303
  tag_name="perspective-context-menu"
303
304
  surface={StyleSurface::ContextMenu}
304
305
  target={Some(self.anchor.clone())}
@@ -453,7 +454,13 @@ impl PanelMenu {
453
454
  };
454
455
 
455
456
  html! {
457
+ // Keyed by host tag: the menu→picker swap happens at the same
458
+ // vdom position, and `PortalModal`'s host element + adopted
459
+ // surface sheet are create-time-only — unkeyed reuse would leave
460
+ // the picker inside the `<perspective-context-menu>` host with
461
+ // the context-menu sheet.
456
462
  <PortalModal
463
+ key={tag_name}
457
464
  {tag_name}
458
465
  surface={StyleSurface::DropdownMenu}
459
466
  {target}
@@ -316,6 +316,11 @@ impl Component for PanelTab {
316
316
 
317
317
  let link = ctx.link().clone();
318
318
  let contextmenu = Closure::wrap(Box::new(move |event: MouseEvent| {
319
+ // Shift+right-click passes through to the native browser menu.
320
+ if event.shift_key() {
321
+ return;
322
+ }
323
+
319
324
  event.prevent_default();
320
325
  event.stop_propagation();
321
326
  link.send_message(PanelTabMsg::ContextMenu(
@@ -170,6 +170,13 @@ impl Component for PortalModal {
170
170
  }
171
171
 
172
172
  fn changed(&mut self, ctx: &Context<Self>, old_props: &Self::Properties) -> bool {
173
+ // The host element (`tag_name`) and its adopted sheet (`surface`) are
174
+ // fixed at `create` — a swap at the same vdom position must be keyed
175
+ // so Yew recreates the component (see `PanelMenu`'s menu→picker
176
+ // stages).
177
+ debug_assert_eq!(ctx.props().tag_name, old_props.tag_name);
178
+ debug_assert_eq!(ctx.props().surface, old_props.surface);
179
+
173
180
  let new_target = &ctx.props().target;
174
181
  let old_target = &old_props.target;
175
182
 
@@ -46,6 +46,8 @@ pub struct MasterSelection {
46
46
  #[derive(Debug)]
47
47
  pub enum PerspectiveViewerMsg {
48
48
  ColumnSettingsPanelSizeUpdate(Option<i32>),
49
+ ColumnSettingsPanelAutoWidth(f64),
50
+ ToggleColumnSettingsPin,
49
51
  ColumnSettingsTabChanged(ColumnSettingsTab),
50
52
  OpenColumnSettings {
51
53
  locator: Option<ColumnLocator>,
@@ -116,10 +116,18 @@ impl PerspectiveViewer {
116
116
 
117
117
  let on_settings = ctx.link().callback(|()| ToggleSettingsInit(None, None));
118
118
  let on_select_tab = ctx.link().callback(ColumnSettingsTabChanged);
119
+ // Pinning the drawer is a pure CSS positioning flip on `#modal_panel`
120
+ // (absolute overlay over the main panel <-> static flex sibling
121
+ // between the main panel and the settings pane) - the drawer NEVER
122
+ // reparents, so neither `MainPanel` nor the drawer subtree remounts
123
+ // on toggle, and the divider/width-override machinery is identical
124
+ // in both modes.
125
+ let is_pinned = self.settings_geometry.column_settings_pinned;
119
126
  let column_settings_panel = html! {
120
127
  if let Some(selected_column) = selected_column {
121
128
  <SplitPanel
122
129
  id="modal_panel"
130
+ class={classes!(is_pinned.then_some("pinned"))}
123
131
  reverse=true
124
132
  initial_size={self.settings_geometry.column_settings_width_override}
125
133
  on_reset={ctx.link().callback(|_| ColumnSettingsPanelSizeUpdate(None))}
@@ -130,6 +138,10 @@ impl PerspectiveViewer {
130
138
  {selected_tab}
131
139
  on_close={self.on_close_column_settings.clone()}
132
140
  width_override={self.settings_geometry.column_settings_width_override}
141
+ auto_width={self.settings_geometry.column_settings_auto_width}
142
+ on_auto_width={ctx.link().callback(ColumnSettingsPanelAutoWidth)}
143
+ {is_pinned}
144
+ on_toggle_pin={ctx.link().callback(|()| ToggleColumnSettingsPin)}
133
145
  {on_select_tab}
134
146
  plugin_name={self.renderer_props.plugin_name.clone()}
135
147
  {metadata}
@@ -57,6 +57,18 @@ pub(super) struct SettingsGeometry {
57
57
 
58
58
  /// User-dragged column-settings drawer width override.
59
59
  pub column_settings_width_override: Option<i32>,
60
+
61
+ /// High-water-mark auto width reported by the column-settings drawer -
62
+ /// the trap-door shared across its Style/Attributes/Window tabs, lifted
63
+ /// here (like `auto_width`) so it survives drawer re-opens and clears
64
+ /// on divider reset.
65
+ pub column_settings_auto_width: f64,
66
+
67
+ /// Whether the column-settings drawer is PINNED - laid out as a static
68
+ /// flex sibling between the main panel and the settings panel - rather
69
+ /// than FLOATING over the main panel (the default absolute overlay).
70
+ /// Session UI state, not part of the saved config.
71
+ pub column_settings_pinned: bool,
60
72
  }
61
73
 
62
74
  impl PerspectiveViewer {
@@ -373,7 +385,27 @@ impl PerspectiveViewer {
373
385
 
374
386
  pub(super) fn on_column_settings_panel_size_update(&mut self, x: Option<i32>) -> bool {
375
387
  self.settings_geometry.column_settings_width_override = x;
376
- false
388
+ if x.is_none() {
389
+ self.settings_geometry.column_settings_auto_width = 0.0;
390
+ true
391
+ } else {
392
+ false
393
+ }
394
+ }
395
+
396
+ pub(super) fn on_column_settings_panel_auto_width(&mut self, w: f64) -> bool {
397
+ if w > self.settings_geometry.column_settings_auto_width {
398
+ self.settings_geometry.column_settings_auto_width = w;
399
+ true
400
+ } else {
401
+ false
402
+ }
403
+ }
404
+
405
+ pub(super) fn on_toggle_column_settings_pin(&mut self) -> bool {
406
+ self.settings_geometry.column_settings_pinned =
407
+ !self.settings_geometry.column_settings_pinned;
408
+ true
377
409
  }
378
410
 
379
411
  pub(super) fn on_column_settings_tab_changed(
@@ -338,6 +338,8 @@ impl Component for PerspectiveViewer {
338
338
  toggle,
339
339
  } => self.on_open_column_settings(ctx, locator, sender, toggle),
340
340
  ColumnSettingsPanelSizeUpdate(x) => self.on_column_settings_panel_size_update(x),
341
+ ColumnSettingsPanelAutoWidth(w) => self.on_column_settings_panel_auto_width(w),
342
+ ToggleColumnSettingsPin => self.on_toggle_column_settings_pin(),
341
343
  ColumnSettingsTabChanged(tab) => self.on_column_settings_tab_changed(ctx, tab),
342
344
  ToggleDebug => self.on_toggle_debug(ctx),
343
345