@carto/ps-react-ui 5.0.0-widgets.9 → 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 (1418) hide show
  1. package/dist/actions-BjPfCLG9.js +1024 -0
  2. package/dist/actions-BjPfCLG9.js.map +1 -0
  3. package/dist/actions-CGJD6q0t.js +1318 -0
  4. package/dist/actions-CGJD6q0t.js.map +1 -0
  5. package/dist/category-DGUDabsi.js +829 -0
  6. package/dist/category-DGUDabsi.js.map +1 -0
  7. package/dist/chart-config-B_fdIcD3.js +108 -0
  8. package/dist/chart-config-B_fdIcD3.js.map +1 -0
  9. package/dist/chat.js +1642 -0
  10. package/dist/chat.js.map +1 -0
  11. package/dist/cjs-CBrZjPCj.js +75 -0
  12. package/dist/cjs-CBrZjPCj.js.map +1 -0
  13. package/dist/components-FED-ArwH.js +4053 -0
  14. package/dist/components-FED-ArwH.js.map +1 -0
  15. package/dist/components.js +5 -1351
  16. package/dist/copy-button-TTlZONkX.js +34 -0
  17. package/dist/copy-button-TTlZONkX.js.map +1 -0
  18. package/dist/csv-modifiers-D6HGC24b.js +26 -0
  19. package/dist/csv-modifiers-D6HGC24b.js.map +1 -0
  20. package/dist/download-DdaK3qgC.js +232 -0
  21. package/dist/download-DdaK3qgC.js.map +1 -0
  22. package/dist/echart-BkaV3V5G.js +133 -0
  23. package/dist/echart-BkaV3V5G.js.map +1 -0
  24. package/dist/echart-CRihbmRv.js +249 -0
  25. package/dist/echart-CRihbmRv.js.map +1 -0
  26. package/dist/formatter-wVO81tYk.js +6 -0
  27. package/dist/formatter-wVO81tYk.js.map +1 -0
  28. package/dist/formula-YfZmmuYX.js +190 -0
  29. package/dist/formula-YfZmmuYX.js.map +1 -0
  30. package/dist/formula-noJzQwKo.js +285 -0
  31. package/dist/formula-noJzQwKo.js.map +1 -0
  32. package/dist/hooks-zf5gKZYq.js +22 -0
  33. package/dist/hooks-zf5gKZYq.js.map +1 -0
  34. package/dist/legend/stores.js +2 -0
  35. package/dist/legend.js +2284 -0
  36. package/dist/legend.js.map +1 -0
  37. package/dist/markdown-2dfL6Cmb.js +165 -0
  38. package/dist/markdown-2dfL6Cmb.js.map +1 -0
  39. package/dist/markdown-content-BWUqwx9F.js +8776 -0
  40. package/dist/markdown-content-BWUqwx9F.js.map +1 -0
  41. package/dist/range-BCMAl5xf.js +277 -0
  42. package/dist/range-BCMAl5xf.js.map +1 -0
  43. package/dist/rolldown-runtime-B0aSnxlc.js +20 -0
  44. package/dist/row-CvVGBuy_.js +35 -0
  45. package/dist/row-CvVGBuy_.js.map +1 -0
  46. package/dist/shared-resize-observer-BEiP2rQt.js +157 -0
  47. package/dist/shared-resize-observer-BEiP2rQt.js.map +1 -0
  48. package/dist/smart-tooltip-CwGHCqab.js +34 -0
  49. package/dist/smart-tooltip-CwGHCqab.js.map +1 -0
  50. package/dist/spread-Ccpg9fi0.js +149 -0
  51. package/dist/spread-Ccpg9fi0.js.map +1 -0
  52. package/dist/stores-mad-9yFn.js +369 -0
  53. package/dist/stores-mad-9yFn.js.map +1 -0
  54. package/dist/stores-tiFePP0A.js +243 -0
  55. package/dist/stores-tiFePP0A.js.map +1 -0
  56. package/dist/styles-Y-qGBELO.js +13 -0
  57. package/dist/styles-Y-qGBELO.js.map +1 -0
  58. package/dist/table-Bx9Uj3U0.js +440 -0
  59. package/dist/table-Bx9Uj3U0.js.map +1 -0
  60. package/dist/tooltip-DJUGNZxY.js +23 -0
  61. package/dist/tooltip-DJUGNZxY.js.map +1 -0
  62. package/dist/types/chat/bubbles/chat-agent-message-markdown.d.ts +12 -0
  63. package/dist/types/chat/bubbles/chat-agent-message.d.ts +9 -0
  64. package/dist/types/chat/bubbles/chat-error-message.d.ts +2 -0
  65. package/dist/types/chat/bubbles/chat-suggestion-button.d.ts +2 -0
  66. package/dist/types/chat/bubbles/chat-user-message.d.ts +2 -0
  67. package/dist/types/chat/bubbles/index.d.ts +5 -0
  68. package/dist/types/chat/bubbles/styles.d.ts +88 -0
  69. package/dist/types/chat/const.d.ts +4 -0
  70. package/dist/types/chat/containers/chat-content.d.ts +2 -0
  71. package/dist/types/chat/containers/chat-footer.d.ts +2 -0
  72. package/dist/types/chat/containers/chat-header.d.ts +2 -0
  73. package/dist/types/chat/containers/chat-starter.d.ts +2 -0
  74. package/dist/types/chat/containers/index.d.ts +4 -0
  75. package/dist/types/chat/containers/styles.d.ts +160 -0
  76. package/dist/types/chat/feedback/chat-actions-container.d.ts +3 -0
  77. package/dist/types/chat/feedback/chat-loader.d.ts +2 -0
  78. package/dist/types/chat/feedback/chat-rating-action.d.ts +2 -0
  79. package/dist/types/chat/feedback/chat-thinking.d.ts +2 -0
  80. package/dist/types/chat/feedback/chat-tool-code-area.d.ts +2 -0
  81. package/dist/types/chat/feedback/chat-tool-full-view-dialog.d.ts +2 -0
  82. package/dist/types/chat/feedback/chat-tool-group.d.ts +2 -0
  83. package/dist/types/chat/feedback/chat-tool-trace.d.ts +3 -0
  84. package/dist/types/chat/feedback/get-tool-label.d.ts +2 -0
  85. package/dist/types/chat/feedback/index.d.ts +8 -0
  86. package/dist/types/chat/feedback/styles.d.ts +212 -0
  87. package/dist/types/chat/index.d.ts +21 -0
  88. package/dist/types/chat/types.d.ts +214 -0
  89. package/dist/types/chat/use-typewriter.d.ts +32 -0
  90. package/dist/types/components/basemaps/basemaps.d.ts +21 -1
  91. package/dist/types/components/basemaps/const.d.ts +1 -1
  92. package/dist/types/components/basemaps/group-wrapper.d.ts +1 -1
  93. package/dist/types/components/basemaps/group.d.ts +2 -2
  94. package/dist/types/components/basemaps/header.d.ts +2 -2
  95. package/dist/types/components/common-types.d.ts +49 -0
  96. package/dist/types/components/copy-button/copy-button.d.ts +2 -0
  97. package/dist/types/components/copy-button/types.d.ts +6 -0
  98. package/dist/types/components/geolocation-controls/geolocation-controls.d.ts +12 -1
  99. package/dist/types/components/index.d.ts +37 -20
  100. package/dist/types/components/lasso-tool/chip.d.ts +2 -2
  101. package/dist/types/components/lasso-tool/const.d.ts +2 -2
  102. package/dist/types/components/lasso-tool/edit-confirm-toolbar.d.ts +26 -0
  103. package/dist/types/components/lasso-tool/geometry-toolbar.d.ts +49 -0
  104. package/dist/types/components/lasso-tool/icons.d.ts +22 -5
  105. package/dist/types/components/lasso-tool/lasso-tool-inline.d.ts +36 -3
  106. package/dist/types/components/lasso-tool/lasso-tool.d.ts +34 -9
  107. package/dist/types/components/lasso-tool/layer-filters.d.ts +10 -0
  108. package/dist/types/components/lasso-tool/message.d.ts +7 -0
  109. package/dist/types/components/lasso-tool/options-sections.d.ts +28 -0
  110. package/dist/types/components/lasso-tool/styles.d.ts +24 -2
  111. package/dist/types/components/lasso-tool/toolbar/actions/accept-action.d.ts +13 -0
  112. package/dist/types/components/lasso-tool/toolbar/actions/action-menu.d.ts +28 -0
  113. package/dist/types/components/lasso-tool/toolbar/actions/cancel-action.d.ts +13 -0
  114. package/dist/types/components/lasso-tool/toolbar/actions/color-action.d.ts +44 -0
  115. package/dist/types/components/lasso-tool/toolbar/actions/delete-action.d.ts +11 -0
  116. package/dist/types/components/lasso-tool/toolbar/actions/duplicate-action.d.ts +11 -0
  117. package/dist/types/components/lasso-tool/toolbar/actions/edit-geometry-action.d.ts +13 -0
  118. package/dist/types/components/lasso-tool/toolbar/actions/edit-properties-action.d.ts +60 -0
  119. package/dist/types/components/lasso-tool/toolbar/actions/fill-action.d.ts +26 -0
  120. package/dist/types/components/lasso-tool/toolbar/actions/intersect-action.d.ts +14 -0
  121. package/dist/types/components/lasso-tool/toolbar/actions/label-action.d.ts +69 -0
  122. package/dist/types/components/lasso-tool/toolbar/actions/lock-action.d.ts +17 -0
  123. package/dist/types/components/lasso-tool/toolbar/actions/redo-action.d.ts +14 -0
  124. package/dist/types/components/lasso-tool/toolbar/actions/split-action.d.ts +14 -0
  125. package/dist/types/components/lasso-tool/toolbar/actions/stroke-action.d.ts +27 -0
  126. package/dist/types/components/lasso-tool/toolbar/actions/subtract-action.d.ts +14 -0
  127. package/dist/types/components/lasso-tool/toolbar/actions/toggle-type-action.d.ts +19 -0
  128. package/dist/types/components/lasso-tool/toolbar/actions/undo-action.d.ts +14 -0
  129. package/dist/types/components/lasso-tool/toolbar/actions/union-action.d.ts +14 -0
  130. package/dist/types/components/lasso-tool/toolbar/button.d.ts +24 -0
  131. package/dist/types/components/lasso-tool/toolbar/connected.d.ts +55 -0
  132. package/dist/types/components/lasso-tool/toolbar/context.d.ts +31 -0
  133. package/dist/types/components/lasso-tool/toolbar/index.d.ts +41 -0
  134. package/dist/types/components/lasso-tool/toolbar/styles.d.ts +26 -0
  135. package/dist/types/components/lasso-tool/toolbar/toolbar.d.ts +30 -0
  136. package/dist/types/components/lasso-tool/tools-context.d.ts +12 -0
  137. package/dist/types/components/lasso-tool/types.d.ts +284 -10
  138. package/dist/types/components/lasso-tool/undo-redo.d.ts +25 -0
  139. package/dist/types/components/list-data/list-data-skeleton.d.ts +1 -1
  140. package/dist/types/components/list-data/list-data.d.ts +17 -1
  141. package/dist/types/components/measurement-tools/const.d.ts +2 -2
  142. package/dist/types/components/measurement-tools/icons.d.ts +3 -3
  143. package/dist/types/components/measurement-tools/measurement-tools.d.ts +21 -1
  144. package/dist/types/components/measurement-tools/styles.d.ts +14 -4
  145. package/dist/types/components/measurement-tools/types.d.ts +1 -1
  146. package/dist/types/components/no-data-alert/no-data-alert.d.ts +1 -1
  147. package/dist/types/components/responsive-drawer/responsive-drawer.d.ts +38 -6
  148. package/dist/types/components/smart-tooltip/smart-tooltip.d.ts +18 -1
  149. package/dist/types/components/tooltip/tooltip.d.ts +14 -1
  150. package/dist/types/components/types.d.ts +1 -1
  151. package/dist/types/components/zoom-controls/zoom-controls.d.ts +17 -1
  152. package/dist/types/hooks/index.d.ts +1 -2
  153. package/dist/types/hooks/use-widget-ref.d.ts +10 -6
  154. package/dist/types/legend/components/a11y.d.ts +6 -0
  155. package/dist/types/legend/components/contexts.d.ts +38 -0
  156. package/dist/types/legend/components/icons.d.ts +12 -0
  157. package/dist/types/legend/components/index.d.ts +26 -0
  158. package/dist/types/legend/components/legend-actions/legend-actions.d.ts +25 -0
  159. package/dist/types/legend/components/legend-actions/styles.d.ts +7 -0
  160. package/dist/types/legend/components/legend-category/legend-category-ui.d.ts +13 -0
  161. package/dist/types/legend/components/legend-category/styles.d.ts +52 -0
  162. package/dist/types/legend/components/legend-config-select/legend-config-select.d.ts +14 -0
  163. package/dist/types/legend/components/legend-config-select/styles.d.ts +44 -0
  164. package/dist/types/legend/components/legend-group/legend-group.d.ts +12 -0
  165. package/dist/types/legend/components/legend-group/styles.d.ts +129 -0
  166. package/dist/types/legend/components/legend-group-menu/legend-group-menu-items.d.ts +28 -0
  167. package/dist/types/legend/components/legend-group-menu/legend-group-menu.d.ts +11 -0
  168. package/dist/types/legend/components/legend-icon/legend-icon-ui.d.ts +10 -0
  169. package/dist/types/legend/components/legend-icon/styles.d.ts +52 -0
  170. package/dist/types/legend/components/legend-item/legend-item-ui.d.ts +14 -0
  171. package/dist/types/legend/components/legend-item/legend-item.d.ts +10 -0
  172. package/dist/types/{widgets/root/style.d.ts → legend/components/legend-item/styles.d.ts} +2 -3
  173. package/dist/types/legend/components/legend-opacity/legend-opacity.d.ts +22 -0
  174. package/dist/types/legend/components/legend-opacity/styles.d.ts +28 -0
  175. package/dist/types/legend/components/legend-overflow-menu/legend-overflow-menu.d.ts +12 -0
  176. package/dist/types/legend/components/legend-panel-menu/legend-panel-menu.d.ts +11 -0
  177. package/dist/types/legend/components/legend-proportion/legend-proportion-ui.d.ts +16 -0
  178. package/dist/types/legend/components/legend-proportion/styles.d.ts +37 -0
  179. package/dist/types/legend/components/legend-ramp/legend-ramp-ui.d.ts +20 -0
  180. package/dist/types/legend/components/legend-ramp/styles.d.ts +53 -0
  181. package/dist/types/legend/components/legend-row/legend-row.d.ts +16 -0
  182. package/dist/types/legend/components/legend-row/styles.d.ts +149 -0
  183. package/dist/types/legend/components/legend-row-menu/legend-row-menu-items.d.ts +12 -0
  184. package/dist/types/legend/components/legend-row-menu/legend-row-menu.d.ts +12 -0
  185. package/dist/types/legend/components/legend-row-menu/legend-zoom-to.d.ts +10 -0
  186. package/dist/types/legend/components/legend-sortable/contexts.d.ts +7 -0
  187. package/dist/types/legend/components/legend-sortable/legend-sortable.d.ts +11 -0
  188. package/dist/types/legend/components/legend-sortable/sortable-entity.d.ts +27 -0
  189. package/dist/types/legend/components/legend-sortable/sortable-ids.d.ts +6 -0
  190. package/dist/types/legend/components/legend-sortable/styles.d.ts +55 -0
  191. package/dist/types/legend/components/legend-swatch/legend-swatch.d.ts +26 -0
  192. package/dist/types/legend/components/legend-visibility-toggle/legend-visibility-toggle.d.ts +35 -0
  193. package/dist/types/legend/components/legend-visible-layers/legend-visible-layers.d.ts +7 -0
  194. package/dist/types/legend/components/legend-visible-layers/styles.d.ts +48 -0
  195. package/dist/types/legend/components/run-async-menu-action.d.ts +7 -0
  196. package/dist/types/legend/index.d.ts +135 -0
  197. package/dist/types/legend/provider/index.d.ts +6 -0
  198. package/dist/types/legend/provider/labels.d.ts +48 -0
  199. package/dist/types/legend/provider/legend-config-context.d.ts +7 -0
  200. package/dist/types/legend/provider/legend-provider.d.ts +38 -0
  201. package/dist/types/legend/stores/index.d.ts +5 -0
  202. package/dist/types/legend/stores/legend-context.d.ts +4 -0
  203. package/dist/types/legend/stores/legend-store-registry.d.ts +39 -0
  204. package/dist/types/legend/stores/selectors.d.ts +64 -0
  205. package/dist/types/legend/stores/types.d.ts +294 -0
  206. package/dist/types/widgets/actions/brush-toggle/brush-overlay.d.ts +24 -0
  207. package/dist/types/widgets/actions/brush-toggle/brush-toggle.d.ts +29 -0
  208. package/dist/types/widgets/actions/brush-toggle/hit-test.d.ts +19 -0
  209. package/dist/types/widgets/actions/brush-toggle/style.d.ts +21 -0
  210. package/dist/types/widgets/actions/brush-toggle/types.d.ts +73 -0
  211. package/dist/types/widgets/actions/change-column/change-column-icon.d.ts +1 -1
  212. package/dist/types/widgets/actions/change-column/change-column.d.ts +6 -2
  213. package/dist/types/widgets/actions/change-column/sortable-column-item.d.ts +2 -2
  214. package/dist/types/widgets/actions/download/download.d.ts +13 -2
  215. package/dist/types/widgets/actions/download/exports.d.ts +16 -1
  216. package/dist/types/widgets/actions/download/types.d.ts +1 -1
  217. package/dist/types/widgets/actions/fullscreen/fullscreen.d.ts +15 -2
  218. package/dist/types/widgets/actions/fullscreen/types.d.ts +3 -2
  219. package/dist/types/widgets/actions/index.d.ts +20 -18
  220. package/dist/types/widgets/actions/lock-selection/lock-selection.d.ts +2 -2
  221. package/dist/types/widgets/actions/lock-selection/types.d.ts +10 -10
  222. package/dist/types/widgets/actions/relative-data/relative-data.d.ts +10 -4
  223. package/dist/types/widgets/actions/relative-data/types.d.ts +3 -1
  224. package/dist/types/widgets/actions/relative-data/utils.d.ts +1 -1
  225. package/dist/types/widgets/actions/searcher/searcher-toggle.d.ts +2 -2
  226. package/dist/types/widgets/actions/searcher/searcher.d.ts +2 -2
  227. package/dist/types/widgets/actions/searcher/types.d.ts +2 -2
  228. package/dist/types/widgets/actions/stack-toggle/grouped-bar-chart-icon.d.ts +1 -1
  229. package/dist/types/widgets/actions/stack-toggle/stack-toggle.d.ts +5 -4
  230. package/dist/types/widgets/actions/stack-toggle/types.d.ts +1 -1
  231. package/dist/types/widgets/actions/zoom-toggle/types.d.ts +1 -1
  232. package/dist/types/widgets/actions/zoom-toggle/zoom-toggle.d.ts +10 -2
  233. package/dist/types/widgets/bar/config.d.ts +8 -4
  234. package/dist/types/widgets/bar/index.d.ts +3 -3
  235. package/dist/types/widgets/bar/skeleton.d.ts +1 -1
  236. package/dist/types/widgets/bar/types.d.ts +3 -3
  237. package/dist/types/widgets/category/category-ui.d.ts +5 -2
  238. package/dist/types/widgets/category/components/category-bar.d.ts +4 -1
  239. package/dist/types/widgets/category/components/category-legend.d.ts +5 -2
  240. package/dist/types/widgets/category/components/category-row-multi.d.ts +6 -2
  241. package/dist/types/widgets/category/components/category-row-other.d.ts +4 -1
  242. package/dist/types/widgets/category/components/category-row-single.d.ts +6 -2
  243. package/dist/types/widgets/category/config.d.ts +16 -12
  244. package/dist/types/widgets/category/index.d.ts +14 -6
  245. package/dist/types/widgets/category/skeleton.d.ts +1 -1
  246. package/dist/types/widgets/category/style.d.ts +1 -1
  247. package/dist/types/widgets/category/types.d.ts +4 -3
  248. package/dist/types/widgets/echart/echart-ui.d.ts +9 -2
  249. package/dist/types/widgets/echart/echart.d.ts +8 -2
  250. package/dist/types/widgets/echart/index.d.ts +5 -5
  251. package/dist/types/widgets/echart/options.d.ts +8 -1
  252. package/dist/types/widgets/echart/shared-resize-observer.d.ts +12 -0
  253. package/dist/types/widgets/echart/types.d.ts +7 -2
  254. package/dist/types/widgets/echart/utils.d.ts +57 -9
  255. package/dist/types/widgets/error/error.d.ts +12 -2
  256. package/dist/types/widgets/error/index.d.ts +2 -2
  257. package/dist/types/widgets/error/types.d.ts +9 -1
  258. package/dist/types/widgets/formula/components/item.d.ts +5 -2
  259. package/dist/types/widgets/formula/components/prefix.d.ts +5 -2
  260. package/dist/types/widgets/formula/components/row.d.ts +5 -2
  261. package/dist/types/widgets/formula/components/series.d.ts +5 -2
  262. package/dist/types/widgets/formula/components/suffix.d.ts +5 -2
  263. package/dist/types/widgets/formula/components/value.d.ts +5 -2
  264. package/dist/types/widgets/formula/config.d.ts +13 -2
  265. package/dist/types/widgets/formula/formula-ui.d.ts +5 -2
  266. package/dist/types/widgets/formula/index.d.ts +11 -11
  267. package/dist/types/widgets/formula/serializer.d.ts +1 -1
  268. package/dist/types/widgets/formula/skeleton.d.ts +1 -1
  269. package/dist/types/widgets/formula/types.d.ts +3 -3
  270. package/dist/types/widgets/histogram/config.d.ts +20 -4
  271. package/dist/types/widgets/histogram/index.d.ts +4 -3
  272. package/dist/types/widgets/histogram/skeleton.d.ts +1 -1
  273. package/dist/types/widgets/histogram/types.d.ts +8 -5
  274. package/dist/types/widgets/loader/index.d.ts +3 -0
  275. package/dist/types/widgets/loader/loader.d.ts +24 -0
  276. package/dist/types/widgets/loader/types.d.ts +9 -0
  277. package/dist/types/widgets/loader/utils.d.ts +35 -0
  278. package/dist/types/widgets/markdown/config.d.ts +12 -2
  279. package/dist/types/widgets/markdown/index.d.ts +5 -5
  280. package/dist/types/widgets/markdown/markdown-ui.d.ts +9 -2
  281. package/dist/types/widgets/markdown/markdown.d.ts +5 -2
  282. package/dist/types/widgets/markdown/skeleton.d.ts +1 -1
  283. package/dist/types/widgets/markdown/types.d.ts +3 -3
  284. package/dist/types/widgets/no-data/index.d.ts +2 -2
  285. package/dist/types/widgets/no-data/no-data.d.ts +5 -4
  286. package/dist/types/widgets/no-data/types.d.ts +6 -2
  287. package/dist/types/widgets/note/index.d.ts +2 -2
  288. package/dist/types/widgets/note/note.d.ts +12 -2
  289. package/dist/types/widgets/note/types.d.ts +1 -1
  290. package/dist/types/widgets/pie/config.d.ts +8 -4
  291. package/dist/types/widgets/pie/index.d.ts +3 -3
  292. package/dist/types/widgets/pie/skeleton.d.ts +1 -1
  293. package/dist/types/widgets/pie/types.d.ts +3 -3
  294. package/dist/types/widgets/range/components/range-item.d.ts +5 -2
  295. package/dist/types/widgets/range/config.d.ts +6 -5
  296. package/dist/types/widgets/range/index.d.ts +6 -6
  297. package/dist/types/widgets/range/range-ui.d.ts +5 -2
  298. package/dist/types/widgets/range/serializer.d.ts +1 -1
  299. package/dist/types/widgets/range/skeleton.d.ts +1 -1
  300. package/dist/types/widgets/range/types.d.ts +3 -3
  301. package/dist/types/widgets/scatterplot/config.d.ts +8 -4
  302. package/dist/types/widgets/scatterplot/index.d.ts +3 -3
  303. package/dist/types/widgets/scatterplot/skeleton.d.ts +1 -1
  304. package/dist/types/widgets/scatterplot/types.d.ts +3 -3
  305. package/dist/types/widgets/selection-summary/index.d.ts +2 -2
  306. package/dist/types/widgets/selection-summary/selection-summary.d.ts +13 -2
  307. package/dist/types/widgets/skeleton-loader/index.d.ts +2 -2
  308. package/dist/types/widgets/skeleton-loader/skeleton-loader.d.ts +12 -2
  309. package/dist/types/widgets/skeleton-loader/types.d.ts +1 -1
  310. package/dist/types/widgets/spread/components/max-value.d.ts +5 -2
  311. package/dist/types/widgets/spread/components/min-value.d.ts +5 -2
  312. package/dist/types/widgets/spread/components/separator.d.ts +5 -2
  313. package/dist/types/widgets/spread/config.d.ts +14 -8
  314. package/dist/types/widgets/spread/index.d.ts +9 -9
  315. package/dist/types/widgets/spread/skeleton.d.ts +1 -1
  316. package/dist/types/widgets/spread/spread-ui.d.ts +5 -2
  317. package/dist/types/widgets/spread/types.d.ts +4 -4
  318. package/dist/types/widgets/stores/index.d.ts +3 -2
  319. package/dist/types/widgets/stores/types.d.ts +31 -10
  320. package/dist/types/widgets/stores/use-widget-selector.d.ts +35 -0
  321. package/dist/types/widgets/stores/widget-store.d.ts +48 -27
  322. package/dist/types/widgets/subheader/index.d.ts +2 -2
  323. package/dist/types/widgets/subheader/subheader.d.ts +13 -2
  324. package/dist/types/widgets/table/components/cell-header.d.ts +2 -2
  325. package/dist/types/widgets/table/components/cell.d.ts +4 -2
  326. package/dist/types/widgets/table/components/pagination-actions.d.ts +2 -2
  327. package/dist/types/widgets/table/components/pagination.d.ts +2 -2
  328. package/dist/types/widgets/table/components/row.d.ts +2 -2
  329. package/dist/types/widgets/table/config.d.ts +10 -6
  330. package/dist/types/widgets/table/hooks/use-pagination.d.ts +12 -4
  331. package/dist/types/widgets/table/hooks/use-selection.d.ts +12 -3
  332. package/dist/types/widgets/table/hooks/use-sort.d.ts +12 -4
  333. package/dist/types/widgets/table/index.d.ts +17 -13
  334. package/dist/types/widgets/table/serializer.d.ts +1 -1
  335. package/dist/types/widgets/table/skeleton.d.ts +1 -1
  336. package/dist/types/widgets/table/table-ui.d.ts +8 -8
  337. package/dist/types/widgets/table/types.d.ts +5 -5
  338. package/dist/types/widgets/timeseries/config.d.ts +8 -4
  339. package/dist/types/widgets/timeseries/index.d.ts +3 -3
  340. package/dist/types/widgets/timeseries/skeleton.d.ts +1 -1
  341. package/dist/types/widgets/timeseries/types.d.ts +3 -3
  342. package/dist/types/widgets/toolbar-actions/index.d.ts +2 -2
  343. package/dist/types/widgets/toolbar-actions/toolbar-actions.d.ts +13 -4
  344. package/dist/types/widgets/toolbar-actions/types.d.ts +10 -3
  345. package/dist/types/widgets/{_shared → utils}/chart-config/config-factory.d.ts +1 -1
  346. package/dist/types/widgets/utils/chart-config/download-config.d.ts +3 -0
  347. package/dist/types/widgets/utils/chart-config/index.d.ts +9 -0
  348. package/dist/types/widgets/utils/chart-config/option-builders.d.ts +142 -0
  349. package/dist/types/widgets/utils/formatter.d.ts +2 -0
  350. package/dist/types/widgets/utils/index.d.ts +7 -0
  351. package/dist/types/widgets/utils/skeleton/index.d.ts +4 -0
  352. package/dist/types/widgets/wrapper/components/actions.d.ts +5 -2
  353. package/dist/types/widgets/wrapper/components/options.d.ts +5 -2
  354. package/dist/types/widgets/wrapper/components/title.d.ts +5 -2
  355. package/dist/types/widgets/wrapper/index.d.ts +6 -6
  356. package/dist/types/widgets/wrapper/types.d.ts +1 -1
  357. package/dist/types/widgets/wrapper/wrapper-ui.d.ts +16 -2
  358. package/dist/types/widgets/wrapper/wrapper.d.ts +16 -2
  359. package/dist/types/widgets-v2/actions/brush-toggle/brush-toggle.d.ts +56 -0
  360. package/dist/types/widgets-v2/actions/brush-toggle/index.d.ts +3 -0
  361. package/dist/types/widgets-v2/actions/brush-toggle/labels.d.ts +5 -0
  362. package/dist/types/widgets-v2/actions/brush-toggle/style.d.ts +12 -0
  363. package/dist/types/widgets-v2/actions/brush-toggle/transforms.d.ts +11 -0
  364. package/dist/types/widgets-v2/actions/change-column/change-column-icon.d.ts +2 -0
  365. package/dist/types/widgets-v2/actions/change-column/change-column.d.ts +29 -0
  366. package/dist/types/widgets-v2/actions/change-column/index.d.ts +3 -0
  367. package/dist/types/widgets-v2/actions/change-column/labels.d.ts +6 -0
  368. package/dist/types/widgets-v2/actions/change-column/sortable-column-item.d.ts +14 -0
  369. package/dist/types/widgets-v2/actions/change-column/style.d.ts +59 -0
  370. package/dist/types/widgets-v2/actions/change-column/types.d.ts +10 -0
  371. package/dist/types/widgets-v2/actions/download/constants.d.ts +12 -0
  372. package/dist/types/widgets-v2/actions/download/csv-item.d.ts +38 -0
  373. package/dist/types/widgets-v2/actions/download/download.d.ts +18 -0
  374. package/dist/types/widgets-v2/actions/download/exports.d.ts +37 -0
  375. package/dist/types/widgets-v2/actions/download/icons.d.ts +18 -0
  376. package/dist/types/widgets-v2/actions/download/index.d.ts +8 -0
  377. package/dist/types/widgets-v2/actions/download/labels.d.ts +11 -0
  378. package/dist/types/widgets-v2/actions/download/png-item.d.ts +24 -0
  379. package/dist/types/widgets-v2/actions/download/style.d.ts +1 -0
  380. package/dist/types/widgets-v2/actions/download/types.d.ts +35 -0
  381. package/dist/types/widgets-v2/actions/fullscreen/fullscreen.d.ts +78 -0
  382. package/dist/types/widgets-v2/actions/fullscreen/index.d.ts +3 -0
  383. package/dist/types/widgets-v2/actions/fullscreen/labels.d.ts +5 -0
  384. package/dist/types/widgets-v2/actions/fullscreen/style.d.ts +57 -0
  385. package/dist/types/widgets-v2/actions/fullscreen/types.d.ts +14 -0
  386. package/dist/types/widgets-v2/actions/index.d.ts +10 -0
  387. package/dist/types/widgets-v2/actions/lock-selection/index.d.ts +3 -0
  388. package/dist/types/widgets-v2/actions/lock-selection/labels.d.ts +6 -0
  389. package/dist/types/widgets-v2/actions/lock-selection/lock-selection.d.ts +57 -0
  390. package/dist/types/widgets-v2/actions/lock-selection/style.d.ts +12 -0
  391. package/dist/types/widgets-v2/actions/lock-selection/transforms.d.ts +6 -0
  392. package/dist/types/widgets-v2/actions/relative-data/index.d.ts +3 -0
  393. package/dist/types/widgets-v2/actions/relative-data/labels.d.ts +5 -0
  394. package/dist/types/widgets-v2/actions/relative-data/relative-data.d.ts +39 -0
  395. package/dist/types/widgets-v2/actions/relative-data/style.d.ts +12 -0
  396. package/dist/types/widgets-v2/actions/relative-data/transforms.d.ts +30 -0
  397. package/dist/types/widgets-v2/actions/searcher/filter.d.ts +6 -0
  398. package/dist/types/widgets-v2/actions/searcher/index.d.ts +4 -0
  399. package/dist/types/widgets-v2/actions/searcher/labels.d.ts +7 -0
  400. package/dist/types/widgets-v2/actions/searcher/searcher-toggle.d.ts +23 -0
  401. package/dist/types/widgets-v2/actions/searcher/searcher.d.ts +11 -0
  402. package/dist/types/widgets-v2/actions/searcher/style.d.ts +16 -0
  403. package/dist/types/widgets-v2/actions/show-all/index.d.ts +2 -0
  404. package/dist/types/widgets-v2/actions/show-all/labels.d.ts +5 -0
  405. package/dist/types/widgets-v2/actions/show-all/show-all.d.ts +33 -0
  406. package/dist/types/widgets-v2/actions/show-all/style.d.ts +8 -0
  407. package/dist/types/widgets-v2/actions/stack-toggle/index.d.ts +3 -0
  408. package/dist/types/widgets-v2/actions/stack-toggle/labels.d.ts +5 -0
  409. package/dist/types/widgets-v2/actions/stack-toggle/stack-toggle.d.ts +10 -0
  410. package/dist/types/widgets-v2/actions/stack-toggle/style.d.ts +12 -0
  411. package/dist/types/widgets-v2/actions/stack-toggle/transforms.d.ts +13 -0
  412. package/dist/types/widgets-v2/actions/zoom-toggle/index.d.ts +3 -0
  413. package/dist/types/widgets-v2/actions/zoom-toggle/labels.d.ts +5 -0
  414. package/dist/types/widgets-v2/actions/zoom-toggle/style.d.ts +12 -0
  415. package/dist/types/widgets-v2/actions/zoom-toggle/transforms.d.ts +51 -0
  416. package/dist/types/widgets-v2/actions/zoom-toggle/zoom-toggle.d.ts +35 -0
  417. package/dist/types/widgets-v2/bar/download.d.ts +24 -0
  418. package/dist/types/widgets-v2/bar/index.d.ts +4 -0
  419. package/dist/types/widgets-v2/bar/options.d.ts +43 -0
  420. package/dist/types/widgets-v2/bar/skeleton.d.ts +6 -0
  421. package/dist/types/widgets-v2/bar/types.d.ts +46 -0
  422. package/dist/types/widgets-v2/category/category-ui.d.ts +88 -0
  423. package/dist/types/widgets-v2/category/category.d.ts +55 -0
  424. package/dist/types/widgets-v2/category/components/category-bar-stacked.d.ts +28 -0
  425. package/dist/types/widgets-v2/category/components/category-bar.d.ts +23 -0
  426. package/dist/types/widgets-v2/category/components/category-legend.d.ts +34 -0
  427. package/dist/types/widgets-v2/category/components/category-row-multi.d.ts +31 -0
  428. package/dist/types/widgets-v2/category/components/category-row-other.d.ts +26 -0
  429. package/dist/types/widgets-v2/category/components/category-row-single.d.ts +28 -0
  430. package/dist/types/widgets-v2/category/components/category-row-stacked.d.ts +43 -0
  431. package/dist/types/widgets-v2/category/download.d.ts +16 -0
  432. package/dist/types/widgets-v2/category/index.d.ts +10 -0
  433. package/dist/types/widgets-v2/category/skeleton.d.ts +11 -0
  434. package/dist/types/widgets-v2/category/style.d.ts +193 -0
  435. package/dist/types/widgets-v2/category/types.d.ts +55 -0
  436. package/dist/types/widgets-v2/echart/echart-ui.d.ts +44 -0
  437. package/dist/types/widgets-v2/echart/echart.d.ts +83 -0
  438. package/dist/types/widgets-v2/echart/edge-label-clamp.d.ts +57 -0
  439. package/dist/types/widgets-v2/echart/index.d.ts +4 -0
  440. package/dist/types/widgets-v2/echart/shared-resize-observer.d.ts +5 -0
  441. package/dist/types/widgets-v2/echart/style.d.ts +7 -0
  442. package/dist/types/widgets-v2/echart/use-chart-selection.d.ts +57 -0
  443. package/dist/types/widgets-v2/formula/delta.d.ts +22 -0
  444. package/dist/types/widgets-v2/formula/download.d.ts +20 -0
  445. package/dist/types/widgets-v2/formula/formula-ui.d.ts +20 -0
  446. package/dist/types/widgets-v2/formula/formula.d.ts +8 -0
  447. package/dist/types/widgets-v2/formula/index.d.ts +11 -0
  448. package/dist/types/widgets-v2/formula/note.d.ts +11 -0
  449. package/dist/types/widgets-v2/formula/prefix.d.ts +12 -0
  450. package/dist/types/widgets-v2/formula/series.d.ts +16 -0
  451. package/dist/types/widgets-v2/formula/skeleton.d.ts +4 -0
  452. package/dist/types/widgets-v2/formula/style.d.ts +29 -0
  453. package/dist/types/widgets-v2/formula/suffix.d.ts +12 -0
  454. package/dist/types/widgets-v2/formula/types.d.ts +43 -0
  455. package/dist/types/widgets-v2/formula/value.d.ts +14 -0
  456. package/dist/types/widgets-v2/histogram/download.d.ts +17 -0
  457. package/dist/types/widgets-v2/histogram/index.d.ts +5 -0
  458. package/dist/types/widgets-v2/histogram/options.d.ts +42 -0
  459. package/dist/types/widgets-v2/histogram/skeleton.d.ts +9 -0
  460. package/dist/types/widgets-v2/histogram/transforms.d.ts +28 -0
  461. package/dist/types/widgets-v2/histogram/types.d.ts +60 -0
  462. package/dist/types/widgets-v2/index.d.ts +109 -0
  463. package/dist/types/widgets-v2/markdown/download.d.ts +16 -0
  464. package/dist/types/widgets-v2/markdown/index.d.ts +6 -0
  465. package/dist/types/widgets-v2/markdown/markdown-content.d.ts +40 -0
  466. package/dist/types/widgets-v2/markdown/markdown-ui.d.ts +12 -0
  467. package/dist/types/widgets-v2/markdown/markdown.d.ts +6 -0
  468. package/dist/types/widgets-v2/markdown/skeleton.d.ts +4 -0
  469. package/dist/types/widgets-v2/markdown/style.d.ts +61 -0
  470. package/dist/types/widgets-v2/markdown/types.d.ts +4 -0
  471. package/dist/types/widgets-v2/note/labels.d.ts +5 -0
  472. package/dist/types/widgets-v2/note/style.d.ts +26 -0
  473. package/dist/types/widgets-v2/note/widget-note.d.ts +46 -0
  474. package/dist/types/widgets-v2/pie/download.d.ts +17 -0
  475. package/dist/types/widgets-v2/pie/index.d.ts +4 -0
  476. package/dist/types/widgets-v2/pie/options.d.ts +35 -0
  477. package/dist/types/widgets-v2/pie/skeleton.d.ts +13 -0
  478. package/dist/types/widgets-v2/pie/types.d.ts +57 -0
  479. package/dist/types/widgets-v2/provider/widget-provider.d.ts +32 -0
  480. package/dist/types/widgets-v2/range/index.d.ts +4 -0
  481. package/dist/types/widgets-v2/range/range-ui.d.ts +27 -0
  482. package/dist/types/widgets-v2/range/range.d.ts +24 -0
  483. package/dist/types/widgets-v2/range/skeleton.d.ts +9 -0
  484. package/dist/types/widgets-v2/range/style.d.ts +40 -0
  485. package/dist/types/widgets-v2/range/types.d.ts +37 -0
  486. package/dist/types/widgets-v2/scatterplot/download.d.ts +16 -0
  487. package/dist/types/widgets-v2/scatterplot/index.d.ts +5 -0
  488. package/dist/types/widgets-v2/scatterplot/options.d.ts +42 -0
  489. package/dist/types/widgets-v2/scatterplot/skeleton.d.ts +12 -0
  490. package/dist/types/widgets-v2/scatterplot/transforms.d.ts +26 -0
  491. package/dist/types/widgets-v2/scatterplot/types.d.ts +54 -0
  492. package/dist/types/widgets-v2/selection-summary/labels.d.ts +11 -0
  493. package/dist/types/widgets-v2/selection-summary/selection-summary.d.ts +29 -0
  494. package/dist/types/widgets-v2/selection-summary/style.d.ts +38 -0
  495. package/dist/types/widgets-v2/spread/band.d.ts +37 -0
  496. package/dist/types/widgets-v2/spread/download.d.ts +15 -0
  497. package/dist/types/widgets-v2/spread/index.d.ts +7 -0
  498. package/dist/types/widgets-v2/spread/separator.d.ts +7 -0
  499. package/dist/types/widgets-v2/spread/skeleton.d.ts +9 -0
  500. package/dist/types/widgets-v2/spread/spread-ui.d.ts +18 -0
  501. package/dist/types/widgets-v2/spread/spread.d.ts +5 -0
  502. package/dist/types/widgets-v2/spread/types.d.ts +25 -0
  503. package/dist/types/widgets-v2/state/labels.d.ts +7 -0
  504. package/dist/types/widgets-v2/state/style.d.ts +19 -0
  505. package/dist/types/widgets-v2/state/widget-state.d.ts +19 -0
  506. package/dist/types/widgets-v2/stores/index.d.ts +8 -0
  507. package/dist/types/widgets-v2/stores/pipeline-middleware.d.ts +5 -0
  508. package/dist/types/widgets-v2/stores/transforms.d.ts +4 -0
  509. package/dist/types/widgets-v2/stores/types.d.ts +55 -0
  510. package/dist/types/widgets-v2/stores/use-echart-instance.d.ts +15 -0
  511. package/dist/types/widgets-v2/stores/use-transform-enabled.d.ts +17 -0
  512. package/dist/types/widgets-v2/stores/use-transform.d.ts +12 -0
  513. package/dist/types/widgets-v2/stores/widget-context.d.ts +2 -0
  514. package/dist/types/widgets-v2/stores/widget-store-registry.d.ts +74 -0
  515. package/dist/types/widgets-v2/subheader/style.d.ts +10 -0
  516. package/dist/types/widgets-v2/subheader/subheader.d.ts +11 -0
  517. package/dist/types/widgets-v2/table/download.d.ts +18 -0
  518. package/dist/types/widgets-v2/table/helpers.d.ts +32 -0
  519. package/dist/types/widgets-v2/table/index.d.ts +8 -0
  520. package/dist/types/widgets-v2/table/labels.d.ts +22 -0
  521. package/dist/types/widgets-v2/table/skeleton.d.ts +22 -0
  522. package/dist/types/widgets-v2/table/style.d.ts +40 -0
  523. package/dist/types/widgets-v2/table/table-ui.d.ts +44 -0
  524. package/dist/types/widgets-v2/table/table.d.ts +50 -0
  525. package/dist/types/widgets-v2/table/transforms.d.ts +15 -0
  526. package/dist/types/widgets-v2/table/types.d.ts +48 -0
  527. package/dist/types/widgets-v2/timeseries/download.d.ts +17 -0
  528. package/dist/types/widgets-v2/timeseries/index.d.ts +5 -0
  529. package/dist/types/widgets-v2/timeseries/options.d.ts +39 -0
  530. package/dist/types/widgets-v2/timeseries/skeleton.d.ts +8 -0
  531. package/dist/types/widgets-v2/timeseries/transforms.d.ts +10 -0
  532. package/dist/types/widgets-v2/timeseries/types.d.ts +60 -0
  533. package/dist/types/widgets-v2/toolbox/labels.d.ts +5 -0
  534. package/dist/types/widgets-v2/toolbox/style.d.ts +30 -0
  535. package/dist/types/widgets-v2/toolbox/toolbox.d.ts +49 -0
  536. package/dist/types/widgets-v2/types.d.ts +25 -0
  537. package/dist/types/widgets-v2/utils/data-zoom-layout.d.ts +11 -0
  538. package/dist/types/widgets-v2/utils/index.d.ts +3 -0
  539. package/dist/types/widgets-v2/utils/merge-options.d.ts +12 -0
  540. package/dist/types/widgets-v2/utils/resolve-theme-color.d.ts +18 -0
  541. package/dist/types/widgets-v2/wrapper/index.d.ts +4 -0
  542. package/dist/types/widgets-v2/wrapper/labels.d.ts +6 -0
  543. package/dist/types/widgets-v2/wrapper/style.d.ts +103 -0
  544. package/dist/types/widgets-v2/wrapper/widget-actions.d.ts +22 -0
  545. package/dist/types/widgets-v2/wrapper/widget-content.d.ts +12 -0
  546. package/dist/types/widgets-v2/wrapper/widget-wrapper.d.ts +56 -0
  547. package/dist/use-widget-selector-VSPhfhNm.js +12 -0
  548. package/dist/use-widget-selector-VSPhfhNm.js.map +1 -0
  549. package/dist/utils-Dr6gf3vD.js +58 -0
  550. package/dist/utils-Dr6gf3vD.js.map +1 -0
  551. package/dist/widget-store-BFPKYm4R.js +187 -0
  552. package/dist/widget-store-BFPKYm4R.js.map +1 -0
  553. package/dist/widgets/actions.js +2 -837
  554. package/dist/widgets/bar.js +183 -186
  555. package/dist/widgets/bar.js.map +1 -1
  556. package/dist/widgets/category.js +438 -455
  557. package/dist/widgets/category.js.map +1 -1
  558. package/dist/widgets/echart.js +3 -123
  559. package/dist/widgets/error.js +30 -5
  560. package/dist/widgets/error.js.map +1 -1
  561. package/dist/widgets/formula.js +3 -125
  562. package/dist/widgets/histogram.js +185 -167
  563. package/dist/widgets/histogram.js.map +1 -1
  564. package/dist/widgets/loader.js +66 -0
  565. package/dist/widgets/loader.js.map +1 -0
  566. package/dist/widgets/markdown.js +142 -121
  567. package/dist/widgets/markdown.js.map +1 -1
  568. package/dist/widgets/no-data.js +55 -5
  569. package/dist/widgets/no-data.js.map +1 -1
  570. package/dist/widgets/note.js +126 -4
  571. package/dist/widgets/note.js.map +1 -1
  572. package/dist/widgets/pie.js +244 -208
  573. package/dist/widgets/pie.js.map +1 -1
  574. package/dist/widgets/range.js +226 -210
  575. package/dist/widgets/range.js.map +1 -1
  576. package/dist/widgets/scatterplot.js +219 -216
  577. package/dist/widgets/scatterplot.js.map +1 -1
  578. package/dist/widgets/selection-summary.js +39 -38
  579. package/dist/widgets/selection-summary.js.map +1 -1
  580. package/dist/widgets/skeleton-loader.js +23 -23
  581. package/dist/widgets/skeleton-loader.js.map +1 -1
  582. package/dist/widgets/spread.js +150 -159
  583. package/dist/widgets/spread.js.map +1 -1
  584. package/dist/widgets/stores.js +3 -5
  585. package/dist/widgets/subheader.js +49 -50
  586. package/dist/widgets/subheader.js.map +1 -1
  587. package/dist/widgets/table.js +573 -653
  588. package/dist/widgets/table.js.map +1 -1
  589. package/dist/widgets/timeseries.js +175 -170
  590. package/dist/widgets/timeseries.js.map +1 -1
  591. package/dist/widgets/toolbar-actions.js +144 -6105
  592. package/dist/widgets/toolbar-actions.js.map +1 -1
  593. package/dist/widgets/utils.js +18 -0
  594. package/dist/widgets/utils.js.map +1 -0
  595. package/dist/widgets/wrapper.js +265 -287
  596. package/dist/widgets/wrapper.js.map +1 -1
  597. package/dist/widgets-v2/actions.js +4 -0
  598. package/dist/widgets-v2/bar.js +260 -0
  599. package/dist/widgets-v2/bar.js.map +1 -0
  600. package/dist/widgets-v2/category.js +2 -0
  601. package/dist/widgets-v2/echart.js +2 -0
  602. package/dist/widgets-v2/formula.js +2 -0
  603. package/dist/widgets-v2/histogram.js +297 -0
  604. package/dist/widgets-v2/histogram.js.map +1 -0
  605. package/dist/widgets-v2/markdown.js +3 -0
  606. package/dist/widgets-v2/pie.js +373 -0
  607. package/dist/widgets-v2/pie.js.map +1 -0
  608. package/dist/widgets-v2/range.js +2 -0
  609. package/dist/widgets-v2/scatterplot.js +330 -0
  610. package/dist/widgets-v2/scatterplot.js.map +1 -0
  611. package/dist/widgets-v2/spread.js +2 -0
  612. package/dist/widgets-v2/stores.js +2 -0
  613. package/dist/widgets-v2/table.js +2 -0
  614. package/dist/widgets-v2/timeseries.js +294 -0
  615. package/dist/widgets-v2/timeseries.js.map +1 -0
  616. package/dist/widgets-v2/utils.js +2 -0
  617. package/dist/widgets-v2.js +964 -0
  618. package/dist/widgets-v2.js.map +1 -0
  619. package/dist/zoom-toggle-IsF8BnAp.js +163 -0
  620. package/dist/zoom-toggle-IsF8BnAp.js.map +1 -0
  621. package/package.json +109 -17
  622. package/src/chat/bubbles/chat-agent-message-markdown.test.tsx +38 -0
  623. package/src/chat/bubbles/chat-agent-message-markdown.tsx +34 -0
  624. package/src/chat/bubbles/chat-agent-message.test.tsx +42 -0
  625. package/src/chat/bubbles/chat-agent-message.tsx +31 -0
  626. package/src/chat/bubbles/chat-error-message.test.tsx +40 -0
  627. package/src/chat/bubbles/chat-error-message.tsx +47 -0
  628. package/src/chat/bubbles/chat-suggestion-button.test.tsx +24 -0
  629. package/src/chat/bubbles/chat-suggestion-button.tsx +27 -0
  630. package/src/chat/bubbles/chat-user-message.test.tsx +27 -0
  631. package/src/chat/bubbles/chat-user-message.tsx +27 -0
  632. package/src/chat/bubbles/index.ts +5 -0
  633. package/src/chat/bubbles/styles.ts +171 -0
  634. package/src/chat/const.ts +4 -0
  635. package/src/chat/containers/chat-content.test.tsx +269 -0
  636. package/src/chat/containers/chat-content.tsx +145 -0
  637. package/src/chat/containers/chat-footer.test.tsx +93 -0
  638. package/src/chat/containers/chat-footer.tsx +166 -0
  639. package/src/chat/containers/chat-header.test.tsx +28 -0
  640. package/src/chat/containers/chat-header.tsx +29 -0
  641. package/src/chat/containers/chat-starter.test.tsx +32 -0
  642. package/src/chat/containers/chat-starter.tsx +75 -0
  643. package/src/chat/containers/index.ts +4 -0
  644. package/src/chat/containers/styles.ts +187 -0
  645. package/src/chat/feedback/chat-actions-container.test.tsx +64 -0
  646. package/src/chat/feedback/chat-actions-container.tsx +10 -0
  647. package/src/chat/feedback/chat-loader.test.tsx +10 -0
  648. package/src/chat/feedback/chat-loader.tsx +31 -0
  649. package/src/chat/feedback/chat-rating-action.tsx +43 -0
  650. package/src/chat/feedback/chat-thinking.test.tsx +15 -0
  651. package/src/chat/feedback/chat-thinking.tsx +23 -0
  652. package/src/chat/feedback/chat-tool-code-area.test.tsx +23 -0
  653. package/src/chat/feedback/chat-tool-code-area.tsx +71 -0
  654. package/src/chat/feedback/chat-tool-full-view-dialog.test.tsx +39 -0
  655. package/src/chat/feedback/chat-tool-full-view-dialog.tsx +121 -0
  656. package/src/chat/feedback/chat-tool-group.test.tsx +84 -0
  657. package/src/chat/feedback/chat-tool-group.tsx +156 -0
  658. package/src/chat/feedback/chat-tool-trace.test.tsx +81 -0
  659. package/src/chat/feedback/chat-tool-trace.tsx +192 -0
  660. package/src/chat/feedback/get-tool-label.test.tsx +91 -0
  661. package/src/chat/feedback/get-tool-label.ts +13 -0
  662. package/src/chat/feedback/index.ts +8 -0
  663. package/src/chat/feedback/styles.ts +239 -0
  664. package/src/chat/index.ts +62 -0
  665. package/src/chat/types.ts +247 -0
  666. package/src/chat/use-typewriter.test.tsx +38 -0
  667. package/src/chat/use-typewriter.ts +90 -0
  668. package/src/components/basemaps/basemaps.test.tsx +196 -0
  669. package/src/components/basemaps/basemaps.tsx +150 -0
  670. package/src/components/basemaps/const.ts +13 -0
  671. package/src/components/basemaps/group-wrapper.test.tsx +38 -0
  672. package/src/components/basemaps/group-wrapper.tsx +28 -0
  673. package/src/components/basemaps/group.test.tsx +52 -0
  674. package/src/components/basemaps/group.tsx +42 -0
  675. package/src/components/basemaps/header.test.tsx +54 -0
  676. package/src/components/basemaps/header.tsx +36 -0
  677. package/src/components/basemaps/styles.ts +76 -0
  678. package/src/components/basemaps/types.ts +30 -0
  679. package/src/components/common-types.ts +1 -0
  680. package/src/components/copy-button/copy-button.test.tsx +41 -0
  681. package/src/components/copy-button/copy-button.tsx +31 -0
  682. package/src/components/copy-button/types.ts +10 -0
  683. package/src/components/geolocation-controls/const.ts +6 -0
  684. package/src/components/geolocation-controls/geolocation-controls.test.tsx +148 -0
  685. package/src/components/geolocation-controls/geolocation-controls.tsx +126 -0
  686. package/src/components/geolocation-controls/types.ts +17 -0
  687. package/src/components/index.ts +163 -0
  688. package/src/components/lasso-tool/chip.test.tsx +257 -0
  689. package/src/components/lasso-tool/chip.tsx +66 -0
  690. package/src/components/lasso-tool/const.tsx +94 -0
  691. package/src/components/lasso-tool/edit-confirm-toolbar.test.tsx +67 -0
  692. package/src/components/lasso-tool/edit-confirm-toolbar.tsx +48 -0
  693. package/src/components/lasso-tool/geometry-toolbar.test.tsx +804 -0
  694. package/src/components/lasso-tool/geometry-toolbar.tsx +158 -0
  695. package/src/components/lasso-tool/icons.tsx +193 -0
  696. package/src/components/lasso-tool/lasso-tool-inline.test.tsx +759 -0
  697. package/src/components/lasso-tool/lasso-tool-inline.tsx +508 -0
  698. package/src/components/lasso-tool/lasso-tool.test.tsx +700 -0
  699. package/src/components/lasso-tool/lasso-tool.tsx +673 -0
  700. package/src/components/lasso-tool/layer-filters.test.tsx +103 -0
  701. package/src/components/lasso-tool/layer-filters.tsx +242 -0
  702. package/src/components/lasso-tool/message.tsx +36 -0
  703. package/src/components/lasso-tool/options-sections.test.tsx +101 -0
  704. package/src/components/lasso-tool/options-sections.tsx +104 -0
  705. package/src/components/lasso-tool/styles.test.ts +26 -0
  706. package/src/components/lasso-tool/styles.ts +190 -0
  707. package/src/components/lasso-tool/toolbar/actions/accept-action.tsx +34 -0
  708. package/src/components/lasso-tool/toolbar/actions/action-menu.tsx +103 -0
  709. package/src/components/lasso-tool/toolbar/actions/cancel-action.tsx +34 -0
  710. package/src/components/lasso-tool/toolbar/actions/color-action.tsx +201 -0
  711. package/src/components/lasso-tool/toolbar/actions/delete-action.tsx +31 -0
  712. package/src/components/lasso-tool/toolbar/actions/duplicate-action.tsx +30 -0
  713. package/src/components/lasso-tool/toolbar/actions/edit-geometry-action.tsx +44 -0
  714. package/src/components/lasso-tool/toolbar/actions/edit-properties-action.tsx +487 -0
  715. package/src/components/lasso-tool/toolbar/actions/fill-action.tsx +55 -0
  716. package/src/components/lasso-tool/toolbar/actions/intersect-action.tsx +33 -0
  717. package/src/components/lasso-tool/toolbar/actions/label-action.tsx +292 -0
  718. package/src/components/lasso-tool/toolbar/actions/lock-action.tsx +40 -0
  719. package/src/components/lasso-tool/toolbar/actions/redo-action.tsx +35 -0
  720. package/src/components/lasso-tool/toolbar/actions/split-action.tsx +33 -0
  721. package/src/components/lasso-tool/toolbar/actions/stroke-action.tsx +57 -0
  722. package/src/components/lasso-tool/toolbar/actions/style-actions.test.tsx +212 -0
  723. package/src/components/lasso-tool/toolbar/actions/subtract-action.tsx +33 -0
  724. package/src/components/lasso-tool/toolbar/actions/toggle-type-action.tsx +50 -0
  725. package/src/components/lasso-tool/toolbar/actions/undo-action.tsx +35 -0
  726. package/src/components/lasso-tool/toolbar/actions/union-action.tsx +40 -0
  727. package/src/components/lasso-tool/toolbar/button.tsx +62 -0
  728. package/src/components/lasso-tool/toolbar/connected.tsx +383 -0
  729. package/src/components/lasso-tool/toolbar/context.tsx +65 -0
  730. package/src/components/lasso-tool/toolbar/index.ts +70 -0
  731. package/src/components/lasso-tool/toolbar/styles.ts +42 -0
  732. package/src/components/lasso-tool/toolbar/toolbar.test.tsx +77 -0
  733. package/src/components/lasso-tool/toolbar/toolbar.tsx +50 -0
  734. package/src/components/lasso-tool/tools-context.tsx +47 -0
  735. package/src/components/lasso-tool/types.ts +384 -0
  736. package/src/components/lasso-tool/undo-redo.test.tsx +162 -0
  737. package/src/components/lasso-tool/undo-redo.tsx +55 -0
  738. package/src/components/list-data/list-data-skeleton.test.tsx +10 -0
  739. package/src/components/list-data/list-data-skeleton.tsx +40 -0
  740. package/src/components/list-data/list-data.test.tsx +167 -0
  741. package/src/components/list-data/list-data.tsx +124 -0
  742. package/src/components/list-data/styles.ts +37 -0
  743. package/src/components/list-data/types.ts +25 -0
  744. package/src/components/measurement-tools/const.tsx +108 -0
  745. package/src/components/measurement-tools/icons.tsx +54 -0
  746. package/src/components/measurement-tools/measurement-tools.test.tsx +165 -0
  747. package/src/components/measurement-tools/measurement-tools.tsx +467 -0
  748. package/src/components/measurement-tools/styles.ts +92 -0
  749. package/src/components/measurement-tools/types.ts +77 -0
  750. package/src/components/no-data-alert/no-data-alert.test.tsx +69 -0
  751. package/src/components/no-data-alert/no-data-alert.tsx +59 -0
  752. package/src/components/responsive-drawer/responsive-drawer.test.tsx +415 -0
  753. package/src/components/responsive-drawer/responsive-drawer.tsx +219 -0
  754. package/src/components/smart-tooltip/smart-tooltip.test.tsx +168 -0
  755. package/src/components/smart-tooltip/smart-tooltip.tsx +74 -0
  756. package/src/components/tooltip/tooltip.test.tsx +86 -0
  757. package/src/components/tooltip/tooltip.tsx +43 -0
  758. package/src/components/types.ts +1 -0
  759. package/src/components/zoom-controls/styles.ts +27 -0
  760. package/src/components/zoom-controls/types.ts +19 -0
  761. package/src/components/zoom-controls/zoom-controls.test.tsx +101 -0
  762. package/src/components/zoom-controls/zoom-controls.tsx +130 -0
  763. package/src/hooks/index.ts +1 -0
  764. package/src/hooks/use-skeleton.test.tsx +32 -0
  765. package/src/hooks/use-skeleton.ts +19 -0
  766. package/src/hooks/use-widget-ref.ts +34 -0
  767. package/src/legend/components/a11y.ts +14 -0
  768. package/src/legend/components/contexts.ts +57 -0
  769. package/src/legend/components/icons.tsx +22 -0
  770. package/src/legend/components/index.ts +38 -0
  771. package/src/legend/components/legend-actions/legend-actions.tsx +58 -0
  772. package/src/legend/components/legend-actions/styles.ts +9 -0
  773. package/src/legend/components/legend-category/legend-category-ui.tsx +91 -0
  774. package/src/legend/components/legend-category/styles.ts +61 -0
  775. package/src/legend/components/legend-config-select/legend-config-select.tsx +96 -0
  776. package/src/legend/components/legend-config-select/styles.ts +48 -0
  777. package/src/legend/components/legend-group/legend-group.test.tsx +297 -0
  778. package/src/legend/components/legend-group/legend-group.tsx +126 -0
  779. package/src/legend/components/legend-group/styles.ts +184 -0
  780. package/src/legend/components/legend-group-menu/legend-group-menu-items.tsx +132 -0
  781. package/src/legend/components/legend-group-menu/legend-group-menu.tsx +25 -0
  782. package/src/legend/components/legend-icon/legend-icon-ui.tsx +56 -0
  783. package/src/legend/components/legend-icon/styles.ts +56 -0
  784. package/src/legend/components/legend-item/legend-item-ui.test.tsx +362 -0
  785. package/src/legend/components/legend-item/legend-item-ui.tsx +43 -0
  786. package/src/legend/components/legend-item/legend-item.tsx +34 -0
  787. package/src/legend/components/legend-item/styles.ts +11 -0
  788. package/src/legend/components/legend-opacity/legend-opacity.tsx +152 -0
  789. package/src/legend/components/legend-opacity/styles.ts +33 -0
  790. package/src/legend/components/legend-overflow-menu/legend-overflow-menu.tsx +84 -0
  791. package/src/legend/components/legend-panel-menu/legend-panel-menu.tsx +23 -0
  792. package/src/legend/components/legend-proportion/legend-proportion-ui.tsx +122 -0
  793. package/src/legend/components/legend-proportion/styles.ts +43 -0
  794. package/src/legend/components/legend-ramp/legend-ramp-ui.tsx +160 -0
  795. package/src/legend/components/legend-ramp/styles.ts +62 -0
  796. package/src/legend/components/legend-row/legend-row.test.tsx +736 -0
  797. package/src/legend/components/legend-row/legend-row.tsx +170 -0
  798. package/src/legend/components/legend-row/styles.ts +219 -0
  799. package/src/legend/components/legend-row-menu/legend-row-menu-items.tsx +57 -0
  800. package/src/legend/components/legend-row-menu/legend-row-menu.tsx +30 -0
  801. package/src/legend/components/legend-row-menu/legend-zoom-to.tsx +43 -0
  802. package/src/legend/components/legend-sortable/contexts.ts +12 -0
  803. package/src/legend/components/legend-sortable/legend-sortable.test.tsx +144 -0
  804. package/src/legend/components/legend-sortable/legend-sortable.tsx +195 -0
  805. package/src/legend/components/legend-sortable/sortable-entity.tsx +91 -0
  806. package/src/legend/components/legend-sortable/sortable-ids.ts +17 -0
  807. package/src/legend/components/legend-sortable/styles.ts +65 -0
  808. package/src/legend/components/legend-swatch/legend-swatch.test.tsx +109 -0
  809. package/src/legend/components/legend-swatch/legend-swatch.tsx +237 -0
  810. package/src/legend/components/legend-visibility-toggle/legend-visibility-toggle.tsx +133 -0
  811. package/src/legend/components/legend-visible-layers/legend-visible-layers.test.tsx +86 -0
  812. package/src/legend/components/legend-visible-layers/legend-visible-layers.tsx +135 -0
  813. package/src/legend/components/legend-visible-layers/styles.ts +60 -0
  814. package/src/legend/components/run-async-menu-action.ts +20 -0
  815. package/src/legend/index.ts +176 -0
  816. package/src/legend/provider/index.ts +6 -0
  817. package/src/legend/provider/labels.ts +101 -0
  818. package/src/legend/provider/legend-config-context.ts +15 -0
  819. package/src/legend/provider/legend-provider.tsx +102 -0
  820. package/src/legend/stores/index.ts +50 -0
  821. package/src/legend/stores/legend-context.ts +17 -0
  822. package/src/legend/stores/legend-store-registry.ts +745 -0
  823. package/src/legend/stores/legend-store.test.ts +701 -0
  824. package/src/legend/stores/selectors.ts +127 -0
  825. package/src/legend/stores/types.ts +359 -0
  826. package/src/widgets/README.md +277 -0
  827. package/src/widgets/actions/brush-toggle/brush-overlay.test.tsx +465 -0
  828. package/src/widgets/actions/brush-toggle/brush-overlay.tsx +408 -0
  829. package/src/widgets/actions/brush-toggle/brush-toggle.test.tsx +208 -0
  830. package/src/widgets/actions/brush-toggle/brush-toggle.tsx +133 -0
  831. package/src/widgets/actions/brush-toggle/hit-test.test.ts +65 -0
  832. package/src/widgets/actions/brush-toggle/hit-test.ts +45 -0
  833. package/src/widgets/actions/brush-toggle/style.ts +46 -0
  834. package/src/widgets/actions/brush-toggle/types.ts +78 -0
  835. package/src/widgets/actions/change-column/change-column-dnd.test.tsx +193 -0
  836. package/src/widgets/actions/change-column/change-column-icon.tsx +10 -0
  837. package/src/widgets/actions/change-column/change-column.test.tsx +290 -0
  838. package/src/widgets/actions/change-column/change-column.tsx +218 -0
  839. package/src/widgets/actions/change-column/sortable-column-item.test.tsx +124 -0
  840. package/src/widgets/actions/change-column/sortable-column-item.tsx +51 -0
  841. package/src/widgets/actions/change-column/types.ts +20 -0
  842. package/src/widgets/actions/download/download.test.tsx +326 -0
  843. package/src/widgets/actions/download/download.tsx +132 -0
  844. package/src/widgets/actions/download/exports.test.tsx +288 -0
  845. package/src/widgets/actions/download/exports.tsx +118 -0
  846. package/src/widgets/actions/download/types.ts +21 -0
  847. package/src/widgets/actions/fullscreen/fullscreen.test.tsx +269 -0
  848. package/src/widgets/actions/fullscreen/fullscreen.tsx +98 -0
  849. package/src/widgets/actions/fullscreen/styles.ts +17 -0
  850. package/src/widgets/actions/fullscreen/types.ts +32 -0
  851. package/src/widgets/actions/index.ts +73 -0
  852. package/src/widgets/actions/lock-selection/lock-selection.test.tsx +198 -0
  853. package/src/widgets/actions/lock-selection/lock-selection.tsx +128 -0
  854. package/src/widgets/actions/lock-selection/types.ts +43 -0
  855. package/src/widgets/actions/relative-data/relative-data.test.tsx +542 -0
  856. package/src/widgets/actions/relative-data/relative-data.tsx +188 -0
  857. package/src/widgets/actions/relative-data/types.ts +33 -0
  858. package/src/widgets/actions/relative-data/utils.test.ts +223 -0
  859. package/src/widgets/actions/relative-data/utils.ts +58 -0
  860. package/src/widgets/actions/searcher/searcher-toggle.test.tsx +354 -0
  861. package/src/widgets/actions/searcher/searcher-toggle.tsx +72 -0
  862. package/src/widgets/actions/searcher/searcher.tsx +196 -0
  863. package/src/widgets/actions/searcher/types.ts +72 -0
  864. package/src/widgets/actions/shared/styles.ts +12 -0
  865. package/src/widgets/actions/stack-toggle/grouped-bar-chart-icon.tsx +14 -0
  866. package/src/widgets/actions/stack-toggle/stack-toggle.test.tsx +414 -0
  867. package/src/widgets/actions/stack-toggle/stack-toggle.tsx +129 -0
  868. package/src/widgets/actions/stack-toggle/types.ts +29 -0
  869. package/src/widgets/actions/zoom-toggle/style.ts +14 -0
  870. package/src/widgets/actions/zoom-toggle/types.ts +44 -0
  871. package/src/widgets/actions/zoom-toggle/zoom-toggle.test.tsx +322 -0
  872. package/src/widgets/actions/zoom-toggle/zoom-toggle.tsx +218 -0
  873. package/src/widgets/bar/config.ts +140 -0
  874. package/src/widgets/bar/index.ts +9 -0
  875. package/src/widgets/bar/skeleton.tsx +60 -0
  876. package/src/widgets/bar/style.ts +33 -0
  877. package/src/widgets/bar/types.ts +16 -0
  878. package/src/widgets/category/category-ui.test.tsx +399 -0
  879. package/src/widgets/category/category-ui.tsx +166 -0
  880. package/src/widgets/category/components/category-bar.tsx +31 -0
  881. package/src/widgets/category/components/category-legend.tsx +33 -0
  882. package/src/widgets/category/components/category-row-multi.tsx +57 -0
  883. package/src/widgets/category/components/category-row-other.tsx +26 -0
  884. package/src/widgets/category/components/category-row-single.tsx +54 -0
  885. package/src/widgets/category/components/category-rows.test.tsx +213 -0
  886. package/src/widgets/category/config.ts +86 -0
  887. package/src/widgets/category/index.ts +29 -0
  888. package/src/widgets/category/skeleton.tsx +24 -0
  889. package/src/widgets/category/style.ts +134 -0
  890. package/src/widgets/category/types.ts +41 -0
  891. package/src/widgets/echart/const.ts +1 -0
  892. package/src/widgets/echart/echart-ui.test.tsx +526 -0
  893. package/src/widgets/echart/echart-ui.tsx +78 -0
  894. package/src/widgets/echart/echart.test.tsx +546 -0
  895. package/src/widgets/echart/echart.tsx +66 -0
  896. package/src/widgets/echart/index.ts +16 -0
  897. package/src/widgets/echart/options.ts +57 -0
  898. package/src/widgets/echart/shared-resize-observer.ts +45 -0
  899. package/src/widgets/echart/types.ts +45 -0
  900. package/src/widgets/echart/utils.test.ts +277 -0
  901. package/src/widgets/echart/utils.ts +244 -0
  902. package/src/widgets/error/error.test.tsx +331 -0
  903. package/src/widgets/error/error.tsx +51 -0
  904. package/src/widgets/error/index.ts +2 -0
  905. package/src/widgets/error/types.ts +24 -0
  906. package/src/widgets/formula/components/item.test.tsx +249 -0
  907. package/src/widgets/formula/components/item.tsx +21 -0
  908. package/src/widgets/formula/components/prefix.test.tsx +341 -0
  909. package/src/widgets/formula/components/prefix.tsx +19 -0
  910. package/src/widgets/formula/components/row.test.tsx +364 -0
  911. package/src/widgets/formula/components/row.tsx +24 -0
  912. package/src/widgets/formula/components/series.tsx +35 -0
  913. package/src/widgets/formula/components/suffix.test.tsx +383 -0
  914. package/src/widgets/formula/components/suffix.tsx +29 -0
  915. package/src/widgets/formula/components/value.test.tsx +329 -0
  916. package/src/widgets/formula/components/value.tsx +24 -0
  917. package/src/widgets/formula/config.test.ts +37 -0
  918. package/src/widgets/formula/config.ts +38 -0
  919. package/src/widgets/formula/formula-ui.test.tsx +399 -0
  920. package/src/widgets/formula/formula-ui.tsx +30 -0
  921. package/src/widgets/formula/index.ts +24 -0
  922. package/src/widgets/formula/serializer.test.tsx +144 -0
  923. package/src/widgets/formula/serializer.ts +28 -0
  924. package/src/widgets/formula/skeleton.tsx +10 -0
  925. package/src/widgets/formula/style.ts +23 -0
  926. package/src/widgets/formula/types.ts +50 -0
  927. package/src/widgets/histogram/config.ts +230 -0
  928. package/src/widgets/histogram/index.ts +13 -0
  929. package/src/widgets/histogram/skeleton.tsx +52 -0
  930. package/src/widgets/histogram/style.ts +8 -0
  931. package/src/widgets/histogram/types.ts +23 -0
  932. package/src/widgets/loader/index.ts +4 -0
  933. package/src/widgets/loader/loader.tsx +92 -0
  934. package/src/widgets/loader/types.ts +13 -0
  935. package/src/widgets/loader/utils.test.ts +112 -0
  936. package/src/widgets/loader/utils.ts +57 -0
  937. package/src/widgets/markdown/config.ts +28 -0
  938. package/src/widgets/markdown/index.ts +14 -0
  939. package/src/widgets/markdown/markdown-ui.test.tsx +341 -0
  940. package/src/widgets/markdown/markdown-ui.tsx +59 -0
  941. package/src/widgets/markdown/markdown.tsx +20 -0
  942. package/src/widgets/markdown/skeleton.tsx +12 -0
  943. package/src/widgets/markdown/style.ts +28 -0
  944. package/src/widgets/markdown/types.ts +28 -0
  945. package/src/widgets/no-data/index.ts +2 -0
  946. package/src/widgets/no-data/no-data.test.tsx +497 -0
  947. package/src/widgets/no-data/no-data.tsx +112 -0
  948. package/src/widgets/no-data/style.ts +18 -0
  949. package/src/widgets/no-data/types.ts +76 -0
  950. package/src/widgets/note/index.ts +2 -0
  951. package/src/widgets/note/note.test.tsx +391 -0
  952. package/src/widgets/note/note.tsx +124 -0
  953. package/src/widgets/note/style.ts +29 -0
  954. package/src/widgets/note/types.ts +9 -0
  955. package/src/widgets/pie/config.ts +245 -0
  956. package/src/widgets/pie/index.ts +8 -0
  957. package/src/widgets/pie/skeleton.tsx +70 -0
  958. package/src/widgets/pie/style.ts +8 -0
  959. package/src/widgets/pie/types.ts +16 -0
  960. package/src/widgets/range/components/range-item.test.tsx +243 -0
  961. package/src/widgets/range/components/range-item.tsx +214 -0
  962. package/src/widgets/range/config.ts +10 -0
  963. package/src/widgets/range/index.ts +16 -0
  964. package/src/widgets/range/range-ui.test.tsx +203 -0
  965. package/src/widgets/range/range-ui.tsx +14 -0
  966. package/src/widgets/range/serializer.test.ts +70 -0
  967. package/src/widgets/range/serializer.ts +27 -0
  968. package/src/widgets/range/skeleton.tsx +14 -0
  969. package/src/widgets/range/style.ts +37 -0
  970. package/src/widgets/range/types.ts +39 -0
  971. package/src/widgets/scatterplot/config.ts +136 -0
  972. package/src/widgets/scatterplot/index.ts +8 -0
  973. package/src/widgets/scatterplot/skeleton.tsx +59 -0
  974. package/src/widgets/scatterplot/style.ts +21 -0
  975. package/src/widgets/scatterplot/types.ts +17 -0
  976. package/src/widgets/selection-summary/index.ts +6 -0
  977. package/src/widgets/selection-summary/selection-summary.tsx +57 -0
  978. package/src/widgets/selection-summary/style.ts +10 -0
  979. package/src/widgets/selection-summary/types.ts +14 -0
  980. package/src/widgets/skeleton-loader/index.ts +2 -0
  981. package/src/widgets/skeleton-loader/skeleton-loader.test.tsx +139 -0
  982. package/src/widgets/skeleton-loader/skeleton-loader.tsx +35 -0
  983. package/src/widgets/skeleton-loader/types.ts +8 -0
  984. package/src/widgets/spread/components/max-value.tsx +29 -0
  985. package/src/widgets/spread/components/min-value.tsx +29 -0
  986. package/src/widgets/spread/components/separator.tsx +9 -0
  987. package/src/widgets/spread/config.ts +39 -0
  988. package/src/widgets/spread/index.ts +23 -0
  989. package/src/widgets/spread/skeleton.tsx +10 -0
  990. package/src/widgets/spread/spread-ui.test.tsx +368 -0
  991. package/src/widgets/spread/spread-ui.tsx +32 -0
  992. package/src/widgets/spread/style.ts +22 -0
  993. package/src/widgets/spread/types.ts +47 -0
  994. package/src/widgets/stores/index.ts +13 -0
  995. package/src/widgets/stores/types.ts +203 -0
  996. package/src/widgets/stores/use-widget-selector.ts +47 -0
  997. package/src/widgets/stores/widget-store-branches.test.ts +275 -0
  998. package/src/widgets/stores/widget-store-performance.test.ts +750 -0
  999. package/src/widgets/stores/widget-store.test.ts +942 -0
  1000. package/src/widgets/stores/widget-store.ts +484 -0
  1001. package/src/widgets/subheader/index.ts +3 -0
  1002. package/src/widgets/subheader/style.ts +20 -0
  1003. package/src/widgets/subheader/subheader.test.tsx +45 -0
  1004. package/src/widgets/subheader/subheader.tsx +35 -0
  1005. package/src/widgets/subheader/types.ts +11 -0
  1006. package/src/widgets/table/components/cell-header.tsx +58 -0
  1007. package/src/widgets/table/components/cell.tsx +82 -0
  1008. package/src/widgets/table/components/pagination-actions.tsx +67 -0
  1009. package/src/widgets/table/components/pagination.tsx +41 -0
  1010. package/src/widgets/table/components/row.tsx +65 -0
  1011. package/src/widgets/table/config.test.ts +65 -0
  1012. package/src/widgets/table/config.ts +75 -0
  1013. package/src/widgets/table/helpers.test.ts +244 -0
  1014. package/src/widgets/table/helpers.ts +107 -0
  1015. package/src/widgets/table/hooks/use-pagination.test.ts +294 -0
  1016. package/src/widgets/table/hooks/use-pagination.ts +148 -0
  1017. package/src/widgets/table/hooks/use-selection.test.ts +504 -0
  1018. package/src/widgets/table/hooks/use-selection.ts +194 -0
  1019. package/src/widgets/table/hooks/use-sort.test.ts +296 -0
  1020. package/src/widgets/table/hooks/use-sort.ts +131 -0
  1021. package/src/widgets/table/index.ts +55 -0
  1022. package/src/widgets/table/serializer.ts +54 -0
  1023. package/src/widgets/table/skeleton.tsx +48 -0
  1024. package/src/widgets/table/style.ts +34 -0
  1025. package/src/widgets/table/table-ui.tsx +64 -0
  1026. package/src/widgets/table/types.ts +223 -0
  1027. package/src/widgets/timeseries/config.ts +136 -0
  1028. package/src/widgets/timeseries/index.ts +8 -0
  1029. package/src/widgets/timeseries/skeleton.tsx +55 -0
  1030. package/src/widgets/timeseries/style.ts +36 -0
  1031. package/src/widgets/timeseries/types.ts +17 -0
  1032. package/src/widgets/toolbar-actions/index.ts +6 -0
  1033. package/src/widgets/toolbar-actions/styles.ts +38 -0
  1034. package/src/widgets/toolbar-actions/toolbar-actions.test.tsx +691 -0
  1035. package/src/widgets/toolbar-actions/toolbar-actions.tsx +145 -0
  1036. package/src/widgets/toolbar-actions/types.ts +60 -0
  1037. package/src/widgets/utils/chart-config/config-factory.ts +67 -0
  1038. package/src/widgets/utils/chart-config/csv-modifiers.ts +56 -0
  1039. package/src/widgets/utils/chart-config/download-config.ts +22 -0
  1040. package/src/widgets/utils/chart-config/index.ts +29 -0
  1041. package/src/widgets/utils/chart-config/option-builders.test.ts +366 -0
  1042. package/src/widgets/utils/chart-config/option-builders.ts +308 -0
  1043. package/src/widgets/utils/formatter.ts +2 -0
  1044. package/src/widgets/utils/index.ts +26 -0
  1045. package/{dist/types/widgets/_shared/skeleton/index.d.ts → src/widgets/utils/skeleton/index.ts} +2 -1
  1046. package/src/widgets/utils/skeleton/styles.ts +20 -0
  1047. package/src/widgets/wrapper/components/actions.test.tsx +105 -0
  1048. package/src/widgets/wrapper/components/actions.tsx +35 -0
  1049. package/src/widgets/wrapper/components/options.test.tsx +331 -0
  1050. package/src/widgets/wrapper/components/options.tsx +81 -0
  1051. package/src/widgets/wrapper/components/title.test.tsx +126 -0
  1052. package/src/widgets/wrapper/components/title.tsx +35 -0
  1053. package/src/widgets/wrapper/index.ts +16 -0
  1054. package/src/widgets/wrapper/styles.ts +98 -0
  1055. package/src/widgets/wrapper/types.ts +55 -0
  1056. package/src/widgets/wrapper/wrapper-ui.test.tsx +232 -0
  1057. package/src/widgets/wrapper/wrapper-ui.tsx +72 -0
  1058. package/src/widgets/wrapper/wrapper.test.tsx +365 -0
  1059. package/src/widgets/wrapper/wrapper.tsx +60 -0
  1060. package/src/widgets-v2/PERFORMANCE.md +189 -0
  1061. package/src/widgets-v2/actions/brush-toggle/brush-toggle.test.tsx +180 -0
  1062. package/src/widgets-v2/actions/brush-toggle/brush-toggle.tsx +154 -0
  1063. package/src/widgets-v2/actions/brush-toggle/index.ts +3 -0
  1064. package/src/widgets-v2/actions/brush-toggle/labels.ts +9 -0
  1065. package/src/widgets-v2/actions/brush-toggle/style.ts +11 -0
  1066. package/src/widgets-v2/actions/brush-toggle/transforms.test.ts +47 -0
  1067. package/src/widgets-v2/actions/brush-toggle/transforms.ts +31 -0
  1068. package/src/widgets-v2/actions/change-column/change-column-icon.tsx +14 -0
  1069. package/src/widgets-v2/actions/change-column/change-column.test.tsx +59 -0
  1070. package/src/widgets-v2/actions/change-column/change-column.tsx +189 -0
  1071. package/src/widgets-v2/actions/change-column/index.ts +7 -0
  1072. package/src/widgets-v2/actions/change-column/labels.ts +11 -0
  1073. package/src/widgets-v2/actions/change-column/sortable-column-item.tsx +63 -0
  1074. package/src/widgets-v2/actions/change-column/style.ts +58 -0
  1075. package/src/widgets-v2/actions/change-column/types.ts +11 -0
  1076. package/src/widgets-v2/actions/download/constants.ts +14 -0
  1077. package/src/widgets-v2/actions/download/csv-item.test.tsx +77 -0
  1078. package/src/widgets-v2/actions/download/csv-item.tsx +71 -0
  1079. package/src/widgets-v2/actions/download/download.test.tsx +327 -0
  1080. package/src/widgets-v2/actions/download/download.tsx +144 -0
  1081. package/src/widgets-v2/actions/download/exports.test.tsx +198 -0
  1082. package/src/widgets-v2/actions/download/exports.ts +115 -0
  1083. package/src/widgets-v2/actions/download/icons.tsx +35 -0
  1084. package/src/widgets-v2/actions/download/index.ts +15 -0
  1085. package/src/widgets-v2/actions/download/labels.ts +16 -0
  1086. package/src/widgets-v2/actions/download/png-item.test.tsx +72 -0
  1087. package/src/widgets-v2/actions/download/png-item.tsx +53 -0
  1088. package/src/widgets-v2/actions/download/style.ts +3 -0
  1089. package/src/widgets-v2/actions/download/types.ts +32 -0
  1090. package/src/widgets-v2/actions/fullscreen/fullscreen.test.tsx +212 -0
  1091. package/src/widgets-v2/actions/fullscreen/fullscreen.tsx +301 -0
  1092. package/src/widgets-v2/actions/fullscreen/index.ts +7 -0
  1093. package/src/widgets-v2/actions/fullscreen/labels.ts +9 -0
  1094. package/src/widgets-v2/actions/fullscreen/style.ts +86 -0
  1095. package/src/widgets-v2/actions/fullscreen/types.ts +15 -0
  1096. package/src/widgets-v2/actions/index.ts +95 -0
  1097. package/src/widgets-v2/actions/lock-selection/index.ts +10 -0
  1098. package/src/widgets-v2/actions/lock-selection/labels.ts +11 -0
  1099. package/src/widgets-v2/actions/lock-selection/lock-selection.test.tsx +301 -0
  1100. package/src/widgets-v2/actions/lock-selection/lock-selection.tsx +188 -0
  1101. package/src/widgets-v2/actions/lock-selection/style.ts +11 -0
  1102. package/src/widgets-v2/actions/lock-selection/transforms.ts +27 -0
  1103. package/src/widgets-v2/actions/relative-data/index.ts +3 -0
  1104. package/src/widgets-v2/actions/relative-data/labels.ts +9 -0
  1105. package/src/widgets-v2/actions/relative-data/relative-data.test.tsx +71 -0
  1106. package/src/widgets-v2/actions/relative-data/relative-data.tsx +107 -0
  1107. package/src/widgets-v2/actions/relative-data/style.ts +11 -0
  1108. package/src/widgets-v2/actions/relative-data/transforms.test.ts +151 -0
  1109. package/src/widgets-v2/actions/relative-data/transforms.ts +70 -0
  1110. package/src/widgets-v2/actions/searcher/filter.ts +28 -0
  1111. package/src/widgets-v2/actions/searcher/index.ts +8 -0
  1112. package/src/widgets-v2/actions/searcher/labels.ts +13 -0
  1113. package/src/widgets-v2/actions/searcher/searcher-toggle.tsx +91 -0
  1114. package/src/widgets-v2/actions/searcher/searcher.test.tsx +92 -0
  1115. package/src/widgets-v2/actions/searcher/searcher.tsx +111 -0
  1116. package/src/widgets-v2/actions/searcher/style.ts +15 -0
  1117. package/src/widgets-v2/actions/show-all/index.ts +7 -0
  1118. package/src/widgets-v2/actions/show-all/labels.ts +8 -0
  1119. package/src/widgets-v2/actions/show-all/show-all.test.tsx +50 -0
  1120. package/src/widgets-v2/actions/show-all/show-all.tsx +72 -0
  1121. package/src/widgets-v2/actions/show-all/style.ts +8 -0
  1122. package/src/widgets-v2/actions/stack-toggle/index.ts +3 -0
  1123. package/src/widgets-v2/actions/stack-toggle/labels.ts +9 -0
  1124. package/src/widgets-v2/actions/stack-toggle/stack-toggle.test.tsx +61 -0
  1125. package/src/widgets-v2/actions/stack-toggle/stack-toggle.tsx +54 -0
  1126. package/src/widgets-v2/actions/stack-toggle/style.ts +11 -0
  1127. package/src/widgets-v2/actions/stack-toggle/transforms.test.ts +43 -0
  1128. package/src/widgets-v2/actions/stack-toggle/transforms.ts +25 -0
  1129. package/src/widgets-v2/actions/zoom-toggle/index.ts +9 -0
  1130. package/src/widgets-v2/actions/zoom-toggle/labels.ts +9 -0
  1131. package/src/widgets-v2/actions/zoom-toggle/style.ts +11 -0
  1132. package/src/widgets-v2/actions/zoom-toggle/transforms.test.ts +148 -0
  1133. package/src/widgets-v2/actions/zoom-toggle/transforms.ts +171 -0
  1134. package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.test.tsx +107 -0
  1135. package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.tsx +106 -0
  1136. package/src/widgets-v2/bar/download.test.tsx +91 -0
  1137. package/src/widgets-v2/bar/download.tsx +60 -0
  1138. package/src/widgets-v2/bar/index.ts +10 -0
  1139. package/src/widgets-v2/bar/options.test.ts +361 -0
  1140. package/src/widgets-v2/bar/options.ts +333 -0
  1141. package/src/widgets-v2/bar/skeleton.test.tsx +19 -0
  1142. package/src/widgets-v2/bar/skeleton.tsx +69 -0
  1143. package/src/widgets-v2/bar/types.ts +51 -0
  1144. package/src/widgets-v2/category/category-ui.test.tsx +909 -0
  1145. package/src/widgets-v2/category/category-ui.tsx +479 -0
  1146. package/src/widgets-v2/category/category.relative-data.test.tsx +107 -0
  1147. package/src/widgets-v2/category/category.stack-toggle.test.tsx +85 -0
  1148. package/src/widgets-v2/category/category.test.tsx +305 -0
  1149. package/src/widgets-v2/category/category.tsx +130 -0
  1150. package/src/widgets-v2/category/components/category-bar-stacked.test.tsx +121 -0
  1151. package/src/widgets-v2/category/components/category-bar-stacked.tsx +73 -0
  1152. package/src/widgets-v2/category/components/category-bar.test.tsx +64 -0
  1153. package/src/widgets-v2/category/components/category-bar.tsx +49 -0
  1154. package/src/widgets-v2/category/components/category-legend.test.tsx +102 -0
  1155. package/src/widgets-v2/category/components/category-legend.tsx +82 -0
  1156. package/src/widgets-v2/category/components/category-row-multi.tsx +86 -0
  1157. package/src/widgets-v2/category/components/category-row-other.test.tsx +57 -0
  1158. package/src/widgets-v2/category/components/category-row-other.tsx +84 -0
  1159. package/src/widgets-v2/category/components/category-row-single.tsx +76 -0
  1160. package/src/widgets-v2/category/components/category-row-stacked.test.tsx +248 -0
  1161. package/src/widgets-v2/category/components/category-row-stacked.tsx +104 -0
  1162. package/src/widgets-v2/category/download.test.ts +80 -0
  1163. package/src/widgets-v2/category/download.ts +50 -0
  1164. package/src/widgets-v2/category/index.ts +32 -0
  1165. package/src/widgets-v2/category/skeleton.test.tsx +26 -0
  1166. package/src/widgets-v2/category/skeleton.tsx +74 -0
  1167. package/src/widgets-v2/category/style.ts +329 -0
  1168. package/src/widgets-v2/category/types.ts +61 -0
  1169. package/src/widgets-v2/echart/echart-ui.test.tsx +330 -0
  1170. package/src/widgets-v2/echart/echart-ui.tsx +236 -0
  1171. package/src/widgets-v2/echart/echart.test.tsx +229 -0
  1172. package/src/widgets-v2/echart/echart.tsx +209 -0
  1173. package/src/widgets-v2/echart/edge-label-clamp.test.ts +198 -0
  1174. package/src/widgets-v2/echart/edge-label-clamp.ts +217 -0
  1175. package/src/widgets-v2/echart/index.ts +22 -0
  1176. package/src/widgets-v2/echart/shared-resize-observer.test.ts +91 -0
  1177. package/src/widgets-v2/echart/shared-resize-observer.ts +56 -0
  1178. package/src/widgets-v2/echart/style.ts +17 -0
  1179. package/src/widgets-v2/echart/use-chart-selection.test.tsx +120 -0
  1180. package/src/widgets-v2/echart/use-chart-selection.ts +121 -0
  1181. package/src/widgets-v2/formula/delta.tsx +61 -0
  1182. package/src/widgets-v2/formula/download.test.tsx +65 -0
  1183. package/src/widgets-v2/formula/download.tsx +63 -0
  1184. package/src/widgets-v2/formula/formula-ui.test.tsx +91 -0
  1185. package/src/widgets-v2/formula/formula-ui.tsx +66 -0
  1186. package/src/widgets-v2/formula/formula.test.tsx +50 -0
  1187. package/src/widgets-v2/formula/formula.tsx +34 -0
  1188. package/src/widgets-v2/formula/index.ts +17 -0
  1189. package/src/widgets-v2/formula/note.tsx +25 -0
  1190. package/src/widgets-v2/formula/prefix.tsx +25 -0
  1191. package/src/widgets-v2/formula/series.tsx +67 -0
  1192. package/src/widgets-v2/formula/skeleton.test.tsx +21 -0
  1193. package/src/widgets-v2/formula/skeleton.tsx +27 -0
  1194. package/src/widgets-v2/formula/style.ts +31 -0
  1195. package/src/widgets-v2/formula/subcomponents.test.tsx +107 -0
  1196. package/src/widgets-v2/formula/suffix.tsx +25 -0
  1197. package/src/widgets-v2/formula/types.ts +48 -0
  1198. package/src/widgets-v2/formula/value.tsx +31 -0
  1199. package/src/widgets-v2/histogram/download.test.ts +94 -0
  1200. package/src/widgets-v2/histogram/download.ts +56 -0
  1201. package/src/widgets-v2/histogram/index.ts +13 -0
  1202. package/src/widgets-v2/histogram/options.test.ts +411 -0
  1203. package/src/widgets-v2/histogram/options.ts +390 -0
  1204. package/src/widgets-v2/histogram/skeleton.test.tsx +16 -0
  1205. package/src/widgets-v2/histogram/skeleton.tsx +70 -0
  1206. package/src/widgets-v2/histogram/transforms.test.ts +81 -0
  1207. package/src/widgets-v2/histogram/transforms.ts +53 -0
  1208. package/src/widgets-v2/histogram/types.ts +64 -0
  1209. package/src/widgets-v2/index.ts +212 -0
  1210. package/src/widgets-v2/markdown/download.test.ts +66 -0
  1211. package/src/widgets-v2/markdown/download.tsx +56 -0
  1212. package/src/widgets-v2/markdown/index.ts +6 -0
  1213. package/src/widgets-v2/markdown/markdown-content.test.tsx +165 -0
  1214. package/src/widgets-v2/markdown/markdown-content.tsx +81 -0
  1215. package/src/widgets-v2/markdown/markdown-ui.test.tsx +75 -0
  1216. package/src/widgets-v2/markdown/markdown-ui.tsx +55 -0
  1217. package/src/widgets-v2/markdown/markdown.test.tsx +39 -0
  1218. package/src/widgets-v2/markdown/markdown.tsx +17 -0
  1219. package/src/widgets-v2/markdown/skeleton.test.tsx +15 -0
  1220. package/src/widgets-v2/markdown/skeleton.tsx +32 -0
  1221. package/src/widgets-v2/markdown/style.ts +53 -0
  1222. package/src/widgets-v2/markdown/types.ts +4 -0
  1223. package/src/widgets-v2/note/labels.ts +9 -0
  1224. package/src/widgets-v2/note/style.ts +26 -0
  1225. package/src/widgets-v2/note/widget-note.test.tsx +158 -0
  1226. package/src/widgets-v2/note/widget-note.tsx +172 -0
  1227. package/src/widgets-v2/pie/download.test.ts +78 -0
  1228. package/src/widgets-v2/pie/download.ts +51 -0
  1229. package/src/widgets-v2/pie/index.ts +10 -0
  1230. package/src/widgets-v2/pie/options.test.ts +938 -0
  1231. package/src/widgets-v2/pie/options.ts +606 -0
  1232. package/src/widgets-v2/pie/skeleton.test.tsx +20 -0
  1233. package/src/widgets-v2/pie/skeleton.tsx +94 -0
  1234. package/src/widgets-v2/pie/types.ts +62 -0
  1235. package/src/widgets-v2/provider/widget-provider.test.tsx +119 -0
  1236. package/src/widgets-v2/provider/widget-provider.tsx +111 -0
  1237. package/src/widgets-v2/range/index.ts +4 -0
  1238. package/src/widgets-v2/range/range-ui.test.tsx +136 -0
  1239. package/src/widgets-v2/range/range-ui.tsx +278 -0
  1240. package/src/widgets-v2/range/range.test.tsx +68 -0
  1241. package/src/widgets-v2/range/range.tsx +52 -0
  1242. package/src/widgets-v2/range/skeleton.test.tsx +17 -0
  1243. package/src/widgets-v2/range/skeleton.tsx +47 -0
  1244. package/src/widgets-v2/range/style.ts +41 -0
  1245. package/src/widgets-v2/range/types.ts +37 -0
  1246. package/src/widgets-v2/scatterplot/download.test.ts +71 -0
  1247. package/src/widgets-v2/scatterplot/download.ts +50 -0
  1248. package/src/widgets-v2/scatterplot/index.ts +14 -0
  1249. package/src/widgets-v2/scatterplot/options.test.ts +411 -0
  1250. package/src/widgets-v2/scatterplot/options.ts +422 -0
  1251. package/src/widgets-v2/scatterplot/skeleton.test.tsx +17 -0
  1252. package/src/widgets-v2/scatterplot/skeleton.tsx +84 -0
  1253. package/src/widgets-v2/scatterplot/transforms.test.ts +134 -0
  1254. package/src/widgets-v2/scatterplot/transforms.ts +61 -0
  1255. package/src/widgets-v2/scatterplot/types.ts +59 -0
  1256. package/src/widgets-v2/selection-summary/labels.ts +15 -0
  1257. package/src/widgets-v2/selection-summary/selection-summary.test.tsx +59 -0
  1258. package/src/widgets-v2/selection-summary/selection-summary.tsx +82 -0
  1259. package/src/widgets-v2/selection-summary/style.ts +38 -0
  1260. package/src/widgets-v2/spread/band.test.ts +46 -0
  1261. package/src/widgets-v2/spread/band.ts +47 -0
  1262. package/src/widgets-v2/spread/download.test.ts +64 -0
  1263. package/src/widgets-v2/spread/download.ts +55 -0
  1264. package/src/widgets-v2/spread/index.ts +11 -0
  1265. package/src/widgets-v2/spread/separator.tsx +11 -0
  1266. package/src/widgets-v2/spread/skeleton.test.tsx +17 -0
  1267. package/src/widgets-v2/spread/skeleton.tsx +38 -0
  1268. package/src/widgets-v2/spread/spread-ui.test.tsx +108 -0
  1269. package/src/widgets-v2/spread/spread-ui.tsx +52 -0
  1270. package/src/widgets-v2/spread/spread.test.tsx +50 -0
  1271. package/src/widgets-v2/spread/spread.tsx +31 -0
  1272. package/src/widgets-v2/spread/types.ts +27 -0
  1273. package/src/widgets-v2/state/labels.test.ts +33 -0
  1274. package/src/widgets-v2/state/labels.ts +20 -0
  1275. package/src/widgets-v2/state/style.ts +25 -0
  1276. package/src/widgets-v2/state/widget-state.test.tsx +294 -0
  1277. package/src/widgets-v2/state/widget-state.tsx +184 -0
  1278. package/src/widgets-v2/stores/index.ts +49 -0
  1279. package/src/widgets-v2/stores/pipeline-middleware.test.ts +187 -0
  1280. package/src/widgets-v2/stores/pipeline-middleware.ts +91 -0
  1281. package/src/widgets-v2/stores/transforms.test.ts +162 -0
  1282. package/src/widgets-v2/stores/transforms.ts +70 -0
  1283. package/src/widgets-v2/stores/types.ts +64 -0
  1284. package/src/widgets-v2/stores/use-echart-instance.test.tsx +91 -0
  1285. package/src/widgets-v2/stores/use-echart-instance.ts +29 -0
  1286. package/src/widgets-v2/stores/use-transform-enabled.test.tsx +127 -0
  1287. package/src/widgets-v2/stores/use-transform-enabled.ts +25 -0
  1288. package/src/widgets-v2/stores/use-transform.test.tsx +262 -0
  1289. package/src/widgets-v2/stores/use-transform.ts +158 -0
  1290. package/src/widgets-v2/stores/widget-context.test.tsx +58 -0
  1291. package/src/widgets-v2/stores/widget-context.ts +15 -0
  1292. package/src/widgets-v2/stores/widget-store-registry.test.ts +292 -0
  1293. package/src/widgets-v2/stores/widget-store-registry.ts +239 -0
  1294. package/src/widgets-v2/subheader/style.ts +12 -0
  1295. package/src/widgets-v2/subheader/subheader.test.tsx +30 -0
  1296. package/src/widgets-v2/subheader/subheader.tsx +16 -0
  1297. package/src/widgets-v2/table/download.test.ts +85 -0
  1298. package/src/widgets-v2/table/download.ts +43 -0
  1299. package/src/widgets-v2/table/helpers.test.ts +233 -0
  1300. package/src/widgets-v2/table/helpers.ts +131 -0
  1301. package/src/widgets-v2/table/index.ts +24 -0
  1302. package/src/widgets-v2/table/labels.tsx +41 -0
  1303. package/src/widgets-v2/table/skeleton.test.tsx +26 -0
  1304. package/src/widgets-v2/table/skeleton.tsx +65 -0
  1305. package/src/widgets-v2/table/style.ts +43 -0
  1306. package/src/widgets-v2/table/table-ui.test.tsx +200 -0
  1307. package/src/widgets-v2/table/table-ui.tsx +364 -0
  1308. package/src/widgets-v2/table/table.test.tsx +119 -0
  1309. package/src/widgets-v2/table/table.tsx +179 -0
  1310. package/src/widgets-v2/table/transforms.test.ts +40 -0
  1311. package/src/widgets-v2/table/transforms.ts +28 -0
  1312. package/src/widgets-v2/table/types.ts +55 -0
  1313. package/src/widgets-v2/test-utils.ts +107 -0
  1314. package/src/widgets-v2/timeseries/download.test.ts +95 -0
  1315. package/src/widgets-v2/timeseries/download.ts +82 -0
  1316. package/src/widgets-v2/timeseries/index.ts +11 -0
  1317. package/src/widgets-v2/timeseries/options.test.ts +399 -0
  1318. package/src/widgets-v2/timeseries/options.ts +342 -0
  1319. package/src/widgets-v2/timeseries/skeleton.test.tsx +13 -0
  1320. package/src/widgets-v2/timeseries/skeleton.tsx +76 -0
  1321. package/src/widgets-v2/timeseries/transforms.test.ts +49 -0
  1322. package/src/widgets-v2/timeseries/transforms.ts +31 -0
  1323. package/src/widgets-v2/timeseries/types.ts +65 -0
  1324. package/src/widgets-v2/toolbox/labels.ts +9 -0
  1325. package/src/widgets-v2/toolbox/style.ts +33 -0
  1326. package/src/widgets-v2/toolbox/toolbox.test.tsx +200 -0
  1327. package/src/widgets-v2/toolbox/toolbox.tsx +309 -0
  1328. package/src/widgets-v2/types.ts +25 -0
  1329. package/src/widgets-v2/utils/data-zoom-layout.ts +26 -0
  1330. package/src/widgets-v2/utils/index.ts +3 -0
  1331. package/src/widgets-v2/utils/merge-options.test.ts +52 -0
  1332. package/src/widgets-v2/utils/merge-options.ts +50 -0
  1333. package/src/widgets-v2/utils/resolve-theme-color.test.ts +43 -0
  1334. package/src/widgets-v2/utils/resolve-theme-color.ts +34 -0
  1335. package/src/widgets-v2/wrapper/index.ts +14 -0
  1336. package/src/widgets-v2/wrapper/labels.ts +11 -0
  1337. package/src/widgets-v2/wrapper/style.ts +128 -0
  1338. package/src/widgets-v2/wrapper/widget-actions.test.tsx +52 -0
  1339. package/src/widgets-v2/wrapper/widget-actions.tsx +43 -0
  1340. package/src/widgets-v2/wrapper/widget-content.test.tsx +27 -0
  1341. package/src/widgets-v2/wrapper/widget-content.tsx +29 -0
  1342. package/src/widgets-v2/wrapper/widget-wrapper.test.tsx +255 -0
  1343. package/src/widgets-v2/wrapper/widget-wrapper.tsx +194 -0
  1344. package/dist/cjs-D9ro6BXv.js +0 -85
  1345. package/dist/cjs-D9ro6BXv.js.map +0 -1
  1346. package/dist/components.js.map +0 -1
  1347. package/dist/error-B2IJ9d2h.js +0 -38
  1348. package/dist/error-B2IJ9d2h.js.map +0 -1
  1349. package/dist/exports-Cr43OCul.js +0 -51
  1350. package/dist/exports-Cr43OCul.js.map +0 -1
  1351. package/dist/lasso-tool-CYn3ivf-.js +0 -534
  1352. package/dist/lasso-tool-CYn3ivf-.js.map +0 -1
  1353. package/dist/markdown-ui-CpNYUPqC.js +0 -68
  1354. package/dist/markdown-ui-CpNYUPqC.js.map +0 -1
  1355. package/dist/no-data-C54XJt13.js +0 -61
  1356. package/dist/no-data-C54XJt13.js.map +0 -1
  1357. package/dist/note-Clng2ej6.js +0 -124
  1358. package/dist/note-Clng2ej6.js.map +0 -1
  1359. package/dist/options-D9wflre6.js +0 -49
  1360. package/dist/options-D9wflre6.js.map +0 -1
  1361. package/dist/row-DLKZN5aF.js +0 -33
  1362. package/dist/row-DLKZN5aF.js.map +0 -1
  1363. package/dist/row-DrHwXNvF.js +0 -35
  1364. package/dist/row-DrHwXNvF.js.map +0 -1
  1365. package/dist/series-Cf1QPZHV.js +0 -83
  1366. package/dist/series-Cf1QPZHV.js.map +0 -1
  1367. package/dist/series-Do02NQUF.js +0 -91
  1368. package/dist/series-Do02NQUF.js.map +0 -1
  1369. package/dist/smart-tooltip-BEtBaIdz.js +0 -39
  1370. package/dist/smart-tooltip-BEtBaIdz.js.map +0 -1
  1371. package/dist/styles-CcC5L2cr.js +0 -77
  1372. package/dist/styles-CcC5L2cr.js.map +0 -1
  1373. package/dist/styles-dOu_pRNb.js +0 -77
  1374. package/dist/styles-dOu_pRNb.js.map +0 -1
  1375. package/dist/tooltip-BDnrRKrp.js +0 -25
  1376. package/dist/tooltip-BDnrRKrp.js.map +0 -1
  1377. package/dist/types/common/common.d.ts +0 -3
  1378. package/dist/types/common/index.d.ts +0 -26
  1379. package/dist/types/common/lasso-tools.d.ts +0 -36
  1380. package/dist/types/common/measurement-tools.d.ts +0 -65
  1381. package/dist/types/hooks/use-debounce.d.ts +0 -19
  1382. package/dist/types/widgets/_shared/chart-config/index.d.ts +0 -7
  1383. package/dist/types/widgets/_shared/chart-config/option-builders.d.ts +0 -34
  1384. package/dist/types/widgets/actions/relative-data/style.d.ts +0 -8
  1385. package/dist/types/widgets/actions/relative-data/utils.test.d.ts +0 -1
  1386. package/dist/types/widgets/actions/zoom-toggle/index.d.ts +0 -2
  1387. package/dist/types/widgets/category/components/index.d.ts +0 -10
  1388. package/dist/types/widgets/index.d.ts +0 -8
  1389. package/dist/types/widgets/range/serializer.test.d.ts +0 -1
  1390. package/dist/types/widgets/root/index.d.ts +0 -3
  1391. package/dist/types/widgets/root/root.d.ts +0 -2
  1392. package/dist/types/widgets/root/types.d.ts +0 -9
  1393. package/dist/types/widgets/root/utils.d.ts +0 -1
  1394. package/dist/types/widgets/stores/widget-store.test.d.ts +0 -1
  1395. package/dist/types/widgets/table/components/index.d.ts +0 -4
  1396. package/dist/types/widgets/table/helpers.test.d.ts +0 -1
  1397. package/dist/types/widgets/table/hooks/index.d.ts +0 -6
  1398. package/dist/types/widgets/table/hooks/use-pagination.test.d.ts +0 -1
  1399. package/dist/types/widgets/table/hooks/use-selection.test.d.ts +0 -1
  1400. package/dist/types/widgets/table/hooks/use-sort.test.d.ts +0 -1
  1401. package/dist/utils-DNtU8q7E.js +0 -144
  1402. package/dist/utils-DNtU8q7E.js.map +0 -1
  1403. package/dist/utils-Dv5Z47UQ.js +0 -144
  1404. package/dist/utils-Dv5Z47UQ.js.map +0 -1
  1405. package/dist/widget-store-CB6Trp_0.js +0 -131
  1406. package/dist/widget-store-CB6Trp_0.js.map +0 -1
  1407. package/dist/widget-store-yDO2ul8g.js +0 -44
  1408. package/dist/widget-store-yDO2ul8g.js.map +0 -1
  1409. package/dist/widgets/actions.js.map +0 -1
  1410. package/dist/widgets/echart.js.map +0 -1
  1411. package/dist/widgets/formula.js.map +0 -1
  1412. package/dist/widgets/root.js +0 -68
  1413. package/dist/widgets/root.js.map +0 -1
  1414. package/dist/widgets/stores.js.map +0 -1
  1415. package/dist/widgets.js +0 -11
  1416. package/dist/widgets.js.map +0 -1
  1417. /package/dist/types/widgets/{_shared → utils}/chart-config/csv-modifiers.d.ts +0 -0
  1418. /package/dist/types/widgets/{_shared → utils}/skeleton/styles.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components-FED-ArwH.js","names":["<path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M4 18a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm16 0a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm-2.829 1a2.996 2.996 0 0 0 0 2H6.829a2.995 2.995 0 0 0 0-2h10.342Zm-2.463-5.707 3.998 4a3.013 3.013 0 0 0-1.414 1.414l-4-3.999a3.014 3.014 0 0 0 1.31-1.214l.106-.201ZM2.998 6.829a2.995 2.995 0 0 0 2.002 0v10.342a2.993 2.993 0 0 0-2.002 0V6.83ZM12 10a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm1.84-3.919c.464.483 1.09.81 1.79.896l-1.47 2.94a2.992 2.992 0 0 0-1.79-.894l1.47-2.942ZM16 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4ZM4 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm9.171.998a2.994 2.994 0 0 0 0 2.002H6.829a2.995 2.995 0 0 0 0-2.002h6.342Z'\n fill='currentColor'\n />","<svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M4 18a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm16 0a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm-2.829 1a2.996 2.996 0 0 0 0 2H6.829a2.995 2.995 0 0 0 0-2h10.342Zm-2.463-5.707 3.998 4a3.013 3.013 0 0 0-1.414 1.414l-4-3.999a3.014 3.014 0 0 0 1.31-1.214l.106-.201ZM2.998 6.829a2.995 2.995 0 0 0 2.002 0v10.342a2.993 2.993 0 0 0-2.002 0V6.83ZM12 10a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm1.84-3.919c.464.483 1.09.81 1.79.896l-1.47 2.94a2.992 2.992 0 0 0-1.79-.894l1.47-2.942ZM16 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4ZM4 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm9.171.998a2.994 2.994 0 0 0 0 2.002H6.829a2.995 2.995 0 0 0 0-2.002h6.342Z'\n fill='currentColor'\n />\n </svg>","<path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M4 18a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm16 0a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm-2.829 1a2.993 2.993 0 0 0-.17.974l-.001.052.007.183a3 3 0 0 0 .164.79H6.829a2.995 2.995 0 0 0 0-2h10.342ZM2.998 6.828a2.995 2.995 0 0 0 2.002 0V17.17a2.993 2.993 0 0 0-2.002 0V6.83Zm16.001 0a2.995 2.995 0 0 0 2 0V17.17a2.993 2.993 0 0 0-2 0V6.829ZM20 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4ZM4 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm13.171.998a2.991 2.991 0 0 0-.17.976L17 4.026l.007.183a3 3 0 0 0 .164.79H6.829a2.995 2.995 0 0 0 0-2H17.17Z'\n fill='currentColor'\n />","<svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M4 18a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm16 0a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm-2.829 1a2.993 2.993 0 0 0-.17.974l-.001.052.007.183a3 3 0 0 0 .164.79H6.829a2.995 2.995 0 0 0 0-2h10.342ZM2.998 6.828a2.995 2.995 0 0 0 2.002 0V17.17a2.993 2.993 0 0 0-2.002 0V6.83Zm16.001 0a2.995 2.995 0 0 0 2 0V17.17a2.993 2.993 0 0 0-2 0V6.829ZM20 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4ZM4 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm13.171.998a2.991 2.991 0 0 0-.17.976L17 4.026l.007.183a3 3 0 0 0 .164.79H6.829a2.995 2.995 0 0 0 0-2H17.17Z'\n fill='currentColor'\n />\n </svg>","<path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M12 2c5.523 0 10 4.477 10 10s-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2Zm0 2a8 8 0 1 0 0 16 8 8 0 0 0 0-16Zm0 6a2 2 0 1 1 0 4 2 2 0 0 1 0-4Z'\n fill='currentColor'\n />","<svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M12 2c5.523 0 10 4.477 10 10s-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2Zm0 2a8 8 0 1 0 0 16 8 8 0 0 0 0-16Zm0 6a2 2 0 1 1 0 4 2 2 0 0 1 0-4Z'\n fill='currentColor'\n />\n </svg>","<path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M12 3c4.935 0 9 3.736 9 9l-.002.343-.012.668c-.012.438-.033.86-.062 1.266l-.05.597C20.498 18.767 19.267 21 17 21c-1.192 0-1.971-.341-2.988-1.122l-.472-.375c-.401-.319-.64-.473-.888-.566a4.938 4.938 0 0 0-.415-.13l-.34-.085-.398-.086-.456-.086-.66-.111-1.708-.273a9.112 9.112 0 0 1-.952-.206C5.46 17.301 3 14.954 3 12.015c0-1.508.485-2.995 1.436-4.458.355.585.906 1.04 1.562 1.272C5.328 9.916 5 10.977 5 12.015c0 1.889 1.78 3.588 3.282 4.025l.085.023.345.076.517.092 1.619.257.583.1.518.098.237.05.433.103c.272.07.512.143.73.224.434.161.783.373 1.235.718l.457.362c.806.646 1.24.857 1.959.857.893 0 1.63-1.518 1.895-4.45l.045-.585c.013-.2.024-.407.033-.62l.02-.655c.005-.224.007-.454.007-.69 0-4.12-3.133-7-7-7a1 1 0 1 1 0-2ZM7 4a2 2 0 1 1 0 4 2 2 0 0 1 0-4Z'\n fill='currentColor'\n />","<svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M12 3c4.935 0 9 3.736 9 9l-.002.343-.012.668c-.012.438-.033.86-.062 1.266l-.05.597C20.498 18.767 19.267 21 17 21c-1.192 0-1.971-.341-2.988-1.122l-.472-.375c-.401-.319-.64-.473-.888-.566a4.938 4.938 0 0 0-.415-.13l-.34-.085-.398-.086-.456-.086-.66-.111-1.708-.273a9.112 9.112 0 0 1-.952-.206C5.46 17.301 3 14.954 3 12.015c0-1.508.485-2.995 1.436-4.458.355.585.906 1.04 1.562 1.272C5.328 9.916 5 10.977 5 12.015c0 1.889 1.78 3.588 3.282 4.025l.085.023.345.076.517.092 1.619.257.583.1.518.098.237.05.433.103c.272.07.512.143.73.224.434.161.783.373 1.235.718l.457.362c.806.646 1.24.857 1.959.857.893 0 1.63-1.518 1.895-4.45l.045-.585c.013-.2.024-.407.033-.62l.02-.655c.005-.224.007-.454.007-.69 0-4.12-3.133-7-7-7a1 1 0 1 1 0-2ZM7 4a2 2 0 1 1 0 4 2 2 0 0 1 0-4Z'\n fill='currentColor'\n />\n </svg>","<path\n fillRule='evenodd'\n clipRule='evenodd'\n d='m10.083 19.394.057.113a1 1 0 0 0 1.72.007l2.869-4.786 4.786-2.87a1 1 0 0 0-.121-1.777l-14-6c-.83-.356-1.669.483-1.313 1.313l6.002 14ZM6.905 6.904l9.903 4.244-3.322 1.995-.102.069a1 1 0 0 0-.242.274l-1.992 3.321-4.245-9.903Z'\n fill='currentColor'\n />","<svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='m10.083 19.394.057.113a1 1 0 0 0 1.72.007l2.869-4.786 4.786-2.87a1 1 0 0 0-.121-1.777l-14-6c-.83-.356-1.669.483-1.313 1.313l6.002 14ZM6.905 6.904l9.903 4.244-3.322 1.995-.102.069a1 1 0 0 0-.242.274l-1.992 3.321-4.245-9.903Z'\n fill='currentColor'\n />\n </svg>","<g transform='scale(0.75)'>\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M12 3c4.935 0 9 3.736 9 9l-.002.343-.012.668c-.012.438-.033.86-.062 1.266l-.05.597C20.498 18.767 19.267 21 17 21c-1.192 0-1.971-.341-2.988-1.122l-.472-.375c-.401-.319-.64-.473-.888-.566a4.938 4.938 0 0 0-.415-.13l-.34-.085-.398-.086-.456-.086-.66-.111-1.708-.273a9.112 9.112 0 0 1-.952-.206C5.46 17.301 3 14.954 3 12.015c0-1.508.485-2.995 1.436-4.458.355.585.906 1.04 1.562 1.272C5.328 9.916 5 10.977 5 12.015c0 1.889 1.78 3.588 3.282 4.025l.085.023.345.076.517.092 1.619.257.583.1.518.098.237.05.433.103c.272.07.512.143.73.224.434.161.783.373 1.235.718l.457.362c.806.646 1.24.857 1.959.857.893 0 1.63-1.518 1.895-4.45l.045-.585c.013-.2.024-.407.033-.62l.02-.655c.005-.224.007-.454.007-.69 0-4.12-3.133-7-7-7a1 1 0 1 1 0-2ZM7 4a2 2 0 1 1 0 4 2 2 0 0 1 0-4Z'\n fill='currentColor'\n />\n </g>","<path\n transform='translate(12.5 11.5) scale(0.48)'\n fillRule='evenodd'\n clipRule='evenodd'\n d='m10.083 19.394.057.113a1 1 0 0 0 1.72.007l2.869-4.786 4.786-2.87a1 1 0 0 0-.121-1.777l-14-6c-.83-.356-1.669.483-1.313 1.313l6.002 14ZM6.905 6.904l9.903 4.244-3.322 1.995-.102.069a1 1 0 0 0-.242.274l-1.992 3.321-4.245-9.903Z'\n fill='currentColor'\n />","<svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 24 24'\n {...props}\n >\n <g transform='scale(0.75)'>\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M12 3c4.935 0 9 3.736 9 9l-.002.343-.012.668c-.012.438-.033.86-.062 1.266l-.05.597C20.498 18.767 19.267 21 17 21c-1.192 0-1.971-.341-2.988-1.122l-.472-.375c-.401-.319-.64-.473-.888-.566a4.938 4.938 0 0 0-.415-.13l-.34-.085-.398-.086-.456-.086-.66-.111-1.708-.273a9.112 9.112 0 0 1-.952-.206C5.46 17.301 3 14.954 3 12.015c0-1.508.485-2.995 1.436-4.458.355.585.906 1.04 1.562 1.272C5.328 9.916 5 10.977 5 12.015c0 1.889 1.78 3.588 3.282 4.025l.085.023.345.076.517.092 1.619.257.583.1.518.098.237.05.433.103c.272.07.512.143.73.224.434.161.783.373 1.235.718l.457.362c.806.646 1.24.857 1.959.857.893 0 1.63-1.518 1.895-4.45l.045-.585c.013-.2.024-.407.033-.62l.02-.655c.005-.224.007-.454.007-.69 0-4.12-3.133-7-7-7a1 1 0 1 1 0-2ZM7 4a2 2 0 1 1 0 4 2 2 0 0 1 0-4Z'\n fill='currentColor'\n />\n </g>\n <path\n transform='translate(12.5 11.5) scale(0.48)'\n fillRule='evenodd'\n clipRule='evenodd'\n d='m10.083 19.394.057.113a1 1 0 0 0 1.72.007l2.869-4.786 4.786-2.87a1 1 0 0 0-.121-1.777l-14-6c-.83-.356-1.669.483-1.313 1.313l6.002 14ZM6.905 6.904l9.903 4.244-3.322 1.995-.102.069a1 1 0 0 0-.242.274l-1.992 3.321-4.245-9.903Z'\n fill='currentColor'\n />\n </svg>","<path\n transform='translate(12 12) scale(1.4) translate(-11.625 -12)'\n fillRule='evenodd'\n clipRule='evenodd'\n d='M13.5 5.25C16.3995 5.25 18.75 7.60051 18.75 10.5C18.75 13.0426 16.9425 15.163 14.5424 15.6465C13.7221 17.4758 11.8848 18.75 9.75 18.75C6.85051 18.75 4.5 16.3995 4.5 13.5C4.5 10.9574 6.30747 8.83696 8.70762 8.35348C9.52794 6.52422 11.3652 5.25 13.5 5.25ZM8.26868 10.0539L8.21987 10.0754C6.91155 10.6608 6 11.974 6 13.5C6 15.5711 7.67893 17.25 9.75 17.25C10.9981 17.25 12.1038 16.6402 12.7855 15.7024C10.2239 15.3531 8.25 13.1571 8.25 10.5C8.25 10.3498 8.25631 10.201 8.26868 10.0539ZM9.82552 9.75075L9.80431 9.86051C9.7686 10.0683 9.75 10.282 9.75 10.5C9.75 12.5457 11.3881 14.2088 13.4241 14.2492C13.4742 14.0072 13.5 13.7566 13.5 13.5C13.5 11.4542 11.8617 9.79097 9.82552 9.75075ZM13.5 6.75C12.2519 6.75 11.1462 7.35976 10.4645 8.29764C13.0261 8.64685 15 10.8429 15 13.5C15 13.6502 14.9937 13.799 14.9813 13.9461C16.3152 13.3724 17.25 12.0454 17.25 10.5C17.25 8.42893 15.5711 6.75 13.5 6.75ZM12.75 13.125C12.96 13.125 13.125 13.29 13.125 13.5C13.125 13.71 12.96 13.875 12.75 13.875C12.54 13.875 12.375 13.71 12.375 13.5C12.375 13.29 12.54 13.125 12.75 13.125ZM11.625 12.75C11.835 12.75 12 12.915 12 13.125C12 13.335 11.835 13.5 11.625 13.5C11.415 13.5 11.25 13.335 11.25 13.125C11.25 12.915 11.415 12.75 11.625 12.75ZM12.75 12C12.96 12 13.125 12.165 13.125 12.375C13.125 12.585 12.96 12.75 12.75 12.75C12.54 12.75 12.375 12.585 12.375 12.375C12.375 12.165 12.54 12 12.75 12ZM11.625 11.625C11.835 11.625 12 11.79 12 12C12 12.21 11.835 12.375 11.625 12.375C11.415 12.375 11.25 12.21 11.25 12C11.25 11.79 11.415 11.625 11.625 11.625ZM10.5 11.25C10.71 11.25 10.875 11.415 10.875 11.625C10.875 11.835 10.71 12 10.5 12C10.29 12 10.125 11.835 10.125 11.625C10.125 11.415 10.29 11.25 10.5 11.25ZM11.625 10.5C11.835 10.5 12 10.665 12 10.875C12 11.085 11.835 11.25 11.625 11.25C11.415 11.25 11.25 11.085 11.25 10.875C11.25 10.665 11.415 10.5 11.625 10.5ZM10.5 10.125C10.71 10.125 10.875 10.29 10.875 10.5C10.875 10.71 10.71 10.875 10.5 10.875C10.29 10.875 10.125 10.71 10.125 10.5C10.125 10.29 10.29 10.125 10.5 10.125Z'\n fill='currentColor'\n />","<svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n transform='translate(12 12) scale(1.4) translate(-11.625 -12)'\n fillRule='evenodd'\n clipRule='evenodd'\n d='M13.5 5.25C16.3995 5.25 18.75 7.60051 18.75 10.5C18.75 13.0426 16.9425 15.163 14.5424 15.6465C13.7221 17.4758 11.8848 18.75 9.75 18.75C6.85051 18.75 4.5 16.3995 4.5 13.5C4.5 10.9574 6.30747 8.83696 8.70762 8.35348C9.52794 6.52422 11.3652 5.25 13.5 5.25ZM8.26868 10.0539L8.21987 10.0754C6.91155 10.6608 6 11.974 6 13.5C6 15.5711 7.67893 17.25 9.75 17.25C10.9981 17.25 12.1038 16.6402 12.7855 15.7024C10.2239 15.3531 8.25 13.1571 8.25 10.5C8.25 10.3498 8.25631 10.201 8.26868 10.0539ZM9.82552 9.75075L9.80431 9.86051C9.7686 10.0683 9.75 10.282 9.75 10.5C9.75 12.5457 11.3881 14.2088 13.4241 14.2492C13.4742 14.0072 13.5 13.7566 13.5 13.5C13.5 11.4542 11.8617 9.79097 9.82552 9.75075ZM13.5 6.75C12.2519 6.75 11.1462 7.35976 10.4645 8.29764C13.0261 8.64685 15 10.8429 15 13.5C15 13.6502 14.9937 13.799 14.9813 13.9461C16.3152 13.3724 17.25 12.0454 17.25 10.5C17.25 8.42893 15.5711 6.75 13.5 6.75ZM12.75 13.125C12.96 13.125 13.125 13.29 13.125 13.5C13.125 13.71 12.96 13.875 12.75 13.875C12.54 13.875 12.375 13.71 12.375 13.5C12.375 13.29 12.54 13.125 12.75 13.125ZM11.625 12.75C11.835 12.75 12 12.915 12 13.125C12 13.335 11.835 13.5 11.625 13.5C11.415 13.5 11.25 13.335 11.25 13.125C11.25 12.915 11.415 12.75 11.625 12.75ZM12.75 12C12.96 12 13.125 12.165 13.125 12.375C13.125 12.585 12.96 12.75 12.75 12.75C12.54 12.75 12.375 12.585 12.375 12.375C12.375 12.165 12.54 12 12.75 12ZM11.625 11.625C11.835 11.625 12 11.79 12 12C12 12.21 11.835 12.375 11.625 12.375C11.415 12.375 11.25 12.21 11.25 12C11.25 11.79 11.415 11.625 11.625 11.625ZM10.5 11.25C10.71 11.25 10.875 11.415 10.875 11.625C10.875 11.835 10.71 12 10.5 12C10.29 12 10.125 11.835 10.125 11.625C10.125 11.415 10.29 11.25 10.5 11.25ZM11.625 10.5C11.835 10.5 12 10.665 12 10.875C12 11.085 11.835 11.25 11.625 11.25C11.415 11.25 11.25 11.085 11.25 10.875C11.25 10.665 11.415 10.5 11.625 10.5ZM10.5 10.125C10.71 10.125 10.875 10.29 10.875 10.5C10.875 10.71 10.71 10.875 10.5 10.875C10.29 10.875 10.125 10.71 10.125 10.5C10.125 10.29 10.29 10.125 10.5 10.125Z'\n fill='currentColor'\n />\n </svg>","<path\n transform='translate(12 12) scale(1.33333) translate(-7.5 -7.5)'\n fillRule='evenodd'\n clipRule='evenodd'\n d='M15 7.5C15 11.6421 11.6421 15 7.5 15C3.35786 15 0 11.6421 0 7.5C0 3.35786 3.35786 0 7.5 0C11.6421 0 15 3.35786 15 7.5ZM13.5 7.5C13.5 10.8137 10.8137 13.5 7.5 13.5C6.44531 13.5 5.45418 13.2279 4.59299 12.75H6.85607C7.29596 12.3013 7.67991 11.7975 7.99663 11.25H2.81597C2.62675 11.014 2.45501 10.7633 2.30269 10.5H8.37593C8.58402 10.0237 8.74407 9.52171 8.84997 9H1.68903C1.62614 8.75568 1.57826 8.50533 1.54642 8.25H8.96297C8.98746 8.00332 9 7.75312 9 7.5C9 7.24688 8.98746 6.99668 8.96297 6.75H1.54642C1.57826 6.49467 1.62614 6.24432 1.68903 6H8.84997C8.74407 5.47829 8.58402 4.97625 8.37593 4.5H2.30269C2.45501 4.2367 2.62675 3.98604 2.81597 3.75H7.99663C7.67991 3.20248 7.29596 2.69872 6.85607 2.25H4.59299C5.45418 1.77213 6.44531 1.5 7.5 1.5C10.8137 1.5 13.5 4.18629 13.5 7.5Z'\n fill='currentColor'\n />","<svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n // The exported glyph filled its 15×15 box edge to edge, so next to the\n // MUI icons (whose glyphs leave a margin inside 24×24) it rendered ~20%\n // bigger. Same box and same 20-unit glyph as the rest of the set now.\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n transform='translate(12 12) scale(1.33333) translate(-7.5 -7.5)'\n fillRule='evenodd'\n clipRule='evenodd'\n d='M15 7.5C15 11.6421 11.6421 15 7.5 15C3.35786 15 0 11.6421 0 7.5C0 3.35786 3.35786 0 7.5 0C11.6421 0 15 3.35786 15 7.5ZM13.5 7.5C13.5 10.8137 10.8137 13.5 7.5 13.5C6.44531 13.5 5.45418 13.2279 4.59299 12.75H6.85607C7.29596 12.3013 7.67991 11.7975 7.99663 11.25H2.81597C2.62675 11.014 2.45501 10.7633 2.30269 10.5H8.37593C8.58402 10.0237 8.74407 9.52171 8.84997 9H1.68903C1.62614 8.75568 1.57826 8.50533 1.54642 8.25H8.96297C8.98746 8.00332 9 7.75312 9 7.5C9 7.24688 8.98746 6.99668 8.96297 6.75H1.54642C1.57826 6.49467 1.62614 6.24432 1.68903 6H8.84997C8.74407 5.47829 8.58402 4.97625 8.37593 4.5H2.30269C2.45501 4.2367 2.62675 3.98604 2.81597 3.75H7.99663C7.67991 3.20248 7.29596 2.69872 6.85607 2.25H4.59299C5.45418 1.77213 6.44531 1.5 7.5 1.5C10.8137 1.5 13.5 4.18629 13.5 7.5Z'\n fill='currentColor'\n />\n </svg>","<path\n transform='translate(12 12) scale(1.2597) translate(-7.9385 -5.34375)'\n fillRule='evenodd'\n clipRule='evenodd'\n d='M5.4 0L9.18 10.5H7.56L6.72 8.085H2.475L1.62 10.5H0L3.795 0H5.4ZM4.605 1.95C4.515 2.31 4.395 2.705 4.245 3.135L2.955 6.705H6.24L4.965 3.135C4.785 2.645 4.665 2.25 4.605 1.95ZM12.9247 2.5875C13.3083 2.5875 13.6514 2.6203 13.9542 2.68591C14.257 2.75152 14.5649 2.87769 14.8778 3.06442C15.1907 3.25114 15.4355 3.55143 15.6121 3.96526C15.7887 4.37909 15.877 4.88881 15.877 5.49442V10.5058H14.363V9.83965C13.818 10.4049 13.1114 10.6875 12.2434 10.6875C11.4258 10.6875 10.7622 10.4629 10.2525 10.0138C9.74275 9.5646 9.48789 8.92619 9.48789 8.09853C9.48789 7.26077 9.77555 6.62488 10.3509 6.19086C10.9262 5.75685 11.6277 5.53984 12.4554 5.53984C13.2124 5.53984 13.8483 5.69124 14.363 5.99404V5.57012C14.363 4.99479 14.2318 4.586 13.9694 4.34376C13.707 4.10152 13.2881 3.9804 12.7127 3.9804C11.8649 3.9804 11.1281 4.21255 10.5023 4.67685L10.0329 3.38993C10.8101 2.85498 11.7741 2.5875 12.9247 2.5875ZM12.7127 6.90245C12.2081 6.90245 11.7968 7.00086 11.4788 7.19769C11.1609 7.39451 11.0019 7.69479 11.0019 8.09853C11.0019 8.47199 11.1331 8.7647 11.3955 8.97666C11.658 9.18862 12.0365 9.2946 12.5311 9.2946C13.2578 9.2946 13.8684 9.01703 14.363 8.46189V7.28096C13.8886 7.02862 13.3385 6.90245 12.7127 6.90245Z'\n fill='currentColor'\n />","<svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n // Same reason as SpatialMaskIcon: the exported box was the glyph's own\n // bounding box, so it rendered edge to edge. 20 units wide inside 24×24.\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n transform='translate(12 12) scale(1.2597) translate(-7.9385 -5.34375)'\n fillRule='evenodd'\n clipRule='evenodd'\n d='M5.4 0L9.18 10.5H7.56L6.72 8.085H2.475L1.62 10.5H0L3.795 0H5.4ZM4.605 1.95C4.515 2.31 4.395 2.705 4.245 3.135L2.955 6.705H6.24L4.965 3.135C4.785 2.645 4.665 2.25 4.605 1.95ZM12.9247 2.5875C13.3083 2.5875 13.6514 2.6203 13.9542 2.68591C14.257 2.75152 14.5649 2.87769 14.8778 3.06442C15.1907 3.25114 15.4355 3.55143 15.6121 3.96526C15.7887 4.37909 15.877 4.88881 15.877 5.49442V10.5058H14.363V9.83965C13.818 10.4049 13.1114 10.6875 12.2434 10.6875C11.4258 10.6875 10.7622 10.4629 10.2525 10.0138C9.74275 9.5646 9.48789 8.92619 9.48789 8.09853C9.48789 7.26077 9.77555 6.62488 10.3509 6.19086C10.9262 5.75685 11.6277 5.53984 12.4554 5.53984C13.2124 5.53984 13.8483 5.69124 14.363 5.99404V5.57012C14.363 4.99479 14.2318 4.586 13.9694 4.34376C13.707 4.10152 13.2881 3.9804 12.7127 3.9804C11.8649 3.9804 11.1281 4.21255 10.5023 4.67685L10.0329 3.38993C10.8101 2.85498 11.7741 2.5875 12.9247 2.5875ZM12.7127 6.90245C12.2081 6.90245 11.7968 7.00086 11.4788 7.19769C11.1609 7.39451 11.0019 7.69479 11.0019 8.09853C11.0019 8.47199 11.1331 8.7647 11.3955 8.97666C11.658 9.18862 12.0365 9.2946 12.5311 9.2946C13.2578 9.2946 13.8684 9.01703 14.363 8.46189V7.28096C13.8886 7.02862 13.3385 6.90245 12.7127 6.90245Z'\n fill='currentColor'\n />\n </svg>","{\n value,\n labels,\n onChange,\n maskDisabled = false,\n}: InteractionModeSectionProps","maskDisabled = false","{\n mode: 'mask' as const,\n label: labels?.mask ?? LASSO_TOOLS_LABELS.options.interactionMode.mask,\n }","labels?.mask ?? LASSO_TOOLS_LABELS.options.interactionMode.mask","{\n mode: 'draw' as const,\n label: labels?.draw ?? LASSO_TOOLS_LABELS.options.interactionMode.draw,\n }","labels?.draw ?? LASSO_TOOLS_LABELS.options.interactionMode.draw","[\n {\n mode: 'mask' as const,\n label: labels?.mask ?? LASSO_TOOLS_LABELS.options.interactionMode.mask,\n },\n {\n mode: 'draw' as const,\n label: labels?.draw ?? LASSO_TOOLS_LABELS.options.interactionMode.draw,\n },\n ]","<Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n >\n {labels?.title ?? LASSO_TOOLS_LABELS.options.interactionMode.title}\n </Typography>","labels?.title ?? LASSO_TOOLS_LABELS.options.interactionMode.title","options.map(({ mode, label }) => {\n // The Mask radio is disabled while e.g. the text draw mode is\n // active — text annotations are `draw`-only.\n const disabled = mode === 'mask' && maskDisabled\n return (\n <MenuItem\n key={mode}\n role='menuitemradio'\n aria-checked={value === mode}\n disabled={disabled}\n dense\n onClick={() => {\n if (disabled) return\n onChange(mode)\n }}\n >\n <ListItemIcon sx={{ minWidth: 28 }}>\n <Radio\n size='small'\n checked={value === mode}\n disabled={disabled}\n tabIndex={-1}\n disableRipple\n // Fully decorative: no handler and no pointer events, or a\n // click on the glyph would fire both the input's change AND\n // the MenuItem's click (`readOnly` silences the\n // controlled-without-onChange warning).\n sx={{ p: 0, pointerEvents: 'none' }}\n inputProps={{\n 'aria-hidden': true,\n tabIndex: -1,\n readOnly: true,\n }}\n />\n </ListItemIcon>\n <ListItemText primaryTypographyProps={{ variant: 'body2' }}>\n {label}\n </ListItemText>\n </MenuItem>\n )\n })","{ mode, label }","<>\n <Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n >\n {labels?.title ?? LASSO_TOOLS_LABELS.options.interactionMode.title}\n </Typography>\n {options.map(({ mode, label }) => {\n // The Mask radio is disabled while e.g. the text draw mode is\n // active — text annotations are `draw`-only.\n const disabled = mode === 'mask' && maskDisabled\n return (\n <MenuItem\n key={mode}\n role='menuitemradio'\n aria-checked={value === mode}\n disabled={disabled}\n dense\n onClick={() => {\n if (disabled) return\n onChange(mode)\n }}\n >\n <ListItemIcon sx={{ minWidth: 28 }}>\n <Radio\n size='small'\n checked={value === mode}\n disabled={disabled}\n tabIndex={-1}\n disableRipple\n // Fully decorative: no handler and no pointer events, or a\n // click on the glyph would fire both the input's change AND\n // the MenuItem's click (`readOnly` silences the\n // controlled-without-onChange warning).\n sx={{ p: 0, pointerEvents: 'none' }}\n inputProps={{\n 'aria-hidden': true,\n tabIndex: -1,\n readOnly: true,\n }}\n />\n </ListItemIcon>\n <ListItemText primaryTypographyProps={{ variant: 'body2' }}>\n {label}\n </ListItemText>\n </MenuItem>\n )\n })}\n </>","{\n chipProps,\n value,\n labels,\n onChipToggle,\n onDelete,\n}: Pick<LassoToolsComponentProps, 'chipProps' | 'onDelete' | 'onChipToggle'> & {\n value: LassoToolsData\n labels?: PickDeep<LassoToolsComponentProps['labels'], 'chip'>['chip']\n}","chipProps?.ChipsProps ?? {}","ChipsProps","mergeSx(styles.chip.chip, sx)","value.locked ? (\n <LockOutlined sx={{ fontSize: CHIP_ICON_SIZE }} />\n ) : (\n <SvgIcon\n component={SpatialMaskIcon}\n inheritViewBox\n sx={{ fontSize: CHIP_ICON_SIZE }}\n />\n )","locked","value.locked ? undefined : () => onDelete(value.id)","id","(event) => {\n onChipToggle(value.id, !value.visible)\n onClick?.(event)\n }","visible","<Chip\n sx={mergeSx(styles.chip.chip, sx)}\n color={value.visible ? 'secondary' : 'default'}\n size='small'\n // Padlock when locked; otherwise the mask glyph. Draw geometries are\n // filtered out of the chip strip and never reach this component.\n icon={\n value.locked ? (\n <LockOutlined sx={{ fontSize: CHIP_ICON_SIZE }} />\n ) : (\n <SvgIcon\n component={SpatialMaskIcon}\n inheritViewBox\n sx={{ fontSize: CHIP_ICON_SIZE }}\n />\n )\n }\n // Locked geometries are read-only: the store refuses to delete them\n // anyway, so omitting the handler drops the affordance instead of\n // shipping a delete \"x\" that's a silent no-op.\n onDelete={value.locked ? undefined : () => onDelete(value.id)}\n label={value.label}\n onClick={(event) => {\n onChipToggle(value.id, !value.visible)\n onClick?.(event)\n }}\n {...ChipsProps}\n />","value.visible ? 'secondary' : 'default'","label","<Tooltip title={chipLabel} placement='bottom' {...chipProps?.TooltipProps}>\n <Chip\n sx={mergeSx(styles.chip.chip, sx)}\n color={value.visible ? 'secondary' : 'default'}\n size='small'\n // Padlock when locked; otherwise the mask glyph. Draw geometries are\n // filtered out of the chip strip and never reach this component.\n icon={\n value.locked ? (\n <LockOutlined sx={{ fontSize: CHIP_ICON_SIZE }} />\n ) : (\n <SvgIcon\n component={SpatialMaskIcon}\n inheritViewBox\n sx={{ fontSize: CHIP_ICON_SIZE }}\n />\n )\n }\n // Locked geometries are read-only: the store refuses to delete them\n // anyway, so omitting the handler drops the affordance instead of\n // shipping a delete \"x\" that's a silent no-op.\n onDelete={value.locked ? undefined : () => onDelete(value.id)}\n label={value.label}\n onClick={(event) => {\n onChipToggle(value.id, !value.visible)\n onClick?.(event)\n }}\n {...ChipsProps}\n />\n </Tooltip>","chipProps?.TooltipProps","{\n label,\n shortcut,\n icon,\n active = false,\n pressed,\n disabled = false,\n color,\n 'aria-haspopup': ariaHasPopup,\n 'aria-expanded': ariaExpanded,\n onClick,\n}: LassoToolbarButtonUIProps","active = false","disabled = false","color ? styles.baseButton : styles.toggleButton(active)","<span>\n <IconButton\n aria-label={label}\n aria-pressed={pressed}\n aria-haspopup={ariaHasPopup}\n aria-expanded={ariaExpanded}\n disabled={disabled}\n color={color}\n onClick={onClick}\n sx={color ? styles.baseButton : styles.toggleButton(active)}\n >\n {icon}\n </IconButton>\n </span>","<Tooltip\n title={shortcut ? `${label} (${shortcut})` : label}\n placement='top'\n >\n <span>\n <IconButton\n aria-label={label}\n aria-pressed={pressed}\n aria-haspopup={ariaHasPopup}\n aria-expanded={ariaExpanded}\n disabled={disabled}\n color={color}\n onClick={onClick}\n sx={color ? styles.baseButton : styles.toggleButton(active)}\n >\n {icon}\n </IconButton>\n </span>\n </Tooltip>","shortcut ? `${label} (${shortcut})` : label","{\n disabled = false,\n label,\n shortcut,\n onRedo,\n}: RedoActionProps","disabled = false","<RedoOutlined sx={{ fontSize: ICON_SIZE }} />","<LassoToolbarButtonUI\n label={label ?? REDO_ACTION_LABELS.redo}\n shortcut={shortcut}\n disabled={disabled}\n onClick={onRedo}\n icon={<RedoOutlined sx={{ fontSize: ICON_SIZE }} />}\n />","label ?? REDO_ACTION_LABELS.redo","{\n disabled = false,\n label,\n shortcut,\n onUndo,\n}: UndoActionProps","disabled = false","<UndoOutlined sx={{ fontSize: ICON_SIZE }} />","<LassoToolbarButtonUI\n label={label ?? UNDO_ACTION_LABELS.undo}\n shortcut={shortcut}\n disabled={disabled}\n onClick={onUndo}\n icon={<UndoOutlined sx={{ fontSize: ICON_SIZE }} />}\n />","label ?? UNDO_ACTION_LABELS.undo","{ sx, ...BoxProps } = {}","{\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n labels,\n shortcuts,\n BoxProps: { sx, ...BoxProps } = {},\n}: LassoUndoRedoUIProps","mergeSx(\n { display: 'flex', flexDirection: 'row', alignItems: 'center' },\n sx,\n )","<UndoAction\n disabled={!canUndo}\n label={labels?.undo}\n shortcut={shortcuts?.undo}\n onUndo={onUndo}\n />","!canUndo","labels?.undo","shortcuts?.undo","<RedoAction\n disabled={!canRedo}\n label={labels?.redo}\n shortcut={shortcuts?.redo}\n onRedo={onRedo}\n />","shortcuts?.redo","!canRedo","labels?.redo","<Box\n sx={mergeSx(\n { display: 'flex', flexDirection: 'row', alignItems: 'center' },\n sx,\n )}\n {...BoxProps}\n >\n <UndoAction\n disabled={!canUndo}\n label={labels?.undo}\n shortcut={shortcuts?.undo}\n onUndo={onUndo}\n />\n <RedoAction\n disabled={!canRedo}\n label={labels?.redo}\n shortcut={shortcuts?.redo}\n onRedo={onRedo}\n />\n </Box>","{\n value,\n children,\n}: {\n value: LassoToolsUIContextValue\n children: ReactNode\n}","<LassoToolsUIContext.Provider value={value}>\n {children}\n </LassoToolsUIContext.Provider>","LassoToolsUIContext.Provider","Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n )","([, value]) => value !== undefined","{ ...context, ...defined }","[, value]","{ sx, ...PaperProps } = EMPTY_PAPER_PROPS","{\n enabled,\n values = EMPTY_VALUES,\n actionProps,\n chipProps,\n labels,\n modes,\n modesMapping,\n modeSelected,\n interactionMode,\n PaperProps: { sx, ...PaperProps } = EMPTY_PAPER_PROPS,\n onActionToggle,\n onChipToggle,\n onDelete,\n onChangeMode,\n onChangeInteractionMode,\n interactionModeMaskDisabled,\n onAllChipToggle,\n onAllDelete,\n onLayerFilters,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n shortcuts,\n children,\n}: LassoToolsComponentProps","values = EMPTY_VALUES","{\n enabled,\n values,\n actionProps,\n chipProps,\n labels,\n modes,\n modesMapping,\n modeSelected,\n interactionMode,\n PaperProps,\n onActionToggle,\n onChipToggle,\n onDelete,\n onChangeMode,\n onChangeInteractionMode,\n interactionModeMaskDisabled,\n onAllChipToggle,\n onAllDelete,\n onLayerFilters,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n shortcuts,\n }","mergeSx(styles.container, sx)","<LassoToolsUIProvider value={contextValue}>\n {children}\n </LassoToolsUIProvider>","<Paper\n // Array merge: `sx` can be an object, a function or an array (see mergeSx).\n sx={mergeSx(styles.container, sx)}\n {...PaperProps}\n >\n <LassoToolsUIProvider value={contextValue}>\n {children}\n </LassoToolsUIProvider>\n </Paper>","{\n actionProps,\n labels,\n enabled,\n children,\n onActionToggle,\n}: PropsWithChildren<\n Pick<\n LassoToolsComponentProps,\n 'actionProps' | 'enabled' | 'onActionToggle'\n > & {\n labels?: PickDeep<LassoToolsComponentProps['labels'], 'action'>['action']\n }\n>","() => onActionToggle(!enabled)","<ToggleButton\n value='toggle'\n sx={styles.actions.icon}\n onClick={() => onActionToggle(!enabled)}\n aria-label={actionLabel}\n selected={enabled}\n >\n {children}\n </ToggleButton>","<Tooltip\n title={actionLabel}\n placement='right'\n {...actionProps?.TooltipProps}\n >\n <ToggleButton\n value='toggle'\n sx={styles.actions.icon}\n onClick={() => onActionToggle(!enabled)}\n aria-label={actionLabel}\n selected={enabled}\n >\n {children}\n </ToggleButton>\n </Tooltip>","actionProps?.TooltipProps","{\n TriggerProps = EMPTY_TRIGGER_PROPS,\n MenuProps,\n children,\n}: {\n TriggerProps?: {\n Icon?: ReactNode\n sx?: SxProps<Theme>\n /** Accessible name for the (icon-only) trigger button. */\n 'aria-label'?: string\n }\n MenuProps?: Partial<ComponentProps<typeof Menu>>\n children: (props: OptionsChildrenProps) => JSX.Element\n}","TriggerProps = EMPTY_TRIGGER_PROPS","ariaLabel = LASSO_TOOLS_LABELS.options.mode.title","Icon ?? <ArrowDropDown />","(event: MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget)\n }","() => {\n setAnchorEl(null)\n }","mergeSx(styles.options.icon, sx)","<IconButton\n aria-label={ariaLabel}\n sx={mergeSx(styles.options.icon, sx)}\n onClick={handleToggle}\n >\n {IconNode}\n </IconButton>","{\n sx: styles.options.menu,\n // Focus the LIST on open. The menu's children come from a render\n // prop (a component element), so MUI can never index an item to\n // auto-focus: focus would stay on the Paper and the first ArrowDown\n // would escape to the focus-trap sentinel — keyboard-unreachable.\n // With the list focused, arrow keys traverse the DOM children.\n autoFocus: true,\n }","{ paper: { sx: styles.options.paper } }","children({ onClose: handleClose })","<Menu\n id='lasso-menu'\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n MenuListProps={{\n sx: styles.options.menu,\n // Focus the LIST on open. The menu's children come from a render\n // prop (a component element), so MUI can never index an item to\n // auto-focus: focus would stay on the Paper and the first ArrowDown\n // would escape to the focus-trap sentinel — keyboard-unreachable.\n // With the list focused, arrow keys traverse the DOM children.\n autoFocus: true,\n }}\n // The paper carries the same height ceiling as the list — it clips it\n // otherwise. `slotProps.paper` because `PaperProps` is deprecated.\n slotProps={{ paper: { sx: styles.options.paper } }}\n {...MenuProps}\n >\n {/* No wrapper: MenuList expects its MenuItem/Divider children\n directly, or arrow-key navigation and typeahead break. */}\n {children({ onClose: handleClose })}\n </Menu>","<>\n <IconButton\n aria-label={ariaLabel}\n sx={mergeSx(styles.options.icon, sx)}\n onClick={handleToggle}\n >\n {IconNode}\n </IconButton>\n <Menu\n id='lasso-menu'\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n MenuListProps={{\n sx: styles.options.menu,\n // Focus the LIST on open. The menu's children come from a render\n // prop (a component element), so MUI can never index an item to\n // auto-focus: focus would stay on the Paper and the first ArrowDown\n // would escape to the focus-trap sentinel — keyboard-unreachable.\n // With the list focused, arrow keys traverse the DOM children.\n autoFocus: true,\n }}\n // The paper carries the same height ceiling as the list — it clips it\n // otherwise. `slotProps.paper` because `PaperProps` is deprecated.\n slotProps={{ paper: { sx: styles.options.paper } }}\n {...MenuProps}\n >\n {/* No wrapper: MenuList expects its MenuItem/Divider children\n directly, or arrow-key navigation and typeahead break. */}\n {children({ onClose: handleClose })}\n </Menu>\n </>","{\n data,\n labels,\n children,\n}: {\n labels?: PickDeep<LassoToolsComponentProps['labels'], 'options'>['options']\n data: LassoToolsComponentProps['modes'][keyof LassoToolsModes][]\n children: ReactNode\n}","<Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n >\n {modeTitle}\n </Typography>","<>\n <Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n >\n {modeTitle}\n </Typography>\n {children}\n </>","{\n values,\n labels,\n onAllChipToggle,\n onAllDelete,\n}: LassoToolsUIContextValue","(value) => value.type !== 'draw'","(value) => value.visible","<Divider orientation='vertical' flexItem />","<MoreVertOutlined />","{\n Icon: <MoreVertOutlined />,\n sx: styles.options.more,\n 'aria-label':\n labels?.actions?.more ?? LASSO_TOOLS_LABELS.actions.more,\n }","labels?.actions?.more ?? LASSO_TOOLS_LABELS.actions.more","{\n anchorOrigin: {\n vertical: 'bottom',\n horizontal: 'right',\n },\n transformOrigin: {\n vertical: 'top',\n horizontal: 'right',\n },\n }","(props) => {\n return (\n <>\n <MenuItem\n color='inherit'\n onClick={() => {\n onAllChipToggle?.()\n props.onClose()\n }}\n >\n {toggleAllLabel}\n </MenuItem>\n <Divider />\n <MenuItem\n color='error'\n onClick={() => {\n onAllDelete?.()\n props.onClose()\n }}\n >\n <Typography variant='body2' color='error'>\n {deleteAllLabel}\n </Typography>\n </MenuItem>\n </>\n )\n }","<>\n <Divider orientation='vertical' flexItem />\n <Options\n TriggerProps={{\n Icon: <MoreVertOutlined />,\n sx: styles.options.more,\n 'aria-label':\n labels?.actions?.more ?? LASSO_TOOLS_LABELS.actions.more,\n }}\n MenuProps={{\n anchorOrigin: {\n vertical: 'bottom',\n horizontal: 'right',\n },\n transformOrigin: {\n vertical: 'top',\n horizontal: 'right',\n },\n }}\n >\n {(props) => {\n return (\n <>\n <MenuItem\n color='inherit'\n onClick={() => {\n onAllChipToggle?.()\n props.onClose()\n }}\n >\n {toggleAllLabel}\n </MenuItem>\n <Divider />\n <MenuItem\n color='error'\n onClick={() => {\n onAllDelete?.()\n props.onClose()\n }}\n >\n <Typography variant='body2' color='error'>\n {deleteAllLabel}\n </Typography>\n </MenuItem>\n </>\n )\n }}\n </Options>\n </>","value","{\n modes,\n modesMapping,\n modeSelected,\n actionProps,\n enabled,\n labels,\n onActionToggle,\n}: LassoToolsUIContextValue & {\n labels?: PickDeep<LassoToolsComponentProps['labels'], 'actions'>['actions']\n}","modes ?? {}","modesMapping ?? {}","deepmerge(modes ?? {}, modesMapping ?? {})","useMemo(() => {\n return deepmerge(modes ?? {}, modesMapping ?? {})\n }, [modes, modesMapping])","(data) => {\n return onActionToggle?.(data)\n }","data","<LassoToolsUIAction\n actionProps={actionProps}\n labels={labels?.action}\n enabled={enabled ?? false}\n onActionToggle={handleToggle}\n >\n {modeSelectedValue?.icon}\n </LassoToolsUIAction>","labels?.action","enabled ?? false","modeSelectedValue?.icon","{\n values,\n labels,\n chipProps,\n onDelete,\n onChipToggle,\n onActionToggle,\n}: LassoToolsUIContextValue","(valueId) => {\n onActionToggle?.(false)\n return onDelete?.(valueId)\n }","!!chipValues.length && (\n <Box sx={styles.chip.container}>\n {chipValues.map((value) => (\n <LassoToolsUIChip\n key={value.id}\n value={value}\n labels={labels?.chip}\n chipProps={chipProps}\n onDelete={handleDelete}\n onChipToggle={(id, data) => onChipToggle?.(id, data)}\n />\n ))}\n </Box>\n )","chip","values?.filter","{\n enabled,\n labels,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n shortcuts,\n}: LassoToolsUIContextValue","<>\n <Divider orientation='vertical' flexItem />\n <LassoUndoRedoUI\n canUndo={!!canUndo}\n canRedo={!!canRedo}\n onUndo={onUndo}\n onRedo={onRedo}\n labels={labels?.undoRedo}\n shortcuts={shortcuts}\n />\n </>","!!canUndo","!!canRedo","labels?.undoRedo","{\n modes,\n modesMapping,\n modeSelected,\n interactionMode,\n interactionModeMaskDisabled,\n labels,\n onChangeMode,\n onChangeInteractionMode,\n ...props\n}: LassoToolsUIContextValue & OptionsChildrenProps","modeSelected ? modeSelected in (modes ?? {}) : false","((modeExists ? modeSelected : Object.keys(modes ?? {})[0]) as\n keyof typeof data | undefined) ?? null","Object.values(_modes).filter((mode) => mode?.value)","(mode) => mode?.value","[select, lassoSelect].filter((mode) => mode?.value)","(data) => {\n return onChangeMode?.(data)\n }","!!onChangeInteractionMode && (\n <>\n <InteractionModeSection\n value={interactionMode ?? 'mask'}\n labels={labels?.options?.interactionMode}\n onChange={onChangeInteractionMode}\n maskDisabled={interactionModeMaskDisabled}\n />\n <Divider />\n </>\n )","interactionMode","<OptionsList\n {...props}\n labels={labels?.options}\n data={modesValues}\n modeSelected={mode}\n onChangeMode={handleChangeMode}\n />","labels?.options","<ModeList data={modesValues} labels={labels?.options}>\n <OptionsList\n {...props}\n labels={labels?.options}\n data={modesValues}\n modeSelected={mode}\n onChangeMode={handleChangeMode}\n />\n </ModeList>","selectionModes.length > 0 && (\n <>\n <Divider />\n <Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n >\n {selectionTitle}\n </Typography>\n {/*\n Never gated on `values`: that is the chips list (masks only), so a\n draw-only map would have its selection modes disabled and its draw\n geometries unreachable — they have no chips either. Entering select\n mode with nothing to select is a harmless no-op.\n */}\n <OptionsList\n {...props}\n labels={labels?.options}\n data={selectionModes}\n modeSelected={mode}\n onChangeMode={handleChangeMode}\n />\n </>\n )","options","selectionModes.length","!!props.onLayerFilters && (\n <>\n <Divider />\n <MenuItem\n onClick={() => {\n props.onLayerFilters?.()\n props.onClose()\n }}\n >\n <ListItemIcon sx={styles.options.icons}>\n <LayersOutlined />\n </ListItemIcon>\n <ListItemText>\n {labels?.options?.layerFilters ?? 'Layer filters'}\n </ListItemText>\n </MenuItem>\n </>\n )","layerFilters","props.onLayerFilters","<>\n {!!onChangeInteractionMode && (\n <>\n <InteractionModeSection\n value={interactionMode ?? 'mask'}\n labels={labels?.options?.interactionMode}\n onChange={onChangeInteractionMode}\n maskDisabled={interactionModeMaskDisabled}\n />\n <Divider />\n </>\n )}\n <ModeList data={modesValues} labels={labels?.options}>\n <OptionsList\n {...props}\n labels={labels?.options}\n data={modesValues}\n modeSelected={mode}\n onChangeMode={handleChangeMode}\n />\n </ModeList>\n {selectionModes.length > 0 && (\n <>\n <Divider />\n <Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n >\n {selectionTitle}\n </Typography>\n {/*\n Never gated on `values`: that is the chips list (masks only), so a\n draw-only map would have its selection modes disabled and its draw\n geometries unreachable — they have no chips either. Entering select\n mode with nothing to select is a harmless no-op.\n */}\n <OptionsList\n {...props}\n labels={labels?.options}\n data={selectionModes}\n modeSelected={mode}\n onChangeMode={handleChangeMode}\n />\n </>\n )}\n {!!props.onLayerFilters && (\n <>\n <Divider />\n <MenuItem\n onClick={() => {\n props.onLayerFilters?.()\n props.onClose()\n }}\n >\n <ListItemIcon sx={styles.options.icons}>\n <LayersOutlined />\n </ListItemIcon>\n <ListItemText>\n {labels?.options?.layerFilters ?? 'Layer filters'}\n </ListItemText>\n </MenuItem>\n </>\n )}\n </>","mode","{ sx, ...BoxProps } = EMPTY_BOX_PROPS","{\n enabled,\n values = EMPTY_VALUES,\n chipProps,\n labels,\n modes,\n modesMapping,\n modeSelected,\n interactionMode,\n BoxProps: { sx, ...BoxProps } = EMPTY_BOX_PROPS,\n onChipToggle,\n onDelete,\n onChangeMode,\n onChangeInteractionMode,\n onAllChipToggle,\n onAllDelete,\n onLayerFilters,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n shortcuts,\n children,\n}: LassoToolsInlineComponentProps","values = EMPTY_VALUES","{\n enabled,\n values,\n chipProps,\n labels,\n modes,\n modesMapping,\n modeSelected,\n interactionMode,\n onChipToggle,\n onDelete,\n onChangeMode,\n onChangeInteractionMode,\n onAllChipToggle,\n onAllDelete,\n onLayerFilters,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n shortcuts,\n }","mergeSx(styles.container, sx)","<LassoToolsUIProvider value={contextValue}>\n {children}\n </LassoToolsUIProvider>","<Box\n // Array merge: `sx` can be an object, a function or an array.\n sx={mergeSx(styles.container, sx)}\n {...BoxProps}\n className='inline'\n >\n <LassoToolsUIProvider value={contextValue}>\n {children}\n </LassoToolsUIProvider>\n </Box>","{\n interactionMode,\n labels,\n onChangeInteractionMode,\n children,\n}: LassoToolsUIContextValue & { children?: ReactNode }","{ width: '100%' }","showToggles && (\n <Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n className='inline'\n >\n {title}\n </Typography>\n )","{\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: 1,\n flexWrap: 'wrap',\n width: '100%',\n }","showToggles && (\n <InteractionModeToggles\n value={interactionMode ?? 'mask'}\n labels={labels?.options}\n onChange={onChangeInteractionMode}\n />\n )","options","<Box\n sx={{\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: 1,\n flexWrap: 'wrap',\n width: '100%',\n }}\n >\n {showToggles && (\n <InteractionModeToggles\n value={interactionMode ?? 'mask'}\n labels={labels?.options}\n onChange={onChangeInteractionMode}\n />\n )}\n {children}\n </Box>","<Box sx={{ width: '100%' }}>\n {showToggles && (\n <Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n className='inline'\n >\n {title}\n </Typography>\n )}\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: 1,\n flexWrap: 'wrap',\n width: '100%',\n }}\n >\n {showToggles && (\n <InteractionModeToggles\n value={interactionMode ?? 'mask'}\n labels={labels?.options}\n onChange={onChangeInteractionMode}\n />\n )}\n {children}\n </Box>\n </Box>","{\n enabled,\n modes = {},\n modesMapping = {},\n modeSelected,\n labels,\n onChangeMode,\n}: LassoToolsUIContextValue","modes = {}","modesMapping = {}","deepmerge(modes, modesMapping)","useMemo(() => {\n return deepmerge(modes, modesMapping)\n }, [modes, modesMapping])","[select, lassoSelect].filter((mode) => mode?.value)","(mode) => mode?.value","Object.values(_modes).filter((mode) => mode?.value)","(\n evt: MouseEvent<HTMLElement>,\n mode: NonNullable<(typeof modes)[keyof typeof modes]>['value'],\n ) => {\n evt.preventDefault()\n onChangeMode?.(mode)\n }","mode","<Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n className='inline'\n >\n {modeTitle}\n </Typography>","<OptionsList labels={labels?.options} data={modesValues} />","labels?.options","modesValues.length > 0 && selectionModes.length > 0 && (\n <Divider orientation='vertical' />\n )","length","selectionModes.length > 0 && (\n // Not gated on `values` (chips = masks only): see the floating menu.\n <OptionsList labels={labels?.options} data={selectionModes} />\n )","selectionModes.length","<ToggleButtonGroup\n // `null`, not `undefined`, for \"no selection\": MUI's controlled\n // contract for ToggleButtonGroup expects one or the other\n // consistently, and `undefined` here would flip it in and out of\n // controlled mode across renders (e.g. toggling `enabled`).\n value={modeSelectedValue?.value ?? null}\n exclusive\n className='inline'\n sx={styles.options.menu}\n onChange={handleClick}\n >\n <OptionsList labels={labels?.options} data={modesValues} />\n {/* Only between the two groups when both have entries — otherwise\n a lone divider would lead the row with nothing before it. */}\n {modesValues.length > 0 && selectionModes.length > 0 && (\n <Divider orientation='vertical' />\n )}\n {selectionModes.length > 0 && (\n // Not gated on `values` (chips = masks only): see the floating menu.\n <OptionsList labels={labels?.options} data={selectionModes} />\n )}\n </ToggleButtonGroup>","modeSelectedValue?.value ?? null","<Box>\n <Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n className='inline'\n >\n {modeTitle}\n </Typography>\n {/* Gated on the combined count, not just `modesValues`: a config with\n only selection modes (or one drawing mode + selection modes) still\n has more than one option to pick from and must stay reachable. */}\n <ToggleButtonGroup\n // `null`, not `undefined`, for \"no selection\": MUI's controlled\n // contract for ToggleButtonGroup expects one or the other\n // consistently, and `undefined` here would flip it in and out of\n // controlled mode across renders (e.g. toggling `enabled`).\n value={modeSelectedValue?.value ?? null}\n exclusive\n className='inline'\n sx={styles.options.menu}\n onChange={handleClick}\n >\n <OptionsList labels={labels?.options} data={modesValues} />\n {/* Only between the two groups when both have entries — otherwise\n a lone divider would lead the row with nothing before it. */}\n {modesValues.length > 0 && selectionModes.length > 0 && (\n <Divider orientation='vertical' />\n )}\n {selectionModes.length > 0 && (\n // Not gated on `values` (chips = masks only): see the floating menu.\n <OptionsList labels={labels?.options} data={selectionModes} />\n )}\n </ToggleButtonGroup>\n </Box>","{\n enabled,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n labels,\n shortcuts,\n}: LassoToolsUIContextValue","<Box>\n <LassoUndoRedoUI\n canUndo={!!canUndo}\n canRedo={!!canRedo}\n onUndo={onUndo}\n onRedo={onRedo}\n labels={labels?.undoRedo}\n shortcuts={shortcuts}\n />\n </Box>","!!canUndo","!!canRedo","labels?.undoRedo","{\n values = EMPTY_VALUES,\n chipProps,\n labels,\n onChipToggle,\n onDelete,\n}: LassoToolsUIContextValue","(\n valueId,\n ) => {\n return onDelete?.(valueId)\n }","<Box>\n <NoData hasValues={!!chipValues.length} labels={labels?.noData} />\n {!!chipValues.length && (\n <Box sx={styles.chip.container} className='inline'>\n {chipValues.map((value) => (\n <LassoToolsUIChip\n key={value.id}\n value={value}\n labels={labels?.chip}\n chipProps={chipProps}\n onDelete={handleDelete}\n onChipToggle={onChipToggle ?? (() => undefined)}\n />\n ))}\n </Box>\n )}\n </Box>","chip","noData","(value) => value.type !== 'draw'","<NoData hasValues={!!chipValues.length} labels={labels?.noData} />","!!chipValues.length","labels?.noData","value","() => undefined","{\n values = EMPTY_VALUES,\n labels,\n onAllChipToggle,\n onAllDelete,\n onLayerFilters,\n}: LassoToolsUIContextValue","chipValues.some((value) => value.visible)","(value) => value.visible","{ display: 'flex', alignItems: 'center', gap: 1 }","showBulkActions && (\n <>\n <Button color='inherit' onClick={() => onAllChipToggle?.()}>\n {toggleAllLabel}\n </Button>\n <Button color='error' onClick={() => onAllDelete?.()}>\n {deleteAllLabel}\n </Button>\n </>\n )","showBulkActions && !!onLayerFilters && (\n <Divider orientation='vertical' flexItem />\n )","!!onLayerFilters && (\n <Button color='inherit' onClick={() => onLayerFilters()}>\n {layerFiltersLabel}\n </Button>\n )","<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n {showBulkActions && (\n <>\n <Button color='inherit' onClick={() => onAllChipToggle?.()}>\n {toggleAllLabel}\n </Button>\n <Button color='error' onClick={() => onAllDelete?.()}>\n {deleteAllLabel}\n </Button>\n </>\n )}\n {/* Only between the two groups when both are present — a lone divider\n would lead the row with nothing before it. */}\n {showBulkActions && !!onLayerFilters && (\n <Divider orientation='vertical' flexItem />\n )}\n {!!onLayerFilters && (\n <Button color='inherit' onClick={() => onLayerFilters()}>\n {layerFiltersLabel}\n </Button>\n )}\n </Box>","{\n value,\n labels,\n onChange,\n}: {\n value: LassoGeometryType\n labels?: PickDeep<\n LassoToolsInlineComponentProps['labels'],\n 'options'\n >['options']\n onChange: (mode: LassoGeometryType) => void\n}","(_evt, mode: LassoGeometryType | null) => {\n if (mode) {\n onChange(mode)\n }\n }","<ToggleButton value='mask'>{maskLabel}</ToggleButton>","<ToggleButton value='draw'>{drawLabel}</ToggleButton>","<ToggleButtonGroup\n value={value}\n exclusive\n className='inline'\n sx={styles.options.menu}\n onChange={(_evt, mode: LassoGeometryType | null) => {\n if (mode) {\n onChange(mode)\n }\n }}\n >\n <ToggleButton value='mask'>{maskLabel}</ToggleButton>\n <ToggleButton value='draw'>{drawLabel}</ToggleButton>\n </ToggleButtonGroup>","{\n hasValues,\n labels,\n}: {\n hasValues: boolean\n labels: PickDeep<LassoToolsInlineComponentProps['labels'], 'noData'>['noData']\n}","<Typography variant='body1' color='textSecondary'>\n {title}\n </Typography>","<Typography variant='body2' color='textSecondary'>\n {description}\n </Typography>","<>\n <Typography variant='body1' color='textSecondary'>\n {title}\n </Typography>\n <Typography variant='body2' color='textSecondary'>\n {description}\n </Typography>\n </>","{ sx, ...PaperProps } = {}","{\n children,\n PaperProps: { sx, ...PaperProps } = {},\n ref,\n}: LassoToolbarUIProps","mergeSx(styles.container, sx)","<Paper\n ref={ref}\n elevation={6}\n sx={mergeSx(styles.container, sx)}\n {...PaperProps}\n >\n {children}\n </Paper>","{\n type,\n disabled = false,\n labels,\n onToggleType,\n}: ToggleTypeActionProps","disabled = false","() => onToggleType(type === 'mask' ? 'draw' : 'mask')","<SvgIcon\n component={SpatialMaskIcon}\n inheritViewBox\n sx={{ fontSize: ICON_SIZE }}\n />","<LassoToolbarButtonUI\n label={label}\n active={type === 'mask'}\n pressed={type === 'mask'}\n disabled={disabled}\n onClick={() => onToggleType(type === 'mask' ? 'draw' : 'mask')}\n icon={\n <SvgIcon\n component={SpatialMaskIcon}\n inheritViewBox\n sx={{ fontSize: ICON_SIZE }}\n />\n }\n />","type === 'mask'","{\n label,\n icon,\n disabled = false,\n value,\n options,\n onChange,\n disablePortal = false,\n}: ActionMenuProps<V>","disabled = false","disablePortal = false","(event) => setAnchorEl(event.currentTarget)","<LassoToolbarButtonUI\n label={label}\n active={open}\n disabled={disabled}\n aria-haspopup='menu'\n aria-expanded={open || undefined}\n onClick={(event) => setAnchorEl(event.currentTarget)}\n icon={icon}\n />","open || undefined","() => setAnchorEl(null)","{ vertical: 'bottom', horizontal: 'left' }","{ vertical: 'top', horizontal: 'left' }","disablePortal\n ? {\n root: {\n onMouseDown: (event: MouseEvent) => {\n event.stopPropagation()\n },\n },\n }\n : undefined","(event: MouseEvent) => {\n event.stopPropagation()\n }","options.map((option) => (\n <MenuItem\n key={option.value}\n disabled={!!option.disabled}\n selected={option.value === value}\n onClick={() => {\n if (option.onSelect) {\n option.onSelect()\n } else {\n onChange(option.value)\n }\n setAnchorEl(null)\n }}\n >\n {option.icon && (\n <ListItemIcon sx={{ minWidth: 24 }}>{option.icon}</ListItemIcon>\n )}\n <ListItemText>{option.label}</ListItemText>\n </MenuItem>\n ))","(option) => (\n <MenuItem\n key={option.value}\n disabled={!!option.disabled}\n selected={option.value === value}\n onClick={() => {\n if (option.onSelect) {\n option.onSelect()\n } else {\n onChange(option.value)\n }\n setAnchorEl(null)\n }}\n >\n {option.icon && (\n <ListItemIcon sx={{ minWidth: 24 }}>{option.icon}</ListItemIcon>\n )}\n <ListItemText>{option.label}</ListItemText>\n </MenuItem>\n )","<Menu\n anchorEl={anchorEl}\n open={open}\n onClose={() => setAnchorEl(null)}\n disablePortal={disablePortal}\n // Nested menus inside a Popover: don't steal focus / blur the name field\n // in a way that closes the parent via outside-click heuristics.\n disableAutoFocus={disablePortal}\n disableEnforceFocus={disablePortal}\n disableRestoreFocus={disablePortal}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n transformOrigin={{ vertical: 'top', horizontal: 'left' }}\n slotProps={\n disablePortal\n ? {\n root: {\n onMouseDown: (event: MouseEvent) => {\n event.stopPropagation()\n },\n },\n }\n : undefined\n }\n >\n {options.map((option) => (\n <MenuItem\n key={option.value}\n disabled={!!option.disabled}\n selected={option.value === value}\n onClick={() => {\n if (option.onSelect) {\n option.onSelect()\n } else {\n onChange(option.value)\n }\n setAnchorEl(null)\n }}\n >\n {option.icon && (\n <ListItemIcon sx={{ minWidth: 24 }}>{option.icon}</ListItemIcon>\n )}\n <ListItemText>{option.label}</ListItemText>\n </MenuItem>\n ))}\n </Menu>","<>\n <LassoToolbarButtonUI\n label={label}\n active={open}\n disabled={disabled}\n aria-haspopup='menu'\n aria-expanded={open || undefined}\n onClick={(event) => setAnchorEl(event.currentTarget)}\n icon={icon}\n />\n <Menu\n anchorEl={anchorEl}\n open={open}\n onClose={() => setAnchorEl(null)}\n disablePortal={disablePortal}\n // Nested menus inside a Popover: don't steal focus / blur the name field\n // in a way that closes the parent via outside-click heuristics.\n disableAutoFocus={disablePortal}\n disableEnforceFocus={disablePortal}\n disableRestoreFocus={disablePortal}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n transformOrigin={{ vertical: 'top', horizontal: 'left' }}\n slotProps={\n disablePortal\n ? {\n root: {\n onMouseDown: (event: MouseEvent) => {\n event.stopPropagation()\n },\n },\n }\n : undefined\n }\n >\n {options.map((option) => (\n <MenuItem\n key={option.value}\n disabled={!!option.disabled}\n selected={option.value === value}\n onClick={() => {\n if (option.onSelect) {\n option.onSelect()\n } else {\n onChange(option.value)\n }\n setAnchorEl(null)\n }}\n >\n {option.icon && (\n <ListItemIcon sx={{ minWidth: 24 }}>{option.icon}</ListItemIcon>\n )}\n <ListItemText>{option.label}</ListItemText>\n </MenuItem>\n ))}\n </Menu>\n </>","{\n color,\n size = 14,\n}: {\n color: LassoDrawColor\n size?: number\n}","size = 14","isLassoDrawColorPreset(color)\n ? LASSO_DRAW_COLOR_HEX[color]\n : (normalizeHex(color) ?? '#cccccc')","<Box\n component='span'\n sx={{\n display: 'inline-block',\n width: size,\n height: size,\n borderRadius: '50%',\n backgroundColor,\n border: ({ palette }) => `1px solid ${palette.divider}`,\n }}\n />","({ palette }) => `1px solid ${palette.divider}`","{ palette }","{ size = 12 }: { size?: number }","size = 12","<Box\n component='span'\n sx={{\n display: 'inline-block',\n width: size,\n height: size,\n borderRadius: '50%',\n background:\n 'conic-gradient(red, yellow, lime, aqua, blue, magenta, red)',\n border: ({ palette }) => `1px solid ${palette.divider}`,\n }}\n />","{\n value,\n disabled = false,\n labels,\n onChange,\n disablePortal = false,\n}: ColorActionProps","disabled = false","disablePortal = false","() => {\n // Close the MUI Menu first, then open the native dialog on the next tick\n // so focus/z-index fights don't swallow the picker.\n window.setTimeout(() => {\n const input = inputRef.current\n if (!input) return\n input.value = toPickerHex(value)\n input.click()\n }, 0)\n }","<ColorDot color={value} />","[\n ...COLOR_VALUES.map((color) => ({\n value: color as ColorMenuValue,\n label:\n labels?.options?.[color] ?? COLOR_ACTION_LABELS.options[color],\n icon: <ColorDot color={color} size={12} />,\n })),\n {\n value: CUSTOM_MENU_VALUE,\n label:\n labels?.options?.custom ?? COLOR_ACTION_LABELS.options.custom,\n icon: <CustomColorDot />,\n onSelect: openNativePicker,\n },\n ]","options","(color) => ({\n value: color as ColorMenuValue,\n label:\n labels?.options?.[color] ?? COLOR_ACTION_LABELS.options[color],\n icon: <ColorDot color={color} size={12} />,\n })","<CustomColorDot />","{\n value: CUSTOM_MENU_VALUE,\n label:\n labels?.options?.custom ?? COLOR_ACTION_LABELS.options.custom,\n icon: <CustomColorDot />,\n onSelect: openNativePicker,\n }","labels?.options?.custom ?? COLOR_ACTION_LABELS.options.custom","(next) => {\n if (next === CUSTOM_MENU_VALUE) return\n onChange(next)\n }","<ActionMenu\n label={labels?.tooltip ?? COLOR_ACTION_LABELS.tooltip}\n icon={<ColorDot color={value} />}\n disabled={disabled}\n value={menuValue}\n disablePortal={disablePortal}\n options={[\n ...COLOR_VALUES.map((color) => ({\n value: color as ColorMenuValue,\n label:\n labels?.options?.[color] ?? COLOR_ACTION_LABELS.options[color],\n icon: <ColorDot color={color} size={12} />,\n })),\n {\n value: CUSTOM_MENU_VALUE,\n label:\n labels?.options?.custom ?? COLOR_ACTION_LABELS.options.custom,\n icon: <CustomColorDot />,\n onSelect: openNativePicker,\n },\n ]}\n onChange={(next) => {\n if (next === CUSTOM_MENU_VALUE) return\n onChange(next)\n }}\n />","labels?.tooltip ?? COLOR_ACTION_LABELS.tooltip","toPickerHex(value)","(event) => {\n const hex = normalizeHex(event.currentTarget.value)\n if (hex) onChange(hex)\n }","{\n position: 'fixed',\n width: 0,\n height: 0,\n opacity: 0,\n pointerEvents: 'none',\n border: 0,\n padding: 0,\n }","<Box\n component='input'\n ref={inputRef}\n type='color'\n aria-hidden\n tabIndex={-1}\n defaultValue={toPickerHex(value)}\n onChange={(event) => {\n const hex = normalizeHex(event.currentTarget.value)\n if (hex) onChange(hex)\n }}\n sx={{\n position: 'fixed',\n width: 0,\n height: 0,\n opacity: 0,\n pointerEvents: 'none',\n border: 0,\n padding: 0,\n }}\n />","<>\n <ActionMenu\n label={labels?.tooltip ?? COLOR_ACTION_LABELS.tooltip}\n icon={<ColorDot color={value} />}\n disabled={disabled}\n value={menuValue}\n disablePortal={disablePortal}\n options={[\n ...COLOR_VALUES.map((color) => ({\n value: color as ColorMenuValue,\n label:\n labels?.options?.[color] ?? COLOR_ACTION_LABELS.options[color],\n icon: <ColorDot color={color} size={12} />,\n })),\n {\n value: CUSTOM_MENU_VALUE,\n label:\n labels?.options?.custom ?? COLOR_ACTION_LABELS.options.custom,\n icon: <CustomColorDot />,\n onSelect: openNativePicker,\n },\n ]}\n onChange={(next) => {\n if (next === CUSTOM_MENU_VALUE) return\n onChange(next)\n }}\n />\n <Box\n component='input'\n ref={inputRef}\n type='color'\n aria-hidden\n tabIndex={-1}\n defaultValue={toPickerHex(value)}\n onChange={(event) => {\n const hex = normalizeHex(event.currentTarget.value)\n if (hex) onChange(hex)\n }}\n sx={{\n position: 'fixed',\n width: 0,\n height: 0,\n opacity: 0,\n pointerEvents: 'none',\n border: 0,\n padding: 0,\n }}\n />\n </>","{\n label,\n textVisible = false,\n forceTextVisible = false,\n textColor = 'black',\n textBold = false,\n textItalic = false,\n disabled = false,\n labels,\n onRename,\n onSetTextPresentation,\n anchorRef,\n forceClose = false,\n onOpenChange,\n selectionKey,\n}: LabelActionProps","textVisible = false","forceTextVisible = false","textColor = 'black'","textBold = false","textItalic = false","disabled = false","forceClose = false","useCallback((node: HTMLInputElement | null) => {\n node?.focus()\n }, [])","(button: HTMLElement) => {\n committedRef.current = false\n setDraft(label)\n const anchor = anchorRef?.current ?? button\n setAnchorWidth(anchor.clientWidth)\n setAnchorEl(anchor)\n onOpenChange?.(true)\n }","anchorRef?.current","() => {\n if (!committedRef.current) {\n committedRef.current = true\n const next = draft.trim()\n if (next && next !== label) {\n onRename(next)\n }\n }\n }","() => {\n commitName()\n setAnchorEl(null)\n onOpenChange?.(false)\n }","() => {\n committedRef.current = true\n setAnchorEl(null)\n onOpenChange?.(false)\n }","() => {\n if (anchorEl) close()\n }","() => {\n if (forceClose) handleForceClose()\n }","[forceClose]","() => {\n if (anchorEl) cancel()\n }","() => {\n if (prevSelectionKeyRef.current !== selectionKey) {\n prevSelectionKeyRef.current = selectionKey\n handleSelectionChange()\n }\n }","[selectionKey]","(event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n close()\n }\n if (event.key === 'Escape') {\n event.preventDefault()\n cancel()\n }\n }","(event) => openLabel(event.currentTarget)","event","<SvgIcon\n component={TextAaIcon}\n inheritViewBox\n sx={{ fontSize: ICON_SIZE }}\n />","<LassoToolbarButtonUI\n label={actionLabel}\n active={open}\n disabled={disabled}\n onClick={(event) => openLabel(event.currentTarget)}\n icon={\n <SvgIcon\n component={TextAaIcon}\n inheritViewBox\n sx={{ fontSize: ICON_SIZE }}\n />\n }\n />","{ vertical: 'bottom', horizontal: 'left' }","{ vertical: 'top', horizontal: 'left' }","{\n paper: {\n sx: { width: anchorWidth, minWidth: 220 },\n },\n }","{\n p: 1,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n }","(e) => setDraft(e.target.value)","<TextField\n inputRef={focusOnMount}\n fullWidth\n label={nameLabel}\n size='small'\n variant='outlined'\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={commitName}\n />","!forceTextVisible && (\n <FormControlLabel\n control={\n <Checkbox\n size='small'\n checked={textVisible}\n onChange={(e) =>\n onSetTextPresentation({ textVisible: e.target.checked })\n }\n />\n }\n label={<Typography variant='body2'>{showOnMapLabel}</Typography>}\n />\n )","e","{\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n }","(color) => onSetTextPresentation({ textColor: color })","<ColorAction\n value={textColor}\n disabled={!presentationEnabled}\n disablePortal\n onChange={(color) => onSetTextPresentation({ textColor: color })}\n />","!presentationEnabled","() => onSetTextPresentation({ textBold: !textBold })","<FormatBold sx={{ fontSize: ICON_SIZE }} />","<LassoToolbarButtonUI\n label={boldLabel}\n active={textBold}\n pressed={textBold}\n disabled={!presentationEnabled}\n onClick={() => onSetTextPresentation({ textBold: !textBold })}\n icon={<FormatBold sx={{ fontSize: ICON_SIZE }} />}\n />","() => onSetTextPresentation({ textItalic: !textItalic })","<FormatItalic sx={{ fontSize: ICON_SIZE }} />","<LassoToolbarButtonUI\n label={italicLabel}\n active={textItalic}\n pressed={textItalic}\n disabled={!presentationEnabled}\n onClick={() => onSetTextPresentation({ textItalic: !textItalic })}\n icon={<FormatItalic sx={{ fontSize: ICON_SIZE }} />}\n />","<Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n }}\n >\n <ColorAction\n value={textColor}\n disabled={!presentationEnabled}\n disablePortal\n onChange={(color) => onSetTextPresentation({ textColor: color })}\n />\n <LassoToolbarButtonUI\n label={boldLabel}\n active={textBold}\n pressed={textBold}\n disabled={!presentationEnabled}\n onClick={() => onSetTextPresentation({ textBold: !textBold })}\n icon={<FormatBold sx={{ fontSize: ICON_SIZE }} />}\n />\n <LassoToolbarButtonUI\n label={italicLabel}\n active={textItalic}\n pressed={textItalic}\n disabled={!presentationEnabled}\n onClick={() => onSetTextPresentation({ textItalic: !textItalic })}\n icon={<FormatItalic sx={{ fontSize: ICON_SIZE }} />}\n />\n </Box>","<Box\n sx={{\n p: 1,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n }}\n >\n <TextField\n inputRef={focusOnMount}\n fullWidth\n label={nameLabel}\n size='small'\n variant='outlined'\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={commitName}\n />\n\n {!forceTextVisible && (\n <FormControlLabel\n control={\n <Checkbox\n size='small'\n checked={textVisible}\n onChange={(e) =>\n onSetTextPresentation({ textVisible: e.target.checked })\n }\n />\n }\n label={<Typography variant='body2'>{showOnMapLabel}</Typography>}\n />\n )}\n\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n }}\n >\n <ColorAction\n value={textColor}\n disabled={!presentationEnabled}\n disablePortal\n onChange={(color) => onSetTextPresentation({ textColor: color })}\n />\n <LassoToolbarButtonUI\n label={boldLabel}\n active={textBold}\n pressed={textBold}\n disabled={!presentationEnabled}\n onClick={() => onSetTextPresentation({ textBold: !textBold })}\n icon={<FormatBold sx={{ fontSize: ICON_SIZE }} />}\n />\n <LassoToolbarButtonUI\n label={italicLabel}\n active={textItalic}\n pressed={textItalic}\n disabled={!presentationEnabled}\n onClick={() => onSetTextPresentation({ textItalic: !textItalic })}\n icon={<FormatItalic sx={{ fontSize: ICON_SIZE }} />}\n />\n </Box>\n </Box>","<Popover\n open={open}\n anchorEl={anchorEl}\n onClose={close}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n transformOrigin={{ vertical: 'top', horizontal: 'left' }}\n slotProps={{\n paper: {\n sx: { width: anchorWidth, minWidth: 220 },\n },\n }}\n >\n <Box\n sx={{\n p: 1,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n }}\n >\n <TextField\n inputRef={focusOnMount}\n fullWidth\n label={nameLabel}\n size='small'\n variant='outlined'\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={commitName}\n />\n\n {!forceTextVisible && (\n <FormControlLabel\n control={\n <Checkbox\n size='small'\n checked={textVisible}\n onChange={(e) =>\n onSetTextPresentation({ textVisible: e.target.checked })\n }\n />\n }\n label={<Typography variant='body2'>{showOnMapLabel}</Typography>}\n />\n )}\n\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n }}\n >\n <ColorAction\n value={textColor}\n disabled={!presentationEnabled}\n disablePortal\n onChange={(color) => onSetTextPresentation({ textColor: color })}\n />\n <LassoToolbarButtonUI\n label={boldLabel}\n active={textBold}\n pressed={textBold}\n disabled={!presentationEnabled}\n onClick={() => onSetTextPresentation({ textBold: !textBold })}\n icon={<FormatBold sx={{ fontSize: ICON_SIZE }} />}\n />\n <LassoToolbarButtonUI\n label={italicLabel}\n active={textItalic}\n pressed={textItalic}\n disabled={!presentationEnabled}\n onClick={() => onSetTextPresentation({ textItalic: !textItalic })}\n icon={<FormatItalic sx={{ fontSize: ICON_SIZE }} />}\n />\n </Box>\n </Box>\n </Popover>","<>\n <LassoToolbarButtonUI\n label={actionLabel}\n active={open}\n disabled={disabled}\n onClick={(event) => openLabel(event.currentTarget)}\n icon={\n <SvgIcon\n component={TextAaIcon}\n inheritViewBox\n sx={{ fontSize: ICON_SIZE }}\n />\n }\n />\n\n <Popover\n open={open}\n anchorEl={anchorEl}\n onClose={close}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n transformOrigin={{ vertical: 'top', horizontal: 'left' }}\n slotProps={{\n paper: {\n sx: { width: anchorWidth, minWidth: 220 },\n },\n }}\n >\n <Box\n sx={{\n p: 1,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n }}\n >\n <TextField\n inputRef={focusOnMount}\n fullWidth\n label={nameLabel}\n size='small'\n variant='outlined'\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={commitName}\n />\n\n {!forceTextVisible && (\n <FormControlLabel\n control={\n <Checkbox\n size='small'\n checked={textVisible}\n onChange={(e) =>\n onSetTextPresentation({ textVisible: e.target.checked })\n }\n />\n }\n label={<Typography variant='body2'>{showOnMapLabel}</Typography>}\n />\n )}\n\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n }}\n >\n <ColorAction\n value={textColor}\n disabled={!presentationEnabled}\n disablePortal\n onChange={(color) => onSetTextPresentation({ textColor: color })}\n />\n <LassoToolbarButtonUI\n label={boldLabel}\n active={textBold}\n pressed={textBold}\n disabled={!presentationEnabled}\n onClick={() => onSetTextPresentation({ textBold: !textBold })}\n icon={<FormatBold sx={{ fontSize: ICON_SIZE }} />}\n />\n <LassoToolbarButtonUI\n label={italicLabel}\n active={textItalic}\n pressed={textItalic}\n disabled={!presentationEnabled}\n onClick={() => onSetTextPresentation({ textItalic: !textItalic })}\n icon={<FormatItalic sx={{ fontSize: ICON_SIZE }} />}\n />\n </Box>\n </Box>\n </Popover>\n </>","{\n properties,\n disabled = false,\n labels,\n onEditProperties,\n anchorRef,\n forceClose = false,\n onOpenChange,\n selectionKey,\n}: EditPropertiesActionProps","disabled = false","forceClose = false","[]","{ ...EDIT_PROPERTIES_ACTION_LABELS, ...labels }","useMemo(\n () => ({ ...EDIT_PROPERTIES_ACTION_LABELS, ...labels }),\n [labels],\n )","computeErrors(rows, mergedLabels)","useMemo(\n () => computeErrors(rows, mergedLabels),\n [rows, mergedLabels],\n )","() => {\n if (committedRef.current) return\n committedRef.current = true\n onEditProperties(buildDraft(rows))\n setAnchorEl(null)\n onOpenChange?.(false)\n }","() => {\n if (committedRef.current) return\n committedRef.current = true\n setAnchorEl(null)\n onOpenChange?.(false)\n }","(\n _event: unknown,\n reason: 'backdropClick' | 'escapeKeyDown',\n ) => {\n if (reason === 'escapeKeyDown') {\n discard()\n return\n }\n // Outside click: an invalid draft keeps the popover open with its errors.\n if (errors.size > 0) return\n commitValid()\n }","errors.size","() => {\n if (anchorEl) discard()\n }","() => {\n if (forceClose) handleForceClose()\n }","[forceClose]","() => {\n if (prevSelectionKeyRef.current !== selectionKey) {\n prevSelectionKeyRef.current = selectionKey\n handleSelectionChange()\n }\n }","[selectionKey]","(\n uid: number,\n patch: Partial<Pick<EditPropertiesRow, 'key' | 'value'>>,\n ) => {\n setRows((current) =>\n current.map((row) => (row.uid === uid ? { ...row, ...patch } : row)),\n )\n }","uid","(uid: number) => {\n setRows((current) => current.filter((r) => r.uid !== uid))\n }","current","row","event","r","<DataObjectOutlined sx={{ fontSize: ICON_SIZE }} />","{ vertical: 'bottom', horizontal: 'left' }","{ vertical: 'top', horizontal: 'left' }","{\n paper: { sx: { width: anchorWidth, minWidth: 260 } },\n }","{ px: 1.5, py: 1 }","{\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n maxHeight: 280,\n overflowY: 'auto',\n }","e","<AddOutlined sx={{ fontSize: ICON_SIZE }} />","{ justifyContent: 'flex-start', alignSelf: 'flex-start' }","<Button\n size='small'\n startIcon={<AddOutlined sx={{ fontSize: ICON_SIZE }} />}\n onClick={addRow}\n sx={{ justifyContent: 'flex-start', alignSelf: 'flex-start' }}\n >\n {mergedLabels.addRow}\n </Button>","addRow","<Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n maxHeight: 280,\n overflowY: 'auto',\n }}\n >\n {rows.map((row) => {\n const error = errors.get(row.uid)\n return (\n <Box\n key={row.uid}\n sx={{ display: 'flex', flexDirection: 'column', gap: 0.25 }}\n >\n <Box sx={{ display: 'flex', gap: 0.5, alignItems: 'center' }}>\n <TextField\n inputRef={setNodeRef(row.uid, 'key')}\n size='small'\n variant='outlined'\n placeholder={mergedLabels.keyPlaceholder}\n value={row.key}\n error={!!error}\n onChange={(e) =>\n updateRow(row.uid, { key: e.target.value })\n }\n onKeyDown={handleKeyFieldKeyDown(row)}\n sx={{ flex: 1 }}\n />\n <TextField\n inputRef={setNodeRef(row.uid, 'value')}\n size='small'\n variant='outlined'\n placeholder={mergedLabels.valuePlaceholder}\n value={row.value}\n onChange={(e) =>\n updateRow(row.uid, { value: e.target.value })\n }\n onKeyDown={handleValueFieldKeyDown(row)}\n sx={{ flex: 1 }}\n />\n <IconButton\n aria-label={`${mergedLabels.removeRow}${row.key ? `: ${row.key}` : ''}`}\n size='small'\n onClick={() => removeRow(row.uid)}\n >\n <CloseOutlined sx={{ fontSize: ICON_SIZE }} />\n </IconButton>\n </Box>\n {error && (\n <Typography\n variant='caption'\n color='error'\n sx={{ pl: 0.5 }}\n >\n {error}\n </Typography>\n )}\n </Box>\n )\n })}\n\n <Button\n size='small'\n startIcon={<AddOutlined sx={{ fontSize: ICON_SIZE }} />}\n onClick={addRow}\n sx={{ justifyContent: 'flex-start', alignSelf: 'flex-start' }}\n >\n {mergedLabels.addRow}\n </Button>\n </Box>","Box","rows.map((row) => {\n const error = errors.get(row.uid)\n return (\n <Box\n key={row.uid}\n sx={{ display: 'flex', flexDirection: 'column', gap: 0.25 }}\n >\n <Box sx={{ display: 'flex', gap: 0.5, alignItems: 'center' }}>\n <TextField\n inputRef={setNodeRef(row.uid, 'key')}\n size='small'\n variant='outlined'\n placeholder={mergedLabels.keyPlaceholder}\n value={row.key}\n error={!!error}\n onChange={(e) =>\n updateRow(row.uid, { key: e.target.value })\n }\n onKeyDown={handleKeyFieldKeyDown(row)}\n sx={{ flex: 1 }}\n />\n <TextField\n inputRef={setNodeRef(row.uid, 'value')}\n size='small'\n variant='outlined'\n placeholder={mergedLabels.valuePlaceholder}\n value={row.value}\n onChange={(e) =>\n updateRow(row.uid, { value: e.target.value })\n }\n onKeyDown={handleValueFieldKeyDown(row)}\n sx={{ flex: 1 }}\n />\n <IconButton\n aria-label={`${mergedLabels.removeRow}${row.key ? `: ${row.key}` : ''}`}\n size='small'\n onClick={() => removeRow(row.uid)}\n >\n <CloseOutlined sx={{ fontSize: ICON_SIZE }} />\n </IconButton>\n </Box>\n {error && (\n <Typography\n variant='caption'\n color='error'\n sx={{ pl: 0.5 }}\n >\n {error}\n </Typography>\n )}\n </Box>\n )\n })","<Box sx={{ px: 1.5, py: 1 }}>\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n maxHeight: 280,\n overflowY: 'auto',\n }}\n >\n {rows.map((row) => {\n const error = errors.get(row.uid)\n return (\n <Box\n key={row.uid}\n sx={{ display: 'flex', flexDirection: 'column', gap: 0.25 }}\n >\n <Box sx={{ display: 'flex', gap: 0.5, alignItems: 'center' }}>\n <TextField\n inputRef={setNodeRef(row.uid, 'key')}\n size='small'\n variant='outlined'\n placeholder={mergedLabels.keyPlaceholder}\n value={row.key}\n error={!!error}\n onChange={(e) =>\n updateRow(row.uid, { key: e.target.value })\n }\n onKeyDown={handleKeyFieldKeyDown(row)}\n sx={{ flex: 1 }}\n />\n <TextField\n inputRef={setNodeRef(row.uid, 'value')}\n size='small'\n variant='outlined'\n placeholder={mergedLabels.valuePlaceholder}\n value={row.value}\n onChange={(e) =>\n updateRow(row.uid, { value: e.target.value })\n }\n onKeyDown={handleValueFieldKeyDown(row)}\n sx={{ flex: 1 }}\n />\n <IconButton\n aria-label={`${mergedLabels.removeRow}${row.key ? `: ${row.key}` : ''}`}\n size='small'\n onClick={() => removeRow(row.uid)}\n >\n <CloseOutlined sx={{ fontSize: ICON_SIZE }} />\n </IconButton>\n </Box>\n {error && (\n <Typography\n variant='caption'\n color='error'\n sx={{ pl: 0.5 }}\n >\n {error}\n </Typography>\n )}\n </Box>\n )\n })}\n\n <Button\n size='small'\n startIcon={<AddOutlined sx={{ fontSize: ICON_SIZE }} />}\n onClick={addRow}\n sx={{ justifyContent: 'flex-start', alignSelf: 'flex-start' }}\n >\n {mergedLabels.addRow}\n </Button>\n </Box>\n </Box>","<Popover\n open={editing}\n anchorEl={anchorEl}\n onClose={handlePopoverClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n transformOrigin={{ vertical: 'top', horizontal: 'left' }}\n slotProps={{\n paper: { sx: { width: anchorWidth, minWidth: 260 } },\n }}\n >\n <Box sx={{ px: 1.5, py: 1 }}>\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n maxHeight: 280,\n overflowY: 'auto',\n }}\n >\n {rows.map((row) => {\n const error = errors.get(row.uid)\n return (\n <Box\n key={row.uid}\n sx={{ display: 'flex', flexDirection: 'column', gap: 0.25 }}\n >\n <Box sx={{ display: 'flex', gap: 0.5, alignItems: 'center' }}>\n <TextField\n inputRef={setNodeRef(row.uid, 'key')}\n size='small'\n variant='outlined'\n placeholder={mergedLabels.keyPlaceholder}\n value={row.key}\n error={!!error}\n onChange={(e) =>\n updateRow(row.uid, { key: e.target.value })\n }\n onKeyDown={handleKeyFieldKeyDown(row)}\n sx={{ flex: 1 }}\n />\n <TextField\n inputRef={setNodeRef(row.uid, 'value')}\n size='small'\n variant='outlined'\n placeholder={mergedLabels.valuePlaceholder}\n value={row.value}\n onChange={(e) =>\n updateRow(row.uid, { value: e.target.value })\n }\n onKeyDown={handleValueFieldKeyDown(row)}\n sx={{ flex: 1 }}\n />\n <IconButton\n aria-label={`${mergedLabels.removeRow}${row.key ? `: ${row.key}` : ''}`}\n size='small'\n onClick={() => removeRow(row.uid)}\n >\n <CloseOutlined sx={{ fontSize: ICON_SIZE }} />\n </IconButton>\n </Box>\n {error && (\n <Typography\n variant='caption'\n color='error'\n sx={{ pl: 0.5 }}\n >\n {error}\n </Typography>\n )}\n </Box>\n )\n })}\n\n <Button\n size='small'\n startIcon={<AddOutlined sx={{ fontSize: ICON_SIZE }} />}\n onClick={addRow}\n sx={{ justifyContent: 'flex-start', alignSelf: 'flex-start' }}\n >\n {mergedLabels.addRow}\n </Button>\n </Box>\n </Box>\n </Popover>","Popover","{\n locked,\n disabled = false,\n labels,\n onToggleLock,\n}: LockActionProps","disabled = false","() => onToggleLock(!locked)","<LockOutlined sx={{ fontSize: ICON_SIZE }} />","<LassoToolbarButtonUI\n label={label}\n active={locked}\n pressed={locked}\n disabled={disabled}\n onClick={() => onToggleLock(!locked)}\n icon={<LockOutlined sx={{ fontSize: ICON_SIZE }} />}\n />","{\n disabled = false,\n label,\n onDelete,\n}: DeleteActionProps","disabled = false","<DeleteOutlined sx={{ fontSize: ICON_SIZE }} />","<LassoToolbarButtonUI\n label={label ?? DELETE_ACTION_LABELS.delete}\n disabled={disabled}\n onClick={onDelete}\n icon={<DeleteOutlined sx={{ fontSize: ICON_SIZE }} />}\n color='error'\n />","label ?? DELETE_ACTION_LABELS.delete","{\n value,\n disabled = false,\n disableNone = false,\n labels,\n onChange,\n}: FillActionProps","disabled = false","disableNone = false","<OpacityOutlined sx={{ fontSize: ICON_SIZE }} />","FILL_VALUES.map((fill) => ({\n value: fill,\n label: labels?.options?.[fill] ?? FILL_ACTION_LABELS.options[fill],\n disabled: fill === 'none' && disableNone,\n }))","options","<ActionMenu\n label={labels?.tooltip ?? FILL_ACTION_LABELS.tooltip}\n icon={<OpacityOutlined sx={{ fontSize: ICON_SIZE }} />}\n disabled={disabled}\n value={value}\n options={FILL_VALUES.map((fill) => ({\n value: fill,\n label: labels?.options?.[fill] ?? FILL_ACTION_LABELS.options[fill],\n disabled: fill === 'none' && disableNone,\n }))}\n onChange={onChange}\n />","labels?.tooltip ?? FILL_ACTION_LABELS.tooltip","{\n value,\n disabled = false,\n disableNone = false,\n labels,\n onChange,\n}: StrokeActionProps","disabled = false","disableNone = false","<LineWeightOutlined sx={{ fontSize: ICON_SIZE }} />","STROKE_VALUES.map((stroke) => ({\n value: stroke,\n label:\n labels?.options?.[stroke] ?? STROKE_ACTION_LABELS.options[stroke],\n disabled: stroke === 'none' && disableNone,\n }))","options","<ActionMenu\n label={labels?.tooltip ?? STROKE_ACTION_LABELS.tooltip}\n icon={<LineWeightOutlined sx={{ fontSize: ICON_SIZE }} />}\n disabled={disabled}\n value={value}\n options={STROKE_VALUES.map((stroke) => ({\n value: stroke,\n label:\n labels?.options?.[stroke] ?? STROKE_ACTION_LABELS.options[stroke],\n disabled: stroke === 'none' && disableNone,\n }))}\n onChange={onChange}\n />","labels?.tooltip ?? STROKE_ACTION_LABELS.tooltip","{\n active = false,\n disabled = false,\n label,\n onEditGeometry,\n}: EditGeometryActionProps","active = false","disabled = false","<SvgIcon\n component={DrawPolygonIcon}\n inheritViewBox\n sx={{ fontSize: ICON_SIZE }}\n />","<LassoToolbarButtonUI\n label={label ?? EDIT_GEOMETRY_ACTION_LABELS.editGeometry}\n active={active}\n pressed={active}\n disabled={disabled}\n onClick={onEditGeometry}\n // Figma 6985:35312 is the polygon-vertices glyph — the same shape as the\n // drawing tool's, so it is reused instead of duplicating the path.\n icon={\n <SvgIcon\n component={DrawPolygonIcon}\n inheritViewBox\n sx={{ fontSize: ICON_SIZE }}\n />\n }\n />","label ?? EDIT_GEOMETRY_ACTION_LABELS.editGeometry","{\n disabled = false,\n label,\n onUnion,\n}: UnionActionProps","disabled = false","<SvgIcon\n component={UnionIcon}\n inheritViewBox\n sx={{ fontSize: ICON_SIZE }}\n />","<LassoToolbarButtonUI\n label={label ?? UNION_ACTION_LABELS.union}\n disabled={disabled}\n onClick={onUnion}\n icon={\n <SvgIcon\n component={UnionIcon}\n inheritViewBox\n sx={{ fontSize: ICON_SIZE }}\n />\n }\n />","label ?? UNION_ACTION_LABELS.union","{\n disabled = false,\n label,\n onSplit,\n}: SplitActionProps","disabled = false","<CallSplitOutlined sx={{ fontSize: ICON_SIZE }} />","<LassoToolbarButtonUI\n label={label ?? SPLIT_ACTION_LABELS.split}\n disabled={disabled}\n onClick={onSplit}\n icon={<CallSplitOutlined sx={{ fontSize: ICON_SIZE }} />}\n />","label ?? SPLIT_ACTION_LABELS.split","{\n disabled = false,\n label,\n onSubtract,\n}: SubtractActionProps","disabled = false","<JoinLeftOutlined sx={{ fontSize: ICON_SIZE }} />","<LassoToolbarButtonUI\n label={label ?? SUBTRACT_ACTION_LABELS.subtract}\n disabled={disabled}\n onClick={onSubtract}\n icon={<JoinLeftOutlined sx={{ fontSize: ICON_SIZE }} />}\n />","label ?? SUBTRACT_ACTION_LABELS.subtract","{\n disabled = false,\n label,\n onIntersect,\n}: IntersectActionProps","disabled = false","<JoinInnerOutlined sx={{ fontSize: ICON_SIZE }} />","<LassoToolbarButtonUI\n label={label ?? INTERSECT_ACTION_LABELS.intersect}\n disabled={disabled}\n onClick={onIntersect}\n icon={<JoinInnerOutlined sx={{ fontSize: ICON_SIZE }} />}\n />","label ?? INTERSECT_ACTION_LABELS.intersect","{\n disabled = false,\n label,\n onDuplicate,\n}: DuplicateActionProps","disabled = false","<ContentCopyOutlined sx={{ fontSize: ICON_SIZE }} />","<LassoToolbarButtonUI\n label={label ?? DUPLICATE_ACTION_LABELS.duplicate}\n disabled={disabled}\n onClick={onDuplicate}\n icon={<ContentCopyOutlined sx={{ fontSize: ICON_SIZE }} />}\n />","label ?? DUPLICATE_ACTION_LABELS.duplicate","{\n disabled = false,\n label,\n shortcut,\n onAccept,\n}: AcceptActionProps","disabled = false","<KeyboardReturnOutlined sx={{ fontSize: ICON_SIZE }} />","<LassoToolbarButtonUI\n label={label ?? ACCEPT_ACTION_LABELS.accept}\n shortcut={shortcut}\n disabled={disabled}\n onClick={onAccept}\n icon={<KeyboardReturnOutlined sx={{ fontSize: ICON_SIZE }} />}\n />","label ?? ACCEPT_ACTION_LABELS.accept","{\n disabled = false,\n label,\n shortcut,\n onCancel,\n}: CancelActionProps","disabled = false","<CloseOutlined sx={{ fontSize: ICON_SIZE }} />","<LassoToolbarButtonUI\n label={label ?? CANCEL_ACTION_LABELS.cancel}\n shortcut={shortcut}\n disabled={disabled}\n onClick={onCancel}\n icon={<CloseOutlined sx={{ fontSize: ICON_SIZE }} />}\n />","label ?? CANCEL_ACTION_LABELS.cancel","{\n value,\n children,\n}: {\n value: LassoGeometryToolbarContextValue\n children: ReactNode\n}","<LassoGeometryToolbarContext.Provider value={value}>\n {children}\n </LassoGeometryToolbarContext.Provider>","LassoGeometryToolbarContext.Provider","{\n disabled,\n labels,\n}: Pick<ColorActionProps, 'disabled' | 'labels'> = {}","mergeStyleLabels(ctx.labels?.color, labels)","ctx.labels?.color","(color) => ctx.onSetStyle?.({ color })","ctx.onSetStyle","<ColorAction\n value={ctx.style.color}\n disabled={disabled ?? ctx.disabled}\n labels={mergeStyleLabels(ctx.labels?.color, labels)}\n onChange={(color) => ctx.onSetStyle?.({ color })}\n />","color","disabled ?? ctx.disabled","ctx.style.color","{\n disabled,\n labels,\n}: Pick<FillActionProps, 'disabled' | 'labels'> = {}","mergeStyleLabels(ctx.labels?.fill, labels)","ctx.labels?.fill","(fill) => ctx.onSetStyle?.({ fill })","<FillAction\n value={ctx.style.fill}\n disabled={disabled ?? ctx.disabled}\n // Both `none` at once would leave the feature invisible: the store\n // already refuses it, the disabled option just says so upfront.\n disableNone={ctx.style.stroke === 'none'}\n labels={mergeStyleLabels(ctx.labels?.fill, labels)}\n onChange={(fill) => ctx.onSetStyle?.({ fill })}\n />","fill","ctx.style.stroke === 'none'","ctx.style.fill","{\n disabled,\n labels,\n}: Pick<StrokeActionProps, 'disabled' | 'labels'> = {}","mergeStyleLabels(ctx.labels?.stroke, labels)","ctx.labels?.stroke","(stroke) => ctx.onSetStyle?.({ stroke })","<StrokeAction\n value={ctx.style.stroke}\n disabled={disabled ?? ctx.disabled}\n // See ConnectedFillAction: never both fill and stroke at `none`.\n disableNone={ctx.style.fill === 'none'}\n labels={mergeStyleLabels(ctx.labels?.stroke, labels)}\n onChange={(stroke) => ctx.onSetStyle?.({ stroke })}\n />","stroke","ctx.style.fill === 'none'","ctx.style.stroke","{\n disabled,\n label,\n}: Pick<\n EditGeometryActionProps,\n 'disabled' | 'label'\n> = {}","<EditGeometryAction\n active={ctx.editingGeometry ?? false}\n disabled={disabled ?? ctx.singleOnly}\n label={label ?? ctx.labels?.editGeometry}\n onEditGeometry={ctx.onEditGeometry}\n />","onEditGeometry","ctx.editingGeometry ?? false","disabled ?? ctx.singleOnly","label ?? ctx.labels?.editGeometry","{\n disabled,\n labels,\n}: Pick<LabelActionProps, 'disabled' | 'labels'> = {}","{\n label: labels?.label ?? ctx.labels?.label,\n name: labels?.name ?? ctx.labels?.labelName,\n showOnMap: labels?.showOnMap ?? ctx.labels?.showOnMap,\n bold: labels?.bold ?? ctx.labels?.textBold,\n italic: labels?.italic ?? ctx.labels?.textItalic,\n }","labels?.label ?? ctx.labels?.label","labels?.name ?? ctx.labels?.labelName","labels?.showOnMap ?? ctx.labels?.showOnMap","labels?.bold ?? ctx.labels?.textBold","labels?.italic ?? ctx.labels?.textItalic","ctx.selectedIds?.join(',')","selectedIds","(open) => ctx.onOpenPopoverChange?.('label', open)","ctx.onOpenPopoverChange","<LabelAction\n label={ctx.label}\n textVisible={ctx.forceTextVisible ? true : textVisible}\n forceTextVisible={ctx.forceTextVisible}\n textColor={textColor}\n textBold={textBold}\n textItalic={textItalic}\n disabled={disabled ?? ctx.singleOnly}\n labels={{\n label: labels?.label ?? ctx.labels?.label,\n name: labels?.name ?? ctx.labels?.labelName,\n showOnMap: labels?.showOnMap ?? ctx.labels?.showOnMap,\n bold: labels?.bold ?? ctx.labels?.textBold,\n italic: labels?.italic ?? ctx.labels?.textItalic,\n }}\n onRename={ctx.onRename}\n onSetTextPresentation={ctx.onSetTextPresentation}\n anchorRef={ctx.anchorRef}\n selectionKey={ctx.selectedIds?.join(',')}\n forceClose={ctx.openPopoverId === 'editProperties'}\n onOpenChange={(open) => ctx.onOpenPopoverChange?.('label', open)}\n />","anchorRef","forceTextVisible","label","onRename","onSetTextPresentation","ctx.openPopoverId === 'editProperties'","ctx.forceTextVisible ? true : textVisible","{\n disabled,\n labels,\n}: Pick<\n EditPropertiesActionProps,\n 'disabled' | 'labels'\n> = {}","ctx.properties ?? {}","properties","getEditablePropertiesFromFull(ctx.properties ?? {})","{ ...ctx.labels?.editProperties, ...labels }","ctx.labels?.editProperties","(open) => ctx.onOpenPopoverChange?.('editProperties', open)","<EditPropertiesAction\n // `undefined` on a multi-selection: `singleOnly` disables the button\n // before it can ever open with an empty draft. System keys are filtered\n // here so the maps HOC can pass full properties for Label derivation.\n properties={getEditablePropertiesFromFull(ctx.properties ?? {})}\n disabled={disabled ?? ctx.singleOnly}\n labels={{ ...ctx.labels?.editProperties, ...labels }}\n onEditProperties={ctx.onEditProperties}\n anchorRef={ctx.anchorRef}\n selectionKey={ctx.selectedIds?.join(',')}\n forceClose={ctx.openPopoverId === 'label'}\n onOpenChange={(open) => ctx.onOpenPopoverChange?.('editProperties', open)}\n />","onEditProperties","ctx.openPopoverId === 'label'","{\n disabled,\n labels,\n}: Pick<\n ToggleTypeActionProps,\n 'disabled' | 'labels'\n> = {}","{ ...ctx.labels?.toggleType, ...labels }","ctx.labels?.toggleType","<ToggleTypeAction\n type={ctx.type}\n disabled={disabled ?? ctx.disabled}\n labels={{ ...ctx.labels?.toggleType, ...labels }}\n onToggleType={ctx.onToggleType}\n />","onToggleType","type","{\n disabled,\n label,\n}: Pick<UnionActionProps, 'disabled' | 'label'> = {}","<UnionAction\n disabled={disabled ?? (ctx.disabled || (ctx.selectionCount ?? 1) < 2)}\n label={label ?? ctx.labels?.union}\n onUnion={ctx.onUnion}\n />","onUnion","disabled ?? (ctx.disabled || (ctx.selectionCount ?? 1) < 2)","label ?? ctx.labels?.union","{\n disabled,\n label,\n}: Pick<SplitActionProps, 'disabled' | 'label'> = {}","<SplitAction\n disabled={disabled ?? (ctx.singleOnly || !ctx.splittable)}\n label={label ?? ctx.labels?.split}\n onSplit={ctx.onSplit}\n />","onSplit","disabled ?? (ctx.singleOnly || !ctx.splittable)","label ?? ctx.labels?.split","{\n disabled,\n label,\n}: Pick<SubtractActionProps, 'disabled' | 'label'> = {}","<SubtractAction\n disabled={disabled ?? (ctx.disabled || (ctx.selectionCount ?? 1) < 2)}\n label={label ?? ctx.labels?.subtract}\n onSubtract={ctx.onSubtract}\n />","onSubtract","label ?? ctx.labels?.subtract","{\n disabled,\n label,\n}: Pick<IntersectActionProps, 'disabled' | 'label'> = {}","<IntersectAction\n disabled={disabled ?? (ctx.disabled || (ctx.selectionCount ?? 1) < 2)}\n label={label ?? ctx.labels?.intersect}\n onIntersect={ctx.onIntersect}\n />","onIntersect","label ?? ctx.labels?.intersect","{\n disabled,\n label,\n}: Pick<DuplicateActionProps, 'disabled' | 'label'> = {}","<DuplicateAction\n disabled={disabled ?? ctx.disabled}\n label={label ?? ctx.labels?.duplicate}\n onDuplicate={ctx.onDuplicate}\n />","onDuplicate","label ?? ctx.labels?.duplicate","{\n disabled,\n labels,\n}: Pick<LockActionProps, 'disabled' | 'labels'> = {}","{ ...ctx.labels?.lock, ...labels }","ctx.labels?.lock","<LockAction\n locked={ctx.locked ?? false}\n disabled={disabled}\n labels={{ ...ctx.labels?.lock, ...labels }}\n onToggleLock={ctx.onToggleLock}\n />","onToggleLock","ctx.locked ?? false","{\n disabled,\n label,\n}: Pick<DeleteActionProps, 'disabled' | 'label'> = {}","<DeleteAction\n disabled={disabled ?? ctx.disabled}\n label={label ?? ctx.labels?.delete}\n onDelete={ctx.onDelete}\n />","onDelete","label ?? ctx.labels?.delete","{\n type,\n label,\n locked = false,\n selectionCount = 1,\n anyLocked,\n style,\n defaultTextColor,\n onToggleType,\n onRename,\n onSetTextPresentation,\n onToggleLock,\n onDelete,\n onSetStyle,\n onEditGeometry,\n editingGeometry = false,\n onUnion,\n splittable = false,\n onSplit,\n onSubtract,\n onIntersect,\n onDuplicate,\n selectedIds,\n properties,\n onEditProperties,\n forceTextVisible,\n labels,\n PaperProps,\n children,\n}: LassoGeometryToolbarUIProps","locked = false","selectionCount = 1","editingGeometry = false","splittable = false","(id, open) => {\n setOpenPopoverId((current) => {\n if (open) return id\n return current === id ? null : current\n })\n }","{\n type,\n label,\n locked,\n selectionCount,\n anyLocked,\n style,\n defaultTextColor,\n disabled,\n // Single-target actions are also unavailable on a multi-selection.\n singleOnly: disabled || selectionCount > 1,\n // Style pickers only make sense for draw geometries with a style handler\n // (the controller omits `style` when the selection mixes types).\n showStyle: type === 'draw' && !!style && !!onSetStyle,\n editingGeometry,\n labels,\n anchorRef: paperRef,\n splittable,\n onToggleType,\n onRename,\n onSetTextPresentation,\n onToggleLock,\n onDelete,\n onSetStyle,\n onEditGeometry,\n onUnion,\n onSplit,\n onSubtract,\n onIntersect,\n onDuplicate,\n selectedIds,\n properties,\n onEditProperties,\n forceTextVisible,\n openPopoverId,\n onOpenPopoverChange: (id, open) => {\n setOpenPopoverId((current) => {\n if (open) return id\n return current === id ? null : current\n })\n },\n }","disabled || selectionCount > 1","type === 'draw' && !!style && !!onSetStyle","<LassoGeometryToolbarProvider value={value}>\n {children}\n </LassoGeometryToolbarProvider>","<LassoToolbarUI ref={paperRef} PaperProps={PaperProps}>\n <LassoGeometryToolbarProvider value={value}>\n {children}\n </LassoGeometryToolbarProvider>\n </LassoToolbarUI>","{\n open,\n onClose,\n layers,\n onApply,\n labels,\n DialogProps,\n}: LassoLayerFiltersUIProps","() => new Set()","(l) => l.checked","(l) => l.id","layers.length > 0 && layers.every((l) => draft.has(l.id))","layers.length","l","layers.some((l) => draft.has(l.id))","(l) => draft.has(l.id)","(id: string) =>\n setDraft((prev) => {\n const next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })","() =>\n setDraft(allChecked ? new Set() : new Set(layers.map((l) => l.id)))","() => {\n // Emit ids in `layers` order (stable, diff-friendly), not Set-insertion order.\n onApply(layers.filter((l) => draft.has(l.id)).map((l) => l.id))\n onClose()\n }","normalized\n ? layers.filter((l) => l.label.toLowerCase().includes(normalized))\n : layers","<Typography variant='subtitle1' fontWeight={500}>\n {title}\n </Typography>","<Close fontSize='small' />","<IconButton aria-label='close' size='small' onClick={onClose}>\n <Close fontSize='small' />\n </IconButton>","<DialogTitle component='div' sx={titleSx}>\n <Typography variant='subtitle1' fontWeight={500}>\n {title}\n </Typography>\n <IconButton aria-label='close' size='small' onClick={onClose}>\n <Close fontSize='small' />\n </IconButton>\n </DialogTitle>","{ pt: 1, px: 2, pb: 3 }","{ mb: 2 }","<Typography variant='body2' color='text.secondary' sx={{ mb: 2 }}>\n {description}\n </Typography>","<Search sx={{ fontSize: 18 }} />","{ 'aria-label': labels?.search ?? 'Search layers' }","labels?.search ?? 'Search layers'","(e) => setSearch(e.target.value)","{ fontSize: 13, color: 'text.primary' }","<Box sx={searchSx}>\n <Search sx={{ fontSize: 18 }} />\n <InputBase\n fullWidth\n placeholder={labels?.search ?? 'Search layers'}\n inputProps={{ 'aria-label': labels?.search ?? 'Search layers' }}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n sx={{ fontSize: 13, color: 'text.primary' }}\n />\n </Box>","<Divider />","{\n maxHeight: 240,\n overflowY: 'auto',\n // MUI gives dividers inside a List an 8px vertical margin; the\n // \"All selected\" separator should sit flush like the rows.\n '& .MuiDivider-root': { my: 0 },\n }","!normalized && (\n <>\n <ListItemButton dense sx={rowSx} onClick={toggleAll}>\n <ListItemIcon sx={checkboxSlotSx}>\n <Checkbox\n edge='start'\n tabIndex={-1}\n disableRipple\n sx={{ p: 0.5 }}\n checked={allChecked}\n indeterminate={!allChecked && someChecked}\n inputProps={{ 'aria-labelledby': `${labelId}-all` }}\n />\n </ListItemIcon>\n <ListItemText\n id={`${labelId}-all`}\n primary={allSelectedLabel}\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItemButton>\n <Divider />\n </>\n )","filtered.length === 0 ? (\n <Typography variant='body2' color='text.secondary' sx={{ p: 2 }}>\n {empty}\n </Typography>\n ) : (\n filtered.map((layer) => (\n <ListItemButton\n key={layer.id}\n dense\n sx={rowSx}\n onClick={() => toggle(layer.id)}\n >\n <ListItemIcon sx={checkboxSlotSx}>\n <Checkbox\n edge='start'\n tabIndex={-1}\n disableRipple\n sx={{ p: 0.5 }}\n checked={draft.has(layer.id)}\n inputProps={{\n 'aria-labelledby': `${labelId}-${layer.id}`,\n }}\n />\n </ListItemIcon>\n <ListItemText\n id={`${labelId}-${layer.id}`}\n primary={layer.label}\n primaryTypographyProps={{\n variant: 'body2',\n noWrap: true,\n title: layer.label,\n }}\n />\n </ListItemButton>\n ))\n )","filtered.length","<List\n component='div'\n role='list'\n disablePadding\n sx={{\n maxHeight: 240,\n overflowY: 'auto',\n // MUI gives dividers inside a List an 8px vertical margin; the\n // \"All selected\" separator should sit flush like the rows.\n '& .MuiDivider-root': { my: 0 },\n }}\n >\n {/* \"All selected\" master row only makes sense over the full\n list — hide it while a search is narrowing the results. */}\n {!normalized && (\n <>\n <ListItemButton dense sx={rowSx} onClick={toggleAll}>\n <ListItemIcon sx={checkboxSlotSx}>\n <Checkbox\n edge='start'\n tabIndex={-1}\n disableRipple\n sx={{ p: 0.5 }}\n checked={allChecked}\n indeterminate={!allChecked && someChecked}\n inputProps={{ 'aria-labelledby': `${labelId}-all` }}\n />\n </ListItemIcon>\n <ListItemText\n id={`${labelId}-all`}\n primary={allSelectedLabel}\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItemButton>\n <Divider />\n </>\n )}\n {filtered.length === 0 ? (\n <Typography variant='body2' color='text.secondary' sx={{ p: 2 }}>\n {empty}\n </Typography>\n ) : (\n filtered.map((layer) => (\n <ListItemButton\n key={layer.id}\n dense\n sx={rowSx}\n onClick={() => toggle(layer.id)}\n >\n <ListItemIcon sx={checkboxSlotSx}>\n <Checkbox\n edge='start'\n tabIndex={-1}\n disableRipple\n sx={{ p: 0.5 }}\n checked={draft.has(layer.id)}\n inputProps={{\n 'aria-labelledby': `${labelId}-${layer.id}`,\n }}\n />\n </ListItemIcon>\n <ListItemText\n id={`${labelId}-${layer.id}`}\n primary={layer.label}\n primaryTypographyProps={{\n variant: 'body2',\n noWrap: true,\n title: layer.label,\n }}\n />\n </ListItemButton>\n ))\n )}\n </List>","<Box sx={groupSx}>\n <Box sx={searchSx}>\n <Search sx={{ fontSize: 18 }} />\n <InputBase\n fullWidth\n placeholder={labels?.search ?? 'Search layers'}\n inputProps={{ 'aria-label': labels?.search ?? 'Search layers' }}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n sx={{ fontSize: 13, color: 'text.primary' }}\n />\n </Box>\n <Divider />\n <List\n component='div'\n role='list'\n disablePadding\n sx={{\n maxHeight: 240,\n overflowY: 'auto',\n // MUI gives dividers inside a List an 8px vertical margin; the\n // \"All selected\" separator should sit flush like the rows.\n '& .MuiDivider-root': { my: 0 },\n }}\n >\n {/* \"All selected\" master row only makes sense over the full\n list — hide it while a search is narrowing the results. */}\n {!normalized && (\n <>\n <ListItemButton dense sx={rowSx} onClick={toggleAll}>\n <ListItemIcon sx={checkboxSlotSx}>\n <Checkbox\n edge='start'\n tabIndex={-1}\n disableRipple\n sx={{ p: 0.5 }}\n checked={allChecked}\n indeterminate={!allChecked && someChecked}\n inputProps={{ 'aria-labelledby': `${labelId}-all` }}\n />\n </ListItemIcon>\n <ListItemText\n id={`${labelId}-all`}\n primary={allSelectedLabel}\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItemButton>\n <Divider />\n </>\n )}\n {filtered.length === 0 ? (\n <Typography variant='body2' color='text.secondary' sx={{ p: 2 }}>\n {empty}\n </Typography>\n ) : (\n filtered.map((layer) => (\n <ListItemButton\n key={layer.id}\n dense\n sx={rowSx}\n onClick={() => toggle(layer.id)}\n >\n <ListItemIcon sx={checkboxSlotSx}>\n <Checkbox\n edge='start'\n tabIndex={-1}\n disableRipple\n sx={{ p: 0.5 }}\n checked={draft.has(layer.id)}\n inputProps={{\n 'aria-labelledby': `${labelId}-${layer.id}`,\n }}\n />\n </ListItemIcon>\n <ListItemText\n id={`${labelId}-${layer.id}`}\n primary={layer.label}\n primaryTypographyProps={{\n variant: 'body2',\n noWrap: true,\n title: layer.label,\n }}\n />\n </ListItemButton>\n ))\n )}\n </List>\n </Box>","<DialogContent sx={{ pt: 1, px: 2, pb: 3 }}>\n <Typography variant='body2' color='text.secondary' sx={{ mb: 2 }}>\n {description}\n </Typography>\n\n <Box sx={groupSx}>\n <Box sx={searchSx}>\n <Search sx={{ fontSize: 18 }} />\n <InputBase\n fullWidth\n placeholder={labels?.search ?? 'Search layers'}\n inputProps={{ 'aria-label': labels?.search ?? 'Search layers' }}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n sx={{ fontSize: 13, color: 'text.primary' }}\n />\n </Box>\n <Divider />\n <List\n component='div'\n role='list'\n disablePadding\n sx={{\n maxHeight: 240,\n overflowY: 'auto',\n // MUI gives dividers inside a List an 8px vertical margin; the\n // \"All selected\" separator should sit flush like the rows.\n '& .MuiDivider-root': { my: 0 },\n }}\n >\n {/* \"All selected\" master row only makes sense over the full\n list — hide it while a search is narrowing the results. */}\n {!normalized && (\n <>\n <ListItemButton dense sx={rowSx} onClick={toggleAll}>\n <ListItemIcon sx={checkboxSlotSx}>\n <Checkbox\n edge='start'\n tabIndex={-1}\n disableRipple\n sx={{ p: 0.5 }}\n checked={allChecked}\n indeterminate={!allChecked && someChecked}\n inputProps={{ 'aria-labelledby': `${labelId}-all` }}\n />\n </ListItemIcon>\n <ListItemText\n id={`${labelId}-all`}\n primary={allSelectedLabel}\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItemButton>\n <Divider />\n </>\n )}\n {filtered.length === 0 ? (\n <Typography variant='body2' color='text.secondary' sx={{ p: 2 }}>\n {empty}\n </Typography>\n ) : (\n filtered.map((layer) => (\n <ListItemButton\n key={layer.id}\n dense\n sx={rowSx}\n onClick={() => toggle(layer.id)}\n >\n <ListItemIcon sx={checkboxSlotSx}>\n <Checkbox\n edge='start'\n tabIndex={-1}\n disableRipple\n sx={{ p: 0.5 }}\n checked={draft.has(layer.id)}\n inputProps={{\n 'aria-labelledby': `${labelId}-${layer.id}`,\n }}\n />\n </ListItemIcon>\n <ListItemText\n id={`${labelId}-${layer.id}`}\n primary={layer.label}\n primaryTypographyProps={{\n variant: 'body2',\n noWrap: true,\n title: layer.label,\n }}\n />\n </ListItemButton>\n ))\n )}\n </List>\n </Box>\n </DialogContent>","{ p: 2 }","<Button onClick={onClose}>{labels?.cancel ?? 'Cancel'}</Button>","labels?.cancel ?? 'Cancel'","<Button variant='contained' onClick={handleApply}>\n {labels?.apply ?? 'Apply'}\n </Button>","labels?.apply ?? 'Apply'","<DialogActions sx={{ p: 2 }}>\n <Button onClick={onClose}>{labels?.cancel ?? 'Cancel'}</Button>\n <Button variant='contained' onClick={handleApply}>\n {labels?.apply ?? 'Apply'}\n </Button>\n </DialogActions>","<Dialog\n open={open}\n onClose={onClose}\n maxWidth='xs'\n fullWidth\n {...DialogProps}\n >\n <DialogTitle component='div' sx={titleSx}>\n <Typography variant='subtitle1' fontWeight={500}>\n {title}\n </Typography>\n <IconButton aria-label='close' size='small' onClick={onClose}>\n <Close fontSize='small' />\n </IconButton>\n </DialogTitle>\n\n <DialogContent sx={{ pt: 1, px: 2, pb: 3 }}>\n <Typography variant='body2' color='text.secondary' sx={{ mb: 2 }}>\n {description}\n </Typography>\n\n <Box sx={groupSx}>\n <Box sx={searchSx}>\n <Search sx={{ fontSize: 18 }} />\n <InputBase\n fullWidth\n placeholder={labels?.search ?? 'Search layers'}\n inputProps={{ 'aria-label': labels?.search ?? 'Search layers' }}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n sx={{ fontSize: 13, color: 'text.primary' }}\n />\n </Box>\n <Divider />\n <List\n component='div'\n role='list'\n disablePadding\n sx={{\n maxHeight: 240,\n overflowY: 'auto',\n // MUI gives dividers inside a List an 8px vertical margin; the\n // \"All selected\" separator should sit flush like the rows.\n '& .MuiDivider-root': { my: 0 },\n }}\n >\n {/* \"All selected\" master row only makes sense over the full\n list — hide it while a search is narrowing the results. */}\n {!normalized && (\n <>\n <ListItemButton dense sx={rowSx} onClick={toggleAll}>\n <ListItemIcon sx={checkboxSlotSx}>\n <Checkbox\n edge='start'\n tabIndex={-1}\n disableRipple\n sx={{ p: 0.5 }}\n checked={allChecked}\n indeterminate={!allChecked && someChecked}\n inputProps={{ 'aria-labelledby': `${labelId}-all` }}\n />\n </ListItemIcon>\n <ListItemText\n id={`${labelId}-all`}\n primary={allSelectedLabel}\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItemButton>\n <Divider />\n </>\n )}\n {filtered.length === 0 ? (\n <Typography variant='body2' color='text.secondary' sx={{ p: 2 }}>\n {empty}\n </Typography>\n ) : (\n filtered.map((layer) => (\n <ListItemButton\n key={layer.id}\n dense\n sx={rowSx}\n onClick={() => toggle(layer.id)}\n >\n <ListItemIcon sx={checkboxSlotSx}>\n <Checkbox\n edge='start'\n tabIndex={-1}\n disableRipple\n sx={{ p: 0.5 }}\n checked={draft.has(layer.id)}\n inputProps={{\n 'aria-labelledby': `${labelId}-${layer.id}`,\n }}\n />\n </ListItemIcon>\n <ListItemText\n id={`${labelId}-${layer.id}`}\n primary={layer.label}\n primaryTypographyProps={{\n variant: 'body2',\n noWrap: true,\n title: layer.label,\n }}\n />\n </ListItemButton>\n ))\n )}\n </List>\n </Box>\n </DialogContent>\n\n <DialogActions sx={{ p: 2 }}>\n <Button onClick={onClose}>{labels?.cancel ?? 'Cancel'}</Button>\n <Button variant='contained' onClick={handleApply}>\n {labels?.apply ?? 'Apply'}\n </Button>\n </DialogActions>\n </Dialog>","{\n message,\n onDismiss,\n AlertProps,\n SnackbarProps,\n}: LassoMessageUIProps","(_, reason) => reason !== 'clickaway' && onDismiss()","{ position: 'static', transform: 'none' }","<AlertTitle>{message.title}</AlertTitle>","title","<Alert\n severity={message.severity ?? 'info'}\n action={message.action}\n onClose={onDismiss}\n {...AlertProps}\n >\n <AlertTitle>{message.title}</AlertTitle>\n {message.content}\n </Alert>","action","content","message.severity ?? 'info'","<Snackbar\n open\n autoHideDuration={5000}\n // 'clickaway' is ignored so map interactions don't dismiss the message.\n onClose={(_, reason) => reason !== 'clickaway' && onDismiss()}\n // Stay in flow — the maps-side `LassoTools.Message` owns positioning.\n sx={{ position: 'static', transform: 'none' }}\n {...SnackbarProps}\n >\n <Alert\n severity={message.severity ?? 'info'}\n action={message.action}\n onClose={onDismiss}\n {...AlertProps}\n >\n <AlertTitle>{message.title}</AlertTitle>\n {message.content}\n </Alert>\n </Snackbar>","{\n onAccept,\n onCancel,\n labels,\n shortcuts,\n PaperProps,\n}: LassoEditConfirmToolbarUIProps","<CancelAction\n label={labels?.cancel}\n shortcut={shortcuts?.cancel}\n onCancel={onCancel}\n />","labels?.cancel","shortcuts?.cancel","<LassoToolbarUI.Divider />","LassoToolbarUI.Divider","<AcceptAction\n label={labels?.accept}\n shortcut={shortcuts?.accept}\n onAccept={onAccept}\n />","labels?.accept","shortcuts?.accept","<LassoToolbarUI PaperProps={PaperProps}>\n {/* Cancel first, confirm last — the usual dialog-button convention. */}\n <CancelAction\n label={labels?.cancel}\n shortcut={shortcuts?.cancel}\n onCancel={onCancel}\n />\n <LassoToolbarUI.Divider />\n <AcceptAction\n label={labels?.accept}\n shortcut={shortcuts?.accept}\n onAccept={onAccept}\n />\n </LassoToolbarUI>","<path\n fill='currentColor'\n d='M3 13.5c-.413 0-.766-.147-1.06-.44A1.445 1.445 0 0 1 1.5 12V6c0-.412.147-.766.44-1.06.294-.293.647-.44 1.06-.44h12c.412 0 .766.147 1.06.44.293.294.44.647.44 1.06v6c0 .412-.147.766-.44 1.06-.294.293-.647.44-1.06.44H3ZM3 12h12V6h-2.25v3h-1.5V6h-1.5v3h-1.5V6h-1.5v3h-1.5V6H3v6Z'\n />","<svg\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 18 18'\n fill='currentColor'\n {...props}\n >\n <path\n fill='currentColor'\n d='M3 13.5c-.413 0-.766-.147-1.06-.44A1.445 1.445 0 0 1 1.5 12V6c0-.412.147-.766.44-1.06.294-.293.647-.44 1.06-.44h12c.412 0 .766.147 1.06.44.293.294.44.647.44 1.06v6c0 .412-.147.766-.44 1.06-.294.293-.647.44-1.06.44H3ZM3 12h12V6h-2.25v3h-1.5V6h-1.5v3h-1.5V6h-1.5v3h-1.5V6H3v6Z'\n />\n </svg>","<path\n fill='currentColor'\n fillRule='evenodd'\n d='M9 1.5a7.5 7.5 0 1 1 0 15 7.5 7.5 0 0 1 0-15ZM9 3a6 6 0 1 0 0 12A6 6 0 0 0 9 3Zm0 4.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3Z'\n clipRule='evenodd'\n />","<svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 18 18'\n {...props}\n >\n <path\n fill='currentColor'\n fillRule='evenodd'\n d='M9 1.5a7.5 7.5 0 1 1 0 15 7.5 7.5 0 0 1 0-15ZM9 3a6 6 0 1 0 0 12A6 6 0 0 0 9 3Zm0 4.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3Z'\n clipRule='evenodd'\n />\n </svg>","<path\n fill='currentColor'\n fillRule='evenodd'\n d='M4.5 13.5v-9h9v9h-9Zm.75-8.25h7.5v7.5h-7.5v-7.5Z'\n clipRule='evenodd'\n />","<path\n fill='#2C3032'\n fillRule='evenodd'\n d='M1.5 3A1.5 1.5 0 0 1 3 1.5h12A1.5 1.5 0 0 1 16.5 3v12a1.5 1.5 0 0 1-1.5 1.5H3A1.5 1.5 0 0 1 1.5 15V3ZM3 3h12v12H3V3Z'\n clipRule='evenodd'\n />","<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 18' {...props}>\n <path\n fill='currentColor'\n fillRule='evenodd'\n d='M4.5 13.5v-9h9v9h-9Zm.75-8.25h7.5v7.5h-7.5v-7.5Z'\n clipRule='evenodd'\n />\n <path\n fill='#2C3032'\n fillRule='evenodd'\n d='M1.5 3A1.5 1.5 0 0 1 3 1.5h12A1.5 1.5 0 0 1 16.5 3v12a1.5 1.5 0 0 1-1.5 1.5H3A1.5 1.5 0 0 1 1.5 15V3ZM3 3h12v12H3V3Z'\n clipRule='evenodd'\n />\n </svg>","{ sx, ...PaperProps } = EMPTY_PAPER_PROPS","{\n enabled,\n actionProps,\n labels = DEFAULT_MEASUREMENT_TOOLS_LABELS,\n modes,\n modesMapping = DEFAULT_MEASUREMENT_TOOLS_MODES_MAPPING,\n unitsMapping = DEFAULT_MEASUREMENT_TOOLS_UNITS_MAPPING,\n modeSelected,\n PaperProps: { sx, ...PaperProps } = EMPTY_PAPER_PROPS,\n units,\n unitSelected,\n onActionToggle,\n onChangeMode,\n onChangeUnit,\n}: MeasurementToolsComponentProps","labels = DEFAULT_MEASUREMENT_TOOLS_LABELS","modesMapping = DEFAULT_MEASUREMENT_TOOLS_MODES_MAPPING","unitsMapping = DEFAULT_MEASUREMENT_TOOLS_UNITS_MAPPING","(\n data,\n ) => {\n return onActionToggle(!!data)\n }","deepmerge(modes, modesMapping)","data","useMemo(() => {\n return deepmerge(modes, modesMapping)\n }, [modes, modesMapping])","modeExists ? modeSelected : Object.keys(data)[0]","Object.keys(units).length >= 1 ? units : { [mode]: option.slice(0, 1) }","options[mode].map((unit) => {\n return {\n ...unit,\n ...unitsMapping[unit.value],\n }\n })","(unit) => {\n return {\n ...unit,\n ...unitsMapping[unit.value],\n }\n }","options[mode]","useMemo(() => {\n const option = units[mode]\n const options =\n Object.keys(units).length >= 1 ? units : { [mode]: option.slice(0, 1) }\n return options[mode].map((unit) => {\n return {\n ...unit,\n ...unitsMapping[unit.value],\n }\n })\n }, [mode, units, unitsMapping])","{\n ...styles.container,\n ...sx,\n }","<MeasurementToolsUIAction\n actionProps={actionProps}\n labels={labels?.action}\n enabled={enabled}\n onActionToggle={handleToggle}\n >\n {modeSelectedValue?.icon}\n </MeasurementToolsUIAction>","labels?.action","modeSelectedValue?.icon","<Options\n labels={labels?.options}\n modes={data}\n modeSelected={mode}\n units={_units}\n unitSelected={unitSelected}\n onChangeMode={onChangeMode}\n onChangeUnit={onChangeUnit}\n />","labels?.options","<Box>\n <MeasurementToolsUIAction\n actionProps={actionProps}\n labels={labels?.action}\n enabled={enabled}\n onActionToggle={handleToggle}\n >\n {modeSelectedValue?.icon}\n </MeasurementToolsUIAction>\n <Options\n labels={labels?.options}\n modes={data}\n modeSelected={mode}\n units={_units}\n unitSelected={unitSelected}\n onChangeMode={onChangeMode}\n onChangeUnit={onChangeUnit}\n />\n </Box>","<Paper\n sx={{\n ...styles.container,\n ...sx,\n }}\n {...PaperProps}\n >\n <Box>\n <MeasurementToolsUIAction\n actionProps={actionProps}\n labels={labels?.action}\n enabled={enabled}\n onActionToggle={handleToggle}\n >\n {modeSelectedValue?.icon}\n </MeasurementToolsUIAction>\n <Options\n labels={labels?.options}\n modes={data}\n modeSelected={mode}\n units={_units}\n unitSelected={unitSelected}\n onChangeMode={onChangeMode}\n onChangeUnit={onChangeUnit}\n />\n </Box>\n </Paper>","{\n actionProps,\n labels,\n enabled,\n children,\n onActionToggle,\n}: PropsWithChildren<\n Pick<\n MeasurementToolsComponentProps,\n 'actionProps' | 'enabled' | 'onActionToggle'\n > & {\n labels?: PickDeep<\n MeasurementToolsComponentProps['labels'],\n 'action'\n >['action']\n }\n>","() => onActionToggle(!enabled)","<ToggleButton\n value='toggle'\n sx={styles.actions.icon}\n onClick={() => onActionToggle(!enabled)}\n aria-label={actionLabel}\n selected={enabled}\n >\n {children}\n </ToggleButton>","<Tooltip\n title={actionLabel}\n placement='right'\n {...actionProps?.TooltipProps}\n >\n <ToggleButton\n value='toggle'\n sx={styles.actions.icon}\n onClick={() => onActionToggle(!enabled)}\n aria-label={actionLabel}\n selected={enabled}\n >\n {children}\n </ToggleButton>\n </Tooltip>","actionProps?.TooltipProps","{\n modes,\n modeSelected,\n units,\n unitSelected,\n labels,\n onChangeMode,\n onChangeUnit,\n}: Required<\n Pick<\n MeasurementToolsComponentProps,\n 'modeSelected' | 'onChangeMode' | 'onChangeUnit'\n >\n> & {\n modes: MeasurementToolsComponentProps['modes'] &\n MeasurementToolsComponentProps['modesMapping']\n units: (MeasurementUnitOption<MeasurementUnit> & MeasureUnitMapping)[]\n unitSelected?: MeasurementToolsComponentProps['unitSelected']\n labels?: PickDeep<\n MeasurementToolsComponentProps['labels'],\n 'options'\n >['options']\n}","Object.values(modes)","Object.values(units)","(event: MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget)\n }","() => {\n setAnchorEl(null)\n }","(\n e: MouseEvent<HTMLLIElement>,\n mode: ValueOf<Required<typeof modes>>,\n ) => {\n e.preventDefault()\n onChangeMode(mode.value)\n handleClose()\n }","() => {\n setUnitModal(true)\n }","() => {\n setUnitModal(false)\n }","(data: string) => {\n handleCloseModal()\n onChangeUnit(data)\n }","units.find(\n (unit) => unit.value === unitSelected,\n ) ?? units[0]","<IconButton sx={styles.options.icon} onClick={handleToggle}>\n <ArrowDropDown />\n </IconButton>","{\n 'aria-labelledby': 'basic-button',\n sx: styles.options.menu,\n }","modesAvailable.length > 1 && (\n <>\n <Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n >\n {modeTitle}\n </Typography>\n {modesAvailable.map((mode) => {\n const options =\n labels?.mode?.options ??\n DEFAULT_MEASUREMENT_TOOLS_LABELS.options.mode.options\n const label = options[mode.value]\n\n return (\n <MenuItem\n key={mode.value}\n onClick={(e) => handleClick(e, mode)}\n selected={mode.value === modeSelected}\n >\n <ListItemIcon sx={styles.options.icons}>\n <SvgIcon>{mode.icon}</SvgIcon>\n </ListItemIcon>\n <ListItemText>{label}</ListItemText>\n </MenuItem>\n )\n })}\n </>\n )","options","modesAvailable.length","mode","e","hasDivider && <Divider />","unitsAvailable.length > 1 && (\n <>\n <MenuItem onClick={handleClickUnit}>\n <ListItemText>{unitTitle}</ListItemText>\n <Typography\n variant='caption'\n fontWeight={500}\n sx={styles.options.tag}\n >\n {unitSelectedValue.short}\n </Typography>\n </MenuItem>\n <UnitsModal\n open={unitModal}\n labels={labels}\n units={units}\n unitSelectedValue={unitSelectedValue}\n onClose={handleCloseModal}\n onSubmit={handleApplyModal}\n />\n </>\n )","unitSelectedValue.short","length","<div>\n {modesAvailable.length > 1 && (\n <>\n <Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n >\n {modeTitle}\n </Typography>\n {modesAvailable.map((mode) => {\n const options =\n labels?.mode?.options ??\n DEFAULT_MEASUREMENT_TOOLS_LABELS.options.mode.options\n const label = options[mode.value]\n\n return (\n <MenuItem\n key={mode.value}\n onClick={(e) => handleClick(e, mode)}\n selected={mode.value === modeSelected}\n >\n <ListItemIcon sx={styles.options.icons}>\n <SvgIcon>{mode.icon}</SvgIcon>\n </ListItemIcon>\n <ListItemText>{label}</ListItemText>\n </MenuItem>\n )\n })}\n </>\n )}\n {hasDivider && <Divider />}\n {unitsAvailable.length > 1 && (\n <>\n <MenuItem onClick={handleClickUnit}>\n <ListItemText>{unitTitle}</ListItemText>\n <Typography\n variant='caption'\n fontWeight={500}\n sx={styles.options.tag}\n >\n {unitSelectedValue.short}\n </Typography>\n </MenuItem>\n <UnitsModal\n open={unitModal}\n labels={labels}\n units={units}\n unitSelectedValue={unitSelectedValue}\n onClose={handleCloseModal}\n onSubmit={handleApplyModal}\n />\n </>\n )}\n </div>","<>\n <IconButton sx={styles.options.icon} onClick={handleToggle}>\n <ArrowDropDown />\n </IconButton>\n <Menu\n id='measurement-menu'\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n MenuListProps={{\n 'aria-labelledby': 'basic-button',\n sx: styles.options.menu,\n }}\n >\n <div>\n {modesAvailable.length > 1 && (\n <>\n <Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n >\n {modeTitle}\n </Typography>\n {modesAvailable.map((mode) => {\n const options =\n labels?.mode?.options ??\n DEFAULT_MEASUREMENT_TOOLS_LABELS.options.mode.options\n const label = options[mode.value]\n\n return (\n <MenuItem\n key={mode.value}\n onClick={(e) => handleClick(e, mode)}\n selected={mode.value === modeSelected}\n >\n <ListItemIcon sx={styles.options.icons}>\n <SvgIcon>{mode.icon}</SvgIcon>\n </ListItemIcon>\n <ListItemText>{label}</ListItemText>\n </MenuItem>\n )\n })}\n </>\n )}\n {hasDivider && <Divider />}\n {unitsAvailable.length > 1 && (\n <>\n <MenuItem onClick={handleClickUnit}>\n <ListItemText>{unitTitle}</ListItemText>\n <Typography\n variant='caption'\n fontWeight={500}\n sx={styles.options.tag}\n >\n {unitSelectedValue.short}\n </Typography>\n </MenuItem>\n <UnitsModal\n open={unitModal}\n labels={labels}\n units={units}\n unitSelectedValue={unitSelectedValue}\n onClose={handleCloseModal}\n onSubmit={handleApplyModal}\n />\n </>\n )}\n </div>\n </Menu>\n </>","{\n open,\n labels,\n units,\n unitSelectedValue,\n onClose,\n onSubmit,\n}: {\n open: boolean\n labels?: PickDeep<\n MeasurementToolsComponentProps['labels'],\n 'options'\n >['options']\n units: MeasurementUnitOption<MeasurementUnit>[]\n unitSelectedValue: MeasurementUnitOption<MeasurementUnit>\n onClose: () => void\n onSubmit: (data: string) => void\n}","units.filter((unit) => unit.system === system)","(unit) => unit.system === system","useMemo(() => {\n return units.filter((unit) => unit.system === system)\n }, [system, units])","(\n _: MouseEvent<HTMLElement>,\n value: MeasurementSystem,\n ) => {\n setSystem(value)\n }","{\n component: 'form',\n onSubmit: (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n onSubmit(formData.get('unit-value') as string)\n },\n }","<Close />","<IconButton onClick={onClose}>\n <Close />\n </IconButton>","<DialogTitle sx={styles.options.modal.title}>\n {modalUnitTitle}\n <IconButton onClick={onClose}>\n <Close />\n </IconButton>\n </DialogTitle>","<Typography sx={styles.options.modal.subtitle}>\n {modalUnitSubtitle}\n </Typography>","<ToggleButton value='metric'>{_labels.metric.title}</ToggleButton>","title","<ToggleButton value='imperial'>{_labels.imperial.title}</ToggleButton>","<ToggleButtonGroup\n color='primary'\n value={system}\n exclusive={true}\n fullWidth={true}\n onChange={handleToggleChange}\n aria-label='system'\n sx={styles.options.modal.toggle}\n >\n <ToggleButton value='metric'>{_labels.metric.title}</ToggleButton>\n <ToggleButton value='imperial'>{_labels.imperial.title}</ToggleButton>\n </ToggleButtonGroup>","_units.map((unit) => {\n const label =\n labelsBySystem[\n unit.value as MeasurementUnitMetricDistance &\n MeasurementUnitImperialDistance\n ]\n\n return (\n <FormControlLabel\n key={unit.value}\n value={unit.value}\n control={<Radio />}\n label={label}\n />\n )\n })","(unit) => {\n const label =\n labelsBySystem[\n unit.value as MeasurementUnitMetricDistance &\n MeasurementUnitImperialDistance\n ]\n\n return (\n <FormControlLabel\n key={unit.value}\n value={unit.value}\n control={<Radio />}\n label={label}\n />\n )\n }","unit","<RadioGroup\n aria-labelledby='unit-value'\n defaultValue={_unitSelectedValue?.value}\n name='unit-value'\n sx={styles.options.modal.optionsGroup}\n >\n {_units.map((unit) => {\n const label =\n labelsBySystem[\n unit.value as MeasurementUnitMetricDistance &\n MeasurementUnitImperialDistance\n ]\n\n return (\n <FormControlLabel\n key={unit.value}\n value={unit.value}\n control={<Radio />}\n label={label}\n />\n )\n })}\n </RadioGroup>","_unitSelectedValue?.value","<FormControl key={_unitSelectedValue?.value}>\n <RadioGroup\n aria-labelledby='unit-value'\n defaultValue={_unitSelectedValue?.value}\n name='unit-value'\n sx={styles.options.modal.optionsGroup}\n >\n {_units.map((unit) => {\n const label =\n labelsBySystem[\n unit.value as MeasurementUnitMetricDistance &\n MeasurementUnitImperialDistance\n ]\n\n return (\n <FormControlLabel\n key={unit.value}\n value={unit.value}\n control={<Radio />}\n label={label}\n />\n )\n })}\n </RadioGroup>\n </FormControl>","<DialogContent sx={styles.options.modal.content}>\n <Typography sx={styles.options.modal.subtitle}>\n {modalUnitSubtitle}\n </Typography>\n <ToggleButtonGroup\n color='primary'\n value={system}\n exclusive={true}\n fullWidth={true}\n onChange={handleToggleChange}\n aria-label='system'\n sx={styles.options.modal.toggle}\n >\n <ToggleButton value='metric'>{_labels.metric.title}</ToggleButton>\n <ToggleButton value='imperial'>{_labels.imperial.title}</ToggleButton>\n </ToggleButtonGroup>\n <FormControl key={_unitSelectedValue?.value}>\n <RadioGroup\n aria-labelledby='unit-value'\n defaultValue={_unitSelectedValue?.value}\n name='unit-value'\n sx={styles.options.modal.optionsGroup}\n >\n {_units.map((unit) => {\n const label =\n labelsBySystem[\n unit.value as MeasurementUnitMetricDistance &\n MeasurementUnitImperialDistance\n ]\n\n return (\n <FormControlLabel\n key={unit.value}\n value={unit.value}\n control={<Radio />}\n label={label}\n />\n )\n })}\n </RadioGroup>\n </FormControl>\n </DialogContent>","<DialogActions sx={styles.options.modal.actions}>\n <Button variant='contained' type='submit'>\n {modalUnitApply}\n </Button>\n </DialogActions>","<Dialog\n open={open}\n component={Box}\n onClose={onClose}\n maxWidth='xs'\n PaperProps={{\n component: 'form',\n onSubmit: (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n onSubmit(formData.get('unit-value') as string)\n },\n }}\n >\n <DialogTitle sx={styles.options.modal.title}>\n {modalUnitTitle}\n <IconButton onClick={onClose}>\n <Close />\n </IconButton>\n </DialogTitle>\n <DialogContent sx={styles.options.modal.content}>\n <Typography sx={styles.options.modal.subtitle}>\n {modalUnitSubtitle}\n </Typography>\n <ToggleButtonGroup\n color='primary'\n value={system}\n exclusive={true}\n fullWidth={true}\n onChange={handleToggleChange}\n aria-label='system'\n sx={styles.options.modal.toggle}\n >\n <ToggleButton value='metric'>{_labels.metric.title}</ToggleButton>\n <ToggleButton value='imperial'>{_labels.imperial.title}</ToggleButton>\n </ToggleButtonGroup>\n <FormControl key={_unitSelectedValue?.value}>\n <RadioGroup\n aria-labelledby='unit-value'\n defaultValue={_unitSelectedValue?.value}\n name='unit-value'\n sx={styles.options.modal.optionsGroup}\n >\n {_units.map((unit) => {\n const label =\n labelsBySystem[\n unit.value as MeasurementUnitMetricDistance &\n MeasurementUnitImperialDistance\n ]\n\n return (\n <FormControlLabel\n key={unit.value}\n value={unit.value}\n control={<Radio />}\n label={label}\n />\n )\n })}\n </RadioGroup>\n </FormControl>\n </DialogContent>\n <DialogActions sx={styles.options.modal.actions}>\n <Button variant='contained' type='submit'>\n {modalUnitApply}\n </Button>\n </DialogActions>\n </Dialog>","{\n disabled,\n labels,\n PaperProps,\n TooltipProps,\n watch,\n onChange,\n onError,\n}: GeolocationControlProps","(_: boolean, action: 'granted' | 'denied') => action === 'granted'","(error: Parameters<PositionErrorCallback>[0]): void => {\n onError?.(error)\n }","() => {\n if (hasGeolocation) {\n navigator.permissions\n .query({ name: 'geolocation' })\n .then((result) => {\n dispatch(result.state === 'granted' ? 'granted' : 'denied')\n result.onchange = () => {\n dispatch(result.state === 'granted' ? 'granted' : 'denied')\n }\n })\n .catch((error: Parameters<PositionErrorCallback>[0]) => {\n dispatch('denied')\n notifyError(error)\n })\n }\n\n return () => {\n if (watchRef.current) {\n navigator.geolocation.clearWatch(watchRef.current)\n }\n }\n }","error","[hasGeolocation]","(position: Parameters<PositionCallback>[0]) => {\n onChange(position.coords)\n }","useCallback(\n (position: Parameters<PositionCallback>[0]) => {\n onChange(position.coords)\n },\n [onChange],\n )","(error: Parameters<PositionErrorCallback>[0]) => {\n dispatch('denied')\n onError?.(error)\n }","useCallback(\n (error: Parameters<PositionErrorCallback>[0]) => {\n dispatch('denied')\n onError?.(error)\n },\n [onError],\n )","() => {\n if (watchRef.current) {\n navigator.geolocation.clearWatch(watchRef.current)\n }\n\n if (watch) {\n watchRef.current = navigator.geolocation.watchPosition(success, error)\n return\n }\n\n navigator.geolocation.getCurrentPosition(success, error)\n }","useCallback(() => {\n if (watchRef.current) {\n navigator.geolocation.clearWatch(watchRef.current)\n }\n\n if (watch) {\n watchRef.current = navigator.geolocation.watchPosition(success, error)\n return\n }\n\n navigator.geolocation.getCurrentPosition(success, error)\n }, [watch, success, error])","allowed ? <MyLocationOutlined /> : <LocationDisabledOutlined />","<IconButton\n onClick={handleClick}\n aria-label={labels?.ariaLabel ?? ariaLabel}\n disabled={!hasGeolocation || disabled}\n >\n {allowed ? <MyLocationOutlined /> : <LocationDisabledOutlined />}\n </IconButton>","labels?.ariaLabel ?? ariaLabel","!hasGeolocation || disabled","<Tooltip\n arrow\n placement='right'\n title={tooltipLabels[allowed ? 'enabled' : 'disabled']}\n {...TooltipProps}\n >\n <IconButton\n onClick={handleClick}\n aria-label={labels?.ariaLabel ?? ariaLabel}\n disabled={!hasGeolocation || disabled}\n >\n {allowed ? <MyLocationOutlined /> : <LocationDisabledOutlined />}\n </IconButton>\n </Tooltip>","tooltipLabels[allowed ? 'enabled' : 'disabled']","<Paper {...PaperProps}>\n <Tooltip\n arrow\n placement='right'\n title={tooltipLabels[allowed ? 'enabled' : 'disabled']}\n {...TooltipProps}\n >\n <IconButton\n onClick={handleClick}\n aria-label={labels?.ariaLabel ?? ariaLabel}\n disabled={!hasGeolocation || disabled}\n >\n {allowed ? <MyLocationOutlined /> : <LocationDisabledOutlined />}\n </IconButton>\n </Tooltip>\n </Paper>","{\n zoom,\n disabled,\n direction = 'vertical',\n reverse = false,\n isLoading,\n maxZoom = 24,\n minZoom = 0,\n PaperProps,\n ResetViewProps = {\n Icon: CropFreeOutlined,\n },\n showZoom = true,\n onChange,\n onReset,\n}: ZoomControlProps","direction = 'vertical'","reverse = false","maxZoom = 24","minZoom = 0","ResetViewProps = {\n Icon: CropFreeOutlined,\n }","showZoom = true","() => {\n const newZoom = Math.min(maxZoom, zoom + 1)\n onChange(newZoom)\n }","useCallback(() => {\n const newZoom = Math.min(maxZoom, zoom + 1)\n onChange(newZoom)\n }, [maxZoom, onChange, zoom])","() => {\n const newZoom = Math.max(minZoom, zoom - 1)\n onChange(newZoom)\n }","newZoom","useCallback(() => {\n const newZoom = Math.max(minZoom, zoom - 1)\n onChange(newZoom)\n }, [minZoom, onChange, zoom])","{\n ...styles.paper,\n flexDirection,\n }","onReset && (\n <>\n <IconButton\n onClick={onReset}\n aria-label='Reset action'\n disabled={disabled}\n >\n <ResetViewProps.Icon />\n </IconButton>\n <Divider orientation={dividerOrientation} flexItem />\n </>\n )","ResetViewProps.Icon","<AddOutlined />","<IconButton\n onClick={increaseZoom}\n aria-label='Increase zoom'\n disabled={disabled}\n >\n <AddOutlined />\n </IconButton>","<Divider orientation={dividerOrientation} flexItem />","showZoom && (\n <>\n <Box sx={styles.zoom}>\n <Typography\n display='block'\n align='center'\n color='textSecondary'\n variant='overline'\n >\n {displayZoom}\n </Typography>\n {isLoading && (\n <CircularProgress\n sx={styles.circularProgress}\n variant='indeterminate'\n size={24}\n />\n )}\n </Box>\n <Divider orientation={dividerOrientation} flexItem />\n </>\n )","<RemoveOutlined />","<IconButton\n onClick={decreaseZoom}\n aria-label='Decrease zoom'\n disabled={disabled}\n >\n <RemoveOutlined />\n </IconButton>","<Paper\n sx={{\n ...styles.paper,\n flexDirection,\n }}\n {...PaperProps}\n >\n {onReset && (\n <>\n <IconButton\n onClick={onReset}\n aria-label='Reset action'\n disabled={disabled}\n >\n <ResetViewProps.Icon />\n </IconButton>\n <Divider orientation={dividerOrientation} flexItem />\n </>\n )}\n <IconButton\n onClick={increaseZoom}\n aria-label='Increase zoom'\n disabled={disabled}\n >\n <AddOutlined />\n </IconButton>\n <Divider orientation={dividerOrientation} flexItem />\n {showZoom && (\n <>\n <Box sx={styles.zoom}>\n <Typography\n display='block'\n align='center'\n color='textSecondary'\n variant='overline'\n >\n {displayZoom}\n </Typography>\n {isLoading && (\n <CircularProgress\n sx={styles.circularProgress}\n variant='indeterminate'\n size={24}\n />\n )}\n </Box>\n <Divider orientation={dividerOrientation} flexItem />\n </>\n )}\n <IconButton\n onClick={decreaseZoom}\n aria-label='Decrease zoom'\n disabled={disabled}\n >\n <RemoveOutlined />\n </IconButton>\n </Paper>","{ length = 5 }: ListDataSkeletonProps","length = 5","new Array(length).fill(null).map((_, idx) => (\n <Grid key={`skeleton-${idx}`} container spacing={1}>\n <Grid\n container\n item\n direction='row'\n justifyContent='space-between'\n alignItems='center'\n >\n <Skeleton width={isOdd(idx) ? 72 : 48} height={20} />\n <Skeleton width={48} height={8} />\n </Grid>\n\n <Skeleton\n sx={{\n height: ({ spacing }) => spacing(0.5),\n marginTop: ({ spacing }) => spacing(1.25),\n marginBottom: ({ spacing }) => spacing(1.75),\n width: '100%',\n }}\n />\n </Grid>\n ))","(_, idx) => (\n <Grid key={`skeleton-${idx}`} container spacing={1}>\n <Grid\n container\n item\n direction='row'\n justifyContent='space-between'\n alignItems='center'\n >\n <Skeleton width={isOdd(idx) ? 72 : 48} height={20} />\n <Skeleton width={48} height={8} />\n </Grid>\n\n <Skeleton\n sx={{\n height: ({ spacing }) => spacing(0.5),\n marginTop: ({ spacing }) => spacing(1.25),\n marginBottom: ({ spacing }) => spacing(1.75),\n width: '100%',\n }}\n />\n </Grid>\n )","<Box aria-label='List Data skeleton'>\n {new Array(length).fill(null).map((_, idx) => (\n <Grid key={`skeleton-${idx}`} container spacing={1}>\n <Grid\n container\n item\n direction='row'\n justifyContent='space-between'\n alignItems='center'\n >\n <Skeleton width={isOdd(idx) ? 72 : 48} height={20} />\n <Skeleton width={48} height={8} />\n </Grid>\n\n <Skeleton\n sx={{\n height: ({ spacing }) => spacing(0.5),\n marginTop: ({ spacing }) => spacing(1.25),\n marginBottom: ({ spacing }) => spacing(1.75),\n width: '100%',\n }}\n />\n </Grid>\n ))}\n </Box>","({ spacing }) => spacing(0.5)","({ spacing }) => spacing(1.25)","({ spacing }) => spacing(1.75)","{ spacing }","spacing","{\n title = 'No data available',\n body = 'There are no results for the combination of filters applied to your data. Try tweaking your filters, or zoom and pan the map to adjust the Map View.',\n severity,\n}: NoDataAlertProps","title = 'No data available'","body = 'There are no results for the combination of filters applied to your data. Try tweaking your filters, or zoom and pan the map to adjust the Map View.'","<AlertBody>{body}</AlertBody>","<Alert title={title} severity={severity}>\n <AlertBody>{body}</AlertBody>\n </Alert>","title && <Typography variant='body2'>{title}</Typography>","<AlertBody color='textSecondary'>{body}</AlertBody>","<Box>\n {title && <Typography variant='body2'>{title}</Typography>}\n <AlertBody color='textSecondary'>{body}</AlertBody>\n </Box>","{ color, children }: AlertBodyProps","{ fontWeight: 'normal' }","<Box mt={0.5}>\n <Typography\n component='div'\n variant='caption'\n color={color ?? 'inherit'}\n style={{ fontWeight: 'normal' }}\n >\n {children}\n </Typography>\n </Box>","color ?? 'inherit'","<Box mt={-1} />","() => (isLoading ? 1 : 0)","{\n data = EMPTY_DATA,\n isLoading = false,\n maxItems = 5,\n labels = DEFAULT_LABELS,\n showDivider = true,\n selectedItemId,\n tooltipProps,\n onExpand,\n onItemClick,\n}: ListDataProps","data = EMPTY_DATA","isLoading = false","maxItems = 5","labels = DEFAULT_LABELS","showDivider = true","showAll ? data : data.slice(0, maxItems)","useMemo(() => {\n return showAll ? data : data.slice(0, maxItems)\n }, [data, maxItems, showAll])","() => {\n setShowAll(!showAll)\n onExpand?.(showAll)\n }","<ListDataSkeleton length={maxItems} />","<NoDataAlert />","items.map((item) => (\n <SmartTooltip<HTMLLIElement>\n // Default tooltip props\n followCursor={false}\n key={item.id}\n placement='top'\n arrow\n title={item.tooltipTitle}\n enterDelay={10}\n // Custom tooltip props\n {...tooltipProps}\n >\n {({ ref }) => (\n <ListItem\n ref={ref}\n role='listitem'\n sx={{\n ...(showDivider && styles.showDivider),\n ...(onItemClick && styles.clickable),\n ...(selectedItemId === item.id && styles.selected),\n ...(item.disabled && styles.disabled),\n }}\n onClick={() => {\n if (item.disabled) return\n onItemClick?.(item)\n }}\n >\n <Grid container alignItems='center'>\n <Grid item xs={8}>\n <ListItemText primary={item.label} sx={styles.label} />\n </Grid>\n <Grid item xs={4}>\n <ListItemText primary={item.value} sx={styles.value} />\n </Grid>\n </Grid>\n </ListItem>\n )}\n </SmartTooltip>\n ))","(item) => (\n <SmartTooltip<HTMLLIElement>\n // Default tooltip props\n followCursor={false}\n key={item.id}\n placement='top'\n arrow\n title={item.tooltipTitle}\n enterDelay={10}\n // Custom tooltip props\n {...tooltipProps}\n >\n {({ ref }) => (\n <ListItem\n ref={ref}\n role='listitem'\n sx={{\n ...(showDivider && styles.showDivider),\n ...(onItemClick && styles.clickable),\n ...(selectedItemId === item.id && styles.selected),\n ...(item.disabled && styles.disabled),\n }}\n onClick={() => {\n if (item.disabled) return\n onItemClick?.(item)\n }}\n >\n <Grid container alignItems='center'>\n <Grid item xs={8}>\n <ListItemText primary={item.label} sx={styles.label} />\n </Grid>\n <Grid item xs={4}>\n <ListItemText primary={item.value} sx={styles.value} />\n </Grid>\n </Grid>\n </ListItem>\n )}\n </SmartTooltip>\n )","{ ref }","<List id='expandable-list' role='list'>\n {items.map((item) => (\n <SmartTooltip<HTMLLIElement>\n // Default tooltip props\n followCursor={false}\n key={item.id}\n placement='top'\n arrow\n title={item.tooltipTitle}\n enterDelay={10}\n // Custom tooltip props\n {...tooltipProps}\n >\n {({ ref }) => (\n <ListItem\n ref={ref}\n role='listitem'\n sx={{\n ...(showDivider && styles.showDivider),\n ...(onItemClick && styles.clickable),\n ...(selectedItemId === item.id && styles.selected),\n ...(item.disabled && styles.disabled),\n }}\n onClick={() => {\n if (item.disabled) return\n onItemClick?.(item)\n }}\n >\n <Grid container alignItems='center'>\n <Grid item xs={8}>\n <ListItemText primary={item.label} sx={styles.label} />\n </Grid>\n <Grid item xs={4}>\n <ListItemText primary={item.value} sx={styles.value} />\n </Grid>\n </Grid>\n </ListItem>\n )}\n </SmartTooltip>\n ))}\n </List>","data.length > maxItems && (\n <Box my={2}>\n <Button\n onClick={handleToggle}\n variant='text'\n color='primary'\n aria-expanded={showAll}\n aria-controls='expandable-list'\n >\n {showAll ? labels.showLess : labels.showMore}\n </Button>\n </Box>\n )","length","labels.showLess","<>\n <List id='expandable-list' role='list'>\n {items.map((item) => (\n <SmartTooltip<HTMLLIElement>\n // Default tooltip props\n followCursor={false}\n key={item.id}\n placement='top'\n arrow\n title={item.tooltipTitle}\n enterDelay={10}\n // Custom tooltip props\n {...tooltipProps}\n >\n {({ ref }) => (\n <ListItem\n ref={ref}\n role='listitem'\n sx={{\n ...(showDivider && styles.showDivider),\n ...(onItemClick && styles.clickable),\n ...(selectedItemId === item.id && styles.selected),\n ...(item.disabled && styles.disabled),\n }}\n onClick={() => {\n if (item.disabled) return\n onItemClick?.(item)\n }}\n >\n <Grid container alignItems='center'>\n <Grid item xs={8}>\n <ListItemText primary={item.label} sx={styles.label} />\n </Grid>\n <Grid item xs={4}>\n <ListItemText primary={item.value} sx={styles.value} />\n </Grid>\n </Grid>\n </ListItem>\n )}\n </SmartTooltip>\n ))}\n </List>\n\n {data.length > maxItems && (\n <Box my={2}>\n <Button\n onClick={handleToggle}\n variant='text'\n color='primary'\n aria-expanded={showAll}\n aria-controls='expandable-list'\n >\n {showAll ? labels.showLess : labels.showMore}\n </Button>\n </Box>\n )}\n </>","{\n isMobile = false,\n labels,\n onChangeCollapsed,\n}: {\n labels: BasemapsUILabels['header']\n isMobile?: boolean\n onChangeCollapsed: () => void\n}","isMobile = false","isMobile && (\n <>\n <Typography variant='caption' flexGrow={1}>\n {labels.title}\n </Typography>\n <Tooltip title={labels.actions.close}>\n <IconButton\n size='small'\n onClick={onChangeCollapsed}\n aria-label={labels.actions.close}\n >\n <Close />\n </IconButton>\n </Tooltip>\n </>\n )","labels.title","<Box sx={styles.header}>\n {isMobile && (\n <>\n <Typography variant='caption' flexGrow={1}>\n {labels.title}\n </Typography>\n <Tooltip title={labels.actions.close}>\n <IconButton\n size='small'\n onClick={onChangeCollapsed}\n aria-label={labels.actions.close}\n >\n <Close />\n </IconButton>\n </Tooltip>\n </>\n )}\n </Box>","{\n title,\n children,\n collapsed = false,\n}: {\n title: string\n children: ReactNode\n collapsed?: boolean\n}","collapsed = false","<Typography\n variant='caption'\n color='textSecondary'\n sx={styles.groupWrapper.content}\n >\n {title}\n </Typography>","<>\n <Typography\n variant='caption'\n color='textSecondary'\n sx={styles.groupWrapper.content}\n >\n {title}\n </Typography>\n {children}\n </>","{\n values,\n selected,\n onChange,\n}: {\n values: Omit<BasemapOption, 'group'>[]\n selected: string | null | undefined\n onChange: (id: string) => void\n}","values.map((option) => {\n const isSelected = option.id === selected\n return (\n <Box\n key={option.id}\n sx={styles.item.container}\n component='button'\n aria-label={option.label}\n onClick={() => onChange(option.id)}\n >\n <img\n src={option.icon}\n aria-label={option.label + ' icon'}\n data-active={isSelected}\n />\n <Typography\n variant='caption'\n sx={{ ...(isSelected && styles.item.selected) }}\n >\n {option.label}\n </Typography>\n </Box>\n )\n })","(option) => {\n const isSelected = option.id === selected\n return (\n <Box\n key={option.id}\n sx={styles.item.container}\n component='button'\n aria-label={option.label}\n onClick={() => onChange(option.id)}\n >\n <img\n src={option.icon}\n aria-label={option.label + ' icon'}\n data-active={isSelected}\n />\n <Typography\n variant='caption'\n sx={{ ...(isSelected && styles.item.selected) }}\n >\n {option.label}\n </Typography>\n </Box>\n )\n }","<Box sx={styles.group}>\n {values.map((option) => {\n const isSelected = option.id === selected\n return (\n <Box\n key={option.id}\n sx={styles.item.container}\n component='button'\n aria-label={option.label}\n onClick={() => onChange(option.id)}\n >\n <img\n src={option.icon}\n aria-label={option.label + ' icon'}\n data-active={isSelected}\n />\n <Typography\n variant='caption'\n sx={{ ...(isSelected && styles.item.selected) }}\n >\n {option.label}\n </Typography>\n </Box>\n )\n })}\n </Box>","{\n anchorEl,\n ref,\n children,\n collapsed,\n isMobile = false,\n position,\n sx,\n slotProps,\n container,\n onChangeCollapsed,\n modal = true,\n placement = 'side',\n}: Required<Pick<T, 'collapsed' | 'onChangeCollapsed' | 'position'>> &\n Pick<PopoverProps, 'slotProps' | 'sx' | 'container'> & {\n /** Element the desktop popover is anchored to. */\n anchorEl?: HTMLElement | null\n /**\n * @deprecated Use `anchorEl`. A JSX prop named `ref` is non-reactive under\n * the React Compiler, so a state-held anchor stays frozen at its initial\n * `null` and the popover never opens. Removed in the next major.\n */\n ref?: HTMLElement | null\n isMobile?: boolean\n children: ReactNode\n /**\n * When `false`, the desktop popover is **non-modal**: no backdrop, clicks\n * pass through to the content behind it (e.g. a map stays interactive), no\n * focus trap, and neither backdrop-click nor Escape closes it (close it via\n * `onChangeCollapsed`). Defaults to `true` (standard dismissable popover).\n * Desktop-only — the mobile drawer is unaffected.\n */\n modal?: boolean\n /**\n * Desktop popover placement relative to the anchor: `'side'` (default) opens\n * beside the trigger; `'overlay'` pins corner-to-corner, sitting on top of\n * the anchor (e.g. a trigger hidden while the panel is open). Desktop-only.\n */\n placement?: ResponsiveDrawerPlacement\n }","isMobile = false","modal = true","placement = 'side'","(el: HTMLDivElement | null) => {\n observerRef.current?.disconnect()\n observerRef.current = null\n if (el && typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(() =>\n popoverActions.current?.updatePosition(),\n )\n observer.observe(el)\n observerRef.current = observer\n }\n }","useCallback((el: HTMLDivElement | null) => {\n observerRef.current?.disconnect()\n observerRef.current = null\n if (el && typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(() =>\n popoverActions.current?.updatePosition(),\n )\n observer.observe(el)\n observerRef.current = observer\n }\n }, [])","(onStoreChange: () => void) => {\n if (!measurableContainer || typeof ResizeObserver === 'undefined') {\n return () => undefined\n }\n const observer = new ResizeObserver(onStoreChange)\n observer.observe(measurableContainer)\n return () => observer.disconnect()\n }","() => undefined","observer","useCallback(\n (onStoreChange: () => void) => {\n if (!measurableContainer || typeof ResizeObserver === 'undefined') {\n return () => undefined\n }\n const observer = new ResizeObserver(onStoreChange)\n observer.observe(measurableContainer)\n return () => observer.disconnect()\n },\n [measurableContainer],\n )","() => measurableContainer?.clientHeight","clientHeight","useCallback(\n () => measurableContainer?.clientHeight,\n [measurableContainer],\n )","() => onChangeCollapsed(true)","<Drawer\n anchor='bottom'\n open={!collapsed}\n onClose={() => onChangeCollapsed(true)}\n >\n {children}\n </Drawer>","!collapsed","resolveOrigins(position, placement)","containerHeight != null && containerHeight > 0\n ? {\n maxHeight: containerHeight * 0.9,\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n }\n : undefined","paperMaxHeightStyle\n ? {\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n minHeight: 0,\n maxHeight: '100%',\n overflow: 'hidden',\n width: '100%',\n }\n : undefined","modal && !paperMaxHeightStyle\n ? slotProps\n : {\n ...(typeof slotProps === 'object' && slotProps != null\n ? slotProps\n : {}),\n ...(!modal && {\n root: {\n style: { pointerEvents: 'none' },\n ...objectSlotProps?.root,\n },\n }),\n paper: {\n ...objectSlotProps?.paper,\n style: {\n ...(!modal && { pointerEvents: 'auto' }),\n ...paperMaxHeightStyle,\n ...objectSlotProps?.paper?.style,\n },\n },\n }","paper","root","modal ? () => onChangeCollapsed(true) : undefined","<div ref={observeContent} style={contentWrapperStyle}>\n {children}\n </div>","<Popover\n action={popoverActions}\n sx={sx}\n container={container}\n anchorEl={anchor}\n open={!collapsed && anchor != null}\n onClose={modal ? () => onChangeCollapsed(true) : undefined}\n hideBackdrop={!modal}\n disableScrollLock={!modal}\n disableEscapeKeyDown={!modal}\n disableAutoFocus={!modal}\n disableEnforceFocus={!modal}\n disableRestoreFocus={!modal}\n anchorOrigin={anchorOrigin}\n transformOrigin={transformOrigin}\n slotProps={mergedSlotProps}\n >\n <div ref={observeContent} style={contentWrapperStyle}>\n {children}\n </div>\n </Popover>","!collapsed && anchor != null","!modal","{\n options = EMPTY_OPTIONS,\n labels: _labels,\n position = 'bottom-right',\n selected = null,\n onChange,\n TooltipProps,\n}: BasemapsUIProps","options = EMPTY_OPTIONS","position = 'bottom-right'","selected = null","theme.breakpoints.down('sm')","breakpoints","_labels ?? {}","deepmerge(DEFAULT_BASEMAPS_LABELS, _labels ?? {})","options.find((option) => option.id === selected)","(option) => option.id === selected","Object.groupBy(options, (option) => option.group ?? 'default')","(option) => option.group ?? 'default'","Object.keys(groups)","() => {\n setAnchorEl(null)\n setIsOpen(false)\n }","() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n\n if (!timer) {\n return\n }\n\n timeoutRef.current = setTimeout(() => {\n handleClose()\n return\n }, timer)\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }","[timer]","() => {\n setTimer(null)\n }","() => {\n setTimer(400)\n }","(e) => {\n setAnchorEl(e.currentTarget as HTMLButtonElement)\n setIsOpen(true)\n }","<IconButton\n sx={styles.toggle}\n onClick={(e) => {\n setAnchorEl(e.currentTarget as HTMLButtonElement)\n setIsOpen(true)\n }}\n >\n <img\n src={optionSelected?.icon}\n alt={optionSelected?.label ?? 'Basemap'}\n />\n </IconButton>","optionSelected?.icon","optionSelected?.label ?? 'Basemap'","<Tooltip title={labels.toggle.title} placement='right' {...TooltipProps}>\n <IconButton\n sx={styles.toggle}\n onClick={(e) => {\n setAnchorEl(e.currentTarget as HTMLButtonElement)\n setIsOpen(true)\n }}\n >\n <img\n src={optionSelected?.icon}\n alt={optionSelected?.label ?? 'Basemap'}\n />\n </IconButton>\n </Tooltip>","title","{\n paper: {\n sx: {\n ...styles.root,\n transform: `translate3d(${position.endsWith('right') ? '-8px' : '8px'}, ${\n position.startsWith('bottom') ? '-4px' : '4px'\n }, 0) !important`,\n },\n onMouseOver: handleMouseOver,\n onMouseLeave: handleMouseLeave,\n },\n }","`translate3d(${position.endsWith('right') ? '-8px' : '8px'}, ${\n position.startsWith('bottom') ? '-4px' : '4px'\n }, 0) !important`","() => handleClose()","<Header\n isMobile={isMobile}\n labels={labels.header}\n onChangeCollapsed={() => handleClose()}\n />","header","Object.entries(groups)","Object.entries(groups).map(([group, values]) => (\n <GroupWrapper\n key={group}\n title={group + ' ' + labels.header.title}\n collapsed={groupCount < 2}\n >\n <Group\n values={values!}\n selected={selected}\n onChange={(e) => {\n handleClose()\n onChange(e)\n }}\n />\n </GroupWrapper>\n ))","[group, values]","e","<ResponsiveDrawer\n anchorEl={anchorEl}\n slotProps={{\n paper: {\n sx: {\n ...styles.root,\n transform: `translate3d(${position.endsWith('right') ? '-8px' : '8px'}, ${\n position.startsWith('bottom') ? '-4px' : '4px'\n }, 0) !important`,\n },\n onMouseOver: handleMouseOver,\n onMouseLeave: handleMouseLeave,\n },\n }}\n collapsed={!isOpen}\n position={position}\n isMobile={isMobile}\n onChangeCollapsed={() => handleClose()}\n >\n <Header\n isMobile={isMobile}\n labels={labels.header}\n onChangeCollapsed={() => handleClose()}\n />\n {Object.entries(groups).map(([group, values]) => (\n <GroupWrapper\n key={group}\n title={group + ' ' + labels.header.title}\n collapsed={groupCount < 2}\n >\n <Group\n values={values!}\n selected={selected}\n onChange={(e) => {\n handleClose()\n onChange(e)\n }}\n />\n </GroupWrapper>\n ))}\n </ResponsiveDrawer>","!isOpen","<Paper>\n <Tooltip title={labels.toggle.title} placement='right' {...TooltipProps}>\n <IconButton\n sx={styles.toggle}\n onClick={(e) => {\n setAnchorEl(e.currentTarget as HTMLButtonElement)\n setIsOpen(true)\n }}\n >\n <img\n src={optionSelected?.icon}\n alt={optionSelected?.label ?? 'Basemap'}\n />\n </IconButton>\n </Tooltip>\n\n <ResponsiveDrawer\n anchorEl={anchorEl}\n slotProps={{\n paper: {\n sx: {\n ...styles.root,\n transform: `translate3d(${position.endsWith('right') ? '-8px' : '8px'}, ${\n position.startsWith('bottom') ? '-4px' : '4px'\n }, 0) !important`,\n },\n onMouseOver: handleMouseOver,\n onMouseLeave: handleMouseLeave,\n },\n }}\n collapsed={!isOpen}\n position={position}\n isMobile={isMobile}\n onChangeCollapsed={() => handleClose()}\n >\n <Header\n isMobile={isMobile}\n labels={labels.header}\n onChangeCollapsed={() => handleClose()}\n />\n {Object.entries(groups).map(([group, values]) => (\n <GroupWrapper\n key={group}\n title={group + ' ' + labels.header.title}\n collapsed={groupCount < 2}\n >\n <Group\n values={values!}\n selected={selected}\n onChange={(e) => {\n handleClose()\n onChange(e)\n }}\n />\n </GroupWrapper>\n ))}\n </ResponsiveDrawer>\n </Paper>","option"],"sources":["../src/components/lasso-tool/icons.tsx","../src/components/lasso-tool/const.tsx","../src/components/lasso-tool/styles.ts","../src/components/lasso-tool/options-sections.tsx","../src/components/lasso-tool/chip.tsx","../src/components/lasso-tool/toolbar/styles.ts","../src/components/lasso-tool/toolbar/button.tsx","../src/components/lasso-tool/toolbar/actions/redo-action.tsx","../src/components/lasso-tool/toolbar/actions/undo-action.tsx","../src/components/lasso-tool/undo-redo.tsx","../src/components/lasso-tool/tools-context.tsx","../src/components/lasso-tool/lasso-tool.tsx","../src/components/lasso-tool/lasso-tool-inline.tsx","../src/components/lasso-tool/toolbar/toolbar.tsx","../src/components/lasso-tool/toolbar/actions/toggle-type-action.tsx","../src/components/lasso-tool/toolbar/actions/action-menu.tsx","../src/components/lasso-tool/toolbar/actions/color-action.tsx","../src/components/lasso-tool/toolbar/actions/label-action.tsx","../src/components/lasso-tool/toolbar/actions/edit-properties-action.tsx","../src/components/lasso-tool/toolbar/actions/lock-action.tsx","../src/components/lasso-tool/toolbar/actions/delete-action.tsx","../src/components/lasso-tool/toolbar/actions/fill-action.tsx","../src/components/lasso-tool/toolbar/actions/stroke-action.tsx","../src/components/lasso-tool/toolbar/actions/edit-geometry-action.tsx","../src/components/lasso-tool/toolbar/actions/union-action.tsx","../src/components/lasso-tool/toolbar/actions/split-action.tsx","../src/components/lasso-tool/toolbar/actions/subtract-action.tsx","../src/components/lasso-tool/toolbar/actions/intersect-action.tsx","../src/components/lasso-tool/toolbar/actions/duplicate-action.tsx","../src/components/lasso-tool/toolbar/actions/accept-action.tsx","../src/components/lasso-tool/toolbar/actions/cancel-action.tsx","../src/components/lasso-tool/toolbar/context.tsx","../src/components/lasso-tool/toolbar/connected.tsx","../src/components/lasso-tool/geometry-toolbar.tsx","../src/components/lasso-tool/layer-filters.tsx","../src/components/lasso-tool/message.tsx","../src/components/lasso-tool/edit-confirm-toolbar.tsx","../src/components/measurement-tools/icons.tsx","../src/components/measurement-tools/const.tsx","../src/components/measurement-tools/styles.ts","../src/components/measurement-tools/measurement-tools.tsx","../src/components/geolocation-controls/const.ts","../src/components/geolocation-controls/geolocation-controls.tsx","../src/components/zoom-controls/styles.ts","../src/components/zoom-controls/zoom-controls.tsx","../src/components/list-data/list-data-skeleton.tsx","../src/components/no-data-alert/no-data-alert.tsx","../src/hooks/use-skeleton.ts","../src/components/list-data/styles.ts","../src/components/list-data/list-data.tsx","../src/components/basemaps/styles.ts","../src/components/basemaps/const.ts","../src/components/basemaps/header.tsx","../src/components/basemaps/group-wrapper.tsx","../src/components/basemaps/group.tsx","../src/components/responsive-drawer/responsive-drawer.tsx","../src/components/basemaps/basemaps.tsx"],"sourcesContent":["import type { SVGProps } from 'react'\n\nexport function DrawPolygonIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M4 18a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm16 0a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm-2.829 1a2.996 2.996 0 0 0 0 2H6.829a2.995 2.995 0 0 0 0-2h10.342Zm-2.463-5.707 3.998 4a3.013 3.013 0 0 0-1.414 1.414l-4-3.999a3.014 3.014 0 0 0 1.31-1.214l.106-.201ZM2.998 6.829a2.995 2.995 0 0 0 2.002 0v10.342a2.993 2.993 0 0 0-2.002 0V6.83ZM12 10a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm1.84-3.919c.464.483 1.09.81 1.79.896l-1.47 2.94a2.992 2.992 0 0 0-1.79-.894l1.47-2.942ZM16 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4ZM4 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm9.171.998a2.994 2.994 0 0 0 0 2.002H6.829a2.995 2.995 0 0 0 0-2.002h6.342Z'\n fill='currentColor'\n />\n </svg>\n )\n}\n\nexport function DrawSquareIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M4 18a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm16 0a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm-2.829 1a2.993 2.993 0 0 0-.17.974l-.001.052.007.183a3 3 0 0 0 .164.79H6.829a2.995 2.995 0 0 0 0-2h10.342ZM2.998 6.828a2.995 2.995 0 0 0 2.002 0V17.17a2.993 2.993 0 0 0-2.002 0V6.83Zm16.001 0a2.995 2.995 0 0 0 2 0V17.17a2.993 2.993 0 0 0-2 0V6.829ZM20 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4ZM4 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4Zm13.171.998a2.991 2.991 0 0 0-.17.976L17 4.026l.007.183a3 3 0 0 0 .164.79H6.829a2.995 2.995 0 0 0 0-2H17.17Z'\n fill='currentColor'\n />\n </svg>\n )\n}\n\nexport function DrawCircleIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M12 2c5.523 0 10 4.477 10 10s-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2Zm0 2a8 8 0 1 0 0 16 8 8 0 0 0 0-16Zm0 6a2 2 0 1 1 0 4 2 2 0 0 1 0-4Z'\n fill='currentColor'\n />\n </svg>\n )\n}\n\nexport function DrawLassoIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M12 3c4.935 0 9 3.736 9 9l-.002.343-.012.668c-.012.438-.033.86-.062 1.266l-.05.597C20.498 18.767 19.267 21 17 21c-1.192 0-1.971-.341-2.988-1.122l-.472-.375c-.401-.319-.64-.473-.888-.566a4.938 4.938 0 0 0-.415-.13l-.34-.085-.398-.086-.456-.086-.66-.111-1.708-.273a9.112 9.112 0 0 1-.952-.206C5.46 17.301 3 14.954 3 12.015c0-1.508.485-2.995 1.436-4.458.355.585.906 1.04 1.562 1.272C5.328 9.916 5 10.977 5 12.015c0 1.889 1.78 3.588 3.282 4.025l.085.023.345.076.517.092 1.619.257.583.1.518.098.237.05.433.103c.272.07.512.143.73.224.434.161.783.373 1.235.718l.457.362c.806.646 1.24.857 1.959.857.893 0 1.63-1.518 1.895-4.45l.045-.585c.013-.2.024-.407.033-.62l.02-.655c.005-.224.007-.454.007-.69 0-4.12-3.133-7-7-7a1 1 0 1 1 0-2ZM7 4a2 2 0 1 1 0 4 2 2 0 0 1 0-4Z'\n fill='currentColor'\n />\n </svg>\n )\n}\n\nexport function SelectToolIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='m10.083 19.394.057.113a1 1 0 0 0 1.72.007l2.869-4.786 4.786-2.87a1 1 0 0 0-.121-1.777l-14-6c-.83-.356-1.669.483-1.313 1.313l6.002 14ZM6.905 6.904l9.903 4.244-3.322 1.995-.102.069a1 1 0 0 0-.242.274l-1.992 3.321-4.245-9.903Z'\n fill='currentColor'\n />\n </svg>\n )\n}\n\n/** Freehand-selection glyph: the lasso trace with a selection cursor. */\nexport function LassoSelectIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 24 24'\n {...props}\n >\n <g transform='scale(0.75)'>\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M12 3c4.935 0 9 3.736 9 9l-.002.343-.012.668c-.012.438-.033.86-.062 1.266l-.05.597C20.498 18.767 19.267 21 17 21c-1.192 0-1.971-.341-2.988-1.122l-.472-.375c-.401-.319-.64-.473-.888-.566a4.938 4.938 0 0 0-.415-.13l-.34-.085-.398-.086-.456-.086-.66-.111-1.708-.273a9.112 9.112 0 0 1-.952-.206C5.46 17.301 3 14.954 3 12.015c0-1.508.485-2.995 1.436-4.458.355.585.906 1.04 1.562 1.272C5.328 9.916 5 10.977 5 12.015c0 1.889 1.78 3.588 3.282 4.025l.085.023.345.076.517.092 1.619.257.583.1.518.098.237.05.433.103c.272.07.512.143.73.224.434.161.783.373 1.235.718l.457.362c.806.646 1.24.857 1.959.857.893 0 1.63-1.518 1.895-4.45l.045-.585c.013-.2.024-.407.033-.62l.02-.655c.005-.224.007-.454.007-.69 0-4.12-3.133-7-7-7a1 1 0 1 1 0-2ZM7 4a2 2 0 1 1 0 4 2 2 0 0 1 0-4Z'\n fill='currentColor'\n />\n </g>\n <path\n transform='translate(12.5 11.5) scale(0.48)'\n fillRule='evenodd'\n clipRule='evenodd'\n d='m10.083 19.394.057.113a1 1 0 0 0 1.72.007l2.869-4.786 4.786-2.87a1 1 0 0 0-.121-1.777l-14-6c-.83-.356-1.669.483-1.313 1.313l6.002 14ZM6.905 6.904l9.903 4.244-3.322 1.995-.102.069a1 1 0 0 0-.242.274l-1.992 3.321-4.245-9.903Z'\n fill='currentColor'\n />\n </svg>\n )\n}\n\n/**\n * Union/join glyph: two rings with the overlap filled by a dot grid.\n * From Figma node 6985:35371.\n *\n * The Figma glyph spans 14.25 of the 24 units; the rest of this set spans 20, so\n * it read visibly smaller in the toolbar. Scaled about its own center\n * ((4.5+18.75)/2, (5.25+18.75)/2) by 20/14.25 ≈ 1.4 to match them.\n */\nexport function UnionIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n transform='translate(12 12) scale(1.4) translate(-11.625 -12)'\n fillRule='evenodd'\n clipRule='evenodd'\n d='M13.5 5.25C16.3995 5.25 18.75 7.60051 18.75 10.5C18.75 13.0426 16.9425 15.163 14.5424 15.6465C13.7221 17.4758 11.8848 18.75 9.75 18.75C6.85051 18.75 4.5 16.3995 4.5 13.5C4.5 10.9574 6.30747 8.83696 8.70762 8.35348C9.52794 6.52422 11.3652 5.25 13.5 5.25ZM8.26868 10.0539L8.21987 10.0754C6.91155 10.6608 6 11.974 6 13.5C6 15.5711 7.67893 17.25 9.75 17.25C10.9981 17.25 12.1038 16.6402 12.7855 15.7024C10.2239 15.3531 8.25 13.1571 8.25 10.5C8.25 10.3498 8.25631 10.201 8.26868 10.0539ZM9.82552 9.75075L9.80431 9.86051C9.7686 10.0683 9.75 10.282 9.75 10.5C9.75 12.5457 11.3881 14.2088 13.4241 14.2492C13.4742 14.0072 13.5 13.7566 13.5 13.5C13.5 11.4542 11.8617 9.79097 9.82552 9.75075ZM13.5 6.75C12.2519 6.75 11.1462 7.35976 10.4645 8.29764C13.0261 8.64685 15 10.8429 15 13.5C15 13.6502 14.9937 13.799 14.9813 13.9461C16.3152 13.3724 17.25 12.0454 17.25 10.5C17.25 8.42893 15.5711 6.75 13.5 6.75ZM12.75 13.125C12.96 13.125 13.125 13.29 13.125 13.5C13.125 13.71 12.96 13.875 12.75 13.875C12.54 13.875 12.375 13.71 12.375 13.5C12.375 13.29 12.54 13.125 12.75 13.125ZM11.625 12.75C11.835 12.75 12 12.915 12 13.125C12 13.335 11.835 13.5 11.625 13.5C11.415 13.5 11.25 13.335 11.25 13.125C11.25 12.915 11.415 12.75 11.625 12.75ZM12.75 12C12.96 12 13.125 12.165 13.125 12.375C13.125 12.585 12.96 12.75 12.75 12.75C12.54 12.75 12.375 12.585 12.375 12.375C12.375 12.165 12.54 12 12.75 12ZM11.625 11.625C11.835 11.625 12 11.79 12 12C12 12.21 11.835 12.375 11.625 12.375C11.415 12.375 11.25 12.21 11.25 12C11.25 11.79 11.415 11.625 11.625 11.625ZM10.5 11.25C10.71 11.25 10.875 11.415 10.875 11.625C10.875 11.835 10.71 12 10.5 12C10.29 12 10.125 11.835 10.125 11.625C10.125 11.415 10.29 11.25 10.5 11.25ZM11.625 10.5C11.835 10.5 12 10.665 12 10.875C12 11.085 11.835 11.25 11.625 11.25C11.415 11.25 11.25 11.085 11.25 10.875C11.25 10.665 11.415 10.5 11.625 10.5ZM10.5 10.125C10.71 10.125 10.875 10.29 10.875 10.5C10.875 10.71 10.71 10.875 10.5 10.875C10.29 10.875 10.125 10.71 10.125 10.5C10.125 10.29 10.29 10.125 10.5 10.125Z'\n fill='currentColor'\n />\n </svg>\n )\n}\n\n/** Spatial-mask glyph (circle with horizontal \"globe\" stripes) for the lasso\n * geometry toolbar's mask/draw toggle. From Figma node 5960:14347. */\nexport function SpatialMaskIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n // The exported glyph filled its 15×15 box edge to edge, so next to the\n // MUI icons (whose glyphs leave a margin inside 24×24) it rendered ~20%\n // bigger. Same box and same 20-unit glyph as the rest of the set now.\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n transform='translate(12 12) scale(1.33333) translate(-7.5 -7.5)'\n fillRule='evenodd'\n clipRule='evenodd'\n d='M15 7.5C15 11.6421 11.6421 15 7.5 15C3.35786 15 0 11.6421 0 7.5C0 3.35786 3.35786 0 7.5 0C11.6421 0 15 3.35786 15 7.5ZM13.5 7.5C13.5 10.8137 10.8137 13.5 7.5 13.5C6.44531 13.5 5.45418 13.2279 4.59299 12.75H6.85607C7.29596 12.3013 7.67991 11.7975 7.99663 11.25H2.81597C2.62675 11.014 2.45501 10.7633 2.30269 10.5H8.37593C8.58402 10.0237 8.74407 9.52171 8.84997 9H1.68903C1.62614 8.75568 1.57826 8.50533 1.54642 8.25H8.96297C8.98746 8.00332 9 7.75312 9 7.5C9 7.24688 8.98746 6.99668 8.96297 6.75H1.54642C1.57826 6.49467 1.62614 6.24432 1.68903 6H8.84997C8.74407 5.47829 8.58402 4.97625 8.37593 4.5H2.30269C2.45501 4.2367 2.62675 3.98604 2.81597 3.75H7.99663C7.67991 3.20248 7.29596 2.69872 6.85607 2.25H4.59299C5.45418 1.77213 6.44531 1.5 7.5 1.5C10.8137 1.5 13.5 4.18629 13.5 7.5Z'\n fill='currentColor'\n />\n </svg>\n )\n}\n\n/** \"Aa\" glyph for the lasso geometry toolbar's rename action. From Figma node\n * 5960:14347. */\nexport function TextAaIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n // Same reason as SpatialMaskIcon: the exported box was the glyph's own\n // bounding box, so it rendered edge to edge. 20 units wide inside 24×24.\n viewBox='0 0 24 24'\n {...props}\n >\n <path\n transform='translate(12 12) scale(1.2597) translate(-7.9385 -5.34375)'\n fillRule='evenodd'\n clipRule='evenodd'\n d='M5.4 0L9.18 10.5H7.56L6.72 8.085H2.475L1.62 10.5H0L3.795 0H5.4ZM4.605 1.95C4.515 2.31 4.395 2.705 4.245 3.135L2.955 6.705H6.24L4.965 3.135C4.785 2.645 4.665 2.25 4.605 1.95ZM12.9247 2.5875C13.3083 2.5875 13.6514 2.6203 13.9542 2.68591C14.257 2.75152 14.5649 2.87769 14.8778 3.06442C15.1907 3.25114 15.4355 3.55143 15.6121 3.96526C15.7887 4.37909 15.877 4.88881 15.877 5.49442V10.5058H14.363V9.83965C13.818 10.4049 13.1114 10.6875 12.2434 10.6875C11.4258 10.6875 10.7622 10.4629 10.2525 10.0138C9.74275 9.5646 9.48789 8.92619 9.48789 8.09853C9.48789 7.26077 9.77555 6.62488 10.3509 6.19086C10.9262 5.75685 11.6277 5.53984 12.4554 5.53984C13.2124 5.53984 13.8483 5.69124 14.363 5.99404V5.57012C14.363 4.99479 14.2318 4.586 13.9694 4.34376C13.707 4.10152 13.2881 3.9804 12.7127 3.9804C11.8649 3.9804 11.1281 4.21255 10.5023 4.67685L10.0329 3.38993C10.8101 2.85498 11.7741 2.5875 12.9247 2.5875ZM12.7127 6.90245C12.2081 6.90245 11.7968 7.00086 11.4788 7.19769C11.1609 7.39451 11.0019 7.69479 11.0019 8.09853C11.0019 8.47199 11.1331 8.7647 11.3955 8.97666C11.658 9.18862 12.0365 9.2946 12.5311 9.2946C13.2578 9.2946 13.8684 9.01703 14.363 8.46189V7.28096C13.8886 7.02862 13.3385 6.90245 12.7127 6.90245Z'\n fill='currentColor'\n />\n </svg>\n )\n}\n","import type { LassoToolsMode, LassoToolsModesMapping } from '../types'\nimport {\n DrawPolygonIcon,\n DrawSquareIcon,\n DrawCircleIcon,\n DrawLassoIcon,\n LassoSelectIcon,\n SelectToolIcon,\n TextAaIcon,\n} from './icons'\nimport type { LassoToolsComponentProps } from './types'\nimport type { RequiredDeep } from 'type-fest'\n\nexport const LASSO_TOOLS_LABELS: NonNullable<\n RequiredDeep<LassoToolsComponentProps['labels']>\n> = {\n action: {\n tooltip: {\n active: 'Click on the map to draw your spatial filter',\n inactive: 'Click on the map to draw your spatial filter',\n },\n },\n chip: {\n tooltip: {\n active: 'Hide drawing',\n inactive: 'Show drawing',\n },\n },\n options: {\n mode: {\n title: 'Choose a drawing tool',\n options: {\n circle: 'Circle',\n lasso: 'Lasso tool',\n polygon: 'Polygon',\n rectangle: 'Rectangle',\n text: 'Text',\n select: 'Select features',\n 'lasso-select': 'Lasso select',\n },\n },\n interactionMode: {\n title: 'Interaction mode',\n mask: 'Mask',\n draw: 'Draw',\n },\n selection: {\n title: 'Selection tools',\n },\n layerFilters: 'Layer filters',\n },\n noData: {\n title: 'Spatial filter not applied',\n description:\n 'Select a drawing or editing tool and click on the map to define your spatial filter',\n },\n actions: {\n toggleAll: {\n active: 'Hide all',\n inactive: 'Show all',\n },\n deleteAll: 'Remove all',\n more: 'More actions',\n },\n undoRedo: {\n undo: 'Undo',\n redo: 'Redo',\n },\n} as const\n\nexport const DEFAULT_LASSO_TOOLS_MODES_MAPPING: LassoToolsModesMapping<LassoToolsMode> =\n {\n polygon: {\n icon: <DrawPolygonIcon />,\n },\n rectangle: {\n icon: <DrawSquareIcon />,\n },\n circle: {\n icon: <DrawCircleIcon />,\n },\n lasso: {\n icon: <DrawLassoIcon />,\n },\n text: {\n icon: <TextAaIcon />,\n },\n select: {\n icon: <SelectToolIcon />,\n },\n 'lasso-select': {\n icon: <LassoSelectIcon />,\n },\n } as const\n","import { alpha, type SxProps, type Theme } from '@mui/material'\n\ntype SxEntry = Exclude<\n NonNullable<SxProps<Theme>>,\n readonly unknown[] | boolean\n>\n\n/**\n * Merges a component's own `sx` with the caller's. Needed because `SxProps` is\n * not always an object — a function or an array is silently dropped by an\n * object spread — and MUI's array form rejects falsy entries.\n */\nexport function mergeSx(...values: (SxProps<Theme> | undefined)[]): SxEntry[] {\n return values\n .flat()\n .filter((entry): entry is SxEntry => !!entry && entry !== true)\n}\n\n/**\n * Ceiling for the options menu, replacing the design system's fixed 312px.\n * `dvh` so it follows the mobile address bar.\n *\n * The 96px gutter is MUI's own allowance, and it is not decorative: MUI's\n * Popover measures the paper mid-`Grow` (at scale 0.75), underestimates its\n * height and then fails to shift it up, so a taller ceiling overflows the\n * bottom of a short viewport and the last entries become unreachable — with a\n * 32px gutter, \"Layer filters\" landed off-screen on a 420px-tall window. This\n * leaves room for the anchor offset instead. The whole menu fits from a 511px\n * viewport up and scrolls below that.\n */\nconst MENU_MAX_HEIGHT = 'calc(100dvh - 96px)'\n\nexport const styles = {\n container: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-start',\n overflow: 'hidden',\n width: 'fit-content',\n\n '&.inline': {\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: ({ spacing }) => spacing(1),\n // Horizontal separators between compound blocks. Blocks own no\n // `<Divider flexItem />` — omitting/reordering never orphans or doubles\n // rules. Vertical Dividers inside Modes/Actions stay in those blocks.\n '& > * + *': {\n borderTop: 1,\n borderColor: 'divider',\n paddingTop: ({ spacing }) => spacing(1),\n },\n },\n },\n actions: {\n icon: {\n width: ({ spacing }) => spacing(4),\n height: ({ spacing }) => spacing(4),\n borderRadius: 0,\n '.MuiTouchRipple-ripple .MuiTouchRipple-child': {\n borderRadius: 0,\n },\n },\n },\n options: {\n // The design system caps menus and their lists at 312px (\"defined by\n // design\"), but this menu is not a plain option list — interaction mode,\n // drawing tools, selection tools and layer filters add up to 415px, so the\n // last entries fell behind an unannounced scroll. Both the paper and the\n // list carry the cap, and the DS selectors are self-qualified (0,2,0), so\n // these have to be too.\n paper: { '&.MuiMenu-paper': { maxHeight: MENU_MAX_HEIGHT } },\n menu: {\n '&.MuiMenu-list': { maxHeight: MENU_MAX_HEIGHT },\n paddingY: ({ spacing }) => spacing(1),\n '&.inline': {\n boxShadow: 'none',\n backgroundColor: 'transparent',\n borderRadius: ({ spacing }) => spacing(0.5),\n\n '& .MuiDivider-root': {\n height: ({ spacing }) => spacing(4),\n\n '&.MuiToggleButtonGroup-groupedHorizontal': {\n height: ({ spacing }) => spacing(4),\n },\n '&.MuiToggleButtonGroup-groupedVertical': {\n height: 'auto',\n width: ({ spacing }) => spacing(4),\n margin: ({ spacing }) => `${spacing(0.5, 0, 1)} !important`,\n borderRadius: '0 !important',\n },\n },\n\n '& .MuiToggleButton-sizeSmall': {\n margin: 0,\n\n '&.MuiToggleButtonGroup-grouped:not(.MuiDivider-root)': {\n margin: 0,\n },\n '& + .MuiDivider-root.MuiToggleButtonGroup-groupedHorizontal': {\n height: ({ spacing }) => spacing(3),\n },\n '& + .MuiDivider-root.MuiToggleButtonGroup-groupedVertical': {\n height: 'auto',\n width: ({ spacing }) => spacing(3),\n },\n },\n\n '.MuiToggleButtonGroup-grouped:not(.MuiDivider-root)': {\n margin: 0,\n\n '&:first-of-type': {\n marginLeft: 0,\n },\n '&:not(:last-of-type)': {\n marginRight: ({ spacing }) => spacing(0.5),\n },\n },\n '&.MuiToggleButtonGroup-horizontal:not(.MuiDivider-root)': {\n '.MuiToggleButtonGroup-grouped': {\n margin: ({ spacing }) => spacing(0, 0.5),\n },\n },\n '&.MuiToggleButtonGroup-vertical:not(.MuiDivider-root)': {\n '.MuiToggleButtonGroup-grouped': {\n margin: ({ spacing }) => spacing(0, 0, 0.5),\n\n '&:not(:last-of-type)': {\n marginRight: 0,\n },\n '&:last-of-type': {\n marginBottom: 0,\n },\n },\n },\n },\n },\n icon: {\n borderRadius: 0,\n width: ({ spacing }) => spacing(3),\n },\n title: {\n paddingX: ({ spacing }) => spacing(2),\n paddingBottom: ({ spacing }) => spacing(0.5),\n\n '&.inline': {\n paddingX: 0,\n paddingBottom: 0,\n },\n },\n icons: {\n color: ({ palette }) => palette.text.primary,\n },\n tag: {\n borderRadius: ({ spacing }) => spacing(0.25),\n border: '1px solid',\n borderColor: ({ palette }) => palette.primary.main,\n paddingX: ({ spacing }) => spacing(0.5),\n color: ({ palette }) => palette.primary.main,\n backgroundColor: ({ palette }) => alpha(palette.primary.main, 0.08),\n },\n more: {\n width: ({ spacing }) => spacing(4),\n },\n },\n chip: {\n container: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(0.5),\n overflowX: 'auto',\n scrollbarWidth: 'none',\n paddingX: ({ spacing }) => spacing(1),\n\n '&.inline': {\n overflowX: 'visible',\n flexWrap: 'wrap',\n },\n },\n chip: {\n marginRight: ({ spacing }) => spacing(0.5),\n },\n disabled: {\n opacity: ({ palette }) => palette.action.disabledOpacity,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import {\n ListItemIcon,\n ListItemText,\n MenuItem,\n Radio,\n Typography,\n} from '@mui/material'\nimport type { JSX } from 'react'\nimport { LASSO_TOOLS_LABELS } from './const'\nimport { styles } from './styles'\nimport type { LassoGeometryType } from './types'\n\nexport interface InteractionModeSectionProps {\n value: LassoGeometryType\n labels?: { title?: string; mask?: string; draw?: string }\n onChange: (mode: LassoGeometryType) => void\n /** When true, the Mask radio is disabled (e.g. while the text draw mode is active). */\n maskDisabled?: boolean\n}\n\n/**\n * \"Interaction mode\" section (Mask/Draw) for the lasso options menu.\n * Composable: rendered by `LassoToolsUI.Options` when\n * `onChangeInteractionMode` is provided, and usable standalone in custom\n * menus — it MUST live under an ancestor with `role=\"menu\"`/`\"menubar\"`\n * (`menuitemradio` is only valid inside one). Selecting an option does not\n * close the menu.\n *\n * Rendered as `MenuItem`s with `role=\"menuitemradio\"` — NOT a `RadioGroup`:\n * MUI's `MenuList` skips non-MenuItem children in arrow-key navigation and\n * closes the menu on Tab, so a radio group inside the menu would be\n * unreachable by keyboard. The `Radio` glyph is purely decorative\n * (`aria-hidden`); the checked state lives in `aria-checked`.\n */\nexport function InteractionModeSection({\n value,\n labels,\n onChange,\n maskDisabled = false,\n}: InteractionModeSectionProps): JSX.Element {\n const options = [\n {\n mode: 'mask' as const,\n label: labels?.mask ?? LASSO_TOOLS_LABELS.options.interactionMode.mask,\n },\n {\n mode: 'draw' as const,\n label: labels?.draw ?? LASSO_TOOLS_LABELS.options.interactionMode.draw,\n },\n ]\n\n return (\n <>\n <Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n >\n {labels?.title ?? LASSO_TOOLS_LABELS.options.interactionMode.title}\n </Typography>\n {options.map(({ mode, label }) => {\n // The Mask radio is disabled while e.g. the text draw mode is\n // active — text annotations are `draw`-only.\n const disabled = mode === 'mask' && maskDisabled\n return (\n <MenuItem\n key={mode}\n role='menuitemradio'\n aria-checked={value === mode}\n disabled={disabled}\n dense\n onClick={() => {\n if (disabled) return\n onChange(mode)\n }}\n >\n <ListItemIcon sx={{ minWidth: 28 }}>\n <Radio\n size='small'\n checked={value === mode}\n disabled={disabled}\n tabIndex={-1}\n disableRipple\n // Fully decorative: no handler and no pointer events, or a\n // click on the glyph would fire both the input's change AND\n // the MenuItem's click (`readOnly` silences the\n // controlled-without-onChange warning).\n sx={{ p: 0, pointerEvents: 'none' }}\n inputProps={{\n 'aria-hidden': true,\n tabIndex: -1,\n readOnly: true,\n }}\n />\n </ListItemIcon>\n <ListItemText primaryTypographyProps={{ variant: 'body2' }}>\n {label}\n </ListItemText>\n </MenuItem>\n )\n })}\n </>\n )\n}\n","import { LockOutlined } from '@mui/icons-material'\nimport { Chip, SvgIcon } from '@mui/material'\nimport type { PickDeep } from 'type-fest'\nimport { LASSO_TOOLS_LABELS } from './const'\nimport { SpatialMaskIcon } from './icons'\nimport { mergeSx, styles } from './styles'\nimport type { LassoToolsComponentProps, LassoToolsData } from './types'\nimport { Tooltip } from '../tooltip/tooltip'\n\nconst CHIP_ICON_SIZE = 14\n\nexport function LassoToolsUIChip({\n chipProps,\n value,\n labels,\n onChipToggle,\n onDelete,\n}: Pick<LassoToolsComponentProps, 'chipProps' | 'onDelete' | 'onChipToggle'> & {\n value: LassoToolsData\n labels?: PickDeep<LassoToolsComponentProps['labels'], 'chip'>['chip']\n}) {\n const chipState = value.visible ? 'active' : 'inactive'\n const chipLabel =\n labels?.tooltip?.[chipState] ?? LASSO_TOOLS_LABELS.chip.tooltip[chipState]\n\n // `sx` and `onClick` pulled out of the spread: spread after the internal\n // props, they would REPLACE them — a caller sx would erase the base styles\n // and a caller onClick (analytics…) would silently kill the visibility\n // toggle. Instead the sx is merged and the onClick composed. `label` and\n // `onDelete` need no runtime handling: the `ChipsProps` type Omits them,\n // so a caller can't override the label or re-arm delete on a locked chip.\n const { sx, onClick, ...ChipsProps } = chipProps?.ChipsProps ?? {}\n\n return (\n <Tooltip title={chipLabel} placement='bottom' {...chipProps?.TooltipProps}>\n <Chip\n sx={mergeSx(styles.chip.chip, sx)}\n color={value.visible ? 'secondary' : 'default'}\n size='small'\n // Padlock when locked; otherwise the mask glyph. Draw geometries are\n // filtered out of the chip strip and never reach this component.\n icon={\n value.locked ? (\n <LockOutlined sx={{ fontSize: CHIP_ICON_SIZE }} />\n ) : (\n <SvgIcon\n component={SpatialMaskIcon}\n inheritViewBox\n sx={{ fontSize: CHIP_ICON_SIZE }}\n />\n )\n }\n // Locked geometries are read-only: the store refuses to delete them\n // anyway, so omitting the handler drops the affordance instead of\n // shipping a delete \"x\" that's a silent no-op.\n onDelete={value.locked ? undefined : () => onDelete(value.id)}\n label={value.label}\n onClick={(event) => {\n onChipToggle(value.id, !value.visible)\n onClick?.(event)\n }}\n {...ChipsProps}\n />\n </Tooltip>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\n\n/** Icon font-size shared by every toolbar action. */\nexport const ICON_SIZE = 18\n\nconst container = {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n width: 'fit-content',\n gap: ({ spacing }) => spacing(0.5),\n p: ({ spacing }) => spacing(0.5),\n borderRadius: ({ spacing }) => spacing(0.5),\n backgroundColor: ({ palette }) => palette.background.paper,\n} satisfies SxProps<Theme>\n\nconst baseButton = {\n p: ({ spacing }) => spacing(0.375),\n borderRadius: ({ spacing }) => spacing(0.5),\n '.MuiTouchRipple-ripple .MuiTouchRipple-child': {\n borderRadius: ({ spacing }) => spacing(0.5),\n },\n // ColorDot (and other non-currentColor icons) ignore `color: action.disabled`;\n // opacity is what makes the swatch look disabled like SVG icons.\n '&.Mui-disabled': {\n opacity: ({ palette }) => palette.action.disabledOpacity,\n },\n} satisfies SxProps<Theme>\n\n/** Active = Figma toggle \"selected\" treatment (primary tint); inactive = gray. */\nconst toggleButton = (active: boolean): SxProps<Theme> => ({\n ...baseButton,\n color: ({ palette }) =>\n active ? palette.primary.main : palette.text.secondary,\n backgroundColor: active ? 'rgba(3, 111, 226, 0.08)' : 'transparent',\n '&:hover': {\n backgroundColor: ({ palette }) =>\n active ? 'rgba(3, 111, 226, 0.12)' : palette.action.hover,\n },\n})\n\nexport const styles = { container, baseButton, toggleButton }\n","import { IconButton } from '@mui/material'\nimport type { MouseEvent, ReactNode } from 'react'\nimport { Tooltip } from '../../tooltip/tooltip'\nimport { styles } from './styles'\n\nexport interface LassoToolbarButtonUIProps {\n /** Tooltip and `aria-label` of the button. */\n label: string\n /** Keyboard-shortcut hint appended to the tooltip, e.g. `\"⌘Z\"`. */\n shortcut?: string\n icon: ReactNode\n /** Highlights the button with the primary tint. */\n active?: boolean\n /** When set, exposes `aria-pressed` so the button reads as a toggle. */\n pressed?: boolean\n disabled?: boolean\n color?: 'error'\n /** For triggers that open a menu (`ActionMenu`). */\n 'aria-haspopup'?: 'menu'\n 'aria-expanded'?: boolean\n onClick: (event: MouseEvent<HTMLButtonElement>) => void\n}\n\n/**\n * Icon button for lasso toolbars: CARTO `Tooltip`, accessible labeling and the\n * active/pressed toggle treatment. The `span` wrapper keeps the tooltip firing\n * while the button is disabled.\n */\nexport function LassoToolbarButtonUI({\n label,\n shortcut,\n icon,\n active = false,\n pressed,\n disabled = false,\n color,\n 'aria-haspopup': ariaHasPopup,\n 'aria-expanded': ariaExpanded,\n onClick,\n}: LassoToolbarButtonUIProps): ReactNode {\n return (\n <Tooltip\n title={shortcut ? `${label} (${shortcut})` : label}\n placement='top'\n >\n <span>\n <IconButton\n aria-label={label}\n aria-pressed={pressed}\n aria-haspopup={ariaHasPopup}\n aria-expanded={ariaExpanded}\n disabled={disabled}\n color={color}\n onClick={onClick}\n sx={color ? styles.baseButton : styles.toggleButton(active)}\n >\n {icon}\n </IconButton>\n </span>\n </Tooltip>\n )\n}\n","import { RedoOutlined } from '@mui/icons-material'\nimport type { JSX } from 'react'\nimport { LassoToolbarButtonUI } from '../button'\nimport { ICON_SIZE } from '../styles'\n\nexport const REDO_ACTION_LABELS = {\n redo: 'Redo',\n} as const\n\nexport interface RedoActionProps {\n /** Usually `!canRedo`. */\n disabled?: boolean\n label?: string\n /** Keyboard-shortcut hint appended to the tooltip, e.g. `\"⌘⇧Z\"`. */\n shortcut?: string\n onRedo: () => void\n}\n\n/** Re-apply the last undone lasso modification. */\nexport function RedoAction({\n disabled = false,\n label,\n shortcut,\n onRedo,\n}: RedoActionProps): JSX.Element {\n return (\n <LassoToolbarButtonUI\n label={label ?? REDO_ACTION_LABELS.redo}\n shortcut={shortcut}\n disabled={disabled}\n onClick={onRedo}\n icon={<RedoOutlined sx={{ fontSize: ICON_SIZE }} />}\n />\n )\n}\n","import { UndoOutlined } from '@mui/icons-material'\nimport type { JSX } from 'react'\nimport { LassoToolbarButtonUI } from '../button'\nimport { ICON_SIZE } from '../styles'\n\nexport const UNDO_ACTION_LABELS = {\n undo: 'Undo',\n} as const\n\nexport interface UndoActionProps {\n /** Usually `!canUndo`. */\n disabled?: boolean\n label?: string\n /** Keyboard-shortcut hint appended to the tooltip, e.g. `\"⌘Z\"`. */\n shortcut?: string\n onUndo: () => void\n}\n\n/** Undo the last committed lasso modification. */\nexport function UndoAction({\n disabled = false,\n label,\n shortcut,\n onUndo,\n}: UndoActionProps): JSX.Element {\n return (\n <LassoToolbarButtonUI\n label={label ?? UNDO_ACTION_LABELS.undo}\n shortcut={shortcut}\n disabled={disabled}\n onClick={onUndo}\n icon={<UndoOutlined sx={{ fontSize: ICON_SIZE }} />}\n />\n )\n}\n","import { Box, type BoxProps } from '@mui/material'\nimport type { JSX } from 'react'\nimport { RedoAction } from './toolbar/actions/redo-action'\nimport { UndoAction } from './toolbar/actions/undo-action'\nimport { mergeSx } from './styles'\n\nexport interface LassoUndoRedoUIProps {\n canUndo: boolean\n canRedo: boolean\n onUndo: () => void\n onRedo: () => void\n labels?: { undo?: string; redo?: string }\n /** Keyboard-shortcut hints appended to each tooltip, e.g. `{ undo: '⌘Z' }`. */\n shortcuts?: { undo?: string; redo?: string }\n BoxProps?: BoxProps\n}\n\n/**\n * Self-contained undo/redo block (two icon buttons, disabled when their stack\n * is empty). Composable: drop it in the lasso main toolbar (e.g.\n * `LassoToolsUI.UndoRedo`), a `LassoToolbarUI`, or anywhere else, wired to\n * `LassoTools.UndoRedo` from `@carto/ps-react-maps`.\n */\nexport function LassoUndoRedoUI({\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n labels,\n shortcuts,\n BoxProps: { sx, ...BoxProps } = {},\n}: LassoUndoRedoUIProps): JSX.Element {\n return (\n <Box\n sx={mergeSx(\n { display: 'flex', flexDirection: 'row', alignItems: 'center' },\n sx,\n )}\n {...BoxProps}\n >\n <UndoAction\n disabled={!canUndo}\n label={labels?.undo}\n shortcut={shortcuts?.undo}\n onUndo={onUndo}\n />\n <RedoAction\n disabled={!canRedo}\n label={labels?.redo}\n shortcut={shortcuts?.redo}\n onRedo={onRedo}\n />\n </Box>\n )\n}\n","import { createContext, useContext, type ReactNode } from 'react'\nimport type { LassoToolsUIContextValue } from './types'\n\n/**\n * The props `LassoToolsUI` / `LassoToolsInlineUI` publish for compound blocks.\n *\n * Pinned to the default mode union on purpose: the shells themselves are not\n * generic (their context values are typed with `M = LassoToolsMode`), and\n * widening this alone — e.g. to `LassoToolsUIContextValue<string>` — does not\n * compile: `onChangeMode: (mode: LassoToolsMode) => void` is not assignable to\n * `(mode: string) => void` (parameter contravariance). Supporting custom mode\n * unions end-to-end means making the shell and its blocks generic.\n */\nconst LassoToolsUIContext = createContext<LassoToolsUIContextValue | null>(null)\n\nexport function LassoToolsUIProvider({\n value,\n children,\n}: {\n value: LassoToolsUIContextValue\n children: ReactNode\n}) {\n return (\n <LassoToolsUIContext.Provider value={value}>\n {children}\n </LassoToolsUIContext.Provider>\n )\n}\n\n/**\n * Merges a block's own props over the toolbar's context, so the blocks work\n * both ways: with explicit props, or written bare as children\n * (`<LassoToolsUI.Chips />`). Explicit props always win.\n */\nexport function useLassoToolsUIArgs<T extends LassoToolsUIContextValue>(\n props: T,\n): T & LassoToolsUIContextValue {\n const context = useContext(LassoToolsUIContext)\n\n if (!context) return props\n\n const defined = Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as T\n\n return { ...context, ...defined }\n}\n","import {\n ArrowDropDown,\n LayersOutlined,\n MoreVertOutlined,\n} from '@mui/icons-material'\nimport {\n Box,\n Divider,\n IconButton,\n ListItemIcon,\n ListItemText,\n Menu,\n MenuItem,\n Paper,\n SvgIcon,\n ToggleButton,\n Typography,\n type SxProps,\n type Theme,\n} from '@mui/material'\nimport deepmerge from 'deepmerge'\nimport {\n useMemo,\n useState,\n type ComponentProps,\n type JSX,\n type MouseEvent,\n type PropsWithChildren,\n type ReactNode,\n} from 'react'\nimport type { PickDeep } from 'type-fest'\nimport { Tooltip } from '../tooltip/tooltip'\nimport type { LassoToolsModes } from '../types'\nimport { LassoToolsUIChip } from './chip'\nimport { LASSO_TOOLS_LABELS } from './const'\nimport { InteractionModeSection } from './options-sections'\nimport { LassoUndoRedoUI } from './undo-redo'\nimport { LassoToolsUIProvider, useLassoToolsUIArgs } from './tools-context'\nimport { mergeSx, styles } from './styles'\nimport type {\n LassoToolsComponentProps,\n LassoToolsUIContextValue,\n OptionsChildrenProps,\n} from './types'\n\nconst EMPTY_VALUES: LassoToolsComponentProps['values'] = []\nconst EMPTY_PAPER_PROPS: NonNullable<LassoToolsComponentProps['PaperProps']> =\n {}\n\n/**\n * Floating interface for spatial selection and drawing — a shell that publishes\n * wiring props on context. **Which blocks it has is the consumer's call** —\n * list them as children. See `stories/modules/lasso/lasso-tools-toolbar.tsx`\n * for the full CARTO design.\n *\n * @example\n * ```tsx\n * <LassoToolsUI {...props}>\n * <LassoToolsUI.Action />\n * <LassoToolsUI.OptionsMenu />\n * <LassoToolsUI.UndoRedo />\n * <LassoToolsUI.Chips />\n * <LassoToolsUI.SecondaryActions />\n * </LassoToolsUI>\n * ```\n */\nexport function LassoToolsUI({\n enabled,\n values = EMPTY_VALUES,\n actionProps,\n chipProps,\n labels,\n modes,\n modesMapping,\n modeSelected,\n interactionMode,\n PaperProps: { sx, ...PaperProps } = EMPTY_PAPER_PROPS,\n onActionToggle,\n onChipToggle,\n onDelete,\n onChangeMode,\n onChangeInteractionMode,\n interactionModeMaskDisabled,\n onAllChipToggle,\n onAllDelete,\n onLayerFilters,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n shortcuts,\n children,\n}: LassoToolsComponentProps): JSX.Element {\n const contextValue: LassoToolsUIContextValue = {\n enabled,\n values,\n actionProps,\n chipProps,\n labels,\n modes,\n modesMapping,\n modeSelected,\n interactionMode,\n PaperProps,\n onActionToggle,\n onChipToggle,\n onDelete,\n onChangeMode,\n onChangeInteractionMode,\n interactionModeMaskDisabled,\n onAllChipToggle,\n onAllDelete,\n onLayerFilters,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n shortcuts,\n }\n return (\n <Paper\n // Array merge: `sx` can be an object, a function or an array (see mergeSx).\n sx={mergeSx(styles.container, sx)}\n {...PaperProps}\n >\n <LassoToolsUIProvider value={contextValue}>\n {children}\n </LassoToolsUIProvider>\n </Paper>\n )\n}\n\nfunction LassoToolsUIAction({\n actionProps,\n labels,\n enabled,\n children,\n onActionToggle,\n}: PropsWithChildren<\n Pick<\n LassoToolsComponentProps,\n 'actionProps' | 'enabled' | 'onActionToggle'\n > & {\n labels?: PickDeep<LassoToolsComponentProps['labels'], 'action'>['action']\n }\n>) {\n const actionState = enabled ? 'active' : 'inactive'\n const actionLabel =\n labels?.tooltip?.[actionState] ??\n LASSO_TOOLS_LABELS.action.tooltip[actionState]\n\n return (\n <Tooltip\n title={actionLabel}\n placement='right'\n {...actionProps?.TooltipProps}\n >\n <ToggleButton\n value='toggle'\n sx={styles.actions.icon}\n onClick={() => onActionToggle(!enabled)}\n aria-label={actionLabel}\n selected={enabled}\n >\n {children}\n </ToggleButton>\n </Tooltip>\n )\n}\n\nconst EMPTY_TRIGGER_PROPS: { Icon?: ReactNode; sx?: SxProps<Theme> } = {}\n\nfunction Options({\n TriggerProps = EMPTY_TRIGGER_PROPS,\n MenuProps,\n children,\n}: {\n TriggerProps?: {\n Icon?: ReactNode\n sx?: SxProps<Theme>\n /** Accessible name for the (icon-only) trigger button. */\n 'aria-label'?: string\n }\n MenuProps?: Partial<ComponentProps<typeof Menu>>\n children: (props: OptionsChildrenProps) => JSX.Element\n}) {\n const {\n Icon,\n sx,\n 'aria-label': ariaLabel = LASSO_TOOLS_LABELS.options.mode.title,\n } = TriggerProps\n const IconNode = Icon ?? <ArrowDropDown />\n\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null)\n\n const open = Boolean(anchorEl)\n\n const handleToggle = (event: MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget)\n }\n\n const handleClose = () => {\n setAnchorEl(null)\n }\n\n return (\n <>\n <IconButton\n aria-label={ariaLabel}\n sx={mergeSx(styles.options.icon, sx)}\n onClick={handleToggle}\n >\n {IconNode}\n </IconButton>\n <Menu\n id='lasso-menu'\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n MenuListProps={{\n sx: styles.options.menu,\n // Focus the LIST on open. The menu's children come from a render\n // prop (a component element), so MUI can never index an item to\n // auto-focus: focus would stay on the Paper and the first ArrowDown\n // would escape to the focus-trap sentinel — keyboard-unreachable.\n // With the list focused, arrow keys traverse the DOM children.\n autoFocus: true,\n }}\n // The paper carries the same height ceiling as the list — it clips it\n // otherwise. `slotProps.paper` because `PaperProps` is deprecated.\n slotProps={{ paper: { sx: styles.options.paper } }}\n {...MenuProps}\n >\n {/* No wrapper: MenuList expects its MenuItem/Divider children\n directly, or arrow-key navigation and typeahead break. */}\n {children({ onClose: handleClose })}\n </Menu>\n </>\n )\n}\n\nfunction ModeList({\n data,\n labels,\n children,\n}: {\n labels?: PickDeep<LassoToolsComponentProps['labels'], 'options'>['options']\n data: LassoToolsComponentProps['modes'][keyof LassoToolsModes][]\n children: ReactNode\n}) {\n if (data.length <= 1) {\n return null\n }\n\n const modeTitle = labels?.mode?.title ?? LASSO_TOOLS_LABELS.options.mode.title\n\n return (\n <>\n <Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n >\n {modeTitle}\n </Typography>\n {children}\n </>\n )\n}\n\nfunction OptionsList({\n data,\n modeSelected,\n labels,\n onChangeMode,\n onClose,\n}: Required<Pick<LassoToolsComponentProps, 'modeSelected' | 'onChangeMode'>> & {\n labels?: PickDeep<LassoToolsComponentProps['labels'], 'options'>['options']\n data: (LassoToolsComponentProps['modes'] &\n LassoToolsComponentProps['modesMapping'])[keyof LassoToolsModes][]\n onClose: OptionsChildrenProps['onClose']\n}) {\n const handleClick = (\n e: MouseEvent<HTMLLIElement>,\n value: NonNullable<(typeof data)[number]>['value'],\n ) => {\n e.preventDefault()\n onChangeMode?.(value)\n onClose()\n }\n\n return (\n data\n // `modesMapping` keys with no matching `modes` entry carry an icon but no\n // `value`: unselectable and unlabelled, so they never render.\n .filter((mode): mode is NonNullable<typeof mode> => Boolean(mode?.value))\n .map((mode) => {\n const options =\n labels?.mode?.options ?? LASSO_TOOLS_LABELS.options.mode.options\n // Falls back to the raw value for a custom mode the caller didn't\n // label: an empty ListItemText would otherwise leave the item with\n // no visible text and no accessible name.\n const label = options[mode.value] ?? mode.value\n\n return (\n <MenuItem\n key={mode.value}\n disabled={!!mode.disabled}\n onClick={(e) => handleClick(e, mode.value)}\n selected={mode.value === modeSelected}\n >\n <ListItemIcon sx={styles.options.icons}>\n {/* Deliberate svg-in-svg: see the inline OptionsList's note. */}\n <SvgIcon>{mode.icon}</SvgIcon>\n </ListItemIcon>\n <ListItemText>{label}</ListItemText>\n </MenuItem>\n )\n })\n )\n}\n\nfunction SecondaryActionsWrapper({\n values,\n labels,\n onAllChipToggle,\n onAllDelete,\n}: LassoToolsUIContextValue) {\n // Chip strip is mask-only; omit draw even if a caller passes them.\n const chipValues = values?.filter((value) => value.type !== 'draw') ?? []\n\n if (chipValues.length <= 1) {\n return null\n }\n\n const hasVisible = chipValues.some((value) => value.visible)\n\n const toggleAllLabel = hasVisible\n ? (labels?.actions?.toggleAll?.active ??\n LASSO_TOOLS_LABELS.actions.toggleAll.active)\n : (labels?.actions?.toggleAll?.inactive ??\n LASSO_TOOLS_LABELS.actions.toggleAll.inactive)\n\n const deleteAllLabel =\n labels?.actions?.deleteAll ?? LASSO_TOOLS_LABELS.actions.deleteAll\n\n return (\n <>\n <Divider orientation='vertical' flexItem />\n <Options\n TriggerProps={{\n Icon: <MoreVertOutlined />,\n sx: styles.options.more,\n 'aria-label':\n labels?.actions?.more ?? LASSO_TOOLS_LABELS.actions.more,\n }}\n MenuProps={{\n anchorOrigin: {\n vertical: 'bottom',\n horizontal: 'right',\n },\n transformOrigin: {\n vertical: 'top',\n horizontal: 'right',\n },\n }}\n >\n {(props) => {\n return (\n <>\n <MenuItem\n color='inherit'\n onClick={() => {\n onAllChipToggle?.()\n props.onClose()\n }}\n >\n {toggleAllLabel}\n </MenuItem>\n <Divider />\n <MenuItem\n color='error'\n onClick={() => {\n onAllDelete?.()\n props.onClose()\n }}\n >\n <Typography variant='body2' color='error'>\n {deleteAllLabel}\n </Typography>\n </MenuItem>\n </>\n )\n }}\n </Options>\n </>\n )\n}\n\nconst ActionsWrapperBase = function ActionsWrapperBase({\n modes,\n modesMapping,\n modeSelected,\n actionProps,\n enabled,\n labels,\n onActionToggle,\n}: LassoToolsUIContextValue & {\n labels?: PickDeep<LassoToolsComponentProps['labels'], 'actions'>['actions']\n}) {\n const data = useMemo(() => {\n return deepmerge(modes ?? {}, modesMapping ?? {})\n }, [modes, modesMapping])\n\n const handleToggle: LassoToolsComponentProps['onActionToggle'] = (data) => {\n return onActionToggle?.(data)\n }\n\n const modeExists = modeSelected ? modeSelected in (modes ?? {}) : false\n\n // Fallback taken from `modes`, not from the merge: a `modesMapping`-only key\n // is not a real mode and must never be marked as the active one.\n const mode = (modeExists ? modeSelected : Object.keys(modes ?? {})[0]) as\n keyof typeof data | undefined\n\n // Guarded: an empty `modes` registry leaves no fallback key at all, and\n // indexing with `undefined` would silently coerce to the string key\n // \"undefined\" instead of just being unset.\n const modeSelectedValue = mode != null ? data[mode] : null\n\n return (\n <LassoToolsUIAction\n actionProps={actionProps}\n labels={labels?.action}\n enabled={enabled ?? false}\n onActionToggle={handleToggle}\n >\n {modeSelectedValue?.icon}\n </LassoToolsUIAction>\n )\n}\n\nconst ChipsWrapperBase = function ChipsWrapperBase({\n values,\n labels,\n chipProps,\n onDelete,\n onChipToggle,\n onActionToggle,\n}: LassoToolsUIContextValue) {\n const handleDelete: LassoToolsComponentProps['onDelete'] = (valueId) => {\n onActionToggle?.(false)\n return onDelete?.(valueId)\n }\n\n // Chip strip is mask-only; omit draw even if a caller passes them.\n // Undefined type = legacy mask and is kept.\n const chipValues = values?.filter((value) => value.type !== 'draw') ?? []\n\n return (\n !!chipValues.length && (\n <Box sx={styles.chip.container}>\n {chipValues.map((value) => (\n <LassoToolsUIChip\n key={value.id}\n value={value}\n labels={labels?.chip}\n chipProps={chipProps}\n onDelete={handleDelete}\n onChipToggle={(id, data) => onChipToggle?.(id, data)}\n />\n ))}\n </Box>\n )\n )\n}\n\nconst SecondaryActionsWrapperBase = SecondaryActionsWrapper\n\nconst UndoRedoWrapperBase = function UndoRedoWrapperBase({\n enabled,\n labels,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n shortcuts,\n}: LassoToolsUIContextValue) {\n // Only meaningful while the tool is on and history handlers are wired.\n if (!enabled || !onUndo || !onRedo) {\n return null\n }\n\n return (\n <>\n <Divider orientation='vertical' flexItem />\n <LassoUndoRedoUI\n canUndo={!!canUndo}\n canRedo={!!canRedo}\n onUndo={onUndo}\n onRedo={onRedo}\n labels={labels?.undoRedo}\n shortcuts={shortcuts}\n />\n </>\n )\n}\n\nconst OptionsWrapperBase = function OptionsWrapperBase({\n modes,\n modesMapping,\n modeSelected,\n interactionMode,\n interactionModeMaskDisabled,\n labels,\n onChangeMode,\n onChangeInteractionMode,\n ...props\n}: LassoToolsUIContextValue & OptionsChildrenProps) {\n const data = useMemo(() => {\n return deepmerge(modes ?? {}, modesMapping ?? {})\n }, [modes, modesMapping])\n\n // Selection modes render in their own \"Selection tools\" section.\n const { select, 'lasso-select': lassoSelect, ..._modes } = data\n\n const modeExists = modeSelected ? modeSelected in (modes ?? {}) : false\n\n // Fallback taken from `modes`, not from the merge: a `modesMapping`-only key\n // is not a real mode and must never be marked as the active one. `null` (not\n // a smuggled `undefined`) when `modes` is empty — OptionsList's contract is\n // `M | null`.\n const mode =\n ((modeExists ? modeSelected : Object.keys(modes ?? {})[0]) as\n keyof typeof data | undefined) ?? null\n\n // Filtered here, not just inside OptionsList: these counts gate the section\n // heading and the divider, so a mapping-only key would render a \"Selection\n // tools\" header (or a drawing-tools title) with nothing under it.\n const modesValues = Object.values(_modes).filter((mode) => mode?.value)\n const selectionModes = [select, lassoSelect].filter((mode) => mode?.value)\n\n const handleChangeMode: LassoToolsComponentProps['onChangeMode'] = (data) => {\n return onChangeMode?.(data)\n }\n\n const selectionTitle =\n labels?.options?.selection?.title ??\n LASSO_TOOLS_LABELS.options.selection.title\n\n return (\n <>\n {!!onChangeInteractionMode && (\n <>\n <InteractionModeSection\n value={interactionMode ?? 'mask'}\n labels={labels?.options?.interactionMode}\n onChange={onChangeInteractionMode}\n maskDisabled={interactionModeMaskDisabled}\n />\n <Divider />\n </>\n )}\n <ModeList data={modesValues} labels={labels?.options}>\n <OptionsList\n {...props}\n labels={labels?.options}\n data={modesValues}\n modeSelected={mode}\n onChangeMode={handleChangeMode}\n />\n </ModeList>\n {selectionModes.length > 0 && (\n <>\n <Divider />\n <Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n >\n {selectionTitle}\n </Typography>\n {/*\n Never gated on `values`: that is the chips list (masks only), so a\n draw-only map would have its selection modes disabled and its draw\n geometries unreachable — they have no chips either. Entering select\n mode with nothing to select is a harmless no-op.\n */}\n <OptionsList\n {...props}\n labels={labels?.options}\n data={selectionModes}\n modeSelected={mode}\n onChangeMode={handleChangeMode}\n />\n </>\n )}\n {!!props.onLayerFilters && (\n <>\n <Divider />\n <MenuItem\n onClick={() => {\n props.onLayerFilters?.()\n props.onClose()\n }}\n >\n <ListItemIcon sx={styles.options.icons}>\n <LayersOutlined />\n </ListItemIcon>\n <ListItemText>\n {labels?.options?.layerFilters ?? 'Layer filters'}\n </ListItemText>\n </MenuItem>\n </>\n )}\n </>\n )\n}\n\n// ==================== Blocks ====================\n//\n// Every block works two ways: with explicit props (how the default composition\n// spreads them) or bare inside `children`, where it reads them from the\n// toolbar's context — the widgets-v2 contract.\n\ntype BlockProps = Parameters<typeof ActionsWrapperBase>[0]\n\nLassoToolsUI.Action = function Action(props: BlockProps) {\n return <ActionsWrapperBase {...useLassoToolsUIArgs(props)} />\n}\n\nLassoToolsUI.Chips = function Chips(\n props: Parameters<typeof ChipsWrapperBase>[0],\n) {\n return <ChipsWrapperBase {...useLassoToolsUIArgs(props)} />\n}\n\nLassoToolsUI.SecondaryActions = function SecondaryActions(\n props: Parameters<typeof SecondaryActionsWrapperBase>[0],\n) {\n return <SecondaryActionsWrapperBase {...useLassoToolsUIArgs(props)} />\n}\n\nLassoToolsUI.UndoRedo = function UndoRedo(\n props: Parameters<typeof UndoRedoWrapperBase>[0],\n) {\n return <UndoRedoWrapperBase {...useLassoToolsUIArgs(props)} />\n}\n\n/** Menu contents for a custom options trigger. Prefer `.OptionsMenu` for the bundled trigger + menu. */\nLassoToolsUI.Options = function Options(\n props: Parameters<typeof OptionsWrapperBase>[0],\n) {\n return <OptionsWrapperBase {...useLassoToolsUIArgs(props)} />\n}\n\n/**\n * Trigger + dropdown + default options contents in one block.\n */\nLassoToolsUI.OptionsMenu = function OptionsMenu(\n props: Omit<\n Parameters<typeof OptionsWrapperBase>[0],\n keyof OptionsChildrenProps\n >,\n) {\n const args = useLassoToolsUIArgs(props)\n\n return (\n <Options>\n {(childrenProps) => <OptionsWrapperBase {...args} {...childrenProps} />}\n </Options>\n )\n}\n","import {\n Divider,\n Typography,\n SvgIcon,\n ToggleButton,\n Box,\n ToggleButtonGroup,\n Button,\n} from '@mui/material'\nimport { useMemo, type JSX, type MouseEvent, type ReactNode } from 'react'\nimport { mergeSx, styles } from './styles'\nimport type {\n LassoToolsInlineComponentProps,\n LassoToolsUIContextValue,\n} from './types'\nimport { LASSO_TOOLS_LABELS } from './const'\nimport type { PickDeep } from 'type-fest'\nimport type { LassoToolsModes } from '../types'\nimport type { LassoGeometryType } from './types'\nimport deepmerge from 'deepmerge'\nimport { LassoToolsUIChip } from './chip'\nimport { Tooltip } from '../tooltip/tooltip'\nimport { LassoUndoRedoUI } from './undo-redo'\nimport { LassoToolsUIProvider, useLassoToolsUIArgs } from './tools-context'\n\nconst EMPTY_VALUES: LassoToolsInlineComponentProps['values'] = []\nconst EMPTY_BOX_PROPS: NonNullable<LassoToolsInlineComponentProps['BoxProps']> =\n {}\n\n/**\n * Inline layout variant of the lasso tools toolbar — a shell that publishes\n * wiring props on context. **Which blocks it has is the consumer's call** —\n * list them as children. See `stories/modules/lasso/lasso-tools-inline-toolbar.tsx`\n * for the full CARTO design.\n *\n * @example\n * ```tsx\n * <LassoToolsInlineUI {...props}>\n * <LassoToolsInlineUI.Modes />\n * <LassoToolsInlineUI.InteractionMode>\n * <LassoToolsInlineUI.UndoRedo />\n * </LassoToolsInlineUI.InteractionMode>\n * <LassoToolsInlineUI.Chips />\n * <LassoToolsInlineUI.Actions />\n * </LassoToolsInlineUI>\n * ```\n */\nexport function LassoToolsInlineUI({\n enabled,\n values = EMPTY_VALUES,\n chipProps,\n labels,\n modes,\n modesMapping,\n modeSelected,\n interactionMode,\n BoxProps: { sx, ...BoxProps } = EMPTY_BOX_PROPS,\n onChipToggle,\n onDelete,\n onChangeMode,\n onChangeInteractionMode,\n onAllChipToggle,\n onAllDelete,\n onLayerFilters,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n shortcuts,\n children,\n}: LassoToolsInlineComponentProps): JSX.Element {\n const contextValue: LassoToolsUIContextValue = {\n enabled,\n values,\n chipProps,\n labels,\n modes,\n modesMapping,\n modeSelected,\n interactionMode,\n onChipToggle,\n onDelete,\n onChangeMode,\n onChangeInteractionMode,\n onAllChipToggle,\n onAllDelete,\n onLayerFilters,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n shortcuts,\n }\n\n return (\n <Box\n // Array merge: `sx` can be an object, a function or an array.\n sx={mergeSx(styles.container, sx)}\n {...BoxProps}\n className='inline'\n >\n <LassoToolsUIProvider value={contextValue}>\n {children}\n </LassoToolsUIProvider>\n </Box>\n )\n}\n\n// ==================== Blocks ====================\n//\n// Every block works two ways: with explicit props or bare inside `children`,\n// where it reads them from the toolbar's context — same contract as\n// LassoToolsUI. Each block is a single DOM root so shell CSS separators work.\n\nfunction InteractionModeWrapperBase({\n interactionMode,\n labels,\n onChangeInteractionMode,\n children,\n}: LassoToolsUIContextValue & { children?: ReactNode }): JSX.Element | null {\n const showToggles = !!onChangeInteractionMode\n const hasChildren = children != null && children !== false\n\n if (!showToggles && !hasChildren) {\n return null\n }\n\n const title =\n labels?.options?.interactionMode?.title ??\n LASSO_TOOLS_LABELS.options.interactionMode.title\n\n return (\n <Box sx={{ width: '100%' }}>\n {showToggles && (\n <Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n className='inline'\n >\n {title}\n </Typography>\n )}\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n gap: 1,\n flexWrap: 'wrap',\n width: '100%',\n }}\n >\n {showToggles && (\n <InteractionModeToggles\n value={interactionMode ?? 'mask'}\n labels={labels?.options}\n onChange={onChangeInteractionMode}\n />\n )}\n {children}\n </Box>\n </Box>\n )\n}\n\nfunction ModesWrapperBase({\n enabled,\n modes = {},\n modesMapping = {},\n modeSelected,\n labels,\n onChangeMode,\n}: LassoToolsUIContextValue): JSX.Element | null {\n const data = useMemo(() => {\n return deepmerge(modes, modesMapping)\n }, [modes, modesMapping])\n\n // Selection modes render after a divider, like the floating menu.\n const { select, 'lasso-select': lassoSelect, ..._modes } = data\n // See the floating menu: the counts gate the divider and the group, so\n // mapping-only keys (no `value`) have to be dropped here too.\n const selectionModes = [select, lassoSelect].filter((mode) => mode?.value)\n const modesValues = Object.values(_modes).filter((mode) => mode?.value)\n const count = modesValues.length + selectionModes.length\n\n if (count <= 1) {\n return null\n }\n\n const handleClick = (\n evt: MouseEvent<HTMLElement>,\n mode: NonNullable<(typeof modes)[keyof typeof modes]>['value'],\n ) => {\n evt.preventDefault()\n onChangeMode?.(mode)\n }\n\n const modeExists = (modeSelected ?? '') in modes\n\n // From `modes`, not the merge: a mapping-only key is not a real mode.\n const mode = (modeExists ? modeSelected : Object.keys(modes)[0]) as\n keyof typeof data | undefined\n\n // Guarded: an empty `modes` registry leaves no fallback key at all, and\n // indexing with `undefined` would silently coerce to the string key\n // \"undefined\" instead of just being unset.\n const modeSelectedValue = enabled && mode != null ? data[mode] : null\n\n const modeTitle =\n labels?.options?.mode?.title ?? LASSO_TOOLS_LABELS.options.mode.title\n\n return (\n <Box>\n <Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n className='inline'\n >\n {modeTitle}\n </Typography>\n {/* Gated on the combined count, not just `modesValues`: a config with\n only selection modes (or one drawing mode + selection modes) still\n has more than one option to pick from and must stay reachable. */}\n <ToggleButtonGroup\n // `null`, not `undefined`, for \"no selection\": MUI's controlled\n // contract for ToggleButtonGroup expects one or the other\n // consistently, and `undefined` here would flip it in and out of\n // controlled mode across renders (e.g. toggling `enabled`).\n value={modeSelectedValue?.value ?? null}\n exclusive\n className='inline'\n sx={styles.options.menu}\n onChange={handleClick}\n >\n <OptionsList labels={labels?.options} data={modesValues} />\n {/* Only between the two groups when both have entries — otherwise\n a lone divider would lead the row with nothing before it. */}\n {modesValues.length > 0 && selectionModes.length > 0 && (\n <Divider orientation='vertical' />\n )}\n {selectionModes.length > 0 && (\n // Not gated on `values` (chips = masks only): see the floating menu.\n <OptionsList labels={labels?.options} data={selectionModes} />\n )}\n </ToggleButtonGroup>\n </Box>\n )\n}\n\nfunction UndoRedoWrapperBase({\n enabled,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n labels,\n shortcuts,\n}: LassoToolsUIContextValue): JSX.Element | null {\n if (!enabled || !onUndo || !onRedo) {\n return null\n }\n\n return (\n <Box>\n <LassoUndoRedoUI\n canUndo={!!canUndo}\n canRedo={!!canRedo}\n onUndo={onUndo}\n onRedo={onRedo}\n labels={labels?.undoRedo}\n shortcuts={shortcuts}\n />\n </Box>\n )\n}\n\nfunction ChipsWrapperBase({\n values = EMPTY_VALUES,\n chipProps,\n labels,\n onChipToggle,\n onDelete,\n}: LassoToolsUIContextValue): JSX.Element {\n const handleDelete: LassoToolsInlineComponentProps['onDelete'] = (\n valueId,\n ) => {\n return onDelete?.(valueId)\n }\n\n // Chip strip is mask-only; omit draw even if a caller passes them.\n // Undefined type = legacy mask and is kept.\n const chipValues = values.filter((value) => value.type !== 'draw')\n\n return (\n <Box>\n <NoData hasValues={!!chipValues.length} labels={labels?.noData} />\n {!!chipValues.length && (\n <Box sx={styles.chip.container} className='inline'>\n {chipValues.map((value) => (\n <LassoToolsUIChip\n key={value.id}\n value={value}\n labels={labels?.chip}\n chipProps={chipProps}\n onDelete={handleDelete}\n onChipToggle={onChipToggle ?? (() => undefined)}\n />\n ))}\n </Box>\n )}\n </Box>\n )\n}\n\nfunction ActionsWrapperBase({\n values = EMPTY_VALUES,\n labels,\n onAllChipToggle,\n onAllDelete,\n onLayerFilters,\n}: LassoToolsUIContextValue): JSX.Element | null {\n // Bulk chip actions are mask-only; omit draw even if a caller passes them.\n const chipValues = values.filter((value) => value.type !== 'draw')\n const showBulkActions = chipValues.length > 1\n\n if (!showBulkActions && !onLayerFilters) {\n return null\n }\n\n const hasVisible = chipValues.some((value) => value.visible)\n\n const toggleAllLabel = hasVisible\n ? (labels?.actions?.toggleAll?.active ??\n LASSO_TOOLS_LABELS.actions.toggleAll.active)\n : (labels?.actions?.toggleAll?.inactive ??\n LASSO_TOOLS_LABELS.actions.toggleAll.inactive)\n\n const deleteAllLabel =\n labels?.actions?.deleteAll ?? LASSO_TOOLS_LABELS.actions.deleteAll\n\n const layerFiltersLabel =\n labels?.options?.layerFilters ?? LASSO_TOOLS_LABELS.options.layerFilters\n\n return (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n {showBulkActions && (\n <>\n <Button color='inherit' onClick={() => onAllChipToggle?.()}>\n {toggleAllLabel}\n </Button>\n <Button color='error' onClick={() => onAllDelete?.()}>\n {deleteAllLabel}\n </Button>\n </>\n )}\n {/* Only between the two groups when both are present — a lone divider\n would lead the row with nothing before it. */}\n {showBulkActions && !!onLayerFilters && (\n <Divider orientation='vertical' flexItem />\n )}\n {!!onLayerFilters && (\n <Button color='inherit' onClick={() => onLayerFilters()}>\n {layerFiltersLabel}\n </Button>\n )}\n </Box>\n )\n}\n\nLassoToolsInlineUI.InteractionMode = function InteractionMode(\n props: Parameters<typeof InteractionModeWrapperBase>[0],\n) {\n return <InteractionModeWrapperBase {...useLassoToolsUIArgs(props)} />\n}\n\nLassoToolsInlineUI.Modes = function Modes(\n props: Parameters<typeof ModesWrapperBase>[0],\n) {\n return <ModesWrapperBase {...useLassoToolsUIArgs(props)} />\n}\n\nLassoToolsInlineUI.UndoRedo = function UndoRedo(\n props: Parameters<typeof UndoRedoWrapperBase>[0],\n) {\n return <UndoRedoWrapperBase {...useLassoToolsUIArgs(props)} />\n}\n\nLassoToolsInlineUI.Chips = function Chips(\n props: Parameters<typeof ChipsWrapperBase>[0],\n) {\n return <ChipsWrapperBase {...useLassoToolsUIArgs(props)} />\n}\n\nLassoToolsInlineUI.Actions = function Actions(\n props: Parameters<typeof ActionsWrapperBase>[0],\n) {\n return <ActionsWrapperBase {...useLassoToolsUIArgs(props)} />\n}\n\nfunction InteractionModeToggles({\n value,\n labels,\n onChange,\n}: {\n value: LassoGeometryType\n labels?: PickDeep<\n LassoToolsInlineComponentProps['labels'],\n 'options'\n >['options']\n onChange: (mode: LassoGeometryType) => void\n}) {\n const maskLabel =\n labels?.interactionMode?.mask ??\n LASSO_TOOLS_LABELS.options.interactionMode.mask\n const drawLabel =\n labels?.interactionMode?.draw ??\n LASSO_TOOLS_LABELS.options.interactionMode.draw\n\n return (\n <ToggleButtonGroup\n value={value}\n exclusive\n className='inline'\n sx={styles.options.menu}\n onChange={(_evt, mode: LassoGeometryType | null) => {\n if (mode) {\n onChange(mode)\n }\n }}\n >\n <ToggleButton value='mask'>{maskLabel}</ToggleButton>\n <ToggleButton value='draw'>{drawLabel}</ToggleButton>\n </ToggleButtonGroup>\n )\n}\n\nfunction OptionsList({\n data,\n labels,\n}: {\n labels?: PickDeep<\n LassoToolsInlineComponentProps['labels'],\n 'options'\n >['options']\n data: (LassoToolsInlineComponentProps['modes'] &\n LassoToolsInlineComponentProps['modesMapping'])[keyof LassoToolsModes][]\n}) {\n return (\n data\n // See the floating menu's OptionsList: mapping-only entries have no `value`.\n .filter((mode): mode is NonNullable<typeof mode> => Boolean(mode?.value))\n .map((mode) => {\n const options =\n labels?.mode?.options ?? LASSO_TOOLS_LABELS.options.mode.options\n // Falls back to the raw value for a custom mode the caller didn't\n // label: an unlabeled icon-only toggle would otherwise have no\n // accessible name at all.\n const label = options[mode.value] ?? mode.value\n\n return (\n <Tooltip key={mode.value} title={label} placement='bottom'>\n <ToggleButton\n disabled={!!mode.disabled}\n value={mode.value}\n aria-label={label}\n >\n {/* `mode.icon` is a full-svg element, so this nests svg-in-svg\n on purpose: a nested svg defaults to 100% of the SvgIcon\n viewport (not the 300×150 CSS default, which only applies\n top-level), so it sizes/clips correctly — verified with DOM\n measurements. `component` can't be used here: the mapping\n API takes ReactNode elements, not component references. */}\n <SvgIcon>{mode.icon}</SvgIcon>\n </ToggleButton>\n </Tooltip>\n )\n })\n )\n}\n\nfunction NoData({\n hasValues,\n labels,\n}: {\n hasValues: boolean\n labels: PickDeep<LassoToolsInlineComponentProps['labels'], 'noData'>['noData']\n}) {\n if (hasValues) {\n return null\n }\n\n const title = labels?.title ?? LASSO_TOOLS_LABELS.noData.title\n const description =\n labels?.description ?? LASSO_TOOLS_LABELS.noData.description\n\n return (\n <>\n <Typography variant='body1' color='textSecondary'>\n {title}\n </Typography>\n <Typography variant='body2' color='textSecondary'>\n {description}\n </Typography>\n </>\n )\n}\n","import { Divider, Paper } from '@mui/material'\nimport type { ComponentProps, JSX, PropsWithChildren, Ref } from 'react'\nimport { mergeSx } from '../styles'\nimport { styles } from './styles'\n\nexport interface LassoToolbarUIProps extends PropsWithChildren {\n /**\n * `ref` excluded: in React 19 it travels as a regular prop inside\n * `ComponentProps`, and the spread below would silently replace the\n * toolbar-controlled `ref` (which e.g. anchors the rename popover in\n * `LassoGeometryToolbarUI`). Use the toolbar's own `ref` prop instead.\n */\n PaperProps?: Omit<ComponentProps<typeof Paper>, 'ref'>\n ref?: Ref<HTMLDivElement>\n}\n\n/**\n * Generic floating toolbar for lasso actions: a `Paper` row hosting\n * self-contained action buttons (see `toolbar/actions`). Compose any mix of\n * actions and dividers:\n *\n * @example\n * ```tsx\n * <LassoToolbarUI>\n * <LabelAction label={label} onRename={onRename} onSetTextPresentation={...} />\n * <LassoToolbarUI.Divider />\n * <DeleteAction onDelete={onDelete} />\n * </LassoToolbarUI>\n * ```\n */\nexport function LassoToolbarUI({\n children,\n PaperProps: { sx, ...PaperProps } = {},\n ref,\n}: LassoToolbarUIProps): JSX.Element {\n return (\n <Paper\n ref={ref}\n elevation={6}\n sx={mergeSx(styles.container, sx)}\n {...PaperProps}\n >\n {children}\n </Paper>\n )\n}\n\nLassoToolbarUI.Divider = function LassoToolbarUIDivider(): JSX.Element {\n return <Divider orientation='vertical' flexItem />\n}\n","import { SvgIcon } from '@mui/material'\nimport type { JSX } from 'react'\nimport { SpatialMaskIcon } from '../../icons'\nimport type { LassoGeometryType } from '../../types'\nimport { LassoToolbarButtonUI } from '../button'\nimport { ICON_SIZE } from '../styles'\n\nexport const TOGGLE_TYPE_ACTION_LABELS = {\n mask: 'Switch to mask',\n draw: 'Switch to drawing',\n} as const\n\nexport interface ToggleTypeActionProps {\n /** Current geometry type; the button is active/pressed when `mask`. */\n type: LassoGeometryType\n disabled?: boolean\n labels?: { mask?: string; draw?: string }\n /** Called with the opposite type. */\n onToggleType: (type: LassoGeometryType) => void\n}\n\n/** Mask/draw toggle: fixed mask glyph, active tint while the geometry masks. */\nexport function ToggleTypeAction({\n type,\n disabled = false,\n labels,\n onToggleType,\n}: ToggleTypeActionProps): JSX.Element {\n const label =\n type === 'mask'\n ? (labels?.draw ?? TOGGLE_TYPE_ACTION_LABELS.draw)\n : (labels?.mask ?? TOGGLE_TYPE_ACTION_LABELS.mask)\n\n return (\n <LassoToolbarButtonUI\n label={label}\n active={type === 'mask'}\n pressed={type === 'mask'}\n disabled={disabled}\n onClick={() => onToggleType(type === 'mask' ? 'draw' : 'mask')}\n icon={\n <SvgIcon\n component={SpatialMaskIcon}\n inheritViewBox\n sx={{ fontSize: ICON_SIZE }}\n />\n }\n />\n )\n}\n","import { ListItemIcon, ListItemText, Menu, MenuItem } from '@mui/material'\nimport { useState, type JSX, type MouseEvent, type ReactNode } from 'react'\nimport { LassoToolbarButtonUI } from '../button'\n\nexport interface ActionMenuOption<V extends string> {\n value: V\n label: string\n icon?: ReactNode\n disabled?: boolean\n /**\n * When set, called instead of `onChange` (e.g. open a native color picker).\n * The menu still closes.\n */\n onSelect?: () => void\n}\n\nexport interface ActionMenuProps<V extends string> {\n /** Tooltip and `aria-label` of the trigger button. */\n label: string\n icon: ReactNode\n disabled?: boolean\n value: V\n options: ActionMenuOption<V>[]\n onChange: (value: V) => void\n /**\n * Keep the Menu in the same DOM tree as its trigger (needed when nested\n * inside a Popover so picking a color doesn't dismiss the parent).\n */\n disablePortal?: boolean\n}\n\n/** Internal: toolbar button that opens a single-select options menu. */\nexport function ActionMenu<V extends string>({\n label,\n icon,\n disabled = false,\n value,\n options,\n onChange,\n disablePortal = false,\n}: ActionMenuProps<V>): JSX.Element {\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null)\n const open = Boolean(anchorEl)\n\n return (\n <>\n <LassoToolbarButtonUI\n label={label}\n active={open}\n disabled={disabled}\n aria-haspopup='menu'\n aria-expanded={open || undefined}\n onClick={(event) => setAnchorEl(event.currentTarget)}\n icon={icon}\n />\n <Menu\n anchorEl={anchorEl}\n open={open}\n onClose={() => setAnchorEl(null)}\n disablePortal={disablePortal}\n // Nested menus inside a Popover: don't steal focus / blur the name field\n // in a way that closes the parent via outside-click heuristics.\n disableAutoFocus={disablePortal}\n disableEnforceFocus={disablePortal}\n disableRestoreFocus={disablePortal}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n transformOrigin={{ vertical: 'top', horizontal: 'left' }}\n slotProps={\n disablePortal\n ? {\n root: {\n onMouseDown: (event: MouseEvent) => {\n event.stopPropagation()\n },\n },\n }\n : undefined\n }\n >\n {options.map((option) => (\n <MenuItem\n key={option.value}\n disabled={!!option.disabled}\n selected={option.value === value}\n onClick={() => {\n if (option.onSelect) {\n option.onSelect()\n } else {\n onChange(option.value)\n }\n setAnchorEl(null)\n }}\n >\n {option.icon && (\n <ListItemIcon sx={{ minWidth: 24 }}>{option.icon}</ListItemIcon>\n )}\n <ListItemText>{option.label}</ListItemText>\n </MenuItem>\n ))}\n </Menu>\n </>\n )\n}\n","import { Box } from '@mui/material'\nimport { useRef, type JSX } from 'react'\nimport type { LassoDrawColor, LassoDrawColorPreset } from '../../types'\nimport { ActionMenu } from './action-menu'\n\n/** Hex presets for `draw` colors (CARTO qualitative Pastel scheme, from Figma). */\nexport const LASSO_DRAW_COLOR_HEX: Record<LassoDrawColorPreset, string> = {\n yellow: '#F6CF71',\n orange: '#F89C74',\n purple: '#DCB0F2',\n pink: '#FE88B1',\n green: '#8BE0A4',\n brown: '#D3B484',\n black: '#2C3032',\n white: '#FFFFFF',\n} as const\n\nexport const COLOR_ACTION_LABELS = {\n tooltip: 'Color',\n options: {\n yellow: 'Yellow',\n orange: 'Orange',\n purple: 'Purple',\n pink: 'Pink',\n green: 'Green',\n brown: 'Brown',\n black: 'Black',\n white: 'White',\n custom: 'Custom',\n },\n} as const\n\nconst COLOR_VALUES = Object.keys(LASSO_DRAW_COLOR_HEX) as LassoDrawColorPreset[]\n\nconst CUSTOM_MENU_VALUE = 'custom' as const\n\ntype ColorMenuValue = LassoDrawColorPreset | typeof CUSTOM_MENU_VALUE\n\n/** True when `color` is a named preset (not a freeform hex). */\nexport function isLassoDrawColorPreset(\n color: string,\n): color is LassoDrawColorPreset {\n return Object.prototype.hasOwnProperty.call(LASSO_DRAW_COLOR_HEX, color)\n}\n\n/**\n * Canonical `#rrggbb` lowercase, or `undefined` if not a valid 3/6-digit hex.\n */\nexport function normalizeHex(raw: string): string | undefined {\n const trimmed = raw.trim()\n const hex6 = /^#?([0-9a-fA-F]{6})$/.exec(trimmed)\n if (hex6) return `#${hex6[1]!.toLowerCase()}`\n const hex3 = /^#?([0-9a-fA-F]{3})$/.exec(trimmed)\n if (hex3) {\n const [a, b, c] = hex3[1]!\n return `#${a}${a}${b}${b}${c}${c}`.toLowerCase()\n }\n return undefined\n}\n\nfunction toPickerHex(color: LassoDrawColor): string {\n if (isLassoDrawColorPreset(color)) {\n return LASSO_DRAW_COLOR_HEX[color].toLowerCase()\n }\n return normalizeHex(color) ?? '#000000'\n}\n\nexport interface ColorActionProps {\n value: LassoDrawColor\n disabled?: boolean\n labels?: {\n tooltip?: string\n options?: Partial<Record<LassoDrawColorPreset | 'custom', string>>\n }\n onChange: (value: LassoDrawColor) => void\n /**\n * Keep the color Menu inside its parent Popover (Label presentation row).\n * @default false\n */\n disablePortal?: boolean\n}\n\nexport function ColorDot({\n color,\n size = 14,\n}: {\n color: LassoDrawColor\n size?: number\n}): JSX.Element {\n const backgroundColor = isLassoDrawColorPreset(color)\n ? LASSO_DRAW_COLOR_HEX[color]\n : (normalizeHex(color) ?? '#cccccc')\n\n return (\n <Box\n component='span'\n sx={{\n display: 'inline-block',\n width: size,\n height: size,\n borderRadius: '50%',\n backgroundColor,\n border: ({ palette }) => `1px solid ${palette.divider}`,\n }}\n />\n )\n}\n\nfunction CustomColorDot({ size = 12 }: { size?: number }): JSX.Element {\n return (\n <Box\n component='span'\n sx={{\n display: 'inline-block',\n width: size,\n height: size,\n borderRadius: '50%',\n background:\n 'conic-gradient(red, yellow, lime, aqua, blue, magenta, red)',\n border: ({ palette }) => `1px solid ${palette.divider}`,\n }}\n />\n )\n}\n\n/** Color picker for `draw` geometries: dot of the current color + preset menu. */\nexport function ColorAction({\n value,\n disabled = false,\n labels,\n onChange,\n disablePortal = false,\n}: ColorActionProps): JSX.Element {\n const inputRef = useRef<HTMLInputElement>(null)\n const menuValue: ColorMenuValue = isLassoDrawColorPreset(value)\n ? value\n : CUSTOM_MENU_VALUE\n\n const openNativePicker = () => {\n // Close the MUI Menu first, then open the native dialog on the next tick\n // so focus/z-index fights don't swallow the picker.\n window.setTimeout(() => {\n const input = inputRef.current\n if (!input) return\n input.value = toPickerHex(value)\n input.click()\n }, 0)\n }\n\n return (\n <>\n <ActionMenu\n label={labels?.tooltip ?? COLOR_ACTION_LABELS.tooltip}\n icon={<ColorDot color={value} />}\n disabled={disabled}\n value={menuValue}\n disablePortal={disablePortal}\n options={[\n ...COLOR_VALUES.map((color) => ({\n value: color as ColorMenuValue,\n label:\n labels?.options?.[color] ?? COLOR_ACTION_LABELS.options[color],\n icon: <ColorDot color={color} size={12} />,\n })),\n {\n value: CUSTOM_MENU_VALUE,\n label:\n labels?.options?.custom ?? COLOR_ACTION_LABELS.options.custom,\n icon: <CustomColorDot />,\n onSelect: openNativePicker,\n },\n ]}\n onChange={(next) => {\n if (next === CUSTOM_MENU_VALUE) return\n onChange(next)\n }}\n />\n <Box\n component='input'\n ref={inputRef}\n type='color'\n aria-hidden\n tabIndex={-1}\n defaultValue={toPickerHex(value)}\n onChange={(event) => {\n const hex = normalizeHex(event.currentTarget.value)\n if (hex) onChange(hex)\n }}\n sx={{\n position: 'fixed',\n width: 0,\n height: 0,\n opacity: 0,\n pointerEvents: 'none',\n border: 0,\n padding: 0,\n }}\n />\n </>\n )\n}\n","import { FormatBold, FormatItalic } from '@mui/icons-material'\nimport {\n Box,\n Checkbox,\n FormControlLabel,\n Popover,\n SvgIcon,\n TextField,\n Typography,\n} from '@mui/material'\nimport {\n useCallback,\n useEffect,\n useEffectEvent,\n useRef,\n useState,\n type JSX,\n type KeyboardEvent,\n type RefObject,\n} from 'react'\nimport { TextAaIcon } from '../../icons'\nimport type { LassoDrawColor } from '../../types'\nimport { LassoToolbarButtonUI } from '../button'\nimport { ICON_SIZE } from '../styles'\nimport { ColorAction } from './color-action'\n\nexport const LABEL_ACTION_LABELS = {\n label: 'Label',\n name: 'Name',\n showOnMap: 'Show on map',\n bold: 'Bold',\n italic: 'Italic',\n} as const\n\n/** Partial map-label presentation — applied live (one undo each). */\nexport interface LassoTextPresentation {\n textVisible?: boolean\n textColor?: LassoDrawColor\n textBold?: boolean\n textItalic?: boolean\n}\n\nexport interface LabelActionProps {\n /** Current geometry name (`label`), shown prefilled in the Name field. */\n label: string\n /** Whether the map TextLayer is enabled for this geometry. */\n textVisible?: boolean\n /** Effective text color (persisted or basemap default). */\n textColor?: LassoDrawColor\n textBold?: boolean\n textItalic?: boolean\n /**\n * When true, hides the \"Show on map\" checkbox and treats the label as\n * always visible (Point text annotations).\n */\n forceTextVisible?: boolean\n disabled?: boolean\n labels?: {\n /** Tooltip/aria-label for the Label button. */\n label?: string\n /** TextField label for the name input. */\n name?: string\n showOnMap?: string\n bold?: string\n italic?: string\n }\n /** Commits a new name on Enter/blur/close (no-op on empty or unchanged). */\n onRename: (label: string) => void\n /** Applies presentation changes live while the popover is open. */\n onSetTextPresentation: (partial: LassoTextPresentation) => void\n /**\n * Element to anchor the popover to (e.g. the toolbar Paper, so the\n * popover spans the full bar). Defaults to the action button itself.\n */\n anchorRef?: RefObject<HTMLElement | null>\n /**\n * True while the mutually-exclusive Edit properties popover is open —\n * closes (commits name) this one, per the \"one popover at a time\" rule.\n */\n forceClose?: boolean\n /** Notified on open/close, so a sibling popover can enforce mutual exclusion. */\n onOpenChange?: (open: boolean) => void\n /**\n * Identity of the current selection (e.g. the selected ids, joined). A\n * change while the popover is open closes (discards name) it — same as\n * any other discard.\n */\n selectionKey?: string\n}\n\n/**\n * Label action: button + anchored popover with Name, Show on map, and a\n * Color + Bold/Italic row. Presentation applies live; name commits on\n * Enter/blur/close. Escape discards an in-progress name edit.\n */\nexport function LabelAction({\n label,\n textVisible = false,\n forceTextVisible = false,\n textColor = 'black',\n textBold = false,\n textItalic = false,\n disabled = false,\n labels,\n onRename,\n onSetTextPresentation,\n anchorRef,\n forceClose = false,\n onOpenChange,\n selectionKey,\n}: LabelActionProps): JSX.Element {\n // Guards `onRename` to once per session — Popover `onClose` and TextField\n // `onBlur` can both fire for a single close (and Enter blurs on unmount).\n const committedRef = useRef(false)\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null)\n const [anchorWidth, setAnchorWidth] = useState<number>()\n const [draft, setDraft] = useState(label)\n const focusOnMount = useCallback((node: HTMLInputElement | null) => {\n node?.focus()\n }, [])\n\n const open = Boolean(anchorEl)\n const actionLabel = labels?.label ?? LABEL_ACTION_LABELS.label\n const nameLabel = labels?.name ?? LABEL_ACTION_LABELS.name\n const showOnMapLabel = labels?.showOnMap ?? LABEL_ACTION_LABELS.showOnMap\n const boldLabel = labels?.bold ?? LABEL_ACTION_LABELS.bold\n const italicLabel = labels?.italic ?? LABEL_ACTION_LABELS.italic\n const effectiveVisible = forceTextVisible || textVisible\n const presentationEnabled = effectiveVisible\n\n const openLabel = (button: HTMLElement) => {\n committedRef.current = false\n setDraft(label)\n const anchor = anchorRef?.current ?? button\n setAnchorWidth(anchor.clientWidth)\n setAnchorEl(anchor)\n onOpenChange?.(true)\n }\n\n const commitName = () => {\n if (!committedRef.current) {\n committedRef.current = true\n const next = draft.trim()\n if (next && next !== label) {\n onRename(next)\n }\n }\n }\n\n const close = () => {\n commitName()\n setAnchorEl(null)\n onOpenChange?.(false)\n }\n\n // Escape discards the name edit: mark the session done so unmount blur /\n // onClose don't fire `onRename`.\n const cancel = () => {\n committedRef.current = true\n setAnchorEl(null)\n onOpenChange?.(false)\n }\n\n const handleForceClose = useEffectEvent(() => {\n if (anchorEl) close()\n })\n useEffect(() => {\n if (forceClose) handleForceClose()\n }, [forceClose])\n\n // Selection change while open always discards the name: by the time this\n // runs, `onRename` has rebound to the NEW selection.\n const prevSelectionKeyRef = useRef(selectionKey)\n const handleSelectionChange = useEffectEvent(() => {\n if (anchorEl) cancel()\n })\n useEffect(() => {\n if (prevSelectionKeyRef.current !== selectionKey) {\n prevSelectionKeyRef.current = selectionKey\n handleSelectionChange()\n }\n }, [selectionKey])\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n close()\n }\n if (event.key === 'Escape') {\n event.preventDefault()\n cancel()\n }\n }\n\n return (\n <>\n <LassoToolbarButtonUI\n label={actionLabel}\n active={open}\n disabled={disabled}\n onClick={(event) => openLabel(event.currentTarget)}\n icon={\n <SvgIcon\n component={TextAaIcon}\n inheritViewBox\n sx={{ fontSize: ICON_SIZE }}\n />\n }\n />\n\n <Popover\n open={open}\n anchorEl={anchorEl}\n onClose={close}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n transformOrigin={{ vertical: 'top', horizontal: 'left' }}\n slotProps={{\n paper: {\n sx: { width: anchorWidth, minWidth: 220 },\n },\n }}\n >\n <Box\n sx={{\n p: 1,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n }}\n >\n <TextField\n inputRef={focusOnMount}\n fullWidth\n label={nameLabel}\n size='small'\n variant='outlined'\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={commitName}\n />\n\n {!forceTextVisible && (\n <FormControlLabel\n control={\n <Checkbox\n size='small'\n checked={textVisible}\n onChange={(e) =>\n onSetTextPresentation({ textVisible: e.target.checked })\n }\n />\n }\n label={<Typography variant='body2'>{showOnMapLabel}</Typography>}\n />\n )}\n\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n }}\n >\n <ColorAction\n value={textColor}\n disabled={!presentationEnabled}\n disablePortal\n onChange={(color) => onSetTextPresentation({ textColor: color })}\n />\n <LassoToolbarButtonUI\n label={boldLabel}\n active={textBold}\n pressed={textBold}\n disabled={!presentationEnabled}\n onClick={() => onSetTextPresentation({ textBold: !textBold })}\n icon={<FormatBold sx={{ fontSize: ICON_SIZE }} />}\n />\n <LassoToolbarButtonUI\n label={italicLabel}\n active={textItalic}\n pressed={textItalic}\n disabled={!presentationEnabled}\n onClick={() => onSetTextPresentation({ textItalic: !textItalic })}\n icon={<FormatItalic sx={{ fontSize: ICON_SIZE }} />}\n />\n </Box>\n </Box>\n </Popover>\n </>\n )\n}\n","import {\n AddOutlined,\n CloseOutlined,\n DataObjectOutlined,\n} from '@mui/icons-material'\nimport {\n Box,\n Button,\n IconButton,\n Popover,\n TextField,\n Typography,\n} from '@mui/material'\nimport {\n useEffect,\n useEffectEvent,\n useMemo,\n useRef,\n useState,\n type JSX,\n type KeyboardEvent,\n type RefObject,\n} from 'react'\nimport { LassoToolbarButtonUI } from '../button'\nimport { ICON_SIZE } from '../styles'\n\n/**\n * Keys the KV editor can never add/rename to: the system already has a\n * dedicated control for each (Label, the visibility toggle, Lock, the style\n * pickers, label presentation) or, for `type`, it's a render-only copy the\n * layer injects. Mirrors `isLassoSystemPropertyKey` in `@carto/ps-react-maps`\n * — kept local so this package doesn't depend on react-maps for a handful of\n * strings.\n */\nconst SYSTEM_KEYS = new Set([\n 'label',\n 'visible',\n 'locked',\n 'style',\n 'textVisible',\n 'textColor',\n 'textBold',\n 'textItalic',\n 'textPosition',\n 'type',\n // Injected by editable-layers draw modes / legacy commit — never KV-editable.\n 'shape',\n 'index',\n])\n\n/** Editable subset of full geometry properties for the KV editor. */\nexport function getEditablePropertiesFromFull(\n properties: Record<string, unknown>,\n): Record<string, unknown> {\n const editable: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(properties)) {\n if (!SYSTEM_KEYS.has(key)) editable[key] = value\n }\n return editable\n}\n\nexport const EDIT_PROPERTIES_ACTION_LABELS = {\n editProperties: 'Edit properties',\n keyPlaceholder: 'Key',\n valuePlaceholder: 'Value',\n addRow: 'Add property',\n removeRow: 'Remove property',\n emptyKeyError: 'Key is required',\n duplicateKeyError: 'Duplicate key',\n systemKeyError: 'Reserved key',\n} as const\n\nexport interface EditPropertiesActionLabels {\n editProperties?: string\n keyPlaceholder?: string\n valuePlaceholder?: string\n addRow?: string\n removeRow?: string\n emptyKeyError?: string\n duplicateKeyError?: string\n systemKeyError?: string\n}\n\nexport interface EditPropertiesActionProps {\n /** Editable properties — the controller already excludes system keys. */\n properties: Record<string, unknown>\n disabled?: boolean\n labels?: EditPropertiesActionLabels\n /** Commits a full replacement of the editable properties. */\n onEditProperties: (draft: Record<string, unknown>) => void\n /**\n * Element to anchor the popover to (e.g. the toolbar Paper, so it spans the\n * full bar). Defaults to the action button itself.\n */\n anchorRef?: RefObject<HTMLElement | null>\n /**\n * True while the mutually-exclusive Label popover is open — force-closes\n * (discards) this one, per the \"one popover at a time\" rule.\n */\n forceClose?: boolean\n /** Notified on open/close, so a sibling popover can enforce mutual exclusion. */\n onOpenChange?: (open: boolean) => void\n /**\n * Identity of the current selection (e.g. the selected ids, joined). A\n * change while the popover is open always discards — by the time this is\n * noticed, `onEditProperties` has already rebound to the new selection, so\n * a \"commit\" would silently edit the wrong geometry.\n */\n selectionKey?: string\n}\n\ninterface EditPropertiesRow {\n uid: number\n key: string\n value: string\n /** Raw original value, so an unedited row commits with its original type. */\n originalValue: unknown\n}\n\ntype Labels = Required<EditPropertiesActionLabels>\n\n/**\n * Renders a property value for the KV editor's text input: strings pass\n * through, everything else (numbers, booleans, objects/arrays) is\n * JSON-stringified so it round-trips through a single-line input. Mirrors\n * `displayPropertyValue` in `@carto/ps-react-maps`.\n */\nfunction displayValue(value: unknown): string {\n if (typeof value === 'string') return value\n if (value === undefined) return ''\n try {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string -- `JSON.stringify` only returns `undefined` for functions/symbols, the last resort below.\n return JSON.stringify(value) ?? String(value)\n } catch {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string -- circular reference or similar: best-effort fallback, still a string.\n return String(value)\n }\n}\n\n/**\n * If the draft string still matches the original value's display form, keeps\n * the original (typed) value; otherwise the edit wins and commits as a\n * string.\n */\nfunction resolveValue(originalValue: unknown, trimmedValue: string): unknown {\n if (\n originalValue !== undefined &&\n displayValue(originalValue) === trimmedValue\n ) {\n return originalValue\n }\n return trimmedValue\n}\n\n/**\n * Freeform KV rows from the editable properties bag. Map label / presentation\n * live in LabelAction — not as a locked `text` row here.\n */\nfunction buildInitialRows(\n properties: Record<string, unknown>,\n): EditPropertiesRow[] {\n const rows: EditPropertiesRow[] = []\n let uid = 0\n for (const [key, value] of Object.entries(properties)) {\n rows.push({\n uid: uid++,\n key,\n value: displayValue(value),\n originalValue: value,\n })\n }\n return rows\n}\n\n/**\n * Keys that are empty (post-trim), reserved, or duplicated block committing\n * the whole draft — the offending rows show an inline error.\n */\nfunction computeErrors(\n rows: EditPropertiesRow[],\n labels: Labels,\n): Map<number, string> {\n const counts = new Map<string, number>()\n for (const row of rows) {\n const trimmed = row.key.trim()\n if (!trimmed) continue\n counts.set(trimmed, (counts.get(trimmed) ?? 0) + 1)\n }\n\n const errors = new Map<number, string>()\n for (const row of rows) {\n const trimmed = row.key.trim()\n if (!trimmed) {\n errors.set(row.uid, labels.emptyKeyError)\n } else if (SYSTEM_KEYS.has(trimmed)) {\n errors.set(row.uid, labels.systemKeyError)\n } else if ((counts.get(trimmed) ?? 0) > 1) {\n errors.set(row.uid, labels.duplicateKeyError)\n }\n }\n return errors\n}\n\n/** Commit merge (A): trims keys/values. */\nfunction buildDraft(rows: EditPropertiesRow[]): Record<string, unknown> {\n const draft: Record<string, unknown> = {}\n for (const row of rows) {\n const trimmedKey = row.key.trim()\n if (!trimmedKey) continue\n draft[trimmedKey] = resolveValue(row.originalValue, row.value.trim())\n }\n return draft\n}\n\n/**\n * Edit properties action: button + anchored popover (layout B) with a\n * scrollable freeform key/value list. Map label / presentation live in\n * LabelAction — not here.\n *\n * Close rules: outside click commits only a valid draft (an invalid one\n * keeps the popover open with its errors); Escape always discards; Enter\n * never closes it (it only moves focus or appends a row).\n */\nexport function EditPropertiesAction({\n properties,\n disabled = false,\n labels,\n onEditProperties,\n anchorRef,\n forceClose = false,\n onOpenChange,\n selectionKey,\n}: EditPropertiesActionProps): JSX.Element {\n const committedRef = useRef(false)\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null)\n const [anchorWidth, setAnchorWidth] = useState<number>()\n const [rows, setRows] = useState<EditPropertiesRow[]>([])\n const nextUidRef = useRef(0)\n // Stable across renders (unlike an inline `.map()` ref callback), so typing\n // in one row doesn't re-attach every row's ref and steal focus.\n const nodeRefs = useRef(new Map<string, HTMLInputElement | null>())\n // A row about to mount (popover just opened, or a row was just added) that\n // should grab focus once its input attaches — checked (and cleared) by\n // `setNodeRef` itself, so it fires exactly once, on mount, like\n // `LabelAction`'s `focusOnMount`. A `useEffect` would run too late: MUI's\n // `Modal` already auto-focuses its own paper by then.\n const pendingMountFocusRef = useRef<{\n uid: number\n field: 'key' | 'value'\n } | null>(null)\n\n const editing = Boolean(anchorEl)\n const mergedLabels: Labels = useMemo(\n () => ({ ...EDIT_PROPERTIES_ACTION_LABELS, ...labels }),\n [labels],\n )\n const errors = useMemo(\n () => computeErrors(rows, mergedLabels),\n [rows, mergedLabels],\n )\n\n const setNodeRef =\n (uid: number, field: 'key' | 'value') =>\n (node: HTMLInputElement | null) => {\n nodeRefs.current.set(`${uid}:${field}`, node)\n const pending = pendingMountFocusRef.current\n if (node && pending?.uid === uid && pending.field === field) {\n node.focus()\n pendingMountFocusRef.current = null\n }\n }\n\n const openEdit = (button: HTMLElement) => {\n committedRef.current = false\n const initialRows = buildInitialRows(properties)\n nextUidRef.current = initialRows.length\n const firstRow = initialRows[0]\n pendingMountFocusRef.current = firstRow\n ? { uid: firstRow.uid, field: 'key' }\n : null\n setRows(initialRows)\n const anchor = anchorRef?.current ?? button\n setAnchorWidth(anchor.clientWidth)\n setAnchorEl(anchor)\n onOpenChange?.(true)\n }\n\n const commitValid = () => {\n if (committedRef.current) return\n committedRef.current = true\n onEditProperties(buildDraft(rows))\n setAnchorEl(null)\n onOpenChange?.(false)\n }\n\n const discard = () => {\n if (committedRef.current) return\n committedRef.current = true\n setAnchorEl(null)\n onOpenChange?.(false)\n }\n\n const handlePopoverClose = (\n _event: unknown,\n reason: 'backdropClick' | 'escapeKeyDown',\n ) => {\n if (reason === 'escapeKeyDown') {\n discard()\n return\n }\n // Outside click: an invalid draft keeps the popover open with its errors.\n if (errors.size > 0) return\n commitValid()\n }\n\n // Opening Label always discards this popover, regardless of draft validity\n // — the one-popover-at-a-time rule.\n const handleForceClose = useEffectEvent(() => {\n if (anchorEl) discard()\n })\n useEffect(() => {\n if (forceClose) handleForceClose()\n }, [forceClose])\n\n // The selection changing while open always discards, never commits: by the\n // time this effect runs, `onEditProperties` has already rebound to the NEW\n // selection (same render that changed `selectionKey`), so a \"commit\" here\n // would silently edit the wrong geometry.\n const prevSelectionKeyRef = useRef(selectionKey)\n const handleSelectionChange = useEffectEvent(() => {\n if (anchorEl) discard()\n })\n useEffect(() => {\n if (prevSelectionKeyRef.current !== selectionKey) {\n prevSelectionKeyRef.current = selectionKey\n handleSelectionChange()\n }\n }, [selectionKey])\n\n const updateRow = (\n uid: number,\n patch: Partial<Pick<EditPropertiesRow, 'key' | 'value'>>,\n ) => {\n setRows((current) =>\n current.map((row) => (row.uid === uid ? { ...row, ...patch } : row)),\n )\n }\n\n const removeRow = (uid: number) => {\n setRows((current) => current.filter((r) => r.uid !== uid))\n }\n\n const addRow = () => {\n const uid = nextUidRef.current++\n pendingMountFocusRef.current = { uid, field: 'key' }\n setRows((current) => [\n ...current,\n { uid, key: '', value: '', originalValue: undefined },\n ])\n }\n\n const handleKeyFieldKeyDown =\n (row: EditPropertiesRow) => (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n nodeRefs.current.get(`${row.uid}:value`)?.focus()\n } else if (event.key === 'Escape') {\n event.preventDefault()\n discard()\n }\n }\n\n const handleValueFieldKeyDown =\n (row: EditPropertiesRow) => (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n const index = rows.findIndex((r) => r.uid === row.uid)\n const isLast = index === rows.length - 1\n if (isLast) {\n if (!errors.has(row.uid)) addRow()\n } else {\n nodeRefs.current.get(`${rows[index + 1]!.uid}:key`)?.focus()\n }\n } else if (event.key === 'Escape') {\n event.preventDefault()\n discard()\n }\n }\n\n return (\n <>\n <LassoToolbarButtonUI\n label={mergedLabels.editProperties}\n active={editing}\n disabled={disabled}\n onClick={(event) => openEdit(event.currentTarget)}\n icon={<DataObjectOutlined sx={{ fontSize: ICON_SIZE }} />}\n />\n\n <Popover\n open={editing}\n anchorEl={anchorEl}\n onClose={handlePopoverClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n transformOrigin={{ vertical: 'top', horizontal: 'left' }}\n slotProps={{\n paper: { sx: { width: anchorWidth, minWidth: 260 } },\n }}\n >\n <Box sx={{ px: 1.5, py: 1 }}>\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n maxHeight: 280,\n overflowY: 'auto',\n }}\n >\n {rows.map((row) => {\n const error = errors.get(row.uid)\n return (\n <Box\n key={row.uid}\n sx={{ display: 'flex', flexDirection: 'column', gap: 0.25 }}\n >\n <Box sx={{ display: 'flex', gap: 0.5, alignItems: 'center' }}>\n <TextField\n inputRef={setNodeRef(row.uid, 'key')}\n size='small'\n variant='outlined'\n placeholder={mergedLabels.keyPlaceholder}\n value={row.key}\n error={!!error}\n onChange={(e) =>\n updateRow(row.uid, { key: e.target.value })\n }\n onKeyDown={handleKeyFieldKeyDown(row)}\n sx={{ flex: 1 }}\n />\n <TextField\n inputRef={setNodeRef(row.uid, 'value')}\n size='small'\n variant='outlined'\n placeholder={mergedLabels.valuePlaceholder}\n value={row.value}\n onChange={(e) =>\n updateRow(row.uid, { value: e.target.value })\n }\n onKeyDown={handleValueFieldKeyDown(row)}\n sx={{ flex: 1 }}\n />\n <IconButton\n aria-label={`${mergedLabels.removeRow}${row.key ? `: ${row.key}` : ''}`}\n size='small'\n onClick={() => removeRow(row.uid)}\n >\n <CloseOutlined sx={{ fontSize: ICON_SIZE }} />\n </IconButton>\n </Box>\n {error && (\n <Typography\n variant='caption'\n color='error'\n sx={{ pl: 0.5 }}\n >\n {error}\n </Typography>\n )}\n </Box>\n )\n })}\n\n <Button\n size='small'\n startIcon={<AddOutlined sx={{ fontSize: ICON_SIZE }} />}\n onClick={addRow}\n sx={{ justifyContent: 'flex-start', alignSelf: 'flex-start' }}\n >\n {mergedLabels.addRow}\n </Button>\n </Box>\n </Box>\n </Popover>\n </>\n )\n}\n","import { LockOutlined } from '@mui/icons-material'\nimport type { JSX } from 'react'\nimport { LassoToolbarButtonUI } from '../button'\nimport { ICON_SIZE } from '../styles'\n\nexport const LOCK_ACTION_LABELS = {\n lock: 'Lock',\n unlock: 'Unlock',\n} as const\n\nexport interface LockActionProps {\n locked: boolean\n disabled?: boolean\n labels?: { lock?: string; unlock?: string }\n /** Called with the opposite locked state. */\n onToggleLock: (locked: boolean) => void\n}\n\n/** Lock toggle: active tint + `aria-pressed` while the geometry is locked. */\nexport function LockAction({\n locked,\n disabled = false,\n labels,\n onToggleLock,\n}: LockActionProps): JSX.Element {\n const label = locked\n ? (labels?.unlock ?? LOCK_ACTION_LABELS.unlock)\n : (labels?.lock ?? LOCK_ACTION_LABELS.lock)\n\n return (\n <LassoToolbarButtonUI\n label={label}\n active={locked}\n pressed={locked}\n disabled={disabled}\n onClick={() => onToggleLock(!locked)}\n icon={<LockOutlined sx={{ fontSize: ICON_SIZE }} />}\n />\n )\n}\n","import { DeleteOutlined } from '@mui/icons-material'\nimport type { JSX } from 'react'\nimport { LassoToolbarButtonUI } from '../button'\nimport { ICON_SIZE } from '../styles'\n\nexport const DELETE_ACTION_LABELS = {\n delete: 'Delete',\n} as const\n\nexport interface DeleteActionProps {\n disabled?: boolean\n label?: string\n onDelete: () => void\n}\n\n/** Destructive delete action (error color). */\nexport function DeleteAction({\n disabled = false,\n label,\n onDelete,\n}: DeleteActionProps): JSX.Element {\n return (\n <LassoToolbarButtonUI\n label={label ?? DELETE_ACTION_LABELS.delete}\n disabled={disabled}\n onClick={onDelete}\n icon={<DeleteOutlined sx={{ fontSize: ICON_SIZE }} />}\n color='error'\n />\n )\n}\n","import { OpacityOutlined } from '@mui/icons-material'\nimport type { JSX } from 'react'\nimport type { LassoDrawFill } from '../../types'\nimport { ICON_SIZE } from '../styles'\nimport { ActionMenu } from './action-menu'\n\nexport const FILL_ACTION_LABELS = {\n tooltip: 'Fill',\n options: {\n filled: 'Filled',\n opacity: 'Opacity',\n none: 'None',\n },\n} as const\n\nconst FILL_VALUES: LassoDrawFill[] = ['filled', 'opacity', 'none']\n\nexport interface FillActionProps {\n value: LassoDrawFill\n disabled?: boolean\n /**\n * Disables just the `none` option — set it when the stroke is already\n * `none`, since the store refuses to make both invisible at once.\n */\n disableNone?: boolean\n labels?: {\n tooltip?: string\n options?: Partial<Record<LassoDrawFill, string>>\n }\n onChange: (value: LassoDrawFill) => void\n}\n\n/** Fill picker for `draw` geometries: filled / opacity / none. */\nexport function FillAction({\n value,\n disabled = false,\n disableNone = false,\n labels,\n onChange,\n}: FillActionProps): JSX.Element {\n return (\n <ActionMenu\n label={labels?.tooltip ?? FILL_ACTION_LABELS.tooltip}\n icon={<OpacityOutlined sx={{ fontSize: ICON_SIZE }} />}\n disabled={disabled}\n value={value}\n options={FILL_VALUES.map((fill) => ({\n value: fill,\n label: labels?.options?.[fill] ?? FILL_ACTION_LABELS.options[fill],\n disabled: fill === 'none' && disableNone,\n }))}\n onChange={onChange}\n />\n )\n}\n","import { LineWeightOutlined } from '@mui/icons-material'\nimport type { JSX } from 'react'\nimport type { LassoDrawStroke } from '../../types'\nimport { ICON_SIZE } from '../styles'\nimport { ActionMenu } from './action-menu'\n\nexport const STROKE_ACTION_LABELS = {\n tooltip: 'Stroke',\n options: {\n thick: 'Thick',\n default: 'Default',\n thin: 'Thin',\n none: 'None',\n },\n} as const\n\nconst STROKE_VALUES: LassoDrawStroke[] = ['thick', 'default', 'thin', 'none']\n\nexport interface StrokeActionProps {\n value: LassoDrawStroke\n disabled?: boolean\n /**\n * Disables just the `none` option — set it when the fill is already\n * `none`, since the store refuses to make both invisible at once.\n */\n disableNone?: boolean\n labels?: {\n tooltip?: string\n options?: Partial<Record<LassoDrawStroke, string>>\n }\n onChange: (value: LassoDrawStroke) => void\n}\n\n/** Stroke-width picker for `draw` geometries: thick / default / thin / none. */\nexport function StrokeAction({\n value,\n disabled = false,\n disableNone = false,\n labels,\n onChange,\n}: StrokeActionProps): JSX.Element {\n return (\n <ActionMenu\n label={labels?.tooltip ?? STROKE_ACTION_LABELS.tooltip}\n icon={<LineWeightOutlined sx={{ fontSize: ICON_SIZE }} />}\n disabled={disabled}\n value={value}\n options={STROKE_VALUES.map((stroke) => ({\n value: stroke,\n label:\n labels?.options?.[stroke] ?? STROKE_ACTION_LABELS.options[stroke],\n disabled: stroke === 'none' && disableNone,\n }))}\n onChange={onChange}\n />\n )\n}\n","import { SvgIcon } from '@mui/material'\nimport type { JSX } from 'react'\nimport { DrawPolygonIcon } from '../../icons'\nimport { LassoToolbarButtonUI } from '../button'\nimport { ICON_SIZE } from '../styles'\n\nexport const EDIT_GEOMETRY_ACTION_LABELS = {\n editGeometry: 'Edit geometry',\n} as const\n\nexport interface EditGeometryActionProps {\n /** Highlight while an edit session is running. */\n active?: boolean\n disabled?: boolean\n label?: string\n onEditGeometry: () => void\n}\n\n/** Starts a geometry-edit session (vertices + translate) on the selection. */\nexport function EditGeometryAction({\n active = false,\n disabled = false,\n label,\n onEditGeometry,\n}: EditGeometryActionProps): JSX.Element {\n return (\n <LassoToolbarButtonUI\n label={label ?? EDIT_GEOMETRY_ACTION_LABELS.editGeometry}\n active={active}\n pressed={active}\n disabled={disabled}\n onClick={onEditGeometry}\n // Figma 6985:35312 is the polygon-vertices glyph — the same shape as the\n // drawing tool's, so it is reused instead of duplicating the path.\n icon={\n <SvgIcon\n component={DrawPolygonIcon}\n inheritViewBox\n sx={{ fontSize: ICON_SIZE }}\n />\n }\n />\n )\n}\n","import { SvgIcon } from '@mui/material'\nimport type { JSX } from 'react'\nimport { UnionIcon } from '../../icons'\nimport { LassoToolbarButtonUI } from '../button'\nimport { ICON_SIZE } from '../styles'\n\nexport const UNION_ACTION_LABELS = {\n union: 'Merge geometries',\n} as const\n\nexport interface UnionActionProps {\n disabled?: boolean\n label?: string\n onUnion: () => void\n}\n\n/**\n * Merges the selected geometries into one: a single polygon when they overlap,\n * a MultiPolygon otherwise. Only meaningful with 2+ geometries selected.\n */\nexport function UnionAction({\n disabled = false,\n label,\n onUnion,\n}: UnionActionProps): JSX.Element {\n return (\n <LassoToolbarButtonUI\n label={label ?? UNION_ACTION_LABELS.union}\n disabled={disabled}\n onClick={onUnion}\n icon={\n <SvgIcon\n component={UnionIcon}\n inheritViewBox\n sx={{ fontSize: ICON_SIZE }}\n />\n }\n />\n )\n}\n","import { CallSplitOutlined } from '@mui/icons-material'\nimport type { JSX } from 'react'\nimport { LassoToolbarButtonUI } from '../button'\nimport { ICON_SIZE } from '../styles'\n\nexport const SPLIT_ACTION_LABELS = {\n split: 'Split geometry',\n} as const\n\nexport interface SplitActionProps {\n disabled?: boolean\n label?: string\n onSplit: () => void\n}\n\n/**\n * Splits a MultiPolygon into its parts (the inverse of the merge action on\n * disjoint inputs). Only meaningful with a single MultiPolygon selected.\n */\nexport function SplitAction({\n disabled = false,\n label,\n onSplit,\n}: SplitActionProps): JSX.Element {\n return (\n <LassoToolbarButtonUI\n label={label ?? SPLIT_ACTION_LABELS.split}\n disabled={disabled}\n onClick={onSplit}\n icon={<CallSplitOutlined sx={{ fontSize: ICON_SIZE }} />}\n />\n )\n}\n","import { JoinLeftOutlined } from '@mui/icons-material'\nimport type { JSX } from 'react'\nimport { LassoToolbarButtonUI } from '../button'\nimport { ICON_SIZE } from '../styles'\n\nexport const SUBTRACT_ACTION_LABELS = {\n subtract: 'Subtract geometries',\n} as const\n\nexport interface SubtractActionProps {\n disabled?: boolean\n label?: string\n onSubtract: () => void\n}\n\n/**\n * Subtracts every other selected geometry from the first one (a contained\n * geometry carves a hole). Only meaningful with 2+ geometries selected.\n */\nexport function SubtractAction({\n disabled = false,\n label,\n onSubtract,\n}: SubtractActionProps): JSX.Element {\n return (\n <LassoToolbarButtonUI\n label={label ?? SUBTRACT_ACTION_LABELS.subtract}\n disabled={disabled}\n onClick={onSubtract}\n icon={<JoinLeftOutlined sx={{ fontSize: ICON_SIZE }} />}\n />\n )\n}\n","import { JoinInnerOutlined } from '@mui/icons-material'\nimport type { JSX } from 'react'\nimport { LassoToolbarButtonUI } from '../button'\nimport { ICON_SIZE } from '../styles'\n\nexport const INTERSECT_ACTION_LABELS = {\n intersect: 'Intersect geometries',\n} as const\n\nexport interface IntersectActionProps {\n disabled?: boolean\n label?: string\n onIntersect: () => void\n}\n\n/**\n * Replaces the selection with its common area. Only meaningful with 2+\n * overlapping geometries selected.\n */\nexport function IntersectAction({\n disabled = false,\n label,\n onIntersect,\n}: IntersectActionProps): JSX.Element {\n return (\n <LassoToolbarButtonUI\n label={label ?? INTERSECT_ACTION_LABELS.intersect}\n disabled={disabled}\n onClick={onIntersect}\n icon={<JoinInnerOutlined sx={{ fontSize: ICON_SIZE }} />}\n />\n )\n}\n","import { ContentCopyOutlined } from '@mui/icons-material'\nimport type { JSX } from 'react'\nimport { LassoToolbarButtonUI } from '../button'\nimport { ICON_SIZE } from '../styles'\n\nexport const DUPLICATE_ACTION_LABELS = {\n duplicate: 'Duplicate',\n} as const\n\nexport interface DuplicateActionProps {\n disabled?: boolean\n label?: string\n onDuplicate: () => void\n}\n\n/** Duplicates the selected geometries (slightly offset copies). */\nexport function DuplicateAction({\n disabled = false,\n label,\n onDuplicate,\n}: DuplicateActionProps): JSX.Element {\n return (\n <LassoToolbarButtonUI\n label={label ?? DUPLICATE_ACTION_LABELS.duplicate}\n disabled={disabled}\n onClick={onDuplicate}\n icon={<ContentCopyOutlined sx={{ fontSize: ICON_SIZE }} />}\n />\n )\n}\n","import { KeyboardReturnOutlined } from '@mui/icons-material'\nimport type { JSX } from 'react'\nimport { LassoToolbarButtonUI } from '../button'\nimport { ICON_SIZE } from '../styles'\n\nexport const ACCEPT_ACTION_LABELS = {\n accept: 'Accept',\n} as const\n\nexport interface AcceptActionProps {\n disabled?: boolean\n label?: string\n /** Keyboard-shortcut hint appended to the tooltip, e.g. `\"↵\"`. */\n shortcut?: string\n onAccept: () => void\n}\n\n/** Confirms the in-progress operation (equivalent to Enter). */\nexport function AcceptAction({\n disabled = false,\n label,\n shortcut,\n onAccept,\n}: AcceptActionProps): JSX.Element {\n return (\n <LassoToolbarButtonUI\n label={label ?? ACCEPT_ACTION_LABELS.accept}\n shortcut={shortcut}\n disabled={disabled}\n onClick={onAccept}\n icon={<KeyboardReturnOutlined sx={{ fontSize: ICON_SIZE }} />}\n />\n )\n}\n","import { CloseOutlined } from '@mui/icons-material'\nimport type { JSX } from 'react'\nimport { LassoToolbarButtonUI } from '../button'\nimport { ICON_SIZE } from '../styles'\n\nexport const CANCEL_ACTION_LABELS = {\n cancel: 'Cancel',\n} as const\n\nexport interface CancelActionProps {\n disabled?: boolean\n label?: string\n /** Keyboard-shortcut hint appended to the tooltip, e.g. `\"Esc\"`. */\n shortcut?: string\n onCancel: () => void\n}\n\n/** Discards the in-progress operation (equivalent to Escape). */\nexport function CancelAction({\n disabled = false,\n label,\n shortcut,\n onCancel,\n}: CancelActionProps): JSX.Element {\n return (\n <LassoToolbarButtonUI\n label={label ?? CANCEL_ACTION_LABELS.cancel}\n shortcut={shortcut}\n disabled={disabled}\n onClick={onCancel}\n icon={<CloseOutlined sx={{ fontSize: ICON_SIZE }} />}\n />\n )\n}\n","import {\n createContext,\n useContext,\n type ReactNode,\n type RefObject,\n} from 'react'\nimport type { LassoGeometryToolbarUIProps } from '../types'\n\n/**\n * Everything the connected actions need, derived once by\n * `LassoGeometryToolbarUI` from the props it gets from the controller. Mirrors\n * the widgets-v2 contract: an action reads its state from here instead of\n * having it threaded through the call site.\n */\nexport interface LassoGeometryToolbarContextValue extends Omit<\n LassoGeometryToolbarUIProps,\n 'children' | 'PaperProps'\n> {\n /** `anyLocked ?? locked` — a locked geometry makes the batch read-only. */\n disabled: boolean\n /** `disabled` or a multi-selection: blocks the single-target actions. */\n singleOnly: boolean\n /** Style pickers only apply to `draw` geometries with a style handler. */\n showStyle: boolean\n /** The toolbar's Paper, so popovers anchor to it instead of their button. */\n anchorRef?: RefObject<HTMLElement | null>\n /** Which single-instance popover (Label/Edit properties) is open — mutual exclusion. */\n openPopoverId?: 'label' | 'editProperties' | null\n /** Compare-and-swap: only clears `openPopoverId` when it still matches `id`. */\n onOpenPopoverChange?: (id: 'label' | 'editProperties', open: boolean) => void\n}\n\nconst LassoGeometryToolbarContext =\n createContext<LassoGeometryToolbarContextValue | null>(null)\n\nexport function LassoGeometryToolbarProvider({\n value,\n children,\n}: {\n value: LassoGeometryToolbarContextValue\n children: ReactNode\n}) {\n return (\n <LassoGeometryToolbarContext.Provider value={value}>\n {children}\n </LassoGeometryToolbarContext.Provider>\n )\n}\n\n/**\n * State for a connected action. Throws outside the toolbar: the alternative is\n * a button that silently does nothing.\n */\nexport function useLassoGeometryToolbarAction(): LassoGeometryToolbarContextValue {\n const value = useContext(LassoGeometryToolbarContext)\n\n if (!value) {\n throw new Error(\n 'Lasso geometry toolbar actions must render inside <LassoGeometryToolbarUI>. ' +\n 'Use the prop-driven actions from `lasso-tool/toolbar` for standalone toolbars.',\n )\n }\n\n return value\n}\n","import type { JSX } from 'react'\nimport { useLassoGeometryToolbarAction } from './context'\nimport { ColorAction, type ColorActionProps } from './actions/color-action'\nimport { DeleteAction, type DeleteActionProps } from './actions/delete-action'\nimport {\n EditGeometryAction,\n type EditGeometryActionProps,\n} from './actions/edit-geometry-action'\nimport { FillAction, type FillActionProps } from './actions/fill-action'\nimport { LockAction, type LockActionProps } from './actions/lock-action'\nimport { LabelAction, type LabelActionProps } from './actions/label-action'\nimport { StrokeAction, type StrokeActionProps } from './actions/stroke-action'\nimport {\n ToggleTypeAction,\n type ToggleTypeActionProps,\n} from './actions/toggle-type-action'\nimport { UnionAction, type UnionActionProps } from './actions/union-action'\nimport { SplitAction, type SplitActionProps } from './actions/split-action'\nimport {\n SubtractAction,\n type SubtractActionProps,\n} from './actions/subtract-action'\nimport {\n IntersectAction,\n type IntersectActionProps,\n} from './actions/intersect-action'\nimport {\n DuplicateAction,\n type DuplicateActionProps,\n} from './actions/duplicate-action'\nimport {\n EditPropertiesAction,\n getEditablePropertiesFromFull,\n type EditPropertiesActionProps,\n} from './actions/edit-properties-action'\nimport type { LassoDrawColor } from '../types'\n\n/**\n * Connected actions for `LassoGeometryToolbarUI`: same widgets-v2 contract as\n * `Widget.StackToggle` — no data props at the call site, state comes from the\n * toolbar's context. Each one **renders nothing when its handler is missing**,\n * so a composition can list every action and the ones the controller doesn't\n * support simply don't show up.\n *\n * Presentation props (`labels`, and `disabled` where it makes sense) override\n * the context. For toolbars outside `LassoGeometryToolbarUI`, use the\n * prop-driven actions from `./actions` instead.\n */\n\n/**\n * Merges a style action's own `labels` over the context's, one level into\n * `options` — a shallow merge would drop every context-provided option label\n * but the one the caller means to override.\n */\nfunction mergeStyleLabels<T extends string>(\n ctx: { tooltip?: string; options?: Partial<Record<T, string>> } | undefined,\n own: { tooltip?: string; options?: Partial<Record<T, string>> } | undefined,\n) {\n return {\n tooltip: own?.tooltip ?? ctx?.tooltip,\n options: { ...ctx?.options, ...own?.options },\n }\n}\n\n/** Color picker. Hidden unless the whole selection is `draw` with a style. */\nexport function ConnectedColorAction({\n disabled,\n labels,\n}: Pick<ColorActionProps, 'disabled' | 'labels'> = {}): JSX.Element | null {\n const ctx = useLassoGeometryToolbarAction()\n\n if (!ctx.showStyle || !ctx.style || !ctx.onSetStyle) return null\n\n return (\n <ColorAction\n value={ctx.style.color}\n disabled={disabled ?? ctx.disabled}\n labels={mergeStyleLabels(ctx.labels?.color, labels)}\n onChange={(color) => ctx.onSetStyle?.({ color })}\n />\n )\n}\n\n/** Fill picker. Hidden unless the whole selection is `draw` with a style. */\nexport function ConnectedFillAction({\n disabled,\n labels,\n}: Pick<FillActionProps, 'disabled' | 'labels'> = {}): JSX.Element | null {\n const ctx = useLassoGeometryToolbarAction()\n\n if (!ctx.showStyle || !ctx.style || !ctx.onSetStyle) return null\n\n return (\n <FillAction\n value={ctx.style.fill}\n disabled={disabled ?? ctx.disabled}\n // Both `none` at once would leave the feature invisible: the store\n // already refuses it, the disabled option just says so upfront.\n disableNone={ctx.style.stroke === 'none'}\n labels={mergeStyleLabels(ctx.labels?.fill, labels)}\n onChange={(fill) => ctx.onSetStyle?.({ fill })}\n />\n )\n}\n\n/** Stroke picker. Hidden unless the whole selection is `draw` with a style. */\nexport function ConnectedStrokeAction({\n disabled,\n labels,\n}: Pick<StrokeActionProps, 'disabled' | 'labels'> = {}): JSX.Element | null {\n const ctx = useLassoGeometryToolbarAction()\n\n if (!ctx.showStyle || !ctx.style || !ctx.onSetStyle) return null\n\n return (\n <StrokeAction\n value={ctx.style.stroke}\n disabled={disabled ?? ctx.disabled}\n // See ConnectedFillAction: never both fill and stroke at `none`.\n disableNone={ctx.style.fill === 'none'}\n labels={mergeStyleLabels(ctx.labels?.stroke, labels)}\n onChange={(stroke) => ctx.onSetStyle?.({ stroke })}\n />\n )\n}\n\n/** Starts the geometry-edit session. Single-target: off on a multi-selection. */\nexport function ConnectedEditGeometryAction({\n disabled,\n label,\n}: Pick<\n EditGeometryActionProps,\n 'disabled' | 'label'\n> = {}): JSX.Element | null {\n const ctx = useLassoGeometryToolbarAction()\n\n if (!ctx.onEditGeometry) return null\n\n return (\n <EditGeometryAction\n active={ctx.editingGeometry ?? false}\n disabled={disabled ?? ctx.singleOnly}\n label={label ?? ctx.labels?.editGeometry}\n onEditGeometry={ctx.onEditGeometry}\n />\n )\n}\n\n/** Label popover (name + map text presentation), anchored to the toolbar. Single-target. */\nexport function ConnectedLabelAction({\n disabled,\n labels,\n}: Pick<LabelActionProps, 'disabled' | 'labels'> = {}): JSX.Element | null {\n const ctx = useLassoGeometryToolbarAction()\n\n if (!ctx.onRename || !ctx.onSetTextPresentation || ctx.label == null)\n return null\n\n const properties = ctx.properties\n const textVisible = properties?.textVisible === true\n const textColor = ((typeof properties?.textColor === 'string'\n ? properties.textColor\n : undefined) ??\n ctx.defaultTextColor ??\n 'black') as LassoDrawColor\n const textBold = properties?.textBold === true\n const textItalic = properties?.textItalic === true\n\n return (\n <LabelAction\n label={ctx.label}\n textVisible={ctx.forceTextVisible ? true : textVisible}\n forceTextVisible={ctx.forceTextVisible}\n textColor={textColor}\n textBold={textBold}\n textItalic={textItalic}\n disabled={disabled ?? ctx.singleOnly}\n labels={{\n label: labels?.label ?? ctx.labels?.label,\n name: labels?.name ?? ctx.labels?.labelName,\n showOnMap: labels?.showOnMap ?? ctx.labels?.showOnMap,\n bold: labels?.bold ?? ctx.labels?.textBold,\n italic: labels?.italic ?? ctx.labels?.textItalic,\n }}\n onRename={ctx.onRename}\n onSetTextPresentation={ctx.onSetTextPresentation}\n anchorRef={ctx.anchorRef}\n selectionKey={ctx.selectedIds?.join(',')}\n forceClose={ctx.openPopoverId === 'editProperties'}\n onOpenChange={(open) => ctx.onOpenPopoverChange?.('label', open)}\n />\n )\n}\n\n/** Edit properties popover (freeform KV), anchored to the toolbar. Single-target. */\nexport function ConnectedEditPropertiesAction({\n disabled,\n labels,\n}: Pick<\n EditPropertiesActionProps,\n 'disabled' | 'labels'\n> = {}): JSX.Element | null {\n const ctx = useLassoGeometryToolbarAction()\n\n if (!ctx.onEditProperties) return null\n\n return (\n <EditPropertiesAction\n // `undefined` on a multi-selection: `singleOnly` disables the button\n // before it can ever open with an empty draft. System keys are filtered\n // here so the maps HOC can pass full properties for Label derivation.\n properties={getEditablePropertiesFromFull(ctx.properties ?? {})}\n disabled={disabled ?? ctx.singleOnly}\n labels={{ ...ctx.labels?.editProperties, ...labels }}\n onEditProperties={ctx.onEditProperties}\n anchorRef={ctx.anchorRef}\n selectionKey={ctx.selectedIds?.join(',')}\n forceClose={ctx.openPopoverId === 'label'}\n onOpenChange={(open) => ctx.onOpenPopoverChange?.('editProperties', open)}\n />\n )\n}\n\n/** Mask/draw toggle, active while the selection is a mask. */\nexport function ConnectedToggleTypeAction({\n disabled,\n labels,\n}: Pick<\n ToggleTypeActionProps,\n 'disabled' | 'labels'\n> = {}): JSX.Element | null {\n const ctx = useLassoGeometryToolbarAction()\n\n if (!ctx.onToggleType || !ctx.type) return null\n\n return (\n <ToggleTypeAction\n type={ctx.type}\n disabled={disabled ?? ctx.disabled}\n labels={{ ...ctx.labels?.toggleType, ...labels }}\n onToggleType={ctx.onToggleType}\n />\n )\n}\n\n/** Merge. Needs two or more unlocked geometries selected. */\nexport function ConnectedUnionAction({\n disabled,\n label,\n}: Pick<UnionActionProps, 'disabled' | 'label'> = {}): JSX.Element | null {\n const ctx = useLassoGeometryToolbarAction()\n\n if (!ctx.onUnion) return null\n\n return (\n <UnionAction\n disabled={disabled ?? (ctx.disabled || (ctx.selectionCount ?? 1) < 2)}\n label={label ?? ctx.labels?.union}\n onUnion={ctx.onUnion}\n />\n )\n}\n\n/**\n * Split. Needs a single unlocked MultiPolygon selected (`splittable`) — the\n * inverse of the merge action on disjoint inputs.\n */\nexport function ConnectedSplitAction({\n disabled,\n label,\n}: Pick<SplitActionProps, 'disabled' | 'label'> = {}): JSX.Element | null {\n const ctx = useLassoGeometryToolbarAction()\n\n if (!ctx.onSplit) return null\n\n return (\n <SplitAction\n disabled={disabled ?? (ctx.singleOnly || !ctx.splittable)}\n label={label ?? ctx.labels?.split}\n onSplit={ctx.onSplit}\n />\n )\n}\n\n/** Subtract (first minus the rest). Needs 2+ unlocked geometries selected. */\nexport function ConnectedSubtractAction({\n disabled,\n label,\n}: Pick<SubtractActionProps, 'disabled' | 'label'> = {}): JSX.Element | null {\n const ctx = useLassoGeometryToolbarAction()\n\n if (!ctx.onSubtract) return null\n\n return (\n <SubtractAction\n disabled={disabled ?? (ctx.disabled || (ctx.selectionCount ?? 1) < 2)}\n label={label ?? ctx.labels?.subtract}\n onSubtract={ctx.onSubtract}\n />\n )\n}\n\n/** Intersect (common area). Needs 2+ unlocked geometries selected. */\nexport function ConnectedIntersectAction({\n disabled,\n label,\n}: Pick<IntersectActionProps, 'disabled' | 'label'> = {}): JSX.Element | null {\n const ctx = useLassoGeometryToolbarAction()\n\n if (!ctx.onIntersect) return null\n\n return (\n <IntersectAction\n disabled={disabled ?? (ctx.disabled || (ctx.selectionCount ?? 1) < 2)}\n label={label ?? ctx.labels?.intersect}\n onIntersect={ctx.onIntersect}\n />\n )\n}\n\n/** Duplicates the whole selection (offset copies). */\nexport function ConnectedDuplicateAction({\n disabled,\n label,\n}: Pick<DuplicateActionProps, 'disabled' | 'label'> = {}): JSX.Element | null {\n const ctx = useLassoGeometryToolbarAction()\n\n if (!ctx.onDuplicate) return null\n\n return (\n <DuplicateAction\n disabled={disabled ?? ctx.disabled}\n label={label ?? ctx.labels?.duplicate}\n onDuplicate={ctx.onDuplicate}\n />\n )\n}\n\n/**\n * Lock toggle. Deliberately never disabled by the lock itself: it is the only\n * way out of it.\n *\n * Driven by `locked` (ALL selected locked), not `anyLocked`, on purpose — the\n * standard mixed-state convention: a partially locked selection shows an\n * unpressed \"Lock\" and clicking it locks the WHOLE selection to a uniform\n * state (then a second click unlocks everything). Tested in\n * `geometry-toolbar.test.tsx` (\"disables batch actions when anyLocked…\").\n */\nexport function ConnectedLockAction({\n disabled,\n labels,\n}: Pick<LockActionProps, 'disabled' | 'labels'> = {}): JSX.Element | null {\n const ctx = useLassoGeometryToolbarAction()\n\n if (!ctx.onToggleLock) return null\n\n return (\n <LockAction\n locked={ctx.locked ?? false}\n disabled={disabled}\n labels={{ ...ctx.labels?.lock, ...labels }}\n onToggleLock={ctx.onToggleLock}\n />\n )\n}\n\n/** Deletes the whole selection. */\nexport function ConnectedDeleteAction({\n disabled,\n label,\n}: Pick<DeleteActionProps, 'disabled' | 'label'> = {}): JSX.Element | null {\n const ctx = useLassoGeometryToolbarAction()\n\n if (!ctx.onDelete) return null\n\n return (\n <DeleteAction\n disabled={disabled ?? ctx.disabled}\n label={label ?? ctx.labels?.delete}\n onDelete={ctx.onDelete}\n />\n )\n}\n","import { useRef, useState, type JSX } from 'react'\nimport type { LassoGeometryToolbarUIProps } from './types'\nimport { LassoToolbarUI } from './toolbar'\nimport {\n LassoGeometryToolbarProvider,\n type LassoGeometryToolbarContextValue,\n} from './toolbar/context'\nimport {\n ConnectedColorAction,\n ConnectedDeleteAction,\n ConnectedDuplicateAction,\n ConnectedEditGeometryAction,\n ConnectedEditPropertiesAction,\n ConnectedFillAction,\n ConnectedIntersectAction,\n ConnectedLabelAction,\n ConnectedLockAction,\n ConnectedSplitAction,\n ConnectedStrokeAction,\n ConnectedSubtractAction,\n ConnectedToggleTypeAction,\n ConnectedUnionAction,\n} from './toolbar/connected'\n\n/**\n * Shell for the contextual toolbar of a lasso selection: the floating `Paper`,\n * plus the state every action needs published on a context. **Which actions it\n * has is the consumer's call** — list them as children, in the order you want:\n *\n * ```tsx\n * <LassoTools.GeometryToolbar mapId='map1'>\n * {(props) => (\n * <LassoGeometryToolbarUI {...props}>\n * <LassoGeometryToolbarUI.Color />\n * <LassoGeometryToolbarUI.Label />\n * <LassoGeometryToolbarUI.Divider />\n * <LassoGeometryToolbarUI.Delete />\n * </LassoGeometryToolbarUI>\n * )}\n * </LassoTools.GeometryToolbar>\n * ```\n *\n * Same contract as widgets-v2: the actions take no data props (they read the\n * context) and each one renders nothing when its handler is missing, so a\n * composition can list every action safely. Pre-composed toolbars are\n * application-level code and live outside this library — see\n * `apps/storybook/stories/modules/lasso/geometry-toolbar.tsx` for the canonical\n * example, which reproduces the full CARTO design.\n *\n * For a toolbar outside this shell, compose `LassoToolbarUI` with the\n * prop-driven actions from `lasso-tool/toolbar` instead.\n */\nexport function LassoGeometryToolbarUI({\n type,\n label,\n locked = false,\n selectionCount = 1,\n anyLocked,\n style,\n defaultTextColor,\n onToggleType,\n onRename,\n onSetTextPresentation,\n onToggleLock,\n onDelete,\n onSetStyle,\n onEditGeometry,\n editingGeometry = false,\n onUnion,\n splittable = false,\n onSplit,\n onSubtract,\n onIntersect,\n onDuplicate,\n selectedIds,\n properties,\n onEditProperties,\n forceTextVisible,\n labels,\n PaperProps,\n children,\n}: LassoGeometryToolbarUIProps): JSX.Element {\n const paperRef = useRef<HTMLDivElement>(null)\n const [openPopoverId, setOpenPopoverId] = useState<\n 'label' | 'editProperties' | null\n >(null)\n\n // With any locked geometry in the selection, every action but the lock\n // toggle is disabled (single-selection: anyLocked === locked).\n const disabled = anyLocked ?? locked\n\n const value: LassoGeometryToolbarContextValue = {\n type,\n label,\n locked,\n selectionCount,\n anyLocked,\n style,\n defaultTextColor,\n disabled,\n // Single-target actions are also unavailable on a multi-selection.\n singleOnly: disabled || selectionCount > 1,\n // Style pickers only make sense for draw geometries with a style handler\n // (the controller omits `style` when the selection mixes types).\n showStyle: type === 'draw' && !!style && !!onSetStyle,\n editingGeometry,\n labels,\n anchorRef: paperRef,\n splittable,\n onToggleType,\n onRename,\n onSetTextPresentation,\n onToggleLock,\n onDelete,\n onSetStyle,\n onEditGeometry,\n onUnion,\n onSplit,\n onSubtract,\n onIntersect,\n onDuplicate,\n selectedIds,\n properties,\n onEditProperties,\n forceTextVisible,\n openPopoverId,\n onOpenPopoverChange: (id, open) => {\n setOpenPopoverId((current) => {\n if (open) return id\n return current === id ? null : current\n })\n },\n }\n\n return (\n <LassoToolbarUI ref={paperRef} PaperProps={PaperProps}>\n <LassoGeometryToolbarProvider value={value}>\n {children}\n </LassoGeometryToolbarProvider>\n </LassoToolbarUI>\n )\n}\n\nLassoGeometryToolbarUI.Color = ConnectedColorAction\nLassoGeometryToolbarUI.Fill = ConnectedFillAction\nLassoGeometryToolbarUI.Stroke = ConnectedStrokeAction\nLassoGeometryToolbarUI.EditGeometry = ConnectedEditGeometryAction\nLassoGeometryToolbarUI.Label = ConnectedLabelAction\nLassoGeometryToolbarUI.EditProperties = ConnectedEditPropertiesAction\nLassoGeometryToolbarUI.ToggleType = ConnectedToggleTypeAction\nLassoGeometryToolbarUI.Union = ConnectedUnionAction\nLassoGeometryToolbarUI.Split = ConnectedSplitAction\nLassoGeometryToolbarUI.Subtract = ConnectedSubtractAction\nLassoGeometryToolbarUI.Intersect = ConnectedIntersectAction\nLassoGeometryToolbarUI.Duplicate = ConnectedDuplicateAction\nLassoGeometryToolbarUI.Lock = ConnectedLockAction\nLassoGeometryToolbarUI.Delete = ConnectedDeleteAction\nLassoGeometryToolbarUI.Divider = LassoToolbarUI.Divider\n","import { Close, Search } from '@mui/icons-material'\nimport {\n Box,\n Button,\n Checkbox,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Divider,\n IconButton,\n InputBase,\n List,\n ListItemButton,\n ListItemIcon,\n ListItemText,\n Typography,\n type SxProps,\n type Theme,\n} from '@mui/material'\nimport { useId, useState, type JSX } from 'react'\nimport type { LassoLayerFiltersUIProps } from './types'\n\nconst titleSx = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 1,\n p: 2,\n} satisfies SxProps<Theme>\n\n// One rounded group on the grey \"default\" background, holding the search row,\n// a divider, and the scrollable list (Figma node 5960-14780).\nconst groupSx = {\n borderRadius: ({ spacing }) => spacing(0.5),\n overflow: 'hidden',\n backgroundColor: ({ palette }) => palette.background.default,\n} satisfies SxProps<Theme>\n\nconst searchSx = {\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n height: 32,\n px: 1.5,\n color: ({ palette }) => palette.text.secondary,\n} satisfies SxProps<Theme>\n\nconst rowSx = {\n px: 2,\n py: 0.5,\n} satisfies SxProps<Theme>\n\nconst checkboxSlotSx = {\n minWidth: 0,\n mr: 1,\n} satisfies SxProps<Theme>\n\n/**\n * \"Layer filters\" dialog: choose which map layers the lasso mask clips. The\n * selection is a draft committed on Apply (Cancel/close discards it). Wire it\n * to the lasso store via `LassoTools.LayerFilters` in `@carto/ps-react-maps`,\n * and open it from the drawing-tool menu's \"Layer filters\" item\n * (`LassoToolsUI` `onLayerFilters`).\n */\nexport function LassoLayerFiltersUI({\n open,\n onClose,\n layers,\n onApply,\n labels,\n DialogProps,\n}: LassoLayerFiltersUIProps): JSX.Element {\n const labelId = useId()\n const [draft, setDraft] = useState<Set<string>>(() => new Set())\n const [search, setSearch] = useState('')\n\n // Reset the draft from the committed selection when the dialog opens, by\n // adjusting state during render (the React-recommended pattern — no effect,\n // and later `layers` changes don't discard in-progress edits).\n const [wasOpen, setWasOpen] = useState(false)\n if (open !== wasOpen) {\n setWasOpen(open)\n if (open) {\n setDraft(new Set(layers.filter((l) => l.checked).map((l) => l.id)))\n setSearch('')\n }\n }\n\n const title = labels?.title ?? 'Layer Filters'\n const description =\n labels?.description ??\n 'Select the layers you want to filter with this polygon'\n const allSelectedLabel = labels?.allSelected ?? 'All selected'\n const empty = labels?.empty ?? 'No layers to filter'\n\n const allChecked = layers.length > 0 && layers.every((l) => draft.has(l.id))\n const someChecked = layers.some((l) => draft.has(l.id))\n\n const toggle = (id: string) =>\n setDraft((prev) => {\n const next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n\n const toggleAll = () =>\n setDraft(allChecked ? new Set() : new Set(layers.map((l) => l.id)))\n\n const handleApply = () => {\n // Emit ids in `layers` order (stable, diff-friendly), not Set-insertion order.\n onApply(layers.filter((l) => draft.has(l.id)).map((l) => l.id))\n onClose()\n }\n\n const normalized = search.trim().toLowerCase()\n const filtered = normalized\n ? layers.filter((l) => l.label.toLowerCase().includes(normalized))\n : layers\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n maxWidth='xs'\n fullWidth\n {...DialogProps}\n >\n <DialogTitle component='div' sx={titleSx}>\n <Typography variant='subtitle1' fontWeight={500}>\n {title}\n </Typography>\n <IconButton aria-label='close' size='small' onClick={onClose}>\n <Close fontSize='small' />\n </IconButton>\n </DialogTitle>\n\n <DialogContent sx={{ pt: 1, px: 2, pb: 3 }}>\n <Typography variant='body2' color='text.secondary' sx={{ mb: 2 }}>\n {description}\n </Typography>\n\n <Box sx={groupSx}>\n <Box sx={searchSx}>\n <Search sx={{ fontSize: 18 }} />\n <InputBase\n fullWidth\n placeholder={labels?.search ?? 'Search layers'}\n inputProps={{ 'aria-label': labels?.search ?? 'Search layers' }}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n sx={{ fontSize: 13, color: 'text.primary' }}\n />\n </Box>\n <Divider />\n <List\n component='div'\n role='list'\n disablePadding\n sx={{\n maxHeight: 240,\n overflowY: 'auto',\n // MUI gives dividers inside a List an 8px vertical margin; the\n // \"All selected\" separator should sit flush like the rows.\n '& .MuiDivider-root': { my: 0 },\n }}\n >\n {/* \"All selected\" master row only makes sense over the full\n list — hide it while a search is narrowing the results. */}\n {!normalized && (\n <>\n <ListItemButton dense sx={rowSx} onClick={toggleAll}>\n <ListItemIcon sx={checkboxSlotSx}>\n <Checkbox\n edge='start'\n tabIndex={-1}\n disableRipple\n sx={{ p: 0.5 }}\n checked={allChecked}\n indeterminate={!allChecked && someChecked}\n inputProps={{ 'aria-labelledby': `${labelId}-all` }}\n />\n </ListItemIcon>\n <ListItemText\n id={`${labelId}-all`}\n primary={allSelectedLabel}\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItemButton>\n <Divider />\n </>\n )}\n {filtered.length === 0 ? (\n <Typography variant='body2' color='text.secondary' sx={{ p: 2 }}>\n {empty}\n </Typography>\n ) : (\n filtered.map((layer) => (\n <ListItemButton\n key={layer.id}\n dense\n sx={rowSx}\n onClick={() => toggle(layer.id)}\n >\n <ListItemIcon sx={checkboxSlotSx}>\n <Checkbox\n edge='start'\n tabIndex={-1}\n disableRipple\n sx={{ p: 0.5 }}\n checked={draft.has(layer.id)}\n inputProps={{\n 'aria-labelledby': `${labelId}-${layer.id}`,\n }}\n />\n </ListItemIcon>\n <ListItemText\n id={`${labelId}-${layer.id}`}\n primary={layer.label}\n primaryTypographyProps={{\n variant: 'body2',\n noWrap: true,\n title: layer.label,\n }}\n />\n </ListItemButton>\n ))\n )}\n </List>\n </Box>\n </DialogContent>\n\n <DialogActions sx={{ p: 2 }}>\n <Button onClick={onClose}>{labels?.cancel ?? 'Cancel'}</Button>\n <Button variant='contained' onClick={handleApply}>\n {labels?.apply ?? 'Apply'}\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\n","import { Alert, AlertTitle, Snackbar } from '@mui/material'\nimport type { LassoMessageUIProps } from './types'\n\n/**\n * Presentational counterpart of `LassoTools.Message` (`@carto/ps-react-maps`),\n * positioned by that render-props component. Auto-hides after 5 seconds via\n * MUI `Snackbar` (calls `onDismiss`, which removes the message from the store).\n */\nexport function LassoMessageUI({\n message,\n onDismiss,\n AlertProps,\n SnackbarProps,\n}: LassoMessageUIProps) {\n return (\n <Snackbar\n open\n autoHideDuration={5000}\n // 'clickaway' is ignored so map interactions don't dismiss the message.\n onClose={(_, reason) => reason !== 'clickaway' && onDismiss()}\n // Stay in flow — the maps-side `LassoTools.Message` owns positioning.\n sx={{ position: 'static', transform: 'none' }}\n {...SnackbarProps}\n >\n <Alert\n severity={message.severity ?? 'info'}\n action={message.action}\n onClose={onDismiss}\n {...AlertProps}\n >\n <AlertTitle>{message.title}</AlertTitle>\n {message.content}\n </Alert>\n </Snackbar>\n )\n}\n","import type { ComponentProps, JSX } from 'react'\nimport type { Paper } from '@mui/material'\nimport { AcceptAction } from './toolbar/actions/accept-action'\nimport { CancelAction } from './toolbar/actions/cancel-action'\nimport { LassoToolbarUI } from './toolbar/toolbar'\n\nexport interface LassoEditConfirmToolbarUIProps {\n /** Commit the edit session (Enter). */\n onAccept: () => void\n /** Discard the edit session (Escape). */\n onCancel: () => void\n labels?: { accept?: string; cancel?: string }\n /** Keyboard-shortcut hints appended to each tooltip, e.g. `{ accept: '↵' }`. */\n shortcuts?: { accept?: string; cancel?: string }\n /** Forwarded to `LassoToolbarUI`, which owns the Paper's `ref`. */\n PaperProps?: Omit<ComponentProps<typeof Paper>, 'ref'>\n}\n\n/**\n * Cancel / Accept mini-toolbar shown above the geometry being edited.\n * Purely presentational — anchor it with `LassoTools.EditGeometryToolbar`\n * from `@carto/ps-react-maps`. Label drag during the session is pick-based\n * (TextLayer vs geometry), not a toolbar action.\n */\nexport function LassoEditConfirmToolbarUI({\n onAccept,\n onCancel,\n labels,\n shortcuts,\n PaperProps,\n}: LassoEditConfirmToolbarUIProps): JSX.Element {\n return (\n <LassoToolbarUI PaperProps={PaperProps}>\n {/* Cancel first, confirm last — the usual dialog-button convention. */}\n <CancelAction\n label={labels?.cancel}\n shortcut={shortcuts?.cancel}\n onCancel={onCancel}\n />\n <LassoToolbarUI.Divider />\n <AcceptAction\n label={labels?.accept}\n shortcut={shortcuts?.accept}\n onAccept={onAccept}\n />\n </LassoToolbarUI>\n )\n}\n","import type { SVGProps } from 'react'\n\nexport function RulerIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 18 18'\n fill='currentColor'\n {...props}\n >\n <path\n fill='currentColor'\n d='M3 13.5c-.413 0-.766-.147-1.06-.44A1.445 1.445 0 0 1 1.5 12V6c0-.412.147-.766.44-1.06.294-.293.647-.44 1.06-.44h12c.412 0 .766.147 1.06.44.293.294.44.647.44 1.06v6c0 .412-.147.766-.44 1.06-.294.293-.647.44-1.06.44H3ZM3 12h12V6h-2.25v3h-1.5V6h-1.5v3h-1.5V6h-1.5v3h-1.5V6H3v6Z'\n />\n </svg>\n )\n}\n\nexport function BufferIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 18 18'\n {...props}\n >\n <path\n fill='currentColor'\n fillRule='evenodd'\n d='M9 1.5a7.5 7.5 0 1 1 0 15 7.5 7.5 0 0 1 0-15ZM9 3a6 6 0 1 0 0 12A6 6 0 0 0 9 3Zm0 4.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3Z'\n clipRule='evenodd'\n />\n </svg>\n )\n}\n\nexport function AreaIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 18' {...props}>\n <path\n fill='currentColor'\n fillRule='evenodd'\n d='M4.5 13.5v-9h9v9h-9Zm.75-8.25h7.5v7.5h-7.5v-7.5Z'\n clipRule='evenodd'\n />\n <path\n fill='#2C3032'\n fillRule='evenodd'\n d='M1.5 3A1.5 1.5 0 0 1 3 1.5h12A1.5 1.5 0 0 1 16.5 3v12a1.5 1.5 0 0 1-1.5 1.5H3A1.5 1.5 0 0 1 1.5 15V3ZM3 3h12v12H3V3Z'\n clipRule='evenodd'\n />\n </svg>\n )\n}\n","import type { RequiredDeep } from 'type-fest'\nimport type {\n MeasurementMode,\n MeasurementModesMapping,\n MeasurementUnitsMapping,\n} from '../types'\nimport type { MeasurementToolsComponentProps } from './types'\nimport { RulerIcon, BufferIcon, AreaIcon } from './icons'\n\nexport const DEFAULT_MEASUREMENT_TOOLS_LABELS: NonNullable<\n RequiredDeep<MeasurementToolsComponentProps['labels']>\n> = {\n action: {\n tooltip: {\n active: 'Click on the map to start measuring',\n inactive: 'Click on the map to start measuring',\n },\n },\n chip: {\n tooltip: {\n active: 'Hide measure',\n inactive: 'Show measure',\n },\n },\n options: {\n mode: {\n title: 'Choose a measuring tool',\n options: {\n distance: 'Measure distance',\n buffer: 'Buffer distance',\n area: 'Area',\n },\n },\n units: {\n title: 'Unit of measurement',\n modal: {\n title: 'Map Measurement Unit',\n subtitle: 'Select the unit of measurement for your measurements',\n apply: 'Save',\n options: {\n metric: {\n title: 'Meters and Kilometers',\n options: {\n 'm-km': 'Auto',\n kilometer: 'Kilometers',\n meter: 'Meter',\n centimeter: 'Centimeter',\n milimeter: 'Milimeter',\n },\n },\n imperial: {\n title: 'Feet and Miles',\n options: {\n 'ft-mi': 'Auto',\n mile: 'Mile',\n feet: 'Feet',\n yard: 'Yard',\n },\n },\n },\n },\n },\n },\n} as const\n\nexport const DEFAULT_MEASUREMENT_TOOLS_UNITS_MAPPING: MeasurementUnitsMapping =\n {\n 'm-km': {\n short: 'm-km',\n },\n kilometer: {\n short: 'km',\n },\n meter: {\n short: 'm',\n },\n centimeter: {\n short: 'cm',\n },\n milimeter: {\n short: 'mm',\n },\n 'ft-mi': {\n short: 'ft-mi',\n },\n mile: {\n short: 'mi',\n },\n yard: {\n short: 'yd',\n },\n feet: {\n short: 'ft',\n },\n } as const\n\nexport const DEFAULT_MEASUREMENT_TOOLS_MODES_MAPPING: MeasurementModesMapping<MeasurementMode> =\n {\n distance: {\n icon: <RulerIcon />,\n },\n buffer: {\n icon: <BufferIcon />,\n },\n area: {\n icon: <AreaIcon />,\n },\n } as const\n","import { alpha, type SxProps, type Theme } from '@mui/material'\n\nexport const styles = {\n container: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-start',\n gap: ({ spacing }) => spacing(1),\n overflow: 'hidden',\n width: 'fit-content',\n },\n actions: {\n icon: {\n width: ({ spacing }) => spacing(4),\n height: ({ spacing }) => spacing(4),\n borderRadius: 0,\n '.MuiTouchRipple-ripple .MuiTouchRipple-child': {\n borderRadius: 0,\n },\n },\n },\n options: {\n menu: {\n marginTop: ({ spacing }) => spacing(1),\n },\n icon: {\n width: ({ spacing }) => spacing(3),\n },\n title: {\n paddingX: ({ spacing }) => spacing(2),\n paddingY: ({ spacing }) => spacing(0.5),\n },\n icons: {\n color: ({ palette }) => palette.text.primary,\n },\n tag: {\n borderRadius: ({ spacing }) => spacing(0.25),\n border: '1px solid',\n borderColor: ({ palette }) => palette.primary.main,\n paddingX: ({ spacing }) => spacing(0.5),\n color: ({ palette }) => palette.primary.main,\n backgroundColor: ({ palette }) => alpha(palette.primary.main, 0.08),\n },\n modal: {\n toggle: {\n boxShadow: 'none',\n backgroundColor: '#F8F9F9',\n padding: ({ spacing }) => spacing(0.5),\n marginTop: ({ spacing }) => spacing(2),\n marginBottom: ({ spacing }) => spacing(1),\n '.MuiToggleButtonGroup-grouped': {\n typography: 'caption',\n fontWeight: 500,\n margin: 0,\n '&:first-of-type:not(.MuiDivider-root)': {\n marginLeft: 0,\n },\n },\n },\n subtitle: {\n typography: 'body2',\n color: ({ palette }) => palette.text.secondary,\n },\n optionsGroup: {\n marginLeft: ({ spacing }) => spacing(1),\n typography: 'body2',\n },\n title: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: ({ spacing }) => spacing(2),\n },\n content: {\n paddingX: ({ spacing }) => spacing(2),\n minWidth: ({ spacing }) => spacing(50),\n },\n actions: {\n paddingX: ({ spacing }) => spacing(2),\n },\n },\n },\n chip: {\n chip: {\n marginRight: ({ spacing }) => spacing(0.5),\n },\n disabled: {\n opacity: ({ palette }) => palette.action.disabledOpacity,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { ArrowDropDown, Close } from '@mui/icons-material'\nimport {\n Box,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Divider,\n FormControl,\n FormControlLabel,\n IconButton,\n ListItemIcon,\n ListItemText,\n Menu,\n MenuItem,\n Paper,\n Radio,\n RadioGroup,\n SvgIcon,\n ToggleButton,\n ToggleButtonGroup,\n Typography,\n} from '@mui/material'\nimport {\n useMemo,\n useState,\n type FormEvent,\n type JSX,\n type MouseEvent,\n type PropsWithChildren,\n} from 'react'\nimport { styles } from './styles'\nimport deepmerge from 'deepmerge'\nimport type { MeasurementToolsComponentProps } from './types'\nimport type { PickDeep, ValueOf } from 'type-fest'\nimport {\n DEFAULT_MEASUREMENT_TOOLS_LABELS,\n DEFAULT_MEASUREMENT_TOOLS_UNITS_MAPPING,\n DEFAULT_MEASUREMENT_TOOLS_MODES_MAPPING,\n} from './const'\nimport type {\n MeasurementSystem,\n MeasurementUnit,\n MeasurementUnitImperialDistance,\n MeasurementUnitMetricDistance,\n MeasurementUnitOption,\n MeasureUnitMapping,\n} from '../types'\nimport { Tooltip } from '../tooltip/tooltip'\n\nconst EMPTY_PAPER_PROPS: NonNullable<\n MeasurementToolsComponentProps['PaperProps']\n> = {}\n\n/**\n * Provides a measurement interface for calculating distances, areas, and buffers on maps with support for metric and imperial unit systems and real-time unit conversion.\n *\n * @example\n * ```tsx\n * <MeasurementToolsUI\n * enabled={enabled}\n * value={measurementValue}\n * modes={DEFAULT_MEASUREMENT_TOOLS_MODES}\n * units={DEFAULT_MEASUREMENT_TOOLS_UNITS}\n * modesMapping={DEFAULT_MEASUREMENT_TOOLS_MODES_MAPPING}\n * unitsMapping={DEFAULT_MEASUREMENT_TOOLS_UNITS_MAPPING}\n * modeSelected={mode}\n * unitSelected={unit}\n * onActionToggle={setEnabled}\n * onChangeMode={setMode}\n * onChangeUnit={setUnit}\n * />\n * ```\n */\nexport function MeasurementToolsUI({\n enabled,\n actionProps,\n labels = DEFAULT_MEASUREMENT_TOOLS_LABELS,\n modes,\n modesMapping = DEFAULT_MEASUREMENT_TOOLS_MODES_MAPPING,\n unitsMapping = DEFAULT_MEASUREMENT_TOOLS_UNITS_MAPPING,\n modeSelected,\n PaperProps: { sx, ...PaperProps } = EMPTY_PAPER_PROPS,\n units,\n unitSelected,\n onActionToggle,\n onChangeMode,\n onChangeUnit,\n}: MeasurementToolsComponentProps): JSX.Element {\n const handleToggle: MeasurementToolsComponentProps['onActionToggle'] = (\n data,\n ) => {\n return onActionToggle(!!data)\n }\n\n const data = useMemo(() => {\n return deepmerge(modes, modesMapping)\n }, [modes, modesMapping])\n\n const modeExists = (modeSelected ?? '') in data\n\n const mode = (\n modeExists ? modeSelected : Object.keys(data)[0]\n ) as keyof typeof modes\n\n const modeSelectedValue = data[mode]\n\n const _units = useMemo(() => {\n const option = units[mode]\n const options =\n Object.keys(units).length >= 1 ? units : { [mode]: option.slice(0, 1) }\n return options[mode].map((unit) => {\n return {\n ...unit,\n ...unitsMapping[unit.value],\n }\n })\n }, [mode, units, unitsMapping])\n\n return (\n <Paper\n sx={{\n ...styles.container,\n ...sx,\n }}\n {...PaperProps}\n >\n <Box>\n <MeasurementToolsUIAction\n actionProps={actionProps}\n labels={labels?.action}\n enabled={enabled}\n onActionToggle={handleToggle}\n >\n {modeSelectedValue?.icon}\n </MeasurementToolsUIAction>\n <Options\n labels={labels?.options}\n modes={data}\n modeSelected={mode}\n units={_units}\n unitSelected={unitSelected}\n onChangeMode={onChangeMode}\n onChangeUnit={onChangeUnit}\n />\n </Box>\n </Paper>\n )\n}\n\nfunction MeasurementToolsUIAction({\n actionProps,\n labels,\n enabled,\n children,\n onActionToggle,\n}: PropsWithChildren<\n Pick<\n MeasurementToolsComponentProps,\n 'actionProps' | 'enabled' | 'onActionToggle'\n > & {\n labels?: PickDeep<\n MeasurementToolsComponentProps['labels'],\n 'action'\n >['action']\n }\n>) {\n const actionState = enabled ? 'active' : 'inactive'\n const actionLabel =\n labels?.tooltip?.[actionState] ??\n DEFAULT_MEASUREMENT_TOOLS_LABELS.action.tooltip[actionState]\n\n return (\n <Tooltip\n title={actionLabel}\n placement='right'\n {...actionProps?.TooltipProps}\n >\n <ToggleButton\n value='toggle'\n sx={styles.actions.icon}\n onClick={() => onActionToggle(!enabled)}\n aria-label={actionLabel}\n selected={enabled}\n >\n {children}\n </ToggleButton>\n </Tooltip>\n )\n}\n\nfunction Options({\n modes,\n modeSelected,\n units,\n unitSelected,\n labels,\n onChangeMode,\n onChangeUnit,\n}: Required<\n Pick<\n MeasurementToolsComponentProps,\n 'modeSelected' | 'onChangeMode' | 'onChangeUnit'\n >\n> & {\n modes: MeasurementToolsComponentProps['modes'] &\n MeasurementToolsComponentProps['modesMapping']\n units: (MeasurementUnitOption<MeasurementUnit> & MeasureUnitMapping)[]\n unitSelected?: MeasurementToolsComponentProps['unitSelected']\n labels?: PickDeep<\n MeasurementToolsComponentProps['labels'],\n 'options'\n >['options']\n}) {\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null)\n const [unitModal, setUnitModal] = useState(false)\n\n const modesAvailable = Object.values(modes)\n const unitsAvailable = Object.values(units)\n\n const hasValues = modesAvailable.length > 1 || unitsAvailable.length > 1\n\n if (!hasValues) {\n return null\n }\n\n const open = Boolean(anchorEl)\n\n const handleToggle = (event: MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget)\n }\n\n const handleClose = () => {\n setAnchorEl(null)\n }\n\n const handleClick = (\n e: MouseEvent<HTMLLIElement>,\n mode: ValueOf<Required<typeof modes>>,\n ) => {\n e.preventDefault()\n onChangeMode(mode.value)\n handleClose()\n }\n\n const handleClickUnit = () => {\n setUnitModal(true)\n }\n\n const handleCloseModal = () => {\n setUnitModal(false)\n }\n\n const handleApplyModal = (data: string) => {\n handleCloseModal()\n onChangeUnit(data)\n }\n\n const modeTitle =\n labels?.mode?.title ?? DEFAULT_MEASUREMENT_TOOLS_LABELS.options.mode.title\n\n const unitTitle =\n labels?.units?.title ?? DEFAULT_MEASUREMENT_TOOLS_LABELS.options.units.title\n\n const hasDivider = modesAvailable.length > 1 && unitsAvailable.length > 1\n\n const unitSelectedValue = (units.find(\n (unit) => unit.value === unitSelected,\n ) ?? units[0])!\n\n return (\n <>\n <IconButton sx={styles.options.icon} onClick={handleToggle}>\n <ArrowDropDown />\n </IconButton>\n <Menu\n id='measurement-menu'\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n MenuListProps={{\n 'aria-labelledby': 'basic-button',\n sx: styles.options.menu,\n }}\n >\n <div>\n {modesAvailable.length > 1 && (\n <>\n <Typography\n variant='subtitle2'\n color='text.secondary'\n sx={styles.options.title}\n >\n {modeTitle}\n </Typography>\n {modesAvailable.map((mode) => {\n const options =\n labels?.mode?.options ??\n DEFAULT_MEASUREMENT_TOOLS_LABELS.options.mode.options\n const label = options[mode.value]\n\n return (\n <MenuItem\n key={mode.value}\n onClick={(e) => handleClick(e, mode)}\n selected={mode.value === modeSelected}\n >\n <ListItemIcon sx={styles.options.icons}>\n <SvgIcon>{mode.icon}</SvgIcon>\n </ListItemIcon>\n <ListItemText>{label}</ListItemText>\n </MenuItem>\n )\n })}\n </>\n )}\n {hasDivider && <Divider />}\n {unitsAvailable.length > 1 && (\n <>\n <MenuItem onClick={handleClickUnit}>\n <ListItemText>{unitTitle}</ListItemText>\n <Typography\n variant='caption'\n fontWeight={500}\n sx={styles.options.tag}\n >\n {unitSelectedValue.short}\n </Typography>\n </MenuItem>\n <UnitsModal\n open={unitModal}\n labels={labels}\n units={units}\n unitSelectedValue={unitSelectedValue}\n onClose={handleCloseModal}\n onSubmit={handleApplyModal}\n />\n </>\n )}\n </div>\n </Menu>\n </>\n )\n}\n\nfunction UnitsModal({\n open,\n labels,\n units,\n unitSelectedValue,\n onClose,\n onSubmit,\n}: {\n open: boolean\n labels?: PickDeep<\n MeasurementToolsComponentProps['labels'],\n 'options'\n >['options']\n units: MeasurementUnitOption<MeasurementUnit>[]\n unitSelectedValue: MeasurementUnitOption<MeasurementUnit>\n onClose: () => void\n onSubmit: (data: string) => void\n}) {\n const [system, setSystem] = useState<MeasurementSystem>('metric')\n\n const _units = useMemo(() => {\n return units.filter((unit) => unit.system === system)\n }, [system, units])\n\n const handleToggleChange = (\n _: MouseEvent<HTMLElement>,\n value: MeasurementSystem,\n ) => {\n setSystem(value)\n }\n\n const _labels =\n labels?.units?.modal?.options ??\n DEFAULT_MEASUREMENT_TOOLS_LABELS.options.units.modal.options\n\n const labelsBySystem = _labels[system].options\n\n const modalUnitTitle =\n labels?.units?.modal?.title ??\n DEFAULT_MEASUREMENT_TOOLS_LABELS.options.units.modal.title\n const modalUnitSubtitle =\n labels?.units?.modal?.subtitle ??\n DEFAULT_MEASUREMENT_TOOLS_LABELS.options.units.modal.subtitle\n const modalUnitApply =\n labels?.units?.modal?.apply ??\n DEFAULT_MEASUREMENT_TOOLS_LABELS.options.units.modal.apply\n\n const _unitSelectedValue =\n unitSelectedValue.system === system ? unitSelectedValue : _units[0]\n\n return (\n <Dialog\n open={open}\n component={Box}\n onClose={onClose}\n maxWidth='xs'\n PaperProps={{\n component: 'form',\n onSubmit: (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n onSubmit(formData.get('unit-value') as string)\n },\n }}\n >\n <DialogTitle sx={styles.options.modal.title}>\n {modalUnitTitle}\n <IconButton onClick={onClose}>\n <Close />\n </IconButton>\n </DialogTitle>\n <DialogContent sx={styles.options.modal.content}>\n <Typography sx={styles.options.modal.subtitle}>\n {modalUnitSubtitle}\n </Typography>\n <ToggleButtonGroup\n color='primary'\n value={system}\n exclusive={true}\n fullWidth={true}\n onChange={handleToggleChange}\n aria-label='system'\n sx={styles.options.modal.toggle}\n >\n <ToggleButton value='metric'>{_labels.metric.title}</ToggleButton>\n <ToggleButton value='imperial'>{_labels.imperial.title}</ToggleButton>\n </ToggleButtonGroup>\n <FormControl key={_unitSelectedValue?.value}>\n <RadioGroup\n aria-labelledby='unit-value'\n defaultValue={_unitSelectedValue?.value}\n name='unit-value'\n sx={styles.options.modal.optionsGroup}\n >\n {_units.map((unit) => {\n const label =\n labelsBySystem[\n unit.value as MeasurementUnitMetricDistance &\n MeasurementUnitImperialDistance\n ]\n\n return (\n <FormControlLabel\n key={unit.value}\n value={unit.value}\n control={<Radio />}\n label={label}\n />\n )\n })}\n </RadioGroup>\n </FormControl>\n </DialogContent>\n <DialogActions sx={styles.options.modal.actions}>\n <Button variant='contained' type='submit'>\n {modalUnitApply}\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\n","export const tooltipLabelsDefault = {\n enabled: 'Show your current location',\n disabled: 'Location unavailable',\n}\n\nexport const ariaLabel = 'geolocation'\n","import { Paper, IconButton } from '@mui/material'\nimport {\n MyLocationOutlined,\n LocationDisabledOutlined,\n} from '@mui/icons-material'\nimport type { GeolocationControlProps } from './types'\nimport {\n useCallback,\n useEffect,\n useEffectEvent,\n useReducer,\n useRef,\n type JSX,\n} from 'react'\nimport { ariaLabel, tooltipLabelsDefault } from './const'\nimport { Tooltip } from '../tooltip/tooltip'\n\n/**\n * Provides a seamless interface for accessing device location through the browser's Geolocation API, with permission handling, continuous tracking, and error management.\n *\n * @example\n * ```tsx\n * <GeolocationControls\n * onChange={(coords) => console.log(coords.latitude, coords.longitude)}\n * onError={(error) => console.error(error.message)}\n * />\n * ```\n */\nexport function GeolocationControls({\n disabled,\n labels,\n PaperProps,\n TooltipProps,\n watch,\n onChange,\n onError,\n}: GeolocationControlProps): JSX.Element {\n const watchRef = useRef<number>(null)\n const hasGeolocation = 'geolocation' in navigator\n\n const [allowed, dispatch] = useReducer(\n (_: boolean, action: 'granted' | 'denied') => action === 'granted',\n hasGeolocation,\n )\n\n // Read the latest `onError` without making the permission-query effect\n // re-run (and re-register the `result.onchange` permission listener)\n // whenever the consumer passes a fresh callback identity.\n const notifyError = useEffectEvent(\n (error: Parameters<PositionErrorCallback>[0]): void => {\n onError?.(error)\n },\n )\n\n useEffect(() => {\n if (hasGeolocation) {\n navigator.permissions\n .query({ name: 'geolocation' })\n .then((result) => {\n dispatch(result.state === 'granted' ? 'granted' : 'denied')\n result.onchange = () => {\n dispatch(result.state === 'granted' ? 'granted' : 'denied')\n }\n })\n .catch((error: Parameters<PositionErrorCallback>[0]) => {\n dispatch('denied')\n notifyError(error)\n })\n }\n\n return () => {\n if (watchRef.current) {\n navigator.geolocation.clearWatch(watchRef.current)\n }\n }\n }, [hasGeolocation])\n\n const success = useCallback(\n (position: Parameters<PositionCallback>[0]) => {\n onChange(position.coords)\n },\n [onChange],\n )\n\n const error = useCallback(\n (error: Parameters<PositionErrorCallback>[0]) => {\n dispatch('denied')\n onError?.(error)\n },\n [onError],\n )\n\n const handleClick = useCallback(() => {\n if (watchRef.current) {\n navigator.geolocation.clearWatch(watchRef.current)\n }\n\n if (watch) {\n watchRef.current = navigator.geolocation.watchPosition(success, error)\n return\n }\n\n navigator.geolocation.getCurrentPosition(success, error)\n }, [watch, success, error])\n\n const tooltipLabels = labels?.tooltip ?? tooltipLabelsDefault\n\n return (\n <Paper {...PaperProps}>\n <Tooltip\n arrow\n placement='right'\n title={tooltipLabels[allowed ? 'enabled' : 'disabled']}\n {...TooltipProps}\n >\n <IconButton\n onClick={handleClick}\n aria-label={labels?.ariaLabel ?? ariaLabel}\n disabled={!hasGeolocation || disabled}\n >\n {allowed ? <MyLocationOutlined /> : <LocationDisabledOutlined />}\n </IconButton>\n </Tooltip>\n </Paper>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n zoom: {\n position: 'relative',\n height: ({ spacing }) => spacing(4),\n aspectRatio: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n paper: {\n display: 'flex',\n backgroundColor: ({ palette }) => palette.background.paper,\n width: 'auto',\n overflow: 'hidden',\n boxShadow: ({ shadows }) => shadows[1],\n borderRadius: ({ spacing }) => spacing(0.5),\n\n button: {\n borderRadius: 0,\n },\n },\n circularProgress: {\n position: 'absolute',\n },\n} satisfies Record<string, SxProps<Theme>>\n","import {\n IconButton,\n Divider,\n Box,\n Typography,\n CircularProgress,\n Paper,\n} from '@mui/material'\nimport {\n AddOutlined,\n RemoveOutlined,\n CropFreeOutlined,\n} from '@mui/icons-material'\nimport { styles } from './styles'\nimport type { ZoomControlProps } from './types'\nimport { useCallback, type JSX } from 'react'\n\n/**\n * Provides intuitive zoom controls for maps and zoomable interfaces with flexible layouts, loading states, and optional reset functionality.\n *\n * @remarks\n * This is an uncontrolled component. Typically used with the `ZoomControls` HOC from `@carto/ps-react-maps` for automatic state management.\n *\n * @example\n * ```tsx\n * <ZoomControlsUI\n * zoom={zoom}\n * onChange={setZoom}\n * minZoom={2}\n * maxZoom={20}\n * />\n * ```\n */\nexport function ZoomControlsUI({\n zoom,\n disabled,\n direction = 'vertical',\n reverse = false,\n isLoading,\n maxZoom = 24,\n minZoom = 0,\n PaperProps,\n ResetViewProps = {\n Icon: CropFreeOutlined,\n },\n showZoom = true,\n onChange,\n onReset,\n}: ZoomControlProps): JSX.Element {\n const increaseZoom = useCallback(() => {\n const newZoom = Math.min(maxZoom, zoom + 1)\n onChange(newZoom)\n }, [maxZoom, onChange, zoom])\n\n const decreaseZoom = useCallback(() => {\n const newZoom = Math.max(minZoom, zoom - 1)\n onChange(newZoom)\n }, [minZoom, onChange, zoom])\n\n const displayZoom = Math.floor(zoom)\n\n const dividerOrientation =\n direction === 'vertical' ? 'horizontal' : 'vertical'\n\n let flexDirection = direction === 'vertical' ? 'column' : 'row'\n\n if (reverse) {\n flexDirection += '-reverse'\n }\n\n return (\n <Paper\n sx={{\n ...styles.paper,\n flexDirection,\n }}\n {...PaperProps}\n >\n {onReset && (\n <>\n <IconButton\n onClick={onReset}\n aria-label='Reset action'\n disabled={disabled}\n >\n <ResetViewProps.Icon />\n </IconButton>\n <Divider orientation={dividerOrientation} flexItem />\n </>\n )}\n <IconButton\n onClick={increaseZoom}\n aria-label='Increase zoom'\n disabled={disabled}\n >\n <AddOutlined />\n </IconButton>\n <Divider orientation={dividerOrientation} flexItem />\n {showZoom && (\n <>\n <Box sx={styles.zoom}>\n <Typography\n display='block'\n align='center'\n color='textSecondary'\n variant='overline'\n >\n {displayZoom}\n </Typography>\n {isLoading && (\n <CircularProgress\n sx={styles.circularProgress}\n variant='indeterminate'\n size={24}\n />\n )}\n </Box>\n <Divider orientation={dividerOrientation} flexItem />\n </>\n )}\n <IconButton\n onClick={decreaseZoom}\n aria-label='Decrease zoom'\n disabled={disabled}\n >\n <RemoveOutlined />\n </IconButton>\n </Paper>\n )\n}\n","import { Box, Grid, Skeleton } from '@mui/material'\n\ninterface ListDataSkeletonProps {\n length?: number\n}\n\nexport function ListDataSkeleton({ length = 5 }: ListDataSkeletonProps) {\n return (\n <Box aria-label='List Data skeleton'>\n {new Array(length).fill(null).map((_, idx) => (\n <Grid key={`skeleton-${idx}`} container spacing={1}>\n <Grid\n container\n item\n direction='row'\n justifyContent='space-between'\n alignItems='center'\n >\n <Skeleton width={isOdd(idx) ? 72 : 48} height={20} />\n <Skeleton width={48} height={8} />\n </Grid>\n\n <Skeleton\n sx={{\n height: ({ spacing }) => spacing(0.5),\n marginTop: ({ spacing }) => spacing(1.25),\n marginBottom: ({ spacing }) => spacing(1.75),\n width: '100%',\n }}\n />\n </Grid>\n ))}\n </Box>\n )\n}\n\n// Aux\nfunction isOdd(num: number) {\n return num % 2 === 1\n}\n","import {\n Alert,\n Box,\n Typography,\n type AlertProps,\n type TypographyProps,\n} from '@mui/material'\n\ninterface NoDataAlertProps {\n title?: string\n body?: string\n severity?: AlertProps['severity']\n}\n\nexport function NoDataAlert({\n title = 'No data available',\n body = 'There are no results for the combination of filters applied to your data. Try tweaking your filters, or zoom and pan the map to adjust the Map View.',\n severity,\n}: NoDataAlertProps) {\n if (severity) {\n return (\n <Alert title={title} severity={severity}>\n <AlertBody>{body}</AlertBody>\n </Alert>\n )\n }\n\n return (\n <Box>\n {title && <Typography variant='body2'>{title}</Typography>}\n <AlertBody color='textSecondary'>{body}</AlertBody>\n </Box>\n )\n}\n\n// Aux\ninterface AlertBodyProps {\n color?: TypographyProps['color']\n children: React.ReactNode\n}\n\nfunction AlertBody({ color, children }: AlertBodyProps) {\n if (children) {\n return (\n <Box mt={0.5}>\n <Typography\n component='div'\n variant='caption'\n color={color ?? 'inherit'}\n style={{ fontWeight: 'normal' }}\n >\n {children}\n </Typography>\n </Box>\n )\n }\n\n return <Box mt={-1} />\n}\n","import { useState } from 'react'\n\nexport function useSkeleton(isLoading: boolean) {\n // Track render phase: 0=never shown, 1=showing now, 2=already shown\n const [phase, setPhase] = useState(() => (isLoading ? 1 : 0))\n\n // Transition from phase 0 to 1 when loading starts\n if (isLoading && phase === 0) {\n setPhase(1)\n }\n\n // Transition from phase 1 to 2 when loading ends (skeleton was shown, now done)\n if (!isLoading && phase === 1) {\n setPhase(2)\n }\n\n // Show skeleton only in phase 1 (first time loading)\n return phase === 1\n}\n","import { type SxProps, type Theme } from '@mui/material'\n\nconst ellipsed = {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n}\n\nexport const styles = {\n label: {\n '& .MuiListItemText-primary': {\n ...ellipsed,\n },\n },\n value: {\n '& .MuiListItemText-primary': {\n ...ellipsed,\n textAlign: 'right',\n },\n },\n clickable: {\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: ({ palette }) => palette.action.hover,\n },\n },\n showDivider: {\n borderBottom: ({ palette }) => `1px solid ${palette.divider}`,\n },\n selected: {\n backgroundColor: ({ palette }) => palette.action.selected,\n },\n disabled: {\n opacity: 0.5,\n pointerEvents: 'none',\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { useState, useMemo, type JSX } from 'react'\nimport { Box, Button, Grid, ListItem, List, ListItemText } from '@mui/material'\nimport { ListDataSkeleton } from './list-data-skeleton'\nimport { NoDataAlert } from '../no-data-alert/no-data-alert'\nimport { useSkeleton } from '../../hooks/use-skeleton'\nimport type { ListDataProps } from './types'\nimport { styles } from './styles'\nimport { SmartTooltip } from '../smart-tooltip/smart-tooltip'\n\nconst DEFAULT_LABELS = {\n showMore: 'Show More',\n showLess: 'Show Less',\n} as const\n\nconst EMPTY_DATA: ListDataProps['data'] = []\n\n/**\n * Displays structured data in an accessible list format with expandable views, interactive selection, tooltips, and loading states.\n *\n * @example\n * ```tsx\n * <ListDataUI\n * data={[\n * { id: '1', label: 'Population', value: '8.4M' },\n * { id: '2', label: 'Median Age', value: '32 years' },\n * ]}\n * maxItems={3}\n * onItemClick={(item) => setSelectedId(item.id)}\n * selectedItemId={selectedId}\n * />\n * ```\n */\nexport function ListDataUI({\n data = EMPTY_DATA,\n isLoading = false,\n maxItems = 5,\n labels = DEFAULT_LABELS,\n showDivider = true,\n selectedItemId,\n tooltipProps,\n onExpand,\n onItemClick,\n}: ListDataProps): JSX.Element {\n const [showAll, setShowAll] = useState(false)\n\n const showSkeleton = useSkeleton(isLoading)\n\n const items = useMemo(() => {\n return showAll ? data : data.slice(0, maxItems)\n }, [data, maxItems, showAll])\n\n const handleToggle = () => {\n setShowAll(!showAll)\n onExpand?.(showAll)\n }\n\n if (showSkeleton) {\n return <ListDataSkeleton length={maxItems} />\n }\n\n if (items.length === 0) {\n return <NoDataAlert />\n }\n\n return (\n <>\n <List id='expandable-list' role='list'>\n {items.map((item) => (\n <SmartTooltip<HTMLLIElement>\n // Default tooltip props\n followCursor={false}\n key={item.id}\n placement='top'\n arrow\n title={item.tooltipTitle}\n enterDelay={10}\n // Custom tooltip props\n {...tooltipProps}\n >\n {({ ref }) => (\n <ListItem\n ref={ref}\n role='listitem'\n sx={{\n ...(showDivider && styles.showDivider),\n ...(onItemClick && styles.clickable),\n ...(selectedItemId === item.id && styles.selected),\n ...(item.disabled && styles.disabled),\n }}\n onClick={() => {\n if (item.disabled) return\n onItemClick?.(item)\n }}\n >\n <Grid container alignItems='center'>\n <Grid item xs={8}>\n <ListItemText primary={item.label} sx={styles.label} />\n </Grid>\n <Grid item xs={4}>\n <ListItemText primary={item.value} sx={styles.value} />\n </Grid>\n </Grid>\n </ListItem>\n )}\n </SmartTooltip>\n ))}\n </List>\n\n {data.length > maxItems && (\n <Box my={2}>\n <Button\n onClick={handleToggle}\n variant='text'\n color='primary'\n aria-expanded={showAll}\n aria-controls='expandable-list'\n >\n {showAll ? labels.showLess : labels.showMore}\n </Button>\n </Box>\n )}\n </>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const BASEMAPS_WIDTH = 288\n\nexport const styles = {\n root: {\n width: BASEMAPS_WIDTH,\n overflow: 'auto',\n },\n toggle: {\n padding: ({ spacing }) => spacing(0.5),\n\n img: {\n width: '100%',\n aspectRatio: '1 / 1',\n borderRadius: ({ spacing }) => spacing(0.25),\n },\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: ({ spacing }) => spacing(1),\n paddingInlineStart: ({ spacing }) => spacing(2),\n position: 'sticky',\n top: 0,\n zIndex: 2,\n background: ({ palette }) => palette.background.paper,\n },\n groupWrapper: {\n content: {\n paddingInline: ({ spacing }) => spacing(2),\n paddingBlock: ({ spacing }) => spacing(0.5),\n },\n },\n group: {\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: ({ spacing }) => spacing(2),\n paddingInline: ({ spacing }) => spacing(2),\n paddingBlock: ({ spacing }) => spacing(1),\n },\n item: {\n container: {\n display: 'flex',\n alignItems: 'center',\n flexDirection: 'column',\n gap: ({ spacing }) => spacing(1),\n background: 'transparent',\n border: 'none',\n cursor: 'pointer',\n padding: 0,\n height: ({ spacing }) => spacing(12),\n\n img: {\n maxWidth: ({ spacing }) => spacing(9),\n aspectRatio: '1 / 1',\n borderRadius: ({ spacing }) => spacing(0.5),\n border: `2px solid transparent`,\n\n '&:hover': {\n borderColor: ({ palette }) => palette.action.active,\n },\n\n '&[data-active=\"true\"]': {\n borderColor: ({ palette }) => palette.primary.main,\n },\n },\n },\n selected: {\n color: ({ palette }) => palette.primary.main,\n },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import type { BasemapsUILabels } from './types'\n\nexport const DEFAULT_BASEMAPS_LABELS: BasemapsUILabels = {\n toggle: {\n title: 'Toggle basemaps controls',\n },\n header: {\n title: 'Basemaps',\n actions: {\n close: 'Close',\n },\n },\n}\n","import { Close } from '@mui/icons-material'\nimport { Box, Typography, IconButton } from '@mui/material'\nimport { styles } from './styles'\nimport type { BasemapsUILabels } from './types'\nimport { Tooltip } from '../tooltip/tooltip'\n\nexport function Header({\n isMobile = false,\n labels,\n onChangeCollapsed,\n}: {\n labels: BasemapsUILabels['header']\n isMobile?: boolean\n onChangeCollapsed: () => void\n}) {\n return (\n <Box sx={styles.header}>\n {isMobile && (\n <>\n <Typography variant='caption' flexGrow={1}>\n {labels.title}\n </Typography>\n <Tooltip title={labels.actions.close}>\n <IconButton\n size='small'\n onClick={onChangeCollapsed}\n aria-label={labels.actions.close}\n >\n <Close />\n </IconButton>\n </Tooltip>\n </>\n )}\n </Box>\n )\n}\n","import { Typography } from '@mui/material'\nimport type { ReactNode } from 'react'\nimport { styles } from './styles'\n\nexport function GroupWrapper({\n title,\n children,\n collapsed = false,\n}: {\n title: string\n children: ReactNode\n collapsed?: boolean\n}) {\n if (collapsed) return children\n\n return (\n <>\n <Typography\n variant='caption'\n color='textSecondary'\n sx={styles.groupWrapper.content}\n >\n {title}\n </Typography>\n {children}\n </>\n )\n}\n","import { Box, Typography } from '@mui/material'\nimport { styles } from './styles'\nimport type { BasemapOption } from './types'\n\nexport function Group({\n values,\n selected,\n onChange,\n}: {\n values: Omit<BasemapOption, 'group'>[]\n selected: string | null | undefined\n onChange: (id: string) => void\n}) {\n return (\n <Box sx={styles.group}>\n {values.map((option) => {\n const isSelected = option.id === selected\n return (\n <Box\n key={option.id}\n sx={styles.item.container}\n component='button'\n aria-label={option.label}\n onClick={() => onChange(option.id)}\n >\n <img\n src={option.icon}\n aria-label={option.label + ' icon'}\n data-active={isSelected}\n />\n <Typography\n variant='caption'\n sx={{ ...(isSelected && styles.item.selected) }}\n >\n {option.label}\n </Typography>\n </Box>\n )\n })}\n </Box>\n )\n}\n","import {\n Drawer,\n Popover,\n type PopoverActions,\n type PopoverOrigin,\n type PopoverProps,\n} from '@mui/material'\nimport {\n useCallback,\n useRef,\n useSyncExternalStore,\n type CSSProperties,\n type ReactNode,\n} from 'react'\n\ntype ResponsiveDrawerPosition =\n 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n\n/** Placement of the panel relative to its anchor (desktop popover only). */\nexport type ResponsiveDrawerPlacement = 'side' | 'overlay'\n\n/**\n * Popover anchor/transform origins. `'overlay'` pins corner-to-corner on the anchor.\n */\nexport function resolveOrigins(\n position: ResponsiveDrawerPosition,\n placement: ResponsiveDrawerPlacement,\n): { anchorOrigin: PopoverOrigin; transformOrigin: PopoverOrigin } {\n const isBottom = position.startsWith('bottom')\n const isRight = position.endsWith('right')\n const overlay = placement === 'overlay'\n\n return {\n anchorOrigin: {\n vertical: isBottom ? 'bottom' : 'top',\n horizontal: overlay\n ? isRight\n ? 'right'\n : 'left'\n : isRight\n ? 'left'\n : 'right',\n },\n transformOrigin: {\n vertical: isBottom ? 'bottom' : 'top',\n horizontal: isRight ? 'right' : 'left',\n },\n }\n}\n\nexport function ResponsiveDrawer<\n T extends {\n collapsed: boolean\n onChangeCollapsed: (collapsed: boolean) => void\n position: ResponsiveDrawerPosition\n slotProps?: PopoverProps['slotProps']\n },\n>({\n anchorEl,\n ref,\n children,\n collapsed,\n isMobile = false,\n position,\n sx,\n slotProps,\n container,\n onChangeCollapsed,\n modal = true,\n placement = 'side',\n}: Required<Pick<T, 'collapsed' | 'onChangeCollapsed' | 'position'>> &\n Pick<PopoverProps, 'slotProps' | 'sx' | 'container'> & {\n /** Element the desktop popover is anchored to. */\n anchorEl?: HTMLElement | null\n /**\n * @deprecated Use `anchorEl`. A JSX prop named `ref` is non-reactive under\n * the React Compiler, so a state-held anchor stays frozen at its initial\n * `null` and the popover never opens. Removed in the next major.\n */\n ref?: HTMLElement | null\n isMobile?: boolean\n children: ReactNode\n /**\n * When `false`, the desktop popover is **non-modal**: no backdrop, clicks\n * pass through to the content behind it (e.g. a map stays interactive), no\n * focus trap, and neither backdrop-click nor Escape closes it (close it via\n * `onChangeCollapsed`). Defaults to `true` (standard dismissable popover).\n * Desktop-only — the mobile drawer is unaffected.\n */\n modal?: boolean\n /**\n * Desktop popover placement relative to the anchor: `'side'` (default) opens\n * beside the trigger; `'overlay'` pins corner-to-corner, sitting on top of\n * the anchor (e.g. a trigger hidden while the panel is open). Desktop-only.\n */\n placement?: ResponsiveDrawerPlacement\n }) {\n // Popover position is frozen on open — re-measure on content resize (callback ref: portal mounts after open).\n const anchor = anchorEl ?? ref ?? null\n\n const popoverActions = useRef<PopoverActions>(null)\n const observerRef = useRef<ResizeObserver | null>(null)\n const observeContent = useCallback((el: HTMLDivElement | null) => {\n observerRef.current?.disconnect()\n observerRef.current = null\n if (el && typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(() =>\n popoverActions.current?.updatePosition(),\n )\n observer.observe(el)\n observerRef.current = observer\n }\n }, [])\n\n // Popover Paper is auto-height — `%` max-height needs a measured px cap from `container`.\n const measurableContainer =\n container && typeof container !== 'function' ? container : null\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n if (!measurableContainer || typeof ResizeObserver === 'undefined') {\n return () => undefined\n }\n const observer = new ResizeObserver(onStoreChange)\n observer.observe(measurableContainer)\n return () => observer.disconnect()\n },\n [measurableContainer],\n )\n const getSnapshot = useCallback(\n () => measurableContainer?.clientHeight,\n [measurableContainer],\n )\n const containerHeight = useSyncExternalStore(subscribe, getSnapshot)\n\n if (isMobile) {\n return (\n <Drawer\n anchor='bottom'\n open={!collapsed}\n onClose={() => onChangeCollapsed(true)}\n >\n {children}\n </Drawer>\n )\n }\n\n const { anchorOrigin, transformOrigin } = resolveOrigins(position, placement)\n\n const objectSlotProps = slotProps as\n | { root?: Record<string, unknown>; paper?: { style?: CSSProperties } }\n | undefined\n // Capped Paper: disable outer scroll + flex so inner scroll regions can shrink.\n const paperMaxHeightStyle: CSSProperties | undefined =\n containerHeight != null && containerHeight > 0\n ? {\n maxHeight: containerHeight * 0.9,\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n }\n : undefined\n const contentWrapperStyle: CSSProperties | undefined = paperMaxHeightStyle\n ? {\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n minHeight: 0,\n maxHeight: '100%',\n overflow: 'hidden',\n width: '100%',\n }\n : undefined\n const mergedSlotProps: PopoverProps['slotProps'] =\n modal && !paperMaxHeightStyle\n ? slotProps\n : {\n ...(typeof slotProps === 'object' && slotProps != null\n ? slotProps\n : {}),\n ...(!modal && {\n root: {\n style: { pointerEvents: 'none' },\n ...objectSlotProps?.root,\n },\n }),\n paper: {\n ...objectSlotProps?.paper,\n style: {\n ...(!modal && { pointerEvents: 'auto' }),\n ...paperMaxHeightStyle,\n ...objectSlotProps?.paper?.style,\n },\n },\n }\n\n return (\n <Popover\n action={popoverActions}\n sx={sx}\n container={container}\n anchorEl={anchor}\n open={!collapsed && anchor != null}\n onClose={modal ? () => onChangeCollapsed(true) : undefined}\n hideBackdrop={!modal}\n disableScrollLock={!modal}\n disableEscapeKeyDown={!modal}\n disableAutoFocus={!modal}\n disableEnforceFocus={!modal}\n disableRestoreFocus={!modal}\n anchorOrigin={anchorOrigin}\n transformOrigin={transformOrigin}\n slotProps={mergedSlotProps}\n >\n <div ref={observeContent} style={contentWrapperStyle}>\n {children}\n </div>\n </Popover>\n )\n}\n","import { IconButton, Paper, useMediaQuery, useTheme } from '@mui/material'\nimport type { BasemapsUIProps } from './types'\nimport { useEffect, useRef, useState, type JSX } from 'react'\nimport { styles } from './styles'\nimport deepmerge from 'deepmerge'\nimport { DEFAULT_BASEMAPS_LABELS } from './const'\nimport { Header } from './header'\nimport { GroupWrapper } from './group-wrapper'\nimport { Group } from './group'\nimport { ResponsiveDrawer } from '../responsive-drawer/responsive-drawer'\nimport { Tooltip } from '../tooltip/tooltip'\n\nconst EMPTY_OPTIONS: BasemapsUIProps['options'] = []\n\n/**\n * Provides an interactive basemap selector with responsive drawer, grouping support, and customizable positioning.\n *\n * @remarks\n * This is an uncontrolled component focused on UI presentation. Typically used with the `BasemapsControls` HOC from `@carto/ps-react-maps` for automatic state management.\n *\n * @example\n * ```tsx\n * <BasemapsControls mapId={mapId}>\n * {({ basemap, setBasemap }) => (\n * <BasemapsUI\n * options={basemapOptions}\n * selected={basemap}\n * onChange={setBasemap}\n * position=\"bottom-right\"\n * />\n * )}\n * </BasemapsControls>\n * ```\n */\nexport function BasemapsUI({\n options = EMPTY_OPTIONS,\n labels: _labels,\n position = 'bottom-right',\n selected = null,\n onChange,\n TooltipProps,\n}: BasemapsUIProps): JSX.Element {\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null)\n const [isOpen, setIsOpen] = useState(false)\n const timeoutRef = useRef<NodeJS.Timeout | null>(null)\n const [timer, setTimer] = useState<number | null>(null)\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'))\n const labels = deepmerge(DEFAULT_BASEMAPS_LABELS, _labels ?? {})\n\n const optionSelected = options.find((option) => option.id === selected)\n\n const groups = Object.groupBy(options, (option) => option.group ?? 'default')\n\n const groupCount = Object.keys(groups).length\n\n const handleClose = () => {\n setAnchorEl(null)\n setIsOpen(false)\n }\n\n useEffect(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n\n if (!timer) {\n return\n }\n\n timeoutRef.current = setTimeout(() => {\n handleClose()\n return\n }, timer)\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [timer])\n\n const handleMouseOver = () => {\n setTimer(null)\n }\n const handleMouseLeave = () => {\n setTimer(400)\n }\n\n return (\n <Paper>\n <Tooltip title={labels.toggle.title} placement='right' {...TooltipProps}>\n <IconButton\n sx={styles.toggle}\n onClick={(e) => {\n setAnchorEl(e.currentTarget as HTMLButtonElement)\n setIsOpen(true)\n }}\n >\n <img\n src={optionSelected?.icon}\n alt={optionSelected?.label ?? 'Basemap'}\n />\n </IconButton>\n </Tooltip>\n\n <ResponsiveDrawer\n anchorEl={anchorEl}\n slotProps={{\n paper: {\n sx: {\n ...styles.root,\n transform: `translate3d(${position.endsWith('right') ? '-8px' : '8px'}, ${\n position.startsWith('bottom') ? '-4px' : '4px'\n }, 0) !important`,\n },\n onMouseOver: handleMouseOver,\n onMouseLeave: handleMouseLeave,\n },\n }}\n collapsed={!isOpen}\n position={position}\n isMobile={isMobile}\n onChangeCollapsed={() => handleClose()}\n >\n <Header\n isMobile={isMobile}\n labels={labels.header}\n onChangeCollapsed={() => handleClose()}\n />\n {Object.entries(groups).map(([group, values]) => (\n <GroupWrapper\n key={group}\n title={group + ' ' + labels.header.title}\n collapsed={groupCount < 2}\n >\n <Group\n values={values!}\n selected={selected}\n onChange={(e) => {\n handleClose()\n onChange(e)\n }}\n />\n </GroupWrapper>\n ))}\n </ResponsiveDrawer>\n </Paper>\n )\n}\n"],"mappings":"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"}