@perspective-dev/viewer 5.3.0 → 5.4.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 (265) hide show
  1. package/dist/cdn/perspective-viewer.js +8 -8
  2. package/dist/cdn/perspective-viewer.js.map +3 -3
  3. package/dist/css/blueprint.css +1 -0
  4. package/dist/css/botanical.css +1 -1
  5. package/dist/css/dracula.css +1 -1
  6. package/dist/css/eggplant.css +1 -0
  7. package/dist/css/gruvbox-dark.css +1 -1
  8. package/dist/css/gruvbox.css +1 -1
  9. package/dist/css/icons.css +1 -1
  10. package/dist/css/intl/ar.css +1 -0
  11. package/dist/css/intl/de.css +1 -1
  12. package/dist/css/intl/es.css +1 -1
  13. package/dist/css/intl/fr.css +1 -1
  14. package/dist/css/intl/ja.css +1 -1
  15. package/dist/css/intl/pt.css +1 -1
  16. package/dist/css/intl/zh.css +1 -1
  17. package/dist/css/intl.css +1 -1
  18. package/dist/css/ledger.css +1 -0
  19. package/dist/css/monokai.css +1 -1
  20. package/dist/css/nord.css +1 -0
  21. package/dist/css/phosphor.css +1 -1
  22. package/dist/css/pro-dark.css +1 -1
  23. package/dist/css/pro.css +1 -1
  24. package/dist/css/solarized-dark.css +1 -1
  25. package/dist/css/solarized.css +1 -1
  26. package/dist/css/themes.css +1 -1
  27. package/dist/css/vaporwave.css +1 -1
  28. package/dist/css/velvet.css +1 -0
  29. package/dist/docs/perspective-docs.json +1 -1
  30. package/dist/esm/column-format.d.ts +16 -3
  31. package/dist/esm/extensions.d.ts +0 -5
  32. package/dist/esm/perspective-viewer.inline.js +7 -7
  33. package/dist/esm/perspective-viewer.inline.js.map +3 -3
  34. package/dist/esm/perspective-viewer.js +8 -8
  35. package/dist/esm/perspective-viewer.js.map +3 -3
  36. package/dist/esm/ts-rs/ViewOnUpdateResp.d.ts +1 -1
  37. package/dist/wasm/perspective-viewer.d.ts +62 -73
  38. package/dist/wasm/perspective-viewer.js +230 -238
  39. package/dist/wasm/perspective-viewer.wasm +0 -0
  40. package/dist/wasm/perspective-viewer.wasm.d.ts +18 -28
  41. package/package.json +7 -7
  42. package/src/css/_context_menu.css +1 -1
  43. package/src/css/_dropdown_menu.css +1 -1
  44. package/src/css/_viewer_bundle.css +7 -8
  45. package/src/css/column-dropdown.css +0 -3
  46. package/src/css/column-selector.css +8 -5
  47. package/src/css/column-settings-panel.css +0 -206
  48. package/src/css/column-style.css +95 -0
  49. package/src/css/config-selector.css +18 -10
  50. package/src/css/filter-dropdown.css +5 -5
  51. package/src/css/form/debug.css +28 -4
  52. package/src/css/function-dropdown.css +5 -5
  53. package/src/css/panel-tab.css +23 -0
  54. package/src/css/plugin-selector.css +6 -5
  55. package/src/css/render-warning.css +1 -1
  56. package/src/css/status-bar.css +52 -21
  57. package/src/css/type-icon.css +1 -3
  58. package/src/css/{containers → ui/containers}/context-menu.css +22 -16
  59. package/src/css/ui/containers/dropdown-menu-items.css +66 -0
  60. package/src/css/{containers → ui/containers}/dropdown-menu.css +8 -53
  61. package/src/css/{containers → ui/containers}/tabs.css +13 -3
  62. package/src/css/{dom → ui/dom}/select.css +19 -8
  63. package/src/css/viewer.css +32 -31
  64. package/src/rust/agent/tools.rs +5 -2
  65. package/src/rust/components/chat_panel.rs +1 -1
  66. package/src/rust/components/{form/code_editor.rs → code_editor.rs} +4 -2
  67. package/src/rust/components/column_dropdown.rs +2 -2
  68. package/src/rust/components/column_selector/active_column.rs +15 -9
  69. package/src/rust/components/column_selector/aggregate_selector.rs +1 -1
  70. package/src/rust/components/column_selector/config_selector.rs +2 -2
  71. package/src/rust/components/column_selector/filter_column.rs +8 -5
  72. package/src/rust/components/column_selector/inactive_column.rs +4 -2
  73. package/src/rust/components/column_selector/pivot_column.rs +4 -3
  74. package/src/rust/components/column_selector/sort_column.rs +7 -4
  75. package/src/rust/components/column_selector.rs +3 -3
  76. package/src/rust/components/column_settings_sidebar/style_tab/agg_depth_selector.rs +1 -1
  77. package/src/rust/components/column_settings_sidebar/style_tab/primitive_field.rs +15 -17
  78. package/src/rust/components/column_settings_sidebar/style_tab/symbol/symbol_selector.rs +1 -1
  79. package/src/rust/components/column_settings_sidebar/style_tab.rs +296 -238
  80. package/src/rust/components/column_settings_sidebar.rs +3 -4
  81. package/src/rust/components/copy_dropdown.rs +1 -1
  82. package/src/rust/components/datetime_column_style/custom.rs +1 -3
  83. package/src/rust/components/datetime_column_style/simple.rs +16 -6
  84. package/src/rust/components/datetime_column_style.rs +51 -12
  85. package/src/rust/components/{form/debug.rs → debug_panel.rs} +5 -5
  86. package/src/rust/components/{containers/dragdrop_list.rs → dragdrop_list.rs} +2 -10
  87. package/src/rust/components/export_dropdown.rs +1 -1
  88. package/src/rust/components/expression_editor.rs +1 -1
  89. package/src/rust/components/filter_dropdown.rs +2 -2
  90. package/src/rust/components/function_dropdown.rs +2 -2
  91. package/src/rust/components/main_panel/frame_theme.rs +3 -59
  92. package/src/rust/components/main_panel/reconcile.rs +9 -4
  93. package/src/rust/components/main_panel/render.rs +62 -11
  94. package/src/rust/components/main_panel/update.rs +39 -10
  95. package/src/rust/components/main_panel.rs +26 -2
  96. package/src/rust/components/mod.rs +5 -7
  97. package/src/rust/components/new_panel_menu.rs +97 -0
  98. package/src/rust/components/number_series_style.rs +2 -3
  99. package/src/rust/components/panel_menu.rs +61 -87
  100. package/src/rust/components/panel_tab.rs +100 -43
  101. package/src/rust/components/plugin_tab.rs +125 -87
  102. package/src/rust/components/render_warning.rs +2 -2
  103. package/src/rust/components/{status_bar_counter.rs → rows_counter.rs} +10 -10
  104. package/src/rust/components/settings_panel.rs +3 -2
  105. package/src/rust/components/status_bar.rs +113 -20
  106. package/src/rust/components/status_indicator.rs +5 -14
  107. package/src/rust/components/string_column_style.rs +1 -2
  108. package/src/rust/components/{style/mod.rs → style.rs} +32 -15
  109. package/src/rust/components/style_controls/number_string_format/digits_section.rs +25 -15
  110. package/src/rust/components/style_controls/number_string_format/misc_section.rs +7 -3
  111. package/src/rust/components/style_controls/number_string_format/style_section.rs +2 -1
  112. package/src/rust/components/style_controls/number_string_format/types.rs +24 -0
  113. package/src/rust/components/style_controls/number_string_format.rs +37 -14
  114. package/src/rust/components/viewer/msg.rs +43 -30
  115. package/src/rust/components/viewer/panels.rs +50 -19
  116. package/src/rust/components/viewer/render.rs +15 -13
  117. package/src/rust/components/viewer/settings.rs +137 -68
  118. package/src/rust/components/viewer/snapshots.rs +5 -10
  119. package/src/rust/components/viewer/wiring.rs +1 -21
  120. package/src/rust/components/viewer.rs +15 -10
  121. package/src/rust/components/window_editor.rs +8 -9
  122. package/src/rust/config/column_config_schema.rs +358 -52
  123. package/src/rust/config/datetime_column_style.rs +4 -21
  124. package/src/rust/config/mod.rs +0 -2
  125. package/src/rust/config/number_string_format.rs +211 -18
  126. package/src/rust/config/workspace_config.rs +2 -1
  127. package/src/rust/custom_elements/debug_plugin.rs +1 -10
  128. package/src/rust/custom_elements/mod.rs +0 -3
  129. package/src/rust/custom_elements/viewer.rs +0 -18
  130. package/src/rust/js/plugin.rs +0 -86
  131. package/src/rust/lib.rs +12 -15
  132. package/src/rust/presentation/column_locator.rs +3 -7
  133. package/src/rust/presentation.rs +85 -38
  134. package/src/rust/queries/hosted_tables.rs +38 -0
  135. package/src/rust/queries/mod.rs +2 -0
  136. package/src/rust/queries/palette_set.rs +1 -1
  137. package/src/rust/queries/plugin_column_styles.rs +2 -2
  138. package/src/rust/renderer/activate.rs +1 -3
  139. package/src/rust/renderer/dispatch.rs +117 -30
  140. package/src/rust/renderer/limits.rs +24 -5
  141. package/src/rust/renderer/plugin_config.rs +56 -8
  142. package/src/rust/renderer/props.rs +2 -1
  143. package/src/rust/renderer.rs +14 -27
  144. package/src/rust/session/props.rs +4 -3
  145. package/src/rust/session/view_subscription.rs +19 -6
  146. package/src/rust/session.rs +38 -70
  147. package/src/rust/tasks/create_panel.rs +1 -1
  148. package/src/rust/tasks/dismiss_render_warning.rs +1 -1
  149. package/src/rust/tasks/eject.rs +1 -0
  150. package/src/rust/tasks/pipeline.rs +0 -60
  151. package/src/rust/tasks/presize_panels.rs +24 -1
  152. package/src/rust/tasks/restore_and_render.rs +0 -17
  153. package/src/rust/tasks/send_column_config.rs +1 -1
  154. package/src/rust/tasks/send_plugin_config.rs +1 -1
  155. package/src/rust/tasks/set_edit_mode.rs +1 -1
  156. package/src/rust/ui/containers/control_group.rs +113 -0
  157. package/src/rust/{components → ui}/containers/dropdown_menu.rs +5 -2
  158. package/src/rust/{components → ui}/containers/mod.rs +1 -4
  159. package/src/rust/{components → ui}/containers/scroll_panel.rs +0 -22
  160. package/src/rust/{components → ui}/containers/scroll_panel_item.rs +0 -13
  161. package/src/rust/{components → ui}/containers/select.rs +8 -8
  162. package/src/rust/{components → ui}/containers/sidebar.rs +5 -32
  163. package/src/rust/{components → ui}/containers/split_panel.rs +8 -80
  164. package/src/rust/{components → ui}/containers/tab_list.rs +15 -9
  165. package/src/rust/{components → ui}/context_menu.rs +8 -13
  166. package/src/rust/{presentation/drag_helpers.rs → ui/dragdrop.rs} +26 -31
  167. package/src/rust/{components → ui}/font_loader.rs +0 -26
  168. package/src/rust/{components → ui}/form/color_selector.rs +4 -2
  169. package/src/rust/ui/form/intl_label.rs +81 -0
  170. package/src/rust/{components → ui}/form/mirrored_textarea.rs +0 -53
  171. package/src/rust/{components → ui}/form/mod.rs +1 -10
  172. package/src/rust/{components → ui}/form/multi_stop_gradient_selector.rs +4 -5
  173. package/src/rust/{components → ui}/form/named_value_picker.rs +1 -6
  174. package/src/rust/{components → ui}/form/number_field.rs +1 -1
  175. package/src/rust/{components → ui}/form/number_range_field.rs +1 -1
  176. package/src/rust/{components → ui}/form/optional_field.rs +3 -1
  177. package/src/rust/{components → ui}/form/palette_selector.rs +4 -5
  178. package/src/rust/{components → ui}/form/select_enum_field.rs +2 -2
  179. package/src/rust/{components → ui}/form/select_value_field.rs +2 -2
  180. package/src/rust/ui/mod.rs +56 -0
  181. package/src/rust/ui/modal.rs +61 -0
  182. package/src/rust/{components → ui}/portal.rs +174 -79
  183. package/src/rust/{components/style/style_provider.rs → ui/style.rs} +4 -34
  184. package/src/rust/utils/completion.rs +0 -6
  185. package/src/rust/{config/css_scale.rs → utils/css.rs} +38 -35
  186. package/src/rust/utils/mod.rs +2 -0
  187. package/src/rust/workspace.rs +35 -0
  188. package/src/svg/boolean-type.svg +3 -2
  189. package/src/svg/checkbox-checked-icon.svg +4 -7
  190. package/src/svg/checkbox-hover.svg +3 -3
  191. package/src/svg/checkbox-off.svg +2 -3
  192. package/src/svg/checkbox-on.svg +3 -3
  193. package/src/svg/checkbox-unchecked-icon.svg +3 -3
  194. package/src/svg/datagrid-select-column.svg +8 -15
  195. package/src/svg/datagrid-select-region.svg +8 -15
  196. package/src/svg/datagrid-select-row-tree.svg +7 -12
  197. package/src/svg/datagrid-select-row.svg +8 -13
  198. package/src/svg/date-type.svg +4 -23
  199. package/src/svg/drawer-tab-hover.svg +4 -6
  200. package/src/svg/drawer-tab-invert-hover.svg +5 -5
  201. package/src/svg/drawer-tab-invert.svg +3 -5
  202. package/src/svg/drawer-tab.svg +5 -5
  203. package/src/svg/mega-menu-icons-candlestick.svg +5 -37
  204. package/src/svg/mega-menu-icons-ohlc.svg +4 -39
  205. package/src/svg/mega-menu-icons-sunburst.svg +4 -38
  206. package/src/svg/mega-menu-icons-treemap.svg +3 -43
  207. package/src/svg/mega-menu-icons-y-scatter.svg +12 -72
  208. package/src/svg/new-panel-icon.svg +4 -0
  209. package/src/svg/number-type.svg +3 -3
  210. package/src/svg/radio-hover.svg +3 -3
  211. package/src/svg/radio-off.svg +3 -3
  212. package/src/svg/radio-on.svg +3 -3
  213. package/src/svg/status_ok.svg +3 -26
  214. package/src/svg/string-type.svg +4 -8
  215. package/src/svg/theme-icon.svg +5 -5
  216. package/src/themes/blueprint.css +133 -0
  217. package/src/themes/botanical.css +3 -52
  218. package/src/themes/defaults.css +3 -144
  219. package/src/themes/dracula.css +1 -71
  220. package/src/themes/eggplant.css +131 -0
  221. package/src/themes/gruvbox-dark.css +2 -79
  222. package/src/themes/gruvbox.css +2 -40
  223. package/src/themes/icons.css +2 -10
  224. package/src/themes/intl/ar.css +185 -0
  225. package/src/themes/intl/de.css +65 -33
  226. package/src/themes/intl/es.css +60 -28
  227. package/src/themes/intl/fr.css +60 -28
  228. package/src/themes/intl/ja.css +62 -30
  229. package/src/themes/intl/pt.css +58 -26
  230. package/src/themes/intl/zh.css +68 -36
  231. package/src/themes/intl.css +42 -7
  232. package/src/themes/ledger.css +137 -0
  233. package/src/themes/monokai.css +1 -64
  234. package/src/themes/nord.css +131 -0
  235. package/src/themes/phosphor.css +1 -61
  236. package/src/themes/pro-dark.css +1 -52
  237. package/src/themes/pro.css +98 -0
  238. package/src/themes/solarized-dark.css +1 -46
  239. package/src/themes/solarized.css +1 -24
  240. package/src/themes/themes.css +10 -5
  241. package/src/themes/vaporwave.css +1 -57
  242. package/src/themes/velvet.css +132 -0
  243. package/src/ts/column-format.ts +52 -2
  244. package/src/ts/extensions.ts +0 -13
  245. package/src/ts/ts-rs/ViewOnUpdateResp.ts +1 -1
  246. package/src/css/plugin-settings-panel.css +0 -99
  247. package/src/rust/components/modal.rs +0 -177
  248. package/src/rust/custom_elements/copy_dropdown.rs +0 -219
  249. package/src/rust/custom_elements/export_dropdown.rs +0 -216
  250. package/src/rust/custom_elements/modal.rs +0 -299
  251. package/src/svg/dropdown-selector-light.svg +0 -3
  252. /package/dist/wasm/snippets/{perspective-viewer-39c3c3b28e3cbd48 → perspective-viewer-adc6f3f79141112b}/inline0.js +0 -0
  253. /package/dist/wasm/snippets/{perspective-viewer-39c3c3b28e3cbd48 → perspective-viewer-adc6f3f79141112b}/inline1.js +0 -0
  254. /package/dist/wasm/snippets/{perspective-viewer-39c3c3b28e3cbd48 → perspective-viewer-adc6f3f79141112b}/inline2.js +0 -0
  255. /package/dist/wasm/snippets/{perspective-viewer-39c3c3b28e3cbd48 → perspective-viewer-adc6f3f79141112b}/inline3.js +0 -0
  256. /package/dist/wasm/snippets/{perspective-viewer-39c3c3b28e3cbd48 → perspective-viewer-adc6f3f79141112b}/inline4.js +0 -0
  257. /package/dist/wasm/snippets/{perspective-viewer-39c3c3b28e3cbd48 → perspective-viewer-adc6f3f79141112b}/inline5.js +0 -0
  258. /package/src/css/{containers → ui/containers}/scroll-panel.css +0 -0
  259. /package/src/css/{containers → ui/containers}/split-panel.css +0 -0
  260. /package/src/css/{dom → ui/dom}/checkbox.css +0 -0
  261. /package/src/css/{dom → ui/dom}/scrollbar.css +0 -0
  262. /package/src/css/{form → ui/form}/mirrored-textarea.css +0 -0
  263. /package/src/rust/components/{form → code_editor}/highlight.rs +0 -0
  264. /package/src/rust/{components → ui}/containers/sidebar_close_button.rs +0 -0
  265. /package/src/rust/{components → ui}/form/number_input.rs +0 -0
@@ -1,299 +0,0 @@
1
- // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2
- // ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
3
- // ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
4
- // ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
5
- // ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
6
- // ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7
- // ┃ Copyright (c) 2017, the Perspective Authors. ┃
8
- // ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9
- // ┃ This file is part of the Perspective library, distributed under the terms ┃
10
- // ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11
- // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
-
13
- use std::cell::{Cell, RefCell};
14
- use std::rc::Rc;
15
-
16
- use derivative::Derivative;
17
- use futures::Future;
18
- use perspective_js::utils::{global, *};
19
- use wasm_bindgen::JsCast;
20
- use wasm_bindgen::prelude::*;
21
- use web_sys::*;
22
- use yew::html::SendAsMessage;
23
- use yew::prelude::*;
24
-
25
- use crate::components::modal::*;
26
- use crate::utils::*;
27
-
28
- type BlurHandlerType = Rc<RefCell<Option<Closure<dyn FnMut(FocusEvent)>>>>;
29
-
30
- /// A `ModalElement` wraps the parameterized yew `Component` in a Custom
31
- /// Element.
32
- ///
33
- /// Via the `open()` and `close()` methods, a `ModalElement` can be positioned
34
- /// next to any existing on-page elements, accounting for viewport,
35
- /// scroll position, etc.
36
- ///
37
- /// `#[derive(Clone)]` generates the trait bound `T: Clone`, which is not
38
- /// required because `Scope<T>` implements Clone without this bound; thus
39
- /// `Clone` must be implemented by the `derivative` crate's
40
- /// [custom bounds](https://mcarton.github.io/rust-derivative/latest/Debug.html#custom-bound)
41
- /// support.
42
- #[derive(Derivative)]
43
- #[derivative(Clone(bound = ""))]
44
- pub struct ModalElement<T>
45
- where
46
- T: Component,
47
- T::Properties: ModalLink<T>,
48
- {
49
- root: Rc<RefCell<Option<AppHandle<Modal<T>>>>>,
50
- pub custom_element: HtmlElement,
51
- target: Rc<RefCell<Option<HtmlElement>>>,
52
- blurhandler: BlurHandlerType,
53
- own_focus: bool,
54
- resize_sub: Rc<RefCell<Option<Subscription>>>,
55
- anchor: Rc<Cell<ModalAnchor>>,
56
- on_blur: Option<Callback<()>>,
57
- }
58
-
59
- impl<T> ModalElement<T>
60
- where
61
- T: Component,
62
- T::Properties: ModalLink<T>,
63
- {
64
- pub fn new(
65
- custom_element: web_sys::HtmlElement,
66
- props: T::Properties,
67
- own_focus: bool,
68
- on_blur: Option<Callback<()>>,
69
- ) -> Self {
70
- custom_element.set_attribute("tabindex", "0").unwrap();
71
- let init = web_sys::ShadowRootInit::new(web_sys::ShadowRootMode::Open);
72
- let shadow_root = custom_element
73
- .attach_shadow(&init)
74
- .unwrap()
75
- .unchecked_into::<web_sys::Element>();
76
-
77
- let cprops = yew::props!(ModalProps<T> {
78
- child: Some(html_nested! {
79
- <T ..props />
80
- }),
81
- });
82
-
83
- let root = Rc::new(RefCell::new(Some(
84
- yew::Renderer::with_root_and_props(shadow_root, cprops).render(),
85
- )));
86
-
87
- let blurhandler = Rc::new(RefCell::new(None));
88
- Self {
89
- root,
90
- custom_element,
91
- target: Rc::new(RefCell::new(None)),
92
- own_focus,
93
- blurhandler,
94
- resize_sub: Rc::new(RefCell::new(None)),
95
- anchor: Default::default(),
96
- on_blur,
97
- }
98
- }
99
-
100
- fn calc_anchor_pos(&self, target: &HtmlElement) -> (f64, f64) {
101
- let target_rect = target.get_bounding_client_rect();
102
- let modal_rect = self.custom_element.get_bounding_client_rect();
103
- calc_anchor_position(self.anchor.get(), &target_rect, &modal_rect)
104
- }
105
-
106
- async fn open_within_viewport(&self, target: HtmlElement) -> ApiResult<()> {
107
- let elem = target.unchecked_ref::<HtmlElement>();
108
- let rect = elem.get_bounding_client_rect();
109
- let width = rect.width();
110
- let height = rect.height();
111
- let top = rect.top();
112
- let left = rect.left();
113
- *self.target.borrow_mut() = Some(target.clone());
114
-
115
- // Default, top left/bottom left
116
- let msg = ModalMsg::SetPos {
117
- top: top + height - 1.0,
118
- left,
119
- visible: false,
120
- rev_vert: false,
121
- };
122
-
123
- self.root.borrow().as_ref().unwrap().send_message(msg);
124
- global::body().append_child(&self.custom_element)?;
125
- request_animation_frame().await;
126
-
127
- // Check if the modal has been positioned off-screen and re-locate if necessary
128
- self.anchor.set(calc_relative_position(
129
- &self.custom_element,
130
- top,
131
- left,
132
- height,
133
- width,
134
- ));
135
-
136
- let (top, left) = self.calc_anchor_pos(&target);
137
- let msg = ModalMsg::SetPos {
138
- top,
139
- left,
140
- visible: true,
141
- rev_vert: self.anchor.get().is_rev_vert(),
142
- };
143
-
144
- self.root.borrow().as_ref().unwrap().send_message(msg);
145
-
146
- if self.own_focus {
147
- let mut this = Some(self.clone());
148
- *self.blurhandler.borrow_mut() = Some(Closure::new(move |_| {
149
- this.take().and_then(|x| x.hide().ok()).unwrap_or(())
150
- }));
151
-
152
- self.custom_element
153
- .dataset()
154
- .set("poscorrected", "true")
155
- .unwrap();
156
-
157
- self.custom_element.add_event_listener_with_callback(
158
- "blur",
159
- self.blurhandler
160
- .borrow()
161
- .as_ref()
162
- .unwrap()
163
- .as_ref()
164
- .unchecked_ref(),
165
- )?;
166
-
167
- Ok(self.custom_element.focus()?)
168
- } else {
169
- Ok(())
170
- }
171
- }
172
-
173
- pub fn send_message(&self, msg: T::Message) {
174
- self.root
175
- .borrow()
176
- .as_ref()
177
- .unwrap()
178
- .send_message(ModalMsg::SubMsg(msg))
179
- }
180
-
181
- pub fn send_message_batch(&self, msgs: Vec<T::Message>) {
182
- self.root
183
- .borrow()
184
- .as_ref()
185
- .unwrap()
186
- .send_message_batch(msgs.into_iter().map(ModalMsg::SubMsg).collect())
187
- }
188
-
189
- pub fn send_future_batch<Fut>(&self, future: Fut)
190
- where
191
- Fut: Future + 'static,
192
- Fut::Output: SendAsMessage<Modal<T>>,
193
- {
194
- self.root
195
- .borrow()
196
- .as_ref()
197
- .unwrap()
198
- .send_future_batch(future)
199
- }
200
-
201
- /// Open this modal by attaching directly to `document.body` with position
202
- /// absolutely positioned relative to an alread-connected `target`
203
- /// element.
204
- ///
205
- /// Because the Custom Element has a `blur` handler, we must invoke this
206
- /// before attempting to re-parent the element.
207
- pub async fn open(
208
- self,
209
- target: web_sys::HtmlElement,
210
- resize_pubsub: Option<&PubSub<()>>,
211
- ) -> ApiResult<()> {
212
- if let Some(resize) = resize_pubsub {
213
- let this = self.clone();
214
- let target = target.clone();
215
- let anchor = self.anchor.clone();
216
- *self.resize_sub.borrow_mut() = Some(resize.add_listener(move |()| {
217
- let (top, left) = this.calc_anchor_pos(&target);
218
- let msg = ModalMsg::SetPos {
219
- top,
220
- left,
221
- visible: true,
222
- rev_vert: anchor.get().is_rev_vert(),
223
- };
224
-
225
- this.root.borrow().as_ref().unwrap().send_message(msg);
226
- }));
227
- };
228
-
229
- target.class_list().add_1("modal-target").unwrap();
230
- let theme = get_theme(&target);
231
- self.open_within_viewport(target).await.unwrap();
232
- if let Some(theme) = theme {
233
- self.custom_element.set_attribute("theme", &theme).unwrap();
234
- }
235
-
236
- Ok(())
237
- }
238
-
239
- pub fn is_open(&self) -> bool {
240
- self.custom_element.is_connected()
241
- }
242
-
243
- /// Remove from document.
244
- pub fn hide(&self) -> ApiResult<()> {
245
- if self.is_open() {
246
- if self.own_focus {
247
- self.custom_element.remove_event_listener_with_callback(
248
- "blur",
249
- self.blurhandler
250
- .borrow()
251
- .as_ref()
252
- .unwrap()
253
- .as_ref()
254
- .unchecked_ref(),
255
- )?;
256
-
257
- *self.blurhandler.borrow_mut() = None;
258
- }
259
-
260
- global::body().remove_child(&self.custom_element)?;
261
- if let Some(blur) = &self.on_blur {
262
- blur.emit(());
263
- }
264
-
265
- let target = self.target.borrow_mut().take().unwrap();
266
- let event = web_sys::CustomEvent::new("-perspective-close-expression")?;
267
- target.class_list().remove_1("modal-target").unwrap();
268
- if get_theme(&target).is_some() {
269
- self.custom_element.remove_attribute("theme")?;
270
- }
271
-
272
- target.dispatch_event(&event)?;
273
- }
274
-
275
- Ok(())
276
- }
277
-
278
- /// Remove from document and cleanup.
279
- pub fn destroy(self) -> ApiResult<()> {
280
- self.hide()?;
281
- self.root.borrow_mut().take().unwrap().destroy();
282
- Ok(())
283
- }
284
- }
285
-
286
- fn get_theme(elem: &HtmlElement) -> Option<String> {
287
- let styles = global::window().get_computed_style(elem).unwrap().unwrap();
288
- styles
289
- .get_property_value("--psp-theme-name")
290
- .ok()
291
- .and_then(|x| {
292
- let trimmed = x.trim();
293
- if !trimmed.is_empty() {
294
- Some(trimmed[1..trimmed.len() - 1].to_owned())
295
- } else {
296
- None
297
- }
298
- })
299
- }
@@ -1,3 +0,0 @@
1
- <svg width="6" height="4" viewBox="0 0 6 4" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M1 1L3.17687 3.17687L5.35374 1" stroke="#ffffff" stroke-width="0.725624" stroke-linecap="round"/>
3
- </svg>
File without changes
File without changes
File without changes