@oh-just-another/react-ui 0.61.0 → 0.63.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 (369) hide show
  1. package/CHANGELOG.md +132 -0
  2. package/README.md +3 -3
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/color/color-palette.d.ts.map +1 -0
  5. package/dist/color/color-palette.js.map +1 -0
  6. package/dist/color/color-swatch-picker.d.ts.map +1 -0
  7. package/dist/{color-swatch-picker.js → color/color-swatch-picker.js} +4 -3
  8. package/dist/color/color-swatch-picker.js.map +1 -0
  9. package/dist/{constants.d.ts → core/constants.d.ts} +66 -14
  10. package/dist/core/constants.d.ts.map +1 -0
  11. package/dist/{constants.js → core/constants.js} +99 -14
  12. package/dist/core/constants.js.map +1 -0
  13. package/dist/core/context.d.ts.map +1 -0
  14. package/dist/core/context.js.map +1 -0
  15. package/dist/core/hooks.d.ts.map +1 -0
  16. package/dist/core/hooks.js.map +1 -0
  17. package/dist/core/portal-container.d.ts.map +1 -0
  18. package/dist/core/portal-container.js.map +1 -0
  19. package/dist/core/use-fullscreen.d.ts +14 -0
  20. package/dist/core/use-fullscreen.d.ts.map +1 -0
  21. package/dist/core/use-fullscreen.js +38 -0
  22. package/dist/core/use-fullscreen.js.map +1 -0
  23. package/dist/core/use-quiet-gesture.d.ts +11 -0
  24. package/dist/core/use-quiet-gesture.d.ts.map +1 -0
  25. package/dist/core/use-quiet-gesture.js +61 -0
  26. package/dist/core/use-quiet-gesture.js.map +1 -0
  27. package/dist/core/use-quiet-viewport.d.ts +10 -0
  28. package/dist/core/use-quiet-viewport.d.ts.map +1 -0
  29. package/dist/core/use-quiet-viewport.js +40 -0
  30. package/dist/core/use-quiet-viewport.js.map +1 -0
  31. package/dist/index.d.ts +55 -50
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +55 -50
  34. package/dist/index.js.map +1 -1
  35. package/dist/layout/diagram-bars.d.ts.map +1 -0
  36. package/dist/layout/diagram-bars.js.map +1 -0
  37. package/dist/layout/diagram-canvas.d.ts.map +1 -0
  38. package/dist/layout/diagram-canvas.js.map +1 -0
  39. package/dist/layout/diagram-root.d.ts.map +1 -0
  40. package/dist/{diagram-root.js → layout/diagram-root.js} +2 -2
  41. package/dist/layout/diagram-root.js.map +1 -0
  42. package/dist/{sidebar.d.ts → layout/sidebar.d.ts} +1 -0
  43. package/dist/layout/sidebar.d.ts.map +1 -0
  44. package/dist/layout/sidebar.js +38 -0
  45. package/dist/layout/sidebar.js.map +1 -0
  46. package/dist/layout/ui-layer.d.ts.map +1 -0
  47. package/dist/layout/ui-layer.js.map +1 -0
  48. package/dist/menus/command-palette.d.ts.map +1 -0
  49. package/dist/{command-palette.js → menus/command-palette.js} +2 -2
  50. package/dist/menus/command-palette.js.map +1 -0
  51. package/dist/menus/context-menu-controller.d.ts.map +1 -0
  52. package/dist/menus/context-menu-controller.js.map +1 -0
  53. package/dist/{context-menu.d.ts → menus/context-menu.d.ts} +12 -0
  54. package/dist/menus/context-menu.d.ts.map +1 -0
  55. package/dist/menus/context-menu.js +617 -0
  56. package/dist/menus/context-menu.js.map +1 -0
  57. package/dist/menus/link-drop-shape-menu.d.ts.map +1 -0
  58. package/dist/{link-drop-shape-menu.js → menus/link-drop-shape-menu.js} +4 -4
  59. package/dist/menus/link-drop-shape-menu.js.map +1 -0
  60. package/dist/{main-menu.d.ts → menus/main-menu.d.ts} +45 -2
  61. package/dist/menus/main-menu.d.ts.map +1 -0
  62. package/dist/menus/main-menu.js +260 -0
  63. package/dist/menus/main-menu.js.map +1 -0
  64. package/dist/overlays/file-drop-overlay.d.ts +15 -0
  65. package/dist/overlays/file-drop-overlay.d.ts.map +1 -0
  66. package/dist/overlays/file-drop-overlay.js +27 -0
  67. package/dist/overlays/file-drop-overlay.js.map +1 -0
  68. package/dist/overlays/frame-name-editor-overlay.d.ts.map +1 -0
  69. package/dist/{frame-name-editor-overlay.js → overlays/frame-name-editor-overlay.js} +1 -1
  70. package/dist/overlays/frame-name-editor-overlay.js.map +1 -0
  71. package/dist/overlays/help-button.d.ts.map +1 -0
  72. package/dist/{help-button.js → overlays/help-button.js} +3 -4
  73. package/dist/overlays/help-button.js.map +1 -0
  74. package/dist/overlays/help-dialog.d.ts.map +1 -0
  75. package/dist/{help-dialog.js → overlays/help-dialog.js} +4 -24
  76. package/dist/overlays/help-dialog.js.map +1 -0
  77. package/dist/overlays/link-badges.d.ts +14 -0
  78. package/dist/overlays/link-badges.d.ts.map +1 -0
  79. package/dist/overlays/link-badges.js +60 -0
  80. package/dist/overlays/link-badges.js.map +1 -0
  81. package/dist/overlays/link-caption-editor.d.ts.map +1 -0
  82. package/dist/{link-caption-editor.js → overlays/link-caption-editor.js} +3 -3
  83. package/dist/overlays/link-caption-editor.js.map +1 -0
  84. package/dist/overlays/link-hover-popup.d.ts.map +1 -0
  85. package/dist/{link-hover-popup.js → overlays/link-hover-popup.js} +5 -4
  86. package/dist/overlays/link-hover-popup.js.map +1 -0
  87. package/dist/overlays/merge-dialog.d.ts.map +1 -0
  88. package/dist/overlays/merge-dialog.js +39 -0
  89. package/dist/overlays/merge-dialog.js.map +1 -0
  90. package/dist/overlays/search-overlay.d.ts.map +1 -0
  91. package/dist/{search-overlay.js → overlays/search-overlay.js} +2 -2
  92. package/dist/overlays/search-overlay.js.map +1 -0
  93. package/dist/overlays/sticky-reactions.d.ts +2 -0
  94. package/dist/overlays/sticky-reactions.d.ts.map +1 -0
  95. package/dist/overlays/sticky-reactions.js +94 -0
  96. package/dist/overlays/sticky-reactions.js.map +1 -0
  97. package/dist/overlays/text-editor-overlay.d.ts.map +1 -0
  98. package/dist/{text-editor-overlay.js → overlays/text-editor-overlay.js} +37 -5
  99. package/dist/overlays/text-editor-overlay.js.map +1 -0
  100. package/dist/{comments-panel.d.ts → panels/comments-panel.d.ts} +4 -1
  101. package/dist/panels/comments-panel.d.ts.map +1 -0
  102. package/dist/panels/comments-panel.js +51 -0
  103. package/dist/panels/comments-panel.js.map +1 -0
  104. package/dist/panels/control-sets.d.ts +42 -0
  105. package/dist/panels/control-sets.d.ts.map +1 -0
  106. package/dist/panels/control-sets.js +63 -0
  107. package/dist/panels/control-sets.js.map +1 -0
  108. package/dist/panels/diff-panel.d.ts.map +1 -0
  109. package/dist/panels/diff-panel.js.map +1 -0
  110. package/dist/panels/drawing-panel.d.ts.map +1 -0
  111. package/dist/{drawing-panel.js → panels/drawing-panel.js} +3 -3
  112. package/dist/panels/drawing-panel.js.map +1 -0
  113. package/dist/panels/edge-style-panel.d.ts.map +1 -0
  114. package/dist/{edge-style-panel.js → panels/edge-style-panel.js} +1 -1
  115. package/dist/panels/edge-style-panel.js.map +1 -0
  116. package/dist/panels/frame-panel.d.ts.map +1 -0
  117. package/dist/{frame-panel.js → panels/frame-panel.js} +1 -1
  118. package/dist/panels/frame-panel.js.map +1 -0
  119. package/dist/{layer-panel.d.ts → panels/layer-panel.d.ts} +5 -1
  120. package/dist/panels/layer-panel.d.ts.map +1 -0
  121. package/dist/panels/layer-panel.js +52 -0
  122. package/dist/panels/layer-panel.js.map +1 -0
  123. package/dist/panels/library-panel.d.ts.map +1 -0
  124. package/dist/{library-panel.js → panels/library-panel.js} +4 -5
  125. package/dist/panels/library-panel.js.map +1 -0
  126. package/dist/panels/property-panel.d.ts.map +1 -0
  127. package/dist/panels/property-panel.js +1492 -0
  128. package/dist/panels/property-panel.js.map +1 -0
  129. package/dist/panels/selection-floating-panel.d.ts.map +1 -0
  130. package/dist/{selection-floating-panel.js → panels/selection-floating-panel.js} +24 -13
  131. package/dist/panels/selection-floating-panel.js.map +1 -0
  132. package/dist/panels/stats-panel.d.ts.map +1 -0
  133. package/dist/{stats-panel.js → panels/stats-panel.js} +1 -1
  134. package/dist/panels/stats-panel.js.map +1 -0
  135. package/dist/primitives/bottom-sheet.d.ts.map +1 -0
  136. package/dist/{bottom-sheet.js → primitives/bottom-sheet.js} +9 -22
  137. package/dist/primitives/bottom-sheet.js.map +1 -0
  138. package/dist/primitives/button-group.d.ts.map +1 -0
  139. package/dist/primitives/button-group.js.map +1 -0
  140. package/dist/primitives/css-var.d.ts +8 -0
  141. package/dist/primitives/css-var.d.ts.map +1 -0
  142. package/dist/primitives/css-var.js +11 -0
  143. package/dist/primitives/css-var.js.map +1 -0
  144. package/dist/primitives/float-panel.d.ts +35 -0
  145. package/dist/primitives/float-panel.d.ts.map +1 -0
  146. package/dist/primitives/float-panel.js +42 -0
  147. package/dist/primitives/float-panel.js.map +1 -0
  148. package/dist/primitives/icon-button.d.ts.map +1 -0
  149. package/dist/primitives/icon-button.js.map +1 -0
  150. package/dist/primitives/markdown.d.ts.map +1 -0
  151. package/dist/primitives/markdown.js.map +1 -0
  152. package/dist/primitives/modal.d.ts.map +1 -0
  153. package/dist/{modal.js → primitives/modal.js} +11 -9
  154. package/dist/primitives/modal.js.map +1 -0
  155. package/dist/{popover.d.ts → primitives/popover.d.ts} +1 -1
  156. package/dist/primitives/popover.d.ts.map +1 -0
  157. package/dist/{popover.js → primitives/popover.js} +7 -18
  158. package/dist/primitives/popover.js.map +1 -0
  159. package/dist/primitives/segmented-control.d.ts.map +1 -0
  160. package/dist/primitives/segmented-control.js.map +1 -0
  161. package/dist/primitives/slider.d.ts.map +1 -0
  162. package/dist/primitives/slider.js.map +1 -0
  163. package/dist/primitives/switch.d.ts +24 -0
  164. package/dist/primitives/switch.d.ts.map +1 -0
  165. package/dist/primitives/switch.js +17 -0
  166. package/dist/primitives/switch.js.map +1 -0
  167. package/dist/primitives/toast.d.ts.map +1 -0
  168. package/dist/{toast.js → primitives/toast.js} +12 -33
  169. package/dist/primitives/toast.js.map +1 -0
  170. package/dist/primitives/tooltip.d.ts.map +1 -0
  171. package/dist/{tooltip.js → primitives/tooltip.js} +3 -3
  172. package/dist/primitives/tooltip.js.map +1 -0
  173. package/dist/{palette.d.ts → toolbar/palette.d.ts} +6 -1
  174. package/dist/toolbar/palette.d.ts.map +1 -0
  175. package/dist/{palette.js → toolbar/palette.js} +39 -5
  176. package/dist/toolbar/palette.js.map +1 -0
  177. package/dist/{toolbar.d.ts → toolbar/toolbar.d.ts} +9 -0
  178. package/dist/toolbar/toolbar.d.ts.map +1 -0
  179. package/dist/{toolbar.js → toolbar/toolbar.js} +132 -62
  180. package/dist/toolbar/toolbar.js.map +1 -0
  181. package/dist/utils/format-time.d.ts.map +1 -0
  182. package/dist/utils/format-time.js.map +1 -0
  183. package/dist/utils/use-dismiss-timer.d.ts.map +1 -0
  184. package/dist/utils/use-dismiss-timer.js.map +1 -0
  185. package/dist/widgets/minimap.d.ts.map +1 -0
  186. package/dist/{minimap.js → widgets/minimap.js} +50 -36
  187. package/dist/widgets/minimap.js.map +1 -0
  188. package/dist/widgets/reset-to-content-button.d.ts +11 -0
  189. package/dist/widgets/reset-to-content-button.d.ts.map +1 -0
  190. package/dist/{reset-to-content-button.js → widgets/reset-to-content-button.js} +8 -9
  191. package/dist/widgets/reset-to-content-button.js.map +1 -0
  192. package/dist/widgets/versioning.d.ts.map +1 -0
  193. package/dist/{versioning.js → widgets/versioning.js} +3 -3
  194. package/dist/widgets/versioning.js.map +1 -0
  195. package/dist/widgets/zen-mode.d.ts.map +1 -0
  196. package/dist/widgets/zen-mode.js.map +1 -0
  197. package/package.json +9 -9
  198. package/src/styles.css +1596 -258
  199. package/dist/bottom-sheet.d.ts.map +0 -1
  200. package/dist/bottom-sheet.js.map +0 -1
  201. package/dist/button-group.d.ts.map +0 -1
  202. package/dist/button-group.js.map +0 -1
  203. package/dist/color-palette.d.ts.map +0 -1
  204. package/dist/color-palette.js.map +0 -1
  205. package/dist/color-swatch-picker.d.ts.map +0 -1
  206. package/dist/color-swatch-picker.js.map +0 -1
  207. package/dist/command-palette.d.ts.map +0 -1
  208. package/dist/command-palette.js.map +0 -1
  209. package/dist/comments-panel.d.ts.map +0 -1
  210. package/dist/comments-panel.js +0 -142
  211. package/dist/comments-panel.js.map +0 -1
  212. package/dist/constants.d.ts.map +0 -1
  213. package/dist/constants.js.map +0 -1
  214. package/dist/context-menu-controller.d.ts.map +0 -1
  215. package/dist/context-menu-controller.js.map +0 -1
  216. package/dist/context-menu.d.ts.map +0 -1
  217. package/dist/context-menu.js +0 -368
  218. package/dist/context-menu.js.map +0 -1
  219. package/dist/context.d.ts.map +0 -1
  220. package/dist/context.js.map +0 -1
  221. package/dist/diagram-bars.d.ts.map +0 -1
  222. package/dist/diagram-bars.js.map +0 -1
  223. package/dist/diagram-canvas.d.ts.map +0 -1
  224. package/dist/diagram-canvas.js.map +0 -1
  225. package/dist/diagram-root.d.ts.map +0 -1
  226. package/dist/diagram-root.js.map +0 -1
  227. package/dist/diff-panel.d.ts.map +0 -1
  228. package/dist/diff-panel.js.map +0 -1
  229. package/dist/drawing-panel.d.ts.map +0 -1
  230. package/dist/drawing-panel.js.map +0 -1
  231. package/dist/edge-style-panel.d.ts.map +0 -1
  232. package/dist/edge-style-panel.js.map +0 -1
  233. package/dist/format-time.d.ts.map +0 -1
  234. package/dist/format-time.js.map +0 -1
  235. package/dist/frame-name-editor-overlay.d.ts.map +0 -1
  236. package/dist/frame-name-editor-overlay.js.map +0 -1
  237. package/dist/frame-panel.d.ts.map +0 -1
  238. package/dist/frame-panel.js.map +0 -1
  239. package/dist/help-button.d.ts.map +0 -1
  240. package/dist/help-button.js.map +0 -1
  241. package/dist/help-dialog.d.ts.map +0 -1
  242. package/dist/help-dialog.js.map +0 -1
  243. package/dist/hooks.d.ts.map +0 -1
  244. package/dist/hooks.js.map +0 -1
  245. package/dist/icon-button.d.ts.map +0 -1
  246. package/dist/icon-button.js.map +0 -1
  247. package/dist/layer-panel.d.ts.map +0 -1
  248. package/dist/layer-panel.js +0 -117
  249. package/dist/layer-panel.js.map +0 -1
  250. package/dist/library-panel.d.ts.map +0 -1
  251. package/dist/library-panel.js.map +0 -1
  252. package/dist/link-caption-editor.d.ts.map +0 -1
  253. package/dist/link-caption-editor.js.map +0 -1
  254. package/dist/link-drop-shape-menu.d.ts.map +0 -1
  255. package/dist/link-drop-shape-menu.js.map +0 -1
  256. package/dist/link-hover-popup.d.ts.map +0 -1
  257. package/dist/link-hover-popup.js.map +0 -1
  258. package/dist/main-menu.d.ts.map +0 -1
  259. package/dist/main-menu.js +0 -249
  260. package/dist/main-menu.js.map +0 -1
  261. package/dist/markdown.d.ts.map +0 -1
  262. package/dist/markdown.js.map +0 -1
  263. package/dist/merge-dialog.d.ts.map +0 -1
  264. package/dist/merge-dialog.js +0 -50
  265. package/dist/merge-dialog.js.map +0 -1
  266. package/dist/minimap.d.ts.map +0 -1
  267. package/dist/minimap.js.map +0 -1
  268. package/dist/modal.d.ts.map +0 -1
  269. package/dist/modal.js.map +0 -1
  270. package/dist/palette.d.ts.map +0 -1
  271. package/dist/palette.js.map +0 -1
  272. package/dist/popover.d.ts.map +0 -1
  273. package/dist/popover.js.map +0 -1
  274. package/dist/portal-container.d.ts.map +0 -1
  275. package/dist/portal-container.js.map +0 -1
  276. package/dist/property-panel.d.ts.map +0 -1
  277. package/dist/property-panel.js +0 -917
  278. package/dist/property-panel.js.map +0 -1
  279. package/dist/reset-to-content-button.d.ts +0 -10
  280. package/dist/reset-to-content-button.d.ts.map +0 -1
  281. package/dist/reset-to-content-button.js.map +0 -1
  282. package/dist/search-overlay.d.ts.map +0 -1
  283. package/dist/search-overlay.js.map +0 -1
  284. package/dist/segmented-control.d.ts.map +0 -1
  285. package/dist/segmented-control.js.map +0 -1
  286. package/dist/selection-floating-panel.d.ts.map +0 -1
  287. package/dist/selection-floating-panel.js.map +0 -1
  288. package/dist/sidebar.d.ts.map +0 -1
  289. package/dist/sidebar.js +0 -68
  290. package/dist/sidebar.js.map +0 -1
  291. package/dist/slider.d.ts.map +0 -1
  292. package/dist/slider.js.map +0 -1
  293. package/dist/stats-panel.d.ts.map +0 -1
  294. package/dist/stats-panel.js.map +0 -1
  295. package/dist/text-editor-overlay.d.ts.map +0 -1
  296. package/dist/text-editor-overlay.js.map +0 -1
  297. package/dist/toast.d.ts.map +0 -1
  298. package/dist/toast.js.map +0 -1
  299. package/dist/toolbar.d.ts.map +0 -1
  300. package/dist/toolbar.js.map +0 -1
  301. package/dist/tooltip.d.ts.map +0 -1
  302. package/dist/tooltip.js.map +0 -1
  303. package/dist/ui-layer.d.ts.map +0 -1
  304. package/dist/ui-layer.js.map +0 -1
  305. package/dist/use-dismiss-timer.d.ts.map +0 -1
  306. package/dist/use-dismiss-timer.js.map +0 -1
  307. package/dist/versioning.d.ts.map +0 -1
  308. package/dist/versioning.js.map +0 -1
  309. package/dist/zen-mode.d.ts.map +0 -1
  310. package/dist/zen-mode.js.map +0 -1
  311. /package/dist/{color-palette.d.ts → color/color-palette.d.ts} +0 -0
  312. /package/dist/{color-palette.js → color/color-palette.js} +0 -0
  313. /package/dist/{color-swatch-picker.d.ts → color/color-swatch-picker.d.ts} +0 -0
  314. /package/dist/{context.d.ts → core/context.d.ts} +0 -0
  315. /package/dist/{context.js → core/context.js} +0 -0
  316. /package/dist/{hooks.d.ts → core/hooks.d.ts} +0 -0
  317. /package/dist/{hooks.js → core/hooks.js} +0 -0
  318. /package/dist/{portal-container.d.ts → core/portal-container.d.ts} +0 -0
  319. /package/dist/{portal-container.js → core/portal-container.js} +0 -0
  320. /package/dist/{diagram-bars.d.ts → layout/diagram-bars.d.ts} +0 -0
  321. /package/dist/{diagram-bars.js → layout/diagram-bars.js} +0 -0
  322. /package/dist/{diagram-canvas.d.ts → layout/diagram-canvas.d.ts} +0 -0
  323. /package/dist/{diagram-canvas.js → layout/diagram-canvas.js} +0 -0
  324. /package/dist/{diagram-root.d.ts → layout/diagram-root.d.ts} +0 -0
  325. /package/dist/{ui-layer.d.ts → layout/ui-layer.d.ts} +0 -0
  326. /package/dist/{ui-layer.js → layout/ui-layer.js} +0 -0
  327. /package/dist/{command-palette.d.ts → menus/command-palette.d.ts} +0 -0
  328. /package/dist/{context-menu-controller.d.ts → menus/context-menu-controller.d.ts} +0 -0
  329. /package/dist/{context-menu-controller.js → menus/context-menu-controller.js} +0 -0
  330. /package/dist/{link-drop-shape-menu.d.ts → menus/link-drop-shape-menu.d.ts} +0 -0
  331. /package/dist/{frame-name-editor-overlay.d.ts → overlays/frame-name-editor-overlay.d.ts} +0 -0
  332. /package/dist/{help-button.d.ts → overlays/help-button.d.ts} +0 -0
  333. /package/dist/{help-dialog.d.ts → overlays/help-dialog.d.ts} +0 -0
  334. /package/dist/{link-caption-editor.d.ts → overlays/link-caption-editor.d.ts} +0 -0
  335. /package/dist/{link-hover-popup.d.ts → overlays/link-hover-popup.d.ts} +0 -0
  336. /package/dist/{merge-dialog.d.ts → overlays/merge-dialog.d.ts} +0 -0
  337. /package/dist/{search-overlay.d.ts → overlays/search-overlay.d.ts} +0 -0
  338. /package/dist/{text-editor-overlay.d.ts → overlays/text-editor-overlay.d.ts} +0 -0
  339. /package/dist/{diff-panel.d.ts → panels/diff-panel.d.ts} +0 -0
  340. /package/dist/{diff-panel.js → panels/diff-panel.js} +0 -0
  341. /package/dist/{drawing-panel.d.ts → panels/drawing-panel.d.ts} +0 -0
  342. /package/dist/{edge-style-panel.d.ts → panels/edge-style-panel.d.ts} +0 -0
  343. /package/dist/{frame-panel.d.ts → panels/frame-panel.d.ts} +0 -0
  344. /package/dist/{library-panel.d.ts → panels/library-panel.d.ts} +0 -0
  345. /package/dist/{property-panel.d.ts → panels/property-panel.d.ts} +0 -0
  346. /package/dist/{selection-floating-panel.d.ts → panels/selection-floating-panel.d.ts} +0 -0
  347. /package/dist/{stats-panel.d.ts → panels/stats-panel.d.ts} +0 -0
  348. /package/dist/{bottom-sheet.d.ts → primitives/bottom-sheet.d.ts} +0 -0
  349. /package/dist/{button-group.d.ts → primitives/button-group.d.ts} +0 -0
  350. /package/dist/{button-group.js → primitives/button-group.js} +0 -0
  351. /package/dist/{icon-button.d.ts → primitives/icon-button.d.ts} +0 -0
  352. /package/dist/{icon-button.js → primitives/icon-button.js} +0 -0
  353. /package/dist/{markdown.d.ts → primitives/markdown.d.ts} +0 -0
  354. /package/dist/{markdown.js → primitives/markdown.js} +0 -0
  355. /package/dist/{modal.d.ts → primitives/modal.d.ts} +0 -0
  356. /package/dist/{segmented-control.d.ts → primitives/segmented-control.d.ts} +0 -0
  357. /package/dist/{segmented-control.js → primitives/segmented-control.js} +0 -0
  358. /package/dist/{slider.d.ts → primitives/slider.d.ts} +0 -0
  359. /package/dist/{slider.js → primitives/slider.js} +0 -0
  360. /package/dist/{toast.d.ts → primitives/toast.d.ts} +0 -0
  361. /package/dist/{tooltip.d.ts → primitives/tooltip.d.ts} +0 -0
  362. /package/dist/{format-time.d.ts → utils/format-time.d.ts} +0 -0
  363. /package/dist/{format-time.js → utils/format-time.js} +0 -0
  364. /package/dist/{use-dismiss-timer.d.ts → utils/use-dismiss-timer.d.ts} +0 -0
  365. /package/dist/{use-dismiss-timer.js → utils/use-dismiss-timer.js} +0 -0
  366. /package/dist/{minimap.d.ts → widgets/minimap.d.ts} +0 -0
  367. /package/dist/{versioning.d.ts → widgets/versioning.d.ts} +0 -0
  368. /package/dist/{zen-mode.d.ts → widgets/zen-mode.d.ts} +0 -0
  369. /package/dist/{zen-mode.js → widgets/zen-mode.js} +0 -0
@@ -2,8 +2,8 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
2
2
  import { useEffect, useReducer } from "react";
3
3
  import { createPortal } from "react-dom";
4
4
  import { defaultRegistry } from "@oh-just-another/templates";
5
- import { useDiagramOptional } from "./hooks.js";
6
- import { usePortalContainer } from "./portal-container.js";
5
+ import { useDiagramOptional } from "../core/hooks.js";
6
+ import { usePortalContainer } from "../core/portal-container.js";
7
7
  /**
8
8
  * Shape picker shown after a link is dropped on empty canvas. The
9
9
  * dropped link keeps a free end; picking a shape here creates it at the
@@ -48,14 +48,14 @@ export const LinkDropShapeMenu = () => {
48
48
  const sx = (menu.world.x - v.pan.x) * v.zoom + hostRect.left;
49
49
  const sy = (menu.world.y - v.pan.y) * v.zoom + hostRect.top;
50
50
  const templates = defaultRegistry.byCategory("basic");
51
- return createPortal(_jsxs(_Fragment, { children: [_jsx("div", { className: "du-link-drop-backdrop", style: { position: "fixed", inset: 0, zIndex: 1600 }, onPointerDown: () => {
51
+ return createPortal(_jsxs(_Fragment, { children: [_jsx("div", { className: "du-link-drop-backdrop", style: { position: "fixed", inset: 0, zIndex: "var(--du-z-popover)" }, onPointerDown: () => {
52
52
  editor.dismissLinkDropMenu();
53
53
  } }), _jsx("div", { className: "du-link-drop-menu", role: "menu", "aria-label": "Create shape", style: {
54
54
  position: "fixed",
55
55
  left: sx,
56
56
  top: sy,
57
57
  transform: "translate(-50%, -100%)",
58
- zIndex: 1601,
58
+ zIndex: "calc(var(--du-z-popover) + 1)",
59
59
  }, onPointerDown: (e) => {
60
60
  e.stopPropagation();
61
61
  }, children: templates.map((t) => (_jsx("button", { type: "button", className: "du-link-drop-item", title: t.name, "aria-label": `Create ${t.name}`, onClick: () => {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-drop-shape-menu.js","sourceRoot":"","sources":["../../src/menus/link-drop-shape-menu.tsx"],"names":[],"mappings":"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"}
@@ -5,10 +5,21 @@ export interface MainMenuProps {
5
5
  readonly trigger?: ReactNode;
6
6
  readonly className?: string;
7
7
  readonly style?: CSSProperties;
8
+ /** Accessible name + tooltip of the trigger button. Default `"Main menu"`. */
9
+ readonly ariaLabel?: string;
10
+ /** Class / style for the trigger button (default: flat icon button). */
11
+ readonly triggerClassName?: string;
12
+ readonly triggerStyle?: CSSProperties;
13
+ /**
14
+ * Where the panel opens relative to the trigger. `"bottom-start"`
15
+ * (default) hangs below, left-aligned; `"top-end"` rises above,
16
+ * right-aligned — for menus in a bottom bar.
17
+ */
18
+ readonly placement?: "bottom-start" | "top-end";
8
19
  }
9
20
  export declare const MainMenu: {
10
- ({ children, trigger, className, style, }: MainMenuProps): import("react/jsx-runtime").JSX.Element;
11
- Item: ({ children, onClick, shortcut, disabled, active, icon }: MainMenuItemProps) => import("react/jsx-runtime").JSX.Element;
21
+ ({ children, trigger, className, style, ariaLabel, triggerClassName, triggerStyle, placement, }: MainMenuProps): import("react/jsx-runtime").JSX.Element;
22
+ Item: ({ children, onClick, shortcut, disabled, active, icon, trailing, checked, keepOpen, }: MainMenuItemProps) => import("react/jsx-runtime").JSX.Element;
12
23
  ItemLink: ({ children, href, external }: MainMenuItemLinkProps) => import("react/jsx-runtime").JSX.Element;
13
24
  Separator: () => import("react/jsx-runtime").JSX.Element;
14
25
  Group: ({ title, children }: {
@@ -35,6 +46,20 @@ export interface MainMenuItemProps {
35
46
  * aligned across mixed icon / no-icon items.
36
47
  */
37
48
  readonly icon?: ReactNode;
49
+ /** Trailing content on the right (non-interactive); rendered instead of `shortcut`. */
50
+ readonly trailing?: ReactNode;
51
+ /**
52
+ * On/off setting row: renders as `menuitemcheckbox` with a trailing
53
+ * switch that mirrors `checked`. The row itself is the control —
54
+ * `onClick` toggles the value — so the switch is decorative (nested
55
+ * buttons are invalid HTML). Implies `keepOpen`.
56
+ */
57
+ readonly checked?: boolean;
58
+ /**
59
+ * Keep the menu open after a click — for checkbox-style items (export
60
+ * content switches, etc.) where the user toggles several in a row.
61
+ */
62
+ readonly keepOpen?: boolean;
38
63
  }
39
64
  export interface MainMenuItemLinkProps {
40
65
  readonly children: ReactNode;
@@ -56,6 +81,24 @@ interface MainMenuToggleProps<T extends string> {
56
81
  icon?: ReactNode;
57
82
  }[];
58
83
  }
84
+ /**
85
+ * Nested submenu — opens a child panel to the right of the parent item
86
+ * on hover (with a small close-delay so a mouse moving diagonally toward
87
+ * the child doesn't accidentally collapse the panel). Also opens on
88
+ * click for touch / keyboard activation.
89
+ *
90
+ * Children are typically `MainMenu.Item`s. The submenu inherits the
91
+ * parent menu's `close()` context, so child item clicks collapse the
92
+ * whole menu chain.
93
+ *
94
+ * <MainMenu.Submenu icon={<Download/>} label="Export…">
95
+ * <MainMenu.Item onClick={exportPng}>PNG</MainMenu.Item>
96
+ * <MainMenu.Item onClick={exportSvg}>SVG</MainMenu.Item>
97
+ * </MainMenu.Submenu>
98
+ *
99
+ * Positioning is fixed to "right of trigger, top-aligned with the
100
+ * trigger row".
101
+ */
59
102
  export interface MainMenuSubmenuProps {
60
103
  readonly children: ReactNode;
61
104
  /** Trigger row label. Same render style as `MainMenu.Item`. */
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-menu.d.ts","sourceRoot":"","sources":["../../src/menus/main-menu.tsx"],"names":[],"mappings":"AAAA,OAAO,EAUL,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AA0Hf,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,wEAAwE;IACxE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC;IACtC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;CACjD;AAED,eAAO,MAAM,QAAQ;qGASlB,aAAa;kGAoKb,iBAAiB;6CAqC4B,qBAAqB;;iCAsBjC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,SAAS,CAAA;KAAE;aAmB1D,CAAC,SAAS,MAAM,gCAAgC,mBAAmB,CAAC,CAAC,CAAC;mDAiFhC,oBAAoB;CAnNzE,CAAC;AASF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B,uFAAuF;IACvF,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AA2CD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AA+BD;;;;;GAKG;AACH,UAAU,mBAAmB,CAAC,CAAC,SAAS,MAAM;IAC5C,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,SAAS,CAAA;KAAE,EAAE,CAAC;CAC5E;AAuDD;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,oEAAoE;IACpE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B"}
@@ -0,0 +1,260 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { createContext, useCallback, useContext, useEffect, useId, useLayoutEffect, useMemo, useRef, useState, } from "react";
3
+ import { createPortal } from "react-dom";
4
+ import { Check, ChevronRight, Menu as MenuIcon } from "lucide-react";
5
+ import { Switch } from "../primitives/switch.js";
6
+ import { floatPanel } from "../primitives/float-panel.js";
7
+ import { cssPx } from "../primitives/css-var.js";
8
+ import { usePortalContainer } from "../core/portal-container.js";
9
+ import { MARK_ICON, MENU_VIEWPORT_PADDING_PX } from "../core/constants.js";
10
+ /** Pixel size for the trigger icon — matches the toolbar tool buttons. */
11
+ const TRIGGER_ICON_SIZE = 16;
12
+ const TRIGGER_ICON_STROKE = 1.75;
13
+ const Ctx = createContext(null);
14
+ /**
15
+ * Every open panel of one menu (root + nested), portaled to the portal
16
+ * container so they stack above the UI layer (`--du-z-popover`) — the
17
+ * click-outside handler treats a press inside any of them as "inside".
18
+ */
19
+ const PanelsCtx = createContext(null);
20
+ const LevelCtx = createContext(null);
21
+ const SUBMENU_CLOSE_DELAY_MS = 120;
22
+ const MenuLevel = ({ children }) => {
23
+ const [openId, setOpenId] = useState(null);
24
+ const timer = useRef(null);
25
+ const cancelClose = useCallback(() => {
26
+ if (timer.current !== null) {
27
+ window.clearTimeout(timer.current);
28
+ timer.current = null;
29
+ }
30
+ }, []);
31
+ const closeSoon = useCallback(() => {
32
+ cancelClose();
33
+ timer.current = window.setTimeout(() => {
34
+ setOpenId(null);
35
+ timer.current = null;
36
+ }, SUBMENU_CLOSE_DELAY_MS);
37
+ }, [cancelClose]);
38
+ const scheduleClose = useCallback((id) => {
39
+ cancelClose();
40
+ timer.current = window.setTimeout(() => {
41
+ setOpenId((cur) => (cur === id ? null : cur));
42
+ timer.current = null;
43
+ }, SUBMENU_CLOSE_DELAY_MS);
44
+ }, [cancelClose]);
45
+ const open = useCallback((id) => {
46
+ cancelClose();
47
+ setOpenId(id);
48
+ }, [cancelClose]);
49
+ const toggle = useCallback((id) => {
50
+ cancelClose();
51
+ setOpenId((cur) => (cur === id ? null : id));
52
+ }, [cancelClose]);
53
+ useEffect(() => cancelClose, [cancelClose]);
54
+ const value = useMemo(() => ({ openId, open, toggle, scheduleClose, closeSoon, cancelClose }), [openId, open, toggle, scheduleClose, closeSoon, cancelClose]);
55
+ return _jsx(LevelCtx.Provider, { value: value, children: children });
56
+ };
57
+ const useMenuCtx = () => {
58
+ const ctx = useContext(Ctx);
59
+ return (ctx ?? {
60
+ close: () => {
61
+ /* no-op: fallback when used outside a MainMenu provider */
62
+ },
63
+ });
64
+ };
65
+ export const MainMenu = ({ children, trigger = _jsx(MenuIcon, { size: TRIGGER_ICON_SIZE, strokeWidth: TRIGGER_ICON_STROKE }), className, style, ariaLabel = "Main menu", triggerClassName, triggerStyle, placement = "bottom-start", }) => {
66
+ const [open, setOpen] = useState(false);
67
+ const ref = useRef(null);
68
+ const triggerRef = useRef(null);
69
+ const panelRef = useRef(null);
70
+ const panels = useRef(new Set()).current;
71
+ const portalContainer = usePortalContainer();
72
+ const menuId = useId();
73
+ // Float the panel off the trigger: clear the bar group's inset + border,
74
+ // then keep `--du-flyout-gap` between the bar and the panel; flip / shift
75
+ // inside the viewport like the context menu.
76
+ useLayoutEffect(() => {
77
+ const trigger = triggerRef.current;
78
+ const panel = panelRef.current;
79
+ if (!open || !trigger || !panel)
80
+ return undefined;
81
+ panels.add(panel);
82
+ const gap = cssPx(panel, "--du-pad-sm") + 1 + cssPx(panel, "--du-flyout-gap");
83
+ const stop = floatPanel(trigger, panel, {
84
+ placement,
85
+ gap,
86
+ padding: MENU_VIEWPORT_PADDING_PX,
87
+ strategy: "fixed",
88
+ clampHeight: true,
89
+ });
90
+ return () => {
91
+ stop();
92
+ panels.delete(panel);
93
+ };
94
+ }, [open, placement, panels]);
95
+ useEffect(() => {
96
+ if (!open)
97
+ return undefined;
98
+ const onDown = (ev) => {
99
+ const t = ev.target;
100
+ if (ref.current?.contains(t))
101
+ return;
102
+ for (const panel of panels)
103
+ if (panel.contains(t))
104
+ return;
105
+ setOpen(false);
106
+ };
107
+ const onKey = (ev) => {
108
+ if (ev.key === "Escape")
109
+ setOpen(false);
110
+ };
111
+ // Listen on both `mousedown` and `pointerdown`. The canvas surface
112
+ // captures pointer events; `mousedown` still fires on the document,
113
+ // but for some touch / pen interactions only `pointerdown` does.
114
+ // Subscribing to both closes the menu reliably for every input type.
115
+ window.addEventListener("mousedown", onDown);
116
+ window.addEventListener("pointerdown", onDown);
117
+ window.addEventListener("keydown", onKey);
118
+ return () => {
119
+ window.removeEventListener("mousedown", onDown);
120
+ window.removeEventListener("pointerdown", onDown);
121
+ window.removeEventListener("keydown", onKey);
122
+ };
123
+ }, [open, panels]);
124
+ const close = useCallback(() => {
125
+ setOpen(false);
126
+ }, []);
127
+ const containerStyle = {
128
+ position: "relative",
129
+ display: "inline-flex",
130
+ ...style,
131
+ };
132
+ const panelStyle = {
133
+ position: "fixed",
134
+ top: 0,
135
+ left: 0,
136
+ zIndex: "var(--du-z-popover)",
137
+ };
138
+ return (_jsxs("div", { ref: ref, className: className, style: containerStyle, children: [_jsx("button", { ref: triggerRef, type: "button", className: `${triggerClassName ?? "du-icon-button du-icon-button-flat"}${open ? " is-active" : ""}`, style: triggerStyle, "aria-haspopup": "menu", "aria-expanded": open, "aria-controls": menuId, "aria-label": ariaLabel, title: ariaLabel, onClick: () => {
139
+ setOpen((p) => !p);
140
+ }, children: trigger }), open
141
+ ? createPortal(_jsx("div", { ref: panelRef, id: menuId, role: "menu", "aria-label": ariaLabel, className: "du-menu-panel", style: panelStyle, children: _jsx(Ctx.Provider, { value: { close }, children: _jsx(PanelsCtx.Provider, { value: panels, children: _jsx(MenuLevel, { children: children }) }) }) }), portalContainer)
142
+ : null] }));
143
+ };
144
+ /** Gutter content: check mark when active, else the icon (or nothing). */
145
+ const Gutter = ({ active, icon }) => (_jsx("span", { "aria-hidden": true, className: `du-menu-gutter${active ? " is-accent" : ""}`, children: active ? _jsx(Check, { ...MARK_ICON }) : (icon ?? "") }));
146
+ const Item = ({ children, onClick, shortcut, disabled, active, icon, trailing, checked, keepOpen, }) => {
147
+ const { close } = useMenuCtx();
148
+ const level = useContext(LevelCtx);
149
+ const isCheckbox = checked !== undefined;
150
+ return (_jsxs("button", { type: "button", role: isCheckbox ? "menuitemcheckbox" : "menuitem", "aria-checked": isCheckbox ? checked : undefined, disabled: disabled, onClick: () => {
151
+ if (disabled)
152
+ return;
153
+ onClick?.();
154
+ if (!keepOpen && !isCheckbox)
155
+ close();
156
+ }, onMouseEnter: () => level?.closeSoon(), className: "du-menu-row", children: [_jsxs("span", { className: "du-menu-row-main", children: [_jsx(Gutter, { active: active === true, icon: icon }), children] }), isCheckbox ? (_jsx(Switch, { checked: checked, presentational: true })) : ((trailing ?? (shortcut ? _jsx("span", { className: "du-menu-shortcut", children: shortcut }) : null)))] }));
157
+ };
158
+ const ItemLink = ({ children, href, external }) => {
159
+ const { close } = useMenuCtx();
160
+ return (_jsx("a", { role: "menuitem", href: href, target: external ? "_blank" : undefined, rel: external ? "noreferrer noopener" : undefined, onClick: close, className: "du-menu-row", style: { textDecoration: "none" }, children: _jsxs("span", { className: "du-menu-row-main", children: [_jsx(Gutter, {}), children] }) }));
161
+ };
162
+ const Separator = () => _jsx("hr", { className: "du-menu-sep" });
163
+ const Group = ({ title, children }) => (_jsxs("div", { children: [_jsx("div", { className: "du-menu-group-title", children: title }), children] }));
164
+ const Toggle = ({ value, onChange, options }) => {
165
+ return (_jsx("div", { role: "radiogroup", style: {
166
+ display: "flex",
167
+ margin: "var(--du-menu-sep) var(--du-menu-row-pad-x)",
168
+ background: "var(--menu-divider, #2a2a2a)",
169
+ borderRadius: 6,
170
+ padding: 2,
171
+ gap: 2,
172
+ }, children: options.map((opt) => {
173
+ const active = opt.value === value;
174
+ return (_jsx("button", { type: "button", role: "radio", "aria-checked": active, title: opt.label, "aria-label": opt.label, onClick: () => {
175
+ onChange(opt.value);
176
+ }, style: {
177
+ flex: 1,
178
+ display: "inline-flex",
179
+ alignItems: "center",
180
+ justifyContent: "center",
181
+ gap: 4,
182
+ minHeight: 26,
183
+ padding: "0 8px",
184
+ background: active ? "var(--menu-bg, #1a1a1a)" : "transparent",
185
+ color: active ? "var(--text, #ddd)" : "var(--muted, #888)",
186
+ border: "none",
187
+ borderRadius: 4,
188
+ cursor: "pointer",
189
+ fontSize: 12,
190
+ fontWeight: active ? 600 : 400,
191
+ boxShadow: active ? "0 1px 2px rgba(0, 0, 0, 0.15)" : "none",
192
+ transition: "background 0.12s ease, color 0.12s ease",
193
+ }, children: opt.icon ?? opt.label }, opt.value));
194
+ }) }));
195
+ };
196
+ const Submenu = ({ children, label, icon, disabled }) => {
197
+ const id = useId();
198
+ const level = useContext(LevelCtx);
199
+ const panels = useContext(PanelsCtx);
200
+ const portalContainer = usePortalContainer();
201
+ const open = level?.openId === id;
202
+ const rowRef = useRef(null);
203
+ const panelRef = useRef(null);
204
+ // Beside the row (left when the right side has no room), first child row
205
+ // aligned with this row: the cross-axis shift undoes the panel padding +
206
+ // border, the main-axis gap clears the parent column and adds
207
+ // `--du-submenu-gap`. Portaled like the root panel so it stacks above
208
+ // the UI layer and is never clipped by a scrolling parent.
209
+ useLayoutEffect(() => {
210
+ const row = rowRef.current;
211
+ const panel = panelRef.current;
212
+ if (!open || !row || !panel)
213
+ return undefined;
214
+ panels?.add(panel);
215
+ const align = cssPx(panel, "--du-menu-pad") + 1;
216
+ const stop = floatPanel(row, panel, {
217
+ placement: "right-start",
218
+ fallbackPlacements: ["left-start"],
219
+ gap: align + cssPx(panel, "--du-submenu-gap"),
220
+ crossAxis: -align,
221
+ padding: MENU_VIEWPORT_PADDING_PX,
222
+ strategy: "fixed",
223
+ clampHeight: true,
224
+ });
225
+ return () => {
226
+ stop();
227
+ panels?.delete(panel);
228
+ };
229
+ }, [open, panels]);
230
+ const panelStyle = {
231
+ position: "fixed",
232
+ top: 0,
233
+ left: 0,
234
+ zIndex: "calc(var(--du-z-popover) + 1)",
235
+ };
236
+ return (_jsxs(_Fragment, { children: [_jsxs("button", { ref: rowRef, type: "button", role: "menuitem", disabled: disabled, "aria-haspopup": "menu", "aria-expanded": open, onMouseEnter: () => {
237
+ if (disabled)
238
+ return;
239
+ level?.open(id);
240
+ }, onMouseLeave: () => {
241
+ level?.scheduleClose(id);
242
+ }, onClick: () => {
243
+ if (disabled)
244
+ return;
245
+ level?.toggle(id);
246
+ }, className: `du-menu-row${open ? " is-open" : ""}`, children: [_jsxs("span", { className: "du-menu-row-main", children: [_jsx(Gutter, { icon: icon }), label] }), _jsx("span", { className: "du-menu-shortcut", children: _jsx(ChevronRight, { ...MARK_ICON, "aria-hidden": true }) })] }), open
247
+ ? createPortal(_jsx("div", { ref: panelRef, role: "menu", className: "du-menu-panel du-menu-submenu", style: panelStyle, onMouseEnter: () => {
248
+ level.cancelClose();
249
+ }, onMouseLeave: () => {
250
+ level.scheduleClose(id);
251
+ }, children: _jsx(MenuLevel, { children: children }) }), portalContainer)
252
+ : null] }));
253
+ };
254
+ MainMenu.Item = Item;
255
+ MainMenu.ItemLink = ItemLink;
256
+ MainMenu.Separator = Separator;
257
+ MainMenu.Group = Group;
258
+ MainMenu.Toggle = Toggle;
259
+ MainMenu.Submenu = Submenu;
260
+ //# sourceMappingURL=main-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-menu.js","sourceRoot":"","sources":["../../src/menus/main-menu.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface FileDropOverlayProps {
2
+ /** Show while an OS file drag hovers the canvas. */
3
+ readonly active: boolean;
4
+ /** Big label under the drop glyph. Default `"DROP"`. */
5
+ readonly label?: string;
6
+ }
7
+ /**
8
+ * Full-canvas hint shown while a file is dragged over the editor: a dashed
9
+ * frame and ONE card — a drop glyph with "DROP" on top, then a row per
10
+ * labelled file-drop handler (`editor.getFileDropHandlers()`) listing what
11
+ * the canvas accepts — images, video, whatever the host registered. Pointer-events
12
+ * none, so the drop still lands on the canvas handlers beneath.
13
+ */
14
+ export declare const FileDropOverlay: ({ active, label }: FileDropOverlayProps) => import("react/jsx-runtime").JSX.Element | null;
15
+ //# sourceMappingURL=file-drop-overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-drop-overlay.d.ts","sourceRoot":"","sources":["../../src/overlays/file-drop-overlay.tsx"],"names":[],"mappings":"AAuBA,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,wDAAwD;IACxD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,mBAA4B,oBAAoB,mDAkC/E,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Braces, Download, File, FileText, Image as ImageIcon, LayoutDashboard, Film, } from "lucide-react";
3
+ import { useDiagramOptional } from "../core/hooks.js";
4
+ import { CONTROL_ICON, DROP_OVERLAY_ICON_SIZE, ICON_STROKE } from "../core/constants.js";
5
+ const KIND_ICON = {
6
+ image: _jsx(ImageIcon, { ...CONTROL_ICON, "aria-hidden": true }),
7
+ video: _jsx(Film, { ...CONTROL_ICON, "aria-hidden": true }),
8
+ scene: _jsx(LayoutDashboard, { ...CONTROL_ICON, "aria-hidden": true }),
9
+ text: _jsx(FileText, { ...CONTROL_ICON, "aria-hidden": true }),
10
+ data: _jsx(Braces, { ...CONTROL_ICON, "aria-hidden": true }),
11
+ file: _jsx(File, { ...CONTROL_ICON, "aria-hidden": true }),
12
+ };
13
+ /**
14
+ * Full-canvas hint shown while a file is dragged over the editor: a dashed
15
+ * frame and ONE card — a drop glyph with "DROP" on top, then a row per
16
+ * labelled file-drop handler (`editor.getFileDropHandlers()`) listing what
17
+ * the canvas accepts — images, video, whatever the host registered. Pointer-events
18
+ * none, so the drop still lands on the canvas handlers beneath.
19
+ */
20
+ export const FileDropOverlay = ({ active, label = "DROP" }) => {
21
+ const editor = useDiagramOptional();
22
+ if (!active)
23
+ return null;
24
+ const handlers = (editor?.getFileDropHandlers() ?? []).filter((h) => h.label !== undefined);
25
+ return (_jsx("div", { className: "du-drop-overlay", role: "status", "aria-live": "polite", "aria-label": `${label}: drop a file`, children: _jsx("div", { className: "du-drop-overlay-frame", children: _jsxs("div", { className: "du-drop-overlay-card", children: [_jsxs("div", { className: "du-drop-overlay-center", children: [_jsx(Download, { size: DROP_OVERLAY_ICON_SIZE, strokeWidth: ICON_STROKE, "aria-hidden": true }), _jsx("span", { className: "du-drop-overlay-label", children: label })] }), handlers.length > 0 ? (_jsx("ul", { className: "du-drop-overlay-types", "aria-label": "Accepted files", children: handlers.map((h) => (_jsxs("li", { className: "du-drop-type", children: [KIND_ICON[h.kind ?? "file"], _jsx("span", { className: "du-drop-type-label", children: h.label }), h.formats && h.formats.length > 0 ? (_jsx("span", { className: "du-drop-type-formats", children: h.formats.join(" · ") })) : null] }, h.id))) })) : null] }) }) }));
26
+ };
27
+ //# sourceMappingURL=file-drop-overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-drop-overlay.js","sourceRoot":"","sources":["../../src/overlays/file-drop-overlay.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,MAAM,EACN,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,KAAK,IAAI,SAAS,EAClB,eAAe,EACf,IAAI,GACL,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEzF,MAAM,SAAS,GAAoC;IACjD,KAAK,EAAE,KAAC,SAAS,OAAK,YAAY,wBAAgB;IAClD,KAAK,EAAE,KAAC,IAAI,OAAK,YAAY,wBAAgB;IAC7C,KAAK,EAAE,KAAC,eAAe,OAAK,YAAY,wBAAgB;IACxD,IAAI,EAAE,KAAC,QAAQ,OAAK,YAAY,wBAAgB;IAChD,IAAI,EAAE,KAAC,MAAM,OAAK,YAAY,wBAAgB;IAC9C,IAAI,EAAE,KAAC,IAAI,OAAK,YAAY,wBAAgB;CAC7C,CAAC;AASF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM,EAAwB,EAAE,EAAE;IAClF,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACpC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAC5F,OAAO,CACL,cACE,SAAS,EAAC,iBAAiB,EAC3B,IAAI,EAAC,QAAQ,eACH,QAAQ,gBACN,GAAG,KAAK,eAAe,YAEnC,cAAK,SAAS,EAAC,uBAAuB,YACpC,eAAK,SAAS,EAAC,sBAAsB,aACnC,eAAK,SAAS,EAAC,wBAAwB,aACrC,KAAC,QAAQ,IAAC,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,WAAW,wBAAgB,EAChF,eAAM,SAAS,EAAC,uBAAuB,YAAE,KAAK,GAAQ,IAClD,EACL,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACrB,aAAI,SAAS,EAAC,uBAAuB,gBAAY,gBAAgB,YAC9D,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACnB,cAAe,SAAS,EAAC,cAAc,aACpC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,EAC5B,eAAM,SAAS,EAAC,oBAAoB,YAAE,CAAC,CAAC,KAAK,GAAQ,EACpD,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACnC,eAAM,SAAS,EAAC,sBAAsB,YAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAQ,CACtE,CAAC,CAAC,CAAC,IAAI,KALD,CAAC,CAAC,EAAE,CAMR,CACN,CAAC,GACC,CACN,CAAC,CAAC,CAAC,IAAI,IACJ,GACF,GACF,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-name-editor-overlay.d.ts","sourceRoot":"","sources":["../../src/overlays/frame-name-editor-overlay.tsx"],"names":[],"mappings":"AAUA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,sDAqFlC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useEffect, useReducer, useRef } from "react";
3
3
  import { getElement, isFrame, FRAME_HEADER_HEIGHT, FRAME_HEADER_PADDING_X, FRAME_HEADER_FONT_SIZE, } from "@oh-just-another/scene";
4
- import { useDiagramOptional } from "./hooks.js";
4
+ import { useDiagramOptional } from "../core/hooks.js";
5
5
  /**
6
6
  * Inline editor for a frame's header name. Unlike the in-canvas text
7
7
  * editor (invisible sink + canvas-drawn caret), the frame label has no
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-name-editor-overlay.js","sourceRoot":"","sources":["../../src/overlays/frame-name-editor-overlay.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help-button.d.ts","sourceRoot":"","sources":["../../src/overlays/help-button.tsx"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC;CAC1F;AAED,eAAO,MAAM,UAAU,GAAI,kBAAkB,eAAe,4CA6B3D,CAAC"}
@@ -2,14 +2,13 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
2
2
  import { useState } from "react";
3
3
  import { HelpCircle } from "lucide-react";
4
4
  import { HelpDialog } from "./help-dialog.js";
5
- import { IconButton } from "./icon-button.js";
6
- const HELP_ICON_SIZE = 16;
7
- const HELP_ICON_STROKE = 1.75;
5
+ import { IconButton } from "../primitives/icon-button.js";
6
+ import { CONTROL_ICON } from "../core/constants.js";
8
7
  export const HelpButton = ({ renderDialog }) => {
9
8
  const [open, setOpen] = useState(false);
10
9
  return (_jsxs(_Fragment, { children: [_jsx(IconButton, { label: "Help", onClick: () => {
11
10
  setOpen(true);
12
- }, children: _jsx(HelpCircle, { size: HELP_ICON_SIZE, strokeWidth: HELP_ICON_STROKE }) }), renderDialog ? (renderDialog({
11
+ }, children: _jsx(HelpCircle, { ...CONTROL_ICON }) }), renderDialog ? (renderDialog({
13
12
  open,
14
13
  onClose: () => {
15
14
  setOpen(false);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help-button.js","sourceRoot":"","sources":["../../src/overlays/help-button.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAcpD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAE,YAAY,EAAmB,EAAE,EAAE;IAC9D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,CACL,8BACE,KAAC,UAAU,IACT,KAAK,EAAC,MAAM,EACZ,OAAO,EAAE,GAAG,EAAE;oBACZ,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC,YAED,KAAC,UAAU,OAAK,YAAY,GAAI,GACrB,EACZ,YAAY,CAAC,CAAC,CAAC,CACd,YAAY,CAAC;gBACX,IAAI;gBACJ,OAAO,EAAE,GAAG,EAAE;oBACZ,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC;aACF,CAAC,CACH,CAAC,CAAC,CAAC,CACF,KAAC,UAAU,IACT,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,GAAG,EAAE;oBACZ,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC,GACD,CACH,IACA,CACJ,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help-dialog.d.ts","sourceRoot":"","sources":["../../src/overlays/help-dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoD,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAE5F,OAAO,EAML,KAAK,cAAc,EAEpB,MAAM,wBAAwB,CAAC;AAIhC;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;CACnC;AAED;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;CAC/C;AAiCD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,IAAI,KAAG,IAetD,CAAC;AA0BF,eAAO,MAAM,UAAU,GAAI,oDAMxB,eAAe,KAAG,YAAY,GAAG,IAiEnC,CAAC"}
@@ -2,8 +2,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Fragment, useEffect, useMemo } from "react";
3
3
  import { X } from "lucide-react";
4
4
  import { defaultActionRegistry, formatHotkeyParts, isMac, } from "@oh-just-another/state";
5
- import { HELP_DIALOG_MAX_WIDTH_PX } from "./constants.js";
6
- import { Modal } from "./modal.js";
5
+ import { HELP_DIALOG_MAX_WIDTH_PX, CONTROL_ICON } from "../core/constants.js";
6
+ import { Modal } from "../primitives/modal.js";
7
7
  const CATEGORY_TITLES = {
8
8
  history: "History",
9
9
  selection: "Selection",
@@ -113,31 +113,11 @@ export const HelpDialog = ({ registry = defaultActionRegistry, open, onClose, ti
113
113
  }, [registry, extraSections]);
114
114
  const modalStyle = {
115
115
  maxWidth: HELP_DIALOG_MAX_WIDTH_PX,
116
- width: "calc(100vw - 64px)",
116
+ width: "calc(100vw - 2 * var(--du-modal-margin))",
117
117
  display: "flex",
118
118
  flexDirection: "column",
119
119
  };
120
- const headerStyle = {
121
- padding: "16px 20px",
122
- borderBottom: "1px solid var(--du-ui-border)",
123
- display: "flex",
124
- alignItems: "center",
125
- justifyContent: "space-between",
126
- };
127
- const bodyStyle = {
128
- padding: "16px 20px 20px",
129
- overflowY: "auto",
130
- };
131
- return (_jsx(Modal, { open: open, onClose: onClose, title: title, style: modalStyle, children: _jsxs("div", { children: [_jsxs("div", { style: headerStyle, children: [_jsx("h2", { style: { margin: 0, fontSize: 16, fontWeight: 600 }, children: title }), _jsxs("div", { style: { display: "flex", alignItems: "center", gap: 12 }, children: [_jsx("span", { className: "du-help-platform-badge", children: isMac ? "macOS" : "Win / Linux" }), _jsx("button", { type: "button", "aria-label": "Close help", onClick: onClose, style: {
132
- background: "transparent",
133
- border: "none",
134
- color: "var(--du-text)",
135
- cursor: "pointer",
136
- display: "inline-flex",
137
- alignItems: "center",
138
- justifyContent: "center",
139
- padding: 4,
140
- }, children: _jsx(X, { size: 18, strokeWidth: 1.75 }) })] })] }), _jsx("div", { style: bodyStyle, children: _jsx("div", { className: "du-help-islands", children: sections.map((section) => (_jsxs("section", { className: "du-help-island", children: [_jsx("h3", { className: "du-help-island-title", children: section.title }), _jsx("div", { className: "du-help-island-rows", children: section.rows.map((row) => (_jsxs("div", { className: "du-help-row", children: [_jsx("span", { className: "du-help-row-label", children: row.label }), _jsx(ShortcutKeys, { combos: row.keys })] }, row.label))) })] }, section.title))) }) })] }) }));
120
+ return (_jsx(Modal, { open: open, onClose: onClose, title: title, style: modalStyle, children: _jsxs("div", { children: [_jsxs("div", { className: "du-modal-header", children: [_jsx("h2", { className: "du-modal-title", children: title }), _jsxs("div", { style: { display: "flex", alignItems: "center", gap: "var(--du-modal-gap)" }, children: [_jsx("span", { className: "du-help-platform-badge", children: isMac ? "macOS" : "Win / Linux" }), _jsx("button", { type: "button", "aria-label": "Close help", onClick: onClose, className: "du-modal-close", children: _jsx(X, { ...CONTROL_ICON }) })] })] }), _jsx("div", { className: "du-modal-body", children: _jsx("div", { className: "du-help-islands", children: sections.map((section) => (_jsxs("section", { className: "du-help-island", children: [_jsx("h3", { className: "du-help-island-title", children: section.title }), _jsx("div", { className: "du-help-island-rows", children: section.rows.map((row) => (_jsxs("div", { className: "du-help-row", children: [_jsx("span", { className: "du-help-row-label", children: row.label }), _jsx(ShortcutKeys, { combos: row.keys })] }, row.label))) })] }, section.title))) }) })] }) }));
141
121
  };
142
122
  /**
143
123
  * Render N alternative key combinations joined with "or". Each key
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help-dialog.js","sourceRoot":"","sources":["../../src/overlays/help-dialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Persistent link badges. Every element carrying a (safe) `href` shows a
3
+ * small chip anchored to its top-right corner, so links are discoverable
4
+ * without hovering — the hover popup and Cmd/Ctrl-click remain the detail /
5
+ * open affordances. Clicking the badge opens the link via `editor.openLink`
6
+ * (scheme already validated by `elementLink`). Also shown in read-only mode:
7
+ * following links is a viewing feature, not an edit.
8
+ *
9
+ * Positions are computed from world bounds + viewport on every editor
10
+ * change, so badges track pan / zoom / move. Portaled to the overlay
11
+ * container like the hover popup.
12
+ */
13
+ export declare const LinkBadges: () => import("react").ReactPortal | null;
14
+ //# sourceMappingURL=link-badges.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-badges.d.ts","sourceRoot":"","sources":["../../src/overlays/link-badges.tsx"],"names":[],"mappings":"AASA;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,UAAU,0CAqDtB,CAAC"}