@deck.gl-community/widgets 9.2.8 → 9.3.0-beta.2

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 (295) hide show
  1. package/README.md +9 -1
  2. package/dist/graph-widgets/_deprecate/long-press-button.d.ts.map +1 -0
  3. package/dist/graph-widgets/_deprecate/long-press-button.js.map +1 -0
  4. package/dist/graph-widgets/_deprecate/view-control-widget.d.ts.map +1 -0
  5. package/dist/graph-widgets/_deprecate/view-control-widget.js.map +1 -0
  6. package/dist/{widgets → graph-widgets}/long-press-button.d.ts +1 -0
  7. package/dist/graph-widgets/long-press-button.d.ts.map +1 -0
  8. package/dist/{widgets → graph-widgets}/long-press-button.js +1 -0
  9. package/dist/graph-widgets/long-press-button.js.map +1 -0
  10. package/dist/graph-widgets/long-press-controller.d.ts.map +1 -0
  11. package/dist/graph-widgets/long-press-controller.js.map +1 -0
  12. package/dist/{widgets → graph-widgets}/pan-widget.d.ts +3 -2
  13. package/dist/graph-widgets/pan-widget.d.ts.map +1 -0
  14. package/dist/{widgets → graph-widgets}/pan-widget.js +19 -15
  15. package/dist/graph-widgets/pan-widget.js.map +1 -0
  16. package/dist/{widgets → graph-widgets}/zoom-range-widget.d.ts +3 -3
  17. package/dist/graph-widgets/zoom-range-widget.d.ts.map +1 -0
  18. package/dist/{widgets → graph-widgets}/zoom-range-widget.js +24 -23
  19. package/dist/graph-widgets/zoom-range-widget.js.map +1 -0
  20. package/dist/html-overlay-widgets/html-cluster-widget.d.ts.map +1 -0
  21. package/dist/html-overlay-widgets/html-cluster-widget.js.map +1 -0
  22. package/dist/{widgets → html-overlay-widgets}/html-overlay-item.d.ts +1 -0
  23. package/dist/html-overlay-widgets/html-overlay-item.d.ts.map +1 -0
  24. package/dist/html-overlay-widgets/html-overlay-item.js.map +1 -0
  25. package/dist/{widgets → html-overlay-widgets}/html-overlay-widget.d.ts +1 -1
  26. package/dist/html-overlay-widgets/html-overlay-widget.d.ts.map +1 -0
  27. package/dist/{widgets → html-overlay-widgets}/html-overlay-widget.js +2 -2
  28. package/dist/html-overlay-widgets/html-overlay-widget.js.map +1 -0
  29. package/dist/{widgets → html-overlay-widgets}/html-tooltip-widget.d.ts +1 -0
  30. package/dist/html-overlay-widgets/html-tooltip-widget.d.ts.map +1 -0
  31. package/dist/html-overlay-widgets/html-tooltip-widget.js.map +1 -0
  32. package/dist/index.cjs +5102 -82
  33. package/dist/index.cjs.map +4 -4
  34. package/dist/index.d.ts +33 -12
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +27 -6
  37. package/dist/index.js.map +1 -1
  38. package/dist/keyboard-shortcuts/keyboard-shortcuts-manager.d.ts +18 -0
  39. package/dist/keyboard-shortcuts/keyboard-shortcuts-manager.d.ts.map +1 -0
  40. package/dist/keyboard-shortcuts/keyboard-shortcuts-manager.js +47 -0
  41. package/dist/keyboard-shortcuts/keyboard-shortcuts-manager.js.map +1 -0
  42. package/dist/keyboard-shortcuts/keyboard-shortcuts.d.ts +22 -0
  43. package/dist/keyboard-shortcuts/keyboard-shortcuts.d.ts.map +1 -0
  44. package/dist/keyboard-shortcuts/keyboard-shortcuts.js +83 -0
  45. package/dist/keyboard-shortcuts/keyboard-shortcuts.js.map +1 -0
  46. package/dist/lib/settings/settings.d.ts +17 -0
  47. package/dist/lib/settings/settings.d.ts.map +1 -0
  48. package/dist/lib/settings/settings.js +140 -0
  49. package/dist/lib/settings/settings.js.map +1 -0
  50. package/dist/ready-to-upstream-widgets/reset-view-widget.d.ts +21 -0
  51. package/dist/ready-to-upstream-widgets/reset-view-widget.d.ts.map +1 -0
  52. package/dist/ready-to-upstream-widgets/reset-view-widget.js +29 -0
  53. package/dist/ready-to-upstream-widgets/reset-view-widget.js.map +1 -0
  54. package/dist/widget-components/icon-button.d.ts +12 -0
  55. package/dist/widget-components/icon-button.d.ts.map +1 -0
  56. package/dist/widget-components/icon-button.js +12 -0
  57. package/dist/widget-components/icon-button.js.map +1 -0
  58. package/dist/widget-components/select-widget-component.d.ts +15 -0
  59. package/dist/widget-components/select-widget-component.d.ts.map +1 -0
  60. package/dist/widget-components/select-widget-component.js +229 -0
  61. package/dist/widget-components/select-widget-component.js.map +1 -0
  62. package/dist/widget-panels/box-widget.d.ts +43 -0
  63. package/dist/widget-panels/box-widget.d.ts.map +1 -0
  64. package/dist/widget-panels/box-widget.js +191 -0
  65. package/dist/widget-panels/box-widget.js.map +1 -0
  66. package/dist/widget-panels/box-widget.test.d.ts +2 -0
  67. package/dist/widget-panels/box-widget.test.d.ts.map +1 -0
  68. package/dist/widget-panels/box-widget.test.js +41 -0
  69. package/dist/widget-panels/box-widget.test.js.map +1 -0
  70. package/dist/widget-panels/full-screen-panel-widget.d.ts +33 -0
  71. package/dist/widget-panels/full-screen-panel-widget.d.ts.map +1 -0
  72. package/dist/widget-panels/full-screen-panel-widget.js +153 -0
  73. package/dist/widget-panels/full-screen-panel-widget.js.map +1 -0
  74. package/dist/widget-panels/full-screen-panel-widget.test.d.ts +2 -0
  75. package/dist/widget-panels/full-screen-panel-widget.test.d.ts.map +1 -0
  76. package/dist/widget-panels/full-screen-panel-widget.test.js +40 -0
  77. package/dist/widget-panels/full-screen-panel-widget.test.js.map +1 -0
  78. package/dist/widget-panels/heap-memory-widget.d.ts +26 -0
  79. package/dist/widget-panels/heap-memory-widget.d.ts.map +1 -0
  80. package/dist/widget-panels/heap-memory-widget.js +156 -0
  81. package/dist/widget-panels/heap-memory-widget.js.map +1 -0
  82. package/dist/widget-panels/keyboard-shortcuts-widget.d.ts +46 -0
  83. package/dist/widget-panels/keyboard-shortcuts-widget.d.ts.map +1 -0
  84. package/dist/widget-panels/keyboard-shortcuts-widget.js +301 -0
  85. package/dist/widget-panels/keyboard-shortcuts-widget.js.map +1 -0
  86. package/dist/widget-panels/modal-widget.d.ts +62 -0
  87. package/dist/widget-panels/modal-widget.d.ts.map +1 -0
  88. package/dist/widget-panels/modal-widget.js +309 -0
  89. package/dist/widget-panels/modal-widget.js.map +1 -0
  90. package/dist/widget-panels/modal-widget.test.d.ts +2 -0
  91. package/dist/widget-panels/modal-widget.test.d.ts.map +1 -0
  92. package/dist/widget-panels/modal-widget.test.js +103 -0
  93. package/dist/widget-panels/modal-widget.test.js.map +1 -0
  94. package/dist/widget-panels/omni-box-widget.d.ts +59 -0
  95. package/dist/widget-panels/omni-box-widget.d.ts.map +1 -0
  96. package/dist/widget-panels/omni-box-widget.js +562 -0
  97. package/dist/widget-panels/omni-box-widget.js.map +1 -0
  98. package/dist/widget-panels/omni-box-widget.test.d.ts +2 -0
  99. package/dist/widget-panels/omni-box-widget.test.d.ts.map +1 -0
  100. package/dist/widget-panels/omni-box-widget.test.js +49 -0
  101. package/dist/widget-panels/omni-box-widget.test.js.map +1 -0
  102. package/dist/widget-panels/reset-view-widget.d.ts +20 -0
  103. package/dist/widget-panels/reset-view-widget.d.ts.map +1 -0
  104. package/dist/widget-panels/reset-view-widget.js +28 -0
  105. package/dist/widget-panels/reset-view-widget.js.map +1 -0
  106. package/dist/widget-panels/settings-panel.d.ts +49 -0
  107. package/dist/widget-panels/settings-panel.d.ts.map +1 -0
  108. package/dist/widget-panels/settings-panel.js +263 -0
  109. package/dist/widget-panels/settings-panel.js.map +1 -0
  110. package/dist/widget-panels/settings-panel.test.d.ts +2 -0
  111. package/dist/widget-panels/settings-panel.test.d.ts.map +1 -0
  112. package/dist/widget-panels/settings-panel.test.js +217 -0
  113. package/dist/widget-panels/settings-panel.test.js.map +1 -0
  114. package/dist/widget-panels/sidebar-widget.d.ts +65 -0
  115. package/dist/widget-panels/sidebar-widget.d.ts.map +1 -0
  116. package/dist/widget-panels/sidebar-widget.js +339 -0
  117. package/dist/widget-panels/sidebar-widget.js.map +1 -0
  118. package/dist/widget-panels/sidebar-widget.test.d.ts +2 -0
  119. package/dist/widget-panels/sidebar-widget.test.d.ts.map +1 -0
  120. package/dist/widget-panels/sidebar-widget.test.js +175 -0
  121. package/dist/widget-panels/sidebar-widget.test.js.map +1 -0
  122. package/dist/widget-panels/stats-panel.d.ts +34 -0
  123. package/dist/widget-panels/stats-panel.d.ts.map +1 -0
  124. package/dist/widget-panels/stats-panel.js +61 -0
  125. package/dist/widget-panels/stats-panel.js.map +1 -0
  126. package/dist/widget-panels/stats-panel.test.d.ts +2 -0
  127. package/dist/widget-panels/stats-panel.test.d.ts.map +1 -0
  128. package/dist/widget-panels/stats-panel.test.js +36 -0
  129. package/dist/widget-panels/stats-panel.test.js.map +1 -0
  130. package/dist/widget-panels/text-editor-panel-monaco-runtime.d.ts +17 -0
  131. package/dist/widget-panels/text-editor-panel-monaco-runtime.d.ts.map +1 -0
  132. package/dist/widget-panels/text-editor-panel-monaco-runtime.js +69 -0
  133. package/dist/widget-panels/text-editor-panel-monaco-runtime.js.map +1 -0
  134. package/dist/widget-panels/text-editor-panel.d.ts +42 -0
  135. package/dist/widget-panels/text-editor-panel.d.ts.map +1 -0
  136. package/dist/widget-panels/text-editor-panel.js +249 -0
  137. package/dist/widget-panels/text-editor-panel.js.map +1 -0
  138. package/dist/widget-panels/text-editor-panel.test.d.ts +2 -0
  139. package/dist/widget-panels/text-editor-panel.test.d.ts.map +1 -0
  140. package/dist/widget-panels/text-editor-panel.test.js +393 -0
  141. package/dist/widget-panels/text-editor-panel.test.js.map +1 -0
  142. package/dist/widget-panels/time-measure-widget.d.ts +49 -0
  143. package/dist/widget-panels/time-measure-widget.d.ts.map +1 -0
  144. package/dist/widget-panels/time-measure-widget.js +351 -0
  145. package/dist/widget-panels/time-measure-widget.js.map +1 -0
  146. package/dist/widget-panels/toast-manager.d.ts +24 -0
  147. package/dist/widget-panels/toast-manager.d.ts.map +1 -0
  148. package/dist/widget-panels/toast-manager.js +96 -0
  149. package/dist/widget-panels/toast-manager.js.map +1 -0
  150. package/dist/widget-panels/toast-manager.test.d.ts +2 -0
  151. package/dist/widget-panels/toast-manager.test.d.ts.map +1 -0
  152. package/dist/widget-panels/toast-manager.test.js +75 -0
  153. package/dist/widget-panels/toast-manager.test.js.map +1 -0
  154. package/dist/widget-panels/toast-widget.d.ts +20 -0
  155. package/dist/widget-panels/toast-widget.d.ts.map +1 -0
  156. package/dist/widget-panels/toast-widget.js +207 -0
  157. package/dist/widget-panels/toast-widget.js.map +1 -0
  158. package/dist/widget-panels/toast-widget.test.d.ts +2 -0
  159. package/dist/widget-panels/toast-widget.test.d.ts.map +1 -0
  160. package/dist/widget-panels/toast-widget.test.js +81 -0
  161. package/dist/widget-panels/toast-widget.test.js.map +1 -0
  162. package/dist/widget-panels/toggle-widget.d.ts +34 -0
  163. package/dist/widget-panels/toggle-widget.d.ts.map +1 -0
  164. package/dist/widget-panels/toggle-widget.js +46 -0
  165. package/dist/widget-panels/toggle-widget.js.map +1 -0
  166. package/dist/widget-panels/toolbar-widget.d.ts +53 -0
  167. package/dist/widget-panels/toolbar-widget.d.ts.map +1 -0
  168. package/dist/widget-panels/toolbar-widget.js +160 -0
  169. package/dist/widget-panels/toolbar-widget.js.map +1 -0
  170. package/dist/widget-panels/toolbar-widget.test.d.ts +2 -0
  171. package/dist/widget-panels/toolbar-widget.test.d.ts.map +1 -0
  172. package/dist/widget-panels/toolbar-widget.test.js +105 -0
  173. package/dist/widget-panels/toolbar-widget.test.js.map +1 -0
  174. package/dist/widget-panels/widget-containers.d.ts +275 -0
  175. package/dist/widget-panels/widget-containers.d.ts.map +1 -0
  176. package/dist/widget-panels/widget-containers.js +761 -0
  177. package/dist/widget-panels/widget-containers.js.map +1 -0
  178. package/dist/widget-panels/widget-containers.test.d.ts +2 -0
  179. package/dist/widget-panels/widget-containers.test.d.ts.map +1 -0
  180. package/dist/widget-panels/widget-containers.test.js +337 -0
  181. package/dist/widget-panels/widget-containers.test.js.map +1 -0
  182. package/dist/widget-panels/y-zoom-widget.d.ts +66 -0
  183. package/dist/widget-panels/y-zoom-widget.d.ts.map +1 -0
  184. package/dist/widget-panels/y-zoom-widget.js +264 -0
  185. package/dist/widget-panels/y-zoom-widget.js.map +1 -0
  186. package/dist/widget-panels/y-zoom-widget.test.d.ts +2 -0
  187. package/dist/widget-panels/y-zoom-widget.test.d.ts.map +1 -0
  188. package/dist/widget-panels/y-zoom-widget.test.js +71 -0
  189. package/dist/widget-panels/y-zoom-widget.test.js.map +1 -0
  190. package/dist/widgets/heap-memory-widget.d.ts +26 -0
  191. package/dist/widgets/heap-memory-widget.d.ts.map +1 -0
  192. package/dist/widgets/heap-memory-widget.js +158 -0
  193. package/dist/widgets/heap-memory-widget.js.map +1 -0
  194. package/dist/widgets/keyboard-shortcuts-widget.d.ts +28 -0
  195. package/dist/widgets/keyboard-shortcuts-widget.d.ts.map +1 -0
  196. package/dist/widgets/keyboard-shortcuts-widget.js +125 -0
  197. package/dist/widgets/keyboard-shortcuts-widget.js.map +1 -0
  198. package/dist/widgets/omni-box-widget.d.ts +59 -0
  199. package/dist/widgets/omni-box-widget.d.ts.map +1 -0
  200. package/dist/widgets/omni-box-widget.js +493 -0
  201. package/dist/widgets/omni-box-widget.js.map +1 -0
  202. package/dist/widgets/settings-widget.d.ts +64 -0
  203. package/dist/widgets/settings-widget.d.ts.map +1 -0
  204. package/dist/widgets/settings-widget.js +148 -0
  205. package/dist/widgets/settings-widget.js.map +1 -0
  206. package/dist/widgets/view-manager-utils.d.ts +1 -1
  207. package/dist/widgets/view-manager-utils.d.ts.map +1 -1
  208. package/dist/widgets/view-manager-utils.js.map +1 -1
  209. package/package.json +4 -3
  210. package/src/{widgets → graph-widgets}/long-press-button.tsx +1 -0
  211. package/src/{widgets → graph-widgets}/pan-widget.tsx +30 -23
  212. package/src/{widgets → graph-widgets}/zoom-range-widget.tsx +36 -34
  213. package/src/{widgets → html-overlay-widgets}/html-overlay-item.tsx +1 -0
  214. package/src/{widgets → html-overlay-widgets}/html-overlay-widget.tsx +2 -2
  215. package/src/{widgets → html-overlay-widgets}/html-tooltip-widget.tsx +1 -0
  216. package/src/index.ts +109 -12
  217. package/src/keyboard-shortcuts/keyboard-shortcuts-manager.ts +58 -0
  218. package/src/keyboard-shortcuts/keyboard-shortcuts.ts +113 -0
  219. package/src/keyboard-shortcuts/keyboard-shortcuts.ts.disabled +107 -0
  220. package/src/lib/settings/settings.ts +203 -0
  221. package/src/ready-to-upstream-widgets/reset-view-widget.tsx +57 -0
  222. package/src/widget-components/icon-button.tsx +38 -0
  223. package/src/widget-components/select-widget-component.tsx +354 -0
  224. package/src/widget-panels/box-widget.test.tsx +50 -0
  225. package/src/widget-panels/box-widget.tsx +284 -0
  226. package/src/widget-panels/full-screen-panel-widget.test.tsx +49 -0
  227. package/src/widget-panels/full-screen-panel-widget.tsx +223 -0
  228. package/src/widget-panels/heap-memory-widget.tsx +221 -0
  229. package/src/widget-panels/keyboard-shortcuts-widget.tsx +511 -0
  230. package/src/widget-panels/modal-widget.test.tsx +124 -0
  231. package/src/widget-panels/modal-widget.tsx +464 -0
  232. package/src/widget-panels/omni-box-widget.test.tsx +59 -0
  233. package/src/widget-panels/omni-box-widget.tsx +849 -0
  234. package/src/widget-panels/reset-view-widget.tsx +56 -0
  235. package/src/widget-panels/settings-panel.test.tsx +286 -0
  236. package/src/widget-panels/settings-panel.tsx +619 -0
  237. package/src/widget-panels/sidebar-widget.test.tsx +215 -0
  238. package/src/widget-panels/sidebar-widget.tsx +525 -0
  239. package/src/widget-panels/stats-panel.test.tsx +41 -0
  240. package/src/widget-panels/stats-panel.tsx +108 -0
  241. package/src/widget-panels/text-editor-panel-monaco-runtime.ts +97 -0
  242. package/src/widget-panels/text-editor-panel.test.tsx +618 -0
  243. package/src/widget-panels/text-editor-panel.tsx +375 -0
  244. package/src/widget-panels/time-measure-widget.tsx +445 -0
  245. package/src/widget-panels/toast-manager.test.ts +98 -0
  246. package/src/widget-panels/toast-manager.ts +134 -0
  247. package/src/widget-panels/toast-widget.test.tsx +105 -0
  248. package/src/widget-panels/toast-widget.tsx +293 -0
  249. package/src/widget-panels/toggle-widget.tsx +93 -0
  250. package/src/widget-panels/toolbar-widget.test.ts +129 -0
  251. package/src/widget-panels/toolbar-widget.tsx +293 -0
  252. package/src/widget-panels/widget-containers.test.tsx +453 -0
  253. package/src/widget-panels/widget-containers.tsx +1330 -0
  254. package/src/widget-panels/worker-modules.d.ts +7 -0
  255. package/src/widget-panels/y-zoom-widget.test.tsx +101 -0
  256. package/src/widget-panels/y-zoom-widget.tsx +376 -0
  257. package/src/widgets/heap-memory-widget.tsx +223 -0
  258. package/src/widgets/keyboard-shortcuts-widget.tsx +245 -0
  259. package/src/widgets/omni-box-widget.tsx +768 -0
  260. package/src/widgets/settings-widget.tsx +277 -0
  261. package/src/widgets/view-manager-utils.ts +1 -1
  262. package/dist/_deprecate/long-press-button.d.ts.map +0 -1
  263. package/dist/_deprecate/long-press-button.js.map +0 -1
  264. package/dist/_deprecate/view-control-widget.d.ts.map +0 -1
  265. package/dist/_deprecate/view-control-widget.js.map +0 -1
  266. package/dist/widgets/html-cluster-widget.d.ts.map +0 -1
  267. package/dist/widgets/html-cluster-widget.js.map +0 -1
  268. package/dist/widgets/html-overlay-item.d.ts.map +0 -1
  269. package/dist/widgets/html-overlay-item.js.map +0 -1
  270. package/dist/widgets/html-overlay-widget.d.ts.map +0 -1
  271. package/dist/widgets/html-overlay-widget.js.map +0 -1
  272. package/dist/widgets/html-tooltip-widget.d.ts.map +0 -1
  273. package/dist/widgets/html-tooltip-widget.js.map +0 -1
  274. package/dist/widgets/long-press-button.d.ts.map +0 -1
  275. package/dist/widgets/long-press-button.js.map +0 -1
  276. package/dist/widgets/long-press-controller.d.ts.map +0 -1
  277. package/dist/widgets/long-press-controller.js.map +0 -1
  278. package/dist/widgets/pan-widget.d.ts.map +0 -1
  279. package/dist/widgets/pan-widget.js.map +0 -1
  280. package/dist/widgets/zoom-range-widget.d.ts.map +0 -1
  281. package/dist/widgets/zoom-range-widget.js.map +0 -1
  282. /package/dist/{_deprecate → graph-widgets/_deprecate}/long-press-button.d.ts +0 -0
  283. /package/dist/{_deprecate → graph-widgets/_deprecate}/long-press-button.js +0 -0
  284. /package/dist/{_deprecate → graph-widgets/_deprecate}/view-control-widget.d.ts +0 -0
  285. /package/dist/{_deprecate → graph-widgets/_deprecate}/view-control-widget.js +0 -0
  286. /package/dist/{widgets → graph-widgets}/long-press-controller.d.ts +0 -0
  287. /package/dist/{widgets → graph-widgets}/long-press-controller.js +0 -0
  288. /package/dist/{widgets → html-overlay-widgets}/html-cluster-widget.d.ts +0 -0
  289. /package/dist/{widgets → html-overlay-widgets}/html-cluster-widget.js +0 -0
  290. /package/dist/{widgets → html-overlay-widgets}/html-overlay-item.js +0 -0
  291. /package/dist/{widgets → html-overlay-widgets}/html-tooltip-widget.js +0 -0
  292. /package/src/{_deprecate → graph-widgets/_deprecate}/long-press-button.tsx +0 -0
  293. /package/src/{_deprecate → graph-widgets/_deprecate}/view-control-widget.tsx +0 -0
  294. /package/src/{widgets → graph-widgets}/long-press-controller.ts +0 -0
  295. /package/src/{widgets → html-overlay-widgets}/html-cluster-widget.ts +0 -0
@@ -0,0 +1,56 @@
1
+ /** @jsxImportSource preact */
2
+ import {Widget} from '@deck.gl/core';
3
+ import {render} from 'preact';
4
+
5
+ import type {WidgetPlacement, WidgetProps} from '@deck.gl/core';
6
+
7
+ export type ResetViewWidgetProps = WidgetProps & {
8
+ /** Widget positioning within the view. Default 'top-left'. */
9
+ placement?: WidgetPlacement;
10
+ /** Tooltip message */
11
+ label?: string;
12
+ /** Callback invoked when the widget button is clicked */
13
+ onResetView?: () => void;
14
+ };
15
+
16
+ export class ResetViewWidget extends Widget<ResetViewWidgetProps> {
17
+ static defaultProps: Required<ResetViewWidgetProps> = {
18
+ ...Widget.defaultProps,
19
+ id: 'reset-view',
20
+ placement: 'top-left',
21
+ label: 'Resize to fit',
22
+ onResetView: undefined!
23
+ };
24
+
25
+ className = 'deck-widget-reset-view';
26
+ placement: WidgetPlacement = 'top-left';
27
+
28
+ constructor(props: ResetViewWidgetProps = {}) {
29
+ super(props);
30
+ this.setProps(this.props);
31
+ }
32
+
33
+ setProps(props: Partial<ResetViewWidgetProps>): void {
34
+ this.placement = props.placement ?? this.placement;
35
+ super.setProps(props);
36
+ }
37
+
38
+ onRenderHTML(rootElement: HTMLElement): void {
39
+ const label = this.props.label ?? 'Resize to fit';
40
+
41
+ render(
42
+ <div className="deck-widget-button">
43
+ <button
44
+ className="deck-widget-icon-button deck-widget-reset-focus"
45
+ type="button"
46
+ title={label}
47
+ aria-label={label}
48
+ onClick={() => this.props.onResetView?.()}
49
+ >
50
+ <div className="deck-widget-icon" />
51
+ </button>
52
+ </div>,
53
+ rootElement
54
+ );
55
+ }
56
+ }
@@ -0,0 +1,286 @@
1
+ /** @jsxImportSource preact */
2
+ import {render} from 'preact';
3
+ import {afterEach, describe, expect, it, vi} from 'vitest';
4
+
5
+ import {SettingsPanel} from './settings-panel';
6
+ import {AccordeonPanel, TabbedPanel} from './widget-containers';
7
+
8
+ import type {SettingsSchema, SettingsState} from '../lib/settings/settings';
9
+
10
+ const TEST_SCHEMA: SettingsSchema = {
11
+ title: 'Test settings',
12
+ sections: [
13
+ {
14
+ id: 'visibility',
15
+ name: 'Visibility',
16
+ settings: [
17
+ {
18
+ name: 'flags.enabled',
19
+ label: 'Enabled',
20
+ type: 'boolean',
21
+ description: 'Enable rendering for this layer.'
22
+ },
23
+ {
24
+ name: 'render.opacity',
25
+ label: 'Opacity',
26
+ type: 'number',
27
+ min: 0,
28
+ max: 1,
29
+ step: 0.1,
30
+ description: 'Adjust alpha for rendered paths.'
31
+ }
32
+ ]
33
+ },
34
+ {
35
+ id: 'mode',
36
+ name: 'Mode',
37
+ settings: [
38
+ {
39
+ name: 'mode',
40
+ label: 'Mode',
41
+ type: 'select',
42
+ options: ['all', 'critical-path', 'selected-only'],
43
+ description: 'Control which traces remain visible.'
44
+ }
45
+ ]
46
+ }
47
+ ]
48
+ };
49
+
50
+ const INITIAL_SETTINGS: SettingsState = {
51
+ flags: {enabled: true},
52
+ render: {opacity: 0.4},
53
+ mode: 'all'
54
+ };
55
+
56
+ function renderSettingsPanel(options?: {
57
+ settings?: SettingsState;
58
+ onSettingsChange?: (settings: SettingsState) => void;
59
+ }) {
60
+ const root = document.createElement('div');
61
+ document.body.appendChild(root);
62
+
63
+ const panel = new SettingsPanel({
64
+ label: 'Visualization settings',
65
+ schema: TEST_SCHEMA,
66
+ settings: options?.settings ?? INITIAL_SETTINGS,
67
+ onSettingsChange: options?.onSettingsChange
68
+ });
69
+
70
+ render(panel.content, root);
71
+ const cleanup = () => {
72
+ render(null, root);
73
+ root.remove();
74
+ };
75
+
76
+ return {
77
+ root,
78
+ cleanup
79
+ };
80
+ }
81
+
82
+ function getRequiredInput(root: ParentNode, selector: string): HTMLInputElement {
83
+ const input = root.querySelector<HTMLInputElement>(selector);
84
+ if (!input) {
85
+ throw new Error(`Expected input matching selector: ${selector}`);
86
+ }
87
+ return input;
88
+ }
89
+
90
+ function getRequiredButton(root: ParentNode, selector: string): HTMLButtonElement {
91
+ const button = root.querySelector<HTMLButtonElement>(selector);
92
+ if (!button) {
93
+ throw new Error(`Expected button matching selector: ${selector}`);
94
+ }
95
+ return button;
96
+ }
97
+
98
+ afterEach(() => {
99
+ document.body.innerHTML = '';
100
+ });
101
+
102
+ describe('SettingsPanel', () => {
103
+ it('creates section panels with stable ids and preserves section order', () => {
104
+ const panels = SettingsPanel.createSectionPanels({
105
+ schema: TEST_SCHEMA,
106
+ settings: INITIAL_SETTINGS
107
+ });
108
+
109
+ expect(Object.keys(panels)).toEqual(['visibility', 'mode']);
110
+ expect(panels.visibility?.title).toBe('Visibility');
111
+ expect(panels.mode?.title).toBe('Mode');
112
+ });
113
+
114
+ // eslint-disable-next-line max-statements
115
+ it('emits updated settings for nested boolean, clamped numeric, and select values', async () => {
116
+ const handleSettingsChange = vi.fn<(settings: SettingsState) => void>();
117
+ const {root, cleanup} = renderSettingsPanel({onSettingsChange: handleSettingsChange});
118
+
119
+ const sectionToggles = root.querySelectorAll('button[aria-expanded]');
120
+ const visibilityToggle = sectionToggles[0] as HTMLButtonElement;
121
+ const modeToggle = sectionToggles[1] as HTMLButtonElement;
122
+
123
+ visibilityToggle.click();
124
+ await Promise.resolve();
125
+
126
+ const checkbox = getRequiredInput(root, 'input[type="checkbox"]');
127
+ expect(checkbox.checked).toBe(true);
128
+ checkbox.checked = false;
129
+ checkbox.dispatchEvent(new Event('input', {bubbles: true}));
130
+ await Promise.resolve();
131
+
132
+ expect(handleSettingsChange).toHaveBeenCalledWith(
133
+ expect.objectContaining({
134
+ flags: expect.objectContaining({enabled: false})
135
+ })
136
+ );
137
+
138
+ const numberInput = getRequiredInput(root, 'input[type="number"]');
139
+ numberInput.value = '2';
140
+ numberInput.dispatchEvent(new Event('input', {bubbles: true}));
141
+ await Promise.resolve();
142
+
143
+ expect(handleSettingsChange).toHaveBeenLastCalledWith(
144
+ expect.objectContaining({
145
+ render: expect.objectContaining({opacity: 1})
146
+ })
147
+ );
148
+
149
+ modeToggle.click();
150
+ await Promise.resolve();
151
+
152
+ expect(root.querySelector('select')).toBeNull();
153
+
154
+ const selectButton = getRequiredButton(root, '#settings-widget-input-mode');
155
+ selectButton.click();
156
+ await Promise.resolve();
157
+
158
+ const option = Array.from(
159
+ document.body.querySelectorAll<HTMLButtonElement>('[role="option"]')
160
+ ).find((button) => button.textContent?.includes('critical-path'));
161
+ expect(option).toBeTruthy();
162
+ option?.click();
163
+ await Promise.resolve();
164
+
165
+ expect(handleSettingsChange).toHaveBeenLastCalledWith(
166
+ expect.objectContaining({
167
+ mode: 'critical-path'
168
+ })
169
+ );
170
+
171
+ cleanup();
172
+ });
173
+
174
+ it('uses deck widget theme CSS variables for the settings controls', async () => {
175
+ const {root, cleanup} = renderSettingsPanel();
176
+ const sectionToggle = getRequiredButton(root, 'button[aria-expanded]');
177
+ sectionToggle.click();
178
+ await Promise.resolve();
179
+
180
+ const numberInput = getRequiredInput(root, 'input[type="number"]');
181
+ expect(numberInput.getAttribute('style')).toContain('var(--button-backdrop-filter');
182
+
183
+ cleanup();
184
+ });
185
+
186
+ // eslint-disable-next-line max-statements
187
+ it('renders a reusable settings panel for sidebar and modal containers', async () => {
188
+ const handleSettingsChange = vi.fn<(settings: SettingsState) => void>();
189
+ const {root, cleanup} = renderSettingsPanel({onSettingsChange: handleSettingsChange});
190
+
191
+ expect(root.textContent).toContain('Visibility');
192
+ expect(root.textContent).toContain('Mode');
193
+
194
+ const visibilityToggle = root.querySelectorAll('button[aria-expanded]')[0] as HTMLButtonElement;
195
+ visibilityToggle.click();
196
+ await Promise.resolve();
197
+
198
+ const checkbox = getRequiredInput(root, 'input[type="checkbox"]');
199
+ checkbox.checked = false;
200
+ checkbox.dispatchEvent(new Event('input', {bubbles: true}));
201
+ await Promise.resolve();
202
+
203
+ expect(handleSettingsChange).toHaveBeenCalledWith(
204
+ expect.objectContaining({
205
+ flags: expect.objectContaining({enabled: false})
206
+ })
207
+ );
208
+
209
+ cleanup();
210
+ });
211
+
212
+ it('composes section panels into tabs without duplicating section titles in the body', async () => {
213
+ const handleSettingsChange = vi.fn<(settings: SettingsState) => void>();
214
+ const root = document.createElement('div');
215
+ document.body.appendChild(root);
216
+
217
+ const panel = new TabbedPanel({
218
+ id: 'settings-tabs',
219
+ title: 'Settings tabs',
220
+ panels: SettingsPanel.createSectionPanels({
221
+ schema: TEST_SCHEMA,
222
+ settings: INITIAL_SETTINGS,
223
+ onSettingsChange: handleSettingsChange
224
+ })
225
+ });
226
+
227
+ render(panel.content, root);
228
+
229
+ expect(root.textContent?.match(/Visibility/g)).toHaveLength(1);
230
+ expect(root.textContent).toContain('Mode');
231
+
232
+ const checkbox = getRequiredInput(root, 'input[type="checkbox"]');
233
+ checkbox.checked = false;
234
+ checkbox.dispatchEvent(new Event('input', {bubbles: true}));
235
+ await Promise.resolve();
236
+
237
+ expect(handleSettingsChange).toHaveBeenCalledWith(
238
+ expect.objectContaining({
239
+ flags: expect.objectContaining({enabled: false})
240
+ })
241
+ );
242
+
243
+ render(null, root);
244
+ root.remove();
245
+ });
246
+
247
+ it('composes section panels into accordion items without duplicating section titles in the body', async () => {
248
+ const handleSettingsChange = vi.fn<(settings: SettingsState) => void>();
249
+ const root = document.createElement('div');
250
+ document.body.appendChild(root);
251
+
252
+ const panel = new AccordeonPanel({
253
+ id: 'settings-accordion',
254
+ title: 'Settings accordion',
255
+ panels: SettingsPanel.createSectionPanels({
256
+ schema: TEST_SCHEMA,
257
+ settings: INITIAL_SETTINGS,
258
+ onSettingsChange: handleSettingsChange
259
+ })
260
+ });
261
+
262
+ render(panel.content, root);
263
+
264
+ const visibilityButton = Array.from(root.querySelectorAll('button')).find((button) =>
265
+ button.textContent?.includes('Visibility')
266
+ );
267
+ visibilityButton?.dispatchEvent(new Event('pointerdown', {bubbles: true}));
268
+ await Promise.resolve();
269
+
270
+ expect(root.textContent?.match(/Visibility/g)).toHaveLength(1);
271
+
272
+ const checkbox = getRequiredInput(root, 'input[type="checkbox"]');
273
+ checkbox.checked = false;
274
+ checkbox.dispatchEvent(new Event('input', {bubbles: true}));
275
+ await Promise.resolve();
276
+
277
+ expect(handleSettingsChange).toHaveBeenCalledWith(
278
+ expect.objectContaining({
279
+ flags: expect.objectContaining({enabled: false})
280
+ })
281
+ );
282
+
283
+ render(null, root);
284
+ root.remove();
285
+ });
286
+ });