@perspective-dev/viewer 5.3.1 → 5.5.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 (291) 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/blueprint.css +1 -1
  4. package/dist/css/botanical.css +1 -1
  5. package/dist/css/dracula.css +1 -1
  6. package/dist/css/eggplant.css +1 -1
  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 -1
  19. package/dist/css/monokai.css +1 -1
  20. package/dist/css/nord.css +1 -1
  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 -1
  29. package/dist/docs/perspective-docs.json +1 -1
  30. package/dist/esm/extensions.d.ts +0 -5
  31. package/dist/esm/perspective-viewer.d.ts +2 -0
  32. package/dist/esm/perspective-viewer.inline.js +8 -8
  33. package/dist/esm/perspective-viewer.inline.js.map +2 -2
  34. package/dist/esm/perspective-viewer.js +5 -5
  35. package/dist/esm/perspective-viewer.js.map +2 -2
  36. package/dist/esm/plugin.d.ts +9 -0
  37. package/dist/esm/ts-rs/AddPanelOptions.d.ts +9 -0
  38. package/dist/esm/ts-rs/GetViewMode.d.ts +4 -0
  39. package/dist/esm/ts-rs/GetViewOptions.d.ts +8 -0
  40. package/dist/esm/ts-rs/RestoreOptions.d.ts +6 -0
  41. package/dist/esm/ts-rs/RestoreWorkspaceOptions.d.ts +9 -0
  42. package/dist/esm/ts-rs/ViewOnUpdateResp.d.ts +1 -1
  43. package/dist/esm/ts-rs/WorkspaceConfigUpdate.d.ts +30 -22
  44. package/dist/wasm/perspective-viewer.d.ts +137 -104
  45. package/dist/wasm/perspective-viewer.js +337 -269
  46. package/dist/wasm/perspective-viewer.wasm +0 -0
  47. package/dist/wasm/perspective-viewer.wasm.d.ts +20 -30
  48. package/package.json +7 -7
  49. package/src/css/_context_menu.css +1 -1
  50. package/src/css/_dropdown_menu.css +1 -1
  51. package/src/css/_viewer_bundle.css +7 -8
  52. package/src/css/column-dropdown.css +0 -3
  53. package/src/css/column-selector.css +18 -7
  54. package/src/css/column-settings-panel.css +0 -225
  55. package/src/css/column-style.css +175 -0
  56. package/src/css/config-selector.css +19 -11
  57. package/src/css/filter-dropdown.css +5 -5
  58. package/src/css/form/debug.css +37 -4
  59. package/src/css/function-dropdown.css +5 -5
  60. package/src/css/panel-tab.css +23 -0
  61. package/src/css/plugin-selector.css +5 -5
  62. package/src/css/render-warning.css +1 -1
  63. package/src/css/status-bar.css +63 -21
  64. package/src/css/type-icon.css +1 -3
  65. package/src/css/{containers → ui/containers}/context-menu.css +22 -16
  66. package/src/css/ui/containers/dropdown-menu-items.css +66 -0
  67. package/src/css/{containers → ui/containers}/dropdown-menu.css +8 -53
  68. package/src/css/{containers → ui/containers}/tabs.css +2 -1
  69. package/src/css/viewer.css +32 -26
  70. package/src/rust/agent/tools.rs +80 -7
  71. package/src/rust/components/chat_panel.rs +1 -1
  72. package/src/rust/components/{form/code_editor.rs → code_editor.rs} +4 -2
  73. package/src/rust/components/column_dropdown.rs +2 -2
  74. package/src/rust/components/column_selector/active_column.rs +24 -9
  75. package/src/rust/components/column_selector/aggregate_selector.rs +1 -1
  76. package/src/rust/components/column_selector/config_selector.rs +2 -2
  77. package/src/rust/components/column_selector/filter_column.rs +8 -5
  78. package/src/rust/components/column_selector/inactive_column.rs +4 -2
  79. package/src/rust/components/column_selector/pivot_column.rs +4 -3
  80. package/src/rust/components/column_selector/sort_column.rs +7 -4
  81. package/src/rust/components/column_selector.rs +14 -3
  82. package/src/rust/components/column_settings_sidebar/style_tab/agg_depth_selector.rs +1 -1
  83. package/src/rust/components/column_settings_sidebar/style_tab/alignment_field.rs +90 -0
  84. package/src/rust/components/column_settings_sidebar/style_tab/font_field.rs +267 -0
  85. package/src/rust/components/column_settings_sidebar/style_tab/primitive_field.rs +16 -18
  86. package/src/rust/components/column_settings_sidebar/style_tab/symbol/symbol_selector.rs +1 -1
  87. package/src/rust/components/column_settings_sidebar/style_tab.rs +70 -12
  88. package/src/rust/components/column_settings_sidebar.rs +3 -4
  89. package/src/rust/components/copy_dropdown.rs +1 -1
  90. package/src/rust/components/datetime_column_style/custom.rs +1 -3
  91. package/src/rust/components/datetime_column_style/simple.rs +1 -2
  92. package/src/rust/components/datetime_column_style.rs +1 -2
  93. package/src/rust/components/{form/debug.rs → debug_panel.rs} +112 -55
  94. package/src/rust/components/{containers/dragdrop_list.rs → dragdrop_list.rs} +2 -10
  95. package/src/rust/components/export_dropdown.rs +1 -1
  96. package/src/rust/components/expression_editor.rs +1 -1
  97. package/src/rust/components/filter_dropdown.rs +2 -2
  98. package/src/rust/components/function_dropdown.rs +2 -2
  99. package/src/rust/components/main_panel/frame_theme.rs +3 -59
  100. package/src/rust/components/main_panel/msg.rs +4 -0
  101. package/src/rust/components/main_panel/reconcile.rs +9 -4
  102. package/src/rust/components/main_panel/render.rs +62 -11
  103. package/src/rust/components/main_panel/update.rs +39 -10
  104. package/src/rust/components/main_panel.rs +40 -2
  105. package/src/rust/components/mod.rs +5 -8
  106. package/src/rust/components/new_panel_menu.rs +97 -0
  107. package/src/rust/components/number_series_style.rs +2 -3
  108. package/src/rust/components/panel_menu.rs +61 -87
  109. package/src/rust/components/panel_tab.rs +100 -43
  110. package/src/rust/components/plugin_tab.rs +58 -4
  111. package/src/rust/components/render_warning.rs +2 -2
  112. package/src/rust/components/{status_bar_counter.rs → rows_counter.rs} +10 -10
  113. package/src/rust/components/settings_panel.rs +8 -2
  114. package/src/rust/components/status_bar.rs +113 -19
  115. package/src/rust/components/status_indicator.rs +9 -14
  116. package/src/rust/components/{style/mod.rs → style.rs} +32 -15
  117. package/src/rust/components/style_controls/number_string_format/digits_section.rs +3 -5
  118. package/src/rust/components/style_controls/number_string_format/misc_section.rs +1 -1
  119. package/src/rust/components/style_controls/number_string_format/style_section.rs +1 -1
  120. package/src/rust/components/viewer/msg.rs +43 -30
  121. package/src/rust/components/viewer/panels.rs +53 -19
  122. package/src/rust/components/viewer/render.rs +16 -13
  123. package/src/rust/components/viewer/settings.rs +137 -68
  124. package/src/rust/components/viewer/snapshots.rs +5 -10
  125. package/src/rust/components/viewer/wiring.rs +11 -22
  126. package/src/rust/components/viewer.rs +15 -10
  127. package/src/rust/components/window_editor.rs +8 -9
  128. package/src/rust/config/column_config_schema.rs +312 -33
  129. package/src/rust/config/datetime_column_style.rs +0 -11
  130. package/src/rust/config/mod.rs +0 -4
  131. package/src/rust/config/options.rs +50 -0
  132. package/src/rust/config/workspace_config.rs +70 -24
  133. package/src/rust/custom_elements/debug_plugin.rs +1 -10
  134. package/src/rust/custom_elements/mod.rs +0 -3
  135. package/src/rust/custom_elements/viewer.rs +194 -115
  136. package/src/rust/js/plugin.rs +3 -87
  137. package/src/rust/lib.rs +19 -18
  138. package/src/rust/presentation/column_locator.rs +3 -7
  139. package/src/rust/presentation.rs +68 -38
  140. package/src/rust/queries/hosted_tables.rs +38 -0
  141. package/src/rust/queries/mod.rs +2 -0
  142. package/src/rust/queries/palette_set.rs +1 -1
  143. package/src/rust/queries/plugin_column_styles.rs +6 -5
  144. package/src/rust/renderer/activate.rs +1 -3
  145. package/src/rust/renderer/dispatch.rs +83 -22
  146. package/src/rust/renderer/limits.rs +24 -5
  147. package/src/rust/renderer/plugin_config.rs +201 -41
  148. package/src/rust/renderer/plugin_store.rs +2 -1
  149. package/src/rust/renderer/props.rs +7 -1
  150. package/src/rust/renderer.rs +23 -27
  151. package/src/rust/session/props.rs +8 -3
  152. package/src/rust/session/view_subscription.rs +19 -6
  153. package/src/rust/session.rs +189 -150
  154. package/src/rust/tasks/create_panel.rs +5 -2
  155. package/src/rust/tasks/dismiss_render_warning.rs +1 -1
  156. package/src/rust/tasks/eject.rs +1 -0
  157. package/src/rust/tasks/pipeline.rs +18 -67
  158. package/src/rust/tasks/presize_panels.rs +24 -1
  159. package/src/rust/tasks/restore_and_render.rs +0 -17
  160. package/src/rust/tasks/restore_panel.rs +129 -30
  161. package/src/rust/tasks/send_column_config.rs +4 -1
  162. package/src/rust/tasks/send_plugin_config.rs +1 -1
  163. package/src/rust/tasks/set_edit_mode.rs +1 -1
  164. package/src/rust/tasks/sync_update_panels.rs +147 -67
  165. package/src/rust/tasks/table_lifecycle.rs +7 -1
  166. package/src/rust/{components → ui}/containers/control_group.rs +25 -3
  167. package/src/rust/{components → ui}/containers/dropdown_menu.rs +5 -2
  168. package/src/rust/{components → ui}/containers/mod.rs +0 -4
  169. package/src/rust/{components → ui}/containers/scroll_panel.rs +0 -22
  170. package/src/rust/{components → ui}/containers/scroll_panel_item.rs +0 -13
  171. package/src/rust/{components → ui}/containers/select.rs +0 -6
  172. package/src/rust/{components → ui}/containers/sidebar.rs +5 -32
  173. package/src/rust/{components → ui}/containers/split_panel.rs +8 -80
  174. package/src/rust/{components → ui}/containers/tab_list.rs +15 -9
  175. package/src/rust/{components → ui}/context_menu.rs +8 -13
  176. package/src/rust/{presentation/drag_helpers.rs → ui/dragdrop.rs} +26 -31
  177. package/src/rust/{components → ui}/font_loader.rs +0 -26
  178. package/src/rust/{components → ui}/form/color_selector.rs +4 -2
  179. package/src/rust/{config/datetime_column_style/color_mode.rs → ui/form/intl_label.rs} +42 -42
  180. package/src/rust/{components → ui}/form/mirrored_textarea.rs +0 -53
  181. package/src/rust/{components → ui}/form/mod.rs +1 -10
  182. package/src/rust/{components → ui}/form/multi_stop_gradient_selector.rs +4 -5
  183. package/src/rust/{components → ui}/form/named_value_picker.rs +1 -6
  184. package/src/rust/{components → ui}/form/number_field.rs +1 -1
  185. package/src/rust/{components → ui}/form/number_range_field.rs +1 -1
  186. package/src/rust/{components → ui}/form/optional_field.rs +3 -1
  187. package/src/rust/{components → ui}/form/palette_selector.rs +4 -5
  188. package/src/rust/{components → ui}/form/select_enum_field.rs +2 -2
  189. package/src/rust/{components → ui}/form/select_value_field.rs +2 -2
  190. package/src/rust/ui/mod.rs +56 -0
  191. package/src/rust/ui/modal.rs +61 -0
  192. package/src/rust/{components → ui}/portal.rs +175 -79
  193. package/src/rust/{components/style/style_provider.rs → ui/style.rs} +4 -34
  194. package/src/rust/utils/completion.rs +0 -6
  195. package/src/rust/{config/css_scale.rs → utils/css.rs} +38 -35
  196. package/src/rust/utils/css_vars.rs +13 -0
  197. package/src/rust/utils/local_fonts.rs +395 -0
  198. package/src/rust/utils/mod.rs +4 -0
  199. package/src/rust/workspace.rs +47 -0
  200. package/src/svg/boolean-type.svg +3 -2
  201. package/src/svg/checkbox-checked-icon.svg +4 -7
  202. package/src/svg/checkbox-hover.svg +3 -3
  203. package/src/svg/checkbox-off.svg +2 -3
  204. package/src/svg/checkbox-on.svg +3 -3
  205. package/src/svg/checkbox-unchecked-icon.svg +3 -3
  206. package/src/svg/datagrid-select-column.svg +8 -15
  207. package/src/svg/datagrid-select-region.svg +8 -15
  208. package/src/svg/datagrid-select-row-tree.svg +7 -12
  209. package/src/svg/datagrid-select-row.svg +8 -13
  210. package/src/svg/date-type.svg +4 -23
  211. package/src/svg/drawer-tab-hover.svg +4 -6
  212. package/src/svg/drawer-tab-invert-hover.svg +5 -5
  213. package/src/svg/drawer-tab-invert.svg +3 -5
  214. package/src/svg/drawer-tab.svg +5 -5
  215. package/src/svg/mega-menu-icons-candlestick.svg +5 -37
  216. package/src/svg/mega-menu-icons-ohlc.svg +4 -39
  217. package/src/svg/mega-menu-icons-sunburst.svg +4 -38
  218. package/src/svg/mega-menu-icons-treemap.svg +3 -43
  219. package/src/svg/mega-menu-icons-y-scatter.svg +12 -72
  220. package/src/svg/new-panel-icon.svg +4 -0
  221. package/src/svg/number-type.svg +3 -3
  222. package/src/svg/radio-hover.svg +3 -3
  223. package/src/svg/radio-off.svg +3 -3
  224. package/src/svg/radio-on.svg +3 -3
  225. package/src/svg/status_ok.svg +3 -26
  226. package/src/svg/status_pending.svg +3 -0
  227. package/src/svg/string-type.svg +4 -8
  228. package/src/svg/theme-icon.svg +5 -5
  229. package/src/themes/blueprint.css +0 -57
  230. package/src/themes/botanical.css +0 -36
  231. package/src/themes/defaults.css +1 -24
  232. package/src/themes/dracula.css +0 -58
  233. package/src/themes/eggplant.css +0 -58
  234. package/src/themes/gruvbox-dark.css +0 -65
  235. package/src/themes/gruvbox.css +1 -39
  236. package/src/themes/icons.css +2 -8
  237. package/src/themes/intl/ar.css +198 -0
  238. package/src/themes/intl/de.css +63 -40
  239. package/src/themes/intl/es.css +58 -35
  240. package/src/themes/intl/fr.css +57 -34
  241. package/src/themes/intl/ja.css +59 -36
  242. package/src/themes/intl/pt.css +54 -31
  243. package/src/themes/intl/zh.css +65 -42
  244. package/src/themes/intl.css +34 -8
  245. package/src/themes/ledger.css +1 -59
  246. package/src/themes/monokai.css +0 -51
  247. package/src/themes/nord.css +0 -55
  248. package/src/themes/phosphor.css +0 -48
  249. package/src/themes/pro-dark.css +0 -37
  250. package/src/themes/pro.css +3 -23
  251. package/src/themes/solarized-dark.css +0 -31
  252. package/src/themes/solarized.css +1 -24
  253. package/src/themes/vaporwave.css +0 -44
  254. package/src/themes/velvet.css +0 -60
  255. package/src/ts/extensions.ts +0 -13
  256. package/src/ts/perspective-viewer.ts +2 -0
  257. package/src/ts/plugin.ts +9 -0
  258. package/src/ts/ts-rs/AddPanelOptions.ts +10 -0
  259. package/src/ts/ts-rs/{DatetimeColorMode.ts → GetViewMode.ts} +4 -1
  260. package/src/ts/ts-rs/GetViewOptions.ts +7 -0
  261. package/src/ts/ts-rs/RestoreOptions.ts +7 -1
  262. package/src/ts/ts-rs/RestoreWorkspaceOptions.ts +10 -0
  263. package/src/ts/ts-rs/ViewOnUpdateResp.ts +1 -1
  264. package/src/ts/ts-rs/WorkspaceConfigUpdate.ts +31 -20
  265. package/dist/esm/ts-rs/DatetimeColorMode.d.ts +0 -1
  266. package/dist/esm/ts-rs/FormatMode.d.ts +0 -1
  267. package/dist/esm/ts-rs/StringColorMode.d.ts +0 -1
  268. package/src/css/plugin-settings-panel.css +0 -171
  269. package/src/rust/components/modal.rs +0 -177
  270. package/src/rust/components/string_column_style.rs +0 -121
  271. package/src/rust/config/string_column_style.rs +0 -135
  272. package/src/rust/custom_elements/copy_dropdown.rs +0 -219
  273. package/src/rust/custom_elements/export_dropdown.rs +0 -216
  274. package/src/rust/custom_elements/modal.rs +0 -299
  275. package/src/ts/ts-rs/FormatMode.ts +0 -3
  276. package/src/ts/ts-rs/StringColorMode.ts +0 -3
  277. /package/dist/wasm/snippets/{perspective-viewer-87bd21b215d0631a → perspective-viewer-ea71a3990cad35d7}/inline0.js +0 -0
  278. /package/dist/wasm/snippets/{perspective-viewer-87bd21b215d0631a → perspective-viewer-ea71a3990cad35d7}/inline1.js +0 -0
  279. /package/dist/wasm/snippets/{perspective-viewer-87bd21b215d0631a → perspective-viewer-ea71a3990cad35d7}/inline2.js +0 -0
  280. /package/dist/wasm/snippets/{perspective-viewer-87bd21b215d0631a → perspective-viewer-ea71a3990cad35d7}/inline3.js +0 -0
  281. /package/dist/wasm/snippets/{perspective-viewer-87bd21b215d0631a → perspective-viewer-ea71a3990cad35d7}/inline4.js +0 -0
  282. /package/dist/wasm/snippets/{perspective-viewer-87bd21b215d0631a → perspective-viewer-ea71a3990cad35d7}/inline5.js +0 -0
  283. /package/src/css/{containers → ui/containers}/scroll-panel.css +0 -0
  284. /package/src/css/{containers → ui/containers}/split-panel.css +0 -0
  285. /package/src/css/{dom → ui/dom}/checkbox.css +0 -0
  286. /package/src/css/{dom → ui/dom}/scrollbar.css +0 -0
  287. /package/src/css/{dom → ui/dom}/select.css +0 -0
  288. /package/src/css/{form → ui/form}/mirrored-textarea.css +0 -0
  289. /package/src/rust/components/{form → code_editor}/highlight.rs +0 -0
  290. /package/src/rust/{components → ui}/containers/sidebar_close_button.rs +0 -0
  291. /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
- // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
2
-
3
- export type FormatMode = "none" | "link" | "bold" | "italics";
@@ -1,3 +0,0 @@
1
- // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
2
-
3
- export type StringColorMode = "none" | "foreground" | "background" | "series";
File without changes
File without changes
File without changes
File without changes